ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZHJpdmVyLWhpZC1yb2NjYXQta29uZSBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZHJpdmVyLWhpZC1yb2NjYXQta29uZQppbmRleCAwNjNiZGE3Li42OThiODA4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRyaXZlci1oaWQtcm9jY2F0LWtvbmUKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kcml2ZXItaGlkLXJvY2NhdC1rb25lCkBAIC0xLDQgKzEsNCBAQAotV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vYWN0dWFsX2RwaQorV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vPGhpZC1idXM+Ojx2ZW5kb3ItaWQ+Ojxwcm9kdWN0LWlkPi48bnVtPi9rb25lL3JvY2NhdGtvbmU8bWlub3I+L2FjdHVhbF9kcGkKIERhdGU6CQlNYXJjaCAyMDEwCiBDb250YWN0OglTdGVmYW4gQWNoYXR6IDxlcmF6b3JfZGVAdXNlcnMuc291cmNlZm9yZ2UubmV0PgogRGVzY3JpcHRpb246CUl0IGlzIHBvc3NpYmxlIHRvIHN3aXRjaCB0aGUgZHBpIHNldHRpbmcgb2YgdGhlIG1vdXNlIHdpdGggdGhlCkBAIC0xNywxMyArMTcsMTMgQEAKIAogCQlUaGlzIGZpbGUgaXMgcmVhZG9ubHkuCiAKLVdoYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+L2FjdHVhbF9wcm9maWxlCitXaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNvbmZpZyBudW0+LjxpbnRlcmZhY2UgbnVtPi88aGlkLWJ1cz46PHZlbmRvci1pZD46PHByb2R1Y3QtaWQ+LjxudW0+L2tvbmUvcm9jY2F0a29uZTxtaW5vcj4vYWN0dWFsX3Byb2ZpbGUKIERhdGU6CQlNYXJjaCAyMDEwCiBDb250YWN0OglTdGVmYW4gQWNoYXR6IDxlcmF6b3JfZGVAdXNlcnMuc291cmNlZm9yZ2UubmV0PgogRGVzY3JpcHRpb246CVdoZW4gcmVhZCwgdGhpcyBmaWxlIHJldHVybnMgdGhlIG51bWJlciBvZiB0aGUgYWN0dWFsIHByb2ZpbGUuCiAJCVRoaXMgZmlsZSBpcyByZWFkb25seS4KIAotV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vZmlybXdhcmVfdmVyc2lvbgorV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vPGhpZC1idXM+Ojx2ZW5kb3ItaWQ+Ojxwcm9kdWN0LWlkPi48bnVtPi9rb25lL3JvY2NhdGtvbmU8bWlub3I+L2Zpcm13YXJlX3ZlcnNpb24KIERhdGU6CQlNYXJjaCAyMDEwCiBDb250YWN0OglTdGVmYW4gQWNoYXR6IDxlcmF6b3JfZGVAdXNlcnMuc291cmNlZm9yZ2UubmV0PgogRGVzY3JpcHRpb246CVdoZW4gcmVhZCwgdGhpcyBmaWxlIHJldHVybnMgdGhlIHJhdyBpbnRlZ2VyIHZlcnNpb24gbnVtYmVyIG9mIHRoZQpAQCAtMzMsNyArMzMsNyBAQAogCQlsZWZ0LiBFLmcuIGEgcmV0dXJuZWQgdmFsdWUgb2YgMTM4IG1lYW5zIDEuMzgKIAkJVGhpcyBmaWxlIGlzIHJlYWRvbmx5LgogCi1XaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNvbmZpZyBudW0+LjxpbnRlcmZhY2UgbnVtPi9wcm9maWxlWzEtNV0KK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+LzxoaWQtYnVzPjo8dmVuZG9yLWlkPjo8cHJvZHVjdC1pZD4uPG51bT4va29uZS9yb2NjYXRrb25lPG1pbm9yPi9wcm9maWxlWzEtNV0KIERhdGU6CQlNYXJjaCAyMDEwCiBDb250YWN0OglTdGVmYW4gQWNoYXR6IDxlcmF6b3JfZGVAdXNlcnMuc291cmNlZm9yZ2UubmV0PgogRGVzY3JpcHRpb246CVRoZSBtb3VzZSBjYW4gc3RvcmUgNSBwcm9maWxlcyB3aGljaCBjYW4gYmUgc3dpdGNoZWQgYnkgdGhlCkBAIC00OCw3ICs0OCw3IEBACiAJCXN0b3JlZCBpbiB0aGUgcHJvZmlsZSBkb2Vzbid0IG5lZWQgdG8gZml0IHRoZSBudW1iZXIgb2YgdGhlCiAJCXN0b3JlLgogCi1XaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNvbmZpZyBudW0+LjxpbnRlcmZhY2UgbnVtPi9zZXR0aW5ncworV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vPGhpZC1idXM+Ojx2ZW5kb3ItaWQ+Ojxwcm9kdWN0LWlkPi48bnVtPi9rb25lL3JvY2NhdGtvbmU8bWlub3I+L3NldHRpbmdzCiBEYXRlOgkJTWFyY2ggMjAxMAogQ29udGFjdDoJU3RlZmFuIEFjaGF0eiA8ZXJhem9yX2RlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KIERlc2NyaXB0aW9uOglXaGVuIHJlYWQsIHRoaXMgZmlsZSByZXR1cm5zIHRoZSBzZXR0aW5ncyBzdG9yZWQgaW4gdGhlIG1vdXNlLgpAQCAtNTgsNyArNTgsNyBAQAogCQlUaGUgZGF0YSBoYXMgdG8gYmUgMzYgYnl0ZXMgbG9uZy4gVGhlIG1vdXNlIHdpbGwgcmVqZWN0IGludmFsaWQKIAkJZGF0YS4KIAotV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vc3RhcnR1cF9wcm9maWxlCitXaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNvbmZpZyBudW0+LjxpbnRlcmZhY2UgbnVtPi88aGlkLWJ1cz46PHZlbmRvci1pZD46PHByb2R1Y3QtaWQ+LjxudW0+L2tvbmUvcm9jY2F0a29uZTxtaW5vcj4vc3RhcnR1cF9wcm9maWxlCiBEYXRlOgkJTWFyY2ggMjAxMAogQ29udGFjdDoJU3RlZmFuIEFjaGF0eiA8ZXJhem9yX2RlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KIERlc2NyaXB0aW9uOglUaGUgaW50ZWdlciB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSByYW5nZXMgZnJvbSAxIHRvIDUuCkBAIC02Nyw3ICs2Nyw3IEBACiAJCVdoZW4gd3JpdHRlbiwgdGhpcyBmaWxlIHNldHMgdGhlIG51bWJlciBvZiB0aGUgc3RhcnR1cCBwcm9maWxlCiAJCWFuZCB0aGUgbW91c2UgYWN0aXZhdGVzIHRoaXMgcHJvZmlsZSBpbW1lZGlhdGVseS4KIAotV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vdGN1CitXaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNvbmZpZyBudW0+LjxpbnRlcmZhY2UgbnVtPi88aGlkLWJ1cz46PHZlbmRvci1pZD46PHByb2R1Y3QtaWQ+LjxudW0+L2tvbmUvcm9jY2F0a29uZTxtaW5vcj4vdGN1CiBEYXRlOgkJTWFyY2ggMjAxMAogQ29udGFjdDoJU3RlZmFuIEFjaGF0eiA8ZXJhem9yX2RlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KIERlc2NyaXB0aW9uOglUaGUgbW91c2UgaGFzIGEgIlRyYWNraW5nIENvbnRyb2wgVW5pdCIgd2hpY2ggbGV0cyB0aGUgdXNlcgpAQCAtNzgsNyArNzgsNyBAQAogCQlXcml0aW5nIDEgaW4gdGhpcyBmaWxlIHdpbGwgc3RhcnQgdGhlIGNhbGlicmF0aW9uIHdoaWNoIHRha2VzCiAJCWFyb3VuZCA2IHNlY29uZHMgdG8gY29tcGxldGUgYW5kIGFjdGl2YXRlcyB0aGUgVENVLgogCi1XaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNvbmZpZyBudW0+LjxpbnRlcmZhY2UgbnVtPi93ZWlnaHQKK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+LzxoaWQtYnVzPjo8dmVuZG9yLWlkPjo8cHJvZHVjdC1pZD4uPG51bT4va29uZS9yb2NjYXRrb25lPG1pbm9yPi93ZWlnaHQKIERhdGU6CQlNYXJjaCAyMDEwCiBDb250YWN0OglTdGVmYW4gQWNoYXR6IDxlcmF6b3JfZGVAdXNlcnMuc291cmNlZm9yZ2UubmV0PgogRGVzY3JpcHRpb246CVRoZSBtb3VzZSBjYW4gYmUgZXF1aXBwZWQgd2l0aCBvbmUgb2YgZm91ciBzdXBwbGllZCB3ZWlnaHRzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRyaXZlci1oaWQtcm9jY2F0LWtvbmVwbHVzIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kcml2ZXItaGlkLXJvY2NhdC1rb25lcGx1cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjlmMzBlCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kcml2ZXItaGlkLXJvY2NhdC1rb25lcGx1cwpAQCAtMCwwICsxLDEwOCBAQAorV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vPGhpZC1idXM+Ojx2ZW5kb3ItaWQ+Ojxwcm9kdWN0LWlkPi48bnVtPi9rb25lcGx1cy9yb2NjYXRrb25lcGx1czxtaW5vcj4vYWN0dWFsX3Byb2ZpbGUKK0RhdGU6CQlPY3RvYmVyIDIwMTAKK0NvbnRhY3Q6CVN0ZWZhbiBBY2hhdHogPGVyYXpvcl9kZUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CitEZXNjcmlwdGlvbjoJV2hlbiByZWFkLCB0aGlzIGZpbGUgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHRoZSBhY3R1YWwgcHJvZmlsZSBpbgorCQlyYW5nZSAwLTQuCisJCVRoaXMgZmlsZSBpcyByZWFkb25seS4KKworV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vPGhpZC1idXM+Ojx2ZW5kb3ItaWQ+Ojxwcm9kdWN0LWlkPi48bnVtPi9rb25lcGx1cy9yb2NjYXRrb25lcGx1czxtaW5vcj4vZmlybXdhcmVfdmVyc2lvbgorRGF0ZToJCU9jdG9iZXIgMjAxMAorQ29udGFjdDoJU3RlZmFuIEFjaGF0eiA8ZXJhem9yX2RlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KK0Rlc2NyaXB0aW9uOglXaGVuIHJlYWQsIHRoaXMgZmlsZSByZXR1cm5zIHRoZSByYXcgaW50ZWdlciB2ZXJzaW9uIG51bWJlciBvZiB0aGUKKwkJZmlybXdhcmUgcmVwb3J0ZWQgYnkgdGhlIG1vdXNlLiBVc2luZyB0aGUgaW50ZWdlciB2YWx1ZSBlYXNlcworCQlmdXJ0aGVyIHVzYWdlIGluIG90aGVyIHByb2dyYW1zLiBUbyByZWNlaXZlIHRoZSByZWFsIHZlcnNpb24KKwkJbnVtYmVyIHRoZSBkZWNpbWFsIHBvaW50IGhhcyB0byBiZSBzaGlmdGVkIDIgcG9zaXRpb25zIHRvIHRoZQorCQlsZWZ0LiBFLmcuIGEgcmV0dXJuZWQgdmFsdWUgb2YgMTIxIG1lYW5zIDEuMjEKKwkJVGhpcyBmaWxlIGlzIHJlYWRvbmx5LgorCitXaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNvbmZpZyBudW0+LjxpbnRlcmZhY2UgbnVtPi88aGlkLWJ1cz46PHZlbmRvci1pZD46PHByb2R1Y3QtaWQ+LjxudW0+L2tvbmVwbHVzL3JvY2NhdGtvbmVwbHVzPG1pbm9yPi9tYWNybworRGF0ZToJCU9jdG9iZXIgMjAxMAorQ29udGFjdDoJU3RlZmFuIEFjaGF0eiA8ZXJhem9yX2RlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KK0Rlc2NyaXB0aW9uOglUaGUgbW91c2UgY2FuIHN0b3JlIGEgbWFjcm8gd2l0aCBtYXggNTAwIGtleS9idXR0b24gc3Ryb2tlcworCQlpbnRlcm5hbGx5LgorCQlXaGVuIHdyaXR0ZW4sIHRoaXMgZmlsZSBsZXRzIG9uZSBzZXQgdGhlIHNlcXVlbmNlIGZvciBhIHNwZWNpZmljCisJCWJ1dHRvbiBmb3IgYSBzcGVjaWZpYyBwcm9maWxlLiBCdXR0b24gYW5kIHByb2ZpbGUgbnVtYmVycyBhcmUKKwkJaW5jbHVkZWQgaW4gd3JpdHRlbiBkYXRhLiBUaGUgZGF0YSBoYXMgdG8gYmUgMjA4MiBieXRlcyBsb25nLgorCQlUaGlzIGZpbGUgaXMgd3JpdGVvbmx5LgorCitXaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNvbmZpZyBudW0+LjxpbnRlcmZhY2UgbnVtPi88aGlkLWJ1cz46PHZlbmRvci1pZD46PHByb2R1Y3QtaWQ+LjxudW0+L2tvbmVwbHVzL3JvY2NhdGtvbmVwbHVzPG1pbm9yPi9wcm9maWxlX2J1dHRvbnMKK0RhdGU6CQlBdWd1c3QgMjAxMAorQ29udGFjdDoJU3RlZmFuIEFjaGF0eiA8ZXJhem9yX2RlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KK0Rlc2NyaXB0aW9uOglUaGUgbW91c2UgY2FuIHN0b3JlIDUgcHJvZmlsZXMgd2hpY2ggY2FuIGJlIHN3aXRjaGVkIGJ5IHRoZQorCQlwcmVzcyBvZiBhIGJ1dHRvbi4gQSBwcm9maWxlIGlzIHNwbGl0IGluIHNldHRpbmdzIGFuZCBidXR0b25zLgorCQlwcm9maWxlX2J1dHRvbnMgaG9sZHMgaW5mb3JtYXRpb25zIGFib3V0IGJ1dHRvbiBsYXlvdXQuCisJCVdoZW4gd3JpdHRlbiwgdGhpcyBmaWxlIGxldHMgb25lIHdyaXRlIHRoZSByZXNwZWN0aXZlIHByb2ZpbGUKKwkJYnV0dG9ucyBiYWNrIHRvIHRoZSBtb3VzZS4gVGhlIGRhdGEgaGFzIHRvIGJlIDc3IGJ5dGVzIGxvbmcuCisJCVRoZSBtb3VzZSB3aWxsIHJlamVjdCBpbnZhbGlkIGRhdGEuCisJCVdoaWNoIHByb2ZpbGUgdG8gd3JpdGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgcHJvZmlsZSBudW1iZXIKKwkJY29udGFpbmVkIGluIHRoZSBkYXRhLgorCQlUaGlzIGZpbGUgaXMgd3JpdGVvbmx5LgorCitXaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNvbmZpZyBudW0+LjxpbnRlcmZhY2UgbnVtPi88aGlkLWJ1cz46PHZlbmRvci1pZD46PHByb2R1Y3QtaWQ+LjxudW0+L2tvbmVwbHVzL3JvY2NhdGtvbmVwbHVzPG1pbm9yPi9wcm9maWxlWzEtNV1fYnV0dG9ucworRGF0ZToJCUF1Z3VzdCAyMDEwCitDb250YWN0OglTdGVmYW4gQWNoYXR6IDxlcmF6b3JfZGVAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorRGVzY3JpcHRpb246CVRoZSBtb3VzZSBjYW4gc3RvcmUgNSBwcm9maWxlcyB3aGljaCBjYW4gYmUgc3dpdGNoZWQgYnkgdGhlCisJCXByZXNzIG9mIGEgYnV0dG9uLiBBIHByb2ZpbGUgaXMgc3BsaXQgaW4gc2V0dGluZ3MgYW5kIGJ1dHRvbnMuCisJCXByb2ZpbGVfYnV0dG9ucyBob2xkcyBpbmZvcm1hdGlvbnMgYWJvdXQgYnV0dG9uIGxheW91dC4KKwkJV2hlbiByZWFkLCB0aGVzZSBmaWxlcyByZXR1cm4gdGhlIHJlc3BlY3RpdmUgcHJvZmlsZSBidXR0b25zLgorCQlUaGUgcmV0dXJuZWQgZGF0YSBpcyA3NyBieXRlcyBpbiBzaXplLgorCQlUaGlzIGZpbGUgaXMgcmVhZG9ubHkuCisKK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+LzxoaWQtYnVzPjo8dmVuZG9yLWlkPjo8cHJvZHVjdC1pZD4uPG51bT4va29uZXBsdXMvcm9jY2F0a29uZXBsdXM8bWlub3I+L3Byb2ZpbGVfc2V0dGluZ3MKK0RhdGU6CQlPY3RvYmVyIDIwMTAKK0NvbnRhY3Q6CVN0ZWZhbiBBY2hhdHogPGVyYXpvcl9kZUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CitEZXNjcmlwdGlvbjoJVGhlIG1vdXNlIGNhbiBzdG9yZSA1IHByb2ZpbGVzIHdoaWNoIGNhbiBiZSBzd2l0Y2hlZCBieSB0aGUKKwkJcHJlc3Mgb2YgYSBidXR0b24uIEEgcHJvZmlsZSBpcyBzcGxpdCBpbiBzZXR0aW5ncyBhbmQgYnV0dG9ucy4KKwkJcHJvZmlsZV9zZXR0aW5ncyBob2xkcyBpbmZvcm1hdGlvbnMgbGlrZSByZXNvbHV0aW9uLCBzZW5zaXRpdml0eQorCQlhbmQgbGlnaHQgZWZmZWN0cy4KKwkJV2hlbiB3cml0dGVuLCB0aGlzIGZpbGUgbGV0cyBvbmUgd3JpdGUgdGhlIHJlc3BlY3RpdmUgcHJvZmlsZQorCQlzZXR0aW5ncyBiYWNrIHRvIHRoZSBtb3VzZS4gVGhlIGRhdGEgaGFzIHRvIGJlIDQzIGJ5dGVzIGxvbmcuCisJCVRoZSBtb3VzZSB3aWxsIHJlamVjdCBpbnZhbGlkIGRhdGEuCisJCVdoaWNoIHByb2ZpbGUgdG8gd3JpdGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgcHJvZmlsZSBudW1iZXIKKwkJY29udGFpbmVkIGluIHRoZSBkYXRhLgorCQlUaGlzIGZpbGUgaXMgd3JpdGVvbmx5LgorCitXaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNvbmZpZyBudW0+LjxpbnRlcmZhY2UgbnVtPi88aGlkLWJ1cz46PHZlbmRvci1pZD46PHByb2R1Y3QtaWQ+LjxudW0+L2tvbmVwbHVzL3JvY2NhdGtvbmVwbHVzPG1pbm9yPi9wcm9maWxlWzEtNV1fc2V0dGluZ3MKK0RhdGU6CQlBdWd1c3QgMjAxMAorQ29udGFjdDoJU3RlZmFuIEFjaGF0eiA8ZXJhem9yX2RlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KK0Rlc2NyaXB0aW9uOglUaGUgbW91c2UgY2FuIHN0b3JlIDUgcHJvZmlsZXMgd2hpY2ggY2FuIGJlIHN3aXRjaGVkIGJ5IHRoZQorCQlwcmVzcyBvZiBhIGJ1dHRvbi4gQSBwcm9maWxlIGlzIHNwbGl0IGluIHNldHRpbmdzIGFuZCBidXR0b25zLgorCQlwcm9maWxlX3NldHRpbmdzIGhvbGRzIGluZm9ybWF0aW9ucyBsaWtlIHJlc29sdXRpb24sIHNlbnNpdGl2aXR5CisJCWFuZCBsaWdodCBlZmZlY3RzLgorCQlXaGVuIHJlYWQsIHRoZXNlIGZpbGVzIHJldHVybiB0aGUgcmVzcGVjdGl2ZSBwcm9maWxlIHNldHRpbmdzLgorCQlUaGUgcmV0dXJuZWQgZGF0YSBpcyA0MyBieXRlcyBpbiBzaXplLgorCQlUaGlzIGZpbGUgaXMgcmVhZG9ubHkuCisKK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+LzxoaWQtYnVzPjo8dmVuZG9yLWlkPjo8cHJvZHVjdC1pZD4uPG51bT4va29uZXBsdXMvcm9jY2F0a29uZXBsdXM8bWlub3I+L3NlbnNvcgorRGF0ZToJCU9jdG9iZXIgMjAxMAorQ29udGFjdDoJU3RlZmFuIEFjaGF0eiA8ZXJhem9yX2RlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KK0Rlc2NyaXB0aW9uOglUaGUgbW91c2UgaGFzIGEgdHJhY2tpbmctIGFuZCBhIGRpc3RhbmNlLWNvbnRyb2wtdW5pdC4gVGhlc2UKKwkJY2FuIGJlIGFjdGl2YXRlZC9kZWFjdGl2YXRlZCBhbmQgdGhlIGxpZnQtb2ZmIGRpc3RhbmNlIGNhbiBiZQorCQlzZXQuIFRoZSBkYXRhIGhhcyB0byBiZSA2IGJ5dGVzIGxvbmcuCisJCVRoaXMgZmlsZSBpcyB3cml0ZW9ubHkuCisKK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+LzxoaWQtYnVzPjo8dmVuZG9yLWlkPjo8cHJvZHVjdC1pZD4uPG51bT4va29uZXBsdXMvcm9jY2F0a29uZXBsdXM8bWlub3I+L3N0YXJ0dXBfcHJvZmlsZQorRGF0ZToJCU9jdG9iZXIgMjAxMAorQ29udGFjdDoJU3RlZmFuIEFjaGF0eiA8ZXJhem9yX2RlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KK0Rlc2NyaXB0aW9uOglUaGUgaW50ZWdlciB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSByYW5nZXMgZnJvbSAwLTQuCisgICAgICAgICAgICAgICAgV2hlbiByZWFkLCB0aGlzIGF0dHJpYnV0ZSByZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhlIHByb2ZpbGUKKyAgICAgICAgICAgICAgICB0aGF0J3MgYWN0aXZlIHdoZW4gdGhlIG1vdXNlIGlzIHBvd2VyZWQgb24uCisJCVdoZW4gd3JpdHRlbiwgdGhpcyBmaWxlIHNldHMgdGhlIG51bWJlciBvZiB0aGUgc3RhcnR1cCBwcm9maWxlCisJCWFuZCB0aGUgbW91c2UgYWN0aXZhdGVzIHRoaXMgcHJvZmlsZSBpbW1lZGlhdGVseS4KKworV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vPGhpZC1idXM+Ojx2ZW5kb3ItaWQ+Ojxwcm9kdWN0LWlkPi48bnVtPi9rb25lcGx1cy9yb2NjYXRrb25lcGx1czxtaW5vcj4vdGN1CitEYXRlOgkJT2N0b2JlciAyMDEwCitDb250YWN0OglTdGVmYW4gQWNoYXR6IDxlcmF6b3JfZGVAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorRGVzY3JpcHRpb246CVdoZW4gd3JpdHRlbiBhIGNhbGlicmF0aW9uIHByb2Nlc3MgZm9yIHRoZSB0cmFja2luZyBjb250cm9sIHVuaXQKKwkJY2FuIGJlIGluaXRpYXRlZC9jYW5jZWxsZWQuCisJCVRoZSBkYXRhIGhhcyB0byBiZSAzIGJ5dGVzIGxvbmcuCisJCVRoaXMgZmlsZSBpcyB3cml0ZW9ubHkuCisKK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+LzxoaWQtYnVzPjo8dmVuZG9yLWlkPjo8cHJvZHVjdC1pZD4uPG51bT4va29uZXBsdXMvcm9jY2F0a29uZXBsdXM8bWlub3I+L3RjdV9pbWFnZQorRGF0ZToJCU9jdG9iZXIgMjAxMAorQ29udGFjdDoJU3RlZmFuIEFjaGF0eiA8ZXJhem9yX2RlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KK0Rlc2NyaXB0aW9uOglXaGVuIHJlYWQgdGhlIG1vdXNlIHJldHVybnMgYSAzMHgzMCBwaXhlbCBpbWFnZSBvZiB0aGUKKwkJc2FtcGxlZCB1bmRlcmdyb3VuZC4gVGhpcyB3b3JrcyBvbmx5IGluIHRoZSBjb3Vyc2Ugb2YgYQorCQljYWxpYnJhdGlvbiBwcm9jZXNzIGluaXRpYXRlZCB3aXRoIHRjdS4KKwkJVGhlIHJldHVybmVkIGRhdGEgaXMgMTAyOCBieXRlcyBpbiBzaXplLgorCQlUaGlzIGZpbGUgaXMgcmVhZG9ubHkuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRyaXZlci1oaWQtcm9jY2F0LXB5cmEgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRyaXZlci1oaWQtcm9jY2F0LXB5cmEKaW5kZXggYWQxMTI1Yi4uMWMzN2I4MiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kcml2ZXItaGlkLXJvY2NhdC1weXJhCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZHJpdmVyLWhpZC1yb2NjYXQtcHlyYQpAQCAtMSw0ICsxLDQgQEAKLVdoYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+L2FjdHVhbF9jcGkKK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+LzxoaWQtYnVzPjo8dmVuZG9yLWlkPjo8cHJvZHVjdC1pZD4uPG51bT4vcHlyYS9yb2NjYXRweXJhPG1pbm9yPi9hY3R1YWxfY3BpCiBEYXRlOgkJQXVndXN0IDIwMTAKIENvbnRhY3Q6CVN0ZWZhbiBBY2hhdHogPGVyYXpvcl9kZUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CiBEZXNjcmlwdGlvbjoJSXQgaXMgcG9zc2libGUgdG8gc3dpdGNoIHRoZSBjcGkgc2V0dGluZyBvZiB0aGUgbW91c2Ugd2l0aCB0aGUKQEAgLTE0LDE0ICsxNCwxNCBAQAogCiAJCVRoaXMgZmlsZSBpcyByZWFkb25seS4KIAotV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vYWN0dWFsX3Byb2ZpbGUKK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+LzxoaWQtYnVzPjo8dmVuZG9yLWlkPjo8cHJvZHVjdC1pZD4uPG51bT4vcHlyYS9yb2NjYXRweXJhPG1pbm9yPi9hY3R1YWxfcHJvZmlsZQogRGF0ZToJCUF1Z3VzdCAyMDEwCiBDb250YWN0OglTdGVmYW4gQWNoYXR6IDxlcmF6b3JfZGVAdXNlcnMuc291cmNlZm9yZ2UubmV0PgogRGVzY3JpcHRpb246CVdoZW4gcmVhZCwgdGhpcyBmaWxlIHJldHVybnMgdGhlIG51bWJlciBvZiB0aGUgYWN0dWFsIHByb2ZpbGUgaW4KIAkJcmFuZ2UgMC00LgogCQlUaGlzIGZpbGUgaXMgcmVhZG9ubHkuCiAKLVdoYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+L2Zpcm13YXJlX3ZlcnNpb24KK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+LzxoaWQtYnVzPjo8dmVuZG9yLWlkPjo8cHJvZHVjdC1pZD4uPG51bT4vcHlyYS9yb2NjYXRweXJhPG1pbm9yPi9maXJtd2FyZV92ZXJzaW9uCiBEYXRlOgkJQXVndXN0IDIwMTAKIENvbnRhY3Q6CVN0ZWZhbiBBY2hhdHogPGVyYXpvcl9kZUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CiBEZXNjcmlwdGlvbjoJV2hlbiByZWFkLCB0aGlzIGZpbGUgcmV0dXJucyB0aGUgcmF3IGludGVnZXIgdmVyc2lvbiBudW1iZXIgb2YgdGhlCkBAIC0zMSw3ICszMSw3IEBACiAJCWxlZnQuIEUuZy4gYSByZXR1cm5lZCB2YWx1ZSBvZiAxMzggbWVhbnMgMS4zOAogCQlUaGlzIGZpbGUgaXMgcmVhZG9ubHkuCiAKLVdoYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+L3Byb2ZpbGVfc2V0dGluZ3MKK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+LzxoaWQtYnVzPjo8dmVuZG9yLWlkPjo8cHJvZHVjdC1pZD4uPG51bT4vcHlyYS9yb2NjYXRweXJhPG1pbm9yPi9wcm9maWxlX3NldHRpbmdzCiBEYXRlOgkJQXVndXN0IDIwMTAKIENvbnRhY3Q6CVN0ZWZhbiBBY2hhdHogPGVyYXpvcl9kZUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CiBEZXNjcmlwdGlvbjoJVGhlIG1vdXNlIGNhbiBzdG9yZSA1IHByb2ZpbGVzIHdoaWNoIGNhbiBiZSBzd2l0Y2hlZCBieSB0aGUKQEAgLTQ1LDcgKzQ1LDcgQEAKIAkJY29udGFpbmVkIGluIHRoZSBkYXRhLgogCQlUaGlzIGZpbGUgaXMgd3JpdGVvbmx5LgogCi1XaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNvbmZpZyBudW0+LjxpbnRlcmZhY2UgbnVtPi9wcm9maWxlWzEtNV1fc2V0dGluZ3MKK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+LzxoaWQtYnVzPjo8dmVuZG9yLWlkPjo8cHJvZHVjdC1pZD4uPG51bT4vcHlyYS9yb2NjYXRweXJhPG1pbm9yPi9wcm9maWxlWzEtNV1fc2V0dGluZ3MKIERhdGU6CQlBdWd1c3QgMjAxMAogQ29udGFjdDoJU3RlZmFuIEFjaGF0eiA8ZXJhem9yX2RlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KIERlc2NyaXB0aW9uOglUaGUgbW91c2UgY2FuIHN0b3JlIDUgcHJvZmlsZXMgd2hpY2ggY2FuIGJlIHN3aXRjaGVkIGJ5IHRoZQpAQCAtNTYsNyArNTYsNyBAQAogCQlUaGUgcmV0dXJuZWQgZGF0YSBpcyAxMyBieXRlcyBpbiBzaXplLgogCQlUaGlzIGZpbGUgaXMgcmVhZG9ubHkuCiAKLVdoYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+L3Byb2ZpbGVfYnV0dG9ucworV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vPGhpZC1idXM+Ojx2ZW5kb3ItaWQ+Ojxwcm9kdWN0LWlkPi48bnVtPi9weXJhL3JvY2NhdHB5cmE8bWlub3I+L3Byb2ZpbGVfYnV0dG9ucwogRGF0ZToJCUF1Z3VzdCAyMDEwCiBDb250YWN0OglTdGVmYW4gQWNoYXR6IDxlcmF6b3JfZGVAdXNlcnMuc291cmNlZm9yZ2UubmV0PgogRGVzY3JpcHRpb246CVRoZSBtb3VzZSBjYW4gc3RvcmUgNSBwcm9maWxlcyB3aGljaCBjYW4gYmUgc3dpdGNoZWQgYnkgdGhlCkBAIC02OSw3ICs2OSw3IEBACiAJCWNvbnRhaW5lZCBpbiB0aGUgZGF0YS4KIAkJVGhpcyBmaWxlIGlzIHdyaXRlb25seS4KIAotV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vcHJvZmlsZVsxLTVdX2J1dHRvbnMKK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+LzxoaWQtYnVzPjo8dmVuZG9yLWlkPjo8cHJvZHVjdC1pZD4uPG51bT4vcHlyYS9yb2NjYXRweXJhPG1pbm9yPi9wcm9maWxlWzEtNV1fYnV0dG9ucwogRGF0ZToJCUF1Z3VzdCAyMDEwCiBDb250YWN0OglTdGVmYW4gQWNoYXR6IDxlcmF6b3JfZGVAdXNlcnMuc291cmNlZm9yZ2UubmV0PgogRGVzY3JpcHRpb246CVRoZSBtb3VzZSBjYW4gc3RvcmUgNSBwcm9maWxlcyB3aGljaCBjYW4gYmUgc3dpdGNoZWQgYnkgdGhlCkBAIC03OSw3ICs3OSw3IEBACiAJCVRoZSByZXR1cm5lZCBkYXRhIGlzIDE5IGJ5dGVzIGluIHNpemUuCiAJCVRoaXMgZmlsZSBpcyByZWFkb25seS4KIAotV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vc3RhcnR1cF9wcm9maWxlCitXaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNvbmZpZyBudW0+LjxpbnRlcmZhY2UgbnVtPi88aGlkLWJ1cz46PHZlbmRvci1pZD46PHByb2R1Y3QtaWQ+LjxudW0+L3B5cmEvcm9jY2F0cHlyYTxtaW5vcj4vc3RhcnR1cF9wcm9maWxlCiBEYXRlOgkJQXVndXN0IDIwMTAKIENvbnRhY3Q6CVN0ZWZhbiBBY2hhdHogPGVyYXpvcl9kZUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CiBEZXNjcmlwdGlvbjoJVGhlIGludGVnZXIgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUgcmFuZ2VzIGZyb20gMC00LgpAQCAtODcsNyArODcsNyBAQAogICAgICAgICAgICAgICAgIHRoYXQncyBhY3RpdmUgd2hlbiB0aGUgbW91c2UgaXMgcG93ZXJlZCBvbi4KIAkJVGhpcyBmaWxlIGlzIHJlYWRvbmx5LgogCi1XaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNvbmZpZyBudW0+LjxpbnRlcmZhY2UgbnVtPi9zZXR0aW5ncworV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vPGhpZC1idXM+Ojx2ZW5kb3ItaWQ+Ojxwcm9kdWN0LWlkPi48bnVtPi9weXJhL3JvY2NhdHB5cmE8bWlub3I+L3NldHRpbmdzCiBEYXRlOgkJQXVndXN0IDIwMTAKIENvbnRhY3Q6CVN0ZWZhbiBBY2hhdHogPGVyYXpvcl9kZUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CiBEZXNjcmlwdGlvbjoJV2hlbiByZWFkLCB0aGlzIGZpbGUgcmV0dXJucyB0aGUgc2V0dGluZ3Mgc3RvcmVkIGluIHRoZSBtb3VzZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtcGxhdGZvcm0taWRlYXBhZC1sYXB0b3AgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLXBsYXRmb3JtLWlkZWFwYWQtbGFwdG9wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwN2ZjYTIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLXBsYXRmb3JtLWlkZWFwYWQtbGFwdG9wCkBAIC0wLDAgKzEsNiBAQAorV2hhdDoJCS9zeXMvZGV2aWNlcy9wbGF0Zm9ybS9pZGVhcGFkL2NhbWVyYV9wb3dlcgorRGF0ZToJCURlYyAyMDEwCitLZXJuZWxWZXJzaW9uOgkyLjYuMzcKK0NvbnRhY3Q6CSJJa2UgUGFuaGMgPGlrZS5wYW5AY2Fub25pY2FsLmNvbT4iCitEZXNjcmlwdGlvbjoKKwkJQ29udHJvbCB0aGUgcG93ZXIgb2YgY2FtZXJhIG1vZHVsZS4gMSBtZWFucyBvbiwgMCBtZWFucyBvZmYuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NvY2NpbmVsbGUudHh0IGIvRG9jdW1lbnRhdGlvbi9jb2NjaW5lbGxlLnR4dAppbmRleCA0YTI3NmVhLi45NmI2OTAzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NvY2NpbmVsbGUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vY29jY2luZWxsZS50eHQKQEAgLTM2LDYgKzM2LDEwIEBACiAKICAgICAgICAgc3VkbyBtYWtlIGluc3RhbGwKIAorVGhlIHNlbWFudGljIHBhdGNoZXMgaW4gdGhlIGtlcm5lbCB3aWxsIHdvcmsgYmVzdCB3aXRoIENvY2NpbmVsbGUgdmVyc2lvbgorMC4yLjQgb3IgbGF0ZXIuICBVc2luZyBlYXJsaWVyIHZlcnNpb25zIG1heSBpbmN1ciBzb21lIHBhcnNlIGVycm9ycyBpbiB0aGUKK3NlbWFudGljIHBhdGNoIGNvZGUsIGJ1dCBhbnkgcmVzdWx0cyB0aGF0IGFyZSBvYnRhaW5lZCBzaG91bGQgc3RpbGwgYmUKK2NvcnJlY3QuCiAKICBVc2luZyBDb2NjaW5lbGxlIG9uIHRoZSBMaW51eCBrZXJuZWwKIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2RzNjIwIGIvRG9jdW1lbnRhdGlvbi9od21vbi9kczYyMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmJlM2NkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9kczYyMApAQCAtMCwwICsxLDM0IEBACitLZXJuZWwgZHJpdmVyIGRzNjIwCis9PT09PT09PT09PT09PT09PT09CisKK1N1cHBvcnRlZCBjaGlwczoKKyAgKiBEYWxsYXMgU2VtaWNvbmR1Y3RvciBEUzYyMAorICAgIFByZWZpeDogJ2RzNjIwJworICAgIERhdGFzaGVldDogUHVibGljbHkgYXZhaWxhYmxlIGF0IHRoZSBEYWxsYXMgU2VtaWNvbmR1Y3RvciB3ZWJzaXRlCisgICAgICAgICAgICAgICBodHRwOi8vd3d3LmRhbHNlbWkuY29tLworCitBdXRob3JzOgorICAgICAgICBSb2xhbmQgU3RpZ2dlIDxzdGlnZ2VAYW50Y29tLmRlPgorICAgICAgICBiYXNlZCBvbiBkczE2MjEuYyBieQorICAgICAgICBDaHJpc3RpYW4gVy4gWnVja3NjaHdlcmR0IDx6YW55QHRyaXEubmV0PgorCitEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0KKworVGhlIERTNjIwIGlzIGEgKG9uZSBpbnN0YW5jZSkgZGlnaXRhbCB0aGVybW9tZXRlciBhbmQgdGhlcm1vc3RhdC4gSXQgaGFzIGJvdGgKK2hpZ2ggYW5kIGxvdyB0ZW1wZXJhdHVyZSBsaW1pdHMgd2hpY2ggY2FuIGJlIHVzZXIgZGVmaW5lZCAoaS5lLiAgcHJvZ3JhbW1lZAoraW50byBub24tdm9sYXRpbGUgb24tY2hpcCByZWdpc3RlcnMpLiBUZW1wZXJhdHVyZSByYW5nZSBpcyAtNTUgZGVncmVlIENlbHNpdXMKK3RvICsxMjUuIEJldHdlZW4gMCBhbmQgNzAgZGVncmVlIENlbHNpdXMsIGFjY3VyYWN5IGlzIDAuNSBLZWx2aW4uIFRoZSB2YWx1ZQorcmV0dXJuZWQgdmlhIHN5c2ZzIGRpc3BsYXlzIHBvc3QgZGVjaW1hbCBwb3NpdGlvbnMuCisKK1RoZSB0aGVybW9zdGF0IGZ1bmN0aW9uIHdvcmtzIGFzIGZvbGxvd3M6IFdoZW4gY29uZmlndXJlZCB2aWEgcGxhdGZvcm1fZGF0YQorKHN0cnVjdCBkczYyMF9wbGF0Zm9ybV9kYXRhKSAucG9tb2RlID09IDAgKGRlZmF1bHQpLCB0aGUgdGhlcm1vc3RhdCBvdXRwdXQgcGluCitQTyBpcyBhbHdheXMgbG93LiBJZiAucG9tb2RlID09IDEsIHRoZSB0aGVybW9zdGF0IGlzIGluIFBPX0xPVyBtb2RlLiBJLmUuLCB0aGUKK291dHB1dCBwaW4gUE8gYmVjb21lcyBhY3RpdmUgd2hlbiB0aGUgdGVtcGVyYXR1cmUgZmFsbHMgYmVsb3cgdGVtcDFfbWluIGFuZAorc3RheXMgYWN0aXZlIHVudGlsIHRoZSB0ZW1wZXJhdHVyZSBnb2VzIGFib3ZlIHRlbXAxX21heC4KKworTGlrZXdpc2UsIHdpdGggLnBvbW9kZSA9PSAyLCB0aGUgdGhlcm1vc3RhdCBpcyBpbiBQT19ISUdIIG1vZGUuIEkuZS4sIHRoZSBQTworb3V0cHV0IHBpbiBiZWNvbWVzIGFjdGl2ZSB3aGVuIHRoZSB0ZW1wZXJhdHVyZSBnb2VzIGFib3ZlIHRlbXAxX21heCBhbmQgc3RheXMKK2FjdGl2ZSB1bnRpbCB0aGUgdGVtcGVyYXR1cmUgZmFsbHMgYmVsb3cgdGVtcDFfbWluLgorCitUaGUgUE8gb3V0cHV0IHBpbiBvZiB0aGUgRFM2MjAgb3BlcmF0ZXMgYWN0aXZlLWxvdy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vc2h0MjEgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3NodDIxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMTdmZGEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3NodDIxCkBAIC0wLDAgKzEsNDkgQEAKK0tlcm5lbCBkcml2ZXIgc2h0MjEKKz09PT09PT09PT09PT09PT09PT0KKworU3VwcG9ydGVkIGNoaXBzOgorICAqIFNlbnNpcmlvbiBTSFQyMQorICAgIFByZWZpeDogJ3NodDIxJworICAgIEFkZHJlc3NlcyBzY2FubmVkOiBub25lCisgICAgRGF0YXNoZWV0OiBQdWJsaWNseSBhdmFpbGFibGUgYXQgdGhlIFNlbnNpcmlvbiB3ZWJzaXRlCisgICAgaHR0cDovL3d3dy5zZW5zaXJpb24uY29tL2VuL3BkZi9wcm9kdWN0X2luZm9ybWF0aW9uL0RhdGFzaGVldC1odW1pZGl0eS1zZW5zb3ItU0hUMjEucGRmCisKKyAgKiBTZW5zaXJpb24gU0hUMjUKKyAgICBQcmVmaXg6ICdzaHQyMScKKyAgICBBZGRyZXNzZXMgc2Nhbm5lZDogbm9uZQorICAgIERhdGFzaGVldDogUHVibGljbHkgYXZhaWxhYmxlIGF0IHRoZSBTZW5zaXJpb24gd2Vic2l0ZQorICAgIGh0dHA6Ly93d3cuc2Vuc2lyaW9uLmNvbS9lbi9wZGYvcHJvZHVjdF9pbmZvcm1hdGlvbi9EYXRhc2hlZXQtaHVtaWRpdHktc2Vuc29yLVNIVDI1LnBkZgorCitBdXRob3I6CisgIFVycyBGbGVpc2NoIDx1cnMuZmxlaXNjaEBzZW5zaXJpb24uY29tPgorCitEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0KKworVGhlIFNIVDIxIGFuZCBTSFQyNSBhcmUgaHVtaWRpdHkgYW5kIHRlbXBlcmF0dXJlIHNlbnNvcnMgaW4gYSBERk4gcGFja2FnZSBvZgorb25seSAzIHggMyBtbSBmb290cHJpbnQgYW5kIDEuMSBtbSBoZWlnaHQuIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3bworZGV2aWNlcyBpcyB0aGUgaGlnaGVyIGxldmVsIG9mIHByZWNpc2lvbiBvZiB0aGUgU0hUMjUgKDEuOCUgcmVsYXRpdmUgaHVtaWRpdHksCiswLjIgZGVncmVlIENlbHNpdXMpIGNvbXBhcmVkIHdpdGggdGhlIFNIVDIxICgyLjAlIHJlbGF0aXZlIGh1bWlkaXR5LAorMC4zIGRlZ3JlZSBDZWxzaXVzKS4KKworVGhlIGRldmljZXMgY29tbXVuaWNhdGUgd2l0aCB0aGUgSTJDIHByb3RvY29sLiBBbGwgc2Vuc29ycyBhcmUgc2V0IHRvIHRoZSBzYW1lCitJMkMgYWRkcmVzcyAweDQwLCBzbyBhbiBlbnRyeSB3aXRoIEkyQ19CT0FSRF9JTkZPKCJzaHQyMSIsIDB4NDApIGNhbiBiZSB1c2VkCitpbiB0aGUgYm9hcmQgc2V0dXAgY29kZS4KKworc3lzZnMtSW50ZXJmYWNlCistLS0tLS0tLS0tLS0tLS0KKwordGVtcDFfaW5wdXQgLSB0ZW1wZXJhdHVyZSBpbnB1dAoraHVtaWRpdHkxX2lucHV0IC0gaHVtaWRpdHkgaW5wdXQKKworTm90ZXMKKy0tLS0tCisKK1RoZSBkcml2ZXIgdXNlcyB0aGUgZGVmYXVsdCByZXNvbHV0aW9uIHNldHRpbmdzIG9mIDEyIGJpdCBmb3IgaHVtaWRpdHkgYW5kIDE0CitiaXQgZm9yIHRlbXBlcmF0dXJlLCB3aGljaCByZXN1bHRzIGluIHR5cGljYWwgbWVhc3VyZW1lbnQgdGltZXMgb2YgMjIgbXMgZm9yCitodW1pZGl0eSBhbmQgNjYgbXMgZm9yIHRlbXBlcmF0dXJlLiBUbyBrZWVwIHNlbGYgaGVhdGluZyBiZWxvdyAwLjEgZGVncmVlCitDZWxzaXVzLCB0aGUgZGV2aWNlIHNob3VsZCBub3QgYmUgYWN0aXZlIGZvciBtb3JlIHRoYW4gMTAlIG9mIHRoZSB0aW1lLAorZS5nLiBtYXhpbXVtIHR3byBtZWFzdXJlbWVudHMgcGVyIHNlY29uZCBhdCB0aGUgZ2l2ZW4gcmVzb2x1dGlvbi4KKworRGlmZmVyZW50IHJlc29sdXRpb25zLCB0aGUgb24tY2hpcCBoZWF0ZXIsIHVzaW5nIHRoZSBDUkMgY2hlY2tzdW0gYW5kIHJlYWRpbmcKK3RoZSBzZXJpYWwgbnVtYmVyIGFyZSBub3Qgc3VwcG9ydGVkIHlldC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vc3lzZnMtaW50ZXJmYWNlIGIvRG9jdW1lbnRhdGlvbi9od21vbi9zeXNmcy1pbnRlcmZhY2UKaW5kZXggNjQ1Njk5MC4uYzY1NTlmMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi9zeXNmcy1pbnRlcmZhY2UKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9zeXNmcy1pbnRlcmZhY2UKQEAgLTM4NCwxMCArMzg0LDIwIEBACiAJCVVuaXQ6IG1pbGxpYW1wZXJlCiAJCVJXCiAKK2N1cnJbMS0qXV9sY3JpdAlDdXJyZW50IGNyaXRpY2FsIGxvdyB2YWx1ZQorCQlVbml0OiBtaWxsaWFtcGVyZQorCQlSVworCitjdXJyWzEtKl1fY3JpdAlDdXJyZW50IGNyaXRpY2FsIGhpZ2ggdmFsdWUuCisJCVVuaXQ6IG1pbGxpYW1wZXJlCisJCVJXCisKIGN1cnJbMS0qXV9pbnB1dAlDdXJyZW50IGlucHV0IHZhbHVlCiAJCVVuaXQ6IG1pbGxpYW1wZXJlCiAJCVJPCiAKK0Fsc28gc2VlIHRoZSBBbGFybXMgc2VjdGlvbiBmb3Igc3RhdHVzIGZsYWdzIGFzc29jaWF0ZWQgd2l0aCBjdXJyZW50cy4KKwogKioqKioqKioqCiAqIFBvd2VyICoKICoqKioqKioqKgpAQCAtNDUwLDEzICs0NjAsNiBAQAogCQkJCVVuaXQ6IFBlcmNlbnQKIAkJCQlSTwogCi1wb3dlclsxLSpdX2FsYXJtCQkxIGlmIHRoZSBzeXN0ZW0gaXMgZHJhd2luZyBtb3JlIHBvd2VyIHRoYW4gdGhlCi0JCQkJY2FwIGFsbG93czsgMCBvdGhlcndpc2UuICBBIHBvbGwgbm90aWZpY2F0aW9uIGlzCi0JCQkJc2VudCB0byB0aGlzIGZpbGUgd2hlbiB0aGUgcG93ZXIgdXNlIGV4Y2VlZHMgdGhlCi0JCQkJY2FwLiAgVGhpcyBmaWxlIG9ubHkgYXBwZWFycyBpZiB0aGUgY2FwIGlzIGtub3duCi0JCQkJdG8gYmUgZW5mb3JjZWQgYnkgaGFyZHdhcmUuCi0JCQkJUk8KLQogcG93ZXJbMS0qXV9jYXAJCQlJZiBwb3dlciB1c2UgcmlzZXMgYWJvdmUgdGhpcyBsaW1pdCwgdGhlCiAJCQkJc3lzdGVtIHNob3VsZCB0YWtlIGFjdGlvbiB0byByZWR1Y2UgcG93ZXIgdXNlLgogCQkJCUEgcG9sbCBub3RpZmljYXRpb24gaXMgc2VudCB0byB0aGlzIGZpbGUgaWYgdGhlCkBAIC00NzksNiArNDgyLDIwIEBACiAJCQkJVW5pdDogbWljcm9XYXR0CiAJCQkJUk8KIAorcG93ZXJbMS0qXV9tYXgJCQlNYXhpbXVtIHBvd2VyLgorCQkJCVVuaXQ6IG1pY3JvV2F0dAorCQkJCVJXCisKK3Bvd2VyWzEtKl1fY3JpdAkJCUNyaXRpY2FsIG1heGltdW0gcG93ZXIuCisJCQkJSWYgcG93ZXIgcmlzZXMgdG8gb3IgYWJvdmUgdGhpcyBsaW1pdCwgdGhlCisJCQkJc3lzdGVtIGlzIGV4cGVjdGVkIHRha2UgZHJhc3RpYyBhY3Rpb24gdG8gcmVkdWNlCisJCQkJcG93ZXIgY29uc3VtcHRpb24sIHN1Y2ggYXMgYSBzeXN0ZW0gc2h1dGRvd24gb3IKKwkJCQlhIGZvcmNlZCBwb3dlcmRvd24gb2Ygc29tZSBkZXZpY2VzLgorCQkJCVVuaXQ6IG1pY3JvV2F0dAorCQkJCVJXCisKK0Fsc28gc2VlIHRoZSBBbGFybXMgc2VjdGlvbiBmb3Igc3RhdHVzIGZsYWdzIGFzc29jaWF0ZWQgd2l0aCBwb3dlciByZWFkaW5ncy4KKwogKioqKioqKioqKgogKiBFbmVyZ3kgKgogKioqKioqKioqKgpAQCAtNDg4LDYgKzUwNSwxNSBAQAogCQkJCVJPCiAKIAorKioqKioqKioqKioqCisqIEh1bWlkaXR5ICoKKyoqKioqKioqKioqKgorCitodW1pZGl0eVsxLSpdX2lucHV0CQlIdW1pZGl0eQorCQkJCVVuaXQ6IG1pbGxpLXBlcmNlbnQgKHBlciBjZW50IG1pbGxlLCBwY20pCisJCQkJUk8KKworCiAqKioqKioqKioqCiAqIEFsYXJtcyAqCiAqKioqKioqKioqCkBAIC01MDEsNiArNTI3LDcgQEAKIAogaW5bMC0qXV9hbGFybQogY3VyclsxLSpdX2FsYXJtCitwb3dlclsxLSpdX2FsYXJtCiBmYW5bMS0qXV9hbGFybQogdGVtcFsxLSpdX2FsYXJtCiAJCUNoYW5uZWwgYWxhcm0KQEAgLTUxMiwxMiArNTM5LDIwIEBACiAKIGluWzAtKl1fbWluX2FsYXJtCiBpblswLSpdX21heF9hbGFybQoraW5bMC0qXV9sY3JpdF9hbGFybQoraW5bMC0qXV9jcml0X2FsYXJtCiBjdXJyWzEtKl1fbWluX2FsYXJtCiBjdXJyWzEtKl1fbWF4X2FsYXJtCitjdXJyWzEtKl1fbGNyaXRfYWxhcm0KK2N1cnJbMS0qXV9jcml0X2FsYXJtCitwb3dlclsxLSpdX2NhcF9hbGFybQorcG93ZXJbMS0qXV9tYXhfYWxhcm0KK3Bvd2VyWzEtKl1fY3JpdF9hbGFybQogZmFuWzEtKl1fbWluX2FsYXJtCiBmYW5bMS0qXV9tYXhfYWxhcm0KIHRlbXBbMS0qXV9taW5fYWxhcm0KIHRlbXBbMS0qXV9tYXhfYWxhcm0KK3RlbXBbMS0qXV9sY3JpdF9hbGFybQogdGVtcFsxLSpdX2NyaXRfYWxhcm0KIHRlbXBbMS0qXV9lbWVyZ2VuY3lfYWxhcm0KIAkJTGltaXQgYWxhcm0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2J1aWxkL2tidWlsZC50eHQgYi9Eb2N1bWVudGF0aW9uL2tidWlsZC9rYnVpbGQudHh0CmluZGV4IDFlNTE2NWEuLjRhOTkwMzEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va2J1aWxkL2tidWlsZC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rYnVpbGQva2J1aWxkLnR4dApAQCAtNzMsNiArNzMsMTQgQEAKIFRoZSBvdXRwdXQgZGlyZWN0b3J5IGNhbiBhbHNvIGJlIHNwZWNpZmllZCB1c2luZyAiTz0uLi4iLgogU2V0dGluZyAiTz0uLi4iIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBLQlVJTERfT1VUUFVULgogCitLQlVJTERfREVCQVJDSAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0ZvciB0aGUgZGViLXBrZyB0YXJnZXQsIGFsbG93cyBvdmVycmlkaW5nIHRoZSBub3JtYWwgaGV1cmlzdGljcyBkZXBsb3llZCBieQorZGViLXBrZy4gTm9ybWFsbHkgZGViLXBrZyBhdHRlbXB0cyB0byBndWVzcyB0aGUgcmlnaHQgYXJjaGl0ZWN0dXJlIGJhc2VkIG9uCit0aGUgVVRTX01BQ0hJTkUgdmFyaWFibGUsIGFuZCBvbiBzb21lIGFyY2hpdGVjdHVyZXMgYWxzbyB0aGUga2VybmVsIGNvbmZpZy4KK1RoZSB2YWx1ZSBvZiBLQlVJTERfREVCQVJDSCBpcyBhc3N1bWVkIChub3QgY2hlY2tlZCkgdG8gYmUgYSB2YWxpZCBEZWJpYW4KK2FyY2hpdGVjdHVyZS4KKwogQVJDSAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNldCBBUkNIIHRvIHRoZSBhcmNoaXRlY3R1cmUgdG8gYmUgYnVpbHQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2tidWlsZC9rY29uZmlnLWxhbmd1YWdlLnR4dCBiL0RvY3VtZW50YXRpb24va2J1aWxkL2tjb25maWctbGFuZ3VhZ2UudHh0CmluZGV4IDJmZTkzY2EuLmI1MDdkNjEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va2J1aWxkL2tjb25maWctbGFuZ3VhZ2UudHh0CisrKyBiL0RvY3VtZW50YXRpb24va2J1aWxkL2tjb25maWctbGFuZ3VhZ2UudHh0CkBAIC0xMTIsNyArMTEyLDYgQEAKIAkobm8gcHJvbXB0cyBhbnl3aGVyZSkgYW5kIGZvciBzeW1ib2xzIHdpdGggbm8gZGVwZW5kZW5jaWVzLgogCVRoYXQgd2lsbCBsaW1pdCB0aGUgdXNlZnVsbmVzcyBidXQgb24gdGhlIG90aGVyIGhhbmQgYXZvaWQKIAl0aGUgaWxsZWdhbCBjb25maWd1cmF0aW9ucyBhbGwgb3Zlci4KLQlrY29uZmlnIHNob3VsZCBvbmUgZGF5IHdhcm4gYWJvdXQgc3VjaCB0aGluZ3MuCiAKIC0gbnVtZXJpY2FsIHJhbmdlczogInJhbmdlIiA8c3ltYm9sPiA8c3ltYm9sPiBbImlmIiA8ZXhwcj5dCiAgIFRoaXMgYWxsb3dzIHRvIGxpbWl0IHRoZSByYW5nZSBvZiBwb3NzaWJsZSBpbnB1dCB2YWx1ZXMgZm9yIGludApAQCAtMjY4LDcgKzI2Nyw3IEBACiAKIGNob2ljZXM6CiAKLQkiY2hvaWNlIgorCSJjaG9pY2UiIFtzeW1ib2xdCiAJPGNob2ljZSBvcHRpb25zPgogCTxjaG9pY2UgYmxvY2s+CiAJImVuZGNob2ljZSIKQEAgLTI4Miw2ICsyODEsMTAgQEAKIGNhbiBiZSBjb21waWxlZCBhcyBtb2R1bGVzLgogQSBjaG9pY2UgYWNjZXB0cyBhbm90aGVyIG9wdGlvbiAib3B0aW9uYWwiLCB3aGljaCBhbGxvd3MgdG8gc2V0IHRoZQogY2hvaWNlIHRvICduJyBhbmQgbm8gZW50cnkgbmVlZHMgdG8gYmUgc2VsZWN0ZWQuCitJZiBubyBbc3ltYm9sXSBpcyBhc3NvY2lhdGVkIHdpdGggYSBjaG9pY2UsIHRoZW4geW91IGNhbiBub3QgaGF2ZSBtdWx0aXBsZQorZGVmaW5pdGlvbnMgb2YgdGhhdCBjaG9pY2UuIElmIGEgW3N5bWJvbF0gaXMgYXNzb2NpYXRlZCB0byB0aGUgY2hvaWNlLAordGhlbiB5b3UgbWF5IGRlZmluZSB0aGUgc2FtZSBjaG9pY2UgKGllLiB3aXRoIHRoZSBzYW1lIGVudHJpZXMpIGluIGFub3RoZXIKK3BsYWNlLgogCiBjb21tZW50OgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2tidWlsZC9tYWtlZmlsZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9rYnVpbGQvbWFrZWZpbGVzLnR4dAppbmRleCAwZWYwMGJkLi44NmUzY2QwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tidWlsZC9tYWtlZmlsZXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24va2J1aWxkL21ha2VmaWxlcy50eHQKQEAgLTExMzYsNiArMTEzNiwyMSBAQAogCSAgICAgIHJlc3VsdGluZyBpbiB0aGUgdGFyZ2V0IGZpbGUgYmVpbmcgcmVjb21waWxlZCBmb3Igbm8KIAkgICAgICBvYnZpb3VzIHJlYXNvbi4KIAorICAgIGR0YworCUNyZWF0ZSBmbGF0dGVuZCBkZXZpY2UgdHJlZSBibG9iIG9iamVjdCBzdWl0YWJsZSBmb3IgbGlua2luZworCWludG8gdm1saW51eC4gRGV2aWNlIHRyZWUgYmxvYnMgbGlua2VkIGludG8gdm1saW51eCBhcmUgcGxhY2VkCisJaW4gYW4gaW5pdCBzZWN0aW9uIGluIHRoZSBpbWFnZS4gUGxhdGZvcm0gY29kZSAqbXVzdCogY29weSB0aGUKKwlibG9iIHRvIG5vbi1pbml0IG1lbW9yeSBwcmlvciB0byBjYWxsaW5nIHVuZmxhdHRlbl9kZXZpY2VfdHJlZSgpLgorCisJRXhhbXBsZToKKwkJI2FyY2gveDg2L3BsYXRmb3JtL2NlNDEwMC9NYWtlZmlsZQorCQljbGVhbi1maWxlcyA6PSAqZHRiLlMKKworCQlEVENfRkxBR1MgOj0gLXAgMTAyNAorCQlvYmoteSArPSBmb28uZHRiLm8KKworCQkkKG9iaikvJS5kdGI6ICQoc3JjKS8lLmR0cworCQkJJChjYWxsIGNtZCxkdGMpCiAKIC0tLSA2LjcgQ3VzdG9tIGtidWlsZCBjb21tYW5kcwogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2tleXMtdHJ1c3RlZC1lbmNyeXB0ZWQudHh0IGIvRG9jdW1lbnRhdGlvbi9rZXlzLXRydXN0ZWQtZW5jcnlwdGVkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmI3OWJjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9rZXlzLXRydXN0ZWQtZW5jcnlwdGVkLnR4dApAQCAtMCwwICsxLDE0NSBAQAorCQkJVHJ1c3RlZCBhbmQgRW5jcnlwdGVkIEtleXMKKworVHJ1c3RlZCBhbmQgRW5jcnlwdGVkIEtleXMgYXJlIHR3byBuZXcga2V5IHR5cGVzIGFkZGVkIHRvIHRoZSBleGlzdGluZyBrZXJuZWwKK2tleSByaW5nIHNlcnZpY2UuICBCb3RoIG9mIHRoZXNlIG5ldyB0eXBlcyBhcmUgdmFyaWFibGUgbGVuZ3RoIHN5bW1ldGljIGtleXMsCithbmQgaW4gYm90aCBjYXNlcyBhbGwga2V5cyBhcmUgY3JlYXRlZCBpbiB0aGUga2VybmVsLCBhbmQgdXNlciBzcGFjZSBzZWVzLAorc3RvcmVzLCBhbmQgbG9hZHMgb25seSBlbmNyeXB0ZWQgYmxvYnMuICBUcnVzdGVkIEtleXMgcmVxdWlyZSB0aGUgYXZhaWxhYmlsaXR5CitvZiBhIFRydXN0ZWQgUGxhdGZvcm0gTW9kdWxlIChUUE0pIGNoaXAgZm9yIGdyZWF0ZXIgc2VjdXJpdHksIHdoaWxlIEVuY3J5cHRlZAorS2V5cyBjYW4gYmUgdXNlZCBvbiBhbnkgc3lzdGVtLiAgQWxsIHVzZXIgbGV2ZWwgYmxvYnMsIGFyZSBkaXNwbGF5ZWQgYW5kIGxvYWRlZAoraW4gaGV4IGFzY2lpIGZvciBjb252ZW5pZW5jZSwgYW5kIGFyZSBpbnRlZ3JpdHkgdmVyaWZpZWQuCisKK1RydXN0ZWQgS2V5cyB1c2UgYSBUUE0gYm90aCB0byBnZW5lcmF0ZSBhbmQgdG8gc2VhbCB0aGUga2V5cy4gIEtleXMgYXJlIHNlYWxlZAordW5kZXIgYSAyMDQ4IGJpdCBSU0Ega2V5IGluIHRoZSBUUE0sIGFuZCBvcHRpb25hbGx5IHNlYWxlZCB0byBzcGVjaWZpZWQgUENSCisoaW50ZWdyaXR5IG1lYXN1cmVtZW50KSB2YWx1ZXMsIGFuZCBvbmx5IHVuc2VhbGVkIGJ5IHRoZSBUUE0sIGlmIFBDUnMgYW5kIGJsb2IKK2ludGVncml0eSB2ZXJpZmljYXRpb25zIG1hdGNoLiAgQSBsb2FkZWQgVHJ1c3RlZCBLZXkgY2FuIGJlIHVwZGF0ZWQgd2l0aCBuZXcKKyhmdXR1cmUpIFBDUiB2YWx1ZXMsIHNvIGtleXMgYXJlIGVhc2lseSBtaWdyYXRlZCB0byBuZXcgcGNyIHZhbHVlcywgc3VjaCBhcword2hlbiB0aGUga2VybmVsIGFuZCBpbml0cmFtZnMgYXJlIHVwZGF0ZWQuICBUaGUgc2FtZSBrZXkgY2FuIGhhdmUgbWFueSBzYXZlZAorYmxvYnMgdW5kZXIgZGlmZmVyZW50IFBDUiB2YWx1ZXMsIHNvIG11bHRpcGxlIGJvb3RzIGFyZSBlYXNpbHkgc3VwcG9ydGVkLgorCitCeSBkZWZhdWx0LCB0cnVzdGVkIGtleXMgYXJlIHNlYWxlZCB1bmRlciB0aGUgU1JLLCB3aGljaCBoYXMgdGhlIGRlZmF1bHQKK2F1dGhvcml6YXRpb24gdmFsdWUgKDIwIHplcm9zKS4gIFRoaXMgY2FuIGJlIHNldCBhdCB0YWtlb3duZXJzaGlwIHRpbWUgd2l0aCB0aGUKK3Ryb3VzZXIncyB1dGlsaXR5OiAidHBtX3Rha2Vvd25lcnNoaXAgLXUgLXoiLgorCitVc2FnZToKKyAgICBrZXljdGwgYWRkIHRydXN0ZWQgbmFtZSAibmV3IGtleWxlbiBbb3B0aW9uc10iIHJpbmcKKyAgICBrZXljdGwgYWRkIHRydXN0ZWQgbmFtZSAibG9hZCBoZXhfYmxvYiBbcGNybG9jaz1wY3JudW1dIiByaW5nCisgICAga2V5Y3RsIHVwZGF0ZSBrZXkgInVwZGF0ZSBbb3B0aW9uc10iCisgICAga2V5Y3RsIHByaW50IGtleWlkCisKKyAgICBvcHRpb25zOgorICAgICAgIGtleWhhbmRsZT0gYXNjaWkgaGV4IHZhbHVlIG9mIHNlYWxpbmcga2V5IGRlZmF1bHQgMHg0MDAwMDAwMCAoU1JLKQorICAgICAgIGtleWF1dGg9CSAgYXNjaWkgaGV4IGF1dGggZm9yIHNlYWxpbmcga2V5IGRlZmF1bHQgMHgwMC4uLmkKKwkJICAoNDAgYXNjaWkgemVyb3MpCisgICAgICAgYmxvYmF1dGg9ICBhc2NpaSBoZXggYXV0aCBmb3Igc2VhbGVkIGRhdGEgZGVmYXVsdCAweDAwLi4uCisJCSAgKDQwIGFzY2lpIHplcm9zKQorICAgICAgIGJsb2JhdXRoPSAgYXNjaWkgaGV4IGF1dGggZm9yIHNlYWxlZCBkYXRhIGRlZmF1bHQgMHgwMC4uLgorCQkgICg0MCBhc2NpaSB6ZXJvcykKKyAgICAgICBwY3JpbmZvPQkgIGFzY2lpIGhleCBvZiBQQ1JfSU5GTyBvciBQQ1JfSU5GT19MT05HIChubyBkZWZhdWx0KQorICAgICAgIHBjcmxvY2s9CSAgcGNyIG51bWJlciB0byBiZSBleHRlbmRlZCB0byAibG9jayIgYmxvYgorICAgICAgIG1pZ3JhdGFibGU9IDB8MSBpbmRpY2F0aW5nIHBlcm1pc3Npb24gdG8gcmVzZWFsIHRvIG5ldyBQQ1IgdmFsdWVzLAorICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgMSAocmVzZWFsaW5nIGFsbG93ZWQpCisKKyJrZXljdGwgcHJpbnQiIHJldHVybnMgYW4gYXNjaWkgaGV4IGNvcHkgb2YgdGhlIHNlYWxlZCBrZXksIHdoaWNoIGlzIGluIHN0YW5kYXJkCitUUE1fU1RPUkVEX0RBVEEgZm9ybWF0LiAgVGhlIGtleSBsZW5ndGggZm9yIG5ldyBrZXlzIGFyZSBhbHdheXMgaW4gYnl0ZXMuCitUcnVzdGVkIEtleXMgY2FuIGJlIDMyIC0gMTI4IGJ5dGVzICgyNTYgLSAxMDI0IGJpdHMpLCB0aGUgdXBwZXIgbGltaXQgaXMgdG8gZml0Cit3aXRoaW4gdGhlIDIwNDggYml0IFNSSyAoUlNBKSBrZXlsZW5ndGgsIHdpdGggYWxsIG5lY2Vzc2FyeSBzdHJ1Y3R1cmUvcGFkZGluZy4KKworRW5jcnlwdGVkIGtleXMgZG8gbm90IGRlcGVuZCBvbiBhIFRQTSwgYW5kIGFyZSBmYXN0ZXIsIGFzIHRoZXkgdXNlIEFFUyBmb3IKK2VuY3J5cHRpb24vZGVjcnlwdGlvbi4gIE5ldyBrZXlzIGFyZSBjcmVhdGVkIGZyb20ga2VybmVsIGdlbmVyYXRlZCByYW5kb20KK251bWJlcnMsIGFuZCBhcmUgZW5jcnlwdGVkL2RlY3J5cHRlZCB1c2luZyBhIHNwZWNpZmllZCAnbWFzdGVyJyBrZXkuICBUaGUKKydtYXN0ZXInIGtleSBjYW4gZWl0aGVyIGJlIGEgdHJ1c3RlZC1rZXkgb3IgdXNlci1rZXkgdHlwZS4gIFRoZSBtYWluCitkaXNhZHZhbnRhZ2Ugb2YgZW5jcnlwdGVkIGtleXMgaXMgdGhhdCBpZiB0aGV5IGFyZSBub3Qgcm9vdGVkIGluIGEgdHJ1c3RlZCBrZXksCit0aGV5IGFyZSBvbmx5IGFzIHNlY3VyZSBhcyB0aGUgdXNlciBrZXkgZW5jcnlwdGluZyB0aGVtLiAgVGhlIG1hc3RlciB1c2VyIGtleQorc2hvdWxkIHRoZXJlZm9yZSBiZSBsb2FkZWQgaW4gYXMgc2VjdXJlIGEgd2F5IGFzIHBvc3NpYmxlLCBwcmVmZXJhYmx5IGVhcmx5IGluCitib290LgorCitVc2FnZToKKyAga2V5Y3RsIGFkZCBlbmNyeXB0ZWQgbmFtZSAibmV3IGtleS10eXBlOm1hc3Rlci1rZXktbmFtZSBrZXlsZW4iIHJpbmcKKyAga2V5Y3RsIGFkZCBlbmNyeXB0ZWQgbmFtZSAibG9hZCBoZXhfYmxvYiIgcmluZworICBrZXljdGwgdXBkYXRlIGtleWlkICJ1cGRhdGUga2V5LXR5cGU6bWFzdGVyLWtleS1uYW1lIgorCit3aGVyZSAna2V5LXR5cGUnIGlzIGVpdGhlciAndHJ1c3RlZCcgb3IgJ3VzZXInLgorCitFeGFtcGxlcyBvZiB0cnVzdGVkIGFuZCBlbmNyeXB0ZWQga2V5IHVzYWdlOgorCitDcmVhdGUgYW5kIHNhdmUgYSB0cnVzdGVkIGtleSBuYW1lZCAia21rIiBvZiBsZW5ndGggMzIgYnl0ZXM6CisKKyAgICAkIGtleWN0bCBhZGQgdHJ1c3RlZCBrbWsgIm5ldyAzMiIgQHUKKyAgICA0NDA1MDI4NDgKKworICAgICQga2V5Y3RsIHNob3cKKyAgICBTZXNzaW9uIEtleXJpbmcKKyAgICAgICAgICAgLTMgLS1hbHN3cnYgICAgNTAwICAgNTAwICBrZXlyaW5nOiBfc2VzCisgICAgIDk3ODMzNzE0IC0tYWxzd3J2ICAgIDUwMCAgICAtMSAgIFxfIGtleXJpbmc6IF91aWQuNTAwCisgICAgNDQwNTAyODQ4IC0tYWxzd3J2ICAgIDUwMCAgIDUwMCAgICAgICBcXyB0cnVzdGVkOiBrbWsKKworICAgICQga2V5Y3RsIHByaW50IDQ0MDUwMjg0OAorICAgIDAxMDEwMDAwMDAwMDAwMDAwMDAwMDEwMDVkMDFiN2UzZjRhNmJlNTcwOTkzMGYzYjcwYTc0M2NiYjQyZTBjYzk1ZTE4ZTkxNQorICAgIDNmNjBkYTQ1NWJiZjExNDRhZDEyZTRmOTJiNDUyZjk2NjkyOWY2MTA1ZmQyOWNhMjhlNGQ0ZDVhMDMxZDA2ODQ3OGJhY2IwYgorICAgIDI3MzUxMTE5ZjgyMjkxMWIwYTExYmEzZDM0OThiYTZhMzJlNTBkYWM3ZjMyODk0ZGQ4OTBlYjlhZDU3OGU0ZTI5MmM4MzcyMgorICAgIGE1MmU1NmEwOTdlNmE2OGIzZjU2ZjdhNTJlY2UwY2RjY2JhMWViNjJjYWQ3ZDgxN2Y2ZGM1ODg5OGIzYWMxNWYzNjAyNmZlYworICAgIGQ1NjhiZDRhNzA2Y2I2MGJiMzdiZTZkOGYxMjQwNjYxMTk5ZDY0MGI2NmZiMGZlM2IwNzlmOTdmNDUwYjllZjljMjJjNmQ1ZAorICAgIGRkMzc5ZjBmYWNkMWNkMDIwMjgxZGZhM2M3MGJhMjFhM2ZhNmZjMjQ3MWRjNmQxM2VjZjgyOThiOTQ2ZjY1MzQ1ZmFhNWVmMAorICAgIGYxZjhmZmYwM2FkMGFjYjA4MzcyNTUzNTYzNmFkZGIwOGQ3M2RlZGI5ODMyZGExOTgwODFlNWRlYWU4NGJmYWYwNDA5YzIyYgorICAgIGU0YThhZWEyYjYwN2VjOTY5MzFlNmY0ZDRmZTU2M2JhCisKKyAgICAkIGtleWN0bCBwaXBlIDQ0MDUwMjg0OCA+IGttay5ibG9iCisKK0xvYWQgYSB0cnVzdGVkIGtleSBmcm9tIHRoZSBzYXZlZCBibG9iOgorCisgICAgJCBrZXljdGwgYWRkIHRydXN0ZWQga21rICJsb2FkIGBjYXQga21rLmJsb2JgIiBAdQorICAgIDI2ODcyODgyNAorCisgICAgJCBrZXljdGwgcHJpbnQgMjY4NzI4ODI0CisgICAgMDEwMTAwMDAwMDAwMDAwMDAwMDAwMTAwNWQwMWI3ZTNmNGE2YmU1NzA5OTMwZjNiNzBhNzQzY2JiNDJlMGNjOTVlMThlOTE1CisgICAgM2Y2MGRhNDU1YmJmMTE0NGFkMTJlNGY5MmI0NTJmOTY2OTI5ZjYxMDVmZDI5Y2EyOGU0ZDRkNWEwMzFkMDY4NDc4YmFjYjBiCisgICAgMjczNTExMTlmODIyOTExYjBhMTFiYTNkMzQ5OGJhNmEzMmU1MGRhYzdmMzI4OTRkZDg5MGViOWFkNTc4ZTRlMjkyYzgzNzIyCisgICAgYTUyZTU2YTA5N2U2YTY4YjNmNTZmN2E1MmVjZTBjZGNjYmExZWI2MmNhZDdkODE3ZjZkYzU4ODk4YjNhYzE1ZjM2MDI2ZmVjCisgICAgZDU2OGJkNGE3MDZjYjYwYmIzN2JlNmQ4ZjEyNDA2NjExOTlkNjQwYjY2ZmIwZmUzYjA3OWY5N2Y0NTBiOWVmOWMyMmM2ZDVkCisgICAgZGQzNzlmMGZhY2QxY2QwMjAyODFkZmEzYzcwYmEyMWEzZmE2ZmMyNDcxZGM2ZDEzZWNmODI5OGI5NDZmNjUzNDVmYWE1ZWYwCisgICAgZjFmOGZmZjAzYWQwYWNiMDgzNzI1NTM1NjM2YWRkYjA4ZDczZGVkYjk4MzJkYTE5ODA4MWU1ZGVhZTg0YmZhZjA0MDljMjJiCisgICAgZTRhOGFlYTJiNjA3ZWM5NjkzMWU2ZjRkNGZlNTYzYmEKKworUmVzZWFsIGEgdHJ1c3RlZCBrZXkgdW5kZXIgbmV3IHBjciB2YWx1ZXM6CisKKyAgICAkIGtleWN0bCB1cGRhdGUgMjY4NzI4ODI0ICJ1cGRhdGUgcGNyaW5mbz1gY2F0IHBjci5ibG9iYCIKKyAgICAkIGtleWN0bCBwcmludCAyNjg3Mjg4MjQKKyAgICAwMTAxMDAwMDAwMDAwMDJjMDAwMjgwMDA5M2MzNWEwOWI3MGZmZjI2ZTdhOThhZTc4NmM2NDFlNjc4ZWM2ZmZiNmI0NmQ4MDUKKyAgICA3N2M4YTYzNzdhZWQ5ZDMyMTljNmRmZWM0YjIzZmZlMzAwMDAwMTAwNWQzN2Q0NzJhYzhhNDQwMjNmYmIzZDE4NTgzYTRmNzMKKyAgICBkM2EwNzZjMDg1OGY2ZjFkY2FhMzllYTBmMTE5OTExZmYwM2Y1NDA2ZGY0ZjdmMjdmNDFkYThkNzE5NGY0NWM5ZjRlMDBmMmUKKyAgICBkZjQ0OWYyNjYyNTNhYTNmNTJlNTVjNTNkZTE0Nzc3M2UwMGYwZjlhY2E4NmM2NGQ5NGM5NTM4MjI2NTk2OGMzNTRjNWVhYjQKKyAgICA5NjM4YzVhZTk5Yzg5ZGUxZTA5OTcyNDJlZGZiMGI1MDE3NDRlMTFmZjk3NjJkZmQ5NTFjZmZkOTMyMjdjYzUxMzM4NGU3ZTYKKyAgICBlNzgyYzI5NDM1YzdlYzJlZGFmYWEyZjRjMWZlNmU3YTc4MWI1OTU0OWZmNTI5NjM3MWI0MjEzMzc3N2RjYzViOGI5NzE2MTAKKyAgICA5NGJjNjdlZGUxOWU0M2RkYjlkYzJiYWFjYWQzNzRhMzZmZWFmMDMxNGQ3MDBhZjBhNjVjMTY0YjcwODI0MDE3NDBlNDg5YzkKKyAgICA3ZWY2YTI0ZGVmZTQ4NDYxMDQyMDliZjBjM2VjZWQ3ZmExYTY3MmVkNWIxMjVmYzlkOGNkODhiNDc2YTY1OGE0NDM0NjQ0ZWYKKyAgICBkZjhhZTlhMTc4ZTlmODNiYTlmMDhkMTBmYTQ3ZTQyMjZiOThiMDcwMmYwNmIzYjgKKworQ3JlYXRlIGFuZCBzYXZlIGFuIGVuY3J5cHRlZCBrZXkgImV2bSIgdXNpbmcgdGhlIGFib3ZlIHRydXN0ZWQga2V5ICJrbWsiOgorCisgICAgJCBrZXljdGwgYWRkIGVuY3J5cHRlZCBldm0gIm5ldyB0cnVzdGVkOmttayAzMiIgQHUKKyAgICAxNTk3NzExNzUKKworICAgICQga2V5Y3RsIHByaW50IDE1OTc3MTE3NQorICAgIHRydXN0ZWQ6a21rIDMyIDIzNzU3MjVhZDU3Nzk4ODQ2YTliYmQyNDBkZTg5MDZmMDA2ZTY2YzAzYWY1M2IxYjM4MmRiYmM1NQorICAgIGJlMmE0NDYxNmU0OTU5NDMwNDM2ZGM0ZjJhN2E5NjU5YWE2MGJiNDY1MmFlYjIxMjBmMTQ5ZWQxOTdjNTY0ZTAyNDcxN2M2NAorICAgIDU5NzJkY2I4MmFiMmRkZTgzMzc2ZDgyYjJlM2MwOWZmYworCisgICAgJCBrZXljdGwgcGlwZSAxNTk3NzExNzUgPiBldm0uYmxvYgorCitMb2FkIGFuIGVuY3J5cHRlZCBrZXkgImV2bSIgZnJvbSBzYXZlZCBibG9iOgorCisgICAgJCBrZXljdGwgYWRkIGVuY3J5cHRlZCBldm0gImxvYWQgYGNhdCBldm0uYmxvYmAiIEB1CisgICAgODMxNjg0MjYyCisKKyAgICAkIGtleWN0bCBwcmludCA4MzE2ODQyNjIKKyAgICB0cnVzdGVkOmttayAzMiAyMzc1NzI1YWQ1Nzc5ODg0NmE5YmJkMjQwZGU4OTA2ZjAwNmU2NmMwM2FmNTNiMWIzODJkYmJjNTUKKyAgICBiZTJhNDQ2MTZlNDk1OTQzMDQzNmRjNGYyYTdhOTY1OWFhNjBiYjQ2NTJhZWIyMTIwZjE0OWVkMTk3YzU2NGUwMjQ3MTdjNjQKKyAgICA1OTcyZGNiODJhYjJkZGU4MzM3NmQ4MmIyZTNjMDlmZmMKKworCitUaGUgaW5pdGlhbCBjb25zdW1lciBvZiB0cnVzdGVkIGtleXMgaXMgRVZNLCB3aGljaCBhdCBib290IHRpbWUgbmVlZHMgYSBoaWdoCitxdWFsaXR5IHN5bW1ldHJpYyBrZXkgZm9yIEhNQUMgcHJvdGVjdGlvbiBvZiBmaWxlIG1ldGFkYXRhLiAgVGhlIHVzZSBvZiBhCit0cnVzdGVkIGtleSBwcm92aWRlcyBzdHJvbmcgZ3VhcmFudGVlcyB0aGF0IHRoZSBFVk0ga2V5IGhhcyBub3QgYmVlbgorY29tcHJvbWlzZWQgYnkgYSB1c2VyIGxldmVsIHByb2JsZW0sIGFuZCB3aGVuIHNlYWxlZCB0byBzcGVjaWZpYyBib290IFBDUgordmFsdWVzLCBwcm90ZWN0cyBhZ2FpbnN0IGJvb3QgYW5kIG9mZmxpbmUgYXR0YWNrcy4gIE90aGVyIHVzZXMgZm9yIHRydXN0ZWQgYW5kCitlbmNyeXB0ZWQga2V5cywgc3VjaCBhcyBmb3IgZGlzayBhbmQgZmlsZSBlbmNyeXB0aW9uIGFyZSBhbnRpY2lwYXRlZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbWFrZS9oZWFkZXJzX2luc3RhbGwudHh0IGIvRG9jdW1lbnRhdGlvbi9tYWtlL2hlYWRlcnNfaW5zdGFsbC50eHQKaW5kZXggZjI0ODFjYS4uOTUxZWI5ZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9tYWtlL2hlYWRlcnNfaW5zdGFsbC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9tYWtlL2hlYWRlcnNfaW5zdGFsbC50eHQKQEAgLTM5LDggKzM5LDkgQEAKIFRoZSBjb21tYW5kICJtYWtlIGhlYWRlcnNfaW5zdGFsbF9hbGwiIGV4cG9ydHMgaGVhZGVycyBmb3IgYWxsIGFyY2hpdGVjdHVyZXMKIHNpbXVsdGFuZW91c2x5LiAgKFRoaXMgaXMgbW9zdGx5IG9mIGludGVyZXN0IHRvIGRpc3RyaWJ1dGlvbiBtYWludGFpbmVycywKIHdobyBjcmVhdGUgYW4gYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IHRhcmJhbGwgZnJvbSB0aGUgcmVzdWx0aW5nIGluY2x1ZGUKLWRpcmVjdG9yeS4pICBSZW1lbWJlciB0byBwcm92aWRlIHRoZSBhcHByb3ByaWF0ZSBsaW51eC9hc20gZGlyZWN0b3J5IHZpYSAibXYiCi1vciAibG4gLXMiIGJlZm9yZSBidWlsZGluZyBhIEMgbGlicmFyeSB3aXRoIGhlYWRlcnMgZXhwb3J0ZWQgdGhpcyB3YXkuCitkaXJlY3RvcnkuKSAgWW91IGFsc28gY2FuIHVzZSBIRFJfQVJDSF9MSVNUIHRvIHNwZWNpZnkgbGlzdCBvZiBhcmNoaXRlY3R1cmVzLgorUmVtZW1iZXIgdG8gcHJvdmlkZSB0aGUgYXBwcm9wcmlhdGUgbGludXgvYXNtIGRpcmVjdG9yeSB2aWEgIm12IiBvciAibG4gLXMiCitiZWZvcmUgYnVpbGRpbmcgYSBDIGxpYnJhcnkgd2l0aCBoZWFkZXJzIGV4cG9ydGVkIHRoaXMgd2F5LgogCiBUaGUga2VybmVsIGhlYWRlciBleHBvcnQgaW5mcmFzdHJ1Y3R1cmUgaXMgbWFpbnRhaW5lZCBieSBEYXZpZCBXb29kaG91c2UKIDxkd213MkBpbmZyYWRlYWQub3JnPi4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXIvZHJpdmVycy10ZXN0aW5nLnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXIvZHJpdmVycy10ZXN0aW5nLnR4dAppbmRleCA3ZjdhNzM3Li42MzhhZmRmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL2RyaXZlcnMtdGVzdGluZy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlci9kcml2ZXJzLXRlc3RpbmcudHh0CkBAIC0yMywxMCArMjMsMTAgQEAKIHdpdGhvdXQgdGhlIG5ldyBkcml2ZXIsIHlvdSBhcmUgcmVhZHkgdG8gdGVzdCBpdDoKIAogYSkgQnVpbGQgdGhlIGRyaXZlciBhcyBhIG1vZHVsZSwgbG9hZCBpdCBhbmQgdHJ5IHRoZSB0ZXN0IG1vZGVzIG9mIGhpYmVybmF0aW9uCi0gICAoc2VlOiBEb2N1bWVudHMvcG93ZXIvYmFzaWMtcG0tZGVidWdnaW5nLnR4dCwgMSkuCisgICAoc2VlOiBEb2N1bWVudGF0aW9uL3Bvd2VyL2Jhc2ljLXBtLWRlYnVnZ2luZy50eHQsIDEpLgogCiBiKSBMb2FkIHRoZSBkcml2ZXIgYW5kIGF0dGVtcHQgdG8gaGliZXJuYXRlIGluIHRoZSAicmVib290IiwgInNodXRkb3duIiBhbmQKLSAgICJwbGF0Zm9ybSIgbW9kZXMgKHNlZTogRG9jdW1lbnRzL3Bvd2VyL2Jhc2ljLXBtLWRlYnVnZ2luZy50eHQsIDEpLgorICAgInBsYXRmb3JtIiBtb2RlcyAoc2VlOiBEb2N1bWVudGF0aW9uL3Bvd2VyL2Jhc2ljLXBtLWRlYnVnZ2luZy50eHQsIDEpLgogCiBjKSBDb21waWxlIHRoZSBkcml2ZXIgZGlyZWN0bHkgaW50byB0aGUga2VybmVsIGFuZCB0cnkgdGhlIHRlc3QgbW9kZXMgb2YKICAgIGhpYmVybmF0aW9uLgpAQCAtMzQsMTIgKzM0LDEyIEBACiBkKSBBdHRlbXB0IHRvIGhpYmVybmF0ZSB3aXRoIHRoZSBkcml2ZXIgY29tcGlsZWQgZGlyZWN0bHkgaW50byB0aGUga2VybmVsCiAgICBpbiB0aGUgInJlYm9vdCIsICJzaHV0ZG93biIgYW5kICJwbGF0Zm9ybSIgbW9kZXMuCiAKLWUpIFRyeSB0aGUgdGVzdCBtb2RlcyBvZiBzdXNwZW5kIChzZWU6IERvY3VtZW50cy9wb3dlci9iYXNpYy1wbS1kZWJ1Z2dpbmcudHh0LAorZSkgVHJ5IHRoZSB0ZXN0IG1vZGVzIG9mIHN1c3BlbmQgKHNlZTogRG9jdW1lbnRhdGlvbi9wb3dlci9iYXNpYy1wbS1kZWJ1Z2dpbmcudHh0LAogICAgMikuICBbQXMgZmFyIGFzIHRoZSBTVFIgdGVzdHMgYXJlIGNvbmNlcm5lZCwgaXQgc2hvdWxkIG5vdCBtYXR0ZXIgd2hldGhlciBvcgogICAgbm90IHRoZSBkcml2ZXIgaXMgYnVpbHQgYXMgYSBtb2R1bGUuXQogCiBmKSBBdHRlbXB0IHRvIHN1c3BlbmQgdG8gUkFNIHVzaW5nIHRoZSBzMnJhbSB0b29sIHdpdGggdGhlIGRyaXZlciBsb2FkZWQKLSAgIChzZWU6IERvY3VtZW50cy9wb3dlci9iYXNpYy1wbS1kZWJ1Z2dpbmcudHh0LCAyKS4KKyAgIChzZWU6IERvY3VtZW50YXRpb24vcG93ZXIvYmFzaWMtcG0tZGVidWdnaW5nLnR4dCwgMikuCiAKIEVhY2ggb2YgdGhlIGFib3ZlIHRlc3RzIHNob3VsZCBiZSByZXBlYXRlZCBzZXZlcmFsIHRpbWVzIGFuZCB0aGUgU1REIHRlc3RzCiBzaG91bGQgYmUgbWl4ZWQgd2l0aCB0aGUgU1RSIHRlc3RzLiAgSWYgYW55IG9mIHRoZW0gZmFpbHMsIHRoZSBkcml2ZXIgY2Fubm90IGJlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3J1bnRpbWVfcG0udHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlci9ydW50aW1lX3BtLnR4dAppbmRleCA0MWNjN2IzLi5mZmU1NWZmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3J1bnRpbWVfcG0udHh0CisrKyBiL0RvY3VtZW50YXRpb24vcG93ZXIvcnVudGltZV9wbS50eHQKQEAgLTUwLDYgKzUwLDE1IEBACiBhbmQgZGV2aWNlIGNsYXNzIGNhbGxiYWNrcyBhcmUgcmVmZXJyZWQgdG8gYXMgc3Vic3lzdGVtLWxldmVsIGNhbGxiYWNrcyBpbiB3aGF0CiBmb2xsb3dzLgogCitCeSBkZWZhdWx0LCB0aGUgY2FsbGJhY2tzIGFyZSBhbHdheXMgaW52b2tlZCBpbiBwcm9jZXNzIGNvbnRleHQgd2l0aCBpbnRlcnJ1cHRzCitlbmFibGVkLiAgSG93ZXZlciwgc3Vic3lzdGVtcyBjYW4gdXNlIHRoZSBwbV9ydW50aW1lX2lycV9zYWZlKCkgaGVscGVyIGZ1bmN0aW9uCit0byB0ZWxsIHRoZSBQTSBjb3JlIHRoYXQgYSBkZXZpY2UncyAtPnJ1bnRpbWVfc3VzcGVuZCgpIGFuZCAtPnJ1bnRpbWVfcmVzdW1lKCkKK2NhbGxiYWNrcyBzaG91bGQgYmUgaW52b2tlZCBpbiBhdG9taWMgY29udGV4dCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQKKygtPnJ1bnRpbWVfaWRsZSgpIGlzIHN0aWxsIGludm9rZWQgdGhlIGRlZmF1bHQgd2F5KS4gIFRoaXMgaW1wbGllcyB0aGF0IHRoZXNlCitjYWxsYmFjayByb3V0aW5lcyBtdXN0IG5vdCBibG9jayBvciBzbGVlcCwgYnV0IGl0IGFsc28gbWVhbnMgdGhhdCB0aGUKK3N5bmNocm9ub3VzIGhlbHBlciBmdW5jdGlvbnMgbGlzdGVkIGF0IHRoZSBlbmQgb2YgU2VjdGlvbiA0IGNhbiBiZSB1c2VkIHdpdGhpbgorYW4gaW50ZXJydXB0IGhhbmRsZXIgb3IgaW4gYW4gYXRvbWljIGNvbnRleHQuCisKIFRoZSBzdWJzeXN0ZW0tbGV2ZWwgc3VzcGVuZCBjYWxsYmFjayBpcyBfZW50aXJlbHlfIF9yZXNwb25zaWJsZV8gZm9yIGhhbmRsaW5nCiB0aGUgc3VzcGVuZCBvZiB0aGUgZGV2aWNlIGFzIGFwcHJvcHJpYXRlLCB3aGljaCBtYXksIGJ1dCBuZWVkIG5vdCBpbmNsdWRlCiBleGVjdXRpbmcgdGhlIGRldmljZSBkcml2ZXIncyBvd24gLT5ydW50aW1lX3N1c3BlbmQoKSBjYWxsYmFjayAoZnJvbSB0aGUKQEAgLTIzNyw2ICsyNDYsMTAgQEAKICAgICAgIFNlY3Rpb24gOCk7IGl0IG1heSBiZSBtb2RpZmllZCBvbmx5IGJ5IHRoZSBwbV9ydW50aW1lX25vX2NhbGxiYWNrcygpCiAgICAgICBoZWxwZXIgZnVuY3Rpb24KIAorICB1bnNpZ25lZCBpbnQgaXJxX3NhZmU7CisgICAgLSBpbmRpY2F0ZXMgdGhhdCB0aGUgLT5ydW50aW1lX3N1c3BlbmQoKSBhbmQgLT5ydW50aW1lX3Jlc3VtZSgpIGNhbGxiYWNrcworICAgICAgd2lsbCBiZSBpbnZva2VkIHdpdGggdGhlIHNwaW5sb2NrIGhlbGQgYW5kIGludGVycnVwdHMgZGlzYWJsZWQKKwogICB1bnNpZ25lZCBpbnQgdXNlX2F1dG9zdXNwZW5kOwogICAgIC0gaW5kaWNhdGVzIHRoYXQgdGhlIGRldmljZSdzIGRyaXZlciBzdXBwb3J0cyBkZWxheWVkIGF1dG9zdXNwZW5kIChzZWUKICAgICAgIFNlY3Rpb24gOSk7IGl0IG1heSBiZSBtb2RpZmllZCBvbmx5IGJ5IHRoZQpAQCAtMzQ0LDYgKzM1NywxMCBAQAogICAgIC0gZGVjcmVtZW50IHRoZSBkZXZpY2UncyB1c2FnZSBjb3VudGVyOyBpZiB0aGUgcmVzdWx0IGlzIDAgdGhlbiBydW4KICAgICAgIHBtX3J1bnRpbWVfaWRsZShkZXYpIGFuZCByZXR1cm4gaXRzIHJlc3VsdAogCisgIGludCBwbV9ydW50aW1lX3B1dF9zeW5jX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KTsKKyAgICAtIGRlY3JlbWVudCB0aGUgZGV2aWNlJ3MgdXNhZ2UgY291bnRlcjsgaWYgdGhlIHJlc3VsdCBpcyAwIHRoZW4gcnVuCisgICAgICBwbV9ydW50aW1lX3N1c3BlbmQoZGV2KSBhbmQgcmV0dXJuIGl0cyByZXN1bHQKKwogICBpbnQgcG1fcnVudGltZV9wdXRfc3luY19hdXRvc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpOwogICAgIC0gZGVjcmVtZW50IHRoZSBkZXZpY2UncyB1c2FnZSBjb3VudGVyOyBpZiB0aGUgcmVzdWx0IGlzIDAgdGhlbiBydW4KICAgICAgIHBtX3J1bnRpbWVfYXV0b3N1c3BlbmQoZGV2KSBhbmQgcmV0dXJuIGl0cyByZXN1bHQKQEAgLTM5Nyw2ICs0MTQsMTEgQEAKICAgICAgIFBNIGF0dHJpYnV0ZXMgZnJvbSAvc3lzL2RldmljZXMvLi4uL3Bvd2VyIChvciBwcmV2ZW50IHRoZW0gZnJvbSBiZWluZwogICAgICAgYWRkZWQgd2hlbiB0aGUgZGV2aWNlIGlzIHJlZ2lzdGVyZWQpCiAKKyAgdm9pZCBwbV9ydW50aW1lX2lycV9zYWZlKHN0cnVjdCBkZXZpY2UgKmRldik7CisgICAgLSBzZXQgdGhlIHBvd2VyLmlycV9zYWZlIGZsYWcgZm9yIHRoZSBkZXZpY2UsIGNhdXNpbmcgdGhlIHJ1bnRpbWUtUE0KKyAgICAgIHN1c3BlbmQgYW5kIHJlc3VtZSBjYWxsYmFja3MgKGJ1dCBub3QgdGhlIGlkbGUgY2FsbGJhY2spIHRvIGJlIGludm9rZWQKKyAgICAgIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZAorCiAgIHZvaWQgcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShzdHJ1Y3QgZGV2aWNlICpkZXYpOwogICAgIC0gc2V0IHRoZSBwb3dlci5sYXN0X2J1c3kgZmllbGQgdG8gdGhlIGN1cnJlbnQgdGltZQogCkBAIC00MzgsNiArNDYwLDE1IEBACiBwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KCkKIHBtX3J1bnRpbWVfYXV0b3N1c3BlbmRfZXhwaXJhdGlvbigpCiAKK0lmIHBtX3J1bnRpbWVfaXJxX3NhZmUoKSBoYXMgYmVlbiBjYWxsZWQgZm9yIGEgZGV2aWNlIHRoZW4gdGhlIGZvbGxvd2luZyBoZWxwZXIKK2Z1bmN0aW9ucyBtYXkgYWxzbyBiZSB1c2VkIGluIGludGVycnVwdCBjb250ZXh0OgorCitwbV9ydW50aW1lX3N1c3BlbmQoKQorcG1fcnVudGltZV9hdXRvc3VzcGVuZCgpCitwbV9ydW50aW1lX3Jlc3VtZSgpCitwbV9ydW50aW1lX2dldF9zeW5jKCkKK3BtX3J1bnRpbWVfcHV0X3N5bmNfc3VzcGVuZCgpCisKIDUuIFJ1bi10aW1lIFBNIEluaXRpYWxpemF0aW9uLCBEZXZpY2UgUHJvYmluZyBhbmQgUmVtb3ZhbAogCiBJbml0aWFsbHksIHRoZSBydW4tdGltZSBQTSBpcyBkaXNhYmxlZCBmb3IgYWxsIGRldmljZXMsIHdoaWNoIG1lYW5zIHRoYXQgdGhlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvZHRzLWJpbmRpbmdzL2VlcHJvbS50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvZHRzLWJpbmRpbmdzL2VlcHJvbS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM0MmMxMAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vcG93ZXJwYy9kdHMtYmluZGluZ3MvZWVwcm9tLnR4dApAQCAtMCwwICsxLDI4IEBACitFRVBST01zIChJMkMpCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKyAgLSBjb21wYXRpYmxlIDogc2hvdWxkIGJlICI8bWFudWZhY3R1cmVyPiw8dHlwZT4iCisJCSBJZiB0aGVyZSBpcyBubyBzcGVjaWZpYyBkcml2ZXIgZm9yIDxtYW51ZmFjdHVyZXI+LCBhIGdlbmVyaWMKKwkJIGRyaXZlciBiYXNlZCBvbiA8dHlwZT4gaXMgc2VsZWN0ZWQuIFBvc3NpYmxlIHR5cGVzIGFyZToKKwkJIDI0YzAwLCAyNGMwMSwgMjRjMDIsIDI0YzA0LCAyNGMwOCwgMjRjMTYsIDI0YzMyLCAyNGM2NCwKKwkJIDI0YzEyOCwgMjRjMjU2LCAyNGM1MTIsIDI0YzEwMjQsIHNwZAorCisgIC0gcmVnIDogdGhlIEkyQyBhZGRyZXNzIG9mIHRoZSBFRVBST00KKworT3B0aW9uYWwgcHJvcGVydGllczoKKworICAtIHBhZ2VzaXplIDogdGhlIGxlbmd0aCBvZiB0aGUgcGFnZXNpemUgZm9yIHdyaXRpbmcuIFBsZWFzZSBjb25zdWx0IHRoZQorICAgICAgICAgICAgICAgbWFudWFsIG9mIHlvdXIgZGV2aWNlLCB0aGF0IHZhbHVlIHZhcmllcyBhIGxvdC4gQSB3cm9uZyB2YWx1ZQorCSAgICAgICBtYXkgcmVzdWx0IGluIGRhdGEgbG9zcyEgSWYgbm90IHNwZWNpZmllZCwgYSBzYWZldHkgdmFsdWUgb2YKKwkgICAgICAgJzEnIGlzIHVzZWQgd2hpY2ggd2lsbCBiZSB2ZXJ5IHNsb3cuCisKKyAgLSByZWFkLW9ubHk6IHRoaXMgcGFyYW1ldGVybGVzcyBwcm9wZXJ0eSBkaXNhYmxlcyB3cml0ZXMgdG8gdGhlIGVlcHJvbQorCitFeGFtcGxlOgorCitlZXByb21ANTIgeworCWNvbXBhdGlibGUgPSAiYXRtZWwsMjRjMzIiOworCXJlZyA9IDwweDUyPjsKKwlwYWdlc2l6ZSA9IDwzMj47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zeXNjdGwva2VybmVsLnR4dCBiL0RvY3VtZW50YXRpb24vc3lzY3RsL2tlcm5lbC50eHQKaW5kZXggMjA5ZTE1OC4uNTc0MDY3MTkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc3lzY3RsL2tlcm5lbC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zeXNjdGwva2VybmVsLnR4dApAQCAtMjE5LDcgKzIxOSw3IEBACiBUaGlzIHRvZ2dsZSBpbmRpY2F0ZXMgd2hldGhlciB1bnByaXZpbGVnZWQgdXNlcnMgYXJlIHByZXZlbnRlZCBmcm9tIHVzaW5nCiBkbWVzZyg4KSB0byB2aWV3IG1lc3NhZ2VzIGZyb20gdGhlIGtlcm5lbCdzIGxvZyBidWZmZXIuICBXaGVuCiBkbWVzZ19yZXN0cmljdCBpcyBzZXQgdG8gKDApIHRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMuICBXaGVuCi1kbWVzZ19yZXN0cmljdCBpcyBzZXQgc2V0IHRvICgxKSwgdXNlcnMgbXVzdCBoYXZlIENBUF9TWVNfQURNSU4gdG8gdXNlCitkbWVzZ19yZXN0cmljdCBpcyBzZXQgc2V0IHRvICgxKSwgdXNlcnMgbXVzdCBoYXZlIENBUF9TWVNMT0cgdG8gdXNlCiBkbWVzZyg4KS4KIAogVGhlIGtlcm5lbCBjb25maWcgb3B0aW9uIENPTkZJR19TRUNVUklUWV9ETUVTR19SRVNUUklDVCBzZXRzIHRoZSBkZWZhdWx0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZtL01ha2VmaWxlIGIvRG9jdW1lbnRhdGlvbi92bS9NYWtlZmlsZQppbmRleCA5ZGNmZjMyLi4zZmE0ZDA2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZtL01ha2VmaWxlCisrKyBiL0RvY3VtZW50YXRpb24vdm0vTWFrZWZpbGUKQEAgLTIsNyArMiw3IEBACiBvYmotIDo9IGR1bW15Lm8KIAogIyBMaXN0IG9mIHByb2dyYW1zIHRvIGJ1aWxkCi1ob3N0cHJvZ3MteSA6PSBzbGFiaW5mbyBwYWdlLXR5cGVzIGh1Z2VwYWdlLW1tYXAgaHVnZXBhZ2Utc2htIG1hcF9odWdldGxiCitob3N0cHJvZ3MteSA6PSBwYWdlLXR5cGVzIGh1Z2VwYWdlLW1tYXAgaHVnZXBhZ2Utc2htIG1hcF9odWdldGxiCiAKICMgVGVsbCBrYnVpbGQgdG8gYWx3YXlzIGJ1aWxkIHRoZSBwcm9ncmFtcwogYWx3YXlzIDo9ICQoaG9zdHByb2dzLXkpCmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTCmluZGV4IGE1MjJjYzEuLmFkNjAwYzUgMTAwNjQ0Ci0tLSBhL01BSU5UQUlORVJTCisrKyBiL01BSU5UQUlORVJTCkBAIC0xNDk3LDcgKzE0OTcsOSBAQAogQlJPQURDT00gQlJDTTgwMjExIElFRUU4MDIuMTFuIFdJUkVMRVNTIERSSVZFUgogTToJQnJldHQgUnVkbGV5IDxicnVkbGV5QGJyb2FkY29tLmNvbT4KIE06CUhlbnJ5IFB0YXNpbnNraSA8aGVucnlwQGJyb2FkY29tLmNvbT4KLU06CU5vaGVlIEtvIDxub2hlZWtAYnJvYWRjb20uY29tPgorTToJRG93YW4gS2ltIDxkb3dhbkBicm9hZGNvbS5jb20+CitNOglSb2xhbmQgVm9zc2VuIDxydm9zc2VuQGJyb2FkY29tLmNvbT4KK006CUFyZW5kIHZhbiBTcHJpZWwgPGFyZW5kQGJyb2FkY29tLmNvbT4KIEw6CWxpbnV4LXdpcmVsZXNzQHZnZXIua2VybmVsLm9yZwogUzoJU3VwcG9ydGVkCiBGOglkcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExLwpAQCAtMjM0NSw2ICsyMzQ3LDE0IEBACiBTOglNYWludGFpbmVkCiBGOglkcml2ZXJzL3BsYXRmb3JtL3g4Ni9lZWVwYy1sYXB0b3AuYwogCitFRUVQQyBXTUkgRVhUUkFTIERSSVZFUgorTToJQ29yZW50aW4gQ2hhcnkgPGNvcmVudGluY2pAaWtzYWlmLm5ldD4KK0w6CWFjcGk0YXN1cy11c2VyQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAorTDoJcGxhdGZvcm0tZHJpdmVyLXg4NkB2Z2VyLmtlcm5lbC5vcmcKK1c6CWh0dHA6Ly9hY3BpNGFzdXMuc2YubmV0CitTOglNYWludGFpbmVkCitGOglkcml2ZXJzL3BsYXRmb3JtL3g4Ni9lZWVwYy13bWkuYworCiBFRklGQiBGUkFNRUJVRkZFUiBEUklWRVIKIEw6CWxpbnV4LWZiZGV2QHZnZXIua2VybmVsLm9yZwogTToJUGV0ZXIgSm9uZXMgPHBqb25lc0ByZWRoYXQuY29tPgpAQCAtNDM0Miw2ICs0MzUyLDcgQEAKIE06CUtPTklTSEkgUnl1c3VrZSA8a29uaXNoaS5yeXVzdWtlQGxhYi5udHQuY28uanA+CiBMOglsaW51eC1uaWxmc0B2Z2VyLmtlcm5lbC5vcmcKIFc6CWh0dHA6Ly93d3cubmlsZnMub3JnL2VuLworVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9yeXVzdWtlL25pbGZzMi5naXQKIFM6CVN1cHBvcnRlZAogRjoJRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9uaWxmczIudHh0CiBGOglmcy9uaWxmczIvCkBAIC02MDAzLDcgKzYwMTQsOCBAQAogVE9NT1lPIFNFQ1VSSVRZIE1PRFVMRQogTToJS2VudGFybyBUYWtlZGEgPHRha2VkYWtuQG50dGRhdGEuY28uanA+CiBNOglUZXRzdW8gSGFuZGEgPHBlbmd1aW4ta2VybmVsQEktbG92ZS5TQUtVUkEubmUuanA+Ci1MOgl0b21veW8tdXNlcnMtZW5AbGlzdHMuc291cmNlZm9yZ2UuanAgKHN1YnNjcmliZXJzLW9ubHksIGZvciBkZXZlbG9wZXJzIGFuZCB1c2VycyBpbiBFbmdsaXNoKQorTDoJdG9tb3lvLWRldi1lbkBsaXN0cy5zb3VyY2Vmb3JnZS5qcCAoc3Vic2NyaWJlcnMtb25seSwgZm9yIGRldmVsb3BlcnMgaW4gRW5nbGlzaCkKK0w6CXRvbW95by11c2Vycy1lbkBsaXN0cy5zb3VyY2Vmb3JnZS5qcCAoc3Vic2NyaWJlcnMtb25seSwgZm9yIHVzZXJzIGluIEVuZ2xpc2gpCiBMOgl0b21veW8tZGV2QGxpc3RzLnNvdXJjZWZvcmdlLmpwIChzdWJzY3JpYmVycy1vbmx5LCBmb3IgZGV2ZWxvcGVycyBpbiBKYXBhbmVzZSkKIEw6CXRvbW95by11c2Vyc0BsaXN0cy5zb3VyY2Vmb3JnZS5qcCAoc3Vic2NyaWJlcnMtb25seSwgZm9yIHVzZXJzIGluIEphcGFuZXNlKQogVzoJaHR0cDovL3RvbW95by5zb3VyY2Vmb3JnZS5qcC8KZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKaW5kZXggNzRiMjU1NS4uNmE0NTc2OSAxMDA2NDQKLS0tIGEvTWFrZWZpbGUKKysrIGIvTWFrZWZpbGUKQEAgLTIyNCw2ICsyMjQsNyBAQAogZW5kaWYKIAogS0NPTkZJR19DT05GSUcJPz0gLmNvbmZpZworZXhwb3J0IEtDT05GSUdfQ09ORklHCiAKICMgU0hFTEwgdXNlZCBieSBrYnVpbGQKIENPTkZJR19TSEVMTCA6PSAkKHNoZWxsIGlmIFsgLXggIiQkQkFTSCIgXTsgdGhlbiBlY2hvICQkQkFTSDsgXApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy91ODUwMF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL3U4NTAwX2RlZmNvbmZpZwppbmRleCBiZTgwZjAzLi41MmQ4NmM0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL3U4NTAwX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL3U4NTAwX2RlZmNvbmZpZwpAQCAtOSw2ICs5LDEwIEBACiAjIENPTkZJR19MQkRBRiBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9VODUwMD15CitDT05GSUdfVVg1MDBfU09DX0RCNTUwMD15CitDT05GSUdfVVg1MDBfU09DX0RCODUwMD15CitDT05GSUdfTUFDSF9VODUwMD15CitDT05GSUdfTUFDSF9VNTUwMD15CiBDT05GSUdfU01QPXkKIENPTkZJR19OUl9DUFVTPTIKIENPTkZJR19QUkVFTVBUPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLW1zbS9LY29uZmlnCmluZGV4IGZhZTkzMWEuLjVkM2Q5YWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vS2NvbmZpZwpAQCAtNDAsMTEgKzQwLDEzIEBACiAJYm9vbCAiTVNNOFg2MCIKIAlzZWxlY3QgTUFDSF9NU004WDYwX1NVUkYgaWYgKCFNQUNIX01TTThYNjBfUlVNSTMgJiYgIU1BQ0hfTVNNOFg2MF9TSU0gXAogCQkJCSAgJiYgIU1BQ0hfTVNNOFg2MF9GRkEpCisJc2VsZWN0IEFSQ0hfTVNNX1NDT1JQSU9OTVAKIAlzZWxlY3QgQVJNX0dJQwogCXNlbGVjdCBDUFVfVjcKIAlzZWxlY3QgTVNNX1YyX1RMTU0KIAlzZWxlY3QgTVNNX0dQSU9NVVgKIAlzZWxlY3QgSU9NTVVfQVBJCisJc2VsZWN0IE1TTV9TQ00gaWYgU01QCiAKIGVuZGNob2ljZQogCkBAIC0xNzIsNCArMTc0LDcgQEAKIAogY29uZmlnIElPTU1VX0FQSQogCWJvb2wKKworY29uZmlnIE1TTV9TQ00KKwlib29sCiBlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLW1zbS9NYWtlZmlsZQppbmRleCA1OTY0NmJiLi45NDE5NWMxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLW1zbS9NYWtlZmlsZQpAQCAtMTgsNiArMTgsMTAgQEAKIG9iai0kKENPTkZJR19BUkNIX1FTRDhYNTApICs9IHNpcmMubwogb2JqLSQoQ09ORklHX01TTV9TTUQpICs9IHNtZC5vIHNtZF9kZWJ1Zy5vCiBvYmotJChDT05GSUdfTVNNX1NNRCkgKz0gbGFzdF9yYWRpb19sb2cubworb2JqLSQoQ09ORklHX01TTV9TQ00pICs9IHNjbS5vIHNjbS1ib290Lm8KKworb2JqLSQoQ09ORklHX0hPVFBMVUdfQ1BVKSArPSBob3RwbHVnLm8KK29iai0kKENPTkZJR19TTVApICs9IGhlYWRzbXAubyBwbGF0c21wLm8KIAogb2JqLSQoQ09ORklHX01BQ0hfVFJPVVQpICs9IGJvYXJkLXRyb3V0Lm8gYm9hcmQtdHJvdXQtZ3Bpby5vIGJvYXJkLXRyb3V0LW1tYy5vIGRldmljZXMtbXNtN3gwMC5vCiBvYmotJChDT05GSUdfTUFDSF9UUk9VVCkgKz0gYm9hcmQtdHJvdXQubyBib2FyZC10cm91dC1ncGlvLm8gYm9hcmQtdHJvdXQtbW1jLm8gYm9hcmQtdHJvdXQtcGFuZWwubyBkZXZpY2VzLW1zbTd4MDAubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vaGVhZHNtcC5TIGIvYXJjaC9hcm0vbWFjaC1tc20vaGVhZHNtcC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYzIxNDMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW1zbS9oZWFkc21wLlMKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2hlYWRzbXAuUworICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDMgQVJNIExpbWl0ZWQKKyAqICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKwlfX0lOSVQKKworLyoKKyAqIE1TTSBzcGVjaWZpYyBlbnRyeSBwb2ludCBmb3Igc2Vjb25kYXJ5IENQVXMuICBUaGlzIHByb3ZpZGVzCisgKiBhICJob2xkaW5nIHBlbiIgaW50byB3aGljaCBhbGwgc2Vjb25kYXJ5IGNvcmVzIGFyZSBoZWxkIHVudGlsIHdlJ3JlCisgKiByZWFkeSBmb3IgdGhlbSB0byBpbml0aWFsaXNlLgorICovCitFTlRSWShtc21fc2Vjb25kYXJ5X3N0YXJ0dXApCisJbXJjCXAxNSwgMCwgcjAsIGMwLCBjMCwgNQorCWFuZAlyMCwgcjAsICMxNQorCWFkcglyNCwgMWYKKwlsZG1pYQlyNCwge3I1LCByNn0KKwlzdWIJcjQsIHI0LCByNQorCWFkZAlyNiwgcjYsIHI0CitwZW46CWxkcglyNywgW3I2XQorCWNtcAlyNywgcjAKKwlibmUJcGVuCisKKwkvKgorCSAqIHdlJ3ZlIGJlZW4gcmVsZWFzZWQgZnJvbSB0aGUgaG9sZGluZyBwZW46IHNlY29uZGFyeV9zdGFjaworCSAqIHNob3VsZCBub3cgY29udGFpbiB0aGUgU1ZDIHN0YWNrIGZvciB0aGlzIGNvcmUKKwkgKi8KKwliCXNlY29uZGFyeV9zdGFydHVwCisKKwkuYWxpZ24KKzE6CS5sb25nCS4KKwkubG9uZwlwZW5fcmVsZWFzZQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vaG90cGx1Zy5jIGIvYXJjaC9hcm0vbWFjaC1tc20vaG90cGx1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMzFmNzAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW1zbS9ob3RwbHVnLmMKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgQVJNIEx0ZC4KKyAqICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisKKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorCitleHRlcm4gdm9sYXRpbGUgaW50IHBlbl9yZWxlYXNlOworCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1X2VudGVyX2xvd3Bvd2VyKHZvaWQpCit7CisJLyogSnVzdCBmbHVzaCB0aGUgY2FjaGUuIENoYW5naW5nIHRoZSBjb2hlcmVuY3kgaXMgbm90IHlldAorCSAqIGF2YWlsYWJsZSBvbiBtc20uICovCisJZmx1c2hfY2FjaGVfYWxsKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHVfbGVhdmVfbG93cG93ZXIodm9pZCkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBsYXRmb3JtX2RvX2xvd3Bvd2VyKHVuc2lnbmVkIGludCBjcHUpCit7CisJLyogSnVzdCBlbnRlciB3ZmkgZm9yIG5vdy4gVE9ETzogUHJvcGVybHkgc2h1dCBvZmYgdGhlIGNwdS4gKi8KKwlmb3IgKDs7KSB7CisJCS8qCisJCSAqIGhlcmUncyB0aGUgV0ZJCisJCSAqLworCQlhc20oIndmaSIKKwkJICAgIDoKKwkJICAgIDoKKwkJICAgIDogIm1lbW9yeSIsICJjYyIpOworCisJCWlmIChwZW5fcmVsZWFzZSA9PSBjcHUpIHsKKwkJCS8qCisJCQkgKiBPSywgcHJvcGVyIHdha2V1cCwgd2UncmUgZG9uZQorCQkJICovCisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIGdldHRpbmcgaGVyZSwgbWVhbnMgdGhhdCB3ZSBoYXZlIGNvbWUgb3V0IG9mIFdGSSB3aXRob3V0CisJCSAqIGhhdmluZyBiZWVuIHdva2VuIHVwIC0gdGhpcyBzaG91bGRuJ3QgaGFwcGVuCisJCSAqCisJCSAqIFRoZSB0cm91YmxlIGlzLCBsZXR0aW5nIHBlb3BsZSBrbm93IGFib3V0IHRoaXMgaXMgbm90IHJlYWxseQorCQkgKiBwb3NzaWJsZSwgc2luY2Ugd2UgYXJlIGN1cnJlbnRseSBydW5uaW5nIGluY29oZXJlbnRseSwgYW5kCisJCSAqIHRoZXJlZm9yZSBjYW5ub3Qgc2FmZWx5IGNhbGwgcHJpbnRrKCkgb3IgYW55dGhpbmcgZWxzZQorCQkgKi8KKwkJcHJfZGVidWcoIkNQVSV1OiBzcHVyaW91cyB3YWtldXAgY2FsbFxuIiwgY3B1KTsKKwl9Cit9CisKK2ludCBwbGF0Zm9ybV9jcHVfa2lsbCh1bnNpZ25lZCBpbnQgY3B1KQoreworCXJldHVybiAxOworfQorCisvKgorICogcGxhdGZvcm0tc3BlY2lmaWMgY29kZSB0byBzaHV0ZG93biBhIENQVQorICoKKyAqIENhbGxlZCB3aXRoIElSUXMgZGlzYWJsZWQKKyAqLwordm9pZCBwbGF0Zm9ybV9jcHVfZGllKHVuc2lnbmVkIGludCBjcHUpCit7CisJLyoKKwkgKiB3ZSdyZSByZWFkeSBmb3Igc2h1dGRvd24gbm93LCBzbyBkbyBpdAorCSAqLworCWNwdV9lbnRlcl9sb3dwb3dlcigpOworCXBsYXRmb3JtX2RvX2xvd3Bvd2VyKGNwdSk7CisKKwkvKgorCSAqIGJyaW5nIHRoaXMgQ1BVIGJhY2sgaW50byB0aGUgd29ybGQgb2YgY2FjaGUKKwkgKiBjb2hlcmVuY3ksIGFuZCB0aGVuIHJlc3RvcmUgaW50ZXJydXB0cworCSAqLworCWNwdV9sZWF2ZV9sb3dwb3dlcigpOworfQorCitpbnQgcGxhdGZvcm1fY3B1X2Rpc2FibGUodW5zaWduZWQgaW50IGNwdSkKK3sKKwkvKgorCSAqIHdlIGRvbid0IGFsbG93IENQVSAwIHRvIGJlIHNodXRkb3duIChpdCBpcyBzdGlsbCB0b28gc3BlY2lhbAorCSAqIGUuZy4gY2xvY2sgdGljayBpbnRlcnJ1cHRzKQorCSAqLworCXJldHVybiBjcHUgPT0gMCA/IC1FUEVSTSA6IDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvbXNtX2lvbWFwLTh4NjAuaCBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9tc21faW9tYXAtOHg2MC5oCmluZGV4IDdjNDNhOWIuLmE1NGUzM2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9tc21faW9tYXAtOHg2MC5oCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9tc21faW9tYXAtOHg2MC5oCkBAIC02MCw3ICs2MCwxMSBAQAogCiAjZGVmaW5lIE1TTV9UTVJfQkFTRQkJSU9NRU0oMHhGMDIwMDAwMCkKICNkZWZpbmUgTVNNX1RNUl9QSFlTCQkweDAyMDAwMDAwCi0jZGVmaW5lIE1TTV9UTVJfU0laRQkJKFNaXzFNKQorI2RlZmluZSBNU01fVE1SX1NJWkUJCVNaXzRLCisKKyNkZWZpbmUgTVNNX1RNUjBfQkFTRQkJSU9NRU0oMHhGMDIwMTAwMCkKKyNkZWZpbmUgTVNNX1RNUjBfUEhZUwkJMHgwMjA0MDAwMAorI2RlZmluZSBNU01fVE1SMF9TSVpFCQlTWl80SwogCiAjZGVmaW5lIE1TTV9HUFRfQkFTRQkJKE1TTV9UTVJfQkFTRSArIDB4NCkKICNkZWZpbmUgTVNNX0RHVF9CQVNFCQkoTVNNX1RNUl9CQVNFICsgMHgyNCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2lvLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9pby5jCmluZGV4IGY5MTJkN2IuLjgwMGYzMjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2lvLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vaW8uYwpAQCAtMTA1LDYgKzEwNSw3IEBACiAJTVNNX0RFVklDRShRR0lDX0RJU1QpLAogCU1TTV9ERVZJQ0UoUUdJQ19DUFUpLAogCU1TTV9ERVZJQ0UoVE1SKSwKKwlNU01fREVWSUNFKFRNUjApLAogCU1TTV9ERVZJQ0UoQUNDKSwKIAlNU01fREVWSUNFKEdDQyksCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vcGxhdHNtcC5jIGIvYXJjaC9hcm0vbWFjaC1tc20vcGxhdHNtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNDI3YmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW1zbS9wbGF0c21wLmMKQEAgLTAsMCArMSwxNjYgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDAyIEFSTSBMdGQuCisgKiAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogIENvcHlyaWdodCAoYykgMjAxMCwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9naWMuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKKyNpbmNsdWRlIDxtYWNoL21zbV9pb21hcC5oPgorCisjaW5jbHVkZSAic2NtLWJvb3QuaCIKKworI2RlZmluZSBWRERfU0MxX0FSUkFZX0NMQU1QX0dGU19DVEwgMHgxNUEwCisjZGVmaW5lIFNDU1NfQ1BVMUNPUkVfUkVTRVQgMHhEODAKKyNkZWZpbmUgU0NTU19EQkdfU1RBVFVTX0NPUkVfUFdSRFVQIDB4RTY0CisKKy8qIE1hc2sgZm9yIGVkZ2UgdHJpZ2dlciBQUElzIGV4Y2VwdCBBVlNfU1ZJQ0lOVCBhbmQgQVZTX1NWSUNJTlRTV0RPTkUgKi8KKyNkZWZpbmUgR0lDX1BQSV9FREdFX01BU0sgMHhGRkZGRDdGRgorCitleHRlcm4gdm9pZCBtc21fc2Vjb25kYXJ5X3N0YXJ0dXAodm9pZCk7CisvKgorICogY29udHJvbCBmb3Igd2hpY2ggY29yZSBpcyB0aGUgbmV4dCB0byBjb21lIG91dCBvZiB0aGUgc2Vjb25kYXJ5CisgKiBib290ICJob2xkaW5nIHBlbiIuCisgKi8KK3ZvbGF0aWxlIGludCBwZW5fcmVsZWFzZSA9IC0xOworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGJvb3RfbG9jayk7CisKK3ZvaWQgX19jcHVpbml0IHBsYXRmb3JtX3NlY29uZGFyeV9pbml0KHVuc2lnbmVkIGludCBjcHUpCit7CisJLyogQ29uZmlndXJlIGVkZ2UtdHJpZ2dlcmVkIFBQSXMgKi8KKwl3cml0ZWwoR0lDX1BQSV9FREdFX01BU0ssIE1TTV9RR0lDX0RJU1RfQkFTRSArIEdJQ19ESVNUX0NPTkZJRyArIDQpOworCisJLyoKKwkgKiBpZiBhbnkgaW50ZXJydXB0cyBhcmUgYWxyZWFkeSBlbmFibGVkIGZvciB0aGUgcHJpbWFyeQorCSAqIGNvcmUgKGUuZy4gdGltZXIgaXJxKSwgdGhlbiB0aGV5IHdpbGwgbm90IGhhdmUgYmVlbiBlbmFibGVkCisJICogZm9yIHVzOiBkbyBzbworCSAqLworCWdpY19zZWNvbmRhcnlfaW5pdCgwKTsKKworCS8qCisJICogbGV0IHRoZSBwcmltYXJ5IHByb2Nlc3NvciBrbm93IHdlJ3JlIG91dCBvZiB0aGUKKwkgKiBwZW4sIHRoZW4gaGVhZCBvZmYgaW50byB0aGUgQyBlbnRyeSBwb2ludAorCSAqLworCXBlbl9yZWxlYXNlID0gLTE7CisJc21wX3dtYigpOworCisJLyoKKwkgKiBTeW5jaHJvbmlzZSB3aXRoIHRoZSBib290IHRocmVhZC4KKwkgKi8KKwlzcGluX2xvY2soJmJvb3RfbG9jayk7CisJc3Bpbl91bmxvY2soJmJvb3RfbG9jayk7Cit9CisKK3N0YXRpYyBfX2NwdWluaXQgdm9pZCBwcmVwYXJlX2NvbGRfY3B1KHVuc2lnbmVkIGludCBjcHUpCit7CisJaW50IHJldDsKKwlyZXQgPSBzY21fc2V0X2Jvb3RfYWRkcih2aXJ0X3RvX3BoeXMobXNtX3NlY29uZGFyeV9zdGFydHVwKSwKKwkJCQlTQ01fRkxBR19DT0xEQk9PVF9DUFUxKTsKKwlpZiAocmV0ID09IDApIHsKKwkJdm9pZCAqc2MxX2Jhc2VfcHRyOworCQlzYzFfYmFzZV9wdHIgPSBpb3JlbWFwX25vY2FjaGUoMHgwMDkwMjAwMCwgU1pfNEsqMik7CisJCWlmIChzYzFfYmFzZV9wdHIpIHsKKwkJCXdyaXRlbCgwLCBzYzFfYmFzZV9wdHIgKyBWRERfU0MxX0FSUkFZX0NMQU1QX0dGU19DVEwpOworCQkJd3JpdGVsKDAsIHNjMV9iYXNlX3B0ciArIFNDU1NfQ1BVMUNPUkVfUkVTRVQpOworCQkJd3JpdGVsKDMsIHNjMV9iYXNlX3B0ciArIFNDU1NfREJHX1NUQVRVU19DT1JFX1BXUkRVUCk7CisJCQlpb3VubWFwKHNjMV9iYXNlX3B0cik7CisJCX0KKwl9IGVsc2UKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkZhaWxlZCB0byBzZXQgc2Vjb25kYXJ5IGNvcmUgYm9vdCAiCisJCQkJICAiYWRkcmVzc1xuIik7Cit9CisKK2ludCBfX2NwdWluaXQgYm9vdF9zZWNvbmRhcnkodW5zaWduZWQgaW50IGNwdSwgc3RydWN0IHRhc2tfc3RydWN0ICppZGxlKQoreworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwlzdGF0aWMgaW50IGNvbGRfYm9vdF9kb25lOworCisJLyogT25seSBuZWVkIHRvIGJyaW5nIGNwdSBvdXQgb2YgcmVzZXQgdGhpcyB3YXkgb25jZSAqLworCWlmIChjb2xkX2Jvb3RfZG9uZSA9PSBmYWxzZSkgeworCQlwcmVwYXJlX2NvbGRfY3B1KGNwdSk7CisJCWNvbGRfYm9vdF9kb25lID0gdHJ1ZTsKKwl9CisKKwkvKgorCSAqIHNldCBzeW5jaHJvbmlzYXRpb24gc3RhdGUgYmV0d2VlbiB0aGlzIGJvb3QgcHJvY2Vzc29yCisJICogYW5kIHRoZSBzZWNvbmRhcnkgb25lCisJICovCisJc3Bpbl9sb2NrKCZib290X2xvY2spOworCisJLyoKKwkgKiBUaGUgc2Vjb25kYXJ5IHByb2Nlc3NvciBpcyB3YWl0aW5nIHRvIGJlIHJlbGVhc2VkIGZyb20KKwkgKiB0aGUgaG9sZGluZyBwZW4gLSByZWxlYXNlIGl0LCB0aGVuIHdhaXQgZm9yIGl0IHRvIGZsYWcKKwkgKiB0aGF0IGl0IGhhcyBiZWVuIHJlbGVhc2VkIGJ5IHJlc2V0dGluZyBwZW5fcmVsZWFzZS4KKwkgKgorCSAqIE5vdGUgdGhhdCAicGVuX3JlbGVhc2UiIGlzIHRoZSBoYXJkd2FyZSBDUFUgSUQsIHdoZXJlYXMKKwkgKiAiY3B1IiBpcyBMaW51eCdzIGludGVybmFsIElELgorCSAqLworCXBlbl9yZWxlYXNlID0gY3B1OworCV9fY3B1Y19mbHVzaF9kY2FjaGVfYXJlYSgodm9pZCAqKSZwZW5fcmVsZWFzZSwgc2l6ZW9mKHBlbl9yZWxlYXNlKSk7CisJb3V0ZXJfY2xlYW5fcmFuZ2UoX19wYSgmcGVuX3JlbGVhc2UpLCBfX3BhKCZwZW5fcmVsZWFzZSArIDEpKTsKKworCS8qCisJICogU2VuZCB0aGUgc2Vjb25kYXJ5IENQVSBhIHNvZnQgaW50ZXJydXB0LCB0aGVyZWJ5IGNhdXNpbmcKKwkgKiB0aGUgYm9vdCBtb25pdG9yIHRvIHJlYWQgdGhlIHN5c3RlbSB3aWRlIGZsYWdzIHJlZ2lzdGVyLAorCSAqIGFuZCBicmFuY2ggdG8gdGhlIGFkZHJlc3MgZm91bmQgdGhlcmUuCisJICovCisJc21wX2Nyb3NzX2NhbGwoY3B1bWFza19vZihjcHUpLCAxKTsKKworCXRpbWVvdXQgPSBqaWZmaWVzICsgKDEgKiBIWik7CisJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCXNtcF9ybWIoKTsKKwkJaWYgKHBlbl9yZWxlYXNlID09IC0xKQorCQkJYnJlYWs7CisKKwkJdWRlbGF5KDEwKTsKKwl9CisKKwkvKgorCSAqIG5vdyB0aGUgc2Vjb25kYXJ5IGNvcmUgaXMgc3RhcnRpbmcgdXAgbGV0IGl0IHJ1biBpdHMKKwkgKiBjYWxpYnJhdGlvbnMsIHRoZW4gd2FpdCBmb3IgaXQgdG8gZmluaXNoCisJICovCisJc3Bpbl91bmxvY2soJmJvb3RfbG9jayk7CisKKwlyZXR1cm4gcGVuX3JlbGVhc2UgIT0gLTEgPyAtRU5PU1lTIDogMDsKK30KKworLyoKKyAqIEluaXRpYWxpc2UgdGhlIENQVSBwb3NzaWJsZSBtYXAgZWFybHkgLSB0aGlzIGRlc2NyaWJlcyB0aGUgQ1BVcworICogd2hpY2ggbWF5IGJlIHByZXNlbnQgb3IgYmVjb21lIHByZXNlbnQgaW4gdGhlIHN5c3RlbS4gVGhlIG1zbTh4NjAKKyAqIGRvZXMgbm90IHN1cHBvcnQgdGhlIEFSTSBTQ1UsIHNvIGp1c3Qgc2V0IHRoZSBwb3NzaWJsZSBjcHUgbWFzayB0bworICogTlJfQ1BVUy4KKyAqLwordm9pZCBfX2luaXQgc21wX2luaXRfY3B1cyh2b2lkKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykKKwkJc2V0X2NwdV9wb3NzaWJsZShpLCB0cnVlKTsKK30KKwordm9pZCBfX2luaXQgcGxhdGZvcm1fc21wX3ByZXBhcmVfY3B1cyh1bnNpZ25lZCBpbnQgbWF4X2NwdXMpCit7CisJaW50IGk7CisKKwkvKgorCSAqIEluaXRpYWxpc2UgdGhlIHByZXNlbnQgbWFwLCB3aGljaCBkZXNjcmliZXMgdGhlIHNldCBvZiBDUFVzCisJICogYWN0dWFsbHkgcG9wdWxhdGVkIGF0IHRoZSBwcmVzZW50IHRpbWUuCisJICovCisJZm9yIChpID0gMDsgaSA8IG1heF9jcHVzOyBpKyspCisJCXNldF9jcHVfcHJlc2VudChpLCB0cnVlKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3NjbS1ib290LmMgYi9hcmNoL2FybS9tYWNoLW1zbS9zY20tYm9vdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1Y2VlM2UKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW1zbS9zY20tYm9vdC5jCkBAIC0wLDAgKzEsMzkgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMCwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAic2NtLmgiCisjaW5jbHVkZSAic2NtLWJvb3QuaCIKKworLyoKKyAqIFNldCB0aGUgY29sZC93YXJtIGJvb3QgYWRkcmVzcyBmb3Igb25lIG9mIHRoZSBDUFUgY29yZXMuCisgKi8KK2ludCBzY21fc2V0X2Jvb3RfYWRkcihwaHlzX2FkZHJfdCBhZGRyLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgaW50IGZsYWdzOworCQlwaHlzX2FkZHJfdCAgYWRkcjsKKwl9IGNtZDsKKworCWNtZC5hZGRyID0gYWRkcjsKKwljbWQuZmxhZ3MgPSBmbGFnczsKKwlyZXR1cm4gc2NtX2NhbGwoU0NNX1NWQ19CT09ULCBTQ01fQk9PVF9BRERSLAorCQkJJmNtZCwgc2l6ZW9mKGNtZCksIE5VTEwsIDApOworfQorRVhQT1JUX1NZTUJPTChzY21fc2V0X2Jvb3RfYWRkcik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9zY20tYm9vdC5oIGIvYXJjaC9hcm0vbWFjaC1tc20vc2NtLWJvb3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGY5YjYxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vc2NtLWJvb3QuaApAQCAtMCwwICsxLDM4IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTAsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgQ29kZSBBdXJvcmEgRm9ydW0sIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisjaWZuZGVmIF9fTUFDSF9TQ01fQk9PVF9ICisjZGVmaW5lIF9fTUFDSF9TQ01fQk9PVF9ICisKKyNkZWZpbmUgU0NNX0JPT1RfQUREUgkJCTB4MQorI2RlZmluZSBTQ01fRkxBR19DT0xEQk9PVF9DUFUxCQkweDEKKyNkZWZpbmUgU0NNX0ZMQUdfV0FSTUJPT1RfQ1BVMQkJMHgyCisjZGVmaW5lIFNDTV9GTEFHX1dBUk1CT09UX0NQVTAJCTB4NAorCitpbnQgc2NtX3NldF9ib290X2FkZHIocGh5c19hZGRyX3QgYWRkciwgaW50IGZsYWdzKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9zY20uYyBiL2FyY2gvYXJtL21hY2gtbXNtL3NjbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YjliYzkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW1zbS9zY20uYwpAQCAtMCwwICsxLDI4NyBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEwLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisKKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorCisjaW5jbHVkZSAic2NtLmgiCisKKy8qIENhY2hlIGxpbmUgc2l6ZSBmb3IgbXNtOHg2MCAqLworI2RlZmluZSBDQUNIRUxJTkVTSVpFIDMyCisKKyNkZWZpbmUgU0NNX0VOT01FTQkJLTUKKyNkZWZpbmUgU0NNX0VPUE5PVFNVUFAJCS00CisjZGVmaW5lIFNDTV9FSU5WQUxfQUREUgkJLTMKKyNkZWZpbmUgU0NNX0VJTlZBTF9BUkcJCS0yCisjZGVmaW5lIFNDTV9FUlJPUgkJLTEKKyNkZWZpbmUgU0NNX0lOVEVSUlVQVEVECQkxCisKK3N0YXRpYyBERUZJTkVfTVVURVgoc2NtX2xvY2spOworCisvKioKKyAqIHN0cnVjdCBzY21fY29tbWFuZCAtIG9uZSBTQ00gY29tbWFuZCBidWZmZXIKKyAqIEBsZW46IHRvdGFsIGF2YWlsYWJsZSBtZW1vcnkgZm9yIGNvbW1hbmQgYW5kIHJlc3BvbnNlCisgKiBAYnVmX29mZnNldDogc3RhcnQgb2YgY29tbWFuZCBidWZmZXIKKyAqIEByZXNwX2hkcl9vZmZzZXQ6IHN0YXJ0IG9mIHJlc3BvbnNlIGJ1ZmZlcgorICogQGlkOiBjb21tYW5kIHRvIGJlIGV4ZWN1dGVkCisgKiBAYnVmOiBidWZmZXIgcmV0dXJuZWQgZnJvbSBzY21fZ2V0X2NvbW1hbmRfYnVmZmVyKCkKKyAqCisgKiBBbiBTQ00gY29tbWFuZCBpcyBsYXllZCBvdXQgaW4gbWVtb3J5IGFzIGZvbGxvd3M6CisgKgorICoJLS0tLS0tLS0tLS0tLS0tLS0tLSA8LS0tIHN0cnVjdCBzY21fY29tbWFuZAorICoJfCBjb21tYW5kIGhlYWRlciAgfAorICoJLS0tLS0tLS0tLS0tLS0tLS0tLSA8LS0tIHNjbV9nZXRfY29tbWFuZF9idWZmZXIoKQorICoJfCBjb21tYW5kIGJ1ZmZlciAgfAorICoJLS0tLS0tLS0tLS0tLS0tLS0tLSA8LS0tIHN0cnVjdCBzY21fcmVzcG9uc2UgYW5kCisgKgl8IHJlc3BvbnNlIGhlYWRlciB8ICAgICAgc2NtX2NvbW1hbmRfdG9fcmVzcG9uc2UoKQorICoJLS0tLS0tLS0tLS0tLS0tLS0tLSA8LS0tIHNjbV9nZXRfcmVzcG9uc2VfYnVmZmVyKCkKKyAqCXwgcmVzcG9uc2UgYnVmZmVyIHwKKyAqCS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBUaGVyZSBjYW4gYmUgYXJiaXRyYXJ5IHBhZGRpbmcgYmV0d2VlbiB0aGUgaGVhZGVycyBhbmQgYnVmZmVycyBzbworICogeW91IHNob3VsZCBhbHdheXMgdXNlIHRoZSBhcHByb3ByaWF0ZSBzY21fZ2V0XypfYnVmZmVyKCkgcm91dGluZXMKKyAqIHRvIGFjY2VzcyB0aGUgYnVmZmVycyBpbiBhIHNhZmUgbWFubmVyLgorICovCitzdHJ1Y3Qgc2NtX2NvbW1hbmQgeworCXUzMglsZW47CisJdTMyCWJ1Zl9vZmZzZXQ7CisJdTMyCXJlc3BfaGRyX29mZnNldDsKKwl1MzIJaWQ7CisJdTMyCWJ1ZlswXTsKK307CisKKy8qKgorICogc3RydWN0IHNjbV9yZXNwb25zZSAtIG9uZSBTQ00gcmVzcG9uc2UgYnVmZmVyCisgKiBAbGVuOiB0b3RhbCBhdmFpbGFibGUgbWVtb3J5IGZvciByZXNwb25zZQorICogQGJ1Zl9vZmZzZXQ6IHN0YXJ0IG9mIHJlc3BvbnNlIGRhdGEgcmVsYXRpdmUgdG8gc3RhcnQgb2Ygc2NtX3Jlc3BvbnNlCisgKiBAaXNfY29tcGxldGU6IGluZGljYXRlcyBpZiB0aGUgY29tbWFuZCBoYXMgZmluaXNoZWQgcHJvY2Vzc2luZworICovCitzdHJ1Y3Qgc2NtX3Jlc3BvbnNlIHsKKwl1MzIJbGVuOworCXUzMglidWZfb2Zmc2V0OworCXUzMglpc19jb21wbGV0ZTsKK307CisKKy8qKgorICogYWxsb2Nfc2NtX2NvbW1hbmQoKSAtIEFsbG9jYXRlIGFuIFNDTSBjb21tYW5kCisgKiBAY21kX3NpemU6IHNpemUgb2YgdGhlIGNvbW1hbmQgYnVmZmVyCisgKiBAcmVzcF9zaXplOiBzaXplIG9mIHRoZSByZXNwb25zZSBidWZmZXIKKyAqCisgKiBBbGxvY2F0ZSBhbiBTQ00gY29tbWFuZCwgaW5jbHVkaW5nIGVub3VnaCByb29tIGZvciB0aGUgY29tbWFuZAorICogYW5kIHJlc3BvbnNlIGhlYWRlcnMgYXMgd2VsbCBhcyB0aGUgY29tbWFuZCBhbmQgcmVzcG9uc2UgYnVmZmVycy4KKyAqCisgKiBSZXR1cm5zIGEgdmFsaWQgJnNjbV9jb21tYW5kIG9uIHN1Y2Nlc3Mgb3IgJU5VTEwgaWYgdGhlIGFsbG9jYXRpb24gZmFpbHMuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2NtX2NvbW1hbmQgKmFsbG9jX3NjbV9jb21tYW5kKHNpemVfdCBjbWRfc2l6ZSwgc2l6ZV90IHJlc3Bfc2l6ZSkKK3sKKwlzdHJ1Y3Qgc2NtX2NvbW1hbmQgKmNtZDsKKwlzaXplX3QgbGVuID0gc2l6ZW9mKCpjbWQpICsgc2l6ZW9mKHN0cnVjdCBzY21fcmVzcG9uc2UpICsgY21kX3NpemUgKworCQlyZXNwX3NpemU7CisKKwljbWQgPSBremFsbG9jKFBBR0VfQUxJR04obGVuKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNtZCkgeworCQljbWQtPmxlbiA9IGxlbjsKKwkJY21kLT5idWZfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHNjbV9jb21tYW5kLCBidWYpOworCQljbWQtPnJlc3BfaGRyX29mZnNldCA9IGNtZC0+YnVmX29mZnNldCArIGNtZF9zaXplOworCX0KKwlyZXR1cm4gY21kOworfQorCisvKioKKyAqIGZyZWVfc2NtX2NvbW1hbmQoKSAtIEZyZWUgYW4gU0NNIGNvbW1hbmQKKyAqIEBjbWQ6IGNvbW1hbmQgdG8gZnJlZQorICoKKyAqIEZyZWUgYW4gU0NNIGNvbW1hbmQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX3NjbV9jb21tYW5kKHN0cnVjdCBzY21fY29tbWFuZCAqY21kKQoreworCWtmcmVlKGNtZCk7Cit9CisKKy8qKgorICogc2NtX2NvbW1hbmRfdG9fcmVzcG9uc2UoKSAtIEdldCBhIHBvaW50ZXIgdG8gYSBzY21fcmVzcG9uc2UKKyAqIEBjbWQ6IGNvbW1hbmQKKyAqCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byBhIHJlc3BvbnNlIGZvciBhIGNvbW1hbmQuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNjbV9yZXNwb25zZSAqc2NtX2NvbW1hbmRfdG9fcmVzcG9uc2UoCisJCWNvbnN0IHN0cnVjdCBzY21fY29tbWFuZCAqY21kKQoreworCXJldHVybiAodm9pZCAqKWNtZCArIGNtZC0+cmVzcF9oZHJfb2Zmc2V0OworfQorCisvKioKKyAqIHNjbV9nZXRfY29tbWFuZF9idWZmZXIoKSAtIEdldCBhIHBvaW50ZXIgdG8gYSBjb21tYW5kIGJ1ZmZlcgorICogQGNtZDogY29tbWFuZAorICoKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBjb21tYW5kIGJ1ZmZlciBvZiBhIGNvbW1hbmQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqc2NtX2dldF9jb21tYW5kX2J1ZmZlcihjb25zdCBzdHJ1Y3Qgc2NtX2NvbW1hbmQgKmNtZCkKK3sKKwlyZXR1cm4gKHZvaWQgKiljbWQtPmJ1ZjsKK30KKworLyoqCisgKiBzY21fZ2V0X3Jlc3BvbnNlX2J1ZmZlcigpIC0gR2V0IGEgcG9pbnRlciB0byBhIHJlc3BvbnNlIGJ1ZmZlcgorICogQHJzcDogcmVzcG9uc2UKKyAqCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byBhIHJlc3BvbnNlIGJ1ZmZlciBvZiBhIHJlc3BvbnNlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgKnNjbV9nZXRfcmVzcG9uc2VfYnVmZmVyKGNvbnN0IHN0cnVjdCBzY21fcmVzcG9uc2UgKnJzcCkKK3sKKwlyZXR1cm4gKHZvaWQgKilyc3AgKyByc3AtPmJ1Zl9vZmZzZXQ7Cit9CisKK3N0YXRpYyBpbnQgc2NtX3JlbWFwX2Vycm9yKGludCBlcnIpCit7CisJc3dpdGNoIChlcnIpIHsKKwljYXNlIFNDTV9FUlJPUjoKKwkJcmV0dXJuIC1FSU87CisJY2FzZSBTQ01fRUlOVkFMX0FERFI6CisJY2FzZSBTQ01fRUlOVkFMX0FSRzoKKwkJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSBTQ01fRU9QTk9UU1VQUDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCWNhc2UgU0NNX0VOT01FTToKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgdTMyIHNtYyh1MzIgY21kX2FkZHIpCit7CisJaW50IGNvbnRleHRfaWQ7CisJcmVnaXN0ZXIgdTMyIHIwIGFzbSgicjAiKSA9IDE7CisJcmVnaXN0ZXIgdTMyIHIxIGFzbSgicjEiKSA9ICh1MzIpJmNvbnRleHRfaWQ7CisJcmVnaXN0ZXIgdTMyIHIyIGFzbSgicjIiKSA9IGNtZF9hZGRyOworCWFzbSgKKwkJX19hc21lcSgiJTAiLCAicjAiKQorCQlfX2FzbWVxKCIlMSIsICJyMCIpCisJCV9fYXNtZXEoIiUyIiwgInIxIikKKwkJX19hc21lcSgiJTMiLCAicjIiKQorCQkic21jCSMwCUAgc3dpdGNoIHRvIHNlY3VyZSB3b3JsZFxuIgorCQk6ICI9ciIgKHIwKQorCQk6ICJyIiAocjApLCAiciIgKHIxKSwgInIiIChyMikKKwkJOiAicjMiKTsKKwlyZXR1cm4gcjA7Cit9CisKK3N0YXRpYyBpbnQgX19zY21fY2FsbChjb25zdCBzdHJ1Y3Qgc2NtX2NvbW1hbmQgKmNtZCkKK3sKKwlpbnQgcmV0OworCXUzMiBjbWRfYWRkciA9IHZpcnRfdG9fcGh5cyhjbWQpOworCisJLyoKKwkgKiBGbHVzaCB0aGUgZW50aXJlIGNhY2hlIGhlcmUgc28gY2FsbGVycyBkb24ndCBoYXZlIHRvIHJlbWVtYmVyCisJICogdG8gZmx1c2ggdGhlIGNhY2hlIHdoZW4gcGFzc2luZyBwaHlzaWNhbCBhZGRyZXNzZXMgdG8gdGhlIHNlY3VyZQorCSAqIHNpZGUgaW4gdGhlIGJ1ZmZlci4KKwkgKi8KKwlmbHVzaF9jYWNoZV9hbGwoKTsKKwlkbyB7CisJCXJldCA9IHNtYyhjbWRfYWRkcik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlyZXQgPSBzY21fcmVtYXBfZXJyb3IocmV0KTsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAocmV0ID09IFNDTV9JTlRFUlJVUFRFRCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHNjbV9jYWxsKCkgLSBTZW5kIGFuIFNDTSBjb21tYW5kCisgKiBAc3ZjX2lkOiBzZXJ2aWNlIGlkZW50aWZpZXIKKyAqIEBjbWRfaWQ6IGNvbW1hbmQgaWRlbnRpZmllcgorICogQGNtZF9idWY6IGNvbW1hbmQgYnVmZmVyCisgKiBAY21kX2xlbjogbGVuZ3RoIG9mIHRoZSBjb21tYW5kIGJ1ZmZlcgorICogQHJlc3BfYnVmOiByZXNwb25zZSBidWZmZXIKKyAqIEByZXNwX2xlbjogbGVuZ3RoIG9mIHRoZSByZXNwb25zZSBidWZmZXIKKyAqCisgKiBTZW5kcyBhIGNvbW1hbmQgdG8gdGhlIFNDTSBhbmQgd2FpdHMgZm9yIHRoZSBjb21tYW5kIHRvIGZpbmlzaCBwcm9jZXNzaW5nLgorICovCitpbnQgc2NtX2NhbGwodTMyIHN2Y19pZCwgdTMyIGNtZF9pZCwgY29uc3Qgdm9pZCAqY21kX2J1Ziwgc2l6ZV90IGNtZF9sZW4sCisJCXZvaWQgKnJlc3BfYnVmLCBzaXplX3QgcmVzcF9sZW4pCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc2NtX2NvbW1hbmQgKmNtZDsKKwlzdHJ1Y3Qgc2NtX3Jlc3BvbnNlICpyc3A7CisKKwljbWQgPSBhbGxvY19zY21fY29tbWFuZChjbWRfbGVuLCByZXNwX2xlbik7CisJaWYgKCFjbWQpCisJCXJldHVybiAtRU5PTUVNOworCisJY21kLT5pZCA9IChzdmNfaWQgPDwgMTApIHwgY21kX2lkOworCWlmIChjbWRfYnVmKQorCQltZW1jcHkoc2NtX2dldF9jb21tYW5kX2J1ZmZlcihjbWQpLCBjbWRfYnVmLCBjbWRfbGVuKTsKKworCW11dGV4X2xvY2soJnNjbV9sb2NrKTsKKwlyZXQgPSBfX3NjbV9jYWxsKGNtZCk7CisJbXV0ZXhfdW5sb2NrKCZzY21fbG9jayk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyc3AgPSBzY21fY29tbWFuZF90b19yZXNwb25zZShjbWQpOworCWRvIHsKKwkJdTMyIHN0YXJ0ID0gKHUzMilyc3A7CisJCXUzMiBlbmQgPSAodTMyKXNjbV9nZXRfcmVzcG9uc2VfYnVmZmVyKHJzcCkgKyByZXNwX2xlbjsKKwkJc3RhcnQgJj0gfihDQUNIRUxJTkVTSVpFIC0gMSk7CisJCXdoaWxlIChzdGFydCA8IGVuZCkgeworCQkJYXNtICgibWNyIHAxNSwgMCwgJTAsIGM3LCBjNiwgMSIgOiA6ICJyIiAoc3RhcnQpCisJCQkgICAgIDogIm1lbW9yeSIpOworCQkJc3RhcnQgKz0gQ0FDSEVMSU5FU0laRTsKKwkJfQorCX0gd2hpbGUgKCFyc3AtPmlzX2NvbXBsZXRlKTsKKworCWlmIChyZXNwX2J1ZikKKwkJbWVtY3B5KHJlc3BfYnVmLCBzY21fZ2V0X3Jlc3BvbnNlX2J1ZmZlcihyc3ApLCByZXNwX2xlbik7CitvdXQ6CisJZnJlZV9zY21fY29tbWFuZChjbWQpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHNjbV9jYWxsKTsKKwordTMyIHNjbV9nZXRfdmVyc2lvbih2b2lkKQoreworCWludCBjb250ZXh0X2lkOworCXN0YXRpYyB1MzIgdmVyc2lvbiA9IC0xOworCXJlZ2lzdGVyIHUzMiByMCBhc20oInIwIikgPSAweDEgPDwgODsKKwlyZWdpc3RlciB1MzIgcjEgYXNtKCJyMSIpID0gKHUzMikmY29udGV4dF9pZDsKKworCWlmICh2ZXJzaW9uICE9IC0xKQorCQlyZXR1cm4gdmVyc2lvbjsKKworCW11dGV4X2xvY2soJnNjbV9sb2NrKTsKKwlhc20oCisJCV9fYXNtZXEoIiUwIiwgInIxIikKKwkJX19hc21lcSgiJTEiLCAicjAiKQorCQlfX2FzbWVxKCIlMiIsICJyMSIpCisJCSJzbWMJIzAJQCBzd2l0Y2ggdG8gc2VjdXJlIHdvcmxkXG4iCisJCTogIj1yIiAocjEpCisJCTogInIiIChyMCksICJyIiAocjEpCisJCTogInIyIiwgInIzIik7CisJdmVyc2lvbiA9IHIxOworCW11dGV4X3VubG9jaygmc2NtX2xvY2spOworCisJcmV0dXJuIHZlcnNpb247Cit9CitFWFBPUlRfU1lNQk9MKHNjbV9nZXRfdmVyc2lvbik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9zY20uaCBiL2FyY2gvYXJtL21hY2gtbXNtL3NjbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MTc4NmIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW1zbS9zY20uaApAQCAtMCwwICsxLDQxIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTAsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgQ29kZSBBdXJvcmEgRm9ydW0sIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisjaWZuZGVmIF9fTUFDSF9TQ01fSAorI2RlZmluZSBfX01BQ0hfU0NNX0gKKworI2RlZmluZSBTQ01fU1ZDX0JPT1QJCQkweDEKKyNkZWZpbmUgU0NNX1NWQ19QSUwJCQkweDIKKworZXh0ZXJuIGludCBzY21fY2FsbCh1MzIgc3ZjX2lkLCB1MzIgY21kX2lkLCBjb25zdCB2b2lkICpjbWRfYnVmLCBzaXplX3QgY21kX2xlbiwKKwkJdm9pZCAqcmVzcF9idWYsIHNpemVfdCByZXNwX2xlbik7CisKKyNkZWZpbmUgU0NNX1ZFUlNJT04obWFqb3IsIG1pbm9yKSAoKChtYWpvcikgPDwgMTYpIHwgKChtaW5vcikgJiAweEZGKSkKKworZXh0ZXJuIHUzMiBzY21fZ2V0X3ZlcnNpb24odm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vdGltZXIuYyBiL2FyY2gvYXJtL21hY2gtbXNtL3RpbWVyLmMKaW5kZXggNTk1YmU3Zi4uYzEwNWQyOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vdGltZXIuYworKysgYi9hcmNoL2FybS9tYWNoLW1zbS90aW1lci5jCkBAIC00Nyw2ICs0NywxOSBAQAogCiAjZGVmaW5lIEdQVF9IWiAzMjc2OAogCitlbnVtIHRpbWVyX2xvY2F0aW9uIHsKKwlMT0NBTF9USU1FUiA9IDAsCisJR0xPQkFMX1RJTUVSID0gMSwKK307CisKKyNpZmRlZiBNU01fVE1SMF9CQVNFCisjZGVmaW5lIE1TTV9UTVJfR0xPQkFMCQkoTVNNX1RNUjBfQkFTRSAtIE1TTV9UTVJfQkFTRSkKKyNlbHNlCisjZGVmaW5lIE1TTV9UTVJfR0xPQkFMCQkwCisjZW5kaWYKKworI2RlZmluZSBNU01fR0xPQkFMX1RJTUVSIE1TTV9DTE9DS19ER1QKKwogI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfUVNEOFg1MCkKICNkZWZpbmUgREdUX0haICgxOTIwMDAwMCAvIDQpIC8qIDE5LjIgTUh6IC8gNCBieSBkZWZhdWx0ICovCiAjZGVmaW5lIE1TTV9ER1RfU0hJRlQgKDApCkBAIC02NSw0OSArNzgsNjcgQEAKIAl2b2lkIF9faW9tZW0gICAgICAgICAgICAgICAgKnJlZ2Jhc2U7CiAJdWludDMyX3QgICAgICAgICAgICAgICAgICAgIGZyZXE7CiAJdWludDMyX3QgICAgICAgICAgICAgICAgICAgIHNoaWZ0OworCXZvaWQgX19pb21lbSAgICAgICAgICAgICAgICAqZ2xvYmFsX2NvdW50ZXI7CisJdm9pZCBfX2lvbWVtICAgICAgICAgICAgICAgICpsb2NhbF9jb3VudGVyOwogfTsKIAorZW51bSB7CisJTVNNX0NMT0NLX0dQVCwKKwlNU01fQ0xPQ0tfREdULAorCU5SX1RJTUVSUywKK307CisKKworc3RhdGljIHN0cnVjdCBtc21fY2xvY2sgbXNtX2Nsb2Nrc1tdOworc3RhdGljIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmxvY2FsX2Nsb2NrX2V2ZW50OworCiBzdGF0aWMgaXJxcmV0dXJuX3QgbXNtX3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0ID0gZGV2X2lkOworCWlmIChzbXBfcHJvY2Vzc29yX2lkKCkgIT0gMCkKKwkJZXZ0ID0gbG9jYWxfY2xvY2tfZXZlbnQ7CisJaWYgKGV2dC0+ZXZlbnRfaGFuZGxlciA9PSBOVUxMKQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAJZXZ0LT5ldmVudF9oYW5kbGVyKGV2dCk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgY3ljbGVfdCBtc21fZ3B0X3JlYWQoc3RydWN0IGNsb2Nrc291cmNlICpjcykKK3N0YXRpYyBjeWNsZV90IG1zbV9yZWFkX3RpbWVyX2NvdW50KHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpCiB7Ci0JcmV0dXJuIHJlYWRsKE1TTV9HUFRfQkFTRSArIFRJTUVSX0NPVU5UX1ZBTCk7CisJc3RydWN0IG1zbV9jbG9jayAqY2xrID0gY29udGFpbmVyX29mKGNzLCBzdHJ1Y3QgbXNtX2Nsb2NrLCBjbG9ja3NvdXJjZSk7CisKKwlyZXR1cm4gcmVhZGwoY2xrLT5nbG9iYWxfY291bnRlcik7CiB9CiAKLXN0YXRpYyBjeWNsZV90IG1zbV9kZ3RfcmVhZChzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzKQorc3RhdGljIHN0cnVjdCBtc21fY2xvY2sgKmNsb2NrZXZlbnRfdG9fY2xvY2soc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KQogewotCXJldHVybiByZWFkbChNU01fREdUX0JBU0UgKyBUSU1FUl9DT1VOVF9WQUwpID4+IE1TTV9ER1RfU0hJRlQ7CisjaWZkZWYgQ09ORklHX1NNUAorCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBOUl9USU1FUlM7IGkrKykKKwkJaWYgKGV2dCA9PSAmKG1zbV9jbG9ja3NbaV0uY2xvY2tldmVudCkpCisJCQlyZXR1cm4gJm1zbV9jbG9ja3NbaV07CisJcmV0dXJuICZtc21fY2xvY2tzW01TTV9HTE9CQUxfVElNRVJdOworI2Vsc2UKKwlyZXR1cm4gY29udGFpbmVyX29mKGV2dCwgc3RydWN0IG1zbV9jbG9jaywgY2xvY2tldmVudCk7CisjZW5kaWYKIH0KIAogc3RhdGljIGludCBtc21fdGltZXJfc2V0X25leHRfZXZlbnQodW5zaWduZWQgbG9uZyBjeWNsZXMsCiAJCQkJICAgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKIHsKLQlzdHJ1Y3QgbXNtX2Nsb2NrICpjbG9jayA9IGNvbnRhaW5lcl9vZihldnQsIHN0cnVjdCBtc21fY2xvY2ssIGNsb2NrZXZlbnQpOwotCXVpbnQzMl90IG5vdyA9IHJlYWRsKGNsb2NrLT5yZWdiYXNlICsgVElNRVJfQ09VTlRfVkFMKTsKKwlzdHJ1Y3QgbXNtX2Nsb2NrICpjbG9jayA9IGNsb2NrZXZlbnRfdG9fY2xvY2soZXZ0KTsKKwl1aW50MzJfdCBub3cgPSByZWFkbChjbG9jay0+bG9jYWxfY291bnRlcik7CiAJdWludDMyX3QgYWxhcm0gPSBub3cgKyAoY3ljbGVzIDw8IGNsb2NrLT5zaGlmdCk7Ci0JaW50IGxhdGU7CiAKIAl3cml0ZWwoYWxhcm0sIGNsb2NrLT5yZWdiYXNlICsgVElNRVJfTUFUQ0hfVkFMKTsKLQlub3cgPSByZWFkbChjbG9jay0+cmVnYmFzZSArIFRJTUVSX0NPVU5UX1ZBTCk7Ci0JbGF0ZSA9IG5vdyAtIGFsYXJtOwotCWlmIChsYXRlID49ICgtMiA8PCBjbG9jay0+c2hpZnQpICYmIGxhdGUgPCBER1RfSFoqNSkgewotCQlwcmludGsoS0VSTl9OT1RJQ0UgIm1zbV90aW1lcl9zZXRfbmV4dF9ldmVudCglbHUpIGNsb2NrICVzLCAiCi0JCSAgICAgICAiYWxhcm0gYWxyZWFkeSBleHBpcmVkLCBub3cgJXgsIGFsYXJtICV4LCBsYXRlICVkXG4iLAotCQkgICAgICAgY3ljbGVzLCBjbG9jay0+Y2xvY2tldmVudC5uYW1lLCBub3csIGFsYXJtLCBsYXRlKTsKLQkJcmV0dXJuIC1FVElNRTsKLQl9CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIG1zbV90aW1lcl9zZXRfbW9kZShlbnVtIGNsb2NrX2V2ZW50X21vZGUgbW9kZSwKIAkJCSAgICAgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKIHsKLQlzdHJ1Y3QgbXNtX2Nsb2NrICpjbG9jayA9IGNvbnRhaW5lcl9vZihldnQsIHN0cnVjdCBtc21fY2xvY2ssIGNsb2NrZXZlbnQpOworCXN0cnVjdCBtc21fY2xvY2sgKmNsb2NrID0gY2xvY2tldmVudF90b19jbG9jayhldnQpOworCiAJc3dpdGNoIChtb2RlKSB7CiAJY2FzZSBDTE9DS19FVlRfTU9ERV9SRVNVTUU6CiAJY2FzZSBDTE9DS19FVlRfTU9ERV9QRVJJT0RJQzoKQEAgLTEyMyw3ICsxNTQsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IG1zbV9jbG9jayBtc21fY2xvY2tzW10gPSB7Ci0JeworCVtNU01fQ0xPQ0tfR1BUXSA9IHsKIAkJLmNsb2NrZXZlbnQgPSB7CiAJCQkubmFtZSAgICAgICAgICAgPSAiZ3BfdGltZXIiLAogCQkJLmZlYXR1cmVzICAgICAgID0gQ0xPQ0tfRVZUX0ZFQVRfT05FU0hPVCwKQEAgLTEzNSw3ICsxNjYsNyBAQAogCQkuY2xvY2tzb3VyY2UgPSB7CiAJCQkubmFtZSAgICAgICAgICAgPSAiZ3BfdGltZXIiLAogCQkJLnJhdGluZyAgICAgICAgID0gMjAwLAotCQkJLnJlYWQgICAgICAgICAgID0gbXNtX2dwdF9yZWFkLAorCQkJLnJlYWQgICAgICAgICAgID0gbXNtX3JlYWRfdGltZXJfY291bnQsCiAJCQkubWFzayAgICAgICAgICAgPSBDTE9DS1NPVVJDRV9NQVNLKDMyKSwKIAkJCS5mbGFncyAgICAgICAgICA9IENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTLAogCQl9LApAQCAtMTQ3LDkgKzE3OCwxMiBAQAogCQkJLmlycSAgICAgPSBJTlRfR1BfVElNRVJfRVhQCiAJCX0sCiAJCS5yZWdiYXNlID0gTVNNX0dQVF9CQVNFLAotCQkuZnJlcSA9IEdQVF9IWgorCQkuZnJlcSA9IEdQVF9IWiwKKwkJLmxvY2FsX2NvdW50ZXIgPSBNU01fR1BUX0JBU0UgKyBUSU1FUl9DT1VOVF9WQUwsCisJCS5nbG9iYWxfY291bnRlciA9IE1TTV9HUFRfQkFTRSArIFRJTUVSX0NPVU5UX1ZBTCArCisJCQlNU01fVE1SX0dMT0JBTCwKIAl9LAotCXsKKwlbTVNNX0NMT0NLX0RHVF0gPSB7CiAJCS5jbG9ja2V2ZW50ID0gewogCQkJLm5hbWUgICAgICAgICAgID0gImRnX3RpbWVyIiwKIAkJCS5mZWF0dXJlcyAgICAgICA9IENMT0NLX0VWVF9GRUFUX09ORVNIT1QsCkBAIC0xNjEsNyArMTk1LDcgQEAKIAkJLmNsb2Nrc291cmNlID0gewogCQkJLm5hbWUgICAgICAgICAgID0gImRnX3RpbWVyIiwKIAkJCS5yYXRpbmcgICAgICAgICA9IDMwMCwKLQkJCS5yZWFkICAgICAgICAgICA9IG1zbV9kZ3RfcmVhZCwKKwkJCS5yZWFkICAgICAgICAgICA9IG1zbV9yZWFkX3RpbWVyX2NvdW50LAogCQkJLm1hc2sgICAgICAgICAgID0gQ0xPQ0tTT1VSQ0VfTUFTSygoMzIgLSBNU01fREdUX1NISUZUKSksCiAJCQkuZmxhZ3MgICAgICAgICAgPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUywKIAkJfSwKQEAgLTE3NCw3ICsyMDgsMTAgQEAKIAkJfSwKIAkJLnJlZ2Jhc2UgPSBNU01fREdUX0JBU0UsCiAJCS5mcmVxID0gREdUX0haID4+IE1TTV9ER1RfU0hJRlQsCi0JCS5zaGlmdCA9IE1TTV9ER1RfU0hJRlQKKwkJLnNoaWZ0ID0gTVNNX0RHVF9TSElGVCwKKwkJLmxvY2FsX2NvdW50ZXIgPSBNU01fREdUX0JBU0UgKyBUSU1FUl9DT1VOVF9WQUwsCisJCS5nbG9iYWxfY291bnRlciA9IE1TTV9ER1RfQkFTRSArIFRJTUVSX0NPVU5UX1ZBTCArCisJCQlNU01fVE1SX0dMT0JBTCwKIAl9CiB9OwogCkBAIC0xODMsNyArMjIwLDcgQEAKIAlpbnQgaTsKIAlpbnQgcmVzOwogCi0jaWZkZWYgQ09ORklHX0FSQ0hfTVNNOFg2MAorI2lmZGVmIENPTkZJR19BUkNIX01TTV9TQ09SUElPTk1QCiAJd3JpdGVsKERHVF9DTEtfQ1RMX0RJVl80LCBNU01fVE1SX0JBU0UgKyBER1RfQ0xLX0NUTCk7CiAjZW5kaWYKIApAQCAtMjE3LDYgKzI1NCw0OCBAQAogCX0KIH0KIAorI2lmZGVmIENPTkZJR19TTVAKK3ZvaWQgX19jcHVpbml0IGxvY2FsX3RpbWVyX3NldHVwKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKK3sKKwlzdHJ1Y3QgbXNtX2Nsb2NrICpjbG9jayA9ICZtc21fY2xvY2tzW01TTV9HTE9CQUxfVElNRVJdOworCisJLyogVXNlIGV4aXN0aW5nIGNsb2NrX2V2ZW50IGZvciBjcHUgMCAqLworCWlmICghc21wX3Byb2Nlc3Nvcl9pZCgpKQorCQlyZXR1cm47CisKKwl3cml0ZWwoREdUX0NMS19DVExfRElWXzQsIE1TTV9UTVJfQkFTRSArIERHVF9DTEtfQ1RMKTsKKworCWlmICghbG9jYWxfY2xvY2tfZXZlbnQpIHsKKwkJd3JpdGVsKDAsIGNsb2NrLT5yZWdiYXNlICArIFRJTUVSX0VOQUJMRSk7CisJCXdyaXRlbCgwLCBjbG9jay0+cmVnYmFzZSArIFRJTUVSX0NMRUFSKTsKKwkJd3JpdGVsKH4wLCBjbG9jay0+cmVnYmFzZSArIFRJTUVSX01BVENIX1ZBTCk7CisJfQorCWV2dC0+aXJxID0gY2xvY2stPmlycS5pcnE7CisJZXZ0LT5uYW1lID0gImxvY2FsX3RpbWVyIjsKKwlldnQtPmZlYXR1cmVzID0gQ0xPQ0tfRVZUX0ZFQVRfT05FU0hPVDsKKwlldnQtPnJhdGluZyA9IGNsb2NrLT5jbG9ja2V2ZW50LnJhdGluZzsKKwlldnQtPnNldF9tb2RlID0gbXNtX3RpbWVyX3NldF9tb2RlOworCWV2dC0+c2V0X25leHRfZXZlbnQgPSBtc21fdGltZXJfc2V0X25leHRfZXZlbnQ7CisJZXZ0LT5zaGlmdCA9IGNsb2NrLT5jbG9ja2V2ZW50LnNoaWZ0OworCWV2dC0+bXVsdCA9IGRpdl9zYyhjbG9jay0+ZnJlcSwgTlNFQ19QRVJfU0VDLCBldnQtPnNoaWZ0KTsKKwlldnQtPm1heF9kZWx0YV9ucyA9CisJCWNsb2NrZXZlbnRfZGVsdGEybnMoMHhmMDAwMDAwMCA+PiBjbG9jay0+c2hpZnQsIGV2dCk7CisJZXZ0LT5taW5fZGVsdGFfbnMgPSBjbG9ja2V2ZW50X2RlbHRhMm5zKDQsIGV2dCk7CisKKwlsb2NhbF9jbG9ja19ldmVudCA9IGV2dDsKKworCWdpY19lbmFibGVfcHBpKGNsb2NrLT5pcnEuaXJxKTsKKworCWNsb2NrZXZlbnRzX3JlZ2lzdGVyX2RldmljZShldnQpOworfQorCitpbmxpbmUgaW50IGxvY2FsX3RpbWVyX2Fjayh2b2lkKQoreworCXJldHVybiAxOworfQorCisjZW5kaWYKKwogc3RydWN0IHN5c190aW1lciBtc21fdGltZXIgPSB7CiAJLmluaXQgPSBtc21fdGltZXJfaW5pdAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvS2NvbmZpZwppbmRleCAyZGQ0NGEwLi4yNDdjYWEzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXV4NTAwL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9LY29uZmlnCkBAIC03LDI4ICs3LDMwIEBACiAJc2VsZWN0IEhBU19NVFUKIAlzZWxlY3QgTk9NQURJS19HUElPCiAKLWNvbmZpZyBVWDUwMF9TT0NfREI4NTAwCi0JYm9vbAorbWVudSAiVXg1MDAgU29DIgogCiBjb25maWcgVVg1MDBfU09DX0RCNTUwMAotCWJvb2wKKwlib29sICJEQjU1MDAiCiAKLWNob2ljZQotCXByb21wdCAiVXg1MDAgdGFyZ2V0IHBsYXRmb3JtIgotCWRlZmF1bHQgTUFDSF9VODUwMF9NT1AKK2NvbmZpZyBVWDUwMF9TT0NfREI4NTAwCisJYm9vbCAiREI4NTAwIgogCi1jb25maWcgTUFDSF9VODUwMF9NT1AKK2VuZG1lbnUKKworbWVudSAiVXg1MDAgdGFyZ2V0IHBsYXRmb3JtIgorCitjb25maWcgTUFDSF9VODUwMAogCWJvb2wgIlU4NTAwIERldmVsb3BtZW50IHBsYXRmb3JtIgotCXNlbGVjdCBVWDUwMF9TT0NfREI4NTAwCisJZGVwZW5kcyBvbiBVWDUwMF9TT0NfREI4NTAwCiAJaGVscAogCSAgSW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgbW9wNTAwIGRldmVsb3BtZW50IHBsYXRmb3JtLgogCiBjb25maWcgTUFDSF9VNTUwMAogCWJvb2wgIlU1NTAwIERldmVsb3BtZW50IHBsYXRmb3JtIgotCXNlbGVjdCBVWDUwMF9TT0NfREI1NTAwCisJZGVwZW5kcyBvbiBVWDUwMF9TT0NfREI1NTAwCiAJaGVscAogCSAgSW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgVTU1MDAgZGV2ZWxvcG1lbnQgcGxhdGZvcm0uCi1lbmRjaG9pY2UKK2VuZG1lbnUKIAogY29uZmlnIFVYNTAwX0RFQlVHX1VBUlQKIAlpbnQgIlV4NTAwIFVBUlQgdG8gdXNlIGZvciBsb3ctbGV2ZWwgZGVidWciCkBAIC0zOSwxNCArNDEsMTQgQEAKIAogY29uZmlnIFU1NTAwX01PREVNX0lSUQogCWJvb2wgIk1vZGVtIElSUSBzdXBwb3J0IgotCWRlcGVuZHMgb24gTUFDSF9VNTUwMAorCWRlcGVuZHMgb24gVVg1MDBfU09DX0RCNTUwMAogCWRlZmF1bHQgeQogCWhlbHAKIAkgIEFkZCBzdXBwb3J0IGZvciBoYW5kbGluZyBJUlE6cyBmcm9tIG1vZGVtIHNpZGUKIAogY29uZmlnIFU1NTAwX01CT1gKIAlib29sICJNYWlsYm94IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBNQUNIX1U1NTAwICYmIFU1NTAwX01PREVNX0lSUQorCWRlcGVuZHMgb24gVTU1MDBfTU9ERU1fSVJRCiAJZGVmYXVsdCB5CiAJaGVscAogCSAgQWRkIHN1cHBvcnQgZm9yIFU1NTAwIG1haWxib3ggY29tbXVuaWNhdGlvbiB3aXRoIG1vZGVtIHNpZGUKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLXV4NTAwL01ha2VmaWxlCmluZGV4IDEyMDUyZTguLjUzZWJiNDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdXg1MDAvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9NYWtlZmlsZQpAQCAtMiwxMCArMiwxMSBAQAogIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IGtlcm5lbCwgVTg1MDAgbWFjaGluZS4KICMKIAotb2JqLXkJCQkJOj0gY2xvY2subyBjcHUubyBkZXZpY2VzLm8gZGV2aWNlcy1jb21tb24ubworb2JqLXkJCQkJOj0gY2xvY2subyBjcHUubyBkZXZpY2VzLm8gZGV2aWNlcy1jb21tb24ubyBcCisJCQkJICAgaWQubwogb2JqLSQoQ09ORklHX1VYNTAwX1NPQ19EQjU1MDApCSs9IGNwdS1kYjU1MDAubyBkbWEtZGI1NTAwLm8KIG9iai0kKENPTkZJR19VWDUwMF9TT0NfREI4NTAwKQkrPSBjcHUtZGI4NTAwLm8gZGV2aWNlcy1kYjg1MDAubyBwcmNtdS5vCi1vYmotJChDT05GSUdfTUFDSF9VODUwMF9NT1ApCSs9IGJvYXJkLW1vcDUwMC5vIGJvYXJkLW1vcDUwMC1zZGkubyBcCitvYmotJChDT05GSUdfTUFDSF9VODUwMCkJKz0gYm9hcmQtbW9wNTAwLm8gYm9hcmQtbW9wNTAwLXNkaS5vIFwKIAkJCQlib2FyZC1tb3A1MDAta2V5cGFkcy5vCiBvYmotJChDT05GSUdfTUFDSF9VNTUwMCkJKz0gYm9hcmQtdTU1MDAubyBib2FyZC11NTUwMC1zZGkubwogb2JqLSQoQ09ORklHX1NNUCkJCSs9IHBsYXRzbXAubyBoZWFkc21wLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvY2xvY2suYyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvY2xvY2suYwppbmRleCBjY2ZmMmRhZTEuLmIyYjBhM2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdXg1MDAvY2xvY2suYworKysgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2Nsb2NrLmMKQEAgLTEzNiw4ICsxMzYsNyBAQAogICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBjbGtfbXR1X2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsaykKIHsKLQl2b2lkIF9faW9tZW0gKmFkZHIgPSBfX2lvX2FkZHJlc3MoVVg1MDBfUFJDTVVfQkFTRSkKLQkJKyBQUkNNX1RDUjsKKwl2b2lkIF9faW9tZW0gKmFkZHI7CiAJdTMyIHRjcjsKIAlpbnQgbXR1ID0gKGludCkgY2xrLT5kYXRhOwogCS8qCkBAIC0xNDksMTMgKzE0OCwyMCBAQAogCXVuc2lnbmVkIGxvbmcgbXR1cmF0ZTsKIAl1bnNpZ25lZCBsb25nIHJldGNsazsKIAorCWlmIChjcHVfaXNfdTU1MDAoKSkKKwkJYWRkciA9IF9faW9fYWRkcmVzcyhVNTUwMF9QUkNNVV9CQVNFKTsKKwllbHNlIGlmIChjcHVfaXNfdTg1MDAoKSkKKwkJYWRkciA9IF9faW9fYWRkcmVzcyhVODUwMF9QUkNNVV9CQVNFKTsKKwllbHNlCisJCXV4NTAwX3Vua25vd25fc29jKCk7CisKIAkvKgogCSAqIE9uIGEgc3RhcnR1cCwgYWx3YXlzIGNvbmlmZ3VyZSB0aGUgVENSIHRvIHRoZSBkb3plIG1vZGU7CiAJICogYm9vdGxvYWRlcnMgZG8gaXQgZm9yIHVzLiBEbyB0aGlzIGluIHRoZSBrZXJuZWwgdG9vLgogCSAqLwotCXdyaXRlbChQUkNNX1RDUl9ET1pFX01PREUsIGFkZHIpOworCXdyaXRlbChQUkNNX1RDUl9ET1pFX01PREUsIGFkZHIgKyBQUkNNX1RDUik7CiAKLQl0Y3IgPSByZWFkbChhZGRyKTsKKwl0Y3IgPSByZWFkbChhZGRyICsgUFJDTV9UQ1IpOwogCiAJLyogR2V0IHRoZSByYXRlIGZyb20gdGhlIHBhcmVudCBhcyBhIGRlZmF1bHQgKi8KIAlpZiAoY2xrLT5wYXJlbnRfcGVyaXBoKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11eDUwMC9jcHUtZGI1NTAwLmMgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2NwdS1kYjU1MDAuYwppbmRleCBhY2M4NDFlLi5hZjA0ZTA4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXV4NTAwL2NwdS1kYjU1MDAuYworKysgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2NwdS1kYjU1MDAuYwpAQCAtMjEsNyArMjEsMjAgQEAKIAogI2luY2x1ZGUgImRldmljZXMtZGI1NTAwLmgiCiAKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgdTU1MDBfdWFydF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKwlfX0lPX0RFVl9ERVNDKFU1NTAwX1VBUlQwX0JBU0UsIFNaXzRLKSwKKwlfX0lPX0RFVl9ERVNDKFU1NTAwX1VBUlQyX0JBU0UsIFNaXzRLKSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgdTU1MDBfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CisJX19JT19ERVZfREVTQyhVNTUwMF9HSUNfQ1BVX0JBU0UsIFNaXzRLKSwKKwlfX0lPX0RFVl9ERVNDKFU1NTAwX0dJQ19ESVNUX0JBU0UsIFNaXzRLKSwKKwlfX0lPX0RFVl9ERVNDKFU1NTAwX0wyQ0NfQkFTRSwgU1pfNEspLAorCV9fSU9fREVWX0RFU0MoVTU1MDBfVFdEX0JBU0UsIFNaXzRLKSwKKwlfX0lPX0RFVl9ERVNDKFU1NTAwX01UVTBfQkFTRSwgU1pfNEspLAorCV9fSU9fREVWX0RFU0MoVTU1MDBfU0NVX0JBU0UsIFNaXzRLKSwKKwlfX0lPX0RFVl9ERVNDKFU1NTAwX0JBQ0tVUFJBTTBfQkFTRSwgU1pfOEspLAorCiAJX19JT19ERVZfREVTQyhVNTUwMF9HUElPMF9CQVNFLCBTWl80SyksCiAJX19JT19ERVZfREVTQyhVNTUwMF9HUElPMV9CQVNFLCBTWl80SyksCiAJX19JT19ERVZfREVTQyhVNTUwMF9HUElPMl9CQVNFLCBTWl80SyksCkBAIC0xNDMsNiArMTU2LDExIEBACiAKIHZvaWQgX19pbml0IHU1NTAwX21hcF9pbyh2b2lkKQogeworCS8qCisJICogTWFwIHRoZSBVQVJUcyBlYXJseSBzbyB0aGF0IHRoZSBERUJVR19MTCBzdHVmZiBjb250aW51ZXMgdG8gd29yay4KKwkgKi8KKwlpb3RhYmxlX2luaXQodTU1MDBfdWFydF9pb19kZXNjLCBBUlJBWV9TSVpFKHU1NTAwX3VhcnRfaW9fZGVzYykpOworCiAJdXg1MDBfbWFwX2lvKCk7CiAKIAlpb3RhYmxlX2luaXQodTU1MDBfaW9fZGVzYywgQVJSQVlfU0laRSh1NTUwMF9pb19kZXNjKSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXV4NTAwL2NwdS1kYjg1MDAuYyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvY3B1LWRiODUwMC5jCmluZGV4IGMwZjM0YTQuLjE3NDhmYmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdXg1MDAvY3B1LWRiODUwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvY3B1LWRiODUwMC5jCkBAIC0yOSwxMyArMjksMzEgQEAKIH07CiAKIC8qIG1pbmltdW0gc3RhdGljIGkvbyBtYXBwaW5nIHJlcXVpcmVkIHRvIGJvb3QgVTg1MDAgcGxhdGZvcm1zICovCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIHU4NTAwX3VhcnRfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CisJX19JT19ERVZfREVTQyhVODUwMF9VQVJUMF9CQVNFLCBTWl80SyksCisJX19JT19ERVZfREVTQyhVODUwMF9VQVJUMl9CQVNFLCBTWl80SyksCit9OworCiBzdGF0aWMgc3RydWN0IG1hcF9kZXNjIHU4NTAwX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworCV9fSU9fREVWX0RFU0MoVTg1MDBfR0lDX0NQVV9CQVNFLCBTWl80SyksCisJX19JT19ERVZfREVTQyhVODUwMF9HSUNfRElTVF9CQVNFLCBTWl80SyksCisJX19JT19ERVZfREVTQyhVODUwMF9MMkNDX0JBU0UsIFNaXzRLKSwKKwlfX0lPX0RFVl9ERVNDKFU4NTAwX1RXRF9CQVNFLCBTWl80SyksCisJX19JT19ERVZfREVTQyhVODUwMF9NVFUwX0JBU0UsIFNaXzRLKSwKKwlfX0lPX0RFVl9ERVNDKFU4NTAwX1NDVV9CQVNFLCBTWl80SyksCisJX19JT19ERVZfREVTQyhVODUwMF9CQUNLVVBSQU0wX0JBU0UsIFNaXzhLKSwKKworCV9fSU9fREVWX0RFU0MoVTg1MDBfQ0xLUlNUMV9CQVNFLCBTWl80SyksCisJX19JT19ERVZfREVTQyhVODUwMF9DTEtSU1QyX0JBU0UsIFNaXzRLKSwKKwlfX0lPX0RFVl9ERVNDKFU4NTAwX0NMS1JTVDNfQkFTRSwgU1pfNEspLAorCV9fSU9fREVWX0RFU0MoVTg1MDBfQ0xLUlNUNV9CQVNFLCBTWl80SyksCisJX19JT19ERVZfREVTQyhVODUwMF9DTEtSU1Q2X0JBU0UsIFNaXzRLKSwKKwogCV9fSU9fREVWX0RFU0MoVTg1MDBfUFJDTVVfQkFTRSwgU1pfNEspLAogCV9fSU9fREVWX0RFU0MoVTg1MDBfR1BJTzBfQkFTRSwgU1pfNEspLAogCV9fSU9fREVWX0RFU0MoVTg1MDBfR1BJTzFfQkFTRSwgU1pfNEspLAogCV9fSU9fREVWX0RFU0MoVTg1MDBfR1BJTzJfQkFTRSwgU1pfNEspLAogCV9fSU9fREVWX0RFU0MoVTg1MDBfR1BJTzNfQkFTRSwgU1pfNEspLAotCV9fTUVNX0RFVl9ERVNDKFU4NTAwX0JPT1RfUk9NX0JBU0UsIFNaXzFNKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgdTg1MDBfZWRfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CkBAIC01Miw3MSArNzAsMTMgQEAKIAlfX0lPX0RFVl9ERVNDKFU4NTAwX1BSQ01VX1RDRE1fQkFTRSwgU1pfNEspLAogfTsKIAotLyoKLSAqIEZ1bmN0aW9ucyB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gbGF0ZXIgQVNJQ3MKLSAqIFdlIGxvb2sgaW50byB0aGUgZW5kIG9mIHRoZSBST00gdG8gbG9jYXRlIHRoZSBoYXJkY29kZWQgQVNJQyBJRC4KLSAqIFRoaXMgaXMgb25seSBuZWVkZWQgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIG1pbm9yIHJldmlzaW9ucyBhbmQKLSAqIHByb2Nlc3MgdmFyaWFudHMgb2YgYW4gQVNJQywgdGhlIG1ham9yIHJldmlzaW9ucyBhcmUgZW5jb2RlZCBpbgotICogdGhlIGNwdWlkLgotICovCi0jZGVmaW5lIFU4NTAwX0FTSUNfSURfTE9DX0VEX1YxCShVODUwMF9CT09UX1JPTV9CQVNFICsgMHgxRkZGNCkKLSNkZWZpbmUgVTg1MDBfQVNJQ19JRF9MT0NfVjIJKFU4NTAwX0JPT1RfUk9NX0JBU0UgKyAweDFEQkY0KQotI2RlZmluZSBVODUwMF9BU0lDX1JFVl9FRAkweDAxCi0jZGVmaW5lIFU4NTAwX0FTSUNfUkVWX1YxMAkweEEwCi0jZGVmaW5lIFU4NTAwX0FTSUNfUkVWX1YxMQkweEExCi0jZGVmaW5lIFU4NTAwX0FTSUNfUkVWX1YyMAkweEIwCi0KLS8qKgotICogc3RydWN0IGRiODUwMF9hc2ljX2lkIC0gZmllbGRzIG9mIHRoZSBBU0lDIElECi0gKiBAcHJvY2VzczogdGhlIG1hbnVmYWN0dXJpbmcgcHJvY2VzcywgMHg0MCBpcyA0MCBubQotICogIDB4MDAgaXMgInN0YW5kYXJkIgotICogQHBhcnRudW1iZXI6IGhpdGhlcmV0byAweDg1MDAgZm9yIERCODUwMAotICogQHJldmlzaW9uOiB2ZXJzaW9uIGNvZGUgaW4gdGhlIHNlcmllcwotICogVGhpcyBmaWVsZCBkZWZpbmlvbiBpcyBub3QgZm9ybWFsbHkgZGVmaW5lZCBidXQgbWFrZXMKLSAqIHNlbnNlLgotICovCi1zdHJ1Y3QgZGI4NTAwX2FzaWNfaWQgewotCXU4IHByb2Nlc3M7Ci0JdTE2IHBhcnRudW1iZXI7Ci0JdTggcmV2aXNpb247Ci19OwotCi0vKiBUaGlzIGlzbid0IGdvaW5nIHRvIGNoYW5nZSBhdCBydW50aW1lICovCi1zdGF0aWMgc3RydWN0IGRiODUwMF9hc2ljX2lkIGRiODUwMF9pZDsKLQotc3RhdGljIHZvaWQgX19pbml0IGdldF9kYjg1MDBfYXNpY19pZCh2b2lkKQotewotCXUzMiBhc2ljaWQ7Ci0KLQlpZiAoY3B1X2lzX3U4NTAwdjEoKSB8fCBjcHVfaXNfdTg1MDBlZCgpKQotCQlhc2ljaWQgPSByZWFkbChfX2lvX2FkZHJlc3MoVTg1MDBfQVNJQ19JRF9MT0NfRURfVjEpKTsKLQllbHNlIGlmIChjcHVfaXNfdTg1MDB2MigpKQotCQlhc2ljaWQgPSByZWFkbChfX2lvX2FkZHJlc3MoVTg1MDBfQVNJQ19JRF9MT0NfVjIpKTsKLQllbHNlCi0JCUJVRygpOwotCi0JZGI4NTAwX2lkLnByb2Nlc3MgPSAoYXNpY2lkID4+IDI0KTsKLQlkYjg1MDBfaWQucGFydG51bWJlciA9IChhc2ljaWQgPj4gMTYpICYgMHhGRkZGVTsKLQlkYjg1MDBfaWQucmV2aXNpb24gPSBhc2ljaWQgJiAweEZGVTsKLX0KLQotYm9vbCBjcHVfaXNfdTg1MDB2MTAodm9pZCkKLXsKLQlyZXR1cm4gKGRiODUwMF9pZC5yZXZpc2lvbiA9PSBVODUwMF9BU0lDX1JFVl9WMTApOwotfQotCi1ib29sIGNwdV9pc191ODUwMHYxMSh2b2lkKQotewotCXJldHVybiAoZGI4NTAwX2lkLnJldmlzaW9uID09IFU4NTAwX0FTSUNfUkVWX1YxMSk7Ci19Ci0KLWJvb2wgY3B1X2lzX3U4NTAwdjIwKHZvaWQpCi17Ci0JcmV0dXJuIChkYjg1MDBfaWQucmV2aXNpb24gPT0gVTg1MDBfQVNJQ19SRVZfVjIwKTsKLX0KLQogdm9pZCBfX2luaXQgdTg1MDBfbWFwX2lvKHZvaWQpCiB7CisJLyoKKwkgKiBNYXAgdGhlIFVBUlRzIGVhcmx5IHNvIHRoYXQgdGhlIERFQlVHX0xMIHN0dWZmIGNvbnRpbnVlcyB0byB3b3JrLgorCSAqLworCWlvdGFibGVfaW5pdCh1ODUwMF91YXJ0X2lvX2Rlc2MsIEFSUkFZX1NJWkUodTg1MDBfdWFydF9pb19kZXNjKSk7CisKIAl1eDUwMF9tYXBfaW8oKTsKIAogCWlvdGFibGVfaW5pdCh1ODUwMF9pb19kZXNjLCBBUlJBWV9TSVpFKHU4NTAwX2lvX2Rlc2MpKTsKQEAgLTEyNyw5ICs4Nyw2IEBACiAJCWlvdGFibGVfaW5pdCh1ODUwMF92MV9pb19kZXNjLCBBUlJBWV9TSVpFKHU4NTAwX3YxX2lvX2Rlc2MpKTsKIAllbHNlIGlmIChjcHVfaXNfdTg1MDB2MigpKQogCQlpb3RhYmxlX2luaXQodTg1MDBfdjJfaW9fZGVzYywgQVJSQVlfU0laRSh1ODUwMF92Ml9pb19kZXNjKSk7Ci0KLQkvKiBSZWFkIG91dCB0aGUgQVNJQyBJRCBhcyBlYXJseSBhcyB3ZSBjYW4gKi8KLQlnZXRfZGI4NTAwX2FzaWNfaWQoKTsKIH0KIAogc3RhdGljIHJlc291cmNlX3NpemVfdCBfX2luaXRkYXRhIGRiODUwMF9ncGlvX2Jhc2VbXSA9IHsKQEAgLTE1OSwyMCArMTE2LDYgQEAKICAqLwogdm9pZCBfX2luaXQgdTg1MDBfaW5pdF9kZXZpY2VzKHZvaWQpCiB7Ci0JLyogRGlzcGxheSBzb21lIEFTSUMgYm9pbGVycGxhdGUgKi8KLQlwcl9pbmZvKCJEQjg1MDA6IHByb2Nlc3M6ICUwMngsIHJldmlzaW9uIElEOiAweCUwMnhcbiIsCi0JCWRiODUwMF9pZC5wcm9jZXNzLCBkYjg1MDBfaWQucmV2aXNpb24pOwotCWlmIChjcHVfaXNfdTg1MDBlZCgpKQotCQlwcl9pbmZvKCJEQjg1MDA6IEVhcmx5IERyb3AgKEVEKVxuIik7Ci0JZWxzZSBpZiAoY3B1X2lzX3U4NTAwdjEwKCkpCi0JCXByX2luZm8oIkRCODUwMDogdmVyc2lvbiAxLjBcbiIpOwotCWVsc2UgaWYgKGNwdV9pc191ODUwMHYxMSgpKQotCQlwcl9pbmZvKCJEQjg1MDA6IHZlcnNpb24gMS4xXG4iKTsKLQllbHNlIGlmIChjcHVfaXNfdTg1MDB2MjAoKSkKLQkJcHJfaW5mbygiREI4NTAwOiB2ZXJzaW9uIDIuMFxuIik7Ci0JZWxzZQotCQlwcl93YXJuaW5nKCJBU0lDOiBVTktOT1dOIFNJTElDT04gVkVSU0lPTiFcbiIpOwotCiAJaWYgKGNwdV9pc191ODUwMGVkKCkpCiAJCWRtYTQwX3U4NTAwZWRfZml4dXAoKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11eDUwMC9jcHUuYyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvY3B1LmMKaW5kZXggNTczMDQwOS4uNWE0MzEwNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11eDUwMC9jcHUuYworKysgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2NwdS5jCkBAIC0yMywzNyArMjMsMjUgQEAKIAogI2luY2x1ZGUgImNsb2NrLmgiCiAKLXN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgdXg1MDBfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7Ci0JX19JT19ERVZfREVTQyhVWDUwMF9VQVJUMF9CQVNFLCBTWl80SyksCi0JX19JT19ERVZfREVTQyhVWDUwMF9VQVJUMl9CQVNFLCBTWl80SyksCi0KLQlfX0lPX0RFVl9ERVNDKFVYNTAwX0dJQ19DUFVfQkFTRSwgU1pfNEspLAotCV9fSU9fREVWX0RFU0MoVVg1MDBfR0lDX0RJU1RfQkFTRSwgU1pfNEspLAotCV9fSU9fREVWX0RFU0MoVVg1MDBfTDJDQ19CQVNFLCBTWl80SyksCi0JX19JT19ERVZfREVTQyhVWDUwMF9UV0RfQkFTRSwgU1pfNEspLAotCV9fSU9fREVWX0RFU0MoVVg1MDBfU0NVX0JBU0UsIFNaXzRLKSwKLQotCV9fSU9fREVWX0RFU0MoVVg1MDBfQ0xLUlNUMV9CQVNFLCBTWl80SyksCi0JX19JT19ERVZfREVTQyhVWDUwMF9DTEtSU1QyX0JBU0UsIFNaXzRLKSwKLQlfX0lPX0RFVl9ERVNDKFVYNTAwX0NMS1JTVDNfQkFTRSwgU1pfNEspLAotCV9fSU9fREVWX0RFU0MoVVg1MDBfQ0xLUlNUNV9CQVNFLCBTWl80SyksCi0JX19JT19ERVZfREVTQyhVWDUwMF9DTEtSU1Q2X0JBU0UsIFNaXzRLKSwKLQotCV9fSU9fREVWX0RFU0MoVVg1MDBfTVRVMF9CQVNFLCBTWl80SyksCi0JX19JT19ERVZfREVTQyhVWDUwMF9NVFUxX0JBU0UsIFNaXzRLKSwKLQotCV9fSU9fREVWX0RFU0MoVVg1MDBfQkFDS1VQUkFNMF9CQVNFLCBTWl84SyksCi19OwotCi12b2lkIF9faW5pdCB1eDUwMF9tYXBfaW8odm9pZCkKLXsKLQlpb3RhYmxlX2luaXQodXg1MDBfaW9fZGVzYywgQVJSQVlfU0laRSh1eDUwMF9pb19kZXNjKSk7Ci19CisjaWZkZWYgQ09ORklHX0NBQ0hFX0wyWDAKK3N0YXRpYyB2b2lkIF9faW9tZW0gKmwyeDBfYmFzZTsKKyNlbmRpZgogCiB2b2lkIF9faW5pdCB1eDUwMF9pbml0X2lycSh2b2lkKQogewotCWdpY19pbml0KDAsIDI5LCBfX2lvX2FkZHJlc3MoVVg1MDBfR0lDX0RJU1RfQkFTRSksCi0JCSBfX2lvX2FkZHJlc3MoVVg1MDBfR0lDX0NQVV9CQVNFKSk7CisJdm9pZCBfX2lvbWVtICpkaXN0X2Jhc2U7CisJdm9pZCBfX2lvbWVtICpjcHVfYmFzZTsKKworCWlmIChjcHVfaXNfdTU1MDAoKSkgeworCQlkaXN0X2Jhc2UgPSBfX2lvX2FkZHJlc3MoVTU1MDBfR0lDX0RJU1RfQkFTRSk7CisJCWNwdV9iYXNlID0gX19pb19hZGRyZXNzKFU1NTAwX0dJQ19DUFVfQkFTRSk7CisJfSBlbHNlIGlmIChjcHVfaXNfdTg1MDAoKSkgeworCQlkaXN0X2Jhc2UgPSBfX2lvX2FkZHJlc3MoVTg1MDBfR0lDX0RJU1RfQkFTRSk7CisJCWNwdV9iYXNlID0gX19pb19hZGRyZXNzKFU4NTAwX0dJQ19DUFVfQkFTRSk7CisJfSBlbHNlCisJCXV4NTAwX3Vua25vd25fc29jKCk7CisKKwlnaWNfaW5pdCgwLCAyOSwgZGlzdF9iYXNlLCBjcHVfYmFzZSk7CiAKIAkvKgogCSAqIEluaXQgY2xvY2tzIGhlcmUgc28gdGhhdCB0aGV5IGFyZSBhdmFpbGFibGUgZm9yIHN5c3RlbSB0aW1lcgpAQCAtNzQsNyArNjIsOCBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgdXg1MDBfY2FjaGVfc3luYyh2b2lkKQogewotCXZvaWQgX19pb21lbSAqYmFzZSA9IF9faW9fYWRkcmVzcyhVWDUwMF9MMkNDX0JBU0UpOworCXZvaWQgX19pb21lbSAqYmFzZSA9IGwyeDBfYmFzZTsKKwogCXdyaXRlbF9yZWxheGVkKDAsIGJhc2UgKyBMMlgwX0NBQ0hFX1NZTkMpOwogCXV4NTAwX2NhY2hlX3dhaXQoYmFzZSArIEwyWDBfQ0FDSEVfU1lOQywgMSk7CiB9CkBAIC05NiwyMCArODUsMjMgQEAKICAqLwogc3RhdGljIHZvaWQgdXg1MDBfbDJ4MF9pbnZfYWxsKHZvaWQpCiB7Ci0Jdm9pZCBfX2lvbWVtICpsMngwX2Jhc2UgPSBfX2lvX2FkZHJlc3MoVVg1MDBfTDJDQ19CQVNFKTsKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSBsMngwX2Jhc2U7CiAJdWludDMyX3QgbDJ4MF93YXlfbWFzayA9ICgxPDwxNikgLSAxOwkvKiBCaXRtYXNrIG9mIGFjdGl2ZSB3YXlzICovCiAKIAkvKiBpbnZhbGlkYXRlIGFsbCB3YXlzICovCi0Jd3JpdGVsX3JlbGF4ZWQobDJ4MF93YXlfbWFzaywgbDJ4MF9iYXNlICsgTDJYMF9JTlZfV0FZKTsKLQl1eDUwMF9jYWNoZV93YWl0KGwyeDBfYmFzZSArIEwyWDBfSU5WX1dBWSwgbDJ4MF93YXlfbWFzayk7CisJd3JpdGVsX3JlbGF4ZWQobDJ4MF93YXlfbWFzaywgYmFzZSArIEwyWDBfSU5WX1dBWSk7CisJdXg1MDBfY2FjaGVfd2FpdChiYXNlICsgTDJYMF9JTlZfV0FZLCBsMngwX3dheV9tYXNrKTsKIAl1eDUwMF9jYWNoZV9zeW5jKCk7CiB9CiAKIHN0YXRpYyBpbnQgdXg1MDBfbDJ4MF9pbml0KHZvaWQpCiB7Ci0Jdm9pZCBfX2lvbWVtICpsMngwX2Jhc2U7Ci0KLQlsMngwX2Jhc2UgPSBfX2lvX2FkZHJlc3MoVVg1MDBfTDJDQ19CQVNFKTsKKwlpZiAoY3B1X2lzX3U1NTAwKCkpCisJCWwyeDBfYmFzZSA9IF9faW9fYWRkcmVzcyhVNTUwMF9MMkNDX0JBU0UpOworCWVsc2UgaWYgKGNwdV9pc191ODUwMCgpKQorCQlsMngwX2Jhc2UgPSBfX2lvX2FkZHJlc3MoVTg1MDBfTDJDQ19CQVNFKTsKKwllbHNlCisJCXV4NTAwX3Vua25vd25fc29jKCk7CiAKIAkvKiA2NEtCIHdheSBzaXplLCA4IHdheSBhc3NvY2lhdGl2aXR5LCBmb3JjZSBXQSAqLwogCWwyeDBfaW5pdChsMngwX2Jhc2UsIDB4M2UwNjAwMDAsIDB4YzAwMDBmZmYpOwpAQCAtMTI3LDEzICsxMTksMjEgQEAKIHsKICNpZmRlZiBDT05GSUdfTE9DQUxfVElNRVJTCiAJLyogU2V0dXAgdGhlIGxvY2FsIHRpbWVyIGJhc2UgKi8KLQl0d2RfYmFzZSA9IF9faW9fYWRkcmVzcyhVWDUwMF9UV0RfQkFTRSk7Ci0jZW5kaWYKLQkvKiBTZXR1cCB0aGUgTVRVIGJhc2UgKi8KLQlpZiAoY3B1X2lzX3U4NTAwZWQoKSkKLQkJbXR1X2Jhc2UgPSBfX2lvX2FkZHJlc3MoVTg1MDBfTVRVMF9CQVNFX0VEKTsKKwlpZiAoY3B1X2lzX3U1NTAwKCkpCisJCXR3ZF9iYXNlID0gX19pb19hZGRyZXNzKFU1NTAwX1RXRF9CQVNFKTsKKwllbHNlIGlmIChjcHVfaXNfdTg1MDAoKSkKKwkJdHdkX2Jhc2UgPSBfX2lvX2FkZHJlc3MoVTg1MDBfVFdEX0JBU0UpOwogCWVsc2UKLQkJbXR1X2Jhc2UgPSBfX2lvX2FkZHJlc3MoVVg1MDBfTVRVMF9CQVNFKTsKKwkJdXg1MDBfdW5rbm93bl9zb2MoKTsKKyNlbmRpZgorCWlmIChjcHVfaXNfdTU1MDAoKSkKKwkJbXR1X2Jhc2UgPSBfX2lvX2FkZHJlc3MoVTU1MDBfTVRVMF9CQVNFKTsKKwllbHNlIGlmIChjcHVfaXNfdTg1MDBlZCgpKQorCQltdHVfYmFzZSA9IF9faW9fYWRkcmVzcyhVODUwMF9NVFUwX0JBU0VfRUQpOworCWVsc2UgaWYgKGNwdV9pc191ODUwMCgpKQorCQltdHVfYmFzZSA9IF9faW9fYWRkcmVzcyhVODUwMF9NVFUwX0JBU0UpOworCWVsc2UKKwkJdXg1MDBfdW5rbm93bl9zb2MoKTsKIAogCW5tZGtfdGltZXJfaW5pdCgpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11eDUwMC9pZC5jIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9pZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNTEyMmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2lkLmMKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIFNULUVyaWNzc29uIFNBIDIwMTAKKyAqCisgKiBBdXRob3I6IFJhYmluIFZpbmNlbnQgPHJhYmluLnZpbmNlbnRAc3Rlcmljc3Nvbi5jb20+IGZvciBTVC1Fcmljc3NvbgorICogTGljZW5zZSB0ZXJtczogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgdmVyc2lvbiAyCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8YXNtL2NwdXR5cGUuaD4KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvc2V0dXAuaD4KKworc3RydWN0IGRieDUwMF9hc2ljX2lkIGRieDUwMF9pZDsKKworc3RhdGljIHVuc2lnbmVkIGludCB1eDUwMF9yZWFkX2FzaWNpZChwaHlzX2FkZHJfdCBhZGRyKQoreworCXBoeXNfYWRkcl90IGJhc2UgPSBhZGRyICYgfjB4ZmZmOworCXN0cnVjdCBtYXBfZGVzYyBkZXNjID0geworCQkudmlydHVhbAk9IElPX0FERFJFU1MoYmFzZSksCisJCS5wZm4JCT0gX19waHlzX3RvX3BmbihiYXNlKSwKKwkJLmxlbmd0aAkJPSBTWl8xNkssCisJCS50eXBlCQk9IE1UX0RFVklDRSwKKwl9OworCisJaW90YWJsZV9pbml0KCZkZXNjLCAxKTsKKworCS8qIEFzIGluIGRldmljZW1hcHNfaW5pdCgpICovCisJbG9jYWxfZmx1c2hfdGxiX2FsbCgpOworCWZsdXNoX2NhY2hlX2FsbCgpOworCisJcmV0dXJuIHJlYWRsKF9faW9fYWRkcmVzcyhhZGRyKSk7Cit9CisKK3N0YXRpYyB2b2lkIHV4NTAwX3ByaW50X3NvY19pbmZvKHVuc2lnbmVkIGludCBhc2ljaWQpCit7CisJdW5zaWduZWQgaW50IHJldiA9IGRieDUwMF9yZXZpc2lvbigpOworCisJcHJfaW5mbygiREIlNHggIiwgZGJ4NTAwX3BhcnRudW1iZXIoKSk7CisKKwlpZiAocmV2ID09IDB4MDEpCisJCXByX2NvbnQoIkVhcmx5IERyb3AiKTsKKwllbHNlIGlmIChyZXYgPj0gMHhBMCkKKwkJcHJfY29udCgidiVkLiVkIiAsIChyZXYgPj4gNCkgLSAweEEgKyAxLCByZXYgJiAweGYpOworCWVsc2UKKwkJcHJfY29udCgiVW5rbm93biIpOworCisJcHJfY29udCgiIFslIzAxMHhdXG4iLCBhc2ljaWQpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHBhcnRudW1iZXIodW5zaWduZWQgaW50IGFzaWNpZCkKK3sKKwlyZXR1cm4gKGFzaWNpZCA+PiA4KSAmIDB4ZmZmZjsKK30KKworLyoKKyAqIFNPQwkJTUlEUgkJQVNJQ0lEIEFERFJFU1MJCUFTSUNJRCBWQUxVRQorICogREI4NTAwZWQJMHg0MTBmYzA5MAkweDkwMDFGRkY0CQkweDAwODUwMDAxCisgKiBEQjg1MDB2MQkweDQxMWZjMDkxCTB4OTAwMUZGRjQJCTB4MDA4NTAwQTAKKyAqIERCODUwMHYxLjEJMHg0MTFmYzA5MQkweDkwMDFGRkY0CQkweDAwODUwMEExCisgKiBEQjg1MDB2MgkweDQxMmZjMDkxCTB4OTAwMURCRjQJCTB4MDA4NTAwQjAKKyAqIERCNTUwMHYxCTB4NDEyZmMwOTEJMHg5MDAxRkZGNAkJMHgwMDU1MDBBMAorICovCisKK3ZvaWQgX19pbml0IHV4NTAwX21hcF9pbyh2b2lkKQoreworCXVuc2lnbmVkIGludCBjcHVpZCA9IHJlYWRfY3B1aWRfaWQoKTsKKwl1bnNpZ25lZCBpbnQgYXNpY2lkID0gMDsKKwlwaHlzX2FkZHJfdCBhZGRyID0gMDsKKworCXN3aXRjaCAoY3B1aWQpIHsKKwljYXNlIDB4NDEwZmMwOTA6IC8qIERCODUwMGVkICovCisJY2FzZSAweDQxMWZjMDkxOiAvKiBEQjg1MDB2MSAqLworCQlhZGRyID0gMHg5MDAxRkZGNDsKKwkJYnJlYWs7CisKKwljYXNlIDB4NDEyZmMwOTE6IC8qIERCODUwMHYyIC8gREI1NTAwdjEgKi8KKwkJYXNpY2lkID0gdXg1MDBfcmVhZF9hc2ljaWQoMHg5MDAxREJGNCk7CisJCWlmIChwYXJ0bnVtYmVyKGFzaWNpZCkgPT0gMHg4NTAwKQorCQkJLyogREI4NTAwdjIgKi8KKwkJCWJyZWFrOworCisJCS8qIERCNTUwMHYxICovCisJCWFkZHIgPSAweDkwMDFGRkY0OworCQlicmVhazsKKwl9CisKKwlpZiAoYWRkcikKKwkJYXNpY2lkID0gdXg1MDBfcmVhZF9hc2ljaWQoYWRkcik7CisKKwlpZiAoIWFzaWNpZCkgeworCQlwcl9lcnIoIlVuYWJsZSB0byBpZGVudGlmeSBTb0NcbiIpOworCQl1eDUwMF91bmtub3duX3NvYygpOworCX0KKworCWRieDUwMF9pZC5wcm9jZXNzID0gYXNpY2lkID4+IDI0OworCWRieDUwMF9pZC5wYXJ0bnVtYmVyID0gcGFydG51bWJlcihhc2ljaWQpOworCWRieDUwMF9pZC5yZXZpc2lvbiA9IGFzaWNpZCAmIDB4ZmY7CisKKwl1eDUwMF9wcmludF9zb2NfaW5mbyhhc2ljaWQpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKaW5kZXggYmU3YzBmMS4uNzAwZmIwNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC0xNCw3ICsxNCwyNCBAQAogI2Vycm9yIEludmFsaWQgVXg1MDAgZGVidWcgVUFSVAogI2VuZGlmCiAKLSNkZWZpbmUgX19VWDUwMF9VQVJUKG4pCVVYNTAwX1VBUlQjI24jI19CQVNFCisvKgorICogREVCVUdfTEwgb25seSB3b3JrcyBpZiBvbmx5IG9uZSBTT0MgaXMgYnVpbHQgaW4uICBXZSBkb24ndCB1c2UgI2Vsc2UgYmVsb3cKKyAqIGluIG9yZGVyIHRvIGdldCAiX19VWDUwMF9VQVJUIHJlZGVmaW5lZCIgd2FybmluZ3MgaWYgbW9yZSB0aGFuIG9uZSBTT0MgaXMKKyAqIGJ1aWx0LCBzbyB0aGF0IHRoZXJlJ3Mgc29tZSBoaW50IGR1cmluZyB0aGUgYnVpbGQgdGhhdCBzb21ldGhpbmcgaXMgd3JvbmcuCisgKi8KKworI2lmZGVmIENPTkZJR19VWDUwMF9TT0NfREI1NTAwCisjZGVmaW5lIF9fVVg1MDBfVUFSVChuKQlVNTUwMF9VQVJUIyNuIyNfQkFTRQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfVVg1MDBfU09DX0RCODUwMAorI2RlZmluZSBfX1VYNTAwX1VBUlQobikJVTg1MDBfVUFSVCMjbiMjX0JBU0UKKyNlbmRpZgorCisjaWZuZGVmIF9fVVg1MDBfVUFSVAorI2Vycm9yIFVua25vd24gU09DCisjZW5kaWYKKwogI2RlZmluZSBVWDUwMF9VQVJUKG4pCV9fVVg1MDBfVUFSVChuKQogI2RlZmluZSBVQVJUX0JBU0UJVVg1MDBfVUFSVChDT05GSUdfVVg1MDBfREVCVUdfVUFSVCkKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMKaW5kZXggYTM3ZjU4NS4uMDcxYmJhOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUworKysgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCkBAIC0xMSwxNSArMTEsMTAgQEAKICAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqLwogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNkZWZpbmUgSEFWRV9HRVRfSVJRTlJfUFJFQU1CTEUKICNpbmNsdWRlIDxhc20vaGFyZHdhcmUvZW50cnktbWFjcm8tZ2ljLlM+CiAKIAkJLm1hY3JvCWRpc2FibGVfZmlxCiAJCS5lbmRtCiAKLQkJLm1hY3JvICBnZXRfaXJxbnJfcHJlYW1ibGUsIGJhc2UsIHRtcAotCQlsZHIgICAgIFxiYXNlLCA9SU9fQUREUkVTUyhVWDUwMF9HSUNfQ1BVX0JBU0UpCi0JCS5lbmRtCi0KIAkJLm1hY3JvICBhcmNoX3JldF90b191c2VyLCB0bXAxLCB0bXAyCiAJCS5lbmRtCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaAppbmRleCA2Mjk1Y2M1Li5iZjYzZjI2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCisrKyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmgKQEAgLTI5LDExOCArMjksMTIgQEAKICNpbmNsdWRlIDxtYWNoL2RiODUwMC1yZWdzLmg+CiAjaW5jbHVkZSA8bWFjaC9kYjU1MDAtcmVncy5oPgogCi0jaWZkZWYgQ09ORklHX1VYNTAwX1NPQ19EQjg1MDAKLSNkZWZpbmUgVVg1MDAocGVyaXBoKQkJVTg1MDBfIyNwZXJpcGgjI19CQVNFCi0jZWxpZiBkZWZpbmVkKENPTkZJR19VWDUwMF9TT0NfREI1NTAwKQotI2RlZmluZSBVWDUwMChwZXJpcGgpCQlVNTUwMF8jI3BlcmlwaCMjX0JBU0UKLSNlbmRpZgotCi0jZGVmaW5lIFVYNTAwX0JBQ0tVUFJBTTBfQkFTRQlVWDUwMChCQUNLVVBSQU0wKQotI2RlZmluZSBVWDUwMF9CQUNLVVBSQU0xX0JBU0UJVVg1MDAoQkFDS1VQUkFNMSkKLSNkZWZpbmUgVVg1MDBfQjJSMl9CQVNFCQlVWDUwMChCMlIyKQotCi0jZGVmaW5lIFVYNTAwX0NMS1JTVDFfQkFTRQlVWDUwMChDTEtSU1QxKQotI2RlZmluZSBVWDUwMF9DTEtSU1QyX0JBU0UJVVg1MDAoQ0xLUlNUMikKLSNkZWZpbmUgVVg1MDBfQ0xLUlNUM19CQVNFCVVYNTAwKENMS1JTVDMpCi0jZGVmaW5lIFVYNTAwX0NMS1JTVDVfQkFTRQlVWDUwMChDTEtSU1Q1KQotI2RlZmluZSBVWDUwMF9DTEtSU1Q2X0JBU0UJVVg1MDAoQ0xLUlNUNikKLQotI2RlZmluZSBVWDUwMF9ETUFfQkFTRQkJVVg1MDAoRE1BKQotI2RlZmluZSBVWDUwMF9GU01DX0JBU0UJCVVYNTAwKEZTTUMpCi0KLSNkZWZpbmUgVVg1MDBfR0lDX0NQVV9CQVNFCVVYNTAwKEdJQ19DUFUpCi0jZGVmaW5lIFVYNTAwX0dJQ19ESVNUX0JBU0UJVVg1MDAoR0lDX0RJU1QpCi0KLSNkZWZpbmUgVVg1MDBfSTJDMV9CQVNFCQlVWDUwMChJMkMxKQotI2RlZmluZSBVWDUwMF9JMkMyX0JBU0UJCVVYNTAwKEkyQzIpCi0jZGVmaW5lIFVYNTAwX0kyQzNfQkFTRQkJVVg1MDAoSTJDMykKLQotI2RlZmluZSBVWDUwMF9MMkNDX0JBU0UJCVVYNTAwKEwyQ0MpCi0jZGVmaW5lIFVYNTAwX01DREVfQkFTRQkJVVg1MDAoTUNERSkKLSNkZWZpbmUgVVg1MDBfTVRVMF9CQVNFCQlVWDUwMChNVFUwKQotI2RlZmluZSBVWDUwMF9NVFUxX0JBU0UJCVVYNTAwKE1UVTEpCi0jZGVmaW5lIFVYNTAwX1BSQ01VX0JBU0UJVVg1MDAoUFJDTVUpCi0KLSNkZWZpbmUgVVg1MDBfUk5HX0JBU0UJCVVYNTAwKFJORykKLSNkZWZpbmUgVVg1MDBfUlRDX0JBU0UJCVVYNTAwKFJUQykKLQotI2RlZmluZSBVWDUwMF9TQ1VfQkFTRQkJVVg1MDAoU0NVKQotCi0jZGVmaW5lIFVYNTAwX1NESTBfQkFTRQkJVVg1MDAoU0RJMCkKLSNkZWZpbmUgVVg1MDBfU0RJMV9CQVNFCQlVWDUwMChTREkxKQotI2RlZmluZSBVWDUwMF9TREkyX0JBU0UJCVVYNTAwKFNESTIpCi0jZGVmaW5lIFVYNTAwX1NESTNfQkFTRQkJVVg1MDAoU0RJMykKLSNkZWZpbmUgVVg1MDBfU0RJNF9CQVNFCQlVWDUwMChTREk0KQotCi0jZGVmaW5lIFVYNTAwX1NQSTBfQkFTRQkJVVg1MDAoU1BJMCkKLSNkZWZpbmUgVVg1MDBfU1BJMV9CQVNFCQlVWDUwMChTUEkxKQotI2RlZmluZSBVWDUwMF9TUEkyX0JBU0UJCVVYNTAwKFNQSTIpCi0jZGVmaW5lIFVYNTAwX1NQSTNfQkFTRQkJVVg1MDAoU1BJMykKLQotI2RlZmluZSBVWDUwMF9TSUFfQkFTRQkJVVg1MDAoU0lBKQotI2RlZmluZSBVWDUwMF9TVkFfQkFTRQkJVVg1MDAoU1ZBKQotCi0jZGVmaW5lIFVYNTAwX1RXRF9CQVNFCQlVWDUwMChUV0QpCi0KLSNkZWZpbmUgVVg1MDBfVUFSVDBfQkFTRQlVWDUwMChVQVJUMCkKLSNkZWZpbmUgVVg1MDBfVUFSVDFfQkFTRQlVWDUwMChVQVJUMSkKLSNkZWZpbmUgVVg1MDBfVUFSVDJfQkFTRQlVWDUwMChVQVJUMikKLQotI2RlZmluZSBVWDUwMF9VU0JPVEdfQkFTRQlVWDUwMChVU0JPVEcpCi0KIC8qIFNULUVyaWNzc29uIG1vZGlmaWVkIHBsMDIyIGlkICovCiAjZGVmaW5lIFNTUF9QRVJfSUQJCTB4MDEwODAwMjIKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAotI2luY2x1ZGUgPGFzbS9jcHV0eXBlLmg+Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBjcHVfaXNfdTg1MDAodm9pZCkKLXsKLSNpZmRlZiBDT05GSUdfVVg1MDBfU09DX0RCODUwMAotCXJldHVybiAxOwotI2Vsc2UKLQlyZXR1cm4gMDsKLSNlbmRpZgotfQotCi0jZGVmaW5lIENQVUlEX0RCODUwMEVECTB4NDEwZmMwOTAKLSNkZWZpbmUgQ1BVSURfREI4NTAwVjEJMHg0MTFmYzA5MQotI2RlZmluZSBDUFVJRF9EQjg1MDBWMgkweDQxMmZjMDkxCi0KLXN0YXRpYyBpbmxpbmUgYm9vbCBjcHVfaXNfdTg1MDBlZCh2b2lkKQotewotCXJldHVybiBjcHVfaXNfdTg1MDAoKSAmJiAocmVhZF9jcHVpZF9pZCgpID09IENQVUlEX0RCODUwMEVEKTsKLX0KLQotc3RhdGljIGlubGluZSBib29sIGNwdV9pc191ODUwMHYxKHZvaWQpCi17Ci0JcmV0dXJuIGNwdV9pc191ODUwMCgpICYmIChyZWFkX2NwdWlkX2lkKCkgPT0gQ1BVSURfREI4NTAwVjEpOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgY3B1X2lzX3U4NTAwdjIodm9pZCkKLXsKLQlyZXR1cm4gY3B1X2lzX3U4NTAwKCkgJiYgKHJlYWRfY3B1aWRfaWQoKSA9PSBDUFVJRF9EQjg1MDBWMik7Ci19Ci0KLSNpZmRlZiBDT05GSUdfVVg1MDBfU09DX0RCODUwMAotYm9vbCBjcHVfaXNfdTg1MDB2MTAodm9pZCk7Ci1ib29sIGNwdV9pc191ODUwMHYxMSh2b2lkKTsKLWJvb2wgY3B1X2lzX3U4NTAwdjIwKHZvaWQpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgYm9vbCBjcHVfaXNfdTg1MDB2MTAodm9pZCkgeyByZXR1cm4gZmFsc2U7IH0KLXN0YXRpYyBpbmxpbmUgYm9vbCBjcHVfaXNfdTg1MDB2MTEodm9pZCkgeyByZXR1cm4gZmFsc2U7IH0KLXN0YXRpYyBpbmxpbmUgYm9vbCBjcHVfaXNfdTg1MDB2MjAodm9pZCkgeyByZXR1cm4gZmFsc2U7IH0KLSNlbmRpZgotCi1zdGF0aWMgaW5saW5lIGJvb2wgY3B1X2lzX3U1NTAwKHZvaWQpCi17Ci0jaWZkZWYgQ09ORklHX1VYNTAwX1NPQ19EQjU1MDAKLQlyZXR1cm4gMTsKLSNlbHNlCi0JcmV0dXJuIDA7Ci0jZW5kaWYKLX0KKyNpbmNsdWRlIDxtYWNoL2lkLmg+CiAKICNkZWZpbmUgQVJSQVlfQU5EX1NJWkUoeCkJKHgpLCBBUlJBWV9TSVpFKHgpCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL2lkLmggYi9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC9pZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMjg4ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC9pZC5oCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIFNULUVyaWNzc29uIFNBIDIwMTAKKyAqCisgKiBBdXRob3I6IFJhYmluIFZpbmNlbnQgPHJhYmluLnZpbmNlbnRAc3Rlcmljc3Nvbi5jb20+IGZvciBTVC1Fcmljc3NvbgorICogTGljZW5zZSB0ZXJtczogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgdmVyc2lvbiAyCisgKi8KKworI2lmbmRlZiBfX01BQ0hfVVg1MDBfSUQKKyNkZWZpbmUgX19NQUNIX1VYNTAwX0lECisKKy8qKgorICogc3RydWN0IGRieDUwMF9hc2ljX2lkIC0gZmllbGRzIG9mIHRoZSBBU0lDIElECisgKiBAcHJvY2VzczogdGhlIG1hbnVmYWN0dXJpbmcgcHJvY2VzcywgMHg0MCBpcyA0MCBubSAweDAwIGlzICJzdGFuZGFyZCIKKyAqIEBwYXJ0bnVtYmVyOiBoaXRoZXJldG8gMHg4NTAwIGZvciBEQjg1MDAKKyAqIEByZXZpc2lvbjogdmVyc2lvbiBjb2RlIGluIHRoZSBzZXJpZXMKKyAqLworc3RydWN0IGRieDUwMF9hc2ljX2lkIHsKKwl1MTYJcGFydG51bWJlcjsKKwl1OAlyZXZpc2lvbjsKKwl1OAlwcm9jZXNzOworfTsKKworZXh0ZXJuIHN0cnVjdCBkYng1MDBfYXNpY19pZCBkYng1MDBfaWQ7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX2NvbnN0X18gZGJ4NTAwX3BhcnRudW1iZXIodm9pZCkKK3sKKwlyZXR1cm4gZGJ4NTAwX2lkLnBhcnRudW1iZXI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX2NvbnN0X18gZGJ4NTAwX3JldmlzaW9uKHZvaWQpCit7CisJcmV0dXJuIGRieDUwMF9pZC5yZXZpc2lvbjsKK30KKworLyoKKyAqIFNPQ3MKKyAqLworCitzdGF0aWMgaW5saW5lIGJvb2wgX19hdHRyaWJ1dGVfY29uc3RfXyBjcHVfaXNfdTg1MDAodm9pZCkKK3sKKwlyZXR1cm4gZGJ4NTAwX3BhcnRudW1iZXIoKSA9PSAweDg1MDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBfX2F0dHJpYnV0ZV9jb25zdF9fIGNwdV9pc191NTUwMCh2b2lkKQoreworCXJldHVybiBkYng1MDBfcGFydG51bWJlcigpID09IDB4NTUwMDsKK30KKworLyoKKyAqIDg1MDAgcmV2aXNpb25zCisgKi8KKworc3RhdGljIGlubGluZSBib29sIF9fYXR0cmlidXRlX2NvbnN0X18gY3B1X2lzX3U4NTAwZWQodm9pZCkKK3sKKwlyZXR1cm4gY3B1X2lzX3U4NTAwKCkgJiYgZGJ4NTAwX3JldmlzaW9uKCkgPT0gMHgwMDsKK30KKworc3RhdGljIGlubGluZSBib29sIF9fYXR0cmlidXRlX2NvbnN0X18gY3B1X2lzX3U4NTAwdjEodm9pZCkKK3sKKwlyZXR1cm4gY3B1X2lzX3U4NTAwKCkgJiYgKGRieDUwMF9yZXZpc2lvbigpICYgMHhmMCkgPT0gMHhBMDsKK30KKworc3RhdGljIGlubGluZSBib29sIF9fYXR0cmlidXRlX2NvbnN0X18gY3B1X2lzX3U4NTAwdjEwKHZvaWQpCit7CisJcmV0dXJuIGNwdV9pc191ODUwMCgpICYmIGRieDUwMF9yZXZpc2lvbigpID09IDB4QTA7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBfX2F0dHJpYnV0ZV9jb25zdF9fIGNwdV9pc191ODUwMHYxMSh2b2lkKQoreworCXJldHVybiBjcHVfaXNfdTg1MDAoKSAmJiBkYng1MDBfcmV2aXNpb24oKSA9PSAweEExOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgX19hdHRyaWJ1dGVfY29uc3RfXyBjcHVfaXNfdTg1MDB2Mih2b2lkKQoreworCXJldHVybiBjcHVfaXNfdTg1MDAoKSAmJiAoKGRieDUwMF9yZXZpc2lvbigpICYgMHhmMCkgPT0gMHhCMCk7Cit9CisKKyNkZWZpbmUgdXg1MDBfdW5rbm93bl9zb2MoKQlCVUcoKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL2lycXMuaCBiL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL2lycXMuaAppbmRleCA4ODBhZTQ1Li5iYTEyOTRjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC9pcnFzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvaXJxcy5oCkBAIC0zNiw3ICszNiw3IEBACiAvKiBUaGlzIHdpbGwgYmUgb3ZlcnJpZGRlbiBieSBib2FyZC1zcGVjaWZpYyBpcnEgaGVhZGVycyAqLwogI2RlZmluZSBJUlFfQk9BUkRfRU5ECQkJSVJRX0JPQVJEX1NUQVJUCiAKLSNpZmRlZiBDT05GSUdfTUFDSF9VODUwMF9NT1AKKyNpZmRlZiBDT05GSUdfTUFDSF9VODUwMAogI2luY2x1ZGUgPG1hY2gvaXJxcy1ib2FyZC1tb3A1MDAuaD4KICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC9zZXR1cC5oIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvc2V0dXAuaAppbmRleCA0Njk4NzdlLi5hN2QzNjNmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC9zZXR1cC5oCisrKyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL3NldHVwLmgKQEAgLTE0LDcgKzE0LDcgQEAKICNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCi1leHRlcm4gdm9pZCBfX2luaXQgdXg1MDBfbWFwX2lvKHZvaWQpOwordm9pZCBfX2luaXQgdXg1MDBfbWFwX2lvKHZvaWQpOwogZXh0ZXJuIHZvaWQgX19pbml0IHU1NTAwX21hcF9pbyh2b2lkKTsKIGV4dGVybiB2b2lkIF9faW5pdCB1ODUwMF9tYXBfaW8odm9pZCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvbW9kZW0taXJxLWRiNTUwMC5jIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9tb2RlbS1pcnEtZGI1NTAwLmMKaW5kZXggMzE4N2Y4OC4uZTEyOTZhNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11eDUwMC9tb2RlbS1pcnEtZGI1NTAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9tb2RlbS1pcnEtZGI1NTAwLmMKQEAgLTEyLDYgKzEyLDggQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAorI2luY2x1ZGUgPG1hY2gvaWQuaD4KKwogI2RlZmluZSBNT0RFTV9JTlRDT05fQkFTRV9BRERSIDB4QkZGRDMwMDAKICNkZWZpbmUgTU9ERU1fSU5UQ09OX1NJWkUgMHhGRkYKIApAQCAtMTAxLDYgKzEwMyw5IEBACiAJc3RhdGljIHN0cnVjdCBpcnFfY2hpcCAgbW9kZW1faXJxX2NoaXA7CiAJc3RydWN0IG1vZGVtX2lycSAqbWk7CiAKKwlpZiAoIWNwdV9pc191NTUwMCgpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwogCXByX2luZm8oIm1vZGVtX2lycTogU2V0IHVwIElSUSBoYW5kbGVyIGZvciBpbmNvbWluZyBtb2RlbSBJUlEgJWRcbiIsCiAJCSAgIElSUV9EQjU1MDBfTU9ERU0pOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXV4NTAwL3BsYXRzbXAuYyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvcGxhdHNtcC5jCmluZGV4IGQ3N2U3NmMuLjRmZmY0ZDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdXg1MDAvcGxhdHNtcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvcGxhdHNtcC5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KICNpbmNsdWRlIDxhc20vc21wX3NjdS5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL3NldHVwLmg+CiAKIC8qCiAgKiBjb250cm9sIGZvciB3aGljaCBjb3JlIGlzIHRoZSBuZXh0IHRvIGNvbWUgb3V0IG9mIHRoZSBzZWNvbmRhcnkKQEAgLTQwLDYgKzQxLDE4IEBACiAJb3V0ZXJfY2xlYW5fcmFuZ2UoX19wYSgmcGVuX3JlbGVhc2UpLCBfX3BhKCZwZW5fcmVsZWFzZSArIDEpKTsKIH0KIAorc3RhdGljIHZvaWQgX19pb21lbSAqc2N1X2Jhc2VfYWRkcih2b2lkKQoreworCWlmIChjcHVfaXNfdTU1MDAoKSkKKwkJcmV0dXJuIF9faW9fYWRkcmVzcyhVNTUwMF9TQ1VfQkFTRSk7CisJZWxzZSBpZiAoY3B1X2lzX3U4NTAwKCkpCisJCXJldHVybiBfX2lvX2FkZHJlc3MoVTg1MDBfU0NVX0JBU0UpOworCWVsc2UKKwkJdXg1MDBfdW5rbm93bl9zb2MoKTsKKworCXJldHVybiBOVUxMOworfQorCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGJvb3RfbG9jayk7CiAKIHZvaWQgX19jcHVpbml0IHBsYXRmb3JtX3NlY29uZGFyeV9pbml0KHVuc2lnbmVkIGludCBjcHUpCkBAIC0xMDAsMjEgKzExMywyOCBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgd2FrZXVwX3NlY29uZGFyeSh2b2lkKQogeworCXZvaWQgX19pb21lbSAqYmFja3VwcmFtOworCisJaWYgKGNwdV9pc191NTUwMCgpKQorCQliYWNrdXByYW0gPSBfX2lvX2FkZHJlc3MoVTU1MDBfQkFDS1VQUkFNMF9CQVNFKTsKKwllbHNlIGlmIChjcHVfaXNfdTg1MDAoKSkKKwkJYmFja3VwcmFtID0gX19pb19hZGRyZXNzKFU4NTAwX0JBQ0tVUFJBTTBfQkFTRSk7CisJZWxzZQorCQl1eDUwMF91bmtub3duX3NvYygpOworCiAJLyoKIAkgKiB3cml0ZSB0aGUgYWRkcmVzcyBvZiBzZWNvbmRhcnkgc3RhcnR1cCBpbnRvIHRoZSBiYWNrdXAgcmFtIHJlZ2lzdGVyCiAJICogYXQgb2Zmc2V0IDB4MUZGNCwgdGhlbiB3cml0ZSB0aGUgbWFnaWMgbnVtYmVyIDB4QTFGRUVEMDEgdG8gdGhlCiAJICogYmFja3VwIHJhbSByZWdpc3RlciBhdCBvZmZzZXQgMHgxRkYwLCB3aGljaCBpcyB3aGF0IGJvb3Qgcm9tIGNvZGUKIAkgKiBpcyB3YWl0aW5nIGZvci4gVGhpcyB3b3VsZCB3YWtlIHVwIHRoZSBzZWNvbmRhcnkgY29yZSBmcm9tIFdGRQogCSAqLwotI2RlZmluZSBVODUwMF9DUFUxX0pVTVBBRERSX09GRlNFVCAweDFGRjQKKyNkZWZpbmUgVVg1MDBfQ1BVMV9KVU1QQUREUl9PRkZTRVQgMHgxRkY0CiAJX19yYXdfd3JpdGVsKHZpcnRfdG9fcGh5cyh1ODUwMF9zZWNvbmRhcnlfc3RhcnR1cCksCi0JCV9faW9fYWRkcmVzcyhVWDUwMF9CQUNLVVBSQU0wX0JBU0UpICsKLQkJVTg1MDBfQ1BVMV9KVU1QQUREUl9PRkZTRVQpOworCQkgICAgIGJhY2t1cHJhbSArIFVYNTAwX0NQVTFfSlVNUEFERFJfT0ZGU0VUKTsKIAotI2RlZmluZSBVODUwMF9DUFUxX1dBS0VNQUdJQ19PRkZTRVQgMHgxRkYwCisjZGVmaW5lIFVYNTAwX0NQVTFfV0FLRU1BR0lDX09GRlNFVCAweDFGRjAKIAlfX3Jhd193cml0ZWwoMHhBMUZFRUQwMSwKLQkJX19pb19hZGRyZXNzKFVYNTAwX0JBQ0tVUFJBTTBfQkFTRSkgKwotCQlVODUwMF9DUFUxX1dBS0VNQUdJQ19PRkZTRVQpOworCQkgICAgIGJhY2t1cHJhbSArIFVYNTAwX0NQVTFfV0FLRU1BR0lDX09GRlNFVCk7CiAKIAkvKiBtYWtlIHN1cmUgd3JpdGUgYnVmZmVyIGlzIGRyYWluZWQgKi8KIAltYigpOwpAQCAtMTI2LDkgKzE0NiwxMCBAQAogICovCiB2b2lkIF9faW5pdCBzbXBfaW5pdF9jcHVzKHZvaWQpCiB7CisJdm9pZCBfX2lvbWVtICpzY3VfYmFzZSA9IHNjdV9iYXNlX2FkZHIoKTsKIAl1bnNpZ25lZCBpbnQgaSwgbmNvcmVzOwogCi0JbmNvcmVzID0gc2N1X2dldF9jb3JlX2NvdW50KF9faW9fYWRkcmVzcyhVWDUwMF9TQ1VfQkFTRSkpOworCW5jb3JlcyA9IHNjdV9iYXNlID8gc2N1X2dldF9jb3JlX2NvdW50KHNjdV9iYXNlKSA6IDE7CiAKIAkvKiBzYW5pdHkgY2hlY2sgKi8KIAlpZiAobmNvcmVzID4gTlJfQ1BVUykgewpAQCAtMTU0LDYgKzE3NSw2IEBACiAJZm9yIChpID0gMDsgaSA8IG1heF9jcHVzOyBpKyspCiAJCXNldF9jcHVfcHJlc2VudChpLCB0cnVlKTsKIAotCXNjdV9lbmFibGUoX19pb19hZGRyZXNzKFVYNTAwX1NDVV9CQVNFKSk7CisJc2N1X2VuYWJsZShzY3VfYmFzZV9hZGRyKCkpOwogCXdha2V1cF9zZWNvbmRhcnkoKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9jcHUtZnJlcS5jIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2NwdS1mcmVxLmMKaW5kZXggMWVjYzE1Yi4uMjVhOGZjNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2NwdS1mcmVxLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2NwdS1mcmVxLmMKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgotI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9hY3BpLmMgYi9hcmNoL2lhNjQva2VybmVsL2FjcGkuYwppbmRleCBjNmM5MGYzLi43Yjg5N2I3IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2FjcGkuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2FjcGkuYwpAQCAtNDc3LDYgKzQ3NywxMiBAQAogCWlmICghKHBhLT5mbGFncyAmIEFDUElfU1JBVF9DUFVfRU5BQkxFRCkpCiAJCXJldHVybjsKIAorCWlmIChzcmF0X251bV9jcHVzID49IEFSUkFZX1NJWkUobm9kZV9jcHVpZCkpIHsKKwkJcHJpbnRrX29uY2UoS0VSTl9XQVJOSU5HCisJCQkgICAgIm5vZGVfY3B1aWRbJWRdIGlzIHRvbyBzbWFsbCwgbWF5IG5vdCBiZSBhYmxlIHRvIHVzZSBhbGwgY3B1c1xuIiwKKwkJCSAgICBBUlJBWV9TSVpFKG5vZGVfY3B1aWQpKTsKKwkJcmV0dXJuOworCX0KIAlweG0gPSBnZXRfcHJvY2Vzc29yX3Byb3hpbWl0eV9kb21haW4ocGEpOwogCiAJLyogcmVjb3JkIHRoaXMgbm9kZSBpbiBwcm94aW1pdHkgYml0bWFwICovCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2lycV9pYTY0LmMgYi9hcmNoL2lhNjQva2VybmVsL2lycV9pYTY0LmMKaW5kZXggOWEyNjAxNS4uMzhjMDdiOCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9pcnFfaWE2NC5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvaXJxX2lhNjQuYwpAQCAtNjMzLDcgKzYzMyw3IEBACiAJQlVHX09OKGJpbmRfaXJxX3ZlY3RvcihpcnEsIHZlYywgQ1BVX01BU0tfQUxMKSk7CiAJZGVzYyA9IGlycV9kZXNjICsgaXJxOwogCWRlc2MtPnN0YXR1cyB8PSBJUlFfUEVSX0NQVTsKLQlkZXNjLT5jaGlwID0gJmlycV90eXBlX2lhNjRfbHNhcGljOworCXNldF9pcnFfY2hpcChpcnEsICZpcnFfdHlwZV9pYTY0X2xzYXBpYyk7CiAJaWYgKGFjdGlvbikKIAkJc2V0dXBfaXJxKGlycSwgYWN0aW9uKTsKIAlzZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfcGVyY3B1X2lycSk7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3BlcmZtb24uYyBiL2FyY2gvaWE2NC9rZXJuZWwvcGVyZm1vbi5jCmluZGV4IGYwOTliODIuLmQ5MmQ1YjUgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvcGVyZm1vbi5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvcGVyZm1vbi5jCkBAIC04MjksMTAgKzgyOSw5IEBACiAJdW5zaWduZWQgbG9uZyBhZGRyOwogCiAJc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZSk7Ci0JbWVtICA9IHZtYWxsb2Moc2l6ZSk7CisJbWVtICA9IHZ6YWxsb2Moc2l6ZSk7CiAJaWYgKG1lbSkgewogCQkvL3ByaW50aygicGVyZm1vbjogQ1BVJWQgcGZtX3J2bWFsbG9jKCVsZCk9JXBcbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSwgc2l6ZSwgbWVtKTsKLQkJbWVtc2V0KG1lbSwgMCwgc2l6ZSk7CiAJCWFkZHIgPSAodW5zaWduZWQgbG9uZyltZW07CiAJCXdoaWxlIChzaXplID4gMCkgewogCQkJcGZtX3Jlc2VydmVfcGFnZShhZGRyKTsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvc21wLmMgYi9hcmNoL2lhNjQva2VybmVsL3NtcC5jCmluZGV4IGRhYmVlZmUyLi5iZTQ1MGEzIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvc21wLmMKQEAgLTI5Myw2ICsyOTMsNyBAQAogdm9pZAogc21wX2ZsdXNoX3RsYl9tbSAoc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7CisJY3B1bWFza192YXJfdCBjcHVzOwogCXByZWVtcHRfZGlzYWJsZSgpOwogCS8qIHRoaXMgaGFwcGVucyBmb3IgdGhlIGNvbW1vbiBjYXNlIG9mIGEgc2luZ2xlLXRocmVhZGVkIGZvcmsoKTogICovCiAJaWYgKGxpa2VseShtbSA9PSBjdXJyZW50LT5hY3RpdmVfbW0gJiYgYXRvbWljX3JlYWQoJm1tLT5tbV91c2VycykgPT0gMSkpCkBAIC0zMDEsOSArMzAyLDE1IEBACiAJCXByZWVtcHRfZW5hYmxlKCk7CiAJCXJldHVybjsKIAl9Ci0KLQlzbXBfY2FsbF9mdW5jdGlvbl9tYW55KG1tX2NwdW1hc2sobW0pLAotCQkodm9pZCAoKikodm9pZCAqKSlsb2NhbF9maW5pc2hfZmx1c2hfdGxiX21tLCBtbSwgMSk7CisJaWYgKCFhbGxvY19jcHVtYXNrX3ZhcigmY3B1cywgR0ZQX0FUT01JQykpIHsKKwkJc21wX2NhbGxfZnVuY3Rpb24oKHZvaWQgKCopKHZvaWQgKikpbG9jYWxfZmluaXNoX2ZsdXNoX3RsYl9tbSwKKwkJCW1tLCAxKTsKKwl9IGVsc2UgeworCQljcHVtYXNrX2NvcHkoY3B1cywgbW1fY3B1bWFzayhtbSkpOworCQlzbXBfY2FsbF9mdW5jdGlvbl9tYW55KGNwdXMsCisJCQkodm9pZCAoKikodm9pZCAqKSlsb2NhbF9maW5pc2hfZmx1c2hfdGxiX21tLCBtbSwgMSk7CisJCWZyZWVfY3B1bWFza192YXIoY3B1cyk7CisJfQogCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAJbG9jYWxfZmluaXNoX2ZsdXNoX3RsYl9tbShtbSk7CiAJbG9jYWxfaXJxX2VuYWJsZSgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC90aW1lLmMgYi9hcmNoL2lhNjQva2VybmVsL3RpbWUuYwppbmRleCBlZDZmMjJlLi45NzAyZmE5IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3RpbWUuYworKysgYi9hcmNoL2lhNjQva2VybmVsL3RpbWUuYwpAQCAtMTY4LDcgKzE2OCw3IEBACiB7CiAJdW5zaWduZWQgbG9uZyBuZXdfaXRtOwogCi0JaWYgKHVubGlrZWx5KGNwdV9pc19vZmZsaW5lKHNtcF9wcm9jZXNzb3JfaWQoKSkpKSB7CisJaWYgKGNwdV9pc19vZmZsaW5lKHNtcF9wcm9jZXNzb3JfaWQoKSkpIHsKIAkJcmV0dXJuIElSUV9IQU5ETEVEOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3N1bjNfcGd0YWJsZS5oIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3N1bjNfcGd0YWJsZS5oCmluZGV4IGNmNWZhZDkuLmY1NWFhMDQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9zdW4zX3BndGFibGUuaAorKysgYi9hcmNoL202OGsvaW5jbHVkZS9hc20vc3VuM19wZ3RhYmxlLmgKQEAgLTIxNyw5ICsyMTcsOCBAQAogLyogRmluZCBhbiBlbnRyeSBpbiB0aGUgdGhpcmQtbGV2ZWwgcGFnZXRhYmxlLiAqLwogI2RlZmluZSBwdGVfaW5kZXgoYWRkcmVzcykgKChhZGRyZXNzID4+IFBBR0VfU0hJRlQpICYgKFBUUlNfUEVSX1BURS0xKSkKICNkZWZpbmUgcHRlX29mZnNldF9rZXJuZWwocG1kLCBhZGRyZXNzKSAoKHB0ZV90ICopIF9fcG1kX3BhZ2UoKnBtZCkgKyBwdGVfaW5kZXgoYWRkcmVzcykpCi0vKiBGSVhNRTogc2hvdWxkIHdlIGJvdGhlciB3aXRoIGttYXAoKSBoZXJlPyAqLwotI2RlZmluZSBwdGVfb2Zmc2V0X21hcChwbWQsIGFkZHJlc3MpICgocHRlX3QgKilrbWFwKHBtZF9wYWdlKCpwbWQpKSArIHB0ZV9pbmRleChhZGRyZXNzKSkKLSNkZWZpbmUgcHRlX3VubWFwKHB0ZSkga3VubWFwKHB0ZSkKKyNkZWZpbmUgcHRlX29mZnNldF9tYXAocG1kLCBhZGRyZXNzKSAoKHB0ZV90ICopcGFnZV9hZGRyZXNzKHBtZF9wYWdlKCpwbWQpKSArIHB0ZV9pbmRleChhZGRyZXNzKSkKKyNkZWZpbmUgcHRlX3VubWFwKHB0ZSkgZG8geyB9IHdoaWxlICgwKQogCiAvKiBNYWNyb3MgdG8gKGRlKWNvbnN0cnVjdCB0aGUgZmFrZSBQVEVzIHJlcHJlc2VudGluZyBzd2FwIHBhZ2VzLiAqLwogI2RlZmluZSBfX3N3cF90eXBlKHgpCQkoKHgpLnZhbCAmIDB4N0YpCmRpZmYgLS1naXQgYS9hcmNoL202OGsvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaCBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCmluZGV4IDFkYTVkNTMuLjc5MDk4ODkgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCisrKyBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCkBAIC0xMDQsNSArMTA0LDYgQEAKICNkZWZpbmUgVElGX1NZU0NBTExfVFJBQ0UJMTUJLyogc3lzY2FsbCB0cmFjZSBhY3RpdmUgKi8KICNkZWZpbmUgVElGX01FTURJRQkJMTYJLyogaXMgdGVybWluYXRpbmcgZHVlIHRvIE9PTSBraWxsZXIgKi8KICNkZWZpbmUgVElGX0ZSRUVaRQkJMTcJLyogdGhyZWFkIGlzIGZyZWV6aW5nIGZvciBzdXNwZW5kICovCisjZGVmaW5lIFRJRl9SRVNUT1JFX1NJR01BU0sJMTgJLyogcmVzdG9yZSBzaWduYWwgbWFzayBpbiBkb19zaWduYWwgKi8KIAogI2VuZGlmCS8qIF9BU01fTTY4S19USFJFQURfSU5GT19IICovCmRpZmYgLS1naXQgYS9hcmNoL202OGsvaW5jbHVkZS9hc20vdW5pc3RkLmggYi9hcmNoL202OGsvaW5jbHVkZS9hc20vdW5pc3RkLmgKaW5kZXggYjQzYjM2Yi4uMjZkODUxZCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3VuaXN0ZC5oCisrKyBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS91bmlzdGQuaApAQCAtMzczLDYgKzM3Myw3IEBACiAjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19TSUdQRU5ESU5HCiAjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19TSUdQUk9DTUFTSwogI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfUlRfU0lHQUNUSU9OCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19SVF9TSUdTVVNQRU5ECiAKIC8qCiAgKiAiQ29uZGl0aW9uYWwiIHN5c2NhbGxzCmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL2VudHJ5LlMgYi9hcmNoL202OGsva2VybmVsL2VudHJ5LlMKaW5kZXggNjM2MGM0My4uMTU1OWRlYSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvZW50cnkuUwpAQCAtOTksNyArOTksMTAgQEAKIAlqcmEJLkxyZXRfZnJvbV9leGNlcHRpb24KIAogRU5UUlkocmV0X2Zyb21fc2lnbmFsKQotCVJFU1RPUkVfU1dJVENIX1NUQUNLCisJdHN0YgklY3VycHRyQChUQVNLX0lORk8rVElORk9fRkxBR1MrMikKKwlqZ2UJMWYKKwlqYnNyCXN5c2NhbGxfdHJhY2UKKzE6CVJFU1RPUkVfU1dJVENIX1NUQUNLCiAJYWRkcWwJIzQsJXNwCiAvKiBvbiA2ODA0MCBjb21wbGV0ZSBwZW5kaW5nIHdyaXRlYmFja3MgaWYgYW55ICovCiAjaWZkZWYgQ09ORklHX002ODA0MApAQCAtMTc0LDE2ICsxNzcsMTEgQEAKIAlzdWJxbAkjNCwlc3AJCQl8IGR1bW15IHJldHVybiBhZGRyZXNzCiAJU0FWRV9TV0lUQ0hfU1RBQ0sKIAlwZWEJJXNwQChTV0lUQ0hfU1RBQ0tfU0laRSkKLQljbHJsCSVzcEAtCiAJYnNybAlkb19zaWduYWwKLQlhZGRxbAkjOCwlc3AKKwlhZGRxbAkjNCwlc3AKIAlSRVNUT1JFX1NXSVRDSF9TVEFDSwogCWFkZHFsCSM0LCVzcAotCXRzdGwJJWQwCi0JamVxCXJlc3VtZV91c2Vyc3BhY2UKLQl8IHdoZW4gc2luZ2xlIHN0ZXBwaW5nIGludG8gaGFuZGxlciBzdG9wIGF0IHRoZSBmaXJzdCBpbnNuCi0JYnRzdAkjNiwlY3VycHRyQChUQVNLX0lORk8rVElORk9fRkxBR1MrMikKLQlqZXEJcmVzdW1lX3VzZXJzcGFjZQorCWpicmEJcmVzdW1lX3VzZXJzcGFjZQogCiBkb19kZWxheWVkX3RyYWNlOgogCWJjbHIJIzcsJXNwQChQVF9PRkZfU1IpCXwgY2xlYXIgdHJhY2UgYml0IGluIFNSCkBAIC0yOTAsMjIgKzI4OCw2IEBACiAJUkVTVE9SRV9TV0lUQ0hfU1RBQ0sKIAlydHMKIAotRU5UUlkoc3lzX3NpZ3N1c3BlbmQpCi0JU0FWRV9TV0lUQ0hfU1RBQ0sKLQlwZWEJJXNwQChTV0lUQ0hfU1RBQ0tfU0laRSkKLQlqYnNyCWRvX3NpZ3N1c3BlbmQKLQlhZGRxbAkjNCwlc3AKLQlSRVNUT1JFX1NXSVRDSF9TVEFDSwotCXJ0cwotCi1FTlRSWShzeXNfcnRfc2lnc3VzcGVuZCkKLQlTQVZFX1NXSVRDSF9TVEFDSwotCXBlYQklc3BAKFNXSVRDSF9TVEFDS19TSVpFKQotCWpic3IJZG9fcnRfc2lnc3VzcGVuZAotCWFkZHFsCSM0LCVzcAotCVJFU1RPUkVfU1dJVENIX1NUQUNLCi0JcnRzCi0KIEVOVFJZKHN5c19zaWdyZXR1cm4pCiAJU0FWRV9TV0lUQ0hfU1RBQ0sKIAlqYnNyCWRvX3NpZ3JldHVybgpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvbTY4ay9rZXJuZWwvc2lnbmFsLmMKaW5kZXggNGIzODc1My4uZDEyYzNiMCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL202OGsva2VybmVsL3NpZ25hbC5jCkBAIC01MSw4ICs1MSw2IEBACiAKICNkZWZpbmUgX0JMT0NLQUJMRSAofihzaWdtYXNrKFNJR0tJTEwpIHwgc2lnbWFzayhTSUdTVE9QKSkpCiAKLWFzbWxpbmthZ2UgaW50IGRvX3NpZ25hbChzaWdzZXRfdCAqb2xkc2V0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci0KIGNvbnN0IGludCBmcmFtZV9leHRyYV9zaXplc1sxNl0gPSB7CiAgIFsxXQk9IC0xLCAvKiBzaXplb2YoKChzdHJ1Y3QgZnJhbWUgKikwKS0+dW4uZm10MSksICovCiAgIFsyXQk9IHNpemVvZigoKHN0cnVjdCBmcmFtZSAqKTApLT51bi5mbXQyKSwKQEAgLTc0LDUxICs3MiwyMSBAQAogLyoKICAqIEF0b21pY2FsbHkgc3dhcCBpbiB0aGUgbmV3IHNpZ25hbCBtYXNrLCBhbmQgd2FpdCBmb3IgYSBzaWduYWwuCiAgKi8KLWFzbWxpbmthZ2UgaW50IGRvX3NpZ3N1c3BlbmQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCithc21saW5rYWdlIGludAorc3lzX3NpZ3N1c3BlbmQoaW50IHVudXNlZDAsIGludCB1bnVzZWQxLCBvbGRfc2lnc2V0X3QgbWFzaykKIHsKLQlvbGRfc2lnc2V0X3QgbWFzayA9IHJlZ3MtPmQzOwotCXNpZ3NldF90IHNhdmVzZXQ7Ci0KIAltYXNrICY9IF9CTE9DS0FCTEU7Ci0Jc2F2ZXNldCA9IGN1cnJlbnQtPmJsb2NrZWQ7CisJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJY3VycmVudC0+c2F2ZWRfc2lnbWFzayA9IGN1cnJlbnQtPmJsb2NrZWQ7CiAJc2lnaW5pdHNldCgmY3VycmVudC0+YmxvY2tlZCwgbWFzayk7CiAJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwogCi0JcmVncy0+ZDAgPSAtRUlOVFI7Ci0Jd2hpbGUgKDEpIHsKLQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0JCXNjaGVkdWxlKCk7Ci0JCWlmIChkb19zaWduYWwoJnNhdmVzZXQsIHJlZ3MpKQotCQkJcmV0dXJuIC1FSU5UUjsKLQl9Ci19CisJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJc2NoZWR1bGUoKTsKKwlzZXRfcmVzdG9yZV9zaWdtYXNrKCk7CiAKLWFzbWxpbmthZ2UgaW50Ci1kb19ydF9zaWdzdXNwZW5kKHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXNpZ3NldF90IF9fdXNlciAqdW5ld3NldCA9IChzaWdzZXRfdCBfX3VzZXIgKilyZWdzLT5kMTsKLQlzaXplX3Qgc2lnc2V0c2l6ZSA9IChzaXplX3QpcmVncy0+ZDI7Ci0Jc2lnc2V0X3Qgc2F2ZXNldCwgbmV3c2V0OwotCi0JLyogWFhYOiBEb24ndCBwcmVjbHVkZSBoYW5kbGluZyBkaWZmZXJlbnQgc2l6ZWQgc2lnc2V0X3Qncy4gICovCi0JaWYgKHNpZ3NldHNpemUgIT0gc2l6ZW9mKHNpZ3NldF90KSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJm5ld3NldCwgdW5ld3NldCwgc2l6ZW9mKG5ld3NldCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlzaWdkZWxzZXRtYXNrKCZuZXdzZXQsIH5fQkxPQ0tBQkxFKTsKLQotCXNhdmVzZXQgPSBjdXJyZW50LT5ibG9ja2VkOwotCWN1cnJlbnQtPmJsb2NrZWQgPSBuZXdzZXQ7Ci0JcmVjYWxjX3NpZ3BlbmRpbmcoKTsKLQotCXJlZ3MtPmQwID0gLUVJTlRSOwotCXdoaWxlICgxKSB7Ci0JCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwotCQlzY2hlZHVsZSgpOwotCQlpZiAoZG9fc2lnbmFsKCZzYXZlc2V0LCByZWdzKSkKLQkJCXJldHVybiAtRUlOVFI7Ci0JfQorCXJldHVybiAtRVJFU1RBUlROT0hBTkQ7CiB9CiAKIGFzbWxpbmthZ2UgaW50CkBAIC0xMzIsMTAgKzEwMCwxMCBAQAogCQlvbGRfc2lnc2V0X3QgbWFzazsKIAkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGFjdCwgc2l6ZW9mKCphY3QpKSB8fAogCQkgICAgX19nZXRfdXNlcihuZXdfa2Euc2Euc2FfaGFuZGxlciwgJmFjdC0+c2FfaGFuZGxlcikgfHwKLQkJICAgIF9fZ2V0X3VzZXIobmV3X2thLnNhLnNhX3Jlc3RvcmVyLCAmYWN0LT5zYV9yZXN0b3JlcikpCisJCSAgICBfX2dldF91c2VyKG5ld19rYS5zYS5zYV9yZXN0b3JlciwgJmFjdC0+c2FfcmVzdG9yZXIpIHx8CisJCSAgICBfX2dldF91c2VyKG5ld19rYS5zYS5zYV9mbGFncywgJmFjdC0+c2FfZmxhZ3MpIHx8CisJCSAgICBfX2dldF91c2VyKG1hc2ssICZhY3QtPnNhX21hc2spKQogCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCV9fZ2V0X3VzZXIobmV3X2thLnNhLnNhX2ZsYWdzLCAmYWN0LT5zYV9mbGFncyk7Ci0JCV9fZ2V0X3VzZXIobWFzaywgJmFjdC0+c2FfbWFzayk7CiAJCXNpZ2luaXRzZXQoJm5ld19rYS5zYS5zYV9tYXNrLCBtYXNrKTsKIAl9CiAKQEAgLTE0NCwxMCArMTEyLDEwIEBACiAJaWYgKCFyZXQgJiYgb2FjdCkgewogCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIG9hY3QsIHNpemVvZigqb2FjdCkpIHx8CiAJCSAgICBfX3B1dF91c2VyKG9sZF9rYS5zYS5zYV9oYW5kbGVyLCAmb2FjdC0+c2FfaGFuZGxlcikgfHwKLQkJICAgIF9fcHV0X3VzZXIob2xkX2thLnNhLnNhX3Jlc3RvcmVyLCAmb2FjdC0+c2FfcmVzdG9yZXIpKQorCQkgICAgX19wdXRfdXNlcihvbGRfa2Euc2Euc2FfcmVzdG9yZXIsICZvYWN0LT5zYV9yZXN0b3JlcikgfHwKKwkJICAgIF9fcHV0X3VzZXIob2xkX2thLnNhLnNhX2ZsYWdzLCAmb2FjdC0+c2FfZmxhZ3MpIHx8CisJCSAgICBfX3B1dF91c2VyKG9sZF9rYS5zYS5zYV9tYXNrLnNpZ1swXSwgJm9hY3QtPnNhX21hc2spKQogCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCV9fcHV0X3VzZXIob2xkX2thLnNhLnNhX2ZsYWdzLCAmb2FjdC0+c2FfZmxhZ3MpOwotCQlfX3B1dF91c2VyKG9sZF9rYS5zYS5zYV9tYXNrLnNpZ1swXSwgJm9hY3QtPnNhX21hc2spOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC0zMTgsMzYgKzI4NiwxMCBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50Ci1yZXN0b3JlX3NpZ2NvbnRleHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqdXNjLCB2b2lkIF9fdXNlciAqZnAsCi0JCSAgIGludCAqcGQwKQorc3RhdGljIGludCBtYW5nbGVfa2VybmVsX3N0YWNrKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgZm9ybWF0dmVjLAorCQkJICAgICAgIHZvaWQgX191c2VyICpmcCkKIHsKLQlpbnQgZnNpemUsIGZvcm1hdHZlYzsKLQlzdHJ1Y3Qgc2lnY29udGV4dCBjb250ZXh0OwotCWludCBlcnI7Ci0KLQkvKiBBbHdheXMgbWFrZSBhbnkgcGVuZGluZyByZXN0YXJ0ZWQgc3lzdGVtIGNhbGxzIHJldHVybiAtRUlOVFIgKi8KLQljdXJyZW50X3RocmVhZF9pbmZvKCktPnJlc3RhcnRfYmxvY2suZm4gPSBkb19ub19yZXN0YXJ0X3N5c2NhbGw7Ci0KLQkvKiBnZXQgcHJldmlvdXMgY29udGV4dCAqLwotCWlmIChjb3B5X2Zyb21fdXNlcigmY29udGV4dCwgdXNjLCBzaXplb2YoY29udGV4dCkpKQotCQlnb3RvIGJhZGZyYW1lOwotCi0JLyogcmVzdG9yZSBwYXNzZWQgcmVnaXN0ZXJzICovCi0JcmVncy0+ZDEgPSBjb250ZXh0LnNjX2QxOwotCXJlZ3MtPmEwID0gY29udGV4dC5zY19hMDsKLQlyZWdzLT5hMSA9IGNvbnRleHQuc2NfYTE7Ci0JcmVncy0+c3IgPSAocmVncy0+c3IgJiAweGZmMDApIHwgKGNvbnRleHQuc2Nfc3IgJiAweGZmKTsKLQlyZWdzLT5wYyA9IGNvbnRleHQuc2NfcGM7Ci0JcmVncy0+b3JpZ19kMCA9IC0xOwkJLyogZGlzYWJsZSBzeXNjYWxsIGNoZWNrcyAqLwotCXdydXNwKGNvbnRleHQuc2NfdXNwKTsKLQlmb3JtYXR2ZWMgPSBjb250ZXh0LnNjX2Zvcm1hdHZlYzsKLQlyZWdzLT5mb3JtYXQgPSBmb3JtYXR2ZWMgPj4gMTI7Ci0JcmVncy0+dmVjdG9yID0gZm9ybWF0dmVjICYgMHhmZmY7Ci0KLQllcnIgPSByZXN0b3JlX2ZwdV9zdGF0ZSgmY29udGV4dCk7Ci0KLQlmc2l6ZSA9IGZyYW1lX2V4dHJhX3NpemVzW3JlZ3MtPmZvcm1hdF07CisJaW50IGZzaXplID0gZnJhbWVfZXh0cmFfc2l6ZXNbZm9ybWF0dmVjID4+IDEyXTsKIAlpZiAoZnNpemUgPCAwKSB7CiAJCS8qCiAJCSAqIHVzZXIgcHJvY2VzcyB0cnlpbmcgdG8gcmV0dXJuIHdpdGggd2VpcmQgZnJhbWUgZm9ybWF0CkBAIC0zNTUsMTYgKzI5NywyMiBAQAogI2lmZGVmIERFQlVHCiAJCXByaW50aygidXNlciBwcm9jZXNzIHJldHVybmluZyB3aXRoIHdlaXJkIGZyYW1lIGZvcm1hdFxuIik7CiAjZW5kaWYKLQkJZ290byBiYWRmcmFtZTsKKwkJcmV0dXJuIDE7CiAJfQotCi0JLyogT0suCU1ha2Ugcm9vbSBvbiB0aGUgc3VwZXJ2aXNvciBzdGFjayBmb3IgdGhlIGV4dHJhIGp1bmssCi0JICogaWYgbmVjZXNzYXJ5LgotCSAqLwotCi0JaWYgKGZzaXplKSB7CisJaWYgKCFmc2l6ZSkgeworCQlyZWdzLT5mb3JtYXQgPSBmb3JtYXR2ZWMgPj4gMTI7CisJCXJlZ3MtPnZlY3RvciA9IGZvcm1hdHZlYyAmIDB4ZmZmOworCX0gZWxzZSB7CiAJCXN0cnVjdCBzd2l0Y2hfc3RhY2sgKnN3ID0gKHN0cnVjdCBzd2l0Y2hfc3RhY2sgKilyZWdzIC0gMTsKLQkJcmVncy0+ZDAgPSBjb250ZXh0LnNjX2QwOworCQl1bnNpZ25lZCBsb25nIGJ1Zltmc2l6ZSAvIDJdOyAvKiB5ZXMsIHR3aWNlIGFzIG11Y2ggKi8KKworCQkvKiB0aGF0J2xsIG1ha2Ugc3VyZSB0aGF0IGV4cGFuc2lvbiB3b24ndCBjcmFwIG92ZXIgZGF0YSAqLworCQlpZiAoY29weV9mcm9tX3VzZXIoYnVmICsgZnNpemUgLyA0LCBmcCwgZnNpemUpKQorCQkJcmV0dXJuIDE7CisKKwkJLyogcG9pbnQgb2Ygbm8gcmV0dXJuICovCisJCXJlZ3MtPmZvcm1hdCA9IGZvcm1hdHZlYyA+PiAxMjsKKwkJcmVncy0+dmVjdG9yID0gZm9ybWF0dmVjICYgMHhmZmY7CiAjZGVmaW5lIGZyYW1lX29mZnNldCAoc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKStzaXplb2Yoc3RydWN0IHN3aXRjaF9zdGFjaykpCiAJCV9fYXNtX18gX192b2xhdGlsZV9fCiAJCQkoIiAgIG1vdmVsICUwLCUvYTBcblx0IgpAQCAtMzc2LDMwICszMjQsNTAgQEAKIAkJCSAiICAgbGVhICUvc3BAKCVjMyksJS9hMFxuXHQiIC8qIGFkZCBvZmZzZXQgb2YgZm10ICovCiAJCQkgIiAgIGxzcmwgICMyLCUxXG5cdCIKIAkJCSAiICAgc3VicWwgIzEsJTFcblx0IgotCQkJICIyOiBtb3Zlc2wgJTRAKywlMlxuXHQiCi0JCQkgIjM6IG1vdmVsICUyLCUvYTBAK1xuXHQiCisJCQkgLyogY29weSB0byB0aGUgZ2FwIHdlJ2QgbWFkZSAqLworCQkJICIyOiBtb3ZlbCAlNEArLCUvYTBAK1xuXHQiCiAJCQkgIiAgIGRicmEgJTEsMmJcblx0IgogCQkJICIgICBicmFsIHJldF9mcm9tX3NpZ25hbFxuIgotCQkJICI0OlxuIgotCQkJICIuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiXG4iCi0JCQkgIiAgIC5hbGlnbiA0XG4iCi0JCQkgIiAgIC5sb25nIDJiLDRiXG4iCi0JCQkgIiAgIC5sb25nIDNiLDRiXG4iCi0JCQkgIi5wcmV2aW91cyIKIAkJCSA6IC8qIG5vIG91dHB1dHMsIGl0IGRvZXNuJ3QgZXZlciByZXR1cm4gKi8KIAkJCSA6ICJhIiAoc3cpLCAiZCIgKGZzaXplKSwgImQiIChmcmFtZV9vZmZzZXQvNC0xKSwKLQkJCSAgICJuIiAoZnJhbWVfb2Zmc2V0KSwgImEiIChmcCkKKwkJCSAgICJuIiAoZnJhbWVfb2Zmc2V0KSwgImEiIChidWYgKyBmc2l6ZS80KQogCQkJIDogImEwIik7CiAjdW5kZWYgZnJhbWVfb2Zmc2V0Ci0JCS8qCi0JCSAqIElmIHdlIGV2ZXIgZ2V0IGhlcmUgYW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlCi0JCSAqIGJ1aWxkaW5nIHRoZSBhYm92ZSBzdGFjay1mcmFtZS4KLQkJICovCi0JCWdvdG8gYmFkZnJhbWU7CiAJfQorCXJldHVybiAwOworfQogCi0JKnBkMCA9IGNvbnRleHQuc2NfZDA7Ci0JcmV0dXJuIGVycjsKK3N0YXRpYyBpbmxpbmUgaW50CityZXN0b3JlX3NpZ2NvbnRleHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqdXNjLCB2b2lkIF9fdXNlciAqZnApCit7CisJaW50IGZvcm1hdHZlYzsKKwlzdHJ1Y3Qgc2lnY29udGV4dCBjb250ZXh0OworCWludCBlcnI7CisKKwkvKiBBbHdheXMgbWFrZSBhbnkgcGVuZGluZyByZXN0YXJ0ZWQgc3lzdGVtIGNhbGxzIHJldHVybiAtRUlOVFIgKi8KKwljdXJyZW50X3RocmVhZF9pbmZvKCktPnJlc3RhcnRfYmxvY2suZm4gPSBkb19ub19yZXN0YXJ0X3N5c2NhbGw7CisKKwkvKiBnZXQgcHJldmlvdXMgY29udGV4dCAqLworCWlmIChjb3B5X2Zyb21fdXNlcigmY29udGV4dCwgdXNjLCBzaXplb2YoY29udGV4dCkpKQorCQlnb3RvIGJhZGZyYW1lOworCisJLyogcmVzdG9yZSBwYXNzZWQgcmVnaXN0ZXJzICovCisJcmVncy0+ZDAgPSBjb250ZXh0LnNjX2QwOworCXJlZ3MtPmQxID0gY29udGV4dC5zY19kMTsKKwlyZWdzLT5hMCA9IGNvbnRleHQuc2NfYTA7CisJcmVncy0+YTEgPSBjb250ZXh0LnNjX2ExOworCXJlZ3MtPnNyID0gKHJlZ3MtPnNyICYgMHhmZjAwKSB8IChjb250ZXh0LnNjX3NyICYgMHhmZik7CisJcmVncy0+cGMgPSBjb250ZXh0LnNjX3BjOworCXJlZ3MtPm9yaWdfZDAgPSAtMTsJCS8qIGRpc2FibGUgc3lzY2FsbCBjaGVja3MgKi8KKwl3cnVzcChjb250ZXh0LnNjX3VzcCk7CisJZm9ybWF0dmVjID0gY29udGV4dC5zY19mb3JtYXR2ZWM7CisKKwllcnIgPSByZXN0b3JlX2ZwdV9zdGF0ZSgmY29udGV4dCk7CisKKwlpZiAoZXJyIHx8IG1hbmdsZV9rZXJuZWxfc3RhY2socmVncywgZm9ybWF0dmVjLCBmcCkpCisJCWdvdG8gYmFkZnJhbWU7CisKKwlyZXR1cm4gMDsKIAogYmFkZnJhbWU6CiAJcmV0dXJuIDE7CkBAIC00MDcsOSArMzc1LDkgQEAKIAogc3RhdGljIGlubGluZSBpbnQKIHJ0X3Jlc3RvcmVfdWNvbnRleHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCBzd2l0Y2hfc3RhY2sgKnN3LAotCQkgICAgc3RydWN0IHVjb250ZXh0IF9fdXNlciAqdWMsIGludCAqcGQwKQorCQkgICAgc3RydWN0IHVjb250ZXh0IF9fdXNlciAqdWMpCiB7Ci0JaW50IGZzaXplLCB0ZW1wOworCWludCB0ZW1wOwogCWdyZWdfdCBfX3VzZXIgKmdyZWdzID0gdWMtPnVjX21jb250ZXh0LmdyZWdzOwogCXVuc2lnbmVkIGxvbmcgdXNwOwogCWludCBlcnI7CkBAIC00NDMsNjUgKzQxMSwxNiBAQAogCXJlZ3MtPnNyID0gKHJlZ3MtPnNyICYgMHhmZjAwKSB8ICh0ZW1wICYgMHhmZik7CiAJcmVncy0+b3JpZ19kMCA9IC0xOwkJLyogZGlzYWJsZSBzeXNjYWxsIGNoZWNrcyAqLwogCWVyciB8PSBfX2dldF91c2VyKHRlbXAsICZ1Yy0+dWNfZm9ybWF0dmVjKTsKLQlyZWdzLT5mb3JtYXQgPSB0ZW1wID4+IDEyOwotCXJlZ3MtPnZlY3RvciA9IHRlbXAgJiAweGZmZjsKIAogCWVyciB8PSBydF9yZXN0b3JlX2ZwdV9zdGF0ZSh1Yyk7CiAKLQlpZiAoZG9fc2lnYWx0c3RhY2soJnVjLT51Y19zdGFjaywgTlVMTCwgdXNwKSA9PSAtRUZBVUxUKQorCWlmIChlcnIgfHwgZG9fc2lnYWx0c3RhY2soJnVjLT51Y19zdGFjaywgTlVMTCwgdXNwKSA9PSAtRUZBVUxUKQogCQlnb3RvIGJhZGZyYW1lOwogCi0JZnNpemUgPSBmcmFtZV9leHRyYV9zaXplc1tyZWdzLT5mb3JtYXRdOwotCWlmIChmc2l6ZSA8IDApIHsKLQkJLyoKLQkJICogdXNlciBwcm9jZXNzIHRyeWluZyB0byByZXR1cm4gd2l0aCB3ZWlyZCBmcmFtZSBmb3JtYXQKLQkJICovCi0jaWZkZWYgREVCVUcKLQkJcHJpbnRrKCJ1c2VyIHByb2Nlc3MgcmV0dXJuaW5nIHdpdGggd2VpcmQgZnJhbWUgZm9ybWF0XG4iKTsKLSNlbmRpZgorCWlmIChtYW5nbGVfa2VybmVsX3N0YWNrKHJlZ3MsIHRlbXAsICZ1Yy0+dWNfZXh0cmEpKQogCQlnb3RvIGJhZGZyYW1lOwotCX0KIAotCS8qIE9LLglNYWtlIHJvb20gb24gdGhlIHN1cGVydmlzb3Igc3RhY2sgZm9yIHRoZSBleHRyYSBqdW5rLAotCSAqIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQotCWlmIChmc2l6ZSkgewotI2RlZmluZSBmcmFtZV9vZmZzZXQgKHNpemVvZihzdHJ1Y3QgcHRfcmVncykrc2l6ZW9mKHN0cnVjdCBzd2l0Y2hfc3RhY2spKQotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXwotCQkJKCIgICBtb3ZlbCAlMCwlL2EwXG5cdCIKLQkJCSAiICAgc3VibCAlMSwlL2EwXG5cdCIgICAgIC8qIG1ha2Ugcm9vbSBvbiBzdGFjayAqLwotCQkJICIgICBtb3ZlbCAlL2EwLCUvc3Bcblx0IiAgLyogc2V0IHN0YWNrIHBvaW50ZXIgKi8KLQkJCSAvKiBtb3ZlIHN3aXRjaF9zdGFjayBhbmQgcHRfcmVncyAqLwotCQkJICIxOiBtb3ZlbCAlMEArLCUvYTBAK1xuXHQiCi0JCQkgIiAgIGRicmEgJTIsMWJcblx0IgotCQkJICIgICBsZWEgJS9zcEAoJWMzKSwlL2EwXG5cdCIgLyogYWRkIG9mZnNldCBvZiBmbXQgKi8KLQkJCSAiICAgbHNybCAgIzIsJTFcblx0IgotCQkJICIgICBzdWJxbCAjMSwlMVxuXHQiCi0JCQkgIjI6IG1vdmVzbCAlNEArLCUyXG5cdCIKLQkJCSAiMzogbW92ZWwgJTIsJS9hMEArXG5cdCIKLQkJCSAiICAgZGJyYSAlMSwyYlxuXHQiCi0JCQkgIiAgIGJyYWwgcmV0X2Zyb21fc2lnbmFsXG4iCi0JCQkgIjQ6XG4iCi0JCQkgIi5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIKLQkJCSAiICAgLmFsaWduIDRcbiIKLQkJCSAiICAgLmxvbmcgMmIsNGJcbiIKLQkJCSAiICAgLmxvbmcgM2IsNGJcbiIKLQkJCSAiLnByZXZpb3VzIgotCQkJIDogLyogbm8gb3V0cHV0cywgaXQgZG9lc24ndCBldmVyIHJldHVybiAqLwotCQkJIDogImEiIChzdyksICJkIiAoZnNpemUpLCAiZCIgKGZyYW1lX29mZnNldC80LTEpLAotCQkJICAgIm4iIChmcmFtZV9vZmZzZXQpLCAiYSIgKCZ1Yy0+dWNfZXh0cmEpCi0JCQkgOiAiYTAiKTsKLSN1bmRlZiBmcmFtZV9vZmZzZXQKLQkJLyoKLQkJICogSWYgd2UgZXZlciBnZXQgaGVyZSBhbiBleGNlcHRpb24gb2NjdXJyZWQgd2hpbGUKLQkJICogYnVpbGRpbmcgdGhlIGFib3ZlIHN0YWNrLWZyYW1lLgotCQkgKi8KLQkJZ290byBiYWRmcmFtZTsKLQl9Ci0KLQkqcGQwID0gcmVncy0+ZDA7Ci0JcmV0dXJuIGVycjsKKwlyZXR1cm4gMDsKIAogYmFkZnJhbWU6CiAJcmV0dXJuIDE7CkBAIC01MTQsNyArNDMzLDYgQEAKIAl1bnNpZ25lZCBsb25nIHVzcCA9IHJkdXNwKCk7CiAJc3RydWN0IHNpZ2ZyYW1lIF9fdXNlciAqZnJhbWUgPSAoc3RydWN0IHNpZ2ZyYW1lIF9fdXNlciAqKSh1c3AgLSA0KTsKIAlzaWdzZXRfdCBzZXQ7Ci0JaW50IGQwOwogCiAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGZyYW1lLCBzaXplb2YoKmZyYW1lKSkpCiAJCWdvdG8gYmFkZnJhbWU7CkBAIC01MjgsOSArNDQ2LDkgQEAKIAljdXJyZW50LT5ibG9ja2VkID0gc2V0OwogCXJlY2FsY19zaWdwZW5kaW5nKCk7CiAKLQlpZiAocmVzdG9yZV9zaWdjb250ZXh0KHJlZ3MsICZmcmFtZS0+c2MsIGZyYW1lICsgMSwgJmQwKSkKKwlpZiAocmVzdG9yZV9zaWdjb250ZXh0KHJlZ3MsICZmcmFtZS0+c2MsIGZyYW1lICsgMSkpCiAJCWdvdG8gYmFkZnJhbWU7Ci0JcmV0dXJuIGQwOworCXJldHVybiByZWdzLT5kMDsKIAogYmFkZnJhbWU6CiAJZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOwpAQCAtNTQ0LDcgKzQ2Miw2IEBACiAJdW5zaWduZWQgbG9uZyB1c3AgPSByZHVzcCgpOwogCXN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKmZyYW1lID0gKHN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKikodXNwIC0gNCk7CiAJc2lnc2V0X3Qgc2V0OwotCWludCBkMDsKIAogCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBmcmFtZSwgc2l6ZW9mKCpmcmFtZSkpKQogCQlnb3RvIGJhZGZyYW1lOwpAQCAtNTU1LDkgKzQ3Miw5IEBACiAJY3VycmVudC0+YmxvY2tlZCA9IHNldDsKIAlyZWNhbGNfc2lncGVuZGluZygpOwogCi0JaWYgKHJ0X3Jlc3RvcmVfdWNvbnRleHQocmVncywgc3csICZmcmFtZS0+dWMsICZkMCkpCisJaWYgKHJ0X3Jlc3RvcmVfdWNvbnRleHQocmVncywgc3csICZmcmFtZS0+dWMpKQogCQlnb3RvIGJhZGZyYW1lOwotCXJldHVybiBkMDsKKwlyZXR1cm4gcmVncy0+ZDA7CiAKIGJhZGZyYW1lOgogCWZvcmNlX3NpZyhTSUdTRUdWLCBjdXJyZW50KTsKQEAgLTc3NSw3ICs2OTIsNyBAQAogCXJldHVybiAodm9pZCBfX3VzZXIgKikoKHVzcCAtIGZyYW1lX3NpemUpICYgLThVTCk7CiB9CiAKLXN0YXRpYyB2b2lkIHNldHVwX2ZyYW1lIChpbnQgc2lnLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLAorc3RhdGljIGludCBzZXR1cF9mcmFtZSAoaW50IHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwKIAkJCSBzaWdzZXRfdCAqc2V0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3Qgc2lnZnJhbWUgX191c2VyICpmcmFtZTsKQEAgLTc5MywxMCArNzEwLDggQEAKIAogCWZyYW1lID0gZ2V0X3NpZ2ZyYW1lKGthLCByZWdzLCBzaXplb2YoKmZyYW1lKSArIGZzaXplKTsKIAotCWlmIChmc2l6ZSkgeworCWlmIChmc2l6ZSkKIAkJZXJyIHw9IGNvcHlfdG9fdXNlciAoZnJhbWUgKyAxLCByZWdzICsgMSwgZnNpemUpOwotCQlyZWdzLT5zdGthZGogPSBmc2l6ZTsKLQl9CiAKIAllcnIgfD0gX19wdXRfdXNlcigoY3VycmVudF90aHJlYWRfaW5mbygpLT5leGVjX2RvbWFpbgogCQkJICAgJiYgY3VycmVudF90aHJlYWRfaW5mbygpLT5leGVjX2RvbWFpbi0+c2lnbmFsX2ludm1hcApAQCAtODI2LDExICs3NDEsMjEgQEAKIAogCXB1c2hfY2FjaGUgKCh1bnNpZ25lZCBsb25nKSAmZnJhbWUtPnJldGNvZGUpOwogCi0JLyogU2V0IHVwIHJlZ2lzdGVycyBmb3Igc2lnbmFsIGhhbmRsZXIgKi8KKwkvKgorCSAqIFNldCB1cCByZWdpc3RlcnMgZm9yIHNpZ25hbCBoYW5kbGVyLiAgQWxsIHRoZSBzdGF0ZSB3ZSBhcmUgYWJvdXQKKwkgKiB0byBkZXN0cm95IGlzIHN1Y2Nlc3NmdWxseSBjb3BpZWQgdG8gc2lnZnJhbWUuCisJICovCiAJd3J1c3AgKCh1bnNpZ25lZCBsb25nKSBmcmFtZSk7CiAJcmVncy0+cGMgPSAodW5zaWduZWQgbG9uZykga2EtPnNhLnNhX2hhbmRsZXI7CiAKLWFkanVzdF9zdGFjazoKKwkvKgorCSAqIFRoaXMgaXMgc3VidGxlOyBpZiB3ZSBidWlsZCBtb3JlIHRoYW4gb25lIHNpZ2ZyYW1lLCBhbGwgYnV0IHRoZQorCSAqIGZpcnN0IG9uZSB3aWxsIHNlZSBmcmFtZSBmb3JtYXQgMCBhbmQgaGF2ZSBmc2l6ZSA9PSAwLCBzbyB3ZSB3b24ndAorCSAqIHNjcmV3IHN0a2Fkai4KKwkgKi8KKwlpZiAoZnNpemUpCisJCXJlZ3MtPnN0a2FkaiA9IGZzaXplOworCiAJLyogUHJlcGFyZSB0byBza2lwIG92ZXIgdGhlIGV4dHJhIHN0dWZmIGluIHRoZSBleGNlcHRpb24gZnJhbWUuICAqLwogCWlmIChyZWdzLT5zdGthZGopIHsKIAkJc3RydWN0IHB0X3JlZ3MgKnRyZWdzID0KQEAgLTg0NSwxNCArNzcwLDE0IEBACiAJCXRyZWdzLT5wYyA9IHJlZ3MtPnBjOwogCQl0cmVncy0+c3IgPSByZWdzLT5zcjsKIAl9Ci0JcmV0dXJuOworCXJldHVybiAwOwogCiBnaXZlX3NpZ3NlZ3Y6CiAJZm9yY2Vfc2lnc2VndihzaWcsIGN1cnJlbnQpOwotCWdvdG8gYWRqdXN0X3N0YWNrOworCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB2b2lkIHNldHVwX3J0X2ZyYW1lIChpbnQgc2lnLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLCBzaWdpbmZvX3QgKmluZm8sCitzdGF0aWMgaW50IHNldHVwX3J0X2ZyYW1lIChpbnQgc2lnLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLCBzaWdpbmZvX3QgKmluZm8sCiAJCQkgICAgc2lnc2V0X3QgKnNldCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IHJ0X3NpZ2ZyYW1lIF9fdXNlciAqZnJhbWU7CkBAIC04NjksMTAgKzc5NCw4IEBACiAKIAlmcmFtZSA9IGdldF9zaWdmcmFtZShrYSwgcmVncywgc2l6ZW9mKCpmcmFtZSkpOwogCi0JaWYgKGZzaXplKSB7CisJaWYgKGZzaXplKQogCQllcnIgfD0gY29weV90b191c2VyICgmZnJhbWUtPnVjLnVjX2V4dHJhLCByZWdzICsgMSwgZnNpemUpOwotCQlyZWdzLT5zdGthZGogPSBmc2l6ZTsKLQl9CiAKIAllcnIgfD0gX19wdXRfdXNlcigoY3VycmVudF90aHJlYWRfaW5mbygpLT5leGVjX2RvbWFpbgogCQkJICAgJiYgY3VycmVudF90aHJlYWRfaW5mbygpLT5leGVjX2RvbWFpbi0+c2lnbmFsX2ludm1hcApAQCAtOTE0LDExICs4MzcsMjEgQEAKIAogCXB1c2hfY2FjaGUgKCh1bnNpZ25lZCBsb25nKSAmZnJhbWUtPnJldGNvZGUpOwogCi0JLyogU2V0IHVwIHJlZ2lzdGVycyBmb3Igc2lnbmFsIGhhbmRsZXIgKi8KKwkvKgorCSAqIFNldCB1cCByZWdpc3RlcnMgZm9yIHNpZ25hbCBoYW5kbGVyLiAgQWxsIHRoZSBzdGF0ZSB3ZSBhcmUgYWJvdXQKKwkgKiB0byBkZXN0cm95IGlzIHN1Y2Nlc3NmdWxseSBjb3BpZWQgdG8gc2lnZnJhbWUuCisJICovCiAJd3J1c3AgKCh1bnNpZ25lZCBsb25nKSBmcmFtZSk7CiAJcmVncy0+cGMgPSAodW5zaWduZWQgbG9uZykga2EtPnNhLnNhX2hhbmRsZXI7CiAKLWFkanVzdF9zdGFjazoKKwkvKgorCSAqIFRoaXMgaXMgc3VidGxlOyBpZiB3ZSBidWlsZCBtb3JlIHRoYW4gb25lIHNpZ2ZyYW1lLCBhbGwgYnV0IHRoZQorCSAqIGZpcnN0IG9uZSB3aWxsIHNlZSBmcmFtZSBmb3JtYXQgMCBhbmQgaGF2ZSBmc2l6ZSA9PSAwLCBzbyB3ZSB3b24ndAorCSAqIHNjcmV3IHN0a2Fkai4KKwkgKi8KKwlpZiAoZnNpemUpCisJCXJlZ3MtPnN0a2FkaiA9IGZzaXplOworCiAJLyogUHJlcGFyZSB0byBza2lwIG92ZXIgdGhlIGV4dHJhIHN0dWZmIGluIHRoZSBleGNlcHRpb24gZnJhbWUuICAqLwogCWlmIChyZWdzLT5zdGthZGopIHsKIAkJc3RydWN0IHB0X3JlZ3MgKnRyZWdzID0KQEAgLTkzMywxMSArODY2LDExIEBACiAJCXRyZWdzLT5wYyA9IHJlZ3MtPnBjOwogCQl0cmVncy0+c3IgPSByZWdzLT5zcjsKIAl9Ci0JcmV0dXJuOworCXJldHVybiAwOwogCiBnaXZlX3NpZ3NlZ3Y6CiAJZm9yY2Vfc2lnc2VndihzaWcsIGN1cnJlbnQpOwotCWdvdG8gYWRqdXN0X3N0YWNrOworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZApAQCAtOTk1LDYgKzkyOCw3IEBACiBoYW5kbGVfc2lnbmFsKGludCBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsIHNpZ2luZm9fdCAqaW5mbywKIAkgICAgICBzaWdzZXRfdCAqb2xkc2V0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKKwlpbnQgZXJyOwogCS8qIGFyZSB3ZSBmcm9tIGEgc3lzdGVtIGNhbGw/ICovCiAJaWYgKHJlZ3MtPm9yaWdfZDAgPj0gMCkKIAkJLyogSWYgc28sIGNoZWNrIHN5c3RlbSBjYWxsIHJlc3RhcnRpbmcuLiAqLwpAQCAtMTAwMiwxNyArOTM2LDI0IEBACiAKIAkvKiBzZXQgdXAgdGhlIHN0YWNrIGZyYW1lICovCiAJaWYgKGthLT5zYS5zYV9mbGFncyAmIFNBX1NJR0lORk8pCi0JCXNldHVwX3J0X2ZyYW1lKHNpZywga2EsIGluZm8sIG9sZHNldCwgcmVncyk7CisJCWVyciA9IHNldHVwX3J0X2ZyYW1lKHNpZywga2EsIGluZm8sIG9sZHNldCwgcmVncyk7CiAJZWxzZQotCQlzZXR1cF9mcmFtZShzaWcsIGthLCBvbGRzZXQsIHJlZ3MpOworCQllcnIgPSBzZXR1cF9mcmFtZShzaWcsIGthLCBvbGRzZXQsIHJlZ3MpOwogCi0JaWYgKGthLT5zYS5zYV9mbGFncyAmIFNBX09ORVNIT1QpCi0JCWthLT5zYS5zYV9oYW5kbGVyID0gU0lHX0RGTDsKKwlpZiAoZXJyKQorCQlyZXR1cm47CiAKIAlzaWdvcnNldHMoJmN1cnJlbnQtPmJsb2NrZWQsJmN1cnJlbnQtPmJsb2NrZWQsJmthLT5zYS5zYV9tYXNrKTsKIAlpZiAoIShrYS0+c2Euc2FfZmxhZ3MgJiBTQV9OT0RFRkVSKSkKIAkJc2lnYWRkc2V0KCZjdXJyZW50LT5ibG9ja2VkLHNpZyk7CiAJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKworCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9ERUxBWUVEX1RSQUNFKSkgeworCQlyZWdzLT5zciAmPSB+MHg4MDAwOworCQlzZW5kX3NpZyhTSUdUUkFQLCBjdXJyZW50LCAxKTsKKwl9CisKKwljbGVhcl90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKTsKIH0KIAogLyoKQEAgLTEwMjAsMjIgKzk2MSwyNSBAQAogICogd2FudCB0byBoYW5kbGUuIFRodXMgeW91IGNhbm5vdCBraWxsIGluaXQgZXZlbiB3aXRoIGEgU0lHS0lMTCBldmVuIGJ5CiAgKiBtaXN0YWtlLgogICovCi1hc21saW5rYWdlIGludCBkb19zaWduYWwoc2lnc2V0X3QgKm9sZHNldCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCithc21saW5rYWdlIHZvaWQgZG9fc2lnbmFsKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXNpZ2luZm9fdCBpbmZvOwogCXN0cnVjdCBrX3NpZ2FjdGlvbiBrYTsKIAlpbnQgc2lnbnI7CisJc2lnc2V0X3QgKm9sZHNldDsKIAogCWN1cnJlbnQtPnRocmVhZC5lc3AwID0gKHVuc2lnbmVkIGxvbmcpIHJlZ3M7CiAKLQlpZiAoIW9sZHNldCkKKwlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkKKwkJb2xkc2V0ID0gJmN1cnJlbnQtPnNhdmVkX3NpZ21hc2s7CisJZWxzZQogCQlvbGRzZXQgPSAmY3VycmVudC0+YmxvY2tlZDsKIAogCXNpZ25yID0gZ2V0X3NpZ25hbF90b19kZWxpdmVyKCZpbmZvLCAma2EsIHJlZ3MsIE5VTEwpOwogCWlmIChzaWduciA+IDApIHsKIAkJLyogV2hlZSEgIEFjdHVhbGx5IGRlbGl2ZXIgdGhlIHNpZ25hbC4gICovCiAJCWhhbmRsZV9zaWduYWwoc2lnbnIsICZrYSwgJmluZm8sIG9sZHNldCwgcmVncyk7Ci0JCXJldHVybiAxOworCQlyZXR1cm47CiAJfQogCiAJLyogRGlkIHdlIGNvbWUgZnJvbSBhIHN5c3RlbSBjYWxsPyAqLwpAQCAtMTA0Myw1ICs5ODcsOSBAQAogCQkvKiBSZXN0YXJ0IHRoZSBzeXN0ZW0gY2FsbCAtIG5vIGhhbmRsZXJzIHByZXNlbnQgKi8KIAkJaGFuZGxlX3Jlc3RhcnQocmVncywgTlVMTCwgMCk7CiAKLQlyZXR1cm4gMDsKKwkvKiBJZiB0aGVyZSdzIG5vIHNpZ25hbCB0byBkZWxpdmVyLCB3ZSBqdXN0IHJlc3RvcmUgdGhlIHNhdmVkIG1hc2suICAqLworCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spKSB7CisJCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spOworCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJmN1cnJlbnQtPnNhdmVkX3NpZ21hc2ssIE5VTEwpOworCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL2VudHJ5LlMKaW5kZXggYWZmNmY1Ny4uMjc4M2YyNSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL2VudHJ5LlMKQEAgLTExMiwyMiArMTEyLDYgQEAKIAlSRVNUT1JFX1NXSVRDSF9TVEFDSwogCXJ0cwogCi1FTlRSWShzeXNfc2lnc3VzcGVuZCkKLQlTQVZFX1NXSVRDSF9TVEFDSwotCXBlYQklc3BAKFNXSVRDSF9TVEFDS19TSVpFKQotCWpic3IJZG9fc2lnc3VzcGVuZAotCWFkZHFsCSM0LCVzcAotCVJFU1RPUkVfU1dJVENIX1NUQUNLCi0JcnRzCi0KLUVOVFJZKHN5c19ydF9zaWdzdXNwZW5kKQotCVNBVkVfU1dJVENIX1NUQUNLCi0JcGVhCSVzcEAoU1dJVENIX1NUQUNLX1NJWkUpCi0JamJzcglkb19ydF9zaWdzdXNwZW5kCi0JYWRkcWwJIzQsJXNwCi0JUkVTVE9SRV9TV0lUQ0hfU1RBQ0sKLQlydHMKLQogRU5UUlkoc3lzX3NpZ3JldHVybikKIAlTQVZFX1NXSVRDSF9TVEFDSwogCWpic3IJZG9fc2lncmV0dXJuCmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL202OGtub21tdS9rZXJuZWwvc2lnbmFsLmMKaW5kZXggNWFiNmEwNC4uMzZhODFiYiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC9zaWduYWwuYwpAQCAtNTMsNjUgKzUzLDMwIEBACiAKIHZvaWQgcmV0X2Zyb21fdXNlcl9zaWduYWwodm9pZCk7CiB2b2lkIHJldF9mcm9tX3VzZXJfcnRfc2lnbmFsKHZvaWQpOwotYXNtbGlua2FnZSBpbnQgZG9fc2lnbmFsKHNpZ3NldF90ICpvbGRzZXQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIAogLyoKICAqIEF0b21pY2FsbHkgc3dhcCBpbiB0aGUgbmV3IHNpZ25hbCBtYXNrLCBhbmQgd2FpdCBmb3IgYSBzaWduYWwuCiAgKi8KLWFzbWxpbmthZ2UgaW50IGRvX3NpZ3N1c3BlbmQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCithc21saW5rYWdlIGludAorc3lzX3NpZ3N1c3BlbmQoaW50IHVudXNlZDAsIGludCB1bnVzZWQxLCBvbGRfc2lnc2V0X3QgbWFzaykKIHsKLQlvbGRfc2lnc2V0X3QgbWFzayA9IHJlZ3MtPmQzOwotCXNpZ3NldF90IHNhdmVzZXQ7Ci0KIAltYXNrICY9IF9CTE9DS0FCTEU7CiAJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0Jc2F2ZXNldCA9IGN1cnJlbnQtPmJsb2NrZWQ7CisJY3VycmVudC0+c2F2ZWRfc2lnbWFzayA9IGN1cnJlbnQtPmJsb2NrZWQ7CiAJc2lnaW5pdHNldCgmY3VycmVudC0+YmxvY2tlZCwgbWFzayk7CiAJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKIAlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwogCi0JcmVncy0+ZDAgPSAtRUlOVFI7Ci0Jd2hpbGUgKDEpIHsKLQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0JCXNjaGVkdWxlKCk7Ci0JCWlmIChkb19zaWduYWwoJnNhdmVzZXQsIHJlZ3MpKQotCQkJcmV0dXJuIC1FSU5UUjsKLQl9CisJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJc2NoZWR1bGUoKTsKKwlzZXRfcmVzdG9yZV9zaWdtYXNrKCk7CisKKwlyZXR1cm4gLUVSRVNUQVJUTk9IQU5EOwogfQogCiBhc21saW5rYWdlIGludAotZG9fcnRfc2lnc3VzcGVuZChzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlzaWdzZXRfdCAqdW5ld3NldCA9IChzaWdzZXRfdCAqKXJlZ3MtPmQxOwotCXNpemVfdCBzaWdzZXRzaXplID0gKHNpemVfdClyZWdzLT5kMjsKLQlzaWdzZXRfdCBzYXZlc2V0LCBuZXdzZXQ7Ci0KLQkvKiBYWFg6IERvbid0IHByZWNsdWRlIGhhbmRsaW5nIGRpZmZlcmVudCBzaXplZCBzaWdzZXRfdCdzLiAgKi8KLQlpZiAoc2lnc2V0c2l6ZSAhPSBzaXplb2Yoc2lnc2V0X3QpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmbmV3c2V0LCB1bmV3c2V0LCBzaXplb2YobmV3c2V0KSkpCi0JCXJldHVybiAtRUZBVUxUOwotCXNpZ2RlbHNldG1hc2soJm5ld3NldCwgfl9CTE9DS0FCTEUpOwotCi0Jc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0Jc2F2ZXNldCA9IGN1cnJlbnQtPmJsb2NrZWQ7Ci0JY3VycmVudC0+YmxvY2tlZCA9IG5ld3NldDsKLQlyZWNhbGNfc2lncGVuZGluZygpOwotCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0KLQlyZWdzLT5kMCA9IC1FSU5UUjsKLQl3aGlsZSAoMSkgewotCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKLQkJc2NoZWR1bGUoKTsKLQkJaWYgKGRvX3NpZ25hbCgmc2F2ZXNldCwgcmVncykpCi0JCQlyZXR1cm4gLUVJTlRSOwotCX0KLX0KLQotYXNtbGlua2FnZSBpbnQgCi1zeXNfc2lnYWN0aW9uKGludCBzaWcsIGNvbnN0IHN0cnVjdCBvbGRfc2lnYWN0aW9uICphY3QsCi0JICAgICAgc3RydWN0IG9sZF9zaWdhY3Rpb24gKm9hY3QpCitzeXNfc2lnYWN0aW9uKGludCBzaWcsIGNvbnN0IHN0cnVjdCBvbGRfc2lnYWN0aW9uIF9fdXNlciAqYWN0LAorCSAgICAgIHN0cnVjdCBvbGRfc2lnYWN0aW9uIF9fdXNlciAqb2FjdCkKIHsKIAlzdHJ1Y3Qga19zaWdhY3Rpb24gbmV3X2thLCBvbGRfa2E7CiAJaW50IHJldDsKQEAgLTEyMCwxMCArODUsMTAgQEAKIAkJb2xkX3NpZ3NldF90IG1hc2s7CiAJCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBhY3QsIHNpemVvZigqYWN0KSkgfHwKIAkJICAgIF9fZ2V0X3VzZXIobmV3X2thLnNhLnNhX2hhbmRsZXIsICZhY3QtPnNhX2hhbmRsZXIpIHx8Ci0JCSAgICBfX2dldF91c2VyKG5ld19rYS5zYS5zYV9yZXN0b3JlciwgJmFjdC0+c2FfcmVzdG9yZXIpKQorCQkgICAgX19nZXRfdXNlcihuZXdfa2Euc2Euc2FfcmVzdG9yZXIsICZhY3QtPnNhX3Jlc3RvcmVyKSB8fAorCQkgICAgX19nZXRfdXNlcihuZXdfa2Euc2Euc2FfZmxhZ3MsICZhY3QtPnNhX2ZsYWdzKSB8fAorCQkgICAgX19nZXRfdXNlcihtYXNrLCAmYWN0LT5zYV9tYXNrKSkKIAkJCXJldHVybiAtRUZBVUxUOwotCQlfX2dldF91c2VyKG5ld19rYS5zYS5zYV9mbGFncywgJmFjdC0+c2FfZmxhZ3MpOwotCQlfX2dldF91c2VyKG1hc2ssICZhY3QtPnNhX21hc2spOwogCQlzaWdpbml0c2V0KCZuZXdfa2Euc2Euc2FfbWFzaywgbWFzayk7CiAJfQogCkBAIC0xMzIsMTcgKzk3LDE3IEBACiAJaWYgKCFyZXQgJiYgb2FjdCkgewogCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIG9hY3QsIHNpemVvZigqb2FjdCkpIHx8CiAJCSAgICBfX3B1dF91c2VyKG9sZF9rYS5zYS5zYV9oYW5kbGVyLCAmb2FjdC0+c2FfaGFuZGxlcikgfHwKLQkJICAgIF9fcHV0X3VzZXIob2xkX2thLnNhLnNhX3Jlc3RvcmVyLCAmb2FjdC0+c2FfcmVzdG9yZXIpKQorCQkgICAgX19wdXRfdXNlcihvbGRfa2Euc2Euc2FfcmVzdG9yZXIsICZvYWN0LT5zYV9yZXN0b3JlcikgfHwKKwkJICAgIF9fcHV0X3VzZXIob2xkX2thLnNhLnNhX2ZsYWdzLCAmb2FjdC0+c2FfZmxhZ3MpIHx8CisJCSAgICBfX3B1dF91c2VyKG9sZF9rYS5zYS5zYV9tYXNrLnNpZ1swXSwgJm9hY3QtPnNhX21hc2spKQogCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCV9fcHV0X3VzZXIob2xkX2thLnNhLnNhX2ZsYWdzLCAmb2FjdC0+c2FfZmxhZ3MpOwotCQlfX3B1dF91c2VyKG9sZF9rYS5zYS5zYV9tYXNrLnNpZ1swXSwgJm9hY3QtPnNhX21hc2spOwogCX0KIAogCXJldHVybiByZXQ7CiB9CiAKIGFzbWxpbmthZ2UgaW50Ci1zeXNfc2lnYWx0c3RhY2soY29uc3Qgc3RhY2tfdCAqdXNzLCBzdGFja190ICp1b3NzKQorc3lzX3NpZ2FsdHN0YWNrKGNvbnN0IHN0YWNrX3QgX191c2VyICp1c3MsIHN0YWNrX3QgX191c2VyICp1b3NzKQogewogCXJldHVybiBkb19zaWdhbHRzdGFjayh1c3MsIHVvc3MsIHJkdXNwKCkpOwogfQpAQCAtMTU3LDEwICsxMjIsMTAgQEAKIAogc3RydWN0IHNpZ2ZyYW1lCiB7Ci0JY2hhciAqcHJldGNvZGU7CisJY2hhciBfX3VzZXIgKnByZXRjb2RlOwogCWludCBzaWc7CiAJaW50IGNvZGU7Ci0Jc3RydWN0IHNpZ2NvbnRleHQgKnBzYzsKKwlzdHJ1Y3Qgc2lnY29udGV4dCBfX3VzZXIgKnBzYzsKIAljaGFyIHJldGNvZGVbOF07CiAJdW5zaWduZWQgbG9uZyBleHRyYW1hc2tbX05TSUdfV09SRFMtMV07CiAJc3RydWN0IHNpZ2NvbnRleHQgc2M7CkBAIC0xNjgsMTAgKzEzMywxMCBAQAogCiBzdHJ1Y3QgcnRfc2lnZnJhbWUKIHsKLQljaGFyICpwcmV0Y29kZTsKKwljaGFyIF9fdXNlciAqcHJldGNvZGU7CiAJaW50IHNpZzsKLQlzdHJ1Y3Qgc2lnaW5mbyAqcGluZm87Ci0Jdm9pZCAqcHVjOworCXN0cnVjdCBzaWdpbmZvIF9fdXNlciAqcGluZm87CisJdm9pZCBfX3VzZXIgKnB1YzsKIAljaGFyIHJldGNvZGVbOF07CiAJc3RydWN0IHNpZ2luZm8gaW5mbzsKIAlzdHJ1Y3QgdWNvbnRleHQgdWM7CkBAIC0xOTgsOCArMTYzLDggQEAKIAkJZ290byBvdXQ7CiAKIAkgICAgX19hc21fXyB2b2xhdGlsZSAoIi5jaGlwIDY4ay82ODg4MVxuXHQiCi0JCQkgICAgICAiZm1vdmVteCAlMCwlL2ZwMC0lL2ZwMVxuXHQiCi0JCQkgICAgICAiZm1vdmVtbCAlMSwlL2ZwY3IvJS9mcHNyLyUvZnBpYXJcblx0IgorCQkJICAgICAgImZtb3ZlbXggJTAsJSVmcDAtJSVmcDFcblx0IgorCQkJICAgICAgImZtb3ZlbWwgJTEsJSVmcGNyLyUlZnBzci8lJWZwaWFyXG5cdCIKIAkJCSAgICAgICIuY2hpcCA2OGsiCiAJCQkgICAgICA6IC8qIG5vIG91dHB1dHMgKi8KIAkJCSAgICAgIDogIm0iICgqc2MtPnNjX2ZwcmVncyksICJtIiAoKnNjLT5zY19mcGNudGwpKTsKQEAgLTIxOCw3ICsxODMsNyBAQAogI2RlZmluZSB1Y19mb3JtYXR2ZWMJdWNfZmlsbGVyW0ZQQ09OVEVYVF9TSVpFLzRdCiAjZGVmaW5lIHVjX2V4dHJhCXVjX2ZpbGxlcltGUENPTlRFWFRfU0laRS80KzFdCiAKLXN0YXRpYyBpbmxpbmUgaW50IHJ0X3Jlc3RvcmVfZnB1X3N0YXRlKHN0cnVjdCB1Y29udGV4dCAqdWMpCitzdGF0aWMgaW5saW5lIGludCBydF9yZXN0b3JlX2ZwdV9zdGF0ZShzdHJ1Y3QgdWNvbnRleHQgX191c2VyICp1YykKIHsKIAl1bnNpZ25lZCBjaGFyIGZwc3RhdGVbRlBDT05URVhUX1NJWkVdOwogCWludCBjb250ZXh0X3NpemUgPSAwOwpAQCAtMjI4LDcgKzE5Myw3IEBACiAJaWYgKEZQVV9JU19FTVUpIHsKIAkJLyogcmVzdG9yZSBmcHUgY29udHJvbCByZWdpc3RlciAqLwogCQlpZiAoX19jb3B5X2Zyb21fdXNlcihjdXJyZW50LT50aHJlYWQuZnBjbnRsLAotCQkJCSZ1Yy0+dWNfbWNvbnRleHQuZnByZWdzLmZfcGNyLCAxMikpCisJCQkJdWMtPnVjX21jb250ZXh0LmZwcmVncy5mX2ZwY250bCwgMTIpKQogCQkJZ290byBvdXQ7CiAJCS8qIHJlc3RvcmUgYWxsIG90aGVyIGZwdSByZWdpc3RlciAqLwogCQlpZiAoX19jb3B5X2Zyb21fdXNlcihjdXJyZW50LT50aHJlYWQuZnAsCkBAIC0yMzcsNyArMjAyLDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKF9fZ2V0X3VzZXIoKihsb25nICopZnBzdGF0ZSwgKGxvbmcgKikmdWMtPnVjX2Zwc3RhdGUpKQorCWlmIChfX2dldF91c2VyKCoobG9uZyAqKWZwc3RhdGUsIChsb25nIF9fdXNlciAqKSZ1Yy0+dWNfZnBzdGF0ZSkpCiAJCWdvdG8gb3V0OwogCWlmIChmcHN0YXRlWzBdKSB7CiAJCWNvbnRleHRfc2l6ZSA9IGZwc3RhdGVbMV07CkBAIC0yNDksMTUgKzIxNCwxNSBAQAogCQkgICAgIHNpemVvZihmcHJlZ3MpKSkKIAkJCWdvdG8gb3V0OwogCQlfX2FzbV9fIHZvbGF0aWxlICgiLmNoaXAgNjhrLzY4ODgxXG5cdCIKLQkJCQkgICJmbW92ZW14ICUwLCUvZnAwLSUvZnA3XG5cdCIKLQkJCQkgICJmbW92ZW1sICUxLCUvZnBjci8lL2Zwc3IvJS9mcGlhclxuXHQiCisJCQkJICAiZm1vdmVteCAlMCwlJWZwMC0lJWZwN1xuXHQiCisJCQkJICAiZm1vdmVtbCAlMSwlJWZwY3IvJSVmcHNyLyUlZnBpYXJcblx0IgogCQkJCSAgIi5jaGlwIDY4ayIKIAkJCQkgIDogLyogbm8gb3V0cHV0cyAqLwogCQkJCSAgOiAibSIgKCpmcHJlZ3MuZl9mcHJlZ3MpLAotCQkJCSAgICAibSIgKGZwcmVncy5mX3BjcikpOworCQkJCSAgICAibSIgKCpmcHJlZ3MuZl9mcGNudGwpKTsKIAl9CiAJaWYgKGNvbnRleHRfc2l6ZSAmJgotCSAgICBfX2NvcHlfZnJvbV91c2VyKGZwc3RhdGUgKyA0LCAobG9uZyAqKSZ1Yy0+dWNfZnBzdGF0ZSArIDEsCisJICAgIF9fY29weV9mcm9tX3VzZXIoZnBzdGF0ZSArIDQsIChsb25nIF9fdXNlciAqKSZ1Yy0+dWNfZnBzdGF0ZSArIDEsCiAJCQkgICAgIGNvbnRleHRfc2l6ZSkpCiAJCWdvdG8gb3V0OwogCV9fYXNtX18gdm9sYXRpbGUgKCIuY2hpcCA2OGsvNjg4ODFcblx0IgpAQCAtMjcyLDcgKzIzNyw3IEBACiAjZW5kaWYKIAogc3RhdGljIGlubGluZSBpbnQKLXJlc3RvcmVfc2lnY29udGV4dChzdHJ1Y3QgcHRfcmVncyAqcmVncywgc3RydWN0IHNpZ2NvbnRleHQgKnVzYywgdm9pZCAqZnAsCityZXN0b3JlX3NpZ2NvbnRleHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqdXNjLCB2b2lkIF9fdXNlciAqZnAsCiAJCSAgIGludCAqcGQwKQogewogCWludCBmb3JtYXR2ZWM7CkBAIC0zMTIsMTAgKzI3NywxMCBAQAogCiBzdGF0aWMgaW5saW5lIGludAogcnRfcmVzdG9yZV91Y29udGV4dChzdHJ1Y3QgcHRfcmVncyAqcmVncywgc3RydWN0IHN3aXRjaF9zdGFjayAqc3csCi0JCSAgICBzdHJ1Y3QgdWNvbnRleHQgKnVjLCBpbnQgKnBkMCkKKwkJICAgIHN0cnVjdCB1Y29udGV4dCBfX3VzZXIgKnVjLCBpbnQgKnBkMCkKIHsKIAlpbnQgdGVtcDsKLQlncmVnX3QgKmdyZWdzID0gdWMtPnVjX21jb250ZXh0LmdyZWdzOworCWdyZWdfdCBfX3VzZXIgKmdyZWdzID0gdWMtPnVjX21jb250ZXh0LmdyZWdzOwogCXVuc2lnbmVkIGxvbmcgdXNwOwogCWludCBlcnI7CiAKQEAgLTM2NSw3ICszMzAsNyBAQAogCXN0cnVjdCBzd2l0Y2hfc3RhY2sgKnN3ID0gKHN0cnVjdCBzd2l0Y2hfc3RhY2sgKikgJl9fdW51c2VkOwogCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gKHN0cnVjdCBwdF9yZWdzICopIChzdyArIDEpOwogCXVuc2lnbmVkIGxvbmcgdXNwID0gcmR1c3AoKTsKLQlzdHJ1Y3Qgc2lnZnJhbWUgKmZyYW1lID0gKHN0cnVjdCBzaWdmcmFtZSAqKSh1c3AgLSA0KTsKKwlzdHJ1Y3Qgc2lnZnJhbWUgX191c2VyICpmcmFtZSA9IChzdHJ1Y3Qgc2lnZnJhbWUgX191c2VyICopKHVzcCAtIDQpOwogCXNpZ3NldF90IHNldDsKIAlpbnQgZDA7CiAKQEAgLTM5Nyw3ICszNjIsNyBAQAogCXN0cnVjdCBzd2l0Y2hfc3RhY2sgKnN3ID0gKHN0cnVjdCBzd2l0Y2hfc3RhY2sgKikgJl9fdW51c2VkOwogCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gKHN0cnVjdCBwdF9yZWdzICopIChzdyArIDEpOwogCXVuc2lnbmVkIGxvbmcgdXNwID0gcmR1c3AoKTsKLQlzdHJ1Y3QgcnRfc2lnZnJhbWUgKmZyYW1lID0gKHN0cnVjdCBydF9zaWdmcmFtZSAqKSh1c3AgLSA0KTsKKwlzdHJ1Y3QgcnRfc2lnZnJhbWUgX191c2VyICpmcmFtZSA9IChzdHJ1Y3QgcnRfc2lnZnJhbWUgX191c2VyICopKHVzcCAtIDQpOwogCXNpZ3NldF90IHNldDsKIAlpbnQgZDA7CiAKQEAgLTQ0MywxNyArNDA4LDE3IEBACiAJaWYgKHNjLT5zY19mcHN0YXRlWzBdKSB7CiAJCWZwdV92ZXJzaW9uID0gc2MtPnNjX2Zwc3RhdGVbMF07CiAJCV9fYXNtX18gdm9sYXRpbGUgKCIuY2hpcCA2OGsvNjg4ODFcblx0IgotCQkJCSAgImZtb3ZlbXggJS9mcDAtJS9mcDEsJTBcblx0IgotCQkJCSAgImZtb3ZlbWwgJS9mcGNyLyUvZnBzci8lL2ZwaWFyLCUxXG5cdCIKKwkJCQkgICJmbW92ZW14ICUlZnAwLSUlZnAxLCUwXG5cdCIKKwkJCQkgICJmbW92ZW1sICUlZnBjci8lJWZwc3IvJSVmcGlhciwlMVxuXHQiCiAJCQkJICAiLmNoaXAgNjhrIgotCQkJCSAgOiAvKiBubyBvdXRwdXRzICovCi0JCQkJICA6ICJtIiAoKnNjLT5zY19mcHJlZ3MpLAotCQkJCSAgICAibSIgKCpzYy0+c2NfZnBjbnRsKQorCQkJCSAgOiAiPW0iICgqc2MtPnNjX2ZwcmVncyksCisJCQkJICAgICI9bSIgKCpzYy0+c2NfZnBjbnRsKQorCQkJCSAgOiAvKiBubyBpbnB1dHMgKi8KIAkJCQkgIDogIm1lbW9yeSIpOwogCX0KIH0KIAotc3RhdGljIGlubGluZSBpbnQgcnRfc2F2ZV9mcHVfc3RhdGUoc3RydWN0IHVjb250ZXh0ICp1Yywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgaW5saW5lIGludCBydF9zYXZlX2ZwdV9zdGF0ZShzdHJ1Y3QgdWNvbnRleHQgX191c2VyICp1Yywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJdW5zaWduZWQgY2hhciBmcHN0YXRlW0ZQQ09OVEVYVF9TSVpFXTsKIAlpbnQgY29udGV4dF9zaXplID0gMDsKQEAgLTQ2MSw3ICs0MjYsNyBAQAogCiAJaWYgKEZQVV9JU19FTVUpIHsKIAkJLyogc2F2ZSBmcHUgY29udHJvbCByZWdpc3RlciAqLwotCQllcnIgfD0gY29weV90b191c2VyKCZ1Yy0+dWNfbWNvbnRleHQuZnByZWdzLmZfcGNyLAorCQllcnIgfD0gY29weV90b191c2VyKHVjLT51Y19tY29udGV4dC5mcHJlZ3MuZl9wY250bCwKIAkJCQljdXJyZW50LT50aHJlYWQuZnBjbnRsLCAxMik7CiAJCS8qIHNhdmUgYWxsIG90aGVyIGZwdSByZWdpc3RlciAqLwogCQllcnIgfD0gY29weV90b191c2VyKHVjLT51Y19tY29udGV4dC5mcHJlZ3MuZl9mcHJlZ3MsCkBAIC00NzQsMjQgKzQzOSwyNCBAQAogCQkJICAiLmNoaXAgNjhrIgogCQkJICA6IDogIm0iICgqZnBzdGF0ZSkgOiAibWVtb3J5Iik7CiAKLQllcnIgfD0gX19wdXRfdXNlcigqKGxvbmcgKilmcHN0YXRlLCAobG9uZyAqKSZ1Yy0+dWNfZnBzdGF0ZSk7CisJZXJyIHw9IF9fcHV0X3VzZXIoKihsb25nICopZnBzdGF0ZSwgKGxvbmcgX191c2VyICopJnVjLT51Y19mcHN0YXRlKTsKIAlpZiAoZnBzdGF0ZVswXSkgewogCQlmcHJlZ3NldF90IGZwcmVnczsKIAkJY29udGV4dF9zaXplID0gZnBzdGF0ZVsxXTsKIAkJZnB1X3ZlcnNpb24gPSBmcHN0YXRlWzBdOwogCQlfX2FzbV9fIHZvbGF0aWxlICgiLmNoaXAgNjhrLzY4ODgxXG5cdCIKLQkJCQkgICJmbW92ZW14ICUvZnAwLSUvZnA3LCUwXG5cdCIKLQkJCQkgICJmbW92ZW1sICUvZnBjci8lL2Zwc3IvJS9mcGlhciwlMVxuXHQiCisJCQkJICAiZm1vdmVteCAlJWZwMC0lJWZwNywlMFxuXHQiCisJCQkJICAiZm1vdmVtbCAlJWZwY3IvJSVmcHNyLyUlZnBpYXIsJTFcblx0IgogCQkJCSAgIi5jaGlwIDY4ayIKLQkJCQkgIDogLyogbm8gb3V0cHV0cyAqLwotCQkJCSAgOiAibSIgKCpmcHJlZ3MuZl9mcHJlZ3MpLAotCQkJCSAgICAibSIgKGZwcmVncy5mX3BjcikKKwkJCQkgIDogIj1tIiAoKmZwcmVncy5mX2ZwcmVncyksCisJCQkJICAgICI9bSIgKCpmcHJlZ3MuZl9mcGNudGwpCisJCQkJICA6IC8qIG5vIGlucHV0cyAqLwogCQkJCSAgOiAibWVtb3J5Iik7CiAJCWVyciB8PSBjb3B5X3RvX3VzZXIoJnVjLT51Y19tY29udGV4dC5mcHJlZ3MsICZmcHJlZ3MsCiAJCQkJICAgIHNpemVvZihmcHJlZ3MpKTsKIAl9CiAJaWYgKGNvbnRleHRfc2l6ZSkKLQkJZXJyIHw9IGNvcHlfdG9fdXNlcigobG9uZyAqKSZ1Yy0+dWNfZnBzdGF0ZSArIDEsIGZwc3RhdGUgKyA0LAorCQllcnIgfD0gY29weV90b191c2VyKChsb25nIF9fdXNlciAqKSZ1Yy0+dWNfZnBzdGF0ZSArIDEsIGZwc3RhdGUgKyA0LAogCQkJCSAgICBjb250ZXh0X3NpemUpOwogCXJldHVybiBlcnI7CiB9CkBAIC01MTYsMTAgKzQ4MSwxMCBAQAogI2VuZGlmCiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHJ0X3NldHVwX3Vjb250ZXh0KHN0cnVjdCB1Y29udGV4dCAqdWMsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGlubGluZSBpbnQgcnRfc2V0dXBfdWNvbnRleHQoc3RydWN0IHVjb250ZXh0IF9fdXNlciAqdWMsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBzd2l0Y2hfc3RhY2sgKnN3ID0gKHN0cnVjdCBzd2l0Y2hfc3RhY2sgKilyZWdzIC0gMTsKLQlncmVnX3QgKmdyZWdzID0gdWMtPnVjX21jb250ZXh0LmdyZWdzOworCWdyZWdfdCBfX3VzZXIgKmdyZWdzID0gdWMtPnVjX21jb250ZXh0LmdyZWdzOwogCWludCBlcnIgPSAwOwogCiAJZXJyIHw9IF9fcHV0X3VzZXIoTUNPTlRFWFRfVkVSU0lPTiwgJnVjLT51Y19tY29udGV4dC52ZXJzaW9uKTsKQEAgLTU0Nyw3ICs1MTIsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAqCitzdGF0aWMgaW5saW5lIHZvaWQgX191c2VyICoKIGdldF9zaWdmcmFtZShzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgc2l6ZV90IGZyYW1lX3NpemUpCiB7CiAJdW5zaWduZWQgbG9uZyB1c3A7CkBAIC01NjAsMTMgKzUyNSwxMyBAQAogCQlpZiAoIXNhc19zc19mbGFncyh1c3ApKQogCQkJdXNwID0gY3VycmVudC0+c2FzX3NzX3NwICsgY3VycmVudC0+c2FzX3NzX3NpemU7CiAJfQotCXJldHVybiAodm9pZCAqKSgodXNwIC0gZnJhbWVfc2l6ZSkgJiAtOFVMKTsKKwlyZXR1cm4gKHZvaWQgX191c2VyICopKCh1c3AgLSBmcmFtZV9zaXplKSAmIC04VUwpOwogfQogCi1zdGF0aWMgdm9pZCBzZXR1cF9mcmFtZSAoaW50IHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwKK3N0YXRpYyBpbnQgc2V0dXBfZnJhbWUgKGludCBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsCiAJCQkgc2lnc2V0X3QgKnNldCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0Jc3RydWN0IHNpZ2ZyYW1lICpmcmFtZTsKKwlzdHJ1Y3Qgc2lnZnJhbWUgX191c2VyICpmcmFtZTsKIAlzdHJ1Y3Qgc2lnY29udGV4dCBjb250ZXh0OwogCWludCBlcnIgPSAwOwogCkBAIC02MTcsMTcgKzU4MiwxNyBAQAogCQl0cmVncy0+cGMgPSByZWdzLT5wYzsKIAkJdHJlZ3MtPnNyID0gcmVncy0+c3I7CiAJfQotCXJldHVybjsKKwlyZXR1cm4gZXJyOwogCiBnaXZlX3NpZ3NlZ3Y6CiAJZm9yY2Vfc2lnc2VndihzaWcsIGN1cnJlbnQpOwogCWdvdG8gYWRqdXN0X3N0YWNrOwogfQogCi1zdGF0aWMgdm9pZCBzZXR1cF9ydF9mcmFtZSAoaW50IHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwgc2lnaW5mb190ICppbmZvLAorc3RhdGljIGludCBzZXR1cF9ydF9mcmFtZSAoaW50IHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwgc2lnaW5mb190ICppbmZvLAogCQkJICAgIHNpZ3NldF90ICpzZXQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXN0cnVjdCBydF9zaWdmcmFtZSAqZnJhbWU7CisJc3RydWN0IHJ0X3NpZ2ZyYW1lIF9fdXNlciAqZnJhbWU7CiAJaW50IGVyciA9IDA7CiAKIAlmcmFtZSA9IGdldF9zaWdmcmFtZShrYSwgcmVncywgc2l6ZW9mKCpmcmFtZSkpOwpAQCAtNjQ0LDggKzYwOSw4IEBACiAKIAkvKiBDcmVhdGUgdGhlIHVjb250ZXh0LiAgKi8KIAllcnIgfD0gX19wdXRfdXNlcigwLCAmZnJhbWUtPnVjLnVjX2ZsYWdzKTsKLQllcnIgfD0gX19wdXRfdXNlcigwLCAmZnJhbWUtPnVjLnVjX2xpbmspOwotCWVyciB8PSBfX3B1dF91c2VyKCh2b2lkICopY3VycmVudC0+c2FzX3NzX3NwLAorCWVyciB8PSBfX3B1dF91c2VyKE5VTEwsICZmcmFtZS0+dWMudWNfbGluayk7CisJZXJyIHw9IF9fcHV0X3VzZXIoKHZvaWQgX191c2VyICopY3VycmVudC0+c2FzX3NzX3NwLAogCQkJICAmZnJhbWUtPnVjLnVjX3N0YWNrLnNzX3NwKTsKIAllcnIgfD0gX19wdXRfdXNlcihzYXNfc3NfZmxhZ3MocmR1c3AoKSksCiAJCQkgICZmcmFtZS0+dWMudWNfc3RhY2suc3NfZmxhZ3MpOwpAQCAtNjgxLDcgKzY0Niw3IEBACiAJCXRyZWdzLT5wYyA9IHJlZ3MtPnBjOwogCQl0cmVncy0+c3IgPSByZWdzLT5zcjsKIAl9Ci0JcmV0dXJuOworCXJldHVybiBlcnI7CiAKIGdpdmVfc2lnc2VndjoKIAlmb3JjZV9zaWdzZWd2KHNpZywgY3VycmVudCk7CkBAIC03MjgsNiArNjkzLDcgQEAKIGhhbmRsZV9zaWduYWwoaW50IHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwgc2lnaW5mb190ICppbmZvLAogCSAgICAgIHNpZ3NldF90ICpvbGRzZXQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogeworCWludCBlcnI7CiAJLyogYXJlIHdlIGZyb20gYSBzeXN0ZW0gY2FsbD8gKi8KIAlpZiAocmVncy0+b3JpZ19kMCA+PSAwKQogCQkvKiBJZiBzbywgY2hlY2sgc3lzdGVtIGNhbGwgcmVzdGFydGluZy4uICovCkBAIC03MzUsMTIgKzcwMSwxMiBAQAogCiAJLyogc2V0IHVwIHRoZSBzdGFjayBmcmFtZSAqLwogCWlmIChrYS0+c2Euc2FfZmxhZ3MgJiBTQV9TSUdJTkZPKQotCQlzZXR1cF9ydF9mcmFtZShzaWcsIGthLCBpbmZvLCBvbGRzZXQsIHJlZ3MpOworCQllcnIgPSBzZXR1cF9ydF9mcmFtZShzaWcsIGthLCBpbmZvLCBvbGRzZXQsIHJlZ3MpOwogCWVsc2UKLQkJc2V0dXBfZnJhbWUoc2lnLCBrYSwgb2xkc2V0LCByZWdzKTsKKwkJZXJyID0gc2V0dXBfZnJhbWUoc2lnLCBrYSwgb2xkc2V0LCByZWdzKTsKIAotCWlmIChrYS0+c2Euc2FfZmxhZ3MgJiBTQV9PTkVTSE9UKQotCQlrYS0+c2Euc2FfaGFuZGxlciA9IFNJR19ERkw7CisJaWYgKGVycikKKwkJcmV0dXJuOwogCiAJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CiAJc2lnb3JzZXRzKCZjdXJyZW50LT5ibG9ja2VkLCZjdXJyZW50LT5ibG9ja2VkLCZrYS0+c2Euc2FfbWFzayk7CkBAIC03NDgsNiArNzE0LDggQEAKIAkJc2lnYWRkc2V0KCZjdXJyZW50LT5ibG9ja2VkLHNpZyk7CiAJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKIAlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCisJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSyk7CiB9CiAKIC8qCkBAIC03NTUsMTEgKzcyMywxMiBAQAogICogd2FudCB0byBoYW5kbGUuIFRodXMgeW91IGNhbm5vdCBraWxsIGluaXQgZXZlbiB3aXRoIGEgU0lHS0lMTCBldmVuIGJ5CiAgKiBtaXN0YWtlLgogICovCi1hc21saW5rYWdlIGludCBkb19zaWduYWwoc2lnc2V0X3QgKm9sZHNldCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCithc21saW5rYWdlIHZvaWQgZG9fc2lnbmFsKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBrX3NpZ2FjdGlvbiBrYTsKIAlzaWdpbmZvX3QgaW5mbzsKIAlpbnQgc2lnbnI7CisJc2lnc2V0X3QgKm9sZHNldDsKIAogCS8qCiAJICogV2Ugd2FudCB0aGUgY29tbW9uIGNhc2UgdG8gZ28gZmFzdCwgd2hpY2gKQEAgLTc2OCwxNiArNzM3LDE4IEBACiAJICogaWYgc28uCiAJICovCiAJaWYgKCF1c2VyX21vZGUocmVncykpCi0JCXJldHVybiAxOworCQlyZXR1cm47CiAKLQlpZiAoIW9sZHNldCkKKwlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkKKwkJb2xkc2V0ID0gJmN1cnJlbnQtPnNhdmVkX3NpZ21hc2s7CisJZWxzZQogCQlvbGRzZXQgPSAmY3VycmVudC0+YmxvY2tlZDsKIAogCXNpZ25yID0gZ2V0X3NpZ25hbF90b19kZWxpdmVyKCZpbmZvLCAma2EsIHJlZ3MsIE5VTEwpOwogCWlmIChzaWduciA+IDApIHsKIAkJLyogV2hlZSEgIEFjdHVhbGx5IGRlbGl2ZXIgdGhlIHNpZ25hbC4gICovCiAJCWhhbmRsZV9zaWduYWwoc2lnbnIsICZrYSwgJmluZm8sIG9sZHNldCwgcmVncyk7Ci0JCXJldHVybiAxOworCQlyZXR1cm47CiAJfQogCiAJLyogRGlkIHdlIGNvbWUgZnJvbSBhIHN5c3RlbSBjYWxsPyAqLwpAQCAtNzg1LDUgKzc1NiwxMCBAQAogCQkvKiBSZXN0YXJ0IHRoZSBzeXN0ZW0gY2FsbCAtIG5vIGhhbmRsZXJzIHByZXNlbnQgKi8KIAkJaGFuZGxlX3Jlc3RhcnQocmVncywgTlVMTCwgMCk7CiAJfQotCXJldHVybiAwOworCisJLyogSWYgdGhlcmUncyBubyBzaWduYWwgdG8gZGVsaXZlciwgd2UganVzdCByZXN0b3JlIHRoZSBzYXZlZCBtYXNrLiAgKi8KKwlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkgeworCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKTsKKwkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZjdXJyZW50LT5zYXZlZF9zaWdtYXNrLCBOVUxMKTsKKwl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9wbGF0Zm9ybS82ODMyOC9lbnRyeS5TIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjgzMjgvZW50cnkuUwppbmRleCAyNzI0MWUxLi4yNDBhN2E2IDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9wbGF0Zm9ybS82ODMyOC9lbnRyeS5TCisrKyBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzY4MzI4L2VudHJ5LlMKQEAgLTEwNiw2ICsxMDYsNyBAQAogCW1vdmVsCSVzcCwlZDEJCQkvKiBnZXQgdGhyZWFkX2luZm8gcG9pbnRlciAqLwogCWFuZGwJIy1USFJFQURfU0laRSwlZDEKIAltb3ZlbAklZDEsJWEyCisxOgogCW1vdmUJJWEyQChUSV9GTEFHUyksJWQxCS8qIHRocmVhZF9pbmZvLT5mbGFncyAqLwogCWFuZGwJI19USUZfV09SS19NQVNLLCVkMQogCWpuZQlMd29ya190b19kbwpAQCAtMTIwLDEzICsxMjEsMTEgQEAKIAlzdWJxbAkjNCwlc3AJCQkvKiBkdW1teSByZXR1cm4gYWRkcmVzcyovCiAJU0FWRV9TV0lUQ0hfU1RBQ0sKIAlwZWEJJXNwQChTV0lUQ0hfU1RBQ0tfU0laRSkKLQljbHJsCSVzcEAtCiAJYnNydwlkb19zaWduYWwKLQlhZGRxbAkjOCwlc3AKKwlhZGRxbAkjNCwlc3AKIAlSRVNUT1JFX1NXSVRDSF9TVEFDSwogCWFkZHFsCSM0LCVzcAotTHJldHVybjoKLQlSRVNUT1JFX0FMTAorCWpyYQkxYgogCiAvKgogICogVGhpcyBpcyB0aGUgbWFpbiBpbnRlcnJ1cHQgaGFuZGxlciwgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcgcHJvY2Vzc19pbnQoKQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjgzNjAvZW50cnkuUyBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzY4MzYwL2VudHJ5LlMKaW5kZXggYzEzMWM2ZS4uOGEyODc4OCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjgzNjAvZW50cnkuUworKysgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS82ODM2MC9lbnRyeS5TCkBAIC0xMDIsNiArMTAyLDcgQEAKIAltb3ZlbAklc3AsJWQxCQkJLyogZ2V0IHRocmVhZF9pbmZvIHBvaW50ZXIgKi8KIAlhbmRsCSMtVEhSRUFEX1NJWkUsJWQxCiAJbW92ZWwJJWQxLCVhMgorMToKIAltb3ZlCSVhMkAoVElfRkxBR1MpLCVkMQkvKiB0aHJlYWRfaW5mby0+ZmxhZ3MgKi8KIAlhbmRsCSNfVElGX1dPUktfTUFTSywlZDEKIAlqbmUJTHdvcmtfdG9fZG8KQEAgLTExNiwxMyArMTE3LDExIEBACiAJc3VicWwJIzQsJXNwCQkJLyogZHVtbXkgcmV0dXJuIGFkZHJlc3MqLwogCVNBVkVfU1dJVENIX1NUQUNLCiAJcGVhCSVzcEAoU1dJVENIX1NUQUNLX1NJWkUpCi0JY2xybAklc3BALQogCWJzcncJZG9fc2lnbmFsCi0JYWRkcWwJIzgsJXNwCisJYWRkcWwJIzQsJXNwCiAJUkVTVE9SRV9TV0lUQ0hfU1RBQ0sKIAlhZGRxbAkjNCwlc3AKLUxyZXR1cm46Ci0JUkVTVE9SRV9BTEwKKwlqcmEJMWIKIAogLyoKICAqIFRoaXMgaXMgdGhlIG1haW4gaW50ZXJydXB0IGhhbmRsZXIsIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIGRvX0lSUSgpCmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9wbGF0Zm9ybS9jb2xkZmlyZS9lbnRyeS5TIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vY29sZGZpcmUvZW50cnkuUwppbmRleCA1ZTkyYmVkLi5lMWRlYmM4IDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9wbGF0Zm9ybS9jb2xkZmlyZS9lbnRyeS5TCisrKyBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtL2NvbGRmaXJlL2VudHJ5LlMKQEAgLTE2NywxMiArMTY3LDExIEBACiAJc3VicWwJIzQsJXNwCQkJLyogZHVtbXkgcmV0dXJuIGFkZHJlc3MgKi8KIAlTQVZFX1NXSVRDSF9TVEFDSwogCXBlYQklc3BAKFNXSVRDSF9TVEFDS19TSVpFKQotCWNscmwJJXNwQC0KIAlqc3IJZG9fc2lnbmFsCi0JYWRkcWwJIzgsJXNwCisJYWRkcWwJIzQsJXNwCiAJUkVTVE9SRV9TV0lUQ0hfU1RBQ0sKIAlhZGRxbAkjNCwlc3AKLQlqbXAJTHJldHVybgorCWptcAlMdXNlcl9yZXR1cm4KIAogLyoKICAqIFRoaXMgaXMgdGhlIGdlbmVyaWMgaW50ZXJydXB0IGhhbmRsZXIgKGZvciBhbGwgaGFyZHdhcmUgaW50ZXJydXB0CmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvS2NvbmZpZyBiL2FyY2gvbWljcm9ibGF6ZS9LY29uZmlnCmluZGV4IDM4N2Q1ZmYuLjVmNTAxOGEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9LY29uZmlnCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9LY29uZmlnCkBAIC0xNCw3ICsxNCw3IEBACiAJc2VsZWN0IEhBVkVfRE1BX0FQSV9ERUJVRwogCXNlbGVjdCBUUkFDSU5HX1NVUFBPUlQKIAlzZWxlY3QgT0YKLQlzZWxlY3QgT0ZfRkxBVFRSRUUKKwlzZWxlY3QgT0ZfRUFSTFlfRkxBVFRSRUUKIAogY29uZmlnIFNXQVAKIAlkZWZfYm9vbCBuCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvYm9vdC9NYWtlZmlsZSBiL2FyY2gvbWljcm9ibGF6ZS9ib290L01ha2VmaWxlCmluZGV4IGJlMDFkNzguLjRjNGU1OGUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9ib290L01ha2VmaWxlCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9ib290L01ha2VmaWxlCkBAIC0xMCw5ICsxMCw2IEBACiAKIE9CSkNPUFlGTEFHUyA6PSAtTyBiaW5hcnkKIAotIyBXaGVyZSB0aGUgRFRTIGZpbGVzIGxpdmUKLWR0c3RyZWUgICAgICAgICA6PSAkKHNyY3RyZWUpLyQoc3JjKS9kdHMKLQogIyBFbnN1cmUgc3lzdGVtLmR0YiBleGlzdHMKICQob2JqKS9saW5rZWRfZHRiLm86ICQob2JqKS9zeXN0ZW0uZHRiCiAKQEAgLTUxLDE0ICs0OCwxMSBAQAogCSQoY2FsbCBpZl9jaGFuZ2VkLHN0cmlwKQogCUBlY2hvICdLZXJuZWw6ICRAIGlzIHJlYWR5JyAnICgjJ2BjYXQgLnZlcnNpb25gJyknCiAKLSMgUnVsZSB0byBidWlsZCBkZXZpY2UgdHJlZSBibG9icwotRFRDID0gJChvYmp0cmVlKS9zY3JpcHRzL2R0Yy9kdGMKIAogIyBSdWxlIHRvIGJ1aWxkIGRldmljZSB0cmVlIGJsb2JzCi1xdWlldF9jbWRfZHRjID0gRFRDICAgICAkQAotCWNtZF9kdGMgPSAkKERUQykgLU8gZHRiIC1vICQob2JqKS8kKi5kdGIgLWIgMCAtcCAxMDI0ICQoZHRzdHJlZSkvJCouZHRzCitEVENfRkxBR1MgOj0gLXAgMTAyNAogCi0kKG9iaikvJS5kdGI6ICQoZHRzdHJlZSkvJS5kdHMgRk9SQ0UKLQkkKGNhbGwgaWZfY2hhbmdlZCxkdGMpCiskKG9iaikvJS5kdGI6ICQoc3JjKS9kdHMvJS5kdHMgRk9SQ0UKKwkkKGNhbGwgY21kLGR0YykKIAogY2xlYW4tZmlsZXMgKz0gKi5kdGIgc2ltcGxlSW1hZ2UuKi51bnN0cmlwIGxpbnV4LmJpbi51YgpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL3Byb20uaCBiL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9wcm9tLmgKaW5kZXggYmRjMzgzMTIuLjJlNzJhZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9wcm9tLmgKKysrIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL3Byb20uaApAQCAtNjQsOSArNjQsNiBAQAogLyogQ1BVIE9GIG5vZGUgbWF0Y2hpbmcgKi8KIHN0cnVjdCBkZXZpY2Vfbm9kZSAqb2ZfZ2V0X2NwdV9ub2RlKGludCBjcHUsIHVuc2lnbmVkIGludCAqdGhyZWFkKTsKIAotLyogR2V0IHRoZSBNQUMgYWRkcmVzcyAqLwotZXh0ZXJuIGNvbnN0IHZvaWQgKm9mX2dldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKLQogLyoqCiAgKiBvZl9pcnFfbWFwX3BjaSAtIFJlc29sdmUgdGhlIGludGVycnVwdCBmb3IgYSBQQ0kgZGV2aWNlCiAgKiBAcGRldjoJdGhlIGRldmljZSB3aG9zZSBpbnRlcnJ1cHQgaXMgdG8gYmUgcmVzb2x2ZWQKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvcHJvbV9wYXJzZS5jIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9wcm9tX3BhcnNlLmMKaW5kZXggOTlkOWI2MS4uOWFlMjRmNCAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9wcm9tX3BhcnNlLmMKKysrIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9wcm9tX3BhcnNlLmMKQEAgLTExMCw0MSArMTEwLDMgQEAKIAljZWxscyA9IHByb3AgPyAqKHUzMiAqKXByb3AgOiBvZl9uX3NpemVfY2VsbHMoZG4pOwogCSpzaXplID0gb2ZfcmVhZF9udW1iZXIoZG1hX3dpbmRvdywgY2VsbHMpOwogfQotCi0vKioKLSAqIFNlYXJjaCB0aGUgZGV2aWNlIHRyZWUgZm9yIHRoZSBiZXN0IE1BQyBhZGRyZXNzIHRvIHVzZS4gICdtYWMtYWRkcmVzcycgaXMKLSAqIGNoZWNrZWQgZmlyc3QsIGJlY2F1c2UgdGhhdCBpcyBzdXBwb3NlZCB0byBjb250YWluIHRvICJtb3N0IHJlY2VudCIgTUFDCi0gKiBhZGRyZXNzLiBJZiB0aGF0IGlzbid0IHNldCwgdGhlbiAnbG9jYWwtbWFjLWFkZHJlc3MnIGlzIGNoZWNrZWQgbmV4dCwKLSAqIGJlY2F1c2UgdGhhdCBpcyB0aGUgZGVmYXVsdCBhZGRyZXNzLiAgSWYgdGhhdCBpc24ndCBzZXQsIHRoZW4gdGhlIG9ic29sZXRlCi0gKiAnYWRkcmVzcycgaXMgY2hlY2tlZCwganVzdCBpbiBjYXNlIHdlJ3JlIHVzaW5nIGFuIG9sZCBkZXZpY2UgdHJlZS4KLSAqCi0gKiBOb3RlIHRoYXQgdGhlICdhZGRyZXNzJyBwcm9wZXJ0eSBpcyBzdXBwb3NlZCB0byBjb250YWluIGEgdmlydHVhbCBhZGRyZXNzIG9mCi0gKiB0aGUgcmVnaXN0ZXIgc2V0LCBidXQgc29tZSBEVFMgZmlsZXMgaGF2ZSByZWRlZmluZWQgdGhhdCBwcm9wZXJ0eSB0byBiZSB0aGUKLSAqIE1BQyBhZGRyZXNzLgotICoKLSAqIEFsbC16ZXJvIE1BQyBhZGRyZXNzZXMgYXJlIHJlamVjdGVkLCBiZWNhdXNlIHRob3NlIGNvdWxkIGJlIHByb3BlcnRpZXMgdGhhdAotICogZXhpc3QgaW4gdGhlIGRldmljZSB0cmVlLCBidXQgd2VyZSBub3Qgc2V0IGJ5IFUtQm9vdC4gIEZvciBleGFtcGxlLCB0aGUKLSAqIERUUyBjb3VsZCBkZWZpbmUgJ21hYy1hZGRyZXNzJyBhbmQgJ2xvY2FsLW1hYy1hZGRyZXNzJywgd2l0aCB6ZXJvIE1BQwotICogYWRkcmVzc2VzLiAgU29tZSBvbGRlciBVLUJvb3RzIG9ubHkgaW5pdGlhbGl6ZWQgJ2xvY2FsLW1hYy1hZGRyZXNzJy4gIEluCi0gKiB0aGlzIGNhc2UsIHRoZSByZWFsIE1BQyBpcyBpbiAnbG9jYWwtbWFjLWFkZHJlc3MnLCBhbmQgJ21hYy1hZGRyZXNzJyBleGlzdHMKLSAqIGJ1dCBpcyBhbGwgemVyb3MuCi0qLwotY29uc3Qgdm9pZCAqb2ZfZ2V0X21hY19hZGRyZXNzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCi17Ci0Jc3RydWN0IHByb3BlcnR5ICpwcDsKLQotCXBwID0gb2ZfZmluZF9wcm9wZXJ0eShucCwgIm1hYy1hZGRyZXNzIiwgTlVMTCk7Ci0JaWYgKHBwICYmIChwcC0+bGVuZ3RoID09IDYpICYmIGlzX3ZhbGlkX2V0aGVyX2FkZHIocHAtPnZhbHVlKSkKLQkJcmV0dXJuIHBwLT52YWx1ZTsKLQotCXBwID0gb2ZfZmluZF9wcm9wZXJ0eShucCwgImxvY2FsLW1hYy1hZGRyZXNzIiwgTlVMTCk7Ci0JaWYgKHBwICYmIChwcC0+bGVuZ3RoID09IDYpICYmIGlzX3ZhbGlkX2V0aGVyX2FkZHIocHAtPnZhbHVlKSkKLQkJcmV0dXJuIHBwLT52YWx1ZTsKLQotCXBwID0gb2ZfZmluZF9wcm9wZXJ0eShucCwgImFkZHJlc3MiLCBOVUxMKTsKLQlpZiAocHAgJiYgKHBwLT5sZW5ndGggPT0gNikgJiYgaXNfdmFsaWRfZXRoZXJfYWRkcihwcC0+dmFsdWUpKQotCQlyZXR1cm4gcHAtPnZhbHVlOwotCi0JcmV0dXJuIE5VTEw7Ci19Ci1FWFBPUlRfU1lNQk9MKG9mX2dldF9tYWNfYWRkcmVzcyk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvS2NvbmZpZyBiL2FyY2gvbWlwcy9LY29uZmlnCmluZGV4IDBhOWI1YjguLmY0ODllYzMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9LY29uZmlnCisrKyBiL2FyY2gvbWlwcy9LY29uZmlnCkBAIC0yMjE4LDcgKzIyMTgsNyBAQAogY29uZmlnIFVTRV9PRgogCWJvb2wgIkZsYXR0ZW5lZCBEZXZpY2UgVHJlZSBzdXBwb3J0IgogCXNlbGVjdCBPRgotCXNlbGVjdCBPRl9GTEFUVFJFRQorCXNlbGVjdCBPRl9FQVJMWV9GTEFUVFJFRQogCWhlbHAKIAkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgZmxhdHRlbmVkIGRldmljZSB0cmVlIG1hY2hpbmUgZGVzY3JpcHRpb25zLgogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9LY29uZmlnCmluZGV4IGU2MjVlOWUuLjQ4ZmI0NzkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9LY29uZmlnCkBAIC0xMTYsNyArMTE2LDcgQEAKIAlib29sCiAJZGVmYXVsdCB5CiAJc2VsZWN0IE9GCi0Jc2VsZWN0IE9GX0ZMQVRUUkVFCisJc2VsZWN0IE9GX0VBUkxZX0ZMQVRUUkVFCiAJc2VsZWN0IEhBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQKIAlzZWxlY3QgSEFWRV9EWU5BTUlDX0ZUUkFDRQogCXNlbGVjdCBIQVZFX0ZVTkNUSU9OX1RSQUNFUgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvYm9vdC9NYWtlZmlsZQppbmRleCBmYWU4MTkyLi45NmRlZWM2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9NYWtlZmlsZQpAQCAtMzUsNyArMzUsNyBAQAogCiBCT09UQ0ZMQUdTCSs9IC1JJChvYmopIC1JJChzcmN0cmVlKS8kKG9iaikKIAotRFRTX0ZMQUdTCT89IC1wIDEwMjQKK0RUQ19GTEFHUwk/PSAtcCAxMDI0CiAKICQob2JqKS80eHgubzogQk9PVENGTEFHUyArPSAtbWNwdT00MDUKICQob2JqKS9lYm9ueS5vOiBCT09UQ0ZMQUdTICs9IC1tY3B1PTQwNQpAQCAtMzMyLDEwICszMzIsOCBAQAogCSQoY2FsbCBpZl9jaGFuZ2VkLHdyYXAsdHJlZWJvb3QtJCosLCQob2JqKS8kKi5kdGIpCiAKICMgUnVsZSB0byBidWlsZCBkZXZpY2UgdHJlZSBibG9icwotRFRDID0gJChvYmp0cmVlKS9zY3JpcHRzL2R0Yy9kdGMKLQotJChvYmopLyUuZHRiOiAkKGR0c3RyZWUpLyUuZHRzCi0JJChEVEMpIC1PIGR0YiAtbyAkKG9iaikvJCouZHRiIC1iIDAgJChEVFNfRkxBR1MpICQoZHRzdHJlZSkvJCouZHRzCiskKG9iaikvJS5kdGI6ICQoc3JjKS9kdHMvJS5kdHMKKwkkKGNhbGwgY21kLGR0YykKIAogIyBJZiB0aGVyZSBpc24ndCBhIHBsYXRmb3JtIHNlbGVjdGVkIHRoZW4ganVzdCBzdHJpcCB0aGUgdm1saW51eC4KIGlmZXEgKCwkKGltYWdlLXkpKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2JsdWVzdG9uZS5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvYmx1ZXN0b25lLmR0cwppbmRleCA5YmIzZDcyLi4yYTU2YTBkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvYmx1ZXN0b25lLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvYmx1ZXN0b25lLmR0cwpAQCAtMzMsNyArMzMsNyBAQAogCWFsaWFzZXMgewogCQlldGhlcm5ldDAgPSAmRU1BQzA7CiAJCXNlcmlhbDAgPSAmVUFSVDA7Ci0JCXNlcmlhbDEgPSAmVUFSVDE7CisJCS8vc2VyaWFsMSA9ICZVQVJUMTsgLS1nY2wgbWlzc2luZyBVQVJUMSBsYWJlbAogCX07CiAKIAljcHVzIHsKQEAgLTUyLDcgKzUyLDcgQEAKIAkJCWQtY2FjaGUtc2l6ZSA9IDwzMjc2OD47CiAJCQlkY3ItY29udHJvbGxlcjsKIAkJCWRjci1hY2Nlc3MtbWV0aG9kID0gIm5hdGl2ZSI7Ci0JCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMkMwPjsKKwkJCS8vbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJDMD47IC0tZ2NsIG1pc3NpbmcgTDJDMCBsYWJlbAogCQl9OwogCX07CiAKQEAgLTE0Miw3ICsxNDIsNyBAQAogCQkJCQkvKlJYRU9CKi8gMHg3IDB4NAogCQkJCQkvKlNFUlIqLyAgMHgzIDB4NAogCQkJCQkvKlRYREUqLyAgMHg0IDB4NAotCQkJCQkvKlJYREUqLyAgMHg1IDB4NAorCQkJCQkvKlJYREUqLyAgMHg1IDB4ND47CiAJCX07CiAKIAkJUE9CMDogb3BiIHsKQEAgLTE4Miw3ICsxODIsNyBAQAogCQkJCQkJcmVnID0gPDB4MDAxYTAwMDAgMHgwMDA2MDAwMD47CiAJCQkJCX07CiAJCQkJfTsKLQkJCX0KKwkJCX07CiAKIAkJCVVBUlQwOiBzZXJpYWxAZWY2MDAzMDAgewogCQkJCWRldmljZV90eXBlID0gInNlcmlhbCI7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvY201MjAwLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9jbTUyMDAuZHRzCmluZGV4IGRkMzg2MDguLmFkM2E0ZjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9jbTUyMDAuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9jbTUyMDAuZHRzCkBAIC0xMCwyMjAgKzEwLDc0IEBACiAgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKLS9kdHMtdjEvOworL2luY2x1ZGUvICJtcGM1MjAwYi5kdHNpIgogCiAvIHsKIAltb2RlbCA9ICJzY2hpbmRsZXIsY201MjAwIjsKIAljb21wYXRpYmxlID0gInNjaGluZGxlcixjbTUyMDAiOwotCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCSNzaXplLWNlbGxzID0gPDE+OwotCWludGVycnVwdC1wYXJlbnQgPSA8Jm1wYzUyMDBfcGljPjsKLQotCWNwdXMgewotCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8MD47Ci0KLQkJUG93ZXJQQyw1MjAwQDAgewotCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKLQkJCXJlZyA9IDwwPjsKLQkJCWQtY2FjaGUtbGluZS1zaXplID0gPDMyPjsKLQkJCWktY2FjaGUtbGluZS1zaXplID0gPDMyPjsKLQkJCWQtY2FjaGUtc2l6ZSA9IDwweDQwMDA+OwkJLy8gTDEsIDE2SwotCQkJaS1jYWNoZS1zaXplID0gPDB4NDAwMD47CQkvLyBMMSwgMTZLCi0JCQl0aW1lYmFzZS1mcmVxdWVuY3kgPSA8MD47CS8vIGZyb20gYm9vdGxvYWRlcgotCQkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCi0JCX07Ci0JfTsKLQotCW1lbW9yeSB7Ci0JCWRldmljZV90eXBlID0gIm1lbW9yeSI7Ci0JCXJlZyA9IDwweDAwMDAwMDAwIDB4MDQwMDAwMDA+OwkvLyA2NE1CCi0JfTsKIAogCXNvYzUyMDBAZjAwMDAwMDAgewotCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWltbXIiOwotCQlyYW5nZXMgPSA8MCAweGYwMDAwMDAwIDB4MDAwMGMwMDA+OwotCQlyZWcgPSA8MHhmMDAwMDAwMCAweDAwMDAwMTAwPjsKLQkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgotCQlzeXN0ZW0tZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCi0KLQkJY2RtQDIwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1jZG0iLCJmc2wsbXBjNTIwMC1jZG0iOwotCQkJcmVnID0gPDB4MjAwIDB4Mzg+OwotCQl9OwotCi0JCW1wYzUyMDBfcGljOiBpbnRlcnJ1cHQtY29udHJvbGxlckA1MDAgewotCQkJLy8gNTIwMCBpbnRlcnJ1cHRzIGFyZSBlbmNvZGVkIGludG8gdHdvIGxldmVsczsKLQkJCWludGVycnVwdC1jb250cm9sbGVyOwotCQkJI2ludGVycnVwdC1jZWxscyA9IDwzPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBpYyIsImZzbCxtcGM1MjAwLXBpYyI7Ci0JCQlyZWcgPSA8MHg1MDAgMHg4MD47Ci0JCX07Ci0KIAkJdGltZXJANjAwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjAwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDkgMD47CiAJCQlmc2wsaGFzLXdkdDsKIAkJfTsKIAotCQl0aW1lckA2MTAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2MTAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTAgMD47CisJCWNhbkA5MDAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAotCQl0aW1lckA2MjAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2MjAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTEgMD47CisJCWNhbkA5ODAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAotCQl0aW1lckA2MzAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2MzAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTIgMD47Ci0JCX07Ci0KLQkJdGltZXJANjQwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjQwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDEzIDA+OwotCQl9OwotCi0JCXRpbWVyQDY1MCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDY1MCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxNCAwPjsKLQkJfTsKLQotCQl0aW1lckA2NjAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2NjAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTUgMD47Ci0JCX07Ci0KLQkJdGltZXJANjcwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjcwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDE2IDA+OwotCQl9OwotCi0JCXJ0Y0A4MDAgewkvLyBSZWFsIHRpbWUgY2xvY2sKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXJ0YyIsImZzbCxtcGM1MjAwLXJ0YyI7Ci0JCQlyZWcgPSA8MHg4MDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDUgMCAxIDYgMD47Ci0JCX07Ci0KLQkJZ3Bpb19zaW1wbGU6IGdwaW9AYjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwaW8iLCJmc2wsbXBjNTIwMC1ncGlvIjsKLQkJCXJlZyA9IDwweGIwMCAweDQwPjsKLQkJCWludGVycnVwdHMgPSA8MSA3IDA+OwotCQkJZ3Bpby1jb250cm9sbGVyOwotCQkJI2dwaW8tY2VsbHMgPSA8Mj47Ci0JCX07Ci0KLQkJZ3Bpb193a3VwOiBncGlvQGMwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncGlvLXdrdXAiLCJmc2wsbXBjNTIwMC1ncGlvLXdrdXAiOwotCQkJcmVnID0gPDB4YzAwIDB4NDA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDggMCAwIDMgMD47Ci0JCQlncGlvLWNvbnRyb2xsZXI7Ci0JCQkjZ3Bpby1jZWxscyA9IDwyPjsKLQkJfTsKLQotCQlzcGlAZjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXNwaSIsImZzbCxtcGM1MjAwLXNwaSI7Ci0JCQlyZWcgPSA8MHhmMDAgMHgyMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMTMgMCAyIDE0IDA+OwotCQl9OwotCi0JCXVzYkAxMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLW9oY2kiLCJmc2wsbXBjNTIwMC1vaGNpIiwib2hjaS1iZSI7Ci0JCQlyZWcgPSA8MHgxMDAwIDB4ZmY+OwotCQkJaW50ZXJydXB0cyA9IDwyIDYgMD47Ci0JCX07Ci0KLQkJZG1hLWNvbnRyb2xsZXJAMTIwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1iZXN0Y29tbSIsImZzbCxtcGM1MjAwLWJlc3Rjb21tIjsKLQkJCXJlZyA9IDwweDEyMDAgMHg4MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDMgMCAwICAzIDEgMCAgMyAyIDAgIDMgMyAwCi0JCQkgICAgICAgICAgICAgIDMgNCAwICAzIDUgMCAgMyA2IDAgIDMgNyAwCi0JCQkgICAgICAgICAgICAgIDMgOCAwICAzIDkgMCAgMyAxMCAwICAzIDExIDAKLQkJCSAgICAgICAgICAgICAgMyAxMiAwICAzIDEzIDAgIDMgMTQgMCAgMyAxNSAwPjsKLQkJfTsKLQotCQl4bGJAMWYwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi14bGIiLCJmc2wsbXBjNTIwMC14bGIiOwotCQkJcmVnID0gPDB4MWYwMCAweDEwMD47Ci0JCX07Ci0KLQkJc2VyaWFsQDIwMDAgewkJLy8gUFNDMQorCQlwc2NAMjAwMCB7CQkvLyBQU0MxCiAJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1wc2MtdWFydCIsImZzbCxtcGM1MjAwLXBzYy11YXJ0IjsKLQkJCXJlZyA9IDwweDIwMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDEgMD47CiAJCX07CiAKLQkJc2VyaWFsQDIyMDAgewkJLy8gUFNDMgorCQlwc2NAMjIwMCB7CQkvLyBQU0MyCiAJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1wc2MtdWFydCIsImZzbCxtcGM1MjAwLXBzYy11YXJ0IjsKLQkJCXJlZyA9IDwweDIyMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDIgMD47CiAJCX07CiAKLQkJc2VyaWFsQDI0MDAgewkJLy8gUFNDMworCQlwc2NAMjQwMCB7CQkvLyBQU0MzCiAJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1wc2MtdWFydCIsImZzbCxtcGM1MjAwLXBzYy11YXJ0IjsKLQkJCXJlZyA9IDwweDI0MDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDMgMD47CiAJCX07CiAKLQkJc2VyaWFsQDJjMDAgewkJLy8gUFNDNgorCQlwc2NAMjYwMCB7CQkvLyBQU0M0CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQl9OworCisJCXBzY0AyODAwIHsJCS8vIFBTQzUKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCX07CisKKwkJcHNjQDJjMDAgewkJLy8gUFNDNgogCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcHNjLXVhcnQiLCJmc2wsbXBjNTIwMC1wc2MtdWFydCI7Ci0JCQlyZWcgPSA8MHgyYzAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MiA0IDA+OwogCQl9OwogCiAJCWV0aGVybmV0QDMwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZmVjIiwiZnNsLG1wYzUyMDAtZmVjIjsKLQkJCXJlZyA9IDwweDMwMDAgMHg0MDA+OwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07Ci0JCQlpbnRlcnJ1cHRzID0gPDIgNSAwPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTA+OwogCQl9OwogCiAJCW1kaW9AMzAwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItbWRpbyIsImZzbCxtcGM1MjAwLW1kaW8iOwotCQkJcmVnID0gPDB4MzAwMCAweDQwMD47ICAgICAgIC8vIGZlYyByYW5nZSwgc2luY2Ugd2UgbmVlZCB0byBzZXR1cCBmZWMgaW50ZXJydXB0cwotCQkJaW50ZXJydXB0cyA9IDwyIDUgMD47ICAgLy8gdGhlc2UgYXJlIGZvciAibWlpIGNvbW1hbmQgZmluaXNoZWQiLCBub3QgbGluayBjaGFuZ2VzICYgY28uCi0KIAkJCXBoeTA6IGV0aGVybmV0LXBoeUAwIHsKIAkJCQlyZWcgPSA8MD47CiAJCQl9OwogCQl9OwogCi0JCWkyY0AzZDQwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1pMmMiLCJmc2wsbXBjNTIwMC1pMmMiLCJmc2wtaTJjIjsKLQkJCXJlZyA9IDwweDNkNDAgMHg0MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMTYgMD47CisJCWF0YUAzYTAwIHsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07CiAKLQkJc3JhbUA4MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXNyYW0iLCJmc2wsbXBjNTIwMC1zcmFtIjsKLQkJCXJlZyA9IDwweDgwMDAgMHg0MDAwPjsKKwkJaTJjQDNkMDAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKKworCX07CisKKwlwY2lAZjAwMDBkMDAgeworCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCX07CiAKIAlsb2NhbGJ1cyB7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWxwYiIsInNpbXBsZS1idXMiOwotCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKLQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCXJhbmdlcyA9IDwwIDAgMHhmYzAwMDAwMCAweDIwMDAwMDA+OwotCiAJCS8vIDE2LWJpdCBmbGFzaCBkZXZpY2UgYXQgTG9jYWxQbHVzIEJ1cyBDUzAKIAkJZmxhc2hAMCwwIHsKIAkJCWNvbXBhdGlibGUgPSAiY2ZpLWZsYXNoIjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9kaWdzeV9tdGMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2RpZ3N5X210Yy5kdHMKaW5kZXggOGU5YmU2Yi4uMjdiZDI2NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2RpZ3N5X210Yy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2RpZ3N5X210Yy5kdHMKQEAgLTExLDE5NSArMTEsNjggQEAKICAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotL2R0cy12MS87CisvaW5jbHVkZS8gIm1wYzUyMDBiLmR0c2kiCiAKIC8gewogCW1vZGVsID0gImludGVyY29udHJvbCxkaWdzeS1tdGMiOwogCWNvbXBhdGlibGUgPSAiaW50ZXJjb250cm9sLGRpZ3N5LW10YyI7Ci0JI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JI3NpemUtY2VsbHMgPSA8MT47Ci0JaW50ZXJydXB0LXBhcmVudCA9IDwmbXBjNTIwMF9waWM+OwotCi0JY3B1cyB7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQotCQlQb3dlclBDLDUyMDBAMCB7Ci0JCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwotCQkJcmVnID0gPDA+OwotCQkJZC1jYWNoZS1saW5lLXNpemUgPSA8MzI+OwotCQkJaS1jYWNoZS1saW5lLXNpemUgPSA8MzI+OwotCQkJZC1jYWNoZS1zaXplID0gPDB4NDAwMD47CQkvLyBMMSwgMTZLCi0JCQlpLWNhY2hlLXNpemUgPSA8MHg0MDAwPjsJCS8vIEwxLCAxNksKLQkJCXRpbWViYXNlLWZyZXF1ZW5jeSA9IDwwPjsJLy8gZnJvbSBib290bG9hZGVyCi0JCQlidXMtZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCi0JCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKLQkJfTsKLQl9OwogCiAJbWVtb3J5IHsKLQkJZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKIAkJcmVnID0gPDB4MDAwMDAwMDAgMHgwMjAwMDAwMD47CS8vIDMyTUIKIAl9OwogCiAJc29jNTIwMEBmMDAwMDAwMCB7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItaW1tciI7Ci0JCXJhbmdlcyA9IDwwIDB4ZjAwMDAwMDAgMHgwMDAwYzAwMD47Ci0JCXJlZyA9IDwweGYwMDAwMDAwIDB4MDAwMDAxMDA+OwotCQlidXMtZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCi0JCXN5c3RlbS1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKLQotCQljZG1AMjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWNkbSIsImZzbCxtcGM1MjAwLWNkbSI7Ci0JCQlyZWcgPSA8MHgyMDAgMHgzOD47Ci0JCX07Ci0KLQkJbXBjNTIwMF9waWM6IGludGVycnVwdC1jb250cm9sbGVyQDUwMCB7Ci0JCQkvLyA1MjAwIGludGVycnVwdHMgYXJlIGVuY29kZWQgaW50byB0d28gbGV2ZWxzOwotCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7Ci0JCQkjaW50ZXJydXB0LWNlbGxzID0gPDM+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcGljIiwiZnNsLG1wYzUyMDAtcGljIjsKLQkJCXJlZyA9IDwweDUwMCAweDgwPjsKLQkJfTsKLQogCQl0aW1lckA2MDAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2MDAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgOSAwPjsKIAkJCWZzbCxoYXMtd2R0OwogCQl9OwogCi0JCXRpbWVyQDYxMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDYxMCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxMCAwPjsKKwkJcnRjQDgwMCB7CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQl9OwogCi0JCXRpbWVyQDYyMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDYyMCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxMSAwPjsKKwkJY2FuQDkwMCB7CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQl9OwogCi0JCXRpbWVyQDYzMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDYzMCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxMiAwPjsKKwkJY2FuQDk4MCB7CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQl9OwogCi0JCXRpbWVyQDY0MCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDY0MCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxMyAwPjsKKwkJcHNjQDIwMDAgewkJLy8gUFNDMQorCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAotCQl0aW1lckA2NTAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2NTAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTQgMD47CisJCXBzY0AyMjAwIHsJCS8vIFBTQzIKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07CiAKLQkJdGltZXJANjYwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjYwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDE1IDA+OworCQlwc2NAMjQwMCB7CQkvLyBQU0MzCisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQl9OwogCi0JCXRpbWVyQDY3MCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDY3MCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxNiAwPjsKLQkJfTsKLQotCQlncGlvX3NpbXBsZTogZ3Bpb0BiMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3BpbyIsImZzbCxtcGM1MjAwLWdwaW8iOwotCQkJcmVnID0gPDB4YjAwIDB4NDA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDcgMD47Ci0JCQlncGlvLWNvbnRyb2xsZXI7Ci0JCQkjZ3Bpby1jZWxscyA9IDwyPjsKLQkJfTsKLQotCQlncGlvX3drdXA6IGdwaW9AYzAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwaW8td2t1cCIsImZzbCxtcGM1MjAwLWdwaW8td2t1cCI7Ci0JCQlyZWcgPSA8MHhjMDAgMHg0MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgOCAwIDAgMyAwPjsKLQkJCWdwaW8tY29udHJvbGxlcjsKLQkJCSNncGlvLWNlbGxzID0gPDI+OwotCQl9OwotCi0JCXNwaUBmMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItc3BpIiwiZnNsLG1wYzUyMDAtc3BpIjsKLQkJCXJlZyA9IDwweGYwMCAweDIwPjsKLQkJCWludGVycnVwdHMgPSA8MiAxMyAwIDIgMTQgMD47Ci0JCX07Ci0KLQkJdXNiQDEwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItb2hjaSIsImZzbCxtcGM1MjAwLW9oY2kiLCJvaGNpLWJlIjsKLQkJCXJlZyA9IDwweDEwMDAgMHhmZj47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgNiAwPjsKLQkJfTsKLQotCQlkbWEtY29udHJvbGxlckAxMjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWJlc3Rjb21tIiwiZnNsLG1wYzUyMDAtYmVzdGNvbW0iOwotCQkJcmVnID0gPDB4MTIwMCAweDgwPjsKLQkJCWludGVycnVwdHMgPSA8MyAwIDAgIDMgMSAwICAzIDIgMCAgMyAzIDAKLQkJCSAgICAgICAgICAgICAgMyA0IDAgIDMgNSAwICAzIDYgMCAgMyA3IDAKLQkJCSAgICAgICAgICAgICAgMyA4IDAgIDMgOSAwICAzIDEwIDAgIDMgMTEgMAotCQkJICAgICAgICAgICAgICAzIDEyIDAgIDMgMTMgMCAgMyAxNCAwICAzIDE1IDA+OwotCQl9OwotCi0JCXhsYkAxZjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXhsYiIsImZzbCxtcGM1MjAwLXhsYiI7Ci0JCQlyZWcgPSA8MHgxZjAwIDB4MTAwPjsKLQkJfTsKLQotCQlzZXJpYWxAMjYwMCB7CQkvLyBQU0M0CisJCXBzY0AyNjAwIHsJCS8vIFBTQzQKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBzYy11YXJ0IiwiZnNsLG1wYzUyMDAtcHNjLXVhcnQiOwotCQkJcmVnID0gPDB4MjYwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMTEgMD47CiAJCX07CiAKLQkJc2VyaWFsQDI4MDAgewkJLy8gUFNDNQorCQlwc2NAMjgwMCB7CQkvLyBQU0M1CiAJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1wc2MtdWFydCIsImZzbCxtcGM1MjAwLXBzYy11YXJ0IjsKLQkJCXJlZyA9IDwweDI4MDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDEyIDA+OworCQl9OworCisJCXBzY0AyYzAwIHsJCS8vIFBTQzYKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07CiAKIAkJZXRoZXJuZXRAMzAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1mZWMiLCJmc2wsbXBjNTIwMC1mZWMiOwotCQkJcmVnID0gPDB4MzAwMCAweDQwMD47Ci0JCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKLQkJCWludGVycnVwdHMgPSA8MiA1IDA+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5MD47CiAJCX07CiAKIAkJbWRpb0AzMDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1tZGlvIiwiZnNsLG1wYzUyMDAtbWRpbyI7Ci0JCQlyZWcgPSA8MHgzMDAwIDB4NDAwPjsgICAgICAgLy8gZmVjIHJhbmdlLCBzaW5jZSB3ZSBuZWVkIHRvIHNldHVwIGZlYyBpbnRlcnJ1cHRzCi0JCQlpbnRlcnJ1cHRzID0gPDIgNSAwPjsgICAvLyB0aGVzZSBhcmUgZm9yICJtaWkgY29tbWFuZCBmaW5pc2hlZCIsIG5vdCBsaW5rIGNoYW5nZXMgJiBjby4KLQogCQkJcGh5MDogZXRoZXJuZXQtcGh5QDAgewogCQkJCXJlZyA9IDwwPjsKIAkJCX07CiAJCX07CiAKLQkJYXRhQDNhMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItYXRhIiwiZnNsLG1wYzUyMDAtYXRhIjsKLQkJCXJlZyA9IDwweDNhMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDcgMD47Ci0JCX07Ci0KIAkJaTJjQDNkMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWkyYyIsImZzbCxtcGM1MjAwLWkyYyIsImZzbC1pMmMiOwotCQkJcmVnID0gPDB4M2QwMCAweDQwPjsKLQkJCWludGVycnVwdHMgPSA8MiAxNSAwPjsKLQogCQkJcnRjQDUwIHsKIAkJCQljb21wYXRpYmxlID0gImF0LDI0YzA4IjsKIAkJCQlyZWcgPSA8MHg1MD47CkBAIC0yMTEsMTYgKzg0LDE2IEBACiAJCQl9OwogCQl9OwogCi0JCXNyYW1AODAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1zcmFtIiwiZnNsLG1wYzUyMDAtc3JhbSI7Ci0JCQlyZWcgPSA8MHg4MDAwIDB4NDAwMD47CisJCWkyY0AzZDQwIHsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07CiAJfTsKIAotCWxwYiB7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWxwYiIsInNpbXBsZS1idXMiOwotCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKLQkJI3NpemUtY2VsbHMgPSA8MT47CisJcGNpQGYwMDAwZDAwIHsKKwkJc3RhdHVzID0gImRpc2FibGVkIjsKKwl9OworCisJbG9jYWxidXMgewogCQlyYW5nZXMgPSA8MCAwIDB4ZmYwMDAwMDAgMHgxMDAwMDAwPjsKIAogCQkvLyAxNi1iaXQgZmxhc2ggZGV2aWNlIGF0IExvY2FsUGx1cyBCdXMgQ1MwCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvaG90Zm9vdC5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvaG90Zm9vdC5kdHMKaW5kZXggY2FkOWMzOC4uNzFkM2JiNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2hvdGZvb3QuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9ob3Rmb290LmR0cwpAQCAtMTE3LDYgKzExNyw4IEBACiAJCQl9OwogCiAJCQlJSUM6IGkyY0BlZjYwMDUwMCB7CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJI3NpemUtY2VsbHMgPSA8MD47CiAJCQkJY29tcGF0aWJsZSA9ICJpYm0saWljLTQwNWVwIiwgImlibSxpaWMiOwogCQkJCXJlZyA9IDwweGVmNjAwNTAwIDB4MDAwMDAwMTE+OwogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JlVJQzA+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2xpdGU1MjAwYi5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbGl0ZTUyMDBiLmR0cwppbmRleCA1OTcwMmFjLi5mYjI4OGJiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbGl0ZTUyMDBiLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbGl0ZTUyMDBiLmR0cwpAQCAtMTAsMjU2ICsxMCw3NSBAQAogICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCi0vZHRzLXYxLzsKKy9pbmNsdWRlLyAibXBjNTIwMGIuZHRzaSIKIAogLyB7CiAJbW9kZWwgPSAiZnNsLGxpdGU1MjAwYiI7CiAJY29tcGF0aWJsZSA9ICJmc2wsbGl0ZTUyMDBiIjsKLQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkjc2l6ZS1jZWxscyA9IDwxPjsKLQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGM1MjAwX3BpYz47Ci0KLQljcHVzIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDA+OwotCi0JCVBvd2VyUEMsNTIwMEAwIHsKLQkJCWRldmljZV90eXBlID0gImNwdSI7Ci0JCQlyZWcgPSA8MD47Ci0JCQlkLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47Ci0JCQlpLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47Ci0JCQlkLWNhY2hlLXNpemUgPSA8MHg0MDAwPjsJLy8gTDEsIDE2SwotCQkJaS1jYWNoZS1zaXplID0gPDB4NDAwMD47CS8vIEwxLCAxNksKLQkJCXRpbWViYXNlLWZyZXF1ZW5jeSA9IDwwPjsJLy8gZnJvbSBib290bG9hZGVyCi0JCQlidXMtZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCi0JCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKLQkJfTsKLQl9OwogCiAJbWVtb3J5IHsKLQkJZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKIAkJcmVnID0gPDB4MDAwMDAwMDAgMHgxMDAwMDAwMD47CS8vIDI1Nk1CCiAJfTsKIAogCXNvYzUyMDBAZjAwMDAwMDAgewotCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWltbXIiOwotCQlyYW5nZXMgPSA8MCAweGYwMDAwMDAwIDB4MDAwMGMwMDA+OwotCQlyZWcgPSA8MHhmMDAwMDAwMCAweDAwMDAwMTAwPjsKLQkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgotCQlzeXN0ZW0tZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCi0KLQkJY2RtQDIwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1jZG0iLCJmc2wsbXBjNTIwMC1jZG0iOwotCQkJcmVnID0gPDB4MjAwIDB4Mzg+OwotCQl9OwotCi0JCW1wYzUyMDBfcGljOiBpbnRlcnJ1cHQtY29udHJvbGxlckA1MDAgewotCQkJLy8gNTIwMCBpbnRlcnJ1cHRzIGFyZSBlbmNvZGVkIGludG8gdHdvIGxldmVsczsKLQkJCWludGVycnVwdC1jb250cm9sbGVyOwotCQkJI2ludGVycnVwdC1jZWxscyA9IDwzPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBpYyIsImZzbCxtcGM1MjAwLXBpYyI7Ci0JCQlyZWcgPSA8MHg1MDAgMHg4MD47Ci0JCX07Ci0KIAkJdGltZXJANjAwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjAwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDkgMD47CiAJCQlmc2wsaGFzLXdkdDsKIAkJfTsKIAotCQl0aW1lckA2MTAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2MTAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTAgMD47Ci0JCX07Ci0KLQkJdGltZXJANjIwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjIwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDExIDA+OwotCQl9OwotCi0JCXRpbWVyQDYzMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDYzMCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxMiAwPjsKLQkJfTsKLQotCQl0aW1lckA2NDAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2NDAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTMgMD47Ci0JCX07Ci0KLQkJdGltZXJANjUwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjUwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDE0IDA+OwotCQl9OwotCi0JCXRpbWVyQDY2MCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDY2MCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxNSAwPjsKLQkJfTsKLQotCQl0aW1lckA2NzAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2NzAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTYgMD47Ci0JCX07Ci0KLQkJcnRjQDgwMCB7CS8vIFJlYWwgdGltZSBjbG9jawotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcnRjIiwiZnNsLG1wYzUyMDAtcnRjIjsKLQkJCXJlZyA9IDwweDgwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgNSAwIDEgNiAwPjsKLQkJfTsKLQotCQljYW5AOTAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLW1zY2FuIiwiZnNsLG1wYzUyMDAtbXNjYW4iOwotCQkJaW50ZXJydXB0cyA9IDwyIDE3IDA+OwotCQkJcmVnID0gPDB4OTAwIDB4ODA+OwotCQl9OwotCi0JCWNhbkA5ODAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItbXNjYW4iLCJmc2wsbXBjNTIwMC1tc2NhbiI7Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMTggMD47Ci0JCQlyZWcgPSA8MHg5ODAgMHg4MD47Ci0JCX07Ci0KLQkJZ3Bpb19zaW1wbGU6IGdwaW9AYjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwaW8iLCJmc2wsbXBjNTIwMC1ncGlvIjsKLQkJCXJlZyA9IDwweGIwMCAweDQwPjsKLQkJCWludGVycnVwdHMgPSA8MSA3IDA+OwotCQkJZ3Bpby1jb250cm9sbGVyOwotCQkJI2dwaW8tY2VsbHMgPSA8Mj47Ci0JCX07Ci0KLQkJZ3Bpb193a3VwOiBncGlvQGMwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncGlvLXdrdXAiLCJmc2wsbXBjNTIwMC1ncGlvLXdrdXAiOwotCQkJcmVnID0gPDB4YzAwIDB4NDA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDggMCAwIDMgMD47Ci0JCQlncGlvLWNvbnRyb2xsZXI7Ci0JCQkjZ3Bpby1jZWxscyA9IDwyPjsKLQkJfTsKLQotCQlzcGlAZjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXNwaSIsImZzbCxtcGM1MjAwLXNwaSI7Ci0JCQlyZWcgPSA8MHhmMDAgMHgyMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMTMgMCAyIDE0IDA+OwotCQl9OwotCi0JCXVzYkAxMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLW9oY2kiLCJmc2wsbXBjNTIwMC1vaGNpIiwib2hjaS1iZSI7Ci0JCQlyZWcgPSA8MHgxMDAwIDB4ZmY+OwotCQkJaW50ZXJydXB0cyA9IDwyIDYgMD47Ci0JCX07Ci0KLQkJZG1hLWNvbnRyb2xsZXJAMTIwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1iZXN0Y29tbSIsImZzbCxtcGM1MjAwLWJlc3Rjb21tIjsKLQkJCXJlZyA9IDwweDEyMDAgMHg4MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDMgMCAwICAzIDEgMCAgMyAyIDAgIDMgMyAwCi0JCQkgICAgICAgICAgICAgIDMgNCAwICAzIDUgMCAgMyA2IDAgIDMgNyAwCi0JCQkgICAgICAgICAgICAgIDMgOCAwICAzIDkgMCAgMyAxMCAwICAzIDExIDAKLQkJCSAgICAgICAgICAgICAgMyAxMiAwICAzIDEzIDAgIDMgMTQgMCAgMyAxNSAwPjsKLQkJfTsKLQotCQl4bGJAMWYwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi14bGIiLCJmc2wsbXBjNTIwMC14bGIiOwotCQkJcmVnID0gPDB4MWYwMCAweDEwMD47Ci0JCX07Ci0KLQkJc2VyaWFsQDIwMDAgewkJLy8gUFNDMQorCQlwc2NAMjAwMCB7CQkvLyBQU0MxCiAJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1wc2MtdWFydCIsImZzbCxtcGM1MjAwLXBzYy11YXJ0IjsKIAkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQlyZWcgPSA8MHgyMDAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MiAxIDA+OworCQl9OworCisJCXBzY0AyMjAwIHsJCS8vIFBTQzIKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCX07CisKKwkJcHNjQDI0MDAgewkJLy8gUFNDMworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKKworCQlwc2NAMjYwMCB7CQkvLyBQU0M0CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQl9OworCisJCXBzY0AyODAwIHsJCS8vIFBTQzUKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCX07CisKKwkJcHNjQDJjMDAgewkJLy8gUFNDNgorCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAogCQkvLyBQU0MyIGluIGFjOTcgbW9kZSBleGFtcGxlCiAJCS8vYWM5N0AyMjAwIHsJCS8vIFBTQzIKIAkJLy8JY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcHNjLWFjOTciLCJmc2wsbXBjNTIwMC1wc2MtYWM5NyI7CiAJCS8vCWNlbGwtaW5kZXggPSA8MT47Ci0JCS8vCXJlZyA9IDwweDIyMDAgMHgxMDA+OwotCQkvLwlpbnRlcnJ1cHRzID0gPDIgMiAwPjsKIAkJLy99OwogCiAJCS8vIFBTQzMgaW4gQ09ERUMgbW9kZSBleGFtcGxlCiAJCS8vaTJzQDI0MDAgewkJLy8gUFNDMwogCQkvLwljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1wc2MtaTJzIjsgLy9ub3QgNTIwMCBjb21wYXRpYmxlCiAJCS8vCWNlbGwtaW5kZXggPSA8Mj47Ci0JCS8vCXJlZyA9IDwweDI0MDAgMHgxMDA+OwotCQkvLwlpbnRlcnJ1cHRzID0gPDIgMyAwPjsKLQkJLy99OwotCi0JCS8vIFBTQzQgaW4gdWFydCBtb2RlIGV4YW1wbGUKLQkJLy9zZXJpYWxAMjYwMCB7CQkvLyBQU0M0Ci0JCS8vCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBzYy11YXJ0IiwiZnNsLG1wYzUyMDAtcHNjLXVhcnQiOwotCQkvLwljZWxsLWluZGV4ID0gPDM+OwotCQkvLwlyZWcgPSA8MHgyNjAwIDB4MTAwPjsKLQkJLy8JaW50ZXJydXB0cyA9IDwyIDExIDA+OwotCQkvL307Ci0KLQkJLy8gUFNDNSBpbiB1YXJ0IG1vZGUgZXhhbXBsZQotCQkvL3NlcmlhbEAyODAwIHsJCS8vIFBTQzUKLQkJLy8JY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcHNjLXVhcnQiLCJmc2wsbXBjNTIwMC1wc2MtdWFydCI7Ci0JCS8vCWNlbGwtaW5kZXggPSA8ND47Ci0JCS8vCXJlZyA9IDwweDI4MDAgMHgxMDA+OwotCQkvLwlpbnRlcnJ1cHRzID0gPDIgMTIgMD47CiAJCS8vfTsKIAogCQkvLyBQU0M2IGluIHNwaSBtb2RlIGV4YW1wbGUKIAkJLy9zcGlAMmMwMCB7CQkvLyBQU0M2CiAJCS8vCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBzYy1zcGkiLCJmc2wsbXBjNTIwMC1wc2Mtc3BpIjsKIAkJLy8JY2VsbC1pbmRleCA9IDw1PjsKLQkJLy8JcmVnID0gPDB4MmMwMCAweDEwMD47Ci0JCS8vCWludGVycnVwdHMgPSA8MiA0IDA+OwogCQkvL307CiAKIAkJZXRoZXJuZXRAMzAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1mZWMiLCJmc2wsbXBjNTIwMC1mZWMiOwotCQkJcmVnID0gPDB4MzAwMCAweDQwMD47Ci0JCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKLQkJCWludGVycnVwdHMgPSA8MiA1IDA+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5MD47CiAJCX07CiAKIAkJbWRpb0AzMDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1tZGlvIiwiZnNsLG1wYzUyMDAtbWRpbyI7Ci0JCQlyZWcgPSA8MHgzMDAwIDB4NDAwPjsJLy8gZmVjIHJhbmdlLCBzaW5jZSB3ZSBuZWVkIHRvIHNldHVwIGZlYyBpbnRlcnJ1cHRzCi0JCQlpbnRlcnJ1cHRzID0gPDIgNSAwPjsJLy8gdGhlc2UgYXJlIGZvciAibWlpIGNvbW1hbmQgZmluaXNoZWQiLCBub3QgbGluayBjaGFuZ2VzICYgY28uCi0KIAkJCXBoeTA6IGV0aGVybmV0LXBoeUAwIHsKIAkJCQlyZWcgPSA8MD47CiAJCQl9OwogCQl9OwogCi0JCWF0YUAzYTAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWF0YSIsImZzbCxtcGM1MjAwLWF0YSI7Ci0JCQlyZWcgPSA8MHgzYTAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MiA3IDA+OwotCQl9OwotCi0JCWkyY0AzZDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1pMmMiLCJmc2wsbXBjNTIwMC1pMmMiLCJmc2wtaTJjIjsKLQkJCXJlZyA9IDwweDNkMDAgMHg0MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMTUgMD47Ci0JCX07Ci0KIAkJaTJjQDNkNDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWkyYyIsImZzbCxtcGM1MjAwLWkyYyIsImZzbC1pMmMiOwotCQkJcmVnID0gPDB4M2Q0MCAweDQwPjsKLQkJCWludGVycnVwdHMgPSA8MiAxNiAwPjsKLQogCQkJZWVwcm9tQDUwIHsKIAkJCQljb21wYXRpYmxlID0gImF0bWVsLDI0YzAyIjsKIAkJCQlyZWcgPSA8MHg1MD47CkBAIC0yNzMsMTIgKzkyLDYgQEAKIAl9OwogCiAJcGNpQGYwMDAwZDAwIHsKLQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwotCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1wY2kiLCJmc2wsbXBjNTIwMC1wY2kiOwotCQlyZWcgPSA8MHhmMDAwMGQwMCAweDEwMD47CiAJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMCAwIDc+OwogCQlpbnRlcnJ1cHQtbWFwID0gPDB4YzAwMCAwIDAgMSAmbXBjNTIwMF9waWMgMCAwIDMgLy8gMXN0IHNsb3QKIAkJCQkgMHhjMDAwIDAgMCAyICZtcGM1MjAwX3BpYyAxIDEgMwpAQCAtMjk4LDExICsxMTEsNiBAQAogCX07CiAKIAlsb2NhbGJ1cyB7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWxwYiIsImZzbCxtcGM1MjAwLWxwYiIsInNpbXBsZS1idXMiOwotCi0JCSNhZGRyZXNzLWNlbGxzID0gPDI+OwotCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQogCQlyYW5nZXMgPSA8MCAwIDB4ZmUwMDAwMDAgMHgwMjAwMDAwMD47CiAKIAkJZmxhc2hAMCwwIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tZWRpYTUyMDAuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21lZGlhNTIwMC5kdHMKaW5kZXggMGMzOTAyYi4uNDhkNzJmMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21lZGlhNTIwMC5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21lZGlhNTIwMC5kdHMKQEAgLTExLDE0ICsxMSwxMSBAQAogICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCi0vZHRzLXYxLzsKKy9pbmNsdWRlLyAibXBjNTIwMGIuZHRzaSIKIAogLyB7CiAJbW9kZWwgPSAiZnNsLG1lZGlhNTIwMCI7CiAJY29tcGF0aWJsZSA9ICJmc2wsbWVkaWE1MjAwIjsKLQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkjc2l6ZS1jZWxscyA9IDwxPjsKLQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGM1MjAwX3BpYz47CiAKIAlhbGlhc2VzIHsKIAkJY29uc29sZSA9ICZjb25zb2xlOwpAQCAtMzAsMTYgKzI3LDcgQEAKIAl9OwogCiAJY3B1cyB7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQogCQlQb3dlclBDLDUyMDBAMCB7Ci0JCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwotCQkJcmVnID0gPDA+OwotCQkJZC1jYWNoZS1saW5lLXNpemUgPSA8MzI+OwotCQkJaS1jYWNoZS1saW5lLXNpemUgPSA8MzI+OwotCQkJZC1jYWNoZS1zaXplID0gPDB4NDAwMD47CQkvLyBMMSwgMTZLCi0JCQlpLWNhY2hlLXNpemUgPSA8MHg0MDAwPjsJCS8vIEwxLCAxNksKIAkJCXRpbWViYXNlLWZyZXF1ZW5jeSA9IDwzMzAwMDAwMD47CS8vIDMzIE1IeiwgdGhlc2Ugd2VyZSBjb25maWd1cmVkIGJ5IFUtQm9vdAogCQkJYnVzLWZyZXF1ZW5jeSA9IDwxMzIwMDAwMDA+OwkJLy8gMTMyIE1IegogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDM5NjAwMDAwMD47CQkvLyAzOTYgTUh6CkBAIC00NywyMDUgKzM1LDU3IEBACiAJfTsKIAogCW1lbW9yeSB7Ci0JCWRldmljZV90eXBlID0gIm1lbW9yeSI7CiAJCXJlZyA9IDwweDAwMDAwMDAwIDB4MDgwMDAwMDA+OwkvLyAxMjhNQiBSQU0KIAl9OwogCi0Jc29jQGYwMDAwMDAwIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDE+OwotCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1pbW1yIjsKLQkJcmFuZ2VzID0gPDAgMHhmMDAwMDAwMCAweDAwMDBjMDAwPjsKLQkJcmVnID0gPDB4ZjAwMDAwMDAgMHgwMDAwMDEwMD47CisJc29jNTIwMEBmMDAwMDAwMCB7CiAJCWJ1cy1mcmVxdWVuY3kgPSA8MTMyMDAwMDAwPjsvLyAxMzIgTUh6Ci0JCXN5c3RlbS1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKLQotCQljZG1AMjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWNkbSIsImZzbCxtcGM1MjAwLWNkbSI7Ci0JCQlyZWcgPSA8MHgyMDAgMHgzOD47Ci0JCX07Ci0KLQkJbXBjNTIwMF9waWM6IGludGVycnVwdC1jb250cm9sbGVyQDUwMCB7Ci0JCQkvLyA1MjAwIGludGVycnVwdHMgYXJlIGVuY29kZWQgaW50byB0d28gbGV2ZWxzOwotCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7Ci0JCQkjaW50ZXJydXB0LWNlbGxzID0gPDM+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcGljIiwiZnNsLG1wYzUyMDAtcGljIjsKLQkJCXJlZyA9IDwweDUwMCAweDgwPjsKLQkJfTsKIAogCQl0aW1lckA2MDAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2MDAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgOSAwPjsKIAkJCWZzbCxoYXMtd2R0OwogCQl9OwogCi0JCXRpbWVyQDYxMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDYxMCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxMCAwPjsKKwkJcHNjQDIwMDAgewkvLyBQU0MxCisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQl9OwogCi0JCXRpbWVyQDYyMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDYyMCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxMSAwPjsKKwkJcHNjQDIyMDAgewkvLyBQU0MyCisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQl9OwogCi0JCXRpbWVyQDYzMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDYzMCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxMiAwPjsKKwkJcHNjQDI0MDAgewkvLyBQU0MzCisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQl9OwogCi0JCXRpbWVyQDY0MCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDY0MCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxMyAwPjsKKwkJcHNjQDI2MDAgewkvLyBQU0M0CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQl9OwogCi0JCXRpbWVyQDY1MCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDY1MCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxNCAwPjsKLQkJfTsKLQotCQl0aW1lckA2NjAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2NjAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTUgMD47Ci0JCX07Ci0KLQkJdGltZXJANjcwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjcwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDE2IDA+OwotCQl9OwotCi0JCXJ0Y0A4MDAgewkvLyBSZWFsIHRpbWUgY2xvY2sKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXJ0YyIsImZzbCxtcGM1MjAwLXJ0YyI7Ci0JCQlyZWcgPSA8MHg4MDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDUgMCAxIDYgMD47Ci0JCX07Ci0KLQkJY2FuQDkwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1tc2NhbiIsImZzbCxtcGM1MjAwLW1zY2FuIjsKLQkJCWludGVycnVwdHMgPSA8MiAxNyAwPjsKLQkJCXJlZyA9IDwweDkwMCAweDgwPjsKLQkJfTsKLQotCQljYW5AOTgwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLW1zY2FuIiwiZnNsLG1wYzUyMDAtbXNjYW4iOwotCQkJaW50ZXJydXB0cyA9IDwyIDE4IDA+OwotCQkJcmVnID0gPDB4OTgwIDB4ODA+OwotCQl9OwotCi0JCWdwaW9fc2ltcGxlOiBncGlvQGIwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncGlvIiwiZnNsLG1wYzUyMDAtZ3BpbyI7Ci0JCQlyZWcgPSA8MHhiMDAgMHg0MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgNyAwPjsKLQkJCWdwaW8tY29udHJvbGxlcjsKLQkJCSNncGlvLWNlbGxzID0gPDI+OwotCQl9OwotCi0JCWdwaW9fd2t1cDogZ3Bpb0BjMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3Bpby13a3VwIiwiZnNsLG1wYzUyMDAtZ3Bpby13a3VwIjsKLQkJCXJlZyA9IDwweGMwMCAweDQwPjsKLQkJCWludGVycnVwdHMgPSA8MSA4IDAgMCAzIDA+OwotCQkJZ3Bpby1jb250cm9sbGVyOwotCQkJI2dwaW8tY2VsbHMgPSA8Mj47Ci0JCX07Ci0KLQkJc3BpQGYwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1zcGkiLCJmc2wsbXBjNTIwMC1zcGkiOwotCQkJcmVnID0gPDB4ZjAwIDB4MjA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDEzIDAgMiAxNCAwPjsKLQkJfTsKLQotCQl1c2JAMTAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1vaGNpIiwiZnNsLG1wYzUyMDAtb2hjaSIsIm9oY2ktYmUiOwotCQkJcmVnID0gPDB4MTAwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgNiAwPjsKLQkJfTsKLQotCQlkbWEtY29udHJvbGxlckAxMjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWJlc3Rjb21tIiwiZnNsLG1wYzUyMDAtYmVzdGNvbW0iOwotCQkJcmVnID0gPDB4MTIwMCAweDgwPjsKLQkJCWludGVycnVwdHMgPSA8MyAwIDAgIDMgMSAwICAzIDIgMCAgMyAzIDAKLQkJCSAgICAgICAgICAgICAgMyA0IDAgIDMgNSAwICAzIDYgMCAgMyA3IDAKLQkJCSAgICAgICAgICAgICAgMyA4IDAgIDMgOSAwICAzIDEwIDAgIDMgMTEgMAotCQkJICAgICAgICAgICAgICAzIDEyIDAgIDMgMTMgMCAgMyAxNCAwICAzIDE1IDA+OwotCQl9OwotCi0JCXhsYkAxZjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXhsYiIsImZzbCxtcGM1MjAwLXhsYiI7Ci0JCQlyZWcgPSA8MHgxZjAwIDB4MTAwPjsKKwkJcHNjQDI4MDAgewkvLyBQU0M1CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQl9OwogCiAJCS8vIFBTQzYgaW4gdWFydCBtb2RlCi0JCWNvbnNvbGU6IHNlcmlhbEAyYzAwIHsJCS8vIFBTQzYKKwkJY29uc29sZTogcHNjQDJjMDAgewkJLy8gUFNDNgogCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcHNjLXVhcnQiLCJmc2wsbXBjNTIwMC1wc2MtdWFydCI7Ci0JCQljZWxsLWluZGV4ID0gPDU+OwotCQkJcG9ydC1udW1iZXIgPSA8MD47ICAvLyBMb2dpY2FsIHBvcnQgYXNzaWdubWVudAotCQkJcmVnID0gPDB4MmMwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgNCAwPjsKIAkJfTsKIAotCQlldGgwOiBldGhlcm5ldEAzMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWZlYyIsImZzbCxtcGM1MjAwLWZlYyI7Ci0JCQlyZWcgPSA8MHgzMDAwIDB4NDAwPjsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotCQkJaW50ZXJydXB0cyA9IDwyIDUgMD47CisJCWV0aGVybmV0QDMwMDAgewogCQkJcGh5LWhhbmRsZSA9IDwmcGh5MD47CiAJCX07CiAKIAkJbWRpb0AzMDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1tZGlvIiwiZnNsLG1wYzUyMDAtbWRpbyI7Ci0JCQlyZWcgPSA8MHgzMDAwIDB4NDAwPjsJLy8gZmVjIHJhbmdlLCBzaW5jZSB3ZSBuZWVkIHRvIHNldHVwIGZlYyBpbnRlcnJ1cHRzCi0JCQlpbnRlcnJ1cHRzID0gPDIgNSAwPjsJLy8gdGhlc2UgYXJlIGZvciAibWlpIGNvbW1hbmQgZmluaXNoZWQiLCBub3QgbGluayBjaGFuZ2VzICYgY28uCi0KIAkJCXBoeTA6IGV0aGVybmV0LXBoeUAwIHsKIAkJCQlyZWcgPSA8MD47CiAJCQl9OwogCQl9OwogCi0JCWF0YUAzYTAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWF0YSIsImZzbCxtcGM1MjAwLWF0YSI7Ci0JCQlyZWcgPSA8MHgzYTAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MiA3IDA+OwotCQl9OwotCi0JCWkyY0AzZDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1pMmMiLCJmc2wsbXBjNTIwMC1pMmMiLCJmc2wtaTJjIjsKLQkJCXJlZyA9IDwweDNkMDAgMHg0MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMTUgMD47Ci0JCX07Ci0KLQkJaTJjQDNkNDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWkyYyIsImZzbCxtcGM1MjAwLWkyYyIsImZzbC1pMmMiOwotCQkJcmVnID0gPDB4M2Q0MCAweDQwPjsKLQkJCWludGVycnVwdHMgPSA8MiAxNiAwPjsKLQkJfTsKLQotCQlzcmFtQDgwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItc3JhbSIsImZzbCxtcGM1MjAwLXNyYW0iOwotCQkJcmVnID0gPDB4ODAwMCAweDQwMDA+OworCQl1c2JAMTAwMCB7CisJCQlyZWcgPSA8MHgxMDAwIDB4MTAwPjsKIAkJfTsKIAl9OwogCiAJcGNpQGYwMDAwZDAwIHsKLQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwotCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1wY2kiLCJmc2wsbXBjNTIwMC1wY2kiOwotCQlyZWcgPSA8MHhmMDAwMGQwMCAweDEwMD47CiAJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMCAwIDc+OwogCQlpbnRlcnJ1cHQtbWFwID0gPDB4YzAwMCAwIDAgMSAmbWVkaWE1MjAwX2ZwZ2EgMCAyIC8vIDFzdCBzbG90CiAJCQkJIDB4YzAwMCAwIDAgMiAmbWVkaWE1MjAwX2ZwZ2EgMCAzCkBAIC0yNjIsMzcgKzEwMiwyOSBAQAogCiAJCQkJIDB4ZTAwMCAwIDAgMSAmbWVkaWE1MjAwX2ZwZ2EgMCA1IC8vIENvcmFsSVAKIAkJCQk+OwotCQljbG9jay1mcmVxdWVuY3kgPSA8MD47IC8vIEZyb20gYm9vdCBsb2FkZXIKLQkJaW50ZXJydXB0cyA9IDwyIDggMCAyIDkgMCAyIDEwIDA+OwotCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGM1MjAwX3BpYz47Ci0JCWJ1cy1yYW5nZSA9IDwwIDA+OwogCQlyYW5nZXMgPSA8MHg0MjAwMDAwMCAwIDB4ODAwMDAwMDAgMHg4MDAwMDAwMCAwIDB4MjAwMDAwMDAKIAkJCSAgMHgwMjAwMDAwMCAwIDB4YTAwMDAwMDAgMHhhMDAwMDAwMCAwIDB4MTAwMDAwMDAKIAkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAgMHhiMDAwMDAwMCAwIDB4MDEwMDAwMDA+OworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGM1MjAwX3BpYz47CiAJfTsKIAogCWxvY2FsYnVzIHsKLQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItbHBiIiwic2ltcGxlLWJ1cyI7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDI+OwotCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQogCQlyYW5nZXMgPSA8IDAgMCAweGZjMDAwMDAwIDB4MDIwMDAwMDAKIAkJCSAgIDEgMCAweGZlMDAwMDAwIDB4MDIwMDAwMDAKIAkJCSAgIDIgMCAweGYwMDEwMDAwIDB4MDAwMTAwMDAKIAkJCSAgIDMgMCAweGYwMDIwMDAwIDB4MDAwMTAwMDAgPjsKLQogCQlmbGFzaEAwLDAgewogCQkJY29tcGF0aWJsZSA9ICJhbWQsYW0yOWx2MjhtbCIsICJjZmktZmxhc2giOwotCQkJcmVnID0gPDAgMHgwIDB4MjAwMDAwMD47CQkvLyAzMiBNQgotCQkJYmFuay13aWR0aCA9IDw0PjsJCQkvLyBXaWR0aCBpbiBieXRlcyBvZiB0aGUgZmxhc2ggYmFuawotCQkJZGV2aWNlLXdpZHRoID0gPDI+OwkJCS8vIFR3byBkZXZpY2VzIG9uIGVhY2ggYmFuaworCQkJcmVnID0gPDAgMHgwIDB4MjAwMDAwMD47ICAgICAgICAgICAgICAgIC8vIDMyIE1CCisJCQliYW5rLXdpZHRoID0gPDQ+OyAgICAgICAgICAgICAgICAgICAgICAgLy8gV2lkdGggaW4gYnl0ZXMgb2YgdGhlIGZsYXNoIGJhbmsKKwkJCWRldmljZS13aWR0aCA9IDwyPjsgICAgICAgICAgICAgICAgICAgICAvLyBUd28gZGV2aWNlcyBvbiBlYWNoIGJhbmsKIAkJfTsKIAogCQlmbGFzaEAxLDAgewogCQkJY29tcGF0aWJsZSA9ICJhbWQsYW0yOWx2MjhtbCIsICJjZmktZmxhc2giOwotCQkJcmVnID0gPDEgMCAweDIwMDAwMDA+OwkJCS8vIDMyIE1CCi0JCQliYW5rLXdpZHRoID0gPDQ+OwkJCS8vIFdpZHRoIGluIGJ5dGVzIG9mIHRoZSBmbGFzaCBiYW5rCi0JCQlkZXZpY2Utd2lkdGggPSA8Mj47CQkJLy8gVHdvIGRldmljZXMgb24gZWFjaCBiYW5rCisJCQlyZWcgPSA8MSAwIDB4MjAwMDAwMD47ICAgICAgICAgICAgICAgICAgLy8gMzIgTUIKKwkJCWJhbmstd2lkdGggPSA8ND47ICAgICAgICAgICAgICAgICAgICAgICAvLyBXaWR0aCBpbiBieXRlcyBvZiB0aGUgZmxhc2ggYmFuaworCQkJZGV2aWNlLXdpZHRoID0gPDI+OyAgICAgICAgICAgICAgICAgICAgIC8vIFR3byBkZXZpY2VzIG9uIGVhY2ggYmFuawogCQl9OwogCiAJCW1lZGlhNTIwMF9mcGdhOiBmcGdhQDIsMCB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbW90aW9ucHJvLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tb3Rpb25wcm8uZHRzCmluZGV4IDZjYTRmYzE0Li4wYjc4ZTg5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbW90aW9ucHJvLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbW90aW9ucHJvLmR0cwpAQCAtMTAsMjE5ICsxMCw3MyBAQAogICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCi0vZHRzLXYxLzsKKy9pbmNsdWRlLyAibXBjNTIwMGIuZHRzaSIKIAogLyB7CiAJbW9kZWwgPSAicHJvbWVzcyxtb3Rpb25wcm8iOwogCWNvbXBhdGlibGUgPSAicHJvbWVzcyxtb3Rpb25wcm8iOwotCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCSNzaXplLWNlbGxzID0gPDE+OwotCWludGVycnVwdC1wYXJlbnQgPSA8Jm1wYzUyMDBfcGljPjsKLQotCWNwdXMgewotCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8MD47Ci0KLQkJUG93ZXJQQyw1MjAwQDAgewotCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKLQkJCXJlZyA9IDwwPjsKLQkJCWQtY2FjaGUtbGluZS1zaXplID0gPDMyPjsKLQkJCWktY2FjaGUtbGluZS1zaXplID0gPDMyPjsKLQkJCWQtY2FjaGUtc2l6ZSA9IDwweDQwMDA+OwkvLyBMMSwgMTZLCi0JCQlpLWNhY2hlLXNpemUgPSA8MHg0MDAwPjsJLy8gTDEsIDE2SwotCQkJdGltZWJhc2UtZnJlcXVlbmN5ID0gPDA+OwkvLyBmcm9tIGJvb3Rsb2FkZXIKLQkJCWJ1cy1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgotCQl9OwotCX07Ci0KLQltZW1vcnkgewotCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOwotCQlyZWcgPSA8MHgwMDAwMDAwMCAweDA0MDAwMDAwPjsJLy8gNjRNQgotCX07CiAKIAlzb2M1MjAwQGYwMDAwMDAwIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDE+OwotCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1pbW1yIjsKLQkJcmFuZ2VzID0gPDAgMHhmMDAwMDAwMCAweDAwMDBjMDAwPjsKLQkJcmVnID0gPDB4ZjAwMDAwMDAgMHgwMDAwMDEwMD47Ci0JCWJ1cy1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKLQkJc3lzdGVtLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgotCi0JCWNkbUAyMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItY2RtIiwiZnNsLG1wYzUyMDAtY2RtIjsKLQkJCXJlZyA9IDwweDIwMCAweDM4PjsKLQkJfTsKLQotCQltcGM1MjAwX3BpYzogaW50ZXJydXB0LWNvbnRyb2xsZXJANTAwIHsKLQkJCS8vIDUyMDAgaW50ZXJydXB0cyBhcmUgZW5jb2RlZCBpbnRvIHR3byBsZXZlbHM7Ci0JCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKLQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mz47Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1waWMiLCJmc2wsbXBjNTIwMC1waWMiOwotCQkJcmVnID0gPDB4NTAwIDB4ODA+OwotCQl9OwotCiAJCXRpbWVyQDYwMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDYwMCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSA5IDA+OwogCQkJZnNsLGhhcy13ZHQ7CiAJCX07CiAKLQkJdGltZXJANjEwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjEwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDEwIDA+OwotCQl9OwotCi0JCXRpbWVyQDYyMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDYyMCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxMSAwPjsKLQkJfTsKLQotCQl0aW1lckA2MzAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2MzAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTIgMD47Ci0JCX07Ci0KLQkJdGltZXJANjQwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjQwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDEzIDA+OwotCQl9OwotCi0JCXRpbWVyQDY1MCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDY1MCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxNCAwPjsKLQkJfTsKLQotCQltb3Rpb25wcm8tbGVkQDY2MCB7CS8vIE1vdGlvbi1QUk8gc3RhdHVzIExFRAorCQl0aW1lckA2NjAgewkvLyBNb3Rpb24tUFJPIHN0YXR1cyBMRUQKIAkJCWNvbXBhdGlibGUgPSAicHJvbWVzcyxtb3Rpb25wcm8tbGVkIjsKIAkJCWxhYmVsID0gIm1vdGlvbnByby1zdGF0dXNsZWQiOwotCQkJcmVnID0gPDB4NjYwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDE1IDA+OwogCQkJYmxpbmstZGVsYXkgPSA8MTAwPjsgLy8gMTAwIG1zZWMKIAkJfTsKIAotCQltb3Rpb25wcm8tbGVkQDY3MCB7CS8vIE1vdGlvbi1QUk8gcmVhZHkgTEVECisJCXRpbWVyQDY3MCB7CS8vIE1vdGlvbi1QUk8gcmVhZHkgTEVECiAJCQljb21wYXRpYmxlID0gInByb21lc3MsbW90aW9ucHJvLWxlZCI7CiAJCQlsYWJlbCA9ICJtb3Rpb25wcm8tcmVhZHlsZWQiOwotCQkJcmVnID0gPDB4NjcwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDE2IDA+OwogCQl9OwogCi0JCXJ0Y0A4MDAgewkvLyBSZWFsIHRpbWUgY2xvY2sKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXJ0YyIsImZzbCxtcGM1MjAwLXJ0YyI7Ci0JCQlyZWcgPSA8MHg4MDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDUgMCAxIDYgMD47CisJCWNhbkA5MDAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAotCQljYW5AOTgwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLW1zY2FuIiwiZnNsLG1wYzUyMDAtbXNjYW4iOwotCQkJaW50ZXJydXB0cyA9IDwyIDE4IDA+OwotCQkJcmVnID0gPDB4OTgwIDB4ODA+OwotCQl9OwotCi0JCWdwaW9fc2ltcGxlOiBncGlvQGIwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncGlvIiwiZnNsLG1wYzUyMDAtZ3BpbyI7Ci0JCQlyZWcgPSA8MHhiMDAgMHg0MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgNyAwPjsKLQkJCWdwaW8tY29udHJvbGxlcjsKLQkJCSNncGlvLWNlbGxzID0gPDI+OwotCQl9OwotCi0JCWdwaW9fd2t1cDogZ3Bpb0BjMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3Bpby13a3VwIiwiZnNsLG1wYzUyMDAtZ3Bpby13a3VwIjsKLQkJCXJlZyA9IDwweGMwMCAweDQwPjsKLQkJCWludGVycnVwdHMgPSA8MSA4IDAgMCAzIDA+OwotCQkJZ3Bpby1jb250cm9sbGVyOwotCQkJI2dwaW8tY2VsbHMgPSA8Mj47Ci0JCX07Ci0KLQkJc3BpQGYwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1zcGkiLCJmc2wsbXBjNTIwMC1zcGkiOwotCQkJcmVnID0gPDB4ZjAwIDB4MjA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDEzIDAgMiAxNCAwPjsKLQkJfTsKLQotCQl1c2JAMTAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1vaGNpIiwiZnNsLG1wYzUyMDAtb2hjaSIsIm9oY2ktYmUiOwotCQkJcmVnID0gPDB4MTAwMCAweGZmPjsKLQkJCWludGVycnVwdHMgPSA8MiA2IDA+OwotCQl9OwotCi0JCWRtYS1jb250cm9sbGVyQDEyMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItYmVzdGNvbW0iLCJmc2wsbXBjNTIwMC1iZXN0Y29tbSI7Ci0JCQlyZWcgPSA8MHgxMjAwIDB4ODA+OwotCQkJaW50ZXJydXB0cyA9IDwzIDAgMCAgMyAxIDAgIDMgMiAwICAzIDMgMAotCQkJICAgICAgICAgICAgICAzIDQgMCAgMyA1IDAgIDMgNiAwICAzIDcgMAotCQkJICAgICAgICAgICAgICAzIDggMCAgMyA5IDAgIDMgMTAgMCAgMyAxMSAwCi0JCQkgICAgICAgICAgICAgIDMgMTIgMCAgMyAxMyAwICAzIDE0IDAgIDMgMTUgMD47Ci0JCX07Ci0KLQkJeGxiQDFmMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGIteGxiIiwiZnNsLG1wYzUyMDAteGxiIjsKLQkJCXJlZyA9IDwweDFmMDAgMHgxMDA+OwotCQl9OwotCi0JCXNlcmlhbEAyMDAwIHsJCS8vIFBTQzEKKwkJcHNjQDIwMDAgewkJLy8gUFNDMQogCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcHNjLXVhcnQiLCJmc2wsbXBjNTIwMC1wc2MtdWFydCI7Ci0JCQlyZWcgPSA8MHgyMDAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MiAxIDA+OwogCQl9OwogCiAJCS8vIFBTQzIgaW4gc3BpIG1hc3RlciBtb2RlIAotCQlzcGlAMjIwMCB7CQkvLyBQU0MyCisJCXBzY0AyMjAwIHsJCS8vIFBTQzIKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBzYy1zcGkiLCJmc2wsbXBjNTIwMC1wc2Mtc3BpIjsKIAkJCWNlbGwtaW5kZXggPSA8MT47Ci0JCQlyZWcgPSA8MHgyMjAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MiAyIDA+OwogCQl9OwogCi0JCS8vIFBTQzUgaW4gdWFydCBtb2RlCi0JCXNlcmlhbEAyODAwIHsJCS8vIFBTQzUKKwkJcHNjQDI0MDAgewkJLy8gUFNDMworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKKworCQlwc2NAMjYwMCB7CQkvLyBQU0M0CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQl9OworCisJCXBzY0AyODAwIHsJCS8vIFBTQzUKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBzYy11YXJ0IiwiZnNsLG1wYzUyMDAtcHNjLXVhcnQiOwotCQkJcmVnID0gPDB4MjgwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMTIgMD47CisJCX07CisKKwkJcHNjQDJjMDAgewkJLy8gUFNDNgorCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAogCQlldGhlcm5ldEAzMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWZlYyIsImZzbCxtcGM1MjAwLWZlYyI7Ci0JCQlyZWcgPSA8MHgzMDAwIDB4NDAwPjsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotCQkJaW50ZXJydXB0cyA9IDwyIDUgMD47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkwPjsKIAkJfTsKIAogCQltZGlvQDMwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLW1kaW8iLCJmc2wsbXBjNTIwMC1tZGlvIjsKLQkJCXJlZyA9IDwweDMwMDAgMHg0MDA+OyAgICAgICAvLyBmZWMgcmFuZ2UsIHNpbmNlIHdlIG5lZWQgdG8gc2V0dXAgZmVjIGludGVycnVwdHMKLQkJCWludGVycnVwdHMgPSA8MiA1IDA+OyAgIC8vIHRoZXNlIGFyZSBmb3IgIm1paSBjb21tYW5kIGZpbmlzaGVkIiwgbm90IGxpbmsgY2hhbmdlcyAmIGNvLgotCiAJCQlwaHkwOiBldGhlcm5ldC1waHlAMiB7CiAJCQkJcmVnID0gPDI+OwogCQkJfTsKIAkJfTsKIAotCQlhdGFAM2EwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1hdGEiLCJmc2wsbXBjNTIwMC1hdGEiOwotCQkJcmVnID0gPDB4M2EwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgNyAwPjsKKwkJaTJjQDNkMDAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAogCQlpMmNAM2Q0MCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItaTJjIiwiZnNsLG1wYzUyMDAtaTJjIiwiZnNsLWkyYyI7Ci0JCQlyZWcgPSA8MHgzZDQwIDB4NDA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDE2IDA+OwotCiAJCQlydGNANjggewogCQkJCWNvbXBhdGlibGUgPSAiZGFsbGFzLGRzMTMzOSI7CiAJCQkJcmVnID0gPDB4Njg+OwpAQCAtMjM1LDEwICs4OSwxMSBAQAogCQl9OwogCX07CiAKKwlwY2lAZjAwMDBkMDAgeworCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCX07CisKIAlsb2NhbGJ1cyB7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWxwYiIsInNpbXBsZS1idXMiOwotCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKLQkJI3NpemUtY2VsbHMgPSA8MT47CiAJCXJhbmdlcyA9IDwwIDAgMHhmZjAwMDAwMCAweDAxMDAwMDAwCiAJCQkgIDEgMCAweDUwMDAwMDAwIDB4MDAwMTAwMDAKIAkJCSAgMiAwIDB4NTAwMTAwMDAgMHgwMDAxMDAwMApAQCAtMjgwLDUgKzEzNSw2IEBACiAJCQkjc2l6ZS1jZWxscyA9IDwxPjsKIAkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQl9OworCiAJfTsKIH07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjNTIwMGIuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM1MjAwYi5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMjc1NDgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjNTIwMGIuZHRzaQpAQCAtMCwwICsxLDI3NSBAQAorLyoKKyAqIGJhc2UgTVBDNTIwMGIgRGV2aWNlIFRyZWUgU291cmNlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFNlY3JldExhYgorICogR3JhbnQgTGlrZWx5IDxncmFudEBzZWNyZXRsYWIuY2E+CisgKiBKb2huIEJvbmVzaW8gPGJvbmVzQHNlY3JldGxhYi5jYT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKy9kdHMtdjEvOworCisvIHsKKwltb2RlbCA9ICJmc2wsbXBjNTIwMGIiOworCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGM1MjAwX3BpYz47CisKKwljcHVzIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCisJCXBvd2VycGM6IFBvd2VyUEMsNTIwMEAwIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8MD47CisJCQlkLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47CisJCQlpLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47CisJCQlkLWNhY2hlLXNpemUgPSA8MHg0MDAwPjsJLy8gTDEsIDE2SworCQkJaS1jYWNoZS1zaXplID0gPDB4NDAwMD47CS8vIEwxLCAxNksKKwkJCXRpbWViYXNlLWZyZXF1ZW5jeSA9IDwwPjsJLy8gZnJvbSBib290bG9hZGVyCisJCQlidXMtZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKKwkJfTsKKwl9OworCisJbWVtb3J5OiBtZW1vcnkgeworCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOworCQlyZWcgPSA8MHgwMDAwMDAwMCAweDA0MDAwMDAwPjsJLy8gNjRNQgorCX07CisKKwlzb2M6IHNvYzUyMDBAZjAwMDAwMDAgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWltbXIiOworCQlyYW5nZXMgPSA8MCAweGYwMDAwMDAwIDB4MDAwMGMwMDA+OworCQlyZWcgPSA8MHhmMDAwMDAwMCAweDAwMDAwMTAwPjsKKwkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgorCQlzeXN0ZW0tZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCisKKwkJY2RtQDIwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1jZG0iLCJmc2wsbXBjNTIwMC1jZG0iOworCQkJcmVnID0gPDB4MjAwIDB4Mzg+OworCQl9OworCisJCW1wYzUyMDBfcGljOiBpbnRlcnJ1cHQtY29udHJvbGxlckA1MDAgeworCQkJLy8gNTIwMCBpbnRlcnJ1cHRzIGFyZSBlbmNvZGVkIGludG8gdHdvIGxldmVsczsKKwkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJI2ludGVycnVwdC1jZWxscyA9IDwzPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBpYyIsImZzbCxtcGM1MjAwLXBpYyI7CisJCQlyZWcgPSA8MHg1MDAgMHg4MD47CisJCX07CisKKwkJdGltZXJANjAwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOworCQkJcmVnID0gPDB4NjAwIDB4MTA+OworCQkJaW50ZXJydXB0cyA9IDwxIDkgMD47CisJCX07CisKKwkJdGltZXJANjEwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOworCQkJcmVnID0gPDB4NjEwIDB4MTA+OworCQkJaW50ZXJydXB0cyA9IDwxIDEwIDA+OworCQl9OworCisJCXRpbWVyQDYyMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgorCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKKwkJCXJlZyA9IDwweDYyMCAweDEwPjsKKwkJCWludGVycnVwdHMgPSA8MSAxMSAwPjsKKwkJfTsKKworCQl0aW1lckA2MzAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7CisJCQlyZWcgPSA8MHg2MzAgMHgxMD47CisJCQlpbnRlcnJ1cHRzID0gPDEgMTIgMD47CisJCX07CisKKwkJdGltZXJANjQwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOworCQkJcmVnID0gPDB4NjQwIDB4MTA+OworCQkJaW50ZXJydXB0cyA9IDwxIDEzIDA+OworCQl9OworCisJCXRpbWVyQDY1MCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgorCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKKwkJCXJlZyA9IDwweDY1MCAweDEwPjsKKwkJCWludGVycnVwdHMgPSA8MSAxNCAwPjsKKwkJfTsKKworCQl0aW1lckA2NjAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7CisJCQlyZWcgPSA8MHg2NjAgMHgxMD47CisJCQlpbnRlcnJ1cHRzID0gPDEgMTUgMD47CisJCX07CisKKwkJdGltZXJANjcwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOworCQkJcmVnID0gPDB4NjcwIDB4MTA+OworCQkJaW50ZXJydXB0cyA9IDwxIDE2IDA+OworCQl9OworCisJCXJ0Y0A4MDAgewkvLyBSZWFsIHRpbWUgY2xvY2sKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXJ0YyIsImZzbCxtcGM1MjAwLXJ0YyI7CisJCQlyZWcgPSA8MHg4MDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDwxIDUgMCAxIDYgMD47CisJCX07CisKKwkJY2FuQDkwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1tc2NhbiIsImZzbCxtcGM1MjAwLW1zY2FuIjsKKwkJCWludGVycnVwdHMgPSA8MiAxNyAwPjsKKwkJCXJlZyA9IDwweDkwMCAweDgwPjsKKwkJfTsKKworCQljYW5AOTgwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLW1zY2FuIiwiZnNsLG1wYzUyMDAtbXNjYW4iOworCQkJaW50ZXJydXB0cyA9IDwyIDE4IDA+OworCQkJcmVnID0gPDB4OTgwIDB4ODA+OworCQl9OworCisJCWdwaW9fc2ltcGxlOiBncGlvQGIwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncGlvIiwiZnNsLG1wYzUyMDAtZ3BpbyI7CisJCQlyZWcgPSA8MHhiMDAgMHg0MD47CisJCQlpbnRlcnJ1cHRzID0gPDEgNyAwPjsKKwkJCWdwaW8tY29udHJvbGxlcjsKKwkJCSNncGlvLWNlbGxzID0gPDI+OworCQl9OworCisJCWdwaW9fd2t1cDogZ3Bpb0BjMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3Bpby13a3VwIiwiZnNsLG1wYzUyMDAtZ3Bpby13a3VwIjsKKwkJCXJlZyA9IDwweGMwMCAweDQwPjsKKwkJCWludGVycnVwdHMgPSA8MSA4IDAgMCAzIDA+OworCQkJZ3Bpby1jb250cm9sbGVyOworCQkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCX07CisKKwkJc3BpQGYwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1zcGkiLCJmc2wsbXBjNTIwMC1zcGkiOworCQkJcmVnID0gPDB4ZjAwIDB4MjA+OworCQkJaW50ZXJydXB0cyA9IDwyIDEzIDAgMiAxNCAwPjsKKwkJfTsKKworCQl1c2I6IHVzYkAxMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLW9oY2kiLCJmc2wsbXBjNTIwMC1vaGNpIiwib2hjaS1iZSI7CisJCQlyZWcgPSA8MHgxMDAwIDB4ZmY+OworCQkJaW50ZXJydXB0cyA9IDwyIDYgMD47CisJCX07CisKKwkJZG1hLWNvbnRyb2xsZXJAMTIwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1iZXN0Y29tbSIsImZzbCxtcGM1MjAwLWJlc3Rjb21tIjsKKwkJCXJlZyA9IDwweDEyMDAgMHg4MD47CisJCQlpbnRlcnJ1cHRzID0gPDMgMCAwICAzIDEgMCAgMyAyIDAgIDMgMyAwCisJCQkgICAgICAgICAgICAgIDMgNCAwICAzIDUgMCAgMyA2IDAgIDMgNyAwCisJCQkgICAgICAgICAgICAgIDMgOCAwICAzIDkgMCAgMyAxMCAwICAzIDExIDAKKwkJCSAgICAgICAgICAgICAgMyAxMiAwICAzIDEzIDAgIDMgMTQgMCAgMyAxNSAwPjsKKwkJfTsKKworCQl4bGJAMWYwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi14bGIiLCJmc2wsbXBjNTIwMC14bGIiOworCQkJcmVnID0gPDB4MWYwMCAweDEwMD47CisJCX07CisKKwkJcHNjMTogcHNjQDIwMDAgewkJLy8gUFNDMQorCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcHNjIiwiZnNsLG1wYzUyMDAtcHNjIjsKKwkJCXJlZyA9IDwweDIwMDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDwyIDEgMD47CisJCX07CisKKwkJcHNjMjogcHNjQDIyMDAgewkJLy8gUFNDMgorCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcHNjIiwiZnNsLG1wYzUyMDAtcHNjIjsKKwkJCXJlZyA9IDwweDIyMDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDwyIDIgMD47CisJCX07CisKKwkJcHNjMzogcHNjQDI0MDAgewkJLy8gUFNDMworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcHNjIiwiZnNsLG1wYzUyMDAtcHNjIjsKKwkJCXJlZyA9IDwweDI0MDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDwyIDMgMD47CisJCX07CisKKwkJcHNjNDogcHNjQDI2MDAgewkJLy8gUFNDNAorCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcHNjIiwiZnNsLG1wYzUyMDAtcHNjIjsKKwkJCXJlZyA9IDwweDI2MDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDwyIDExIDA+OworCQl9OworCisJCXBzYzU6IHBzY0AyODAwIHsJCS8vIFBTQzUKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBzYyIsImZzbCxtcGM1MjAwLXBzYyI7CisJCQlyZWcgPSA8MHgyODAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8MiAxMiAwPjsKKwkJfTsKKworCQlwc2M2OiBwc2NAMmMwMCB7CQkvLyBQU0M2CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1wc2MiLCJmc2wsbXBjNTIwMC1wc2MiOworCQkJcmVnID0gPDB4MmMwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDIgNCAwPjsKKwkJfTsKKworCQlldGgwOiBldGhlcm5ldEAzMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWZlYyIsImZzbCxtcGM1MjAwLWZlYyI7CisJCQlyZWcgPSA8MHgzMDAwIDB4NDAwPjsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJaW50ZXJydXB0cyA9IDwyIDUgMD47CisJCX07CisKKwkJbWRpb0AzMDAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1tZGlvIiwiZnNsLG1wYzUyMDAtbWRpbyI7CisJCQlyZWcgPSA8MHgzMDAwIDB4NDAwPjsJLy8gZmVjIHJhbmdlLCBzaW5jZSB3ZSBuZWVkIHRvIHNldHVwIGZlYyBpbnRlcnJ1cHRzCisJCQlpbnRlcnJ1cHRzID0gPDIgNSAwPjsJLy8gdGhlc2UgYXJlIGZvciAibWlpIGNvbW1hbmQgZmluaXNoZWQiLCBub3QgbGluayBjaGFuZ2VzICYgY28uCisJCX07CisKKwkJYXRhQDNhMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItYXRhIiwiZnNsLG1wYzUyMDAtYXRhIjsKKwkJCXJlZyA9IDwweDNhMDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDwyIDcgMD47CisJCX07CisKKwkJaTJjQDNkMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWkyYyIsImZzbCxtcGM1MjAwLWkyYyIsImZzbC1pMmMiOworCQkJcmVnID0gPDB4M2QwMCAweDQwPjsKKwkJCWludGVycnVwdHMgPSA8MiAxNSAwPjsKKwkJfTsKKworCQlpMmNAM2Q0MCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItaTJjIiwiZnNsLG1wYzUyMDAtaTJjIiwiZnNsLWkyYyI7CisJCQlyZWcgPSA8MHgzZDQwIDB4NDA+OworCQkJaW50ZXJydXB0cyA9IDwyIDE2IDA+OworCQl9OworCisJCXNyYW1AODAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1zcmFtIiwiZnNsLG1wYzUyMDAtc3JhbSI7CisJCQlyZWcgPSA8MHg4MDAwIDB4NDAwMD47CisJCX07CisJfTsKKworCXBjaTogcGNpQGYwMDAwZDAwIHsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1wY2kiLCJmc2wsbXBjNTIwMC1wY2kiOworCQlyZWcgPSA8MHhmMDAwMGQwMCAweDEwMD47CisJCS8vIGludGVycnVwdC1tYXAtbWFzayA9IG5lZWQgdG8gYWRkCisJCS8vIGludGVycnVwdC1tYXAgPSBuZWVkIHRvIGFkZAorCQljbG9jay1mcmVxdWVuY3kgPSA8MD47IC8vIEZyb20gYm9vdCBsb2FkZXIKKwkJaW50ZXJydXB0cyA9IDwyIDggMCAyIDkgMCAyIDEwIDA+OworCQlidXMtcmFuZ2UgPSA8MCAwPjsKKwkJLy8gcmFuZ2VzID0gbmVlZCB0byBhZGQKKwl9OworCisJbG9jYWxidXM6IGxvY2FsYnVzIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItbHBiIiwiZnNsLG1wYzUyMDAtbHBiIiwic2ltcGxlLWJ1cyI7CisJCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJcmFuZ2VzID0gPDAgMCAweGZjMDAwMDAwIDB4MjAwMDAwMD47CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXVjbWM1Mi5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXVjbWM1Mi5kdHMKaW5kZXggYjcyYTc1OC4uMjFkMzQ3MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL211Y21jNTIuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tdWNtYzUyLmR0cwpAQCAtMTEsMTcyICsxMSwxMDkgQEAKICAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotL2R0cy12MS87CisvaW5jbHVkZS8gIm1wYzUyMDBiLmR0c2kiCiAKIC8gewogCW1vZGVsID0gIm1hbnJvbGFuZCxtdWNtYzUyIjsKIAljb21wYXRpYmxlID0gIm1hbnJvbGFuZCxtdWNtYzUyIjsKLQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkjc2l6ZS1jZWxscyA9IDwxPjsKLQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGM1MjAwX3BpYz47Ci0KLQljcHVzIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDA+OwotCi0JCVBvd2VyUEMsNTIwMEAwIHsKLQkJCWRldmljZV90eXBlID0gImNwdSI7Ci0JCQlyZWcgPSA8MD47Ci0JCQlkLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47Ci0JCQlpLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47Ci0JCQlkLWNhY2hlLXNpemUgPSA8MHg0MDAwPjsJLy8gTDEsIDE2SwotCQkJaS1jYWNoZS1zaXplID0gPDB4NDAwMD47CS8vIEwxLCAxNksKLQkJCXRpbWViYXNlLWZyZXF1ZW5jeSA9IDwwPjsJLy8gZnJvbSBib290bG9hZGVyCi0JCQlidXMtZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCi0JCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKLQkJfTsKLQl9OwotCi0JbWVtb3J5IHsKLQkJZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKLQkJcmVnID0gPDB4MDAwMDAwMDAgMHgwNDAwMDAwMD47CS8vIDY0TUIKLQl9OwogCiAJc29jNTIwMEBmMDAwMDAwMCB7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItaW1tciI7Ci0JCXJhbmdlcyA9IDwwIDB4ZjAwMDAwMDAgMHgwMDAwYzAwMD47Ci0JCXJlZyA9IDwweGYwMDAwMDAwIDB4MDAwMDAxMDA+OwotCQlidXMtZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCi0JCXN5c3RlbS1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKLQotCQljZG1AMjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWNkbSIsImZzbCxtcGM1MjAwLWNkbSI7Ci0JCQlyZWcgPSA8MHgyMDAgMHgzOD47Ci0JCX07Ci0KLQkJbXBjNTIwMF9waWM6IGludGVycnVwdC1jb250cm9sbGVyQDUwMCB7Ci0JCQkvLyA1MjAwIGludGVycnVwdHMgYXJlIGVuY29kZWQgaW50byB0d28gbGV2ZWxzOwotCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7Ci0JCQkjaW50ZXJydXB0LWNlbGxzID0gPDM+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcGljIiwiZnNsLG1wYzUyMDAtcGljIjsKLQkJCXJlZyA9IDwweDUwMCAweDgwPjsKLQkJfTsKLQogCQlncHQwOiB0aW1lckA2MDAgewkvLyBHUFQgMCBpbiBHUElPIG1vZGUKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2MDAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgOSAwPjsKIAkJCWdwaW8tY29udHJvbGxlcjsKIAkJCSNncGlvLWNlbGxzID0gPDI+OwogCQl9OwogCiAJCWdwdDE6IHRpbWVyQDYxMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lciBpbiBHUElPIG1vZGUKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2MTAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTAgMD47CiAJCQlncGlvLWNvbnRyb2xsZXI7CiAJCQkjZ3Bpby1jZWxscyA9IDwyPjsKIAkJfTsKIAogCQlncHQyOiB0aW1lckA2MjAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIgaW4gR1BJTyBtb2RlCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjIwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDExIDA+OwogCQkJZ3Bpby1jb250cm9sbGVyOwogCQkJI2dwaW8tY2VsbHMgPSA8Mj47CiAJCX07CiAKIAkJZ3B0MzogdGltZXJANjMwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyIGluIEdQSU8gbW9kZQotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDYzMCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxMiAwPjsKIAkJCWdwaW8tY29udHJvbGxlcjsKIAkJCSNncGlvLWNlbGxzID0gPDI+OwogCQl9OwogCi0JCWdwaW9fc2ltcGxlOiBncGlvQGIwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncGlvIiwiZnNsLG1wYzUyMDAtZ3BpbyI7Ci0JCQlyZWcgPSA8MHhiMDAgMHg0MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgNyAwPjsKLQkJCWdwaW8tY29udHJvbGxlcjsKLQkJCSNncGlvLWNlbGxzID0gPDI+OworCQl0aW1lckA2NDAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAotCQlncGlvX3drdXA6IGdwaW9AYzAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwaW8td2t1cCIsImZzbCxtcGM1MjAwLWdwaW8td2t1cCI7Ci0JCQlyZWcgPSA8MHhjMDAgMHg0MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgOCAwIDAgMyAwPjsKLQkJCWdwaW8tY29udHJvbGxlcjsKLQkJCSNncGlvLWNlbGxzID0gPDI+OworCQl0aW1lckA2NTAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAotCQlkbWEtY29udHJvbGxlckAxMjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWJlc3Rjb21tIiwiZnNsLG1wYzUyMDAtYmVzdGNvbW0iOwotCQkJcmVnID0gPDB4MTIwMCAweDgwPjsKLQkJCWludGVycnVwdHMgPSA8MyAwIDAgIDMgMSAwICAzIDIgMCAgMyAzIDAKLQkJCSAgICAgICAgICAgICAgMyA0IDAgIDMgNSAwICAzIDYgMCAgMyA3IDAKLQkJCSAgICAgICAgICAgICAgMyA4IDAgIDMgOSAwICAzIDEwIDAgIDMgMTEgMAotCQkJICAgICAgICAgICAgICAzIDEyIDAgIDMgMTMgMCAgMyAxNCAwICAzIDE1IDA+OworCQl0aW1lckA2NjAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAotCQl4bGJAMWYwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi14bGIiLCJmc2wsbXBjNTIwMC14bGIiOwotCQkJcmVnID0gPDB4MWYwMCAweDEwMD47CisJCXRpbWVyQDY3MCB7CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQl9OwogCi0JCXNlcmlhbEAyMDAwIHsgLyogUFNDMSBpbiBVQVJUIG1vZGUgKi8KKwkJcnRjQDgwMCB7CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQl9OworCisJCWNhbkA5MDAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKKworCQljYW5AOTgwIHsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCX07CisKKwkJc3BpQGYwMCB7CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQl9OworCisJCXVzYkAxMDAwIHsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCX07CisKKwkJcHNjQDIwMDAgewkJLy8gUFNDMQogCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcHNjLXVhcnQiLCJmc2wsbXBjNTIwMC1wc2MtdWFydCI7Ci0JCQlyZWcgPSA8MHgyMDAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MiAxIDA+OwogCQl9OwogCi0JCXNlcmlhbEAyMjAwIHsgLyogUFNDMiBpbiBVQVJUIG1vZGUgKi8KKwkJcHNjQDIyMDAgewkJLy8gUFNDMgogCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcHNjLXVhcnQiLCJmc2wsbXBjNTIwMC1wc2MtdWFydCI7Ci0JCQlyZWcgPSA8MHgyMjAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MiAyIDA+OwogCQl9OwogCi0JCXNlcmlhbEAyYzAwIHsgLyogUFNDNiBpbiBVQVJUIG1vZGUgKi8KKwkJcHNjQDI0MDAgewkJLy8gUFNDMworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKKworCQlwc2NAMjYwMCB7CQkvLyBQU0M0CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQl9OworCisJCXBzY0AyODAwIHsJCS8vIFBTQzUKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCX07CisKKwkJcHNjQDJjMDAgewkJLy8gUFNDNgogCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcHNjLXVhcnQiLCJmc2wsbXBjNTIwMC1wc2MtdWFydCI7Ci0JCQlyZWcgPSA8MHgyYzAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MiA0IDA+OwogCQl9OwogCiAJCWV0aGVybmV0QDMwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZmVjIiwiZnNsLG1wYzUyMDAtZmVjIjsKLQkJCXJlZyA9IDwweDMwMDAgMHg0MDA+OwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07Ci0JCQlpbnRlcnJ1cHRzID0gPDIgNSAwPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTA+OwogCQl9OwogCiAJCW1kaW9AMzAwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItbWRpbyIsImZzbCxtcGM1MjAwLW1kaW8iOwotCQkJcmVnID0gPDB4MzAwMCAweDQwMD47IAkvLyBmZWMgcmFuZ2UsIHNpbmNlIHdlIG5lZWQgdG8gc2V0dXAgZmVjIGludGVycnVwdHMKLQkJCWludGVycnVwdHMgPSA8MiA1IDA+OyAJLy8gdGhlc2UgYXJlIGZvciAibWlpIGNvbW1hbmQgZmluaXNoZWQiLCBub3QgbGluayBjaGFuZ2VzICYgY28uCi0KIAkJCXBoeTA6IGV0aGVybmV0LXBoeUAwIHsKIAkJCQljb21wYXRpYmxlID0gImludGVsLGx4dDk3MSI7CiAJCQkJcmVnID0gPDA+OwogCQkJfTsKIAkJfTsKIAotCQlhdGFAM2EwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1hdGEiLCJmc2wsbXBjNTIwMC1hdGEiOwotCQkJcmVnID0gPDB4M2EwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgNyAwPjsKKwkJaTJjQDNkMDAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAogCQlpMmNAM2Q0MCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItaTJjIiwiZnNsLG1wYzUyMDAtaTJjIiwiZnNsLWkyYyI7Ci0JCQlyZWcgPSA8MHgzZDQwIDB4NDA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDE2IDA+OwogCQkJaHdtb25AMmMgewogCQkJCWNvbXBhdGlibGUgPSAiYWQsYWRtOTI0MCI7CiAJCQkJcmVnID0gPDB4MmM+OwpAQCAtMTg2LDIwICsxMjMsOSBAQAogCQkJCXJlZyA9IDwweDUxPjsKIAkJCX07CiAJCX07Ci0KLQkJc3JhbUA4MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXNyYW0iLCJmc2wsbXBjNTIwMC1zcmFtIjsKLQkJCXJlZyA9IDwweDgwMDAgMHg0MDAwPjsKLQkJfTsKIAl9OwogCiAJcGNpQGYwMDAwZDAwIHsKLQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwotCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1wY2kiLCJmc2wsbXBjNTIwMC1wY2kiOwotCQlyZWcgPSA8MHhmMDAwMGQwMCAweDEwMD47CiAJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMCAwIDc+OwogCQlpbnRlcnJ1cHQtbWFwID0gPAogCQkJCS8qIElEU0VMIDB4MTAgKi8KQEAgLTIwOCwyMCArMTM0LDEyIEBACiAJCQkJMHg4MDAwIDAgMCAzICZtcGM1MjAwX3BpYyAwIDIgMwogCQkJCTB4ODAwMCAwIDAgNCAmbXBjNTIwMF9waWMgMCAxIDMKIAkJCQk+OwotCQljbG9jay1mcmVxdWVuY3kgPSA8MD47IC8vIEZyb20gYm9vdCBsb2FkZXIKLQkJaW50ZXJydXB0cyA9IDwyIDggMCAyIDkgMCAyIDEwIDA+OwotCQlidXMtcmFuZ2UgPSA8MCAwPjsKIAkJcmFuZ2VzID0gPDB4NDIwMDAwMDAgMCAweDYwMDAwMDAwIDB4NjAwMDAwMDAgMCAweDEwMDAwMDAwCiAJCQkgIDB4MDIwMDAwMDAgMCAweDkwMDAwMDAwIDB4OTAwMDAwMDAgMCAweDEwMDAwMDAwCiAJCQkgIDB4MDEwMDAwMDAgMCAweDAwMDAwMDAwIDB4YTAwMDAwMDAgMCAweDAxMDAwMDAwPjsKIAl9OwogCiAJbG9jYWxidXMgewotCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1scGIiLCJmc2wsbXBjNTIwMC1scGIiLCJzaW1wbGUtYnVzIjsKLQotCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKLQkJI3NpemUtY2VsbHMgPSA8MT47Ci0KIAkJcmFuZ2VzID0gPDAgMCAweGZmODAwMDAwIDB4MDA4MDAwMDAKIAkJCSAgMSAwIDB4ODAwMDAwMDAgMHgwMDgwMDAwMAogCQkJICAzIDAgMHg4MDAwMDAwMCAweDAwODAwMDAwPjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wY20wMzAuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3BjbTAzMC5kdHMKaW5kZXggOGE0ZWMzMC4uOWUzNTQ5OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3BjbTAzMC5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3BjbTAzMC5kdHMKQEAgLTEyLDI0NiArMTIsOTIgQEAKICAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotL2R0cy12MS87CisvaW5jbHVkZS8gIm1wYzUyMDBiLmR0c2kiCiAKIC8gewogCW1vZGVsID0gInBoeXRlYyxwY20wMzAiOwogCWNvbXBhdGlibGUgPSAicGh5dGVjLHBjbTAzMCI7Ci0JI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JI3NpemUtY2VsbHMgPSA8MT47Ci0JaW50ZXJydXB0LXBhcmVudCA9IDwmbXBjNTIwMF9waWM+OwotCi0JY3B1cyB7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQotCQlQb3dlclBDLDUyMDBAMCB7Ci0JCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwotCQkJcmVnID0gPDA+OwotCQkJZC1jYWNoZS1saW5lLXNpemUgPSA8MzI+OwotCQkJaS1jYWNoZS1saW5lLXNpemUgPSA8MzI+OwotCQkJZC1jYWNoZS1zaXplID0gPDB4NDAwMD47CS8vIEwxLCAxNksKLQkJCWktY2FjaGUtc2l6ZSA9IDwweDQwMDA+OwkvLyBMMSwgMTZLCi0JCQl0aW1lYmFzZS1mcmVxdWVuY3kgPSA8MD47CS8vIGZyb20gYm9vdGxvYWRlcgotCQkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCi0JCX07Ci0JfTsKLQotCW1lbW9yeSB7Ci0JCWRldmljZV90eXBlID0gIm1lbW9yeSI7Ci0JCXJlZyA9IDwweDAwMDAwMDAwIDB4MDQwMDAwMDA+OwkvLyA2NE1CCi0JfTsKIAogCXNvYzUyMDBAZjAwMDAwMDAgewotCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWltbXIiOwotCQlyYW5nZXMgPSA8MCAweGYwMDAwMDAwIDB4MDAwMGMwMDA+OwotCQlidXMtZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCi0JCXN5c3RlbS1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKLQotCQljZG1AMjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWNkbSIsImZzbCxtcGM1MjAwLWNkbSI7Ci0JCQlyZWcgPSA8MHgyMDAgMHgzOD47Ci0JCX07Ci0KLQkJbXBjNTIwMF9waWM6IGludGVycnVwdC1jb250cm9sbGVyQDUwMCB7Ci0JCQkvLyA1MjAwIGludGVycnVwdHMgYXJlIGVuY29kZWQgaW50byB0d28gbGV2ZWxzOwotCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7Ci0JCQkjaW50ZXJydXB0LWNlbGxzID0gPDM+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcGljIiwiZnNsLG1wYzUyMDAtcGljIjsKLQkJCXJlZyA9IDwweDUwMCAweDgwPjsKLQkJfTsKLQotCQl0aW1lckA2MDAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2MDAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgOSAwPjsKKwkJdGltZXJANjAwIHsJCS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgogCQkJZnNsLGhhcy13ZHQ7CiAJCX07CiAKLQkJdGltZXJANjEwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjEwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDEwIDA+OwotCQl9OwotCiAJCWdwdDI6IHRpbWVyQDYyMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lciBpbiBHUElPIG1vZGUKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdC1ncGlvIiwiZnNsLG1wYzUyMDAtZ3B0LWdwaW8iOwotCQkJcmVnID0gPDB4NjIwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDExIDA+OwogCQkJZ3Bpby1jb250cm9sbGVyOwogCQkJI2dwaW8tY2VsbHMgPSA8Mj47CiAJCX07CiAKIAkJZ3B0MzogdGltZXJANjMwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyIGluIEdQSU8gbW9kZQogCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0LWdwaW8iLCJmc2wsbXBjNTIwMC1ncHQtZ3BpbyI7Ci0JCQlyZWcgPSA8MHg2MzAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTIgMD47CiAJCQlncGlvLWNvbnRyb2xsZXI7CiAJCQkjZ3Bpby1jZWxscyA9IDwyPjsKIAkJfTsKIAogCQlncHQ0OiB0aW1lckA2NDAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIgaW4gR1BJTyBtb2RlCiAJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQtZ3BpbyIsImZzbCxtcGM1MjAwLWdwdC1ncGlvIjsKLQkJCXJlZyA9IDwweDY0MCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxMyAwPjsKIAkJCWdwaW8tY29udHJvbGxlcjsKIAkJCSNncGlvLWNlbGxzID0gPDI+OwogCQl9OwogCiAJCWdwdDU6IHRpbWVyQDY1MCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lciBpbiBHUElPIG1vZGUKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdC1ncGlvIiwiZnNsLG1wYzUyMDAtZ3B0LWdwaW8iOwotCQkJcmVnID0gPDB4NjUwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDE0IDA+OwogCQkJZ3Bpby1jb250cm9sbGVyOwogCQkJI2dwaW8tY2VsbHMgPSA8Mj47CiAJCX07CiAKIAkJZ3B0NjogdGltZXJANjYwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyIGluIEdQSU8gbW9kZQogCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0LWdwaW8iLCJmc2wsbXBjNTIwMC1ncHQtZ3BpbyI7Ci0JCQlyZWcgPSA8MHg2NjAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTUgMD47CiAJCQlncGlvLWNvbnRyb2xsZXI7CiAJCQkjZ3Bpby1jZWxscyA9IDwyPjsKIAkJfTsKIAogCQlncHQ3OiB0aW1lckA2NzAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIgaW4gR1BJTyBtb2RlCiAJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQtZ3BpbyIsImZzbCxtcGM1MjAwLWdwdC1ncGlvIjsKLQkJCXJlZyA9IDwweDY3MCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxNiAwPjsKIAkJCWdwaW8tY29udHJvbGxlcjsKIAkJCSNncGlvLWNlbGxzID0gPDI+OwogCQl9OwogCi0JCXJ0Y0A4MDAgewkvLyBSZWFsIHRpbWUgY2xvY2sKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXJ0YyIsImZzbCxtcGM1MjAwLXJ0YyI7Ci0JCQlyZWcgPSA8MHg4MDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDUgMCAxIDYgMD47Ci0JCX07Ci0KLQkJY2FuQDkwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1tc2NhbiIsImZzbCxtcGM1MjAwLW1zY2FuIjsKLQkJCWludGVycnVwdHMgPSA8MiAxNyAwPjsKLQkJCXJlZyA9IDwweDkwMCAweDgwPjsKLQkJfTsKLQotCQljYW5AOTgwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLW1zY2FuIiwiZnNsLG1wYzUyMDAtbXNjYW4iOwotCQkJaW50ZXJydXB0cyA9IDwyIDE4IDA+OwotCQkJcmVnID0gPDB4OTgwIDB4ODA+OwotCQl9OwotCi0JCWdwaW9fc2ltcGxlOiBncGlvQGIwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncGlvIiwiZnNsLG1wYzUyMDAtZ3BpbyI7Ci0JCQlyZWcgPSA8MHhiMDAgMHg0MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgNyAwPjsKLQkJCWdwaW8tY29udHJvbGxlcjsKLQkJCSNncGlvLWNlbGxzID0gPDI+OwotCQl9OwotCi0JCWdwaW9fd2t1cDogZ3Bpb0BjMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3Bpby13a3VwIiwiZnNsLG1wYzUyMDAtZ3Bpby13a3VwIjsKLQkJCXJlZyA9IDwweGMwMCAweDQwPjsKLQkJCWludGVycnVwdHMgPSA8MSA4IDAgMCAzIDA+OwotCQkJZ3Bpby1jb250cm9sbGVyOwotCQkJI2dwaW8tY2VsbHMgPSA8Mj47Ci0JCX07Ci0KLQkJc3BpQGYwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1zcGkiLCJmc2wsbXBjNTIwMC1zcGkiOwotCQkJcmVnID0gPDB4ZjAwIDB4MjA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDEzIDAgMiAxNCAwPjsKLQkJfTsKLQotCQl1c2JAMTAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1vaGNpIiwiZnNsLG1wYzUyMDAtb2hjaSIsIm9oY2ktYmUiOwotCQkJcmVnID0gPDB4MTAwMCAweGZmPjsKLQkJCWludGVycnVwdHMgPSA8MiA2IDA+OwotCQl9OwotCi0JCWRtYS1jb250cm9sbGVyQDEyMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItYmVzdGNvbW0iLCJmc2wsbXBjNTIwMC1iZXN0Y29tbSI7Ci0JCQlyZWcgPSA8MHgxMjAwIDB4ODA+OwotCQkJaW50ZXJydXB0cyA9IDwzIDAgMCAgMyAxIDAgIDMgMiAwICAzIDMgMAotCQkJICAgICAgICAgICAgICAzIDQgMCAgMyA1IDAgIDMgNiAwICAzIDcgMAotCQkJICAgICAgICAgICAgICAzIDggMCAgMyA5IDAgIDMgMTAgMCAgMyAxMSAwCi0JCQkgICAgICAgICAgICAgIDMgMTIgMCAgMyAxMyAwICAzIDE0IDAgIDMgMTUgMD47Ci0JCX07Ci0KLQkJeGxiQDFmMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGIteGxiIiwiZnNsLG1wYzUyMDAteGxiIjsKLQkJCXJlZyA9IDwweDFmMDAgMHgxMDA+OwotCQl9OwotCi0JCWFjOTdAMjAwMCB7IC8qIFBTQzEgaW4gYWM5NyBtb2RlICovCisJCXBzY0AyMDAwIHsgLyogUFNDMSBpbiBhYzk3IG1vZGUgKi8KIAkJCWNvbXBhdGlibGUgPSAibXBjNTIwMGItcHNjLWFjOTciLCJmc2wsbXBjNTIwMGItcHNjLWFjOTciOwogCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCXJlZyA9IDwweDIwMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDEgMD47CiAJCX07CiAKIAkJLyogUFNDMiBwb3J0IGlzIHVzZWQgYnkgQ0FOMS8yICovCisJCXBzY0AyMjAwIHsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCX07CiAKLQkJc2VyaWFsQDI0MDAgeyAvKiBQU0MzIGluIFVBUlQgbW9kZSAqLworCQlwc2NAMjQwMCB7IC8qIFBTQzMgaW4gVUFSVCBtb2RlICovCiAJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1wc2MtdWFydCIsImZzbCxtcGM1MjAwLXBzYy11YXJ0IjsKLQkJCWNlbGwtaW5kZXggPSA8Mj47Ci0JCQlyZWcgPSA8MHgyNDAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MiAzIDA+OwogCQl9OwogCiAJCS8qIFBTQzQgaXMgPz8/ICovCisJCXBzY0AyNjAwIHsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCX07CiAKIAkJLyogUFNDNSBpcyA/Pz8gKi8KKwkJcHNjQDI4MDAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKIAotCQlzZXJpYWxAMmMwMCB7IC8qIFBTQzYgaW4gVUFSVCBtb2RlICovCisJCXBzY0AyYzAwIHsgLyogUFNDNiBpbiBVQVJUIG1vZGUgKi8KIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBzYy11YXJ0IiwiZnNsLG1wYzUyMDAtcHNjLXVhcnQiOwotCQkJY2VsbC1pbmRleCA9IDw1PjsKLQkJCXJlZyA9IDwweDJjMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDQgMD47CiAJCX07CiAKIAkJZXRoZXJuZXRAMzAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1mZWMiLCJmc2wsbXBjNTIwMC1mZWMiOwotCQkJcmVnID0gPDB4MzAwMCAweDQwMD47Ci0JCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKLQkJCWludGVycnVwdHMgPSA8MiA1IDA+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5MD47CiAJCX07CiAKIAkJbWRpb0AzMDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1tZGlvIiwiZnNsLG1wYzUyMDAtbWRpbyI7Ci0JCQlyZWcgPSA8MHgzMDAwIDB4NDAwPjsJLy8gZmVjIHJhbmdlLCBzaW5jZSB3ZSBuZWVkIHRvIHNldHVwIGZlYyBpbnRlcnJ1cHRzCi0JCQlpbnRlcnJ1cHRzID0gPDIgNSAwPjsJLy8gdGhlc2UgYXJlIGZvciAibWlpIGNvbW1hbmQgZmluaXNoZWQiLCBub3QgbGluayBjaGFuZ2VzICYgY28uCi0KIAkJCXBoeTA6IGV0aGVybmV0LXBoeUAwIHsKIAkJCQlyZWcgPSA8MD47CiAJCQl9OwogCQl9OwogCi0JCWF0YUAzYTAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWF0YSIsImZzbCxtcGM1MjAwLWF0YSI7Ci0JCQlyZWcgPSA8MHgzYTAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MiA3IDA+OwotCQl9OwotCi0JCWkyY0AzZDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1pMmMiLCJmc2wsbXBjNTIwMC1pMmMiLCJmc2wtaTJjIjsKLQkJCXJlZyA9IDwweDNkMDAgMHg0MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMTUgMD47Ci0JCX07Ci0KIAkJaTJjQDNkNDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWkyYyIsImZzbCxtcGM1MjAwLWkyYyIsImZzbC1pMmMiOwotCQkJcmVnID0gPDB4M2Q0MCAweDQwPjsKLQkJCWludGVycnVwdHMgPSA8MiAxNiAwPjsKIAkJCXJ0Y0A1MSB7CiAJCQkJY29tcGF0aWJsZSA9ICJueHAscGNmODU2MyI7CiAJCQkJcmVnID0gPDB4NTE+OwpAQCAtMjU5LDYgKzEwNSw3IEBACiAJCQllZXByb21ANTIgewogCQkJCWNvbXBhdGlibGUgPSAiY2F0YWx5c3QsMjRjMzIiOwogCQkJCXJlZyA9IDwweDUyPjsKKwkJCQlwYWdlc2l6ZSA9IDwzMj47CiAJCQl9OwogCQl9OwogCkBAIC0yNjksMTIgKzExNiw2IEBACiAJfTsKIAogCXBjaUBmMDAwMGQwMCB7Ci0JCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDI+OwotCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKLQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcGNpIiwiZnNsLG1wYzUyMDAtcGNpIjsKLQkJcmVnID0gPDB4ZjAwMDBkMDAgMHgxMDA+OwogCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKIAkJaW50ZXJydXB0LW1hcCA9IDwweGMwMDAgMCAwIDEgJm1wYzUyMDBfcGljIDAgMCAzIC8vIDFzdCBzbG90CiAJCQkJIDB4YzAwMCAwIDAgMiAmbXBjNTIwMF9waWMgMSAxIDMKQEAgLTI4NSwxMSArMTI2LDEyIEBACiAJCQkJIDB4YzgwMCAwIDAgMiAmbXBjNTIwMF9waWMgMSAyIDMKIAkJCQkgMHhjODAwIDAgMCAzICZtcGM1MjAwX3BpYyAxIDMgMwogCQkJCSAweGM4MDAgMCAwIDQgJm1wYzUyMDBfcGljIDAgMCAzPjsKLQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAvLyBGcm9tIGJvb3QgbG9hZGVyCi0JCWludGVycnVwdHMgPSA8MiA4IDAgMiA5IDAgMiAxMCAwPjsKLQkJYnVzLXJhbmdlID0gPDAgMD47CiAJCXJhbmdlcyA9IDwweDQyMDAwMDAwIDAgMHg4MDAwMDAwMCAweDgwMDAwMDAwIDAgMHgyMDAwMDAwMAogCQkJICAweDAyMDAwMDAwIDAgMHhhMDAwMDAwMCAweGEwMDAwMDAwIDAgMHgxMDAwMDAwMAogCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMCAweGIwMDAwMDAwIDAgMHgwMTAwMDAwMD47CiAJfTsKKworCWxvY2FsYnVzIHsKKwkJc3RhdHVzID0gImRpc2FibGVkIjsKKwl9OwogfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wY20wMzIuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3BjbTAzMi5kdHMKaW5kZXggODVkODU3YS4uMWRkNDc4YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3BjbTAzMi5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3BjbTAzMi5kdHMKQEAgLTEyLDk5ICsxMiwzNyBAQAogICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCi0vZHRzLXYxLzsKKy9pbmNsdWRlLyAibXBjNTIwMGIuZHRzaSIKIAogLyB7CiAJbW9kZWwgPSAicGh5dGVjLHBjbTAzMiI7CiAJY29tcGF0aWJsZSA9ICJwaHl0ZWMscGNtMDMyIjsKLQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkjc2l6ZS1jZWxscyA9IDwxPjsKLQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGM1MjAwX3BpYz47Ci0KLQljcHVzIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDA+OwotCi0JCVBvd2VyUEMsNTIwMEAwIHsKLQkJCWRldmljZV90eXBlID0gImNwdSI7Ci0JCQlyZWcgPSA8MD47Ci0JCQlkLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47Ci0JCQlpLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47Ci0JCQlkLWNhY2hlLXNpemUgPSA8MHg0MDAwPjsJLy8gTDEsIDE2SwotCQkJaS1jYWNoZS1zaXplID0gPDB4NDAwMD47CS8vIEwxLCAxNksKLQkJCXRpbWViYXNlLWZyZXF1ZW5jeSA9IDwwPjsJLy8gZnJvbSBib290bG9hZGVyCi0JCQlidXMtZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCi0JCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKLQkJfTsKLQl9OwogCiAJbWVtb3J5IHsKLQkJZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKIAkJcmVnID0gPDB4MDAwMDAwMDAgMHgwODAwMDAwMD47CS8vIDEyOE1CCiAJfTsKIAogCXNvYzUyMDBAZjAwMDAwMDAgewotCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWltbXIiOwotCQlyYW5nZXMgPSA8MCAweGYwMDAwMDAwIDB4MDAwMGMwMDA+OwotCQlidXMtZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCi0JCXN5c3RlbS1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKLQotCQljZG1AMjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWNkbSIsImZzbCxtcGM1MjAwLWNkbSI7Ci0JCQlyZWcgPSA8MHgyMDAgMHgzOD47Ci0JCX07Ci0KLQkJbXBjNTIwMF9waWM6IGludGVycnVwdC1jb250cm9sbGVyQDUwMCB7Ci0JCQkvLyA1MjAwIGludGVycnVwdHMgYXJlIGVuY29kZWQgaW50byB0d28gbGV2ZWxzOwotCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7Ci0JCQkjaW50ZXJydXB0LWNlbGxzID0gPDM+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcGljIiwiZnNsLG1wYzUyMDAtcGljIjsKLQkJCXJlZyA9IDwweDUwMCAweDgwPjsKLQkJfTsKLQotCQl0aW1lckA2MDAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2MDAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgOSAwPjsKKwkJdGltZXJANjAwIHsJCS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgogCQkJZnNsLGhhcy13ZHQ7CiAJCX07CiAKLQkJdGltZXJANjEwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjEwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDEwIDA+OwotCQl9OwotCiAJCWdwdDI6IHRpbWVyQDYyMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lciBpbiBHUElPIG1vZGUKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2MjAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTEgMD47CiAJCQlncGlvLWNvbnRyb2xsZXI7CiAJCQkjZ3Bpby1jZWxscyA9IDwyPjsKIAkJfTsKIAogCQlncHQzOiB0aW1lckA2MzAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIgaW4gR1BJTyBtb2RlCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjMwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDEyIDA+OwogCQkJZ3Bpby1jb250cm9sbGVyOwogCQkJI2dwaW8tY2VsbHMgPSA8Mj47CiAJCX07CiAKIAkJZ3B0NDogdGltZXJANjQwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyIGluIEdQSU8gbW9kZQotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDY0MCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxMyAwPjsKIAkJCWdwaW8tY29udHJvbGxlcjsKIAkJCSNncGlvLWNlbGxzID0gPDI+OwogCQl9OwogCiAJCWdwdDU6IHRpbWVyQDY1MCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lciBpbiBHUElPIG1vZGUKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2NTAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTQgMD47CiAJCQlncGlvLWNvbnRyb2xsZXI7CiAJCQkjZ3Bpby1jZWxscyA9IDwyPjsKIAkJfTsKQEAgLTExOCwxNjMgKzU2LDYyIEBACiAJCX07CiAKIAkJZ3B0NzogdGltZXJANjcwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyIGluIEdQSU8gbW9kZQotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDY3MCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxNiAwPjsKIAkJCWdwaW8tY29udHJvbGxlcjsKIAkJCSNncGlvLWNlbGxzID0gPDI+OwogCQl9OwogCi0JCXJ0Y0A4MDAgewkvLyBSZWFsIHRpbWUgY2xvY2sKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXJ0YyIsImZzbCxtcGM1MjAwLXJ0YyI7Ci0JCQlyZWcgPSA8MHg4MDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDUgMCAxIDYgMD47Ci0JCX07Ci0KLQkJY2FuQDkwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1tc2NhbiIsImZzbCxtcGM1MjAwLW1zY2FuIjsKLQkJCWludGVycnVwdHMgPSA8MiAxNyAwPjsKLQkJCXJlZyA9IDwweDkwMCAweDgwPjsKLQkJfTsKLQotCQljYW5AOTgwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLW1zY2FuIiwiZnNsLG1wYzUyMDAtbXNjYW4iOwotCQkJaW50ZXJydXB0cyA9IDwyIDE4IDA+OwotCQkJcmVnID0gPDB4OTgwIDB4ODA+OwotCQl9OwotCi0JCWdwaW9fc2ltcGxlOiBncGlvQGIwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncGlvIiwiZnNsLG1wYzUyMDAtZ3BpbyI7Ci0JCQlyZWcgPSA8MHhiMDAgMHg0MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgNyAwPjsKLQkJCWdwaW8tY29udHJvbGxlcjsKLQkJCSNncGlvLWNlbGxzID0gPDI+OwotCQl9OwotCi0JCWdwaW9fd2t1cDogZ3Bpb0BjMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3Bpby13a3VwIiwiZnNsLG1wYzUyMDAtZ3Bpby13a3VwIjsKLQkJCXJlZyA9IDwweGMwMCAweDQwPjsKLQkJCWludGVycnVwdHMgPSA8MSA4IDAgMCAzIDA+OwotCQkJZ3Bpby1jb250cm9sbGVyOwotCQkJI2dwaW8tY2VsbHMgPSA8Mj47Ci0JCX07Ci0KLQkJc3BpQGYwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1zcGkiLCJmc2wsbXBjNTIwMC1zcGkiOwotCQkJcmVnID0gPDB4ZjAwIDB4MjA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDEzIDAgMiAxNCAwPjsKLQkJfTsKLQotCQl1c2JAMTAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1vaGNpIiwiZnNsLG1wYzUyMDAtb2hjaSIsIm9oY2ktYmUiOwotCQkJcmVnID0gPDB4MTAwMCAweGZmPjsKLQkJCWludGVycnVwdHMgPSA8MiA2IDA+OwotCQl9OwotCi0JCWRtYS1jb250cm9sbGVyQDEyMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItYmVzdGNvbW0iLCJmc2wsbXBjNTIwMC1iZXN0Y29tbSI7Ci0JCQlyZWcgPSA8MHgxMjAwIDB4ODA+OwotCQkJaW50ZXJydXB0cyA9IDwzIDAgMCAgMyAxIDAgIDMgMiAwICAzIDMgMAotCQkJICAgICAgICAgICAgICAzIDQgMCAgMyA1IDAgIDMgNiAwICAzIDcgMAotCQkJICAgICAgICAgICAgICAzIDggMCAgMyA5IDAgIDMgMTAgMCAgMyAxMSAwCi0JCQkgICAgICAgICAgICAgIDMgMTIgMCAgMyAxMyAwICAzIDE0IDAgIDMgMTUgMD47Ci0JCX07Ci0KLQkJeGxiQDFmMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGIteGxiIiwiZnNsLG1wYzUyMDAteGxiIjsKLQkJCXJlZyA9IDwweDFmMDAgMHgxMDA+OwotCQl9OwotCi0JCWFjOTdAMjAwMCB7CS8qIFBTQzEgaXMgYWM5NyAqLworCQlwc2NAMjAwMCB7CS8qIFBTQzEgaXMgYWM5NyAqLwogCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcHNjLWFjOTciLCJmc2wsbXBjNTIwMC1wc2MtYWM5NyI7CiAJCQljZWxsLWluZGV4ID0gPDA+OwotCQkJcmVnID0gPDB4MjAwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMSAwPjsKIAkJfTsKIAogCQkvKiBQU0MyIHBvcnQgaXMgdXNlZCBieSBDQU4xLzIgKi8KKwkJcHNjQDIyMDAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKIAotCQlzZXJpYWxAMjQwMCB7IC8qIFBTQzMgaW4gVUFSVCBtb2RlICovCisJCXBzY0AyNDAwIHsgLyogUFNDMyBpbiBVQVJUIG1vZGUgKi8KIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBzYy11YXJ0IiwiZnNsLG1wYzUyMDAtcHNjLXVhcnQiOwotCQkJY2VsbC1pbmRleCA9IDwyPjsKLQkJCXJlZyA9IDwweDI0MDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDMgMD47CiAJCX07CiAKIAkJLyogUFNDNCBpcyA/Pz8gKi8KKwkJcHNjQDI2MDAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKIAogCQkvKiBQU0M1IGlzID8/PyAqLworCQlwc2NAMjgwMCB7CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQl9OwogCi0JCXNlcmlhbEAyYzAwIHsgLyogUFNDNiBpbiBVQVJUIG1vZGUgKi8KKwkJcHNjQDJjMDAgeyAvKiBQU0M2IGluIFVBUlQgbW9kZSAqLwogCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcHNjLXVhcnQiLCJmc2wsbXBjNTIwMC1wc2MtdWFydCI7Ci0JCQljZWxsLWluZGV4ID0gPDU+OwotCQkJcmVnID0gPDB4MmMwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgNCAwPjsKIAkJfTsKIAogCQlldGhlcm5ldEAzMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWZlYyIsImZzbCxtcGM1MjAwLWZlYyI7Ci0JCQlyZWcgPSA8MHgzMDAwIDB4NDAwPjsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotCQkJaW50ZXJydXB0cyA9IDwyIDUgMD47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkwPjsKIAkJfTsKIAogCQltZGlvQDMwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLW1kaW8iLCJmc2wsbXBjNTIwMC1tZGlvIjsKLQkJCXJlZyA9IDwweDMwMDAgMHg0MDA+OwkvLyBmZWMgcmFuZ2UsIHNpbmNlIHdlIG5lZWQgdG8gc2V0dXAgZmVjIGludGVycnVwdHMKLQkJCWludGVycnVwdHMgPSA8MiA1IDA+OwkvLyB0aGVzZSBhcmUgZm9yICJtaWkgY29tbWFuZCBmaW5pc2hlZCIsIG5vdCBsaW5rIGNoYW5nZXMgJiBjby4KLQogCQkJcGh5MDogZXRoZXJuZXQtcGh5QDAgewogCQkJCXJlZyA9IDwwPjsKIAkJCX07CiAJCX07CiAKLQkJYXRhQDNhMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItYXRhIiwiZnNsLG1wYzUyMDAtYXRhIjsKLQkJCXJlZyA9IDwweDNhMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDcgMD47Ci0JCX07Ci0KLQkJaTJjQDNkMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWkyYyIsImZzbCxtcGM1MjAwLWkyYyIsImZzbC1pMmMiOwotCQkJcmVnID0gPDB4M2QwMCAweDQwPjsKLQkJCWludGVycnVwdHMgPSA8MiAxNSAwPjsKLQkJfTsKLQogCQlpMmNAM2Q0MCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItaTJjIiwiZnNsLG1wYzUyMDAtaTJjIiwiZnNsLWkyYyI7Ci0JCQlyZWcgPSA8MHgzZDQwIDB4NDA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDE2IDA+OwogCQkJcnRjQDUxIHsKIAkJCQljb21wYXRpYmxlID0gIm54cCxwY2Y4NTYzIjsKIAkJCQlyZWcgPSA8MHg1MT47CiAJCQl9OwogCQkJZWVwcm9tQDUyIHsKLQkJCQljb21wYXRpYmxlID0gImF0MjQsMjRjMzIiOworCQkJCWNvbXBhdGlibGUgPSAiY2F0YWx5c3QsMjRjMzIiOwogCQkJCXJlZyA9IDwweDUyPjsKKwkJCQlwYWdlc2l6ZSA9IDwzMj47CiAJCQl9OwogCQl9OwotCi0JCXNyYW1AODAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1zcmFtIiwiZnNsLG1wYzUyMDAtc3JhbSI7Ci0JCQlyZWcgPSA8MHg4MDAwIDB4NDAwMD47Ci0JCX07CiAJfTsKIAogCXBjaUBmMDAwMGQwMCB7Ci0JCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDI+OwotCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKLQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcGNpIiwiZnNsLG1wYzUyMDAtcGNpIjsKLQkJcmVnID0gPDB4ZjAwMDBkMDAgMHgxMDA+OwogCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKIAkJaW50ZXJydXB0LW1hcCA9IDwweGMwMDAgMCAwIDEgJm1wYzUyMDBfcGljIDAgMCAzIC8vIDFzdCBzbG90CiAJCQkJIDB4YzAwMCAwIDAgMiAmbXBjNTIwMF9waWMgMSAxIDMKQEAgLTI4NSwyMCArMTIyLDEyIEBACiAJCQkJIDB4YzgwMCAwIDAgMiAmbXBjNTIwMF9waWMgMSAyIDMKIAkJCQkgMHhjODAwIDAgMCAzICZtcGM1MjAwX3BpYyAxIDMgMwogCQkJCSAweGM4MDAgMCAwIDQgJm1wYzUyMDBfcGljIDAgMCAzPjsKLQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAvLyBGcm9tIGJvb3QgbG9hZGVyCi0JCWludGVycnVwdHMgPSA8MiA4IDAgMiA5IDAgMiAxMCAwPjsKLQkJYnVzLXJhbmdlID0gPDAgMD47CiAJCXJhbmdlcyA9IDwweDQyMDAwMDAwIDAgMHg4MDAwMDAwMCAweDgwMDAwMDAwIDAgMHgyMDAwMDAwMAogCQkJICAweDAyMDAwMDAwIDAgMHhhMDAwMDAwMCAweGEwMDAwMDAwIDAgMHgxMDAwMDAwMAogCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMCAweGIwMDAwMDAwIDAgMHgwMTAwMDAwMD47CiAJfTsKIAogCWxvY2FsYnVzIHsKLQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItbHBiIiwiZnNsLG1wYzUyMDAtbHBiIiwic2ltcGxlLWJ1cyI7Ci0KLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47Ci0JCSNzaXplLWNlbGxzID0gPDE+OwotCiAJCXJhbmdlcyA9IDwwIDAgMHhmZTAwMDAwMCAweDAyMDAwMDAwCiAJCQkgIDEgMCAweGZjMDAwMDAwIDB4MDIwMDAwMDAKIAkJCSAgMiAwIDB4ZmJlMDAwMDAgMHgwMDIwMDAwMApAQCAtMzUxLDQwICsxODAsMzkgQEAKIAkJCWJhbmstd2lkdGggPSA8Mj47CiAJCX07CiAKLSAgICAgICAgICAgICAgICAvKgorCQkvKgogCQkgKiBleGFtcGxlIHNuaXBwZXRzIGZvciBGUEdBCiAJCSAqCiAJCSAqIGZwZ2FAMywwIHsKLQkJICogICAgICAgICBjb21wYXRpYmxlID0gImZwZ2FfZHJpdmVyIjsKLQkJICogICAgICAgICByZWcgPSA8MyAwIDB4MDIwMDAwMDA+OwotCQkgKiAgICAgICAgIGJhbmstd2lkdGggPSA8ND47CisJCSAqCSBjb21wYXRpYmxlID0gImZwZ2FfZHJpdmVyIjsKKwkJICoJIHJlZyA9IDwzIDAgMHgwMjAwMDAwMD47CisJCSAqCSBiYW5rLXdpZHRoID0gPDQ+OwogCQkgKiB9OwogCQkgKgogCQkgKiBmcGdhQDQsMCB7Ci0JCSAqICAgICAgICAgY29tcGF0aWJsZSA9ICJmcGdhX2RyaXZlciI7Ci0JCSAqICAgICAgICAgcmVnID0gPDQgMCAweDAyMDAwMDAwPjsKLQkJICogICAgICAgICBiYW5rLXdpZHRoID0gPDQ+OworCQkgKgkgY29tcGF0aWJsZSA9ICJmcGdhX2RyaXZlciI7CisJCSAqCSByZWcgPSA8NCAwIDB4MDIwMDAwMDA+OworCQkgKgkgYmFuay13aWR0aCA9IDw0PjsKIAkJICogfTsKLSAgICAgICAgICAgICAgICAgKi8KKwkJICovCiAKLSAgICAgICAgICAgICAgICAvKgorCQkvKgogCQkgKiBleGFtcGxlIHNuaXBwZXRzIGZvciBmcmVlIGNoaXBzZWxlY3RzCi0gICAgICAgICAgICAgICAgICoKKwkJICoKIAkJICogZGV2aWNlQDUsMCB7Ci0JCSAqICAgICAgICAgY29tcGF0aWJsZSA9ICJjdXN0b21fZHJpdmVyIjsKLQkJICogICAgICAgICByZWcgPSA8NSAwIDB4MDIwMDAwMDA+OworCQkgKgkgY29tcGF0aWJsZSA9ICJjdXN0b21fZHJpdmVyIjsKKwkJICoJIHJlZyA9IDw1IDAgMHgwMjAwMDAwMD47CiAJCSAqIH07Ci0gICAgICAgICAgICAgICAgICoKKwkJICoKIAkJICogZGV2aWNlQDYsMCB7Ci0JCSAqICAgICAgICAgY29tcGF0aWJsZSA9ICJjdXN0b21fZHJpdmVyIjsKLQkJICogICAgICAgICByZWcgPSA8NiAwIDB4MDIwMDAwMDA+OworCQkgKgkgY29tcGF0aWJsZSA9ICJjdXN0b21fZHJpdmVyIjsKKwkJICoJIHJlZyA9IDw2IDAgMHgwMjAwMDAwMD47CiAJCSAqIH07Ci0gICAgICAgICAgICAgICAgICoKKwkJICoKIAkJICogZGV2aWNlQDcsMCB7Ci0JCSAqICAgICAgICAgY29tcGF0aWJsZSA9ICJjdXN0b21fZHJpdmVyIjsKLQkJICogICAgICAgICByZWcgPSA8NyAwIDB4MDIwMDAwMDA+OworCQkgKgkgY29tcGF0aWJsZSA9ICJjdXN0b21fZHJpdmVyIjsKKwkJICoJIHJlZyA9IDw3IDAgMHgwMjAwMDAwMD47CiAJCSAqIH07Ci0gICAgICAgICAgICAgICAgICovCisJCSAqLwogCX07CiB9OwotCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvdWMxMDEuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3VjMTAxLmR0cwppbmRleCAwMTkyNjRjLi5iYTgzZDU0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvdWMxMDEuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy91YzEwMS5kdHMKQEAgLTExLDc5ICsxMSwyNCBAQAogICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCi0vZHRzLXYxLzsKKy9pbmNsdWRlLyAibXBjNTIwMGIuZHRzaSIKIAogLyB7CiAJbW9kZWwgPSAibWFucm9sYW5kLHVjMTAxIjsKIAljb21wYXRpYmxlID0gIm1hbnJvbGFuZCx1YzEwMSI7Ci0JI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JI3NpemUtY2VsbHMgPSA8MT47Ci0JaW50ZXJydXB0LXBhcmVudCA9IDwmbXBjNTIwMF9waWM+OwotCi0JY3B1cyB7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQotCQlQb3dlclBDLDUyMDBAMCB7Ci0JCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwotCQkJcmVnID0gPDA+OwotCQkJZC1jYWNoZS1saW5lLXNpemUgPSA8MzI+OwotCQkJaS1jYWNoZS1saW5lLXNpemUgPSA8MzI+OwotCQkJZC1jYWNoZS1zaXplID0gPDB4NDAwMD47CS8vIEwxLCAxNksKLQkJCWktY2FjaGUtc2l6ZSA9IDwweDQwMDA+OwkvLyBMMSwgMTZLCi0JCQl0aW1lYmFzZS1mcmVxdWVuY3kgPSA8MD47CS8vIGZyb20gYm9vdGxvYWRlcgotCQkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCi0JCX07Ci0JfTsKLQotCW1lbW9yeSB7Ci0JCWRldmljZV90eXBlID0gIm1lbW9yeSI7Ci0JCXJlZyA9IDwweDAwMDAwMDAwIDB4MDQwMDAwMDA+OwkvLyA2NE1CCi0JfTsKIAogCXNvYzUyMDBAZjAwMDAwMDAgewotCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWltbXIiOwotCQlyYW5nZXMgPSA8MCAweGYwMDAwMDAwIDB4MDAwMGMwMDA+OwotCQlyZWcgPSA8MHhmMDAwMDAwMCAweDAwMDAwMTAwPjsKLQkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgotCQlzeXN0ZW0tZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCi0KLQkJY2RtQDIwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1jZG0iLCJmc2wsbXBjNTIwMC1jZG0iOwotCQkJcmVnID0gPDB4MjAwIDB4Mzg+OwotCQl9OwotCi0JCW1wYzUyMDBfcGljOiBpbnRlcnJ1cHQtY29udHJvbGxlckA1MDAgewotCQkJLy8gNTIwMCBpbnRlcnJ1cHRzIGFyZSBlbmNvZGVkIGludG8gdHdvIGxldmVsczsKLQkJCWludGVycnVwdC1jb250cm9sbGVyOwotCQkJI2ludGVycnVwdC1jZWxscyA9IDwzPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBpYyIsImZzbCxtcGM1MjAwLXBpYyI7Ci0JCQlyZWcgPSA8MHg1MDAgMHg4MD47Ci0JCX07Ci0KIAkJZ3B0MDogdGltZXJANjAwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyIGluIEdQSU8gbW9kZQotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDYwMCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSA5IDA+OwogCQkJZ3Bpby1jb250cm9sbGVyOwogCQkJI2dwaW8tY2VsbHMgPSA8Mj47CiAJCX07CiAKIAkJZ3B0MTogdGltZXJANjEwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyIGluIEdQSU8gbW9kZQotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDYxMCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxMCAwPjsKIAkJCWdwaW8tY29udHJvbGxlcjsKIAkJCSNncGlvLWNlbGxzID0gPDI+OwogCQl9OwogCiAJCWdwdDI6IHRpbWVyQDYyMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lciBpbiBHUElPIG1vZGUKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2MjAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTEgMD47CiAJCQlncGlvLWNvbnRyb2xsZXI7CiAJCQkjZ3Bpby1jZWxscyA9IDwyPjsKIAkJfTsKQEAgLTk3LDExOCArNDIsODUgQEAKIAkJfTsKIAogCQlncHQ0OiB0aW1lckA2NDAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIgaW4gR1BJTyBtb2RlCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjQwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDEzIDA+OwogCQkJZ3Bpby1jb250cm9sbGVyOwogCQkJI2dwaW8tY2VsbHMgPSA8Mj47CiAJCX07CiAKIAkJZ3B0NTogdGltZXJANjUwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyIGluIEdQSU8gbW9kZQotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDY1MCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxNCAwPjsKIAkJCWdwaW8tY29udHJvbGxlcjsKIAkJCSNncGlvLWNlbGxzID0gPDI+OwogCQl9OwogCiAJCWdwdDY6IHRpbWVyQDY2MCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lciBpbiBHUElPIG1vZGUKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2NjAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTUgMD47CiAJCQlncGlvLWNvbnRyb2xsZXI7CiAJCQkjZ3Bpby1jZWxscyA9IDwyPjsKIAkJfTsKIAogCQlncHQ3OiB0aW1lckA2NzAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIgaW4gR1BJTyBtb2RlCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjcwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDE2IDA+OwogCQkJZ3Bpby1jb250cm9sbGVyOwogCQkJI2dwaW8tY2VsbHMgPSA8Mj47CiAJCX07CiAKLQkJZ3Bpb19zaW1wbGU6IGdwaW9AYjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwaW8iLCJmc2wsbXBjNTIwMC1ncGlvIjsKLQkJCXJlZyA9IDwweGIwMCAweDQwPjsKLQkJCWludGVycnVwdHMgPSA8MSA3IDA+OwotCQkJZ3Bpby1jb250cm9sbGVyOwotCQkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCXJ0Y0A4MDAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAotCQlncGlvX3drdXA6IGdwaW9AYzAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwaW8td2t1cCIsImZzbCxtcGM1MjAwLWdwaW8td2t1cCI7Ci0JCQlyZWcgPSA8MHhjMDAgMHg0MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgOCAwIDAgMyAwPjsKLQkJCWdwaW8tY29udHJvbGxlcjsKLQkJCSNncGlvLWNlbGxzID0gPDI+OworCQljYW5AOTAwIHsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07CiAKLQkJZG1hLWNvbnRyb2xsZXJAMTIwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1iZXN0Y29tbSIsImZzbCxtcGM1MjAwLWJlc3Rjb21tIjsKLQkJCXJlZyA9IDwweDEyMDAgMHg4MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDMgMCAwICAzIDEgMCAgMyAyIDAgIDMgMyAwCi0JCQkgICAgICAgICAgICAgIDMgNCAwICAzIDUgMCAgMyA2IDAgIDMgNyAwCi0JCQkgICAgICAgICAgICAgIDMgOCAwICAzIDkgMCAgMyAxMCAwICAzIDExIDAKLQkJCSAgICAgICAgICAgICAgMyAxMiAwICAzIDEzIDAgIDMgMTQgMCAgMyAxNSAwPjsKKwkJY2FuQDk4MCB7CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQl9OwogCi0JCXhsYkAxZjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXhsYiIsImZzbCxtcGM1MjAwLXhsYiI7Ci0JCQlyZWcgPSA8MHgxZjAwIDB4MTAwPjsKKwkJc3BpQGYwMCB7CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQl9OwogCi0JCXNlcmlhbEAyMDAwIHsgLyogUFNDMSBpbiBVQVJUIG1vZGUgKi8KKwkJdXNiQDEwMDAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKKworCQlwc2NAMjAwMCB7CS8vIFBTQzEKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBzYy11YXJ0IiwiZnNsLG1wYzUyMDAtcHNjLXVhcnQiOwotCQkJcmVnID0gPDB4MjAwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMSAwPjsKIAkJfTsKIAotCQlzZXJpYWxAMjIwMCB7IC8qIFBTQzIgaW4gVUFSVCBtb2RlICovCisJCXBzY0AyMjAwIHsJLy8gUFNDMgogCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcHNjLXVhcnQiLCJmc2wsbXBjNTIwMC1wc2MtdWFydCI7Ci0JCQlyZWcgPSA8MHgyMjAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MiAyIDA+OwogCQl9OwogCi0JCXNlcmlhbEAyYzAwIHsJCS8qIFBTQzYgaW4gVUFSVCBtb2RlICovCisJCXBzY0AyNDAwIHsJLy8gUFNDMworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKKworCQlwc2NAMjYwMCB7CS8vIFBTQzQKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCX07CisKKwkJcHNjQDI4MDAgewkvLyBQU0M1CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQl9OworCisJCXBzY0AyYzAwIHsJLy8gUFNDNgogCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcHNjLXVhcnQiLCJmc2wsbXBjNTIwMC1wc2MtdWFydCI7Ci0JCQlyZWcgPSA8MHgyYzAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MiA0IDA+OwogCQl9OwogCiAJCWV0aGVybmV0QDMwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZmVjIiwiZnNsLG1wYzUyMDAtZmVjIjsKLQkJCXJlZyA9IDwweDMwMDAgMHg0MDA+OwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07Ci0JCQlpbnRlcnJ1cHRzID0gPDIgNSAwPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTA+OwogCQl9OwogCiAJCW1kaW9AMzAwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItbWRpbyIsImZzbCxtcGM1MjAwLW1kaW8iOwotCQkJcmVnID0gPDB4MzAwMCAweDQwMD47CS8vIGZlYyByYW5nZSwgc2luY2Ugd2UgbmVlZCB0byBzZXR1cCBmZWMgaW50ZXJydXB0cwotCQkJaW50ZXJydXB0cyA9IDwyIDUgMD47CS8vIHRoZXNlIGFyZSBmb3IgIm1paSBjb21tYW5kIGZpbmlzaGVkIiwgbm90IGxpbmsgY2hhbmdlcyAmIGNvLgotCiAJCQlwaHkwOiBldGhlcm5ldC1waHlAMCB7CiAJCQkJY29tcGF0aWJsZSA9ICJpbnRlbCxseHQ5NzEiOwogCQkJCXJlZyA9IDwwPjsKIAkJCX07CiAJCX07CiAKLQkJYXRhQDNhMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItYXRhIiwiZnNsLG1wYzUyMDAtYXRhIjsKLQkJCXJlZyA9IDwweDNhMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDcgMD47CisJCWkyY0AzZDAwIHsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07CiAKIAkJaTJjQDNkNDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWkyYyIsImZzbCxtcGM1MjAwLWkyYyIsImZzbC1pMmMiOwotCQkJcmVnID0gPDB4M2Q0MCAweDQwPjsKLQkJCWludGVycnVwdHMgPSA8MiAxNiAwPjsKIAkJCWZzbCxwcmVzZXJ2ZS1jbG9ja2luZzsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDw0MDAwMDA+OwogCkBAIC0yMjEsMTkgKzEzMywxMyBAQAogCQkJCXJlZyA9IDwweDUxPjsKIAkJCX07CiAJCX07CisJfTsKIAotCQlzcmFtQDgwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItc3JhbSIsImZzbCxtcGM1MjAwLXNyYW0iOwotCQkJcmVnID0gPDB4ODAwMCAweDQwMDA+OwotCQl9OworCXBjaUBmMDAwMGQwMCB7CisJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJfTsKIAogCWxvY2FsYnVzIHsKLQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItbHBiIiwiZnNsLG1wYzUyMDAtbHBiIiwic2ltcGxlLWJ1cyI7Ci0KLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47Ci0JCSNzaXplLWNlbGxzID0gPDE+OwotCiAJCXJhbmdlcyA9IDwwIDAgMHhmZjgwMDAwMCAweDAwODAwMDAwCiAJCQkgIDEgMCAweDgwMDAwMDAwIDB4MDA4MDAwMDAKIAkJCSAgMyAwIDB4ODAwMDAwMDAgMHgwMDgwMDAwMD47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHJvbS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3Byb20uaAppbmRleCBhZTI2ZjJlLi5kNzI3NTc1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHJvbS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wcm9tLmgKQEAgLTQyLDcgKzQyLDcgQEAKIAogLyogVHJhbnNsYXRlIGEgRE1BIGFkZHJlc3MgZnJvbSBkZXZpY2Ugc3BhY2UgdG8gQ1BVIHNwYWNlICovCiBleHRlcm4gdTY0IG9mX3RyYW5zbGF0ZV9kbWFfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwKLQkJCQkgICAgY29uc3QgdTMyICppbl9hZGRyKTsKKwkJCQkgICAgY29uc3QgX19iZTMyICppbl9hZGRyKTsKIAogI2lmZGVmIENPTkZJR19QQ0kKIGV4dGVybiB1bnNpZ25lZCBsb25nIHBjaV9hZGRyZXNzX3RvX3BpbyhwaHlzX2FkZHJfdCBhZGRyZXNzKTsKQEAgLTYzLDkgKzYzLDYgQEAKIC8qIGNhY2hlIGxvb2t1cCAqLwogc3RydWN0IGRldmljZV9ub2RlICpvZl9maW5kX25leHRfY2FjaGVfbm9kZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKIAotLyogR2V0IHRoZSBNQUMgYWRkcmVzcyAqLwotZXh0ZXJuIGNvbnN0IHZvaWQgKm9mX2dldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKLQogI2lmZGVmIENPTkZJR19OVU1BCiBleHRlcm4gaW50IG9mX25vZGVfdG9fbmlkKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2aWNlKTsKICNlbHNlCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21fcGFyc2UuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9wYXJzZS5jCmluZGV4IDg4MzM0YWYuLmMyYjdhMDcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9wYXJzZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9wYXJzZS5jCkBAIC0xMTcsNDEgKzExNywzIEBACiAJY2VsbHMgPSBwcm9wID8gKih1MzIgKilwcm9wIDogb2Zfbl9zaXplX2NlbGxzKGRuKTsKIAkqc2l6ZSA9IG9mX3JlYWRfbnVtYmVyKGRtYV93aW5kb3csIGNlbGxzKTsKIH0KLQotLyoqCi0gKiBTZWFyY2ggdGhlIGRldmljZSB0cmVlIGZvciB0aGUgYmVzdCBNQUMgYWRkcmVzcyB0byB1c2UuICAnbWFjLWFkZHJlc3MnIGlzCi0gKiBjaGVja2VkIGZpcnN0LCBiZWNhdXNlIHRoYXQgaXMgc3VwcG9zZWQgdG8gY29udGFpbiB0byAibW9zdCByZWNlbnQiIE1BQwotICogYWRkcmVzcy4gSWYgdGhhdCBpc24ndCBzZXQsIHRoZW4gJ2xvY2FsLW1hYy1hZGRyZXNzJyBpcyBjaGVja2VkIG5leHQsCi0gKiBiZWNhdXNlIHRoYXQgaXMgdGhlIGRlZmF1bHQgYWRkcmVzcy4gIElmIHRoYXQgaXNuJ3Qgc2V0LCB0aGVuIHRoZSBvYnNvbGV0ZQotICogJ2FkZHJlc3MnIGlzIGNoZWNrZWQsIGp1c3QgaW4gY2FzZSB3ZSdyZSB1c2luZyBhbiBvbGQgZGV2aWNlIHRyZWUuCi0gKgotICogTm90ZSB0aGF0IHRoZSAnYWRkcmVzcycgcHJvcGVydHkgaXMgc3VwcG9zZWQgdG8gY29udGFpbiBhIHZpcnR1YWwgYWRkcmVzcyBvZgotICogdGhlIHJlZ2lzdGVyIHNldCwgYnV0IHNvbWUgRFRTIGZpbGVzIGhhdmUgcmVkZWZpbmVkIHRoYXQgcHJvcGVydHkgdG8gYmUgdGhlCi0gKiBNQUMgYWRkcmVzcy4KLSAqCi0gKiBBbGwtemVybyBNQUMgYWRkcmVzc2VzIGFyZSByZWplY3RlZCwgYmVjYXVzZSB0aG9zZSBjb3VsZCBiZSBwcm9wZXJ0aWVzIHRoYXQKLSAqIGV4aXN0IGluIHRoZSBkZXZpY2UgdHJlZSwgYnV0IHdlcmUgbm90IHNldCBieSBVLUJvb3QuICBGb3IgZXhhbXBsZSwgdGhlCi0gKiBEVFMgY291bGQgZGVmaW5lICdtYWMtYWRkcmVzcycgYW5kICdsb2NhbC1tYWMtYWRkcmVzcycsIHdpdGggemVybyBNQUMKLSAqIGFkZHJlc3Nlcy4gIFNvbWUgb2xkZXIgVS1Cb290cyBvbmx5IGluaXRpYWxpemVkICdsb2NhbC1tYWMtYWRkcmVzcycuICBJbgotICogdGhpcyBjYXNlLCB0aGUgcmVhbCBNQUMgaXMgaW4gJ2xvY2FsLW1hYy1hZGRyZXNzJywgYW5kICdtYWMtYWRkcmVzcycgZXhpc3RzCi0gKiBidXQgaXMgYWxsIHplcm9zLgotKi8KLWNvbnN0IHZvaWQgKm9mX2dldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQotewotCXN0cnVjdCBwcm9wZXJ0eSAqcHA7Ci0KLQlwcCA9IG9mX2ZpbmRfcHJvcGVydHkobnAsICJtYWMtYWRkcmVzcyIsIE5VTEwpOwotCWlmIChwcCAmJiAocHAtPmxlbmd0aCA9PSA2KSAmJiBpc192YWxpZF9ldGhlcl9hZGRyKHBwLT52YWx1ZSkpCi0JCXJldHVybiBwcC0+dmFsdWU7Ci0KLQlwcCA9IG9mX2ZpbmRfcHJvcGVydHkobnAsICJsb2NhbC1tYWMtYWRkcmVzcyIsIE5VTEwpOwotCWlmIChwcCAmJiAocHAtPmxlbmd0aCA9PSA2KSAmJiBpc192YWxpZF9ldGhlcl9hZGRyKHBwLT52YWx1ZSkpCi0JCXJldHVybiBwcC0+dmFsdWU7Ci0KLQlwcCA9IG9mX2ZpbmRfcHJvcGVydHkobnAsICJhZGRyZXNzIiwgTlVMTCk7Ci0JaWYgKHBwICYmIChwcC0+bGVuZ3RoID09IDYpICYmIGlzX3ZhbGlkX2V0aGVyX2FkZHIocHAtPnZhbHVlKSkKLQkJcmV0dXJuIHBwLT52YWx1ZTsKLQotCXJldHVybiBOVUxMOwotfQotRVhQT1JUX1NZTUJPTChvZl9nZXRfbWFjX2FkZHJlc3MpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80MHgvcHBjNDB4X3NpbXBsZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80MHgvcHBjNDB4X3NpbXBsZS5jCmluZGV4IDU0NmJiYzIuLjI1MjFkOTNlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQweC9wcGM0MHhfc2ltcGxlLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80MHgvcHBjNDB4X3NpbXBsZS5jCkBAIC01MCw3ICs1MCw3IEBACiAgKiBBZ2FpbiwgaWYgeW91ciBib2FyZCBuZWVkcyB0byBkbyB0aGluZ3MgZGlmZmVyZW50bHkgdGhlbiBjcmVhdGUgYQogICogYm9hcmQuYyBmaWxlIGZvciBpdCByYXRoZXIgdGhhbiBhZGRpbmcgaXQgdG8gdGhpcyBsaXN0LgogICovCi1zdGF0aWMgY2hhciAqYm9hcmRbXSBfX2luaXRkYXRhID0geworc3RhdGljIGNvbnN0IGNoYXIgKmJvYXJkW10gX19pbml0ZGF0YSA9IHsKIAkiYW1jYyxhY2FkaWEiLAogCSJhbWNjLGhhbGVha2FsYSIsCiAJImFtY2Msa2lsYXVlYSIsCkBAIC02MCwxNCArNjAsOSBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBwcGM0MHhfcHJvYmUodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIHJvb3QgPSBvZl9nZXRfZmxhdF9kdF9yb290KCk7Ci0JaW50IGkgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYm9hcmQpOyBpKyspIHsKLQkJaWYgKG9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShyb290LCBib2FyZFtpXSkpIHsKLQkJCXBwY19wY2lfc2V0X2ZsYWdzKFBQQ19QQ0lfUkVBU1NJR05fQUxMX1JTUkMpOwotCQkJcmV0dXJuIDE7Ci0JCX0KKwlpZiAob2ZfZmxhdF9kdF9tYXRjaChvZl9nZXRfZmxhdF9kdF9yb290KCksIGJvYXJkKSkgeworCQlwcGNfcGNpX3NldF9mbGFncyhQUENfUENJX1JFQVNTSUdOX0FMTF9SU1JDKTsKKwkJcmV0dXJuIDE7CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvbXBjNTEyMV9nZW5lcmljLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvbXBjNTEyMV9nZW5lcmljLmMKaW5kZXggZTQ4N2ViMC4uOTI2NzMxZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81MTJ4L21wYzUxMjFfZ2VuZXJpYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9tcGM1MTIxX2dlbmVyaWMuYwpAQCAtMjYsNyArMjYsNyBAQAogLyoKICAqIGxpc3Qgb2Ygc3VwcG9ydGVkIGJvYXJkcwogICovCi1zdGF0aWMgY2hhciAqYm9hcmRbXSBfX2luaXRkYXRhID0geworc3RhdGljIGNvbnN0IGNoYXIgKmJvYXJkW10gX19pbml0ZGF0YSA9IHsKIAkicHJ0LHBydGx2dCIsCiAJTlVMTAogfTsKQEAgLTM2LDE2ICszNiw3IEBACiAgKi8KIHN0YXRpYyBpbnQgX19pbml0IG1wYzUxMjFfZ2VuZXJpY19wcm9iZSh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgbm9kZSA9IG9mX2dldF9mbGF0X2R0X3Jvb3QoKTsKLQlpbnQgaSA9IDA7Ci0KLQl3aGlsZSAoYm9hcmRbaV0pIHsKLQkJaWYgKG9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShub2RlLCBib2FyZFtpXSkpCi0JCQlicmVhazsKLQkJaSsrOwotCX0KLQotCXJldHVybiBib2FyZFtpXSAhPSBOVUxMOworCXJldHVybiBvZl9mbGF0X2R0X21hdGNoKG9mX2dldF9mbGF0X2R0X3Jvb3QoKSwgYm9hcmQpOwogfQogCiBkZWZpbmVfbWFjaGluZShtcGM1MTIxX2dlbmVyaWMpIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9saXRlNTIwMC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L2xpdGU1MjAwLmMKaW5kZXggZGU1NWJjMC4uMDFmZmE2NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L2xpdGU1MjAwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L2xpdGU1MjAwLmMKQEAgLTE3MiwyMCArMTcyLDE4IEBACiAJbXBjNTJ4eF9zZXR1cF9wY2koKTsKIH0KIAorc3RhdGljIGNvbnN0IGNoYXIgKmJvYXJkW10gX19pbml0ZGF0YSA9IHsKKwkiZnNsLGxpdGU1MjAwIiwKKwkiZnNsLGxpdGU1MjAwYiIsCisJTlVMTCwKK307CisKIC8qCiAgKiBDYWxsZWQgdmVyeSBlYXJseSwgTU1VIGlzIG9mZiwgZGV2aWNlLXRyZWUgaXNuJ3QgdW5mbGF0dGVuZWQKICAqLwogc3RhdGljIGludCBfX2luaXQgbGl0ZTUyMDBfcHJvYmUodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIG5vZGUgPSBvZl9nZXRfZmxhdF9kdF9yb290KCk7Ci0JY29uc3QgY2hhciAqbW9kZWwgPSBvZl9nZXRfZmxhdF9kdF9wcm9wKG5vZGUsICJtb2RlbCIsIE5VTEwpOwotCi0JaWYgKCFvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUobm9kZSwgImZzbCxsaXRlNTIwMCIpICYmCi0JICAgICFvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUobm9kZSwgImZzbCxsaXRlNTIwMGIiKSkKLQkJcmV0dXJuIDA7Ci0JcHJfZGVidWcoIiVzIGJvYXJkIGZvdW5kXG4iLCBtb2RlbCA/IG1vZGVsIDogInVua25vd24iKTsKLQotCXJldHVybiAxOworCXJldHVybiBvZl9mbGF0X2R0X21hdGNoKG9mX2dldF9mbGF0X2R0X3Jvb3QoKSwgYm9hcmQpOwogfQogCiBkZWZpbmVfbWFjaGluZShsaXRlNTIwMCkgewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21lZGlhNTIwMC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21lZGlhNTIwMC5jCmluZGV4IDBiYWMzYTMuLjJjNzc4MGMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tZWRpYTUyMDAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbWVkaWE1MjAwLmMKQEAgLTIzOSw3ICsyMzksNyBAQAogfQogCiAvKiBsaXN0IG9mIHRoZSBzdXBwb3J0ZWQgYm9hcmRzICovCi1zdGF0aWMgY2hhciAqYm9hcmRbXSBfX2luaXRkYXRhID0geworc3RhdGljIGNvbnN0IGNoYXIgKmJvYXJkW10gX19pbml0ZGF0YSA9IHsKIAkiZnNsLG1lZGlhNTIwMCIsCiAJTlVMTAogfTsKQEAgLTI0OSwxNiArMjQ5LDcgQEAKICAqLwogc3RhdGljIGludCBfX2luaXQgbWVkaWE1MjAwX3Byb2JlKHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBub2RlID0gb2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpOwotCWludCBpID0gMDsKLQotCXdoaWxlIChib2FyZFtpXSkgewotCQlpZiAob2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKG5vZGUsIGJvYXJkW2ldKSkKLQkJCWJyZWFrOwotCQlpKys7Ci0JfQotCi0JcmV0dXJuIChib2FyZFtpXSAhPSBOVUxMKTsKKwlyZXR1cm4gb2ZfZmxhdF9kdF9tYXRjaChvZl9nZXRfZmxhdF9kdF9yb290KCksIGJvYXJkKTsKIH0KIAogZGVmaW5lX21hY2hpbmUobWVkaWE1MjAwX3BsYXRmb3JtKSB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTIwMF9zaW1wbGUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1MjAwX3NpbXBsZS5jCmluZGV4IGQ0NWJlNWIuLmUzNmQ2ZTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1MjAwX3NpbXBsZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1MjAwX3NpbXBsZS5jCkBAIC00OSw3ICs0OSw3IEBACiB9CiAKIC8qIGxpc3Qgb2YgdGhlIHN1cHBvcnRlZCBib2FyZHMgKi8KLXN0YXRpYyBjaGFyICpib2FyZFtdIF9faW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3QgY2hhciAqYm9hcmRbXSBfX2luaXRkYXRhID0gewogCSJpbnRlcmNvbnRyb2wsZGlnc3ktbXRjIiwKIAkibWFucm9sYW5kLG11Y21jNTIiLAogCSJtYW5yb2xhbmQsdWMxMDEiLApAQCAtNjYsMTYgKzY2LDcgQEAKICAqLwogc3RhdGljIGludCBfX2luaXQgbXBjNTIwMF9zaW1wbGVfcHJvYmUodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIG5vZGUgPSBvZl9nZXRfZmxhdF9kdF9yb290KCk7Ci0JaW50IGkgPSAwOwotCi0Jd2hpbGUgKGJvYXJkW2ldKSB7Ci0JCWlmIChvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUobm9kZSwgYm9hcmRbaV0pKQotCQkJYnJlYWs7Ci0JCWkrKzsKLQl9Ci0JCi0JcmV0dXJuIChib2FyZFtpXSAhPSBOVUxMKTsKKwlyZXR1cm4gb2ZfZmxhdF9kdF9tYXRjaChvZl9nZXRfZmxhdF9kdF9yb290KCksIGJvYXJkKTsKIH0KIAogZGVmaW5lX21hY2hpbmUobXBjNTIwMF9zaW1wbGVfcGxhdGZvcm0pIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzB4X3JkYi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMHhfcmRiLmMKaW5kZXggODQ2ODMxZC4uNjYxZDM1NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMHhfcmRiLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMHhfcmRiLmMKQEAgLTU3LDE2ICs1NywxOSBAQAogCWlwaWNfc2V0X2RlZmF1bHRfcHJpb3JpdHkoKTsKIH0KIAorc3RydWN0IGNvbnN0IGNoYXIgKmJvYXJkW10gX19pbml0ZGF0YSA9IHsKKwkiTVBDODMwOFJEQiIsCisJImZzbCxtcGM4MzA4cmRiIiwKKwkiZGVueCxtcGM4MzA4X3AxbSIsCisJTlVMTAorfQorCiAvKgogICogQ2FsbGVkIHZlcnkgZWFybHksIE1NVSBpcyBvZmYsIGRldmljZS10cmVlIGlzbid0IHVuZmxhdHRlbmVkCiAgKi8KIHN0YXRpYyBpbnQgX19pbml0IG1wYzgzMHhfcmRiX3Byb2JlKHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyByb290ID0gb2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpOwotCi0JcmV0dXJuIG9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShyb290LCAiTVBDODMwOFJEQiIpIHx8Ci0JICAgICAgIG9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShyb290LCAiZnNsLG1wYzgzMDhyZGIiKSB8fAotCSAgICAgICBvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUocm9vdCwgImRlbngsbXBjODMwOF9wMW0iKTsKKwlyZXR1cm4gb2ZfZmxhdF9kdF9tYXRjaChvZl9nZXRfZmxhdF9kdF9yb290KCksIGJvYXJkKTsKIH0KIAogc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgX19pbml0ZGF0YSBvZl9idXNfaWRzW10gPSB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMxeF9yZGIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzF4X3JkYi5jCmluZGV4IGFlNTI1ZTQuLmI1NGNkNzMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzF4X3JkYi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzF4X3JkYi5jCkBAIC02MCwxNSArNjAsMTggQEAKIAlpcGljX3NldF9kZWZhdWx0X3ByaW9yaXR5KCk7CiB9CiAKK3N0cnVjdCBjb25zdCBjaGFyICpib2FyZFtdIF9faW5pdGRhdGEgPSB7CisJIk1QQzgzMTNFUkRCIiwKKwkiZnNsLG1wYzgzMTVlcmRiIiwKKwlOVUxMCit9CisKIC8qCiAgKiBDYWxsZWQgdmVyeSBlYXJseSwgTU1VIGlzIG9mZiwgZGV2aWNlLXRyZWUgaXNuJ3QgdW5mbGF0dGVuZWQKICAqLwogc3RhdGljIGludCBfX2luaXQgbXBjODMxeF9yZGJfcHJvYmUodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIHJvb3QgPSBvZl9nZXRfZmxhdF9kdF9yb290KCk7Ci0KLQlyZXR1cm4gb2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJNUEM4MzEzRVJEQiIpIHx8Ci0JICAgICAgIG9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShyb290LCAiZnNsLG1wYzgzMTVlcmRiIik7CisJcmV0dXJuIG9mX2ZsYXRfZHRfbWF0Y2gob2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpLCBib2FyZCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIF9faW5pdGRhdGEgb2ZfYnVzX2lkc1tdID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzN3hfcmRiLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM3eF9yZGIuYwppbmRleCA5MTBjYWE2Li43YmFmYmYyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM3eF9yZGIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM3eF9yZGIuYwpAQCAtMTAxLDE3ICsxMDEsMjAgQEAKIAlpcGljX3NldF9kZWZhdWx0X3ByaW9yaXR5KCk7CiB9CiAKK3N0YXRpYyBjb25zdCBjaGFyICpib2FyZFtdIF9faW5pdGRhdGEgPSB7CisJImZzbCxtcGM4Mzc3cmRiIiwKKwkiZnNsLG1wYzgzNzhyZGIiLAorCSJmc2wsbXBjODM3OXJkYiIsCisJImZzbCxtcGM4Mzc3d2xhbiIsCisJTlVMTAorfTsKKwogLyoKICAqIENhbGxlZCB2ZXJ5IGVhcmx5LCBNTVUgaXMgb2ZmLCBkZXZpY2UtdHJlZSBpc24ndCB1bmZsYXR0ZW5lZAogICovCiBzdGF0aWMgaW50IF9faW5pdCBtcGM4Mzd4X3JkYl9wcm9iZSh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgcm9vdCA9IG9mX2dldF9mbGF0X2R0X3Jvb3QoKTsKLQotCXJldHVybiBvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUocm9vdCwgImZzbCxtcGM4Mzc3cmRiIikgfHwKLQkgICAgICAgb2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJmc2wsbXBjODM3OHJkYiIpIHx8Ci0JICAgICAgIG9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShyb290LCAiZnNsLG1wYzgzNzlyZGIiKSB8fAotCSAgICAgICBvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUocm9vdCwgImZzbCxtcGM4Mzc3d2xhbiIpOworCXJldHVybiBvZl9mbGF0X2R0X21hdGNoKG9mX2dldF9mbGF0X2R0X3Jvb3QoKSwgYm9hcmQpOwogfQogCiBkZWZpbmVfbWFjaGluZShtcGM4Mzd4X3JkYikgewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3RxbTg1eHguYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC90cW04NXh4LmMKaW5kZXggOGYyOWJiYy4uNWU4NDdkMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3RxbTg1eHguYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvdHFtODV4eC5jCkBAIC0xODYsMjEgKzE4NiwyMSBAQAogfQogbWFjaGluZV9kZXZpY2VfaW5pdGNhbGwodHFtODV4eCwgZGVjbGFyZV9vZl9wbGF0Zm9ybV9kZXZpY2VzKTsKIAorc3RhdGljIGNvbnN0IGNoYXIgKmJvYXJkW10gX19pbml0ZGF0YSA9IHsKKwkidHFjLHRxbTg1NDAiLAorCSJ0cWMsdHFtODU0MSIsCisJInRxYyx0cW04NTQ4IiwKKwkidHFjLHRxbTg1NTUiLAorCSJ0cWMsdHFtODU2MCIsCisJTlVMTAorfTsKKwogLyoKICAqIENhbGxlZCB2ZXJ5IGVhcmx5LCBkZXZpY2UtdHJlZSBpc24ndCB1bmZsYXR0ZW5lZAogICovCiBzdGF0aWMgaW50IF9faW5pdCB0cW04NXh4X3Byb2JlKHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyByb290ID0gb2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpOwotCi0JaWYgKChvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUocm9vdCwgInRxYyx0cW04NTQwIikpIHx8Ci0JICAgIChvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUocm9vdCwgInRxYyx0cW04NTQxIikpIHx8Ci0JICAgIChvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUocm9vdCwgInRxYyx0cW04NTQ4IikpIHx8Ci0JICAgIChvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUocm9vdCwgInRxYyx0cW04NTU1IikpIHx8Ci0JICAgIChvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUocm9vdCwgInRxYyx0cW04NTYwIikpKQotCQlyZXR1cm4gMTsKLQotCXJldHVybiAwOworCXJldHVybiBvZl9mbGF0X2R0X21hdGNoKG9mX2dldF9mbGF0X2R0X3Jvb3QoKSwgYm9hcmQpOwogfQogCiBkZWZpbmVfbWFjaGluZSh0cW04NXh4KSB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX3N5c2ZzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX3N5c2ZzLmMKaW5kZXggMTVlMTNiNS4uMjM5ODJjNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaF9zeXNmcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfc3lzZnMuYwpAQCAtMjUsNyArMjUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGFzbS9wcGMtcGNpLmg+CiAjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KLSNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CiAKIC8qKgogICogRUVIX1NIT1dfQVRUUiAtLSBjcmVhdGUgc3lzZnMgZW50cnkgZm9yIGVlaCBzdGF0aXN0aWMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXY2NHg2MF9kZXYuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXY2NHg2MF9kZXYuYwppbmRleCAxMzk4YmM0Li5mZWFlZTQwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L212NjR4NjBfZGV2LmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tdjY0eDYwX2Rldi5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvbXY2NDN4eC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfbmV0Lmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KIAogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3RzaTEwOF9kZXYuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvdHNpMTA4X2Rldi5jCmluZGV4IGQ0ZDE1YWEuLmMyZDY3NWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvdHNpMTA4X2Rldi5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvdHNpMTA4X2Rldi5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfbmV0Lmg+CiAjaW5jbHVkZSA8YXNtL3RzaTEwOC5oPgogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvYXV4aW9fMzIuYyBiL2FyY2gvc3BhcmMva2VybmVsL2F1eGlvXzMyLmMKaW5kZXggMzVmNDg4My4uODUwNWUwYSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvYXV4aW9fMzIuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9hdXhpb18zMi5jCkBAIC0xMjEsNyArMTIxLDcgQEAKIAlub2RlID0gcHJvbV9zZWFyY2hzaWJsaW5ncyhub2RlLCAib2JpbyIpOwogCW5vZGUgPSBwcm9tX2dldGNoaWxkKG5vZGUpOwogCW5vZGUgPSBwcm9tX3NlYXJjaHNpYmxpbmdzKG5vZGUsICJwb3dlciIpOwotCWlmIChub2RlID09IDAgfHwgbm9kZSA9PSAtMSkKKwlpZiAobm9kZSA9PSAwIHx8IChzMzIpbm9kZSA9PSAtMSkKIAkJcmV0dXJuOwogCiAJLyogTWFwIHRoZSBwb3dlciBjb250cm9sIHJlZ2lzdGVyLiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc3RhcmZpcmUuYyBiL2FyY2gvc3BhcmMva2VybmVsL3N0YXJmaXJlLmMKaW5kZXggYTQ0NDZjMC4uODIyODFhNSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc3RhcmZpcmUuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zdGFyZmlyZS5jCkBAIC0yNCw3ICsyNCw3IEBACiB2b2lkIGNoZWNrX2lmX3N0YXJmaXJlKHZvaWQpCiB7CiAJcGhhbmRsZSBzc25vZGUgPSBwcm9tX2ZpbmRkZXZpY2UoIi9zc3Atc2VyaWFsIik7Ci0JaWYgKHNzbm9kZSAhPSAwICYmIHNzbm9kZSAhPSAtMSkKKwlpZiAoc3Nub2RlICE9IDAgJiYgKHMzMilzc25vZGUgIT0gLTEpCiAJCXRoaXNfaXNfc3RhcmZpcmUgPSAxOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL3Byb20vaW5pdF8zMi5jIGIvYXJjaC9zcGFyYy9wcm9tL2luaXRfMzIuYwppbmRleCBkMzQyZGJhLi4wYTYwMWIzIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL3Byb20vaW5pdF8zMi5jCisrKyBiL2FyY2gvc3BhcmMvcHJvbS9pbml0XzMyLmMKQEAgLTYwLDcgKzYwLDcgQEAKIAlwcm9tX25vZGVvcHMgPSByb212ZWMtPnB2X25vZGVvcHM7CiAKIAlwcm9tX3Jvb3Rfbm9kZSA9IHByb21fZ2V0c2libGluZygwKTsKLQlpZigocHJvbV9yb290X25vZGUgPT0gMCkgfHwgKHByb21fcm9vdF9ub2RlID09IC0xKSkKKwlpZiAoKHByb21fcm9vdF9ub2RlID09IDApIHx8ICgoczMyKXByb21fcm9vdF9ub2RlID09IC0xKSkKIAkJcHJvbV9oYWx0KCk7CiAKIAlpZigoKCh1bnNpZ25lZCBsb25nKSBwcm9tX25vZGVvcHMpID09IDApIHx8IApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9wcm9tL2luaXRfNjQuYyBiL2FyY2gvc3BhcmMvcHJvbS9pbml0XzY0LmMKaW5kZXggOWM2YWM0Yi4uNTAxNmM1ZSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9wcm9tL2luaXRfNjQuYworKysgYi9hcmNoL3NwYXJjL3Byb20vaW5pdF82NC5jCkBAIC0zNSwxMyArMzUsMTMgQEAKIAlwcm9tX2NpZl9pbml0KGNpZl9oYW5kbGVyLCBjaWZfc3RhY2spOwogCiAJcHJvbV9jaG9zZW5fbm9kZSA9IHByb21fZmluZGRldmljZShwcm9tX2Nob3Nlbl9wYXRoKTsKLQlpZiAoIXByb21fY2hvc2VuX25vZGUgfHwgcHJvbV9jaG9zZW5fbm9kZSA9PSAtMSkKKwlpZiAoIXByb21fY2hvc2VuX25vZGUgfHwgKHMzMilwcm9tX2Nob3Nlbl9ub2RlID09IC0xKQogCQlwcm9tX2hhbHQoKTsKIAogCXByb21fc3Rkb3V0ID0gcHJvbV9nZXRpbnQocHJvbV9jaG9zZW5fbm9kZSwgInN0ZG91dCIpOwogCiAJbm9kZSA9IHByb21fZmluZGRldmljZSgiL29wZW5wcm9tIik7Ci0JaWYgKCFub2RlIHx8IG5vZGUgPT0gLTEpCisJaWYgKCFub2RlIHx8IChzMzIpbm9kZSA9PSAtMSkKIAkJcHJvbV9oYWx0KCk7CiAKIAlwcm9tX2dldHN0cmluZyhub2RlLCAidmVyc2lvbiIsIHByb21fdmVyc2lvbiwgc2l6ZW9mKHByb21fdmVyc2lvbikpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9wcm9tL3RyZWVfMzIuYyBiL2FyY2gvc3BhcmMvcHJvbS90cmVlXzMyLmMKaW5kZXggYmM4ZTRjYi4uZjMwZThkMCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9wcm9tL3RyZWVfMzIuYworKysgYi9hcmNoL3NwYXJjL3Byb20vdHJlZV8zMi5jCkBAIC00MCwxMSArNDAsMTEgQEAKIHsKIAlwaGFuZGxlIGNub2RlOwogCi0JaWYgKG5vZGUgPT0gLTEpCisJaWYgKChzMzIpbm9kZSA9PSAtMSkKIAkJcmV0dXJuIDA7CiAKIAljbm9kZSA9IF9fcHJvbV9nZXRjaGlsZChub2RlKTsKLQlpZiAoY25vZGUgPT0gMCB8fCBjbm9kZSA9PSAtMSkKKwlpZiAoY25vZGUgPT0gMCB8fCAoczMyKWNub2RlID09IC0xKQogCQlyZXR1cm4gMDsKIAogCXJldHVybiBjbm9kZTsKQEAgLTcyLDExICs3MiwxMSBAQAogewogCXBoYW5kbGUgc2libm9kZTsKIAotCWlmIChub2RlID09IC0xKQorCWlmICgoczMyKW5vZGUgPT0gLTEpCiAJCXJldHVybiAwOwogCiAJc2libm9kZSA9IF9fcHJvbV9nZXRzaWJsaW5nKG5vZGUpOwotCWlmIChzaWJub2RlID09IDAgfHwgc2libm9kZSA9PSAtMSkKKwlpZiAoc2libm9kZSA9PSAwIHx8IChzMzIpc2libm9kZSA9PSAtMSkKIAkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gc2libm9kZTsKQEAgLTIxOSw3ICsyMTksNyBAQAogICovCiBjaGFyICpwcm9tX25leHRwcm9wKHBoYW5kbGUgbm9kZSwgY2hhciAqb3Byb3AsIGNoYXIgKmJ1ZmZlcikKIHsKLQlpZiAobm9kZSA9PSAwIHx8IG5vZGUgPT0gLTEpCisJaWYgKG5vZGUgPT0gMCB8fCAoczMyKW5vZGUgPT0gLTEpCiAJCXJldHVybiAiIjsKIAogCXJldHVybiBfX3Byb21fbmV4dHByb3Aobm9kZSwgb3Byb3ApOwpAQCAtMjUzLDcgKzI1Myw3IEBACiAJCQkJaWYgKGQgIT0gcyArIDMgJiYgKCEqZCB8fCAqZCA9PSAnLycpCiAJCQkJICAgICYmIGQgPD0gcyArIDMgKyA4KSB7CiAJCQkJCW5vZGUyID0gbm9kZTsKLQkJCQkJd2hpbGUgKG5vZGUyICYmIG5vZGUyICE9IC0xKSB7CisJCQkJCXdoaWxlIChub2RlMiAmJiAoczMyKW5vZGUyICE9IC0xKSB7CiAJCQkJCQlpZiAocHJvbV9nZXRwcm9wZXJ0eSAobm9kZTIsICJyZWciLCAoY2hhciAqKXJlZywgc2l6ZW9mIChyZWcpKSA+IDApIHsKIAkJCQkJCQlpZiAod2hpY2hfaW8gPT0gcmVnWzBdLndoaWNoX2lvICYmIHBoeXNfYWRkciA9PSByZWdbMF0ucGh5c19hZGRyKSB7CiAJCQkJCQkJCW5vZGUgPSBub2RlMjsKQEAgLTI2MSw3ICsyNjEsNyBAQAogCQkJCQkJCX0KIAkJCQkJCX0KIAkJCQkJCW5vZGUyID0gcHJvbV9nZXRzaWJsaW5nKG5vZGUyKTsKLQkJCQkJCWlmICghbm9kZTIgfHwgbm9kZTIgPT0gLTEpCisJCQkJCQlpZiAoIW5vZGUyIHx8IChzMzIpbm9kZTIgPT0gLTEpCiAJCQkJCQkJYnJlYWs7CiAJCQkJCQlub2RlMiA9IHByb21fc2VhcmNoc2libGluZ3MocHJvbV9nZXRzaWJsaW5nKG5vZGUyKSwgbmJ1Zik7CiAJCQkJCX0KQEAgLTMwMyw2ICszMDMsNyBAQAogCW5vZGUgPSAoKnJvbXZlYy0+cHZfdjJkZXZvcHMudjJfaW5zdDJwa2cpKGluc3QpOwogCXJlc3RvcmVfY3VycmVudCgpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByb21fbG9jaywgZmxhZ3MpOwotCWlmIChub2RlID09IC0xKSByZXR1cm4gMDsKKwlpZiAoKHMzMilub2RlID09IC0xKQorCQlyZXR1cm4gMDsKIAlyZXR1cm4gbm9kZTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvcHJvbS90cmVlXzY0LmMgYi9hcmNoL3NwYXJjL3Byb20vdHJlZV82NC5jCmluZGV4IGQ5MzY2MDAuLjkyMjA0YzMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvcHJvbS90cmVlXzY0LmMKKysrIGIvYXJjaC9zcGFyYy9wcm9tL3RyZWVfNjQuYwpAQCAtNDMsMTAgKzQzLDEwIEBACiB7CiAJcGhhbmRsZSBjbm9kZTsKIAotCWlmIChub2RlID09IC0xKQorCWlmICgoczMyKW5vZGUgPT0gLTEpCiAJCXJldHVybiAwOwogCWNub2RlID0gX19wcm9tX2dldGNoaWxkKG5vZGUpOwotCWlmIChjbm9kZSA9PSAtMSkKKwlpZiAoKHMzMiljbm9kZSA9PSAtMSkKIAkJcmV0dXJuIDA7CiAJcmV0dXJuIGNub2RlOwogfQpAQCAtNTYsMTAgKzU2LDEwIEBACiB7CiAJcGhhbmRsZSBjbm9kZTsKIAotCWlmIChub2RlID09IC0xKQorCWlmICgoczMyKW5vZGUgPT0gLTEpCiAJCXJldHVybiAwOwogCWNub2RlID0gcHJvbV9ub2RlX3RvX25vZGUoInBhcmVudCIsIG5vZGUpOwotCWlmIChjbm9kZSA9PSAtMSkKKwlpZiAoKHMzMiljbm9kZSA9PSAtMSkKIAkJcmV0dXJuIDA7CiAJcmV0dXJuIGNub2RlOwogfQpAQCAtNzYsMTAgKzc2LDEwIEBACiB7CiAJcGhhbmRsZSBzaWJub2RlOwogCi0JaWYgKG5vZGUgPT0gLTEpCisJaWYgKChzMzIpbm9kZSA9PSAtMSkKIAkJcmV0dXJuIDA7CiAJc2libm9kZSA9IF9fcHJvbV9nZXRzaWJsaW5nKG5vZGUpOwotCWlmIChzaWJub2RlID09IC0xKQorCWlmICgoczMyKXNpYm5vZGUgPT0gLTEpCiAJCXJldHVybiAwOwogCiAJcmV0dXJuIHNpYm5vZGU7CkBAIC0yNDAsNyArMjQwLDcgQEAKIAl1bnNpZ25lZCBsb25nIGFyZ3NbN107CiAKIAkqYnVmZmVyID0gMDsKLQlpZiAobm9kZSA9PSAtMSkKKwlpZiAoKHMzMilub2RlID09IC0xKQogCQlyZXR1cm4gYnVmZmVyOwogCiAJYXJnc1swXSA9ICh1bnNpZ25lZCBsb25nKSBwcm9tX25leHRwcm9wX25hbWU7CkBAIC0yNjYsNyArMjY2LDcgQEAKIAl1bnNpZ25lZCBsb25nIGFyZ3NbN107CiAJY2hhciBidWZbMzJdOwogCi0JaWYgKG5vZGUgPT0gLTEpIHsKKwlpZiAoKHMzMilub2RlID09IC0xKSB7CiAJCSpidWZmZXIgPSAwOwogCQlyZXR1cm4gYnVmZmVyOwogCX0KQEAgLTM2OSw3ICszNjksNyBAQAogCXAxMjc1X2NtZF9kaXJlY3QoYXJncyk7CiAKIAlub2RlID0gKGludCkgYXJnc1s0XTsKLQlpZiAobm9kZSA9PSAtMSkKKwlpZiAoKHMzMilub2RlID09IC0xKQogCQlyZXR1cm4gMDsKIAlyZXR1cm4gbm9kZTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2h5cGVydmlzb3IuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2h5cGVydmlzb3IuaAppbmRleCBmZjI1NDZjLi43YTE1MTUzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9oeXBlcnZpc29yLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaHlwZXJ2aXNvci5oCkBAIC0yMCw2ICsyMCw5IEBACiAjaWZuZGVmIF9BU01fWDg2X0hZUEVSVklTT1JfSAogI2RlZmluZSBfQVNNX1g4Nl9IWVBFUlZJU09SX0gKIAorI2luY2x1ZGUgPGFzbS9rdm1fcGFyYS5oPgorI2luY2x1ZGUgPGFzbS94ZW4vaHlwZXJ2aXNvci5oPgorCiBleHRlcm4gdm9pZCBpbml0X2h5cGVydmlzb3Ioc3RydWN0IGNwdWluZm9feDg2ICpjKTsKIGV4dGVybiB2b2lkIGluaXRfaHlwZXJ2aXNvcl9wbGF0Zm9ybSh2b2lkKTsKIApAQCAtNDcsNCArNTAsMTMgQEAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgaHlwZXJ2aXNvcl94ODYgeDg2X2h5cGVyX21zX2h5cGVydjsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgaHlwZXJ2aXNvcl94ODYgeDg2X2h5cGVyX3hlbl9odm07CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBoeXBlcnZpc29yX3gyYXBpY19hdmFpbGFibGUodm9pZCkKK3sKKwlpZiAoa3ZtX3BhcmFfYXZhaWxhYmxlKCkpCisJCXJldHVybiB0cnVlOworCWlmICh4ZW5feDJhcGljX3BhcmFfYXZhaWxhYmxlKCkpCisJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS94ZW4vaHlwZXJ2aXNvci5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20veGVuL2h5cGVydmlzb3IuaAppbmRleCAzOTZmZjRjLi42NmQwZmZmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS94ZW4vaHlwZXJ2aXNvci5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3hlbi9oeXBlcnZpc29yLmgKQEAgLTM3LDQgKzM3LDM5IEBACiBleHRlcm4gc3RydWN0IHNoYXJlZF9pbmZvICpIWVBFUlZJU09SX3NoYXJlZF9pbmZvOwogZXh0ZXJuIHN0cnVjdCBzdGFydF9pbmZvICp4ZW5fc3RhcnRfaW5mbzsKIAorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworc3RhdGljIGlubGluZSB1aW50MzJfdCB4ZW5fY3B1aWRfYmFzZSh2b2lkKQoreworCXVpbnQzMl90IGJhc2UsIGVheCwgZWJ4LCBlY3gsIGVkeDsKKwljaGFyIHNpZ25hdHVyZVsxM107CisKKwlmb3IgKGJhc2UgPSAweDQwMDAwMDAwOyBiYXNlIDwgMHg0MDAxMDAwMDsgYmFzZSArPSAweDEwMCkgeworCQljcHVpZChiYXNlLCAmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4KTsKKwkJKih1aW50MzJfdCAqKShzaWduYXR1cmUgKyAwKSA9IGVieDsKKwkJKih1aW50MzJfdCAqKShzaWduYXR1cmUgKyA0KSA9IGVjeDsKKwkJKih1aW50MzJfdCAqKShzaWduYXR1cmUgKyA4KSA9IGVkeDsKKwkJc2lnbmF0dXJlWzEyXSA9IDA7CisKKwkJaWYgKCFzdHJjbXAoIlhlblZNTVhlblZNTSIsIHNpZ25hdHVyZSkgJiYgKChlYXggLSBiYXNlKSA+PSAyKSkKKwkJCXJldHVybiBiYXNlOworCX0KKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1hFTgorZXh0ZXJuIGJvb2wgeGVuX2h2bV9uZWVkX2xhcGljKHZvaWQpOworCitzdGF0aWMgaW5saW5lIGJvb2wgeGVuX3gyYXBpY19wYXJhX2F2YWlsYWJsZSh2b2lkKQoreworCXJldHVybiB4ZW5faHZtX25lZWRfbGFwaWMoKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGJvb2wgeGVuX3gyYXBpY19wYXJhX2F2YWlsYWJsZSh2b2lkKQoreworCXJldHVybiAoeGVuX2NwdWlkX2Jhc2UoKSAhPSAwKTsKK30KKyNlbmRpZgorCiAjZW5kaWYgLyogX0FTTV9YODZfWEVOX0hZUEVSVklTT1JfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpYy5jIGIvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpYy5jCmluZGV4IDc5ZTZiYWEuLmE1MTM0NWIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWMuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljLmMKQEAgLTQ5LDggKzQ5LDggQEAKICNpbmNsdWRlIDxhc20vbXRyci5oPgogI2luY2x1ZGUgPGFzbS9zbXAuaD4KICNpbmNsdWRlIDxhc20vbWNlLmg+Ci0jaW5jbHVkZSA8YXNtL2t2bV9wYXJhLmg+CiAjaW5jbHVkZSA8YXNtL3RzYy5oPgorI2luY2x1ZGUgPGFzbS9oeXBlcnZpc29yLmg+CiAKIHVuc2lnbmVkIGludCBudW1fcHJvY2Vzc29yczsKIApAQCAtMTQ3Niw3ICsxNDc2LDggQEAKIAkJLyogSVIgaXMgcmVxdWlyZWQgaWYgdGhlcmUgaXMgQVBJQyBJRCA+IDI1NSBldmVuIHdoZW4gcnVubmluZwogCQkgKiB1bmRlciBLVk0KIAkJICovCi0JCWlmIChtYXhfcGh5c2ljYWxfYXBpY2lkID4gMjU1IHx8ICFrdm1fcGFyYV9hdmFpbGFibGUoKSkKKwkJaWYgKG1heF9waHlzaWNhbF9hcGljaWQgPiAyNTUgfHwKKwkJICAgICFoeXBlcnZpc29yX3gyYXBpY19hdmFpbGFibGUoKSkKIAkJCWdvdG8gbm94MmFwaWM7CiAJCS8qCiAJCSAqIHdpdGhvdXQgSVIgYWxsIENQVXMgY2FuIGJlIGFkZHJlc3NlZCBieSBJT0FQSUMvTVNJCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vZW5saWdodGVuLmMgYi9hcmNoL3g4Ni94ZW4vZW5saWdodGVuLmMKaW5kZXggYWE4Yzg5YS4uN2U4ZDNiYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL2VubGlnaHRlbi5jCisrKyBiL2FyY2gveDg2L3hlbi9lbmxpZ2h0ZW4uYwpAQCAtMTE3NCw2ICsxMTc0LDE1IEBACiAKIAl4ZW5fc21wX2luaXQoKTsKIAorI2lmZGVmIENPTkZJR19BQ1BJX05VTUEKKwkvKgorCSAqIFRoZSBwYWdlcyB3ZSBmcm9tIFhlbiBhcmUgbm90IHJlbGF0ZWQgdG8gbWFjaGluZSBwYWdlcywgc28KKwkgKiBhbnkgTlVNQSBpbmZvcm1hdGlvbiB0aGUga2VybmVsIHRyaWVzIHRvIGdldCBmcm9tIEFDUEkgd2lsbAorCSAqIGJlIG1lYW5pbmdsZXNzLiAgUHJldmVudCBpdCBmcm9tIHRyeWluZy4KKwkgKi8KKwlhY3BpX251bWEgPSAtMTsKKyNlbmRpZgorCiAJcGdkID0gKHBnZF90ICopeGVuX3N0YXJ0X2luZm8tPnB0X2Jhc2U7CiAKIAlpZiAoIXhlbl9pbml0aWFsX2RvbWFpbigpKQpAQCAtMTI1NiwyNSArMTI2NSw2IEBACiAjZW5kaWYKIH0KIAotc3RhdGljIHVpbnQzMl90IHhlbl9jcHVpZF9iYXNlKHZvaWQpCi17Ci0JdWludDMyX3QgYmFzZSwgZWF4LCBlYngsIGVjeCwgZWR4OwotCWNoYXIgc2lnbmF0dXJlWzEzXTsKLQotCWZvciAoYmFzZSA9IDB4NDAwMDAwMDA7IGJhc2UgPCAweDQwMDEwMDAwOyBiYXNlICs9IDB4MTAwKSB7Ci0JCWNwdWlkKGJhc2UsICZlYXgsICZlYngsICZlY3gsICZlZHgpOwotCQkqKHVpbnQzMl90ICopKHNpZ25hdHVyZSArIDApID0gZWJ4OwotCQkqKHVpbnQzMl90ICopKHNpZ25hdHVyZSArIDQpID0gZWN4OwotCQkqKHVpbnQzMl90ICopKHNpZ25hdHVyZSArIDgpID0gZWR4OwotCQlzaWduYXR1cmVbMTJdID0gMDsKLQotCQlpZiAoIXN0cmNtcCgiWGVuVk1NWGVuVk1NIiwgc2lnbmF0dXJlKSAmJiAoKGVheCAtIGJhc2UpID49IDIpKQotCQkJcmV0dXJuIGJhc2U7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgaW5pdF9odm1fcHZfaW5mbyhpbnQgKm1ham9yLCBpbnQgKm1pbm9yKQogewogCXVpbnQzMl90IGVheCwgZWJ4LCBlY3gsIGVkeCwgcGFnZXMsIG1zciwgYmFzZTsKQEAgLTEzODQsNiArMTM3NCwxOCBAQAogCXJldHVybiB0cnVlOwogfQogCitib29sIHhlbl9odm1fbmVlZF9sYXBpYyh2b2lkKQoreworCWlmICh4ZW5fcHZfZG9tYWluKCkpCisJCXJldHVybiBmYWxzZTsKKwlpZiAoIXhlbl9odm1fZG9tYWluKCkpCisJCXJldHVybiBmYWxzZTsKKwlpZiAoeGVuX2ZlYXR1cmUoWEVORkVBVF9odm1fcGlycXMpICYmIHhlbl9oYXZlX3ZlY3Rvcl9jYWxsYmFjaykKKwkJcmV0dXJuIGZhbHNlOworCXJldHVybiB0cnVlOworfQorRVhQT1JUX1NZTUJPTF9HUEwoeGVuX2h2bV9uZWVkX2xhcGljKTsKKwogY29uc3QgX19yZWZjb25zdCBzdHJ1Y3QgaHlwZXJ2aXNvcl94ODYgeDg2X2h5cGVyX3hlbl9odm0gPSB7CiAJLm5hbWUJCQk9ICJYZW4gSFZNIiwKIAkuZGV0ZWN0CQkJPSB4ZW5faHZtX3BsYXRmb3JtLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvS2NvbmZpZyBiL2RyaXZlcnMvYXRhL0tjb25maWcKaW5kZXggMzZlMjMxOS4uYzZiMjk4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvS2NvbmZpZworKysgYi9kcml2ZXJzL2F0YS9LY29uZmlnCkBAIC0yLDYgKzIsMTQgQEAKICMgU0FUQS9QQVRBIGRyaXZlciBjb25maWd1cmF0aW9uCiAjCiAKK2NvbmZpZyBIQVZFX1BBVEFfUExBVEZPUk0KKwlib29sCisJaGVscAorCSAgVGhpcyBpcyBhbiBpbnRlcm5hbCBjb25maWd1cmF0aW9uIG5vZGUgZm9yIGFueSBtYWNoaW5lIHRoYXQKKwkgIHVzZXMgcGF0YS1wbGF0Zm9ybSBkcml2ZXIgdG8gZW5hYmxlIHRoZSByZWxldmFudCBkcml2ZXIgaW4gdGhlCisJICBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSB3aXRob3V0IGhhdmluZyB0byBzdWJtaXQgZW5kbGVzcyBwYXRjaGVzCisJICB0byB1cGRhdGUgdGhlIFBBVEFfUExBVEZPUk0gZW50cnkuCisKIG1lbnVjb25maWcgQVRBCiAJdHJpc3RhdGUgIlNlcmlhbCBBVEEgYW5kIFBhcmFsbGVsIEFUQSBkcml2ZXJzIgogCWRlcGVuZHMgb24gSEFTX0lPTUVNCkBAIC05MCw2ICs5OCwxNCBAQAogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgSW5pdGlvIDE2MnggU2VyaWFsIEFUQS4KIAorY29uZmlnIFNBVEFfQUNBUkRfQUhDSQorCXRyaXN0YXRlICJBQ2FyZCBBSENJIHZhcmlhbnQgKEFUUCA4NjIwKSIKKwlkZXBlbmRzIG9uIFBDSQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgQWNhcmQuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKIGNvbmZpZyBTQVRBX1NJTDI0CiAJdHJpc3RhdGUgIlNpbGljb24gSW1hZ2UgMzEyNC8zMTMyIFNBVEEgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBDSQpAQCAtNDAwLDExICs0MTYsMTEgQEAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKIGNvbmZpZyBQQVRBX0hQVDNYMk4KLQl0cmlzdGF0ZSAiSFBUIDM3Mk4vMzAyTiBQQVRBIHN1cHBvcnQiCisJdHJpc3RhdGUgIkhQVCAzNzFOLzM3Mk4vMzAyTiBQQVRBIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBQQ0kKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBOIHZhcmlhbnQgSFBUIFBBVEEKLQkgIGNvbnRyb2xsZXJzIHZpYSB0aGUgbmV3IEFUQSBsYXllcgorCSAgY29udHJvbGxlcnMgdmlhIHRoZSBuZXcgQVRBIGxheWVyLgogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCkBAIC03NjUsMTQgKzc4MSw2IEBACiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKLWNvbmZpZyBIQVZFX1BBVEFfUExBVEZPUk0KLQlib29sCi0JaGVscAotCSAgVGhpcyBpcyBhbiBpbnRlcm5hbCBjb25maWd1cmF0aW9uIG5vZGUgZm9yIGFueSBtYWNoaW5lIHRoYXQKLQkgIHVzZXMgcGF0YS1wbGF0Zm9ybSBkcml2ZXIgdG8gZW5hYmxlIHRoZSByZWxldmFudCBkcml2ZXIgaW4gdGhlCi0JICBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSB3aXRob3V0IGhhdmluZyB0byBzdWJtaXQgZW5kbGVzcyBwYXRjaGVzCi0JICB0byB1cGRhdGUgdGhlIFBBVEFfUExBVEZPUk0gZW50cnkuCi0KIGNvbmZpZyBQQVRBX1BMQVRGT1JNCiAJdHJpc3RhdGUgIkdlbmVyaWMgcGxhdGZvcm0gZGV2aWNlIFBBVEEgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEVNQkVEREVEIHx8IFBQQyB8fCBIQVZFX1BBVEFfUExBVEZPUk0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL01ha2VmaWxlIGIvZHJpdmVycy9hdGEvTWFrZWZpbGUKaW5kZXggMmI2N2M5MC4uMjcyOTFhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9hdGEvTWFrZWZpbGUKQEAgLTMsNiArMyw3IEBACiAKICMgbm9uLVNGRiBpbnRlcmZhY2UKIG9iai0kKENPTkZJR19TQVRBX0FIQ0kpCQkrPSBhaGNpLm8gbGliYWhjaS5vCitvYmotJChDT05GSUdfU0FUQV9BQ0FSRF9BSENJKQkrPSBhY2FyZC1haGNpLm8gbGliYWhjaS5vCiBvYmotJChDT05GSUdfU0FUQV9BSENJX1BMQVRGT1JNKSArPSBhaGNpX3BsYXRmb3JtLm8gbGliYWhjaS5vCiBvYmotJChDT05GSUdfU0FUQV9GU0wpCQkrPSBzYXRhX2ZzbC5vCiBvYmotJChDT05GSUdfU0FUQV9JTklDMTYyWCkJKz0gc2F0YV9pbmljMTYyeC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9hY2FyZC1haGNpLmMgYi9kcml2ZXJzL2F0YS9hY2FyZC1haGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM5YzIxMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYXRhL2FjYXJkLWFoY2kuYwpAQCAtMCwwICsxLDUyOCBAQAorCisvKgorICogIGFjYXJkLWFoY2kuYyAtIEFDYXJkIEFIQ0kgU0FUQSBzdXBwb3J0CisgKgorICogIE1haW50YWluZWQgYnk6ICBKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+CisgKgkJICAgIFBsZWFzZSBBTFdBWVMgY29weSBsaW51eC1pZGVAdmdlci5rZXJuZWwub3JnCisgKgkJICAgIG9uIGVtYWlscy4KKyAqCisgKiAgQ29weXJpZ2h0IDIwMTAgUmVkIEhhdCwgSW5jLgorICoKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICoKKyAqIGxpYmF0YSBkb2N1bWVudGF0aW9uIGlzIGF2YWlsYWJsZSB2aWEgJ21ha2Uge3BzfHBkZn1kb2NzJywKKyAqIGFzIERvY3VtZW50YXRpb24vRG9jQm9vay9saWJhdGEuKgorICoKKyAqIEFIQ0kgaGFyZHdhcmUgZG9jdW1lbnRhdGlvbjoKKyAqIGh0dHA6Ly93d3cuaW50ZWwuY29tL3RlY2hub2xvZ3kvc2VyaWFsYXRhL3BkZi9yZXYxXzAucGRmCisgKiBodHRwOi8vd3d3LmludGVsLmNvbS90ZWNobm9sb2d5L3NlcmlhbGF0YS9wZGYvcmV2MV8xLnBkZgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWkuaD4KKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CisjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CisjaW5jbHVkZSAiYWhjaS5oIgorCisjZGVmaW5lIERSVl9OQU1FCSJhY2FyZC1haGNpIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMS4wIgorCisvKgorICBSZWNlaXZlZCBGSVMgc3RydWN0dXJlIGxpbWl0ZWQgdG8gODBoLgorKi8KKworI2RlZmluZSBBQ0FSRF9BSENJX1JYX0ZJU19TWiAxMjgKKworZW51bSB7CisJQUhDSV9QQ0lfQkFSCQk9IDUsCit9OworCitlbnVtIGJvYXJkX2lkcyB7CisJYm9hcmRfYWNhcmRfYWhjaSwKK307CisKK3N0cnVjdCBhY2FyZF9zZyB7CisJX19sZTMyCQkJYWRkcjsKKwlfX2xlMzIJCQlhZGRyX2hpOworCV9fbGUzMgkJCXJlc2VydmVkOworCV9fbGUzMgkJCXNpemU7CSAvKiBiaXQgMzEgKEVPVCkgbWF4PT0weDEwMDAwICg2NGspICovCit9OworCitzdGF0aWMgdm9pZCBhY2FyZF9haGNpX3FjX3ByZXAoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CitzdGF0aWMgYm9vbCBhY2FyZF9haGNpX3FjX2ZpbGxfcnRmKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOworc3RhdGljIGludCBhY2FyZF9haGNpX3BvcnRfc3RhcnQoc3RydWN0IGF0YV9wb3J0ICphcCk7CitzdGF0aWMgaW50IGFjYXJkX2FoY2lfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOworCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGFjYXJkX2FoY2lfcGNpX2RldmljZV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3QgbWVzZyk7CitzdGF0aWMgaW50IGFjYXJkX2FoY2lfcGNpX2RldmljZV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpOworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGFjYXJkX2FoY2lfc2h0ID0geworCUFIQ0lfU0hUKCJhY2FyZC1haGNpIiksCit9OworCitzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgYWNhcmRfb3BzID0geworCS5pbmhlcml0cwkJPSAmYWhjaV9vcHMsCisJLnFjX3ByZXAJCT0gYWNhcmRfYWhjaV9xY19wcmVwLAorCS5xY19maWxsX3J0ZgkJPSBhY2FyZF9haGNpX3FjX2ZpbGxfcnRmLAorCS5wb3J0X3N0YXJ0ICAgICAgICAgICAgID0gYWNhcmRfYWhjaV9wb3J0X3N0YXJ0LAorfTsKKworI2RlZmluZSBBSENJX0hGTEFHUyhmbGFncykJLnByaXZhdGVfZGF0YQk9ICh2b2lkICopKGZsYWdzKQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gYWNhcmRfYWhjaV9wb3J0X2luZm9bXSA9IHsKKwlbYm9hcmRfYWNhcmRfYWhjaV0gPQorCXsKKwkJQUhDSV9IRkxBR1MJKEFIQ0lfSEZMQUdfTk9fTkNRKSwKKwkJLmZsYWdzCQk9IEFIQ0lfRkxBR19DT01NT04sCisJCS5waW9fbWFzawk9IEFUQV9QSU80LAorCQkudWRtYV9tYXNrCT0gQVRBX1VETUE2LAorCQkucG9ydF9vcHMJPSAmYWNhcmRfb3BzLAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgYWNhcmRfYWhjaV9wY2lfdGJsW10gPSB7CisJLyogQUNhcmQgKi8KKwl7IFBDSV9WREVWSUNFKEFSVE9QLCAweDAwMGQpLCBib2FyZF9hY2FyZF9haGNpIH0sIC8qIEFUUDg2MjAgKi8KKworCXsgfSAgICAvKiB0ZXJtaW5hdGUgbGlzdCAqLworfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGFjYXJkX2FoY2lfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJCT0gRFJWX05BTUUsCisJLmlkX3RhYmxlCQk9IGFjYXJkX2FoY2lfcGNpX3RibCwKKwkucHJvYmUJCQk9IGFjYXJkX2FoY2lfaW5pdF9vbmUsCisJLnJlbW92ZQkJCT0gYXRhX3BjaV9yZW1vdmVfb25lLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kCQk9IGFjYXJkX2FoY2lfcGNpX2RldmljZV9zdXNwZW5kLAorCS5yZXN1bWUJCQk9IGFjYXJkX2FoY2lfcGNpX2RldmljZV9yZXN1bWUsCisjZW5kaWYKK307CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgYWNhcmRfYWhjaV9wY2lfZGV2aWNlX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBtZXNnKQoreworCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKKwlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gaG9zdC0+cHJpdmF0ZV9kYXRhOworCXZvaWQgX19pb21lbSAqbW1pbyA9IGhwcml2LT5tbWlvOworCXUzMiBjdGw7CisKKwlpZiAobWVzZy5ldmVudCAmIFBNX0VWRU5UX1NVU1BFTkQgJiYKKwkgICAgaHByaXYtPmZsYWdzICYgQUhDSV9IRkxBR19OT19TVVNQRU5EKSB7CisJCWRldl9wcmludGsoS0VSTl9FUlIsICZwZGV2LT5kZXYsCisJCQkgICAiQklPUyB1cGRhdGUgcmVxdWlyZWQgZm9yIHN1c3BlbmQvcmVzdW1lXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKG1lc2cuZXZlbnQgJiBQTV9FVkVOVF9TTEVFUCkgeworCQkvKiBBSENJIHNwZWMgcmV2MS4xIHNlY3Rpb24gOC4zLjM6CisJCSAqIFNvZnR3YXJlIG11c3QgZGlzYWJsZSBpbnRlcnJ1cHRzIHByaW9yIHRvIHJlcXVlc3RpbmcgYQorCQkgKiB0cmFuc2l0aW9uIG9mIHRoZSBIQkEgdG8gRDMgc3RhdGUuCisJCSAqLworCQljdGwgPSByZWFkbChtbWlvICsgSE9TVF9DVEwpOworCQljdGwgJj0gfkhPU1RfSVJRX0VOOworCQl3cml0ZWwoY3RsLCBtbWlvICsgSE9TVF9DVEwpOworCQlyZWFkbChtbWlvICsgSE9TVF9DVEwpOyAvKiBmbHVzaCAqLworCX0KKworCXJldHVybiBhdGFfcGNpX2RldmljZV9zdXNwZW5kKHBkZXYsIG1lc2cpOworfQorCitzdGF0aWMgaW50IGFjYXJkX2FoY2lfcGNpX2RldmljZV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGF0YV9ob3N0ICpob3N0ID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOworCWludCByYzsKKworCXJjID0gYXRhX3BjaV9kZXZpY2VfZG9fcmVzdW1lKHBkZXYpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJaWYgKHBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCA9PSBQTV9FVkVOVF9TVVNQRU5EKSB7CisJCXJjID0gYWhjaV9yZXNldF9jb250cm9sbGVyKGhvc3QpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisKKwkJYWhjaV9pbml0X2NvbnRyb2xsZXIoaG9zdCk7CisJfQorCisJYXRhX2hvc3RfcmVzdW1lKGhvc3QpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBhY2FyZF9haGNpX2NvbmZpZ3VyZV9kbWFfbWFza3Moc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCB1c2luZ19kYWMpCit7CisJaW50IHJjOworCisJaWYgKHVzaW5nX2RhYyAmJgorCSAgICAhcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soNjQpKSkgeworCQlyYyA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soNjQpKTsKKwkJaWYgKHJjKSB7CisJCQlyYyA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKKwkJCWlmIChyYykgeworCQkJCWRldl9wcmludGsoS0VSTl9FUlIsICZwZGV2LT5kZXYsCisJCQkJCSAgICI2NC1iaXQgRE1BIGVuYWJsZSBmYWlsZWRcbiIpOworCQkJCXJldHVybiByYzsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKKwkJaWYgKHJjKSB7CisJCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmcGRldi0+ZGV2LAorCQkJCSAgICIzMi1iaXQgRE1BIGVuYWJsZSBmYWlsZWRcbiIpOworCQkJcmV0dXJuIHJjOworCQl9CisJCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOworCQlpZiAocmMpIHsKKwkJCWRldl9wcmludGsoS0VSTl9FUlIsICZwZGV2LT5kZXYsCisJCQkJICAgIjMyLWJpdCBjb25zaXN0ZW50IERNQSBlbmFibGUgZmFpbGVkXG4iKTsKKwkJCXJldHVybiByYzsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYWNhcmRfYWhjaV9wY2lfcHJpbnRfaW5mbyhzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGhvc3QtPmRldik7CisJdTE2IGNjOworCWNvbnN0IGNoYXIgKnNjY19zOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgMHgwYSwgJmNjKTsKKwlpZiAoY2MgPT0gUENJX0NMQVNTX1NUT1JBR0VfSURFKQorCQlzY2NfcyA9ICJJREUiOworCWVsc2UgaWYgKGNjID09IFBDSV9DTEFTU19TVE9SQUdFX1NBVEEpCisJCXNjY19zID0gIlNBVEEiOworCWVsc2UgaWYgKGNjID09IFBDSV9DTEFTU19TVE9SQUdFX1JBSUQpCisJCXNjY19zID0gIlJBSUQiOworCWVsc2UKKwkJc2NjX3MgPSAidW5rbm93biI7CisKKwlhaGNpX3ByaW50X2luZm8oaG9zdCwgc2NjX3MpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGFjYXJkX2FoY2lfZmlsbF9zZyhzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjLCB2b2lkICpjbWRfdGJsKQoreworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJc3RydWN0IGFjYXJkX3NnICphY2FyZF9zZyA9IGNtZF90YmwgKyBBSENJX0NNRF9UQkxfSERSX1NaOworCXVuc2lnbmVkIGludCBzaSwgbGFzdF9zaSA9IDA7CisKKwlWUFJJTlRLKCJFTlRFUlxuIik7CisKKwkvKgorCSAqIE5leHQsIHRoZSBTL0cgbGlzdC4KKwkgKi8KKwlmb3JfZWFjaF9zZyhxYy0+c2csIHNnLCBxYy0+bl9lbGVtLCBzaSkgeworCQlkbWFfYWRkcl90IGFkZHIgPSBzZ19kbWFfYWRkcmVzcyhzZyk7CisJCXUzMiBzZ19sZW4gPSBzZ19kbWFfbGVuKHNnKTsKKworCQkvKgorCQkgKiBBQ2FyZCBub3RlOgorCQkgKiBXZSBtdXN0IHNldCBhbiBlbmQtb2YtdGFibGUgKEVPVCkgYml0LAorCQkgKiBhbmQgdGhlIHNlZ21lbnQgY2Fubm90IGV4Y2VlZCA2NGsgKDB4MTAwMDApCisJCSAqLworCQlhY2FyZF9zZ1tzaV0uYWRkciA9IGNwdV90b19sZTMyKGFkZHIgJiAweGZmZmZmZmZmKTsKKwkJYWNhcmRfc2dbc2ldLmFkZHJfaGkgPSBjcHVfdG9fbGUzMigoYWRkciA+PiAxNikgPj4gMTYpOworCQlhY2FyZF9zZ1tzaV0uc2l6ZSA9IGNwdV90b19sZTMyKHNnX2xlbik7CisJCWxhc3Rfc2kgPSBzaTsKKwl9CisKKwlhY2FyZF9zZ1tsYXN0X3NpXS5zaXplIHw9IGNwdV90b19sZTMyKDEgPDwgMzEpOwkvKiBzZXQgRU9UICovCisKKwlyZXR1cm4gc2k7Cit9CisKK3N0YXRpYyB2b2lkIGFjYXJkX2FoY2lfcWNfcHJlcChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBxYy0+YXA7CisJc3RydWN0IGFoY2lfcG9ydF9wcml2ICpwcCA9IGFwLT5wcml2YXRlX2RhdGE7CisJaW50IGlzX2F0YXBpID0gYXRhX2lzX2F0YXBpKHFjLT50Zi5wcm90b2NvbCk7CisJdm9pZCAqY21kX3RibDsKKwl1MzIgb3B0czsKKwljb25zdCB1MzIgY21kX2Zpc19sZW4gPSA1OyAvKiBmaXZlIGR3b3JkcyAqLworCXVuc2lnbmVkIGludCBuX2VsZW07CisKKwkvKgorCSAqIEZpbGwgaW4gY29tbWFuZCB0YWJsZSBpbmZvcm1hdGlvbi4gIEZpcnN0LCB0aGUgaGVhZGVyLAorCSAqIGEgU0FUQSBSZWdpc3RlciAtIEhvc3QgdG8gRGV2aWNlIGNvbW1hbmQgRklTLgorCSAqLworCWNtZF90YmwgPSBwcC0+Y21kX3RibCArIHFjLT50YWcgKiBBSENJX0NNRF9UQkxfU1o7CisKKwlhdGFfdGZfdG9fZmlzKCZxYy0+dGYsIHFjLT5kZXYtPmxpbmstPnBtcCwgMSwgY21kX3RibCk7CisJaWYgKGlzX2F0YXBpKSB7CisJCW1lbXNldChjbWRfdGJsICsgQUhDSV9DTURfVEJMX0NEQiwgMCwgMzIpOworCQltZW1jcHkoY21kX3RibCArIEFIQ0lfQ01EX1RCTF9DREIsIHFjLT5jZGIsIHFjLT5kZXYtPmNkYl9sZW4pOworCX0KKworCW5fZWxlbSA9IDA7CisJaWYgKHFjLT5mbGFncyAmIEFUQV9RQ0ZMQUdfRE1BTUFQKQorCQluX2VsZW0gPSBhY2FyZF9haGNpX2ZpbGxfc2cocWMsIGNtZF90YmwpOworCisJLyoKKwkgKiBGaWxsIGluIGNvbW1hbmQgc2xvdCBpbmZvcm1hdGlvbi4KKwkgKgorCSAqIEFDYXJkIG5vdGU6IHByZCB0YWJsZSBsZW5ndGggbm90IGZpbGxlZCBpbgorCSAqLworCW9wdHMgPSBjbWRfZmlzX2xlbiB8IChxYy0+ZGV2LT5saW5rLT5wbXAgPDwgMTIpOworCWlmIChxYy0+dGYuZmxhZ3MgJiBBVEFfVEZMQUdfV1JJVEUpCisJCW9wdHMgfD0gQUhDSV9DTURfV1JJVEU7CisJaWYgKGlzX2F0YXBpKQorCQlvcHRzIHw9IEFIQ0lfQ01EX0FUQVBJIHwgQUhDSV9DTURfUFJFRkVUQ0g7CisKKwlhaGNpX2ZpbGxfY21kX3Nsb3QocHAsIHFjLT50YWcsIG9wdHMpOworfQorCitzdGF0aWMgYm9vbCBhY2FyZF9haGNpX3FjX2ZpbGxfcnRmKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJc3RydWN0IGFoY2lfcG9ydF9wcml2ICpwcCA9IHFjLT5hcC0+cHJpdmF0ZV9kYXRhOworCXU4ICpyeF9maXMgPSBwcC0+cnhfZmlzOworCisJaWYgKHBwLT5mYnNfZW5hYmxlZCkKKwkJcnhfZmlzICs9IHFjLT5kZXYtPmxpbmstPnBtcCAqIEFDQVJEX0FIQ0lfUlhfRklTX1NaOworCisJLyoKKwkgKiBBZnRlciBhIHN1Y2Nlc3NmdWwgZXhlY3V0aW9uIG9mIGFuIEFUQSBQSU8gZGF0YS1pbiBjb21tYW5kLAorCSAqIHRoZSBkZXZpY2UgZG9lc24ndCBzZW5kIEQySCBSZWcgRklTIHRvIHVwZGF0ZSB0aGUgVEYgYW5kCisJICogdGhlIGhvc3Qgc2hvdWxkIHRha2UgVEYgYW5kIEVfU3RhdHVzIGZyb20gdGhlIHByZWNlZGluZyBQSU8KKwkgKiBTZXR1cCBGSVMuCisJICovCisJaWYgKHFjLT50Zi5wcm90b2NvbCA9PSBBVEFfUFJPVF9QSU8gJiYgcWMtPmRtYV9kaXIgPT0gRE1BX0ZST01fREVWSUNFICYmCisJICAgICEocWMtPmZsYWdzICYgQVRBX1FDRkxBR19GQUlMRUQpKSB7CisJCWF0YV90Zl9mcm9tX2ZpcyhyeF9maXMgKyBSWF9GSVNfUElPX1NFVFVQLCAmcWMtPnJlc3VsdF90Zik7CisJCXFjLT5yZXN1bHRfdGYuY29tbWFuZCA9IChyeF9maXMgKyBSWF9GSVNfUElPX1NFVFVQKVsxNV07CisJfSBlbHNlCisJCWF0YV90Zl9mcm9tX2ZpcyhyeF9maXMgKyBSWF9GSVNfRDJIX1JFRywgJnFjLT5yZXN1bHRfdGYpOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbnQgYWNhcmRfYWhjaV9wb3J0X3N0YXJ0KHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdiA9IGFwLT5ob3N0LT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRldmljZSAqZGV2ID0gYXAtPmhvc3QtPmRldjsKKwlzdHJ1Y3QgYWhjaV9wb3J0X3ByaXYgKnBwOworCXZvaWQgKm1lbTsKKwlkbWFfYWRkcl90IG1lbV9kbWE7CisJc2l6ZV90IGRtYV9zeiwgcnhfZmlzX3N6OworCisJcHAgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnBwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBjaGVjayBGQlMgY2FwYWJpbGl0eSAqLworCWlmICgoaHByaXYtPmNhcCAmIEhPU1RfQ0FQX0ZCUykgJiYgc2F0YV9wbXBfc3VwcG9ydGVkKGFwKSkgeworCQl2b2lkIF9faW9tZW0gKnBvcnRfbW1pbyA9IGFoY2lfcG9ydF9iYXNlKGFwKTsKKwkJdTMyIGNtZCA9IHJlYWRsKHBvcnRfbW1pbyArIFBPUlRfQ01EKTsKKwkJaWYgKGNtZCAmIFBPUlRfQ01EX0ZCU0NQKQorCQkJcHAtPmZic19zdXBwb3J0ZWQgPSB0cnVlOworCQllbHNlIGlmIChocHJpdi0+ZmxhZ3MgJiBBSENJX0hGTEFHX1lFU19GQlMpIHsKKwkJCWRldl9wcmludGsoS0VSTl9JTkZPLCBkZXYsCisJCQkJICAgInBvcnQgJWQgY2FuIGRvIEZCUywgZm9yY2luZyBGQlNDUFxuIiwKKwkJCQkgICBhcC0+cG9ydF9ubyk7CisJCQlwcC0+ZmJzX3N1cHBvcnRlZCA9IHRydWU7CisJCX0gZWxzZQorCQkJZGV2X3ByaW50ayhLRVJOX1dBUk5JTkcsIGRldiwKKwkJCQkgICAicG9ydCAlZCBpcyBub3QgY2FwYWJsZSBvZiBGQlNcbiIsCisJCQkJICAgYXAtPnBvcnRfbm8pOworCX0KKworCWlmIChwcC0+ZmJzX3N1cHBvcnRlZCkgeworCQlkbWFfc3ogPSBBSENJX1BPUlRfUFJJVl9GQlNfRE1BX1NaOworCQlyeF9maXNfc3ogPSBBQ0FSRF9BSENJX1JYX0ZJU19TWiAqIDE2OworCX0gZWxzZSB7CisJCWRtYV9zeiA9IEFIQ0lfUE9SVF9QUklWX0RNQV9TWjsKKwkJcnhfZmlzX3N6ID0gQUNBUkRfQUhDSV9SWF9GSVNfU1o7CisJfQorCisJbWVtID0gZG1hbV9hbGxvY19jb2hlcmVudChkZXYsIGRtYV9zeiwgJm1lbV9kbWEsIEdGUF9LRVJORUwpOworCWlmICghbWVtKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQobWVtLCAwLCBkbWFfc3opOworCisJLyoKKwkgKiBGaXJzdCBpdGVtIGluIGNodW5rIG9mIERNQSBtZW1vcnk6IDMyLXNsb3QgY29tbWFuZCB0YWJsZSwKKwkgKiAzMiBieXRlcyBlYWNoIGluIHNpemUKKwkgKi8KKwlwcC0+Y21kX3Nsb3QgPSBtZW07CisJcHAtPmNtZF9zbG90X2RtYSA9IG1lbV9kbWE7CisKKwltZW0gKz0gQUhDSV9DTURfU0xPVF9TWjsKKwltZW1fZG1hICs9IEFIQ0lfQ01EX1NMT1RfU1o7CisKKwkvKgorCSAqIFNlY29uZCBpdGVtOiBSZWNlaXZlZC1GSVMgYXJlYQorCSAqLworCXBwLT5yeF9maXMgPSBtZW07CisJcHAtPnJ4X2Zpc19kbWEgPSBtZW1fZG1hOworCisJbWVtICs9IHJ4X2Zpc19zejsKKwltZW1fZG1hICs9IHJ4X2Zpc19zejsKKworCS8qCisJICogVGhpcmQgaXRlbTogZGF0YSBhcmVhIGZvciBzdG9yaW5nIGEgc2luZ2xlIGNvbW1hbmQKKwkgKiBhbmQgaXRzIHNjYXR0ZXItZ2F0aGVyIHRhYmxlCisJICovCisJcHAtPmNtZF90YmwgPSBtZW07CisJcHAtPmNtZF90YmxfZG1hID0gbWVtX2RtYTsKKworCS8qCisJICogU2F2ZSBvZmYgaW5pdGlhbCBsaXN0IG9mIGludGVycnVwdHMgdG8gYmUgZW5hYmxlZC4KKwkgKiBUaGlzIGNvdWxkIGJlIGNoYW5nZWQgbGF0ZXIKKwkgKi8KKwlwcC0+aW50cl9tYXNrID0gREVGX1BPUlRfSVJROworCisJYXAtPnByaXZhdGVfZGF0YSA9IHBwOworCisJLyogZW5nYWdlIGVuZ2luZXMsIGNhcHRhaW4gKi8KKwlyZXR1cm4gYWhjaV9wb3J0X3Jlc3VtZShhcCk7Cit9CisKK3N0YXRpYyBpbnQgYWNhcmRfYWhjaV9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKKwl1bnNpZ25lZCBpbnQgYm9hcmRfaWQgPSBlbnQtPmRyaXZlcl9kYXRhOworCXN0cnVjdCBhdGFfcG9ydF9pbmZvIHBpID0gYWNhcmRfYWhjaV9wb3J0X2luZm9bYm9hcmRfaWRdOworCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsgJnBpLCBOVUxMIH07CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2OworCXN0cnVjdCBhdGFfaG9zdCAqaG9zdDsKKwlpbnQgbl9wb3J0cywgaSwgcmM7CisKKwlWUFJJTlRLKCJFTlRFUlxuIik7CisKKwlXQVJOX09OKEFUQV9NQVhfUVVFVUUgPiBBSENJX01BWF9DTURTKTsKKworCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCisJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJnBkZXYtPmRldiwgInZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKKworCS8qIGFjcXVpcmUgcmVzb3VyY2VzICovCisJcmMgPSBwY2ltX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwkvKiBBSENJIGNvbnRyb2xsZXJzIG9mdGVuIGltcGxlbWVudCBTRkYgY29tcGF0aWJsZSBpbnRlcmZhY2UuCisJICogR3JhYiBhbGwgUENJIEJBUnMganVzdCBpbiBjYXNlLgorCSAqLworCXJjID0gcGNpbV9pb21hcF9yZWdpb25zX3JlcXVlc3RfYWxsKHBkZXYsIDEgPDwgQUhDSV9QQ0lfQkFSLCBEUlZfTkFNRSk7CisJaWYgKHJjID09IC1FQlVTWSkKKwkJcGNpbV9waW5fZGV2aWNlKHBkZXYpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJaHByaXYgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmhwcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFocHJpdikKKwkJcmV0dXJuIC1FTk9NRU07CisJaHByaXYtPmZsYWdzIHw9ICh1bnNpZ25lZCBsb25nKXBpLnByaXZhdGVfZGF0YTsKKworCWlmICghKGhwcml2LT5mbGFncyAmIEFIQ0lfSEZMQUdfTk9fTVNJKSkKKwkJcGNpX2VuYWJsZV9tc2kocGRldik7CisKKwlocHJpdi0+bW1pbyA9IHBjaW1faW9tYXBfdGFibGUocGRldilbQUhDSV9QQ0lfQkFSXTsKKworCS8qIHNhdmUgaW5pdGlhbCBjb25maWcgKi8KKwlhaGNpX3NhdmVfaW5pdGlhbF9jb25maWcoJnBkZXYtPmRldiwgaHByaXYsIDAsIDApOworCisJLyogcHJlcGFyZSBob3N0ICovCisJaWYgKGhwcml2LT5jYXAgJiBIT1NUX0NBUF9OQ1EpCisJCXBpLmZsYWdzIHw9IEFUQV9GTEFHX05DUTsKKworCWlmIChocHJpdi0+Y2FwICYgSE9TVF9DQVBfUE1QKQorCQlwaS5mbGFncyB8PSBBVEFfRkxBR19QTVA7CisKKwlhaGNpX3NldF9lbV9tZXNzYWdlcyhocHJpdiwgJnBpKTsKKworCS8qIENBUC5OUCBzb21ldGltZXMgaW5kaWNhdGUgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGVuYWJsZWQKKwkgKiBwb3J0LCBhdCBvdGhlciB0aW1lcywgdGhhdCBvZiB0aGUgbGFzdCBwb3NzaWJsZSBwb3J0LCBzbworCSAqIGRldGVybWluaW5nIHRoZSBtYXhpbXVtIHBvcnQgbnVtYmVyIHJlcXVpcmVzIGxvb2tpbmcgYXQKKwkgKiBib3RoIENBUC5OUCBhbmQgcG9ydF9tYXAuCisJICovCisJbl9wb3J0cyA9IG1heChhaGNpX25yX3BvcnRzKGhwcml2LT5jYXApLCBmbHMoaHByaXYtPnBvcnRfbWFwKSk7CisKKwlob3N0ID0gYXRhX2hvc3RfYWxsb2NfcGluZm8oJnBkZXYtPmRldiwgcHBpLCBuX3BvcnRzKTsKKwlpZiAoIWhvc3QpCisJCXJldHVybiAtRU5PTUVNOworCWhvc3QtPnByaXZhdGVfZGF0YSA9IGhwcml2OworCisJaWYgKCEoaHByaXYtPmNhcCAmIEhPU1RfQ0FQX1NTUykgfHwgYWhjaV9pZ25vcmVfc3NzKQorCQlob3N0LT5mbGFncyB8PSBBVEFfSE9TVF9QQVJBTExFTF9TQ0FOOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYWhjaTogU1NTIGZsYWcgc2V0LCBwYXJhbGxlbCBidXMgc2NhbiBkaXNhYmxlZFxuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgaG9zdC0+bl9wb3J0czsgaSsrKSB7CisJCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBob3N0LT5wb3J0c1tpXTsKKworCQlhdGFfcG9ydF9wYmFyX2Rlc2MoYXAsIEFIQ0lfUENJX0JBUiwgLTEsICJhYmFyIik7CisJCWF0YV9wb3J0X3BiYXJfZGVzYyhhcCwgQUhDSV9QQ0lfQkFSLAorCQkJCSAgIDB4MTAwICsgYXAtPnBvcnRfbm8gKiAweDgwLCAicG9ydCIpOworCisJCS8qIHNldCBpbml0aWFsIGxpbmsgcG0gcG9saWN5ICovCisJCS8qCisJCWFwLT5wbV9wb2xpY3kgPSBOT1RfQVZBSUxBQkxFOworCQkqLworCQkvKiBkaXNhYmxlZC9ub3QtaW1wbGVtZW50ZWQgcG9ydCAqLworCQlpZiAoIShocHJpdi0+cG9ydF9tYXAgJiAoMSA8PCBpKSkpCisJCQlhcC0+b3BzID0gJmF0YV9kdW1teV9wb3J0X29wczsKKwl9CisKKwkvKiBpbml0aWFsaXplIGFkYXB0ZXIgKi8KKwlyYyA9IGFjYXJkX2FoY2lfY29uZmlndXJlX2RtYV9tYXNrcyhwZGV2LCBocHJpdi0+Y2FwICYgSE9TVF9DQVBfNjQpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmMgPSBhaGNpX3Jlc2V0X2NvbnRyb2xsZXIoaG9zdCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlhaGNpX2luaXRfY29udHJvbGxlcihob3N0KTsKKwlhY2FyZF9haGNpX3BjaV9wcmludF9pbmZvKGhvc3QpOworCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisJcmV0dXJuIGF0YV9ob3N0X2FjdGl2YXRlKGhvc3QsIHBkZXYtPmlycSwgYWhjaV9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAorCQkJCSAmYWNhcmRfYWhjaV9zaHQpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhY2FyZF9haGNpX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmYWNhcmRfYWhjaV9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFjYXJkX2FoY2lfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYWNhcmRfYWhjaV9wY2lfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiSmVmZiBHYXJ6aWsiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQUNhcmQgQUhDSSBTQVRBIGxvdy1sZXZlbCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBhY2FyZF9haGNpX3BjaV90YmwpOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOworCittb2R1bGVfaW5pdChhY2FyZF9haGNpX2luaXQpOworbW9kdWxlX2V4aXQoYWNhcmRfYWhjaV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2FoY2kuaCBiL2RyaXZlcnMvYXRhL2FoY2kuaAppbmRleCAzMjljYmJiLi4zZTYwNmMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9haGNpLmgKKysrIGIvZHJpdmVycy9hdGEvYWhjaS5oCkBAIC0zMTEsNiArMzExLDggQEAKIAogZXh0ZXJuIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGFoY2lfb3BzOwogCit2b2lkIGFoY2lfZmlsbF9jbWRfc2xvdChzdHJ1Y3QgYWhjaV9wb3J0X3ByaXYgKnBwLCB1bnNpZ25lZCBpbnQgdGFnLAorCQkJdTMyIG9wdHMpOwogdm9pZCBhaGNpX3NhdmVfaW5pdGlhbF9jb25maWcoc3RydWN0IGRldmljZSAqZGV2LAogCQkJICAgICAgc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdiwKIAkJCSAgICAgIHVuc2lnbmVkIGludCBmb3JjZV9wb3J0X21hcCwKQEAgLTMyNiw2ICszMjgsNyBAQAogdm9pZCBhaGNpX3N0YXJ0X2VuZ2luZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIGludCBhaGNpX2NoZWNrX3JlYWR5KHN0cnVjdCBhdGFfbGluayAqbGluayk7CiBpbnQgYWhjaV9raWNrX2VuZ2luZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKK2ludCBhaGNpX3BvcnRfcmVzdW1lKHN0cnVjdCBhdGFfcG9ydCAqYXApOwogdm9pZCBhaGNpX3NldF9lbV9tZXNzYWdlcyhzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2LAogCQkJICBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcGkpOwogaW50IGFoY2lfcmVzZXRfZW0oc3RydWN0IGF0YV9ob3N0ICpob3N0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmFoY2kuYyBiL2RyaXZlcnMvYXRhL2xpYmFoY2kuYwppbmRleCBlYmMwOGQ2NS4uMjZkNDUyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvbGliYWhjaS5jCisrKyBiL2RyaXZlcnMvYXRhL2xpYmFoY2kuYwpAQCAtODcsMTAgKzg3LDcgQEAKIHN0YXRpYyB2b2lkIGFoY2lfcG9zdHJlc2V0KHN0cnVjdCBhdGFfbGluayAqbGluaywgdW5zaWduZWQgaW50ICpjbGFzcyk7CiBzdGF0aWMgdm9pZCBhaGNpX2Vycm9yX2hhbmRsZXIoc3RydWN0IGF0YV9wb3J0ICphcCk7CiBzdGF0aWMgdm9pZCBhaGNpX3Bvc3RfaW50ZXJuYWxfY21kKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOwotc3RhdGljIGludCBhaGNpX3BvcnRfcmVzdW1lKHN0cnVjdCBhdGFfcG9ydCAqYXApOwogc3RhdGljIHZvaWQgYWhjaV9kZXZfY29uZmlnKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpOwotc3RhdGljIHZvaWQgYWhjaV9maWxsX2NtZF9zbG90KHN0cnVjdCBhaGNpX3BvcnRfcHJpdiAqcHAsIHVuc2lnbmVkIGludCB0YWcsCi0JCQkgICAgICAgdTMyIG9wdHMpOwogI2lmZGVmIENPTkZJR19QTQogc3RhdGljIGludCBhaGNpX3BvcnRfc3VzcGVuZChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBwbV9tZXNzYWdlX3QgbWVzZyk7CiAjZW5kaWYKQEAgLTExMzMsOCArMTEzMCw4IEBACiAJcmV0dXJuIGF0YV9kZXZfY2xhc3NpZnkoJnRmKTsKIH0KIAotc3RhdGljIHZvaWQgYWhjaV9maWxsX2NtZF9zbG90KHN0cnVjdCBhaGNpX3BvcnRfcHJpdiAqcHAsIHVuc2lnbmVkIGludCB0YWcsCi0JCQkgICAgICAgdTMyIG9wdHMpCit2b2lkIGFoY2lfZmlsbF9jbWRfc2xvdChzdHJ1Y3QgYWhjaV9wb3J0X3ByaXYgKnBwLCB1bnNpZ25lZCBpbnQgdGFnLAorCQkJdTMyIG9wdHMpCiB7CiAJZG1hX2FkZHJfdCBjbWRfdGJsX2RtYTsKIApAQCAtMTE0NSw2ICsxMTQyLDcgQEAKIAlwcC0+Y21kX3Nsb3RbdGFnXS50YmxfYWRkciA9IGNwdV90b19sZTMyKGNtZF90YmxfZG1hICYgMHhmZmZmZmZmZik7CiAJcHAtPmNtZF9zbG90W3RhZ10udGJsX2FkZHJfaGkgPSBjcHVfdG9fbGUzMigoY21kX3RibF9kbWEgPj4gMTYpID4+IDE2KTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGFoY2lfZmlsbF9jbWRfc2xvdCk7CiAKIGludCBhaGNpX2tpY2tfZW5naW5lKHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CkBAIC0xOTE4LDcgKzE5MTYsNyBAQAogCXdyaXRlbChwcC0+aW50cl9tYXNrLCBwb3J0X21taW8gKyBQT1JUX0lSUV9NQVNLKTsKIH0KIAotc3RhdGljIGludCBhaGNpX3BvcnRfcmVzdW1lKHN0cnVjdCBhdGFfcG9ydCAqYXApCitpbnQgYWhjaV9wb3J0X3Jlc3VtZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKQogewogCWFoY2lfcG93ZXJfdXAoYXApOwogCWFoY2lfc3RhcnRfcG9ydChhcCk7CkBAIC0xOTMwLDYgKzE5MjgsNyBAQAogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhaGNpX3BvcnRfcmVzdW1lKTsKIAogI2lmZGVmIENPTkZJR19QTQogc3RhdGljIGludCBhaGNpX3BvcnRfc3VzcGVuZChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBwbV9tZXNzYWdlX3QgbWVzZykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmF0YS1zY3NpLmMgYi9kcml2ZXJzL2F0YS9saWJhdGEtc2NzaS5jCmluZGV4IDY2YWE0YmUuLjVkZWZjNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmF0YS1zY3NpLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLXNjc2kuYwpAQCAtMzQ2LDEyICszNDYsMTEgQEAKIH07CiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfY29tbW9uX3NkZXZfYXR0cnMpOwogCi1zdGF0aWMgdm9pZCBhdGFfc2NzaV9pbnZhbGlkX2ZpZWxkKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKLQkJCQkgICB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSkKK3N0YXRpYyB2b2lkIGF0YV9zY3NpX2ludmFsaWRfZmllbGQoc3RydWN0IHNjc2lfY21uZCAqY21kKQogewogCWF0YV9zY3NpX3NldF9zZW5zZShjbWQsIElMTEVHQUxfUkVRVUVTVCwgMHgyNCwgMHgwKTsKIAkvKiAiSW52YWxpZCBmaWVsZCBpbiBjYmQiICovCi0JZG9uZShjbWQpOworCWNtZC0+c2NzaV9kb25lKGNtZCk7CiB9CiAKIC8qKgpAQCAtNzE5LDcgKzcxOCw2IEBACiAgKglhdGFfc2NzaV9xY19uZXcgLSBhY3F1aXJlIG5ldyBhdGFfcXVldWVkX2NtZCByZWZlcmVuY2UKICAqCUBkZXY6IEFUQSBkZXZpY2UgdG8gd2hpY2ggdGhlIG5ldyBjb21tYW5kIGlzIGF0dGFjaGVkCiAgKglAY21kOiBTQ1NJIGNvbW1hbmQgdGhhdCBvcmlnaW5hdGVkIHRoaXMgQVRBIGNvbW1hbmQKLSAqCUBkb25lOiBTQ1NJIGNvbW1hbmQgY29tcGxldGlvbiBmdW5jdGlvbgogICoKICAqCU9idGFpbiBhIHJlZmVyZW5jZSB0byBhbiB1bnVzZWQgYXRhX3F1ZXVlZF9jbWQgc3RydWN0dXJlLAogICoJd2hpY2ggaXMgdGhlIGJhc2ljIGxpYmF0YSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIGEgc2luZ2xlCkBAIC03MzYsMjEgKzczNCwyMCBAQAogICoJQ29tbWFuZCBhbGxvY2F0ZWQsIG9yICVOVUxMIGlmIG5vbmUgYXZhaWxhYmxlLgogICovCiBzdGF0aWMgc3RydWN0IGF0YV9xdWV1ZWRfY21kICphdGFfc2NzaV9xY19uZXcoc3RydWN0IGF0YV9kZXZpY2UgKmRldiwKLQkJCQkJICAgICAgc3RydWN0IHNjc2lfY21uZCAqY21kLAotCQkJCQkgICAgICB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSkKKwkJCQkJICAgICAgc3RydWN0IHNjc2lfY21uZCAqY21kKQogewogCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWM7CiAKIAlxYyA9IGF0YV9xY19uZXdfaW5pdChkZXYpOwogCWlmIChxYykgewogCQlxYy0+c2NzaWNtZCA9IGNtZDsKLQkJcWMtPnNjc2lkb25lID0gZG9uZTsKKwkJcWMtPnNjc2lkb25lID0gY21kLT5zY3NpX2RvbmU7CiAKIAkJcWMtPnNnID0gc2NzaV9zZ2xpc3QoY21kKTsKIAkJcWMtPm5fZWxlbSA9IHNjc2lfc2dfY291bnQoY21kKTsKIAl9IGVsc2UgewogCQljbWQtPnJlc3VsdCA9IChESURfT0sgPDwgMTYpIHwgKFFVRVVFX0ZVTEwgPDwgMSk7Ci0JCWRvbmUoY21kKTsKKwkJY21kLT5zY3NpX2RvbmUoY21kKTsKIAl9CiAKIAlyZXR1cm4gcWM7CkBAIC0xNzM1LDcgKzE3MzIsNiBAQAogICoJYXRhX3Njc2lfdHJhbnNsYXRlIC0gVHJhbnNsYXRlIHRoZW4gaXNzdWUgU0NTSSBjb21tYW5kIHRvIEFUQSBkZXZpY2UKICAqCUBkZXY6IEFUQSBkZXZpY2UgdG8gd2hpY2ggdGhlIGNvbW1hbmQgaXMgYWRkcmVzc2VkCiAgKglAY21kOiBTQ1NJIGNvbW1hbmQgdG8gZXhlY3V0ZQotICoJQGRvbmU6IFNDU0kgY29tbWFuZCBjb21wbGV0aW9uIGZ1bmN0aW9uCiAgKglAeGxhdF9mdW5jOiBBY3RvciB3aGljaCB0cmFuc2xhdGVzIEBjbWQgdG8gYW4gQVRBIHRhc2tmaWxlCiAgKgogICoJT3VyIC0+cXVldWVjb21tYW5kKCkgZnVuY3Rpb24gaGFzIGRlY2lkZWQgdGhhdCB0aGUgU0NTSQpAQCAtMTc1OSw3ICsxNzU1LDYgQEAKICAqCW5lZWRzIHRvIGJlIGRlZmVycmVkLgogICovCiBzdGF0aWMgaW50IGF0YV9zY3NpX3RyYW5zbGF0ZShzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCi0JCQkgICAgICB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSwKIAkJCSAgICAgIGF0YV94bGF0X2Z1bmNfdCB4bGF0X2Z1bmMpCiB7CiAJc3RydWN0IGF0YV9wb3J0ICphcCA9IGRldi0+bGluay0+YXA7CkBAIC0xNzY4LDcgKzE3NjMsNyBAQAogCiAJVlBSSU5USygiRU5URVJcbiIpOwogCi0JcWMgPSBhdGFfc2NzaV9xY19uZXcoZGV2LCBjbWQsIGRvbmUpOworCXFjID0gYXRhX3Njc2lfcWNfbmV3KGRldiwgY21kKTsKIAlpZiAoIXFjKQogCQlnb3RvIGVycl9tZW07CiAKQEAgLTE4MDQsMTQgKzE3OTksMTQgQEAKIAogZWFybHlfZmluaXNoOgogCWF0YV9xY19mcmVlKHFjKTsKLQlxYy0+c2NzaWRvbmUoY21kKTsKKwljbWQtPnNjc2lfZG9uZShjbWQpOwogCURQUklOVEsoIkVYSVQgLSBlYXJseSBmaW5pc2ggKGdvb2Qgb3IgZXJyb3IpXG4iKTsKIAlyZXR1cm4gMDsKIAogZXJyX2RpZDoKIAlhdGFfcWNfZnJlZShxYyk7CiAJY21kLT5yZXN1bHQgPSAoRElEX0VSUk9SIDw8IDE2KTsKLQlxYy0+c2NzaWRvbmUoY21kKTsKKwljbWQtPnNjc2lfZG9uZShjbWQpOwogZXJyX21lbToKIAlEUFJJTlRLKCJFWElUIC0gaW50ZXJuYWxcbiIpOwogCXJldHVybiAwOwpAQCAtMzExNiw3ICszMTExLDYgQEAKIH0KIAogc3RhdGljIGlubGluZSBpbnQgX19hdGFfc2NzaV9xdWV1ZWNtZChzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kLAotCQkJCSAgICAgIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopLAogCQkJCSAgICAgIHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpCiB7CiAJdTggc2NzaV9vcCA9IHNjbWQtPmNtbmRbMF07CkBAIC0zMTUwLDkgKzMxNDQsOSBAQAogCX0KIAogCWlmICh4bGF0X2Z1bmMpCi0JCXJjID0gYXRhX3Njc2lfdHJhbnNsYXRlKGRldiwgc2NtZCwgZG9uZSwgeGxhdF9mdW5jKTsKKwkJcmMgPSBhdGFfc2NzaV90cmFuc2xhdGUoZGV2LCBzY21kLCB4bGF0X2Z1bmMpOwogCWVsc2UKLQkJYXRhX3Njc2lfc2ltdWxhdGUoZGV2LCBzY21kLCBkb25lKTsKKwkJYXRhX3Njc2lfc2ltdWxhdGUoZGV2LCBzY21kKTsKIAogCXJldHVybiByYzsKIApAQCAtMzE2MCw3ICszMTU0LDcgQEAKIAlEUFJJTlRLKCJiYWQgQ0RCIGxlbj0ldSwgc2NzaV9vcD0weCUwMngsIG1heD0ldVxuIiwKIAkJc2NtZC0+Y21kX2xlbiwgc2NzaV9vcCwgZGV2LT5jZGJfbGVuKTsKIAlzY21kLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7Ci0JZG9uZShzY21kKTsKKwlzY21kLT5zY3NpX2RvbmUoc2NtZCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMxOTksNyArMzE5Myw3IEBACiAKIAlkZXYgPSBhdGFfc2NzaV9maW5kX2RldihhcCwgc2NzaWRldik7CiAJaWYgKGxpa2VseShkZXYpKQotCQlyYyA9IF9fYXRhX3Njc2lfcXVldWVjbWQoY21kLCBjbWQtPnNjc2lfZG9uZSwgZGV2KTsKKwkJcmMgPSBfX2F0YV9zY3NpX3F1ZXVlY21kKGNtZCwgZGV2KTsKIAllbHNlIHsKIAkJY21kLT5yZXN1bHQgPSAoRElEX0JBRF9UQVJHRVQgPDwgMTYpOwogCQljbWQtPnNjc2lfZG9uZShjbWQpOwpAQCAtMzIxNCw3ICszMjA4LDYgQEAKICAqCWF0YV9zY3NpX3NpbXVsYXRlIC0gc2ltdWxhdGUgU0NTSSBjb21tYW5kIG9uIEFUQSBkZXZpY2UKICAqCUBkZXY6IHRoZSB0YXJnZXQgZGV2aWNlCiAgKglAY21kOiBTQ1NJIGNvbW1hbmQgYmVpbmcgc2VudCB0byBkZXZpY2UuCi0gKglAZG9uZTogU0NTSSBjb21tYW5kIGNvbXBsZXRpb24gZnVuY3Rpb24uCiAgKgogICoJSW50ZXJwcmV0cyBhbmQgZGlyZWN0bHkgZXhlY3V0ZXMgYSBzZWxlY3QgbGlzdCBvZiBTQ1NJIGNvbW1hbmRzCiAgKgl0aGF0IGNhbiBiZSBoYW5kbGVkIGludGVybmFsbHkuCkBAIC0zMjIzLDggKzMyMTYsNyBAQAogICoJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdCBsb2NrKQogICovCiAKLXZvaWQgYXRhX3Njc2lfc2ltdWxhdGUoc3RydWN0IGF0YV9kZXZpY2UgKmRldiwgc3RydWN0IHNjc2lfY21uZCAqY21kLAotCQkgICAgICB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSkKK3ZvaWQgYXRhX3Njc2lfc2ltdWxhdGUoc3RydWN0IGF0YV9kZXZpY2UgKmRldiwgc3RydWN0IHNjc2lfY21uZCAqY21kKQogewogCXN0cnVjdCBhdGFfc2NzaV9hcmdzIGFyZ3M7CiAJY29uc3QgdTggKnNjc2ljbWQgPSBjbWQtPmNtbmQ7CkBAIC0zMjMzLDE3ICszMjI1LDE3IEBACiAJYXJncy5kZXYgPSBkZXY7CiAJYXJncy5pZCA9IGRldi0+aWQ7CiAJYXJncy5jbWQgPSBjbWQ7Ci0JYXJncy5kb25lID0gZG9uZTsKKwlhcmdzLmRvbmUgPSBjbWQtPnNjc2lfZG9uZTsKIAogCXN3aXRjaChzY3NpY21kWzBdKSB7CiAJLyogVE9ETzogd29ydGggaW1wcm92aW5nPyAqLwogCWNhc2UgRk9STUFUX1VOSVQ6Ci0JCWF0YV9zY3NpX2ludmFsaWRfZmllbGQoY21kLCBkb25lKTsKKwkJYXRhX3Njc2lfaW52YWxpZF9maWVsZChjbWQpOwogCQlicmVhazsKIAogCWNhc2UgSU5RVUlSWToKIAkJaWYgKHNjc2ljbWRbMV0gJiAyKQkgICAgICAgICAgIC8qIGlzIENtZER0IHNldD8gICovCi0JCQlhdGFfc2NzaV9pbnZhbGlkX2ZpZWxkKGNtZCwgZG9uZSk7CisJCQlhdGFfc2NzaV9pbnZhbGlkX2ZpZWxkKGNtZCk7CiAJCWVsc2UgaWYgKChzY3NpY21kWzFdICYgMSkgPT0gMCkgICAgLyogaXMgRVZQRCBjbGVhcj8gKi8KIAkJCWF0YV9zY3NpX3JidWZfZmlsbCgmYXJncywgYXRhX3Njc2lvcF9pbnFfc3RkKTsKIAkJZWxzZSBzd2l0Y2ggKHNjc2ljbWRbMl0pIHsKQEAgLTMyNjksNyArMzI2MSw3IEBACiAJCQlhdGFfc2NzaV9yYnVmX2ZpbGwoJmFyZ3MsIGF0YV9zY3Npb3BfaW5xX2IyKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJYXRhX3Njc2lfaW52YWxpZF9maWVsZChjbWQsIGRvbmUpOworCQkJYXRhX3Njc2lfaW52YWxpZF9maWVsZChjbWQpOwogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CkBAIC0zMjgxLDcgKzMyNzMsNyBAQAogCiAJY2FzZSBNT0RFX1NFTEVDVDoJLyogdW5jb25kaXRpb25hbGx5IHJldHVybiAqLwogCWNhc2UgTU9ERV9TRUxFQ1RfMTA6CS8qIGJhZC1maWVsZC1pbi1jZGIgKi8KLQkJYXRhX3Njc2lfaW52YWxpZF9maWVsZChjbWQsIGRvbmUpOworCQlhdGFfc2NzaV9pbnZhbGlkX2ZpZWxkKGNtZCk7CiAJCWJyZWFrOwogCiAJY2FzZSBSRUFEX0NBUEFDSVRZOgpAQCAtMzI5Miw3ICszMjg0LDcgQEAKIAkJaWYgKChzY3NpY21kWzFdICYgMHgxZikgPT0gU0FJX1JFQURfQ0FQQUNJVFlfMTYpCiAJCQlhdGFfc2NzaV9yYnVmX2ZpbGwoJmFyZ3MsIGF0YV9zY3Npb3BfcmVhZF9jYXApOwogCQllbHNlCi0JCQlhdGFfc2NzaV9pbnZhbGlkX2ZpZWxkKGNtZCwgZG9uZSk7CisJCQlhdGFfc2NzaV9pbnZhbGlkX2ZpZWxkKGNtZCk7CiAJCWJyZWFrOwogCiAJY2FzZSBSRVBPUlRfTFVOUzoKQEAgLTMzMDIsNyArMzI5NCw3IEBACiAJY2FzZSBSRVFVRVNUX1NFTlNFOgogCQlhdGFfc2NzaV9zZXRfc2Vuc2UoY21kLCAwLCAwLCAwKTsKIAkJY21kLT5yZXN1bHQgPSAoRFJJVkVSX1NFTlNFIDw8IDI0KTsKLQkJZG9uZShjbWQpOworCQljbWQtPnNjc2lfZG9uZShjbWQpOwogCQlicmVhazsKIAogCS8qIGlmIHdlIHJlYWNoIHRoaXMsIHRoZW4gd3JpdGViYWNrIGNhY2hpbmcgaXMgZGlzYWJsZWQsCkBAIC0zMzI0LDE0ICszMzE2LDE0IEBACiAJCWlmICgodG1wOCA9PSAweDQpICYmICghc2NzaWNtZFszXSkgJiYgKCFzY3NpY21kWzRdKSkKIAkJCWF0YV9zY3NpX3JidWZfZmlsbCgmYXJncywgYXRhX3Njc2lvcF9ub29wKTsKIAkJZWxzZQotCQkJYXRhX3Njc2lfaW52YWxpZF9maWVsZChjbWQsIGRvbmUpOworCQkJYXRhX3Njc2lfaW52YWxpZF9maWVsZChjbWQpOwogCQlicmVhazsKIAogCS8qIGFsbCBvdGhlciBjb21tYW5kcyAqLwogCWRlZmF1bHQ6CiAJCWF0YV9zY3NpX3NldF9zZW5zZShjbWQsIElMTEVHQUxfUkVRVUVTVCwgMHgyMCwgMHgwKTsKIAkJLyogIkludmFsaWQgY29tbWFuZCBvcGVyYXRpb24gY29kZSIgKi8KLQkJZG9uZShjbWQpOworCQljbWQtPnNjc2lfZG9uZShjbWQpOwogCQlicmVhazsKIAl9CiB9CkBAIC0zODU4LDcgKzM4NTAsNiBAQAogLyoqCiAgKglhdGFfc2FzX3F1ZXVlY21kIC0gSXNzdWUgU0NTSSBjZGIgdG8gbGliYXRhLW1hbmFnZWQgZGV2aWNlCiAgKglAY21kOiBTQ1NJIGNvbW1hbmQgdG8gYmUgc2VudAotICoJQGRvbmU6IENvbXBsZXRpb24gZnVuY3Rpb24sIGNhbGxlZCB3aGVuIGNvbW1hbmQgaXMgY29tcGxldGUKICAqCUBhcDoJQVRBIHBvcnQgdG8gd2hpY2ggdGhlIGNvbW1hbmQgaXMgYmVpbmcgc2VudAogICoKICAqCVJFVFVSTlM6CkBAIC0zODY2LDE4ICszODU3LDE3IEBACiAgKgkwIG90aGVyd2lzZS4KICAqLwogCi1pbnQgYXRhX3Nhc19xdWV1ZWNtZChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopLAotCQkgICAgIHN0cnVjdCBhdGFfcG9ydCAqYXApCitpbnQgYXRhX3Nhc19xdWV1ZWNtZChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CiAJaW50IHJjID0gMDsKIAogCWF0YV9zY3NpX2R1bXBfY2RiKGFwLCBjbWQpOwogCiAJaWYgKGxpa2VseShhdGFfZGV2X2VuYWJsZWQoYXAtPmxpbmsuZGV2aWNlKSkpCi0JCXJjID0gX19hdGFfc2NzaV9xdWV1ZWNtZChjbWQsIGRvbmUsIGFwLT5saW5rLmRldmljZSk7CisJCXJjID0gX19hdGFfc2NzaV9xdWV1ZWNtZChjbWQsIGFwLT5saW5rLmRldmljZSk7CiAJZWxzZSB7CiAJCWNtZC0+cmVzdWx0ID0gKERJRF9CQURfVEFSR0VUIDw8IDE2KTsKLQkJZG9uZShjbWQpOworCQljbWQtPnNjc2lfZG9uZShjbWQpOwogCX0KIAlyZXR1cm4gcmM7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2hwdDM2Ni5jIGIvZHJpdmVycy9hdGEvcGF0YV9ocHQzNjYuYwppbmRleCA3Njg4ODY4Li5kN2U1N2RiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2hwdDM2Ni5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfaHB0MzY2LmMKQEAgLTI1LDcgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KIAogI2RlZmluZSBEUlZfTkFNRQkicGF0YV9ocHQzNjYiCi0jZGVmaW5lIERSVl9WRVJTSU9OCSIwLjYuOCIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuNi45IgogCiBzdHJ1Y3QgaHB0X2Nsb2NrIHsKIAl1OAl4ZmVyX21vZGU7CkBAIC0xMTAsMTggKzExMCwyMyBAQAogCXsJMCwJCTB4MDEyMDg1ODUJfQogfTsKIAotc3RhdGljIGNvbnN0IGNoYXIgKmJhZF9hdGEzM1tdID0gewotCSJNYXh0b3IgOTI3MjBVOCIsICJNYXh0b3IgOTIwNDBVNiIsICJNYXh0b3IgOTEzNjBVNCIsICJNYXh0b3IgOTEwMjBVMyIsICJNYXh0b3IgOTA4NDVVMyIsICJNYXh0b3IgOTA2NTBVMiIsCi0JIk1heHRvciA5MTM2MEQ4IiwgIk1heHRvciA5MTE5MEQ3IiwgIk1heHRvciA5MTAyMEQ2IiwgIk1heHRvciA5MDg0NUQ1IiwgIk1heHRvciA5MDY4MEQ0IiwgIk1heHRvciA5MDUxMEQzIiwgIk1heHRvciA5MDM0MEQyIiwKLQkiTWF4dG9yIDkxMTUyRDgiLCAiTWF4dG9yIDkxMDA4RDciLCAiTWF4dG9yIDkwODQ1RDYiLCAiTWF4dG9yIDkwODQwRDYiLCAiTWF4dG9yIDkwNzIwRDUiLCAiTWF4dG9yIDkwNjQ4RDUiLCAiTWF4dG9yIDkwNTc2RDQiLAorc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBiYWRfYXRhMzNbXSA9IHsKKwkiTWF4dG9yIDkyNzIwVTgiLCAiTWF4dG9yIDkyMDQwVTYiLCAiTWF4dG9yIDkxMzYwVTQiLCAiTWF4dG9yIDkxMDIwVTMiLAorCSJNYXh0b3IgOTA4NDVVMyIsICJNYXh0b3IgOTA2NTBVMiIsCisJIk1heHRvciA5MTM2MEQ4IiwgIk1heHRvciA5MTE5MEQ3IiwgIk1heHRvciA5MTAyMEQ2IiwgIk1heHRvciA5MDg0NUQ1IiwKKwkiTWF4dG9yIDkwNjgwRDQiLCAiTWF4dG9yIDkwNTEwRDMiLCAiTWF4dG9yIDkwMzQwRDIiLAorCSJNYXh0b3IgOTExNTJEOCIsICJNYXh0b3IgOTEwMDhENyIsICJNYXh0b3IgOTA4NDVENiIsICJNYXh0b3IgOTA4NDBENiIsCisJIk1heHRvciA5MDcyMEQ1IiwgIk1heHRvciA5MDY0OEQ1IiwgIk1heHRvciA5MDU3NkQ0IiwKIAkiTWF4dG9yIDkwNTEwRDQiLAogCSJNYXh0b3IgOTA0MzJEMyIsICJNYXh0b3IgOTAyODhEMiIsICJNYXh0b3IgOTAyNTZEMiIsCi0JIk1heHRvciA5MTAwMEQ4IiwgIk1heHRvciA5MDkxMEQ4IiwgIk1heHRvciA5MDg3NUQ3IiwgIk1heHRvciA5MDg0MEQ3IiwgIk1heHRvciA5MDc1MEQ2IiwgIk1heHRvciA5MDYyNUQ1IiwgIk1heHRvciA5MDUwMEQ0IiwKLQkiTWF4dG9yIDkxNzI4RDgiLCAiTWF4dG9yIDkxNTEyRDciLCAiTWF4dG9yIDkxMzAzRDYiLCAiTWF4dG9yIDkxMDgwRDUiLCAiTWF4dG9yIDkwODQ1RDQiLCAiTWF4dG9yIDkwNjgwRDQiLCAiTWF4dG9yIDkwNjQ4RDMiLCAiTWF4dG9yIDkwNDMyRDIiLAorCSJNYXh0b3IgOTEwMDBEOCIsICJNYXh0b3IgOTA5MTBEOCIsICJNYXh0b3IgOTA4NzVENyIsICJNYXh0b3IgOTA4NDBENyIsCisJIk1heHRvciA5MDc1MEQ2IiwgIk1heHRvciA5MDYyNUQ1IiwgIk1heHRvciA5MDUwMEQ0IiwKKwkiTWF4dG9yIDkxNzI4RDgiLCAiTWF4dG9yIDkxNTEyRDciLCAiTWF4dG9yIDkxMzAzRDYiLCAiTWF4dG9yIDkxMDgwRDUiLAorCSJNYXh0b3IgOTA4NDVENCIsICJNYXh0b3IgOTA2ODBENCIsICJNYXh0b3IgOTA2NDhEMyIsICJNYXh0b3IgOTA0MzJEMiIsCiAJTlVMTAogfTsKIAotc3RhdGljIGNvbnN0IGNoYXIgKmJhZF9hdGE2Nl80W10gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJhZF9hdGE2Nl80W10gPSB7CiAJIklCTS1EVExBLTMwNzA3NSIsCiAJIklCTS1EVExBLTMwNzA2MCIsCiAJIklCTS1EVExBLTMwNzA0NSIsCkBAIC0xNDAsMTIgKzE0NSwxMyBAQAogCU5VTEwKIH07CiAKLXN0YXRpYyBjb25zdCBjaGFyICpiYWRfYXRhNjZfM1tdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBiYWRfYXRhNjZfM1tdID0gewogCSJXREMgQUMzMTAyMDBSIiwKIAlOVUxMCiB9OwogCi1zdGF0aWMgaW50IGhwdF9kbWFfYmxhY2tsaXN0ZWQoY29uc3Qgc3RydWN0IGF0YV9kZXZpY2UgKmRldiwgY2hhciAqbW9kZXN0ciwgY29uc3QgY2hhciAqbGlzdFtdKQorc3RhdGljIGludCBocHRfZG1hX2JsYWNrbGlzdGVkKGNvbnN0IHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsIGNoYXIgKm1vZGVzdHIsCisJCQkgICAgICAgY29uc3QgY2hhciAqIGNvbnN0IGxpc3RbXSkKIHsKIAl1bnNpZ25lZCBjaGFyIG1vZGVsX251bVtBVEFfSURfUFJPRF9MRU4gKyAxXTsKIAlpbnQgaSA9IDA7CkBAIC0yODgsNiArMjk0LDcgQEAKIHN0YXRpYyB2b2lkIGhwdDM2eF9pbml0X2NoaXBzZXQoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAl1OCBkcml2ZV9mYXN0OworCiAJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0NBQ0hFX0xJTkVfU0laRSwgKEwxX0NBQ0hFX0JZVEVTIC8gNCkpOwogCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAweDc4KTsKIAlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfTUlOX0dOVCwgMHgwOCk7CkBAIC0zNDksMTYgKzM1NiwxNiBAQAogCiAJLyogUENJIGNsb2NraW5nIGRldGVybWluZXMgdGhlIEFUQSB0aW1pbmcgdmFsdWVzIHRvIHVzZSAqLwogCS8qIGluZm9faHB0MzY2IGlzIHNhZmUgYWdhaW5zdCByZS1lbnRyeSBzbyB3ZSBjYW4gc2NyaWJibGUgb24gaXQgKi8KLQlzd2l0Y2goKHJlZzEgJiAweDcwMCkgPj4gOCkgewotCQljYXNlIDk6Ci0JCQlocHJpdiA9ICZocHQzNjZfNDA7Ci0JCQlicmVhazsKLQkJY2FzZSA1OgotCQkJaHByaXYgPSAmaHB0MzY2XzI1OwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlocHJpdiA9ICZocHQzNjZfMzM7Ci0JCQlicmVhazsKKwlzd2l0Y2ggKChyZWcxICYgMHg3MDApID4+IDgpIHsKKwljYXNlIDk6CisJCWhwcml2ID0gJmhwdDM2Nl80MDsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQlocHJpdiA9ICZocHQzNjZfMjU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWhwcml2ID0gJmhwdDM2Nl8zMzsKKwkJYnJlYWs7CiAJfQogCS8qIE5vdyBraWNrIG9mZiBBVEEgc2V0IHVwICovCiAJcmV0dXJuIGF0YV9wY2lfYm1kbWFfaW5pdF9vbmUoZGV2LCBwcGksICZocHQzNnhfc2h0LCBocHJpdiwgMCk7CkBAIC0zODUsOSArMzkyLDkgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBocHQzNnhfcGNpX2RyaXZlciA9IHsKLQkubmFtZSAJCT0gRFJWX05BTUUsCisJLm5hbWUJCT0gRFJWX05BTUUsCiAJLmlkX3RhYmxlCT0gaHB0MzZ4LAotCS5wcm9iZSAJCT0gaHB0MzZ4X2luaXRfb25lLAorCS5wcm9iZQkJPSBocHQzNnhfaW5pdF9vbmUsCiAJLnJlbW92ZQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUsCiAjaWZkZWYgQ09ORklHX1BNCiAJLnN1c3BlbmQJPSBhdGFfcGNpX2RldmljZV9zdXNwZW5kLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9ocHQzN3guYyBiL2RyaXZlcnMvYXRhL3BhdGFfaHB0Mzd4LmMKaW5kZXggOWFlNGMwOC4uZWZkZDE4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9ocHQzN3guYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2hwdDM3eC5jCkBAIC04LDcgKzgsNyBAQAogICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDMJCUFuZHJlIEhlZHJpY2sgPGFuZHJlQGxpbnV4LWlkZS5vcmc+CiAgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMDEJICAgICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCiAgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMDMJCVJlZCBIYXQgSW5jCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwOQlNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMAlNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCiAgKgogICogVE9ETwogICoJTG9vayBpbnRvIGVuZ2luZSByZXNldCBvbiB0aW1lb3V0IGVycm9ycy4gU2hvdWxkIG5vdCBiZQlyZXF1aXJlZC4KQEAgLTI0LDcgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KIAogI2RlZmluZSBEUlZfTkFNRQkicGF0YV9ocHQzN3giCi0jZGVmaW5lIERSVl9WRVJTSU9OCSIwLjYuMTUiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIwLjYuMTgiCiAKIHN0cnVjdCBocHRfY2xvY2sgewogCXU4CXhmZXJfc3BlZWQ7CkBAIC0yMTAsNyArMjEwLDcgQEAKIHsKIAlzdHJ1Y3QgaHB0X2Nsb2NrICpjbG9ja3MgPSBhcC0+aG9zdC0+cHJpdmF0ZV9kYXRhOwogCi0Jd2hpbGUoY2xvY2tzLT54ZmVyX3NwZWVkKSB7CisJd2hpbGUgKGNsb2Nrcy0+eGZlcl9zcGVlZCkgewogCQlpZiAoY2xvY2tzLT54ZmVyX3NwZWVkID09IHNwZWVkKQogCQkJcmV0dXJuIGNsb2Nrcy0+dGltaW5nOwogCQljbG9ja3MrKzsKQEAgLTIxOSw3ICsyMTksOCBAQAogCXJldHVybiAweGZmZmZmZmZmVTsJLyogc2lsZW5jZSBjb21waWxlciB3YXJuaW5nICovCiB9CiAKLXN0YXRpYyBpbnQgaHB0X2RtYV9ibGFja2xpc3RlZChjb25zdCBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LCBjaGFyICptb2Rlc3RyLCBjb25zdCBjaGFyICpsaXN0W10pCitzdGF0aWMgaW50IGhwdF9kbWFfYmxhY2tsaXN0ZWQoY29uc3Qgc3RydWN0IGF0YV9kZXZpY2UgKmRldiwgY2hhciAqbW9kZXN0ciwKKwkJCSAgICAgICBjb25zdCBjaGFyICogY29uc3QgbGlzdFtdKQogewogCXVuc2lnbmVkIGNoYXIgbW9kZWxfbnVtW0FUQV9JRF9QUk9EX0xFTiArIDFdOwogCWludCBpID0gMDsKQEAgLTIzNywxOCArMjM4LDIzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjb25zdCBjaGFyICpiYWRfYXRhMzNbXSA9IHsKLQkiTWF4dG9yIDkyNzIwVTgiLCAiTWF4dG9yIDkyMDQwVTYiLCAiTWF4dG9yIDkxMzYwVTQiLCAiTWF4dG9yIDkxMDIwVTMiLCAiTWF4dG9yIDkwODQ1VTMiLCAiTWF4dG9yIDkwNjUwVTIiLAotCSJNYXh0b3IgOTEzNjBEOCIsICJNYXh0b3IgOTExOTBENyIsICJNYXh0b3IgOTEwMjBENiIsICJNYXh0b3IgOTA4NDVENSIsICJNYXh0b3IgOTA2ODBENCIsICJNYXh0b3IgOTA1MTBEMyIsICJNYXh0b3IgOTAzNDBEMiIsCi0JIk1heHRvciA5MTE1MkQ4IiwgIk1heHRvciA5MTAwOEQ3IiwgIk1heHRvciA5MDg0NUQ2IiwgIk1heHRvciA5MDg0MEQ2IiwgIk1heHRvciA5MDcyMEQ1IiwgIk1heHRvciA5MDY0OEQ1IiwgIk1heHRvciA5MDU3NkQ0IiwKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYmFkX2F0YTMzW10gPSB7CisJIk1heHRvciA5MjcyMFU4IiwgIk1heHRvciA5MjA0MFU2IiwgIk1heHRvciA5MTM2MFU0IiwgIk1heHRvciA5MTAyMFUzIiwKKwkiTWF4dG9yIDkwODQ1VTMiLCAiTWF4dG9yIDkwNjUwVTIiLAorCSJNYXh0b3IgOTEzNjBEOCIsICJNYXh0b3IgOTExOTBENyIsICJNYXh0b3IgOTEwMjBENiIsICJNYXh0b3IgOTA4NDVENSIsCisJIk1heHRvciA5MDY4MEQ0IiwgIk1heHRvciA5MDUxMEQzIiwgIk1heHRvciA5MDM0MEQyIiwKKwkiTWF4dG9yIDkxMTUyRDgiLCAiTWF4dG9yIDkxMDA4RDciLCAiTWF4dG9yIDkwODQ1RDYiLCAiTWF4dG9yIDkwODQwRDYiLAorCSJNYXh0b3IgOTA3MjBENSIsICJNYXh0b3IgOTA2NDhENSIsICJNYXh0b3IgOTA1NzZENCIsCiAJIk1heHRvciA5MDUxMEQ0IiwKIAkiTWF4dG9yIDkwNDMyRDMiLCAiTWF4dG9yIDkwMjg4RDIiLCAiTWF4dG9yIDkwMjU2RDIiLAotCSJNYXh0b3IgOTEwMDBEOCIsICJNYXh0b3IgOTA5MTBEOCIsICJNYXh0b3IgOTA4NzVENyIsICJNYXh0b3IgOTA4NDBENyIsICJNYXh0b3IgOTA3NTBENiIsICJNYXh0b3IgOTA2MjVENSIsICJNYXh0b3IgOTA1MDBENCIsCi0JIk1heHRvciA5MTcyOEQ4IiwgIk1heHRvciA5MTUxMkQ3IiwgIk1heHRvciA5MTMwM0Q2IiwgIk1heHRvciA5MTA4MEQ1IiwgIk1heHRvciA5MDg0NUQ0IiwgIk1heHRvciA5MDY4MEQ0IiwgIk1heHRvciA5MDY0OEQzIiwgIk1heHRvciA5MDQzMkQyIiwKKwkiTWF4dG9yIDkxMDAwRDgiLCAiTWF4dG9yIDkwOTEwRDgiLCAiTWF4dG9yIDkwODc1RDciLCAiTWF4dG9yIDkwODQwRDciLAorCSJNYXh0b3IgOTA3NTBENiIsICJNYXh0b3IgOTA2MjVENSIsICJNYXh0b3IgOTA1MDBENCIsCisJIk1heHRvciA5MTcyOEQ4IiwgIk1heHRvciA5MTUxMkQ3IiwgIk1heHRvciA5MTMwM0Q2IiwgIk1heHRvciA5MTA4MEQ1IiwKKwkiTWF4dG9yIDkwODQ1RDQiLCAiTWF4dG9yIDkwNjgwRDQiLCAiTWF4dG9yIDkwNjQ4RDMiLCAiTWF4dG9yIDkwNDMyRDIiLAogCU5VTEwKIH07CiAKLXN0YXRpYyBjb25zdCBjaGFyICpiYWRfYXRhMTAwXzVbXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYmFkX2F0YTEwMF81W10gPSB7CiAJIklCTS1EVExBLTMwNzA3NSIsCiAJIklCTS1EVExBLTMwNzA2MCIsCiAJIklCTS1EVExBLTMwNzA0NSIsCkBAIC0zMDIsNiArMzA4LDIyIEBACiB9CiAKIC8qKgorICoJaHB0MzcyX2ZpbHRlcgktCW1vZGUgc2VsZWN0aW9uIGZpbHRlcgorICoJQGFkZXY6IEFUQSBkZXZpY2UKKyAqCUBtYXNrOiBtb2RlIG1hc2sKKyAqCisgKglUaGUgTWFydmVsbCBicmlkZ2UgY2hpcHMgdXNlZCBvbiB0aGUgSGlnaFBvaW50IFNBVEEgY2FyZHMgZG8gbm90IHNlZW0KKyAqCXRvIHN1cHBvcnQgdGhlIFVsdHJhRE1BIG1vZGVzIDEsIDIsIGFuZCAzIGFzIHdlbGwgYXMgYW55IE1XRE1BIG1vZGVzLi4uCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGhwdDM3Ml9maWx0ZXIoc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYsIHVuc2lnbmVkIGxvbmcgbWFzaykKK3sKKwlpZiAoYXRhX2lkX2lzX3NhdGEoYWRldi0+aWQpKQorCQltYXNrICY9IH4oKDB4RSA8PCBBVEFfU0hJRlRfVURNQSkgfCBBVEFfTUFTS19NV0RNQSk7CisKKwlyZXR1cm4gbWFzazsKK30KKworLyoqCiAgKglocHQzN3hfY2FibGVfZGV0ZWN0CS0JRGV0ZWN0IHRoZSBjYWJsZSB0eXBlCiAgKglAYXA6IEFUQSBwb3J0IHRvIGRldGVjdCBvbgogICoKQEAgLTM3Myw2ICszOTUsNyBAQAogCQl7IDB4NTAsIDEsIDB4MDQsIDB4MDQgfSwKIAkJeyAweDU0LCAxLCAweDA0LCAweDA0IH0KIAl9OworCiAJaWYgKCFwY2lfdGVzdF9jb25maWdfYml0cyhwZGV2LCAmaHB0Mzd4X2VuYWJsZV9iaXRzW2FwLT5wb3J0X25vXSkpCiAJCXJldHVybiAtRU5PRU5UOwogCkBAIC01ODYsMTEgKzYwOSwxMSBAQAogfTsKIAogLyoKLSAqCUNvbmZpZ3VyYXRpb24gZm9yIEhQVDM3MiwgSFBUMzcxLCBIUFQzMDIuIFNsaWdodGx5IGRpZmZlcmVudCBQSU8KLSAqCWFuZCBETUEgbW9kZSBzZXR0aW5nIGZ1bmN0aW9uYWxpdHkuCisgKglDb25maWd1cmF0aW9uIGZvciBIUFQzNzEgYW5kIEhQVDMwMi4gU2xpZ2h0bHkgZGlmZmVyZW50IFBJTyBhbmQgRE1BCisgKgltb2RlIHNldHRpbmcgZnVuY3Rpb25hbGl0eS4KICAqLwogCi1zdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgaHB0MzcyX3BvcnRfb3BzID0geworc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGhwdDMwMl9wb3J0X29wcyA9IHsKIAkuaW5oZXJpdHMJPSAmYXRhX2JtZG1hX3BvcnRfb3BzLAogCiAJLmJtZG1hX3N0b3AJPSBocHQzN3hfYm1kbWFfc3RvcCwKQEAgLTYwMiw3ICs2MjUsMTcgQEAKIH07CiAKIC8qCi0gKglDb25maWd1cmF0aW9uIGZvciBIUFQzNzQuIE1vZGUgc2V0dGluZyB3b3JrcyBsaWtlIDM3MiBhbmQgZnJpZW5kcworICoJQ29uZmlndXJhdGlvbiBmb3IgSFBUMzcyLiBNb2RlIHNldHRpbmcgd29ya3MgbGlrZSAzNzEgYW5kIDMwMgorICoJYnV0IHdlIGhhdmUgYSBtb2RlIGZpbHRlci4KKyAqLworCitzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgaHB0MzcyX3BvcnRfb3BzID0geworCS5pbmhlcml0cwk9ICZocHQzMDJfcG9ydF9vcHMsCisJLm1vZGVfZmlsdGVyCT0gaHB0MzcyX2ZpbHRlciwKK307CisKKy8qCisgKglDb25maWd1cmF0aW9uIGZvciBIUFQzNzQuIE1vZGUgc2V0dGluZyBhbmQgZmlsdGVyaW5nIHdvcmtzIGxpa2UgMzcyCiAgKglidXQgd2UgaGF2ZSBhIGRpZmZlcmVudCBjYWJsZSBkZXRlY3Rpb24gcHJvY2VkdXJlIGZvciBmdW5jdGlvbiAxLgogICovCiAKQEAgLTY0NywxMiArNjgwLDEyIEBACiAJdTMyIHJlZzVjOwogCWludCB0cmllczsKIAotCWZvcih0cmllcyA9IDA7IHRyaWVzIDwgMHg1MDAwOyB0cmllcysrKSB7CisJZm9yICh0cmllcyA9IDA7IHRyaWVzIDwgMHg1MDAwOyB0cmllcysrKSB7CiAJCXVkZWxheSg1MCk7CiAJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg1YiwgJnJlZzViKTsKIAkJaWYgKHJlZzViICYgMHg4MCkgewogCQkJLyogU2VlIGlmIGl0IHN0YXlzIHNldCAqLwotCQkJZm9yKHRyaWVzID0gMDsgdHJpZXMgPCAweDEwMDA7IHRyaWVzICsrKSB7CisJCQlmb3IgKHRyaWVzID0gMDsgdHJpZXMgPCAweDEwMDA7IHRyaWVzKyspIHsKIAkJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NWIsICZyZWc1Yik7CiAJCQkJLyogRmFpbGVkID8gKi8KIAkJCQlpZiAoKHJlZzViICYgMHg4MCkgPT0gMCkKQEAgLTY2MCw3ICs2OTMsNyBAQAogCQkJfQogCQkJLyogVHVybiBvZmYgdHVuaW5nLCB3ZSBoYXZlIHRoZSBEUExMIHNldCAqLwogCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgMHg1YywgJnJlZzVjKTsKLQkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweDVjLCByZWc1YyAmIH4gMHgxMDApOworCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIDB4NWMsIHJlZzVjICYgfjB4MTAwKTsKIAkJCXJldHVybiAxOwogCQl9CiAJfQpAQCAtNjcyLDYgKzcwNSw3IEBACiB7CiAJdTMyIGZyZXE7CiAJdW5zaWduZWQgbG9uZyBpb19iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDQpOworCiAJaWYgKFBDSV9GVU5DKHBkZXYtPmRldmZuKSAmIDEpIHsKIAkJc3RydWN0IHBjaV9kZXYgKnBkZXZfMDsKIApAQCAtNzM3LDIzICs3NzEsMjMgQEAKIAkJLnVkbWFfbWFzayA9IEFUQV9VRE1BNSwKIAkJLnBvcnRfb3BzID0gJmhwdDM3MGFfcG9ydF9vcHMKIAl9OwotCS8qIEhQVDM3MCAtIFVETUExMDAgKi8KKwkvKiBIUFQzNzAgLSBVRE1BNjYgKi8KIAlzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mb19ocHQzNzBfMzMgPSB7CiAJCS5mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1MsCiAJCS5waW9fbWFzayA9IEFUQV9QSU80LAogCQkubXdkbWFfbWFzayA9IEFUQV9NV0RNQTIsCi0JCS51ZG1hX21hc2sgPSBBVEFfVURNQTUsCisJCS51ZG1hX21hc2sgPSBBVEFfVURNQTQsCiAJCS5wb3J0X29wcyA9ICZocHQzNzBfcG9ydF9vcHMKIAl9OwotCS8qIEhQVDM3MEEgLSBVRE1BMTAwICovCisJLyogSFBUMzcwQSAtIFVETUE2NiAqLwogCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvX2hwdDM3MGFfMzMgPSB7CiAJCS5mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1MsCiAJCS5waW9fbWFzayA9IEFUQV9QSU80LAogCQkubXdkbWFfbWFzayA9IEFUQV9NV0RNQTIsCi0JCS51ZG1hX21hc2sgPSBBVEFfVURNQTUsCisJCS51ZG1hX21hc2sgPSBBVEFfVURNQTQsCiAJCS5wb3J0X29wcyA9ICZocHQzNzBhX3BvcnRfb3BzCiAJfTsKLQkvKiBIUFQzNzEsIDM3MiBhbmQgZnJpZW5kcyAtIFVETUExMzMgKi8KKwkvKiBIUFQzNzIgLSBVRE1BMTMzICovCiAJc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9faHB0MzcyID0gewogCQkuZmxhZ3MgPSBBVEFfRkxBR19TTEFWRV9QT1NTLAogCQkucGlvX21hc2sgPSBBVEFfUElPNCwKQEAgLTc2MSw2ICs3OTUsMTQgQEAKIAkJLnVkbWFfbWFzayA9IEFUQV9VRE1BNiwKIAkJLnBvcnRfb3BzID0gJmhwdDM3Ml9wb3J0X29wcwogCX07CisJLyogSFBUMzcxLCAzMDIgLSBVRE1BMTMzICovCisJc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9faHB0MzAyID0geworCQkuZmxhZ3MgPSBBVEFfRkxBR19TTEFWRV9QT1NTLAorCQkucGlvX21hc2sgPSBBVEFfUElPNCwKKwkJLm13ZG1hX21hc2sgPSBBVEFfTVdETUEyLAorCQkudWRtYV9tYXNrID0gQVRBX1VETUE2LAorCQkucG9ydF9vcHMgPSAmaHB0MzAyX3BvcnRfb3BzCisJfTsKIAkvKiBIUFQzNzQgLSBVRE1BMTAwLCBmdW5jdGlvbiAxIHVzZXMgZGlmZmVyZW50IHByZXJlc2V0IG1ldGhvZCAqLwogCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvX2hwdDM3NF9mbjAgPSB7CiAJCS5mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1MsCkBAIC04MDUsNjQgKzg0Nyw2OCBAQAogCQlpZiAocmV2ID09IDYpCiAJCQlyZXR1cm4gLUVOT0RFVjsKIAotCQlzd2l0Y2gocmV2KSB7Ci0JCQljYXNlIDM6Ci0JCQkJcHBpWzBdID0gJmluZm9faHB0MzcwOwotCQkJCWNoaXBfdGFibGUgPSAmaHB0MzcwOwotCQkJCXByZWZlcl9kcGxsID0gMDsKLQkJCQlicmVhazsKLQkJCWNhc2UgNDoKLQkJCQlwcGlbMF0gPSAmaW5mb19ocHQzNzBhOwotCQkJCWNoaXBfdGFibGUgPSAmaHB0MzcwYTsKLQkJCQlwcmVmZXJfZHBsbCA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDU6Ci0JCQkJcHBpWzBdID0gJmluZm9faHB0MzcyOwotCQkJCWNoaXBfdGFibGUgPSAmaHB0MzcyOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlwcmludGsoS0VSTl9FUlIgInBhdGFfaHB0Mzd4OiBVbmtub3duIEhQVDM2NiAiCi0JCQkJICAgICAgICJzdWJ0eXBlLCBwbGVhc2UgcmVwb3J0ICglZCkuXG4iLCByZXYpOwotCQkJCXJldHVybiAtRU5PREVWOworCQlzd2l0Y2ggKHJldikgeworCQljYXNlIDM6CisJCQlwcGlbMF0gPSAmaW5mb19ocHQzNzA7CisJCQljaGlwX3RhYmxlID0gJmhwdDM3MDsKKwkJCXByZWZlcl9kcGxsID0gMDsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQlwcGlbMF0gPSAmaW5mb19ocHQzNzBhOworCQkJY2hpcF90YWJsZSA9ICZocHQzNzBhOworCQkJcHJlZmVyX2RwbGwgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgNToKKwkJCXBwaVswXSA9ICZpbmZvX2hwdDM3MjsKKwkJCWNoaXBfdGFibGUgPSAmaHB0MzcyOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIgInBhdGFfaHB0Mzd4OiBVbmtub3duIEhQVDM2NiBzdWJ0eXBlLCAiCisJCQkgICAgICAgInBsZWFzZSByZXBvcnQgKCVkKS5cbiIsIHJldik7CisJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQogCX0gZWxzZSB7Ci0JCXN3aXRjaChkZXYtPmRldmljZSkgewotCQkJY2FzZSBQQ0lfREVWSUNFX0lEX1RUSV9IUFQzNzI6Ci0JCQkJLyogMzcyTiBpZiByZXYgPj0gMiovCi0JCQkJaWYgKHJldiA+PSAyKQotCQkJCQlyZXR1cm4gLUVOT0RFVjsKLQkJCQlwcGlbMF0gPSAmaW5mb19ocHQzNzI7Ci0JCQkJY2hpcF90YWJsZSA9ICZocHQzNzJhOwotCQkJCWJyZWFrOwotCQkJY2FzZSBQQ0lfREVWSUNFX0lEX1RUSV9IUFQzMDI6Ci0JCQkJLyogMzAyTiBpZiByZXYgPiAxICovCi0JCQkJaWYgKHJldiA+IDEpCi0JCQkJCXJldHVybiAtRU5PREVWOwotCQkJCXBwaVswXSA9ICZpbmZvX2hwdDM3MjsKLQkJCQkvKiBDaGVjayB0aGlzICovCi0JCQkJY2hpcF90YWJsZSA9ICZocHQzMDI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFBDSV9ERVZJQ0VfSURfVFRJX0hQVDM3MToKLQkJCQlpZiAocmV2ID4gMSkKLQkJCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCQkJcHBpWzBdID0gJmluZm9faHB0MzcyOwotCQkJCWNoaXBfdGFibGUgPSAmaHB0MzcxOwotCQkJCS8qIFNpbmdsZSBjaGFubmVsIGRldmljZSwgbWFzdGVyIGlzIG5vdCBwcmVzZW50Ci0JCQkJICAgYnV0IHRoZSBCSU9TIChvciB1cyBmb3Igbm9uIHg4NikgbXVzdCBtYXJrIGl0Ci0JCQkJICAgYWJzZW50ICovCi0JCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDUwLCAmbWNyMSk7Ci0JCQkJbWNyMSAmPSB+MHgwNDsKLQkJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDUwLCBtY3IxKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUENJX0RFVklDRV9JRF9UVElfSFBUMzc0OgotCQkJCWNoaXBfdGFibGUgPSAmaHB0Mzc0OwotCQkJCWlmICghKFBDSV9GVU5DKGRldi0+ZGV2Zm4pICYgMSkpCi0JCQkJCSpwcGkgPSAmaW5mb19ocHQzNzRfZm4wOwotCQkJCWVsc2UKLQkJCQkJKnBwaSA9ICZpbmZvX2hwdDM3NF9mbjE7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXByaW50ayhLRVJOX0VSUiAicGF0YV9ocHQzN3g6IFBDSSB0YWJsZSBpcyBib2d1cyBwbGVhc2UgcmVwb3J0ICglZCkuXG4iLCBkZXYtPmRldmljZSk7CisJCXN3aXRjaCAoZGV2LT5kZXZpY2UpIHsKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1RUSV9IUFQzNzI6CisJCQkvKiAzNzJOIGlmIHJldiA+PSAyICovCisJCQlpZiAocmV2ID49IDIpCisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQlwcGlbMF0gPSAmaW5mb19ocHQzNzI7CisJCQljaGlwX3RhYmxlID0gJmhwdDM3MmE7CisJCQlicmVhazsKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1RUSV9IUFQzMDI6CisJCQkvKiAzMDJOIGlmIHJldiA+IDEgKi8KKwkJCWlmIChyZXYgPiAxKQorCQkJCXJldHVybiAtRU5PREVWOworCQkJcHBpWzBdID0gJmluZm9faHB0MzAyOworCQkJLyogQ2hlY2sgdGhpcyAqLworCQkJY2hpcF90YWJsZSA9ICZocHQzMDI7CisJCQlicmVhazsKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1RUSV9IUFQzNzE6CisJCQlpZiAocmV2ID4gMSkKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCXBwaVswXSA9ICZpbmZvX2hwdDMwMjsKKwkJCWNoaXBfdGFibGUgPSAmaHB0MzcxOworCQkJLyoKKwkJCSAqIFNpbmdsZSBjaGFubmVsIGRldmljZSwgbWFzdGVyIGlzIG5vdCBwcmVzZW50CisJCQkgKiBidXQgdGhlIEJJT1MgKG9yIHVzIGZvciBub24geDg2KSBtdXN0IG1hcmsgaXQKKwkJCSAqIGFic2VudAorCQkJICovCisJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NTAsICZtY3IxKTsKKwkJCW1jcjEgJj0gfjB4MDQ7CisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDUwLCBtY3IxKTsKKwkJCWJyZWFrOworCQljYXNlIFBDSV9ERVZJQ0VfSURfVFRJX0hQVDM3NDoKKwkJCWNoaXBfdGFibGUgPSAmaHB0Mzc0OworCQkJaWYgKCEoUENJX0ZVTkMoZGV2LT5kZXZmbikgJiAxKSkKKwkJCQkqcHBpID0gJmluZm9faHB0Mzc0X2ZuMDsKKwkJCWVsc2UKKwkJCQkqcHBpID0gJmluZm9faHB0Mzc0X2ZuMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgInBhdGFfaHB0Mzd4OiBQQ0kgdGFibGUgaXMgYm9ndXMsIHBsZWFzZSByZXBvcnQgKCVkKS5cbiIsCisJCQkgICAgICAgZGV2LT5kZXZpY2UpOwogCQkJCXJldHVybiAtRU5PREVWOwogCQl9CiAJfQpAQCAtODkzLDkgKzkzOSwxMSBAQAogCWlmIChjaGlwX3RhYmxlID09ICZocHQzNzJhKQogCQlvdXRiKDB4MGUsIGlvYmFzZSArIDB4OWMpOwogCi0JLyogU29tZSBkZXZpY2VzIGRvIG5vdCBsZXQgdGhpcyB2YWx1ZSBiZSBhY2Nlc3NlZCB2aWEgUENJIHNwYWNlCi0JICAgYWNjb3JkaW5nIHRvIHRoZSBvbGQgZHJpdmVyLiBJbiBhZGRpdGlvbiB3ZSBtdXN0IHVzZSB0aGUgdmFsdWUKLQkgICBmcm9tIEZOIDAgb24gdGhlIEhQVDM3NCAqLworCS8qCisJICogU29tZSBkZXZpY2VzIGRvIG5vdCBsZXQgdGhpcyB2YWx1ZSBiZSBhY2Nlc3NlZCB2aWEgUENJIHNwYWNlCisJICogYWNjb3JkaW5nIHRvIHRoZSBvbGQgZHJpdmVyLiBJbiBhZGRpdGlvbiB3ZSBtdXN0IHVzZSB0aGUgdmFsdWUKKwkgKiBmcm9tIEZOIDAgb24gdGhlIEhQVDM3NC4KKwkgKi8KIAogCWlmIChjaGlwX3RhYmxlID09ICZocHQzNzQpIHsKIAkJZnJlcSA9IGhwdDM3NF9yZWFkX2ZyZXEoZGV2KTsKQEAgLTkwOSwxMCArOTU3LDExIEBACiAJCXU4IHNyOwogCQl1MzIgdG90YWwgPSAwOwogCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgInBhdGFfaHB0Mzd4OiBCSU9TIGhhcyBub3Qgc2V0IHRpbWluZyBjbG9ja3MuXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgInBhdGFfaHB0Mzd4OiBCSU9TIGhhcyBub3Qgc2V0IHRpbWluZyBjbG9ja3MuXG4iKTsKIAogCQkvKiBUaGlzIGlzIHRoZSBwcm9jZXNzIHRoZSBIUFQzNzEgQklPUyBpcyByZXBvcnRlZCB0byB1c2UgKi8KLQkJZm9yKGkgPSAwOyBpIDwgMTI4OyBpKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKSB7CiAJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NzgsICZzcik7CiAJCQl0b3RhbCArPSBzciAmIDB4MUZGOwogCQkJdWRlbGF5KDE1KTsKQEAgLTk0NywxNyArOTk2LDIyIEBACiAKIAkJLyogU2VsZWN0IHRoZSBEUExMIGNsb2NrLiAqLwogCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDViLCAweDIxKTsKLQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIDB4NUMsIChmX2hpZ2ggPDwgMTYpIHwgZl9sb3cgfCAweDEwMCk7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweDVDLAorCQkJCSAgICAgICAoZl9oaWdoIDw8IDE2KSB8IGZfbG93IHwgMHgxMDApOwogCi0JCWZvcihhZGp1c3QgPSAwOyBhZGp1c3QgPCA4OyBhZGp1c3QrKykgeworCQlmb3IgKGFkanVzdCA9IDA7IGFkanVzdCA8IDg7IGFkanVzdCsrKSB7CiAJCQlpZiAoaHB0Mzd4X2NhbGlicmF0ZV9kcGxsKGRldikpCiAJCQkJYnJlYWs7Ci0JCQkvKiBTZWUgaWYgaXQnbGwgc2V0dGxlIGF0IGEgZnJhY3Rpb25hbGx5IGRpZmZlcmVudCBjbG9jayAqLworCQkJLyoKKwkJCSAqIFNlZSBpZiBpdCdsbCBzZXR0bGUgYXQgYSBmcmFjdGlvbmFsbHkKKwkJCSAqIGRpZmZlcmVudCBjbG9jaworCQkJICovCiAJCQlpZiAoYWRqdXN0ICYgMSkKIAkJCQlmX2xvdyAtPSBhZGp1c3QgPj4gMTsKIAkJCWVsc2UKIAkJCQlmX2hpZ2ggKz0gYWRqdXN0ID4+IDE7Ci0JCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgMHg1QywgKGZfaGlnaCA8PCAxNikgfCBmX2xvdyB8IDB4MTAwKTsKKwkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweDVDLAorCQkJCQkgICAgICAgKGZfaGlnaCA8PCAxNikgfCBmX2xvdyB8IDB4MTAwKTsKIAkJfQogCQlpZiAoYWRqdXN0ID09IDgpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAicGF0YV9ocHQzN3g6IERQTEwgZGlkIG5vdCBzdGFiaWxpemUhXG4iKTsKQEAgLTk3Niw3ICsxMDMwLDcgQEAKIAkJICoJUGVyZm9ybSBhIGZpbmFsIGZpeHVwLiBOb3RlIHRoYXQgd2Ugd2lsbCBoYXZlIHVzZWQgdGhlCiAJCSAqCURQTEwgb24gdGhlIEhQVDM3MiB3aGljaCBtZWFucyB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5CiAJCSAqCWFib3V0IGxhY2sgb2YgVURNQTEzMyBzdXBwb3J0IG9uIGxvd2VyIGNsb2NrcwotIAkJICovCisJCSAqLwogCiAJCWlmIChjbG9ja19zbG90IDwgMiAmJiBwcGlbMF0gPT0gJmluZm9faHB0MzcwKQogCQkJcHBpWzBdID0gJmluZm9faHB0MzcwXzMzOwpAQCAtMTAwMSw5ICsxMDU1LDkgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBocHQzN3hfcGNpX2RyaXZlciA9IHsKLQkubmFtZSAJCT0gRFJWX05BTUUsCisJLm5hbWUJCT0gRFJWX05BTUUsCiAJLmlkX3RhYmxlCT0gaHB0Mzd4LAotCS5wcm9iZSAJCT0gaHB0Mzd4X2luaXRfb25lLAorCS5wcm9iZQkJPSBocHQzN3hfaW5pdF9vbmUsCiAJLnJlbW92ZQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfaHB0M3gybi5jIGIvZHJpdmVycy9hdGEvcGF0YV9ocHQzeDJuLmMKaW5kZXggMzJmMzQ2My4uZDIyMzliYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9ocHQzeDJuLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9ocHQzeDJuLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogTGliYXRhIGRyaXZlciBmb3IgdGhlIGhpZ2hwb2ludCAzNzJOIGFuZCAzMDJOIFVETUE2NiBBVEEgY29udHJvbGxlcnMuCisgKiBMaWJhdGEgZHJpdmVyIGZvciB0aGUgSGlnaFBvaW50IDM3MU4sIDM3Mk4sIGFuZCAzMDJOIFVETUE2NiBBVEEgY29udHJvbGxlcnMuCiAgKgogICogVGhpcyBkcml2ZXIgaXMgaGVhdmlseSBiYXNlZCB1cG9uOgogICoKQEAgLTgsNyArOCw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMwkJQW5kcmUgSGVkcmljayA8YW5kcmVAbGludXgtaWRlLm9yZz4KICAqIFBvcnRpb25zIENvcHlyaWdodCAoQykgMjAwMQkgICAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KICAqIFBvcnRpb25zIENvcHlyaWdodCAoQykgMjAwMwkJUmVkIEhhdCBJbmMKLSAqIFBvcnRpb25zIENvcHlyaWdodCAoQykgMjAwNS0yMDA5CU1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqIFBvcnRpb25zIENvcHlyaWdodCAoQykgMjAwNS0yMDEwCU1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KICAqCiAgKgogICogVE9ETwpAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgogCiAjZGVmaW5lIERSVl9OQU1FCSJwYXRhX2hwdDN4Mm4iCi0jZGVmaW5lIERSVl9WRVJTSU9OCSIwLjMuMTAiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIwLjMuMTMiCiAKIGVudW0gewogCUhQVF9QQ0lfRkFTVAk9CSgxIDw8IDMxKSwKQEAgLTEwMyw3ICsxMDMsNyBAQAogewogCXN0cnVjdCBocHRfY2xvY2sgKmNsb2NrcyA9IGhwdDN4Mm5fY2xvY2tzOwogCi0Jd2hpbGUoY2xvY2tzLT54ZmVyX3NwZWVkKSB7CisJd2hpbGUgKGNsb2Nrcy0+eGZlcl9zcGVlZCkgewogCQlpZiAoY2xvY2tzLT54ZmVyX3NwZWVkID09IHNwZWVkKQogCQkJcmV0dXJuIGNsb2Nrcy0+dGltaW5nOwogCQljbG9ja3MrKzsKQEAgLTExMyw2ICsxMTMsMjIgQEAKIH0KIAogLyoqCisgKglocHQzNzJuX2ZpbHRlcgktCW1vZGUgc2VsZWN0aW9uIGZpbHRlcgorICoJQGFkZXY6IEFUQSBkZXZpY2UKKyAqCUBtYXNrOiBtb2RlIG1hc2sKKyAqCisgKglUaGUgTWFydmVsbCBicmlkZ2UgY2hpcHMgdXNlZCBvbiB0aGUgSGlnaFBvaW50IFNBVEEgY2FyZHMgZG8gbm90IHNlZW0KKyAqCXRvIHN1cHBvcnQgdGhlIFVsdHJhRE1BIG1vZGVzIDEsIDIsIGFuZCAzIGFzIHdlbGwgYXMgYW55IE1XRE1BIG1vZGVzLi4uCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGhwdDM3Mm5fZmlsdGVyKHN0cnVjdCBhdGFfZGV2aWNlICphZGV2LCB1bnNpZ25lZCBsb25nIG1hc2spCit7CisJaWYgKGF0YV9pZF9pc19zYXRhKGFkZXYtPmlkKSkKKwkJbWFzayAmPSB+KCgweEUgPDwgQVRBX1NISUZUX1VETUEpIHwgQVRBX01BU0tfTVdETUEpOworCisJcmV0dXJuIG1hc2s7Cit9CisKKy8qKgogICoJaHB0M3gybl9jYWJsZV9kZXRlY3QJLQlEZXRlY3QgdGhlIGNhYmxlIHR5cGUKICAqCUBhcDogQVRBIHBvcnQgdG8gZGV0ZWN0IG9uCiAgKgpAQCAtMTUzLDYgKzE2OSw3IEBACiB7CiAJc3RydWN0IGF0YV9wb3J0ICphcCA9IGxpbmstPmFwOwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKKwogCS8qIFJlc2V0IHRoZSBzdGF0ZSBtYWNoaW5lICovCiAJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NTAgKyA0ICogYXAtPnBvcnRfbm8sIDB4MzcpOwogCXVkZWxheSgxMDApOwpAQCAtMzI4LDEwICszNDUsMTAgQEAKIH07CiAKIC8qCi0gKglDb25maWd1cmF0aW9uIGZvciBIUFQzeDJuLgorICoJQ29uZmlndXJhdGlvbiBmb3IgSFBUMzAyTi8zNzFOLgogICovCiAKLXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBocHQzeDJuX3BvcnRfb3BzID0geworc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGhwdDN4eG5fcG9ydF9vcHMgPSB7CiAJLmluaGVyaXRzCT0gJmF0YV9ibWRtYV9wb3J0X29wcywKIAogCS5ibWRtYV9zdG9wCT0gaHB0M3gybl9ibWRtYV9zdG9wLApAQCAtMzQ1LDYgKzM2MiwxNSBAQAogCS5wcmVyZXNldAk9IGhwdDN4Mm5fcHJlX3Jlc2V0LAogfTsKIAorLyoKKyAqCUNvbmZpZ3VyYXRpb24gZm9yIEhQVDM3Mk4uIFNhbWUgYXMgMzAyTi8zNzFOIGJ1dCB3ZSBoYXZlIGEgbW9kZSBmaWx0ZXIuCisgKi8KKworc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGhwdDM3Mm5fcG9ydF9vcHMgPSB7CisJLmluaGVyaXRzCT0gJmhwdDN4eG5fcG9ydF9vcHMsCisJLm1vZGVfZmlsdGVyCT0gJmhwdDM3Mm5fZmlsdGVyLAorfTsKKwogLyoqCiAgKglocHQzeG5fY2FsaWJyYXRlX2RwbGwJCS0JQ2FsaWJyYXRlIHRoZSBEUExMIGxvb3AKICAqCUBkZXY6IFBDSSBkZXZpY2UKQEAgLTM1OSwxMiArMzg1LDEyIEBACiAJdTMyIHJlZzVjOwogCWludCB0cmllczsKIAotCWZvcih0cmllcyA9IDA7IHRyaWVzIDwgMHg1MDAwOyB0cmllcysrKSB7CisJZm9yICh0cmllcyA9IDA7IHRyaWVzIDwgMHg1MDAwOyB0cmllcysrKSB7CiAJCXVkZWxheSg1MCk7CiAJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg1YiwgJnJlZzViKTsKIAkJaWYgKHJlZzViICYgMHg4MCkgewogCQkJLyogU2VlIGlmIGl0IHN0YXlzIHNldCAqLwotCQkJZm9yKHRyaWVzID0gMDsgdHJpZXMgPCAweDEwMDA7IHRyaWVzICsrKSB7CisJCQlmb3IgKHRyaWVzID0gMDsgdHJpZXMgPCAweDEwMDA7IHRyaWVzKyspIHsKIAkJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NWIsICZyZWc1Yik7CiAJCQkJLyogRmFpbGVkID8gKi8KIAkJCQlpZiAoKHJlZzViICYgMHg4MCkgPT0gMCkKQEAgLTM3Miw3ICszOTgsNyBAQAogCQkJfQogCQkJLyogVHVybiBvZmYgdHVuaW5nLCB3ZSBoYXZlIHRoZSBEUExMIHNldCAqLwogCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgMHg1YywgJnJlZzVjKTsKLQkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweDVjLCByZWc1YyAmIH4gMHgxMDApOworCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIDB4NWMsIHJlZzVjICYgfjB4MTAwKTsKIAkJCXJldHVybiAxOwogCQl9CiAJfQpAQCAtMzg4LDggKzQxNCwxOSBAQAogCiAJZmNudCA9IGlubChpb2Jhc2UgKyAweDkwKTsJLyogTm90IFBDSSByZWFkYWJsZSBmb3Igc29tZSBjaGlwcyAqLwogCWlmICgoZmNudCA+PiAxMikgIT0gMHhBQkNERSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJocHQzeG46IEJJT1MgY2xvY2sgZGF0YSBub3Qgc2V0LlxuIik7Ci0JCXJldHVybiAzMzsJLyogTm90IEJJT1Mgc2V0ICovCisJCWludCBpOworCQl1MTYgc3I7CisJCXUzMiB0b3RhbCA9IDA7CisKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAicGF0YV9ocHQzeDJuOiBCSU9TIGNsb2NrIGRhdGEgbm90IHNldC5cbiIpOworCisJCS8qIFRoaXMgaXMgdGhlIHByb2Nlc3MgdGhlIEhQVDM3MSBCSU9TIGlzIHJlcG9ydGVkIHRvIHVzZSAqLworCQlmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspIHsKKwkJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIDB4NzgsICZzcik7CisJCQl0b3RhbCArPSBzciAmIDB4MUZGOworCQkJdWRlbGF5KDE1KTsKKwkJfQorCQlmY250ID0gdG90YWwgLyAxMjg7CiAJfQogCWZjbnQgJj0gMHgxRkY7CiAKQEAgLTQzMSwyMSArNDY4LDI3IEBACiAgKglIUFQzNzJOCQkJOSAoSFBUMzcyTikJKglVRE1BMTMzCiAgKgogICoJKDEpIFVETUExMzMgc3VwcG9ydCBkZXBlbmRzIG9uIHRoZSBidXMgY2xvY2sKLSAqCi0gKglUbyBwaW4gZG93bgkJSFBUMzcxTgogICovCiAKIHN0YXRpYyBpbnQgaHB0M3gybl9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7Ci0JLyogSFBUMzcyTiBhbmQgZnJpZW5kcyAtIFVETUExMzMgKi8KLQlzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mbyA9IHsKKwkvKiBIUFQzNzJOIC0gVURNQTEzMyAqLworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvX2hwdDM3Mm4gPSB7CiAJCS5mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1MsCiAJCS5waW9fbWFzayA9IEFUQV9QSU80LAogCQkubXdkbWFfbWFzayA9IEFUQV9NV0RNQTIsCiAJCS51ZG1hX21hc2sgPSBBVEFfVURNQTYsCi0JCS5wb3J0X29wcyA9ICZocHQzeDJuX3BvcnRfb3BzCisJCS5wb3J0X29wcyA9ICZocHQzNzJuX3BvcnRfb3BzCiAJfTsKLQljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpW10gPSB7ICZpbmZvLCBOVUxMIH07CisJLyogSFBUMzAyTiBhbmQgSFBUMzcxTiAtIFVETUExMzMgKi8KKwlzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mb19ocHQzeHhuID0geworCQkuZmxhZ3MgPSBBVEFfRkxBR19TTEFWRV9QT1NTLAorCQkucGlvX21hc2sgPSBBVEFfUElPNCwKKwkJLm13ZG1hX21hc2sgPSBBVEFfTVdETUEyLAorCQkudWRtYV9tYXNrID0gQVRBX1VETUE2LAorCQkucG9ydF9vcHMgPSAmaHB0M3h4bl9wb3J0X29wcworCX07CisJY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBwaVtdID0geyAmaW5mb19ocHQzeHhuLCBOVUxMIH07CiAJdTggcmV2ID0gZGV2LT5yZXZpc2lvbjsKIAl1OCBpcnFtYXNrOwogCXVuc2lnbmVkIGludCBwY2lfbWh6OwpAQCAtNDU5LDMwICs1MDIsMzYgQEAKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAotCXN3aXRjaChkZXYtPmRldmljZSkgewotCQljYXNlIFBDSV9ERVZJQ0VfSURfVFRJX0hQVDM2NjoKLQkJCWlmIChyZXYgPCA2KQotCQkJCXJldHVybiAtRU5PREVWOwotCQkJYnJlYWs7Ci0JCWNhc2UgUENJX0RFVklDRV9JRF9UVElfSFBUMzcxOgotCQkJaWYgKHJldiA8IDIpCi0JCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCQkvKiAzNzFOIGlmIHJldiA+IDEgKi8KLQkJCWJyZWFrOwotCQljYXNlIFBDSV9ERVZJQ0VfSURfVFRJX0hQVDM3MjoKLQkJCS8qIDM3Mk4gaWYgcmV2ID49IDIqLwotCQkJaWYgKHJldiA8IDIpCi0JCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCQlicmVhazsKLQkJY2FzZSBQQ0lfREVWSUNFX0lEX1RUSV9IUFQzMDI6Ci0JCQlpZiAocmV2IDwgMikKLQkJCQlyZXR1cm4gLUVOT0RFVjsKLQkJCWJyZWFrOwotCQljYXNlIFBDSV9ERVZJQ0VfSURfVFRJX0hQVDM3Mk46Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXByaW50ayhLRVJOX0VSUiAicGF0YV9ocHQzeDJuOiBQQ0kgdGFibGUgaXMgYm9ndXMgcGxlYXNlIHJlcG9ydCAoJWQpLlxuIiwgZGV2LT5kZXZpY2UpOworCXN3aXRjaCAoZGV2LT5kZXZpY2UpIHsKKwljYXNlIFBDSV9ERVZJQ0VfSURfVFRJX0hQVDM2NjoKKwkJLyogMzcyTiBpZiByZXYgPj0gNiAqLworCQlpZiAocmV2IDwgNikKIAkJCXJldHVybiAtRU5PREVWOworCQlnb3RvIGhwdDM3Mm47CisJY2FzZSBQQ0lfREVWSUNFX0lEX1RUSV9IUFQzNzE6CisJCS8qIDM3MU4gaWYgcmV2ID49IDIgKi8KKwkJaWYgKHJldiA8IDIpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1RUSV9IUFQzNzI6CisJCS8qIDM3Mk4gaWYgcmV2ID49IDIgKi8KKwkJaWYgKHJldiA8IDIpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJZ290byBocHQzNzJuOworCWNhc2UgUENJX0RFVklDRV9JRF9UVElfSFBUMzAyOgorCQkvKiAzMDJOIGlmIHJldiA+PSAyICovCisJCWlmIChyZXYgPCAyKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9UVElfSFBUMzcyTjoKK2hwdDM3Mm46CisJCXBwaVswXSA9ICZpbmZvX2hwdDM3Mm47CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgInBhdGFfaHB0M3gybjogUENJIHRhYmxlIGlzIGJvZ3VzIHBsZWFzZSByZXBvcnQgKCVkKS5cbiIsCisJCSAgICAgICBkZXYtPmRldmljZSk7CisJCXJldHVybiAtRU5PREVWOwogCX0KIAogCS8qIE9rIHNvIHRoaXMgaXMgYSBjaGlwIHdlIHN1cHBvcnQgKi8KQEAgLTUwOSw4ICs1NTgsMTAgQEAKIAkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg1MCwgbWNyMSk7CiAJfQogCi0JLyogVHVuZSB0aGUgUExMLiBIUFQgcmVjb21tZW5kIHVzaW5nIDc1IGZvciBTQVRBLCA2NiBmb3IgVURNQTEzMyBvcgotCSAgIDUwIGZvciBVRE1BMTAwLiBSaWdodCBub3cgd2UgYWx3YXlzIHVzZSA2NiAqLworCS8qCisJICogVHVuZSB0aGUgUExMLiBIUFQgcmVjb21tZW5kIHVzaW5nIDc1IGZvciBTQVRBLCA2NiBmb3IgVURNQTEzMyBvcgorCSAqIDUwIGZvciBVRE1BMTAwLiBSaWdodCBub3cgd2UgYWx3YXlzIHVzZSA2NgorCSAqLwogCiAJcGNpX21oeiA9IGhwdDN4Mm5fcGNpX2Nsb2NrKGRldik7CiAKQEAgLTUyMiw3ICs1NzMsNyBAQAogCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NUIsIDB4MjEpOwogCiAJLyogVW5saWtlIHRoZSAzN3ggd2UgZG9uJ3QgdHJ5IGppZ2dsaW5nIHRoZSBmcmVxdWVuY3kgKi8KLQlmb3IoYWRqdXN0ID0gMDsgYWRqdXN0IDwgODsgYWRqdXN0KyspIHsKKwlmb3IgKGFkanVzdCA9IDA7IGFkanVzdCA8IDg7IGFkanVzdCsrKSB7CiAJCWlmIChocHQzeG5fY2FsaWJyYXRlX2RwbGwoZGV2KSkKIAkJCWJyZWFrOwogCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgMHg1QywgKGZfaGlnaCA8PCAxNikgfCBmX2xvdyk7CkBAIC01MzQsOCArNTg1LDExIEBACiAKIAlwcmludGsoS0VSTl9JTkZPICJwYXRhX2hwdDM3eDogYnVzIGNsb2NrICVkTUh6LCB1c2luZyA2Nk1IeiBEUExMLlxuIiwKIAkgICAgICAgcGNpX21oeik7Ci0JLyogU2V0IG91ciBwcml2YXRlIGRhdGEgdXAuIFdlIG9ubHkgbmVlZCBhIGZldyBmbGFncyBzbyB3ZSB1c2UKLQkgICBpdCBkaXJlY3RseSAqLworCisJLyoKKwkgKiBTZXQgb3VyIHByaXZhdGUgZGF0YSB1cC4gV2Ugb25seSBuZWVkIGEgZmV3IGZsYWdzCisJICogc28gd2UgdXNlIGl0IGRpcmVjdGx5LgorCSAqLwogCWlmIChwY2lfbWh6ID4gNjApCiAJCWhwcml2ID0gKHZvaWQgKikoUENJNjYgfCBVU0VfRFBMTCk7CiAKQEAgLTU2Miw5ICs2MTYsOSBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGhwdDN4Mm5fcGNpX2RyaXZlciA9IHsKLQkubmFtZSAJCT0gRFJWX05BTUUsCisJLm5hbWUJCT0gRFJWX05BTUUsCiAJLmlkX3RhYmxlCT0gaHB0M3gybiwKLQkucHJvYmUgCQk9IGhwdDN4Mm5faW5pdF9vbmUsCisJLnByb2JlCQk9IGhwdDN4Mm5faW5pdF9vbmUsCiAJLnJlbW92ZQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUKIH07CiAKQEAgLTU3OSw3ICs2MzMsNyBAQAogfQogCiBNT0RVTEVfQVVUSE9SKCJBbGFuIENveCIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJsb3ctbGV2ZWwgZHJpdmVyIGZvciB0aGUgSGlnaHBvaW50IEhQVDN4Mm4vMzB4Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImxvdy1sZXZlbCBkcml2ZXIgZm9yIHRoZSBIaWdocG9pbnQgSFBUM3h4TiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGhwdDN4Mm4pOwogTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2Jhc2UuaCBiL2RyaXZlcnMvYmFzZS9iYXNlLmgKaW5kZXggMmNhN2Y1Yi4uMTlmNDllNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2Jhc2UuaAorKysgYi9kcml2ZXJzL2Jhc2UvYmFzZS5oCkBAIC0xLDMxICsxLDQ2IEBACiAKIC8qKgotICogc3RydWN0IGJ1c190eXBlX3ByaXZhdGUgLSBzdHJ1Y3R1cmUgdG8gaG9sZCB0aGUgcHJpdmF0ZSB0byB0aGUgZHJpdmVyIGNvcmUgcG9ydGlvbnMgb2YgdGhlIGJ1c190eXBlIHN0cnVjdHVyZS4KKyAqIHN0cnVjdCBzdWJzeXNfcHJpdmF0ZSAtIHN0cnVjdHVyZSB0byBob2xkIHRoZSBwcml2YXRlIHRvIHRoZSBkcml2ZXIgY29yZSBwb3J0aW9ucyBvZiB0aGUgYnVzX3R5cGUvY2xhc3Mgc3RydWN0dXJlLgogICoKLSAqIEBzdWJzeXMgLSB0aGUgc3RydWN0IGtzZXQgdGhhdCBkZWZpbmVzIHRoaXMgYnVzLiAgVGhpcyBpcyB0aGUgbWFpbiBrb2JqZWN0Ci0gKiBAZHJpdmVyc19rc2V0IC0gdGhlIGxpc3Qgb2YgZHJpdmVycyBhc3NvY2lhdGVkIHdpdGggdGhpcyBidXMKLSAqIEBkZXZpY2VzX2tzZXQgLSB0aGUgbGlzdCBvZiBkZXZpY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJ1cworICogQHN1YnN5cyAtIHRoZSBzdHJ1Y3Qga3NldCB0aGF0IGRlZmluZXMgdGhpcyBzdWJzeXN0ZW0KKyAqIEBkZXZpY2VzX2tzZXQgLSB0aGUgbGlzdCBvZiBkZXZpY2VzIGFzc29jaWF0ZWQKKyAqCisgKiBAZHJpdmVyc19rc2V0IC0gdGhlIGxpc3Qgb2YgZHJpdmVycyBhc3NvY2lhdGVkCiAgKiBAa2xpc3RfZGV2aWNlcyAtIHRoZSBrbGlzdCB0byBpdGVyYXRlIG92ZXIgdGhlIEBkZXZpY2VzX2tzZXQKICAqIEBrbGlzdF9kcml2ZXJzIC0gdGhlIGtsaXN0IHRvIGl0ZXJhdGUgb3ZlciB0aGUgQGRyaXZlcnNfa3NldAogICogQGJ1c19ub3RpZmllciAtIHRoZSBidXMgbm90aWZpZXIgbGlzdCBmb3IgYW55dGhpbmcgdGhhdCBjYXJlcyBhYm91dCB0aGluZ3MKLSAqIG9uIHRoaXMgYnVzLgorICogICAgICAgICAgICAgICAgIG9uIHRoaXMgYnVzLgogICogQGJ1cyAtIHBvaW50ZXIgYmFjayB0byB0aGUgc3RydWN0IGJ1c190eXBlIHRoYXQgdGhpcyBzdHJ1Y3R1cmUgaXMgYXNzb2NpYXRlZAotICogd2l0aC4KKyAqICAgICAgICB3aXRoLgorICoKKyAqIEBjbGFzc19pbnRlcmZhY2VzIC0gbGlzdCBvZiBjbGFzc19pbnRlcmZhY2VzIGFzc29jaWF0ZWQKKyAqIEBnbHVlX2RpcnMgLSAiZ2x1ZSIgZGlyZWN0b3J5IHRvIHB1dCBpbi1iZXR3ZWVuIHRoZSBwYXJlbnQgZGV2aWNlIHRvCisgKiAgICAgICAgICAgICAgYXZvaWQgbmFtZXNwYWNlIGNvbmZsaWN0cworICogQGNsYXNzX211dGV4IC0gbXV0ZXggdG8gcHJvdGVjdCB0aGUgY2hpbGRyZW4sIGRldmljZXMsIGFuZCBpbnRlcmZhY2VzIGxpc3RzLgorICogQGNsYXNzIC0gcG9pbnRlciBiYWNrIHRvIHRoZSBzdHJ1Y3QgY2xhc3MgdGhhdCB0aGlzIHN0cnVjdHVyZSBpcyBhc3NvY2lhdGVkCisgKiAgICAgICAgICB3aXRoLgogICoKICAqIFRoaXMgc3RydWN0dXJlIGlzIHRoZSBvbmUgdGhhdCBpcyB0aGUgYWN0dWFsIGtvYmplY3QgYWxsb3dpbmcgc3RydWN0Ci0gKiBidXNfdHlwZSB0byBiZSBzdGF0aWNhbGx5IGFsbG9jYXRlZCBzYWZlbHkuICBOb3RoaW5nIG91dHNpZGUgb2YgdGhlIGRyaXZlcgotICogY29yZSBzaG91bGQgZXZlciB0b3VjaCB0aGVzZSBmaWVsZHMuCisgKiBidXNfdHlwZS9jbGFzcyB0byBiZSBzdGF0aWNhbGx5IGFsbG9jYXRlZCBzYWZlbHkuICBOb3RoaW5nIG91dHNpZGUgb2YgdGhlCisgKiBkcml2ZXIgY29yZSBzaG91bGQgZXZlciB0b3VjaCB0aGVzZSBmaWVsZHMuCiAgKi8KLXN0cnVjdCBidXNfdHlwZV9wcml2YXRlIHsKK3N0cnVjdCBzdWJzeXNfcHJpdmF0ZSB7CiAJc3RydWN0IGtzZXQgc3Vic3lzOwotCXN0cnVjdCBrc2V0ICpkcml2ZXJzX2tzZXQ7CiAJc3RydWN0IGtzZXQgKmRldmljZXNfa3NldDsKKworCXN0cnVjdCBrc2V0ICpkcml2ZXJzX2tzZXQ7CiAJc3RydWN0IGtsaXN0IGtsaXN0X2RldmljZXM7CiAJc3RydWN0IGtsaXN0IGtsaXN0X2RyaXZlcnM7CiAJc3RydWN0IGJsb2NraW5nX25vdGlmaWVyX2hlYWQgYnVzX25vdGlmaWVyOwogCXVuc2lnbmVkIGludCBkcml2ZXJzX2F1dG9wcm9iZToxOwogCXN0cnVjdCBidXNfdHlwZSAqYnVzOworCisJc3RydWN0IGxpc3RfaGVhZCBjbGFzc19pbnRlcmZhY2VzOworCXN0cnVjdCBrc2V0IGdsdWVfZGlyczsKKwlzdHJ1Y3QgbXV0ZXggY2xhc3NfbXV0ZXg7CisJc3RydWN0IGNsYXNzICpjbGFzczsKIH07CisjZGVmaW5lIHRvX3N1YnN5c19wcml2YXRlKG9iaikgY29udGFpbmVyX29mKG9iaiwgc3RydWN0IHN1YnN5c19wcml2YXRlLCBzdWJzeXMua29iaikKIAogc3RydWN0IGRyaXZlcl9wcml2YXRlIHsKIAlzdHJ1Y3Qga29iamVjdCBrb2JqOwpAQCAtMzYsMzMgKzUxLDYgQEAKIH07CiAjZGVmaW5lIHRvX2RyaXZlcihvYmopIGNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBkcml2ZXJfcHJpdmF0ZSwga29iaikKIAotCi0vKioKLSAqIHN0cnVjdCBjbGFzc19wcml2YXRlIC0gc3RydWN0dXJlIHRvIGhvbGQgdGhlIHByaXZhdGUgdG8gdGhlIGRyaXZlciBjb3JlIHBvcnRpb25zIG9mIHRoZSBjbGFzcyBzdHJ1Y3R1cmUuCi0gKgotICogQGNsYXNzX3N1YnN5cyAtIHRoZSBzdHJ1Y3Qga3NldCB0aGF0IGRlZmluZXMgdGhpcyBjbGFzcy4gIFRoaXMgaXMgdGhlIG1haW4ga29iamVjdAotICogQGNsYXNzX2RldmljZXMgLSBsaXN0IG9mIGRldmljZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2xhc3MKLSAqIEBjbGFzc19pbnRlcmZhY2VzIC0gbGlzdCBvZiBjbGFzc19pbnRlcmZhY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNsYXNzCi0gKiBAY2xhc3NfZGlycyAtICJnbHVlIiBkaXJlY3RvcnkgZm9yIHZpcnR1YWwgZGV2aWNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBjbGFzcwotICogQGNsYXNzX211dGV4IC0gbXV0ZXggdG8gcHJvdGVjdCB0aGUgY2hpbGRyZW4sIGRldmljZXMsIGFuZCBpbnRlcmZhY2VzIGxpc3RzLgotICogQGNsYXNzIC0gcG9pbnRlciBiYWNrIHRvIHRoZSBzdHJ1Y3QgY2xhc3MgdGhhdCB0aGlzIHN0cnVjdHVyZSBpcyBhc3NvY2lhdGVkCi0gKiB3aXRoLgotICoKLSAqIFRoaXMgc3RydWN0dXJlIGlzIHRoZSBvbmUgdGhhdCBpcyB0aGUgYWN0dWFsIGtvYmplY3QgYWxsb3dpbmcgc3RydWN0Ci0gKiBjbGFzcyB0byBiZSBzdGF0aWNhbGx5IGFsbG9jYXRlZCBzYWZlbHkuICBOb3RoaW5nIG91dHNpZGUgb2YgdGhlIGRyaXZlcgotICogY29yZSBzaG91bGQgZXZlciB0b3VjaCB0aGVzZSBmaWVsZHMuCi0gKi8KLXN0cnVjdCBjbGFzc19wcml2YXRlIHsKLQlzdHJ1Y3Qga3NldCBjbGFzc19zdWJzeXM7Ci0Jc3RydWN0IGtsaXN0IGNsYXNzX2RldmljZXM7Ci0Jc3RydWN0IGxpc3RfaGVhZCBjbGFzc19pbnRlcmZhY2VzOwotCXN0cnVjdCBrc2V0IGNsYXNzX2RpcnM7Ci0Jc3RydWN0IG11dGV4IGNsYXNzX211dGV4OwotCXN0cnVjdCBjbGFzcyAqY2xhc3M7Ci19OwotI2RlZmluZSB0b19jbGFzcyhvYmopCVwKLQljb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgY2xhc3NfcHJpdmF0ZSwgY2xhc3Nfc3Vic3lzLmtvYmopCi0KIC8qKgogICogc3RydWN0IGRldmljZV9wcml2YXRlIC0gc3RydWN0dXJlIHRvIGhvbGQgdGhlIHByaXZhdGUgdG8gdGhlIGRyaXZlciBjb3JlIHBvcnRpb25zIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlLgogICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9idXMuYyBiL2RyaXZlcnMvYmFzZS9idXMuYwppbmRleCAzM2MyNzBhLi5lMjQzYmQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvYnVzLmMKKysrIGIvZHJpdmVycy9iYXNlL2J1cy5jCkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSAicG93ZXIvcG93ZXIuaCIKIAogI2RlZmluZSB0b19idXNfYXR0cihfYXR0cikgY29udGFpbmVyX29mKF9hdHRyLCBzdHJ1Y3QgYnVzX2F0dHJpYnV0ZSwgYXR0cikKLSNkZWZpbmUgdG9fYnVzKG9iaikgY29udGFpbmVyX29mKG9iaiwgc3RydWN0IGJ1c190eXBlX3ByaXZhdGUsIHN1YnN5cy5rb2JqKQogCiAvKgogICogc3lzZnMgYmluZGluZ3MgZm9yIGRyaXZlcnMKQEAgLTk2LDExICs5NSwxMSBAQAogCQkJICAgICBjaGFyICpidWYpCiB7CiAJc3RydWN0IGJ1c19hdHRyaWJ1dGUgKmJ1c19hdHRyID0gdG9fYnVzX2F0dHIoYXR0cik7Ci0Jc3RydWN0IGJ1c190eXBlX3ByaXZhdGUgKmJ1c19wcml2ID0gdG9fYnVzKGtvYmopOworCXN0cnVjdCBzdWJzeXNfcHJpdmF0ZSAqc3Vic3lzX3ByaXYgPSB0b19zdWJzeXNfcHJpdmF0ZShrb2JqKTsKIAlzc2l6ZV90IHJldCA9IDA7CiAKIAlpZiAoYnVzX2F0dHItPnNob3cpCi0JCXJldCA9IGJ1c19hdHRyLT5zaG93KGJ1c19wcml2LT5idXMsIGJ1Zik7CisJCXJldCA9IGJ1c19hdHRyLT5zaG93KHN1YnN5c19wcml2LT5idXMsIGJ1Zik7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTA4LDExICsxMDcsMTEgQEAKIAkJCSAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBidXNfYXR0cmlidXRlICpidXNfYXR0ciA9IHRvX2J1c19hdHRyKGF0dHIpOwotCXN0cnVjdCBidXNfdHlwZV9wcml2YXRlICpidXNfcHJpdiA9IHRvX2J1cyhrb2JqKTsKKwlzdHJ1Y3Qgc3Vic3lzX3ByaXZhdGUgKnN1YnN5c19wcml2ID0gdG9fc3Vic3lzX3ByaXZhdGUoa29iaik7CiAJc3NpemVfdCByZXQgPSAwOwogCiAJaWYgKGJ1c19hdHRyLT5zdG9yZSkKLQkJcmV0ID0gYnVzX2F0dHItPnN0b3JlKGJ1c19wcml2LT5idXMsIGJ1ZiwgY291bnQpOworCQlyZXQgPSBidXNfYXR0ci0+c3RvcmUoc3Vic3lzX3ByaXYtPmJ1cywgYnVmLCBjb3VudCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtODU4LDkgKzg1Nyw5IEBACiBpbnQgYnVzX3JlZ2lzdGVyKHN0cnVjdCBidXNfdHlwZSAqYnVzKQogewogCWludCByZXR2YWw7Ci0Jc3RydWN0IGJ1c190eXBlX3ByaXZhdGUgKnByaXY7CisJc3RydWN0IHN1YnN5c19wcml2YXRlICpwcml2OwogCi0JcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBidXNfdHlwZV9wcml2YXRlKSwgR0ZQX0tFUk5FTCk7CisJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzdWJzeXNfcHJpdmF0ZSksIEdGUF9LRVJORUwpOwogCWlmICghcHJpdikKIAkJcmV0dXJuIC1FTk9NRU07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9jbGFzcy5jIGIvZHJpdmVycy9iYXNlL2NsYXNzLmMKaW5kZXggOWM2M2E1Ni4uNGYxZGYyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2NsYXNzLmMKKysrIGIvZHJpdmVycy9iYXNlL2NsYXNzLmMKQEAgLTI3LDcgKzI3LDcgQEAKIAkJCSAgICAgICBjaGFyICpidWYpCiB7CiAJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqY2xhc3NfYXR0ciA9IHRvX2NsYXNzX2F0dHIoYXR0cik7Ci0Jc3RydWN0IGNsYXNzX3ByaXZhdGUgKmNwID0gdG9fY2xhc3Moa29iaik7CisJc3RydWN0IHN1YnN5c19wcml2YXRlICpjcCA9IHRvX3N1YnN5c19wcml2YXRlKGtvYmopOwogCXNzaXplX3QgcmV0ID0gLUVJTzsKIAogCWlmIChjbGFzc19hdHRyLT5zaG93KQpAQCAtMzksNyArMzksNyBAQAogCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmNsYXNzX2F0dHIgPSB0b19jbGFzc19hdHRyKGF0dHIpOwotCXN0cnVjdCBjbGFzc19wcml2YXRlICpjcCA9IHRvX2NsYXNzKGtvYmopOworCXN0cnVjdCBzdWJzeXNfcHJpdmF0ZSAqY3AgPSB0b19zdWJzeXNfcHJpdmF0ZShrb2JqKTsKIAlzc2l6ZV90IHJldCA9IC1FSU87CiAKIAlpZiAoY2xhc3NfYXR0ci0+c3RvcmUpCkBAIC00OSw3ICs0OSw3IEBACiAKIHN0YXRpYyB2b2lkIGNsYXNzX3JlbGVhc2Uoc3RydWN0IGtvYmplY3QgKmtvYmopCiB7Ci0Jc3RydWN0IGNsYXNzX3ByaXZhdGUgKmNwID0gdG9fY2xhc3Moa29iaik7CisJc3RydWN0IHN1YnN5c19wcml2YXRlICpjcCA9IHRvX3N1YnN5c19wcml2YXRlKGtvYmopOwogCXN0cnVjdCBjbGFzcyAqY2xhc3MgPSBjcC0+Y2xhc3M7CiAKIAlwcl9kZWJ1ZygiY2xhc3MgJyVzJzogcmVsZWFzZS5cbiIsIGNsYXNzLT5uYW1lKTsKQEAgLTY1LDcgKzY1LDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBrb2JqX25zX3R5cGVfb3BlcmF0aW9ucyAqY2xhc3NfY2hpbGRfbnNfdHlwZShzdHJ1Y3Qga29iamVjdCAqa29iaikKIHsKLQlzdHJ1Y3QgY2xhc3NfcHJpdmF0ZSAqY3AgPSB0b19jbGFzcyhrb2JqKTsKKwlzdHJ1Y3Qgc3Vic3lzX3ByaXZhdGUgKmNwID0gdG9fc3Vic3lzX3ByaXZhdGUoa29iaik7CiAJc3RydWN0IGNsYXNzICpjbGFzcyA9IGNwLT5jbGFzczsKIAogCXJldHVybiBjbGFzcy0+bnNfdHlwZTsKQEAgLTgyLDcgKzgyLDcgQEAKIAkuY2hpbGRfbnNfdHlwZQk9IGNsYXNzX2NoaWxkX25zX3R5cGUsCiB9OwogCi0vKiBIb3RwbHVnIGV2ZW50cyBmb3IgY2xhc3NlcyBnbyB0byB0aGUgY2xhc3MgY2xhc3Nfc3Vic3lzICovCisvKiBIb3RwbHVnIGV2ZW50cyBmb3IgY2xhc3NlcyBnbyB0byB0aGUgY2xhc3Mgc3Vic3lzICovCiBzdGF0aWMgc3RydWN0IGtzZXQgKmNsYXNzX2tzZXQ7CiAKIApAQCAtOTAsNyArOTAsNyBAQAogewogCWludCBlcnJvcjsKIAlpZiAoY2xzKQotCQllcnJvciA9IHN5c2ZzX2NyZWF0ZV9maWxlKCZjbHMtPnAtPmNsYXNzX3N1YnN5cy5rb2JqLAorCQllcnJvciA9IHN5c2ZzX2NyZWF0ZV9maWxlKCZjbHMtPnAtPnN1YnN5cy5rb2JqLAogCQkJCQkgICZhdHRyLT5hdHRyKTsKIAllbHNlCiAJCWVycm9yID0gLUVJTlZBTDsKQEAgLTEwMCwyMCArMTAwLDIwIEBACiB2b2lkIGNsYXNzX3JlbW92ZV9maWxlKHN0cnVjdCBjbGFzcyAqY2xzLCBjb25zdCBzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyKQogewogCWlmIChjbHMpCi0JCXN5c2ZzX3JlbW92ZV9maWxlKCZjbHMtPnAtPmNsYXNzX3N1YnN5cy5rb2JqLCAmYXR0ci0+YXR0cik7CisJCXN5c2ZzX3JlbW92ZV9maWxlKCZjbHMtPnAtPnN1YnN5cy5rb2JqLCAmYXR0ci0+YXR0cik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY2xhc3MgKmNsYXNzX2dldChzdHJ1Y3QgY2xhc3MgKmNscykKIHsKIAlpZiAoY2xzKQotCQlrc2V0X2dldCgmY2xzLT5wLT5jbGFzc19zdWJzeXMpOworCQlrc2V0X2dldCgmY2xzLT5wLT5zdWJzeXMpOwogCXJldHVybiBjbHM7CiB9CiAKIHN0YXRpYyB2b2lkIGNsYXNzX3B1dChzdHJ1Y3QgY2xhc3MgKmNscykKIHsKIAlpZiAoY2xzKQotCQlrc2V0X3B1dCgmY2xzLT5wLT5jbGFzc19zdWJzeXMpOworCQlrc2V0X3B1dCgmY2xzLT5wLT5zdWJzeXMpOwogfQogCiBzdGF0aWMgaW50IGFkZF9jbGFzc19hdHRycyhzdHJ1Y3QgY2xhc3MgKmNscykKQEAgLTE2Miw3ICsxNjIsNyBAQAogCiBpbnQgX19jbGFzc19yZWdpc3RlcihzdHJ1Y3QgY2xhc3MgKmNscywgc3RydWN0IGxvY2tfY2xhc3Nfa2V5ICprZXkpCiB7Ci0Jc3RydWN0IGNsYXNzX3ByaXZhdGUgKmNwOworCXN0cnVjdCBzdWJzeXNfcHJpdmF0ZSAqY3A7CiAJaW50IGVycm9yOwogCiAJcHJfZGVidWcoImRldmljZSBjbGFzcyAnJXMnOiByZWdpc3RlcmluZ1xuIiwgY2xzLT5uYW1lKTsKQEAgLTE3MCwxMSArMTcwLDExIEBACiAJY3AgPSBremFsbG9jKHNpemVvZigqY3ApLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNwKQogCQlyZXR1cm4gLUVOT01FTTsKLQlrbGlzdF9pbml0KCZjcC0+Y2xhc3NfZGV2aWNlcywga2xpc3RfY2xhc3NfZGV2X2dldCwga2xpc3RfY2xhc3NfZGV2X3B1dCk7CisJa2xpc3RfaW5pdCgmY3AtPmtsaXN0X2RldmljZXMsIGtsaXN0X2NsYXNzX2Rldl9nZXQsIGtsaXN0X2NsYXNzX2Rldl9wdXQpOwogCUlOSVRfTElTVF9IRUFEKCZjcC0+Y2xhc3NfaW50ZXJmYWNlcyk7Ci0Ja3NldF9pbml0KCZjcC0+Y2xhc3NfZGlycyk7CisJa3NldF9pbml0KCZjcC0+Z2x1ZV9kaXJzKTsKIAlfX211dGV4X2luaXQoJmNwLT5jbGFzc19tdXRleCwgInN0cnVjdCBjbGFzcyBtdXRleCIsIGtleSk7Ci0JZXJyb3IgPSBrb2JqZWN0X3NldF9uYW1lKCZjcC0+Y2xhc3Nfc3Vic3lzLmtvYmosICIlcyIsIGNscy0+bmFtZSk7CisJZXJyb3IgPSBrb2JqZWN0X3NldF9uYW1lKCZjcC0+c3Vic3lzLmtvYmosICIlcyIsIGNscy0+bmFtZSk7CiAJaWYgKGVycm9yKSB7CiAJCWtmcmVlKGNwKTsKIAkJcmV0dXJuIGVycm9yOwpAQCAtMTg3LDE1ICsxODcsMTUgQEAKICNpZiBkZWZpbmVkKENPTkZJR19CTE9DSykKIAkvKiBsZXQgdGhlIGJsb2NrIGNsYXNzIGRpcmVjdG9yeSBzaG93IHVwIGluIHRoZSByb290IG9mIHN5c2ZzICovCiAJaWYgKCFzeXNmc19kZXByZWNhdGVkIHx8IGNscyAhPSAmYmxvY2tfY2xhc3MpCi0JCWNwLT5jbGFzc19zdWJzeXMua29iai5rc2V0ID0gY2xhc3Nfa3NldDsKKwkJY3AtPnN1YnN5cy5rb2JqLmtzZXQgPSBjbGFzc19rc2V0OwogI2Vsc2UKLQljcC0+Y2xhc3Nfc3Vic3lzLmtvYmoua3NldCA9IGNsYXNzX2tzZXQ7CisJY3AtPnN1YnN5cy5rb2JqLmtzZXQgPSBjbGFzc19rc2V0OwogI2VuZGlmCi0JY3AtPmNsYXNzX3N1YnN5cy5rb2JqLmt0eXBlID0gJmNsYXNzX2t0eXBlOworCWNwLT5zdWJzeXMua29iai5rdHlwZSA9ICZjbGFzc19rdHlwZTsKIAljcC0+Y2xhc3MgPSBjbHM7CiAJY2xzLT5wID0gY3A7CiAKLQllcnJvciA9IGtzZXRfcmVnaXN0ZXIoJmNwLT5jbGFzc19zdWJzeXMpOworCWVycm9yID0ga3NldF9yZWdpc3RlcigmY3AtPnN1YnN5cyk7CiAJaWYgKGVycm9yKSB7CiAJCWtmcmVlKGNwKTsKIAkJcmV0dXJuIGVycm9yOwpAQCAtMjEwLDcgKzIxMCw3IEBACiB7CiAJcHJfZGVidWcoImRldmljZSBjbGFzcyAnJXMnOiB1bnJlZ2lzdGVyaW5nXG4iLCBjbHMtPm5hbWUpOwogCXJlbW92ZV9jbGFzc19hdHRycyhjbHMpOwotCWtzZXRfdW5yZWdpc3RlcigmY2xzLT5wLT5jbGFzc19zdWJzeXMpOworCWtzZXRfdW5yZWdpc3RlcigmY2xzLT5wLT5zdWJzeXMpOwogfQogCiBzdGF0aWMgdm9pZCBjbGFzc19jcmVhdGVfcmVsZWFzZShzdHJ1Y3QgY2xhc3MgKmNscykKQEAgLTI5NSw3ICsyOTUsNyBAQAogCiAJaWYgKHN0YXJ0KQogCQlzdGFydF9rbm9kZSA9ICZzdGFydC0+a25vZGVfY2xhc3M7Ci0Ja2xpc3RfaXRlcl9pbml0X25vZGUoJmNsYXNzLT5wLT5jbGFzc19kZXZpY2VzLCAmaXRlci0+a2ksIHN0YXJ0X2tub2RlKTsKKwlrbGlzdF9pdGVyX2luaXRfbm9kZSgmY2xhc3MtPnAtPmtsaXN0X2RldmljZXMsICZpdGVyLT5raSwgc3RhcnRfa25vZGUpOwogCWl0ZXItPnR5cGUgPSB0eXBlOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoY2xhc3NfZGV2X2l0ZXJfaW5pdCk7CkBAIC00ODIsOCArNDgyLDggQEAKIAljbGFzc19wdXQocGFyZW50KTsKIH0KIAotc3NpemVfdCBzaG93X2NsYXNzX2F0dHJfc3RyaW5nKHN0cnVjdCBjbGFzcyAqY2xhc3MsIHN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAJY2hhciAqYnVmKQorc3NpemVfdCBzaG93X2NsYXNzX2F0dHJfc3RyaW5nKHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJCQkgICAgICAgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGVfc3RyaW5nICpjczsKIAljcyA9IGNvbnRhaW5lcl9vZihhdHRyLCBzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlX3N0cmluZywgYXR0cik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvY29yZS5jIGIvZHJpdmVycy9iYXNlL2NvcmUuYwppbmRleCA2ZWQ2NDU0Li4wODBlOWNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvY29yZS5jCisrKyBiL2RyaXZlcnMvYmFzZS9jb3JlLmMKQEAgLTMzOCw2ICszMzgsMzUgQEAKIAkJCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZhdHRyc1tpXSk7CiB9CiAKK3N0YXRpYyBpbnQgZGV2aWNlX2FkZF9iaW5fYXR0cmlidXRlcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0cnMpCit7CisJaW50IGVycm9yID0gMDsKKwlpbnQgaTsKKworCWlmIChhdHRycykgeworCQlmb3IgKGkgPSAwOyBhdHRyX25hbWUoYXR0cnNbaV0pOyBpKyspIHsKKwkJCWVycm9yID0gZGV2aWNlX2NyZWF0ZV9iaW5fZmlsZShkZXYsICZhdHRyc1tpXSk7CisJCQlpZiAoZXJyb3IpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGVycm9yKQorCQkJd2hpbGUgKC0taSA+PSAwKQorCQkJCWRldmljZV9yZW1vdmVfYmluX2ZpbGUoZGV2LCAmYXR0cnNbaV0pOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyB2b2lkIGRldmljZV9yZW1vdmVfYmluX2F0dHJpYnV0ZXMoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHJzKQoreworCWludCBpOworCisJaWYgKGF0dHJzKQorCQlmb3IgKGkgPSAwOyBhdHRyX25hbWUoYXR0cnNbaV0pOyBpKyspCisJCQlkZXZpY2VfcmVtb3ZlX2Jpbl9maWxlKGRldiwgJmF0dHJzW2ldKTsKK30KKwogc3RhdGljIGludCBkZXZpY2VfYWRkX2dyb3VwcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkgICAgIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKipncm91cHMpCiB7CkBAIC0zNzgsMTIgKzQwNywxNSBAQAogCQllcnJvciA9IGRldmljZV9hZGRfYXR0cmlidXRlcyhkZXYsIGNsYXNzLT5kZXZfYXR0cnMpOwogCQlpZiAoZXJyb3IpCiAJCQlyZXR1cm4gZXJyb3I7CisJCWVycm9yID0gZGV2aWNlX2FkZF9iaW5fYXR0cmlidXRlcyhkZXYsIGNsYXNzLT5kZXZfYmluX2F0dHJzKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBlcnJfcmVtb3ZlX2NsYXNzX2F0dHJzOwogCX0KIAogCWlmICh0eXBlKSB7CiAJCWVycm9yID0gZGV2aWNlX2FkZF9ncm91cHMoZGV2LCB0eXBlLT5ncm91cHMpOwogCQlpZiAoZXJyb3IpCi0JCQlnb3RvIGVycl9yZW1vdmVfY2xhc3NfYXR0cnM7CisJCQlnb3RvIGVycl9yZW1vdmVfY2xhc3NfYmluX2F0dHJzOwogCX0KIAogCWVycm9yID0gZGV2aWNlX2FkZF9ncm91cHMoZGV2LCBkZXYtPmdyb3Vwcyk7CkBAIC0zOTUsNiArNDI3LDkgQEAKICBlcnJfcmVtb3ZlX3R5cGVfZ3JvdXBzOgogCWlmICh0eXBlKQogCQlkZXZpY2VfcmVtb3ZlX2dyb3VwcyhkZXYsIHR5cGUtPmdyb3Vwcyk7CisgZXJyX3JlbW92ZV9jbGFzc19iaW5fYXR0cnM6CisJaWYgKGNsYXNzKQorCQlkZXZpY2VfcmVtb3ZlX2Jpbl9hdHRyaWJ1dGVzKGRldiwgY2xhc3MtPmRldl9iaW5fYXR0cnMpOwogIGVycl9yZW1vdmVfY2xhc3NfYXR0cnM6CiAJaWYgKGNsYXNzKQogCQlkZXZpY2VfcmVtb3ZlX2F0dHJpYnV0ZXMoZGV2LCBjbGFzcy0+ZGV2X2F0dHJzKTsKQEAgLTQxMiw4ICs0NDcsMTAgQEAKIAlpZiAodHlwZSkKIAkJZGV2aWNlX3JlbW92ZV9ncm91cHMoZGV2LCB0eXBlLT5ncm91cHMpOwogCi0JaWYgKGNsYXNzKQorCWlmIChjbGFzcykgewogCQlkZXZpY2VfcmVtb3ZlX2F0dHJpYnV0ZXMoZGV2LCBjbGFzcy0+ZGV2X2F0dHJzKTsKKwkJZGV2aWNlX3JlbW92ZV9iaW5fYXR0cmlidXRlcyhkZXYsIGNsYXNzLT5kZXZfYmluX2F0dHJzKTsKKwl9CiB9CiAKIApAQCAtNjEwLDcgKzY0Nyw3IEBACiAJZGlyLT5jbGFzcyA9IGNsYXNzOwogCWtvYmplY3RfaW5pdCgmZGlyLT5rb2JqLCAmY2xhc3NfZGlyX2t0eXBlKTsKIAotCWRpci0+a29iai5rc2V0ID0gJmNsYXNzLT5wLT5jbGFzc19kaXJzOworCWRpci0+a29iai5rc2V0ID0gJmNsYXNzLT5wLT5nbHVlX2RpcnM7CiAKIAlyZXR2YWwgPSBrb2JqZWN0X2FkZCgmZGlyLT5rb2JqLCBwYXJlbnRfa29iaiwgIiVzIiwgY2xhc3MtPm5hbWUpOwogCWlmIChyZXR2YWwgPCAwKSB7CkBAIC02MzUsNyArNjcyLDcgQEAKIAkJaWYgKHN5c2ZzX2RlcHJlY2F0ZWQgJiYgZGV2LT5jbGFzcyA9PSAmYmxvY2tfY2xhc3MpIHsKIAkJCWlmIChwYXJlbnQgJiYgcGFyZW50LT5jbGFzcyA9PSAmYmxvY2tfY2xhc3MpCiAJCQkJcmV0dXJuICZwYXJlbnQtPmtvYmo7Ci0JCQlyZXR1cm4gJmJsb2NrX2NsYXNzLnAtPmNsYXNzX3N1YnN5cy5rb2JqOworCQkJcmV0dXJuICZibG9ja19jbGFzcy5wLT5zdWJzeXMua29iajsKIAkJfQogI2VuZGlmCiAKQEAgLTY1NCwxMyArNjkxLDEzIEBACiAJCW11dGV4X2xvY2soJmdkcF9tdXRleCk7CiAKIAkJLyogZmluZCBvdXIgY2xhc3MtZGlyZWN0b3J5IGF0IHRoZSBwYXJlbnQgYW5kIHJlZmVyZW5jZSBpdCAqLwotCQlzcGluX2xvY2soJmRldi0+Y2xhc3MtPnAtPmNsYXNzX2RpcnMubGlzdF9sb2NrKTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShrLCAmZGV2LT5jbGFzcy0+cC0+Y2xhc3NfZGlycy5saXN0LCBlbnRyeSkKKwkJc3Bpbl9sb2NrKCZkZXYtPmNsYXNzLT5wLT5nbHVlX2RpcnMubGlzdF9sb2NrKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShrLCAmZGV2LT5jbGFzcy0+cC0+Z2x1ZV9kaXJzLmxpc3QsIGVudHJ5KQogCQkJaWYgKGstPnBhcmVudCA9PSBwYXJlbnRfa29iaikgewogCQkJCWtvYmogPSBrb2JqZWN0X2dldChrKTsKIAkJCQlicmVhazsKIAkJCX0KLQkJc3Bpbl91bmxvY2soJmRldi0+Y2xhc3MtPnAtPmNsYXNzX2RpcnMubGlzdF9sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmRldi0+Y2xhc3MtPnAtPmdsdWVfZGlycy5saXN0X2xvY2spOwogCQlpZiAoa29iaikgewogCQkJbXV0ZXhfdW5sb2NrKCZnZHBfbXV0ZXgpOwogCQkJcmV0dXJuIGtvYmo7CkBAIC02ODIsNyArNzE5LDcgQEAKIHsKIAkvKiBzZWUgaWYgd2UgbGl2ZSBpbiBhICJnbHVlIiBkaXJlY3RvcnkgKi8KIAlpZiAoIWdsdWVfZGlyIHx8ICFkZXYtPmNsYXNzIHx8Ci0JICAgIGdsdWVfZGlyLT5rc2V0ICE9ICZkZXYtPmNsYXNzLT5wLT5jbGFzc19kaXJzKQorCSAgICBnbHVlX2Rpci0+a3NldCAhPSAmZGV2LT5jbGFzcy0+cC0+Z2x1ZV9kaXJzKQogCQlyZXR1cm47CiAKIAlrb2JqZWN0X3B1dChnbHVlX2Rpcik7CkBAIC03MDksNyArNzQ2LDcgQEAKIAkJcmV0dXJuIDA7CiAKIAllcnJvciA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZkZXYtPmtvYmosCi0JCQkJICAmZGV2LT5jbGFzcy0+cC0+Y2xhc3Nfc3Vic3lzLmtvYmosCisJCQkJICAmZGV2LT5jbGFzcy0+cC0+c3Vic3lzLmtvYmosCiAJCQkJICAic3Vic3lzdGVtIik7CiAJaWYgKGVycm9yKQogCQlnb3RvIG91dDsKQEAgLTcyOCw3ICs3NjUsNyBAQAogI2VuZGlmCiAKIAkvKiBsaW5rIGluIHRoZSBjbGFzcyBkaXJlY3RvcnkgcG9pbnRpbmcgdG8gdGhlIGRldmljZSAqLwotCWVycm9yID0gc3lzZnNfY3JlYXRlX2xpbmsoJmRldi0+Y2xhc3MtPnAtPmNsYXNzX3N1YnN5cy5rb2JqLAorCWVycm9yID0gc3lzZnNfY3JlYXRlX2xpbmsoJmRldi0+Y2xhc3MtPnAtPnN1YnN5cy5rb2JqLAogCQkJCSAgJmRldi0+a29iaiwgZGV2X25hbWUoZGV2KSk7CiAJaWYgKGVycm9yKQogCQlnb3RvIG91dF9kZXZpY2U7CkBAIC03NTYsNyArNzkzLDcgQEAKIAlpZiAoc3lzZnNfZGVwcmVjYXRlZCAmJiBkZXYtPmNsYXNzID09ICZibG9ja19jbGFzcykKIAkJcmV0dXJuOwogI2VuZGlmCi0Jc3lzZnNfZGVsZXRlX2xpbmsoJmRldi0+Y2xhc3MtPnAtPmNsYXNzX3N1YnN5cy5rb2JqLCAmZGV2LT5rb2JqLCBkZXZfbmFtZShkZXYpKTsKKwlzeXNmc19kZWxldGVfbGluaygmZGV2LT5jbGFzcy0+cC0+c3Vic3lzLmtvYmosICZkZXYtPmtvYmosIGRldl9uYW1lKGRldikpOwogfQogCiAvKioKQEAgLTk0Nyw3ICs5ODQsNyBAQAogCQltdXRleF9sb2NrKCZkZXYtPmNsYXNzLT5wLT5jbGFzc19tdXRleCk7CiAJCS8qIHRpZSB0aGUgY2xhc3MgdG8gdGhlIGRldmljZSAqLwogCQlrbGlzdF9hZGRfdGFpbCgmZGV2LT5rbm9kZV9jbGFzcywKLQkJCSAgICAgICAmZGV2LT5jbGFzcy0+cC0+Y2xhc3NfZGV2aWNlcyk7CisJCQkgICAgICAgJmRldi0+Y2xhc3MtPnAtPmtsaXN0X2RldmljZXMpOwogCiAJCS8qIG5vdGlmeSBhbnkgaW50ZXJmYWNlcyB0aGF0IHRoZSBkZXZpY2UgaXMgaGVyZSAqLwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNsYXNzX2ludGYsCkBAIC0xNTEzLDYgKzE1NTAsOCBAQAogICogZXhjbHVzaW9uIGJldHdlZW4gdHdvIGRpZmZlcmVudCBjYWxscyBvZiBkZXZpY2VfcmVuYW1lCiAgKiBvbiB0aGUgc2FtZSBkZXZpY2UgdG8gZW5zdXJlIHRoYXQgbmV3X25hbWUgaXMgdmFsaWQgYW5kCiAgKiB3b24ndCBjb25mbGljdCB3aXRoIG90aGVyIGRldmljZXMuCisgKgorICogIk5ldmVyIHVzZSB0aGlzIGZ1bmN0aW9uLCBiYWQgdGhpbmdzIHdpbGwgaGFwcGVuIiAtIGdyZWdraAogICovCiBpbnQgZGV2aWNlX3JlbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKm5ld19uYW1lKQogewpAQCAtMTUzNSw3ICsxNTc0LDcgQEAKIAl9CiAKIAlpZiAoZGV2LT5jbGFzcykgewotCQllcnJvciA9IHN5c2ZzX3JlbmFtZV9saW5rKCZkZXYtPmNsYXNzLT5wLT5jbGFzc19zdWJzeXMua29iaiwKKwkJZXJyb3IgPSBzeXNmc19yZW5hbWVfbGluaygmZGV2LT5jbGFzcy0+cC0+c3Vic3lzLmtvYmosCiAJCQkmZGV2LT5rb2JqLCBvbGRfZGV2aWNlX25hbWUsIG5ld19uYW1lKTsKIAkJaWYgKGVycm9yKQogCQkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvZ2VuZXJpY19vcHMuYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9nZW5lcmljX29wcy5jCmluZGV4IDgxZjJjODQuLjQyZjk3ZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci9nZW5lcmljX29wcy5jCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci9nZW5lcmljX29wcy5jCkBAIC0zOSw3ICszOSw3IEBACiAgKgogICogSWYgUE0gb3BlcmF0aW9ucyBhcmUgZGVmaW5lZCBmb3IgdGhlIEBkZXYncyBkcml2ZXIgYW5kIHRoZXkgaW5jbHVkZQogICogLT5ydW50aW1lX3N1c3BlbmQoKSwgZXhlY3V0ZSBpdCBhbmQgcmV0dXJuIGl0cyBlcnJvciBjb2RlLiAgT3RoZXJ3aXNlLAotICogcmV0dXJuIC1FSU5WQUwuCisgKiByZXR1cm4gMC4KICAqLwogaW50IHBtX2dlbmVyaWNfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKQEAgLTU4LDcgKzU4LDcgQEAKICAqCiAgKiBJZiBQTSBvcGVyYXRpb25zIGFyZSBkZWZpbmVkIGZvciB0aGUgQGRldidzIGRyaXZlciBhbmQgdGhleSBpbmNsdWRlCiAgKiAtPnJ1bnRpbWVfcmVzdW1lKCksIGV4ZWN1dGUgaXQgYW5kIHJldHVybiBpdHMgZXJyb3IgY29kZS4gIE90aGVyd2lzZSwKLSAqIHJldHVybiAtRUlOVkFMLgorICogcmV0dXJuIDAuCiAgKi8KIGludCBwbV9nZW5lcmljX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKQEAgLTE4NSw3ICsxODUsNyBAQAogCQlyZXR1cm4gMDsKIAogCXJldCA9IGNhbGxiYWNrKGRldik7Ci0JaWYgKCFyZXQpIHsKKwlpZiAoIXJldCAmJiBwbV9ydW50aW1lX2VuYWJsZWQoZGV2KSkgewogCQlwbV9ydW50aW1lX2Rpc2FibGUoZGV2KTsKIAkJcG1fcnVudGltZV9zZXRfYWN0aXZlKGRldik7CiAJCXBtX3J1bnRpbWVfZW5hYmxlKGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvbWFpbi5jIGIvZHJpdmVycy9iYXNlL3Bvd2VyL21haW4uYwppbmRleCBlYWQzZTc5Li4yYTUyMjcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvbWFpbi5jCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci9tYWluLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2FzeW5jLmg+CisjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgogCiAjaW5jbHVkZSAiLi4vYmFzZS5oIgogI2luY2x1ZGUgInBvd2VyLmgiCkBAIC00MSwxNiArNDIsMTMgQEAKICAqLwogCiBMSVNUX0hFQUQoZHBtX2xpc3QpOworTElTVF9IRUFEKGRwbV9wcmVwYXJlZF9saXN0KTsKK0xJU1RfSEVBRChkcG1fc3VzcGVuZGVkX2xpc3QpOworTElTVF9IRUFEKGRwbV9ub2lycV9saXN0KTsKIAogc3RhdGljIERFRklORV9NVVRFWChkcG1fbGlzdF9tdHgpOwogc3RhdGljIHBtX21lc3NhZ2VfdCBwbV90cmFuc2l0aW9uOwogCi0vKgotICogU2V0IG9uY2UgdGhlIHByZXBhcmF0aW9uIG9mIGRldmljZXMgZm9yIGEgUE0gdHJhbnNpdGlvbiBoYXMgc3RhcnRlZCwgcmVzZXQKLSAqIGJlZm9yZSBzdGFydGluZyB0byByZXN1bWUgZGV2aWNlcy4gIFByb3RlY3RlZCBieSBkcG1fbGlzdF9tdHguCi0gKi8KLXN0YXRpYyBib29sIHRyYW5zaXRpb25fc3RhcnRlZDsKLQogc3RhdGljIGludCBhc3luY19lcnJvcjsKIAogLyoqCkBAIC01OSw3ICs1Nyw3IEBACiAgKi8KIHZvaWQgZGV2aWNlX3BtX2luaXQoc3RydWN0IGRldmljZSAqZGV2KQogewotCWRldi0+cG93ZXIuc3RhdHVzID0gRFBNX09OOworCWRldi0+cG93ZXIuaW5fc3VzcGVuZCA9IGZhbHNlOwogCWluaXRfY29tcGxldGlvbigmZGV2LT5wb3dlci5jb21wbGV0aW9uKTsKIAljb21wbGV0ZV9hbGwoJmRldi0+cG93ZXIuY29tcGxldGlvbik7CiAJZGV2LT5wb3dlci53YWtldXAgPSBOVUxMOwpAQCAtOTAsMjIgKzg4LDExIEBACiB2b2lkIGRldmljZV9wbV9hZGQoc3RydWN0IGRldmljZSAqZGV2KQogewogCXByX2RlYnVnKCJQTTogQWRkaW5nIGluZm8gZm9yICVzOiVzXG4iLAotCQkgZGV2LT5idXMgPyBkZXYtPmJ1cy0+bmFtZSA6ICJObyBCdXMiLAotCQkga29iamVjdF9uYW1lKCZkZXYtPmtvYmopKTsKKwkJIGRldi0+YnVzID8gZGV2LT5idXMtPm5hbWUgOiAiTm8gQnVzIiwgZGV2X25hbWUoZGV2KSk7CiAJbXV0ZXhfbG9jaygmZHBtX2xpc3RfbXR4KTsKLQlpZiAoZGV2LT5wYXJlbnQpIHsKLQkJaWYgKGRldi0+cGFyZW50LT5wb3dlci5zdGF0dXMgPj0gRFBNX1NVU1BFTkRJTkcpCi0JCQlkZXZfd2FybihkZXYsICJwYXJlbnQgJXMgc2hvdWxkIG5vdCBiZSBzbGVlcGluZ1xuIiwKLQkJCQkgZGV2X25hbWUoZGV2LT5wYXJlbnQpKTsKLQl9IGVsc2UgaWYgKHRyYW5zaXRpb25fc3RhcnRlZCkgewotCQkvKgotCQkgKiBXZSByZWZ1c2UgdG8gcmVnaXN0ZXIgcGFyZW50bGVzcyBkZXZpY2VzIHdoaWxlIGEgUE0KLQkJICogdHJhbnNpdGlvbiBpcyBpbiBwcm9ncmVzcyBpbiBvcmRlciB0byBhdm9pZCBsZWF2aW5nIHRoZW0KLQkJICogdW5oYW5kbGVkIGRvd24gdGhlIHJvYWQKLQkJICovCi0JCWRldl9XQVJOKGRldiwgIlBhcmVudGxlc3MgZGV2aWNlIHJlZ2lzdGVyZWQgZHVyaW5nIGEgUE0gdHJhbnNhY3Rpb25cbiIpOwotCX0KLQorCWlmIChkZXYtPnBhcmVudCAmJiBkZXYtPnBhcmVudC0+cG93ZXIuaW5fc3VzcGVuZCkKKwkJZGV2X3dhcm4oZGV2LCAicGFyZW50ICVzIHNob3VsZCBub3QgYmUgc2xlZXBpbmdcbiIsCisJCQlkZXZfbmFtZShkZXYtPnBhcmVudCkpOwogCWxpc3RfYWRkX3RhaWwoJmRldi0+cG93ZXIuZW50cnksICZkcG1fbGlzdCk7CiAJbXV0ZXhfdW5sb2NrKCZkcG1fbGlzdF9tdHgpOwogfQpAQCAtMTE3LDggKzEwNCw3IEBACiB2b2lkIGRldmljZV9wbV9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQogewogCXByX2RlYnVnKCJQTTogUmVtb3ZpbmcgaW5mbyBmb3IgJXM6JXNcbiIsCi0JCSBkZXYtPmJ1cyA/IGRldi0+YnVzLT5uYW1lIDogIk5vIEJ1cyIsCi0JCSBrb2JqZWN0X25hbWUoJmRldi0+a29iaikpOworCQkgZGV2LT5idXMgPyBkZXYtPmJ1cy0+bmFtZSA6ICJObyBCdXMiLCBkZXZfbmFtZShkZXYpKTsKIAljb21wbGV0ZV9hbGwoJmRldi0+cG93ZXIuY29tcGxldGlvbik7CiAJbXV0ZXhfbG9jaygmZHBtX2xpc3RfbXR4KTsKIAlsaXN0X2RlbF9pbml0KCZkZXYtPnBvd2VyLmVudHJ5KTsKQEAgLTEzNSwxMCArMTIxLDggQEAKIHZvaWQgZGV2aWNlX3BtX21vdmVfYmVmb3JlKHN0cnVjdCBkZXZpY2UgKmRldmEsIHN0cnVjdCBkZXZpY2UgKmRldmIpCiB7CiAJcHJfZGVidWcoIlBNOiBNb3ZpbmcgJXM6JXMgYmVmb3JlICVzOiVzXG4iLAotCQkgZGV2YS0+YnVzID8gZGV2YS0+YnVzLT5uYW1lIDogIk5vIEJ1cyIsCi0JCSBrb2JqZWN0X25hbWUoJmRldmEtPmtvYmopLAotCQkgZGV2Yi0+YnVzID8gZGV2Yi0+YnVzLT5uYW1lIDogIk5vIEJ1cyIsCi0JCSBrb2JqZWN0X25hbWUoJmRldmItPmtvYmopKTsKKwkJIGRldmEtPmJ1cyA/IGRldmEtPmJ1cy0+bmFtZSA6ICJObyBCdXMiLCBkZXZfbmFtZShkZXZhKSwKKwkJIGRldmItPmJ1cyA/IGRldmItPmJ1cy0+bmFtZSA6ICJObyBCdXMiLCBkZXZfbmFtZShkZXZiKSk7CiAJLyogRGVsZXRlIGRldmEgZnJvbSBkcG1fbGlzdCBhbmQgcmVpbnNlcnQgYmVmb3JlIGRldmIuICovCiAJbGlzdF9tb3ZlX3RhaWwoJmRldmEtPnBvd2VyLmVudHJ5LCAmZGV2Yi0+cG93ZXIuZW50cnkpOwogfQpAQCAtMTUxLDEwICsxMzUsOCBAQAogdm9pZCBkZXZpY2VfcG1fbW92ZV9hZnRlcihzdHJ1Y3QgZGV2aWNlICpkZXZhLCBzdHJ1Y3QgZGV2aWNlICpkZXZiKQogewogCXByX2RlYnVnKCJQTTogTW92aW5nICVzOiVzIGFmdGVyICVzOiVzXG4iLAotCQkgZGV2YS0+YnVzID8gZGV2YS0+YnVzLT5uYW1lIDogIk5vIEJ1cyIsCi0JCSBrb2JqZWN0X25hbWUoJmRldmEtPmtvYmopLAotCQkgZGV2Yi0+YnVzID8gZGV2Yi0+YnVzLT5uYW1lIDogIk5vIEJ1cyIsCi0JCSBrb2JqZWN0X25hbWUoJmRldmItPmtvYmopKTsKKwkJIGRldmEtPmJ1cyA/IGRldmEtPmJ1cy0+bmFtZSA6ICJObyBCdXMiLCBkZXZfbmFtZShkZXZhKSwKKwkJIGRldmItPmJ1cyA/IGRldmItPmJ1cy0+bmFtZSA6ICJObyBCdXMiLCBkZXZfbmFtZShkZXZiKSk7CiAJLyogRGVsZXRlIGRldmEgZnJvbSBkcG1fbGlzdCBhbmQgcmVpbnNlcnQgYWZ0ZXIgZGV2Yi4gKi8KIAlsaXN0X21vdmUoJmRldmEtPnBvd2VyLmVudHJ5LCAmZGV2Yi0+cG93ZXIuZW50cnkpOwogfQpAQCAtMTY2LDggKzE0OCw3IEBACiB2b2lkIGRldmljZV9wbV9tb3ZlX2xhc3Qoc3RydWN0IGRldmljZSAqZGV2KQogewogCXByX2RlYnVnKCJQTTogTW92aW5nICVzOiVzIHRvIGVuZCBvZiBsaXN0XG4iLAotCQkgZGV2LT5idXMgPyBkZXYtPmJ1cy0+bmFtZSA6ICJObyBCdXMiLAotCQkga29iamVjdF9uYW1lKCZkZXYtPmtvYmopKTsKKwkJIGRldi0+YnVzID8gZGV2LT5idXMtPm5hbWUgOiAiTm8gQnVzIiwgZGV2X25hbWUoZGV2KSk7CiAJbGlzdF9tb3ZlX3RhaWwoJmRldi0+cG93ZXIuZW50cnksICZkcG1fbGlzdCk7CiB9CiAKQEAgLTMwMyw3ICsyODQsNyBAQAogCQkJcG1fbWVzc2FnZV90IHN0YXRlKQogewogCWludCBlcnJvciA9IDA7Ci0Ja3RpbWVfdCBjYWxsdGltZSwgZGVsdGEsIHJldHRpbWU7CisJa3RpbWVfdCBjYWxsdGltZSA9IGt0aW1lX3NldCgwLCAwKSwgZGVsdGEsIHJldHRpbWU7CiAKIAlpZiAoaW5pdGNhbGxfZGVidWcpIHsKIAkJcHJfaW5mbygiY2FsbGluZyAgJXMrIEAgJWksIHBhcmVudDogJXNcbiIsCkBAIC00MDUsNyArMzg2LDcgQEAKIAkJCWludCBlcnJvcikKIHsKIAlwcmludGsoS0VSTl9FUlIgIlBNOiBEZXZpY2UgJXMgZmFpbGVkIHRvICVzJXM6IGVycm9yICVkXG4iLAotCQlrb2JqZWN0X25hbWUoJmRldi0+a29iaiksIHBtX3ZlcmIoc3RhdGUuZXZlbnQpLCBpbmZvLCBlcnJvcik7CisJCWRldl9uYW1lKGRldiksIHBtX3ZlcmIoc3RhdGUuZXZlbnQpLCBpbmZvLCBlcnJvcik7CiB9CiAKIHN0YXRpYyB2b2lkIGRwbV9zaG93X3RpbWUoa3RpbWVfdCBzdGFydHRpbWUsIHBtX21lc3NhZ2VfdCBzdGF0ZSwgY2hhciAqaW5mbykKQEAgLTQ3NSwzMyArNDU2LDI0IEBACiAgKi8KIHZvaWQgZHBtX3Jlc3VtZV9ub2lycShwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCWt0aW1lX3Qgc3RhcnR0aW1lID0ga3RpbWVfZ2V0KCk7CiAKLQlJTklUX0xJU1RfSEVBRCgmbGlzdCk7CiAJbXV0ZXhfbG9jaygmZHBtX2xpc3RfbXR4KTsKLQl0cmFuc2l0aW9uX3N0YXJ0ZWQgPSBmYWxzZTsKLQl3aGlsZSAoIWxpc3RfZW1wdHkoJmRwbV9saXN0KSkgewotCQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0b19kZXZpY2UoZHBtX2xpc3QubmV4dCk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZkcG1fbm9pcnFfbGlzdCkpIHsKKwkJc3RydWN0IGRldmljZSAqZGV2ID0gdG9fZGV2aWNlKGRwbV9ub2lycV9saXN0Lm5leHQpOworCQlpbnQgZXJyb3I7CiAKIAkJZ2V0X2RldmljZShkZXYpOwotCQlpZiAoZGV2LT5wb3dlci5zdGF0dXMgPiBEUE1fT0ZGKSB7Ci0JCQlpbnQgZXJyb3I7CisJCWxpc3RfbW92ZV90YWlsKCZkZXYtPnBvd2VyLmVudHJ5LCAmZHBtX3N1c3BlbmRlZF9saXN0KTsKKwkJbXV0ZXhfdW5sb2NrKCZkcG1fbGlzdF9tdHgpOwogCi0JCQlkZXYtPnBvd2VyLnN0YXR1cyA9IERQTV9PRkY7Ci0JCQltdXRleF91bmxvY2soJmRwbV9saXN0X210eCk7CisJCWVycm9yID0gZGV2aWNlX3Jlc3VtZV9ub2lycShkZXYsIHN0YXRlKTsKKwkJaWYgKGVycm9yKQorCQkJcG1fZGV2X2VycihkZXYsIHN0YXRlLCAiIGVhcmx5IiwgZXJyb3IpOwogCi0JCQllcnJvciA9IGRldmljZV9yZXN1bWVfbm9pcnEoZGV2LCBzdGF0ZSk7Ci0KLQkJCW11dGV4X2xvY2soJmRwbV9saXN0X210eCk7Ci0JCQlpZiAoZXJyb3IpCi0JCQkJcG1fZGV2X2VycihkZXYsIHN0YXRlLCAiIGVhcmx5IiwgZXJyb3IpOwotCQl9Ci0JCWlmICghbGlzdF9lbXB0eSgmZGV2LT5wb3dlci5lbnRyeSkpCi0JCQlsaXN0X21vdmVfdGFpbCgmZGV2LT5wb3dlci5lbnRyeSwgJmxpc3QpOworCQltdXRleF9sb2NrKCZkcG1fbGlzdF9tdHgpOwogCQlwdXRfZGV2aWNlKGRldik7CiAJfQotCWxpc3Rfc3BsaWNlKCZsaXN0LCAmZHBtX2xpc3QpOwogCW11dGV4X3VubG9jaygmZHBtX2xpc3RfbXR4KTsKIAlkcG1fc2hvd190aW1lKHN0YXJ0dGltZSwgc3RhdGUsICJlYXJseSIpOwogCXJlc3VtZV9kZXZpY2VfaXJxcygpOwpAQCAtNTQ0LDcgKzUxNiw3IEBACiAJZHBtX3dhaXQoZGV2LT5wYXJlbnQsIGFzeW5jKTsKIAlkZXZpY2VfbG9jayhkZXYpOwogCi0JZGV2LT5wb3dlci5zdGF0dXMgPSBEUE1fUkVTVU1JTkc7CisJZGV2LT5wb3dlci5pbl9zdXNwZW5kID0gZmFsc2U7CiAKIAlpZiAoZGV2LT5idXMpIHsKIAkJaWYgKGRldi0+YnVzLT5wbSkgewpAQCAtNjEwLDE5ICs1ODIsMTQgQEAKICAqLwogc3RhdGljIHZvaWQgZHBtX3Jlc3VtZShwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlrdGltZV90IHN0YXJ0dGltZSA9IGt0aW1lX2dldCgpOwogCi0JSU5JVF9MSVNUX0hFQUQoJmxpc3QpOwogCW11dGV4X2xvY2soJmRwbV9saXN0X210eCk7CiAJcG1fdHJhbnNpdGlvbiA9IHN0YXRlOwogCWFzeW5jX2Vycm9yID0gMDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmZHBtX2xpc3QsIHBvd2VyLmVudHJ5KSB7Ci0JCWlmIChkZXYtPnBvd2VyLnN0YXR1cyA8IERQTV9PRkYpCi0JCQljb250aW51ZTsKLQorCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmZHBtX3N1c3BlbmRlZF9saXN0LCBwb3dlci5lbnRyeSkgewogCQlJTklUX0NPTVBMRVRJT04oZGV2LT5wb3dlci5jb21wbGV0aW9uKTsKIAkJaWYgKGlzX2FzeW5jKGRldikpIHsKIAkJCWdldF9kZXZpY2UoZGV2KTsKQEAgLTYzMCwyOCArNTk3LDI0IEBACiAJCX0KIAl9CiAKLQl3aGlsZSAoIWxpc3RfZW1wdHkoJmRwbV9saXN0KSkgewotCQlkZXYgPSB0b19kZXZpY2UoZHBtX2xpc3QubmV4dCk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZkcG1fc3VzcGVuZGVkX2xpc3QpKSB7CisJCWRldiA9IHRvX2RldmljZShkcG1fc3VzcGVuZGVkX2xpc3QubmV4dCk7CiAJCWdldF9kZXZpY2UoZGV2KTsKLQkJaWYgKGRldi0+cG93ZXIuc3RhdHVzID49IERQTV9PRkYgJiYgIWlzX2FzeW5jKGRldikpIHsKKwkJaWYgKCFpc19hc3luYyhkZXYpKSB7CiAJCQlpbnQgZXJyb3I7CiAKIAkJCW11dGV4X3VubG9jaygmZHBtX2xpc3RfbXR4KTsKIAogCQkJZXJyb3IgPSBkZXZpY2VfcmVzdW1lKGRldiwgc3RhdGUsIGZhbHNlKTsKLQotCQkJbXV0ZXhfbG9jaygmZHBtX2xpc3RfbXR4KTsKIAkJCWlmIChlcnJvcikKIAkJCQlwbV9kZXZfZXJyKGRldiwgc3RhdGUsICIiLCBlcnJvcik7Ci0JCX0gZWxzZSBpZiAoZGV2LT5wb3dlci5zdGF0dXMgPT0gRFBNX1NVU1BFTkRJTkcpIHsKLQkJCS8qIEFsbG93IG5ldyBjaGlsZHJlbiBvZiB0aGUgZGV2aWNlIHRvIGJlIHJlZ2lzdGVyZWQgKi8KLQkJCWRldi0+cG93ZXIuc3RhdHVzID0gRFBNX1JFU1VNSU5HOworCisJCQltdXRleF9sb2NrKCZkcG1fbGlzdF9tdHgpOwogCQl9CiAJCWlmICghbGlzdF9lbXB0eSgmZGV2LT5wb3dlci5lbnRyeSkpCi0JCQlsaXN0X21vdmVfdGFpbCgmZGV2LT5wb3dlci5lbnRyeSwgJmxpc3QpOworCQkJbGlzdF9tb3ZlX3RhaWwoJmRldi0+cG93ZXIuZW50cnksICZkcG1fcHJlcGFyZWRfbGlzdCk7CiAJCXB1dF9kZXZpY2UoZGV2KTsKIAl9Ci0JbGlzdF9zcGxpY2UoJmxpc3QsICZkcG1fbGlzdCk7CiAJbXV0ZXhfdW5sb2NrKCZkcG1fbGlzdF9tdHgpOwogCWFzeW5jX3N5bmNocm9uaXplX2Z1bGwoKTsKIAlkcG1fc2hvd190aW1lKHN0YXJ0dGltZSwgc3RhdGUsIE5VTEwpOwpAQCAtNjk3LDIyICs2NjAsMTggQEAKIAogCUlOSVRfTElTVF9IRUFEKCZsaXN0KTsKIAltdXRleF9sb2NrKCZkcG1fbGlzdF9tdHgpOwotCXRyYW5zaXRpb25fc3RhcnRlZCA9IGZhbHNlOwotCXdoaWxlICghbGlzdF9lbXB0eSgmZHBtX2xpc3QpKSB7Ci0JCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRvX2RldmljZShkcG1fbGlzdC5wcmV2KTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmRwbV9wcmVwYXJlZF9saXN0KSkgeworCQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0b19kZXZpY2UoZHBtX3ByZXBhcmVkX2xpc3QucHJldik7CiAKIAkJZ2V0X2RldmljZShkZXYpOwotCQlpZiAoZGV2LT5wb3dlci5zdGF0dXMgPiBEUE1fT04pIHsKLQkJCWRldi0+cG93ZXIuc3RhdHVzID0gRFBNX09OOwotCQkJbXV0ZXhfdW5sb2NrKCZkcG1fbGlzdF9tdHgpOworCQlkZXYtPnBvd2VyLmluX3N1c3BlbmQgPSBmYWxzZTsKKwkJbGlzdF9tb3ZlKCZkZXYtPnBvd2VyLmVudHJ5LCAmbGlzdCk7CisJCW11dGV4X3VubG9jaygmZHBtX2xpc3RfbXR4KTsKIAotCQkJZGV2aWNlX2NvbXBsZXRlKGRldiwgc3RhdGUpOwotCQkJcG1fcnVudGltZV9wdXRfc3luYyhkZXYpOworCQlkZXZpY2VfY29tcGxldGUoZGV2LCBzdGF0ZSk7CisJCXBtX3J1bnRpbWVfcHV0X3N5bmMoZGV2KTsKIAotCQkJbXV0ZXhfbG9jaygmZHBtX2xpc3RfbXR4KTsKLQkJfQotCQlpZiAoIWxpc3RfZW1wdHkoJmRldi0+cG93ZXIuZW50cnkpKQotCQkJbGlzdF9tb3ZlKCZkZXYtPnBvd2VyLmVudHJ5LCAmbGlzdCk7CisJCW11dGV4X2xvY2soJmRwbV9saXN0X210eCk7CiAJCXB1dF9kZXZpY2UoZGV2KTsKIAl9CiAJbGlzdF9zcGxpY2UoJmxpc3QsICZkcG1fbGlzdCk7CkBAIC04MDIsMTUgKzc2MSwxMyBAQAogICovCiBpbnQgZHBtX3N1c3BlbmRfbm9pcnEocG1fbWVzc2FnZV90IHN0YXRlKQogewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlrdGltZV90IHN0YXJ0dGltZSA9IGt0aW1lX2dldCgpOwogCWludCBlcnJvciA9IDA7CiAKLQlJTklUX0xJU1RfSEVBRCgmbGlzdCk7CiAJc3VzcGVuZF9kZXZpY2VfaXJxcygpOwogCW11dGV4X2xvY2soJmRwbV9saXN0X210eCk7Ci0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZkcG1fbGlzdCkpIHsKLQkJc3RydWN0IGRldmljZSAqZGV2ID0gdG9fZGV2aWNlKGRwbV9saXN0LnByZXYpOworCXdoaWxlICghbGlzdF9lbXB0eSgmZHBtX3N1c3BlbmRlZF9saXN0KSkgeworCQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0b19kZXZpY2UoZHBtX3N1c3BlbmRlZF9saXN0LnByZXYpOwogCiAJCWdldF9kZXZpY2UoZGV2KTsKIAkJbXV0ZXhfdW5sb2NrKCZkcG1fbGlzdF9tdHgpOwpAQCAtODIzLDEyICs3ODAsMTAgQEAKIAkJCXB1dF9kZXZpY2UoZGV2KTsKIAkJCWJyZWFrOwogCQl9Ci0JCWRldi0+cG93ZXIuc3RhdHVzID0gRFBNX09GRl9JUlE7CiAJCWlmICghbGlzdF9lbXB0eSgmZGV2LT5wb3dlci5lbnRyeSkpCi0JCQlsaXN0X21vdmUoJmRldi0+cG93ZXIuZW50cnksICZsaXN0KTsKKwkJCWxpc3RfbW92ZSgmZGV2LT5wb3dlci5lbnRyeSwgJmRwbV9ub2lycV9saXN0KTsKIAkJcHV0X2RldmljZShkZXYpOwogCX0KLQlsaXN0X3NwbGljZV90YWlsKCZsaXN0LCAmZHBtX2xpc3QpOwogCW11dGV4X3VubG9jaygmZHBtX2xpc3RfbXR4KTsKIAlpZiAoZXJyb3IpCiAJCWRwbV9yZXN1bWVfbm9pcnEocmVzdW1lX2V2ZW50KHN0YXRlKSk7CkBAIC04NzYsNiArODMxLDExIEBACiAJaWYgKGFzeW5jX2Vycm9yKQogCQlnb3RvIEVuZDsKIAorCWlmIChwbV93YWtldXBfcGVuZGluZygpKSB7CisJCWFzeW5jX2Vycm9yID0gLUVCVVNZOworCQlnb3RvIEVuZDsKKwl9CisKIAlpZiAoZGV2LT5jbGFzcykgewogCQlpZiAoZGV2LT5jbGFzcy0+cG0pIHsKIAkJCXBtX2Rldl9kYmcoZGV2LCBzdGF0ZSwgImNsYXNzICIpOwpAQCAtOTA3LDkgKzg2Nyw2IEBACiAJCX0KIAl9CiAKLQlpZiAoIWVycm9yKQotCQlkZXYtPnBvd2VyLnN0YXR1cyA9IERQTV9PRkY7Ci0KICBFbmQ6CiAJZGV2aWNlX3VubG9jayhkZXYpOwogCWNvbXBsZXRlX2FsbCgmZGV2LT5wb3dlci5jb21wbGV0aW9uKTsKQEAgLTk1MSwxNiArOTA4LDE0IEBACiAgKi8KIHN0YXRpYyBpbnQgZHBtX3N1c3BlbmQocG1fbWVzc2FnZV90IHN0YXRlKQogewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlrdGltZV90IHN0YXJ0dGltZSA9IGt0aW1lX2dldCgpOwogCWludCBlcnJvciA9IDA7CiAKLQlJTklUX0xJU1RfSEVBRCgmbGlzdCk7CiAJbXV0ZXhfbG9jaygmZHBtX2xpc3RfbXR4KTsKIAlwbV90cmFuc2l0aW9uID0gc3RhdGU7CiAJYXN5bmNfZXJyb3IgPSAwOwotCXdoaWxlICghbGlzdF9lbXB0eSgmZHBtX2xpc3QpKSB7Ci0JCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRvX2RldmljZShkcG1fbGlzdC5wcmV2KTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmRwbV9wcmVwYXJlZF9saXN0KSkgeworCQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0b19kZXZpY2UoZHBtX3ByZXBhcmVkX2xpc3QucHJldik7CiAKIAkJZ2V0X2RldmljZShkZXYpOwogCQltdXRleF91bmxvY2soJmRwbV9saXN0X210eCk7CkBAIC05NzQsMTIgKzkyOSwxMSBAQAogCQkJYnJlYWs7CiAJCX0KIAkJaWYgKCFsaXN0X2VtcHR5KCZkZXYtPnBvd2VyLmVudHJ5KSkKLQkJCWxpc3RfbW92ZSgmZGV2LT5wb3dlci5lbnRyeSwgJmxpc3QpOworCQkJbGlzdF9tb3ZlKCZkZXYtPnBvd2VyLmVudHJ5LCAmZHBtX3N1c3BlbmRlZF9saXN0KTsKIAkJcHV0X2RldmljZShkZXYpOwogCQlpZiAoYXN5bmNfZXJyb3IpCiAJCQlicmVhazsKIAl9Ci0JbGlzdF9zcGxpY2UoJmxpc3QsIGRwbV9saXN0LnByZXYpOwogCW11dGV4X3VubG9jaygmZHBtX2xpc3RfbXR4KTsKIAlhc3luY19zeW5jaHJvbml6ZV9mdWxsKCk7CiAJaWYgKCFlcnJvcikKQEAgLTEwMzgsMjIgKzk5MiwyMCBAQAogICovCiBzdGF0aWMgaW50IGRwbV9wcmVwYXJlKHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJaW50IGVycm9yID0gMDsKIAotCUlOSVRfTElTVF9IRUFEKCZsaXN0KTsKIAltdXRleF9sb2NrKCZkcG1fbGlzdF9tdHgpOwotCXRyYW5zaXRpb25fc3RhcnRlZCA9IHRydWU7CiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZkcG1fbGlzdCkpIHsKIAkJc3RydWN0IGRldmljZSAqZGV2ID0gdG9fZGV2aWNlKGRwbV9saXN0Lm5leHQpOwogCiAJCWdldF9kZXZpY2UoZGV2KTsKLQkJZGV2LT5wb3dlci5zdGF0dXMgPSBEUE1fUFJFUEFSSU5HOwogCQltdXRleF91bmxvY2soJmRwbV9saXN0X210eCk7CiAKIAkJcG1fcnVudGltZV9nZXRfbm9yZXN1bWUoZGV2KTsKLQkJaWYgKHBtX3J1bnRpbWVfYmFycmllcihkZXYpICYmIGRldmljZV9tYXlfd2FrZXVwKGRldikpIHsKLQkJCS8qIFdha2UtdXAgcmVxdWVzdGVkIGR1cmluZyBzeXN0ZW0gc2xlZXAgdHJhbnNpdGlvbi4gKi8KKwkJaWYgKHBtX3J1bnRpbWVfYmFycmllcihkZXYpICYmIGRldmljZV9tYXlfd2FrZXVwKGRldikpCisJCQlwbV93YWtldXBfZXZlbnQoZGV2LCAwKTsKKworCQlpZiAocG1fd2FrZXVwX3BlbmRpbmcoKSkgewogCQkJcG1fcnVudGltZV9wdXRfc3luYyhkZXYpOwogCQkJZXJyb3IgPSAtRUJVU1k7CiAJCX0gZWxzZSB7CkBAIC0xMDYyLDI0ICsxMDE0LDIyIEBACiAKIAkJbXV0ZXhfbG9jaygmZHBtX2xpc3RfbXR4KTsKIAkJaWYgKGVycm9yKSB7Ci0JCQlkZXYtPnBvd2VyLnN0YXR1cyA9IERQTV9PTjsKIAkJCWlmIChlcnJvciA9PSAtRUFHQUlOKSB7CiAJCQkJcHV0X2RldmljZShkZXYpOwogCQkJCWVycm9yID0gMDsKIAkJCQljb250aW51ZTsKIAkJCX0KLQkJCXByaW50ayhLRVJOX0VSUiAiUE06IEZhaWxlZCB0byBwcmVwYXJlIGRldmljZSAlcyAiCi0JCQkJImZvciBwb3dlciB0cmFuc2l0aW9uOiBlcnJvciAlZFxuIiwKLQkJCQlrb2JqZWN0X25hbWUoJmRldi0+a29iaiksIGVycm9yKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIlBNOiBEZXZpY2UgJXMgbm90IHByZXBhcmVkICIKKwkJCQkiZm9yIHBvd2VyIHRyYW5zaXRpb246IGNvZGUgJWRcbiIsCisJCQkJZGV2X25hbWUoZGV2KSwgZXJyb3IpOwogCQkJcHV0X2RldmljZShkZXYpOwogCQkJYnJlYWs7CiAJCX0KLQkJZGV2LT5wb3dlci5zdGF0dXMgPSBEUE1fU1VTUEVORElORzsKKwkJZGV2LT5wb3dlci5pbl9zdXNwZW5kID0gdHJ1ZTsKIAkJaWYgKCFsaXN0X2VtcHR5KCZkZXYtPnBvd2VyLmVudHJ5KSkKLQkJCWxpc3RfbW92ZV90YWlsKCZkZXYtPnBvd2VyLmVudHJ5LCAmbGlzdCk7CisJCQlsaXN0X21vdmVfdGFpbCgmZGV2LT5wb3dlci5lbnRyeSwgJmRwbV9wcmVwYXJlZF9saXN0KTsKIAkJcHV0X2RldmljZShkZXYpOwogCX0KLQlsaXN0X3NwbGljZSgmbGlzdCwgJmRwbV9saXN0KTsKIAltdXRleF91bmxvY2soJmRwbV9saXN0X210eCk7CiAJcmV0dXJuIGVycm9yOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL3J1bnRpbWUuYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9ydW50aW1lLmMKaW5kZXggMDJjNjUyYi4uNjU2NDkzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL3J1bnRpbWUuYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvcnVudGltZS5jCkBAIC0yNTAsMTMgKzI1MCwxNiBAQAogCWlmICghY2IpCiAJCXJldHVybiAtRU5PU1lTOwogCi0Jc3Bpbl91bmxvY2tfaXJxKCZkZXYtPnBvd2VyLmxvY2spOworCWlmIChkZXYtPnBvd2VyLmlycV9zYWZlKSB7CisJCXJldHZhbCA9IGNiKGRldik7CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2tfaXJxKCZkZXYtPnBvd2VyLmxvY2spOwogCi0JcmV0dmFsID0gY2IoZGV2KTsKKwkJcmV0dmFsID0gY2IoZGV2KTsKIAotCXNwaW5fbG9ja19pcnEoJmRldi0+cG93ZXIubG9jayk7CisJCXNwaW5fbG9ja19pcnEoJmRldi0+cG93ZXIubG9jayk7CisJfQogCWRldi0+cG93ZXIucnVudGltZV9lcnJvciA9IHJldHZhbDsKLQogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTQwNCw3ICs0MDcsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlpZiAocGFyZW50ICYmICFwYXJlbnQtPnBvd2VyLmlnbm9yZV9jaGlsZHJlbikgeworCWlmIChwYXJlbnQgJiYgIXBhcmVudC0+cG93ZXIuaWdub3JlX2NoaWxkcmVuICYmICFkZXYtPnBvd2VyLmlycV9zYWZlKSB7CiAJCXNwaW5fdW5sb2NrX2lycSgmZGV2LT5wb3dlci5sb2NrKTsKIAogCQlwbV9yZXF1ZXN0X2lkbGUocGFyZW50KTsKQEAgLTUyNywxMCArNTMwLDEzIEBACiAKIAlpZiAoIXBhcmVudCAmJiBkZXYtPnBhcmVudCkgewogCQkvKgotCQkgKiBJbmNyZW1lbnQgdGhlIHBhcmVudCdzIHJlc3VtZSBjb3VudGVyIGFuZCByZXN1bWUgaXQgaWYKLQkJICogbmVjZXNzYXJ5LgorCQkgKiBJbmNyZW1lbnQgdGhlIHBhcmVudCdzIHVzYWdlIGNvdW50ZXIgYW5kIHJlc3VtZSBpdCBpZgorCQkgKiBuZWNlc3NhcnkuICBOb3QgbmVlZGVkIGlmIGRldiBpcyBpcnEtc2FmZTsgdGhlbiB0aGUKKwkJICogcGFyZW50IGlzIHBlcm1hbmVudGx5IHJlc3VtZWQuCiAJCSAqLwogCQlwYXJlbnQgPSBkZXYtPnBhcmVudDsKKwkJaWYgKGRldi0+cG93ZXIuaXJxX3NhZmUpCisJCQlnb3RvIHNraXBfcGFyZW50OwogCQlzcGluX3VubG9jaygmZGV2LT5wb3dlci5sb2NrKTsKIAogCQlwbV9ydW50aW1lX2dldF9ub3Jlc3VtZShwYXJlbnQpOwpAQCAtNTUzLDYgKzU1OSw3IEBACiAJCQlnb3RvIG91dDsKIAkJZ290byByZXBlYXQ7CiAJfQorIHNraXBfcGFyZW50OgogCiAJaWYgKGRldi0+cG93ZXIubm9fY2FsbGJhY2tzKQogCQlnb3RvIG5vX2NhbGxiYWNrOwkvKiBBc3N1bWUgc3VjY2Vzcy4gKi8KQEAgLTU4NCw3ICs1OTEsNyBAQAogCQlycG1faWRsZShkZXYsIFJQTV9BU1lOQyk7CiAKICBvdXQ6Ci0JaWYgKHBhcmVudCkgeworCWlmIChwYXJlbnQgJiYgIWRldi0+cG93ZXIuaXJxX3NhZmUpIHsKIAkJc3Bpbl91bmxvY2tfaXJxKCZkZXYtPnBvd2VyLmxvY2spOwogCiAJCXBtX3J1bnRpbWVfcHV0KHBhcmVudCk7CkBAIC0xMDY1LDcgKzEwNzIsNiBAQAogICogU2V0IHRoZSBwb3dlci5ub19jYWxsYmFja3MgZmxhZywgd2hpY2ggdGVsbHMgdGhlIFBNIGNvcmUgdGhhdCB0aGlzCiAgKiBkZXZpY2UgaXMgcG93ZXItbWFuYWdlZCB0aHJvdWdoIGl0cyBwYXJlbnQgYW5kIGhhcyBubyBydW4tdGltZSBQTQogICogY2FsbGJhY2tzIG9mIGl0cyBvd24uICBUaGUgcnVuLXRpbWUgc3lzZnMgYXR0cmlidXRlcyB3aWxsIGJlIHJlbW92ZWQuCi0gKgogICovCiB2b2lkIHBtX3J1bnRpbWVfbm9fY2FsbGJhY2tzKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKQEAgLTEwNzgsNiArMTA4NCwyNyBAQAogRVhQT1JUX1NZTUJPTF9HUEwocG1fcnVudGltZV9ub19jYWxsYmFja3MpOwogCiAvKioKKyAqIHBtX3J1bnRpbWVfaXJxX3NhZmUgLSBMZWF2ZSBpbnRlcnJ1cHRzIGRpc2FibGVkIGR1cmluZyBjYWxsYmFja3MuCisgKiBAZGV2OiBEZXZpY2UgdG8gaGFuZGxlCisgKgorICogU2V0IHRoZSBwb3dlci5pcnFfc2FmZSBmbGFnLCB3aGljaCB0ZWxscyB0aGUgUE0gY29yZSB0aGF0IHRoZQorICogLT5ydW50aW1lX3N1c3BlbmQoKSBhbmQgLT5ydW50aW1lX3Jlc3VtZSgpIGNhbGxiYWNrcyBmb3IgdGhpcyBkZXZpY2Ugc2hvdWxkCisgKiBhbHdheXMgYmUgaW52b2tlZCB3aXRoIHRoZSBzcGlubG9jayBoZWxkIGFuZCBpbnRlcnJ1cHRzIGRpc2FibGVkLiAgSXQgYWxzbworICogY2F1c2VzIHRoZSBwYXJlbnQncyB1c2FnZSBjb3VudGVyIHRvIGJlIHBlcm1hbmVudGx5IGluY3JlbWVudGVkLCBwcmV2ZW50aW5nCisgKiB0aGUgcGFyZW50IGZyb20gcnVudGltZSBzdXNwZW5kaW5nIC0tIG90aGVyd2lzZSBhbiBpcnEtc2FmZSBjaGlsZCBtaWdodCBoYXZlCisgKiB0byB3YWl0IGZvciBhIG5vbi1pcnEtc2FmZSBwYXJlbnQuCisgKi8KK3ZvaWQgcG1fcnVudGltZV9pcnFfc2FmZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaWYgKGRldi0+cGFyZW50KQorCQlwbV9ydW50aW1lX2dldF9zeW5jKGRldi0+cGFyZW50KTsKKwlzcGluX2xvY2tfaXJxKCZkZXYtPnBvd2VyLmxvY2spOworCWRldi0+cG93ZXIuaXJxX3NhZmUgPSAxOworCXNwaW5fdW5sb2NrX2lycSgmZGV2LT5wb3dlci5sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBtX3J1bnRpbWVfaXJxX3NhZmUpOworCisvKioKICAqIHVwZGF0ZV9hdXRvc3VzcGVuZCAtIEhhbmRsZSBhIGNoYW5nZSB0byBhIGRldmljZSdzIGF1dG9zdXNwZW5kIHNldHRpbmdzLgogICogQGRldjogRGV2aWNlIHRvIGhhbmRsZS4KICAqIEBvbGRfZGVsYXk6IFRoZSBmb3JtZXIgYXV0b3N1c3BlbmRfZGVsYXkgdmFsdWUuCkBAIC0xMTk5LDQgKzEyMjYsNiBAQAogCS8qIENoYW5nZSB0aGUgc3RhdHVzIGJhY2sgdG8gJ3N1c3BlbmRlZCcgdG8gbWF0Y2ggdGhlIGluaXRpYWwgc3RhdHVzLiAqLwogCWlmIChkZXYtPnBvd2VyLnJ1bnRpbWVfc3RhdHVzID09IFJQTV9BQ1RJVkUpCiAJCXBtX3J1bnRpbWVfc2V0X3N1c3BlbmRlZChkZXYpOworCWlmIChkZXYtPnBvd2VyLmlycV9zYWZlICYmIGRldi0+cGFyZW50KQorCQlwbV9ydW50aW1lX3B1dF9zeW5jKGRldi0+cGFyZW50KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci93YWtldXAuYyBiL2RyaXZlcnMvYmFzZS9wb3dlci93YWtldXAuYwppbmRleCA3MWM1NTI4Li44ZWM0MDZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvd2FrZXVwLmMKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL3dha2V1cC5jCkBAIC01NDIsMjYgKzU0MiwyNiBAQAogfQogCiAvKioKLSAqIHBtX2NoZWNrX3dha2V1cF9ldmVudHMgLSBDaGVjayBmb3IgbmV3IHdha2V1cCBldmVudHMuCisgKiBwbV93YWtldXBfcGVuZGluZyAtIENoZWNrIGlmIHBvd2VyIHRyYW5zaXRpb24gaW4gcHJvZ3Jlc3Mgc2hvdWxkIGJlIGFib3J0ZWQuCiAgKgogICogQ29tcGFyZSB0aGUgY3VycmVudCBudW1iZXIgb2YgcmVnaXN0ZXJlZCB3YWtldXAgZXZlbnRzIHdpdGggaXRzIHByZXNlcnZlZAotICogdmFsdWUgZnJvbSB0aGUgcGFzdCB0byBjaGVjayBpZiBuZXcgd2FrZXVwIGV2ZW50cyBoYXZlIGJlZW4gcmVnaXN0ZXJlZCBzaW5jZQotICogdGhlIG9sZCB2YWx1ZSB3YXMgc3RvcmVkLiAgQ2hlY2sgaWYgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHdha2V1cCBldmVudHMgYmVpbmcKLSAqIHByb2Nlc3NlZCBpcyB6ZXJvLgorICogdmFsdWUgZnJvbSB0aGUgcGFzdCBhbmQgcmV0dXJuIHRydWUgaWYgbmV3IHdha2V1cCBldmVudHMgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQKKyAqIHNpbmNlIHRoZSBvbGQgdmFsdWUgd2FzIHN0b3JlZC4gIEFsc28gcmV0dXJuIHRydWUgaWYgdGhlIGN1cnJlbnQgbnVtYmVyIG9mCisgKiB3YWtldXAgZXZlbnRzIGJlaW5nIHByb2Nlc3NlZCBpcyBkaWZmZXJlbnQgZnJvbSB6ZXJvLgogICovCi1ib29sIHBtX2NoZWNrX3dha2V1cF9ldmVudHModm9pZCkKK2Jvb2wgcG1fd2FrZXVwX3BlbmRpbmcodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWJvb2wgcmV0ID0gdHJ1ZTsKKwlib29sIHJldCA9IGZhbHNlOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmV2ZW50c19sb2NrLCBmbGFncyk7CiAJaWYgKGV2ZW50c19jaGVja19lbmFibGVkKSB7Ci0JCXJldCA9ICgodW5zaWduZWQgaW50KWF0b21pY19yZWFkKCZldmVudF9jb3VudCkgPT0gc2F2ZWRfY291bnQpCi0JCQkmJiAhYXRvbWljX3JlYWQoJmV2ZW50c19pbl9wcm9ncmVzcyk7Ci0JCWV2ZW50c19jaGVja19lbmFibGVkID0gcmV0OworCQlyZXQgPSAoKHVuc2lnbmVkIGludClhdG9taWNfcmVhZCgmZXZlbnRfY291bnQpICE9IHNhdmVkX2NvdW50KQorCQkJfHwgYXRvbWljX3JlYWQoJmV2ZW50c19pbl9wcm9ncmVzcyk7CisJCWV2ZW50c19jaGVja19lbmFibGVkID0gIXJldDsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXZlbnRzX2xvY2ssIGZsYWdzKTsKLQlpZiAoIXJldCkKKwlpZiAocmV0KQogCQlwbV93YWtldXBfdXBkYXRlX2hpdF9jb3VudHMoKTsKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9zaV9pbnRmLmMgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3NpX2ludGYuYwppbmRleCAwMzVkYTllLi5mMjdjMDRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3NpX2ludGYuYworKysgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3NpX2ludGYuYwpAQCAtNjksNiArNjksOCBAQAogI2lmZGVmIENPTkZJR19QUENfT0YKICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KICNlbmRpZgogCiAjZGVmaW5lIFBGWCAiaXBtaV9zaTogIgpAQCAtMjU0Niw3ICsyNTQ4LDcgQEAKIHsKIAlzdHJ1Y3Qgc21pX2luZm8gKmluZm87CiAJc3RydWN0IHJlc291cmNlIHJlc291cmNlOwotCWNvbnN0IGludCAqcmVnc2l6ZSwgKnJlZ3NwYWNpbmcsICpyZWdzaGlmdDsKKwljb25zdCBfX2JlMzIgKnJlZ3NpemUsICpyZWdzcGFjaW5nLCAqcmVnc2hpZnQ7CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldi0+ZGV2Lm9mX25vZGU7CiAJaW50IHJldDsKIAlpbnQgcHJvcGxlbjsKQEAgLTI1OTksOSArMjYwMSw5IEBACiAKIAlpbmZvLT5pby5hZGRyX2RhdGEJPSByZXNvdXJjZS5zdGFydDsKIAotCWluZm8tPmlvLnJlZ3NpemUJPSByZWdzaXplID8gKnJlZ3NpemUgOiBERUZBVUxUX1JFR1NJWkU7Ci0JaW5mby0+aW8ucmVnc3BhY2luZwk9IHJlZ3NwYWNpbmcgPyAqcmVnc3BhY2luZyA6IERFRkFVTFRfUkVHU1BBQ0lORzsKLQlpbmZvLT5pby5yZWdzaGlmdAk9IHJlZ3NoaWZ0ID8gKnJlZ3NoaWZ0IDogMDsKKwlpbmZvLT5pby5yZWdzaXplCT0gcmVnc2l6ZSA/IGJlMzJfdG9fY3B1cChyZWdzaXplKSA6IERFRkFVTFRfUkVHU0laRTsKKwlpbmZvLT5pby5yZWdzcGFjaW5nCT0gcmVnc3BhY2luZyA/IGJlMzJfdG9fY3B1cChyZWdzcGFjaW5nKSA6IERFRkFVTFRfUkVHU1BBQ0lORzsKKwlpbmZvLT5pby5yZWdzaGlmdAk9IHJlZ3NoaWZ0ID8gYmUzMl90b19jcHVwKHJlZ3NoaWZ0KSA6IDA7CiAKIAlpbmZvLT5pcnEJCT0gaXJxX29mX3BhcnNlX2FuZF9tYXAoZGV2LT5kZXYub2Zfbm9kZSwgMCk7CiAJaW5mby0+ZGV2CQk9ICZkZXYtPmRldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zbnNjLmggYi9kcml2ZXJzL2NoYXIvc25zYy5oCmluZGV4IDRiZTYyZWQuLmU4YzUyYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zbnNjLmgKKysrIGIvZHJpdmVycy9jaGFyL3Nuc2MuaApAQCAtMTksNyArMTksNiBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgva29iamVjdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvY2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3RwbS90cG0uYyBiL2RyaXZlcnMvY2hhci90cG0vdHBtLmMKaW5kZXggMGIzYWYzZi4uMWY0NmYxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3RwbS90cG0uYworKysgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbS5jCkBAIC03MzYsNyArNzM2LDcgQEAKIAlpZiAoY2hpcCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKIAlyYyA9IF9fdHBtX3Bjcl9yZWFkKGNoaXAsIHBjcl9pZHgsIHJlc19idWYpOwotCW1vZHVsZV9wdXQoY2hpcC0+ZGV2LT5kcml2ZXItPm93bmVyKTsKKwl0cG1fY2hpcF9wdXQoY2hpcCk7CiAJcmV0dXJuIHJjOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodHBtX3Bjcl9yZWFkKTsKQEAgLTc3NSwxMSArNzc1LDI3IEBACiAJcmMgPSB0cmFuc21pdF9jbWQoY2hpcCwgJmNtZCwgRVhURU5EX1BDUl9SRVNVTFRfU0laRSwKIAkJCSAgImF0dGVtcHRpbmcgZXh0ZW5kIGEgUENSIHZhbHVlIik7CiAKLQltb2R1bGVfcHV0KGNoaXAtPmRldi0+ZHJpdmVyLT5vd25lcik7CisJdHBtX2NoaXBfcHV0KGNoaXApOwogCXJldHVybiByYzsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHRwbV9wY3JfZXh0ZW5kKTsKIAoraW50IHRwbV9zZW5kKHUzMiBjaGlwX251bSwgdm9pZCAqY21kLCBzaXplX3QgYnVmbGVuKQoreworCXN0cnVjdCB0cG1fY2hpcCAqY2hpcDsKKwlpbnQgcmM7CisKKwljaGlwID0gdHBtX2NoaXBfZmluZF9nZXQoY2hpcF9udW0pOworCWlmIChjaGlwID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJcmMgPSB0cmFuc21pdF9jbWQoY2hpcCwgY21kLCBidWZsZW4sICJhdHRlbXB0aW5nIHRwbV9jbWQiKTsKKworCXRwbV9jaGlwX3B1dChjaGlwKTsKKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh0cG1fc2VuZCk7CisKIHNzaXplX3QgdHBtX3Nob3dfcGNycyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkgICAgICBjaGFyICpidWYpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHBtL3RwbS5oIGIvZHJpdmVycy9jaGFyL3RwbS90cG0uaAppbmRleCA3OTI4NjhkLi43MmRkYjAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHBtL3RwbS5oCisrKyBiL2RyaXZlcnMvY2hhci90cG0vdHBtLmgKQEAgLTExMyw2ICsxMTMsMTEgQEAKIAogI2RlZmluZSB0b190cG1fY2hpcChuKSBjb250YWluZXJfb2Yobiwgc3RydWN0IHRwbV9jaGlwLCB2ZW5kb3IpCiAKK3N0YXRpYyBpbmxpbmUgdm9pZCB0cG1fY2hpcF9wdXQoc3RydWN0IHRwbV9jaGlwICpjaGlwKQoreworCW1vZHVsZV9wdXQoY2hpcC0+ZGV2LT5kcml2ZXItPm93bmVyKTsKK30KKwogc3RhdGljIGlubGluZSBpbnQgdHBtX3JlYWRfaW5kZXgoaW50IGJhc2UsIGludCBpbmRleCkKIHsKIAlvdXRiKGluZGV4LCBiYXNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlyZXdpcmUvS2NvbmZpZyBiL2RyaXZlcnMvZmlyZXdpcmUvS2NvbmZpZwppbmRleCA0MGEyMjJlLi42OGY5NDJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2ZpcmV3aXJlL0tjb25maWcKKysrIGIvZHJpdmVycy9maXJld2lyZS9LY29uZmlnCkBAIC0xOSw3ICsxOSw3IEBACiAKIGNvbmZpZyBGSVJFV0lSRV9PSENJCiAJdHJpc3RhdGUgIk9IQ0ktMTM5NCBjb250cm9sbGVycyIKLQlkZXBlbmRzIG9uIFBDSSAmJiBGSVJFV0lSRQorCWRlcGVuZHMgb24gUENJICYmIEZJUkVXSVJFICYmIE1NVQogCWhlbHAKIAkgIEVuYWJsZSB0aGlzIGRyaXZlciBpZiB5b3UgaGF2ZSBhIEZpcmVXaXJlIGNvbnRyb2xsZXIgYmFzZWQKIAkgIG9uIHRoZSBPSENJIHNwZWNpZmljYXRpb24uICBGb3IgYWxsIHByYWN0aWNhbCBwdXJwb3NlcywgdGhpcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJld2lyZS9jb3JlLWNkZXYuYyBiL2RyaXZlcnMvZmlyZXdpcmUvY29yZS1jZGV2LmMKaW5kZXggMTRiYjdiNy4uNDhhZTcxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJld2lyZS9jb3JlLWNkZXYuYworKysgYi9kcml2ZXJzL2ZpcmV3aXJlL2NvcmUtY2Rldi5jCkBAIC0xNTAxLDkgKzE1MDEsMTAgQEAKIAllLT5jbGllbnQJCT0gY2xpZW50OwogCWUtPnAuc3BlZWQJCT0gU0NPREVfMTAwOwogCWUtPnAuZ2VuZXJhdGlvbgkJPSBhLT5nZW5lcmF0aW9uOwotCWUtPnAuaGVhZGVyWzBdCQk9IGEtPmRhdGFbMF07Ci0JZS0+cC5oZWFkZXJbMV0JCT0gYS0+ZGF0YVsxXTsKLQllLT5wLmhlYWRlcl9sZW5ndGgJPSA4OworCWUtPnAuaGVhZGVyWzBdCQk9IFRDT0RFX0xJTktfSU5URVJOQUwgPDwgNDsKKwllLT5wLmhlYWRlclsxXQkJPSBhLT5kYXRhWzBdOworCWUtPnAuaGVhZGVyWzJdCQk9IGEtPmRhdGFbMV07CisJZS0+cC5oZWFkZXJfbGVuZ3RoCT0gMTI7CiAJZS0+cC5jYWxsYmFjawkJPSBvdXRib3VuZF9waHlfcGFja2V0X2NhbGxiYWNrOwogCWUtPnBoeV9wYWNrZXQuY2xvc3VyZQk9IGEtPmNsb3N1cmU7CiAJZS0+cGh5X3BhY2tldC50eXBlCT0gRldfQ0RFVl9FVkVOVF9QSFlfUEFDS0VUX1NFTlQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZpcmV3aXJlL2NvcmUtdHJhbnNhY3Rpb24uYyBiL2RyaXZlcnMvZmlyZXdpcmUvY29yZS10cmFuc2FjdGlvbi5jCmluZGV4IGI0MmEwYmQuLmQwMGY4Y2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlyZXdpcmUvY29yZS10cmFuc2FjdGlvbi5jCisrKyBiL2RyaXZlcnMvZmlyZXdpcmUvY29yZS10cmFuc2FjdGlvbi5jCkBAIC03Miw2ICs3MiwxNSBAQAogI2RlZmluZSBQSFlfQ09ORklHX1JPT1RfSUQobm9kZV9pZCkJKCgoKG5vZGVfaWQpICYgMHgzZikgPDwgMjQpIHwgKDEgPDwgMjMpKQogI2RlZmluZSBQSFlfSURFTlRJRklFUihpZCkJCSgoaWQpIDw8IDMwKQogCisvKiByZXR1cm5zIDAgaWYgdGhlIHNwbGl0IHRpbWVvdXQgaGFuZGxlciBpcyBhbHJlYWR5IHJ1bm5pbmcgKi8KK3N0YXRpYyBpbnQgdHJ5X2NhbmNlbF9zcGxpdF90aW1lb3V0KHN0cnVjdCBmd190cmFuc2FjdGlvbiAqdCkKK3sKKwlpZiAodC0+aXNfc3BsaXRfdHJhbnNhY3Rpb24pCisJCXJldHVybiBkZWxfdGltZXIoJnQtPnNwbGl0X3RpbWVvdXRfdGltZXIpOworCWVsc2UKKwkJcmV0dXJuIDE7Cit9CisKIHN0YXRpYyBpbnQgY2xvc2VfdHJhbnNhY3Rpb24oc3RydWN0IGZ3X3RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKIAkJCSAgICAgc3RydWN0IGZ3X2NhcmQgKmNhcmQsIGludCByY29kZSkKIHsKQEAgLTgxLDcgKzkwLDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJmNhcmQtPnRyYW5zYWN0aW9uX2xpc3QsIGxpbmspIHsKIAkJaWYgKHQgPT0gdHJhbnNhY3Rpb24pIHsKLQkJCWlmICghZGVsX3RpbWVyKCZ0LT5zcGxpdF90aW1lb3V0X3RpbWVyKSkgeworCQkJaWYgKCF0cnlfY2FuY2VsX3NwbGl0X3RpbWVvdXQodCkpIHsKIAkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CiAJCQkJZ290byB0aW1lZF9vdXQ7CiAJCQl9CkBAIC0xNDEsMTYgKzE1MCwyOCBAQAogCWNhcmQtPnRsYWJlbF9tYXNrICY9IH4oMVVMTCA8PCB0LT50bGFiZWwpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKIAotCWNhcmQtPmRyaXZlci0+Y2FuY2VsX3BhY2tldChjYXJkLCAmdC0+cGFja2V0KTsKLQotCS8qCi0JICogQXQgdGhpcyBwb2ludCBjYW5jZWxfcGFja2V0IHdpbGwgbmV2ZXIgY2FsbCB0aGUgdHJhbnNhY3Rpb24KLQkgKiBjYWxsYmFjaywgc2luY2Ugd2UganVzdCB0b29rIHRoZSB0cmFuc2FjdGlvbiBvdXQgb2YgdGhlIGxpc3QuCi0JICogU28gZG8gaXQgaGVyZS4KLQkgKi8KIAl0LT5jYWxsYmFjayhjYXJkLCBSQ09ERV9DQU5DRUxMRUQsIE5VTEwsIDAsIHQtPmNhbGxiYWNrX2RhdGEpOwogfQogCitzdGF0aWMgdm9pZCBzdGFydF9zcGxpdF90cmFuc2FjdGlvbl90aW1lb3V0KHN0cnVjdCBmd190cmFuc2FjdGlvbiAqdCwKKwkJCQkJICAgIHN0cnVjdCBmd19jYXJkICpjYXJkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCisJaWYgKGxpc3RfZW1wdHkoJnQtPmxpbmspIHx8IFdBUk5fT04odC0+aXNfc3BsaXRfdHJhbnNhY3Rpb24pKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCXQtPmlzX3NwbGl0X3RyYW5zYWN0aW9uID0gdHJ1ZTsKKwltb2RfdGltZXIoJnQtPnNwbGl0X3RpbWVvdXRfdGltZXIsCisJCSAgamlmZmllcyArIGNhcmQtPnNwbGl0X3RpbWVvdXRfamlmZmllcyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Cit9CisKIHN0YXRpYyB2b2lkIHRyYW5zbWl0X2NvbXBsZXRlX2NhbGxiYWNrKHN0cnVjdCBmd19wYWNrZXQgKnBhY2tldCwKIAkJCQkgICAgICAgc3RydWN0IGZ3X2NhcmQgKmNhcmQsIGludCBzdGF0dXMpCiB7CkBAIC0xNjIsNyArMTgzLDcgQEAKIAkJY2xvc2VfdHJhbnNhY3Rpb24odCwgY2FyZCwgUkNPREVfQ09NUExFVEUpOwogCQlicmVhazsKIAljYXNlIEFDS19QRU5ESU5HOgotCQl0LT50aW1lc3RhbXAgPSBwYWNrZXQtPnRpbWVzdGFtcDsKKwkJc3RhcnRfc3BsaXRfdHJhbnNhY3Rpb25fdGltZW91dCh0LCBjYXJkKTsKIAkJYnJlYWs7CiAJY2FzZSBBQ0tfQlVTWV9YOgogCWNhc2UgQUNLX0JVU1lfQToKQEAgLTI1MCw3ICsyNzEsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCVdBUk4oMSwgIndyb25nIHRjb2RlICVkIiwgdGNvZGUpOworCQlXQVJOKDEsICJ3cm9uZyB0Y29kZSAlZFxuIiwgdGNvZGUpOwogCX0KICBjb21tb246CiAJcGFja2V0LT5zcGVlZCA9IHNwZWVkOwpAQCAtMzQ5LDExICszNzAsOSBAQAogCXQtPm5vZGVfaWQgPSBkZXN0aW5hdGlvbl9pZDsKIAl0LT50bGFiZWwgPSB0bGFiZWw7CiAJdC0+Y2FyZCA9IGNhcmQ7CisJdC0+aXNfc3BsaXRfdHJhbnNhY3Rpb24gPSBmYWxzZTsKIAlzZXR1cF90aW1lcigmdC0+c3BsaXRfdGltZW91dF90aW1lciwKIAkJICAgIHNwbGl0X3RyYW5zYWN0aW9uX3RpbWVvdXRfY2FsbGJhY2ssICh1bnNpZ25lZCBsb25nKXQpOwotCS8qIEZJWE1FOiBzdGFydCB0aGlzIHRpbWVyIGxhdGVyLCByZWxhdGl2ZSB0byB0LT50aW1lc3RhbXAgKi8KLQltb2RfdGltZXIoJnQtPnNwbGl0X3RpbWVvdXRfdGltZXIsCi0JCSAgamlmZmllcyArIGNhcmQtPnNwbGl0X3RpbWVvdXRfamlmZmllcyk7CiAJdC0+Y2FsbGJhY2sgPSBjYWxsYmFjazsKIAl0LT5jYWxsYmFja19kYXRhID0gY2FsbGJhY2tfZGF0YTsKIApAQCAtNDIzLDcgKzQ0Miw4IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZndfcGFja2V0IHBoeV9jb25maWdfcGFja2V0ID0gewotCS5oZWFkZXJfbGVuZ3RoCT0gOCwKKwkuaGVhZGVyX2xlbmd0aAk9IDEyLAorCS5oZWFkZXJbMF0JPSBUQ09ERV9MSU5LX0lOVEVSTkFMIDw8IDQsCiAJLnBheWxvYWRfbGVuZ3RoCT0gMCwKIAkuc3BlZWQJCT0gU0NPREVfMTAwLAogCS5jYWxsYmFjawk9IHRyYW5zbWl0X3BoeV9wYWNrZXRfY2FsbGJhY2ssCkBAIC00NTEsOCArNDcxLDggQEAKIAogCW11dGV4X2xvY2soJnBoeV9jb25maWdfbXV0ZXgpOwogCi0JcGh5X2NvbmZpZ19wYWNrZXQuaGVhZGVyWzBdID0gZGF0YTsKLQlwaHlfY29uZmlnX3BhY2tldC5oZWFkZXJbMV0gPSB+ZGF0YTsKKwlwaHlfY29uZmlnX3BhY2tldC5oZWFkZXJbMV0gPSBkYXRhOworCXBoeV9jb25maWdfcGFja2V0LmhlYWRlclsyXSA9IH5kYXRhOwogCXBoeV9jb25maWdfcGFja2V0LmdlbmVyYXRpb24gPSBnZW5lcmF0aW9uOwogCUlOSVRfQ09NUExFVElPTihwaHlfY29uZmlnX2RvbmUpOwogCkBAIC02MzgsNyArNjU4LDcgQEAKIAkJfQogCiAJZGVmYXVsdDoKLQkJV0FSTigxLCAid3JvbmcgdGNvZGUgJWQiLCB0Y29kZSk7CisJCVdBUk4oMSwgIndyb25nIHRjb2RlICVkXG4iLCB0Y29kZSk7CiAJCXJldHVybiAwOwogCX0KIH0KQEAgLTY5NCw3ICs3MTQsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCVdBUk4oMSwgIndyb25nIHRjb2RlICVkIiwgdGNvZGUpOworCQlXQVJOKDEsICJ3cm9uZyB0Y29kZSAlZFxuIiwgdGNvZGUpOwogCX0KIAogCXJlc3BvbnNlLT5wYXlsb2FkX21hcHBlZCA9IGZhbHNlOwpAQCAtOTI1LDcgKzk0NSw3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZjYXJkLT50cmFuc2FjdGlvbl9saXN0LCBsaW5rKSB7CiAJCWlmICh0LT5ub2RlX2lkID09IHNvdXJjZSAmJiB0LT50bGFiZWwgPT0gdGxhYmVsKSB7Ci0JCQlpZiAoIWRlbF90aW1lcigmdC0+c3BsaXRfdGltZW91dF90aW1lcikpIHsKKwkJCWlmICghdHJ5X2NhbmNlbF9zcGxpdF90aW1lb3V0KHQpKSB7CiAJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwogCQkJCWdvdG8gdGltZWRfb3V0OwogCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJld2lyZS9jb3JlLmggYi9kcml2ZXJzL2ZpcmV3aXJlL2NvcmUuaAppbmRleCBlNjIzOWY5Li5mOGRmY2YxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2ZpcmV3aXJlL2NvcmUuaAorKysgYi9kcml2ZXJzL2ZpcmV3aXJlL2NvcmUuaApAQCAtMjE1LDkgKzIxNSwxMSBAQAogCiAvKiAtdHJhbnNhY3Rpb24gKi8KIAorI2RlZmluZSBUQ09ERV9MSU5LX0lOVEVSTkFMCQkweGUKKwogI2RlZmluZSBUQ09ERV9JU19SRUFEX1JFUVVFU1QodGNvZGUpCSgoKHRjb2RlKSAmIH4xKSA9PSA0KQogI2RlZmluZSBUQ09ERV9JU19CTE9DS19QQUNLRVQodGNvZGUpCSgoKHRjb2RlKSAmICAxKSAhPSAwKQotI2RlZmluZSBUQ09ERV9JU19MSU5LX0lOVEVSTkFMKHRjb2RlKQkoKHRjb2RlKSA9PSAweGUpCisjZGVmaW5lIFRDT0RFX0lTX0xJTktfSU5URVJOQUwodGNvZGUpCSgodGNvZGUpID09IFRDT0RFX0xJTktfSU5URVJOQUwpCiAjZGVmaW5lIFRDT0RFX0lTX1JFUVVFU1QodGNvZGUpCQkoKCh0Y29kZSkgJiAgMikgPT0gMCkKICNkZWZpbmUgVENPREVfSVNfUkVTUE9OU0UodGNvZGUpCSgoKHRjb2RlKSAmICAyKSAhPSAwKQogI2RlZmluZSBUQ09ERV9IQVNfUkVRVUVTVF9EQVRBKHRjb2RlKQkoKCh0Y29kZSkgJiAxMikgIT0gNCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlyZXdpcmUvbmV0LmMgYi9kcml2ZXJzL2ZpcmV3aXJlL25ldC5jCmluZGV4IDFhNDY3YTkuLmMyZTE5NGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlyZXdpcmUvbmV0LmMKKysrIGIvZHJpdmVycy9maXJld2lyZS9uZXQuYwpAQCAtOSw2ICs5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9idWcuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KICNpbmNsdWRlIDxsaW51eC9maXJld2lyZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpcmV3aXJlLWNvbnN0YW50cy5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KQEAgLTE3OSw2ICsxODAsNyBAQAogCS8qIE51bWJlciBvZiB0eCBkYXRhZ3JhbXMgdGhhdCBoYXZlIGJlZW4gcXVldWVkIGJ1dCBub3QgeWV0IGFja2VkICovCiAJaW50IHF1ZXVlZF9kYXRhZ3JhbXM7CiAKKwlpbnQgcGVlcl9jb3VudDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHBlZXJfbGlzdDsKIAlzdHJ1Y3QgZndfY2FyZCAqY2FyZDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwpAQCAtOTk2LDE1ICs5OTgsMjMgQEAKIHN0YXRpYyB2b2lkIGZ3bmV0X3dyaXRlX2NvbXBsZXRlKHN0cnVjdCBmd19jYXJkICpjYXJkLCBpbnQgcmNvZGUsCiAJCQkJIHZvaWQgKnBheWxvYWQsIHNpemVfdCBsZW5ndGgsIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGZ3bmV0X3BhY2tldF90YXNrICpwdGFzazsKLQotCXB0YXNrID0gZGF0YTsKKwlzdHJ1Y3QgZnduZXRfcGFja2V0X3Rhc2sgKnB0YXNrID0gZGF0YTsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyBqOworCXN0YXRpYyBpbnQgbGFzdF9yY29kZSwgZXJyb3JzX3NraXBwZWQ7CiAKIAlpZiAocmNvZGUgPT0gUkNPREVfQ09NUExFVEUpIHsKIAkJZnduZXRfdHJhbnNtaXRfcGFja2V0X2RvbmUocHRhc2spOwogCX0gZWxzZSB7Ci0JCWZ3X2Vycm9yKCJmd25ldF93cml0ZV9jb21wbGV0ZTogZmFpbGVkOiAleFxuIiwgcmNvZGUpOwogCQlmd25ldF90cmFuc21pdF9wYWNrZXRfZmFpbGVkKHB0YXNrKTsKKworCQlpZiAocHJpbnRrX3RpbWVkX3JhdGVsaW1pdCgmaiwgIDEwMDApIHx8IHJjb2RlICE9IGxhc3RfcmNvZGUpIHsKKwkJCWZ3X2Vycm9yKCJmd25ldF93cml0ZV9jb21wbGV0ZTogIgorCQkJCSJmYWlsZWQ6ICV4IChza2lwcGVkICVkKVxuIiwgcmNvZGUsIGVycm9yc19za2lwcGVkKTsKKworCQkJZXJyb3JzX3NraXBwZWQgPSAwOworCQkJbGFzdF9yY29kZSA9IHJjb2RlOworCQl9IGVsc2UKKwkJCWVycm9yc19za2lwcGVkKys7CiAJfQogfQogCkBAIC0xMjEzLDYgKzEyMjMsMTQgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCitzdGF0aWMgdm9pZCBzZXRfY2Fycmllcl9zdGF0ZShzdHJ1Y3QgZnduZXRfZGV2aWNlICpkZXYpCit7CisJaWYgKGRldi0+cGVlcl9jb3VudCA+IDEpCisJCW5ldGlmX2NhcnJpZXJfb24oZGV2LT5uZXRkZXYpOworCWVsc2UKKwkJbmV0aWZfY2Fycmllcl9vZmYoZGV2LT5uZXRkZXYpOworfQorCiAvKiBpZnVwICovCiBzdGF0aWMgaW50IGZ3bmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKIHsKQEAgLTEyMjYsNiArMTI0NCwxMCBAQAogCX0KIAluZXRpZl9zdGFydF9xdWV1ZShuZXQpOwogCisJc3Bpbl9sb2NrX2lycSgmZGV2LT5sb2NrKTsKKwlzZXRfY2Fycmllcl9zdGF0ZShkZXYpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2LT5sb2NrKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xMzk3LDYgKzE0MTksMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBmd25ldF9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2xpbmsJPSBldGh0b29sX29wX2dldF9saW5rLAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBmd25ldF9uZXRkZXZfb3BzID0gewogCS5uZG9fb3BlbiAgICAgICA9IGZ3bmV0X29wZW4sCiAJLm5kb19zdG9wCT0gZnduZXRfc3RvcCwKQEAgLTE0MTUsNiArMTQ0MSw3IEBACiAJbmV0LT5oYXJkX2hlYWRlcl9sZW4JPSBGV05FVF9ITEVOOwogCW5ldC0+dHlwZQkJPSBBUlBIUkRfSUVFRTEzOTQ7CiAJbmV0LT50eF9xdWV1ZV9sZW4JPSBGV05FVF9UWF9RVUVVRV9MRU47CisJbmV0LT5ldGh0b29sX29wcwk9ICZmd25ldF9ldGh0b29sX29wczsKIH0KIAogLyogY2FsbGVyIG11c3QgaG9sZCBmd25ldF9kZXZpY2VfbXV0ZXggKi8KQEAgLTE0NTUsNiArMTQ4Miw4IEBACiAKIAlzcGluX2xvY2tfaXJxKCZkZXYtPmxvY2spOwogCWxpc3RfYWRkX3RhaWwoJnBlZXItPnBlZXJfbGluaywgJmRldi0+cGVlcl9saXN0KTsKKwlkZXYtPnBlZXJfY291bnQrKzsKKwlzZXRfY2Fycmllcl9zdGF0ZShkZXYpOwogCXNwaW5fdW5sb2NrX2lycSgmZGV2LT5sb2NrKTsKIAogCXJldHVybiAwOwpAQCAtMTUzNSwxMyArMTU2NCwxNSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIGZ3bmV0X3JlbW92ZV9wZWVyKHN0cnVjdCBmd25ldF9wZWVyICpwZWVyKQorc3RhdGljIHZvaWQgZnduZXRfcmVtb3ZlX3BlZXIoc3RydWN0IGZ3bmV0X3BlZXIgKnBlZXIsIHN0cnVjdCBmd25ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZnduZXRfcGFydGlhbF9kYXRhZ3JhbSAqcGQsICpwZF9uZXh0OwogCi0Jc3Bpbl9sb2NrX2lycSgmcGVlci0+ZGV2LT5sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZkZXYtPmxvY2spOwogCWxpc3RfZGVsKCZwZWVyLT5wZWVyX2xpbmspOwotCXNwaW5fdW5sb2NrX2lycSgmcGVlci0+ZGV2LT5sb2NrKTsKKwlkZXYtPnBlZXJfY291bnQtLTsKKwlzZXRfY2Fycmllcl9zdGF0ZShkZXYpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2LT5sb2NrKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwZCwgcGRfbmV4dCwgJnBlZXItPnBkX2xpc3QsIHBkX2xpbmspCiAJCWZ3bmV0X3BkX2RlbGV0ZShwZCk7CkBAIC0xNTU4LDcgKzE1ODksNyBAQAogCiAJbXV0ZXhfbG9jaygmZnduZXRfZGV2aWNlX211dGV4KTsKIAotCWZ3bmV0X3JlbW92ZV9wZWVyKHBlZXIpOworCWZ3bmV0X3JlbW92ZV9wZWVyKHBlZXIsIGRldik7CiAKIAlpZiAobGlzdF9lbXB0eSgmZGV2LT5wZWVyX2xpc3QpKSB7CiAJCW5ldCA9IGRldi0+bmV0ZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJld2lyZS9ub3N5LmMgYi9kcml2ZXJzL2ZpcmV3aXJlL25vc3kuYwppbmRleCBiZjE4NGZiLi4wNjE4MTQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2ZpcmV3aXJlL25vc3kuYworKysgYi9kcml2ZXJzL2ZpcmV3aXJlL25vc3kuYwpAQCAtMzAyLDcgKzMwMiw3IEBACiAKIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBjbGllbnQ7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7CiBmYWlsOgogCWtmcmVlKGNsaWVudCk7CiAJbHlueF9wdXQobHlueCk7CkBAIC00MDUsNyArNDA1LDYgQEAKIAkucG9sbCA9CQkJbm9zeV9wb2xsLAogCS5vcGVuID0JCQlub3N5X29wZW4sCiAJLnJlbGVhc2UgPQkJbm9zeV9yZWxlYXNlLAotCS5sbHNlZWsgPQkJbm9vcF9sbHNlZWssCiB9OwogCiAjZGVmaW5lIFBIWV9QQUNLRVRfU0laRSAxMiAvKiAxIHBheWxvYWQsIDEgaW52ZXJzZSwgMSBhY2sgPSAzIHF1YWRsZXRzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZpcmV3aXJlL29oY2kuYyBiL2RyaXZlcnMvZmlyZXdpcmUvb2hjaS5jCmluZGV4IGUzYzhiNjAuLmQ3N2QxMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlyZXdpcmUvb2hjaS5jCisrKyBiL2RyaXZlcnMvZmlyZXdpcmUvb2hjaS5jCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9idWcuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC00MCw2ICs0MSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogCiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CkBAIC04MCwxNyArODIsMjMgQEAKICNkZWZpbmUgQ09NTUFORF9QVFIocmVncykJKChyZWdzKSArIDEyKQogI2RlZmluZSBDT05URVhUX01BVENIKHJlZ3MpCSgocmVncykgKyAxNikKIAotc3RydWN0IGFyX2J1ZmZlciB7Ci0Jc3RydWN0IGRlc2NyaXB0b3IgZGVzY3JpcHRvcjsKLQlzdHJ1Y3QgYXJfYnVmZmVyICpuZXh0OwotCV9fbGUzMiBkYXRhWzBdOwotfTsKKyNkZWZpbmUgQVJfQlVGRkVSX1NJWkUJKDMyKjEwMjQpCisjZGVmaW5lIEFSX0JVRkZFUlNfTUlOCURJVl9ST1VORF9VUChBUl9CVUZGRVJfU0laRSwgUEFHRV9TSVpFKQorLyogd2UgbmVlZCBhdCBsZWFzdCB0d28gcGFnZXMgZm9yIHByb3BlciBsaXN0IG1hbmFnZW1lbnQgKi8KKyNkZWZpbmUgQVJfQlVGRkVSUwkoQVJfQlVGRkVSU19NSU4gPj0gMiA/IEFSX0JVRkZFUlNfTUlOIDogMikKKworI2RlZmluZSBNQVhfQVNZTkNfUEFZTE9BRAk0MDk2CisjZGVmaW5lIE1BWF9BUl9QQUNLRVRfU0laRQkoMTYgKyBNQVhfQVNZTkNfUEFZTE9BRCArIDQpCisjZGVmaW5lIEFSX1dSQVBBUk9VTkRfUEFHRVMJRElWX1JPVU5EX1VQKE1BWF9BUl9QQUNLRVRfU0laRSwgUEFHRV9TSVpFKQogCiBzdHJ1Y3QgYXJfY29udGV4dCB7CiAJc3RydWN0IGZ3X29oY2kgKm9oY2k7Ci0Jc3RydWN0IGFyX2J1ZmZlciAqY3VycmVudF9idWZmZXI7Ci0Jc3RydWN0IGFyX2J1ZmZlciAqbGFzdF9idWZmZXI7CisJc3RydWN0IHBhZ2UgKnBhZ2VzW0FSX0JVRkZFUlNdOworCXZvaWQgKmJ1ZmZlcjsKKwlzdHJ1Y3QgZGVzY3JpcHRvciAqZGVzY3JpcHRvcnM7CisJZG1hX2FkZHJfdCBkZXNjcmlwdG9yc19idXM7CiAJdm9pZCAqcG9pbnRlcjsKKwl1bnNpZ25lZCBpbnQgbGFzdF9idWZmZXJfaW5kZXg7CiAJdTMyIHJlZ3M7CiAJc3RydWN0IHRhc2tsZXRfc3RydWN0IHRhc2tsZXQ7CiB9OwpAQCAtMTE3LDYgKzEyNSw4IEBACiAJc3RydWN0IGZ3X29oY2kgKm9oY2k7CiAJdTMyIHJlZ3M7CiAJaW50IHRvdGFsX2FsbG9jYXRpb247CisJYm9vbCBydW5uaW5nOworCWJvb2wgZmx1c2hpbmc7CiAKIAkvKgogCSAqIExpc3Qgb2YgcGFnZS1zaXplZCBidWZmZXJzIGZvciBzdG9yaW5nIERNQSBkZXNjcmlwdG9ycy4KQEAgLTE2MSw2ICsxNzEsOSBAQAogCWludCBleGNlc3NfYnl0ZXM7CiAJdm9pZCAqaGVhZGVyOwogCXNpemVfdCBoZWFkZXJfbGVuZ3RoOworCisJdTggc3luYzsKKwl1OCB0YWdzOwogfTsKIAogI2RlZmluZSBDT05GSUdfUk9NX1NJWkUgMTAyNApAQCAtMTc3LDcgKzE5MCw4IEBACiAJdTMyIGJ1c190aW1lOwogCWJvb2wgaXNfcm9vdDsKIAlib29sIGNzcl9zdGF0ZV9zZXRjbGVhcl9hYmRpY2F0ZTsKLQorCWludCBuX2lyOworCWludCBuX2l0OwogCS8qCiAJICogU3BpbmxvY2sgZm9yIGFjY2Vzc2luZyBmd19vaGNpIGRhdGEuICBOZXZlciBjYWxsIG91dCBvZgogCSAqIHRoaXMgZHJpdmVyIHdpdGggdGhpcyBsb2NrIGhlbGQuCkBAIC0xODYsNiArMjAwLDkgQEAKIAogCXN0cnVjdCBtdXRleCBwaHlfcmVnX211dGV4OwogCisJdm9pZCAqbWlzY19idWZmZXI7CisJZG1hX2FkZHJfdCBtaXNjX2J1ZmZlcl9idXM7CisKIAlzdHJ1Y3QgYXJfY29udGV4dCBhcl9yZXF1ZXN0X2N0eDsKIAlzdHJ1Y3QgYXJfY29udGV4dCBhcl9yZXNwb25zZV9jdHg7CiAJc3RydWN0IGNvbnRleHQgYXRfcmVxdWVzdF9jdHg7CkBAIC00MTEsMTAgKzQyOCw2IEBACiAJWzB4Y10gPSAiLXJlc2VydmVkLSIsCQlbMHhkXSA9ICItcmVzZXJ2ZWQtIiwKIAlbMHhlXSA9ICJsaW5rIGludGVybmFsIiwJWzB4Zl0gPSAiLXJlc2VydmVkLSIsCiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKnBoeXNbXSA9IHsKLQlbMHgwXSA9ICJwaHkgY29uZmlnIHBhY2tldCIsCVsweDFdID0gImxpbmstb24gcGFja2V0IiwKLQlbMHgyXSA9ICJzZWxmLWlkIHBhY2tldCIsCVsweDNdID0gIi1yZXNlcnZlZC0iLAotfTsKIAogc3RhdGljIHZvaWQgbG9nX2FyX2F0X2V2ZW50KGNoYXIgZGlyLCBpbnQgc3BlZWQsIHUzMiAqaGVhZGVyLCBpbnQgZXZ0KQogewpAQCAtNDMzLDEyICs0NDYsNiBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKGhlYWRlclswXSA9PSB+aGVhZGVyWzFdKSB7Ci0JCWZ3X25vdGlmeSgiQSVjICVzLCAlcywgJTA4eFxuIiwKLQkJICAgIGRpciwgZXZ0c1tldnRdLCBwaHlzW2hlYWRlclswXSA+PiAzMCAmIDB4M10sIGhlYWRlclswXSk7Ci0JCXJldHVybjsKLQl9Ci0KIAlzd2l0Y2ggKHRjb2RlKSB7CiAJY2FzZSAweDA6IGNhc2UgMHg2OiBjYXNlIDB4ODoKIAkJc25wcmludGYoc3BlY2lmaWMsIHNpemVvZihzcGVjaWZpYyksICIgPSAlMDh4IiwKQEAgLTQ1Myw5ICs0NjAsMTMgQEAKIAl9CiAKIAlzd2l0Y2ggKHRjb2RlKSB7Ci0JY2FzZSAweGU6IGNhc2UgMHhhOgorCWNhc2UgMHhhOgogCQlmd19ub3RpZnkoIkElYyAlcywgJXNcbiIsIGRpciwgZXZ0c1tldnRdLCB0Y29kZXNbdGNvZGVdKTsKIAkJYnJlYWs7CisJY2FzZSAweGU6CisJCWZ3X25vdGlmeSgiQSVjICVzLCBQSFkgJTA4eCAlMDh4XG4iLAorCQkJICBkaXIsIGV2dHNbZXZ0XSwgaGVhZGVyWzFdLCBoZWFkZXJbMl0pOworCQlicmVhazsKIAljYXNlIDB4MDogY2FzZSAweDE6IGNhc2UgMHg0OiBjYXNlIDB4NTogY2FzZSAweDk6CiAJCWZ3X25vdGlmeSgiQSVjIHNwZCAleCB0bCAlMDJ4LCAiCiAJCSAgICAiJTA0eCAtPiAlMDR4LCAlcywgIgpAQCAtNTk0LDU5ICs2MDUsMTUwIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgYXJfY29udGV4dF9saW5rX3BhZ2Uoc3RydWN0IGFyX2NvbnRleHQgKmN0eCwKLQkJCQkgc3RydWN0IGFyX2J1ZmZlciAqYWIsIGRtYV9hZGRyX3QgYWJfYnVzKQorc3RhdGljIGlubGluZSBkbWFfYWRkcl90IGFyX2J1ZmZlcl9idXMoc3RydWN0IGFyX2NvbnRleHQgKmN0eCwgdW5zaWduZWQgaW50IGkpCiB7Ci0Jc2l6ZV90IG9mZnNldDsKKwlyZXR1cm4gcGFnZV9wcml2YXRlKGN0eC0+cGFnZXNbaV0pOworfQogCi0JYWItPm5leHQgPSBOVUxMOwotCW1lbXNldCgmYWItPmRlc2NyaXB0b3IsIDAsIHNpemVvZihhYi0+ZGVzY3JpcHRvcikpOwotCWFiLT5kZXNjcmlwdG9yLmNvbnRyb2wgICAgICAgID0gY3B1X3RvX2xlMTYoREVTQ1JJUFRPUl9JTlBVVF9NT1JFIHwKLQkJCQkJCSAgICBERVNDUklQVE9SX1NUQVRVUyB8Ci0JCQkJCQkgICAgREVTQ1JJUFRPUl9CUkFOQ0hfQUxXQVlTKTsKLQlvZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgYXJfYnVmZmVyLCBkYXRhKTsKLQlhYi0+ZGVzY3JpcHRvci5yZXFfY291bnQgICAgICA9IGNwdV90b19sZTE2KFBBR0VfU0laRSAtIG9mZnNldCk7Ci0JYWItPmRlc2NyaXB0b3IuZGF0YV9hZGRyZXNzICAgPSBjcHVfdG9fbGUzMihhYl9idXMgKyBvZmZzZXQpOwotCWFiLT5kZXNjcmlwdG9yLnJlc19jb3VudCAgICAgID0gY3B1X3RvX2xlMTYoUEFHRV9TSVpFIC0gb2Zmc2V0KTsKLQlhYi0+ZGVzY3JpcHRvci5icmFuY2hfYWRkcmVzcyA9IDA7CitzdGF0aWMgdm9pZCBhcl9jb250ZXh0X2xpbmtfcGFnZShzdHJ1Y3QgYXJfY29udGV4dCAqY3R4LCB1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisJc3RydWN0IGRlc2NyaXB0b3IgKmQ7CisKKwlkID0gJmN0eC0+ZGVzY3JpcHRvcnNbaW5kZXhdOworCWQtPmJyYW5jaF9hZGRyZXNzICAmPSBjcHVfdG9fbGUzMih+MHhmKTsKKwlkLT5yZXNfY291bnQgICAgICAgPSAgY3B1X3RvX2xlMTYoUEFHRV9TSVpFKTsKKwlkLT50cmFuc2Zlcl9zdGF0dXMgPSAgMDsKIAogCXdtYigpOyAvKiBmaW5pc2ggaW5pdCBvZiBuZXcgZGVzY3JpcHRvcnMgYmVmb3JlIGJyYW5jaF9hZGRyZXNzIHVwZGF0ZSAqLwotCWN0eC0+bGFzdF9idWZmZXItPmRlc2NyaXB0b3IuYnJhbmNoX2FkZHJlc3MgPSBjcHVfdG9fbGUzMihhYl9idXMgfCAxKTsKLQljdHgtPmxhc3RfYnVmZmVyLT5uZXh0ID0gYWI7Ci0JY3R4LT5sYXN0X2J1ZmZlciA9IGFiOworCWQgPSAmY3R4LT5kZXNjcmlwdG9yc1tjdHgtPmxhc3RfYnVmZmVyX2luZGV4XTsKKwlkLT5icmFuY2hfYWRkcmVzcyAgfD0gY3B1X3RvX2xlMzIoMSk7CisKKwljdHgtPmxhc3RfYnVmZmVyX2luZGV4ID0gaW5kZXg7CiAKIAlyZWdfd3JpdGUoY3R4LT5vaGNpLCBDT05UUk9MX1NFVChjdHgtPnJlZ3MpLCBDT05URVhUX1dBS0UpOwogCWZsdXNoX3dyaXRlcyhjdHgtPm9oY2kpOwogfQogCi1zdGF0aWMgaW50IGFyX2NvbnRleHRfYWRkX3BhZ2Uoc3RydWN0IGFyX2NvbnRleHQgKmN0eCkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjdHgtPm9oY2ktPmNhcmQuZGV2aWNlOwotCXN0cnVjdCBhcl9idWZmZXIgKmFiOwotCWRtYV9hZGRyX3QgdW5pbml0aWFsaXplZF92YXIoYWJfYnVzKTsKLQotCWFiID0gZG1hX2FsbG9jX2NvaGVyZW50KGRldiwgUEFHRV9TSVpFLCAmYWJfYnVzLCBHRlBfQVRPTUlDKTsKLQlpZiAoYWIgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlhcl9jb250ZXh0X2xpbmtfcGFnZShjdHgsIGFiLCBhYl9idXMpOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyB2b2lkIGFyX2NvbnRleHRfcmVsZWFzZShzdHJ1Y3QgYXJfY29udGV4dCAqY3R4KQogewotCXN0cnVjdCBhcl9idWZmZXIgKmFiLCAqYWJfbmV4dDsKLQlzaXplX3Qgb2Zmc2V0OwotCWRtYV9hZGRyX3QgYWJfYnVzOworCXVuc2lnbmVkIGludCBpOwogCi0JZm9yIChhYiA9IGN0eC0+Y3VycmVudF9idWZmZXI7IGFiOyBhYiA9IGFiX25leHQpIHsKLQkJYWJfbmV4dCA9IGFiLT5uZXh0OwotCQlvZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgYXJfYnVmZmVyLCBkYXRhKTsKLQkJYWJfYnVzID0gbGUzMl90b19jcHUoYWItPmRlc2NyaXB0b3IuZGF0YV9hZGRyZXNzKSAtIG9mZnNldDsKLQkJZG1hX2ZyZWVfY29oZXJlbnQoY3R4LT5vaGNpLT5jYXJkLmRldmljZSwgUEFHRV9TSVpFLAotCQkJCSAgYWIsIGFiX2J1cyk7CisJaWYgKGN0eC0+YnVmZmVyKQorCQl2bV91bm1hcF9yYW0oY3R4LT5idWZmZXIsIEFSX0JVRkZFUlMgKyBBUl9XUkFQQVJPVU5EX1BBR0VTKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUl9CVUZGRVJTOyBpKyspCisJCWlmIChjdHgtPnBhZ2VzW2ldKSB7CisJCQlkbWFfdW5tYXBfcGFnZShjdHgtPm9oY2ktPmNhcmQuZGV2aWNlLAorCQkJCSAgICAgICBhcl9idWZmZXJfYnVzKGN0eCwgaSksCisJCQkJICAgICAgIFBBR0VfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKwkJCV9fZnJlZV9wYWdlKGN0eC0+cGFnZXNbaV0pOworCQl9Cit9CisKK3N0YXRpYyB2b2lkIGFyX2NvbnRleHRfYWJvcnQoc3RydWN0IGFyX2NvbnRleHQgKmN0eCwgY29uc3QgY2hhciAqZXJyb3JfbXNnKQoreworCWlmIChyZWdfcmVhZChjdHgtPm9oY2ksIENPTlRST0xfQ0xFQVIoY3R4LT5yZWdzKSkgJiBDT05URVhUX1JVTikgeworCQlyZWdfd3JpdGUoY3R4LT5vaGNpLCBDT05UUk9MX0NMRUFSKGN0eC0+cmVncyksIENPTlRFWFRfUlVOKTsKKwkJZmx1c2hfd3JpdGVzKGN0eC0+b2hjaSk7CisKKwkJZndfZXJyb3IoIkFSIGVycm9yOiAlczsgRE1BIHN0b3BwZWRcbiIsIGVycm9yX21zZyk7CiAJfQorCS8qIEZJWE1FOiByZXN0YXJ0PyAqLworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBhcl9uZXh0X2J1ZmZlcl9pbmRleCh1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisJcmV0dXJuIChpbmRleCArIDEpICUgQVJfQlVGRkVSUzsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYXJfcHJldl9idWZmZXJfaW5kZXgodW5zaWduZWQgaW50IGluZGV4KQoreworCXJldHVybiAoaW5kZXggLSAxICsgQVJfQlVGRkVSUykgJSBBUl9CVUZGRVJTOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBhcl9maXJzdF9idWZmZXJfaW5kZXgoc3RydWN0IGFyX2NvbnRleHQgKmN0eCkKK3sKKwlyZXR1cm4gYXJfbmV4dF9idWZmZXJfaW5kZXgoY3R4LT5sYXN0X2J1ZmZlcl9pbmRleCk7Cit9CisKKy8qCisgKiBXZSBzZWFyY2ggZm9yIHRoZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgbGFzdCBBUiBwYWNrZXQgRE1BIGRhdGEgd3JpdHRlbgorICogYnkgdGhlIGNvbnRyb2xsZXIuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXJfc2VhcmNoX2xhc3RfYWN0aXZlX2J1ZmZlcihzdHJ1Y3QgYXJfY29udGV4dCAqY3R4LAorCQkJCQkJIHVuc2lnbmVkIGludCAqYnVmZmVyX29mZnNldCkKK3sKKwl1bnNpZ25lZCBpbnQgaSwgbmV4dF9pLCBsYXN0ID0gY3R4LT5sYXN0X2J1ZmZlcl9pbmRleDsKKwlfX2xlMTYgcmVzX2NvdW50LCBuZXh0X3Jlc19jb3VudDsKKworCWkgPSBhcl9maXJzdF9idWZmZXJfaW5kZXgoY3R4KTsKKwlyZXNfY291bnQgPSBBQ0NFU1NfT05DRShjdHgtPmRlc2NyaXB0b3JzW2ldLnJlc19jb3VudCk7CisKKwkvKiBBIGJ1ZmZlciB0aGF0IGlzIG5vdCB5ZXQgY29tcGxldGVseSBmaWxsZWQgbXVzdCBiZSB0aGUgbGFzdCBvbmUuICovCisJd2hpbGUgKGkgIT0gbGFzdCAmJiByZXNfY291bnQgPT0gMCkgeworCisJCS8qIFBlZWsgYXQgdGhlIG5leHQgZGVzY3JpcHRvci4gKi8KKwkJbmV4dF9pID0gYXJfbmV4dF9idWZmZXJfaW5kZXgoaSk7CisJCXJtYigpOyAvKiByZWFkIGRlc2NyaXB0b3JzIGluIG9yZGVyICovCisJCW5leHRfcmVzX2NvdW50ID0gQUNDRVNTX09OQ0UoCisJCQkJY3R4LT5kZXNjcmlwdG9yc1tuZXh0X2ldLnJlc19jb3VudCk7CisJCS8qCisJCSAqIElmIHRoZSBuZXh0IGRlc2NyaXB0b3IgaXMgc3RpbGwgZW1wdHksIHdlIG11c3Qgc3RvcCBhdCB0aGlzCisJCSAqIGRlc2NyaXB0b3IuCisJCSAqLworCQlpZiAobmV4dF9yZXNfY291bnQgPT0gY3B1X3RvX2xlMTYoUEFHRV9TSVpFKSkgeworCQkJLyoKKwkJCSAqIFRoZSBleGNlcHRpb24gaXMgd2hlbiB0aGUgRE1BIGRhdGEgZm9yIG9uZSBwYWNrZXQgaXMKKwkJCSAqIHNwbGl0IG92ZXIgdGhyZWUgYnVmZmVyczsgaW4gdGhpcyBjYXNlLCB0aGUgbWlkZGxlCisJCQkgKiBidWZmZXIncyBkZXNjcmlwdG9yIG1pZ2h0IGJlIG5ldmVyIHVwZGF0ZWQgYnkgdGhlCisJCQkgKiBjb250cm9sbGVyIGFuZCBsb29rIHN0aWxsIGVtcHR5LCBhbmQgd2UgaGF2ZSB0byBwZWVrCisJCQkgKiBhdCB0aGUgdGhpcmQgb25lLgorCQkJICovCisJCQlpZiAoTUFYX0FSX1BBQ0tFVF9TSVpFID4gUEFHRV9TSVpFICYmIGkgIT0gbGFzdCkgeworCQkJCW5leHRfaSA9IGFyX25leHRfYnVmZmVyX2luZGV4KG5leHRfaSk7CisJCQkJcm1iKCk7CisJCQkJbmV4dF9yZXNfY291bnQgPSBBQ0NFU1NfT05DRSgKKwkJCQkJY3R4LT5kZXNjcmlwdG9yc1tuZXh0X2ldLnJlc19jb3VudCk7CisJCQkJaWYgKG5leHRfcmVzX2NvdW50ICE9IGNwdV90b19sZTE2KFBBR0VfU0laRSkpCisJCQkJCWdvdG8gbmV4dF9idWZmZXJfaXNfYWN0aXZlOworCQkJfQorCisJCQlicmVhazsKKwkJfQorCituZXh0X2J1ZmZlcl9pc19hY3RpdmU6CisJCWkgPSBuZXh0X2k7CisJCXJlc19jb3VudCA9IG5leHRfcmVzX2NvdW50OworCX0KKworCXJtYigpOyAvKiByZWFkIHJlc19jb3VudCBiZWZvcmUgdGhlIERNQSBkYXRhICovCisKKwkqYnVmZmVyX29mZnNldCA9IFBBR0VfU0laRSAtIGxlMTZfdG9fY3B1KHJlc19jb3VudCk7CisJaWYgKCpidWZmZXJfb2Zmc2V0ID4gUEFHRV9TSVpFKSB7CisJCSpidWZmZXJfb2Zmc2V0ID0gMDsKKwkJYXJfY29udGV4dF9hYm9ydChjdHgsICJjb3JydXB0ZWQgZGVzY3JpcHRvciIpOworCX0KKworCXJldHVybiBpOworfQorCitzdGF0aWMgdm9pZCBhcl9zeW5jX2J1ZmZlcnNfZm9yX2NwdShzdHJ1Y3QgYXJfY29udGV4dCAqY3R4LAorCQkJCSAgICB1bnNpZ25lZCBpbnQgZW5kX2J1ZmZlcl9pbmRleCwKKwkJCQkgICAgdW5zaWduZWQgaW50IGVuZF9idWZmZXJfb2Zmc2V0KQoreworCXVuc2lnbmVkIGludCBpOworCisJaSA9IGFyX2ZpcnN0X2J1ZmZlcl9pbmRleChjdHgpOworCXdoaWxlIChpICE9IGVuZF9idWZmZXJfaW5kZXgpIHsKKwkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoY3R4LT5vaGNpLT5jYXJkLmRldmljZSwKKwkJCQkJYXJfYnVmZmVyX2J1cyhjdHgsIGkpLAorCQkJCQlQQUdFX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CisJCWkgPSBhcl9uZXh0X2J1ZmZlcl9pbmRleChpKTsKKwl9CisJaWYgKGVuZF9idWZmZXJfb2Zmc2V0ID4gMCkKKwkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoY3R4LT5vaGNpLT5jYXJkLmRldmljZSwKKwkJCQkJYXJfYnVmZmVyX2J1cyhjdHgsIGkpLAorCQkJCQllbmRfYnVmZmVyX29mZnNldCwgRE1BX0ZST01fREVWSUNFKTsKIH0KIAogI2lmIGRlZmluZWQoQ09ORklHX1BQQ19QTUFDKSAmJiBkZWZpbmVkKENPTkZJR19QUEMzMikKQEAgLTY4OSw2ICs3OTEsMTAgQEAKIAkJcC5oZWFkZXJbM10gPSBjb25kX2xlMzJfdG9fY3B1KGJ1ZmZlclszXSk7CiAJCXAuaGVhZGVyX2xlbmd0aCA9IDE2OwogCQlwLnBheWxvYWRfbGVuZ3RoID0gcC5oZWFkZXJbM10gPj4gMTY7CisJCWlmIChwLnBheWxvYWRfbGVuZ3RoID4gTUFYX0FTWU5DX1BBWUxPQUQpIHsKKwkJCWFyX2NvbnRleHRfYWJvcnQoY3R4LCAiaW52YWxpZCBwYWNrZXQgbGVuZ3RoIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgVENPREVfV1JJVEVfUkVTUE9OU0U6CkBAIC02OTksOSArODA1LDggQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQkvKiBGSVhNRTogU3RvcCBjb250ZXh0LCBkaXNjYXJkIGV2ZXJ5dGhpbmcsIGFuZCByZXN0YXJ0PyAqLwotCQlwLmhlYWRlcl9sZW5ndGggPSAwOwotCQlwLnBheWxvYWRfbGVuZ3RoID0gMDsKKwkJYXJfY29udGV4dF9hYm9ydChjdHgsICJpbnZhbGlkIHRjb2RlIik7CisJCXJldHVybiBOVUxMOwogCX0KIAogCXAucGF5bG9hZCA9ICh2b2lkICopIGJ1ZmZlciArIHAuaGVhZGVyX2xlbmd0aDsKQEAgLTc1MSwxMjEgKzg1NiwxNDcgQEAKIAlyZXR1cm4gYnVmZmVyICsgbGVuZ3RoICsgMTsKIH0KIAotc3RhdGljIHZvaWQgYXJfY29udGV4dF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3N0YXRpYyB2b2lkICpoYW5kbGVfYXJfcGFja2V0cyhzdHJ1Y3QgYXJfY29udGV4dCAqY3R4LCB2b2lkICpwLCB2b2lkICplbmQpCiB7Ci0Jc3RydWN0IGFyX2NvbnRleHQgKmN0eCA9IChzdHJ1Y3QgYXJfY29udGV4dCAqKWRhdGE7Ci0Jc3RydWN0IGFyX2J1ZmZlciAqYWI7Ci0Jc3RydWN0IGRlc2NyaXB0b3IgKmQ7Ci0Jdm9pZCAqYnVmZmVyLCAqZW5kOwotCV9fbGUxNiByZXNfY291bnQ7CisJdm9pZCAqbmV4dDsKIAotCWFiID0gY3R4LT5jdXJyZW50X2J1ZmZlcjsKLQlkID0gJmFiLT5kZXNjcmlwdG9yOworCXdoaWxlIChwIDwgZW5kKSB7CisJCW5leHQgPSBoYW5kbGVfYXJfcGFja2V0KGN0eCwgcCk7CisJCWlmICghbmV4dCkKKwkJCXJldHVybiBwOworCQlwID0gbmV4dDsKKwl9CiAKLQlyZXNfY291bnQgPSBBQ0NFU1NfT05DRShkLT5yZXNfY291bnQpOwotCWlmIChyZXNfY291bnQgPT0gMCkgewotCQlzaXplX3Qgc2l6ZSwgc2l6ZTIsIHJlc3QsIHBrdHNpemUsIHNpemUzLCBvZmZzZXQ7Ci0JCWRtYV9hZGRyX3Qgc3RhcnRfYnVzOwotCQl2b2lkICpzdGFydDsKKwlyZXR1cm4gcDsKK30KIAotCQkvKgotCQkgKiBUaGlzIGRlc2NyaXB0b3IgaXMgZmluaXNoZWQgYW5kIHdlIG1heSBoYXZlIGEKLQkJICogcGFja2V0IHNwbGl0IGFjcm9zcyB0aGlzIGFuZCB0aGUgbmV4dCBidWZmZXIuIFdlCi0JCSAqIHJldXNlIHRoZSBwYWdlIGZvciByZWFzc2VtYmxpbmcgdGhlIHNwbGl0IHBhY2tldC4KLQkJICovCitzdGF0aWMgdm9pZCBhcl9yZWN5Y2xlX2J1ZmZlcnMoc3RydWN0IGFyX2NvbnRleHQgKmN0eCwgdW5zaWduZWQgaW50IGVuZF9idWZmZXIpCit7CisJdW5zaWduZWQgaW50IGk7CiAKLQkJb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IGFyX2J1ZmZlciwgZGF0YSk7Ci0JCXN0YXJ0ID0gYWI7Ci0JCXN0YXJ0X2J1cyA9IGxlMzJfdG9fY3B1KGFiLT5kZXNjcmlwdG9yLmRhdGFfYWRkcmVzcykgLSBvZmZzZXQ7Ci0JCWJ1ZmZlciA9IGFiLT5kYXRhOwotCi0JCWFiID0gYWItPm5leHQ7Ci0JCWQgPSAmYWItPmRlc2NyaXB0b3I7Ci0JCXNpemUgPSBzdGFydCArIFBBR0VfU0laRSAtIGN0eC0+cG9pbnRlcjsKLQkJLyogdmFsaWQgYnVmZmVyIGRhdGEgaW4gdGhlIG5leHQgcGFnZSAqLwotCQlyZXN0ID0gbGUxNl90b19jcHUoZC0+cmVxX2NvdW50KSAtIGxlMTZfdG9fY3B1KGQtPnJlc19jb3VudCk7Ci0JCS8qIHdoYXQgYWN0dWFsbHkgZml0cyBpbiB0aGlzIHBhZ2UgKi8KLQkJc2l6ZTIgPSBtaW4ocmVzdCwgKHNpemVfdClQQUdFX1NJWkUgLSBvZmZzZXQgLSBzaXplKTsKLQkJbWVtbW92ZShidWZmZXIsIGN0eC0+cG9pbnRlciwgc2l6ZSk7Ci0JCW1lbWNweShidWZmZXIgKyBzaXplLCBhYi0+ZGF0YSwgc2l6ZTIpOwotCi0JCXdoaWxlIChzaXplID4gMCkgewotCQkJdm9pZCAqbmV4dCA9IGhhbmRsZV9hcl9wYWNrZXQoY3R4LCBidWZmZXIpOwotCQkJcGt0c2l6ZSA9IG5leHQgLSBidWZmZXI7Ci0JCQlpZiAocGt0c2l6ZSA+PSBzaXplKSB7Ci0JCQkJLyoKLQkJCQkgKiBXZSBoYXZlIGhhbmRsZWQgYWxsIHRoZSBkYXRhIHRoYXQgd2FzCi0JCQkJICogb3JpZ2luYWxseSBpbiB0aGlzIHBhZ2UsIHNvIHdlIGNhbiBub3cKLQkJCQkgKiBjb250aW51ZSBpbiB0aGUgbmV4dCBwYWdlLgotCQkJCSAqLwotCQkJCWJ1ZmZlciA9IG5leHQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkvKiBtb3ZlIHRoZSBuZXh0IHBhY2tldCB0byB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlciAqLwotCQkJbWVtbW92ZShidWZmZXIsIG5leHQsIHNpemUgKyBzaXplMiAtIHBrdHNpemUpOwotCQkJc2l6ZSAtPSBwa3RzaXplOwotCQkJLyogZmlsbCB1cCB0aGlzIHBhZ2UgYWdhaW4gKi8KLQkJCXNpemUzID0gbWluKHJlc3QgLSBzaXplMiwKLQkJCQkgICAgKHNpemVfdClQQUdFX1NJWkUgLSBvZmZzZXQgLSBzaXplIC0gc2l6ZTIpOwotCQkJbWVtY3B5KGJ1ZmZlciArIHNpemUgKyBzaXplMiwKLQkJCSAgICAgICAodm9pZCAqKSBhYi0+ZGF0YSArIHNpemUyLCBzaXplMyk7Ci0JCQlzaXplMiArPSBzaXplMzsKLQkJfQotCi0JCWlmIChyZXN0ID4gMCkgewotCQkJLyogaGFuZGxlIHRoZSBwYWNrZXRzIHRoYXQgYXJlIGZ1bGx5IGluIHRoZSBuZXh0IHBhZ2UgKi8KLQkJCWJ1ZmZlciA9ICh2b2lkICopIGFiLT5kYXRhICsKLQkJCQkJKGJ1ZmZlciAtIChzdGFydCArIG9mZnNldCArIHNpemUpKTsKLQkJCWVuZCA9ICh2b2lkICopIGFiLT5kYXRhICsgcmVzdDsKLQotCQkJd2hpbGUgKGJ1ZmZlciA8IGVuZCkKLQkJCQlidWZmZXIgPSBoYW5kbGVfYXJfcGFja2V0KGN0eCwgYnVmZmVyKTsKLQotCQkJY3R4LT5jdXJyZW50X2J1ZmZlciA9IGFiOwotCQkJY3R4LT5wb2ludGVyID0gZW5kOwotCi0JCQlhcl9jb250ZXh0X2xpbmtfcGFnZShjdHgsIHN0YXJ0LCBzdGFydF9idXMpOwotCQl9IGVsc2UgewotCQkJY3R4LT5wb2ludGVyID0gc3RhcnQgKyBQQUdFX1NJWkU7Ci0JCX0KLQl9IGVsc2UgewotCQlidWZmZXIgPSBjdHgtPnBvaW50ZXI7Ci0JCWN0eC0+cG9pbnRlciA9IGVuZCA9Ci0JCQkodm9pZCAqKSBhYiArIFBBR0VfU0laRSAtIGxlMTZfdG9fY3B1KHJlc19jb3VudCk7Ci0KLQkJd2hpbGUgKGJ1ZmZlciA8IGVuZCkKLQkJCWJ1ZmZlciA9IGhhbmRsZV9hcl9wYWNrZXQoY3R4LCBidWZmZXIpOworCWkgPSBhcl9maXJzdF9idWZmZXJfaW5kZXgoY3R4KTsKKwl3aGlsZSAoaSAhPSBlbmRfYnVmZmVyKSB7CisJCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGN0eC0+b2hjaS0+Y2FyZC5kZXZpY2UsCisJCQkJCSAgIGFyX2J1ZmZlcl9idXMoY3R4LCBpKSwKKwkJCQkJICAgUEFHRV9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOworCQlhcl9jb250ZXh0X2xpbmtfcGFnZShjdHgsIGkpOworCQlpID0gYXJfbmV4dF9idWZmZXJfaW5kZXgoaSk7CiAJfQogfQogCi1zdGF0aWMgaW50IGFyX2NvbnRleHRfaW5pdChzdHJ1Y3QgYXJfY29udGV4dCAqY3R4LAotCQkJICAgc3RydWN0IGZ3X29oY2kgKm9oY2ksIHUzMiByZWdzKQorc3RhdGljIHZvaWQgYXJfY29udGV4dF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQlzdHJ1Y3QgYXJfYnVmZmVyIGFiOworCXN0cnVjdCBhcl9jb250ZXh0ICpjdHggPSAoc3RydWN0IGFyX2NvbnRleHQgKilkYXRhOworCXVuc2lnbmVkIGludCBlbmRfYnVmZmVyX2luZGV4LCBlbmRfYnVmZmVyX29mZnNldDsKKwl2b2lkICpwLCAqZW5kOworCisJcCA9IGN0eC0+cG9pbnRlcjsKKwlpZiAoIXApCisJCXJldHVybjsKKworCWVuZF9idWZmZXJfaW5kZXggPSBhcl9zZWFyY2hfbGFzdF9hY3RpdmVfYnVmZmVyKGN0eCwKKwkJCQkJCQkmZW5kX2J1ZmZlcl9vZmZzZXQpOworCWFyX3N5bmNfYnVmZmVyc19mb3JfY3B1KGN0eCwgZW5kX2J1ZmZlcl9pbmRleCwgZW5kX2J1ZmZlcl9vZmZzZXQpOworCWVuZCA9IGN0eC0+YnVmZmVyICsgZW5kX2J1ZmZlcl9pbmRleCAqIFBBR0VfU0laRSArIGVuZF9idWZmZXJfb2Zmc2V0OworCisJaWYgKGVuZF9idWZmZXJfaW5kZXggPCBhcl9maXJzdF9idWZmZXJfaW5kZXgoY3R4KSkgeworCQkvKgorCQkgKiBUaGUgZmlsbGVkIHBhcnQgb2YgdGhlIG92ZXJhbGwgYnVmZmVyIHdyYXBzIGFyb3VuZDsgaGFuZGxlCisJCSAqIGFsbCBwYWNrZXRzIHVwIHRvIHRoZSBidWZmZXIgZW5kIGhlcmUuICBJZiB0aGUgbGFzdCBwYWNrZXQKKwkJICogd3JhcHMgYXJvdW5kLCBpdHMgdGFpbCB3aWxsIGJlIHZpc2libGUgYWZ0ZXIgdGhlIGJ1ZmZlciBlbmQKKwkJICogYmVjYXVzZSB0aGUgYnVmZmVyIHN0YXJ0IHBhZ2VzIGFyZSBtYXBwZWQgdGhlcmUgYWdhaW4uCisJCSAqLworCQl2b2lkICpidWZmZXJfZW5kID0gY3R4LT5idWZmZXIgKyBBUl9CVUZGRVJTICogUEFHRV9TSVpFOworCQlwID0gaGFuZGxlX2FyX3BhY2tldHMoY3R4LCBwLCBidWZmZXJfZW5kKTsKKwkJaWYgKHAgPCBidWZmZXJfZW5kKQorCQkJZ290byBlcnJvcjsKKwkJLyogYWRqdXN0IHAgdG8gcG9pbnQgYmFjayBpbnRvIHRoZSBhY3R1YWwgYnVmZmVyICovCisJCXAgLT0gQVJfQlVGRkVSUyAqIFBBR0VfU0laRTsKKwl9CisKKwlwID0gaGFuZGxlX2FyX3BhY2tldHMoY3R4LCBwLCBlbmQpOworCWlmIChwICE9IGVuZCkgeworCQlpZiAocCA+IGVuZCkKKwkJCWFyX2NvbnRleHRfYWJvcnQoY3R4LCAiaW5jb25zaXN0ZW50IGRlc2NyaXB0b3IiKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwljdHgtPnBvaW50ZXIgPSBwOworCWFyX3JlY3ljbGVfYnVmZmVycyhjdHgsIGVuZF9idWZmZXJfaW5kZXgpOworCisJcmV0dXJuOworCitlcnJvcjoKKwljdHgtPnBvaW50ZXIgPSBOVUxMOworfQorCitzdGF0aWMgaW50IGFyX2NvbnRleHRfaW5pdChzdHJ1Y3QgYXJfY29udGV4dCAqY3R4LCBzdHJ1Y3QgZndfb2hjaSAqb2hjaSwKKwkJCSAgIHVuc2lnbmVkIGludCBkZXNjcmlwdG9yc19vZmZzZXQsIHUzMiByZWdzKQoreworCXVuc2lnbmVkIGludCBpOworCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisJc3RydWN0IHBhZ2UgKnBhZ2VzW0FSX0JVRkZFUlMgKyBBUl9XUkFQQVJPVU5EX1BBR0VTXTsKKwlzdHJ1Y3QgZGVzY3JpcHRvciAqZDsKIAogCWN0eC0+cmVncyAgICAgICAgPSByZWdzOwogCWN0eC0+b2hjaSAgICAgICAgPSBvaGNpOwotCWN0eC0+bGFzdF9idWZmZXIgPSAmYWI7CiAJdGFza2xldF9pbml0KCZjdHgtPnRhc2tsZXQsIGFyX2NvbnRleHRfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpY3R4KTsKIAotCWFyX2NvbnRleHRfYWRkX3BhZ2UoY3R4KTsKLQlhcl9jb250ZXh0X2FkZF9wYWdlKGN0eCk7Ci0JY3R4LT5jdXJyZW50X2J1ZmZlciA9IGFiLm5leHQ7Ci0JY3R4LT5wb2ludGVyID0gY3R4LT5jdXJyZW50X2J1ZmZlci0+ZGF0YTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJfQlVGRkVSUzsgaSsrKSB7CisJCWN0eC0+cGFnZXNbaV0gPSBhbGxvY19wYWdlKEdGUF9LRVJORUwgfCBHRlBfRE1BMzIpOworCQlpZiAoIWN0eC0+cGFnZXNbaV0pCisJCQlnb3RvIG91dF9vZl9tZW1vcnk7CisJCWRtYV9hZGRyID0gZG1hX21hcF9wYWdlKG9oY2ktPmNhcmQuZGV2aWNlLCBjdHgtPnBhZ2VzW2ldLAorCQkJCQkwLCBQQUdFX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CisJCWlmIChkbWFfbWFwcGluZ19lcnJvcihvaGNpLT5jYXJkLmRldmljZSwgZG1hX2FkZHIpKSB7CisJCQlfX2ZyZWVfcGFnZShjdHgtPnBhZ2VzW2ldKTsKKwkJCWN0eC0+cGFnZXNbaV0gPSBOVUxMOworCQkJZ290byBvdXRfb2ZfbWVtb3J5OworCQl9CisJCXNldF9wYWdlX3ByaXZhdGUoY3R4LT5wYWdlc1tpXSwgZG1hX2FkZHIpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBBUl9CVUZGRVJTOyBpKyspCisJCXBhZ2VzW2ldICAgICAgICAgICAgICA9IGN0eC0+cGFnZXNbaV07CisJZm9yIChpID0gMDsgaSA8IEFSX1dSQVBBUk9VTkRfUEFHRVM7IGkrKykKKwkJcGFnZXNbQVJfQlVGRkVSUyArIGldID0gY3R4LT5wYWdlc1tpXTsKKwljdHgtPmJ1ZmZlciA9IHZtX21hcF9yYW0ocGFnZXMsIEFSX0JVRkZFUlMgKyBBUl9XUkFQQVJPVU5EX1BBR0VTLAorCQkJCSAtMSwgUEFHRV9LRVJORUxfUk8pOworCWlmICghY3R4LT5idWZmZXIpCisJCWdvdG8gb3V0X29mX21lbW9yeTsKKworCWN0eC0+ZGVzY3JpcHRvcnMgICAgID0gb2hjaS0+bWlzY19idWZmZXIgICAgICsgZGVzY3JpcHRvcnNfb2Zmc2V0OworCWN0eC0+ZGVzY3JpcHRvcnNfYnVzID0gb2hjaS0+bWlzY19idWZmZXJfYnVzICsgZGVzY3JpcHRvcnNfb2Zmc2V0OworCisJZm9yIChpID0gMDsgaSA8IEFSX0JVRkZFUlM7IGkrKykgeworCQlkID0gJmN0eC0+ZGVzY3JpcHRvcnNbaV07CisJCWQtPnJlcV9jb3VudCAgICAgID0gY3B1X3RvX2xlMTYoUEFHRV9TSVpFKTsKKwkJZC0+Y29udHJvbCAgICAgICAgPSBjcHVfdG9fbGUxNihERVNDUklQVE9SX0lOUFVUX01PUkUgfAorCQkJCQkJREVTQ1JJUFRPUl9TVEFUVVMgfAorCQkJCQkJREVTQ1JJUFRPUl9CUkFOQ0hfQUxXQVlTKTsKKwkJZC0+ZGF0YV9hZGRyZXNzICAgPSBjcHVfdG9fbGUzMihhcl9idWZmZXJfYnVzKGN0eCwgaSkpOworCQlkLT5icmFuY2hfYWRkcmVzcyA9IGNwdV90b19sZTMyKGN0eC0+ZGVzY3JpcHRvcnNfYnVzICsKKwkJCWFyX25leHRfYnVmZmVyX2luZGV4KGkpICogc2l6ZW9mKHN0cnVjdCBkZXNjcmlwdG9yKSk7CisJfQogCiAJcmV0dXJuIDA7CisKK291dF9vZl9tZW1vcnk6CisJYXJfY29udGV4dF9yZWxlYXNlKGN0eCk7CisKKwlyZXR1cm4gLUVOT01FTTsKIH0KIAogc3RhdGljIHZvaWQgYXJfY29udGV4dF9ydW4oc3RydWN0IGFyX2NvbnRleHQgKmN0eCkKIHsKLQlzdHJ1Y3QgYXJfYnVmZmVyICphYiA9IGN0eC0+Y3VycmVudF9idWZmZXI7Ci0JZG1hX2FkZHJfdCBhYl9idXM7Ci0Jc2l6ZV90IG9mZnNldDsKKwl1bnNpZ25lZCBpbnQgaTsKIAotCW9mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBhcl9idWZmZXIsIGRhdGEpOwotCWFiX2J1cyA9IGxlMzJfdG9fY3B1KGFiLT5kZXNjcmlwdG9yLmRhdGFfYWRkcmVzcykgLSBvZmZzZXQ7CisJZm9yIChpID0gMDsgaSA8IEFSX0JVRkZFUlM7IGkrKykKKwkJYXJfY29udGV4dF9saW5rX3BhZ2UoY3R4LCBpKTsKIAotCXJlZ193cml0ZShjdHgtPm9oY2ksIENPTU1BTkRfUFRSKGN0eC0+cmVncyksIGFiX2J1cyB8IDEpOworCWN0eC0+cG9pbnRlciA9IGN0eC0+YnVmZmVyOworCisJcmVnX3dyaXRlKGN0eC0+b2hjaSwgQ09NTUFORF9QVFIoY3R4LT5yZWdzKSwgY3R4LT5kZXNjcmlwdG9yc19idXMgfCAxKTsKIAlyZWdfd3JpdGUoY3R4LT5vaGNpLCBDT05UUk9MX1NFVChjdHgtPnJlZ3MpLCBDT05URVhUX1JVTik7CiAJZmx1c2hfd3JpdGVzKGN0eC0+b2hjaSk7CiB9CkBAIC0xMDQyLDYgKzExNzMsNyBAQAogCQkgIGxlMzJfdG9fY3B1KGN0eC0+bGFzdC0+YnJhbmNoX2FkZHJlc3MpKTsKIAlyZWdfd3JpdGUob2hjaSwgQ09OVFJPTF9DTEVBUihjdHgtPnJlZ3MpLCB+MCk7CiAJcmVnX3dyaXRlKG9oY2ksIENPTlRST0xfU0VUKGN0eC0+cmVncyksIENPTlRFWFRfUlVOIHwgZXh0cmEpOworCWN0eC0+cnVubmluZyA9IHRydWU7CiAJZmx1c2hfd3JpdGVzKG9oY2kpOwogfQogCkBAIC0xMDY5LDYgKzEyMDEsNyBAQAogCWludCBpOwogCiAJcmVnX3dyaXRlKGN0eC0+b2hjaSwgQ09OVFJPTF9DTEVBUihjdHgtPnJlZ3MpLCBDT05URVhUX1JVTik7CisJY3R4LT5ydW5uaW5nID0gZmFsc2U7CiAJZmx1c2hfd3JpdGVzKGN0eC0+b2hjaSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewpAQCAtMTA5OSw3ICsxMjMyLDYgQEAKIAlzdHJ1Y3QgZGVzY3JpcHRvciAqZCwgKmxhc3Q7CiAJX19sZTMyICpoZWFkZXI7CiAJaW50IHosIHRjb2RlOwotCXUzMiByZWc7CiAKIAlkID0gY29udGV4dF9nZXRfZGVzY3JpcHRvcnMoY3R4LCA0LCAmZF9idXMpOwogCWlmIChkID09IE5VTEwpIHsKQEAgLTExMTMsMjEgKzEyNDUsMjcgQEAKIAkvKgogCSAqIFRoZSBETUEgZm9ybWF0IGZvciBhc3luY3Jvbm91cyBsaW5rIHBhY2tldHMgaXMgZGlmZmVyZW50CiAJICogZnJvbSB0aGUgSUVFRTEzOTQgbGF5b3V0LCBzbyBzaGlmdCB0aGUgZmllbGRzIGFyb3VuZAotCSAqIGFjY29yZGluZ2x5LiAgSWYgaGVhZGVyX2xlbmd0aCBpcyA4LCBpdCdzIGEgUEhZIHBhY2tldCwgdG8KLQkgKiB3aGljaCB3ZSBuZWVkIHRvIHByZXBlbmQgYW4gZXh0cmEgcXVhZGxldC4KKwkgKiBhY2NvcmRpbmdseS4KIAkgKi8KIAorCXRjb2RlID0gKHBhY2tldC0+aGVhZGVyWzBdID4+IDQpICYgMHgwZjsKIAloZWFkZXIgPSAoX19sZTMyICopICZkWzFdOwotCXN3aXRjaCAocGFja2V0LT5oZWFkZXJfbGVuZ3RoKSB7Ci0JY2FzZSAxNjoKLQljYXNlIDEyOgorCXN3aXRjaCAodGNvZGUpIHsKKwljYXNlIFRDT0RFX1dSSVRFX1FVQURMRVRfUkVRVUVTVDoKKwljYXNlIFRDT0RFX1dSSVRFX0JMT0NLX1JFUVVFU1Q6CisJY2FzZSBUQ09ERV9XUklURV9SRVNQT05TRToKKwljYXNlIFRDT0RFX1JFQURfUVVBRExFVF9SRVFVRVNUOgorCWNhc2UgVENPREVfUkVBRF9CTE9DS19SRVFVRVNUOgorCWNhc2UgVENPREVfUkVBRF9RVUFETEVUX1JFU1BPTlNFOgorCWNhc2UgVENPREVfUkVBRF9CTE9DS19SRVNQT05TRToKKwljYXNlIFRDT0RFX0xPQ0tfUkVRVUVTVDoKKwljYXNlIFRDT0RFX0xPQ0tfUkVTUE9OU0U6CiAJCWhlYWRlclswXSA9IGNwdV90b19sZTMyKChwYWNrZXQtPmhlYWRlclswXSAmIDB4ZmZmZikgfAogCQkJCQkocGFja2V0LT5zcGVlZCA8PCAxNikpOwogCQloZWFkZXJbMV0gPSBjcHVfdG9fbGUzMigocGFja2V0LT5oZWFkZXJbMV0gJiAweGZmZmYpIHwKIAkJCQkJKHBhY2tldC0+aGVhZGVyWzBdICYgMHhmZmZmMDAwMCkpOwogCQloZWFkZXJbMl0gPSBjcHVfdG9fbGUzMihwYWNrZXQtPmhlYWRlclsyXSk7CiAKLQkJdGNvZGUgPSAocGFja2V0LT5oZWFkZXJbMF0gPj4gNCkgJiAweDBmOwogCQlpZiAoVENPREVfSVNfQkxPQ0tfUEFDS0VUKHRjb2RlKSkKIAkJCWhlYWRlclszXSA9IGNwdV90b19sZTMyKHBhY2tldC0+aGVhZGVyWzNdKTsKIAkJZWxzZQpAQCAtMTEzNiwxOCArMTI3NCwxOCBAQAogCQlkWzBdLnJlcV9jb3VudCA9IGNwdV90b19sZTE2KHBhY2tldC0+aGVhZGVyX2xlbmd0aCk7CiAJCWJyZWFrOwogCi0JY2FzZSA4OgorCWNhc2UgVENPREVfTElOS19JTlRFUk5BTDoKIAkJaGVhZGVyWzBdID0gY3B1X3RvX2xlMzIoKE9IQ0kxMzk0X3BoeV90Y29kZSA8PCA0KSB8CiAJCQkJCShwYWNrZXQtPnNwZWVkIDw8IDE2KSk7Ci0JCWhlYWRlclsxXSA9IGNwdV90b19sZTMyKHBhY2tldC0+aGVhZGVyWzBdKTsKLQkJaGVhZGVyWzJdID0gY3B1X3RvX2xlMzIocGFja2V0LT5oZWFkZXJbMV0pOworCQloZWFkZXJbMV0gPSBjcHVfdG9fbGUzMihwYWNrZXQtPmhlYWRlclsxXSk7CisJCWhlYWRlclsyXSA9IGNwdV90b19sZTMyKHBhY2tldC0+aGVhZGVyWzJdKTsKIAkJZFswXS5yZXFfY291bnQgPSBjcHVfdG9fbGUxNigxMik7CiAKLQkJaWYgKGlzX3BpbmdfcGFja2V0KHBhY2tldC0+aGVhZGVyKSkKKwkJaWYgKGlzX3BpbmdfcGFja2V0KCZwYWNrZXQtPmhlYWRlclsxXSkpCiAJCQlkWzBdLmNvbnRyb2wgfD0gY3B1X3RvX2xlMTYoREVTQ1JJUFRPUl9QSU5HKTsKIAkJYnJlYWs7CiAKLQljYXNlIDQ6CisJY2FzZSBUQ09ERV9TVFJFQU1fREFUQToKIAkJaGVhZGVyWzBdID0gY3B1X3RvX2xlMzIoKHBhY2tldC0+aGVhZGVyWzBdICYgMHhmZmZmKSB8CiAJCQkJCShwYWNrZXQtPnNwZWVkIDw8IDE2KSk7CiAJCWhlYWRlclsxXSA9IGNwdV90b19sZTMyKHBhY2tldC0+aGVhZGVyWzBdICYgMHhmZmZmMDAwMCk7CkBAIC0xMTk3LDYgKzEzMzUsOCBAQAogCSAqIHNvbWUgY29udHJvbGxlcnMgKGxpa2UgYSBKTWljcm9uIEpNQjM4MSBQQ0ktZSkgbWlzYmVoYXZlIGFuZCB3aW5kCiAJICogdXAgc3RhbGxpbmcgb3V0LiAgU28gd2UganVzdCBiYWlsIG91dCBpbiBzb2Z0d2FyZSBhbmQgdHJ5IGFnYWluCiAJICogbGF0ZXIsIGFuZCBldmVyeW9uZSBpcyBoYXBweS4KKwkgKiBGSVhNRTogVGVzdCBvZiBJbnRFdmVudC5idXNSZXNldCBtYXkgbm8gbG9uZ2VyIGJlIG5lY2Vzc2FyeSBzaW5jZSB3ZQorCSAqICAgICAgICBmbHVzaCBBVCBxdWV1ZXMgaW4gYnVzX3Jlc2V0X3Rhc2tsZXQuCiAJICogRklYTUU6IERvY3VtZW50IGhvdyB0aGUgbG9ja2luZyB3b3Jrcy4KIAkgKi8KIAlpZiAob2hjaS0+Z2VuZXJhdGlvbiAhPSBwYWNrZXQtPmdlbmVyYXRpb24gfHwKQEAgLTEyMTAsMTQgKzEzNTAsMjMgQEAKIAogCWNvbnRleHRfYXBwZW5kKGN0eCwgZCwgeiwgNCAtIHopOwogCi0JLyogSWYgdGhlIGNvbnRleHQgaXNuJ3QgYWxyZWFkeSBydW5uaW5nLCBzdGFydCBpdCB1cC4gKi8KLQlyZWcgPSByZWdfcmVhZChjdHgtPm9oY2ksIENPTlRST0xfU0VUKGN0eC0+cmVncykpOwotCWlmICgocmVnICYgQ09OVEVYVF9SVU4pID09IDApCisJaWYgKCFjdHgtPnJ1bm5pbmcpCiAJCWNvbnRleHRfcnVuKGN0eCwgMCk7CiAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgYXRfY29udGV4dF9mbHVzaChzdHJ1Y3QgY29udGV4dCAqY3R4KQoreworCXRhc2tsZXRfZGlzYWJsZSgmY3R4LT50YXNrbGV0KTsKKworCWN0eC0+Zmx1c2hpbmcgPSB0cnVlOworCWNvbnRleHRfdGFza2xldCgodW5zaWduZWQgbG9uZyljdHgpOworCWN0eC0+Zmx1c2hpbmcgPSBmYWxzZTsKKworCXRhc2tsZXRfZW5hYmxlKCZjdHgtPnRhc2tsZXQpOworfQorCiBzdGF0aWMgaW50IGhhbmRsZV9hdF9wYWNrZXQoc3RydWN0IGNvbnRleHQgKmNvbnRleHQsCiAJCQkgICAgc3RydWN0IGRlc2NyaXB0b3IgKmQsCiAJCQkgICAgc3RydWN0IGRlc2NyaXB0b3IgKmxhc3QpCkBAIC0xMjI3LDcgKzEzNzYsNyBAQAogCXN0cnVjdCBmd19vaGNpICpvaGNpID0gY29udGV4dC0+b2hjaTsKIAlpbnQgZXZ0OwogCi0JaWYgKGxhc3QtPnRyYW5zZmVyX3N0YXR1cyA9PSAwKQorCWlmIChsYXN0LT50cmFuc2Zlcl9zdGF0dXMgPT0gMCAmJiAhY29udGV4dC0+Zmx1c2hpbmcpCiAJCS8qIFRoaXMgZGVzY3JpcHRvciBpc24ndCBkb25lIHlldCwgc3RvcCBpdGVyYXRpb24uICovCiAJCXJldHVybiAwOwogCkBAIC0xMjYxLDExICsxNDEwLDE1IEBACiAJCWJyZWFrOwogCiAJY2FzZSBPSENJMTM5NF9ldnRfbWlzc2luZ19hY2s6Ci0JCS8qCi0JCSAqIFVzaW5nIGEgdmFsaWQgKGN1cnJlbnQpIGdlbmVyYXRpb24gY291bnQsIGJ1dCB0aGUKLQkJICogbm9kZSBpcyBub3Qgb24gdGhlIGJ1cyBvciBub3Qgc2VuZGluZyBhY2tzLgotCQkgKi8KLQkJcGFja2V0LT5hY2sgPSBSQ09ERV9OT19BQ0s7CisJCWlmIChjb250ZXh0LT5mbHVzaGluZykKKwkJCXBhY2tldC0+YWNrID0gUkNPREVfR0VORVJBVElPTjsKKwkJZWxzZSB7CisJCQkvKgorCQkJICogVXNpbmcgYSB2YWxpZCAoY3VycmVudCkgZ2VuZXJhdGlvbiBjb3VudCwgYnV0IHRoZQorCQkJICogbm9kZSBpcyBub3Qgb24gdGhlIGJ1cyBvciBub3Qgc2VuZGluZyBhY2tzLgorCQkJICovCisJCQlwYWNrZXQtPmFjayA9IFJDT0RFX05PX0FDSzsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgQUNLX0NPTVBMRVRFICsgMHgxMDoKQEAgLTEyNzgsNiArMTQzMSwxMyBAQAogCQlwYWNrZXQtPmFjayA9IGV2dCAtIDB4MTA7CiAJCWJyZWFrOwogCisJY2FzZSBPSENJMTM5NF9ldnRfbm9fc3RhdHVzOgorCQlpZiAoY29udGV4dC0+Zmx1c2hpbmcpIHsKKwkJCXBhY2tldC0+YWNrID0gUkNPREVfR0VORVJBVElPTjsKKwkJCWJyZWFrOworCQl9CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCiAJZGVmYXVsdDoKIAkJcGFja2V0LT5hY2sgPSBSQ09ERV9TRU5EX0VSUk9SOwogCQlicmVhazsKQEAgLTE1ODMsOSArMTc0MywyMyBAQAogCS8qIEZJWE1FOiBEb2N1bWVudCBob3cgdGhlIGxvY2tpbmcgd29ya3MuICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm9oY2ktPmxvY2ssIGZsYWdzKTsKIAotCW9oY2ktPmdlbmVyYXRpb24gPSBnZW5lcmF0aW9uOworCW9oY2ktPmdlbmVyYXRpb24gPSAtMTsgLyogcHJldmVudCBBVCBwYWNrZXQgcXVldWVpbmcgKi8KIAljb250ZXh0X3N0b3AoJm9oY2ktPmF0X3JlcXVlc3RfY3R4KTsKIAljb250ZXh0X3N0b3AoJm9oY2ktPmF0X3Jlc3BvbnNlX2N0eCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvaGNpLT5sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIFBlciBPSENJIDEuMiBkcmFmdCwgY2xhdXNlIDcuMi4zLjMsIGhhcmR3YXJlIG1heSBsZWF2ZSB1bnNlbnQKKwkgKiBwYWNrZXRzIGluIHRoZSBBVCBxdWV1ZXMgYW5kIHNvZnR3YXJlIG5lZWRzIHRvIGRyYWluIHRoZW0uCisJICogU29tZSBPSENJIDEuMSBjb250cm9sbGVycyAoSk1pY3JvbikgYXBwYXJlbnRseSByZXF1aXJlIHRoaXMgdG9vLgorCSAqLworCWF0X2NvbnRleHRfZmx1c2goJm9oY2ktPmF0X3JlcXVlc3RfY3R4KTsKKwlhdF9jb250ZXh0X2ZsdXNoKCZvaGNpLT5hdF9yZXNwb25zZV9jdHgpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm9oY2ktPmxvY2ssIGZsYWdzKTsKKworCW9oY2ktPmdlbmVyYXRpb24gPSBnZW5lcmF0aW9uOwogCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9JbnRFdmVudENsZWFyLCBPSENJMTM5NF9idXNSZXNldCk7CiAKIAlpZiAob2hjaS0+cXVpcmtzICYgUVVJUktfUkVTRVRfUEFDS0VUKQpAQCAtMTY1Myw4ICsxODI3LDEyIEBACiAJaWYgKCFldmVudCB8fCAhfmV2ZW50KQogCQlyZXR1cm4gSVJRX05PTkU7CiAKLQkvKiBidXNSZXNldCBtdXN0IG5vdCBiZSBjbGVhcmVkIHlldCwgc2VlIE9IQ0kgMS4xIGNsYXVzZSA3LjIuMy4yICovCi0JcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0ludEV2ZW50Q2xlYXIsIGV2ZW50ICYgfk9IQ0kxMzk0X2J1c1Jlc2V0KTsKKwkvKgorCSAqIGJ1c1Jlc2V0IGFuZCBwb3N0ZWRXcml0ZUVyciBtdXN0IG5vdCBiZSBjbGVhcmVkIHlldAorCSAqIChPSENJIDEuMSBjbGF1c2VzIDcuMi4zLjIgYW5kIDEzLjIuOC4xKQorCSAqLworCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9JbnRFdmVudENsZWFyLAorCQkgIGV2ZW50ICYgfihPSENJMTM5NF9idXNSZXNldCB8IE9IQ0kxMzk0X3Bvc3RlZFdyaXRlRXJyKSk7CiAJbG9nX2lycXMoZXZlbnQpOwogCiAJaWYgKGV2ZW50ICYgT0hDSTEzOTRfc2VsZklEQ29tcGxldGUpCkBAIC0xNjcyLDMwICsxODUwLDQxIEBACiAJaWYgKGV2ZW50ICYgT0hDSTEzOTRfcmVzcFR4Q29tcGxldGUpCiAJCXRhc2tsZXRfc2NoZWR1bGUoJm9oY2ktPmF0X3Jlc3BvbnNlX2N0eC50YXNrbGV0KTsKIAotCWlzb19ldmVudCA9IHJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X0lzb1JlY3ZJbnRFdmVudENsZWFyKTsKLQlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSXNvUmVjdkludEV2ZW50Q2xlYXIsIGlzb19ldmVudCk7CisJaWYgKGV2ZW50ICYgT0hDSTEzOTRfaXNvY2hSeCkgeworCQlpc29fZXZlbnQgPSByZWdfcmVhZChvaGNpLCBPSENJMTM5NF9Jc29SZWN2SW50RXZlbnRDbGVhcik7CisJCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9Jc29SZWN2SW50RXZlbnRDbGVhciwgaXNvX2V2ZW50KTsKIAotCXdoaWxlIChpc29fZXZlbnQpIHsKLQkJaSA9IGZmcyhpc29fZXZlbnQpIC0gMTsKLQkJdGFza2xldF9zY2hlZHVsZSgmb2hjaS0+aXJfY29udGV4dF9saXN0W2ldLmNvbnRleHQudGFza2xldCk7Ci0JCWlzb19ldmVudCAmPSB+KDEgPDwgaSk7CisJCXdoaWxlIChpc29fZXZlbnQpIHsKKwkJCWkgPSBmZnMoaXNvX2V2ZW50KSAtIDE7CisJCQl0YXNrbGV0X3NjaGVkdWxlKAorCQkJCSZvaGNpLT5pcl9jb250ZXh0X2xpc3RbaV0uY29udGV4dC50YXNrbGV0KTsKKwkJCWlzb19ldmVudCAmPSB+KDEgPDwgaSk7CisJCX0KIAl9CiAKLQlpc29fZXZlbnQgPSByZWdfcmVhZChvaGNpLCBPSENJMTM5NF9Jc29YbWl0SW50RXZlbnRDbGVhcik7Ci0JcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0lzb1htaXRJbnRFdmVudENsZWFyLCBpc29fZXZlbnQpOworCWlmIChldmVudCAmIE9IQ0kxMzk0X2lzb2NoVHgpIHsKKwkJaXNvX2V2ZW50ID0gcmVnX3JlYWQob2hjaSwgT0hDSTEzOTRfSXNvWG1pdEludEV2ZW50Q2xlYXIpOworCQlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSXNvWG1pdEludEV2ZW50Q2xlYXIsIGlzb19ldmVudCk7CiAKLQl3aGlsZSAoaXNvX2V2ZW50KSB7Ci0JCWkgPSBmZnMoaXNvX2V2ZW50KSAtIDE7Ci0JCXRhc2tsZXRfc2NoZWR1bGUoJm9oY2ktPml0X2NvbnRleHRfbGlzdFtpXS5jb250ZXh0LnRhc2tsZXQpOwotCQlpc29fZXZlbnQgJj0gfigxIDw8IGkpOworCQl3aGlsZSAoaXNvX2V2ZW50KSB7CisJCQlpID0gZmZzKGlzb19ldmVudCkgLSAxOworCQkJdGFza2xldF9zY2hlZHVsZSgKKwkJCQkmb2hjaS0+aXRfY29udGV4dF9saXN0W2ldLmNvbnRleHQudGFza2xldCk7CisJCQlpc29fZXZlbnQgJj0gfigxIDw8IGkpOworCQl9CiAJfQogCiAJaWYgKHVubGlrZWx5KGV2ZW50ICYgT0hDSTEzOTRfcmVnQWNjZXNzRmFpbCkpCiAJCWZ3X2Vycm9yKCJSZWdpc3RlciBhY2Nlc3MgZmFpbHVyZSAtICIKIAkJCSAicGxlYXNlIG5vdGlmeSBsaW51eDEzOTQtZGV2ZWxAbGlzdHMuc2YubmV0XG4iKTsKIAotCWlmICh1bmxpa2VseShldmVudCAmIE9IQ0kxMzk0X3Bvc3RlZFdyaXRlRXJyKSkKKwlpZiAodW5saWtlbHkoZXZlbnQgJiBPSENJMTM5NF9wb3N0ZWRXcml0ZUVycikpIHsKKwkJcmVnX3JlYWQob2hjaSwgT0hDSTEzOTRfUG9zdGVkV3JpdGVBZGRyZXNzSGkpOworCQlyZWdfcmVhZChvaGNpLCBPSENJMTM5NF9Qb3N0ZWRXcml0ZUFkZHJlc3NMbyk7CisJCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9JbnRFdmVudENsZWFyLAorCQkJICBPSENJMTM5NF9wb3N0ZWRXcml0ZUVycik7CiAJCWZ3X2Vycm9yKCJQQ0kgcG9zdGVkIHdyaXRlIGVycm9yXG4iKTsKKwl9CiAKIAlpZiAodW5saWtlbHkoZXZlbnQgJiBPSENJMTM5NF9jeWNsZVRvb0xvbmcpKSB7CiAJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCkBAIC0xNzE5LDcgKzE5MDgsOCBAQAogCQlzcGluX2xvY2soJm9oY2ktPmxvY2spOwogCQl1cGRhdGVfYnVzX3RpbWUob2hjaSk7CiAJCXNwaW5fdW5sb2NrKCZvaGNpLT5sb2NrKTsKLQl9CisJfSBlbHNlCisJCWZsdXNoX3dyaXRlcyhvaGNpKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTI0OTUsNiArMjY4NSwxMCBAQAogCQlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSXNvUmVjdkludE1hc2tTZXQsIDEgPDwgaW5kZXgpOwogCQlyZWdfd3JpdGUob2hjaSwgQ09OVEVYVF9NQVRDSChjdHgtPmNvbnRleHQucmVncyksIG1hdGNoKTsKIAkJY29udGV4dF9ydW4oJmN0eC0+Y29udGV4dCwgY29udHJvbCk7CisKKwkJY3R4LT5zeW5jID0gc3luYzsKKwkJY3R4LT50YWdzID0gdGFnczsKKwogCQlicmVhazsKIAl9CiAKQEAgLTI1OTIsNiArMjc4NiwyNiBAQAogCXJldHVybiByZXQ7CiB9CiAKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyB2b2lkIG9oY2lfcmVzdW1lX2lzb19kbWEoc3RydWN0IGZ3X29oY2kgKm9oY2kpCit7CisJaW50IGk7CisJc3RydWN0IGlzb19jb250ZXh0ICpjdHg7CisKKwlmb3IgKGkgPSAwIDsgaSA8IG9oY2ktPm5faXIgOyBpKyspIHsKKwkJY3R4ID0gJm9oY2ktPmlyX2NvbnRleHRfbGlzdFtpXTsKKwkJaWYgKGN0eC0+Y29udGV4dC5ydW5uaW5nKQorCQkJb2hjaV9zdGFydF9pc28oJmN0eC0+YmFzZSwgMCwgY3R4LT5zeW5jLCBjdHgtPnRhZ3MpOworCX0KKworCWZvciAoaSA9IDAgOyBpIDwgb2hjaS0+bl9pdCA7IGkrKykgeworCQljdHggPSAmb2hjaS0+aXRfY29udGV4dF9saXN0W2ldOworCQlpZiAoY3R4LT5jb250ZXh0LnJ1bm5pbmcpCisJCQlvaGNpX3N0YXJ0X2lzbygmY3R4LT5iYXNlLCAwLCBjdHgtPnN5bmMsIGN0eC0+dGFncyk7CisJfQorfQorI2VuZGlmCisKIHN0YXRpYyBpbnQgcXVldWVfaXNvX3RyYW5zbWl0KHN0cnVjdCBpc29fY29udGV4dCAqY3R4LAogCQkJICAgICAgc3RydWN0IGZ3X2lzb19wYWNrZXQgKnBhY2tldCwKIAkJCSAgICAgIHN0cnVjdCBmd19pc29fYnVmZmVyICpidWZmZXIsCkBAIC0yOTAxLDcgKzMxMTUsNyBAQAogCXN0cnVjdCBmd19vaGNpICpvaGNpOwogCXUzMiBidXNfb3B0aW9ucywgbWF4X3JlY2VpdmUsIGxpbmtfc3BlZWQsIHZlcnNpb247CiAJdTY0IGd1aWQ7Ci0JaW50IGksIGVyciwgbl9pciwgbl9pdDsKKwlpbnQgaSwgZXJyOwogCXNpemVfdCBzaXplOwogCiAJb2hjaSA9IGt6YWxsb2Moc2l6ZW9mKCpvaGNpKSwgR0ZQX0tFUk5FTCk7CkBAIC0yOTU1LDMxICszMTY5LDU1IEBACiAJaWYgKHBhcmFtX3F1aXJrcykKIAkJb2hjaS0+cXVpcmtzID0gcGFyYW1fcXVpcmtzOwogCi0JYXJfY29udGV4dF9pbml0KCZvaGNpLT5hcl9yZXF1ZXN0X2N0eCwgb2hjaSwKLQkJCU9IQ0kxMzk0X0FzUmVxUmN2Q29udGV4dENvbnRyb2xTZXQpOworCS8qCisJICogQmVjYXVzZSBkbWFfYWxsb2NfY29oZXJlbnQoKSBhbGxvY2F0ZXMgYXQgbGVhc3Qgb25lIHBhZ2UsCisJICogd2Ugc2F2ZSBzcGFjZSBieSB1c2luZyBhIGNvbW1vbiBidWZmZXIgZm9yIHRoZSBBUiByZXF1ZXN0LworCSAqIHJlc3BvbnNlIGRlc2NyaXB0b3JzIGFuZCB0aGUgc2VsZiBJRHMgYnVmZmVyLgorCSAqLworCUJVSUxEX0JVR19PTihBUl9CVUZGRVJTICogc2l6ZW9mKHN0cnVjdCBkZXNjcmlwdG9yKSA+IFBBR0VfU0laRS80KTsKKwlCVUlMRF9CVUdfT04oU0VMRl9JRF9CVUZfU0laRSA+IFBBR0VfU0laRS8yKTsKKwlvaGNpLT5taXNjX2J1ZmZlciA9IGRtYV9hbGxvY19jb2hlcmVudChvaGNpLT5jYXJkLmRldmljZSwKKwkJCQkJICAgICAgIFBBR0VfU0laRSwKKwkJCQkJICAgICAgICZvaGNpLT5taXNjX2J1ZmZlcl9idXMsCisJCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIW9oY2ktPm1pc2NfYnVmZmVyKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZmFpbF9pb3VubWFwOworCX0KIAotCWFyX2NvbnRleHRfaW5pdCgmb2hjaS0+YXJfcmVzcG9uc2VfY3R4LCBvaGNpLAotCQkJT0hDSTEzOTRfQXNSc3BSY3ZDb250ZXh0Q29udHJvbFNldCk7CisJZXJyID0gYXJfY29udGV4dF9pbml0KCZvaGNpLT5hcl9yZXF1ZXN0X2N0eCwgb2hjaSwgMCwKKwkJCSAgICAgIE9IQ0kxMzk0X0FzUmVxUmN2Q29udGV4dENvbnRyb2xTZXQpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGZhaWxfbWlzY19idWY7CiAKLQljb250ZXh0X2luaXQoJm9oY2ktPmF0X3JlcXVlc3RfY3R4LCBvaGNpLAotCQkgICAgIE9IQ0kxMzk0X0FzUmVxVHJDb250ZXh0Q29udHJvbFNldCwgaGFuZGxlX2F0X3BhY2tldCk7CisJZXJyID0gYXJfY29udGV4dF9pbml0KCZvaGNpLT5hcl9yZXNwb25zZV9jdHgsIG9oY2ksIFBBR0VfU0laRS80LAorCQkJICAgICAgT0hDSTEzOTRfQXNSc3BSY3ZDb250ZXh0Q29udHJvbFNldCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZmFpbF9hcnJlcV9jdHg7CiAKLQljb250ZXh0X2luaXQoJm9oY2ktPmF0X3Jlc3BvbnNlX2N0eCwgb2hjaSwKLQkJICAgICBPSENJMTM5NF9Bc1JzcFRyQ29udGV4dENvbnRyb2xTZXQsIGhhbmRsZV9hdF9wYWNrZXQpOworCWVyciA9IGNvbnRleHRfaW5pdCgmb2hjaS0+YXRfcmVxdWVzdF9jdHgsIG9oY2ksCisJCQkgICBPSENJMTM5NF9Bc1JlcVRyQ29udGV4dENvbnRyb2xTZXQsIGhhbmRsZV9hdF9wYWNrZXQpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGZhaWxfYXJyc3BfY3R4OworCisJZXJyID0gY29udGV4dF9pbml0KCZvaGNpLT5hdF9yZXNwb25zZV9jdHgsIG9oY2ksCisJCQkgICBPSENJMTM5NF9Bc1JzcFRyQ29udGV4dENvbnRyb2xTZXQsIGhhbmRsZV9hdF9wYWNrZXQpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGZhaWxfYXRyZXFfY3R4OwogCiAJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0lzb1JlY3ZJbnRNYXNrU2V0LCB+MCk7CiAJb2hjaS0+aXJfY29udGV4dF9jaGFubmVscyA9IH4wVUxMOwogCW9oY2ktPmlyX2NvbnRleHRfbWFzayA9IHJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X0lzb1JlY3ZJbnRNYXNrU2V0KTsKIAlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSXNvUmVjdkludE1hc2tDbGVhciwgfjApOwotCW5faXIgPSBod2VpZ2h0MzIob2hjaS0+aXJfY29udGV4dF9tYXNrKTsKLQlzaXplID0gc2l6ZW9mKHN0cnVjdCBpc29fY29udGV4dCkgKiBuX2lyOworCW9oY2ktPm5faXIgPSBod2VpZ2h0MzIob2hjaS0+aXJfY29udGV4dF9tYXNrKTsKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBpc29fY29udGV4dCkgKiBvaGNpLT5uX2lyOwogCW9oY2ktPmlyX2NvbnRleHRfbGlzdCA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CiAKIAlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSXNvWG1pdEludE1hc2tTZXQsIH4wKTsKIAlvaGNpLT5pdF9jb250ZXh0X21hc2sgPSByZWdfcmVhZChvaGNpLCBPSENJMTM5NF9Jc29YbWl0SW50TWFza1NldCk7CiAJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0lzb1htaXRJbnRNYXNrQ2xlYXIsIH4wKTsKLQluX2l0ID0gaHdlaWdodDMyKG9oY2ktPml0X2NvbnRleHRfbWFzayk7Ci0Jc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXNvX2NvbnRleHQpICogbl9pdDsKKwlvaGNpLT5uX2l0ID0gaHdlaWdodDMyKG9oY2ktPml0X2NvbnRleHRfbWFzayk7CisJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXNvX2NvbnRleHQpICogb2hjaS0+bl9pdDsKIAlvaGNpLT5pdF9jb250ZXh0X2xpc3QgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwogCiAJaWYgKG9oY2ktPml0X2NvbnRleHRfbGlzdCA9PSBOVUxMIHx8IG9oY2ktPmlyX2NvbnRleHRfbGlzdCA9PSBOVUxMKSB7CkBAIC0yOTg3LDE1ICszMjI1LDggQEAKIAkJZ290byBmYWlsX2NvbnRleHRzOwogCX0KIAotCS8qIHNlbGYtaWQgZG1hIGJ1ZmZlciBhbGxvY2F0aW9uICovCi0Jb2hjaS0+c2VsZl9pZF9jcHUgPSBkbWFfYWxsb2NfY29oZXJlbnQob2hjaS0+Y2FyZC5kZXZpY2UsCi0JCQkJCSAgICAgICBTRUxGX0lEX0JVRl9TSVpFLAotCQkJCQkgICAgICAgJm9oY2ktPnNlbGZfaWRfYnVzLAotCQkJCQkgICAgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKG9oY2ktPnNlbGZfaWRfY3B1ID09IE5VTEwpIHsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBmYWlsX2NvbnRleHRzOwotCX0KKwlvaGNpLT5zZWxmX2lkX2NwdSA9IG9oY2ktPm1pc2NfYnVmZmVyICAgICArIFBBR0VfU0laRS8yOworCW9oY2ktPnNlbGZfaWRfYnVzID0gb2hjaS0+bWlzY19idWZmZXJfYnVzICsgUEFHRV9TSVpFLzI7CiAKIAlidXNfb3B0aW9ucyA9IHJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X0J1c09wdGlvbnMpOwogCW1heF9yZWNlaXZlID0gKGJ1c19vcHRpb25zID4+IDEyKSAmIDB4ZjsKQEAgLTMwMDUsMjYgKzMyMzYsMzAgQEAKIAogCWVyciA9IGZ3X2NhcmRfYWRkKCZvaGNpLT5jYXJkLCBtYXhfcmVjZWl2ZSwgbGlua19zcGVlZCwgZ3VpZCk7CiAJaWYgKGVycikKLQkJZ290byBmYWlsX3NlbGZfaWQ7CisJCWdvdG8gZmFpbF9jb250ZXh0czsKIAogCXZlcnNpb24gPSByZWdfcmVhZChvaGNpLCBPSENJMTM5NF9WZXJzaW9uKSAmIDB4MDBmZjAwZmY7CiAJZndfbm90aWZ5KCJBZGRlZCBmdy1vaGNpIGRldmljZSAlcywgT0hDSSB2JXguJXgsICIKIAkJICAiJWQgSVIgKyAlZCBJVCBjb250ZXh0cywgcXVpcmtzIDB4JXhcbiIsCiAJCSAgZGV2X25hbWUoJmRldi0+ZGV2KSwgdmVyc2lvbiA+PiAxNiwgdmVyc2lvbiAmIDB4ZmYsCi0JCSAgbl9pciwgbl9pdCwgb2hjaS0+cXVpcmtzKTsKKwkJICBvaGNpLT5uX2lyLCBvaGNpLT5uX2l0LCBvaGNpLT5xdWlya3MpOwogCiAJcmV0dXJuIDA7CiAKLSBmYWlsX3NlbGZfaWQ6Ci0JZG1hX2ZyZWVfY29oZXJlbnQob2hjaS0+Y2FyZC5kZXZpY2UsIFNFTEZfSURfQlVGX1NJWkUsCi0JCQkgIG9oY2ktPnNlbGZfaWRfY3B1LCBvaGNpLT5zZWxmX2lkX2J1cyk7CiAgZmFpbF9jb250ZXh0czoKIAlrZnJlZShvaGNpLT5pcl9jb250ZXh0X2xpc3QpOwogCWtmcmVlKG9oY2ktPml0X2NvbnRleHRfbGlzdCk7CiAJY29udGV4dF9yZWxlYXNlKCZvaGNpLT5hdF9yZXNwb25zZV9jdHgpOworIGZhaWxfYXRyZXFfY3R4OgogCWNvbnRleHRfcmVsZWFzZSgmb2hjaS0+YXRfcmVxdWVzdF9jdHgpOworIGZhaWxfYXJyc3BfY3R4OgogCWFyX2NvbnRleHRfcmVsZWFzZSgmb2hjaS0+YXJfcmVzcG9uc2VfY3R4KTsKKyBmYWlsX2FycmVxX2N0eDoKIAlhcl9jb250ZXh0X3JlbGVhc2UoJm9oY2ktPmFyX3JlcXVlc3RfY3R4KTsKKyBmYWlsX21pc2NfYnVmOgorCWRtYV9mcmVlX2NvaGVyZW50KG9oY2ktPmNhcmQuZGV2aWNlLCBQQUdFX1NJWkUsCisJCQkgIG9oY2ktPm1pc2NfYnVmZmVyLCBvaGNpLT5taXNjX2J1ZmZlcl9idXMpOworIGZhaWxfaW91bm1hcDoKIAlwY2lfaW91bm1hcChkZXYsIG9oY2ktPnJlZ2lzdGVycyk7CiAgZmFpbF9pb21lbToKIAlwY2lfcmVsZWFzZV9yZWdpb24oZGV2LCAwKTsKQEAgLTMwNjMsMTAgKzMyOTgsMTAgQEAKIAlpZiAob2hjaS0+Y29uZmlnX3JvbSkKIAkJZG1hX2ZyZWVfY29oZXJlbnQob2hjaS0+Y2FyZC5kZXZpY2UsIENPTkZJR19ST01fU0laRSwKIAkJCQkgIG9oY2ktPmNvbmZpZ19yb20sIG9oY2ktPmNvbmZpZ19yb21fYnVzKTsKLQlkbWFfZnJlZV9jb2hlcmVudChvaGNpLT5jYXJkLmRldmljZSwgU0VMRl9JRF9CVUZfU0laRSwKLQkJCSAgb2hjaS0+c2VsZl9pZF9jcHUsIG9oY2ktPnNlbGZfaWRfYnVzKTsKIAlhcl9jb250ZXh0X3JlbGVhc2UoJm9oY2ktPmFyX3JlcXVlc3RfY3R4KTsKIAlhcl9jb250ZXh0X3JlbGVhc2UoJm9oY2ktPmFyX3Jlc3BvbnNlX2N0eCk7CisJZG1hX2ZyZWVfY29oZXJlbnQob2hjaS0+Y2FyZC5kZXZpY2UsIFBBR0VfU0laRSwKKwkJCSAgb2hjaS0+bWlzY19idWZmZXIsIG9oY2ktPm1pc2NfYnVmZmVyX2J1cyk7CiAJY29udGV4dF9yZWxlYXNlKCZvaGNpLT5hdF9yZXF1ZXN0X2N0eCk7CiAJY29udGV4dF9yZWxlYXNlKCZvaGNpLT5hdF9yZXNwb25zZV9jdHgpOwogCWtmcmVlKG9oY2ktPml0X2NvbnRleHRfbGlzdCk7CkBAIC0zMTE3LDcgKzMzNTIsMjAgQEAKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQlyZXR1cm4gb2hjaV9lbmFibGUoJm9oY2ktPmNhcmQsIE5VTEwsIDApOworCS8qIFNvbWUgc3lzdGVtcyBkb24ndCBzZXR1cCBHVUlEIHJlZ2lzdGVyIG9uIHJlc3VtZSBmcm9tIHJhbSAgKi8KKwlpZiAoIXJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X0dVSURMbykgJiYKKwkJCQkJIXJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X0dVSURIaSkpIHsKKwkJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0dVSURMbywgKHUzMilvaGNpLT5jYXJkLmd1aWQpOworCQlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfR1VJREhpLCAodTMyKShvaGNpLT5jYXJkLmd1aWQgPj4gMzIpKTsKKwl9CisKKwllcnIgPSBvaGNpX2VuYWJsZSgmb2hjaS0+Y2FyZCwgTlVMTCwgMCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCW9oY2lfcmVzdW1lX2lzb19kbWEob2hjaSk7CisKKwlyZXR1cm4gMDsKIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9LY29uZmlnIGIvZHJpdmVycy9oaWQvS2NvbmZpZwppbmRleCA0MDFhY2VjLi5mZmJjMjc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvaGlkL0tjb25maWcKQEAgLTE1MCw2ICsxNTAsMTYgQEAKIAlTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGVuYWJsZSBmb3JjZSBmZWVkYmFjayBzdXBwb3J0IGZvciBEcmFnb25SaXNlIEluYy4KIAlnYW1lIGNvbnRyb2xsZXJzLgogCitjb25maWcgSElEX0VNU19GRgorCXRyaXN0YXRlICJFTVMgUHJvZHVjdGlvbiBJbmMuIGZvcmNlIGZlZWRiYWNrIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBVU0JfSElECisJc2VsZWN0IElOUFVUX0ZGX01FTUxFU1MKKwktLS1oZWxwLS0tCisJU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBlbmFibGUgZm9yY2UgZmVlZGJhY2sgc3VwcG9ydCBmb3IgZGV2aWNlcyBieQorCUVNUyBQcm9kdWN0aW9uIEx0ZC4KKwlDdXJyZW50bHkgdGhlIGZvbGxvd2luZyBkZXZpY2VzIGFyZSBrbm93biB0byBiZSBzdXBwb3J0ZWQ6CisJIC0gVHJpbyBMaW5rZXIgUGx1cyBJSQorCiBjb25maWcgSElEX0VHQUxBWAogCXRyaXN0YXRlICJlR2FsYXggbXVsdGktdG91Y2ggcGFuZWwiCiAJZGVwZW5kcyBvbiBVU0JfSElECkBAIC0zOTcsNiArNDA3LDEzIEBACiAJLS0taGVscC0tLQogCVN1cHBvcnQgZm9yIFJvY2NhdCBLb25lIG1vdXNlLgogCitjb25maWcgSElEX1JPQ0NBVF9LT05FUExVUworCXRyaXN0YXRlICJSb2NjYXQgS29uZVsrXSBtb3VzZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gVVNCX0hJRAorCXNlbGVjdCBISURfUk9DQ0FUCisJLS0taGVscC0tLQorCVN1cHBvcnQgZm9yIFJvY2NhdCBLb25lWytdIG1vdXNlLgorCiBjb25maWcgSElEX1JPQ0NBVF9QWVJBCiAJdHJpc3RhdGUgIlJvY2NhdCBQeXJhIG1vdXNlIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBVU0JfSElECmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9NYWtlZmlsZSBiL2RyaXZlcnMvaGlkL01ha2VmaWxlCmluZGV4IGMzMzU2MDUuLjZlYWU5YTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaGlkL01ha2VmaWxlCkBAIC0xLDcgKzEsNyBAQAogIwogIyBNYWtlZmlsZSBmb3IgdGhlIEhJRCBkcml2ZXIKICMKLWhpZC1vYmpzCQkJOj0gaGlkLWNvcmUubyBoaWQtaW5wdXQubworaGlkLXkJCQk6PSBoaWQtY29yZS5vIGhpZC1pbnB1dC5vCiAKIGlmZGVmIENPTkZJR19ERUJVR19GUwogCWhpZC1vYmpzCQkrPSBoaWQtZGVidWcubwpAQCAtMTEsMTggKzExLDE4IEBACiAKIGhpZC0kKENPTkZJR19ISURSQVcpCQkrPSBoaWRyYXcubwogCi1oaWQtbG9naXRlY2gtb2JqcwkJOj0gaGlkLWxnLm8KK2hpZC1sb2dpdGVjaC15CQk6PSBoaWQtbGcubwogaWZkZWYgQ09ORklHX0xPR0lURUNIX0ZGCi0JaGlkLWxvZ2l0ZWNoLW9ianMJKz0gaGlkLWxnZmYubworCWhpZC1sb2dpdGVjaC15CSs9IGhpZC1sZ2ZmLm8KIGVuZGlmCiBpZmRlZiBDT05GSUdfTE9HSVJVTUJMRVBBRDJfRkYKLQloaWQtbG9naXRlY2gtb2JqcwkrPSBoaWQtbGcyZmYubworCWhpZC1sb2dpdGVjaC15CSs9IGhpZC1sZzJmZi5vCiBlbmRpZgogaWZkZWYgQ09ORklHX0xPR0lHOTQwX0ZGCi0JaGlkLWxvZ2l0ZWNoLW9ianMJKz0gaGlkLWxnM2ZmLm8KKwloaWQtbG9naXRlY2gteQkrPSBoaWQtbGczZmYubwogZW5kaWYKIGlmZGVmIENPTkZJR19MT0dJV0lJX0ZGCi0JaGlkLWxvZ2l0ZWNoLW9ianMJKz0gaGlkLWxnNGZmLm8KKwloaWQtbG9naXRlY2gteQkrPSBoaWQtbGc0ZmYubwogZW5kaWYKIAogb2JqLSQoQ09ORklHX0hJRF8zTV9QQ1QpCSs9IGhpZC0zbS1wY3QubwpAQCAtMzUsNiArMzUsNyBAQAogb2JqLSQoQ09ORklHX0hJRF9DSElDT05ZKQkrPSBoaWQtY2hpY29ueS5vCiBvYmotJChDT05GSUdfSElEX0NZUFJFU1MpCSs9IGhpZC1jeXByZXNzLm8KIG9iai0kKENPTkZJR19ISURfRFJBR09OUklTRSkJKz0gaGlkLWRyZmYubworb2JqLSQoQ09ORklHX0hJRF9FTVNfRkYpCSs9IGhpZC1lbXNmZi5vCiBvYmotJChDT05GSUdfSElEX0VHQUxBWCkJKz0gaGlkLWVnYWxheC5vCiBvYmotJChDT05GSUdfSElEX0VMRUNPTSkJKz0gaGlkLWVsZWNvbS5vCiBvYmotJChDT05GSUdfSElEX0VaS0VZKQkJKz0gaGlkLWV6a2V5Lm8KQEAgLTU1LDYgKzU2LDcgQEAKIG9iai0kKENPTkZJR19ISURfUElDT0xDRCkJKz0gaGlkLXBpY29sY2Qubwogb2JqLSQoQ09ORklHX0hJRF9ST0NDQVQpCSs9IGhpZC1yb2NjYXQubwogb2JqLSQoQ09ORklHX0hJRF9ST0NDQVRfS09ORSkJKz0gaGlkLXJvY2NhdC1rb25lLm8KK29iai0kKENPTkZJR19ISURfUk9DQ0FUX0tPTkVQTFVTKQkrPSBoaWQtcm9jY2F0LWtvbmVwbHVzLm8KIG9iai0kKENPTkZJR19ISURfUk9DQ0FUX1BZUkEpCSs9IGhpZC1yb2NjYXQtcHlyYS5vCiBvYmotJChDT05GSUdfSElEX1NBTVNVTkcpCSs9IGhpZC1zYW1zdW5nLm8KIG9iai0kKENPTkZJR19ISURfU01BUlRKT1lQTFVTKQkrPSBoaWQtc2pveS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtM20tcGN0LmMgYi9kcml2ZXJzL2hpZC9oaWQtM20tcGN0LmMKaW5kZXggNGZiN2M3NS4uNTI0M2FlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLTNtLXBjdC5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC0zbS1wY3QuYwpAQCAtMjQ2LDcgKzI0Niw3IEBACiAKIAltZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtbW1fZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghbWQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiY2Fubm90IGFsbG9jYXRlIDNNIGRhdGFcbiIpOworCQloaWRfZXJyKGhkZXYsICJjYW5ub3QgYWxsb2NhdGUgM00gZGF0YVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAloaWRfc2V0X2RydmRhdGEoaGRldiwgbWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWE0dGVjaC5jIGIvZHJpdmVycy9oaWQvaGlkLWE0dGVjaC5jCmluZGV4IDE2NjZjMTYuLjkwMmQxZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1hNHRlY2guYworKysgYi9kcml2ZXJzL2hpZC9oaWQtYTR0ZWNoLmMKQEAgLTkzLDcgKzkzLDcgQEAKIAogCWE0ID0ga3phbGxvYyhzaXplb2YoKmE0KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGE0ID09IE5VTEwpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiY2FuJ3QgYWxsb2MgZGV2aWNlIGRlc2NyaXB0b3JcbiIpOworCQloaWRfZXJyKGhkZXYsICJjYW4ndCBhbGxvYyBkZXZpY2UgZGVzY3JpcHRvclxuIik7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX2ZyZWU7CiAJfQpAQCAtMTA0LDEzICsxMDQsMTMgQEAKIAogCXJldCA9IGhpZF9wYXJzZShoZGV2KTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgInBhcnNlIGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgInBhcnNlIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX2ZyZWU7CiAJfQogCiAJcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIEhJRF9DT05ORUNUX0RFRkFVTFQpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1hcHBsZS5jIGIvZHJpdmVycy9oaWQvaGlkLWFwcGxlLmMKaW5kZXggZWFlY2E1Ni4uNjFhYTcxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWFwcGxlLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWFwcGxlLmMKQEAgLTE2LDYgKzE2LDggQEAKICAqIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtNTksNiArNjEsMjcgQEAKIAl1OCBmbGFnczsKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXBwbGVfa2V5X3RyYW5zbGF0aW9uIG1hY2Jvb2thaXJfZm5fa2V5c1tdID0geworCXsgS0VZX0JBQ0tTUEFDRSwgS0VZX0RFTEVURSB9LAorCXsgS0VZX0VOVEVSLAlLRVlfSU5TRVJUIH0sCisJeyBLRVlfRjEsCUtFWV9CUklHSFRORVNTRE9XTiwgQVBQTEVfRkxBR19GS0VZIH0sCisJeyBLRVlfRjIsCUtFWV9CUklHSFRORVNTVVAsICAgQVBQTEVfRkxBR19GS0VZIH0sCisJeyBLRVlfRjMsCUtFWV9TQ0FMRSwgICAgICAgICAgQVBQTEVfRkxBR19GS0VZIH0sCisJeyBLRVlfRjQsCUtFWV9EQVNIQk9BUkQsICAgICAgQVBQTEVfRkxBR19GS0VZIH0sCisJeyBLRVlfRjYsCUtFWV9QUkVWSU9VU1NPTkcsICAgQVBQTEVfRkxBR19GS0VZIH0sCisJeyBLRVlfRjcsCUtFWV9QTEFZUEFVU0UsICAgICAgQVBQTEVfRkxBR19GS0VZIH0sCisJeyBLRVlfRjgsCUtFWV9ORVhUU09ORywgICAgICAgQVBQTEVfRkxBR19GS0VZIH0sCisJeyBLRVlfRjksCUtFWV9NVVRFLCAgICAgICAgICAgQVBQTEVfRkxBR19GS0VZIH0sCisJeyBLRVlfRjEwLAlLRVlfVk9MVU1FRE9XTiwgICAgIEFQUExFX0ZMQUdfRktFWSB9LAorCXsgS0VZX0YxMSwJS0VZX1ZPTFVNRVVQLCAgICAgICBBUFBMRV9GTEFHX0ZLRVkgfSwKKwl7IEtFWV9GMTIsCUtFWV9FSkVDVENELCAgICAgICAgQVBQTEVfRkxBR19GS0VZIH0sCisJeyBLRVlfVVAsCUtFWV9QQUdFVVAgfSwKKwl7IEtFWV9ET1dOLAlLRVlfUEFHRURPV04gfSwKKwl7IEtFWV9MRUZULAlLRVlfSE9NRSB9LAorCXsgS0VZX1JJR0hULAlLRVlfRU5EIH0sCisJeyB9Cit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IGFwcGxlX2tleV90cmFuc2xhdGlvbiBhcHBsZV9mbl9rZXlzW10gPSB7CiAJeyBLRVlfQkFDS1NQQUNFLCBLRVlfREVMRVRFIH0sCiAJeyBLRVlfRU5URVIsCUtFWV9JTlNFUlQgfSwKQEAgLTE0Niw3ICsxNjksNyBAQAogCQlzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwgX19zMzIgdmFsdWUpCiB7CiAJc3RydWN0IGFwcGxlX3NjICphc2MgPSBoaWRfZ2V0X2RydmRhdGEoaGlkKTsKLQljb25zdCBzdHJ1Y3QgYXBwbGVfa2V5X3RyYW5zbGF0aW9uICp0cmFuczsKKwljb25zdCBzdHJ1Y3QgYXBwbGVfa2V5X3RyYW5zbGF0aW9uICp0cmFucywgKnRhYmxlOwogCiAJaWYgKHVzYWdlLT5jb2RlID09IEtFWV9GTikgewogCQlhc2MtPmZuX29uID0gISF2YWx1ZTsKQEAgLTE1NywxMCArMTgwLDE2IEBACiAJaWYgKGZubW9kZSkgewogCQlpbnQgZG9fdHJhbnNsYXRlOwogCi0JCXRyYW5zID0gYXBwbGVfZmluZF90cmFuc2xhdGlvbigoaGlkLT5wcm9kdWN0IDwgMHgyMWQgfHwKLQkJCQkJaGlkLT5wcm9kdWN0ID49IDB4MzAwKSA/Ci0JCQkJCXBvd2VyYm9va19mbl9rZXlzIDogYXBwbGVfZm5fa2V5cywKLQkJCQkJdXNhZ2UtPmNvZGUpOworCQlpZiAoaGlkLT5wcm9kdWN0ID49IFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRfQU5TSSAmJgorCQkJCWhpZC0+cHJvZHVjdCA8PSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0QV9KSVMpCisJCQl0YWJsZSA9IG1hY2Jvb2thaXJfZm5fa2V5czsKKwkJZWxzZSBpZiAoaGlkLT5wcm9kdWN0IDwgMHgyMWQgfHwgaGlkLT5wcm9kdWN0ID49IDB4MzAwKQorCQkJdGFibGUgPSBwb3dlcmJvb2tfZm5fa2V5czsKKwkJZWxzZQorCQkJdGFibGUgPSBhcHBsZV9mbl9rZXlzOworCisJCXRyYW5zID0gYXBwbGVfZmluZF90cmFuc2xhdGlvbiAodGFibGUsIHVzYWdlLT5jb2RlKTsKKwogCQlpZiAodHJhbnMpIHsKIAkJCWlmICh0ZXN0X2JpdCh1c2FnZS0+Y29kZSwgYXNjLT5wcmVzc2VkX2ZuKSkKIAkJCQlkb190cmFuc2xhdGUgPSAxOwpAQCAtMjUzLDggKzI4Miw4IEBACiAKIAlpZiAoKGFzYy0+cXVpcmtzICYgQVBQTEVfUkRFU0NfSklTKSAmJiAqcnNpemUgPj0gNjAgJiYKIAkJCXJkZXNjWzUzXSA9PSAweDY1ICYmIHJkZXNjWzU5XSA9PSAweDY1KSB7Ci0JCWRldl9pbmZvKCZoZGV2LT5kZXYsICJmaXhpbmcgdXAgTWFjQm9vayBKSVMga2V5Ym9hcmQgcmVwb3J0ICIKLQkJCQkiZGVzY3JpcHRvclxuIik7CisJCWhpZF9pbmZvKGhkZXYsCisJCQkgImZpeGluZyB1cCBNYWNCb29rIEpJUyBrZXlib2FyZCByZXBvcnQgZGVzY3JpcHRvclxuIik7CiAJCXJkZXNjWzUzXSA9IHJkZXNjWzU5XSA9IDB4ZTc7CiAJfQogCXJldHVybiByZGVzYzsKQEAgLTMyNCw3ICszNTMsNyBAQAogCiAJYXNjID0ga3phbGxvYyhzaXplb2YoKmFzYyksIEdGUF9LRVJORUwpOwogCWlmIChhc2MgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJjYW4ndCBhbGxvYyBhcHBsZSBkZXNjcmlwdG9yXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiY2FuJ3QgYWxsb2MgYXBwbGUgZGVzY3JpcHRvclxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMzM0LDcgKzM2Myw3IEBACiAKIAlyZXQgPSBoaWRfcGFyc2UoaGRldik7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJwYXJzZSBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJwYXJzZSBmYWlsZWRcbiIpOwogCQlnb3RvIGVycl9mcmVlOwogCX0KIApAQCAtMzQ1LDcgKzM3NCw3IEBACiAKIAlyZXQgPSBoaWRfaHdfc3RhcnQoaGRldiwgY29ubmVjdF9tYXNrKTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX2ZyZWU7CiAJfQogCkBAIC00NDAsNiArNDY5LDE4IEBACiAJCS5kcml2ZXJfZGF0YSA9IEFQUExFX0hBU19GTiB8IEFQUExFX0lTT19LRVlCT0FSRCB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HM19KSVMpLAogCQkuZHJpdmVyX2RhdGEgPSBBUFBMRV9IQVNfRk4gfCBBUFBMRV9SREVTQ19KSVMgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRfQU5TSSksCisJCS5kcml2ZXJfZGF0YSA9IEFQUExFX0hBU19GTiB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNF9JU08pLAorCQkuZHJpdmVyX2RhdGEgPSBBUFBMRV9IQVNfRk4gfCBBUFBMRV9JU09fS0VZQk9BUkQgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRfSklTKSwKKwkJLmRyaXZlcl9kYXRhID0gQVBQTEVfSEFTX0ZOIHwgQVBQTEVfUkRFU0NfSklTIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0QV9BTlNJKSwKKwkJLmRyaXZlcl9kYXRhID0gQVBQTEVfSEFTX0ZOIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0QV9JU08pLAorCQkuZHJpdmVyX2RhdGEgPSBBUFBMRV9IQVNfRk4gfCBBUFBMRV9JU09fS0VZQk9BUkQgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRBX0pJUyksCisJCS5kcml2ZXJfZGF0YSA9IEFQUExFX0hBU19GTiB8IEFQUExFX1JERVNDX0pJUyB9LAogCXsgSElEX0JMVUVUT09USF9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9BTFVfV0lSRUxFU1NfMjAwOV9BTlNJKSwKIAkJLmRyaXZlcl9kYXRhID0gQVBQTEVfTlVNTE9DS19FTVVMQVRJT04gfCBBUFBMRV9IQVNfRk4gfSwKIAl7IEhJRF9CTFVFVE9PVEhfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX1dJUkVMRVNTXzIwMDlfSVNPKSwKQEAgLTQ3Myw3ICs1MTQsNyBAQAogCiAJcmV0ID0gaGlkX3JlZ2lzdGVyX2RyaXZlcigmYXBwbGVfZHJpdmVyKTsKIAlpZiAocmV0KQotCQlwcmludGsoS0VSTl9FUlIgImNhbid0IHJlZ2lzdGVyIGFwcGxlIGRyaXZlclxuIik7CisJCXByX2VycigiY2FuJ3QgcmVnaXN0ZXIgYXBwbGUgZHJpdmVyXG4iKTsKIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtYXhmZi5jIGIvZHJpdmVycy9oaWQvaGlkLWF4ZmYuYwppbmRleCBmNDJlZTE0Li5lNWI5NjFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtYXhmZi5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1heGZmLmMKQEAgLTczLDE0ICs3MywxNCBAQAogCWludCBlcnJvcjsKIAogCWlmIChsaXN0X2VtcHR5KHJlcG9ydF9saXN0KSkgewotCQlkZXZfZXJyKCZoaWQtPmRldiwgIm5vIG91dHB1dCByZXBvcnRzIGZvdW5kXG4iKTsKKwkJaGlkX2VycihoaWQsICJubyBvdXRwdXQgcmVwb3J0cyBmb3VuZFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCXJlcG9ydCA9IGxpc3RfZmlyc3RfZW50cnkocmVwb3J0X2xpc3QsIHN0cnVjdCBoaWRfcmVwb3J0LCBsaXN0KTsKIAogCWlmIChyZXBvcnQtPm1heGZpZWxkIDwgNCkgewotCQlkZXZfZXJyKCZoaWQtPmRldiwgIm5vIGZpZWxkcyBpbiB0aGUgcmVwb3J0OiAlZFxuIiwgcmVwb3J0LT5tYXhmaWVsZCk7CisJCWhpZF9lcnIoaGlkLCAibm8gZmllbGRzIGluIHRoZSByZXBvcnQ6ICVkXG4iLCByZXBvcnQtPm1heGZpZWxkKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0xMDEsNyArMTAxLDcgQEAKIAlheGZmLT5yZXBvcnQtPmZpZWxkWzNdLT52YWx1ZVswXSA9IDB4MDA7CiAJdXNiaGlkX3N1Ym1pdF9yZXBvcnQoaGlkLCBheGZmLT5yZXBvcnQsIFVTQl9ESVJfT1VUKTsKIAotCWRldl9pbmZvKCZoaWQtPmRldiwgIkZvcmNlIEZlZWRiYWNrIGZvciBBQ1JVWCBnYW1lIGNvbnRyb2xsZXJzIGJ5IFNlcmdlaSBLb2x6dW48eDByQGR2LWxpZmUucnU+XG4iKTsKKwloaWRfaW5mbyhoaWQsICJGb3JjZSBGZWVkYmFjayBmb3IgQUNSVVggZ2FtZSBjb250cm9sbGVycyBieSBTZXJnZWkgS29senVuPHgwckBkdi1saWZlLnJ1PlxuIik7CiAKIAlyZXR1cm4gMDsKIApAQCAtMTE0LDE3ICsxMTQsMTcgQEAKIHsKIAlpbnQgZXJyb3I7CiAKLQlkZXZfZGJnKCZoZGV2LT5kZXYsICJBQ1JVWCBISUQgaGFyZHdhcmUgcHJvYmUuLi4iKTsKKwlkZXZfZGJnKCZoZGV2LT5kZXYsICJBQ1JVWCBISUQgaGFyZHdhcmUgcHJvYmUuLi5cbiIpOwogCiAJZXJyb3IgPSBoaWRfcGFyc2UoaGRldik7CiAJaWYgKGVycm9yKSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgInBhcnNlIGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgInBhcnNlIGZhaWxlZFxuIik7CiAJCXJldHVybiBlcnJvcjsKIAl9CiAKIAllcnJvciA9IGhpZF9od19zdGFydChoZGV2LCBISURfQ09OTkVDVF9ERUZBVUxUICYgfkhJRF9DT05ORUNUX0ZGKTsKIAlpZiAoZXJyb3IpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIGVycm9yOwogCX0KIApAQCAtMTM0LDcgKzEzNCw3IEBACiAJCSAqIERvIG5vdCBmYWlsIGRldmljZSBpbml0aWFsaXphdGlvbiBjb21wbGV0ZWx5IGFzIGRldmljZQogCQkgKiBtYXkgc3RpbGwgYmUgcGFydGlhbGx5IG9wZXJhYmxlLCBqdXN0IHdhcm4uCiAJCSAqLwotCQlkZXZfd2FybigmaGRldi0+ZGV2LAorCQloaWRfd2FybihoZGV2LAogCQkJICJGYWlsZWQgdG8gZW5hYmxlIGZvcmNlIGZlZWRiYWNrIHN1cHBvcnQsIGVycm9yOiAlZFxuIiwKIAkJCSBlcnJvcik7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWJlbGtpbi5jIGIvZHJpdmVycy9oaWQvaGlkLWJlbGtpbi5jCmluZGV4IDRjZTdhYTMuLmExYTc2NWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1iZWxraW4uYworKysgYi9kcml2ZXJzL2hpZC9oaWQtYmVsa2luLmMKQEAgLTU2LDE0ICs1NiwxNCBAQAogCiAJcmV0ID0gaGlkX3BhcnNlKGhkZXYpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKIAlyZXQgPSBoaWRfaHdfc3RhcnQoaGRldiwgSElEX0NPTk5FQ1RfREVGQVVMVCB8CiAJCSgocXVpcmtzICYgQkVMS0lOX0hJRERFVikgPyBISURfQ09OTkVDVF9ISURERVZfRk9SQ0UgOiAwKSk7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOwogCQlnb3RvIGVycl9mcmVlOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWNhbmRvLmMgYi9kcml2ZXJzL2hpZC9oaWQtY2FuZG8uYwppbmRleCA1OTI1YmRjLi4zNzViNTA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtY2FuZG8uYworKysgYi9kcml2ZXJzL2hpZC9oaWQtY2FuZG8uYwpAQCAtMjA3LDcgKzIwNyw3IEBACiAKIAl0ZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjYW5kb19kYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0ZCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJjYW5ub3QgYWxsb2NhdGUgQ2FuZG8gVG91Y2ggZGF0YVxuIik7CisJCWhpZF9lcnIoaGRldiwgImNhbm5vdCBhbGxvY2F0ZSBDYW5kbyBUb3VjaCBkYXRhXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCWhpZF9zZXRfZHJ2ZGF0YShoZGV2LCB0ZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtY2hlcnJ5LmMgYi9kcml2ZXJzL2hpZC9oaWQtY2hlcnJ5LmMKaW5kZXggZTg4MDA4Ni4uODg4ZWNlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWNoZXJyeS5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1jaGVycnkuYwpAQCAtMzAsOCArMzAsNyBAQAogCQl1bnNpZ25lZCBpbnQgKnJzaXplKQogewogCWlmICgqcnNpemUgPj0gMTcgJiYgcmRlc2NbMTFdID09IDB4M2MgJiYgcmRlc2NbMTJdID09IDB4MDIpIHsKLQkJZGV2X2luZm8oJmhkZXYtPmRldiwgImZpeGluZyB1cCBDaGVycnkgQ3ltb3Rpb24gcmVwb3J0ICIKLQkJCQkiZGVzY3JpcHRvclxuIik7CisJCWhpZF9pbmZvKGhkZXYsICJmaXhpbmcgdXAgQ2hlcnJ5IEN5bW90aW9uIHJlcG9ydCBkZXNjcmlwdG9yXG4iKTsKIAkJcmRlc2NbMTFdID0gcmRlc2NbMTZdID0gMHhmZjsKIAkJcmRlc2NbMTJdID0gcmRlc2NbMTddID0gMHgwMzsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtY29yZS5jIGIvZHJpdmVycy9oaWQvaGlkLWNvcmUuYwppbmRleCAzZjk2NzNkLi4yNjExNjg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtY29yZS5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1jb3JlLmMKQEAgLTE0LDYgKzE0LDggQEAKICAqIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC01OSw3ICs2MSw4IEBACiAJaWYgKHJlcG9ydF9lbnVtLT5yZXBvcnRfaWRfaGFzaFtpZF0pCiAJCXJldHVybiByZXBvcnRfZW51bS0+cmVwb3J0X2lkX2hhc2hbaWRdOwogCi0JaWYgKCEocmVwb3J0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGhpZF9yZXBvcnQpLCBHRlBfS0VSTkVMKSkpCisJcmVwb3J0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGhpZF9yZXBvcnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlcG9ydCkKIAkJcmV0dXJuIE5VTEw7CiAKIAlpZiAoaWQgIT0gMCkKQEAgLTkwLDggKzkzLDExIEBACiAJCXJldHVybiBOVUxMOwogCX0KIAotCWlmICghKGZpZWxkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGhpZF9maWVsZCkgKyB1c2FnZXMgKiBzaXplb2Yoc3RydWN0IGhpZF91c2FnZSkKLQkJKyB2YWx1ZXMgKiBzaXplb2YodW5zaWduZWQpLCBHRlBfS0VSTkVMKSkpIHJldHVybiBOVUxMOworCWZpZWxkID0ga3phbGxvYygoc2l6ZW9mKHN0cnVjdCBoaWRfZmllbGQpICsKKwkJCSB1c2FnZXMgKiBzaXplb2Yoc3RydWN0IGhpZF91c2FnZSkgKworCQkJIHZhbHVlcyAqIHNpemVvZih1bnNpZ25lZCkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZpZWxkKQorCQlyZXR1cm4gTlVMTDsKIAogCWZpZWxkLT5pbmRleCA9IHJlcG9ydC0+bWF4ZmllbGQrKzsKIAlyZXBvcnQtPmZpZWxkW2ZpZWxkLT5pbmRleF0gPSBmaWVsZDsKQEAgLTE3MiwxMCArMTc4LDE0IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBoaWRfbG9va3VwX2NvbGxlY3Rpb24oc3RydWN0IGhpZF9wYXJzZXIgKnBhcnNlciwgdW5zaWduZWQgdHlwZSkKIHsKKwlzdHJ1Y3QgaGlkX2NvbGxlY3Rpb24gKmNvbGxlY3Rpb24gPSBwYXJzZXItPmRldmljZS0+Y29sbGVjdGlvbjsKIAlpbnQgbjsKLQlmb3IgKG4gPSBwYXJzZXItPmNvbGxlY3Rpb25fc3RhY2tfcHRyIC0gMTsgbiA+PSAwOyBuLS0pCi0JCWlmIChwYXJzZXItPmRldmljZS0+Y29sbGVjdGlvbltwYXJzZXItPmNvbGxlY3Rpb25fc3RhY2tbbl1dLnR5cGUgPT0gdHlwZSkKLQkJCXJldHVybiBwYXJzZXItPmRldmljZS0+Y29sbGVjdGlvbltwYXJzZXItPmNvbGxlY3Rpb25fc3RhY2tbbl1dLnVzYWdlOworCisJZm9yIChuID0gcGFyc2VyLT5jb2xsZWN0aW9uX3N0YWNrX3B0ciAtIDE7IG4gPj0gMDsgbi0tKSB7CisJCXVuc2lnbmVkIGluZGV4ID0gcGFyc2VyLT5jb2xsZWN0aW9uX3N0YWNrW25dOworCQlpZiAoY29sbGVjdGlvbltpbmRleF0udHlwZSA9PSB0eXBlKQorCQkJcmV0dXJuIGNvbGxlY3Rpb25baW5kZXhdLnVzYWdlOworCX0KIAlyZXR1cm4gMDsgLyogd2Uga25vdyBub3RoaW5nIGFib3V0IHRoaXMgdXNhZ2UgdHlwZSAqLwogfQogCkBAIC0yMDksNyArMjE5LDggQEAKIAl1bnNpZ25lZCBvZmZzZXQ7CiAJaW50IGk7CiAKLQlpZiAoIShyZXBvcnQgPSBoaWRfcmVnaXN0ZXJfcmVwb3J0KHBhcnNlci0+ZGV2aWNlLCByZXBvcnRfdHlwZSwgcGFyc2VyLT5nbG9iYWwucmVwb3J0X2lkKSkpIHsKKwlyZXBvcnQgPSBoaWRfcmVnaXN0ZXJfcmVwb3J0KHBhcnNlci0+ZGV2aWNlLCByZXBvcnRfdHlwZSwgcGFyc2VyLT5nbG9iYWwucmVwb3J0X2lkKTsKKwlpZiAoIXJlcG9ydCkgewogCQlkYmdfaGlkKCJoaWRfcmVnaXN0ZXJfcmVwb3J0IGZhaWxlZFxuIik7CiAJCXJldHVybiAtMTsKIAl9CkBAIC0yMjcsNyArMjM4LDggQEAKIAogCXVzYWdlcyA9IG1heF90KGludCwgcGFyc2VyLT5sb2NhbC51c2FnZV9pbmRleCwgcGFyc2VyLT5nbG9iYWwucmVwb3J0X2NvdW50KTsKIAotCWlmICgoZmllbGQgPSBoaWRfcmVnaXN0ZXJfZmllbGQocmVwb3J0LCB1c2FnZXMsIHBhcnNlci0+Z2xvYmFsLnJlcG9ydF9jb3VudCkpID09IE5VTEwpCisJZmllbGQgPSBoaWRfcmVnaXN0ZXJfZmllbGQocmVwb3J0LCB1c2FnZXMsIHBhcnNlci0+Z2xvYmFsLnJlcG9ydF9jb3VudCk7CisJaWYgKCFmaWVsZCkKIAkJcmV0dXJuIDA7CiAKIAlmaWVsZC0+cGh5c2ljYWwgPSBoaWRfbG9va3VwX2NvbGxlY3Rpb24ocGFyc2VyLCBISURfQ09MTEVDVElPTl9QSFlTSUNBTCk7CkBAIC02NTIsMTMgKzY2NCwxMiBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAlkZXZpY2UtPnJzaXplID0gc2l6ZTsKIAotCXBhcnNlciA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBoaWRfcGFyc2VyKSk7CisJcGFyc2VyID0gdnphbGxvYyhzaXplb2Yoc3RydWN0IGhpZF9wYXJzZXIpKTsKIAlpZiAoIXBhcnNlcikgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGVycjsKIAl9CiAKLQltZW1zZXQocGFyc2VyLCAwLCBzaXplb2Yoc3RydWN0IGhpZF9wYXJzZXIpKTsKIAlwYXJzZXItPmRldmljZSA9IGRldmljZTsKIAogCWVuZCA9IHN0YXJ0ICsgc2l6ZTsKQEAgLTY3Miw3ICs2ODMsOCBAQAogCiAJCWlmIChkaXNwYXRjaF90eXBlW2l0ZW0udHlwZV0ocGFyc2VyLCAmaXRlbSkpIHsKIAkJCWRiZ19oaWQoIml0ZW0gJXUgJXUgJXUgJXUgcGFyc2luZyBmYWlsZWRcbiIsCi0JCQkJaXRlbS5mb3JtYXQsICh1bnNpZ25lZClpdGVtLnNpemUsICh1bnNpZ25lZClpdGVtLnR5cGUsICh1bnNpZ25lZClpdGVtLnRhZyk7CisJCQkJaXRlbS5mb3JtYXQsICh1bnNpZ25lZClpdGVtLnNpemUsCisJCQkJKHVuc2lnbmVkKWl0ZW0udHlwZSwgKHVuc2lnbmVkKWl0ZW0udGFnKTsKIAkJCWdvdG8gZXJyOwogCQl9CiAKQEAgLTczNywxMyArNzQ5LDE0IEBACiAgKiBTZWFyY2ggbGludXgta2VybmVsIGFuZCBsaW51eC11c2ItZGV2ZWwgYXJjaGl2ZXMgZm9yICJoaWQtY29yZSBleHRyYWN0Ii4KICAqLwogCi1zdGF0aWMgX19pbmxpbmVfXyBfX3UzMiBleHRyYWN0KF9fdTggKnJlcG9ydCwgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBuKQorc3RhdGljIF9fdTMyIGV4dHJhY3QoY29uc3Qgc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgX191OCAqcmVwb3J0LAorCQkgICAgIHVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgbikKIHsKIAl1NjQgeDsKIAogCWlmIChuID4gMzIpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkhJRDogZXh0cmFjdCgpIGNhbGxlZCB3aXRoIG4gKCVkKSA+IDMyISAoJXMpXG4iLAotCQkJCW4sIGN1cnJlbnQtPmNvbW0pOworCQloaWRfd2FybihoaWQsICJleHRyYWN0KCkgY2FsbGVkIHdpdGggbiAoJWQpID4gMzIhICglcylcbiIsCisJCQkgbiwgY3VycmVudC0+Y29tbSk7CiAKIAlyZXBvcnQgKz0gb2Zmc2V0ID4+IDM7ICAvKiBhZGp1c3QgYnl0ZSBpbmRleCAqLwogCW9mZnNldCAmPSA3OyAgICAgICAgICAgIC8qIG5vdyBvbmx5IG5lZWQgYml0IG9mZnNldCBpbnRvIG9uZSBieXRlICovCkBAIC03NjAsMTggKzc3MywxOSBAQAogICogZW5kaWFubmVzcyBvZiByZWdpc3RlciB2YWx1ZXMgYnkgY29uc2lkZXJpbmcgYSByZWdpc3RlcgogICogYSAiY2FjaGVkIiBjb3B5IG9mIHRoZSBsaXR0bGUgZW5kaWFkIGJpdCBzdHJlYW0uCiAgKi8KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgaW1wbGVtZW50KF9fdTggKnJlcG9ydCwgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBuLCBfX3UzMiB2YWx1ZSkKK3N0YXRpYyB2b2lkIGltcGxlbWVudChjb25zdCBzdHJ1Y3QgaGlkX2RldmljZSAqaGlkLCBfX3U4ICpyZXBvcnQsCisJCSAgICAgIHVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgbiwgX191MzIgdmFsdWUpCiB7CiAJdTY0IHg7CiAJdTY0IG0gPSAoMVVMTCA8PCBuKSAtIDE7CiAKIAlpZiAobiA+IDMyKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJISUQ6IGltcGxlbWVudCgpIGNhbGxlZCB3aXRoIG4gKCVkKSA+IDMyISAoJXMpXG4iLAotCQkJCW4sIGN1cnJlbnQtPmNvbW0pOworCQloaWRfd2FybihoaWQsICIlcygpIGNhbGxlZCB3aXRoIG4gKCVkKSA+IDMyISAoJXMpXG4iLAorCQkJIF9fZnVuY19fLCBuLCBjdXJyZW50LT5jb21tKTsKIAogCWlmICh2YWx1ZSA+IG0pCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkhJRDogaW1wbGVtZW50KCkgY2FsbGVkIHdpdGggdG9vIGxhcmdlIHZhbHVlICVkISAoJXMpXG4iLAotCQkJCXZhbHVlLCBjdXJyZW50LT5jb21tKTsKKwkJaGlkX3dhcm4oaGlkLCAiJXMoKSBjYWxsZWQgd2l0aCB0b28gbGFyZ2UgdmFsdWUgJWQhICglcylcbiIsCisJCQkgX19mdW5jX18sIHZhbHVlLCBjdXJyZW50LT5jb21tKTsKIAlXQVJOX09OKHZhbHVlID4gbSk7CiAJdmFsdWUgJj0gbTsKIApAQCAtNzg4LDcgKzgwMiw3IEBACiAgKiBTZWFyY2ggYW4gYXJyYXkgZm9yIGEgdmFsdWUuCiAgKi8KIAotc3RhdGljIF9faW5saW5lX18gaW50IHNlYXJjaChfX3MzMiAqYXJyYXksIF9fczMyIHZhbHVlLCB1bnNpZ25lZCBuKQorc3RhdGljIGludCBzZWFyY2goX19zMzIgKmFycmF5LCBfX3MzMiB2YWx1ZSwgdW5zaWduZWQgbikKIHsKIAl3aGlsZSAobi0tKSB7CiAJCWlmICgqYXJyYXkrKyA9PSB2YWx1ZSkKQEAgLTg4NywxOCArOTAxLDIyIEBACiAJX19zMzIgbWF4ID0gZmllbGQtPmxvZ2ljYWxfbWF4aW11bTsKIAlfX3MzMiAqdmFsdWU7CiAKLQlpZiAoISh2YWx1ZSA9IGttYWxsb2Moc2l6ZW9mKF9fczMyKSAqIGNvdW50LCBHRlBfQVRPTUlDKSkpCisJdmFsdWUgPSBrbWFsbG9jKHNpemVvZihfX3MzMikgKiBjb3VudCwgR0ZQX0FUT01JQyk7CisJaWYgKCF2YWx1ZSkKIAkJcmV0dXJuOwogCiAJZm9yIChuID0gMDsgbiA8IGNvdW50OyBuKyspIHsKIAotCQkJdmFsdWVbbl0gPSBtaW4gPCAwID8gc250bzMyKGV4dHJhY3QoZGF0YSwgb2Zmc2V0ICsgbiAqIHNpemUsIHNpemUpLCBzaXplKSA6Ci0JCQkJCQkgICAgZXh0cmFjdChkYXRhLCBvZmZzZXQgKyBuICogc2l6ZSwgc2l6ZSk7CisJCXZhbHVlW25dID0gbWluIDwgMCA/CisJCQlzbnRvMzIoZXh0cmFjdChoaWQsIGRhdGEsIG9mZnNldCArIG4gKiBzaXplLCBzaXplKSwKKwkJCSAgICAgICBzaXplKSA6CisJCQlleHRyYWN0KGhpZCwgZGF0YSwgb2Zmc2V0ICsgbiAqIHNpemUsIHNpemUpOwogCi0JCQlpZiAoIShmaWVsZC0+ZmxhZ3MgJiBISURfTUFJTl9JVEVNX1ZBUklBQkxFKSAvKiBJZ25vcmUgcmVwb3J0IGlmIEVycm9yUm9sbE92ZXIgKi8KLQkJCSAgICAmJiB2YWx1ZVtuXSA+PSBtaW4gJiYgdmFsdWVbbl0gPD0gbWF4Ci0JCQkgICAgJiYgZmllbGQtPnVzYWdlW3ZhbHVlW25dIC0gbWluXS5oaWQgPT0gSElEX1VQX0tFWUJPQVJEICsgMSkKLQkJCQlnb3RvIGV4aXQ7CisJCS8qIElnbm9yZSByZXBvcnQgaWYgRXJyb3JSb2xsT3ZlciAqLworCQlpZiAoIShmaWVsZC0+ZmxhZ3MgJiBISURfTUFJTl9JVEVNX1ZBUklBQkxFKSAmJgorCQkgICAgdmFsdWVbbl0gPj0gbWluICYmIHZhbHVlW25dIDw9IG1heCAmJgorCQkgICAgZmllbGQtPnVzYWdlW3ZhbHVlW25dIC0gbWluXS5oaWQgPT0gSElEX1VQX0tFWUJPQVJEICsgMSkKKwkJCWdvdG8gZXhpdDsKIAl9CiAKIAlmb3IgKG4gPSAwOyBuIDwgY291bnQ7IG4rKykgewpAQCAtOTI4LDcgKzk0Niw4IEBACiAgKiBPdXRwdXQgdGhlIGZpZWxkIGludG8gdGhlIHJlcG9ydC4KICAqLwogCi1zdGF0aWMgdm9pZCBoaWRfb3V0cHV0X2ZpZWxkKHN0cnVjdCBoaWRfZmllbGQgKmZpZWxkLCBfX3U4ICpkYXRhKQorc3RhdGljIHZvaWQgaGlkX291dHB1dF9maWVsZChjb25zdCBzdHJ1Y3QgaGlkX2RldmljZSAqaGlkLAorCQkJICAgICBzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZCwgX191OCAqZGF0YSkKIHsKIAl1bnNpZ25lZCBjb3VudCA9IGZpZWxkLT5yZXBvcnRfY291bnQ7CiAJdW5zaWduZWQgb2Zmc2V0ID0gZmllbGQtPnJlcG9ydF9vZmZzZXQ7CkBAIC05MzcsOSArOTU2LDExIEBACiAKIAlmb3IgKG4gPSAwOyBuIDwgY291bnQ7IG4rKykgewogCQlpZiAoZmllbGQtPmxvZ2ljYWxfbWluaW11bSA8IDApCS8qIHNpZ25lZCB2YWx1ZXMgKi8KLQkJCWltcGxlbWVudChkYXRhLCBvZmZzZXQgKyBuICogc2l6ZSwgc2l6ZSwgczMydG9uKGZpZWxkLT52YWx1ZVtuXSwgc2l6ZSkpOworCQkJaW1wbGVtZW50KGhpZCwgZGF0YSwgb2Zmc2V0ICsgbiAqIHNpemUsIHNpemUsCisJCQkJICBzMzJ0b24oZmllbGQtPnZhbHVlW25dLCBzaXplKSk7CiAJCWVsc2UJCQkJLyogdW5zaWduZWQgdmFsdWVzICovCi0JCQlpbXBsZW1lbnQoZGF0YSwgb2Zmc2V0ICsgbiAqIHNpemUsIHNpemUsIGZpZWxkLT52YWx1ZVtuXSk7CisJCQlpbXBsZW1lbnQoaGlkLCBkYXRhLCBvZmZzZXQgKyBuICogc2l6ZSwgc2l6ZSwKKwkJCQkgIGZpZWxkLT52YWx1ZVtuXSk7CiAJfQogfQogCkBAIC05NTYsNyArOTc3LDcgQEAKIAogCW1lbXNldChkYXRhLCAwLCAoKHJlcG9ydC0+c2l6ZSAtIDEpID4+IDMpICsgMSk7CiAJZm9yIChuID0gMDsgbiA8IHJlcG9ydC0+bWF4ZmllbGQ7IG4rKykKLQkJaGlkX291dHB1dF9maWVsZChyZXBvcnQtPmZpZWxkW25dLCBkYXRhKTsKKwkJaGlkX291dHB1dF9maWVsZChyZXBvcnQtPmRldmljZSwgcmVwb3J0LT5maWVsZFtuXSwgZGF0YSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChoaWRfb3V0cHV0X3JlcG9ydCk7CiAKQEAgLTExNjksOCArMTE5MCw3IEBACiAJCWhkZXYtPmNsYWltZWQgfD0gSElEX0NMQUlNRURfSElEUkFXOwogCiAJaWYgKCFoZGV2LT5jbGFpbWVkKSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImNsYWltZWQgYnkgbmVpdGhlciBpbnB1dCwgaGlkZGV2IG5vciAiCi0JCQkJImhpZHJhd1xuIik7CisJCWhpZF9lcnIoaGRldiwgImNsYWltZWQgYnkgbmVpdGhlciBpbnB1dCwgaGlkZGV2IG5vciBoaWRyYXdcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTEyMTAsOSArMTIzMCw5IEBACiAJCWJ1cyA9ICI8VU5LTk9XTj4iOwogCX0KIAotCWRldl9pbmZvKCZoZGV2LT5kZXYsICIlczogJXMgSElEIHYleC4lMDJ4ICVzIFslc10gb24gJXNcbiIsCi0JCQlidWYsIGJ1cywgaGRldi0+dmVyc2lvbiA+PiA4LCBoZGV2LT52ZXJzaW9uICYgMHhmZiwKLQkJCXR5cGUsIGhkZXYtPm5hbWUsIGhkZXYtPnBoeXMpOworCWhpZF9pbmZvKGhkZXYsICIlczogJXMgSElEIHYleC4lMDJ4ICVzIFslc10gb24gJXNcbiIsCisJCSBidWYsIGJ1cywgaGRldi0+dmVyc2lvbiA+PiA4LCBoZGV2LT52ZXJzaW9uICYgMHhmZiwKKwkJIHR5cGUsIGhkZXYtPm5hbWUsIGhkZXYtPnBoeXMpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMjMwLDcgKzEyNTAsNyBAQAogRVhQT1JUX1NZTUJPTF9HUEwoaGlkX2Rpc2Nvbm5lY3QpOwogCiAvKiBhIGxpc3Qgb2YgZGV2aWNlcyBmb3Igd2hpY2ggdGhlcmUgaXMgYSBzcGVjaWFsaXplZCBkcml2ZXIgb24gSElEIGJ1cyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkIGhpZF9ibGFja2xpc3RbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCBoaWRfaGF2ZV9zcGVjaWFsX2RyaXZlcltdID0gewogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF8zTSwgVVNCX0RFVklDRV9JRF8zTTE5NjgpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEXzNNLCBVU0JfREVWSUNFX0lEXzNNMjI1NikgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQTRURUNILCBVU0JfREVWSUNFX0lEX0E0VEVDSF9XQ1AzMlBVKSB9LApAQCAtMTI3Niw2ICsxMjk2LDEyIEBACiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkczX0FOU0kpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkczX0lTTykgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzNfSklTKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNF9BTlNJKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNF9JU08pIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0X0pJUykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRBX0FOU0kpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0QV9JU08pIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0QV9KSVMpIH0sCiAJeyBISURfQkxVRVRPT1RIX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9XSVJFTEVTU18yMDA5X0FOU0kpIH0sCiAJeyBISURfQkxVRVRPT1RIX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9XSVJFTEVTU18yMDA5X0lTTykgfSwKIAl7IEhJRF9CTFVFVE9PVEhfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX1dJUkVMRVNTXzIwMDlfSklTKSB9LApAQCAtMTI5Miw2ICsxMzE4LDcgQEAKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQ0hFUlJZLCBVU0JfREVWSUNFX0lEX0NIRVJSWV9DWU1PVElPTikgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQ0hFUlJZLCBVU0JfREVWSUNFX0lEX0NIRVJSWV9DWU1PVElPTl9TT0xBUikgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQ0hJQ09OWSwgVVNCX0RFVklDRV9JRF9DSElDT05ZX1RBQ1RJQ0FMX1BBRCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQ0hJQ09OWSwgVVNCX0RFVklDRV9JRF9DSElDT05ZX1dJUkVMRVNTKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DUkVBVElWRUxBQlMsIFVTQl9ERVZJQ0VfSURfUFJPRElLRVlTX1BDTUlESSkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQ1lQUkVTUywgVVNCX0RFVklDRV9JRF9DWVBSRVNTX0JBUkNPREVfMSkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQ1lQUkVTUywgVVNCX0RFVklDRV9JRF9DWVBSRVNTX0JBUkNPREVfMikgfSwKQEAgLTEzMDQsNiArMTMzMSw3IEBACiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0RXQVYsIFVTQl9ERVZJQ0VfSURfRFdBVl9FR0FMQVhfTVVMVElUT1VDSDMpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0RXQVYsIFVTQl9ERVZJQ0VfSURfRFdBVl9FR0FMQVhfTVVMVElUT1VDSDQpIH0sCiAJeyBISURfQkxVRVRPT1RIX0RFVklDRShVU0JfVkVORE9SX0lEX0VMRUNPTSwgVVNCX0RFVklDRV9JRF9FTEVDT01fQk0wODQpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0VNUywgVVNCX0RFVklDRV9JRF9FTVNfVFJJT19MSU5LRVJfUExVU19JSSkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfRVpLRVksIFVTQl9ERVZJQ0VfSURfQlRDXzgxOTMpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dBTUVST04sIFVTQl9ERVZJQ0VfSURfR0FNRVJPTl9EVUFMX1BTWF9BREFQVE9SKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HQU1FUk9OLCBVU0JfREVWSUNFX0lEX0dBTUVST05fRFVBTF9QQ1NfQURBUFRPUikgfSwKQEAgLTEzNzIsNiArMTQwMCw3IEBACiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1FVQU5UQSwgVVNCX0RFVklDRV9JRF9RVUFOVEFfT1BUSUNBTF9UT1VDSCkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfUVVBTlRBLCBVU0JfREVWSUNFX0lEX1BJWEFSVF9JTUFHSU5HX0lOQ19PUFRJQ0FMX1RPVUNIX1NDUkVFTikgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfUk9DQ0FULCBVU0JfREVWSUNFX0lEX1JPQ0NBVF9LT05FKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9ST0NDQVQsIFVTQl9ERVZJQ0VfSURfUk9DQ0FUX0tPTkVQTFVTKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9ST0NDQVQsIFVTQl9ERVZJQ0VfSURfUk9DQ0FUX1BZUkFfV0lSRUQpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1NBTVNVTkcsIFVTQl9ERVZJQ0VfSURfU0FNU1VOR19JUl9SRU1PVEUpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1NBTVNVTkcsIFVTQl9ERVZJQ0VfSURfU0FNU1VOR19XSVJFTEVTU19LQkRfTU9VU0UpIH0sCkBAIC0xNDk5LDkgKzE1MjgsOSBAQAogCWlmICghaGlkX21hdGNoX2RldmljZShoZGV2LCBoZHJ2KSkKIAkJcmV0dXJuIDA7CiAKLQkvKiBnZW5lcmljIHdhbnRzIGFsbCBub24tYmxhY2tsaXN0ZWQgKi8KKwkvKiBnZW5lcmljIHdhbnRzIGFsbCB0aGF0IGRvbid0IGhhdmUgc3BlY2lhbGl6ZWQgZHJpdmVyICovCiAJaWYgKCFzdHJuY21wKGhkcnYtPm5hbWUsICJnZW5lcmljLSIsIDgpKQotCQlyZXR1cm4gIWhpZF9tYXRjaF9pZChoZGV2LCBoaWRfYmxhY2tsaXN0KTsKKwkJcmV0dXJuICFoaWRfbWF0Y2hfaWQoaGRldiwgaGlkX2hhdmVfc3BlY2lhbF9kcml2ZXIpOwogCiAJcmV0dXJuIDE7CiB9CkBAIC0xNzYxLDYgKzE3OTAsMTIgQEAKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzNfQU5TSSkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzNfSVNPKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HM19KSVMpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0X0FOU0kpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0X0lTTykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRfSklTKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNEFfQU5TSSkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRBX0lTTykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRBX0pJUykgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfRk9VTlRBSU5fVFBfT05MWSkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSMV9UUF9PTkxZKSB9LAogCXsgfQpAQCAtMTk1MiwxMiArMTk4NywxMiBAQAogCWludCByZXQ7CiAKIAlpZiAoaGlkX2RlYnVnKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJISUQ6IGhpZF9kZWJ1ZyBpcyBub3cgdXNlZCBzb2xlbHkgZm9yIHBhcnNlciBhbmQgZHJpdmVyIGRlYnVnZ2luZy5cbiIKLQkJCQkiSElEOiBkZWJ1Z2ZzIGlzIG5vdyB1c2VkIGZvciBpbnNwZWN0aW5nIHRoZSBkZXZpY2UgKHJlcG9ydCBkZXNjcmlwdG9yLCByZXBvcnRzKVxuIik7CisJCXByX3dhcm4oImhpZF9kZWJ1ZyBpcyBub3cgdXNlZCBzb2xlbHkgZm9yIHBhcnNlciBhbmQgZHJpdmVyIGRlYnVnZ2luZy5cbiIKKwkJCSJkZWJ1Z2ZzIGlzIG5vdyB1c2VkIGZvciBpbnNwZWN0aW5nIHRoZSBkZXZpY2UgKHJlcG9ydCBkZXNjcmlwdG9yLCByZXBvcnRzKVxuIik7CiAKIAlyZXQgPSBidXNfcmVnaXN0ZXIoJmhpZF9idXNfdHlwZSk7CiAJaWYgKHJldCkgewotCQlwcmludGsoS0VSTl9FUlIgIkhJRDogY2FuJ3QgcmVnaXN0ZXIgaGlkIGJ1c1xuIik7CisJCXByX2VycigiY2FuJ3QgcmVnaXN0ZXIgaGlkIGJ1c1xuIik7CiAJCWdvdG8gZXJyOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWN5cHJlc3MuYyBiL2RyaXZlcnMvaGlkL2hpZC1jeXByZXNzLmMKaW5kZXggNGNkMGUyMy4uMmYwYmU0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWN5cHJlc3MuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtY3lwcmVzcy5jCkBAIC0xMDcsMTMgKzEwNywxMyBAQAogCiAJcmV0ID0gaGlkX3BhcnNlKGhkZXYpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKIAlyZXQgPSBoaWRfaHdfc3RhcnQoaGRldiwgSElEX0NPTk5FQ1RfREVGQVVMVCk7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOwogCQlnb3RvIGVycl9mcmVlOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWRlYnVnLmMgYi9kcml2ZXJzL2hpZC9oaWQtZGVidWcuYwppbmRleCA3NWM1ZTIzLi41NTUzODJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtZGVidWcuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtZGVidWcuYwpAQCAtMjYsNiArMjYsOCBAQAogICogVm9qdGVjaCBQYXZsaWssIFNpbXVua292YSAxNTk0LCBQcmFndWUgOCwgMTgyIDAwIEN6ZWNoIFJlcHVibGljCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KQEAgLTM5Myw3ICszOTUsNyBAQAogCiAJYnVmID0gcmVzb2x2X3VzYWdlX3BhZ2UodXNhZ2UgPj4gMTYsIGYpOwogCWlmIChJU19FUlIoYnVmKSkgewotCQlwcmludGsoS0VSTl9FUlIgImVycm9yIGFsbG9jYXRpbmcgSElEIGRlYnVnIGJ1ZmZlclxuIik7CisJCXByX2VycigiZXJyb3IgYWxsb2NhdGluZyBISUQgZGVidWcgYnVmZmVyXG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtZHJmZi5jIGIvZHJpdmVycy9oaWQvaGlkLWRyZmYuYwppbmRleCA5NjhiMDRmLi5hZmNmM2Q2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtZHJmZi5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1kcmZmLmMKQEAgLTk2LDE4ICs5NiwxOCBAQAogCWludCBlcnJvcjsKIAogCWlmIChsaXN0X2VtcHR5KHJlcG9ydF9saXN0KSkgewotCQlkZXZfZXJyKCZoaWQtPmRldiwgIm5vIG91dHB1dCByZXBvcnRzIGZvdW5kXG4iKTsKKwkJaGlkX2VycihoaWQsICJubyBvdXRwdXQgcmVwb3J0cyBmb3VuZFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCXJlcG9ydCA9IGxpc3RfZmlyc3RfZW50cnkocmVwb3J0X2xpc3QsIHN0cnVjdCBoaWRfcmVwb3J0LCBsaXN0KTsKIAlpZiAocmVwb3J0LT5tYXhmaWVsZCA8IDEpIHsKLQkJZGV2X2VycigmaGlkLT5kZXYsICJubyBmaWVsZHMgaW4gdGhlIHJlcG9ydFxuIik7CisJCWhpZF9lcnIoaGlkLCAibm8gZmllbGRzIGluIHRoZSByZXBvcnRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAlpZiAocmVwb3J0LT5maWVsZFswXS0+cmVwb3J0X2NvdW50IDwgNykgewotCQlkZXZfZXJyKCZoaWQtPmRldiwgIm5vdCBlbm91Z2ggdmFsdWVzIGluIHRoZSBmaWVsZFxuIik7CisJCWhpZF9lcnIoaGlkLCAibm90IGVub3VnaCB2YWx1ZXMgaW4gdGhlIGZpZWxkXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0xMzMsOCArMTMzLDggQEAKIAlkcmZmLT5yZXBvcnQtPmZpZWxkWzBdLT52YWx1ZVs2XSA9IDB4MDA7CiAJdXNiaGlkX3N1Ym1pdF9yZXBvcnQoaGlkLCBkcmZmLT5yZXBvcnQsIFVTQl9ESVJfT1VUKTsKIAotCWRldl9pbmZvKCZoaWQtPmRldiwgIkZvcmNlIEZlZWRiYWNrIGZvciBEcmFnb25SaXNlIEluYy4gZ2FtZSAiCi0JICAgICAgICJjb250cm9sbGVycyBieSBSaWNoYXJkIFdhbG1zbGV5IDxyaWNod2FsbUBnbWFpbC5jb20+XG4iKTsKKwloaWRfaW5mbyhoaWQsICJGb3JjZSBGZWVkYmFjayBmb3IgRHJhZ29uUmlzZSBJbmMuICIKKwkJICJnYW1lIGNvbnRyb2xsZXJzIGJ5IFJpY2hhcmQgV2FsbXNsZXkgPHJpY2h3YWxtQGdtYWlsLmNvbT5cbiIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNTMsMTMgKzE1MywxMyBAQAogCiAJcmV0ID0gaGlkX3BhcnNlKGhkZXYpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKIAkJZ290byBlcnI7CiAJfQogCiAJcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIEhJRF9DT05ORUNUX0RFRkFVTFQgJiB+SElEX0NPTk5FQ1RfRkYpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKIAkJZ290byBlcnI7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtZWdhbGF4LmMgYi9kcml2ZXJzL2hpZC9oaWQtZWdhbGF4LmMKaW5kZXggOGZiZmYyMy4uMDNiZWUxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWVnYWxheC5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1lZ2FsYXguYwpAQCAtMjAwLDcgKzIwMCw3IEBACiAKIAl0ZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBlZ2FsYXhfZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghdGQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiY2Fubm90IGFsbG9jYXRlIGVHYWxheCBkYXRhXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiY2Fubm90IGFsbG9jYXRlIGVHYWxheCBkYXRhXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCWhpZF9zZXRfZHJ2ZGF0YShoZGV2LCB0ZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtZWxlY29tLmMgYi9kcml2ZXJzL2hpZC9oaWQtZWxlY29tLmMKaW5kZXggNmUzMWYzMC4uNzlkMGM2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWVsZWNvbS5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1lbGVjb20uYwpAQCAtMjQsOCArMjQsNyBAQAogCQl1bnNpZ25lZCBpbnQgKnJzaXplKQogewogCWlmICgqcnNpemUgPj0gNDggJiYgcmRlc2NbNDZdID09IDB4MDUgJiYgcmRlc2NbNDddID09IDB4MGMpIHsKLQkJZGV2X2luZm8oJmhkZXYtPmRldiwgIkZpeGluZyB1cCBFbGVjb20gQk0wODQgIgotCQkJCSJyZXBvcnQgZGVzY3JpcHRvci5cbiIpOworCQloaWRfaW5mbyhoZGV2LCAiRml4aW5nIHVwIEVsZWNvbSBCTTA4NCByZXBvcnQgZGVzY3JpcHRvclxuIik7CiAJCXJkZXNjWzQ3XSA9IDB4MDA7CiAJfQogICAgIHJldHVybiByZGVzYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1lbXNmZi5jIGIvZHJpdmVycy9oaWQvaGlkLWVtc2ZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE4NzdjNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1lbXNmZi5jCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogIEZvcmNlIGZlZWRiYWNrIHN1cHBvcnQgZm9yIEVNUyBUcmlvIExpbmtlciBQbHVzIElJCisgKgorICogIENvcHlyaWdodCAoYykgMjAxMCBJZ25heiBGb3JzdGVyIDxpZ25hei5mb3JzdGVyQGdteC5kZT4KKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9oaWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisjaW5jbHVkZSAiaGlkLWlkcy5oIgorI2luY2x1ZGUgInVzYmhpZC91c2JoaWQuaCIKKworc3RydWN0IGVtc2ZmX2RldmljZSB7CisJc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydDsKK307CisKK3N0YXRpYyBpbnQgZW1zZmZfcGxheShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIHZvaWQgKmRhdGEsCisJCQkgc3RydWN0IGZmX2VmZmVjdCAqZWZmZWN0KQoreworCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBlbXNmZl9kZXZpY2UgKmVtc2ZmID0gZGF0YTsKKwlpbnQgd2Vhaywgc3Ryb25nOworCisJd2VhayA9IGVmZmVjdC0+dS5ydW1ibGUud2Vha19tYWduaXR1ZGU7CisJc3Ryb25nID0gZWZmZWN0LT51LnJ1bWJsZS5zdHJvbmdfbWFnbml0dWRlOworCisJZGJnX2hpZCgiY2FsbGVkIHdpdGggMHglMDR4IDB4JTA0eFxuIiwgc3Ryb25nLCB3ZWFrKTsKKworCXdlYWsgPSB3ZWFrICogMHhmZiAvIDB4ZmZmZjsKKwlzdHJvbmcgPSBzdHJvbmcgKiAweGZmIC8gMHhmZmZmOworCisJZW1zZmYtPnJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzFdID0gd2VhazsKKwllbXNmZi0+cmVwb3J0LT5maWVsZFswXS0+dmFsdWVbMl0gPSBzdHJvbmc7CisKKwlkYmdfaGlkKCJydW5uaW5nIHdpdGggMHglMDJ4IDB4JTAyeFxuIiwgc3Ryb25nLCB3ZWFrKTsKKwl1c2JoaWRfc3VibWl0X3JlcG9ydChoaWQsIGVtc2ZmLT5yZXBvcnQsIFVTQl9ESVJfT1VUKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVtc2ZmX2luaXQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkKK3sKKwlzdHJ1Y3QgZW1zZmZfZGV2aWNlICplbXNmZjsKKwlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0OworCXN0cnVjdCBoaWRfaW5wdXQgKmhpZGlucHV0ID0gbGlzdF9maXJzdF9lbnRyeSgmaGlkLT5pbnB1dHMsCisJCQkJCQlzdHJ1Y3QgaGlkX2lucHV0LCBsaXN0KTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpyZXBvcnRfbGlzdCA9CisJCQkmaGlkLT5yZXBvcnRfZW51bVtISURfT1VUUFVUX1JFUE9SVF0ucmVwb3J0X2xpc3Q7CisJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gaGlkaW5wdXQtPmlucHV0OworCWludCBlcnJvcjsKKworCWlmIChsaXN0X2VtcHR5KHJlcG9ydF9saXN0KSkgeworCQloaWRfZXJyKGhpZCwgIm5vIG91dHB1dCByZXBvcnRzIGZvdW5kXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmVwb3J0ID0gbGlzdF9maXJzdF9lbnRyeShyZXBvcnRfbGlzdCwgc3RydWN0IGhpZF9yZXBvcnQsIGxpc3QpOworCWlmIChyZXBvcnQtPm1heGZpZWxkIDwgMSkgeworCQloaWRfZXJyKGhpZCwgIm5vIGZpZWxkcyBpbiB0aGUgcmVwb3J0XG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKHJlcG9ydC0+ZmllbGRbMF0tPnJlcG9ydF9jb3VudCA8IDcpIHsKKwkJaGlkX2VycihoaWQsICJub3QgZW5vdWdoIHZhbHVlcyBpbiB0aGUgZmllbGRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwllbXNmZiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBlbXNmZl9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVtc2ZmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNldF9iaXQoRkZfUlVNQkxFLCBkZXYtPmZmYml0KTsKKworCWVycm9yID0gaW5wdXRfZmZfY3JlYXRlX21lbWxlc3MoZGV2LCBlbXNmZiwgZW1zZmZfcGxheSk7CisJaWYgKGVycm9yKSB7CisJCWtmcmVlKGVtc2ZmKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCWVtc2ZmLT5yZXBvcnQgPSByZXBvcnQ7CisJZW1zZmYtPnJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzBdID0gMHgwMTsKKwllbXNmZi0+cmVwb3J0LT5maWVsZFswXS0+dmFsdWVbMV0gPSAweDAwOworCWVtc2ZmLT5yZXBvcnQtPmZpZWxkWzBdLT52YWx1ZVsyXSA9IDB4MDA7CisJZW1zZmYtPnJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzNdID0gMHgwMDsKKwllbXNmZi0+cmVwb3J0LT5maWVsZFswXS0+dmFsdWVbNF0gPSAweDAwOworCWVtc2ZmLT5yZXBvcnQtPmZpZWxkWzBdLT52YWx1ZVs1XSA9IDB4MDA7CisJZW1zZmYtPnJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzZdID0gMHgwMDsKKwl1c2JoaWRfc3VibWl0X3JlcG9ydChoaWQsIGVtc2ZmLT5yZXBvcnQsIFVTQl9ESVJfT1VUKTsKKworCWhpZF9pbmZvKGhpZCwgImZvcmNlIGZlZWRiYWNrIGZvciBFTVMgYmFzZWQgZGV2aWNlcyBieSBJZ25heiBGb3JzdGVyIDxpZ25hei5mb3JzdGVyQGdteC5kZT5cbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW1zX3Byb2JlKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCAqaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IGhpZF9wYXJzZShoZGV2KTsKKwlpZiAocmV0KSB7CisJCWhpZF9lcnIoaGRldiwgInBhcnNlIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyOworCX0KKworCXJldCA9IGhpZF9od19zdGFydChoZGV2LCBISURfQ09OTkVDVF9ERUZBVUxUICYgfkhJRF9DT05ORUNUX0ZGKTsKKwlpZiAocmV0KSB7CisJCWhpZF9lcnIoaGRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CisJCWdvdG8gZXJyOworCX0KKworCWVtc2ZmX2luaXQoaGRldik7CisKKwlyZXR1cm4gMDsKK2VycjoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgZW1zX2RldmljZXNbXSA9IHsKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfRU1TLCAweDExOCkgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGhpZCwgZW1zX2RldmljZXMpOworCitzdGF0aWMgc3RydWN0IGhpZF9kcml2ZXIgZW1zX2RyaXZlciA9IHsKKwkubmFtZSA9ICJoa2VtcyIsCisJLmlkX3RhYmxlID0gZW1zX2RldmljZXMsCisJLnByb2JlID0gZW1zX3Byb2JlLAorfTsKKworc3RhdGljIGludCBlbXNfaW5pdCh2b2lkKQoreworCXJldHVybiBoaWRfcmVnaXN0ZXJfZHJpdmVyKCZlbXNfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgZW1zX2V4aXQodm9pZCkKK3sKKwloaWRfdW5yZWdpc3Rlcl9kcml2ZXIoJmVtc19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChlbXNfaW5pdCk7Cittb2R1bGVfZXhpdChlbXNfZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1nYWZmLmMgYi9kcml2ZXJzL2hpZC9oaWQtZ2FmZi5jCmluZGV4IDg4ZGZjZjQuLjI3OWJhNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1nYWZmLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWdhZmYuYwpAQCAtODcsNyArODcsNyBAQAogCWludCBlcnJvcjsKIAogCWlmIChsaXN0X2VtcHR5KHJlcG9ydF9saXN0KSkgewotCQlkZXZfZXJyKCZoaWQtPmRldiwgIm5vIG91dHB1dCByZXBvcnRzIGZvdW5kXG4iKTsKKwkJaGlkX2VycihoaWQsICJubyBvdXRwdXQgcmVwb3J0cyBmb3VuZFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtOTUsMTIgKzk1LDEyIEBACiAKIAlyZXBvcnQgPSBsaXN0X2VudHJ5KHJlcG9ydF9wdHIsIHN0cnVjdCBoaWRfcmVwb3J0LCBsaXN0KTsKIAlpZiAocmVwb3J0LT5tYXhmaWVsZCA8IDEpIHsKLQkJZGV2X2VycigmaGlkLT5kZXYsICJubyBmaWVsZHMgaW4gdGhlIHJlcG9ydFxuIik7CisJCWhpZF9lcnIoaGlkLCAibm8gZmllbGRzIGluIHRoZSByZXBvcnRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAlpZiAocmVwb3J0LT5maWVsZFswXS0+cmVwb3J0X2NvdW50IDwgNikgewotCQlkZXZfZXJyKCZoaWQtPmRldiwgIm5vdCBlbm91Z2ggdmFsdWVzIGluIHRoZSBmaWVsZFxuIik7CisJCWhpZF9lcnIoaGlkLCAibm90IGVub3VnaCB2YWx1ZXMgaW4gdGhlIGZpZWxkXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0xMjgsOCArMTI4LDcgQEAKIAogCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgZ2FmZi0+cmVwb3J0LCBVU0JfRElSX09VVCk7CiAKLQlkZXZfaW5mbygmaGlkLT5kZXYsICJGb3JjZSBGZWVkYmFjayBmb3IgR3JlZW5Bc2lhIDB4MTIiCi0JICAgICAgICIgZGV2aWNlcyBieSBMdWthc3ogTHVib2phbnNraSA8bHVrYXN6QGx1Ym9qYW5za2kuaW5mbz5cbiIpOworCWhpZF9pbmZvKGhpZCwgIkZvcmNlIEZlZWRiYWNrIGZvciBHcmVlbkFzaWEgMHgxMiBkZXZpY2VzIGJ5IEx1a2FzeiBMdWJvamFuc2tpIDxsdWthc3pAbHVib2phbnNraS5pbmZvPlxuIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE0OCwxMyArMTQ3LDEzIEBACiAKIAlyZXQgPSBoaWRfcGFyc2UoaGRldik7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJwYXJzZSBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJwYXJzZSBmYWlsZWRcbiIpOwogCQlnb3RvIGVycjsKIAl9CiAKIAlyZXQgPSBoaWRfaHdfc3RhcnQoaGRldiwgSElEX0NPTk5FQ1RfREVGQVVMVCAmIH5ISURfQ09OTkVDVF9GRik7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOwogCQlnb3RvIGVycjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1pZHMuaCBiL2RyaXZlcnMvaGlkL2hpZC1pZHMuaAppbmRleCA4ZTExYWY4Li5mNjVjYWNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtaWRzLmgKKysrIGIvZHJpdmVycy9oaWQvaGlkLWlkcy5oCkBAIC05Nyw2ICs5NywxMiBAQAogI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkczX0FOU0kJMHgwMjM2CiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzNfSVNPCTB4MDIzNwogI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkczX0pJUwkweDAyMzgKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNF9BTlNJCTB4MDIzZgorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0X0lTTwkweDAyNDAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNF9KSVMJMHgwMjQxCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRBX0FOU0kJMHgwMjQyCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRBX0lTTwkweDAyNDMKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNEFfSklTCTB4MDI0NAogI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9XSVJFTEVTU18yMDA5X0FOU0kgIDB4MDIzOQogI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9XSVJFTEVTU18yMDA5X0lTTyAgIDB4MDIzYQogI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9XSVJFTEVTU18yMDA5X0pJUyAgIDB4MDIzYgpAQCAtMTU2LDYgKzE2Miw3IEBACiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfQ0hJQ09OWQkJMHgwNGYyCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ0hJQ09OWV9UQUNUSUNBTF9QQUQJMHgwNDE4CiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ0hJQ09OWV9NVUxUSV9UT1VDSAkweGIxOWQKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9DSElDT05ZX1dJUkVMRVNTCTB4MDYxOAogCiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfQ0lEQwkJMHgxNjc3CiAKQEAgLTIwOCw2ICsyMTUsOSBAQAogI2RlZmluZSBVU0JfVkVORE9SX0lEX0VMTwkJMHgwNEU3CiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfRUxPX1RTMjcwMAkweDAwMjAKIAorI2RlZmluZSBVU0JfVkVORE9SX0lEX0VNUwkJMHgyMDA2CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfRU1TX1RSSU9fTElOS0VSX1BMVVNfSUkgMHgwMTE4CisKICNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9FU1NFTlRJQUxfUkVBTElUWQkweDBkN2YKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9FU1NFTlRJQUxfUkVBTElUWV9QNSAweDAxMDAKIApAQCAtNDgwLDYgKzQ5MCw3IEBACiAKICNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9ST0NDQVQJCTB4MWU3ZAogI2RlZmluZSBVU0JfREVWSUNFX0lEX1JPQ0NBVF9LT05FCTB4MmNlZAorI2RlZmluZSBVU0JfREVWSUNFX0lEX1JPQ0NBVF9LT05FUExVUwkweDJkNTEKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9ST0NDQVRfUFlSQV9XSVJFRAkweDJjMjQKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9ST0NDQVRfUFlSQV9XSVJFTEVTUwkweDJjZjYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWlucHV0LmMgYi9kcml2ZXJzL2hpZC9oaWQtaW5wdXQuYwppbmRleCBkOGQzNzJiLi5lNjBmZGI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtaW5wdXQuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtaW5wdXQuYwpAQCAtMzE5LDIxICszMTksMjEgQEAKIAogCQlzd2l0Y2ggKGZpZWxkLT5hcHBsaWNhdGlvbikgewogCQljYXNlIEhJRF9HRF9NT1VTRToKLQkJY2FzZSBISURfR0RfUE9JTlRFUjogIGNvZGUgKz0gMHgxMTA7IGJyZWFrOworCQljYXNlIEhJRF9HRF9QT0lOVEVSOiAgY29kZSArPSBCVE5fTU9VU0U7IGJyZWFrOwogCQljYXNlIEhJRF9HRF9KT1lTVElDSzoKIAkJCQlpZiAoY29kZSA8PSAweGYpCiAJCQkJCWNvZGUgKz0gQlROX0pPWVNUSUNLOwogCQkJCWVsc2UKIAkJCQkJY29kZSArPSBCVE5fVFJJR0dFUl9IQVBQWTsKIAkJCQlicmVhazsKLQkJY2FzZSBISURfR0RfR0FNRVBBRDogIGNvZGUgKz0gMHgxMzA7IGJyZWFrOworCQljYXNlIEhJRF9HRF9HQU1FUEFEOiAgY29kZSArPSBCVE5fR0FNRVBBRDsgYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlzd2l0Y2ggKGZpZWxkLT5waHlzaWNhbCkgewogCQkJY2FzZSBISURfR0RfTU9VU0U6Ci0JCQljYXNlIEhJRF9HRF9QT0lOVEVSOiAgY29kZSArPSAweDExMDsgYnJlYWs7Ci0JCQljYXNlIEhJRF9HRF9KT1lTVElDSzogY29kZSArPSAweDEyMDsgYnJlYWs7Ci0JCQljYXNlIEhJRF9HRF9HQU1FUEFEOiAgY29kZSArPSAweDEzMDsgYnJlYWs7Ci0JCQlkZWZhdWx0OiAgICAgICAgICAgICAgY29kZSArPSAweDEwMDsKKwkJCWNhc2UgSElEX0dEX1BPSU5URVI6ICBjb2RlICs9IEJUTl9NT1VTRTsgYnJlYWs7CisJCQljYXNlIEhJRF9HRF9KT1lTVElDSzogY29kZSArPSBCVE5fSk9ZU1RJQ0s7IGJyZWFrOworCQkJY2FzZSBISURfR0RfR0FNRVBBRDogIGNvZGUgKz0gQlROX0dBTUVQQUQ7IGJyZWFrOworCQkJZGVmYXVsdDogICAgICAgICAgICAgIGNvZGUgKz0gQlROX01JU0M7CiAJCQl9CiAJCX0KIApAQCAtODE3LDE0ICs4MTcsMTQgQEAKIHsKIAlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKIAotCXJldHVybiBoaWQtPmxsX2RyaXZlci0+b3BlbihoaWQpOworCXJldHVybiBoaWRfaHdfb3BlbihoaWQpOwogfQogCiBzdGF0aWMgdm9pZCBoaWRpbnB1dF9jbG9zZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCiB7CiAJc3RydWN0IGhpZF9kZXZpY2UgKmhpZCA9IGlucHV0X2dldF9kcnZkYXRhKGRldik7CiAKLQloaWQtPmxsX2RyaXZlci0+Y2xvc2UoaGlkKTsKKwloaWRfaHdfY2xvc2UoaGlkKTsKIH0KIAogLyoKQEAgLTg3MSw3ICs4NzEsNyBAQAogCQkJCWlmICghaGlkaW5wdXQgfHwgIWlucHV0X2RldikgewogCQkJCQlrZnJlZShoaWRpbnB1dCk7CiAJCQkJCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7Ci0JCQkJCWVycl9oaWQoIk91dCBvZiBtZW1vcnkgZHVyaW5nIGhpZCBpbnB1dCBwcm9iZSIpOworCQkJCQloaWRfZXJyKGhpZCwgIk91dCBvZiBtZW1vcnkgZHVyaW5nIGhpZCBpbnB1dCBwcm9iZVxuIik7CiAJCQkJCWdvdG8gb3V0X3Vud2luZDsKIAkJCQl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1reWUuYyBiL2RyaXZlcnMvaGlkL2hpZC1reWUuYwppbmRleCA4MTcyNDdlLi5mMmJhOWVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQta3llLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWt5ZS5jCkBAIC0zMiw4ICszMiw4IEBACiAJCXJkZXNjWzY1XSA9PSAweDI5ICYmIHJkZXNjWzY2XSA9PSAweDBmICYmCiAJCXJkZXNjWzcxXSA9PSAweDc1ICYmIHJkZXNjWzcyXSA9PSAweDA4ICYmCiAJCXJkZXNjWzczXSA9PSAweDk1ICYmIHJkZXNjWzc0XSA9PSAweDAxKSB7Ci0JCWRldl9pbmZvKCZoZGV2LT5kZXYsICJmaXhpbmcgdXAgS3llL0dlbml1cyBFcmdvIE1vdXNlIHJlcG9ydCAiCi0JCQkJImRlc2NyaXB0b3JcbiIpOworCQloaWRfaW5mbyhoZGV2LAorCQkJICJmaXhpbmcgdXAgS3llL0dlbml1cyBFcmdvIE1vdXNlIHJlcG9ydCBkZXNjcmlwdG9yXG4iKTsKIAkJcmRlc2NbNjJdID0gMHgwOTsKIAkJcmRlc2NbNjRdID0gMHgwNDsKIAkJcmRlc2NbNjZdID0gMHgwNzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1sZy5jIGIvZHJpdmVycy9oaWQvaGlkLWxnLmMKaW5kZXggYjYyOWZiYS4uYWVmNDEwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWxnLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWxnLmMKQEAgLTUzLDIzICs1MywyMiBAQAogCiAJaWYgKChxdWlya3MgJiBMR19SREVTQykgJiYgKnJzaXplID49IDkwICYmIHJkZXNjWzgzXSA9PSAweDI2ICYmCiAJCQlyZGVzY1s4NF0gPT0gMHg4YyAmJiByZGVzY1s4NV0gPT0gMHgwMikgewotCQlkZXZfaW5mbygmaGRldi0+ZGV2LCAiZml4aW5nIHVwIExvZ2l0ZWNoIGtleWJvYXJkIHJlcG9ydCAiCi0JCQkJImRlc2NyaXB0b3JcbiIpOworCQloaWRfaW5mbyhoZGV2LAorCQkJICJmaXhpbmcgdXAgTG9naXRlY2gga2V5Ym9hcmQgcmVwb3J0IGRlc2NyaXB0b3JcbiIpOwogCQlyZGVzY1s4NF0gPSByZGVzY1s4OV0gPSAweDRkOwogCQlyZGVzY1s4NV0gPSByZGVzY1s5MF0gPSAweDEwOwogCX0KIAlpZiAoKHF1aXJrcyAmIExHX1JERVNDX1JFTF9BQlMpICYmICpyc2l6ZSA+PSA1MCAmJgogCQkJcmRlc2NbMzJdID09IDB4ODEgJiYgcmRlc2NbMzNdID09IDB4MDYgJiYKIAkJCXJkZXNjWzQ5XSA9PSAweDgxICYmIHJkZXNjWzUwXSA9PSAweDA2KSB7Ci0JCWRldl9pbmZvKCZoZGV2LT5kZXYsICJmaXhpbmcgdXAgcmVsL2FicyBpbiBMb2dpdGVjaCAiCi0JCQkJInJlcG9ydCBkZXNjcmlwdG9yXG4iKTsKKwkJaGlkX2luZm8oaGRldiwKKwkJCSAiZml4aW5nIHVwIHJlbC9hYnMgaW4gTG9naXRlY2ggcmVwb3J0IGRlc2NyaXB0b3JcbiIpOwogCQlyZGVzY1szM10gPSByZGVzY1s1MF0gPSAweDAyOwogCX0KIAlpZiAoKHF1aXJrcyAmIExHX0ZGNCkgJiYgKnJzaXplID49IDEwMSAmJgogCQkJcmRlc2NbNDFdID09IDB4OTUgJiYgcmRlc2NbNDJdID09IDB4MEIgJiYKIAkJCXJkZXNjWzQ3XSA9PSAweDA1ICYmIHJkZXNjWzQ4XSA9PSAweDA5KSB7Ci0JCWRldl9pbmZvKCZoZGV2LT5kZXYsICJmaXhpbmcgdXAgTG9naXRlY2ggU3BlZWQgRm9yY2UgV2lyZWxlc3MgIgotCQkJImJ1dHRvbiBkZXNjcmlwdG9yXG4iKTsKKwkJaGlkX2luZm8oaGRldiwgImZpeGluZyB1cCBMb2dpdGVjaCBTcGVlZCBGb3JjZSBXaXJlbGVzcyBidXR0b24gZGVzY3JpcHRvclxuIik7CiAJCXJkZXNjWzQxXSA9IDB4MDU7CiAJCXJkZXNjWzQyXSA9IDB4MDk7CiAJCXJkZXNjWzQ3XSA9IDB4OTU7CkBAIC0yODgsNyArMjg3LDcgQEAKIAogCXJldCA9IGhpZF9wYXJzZShoZGV2KTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgInBhcnNlIGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgInBhcnNlIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX2ZyZWU7CiAJfQogCkBAIC0yOTcsNyArMjk2LDcgQEAKIAogCXJldCA9IGhpZF9od19zdGFydChoZGV2LCBjb25uZWN0X21hc2spOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1sZzJmZi5jIGIvZHJpdmVycy9oaWQvaGlkLWxnMmZmLmMKaW5kZXggNDI1ODI1My4uM2MzMWJjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWxnMmZmLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWxnMmZmLmMKQEAgLTcyLDE4ICs3MiwxOCBAQAogCWludCBlcnJvcjsKIAogCWlmIChsaXN0X2VtcHR5KHJlcG9ydF9saXN0KSkgewotCQlkZXZfZXJyKCZoaWQtPmRldiwgIm5vIG91dHB1dCByZXBvcnQgZm91bmRcbiIpOworCQloaWRfZXJyKGhpZCwgIm5vIG91dHB1dCByZXBvcnQgZm91bmRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAlyZXBvcnQgPSBsaXN0X2VudHJ5KHJlcG9ydF9saXN0LT5uZXh0LCBzdHJ1Y3QgaGlkX3JlcG9ydCwgbGlzdCk7CiAKIAlpZiAocmVwb3J0LT5tYXhmaWVsZCA8IDEpIHsKLQkJZGV2X2VycigmaGlkLT5kZXYsICJvdXRwdXQgcmVwb3J0IGlzIGVtcHR5XG4iKTsKKwkJaGlkX2VycihoaWQsICJvdXRwdXQgcmVwb3J0IGlzIGVtcHR5XG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCWlmIChyZXBvcnQtPmZpZWxkWzBdLT5yZXBvcnRfY291bnQgPCA3KSB7Ci0JCWRldl9lcnIoJmhpZC0+ZGV2LCAibm90IGVub3VnaCB2YWx1ZXMgaW4gdGhlIGZpZWxkXG4iKTsKKwkJaGlkX2VycihoaWQsICJub3QgZW5vdWdoIHZhbHVlcyBpbiB0aGUgZmllbGRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTExMCw4ICsxMTAsNyBAQAogCiAJdXNiaGlkX3N1Ym1pdF9yZXBvcnQoaGlkLCByZXBvcnQsIFVTQl9ESVJfT1VUKTsKIAotCWRldl9pbmZvKCZoaWQtPmRldiwgIkZvcmNlIGZlZWRiYWNrIGZvciBMb2dpdGVjaCBSdW1ibGVQYWQvUnVtYmxlcGFkIDIgYnkgIgotCSAgICAgICAiQW5zc2kgSGFubnVsYSA8YW5zc2kuaGFubnVsYUBnbWFpbC5jb20+XG4iKTsKKwloaWRfaW5mbyhoaWQsICJGb3JjZSBmZWVkYmFjayBmb3IgTG9naXRlY2ggUnVtYmxlUGFkL1J1bWJsZXBhZCAyIGJ5IEFuc3NpIEhhbm51bGEgPGFuc3NpLmhhbm51bGFAZ21haWwuY29tPlxuIik7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1sZzNmZi5jIGIvZHJpdmVycy9oaWQvaGlkLWxnM2ZmLmMKaW5kZXggNDAwMjgzMi4uZjk4NjQ0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWxnM2ZmLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWxnM2ZmLmMKQEAgLTE0MSwyMCArMTQxLDIwIEBACiAKIAkvKiBGaW5kIHRoZSByZXBvcnQgdG8gdXNlICovCiAJaWYgKGxpc3RfZW1wdHkocmVwb3J0X2xpc3QpKSB7Ci0JCWVycl9oaWQoIk5vIG91dHB1dCByZXBvcnQgZm91bmQiKTsKKwkJaGlkX2VycihoaWQsICJObyBvdXRwdXQgcmVwb3J0IGZvdW5kXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAogCS8qIENoZWNrIHRoYXQgdGhlIHJlcG9ydCBsb29rcyBvayAqLwogCXJlcG9ydCA9IGxpc3RfZW50cnkocmVwb3J0X2xpc3QtPm5leHQsIHN0cnVjdCBoaWRfcmVwb3J0LCBsaXN0KTsKIAlpZiAoIXJlcG9ydCkgewotCQllcnJfaGlkKCJOVUxMIG91dHB1dCByZXBvcnQiKTsKKwkJaGlkX2VycihoaWQsICJOVUxMIG91dHB1dCByZXBvcnRcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCiAJZmllbGQgPSByZXBvcnQtPmZpZWxkWzBdOwogCWlmICghZmllbGQpIHsKLQkJZXJyX2hpZCgiTlVMTCBmaWVsZCIpOworCQloaWRfZXJyKGhpZCwgIk5VTEwgZmllbGRcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC0xNjksOCArMTY5LDcgQEAKIAlpZiAodGVzdF9iaXQoRkZfQVVUT0NFTlRFUiwgZGV2LT5mZmJpdCkpCiAJCWRldi0+ZmYtPnNldF9hdXRvY2VudGVyID0gaGlkX2xnM2ZmX3NldF9hdXRvY2VudGVyOwogCi0JZGV2X2luZm8oJmhpZC0+ZGV2LCAiRm9yY2UgZmVlZGJhY2sgZm9yIExvZ2l0ZWNoIEZsaWdodCBTeXN0ZW0gRzk0MCBieSAiCi0JCQkiR2FyeSBTdGVpbiA8TG9yZENuaWRhcmlhbkBnbWFpbC5jb20+XG4iKTsKKwloaWRfaW5mbyhoaWQsICJGb3JjZSBmZWVkYmFjayBmb3IgTG9naXRlY2ggRmxpZ2h0IFN5c3RlbSBHOTQwIGJ5IEdhcnkgU3RlaW4gPExvcmRDbmlkYXJpYW5AZ21haWwuY29tPlxuIik7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1sZzRmZi5jIGIvZHJpdmVycy9oaWQvaGlkLWxnNGZmLmMKaW5kZXggN2VlZjVhMi4uZmE1NTBjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWxnNGZmLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWxnNGZmLmMKQEAgLTEwMSwyMCArMTAxLDIwIEBACiAKIAkvKiBGaW5kIHRoZSByZXBvcnQgdG8gdXNlICovCiAJaWYgKGxpc3RfZW1wdHkocmVwb3J0X2xpc3QpKSB7Ci0JCWVycl9oaWQoIk5vIG91dHB1dCByZXBvcnQgZm91bmQiKTsKKwkJaGlkX2VycihoaWQsICJObyBvdXRwdXQgcmVwb3J0IGZvdW5kXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAogCS8qIENoZWNrIHRoYXQgdGhlIHJlcG9ydCBsb29rcyBvayAqLwogCXJlcG9ydCA9IGxpc3RfZW50cnkocmVwb3J0X2xpc3QtPm5leHQsIHN0cnVjdCBoaWRfcmVwb3J0LCBsaXN0KTsKIAlpZiAoIXJlcG9ydCkgewotCQllcnJfaGlkKCJOVUxMIG91dHB1dCByZXBvcnQiKTsKKwkJaGlkX2VycihoaWQsICJOVUxMIG91dHB1dCByZXBvcnRcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCiAJZmllbGQgPSByZXBvcnQtPmZpZWxkWzBdOwogCWlmICghZmllbGQpIHsKLQkJZXJyX2hpZCgiTlVMTCBmaWVsZCIpOworCQloaWRfZXJyKGhpZCwgIk5VTEwgZmllbGRcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC0xMjksOCArMTI5LDcgQEAKIAlpZiAodGVzdF9iaXQoRkZfQVVUT0NFTlRFUiwgZGV2LT5mZmJpdCkpCiAJCWRldi0+ZmYtPnNldF9hdXRvY2VudGVyID0gaGlkX2xnNGZmX3NldF9hdXRvY2VudGVyOwogCi0JZGV2X2luZm8oJmhpZC0+ZGV2LCAiRm9yY2UgZmVlZGJhY2sgZm9yIExvZ2l0ZWNoIFNwZWVkIEZvcmNlIFdpcmVsZXNzIGJ5ICIKLQkJCSJTaW1vbiBXb29kIDxzaW1vbkBtdW5nZXdlbGwub3JnPlxuIik7CisJaGlkX2luZm8oaGlkLCAiRm9yY2UgZmVlZGJhY2sgZm9yIExvZ2l0ZWNoIFNwZWVkIEZvcmNlIFdpcmVsZXNzIGJ5IFNpbW9uIFdvb2QgPHNpbW9uQG11bmdld2VsbC5vcmc+XG4iKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWxnZmYuYyBiL2RyaXZlcnMvaGlkL2hpZC1sZ2ZmLmMKaW5kZXggNjExNDJiNy4uOTBkMGVmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWxnZmYuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtbGdmZi5jCkBAIC0yNyw2ICsyNyw4IEBACiAgKiBlLW1haWwgLSBtYWlsIHlvdXIgbWVzc2FnZSB0byA8am9oYW5uLmRlbmV1eEBpdC51dS5zZT4KICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgpAQCAtMTQ2LDcgKzE0OCw3IEBACiAKIAkvKiBGaW5kIHRoZSByZXBvcnQgdG8gdXNlICovCiAJaWYgKGxpc3RfZW1wdHkocmVwb3J0X2xpc3QpKSB7Ci0JCWVycl9oaWQoIk5vIG91dHB1dCByZXBvcnQgZm91bmQiKTsKKwkJaGlkX2VycihoaWQsICJObyBvdXRwdXQgcmVwb3J0IGZvdW5kXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtMTU0LDcgKzE1Niw3IEBACiAJcmVwb3J0ID0gbGlzdF9lbnRyeShyZXBvcnRfbGlzdC0+bmV4dCwgc3RydWN0IGhpZF9yZXBvcnQsIGxpc3QpOwogCWZpZWxkID0gcmVwb3J0LT5maWVsZFswXTsKIAlpZiAoIWZpZWxkKSB7Ci0JCWVycl9oaWQoIk5VTEwgZmllbGQiKTsKKwkJaGlkX2VycihoaWQsICJOVUxMIGZpZWxkXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtMTc2LDcgKzE3OCw3IEBACiAJaWYgKCB0ZXN0X2JpdChGRl9BVVRPQ0VOVEVSLCBkZXYtPmZmYml0KSApCiAJCWRldi0+ZmYtPnNldF9hdXRvY2VudGVyID0gaGlkX2xnZmZfc2V0X2F1dG9jZW50ZXI7CiAKLQlwcmludGsoS0VSTl9JTkZPICJGb3JjZSBmZWVkYmFjayBmb3IgTG9naXRlY2ggZm9yY2UgZmVlZGJhY2sgZGV2aWNlcyBieSBKb2hhbm4gRGVuZXV4IDxqb2hhbm4uZGVuZXV4QGl0LnV1LnNlPlxuIik7CisJcHJfaW5mbygiRm9yY2UgZmVlZGJhY2sgZm9yIExvZ2l0ZWNoIGZvcmNlIGZlZWRiYWNrIGRldmljZXMgYnkgSm9oYW5uIERlbmV1eCA8am9oYW5uLmRlbmV1eEBpdC51dS5zZT5cbiIpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtbWFnaWNtb3VzZS5jIGIvZHJpdmVycy9oaWQvaGlkLW1hZ2ljbW91c2UuYwppbmRleCBlNmRjMTUxLi42OThlNjQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtbWFnaWNtb3VzZS5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1tYWdpY21vdXNlLmMKQEAgLTEyLDYgKzEyLDggQEAKICAqIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtNDMzLDYgKzQzNSwxMSBAQAogCWlmICghbXNjLT5pbnB1dCkKIAkJbXNjLT5pbnB1dCA9IGhpLT5pbnB1dDsKIAorCS8qIE1hZ2ljIFRyYWNrcGFkIGRvZXMgbm90IGdpdmUgcmVsYXRpdmUgZGF0YSBhZnRlciBzd2l0Y2hpbmcgdG8gTVQgKi8KKwlpZiAoaGktPmlucHV0LT5pZC5wcm9kdWN0ID09IFVTQl9ERVZJQ0VfSURfQVBQTEVfTUFHSUNUUkFDS1BBRCAmJgorCSAgICBmaWVsZC0+ZmxhZ3MgJiBISURfTUFJTl9JVEVNX1JFTEFUSVZFKQorCQlyZXR1cm4gLTE7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDQ2LDcgKzQ1Myw3IEBACiAKIAltc2MgPSBremFsbG9jKHNpemVvZigqbXNjKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKG1zYyA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImNhbid0IGFsbG9jIG1hZ2ljbW91c2UgZGVzY3JpcHRvclxuIik7CisJCWhpZF9lcnIoaGRldiwgImNhbid0IGFsbG9jIG1hZ2ljbW91c2UgZGVzY3JpcHRvclxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtNDU5LDEzICs0NjYsMTMgQEAKIAogCXJldCA9IGhpZF9wYXJzZShoZGV2KTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgIm1hZ2ljbW91c2UgaGlkIHBhcnNlIGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgIm1hZ2ljbW91c2UgaGlkIHBhcnNlIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX2ZyZWU7CiAJfQogCiAJcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIEhJRF9DT05ORUNUX0RFRkFVTFQpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAibWFnaWNtb3VzZSBodyBzdGFydCBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJtYWdpY21vdXNlIGh3IHN0YXJ0IGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX2ZyZWU7CiAJfQogCkBAIC00ODYsNyArNDkzLDcgQEAKIAl9CiAKIAlpZiAoIXJlcG9ydCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJ1bmFibGUgdG8gcmVnaXN0ZXIgdG91Y2ggcmVwb3J0XG4iKTsKKwkJaGlkX2VycihoZGV2LCAidW5hYmxlIHRvIHJlZ2lzdGVyIHRvdWNoIHJlcG9ydFxuIik7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX3N0b3BfaHc7CiAJfQpAQCAtNDk1LDggKzUwMiw3IEBACiAJcmV0ID0gaGRldi0+aGlkX291dHB1dF9yYXdfcmVwb3J0KGhkZXYsIGZlYXR1cmUsIHNpemVvZihmZWF0dXJlKSwKIAkJCUhJRF9GRUFUVVJFX1JFUE9SVCk7CiAJaWYgKHJldCAhPSBzaXplb2YoZmVhdHVyZSkpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAidW5hYmxlIHRvIHJlcXVlc3QgdG91Y2ggZGF0YSAoJWQpXG4iLAotCQkJCXJldCk7CisJCWhpZF9lcnIoaGRldiwgInVuYWJsZSB0byByZXF1ZXN0IHRvdWNoIGRhdGEgKCVkKVxuIiwgcmV0KTsKIAkJZ290byBlcnJfc3RvcF9odzsKIAl9CiAKQEAgLTU0MCw3ICs1NDYsNyBAQAogCiAJcmV0ID0gaGlkX3JlZ2lzdGVyX2RyaXZlcigmbWFnaWNtb3VzZV9kcml2ZXIpOwogCWlmIChyZXQpCi0JCXByaW50ayhLRVJOX0VSUiAiY2FuJ3QgcmVnaXN0ZXIgbWFnaWNtb3VzZSBkcml2ZXJcbiIpOworCQlwcl9lcnIoImNhbid0IHJlZ2lzdGVyIG1hZ2ljbW91c2UgZHJpdmVyXG4iKTsKIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtbWljcm9zb2Z0LmMgYi9kcml2ZXJzL2hpZC9oaWQtbWljcm9zb2Z0LmMKaW5kZXggZGM2MThjMy4uMGY2ZmM1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLW1pY3Jvc29mdC5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1taWNyb3NvZnQuYwpAQCAtNDAsOCArNDAsNyBAQAogCiAJaWYgKChxdWlya3MgJiBNU19SREVTQykgJiYgKnJzaXplID09IDU3MSAmJiByZGVzY1s1NTddID09IDB4MTkgJiYKIAkJCXJkZXNjWzU1OV0gPT0gMHgyOSkgewotCQlkZXZfaW5mbygmaGRldi0+ZGV2LCAiZml4aW5nIHVwIE1pY3Jvc29mdCBXaXJlbGVzcyBSZWNlaXZlciAiCi0JCQkJIk1vZGVsIDEwMjggcmVwb3J0IGRlc2NyaXB0b3JcbiIpOworCQloaWRfaW5mbyhoZGV2LCAiZml4aW5nIHVwIE1pY3Jvc29mdCBXaXJlbGVzcyBSZWNlaXZlciBNb2RlbCAxMDI4IHJlcG9ydCBkZXNjcmlwdG9yXG4iKTsKIAkJcmRlc2NbNTU3XSA9IDB4MzU7CiAJCXJkZXNjWzU1OV0gPSAweDQ1OwogCX0KQEAgLTE1NSwxNCArMTU0LDE0IEBACiAKIAlyZXQgPSBoaWRfcGFyc2UoaGRldik7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJwYXJzZSBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJwYXJzZSBmYWlsZWRcbiIpOwogCQlnb3RvIGVycl9mcmVlOwogCX0KIAogCXJldCA9IGhpZF9od19zdGFydChoZGV2LCBISURfQ09OTkVDVF9ERUZBVUxUIHwgKChxdWlya3MgJiBNU19ISURJTlBVVCkgPwogCQkJCUhJRF9DT05ORUNUX0hJRElOUFVUX0ZPUkNFIDogMCkpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1tb250ZXJleS5jIGIvZHJpdmVycy9oaWQvaGlkLW1vbnRlcmV5LmMKaW5kZXggYzk1YzMxZS4uZGVkZjc1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLW1vbnRlcmV5LmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLW1vbnRlcmV5LmMKQEAgLTI2LDggKzI2LDcgQEAKIAkJdW5zaWduZWQgaW50ICpyc2l6ZSkKIHsKIAlpZiAoKnJzaXplID49IDMwICYmIHJkZXNjWzI5XSA9PSAweDA1ICYmIHJkZXNjWzMwXSA9PSAweDA5KSB7Ci0JCWRldl9pbmZvKCZoZGV2LT5kZXYsICJmaXhpbmcgdXAgYnV0dG9uL2NvbnN1bWVyIGluIEhJRCByZXBvcnQgIgotCQkJCSJkZXNjcmlwdG9yXG4iKTsKKwkJaGlkX2luZm8oaGRldiwgImZpeGluZyB1cCBidXR0b24vY29uc3VtZXIgaW4gSElEIHJlcG9ydCBkZXNjcmlwdG9yXG4iKTsKIAkJcmRlc2NbMzBdID0gMHgwYzsKIAl9CiAJcmV0dXJuIHJkZXNjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLW1vc2FydC5jIGIvZHJpdmVycy9oaWQvaGlkLW1vc2FydC5jCmluZGV4IGFjNTQyMWQuLjlmYjA1MGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1tb3NhcnQuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtbW9zYXJ0LmMKQEAgLTkwLDYgKzkwLDEwIEBACiAJY2FzZSAweGZmMDAwMDAwOgogCQkvKiBpZ25vcmUgSElEIGZlYXR1cmVzICovCiAJCXJldHVybiAtMTsKKworCWNhc2UgSElEX1VQX0JVVFRPTjoKKwkJLyogaWdub3JlIGJ1dHRvbnMgKi8KKwkJcmV0dXJuIC0xOwogCX0KIAogCXJldHVybiAwOwpAQCAtMTk5LDcgKzIwMyw3IEBACiAKIAl0ZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtb3NhcnRfZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghdGQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiY2Fubm90IGFsbG9jYXRlIE1vc0FydCBkYXRhXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiY2Fubm90IGFsbG9jYXRlIE1vc0FydCBkYXRhXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCXRkLT52YWxpZCA9IGZhbHNlOwpAQCAtMjMwLDYgKzIzNCwxOSBAQAogCXJldHVybiByZXQ7CiB9CiAKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgbW9zYXJ0X3Jlc2V0X3Jlc3VtZShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldikKK3sKKwlzdHJ1Y3QgaGlkX3JlcG9ydF9lbnVtICpyZSA9IGhkZXYtPnJlcG9ydF9lbnVtCisJCQkJCQkrIEhJRF9GRUFUVVJFX1JFUE9SVDsKKwlzdHJ1Y3QgaGlkX3JlcG9ydCAqciA9IHJlLT5yZXBvcnRfaWRfaGFzaFs3XTsKKworCXItPmZpZWxkWzBdLT52YWx1ZVswXSA9IDB4MDI7CisJdXNiaGlkX3N1Ym1pdF9yZXBvcnQoaGRldiwgciwgVVNCX0RJUl9PVVQpOworCXJldHVybiAwOworfQorI2VuZGlmCisKIHN0YXRpYyB2b2lkIG1vc2FydF9yZW1vdmUoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYpCiB7CiAJaGlkX2h3X3N0b3AoaGRldik7CkBAIC0yNTgsNiArMjc1LDkgQEAKIAkuaW5wdXRfbWFwcGVkID0gbW9zYXJ0X2lucHV0X21hcHBlZCwKIAkudXNhZ2VfdGFibGUgPSBtb3NhcnRfZ3JhYmJlZF91c2FnZXMsCiAJLmV2ZW50ID0gbW9zYXJ0X2V2ZW50LAorI2lmZGVmIENPTkZJR19QTQorCS5yZXNldF9yZXN1bWUgPSBtb3NhcnRfcmVzZXRfcmVzdW1lLAorI2VuZGlmCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBtb3NhcnRfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLW50cmlnLmMgYi9kcml2ZXJzL2hpZC9oaWQtbnRyaWcuYwppbmRleCA2OTE2OWVmLi5iZWI0MDM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtbnRyaWcuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtbnRyaWcuYwpAQCAtMTMwLDggKzEzMCw3IEBACiAJaWYgKHJldCA9PSA4KSB7CiAJCXJldCA9IG50cmlnX3ZlcnNpb25fc3RyaW5nKCZkYXRhWzJdLCBidWYpOwogCi0JCWRldl9pbmZvKCZoZGV2LT5kZXYsCi0JCQkgIkZpcm13YXJlIHZlcnNpb246ICVzICglMDJ4JTAyeCAlMDJ4JTAyeClcbiIsCisJCWhpZF9pbmZvKGhkZXYsICJGaXJtd2FyZSB2ZXJzaW9uOiAlcyAoJTAyeCUwMnggJTAyeCUwMngpXG4iLAogCQkJIGJ1ZiwgZGF0YVsyXSwgZGF0YVszXSwgZGF0YVs0XSwgZGF0YVs1XSk7CiAJfQogCkBAIC04MzEsNyArODMwLDcgQEAKIAogCW5kID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG50cmlnX2RhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW5kKSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSBOLVRyaWcgZGF0YVxuIik7CisJCWhpZF9lcnIoaGRldiwgImNhbm5vdCBhbGxvY2F0ZSBOLVRyaWcgZGF0YVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtODUwLDEzICs4NDksMTMgQEAKIAogCXJldCA9IGhpZF9wYXJzZShoZGV2KTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgInBhcnNlIGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgInBhcnNlIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX2ZyZWU7CiAJfQogCiAJcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIEhJRF9DT05ORUNUX0RFRkFVTFQgJiB+SElEX0NPTk5FQ1RfRkYpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1vcnRlay5jIGIvZHJpdmVycy9oaWQvaGlkLW9ydGVrLmMKaW5kZXggMmU3OTcxNi4uZTkwZWRmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLW9ydGVrLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLW9ydGVrLmMKQEAgLTIzLDggKzIzLDcgQEAKIAkJdW5zaWduZWQgaW50ICpyc2l6ZSkKIHsKIAlpZiAoKnJzaXplID49IDU2ICYmIHJkZXNjWzU0XSA9PSAweDI1ICYmIHJkZXNjWzU1XSA9PSAweDAxKSB7Ci0JCWRldl9pbmZvKCZoZGV2LT5kZXYsICJGaXhpbmcgdXAgT3J0ZWsgV0tCLTIwMDAgIgotCQkJCSJyZXBvcnQgZGVzY3JpcHRvci5cbiIpOworCQloaWRfaW5mbyhoZGV2LCAiRml4aW5nIHVwIE9ydGVrIFdLQi0yMDAwIHJlcG9ydCBkZXNjcmlwdG9yXG4iKTsKIAkJcmRlc2NbNTVdID0gMHg5MjsKIAl9CiAJcmV0dXJuIHJkZXNjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLXBldGFseW54LmMgYi9kcml2ZXJzL2hpZC9oaWQtcGV0YWx5bnguYwppbmRleCAzMDhkNmFlLi5mMWVhM2ZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtcGV0YWx5bnguYworKysgYi9kcml2ZXJzL2hpZC9oaWQtcGV0YWx5bnguYwpAQCAtMjksOCArMjksNyBAQAogCWlmICgqcnNpemUgPj0gNjAgJiYgcmRlc2NbMzldID09IDB4MmEgJiYgcmRlc2NbNDBdID09IDB4ZjUgJiYKIAkJCXJkZXNjWzQxXSA9PSAweDAwICYmIHJkZXNjWzU5XSA9PSAweDI2ICYmCiAJCQlyZGVzY1s2MF0gPT0gMHhmOSAmJiByZGVzY1s2MV0gPT0gMHgwMCkgewotCQlkZXZfaW5mbygmaGRldi0+ZGV2LCAiZml4aW5nIHVwIFBldGFseW54IE1heHRlciBSZW1vdGUgcmVwb3J0ICIKLQkJCQkiZGVzY3JpcHRvclxuIik7CisJCWhpZF9pbmZvKGhkZXYsICJmaXhpbmcgdXAgUGV0YWx5bnggTWF4dGVyIFJlbW90ZSByZXBvcnQgZGVzY3JpcHRvclxuIik7CiAJCXJkZXNjWzYwXSA9IDB4ZmE7CiAJCXJkZXNjWzQwXSA9IDB4ZmE7CiAJfQpAQCAtNzcsMTMgKzc2LDEzIEBACiAKIAlyZXQgPSBoaWRfcGFyc2UoaGRldik7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJwYXJzZSBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJwYXJzZSBmYWlsZWRcbiIpOwogCQlnb3RvIGVycl9mcmVlOwogCX0KIAogCXJldCA9IGhpZF9od19zdGFydChoZGV2LCBISURfQ09OTkVDVF9ERUZBVUxUKTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX2ZyZWU7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtcGljb2xjZC5jIGIvZHJpdmVycy9oaWQvaGlkLXBpY29sY2QuYwppbmRleCBiYzJlMDc3Li5kZTljZjIxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLXBpY29sY2QuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtcGljb2xjZC5jCkBAIC0yNTMsNyArMjUzLDcgQEAKIAkJaWYgKHJlcG9ydC0+aWQgPT0gaWQpCiAJCQlyZXR1cm4gcmVwb3J0OwogCX0KLQlkZXZfd2FybigmaGRldi0+ZGV2LCAiTm8gcmVwb3J0IHdpdGggaWQgMHgleCBmb3VuZFxuIiwgaWQpOworCWhpZF93YXJuKGhkZXYsICJObyByZXBvcnQgd2l0aCBpZCAweCV4IGZvdW5kXG4iLCBpZCk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTEzMjksNyArMTMyOSw3IEBACiAKIAl2ZXJpbmZvID0gcGljb2xjZF9zZW5kX2FuZF93YWl0KGhkZXYsIFJFUE9SVF9WRVJTSU9OLCBOVUxMLCAwKTsKIAlpZiAoIXZlcmluZm8pIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAibm8gdmVyc2lvbiByZXNwb25zZSBmcm9tIFBpY29MQ0QiKTsKKwkJaGlkX2VycihoZGV2LCAibm8gdmVyc2lvbiByZXNwb25zZSBmcm9tIFBpY29MQ0RcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTEzMzcsMTQgKzEzMzcsMTQgQEAKIAkJZGF0YS0+dmVyc2lvblswXSA9IHZlcmluZm8tPnJhd19kYXRhWzFdOwogCQlkYXRhLT52ZXJzaW9uWzFdID0gdmVyaW5mby0+cmF3X2RhdGFbMF07CiAJCWlmIChkYXRhLT5zdGF0dXMgJiBQSUNPTENEX0JPT1RMT0FERVIpIHsKLQkJCWRldl9pbmZvKCZoZGV2LT5kZXYsICJQaWNvTENELCBib290bG9hZGVyIHZlcnNpb24gJWQuJWRcbiIsCi0JCQkJCXZlcmluZm8tPnJhd19kYXRhWzFdLCB2ZXJpbmZvLT5yYXdfZGF0YVswXSk7CisJCQloaWRfaW5mbyhoZGV2LCAiUGljb0xDRCwgYm9vdGxvYWRlciB2ZXJzaW9uICVkLiVkXG4iLAorCQkJCSB2ZXJpbmZvLT5yYXdfZGF0YVsxXSwgdmVyaW5mby0+cmF3X2RhdGFbMF0pOwogCQl9IGVsc2UgewotCQkJZGV2X2luZm8oJmhkZXYtPmRldiwgIlBpY29MQ0QsIGZpcm13YXJlIHZlcnNpb24gJWQuJWRcbiIsCi0JCQkJCXZlcmluZm8tPnJhd19kYXRhWzFdLCB2ZXJpbmZvLT5yYXdfZGF0YVswXSk7CisJCQloaWRfaW5mbyhoZGV2LCAiUGljb0xDRCwgZmlybXdhcmUgdmVyc2lvbiAlZC4lZFxuIiwKKwkJCQkgdmVyaW5mby0+cmF3X2RhdGFbMV0sIHZlcmluZm8tPnJhd19kYXRhWzBdKTsKIAkJfQogCX0gZWxzZSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImNvbmZ1c2VkLCBnb3QgdW5leHBlY3RlZCB2ZXJzaW9uIHJlc3BvbnNlIGZyb20gUGljb0xDRFxuIik7CisJCWhpZF9lcnIoaGRldiwgImNvbmZ1c2VkLCBnb3QgdW5leHBlY3RlZCB2ZXJzaW9uIHJlc3BvbnNlIGZyb20gUGljb0xDRFxuIik7CiAJCXJldCA9IC1FSU5WQUw7CiAJfQogCWtmcmVlKHZlcmluZm8pOwpAQCAtMTU0NCw3ICsxNTQ0LDcgQEAKIAogCS8qIHByZXBhcmUgYnVmZmVyIHdpdGggaW5mbyBhYm91dCB3aGF0IHdlIHdhbnQgdG8gcmVhZCAoYWRkciAmIGxlbikgKi8KIAlyYXdfZGF0YVswXSA9ICpvZmYgJiAweGZmOwotCXJhd19kYXRhWzFdID0gKCpvZmYgPj4gOCkgJiYgMHhmZjsKKwlyYXdfZGF0YVsxXSA9ICgqb2ZmID4+IDgpICYgMHhmZjsKIAlyYXdfZGF0YVsyXSA9IHMgPCAyMCA/IHMgOiAyMDsKIAlpZiAoKm9mZiArIHJhd19kYXRhWzJdID4gMHhmZikKIAkJcmF3X2RhdGFbMl0gPSAweDEwMCAtICpvZmY7CkBAIC0xNTgzLDcgKzE1ODMsNyBAQAogCiAJbWVtc2V0KHJhd19kYXRhLCAwLCBzaXplb2YocmF3X2RhdGEpKTsKIAlyYXdfZGF0YVswXSA9ICpvZmYgJiAweGZmOwotCXJhd19kYXRhWzFdID0gKCpvZmYgPj4gOCkgJiYgMHhmZjsKKwlyYXdfZGF0YVsxXSA9ICgqb2ZmID4+IDgpICYgMHhmZjsKIAlyYXdfZGF0YVsyXSA9IHMgPCAyMCA/IHMgOiAyMDsKIAlpZiAoKm9mZiArIHJhd19kYXRhWzJdID4gMHhmZikKIAkJcmF3X2RhdGFbMl0gPSAweDEwMCAtICpvZmY7CkBAIC0xODY3LDYgKzE4NjcsNyBAQAogCQkJcmVwb3J0LT5pZCwgcmF3X3NpemUpOwogCWhpZF9kZWJ1Z19ldmVudChoZGV2LCBidWZmKTsKIAlpZiAocmF3X3NpemUgKyA1ID4gc2l6ZW9mKHJhd19kYXRhKSkgeworCQlrZnJlZShidWZmKTsKIAkJaGlkX2RlYnVnX2V2ZW50KGhkZXYsICIgVE9PIEJJR1xuIik7CiAJCXJldHVybjsKIAl9IGVsc2UgewpAQCAtMjMyOCw4ICsyMzI5LDcgQEAKIAkJCShmbGFzaF93ID8gU19JV1VTUiA6IDApIHwgKGZsYXNoX3IgPyBTX0lSVVNSIDogMCksCiAJCQloZGV2LT5kZWJ1Z19kaXIsIGRhdGEsICZwaWNvbGNkX2RlYnVnX2ZsYXNoX2ZvcHMpOwogCX0gZWxzZSBpZiAoZmxhc2hfciB8fCBmbGFzaF93KQotCQlkZXZfd2FybigmaGRldi0+ZGV2LCAiVW5leHBlY3RlZCBGTEFTSCBhY2Nlc3MgcmVwb3J0cywgIgotCQkJCSJwbGVhc2Ugc3VibWl0IHJkZXNjIGZvciByZXZpZXdcbiIpOworCQloaWRfd2FybihoZGV2LCAiVW5leHBlY3RlZCBGTEFTSCBhY2Nlc3MgcmVwb3J0cywgcGxlYXNlIHN1Ym1pdCByZGVzYyBmb3IgcmV2aWV3XG4iKTsKIH0KIAogc3RhdGljIHZvaWQgcGljb2xjZF9leGl0X2RldmZzKHN0cnVjdCBwaWNvbGNkX2RhdGEgKmRhdGEpCkBAIC0yNDU3LDEzICsyNDU3LDEzIEBACiAJCXJldHVybiAtRU5PREVWOwogCWlmIChyZXBvcnQtPm1heGZpZWxkICE9IDEgfHwgcmVwb3J0LT5maWVsZFswXS0+cmVwb3J0X2NvdW50ICE9IDIgfHwKIAkJCXJlcG9ydC0+ZmllbGRbMF0tPnJlcG9ydF9zaXplICE9IDgpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAidW5zdXBwb3J0ZWQgS0VZX1NUQVRFIHJlcG9ydCIpOworCQloaWRfZXJyKGhkZXYsICJ1bnN1cHBvcnRlZCBLRVlfU1RBVEUgcmVwb3J0XG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWRldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwogCWlmIChpZGV2ID09IE5VTEwpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIGlucHV0IGRldmljZSIpOworCQloaWRfZXJyKGhkZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgaW5wdXQgZGV2aWNlXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCWlucHV0X3NldF9kcnZkYXRhKGlkZXYsIGhkZXYpOwpAQCAtMjQ4NSw3ICsyNDg1LDcgQEAKIAkJaW5wdXRfc2V0X2NhcGFiaWxpdHkoaWRldiwgRVZfS0VZLCBkYXRhLT5rZXljb2RlW2ldKTsKIAllcnJvciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpZGV2KTsKIAlpZiAoZXJyb3IpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiZXJyb3IgcmVnaXN0ZXJpbmcgdGhlIGlucHV0IGRldmljZSIpOworCQloaWRfZXJyKGhkZXYsICJlcnJvciByZWdpc3RlcmluZyB0aGUgaW5wdXQgZGV2aWNlXG4iKTsKIAkJaW5wdXRfZnJlZV9kZXZpY2UoaWRldik7CiAJCXJldHVybiBlcnJvcjsKIAl9CkBAIC0yNTIyLDkgKzI1MjIsOCBAQAogCQlyZXR1cm4gZXJyb3I7CiAKIAlpZiAoZGF0YS0+dmVyc2lvblswXSAhPSAwICYmIGRhdGEtPnZlcnNpb25bMV0gIT0gMykKLQkJZGV2X2luZm8oJmhkZXYtPmRldiwgIkRldmljZSB3aXRoIHVudGVzdGVkIGZpcm13YXJlIHJldmlzaW9uLCAiCi0JCQkJInBsZWFzZSBzdWJtaXQgL3N5cy9rZXJuZWwvZGVidWcvaGlkLyVzL3JkZXNjIGZvciB0aGlzIGRldmljZS5cbiIsCi0JCQkJZGV2X25hbWUoJmhkZXYtPmRldikpOworCQloaWRfaW5mbyhoZGV2LCAiRGV2aWNlIHdpdGggdW50ZXN0ZWQgZmlybXdhcmUgcmV2aXNpb24sIHBsZWFzZSBzdWJtaXQgL3N5cy9rZXJuZWwvZGVidWcvaGlkLyVzL3JkZXNjIGZvciB0aGlzIGRldmljZS5cbiIsCisJCQkgZGV2X25hbWUoJmhkZXYtPmRldikpOwogCiAJLyogU2V0dXAga2V5cGFkIGlucHV0IGRldmljZSAqLwogCWVycm9yID0gcGljb2xjZF9pbml0X2tleXMoZGF0YSwgcGljb2xjZF9pbl9yZXBvcnQoUkVQT1JUX0tFWV9TVEFURSwgaGRldikpOwpAQCAtMjU4MSw5ICsyNTgwLDggQEAKIAkJcmV0dXJuIGVycm9yOwogCiAJaWYgKGRhdGEtPnZlcnNpb25bMF0gIT0gMSAmJiBkYXRhLT52ZXJzaW9uWzFdICE9IDApCi0JCWRldl9pbmZvKCZoZGV2LT5kZXYsICJEZXZpY2Ugd2l0aCB1bnRlc3RlZCBib290bG9hZGVyIHJldmlzaW9uLCAiCi0JCQkJInBsZWFzZSBzdWJtaXQgL3N5cy9rZXJuZWwvZGVidWcvaGlkLyVzL3JkZXNjIGZvciB0aGlzIGRldmljZS5cbiIsCi0JCQkJZGV2X25hbWUoJmhkZXYtPmRldikpOworCQloaWRfaW5mbyhoZGV2LCAiRGV2aWNlIHdpdGggdW50ZXN0ZWQgYm9vdGxvYWRlciByZXZpc2lvbiwgcGxlYXNlIHN1Ym1pdCAvc3lzL2tlcm5lbC9kZWJ1Zy9oaWQvJXMvcmRlc2MgZm9yIHRoaXMgZGV2aWNlLlxuIiwKKwkJCSBkZXZfbmFtZSgmaGRldi0+ZGV2KSk7CiAKIAlwaWNvbGNkX2luaXRfZGV2ZnMoZGF0YSwgTlVMTCwgTlVMTCwKIAkJCXBpY29sY2Rfb3V0X3JlcG9ydChSRVBPUlRfQkxfUkVBRF9NRU1PUlksIGhkZXYpLApAQCAtMjYwNSw3ICsyNjAzLDcgQEAKIAkgKi8KIAlkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBpY29sY2RfZGF0YSksIEdGUF9LRVJORUwpOwogCWlmIChkYXRhID09IE5VTEwpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiY2FuJ3QgYWxsb2NhdGUgc3BhY2UgZm9yIE1pbmlib3ggUGljb0xDRCBkZXZpY2UgZGF0YVxuIik7CisJCWhpZF9lcnIoaGRldiwgImNhbid0IGFsbG9jYXRlIHNwYWNlIGZvciBNaW5pYm94IFBpY29MQ0QgZGV2aWNlIGRhdGFcbiIpOwogCQllcnJvciA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX25vX2NsZWFudXA7CiAJfQpAQCAtMjYyMSw3ICsyNjE5LDcgQEAKIAkvKiBQYXJzZSB0aGUgZGV2aWNlIHJlcG9ydHMgYW5kIHN0YXJ0IGl0IHVwICovCiAJZXJyb3IgPSBoaWRfcGFyc2UoaGRldik7CiAJaWYgKGVycm9yKSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImRldmljZSByZXBvcnQgcGFyc2UgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiZGV2aWNlIHJlcG9ydCBwYXJzZSBmYWlsZWRcbiIpOwogCQlnb3RvIGVycl9jbGVhbnVwX2RhdGE7CiAJfQogCkBAIC0yNjMxLDI1ICsyNjI5LDI1IEBACiAJZXJyb3IgPSBoaWRfaHdfc3RhcnQoaGRldiwgMCk7CiAJaGRldi0+Y2xhaW1lZCA9IDA7CiAJaWYgKGVycm9yKSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImhhcmR3YXJlIHN0YXJ0IGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgImhhcmR3YXJlIHN0YXJ0IGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX2NsZWFudXBfZGF0YTsKIAl9CiAKLQllcnJvciA9IGhkZXYtPmxsX2RyaXZlci0+b3BlbihoZGV2KTsKKwllcnJvciA9IGhpZF9od19vcGVuKGhkZXYpOwogCWlmIChlcnJvcikgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJmYWlsZWQgdG8gb3BlbiBpbnB1dCBpbnRlcnJ1cHQgcGlwZSBmb3Iga2V5IGFuZCBJUiBldmVudHNcbiIpOworCQloaWRfZXJyKGhkZXYsICJmYWlsZWQgdG8gb3BlbiBpbnB1dCBpbnRlcnJ1cHQgcGlwZSBmb3Iga2V5IGFuZCBJUiBldmVudHNcbiIpOwogCQlnb3RvIGVycl9jbGVhbnVwX2hpZF9odzsKIAl9CiAKIAllcnJvciA9IGRldmljZV9jcmVhdGVfZmlsZSgmaGRldi0+ZGV2LCAmZGV2X2F0dHJfb3BlcmF0aW9uX21vZGVfZGVsYXkpOwogCWlmIChlcnJvcikgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJmYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGF0dHJpYnV0ZXNcbiIpOworCQloaWRfZXJyKGhkZXYsICJmYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGF0dHJpYnV0ZXNcbiIpOwogCQlnb3RvIGVycl9jbGVhbnVwX2hpZF9sbDsKIAl9CiAKIAllcnJvciA9IGRldmljZV9jcmVhdGVfZmlsZSgmaGRldi0+ZGV2LCAmZGV2X2F0dHJfb3BlcmF0aW9uX21vZGUpOwogCWlmIChlcnJvcikgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJmYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGF0dHJpYnV0ZXNcbiIpOworCQloaWRfZXJyKGhkZXYsICJmYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGF0dHJpYnV0ZXNcbiIpOwogCQlnb3RvIGVycl9jbGVhbnVwX3N5c2ZzMTsKIAl9CiAKQEAgLTI2NjgsNyArMjY2Niw3IEBACiBlcnJfY2xlYW51cF9zeXNmczE6CiAJZGV2aWNlX3JlbW92ZV9maWxlKCZoZGV2LT5kZXYsICZkZXZfYXR0cl9vcGVyYXRpb25fbW9kZV9kZWxheSk7CiBlcnJfY2xlYW51cF9oaWRfbGw6Ci0JaGRldi0+bGxfZHJpdmVyLT5jbG9zZShoZGV2KTsKKwloaWRfaHdfY2xvc2UoaGRldik7CiBlcnJfY2xlYW51cF9oaWRfaHc6CiAJaGlkX2h3X3N0b3AoaGRldik7CiBlcnJfY2xlYW51cF9kYXRhOgpAQCAtMjY5OSw3ICsyNjk3LDcgQEAKIAlwaWNvbGNkX2V4aXRfZGV2ZnMoZGF0YSk7CiAJZGV2aWNlX3JlbW92ZV9maWxlKCZoZGV2LT5kZXYsICZkZXZfYXR0cl9vcGVyYXRpb25fbW9kZSk7CiAJZGV2aWNlX3JlbW92ZV9maWxlKCZoZGV2LT5kZXYsICZkZXZfYXR0cl9vcGVyYXRpb25fbW9kZV9kZWxheSk7Ci0JaGRldi0+bGxfZHJpdmVyLT5jbG9zZShoZGV2KTsKKwloaWRfaHdfY2xvc2UoaGRldik7CiAJaGlkX2h3X3N0b3AoaGRldik7CiAJaGlkX3NldF9kcnZkYXRhKGhkZXYsIE5VTEwpOwogCkBAIC0yNzUzLDcgKzI3NTEsNyBAQAogewogCWhpZF91bnJlZ2lzdGVyX2RyaXZlcigmcGljb2xjZF9kcml2ZXIpOwogI2lmZGVmIENPTkZJR19ISURfUElDT0xDRF9GQgotCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJZmx1c2hfd29ya19zeW5jKCZwaWNvbGNkX2ZiX2NsZWFudXApOwogCVdBUk5fT04oZmJfcGVuZGluZyk7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1wbC5jIGIvZHJpdmVycy9oaWQvaGlkLXBsLmMKaW5kZXggOWY0MWUyYi4uMDZlNTMwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLXBsLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLXBsLmMKQEAgLTEwMyw3ICsxMDMsNyBAQAogCSovCiAKIAlpZiAobGlzdF9lbXB0eShyZXBvcnRfbGlzdCkpIHsKLQkJZGV2X2VycigmaGlkLT5kZXYsICJubyBvdXRwdXQgcmVwb3J0cyBmb3VuZFxuIik7CisJCWhpZF9lcnIoaGlkLCAibm8gb3V0cHV0IHJlcG9ydHMgZm91bmRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTExMiwxNCArMTEyLDEzIEBACiAJCXJlcG9ydF9wdHIgPSByZXBvcnRfcHRyLT5uZXh0OwogCiAJCWlmIChyZXBvcnRfcHRyID09IHJlcG9ydF9saXN0KSB7Ci0JCQlkZXZfZXJyKCZoaWQtPmRldiwgInJlcXVpcmVkIG91dHB1dCByZXBvcnQgaXMgIgotCQkJCQkibWlzc2luZ1xuIik7CisJCQloaWRfZXJyKGhpZCwgInJlcXVpcmVkIG91dHB1dCByZXBvcnQgaXMgbWlzc2luZ1xuIik7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQogCiAJCXJlcG9ydCA9IGxpc3RfZW50cnkocmVwb3J0X3B0ciwgc3RydWN0IGhpZF9yZXBvcnQsIGxpc3QpOwogCQlpZiAocmVwb3J0LT5tYXhmaWVsZCA8IDEpIHsKLQkJCWRldl9lcnIoJmhpZC0+ZGV2LCAibm8gZmllbGRzIGluIHRoZSByZXBvcnRcbiIpOworCQkJaGlkX2VycihoaWQsICJubyBmaWVsZHMgaW4gdGhlIHJlcG9ydFxuIik7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQogCkBAIC0xMzcsNyArMTM2LDcgQEAKIAkJCXdlYWsgPSAmcmVwb3J0LT5maWVsZFszXS0+dmFsdWVbMF07CiAJCQlkZWJ1ZygiZGV0ZWN0ZWQgNC1maWVsZCBkZXZpY2UiKTsKIAkJfSBlbHNlIHsKLQkJCWRldl9lcnIoJmhpZC0+ZGV2LCAibm90IGVub3VnaCBmaWVsZHMgb3IgdmFsdWVzXG4iKTsKKwkJCWhpZF9lcnIoaGlkLCAibm90IGVub3VnaCBmaWVsZHMgb3IgdmFsdWVzXG4iKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CiAKQEAgLTE2NCw4ICsxNjMsNyBAQAogCQl1c2JoaWRfc3VibWl0X3JlcG9ydChoaWQsIHBsZmYtPnJlcG9ydCwgVVNCX0RJUl9PVVQpOwogCX0KIAotCWRldl9pbmZvKCZoaWQtPmRldiwgIkZvcmNlIGZlZWRiYWNrIGZvciBQYW50aGVyTG9yZC9HcmVlbkFzaWEgIgotCSAgICAgICAiZGV2aWNlcyBieSBBbnNzaSBIYW5udWxhIDxhbnNzaS5oYW5udWxhQGdtYWlsLmNvbT5cbiIpOworCWhpZF9pbmZvKGhpZCwgIkZvcmNlIGZlZWRiYWNrIGZvciBQYW50aGVyTG9yZC9HcmVlbkFzaWEgZGV2aWNlcyBieSBBbnNzaSBIYW5udWxhIDxhbnNzaS5oYW5udWxhQGdtYWlsLmNvbT5cbiIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xODUsMTMgKzE4MywxMyBAQAogCiAJcmV0ID0gaGlkX3BhcnNlKGhkZXYpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKIAkJZ290byBlcnI7CiAJfQogCiAJcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIEhJRF9DT05ORUNUX0RFRkFVTFQgJiB+SElEX0NPTk5FQ1RfRkYpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKIAkJZ290byBlcnI7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtcHJvZGlrZXlzLmMgYi9kcml2ZXJzL2hpZC9oaWQtcHJvZGlrZXlzLmMKaW5kZXggNDhlYWI4NC4uYWIxOWYyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLXByb2Rpa2V5cy5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1wcm9kaWtleXMuYwpAQCAtMTYsNiArMTYsOCBAQAogICogYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CkBAIC0xMzAsNyArMTMyLDcgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIERFVklDRV9BVFRSKGNoYW5uZWwsIFNfSVJVR08gfCBTX0lXVUdPLCBzaG93X2NoYW5uZWwsCitzdGF0aWMgREVWSUNFX0FUVFIoY2hhbm5lbCwgU19JUlVHTyB8IFNfSVdVU1IgfCBTX0lXR1JQICwgc2hvd19jaGFubmVsLAogCQlzdG9yZV9jaGFubmVsKTsKIAogc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpzeXNmc19kZXZpY2VfYXR0cl9jaGFubmVsID0gewpAQCAtMTY5LDcgKzE3MSw3IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyBERVZJQ0VfQVRUUihzdXN0YWluLCBTX0lSVUdPIHwgU19JV1VHTywgc2hvd19zdXN0YWluLAorc3RhdGljIERFVklDRV9BVFRSKHN1c3RhaW4sIFNfSVJVR08gfCBTX0lXVVNSIHwgU19JV0dSUCwgc2hvd19zdXN0YWluLAogCQlzdG9yZV9zdXN0YWluKTsKIAogc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpzeXNmc19kZXZpY2VfYXR0cl9zdXN0YWluID0gewpAQCAtMjA3LDcgKzIwOSw3IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyBERVZJQ0VfQVRUUihvY3RhdmUsIFNfSVJVR08gfCBTX0lXVUdPLCBzaG93X29jdGF2ZSwKK3N0YXRpYyBERVZJQ0VfQVRUUihvY3RhdmUsIFNfSVJVR08gfCBTX0lXVVNSIHwgU19JV0dSUCwgc2hvd19vY3RhdmUsCiAJCXN0b3JlX29jdGF2ZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqc3lzZnNfZGV2aWNlX2F0dHJfb2N0YXZlID0gewpAQCAtMjg1LDExICsyODcsMTEgQEAKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChyZXBvcnQtPm1heGZpZWxkIDwgMSkgewotCQkJZGV2X2VycigmaGRldi0+ZGV2LCAib3V0cHV0IHJlcG9ydCBpcyBlbXB0eVxuIik7CisJCQloaWRfZXJyKGhkZXYsICJvdXRwdXQgcmVwb3J0IGlzIGVtcHR5XG4iKTsKIAkJCWJyZWFrOwogCQl9CiAJCWlmIChyZXBvcnQtPmZpZWxkWzBdLT5yZXBvcnRfY291bnQgIT0gMikgewotCQkJZGV2X2VycigmaGRldi0+ZGV2LCAiZmllbGQgY291bnQgdG9vIGxvd1xuIik7CisJCQloaWRfZXJyKGhkZXYsICJmaWVsZCBjb3VudCB0b28gbG93XG4iKTsKIAkJCWJyZWFrOwogCQl9CiAJCXBtLT5wY21pZGlfcmVwb3J0NiA9IHJlcG9ydDsKQEAgLTc0Niw4ICs3NDgsOCBAQAogCWlmICgqcnNpemUgPT0gMTc4ICYmCiAJICAgICAgcmRlc2NbMTExXSA9PSAweDA2ICYmIHJkZXNjWzExMl0gPT0gMHgwMCAmJgogCSAgICAgIHJkZXNjWzExM10gPT0gMHhmZikgewotCQlkZXZfaW5mbygmaGRldi0+ZGV2LCAiZml4aW5nIHVwIHBjLW1pZGkga2V5Ym9hcmQgcmVwb3J0ICIKLQkJCSJkZXNjcmlwdG9yXG4iKTsKKwkJaGlkX2luZm8oaGRldiwKKwkJCSAiZml4aW5nIHVwIHBjLW1pZGkga2V5Ym9hcmQgcmVwb3J0IGRlc2NyaXB0b3JcbiIpOwogCiAJCXJkZXNjWzE0NF0gPSAweDE4OyAvKiByZXBvcnQgNDogd2FzIDB4MTAgcmVwb3J0IGNvdW50ICovCiAJfQpAQCAtODA1LDcgKzgwNyw3IEBACiAKIAlwayA9IGt6YWxsb2Moc2l6ZW9mKCpwayksIEdGUF9LRVJORUwpOwogCWlmIChwayA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgInByb2Rpa2V5czogY2FuJ3QgYWxsb2MgZGVzY3JpcHRvclxuIik7CisJCWhpZF9lcnIoaGRldiwgImNhbid0IGFsbG9jIGRlc2NyaXB0b3JcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTgxMyw4ICs4MTUsNyBAQAogCiAJcG0gPSBremFsbG9jKHNpemVvZigqcG0pLCBHRlBfS0VSTkVMKTsKIAlpZiAocG0gPT0gTlVMTCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsCi0JCQkicHJvZGlrZXlzOiBjYW4ndCBhbGxvYyBkZXNjcmlwdG9yXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiY2FuJ3QgYWxsb2MgZGVzY3JpcHRvclxuIik7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX2ZyZWU7CiAJfQpAQCAtODI3LDcgKzgyOCw3IEBACiAKIAlyZXQgPSBoaWRfcGFyc2UoaGRldik7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJwcm9kaWtleXM6IGhpZCBwYXJzZSBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJoaWQgcGFyc2UgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKQEAgLTgzNyw3ICs4MzgsNyBAQAogCiAJcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIEhJRF9DT05ORUNUX0RFRkFVTFQpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAicHJvZGlrZXlzOiBodyBzdGFydCBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOwogCQlnb3RvIGVycl9mcmVlOwogCX0KIApAQCAtODk2LDcgKzg5Nyw3IEBACiAKIAlyZXQgPSBoaWRfcmVnaXN0ZXJfZHJpdmVyKCZwa19kcml2ZXIpOwogCWlmIChyZXQpCi0JCXByaW50ayhLRVJOX0VSUiAiY2FuJ3QgcmVnaXN0ZXIgcHJvZGlrZXlzIGRyaXZlclxuIik7CisJCXByX2VycigiY2FuJ3QgcmVnaXN0ZXIgcHJvZGlrZXlzIGRyaXZlclxuIik7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLXF1YW50YS5jIGIvZHJpdmVycy9oaWQvaGlkLXF1YW50YS5jCmluZGV4IDU0ZDNkYjUuLjg3YTU0ZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1xdWFudGEuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtcXVhbnRhLmMKQEAgLTE5NSw3ICsxOTUsNyBAQAogCiAJdGQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcXVhbnRhX2RhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXRkKSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSBRdWFudGEgVG91Y2ggZGF0YVxuIik7CisJCWhpZF9lcnIoaGRldiwgImNhbm5vdCBhbGxvY2F0ZSBRdWFudGEgVG91Y2ggZGF0YVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAl0ZC0+dmFsaWQgPSBmYWxzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQta29uZS5jIGIvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1rb25lLmMKaW5kZXggZjc3Njk1Ny4uY2JkOGNjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1rb25lLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1rb25lLmMKQEAgLTM1LDYgKzM1LDExIEBACiAjaW5jbHVkZSAiaGlkLXJvY2NhdC5oIgogI2luY2x1ZGUgImhpZC1yb2NjYXQta29uZS5oIgogCitzdGF0aWMgdWludCBwcm9maWxlX251bWJlcnNbNV0gPSB7MCwgMSwgMiwgMywgNH07CisKKy8qIGtvbmVfY2xhc3MgaXMgdXNlZCBmb3IgY3JlYXRpbmcgc3lzZnMgYXR0cmlidXRlcyB2aWEgcm9jY2F0IGNoYXIgZGV2aWNlICovCitzdGF0aWMgc3RydWN0IGNsYXNzICprb25lX2NsYXNzOworCiBzdGF0aWMgdm9pZCBrb25lX3NldF9zZXR0aW5nc19jaGVja3N1bShzdHJ1Y3Qga29uZV9zZXR0aW5ncyAqc2V0dGluZ3MpCiB7CiAJdWludDE2X3QgY2hlY2tzdW0gPSAwOwpAQCAtOTAsOCArOTUsNyBAQAogCQlrZnJlZShkYXRhKTsKIAkJcmV0dXJuIDA7CiAJfSBlbHNlIHsgLyogdW5rbm93biBhbnN3ZXIgKi8KLQkJZGV2X2VycigmdXNiX2Rldi0+ZGV2LCAiZ290IHJldHZhbCAlZCB3aGVuIGNoZWNraW5nIHdyaXRlXG4iLAotCQkJCSpkYXRhKTsKKwkJaGlkX2Vycih1c2JfZGV2LCAiZ290IHJldHZhbCAlZCB3aGVuIGNoZWNraW5nIHdyaXRlXG4iLCAqZGF0YSk7CiAJCWtmcmVlKGRhdGEpOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0yNjIsNyArMjY2LDggQEAKIHN0YXRpYyBzc2l6ZV90IGtvbmVfc3lzZnNfcmVhZF9zZXR0aW5ncyhzdHJ1Y3QgZmlsZSAqZnAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAogCQlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAogCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJc3RydWN0IGRldmljZSAqZGV2ID0KKwkJCWNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKS0+cGFyZW50LT5wYXJlbnQ7CiAJc3RydWN0IGtvbmVfZGV2aWNlICprb25lID0gaGlkX2dldF9kcnZkYXRhKGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsKIAogCWlmIChvZmYgPj0gc2l6ZW9mKHN0cnVjdCBrb25lX3NldHRpbmdzKSkKQEAgLTI4Niw3ICsyOTEsOCBAQAogc3RhdGljIHNzaXplX3Qga29uZV9zeXNmc193cml0ZV9zZXR0aW5ncyhzdHJ1Y3QgZmlsZSAqZnAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAogCQlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAogCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJc3RydWN0IGRldmljZSAqZGV2ID0KKwkJCWNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKS0+cGFyZW50LT5wYXJlbnQ7CiAJc3RydWN0IGtvbmVfZGV2aWNlICprb25lID0gaGlkX2dldF9kcnZkYXRhKGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiA9IGludGVyZmFjZV90b191c2JkZXYodG9fdXNiX2ludGVyZmFjZShkZXYpKTsKIAlpbnQgcmV0dmFsID0gMCwgZGlmZmVyZW5jZTsKQEAgLTMxOSwxMCArMzI1LDExIEBACiAJcmV0dXJuIHNpemVvZihzdHJ1Y3Qga29uZV9zZXR0aW5ncyk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGtvbmVfc3lzZnNfcmVhZF9wcm9maWxleChzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKLQkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50LCBpbnQgbnVtYmVyKSB7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOworc3RhdGljIHNzaXplX3Qga29uZV9zeXNmc19yZWFkX3Byb2ZpbGV4KHN0cnVjdCBmaWxlICpmcCwKKwkJc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkgeworCXN0cnVjdCBkZXZpY2UgKmRldiA9CisJCQljb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaiktPnBhcmVudC0+cGFyZW50OwogCXN0cnVjdCBrb25lX2RldmljZSAqa29uZSA9IGhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CiAKIAlpZiAob2ZmID49IHNpemVvZihzdHJ1Y3Qga29uZV9wcm9maWxlKSkKQEAgLTMzMiw0NyArMzM5LDE4IEBACiAJCWNvdW50ID0gc2l6ZW9mKHN0cnVjdCBrb25lX3Byb2ZpbGUpIC0gb2ZmOwogCiAJbXV0ZXhfbG9jaygma29uZS0+a29uZV9sb2NrKTsKLQltZW1jcHkoYnVmLCAoKGNoYXIgY29uc3QgKikma29uZS0+cHJvZmlsZXNbbnVtYmVyIC0gMV0pICsgb2ZmLCBjb3VudCk7CisJbWVtY3B5KGJ1ZiwgKChjaGFyIGNvbnN0ICopJmtvbmUtPnByb2ZpbGVzWyoodWludCAqKShhdHRyLT5wcml2YXRlKV0pICsgb2ZmLCBjb3VudCk7CiAJbXV0ZXhfdW5sb2NrKCZrb25lLT5rb25lX2xvY2spOwogCiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc3NpemVfdCBrb25lX3N5c2ZzX3JlYWRfcHJvZmlsZTEoc3RydWN0IGZpbGUgKmZwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKLQkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KSB7Ci0JcmV0dXJuIGtvbmVfc3lzZnNfcmVhZF9wcm9maWxleChrb2JqLCBhdHRyLCBidWYsIG9mZiwgY291bnQsIDEpOwotfQotCi1zdGF0aWMgc3NpemVfdCBrb25lX3N5c2ZzX3JlYWRfcHJvZmlsZTIoc3RydWN0IGZpbGUgKmZwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKLQkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KSB7Ci0JcmV0dXJuIGtvbmVfc3lzZnNfcmVhZF9wcm9maWxleChrb2JqLCBhdHRyLCBidWYsIG9mZiwgY291bnQsIDIpOwotfQotCi1zdGF0aWMgc3NpemVfdCBrb25lX3N5c2ZzX3JlYWRfcHJvZmlsZTMoc3RydWN0IGZpbGUgKmZwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKLQkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KSB7Ci0JcmV0dXJuIGtvbmVfc3lzZnNfcmVhZF9wcm9maWxleChrb2JqLCBhdHRyLCBidWYsIG9mZiwgY291bnQsIDMpOwotfQotCi1zdGF0aWMgc3NpemVfdCBrb25lX3N5c2ZzX3JlYWRfcHJvZmlsZTQoc3RydWN0IGZpbGUgKmZwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKLQkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KSB7Ci0JcmV0dXJuIGtvbmVfc3lzZnNfcmVhZF9wcm9maWxleChrb2JqLCBhdHRyLCBidWYsIG9mZiwgY291bnQsIDQpOwotfQotCi1zdGF0aWMgc3NpemVfdCBrb25lX3N5c2ZzX3JlYWRfcHJvZmlsZTUoc3RydWN0IGZpbGUgKmZwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKLQkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KSB7Ci0JcmV0dXJuIGtvbmVfc3lzZnNfcmVhZF9wcm9maWxleChrb2JqLCBhdHRyLCBidWYsIG9mZiwgY291bnQsIDUpOwotfQotCiAvKiBXcml0ZXMgZGF0YSBvbmx5IGlmIGRpZmZlcmVudCB0byBzdG9yZWQgZGF0YSAqLwotc3RhdGljIHNzaXplX3Qga29uZV9zeXNmc193cml0ZV9wcm9maWxleChzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKLQkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50LCBpbnQgbnVtYmVyKSB7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOworc3RhdGljIHNzaXplX3Qga29uZV9zeXNmc193cml0ZV9wcm9maWxleChzdHJ1Y3QgZmlsZSAqZnAsCisJCXN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPQorCQkJY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopLT5wYXJlbnQtPnBhcmVudDsKIAlzdHJ1Y3Qga29uZV9kZXZpY2UgKmtvbmUgPSBoaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldikpOwogCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldih0b191c2JfaW50ZXJmYWNlKGRldikpOwogCXN0cnVjdCBrb25lX3Byb2ZpbGUgKnByb2ZpbGU7CkBAIC0zODIsMTMgKzM2MCwxNCBAQAogCWlmIChvZmYgIT0gMCB8fCBjb3VudCAhPSBzaXplb2Yoc3RydWN0IGtvbmVfcHJvZmlsZSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcHJvZmlsZSA9ICZrb25lLT5wcm9maWxlc1tudW1iZXIgLSAxXTsKKwlwcm9maWxlID0gJmtvbmUtPnByb2ZpbGVzWyoodWludCAqKShhdHRyLT5wcml2YXRlKV07CiAKIAltdXRleF9sb2NrKCZrb25lLT5rb25lX2xvY2spOwogCWRpZmZlcmVuY2UgPSBtZW1jbXAoYnVmLCBwcm9maWxlLCBzaXplb2Yoc3RydWN0IGtvbmVfcHJvZmlsZSkpOwogCWlmIChkaWZmZXJlbmNlKSB7CiAJCXJldHZhbCA9IGtvbmVfc2V0X3Byb2ZpbGUodXNiX2RldiwKLQkJCQkoc3RydWN0IGtvbmVfcHJvZmlsZSBjb25zdCAqKWJ1ZiwgbnVtYmVyKTsKKwkJCQkoc3RydWN0IGtvbmVfcHJvZmlsZSBjb25zdCAqKWJ1ZiwKKwkJCQkqKHVpbnQgKikoYXR0ci0+cHJpdmF0ZSkgKyAxKTsKIAkJaWYgKCFyZXR2YWwpCiAJCQltZW1jcHkocHJvZmlsZSwgYnVmLCBzaXplb2Yoc3RydWN0IGtvbmVfcHJvZmlsZSkpOwogCX0KQEAgLTQwMCw0NyArMzc5LDE5IEBACiAJcmV0dXJuIHNpemVvZihzdHJ1Y3Qga29uZV9wcm9maWxlKTsKIH0KIAotc3RhdGljIHNzaXplX3Qga29uZV9zeXNmc193cml0ZV9wcm9maWxlMShzdHJ1Y3QgZmlsZSAqZnAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAotCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpIHsKLQlyZXR1cm4ga29uZV9zeXNmc193cml0ZV9wcm9maWxleChrb2JqLCBhdHRyLCBidWYsIG9mZiwgY291bnQsIDEpOwotfQotCi1zdGF0aWMgc3NpemVfdCBrb25lX3N5c2ZzX3dyaXRlX3Byb2ZpbGUyKHN0cnVjdCBmaWxlICpmcCwgc3RydWN0IGtvYmplY3QgKmtvYmosCi0JCXN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsCi0JCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkgewotCXJldHVybiBrb25lX3N5c2ZzX3dyaXRlX3Byb2ZpbGV4KGtvYmosIGF0dHIsIGJ1Ziwgb2ZmLCBjb3VudCwgMik7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGtvbmVfc3lzZnNfd3JpdGVfcHJvZmlsZTMoc3RydWN0IGZpbGUgKmZwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKLQkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KSB7Ci0JcmV0dXJuIGtvbmVfc3lzZnNfd3JpdGVfcHJvZmlsZXgoa29iaiwgYXR0ciwgYnVmLCBvZmYsIGNvdW50LCAzKTsKLX0KLQotc3RhdGljIHNzaXplX3Qga29uZV9zeXNmc193cml0ZV9wcm9maWxlNChzdHJ1Y3QgZmlsZSAqZnAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAotCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpIHsKLQlyZXR1cm4ga29uZV9zeXNmc193cml0ZV9wcm9maWxleChrb2JqLCBhdHRyLCBidWYsIG9mZiwgY291bnQsIDQpOwotfQotCi1zdGF0aWMgc3NpemVfdCBrb25lX3N5c2ZzX3dyaXRlX3Byb2ZpbGU1KHN0cnVjdCBmaWxlICpmcCwgc3RydWN0IGtvYmplY3QgKmtvYmosCi0JCXN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsCi0JCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkgewotCXJldHVybiBrb25lX3N5c2ZzX3dyaXRlX3Byb2ZpbGV4KGtvYmosIGF0dHIsIGJ1Ziwgb2ZmLCBjb3VudCwgNSk7Ci19Ci0KIHN0YXRpYyBzc2l6ZV90IGtvbmVfc3lzZnNfc2hvd19hY3R1YWxfcHJvZmlsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IGtvbmVfZGV2aWNlICprb25lID0gaGlkX2dldF9kcnZkYXRhKGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsKKwlzdHJ1Y3Qga29uZV9kZXZpY2UgKmtvbmUgPQorCQkJaGlkX2dldF9kcnZkYXRhKGRldl9nZXRfZHJ2ZGF0YShkZXYtPnBhcmVudC0+cGFyZW50KSk7CiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGtvbmUtPmFjdHVhbF9wcm9maWxlKTsKIH0KIAogc3RhdGljIHNzaXplX3Qga29uZV9zeXNmc19zaG93X2FjdHVhbF9kcGkoc3RydWN0IGRldmljZSAqZGV2LAogCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCBrb25lX2RldmljZSAqa29uZSA9IGhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CisJc3RydWN0IGtvbmVfZGV2aWNlICprb25lID0KKwkJCWhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2LT5wYXJlbnQtPnBhcmVudCkpOwogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBrb25lLT5hY3R1YWxfZHBpKTsKIH0KIApAQCAtNDQ4LDExICszOTksMTUgQEAKIHN0YXRpYyBzc2l6ZV90IGtvbmVfc3lzZnNfc2hvd193ZWlnaHQoc3RydWN0IGRldmljZSAqZGV2LAogCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCBrb25lX2RldmljZSAqa29uZSA9IGhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KHRvX3VzYl9pbnRlcmZhY2UoZGV2KSk7CisJc3RydWN0IGtvbmVfZGV2aWNlICprb25lOworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2OwogCWludCB3ZWlnaHQgPSAwOwogCWludCByZXR2YWw7CiAKKwlkZXYgPSBkZXYtPnBhcmVudC0+cGFyZW50OworCWtvbmUgPSBoaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldikpOworCXVzYl9kZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KHRvX3VzYl9pbnRlcmZhY2UoZGV2KSk7CisKIAltdXRleF9sb2NrKCZrb25lLT5rb25lX2xvY2spOwogCXJldHZhbCA9IGtvbmVfZ2V0X3dlaWdodCh1c2JfZGV2LCAmd2VpZ2h0KTsKIAltdXRleF91bmxvY2soJmtvbmUtPmtvbmVfbG9jayk7CkBAIC00NjUsMTQgKzQyMCwxNiBAQAogc3RhdGljIHNzaXplX3Qga29uZV9zeXNmc19zaG93X2Zpcm13YXJlX3ZlcnNpb24oc3RydWN0IGRldmljZSAqZGV2LAogCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCBrb25lX2RldmljZSAqa29uZSA9IGhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CisJc3RydWN0IGtvbmVfZGV2aWNlICprb25lID0KKwkJCWhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2LT5wYXJlbnQtPnBhcmVudCkpOwogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBrb25lLT5maXJtd2FyZV92ZXJzaW9uKTsKIH0KIAogc3RhdGljIHNzaXplX3Qga29uZV9zeXNmc19zaG93X3RjdShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IGtvbmVfZGV2aWNlICprb25lID0gaGlkX2dldF9kcnZkYXRhKGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsKKwlzdHJ1Y3Qga29uZV9kZXZpY2UgKmtvbmUgPQorCQkJaGlkX2dldF9kcnZkYXRhKGRldl9nZXRfZHJ2ZGF0YShkZXYtPnBhcmVudC0+cGFyZW50KSk7CiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGtvbmUtPnNldHRpbmdzLnRjdSk7CiB9CiAKQEAgLTUwNCwxMSArNDYxLDE1IEBACiBzdGF0aWMgc3NpemVfdCBrb25lX3N5c2ZzX3NldF90Y3Uoc3RydWN0IGRldmljZSAqZGV2LAogCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciBjb25zdCAqYnVmLCBzaXplX3Qgc2l6ZSkKIHsKLQlzdHJ1Y3Qga29uZV9kZXZpY2UgKmtvbmUgPSBoaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldikpOwotCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldih0b191c2JfaW50ZXJmYWNlKGRldikpOworCXN0cnVjdCBrb25lX2RldmljZSAqa29uZTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldjsKIAlpbnQgcmV0dmFsOwogCXVuc2lnbmVkIGxvbmcgc3RhdGU7CiAKKwlkZXYgPSBkZXYtPnBhcmVudC0+cGFyZW50OworCWtvbmUgPSBoaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldikpOworCXVzYl9kZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KHRvX3VzYl9pbnRlcmZhY2UoZGV2KSk7CisKIAlyZXR2YWwgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmc3RhdGUpOwogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7CkBAIC01NTYsNyArNTE3LDcgQEAKIAogCQlyZXR2YWwgPSBrb25lX3NldF9zZXR0aW5ncyh1c2JfZGV2LCAma29uZS0+c2V0dGluZ3MpOwogCQlpZiAocmV0dmFsKSB7Ci0JCQlkZXZfZXJyKCZ1c2JfZGV2LT5kZXYsICJjb3VsZG4ndCBzZXQgdGN1IHN0YXRlXG4iKTsKKwkJCWhpZF9lcnIodXNiX2RldiwgImNvdWxkbid0IHNldCB0Y3Ugc3RhdGVcbiIpOwogCQkJLyoKIAkJCSAqIHRyeSB0byByZXJlYWQgdmFsaWQgc2V0dGluZ3MgaW50byBidWZmZXIgb3ZlcndyaXRpbmcKIAkJCSAqIGZpcnN0IGVycm9yIGNvZGUKQEAgLTU3MCw3ICs1MzEsNyBAQAogCiAJcmV0dmFsID0gc2l6ZTsKIGV4aXRfbm9fc2V0dGluZ3M6Ci0JZGV2X2VycigmdXNiX2Rldi0+ZGV2LCAiY291bGRuJ3QgcmVhZCBzZXR0aW5nc1xuIik7CisJaGlkX2Vycih1c2JfZGV2LCAiY291bGRuJ3QgcmVhZCBzZXR0aW5nc1xuIik7CiBleGl0X3VubG9jazoKIAltdXRleF91bmxvY2soJmtvbmUtPmtvbmVfbG9jayk7CiAJcmV0dXJuIHJldHZhbDsKQEAgLTU3OSwxOCArNTQwLDIzIEBACiBzdGF0aWMgc3NpemVfdCBrb25lX3N5c2ZzX3Nob3dfc3RhcnR1cF9wcm9maWxlKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3Qga29uZV9kZXZpY2UgKmtvbmUgPSBoaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldikpOworCXN0cnVjdCBrb25lX2RldmljZSAqa29uZSA9CisJCQloaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldi0+cGFyZW50LT5wYXJlbnQpKTsKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwga29uZS0+c2V0dGluZ3Muc3RhcnR1cF9wcm9maWxlKTsKIH0KIAogc3RhdGljIHNzaXplX3Qga29uZV9zeXNmc19zZXRfc3RhcnR1cF9wcm9maWxlKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgY29uc3QgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7Ci0Jc3RydWN0IGtvbmVfZGV2aWNlICprb25lID0gaGlkX2dldF9kcnZkYXRhKGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiA9IGludGVyZmFjZV90b191c2JkZXYodG9fdXNiX2ludGVyZmFjZShkZXYpKTsKKwlzdHJ1Y3Qga29uZV9kZXZpY2UgKmtvbmU7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXY7CiAJaW50IHJldHZhbDsKIAl1bnNpZ25lZCBsb25nIG5ld19zdGFydHVwX3Byb2ZpbGU7CiAKKwlkZXYgPSBkZXYtPnBhcmVudC0+cGFyZW50OworCWtvbmUgPSBoaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldikpOworCXVzYl9kZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KHRvX3VzYl9pbnRlcmZhY2UoZGV2KSk7CisKIAlyZXR2YWwgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmbmV3X3N0YXJ0dXBfcHJvZmlsZSk7CiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKQEAgLTYxNywxNjAgKzU4Myw5MiBAQAogCXJldHVybiBzaXplOwogfQogCi0vKgotICogUmVhZCBhY3R1YWwgZHBpIHNldHRpbmdzLgotICogUmV0dXJucyByYXcgdmFsdWUgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4gUmVmZXIgdG8gZW51bSBrb25lX3BvbGxpbmdfcmF0ZXMgdG8KLSAqIGdldCByZWFsIHZhbHVlLgotICovCi1zdGF0aWMgREVWSUNFX0FUVFIoYWN0dWFsX2RwaSwgMDQ0MCwga29uZV9zeXNmc19zaG93X2FjdHVhbF9kcGksIE5VTEwpOworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGtvbmVfYXR0cmlidXRlc1tdID0geworCS8qCisJICogUmVhZCBhY3R1YWwgZHBpIHNldHRpbmdzLgorCSAqIFJldHVybnMgcmF3IHZhbHVlIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuIFJlZmVyIHRvIGVudW0KKwkgKiBrb25lX3BvbGxpbmdfcmF0ZXMgdG8gZ2V0IHJlYWwgdmFsdWUuCisJICovCisJX19BVFRSKGFjdHVhbF9kcGksIDA0NDAsIGtvbmVfc3lzZnNfc2hvd19hY3R1YWxfZHBpLCBOVUxMKSwKKwlfX0FUVFIoYWN0dWFsX3Byb2ZpbGUsIDA0NDAsIGtvbmVfc3lzZnNfc2hvd19hY3R1YWxfcHJvZmlsZSwgTlVMTCksCiAKLXN0YXRpYyBERVZJQ0VfQVRUUihhY3R1YWxfcHJvZmlsZSwgMDQ0MCwga29uZV9zeXNmc19zaG93X2FjdHVhbF9wcm9maWxlLCBOVUxMKTsKKwkvKgorCSAqIFRoZSBtb3VzZSBjYW4gYmUgZXF1aXBwZWQgd2l0aCBvbmUgb2YgZm91ciBzdXBwbGllZCB3ZWlnaHRzIGZyb20gNQorCSAqIHRvIDIwIGdyYW1zIHdoaWNoIGFyZSByZWNvZ25pemVkIGFuZCBpdHMgdmFsdWUgY2FuIGJlIHJlYWQgb3V0LgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcmF3IHZhbHVlIHJlcG9ydGVkIGJ5IHRoZSBtb3VzZSBmb3IgZWFzeSBldmFsdWF0aW9uCisJICogYnkgc29mdHdhcmUuIFJlZmVyIHRvIGVudW0ga29uZV93ZWlnaHRzIHRvIGdldCBjb3JyZXNwb25kaW5nIHJlYWwKKwkgKiB3ZWlnaHQuCisJICovCisJX19BVFRSKHdlaWdodCwgMDQ0MCwga29uZV9zeXNmc19zaG93X3dlaWdodCwgTlVMTCksCiAKLS8qCi0gKiBUaGUgbW91c2UgY2FuIGJlIGVxdWlwcGVkIHdpdGggb25lIG9mIGZvdXIgc3VwcGxpZWQgd2VpZ2h0cyBmcm9tIDUgdG8gMjAKLSAqIGdyYW1zIHdoaWNoIGFyZSByZWNvZ25pemVkIGFuZCBpdHMgdmFsdWUgY2FuIGJlIHJlYWQgb3V0LgotICogVGhpcyByZXR1cm5zIHRoZSByYXcgdmFsdWUgcmVwb3J0ZWQgYnkgdGhlIG1vdXNlIGZvciBlYXN5IGV2YWx1YXRpb24gYnkKLSAqIHNvZnR3YXJlLiBSZWZlciB0byBlbnVtIGtvbmVfd2VpZ2h0cyB0byBnZXQgY29ycmVzcG9uZGluZyByZWFsIHdlaWdodC4KLSAqLwotc3RhdGljIERFVklDRV9BVFRSKHdlaWdodCwgMDQ0MCwga29uZV9zeXNmc19zaG93X3dlaWdodCwgTlVMTCk7CisJLyoKKwkgKiBQcmludHMgZmlybXdhcmUgdmVyc2lvbiBzdG9yZWQgaW4gbW91c2UgYXMgaW50ZWdlci4KKwkgKiBUaGUgcmF3IHZhbHVlIHJlcG9ydGVkIGJ5IHRoZSBtb3VzZSBpcyByZXR1cm5lZCBmb3IgZWFzeSBldmFsdWF0aW9uLAorCSAqIHRvIGdldCB0aGUgcmVhbCB2ZXJzaW9uIG51bWJlciB0aGUgZGVjaW1hbCBwb2ludCBoYXMgdG8gYmUgc2hpZnRlZCAyCisJICogcG9zaXRpb25zIHRvIHRoZSBsZWZ0LiBFLmcuIGEgdmFsdWUgb2YgMTM4IG1lYW5zIDEuMzguCisJICovCisJX19BVFRSKGZpcm13YXJlX3ZlcnNpb24sIDA0NDAsCisJCQlrb25lX3N5c2ZzX3Nob3dfZmlybXdhcmVfdmVyc2lvbiwgTlVMTCksCiAKLS8qCi0gKiBQcmludHMgZmlybXdhcmUgdmVyc2lvbiBzdG9yZWQgaW4gbW91c2UgYXMgaW50ZWdlci4KLSAqIFRoZSByYXcgdmFsdWUgcmVwb3J0ZWQgYnkgdGhlIG1vdXNlIGlzIHJldHVybmVkIGZvciBlYXN5IGV2YWx1YXRpb24sIHRvIGdldAotICogdGhlIHJlYWwgdmVyc2lvbiBudW1iZXIgdGhlIGRlY2ltYWwgcG9pbnQgaGFzIHRvIGJlIHNoaWZ0ZWQgMiBwb3NpdGlvbnMgdG8KLSAqIHRoZSBsZWZ0LiBFLmcuIGEgdmFsdWUgb2YgMTM4IG1lYW5zIDEuMzguCi0gKi8KLXN0YXRpYyBERVZJQ0VfQVRUUihmaXJtd2FyZV92ZXJzaW9uLCAwNDQwLAotCQlrb25lX3N5c2ZzX3Nob3dfZmlybXdhcmVfdmVyc2lvbiwgTlVMTCk7CisJLyoKKwkgKiBQcmludHMgc3RhdGUgb2YgVHJhY2tpbmcgQ29udHJvbCBVbml0IGFzIG51bWJlciB3aGVyZSAwID0gb2ZmIGFuZAorCSAqIDEgPSBvbi4gV3JpdGluZyAwIGRlYWN0aXZhdGVzIHRjdSBhbmQgd3JpdGluZyAxIGNhbGlicmF0ZXMgYW5kCisJICogYWN0aXZhdGVzIHRoZSB0Y3UKKwkgKi8KKwlfX0FUVFIodGN1LCAwNjYwLCBrb25lX3N5c2ZzX3Nob3dfdGN1LCBrb25lX3N5c2ZzX3NldF90Y3UpLAogCi0vKgotICogUHJpbnRzIHN0YXRlIG9mIFRyYWNraW5nIENvbnRyb2wgVW5pdCBhcyBudW1iZXIgd2hlcmUgMCA9IG9mZiBhbmQgMSA9IG9uCi0gKiBXcml0aW5nIDAgZGVhY3RpdmF0ZXMgdGN1IGFuZCB3cml0aW5nIDEgY2FsaWJyYXRlcyBhbmQgYWN0aXZhdGVzIHRoZSB0Y3UKLSAqLwotc3RhdGljIERFVklDRV9BVFRSKHRjdSwgMDY2MCwga29uZV9zeXNmc19zaG93X3RjdSwga29uZV9zeXNmc19zZXRfdGN1KTsKLQotLyogUHJpbnRzIGFuZCB0YWtlcyB0aGUgbnVtYmVyIG9mIHRoZSBwcm9maWxlIHRoZSBtb3VzZSBzdGFydHMgd2l0aCAqLwotc3RhdGljIERFVklDRV9BVFRSKHN0YXJ0dXBfcHJvZmlsZSwgMDY2MCwKLQkJa29uZV9zeXNmc19zaG93X3N0YXJ0dXBfcHJvZmlsZSwKLQkJa29uZV9zeXNmc19zZXRfc3RhcnR1cF9wcm9maWxlKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmtvbmVfYXR0cmlidXRlc1tdID0gewotCQkmZGV2X2F0dHJfYWN0dWFsX2RwaS5hdHRyLAotCQkmZGV2X2F0dHJfYWN0dWFsX3Byb2ZpbGUuYXR0ciwKLQkJJmRldl9hdHRyX3dlaWdodC5hdHRyLAotCQkmZGV2X2F0dHJfZmlybXdhcmVfdmVyc2lvbi5hdHRyLAotCQkmZGV2X2F0dHJfdGN1LmF0dHIsCi0JCSZkZXZfYXR0cl9zdGFydHVwX3Byb2ZpbGUuYXR0ciwKLQkJTlVMTAorCS8qIFByaW50cyBhbmQgdGFrZXMgdGhlIG51bWJlciBvZiB0aGUgcHJvZmlsZSB0aGUgbW91c2Ugc3RhcnRzIHdpdGggKi8KKwlfX0FUVFIoc3RhcnR1cF9wcm9maWxlLCAwNjYwLAorCQkJa29uZV9zeXNmc19zaG93X3N0YXJ0dXBfcHJvZmlsZSwKKwkJCWtvbmVfc3lzZnNfc2V0X3N0YXJ0dXBfcHJvZmlsZSksCisJX19BVFRSX05VTEwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGtvbmVfYXR0cmlidXRlX2dyb3VwID0gewotCQkuYXR0cnMgPSBrb25lX2F0dHJpYnV0ZXMKK3N0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBrb25lX2Jpbl9hdHRyaWJ1dGVzW10gPSB7CisJeworCQkuYXR0ciA9IHsgLm5hbWUgPSAic2V0dGluZ3MiLCAubW9kZSA9IDA2NjAgfSwKKwkJLnNpemUgPSBzaXplb2Yoc3RydWN0IGtvbmVfc2V0dGluZ3MpLAorCQkucmVhZCA9IGtvbmVfc3lzZnNfcmVhZF9zZXR0aW5ncywKKwkJLndyaXRlID0ga29uZV9zeXNmc193cml0ZV9zZXR0aW5ncworCX0sCisJeworCQkuYXR0ciA9IHsgLm5hbWUgPSAicHJvZmlsZTEiLCAubW9kZSA9IDA2NjAgfSwKKwkJLnNpemUgPSBzaXplb2Yoc3RydWN0IGtvbmVfcHJvZmlsZSksCisJCS5yZWFkID0ga29uZV9zeXNmc19yZWFkX3Byb2ZpbGV4LAorCQkud3JpdGUgPSBrb25lX3N5c2ZzX3dyaXRlX3Byb2ZpbGV4LAorCQkucHJpdmF0ZSA9ICZwcm9maWxlX251bWJlcnNbMF0KKwl9LAorCXsKKwkJLmF0dHIgPSB7IC5uYW1lID0gInByb2ZpbGUyIiwgLm1vZGUgPSAwNjYwIH0sCisJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBrb25lX3Byb2ZpbGUpLAorCQkucmVhZCA9IGtvbmVfc3lzZnNfcmVhZF9wcm9maWxleCwKKwkJLndyaXRlID0ga29uZV9zeXNmc193cml0ZV9wcm9maWxleCwKKwkJLnByaXZhdGUgPSAmcHJvZmlsZV9udW1iZXJzWzFdCisJfSwKKwl7CisJCS5hdHRyID0geyAubmFtZSA9ICJwcm9maWxlMyIsIC5tb2RlID0gMDY2MCB9LAorCQkuc2l6ZSA9IHNpemVvZihzdHJ1Y3Qga29uZV9wcm9maWxlKSwKKwkJLnJlYWQgPSBrb25lX3N5c2ZzX3JlYWRfcHJvZmlsZXgsCisJCS53cml0ZSA9IGtvbmVfc3lzZnNfd3JpdGVfcHJvZmlsZXgsCisJCS5wcml2YXRlID0gJnByb2ZpbGVfbnVtYmVyc1syXQorCX0sCisJeworCQkuYXR0ciA9IHsgLm5hbWUgPSAicHJvZmlsZTQiLCAubW9kZSA9IDA2NjAgfSwKKwkJLnNpemUgPSBzaXplb2Yoc3RydWN0IGtvbmVfcHJvZmlsZSksCisJCS5yZWFkID0ga29uZV9zeXNmc19yZWFkX3Byb2ZpbGV4LAorCQkud3JpdGUgPSBrb25lX3N5c2ZzX3dyaXRlX3Byb2ZpbGV4LAorCQkucHJpdmF0ZSA9ICZwcm9maWxlX251bWJlcnNbM10KKwl9LAorCXsKKwkJLmF0dHIgPSB7IC5uYW1lID0gInByb2ZpbGU1IiwgLm1vZGUgPSAwNjYwIH0sCisJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBrb25lX3Byb2ZpbGUpLAorCQkucmVhZCA9IGtvbmVfc3lzZnNfcmVhZF9wcm9maWxleCwKKwkJLndyaXRlID0ga29uZV9zeXNmc193cml0ZV9wcm9maWxleCwKKwkJLnByaXZhdGUgPSAmcHJvZmlsZV9udW1iZXJzWzRdCisJfSwKKwlfX0FUVFJfTlVMTAogfTsKIAotc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIGtvbmVfc2V0dGluZ3NfYXR0ciA9IHsKLQkuYXR0ciA9IHsgLm5hbWUgPSAic2V0dGluZ3MiLCAubW9kZSA9IDA2NjAgfSwKLQkuc2l6ZSA9IHNpemVvZihzdHJ1Y3Qga29uZV9zZXR0aW5ncyksCi0JLnJlYWQgPSBrb25lX3N5c2ZzX3JlYWRfc2V0dGluZ3MsCi0JLndyaXRlID0ga29uZV9zeXNmc193cml0ZV9zZXR0aW5ncwotfTsKLQotc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIGtvbmVfcHJvZmlsZTFfYXR0ciA9IHsKLQkuYXR0ciA9IHsgLm5hbWUgPSAicHJvZmlsZTEiLCAubW9kZSA9IDA2NjAgfSwKLQkuc2l6ZSA9IHNpemVvZihzdHJ1Y3Qga29uZV9wcm9maWxlKSwKLQkucmVhZCA9IGtvbmVfc3lzZnNfcmVhZF9wcm9maWxlMSwKLQkud3JpdGUgPSBrb25lX3N5c2ZzX3dyaXRlX3Byb2ZpbGUxCi19OwotCi1zdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUga29uZV9wcm9maWxlMl9hdHRyID0gewotCS5hdHRyID0geyAubmFtZSA9ICJwcm9maWxlMiIsIC5tb2RlID0gMDY2MCB9LAotCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBrb25lX3Byb2ZpbGUpLAotCS5yZWFkID0ga29uZV9zeXNmc19yZWFkX3Byb2ZpbGUyLAotCS53cml0ZSA9IGtvbmVfc3lzZnNfd3JpdGVfcHJvZmlsZTIKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBrb25lX3Byb2ZpbGUzX2F0dHIgPSB7Ci0JLmF0dHIgPSB7IC5uYW1lID0gInByb2ZpbGUzIiwgLm1vZGUgPSAwNjYwIH0sCi0JLnNpemUgPSBzaXplb2Yoc3RydWN0IGtvbmVfcHJvZmlsZSksCi0JLnJlYWQgPSBrb25lX3N5c2ZzX3JlYWRfcHJvZmlsZTMsCi0JLndyaXRlID0ga29uZV9zeXNmc193cml0ZV9wcm9maWxlMwotfTsKLQotc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIGtvbmVfcHJvZmlsZTRfYXR0ciA9IHsKLQkuYXR0ciA9IHsgLm5hbWUgPSAicHJvZmlsZTQiLCAubW9kZSA9IDA2NjAgfSwKLQkuc2l6ZSA9IHNpemVvZihzdHJ1Y3Qga29uZV9wcm9maWxlKSwKLQkucmVhZCA9IGtvbmVfc3lzZnNfcmVhZF9wcm9maWxlNCwKLQkud3JpdGUgPSBrb25lX3N5c2ZzX3dyaXRlX3Byb2ZpbGU0Ci19OwotCi1zdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUga29uZV9wcm9maWxlNV9hdHRyID0gewotCS5hdHRyID0geyAubmFtZSA9ICJwcm9maWxlNSIsIC5tb2RlID0gMDY2MCB9LAotCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBrb25lX3Byb2ZpbGUpLAotCS5yZWFkID0ga29uZV9zeXNmc19yZWFkX3Byb2ZpbGU1LAotCS53cml0ZSA9IGtvbmVfc3lzZnNfd3JpdGVfcHJvZmlsZTUKLX07Ci0KLXN0YXRpYyBpbnQga29uZV9jcmVhdGVfc3lzZnNfYXR0cmlidXRlcyhzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKLXsKLQlpbnQgcmV0dmFsOwotCi0JcmV0dmFsID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZpbnRmLT5kZXYua29iaiwgJmtvbmVfYXR0cmlidXRlX2dyb3VwKTsKLQlpZiAocmV0dmFsKQotCQlnb3RvIGV4aXRfMTsKLQotCXJldHZhbCA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZrb25lX3NldHRpbmdzX2F0dHIpOwotCWlmIChyZXR2YWwpCi0JCWdvdG8gZXhpdF8yOwotCi0JcmV0dmFsID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJmtvbmVfcHJvZmlsZTFfYXR0cik7Ci0JaWYgKHJldHZhbCkKLQkJZ290byBleGl0XzM7Ci0KLQlyZXR2YWwgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJmludGYtPmRldi5rb2JqLCAma29uZV9wcm9maWxlMl9hdHRyKTsKLQlpZiAocmV0dmFsKQotCQlnb3RvIGV4aXRfNDsKLQotCXJldHZhbCA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZrb25lX3Byb2ZpbGUzX2F0dHIpOwotCWlmIChyZXR2YWwpCi0JCWdvdG8gZXhpdF81OwotCi0JcmV0dmFsID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJmtvbmVfcHJvZmlsZTRfYXR0cik7Ci0JaWYgKHJldHZhbCkKLQkJZ290byBleGl0XzY7Ci0KLQlyZXR2YWwgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJmludGYtPmRldi5rb2JqLCAma29uZV9wcm9maWxlNV9hdHRyKTsKLQlpZiAocmV0dmFsKQotCQlnb3RvIGV4aXRfNzsKLQotCXJldHVybiAwOwotCi1leGl0Xzc6Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJmtvbmVfcHJvZmlsZTRfYXR0cik7Ci1leGl0XzY6Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJmtvbmVfcHJvZmlsZTNfYXR0cik7Ci1leGl0XzU6Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJmtvbmVfcHJvZmlsZTJfYXR0cik7Ci1leGl0XzQ6Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJmtvbmVfcHJvZmlsZTFfYXR0cik7Ci1leGl0XzM6Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJmtvbmVfc2V0dGluZ3NfYXR0cik7Ci1leGl0XzI6Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZpbnRmLT5kZXYua29iaiwgJmtvbmVfYXR0cmlidXRlX2dyb3VwKTsKLWV4aXRfMToKLQlyZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgdm9pZCBrb25lX3JlbW92ZV9zeXNmc19hdHRyaWJ1dGVzKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQotewotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZrb25lX3Byb2ZpbGU1X2F0dHIpOwotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZrb25lX3Byb2ZpbGU0X2F0dHIpOwotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZrb25lX3Byb2ZpbGUzX2F0dHIpOwotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZrb25lX3Byb2ZpbGUyX2F0dHIpOwotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZrb25lX3Byb2ZpbGUxX2F0dHIpOwotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZrb25lX3NldHRpbmdzX2F0dHIpOwotCXN5c2ZzX3JlbW92ZV9ncm91cCgmaW50Zi0+ZGV2LmtvYmosICZrb25lX2F0dHJpYnV0ZV9ncm91cCk7Ci19Ci0KIHN0YXRpYyBpbnQga29uZV9pbml0X2tvbmVfZGV2aWNlX3N0cnVjdChzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiwKIAkJc3RydWN0IGtvbmVfZGV2aWNlICprb25lKQogewpAQCAtODE4LDMyICs3MTYsMjUgQEAKIAogCQlrb25lID0ga3phbGxvYyhzaXplb2YoKmtvbmUpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFrb25lKSB7Ci0JCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJjYW4ndCBhbGxvYyBkZXZpY2UgZGVzY3JpcHRvclxuIik7CisJCQloaWRfZXJyKGhkZXYsICJjYW4ndCBhbGxvYyBkZXZpY2UgZGVzY3JpcHRvclxuIik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCQloaWRfc2V0X2RydmRhdGEoaGRldiwga29uZSk7CiAKIAkJcmV0dmFsID0ga29uZV9pbml0X2tvbmVfZGV2aWNlX3N0cnVjdCh1c2JfZGV2LCBrb25lKTsKIAkJaWYgKHJldHZhbCkgewotCQkJZGV2X2VycigmaGRldi0+ZGV2LAotCQkJCQkiY291bGRuJ3QgaW5pdCBzdHJ1Y3Qga29uZV9kZXZpY2VcbiIpOworCQkJaGlkX2VycihoZGV2LCAiY291bGRuJ3QgaW5pdCBzdHJ1Y3Qga29uZV9kZXZpY2VcbiIpOwogCQkJZ290byBleGl0X2ZyZWU7CiAJCX0KIAotCQlyZXR2YWwgPSByb2NjYXRfY29ubmVjdChoZGV2KTsKKwkJcmV0dmFsID0gcm9jY2F0X2Nvbm5lY3Qoa29uZV9jbGFzcywgaGRldik7CiAJCWlmIChyZXR2YWwgPCAwKSB7Ci0JCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJjb3VsZG4ndCBpbml0IGNoYXIgZGV2XG4iKTsKKwkJCWhpZF9lcnIoaGRldiwgImNvdWxkbid0IGluaXQgY2hhciBkZXZcbiIpOwogCQkJLyogYmUgdG9sZXJhbnQgYWJvdXQgbm90IGdldHRpbmcgY2hyZGV2ICovCiAJCX0gZWxzZSB7CiAJCQlrb25lLT5yb2NjYXRfY2xhaW1lZCA9IDE7CiAJCQlrb25lLT5jaHJkZXZfbWlub3IgPSByZXR2YWw7CiAJCX0KLQotCQlyZXR2YWwgPSBrb25lX2NyZWF0ZV9zeXNmc19hdHRyaWJ1dGVzKGludGYpOwotCQlpZiAocmV0dmFsKSB7Ci0JCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJjYW5ub3QgY3JlYXRlIHN5c2ZzIGZpbGVzXG4iKTsKLQkJCWdvdG8gZXhpdF9mcmVlOwotCQl9CiAJfSBlbHNlIHsKIAkJaGlkX3NldF9kcnZkYXRhKGhkZXYsIE5VTEwpOwogCX0KQEAgLTg1NCw3ICs3NDUsNiBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLQogc3RhdGljIHZvaWQga29uZV9yZW1vdmVfc3BlY2lhbHMoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYpCiB7CiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGhkZXYtPmRldi5wYXJlbnQpOwpAQCAtODYyLDcgKzc1Miw2IEBACiAKIAlpZiAoaW50Zi0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZVByb3RvY29sCiAJCQk9PSBVU0JfSU5URVJGQUNFX1BST1RPQ09MX01PVVNFKSB7Ci0JCWtvbmVfcmVtb3ZlX3N5c2ZzX2F0dHJpYnV0ZXMoaW50Zik7CiAJCWtvbmUgPSBoaWRfZ2V0X2RydmRhdGEoaGRldik7CiAJCWlmIChrb25lLT5yb2NjYXRfY2xhaW1lZCkKIAkJCXJvY2NhdF9kaXNjb25uZWN0KGtvbmUtPmNocmRldl9taW5vcik7CkBAIC04NzYsMTkgKzc2NSwxOSBAQAogCiAJcmV0dmFsID0gaGlkX3BhcnNlKGhkZXYpOwogCWlmIChyZXR2YWwpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKIAkJZ290byBleGl0OwogCX0KIAogCXJldHZhbCA9IGhpZF9od19zdGFydChoZGV2LCBISURfQ09OTkVDVF9ERUZBVUxUKTsKIAlpZiAocmV0dmFsKSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAlyZXR2YWwgPSBrb25lX2luaXRfc3BlY2lhbHMoaGRldik7CiAJaWYgKHJldHZhbCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJjb3VsZG4ndCBpbnN0YWxsIG1vdXNlXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiY291bGRuJ3QgaW5zdGFsbCBtb3VzZVxuIik7CiAJCWdvdG8gZXhpdF9zdG9wOwogCX0KIApAQCAtMTAwNiwxMSArODk1LDI0IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGtvbmVfaW5pdCh2b2lkKQogewotCXJldHVybiBoaWRfcmVnaXN0ZXJfZHJpdmVyKCZrb25lX2RyaXZlcik7CisJaW50IHJldHZhbDsKKworCS8qIGNsYXNzIG5hbWUgaGFzIHRvIGJlIHNhbWUgYXMgZHJpdmVyIG5hbWUgKi8KKwlrb25lX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAia29uZSIpOworCWlmIChJU19FUlIoa29uZV9jbGFzcykpCisJCXJldHVybiBQVFJfRVJSKGtvbmVfY2xhc3MpOworCWtvbmVfY2xhc3MtPmRldl9hdHRycyA9IGtvbmVfYXR0cmlidXRlczsKKwlrb25lX2NsYXNzLT5kZXZfYmluX2F0dHJzID0ga29uZV9iaW5fYXR0cmlidXRlczsKKworCXJldHZhbCA9IGhpZF9yZWdpc3Rlcl9kcml2ZXIoJmtvbmVfZHJpdmVyKTsKKwlpZiAocmV0dmFsKQorCQljbGFzc19kZXN0cm95KGtvbmVfY2xhc3MpOworCXJldHVybiByZXR2YWw7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBrb25lX2V4aXQodm9pZCkKIHsKKwljbGFzc19kZXN0cm95KGtvbmVfY2xhc3MpOwogCWhpZF91bnJlZ2lzdGVyX2RyaXZlcigma29uZV9kcml2ZXIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LWtvbmUuaCBiL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQta29uZS5oCmluZGV4IDEzMGQ2NTYuLjY0YWJiNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQta29uZS5oCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQta29uZS5oCkBAIC0xNCwxNCArMTQsMTEgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKLSNwcmFnbWEgcGFjayhwdXNoKQotI3ByYWdtYSBwYWNrKDEpCi0KIHN0cnVjdCBrb25lX2tleXN0cm9rZSB7CiAJdWludDhfdCBrZXk7CiAJdWludDhfdCBhY3Rpb247CiAJdWludDE2X3QgcGVyaW9kOyAvKiBpbiBtaWxsaXNlY29uZHMgKi8KLX07Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CiAKIGVudW0ga29uZV9rZXlzdHJva2VfYnV0dG9ucyB7CiAJa29uZV9rZXlzdHJva2VfYnV0dG9uXzEgPSAweGYwLCAvKiBsZWZ0IG1vdXNlIGJ1dHRvbiAqLwpAQCAtNDQsNyArNDEsNyBAQAogCXVpbnQ4X3QgbWFjcm9fbmFtZVsxNl07IC8qIGNhbiBiZSBtYXggMTUgY2hhcnMgbG9uZyAqLwogCXVpbnQ4X3QgY291bnQ7CiAJc3RydWN0IGtvbmVfa2V5c3Ryb2tlIGtleXN0cm9rZXNbMjBdOwotfTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKIAogZW51bSBrb25lX2J1dHRvbl9pbmZvX3R5cGVzIHsKIAkvKiB2YWxpZCBidXR0b24gdHlwZXMgdW50aWwgZmlybXdhcmUgMS4zMiAqLwpAQCAtOTUsNyArOTIsNyBAQAogCXVpbnQ4X3QgcmVkOyAgIC8qIHJhbmdlIDB4MDAtMHhmZiAqLwogCXVpbnQ4X3QgZ3JlZW47IC8qIHJhbmdlIDB4MDAtMHhmZiAqLwogCXVpbnQ4X3QgYmx1ZTsgIC8qIHJhbmdlIDB4MDAtMHhmZiAqLwotfTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKIAogc3RydWN0IGtvbmVfcHJvZmlsZSB7CiAJdWludDE2X3Qgc2l6ZTsgLyogYWx3YXlzIDk3NSAqLwpAQCAtMTMwLDcgKzEyNyw3IEBACiAJc3RydWN0IGtvbmVfYnV0dG9uX2luZm8gYnV0dG9uX2luZm9zWzhdOwogCiAJdWludDE2X3QgY2hlY2tzdW07IC8qIFxicmllZiBob2xkcyBjaGVja3N1bSBvZiBzdHJ1Y3QgKi8KLX07Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CiAKIGVudW0ga29uZV9wb2xsaW5nX3JhdGVzIHsKIAlrb25lX3BvbGxpbmdfcmF0ZV8xMjUgPSAxLApAQCAtMTQ3LDcgKzE0NCw3IEBACiAJdWludDhfdCAgY2FsaWJyYXRpb25fZGF0YVs0XTsKIAl1aW50OF90ICB1bmtub3duM1syXTsKIAl1aW50MTZfdCBjaGVja3N1bTsKLX07Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CiAKIC8qCiAgKiAxMiBieXRlIG1vdXNlIGV2ZW50IHJlYWQgYnkgaW50ZXJydXB0X3JlYWQKQEAgLTE2Myw3ICsxNjAsNyBAQAogCXVpbnQ4X3QgZXZlbnQ7CiAJdWludDhfdCB2YWx1ZTsgLyogcHJlc3MgPSAwLCByZWxlYXNlID0gMSAqLwogCXVpbnQ4X3QgbWFjcm9fa2V5OyAvKiAwIHRvIDggKi8KLX07Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CiAKIGVudW0ga29uZV9tb3VzZV9ldmVudHMgewogCS8qIG9zZCBldmVudHMgYXJlIHRob3VnaHQgdG8gYmUgZGlzcGxheSBvbiBzY3JlZW4gKi8KQEAgLTE5MSw5ICsxODgsNyBAQAogCXVpbnQ4X3QgZXZlbnQ7CiAJdWludDhfdCB2YWx1ZTsgLyogaG9sZHMgZHBpIG9yIHByb2ZpbGUgdmFsdWUgKi8KIAl1aW50OF90IGtleTsgLyogbWFjcm8ga2V5IG9uIG92ZXJsb25nIG1hY3JvIGV4ZWN1dGlvbiAqLwotfTsKLQotI3ByYWdtYSBwYWNrKHBvcCkKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKIAogc3RydWN0IGtvbmVfZGV2aWNlIHsKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1rb25lcGx1cy5jIGIvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1rb25lcGx1cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MDhjOGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LWtvbmVwbHVzLmMKQEAgLTAsMCArMSw4MzcgQEAKKy8qCisgKiBSb2NjYXQgS29uZVsrXSBkcml2ZXIgZm9yIExpbnV4CisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIFN0ZWZhbiBBY2hhdHogPGVyYXpvcl9kZUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisgKi8KKworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworLyoKKyAqIFJvY2NhdCBLb25lWytdIGlzIGFuIHVwZGF0ZWQvaW1wcm92ZWQgdmVyc2lvbiBvZiB0aGUgS29uZSB3aXRoIG1vcmUgbWVtb3J5CisgKiBhbmQgZnVuY3Rpb25hbGl0eSBhbmQgd2l0aG91dCB0aGUgbm9uLXN0YW5kYXJkIGJlaGF2aW91cnMgdGhlIEtvbmUgaGFkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlICJoaWQtaWRzLmgiCisjaW5jbHVkZSAiaGlkLXJvY2NhdC5oIgorI2luY2x1ZGUgImhpZC1yb2NjYXQta29uZXBsdXMuaCIKKworc3RhdGljIHVpbnQgcHJvZmlsZV9udW1iZXJzWzVdID0gezAsIDEsIDIsIDMsIDR9OworCitzdGF0aWMgc3RydWN0IGNsYXNzICprb25lcGx1c19jbGFzczsKKworc3RhdGljIHZvaWQga29uZXBsdXNfcHJvZmlsZV9hY3RpdmF0ZWQoc3RydWN0IGtvbmVwbHVzX2RldmljZSAqa29uZXBsdXMsCisJCXVpbnQgbmV3X3Byb2ZpbGUpCit7CisJa29uZXBsdXMtPmFjdHVhbF9wcm9maWxlID0gbmV3X3Byb2ZpbGU7Cit9CisKK3N0YXRpYyBpbnQga29uZXBsdXNfc2VuZF9jb250cm9sKHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2LCB1aW50IHZhbHVlLAorCQllbnVtIGtvbmVwbHVzX2NvbnRyb2xfcmVxdWVzdHMgcmVxdWVzdCkKK3sKKwlpbnQgbGVuOworCXN0cnVjdCBrb25lcGx1c19jb250cm9sICpjb250cm9sOworCisJaWYgKChyZXF1ZXN0ID09IEtPTkVQTFVTX0NPTlRST0xfUkVRVUVTVF9QUk9GSUxFX1NFVFRJTkdTIHx8CisJCQlyZXF1ZXN0ID09IEtPTkVQTFVTX0NPTlRST0xfUkVRVUVTVF9QUk9GSUxFX0JVVFRPTlMpICYmCisJCQl2YWx1ZSA+IDQpCisJCXJldHVybiAtRUlOVkFMOworCisJY29udHJvbCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19jb250cm9sKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjb250cm9sKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNvbnRyb2wtPmNvbW1hbmQgPSBLT05FUExVU19DT01NQU5EX0NPTlRST0w7CisJY29udHJvbC0+dmFsdWUgPSB2YWx1ZTsKKwljb250cm9sLT5yZXF1ZXN0ID0gcmVxdWVzdDsKKworCWxlbiA9IHVzYl9jb250cm9sX21zZyh1c2JfZGV2LCB1c2Jfc25kY3RybHBpcGUodXNiX2RldiwgMCksCisJCQlVU0JfUkVRX1NFVF9DT05GSUdVUkFUSU9OLAorCQkJVVNCX1RZUEVfQ0xBU1MgfCBVU0JfUkVDSVBfSU5URVJGQUNFIHwgVVNCX0RJUl9PVVQsCisJCQlLT05FUExVU19VU0JfQ09NTUFORF9DT05UUk9MLCAwLCBjb250cm9sLAorCQkJc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19jb250cm9sKSwKKwkJCVVTQl9DVFJMX1NFVF9USU1FT1VUKTsKKworCWtmcmVlKGNvbnRyb2wpOworCisJaWYgKGxlbiAhPSBzaXplb2Yoc3RydWN0IGtvbmVwbHVzX2NvbnRyb2wpKQorCQlyZXR1cm4gbGVuOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQga29uZXBsdXNfcmVjZWl2ZShzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiwgdWludCB1c2JfY29tbWFuZCwKKwkJdm9pZCAqYnVmLCB1aW50IHNpemUpIHsKKwlpbnQgbGVuOworCisJbGVuID0gdXNiX2NvbnRyb2xfbXNnKHVzYl9kZXYsIHVzYl9yY3ZjdHJscGlwZSh1c2JfZGV2LCAwKSwKKwkJCVVTQl9SRVFfQ0xFQVJfRkVBVFVSRSwKKwkJCVVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSB8IFVTQl9ESVJfSU4sCisJCQl1c2JfY29tbWFuZCwgMCwgYnVmLCBzaXplLCBVU0JfQ1RSTF9TRVRfVElNRU9VVCk7CisKKwlyZXR1cm4gKGxlbiAhPSBzaXplKSA/IC1FSU8gOiAwOworfQorCitzdGF0aWMgaW50IGtvbmVwbHVzX3JlY2VpdmVfY29udHJvbF9zdGF0dXMoc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYpCit7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3Qga29uZXBsdXNfY29udHJvbCAqY29udHJvbDsKKworCWNvbnRyb2wgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qga29uZXBsdXNfY29udHJvbCksIEdGUF9LRVJORUwpOworCWlmICghY29udHJvbCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkbyB7CisJCXJldHZhbCA9IGtvbmVwbHVzX3JlY2VpdmUodXNiX2RldiwgS09ORVBMVVNfVVNCX0NPTU1BTkRfQ09OVFJPTCwKKwkJCQljb250cm9sLCBzaXplb2Yoc3RydWN0IGtvbmVwbHVzX2NvbnRyb2wpKTsKKworCQkvKiBjaGVjayBpZiB3ZSBnZXQgYSBjb21wbGV0ZWx5IHdyb25nIGFuc3dlciAqLworCQlpZiAocmV0dmFsKQorCQkJZ290byBvdXQ7CisKKwkJaWYgKGNvbnRyb2wtPnZhbHVlID09IEtPTkVQTFVTX0NPTlRST0xfUkVRVUVTVF9TVEFUVVNfT0spIHsKKwkJCXJldHZhbCA9IDA7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qIGluZGljYXRlcyB0aGF0IGhhcmR3YXJlIG5lZWRzIHNvbWUgbW9yZSB0aW1lIHRvIGNvbXBsZXRlIGFjdGlvbiAqLworCQlpZiAoY29udHJvbC0+dmFsdWUgPT0gS09ORVBMVVNfQ09OVFJPTF9SRVFVRVNUX1NUQVRVU19XQUlUKSB7CisJCQltc2xlZXAoNTAwKTsgLyogd2luZG93cyBkcml2ZXIgdXNlcyAxMDAwICovCisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIHNlZW1zIHRvIGJlIGNyaXRpY2FsIC0gcmVwbHVnIG5lY2Vzc2FyeSAqLworCQlpZiAoY29udHJvbC0+dmFsdWUgPT0gS09ORVBMVVNfQ09OVFJPTF9SRVFVRVNUX1NUQVRVU19PVkVSTE9BRCkgeworCQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJZGV2X2VycigmdXNiX2Rldi0+ZGV2LCAia29uZXBsdXNfcmVjZWl2ZV9jb250cm9sX3N0YXR1czogIgorCQkJCSJ1bmtub3duIHJlc3BvbnNlIHZhbHVlIDB4JXhcbiIsIGNvbnRyb2wtPnZhbHVlKTsKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisKKwl9IHdoaWxlICgxKTsKK291dDoKKwlrZnJlZShjb250cm9sKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IGtvbmVwbHVzX3NlbmQoc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsIHVpbnQgY29tbWFuZCwKKwkJdm9pZCAqYnVmLCB1aW50IHNpemUpIHsKKwlpbnQgbGVuOworCisJbGVuID0gdXNiX2NvbnRyb2xfbXNnKHVzYl9kZXYsIHVzYl9zbmRjdHJscGlwZSh1c2JfZGV2LCAwKSwKKwkJCVVTQl9SRVFfU0VUX0NPTkZJR1VSQVRJT04sCisJCQlVU0JfVFlQRV9DTEFTUyB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UgfCBVU0JfRElSX09VVCwKKwkJCWNvbW1hbmQsIDAsIGJ1Ziwgc2l6ZSwgVVNCX0NUUkxfU0VUX1RJTUVPVVQpOworCisJaWYgKGxlbiAhPSBzaXplKQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChrb25lcGx1c19yZWNlaXZlX2NvbnRyb2xfc3RhdHVzKHVzYl9kZXYpKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGtvbmVwbHVzX3NlbGVjdF9wcm9maWxlKHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2LCB1aW50IG51bWJlciwKKwkJZW51bSBrb25lcGx1c19jb250cm9sX3JlcXVlc3RzIHJlcXVlc3QpCit7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IGtvbmVwbHVzX3NlbmRfY29udHJvbCh1c2JfZGV2LCBudW1iZXIsIHJlcXVlc3QpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwkvKiBhbGxvdyB0aW1lIHRvIHNldHRsZSB0aGluZ3MgLSB3aW5kb3dzIGRyaXZlciB1c2VzIDUwMCAqLworCW1zbGVlcCgxMDApOworCisJcmV0dmFsID0ga29uZXBsdXNfcmVjZWl2ZV9jb250cm9sX3N0YXR1cyh1c2JfZGV2KTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQga29uZXBsdXNfZ2V0X2luZm8oc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsCisJCXN0cnVjdCBrb25lcGx1c19pbmZvICpidWYpCit7CisJcmV0dXJuIGtvbmVwbHVzX3JlY2VpdmUodXNiX2RldiwgS09ORVBMVVNfVVNCX0NPTU1BTkRfSU5GTywKKwkJCWJ1Ziwgc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19pbmZvKSk7Cit9CisKK3N0YXRpYyBpbnQga29uZXBsdXNfZ2V0X3Byb2ZpbGVfc2V0dGluZ3Moc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsCisJCXN0cnVjdCBrb25lcGx1c19wcm9maWxlX3NldHRpbmdzICpidWYsIHVpbnQgbnVtYmVyKQoreworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBrb25lcGx1c19zZWxlY3RfcHJvZmlsZSh1c2JfZGV2LCBudW1iZXIsCisJCQlLT05FUExVU19DT05UUk9MX1JFUVVFU1RfUFJPRklMRV9TRVRUSU5HUyk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHVybiBrb25lcGx1c19yZWNlaXZlKHVzYl9kZXYsIEtPTkVQTFVTX1VTQl9DT01NQU5EX1BST0ZJTEVfU0VUVElOR1MsCisJCQlidWYsIHNpemVvZihzdHJ1Y3Qga29uZXBsdXNfcHJvZmlsZV9zZXR0aW5ncykpOworfQorCitzdGF0aWMgaW50IGtvbmVwbHVzX3NldF9wcm9maWxlX3NldHRpbmdzKHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2LAorCQlzdHJ1Y3Qga29uZXBsdXNfcHJvZmlsZV9zZXR0aW5ncyBjb25zdCAqc2V0dGluZ3MpCit7CisJcmV0dXJuIGtvbmVwbHVzX3NlbmQodXNiX2RldiwgS09ORVBMVVNfVVNCX0NPTU1BTkRfUFJPRklMRV9TRVRUSU5HUywKKwkJCSh2b2lkICopc2V0dGluZ3MsIHNpemVvZihzdHJ1Y3Qga29uZXBsdXNfcHJvZmlsZV9zZXR0aW5ncykpOworfQorCitzdGF0aWMgaW50IGtvbmVwbHVzX2dldF9wcm9maWxlX2J1dHRvbnMoc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsCisJCXN0cnVjdCBrb25lcGx1c19wcm9maWxlX2J1dHRvbnMgKmJ1ZiwgaW50IG51bWJlcikKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0ga29uZXBsdXNfc2VsZWN0X3Byb2ZpbGUodXNiX2RldiwgbnVtYmVyLAorCQkJS09ORVBMVVNfQ09OVFJPTF9SRVFVRVNUX1BST0ZJTEVfQlVUVE9OUyk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHVybiBrb25lcGx1c19yZWNlaXZlKHVzYl9kZXYsIEtPTkVQTFVTX1VTQl9DT01NQU5EX1BST0ZJTEVfQlVUVE9OUywKKwkJCWJ1Ziwgc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX2J1dHRvbnMpKTsKK30KKworc3RhdGljIGludCBrb25lcGx1c19zZXRfcHJvZmlsZV9idXR0b25zKHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2LAorCQlzdHJ1Y3Qga29uZXBsdXNfcHJvZmlsZV9idXR0b25zIGNvbnN0ICpidXR0b25zKQoreworCXJldHVybiBrb25lcGx1c19zZW5kKHVzYl9kZXYsIEtPTkVQTFVTX1VTQl9DT01NQU5EX1BST0ZJTEVfQlVUVE9OUywKKwkJCSh2b2lkICopYnV0dG9ucywgc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX2J1dHRvbnMpKTsKK30KKworLyogcmV0dmFsIGlzIDAtNCBvbiBzdWNjZXNzLCA8IDAgb24gZXJyb3IgKi8KK3N0YXRpYyBpbnQga29uZXBsdXNfZ2V0X3N0YXJ0dXBfcHJvZmlsZShzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldikKK3sKKwlzdHJ1Y3Qga29uZXBsdXNfc3RhcnR1cF9wcm9maWxlICpidWY7CisJaW50IHJldHZhbDsKKworCWJ1ZiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19zdGFydHVwX3Byb2ZpbGUpLCBHRlBfS0VSTkVMKTsKKworCXJldHZhbCA9IGtvbmVwbHVzX3JlY2VpdmUodXNiX2RldiwgS09ORVBMVVNfVVNCX0NPTU1BTkRfU1RBUlRVUF9QUk9GSUxFLAorCQkJYnVmLCBzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3N0YXJ0dXBfcHJvZmlsZSkpOworCisJaWYgKHJldHZhbCkKKwkJZ290byBvdXQ7CisKKwlyZXR2YWwgPSBidWYtPnN0YXJ0dXBfcHJvZmlsZTsKK291dDoKKwlrZnJlZShidWYpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQga29uZXBsdXNfc2V0X3N0YXJ0dXBfcHJvZmlsZShzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiwKKwkJaW50IHN0YXJ0dXBfcHJvZmlsZSkKK3sKKwlzdHJ1Y3Qga29uZXBsdXNfc3RhcnR1cF9wcm9maWxlIGJ1ZjsKKworCWJ1Zi5jb21tYW5kID0gS09ORVBMVVNfQ09NTUFORF9TVEFSVFVQX1BST0ZJTEU7CisJYnVmLnNpemUgPSBzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3N0YXJ0dXBfcHJvZmlsZSk7CisJYnVmLnN0YXJ0dXBfcHJvZmlsZSA9IHN0YXJ0dXBfcHJvZmlsZTsKKworCXJldHVybiBrb25lcGx1c19zZW5kKHVzYl9kZXYsIEtPTkVQTFVTX1VTQl9DT01NQU5EX1NUQVJUVVBfUFJPRklMRSwKKwkJCShjaGFyICopJmJ1Ziwgc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX2J1dHRvbnMpKTsKK30KKworc3RhdGljIHNzaXplX3Qga29uZXBsdXNfc3lzZnNfcmVhZChzdHJ1Y3QgZmlsZSAqZnAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQljaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCwKKwkJc2l6ZV90IHJlYWxfc2l6ZSwgdWludCBjb21tYW5kKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9CisJCQljb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaiktPnBhcmVudC0+cGFyZW50OworCXN0cnVjdCBrb25lcGx1c19kZXZpY2UgKmtvbmVwbHVzID0gaGlkX2dldF9kcnZkYXRhKGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiA9IGludGVyZmFjZV90b191c2JkZXYodG9fdXNiX2ludGVyZmFjZShkZXYpKTsKKwlpbnQgcmV0dmFsOworCisJaWYgKG9mZiAhPSAwIHx8IGNvdW50ICE9IHJlYWxfc2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZrb25lcGx1cy0+a29uZXBsdXNfbG9jayk7CisJcmV0dmFsID0ga29uZXBsdXNfcmVjZWl2ZSh1c2JfZGV2LCBjb21tYW5kLCBidWYsIHJlYWxfc2l6ZSk7CisJbXV0ZXhfdW5sb2NrKCZrb25lcGx1cy0+a29uZXBsdXNfbG9jayk7CisKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJcmV0dXJuIHJlYWxfc2l6ZTsKK30KKworc3RhdGljIHNzaXplX3Qga29uZXBsdXNfc3lzZnNfd3JpdGUoc3RydWN0IGZpbGUgKmZwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJdm9pZCBjb25zdCAqYnVmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQsCisJCXNpemVfdCByZWFsX3NpemUsIHVpbnQgY29tbWFuZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPQorCQkJY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopLT5wYXJlbnQtPnBhcmVudDsKKwlzdHJ1Y3Qga29uZXBsdXNfZGV2aWNlICprb25lcGx1cyA9IGhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KHRvX3VzYl9pbnRlcmZhY2UoZGV2KSk7CisJaW50IHJldHZhbDsKKworCWlmIChvZmYgIT0gMCB8fCBjb3VudCAhPSByZWFsX3NpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygma29uZXBsdXMtPmtvbmVwbHVzX2xvY2spOworCXJldHZhbCA9IGtvbmVwbHVzX3NlbmQodXNiX2RldiwgY29tbWFuZCwgKHZvaWQgKilidWYsIHJlYWxfc2l6ZSk7CisJbXV0ZXhfdW5sb2NrKCZrb25lcGx1cy0+a29uZXBsdXNfbG9jayk7CisKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJcmV0dXJuIHJlYWxfc2l6ZTsKK30KKworc3RhdGljIHNzaXplX3Qga29uZXBsdXNfc3lzZnNfd3JpdGVfbWFjcm8oc3RydWN0IGZpbGUgKmZwLAorCQlzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKKwkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBrb25lcGx1c19zeXNmc193cml0ZShmcCwga29iaiwgYnVmLCBvZmYsIGNvdW50LAorCQkJc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19tYWNybyksIEtPTkVQTFVTX1VTQl9DT01NQU5EX01BQ1JPKTsKK30KKworc3RhdGljIHNzaXplX3Qga29uZXBsdXNfc3lzZnNfcmVhZF9zZW5zb3Ioc3RydWN0IGZpbGUgKmZwLAorCQlzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKKwkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBrb25lcGx1c19zeXNmc19yZWFkKGZwLCBrb2JqLCBidWYsIG9mZiwgY291bnQsCisJCQlzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3NlbnNvciksIEtPTkVQTFVTX1VTQl9DT01NQU5EX1NFTlNPUik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGtvbmVwbHVzX3N5c2ZzX3dyaXRlX3NlbnNvcihzdHJ1Y3QgZmlsZSAqZnAsCisJCXN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAorCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIGtvbmVwbHVzX3N5c2ZzX3dyaXRlKGZwLCBrb2JqLCBidWYsIG9mZiwgY291bnQsCisJCQlzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3NlbnNvciksIEtPTkVQTFVTX1VTQl9DT01NQU5EX1NFTlNPUik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGtvbmVwbHVzX3N5c2ZzX3dyaXRlX3RjdShzdHJ1Y3QgZmlsZSAqZnAsCisJCXN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAorCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIGtvbmVwbHVzX3N5c2ZzX3dyaXRlKGZwLCBrb2JqLCBidWYsIG9mZiwgY291bnQsCisJCQlzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3RjdSksIEtPTkVQTFVTX1VTQl9DT01NQU5EX1RDVSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGtvbmVwbHVzX3N5c2ZzX3JlYWRfdGN1X2ltYWdlKHN0cnVjdCBmaWxlICpmcCwKKwkJc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsCisJCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3sKKwlyZXR1cm4ga29uZXBsdXNfc3lzZnNfcmVhZChmcCwga29iaiwgYnVmLCBvZmYsIGNvdW50LAorCQkJc2l6ZW9mKHN0cnVjdCBrb25lcGx1c190Y3VfaW1hZ2UpLCBLT05FUExVU19VU0JfQ09NTUFORF9UQ1UpOworfQorCitzdGF0aWMgc3NpemVfdCBrb25lcGx1c19zeXNmc19yZWFkX3Byb2ZpbGV4X3NldHRpbmdzKHN0cnVjdCBmaWxlICpmcCwKKwkJc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsCisJCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPQorCQkJY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopLT5wYXJlbnQtPnBhcmVudDsKKwlzdHJ1Y3Qga29uZXBsdXNfZGV2aWNlICprb25lcGx1cyA9IGhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CisKKwlpZiAob2ZmID49IHNpemVvZihzdHJ1Y3Qga29uZXBsdXNfcHJvZmlsZV9zZXR0aW5ncykpCisJCXJldHVybiAwOworCisJaWYgKG9mZiArIGNvdW50ID4gc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX3NldHRpbmdzKSkKKwkJY291bnQgPSBzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3Byb2ZpbGVfc2V0dGluZ3MpIC0gb2ZmOworCisJbXV0ZXhfbG9jaygma29uZXBsdXMtPmtvbmVwbHVzX2xvY2spOworCW1lbWNweShidWYsICgodm9pZCBjb25zdCAqKSZrb25lcGx1cy0+cHJvZmlsZV9zZXR0aW5nc1sqKHVpbnQgKikoYXR0ci0+cHJpdmF0ZSldKSArIG9mZiwKKwkJCWNvdW50KTsKKwltdXRleF91bmxvY2soJmtvbmVwbHVzLT5rb25lcGx1c19sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qga29uZXBsdXNfc3lzZnNfd3JpdGVfcHJvZmlsZV9zZXR0aW5ncyhzdHJ1Y3QgZmlsZSAqZnAsCisJCXN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAorCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0KKwkJCWNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKS0+cGFyZW50LT5wYXJlbnQ7CisJc3RydWN0IGtvbmVwbHVzX2RldmljZSAqa29uZXBsdXMgPSBoaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldikpOworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldih0b191c2JfaW50ZXJmYWNlKGRldikpOworCWludCByZXR2YWwgPSAwOworCWludCBkaWZmZXJlbmNlOworCWludCBwcm9maWxlX251bWJlcjsKKwlzdHJ1Y3Qga29uZXBsdXNfcHJvZmlsZV9zZXR0aW5ncyAqcHJvZmlsZV9zZXR0aW5nczsKKworCWlmIChvZmYgIT0gMCB8fCBjb3VudCAhPSBzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3Byb2ZpbGVfc2V0dGluZ3MpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXByb2ZpbGVfbnVtYmVyID0gKChzdHJ1Y3Qga29uZXBsdXNfcHJvZmlsZV9zZXR0aW5ncyBjb25zdCAqKWJ1ZiktPm51bWJlcjsKKwlwcm9maWxlX3NldHRpbmdzID0gJmtvbmVwbHVzLT5wcm9maWxlX3NldHRpbmdzW3Byb2ZpbGVfbnVtYmVyXTsKKworCW11dGV4X2xvY2soJmtvbmVwbHVzLT5rb25lcGx1c19sb2NrKTsKKwlkaWZmZXJlbmNlID0gbWVtY21wKGJ1ZiwgcHJvZmlsZV9zZXR0aW5ncywKKwkJCXNpemVvZihzdHJ1Y3Qga29uZXBsdXNfcHJvZmlsZV9zZXR0aW5ncykpOworCWlmIChkaWZmZXJlbmNlKSB7CisJCXJldHZhbCA9IGtvbmVwbHVzX3NldF9wcm9maWxlX3NldHRpbmdzKHVzYl9kZXYsCisJCQkJKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX3NldHRpbmdzIGNvbnN0ICopYnVmKTsKKwkJaWYgKCFyZXR2YWwpCisJCQltZW1jcHkocHJvZmlsZV9zZXR0aW5ncywgYnVmLAorCQkJCQlzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3Byb2ZpbGVfc2V0dGluZ3MpKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZrb25lcGx1cy0+a29uZXBsdXNfbG9jayk7CisKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJcmV0dXJuIHNpemVvZihzdHJ1Y3Qga29uZXBsdXNfcHJvZmlsZV9zZXR0aW5ncyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGtvbmVwbHVzX3N5c2ZzX3JlYWRfcHJvZmlsZXhfYnV0dG9ucyhzdHJ1Y3QgZmlsZSAqZnAsCisJCXN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAorCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0KKwkJCWNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKS0+cGFyZW50LT5wYXJlbnQ7CisJc3RydWN0IGtvbmVwbHVzX2RldmljZSAqa29uZXBsdXMgPSBoaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldikpOworCisJaWYgKG9mZiA+PSBzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3Byb2ZpbGVfYnV0dG9ucykpCisJCXJldHVybiAwOworCisJaWYgKG9mZiArIGNvdW50ID4gc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX2J1dHRvbnMpKQorCQljb3VudCA9IHNpemVvZihzdHJ1Y3Qga29uZXBsdXNfcHJvZmlsZV9idXR0b25zKSAtIG9mZjsKKworCW11dGV4X2xvY2soJmtvbmVwbHVzLT5rb25lcGx1c19sb2NrKTsKKwltZW1jcHkoYnVmLCAoKHZvaWQgY29uc3QgKikma29uZXBsdXMtPnByb2ZpbGVfYnV0dG9uc1sqKHVpbnQgKikoYXR0ci0+cHJpdmF0ZSldKSArIG9mZiwKKwkJCWNvdW50KTsKKwltdXRleF91bmxvY2soJmtvbmVwbHVzLT5rb25lcGx1c19sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qga29uZXBsdXNfc3lzZnNfd3JpdGVfcHJvZmlsZV9idXR0b25zKHN0cnVjdCBmaWxlICpmcCwKKwkJc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsCisJCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPQorCQkJY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopLT5wYXJlbnQtPnBhcmVudDsKKwlzdHJ1Y3Qga29uZXBsdXNfZGV2aWNlICprb25lcGx1cyA9IGhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KHRvX3VzYl9pbnRlcmZhY2UoZGV2KSk7CisJaW50IHJldHZhbCA9IDA7CisJaW50IGRpZmZlcmVuY2U7CisJdWludCBwcm9maWxlX251bWJlcjsKKwlzdHJ1Y3Qga29uZXBsdXNfcHJvZmlsZV9idXR0b25zICpwcm9maWxlX2J1dHRvbnM7CisKKwlpZiAob2ZmICE9IDAgfHwgY291bnQgIT0gc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX2J1dHRvbnMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXByb2ZpbGVfbnVtYmVyID0gKChzdHJ1Y3Qga29uZXBsdXNfcHJvZmlsZV9idXR0b25zIGNvbnN0ICopYnVmKS0+bnVtYmVyOworCXByb2ZpbGVfYnV0dG9ucyA9ICZrb25lcGx1cy0+cHJvZmlsZV9idXR0b25zW3Byb2ZpbGVfbnVtYmVyXTsKKworCW11dGV4X2xvY2soJmtvbmVwbHVzLT5rb25lcGx1c19sb2NrKTsKKwlkaWZmZXJlbmNlID0gbWVtY21wKGJ1ZiwgcHJvZmlsZV9idXR0b25zLAorCQkJc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX2J1dHRvbnMpKTsKKwlpZiAoZGlmZmVyZW5jZSkgeworCQlyZXR2YWwgPSBrb25lcGx1c19zZXRfcHJvZmlsZV9idXR0b25zKHVzYl9kZXYsCisJCQkJKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX2J1dHRvbnMgY29uc3QgKilidWYpOworCQlpZiAoIXJldHZhbCkKKwkJCW1lbWNweShwcm9maWxlX2J1dHRvbnMsIGJ1ZiwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX2J1dHRvbnMpKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZrb25lcGx1cy0+a29uZXBsdXNfbG9jayk7CisKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJcmV0dXJuIHNpemVvZihzdHJ1Y3Qga29uZXBsdXNfcHJvZmlsZV9idXR0b25zKTsKK30KKworc3RhdGljIHNzaXplX3Qga29uZXBsdXNfc3lzZnNfc2hvd19zdGFydHVwX3Byb2ZpbGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBrb25lcGx1c19kZXZpY2UgKmtvbmVwbHVzID0KKwkJCWhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2LT5wYXJlbnQtPnBhcmVudCkpOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBrb25lcGx1cy0+c3RhcnR1cF9wcm9maWxlKTsKK30KKworc3RhdGljIHNzaXplX3Qga29uZXBsdXNfc3lzZnNfc2V0X3N0YXJ0dXBfcHJvZmlsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyIGNvbnN0ICpidWYsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBrb25lcGx1c19kZXZpY2UgKmtvbmVwbHVzOworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2OworCXVuc2lnbmVkIGxvbmcgcHJvZmlsZTsKKwlpbnQgcmV0dmFsOworCisJZGV2ID0gZGV2LT5wYXJlbnQtPnBhcmVudDsKKwlrb25lcGx1cyA9IGhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CisJdXNiX2RldiA9IGludGVyZmFjZV90b191c2JkZXYodG9fdXNiX2ludGVyZmFjZShkZXYpKTsKKworCXJldHZhbCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZwcm9maWxlKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJbXV0ZXhfbG9jaygma29uZXBsdXMtPmtvbmVwbHVzX2xvY2spOworCXJldHZhbCA9IGtvbmVwbHVzX3NldF9zdGFydHVwX3Byb2ZpbGUodXNiX2RldiwgcHJvZmlsZSk7CisJbXV0ZXhfdW5sb2NrKCZrb25lcGx1cy0+a29uZXBsdXNfbG9jayk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgc3NpemVfdCBrb25lcGx1c19zeXNmc19zaG93X2FjdHVhbF9wcm9maWxlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qga29uZXBsdXNfZGV2aWNlICprb25lcGx1cyA9CisJCQloaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldi0+cGFyZW50LT5wYXJlbnQpKTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwga29uZXBsdXMtPmFjdHVhbF9wcm9maWxlKTsKK30KKworc3RhdGljIHNzaXplX3Qga29uZXBsdXNfc3lzZnNfc2hvd19maXJtd2FyZV92ZXJzaW9uKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qga29uZXBsdXNfZGV2aWNlICprb25lcGx1cyA9CisJCQloaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldi0+cGFyZW50LT5wYXJlbnQpKTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwga29uZXBsdXMtPmluZm8uZmlybXdhcmVfdmVyc2lvbik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBrb25lcGx1c19hdHRyaWJ1dGVzW10gPSB7CisJX19BVFRSKHN0YXJ0dXBfcHJvZmlsZSwgMDY2MCwKKwkJCWtvbmVwbHVzX3N5c2ZzX3Nob3dfc3RhcnR1cF9wcm9maWxlLAorCQkJa29uZXBsdXNfc3lzZnNfc2V0X3N0YXJ0dXBfcHJvZmlsZSksCisJX19BVFRSKGFjdHVhbF9wcm9maWxlLCAwNDQwLAorCQkJa29uZXBsdXNfc3lzZnNfc2hvd19hY3R1YWxfcHJvZmlsZSwgTlVMTCksCisJX19BVFRSKGZpcm13YXJlX3ZlcnNpb24sIDA0NDAsCisJCQlrb25lcGx1c19zeXNmc19zaG93X2Zpcm13YXJlX3ZlcnNpb24sIE5VTEwpLAorCV9fQVRUUl9OVUxMCit9OworCitzdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUga29uZXBsdXNfYmluX2F0dHJpYnV0ZXNbXSA9IHsKKwl7CisJCS5hdHRyID0geyAubmFtZSA9ICJzZW5zb3IiLCAubW9kZSA9IDAyMjAgfSwKKwkJLnNpemUgPSBzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3NlbnNvciksCisJCS5yZWFkID0ga29uZXBsdXNfc3lzZnNfcmVhZF9zZW5zb3IsCisJCS53cml0ZSA9IGtvbmVwbHVzX3N5c2ZzX3dyaXRlX3NlbnNvcgorCX0sCisJeworCQkuYXR0ciA9IHsgLm5hbWUgPSAidGN1IiwgLm1vZGUgPSAwMjIwIH0sCisJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBrb25lcGx1c190Y3UpLAorCQkud3JpdGUgPSBrb25lcGx1c19zeXNmc193cml0ZV90Y3UKKwl9LAorCXsKKwkJLmF0dHIgPSB7IC5uYW1lID0gInRjdV9pbWFnZSIsIC5tb2RlID0gMDQ0MCB9LAorCQkuc2l6ZSA9IHNpemVvZihzdHJ1Y3Qga29uZXBsdXNfdGN1X2ltYWdlKSwKKwkJLnJlYWQgPSBrb25lcGx1c19zeXNmc19yZWFkX3RjdV9pbWFnZQorCX0sCisJeworCQkuYXR0ciA9IHsgLm5hbWUgPSAicHJvZmlsZV9zZXR0aW5ncyIsIC5tb2RlID0gMDIyMCB9LAorCQkuc2l6ZSA9IHNpemVvZihzdHJ1Y3Qga29uZXBsdXNfcHJvZmlsZV9zZXR0aW5ncyksCisJCS53cml0ZSA9IGtvbmVwbHVzX3N5c2ZzX3dyaXRlX3Byb2ZpbGVfc2V0dGluZ3MKKwl9LAorCXsKKwkJLmF0dHIgPSB7IC5uYW1lID0gInByb2ZpbGUxX3NldHRpbmdzIiwgLm1vZGUgPSAwNDQwIH0sCisJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX3NldHRpbmdzKSwKKwkJLnJlYWQgPSBrb25lcGx1c19zeXNmc19yZWFkX3Byb2ZpbGV4X3NldHRpbmdzLAorCQkucHJpdmF0ZSA9ICZwcm9maWxlX251bWJlcnNbMF0KKwl9LAorCXsKKwkJLmF0dHIgPSB7IC5uYW1lID0gInByb2ZpbGUyX3NldHRpbmdzIiwgLm1vZGUgPSAwNDQwIH0sCisJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX3NldHRpbmdzKSwKKwkJLnJlYWQgPSBrb25lcGx1c19zeXNmc19yZWFkX3Byb2ZpbGV4X3NldHRpbmdzLAorCQkucHJpdmF0ZSA9ICZwcm9maWxlX251bWJlcnNbMV0KKwl9LAorCXsKKwkJLmF0dHIgPSB7IC5uYW1lID0gInByb2ZpbGUzX3NldHRpbmdzIiwgLm1vZGUgPSAwNDQwIH0sCisJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX3NldHRpbmdzKSwKKwkJLnJlYWQgPSBrb25lcGx1c19zeXNmc19yZWFkX3Byb2ZpbGV4X3NldHRpbmdzLAorCQkucHJpdmF0ZSA9ICZwcm9maWxlX251bWJlcnNbMl0KKwl9LAorCXsKKwkJLmF0dHIgPSB7IC5uYW1lID0gInByb2ZpbGU0X3NldHRpbmdzIiwgLm1vZGUgPSAwNDQwIH0sCisJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX3NldHRpbmdzKSwKKwkJLnJlYWQgPSBrb25lcGx1c19zeXNmc19yZWFkX3Byb2ZpbGV4X3NldHRpbmdzLAorCQkucHJpdmF0ZSA9ICZwcm9maWxlX251bWJlcnNbM10KKwl9LAorCXsKKwkJLmF0dHIgPSB7IC5uYW1lID0gInByb2ZpbGU1X3NldHRpbmdzIiwgLm1vZGUgPSAwNDQwIH0sCisJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX3NldHRpbmdzKSwKKwkJLnJlYWQgPSBrb25lcGx1c19zeXNmc19yZWFkX3Byb2ZpbGV4X3NldHRpbmdzLAorCQkucHJpdmF0ZSA9ICZwcm9maWxlX251bWJlcnNbNF0KKwl9LAorCXsKKwkJLmF0dHIgPSB7IC5uYW1lID0gInByb2ZpbGVfYnV0dG9ucyIsIC5tb2RlID0gMDIyMCB9LAorCQkuc2l6ZSA9IHNpemVvZihzdHJ1Y3Qga29uZXBsdXNfcHJvZmlsZV9idXR0b25zKSwKKwkJLndyaXRlID0ga29uZXBsdXNfc3lzZnNfd3JpdGVfcHJvZmlsZV9idXR0b25zCisJfSwKKwl7CisJCS5hdHRyID0geyAubmFtZSA9ICJwcm9maWxlMV9idXR0b25zIiwgLm1vZGUgPSAwNDQwIH0sCisJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX2J1dHRvbnMpLAorCQkucmVhZCA9IGtvbmVwbHVzX3N5c2ZzX3JlYWRfcHJvZmlsZXhfYnV0dG9ucywKKwkJLnByaXZhdGUgPSAmcHJvZmlsZV9udW1iZXJzWzBdCisJfSwKKwl7CisJCS5hdHRyID0geyAubmFtZSA9ICJwcm9maWxlMl9idXR0b25zIiwgLm1vZGUgPSAwNDQwIH0sCisJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX2J1dHRvbnMpLAorCQkucmVhZCA9IGtvbmVwbHVzX3N5c2ZzX3JlYWRfcHJvZmlsZXhfYnV0dG9ucywKKwkJLnByaXZhdGUgPSAmcHJvZmlsZV9udW1iZXJzWzFdCisJfSwKKwl7CisJCS5hdHRyID0geyAubmFtZSA9ICJwcm9maWxlM19idXR0b25zIiwgLm1vZGUgPSAwNDQwIH0sCisJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX2J1dHRvbnMpLAorCQkucmVhZCA9IGtvbmVwbHVzX3N5c2ZzX3JlYWRfcHJvZmlsZXhfYnV0dG9ucywKKwkJLnByaXZhdGUgPSAmcHJvZmlsZV9udW1iZXJzWzJdCisJfSwKKwl7CisJCS5hdHRyID0geyAubmFtZSA9ICJwcm9maWxlNF9idXR0b25zIiwgLm1vZGUgPSAwNDQwIH0sCisJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX2J1dHRvbnMpLAorCQkucmVhZCA9IGtvbmVwbHVzX3N5c2ZzX3JlYWRfcHJvZmlsZXhfYnV0dG9ucywKKwkJLnByaXZhdGUgPSAmcHJvZmlsZV9udW1iZXJzWzNdCisJfSwKKwl7CisJCS5hdHRyID0geyAubmFtZSA9ICJwcm9maWxlNV9idXR0b25zIiwgLm1vZGUgPSAwNDQwIH0sCisJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX2J1dHRvbnMpLAorCQkucmVhZCA9IGtvbmVwbHVzX3N5c2ZzX3JlYWRfcHJvZmlsZXhfYnV0dG9ucywKKwkJLnByaXZhdGUgPSAmcHJvZmlsZV9udW1iZXJzWzRdCisJfSwKKwl7CisJCS5hdHRyID0geyAubmFtZSA9ICJtYWNybyIsIC5tb2RlID0gMDIyMCB9LAorCQkuc2l6ZSA9IHNpemVvZihzdHJ1Y3Qga29uZXBsdXNfbWFjcm8pLAorCQkud3JpdGUgPSBrb25lcGx1c19zeXNmc193cml0ZV9tYWNybworCX0sCisJX19BVFRSX05VTEwKK307CisKK3N0YXRpYyBpbnQga29uZXBsdXNfaW5pdF9rb25lcGx1c19kZXZpY2Vfc3RydWN0KHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2LAorCQlzdHJ1Y3Qga29uZXBsdXNfZGV2aWNlICprb25lcGx1cykKK3sKKwlpbnQgcmV0dmFsLCBpOworCXN0YXRpYyB1aW50IHdhaXQgPSA3MDsgLyogZGV2aWNlIHdpbGwgZnJlZXplIHdpdGgganVzdCA2MCAqLworCisJbXV0ZXhfaW5pdCgma29uZXBsdXMtPmtvbmVwbHVzX2xvY2spOworCisJa29uZXBsdXMtPnN0YXJ0dXBfcHJvZmlsZSA9IGtvbmVwbHVzX2dldF9zdGFydHVwX3Byb2ZpbGUodXNiX2Rldik7CisKKwltc2xlZXAod2FpdCk7CisJcmV0dmFsID0ga29uZXBsdXNfZ2V0X2luZm8odXNiX2RldiwgJmtvbmVwbHVzLT5pbmZvKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJZm9yIChpID0gMDsgaSA8IDU7ICsraSkgeworCQltc2xlZXAod2FpdCk7CisJCXJldHZhbCA9IGtvbmVwbHVzX2dldF9wcm9maWxlX3NldHRpbmdzKHVzYl9kZXYsCisJCQkJJmtvbmVwbHVzLT5wcm9maWxlX3NldHRpbmdzW2ldLCBpKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisKKwkJbXNsZWVwKHdhaXQpOworCQlyZXR2YWwgPSBrb25lcGx1c19nZXRfcHJvZmlsZV9idXR0b25zKHVzYl9kZXYsCisJCQkJJmtvbmVwbHVzLT5wcm9maWxlX2J1dHRvbnNbaV0sIGkpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlrb25lcGx1c19wcm9maWxlX2FjdGl2YXRlZChrb25lcGx1cywga29uZXBsdXMtPnN0YXJ0dXBfcHJvZmlsZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBrb25lcGx1c19pbml0X3NwZWNpYWxzKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2KQoreworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVyZmFjZShoZGV2LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJc3RydWN0IGtvbmVwbHVzX2RldmljZSAqa29uZXBsdXM7CisJaW50IHJldHZhbDsKKworCWlmIChpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlUHJvdG9jb2wKKwkJCT09IFVTQl9JTlRFUkZBQ0VfUFJPVE9DT0xfTU9VU0UpIHsKKworCQlrb25lcGx1cyA9IGt6YWxsb2Moc2l6ZW9mKCprb25lcGx1cyksIEdGUF9LRVJORUwpOworCQlpZiAoIWtvbmVwbHVzKSB7CisJCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJjYW4ndCBhbGxvYyBkZXZpY2UgZGVzY3JpcHRvclxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQloaWRfc2V0X2RydmRhdGEoaGRldiwga29uZXBsdXMpOworCisJCXJldHZhbCA9IGtvbmVwbHVzX2luaXRfa29uZXBsdXNfZGV2aWNlX3N0cnVjdCh1c2JfZGV2LCBrb25lcGx1cyk7CisJCWlmIChyZXR2YWwpIHsKKwkJCWRldl9lcnIoJmhkZXYtPmRldiwKKwkJCQkJImNvdWxkbid0IGluaXQgc3RydWN0IGtvbmVwbHVzX2RldmljZVxuIik7CisJCQlnb3RvIGV4aXRfZnJlZTsKKwkJfQorCisJCXJldHZhbCA9IHJvY2NhdF9jb25uZWN0KGtvbmVwbHVzX2NsYXNzLCBoZGV2KTsKKwkJaWYgKHJldHZhbCA8IDApIHsKKwkJCWRldl9lcnIoJmhkZXYtPmRldiwgImNvdWxkbid0IGluaXQgY2hhciBkZXZcbiIpOworCQl9IGVsc2UgeworCQkJa29uZXBsdXMtPmNocmRldl9taW5vciA9IHJldHZhbDsKKwkJCWtvbmVwbHVzLT5yb2NjYXRfY2xhaW1lZCA9IDE7CisJCX0KKwl9IGVsc2UgeworCQloaWRfc2V0X2RydmRhdGEoaGRldiwgTlVMTCk7CisJfQorCisJcmV0dXJuIDA7CitleGl0X2ZyZWU6CisJa2ZyZWUoa29uZXBsdXMpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGtvbmVwbHVzX3JlbW92ZV9zcGVjaWFscyhzdHJ1Y3QgaGlkX2RldmljZSAqaGRldikKK3sKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoaGRldi0+ZGV2LnBhcmVudCk7CisJc3RydWN0IGtvbmVwbHVzX2RldmljZSAqa29uZXBsdXM7CisKKwlpZiAoaW50Zi0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZVByb3RvY29sCisJCQk9PSBVU0JfSU5URVJGQUNFX1BST1RPQ09MX01PVVNFKSB7CisJCWtvbmVwbHVzID0gaGlkX2dldF9kcnZkYXRhKGhkZXYpOworCQlpZiAoa29uZXBsdXMtPnJvY2NhdF9jbGFpbWVkKQorCQkJcm9jY2F0X2Rpc2Nvbm5lY3Qoa29uZXBsdXMtPmNocmRldl9taW5vcik7CisJCWtmcmVlKGtvbmVwbHVzKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQga29uZXBsdXNfcHJvYmUoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsCisJCWNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gaGlkX3BhcnNlKGhkZXYpOworCWlmIChyZXR2YWwpIHsKKwkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJZ290byBleGl0OworCX0KKworCXJldHZhbCA9IGhpZF9od19zdGFydChoZGV2LCBISURfQ09OTkVDVF9ERUZBVUxUKTsKKwlpZiAocmV0dmFsKSB7CisJCWRldl9lcnIoJmhkZXYtPmRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlyZXR2YWwgPSBrb25lcGx1c19pbml0X3NwZWNpYWxzKGhkZXYpOworCWlmIChyZXR2YWwpIHsKKwkJZGV2X2VycigmaGRldi0+ZGV2LCAiY291bGRuJ3QgaW5zdGFsbCBtb3VzZVxuIik7CisJCWdvdG8gZXhpdF9zdG9wOworCX0KKworCXJldHVybiAwOworCitleGl0X3N0b3A6CisJaGlkX2h3X3N0b3AoaGRldik7CitleGl0OgorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGtvbmVwbHVzX3JlbW92ZShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldikKK3sKKwlrb25lcGx1c19yZW1vdmVfc3BlY2lhbHMoaGRldik7CisJaGlkX2h3X3N0b3AoaGRldik7Cit9CisKK3N0YXRpYyB2b2lkIGtvbmVwbHVzX2tlZXBfdmFsdWVzX3VwX3RvX2RhdGUoc3RydWN0IGtvbmVwbHVzX2RldmljZSAqa29uZXBsdXMsCisJCXU4IGNvbnN0ICpkYXRhKQoreworCXN0cnVjdCBrb25lcGx1c19tb3VzZV9yZXBvcnRfYnV0dG9uIGNvbnN0ICpidXR0b25fcmVwb3J0OworCisJc3dpdGNoIChkYXRhWzBdKSB7CisJY2FzZSBLT05FUExVU19NT1VTRV9SRVBPUlRfTlVNQkVSX0JVVFRPTjoKKwkJYnV0dG9uX3JlcG9ydCA9IChzdHJ1Y3Qga29uZXBsdXNfbW91c2VfcmVwb3J0X2J1dHRvbiBjb25zdCAqKWRhdGE7CisJCXN3aXRjaCAoYnV0dG9uX3JlcG9ydC0+dHlwZSkgeworCQljYXNlIEtPTkVQTFVTX01PVVNFX1JFUE9SVF9CVVRUT05fVFlQRV9QUk9GSUxFOgorCQkJa29uZXBsdXNfcHJvZmlsZV9hY3RpdmF0ZWQoa29uZXBsdXMsIGJ1dHRvbl9yZXBvcnQtPmRhdGExIC0gMSk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGtvbmVwbHVzX3JlcG9ydF90b19jaHJkZXYoc3RydWN0IGtvbmVwbHVzX2RldmljZSBjb25zdCAqa29uZXBsdXMsCisJCXU4IGNvbnN0ICpkYXRhKQoreworCXN0cnVjdCBrb25lcGx1c19yb2NjYXRfcmVwb3J0IHJvY2NhdF9yZXBvcnQ7CisJc3RydWN0IGtvbmVwbHVzX21vdXNlX3JlcG9ydF9idXR0b24gY29uc3QgKmJ1dHRvbl9yZXBvcnQ7CisKKwlpZiAoZGF0YVswXSAhPSBLT05FUExVU19NT1VTRV9SRVBPUlRfTlVNQkVSX0JVVFRPTikKKwkJcmV0dXJuOworCisJYnV0dG9uX3JlcG9ydCA9IChzdHJ1Y3Qga29uZXBsdXNfbW91c2VfcmVwb3J0X2J1dHRvbiBjb25zdCAqKWRhdGE7CisKKwlpZiAoKGJ1dHRvbl9yZXBvcnQtPnR5cGUgPT0gS09ORVBMVVNfTU9VU0VfUkVQT1JUX0JVVFRPTl9UWVBFX1FVSUNLTEFVTkNIIHx8CisJCQlidXR0b25fcmVwb3J0LT50eXBlID09IEtPTkVQTFVTX01PVVNFX1JFUE9SVF9CVVRUT05fVFlQRV9USU1FUikgJiYKKwkJCWJ1dHRvbl9yZXBvcnQtPmRhdGEyICE9IEtPTkVQTFVTX01PVVNFX1JFUE9SVF9CVVRUT05fQUNUSU9OX1BSRVNTKQorCQlyZXR1cm47CisKKwlyb2NjYXRfcmVwb3J0LnR5cGUgPSBidXR0b25fcmVwb3J0LT50eXBlOworCXJvY2NhdF9yZXBvcnQuZGF0YTEgPSBidXR0b25fcmVwb3J0LT5kYXRhMTsKKwlyb2NjYXRfcmVwb3J0LmRhdGEyID0gYnV0dG9uX3JlcG9ydC0+ZGF0YTI7CisJcm9jY2F0X3JlcG9ydC5wcm9maWxlID0ga29uZXBsdXMtPmFjdHVhbF9wcm9maWxlICsgMTsKKwlyb2NjYXRfcmVwb3J0X2V2ZW50KGtvbmVwbHVzLT5jaHJkZXZfbWlub3IsCisJCQkodWludDhfdCBjb25zdCAqKSZyb2NjYXRfcmVwb3J0LAorCQkJc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19yb2NjYXRfcmVwb3J0KSk7Cit9CisKK3N0YXRpYyBpbnQga29uZXBsdXNfcmF3X2V2ZW50KHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LAorCQlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0LCB1OCAqZGF0YSwgaW50IHNpemUpCit7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGhkZXYtPmRldi5wYXJlbnQpOworCXN0cnVjdCBrb25lcGx1c19kZXZpY2UgKmtvbmVwbHVzID0gaGlkX2dldF9kcnZkYXRhKGhkZXYpOworCisJaWYgKGludGYtPmN1cl9hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VQcm90b2NvbAorCQkJIT0gVVNCX0lOVEVSRkFDRV9QUk9UT0NPTF9NT1VTRSkKKwkJcmV0dXJuIDA7CisKKwlrb25lcGx1c19rZWVwX3ZhbHVlc191cF90b19kYXRlKGtvbmVwbHVzLCBkYXRhKTsKKworCWlmIChrb25lcGx1cy0+cm9jY2F0X2NsYWltZWQpCisJCWtvbmVwbHVzX3JlcG9ydF90b19jaHJkZXYoa29uZXBsdXMsIGRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCBrb25lcGx1c19kZXZpY2VzW10gPSB7CisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1JPQ0NBVCwgVVNCX0RFVklDRV9JRF9ST0NDQVRfS09ORVBMVVMpIH0sCisJeyB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGhpZCwga29uZXBsdXNfZGV2aWNlcyk7CisKK3N0YXRpYyBzdHJ1Y3QgaGlkX2RyaXZlciBrb25lcGx1c19kcml2ZXIgPSB7CisJCS5uYW1lID0gImtvbmVwbHVzIiwKKwkJLmlkX3RhYmxlID0ga29uZXBsdXNfZGV2aWNlcywKKwkJLnByb2JlID0ga29uZXBsdXNfcHJvYmUsCisJCS5yZW1vdmUgPSBrb25lcGx1c19yZW1vdmUsCisJCS5yYXdfZXZlbnQgPSBrb25lcGx1c19yYXdfZXZlbnQKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGtvbmVwbHVzX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJLyogY2xhc3MgbmFtZSBoYXMgdG8gYmUgc2FtZSBhcyBkcml2ZXIgbmFtZSAqLworCWtvbmVwbHVzX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAia29uZXBsdXMiKTsKKwlpZiAoSVNfRVJSKGtvbmVwbHVzX2NsYXNzKSkKKwkJcmV0dXJuIFBUUl9FUlIoa29uZXBsdXNfY2xhc3MpOworCWtvbmVwbHVzX2NsYXNzLT5kZXZfYXR0cnMgPSBrb25lcGx1c19hdHRyaWJ1dGVzOworCWtvbmVwbHVzX2NsYXNzLT5kZXZfYmluX2F0dHJzID0ga29uZXBsdXNfYmluX2F0dHJpYnV0ZXM7CisKKwlyZXR2YWwgPSBoaWRfcmVnaXN0ZXJfZHJpdmVyKCZrb25lcGx1c19kcml2ZXIpOworCWlmIChyZXR2YWwpCisJCWNsYXNzX2Rlc3Ryb3koa29uZXBsdXNfY2xhc3MpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBrb25lcGx1c19leGl0KHZvaWQpCit7CisJY2xhc3NfZGVzdHJveShrb25lcGx1c19jbGFzcyk7CisJaGlkX3VucmVnaXN0ZXJfZHJpdmVyKCZrb25lcGx1c19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChrb25lcGx1c19pbml0KTsKK21vZHVsZV9leGl0KGtvbmVwbHVzX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJTdGVmYW4gQWNoYXR6Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlVTQiBSb2NjYXQgS29uZVsrXSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQta29uZXBsdXMuaCBiL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQta29uZXBsdXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2E1YzFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1rb25lcGx1cy5oCkBAIC0wLDAgKzEsMjI0IEBACisjaWZuZGVmIF9fSElEX1JPQ0NBVF9LT05FUExVU19ICisjZGVmaW5lIF9fSElEX1JPQ0NBVF9LT05FUExVU19ICisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgU3RlZmFuIEFjaGF0eiA8ZXJhem9yX2RlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoKKyAqIGNhc2UgMTogd3JpdGVzIHJlcXVlc3QgODAgYW5kIHJlYWRzIHZhbHVlIDEKKyAqCisgKi8KK3N0cnVjdCBrb25lcGx1c19jb250cm9sIHsKKwl1aW50OF90IGNvbW1hbmQ7IC8qIEtPTkVQTFVTX0NPTU1BTkRfQ09OVFJPTCAqLworCS8qCisJICogdmFsdWUgaXMgcHJvZmlsZSBudW1iZXIgaW4gcmFuZ2UgMC00IGZvciByZXF1ZXN0aW5nIHNldHRpbmdzIGFuZCBidXR0b25zCisJICogMSBpZiBzdGF0dXMgb2sgZm9yIHJlcXVlc3Rpbmcgc3RhdHVzCisJICovCisJdWludDhfdCB2YWx1ZTsKKwl1aW50OF90IHJlcXVlc3Q7Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK2VudW0ga29uZXBsdXNfY29udHJvbF9yZXF1ZXN0cyB7CisJS09ORVBMVVNfQ09OVFJPTF9SRVFVRVNUX1NUQVRVUyA9IDB4MDAsCisJS09ORVBMVVNfQ09OVFJPTF9SRVFVRVNUX1BST0ZJTEVfU0VUVElOR1MgPSAweDgwLAorCUtPTkVQTFVTX0NPTlRST0xfUkVRVUVTVF9QUk9GSUxFX0JVVFRPTlMgPSAweDkwLAorfTsKKworZW51bSBrb25lcGx1c19jb250cm9sX3ZhbHVlcyB7CisJS09ORVBMVVNfQ09OVFJPTF9SRVFVRVNUX1NUQVRVU19PVkVSTE9BRCA9IDAsCisJS09ORVBMVVNfQ09OVFJPTF9SRVFVRVNUX1NUQVRVU19PSyA9IDEsCisJS09ORVBMVVNfQ09OVFJPTF9SRVFVRVNUX1NUQVRVU19XQUlUID0gMywKK307CisKK3N0cnVjdCBrb25lcGx1c19zdGFydHVwX3Byb2ZpbGUgeworCXVpbnQ4X3QgY29tbWFuZDsgLyogS09ORVBMVVNfQ09NTUFORF9TVEFSVFVQX1BST0ZJTEUgKi8KKwl1aW50OF90IHNpemU7IC8qIGFsd2F5cyAzICovCisJdWludDhfdCBzdGFydHVwX3Byb2ZpbGU7IC8qIFJhbmdlIDAtNCEgKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IGtvbmVwbHVzX3Byb2ZpbGVfc2V0dGluZ3MgeworCXVpbnQ4X3QgY29tbWFuZDsgLyogS09ORVBMVVNfQ09NTUFORF9QUk9GSUxFX1NFVFRJTkdTICovCisJdWludDhfdCBzaXplOyAvKiBhbHdheXMgNDMgKi8KKwl1aW50OF90IG51bWJlcjsgLyogcmFuZ2UgMC00ICovCisJdWludDhfdCBhZHZhbmNlZF9zZW5zaXRpdml0eTsKKwl1aW50OF90IHNlbnNpdGl2aXR5X3g7CisJdWludDhfdCBzZW5zaXRpdml0eV95OworCXVpbnQ4X3QgY3BpX2xldmVsc19lbmFibGVkOworCXVpbnQ4X3QgY3BpX2xldmVsc194WzVdOworCXVpbnQ4X3QgY3BpX3N0YXJ0dXBfbGV2ZWw7IC8qIHJhbmdlIDAtNCAqLworCXVpbnQ4X3QgY3BpX2xldmVsc195WzVdOyAvKiByYW5nZSAxLTYwIG1lYW5zIDEwMC02MDAwIGNwaSAqLworCXVpbnQ4X3QgdW5rbm93bjE7CisJdWludDhfdCBwb2xsaW5nX3JhdGU7CisJdWludDhfdCBsaWdodHNfZW5hYmxlZDsKKwl1aW50OF90IGxpZ2h0X2VmZmVjdF9tb2RlOworCXVpbnQ4X3QgY29sb3JfZmxvd19lZmZlY3Q7CisJdWludDhfdCBsaWdodF9lZmZlY3RfdHlwZTsKKwl1aW50OF90IGxpZ2h0X2VmZmVjdF9zcGVlZDsKKwl1aW50OF90IGxpZ2h0c1sxNl07CisJdWludDE2X3QgY2hlY2tzdW07Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCBrb25lcGx1c19wcm9maWxlX2J1dHRvbnMgeworCXVpbnQ4X3QgY29tbWFuZDsgLyogS09ORVBMVVNfQ09NTUFORF9QUk9GSUxFX0JVVFRPTlMgKi8KKwl1aW50OF90IHNpemU7IC8qIGFsd2F5cyA3NyAqLworCXVpbnQ4X3QgbnVtYmVyOyAvKiByYW5nZSAwLTQgKi8KKwl1aW50OF90IGRhdGFbNzJdOworCXVpbnQxNl90IGNoZWNrc3VtOworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCitzdHJ1Y3Qga29uZXBsdXNfbWFjcm8geworCXVpbnQ4X3QgY29tbWFuZDsgLyogS09ORVBMVVNfQ09NTUFORF9NQUNSTyAqLworCXVpbnQxNl90IHNpemU7IC8qIGFsd2F5cyAweDgyMiBsaXR0bGUgZW5kaWFuICovCisJdWludDhfdCBwcm9maWxlOyAvKiByYW5nZSAwLTQgKi8KKwl1aW50OF90IGJ1dHRvbjsgLyogcmFuZ2UgMC0yMyAqLworCXVpbnQ4X3QgZGF0YVsyMDc1XTsKKwl1aW50MTZfdCBjaGVja3N1bTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IGtvbmVwbHVzX2luZm8geworCXVpbnQ4X3QgY29tbWFuZDsgLyogS09ORVBMVVNfQ09NTUFORF9JTkZPICovCisJdWludDhfdCBzaXplOyAvKiBhbHdheXMgNiAqLworCXVpbnQ4X3QgZmlybXdhcmVfdmVyc2lvbjsKKwl1aW50OF90IHVua25vd25bM107Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCBrb25lcGx1c19lIHsKKwl1aW50OF90IGNvbW1hbmQ7IC8qIEtPTkVQTFVTX0NPTU1BTkRfRSAqLworCXVpbnQ4X3Qgc2l6ZTsgLyogYWx3YXlzIDMgKi8KKwl1aW50OF90IHVua25vd247IC8qIFRPRE8gMTsgMCBiZWZvcmUgZmlybXdhcmUgdXBkYXRlICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCBrb25lcGx1c19zZW5zb3IgeworCXVpbnQ4X3QgY29tbWFuZDsgIC8qIEtPTkVQTFVTX0NPTU1BTkRfU0VOU09SICovCisJdWludDhfdCBzaXplOyAvKiBhbHdheXMgNiAqLworCXVpbnQ4X3QgZGF0YVs0XTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IGtvbmVwbHVzX2Zpcm13YXJlX3dyaXRlIHsKKwl1aW50OF90IGNvbW1hbmQ7IC8qIEtPTkVQTFVTX0NPTU1BTkRfRklSTVdBUkVfV1JJVEUgKi8KKwl1aW50OF90IHVua25vd25bMTAyNV07Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCBrb25lcGx1c19maXJtd2FyZV93cml0ZV9jb250cm9sIHsKKwl1aW50OF90IGNvbW1hbmQ7IC8qIEtPTkVQTFVTX0NPTU1BTkRfRklSTVdBUkVfV1JJVEVfQ09OVFJPTCAqLworCS8qCisJICogdmFsdWUgaXMgMSBvbiBzdWNjZXNzCisJICogMyBtZWFucyAibm90IGZpbmlzaGVkIHlldCIKKwkgKi8KKwl1aW50OF90IHZhbHVlOworCXVpbnQ4X3QgdW5rbm93bjsgLyogYWx3YXlzIDB4NzUgKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IGtvbmVwbHVzX3RjdSB7CisJdWludDE2X3QgdXNiX2NvbW1hbmQ7IC8qIEtPTkVQTFVTX1VTQl9DT01NQU5EX1RDVSAqLworCXVpbnQ4X3QgZGF0YVsyXTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IGtvbmVwbHVzX3RjdV9pbWFnZSB7CisJdWludDE2X3QgdXNiX2NvbW1hbmQ7IC8qIEtPTkVQTFVTX1VTQl9DT01NQU5EX1RDVSAqLworCXVpbnQ4X3QgZGF0YVsxMDI0XTsKKwl1aW50MTZfdCBjaGVja3N1bTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworZW51bSBrb25lcGx1c19jb21tYW5kcyB7CisJS09ORVBMVVNfQ09NTUFORF9DT05UUk9MID0gMHg0LAorCUtPTkVQTFVTX0NPTU1BTkRfU1RBUlRVUF9QUk9GSUxFID0gMHg1LAorCUtPTkVQTFVTX0NPTU1BTkRfUFJPRklMRV9TRVRUSU5HUyA9IDB4NiwKKwlLT05FUExVU19DT01NQU5EX1BST0ZJTEVfQlVUVE9OUyA9IDB4NywKKwlLT05FUExVU19DT01NQU5EX01BQ1JPID0gMHg4LAorCUtPTkVQTFVTX0NPTU1BTkRfSU5GTyA9IDB4OSwKKwlLT05FUExVU19DT01NQU5EX0UgPSAweGUsCisJS09ORVBMVVNfQ09NTUFORF9TRU5TT1IgPSAweGYsCisJS09ORVBMVVNfQ09NTUFORF9GSVJNV0FSRV9XUklURSA9IDB4MWIsCisJS09ORVBMVVNfQ09NTUFORF9GSVJNV0FSRV9XUklURV9DT05UUk9MID0gMHgxYywKK307CisKK2VudW0ga29uZXBsdXNfdXNiX2NvbW1hbmRzIHsKKwlLT05FUExVU19VU0JfQ09NTUFORF9DT05UUk9MID0gMHgzMDQsCisJS09ORVBMVVNfVVNCX0NPTU1BTkRfU1RBUlRVUF9QUk9GSUxFID0gMHgzMDUsCisJS09ORVBMVVNfVVNCX0NPTU1BTkRfUFJPRklMRV9TRVRUSU5HUyA9IDB4MzA2LAorCUtPTkVQTFVTX1VTQl9DT01NQU5EX1BST0ZJTEVfQlVUVE9OUyA9IDB4MzA3LAorCUtPTkVQTFVTX1VTQl9DT01NQU5EX01BQ1JPID0gMHgzMDgsCisJS09ORVBMVVNfVVNCX0NPTU1BTkRfSU5GTyA9IDB4MzA5LAorCUtPTkVQTFVTX1VTQl9DT01NQU5EX1RDVSA9IDB4MzBjLAorCUtPTkVQTFVTX1VTQl9DT01NQU5EX0UgPSAweDMwZSwKKwlLT05FUExVU19VU0JfQ09NTUFORF9TRU5TT1IgPSAweDMwZiwKKwlLT05FUExVU19VU0JfQ09NTUFORF9GSVJNV0FSRV9XUklURSA9IDB4MzFiLAorCUtPTkVQTFVTX1VTQl9DT01NQU5EX0ZJUk1XQVJFX1dSSVRFX0NPTlRST0wgPSAweDMxYywKK307CisKK2VudW0ga29uZXBsdXNfbW91c2VfcmVwb3J0X251bWJlcnMgeworCUtPTkVQTFVTX01PVVNFX1JFUE9SVF9OVU1CRVJfSElEID0gMSwKKwlLT05FUExVU19NT1VTRV9SRVBPUlRfTlVNQkVSX0FVRElPID0gMiwKKwlLT05FUExVU19NT1VTRV9SRVBPUlRfTlVNQkVSX0JVVFRPTiA9IDMsCit9OworCitzdHJ1Y3Qga29uZXBsdXNfbW91c2VfcmVwb3J0X2J1dHRvbiB7CisJdWludDhfdCByZXBvcnRfbnVtYmVyOyAvKiBhbHdheXMgS09ORVBMVVNfTU9VU0VfUkVQT1JUX05VTUJFUl9CVVRUT04gKi8KKwl1aW50OF90IHplcm8xOworCXVpbnQ4X3QgdHlwZTsKKwl1aW50OF90IGRhdGExOworCXVpbnQ4X3QgZGF0YTI7CisJdWludDhfdCB6ZXJvMjsKKwl1aW50OF90IHVua25vd25bMl07Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK2VudW0ga29uZXBsdXNfbW91c2VfcmVwb3J0X2J1dHRvbl90eXBlcyB7CisJLyogZGF0YTEgPSBuZXcgcHJvZmlsZSByYW5nZSAxLTUgKi8KKwlLT05FUExVU19NT1VTRV9SRVBPUlRfQlVUVE9OX1RZUEVfUFJPRklMRSA9IDB4MjAsCisKKwkvKiBkYXRhMSA9IGJ1dHRvbiBudW1iZXIgcmFuZ2UgMS0yNDsgZGF0YTIgPSBhY3Rpb24gKi8KKwlLT05FUExVU19NT1VTRV9SRVBPUlRfQlVUVE9OX1RZUEVfUVVJQ0tMQVVOQ0ggPSAweDYwLAorCisJLyogZGF0YTEgPSBidXR0b24gbnVtYmVyIHJhbmdlIDEtMjQ7IGRhdGEyID0gYWN0aW9uICovCisJS09ORVBMVVNfTU9VU0VfUkVQT1JUX0JVVFRPTl9UWVBFX1RJTUVSID0gMHg4MCwKKworCS8qIGRhdGExID0gc2V0dGluZyBudW1iZXIgcmFuZ2UgMS01ICovCisJS09ORVBMVVNfTU9VU0VfUkVQT1JUX0JVVFRPTl9UWVBFX0NQSSA9IDB4YjAsCisKKwkvKiBkYXRhMSBhbmQgZGF0YTIgPSByYW5nZSAweDEtMHhiICovCisJS09ORVBMVVNfTU9VU0VfUkVQT1JUX0JVVFRPTl9UWVBFX1NFTlNJVElWSVRZID0gMHhjMCwKKworCS8qIGRhdGExID0gMjIgPSBuZXh0IHRyYWNrLi4uCisJICogZGF0YTIgPSBhY3Rpb24KKwkgKi8KKwlLT05FUExVU19NT1VTRV9SRVBPUlRfQlVUVE9OX1RZUEVfTVVMVElNRURJQSA9IDB4ZjAsCit9OworCitlbnVtIGtvbmVwbHVzX21vdXNlX3JlcG9ydF9idXR0b25fYWN0aW9uIHsKKwlLT05FUExVU19NT1VTRV9SRVBPUlRfQlVUVE9OX0FDVElPTl9QUkVTUyA9IDAsCisJS09ORVBMVVNfTU9VU0VfUkVQT1JUX0JVVFRPTl9BQ1RJT05fUkVMRUFTRSA9IDEsCit9OworCitzdHJ1Y3Qga29uZXBsdXNfcm9jY2F0X3JlcG9ydCB7CisJdWludDhfdCB0eXBlOworCXVpbnQ4X3QgZGF0YTE7CisJdWludDhfdCBkYXRhMjsKKwl1aW50OF90IHByb2ZpbGU7Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCBrb25lcGx1c19kZXZpY2UgeworCWludCBhY3R1YWxfcHJvZmlsZTsKKworCWludCByb2NjYXRfY2xhaW1lZDsKKwlpbnQgY2hyZGV2X21pbm9yOworCisJc3RydWN0IG11dGV4IGtvbmVwbHVzX2xvY2s7CisKKwlpbnQgc3RhcnR1cF9wcm9maWxlOworCXN0cnVjdCBrb25lcGx1c19pbmZvIGluZm87CisJc3RydWN0IGtvbmVwbHVzX3Byb2ZpbGVfc2V0dGluZ3MgcHJvZmlsZV9zZXR0aW5nc1s1XTsKKwlzdHJ1Y3Qga29uZXBsdXNfcHJvZmlsZV9idXR0b25zIHByb2ZpbGVfYnV0dG9uc1s1XTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1weXJhLmMgYi9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LXB5cmEuYwppbmRleCA5YmYyMzA0Li4wMmM1OGUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LXB5cmEuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LXB5cmEuYwpAQCAtMjcsNiArMjcsMTEgQEAKICNpbmNsdWRlICJoaWQtcm9jY2F0LmgiCiAjaW5jbHVkZSAiaGlkLXJvY2NhdC1weXJhLmgiCiAKK3N0YXRpYyB1aW50IHByb2ZpbGVfbnVtYmVyc1s1XSA9IHswLCAxLCAyLCAzLCA0fTsKKworLyogcHlyYV9jbGFzcyBpcyB1c2VkIGZvciBjcmVhdGluZyBzeXNmcyBhdHRyaWJ1dGVzIHZpYSByb2NjYXQgY2hhciBkZXZpY2UgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xhc3MgKnB5cmFfY2xhc3M7CisKIHN0YXRpYyB2b2lkIHByb2ZpbGVfYWN0aXZhdGVkKHN0cnVjdCBweXJhX2RldmljZSAqcHlyYSwKIAkJdW5zaWduZWQgaW50IG5ld19wcm9maWxlKQogewpAQCAtODcsOSArOTIsOCBAQAogCQkJY29udHJvbC52YWx1ZSA9PSAxKQogCQkJcmV0dXJuIDA7CiAJZWxzZSB7Ci0JCWRldl9lcnIoJnVzYl9kZXYtPmRldiwgInJlY2VpdmUgY29udHJvbCBzdGF0dXM6ICIKLQkJCQkidW5rbm93biByZXNwb25zZSAweCV4IDB4JXhcbiIsCi0JCQkJY29udHJvbC5yZXF1ZXN0LCBjb250cm9sLnZhbHVlKTsKKwkJaGlkX2Vycih1c2JfZGV2LCAicmVjZWl2ZSBjb250cm9sIHN0YXR1czogdW5rbm93biByZXNwb25zZSAweCV4IDB4JXhcbiIsCisJCQljb250cm9sLnJlcXVlc3QsIGNvbnRyb2wudmFsdWUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiB9CkBAIC0yMjEsOSArMjI1LDEwIEBACiAKIHN0YXRpYyBzc2l6ZV90IHB5cmFfc3lzZnNfcmVhZF9wcm9maWxleF9zZXR0aW5ncyhzdHJ1Y3QgZmlsZSAqZnAsCiAJCXN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAotCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQsIGludCBudW1iZXIpCisJCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJc3RydWN0IGRldmljZSAqZGV2ID0KKwkJCWNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKS0+cGFyZW50LT5wYXJlbnQ7CiAJc3RydWN0IHB5cmFfZGV2aWNlICpweXJhID0gaGlkX2dldF9kcnZkYXRhKGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsKIAogCWlmIChvZmYgPj0gc2l6ZW9mKHN0cnVjdCBweXJhX3Byb2ZpbGVfc2V0dGluZ3MpKQpAQCAtMjMzLDU4ICsyMzgsMTkgQEAKIAkJY291bnQgPSBzaXplb2Yoc3RydWN0IHB5cmFfcHJvZmlsZV9zZXR0aW5ncykgLSBvZmY7CiAKIAltdXRleF9sb2NrKCZweXJhLT5weXJhX2xvY2spOwotCW1lbWNweShidWYsICgoY2hhciBjb25zdCAqKSZweXJhLT5wcm9maWxlX3NldHRpbmdzW251bWJlcl0pICsgb2ZmLAorCW1lbWNweShidWYsICgoY2hhciBjb25zdCAqKSZweXJhLT5wcm9maWxlX3NldHRpbmdzWyoodWludCAqKShhdHRyLT5wcml2YXRlKV0pICsgb2ZmLAogCQkJY291bnQpOwogCW11dGV4X3VubG9jaygmcHlyYS0+cHlyYV9sb2NrKTsKIAogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIHNzaXplX3QgcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGUxX3NldHRpbmdzKHN0cnVjdCBmaWxlICpmcCwKLQkJc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsCi0JCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKLXsKLQlyZXR1cm4gcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGV4X3NldHRpbmdzKGZwLCBrb2JqLAotCQkJYXR0ciwgYnVmLCBvZmYsIGNvdW50LCAwKTsKLX0KLQotc3RhdGljIHNzaXplX3QgcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGUyX3NldHRpbmdzKHN0cnVjdCBmaWxlICpmcCwKLQkJc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsCi0JCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKLXsKLQlyZXR1cm4gcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGV4X3NldHRpbmdzKGZwLCBrb2JqLAotCQkJYXR0ciwgYnVmLCBvZmYsIGNvdW50LCAxKTsKLX0KLQotc3RhdGljIHNzaXplX3QgcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGUzX3NldHRpbmdzKHN0cnVjdCBmaWxlICpmcCwKLQkJc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsCi0JCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKLXsKLQlyZXR1cm4gcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGV4X3NldHRpbmdzKGZwLCBrb2JqLAotCQkJYXR0ciwgYnVmLCBvZmYsIGNvdW50LCAyKTsKLX0KLQotc3RhdGljIHNzaXplX3QgcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGU0X3NldHRpbmdzKHN0cnVjdCBmaWxlICpmcCwKLQkJc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsCi0JCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKLXsKLQlyZXR1cm4gcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGV4X3NldHRpbmdzKGZwLCBrb2JqLAotCQkJYXR0ciwgYnVmLCBvZmYsIGNvdW50LCAzKTsKLX0KLQotc3RhdGljIHNzaXplX3QgcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGU1X3NldHRpbmdzKHN0cnVjdCBmaWxlICpmcCwKLQkJc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsCi0JCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKLXsKLQlyZXR1cm4gcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGV4X3NldHRpbmdzKGZwLCBrb2JqLAotCQkJYXR0ciwgYnVmLCBvZmYsIGNvdW50LCA0KTsKLX0KLQogc3RhdGljIHNzaXplX3QgcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGV4X2J1dHRvbnMoc3RydWN0IGZpbGUgKmZwLAogCQlzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKLQkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50LCBpbnQgbnVtYmVyKQorCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOworCXN0cnVjdCBkZXZpY2UgKmRldiA9CisJCQljb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaiktPnBhcmVudC0+cGFyZW50OwogCXN0cnVjdCBweXJhX2RldmljZSAqcHlyYSA9IGhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CiAKIAlpZiAob2ZmID49IHNpemVvZihzdHJ1Y3QgcHlyYV9wcm9maWxlX2J1dHRvbnMpKQpAQCAtMjk0LDU4ICsyNjAsMTkgQEAKIAkJY291bnQgPSBzaXplb2Yoc3RydWN0IHB5cmFfcHJvZmlsZV9idXR0b25zKSAtIG9mZjsKIAogCW11dGV4X2xvY2soJnB5cmEtPnB5cmFfbG9jayk7Ci0JbWVtY3B5KGJ1ZiwgKChjaGFyIGNvbnN0ICopJnB5cmEtPnByb2ZpbGVfYnV0dG9uc1tudW1iZXJdKSArIG9mZiwKKwltZW1jcHkoYnVmLCAoKGNoYXIgY29uc3QgKikmcHlyYS0+cHJvZmlsZV9idXR0b25zWyoodWludCAqKShhdHRyLT5wcml2YXRlKV0pICsgb2ZmLAogCQkJY291bnQpOwogCW11dGV4X3VubG9jaygmcHlyYS0+cHlyYV9sb2NrKTsKIAogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIHNzaXplX3QgcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGUxX2J1dHRvbnMoc3RydWN0IGZpbGUgKmZwLAotCQlzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKLQkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQotewotCXJldHVybiBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZXhfYnV0dG9ucyhmcCwga29iaiwKLQkJCWF0dHIsIGJ1Ziwgb2ZmLCBjb3VudCwgMCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHB5cmFfc3lzZnNfcmVhZF9wcm9maWxlMl9idXR0b25zKHN0cnVjdCBmaWxlICpmcCwKLQkJc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsCi0JCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKLXsKLQlyZXR1cm4gcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGV4X2J1dHRvbnMoZnAsIGtvYmosCi0JCQlhdHRyLCBidWYsIG9mZiwgY291bnQsIDEpOwotfQotCi1zdGF0aWMgc3NpemVfdCBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZTNfYnV0dG9ucyhzdHJ1Y3QgZmlsZSAqZnAsCi0JCXN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAotCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCi17Ci0JcmV0dXJuIHB5cmFfc3lzZnNfcmVhZF9wcm9maWxleF9idXR0b25zKGZwLCBrb2JqLAotCQkJYXR0ciwgYnVmLCBvZmYsIGNvdW50LCAyKTsKLX0KLQotc3RhdGljIHNzaXplX3QgcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGU0X2J1dHRvbnMoc3RydWN0IGZpbGUgKmZwLAotCQlzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKLQkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQotewotCXJldHVybiBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZXhfYnV0dG9ucyhmcCwga29iaiwKLQkJCWF0dHIsIGJ1Ziwgb2ZmLCBjb3VudCwgMyk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHB5cmFfc3lzZnNfcmVhZF9wcm9maWxlNV9idXR0b25zKHN0cnVjdCBmaWxlICpmcCwKLQkJc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsCi0JCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKLXsKLQlyZXR1cm4gcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGV4X2J1dHRvbnMoZnAsIGtvYmosCi0JCQlhdHRyLCBidWYsIG9mZiwgY291bnQsIDQpOwotfQotCiBzdGF0aWMgc3NpemVfdCBweXJhX3N5c2ZzX3dyaXRlX3Byb2ZpbGVfc2V0dGluZ3Moc3RydWN0IGZpbGUgKmZwLAogCQlzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKIAkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPQorCQkJY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopLT5wYXJlbnQtPnBhcmVudDsKIAlzdHJ1Y3QgcHlyYV9kZXZpY2UgKnB5cmEgPSBoaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldikpOwogCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldih0b191c2JfaW50ZXJmYWNlKGRldikpOwogCWludCByZXR2YWwgPSAwOwpAQCAtMzgxLDcgKzMwOCw4IEBACiAJCXN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAogCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOworCXN0cnVjdCBkZXZpY2UgKmRldiA9CisJCQljb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaiktPnBhcmVudC0+cGFyZW50OwogCXN0cnVjdCBweXJhX2RldmljZSAqcHlyYSA9IGhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KHRvX3VzYl9pbnRlcmZhY2UoZGV2KSk7CiAJaW50IHJldHZhbCA9IDA7CkBAIC00MTcsNyArMzQ1LDggQEAKIAkJc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsCiAJCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJc3RydWN0IGRldmljZSAqZGV2ID0KKwkJCWNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKS0+cGFyZW50LT5wYXJlbnQ7CiAJc3RydWN0IHB5cmFfZGV2aWNlICpweXJhID0gaGlkX2dldF9kcnZkYXRhKGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsKIAogCWlmIChvZmYgPj0gc2l6ZW9mKHN0cnVjdCBweXJhX3NldHRpbmdzKSkKQEAgLTQzNyw3ICszNjYsOCBAQAogCQlzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKIAkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPQorCQkJY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopLT5wYXJlbnQtPnBhcmVudDsKIAlzdHJ1Y3QgcHlyYV9kZXZpY2UgKnB5cmEgPSBoaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldikpOwogCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldih0b191c2JfaW50ZXJmYWNlKGRldikpOwogCWludCByZXR2YWwgPSAwOwpAQCAtNDY5LDI1NSArMzk5LDEyNSBAQAogc3RhdGljIHNzaXplX3QgcHlyYV9zeXNmc19zaG93X2FjdHVhbF9jcGkoc3RydWN0IGRldmljZSAqZGV2LAogCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCBweXJhX2RldmljZSAqcHlyYSA9IGhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CisJc3RydWN0IHB5cmFfZGV2aWNlICpweXJhID0KKwkJCWhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2LT5wYXJlbnQtPnBhcmVudCkpOwogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBweXJhLT5hY3R1YWxfY3BpKTsKIH0KIAogc3RhdGljIHNzaXplX3QgcHlyYV9zeXNmc19zaG93X2FjdHVhbF9wcm9maWxlKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgcHlyYV9kZXZpY2UgKnB5cmEgPSBoaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldikpOworCXN0cnVjdCBweXJhX2RldmljZSAqcHlyYSA9CisJCQloaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldi0+cGFyZW50LT5wYXJlbnQpKTsKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgcHlyYS0+YWN0dWFsX3Byb2ZpbGUpOwogfQogCiBzdGF0aWMgc3NpemVfdCBweXJhX3N5c2ZzX3Nob3dfZmlybXdhcmVfdmVyc2lvbihzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IHB5cmFfZGV2aWNlICpweXJhID0gaGlkX2dldF9kcnZkYXRhKGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsKKwlzdHJ1Y3QgcHlyYV9kZXZpY2UgKnB5cmEgPQorCQkJaGlkX2dldF9kcnZkYXRhKGRldl9nZXRfZHJ2ZGF0YShkZXYtPnBhcmVudC0+cGFyZW50KSk7CiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIHB5cmEtPmZpcm13YXJlX3ZlcnNpb24pOwogfQogCiBzdGF0aWMgc3NpemVfdCBweXJhX3N5c2ZzX3Nob3dfc3RhcnR1cF9wcm9maWxlKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgcHlyYV9kZXZpY2UgKnB5cmEgPSBoaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldikpOworCXN0cnVjdCBweXJhX2RldmljZSAqcHlyYSA9CisJCQloaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldi0+cGFyZW50LT5wYXJlbnQpKTsKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgcHlyYS0+c2V0dGluZ3Muc3RhcnR1cF9wcm9maWxlKTsKIH0KIAotc3RhdGljIERFVklDRV9BVFRSKGFjdHVhbF9jcGksIDA0NDAsIHB5cmFfc3lzZnNfc2hvd19hY3R1YWxfY3BpLCBOVUxMKTsKLQotc3RhdGljIERFVklDRV9BVFRSKGFjdHVhbF9wcm9maWxlLCAwNDQwLCBweXJhX3N5c2ZzX3Nob3dfYWN0dWFsX3Byb2ZpbGUsIE5VTEwpOwotCi1zdGF0aWMgREVWSUNFX0FUVFIoZmlybXdhcmVfdmVyc2lvbiwgMDQ0MCwKLQkJcHlyYV9zeXNmc19zaG93X2Zpcm13YXJlX3ZlcnNpb24sIE5VTEwpOwotCi1zdGF0aWMgREVWSUNFX0FUVFIoc3RhcnR1cF9wcm9maWxlLCAwNDQwLAotCQlweXJhX3N5c2ZzX3Nob3dfc3RhcnR1cF9wcm9maWxlLCBOVUxMKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnB5cmFfYXR0cmlidXRlc1tdID0gewotCQkmZGV2X2F0dHJfYWN0dWFsX2NwaS5hdHRyLAotCQkmZGV2X2F0dHJfYWN0dWFsX3Byb2ZpbGUuYXR0ciwKLQkJJmRldl9hdHRyX2Zpcm13YXJlX3ZlcnNpb24uYXR0ciwKLQkJJmRldl9hdHRyX3N0YXJ0dXBfcHJvZmlsZS5hdHRyLAotCQlOVUxMCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgcHlyYV9hdHRyaWJ1dGVzW10gPSB7CisJX19BVFRSKGFjdHVhbF9jcGksIDA0NDAsIHB5cmFfc3lzZnNfc2hvd19hY3R1YWxfY3BpLCBOVUxMKSwKKwlfX0FUVFIoYWN0dWFsX3Byb2ZpbGUsIDA0NDAsIHB5cmFfc3lzZnNfc2hvd19hY3R1YWxfcHJvZmlsZSwgTlVMTCksCisJX19BVFRSKGZpcm13YXJlX3ZlcnNpb24sIDA0NDAsCisJCQlweXJhX3N5c2ZzX3Nob3dfZmlybXdhcmVfdmVyc2lvbiwgTlVMTCksCisJX19BVFRSKHN0YXJ0dXBfcHJvZmlsZSwgMDQ0MCwKKwkJCXB5cmFfc3lzZnNfc2hvd19zdGFydHVwX3Byb2ZpbGUsIE5VTEwpLAorCV9fQVRUUl9OVUxMCiB9OwogCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBweXJhX2F0dHJpYnV0ZV9ncm91cCA9IHsKLQkJLmF0dHJzID0gcHlyYV9hdHRyaWJ1dGVzCi19OwotCi1zdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgcHlyYV9wcm9maWxlX3NldHRpbmdzX2F0dHIgPSB7CitzdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgcHlyYV9iaW5fYXR0cmlidXRlc1tdID0geworCXsKIAkJLmF0dHIgPSB7IC5uYW1lID0gInByb2ZpbGVfc2V0dGluZ3MiLCAubW9kZSA9IDAyMjAgfSwKIAkJLnNpemUgPSBzaXplb2Yoc3RydWN0IHB5cmFfcHJvZmlsZV9zZXR0aW5ncyksCiAJCS53cml0ZSA9IHB5cmFfc3lzZnNfd3JpdGVfcHJvZmlsZV9zZXR0aW5ncwotfTsKLQotc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIHB5cmFfcHJvZmlsZTFfc2V0dGluZ3NfYXR0ciA9IHsKKwl9LAorCXsKIAkJLmF0dHIgPSB7IC5uYW1lID0gInByb2ZpbGUxX3NldHRpbmdzIiwgLm1vZGUgPSAwNDQwIH0sCiAJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBweXJhX3Byb2ZpbGVfc2V0dGluZ3MpLAotCQkucmVhZCA9IHB5cmFfc3lzZnNfcmVhZF9wcm9maWxlMV9zZXR0aW5ncwotfTsKLQotc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIHB5cmFfcHJvZmlsZTJfc2V0dGluZ3NfYXR0ciA9IHsKKwkJLnJlYWQgPSBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZXhfc2V0dGluZ3MsCisJCS5wcml2YXRlID0gJnByb2ZpbGVfbnVtYmVyc1swXQorCX0sCisJewogCQkuYXR0ciA9IHsgLm5hbWUgPSAicHJvZmlsZTJfc2V0dGluZ3MiLCAubW9kZSA9IDA0NDAgfSwKIAkJLnNpemUgPSBzaXplb2Yoc3RydWN0IHB5cmFfcHJvZmlsZV9zZXR0aW5ncyksCi0JCS5yZWFkID0gcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGUyX3NldHRpbmdzCi19OwotCi1zdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgcHlyYV9wcm9maWxlM19zZXR0aW5nc19hdHRyID0geworCQkucmVhZCA9IHB5cmFfc3lzZnNfcmVhZF9wcm9maWxleF9zZXR0aW5ncywKKwkJLnByaXZhdGUgPSAmcHJvZmlsZV9udW1iZXJzWzFdCisJfSwKKwl7CiAJCS5hdHRyID0geyAubmFtZSA9ICJwcm9maWxlM19zZXR0aW5ncyIsIC5tb2RlID0gMDQ0MCB9LAogCQkuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcHlyYV9wcm9maWxlX3NldHRpbmdzKSwKLQkJLnJlYWQgPSBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZTNfc2V0dGluZ3MKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBweXJhX3Byb2ZpbGU0X3NldHRpbmdzX2F0dHIgPSB7CisJCS5yZWFkID0gcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGV4X3NldHRpbmdzLAorCQkucHJpdmF0ZSA9ICZwcm9maWxlX251bWJlcnNbMl0KKwl9LAorCXsKIAkJLmF0dHIgPSB7IC5uYW1lID0gInByb2ZpbGU0X3NldHRpbmdzIiwgLm1vZGUgPSAwNDQwIH0sCiAJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBweXJhX3Byb2ZpbGVfc2V0dGluZ3MpLAotCQkucmVhZCA9IHB5cmFfc3lzZnNfcmVhZF9wcm9maWxlNF9zZXR0aW5ncwotfTsKLQotc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIHB5cmFfcHJvZmlsZTVfc2V0dGluZ3NfYXR0ciA9IHsKKwkJLnJlYWQgPSBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZXhfc2V0dGluZ3MsCisJCS5wcml2YXRlID0gJnByb2ZpbGVfbnVtYmVyc1szXQorCX0sCisJewogCQkuYXR0ciA9IHsgLm5hbWUgPSAicHJvZmlsZTVfc2V0dGluZ3MiLCAubW9kZSA9IDA0NDAgfSwKIAkJLnNpemUgPSBzaXplb2Yoc3RydWN0IHB5cmFfcHJvZmlsZV9zZXR0aW5ncyksCi0JCS5yZWFkID0gcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGU1X3NldHRpbmdzCi19OwotCi1zdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgcHlyYV9wcm9maWxlX2J1dHRvbnNfYXR0ciA9IHsKKwkJLnJlYWQgPSBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZXhfc2V0dGluZ3MsCisJCS5wcml2YXRlID0gJnByb2ZpbGVfbnVtYmVyc1s0XQorCX0sCisJewogCQkuYXR0ciA9IHsgLm5hbWUgPSAicHJvZmlsZV9idXR0b25zIiwgLm1vZGUgPSAwMjIwIH0sCiAJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBweXJhX3Byb2ZpbGVfYnV0dG9ucyksCiAJCS53cml0ZSA9IHB5cmFfc3lzZnNfd3JpdGVfcHJvZmlsZV9idXR0b25zCi19OwotCi1zdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgcHlyYV9wcm9maWxlMV9idXR0b25zX2F0dHIgPSB7CisJfSwKKwl7CiAJCS5hdHRyID0geyAubmFtZSA9ICJwcm9maWxlMV9idXR0b25zIiwgLm1vZGUgPSAwNDQwIH0sCiAJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBweXJhX3Byb2ZpbGVfYnV0dG9ucyksCi0JCS5yZWFkID0gcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGUxX2J1dHRvbnMKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBweXJhX3Byb2ZpbGUyX2J1dHRvbnNfYXR0ciA9IHsKKwkJLnJlYWQgPSBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZXhfYnV0dG9ucywKKwkJLnByaXZhdGUgPSAmcHJvZmlsZV9udW1iZXJzWzBdCisJfSwKKwl7CiAJCS5hdHRyID0geyAubmFtZSA9ICJwcm9maWxlMl9idXR0b25zIiwgLm1vZGUgPSAwNDQwIH0sCiAJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBweXJhX3Byb2ZpbGVfYnV0dG9ucyksCi0JCS5yZWFkID0gcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGUyX2J1dHRvbnMKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBweXJhX3Byb2ZpbGUzX2J1dHRvbnNfYXR0ciA9IHsKKwkJLnJlYWQgPSBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZXhfYnV0dG9ucywKKwkJLnByaXZhdGUgPSAmcHJvZmlsZV9udW1iZXJzWzFdCisJfSwKKwl7CiAJCS5hdHRyID0geyAubmFtZSA9ICJwcm9maWxlM19idXR0b25zIiwgLm1vZGUgPSAwNDQwIH0sCiAJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBweXJhX3Byb2ZpbGVfYnV0dG9ucyksCi0JCS5yZWFkID0gcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGUzX2J1dHRvbnMKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBweXJhX3Byb2ZpbGU0X2J1dHRvbnNfYXR0ciA9IHsKKwkJLnJlYWQgPSBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZXhfYnV0dG9ucywKKwkJLnByaXZhdGUgPSAmcHJvZmlsZV9udW1iZXJzWzJdCisJfSwKKwl7CiAJCS5hdHRyID0geyAubmFtZSA9ICJwcm9maWxlNF9idXR0b25zIiwgLm1vZGUgPSAwNDQwIH0sCiAJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBweXJhX3Byb2ZpbGVfYnV0dG9ucyksCi0JCS5yZWFkID0gcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGU0X2J1dHRvbnMKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBweXJhX3Byb2ZpbGU1X2J1dHRvbnNfYXR0ciA9IHsKKwkJLnJlYWQgPSBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZXhfYnV0dG9ucywKKwkJLnByaXZhdGUgPSAmcHJvZmlsZV9udW1iZXJzWzNdCisJfSwKKwl7CiAJCS5hdHRyID0geyAubmFtZSA9ICJwcm9maWxlNV9idXR0b25zIiwgLm1vZGUgPSAwNDQwIH0sCiAJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBweXJhX3Byb2ZpbGVfYnV0dG9ucyksCi0JCS5yZWFkID0gcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGU1X2J1dHRvbnMKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBweXJhX3NldHRpbmdzX2F0dHIgPSB7CisJCS5yZWFkID0gcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGV4X2J1dHRvbnMsCisJCS5wcml2YXRlID0gJnByb2ZpbGVfbnVtYmVyc1s0XQorCX0sCisJewogCQkuYXR0ciA9IHsgLm5hbWUgPSAic2V0dGluZ3MiLCAubW9kZSA9IDA2NjAgfSwKIAkJLnNpemUgPSBzaXplb2Yoc3RydWN0IHB5cmFfc2V0dGluZ3MpLAogCQkucmVhZCA9IHB5cmFfc3lzZnNfcmVhZF9zZXR0aW5ncywKIAkJLndyaXRlID0gcHlyYV9zeXNmc193cml0ZV9zZXR0aW5ncworCX0sCisJX19BVFRSX05VTEwKIH07CiAKLXN0YXRpYyBpbnQgcHlyYV9jcmVhdGVfc3lzZnNfYXR0cmlidXRlcyhzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKLXsKLQlpbnQgcmV0dmFsOwotCi0JcmV0dmFsID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZpbnRmLT5kZXYua29iaiwgJnB5cmFfYXR0cmlidXRlX2dyb3VwKTsKLQlpZiAocmV0dmFsKQotCQlnb3RvIGV4aXRfMTsKLQotCXJldHZhbCA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosCi0JCQkmcHlyYV9wcm9maWxlX3NldHRpbmdzX2F0dHIpOwotCWlmIChyZXR2YWwpCi0JCWdvdG8gZXhpdF8yOwotCi0JcmV0dmFsID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwKLQkJCSZweXJhX3Byb2ZpbGUxX3NldHRpbmdzX2F0dHIpOwotCWlmIChyZXR2YWwpCi0JCWdvdG8gZXhpdF8zOwotCi0JcmV0dmFsID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwKLQkJCSZweXJhX3Byb2ZpbGUyX3NldHRpbmdzX2F0dHIpOwotCWlmIChyZXR2YWwpCi0JCWdvdG8gZXhpdF80OwotCi0JcmV0dmFsID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwKLQkJCSZweXJhX3Byb2ZpbGUzX3NldHRpbmdzX2F0dHIpOwotCWlmIChyZXR2YWwpCi0JCWdvdG8gZXhpdF81OwotCi0JcmV0dmFsID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwKLQkJCSZweXJhX3Byb2ZpbGU0X3NldHRpbmdzX2F0dHIpOwotCWlmIChyZXR2YWwpCi0JCWdvdG8gZXhpdF82OwotCi0JcmV0dmFsID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwKLQkJCSZweXJhX3Byb2ZpbGU1X3NldHRpbmdzX2F0dHIpOwotCWlmIChyZXR2YWwpCi0JCWdvdG8gZXhpdF83OwotCi0JcmV0dmFsID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwKLQkJCSZweXJhX3Byb2ZpbGVfYnV0dG9uc19hdHRyKTsKLQlpZiAocmV0dmFsKQotCQlnb3RvIGV4aXRfODsKLQotCXJldHZhbCA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosCi0JCQkmcHlyYV9wcm9maWxlMV9idXR0b25zX2F0dHIpOwotCWlmIChyZXR2YWwpCi0JCWdvdG8gZXhpdF85OwotCi0JcmV0dmFsID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwKLQkJCSZweXJhX3Byb2ZpbGUyX2J1dHRvbnNfYXR0cik7Ci0JaWYgKHJldHZhbCkKLQkJZ290byBleGl0XzEwOwotCi0JcmV0dmFsID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwKLQkJCSZweXJhX3Byb2ZpbGUzX2J1dHRvbnNfYXR0cik7Ci0JaWYgKHJldHZhbCkKLQkJZ290byBleGl0XzExOwotCi0JcmV0dmFsID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwKLQkJCSZweXJhX3Byb2ZpbGU0X2J1dHRvbnNfYXR0cik7Ci0JaWYgKHJldHZhbCkKLQkJZ290byBleGl0XzEyOwotCi0JcmV0dmFsID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwKLQkJCSZweXJhX3Byb2ZpbGU1X2J1dHRvbnNfYXR0cik7Ci0JaWYgKHJldHZhbCkKLQkJZ290byBleGl0XzEzOwotCi0JcmV0dmFsID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwKLQkJCSZweXJhX3NldHRpbmdzX2F0dHIpOwotCWlmIChyZXR2YWwpCi0JCWdvdG8gZXhpdF8xNDsKLQotCXJldHVybiAwOwotCi1leGl0XzE0OgotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZweXJhX3Byb2ZpbGU1X2J1dHRvbnNfYXR0cik7Ci1leGl0XzEzOgotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZweXJhX3Byb2ZpbGU0X2J1dHRvbnNfYXR0cik7Ci1leGl0XzEyOgotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZweXJhX3Byb2ZpbGUzX2J1dHRvbnNfYXR0cik7Ci1leGl0XzExOgotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZweXJhX3Byb2ZpbGUyX2J1dHRvbnNfYXR0cik7Ci1leGl0XzEwOgotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZweXJhX3Byb2ZpbGUxX2J1dHRvbnNfYXR0cik7Ci1leGl0Xzk6Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJnB5cmFfcHJvZmlsZV9idXR0b25zX2F0dHIpOwotZXhpdF84OgotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZweXJhX3Byb2ZpbGU1X3NldHRpbmdzX2F0dHIpOwotZXhpdF83OgotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZweXJhX3Byb2ZpbGU0X3NldHRpbmdzX2F0dHIpOwotZXhpdF82OgotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZweXJhX3Byb2ZpbGUzX3NldHRpbmdzX2F0dHIpOwotZXhpdF81OgotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZweXJhX3Byb2ZpbGUyX3NldHRpbmdzX2F0dHIpOwotZXhpdF80OgotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZweXJhX3Byb2ZpbGUxX3NldHRpbmdzX2F0dHIpOwotZXhpdF8zOgotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZweXJhX3Byb2ZpbGVfc2V0dGluZ3NfYXR0cik7Ci1leGl0XzI6Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZpbnRmLT5kZXYua29iaiwgJnB5cmFfYXR0cmlidXRlX2dyb3VwKTsKLWV4aXRfMToKLQlyZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgdm9pZCBweXJhX3JlbW92ZV9zeXNmc19hdHRyaWJ1dGVzKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQotewotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZweXJhX3NldHRpbmdzX2F0dHIpOwotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZweXJhX3Byb2ZpbGU1X2J1dHRvbnNfYXR0cik7Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJnB5cmFfcHJvZmlsZTRfYnV0dG9uc19hdHRyKTsKLQlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJmludGYtPmRldi5rb2JqLCAmcHlyYV9wcm9maWxlM19idXR0b25zX2F0dHIpOwotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZweXJhX3Byb2ZpbGUyX2J1dHRvbnNfYXR0cik7Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJnB5cmFfcHJvZmlsZTFfYnV0dG9uc19hdHRyKTsKLQlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJmludGYtPmRldi5rb2JqLCAmcHlyYV9wcm9maWxlX2J1dHRvbnNfYXR0cik7Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJnB5cmFfcHJvZmlsZTVfc2V0dGluZ3NfYXR0cik7Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJnB5cmFfcHJvZmlsZTRfc2V0dGluZ3NfYXR0cik7Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJnB5cmFfcHJvZmlsZTNfc2V0dGluZ3NfYXR0cik7Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJnB5cmFfcHJvZmlsZTJfc2V0dGluZ3NfYXR0cik7Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJnB5cmFfcHJvZmlsZTFfc2V0dGluZ3NfYXR0cik7Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJnB5cmFfcHJvZmlsZV9zZXR0aW5nc19hdHRyKTsKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJmludGYtPmRldi5rb2JqLCAmcHlyYV9hdHRyaWJ1dGVfZ3JvdXApOwotfQotCiBzdGF0aWMgaW50IHB5cmFfaW5pdF9weXJhX2RldmljZV9zdHJ1Y3Qoc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsCiAJCXN0cnVjdCBweXJhX2RldmljZSAqcHlyYSkKIHsKQEAgLTc3MCwzMSArNTcwLDI0IEBACiAKIAkJcHlyYSA9IGt6YWxsb2Moc2l6ZW9mKCpweXJhKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghcHlyYSkgewotCQkJZGV2X2VycigmaGRldi0+ZGV2LCAiY2FuJ3QgYWxsb2MgZGV2aWNlIGRlc2NyaXB0b3JcbiIpOworCQkJaGlkX2VycihoZGV2LCAiY2FuJ3QgYWxsb2MgZGV2aWNlIGRlc2NyaXB0b3JcbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAkJaGlkX3NldF9kcnZkYXRhKGhkZXYsIHB5cmEpOwogCiAJCXJldHZhbCA9IHB5cmFfaW5pdF9weXJhX2RldmljZV9zdHJ1Y3QodXNiX2RldiwgcHlyYSk7CiAJCWlmIChyZXR2YWwpIHsKLQkJCWRldl9lcnIoJmhkZXYtPmRldiwKLQkJCQkJImNvdWxkbid0IGluaXQgc3RydWN0IHB5cmFfZGV2aWNlXG4iKTsKKwkJCWhpZF9lcnIoaGRldiwgImNvdWxkbid0IGluaXQgc3RydWN0IHB5cmFfZGV2aWNlXG4iKTsKIAkJCWdvdG8gZXhpdF9mcmVlOwogCQl9CiAKLQkJcmV0dmFsID0gcm9jY2F0X2Nvbm5lY3QoaGRldik7CisJCXJldHZhbCA9IHJvY2NhdF9jb25uZWN0KHB5cmFfY2xhc3MsIGhkZXYpOwogCQlpZiAocmV0dmFsIDwgMCkgewotCQkJZGV2X2VycigmaGRldi0+ZGV2LCAiY291bGRuJ3QgaW5pdCBjaGFyIGRldlxuIik7CisJCQloaWRfZXJyKGhkZXYsICJjb3VsZG4ndCBpbml0IGNoYXIgZGV2XG4iKTsKIAkJfSBlbHNlIHsKIAkJCXB5cmEtPmNocmRldl9taW5vciA9IHJldHZhbDsKIAkJCXB5cmEtPnJvY2NhdF9jbGFpbWVkID0gMTsKIAkJfQotCi0JCXJldHZhbCA9IHB5cmFfY3JlYXRlX3N5c2ZzX2F0dHJpYnV0ZXMoaW50Zik7Ci0JCWlmIChyZXR2YWwpIHsKLQkJCWRldl9lcnIoJmhkZXYtPmRldiwgImNhbm5vdCBjcmVhdGUgc3lzZnMgZmlsZXNcbiIpOwotCQkJZ290byBleGl0X2ZyZWU7Ci0JCX0KIAl9IGVsc2UgewogCQloaWRfc2V0X2RydmRhdGEoaGRldiwgTlVMTCk7CiAJfQpAQCAtODEyLDcgKzYwNSw2IEBACiAKIAlpZiAoaW50Zi0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZVByb3RvY29sCiAJCQk9PSBVU0JfSU5URVJGQUNFX1BST1RPQ09MX01PVVNFKSB7Ci0JCXB5cmFfcmVtb3ZlX3N5c2ZzX2F0dHJpYnV0ZXMoaW50Zik7CiAJCXB5cmEgPSBoaWRfZ2V0X2RydmRhdGEoaGRldik7CiAJCWlmIChweXJhLT5yb2NjYXRfY2xhaW1lZCkKIAkJCXJvY2NhdF9kaXNjb25uZWN0KHB5cmEtPmNocmRldl9taW5vcik7CkBAIC04MjYsMTkgKzYxOCwxOSBAQAogCiAJcmV0dmFsID0gaGlkX3BhcnNlKGhkZXYpOwogCWlmIChyZXR2YWwpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKIAkJZ290byBleGl0OwogCX0KIAogCXJldHZhbCA9IGhpZF9od19zdGFydChoZGV2LCBISURfQ09OTkVDVF9ERUZBVUxUKTsKIAlpZiAocmV0dmFsKSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAlyZXR2YWwgPSBweXJhX2luaXRfc3BlY2lhbHMoaGRldik7CiAJaWYgKHJldHZhbCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJjb3VsZG4ndCBpbnN0YWxsIG1vdXNlXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiY291bGRuJ3QgaW5zdGFsbCBtb3VzZVxuIik7CiAJCWdvdG8gZXhpdF9zdG9wOwogCX0KIAlyZXR1cm4gMDsKQEAgLTk1MiwxMSArNzQ0LDI0IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHB5cmFfaW5pdCh2b2lkKQogewotCXJldHVybiBoaWRfcmVnaXN0ZXJfZHJpdmVyKCZweXJhX2RyaXZlcik7CisJaW50IHJldHZhbDsKKworCS8qIGNsYXNzIG5hbWUgaGFzIHRvIGJlIHNhbWUgYXMgZHJpdmVyIG5hbWUgKi8KKwlweXJhX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAicHlyYSIpOworCWlmIChJU19FUlIocHlyYV9jbGFzcykpCisJCXJldHVybiBQVFJfRVJSKHB5cmFfY2xhc3MpOworCXB5cmFfY2xhc3MtPmRldl9hdHRycyA9IHB5cmFfYXR0cmlidXRlczsKKwlweXJhX2NsYXNzLT5kZXZfYmluX2F0dHJzID0gcHlyYV9iaW5fYXR0cmlidXRlczsKKworCXJldHZhbCA9IGhpZF9yZWdpc3Rlcl9kcml2ZXIoJnB5cmFfZHJpdmVyKTsKKwlpZiAocmV0dmFsKQorCQljbGFzc19kZXN0cm95KHB5cmFfY2xhc3MpOworCXJldHVybiByZXR2YWw7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBweXJhX2V4aXQodm9pZCkKIHsKKwljbGFzc19kZXN0cm95KHB5cmFfY2xhc3MpOwogCWhpZF91bnJlZ2lzdGVyX2RyaXZlcigmcHlyYV9kcml2ZXIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LXB5cmEuaCBiL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQtcHlyYS5oCmluZGV4IDIyZjgwYTguLjE0Y2JiZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQtcHlyYS5oCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQtcHlyYS5oCkBAIC0xNCwxNCArMTQsMTEgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKLSNwcmFnbWEgcGFjayhwdXNoKQotI3ByYWdtYSBwYWNrKDEpCi0KIHN0cnVjdCBweXJhX2IgewogCXVpbnQ4X3QgY29tbWFuZDsgLyogUFlSQV9DT01NQU5EX0IgKi8KIAl1aW50OF90IHNpemU7IC8qIGFsd2F5cyAzICovCiAJdWludDhfdCB1bmtub3duOyAvKiAxICovCi19OworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOwogCiBzdHJ1Y3QgcHlyYV9jb250cm9sIHsKIAl1aW50OF90IGNvbW1hbmQ7IC8qIFBZUkFfQ09NTUFORF9DT05UUk9MICovCkBAIC0zMSw3ICsyOCw3IEBACiAJICovCiAJdWludDhfdCB2YWx1ZTsgLyogUmFuZ2UgMC00ICovCiAJdWludDhfdCByZXF1ZXN0OwotfTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKIAogZW51bSBweXJhX2NvbnRyb2xfcmVxdWVzdHMgewogCVBZUkFfQ09OVFJPTF9SRVFVRVNUX1NUQVRVUyA9IDB4MDAsCkBAIC00Myw3ICs0MCw3IEBACiAJdWludDhfdCBjb21tYW5kOyAvKiBQWVJBX0NPTU1BTkRfU0VUVElOR1MgKi8KIAl1aW50OF90IHNpemU7IC8qIGFsd2F5cyAzICovCiAJdWludDhfdCBzdGFydHVwX3Byb2ZpbGU7IC8qIFJhbmdlIDAtNCEgKi8KLX07Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CiAKIHN0cnVjdCBweXJhX3Byb2ZpbGVfc2V0dGluZ3MgewogCXVpbnQ4X3QgY29tbWFuZDsgLyogUFlSQV9DT01NQU5EX1BST0ZJTEVfU0VUVElOR1MgKi8KQEAgLTU4LDcgKzU1LDcgQEAKIAl1aW50OF90IGxpZ2h0X2VmZmVjdDsKIAl1aW50OF90IGhhbmRlZG5lc3M7CiAJdWludDE2X3QgY2hlY2tzdW07IC8qIGJ5dGUgc3VtICovCi19OworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOwogCiBzdHJ1Y3QgcHlyYV9wcm9maWxlX2J1dHRvbnMgewogCXVpbnQ4X3QgY29tbWFuZDsgLyogUFlSQV9DT01NQU5EX1BST0ZJTEVfQlVUVE9OUyAqLwpAQCAtNjYsNyArNjMsNyBAQAogCXVpbnQ4X3QgbnVtYmVyOyAvKiBSYW5nZSAwLTQgKi8KIAl1aW50OF90IGJ1dHRvbnNbMTRdOwogCXVpbnQxNl90IGNoZWNrc3VtOyAvKiBieXRlIHN1bSAqLwotfTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKIAogc3RydWN0IHB5cmFfaW5mbyB7CiAJdWludDhfdCBjb21tYW5kOyAvKiBQWVJBX0NPTU1BTkRfSU5GTyAqLwpAQCAtNzUsNyArNzIsNyBAQAogCXVpbnQ4X3QgdW5rbm93bjE7IC8qIGFsd2F5cyAwICovCiAJdWludDhfdCB1bmtub3duMjsgLyogYWx3YXlzIDEgKi8KIAl1aW50OF90IHVua25vd24zOyAvKiBhbHdheXMgMCAqLwotfTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKIAogZW51bSBweXJhX2NvbW1hbmRzIHsKIAlQWVJBX0NPTU1BTkRfQ09OVFJPTCA9IDB4NCwKQEAgLTEwNywxMyArMTA0LDEzIEBACiAJdWludDhfdCB0eXBlOwogCXVpbnQ4X3QgZGF0YTE7CiAJdWludDhfdCBkYXRhMjsKLX07Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CiAKIHN0cnVjdCBweXJhX21vdXNlX2V2ZW50X2F1ZGlvIHsKIAl1aW50OF90IHJlcG9ydF9udW1iZXI7IC8qIGFsd2F5cyAyICovCiAJdWludDhfdCB0eXBlOwogCXVpbnQ4X3QgdW51c2VkOyAvKiBhbHdheXMgMCAqLwotfTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKIAogLyogaGlkIGF1ZGlvIGNvbnRyb2xzICovCiBlbnVtIHB5cmFfbW91c2VfZXZlbnRfYXVkaW9fdHlwZXMgewpAQCAtMTY3LDkgKzE2NCw3IEBACiAJdWludDhfdCB0eXBlOwogCXVpbnQ4X3QgdmFsdWU7CiAJdWludDhfdCBrZXk7Ci19OwotCi0jcHJhZ21hIHBhY2socG9wKQorfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOwogCiBzdHJ1Y3QgcHlyYV9kZXZpY2UgewogCWludCBhY3R1YWxfcHJvZmlsZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQuYyBiL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQuYwppbmRleCA1YTY4NzllLi5hMTRjNTc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC5jCkBAIC0yMSw2ICsyMSw4IEBACiAgKiBJdCBpcyBpbnNwaXJlZCBieSBoaWRyYXcsIGJ1dCB1c2VzIG9ubHkgb25lIGNpcmN1bGFyIGJ1ZmZlciBmb3IgYWxsIHJlYWRlcnMuCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvY2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgpAQCAtNjUsNyArNjcsNiBAQAogfTsKIAogc3RhdGljIGludCByb2NjYXRfbWFqb3I7Ci1zdGF0aWMgc3RydWN0IGNsYXNzICpyb2NjYXRfY2xhc3M7CiBzdGF0aWMgc3RydWN0IGNkZXYgcm9jY2F0X2NkZXY7CiAKIHN0YXRpYyBzdHJ1Y3Qgcm9jY2F0X2RldmljZSAqZGV2aWNlc1tST0NDQVRfTUFYX0RFVklDRVNdOwpAQCAtMTY1LDI3ICsxNjYsMjIgQEAKIAltdXRleF9sb2NrKCZkZXZpY2UtPnJlYWRlcnNfbG9jayk7CiAKIAlpZiAoIWRldmljZSkgewotCQlwcmludGsoS0VSTl9FTUVSRyAicm9jY2F0IGRldmljZSB3aXRoIG1pbm9yICVkIGRvZXNuJ3QgZXhpc3RcbiIsCi0JCQkJbWlub3IpOworCQlwcl9lbWVyZygicm9jY2F0IGRldmljZSB3aXRoIG1pbm9yICVkIGRvZXNuJ3QgZXhpc3RcbiIsIG1pbm9yKTsKIAkJZXJyb3IgPSAtRU5PREVWOwogCQlnb3RvIGV4aXRfZXJyOwogCX0KIAogCWlmICghZGV2aWNlLT5vcGVuKyspIHsKIAkJLyogcG93ZXIgb24gZGV2aWNlIG9uIGFkZGluZyBmaXJzdCByZWFkZXIgKi8KLQkJaWYgKGRldmljZS0+aGlkLT5sbF9kcml2ZXItPnBvd2VyKSB7Ci0JCQllcnJvciA9IGRldmljZS0+aGlkLT5sbF9kcml2ZXItPnBvd2VyKGRldmljZS0+aGlkLAotCQkJCQlQTV9ISU5UX0ZVTExPTik7Ci0JCQlpZiAoZXJyb3IgPCAwKSB7Ci0JCQkJLS1kZXZpY2UtPm9wZW47Ci0JCQkJZ290byBleGl0X2VycjsKLQkJCX0KLQkJfQotCQllcnJvciA9IGRldmljZS0+aGlkLT5sbF9kcml2ZXItPm9wZW4oZGV2aWNlLT5oaWQpOworCQllcnJvciA9IGhpZF9od19wb3dlcihkZXZpY2UtPmhpZCwgUE1fSElOVF9GVUxMT04pOwogCQlpZiAoZXJyb3IgPCAwKSB7Ci0JCQlpZiAoZGV2aWNlLT5oaWQtPmxsX2RyaXZlci0+cG93ZXIpCi0JCQkJZGV2aWNlLT5oaWQtPmxsX2RyaXZlci0+cG93ZXIoZGV2aWNlLT5oaWQsCi0JCQkJCQlQTV9ISU5UX05PUk1BTCk7CisJCQktLWRldmljZS0+b3BlbjsKKwkJCWdvdG8gZXhpdF9lcnI7CisJCX0KKworCQllcnJvciA9IGhpZF9od19vcGVuKGRldmljZS0+aGlkKTsKKwkJaWYgKGVycm9yIDwgMCkgeworCQkJaGlkX2h3X3Bvd2VyKGRldmljZS0+aGlkLCBQTV9ISU5UX05PUk1BTCk7CiAJCQktLWRldmljZS0+b3BlbjsKIAkJCWdvdG8gZXhpdF9lcnI7CiAJCX0KQEAgLTIxOCw4ICsyMTQsNyBAQAogCWRldmljZSA9IGRldmljZXNbbWlub3JdOwogCWlmICghZGV2aWNlKSB7CiAJCW11dGV4X3VubG9jaygmZGV2aWNlc19sb2NrKTsKLQkJcHJpbnRrKEtFUk5fRU1FUkcgInJvY2NhdCBkZXZpY2Ugd2l0aCBtaW5vciAlZCBkb2Vzbid0IGV4aXN0XG4iLAotCQkJCW1pbm9yKTsKKwkJcHJfZW1lcmcoInJvY2NhdCBkZXZpY2Ugd2l0aCBtaW5vciAlZCBkb2Vzbid0IGV4aXN0XG4iLCBtaW5vcik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtMjMxLDEwICsyMjYsOCBAQAogCWlmICghLS1kZXZpY2UtPm9wZW4pIHsKIAkJLyogcmVtb3ZpbmcgbGFzdCByZWFkZXIgKi8KIAkJaWYgKGRldmljZS0+ZXhpc3QpIHsKLQkJCWlmIChkZXZpY2UtPmhpZC0+bGxfZHJpdmVyLT5wb3dlcikKLQkJCQlkZXZpY2UtPmhpZC0+bGxfZHJpdmVyLT5wb3dlcihkZXZpY2UtPmhpZCwKLQkJCQkJCVBNX0hJTlRfTk9STUFMKTsKLQkJCWRldmljZS0+aGlkLT5sbF9kcml2ZXItPmNsb3NlKGRldmljZS0+aGlkKTsKKwkJCWhpZF9od19wb3dlcihkZXZpY2UtPmhpZCwgUE1fSElOVF9OT1JNQUwpOworCQkJaGlkX2h3X2Nsb3NlKGRldmljZS0+aGlkKTsKIAkJfSBlbHNlIHsKIAkJCWtmcmVlKGRldmljZSk7CiAJCX0KQEAgLTI5NSwxMiArMjg4LDE0IEBACiAKIC8qCiAgKiByb2NjYXRfY29ubmVjdCgpIC0gY3JlYXRlIGEgY2hhciBkZXZpY2UgZm9yIHNwZWNpYWwgZXZlbnQgb3V0cHV0CisgKiBAY2xhc3M6IHRoZSBjbGFzcyB0aGF0cyB1c2VkIHRvIGNyZWF0ZSB0aGUgZGV2aWNlLiBNZWFudCB0byBob2xkIGRldmljZQorICogc3BlY2lmaWMgc3lzZnMgYXR0cmlidXRlcy4KICAqIEBoaWQ6IHRoZSBoaWQgZGV2aWNlIHRoZSBjaGFyIGRldmljZSBzaG91bGQgYmUgY29ubmVjdGVkIHRvLgogICoKICAqIFJldHVybiB2YWx1ZSBpcyBtaW5vciBkZXZpY2UgbnVtYmVyIGluIFJhbmdlIFswLCBST0NDQVRfTUFYX0RFVklDRVNdIG9uCiAgKiBzdWNjZXNzLCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KICAqLwotaW50IHJvY2NhdF9jb25uZWN0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpCitpbnQgcm9jY2F0X2Nvbm5lY3Qoc3RydWN0IGNsYXNzICprbGFzcywgc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkKIHsKIAl1bnNpZ25lZCBpbnQgbWlub3I7CiAJc3RydWN0IHJvY2NhdF9kZXZpY2UgKmRldmljZTsKQEAgLTMyNiw3ICszMjEsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlkZXZpY2UtPmRldiA9IGRldmljZV9jcmVhdGUocm9jY2F0X2NsYXNzLCAmaGlkLT5kZXYsCisJZGV2aWNlLT5kZXYgPSBkZXZpY2VfY3JlYXRlKGtsYXNzLCAmaGlkLT5kZXYsCiAJCQlNS0RFVihyb2NjYXRfbWFqb3IsIG1pbm9yKSwgTlVMTCwKIAkJCSIlcyVzJWQiLCAicm9jY2F0IiwgaGlkLT5kcml2ZXItPm5hbWUsIG1pbm9yKTsKIApAQCAtMzY3LDEwICszNjIsMTAgQEAKIAogCWRldmljZS0+ZXhpc3QgPSAwOyAvKiBUT0RPIGV4aXN0IG1heWJlIG5vdCBuZWVkZWQgKi8KIAotCWRldmljZV9kZXN0cm95KHJvY2NhdF9jbGFzcywgTUtERVYocm9jY2F0X21ham9yLCBtaW5vcikpOworCWRldmljZV9kZXN0cm95KGRldmljZS0+ZGV2LT5jbGFzcywgTUtERVYocm9jY2F0X21ham9yLCBtaW5vcikpOwogCiAJaWYgKGRldmljZS0+b3BlbikgewotCQlkZXZpY2UtPmhpZC0+bGxfZHJpdmVyLT5jbG9zZShkZXZpY2UtPmhpZCk7CisJCWhpZF9od19jbG9zZShkZXZpY2UtPmhpZCk7CiAJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2aWNlLT53YWl0KTsKIAl9IGVsc2UgewogCQlrZnJlZShkZXZpY2UpOwpAQCAtMzk4LDE0ICszOTMsNyBAQAogCXJvY2NhdF9tYWpvciA9IE1BSk9SKGRldl9pZCk7CiAKIAlpZiAocmV0dmFsIDwgMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJyb2NjYXQ6IGNhbid0IGdldCBtYWpvciBudW1iZXJcbiIpOwotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQotCXJvY2NhdF9jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgInJvY2NhdCIpOwotCWlmIChJU19FUlIocm9jY2F0X2NsYXNzKSkgewotCQlyZXR2YWwgPSBQVFJfRVJSKHJvY2NhdF9jbGFzcyk7Ci0JCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihkZXZfaWQsIFJPQ0NBVF9NQVhfREVWSUNFUyk7CisJCXByX3dhcm4oImNhbid0IGdldCBtYWpvciBudW1iZXJcbiIpOwogCQlyZXR1cm4gcmV0dmFsOwogCX0KIApAQCAtNDIwLDcgKzQwOCw2IEBACiAJZGV2X3QgZGV2X2lkID0gTUtERVYocm9jY2F0X21ham9yLCAwKTsKIAogCWNkZXZfZGVsKCZyb2NjYXRfY2Rldik7Ci0JY2xhc3NfZGVzdHJveShyb2NjYXRfY2xhc3MpOwogCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihkZXZfaWQsIFJPQ0NBVF9NQVhfREVWSUNFUyk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQuaCBiL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQuaAppbmRleCAwOWU4NjRlLi41Nzg0MjgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LmgKKysrIGIvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC5oCkBAIC0xNiwxMSArMTYsMTIgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiAjaWYgZGVmaW5lZChDT05GSUdfSElEX1JPQ0NBVCkgfHwgZGVmaW5lZChDT05GSUdfSElEX1JPQ0NBVF9NT0RVTEUpCi1pbnQgcm9jY2F0X2Nvbm5lY3Qoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCk7CitpbnQgcm9jY2F0X2Nvbm5lY3Qoc3RydWN0IGNsYXNzICprbGFzcywgc3RydWN0IGhpZF9kZXZpY2UgKmhpZCk7CiB2b2lkIHJvY2NhdF9kaXNjb25uZWN0KGludCBtaW5vcik7CiBpbnQgcm9jY2F0X3JlcG9ydF9ldmVudChpbnQgbWlub3IsIHU4IGNvbnN0ICpkYXRhLCBpbnQgbGVuKTsKICNlbHNlCi1zdGF0aWMgaW5saW5lIGludCByb2NjYXRfY29ubmVjdChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKSB7IHJldHVybiAtMTsgfQorc3RhdGljIGlubGluZSBpbnQgcm9jY2F0X2Nvbm5lY3Qoc3RydWN0IGNsYXNzICprbGFzcywKKwkJc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkgeyByZXR1cm4gLTE7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCByb2NjYXRfZGlzY29ubmVjdChpbnQgbWlub3IpIHt9CiBzdGF0aWMgaW5saW5lIGludCByb2NjYXRfcmVwb3J0X2V2ZW50KGludCBtaW5vciwgdTggY29uc3QgKmRhdGEsIGludCBsZW4pCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtc2Ftc3VuZy5jIGIvZHJpdmVycy9oaWQvaGlkLXNhbXN1bmcuYwppbmRleCAzNTg5NDQ0Li4zYzFmZDhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtc2Ftc3VuZy5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1zYW1zdW5nLmMKQEAgLTU3LDggKzU3LDggQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzYW1zdW5nX2lyZGFfZGV2X3RyYWNlKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LAogCQl1bnNpZ25lZCBpbnQgcnNpemUpCiB7Ci0JZGV2X2luZm8oJmhkZXYtPmRldiwgImZpeGluZyB1cCBTYW1zdW5nIElyREEgJWQgYnl0ZSByZXBvcnQgIgotCQkJImRlc2NyaXB0b3JcbiIsIHJzaXplKTsKKwloaWRfaW5mbyhoZGV2LCAiZml4aW5nIHVwIFNhbXN1bmcgSXJEQSAlZCBieXRlIHJlcG9ydCBkZXNjcmlwdG9yXG4iLAorCQkgcnNpemUpOwogfQogCiBzdGF0aWMgX191OCAqc2Ftc3VuZ19pcmRhX3JlcG9ydF9maXh1cChzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgX191OCAqcmRlc2MsCkBAIC0xNjAsNyArMTYwLDcgQEAKIAogCXJldCA9IGhpZF9wYXJzZShoZGV2KTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgInBhcnNlIGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgInBhcnNlIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX2ZyZWU7CiAJfQogCkBAIC0xNzQsNyArMTc0LDcgQEAKIAogCXJldCA9IGhpZF9od19zdGFydChoZGV2LCBjbWFzayk7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOwogCQlnb3RvIGVycl9mcmVlOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLXNqb3kuYyBiL2RyaXZlcnMvaGlkL2hpZC1zam95LmMKaW5kZXggZTEwYTc2OC4uMTZmN2NhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLXNqb3kuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtc2pveS5jCkBAIC03NCwyNiArNzQsMjUgQEAKIAlpbnQgZXJyb3I7CiAKIAlpZiAobGlzdF9lbXB0eShyZXBvcnRfbGlzdCkpIHsKLQkJZGV2X2VycigmaGlkLT5kZXYsICJubyBvdXRwdXQgcmVwb3J0cyBmb3VuZFxuIik7CisJCWhpZF9lcnIoaGlkLCAibm8gb3V0cHV0IHJlcG9ydHMgZm91bmRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAlyZXBvcnRfcHRyID0gcmVwb3J0X3B0ci0+bmV4dDsKIAogCWlmIChyZXBvcnRfcHRyID09IHJlcG9ydF9saXN0KSB7Ci0JCWRldl9lcnIoJmhpZC0+ZGV2LCAicmVxdWlyZWQgb3V0cHV0IHJlcG9ydCBpcyAiCi0JCQkJIm1pc3NpbmdcbiIpOworCQloaWRfZXJyKGhpZCwgInJlcXVpcmVkIG91dHB1dCByZXBvcnQgaXMgbWlzc2luZ1xuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCXJlcG9ydCA9IGxpc3RfZW50cnkocmVwb3J0X3B0ciwgc3RydWN0IGhpZF9yZXBvcnQsIGxpc3QpOwogCWlmIChyZXBvcnQtPm1heGZpZWxkIDwgMSkgewotCQlkZXZfZXJyKCZoaWQtPmRldiwgIm5vIGZpZWxkcyBpbiB0aGUgcmVwb3J0XG4iKTsKKwkJaGlkX2VycihoaWQsICJubyBmaWVsZHMgaW4gdGhlIHJlcG9ydFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCWlmIChyZXBvcnQtPmZpZWxkWzBdLT5yZXBvcnRfY291bnQgPCAzKSB7Ci0JCWRldl9lcnIoJmhpZC0+ZGV2LCAibm90IGVub3VnaCB2YWx1ZXMgaW4gdGhlIGZpZWxkXG4iKTsKKwkJaGlkX2VycihoaWQsICJub3QgZW5vdWdoIHZhbHVlcyBpbiB0aGUgZmllbGRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTExNyw4ICsxMTYsNyBAQAogCXNqb3lmZi0+cmVwb3J0LT5maWVsZFswXS0+dmFsdWVbMl0gPSAweDAwOwogCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgc2pveWZmLT5yZXBvcnQsIFVTQl9ESVJfT1VUKTsKIAotCWRldl9pbmZvKCZoaWQtPmRldiwKLQkJIkZvcmNlIGZlZWRiYWNrIGZvciBTbWFydEpveSBQTFVTIFBTMi9VU0IgYWRhcHRlclxuIik7CisJaGlkX2luZm8oaGlkLCAiRm9yY2UgZmVlZGJhY2sgZm9yIFNtYXJ0Sm95IFBMVVMgUFMyL1VTQiBhZGFwdGVyXG4iKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTM1LDEzICsxMzMsMTMgQEAKIAogCXJldCA9IGhpZF9wYXJzZShoZGV2KTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgInBhcnNlIGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgInBhcnNlIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyOwogCX0KIAogCXJldCA9IGhpZF9od19zdGFydChoZGV2LCBISURfQ09OTkVDVF9ERUZBVUxUICYgfkhJRF9DT05ORUNUX0ZGKTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLXNvbnkuYyBiL2RyaXZlcnMvaGlkL2hpZC1zb255LmMKaW5kZXggNjc3YmIzZC4uNjhkN2IzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLXNvbnkuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtc29ueS5jCkBAIC00MCw4ICs0MCw3IEBACiAKIAlpZiAoKHNjLT5xdWlya3MgJiBWQUlPX1JERVNDX0NPTlNUQU5UKSAmJgogCQkJKnJzaXplID49IDU2ICYmIHJkZXNjWzU0XSA9PSAweDgxICYmIHJkZXNjWzU1XSA9PSAweDA3KSB7Ci0JCWRldl9pbmZvKCZoZGV2LT5kZXYsICJGaXhpbmcgdXAgU29ueSBWYWlvIFZHWCByZXBvcnQgIgotCQkJCSJkZXNjcmlwdG9yXG4iKTsKKwkJaGlkX2luZm8oaGRldiwgIkZpeGluZyB1cCBTb255IFZhaW8gVkdYIHJlcG9ydCBkZXNjcmlwdG9yXG4iKTsKIAkJcmRlc2NbNTVdID0gMHgwNjsKIAl9CiAJcmV0dXJuIHJkZXNjOwpAQCAtODksNyArODgsNyBAQAogCQkJCSAoMyA8PCA4KSB8IDB4ZjIsIGlmbnVtLCBidWYsIDE3LAogCQkJCSBVU0JfQ1RSTF9HRVRfVElNRU9VVCk7CiAJaWYgKHJldCA8IDApCi0JCWRldl9lcnIoJmhkZXYtPmRldiwgImNhbid0IHNldCBvcGVyYXRpb25hbCBtb2RlXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiY2FuJ3Qgc2V0IG9wZXJhdGlvbmFsIG1vZGVcbiIpOwogCiAJa2ZyZWUoYnVmKTsKIApAQCAtMTEwLDcgKzEwOSw3IEBACiAKIAlzYyA9IGt6YWxsb2Moc2l6ZW9mKCpzYyksIEdGUF9LRVJORUwpOwogCWlmIChzYyA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImNhbid0IGFsbG9jIHNvbnkgZGVzY3JpcHRvclxuIik7CisJCWhpZF9lcnIoaGRldiwgImNhbid0IGFsbG9jIHNvbnkgZGVzY3JpcHRvclxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMTE5LDE0ICsxMTgsMTQgQEAKIAogCXJldCA9IGhpZF9wYXJzZShoZGV2KTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgInBhcnNlIGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgInBhcnNlIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX2ZyZWU7CiAJfQogCiAJcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIEhJRF9DT05ORUNUX0RFRkFVTFQgfAogCQkJSElEX0NPTk5FQ1RfSElEREVWX0ZPUkNFKTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX2ZyZWU7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtc3RhbnR1bS5jIGIvZHJpdmVycy9oaWQvaGlkLXN0YW50dW0uYwppbmRleCAzMTcxYmUyLi5iMmJlMWQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtc3RhbnR1bS5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1zdGFudHVtLmMKQEAgLTIyMiw3ICsyMjIsNyBAQAogCiAJc2QgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3RhbnR1bV9kYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzZCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJjYW5ub3QgYWxsb2NhdGUgU3RhbnR1bSBkYXRhXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiY2Fubm90IGFsbG9jYXRlIFN0YW50dW0gZGF0YVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlzZC0+dmFsaWQgPSBmYWxzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1zdW5wbHVzLmMgYi9kcml2ZXJzL2hpZC9oaWQtc3VucGx1cy5jCmluZGV4IDE2NGVkNTYuLmQ0ODRhMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1zdW5wbHVzLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLXN1bnBsdXMuYwpAQCAtMjcsOCArMjcsNyBAQAogewogCWlmICgqcnNpemUgPj0gMTA3ICYmIHJkZXNjWzEwNF0gPT0gMHgyNiAmJiByZGVzY1sxMDVdID09IDB4ODAgJiYKIAkJCXJkZXNjWzEwNl0gPT0gMHgwMykgewotCQlkZXZfaW5mbygmaGRldi0+ZGV2LCAiZml4aW5nIHVwIFN1bnBsdXMgV2lyZWxlc3MgRGVza3RvcCAiCi0JCQkJInJlcG9ydCBkZXNjcmlwdG9yXG4iKTsKKwkJaGlkX2luZm8oaGRldiwgImZpeGluZyB1cCBTdW5wbHVzIFdpcmVsZXNzIERlc2t0b3AgcmVwb3J0IGRlc2NyaXB0b3JcbiIpOwogCQlyZGVzY1sxMDVdID0gcmRlc2NbMTEwXSA9IDB4MDM7CiAJCXJkZXNjWzEwNl0gPSByZGVzY1sxMTFdID0gMHgyMTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtdG1mZi5jIGIvZHJpdmVycy9oaWQvaGlkLXRtZmYuYwppbmRleCAyNWJlNGUxLi41NzU4NjJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtdG1mZi5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC10bWZmLmMKQEAgLTE1MSwyOCArMTUxLDIzIEBACiAJCQlzd2l0Y2ggKGZpZWxkLT51c2FnZVswXS5oaWQpIHsKIAkJCWNhc2UgVEhSVVNUTUFTVEVSX1VTQUdFX0ZGOgogCQkJCWlmIChmaWVsZC0+cmVwb3J0X2NvdW50IDwgMikgewotCQkJCQlkZXZfd2FybigmaGlkLT5kZXYsICJpZ25vcmluZyBGRiBmaWVsZCAiCi0JCQkJCQkid2l0aCByZXBvcnRfY291bnQgPCAyXG4iKTsKKwkJCQkJaGlkX3dhcm4oaGlkLCAiaWdub3JpbmcgRkYgZmllbGQgd2l0aCByZXBvcnRfY291bnQgPCAyXG4iKTsKIAkJCQkJY29udGludWU7CiAJCQkJfQogCiAJCQkJaWYgKGZpZWxkLT5sb2dpY2FsX21heGltdW0gPT0KIAkJCQkJCWZpZWxkLT5sb2dpY2FsX21pbmltdW0pIHsKLQkJCQkJZGV2X3dhcm4oJmhpZC0+ZGV2LCAiaWdub3JpbmcgRkYgZmllbGQgIgotCQkJCQkJCSJ3aXRoIGxvZ2ljYWxfbWF4aW11bSAiCi0JCQkJCQkJIj09IGxvZ2ljYWxfbWluaW11bVxuIik7CisJCQkJCWhpZF93YXJuKGhpZCwgImlnbm9yaW5nIEZGIGZpZWxkIHdpdGggbG9naWNhbF9tYXhpbXVtID09IGxvZ2ljYWxfbWluaW11bVxuIik7CiAJCQkJCWNvbnRpbnVlOwogCQkJCX0KIAogCQkJCWlmICh0bWZmLT5yZXBvcnQgJiYgdG1mZi0+cmVwb3J0ICE9IHJlcG9ydCkgewotCQkJCQlkZXZfd2FybigmaGlkLT5kZXYsICJpZ25vcmluZyBGRiBmaWVsZCAiCi0JCQkJCQkJImluIG90aGVyIHJlcG9ydFxuIik7CisJCQkJCWhpZF93YXJuKGhpZCwgImlnbm9yaW5nIEZGIGZpZWxkIGluIG90aGVyIHJlcG9ydFxuIik7CiAJCQkJCWNvbnRpbnVlOwogCQkJCX0KIAogCQkJCWlmICh0bWZmLT5mZl9maWVsZCAmJiB0bWZmLT5mZl9maWVsZCAhPSBmaWVsZCkgewotCQkJCQlkZXZfd2FybigmaGlkLT5kZXYsICJpZ25vcmluZyAiCi0JCQkJCQkJImR1cGxpY2F0ZSBGRiBmaWVsZFxuIik7CisJCQkJCWhpZF93YXJuKGhpZCwgImlnbm9yaW5nIGR1cGxpY2F0ZSBGRiBmaWVsZFxuIik7CiAJCQkJCWNvbnRpbnVlOwogCQkJCX0KIApAQCAtMTg1LDE2ICsxODAsMTUgQEAKIAkJCQlicmVhazsKIAogCQkJZGVmYXVsdDoKLQkJCQlkZXZfd2FybigmaGlkLT5kZXYsICJpZ25vcmluZyB1bmtub3duIG91dHB1dCAiCi0JCQkJCQkidXNhZ2UgJTA4eFxuIiwKLQkJCQkJCWZpZWxkLT51c2FnZVswXS5oaWQpOworCQkJCWhpZF93YXJuKGhpZCwgImlnbm9yaW5nIHVua25vd24gb3V0cHV0IHVzYWdlICUwOHhcbiIsCisJCQkJCSBmaWVsZC0+dXNhZ2VbMF0uaGlkKTsKIAkJCQljb250aW51ZTsKIAkJCX0KIAkJfQogCX0KIAogCWlmICghdG1mZi0+cmVwb3J0KSB7Ci0JCWRldl9lcnIoJmhpZC0+ZGV2LCAiY2FuJ3QgZmluZCBGRiBmaWVsZCBpbiBvdXRwdXQgcmVwb3J0c1xuIik7CisJCWhpZF9lcnIoaGlkLCAiY2FuJ3QgZmluZCBGRiBmaWVsZCBpbiBvdXRwdXQgcmVwb3J0c1xuIik7CiAJCWVycm9yID0gLUVOT0RFVjsKIAkJZ290byBmYWlsOwogCX0KQEAgLTIwMyw4ICsxOTcsNyBAQAogCWlmIChlcnJvcikKIAkJZ290byBmYWlsOwogCi0JZGV2X2luZm8oJmhpZC0+ZGV2LCAiZm9yY2UgZmVlZGJhY2sgZm9yIFRocnVzdE1hc3RlciBkZXZpY2VzIGJ5IFppbnggIgotCQkJIlZlcml0dXNlIDx6aW54QGVwaWNzb2wub3JnPiIpOworCWhpZF9pbmZvKGhpZCwgImZvcmNlIGZlZWRiYWNrIGZvciBUaHJ1c3RNYXN0ZXIgZGV2aWNlcyBieSBaaW54IFZlcml0dXNlIDx6aW54QGVwaWNzb2wub3JnPlxuIik7CiAJcmV0dXJuIDA7CiAKIGZhaWw6CkBAIC0yMjQsMTMgKzIxNywxMyBAQAogCiAJcmV0ID0gaGlkX3BhcnNlKGhkZXYpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKIAkJZ290byBlcnI7CiAJfQogCiAJcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIEhJRF9DT05ORUNUX0RFRkFVTFQgJiB+SElEX0NPTk5FQ1RfRkYpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKIAkJZ290byBlcnI7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtdG9wc2VlZC5jIGIvZHJpdmVycy9oaWQvaGlkLXRvcHNlZWQuYwppbmRleCA5NTZlZDlhLi42MTNmZjdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtdG9wc2VlZC5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC10b3BzZWVkLmMKQEAgLTY2LDYgKzY2LDcgQEAKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQlRDLCBVU0JfREVWSUNFX0lEX0JUQ19FTVBSRVhfUkVNT1RFKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9CVEMsIFVTQl9ERVZJQ0VfSURfQlRDX0VNUFJFWF9SRU1PVEVfMikgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfVE9QU0VFRDIsIFVTQl9ERVZJQ0VfSURfVE9QU0VFRDJfUkZfQ09NQk8pIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0NISUNPTlksIFVTQl9ERVZJQ0VfSURfQ0hJQ09OWV9XSVJFTEVTUykgfSwKIAl7IH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGhpZCwgdHNfZGV2aWNlcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtd2Fjb20uYyBiL2RyaXZlcnMvaGlkL2hpZC13YWNvbS5jCmluZGV4IDcyNGY0NmUuLjA2ODg4MzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC13YWNvbS5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC13YWNvbS5jCkBAIC0xOCw2ICsxOCw4IEBACiAgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9oaWQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTE0MSw4ICsxNDMsOCBAQAogCSAqIE5vdGUgdGhhdCBpZiB0aGUgcmF3IHF1ZXJpZXMgZmFpbCwgaXQncyBub3QgYSBoYXJkIGZhaWx1cmUgYW5kIGl0CiAJICogaXMgc2FmZSB0byBjb250aW51ZQogCSAqLwotCWRldl93YXJuKCZoZGV2LT5kZXYsICJmYWlsZWQgdG8gcG9rZSBkZXZpY2UsIGNvbW1hbmQgJWQsIGVyciAlZFxuIiwKLQkJCQlyZXBfZGF0YVswXSwgcmV0KTsKKwloaWRfd2FybihoZGV2LCAiZmFpbGVkIHRvIHBva2UgZGV2aWNlLCBjb21tYW5kICVkLCBlcnIgJWRcbiIsCisJCSByZXBfZGF0YVswXSwgcmV0KTsKIAlyZXR1cm47CiB9CiAKQEAgLTE3Miw3ICsxNzQsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIERFVklDRV9BVFRSKHNwZWVkLCBTX0lSVUdPIHwgU19JV1VHTywKK3N0YXRpYyBERVZJQ0VfQVRUUihzcGVlZCwgU19JUlVHTyB8IFNfSVdVU1IgfCBTX0lXR1JQLAogCQl3YWNvbV9zaG93X3NwZWVkLCB3YWNvbV9zdG9yZV9zcGVlZCk7CiAKIHN0YXRpYyBpbnQgd2Fjb21fcmF3X2V2ZW50KHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0LApAQCAtMzEyLDcgKzMxNCw3IEBACiAKIAl3ZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCp3ZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICh3ZGF0YSA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImNhbid0IGFsbG9jIHdhY29tIGRlc2NyaXB0b3JcbiIpOworCQloaWRfZXJyKGhkZXYsICJjYW4ndCBhbGxvYyB3YWNvbSBkZXNjcmlwdG9yXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0zMjEsMjAgKzMyMywyMCBAQAogCS8qIFBhcnNlIHRoZSBISUQgcmVwb3J0IG5vdyAqLwogCXJldCA9IGhpZF9wYXJzZShoZGV2KTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgInBhcnNlIGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgInBhcnNlIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX2ZyZWU7CiAJfQogCiAJcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIEhJRF9DT05ORUNUX0RFRkFVTFQpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKIAlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmhkZXYtPmRldiwgJmRldl9hdHRyX3NwZWVkKTsKIAlpZiAocmV0KQotCQlkZXZfd2FybigmaGRldi0+ZGV2LAotCQkJImNhbid0IGNyZWF0ZSBzeXNmcyBzcGVlZCBhdHRyaWJ1dGUgZXJyOiAlZFxuIiwgcmV0KTsKKwkJaGlkX3dhcm4oaGRldiwKKwkJCSAiY2FuJ3QgY3JlYXRlIHN5c2ZzIHNwZWVkIGF0dHJpYnV0ZSBlcnI6ICVkXG4iLCByZXQpOwogCiAJLyogU2V0IFdhY29tIG1vZGUgMiB3aXRoIGhpZ2ggcmVwb3J0aW5nIHNwZWVkICovCiAJd2Fjb21fcG9rZShoZGV2LCAxKTsKQEAgLTM0OSw4ICszNTEsOCBAQAogCiAJcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZoZGV2LT5kZXYsICZ3ZGF0YS0+YmF0dGVyeSk7CiAJaWYgKHJldCkgewotCQlkZXZfd2FybigmaGRldi0+ZGV2LAotCQkJImNhbid0IGNyZWF0ZSBzeXNmcyBiYXR0ZXJ5IGF0dHJpYnV0ZSwgZXJyOiAlZFxuIiwgcmV0KTsKKwkJaGlkX3dhcm4oaGRldiwgImNhbid0IGNyZWF0ZSBzeXNmcyBiYXR0ZXJ5IGF0dHJpYnV0ZSwgZXJyOiAlZFxuIiwKKwkJCSByZXQpOwogCQkvKgogCQkgKiBiYXR0ZXJ5IGF0dHJpYnV0ZSBpcyBub3QgY3JpdGljYWwgZm9yIHRoZSB0YWJsZXQsIGJ1dCBpZiBpdAogCQkgKiBmYWlsZWQgdGhlbiB0aGVyZSBpcyBubyBuZWVkIHRvIGNyZWF0ZSBhYyBhdHRyaWJ1dGUKQEAgLTM2Nyw4ICszNjksOCBAQAogCiAJcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZoZGV2LT5kZXYsICZ3ZGF0YS0+YWMpOwogCWlmIChyZXQpIHsKLQkJZGV2X3dhcm4oJmhkZXYtPmRldiwKLQkJCSJjYW4ndCBjcmVhdGUgYWMgYmF0dGVyeSBhdHRyaWJ1dGUsIGVycjogJWRcbiIsIHJldCk7CisJCWhpZF93YXJuKGhkZXYsCisJCQkgImNhbid0IGNyZWF0ZSBhYyBiYXR0ZXJ5IGF0dHJpYnV0ZSwgZXJyOiAlZFxuIiwgcmV0KTsKIAkJLyoKIAkJICogYWMgYXR0cmlidXRlIGlzIG5vdCBjcml0aWNhbCBmb3IgdGhlIHRhYmxldCwgYnV0IGlmIGl0CiAJCSAqIGZhaWxlZCB0aGVuIHdlIGRvbid0IHdhbnQgdG8gYmF0dGVyeSBhdHRyaWJ1dGUgdG8gZXhpc3QKQEAgLTQ1NCw3ICs0NTYsNyBAQAogCiAJcmV0ID0gaGlkX3JlZ2lzdGVyX2RyaXZlcigmd2Fjb21fZHJpdmVyKTsKIAlpZiAocmV0KQotCQlwcmludGsoS0VSTl9FUlIgImNhbid0IHJlZ2lzdGVyIHdhY29tIGRyaXZlclxuIik7CisJCXByX2VycigiY2FuJ3QgcmVnaXN0ZXIgd2Fjb20gZHJpdmVyXG4iKTsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtenBmZi5jIGIvZHJpdmVycy9oaWQvaGlkLXpwZmYuYwppbmRleCBiN2FjY2VhLi5mMzFmYWIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtenBmZi5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC16cGZmLmMKQEAgLTc1LDE0ICs3NSwxNCBAQAogCWludCBlcnJvcjsKIAogCWlmIChsaXN0X2VtcHR5KHJlcG9ydF9saXN0KSkgewotCQlkZXZfZXJyKCZoaWQtPmRldiwgIm5vIG91dHB1dCByZXBvcnQgZm91bmRcbiIpOworCQloaWRfZXJyKGhpZCwgIm5vIG91dHB1dCByZXBvcnQgZm91bmRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAlyZXBvcnQgPSBsaXN0X2VudHJ5KHJlcG9ydF9saXN0LT5uZXh0LCBzdHJ1Y3QgaGlkX3JlcG9ydCwgbGlzdCk7CiAKIAlpZiAocmVwb3J0LT5tYXhmaWVsZCA8IDQpIHsKLQkJZGV2X2VycigmaGlkLT5kZXYsICJub3QgZW5vdWdoIGZpZWxkcyBpbiByZXBvcnRcbiIpOworCQloaWRfZXJyKGhpZCwgIm5vdCBlbm91Z2ggZmllbGRzIGluIHJlcG9ydFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtMTA1LDggKzEwNSw3IEBACiAJenBmZi0+cmVwb3J0LT5maWVsZFszXS0+dmFsdWVbMF0gPSAweDAwOwogCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgenBmZi0+cmVwb3J0LCBVU0JfRElSX09VVCk7CiAKLQlkZXZfaW5mbygmaGlkLT5kZXYsICJmb3JjZSBmZWVkYmFjayBmb3IgWmVyb3BsdXMgYmFzZWQgZGV2aWNlcyBieSAiCi0JICAgICAgICJBbnNzaSBIYW5udWxhIDxhbnNzaS5oYW5udWxhQGdtYWlsLmNvbT5cbiIpOworCWhpZF9pbmZvKGhpZCwgImZvcmNlIGZlZWRiYWNrIGZvciBaZXJvcGx1cyBiYXNlZCBkZXZpY2VzIGJ5IEFuc3NpIEhhbm51bGEgPGFuc3NpLmhhbm51bGFAZ21haWwuY29tPlxuIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEyMywxMyArMTIyLDEzIEBACiAKIAlyZXQgPSBoaWRfcGFyc2UoaGRldik7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJwYXJzZSBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJwYXJzZSBmYWlsZWRcbiIpOwogCQlnb3RvIGVycjsKIAl9CiAKIAlyZXQgPSBoaWRfaHdfc3RhcnQoaGRldiwgSElEX0NPTk5FQ1RfREVGQVVMVCAmIH5ISURfQ09OTkVDVF9GRik7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOwogCQlnb3RvIGVycjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC16eWRhY3Jvbi5jIGIvZHJpdmVycy9oaWQvaGlkLXp5ZGFjcm9uLmMKaW5kZXggYWFjMWY5Mi4uZTkwMzcxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLXp5ZGFjcm9uLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLXp5ZGFjcm9uLmMKQEAgLTM0LDkgKzM0LDggQEAKIAkJcmRlc2NbMHg5Nl0gPT0gMHhiYyAmJiByZGVzY1sweDk3XSA9PSAweGZmICYmCiAJCXJkZXNjWzB4Y2FdID09IDB4YmMgJiYgcmRlc2NbMHhjYl0gPT0gMHhmZiAmJgogCQlyZGVzY1sweGUxXSA9PSAweGJjICYmIHJkZXNjWzB4ZTJdID09IDB4ZmYpIHsKLQkJCWRldl9pbmZvKCZoZGV2LT5kZXYsCi0JCQkJImZpeGluZyB1cCB6eWRhY3JvbiByZW1vdGUgY29udHJvbCByZXBvcnQgIgotCQkJCSJkZXNjcmlwdG9yXG4iKTsKKwkJCWhpZF9pbmZvKGhkZXYsCisJCQkJImZpeGluZyB1cCB6eWRhY3JvbiByZW1vdGUgY29udHJvbCByZXBvcnQgZGVzY3JpcHRvclxuIik7CiAJCQlyZGVzY1sweDk2XSA9IHJkZXNjWzB4Y2FdID0gcmRlc2NbMHhlMV0gPSAweDBjOwogCQkJcmRlc2NbMHg5N10gPSByZGVzY1sweGNiXSA9IHJkZXNjWzB4ZTJdID0gMHgwMDsKIAkJfQpAQCAtMTcyLDcgKzE3MSw3IEBACiAKIAl6YyA9IGt6YWxsb2Moc2l6ZW9mKCp6YyksIEdGUF9LRVJORUwpOwogCWlmICh6YyA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgInp5ZGFjcm9uOiBjYW4ndCBhbGxvYyBkZXNjcmlwdG9yXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiY2FuJ3QgYWxsb2MgZGVzY3JpcHRvclxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMTgwLDEzICsxNzksMTMgQEAKIAogCXJldCA9IGhpZF9wYXJzZShoZGV2KTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgInp5ZGFjcm9uOiBwYXJzZSBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJwYXJzZSBmYWlsZWRcbiIpOwogCQlnb3RvIGVycl9mcmVlOwogCX0KIAogCXJldCA9IGhpZF9od19zdGFydChoZGV2LCBISURfQ09OTkVDVF9ERUZBVUxUKTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgInp5ZGFjcm9uOiBodyBzdGFydCBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOwogCQlnb3RvIGVycl9mcmVlOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkcmF3LmMgYi9kcml2ZXJzL2hpZC9oaWRyYXcuYwppbmRleCBlMWYwNzQ4Li40NjhlODdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWRyYXcuYworKysgYi9kcml2ZXJzL2hpZC9oaWRyYXcuYwpAQCAtMTksNiArMTksOCBAQAogICogNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CkBAIC0xMjIsMTUgKzEyNCwxNSBAQAogCX0KIAogCWlmIChjb3VudCA+IEhJRF9NQVhfQlVGRkVSX1NJWkUpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaGlkcmF3OiBwaWQgJWQgcGFzc2VkIHRvbyBsYXJnZSByZXBvcnRcbiIsCi0JCQkJdGFza19waWRfbnIoY3VycmVudCkpOworCQloaWRfd2FybihkZXYsICJwaWQgJWQgcGFzc2VkIHRvbyBsYXJnZSByZXBvcnRcbiIsCisJCQkgdGFza19waWRfbnIoY3VycmVudCkpOwogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CiAKIAlpZiAoY291bnQgPCAyKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImhpZHJhdzogcGlkICVkIHBhc3NlZCB0b28gc2hvcnQgcmVwb3J0XG4iLAotCQkJCXRhc2tfcGlkX25yKGN1cnJlbnQpKTsKKwkJaGlkX3dhcm4oZGV2LCAicGlkICVkIHBhc3NlZCB0b28gc2hvcnQgcmVwb3J0XG4iLAorCQkJIHRhc2tfcGlkX25yKGN1cnJlbnQpKTsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMTkyLDE1ICsxOTQsMTMgQEAKIAogCWRldiA9IGhpZHJhd190YWJsZVttaW5vcl07CiAJaWYgKCFkZXYtPm9wZW4rKykgewotCQlpZiAoZGV2LT5oaWQtPmxsX2RyaXZlci0+cG93ZXIpIHsKLQkJCWVyciA9IGRldi0+aGlkLT5sbF9kcml2ZXItPnBvd2VyKGRldi0+aGlkLCBQTV9ISU5UX0ZVTExPTik7Ci0JCQlpZiAoZXJyIDwgMCkKLQkJCQlnb3RvIG91dF91bmxvY2s7Ci0JCX0KLQkJZXJyID0gZGV2LT5oaWQtPmxsX2RyaXZlci0+b3BlbihkZXYtPmhpZCk7CisJCWVyciA9IGhpZF9od19wb3dlcihkZXYtPmhpZCwgUE1fSElOVF9GVUxMT04pOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gb3V0X3VubG9jazsKKworCQllcnIgPSBoaWRfaHdfb3BlbihkZXYtPmhpZCk7CiAJCWlmIChlcnIgPCAwKSB7Ci0JCQlpZiAoZGV2LT5oaWQtPmxsX2RyaXZlci0+cG93ZXIpCi0JCQkJZGV2LT5oaWQtPmxsX2RyaXZlci0+cG93ZXIoZGV2LT5oaWQsIFBNX0hJTlRfTk9STUFMKTsKKwkJCWhpZF9od19wb3dlcihkZXYtPmhpZCwgUE1fSElOVF9OT1JNQUwpOwogCQkJZGV2LT5vcGVuLS07CiAJCX0KIAl9CkBAIC0yMjksOSArMjI5LDggQEAKIAlkZXYgPSBoaWRyYXdfdGFibGVbbWlub3JdOwogCWlmICghLS1kZXYtPm9wZW4pIHsKIAkJaWYgKGxpc3QtPmhpZHJhdy0+ZXhpc3QpIHsKLQkJCWlmIChkZXYtPmhpZC0+bGxfZHJpdmVyLT5wb3dlcikKLQkJCQlkZXYtPmhpZC0+bGxfZHJpdmVyLT5wb3dlcihkZXYtPmhpZCwgUE1fSElOVF9OT1JNQUwpOwotCQkJZGV2LT5oaWQtPmxsX2RyaXZlci0+Y2xvc2UoZGV2LT5oaWQpOworCQkJaGlkX2h3X3Bvd2VyKGRldi0+aGlkLCBQTV9ISU5UX05PUk1BTCk7CisJCQloaWRfaHdfY2xvc2UoZGV2LT5oaWQpOwogCQl9IGVsc2UgewogCQkJa2ZyZWUobGlzdC0+aGlkcmF3KTsKIAkJfQpAQCAtMzQ1LDYgKzM0NCw5IEBACiAJLm9wZW4gPSAgICAgICAgIGhpZHJhd19vcGVuLAogCS5yZWxlYXNlID0gICAgICBoaWRyYXdfcmVsZWFzZSwKIAkudW5sb2NrZWRfaW9jdGwgPSBoaWRyYXdfaW9jdGwsCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCS5jb21wYXRfaW9jdGwgICA9IGhpZHJhd19pb2N0bCwKKyNlbmRpZgogCS5sbHNlZWsgPQlub29wX2xsc2VlaywKIH07CiAKQEAgLTQzMyw3ICs0MzUsNyBAQAogCWRldmljZV9kZXN0cm95KGhpZHJhd19jbGFzcywgTUtERVYoaGlkcmF3X21ham9yLCBoaWRyYXctPm1pbm9yKSk7CiAKIAlpZiAoaGlkcmF3LT5vcGVuKSB7Ci0JCWhpZC0+bGxfZHJpdmVyLT5jbG9zZShoaWQpOworCQloaWRfaHdfY2xvc2UoaGlkKTsKIAkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZoaWRyYXctPndhaXQpOwogCX0gZWxzZSB7CiAJCWtmcmVlKGhpZHJhdyk7CkBAIC00NTIsNyArNDU0LDcgQEAKIAloaWRyYXdfbWFqb3IgPSBNQUpPUihkZXZfaWQpOwogCiAJaWYgKHJlc3VsdCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaGlkcmF3OiBjYW4ndCBnZXQgbWFqb3IgbnVtYmVyXG4iKTsKKwkJcHJfd2FybigiY2FuJ3QgZ2V0IG1ham9yIG51bWJlclxuIik7CiAJCXJlc3VsdCA9IDA7CiAJCWdvdG8gb3V0OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL3VzYmhpZC9NYWtlZmlsZSBiL2RyaXZlcnMvaGlkL3VzYmhpZC9NYWtlZmlsZQppbmRleCAxMzI5ZWNiLi5kYjNjZjMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC91c2JoaWQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9oaWQvdXNiaGlkL01ha2VmaWxlCkBAIC0zLDE1ICszLDE1IEBACiAjCiAKICMgTXVsdGlwYXJ0IG9iamVjdHMuCi11c2JoaWQtb2Jqcwk6PSBoaWQtY29yZS5vIGhpZC1xdWlya3MubwordXNiaGlkLXkJOj0gaGlkLWNvcmUubyBoaWQtcXVpcmtzLm8KIAogIyBPcHRpb25hbCBwYXJ0cyBvZiBtdWx0aXBhcnQgb2JqZWN0cy4KIAogaWZlcSAoJChDT05GSUdfVVNCX0hJRERFVikseSkKLQl1c2JoaWQtb2JqcwkrPSBoaWRkZXYubworCXVzYmhpZC15CSs9IGhpZGRldi5vCiBlbmRpZgogaWZlcSAoJChDT05GSUdfSElEX1BJRCkseSkKLQl1c2JoaWQtb2JqcwkrPSBoaWQtcGlkZmYubworCXVzYmhpZC15CSs9IGhpZC1waWRmZi5vCiBlbmRpZgogCiBvYmotJChDT05GSUdfVVNCX0hJRCkJCSs9IHVzYmhpZC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLWNvcmUuYyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtY29yZS5jCmluZGV4IDU0ODllYWIuLmIzMzZkZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtY29yZS5jCisrKyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtY29yZS5jCkBAIC02Nyw3ICs2Nyw2IEBACiAgKiBJbnB1dCBzdWJtaXNzaW9uIGFuZCBJL08gZXJyb3IgaGFuZGxlci4KICAqLwogc3RhdGljIERFRklORV9NVVRFWChoaWRfb3Blbl9tdXQpOwotc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpyZXN1bXB0aW9uX3dha2VyOwogCiBzdGF0aWMgdm9pZCBoaWRfaW9fZXJyb3Ioc3RydWN0IGhpZF9kZXZpY2UgKmhpZCk7CiBzdGF0aWMgaW50IGhpZF9zdWJtaXRfb3V0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpOwpAQCAtMTM2LDEwICsxMzUsMTAgQEAKIAkJCWhpZF9pb19lcnJvcihoaWQpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQllcnJfaGlkKCJjYW4ndCByZXNldCBkZXZpY2UsICVzLSVzL2lucHV0JWQsIHN0YXR1cyAlZCIsCi0JCQkJaGlkX3RvX3VzYl9kZXYoaGlkKS0+YnVzLT5idXNfbmFtZSwKLQkJCQloaWRfdG9fdXNiX2RldihoaWQpLT5kZXZwYXRoLAotCQkJCXVzYmhpZC0+aWZudW0sIHJjKTsKKwkJaGlkX2VycihoaWQsICJjYW4ndCByZXNldCBkZXZpY2UsICVzLSVzL2lucHV0JWQsIHN0YXR1cyAlZFxuIiwKKwkJCWhpZF90b191c2JfZGV2KGhpZCktPmJ1cy0+YnVzX25hbWUsCisJCQloaWRfdG9fdXNiX2RldihoaWQpLT5kZXZwYXRoLAorCQkJdXNiaGlkLT5pZm51bSwgcmMpOwogCQkvKiBGQUxMVEhST1VHSCAqLwogCWNhc2UgLUVIT1NUVU5SRUFDSDoKIAljYXNlIC1FTk9ERVY6CkBAIC0yNzgsMTggKzI3NywxOCBAQAogCQloaWRfaW9fZXJyb3IoaGlkKTsKIAkJcmV0dXJuOwogCWRlZmF1bHQ6CQkvKiBlcnJvciAqLwotCQlkZXZfd2FybigmdXJiLT5kZXYtPmRldiwgImlucHV0IGlycSBzdGF0dXMgJWQgICIKLQkJCQkicmVjZWl2ZWRcbiIsIHVyYi0+c3RhdHVzKTsKKwkJaGlkX3dhcm4odXJiLT5kZXYsICJpbnB1dCBpcnEgc3RhdHVzICVkIHJlY2VpdmVkXG4iLAorCQkJIHVyYi0+c3RhdHVzKTsKIAl9CiAKIAlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwogCWlmIChzdGF0dXMpIHsKIAkJY2xlYXJfYml0KEhJRF9JTl9SVU5OSU5HLCAmdXNiaGlkLT5pb2ZsKTsKIAkJaWYgKHN0YXR1cyAhPSAtRVBFUk0pIHsKLQkJCWVycl9oaWQoImNhbid0IHJlc3VibWl0IGludHIsICVzLSVzL2lucHV0JWQsIHN0YXR1cyAlZCIsCi0JCQkJCWhpZF90b191c2JfZGV2KGhpZCktPmJ1cy0+YnVzX25hbWUsCi0JCQkJCWhpZF90b191c2JfZGV2KGhpZCktPmRldnBhdGgsCi0JCQkJCXVzYmhpZC0+aWZudW0sIHN0YXR1cyk7CisJCQloaWRfZXJyKGhpZCwgImNhbid0IHJlc3VibWl0IGludHIsICVzLSVzL2lucHV0JWQsIHN0YXR1cyAlZFxuIiwKKwkJCQloaWRfdG9fdXNiX2RldihoaWQpLT5idXMtPmJ1c19uYW1lLAorCQkJCWhpZF90b191c2JfZGV2KGhpZCktPmRldnBhdGgsCisJCQkJdXNiaGlkLT5pZm51bSwgc3RhdHVzKTsKIAkJCWhpZF9pb19lcnJvcihoaWQpOwogCQl9CiAJfQpAQCAtMzAwLDEwICsyOTksMTkgQEAKIAlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0OwogCWNoYXIgKnJhd19yZXBvcnQ7CiAJc3RydWN0IHVzYmhpZF9kZXZpY2UgKnVzYmhpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7CisJaW50IHI7CiAKIAlyZXBvcnQgPSB1c2JoaWQtPm91dFt1c2JoaWQtPm91dHRhaWxdLnJlcG9ydDsKIAlyYXdfcmVwb3J0ID0gdXNiaGlkLT5vdXRbdXNiaGlkLT5vdXR0YWlsXS5yYXdfcmVwb3J0OwogCisJciA9IHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZV9hc3luYyh1c2JoaWQtPmludGYpOworCWlmIChyIDwgMCkKKwkJcmV0dXJuIC0xOworCisJLyoKKwkgKiBpZiB0aGUgZGV2aWNlIGhhc24ndCBiZWVuIHdva2VuLCB3ZSBsZWF2ZSB0aGUgb3V0cHV0CisJICogdG8gcmVzdW1lKCkKKwkgKi8KIAlpZiAoIXRlc3RfYml0KEhJRF9SRVBPUlRFRF9JRExFLCAmdXNiaGlkLT5pb2ZsKSkgewogCQl1c2JoaWQtPnVyYm91dC0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9ICgocmVwb3J0LT5zaXplIC0gMSkgPj4gMykgKyAxICsgKHJlcG9ydC0+aWQgPiAwKTsKIAkJdXNiaGlkLT51cmJvdXQtPmRldiA9IGhpZF90b191c2JfZGV2KGhpZCk7CkBAIC0zMTMsMTcgKzMyMSwxMSBAQAogCQlkYmdfaGlkKCJzdWJtaXR0aW5nIG91dCB1cmJcbiIpOwogCiAJCWlmICh1c2Jfc3VibWl0X3VyYih1c2JoaWQtPnVyYm91dCwgR0ZQX0FUT01JQykpIHsKLQkJCWVycl9oaWQoInVzYl9zdWJtaXRfdXJiKG91dCkgZmFpbGVkIik7CisJCQloaWRfZXJyKGhpZCwgInVzYl9zdWJtaXRfdXJiKG91dCkgZmFpbGVkXG4iKTsKKwkJCXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZV9hc3luYyh1c2JoaWQtPmludGYpOwogCQkJcmV0dXJuIC0xOwogCQl9CiAJCXVzYmhpZC0+bGFzdF9vdXQgPSBqaWZmaWVzOwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIHF1ZXVlIHdvcmsgdG8gd2FrZSB1cCB0aGUgZGV2aWNlLgotCQkgKiBhcyB0aGUgd29yayBxdWV1ZSBpcyBmcmVlemVhYmxlLCB0aGlzIGlzIHNhZmUKLQkJICogd2l0aCByZXNwZWN0IHRvIFNURCBhbmQgU1RSCi0JCSAqLwotCQlxdWV1ZV93b3JrKHJlc3VtcHRpb25fd2FrZXIsICZ1c2JoaWQtPnJlc3RhcnRfd29yayk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0zMzQsMTMgKzMzNiwxNiBAQAogCXN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQ7CiAJdW5zaWduZWQgY2hhciBkaXI7CiAJY2hhciAqcmF3X3JlcG9ydDsKLQlpbnQgbGVuOworCWludCBsZW4sIHI7CiAJc3RydWN0IHVzYmhpZF9kZXZpY2UgKnVzYmhpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7CiAKIAlyZXBvcnQgPSB1c2JoaWQtPmN0cmxbdXNiaGlkLT5jdHJsdGFpbF0ucmVwb3J0OwogCXJhd19yZXBvcnQgPSB1c2JoaWQtPmN0cmxbdXNiaGlkLT5jdHJsdGFpbF0ucmF3X3JlcG9ydDsKIAlkaXIgPSB1c2JoaWQtPmN0cmxbdXNiaGlkLT5jdHJsdGFpbF0uZGlyOwogCisJciA9IHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZV9hc3luYyh1c2JoaWQtPmludGYpOworCWlmIChyIDwgMCkKKwkJcmV0dXJuIC0xOwogCWlmICghdGVzdF9iaXQoSElEX1JFUE9SVEVEX0lETEUsICZ1c2JoaWQtPmlvZmwpKSB7CiAJCWxlbiA9ICgocmVwb3J0LT5zaXplIC0gMSkgPj4gMykgKyAxICsgKHJlcG9ydC0+aWQgPiAwKTsKIAkJaWYgKGRpciA9PSBVU0JfRElSX09VVCkgewpAQCAtMzc1LDE3ICszODAsMTEgQEAKIAkJCXVzYmhpZC0+Y3ItPndWYWx1ZSwgdXNiaGlkLT5jci0+d0luZGV4LCB1c2JoaWQtPmNyLT53TGVuZ3RoKTsKIAogCQlpZiAodXNiX3N1Ym1pdF91cmIodXNiaGlkLT51cmJjdHJsLCBHRlBfQVRPTUlDKSkgewotCQkJZXJyX2hpZCgidXNiX3N1Ym1pdF91cmIoY3RybCkgZmFpbGVkIik7CisJCQl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2VfYXN5bmModXNiaGlkLT5pbnRmKTsKKwkJCWhpZF9lcnIoaGlkLCAidXNiX3N1Ym1pdF91cmIoY3RybCkgZmFpbGVkXG4iKTsKIAkJCXJldHVybiAtMTsKIAkJfQogCQl1c2JoaWQtPmxhc3RfY3RybCA9IGppZmZpZXM7Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogcXVldWUgd29yayB0byB3YWtlIHVwIHRoZSBkZXZpY2UuCi0JCSAqIGFzIHRoZSB3b3JrIHF1ZXVlIGlzIGZyZWV6ZWFibGUsIHRoaXMgaXMgc2FmZQotCQkgKiB3aXRoIHJlc3BlY3QgdG8gU1REIGFuZCBTVFIKLQkJICovCi0JCXF1ZXVlX3dvcmsocmVzdW1wdGlvbl93YWtlciwgJnVzYmhpZC0+cmVzdGFydF93b3JrKTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTQxMyw4ICs0MTIsOCBAQAogCWNhc2UgLUVOT0VOVDoKIAkJYnJlYWs7CiAJZGVmYXVsdDoJCS8qIGVycm9yICovCi0JCWRldl93YXJuKCZ1cmItPmRldi0+ZGV2LCAib3V0cHV0IGlycSBzdGF0dXMgJWQgIgotCQkJCSJyZWNlaXZlZFxuIiwgdXJiLT5zdGF0dXMpOworCQloaWRfd2Fybih1cmItPmRldiwgIm91dHB1dCBpcnEgc3RhdHVzICVkIHJlY2VpdmVkXG4iLAorCQkJIHVyYi0+c3RhdHVzKTsKIAl9CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdXNiaGlkLT5sb2NrLCBmbGFncyk7CkBAIC00MzUsNiArNDM0LDcgQEAKIAogCWNsZWFyX2JpdChISURfT1VUX1JVTk5JTkcsICZ1c2JoaWQtPmlvZmwpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVzYmhpZC0+bG9jaywgZmxhZ3MpOworCXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZV9hc3luYyh1c2JoaWQtPmludGYpOwogCXdha2VfdXAoJnVzYmhpZC0+d2FpdCk7CiB9CiAKQEAgLTQ2Niw4ICs0NjYsNyBAQAogCWNhc2UgLUVQSVBFOgkJLyogcmVwb3J0IG5vdCBhdmFpbGFibGUgKi8KIAkJYnJlYWs7CiAJZGVmYXVsdDoJCS8qIGVycm9yICovCi0JCWRldl93YXJuKCZ1cmItPmRldi0+ZGV2LCAiY3RybCB1cmIgc3RhdHVzICVkICIKLQkJCQkicmVjZWl2ZWRcbiIsIHN0YXR1cyk7CisJCWhpZF93YXJuKHVyYi0+ZGV2LCAiY3RybCB1cmIgc3RhdHVzICVkIHJlY2VpdmVkXG4iLCBzdGF0dXMpOwogCX0KIAogCWlmICh1bnBsdWcpCkBAIC00ODEsMTEgKzQ4MCwxMyBAQAogCQkJd2FrZV91cCgmdXNiaGlkLT53YWl0KTsKIAkJfQogCQlzcGluX3VubG9jaygmdXNiaGlkLT5sb2NrKTsKKwkJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlX2FzeW5jKHVzYmhpZC0+aW50Zik7CiAJCXJldHVybjsKIAl9CiAKIAljbGVhcl9iaXQoSElEX0NUUkxfUlVOTklORywgJnVzYmhpZC0+aW9mbCk7CiAJc3Bpbl91bmxvY2soJnVzYmhpZC0+bG9jayk7CisJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlX2FzeW5jKHVzYmhpZC0+aW50Zik7CiAJd2FrZV91cCgmdXNiaGlkLT53YWl0KTsKIH0KIApAQCAtNTAxLDEzICs1MDIsMTMgQEAKIAogCWlmICh1c2JoaWQtPnVyYm91dCAmJiBkaXIgPT0gVVNCX0RJUl9PVVQgJiYgcmVwb3J0LT50eXBlID09IEhJRF9PVVRQVVRfUkVQT1JUKSB7CiAJCWlmICgoaGVhZCA9ICh1c2JoaWQtPm91dGhlYWQgKyAxKSAmIChISURfT1VUUFVUX0ZJRk9fU0laRSAtIDEpKSA9PSB1c2JoaWQtPm91dHRhaWwpIHsKLQkJCWRldl93YXJuKCZoaWQtPmRldiwgIm91dHB1dCBxdWV1ZSBmdWxsXG4iKTsKKwkJCWhpZF93YXJuKGhpZCwgIm91dHB1dCBxdWV1ZSBmdWxsXG4iKTsKIAkJCXJldHVybjsKIAkJfQogCiAJCXVzYmhpZC0+b3V0W3VzYmhpZC0+b3V0aGVhZF0ucmF3X3JlcG9ydCA9IGttYWxsb2MobGVuLCBHRlBfQVRPTUlDKTsKIAkJaWYgKCF1c2JoaWQtPm91dFt1c2JoaWQtPm91dGhlYWRdLnJhd19yZXBvcnQpIHsKLQkJCWRldl93YXJuKCZoaWQtPmRldiwgIm91dHB1dCBxdWV1ZWluZyBmYWlsZWRcbiIpOworCQkJaGlkX3dhcm4oaGlkLCAib3V0cHV0IHF1ZXVlaW5nIGZhaWxlZFxuIik7CiAJCQlyZXR1cm47CiAJCX0KIAkJaGlkX291dHB1dF9yZXBvcnQocmVwb3J0LCB1c2JoaWQtPm91dFt1c2JoaWQtPm91dGhlYWRdLnJhd19yZXBvcnQpOwpAQCAtNTMyLDE0ICs1MzMsMTQgQEAKIAl9CiAKIAlpZiAoKGhlYWQgPSAodXNiaGlkLT5jdHJsaGVhZCArIDEpICYgKEhJRF9DT05UUk9MX0ZJRk9fU0laRSAtIDEpKSA9PSB1c2JoaWQtPmN0cmx0YWlsKSB7Ci0JCWRldl93YXJuKCZoaWQtPmRldiwgImNvbnRyb2wgcXVldWUgZnVsbFxuIik7CisJCWhpZF93YXJuKGhpZCwgImNvbnRyb2wgcXVldWUgZnVsbFxuIik7CiAJCXJldHVybjsKIAl9CiAKIAlpZiAoZGlyID09IFVTQl9ESVJfT1VUKSB7CiAJCXVzYmhpZC0+Y3RybFt1c2JoaWQtPmN0cmxoZWFkXS5yYXdfcmVwb3J0ID0ga21hbGxvYyhsZW4sIEdGUF9BVE9NSUMpOwogCQlpZiAoIXVzYmhpZC0+Y3RybFt1c2JoaWQtPmN0cmxoZWFkXS5yYXdfcmVwb3J0KSB7Ci0JCQlkZXZfd2FybigmaGlkLT5kZXYsICJjb250cm9sIHF1ZXVlaW5nIGZhaWxlZFxuIik7CisJCQloaWRfd2FybihoaWQsICJjb250cm9sIHF1ZXVlaW5nIGZhaWxlZFxuIik7CiAJCQlyZXR1cm47CiAJCX0KIAkJaGlkX291dHB1dF9yZXBvcnQocmVwb3J0LCB1c2JoaWQtPmN0cmxbdXNiaGlkLT5jdHJsaGVhZF0ucmF3X3JlcG9ydCk7CkBAIC01OTAsNyArNTkxLDcgQEAKIAkJcmV0dXJuIC0xOwogCiAJaWYgKChvZmZzZXQgPSBoaWRpbnB1dF9maW5kX2ZpZWxkKGhpZCwgdHlwZSwgY29kZSwgJmZpZWxkKSkgPT0gLTEpIHsKLQkJZGV2X3dhcm4oJmRldi0+ZGV2LCAiZXZlbnQgZmllbGQgbm90IGZvdW5kXG4iKTsKKwkJaGlkX3dhcm4oZGV2LCAiZXZlbnQgZmllbGQgbm90IGZvdW5kXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtNjU2LDcgKzY1Nyw3IEBACiAJbXV0ZXhfbG9jaygmaGlkX29wZW5fbXV0KTsKIAlpZiAoIWhpZC0+b3BlbisrKSB7CiAJCXJlcyA9IHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZSh1c2JoaWQtPmludGYpOwotCQkvKiB0aGUgZGV2aWNlIG11c3QgYmUgYXdha2UgdG8gcmVsaWFibGUgcmVxdWVzdCByZW1vdGUgd2FrZXVwICovCisJCS8qIHRoZSBkZXZpY2UgbXVzdCBiZSBhd2FrZSB0byByZWxpYWJseSByZXF1ZXN0IHJlbW90ZSB3YWtldXAgKi8KIAkJaWYgKHJlcyA8IDApIHsKIAkJCWhpZC0+b3Blbi0tOwogCQkJbXV0ZXhfdW5sb2NrKCZoaWRfb3Blbl9tdXQpOwpAQCAtNzIyLDcgKzcyMyw3IEBACiAJfQogCiAJaWYgKGVycikKLQkJZGV2X3dhcm4oJmhpZC0+ZGV2LCAidGltZW91dCBpbml0aWFsaXppbmcgcmVwb3J0c1xuIik7CisJCWhpZF93YXJuKGhpZCwgInRpbWVvdXQgaW5pdGlhbGl6aW5nIHJlcG9ydHNcbiIpOwogfQogCiAvKgpAQCAtODU3LDE4ICs4NTgsNiBAQAogCXVzYmhpZF9yZXN0YXJ0X2N0cmxfcXVldWUodXNiaGlkKTsKIH0KIAotc3RhdGljIHZvaWQgX191c2JoaWRfcmVzdGFydF9xdWV1ZXMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCB1c2JoaWRfZGV2aWNlICp1c2JoaWQgPQotCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHVzYmhpZF9kZXZpY2UsIHJlc3RhcnRfd29yayk7Ci0JaW50IHI7Ci0KLQlyID0gdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKHVzYmhpZC0+aW50Zik7Ci0JaWYgKHIgPCAwKQotCQlyZXR1cm47Ci0JdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKHVzYmhpZC0+aW50Zik7Ci19Ci0KIHN0YXRpYyB2b2lkIGhpZF9mcmVlX2J1ZmZlcnMoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkKIHsKIAlzdHJ1Y3QgdXNiaGlkX2RldmljZSAqdXNiaGlkID0gaGlkLT5kcml2ZXJfZGF0YTsKQEAgLTExNDAsOCArMTEyOSw3IEBACiAJCWlmICh1c2JfZW5kcG9pbnRfaXNfaW50X2luKCZpbnRlcmZhY2UtPmVuZHBvaW50W25dLmRlc2MpKQogCQkJaGFzX2luKys7CiAJaWYgKCFoYXNfaW4pIHsKLQkJZGV2X2VycigmaW50Zi0+ZGV2LCAiY291bGRuJ3QgZmluZCBhbiBpbnB1dCBpbnRlcnJ1cHQgIgotCQkJCSJlbmRwb2ludFxuIik7CisJCWhpZF9lcnIoaW50ZiwgImNvdWxkbid0IGZpbmQgYW4gaW5wdXQgaW50ZXJydXB0IGVuZHBvaW50XG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0xMjA2LDE0ICsxMTk0LDEzIEBACiAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ1c2JoaWQtPndhaXQpOwogCUlOSVRfV09SSygmdXNiaGlkLT5yZXNldF93b3JrLCBoaWRfcmVzZXQpOwotCUlOSVRfV09SSygmdXNiaGlkLT5yZXN0YXJ0X3dvcmssIF9fdXNiaGlkX3Jlc3RhcnRfcXVldWVzKTsKIAlzZXR1cF90aW1lcigmdXNiaGlkLT5pb19yZXRyeSwgaGlkX3JldHJ5X3RpbWVvdXQsICh1bnNpZ25lZCBsb25nKSBoaWQpOwogCXNwaW5fbG9ja19pbml0KCZ1c2JoaWQtPmxvY2spOwogCiAJcmV0ID0gaGlkX2FkZF9kZXZpY2UoaGlkKTsKIAlpZiAocmV0KSB7CiAJCWlmIChyZXQgIT0gLUVOT0RFVikKLQkJCWRldl9lcnIoJmludGYtPmRldiwgImNhbid0IGFkZCBoaWQgZGV2aWNlOiAlZFxuIiwgcmV0KTsKKwkJCWhpZF9lcnIoaW50ZiwgImNhbid0IGFkZCBoaWQgZGV2aWNlOiAlZFxuIiwgcmV0KTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKQEAgLTEyNDEsNyArMTIyOCw2IEBACiBzdGF0aWMgdm9pZCBoaWRfY2FuY2VsX2RlbGF5ZWRfc3R1ZmYoc3RydWN0IHVzYmhpZF9kZXZpY2UgKnVzYmhpZCkKIHsKIAlkZWxfdGltZXJfc3luYygmdXNiaGlkLT5pb19yZXRyeSk7Ci0JY2FuY2VsX3dvcmtfc3luYygmdXNiaGlkLT5yZXN0YXJ0X3dvcmspOwogCWNhbmNlbF93b3JrX3N5bmMoJnVzYmhpZC0+cmVzZXRfd29yayk7CiB9CiAKQEAgLTEyNjIsNyArMTI0OCw2IEBACiAJc3Bpbl9sb2NrX2lycSgmdXNiaGlkLT5sb2NrKTsKIAlzZXRfYml0KEhJRF9SRVNFVF9QRU5ESU5HLCAmdXNiaGlkLT5pb2ZsKTsKIAlzcGluX3VubG9ja19pcnEoJnVzYmhpZC0+bG9jayk7Ci0JY2FuY2VsX3dvcmtfc3luYygmdXNiaGlkLT5yZXN0YXJ0X3dvcmspOwogCWhpZF9jZWFzZV9pbyh1c2JoaWQpOwogCiAJcmV0dXJuIDA7CkBAIC0xNDYxLDkgKzE0NDYsNiBAQAogewogCWludCByZXR2YWwgPSAtRU5PTUVNOwogCi0JcmVzdW1wdGlvbl93YWtlciA9IGNyZWF0ZV9mcmVlemVhYmxlX3dvcmtxdWV1ZSgidXNiaGlkX3Jlc3VtZXIiKTsKLQlpZiAoIXJlc3VtcHRpb25fd2FrZXIpCi0JCWdvdG8gbm9fcXVldWU7CiAJcmV0dmFsID0gaGlkX3JlZ2lzdGVyX2RyaXZlcigmaGlkX3VzYl9kcml2ZXIpOwogCWlmIChyZXR2YWwpCiAJCWdvdG8gaGlkX3JlZ2lzdGVyX2ZhaWw7CkBAIC0xNDgxLDggKzE0NjMsNiBAQAogdXNiaGlkX3F1aXJrc19pbml0X2ZhaWw6CiAJaGlkX3VucmVnaXN0ZXJfZHJpdmVyKCZoaWRfdXNiX2RyaXZlcik7CiBoaWRfcmVnaXN0ZXJfZmFpbDoKLQlkZXN0cm95X3dvcmtxdWV1ZShyZXN1bXB0aW9uX3dha2VyKTsKLW5vX3F1ZXVlOgogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTE0OTEsNyArMTQ3MSw2IEBACiAJdXNiX2RlcmVnaXN0ZXIoJmhpZF9kcml2ZXIpOwogCXVzYmhpZF9xdWlya3NfZXhpdCgpOwogCWhpZF91bnJlZ2lzdGVyX2RyaXZlcigmaGlkX3VzYl9kcml2ZXIpOwotCWRlc3Ryb3lfd29ya3F1ZXVlKHJlc3VtcHRpb25fd2FrZXIpOwogfQogCiBtb2R1bGVfaW5pdChoaWRfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXBpZGZmLmMgYi9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXBpZGZmLmMKaW5kZXggZWYzODFkNy4uZjkxYzEzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1waWRmZi5jCisrKyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtcGlkZmYuYwpAQCAtMjIsNyArMjIsNyBAQAogCiAvKiAjZGVmaW5lIERFQlVHICovCiAKLSNkZWZpbmUgZGVidWcoZm9ybWF0LCBhcmcuLi4pIHByX2RlYnVnKCJoaWQtcGlkZmY6ICIgZm9ybWF0ICJcbiIgLCAjIyBhcmcpCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CiAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTIyMCw3ICsyMjAsNyBAQAogc3RhdGljIHZvaWQgcGlkZmZfc2V0KHN0cnVjdCBwaWRmZl91c2FnZSAqdXNhZ2UsIHUxNiB2YWx1ZSkKIHsKIAl1c2FnZS0+dmFsdWVbMF0gPSBwaWRmZl9yZXNjYWxlKHZhbHVlLCAweGZmZmYsIHVzYWdlLT5maWVsZCk7Ci0JZGVidWcoImNhbGN1bGF0ZWQgZnJvbSAlZCB0byAlZCIsIHZhbHVlLCB1c2FnZS0+dmFsdWVbMF0pOworCXByX2RlYnVnKCJjYWxjdWxhdGVkIGZyb20gJWQgdG8gJWRcbiIsIHZhbHVlLCB1c2FnZS0+dmFsdWVbMF0pOwogfQogCiBzdGF0aWMgdm9pZCBwaWRmZl9zZXRfc2lnbmVkKHN0cnVjdCBwaWRmZl91c2FnZSAqdXNhZ2UsIHMxNiB2YWx1ZSkKQEAgLTIzNSw3ICsyMzUsNyBAQAogCQkJdXNhZ2UtPnZhbHVlWzBdID0KIAkJCSAgICBwaWRmZl9yZXNjYWxlKHZhbHVlLCAweDdmZmYsIHVzYWdlLT5maWVsZCk7CiAJfQotCWRlYnVnKCJjYWxjdWxhdGVkIGZyb20gJWQgdG8gJWQiLCB2YWx1ZSwgdXNhZ2UtPnZhbHVlWzBdKTsKKwlwcl9kZWJ1ZygiY2FsY3VsYXRlZCBmcm9tICVkIHRvICVkXG4iLCB2YWx1ZSwgdXNhZ2UtPnZhbHVlWzBdKTsKIH0KIAogLyoKQEAgLTI1OSw4ICsyNTksOSBAQAogCXBpZGZmLT5zZXRfZW52ZWxvcGVbUElEX0FUVEFDS19USU1FXS52YWx1ZVswXSA9IGVudmVsb3BlLT5hdHRhY2tfbGVuZ3RoOwogCXBpZGZmLT5zZXRfZW52ZWxvcGVbUElEX0ZBREVfVElNRV0udmFsdWVbMF0gPSBlbnZlbG9wZS0+ZmFkZV9sZW5ndGg7CiAKLQlkZWJ1ZygiYXR0YWNrICV1ID0+ICVkIiwgZW52ZWxvcGUtPmF0dGFja19sZXZlbCwKLQkgICAgICBwaWRmZi0+c2V0X2VudmVsb3BlW1BJRF9BVFRBQ0tfTEVWRUxdLnZhbHVlWzBdKTsKKwloaWRfZGJnKHBpZGZmLT5oaWQsICJhdHRhY2sgJXUgPT4gJWRcbiIsCisJCWVudmVsb3BlLT5hdHRhY2tfbGV2ZWwsCisJCXBpZGZmLT5zZXRfZW52ZWxvcGVbUElEX0FUVEFDS19MRVZFTF0udmFsdWVbMF0pOwogCiAJdXNiaGlkX3N1Ym1pdF9yZXBvcnQocGlkZmYtPmhpZCwgcGlkZmYtPnJlcG9ydHNbUElEX1NFVF9FTlZFTE9QRV0sCiAJCQkgIFVTQl9ESVJfT1VUKTsKQEAgLTQ2NiwzMyArNDY3LDMzIEBACiAJcGlkZmYtPmNyZWF0ZV9uZXdfZWZmZWN0X3R5cGUtPnZhbHVlWzBdID0gZWZudW07CiAJdXNiaGlkX3N1Ym1pdF9yZXBvcnQocGlkZmYtPmhpZCwgcGlkZmYtPnJlcG9ydHNbUElEX0NSRUFURV9ORVdfRUZGRUNUXSwKIAkJCSAgVVNCX0RJUl9PVVQpOwotCWRlYnVnKCJjcmVhdGVfbmV3X2VmZmVjdCBzZW50LCB0eXBlOiAlZCIsIGVmbnVtKTsKKwloaWRfZGJnKHBpZGZmLT5oaWQsICJjcmVhdGVfbmV3X2VmZmVjdCBzZW50LCB0eXBlOiAlZFxuIiwgZWZudW0pOwogCiAJcGlkZmYtPmJsb2NrX2xvYWRbUElEX0VGRkVDVF9CTE9DS19JTkRFWF0udmFsdWVbMF0gPSAwOwogCXBpZGZmLT5ibG9ja19sb2FkX3N0YXR1cy0+dmFsdWVbMF0gPSAwOwogCXVzYmhpZF93YWl0X2lvKHBpZGZmLT5oaWQpOwogCiAJZm9yIChqID0gMDsgaiA8IDYwOyBqKyspIHsKLQkJZGVidWcoInBpZF9ibG9ja19sb2FkIHJlcXVlc3RlZCIpOworCQloaWRfZGJnKHBpZGZmLT5oaWQsICJwaWRfYmxvY2tfbG9hZCByZXF1ZXN0ZWRcbiIpOwogCQl1c2JoaWRfc3VibWl0X3JlcG9ydChwaWRmZi0+aGlkLCBwaWRmZi0+cmVwb3J0c1tQSURfQkxPQ0tfTE9BRF0sCiAJCQkJICBVU0JfRElSX0lOKTsKIAkJdXNiaGlkX3dhaXRfaW8ocGlkZmYtPmhpZCk7CiAJCWlmIChwaWRmZi0+YmxvY2tfbG9hZF9zdGF0dXMtPnZhbHVlWzBdID09CiAJCSAgICBwaWRmZi0+c3RhdHVzX2lkW1BJRF9CTE9DS19MT0FEX1NVQ0NFU1NdKSB7Ci0JCQlkZWJ1ZygiZGV2aWNlIHJlcG9ydGVkIGZyZWUgbWVtb3J5OiAlZCBieXRlcyIsCi0JCQkgICAgICBwaWRmZi0+YmxvY2tfbG9hZFtQSURfUkFNX1BPT0xfQVZBSUxBQkxFXS52YWx1ZSA/Ci0JCQkJcGlkZmYtPmJsb2NrX2xvYWRbUElEX1JBTV9QT09MX0FWQUlMQUJMRV0udmFsdWVbMF0gOiAtMSk7CisJCQloaWRfZGJnKHBpZGZmLT5oaWQsICJkZXZpY2UgcmVwb3J0ZWQgZnJlZSBtZW1vcnk6ICVkIGJ5dGVzXG4iLAorCQkJCSBwaWRmZi0+YmxvY2tfbG9hZFtQSURfUkFNX1BPT0xfQVZBSUxBQkxFXS52YWx1ZSA/CisJCQkJIHBpZGZmLT5ibG9ja19sb2FkW1BJRF9SQU1fUE9PTF9BVkFJTEFCTEVdLnZhbHVlWzBdIDogLTEpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAkJaWYgKHBpZGZmLT5ibG9ja19sb2FkX3N0YXR1cy0+dmFsdWVbMF0gPT0KIAkJICAgIHBpZGZmLT5zdGF0dXNfaWRbUElEX0JMT0NLX0xPQURfRlVMTF0pIHsKLQkJCWRlYnVnKCJub3QgZW5vdWdoIG1lbW9yeSBmcmVlOiAlZCBieXRlcyIsCi0JCQkgICAgICBwaWRmZi0+YmxvY2tfbG9hZFtQSURfUkFNX1BPT0xfQVZBSUxBQkxFXS52YWx1ZSA/CisJCQloaWRfZGJnKHBpZGZmLT5oaWQsICJub3QgZW5vdWdoIG1lbW9yeSBmcmVlOiAlZCBieXRlc1xuIiwKKwkJCQlwaWRmZi0+YmxvY2tfbG9hZFtQSURfUkFNX1BPT0xfQVZBSUxBQkxFXS52YWx1ZSA/CiAJCQkJcGlkZmYtPmJsb2NrX2xvYWRbUElEX1JBTV9QT09MX0FWQUlMQUJMRV0udmFsdWVbMF0gOiAtMSk7CiAJCQlyZXR1cm4gLUVOT1NQQzsKIAkJfQogCX0KLQlwcmludGsoS0VSTl9FUlIgImhpZC1waWRmZjogcGlkX2Jsb2NrX2xvYWQgZmFpbGVkIDYwIHRpbWVzXG4iKTsKKwloaWRfZXJyKHBpZGZmLT5oaWQsICJwaWRfYmxvY2tfbG9hZCBmYWlsZWQgNjAgdGltZXNcbiIpOwogCXJldHVybiAtRUlPOwogfQogCkBAIC01NDYsNyArNTQ3LDggQEAKIAlzdHJ1Y3QgcGlkZmZfZGV2aWNlICpwaWRmZiA9IGRldi0+ZmYtPnByaXZhdGU7CiAJaW50IHBpZF9pZCA9IHBpZGZmLT5waWRfaWRbZWZmZWN0X2lkXTsKIAotCWRlYnVnKCJzdGFydGluZyB0byBlcmFzZSAlZC8lZCIsIGVmZmVjdF9pZCwgcGlkZmYtPnBpZF9pZFtlZmZlY3RfaWRdKTsKKwloaWRfZGJnKHBpZGZmLT5oaWQsICJzdGFydGluZyB0byBlcmFzZSAlZC8lZFxuIiwKKwkJZWZmZWN0X2lkLCBwaWRmZi0+cGlkX2lkW2VmZmVjdF9pZF0pOwogCS8qIFdhaXQgZm9yIHRoZSBxdWV1ZSB0byBjbGVhci4gV2UgZG8gbm90IHdhbnQgYSBmdWxsIGZpZm8gdG8KIAkgICBwcmV2ZW50IHRoZSBlZmZlY3QgcmVtb3ZhbC4gKi8KIAl1c2JoaWRfd2FpdF9pbyhwaWRmZi0+aGlkKTsKQEAgLTYwNCw4ICs2MDYsNyBAQAogCQkJCXR5cGVfaWQgPSBQSURfU0FXX0RPV047CiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgotCQkJCXByaW50ayhLRVJOX0VSUgotCQkJCSAgICAgICAiaGlkLXBpZGZmOiBpbnZhbGlkIHdhdmVmb3JtXG4iKTsKKwkJCQloaWRfZXJyKHBpZGZmLT5oaWQsICJpbnZhbGlkIHdhdmVmb3JtXG4iKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIApAQCAtNjk2LDcgKzY5Nyw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fRVJSICJoaWQtcGlkZmY6IGludmFsaWQgdHlwZVxuIik7CisJCWhpZF9lcnIocGlkZmYtPmhpZCwgImludmFsaWQgdHlwZVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNzA0LDcgKzcwNSw3IEBACiAJCXBpZGZmLT5waWRfaWRbZWZmZWN0LT5pZF0gPQogCQkgICAgcGlkZmYtPmJsb2NrX2xvYWRbUElEX0VGRkVDVF9CTE9DS19JTkRFWF0udmFsdWVbMF07CiAKLQlkZWJ1ZygidXBsb2FkZWQiKTsKKwloaWRfZGJnKHBpZGZmLT5oaWQsICJ1cGxvYWRlZFxuIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTc3MCwxNCArNzcxLDE0IEBACiAJCWZvciAoaSA9IDA7IGkgPCByZXBvcnQtPm1heGZpZWxkOyBpKyspIHsKIAkJCWlmIChyZXBvcnQtPmZpZWxkW2ldLT5tYXh1c2FnZSAhPQogCQkJICAgIHJlcG9ydC0+ZmllbGRbaV0tPnJlcG9ydF9jb3VudCkgewotCQkJCWRlYnVnKCJtYXh1c2FnZSBhbmQgcmVwb3J0X2NvdW50IGRvIG5vdCBtYXRjaCwgIgotCQkJCSAgICAgICJza2lwcGluZyIpOworCQkJCXByX2RlYnVnKCJtYXh1c2FnZSBhbmQgcmVwb3J0X2NvdW50IGRvIG5vdCBtYXRjaCwgc2tpcHBpbmdcbiIpOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCQkJZm9yIChqID0gMDsgaiA8IHJlcG9ydC0+ZmllbGRbaV0tPm1heHVzYWdlOyBqKyspIHsKIAkJCQlpZiAocmVwb3J0LT5maWVsZFtpXS0+dXNhZ2Vbal0uaGlkID09CiAJCQkJICAgIChISURfVVBfUElEIHwgdGFibGVba10pKSB7Ci0JCQkJCWRlYnVnKCJmb3VuZCAlZCBhdCAlZC0+JWQiLCBrLCBpLCBqKTsKKwkJCQkJcHJfZGVidWcoImZvdW5kICVkIGF0ICVkLT4lZFxuIiwKKwkJCQkJCSBrLCBpLCBqKTsKIAkJCQkJdXNhZ2Vba10uZmllbGQgPSByZXBvcnQtPmZpZWxkW2ldOwogCQkJCQl1c2FnZVtrXS52YWx1ZSA9CiAJCQkJCQkmcmVwb3J0LT5maWVsZFtpXS0+dmFsdWVbal07CkBAIC03ODksNyArNzkwLDcgQEAKIAkJCQlicmVhazsKIAkJfQogCQlpZiAoIWZvdW5kICYmIHN0cmljdCkgewotCQkJZGVidWcoImZhaWxlZCB0byBsb2NhdGUgJWQiLCBrKTsKKwkJCXByX2RlYnVnKCJmYWlsZWQgdG8gbG9jYXRlICVkXG4iLCBrKTsKIAkJCXJldHVybiAtMTsKIAkJfQogCX0KQEAgLTgyNiw4ICs4MjcsOCBAQAogCQkJY29udGludWU7CiAJCXJldCA9IHBpZGZmX2NoZWNrX3VzYWdlKHJlcG9ydC0+ZmllbGRbMF0tPmxvZ2ljYWwpOwogCQlpZiAocmV0ICE9IC0xKSB7Ci0JCQlkZWJ1ZygiZm91bmQgdXNhZ2UgMHglMDJ4IGZyb20gZmllbGQtPmxvZ2ljYWwiLAotCQkJICAgICAgcGlkZmZfcmVwb3J0c1tyZXRdKTsKKwkJCWhpZF9kYmcoaGlkLCAiZm91bmQgdXNhZ2UgMHglMDJ4IGZyb20gZmllbGQtPmxvZ2ljYWxcbiIsCisJCQkJcGlkZmZfcmVwb3J0c1tyZXRdKTsKIAkJCXBpZGZmLT5yZXBvcnRzW3JldF0gPSByZXBvcnQ7CiAJCQljb250aW51ZTsKIAkJfQpAQCAtODQ1LDggKzg0Niw5IEBACiAJCQljb250aW51ZTsKIAkJcmV0ID0gcGlkZmZfY2hlY2tfdXNhZ2UoaGlkLT5jb2xsZWN0aW9uW2kgLSAxXS51c2FnZSk7CiAJCWlmIChyZXQgIT0gLTEgJiYgIXBpZGZmLT5yZXBvcnRzW3JldF0pIHsKLQkJCWRlYnVnKCJmb3VuZCB1c2FnZSAweCUwMnggZnJvbSBjb2xsZWN0aW9uIGFycmF5IiwKLQkJCSAgICAgIHBpZGZmX3JlcG9ydHNbcmV0XSk7CisJCQloaWRfZGJnKGhpZCwKKwkJCQkiZm91bmQgdXNhZ2UgMHglMDJ4IGZyb20gY29sbGVjdGlvbiBhcnJheVxuIiwKKwkJCQlwaWRmZl9yZXBvcnRzW3JldF0pOwogCQkJcGlkZmYtPnJlcG9ydHNbcmV0XSA9IHJlcG9ydDsKIAkJfQogCX0KQEAgLTg2MSw3ICs4NjMsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8PSBQSURfUkVRVUlSRURfUkVQT1JUUzsgaSsrKSB7CiAJCWlmICghcGlkZmYtPnJlcG9ydHNbaV0pIHsKLQkJCWRlYnVnKCIlZCBtaXNzaW5nIiwgaSk7CisJCQloaWRfZGJnKHBpZGZmLT5oaWQsICIlZCBtaXNzaW5nXG4iLCBpKTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQpAQCAtODg0LDggKzg4Niw3IEBACiAJCQkgICAgcmVwb3J0LT5maWVsZFtpXS0+bG9naWNhbF9taW5pbXVtID09IDEpCiAJCQkJcmV0dXJuIHJlcG9ydC0+ZmllbGRbaV07CiAJCQllbHNlIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgImhpZC1waWRmZjogbG9naWNhbF9taW5pbXVtICIKLQkJCQkJImlzIG5vdCAxIGFzIGl0IHNob3VsZCBiZVxuIik7CisJCQkJcHJfZXJyKCJsb2dpY2FsX21pbmltdW0gaXMgbm90IDEgYXMgaXQgc2hvdWxkIGJlXG4iKTsKIAkJCQlyZXR1cm4gTlVMTDsKIAkJCX0KIAkJfQpAQCAtOTI0LDcgKzkyNSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgcGlkZmZfZmluZF9zcGVjaWFsX2ZpZWxkcyhzdHJ1Y3QgcGlkZmZfZGV2aWNlICpwaWRmZikKIHsKLQlkZWJ1ZygiZmluZGluZyBzcGVjaWFsIGZpZWxkcyIpOworCWhpZF9kYmcocGlkZmYtPmhpZCwgImZpbmRpbmcgc3BlY2lhbCBmaWVsZHNcbiIpOwogCiAJcGlkZmYtPmNyZWF0ZV9uZXdfZWZmZWN0X3R5cGUgPQogCQlwaWRmZl9maW5kX3NwZWNpYWxfZmllbGQocGlkZmYtPnJlcG9ydHNbUElEX0NSRUFURV9ORVdfRUZGRUNUXSwKQEAgLTk0NSwzMiArOTQ2LDMwIEBACiAJCXBpZGZmX2ZpbmRfc3BlY2lhbF9maWVsZChwaWRmZi0+cmVwb3J0c1tQSURfRUZGRUNUX09QRVJBVElPTl0sCiAJCQkJCSAweDc4LCAxKTsKIAotCWRlYnVnKCJzZWFyY2ggZG9uZSIpOworCWhpZF9kYmcocGlkZmYtPmhpZCwgInNlYXJjaCBkb25lXG4iKTsKIAogCWlmICghcGlkZmYtPmNyZWF0ZV9uZXdfZWZmZWN0X3R5cGUgfHwgIXBpZGZmLT5zZXRfZWZmZWN0X3R5cGUpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJoaWQtcGlkZmY6IGVmZmVjdCBsaXN0cyBub3QgZm91bmRcbiIpOworCQloaWRfZXJyKHBpZGZmLT5oaWQsICJlZmZlY3QgbGlzdHMgbm90IGZvdW5kXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAogCWlmICghcGlkZmYtPmVmZmVjdF9kaXJlY3Rpb24pIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJoaWQtcGlkZmY6IGRpcmVjdGlvbiBmaWVsZCBub3QgZm91bmRcbiIpOworCQloaWRfZXJyKHBpZGZmLT5oaWQsICJkaXJlY3Rpb24gZmllbGQgbm90IGZvdW5kXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAogCWlmICghcGlkZmYtPmRldmljZV9jb250cm9sKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaGlkLXBpZGZmOiBkZXZpY2UgY29udHJvbCBmaWVsZCBub3QgZm91bmRcbiIpOworCQloaWRfZXJyKHBpZGZmLT5oaWQsICJkZXZpY2UgY29udHJvbCBmaWVsZCBub3QgZm91bmRcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCiAJaWYgKCFwaWRmZi0+YmxvY2tfbG9hZF9zdGF0dXMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiaGlkLXBpZGZmOiBibG9jayBsb2FkIHN0YXR1cyBmaWVsZCBub3QgZm91bmRcbiIpOworCQloaWRfZXJyKHBpZGZmLT5oaWQsICJibG9jayBsb2FkIHN0YXR1cyBmaWVsZCBub3QgZm91bmRcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCiAJaWYgKCFwaWRmZi0+ZWZmZWN0X29wZXJhdGlvbl9zdGF0dXMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiaGlkLXBpZGZmOiBlZmZlY3Qgb3BlcmF0aW9uIGZpZWxkIG5vdCBmb3VuZFxuIik7CisJCWhpZF9lcnIocGlkZmYtPmhpZCwgImVmZmVjdCBvcGVyYXRpb24gZmllbGQgbm90IGZvdW5kXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtOTgyLDIzICs5ODEsMjIgQEAKIAogCWlmICghUElERkZfRklORF9TUEVDSUFMX0tFWVModHlwZV9pZCwgY3JlYXRlX25ld19lZmZlY3RfdHlwZSwKIAkJCQkgICAgIGVmZmVjdF90eXBlcykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJoaWQtcGlkZmY6IG5vIGVmZmVjdCB0eXBlcyBmb3VuZFxuIik7CisJCWhpZF9lcnIocGlkZmYtPmhpZCwgIm5vIGVmZmVjdCB0eXBlcyBmb3VuZFxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAKIAlpZiAoUElERkZfRklORF9TUEVDSUFMX0tFWVMoc3RhdHVzX2lkLCBibG9ja19sb2FkX3N0YXR1cywKIAkJCQkgICAgYmxvY2tfbG9hZF9zdGF0dXMpICE9CiAJCQlzaXplb2YocGlkZmZfYmxvY2tfbG9hZF9zdGF0dXMpKSB7Ci0JCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgImhpZHBpZGZmOiBibG9jayBsb2FkIHN0YXR1cyBpZGVudGlmaWVycyBub3QgZm91bmRcbiIpOworCQloaWRfZXJyKHBpZGZmLT5oaWQsCisJCQkiYmxvY2sgbG9hZCBzdGF0dXMgaWRlbnRpZmllcnMgbm90IGZvdW5kXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAogCWlmIChQSURGRl9GSU5EX1NQRUNJQUxfS0VZUyhvcGVyYXRpb25faWQsIGVmZmVjdF9vcGVyYXRpb25fc3RhdHVzLAogCQkJCSAgICBlZmZlY3Rfb3BlcmF0aW9uX3N0YXR1cykgIT0KIAkJCXNpemVvZihwaWRmZl9lZmZlY3Rfb3BlcmF0aW9uX3N0YXR1cykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiaGlkcGlkZmY6IGVmZmVjdCBvcGVyYXRpb24gaWRlbnRpZmllcnMgbm90IGZvdW5kXG4iKTsKKwkJaGlkX2VycihwaWRmZi0+aGlkLCAiZWZmZWN0IG9wZXJhdGlvbiBpZGVudGlmaWVycyBub3QgZm91bmRcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC0xMDE3LDggKzEwMTUsOCBAQAogCQlpbnQgcGlkZmZfdHlwZSA9IHBpZGZmLT50eXBlX2lkW2ldOwogCQlpZiAocGlkZmYtPnNldF9lZmZlY3RfdHlwZS0+dXNhZ2VbcGlkZmZfdHlwZV0uaGlkICE9CiAJCSAgICBwaWRmZi0+Y3JlYXRlX25ld19lZmZlY3RfdHlwZS0+dXNhZ2VbcGlkZmZfdHlwZV0uaGlkKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImhpZC1waWRmZjogIgotCQkJICAgICAgICJlZmZlY3QgdHlwZSBudW1iZXIgJWQgaXMgaW52YWxpZFxuIiwgaSk7CisJCQloaWRfZXJyKHBpZGZmLT5oaWQsCisJCQkJImVmZmVjdCB0eXBlIG51bWJlciAlZCBpcyBpbnZhbGlkXG4iLCBpKTsKIAkJCXJldHVybiAtMTsKIAkJfQogCX0KQEAgLTEwNzMsMjcgKzEwNzEsMjMgQEAKIAlpbnQgZW52ZWxvcGVfb2sgPSAwOwogCiAJaWYgKFBJREZGX0ZJTkRfRklFTERTKHNldF9lZmZlY3QsIFBJRF9TRVRfRUZGRUNULCAxKSkgewotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJoaWQtcGlkZmY6IHVua25vd24gc2V0X2VmZmVjdCByZXBvcnQgbGF5b3V0XG4iKTsKKwkJaGlkX2VycihwaWRmZi0+aGlkLCAidW5rbm93biBzZXRfZWZmZWN0IHJlcG9ydCBsYXlvdXRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAlQSURGRl9GSU5EX0ZJRUxEUyhibG9ja19sb2FkLCBQSURfQkxPQ0tfTE9BRCwgMCk7CiAJaWYgKCFwaWRmZi0+YmxvY2tfbG9hZFtQSURfRUZGRUNUX0JMT0NLX0lOREVYXS52YWx1ZSkgewotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJoaWQtcGlkZmY6IHVua25vd24gcGlkX2Jsb2NrX2xvYWQgcmVwb3J0IGxheW91dFxuIik7CisJCWhpZF9lcnIocGlkZmYtPmhpZCwgInVua25vd24gcGlkX2Jsb2NrX2xvYWQgcmVwb3J0IGxheW91dFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCWlmIChQSURGRl9GSU5EX0ZJRUxEUyhlZmZlY3Rfb3BlcmF0aW9uLCBQSURfRUZGRUNUX09QRVJBVElPTiwgMSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiaGlkLXBpZGZmOiB1bmtub3duIGVmZmVjdF9vcGVyYXRpb24gcmVwb3J0IGxheW91dFxuIik7CisJCWhpZF9lcnIocGlkZmYtPmhpZCwgInVua25vd24gZWZmZWN0X29wZXJhdGlvbiByZXBvcnQgbGF5b3V0XG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJaWYgKFBJREZGX0ZJTkRfRklFTERTKGJsb2NrX2ZyZWUsIFBJRF9CTE9DS19GUkVFLCAxKSkgewotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJoaWQtcGlkZmY6IHVua25vd24gcGlkX2Jsb2NrX2ZyZWUgcmVwb3J0IGxheW91dFxuIik7CisJCWhpZF9lcnIocGlkZmYtPmhpZCwgInVua25vd24gcGlkX2Jsb2NrX2ZyZWUgcmVwb3J0IGxheW91dFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtMTEwNSwyNyArMTA5OSwyNiBAQAogCiAJaWYgKCFlbnZlbG9wZV9vaykgewogCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEZGX0NPTlNUQU5ULCBkZXYtPmZmYml0KSkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImhpZC1waWRmZjogIgotCQkJICAgICAgICJoYXMgY29uc3RhbnQgZWZmZWN0IGJ1dCBubyBlbnZlbG9wZVxuIik7CisJCQloaWRfd2FybihwaWRmZi0+aGlkLAorCQkJCSAiaGFzIGNvbnN0YW50IGVmZmVjdCBidXQgbm8gZW52ZWxvcGVcbiIpOwogCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEZGX1JBTVAsIGRldi0+ZmZiaXQpKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaGlkLXBpZGZmOiAiCi0JCQkJImhhcyByYW1wIGVmZmVjdCBidXQgbm8gZW52ZWxvcGVcbiIpOworCQkJaGlkX3dhcm4ocGlkZmYtPmhpZCwKKwkJCQkgImhhcyByYW1wIGVmZmVjdCBidXQgbm8gZW52ZWxvcGVcbiIpOwogCiAJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoRkZfUEVSSU9ESUMsIGRldi0+ZmZiaXQpKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaGlkLXBpZGZmOiAiCi0JCQkJImhhcyBwZXJpb2RpYyBlZmZlY3QgYnV0IG5vIGVudmVsb3BlXG4iKTsKKwkJCWhpZF93YXJuKHBpZGZmLT5oaWQsCisJCQkJICJoYXMgcGVyaW9kaWMgZWZmZWN0IGJ1dCBubyBlbnZlbG9wZVxuIik7CiAJfQogCiAJaWYgKHRlc3RfYml0KEZGX0NPTlNUQU5ULCBkZXYtPmZmYml0KSAmJgogCSAgICBQSURGRl9GSU5EX0ZJRUxEUyhzZXRfY29uc3RhbnQsIFBJRF9TRVRfQ09OU1RBTlQsIDEpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICAgICJoaWQtcGlkZmY6IHVua25vd24gY29uc3RhbnQgZWZmZWN0IGxheW91dFxuIik7CisJCWhpZF93YXJuKHBpZGZmLT5oaWQsICJ1bmtub3duIGNvbnN0YW50IGVmZmVjdCBsYXlvdXRcbiIpOwogCQljbGVhcl9iaXQoRkZfQ09OU1RBTlQsIGRldi0+ZmZiaXQpOwogCX0KIAogCWlmICh0ZXN0X2JpdChGRl9SQU1QLCBkZXYtPmZmYml0KSAmJgogCSAgICBQSURGRl9GSU5EX0ZJRUxEUyhzZXRfcmFtcCwgUElEX1NFVF9SQU1QLCAxKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJoaWQtcGlkZmY6IHVua25vd24gcmFtcCBlZmZlY3QgbGF5b3V0XG4iKTsKKwkJaGlkX3dhcm4ocGlkZmYtPmhpZCwgInVua25vd24gcmFtcCBlZmZlY3QgbGF5b3V0XG4iKTsKIAkJY2xlYXJfYml0KEZGX1JBTVAsIGRldi0+ZmZiaXQpOwogCX0KIApAQCAtMTEzNCw4ICsxMTI3LDcgQEAKIAkgICAgIHRlc3RfYml0KEZGX0ZSSUNUSU9OLCBkZXYtPmZmYml0KSB8fAogCSAgICAgdGVzdF9iaXQoRkZfSU5FUlRJQSwgZGV2LT5mZmJpdCkpICYmCiAJICAgIFBJREZGX0ZJTkRfRklFTERTKHNldF9jb25kaXRpb24sIFBJRF9TRVRfQ09ORElUSU9OLCAxKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAgICAiaGlkLXBpZGZmOiB1bmtub3duIGNvbmRpdGlvbiBlZmZlY3QgbGF5b3V0XG4iKTsKKwkJaGlkX3dhcm4ocGlkZmYtPmhpZCwgInVua25vd24gY29uZGl0aW9uIGVmZmVjdCBsYXlvdXRcbiIpOwogCQljbGVhcl9iaXQoRkZfU1BSSU5HLCBkZXYtPmZmYml0KTsKIAkJY2xlYXJfYml0KEZGX0RBTVBFUiwgZGV2LT5mZmJpdCk7CiAJCWNsZWFyX2JpdChGRl9GUklDVElPTiwgZGV2LT5mZmJpdCk7CkBAIC0xMTQ0LDggKzExMzYsNyBAQAogCiAJaWYgKHRlc3RfYml0KEZGX1BFUklPRElDLCBkZXYtPmZmYml0KSAmJgogCSAgICBQSURGRl9GSU5EX0ZJRUxEUyhzZXRfcGVyaW9kaWMsIFBJRF9TRVRfUEVSSU9ESUMsIDEpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICAgICJoaWQtcGlkZmY6IHVua25vd24gcGVyaW9kaWMgZWZmZWN0IGxheW91dFxuIik7CisJCWhpZF93YXJuKHBpZGZmLT5oaWQsICJ1bmtub3duIHBlcmlvZGljIGVmZmVjdCBsYXlvdXRcbiIpOwogCQljbGVhcl9iaXQoRkZfUEVSSU9ESUMsIGRldi0+ZmZiaXQpOwogCX0KIApAQCAtMTE4NCwxMiArMTE3NSwxMiBAQAogCWlmIChwaWRmZi0+cG9vbFtQSURfU0lNVUxUQU5FT1VTX01BWF0udmFsdWUpIHsKIAkJd2hpbGUgKHBpZGZmLT5wb29sW1BJRF9TSU1VTFRBTkVPVVNfTUFYXS52YWx1ZVswXSA8IDIpIHsKIAkJCWlmIChpKysgPiAyMCkgewotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImhpZC1waWRmZjogZGV2aWNlIHJlcG9ydHMgIgotCQkJCSAgICAgICAiJWQgc2ltdWx0YW5lb3VzIGVmZmVjdHNcbiIsCi0JCQkJICAgICAgIHBpZGZmLT5wb29sW1BJRF9TSU1VTFRBTkVPVVNfTUFYXS52YWx1ZVswXSk7CisJCQkJaGlkX3dhcm4ocGlkZmYtPmhpZCwKKwkJCQkJICJkZXZpY2UgcmVwb3J0cyAlZCBzaW11bHRhbmVvdXMgZWZmZWN0c1xuIiwKKwkJCQkJIHBpZGZmLT5wb29sW1BJRF9TSU1VTFRBTkVPVVNfTUFYXS52YWx1ZVswXSk7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCQlkZWJ1ZygicGlkX3Bvb2wgcmVxdWVzdGVkIGFnYWluIik7CisJCQloaWRfZGJnKHBpZGZmLT5oaWQsICJwaWRfcG9vbCByZXF1ZXN0ZWQgYWdhaW5cbiIpOwogCQkJdXNiaGlkX3N1Ym1pdF9yZXBvcnQoaGlkLCBwaWRmZi0+cmVwb3J0c1tQSURfUE9PTF0sCiAJCQkJCSAgVVNCX0RJUl9JTik7CiAJCQl1c2JoaWRfd2FpdF9pbyhoaWQpOwpAQCAtMTIxNSw3ICsxMjA2LDcgQEAKIAogCWVycm9yID0gcGlkZmZfcmVxdWVzdF9lZmZlY3RfdXBsb2FkKHBpZGZmLCAxKTsKIAlpZiAoZXJyb3IpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJoaWQtcGlkZmY6IHVwbG9hZCByZXF1ZXN0IGZhaWxlZFxuIik7CisJCWhpZF9lcnIocGlkZmYtPmhpZCwgInVwbG9hZCByZXF1ZXN0IGZhaWxlZFxuIik7CiAJCXJldHVybiBlcnJvcjsKIAl9CiAKQEAgLTEyMjQsOCArMTIxNSw4IEBACiAJCXBpZGZmX2F1dG9jZW50ZXIocGlkZmYsIDB4ZmZmZik7CiAJCXNldF9iaXQoRkZfQVVUT0NFTlRFUiwgZGV2LT5mZmJpdCk7CiAJfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICJoaWQtcGlkZmY6ICIKLQkJICAgICAgICJkZXZpY2UgaGFzIHVua25vd24gYXV0b2NlbnRlciBjb250cm9sIG1ldGhvZFxuIik7CisJCWhpZF9ub3RpY2UocGlkZmYtPmhpZCwKKwkJCSAgICJkZXZpY2UgaGFzIHVua25vd24gYXV0b2NlbnRlciBjb250cm9sIG1ldGhvZFxuIik7CiAJfQogCiAJcGlkZmZfZXJhc2VfcGlkKHBpZGZmLApAQCAtMTI0OCwxMCArMTIzOSwxMCBAQAogCWludCBtYXhfZWZmZWN0czsKIAlpbnQgZXJyb3I7CiAKLQlkZWJ1Zygic3RhcnRpbmcgcGlkIGluaXQiKTsKKwloaWRfZGJnKGhpZCwgInN0YXJ0aW5nIHBpZCBpbml0XG4iKTsKIAogCWlmIChsaXN0X2VtcHR5KCZoaWQtPnJlcG9ydF9lbnVtW0hJRF9PVVRQVVRfUkVQT1JUXS5yZXBvcnRfbGlzdCkpIHsKLQkJZGVidWcoIm5vdCBhIFBJRCBkZXZpY2UsIG5vIG91dHB1dCByZXBvcnQiKTsKKwkJaGlkX2RiZyhoaWQsICJub3QgYSBQSUQgZGV2aWNlLCBubyBvdXRwdXQgcmVwb3J0XG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0xMjY1LDcgKzEyNTYsNyBAQAogCXBpZGZmX2ZpbmRfcmVwb3J0cyhoaWQsIEhJRF9GRUFUVVJFX1JFUE9SVCwgcGlkZmYpOwogCiAJaWYgKCFwaWRmZl9yZXBvcnRzX29rKHBpZGZmKSkgewotCQlkZWJ1ZygicmVwb3J0cyBub3Qgb2ssIGFib3J0aW5nIik7CisJCWhpZF9kYmcoaGlkLCAicmVwb3J0cyBub3Qgb2ssIGFib3J0aW5nXG4iKTsKIAkJZXJyb3IgPSAtRU5PREVWOwogCQlnb3RvIGZhaWw7CiAJfQpAQCAtMTI3OCw4ICsxMjY5LDggQEAKIAogCWlmICh0ZXN0X2JpdChGRl9HQUlOLCBkZXYtPmZmYml0KSkgewogCQlwaWRmZl9zZXQoJnBpZGZmLT5kZXZpY2VfZ2FpbltQSURfREVWSUNFX0dBSU5fRklFTERdLCAweGZmZmYpOwotCQl1c2JoaWRfc3VibWl0X3JlcG9ydChwaWRmZi0+aGlkLCBwaWRmZi0+cmVwb3J0c1tQSURfREVWSUNFX0dBSU5dLAotCQkJCSAgVVNCX0RJUl9PVVQpOworCQl1c2JoaWRfc3VibWl0X3JlcG9ydChoaWQsIHBpZGZmLT5yZXBvcnRzW1BJRF9ERVZJQ0VfR0FJTl0sCisJCQkJICAgICBVU0JfRElSX09VVCk7CiAJfQogCiAJZXJyb3IgPSBwaWRmZl9jaGVja19hdXRvY2VudGVyKHBpZGZmLCBkZXYpOwpAQCAtMTI5MCwyMyArMTI4MSwyMyBAQAogCSAgICBwaWRmZi0+YmxvY2tfbG9hZFtQSURfRUZGRUNUX0JMT0NLX0lOREVYXS5maWVsZC0+bG9naWNhbF9tYXhpbXVtIC0KIAkgICAgcGlkZmYtPmJsb2NrX2xvYWRbUElEX0VGRkVDVF9CTE9DS19JTkRFWF0uZmllbGQtPmxvZ2ljYWxfbWluaW11bSArCiAJICAgIDE7Ci0JZGVidWcoIm1heCBlZmZlY3RzIGlzICVkIiwgbWF4X2VmZmVjdHMpOworCWhpZF9kYmcoaGlkLCAibWF4IGVmZmVjdHMgaXMgJWRcbiIsIG1heF9lZmZlY3RzKTsKIAogCWlmIChtYXhfZWZmZWN0cyA+IFBJRF9FRkZFQ1RTX01BWCkKIAkJbWF4X2VmZmVjdHMgPSBQSURfRUZGRUNUU19NQVg7CiAKIAlpZiAocGlkZmYtPnBvb2xbUElEX1NJTVVMVEFORU9VU19NQVhdLnZhbHVlKQotCQlkZWJ1ZygibWF4IHNpbXVsdGFuZW91cyBlZmZlY3RzIGlzICVkIiwKLQkJICAgICAgcGlkZmYtPnBvb2xbUElEX1NJTVVMVEFORU9VU19NQVhdLnZhbHVlWzBdKTsKKwkJaGlkX2RiZyhoaWQsICJtYXggc2ltdWx0YW5lb3VzIGVmZmVjdHMgaXMgJWRcbiIsCisJCQlwaWRmZi0+cG9vbFtQSURfU0lNVUxUQU5FT1VTX01BWF0udmFsdWVbMF0pOwogCiAJaWYgKHBpZGZmLT5wb29sW1BJRF9SQU1fUE9PTF9TSVpFXS52YWx1ZSkKLQkJZGVidWcoImRldmljZSBtZW1vcnkgc2l6ZSBpcyAlZCBieXRlcyIsCi0JCSAgICAgIHBpZGZmLT5wb29sW1BJRF9SQU1fUE9PTF9TSVpFXS52YWx1ZVswXSk7CisJCWhpZF9kYmcoaGlkLCAiZGV2aWNlIG1lbW9yeSBzaXplIGlzICVkIGJ5dGVzXG4iLAorCQkJcGlkZmYtPnBvb2xbUElEX1JBTV9QT09MX1NJWkVdLnZhbHVlWzBdKTsKIAogCWlmIChwaWRmZi0+cG9vbFtQSURfREVWSUNFX01BTkFHRURfUE9PTF0udmFsdWUgJiYKIAkgICAgcGlkZmYtPnBvb2xbUElEX0RFVklDRV9NQU5BR0VEX1BPT0xdLnZhbHVlWzBdID09IDApIHsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICJoaWQtcGlkZmY6ICIKLQkJICAgICAgICJkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBkZXZpY2UgbWFuYWdlZCBwb29sXG4iKTsKKwkJaGlkX25vdGljZShoaWQsCisJCQkgICAiZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgZGV2aWNlIG1hbmFnZWQgcG9vbFxuIik7CiAJCWdvdG8gZmFpbDsKIAl9CiAKQEAgLTEzMjIsOCArMTMxMyw3IEBACiAJZmYtPnNldF9hdXRvY2VudGVyID0gcGlkZmZfc2V0X2F1dG9jZW50ZXI7CiAJZmYtPnBsYXliYWNrID0gcGlkZmZfcGxheWJhY2s7CiAKLQlwcmludGsoS0VSTl9JTkZPICJGb3JjZSBmZWVkYmFjayBmb3IgVVNCIEhJRCBQSUQgZGV2aWNlcyBieSAiCi0JICAgICAgICJBbnNzaSBIYW5udWxhIDxhbnNzaS5oYW5udWxhQGdtYWlsLmNvbT5cbiIpOworCWhpZF9pbmZvKGRldiwgIkZvcmNlIGZlZWRiYWNrIGZvciBVU0IgSElEIFBJRCBkZXZpY2VzIGJ5IEFuc3NpIEhhbm51bGEgPGFuc3NpLmhhbm51bGFAZ21haWwuY29tPlxuIik7CiAKIAlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1xdWlya3MuYyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtcXVpcmtzLmMKaW5kZXggMmMxODU0Ny4uNzZiOWExNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1xdWlya3MuYworKysgYi9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXF1aXJrcy5jCkBAIC04NSw3ICs4NSw3IEBACiAJeyBVU0JfVkVORE9SX0lEX1BJX0VOR0lORUVSSU5HLCBVU0JfREVWSUNFX0lEX1BJX0VOR0lORUVSSU5HX1ZFQ19VU0JfRk9PVFBFREFMLCBISURfUVVJUktfSElESU5QVVRfRk9SQ0UgfSwKIAogCXsgVVNCX1ZFTkRPUl9JRF9DSElDT05ZLCBVU0JfREVWSUNFX0lEX0NISUNPTllfTVVMVElfVE9VQ0gsIEhJRF9RVUlSS19NVUxUSV9JTlBVVCB9LAotCisJeyBVU0JfVkVORE9SX0lEX0NISUNPTlksIFVTQl9ERVZJQ0VfSURfQ0hJQ09OWV9XSVJFTEVTUywgSElEX1FVSVJLX01VTFRJX0lOUFVUIH0sCiAJeyAwLCAwIH0KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWRkZXYuYyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWRkZXYuYwppbmRleCA5ODRmZWIzLi5hZjBhN2MxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkZGV2LmMKKysrIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZGRldi5jCkBAIC01ODUsMTYzICs1ODUsMTY4IEBACiB7CiAJc3RydWN0IGhpZGRldl9saXN0ICpsaXN0ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBoaWRkZXYgKmhpZGRldiA9IGxpc3QtPmhpZGRldjsKLQlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkID0gaGlkZGV2LT5oaWQ7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkOwogCXN0cnVjdCBoaWRkZXZfY29sbGVjdGlvbl9pbmZvIGNpbmZvOwogCXN0cnVjdCBoaWRkZXZfcmVwb3J0X2luZm8gcmluZm87CiAJc3RydWN0IGhpZGRldl9maWVsZF9pbmZvIGZpbmZvOwogCXN0cnVjdCBoaWRkZXZfZGV2aW5mbyBkaW5mbzsKIAlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0OwogCXN0cnVjdCBoaWRfZmllbGQgKmZpZWxkOwotCXN0cnVjdCB1c2JoaWRfZGV2aWNlICp1c2JoaWQgPSBoaWQtPmRyaXZlcl9kYXRhOwogCXZvaWQgX191c2VyICp1c2VyX2FyZyA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlpbnQgaSwgcjsKLQkKKwlpbnQgaSwgciA9IC1FSU5WQUw7CisKIAkvKiBDYWxsZWQgd2l0aG91dCBCS0wgYnkgY29tcGF0IG1ldGhvZHMgc28gbm8gQktMIHRha2VuICovCiAKLQkvKiBGSVhNRTogV2hvIG9yIHdoYXQgc3RvcCB0aGlzIHJhY2luZyB3aXRoIGEgZGlzY29ubmVjdCA/PyAqLwotCWlmICghaGlkZGV2LT5leGlzdCB8fCAhaGlkKQotCQlyZXR1cm4gLUVJTzsKKwltdXRleF9sb2NrKCZoaWRkZXYtPmV4aXN0YW5jZWxvY2spOworCWlmICghaGlkZGV2LT5leGlzdCkgeworCQlyID0gLUVOT0RFVjsKKwkJZ290byByZXRfdW5sb2NrOworCX0KIAotCWRldiA9IGhpZF90b191c2JfZGV2KGhpZCk7CisJaGlkID0gaGlkZGV2LT5oaWQ7CiAKIAlzd2l0Y2ggKGNtZCkgewogCiAJY2FzZSBISURJT0NHVkVSU0lPTjoKLQkJcmV0dXJuIHB1dF91c2VyKEhJRF9WRVJTSU9OLCAoaW50IF9fdXNlciAqKWFyZyk7CisJCXIgPSBwdXRfdXNlcihISURfVkVSU0lPTiwgKGludCBfX3VzZXIgKilhcmcpID8KKwkJCS1FRkFVTFQgOiAwOworCQlicmVhazsKIAogCWNhc2UgSElESU9DQVBQTElDQVRJT046CiAJCWlmIChhcmcgPCAwIHx8IGFyZyA+PSBoaWQtPm1heGFwcGxpY2F0aW9uKQotCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKIAogCQlmb3IgKGkgPSAwOyBpIDwgaGlkLT5tYXhjb2xsZWN0aW9uOyBpKyspCiAJCQlpZiAoaGlkLT5jb2xsZWN0aW9uW2ldLnR5cGUgPT0KIAkJCSAgICBISURfQ09MTEVDVElPTl9BUFBMSUNBVElPTiAmJiBhcmctLSA9PSAwKQogCQkJCWJyZWFrOwogCi0JCWlmIChpID09IGhpZC0+bWF4Y29sbGVjdGlvbikKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCXJldHVybiBoaWQtPmNvbGxlY3Rpb25baV0udXNhZ2U7CisJCWlmIChpIDwgaGlkLT5tYXhjb2xsZWN0aW9uKQorCQkJciA9IGhpZC0+Y29sbGVjdGlvbltpXS51c2FnZTsKKwkJYnJlYWs7CiAKIAljYXNlIEhJRElPQ0dERVZJTkZPOgotCQlkaW5mby5idXN0eXBlID0gQlVTX1VTQjsKLQkJZGluZm8uYnVzbnVtID0gZGV2LT5idXMtPmJ1c251bTsKLQkJZGluZm8uZGV2bnVtID0gZGV2LT5kZXZudW07Ci0JCWRpbmZvLmlmbnVtID0gdXNiaGlkLT5pZm51bTsKLQkJZGluZm8udmVuZG9yID0gbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKTsKLQkJZGluZm8ucHJvZHVjdCA9IGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpOwotCQlkaW5mby52ZXJzaW9uID0gbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmJjZERldmljZSk7Ci0JCWRpbmZvLm51bV9hcHBsaWNhdGlvbnMgPSBoaWQtPm1heGFwcGxpY2F0aW9uOwotCQlpZiAoY29weV90b191c2VyKHVzZXJfYXJnLCAmZGluZm8sIHNpemVvZihkaW5mbykpKQotCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXsKKwkJCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBoaWRfdG9fdXNiX2RldihoaWQpOworCQkJc3RydWN0IHVzYmhpZF9kZXZpY2UgKnVzYmhpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7CiAKLQkJcmV0dXJuIDA7CisJCQlkaW5mby5idXN0eXBlID0gQlVTX1VTQjsKKwkJCWRpbmZvLmJ1c251bSA9IGRldi0+YnVzLT5idXNudW07CisJCQlkaW5mby5kZXZudW0gPSBkZXYtPmRldm51bTsKKwkJCWRpbmZvLmlmbnVtID0gdXNiaGlkLT5pZm51bTsKKwkJCWRpbmZvLnZlbmRvciA9IGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcik7CisJCQlkaW5mby5wcm9kdWN0ID0gbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCk7CisJCQlkaW5mby52ZXJzaW9uID0gbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmJjZERldmljZSk7CisJCQlkaW5mby5udW1fYXBwbGljYXRpb25zID0gaGlkLT5tYXhhcHBsaWNhdGlvbjsKKworCQkJciA9IGNvcHlfdG9fdXNlcih1c2VyX2FyZywgJmRpbmZvLCBzaXplb2YoZGluZm8pKSA/CisJCQkJLUVGQVVMVCA6IDA7CisJCQlicmVhazsKKwkJfQogCiAJY2FzZSBISURJT0NHRkxBRzoKLQkJaWYgKHB1dF91c2VyKGxpc3QtPmZsYWdzLCAoaW50IF9fdXNlciAqKWFyZykpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlyZXR1cm4gMDsKKwkJciA9IHB1dF91c2VyKGxpc3QtPmZsYWdzLCAoaW50IF9fdXNlciAqKWFyZykgPworCQkJLUVGQVVMVCA6IDA7CisJCWJyZWFrOwogCiAJY2FzZSBISURJT0NTRkxBRzoKIAkJewogCQkJaW50IG5ld2ZsYWdzOwotCQkJaWYgKGdldF91c2VyKG5ld2ZsYWdzLCAoaW50IF9fdXNlciAqKWFyZykpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmIChnZXRfdXNlcihuZXdmbGFncywgKGludCBfX3VzZXIgKilhcmcpKSB7CisJCQkJciA9IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9CiAKIAkJCWlmICgobmV3ZmxhZ3MgJiB+SElEREVWX0ZMQUdTKSAhPSAwIHx8CiAJCQkgICAgKChuZXdmbGFncyAmIEhJRERFVl9GTEFHX1JFUE9SVCkgIT0gMCAmJgogCQkJICAgICAobmV3ZmxhZ3MgJiBISURERVZfRkxBR19VUkVGKSA9PSAwKSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQlicmVhazsKIAogCQkJbGlzdC0+ZmxhZ3MgPSBuZXdmbGFnczsKIAotCQkJcmV0dXJuIDA7CisJCQlyID0gMDsKKwkJCWJyZWFrOwogCQl9CiAKIAljYXNlIEhJRElPQ0dTVFJJTkc6Ci0JCW11dGV4X2xvY2soJmhpZGRldi0+ZXhpc3RhbmNlbG9jayk7Ci0JCWlmIChoaWRkZXYtPmV4aXN0KQotCQkJciA9IGhpZGRldl9pb2N0bF9zdHJpbmcoaGlkZGV2LCBjbWQsIHVzZXJfYXJnKTsKLQkJZWxzZQotCQkJciA9IC1FTk9ERVY7Ci0JCW11dGV4X3VubG9jaygmaGlkZGV2LT5leGlzdGFuY2Vsb2NrKTsKLQkJcmV0dXJuIHI7CisJCXIgPSBoaWRkZXZfaW9jdGxfc3RyaW5nKGhpZGRldiwgY21kLCB1c2VyX2FyZyk7CisJCWJyZWFrOwogCiAJY2FzZSBISURJT0NJTklUUkVQT1JUOgotCQltdXRleF9sb2NrKCZoaWRkZXYtPmV4aXN0YW5jZWxvY2spOwotCQlpZiAoIWhpZGRldi0+ZXhpc3QpIHsKLQkJCW11dGV4X3VubG9jaygmaGlkZGV2LT5leGlzdGFuY2Vsb2NrKTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9CiAJCXVzYmhpZF9pbml0X3JlcG9ydHMoaGlkKTsKLQkJbXV0ZXhfdW5sb2NrKCZoaWRkZXYtPmV4aXN0YW5jZWxvY2spOwotCi0JCXJldHVybiAwOworCQlyID0gMDsKKwkJYnJlYWs7CiAKIAljYXNlIEhJRElPQ0dSRVBPUlQ6Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmcmluZm8sIHVzZXJfYXJnLCBzaXplb2YocmluZm8pKSkKLQkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoY29weV9mcm9tX3VzZXIoJnJpbmZvLCB1c2VyX2FyZywgc2l6ZW9mKHJpbmZvKSkpIHsKKwkJCXIgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KIAogCQlpZiAocmluZm8ucmVwb3J0X3R5cGUgPT0gSElEX1JFUE9SVF9UWVBFX09VVFBVVCkKLQkJCXJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CiAKLQkJaWYgKChyZXBvcnQgPSBoaWRkZXZfbG9va3VwX3JlcG9ydChoaWQsICZyaW5mbykpID09IE5VTEwpCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmVwb3J0ID0gaGlkZGV2X2xvb2t1cF9yZXBvcnQoaGlkLCAmcmluZm8pOworCQlpZiAocmVwb3J0ID09IE5VTEwpCisJCQlicmVhazsKIAotCQltdXRleF9sb2NrKCZoaWRkZXYtPmV4aXN0YW5jZWxvY2spOwotCQlpZiAoaGlkZGV2LT5leGlzdCkgewotCQkJdXNiaGlkX3N1Ym1pdF9yZXBvcnQoaGlkLCByZXBvcnQsIFVTQl9ESVJfSU4pOwotCQkJdXNiaGlkX3dhaXRfaW8oaGlkKTsKLQkJfQotCQltdXRleF91bmxvY2soJmhpZGRldi0+ZXhpc3RhbmNlbG9jayk7CisJCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgcmVwb3J0LCBVU0JfRElSX0lOKTsKKwkJdXNiaGlkX3dhaXRfaW8oaGlkKTsKIAotCQlyZXR1cm4gMDsKKwkJciA9IDA7CisJCWJyZWFrOwogCiAJY2FzZSBISURJT0NTUkVQT1JUOgotCQlpZiAoY29weV9mcm9tX3VzZXIoJnJpbmZvLCB1c2VyX2FyZywgc2l6ZW9mKHJpbmZvKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZyaW5mbywgdXNlcl9hcmcsIHNpemVvZihyaW5mbykpKSB7CisJCQlyID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CiAKIAkJaWYgKHJpbmZvLnJlcG9ydF90eXBlID09IEhJRF9SRVBPUlRfVFlQRV9JTlBVVCkKLQkJCXJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CiAKLQkJaWYgKChyZXBvcnQgPSBoaWRkZXZfbG9va3VwX3JlcG9ydChoaWQsICZyaW5mbykpID09IE5VTEwpCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmVwb3J0ID0gaGlkZGV2X2xvb2t1cF9yZXBvcnQoaGlkLCAmcmluZm8pOworCQlpZiAocmVwb3J0ID09IE5VTEwpCisJCQlicmVhazsKIAotCQltdXRleF9sb2NrKCZoaWRkZXYtPmV4aXN0YW5jZWxvY2spOwotCQlpZiAoaGlkZGV2LT5leGlzdCkgewotCQkJdXNiaGlkX3N1Ym1pdF9yZXBvcnQoaGlkLCByZXBvcnQsIFVTQl9ESVJfT1VUKTsKLQkJCXVzYmhpZF93YWl0X2lvKGhpZCk7Ci0JCX0KLQkJbXV0ZXhfdW5sb2NrKCZoaWRkZXYtPmV4aXN0YW5jZWxvY2spOworCQl1c2JoaWRfc3VibWl0X3JlcG9ydChoaWQsIHJlcG9ydCwgVVNCX0RJUl9PVVQpOworCQl1c2JoaWRfd2FpdF9pbyhoaWQpOwogCi0JCXJldHVybiAwOworCQlyID0gMDsKKwkJYnJlYWs7CiAKIAljYXNlIEhJRElPQ0dSRVBPUlRJTkZPOgotCQlpZiAoY29weV9mcm9tX3VzZXIoJnJpbmZvLCB1c2VyX2FyZywgc2l6ZW9mKHJpbmZvKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZyaW5mbywgdXNlcl9hcmcsIHNpemVvZihyaW5mbykpKSB7CisJCQlyID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CiAKLQkJaWYgKChyZXBvcnQgPSBoaWRkZXZfbG9va3VwX3JlcG9ydChoaWQsICZyaW5mbykpID09IE5VTEwpCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmVwb3J0ID0gaGlkZGV2X2xvb2t1cF9yZXBvcnQoaGlkLCAmcmluZm8pOworCQlpZiAocmVwb3J0ID09IE5VTEwpCisJCQlicmVhazsKIAogCQlyaW5mby5udW1fZmllbGRzID0gcmVwb3J0LT5tYXhmaWVsZDsKIAotCQlpZiAoY29weV90b191c2VyKHVzZXJfYXJnLCAmcmluZm8sIHNpemVvZihyaW5mbykpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJcmV0dXJuIDA7CisJCXIgPSBjb3B5X3RvX3VzZXIodXNlcl9hcmcsICZyaW5mbywgc2l6ZW9mKHJpbmZvKSkgPworCQkJLUVGQVVMVCA6IDA7CisJCWJyZWFrOwogCiAJY2FzZSBISURJT0NHRklFTERJTkZPOgotCQlpZiAoY29weV9mcm9tX3VzZXIoJmZpbmZvLCB1c2VyX2FyZywgc2l6ZW9mKGZpbmZvKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZmaW5mbywgdXNlcl9hcmcsIHNpemVvZihmaW5mbykpKSB7CisJCQlyID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKIAkJcmluZm8ucmVwb3J0X3R5cGUgPSBmaW5mby5yZXBvcnRfdHlwZTsKIAkJcmluZm8ucmVwb3J0X2lkID0gZmluZm8ucmVwb3J0X2lkOwotCQlpZiAoKHJlcG9ydCA9IGhpZGRldl9sb29rdXBfcmVwb3J0KGhpZCwgJnJpbmZvKSkgPT0gTlVMTCkKLQkJCXJldHVybiAtRUlOVkFMOworCisJCXJlcG9ydCA9IGhpZGRldl9sb29rdXBfcmVwb3J0KGhpZCwgJnJpbmZvKTsKKwkJaWYgKHJlcG9ydCA9PSBOVUxMKQorCQkJYnJlYWs7CiAKIAkJaWYgKGZpbmZvLmZpZWxkX2luZGV4ID49IHJlcG9ydC0+bWF4ZmllbGQpCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWJyZWFrOwogCiAJCWZpZWxkID0gcmVwb3J0LT5maWVsZFtmaW5mby5maWVsZF9pbmRleF07CiAJCW1lbXNldCgmZmluZm8sIDAsIHNpemVvZihmaW5mbykpOwpAQCAtNzYwLDEwICs3NjUsOSBAQAogCQlmaW5mby51bml0X2V4cG9uZW50ID0gZmllbGQtPnVuaXRfZXhwb25lbnQ7CiAJCWZpbmZvLnVuaXQgPSBmaWVsZC0+dW5pdDsKIAotCQlpZiAoY29weV90b191c2VyKHVzZXJfYXJnLCAmZmluZm8sIHNpemVvZihmaW5mbykpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJcmV0dXJuIDA7CisJCXIgPSBjb3B5X3RvX3VzZXIodXNlcl9hcmcsICZmaW5mbywgc2l6ZW9mKGZpbmZvKSkgPworCQkJLUVGQVVMVCA6IDA7CisJCWJyZWFrOwogCiAJY2FzZSBISURJT0NHVUNPREU6CiAJCS8qIGZhbGwgdGhyb3VnaCAqLwpAQCAtNzcyLDU3ICs3NzYsNjYgQEAKIAljYXNlIEhJRElPQ0dVU0FHRVM6CiAJY2FzZSBISURJT0NTVVNBR0VTOgogCWNhc2UgSElESU9DR0NPTExFQ1RJT05JTkRFWDoKLQkJbXV0ZXhfbG9jaygmaGlkZGV2LT5leGlzdGFuY2Vsb2NrKTsKLQkJaWYgKGhpZGRldi0+ZXhpc3QpCi0JCQlyID0gaGlkZGV2X2lvY3RsX3VzYWdlKGhpZGRldiwgY21kLCB1c2VyX2FyZyk7Ci0JCWVsc2UKLQkJCXIgPSAtRU5PREVWOwotCQltdXRleF91bmxvY2soJmhpZGRldi0+ZXhpc3RhbmNlbG9jayk7Ci0JCXJldHVybiByOworCQlyID0gaGlkZGV2X2lvY3RsX3VzYWdlKGhpZGRldiwgY21kLCB1c2VyX2FyZyk7CisJCWJyZWFrOwogCiAJY2FzZSBISURJT0NHQ09MTEVDVElPTklORk86Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmY2luZm8sIHVzZXJfYXJnLCBzaXplb2YoY2luZm8pKSkKLQkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoY29weV9mcm9tX3VzZXIoJmNpbmZvLCB1c2VyX2FyZywgc2l6ZW9mKGNpbmZvKSkpIHsKKwkJCXIgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KIAogCQlpZiAoY2luZm8uaW5kZXggPj0gaGlkLT5tYXhjb2xsZWN0aW9uKQotCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKIAogCQljaW5mby50eXBlID0gaGlkLT5jb2xsZWN0aW9uW2NpbmZvLmluZGV4XS50eXBlOwogCQljaW5mby51c2FnZSA9IGhpZC0+Y29sbGVjdGlvbltjaW5mby5pbmRleF0udXNhZ2U7CiAJCWNpbmZvLmxldmVsID0gaGlkLT5jb2xsZWN0aW9uW2NpbmZvLmluZGV4XS5sZXZlbDsKIAotCQlpZiAoY29weV90b191c2VyKHVzZXJfYXJnLCAmY2luZm8sIHNpemVvZihjaW5mbykpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXJldHVybiAwOworCQlyID0gY29weV90b191c2VyKHVzZXJfYXJnLCAmY2luZm8sIHNpemVvZihjaW5mbykpID8KKwkJCS1FRkFVTFQgOiAwOworCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0KIAkJaWYgKF9JT0NfVFlQRShjbWQpICE9ICdIJyB8fCBfSU9DX0RJUihjbWQpICE9IF9JT0NfUkVBRCkKLQkJCXJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CiAKIAkJaWYgKF9JT0NfTlIoY21kKSA9PSBfSU9DX05SKEhJRElPQ0dOQU1FKDApKSkgewogCQkJaW50IGxlbjsKLQkJCWlmICghaGlkLT5uYW1lKQotCQkJCXJldHVybiAwOworCisJCQlpZiAoIWhpZC0+bmFtZSkgeworCQkJCXIgPSAwOworCQkJCWJyZWFrOworCQkJfQorCiAJCQlsZW4gPSBzdHJsZW4oaGlkLT5uYW1lKSArIDE7CiAJCQlpZiAobGVuID4gX0lPQ19TSVpFKGNtZCkpCiAJCQkJIGxlbiA9IF9JT0NfU0laRShjbWQpOwotCQkJcmV0dXJuIGNvcHlfdG9fdXNlcih1c2VyX2FyZywgaGlkLT5uYW1lLCBsZW4pID8KKwkJCXIgPSBjb3B5X3RvX3VzZXIodXNlcl9hcmcsIGhpZC0+bmFtZSwgbGVuKSA/CiAJCQkJLUVGQVVMVCA6IGxlbjsKKwkJCWJyZWFrOwogCQl9CiAKIAkJaWYgKF9JT0NfTlIoY21kKSA9PSBfSU9DX05SKEhJRElPQ0dQSFlTKDApKSkgewogCQkJaW50IGxlbjsKLQkJCWlmICghaGlkLT5waHlzKQotCQkJCXJldHVybiAwOworCisJCQlpZiAoIWhpZC0+cGh5cykgeworCQkJCXIgPSAwOworCQkJCWJyZWFrOworCQkJfQorCiAJCQlsZW4gPSBzdHJsZW4oaGlkLT5waHlzKSArIDE7CiAJCQlpZiAobGVuID4gX0lPQ19TSVpFKGNtZCkpCiAJCQkJbGVuID0gX0lPQ19TSVpFKGNtZCk7Ci0JCQlyZXR1cm4gY29weV90b191c2VyKHVzZXJfYXJnLCBoaWQtPnBoeXMsIGxlbikgPworCQkJciA9IGNvcHlfdG9fdXNlcih1c2VyX2FyZywgaGlkLT5waHlzLCBsZW4pID8KIAkJCQktRUZBVUxUIDogbGVuOworCQkJYnJlYWs7CiAJCX0KIAl9Ci0JcmV0dXJuIC1FSU5WQUw7CisKK3JldF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZoaWRkZXYtPmV4aXN0YW5jZWxvY2spOworCXJldHVybiByOwogfQogCiAjaWZkZWYgQ09ORklHX0NPTVBBVApAQCAtODkyLDcgKzkwNSw3IEBACiAJaGlkZGV2LT5leGlzdCA9IDE7CiAJcmV0dmFsID0gdXNiX3JlZ2lzdGVyX2Rldih1c2JoaWQtPmludGYsICZoaWRkZXZfY2xhc3MpOwogCWlmIChyZXR2YWwpIHsKLQkJZXJyX2hpZCgiTm90IGFibGUgdG8gZ2V0IGEgbWlub3IgZm9yIHRoaXMgZGV2aWNlLiIpOworCQloaWRfZXJyKGhpZCwgIk5vdCBhYmxlIHRvIGdldCBhIG1pbm9yIGZvciB0aGlzIGRldmljZVxuIik7CiAJCWhpZC0+aGlkZGV2ID0gTlVMTDsKIAkJa2ZyZWUoaGlkZGV2KTsKIAkJcmV0dXJuIC0xOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvdXNiaGlkL3VzYmhpZC5oIGIvZHJpdmVycy9oaWQvdXNiaGlkL3VzYmhpZC5oCmluZGV4IDg5ZDJlODQuLjE2NzNjYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL3VzYmhpZC91c2JoaWQuaAorKysgYi9kcml2ZXJzL2hpZC91c2JoaWQvdXNiaGlkLmgKQEAgLTk1LDcgKzk1LDYgQEAKIAl1bnNpZ25lZCBsb25nIHN0b3BfcmV0cnk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGltZSB0byBnaXZlIHVwLCBpbiBqaWZmaWVzICovCiAJdW5zaWduZWQgaW50IHJldHJ5X2RlbGF5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGxlbmd0aCBpbiBtcyAqLwogCXN0cnVjdCB3b3JrX3N0cnVjdCByZXNldF93b3JrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUYXNrIGNvbnRleHQgZm9yIHJlc2V0cyAqLwotCXN0cnVjdCB3b3JrX3N0cnVjdCByZXN0YXJ0X3dvcms7CQkJCS8qIHdha2luZyB1cCBmb3Igb3V0cHV0IHRvIGJlIGRvbmUgaW4gYSB0YXNrICovCiAJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsJCQkJCQkvKiBGb3Igc2xlZXBpbmcgKi8KIAlpbnQgbGVkY291bnQ7CQkJCQkJCS8qIGNvdW50aW5nIHRoZSBudW1iZXIgb2YgYWN0aXZlIGxlZHMgKi8KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC91c2JoaWQvdXNia2JkLmMgYi9kcml2ZXJzL2hpZC91c2JoaWQvdXNia2JkLmMKaW5kZXggYTk0ODYwNS4uMDY1ODE3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvdXNiaGlkL3VzYmtiZC5jCisrKyBiL2RyaXZlcnMvaGlkL3VzYmhpZC91c2JrYmQuYwpAQCAtMjQsNiArMjQsOCBAQAogICogVm9qdGVjaCBQYXZsaWssIFNpbXVua292YSAxNTk0LCBQcmFndWUgOCwgMTgyIDAwIEN6ZWNoIFJlcHVibGljCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMTA0LDE2ICsxMDYsMTggQEAKIAkJCWlmICh1c2Jfa2JkX2tleWNvZGVba2JkLT5vbGRbaV1dKQogCQkJCWlucHV0X3JlcG9ydF9rZXkoa2JkLT5kZXYsIHVzYl9rYmRfa2V5Y29kZVtrYmQtPm9sZFtpXV0sIDApOwogCQkJZWxzZQotCQkJCWRldl9pbmZvKCZ1cmItPmRldi0+ZGV2LAotCQkJCQkJIlVua25vd24ga2V5IChzY2FuY29kZSAlI3gpIHJlbGVhc2VkLlxuIiwga2JkLT5vbGRbaV0pOworCQkJCWhpZF9pbmZvKHVyYi0+ZGV2LAorCQkJCQkgIlVua25vd24ga2V5IChzY2FuY29kZSAlI3gpIHJlbGVhc2VkLlxuIiwKKwkJCQkJIGtiZC0+b2xkW2ldKTsKIAkJfQogCiAJCWlmIChrYmQtPm5ld1tpXSA+IDMgJiYgbWVtc2NhbihrYmQtPm9sZCArIDIsIGtiZC0+bmV3W2ldLCA2KSA9PSBrYmQtPm9sZCArIDgpIHsKIAkJCWlmICh1c2Jfa2JkX2tleWNvZGVba2JkLT5uZXdbaV1dKQogCQkJCWlucHV0X3JlcG9ydF9rZXkoa2JkLT5kZXYsIHVzYl9rYmRfa2V5Y29kZVtrYmQtPm5ld1tpXV0sIDEpOwogCQkJZWxzZQotCQkJCWRldl9pbmZvKCZ1cmItPmRldi0+ZGV2LAotCQkJCQkJIlVua25vd24ga2V5IChzY2FuY29kZSAlI3gpIHJlbGVhc2VkLlxuIiwga2JkLT5uZXdbaV0pOworCQkJCWhpZF9pbmZvKHVyYi0+ZGV2LAorCQkJCQkgIlVua25vd24ga2V5IChzY2FuY29kZSAlI3gpIHJlbGVhc2VkLlxuIiwKKwkJCQkJIGtiZC0+bmV3W2ldKTsKIAkJfQogCX0KIApAQCAtMTI0LDkgKzEyOCw5IEBACiByZXN1Ym1pdDoKIAlpID0gdXNiX3N1Ym1pdF91cmIgKHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKGkpCi0JCWVycl9oaWQgKCJjYW4ndCByZXN1Ym1pdCBpbnRyLCAlcy0lcy9pbnB1dDAsIHN0YXR1cyAlZCIsCi0JCQkJa2JkLT51c2JkZXYtPmJ1cy0+YnVzX25hbWUsCi0JCQkJa2JkLT51c2JkZXYtPmRldnBhdGgsIGkpOworCQloaWRfZXJyKHVyYi0+ZGV2LCAiY2FuJ3QgcmVzdWJtaXQgaW50ciwgJXMtJXMvaW5wdXQwLCBzdGF0dXMgJWQiLAorCQkJa2JkLT51c2JkZXYtPmJ1cy0+YnVzX25hbWUsCisJCQlrYmQtPnVzYmRldi0+ZGV2cGF0aCwgaSk7CiB9CiAKIHN0YXRpYyBpbnQgdXNiX2tiZF9ldmVudChzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIHVuc2lnbmVkIGludCB0eXBlLApAQCAtMTUwLDcgKzE1NCw3IEBACiAJKihrYmQtPmxlZHMpID0ga2JkLT5uZXdsZWRzOwogCWtiZC0+bGVkLT5kZXYgPSBrYmQtPnVzYmRldjsKIAlpZiAodXNiX3N1Ym1pdF91cmIoa2JkLT5sZWQsIEdGUF9BVE9NSUMpKQotCQllcnJfaGlkKCJ1c2Jfc3VibWl0X3VyYihsZWRzKSBmYWlsZWQiKTsKKwkJcHJfZXJyKCJ1c2Jfc3VibWl0X3VyYihsZWRzKSBmYWlsZWRcbiIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNjAsNyArMTY0LDcgQEAKIAlzdHJ1Y3QgdXNiX2tiZCAqa2JkID0gdXJiLT5jb250ZXh0OwogCiAJaWYgKHVyYi0+c3RhdHVzKQotCQlkZXZfd2FybigmdXJiLT5kZXYtPmRldiwgImxlZCB1cmIgc3RhdHVzICVkIHJlY2VpdmVkXG4iLAorCQloaWRfd2Fybih1cmItPmRldiwgImxlZCB1cmIgc3RhdHVzICVkIHJlY2VpdmVkXG4iLAogCQkJIHVyYi0+c3RhdHVzKTsKIAogCWlmICgqKGtiZC0+bGVkcykgPT0ga2JkLT5uZXdsZWRzKQpAQCAtMTY5LDcgKzE3Myw3IEBACiAJKihrYmQtPmxlZHMpID0ga2JkLT5uZXdsZWRzOwogCWtiZC0+bGVkLT5kZXYgPSBrYmQtPnVzYmRldjsKIAlpZiAodXNiX3N1Ym1pdF91cmIoa2JkLT5sZWQsIEdGUF9BVE9NSUMpKQotCQllcnJfaGlkKCJ1c2Jfc3VibWl0X3VyYihsZWRzKSBmYWlsZWQiKTsKKwkJaGlkX2Vycih1cmItPmRldiwgInVzYl9zdWJtaXRfdXJiKGxlZHMpIGZhaWxlZFxuIik7CiB9CiAKIHN0YXRpYyBpbnQgdXNiX2tiZF9vcGVuKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vS2NvbmZpZyBiL2RyaXZlcnMvaHdtb24vS2NvbmZpZwppbmRleCBhNTZmNmFkLi5iZGMxM2QyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL0tjb25maWcKKysrIGIvZHJpdmVycy9od21vbi9LY29uZmlnCkBAIC0yNzQsNiArMjc0LDE2IEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBhdHhwMS4KIAorY29uZmlnIFNFTlNPUlNfRFM2MjAKKwl0cmlzdGF0ZSAiRGFsbGFzIFNlbWljb25kdWN0b3IgRFM2MjAiCisJZGVwZW5kcyBvbiBJMkMKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgRGFsbGFzIFNlbWljb25kdWN0b3IKKwkgIERTNjIwIHNlbnNvciBjaGlwLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBkczYyMC4KKwogY29uZmlnIFNFTlNPUlNfRFMxNjIxCiAJdHJpc3RhdGUgIkRhbGxhcyBTZW1pY29uZHVjdG9yIERTMTYyMSBhbmQgRFMxNjI1IgogCWRlcGVuZHMgb24gSTJDCkBAIC03MzQsNiArNzQ0LDE2IEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBzaHQxNS4KIAorY29uZmlnIFNFTlNPUlNfU0hUMjEKKwl0cmlzdGF0ZSAiU2Vuc2lyb24gaHVtaWRpdHkgYW5kIHRlbXBlcmF0dXJlIHNlbnNvcnMuIFNIVDIxIGFuZCBjb21wYXQuIgorCWRlcGVuZHMgb24gSTJDCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBTZW5zaXJvbiBTSFQyMSwgU0hUMjUKKwkgIGh1bWlkaXR5IGFuZCB0ZW1wZXJhdHVyZSBzZW5zb3JzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzaHQyMS4KKwogY29uZmlnIFNFTlNPUlNfUzNDCiAJdHJpc3RhdGUgIlNhbXN1bmcgYnVpbHQtaW4gQURDIgogCWRlcGVuZHMgb24gUzNDX0FEQwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9NYWtlZmlsZSBiL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUKaW5kZXggMjQ3OWIzZC4uZGRlMDJkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCkBAIC00MSw2ICs0MSw3IEBACiBvYmotJChDT05GSUdfU0VOU09SU19DT1JFVEVNUCkJKz0gY29yZXRlbXAubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfUEtHVEVNUCkJKz0gcGtndGVtcC5vCiBvYmotJChDT05GSUdfU0VOU09SU19ETUUxNzM3KQkrPSBkbWUxNzM3Lm8KK29iai0kKENPTkZJR19TRU5TT1JTX0RTNjIwKQkrPSBkczYyMC5vCiBvYmotJChDT05GSUdfU0VOU09SU19EUzE2MjEpCSs9IGRzMTYyMS5vCiBvYmotJChDT05GSUdfU0VOU09SU19FTUMxNDAzKQkrPSBlbWMxNDAzLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0VNQzIxMDMpCSs9IGVtYzIxMDMubwpAQCAtOTAsNiArOTEsNyBAQAogb2JqLSQoQ09ORklHX1NFTlNPUlNfUENGODU5MSkJKz0gcGNmODU5MS5vCiBvYmotJChDT05GSUdfU0VOU09SU19TM0MpCSs9IHMzYy1od21vbi5vCiBvYmotJChDT05GSUdfU0VOU09SU19TSFQxNSkJKz0gc2h0MTUubworb2JqLSQoQ09ORklHX1NFTlNPUlNfU0hUMjEpCSs9IHNodDIxLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX1NJUzU1OTUpCSs9IHNpczU1OTUubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfU01NNjY1KQkrPSBzbW02NjUubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NykrPSBzbXNjNDdiMzk3Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vYWJpdHVndXJ1LmMgYi9kcml2ZXJzL2h3bW9uL2FiaXR1Z3VydS5jCmluZGV4IDAzNjk0Y2MuLjhmMDdhOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYWJpdHVndXJ1LmMKKysrIGIvZHJpdmVycy9od21vbi9hYml0dWd1cnUuYwpAQCAtMjAsNiArMjAsOSBAQAogICAgIHRoZSBjdXN0b20gQWJpdCB1R3VydSBjaGlwIGZvdW5kIG9uIEFiaXQgdUd1cnUgbW90aGVyYm9hcmRzLiBOb3RlOiBiZWNhdXNlCiAgICAgb2YgbGFjayBvZiBzcGVjcyB0aGUgQ1BVL1JBTSB2b2x0YWdlICYgZnJlcXVlbmN5IGNvbnRyb2wgaXMgbm90IHN1cHBvcnRlZCEKICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMjIwLDYgKzIyMywxMCBAQAogCXU4IHB3bV9zZXR0aW5nc1tBQklUX1VHVVJVX01BWF9QV01TXVs1XTsKIH07CiAKK3N0YXRpYyBjb25zdCBjaGFyICpuZXZlcl9oYXBwZW4gPSAiVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiI7CitzdGF0aWMgY29uc3QgY2hhciAqcmVwb3J0X3RoaXMgPQorCSJQbGVhc2UgcmVwb3J0IHRoaXMgdG8gdGhlIGFiaXR1Z3VydSBtYWludGFpbmVyIChzZWUgTUFJTlRBSU5FUlMpIjsKKwogLyogd2FpdCB0aWxsIHRoZSB1Z3VydSBpcyBpbiB0aGUgc3BlY2lmaWVkIHN0YXRlICovCiBzdGF0aWMgaW50IGFiaXR1Z3VydV93YWl0KHN0cnVjdCBhYml0dWd1cnVfZGF0YSAqZGF0YSwgdTggc3RhdGUpCiB7CkBAIC00MzgsOCArNDQ1LDcgQEAKIAogCS8qIFRlc3QgdmFsIGlzIHNhbmUgLyB1c2FibGUgZm9yIHNlbnNvciB0eXBlIGRldGVjdGlvbi4gKi8KIAlpZiAoKHZhbCA8IDEwdSkgfHwgKHZhbCA+IDI1MHUpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgQUJJVF9VR1VSVV9OQU1FCi0JCQkiOiBiYW5rMS1zZW5zb3I6ICVkIHJlYWRpbmcgKCVkKSB0b28gY2xvc2UgdG8gbGltaXRzLCAiCisJCXByX3dhcm4oImJhbmsxLXNlbnNvcjogJWQgcmVhZGluZyAoJWQpIHRvbyBjbG9zZSB0byBsaW1pdHMsICIKIAkJCSJ1bmFibGUgdG8gZGV0ZXJtaW5lIHNlbnNvciB0eXBlLCBza2lwcGluZyBzZW5zb3JcbiIsCiAJCQkoaW50KXNlbnNvcl9hZGRyLCAoaW50KXZhbCk7CiAJCS8qIGFzc3VtZSBubyBzZW5zb3IgaXMgdGhlcmUgZm9yIHNlbnNvcnMgZm9yIHdoaWNoIHdlIGNhbid0CkBAIC01MzUsMTAgKzU0MSw4IEBACiAJCQkJMykgPT0gMykKIAkJCWJyZWFrOwogCWlmIChpID09IDMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIEFCSVRfVUdVUlVfTkFNRQotCQkJIjogRmF0YWwgZXJyb3IgY291bGQgbm90IHJlc3RvcmUgb3JpZ2luYWwgc2V0dGluZ3MuICIKLQkJCSJUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gcGxlYXNlIHJlcG9ydCB0aGlzIHRvIHRoZSAiCi0JCQkiYWJpdHVndXJ1IG1haW50YWluZXIgKHNlZSBNQUlOVEFJTkVSUylcbiIpOworCQlwcl9lcnIoIkZhdGFsIGVycm9yIGNvdWxkIG5vdCByZXN0b3JlIG9yaWdpbmFsIHNldHRpbmdzLiAlcyAlc1xuIiwKKwkJICAgICAgIG5ldmVyX2hhcHBlbiwgcmVwb3J0X3RoaXMpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJcmV0dXJuIHJldDsKQEAgLTEyNjgsMTQgKzEyNzIsMTIgQEAKIAl9CiAJLyogRmFpbCBzYWZlIGNoZWNrLCB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4hICovCiAJaWYgKHN5c2ZzX25hbWVzX2ZyZWUgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBBQklUX1VHVVJVX05BTUUgIjogRmF0YWwgZXJyb3IgcmFuIG91dCBvZiAiCi0JCSAgICAgICAic3BhY2UgZm9yIHN5c2ZzIGF0dHIgbmFtZXMuIFRoaXMgc2hvdWxkIG5ldmVyICIKLQkJICAgICAgICJoYXBwZW4gcGxlYXNlIHJlcG9ydCB0byB0aGUgYWJpdHVndXJ1IG1haW50YWluZXIgIgotCQkgICAgICAgIihzZWUgTUFJTlRBSU5FUlMpXG4iKTsKKwkJcHJfZXJyKCJGYXRhbCBlcnJvciByYW4gb3V0IG9mIHNwYWNlIGZvciBzeXNmcyBhdHRyIG5hbWVzLiAlcyAlcyIsCisJCSAgICAgICBuZXZlcl9oYXBwZW4sIHJlcG9ydF90aGlzKTsKIAkJcmVzID0gLUVOQU1FVE9PTE9ORzsKIAkJZ290byBhYml0dWd1cnVfcHJvYmVfZXJyb3I7CiAJfQotCXByaW50ayhLRVJOX0lORk8gQUJJVF9VR1VSVV9OQU1FICI6IGZvdW5kIEFiaXQgdUd1cnVcbiIpOworCXByX2luZm8oImZvdW5kIEFiaXQgdUd1cnVcbiIpOwogCiAJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KIAlmb3IgKGkgPSAwOyBpIDwgc3lzZnNfYXR0cl9pOyBpKyspCkBAIC0xNDMyLDggKzE0MzQsNyBAQAogCQkiMHglMDJYXG4iLCAodW5zaWduZWQgaW50KWRhdGFfdmFsLCAodW5zaWduZWQgaW50KWNtZF92YWwpOwogCiAJaWYgKGZvcmNlKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gQUJJVF9VR1VSVV9OQU1FICI6IEFzc3VtaW5nIEFiaXQgdUd1cnUgaXMgIgotCQkJCSJwcmVzZW50IGJlY2F1c2Ugb2YgXCJmb3JjZVwiIHBhcmFtZXRlclxuIik7CisJCXByX2luZm8oIkFzc3VtaW5nIEFiaXQgdUd1cnUgaXMgcHJlc2VudCBiZWNhdXNlIG9mIFwiZm9yY2VcIiBwYXJhbWV0ZXJcbiIpOwogCQlyZXR1cm4gQUJJVF9VR1VSVV9CQVNFOwogCX0KIApAQCAtMTQ2Nyw4ICsxNDY4LDcgQEAKIAogCWFiaXR1Z3VydV9wZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKEFCSVRfVUdVUlVfTkFNRSwgYWRkcmVzcyk7CiAJaWYgKCFhYml0dWd1cnVfcGRldikgewotCQlwcmludGsoS0VSTl9FUlIgQUJJVF9VR1VSVV9OQU1FCi0JCQkiOiBEZXZpY2UgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlwcl9lcnIoIkRldmljZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZXhpdF9kcml2ZXJfdW5yZWdpc3RlcjsKIAl9CkBAIC0xNDc5LDE1ICsxNDc5LDEzIEBACiAKIAllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX3Jlc291cmNlcyhhYml0dWd1cnVfcGRldiwgJnJlcywgMSk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgQUJJVF9VR1VSVV9OQU1FCi0JCQkiOiBEZXZpY2UgcmVzb3VyY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsIGVycik7CisJCXByX2VycigiRGV2aWNlIHJlc291cmNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwogCQlnb3RvIGV4aXRfZGV2aWNlX3B1dDsKIAl9CiAKIAllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKGFiaXR1Z3VydV9wZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBBQklUX1VHVVJVX05BTUUKLQkJCSI6IERldmljZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKKwkJcHJfZXJyKCJEZXZpY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsIGVycik7CiAJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hYml0dWd1cnUzLmMgYi9kcml2ZXJzL2h3bW9uL2FiaXR1Z3VydTMuYwppbmRleCAzY2YyOGFmLi40OGQyMWUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2FiaXR1Z3VydTMuYworKysgYi9kcml2ZXJzL2h3bW9uL2FiaXR1Z3VydTMuYwpAQCAtMjMsNiArMjMsOSBAQAogICAgIGNoaXAgZm91bmQgb24gbmV3ZXIgQWJpdCB1R3VydSBtb3RoZXJib2FyZHMuIE5vdGU6IGJlY2F1c2Ugb2YgbGFjayBvZiBzcGVjcwogICAgIG9ubHkgcmVhZGluZyB0aGUgc2Vuc29ycyBhbmQgdGhlaXIgc2V0dGluZ3MgaXMgc3VwcG9ydGVkLgogKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTYwOCw2ICs2MTEsOSBAQAogbW9kdWxlX3BhcmFtKHZlcmJvc2UsIGJvb2wsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyh2ZXJib3NlLCAiRW5hYmxlL2Rpc2FibGUgdmVyYm9zZSBlcnJvciByZXBvcnRpbmciKTsKIAorc3RhdGljIGNvbnN0IGNoYXIgKm5ldmVyX2hhcHBlbiA9ICJUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uIjsKK3N0YXRpYyBjb25zdCBjaGFyICpyZXBvcnRfdGhpcyA9CisJIlBsZWFzZSByZXBvcnQgdGhpcyB0byB0aGUgYWJpdHVndXJ1MyBtYWludGFpbmVyIChzZWUgTUFJTlRBSU5FUlMpIjsKIAogLyogd2FpdCB3aGlsZSB0aGUgdWd1cnUgaXMgYnVzeSAodXN1YWxseSBhZnRlciBhIHdyaXRlKSAqLwogc3RhdGljIGludCBhYml0dWd1cnUzX3dhaXRfd2hpbGVfYnVzeShzdHJ1Y3QgYWJpdHVndXJ1M19kYXRhICpkYXRhKQpAQCAtOTQwLDE1ICs5NDYsMTMgQEAKIAkJaWYgKGFiaXR1Z3VydTNfbW90aGVyYm9hcmRzW2ldLmlkID09IGlkKQogCQkJYnJlYWs7CiAJaWYgKCFhYml0dWd1cnUzX21vdGhlcmJvYXJkc1tpXS5pZCkgewotCQlwcmludGsoS0VSTl9FUlIgQUJJVF9VR1VSVTNfTkFNRSAiOiBlcnJvciB1bmtub3duIG1vdGhlcmJvYXJkICIKLQkJCSJJRDogJTA0WC4gUGxlYXNlIHJlcG9ydCB0aGlzIHRvIHRoZSBhYml0dWd1cnUzICIKLQkJCSJtYWludGFpbmVyIChzZWUgTUFJTlRBSU5FUlMpXG4iLCAodW5zaWduZWQgaW50KWlkKTsKKwkJcHJfZXJyKCJlcnJvciB1bmtub3duIG1vdGhlcmJvYXJkIElEOiAlMDRYLiAlc1xuIiwKKwkJICAgICAgICh1bnNpZ25lZCBpbnQpaWQsIHJlcG9ydF90aGlzKTsKIAkJZ290byBhYml0dWd1cnUzX3Byb2JlX2Vycm9yOwogCX0KIAlkYXRhLT5zZW5zb3JzID0gYWJpdHVndXJ1M19tb3RoZXJib2FyZHNbaV0uc2Vuc29yczsKIAotCXByaW50ayhLRVJOX0lORk8gQUJJVF9VR1VSVTNfTkFNRSAiOiBmb3VuZCBBYml0IHVHdXJ1MywgbW90aGVyYm9hcmQgIgotCQkiSUQ6ICUwNFhcbiIsICh1bnNpZ25lZCBpbnQpaWQpOworCXByX2luZm8oImZvdW5kIEFiaXQgdUd1cnUzLCBtb3RoZXJib2FyZCBJRDogJTA0WFxuIiwgKHVuc2lnbmVkIGludClpZCk7CiAKIAkvKiBGaWxsIHRoZSBzeXNmcyBhdHRyIGFycmF5ICovCiAJc3lzZnNfYXR0cl9pID0gMDsKQEAgLTk1NywxMSArOTYxLDggQEAKIAlmb3IgKGkgPSAwOyBkYXRhLT5zZW5zb3JzW2ldLm5hbWU7IGkrKykgewogCQkvKiBGYWlsIHNhZmUgY2hlY2ssIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEgKi8KIAkJaWYgKGkgPj0gQUJJVF9VR1VSVTNfTUFYX05PX1NFTlNPUlMpIHsKLQkJCXByaW50ayhLRVJOX0VSUiBBQklUX1VHVVJVM19OQU1FCi0JCQkJIjogRmF0YWwgZXJyb3IgbW90aGVyYm9hcmQgaGFzIG1vcmUgc2Vuc29ycyAiCi0JCQkJInRoZW4gQUJJVF9VR1VSVTNfTUFYX05PX1NFTlNPUlMuIFRoaXMgc2hvdWxkICIKLQkJCQkibmV2ZXIgaGFwcGVuIHBsZWFzZSByZXBvcnQgdG8gdGhlIGFiaXR1Z3VydTMgIgotCQkJCSJtYWludGFpbmVyIChzZWUgTUFJTlRBSU5FUlMpXG4iKTsKKwkJCXByX2VycigiRmF0YWwgZXJyb3IgbW90aGVyYm9hcmQgaGFzIG1vcmUgc2Vuc29ycyB0aGVuIEFCSVRfVUdVUlUzX01BWF9OT19TRU5TT1JTLiAlcyAlc1xuIiwKKwkJCSAgICAgICBuZXZlcl9oYXBwZW4sIHJlcG9ydF90aGlzKTsKIAkJCXJlcyA9IC1FTkFNRVRPT0xPTkc7CiAJCQlnb3RvIGFiaXR1Z3VydTNfcHJvYmVfZXJyb3I7CiAJCX0KQEAgLTk4MywxMCArOTg0LDggQEAKIAl9CiAJLyogRmFpbCBzYWZlIGNoZWNrLCB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4hICovCiAJaWYgKHN5c2ZzX25hbWVzX2ZyZWUgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBBQklUX1VHVVJVM19OQU1FCi0JCQkiOiBGYXRhbCBlcnJvciByYW4gb3V0IG9mIHNwYWNlIGZvciBzeXNmcyBhdHRyIG5hbWVzLiAiCi0JCQkiVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIHBsZWFzZSByZXBvcnQgdG8gdGhlICIKLQkJCSJhYml0dWd1cnUzIG1haW50YWluZXIgKHNlZSBNQUlOVEFJTkVSUylcbiIpOworCQlwcl9lcnIoIkZhdGFsIGVycm9yIHJhbiBvdXQgb2Ygc3BhY2UgZm9yIHN5c2ZzIGF0dHIgbmFtZXMuICVzICVzXG4iLAorCQkgICAgICAgbmV2ZXJfaGFwcGVuLCByZXBvcnRfdGhpcyk7CiAJCXJlcyA9IC1FTkFNRVRPT0xPTkc7CiAJCWdvdG8gYWJpdHVndXJ1M19wcm9iZV9lcnJvcjsKIAl9CkBAIC0xMTg5LDggKzExODgsNyBAQAogCQkiMHglMDJYXG4iLCAodW5zaWduZWQgaW50KWRhdGFfdmFsLCAodW5zaWduZWQgaW50KWNtZF92YWwpOwogCiAJaWYgKGZvcmNlKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gQUJJVF9VR1VSVTNfTkFNRSAiOiBBc3N1bWluZyBBYml0IHVHdXJ1MyBpcyAiCi0JCQkJInByZXNlbnQgYmVjYXVzZSBvZiBcImZvcmNlXCIgcGFyYW1ldGVyXG4iKTsKKwkJcHJfaW5mbygiQXNzdW1pbmcgQWJpdCB1R3VydTMgaXMgcHJlc2VudCBiZWNhdXNlIG9mIFwiZm9yY2VcIiBwYXJhbWV0ZXJcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTEyMTksMTAgKzEyMTcsOCBAQAogCQkJcmV0dXJuIGVycjsKIAogI2lmZGVmIENPTkZJR19ETUkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBBQklUX1VHVVJVM19OQU1FICI6IHRoaXMgbW90aGVyYm9hcmQgd2FzICIKLQkJCSJub3QgZGV0ZWN0ZWQgdXNpbmcgRE1JLiBQbGVhc2Ugc2VuZCB0aGUgb3V0cHV0IG9mICIKLQkJCSJcImRtaWRlY29kZVwiIHRvIHRoZSBhYml0dWd1cnUzIG1haW50YWluZXIgIgotCQkJIihzZWUgTUFJTlRBSU5FUlMpXG4iKTsKKwkJcHJfd2FybigidGhpcyBtb3RoZXJib2FyZCB3YXMgbm90IGRldGVjdGVkIHVzaW5nIERNSS4gIgorCQkJIlBsZWFzZSBzZW5kIHRoZSBvdXRwdXQgb2YgXCJkbWlkZWNvZGVcIiB0byB0aGUgYWJpdHVndXJ1MyBtYWludGFpbmVyIChzZWUgTUFJTlRBSU5FUlMpXG4iKTsKICNlbmRpZgogCX0KIApAQCAtMTIzMyw4ICsxMjI5LDcgQEAKIAlhYml0dWd1cnUzX3BkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoQUJJVF9VR1VSVTNfTkFNRSwKIAkJCQkJCUFCSVRfVUdVUlUzX0JBU0UpOwogCWlmICghYWJpdHVndXJ1M19wZGV2KSB7Ci0JCXByaW50ayhLRVJOX0VSUiBBQklUX1VHVVJVM19OQU1FCi0JCQkiOiBEZXZpY2UgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlwcl9lcnIoIkRldmljZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZXhpdF9kcml2ZXJfdW5yZWdpc3RlcjsKIAl9CkBAIC0xMjQ1LDE1ICsxMjQwLDEzIEBACiAKIAllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX3Jlc291cmNlcyhhYml0dWd1cnUzX3BkZXYsICZyZXMsIDEpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIEFCSVRfVUdVUlUzX05BTUUKLQkJCSI6IERldmljZSByZXNvdXJjZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKKwkJcHJfZXJyKCJEZXZpY2UgcmVzb3VyY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsIGVycik7CiAJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwogCX0KIAogCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGQoYWJpdHVndXJ1M19wZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBBQklUX1VHVVJVM19OQU1FCi0JCQkiOiBEZXZpY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsIGVycik7CisJCXByX2VycigiRGV2aWNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwogCQlnb3RvIGV4aXRfZGV2aWNlX3B1dDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vYWR0NzQ3MC5jIGIvZHJpdmVycy9od21vbi9hZHQ3NDcwLmMKaW5kZXggODdkOTJhNS4uYzZkMWNlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9hZHQ3NDcwLmMKKysrIGIvZHJpdmVycy9od21vbi9hZHQ3NDcwLmMKQEAgLTE5LDYgKzE5LDggQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CkBAIC0yNzQsNyArMjc2LDcgQEAKIAlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQURUNzQ3MF9SRUdfUFdNX0NGRygyKSwgcHdtX2NmZ1sxXSk7CiAKIAlpZiAocmVzKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaGEgaGEsIGludGVycnVwdGVkIik7CisJCXByX2VycigiaGEgaGEsIGludGVycnVwdGVkXG4iKTsKIAkJcmV0dXJuIC1FQUdBSU47CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2FwcGxlc21jLmMgYi9kcml2ZXJzL2h3bW9uL2FwcGxlc21jLmMKaW5kZXggYjY1OThhYS4uY2UwMzcyZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYXBwbGVzbWMuYworKysgYi9kcml2ZXJzL2h3bW9uL2FwcGxlc21jLmMKQEAgLTQsNiArNCw3IEBACiAgKiBjb21wdXRlcnMuCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA3IE5pY29sYXMgQm9pY2hhdCA8bmljb2xhc0Bib2ljaGF0LmNoPgorICogQ29weXJpZ2h0IChDKSAyMDEwIEhlbnJpayBSeWRiZXJnIDxyeWRiZXJnQGV1cm9tYWlsLnNlPgogICoKICAqIEJhc2VkIG9uIGhkYXBzLmMgZHJpdmVyOgogICogQ29weXJpZ2h0IChDKSAyMDA1IFJvYmVydCBMb3ZlIDxybWxAbm92ZWxsLmNvbT4KQEAgLTI2LDEwICsyNywxMyBAQAogICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC1wb2xsZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CkBAIC00OSw2ICs1Myw3IEBACiAKICNkZWZpbmUgQVBQTEVTTUNfTUFYX0RBVEFfTEVOR1RIIDMyCiAKKy8qIHdhaXQgdXAgdG8gMzIgbXMgZm9yIGEgc3RhdHVzIGNoYW5nZS4gKi8KICNkZWZpbmUgQVBQTEVTTUNfTUlOX1dBSVQJMHgwMDQwCiAjZGVmaW5lIEFQUExFU01DX01BWF9XQUlUCTB4ODAwMAogCkBAIC03MywxMDQgKzc4LDE1IEBACiAKICNkZWZpbmUgRkFOU19DT1VOVAkJIkZOdW0iIC8qIHItbyB1aTggKi8KICNkZWZpbmUgRkFOU19NQU5VQUwJCSJGUyEgIiAvKiByLXcgdWkxNiAqLwotI2RlZmluZSBGQU5fQUNUVUFMX1NQRUVECSJGMEFjIiAvKiByLW8gZnBlMiAoMiBieXRlcykgKi8KLSNkZWZpbmUgRkFOX01JTl9TUEVFRAkJIkYwTW4iIC8qIHItbyBmcGUyICgyIGJ5dGVzKSAqLwotI2RlZmluZSBGQU5fTUFYX1NQRUVECQkiRjBNeCIgLyogci1vIGZwZTIgKDIgYnl0ZXMpICovCi0jZGVmaW5lIEZBTl9TQUZFX1NQRUVECQkiRjBTZiIgLyogci1vIGZwZTIgKDIgYnl0ZXMpICovCi0jZGVmaW5lIEZBTl9UQVJHRVRfU1BFRUQJIkYwVGciIC8qIHItdyBmcGUyICgyIGJ5dGVzKSAqLwotI2RlZmluZSBGQU5fUE9TSVRJT04JCSJGMElEIiAvKiByLW8gY2hhclsxNl0gKi8KLQotLyoKLSAqIFRlbXBlcmF0dXJlIHNlbnNvcnMga2V5cyAoc3A3OCAtIDIgYnl0ZXMpLgotICovCi1zdGF0aWMgY29uc3QgY2hhciAqdGVtcGVyYXR1cmVfc2Vuc29yc19zZXRzW11bNDFdID0gewotLyogU2V0IDA6IE1hY2Jvb2sgUHJvICovCi0JeyAiVEEwUCIsICJUQjBUIiwgIlRDMEQiLCAiVEMwUCIsICJURzBIIiwgIlRHMFAiLCAiVEcwVCIsICJUaDBIIiwKLQkgICJUaDFIIiwgIlRtMFAiLCAiVHMwUCIsICJUczFQIiwgTlVMTCB9LAotLyogU2V0IDE6IE1hY2Jvb2syIHNldCAqLwotCXsgIlRCMFQiLCAiVEMwRCIsICJUQzBQIiwgIlRNMFAiLCAiVE4wUCIsICJUTjFQIiwgIlRURjAiLCAiVGgwSCIsCi0JICAiVGgwUyIsICJUaDFIIiwgTlVMTCB9LAotLyogU2V0IDI6IE1hY2Jvb2sgc2V0ICovCi0JeyAiVEIwVCIsICJUQzBEIiwgIlRDMFAiLCAiVE0wUCIsICJUTjBQIiwgIlROMVAiLCAiVGgwSCIsICJUaDBTIiwKLQkgICJUaDFIIiwgIlRzMFAiLCBOVUxMIH0sCi0vKiBTZXQgMzogTWFjbWluaSBzZXQgKi8KLQl7ICJUQzBEIiwgIlRDMFAiLCBOVUxMIH0sCi0vKiBTZXQgNDogTWFjIFBybyAoMiB4IFF1YWQtQ29yZSkgKi8KLQl7ICJUQTBQIiwgIlRDQUciLCAiVENBSCIsICJUQ0JHIiwgIlRDQkgiLCAiVEMwQyIsICJUQzBEIiwgIlRDMFAiLAotCSAgIlRDMUMiLCAiVEMxRCIsICJUQzJDIiwgIlRDMkQiLCAiVEMzQyIsICJUQzNEIiwgIlRIVEciLCAiVEgwUCIsCi0JICAiVEgxUCIsICJUSDJQIiwgIlRIM1AiLCAiVE1BUCIsICJUTUFTIiwgIlRNQlMiLCAiVE0wUCIsICJUTTBTIiwKLQkgICJUTTFQIiwgIlRNMVMiLCAiVE0yUCIsICJUTTJTIiwgIlRNM1MiLCAiVE04UCIsICJUTThTIiwgIlRNOVAiLAotCSAgIlRNOVMiLCAiVE4wSCIsICJUUzBDIiwgTlVMTCB9LAotLyogU2V0IDU6IGlNYWMgKi8KLQl7ICJUQzBEIiwgIlRBMFAiLCAiVEcwUCIsICJURzBEIiwgIlRHMEgiLCAiVEgwUCIsICJUbTBQIiwgIlRPMFAiLAotCSAgIlRwMEMiLCBOVUxMIH0sCi0vKiBTZXQgNjogTWFjYm9vazMgc2V0ICovCi0JeyAiVEIwVCIsICJUQzBEIiwgIlRDMFAiLCAiVE0wUCIsICJUTjBQIiwgIlRURjAiLCAiVFcwUCIsICJUaDBIIiwKLQkgICJUaDBTIiwgIlRoMUgiLCBOVUxMIH0sCi0vKiBTZXQgNzogTWFjYm9vayBBaXIgKi8KLQl7ICJUQjBUIiwgIlRCMVMiLCAiVEIxVCIsICJUQjJTIiwgIlRCMlQiLCAiVEMwRCIsICJUQzBQIiwgIlRDRlAiLAotCSAgIlRURjAiLCAiVFcwUCIsICJUaDBIIiwgIlRwMFAiLCAiVHBGUCIsICJUczBQIiwgIlRzMFMiLCBOVUxMIH0sCi0vKiBTZXQgODogTWFjYm9vayBQcm8gNCwxIChQZW5yeW4pICovCi0JeyAiVEIwVCIsICJUQzBEIiwgIlRDMFAiLCAiVEcwRCIsICJURzBIIiwgIlRURjAiLCAiVFcwUCIsICJUaDBIIiwKLQkgICJUaDFIIiwgIlRoMkgiLCAiVG0wUCIsICJUczBQIiwgTlVMTCB9LAotLyogU2V0IDk6IE1hY2Jvb2sgUHJvIDMsMSAoU2FudGEgUm9zYSkgKi8KLQl7ICJUQUxQIiwgIlRCMFQiLCAiVEMwRCIsICJUQzBQIiwgIlRHMEQiLCAiVEcwSCIsICJUVEYwIiwgIlRXMFAiLAotCSAgIlRoMEgiLCAiVGgxSCIsICJUaDJIIiwgIlRtMFAiLCAiVHMwUCIsIE5VTEwgfSwKLS8qIFNldCAxMDogaU1hYyA1LDEgKi8KLQl7ICJUQTBQIiwgIlRDMEQiLCAiVEMwUCIsICJURzBEIiwgIlRIMFAiLCAiVE8wUCIsICJUbTBQIiwgTlVMTCB9LAotLyogU2V0IDExOiBNYWNib29rIDUsMSAqLwotCXsgIlRCMFQiLCAiVEIxVCIsICJUQjJUIiwgIlRCM1QiLCAiVEMwRCIsICJUQzBQIiwgIlROMEQiLCAiVE4wUCIsCi0JICAiVFRGMCIsICJUaDBIIiwgIlRoMUgiLCAiVGhGSCIsICJUczBQIiwgIlRzMFMiLCBOVUxMIH0sCi0vKiBTZXQgMTI6IE1hY2Jvb2sgUHJvIDUsMSAqLwotCXsgIlRCMFQiLCAiVEIxVCIsICJUQjJUIiwgIlRCM1QiLCAiVEMwRCIsICJUQzBGIiwgIlRDMFAiLCAiVEcwRCIsCi0JICAiVEcwRiIsICJURzBIIiwgIlRHMFAiLCAiVEcwVCIsICJURzFIIiwgIlROMEQiLCAiVE4wUCIsICJUVEYwIiwKLQkgICJUaDJIIiwgIlRtMFAiLCAiVHMwUCIsICJUczBTIiwgTlVMTCB9LAotLyogU2V0IDEzOiBpTWFjIDgsMSAqLwotCXsgIlRBMFAiLCAiVEMwRCIsICJUQzBIIiwgIlRDMFAiLCAiVEcwRCIsICJURzBIIiwgIlRHMFAiLCAiVEgwUCIsCi0JICAiVEwwUCIsICJUTzBQIiwgIlRXMFAiLCAiVG0wUCIsICJUcDBQIiwgTlVMTCB9LAotLyogU2V0IDE0OiBpTWFjIDYsMSAqLwotCXsgIlRBMFAiLCAiVEMwRCIsICJUQzBIIiwgIlRDMFAiLCAiVEcwRCIsICJURzBIIiwgIlRHMFAiLCAiVEgwUCIsCi0JICAiVE8wUCIsICJUcDBQIiwgTlVMTCB9LAotLyogU2V0IDE1OiBNYWNCb29rIEFpciAyLDEgKi8KLQl7ICJUQjBUIiwgIlRCMVMiLCAiVEIxVCIsICJUQjJTIiwgIlRCMlQiLCAiVEMwRCIsICJUTjBEIiwgIlRURjAiLAotCSAgIlRWMFAiLCAiVFZGUCIsICJUVzBQIiwgIlRoMFAiLCAiVHAwUCIsICJUcDFQIiwgIlRwRlAiLCAiVHMwUCIsCi0JICAiVHMwUyIsIE5VTEwgfSwKLS8qIFNldCAxNjogTWFjIFBybyAzLDEgKDIgeCBRdWFkLUNvcmUpICovCi0JeyAiVEEwUCIsICJUQ0FHIiwgIlRDQUgiLCAiVENCRyIsICJUQ0JIIiwgIlRDMEMiLCAiVEMwRCIsICJUQzBQIiwKLQkgICJUQzFDIiwgIlRDMUQiLCAiVEMyQyIsICJUQzJEIiwgIlRDM0MiLCAiVEMzRCIsICJUSDBQIiwgIlRIMVAiLAotCSAgIlRIMlAiLCAiVEgzUCIsICJUTUFQIiwgIlRNQVMiLCAiVE1CUyIsICJUTTBQIiwgIlRNMFMiLCAiVE0xUCIsCi0JICAiVE0xUyIsICJUTTJQIiwgIlRNMlMiLCAiVE0zUyIsICJUTThQIiwgIlRNOFMiLCAiVE05UCIsICJUTTlTIiwKLQkgICJUTjBDIiwgIlROMEQiLCAiVE4wSCIsICJUUzBDIiwgIlRwMEMiLCAiVHAxQyIsICJUdjBTIiwgIlR2MVMiLAotCSAgTlVMTCB9LAotLyogU2V0IDE3OiBpTWFjIDksMSAqLwotCXsgIlRBMFAiLCAiVEMwRCIsICJUQzBIIiwgIlRDMFAiLCAiVEcwRCIsICJURzBIIiwgIlRIMFAiLCAiVEwwUCIsCi0JICAiVE4wRCIsICJUTjBIIiwgIlROMFAiLCAiVE8wUCIsICJUbTBQIiwgIlRwMFAiLCBOVUxMIH0sCi0vKiBTZXQgMTg6IE1hY0Jvb2sgUHJvIDIsMiAqLwotCXsgIlRCMFQiLCAiVEMwRCIsICJUQzBQIiwgIlRHMEgiLCAiVEcwUCIsICJURzBUIiwgIlRNMFAiLCAiVFRGMCIsCi0JICAiVGgwSCIsICJUaDFIIiwgIlRtMFAiLCAiVHMwUCIsIE5VTEwgfSwKLS8qIFNldCAxOTogTWFjYm9vayBQcm8gNSwzICovCi0JeyAiVEIwVCIsICJUQjFUIiwgIlRCMlQiLCAiVEIzVCIsICJUQzBEIiwgIlRDMEYiLCAiVEMwUCIsICJURzBEIiwKLQkgICJURzBGIiwgIlRHMEgiLCAiVEcwUCIsICJURzBUIiwgIlROMEQiLCAiVE4wUCIsICJUVEYwIiwgIlRoMkgiLAotCSAgIlRtMFAiLCAiVHMwUCIsICJUczBTIiwgTlVMTCB9LAotLyogU2V0IDIwOiBNYWNCb29rIFBybyA1LDQgKi8KLQl7ICJUQjBUIiwgIlRCMVQiLCAiVEIyVCIsICJUQjNUIiwgIlRDMEQiLCAiVEMwRiIsICJUQzBQIiwgIlROMEQiLAotCSAgIlROMFAiLCAiVFRGMCIsICJUaDJIIiwgIlRzMFAiLCAiVHMwUyIsIE5VTEwgfSwKLS8qIFNldCAyMTogTWFjQm9vayBQcm8gNiwyICovCi0JeyAiVEIwVCIsICJUQjFUIiwgIlRCMlQiLCAiVEMwQyIsICJUQzBEIiwgIlRDMFAiLCAiVEMxQyIsICJURzBEIiwKLQkgICJURzBQIiwgIlRHMFQiLCAiVE1DRCIsICJUUDBQIiwgIlRQQ0QiLCAiVGgxSCIsICJUaDJIIiwgIlRtMFAiLAotCSAgIlRzMFAiLCAiVHMwUyIsIE5VTEwgfSwKLS8qIFNldCAyMjogTWFjQm9vayBQcm8gNywxICovCi0JeyAiVEIwVCIsICJUQjFUIiwgIlRCMlQiLCAiVEMwRCIsICJUQzBQIiwgIlROMEQiLCAiVE4wUCIsICJUTjBTIiwKLQkgICJUTjFEIiwgIlROMUYiLCAiVE4xRyIsICJUTjFTIiwgIlRoMUgiLCAiVHMwUCIsICJUczBTIiwgTlVMTCB9LAotfTsKKyNkZWZpbmUgRkFOX0lEX0ZNVAkJIkYlZElEIiAvKiByLW8gY2hhclsxNl0gKi8KIAogLyogTGlzdCBvZiBrZXlzIHVzZWQgdG8gcmVhZC93cml0ZSBmYW4gc3BlZWRzICovCi1zdGF0aWMgY29uc3QgY2hhciogZmFuX3NwZWVkX2tleXNbXSA9IHsKLQlGQU5fQUNUVUFMX1NQRUVELAotCUZBTl9NSU5fU1BFRUQsCi0JRkFOX01BWF9TUEVFRCwKLQlGQU5fU0FGRV9TUEVFRCwKLQlGQU5fVEFSR0VUX1NQRUVECitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZmFuX3NwZWVkX2ZtdFtdID0geworCSJGJWRBYyIsCQkvKiBhY3R1YWwgc3BlZWQgKi8KKwkiRiVkTW4iLAkJLyogbWluaW11bSBzcGVlZCAocncpICovCisJIkYlZE14IiwJCS8qIG1heGltdW0gc3BlZWQgKi8KKwkiRiVkU2YiLAkJLyogc2FmZSBzcGVlZCAtIG5vdCBhbGwgbW9kZWxzICovCisJIkYlZFRnIiwJCS8qIHRhcmdldCBzcGVlZCAobWFudWFsOiBydykgKi8KIH07CiAKICNkZWZpbmUgSU5JVF9USU1FT1VUX01TRUNTCTUwMDAJLyogd2FpdCB1cCB0byA1cyBmb3IgZGV2aWNlIGluaXQgLi4uICovCkBAIC0xODQsMTQgKzEwMCw0OCBAQAogI2RlZmluZSBTRU5TT1JfWSAxCiAjZGVmaW5lIFNFTlNPUl9aIDIKIAotLyogU3RydWN0dXJlIHRvIGJlIHBhc3NlZCB0byBETUlfTUFUQ0ggZnVuY3Rpb24gKi8KLXN0cnVjdCBkbWlfbWF0Y2hfZGF0YSB7Ci0vKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGNvbXB1dGVyIGhhcyBhbiBhY2NlbGVyb21ldGVyLiAqLwotCWludCBhY2NlbGVyb21ldGVyOwotLyogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBjb21wdXRlciBoYXMgbGlnaHQgc2Vuc29ycyBhbmQga2V5Ym9hcmQgYmFja2xpZ2h0LiAqLwotCWludCBsaWdodDsKLS8qIEluZGljYXRlcyB3aGljaCB0ZW1wZXJhdHVyZSBzZW5zb3JzIHNldCB0byB1c2UuICovCi0JaW50IHRlbXBlcmF0dXJlX3NldDsKKyNkZWZpbmUgdG9faW5kZXgoYXR0cikgKHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXggJiAweGZmZmYpCisjZGVmaW5lIHRvX29wdGlvbihhdHRyKSAodG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleCA+PiAxNikKKworLyogRHluYW1pYyBkZXZpY2Ugbm9kZSBhdHRyaWJ1dGVzICovCitzdHJ1Y3QgYXBwbGVzbWNfZGV2X2F0dHIgeworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSBzZGE7CS8qIGh3bW9uIGF0dHJpYnV0ZXMgKi8KKwljaGFyIG5hbWVbMzJdOwkJCQkvKiByb29tIGZvciBub2RlIGZpbGUgbmFtZSAqLworfTsKKworLyogRHluYW1pYyBkZXZpY2Ugbm9kZSBncm91cCAqLworc3RydWN0IGFwcGxlc21jX25vZGVfZ3JvdXAgeworCWNoYXIgKmZvcm1hdDsJCQkJLyogZm9ybWF0IHN0cmluZyAqLworCXZvaWQgKnNob3c7CQkJCS8qIHNob3cgZnVuY3Rpb24gKi8KKwl2b2lkICpzdG9yZTsJCQkJLyogc3RvcmUgZnVuY3Rpb24gKi8KKwlpbnQgb3B0aW9uOwkJCQkvKiBmdW5jdGlvbiBhcmd1bWVudCAqLworCXN0cnVjdCBhcHBsZXNtY19kZXZfYXR0ciAqbm9kZXM7CS8qIGR5bmFtaWMgbm9kZSBhcnJheSAqLworfTsKKworLyogQXBwbGVTTUMgZW50cnkgLSBjYWNoZWQgcmVnaXN0ZXIgaW5mb3JtYXRpb24gKi8KK3N0cnVjdCBhcHBsZXNtY19lbnRyeSB7CisJY2hhciBrZXlbNV07CQkvKiBmb3VyLWxldHRlciBrZXkgY29kZSAqLworCXU4IHZhbGlkOwkJLyogc2V0IHdoZW4gZW50cnkgaXMgc3VjY2Vzc2Z1bGx5IHJlYWQgb25jZSAqLworCXU4IGxlbjsJCQkvKiBib3VuZGVkIGJ5IEFQUExFU01DX01BWF9EQVRBX0xFTkdUSCAqLworCWNoYXIgdHlwZVs1XTsJCS8qIGZvdXItbGV0dGVyIHR5cGUgY29kZSAqLworCXU4IGZsYWdzOwkJLyogMHgxMDogZnVuYzsgMHg0MDogd3JpdGU7IDB4ODA6IHJlYWQgKi8KK307CisKKy8qIFJlZ2lzdGVyIGxvb2t1cCBhbmQgcmVnaXN0ZXJzIGNvbW1vbiB0byBhbGwgU01DcyAqLworc3RhdGljIHN0cnVjdCBhcHBsZXNtY19yZWdpc3RlcnMgeworCXN0cnVjdCBtdXRleCBtdXRleDsJCS8qIHJlZ2lzdGVyIHJlYWQvd3JpdGUgbXV0ZXggKi8KKwl1bnNpZ25lZCBpbnQga2V5X2NvdW50OwkJLyogbnVtYmVyIG9mIFNNQyByZWdpc3RlcnMgKi8KKwl1bnNpZ25lZCBpbnQgZmFuX2NvdW50OwkJLyogbnVtYmVyIG9mIGZhbnMgKi8KKwl1bnNpZ25lZCBpbnQgdGVtcF9jb3VudDsJLyogbnVtYmVyIG9mIHRlbXBlcmF0dXJlIHJlZ2lzdGVycyAqLworCXVuc2lnbmVkIGludCB0ZW1wX2JlZ2luOwkvKiB0ZW1wZXJhdHVyZSBsb3dlciBpbmRleCBib3VuZCAqLworCXVuc2lnbmVkIGludCB0ZW1wX2VuZDsJCS8qIHRlbXBlcmF0dXJlIHVwcGVyIGluZGV4IGJvdW5kICovCisJaW50IG51bV9saWdodF9zZW5zb3JzOwkJLyogbnVtYmVyIG9mIGxpZ2h0IHNlbnNvcnMgKi8KKwlib29sIGhhc19hY2NlbGVyb21ldGVyOwkJLyogaGFzIG1vdGlvbiBzZW5zb3IgKi8KKwlib29sIGhhc19rZXlfYmFja2xpZ2h0OwkJLyogaGFzIGtleWJvYXJkIGJhY2tsaWdodCAqLworCWJvb2wgaW5pdF9jb21wbGV0ZTsJCS8qIHRydWUgd2hlbiBmdWxseSBpbml0aWFsaXplZCAqLworCXN0cnVjdCBhcHBsZXNtY19lbnRyeSAqY2FjaGU7CS8qIGNhY2hlZCBrZXkgZW50cmllcyAqLworfSBzbWNyZWcgPSB7CisJLm11dGV4ID0gX19NVVRFWF9JTklUSUFMSVpFUihzbWNyZWcubXV0ZXgpLAogfTsKIAogc3RhdGljIGNvbnN0IGludCBkZWJ1ZzsKQEAgLTIwMywyMCArMTUzLDYgQEAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CiBzdGF0aWMgc3RydWN0IGlucHV0X3BvbGxlZF9kZXYgKmFwcGxlc21jX2lkZXY7CiAKLS8qIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgY29tcHV0ZXIgaGFzIGFuIGFjY2VsZXJvbWV0ZXIuICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGFwcGxlc21jX2FjY2VsZXJvbWV0ZXI7Ci0KLS8qIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgY29tcHV0ZXIgaGFzIGxpZ2h0IHNlbnNvcnMgYW5kIGtleWJvYXJkIGJhY2tsaWdodC4gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgYXBwbGVzbWNfbGlnaHQ7Ci0KLS8qIFRoZSBudW1iZXIgb2YgZmFucyBoYW5kbGVkIGJ5IHRoZSBkcml2ZXIgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZmFuc19oYW5kbGVkOwotCi0vKiBJbmRpY2F0ZXMgd2hpY2ggdGVtcGVyYXR1cmUgc2Vuc29ycyBzZXQgdG8gdXNlLiAqLwotc3RhdGljIHVuc2lnbmVkIGludCBhcHBsZXNtY190ZW1wZXJhdHVyZV9zZXQ7Ci0KLXN0YXRpYyBERUZJTkVfTVVURVgoYXBwbGVzbWNfbG9jayk7Ci0KIC8qCiAgKiBMYXN0IGluZGV4IHdyaXR0ZW4gdG8ga2V5X2F0X2luZGV4IHN5c2ZzIGZpbGUsIGFuZCB2YWx1ZSB0byB1c2UgZm9yIGFsbCBvdGhlcgogICoga2V5X2F0X2luZGV4Xyogc3lzZnMgZmlsZXMuCkBAIC0yMzgsMTggKzE3NCwxMCBAQAogCiAJZm9yICh1cyA9IEFQUExFU01DX01JTl9XQUlUOyB1cyA8IEFQUExFU01DX01BWF9XQUlUOyB1cyA8PD0gMSkgewogCQl1ZGVsYXkodXMpOwotCQlpZiAoKGluYihBUFBMRVNNQ19DTURfUE9SVCkgJiBBUFBMRVNNQ19TVEFUVVNfTUFTSykgPT0gdmFsKSB7Ci0JCQlpZiAoZGVidWcpCi0JCQkJcHJpbnRrKEtFUk5fREVCVUcKLQkJCQkJIldhaXRlZCAlZCB1cyBmb3Igc3RhdHVzICV4XG4iLAotCQkJCQkyICogdXMgLSBBUFBMRVNNQ19NSU5fV0FJVCwgdmFsKTsKKwkJaWYgKChpbmIoQVBQTEVTTUNfQ01EX1BPUlQpICYgQVBQTEVTTUNfU1RBVFVTX01BU0spID09IHZhbCkKIAkJCXJldHVybiAwOwotCQl9CiAJfQogCi0JcHJpbnRrKEtFUk5fV0FSTklORyAiYXBwbGVzbWM6IHdhaXQgc3RhdHVzIGZhaWxlZDogJXggIT0gJXhcbiIsCi0JCQkJCQl2YWwsIGluYihBUFBMRVNNQ19DTURfUE9SVCkpOwotCiAJcmV0dXJuIC1FSU87CiB9CiAKQEAgLTI2NywxNTkgKzE5NSwyNDIgQEAKIAkJaWYgKChpbmIoQVBQTEVTTUNfQ01EX1BPUlQpICYgQVBQTEVTTUNfU1RBVFVTX01BU0spID09IDB4MGMpCiAJCQlyZXR1cm4gMDsKIAl9Ci0JcHJpbnRrKEtFUk5fV0FSTklORyAiYXBwbGVzbWM6IGNvbW1hbmQgZmFpbGVkOiAleCAtPiAleFxuIiwKLQkJY21kLCBpbmIoQVBQTEVTTUNfQ01EX1BPUlQpKTsKIAlyZXR1cm4gLUVJTzsKIH0KIAotLyoKLSAqIGFwcGxlc21jX3JlYWRfa2V5IC0gcmVhZHMgbGVuIGJ5dGVzIGZyb20gYSBnaXZlbiBrZXksIGFuZCBwdXQgdGhlbSBpbiBidWZmZXIuCi0gKiBSZXR1cm5zIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIG9uIGZhaWx1cmUuIENhbGxlcnMgbXVzdAotICogaG9sZCBhcHBsZXNtY19sb2NrLgotICovCi1zdGF0aWMgaW50IGFwcGxlc21jX3JlYWRfa2V5KGNvbnN0IGNoYXIqIGtleSwgdTgqIGJ1ZmZlciwgdTggbGVuKQorc3RhdGljIGludCBzZW5kX2FyZ3VtZW50KGNvbnN0IGNoYXIgKmtleSkKIHsKIAlpbnQgaTsKIAotCWlmIChsZW4gPiBBUFBMRVNNQ19NQVhfREFUQV9MRU5HVEgpIHsKLQkJcHJpbnRrKEtFUk5fRVJSCSJhcHBsZXNtY19yZWFkX2tleTogY2Fubm90IHJlYWQgbW9yZSB0aGFuICIKLQkJCQkJIiVkIGJ5dGVzXG4iLCBBUFBMRVNNQ19NQVhfREFUQV9MRU5HVEgpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoc2VuZF9jb21tYW5kKEFQUExFU01DX1JFQURfQ01EKSkKLQkJcmV0dXJuIC1FSU87Ci0KIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAJCW91dGIoa2V5W2ldLCBBUFBMRVNNQ19EQVRBX1BPUlQpOwogCQlpZiAoX193YWl0X3N0YXR1cygweDA0KSkKIAkJCXJldHVybiAtRUlPOwogCX0KLQlpZiAoZGVidWcpCi0JCXByaW50ayhLRVJOX0RFQlVHICI8JXMiLCBrZXkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWRfc21jKHU4IGNtZCwgY29uc3QgY2hhciAqa2V5LCB1OCAqYnVmZmVyLCB1OCBsZW4pCit7CisJaW50IGk7CisKKwlpZiAoc2VuZF9jb21tYW5kKGNtZCkgfHwgc2VuZF9hcmd1bWVudChrZXkpKSB7CisJCXByX3dhcm4oIiVzOiByZWFkIGFyZyBmYWlsXG4iLCBrZXkpOworCQlyZXR1cm4gLUVJTzsKKwl9CiAKIAlvdXRiKGxlbiwgQVBQTEVTTUNfREFUQV9QT1JUKTsKLQlpZiAoZGVidWcpCi0JCXByaW50ayhLRVJOX0RFQlVHICI+JXgiLCBsZW4pOwogCiAJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCWlmIChfX3dhaXRfc3RhdHVzKDB4MDUpKQorCQlpZiAoX193YWl0X3N0YXR1cygweDA1KSkgeworCQkJcHJfd2FybigiJXM6IHJlYWQgZGF0YSBmYWlsXG4iLCBrZXkpOwogCQkJcmV0dXJuIC1FSU87CisJCX0KIAkJYnVmZmVyW2ldID0gaW5iKEFQUExFU01DX0RBVEFfUE9SVCk7Ci0JCWlmIChkZWJ1ZykKLQkJCXByaW50ayhLRVJOX0RFQlVHICI8JXgiLCBidWZmZXJbaV0pOwogCX0KLQlpZiAoZGVidWcpCi0JCXByaW50ayhLRVJOX0RFQlVHICJcbiIpOwogCiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBhcHBsZXNtY193cml0ZV9rZXkgLSB3cml0ZXMgbGVuIGJ5dGVzIGZyb20gYnVmZmVyIHRvIGEgZ2l2ZW4ga2V5LgotICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJvciBvbiBmYWlsdXJlLiBDYWxsZXJzIG11c3QKLSAqIGhvbGQgYXBwbGVzbWNfbG9jay4KLSAqLwotc3RhdGljIGludCBhcHBsZXNtY193cml0ZV9rZXkoY29uc3QgY2hhcioga2V5LCB1OCogYnVmZmVyLCB1OCBsZW4pCitzdGF0aWMgaW50IHdyaXRlX3NtYyh1OCBjbWQsIGNvbnN0IGNoYXIgKmtleSwgY29uc3QgdTggKmJ1ZmZlciwgdTggbGVuKQogewogCWludCBpOwogCi0JaWYgKGxlbiA+IEFQUExFU01DX01BWF9EQVRBX0xFTkdUSCkgewotCQlwcmludGsoS0VSTl9FUlIJImFwcGxlc21jX3dyaXRlX2tleTogY2Fubm90IHdyaXRlIG1vcmUgdGhhbiAiCi0JCQkJCSIlZCBieXRlc1xuIiwgQVBQTEVTTUNfTUFYX0RBVEFfTEVOR1RIKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHNlbmRfY29tbWFuZChBUFBMRVNNQ19XUklURV9DTUQpKQorCWlmIChzZW5kX2NvbW1hbmQoY21kKSB8fCBzZW5kX2FyZ3VtZW50KGtleSkpIHsKKwkJcHJfd2FybigiJXM6IHdyaXRlIGFyZyBmYWlsXG4iLCBrZXkpOwogCQlyZXR1cm4gLUVJTzsKLQotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJb3V0YihrZXlbaV0sIEFQUExFU01DX0RBVEFfUE9SVCk7Ci0JCWlmIChfX3dhaXRfc3RhdHVzKDB4MDQpKQotCQkJcmV0dXJuIC1FSU87CiAJfQogCiAJb3V0YihsZW4sIEFQUExFU01DX0RBVEFfUE9SVCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJaWYgKF9fd2FpdF9zdGF0dXMoMHgwNCkpCisJCWlmIChfX3dhaXRfc3RhdHVzKDB4MDQpKSB7CisJCQlwcl93YXJuKCIlczogd3JpdGUgZGF0YSBmYWlsXG4iLCBrZXkpOwogCQkJcmV0dXJuIC1FSU87CisJCX0KIAkJb3V0YihidWZmZXJbaV0sIEFQUExFU01DX0RBVEFfUE9SVCk7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBhcHBsZXNtY19nZXRfa2V5X2F0X2luZGV4IC0gZ2V0IGtleSBhdCBpbmRleCwgYW5kIHB1dCB0aGUgcmVzdWx0IGluIGtleQotICogKGNoYXJbNl0pLiBSZXR1cm5zIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIG9uIGZhaWx1cmUuIENhbGxlcnMKLSAqIG11c3QgaG9sZCBhcHBsZXNtY19sb2NrLgotICovCi1zdGF0aWMgaW50IGFwcGxlc21jX2dldF9rZXlfYXRfaW5kZXgoaW50IGluZGV4LCBjaGFyKiBrZXkpCitzdGF0aWMgaW50IHJlYWRfcmVnaXN0ZXJfY291bnQodW5zaWduZWQgaW50ICpjb3VudCkKIHsKLQlpbnQgaTsKLQl1OCByZWFka2V5WzRdOwotCXJlYWRrZXlbMF0gPSBpbmRleCA+PiAyNDsKLQlyZWFka2V5WzFdID0gaW5kZXggPj4gMTY7Ci0JcmVhZGtleVsyXSA9IGluZGV4ID4+IDg7Ci0JcmVhZGtleVszXSA9IGluZGV4OworCV9fYmUzMiBiZTsKKwlpbnQgcmV0OwogCi0JaWYgKHNlbmRfY29tbWFuZChBUFBMRVNNQ19HRVRfS0VZX0JZX0lOREVYX0NNRCkpCi0JCXJldHVybiAtRUlPOworCXJldCA9IHJlYWRfc21jKEFQUExFU01DX1JFQURfQ01ELCBLRVlfQ09VTlRfS0VZLCAodTggKikmYmUsIDQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCW91dGIocmVhZGtleVtpXSwgQVBQTEVTTUNfREFUQV9QT1JUKTsKLQkJaWYgKF9fd2FpdF9zdGF0dXMoMHgwNCkpCi0JCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlvdXRiKDQsIEFQUExFU01DX0RBVEFfUE9SVCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCWlmIChfX3dhaXRfc3RhdHVzKDB4MDUpKQotCQkJcmV0dXJuIC1FSU87Ci0JCWtleVtpXSA9IGluYihBUFBMRVNNQ19EQVRBX1BPUlQpOwotCX0KLQlrZXlbNF0gPSAwOwotCisJKmNvdW50ID0gYmUzMl90b19jcHUoYmUpOwogCXJldHVybiAwOwogfQogCiAvKgotICogYXBwbGVzbWNfZ2V0X2tleV90eXBlIC0gZ2V0IGtleSB0eXBlLCBhbmQgcHV0IHRoZSByZXN1bHQgaW4gdHlwZSAoY2hhcls2XSkuCi0gKiBSZXR1cm5zIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIG9uIGZhaWx1cmUuIENhbGxlcnMgbXVzdAotICogaG9sZCBhcHBsZXNtY19sb2NrLgorICogU2VyaWFsaXplZCBJL08KKyAqCisgKiBSZXR1cm5zIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIG9uIGZhaWx1cmUuCisgKiBBbGwgZnVuY3Rpb25zIGJlbG93IGFyZSBjb25jdXJyZW5jeSBzYWZlIC0gY2FsbGVycyBzaG91bGQgTk9UIGhvbGQgbG9jay4KICAqLwotc3RhdGljIGludCBhcHBsZXNtY19nZXRfa2V5X3R5cGUoY2hhcioga2V5LCBjaGFyKiB0eXBlKQorCitzdGF0aWMgaW50IGFwcGxlc21jX3JlYWRfZW50cnkoY29uc3Qgc3RydWN0IGFwcGxlc21jX2VudHJ5ICplbnRyeSwKKwkJCSAgICAgICB1OCAqYnVmLCB1OCBsZW4pCiB7Ci0JaW50IGk7CisJaW50IHJldDsKIAotCWlmIChzZW5kX2NvbW1hbmQoQVBQTEVTTUNfR0VUX0tFWV9UWVBFX0NNRCkpCi0JCXJldHVybiAtRUlPOworCWlmIChlbnRyeS0+bGVuICE9IGxlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJbXV0ZXhfbG9jaygmc21jcmVnLm11dGV4KTsKKwlyZXQgPSByZWFkX3NtYyhBUFBMRVNNQ19SRUFEX0NNRCwgZW50cnktPmtleSwgYnVmLCBsZW4pOworCW11dGV4X3VubG9jaygmc21jcmVnLm11dGV4KTsKIAotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJb3V0YihrZXlbaV0sIEFQUExFU01DX0RBVEFfUE9SVCk7Ci0JCWlmIChfX3dhaXRfc3RhdHVzKDB4MDQpKQotCQkJcmV0dXJuIC1FSU87CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhcHBsZXNtY193cml0ZV9lbnRyeShjb25zdCBzdHJ1Y3QgYXBwbGVzbWNfZW50cnkgKmVudHJ5LAorCQkJCWNvbnN0IHU4ICpidWYsIHU4IGxlbikKK3sKKwlpbnQgcmV0OworCisJaWYgKGVudHJ5LT5sZW4gIT0gbGVuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwltdXRleF9sb2NrKCZzbWNyZWcubXV0ZXgpOworCXJldCA9IHdyaXRlX3NtYyhBUFBMRVNNQ19XUklURV9DTUQsIGVudHJ5LT5rZXksIGJ1ZiwgbGVuKTsKKwltdXRleF91bmxvY2soJnNtY3JlZy5tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBhcHBsZXNtY19lbnRyeSAqYXBwbGVzbWNfZ2V0X2VudHJ5X2J5X2luZGV4KGludCBpbmRleCkKK3sKKwlzdHJ1Y3QgYXBwbGVzbWNfZW50cnkgKmNhY2hlID0gJnNtY3JlZy5jYWNoZVtpbmRleF07CisJdTgga2V5WzRdLCBpbmZvWzZdOworCV9fYmUzMiBiZTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChjYWNoZS0+dmFsaWQpCisJCXJldHVybiBjYWNoZTsKKworCW11dGV4X2xvY2soJnNtY3JlZy5tdXRleCk7CisKKwlpZiAoY2FjaGUtPnZhbGlkKQorCQlnb3RvIG91dDsKKwliZSA9IGNwdV90b19iZTMyKGluZGV4KTsKKwlyZXQgPSByZWFkX3NtYyhBUFBMRVNNQ19HRVRfS0VZX0JZX0lOREVYX0NNRCwgKHU4ICopJmJlLCBrZXksIDQpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCXJldCA9IHJlYWRfc21jKEFQUExFU01DX0dFVF9LRVlfVFlQRV9DTUQsIGtleSwgaW5mbywgNik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwltZW1jcHkoY2FjaGUtPmtleSwga2V5LCA0KTsKKwljYWNoZS0+bGVuID0gaW5mb1swXTsKKwltZW1jcHkoY2FjaGUtPnR5cGUsICZpbmZvWzFdLCA0KTsKKwljYWNoZS0+ZmxhZ3MgPSBpbmZvWzVdOworCWNhY2hlLT52YWxpZCA9IDE7CisKK291dDoKKwltdXRleF91bmxvY2soJnNtY3JlZy5tdXRleCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwlyZXR1cm4gY2FjaGU7Cit9CisKK3N0YXRpYyBpbnQgYXBwbGVzbWNfZ2V0X2xvd2VyX2JvdW5kKHVuc2lnbmVkIGludCAqbG8sIGNvbnN0IGNoYXIgKmtleSkKK3sKKwlpbnQgYmVnaW4gPSAwLCBlbmQgPSBzbWNyZWcua2V5X2NvdW50OworCWNvbnN0IHN0cnVjdCBhcHBsZXNtY19lbnRyeSAqZW50cnk7CisKKwl3aGlsZSAoYmVnaW4gIT0gZW5kKSB7CisJCWludCBtaWRkbGUgPSBiZWdpbiArIChlbmQgLSBiZWdpbikgLyAyOworCQllbnRyeSA9IGFwcGxlc21jX2dldF9lbnRyeV9ieV9pbmRleChtaWRkbGUpOworCQlpZiAoSVNfRVJSKGVudHJ5KSkKKwkJCXJldHVybiBQVFJfRVJSKGVudHJ5KTsKKwkJaWYgKHN0cmNtcChlbnRyeS0+a2V5LCBrZXkpIDwgMCkKKwkJCWJlZ2luID0gbWlkZGxlICsgMTsKKwkJZWxzZQorCQkJZW5kID0gbWlkZGxlOwogCX0KIAotCW91dGIoNiwgQVBQTEVTTUNfREFUQV9QT1JUKTsKKwkqbG8gPSBiZWdpbjsKKwlyZXR1cm4gMDsKK30KIAotCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKLQkJaWYgKF9fd2FpdF9zdGF0dXMoMHgwNSkpCi0JCQlyZXR1cm4gLUVJTzsKLQkJdHlwZVtpXSA9IGluYihBUFBMRVNNQ19EQVRBX1BPUlQpOworc3RhdGljIGludCBhcHBsZXNtY19nZXRfdXBwZXJfYm91bmQodW5zaWduZWQgaW50ICpoaSwgY29uc3QgY2hhciAqa2V5KQoreworCWludCBiZWdpbiA9IDAsIGVuZCA9IHNtY3JlZy5rZXlfY291bnQ7CisJY29uc3Qgc3RydWN0IGFwcGxlc21jX2VudHJ5ICplbnRyeTsKKworCXdoaWxlIChiZWdpbiAhPSBlbmQpIHsKKwkJaW50IG1pZGRsZSA9IGJlZ2luICsgKGVuZCAtIGJlZ2luKSAvIDI7CisJCWVudHJ5ID0gYXBwbGVzbWNfZ2V0X2VudHJ5X2J5X2luZGV4KG1pZGRsZSk7CisJCWlmIChJU19FUlIoZW50cnkpKQorCQkJcmV0dXJuIFBUUl9FUlIoZW50cnkpOworCQlpZiAoc3RyY21wKGtleSwgZW50cnktPmtleSkgPCAwKQorCQkJZW5kID0gbWlkZGxlOworCQllbHNlCisJCQliZWdpbiA9IG1pZGRsZSArIDE7CiAJfQotCXR5cGVbNV0gPSAwOwogCisJKmhpID0gYmVnaW47CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXBwbGVzbWNfZW50cnkgKmFwcGxlc21jX2dldF9lbnRyeV9ieV9rZXkoY29uc3QgY2hhciAqa2V5KQoreworCWludCBiZWdpbiwgZW5kOworCWludCByZXQ7CisKKwlyZXQgPSBhcHBsZXNtY19nZXRfbG93ZXJfYm91bmQoJmJlZ2luLCBrZXkpOworCWlmIChyZXQpCisJCXJldHVybiBFUlJfUFRSKHJldCk7CisJcmV0ID0gYXBwbGVzbWNfZ2V0X3VwcGVyX2JvdW5kKCZlbmQsIGtleSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwlpZiAoZW5kIC0gYmVnaW4gIT0gMSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwlyZXR1cm4gYXBwbGVzbWNfZ2V0X2VudHJ5X2J5X2luZGV4KGJlZ2luKTsKK30KKworc3RhdGljIGludCBhcHBsZXNtY19yZWFkX2tleShjb25zdCBjaGFyICprZXksIHU4ICpidWZmZXIsIHU4IGxlbikKK3sKKwljb25zdCBzdHJ1Y3QgYXBwbGVzbWNfZW50cnkgKmVudHJ5OworCisJZW50cnkgPSBhcHBsZXNtY19nZXRfZW50cnlfYnlfa2V5KGtleSk7CisJaWYgKElTX0VSUihlbnRyeSkpCisJCXJldHVybiBQVFJfRVJSKGVudHJ5KTsKKworCXJldHVybiBhcHBsZXNtY19yZWFkX2VudHJ5KGVudHJ5LCBidWZmZXIsIGxlbik7Cit9CisKK3N0YXRpYyBpbnQgYXBwbGVzbWNfd3JpdGVfa2V5KGNvbnN0IGNoYXIgKmtleSwgY29uc3QgdTggKmJ1ZmZlciwgdTggbGVuKQoreworCWNvbnN0IHN0cnVjdCBhcHBsZXNtY19lbnRyeSAqZW50cnk7CisKKwllbnRyeSA9IGFwcGxlc21jX2dldF9lbnRyeV9ieV9rZXkoa2V5KTsKKwlpZiAoSVNfRVJSKGVudHJ5KSkKKwkJcmV0dXJuIFBUUl9FUlIoZW50cnkpOworCisJcmV0dXJuIGFwcGxlc21jX3dyaXRlX2VudHJ5KGVudHJ5LCBidWZmZXIsIGxlbik7Cit9CisKK3N0YXRpYyBpbnQgYXBwbGVzbWNfaGFzX2tleShjb25zdCBjaGFyICprZXksIGJvb2wgKnZhbHVlKQoreworCWNvbnN0IHN0cnVjdCBhcHBsZXNtY19lbnRyeSAqZW50cnk7CisKKwllbnRyeSA9IGFwcGxlc21jX2dldF9lbnRyeV9ieV9rZXkoa2V5KTsKKwlpZiAoSVNfRVJSKGVudHJ5KSAmJiBQVFJfRVJSKGVudHJ5KSAhPSAtRUlOVkFMKQorCQlyZXR1cm4gUFRSX0VSUihlbnRyeSk7CisKKwkqdmFsdWUgPSAhSVNfRVJSKGVudHJ5KTsKIAlyZXR1cm4gMDsKIH0KIAogLyoKLSAqIGFwcGxlc21jX3JlYWRfbW90aW9uX3NlbnNvciAtIFJlYWQgbW90aW9uIHNlbnNvciAoWCwgWSBvciBaKS4gQ2FsbGVycyBtdXN0Ci0gKiBob2xkIGFwcGxlc21jX2xvY2suCisgKiBhcHBsZXNtY19yZWFkX21vdGlvbl9zZW5zb3IgLSBSZWFkIG1vdGlvbiBzZW5zb3IgKFgsIFkgb3IgWikuCiAgKi8KLXN0YXRpYyBpbnQgYXBwbGVzbWNfcmVhZF9tb3Rpb25fc2Vuc29yKGludCBpbmRleCwgczE2KiB2YWx1ZSkKK3N0YXRpYyBpbnQgYXBwbGVzbWNfcmVhZF9tb3Rpb25fc2Vuc29yKGludCBpbmRleCwgczE2ICp2YWx1ZSkKIHsKIAl1OCBidWZmZXJbMl07CiAJaW50IHJldDsKQEAgLTQ0NCw2OSArNDU1LDEyMCBAQAogfQogCiAvKgotICogYXBwbGVzbWNfZGV2aWNlX2luaXQgLSBpbml0aWFsaXplIHRoZSBhY2NlbGVyb21ldGVyLiAgUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MKLSAqIGFuZCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuICBDYW4gc2xlZXAuCisgKiBhcHBsZXNtY19kZXZpY2VfaW5pdCAtIGluaXRpYWxpemUgdGhlIGFjY2VsZXJvbWV0ZXIuICBDYW4gc2xlZXAuCiAgKi8KLXN0YXRpYyBpbnQgYXBwbGVzbWNfZGV2aWNlX2luaXQodm9pZCkKK3N0YXRpYyB2b2lkIGFwcGxlc21jX2RldmljZV9pbml0KHZvaWQpCiB7Ci0JaW50IHRvdGFsLCByZXQgPSAtRU5YSU87CisJaW50IHRvdGFsOwogCXU4IGJ1ZmZlclsyXTsKIAotCWlmICghYXBwbGVzbWNfYWNjZWxlcm9tZXRlcikKLQkJcmV0dXJuIDA7Ci0KLQltdXRleF9sb2NrKCZhcHBsZXNtY19sb2NrKTsKKwlpZiAoIXNtY3JlZy5oYXNfYWNjZWxlcm9tZXRlcikKKwkJcmV0dXJuOwogCiAJZm9yICh0b3RhbCA9IElOSVRfVElNRU9VVF9NU0VDUzsgdG90YWwgPiAwOyB0b3RhbCAtPSBJTklUX1dBSVRfTVNFQ1MpIHsKLQkJaWYgKGRlYnVnKQotCQkJcHJpbnRrKEtFUk5fREVCVUcgImFwcGxlc21jIHRyeSAlZFxuIiwgdG90YWwpOwogCQlpZiAoIWFwcGxlc21jX3JlYWRfa2V5KE1PVElPTl9TRU5TT1JfS0VZLCBidWZmZXIsIDIpICYmCi0JCQkJKGJ1ZmZlclswXSAhPSAweDAwIHx8IGJ1ZmZlclsxXSAhPSAweDAwKSkgewotCQkJaWYgKHRvdGFsID09IElOSVRfVElNRU9VVF9NU0VDUykgewotCQkJCXByaW50ayhLRVJOX0RFQlVHICJhcHBsZXNtYzogZGV2aWNlIGhhcyIKLQkJCQkJCSIgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIgotCQkJCQkJIiAoMHglMDJ4LCAweCUwMngpLlxuIiwKLQkJCQkJCWJ1ZmZlclswXSwgYnVmZmVyWzFdKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJpbnRrKEtFUk5fREVCVUcgImFwcGxlc21jOiBkZXZpY2UiCi0JCQkJCQkiIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZCIKLQkJCQkJCSIgKDB4JTAyeCwgMHglMDJ4KS5cbiIsCi0JCQkJCQlidWZmZXJbMF0sIGJ1ZmZlclsxXSk7Ci0JCQl9Ci0JCQlyZXQgPSAwOwotCQkJZ290byBvdXQ7Ci0JCX0KKwkJCQkoYnVmZmVyWzBdICE9IDB4MDAgfHwgYnVmZmVyWzFdICE9IDB4MDApKQorCQkJcmV0dXJuOwogCQlidWZmZXJbMF0gPSAweGUwOwogCQlidWZmZXJbMV0gPSAweDAwOwogCQlhcHBsZXNtY193cml0ZV9rZXkoTU9USU9OX1NFTlNPUl9LRVksIGJ1ZmZlciwgMik7CiAJCW1zbGVlcChJTklUX1dBSVRfTVNFQ1MpOwogCX0KIAotCXByaW50ayhLRVJOX1dBUk5JTkcgImFwcGxlc21jOiBmYWlsZWQgdG8gaW5pdCB0aGUgZGV2aWNlXG4iKTsKLQotb3V0OgotCW11dGV4X3VubG9jaygmYXBwbGVzbWNfbG9jayk7Ci0JcmV0dXJuIHJldDsKKwlwcl93YXJuKCJmYWlsZWQgdG8gaW5pdCB0aGUgZGV2aWNlXG4iKTsKIH0KIAogLyoKLSAqIGFwcGxlc21jX2dldF9mYW5fY291bnQgLSBnZXQgdGhlIG51bWJlciBvZiBmYW5zLiBDYWxsZXJzIG11c3QgTk9UIGhvbGQKLSAqIGFwcGxlc21jX2xvY2suCisgKiBhcHBsZXNtY19pbml0X3NtY3JlZ190cnkgLSBUcnkgdG8gaW5pdGlhbGl6ZSByZWdpc3RlciBjYWNoZS4gSWRlbXBvdGVudC4KICAqLwotc3RhdGljIGludCBhcHBsZXNtY19nZXRfZmFuX2NvdW50KHZvaWQpCitzdGF0aWMgaW50IGFwcGxlc21jX2luaXRfc21jcmVnX3RyeSh2b2lkKQogeworCXN0cnVjdCBhcHBsZXNtY19yZWdpc3RlcnMgKnMgPSAmc21jcmVnOworCWJvb2wgbGVmdF9saWdodF9zZW5zb3IsIHJpZ2h0X2xpZ2h0X3NlbnNvcjsKKwl1OCB0bXBbMV07CiAJaW50IHJldDsKLQl1OCBidWZmZXJbMV07CiAKLQltdXRleF9sb2NrKCZhcHBsZXNtY19sb2NrKTsKKwlpZiAocy0+aW5pdF9jb21wbGV0ZSkKKwkJcmV0dXJuIDA7CiAKLQlyZXQgPSBhcHBsZXNtY19yZWFkX2tleShGQU5TX0NPVU5ULCBidWZmZXIsIDEpOwotCi0JbXV0ZXhfdW5sb2NrKCZhcHBsZXNtY19sb2NrKTsKKwlyZXQgPSByZWFkX3JlZ2lzdGVyX2NvdW50KCZzLT5rZXlfY291bnQpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7Ci0JZWxzZQotCQlyZXR1cm4gYnVmZmVyWzBdOworCisJaWYgKCFzLT5jYWNoZSkKKwkJcy0+Y2FjaGUgPSBrY2FsbG9jKHMtPmtleV9jb3VudCwgc2l6ZW9mKCpzLT5jYWNoZSksIEdGUF9LRVJORUwpOworCWlmICghcy0+Y2FjaGUpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0gYXBwbGVzbWNfcmVhZF9rZXkoRkFOU19DT1VOVCwgdG1wLCAxKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXMtPmZhbl9jb3VudCA9IHRtcFswXTsKKworCXJldCA9IGFwcGxlc21jX2dldF9sb3dlcl9ib3VuZCgmcy0+dGVtcF9iZWdpbiwgIlQiKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldCA9IGFwcGxlc21jX2dldF9sb3dlcl9ib3VuZCgmcy0+dGVtcF9lbmQsICJVIik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlzLT50ZW1wX2NvdW50ID0gcy0+dGVtcF9lbmQgLSBzLT50ZW1wX2JlZ2luOworCisJcmV0ID0gYXBwbGVzbWNfaGFzX2tleShMSUdIVF9TRU5TT1JfTEVGVF9LRVksICZsZWZ0X2xpZ2h0X3NlbnNvcik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSBhcHBsZXNtY19oYXNfa2V5KExJR0hUX1NFTlNPUl9SSUdIVF9LRVksICZyaWdodF9saWdodF9zZW5zb3IpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0ID0gYXBwbGVzbWNfaGFzX2tleShNT1RJT05fU0VOU09SX0tFWSwgJnMtPmhhc19hY2NlbGVyb21ldGVyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldCA9IGFwcGxlc21jX2hhc19rZXkoQkFDS0xJR0hUX0tFWSwgJnMtPmhhc19rZXlfYmFja2xpZ2h0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcy0+bnVtX2xpZ2h0X3NlbnNvcnMgPSBsZWZ0X2xpZ2h0X3NlbnNvciArIHJpZ2h0X2xpZ2h0X3NlbnNvcjsKKwlzLT5pbml0X2NvbXBsZXRlID0gdHJ1ZTsKKworCXByX2luZm8oImtleT0lZCBmYW49JWQgdGVtcD0lZCBhY2M9JWQgbHV4PSVkIGtiZD0lZFxuIiwKKwkgICAgICAgcy0+a2V5X2NvdW50LCBzLT5mYW5fY291bnQsIHMtPnRlbXBfY291bnQsCisJICAgICAgIHMtPmhhc19hY2NlbGVyb21ldGVyLAorCSAgICAgICBzLT5udW1fbGlnaHRfc2Vuc29ycywKKwkgICAgICAgcy0+aGFzX2tleV9iYWNrbGlnaHQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBhcHBsZXNtY19pbml0X3NtY3JlZyAtIEluaXRpYWxpemUgcmVnaXN0ZXIgY2FjaGUuCisgKgorICogUmV0cmllcyB1bnRpbCBpbml0aWFsaXphdGlvbiBpcyBzdWNjZXNzZnVsLCBvciB0aGUgb3BlcmF0aW9uIHRpbWVzIG91dC4KKyAqCisgKi8KK3N0YXRpYyBpbnQgYXBwbGVzbWNfaW5pdF9zbWNyZWcodm9pZCkKK3sKKwlpbnQgbXMsIHJldDsKKworCWZvciAobXMgPSAwOyBtcyA8IElOSVRfVElNRU9VVF9NU0VDUzsgbXMgKz0gSU5JVF9XQUlUX01TRUNTKSB7CisJCXJldCA9IGFwcGxlc21jX2luaXRfc21jcmVnX3RyeSgpOworCQlpZiAoIXJldCkgeworCQkJaWYgKG1zKQorCQkJCXByX2luZm8oImluaXRfc21jcmVnKCkgdG9vayAlZCBtc1xuIiwgbXMpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJbXNsZWVwKElOSVRfV0FJVF9NU0VDUyk7CisJfQorCisJa2ZyZWUoc21jcmVnLmNhY2hlKTsKKwlzbWNyZWcuY2FjaGUgPSBOVUxMOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgYXBwbGVzbWNfZGVzdHJveV9zbWNyZWcodm9pZCkKK3sKKwlrZnJlZShzbWNyZWcuY2FjaGUpOworCXNtY3JlZy5jYWNoZSA9IE5VTEw7CisJc21jcmVnLmluaXRfY29tcGxldGUgPSBmYWxzZTsKIH0KIAogLyogRGV2aWNlIG1vZGVsIHN0dWZmICovCkBAIC01MTQsMzAgKzU3NiwyNyBAQAogewogCWludCByZXQ7CiAKLQlyZXQgPSBhcHBsZXNtY19kZXZpY2VfaW5pdCgpOworCXJldCA9IGFwcGxlc21jX2luaXRfc21jcmVnKCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCXByaW50ayhLRVJOX0lORk8gImFwcGxlc21jOiBkZXZpY2Ugc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkLlxuIik7CisJYXBwbGVzbWNfZGV2aWNlX2luaXQoKTsKKwogCXJldHVybiAwOwogfQogCiAvKiBTeW5jaHJvbml6ZSBkZXZpY2Ugd2l0aCBtZW1vcml6ZWQgYmFja2xpZ2h0IHN0YXRlICovCiBzdGF0aWMgaW50IGFwcGxlc21jX3BtX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JbXV0ZXhfbG9jaygmYXBwbGVzbWNfbG9jayk7Ci0JaWYgKGFwcGxlc21jX2xpZ2h0KQorCWlmIChzbWNyZWcuaGFzX2tleV9iYWNrbGlnaHQpCiAJCWFwcGxlc21jX3dyaXRlX2tleShCQUNLTElHSFRfS0VZLCBiYWNrbGlnaHRfc3RhdGUsIDIpOwotCW11dGV4X3VubG9jaygmYXBwbGVzbWNfbG9jayk7CiAJcmV0dXJuIDA7CiB9CiAKIC8qIFJlaW5pdGlhbGl6ZSBkZXZpY2Ugb24gcmVzdW1lIGZyb20gaGliZXJuYXRpb24gKi8KIHN0YXRpYyBpbnQgYXBwbGVzbWNfcG1fcmVzdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JaW50IHJldCA9IGFwcGxlc21jX2RldmljZV9pbml0KCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwlhcHBsZXNtY19kZXZpY2VfaW5pdCgpOwogCXJldHVybiBhcHBsZXNtY19wbV9yZXN1bWUoZGV2KTsKIH0KIApAQCAtNTcxLDIwICs2MzAsMTUgQEAKIAlzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2ID0gZGV2LT5pbnB1dDsKIAlzMTYgeCwgeTsKIAotCW11dGV4X2xvY2soJmFwcGxlc21jX2xvY2spOwotCiAJaWYgKGFwcGxlc21jX3JlYWRfbW90aW9uX3NlbnNvcihTRU5TT1JfWCwgJngpKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuOwogCWlmIChhcHBsZXNtY19yZWFkX21vdGlvbl9zZW5zb3IoU0VOU09SX1ksICZ5KSkKLQkJZ290byBvdXQ7CisJCXJldHVybjsKIAogCXggPSAteDsKIAlpbnB1dF9yZXBvcnRfYWJzKGlkZXYsIEFCU19YLCB4IC0gcmVzdF94KTsKIAlpbnB1dF9yZXBvcnRfYWJzKGlkZXYsIEFCU19ZLCB5IC0gcmVzdF95KTsKIAlpbnB1dF9zeW5jKGlkZXYpOwotCi1vdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZhcHBsZXNtY19sb2NrKTsKIH0KIAogLyogU3lzZnMgRmlsZXMgKi8KQEAgLTYwMSw4ICs2NTUsNiBAQAogCWludCByZXQ7CiAJczE2IHgsIHksIHo7CiAKLQltdXRleF9sb2NrKCZhcHBsZXNtY19sb2NrKTsKLQogCXJldCA9IGFwcGxlc21jX3JlYWRfbW90aW9uX3NlbnNvcihTRU5TT1JfWCwgJngpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwpAQCAtNjE0LDcgKzY2Niw2IEBACiAJCWdvdG8gb3V0OwogCiBvdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZhcHBsZXNtY19sb2NrKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCWVsc2UKQEAgLTYyNCwyMCArNjc1LDIwIEBACiBzdGF0aWMgc3NpemVfdCBhcHBsZXNtY19saWdodF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqc3lzZnNidWYpCiB7CisJY29uc3Qgc3RydWN0IGFwcGxlc21jX2VudHJ5ICplbnRyeTsKIAlzdGF0aWMgaW50IGRhdGFfbGVuZ3RoOwogCWludCByZXQ7CiAJdTggbGVmdCA9IDAsIHJpZ2h0ID0gMDsKLQl1OCBidWZmZXJbMTBdLCBxdWVyeVs2XTsKLQotCW11dGV4X2xvY2soJmFwcGxlc21jX2xvY2spOworCXU4IGJ1ZmZlclsxMF07CiAKIAlpZiAoIWRhdGFfbGVuZ3RoKSB7Ci0JCXJldCA9IGFwcGxlc21jX2dldF9rZXlfdHlwZShMSUdIVF9TRU5TT1JfTEVGVF9LRVksIHF1ZXJ5KTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gb3V0OwotCQlkYXRhX2xlbmd0aCA9IGNsYW1wX3ZhbChxdWVyeVswXSwgMCwgMTApOwotCQlwcmludGsoS0VSTl9JTkZPICJhcHBsZXNtYzogbGlnaHQgc2Vuc29yIGRhdGEgbGVuZ3RoIHNldCB0byAiCi0JCQkiJWRcbiIsIGRhdGFfbGVuZ3RoKTsKKwkJZW50cnkgPSBhcHBsZXNtY19nZXRfZW50cnlfYnlfa2V5KExJR0hUX1NFTlNPUl9MRUZUX0tFWSk7CisJCWlmIChJU19FUlIoZW50cnkpKQorCQkJcmV0dXJuIFBUUl9FUlIoZW50cnkpOworCQlpZiAoZW50cnktPmxlbiA+IDEwKQorCQkJcmV0dXJuIC1FTlhJTzsKKwkJZGF0YV9sZW5ndGggPSBlbnRyeS0+bGVuOworCQlwcl9pbmZvKCJsaWdodCBzZW5zb3IgZGF0YSBsZW5ndGggc2V0IHRvICVkXG4iLCBkYXRhX2xlbmd0aCk7CiAJfQogCiAJcmV0ID0gYXBwbGVzbWNfcmVhZF9rZXkoTElHSFRfU0VOU09SX0xFRlRfS0VZLCBidWZmZXIsIGRhdGFfbGVuZ3RoKTsKQEAgLTY1Myw3ICs3MDQsNiBAQAogCXJpZ2h0ID0gYnVmZmVyWzJdOwogCiBvdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZhcHBsZXNtY19sb2NrKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCWVsc2UKQEAgLTY2NCwzNiArNzE0LDQ0IEBACiBzdGF0aWMgc3NpemVfdCBhcHBsZXNtY19zaG93X3NlbnNvcl9sYWJlbChzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqc3lzZnNidWYpCiB7Ci0Jc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOwotCWNvbnN0IGNoYXIgKmtleSA9Ci0JCXRlbXBlcmF0dXJlX3NlbnNvcnNfc2V0c1thcHBsZXNtY190ZW1wZXJhdHVyZV9zZXRdW2F0dHItPmluZGV4XTsKKwlpbnQgaW5kZXggPSBzbWNyZWcudGVtcF9iZWdpbiArIHRvX2luZGV4KGRldmF0dHIpOworCWNvbnN0IHN0cnVjdCBhcHBsZXNtY19lbnRyeSAqZW50cnk7CiAKLQlyZXR1cm4gc25wcmludGYoc3lzZnNidWYsIFBBR0VfU0laRSwgIiVzXG4iLCBrZXkpOworCWVudHJ5ID0gYXBwbGVzbWNfZ2V0X2VudHJ5X2J5X2luZGV4KGluZGV4KTsKKwlpZiAoSVNfRVJSKGVudHJ5KSkKKwkJcmV0dXJuIFBUUl9FUlIoZW50cnkpOworCisJcmV0dXJuIHNucHJpbnRmKHN5c2ZzYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwgZW50cnktPmtleSk7CiB9CiAKIC8qIERpc3BsYXlzIGRlZ3JlZSBDZWxzaXVzICogMTAwMCAqLwogc3RhdGljIHNzaXplX3QgYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqc3lzZnNidWYpCiB7CisJaW50IGluZGV4ID0gc21jcmVnLnRlbXBfYmVnaW4gKyB0b19pbmRleChkZXZhdHRyKTsKKwljb25zdCBzdHJ1Y3QgYXBwbGVzbWNfZW50cnkgKmVudHJ5OwogCWludCByZXQ7CiAJdTggYnVmZmVyWzJdOwogCXVuc2lnbmVkIGludCB0ZW1wOwotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKLQljb25zdCBjaGFyKiBrZXkgPQotCQl0ZW1wZXJhdHVyZV9zZW5zb3JzX3NldHNbYXBwbGVzbWNfdGVtcGVyYXR1cmVfc2V0XVthdHRyLT5pbmRleF07CiAKLQltdXRleF9sb2NrKCZhcHBsZXNtY19sb2NrKTsKKwllbnRyeSA9IGFwcGxlc21jX2dldF9lbnRyeV9ieV9pbmRleChpbmRleCk7CisJaWYgKElTX0VSUihlbnRyeSkpCisJCXJldHVybiBQVFJfRVJSKGVudHJ5KTsKKwlpZiAoZW50cnktPmxlbiA+IDIpCisJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0ID0gYXBwbGVzbWNfcmVhZF9rZXkoa2V5LCBidWZmZXIsIDIpOwotCXRlbXAgPSBidWZmZXJbMF0qMTAwMDsKLQl0ZW1wICs9IChidWZmZXJbMV0gPj4gNikgKiAyNTA7Ci0KLQltdXRleF91bmxvY2soJmFwcGxlc21jX2xvY2spOwotCisJcmV0ID0gYXBwbGVzbWNfcmVhZF9lbnRyeShlbnRyeSwgYnVmZmVyLCBlbnRyeS0+bGVuKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwotCWVsc2UKLQkJcmV0dXJuIHNucHJpbnRmKHN5c2ZzYnVmLCBQQUdFX1NJWkUsICIldVxuIiwgdGVtcCk7CisKKwlpZiAoZW50cnktPmxlbiA9PSAyKSB7CisJCXRlbXAgPSBidWZmZXJbMF0gKiAxMDAwOworCQl0ZW1wICs9IChidWZmZXJbMV0gPj4gNikgKiAyNTA7CisJfSBlbHNlIHsKKwkJdGVtcCA9IGJ1ZmZlclswXSAqIDQwMDA7CisJfQorCisJcmV0dXJuIHNucHJpbnRmKHN5c2ZzYnVmLCBQQUdFX1NJWkUsICIldVxuIiwgdGVtcCk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGFwcGxlc21jX3Nob3dfZmFuX3NwZWVkKHN0cnVjdCBkZXZpY2UgKmRldiwKQEAgLTcwMywyMSArNzYxLDEyIEBACiAJdW5zaWduZWQgaW50IHNwZWVkID0gMDsKIAljaGFyIG5ld2tleVs1XTsKIAl1OCBidWZmZXJbMl07Ci0Jc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgKnNlbnNvcl9hdHRyID0KLQkJCQkJCXRvX3NlbnNvcl9kZXZfYXR0cl8yKGF0dHIpOwogCi0JbmV3a2V5WzBdID0gZmFuX3NwZWVkX2tleXNbc2Vuc29yX2F0dHItPm5yXVswXTsKLQluZXdrZXlbMV0gPSAnMCcgKyBzZW5zb3JfYXR0ci0+aW5kZXg7Ci0JbmV3a2V5WzJdID0gZmFuX3NwZWVkX2tleXNbc2Vuc29yX2F0dHItPm5yXVsyXTsKLQluZXdrZXlbM10gPSBmYW5fc3BlZWRfa2V5c1tzZW5zb3JfYXR0ci0+bnJdWzNdOwotCW5ld2tleVs0XSA9IDA7Ci0KLQltdXRleF9sb2NrKCZhcHBsZXNtY19sb2NrKTsKKwlzcHJpbnRmKG5ld2tleSwgZmFuX3NwZWVkX2ZtdFt0b19vcHRpb24oYXR0cildLCB0b19pbmRleChhdHRyKSk7CiAKIAlyZXQgPSBhcHBsZXNtY19yZWFkX2tleShuZXdrZXksIGJ1ZmZlciwgMik7CiAJc3BlZWQgPSAoKGJ1ZmZlclswXSA8PCA4IHwgYnVmZmVyWzFdKSA+PiAyKTsKIAotCW11dGV4X3VubG9jaygmYXBwbGVzbWNfbG9jayk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAllbHNlCkBAIC03MjksMzAgKzc3OCwxOSBAQAogCQkJCQljb25zdCBjaGFyICpzeXNmc2J1Ziwgc2l6ZV90IGNvdW50KQogewogCWludCByZXQ7Ci0JdTMyIHNwZWVkOworCXVuc2lnbmVkIGxvbmcgc3BlZWQ7CiAJY2hhciBuZXdrZXlbNV07CiAJdTggYnVmZmVyWzJdOwotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yICpzZW5zb3JfYXR0ciA9Ci0JCQkJCQl0b19zZW5zb3JfZGV2X2F0dHJfMihhdHRyKTsKIAotCXNwZWVkID0gc2ltcGxlX3N0cnRvdWwoc3lzZnNidWYsIE5VTEwsIDEwKTsKKwlpZiAoc3RyaWN0X3N0cnRvdWwoc3lzZnNidWYsIDEwLCAmc3BlZWQpIDwgMCB8fCBzcGVlZCA+PSAweDQwMDApCisJCXJldHVybiAtRUlOVkFMOwkJLyogQmlnZ2VyIHRoYW4gYSAxNC1iaXQgdmFsdWUgKi8KIAotCWlmIChzcGVlZCA+IDB4NDAwMCkgLyogQmlnZ2VyIHRoYW4gYSAxNC1iaXQgdmFsdWUgKi8KLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQluZXdrZXlbMF0gPSBmYW5fc3BlZWRfa2V5c1tzZW5zb3JfYXR0ci0+bnJdWzBdOwotCW5ld2tleVsxXSA9ICcwJyArIHNlbnNvcl9hdHRyLT5pbmRleDsKLQluZXdrZXlbMl0gPSBmYW5fc3BlZWRfa2V5c1tzZW5zb3JfYXR0ci0+bnJdWzJdOwotCW5ld2tleVszXSA9IGZhbl9zcGVlZF9rZXlzW3NlbnNvcl9hdHRyLT5ucl1bM107Ci0JbmV3a2V5WzRdID0gMDsKLQotCW11dGV4X2xvY2soJmFwcGxlc21jX2xvY2spOworCXNwcmludGYobmV3a2V5LCBmYW5fc3BlZWRfZm10W3RvX29wdGlvbihhdHRyKV0sIHRvX2luZGV4KGF0dHIpKTsKIAogCWJ1ZmZlclswXSA9IChzcGVlZCA+PiA2KSAmIDB4ZmY7CiAJYnVmZmVyWzFdID0gKHNwZWVkIDw8IDIpICYgMHhmZjsKIAlyZXQgPSBhcHBsZXNtY193cml0ZV9rZXkobmV3a2V5LCBidWZmZXIsIDIpOwogCi0JbXV0ZXhfdW5sb2NrKCZhcHBsZXNtY19sb2NrKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCWVsc2UKQEAgLTc2MCwxOSArNzk4LDE1IEBACiB9CiAKIHN0YXRpYyBzc2l6ZV90IGFwcGxlc21jX3Nob3dfZmFuX21hbnVhbChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqc3lzZnNidWYpCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqc3lzZnNidWYpCiB7CiAJaW50IHJldDsKIAl1MTYgbWFudWFsID0gMDsKIAl1OCBidWZmZXJbMl07Ci0Jc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOwotCi0JbXV0ZXhfbG9jaygmYXBwbGVzbWNfbG9jayk7CiAKIAlyZXQgPSBhcHBsZXNtY19yZWFkX2tleShGQU5TX01BTlVBTCwgYnVmZmVyLCAyKTsKLQltYW51YWwgPSAoKGJ1ZmZlclswXSA8PCA4IHwgYnVmZmVyWzFdKSA+PiBhdHRyLT5pbmRleCkgJiAweDAxOworCW1hbnVhbCA9ICgoYnVmZmVyWzBdIDw8IDggfCBidWZmZXJbMV0pID4+IHRvX2luZGV4KGF0dHIpKSAmIDB4MDE7CiAKLQltdXRleF91bmxvY2soJmFwcGxlc21jX2xvY2spOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAJZWxzZQpAQCAtNzgwLDE4ICs4MTQsMTYgQEAKIH0KIAogc3RhdGljIHNzaXplX3QgYXBwbGVzbWNfc3RvcmVfZmFuX21hbnVhbChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJCQkgY29uc3QgY2hhciAqc3lzZnNidWYsIHNpemVfdCBjb3VudCkKIHsKIAlpbnQgcmV0OwogCXU4IGJ1ZmZlclsyXTsKLQl1MzIgaW5wdXQ7CisJdW5zaWduZWQgbG9uZyBpbnB1dDsKIAl1MTYgdmFsOwotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKIAotCWlucHV0ID0gc2ltcGxlX3N0cnRvdWwoc3lzZnNidWYsIE5VTEwsIDEwKTsKLQotCW11dGV4X2xvY2soJmFwcGxlc21jX2xvY2spOworCWlmIChzdHJpY3Rfc3RydG91bChzeXNmc2J1ZiwgMTAsICZpbnB1dCkgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCXJldCA9IGFwcGxlc21jX3JlYWRfa2V5KEZBTlNfTUFOVUFMLCBidWZmZXIsIDIpOwogCXZhbCA9IChidWZmZXJbMF0gPDwgOCB8IGJ1ZmZlclsxXSk7CkBAIC03OTksOSArODMxLDkgQEAKIAkJZ290byBvdXQ7CiAKIAlpZiAoaW5wdXQpCi0JCXZhbCA9IHZhbCB8ICgweDAxIDw8IGF0dHItPmluZGV4KTsKKwkJdmFsID0gdmFsIHwgKDB4MDEgPDwgdG9faW5kZXgoYXR0cikpOwogCWVsc2UKLQkJdmFsID0gdmFsICYgfigweDAxIDw8IGF0dHItPmluZGV4KTsKKwkJdmFsID0gdmFsICYgfigweDAxIDw8IHRvX2luZGV4KGF0dHIpKTsKIAogCWJ1ZmZlclswXSA9ICh2YWwgPj4gOCkgJiAweEZGOwogCWJ1ZmZlclsxXSA9IHZhbCAmIDB4RkY7CkBAIC04MDksNyArODQxLDYgQEAKIAlyZXQgPSBhcHBsZXNtY193cml0ZV9rZXkoRkFOU19NQU5VQUwsIGJ1ZmZlciwgMik7CiAKIG91dDoKLQltdXRleF91bmxvY2soJmFwcGxlc21jX2xvY2spOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAJZWxzZQpAQCAtODIyLDIxICs4NTMsMTIgQEAKIAlpbnQgcmV0OwogCWNoYXIgbmV3a2V5WzVdOwogCXU4IGJ1ZmZlclsxN107Ci0Jc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgKnNlbnNvcl9hdHRyID0KLQkJCQkJCXRvX3NlbnNvcl9kZXZfYXR0cl8yKGF0dHIpOwogCi0JbmV3a2V5WzBdID0gRkFOX1BPU0lUSU9OWzBdOwotCW5ld2tleVsxXSA9ICcwJyArIHNlbnNvcl9hdHRyLT5pbmRleDsKLQluZXdrZXlbMl0gPSBGQU5fUE9TSVRJT05bMl07Ci0JbmV3a2V5WzNdID0gRkFOX1BPU0lUSU9OWzNdOwotCW5ld2tleVs0XSA9IDA7Ci0KLQltdXRleF9sb2NrKCZhcHBsZXNtY19sb2NrKTsKKwlzcHJpbnRmKG5ld2tleSwgRkFOX0lEX0ZNVCwgdG9faW5kZXgoYXR0cikpOwogCiAJcmV0ID0gYXBwbGVzbWNfcmVhZF9rZXkobmV3a2V5LCBidWZmZXIsIDE2KTsKIAlidWZmZXJbMTZdID0gMDsKIAotCW11dGV4X3VubG9jaygmYXBwbGVzbWNfbG9jayk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAllbHNlCkBAIC04NTIsMTggKzg3NCwxNCBAQAogc3RhdGljIHNzaXplX3QgYXBwbGVzbWNfY2FsaWJyYXRlX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKIAlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqc3lzZnNidWYsIHNpemVfdCBjb3VudCkKIHsKLQltdXRleF9sb2NrKCZhcHBsZXNtY19sb2NrKTsKIAlhcHBsZXNtY19jYWxpYnJhdGUoKTsKLQltdXRleF91bmxvY2soJmFwcGxlc21jX2xvY2spOwogCiAJcmV0dXJuIGNvdW50OwogfQogCiBzdGF0aWMgdm9pZCBhcHBsZXNtY19iYWNrbGlnaHRfc2V0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQltdXRleF9sb2NrKCZhcHBsZXNtY19sb2NrKTsKIAlhcHBsZXNtY193cml0ZV9rZXkoQkFDS0xJR0hUX0tFWSwgYmFja2xpZ2h0X3N0YXRlLCAyKTsKLQltdXRleF91bmxvY2soJmFwcGxlc21jX2xvY2spOwogfQogc3RhdGljIERFQ0xBUkVfV09SSyhiYWNrbGlnaHRfd29yaywgJmFwcGxlc21jX2JhY2tsaWdodF9zZXQpOwogCkBAIC04ODYsMTMgKzkwNCwxMCBAQAogCXU4IGJ1ZmZlcls0XTsKIAl1MzIgY291bnQ7CiAKLQltdXRleF9sb2NrKCZhcHBsZXNtY19sb2NrKTsKLQogCXJldCA9IGFwcGxlc21jX3JlYWRfa2V5KEtFWV9DT1VOVF9LRVksIGJ1ZmZlciwgNCk7CiAJY291bnQgPSAoKHUzMilidWZmZXJbMF08PDI0KSArICgodTMyKWJ1ZmZlclsxXTw8MTYpICsKIAkJCQkJCSgodTMyKWJ1ZmZlclsyXTw8OCkgKyBidWZmZXJbM107CiAKLQltdXRleF91bmxvY2soJmFwcGxlc21jX2xvY2spOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAJZWxzZQpAQCAtOTAyLDExMyArOTE3LDUzIEBACiBzdGF0aWMgc3NpemVfdCBhcHBsZXNtY19rZXlfYXRfaW5kZXhfcmVhZF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqc3lzZnNidWYpCiB7Ci0JY2hhciBrZXlbNV07Ci0JY2hhciBpbmZvWzZdOworCWNvbnN0IHN0cnVjdCBhcHBsZXNtY19lbnRyeSAqZW50cnk7CiAJaW50IHJldDsKIAotCW11dGV4X2xvY2soJmFwcGxlc21jX2xvY2spOwotCi0JcmV0ID0gYXBwbGVzbWNfZ2V0X2tleV9hdF9pbmRleChrZXlfYXRfaW5kZXgsIGtleSk7Ci0KLQlpZiAocmV0IHx8ICFrZXlbMF0pIHsKLQkJbXV0ZXhfdW5sb2NrKCZhcHBsZXNtY19sb2NrKTsKLQotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXQgPSBhcHBsZXNtY19nZXRfa2V5X3R5cGUoa2V5LCBpbmZvKTsKLQotCWlmIChyZXQpIHsKLQkJbXV0ZXhfdW5sb2NrKCZhcHBsZXNtY19sb2NrKTsKLQorCWVudHJ5ID0gYXBwbGVzbWNfZ2V0X2VudHJ5X2J5X2luZGV4KGtleV9hdF9pbmRleCk7CisJaWYgKElTX0VSUihlbnRyeSkpCisJCXJldHVybiBQVFJfRVJSKGVudHJ5KTsKKwlyZXQgPSBhcHBsZXNtY19yZWFkX2VudHJ5KGVudHJ5LCBzeXNmc2J1ZiwgZW50cnktPmxlbik7CisJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKLQl9CiAKLQkvKgotCSAqIGluZm9bMF0gbWF4aW11bSB2YWx1ZSAoQVBQTEVTTUNfTUFYX0RBVEFfTEVOR1RIKSBpcyBtdWNoIGxvd2VyIHRoYW4KLQkgKiBQQUdFX1NJWkUsIHNvIHdlIGRvbid0IG5lZWQgYW55IGNoZWNrcyBiZWZvcmUgd3JpdGluZyB0byBzeXNmc2J1Zi4KLQkgKi8KLQlyZXQgPSBhcHBsZXNtY19yZWFkX2tleShrZXksIHN5c2ZzYnVmLCBpbmZvWzBdKTsKLQotCW11dGV4X3VubG9jaygmYXBwbGVzbWNfbG9jayk7Ci0KLQlpZiAoIXJldCkgewotCQlyZXR1cm4gaW5mb1swXTsKLQl9IGVsc2UgewotCQlyZXR1cm4gcmV0OwotCX0KKwlyZXR1cm4gZW50cnktPmxlbjsKIH0KIAogc3RhdGljIHNzaXplX3QgYXBwbGVzbWNfa2V5X2F0X2luZGV4X2RhdGFfbGVuZ3RoX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpzeXNmc2J1ZikKIHsKLQljaGFyIGtleVs1XTsKLQljaGFyIGluZm9bNl07Ci0JaW50IHJldDsKKwljb25zdCBzdHJ1Y3QgYXBwbGVzbWNfZW50cnkgKmVudHJ5OwogCi0JbXV0ZXhfbG9jaygmYXBwbGVzbWNfbG9jayk7CisJZW50cnkgPSBhcHBsZXNtY19nZXRfZW50cnlfYnlfaW5kZXgoa2V5X2F0X2luZGV4KTsKKwlpZiAoSVNfRVJSKGVudHJ5KSkKKwkJcmV0dXJuIFBUUl9FUlIoZW50cnkpOwogCi0JcmV0ID0gYXBwbGVzbWNfZ2V0X2tleV9hdF9pbmRleChrZXlfYXRfaW5kZXgsIGtleSk7Ci0KLQlpZiAocmV0IHx8ICFrZXlbMF0pIHsKLQkJbXV0ZXhfdW5sb2NrKCZhcHBsZXNtY19sb2NrKTsKLQotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXQgPSBhcHBsZXNtY19nZXRfa2V5X3R5cGUoa2V5LCBpbmZvKTsKLQotCW11dGV4X3VubG9jaygmYXBwbGVzbWNfbG9jayk7Ci0KLQlpZiAoIXJldCkKLQkJcmV0dXJuIHNucHJpbnRmKHN5c2ZzYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgaW5mb1swXSk7Ci0JZWxzZQotCQlyZXR1cm4gcmV0OworCXJldHVybiBzbnByaW50ZihzeXNmc2J1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGVudHJ5LT5sZW4pOwogfQogCiBzdGF0aWMgc3NpemVfdCBhcHBsZXNtY19rZXlfYXRfaW5kZXhfdHlwZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqc3lzZnNidWYpCiB7Ci0JY2hhciBrZXlbNV07Ci0JY2hhciBpbmZvWzZdOwotCWludCByZXQ7CisJY29uc3Qgc3RydWN0IGFwcGxlc21jX2VudHJ5ICplbnRyeTsKIAotCW11dGV4X2xvY2soJmFwcGxlc21jX2xvY2spOworCWVudHJ5ID0gYXBwbGVzbWNfZ2V0X2VudHJ5X2J5X2luZGV4KGtleV9hdF9pbmRleCk7CisJaWYgKElTX0VSUihlbnRyeSkpCisJCXJldHVybiBQVFJfRVJSKGVudHJ5KTsKIAotCXJldCA9IGFwcGxlc21jX2dldF9rZXlfYXRfaW5kZXgoa2V5X2F0X2luZGV4LCBrZXkpOwotCi0JaWYgKHJldCB8fCAha2V5WzBdKSB7Ci0JCW11dGV4X3VubG9jaygmYXBwbGVzbWNfbG9jayk7Ci0KLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0ID0gYXBwbGVzbWNfZ2V0X2tleV90eXBlKGtleSwgaW5mbyk7Ci0KLQltdXRleF91bmxvY2soJmFwcGxlc21jX2xvY2spOwotCi0JaWYgKCFyZXQpCi0JCXJldHVybiBzbnByaW50ZihzeXNmc2J1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIGluZm8rMSk7Ci0JZWxzZQotCQlyZXR1cm4gcmV0OworCXJldHVybiBzbnByaW50ZihzeXNmc2J1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIGVudHJ5LT50eXBlKTsKIH0KIAogc3RhdGljIHNzaXplX3QgYXBwbGVzbWNfa2V5X2F0X2luZGV4X25hbWVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKnN5c2ZzYnVmKQogewotCWNoYXIga2V5WzVdOwotCWludCByZXQ7CisJY29uc3Qgc3RydWN0IGFwcGxlc21jX2VudHJ5ICplbnRyeTsKIAotCW11dGV4X2xvY2soJmFwcGxlc21jX2xvY2spOworCWVudHJ5ID0gYXBwbGVzbWNfZ2V0X2VudHJ5X2J5X2luZGV4KGtleV9hdF9pbmRleCk7CisJaWYgKElTX0VSUihlbnRyeSkpCisJCXJldHVybiBQVFJfRVJSKGVudHJ5KTsKIAotCXJldCA9IGFwcGxlc21jX2dldF9rZXlfYXRfaW5kZXgoa2V5X2F0X2luZGV4LCBrZXkpOwotCi0JbXV0ZXhfdW5sb2NrKCZhcHBsZXNtY19sb2NrKTsKLQotCWlmICghcmV0ICYmIGtleVswXSkKLQkJcmV0dXJuIHNucHJpbnRmKHN5c2ZzYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwga2V5KTsKLQllbHNlCi0JCXJldHVybiAtRUlOVkFMOworCXJldHVybiBzbnByaW50ZihzeXNmc2J1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIGVudHJ5LT5rZXkpOwogfQogCiBzdGF0aWMgc3NpemVfdCBhcHBsZXNtY19rZXlfYXRfaW5kZXhfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCkBAIC0xMDIwLDEyICs5NzUsMTMgQEAKIHN0YXRpYyBzc2l6ZV90IGFwcGxlc21jX2tleV9hdF9pbmRleF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKnN5c2ZzYnVmLCBzaXplX3QgY291bnQpCiB7Ci0JbXV0ZXhfbG9jaygmYXBwbGVzbWNfbG9jayk7CisJdW5zaWduZWQgbG9uZyBuZXdrZXk7CiAKLQlrZXlfYXRfaW5kZXggPSBzaW1wbGVfc3RydG91bChzeXNmc2J1ZiwgTlVMTCwgMTApOworCWlmIChzdHJpY3Rfc3RydG91bChzeXNmc2J1ZiwgMTAsICZuZXdrZXkpIDwgMAorCSAgICB8fCBuZXdrZXkgPj0gc21jcmVnLmtleV9jb3VudCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQltdXRleF91bmxvY2soJmFwcGxlc21jX2xvY2spOwotCisJa2V5X2F0X2luZGV4ID0gbmV3a2V5OwogCXJldHVybiBjb3VudDsKIH0KIApAQCAtMTAzNSwzODcgKzk5MSwxMDEgQEAKIAkuYnJpZ2h0bmVzc19zZXQJCT0gYXBwbGVzbWNfYnJpZ2h0bmVzc19zZXQsCiB9OwogCi1zdGF0aWMgREVWSUNFX0FUVFIobmFtZSwgMDQ0NCwgYXBwbGVzbWNfbmFtZV9zaG93LCBOVUxMKTsKLQotc3RhdGljIERFVklDRV9BVFRSKHBvc2l0aW9uLCAwNDQ0LCBhcHBsZXNtY19wb3NpdGlvbl9zaG93LCBOVUxMKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihjYWxpYnJhdGUsIDA2NDQsCi0JCQlhcHBsZXNtY19jYWxpYnJhdGVfc2hvdywgYXBwbGVzbWNfY2FsaWJyYXRlX3N0b3JlKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFjY2VsZXJvbWV0ZXJfYXR0cmlidXRlc1tdID0gewotCSZkZXZfYXR0cl9wb3NpdGlvbi5hdHRyLAotCSZkZXZfYXR0cl9jYWxpYnJhdGUuYXR0ciwKLQlOVUxMCitzdGF0aWMgc3RydWN0IGFwcGxlc21jX25vZGVfZ3JvdXAgaW5mb19ncm91cFtdID0geworCXsgIm5hbWUiLCBhcHBsZXNtY19uYW1lX3Nob3cgfSwKKwl7ICJrZXlfY291bnQiLCBhcHBsZXNtY19rZXlfY291bnRfc2hvdyB9LAorCXsgImtleV9hdF9pbmRleCIsIGFwcGxlc21jX2tleV9hdF9pbmRleF9zaG93LCBhcHBsZXNtY19rZXlfYXRfaW5kZXhfc3RvcmUgfSwKKwl7ICJrZXlfYXRfaW5kZXhfbmFtZSIsIGFwcGxlc21jX2tleV9hdF9pbmRleF9uYW1lX3Nob3cgfSwKKwl7ICJrZXlfYXRfaW5kZXhfdHlwZSIsIGFwcGxlc21jX2tleV9hdF9pbmRleF90eXBlX3Nob3cgfSwKKwl7ICJrZXlfYXRfaW5kZXhfZGF0YV9sZW5ndGgiLCBhcHBsZXNtY19rZXlfYXRfaW5kZXhfZGF0YV9sZW5ndGhfc2hvdyB9LAorCXsgImtleV9hdF9pbmRleF9kYXRhIiwgYXBwbGVzbWNfa2V5X2F0X2luZGV4X3JlYWRfc2hvdyB9LAorCXsgfQogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWNjZWxlcm9tZXRlcl9hdHRyaWJ1dGVzX2dyb3VwID0KLQl7IC5hdHRycyA9IGFjY2VsZXJvbWV0ZXJfYXR0cmlidXRlcyB9OwotCi1zdGF0aWMgREVWSUNFX0FUVFIobGlnaHQsIDA0NDQsIGFwcGxlc21jX2xpZ2h0X3Nob3csIE5VTEwpOwotCi1zdGF0aWMgREVWSUNFX0FUVFIoa2V5X2NvdW50LCAwNDQ0LCBhcHBsZXNtY19rZXlfY291bnRfc2hvdywgTlVMTCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoa2V5X2F0X2luZGV4LCAwNjQ0LAotCQlhcHBsZXNtY19rZXlfYXRfaW5kZXhfc2hvdywgYXBwbGVzbWNfa2V5X2F0X2luZGV4X3N0b3JlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihrZXlfYXRfaW5kZXhfbmFtZSwgMDQ0NCwKLQkJCQkJYXBwbGVzbWNfa2V5X2F0X2luZGV4X25hbWVfc2hvdywgTlVMTCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoa2V5X2F0X2luZGV4X3R5cGUsIDA0NDQsCi0JCQkJCWFwcGxlc21jX2tleV9hdF9pbmRleF90eXBlX3Nob3csIE5VTEwpOwotc3RhdGljIERFVklDRV9BVFRSKGtleV9hdF9pbmRleF9kYXRhX2xlbmd0aCwgMDQ0NCwKLQkJCQlhcHBsZXNtY19rZXlfYXRfaW5kZXhfZGF0YV9sZW5ndGhfc2hvdywgTlVMTCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoa2V5X2F0X2luZGV4X2RhdGEsIDA0NDQsCi0JCQkJYXBwbGVzbWNfa2V5X2F0X2luZGV4X3JlYWRfc2hvdywgTlVMTCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICprZXlfZW51bWVyYXRpb25fYXR0cmlidXRlc1tdID0gewotCSZkZXZfYXR0cl9rZXlfY291bnQuYXR0ciwKLQkmZGV2X2F0dHJfa2V5X2F0X2luZGV4LmF0dHIsCi0JJmRldl9hdHRyX2tleV9hdF9pbmRleF9uYW1lLmF0dHIsCi0JJmRldl9hdHRyX2tleV9hdF9pbmRleF90eXBlLmF0dHIsCi0JJmRldl9hdHRyX2tleV9hdF9pbmRleF9kYXRhX2xlbmd0aC5hdHRyLAotCSZkZXZfYXR0cl9rZXlfYXRfaW5kZXhfZGF0YS5hdHRyLAotCU5VTEwKK3N0YXRpYyBzdHJ1Y3QgYXBwbGVzbWNfbm9kZV9ncm91cCBhY2NlbGVyb21ldGVyX2dyb3VwW10gPSB7CisJeyAicG9zaXRpb24iLCBhcHBsZXNtY19wb3NpdGlvbl9zaG93IH0sCisJeyAiY2FsaWJyYXRlIiwgYXBwbGVzbWNfY2FsaWJyYXRlX3Nob3csIGFwcGxlc21jX2NhbGlicmF0ZV9zdG9yZSB9LAorCXsgfQogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAga2V5X2VudW1lcmF0aW9uX2dyb3VwID0KLQl7IC5hdHRycyA9IGtleV9lbnVtZXJhdGlvbl9hdHRyaWJ1dGVzIH07Ci0KLS8qCi0gKiBNYWNybyBkZWZpbmluZyBTRU5TT1JfREVWSUNFX0FUVFIgZm9yIGEgZmFuIHN5c2ZzIGVudHJpZXMuCi0gKiAgLSBzaG93IGFjdHVhbCBzcGVlZAotICogIC0gc2hvdy9zdG9yZSBtaW5pbXVtIHNwZWVkCi0gKiAgLSBzaG93IG1heGltdW0gc3BlZWQKLSAqICAtIHNob3cgc2FmZSBzcGVlZAotICogIC0gc2hvdy9zdG9yZSB0YXJnZXQgc3BlZWQKLSAqICAtIHNob3cvc3RvcmUgbWFudWFsIG1vZGUKLSAqLwotI2RlZmluZSBzeXNmc19mYW5fc3BlZWRzX29mZnNldChvZmZzZXQpIFwKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihmYW4jI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCBcCi0JCQlhcHBsZXNtY19zaG93X2Zhbl9zcGVlZCwgTlVMTCwgMCwgb2Zmc2V0LTEpOyBcCi1cCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoZmFuIyNvZmZzZXQjI19taW4sIFNfSVJVR08gfCBTX0lXVVNSLCBcCi0JYXBwbGVzbWNfc2hvd19mYW5fc3BlZWQsIGFwcGxlc21jX3N0b3JlX2Zhbl9zcGVlZCwgMSwgb2Zmc2V0LTEpOyBcCi1cCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoZmFuIyNvZmZzZXQjI19tYXgsIFNfSVJVR08sIFwKLQkJCWFwcGxlc21jX3Nob3dfZmFuX3NwZWVkLCBOVUxMLCAyLCBvZmZzZXQtMSk7IFwKLVwKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihmYW4jI29mZnNldCMjX3NhZmUsIFNfSVJVR08sIFwKLQkJCWFwcGxlc21jX3Nob3dfZmFuX3NwZWVkLCBOVUxMLCAzLCBvZmZzZXQtMSk7IFwKLVwKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihmYW4jI29mZnNldCMjX291dHB1dCwgU19JUlVHTyB8IFNfSVdVU1IsIFwKLQlhcHBsZXNtY19zaG93X2Zhbl9zcGVlZCwgYXBwbGVzbWNfc3RvcmVfZmFuX3NwZWVkLCA0LCBvZmZzZXQtMSk7IFwKLVwKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19tYW51YWwsIFNfSVJVR08gfCBTX0lXVVNSLCBcCi0JYXBwbGVzbWNfc2hvd19mYW5fbWFudWFsLCBhcHBsZXNtY19zdG9yZV9mYW5fbWFudWFsLCBvZmZzZXQtMSk7IFwKLVwKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19sYWJlbCwgU19JUlVHTywgXAotCWFwcGxlc21jX3Nob3dfZmFuX3Bvc2l0aW9uLCBOVUxMLCBvZmZzZXQtMSk7IFwKLVwKLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpmYW4jI29mZnNldCMjX2F0dHJpYnV0ZXNbXSA9IHsgXAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuIyNvZmZzZXQjI19pbnB1dC5kZXZfYXR0ci5hdHRyLCBcCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW4jI29mZnNldCMjX21pbi5kZXZfYXR0ci5hdHRyLCBcCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW4jI29mZnNldCMjX21heC5kZXZfYXR0ci5hdHRyLCBcCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW4jI29mZnNldCMjX3NhZmUuZGV2X2F0dHIuYXR0ciwgXAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuIyNvZmZzZXQjI19vdXRwdXQuZGV2X2F0dHIuYXR0ciwgXAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuIyNvZmZzZXQjI19tYW51YWwuZGV2X2F0dHIuYXR0ciwgXAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuIyNvZmZzZXQjI19sYWJlbC5kZXZfYXR0ci5hdHRyLCBcCi0JTlVMTCBcCitzdGF0aWMgc3RydWN0IGFwcGxlc21jX25vZGVfZ3JvdXAgbGlnaHRfc2Vuc29yX2dyb3VwW10gPSB7CisJeyAibGlnaHQiLCBhcHBsZXNtY19saWdodF9zaG93IH0sCisJeyB9CiB9OwogCi0vKgotICogQ3JlYXRlIHRoZSBuZWVkZWQgZnVuY3Rpb25zIGZvciBlYWNoIGZhbiB1c2luZyB0aGUgbWFjcm8gZGVmaW5lZCBhYm92ZQotICogKDQgZmFucyBhcmUgc3VwcG9ydGVkKQotICovCi1zeXNmc19mYW5fc3BlZWRzX29mZnNldCgxKTsKLXN5c2ZzX2Zhbl9zcGVlZHNfb2Zmc2V0KDIpOwotc3lzZnNfZmFuX3NwZWVkc19vZmZzZXQoMyk7Ci1zeXNmc19mYW5fc3BlZWRzX29mZnNldCg0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgZmFuX2F0dHJpYnV0ZV9ncm91cHNbXSA9IHsKLQl7IC5hdHRycyA9IGZhbjFfYXR0cmlidXRlcyB9LAotCXsgLmF0dHJzID0gZmFuMl9hdHRyaWJ1dGVzIH0sCi0JeyAuYXR0cnMgPSBmYW4zX2F0dHJpYnV0ZXMgfSwKLQl7IC5hdHRycyA9IGZhbjRfYXR0cmlidXRlcyB9LAorc3RhdGljIHN0cnVjdCBhcHBsZXNtY19ub2RlX2dyb3VwIGZhbl9ncm91cFtdID0geworCXsgImZhbiVkX2xhYmVsIiwgYXBwbGVzbWNfc2hvd19mYW5fcG9zaXRpb24gfSwKKwl7ICJmYW4lZF9pbnB1dCIsIGFwcGxlc21jX3Nob3dfZmFuX3NwZWVkLCBOVUxMLCAwIH0sCisJeyAiZmFuJWRfbWluIiwgYXBwbGVzbWNfc2hvd19mYW5fc3BlZWQsIGFwcGxlc21jX3N0b3JlX2Zhbl9zcGVlZCwgMSB9LAorCXsgImZhbiVkX21heCIsIGFwcGxlc21jX3Nob3dfZmFuX3NwZWVkLCBOVUxMLCAyIH0sCisJeyAiZmFuJWRfc2FmZSIsIGFwcGxlc21jX3Nob3dfZmFuX3NwZWVkLCBOVUxMLCAzIH0sCisJeyAiZmFuJWRfb3V0cHV0IiwgYXBwbGVzbWNfc2hvd19mYW5fc3BlZWQsIGFwcGxlc21jX3N0b3JlX2Zhbl9zcGVlZCwgNCB9LAorCXsgImZhbiVkX21hbnVhbCIsIGFwcGxlc21jX3Nob3dfZmFuX21hbnVhbCwgYXBwbGVzbWNfc3RvcmVfZmFuX21hbnVhbCB9LAorCXsgfQogfTsKIAotLyoKLSAqIFRlbXBlcmF0dXJlIHNlbnNvcnMgc3lzZnMgZW50cmllcy4KLSAqLwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDApOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDEpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDIpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wNF9sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDMpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wNV9sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDQpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wNl9sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDUpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wN19sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDYpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wOF9sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDcpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wOV9sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDgpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMTBfbGFiZWwsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsLCBOVUxMLCA5KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDExX2xhYmVsLCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3NlbnNvcl9sYWJlbCwgTlVMTCwgMTApOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMTJfbGFiZWwsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsLCBOVUxMLCAxMSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxM19sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDEyKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDE0X2xhYmVsLCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3NlbnNvcl9sYWJlbCwgTlVMTCwgMTMpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMTVfbGFiZWwsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsLCBOVUxMLCAxNCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxNl9sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDE1KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDE3X2xhYmVsLCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3NlbnNvcl9sYWJlbCwgTlVMTCwgMTYpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMThfbGFiZWwsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsLCBOVUxMLCAxNyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxOV9sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDE4KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDIwX2xhYmVsLCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3NlbnNvcl9sYWJlbCwgTlVMTCwgMTkpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMjFfbGFiZWwsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsLCBOVUxMLCAyMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyMl9sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDIxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDIzX2xhYmVsLCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3NlbnNvcl9sYWJlbCwgTlVMTCwgMjIpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMjRfbGFiZWwsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsLCBOVUxMLCAyMyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyNV9sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDI0KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDI2X2xhYmVsLCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3NlbnNvcl9sYWJlbCwgTlVMTCwgMjUpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMjdfbGFiZWwsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsLCBOVUxMLCAyNik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyOF9sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDI3KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDI5X2xhYmVsLCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3NlbnNvcl9sYWJlbCwgTlVMTCwgMjgpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMzBfbGFiZWwsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsLCBOVUxMLCAyOSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzMV9sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDMwKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDMyX2xhYmVsLCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3NlbnNvcl9sYWJlbCwgTlVMTCwgMzEpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMzNfbGFiZWwsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsLCBOVUxMLCAzMik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzNF9sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDMzKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDM1X2xhYmVsLCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3NlbnNvcl9sYWJlbCwgTlVMTCwgMzQpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMzZfbGFiZWwsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsLCBOVUxMLCAzNSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzN19sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDM2KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDM4X2xhYmVsLCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3NlbnNvcl9sYWJlbCwgTlVMTCwgMzcpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMzlfbGFiZWwsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsLCBOVUxMLCAzOCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXA0MF9sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDM5KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfaW5wdXQsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwsIDApOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9pbnB1dCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgMSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX2lucHV0LCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCAyKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDRfaW5wdXQsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwsIDMpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wNV9pbnB1dCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgNCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXA2X2lucHV0LCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCA1KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDdfaW5wdXQsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwsIDYpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wOF9pbnB1dCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgNyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXA5X2lucHV0LCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCA4KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDEwX2lucHV0LCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCA5KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDExX2lucHV0LCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCAxMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxMl9pbnB1dCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgMTEpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMTNfaW5wdXQsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwsIDEyKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDE0X2lucHV0LCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCAxMyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxNV9pbnB1dCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgMTQpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMTZfaW5wdXQsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwsIDE1KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDE3X2lucHV0LCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCAxNik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxOF9pbnB1dCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgMTcpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMTlfaW5wdXQsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwsIDE4KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDIwX2lucHV0LCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCAxOSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyMV9pbnB1dCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgMjApOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMjJfaW5wdXQsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwsIDIxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDIzX2lucHV0LCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCAyMik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyNF9pbnB1dCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgMjMpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMjVfaW5wdXQsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwsIDI0KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDI2X2lucHV0LCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCAyNSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyN19pbnB1dCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgMjYpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMjhfaW5wdXQsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwsIDI3KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDI5X2lucHV0LCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCAyOCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzMF9pbnB1dCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgMjkpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMzFfaW5wdXQsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwsIDMwKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDMyX2lucHV0LCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCAzMSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzM19pbnB1dCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgMzIpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMzRfaW5wdXQsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwsIDMzKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDM1X2lucHV0LCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCAzNCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzNl9pbnB1dCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgMzUpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMzdfaW5wdXQsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwsIDM2KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDM4X2lucHV0LCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCAzNyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzOV9pbnB1dCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgMzgpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wNDBfaW5wdXQsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwsIDM5KTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmxhYmVsX2F0dHJpYnV0ZXNbXSA9IHsKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2xhYmVsLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9sYWJlbC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfbGFiZWwuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXA0X2xhYmVsLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wNV9sYWJlbC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDZfbGFiZWwuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXA3X2xhYmVsLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wOF9sYWJlbC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDlfbGFiZWwuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxMF9sYWJlbC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDExX2xhYmVsLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMTJfbGFiZWwuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxM19sYWJlbC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDE0X2xhYmVsLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMTVfbGFiZWwuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxNl9sYWJlbC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDE3X2xhYmVsLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMThfbGFiZWwuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxOV9sYWJlbC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDIwX2xhYmVsLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMjFfbGFiZWwuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyMl9sYWJlbC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDIzX2xhYmVsLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMjRfbGFiZWwuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyNV9sYWJlbC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDI2X2xhYmVsLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMjdfbGFiZWwuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyOF9sYWJlbC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDI5X2xhYmVsLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMzBfbGFiZWwuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzMV9sYWJlbC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDMyX2xhYmVsLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMzNfbGFiZWwuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzNF9sYWJlbC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDM1X2xhYmVsLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMzZfbGFiZWwuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzN19sYWJlbC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDM4X2xhYmVsLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMzlfbGFiZWwuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXA0MF9sYWJlbC5kZXZfYXR0ci5hdHRyLAotCU5VTEwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICp0ZW1wZXJhdHVyZV9hdHRyaWJ1dGVzW10gPSB7Ci0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wNF9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDVfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXA2X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wN19pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDhfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXA5X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMTBfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDEyX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMTNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxNF9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDE1X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMTZfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxN19pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDE4X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMTlfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyMF9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDIxX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMjJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyM19pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDI0X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMjVfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyNl9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDI3X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMjhfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyOV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDMwX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMzFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDMzX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMzRfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzNV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDM2X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMzdfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzOF9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDM5X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wNDBfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQlOVUxMCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCB0ZW1wZXJhdHVyZV9hdHRyaWJ1dGVzX2dyb3VwID0KLQl7IC5hdHRycyA9IHRlbXBlcmF0dXJlX2F0dHJpYnV0ZXMgfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbGFiZWxfYXR0cmlidXRlc19ncm91cCA9IHsKLQkuYXR0cnMgPSBsYWJlbF9hdHRyaWJ1dGVzCitzdGF0aWMgc3RydWN0IGFwcGxlc21jX25vZGVfZ3JvdXAgdGVtcF9ncm91cFtdID0geworCXsgInRlbXAlZF9sYWJlbCIsIGFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsIH0sCisJeyAidGVtcCVkX2lucHV0IiwgYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSB9LAorCXsgfQogfTsKIAogLyogTW9kdWxlIHN0dWZmICovCiAKIC8qCi0gKiBhcHBsZXNtY19kbWlfbWF0Y2ggLSBmb3VuZCBhIG1hdGNoLiAgcmV0dXJuIG9uZSwgc2hvcnQtY2lyY3VpdGluZyB0aGUgaHVudC4KKyAqIGFwcGxlc21jX2Rlc3Ryb3lfbm9kZXMgLSByZW1vdmUgZmlsZXMgYW5kIGZyZWUgYXNzb2NpYXRlZCBtZW1vcnkKICAqLwotc3RhdGljIGludCBhcHBsZXNtY19kbWlfbWF0Y2goY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgKmlkKQorc3RhdGljIHZvaWQgYXBwbGVzbWNfZGVzdHJveV9ub2RlcyhzdHJ1Y3QgYXBwbGVzbWNfbm9kZV9ncm91cCAqZ3JvdXBzKQogewotCWludCBpID0gMDsKLQlzdHJ1Y3QgZG1pX21hdGNoX2RhdGEqIGRtaV9kYXRhID0gaWQtPmRyaXZlcl9kYXRhOwotCXByaW50ayhLRVJOX0lORk8gImFwcGxlc21jOiAlcyBkZXRlY3RlZDpcbiIsIGlkLT5pZGVudCk7Ci0JYXBwbGVzbWNfYWNjZWxlcm9tZXRlciA9IGRtaV9kYXRhLT5hY2NlbGVyb21ldGVyOwotCXByaW50ayhLRVJOX0lORk8gImFwcGxlc21jOiAgLSBNb2RlbCAlcyBhY2NlbGVyb21ldGVyXG4iLAotCQkJCWFwcGxlc21jX2FjY2VsZXJvbWV0ZXIgPyAid2l0aCIgOiAid2l0aG91dCIpOwotCWFwcGxlc21jX2xpZ2h0ID0gZG1pX2RhdGEtPmxpZ2h0OwotCXByaW50ayhLRVJOX0lORk8gImFwcGxlc21jOiAgLSBNb2RlbCAlcyBsaWdodCBzZW5zb3JzIGFuZCBiYWNrbGlnaHRcbiIsCi0JCQkJCWFwcGxlc21jX2xpZ2h0ID8gIndpdGgiIDogIndpdGhvdXQiKTsKKwlzdHJ1Y3QgYXBwbGVzbWNfbm9kZV9ncm91cCAqZ3JwOworCXN0cnVjdCBhcHBsZXNtY19kZXZfYXR0ciAqbm9kZTsKIAotCWFwcGxlc21jX3RlbXBlcmF0dXJlX3NldCA9ICBkbWlfZGF0YS0+dGVtcGVyYXR1cmVfc2V0OwotCXdoaWxlICh0ZW1wZXJhdHVyZV9zZW5zb3JzX3NldHNbYXBwbGVzbWNfdGVtcGVyYXR1cmVfc2V0XVtpXSAhPSBOVUxMKQotCQlpKys7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiYXBwbGVzbWM6ICAtIE1vZGVsIHdpdGggJWQgdGVtcGVyYXR1cmUgc2Vuc29yc1xuIiwgaSk7Ci0JcmV0dXJuIDE7CisJZm9yIChncnAgPSBncm91cHM7IGdycC0+bm9kZXM7IGdycCsrKSB7CisJCWZvciAobm9kZSA9IGdycC0+bm9kZXM7IG5vZGUtPnNkYS5kZXZfYXR0ci5hdHRyLm5hbWU7IG5vZGUrKykKKwkJCXN5c2ZzX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYua29iaiwKKwkJCQkJICAmbm9kZS0+c2RhLmRldl9hdHRyLmF0dHIpOworCQlrZnJlZShncnAtPm5vZGVzKTsKKwkJZ3JwLT5ub2RlcyA9IE5VTEw7CisJfQorfQorCisvKgorICogYXBwbGVzbWNfY3JlYXRlX25vZGVzIC0gY3JlYXRlIGEgdHdvLWRpbWVuc2lvbmFsIGdyb3VwIG9mIHN5c2ZzIGZpbGVzCisgKi8KK3N0YXRpYyBpbnQgYXBwbGVzbWNfY3JlYXRlX25vZGVzKHN0cnVjdCBhcHBsZXNtY19ub2RlX2dyb3VwICpncm91cHMsIGludCBudW0pCit7CisJc3RydWN0IGFwcGxlc21jX25vZGVfZ3JvdXAgKmdycDsKKwlzdHJ1Y3QgYXBwbGVzbWNfZGV2X2F0dHIgKm5vZGU7CisJc3RydWN0IGF0dHJpYnV0ZSAqYXR0cjsKKwlpbnQgcmV0LCBpOworCisJZm9yIChncnAgPSBncm91cHM7IGdycC0+Zm9ybWF0OyBncnArKykgeworCQlncnAtPm5vZGVzID0ga2NhbGxvYyhudW0gKyAxLCBzaXplb2YoKm5vZGUpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFncnAtPm5vZGVzKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisJCQlub2RlID0gJmdycC0+bm9kZXNbaV07CisJCQlzcHJpbnRmKG5vZGUtPm5hbWUsIGdycC0+Zm9ybWF0LCBpICsgMSk7CisJCQlub2RlLT5zZGEuaW5kZXggPSAoZ3JwLT5vcHRpb24gPDwgMTYpIHwgKGkgJiAweGZmZmYpOworCQkJbm9kZS0+c2RhLmRldl9hdHRyLnNob3cgPSBncnAtPnNob3c7CisJCQlub2RlLT5zZGEuZGV2X2F0dHIuc3RvcmUgPSBncnAtPnN0b3JlOworCQkJYXR0ciA9ICZub2RlLT5zZGEuZGV2X2F0dHIuYXR0cjsKKwkJCWF0dHItPm5hbWUgPSBub2RlLT5uYW1lOworCQkJYXR0ci0+bW9kZSA9IFNfSVJVR08gfCAoZ3JwLT5zdG9yZSA/IFNfSVdVU1IgOiAwKTsKKwkJCXJldCA9IHN5c2ZzX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYua29iaiwgYXR0cik7CisJCQlpZiAocmV0KSB7CisJCQkJYXR0ci0+bmFtZSA9IE5VTEw7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK291dDoKKwlhcHBsZXNtY19kZXN0cm95X25vZGVzKGdyb3Vwcyk7CisJcmV0dXJuIHJldDsKIH0KIAogLyogQ3JlYXRlIGFjY2VsZXJvbWV0ZXIgcmVzc291cmNlcyAqLwpAQCAtMTQyNCw4ICsxMDk0LDEwIEBACiAJc3RydWN0IGlucHV0X2RldiAqaWRldjsKIAlpbnQgcmV0OwogCi0JcmV0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZwZGV2LT5kZXYua29iaiwKLQkJCQkJJmFjY2VsZXJvbWV0ZXJfYXR0cmlidXRlc19ncm91cCk7CisJaWYgKCFzbWNyZWcuaGFzX2FjY2VsZXJvbWV0ZXIpCisJCXJldHVybiAwOworCisJcmV0ID0gYXBwbGVzbWNfY3JlYXRlX25vZGVzKGFjY2VsZXJvbWV0ZXJfZ3JvdXAsIDEpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCkBAIC0xNDYyLDE4NCArMTEzNCw5NiBAQAogCWlucHV0X2ZyZWVfcG9sbGVkX2RldmljZShhcHBsZXNtY19pZGV2KTsKIAogb3V0X3N5c2ZzOgotCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosICZhY2NlbGVyb21ldGVyX2F0dHJpYnV0ZXNfZ3JvdXApOworCWFwcGxlc21jX2Rlc3Ryb3lfbm9kZXMoYWNjZWxlcm9tZXRlcl9ncm91cCk7CiAKIG91dDoKLQlwcmludGsoS0VSTl9XQVJOSU5HICJhcHBsZXNtYzogZHJpdmVyIGluaXQgZmFpbGVkIChyZXQ9JWQpIVxuIiwgcmV0KTsKKwlwcl93YXJuKCJkcml2ZXIgaW5pdCBmYWlsZWQgKHJldD0lZCkhXG4iLCByZXQpOwogCXJldHVybiByZXQ7CiB9CiAKIC8qIFJlbGVhc2UgYWxsIHJlc3NvdXJjZXMgdXNlZCBieSB0aGUgYWNjZWxlcm9tZXRlciAqLwogc3RhdGljIHZvaWQgYXBwbGVzbWNfcmVsZWFzZV9hY2NlbGVyb21ldGVyKHZvaWQpCiB7CisJaWYgKCFzbWNyZWcuaGFzX2FjY2VsZXJvbWV0ZXIpCisJCXJldHVybjsKIAlpbnB1dF91bnJlZ2lzdGVyX3BvbGxlZF9kZXZpY2UoYXBwbGVzbWNfaWRldik7CiAJaW5wdXRfZnJlZV9wb2xsZWRfZGV2aWNlKGFwcGxlc21jX2lkZXYpOwotCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosICZhY2NlbGVyb21ldGVyX2F0dHJpYnV0ZXNfZ3JvdXApOworCWFwcGxlc21jX2Rlc3Ryb3lfbm9kZXMoYWNjZWxlcm9tZXRlcl9ncm91cCk7CiB9CiAKLXN0YXRpYyBfX2luaXRkYXRhIHN0cnVjdCBkbWlfbWF0Y2hfZGF0YSBhcHBsZXNtY19kbWlfZGF0YVtdID0gewotLyogTWFjQm9vayBQcm86IGFjY2VsZXJvbWV0ZXIsIGJhY2tsaWdodCBhbmQgdGVtcGVyYXR1cmUgc2V0IDAgKi8KLQl7IC5hY2NlbGVyb21ldGVyID0gMSwgLmxpZ2h0ID0gMSwgLnRlbXBlcmF0dXJlX3NldCA9IDAgfSwKLS8qIE1hY0Jvb2syOiBhY2NlbGVyb21ldGVyIGFuZCB0ZW1wZXJhdHVyZSBzZXQgMSAqLwotCXsgLmFjY2VsZXJvbWV0ZXIgPSAxLCAubGlnaHQgPSAwLCAudGVtcGVyYXR1cmVfc2V0ID0gMSB9LAotLyogTWFjQm9vazogYWNjZWxlcm9tZXRlciBhbmQgdGVtcGVyYXR1cmUgc2V0IDIgKi8KLQl7IC5hY2NlbGVyb21ldGVyID0gMSwgLmxpZ2h0ID0gMCwgLnRlbXBlcmF0dXJlX3NldCA9IDIgfSwKLS8qIE1hY01pbmk6IHRlbXBlcmF0dXJlIHNldCAzICovCi0JeyAuYWNjZWxlcm9tZXRlciA9IDAsIC5saWdodCA9IDAsIC50ZW1wZXJhdHVyZV9zZXQgPSAzIH0sCi0vKiBNYWNQcm86IHRlbXBlcmF0dXJlIHNldCA0ICovCi0JeyAuYWNjZWxlcm9tZXRlciA9IDAsIC5saWdodCA9IDAsIC50ZW1wZXJhdHVyZV9zZXQgPSA0IH0sCi0vKiBpTWFjOiB0ZW1wZXJhdHVyZSBzZXQgNSAqLwotCXsgLmFjY2VsZXJvbWV0ZXIgPSAwLCAubGlnaHQgPSAwLCAudGVtcGVyYXR1cmVfc2V0ID0gNSB9LAotLyogTWFjQm9vazMsIE1hY0Jvb2s0OiBhY2NlbGVyb21ldGVyIGFuZCB0ZW1wZXJhdHVyZSBzZXQgNiAqLwotCXsgLmFjY2VsZXJvbWV0ZXIgPSAxLCAubGlnaHQgPSAwLCAudGVtcGVyYXR1cmVfc2V0ID0gNiB9LAotLyogTWFjQm9vayBBaXI6IGFjY2VsZXJvbWV0ZXIsIGJhY2tsaWdodCBhbmQgdGVtcGVyYXR1cmUgc2V0IDcgKi8KLQl7IC5hY2NlbGVyb21ldGVyID0gMSwgLmxpZ2h0ID0gMSwgLnRlbXBlcmF0dXJlX3NldCA9IDcgfSwKLS8qIE1hY0Jvb2sgUHJvIDQ6IGFjY2VsZXJvbWV0ZXIsIGJhY2tsaWdodCBhbmQgdGVtcGVyYXR1cmUgc2V0IDggKi8KLQl7IC5hY2NlbGVyb21ldGVyID0gMSwgLmxpZ2h0ID0gMSwgLnRlbXBlcmF0dXJlX3NldCA9IDggfSwKLS8qIE1hY0Jvb2sgUHJvIDM6IGFjY2VsZXJvbWV0ZXIsIGJhY2tsaWdodCBhbmQgdGVtcGVyYXR1cmUgc2V0IDkgKi8KLQl7IC5hY2NlbGVyb21ldGVyID0gMSwgLmxpZ2h0ID0gMSwgLnRlbXBlcmF0dXJlX3NldCA9IDkgfSwKLS8qIGlNYWMgNTogbGlnaHQgc2Vuc29yIG9ubHksIHRlbXBlcmF0dXJlIHNldCAxMCAqLwotCXsgLmFjY2VsZXJvbWV0ZXIgPSAwLCAubGlnaHQgPSAwLCAudGVtcGVyYXR1cmVfc2V0ID0gMTAgfSwKLS8qIE1hY0Jvb2sgNTogYWNjZWxlcm9tZXRlciwgYmFja2xpZ2h0IGFuZCB0ZW1wZXJhdHVyZSBzZXQgMTEgKi8KLQl7IC5hY2NlbGVyb21ldGVyID0gMSwgLmxpZ2h0ID0gMSwgLnRlbXBlcmF0dXJlX3NldCA9IDExIH0sCi0vKiBNYWNCb29rIFBybyA1OiBhY2NlbGVyb21ldGVyLCBiYWNrbGlnaHQgYW5kIHRlbXBlcmF0dXJlIHNldCAxMiAqLwotCXsgLmFjY2VsZXJvbWV0ZXIgPSAxLCAubGlnaHQgPSAxLCAudGVtcGVyYXR1cmVfc2V0ID0gMTIgfSwKLS8qIGlNYWMgODogbGlnaHQgc2Vuc29yIG9ubHksIHRlbXBlcmF0dXJlIHNldCAxMyAqLwotCXsgLmFjY2VsZXJvbWV0ZXIgPSAwLCAubGlnaHQgPSAwLCAudGVtcGVyYXR1cmVfc2V0ID0gMTMgfSwKLS8qIGlNYWMgNjogbGlnaHQgc2Vuc29yIG9ubHksIHRlbXBlcmF0dXJlIHNldCAxNCAqLwotCXsgLmFjY2VsZXJvbWV0ZXIgPSAwLCAubGlnaHQgPSAwLCAudGVtcGVyYXR1cmVfc2V0ID0gMTQgfSwKLS8qIE1hY0Jvb2sgQWlyIDIsMTogYWNjZWxlcm9tZXRlciwgYmFja2xpZ2h0IGFuZCB0ZW1wZXJhdHVyZSBzZXQgMTUgKi8KLQl7IC5hY2NlbGVyb21ldGVyID0gMSwgLmxpZ2h0ID0gMSwgLnRlbXBlcmF0dXJlX3NldCA9IDE1IH0sCi0vKiBNYWNQcm8zLDE6IHRlbXBlcmF0dXJlIHNldCAxNiAqLwotCXsgLmFjY2VsZXJvbWV0ZXIgPSAwLCAubGlnaHQgPSAwLCAudGVtcGVyYXR1cmVfc2V0ID0gMTYgfSwKLS8qIGlNYWMgOSwxOiBsaWdodCBzZW5zb3Igb25seSwgdGVtcGVyYXR1cmUgc2V0IDE3ICovCi0JeyAuYWNjZWxlcm9tZXRlciA9IDAsIC5saWdodCA9IDAsIC50ZW1wZXJhdHVyZV9zZXQgPSAxNyB9LAotLyogTWFjQm9vayBQcm8gMiwyOiBhY2NlbGVyb21ldGVyLCBiYWNrbGlnaHQgYW5kIHRlbXBlcmF0dXJlIHNldCAxOCAqLwotCXsgLmFjY2VsZXJvbWV0ZXIgPSAxLCAubGlnaHQgPSAxLCAudGVtcGVyYXR1cmVfc2V0ID0gMTggfSwKLS8qIE1hY0Jvb2sgUHJvIDUsMzogYWNjZWxlcm9tZXRlciwgYmFja2xpZ2h0IGFuZCB0ZW1wZXJhdHVyZSBzZXQgMTkgKi8KLQl7IC5hY2NlbGVyb21ldGVyID0gMSwgLmxpZ2h0ID0gMSwgLnRlbXBlcmF0dXJlX3NldCA9IDE5IH0sCi0vKiBNYWNCb29rIFBybyA1LDQ6IGFjY2VsZXJvbWV0ZXIsIGJhY2tsaWdodCBhbmQgdGVtcGVyYXR1cmUgc2V0IDIwICovCi0JeyAuYWNjZWxlcm9tZXRlciA9IDEsIC5saWdodCA9IDEsIC50ZW1wZXJhdHVyZV9zZXQgPSAyMCB9LAotLyogTWFjQm9vayBQcm8gNiwyOiBhY2NlbGVyb21ldGVyLCBiYWNrbGlnaHQgYW5kIHRlbXBlcmF0dXJlIHNldCAyMSAqLwotCXsgLmFjY2VsZXJvbWV0ZXIgPSAxLCAubGlnaHQgPSAxLCAudGVtcGVyYXR1cmVfc2V0ID0gMjEgfSwKLS8qIE1hY0Jvb2sgUHJvIDcsMTogYWNjZWxlcm9tZXRlciwgYmFja2xpZ2h0IGFuZCB0ZW1wZXJhdHVyZSBzZXQgMjIgKi8KLQl7IC5hY2NlbGVyb21ldGVyID0gMSwgLmxpZ2h0ID0gMSwgLnRlbXBlcmF0dXJlX3NldCA9IDIyIH0sCi19Oworc3RhdGljIGludCBhcHBsZXNtY19jcmVhdGVfbGlnaHRfc2Vuc29yKHZvaWQpCit7CisJaWYgKCFzbWNyZWcubnVtX2xpZ2h0X3NlbnNvcnMpCisJCXJldHVybiAwOworCXJldHVybiBhcHBsZXNtY19jcmVhdGVfbm9kZXMobGlnaHRfc2Vuc29yX2dyb3VwLCAxKTsKK30KKworc3RhdGljIHZvaWQgYXBwbGVzbWNfcmVsZWFzZV9saWdodF9zZW5zb3Iodm9pZCkKK3sKKwlpZiAoIXNtY3JlZy5udW1fbGlnaHRfc2Vuc29ycykKKwkJcmV0dXJuOworCWFwcGxlc21jX2Rlc3Ryb3lfbm9kZXMobGlnaHRfc2Vuc29yX2dyb3VwKTsKK30KKworc3RhdGljIGludCBhcHBsZXNtY19jcmVhdGVfa2V5X2JhY2tsaWdodCh2b2lkKQoreworCWlmICghc21jcmVnLmhhc19rZXlfYmFja2xpZ2h0KQorCQlyZXR1cm4gMDsKKwlhcHBsZXNtY19sZWRfd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgiYXBwbGVzbWMtbGVkIik7CisJaWYgKCFhcHBsZXNtY19sZWRfd3EpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJmFwcGxlc21jX2JhY2tsaWdodCk7Cit9CisKK3N0YXRpYyB2b2lkIGFwcGxlc21jX3JlbGVhc2Vfa2V5X2JhY2tsaWdodCh2b2lkKQoreworCWlmICghc21jcmVnLmhhc19rZXlfYmFja2xpZ2h0KQorCQlyZXR1cm47CisJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmFwcGxlc21jX2JhY2tsaWdodCk7CisJZGVzdHJveV93b3JrcXVldWUoYXBwbGVzbWNfbGVkX3dxKTsKK30KKworc3RhdGljIGludCBhcHBsZXNtY19kbWlfbWF0Y2goY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgKmlkKQoreworCXJldHVybiAxOworfQogCiAvKiBOb3RlIHRoYXQgRE1JX01BVENIKC4uLiwiTWFjQm9vayIpIHdpbGwgbWF0Y2ggIk1hY0Jvb2tQcm8xLDEiLgogICogU28gd2UgbmVlZCB0byBwdXQgIkFwcGxlIE1hY0Jvb2sgUHJvIiBiZWZvcmUgIkFwcGxlIE1hY0Jvb2siLiAqLwogc3RhdGljIF9faW5pdGRhdGEgc3RydWN0IGRtaV9zeXN0ZW1faWQgYXBwbGVzbWNfd2hpdGVsaXN0W10gPSB7Ci0JeyBhcHBsZXNtY19kbWlfbWF0Y2gsICJBcHBsZSBNYWNCb29rIEFpciAyIiwgewotCSAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBcHBsZSIpLAotCSAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJNYWNCb29rQWlyMiIpIH0sCi0JCSZhcHBsZXNtY19kbWlfZGF0YVsxNV19LAogCXsgYXBwbGVzbWNfZG1pX21hdGNoLCAiQXBwbGUgTWFjQm9vayBBaXIiLCB7CiAJICBETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFwcGxlIiksCiAJICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk1hY0Jvb2tBaXIiKSB9LAotCQkmYXBwbGVzbWNfZG1pX2RhdGFbN119LAotCXsgYXBwbGVzbWNfZG1pX21hdGNoLCAiQXBwbGUgTWFjQm9vayBQcm8gNyIsIHsKLQkgIERNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQXBwbGUiKSwKLQkgIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTWFjQm9va1BybzciKSB9LAotCQkmYXBwbGVzbWNfZG1pX2RhdGFbMjJdfSwKLQl7IGFwcGxlc21jX2RtaV9tYXRjaCwgIkFwcGxlIE1hY0Jvb2sgUHJvIDUsNCIsIHsKLQkgIERNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQXBwbGUiKSwKLQkgIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTWFjQm9va1BybzUsNCIpIH0sCi0JCSZhcHBsZXNtY19kbWlfZGF0YVsyMF19LAotCXsgYXBwbGVzbWNfZG1pX21hdGNoLCAiQXBwbGUgTWFjQm9vayBQcm8gNSwzIiwgewotCSAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBcHBsZSIpLAotCSAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJNYWNCb29rUHJvNSwzIikgfSwKLQkJJmFwcGxlc21jX2RtaV9kYXRhWzE5XX0sCi0JeyBhcHBsZXNtY19kbWlfbWF0Y2gsICJBcHBsZSBNYWNCb29rIFBybyA2IiwgewotCSAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBcHBsZSIpLAotCSAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJNYWNCb29rUHJvNiIpIH0sCi0JCSZhcHBsZXNtY19kbWlfZGF0YVsyMV19LAotCXsgYXBwbGVzbWNfZG1pX21hdGNoLCAiQXBwbGUgTWFjQm9vayBQcm8gNSIsIHsKLQkgIERNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQXBwbGUiKSwKLQkgIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTWFjQm9va1BybzUiKSB9LAotCQkmYXBwbGVzbWNfZG1pX2RhdGFbMTJdfSwKLQl7IGFwcGxlc21jX2RtaV9tYXRjaCwgIkFwcGxlIE1hY0Jvb2sgUHJvIDQiLCB7Ci0JICBETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFwcGxlIiksCi0JICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk1hY0Jvb2tQcm80IikgfSwKLQkJJmFwcGxlc21jX2RtaV9kYXRhWzhdfSwKLQl7IGFwcGxlc21jX2RtaV9tYXRjaCwgIkFwcGxlIE1hY0Jvb2sgUHJvIDMiLCB7Ci0JICBETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFwcGxlIiksCi0JICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk1hY0Jvb2tQcm8zIikgfSwKLQkJJmFwcGxlc21jX2RtaV9kYXRhWzldfSwKLQl7IGFwcGxlc21jX2RtaV9tYXRjaCwgIkFwcGxlIE1hY0Jvb2sgUHJvIDIsMiIsIHsKLQkgIERNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQXBwbGUgQ29tcHV0ZXIsIEluYy4iKSwKLQkgIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTWFjQm9va1BybzIsMiIpIH0sCi0JCSZhcHBsZXNtY19kbWlfZGF0YVsxOF19LAorCX0sCiAJeyBhcHBsZXNtY19kbWlfbWF0Y2gsICJBcHBsZSBNYWNCb29rIFBybyIsIHsKLQkgIERNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCJBcHBsZSIpLAotCSAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsIk1hY0Jvb2tQcm8iKSB9LAotCQkmYXBwbGVzbWNfZG1pX2RhdGFbMF19LAotCXsgYXBwbGVzbWNfZG1pX21hdGNoLCAiQXBwbGUgTWFjQm9vayAodjIpIiwgewotCSAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsIkFwcGxlIiksCi0JICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwiTWFjQm9vazIiKSB9LAotCQkmYXBwbGVzbWNfZG1pX2RhdGFbMV19LAotCXsgYXBwbGVzbWNfZG1pX21hdGNoLCAiQXBwbGUgTWFjQm9vayAodjMpIiwgewotCSAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsIkFwcGxlIiksCi0JICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwiTWFjQm9vazMiKSB9LAotCQkmYXBwbGVzbWNfZG1pX2RhdGFbNl19LAotCXsgYXBwbGVzbWNfZG1pX21hdGNoLCAiQXBwbGUgTWFjQm9vayA0IiwgewogCSAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBcHBsZSIpLAotCSAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJNYWNCb29rNCIpIH0sCi0JCSZhcHBsZXNtY19kbWlfZGF0YVs2XX0sCi0JeyBhcHBsZXNtY19kbWlfbWF0Y2gsICJBcHBsZSBNYWNCb29rIDUiLCB7Ci0JICBETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFwcGxlIiksCi0JICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk1hY0Jvb2s1IikgfSwKLQkJJmFwcGxlc21jX2RtaV9kYXRhWzExXX0sCisJICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk1hY0Jvb2tQcm8iKSB9LAorCX0sCiAJeyBhcHBsZXNtY19kbWlfbWF0Y2gsICJBcHBsZSBNYWNCb29rIiwgewotCSAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsIkFwcGxlIiksCi0JICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwiTWFjQm9vayIpIH0sCi0JCSZhcHBsZXNtY19kbWlfZGF0YVsyXX0sCi0JeyBhcHBsZXNtY19kbWlfbWF0Y2gsICJBcHBsZSBNYWNtaW5pIiwgewotCSAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsIkFwcGxlIiksCi0JICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwiTWFjbWluaSIpIH0sCi0JCSZhcHBsZXNtY19kbWlfZGF0YVszXX0sCi0JeyBhcHBsZXNtY19kbWlfbWF0Y2gsICJBcHBsZSBNYWNQcm8yIiwgewotCSAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsIkFwcGxlIiksCi0JICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwiTWFjUHJvMiIpIH0sCi0JCSZhcHBsZXNtY19kbWlfZGF0YVs0XX0sCi0JeyBhcHBsZXNtY19kbWlfbWF0Y2gsICJBcHBsZSBNYWNQcm8zIiwgewogCSAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBcHBsZSIpLAotCSAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJNYWNQcm8zIikgfSwKLQkJJmFwcGxlc21jX2RtaV9kYXRhWzE2XX0sCisJICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk1hY0Jvb2siKSB9LAorCX0sCisJeyBhcHBsZXNtY19kbWlfbWF0Y2gsICJBcHBsZSBNYWNtaW5pIiwgeworCSAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBcHBsZSIpLAorCSAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJNYWNtaW5pIikgfSwKKwl9LAogCXsgYXBwbGVzbWNfZG1pX21hdGNoLCAiQXBwbGUgTWFjUHJvIiwgewogCSAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBcHBsZSIpLAogCSAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJNYWNQcm8iKSB9LAotCQkmYXBwbGVzbWNfZG1pX2RhdGFbNF19LAotCXsgYXBwbGVzbWNfZG1pX21hdGNoLCAiQXBwbGUgaU1hYyA5LDEiLCB7Ci0JICBETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFwcGxlIEluYy4iKSwKLQkgIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiaU1hYzksMSIpIH0sCi0JCSZhcHBsZXNtY19kbWlfZGF0YVsxN119LAotCXsgYXBwbGVzbWNfZG1pX21hdGNoLCAiQXBwbGUgaU1hYyA4IiwgewotCSAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBcHBsZSIpLAotCSAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJpTWFjOCIpIH0sCi0JCSZhcHBsZXNtY19kbWlfZGF0YVsxM119LAotCXsgYXBwbGVzbWNfZG1pX21hdGNoLCAiQXBwbGUgaU1hYyA2IiwgewotCSAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBcHBsZSIpLAotCSAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJpTWFjNiIpIH0sCi0JCSZhcHBsZXNtY19kbWlfZGF0YVsxNF19LAotCXsgYXBwbGVzbWNfZG1pX21hdGNoLCAiQXBwbGUgaU1hYyA1IiwgewotCSAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBcHBsZSIpLAotCSAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJpTWFjNSIpIH0sCi0JCSZhcHBsZXNtY19kbWlfZGF0YVsxMF19LAorCX0sCiAJeyBhcHBsZXNtY19kbWlfbWF0Y2gsICJBcHBsZSBpTWFjIiwgewotCSAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsIkFwcGxlIiksCi0JICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwiaU1hYyIpIH0sCi0JCSZhcHBsZXNtY19kbWlfZGF0YVs1XX0sCisJICBETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFwcGxlIiksCisJICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgImlNYWMiKSB9LAorCX0sCiAJeyAuaWRlbnQgPSBOVUxMIH0KIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGFwcGxlc21jX2luaXQodm9pZCkKIHsKIAlpbnQgcmV0OwotCWludCBjb3VudDsKLQlpbnQgaTsKIAogCWlmICghZG1pX2NoZWNrX3N5c3RlbShhcHBsZXNtY193aGl0ZWxpc3QpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImFwcGxlc21jOiBzdXBwb3J0ZWQgbGFwdG9wIG5vdCBmb3VuZCFcbiIpOworCQlwcl93YXJuKCJzdXBwb3J0ZWQgbGFwdG9wIG5vdCBmb3VuZCFcbiIpOwogCQlyZXQgPSAtRU5PREVWOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xNjYxLDgzICsxMjQ1LDM0IEBACiAJCWdvdG8gb3V0X2RyaXZlcjsKIAl9CiAKLQlyZXQgPSBzeXNmc19jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LmtvYmosICZkZXZfYXR0cl9uYW1lLmF0dHIpOworCS8qIGNyZWF0ZSByZWdpc3RlciBjYWNoZSAqLworCXJldCA9IGFwcGxlc21jX2luaXRfc21jcmVnKCk7CiAJaWYgKHJldCkKIAkJZ290byBvdXRfZGV2aWNlOwogCi0JLyogQ3JlYXRlIGtleSBlbnVtZXJhdGlvbiBzeXNmcyBmaWxlcyAqLwotCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosICZrZXlfZW51bWVyYXRpb25fZ3JvdXApOworCXJldCA9IGFwcGxlc21jX2NyZWF0ZV9ub2RlcyhpbmZvX2dyb3VwLCAxKTsKIAlpZiAocmV0KQotCQlnb3RvIG91dF9uYW1lOworCQlnb3RvIG91dF9zbWNyZWc7CiAKLQkvKiBjcmVhdGUgZmFuIGZpbGVzICovCi0JY291bnQgPSBhcHBsZXNtY19nZXRfZmFuX2NvdW50KCk7Ci0JaWYgKGNvdW50IDwgMCkKLQkJcHJpbnRrKEtFUk5fRVJSICJhcHBsZXNtYzogQ2Fubm90IGdldCB0aGUgbnVtYmVyIG9mIGZhbnMuXG4iKTsKLQllbHNlCi0JCXByaW50ayhLRVJOX0lORk8gImFwcGxlc21jOiAlZCBmYW5zIGZvdW5kLlxuIiwgY291bnQpOworCXJldCA9IGFwcGxlc21jX2NyZWF0ZV9ub2RlcyhmYW5fZ3JvdXAsIHNtY3JlZy5mYW5fY291bnQpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2luZm87CiAKLQlpZiAoY291bnQgPiA0KSB7Ci0JCWNvdW50ID0gNDsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXBwbGVzbWM6IE1vcmUgdGhhbiA0IGZhbnMgZm91bmQsIgotCQkgICAgICAgIiBidXQgYXQgbW9zdCA0IGZhbnMgYXJlIHN1cHBvcnRlZCIKLQkJICAgICAgICIgYnkgdGhlIGRyaXZlci5cbiIpOwotCX0KKwlyZXQgPSBhcHBsZXNtY19jcmVhdGVfbm9kZXModGVtcF9ncm91cCwgc21jcmVnLnRlbXBfY291bnQpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2ZhbnM7CiAKLQl3aGlsZSAoZmFuc19oYW5kbGVkIDwgY291bnQpIHsKLQkJcmV0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZwZGV2LT5kZXYua29iaiwKLQkJCQkJICZmYW5fYXR0cmlidXRlX2dyb3Vwc1tmYW5zX2hhbmRsZWRdKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gb3V0X2ZhbnM7Ci0JCWZhbnNfaGFuZGxlZCsrOwotCX0KKwlyZXQgPSBhcHBsZXNtY19jcmVhdGVfYWNjZWxlcm9tZXRlcigpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X3RlbXBlcmF0dXJlOwogCi0JZm9yIChpID0gMDsKLQkgICAgIHRlbXBlcmF0dXJlX3NlbnNvcnNfc2V0c1thcHBsZXNtY190ZW1wZXJhdHVyZV9zZXRdW2ldICE9IE5VTEw7Ci0JICAgICBpKyspIHsKLQkJaWYgKHRlbXBlcmF0dXJlX2F0dHJpYnV0ZXNbaV0gPT0gTlVMTCB8fAotCQkgICAgbGFiZWxfYXR0cmlidXRlc1tpXSA9PSBOVUxMKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImFwcGxlc21jOiBNb3JlIHRlbXBlcmF0dXJlIHNlbnNvcnMgIgotCQkJCSJpbiB0ZW1wZXJhdHVyZV9zZW5zb3JzX3NldHMgKGF0IGxlYXN0ICVpKSIKLQkJCQkidGhhbiBhdmFpbGFibGUgc3lzZnMgZmlsZXMgaW4gIgotCQkJCSJ0ZW1wZXJhdHVyZV9hdHRyaWJ1dGVzICglaSksIHBsZWFzZSByZXBvcnQgIgotCQkJCSJ0aGlzIGJ1Zy5cbiIsIGksIGktMSk7Ci0JCQlnb3RvIG91dF90ZW1wZXJhdHVyZTsKLQkJfQotCQlyZXQgPSBzeXNmc19jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LmtvYmosCi0JCQkJCQl0ZW1wZXJhdHVyZV9hdHRyaWJ1dGVzW2ldKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gb3V0X3RlbXBlcmF0dXJlOwotCQlyZXQgPSBzeXNmc19jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LmtvYmosCi0JCQkJCQlsYWJlbF9hdHRyaWJ1dGVzW2ldKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gb3V0X3RlbXBlcmF0dXJlOwotCX0KKwlyZXQgPSBhcHBsZXNtY19jcmVhdGVfbGlnaHRfc2Vuc29yKCk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfYWNjZWxlcm9tZXRlcjsKIAotCWlmIChhcHBsZXNtY19hY2NlbGVyb21ldGVyKSB7Ci0JCXJldCA9IGFwcGxlc21jX2NyZWF0ZV9hY2NlbGVyb21ldGVyKCk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIG91dF90ZW1wZXJhdHVyZTsKLQl9Ci0KLQlpZiAoYXBwbGVzbWNfbGlnaHQpIHsKLQkJLyogQWRkIGxpZ2h0IHNlbnNvciBmaWxlICovCi0JCXJldCA9IHN5c2ZzX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYua29iaiwgJmRldl9hdHRyX2xpZ2h0LmF0dHIpOwotCQlpZiAocmV0KQotCQkJZ290byBvdXRfYWNjZWxlcm9tZXRlcjsKLQotCQkvKiBDcmVhdGUgdGhlIHdvcmtxdWV1ZSAqLwotCQlhcHBsZXNtY19sZWRfd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgiYXBwbGVzbWMtbGVkIik7Ci0JCWlmICghYXBwbGVzbWNfbGVkX3dxKSB7Ci0JCQlyZXQgPSAtRU5PTUVNOwotCQkJZ290byBvdXRfbGlnaHRfc3lzZnM7Ci0JCX0KLQotCQkvKiByZWdpc3RlciBhcyBhIGxlZCBkZXZpY2UgKi8KLQkJcmV0ID0gbGVkX2NsYXNzZGV2X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZhcHBsZXNtY19iYWNrbGlnaHQpOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gb3V0X2xpZ2h0X3dxOwotCX0KKwlyZXQgPSBhcHBsZXNtY19jcmVhdGVfa2V5X2JhY2tsaWdodCgpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2xpZ2h0X3N5c2ZzOwogCiAJaHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZwZGV2LT5kZXYpOwogCWlmIChJU19FUlIoaHdtb25fZGV2KSkgewpAQCAtMTc0NSwzMiArMTI4MCwyMiBAQAogCQlnb3RvIG91dF9saWdodF9sZWRjbGFzczsKIAl9CiAKLQlwcmludGsoS0VSTl9JTkZPICJhcHBsZXNtYzogZHJpdmVyIHN1Y2Nlc3NmdWxseSBsb2FkZWQuXG4iKTsKLQogCXJldHVybiAwOwogCiBvdXRfbGlnaHRfbGVkY2xhc3M6Ci0JaWYgKGFwcGxlc21jX2xpZ2h0KQotCQlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmYXBwbGVzbWNfYmFja2xpZ2h0KTsKLW91dF9saWdodF93cToKLQlpZiAoYXBwbGVzbWNfbGlnaHQpCi0JCWRlc3Ryb3lfd29ya3F1ZXVlKGFwcGxlc21jX2xlZF93cSk7CisJYXBwbGVzbWNfcmVsZWFzZV9rZXlfYmFja2xpZ2h0KCk7CiBvdXRfbGlnaHRfc3lzZnM6Ci0JaWYgKGFwcGxlc21jX2xpZ2h0KQotCQlzeXNmc19yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LmtvYmosICZkZXZfYXR0cl9saWdodC5hdHRyKTsKKwlhcHBsZXNtY19yZWxlYXNlX2xpZ2h0X3NlbnNvcigpOwogb3V0X2FjY2VsZXJvbWV0ZXI6Ci0JaWYgKGFwcGxlc21jX2FjY2VsZXJvbWV0ZXIpCi0JCWFwcGxlc21jX3JlbGVhc2VfYWNjZWxlcm9tZXRlcigpOworCWFwcGxlc21jX3JlbGVhc2VfYWNjZWxlcm9tZXRlcigpOwogb3V0X3RlbXBlcmF0dXJlOgotCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosICZsYWJlbF9hdHRyaWJ1dGVzX2dyb3VwKTsKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAmdGVtcGVyYXR1cmVfYXR0cmlidXRlc19ncm91cCk7CisJYXBwbGVzbWNfZGVzdHJveV9ub2Rlcyh0ZW1wX2dyb3VwKTsKIG91dF9mYW5zOgotCXdoaWxlIChmYW5zX2hhbmRsZWQpCi0JCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosCi0JCQkJICAgJmZhbl9hdHRyaWJ1dGVfZ3JvdXBzWy0tZmFuc19oYW5kbGVkXSk7Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZwZGV2LT5kZXYua29iaiwgJmtleV9lbnVtZXJhdGlvbl9ncm91cCk7Ci1vdXRfbmFtZToKLQlzeXNmc19yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LmtvYmosICZkZXZfYXR0cl9uYW1lLmF0dHIpOworCWFwcGxlc21jX2Rlc3Ryb3lfbm9kZXMoZmFuX2dyb3VwKTsKK291dF9pbmZvOgorCWFwcGxlc21jX2Rlc3Ryb3lfbm9kZXMoaW5mb19ncm91cCk7CitvdXRfc21jcmVnOgorCWFwcGxlc21jX2Rlc3Ryb3lfc21jcmVnKCk7CiBvdXRfZGV2aWNlOgogCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHBkZXYpOwogb3V0X2RyaXZlcjoKQEAgLTE3NzgsMzIgKzEzMDMsMjMgQEAKIG91dF9yZWdpb246CiAJcmVsZWFzZV9yZWdpb24oQVBQTEVTTUNfREFUQV9QT1JULCBBUFBMRVNNQ19OUl9QT1JUUyk7CiBvdXQ6Ci0JcHJpbnRrKEtFUk5fV0FSTklORyAiYXBwbGVzbWM6IGRyaXZlciBpbml0IGZhaWxlZCAocmV0PSVkKSFcbiIsIHJldCk7CisJcHJfd2FybigiZHJpdmVyIGluaXQgZmFpbGVkIChyZXQ9JWQpIVxuIiwgcmV0KTsKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgYXBwbGVzbWNfZXhpdCh2b2lkKQogewogCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGh3bW9uX2Rldik7Ci0JaWYgKGFwcGxlc21jX2xpZ2h0KSB7Ci0JCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZhcHBsZXNtY19iYWNrbGlnaHQpOwotCQlkZXN0cm95X3dvcmtxdWV1ZShhcHBsZXNtY19sZWRfd3EpOwotCQlzeXNmc19yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LmtvYmosICZkZXZfYXR0cl9saWdodC5hdHRyKTsKLQl9Ci0JaWYgKGFwcGxlc21jX2FjY2VsZXJvbWV0ZXIpCi0JCWFwcGxlc21jX3JlbGVhc2VfYWNjZWxlcm9tZXRlcigpOwotCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosICZsYWJlbF9hdHRyaWJ1dGVzX2dyb3VwKTsKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAmdGVtcGVyYXR1cmVfYXR0cmlidXRlc19ncm91cCk7Ci0Jd2hpbGUgKGZhbnNfaGFuZGxlZCkKLQkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZwZGV2LT5kZXYua29iaiwKLQkJCQkgICAmZmFuX2F0dHJpYnV0ZV9ncm91cHNbLS1mYW5zX2hhbmRsZWRdKTsKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAma2V5X2VudW1lcmF0aW9uX2dyb3VwKTsKLQlzeXNmc19yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LmtvYmosICZkZXZfYXR0cl9uYW1lLmF0dHIpOworCWFwcGxlc21jX3JlbGVhc2Vfa2V5X2JhY2tsaWdodCgpOworCWFwcGxlc21jX3JlbGVhc2VfbGlnaHRfc2Vuc29yKCk7CisJYXBwbGVzbWNfcmVsZWFzZV9hY2NlbGVyb21ldGVyKCk7CisJYXBwbGVzbWNfZGVzdHJveV9ub2Rlcyh0ZW1wX2dyb3VwKTsKKwlhcHBsZXNtY19kZXN0cm95X25vZGVzKGZhbl9ncm91cCk7CisJYXBwbGVzbWNfZGVzdHJveV9ub2RlcyhpbmZvX2dyb3VwKTsKKwlhcHBsZXNtY19kZXN0cm95X3NtY3JlZygpOwogCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHBkZXYpOwogCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhcHBsZXNtY19kcml2ZXIpOwogCXJlbGVhc2VfcmVnaW9uKEFQUExFU01DX0RBVEFfUE9SVCwgQVBQTEVTTUNfTlJfUE9SVFMpOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiYXBwbGVzbWM6IGRyaXZlciB1bmxvYWRlZC5cbiIpOwogfQogCiBtb2R1bGVfaW5pdChhcHBsZXNtY19pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vYXNiMTAwLmMgYi9kcml2ZXJzL2h3bW9uL2FzYjEwMC5jCmluZGV4IDdkYWRhNTUuLmMwMmEwNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYXNiMTAwLmMKKysrIGIvZHJpdmVycy9od21vbi9hc2IxMDAuYwpAQCAtMzYsNiArMzYsOCBAQAogICAgIGFzYjEwMAk3CTMJMQk0CTB4MzEJMHgwNjk0CXllcwlubwogKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgpAQCAtNzAxLDggKzcwMyw3IEBACiAJaW50IHZhbDEsIHZhbDI7CiAKIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpIHsKLQkJcHJfZGVidWcoImFzYjEwMC5vOiBkZXRlY3QgZmFpbGVkLCAiCi0JCQkJInNtYnVzIGJ5dGUgZGF0YSBub3Qgc3VwcG9ydGVkIVxuIik7CisJCXByX2RlYnVnKCJkZXRlY3QgZmFpbGVkLCBzbWJ1cyBieXRlIGRhdGEgbm90IHN1cHBvcnRlZCFcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTcxNSw3ICs3MTYsNyBAQAogCQkJKCgoISh2YWwxICYgMHg4MCkpICYmICh2YWwyICE9IDB4OTQpKSB8fAogCQkJLyogQ2hlY2sgZm9yIEFTQjEwMCBJRCAoaGlnaCBieXRlICkgKi8KIAkJCSgodmFsMSAmIDB4ODApICYmICh2YWwyICE9IDB4MDYpKSkpIHsKLQkJcHJfZGVidWcoImFzYjEwMDogZGV0ZWN0IGZhaWxlZCwgYmFkIGNoaXAgaWQgMHglMDJ4IVxuIiwgdmFsMik7CisJCXByX2RlYnVnKCJkZXRlY3QgZmFpbGVkLCBiYWQgY2hpcCBpZCAweCUwMnghXG4iLCB2YWwyKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC03NDQsNyArNzQ1LDcgQEAKIAogCWRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYXNiMTAwX2RhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRhdGEpIHsKLQkJcHJfZGVidWcoImFzYjEwMC5vOiBwcm9iZSBmYWlsZWQsIGt6YWxsb2MgZmFpbGVkIVxuIik7CisJCXByX2RlYnVnKCJwcm9iZSBmYWlsZWQsIGt6YWxsb2MgZmFpbGVkIVxuIik7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gRVJST1IwOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vYXN1c19hdGswMTEwLmMgYi9kcml2ZXJzL2h3bW9uL2FzdXNfYXRrMDExMC5jCmluZGV4IDIzYjg1NTUuLjJkNjhjZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYXN1c19hdGswMTEwLmMKKysrIGIvZHJpdmVycy9od21vbi9hc3VzX2F0azAxMTAuYwpAQCAtNSw2ICs1LDggQEAKICAqIFNlZSBDT1BZSU5HIGluIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5IG9mIHRoZSBrZXJuZWwgdHJlZS4KICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KQEAgLTE0MTQsMTQgKzE0MTYsMTMgQEAKIAogCS8qIE1ha2Ugc3VyZSBpdCdzIHNhZmUgdG8gYWNjZXNzIHRoZSBkZXZpY2UgdGhyb3VnaCBBQ1BJICovCiAJaWYgKCFhY3BpX3Jlc291cmNlc19hcmVfZW5mb3JjZWQoKSkgewotCQlwcl9lcnIoImF0azogUmVzb3VyY2VzIG5vdCBzYWZlbHkgdXNhYmxlIGR1ZSB0byAiCi0JCSAgICAgICAiYWNwaV9lbmZvcmNlX3Jlc291cmNlcyBrZXJuZWwgcGFyYW1ldGVyXG4iKTsKKwkJcHJfZXJyKCJSZXNvdXJjZXMgbm90IHNhZmVseSB1c2FibGUgZHVlIHRvIGFjcGlfZW5mb3JjZV9yZXNvdXJjZXMga2VybmVsIHBhcmFtZXRlclxuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCiAJcmV0ID0gYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKCZhdGtfZHJpdmVyKTsKIAlpZiAocmV0KQotCQlwcl9pbmZvKCJhdGs6IGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlciBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQlwcl9pbmZvKCJhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIgZmFpbGVkOiAlZFxuIiwgcmV0KTsKIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2NvcmV0ZW1wLmMgYi9kcml2ZXJzL2h3bW9uL2NvcmV0ZW1wLmMKaW5kZXggNDJkZTk4ZC4uMTk0Y2EwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9jb3JldGVtcC5jCisrKyBiL2RyaXZlcnMvaHdtb24vY29yZXRlbXAuYwpAQCAtMjAsNiArMjAsOCBAQAogICogMDIxMTAtMTMwMSBVU0EuCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTQ0NSw4ICs0NDcsOCBAQAogCSAqIHdpdGhvdXQgdGhlcm1hbCBzZW5zb3JzIHdpbGwgYmUgZmlsdGVyZWQgb3V0LgogCSAqLwogCWlmICghY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9EVFMpKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gRFJWTkFNRSAiOiBDUFUgKG1vZGVsPTB4JXgpIgotCQkgICAgICAgIiBoYXMgbm8gdGhlcm1hbCBzZW5zb3IuXG4iLCBjLT54ODZfbW9kZWwpOworCQlwcl9pbmZvKCJDUFUgKG1vZGVsPTB4JXgpIGhhcyBubyB0aGVybWFsIHNlbnNvclxuIiwKKwkJCWMtPng4Nl9tb2RlbCk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtNDY2LDcgKzQ2OCw3IEBACiAJcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhEUlZOQU1FLCBjcHUpOwogCWlmICghcGRldikgewogCQllcnIgPSAtRU5PTUVNOwotCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBEZXZpY2UgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlwcl9lcnIoIkRldmljZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTQ3OCw4ICs0ODAsNyBAQAogCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZChwZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IERldmljZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwKLQkJICAgICAgIGVycik7CisJCXByX2VycigiRGV2aWNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwogCQlnb3RvIGV4aXRfZGV2aWNlX2ZyZWU7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2RtZTE3MzcuYyBiL2RyaXZlcnMvaHdtb24vZG1lMTczNy5jCmluZGV4IDk4MGMxN2QuLmU5YTYxMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vZG1lMTczNy5jCisrKyBiL2RyaXZlcnMvaHdtb24vZG1lMTczNy5jCkBAIC0yNSw2ICsyNSw4IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtMjQ0Niw3ICsyNDQ4LDcgQEAKIAkvKiBHZXQgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgcnVudGltZSByZWdpc3RlcnMgKi8KIAlpZiAoIShiYXNlX2FkZHIgPSAoZG1lMTczN19zaW9faW5iKHNpb19jaXAsIDB4NjApIDw8IDgpIHwKIAkJCSAgIGRtZTE3Mzdfc2lvX2luYihzaW9fY2lwLCAweDYxKSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJkbWUxNzM3OiBCYXNlIGFkZHJlc3Mgbm90IHNldC5cbiIpOworCQlwcl9lcnIoIkJhc2UgYWRkcmVzcyBub3Qgc2V0XG4iKTsKIAkJZXJyID0gLUVOT0RFVjsKIAkJZ290byBleGl0OwogCX0KQEAgLTI0NzUsMjAgKzI0NzcsMTggQEAKIAkJZ290byBleGl0OwogCiAJaWYgKCEocGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygiZG1lMTczNyIsIGFkZHIpKSkgewotCQlwcmludGsoS0VSTl9FUlIgImRtZTE3Mzc6IEZhaWxlZCB0byBhbGxvY2F0ZSBkZXZpY2UuXG4iKTsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gYWxsb2NhdGUgZGV2aWNlXG4iKTsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBleGl0OwogCX0KIAogCWlmICgoZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGRldiwgJnJlcywgMSkpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZG1lMTczNzogRmFpbGVkIHRvIGFkZCBkZXZpY2UgcmVzb3VyY2UgIgotCQkgICAgICAgIihlcnIgPSAlZCkuXG4iLCBlcnIpOworCQlwcl9lcnIoIkZhaWxlZCB0byBhZGQgZGV2aWNlIHJlc291cmNlIChlcnIgPSAlZClcbiIsIGVycik7CiAJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwogCX0KIAogCWlmICgoZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZChwZGV2KSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJkbWUxNzM3OiBGYWlsZWQgdG8gYWRkIGRldmljZSAoZXJyID0gJWQpLlxuIiwKLQkJICAgICAgIGVycik7CisJCXByX2VycigiRmFpbGVkIHRvIGFkZCBkZXZpY2UgKGVyciA9ICVkKVxuIiwgZXJyKTsKIAkJZ290byBleGl0X2RldmljZV9wdXQ7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2RzNjIwLmMgYi9kcml2ZXJzL2h3bW9uL2RzNjIwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU3OTU3YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaHdtb24vZHM2MjAuYwpAQCAtMCwwICsxLDMzNyBAQAorLyoKKyAqICBkczYyMC5jIC0gU3VwcG9ydCBmb3IgdGVtcGVyYXR1cmUgc2Vuc29yIGFuZCB0aGVybW9zdGF0IERTNjIwCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMCwgMjAxMSBSb2xhbmQgU3RpZ2dlIDxzdGlnZ2VAYW50Y29tLmRlPgorICoKKyAqICBiYXNlZCBvbiBkczE2MjEuYyBieSBDaHJpc3RpYW4gVy4gWnVja3NjaHdlcmR0ICA8emFueUB0cmlxLm5ldD4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXN5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy9kczYyMC5oPgorCisvKgorICogTWFueSBEUzYyMCBjb25zdGFudHMgc3BlY2lmaWVkIGJlbG93CisgKiAgMTUgICAxNCAgIDEzICAgMTIgICAxMSAgIDEwICAgMDkgICAgMDgKKyAqIHxEb25lfE5WQiB8VEhGIHxUTEYgfFIxICB8UjAgIHxBVVRPQ3wxU0hPVHwKKyAqCisgKiAgMDcgICAwNiAgIDA1ICAgMDQgICAwMyAgIDAyICAgMDEgICAgMDAKKyAqIHxQTzIgfFBPMSB8QTIgIHxBMSAgfEEwICB8ICAgIHwgICAgIHwgICAgIHwKKyAqLworI2RlZmluZSBEUzYyMF9SRUdfQ09ORklHX0RPTkUJCTB4ODAwMAorI2RlZmluZSBEUzYyMF9SRUdfQ09ORklHX05WQgkJMHg0MDAwCisjZGVmaW5lIERTNjIwX1JFR19DT05GSUdfVEhGCQkweDIwMDAKKyNkZWZpbmUgRFM2MjBfUkVHX0NPTkZJR19UTEYJCTB4MTAwMAorI2RlZmluZSBEUzYyMF9SRUdfQ09ORklHX1IxCQkweDA4MDAKKyNkZWZpbmUgRFM2MjBfUkVHX0NPTkZJR19SMAkJMHgwNDAwCisjZGVmaW5lIERTNjIwX1JFR19DT05GSUdfQVVUT0MJCTB4MDIwMAorI2RlZmluZSBEUzYyMF9SRUdfQ09ORklHXzFTSE9UCQkweDAxMDAKKyNkZWZpbmUgRFM2MjBfUkVHX0NPTkZJR19QTzIJCTB4MDA4MAorI2RlZmluZSBEUzYyMF9SRUdfQ09ORklHX1BPMQkJMHgwMDQwCisjZGVmaW5lIERTNjIwX1JFR19DT05GSUdfQTIJCTB4MDAyMAorI2RlZmluZSBEUzYyMF9SRUdfQ09ORklHX0ExCQkweDAwMTAKKyNkZWZpbmUgRFM2MjBfUkVHX0NPTkZJR19BMAkJMHgwMDA4CisKKy8qIFRoZSBEUzYyMCByZWdpc3RlcnMgKi8KK3N0YXRpYyBjb25zdCB1OCBEUzYyMF9SRUdfVEVNUFszXSA9IHsKKwkweEFBLAkJCS8qIGlucHV0LCB3b3JkLCBSTyAqLworCTB4QTIsCQkJLyogbWluLCB3b3JkLCBSVyAqLworCTB4QTAsCQkJLyogbWF4LCB3b3JkLCBSVyAqLworfTsKKworI2RlZmluZSBEUzYyMF9SRUdfQ09ORgkJMHhBQwkvKiB3b3JkLCBSVyAqLworI2RlZmluZSBEUzYyMF9DT01fU1RBUlQJCTB4NTEJLyogbm8gZGF0YSAqLworI2RlZmluZSBEUzYyMF9DT01fU1RPUAkJMHgyMgkvKiBubyBkYXRhICovCisKKy8qIEVhY2ggY2xpZW50IGhhcyB0aGlzIGFkZGl0aW9uYWwgZGF0YSAqLworc3RydWN0IGRzNjIwX2RhdGEgeworCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKKwlzdHJ1Y3QgbXV0ZXggdXBkYXRlX2xvY2s7CisJY2hhciB2YWxpZDsJCS8qICE9MCBpZiBmb2xsb3dpbmcgZmllbGRzIGFyZSB2YWxpZCAqLworCXVuc2lnbmVkIGxvbmcgbGFzdF91cGRhdGVkOwkvKiBJbiBqaWZmaWVzICovCisKKwl1MTYgdGVtcFszXTsJCS8qIFJlZ2lzdGVyIHZhbHVlcywgd29yZCAqLworfTsKKworLyoKKyAqICBUZW1wZXJhdHVyZSByZWdpc3RlcnMgYXJlIHdvcmQtc2l6ZWQuCisgKiAgRFM2MjAgdXNlcyBhIGhpZ2gtYnl0ZSBmaXJzdCBjb252ZW50aW9uLCB3aGljaCBpcyBleGFjdGx5IG9wcG9zaXRlIHRvCisgKiAgdGhlIFNNQnVzIHN0YW5kYXJkLgorICovCitzdGF0aWMgaW50IGRzNjIwX3JlYWRfdGVtcChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcpCit7CisJaW50IHJldDsKKworCXJldCA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHJlZyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJcmV0dXJuIHN3YWIxNihyZXQpOworfQorCitzdGF0aWMgaW50IGRzNjIwX3dyaXRlX3RlbXAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1MTYgdmFsdWUpCit7CisJcmV0dXJuIGkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCByZWcsIHN3YWIxNih2YWx1ZSkpOworfQorCitzdGF0aWMgdm9pZCBkczYyMF9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBkczYyMF9wbGF0Zm9ybV9kYXRhICpkczYyMF9pbmZvID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKwl1MTYgY29uZiwgbmV3X2NvbmY7CisKKwluZXdfY29uZiA9IGNvbmYgPQorCSAgICBzd2FiMTYoaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgRFM2MjBfUkVHX0NPTkYpKTsKKworCS8qIHN3aXRjaCB0byBjb250aW51b3VzIGNvbnZlcnNpb24gbW9kZSAqLworCW5ld19jb25mICY9IH5EUzYyMF9SRUdfQ09ORklHXzFTSE9UOworCS8qIGFscmVhZHkgaGlnaCBhdCBwb3dlci1vbiwgYnV0IGRvbid0IHRydXN0IHRoZSBCSU9TISAqLworCW5ld19jb25mIHw9IERTNjIwX1JFR19DT05GSUdfUE8yOworCS8qIHRoZXJtb3N0YXQgbW9kZSBhY2NvcmRpbmcgdG8gcGxhdGZvcm0gZGF0YSAqLworCWlmIChkczYyMF9pbmZvICYmIGRzNjIwX2luZm8tPnBvbW9kZSA9PSAxKQorCQluZXdfY29uZiAmPSB+RFM2MjBfUkVHX0NPTkZJR19QTzE7IC8qIFBPX0xPVyAqLworCWVsc2UgaWYgKGRzNjIwX2luZm8gJiYgZHM2MjBfaW5mby0+cG9tb2RlID09IDIpCisJCW5ld19jb25mIHw9IERTNjIwX1JFR19DT05GSUdfUE8xOyAvKiBQT19ISUdIICovCisJZWxzZQorCQluZXdfY29uZiAmPSB+RFM2MjBfUkVHX0NPTkZJR19QTzI7IC8qIGFsd2F5cyBsb3cgKi8KKwkvKiB3aXRoIGhpZ2hlc3QgcHJlY2lzaW9uICovCisJbmV3X2NvbmYgfD0gRFM2MjBfUkVHX0NPTkZJR19SMSB8IERTNjIwX1JFR19DT05GSUdfUjA7CisKKwlpZiAoY29uZiAhPSBuZXdfY29uZikKKwkJaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIERTNjIwX1JFR19DT05GLAorCQkJCQkgIHN3YWIxNihuZXdfY29uZikpOworCisJLyogc3RhcnQgY29udmVyc2lvbiAqLworCWkyY19zbWJ1c193cml0ZV9ieXRlKGNsaWVudCwgRFM2MjBfQ09NX1NUQVJUKTsKK30KKworc3RhdGljIHN0cnVjdCBkczYyMF9kYXRhICpkczYyMF91cGRhdGVfY2xpZW50KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBkczYyMF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGRzNjIwX2RhdGEgKnJldCA9IGRhdGE7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3VwZGF0ZWQgKyBIWiArIEhaIC8gMikKKwkgICAgfHwgIWRhdGEtPnZhbGlkKSB7CisJCWludCBpOworCQlpbnQgcmVzOworCisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiU3RhcnRpbmcgZHM2MjAgdXBkYXRlXG4iKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkYXRhLT50ZW1wKTsgaSsrKSB7CisJCQlyZXMgPSBkczYyMF9yZWFkX3RlbXAoY2xpZW50LAorCQkJCQkgICAgICBEUzYyMF9SRUdfVEVNUFtpXSk7CisJCQlpZiAocmVzIDwgMCkgeworCQkJCXJldCA9IEVSUl9QVFIocmVzKTsKKwkJCQlnb3RvIGFib3J0OworCQkJfQorCisJCQlkYXRhLT50ZW1wW2ldID0gcmVzOworCQl9CisKKwkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKKwkJZGF0YS0+dmFsaWQgPSAxOworCX0KK2Fib3J0OgorCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhLAorCQkJIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGEpOworCXN0cnVjdCBkczYyMF9kYXRhICpkYXRhID0gZHM2MjBfdXBkYXRlX2NsaWVudChkZXYpOworCisJaWYgKElTX0VSUihkYXRhKSkKKwkJcmV0dXJuIFBUUl9FUlIoZGF0YSk7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgKChkYXRhLT50ZW1wW2F0dHItPmluZGV4XSAvIDgpICogNjI1KSAvIDEwKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X3RlbXAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGEsCisJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgcmVzOworCWxvbmcgdmFsOworCisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRhKTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBkczYyMF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlyZXMgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ2YWwpOworCisJaWYgKHJlcykKKwkJcmV0dXJuIHJlczsKKworCXZhbCA9ICh2YWwgKiAxMCAvIDYyNSkgKiA4OworCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnRlbXBbYXR0ci0+aW5kZXhdID0gdmFsOworCWRzNjIwX3dyaXRlX3RlbXAoY2xpZW50LCBEUzYyMF9SRUdfVEVNUFthdHRyLT5pbmRleF0sCisJCQkgZGF0YS0+dGVtcFthdHRyLT5pbmRleF0pOworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkYSwKKwkJCSAgY2hhciAqYnVmKQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkYSk7CisJc3RydWN0IGRzNjIwX2RhdGEgKmRhdGEgPSBkczYyMF91cGRhdGVfY2xpZW50KGRldik7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwl1MTYgY29uZiwgbmV3X2NvbmY7CisJaW50IHJlczsKKworCWlmIChJU19FUlIoZGF0YSkpCisJCXJldHVybiBQVFJfRVJSKGRhdGEpOworCisJLyogcmVzZXQgYWxhcm1zIGlmIG5lY2Vzc2FyeSAqLworCXJlcyA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIERTNjIwX1JFR19DT05GKTsKKwlpZiAocmVzIDwgMCkKKwkJcmV0dXJuIHJlczsKKworCWNvbmYgPSBzd2FiMTYocmVzKTsKKwluZXdfY29uZiA9IGNvbmY7CisJbmV3X2NvbmYgJj0gfmF0dHItPmluZGV4OworCWlmIChjb25mICE9IG5ld19jb25mKSB7CisJCXJlcyA9IGkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCBEUzYyMF9SRUdfQ09ORiwKKwkJCQkJCXN3YWIxNihuZXdfY29uZikpOworCQlpZiAocmVzIDwgMCkKKwkJCXJldHVybiByZXM7CisJfQorCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsICEhKGNvbmYgJiBhdHRyLT5pbmRleCkpOworfQorCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXAsIE5VTEwsIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXAsIHNldF90ZW1wLCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190ZW1wLCBzZXRfdGVtcCwgMik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX21pbl9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwKKwkJCSAgRFM2MjBfUkVHX0NPTkZJR19UTEYpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9tYXhfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsCisJCQkgIERTNjIwX1JFR19DT05GSUdfVEhGKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmRzNjIwX2F0dHJpYnV0ZXNbXSA9IHsKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX21heC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWluX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9tYXhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBkczYyMF9ncm91cCA9IHsKKwkuYXR0cnMgPSBkczYyMF9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIGludCBkczYyMF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkgICAgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBkczYyMF9kYXRhICpkYXRhOworCWludCBlcnI7CisKKwlkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRzNjIwX2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBleGl0OworCX0KKworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGRhdGEpOworCW11dGV4X2luaXQoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCS8qIEluaXRpYWxpemUgdGhlIERTNjIwIGNoaXAgKi8KKwlkczYyMF9pbml0X2NsaWVudChjbGllbnQpOworCisJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKwllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZkczYyMF9ncm91cCk7CisJaWYgKGVycikKKwkJZ290byBleGl0X2ZyZWU7CisKKwlkYXRhLT5od21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2KTsKKwlpZiAoSVNfRVJSKGRhdGEtPmh3bW9uX2RldikpIHsKKwkJZXJyID0gUFRSX0VSUihkYXRhLT5od21vbl9kZXYpOworCQlnb3RvIGV4aXRfcmVtb3ZlX2ZpbGVzOworCX0KKworCWRldl9pbmZvKCZjbGllbnQtPmRldiwgInRlbXBlcmF0dXJlIHNlbnNvciBmb3VuZFxuIik7CisKKwlyZXR1cm4gMDsKKworZXhpdF9yZW1vdmVfZmlsZXM6CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmZHM2MjBfZ3JvdXApOworZXhpdF9mcmVlOgorCWtmcmVlKGRhdGEpOworZXhpdDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGRzNjIwX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBkczYyMF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5od21vbl9kZXYpOworCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJmRzNjIwX2dyb3VwKTsKKworCWtmcmVlKGRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBkczYyMF9pZFtdID0geworCXsiZHM2MjAiLCAwfSwKKwl7fQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGRzNjIwX2lkKTsKKworLyogVGhpcyBpcyB0aGUgZHJpdmVyIHRoYXQgd2lsbCBiZSBpbnNlcnRlZCAqLworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGRzNjIwX2RyaXZlciA9IHsKKwkuY2xhc3MgPSBJMkNfQ0xBU1NfSFdNT04sCisJLmRyaXZlciA9IHsKKwkJICAgLm5hbWUgPSAiZHM2MjAiLAorCX0sCisJLnByb2JlID0gZHM2MjBfcHJvYmUsCisJLnJlbW92ZSA9IGRzNjIwX3JlbW92ZSwKKwkuaWRfdGFibGUgPSBkczYyMF9pZCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRzNjIwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmRzNjIwX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkczYyMF9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmRzNjIwX2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIlJvbGFuZCBTdGlnZ2UgPHN0aWdnZUBhbnRjb20uZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRTNjIwIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChkczYyMF9pbml0KTsKK21vZHVsZV9leGl0KGRzNjIwX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9mNzE4MDVmLmMgYi9kcml2ZXJzL2h3bW9uL2Y3MTgwNWYuYwppbmRleCA1MjVhMDBiLi45MmY5NDk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2Y3MTgwNWYuYworKysgYi9kcml2ZXJzL2h3bW9uL2Y3MTgwNWYuYwpAQCAtMjgsNiArMjgsOCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTEzMDksNyArMTMxMSw3IEBACiAKIAlpZiAoIShkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGY3MTgwNWZfZGF0YSksIEdGUF9LRVJORUwpKSkgewogCQllcnIgPSAtRU5PTUVNOwotCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBPdXQgb2YgbWVtb3J5XG4iKTsKKwkJcHJfZXJyKCJPdXQgb2YgbWVtb3J5XG4iKTsKIAkJZ290byBleGl0OwogCX0KIApAQCAtMTQ1MSw3ICsxNDUzLDcgQEAKIAlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKERSVk5BTUUsIGFkZHJlc3MpOwogCWlmICghcGRldikgewogCQllcnIgPSAtRU5PTUVNOwotCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBEZXZpY2UgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlwcl9lcnIoIkRldmljZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTE0NjIsMjIgKzE0NjQsMjAgQEAKIAogCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKHBkZXYsICZyZXMsIDEpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogRGV2aWNlIHJlc291cmNlIGFkZGl0aW9uIGZhaWxlZCAiCi0JCSAgICAgICAiKCVkKVxuIiwgZXJyKTsKKwkJcHJfZXJyKCJEZXZpY2UgcmVzb3VyY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsIGVycik7CiAJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwogCX0KIAogCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YShwZGV2LCBzaW9fZGF0YSwKIAkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBmNzE4MDVmX3Npb19kYXRhKSk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBQbGF0Zm9ybSBkYXRhIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcHJfZXJyKCJQbGF0Zm9ybSBkYXRhIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKIAkJZ290byBleGl0X2RldmljZV9wdXQ7CiAJfQogCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZChwZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IERldmljZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwKLQkJICAgICAgIGVycik7CisJCXByX2VycigiRGV2aWNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwogCQlnb3RvIGV4aXRfZGV2aWNlX3B1dDsKIAl9CiAKQEAgLTE1MTYsMzAgKzE1MTYsMjcgQEAKIAkJc2lvX2RhdGEtPmZuc2VsMSA9IHN1cGVyaW9faW5iKHNpb2FkZHIsIFNJT19SRUdfRk5TRUwxKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fSU5GTyBEUlZOQU1FICI6IFVuc3VwcG9ydGVkIEZpbnRlayBkZXZpY2UsICIKLQkJICAgICAgICJza2lwcGluZ1xuIik7CisJCXByX2luZm8oIlVuc3VwcG9ydGVkIEZpbnRlayBkZXZpY2UsIHNraXBwaW5nXG4iKTsKIAkJZ290byBleGl0OwogCX0KIAogCXN1cGVyaW9fc2VsZWN0KHNpb2FkZHIsIEY3MTgwNUZfTERfSFdNKTsKIAlpZiAoIShzdXBlcmlvX2luYihzaW9hZGRyLCBTSU9fUkVHX0VOQUJMRSkgJiAweDAxKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVk5BTUUgIjogRGV2aWNlIG5vdCBhY3RpdmF0ZWQsICIKLQkJICAgICAgICJza2lwcGluZ1xuIik7CisJCXByX3dhcm4oIkRldmljZSBub3QgYWN0aXZhdGVkLCBza2lwcGluZ1xuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAkqYWRkcmVzcyA9IHN1cGVyaW9faW53KHNpb2FkZHIsIFNJT19SRUdfQUREUik7CiAJaWYgKCphZGRyZXNzID09IDApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZOQU1FICI6IEJhc2UgYWRkcmVzcyBub3Qgc2V0LCAiCi0JCSAgICAgICAic2tpcHBpbmdcbiIpOworCQlwcl93YXJuKCJCYXNlIGFkZHJlc3Mgbm90IHNldCwgc2tpcHBpbmdcbiIpOwogCQlnb3RvIGV4aXQ7CiAJfQogCSphZGRyZXNzICY9IH4oUkVHSU9OX0xFTkdUSCAtIDEpOwkvKiBJZ25vcmUgMyBMU0IgKi8KIAogCWVyciA9IDA7Ci0JcHJpbnRrKEtFUk5fSU5GTyBEUlZOQU1FICI6IEZvdW5kICVzIGNoaXAgYXQgJSN4LCByZXZpc2lvbiAldVxuIiwKLQkgICAgICAgbmFtZXNbc2lvX2RhdGEtPmtpbmRdLCAqYWRkcmVzcywKLQkgICAgICAgc3VwZXJpb19pbmIoc2lvYWRkciwgU0lPX1JFR19ERVZSRVYpKTsKKwlwcl9pbmZvKCJGb3VuZCAlcyBjaGlwIGF0ICUjeCwgcmV2aXNpb24gJXVcbiIsCisJCW5hbWVzW3Npb19kYXRhLT5raW5kXSwgKmFkZHJlc3MsCisJCXN1cGVyaW9faW5iKHNpb2FkZHIsIFNJT19SRUdfREVWUkVWKSk7CiAKIGV4aXQ6CiAJc3VwZXJpb19leGl0KHNpb2FkZHIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9mNzE4ODJmZy5jIGIvZHJpdmVycy9od21vbi9mNzE4ODJmZy5jCmluZGV4IDc1YWZiM2IuLjNmNDlkZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vZjcxODgyZmcuYworKysgYi9kcml2ZXJzL2h3bW9uL2Y3MTg4MmZnLmMKQEAgLTE4LDYgKzE4LDggQEAKICAqICAgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC04NjUsOCArODY3LDcgQEAKIHsKIAkvKiBEb24ndCBzdGVwIG9uIG90aGVyIGRyaXZlcnMnIEkvTyBzcGFjZSBieSBhY2NpZGVudCAqLwogCWlmICghcmVxdWVzdF9tdXhlZF9yZWdpb24oYmFzZSwgMiwgRFJWTkFNRSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogSS9PIGFkZHJlc3MgMHglMDR4IGFscmVhZHkgaW4gdXNlXG4iLAotCQkJCWJhc2UpOworCQlwcl9lcnIoIkkvTyBhZGRyZXNzIDB4JTA0eCBhbHJlYWR5IGluIHVzZVxuIiwgYmFzZSk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCkBAIC0yMTkyLDcgKzIxOTMsNyBAQAogCiAJZGV2aWQgPSBzdXBlcmlvX2ludyhzaW9hZGRyLCBTSU9fUkVHX01BTklEKTsKIAlpZiAoZGV2aWQgIT0gU0lPX0ZJTlRFS19JRCkgewotCQlwcl9kZWJ1ZyhEUlZOQU1FICI6IE5vdCBhIEZpbnRlayBkZXZpY2VcbiIpOworCQlwcl9kZWJ1ZygiTm90IGEgRmludGVrIGRldmljZVxuIik7CiAJCWVyciA9IC1FTk9ERVY7CiAJCWdvdG8gZXhpdDsKIAl9CkBAIC0yMjE1LDggKzIyMTYsOCBAQAogCQlzaW9fZGF0YS0+dHlwZSA9IGY4MDAwOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9JTkZPIERSVk5BTUUgIjogVW5zdXBwb3J0ZWQgRmludGVrIGRldmljZTogJTA0eFxuIiwKLQkJICAgICAgICh1bnNpZ25lZCBpbnQpZGV2aWQpOworCQlwcl9pbmZvKCJVbnN1cHBvcnRlZCBGaW50ZWsgZGV2aWNlOiAlMDR4XG4iLAorCQkJKHVuc2lnbmVkIGludClkZXZpZCk7CiAJCWVyciA9IC1FTk9ERVY7CiAJCWdvdG8gZXhpdDsKIAl9CkBAIC0yMjI3LDIxICsyMjI4LDIxIEBACiAJCXN1cGVyaW9fc2VsZWN0KHNpb2FkZHIsIFNJT19GNzE4ODJGR19MRF9IV00pOwogCiAJaWYgKCEoc3VwZXJpb19pbmIoc2lvYWRkciwgU0lPX1JFR19FTkFCTEUpICYgMHgwMSkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZOQU1FICI6IERldmljZSBub3QgYWN0aXZhdGVkXG4iKTsKKwkJcHJfd2FybigiRGV2aWNlIG5vdCBhY3RpdmF0ZWRcbiIpOwogCQllcnIgPSAtRU5PREVWOwogCQlnb3RvIGV4aXQ7CiAJfQogCiAJKmFkZHJlc3MgPSBzdXBlcmlvX2ludyhzaW9hZGRyLCBTSU9fUkVHX0FERFIpOwogCWlmICgqYWRkcmVzcyA9PSAwKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWTkFNRSAiOiBCYXNlIGFkZHJlc3Mgbm90IHNldFxuIik7CisJCXByX3dhcm4oIkJhc2UgYWRkcmVzcyBub3Qgc2V0XG4iKTsKIAkJZXJyID0gLUVOT0RFVjsKIAkJZ290byBleGl0OwogCX0KIAkqYWRkcmVzcyAmPSB+KFJFR0lPTl9MRU5HVEggLSAxKTsJLyogSWdub3JlIDMgTFNCICovCiAKIAllcnIgPSAwOwotCXByaW50ayhLRVJOX0lORk8gRFJWTkFNRSAiOiBGb3VuZCAlcyBjaGlwIGF0ICUjeCwgcmV2aXNpb24gJWRcbiIsCisJcHJfaW5mbygiRm91bmQgJXMgY2hpcCBhdCAlI3gsIHJldmlzaW9uICVkXG4iLAogCQlmNzE4ODJmZ19uYW1lc1tzaW9fZGF0YS0+dHlwZV0sCSh1bnNpZ25lZCBpbnQpKmFkZHJlc3MsCiAJCShpbnQpc3VwZXJpb19pbmIoc2lvYWRkciwgU0lPX1JFR19ERVZSRVYpKTsKIGV4aXQ6CkBAIC0yMjcwLDIwICsyMjcxLDIwIEBACiAKIAllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX3Jlc291cmNlcyhmNzE4ODJmZ19wZGV2LCAmcmVzLCAxKTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IERldmljZSByZXNvdXJjZSBhZGRpdGlvbiBmYWlsZWRcbiIpOworCQlwcl9lcnIoIkRldmljZSByZXNvdXJjZSBhZGRpdGlvbiBmYWlsZWRcbiIpOwogCQlnb3RvIGV4aXRfZGV2aWNlX3B1dDsKIAl9CiAKIAllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEoZjcxODgyZmdfcGRldiwgc2lvX2RhdGEsCiAJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgZjcxODgyZmdfc2lvX2RhdGEpKTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IFBsYXRmb3JtIGRhdGEgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlwcl9lcnIoIlBsYXRmb3JtIGRhdGEgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwogCQlnb3RvIGV4aXRfZGV2aWNlX3B1dDsKIAl9CiAKIAllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKGY3MTg4MmZnX3BkZXYpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogRGV2aWNlIGFkZGl0aW9uIGZhaWxlZFxuIik7CisJCXByX2VycigiRGV2aWNlIGFkZGl0aW9uIGZhaWxlZFxuIik7CiAJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9ocF9hY2NlbC5jIGIvZHJpdmVycy9od21vbi9ocF9hY2NlbC5jCmluZGV4IGE1NmE3ODQuLjNkMjFmYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vaHBfYWNjZWwuYworKysgYi9kcml2ZXJzL2h3bW9uL2hwX2FjY2VsLmMKQEAgLTIwLDYgKzIwLDggQEAKICAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgpAQCAtMTQ3LDcgKzE0OSw3IEBACiBzdGF0aWMgaW50IGxpczNsdjAyZF9kbWlfbWF0Y2hlZChjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqZG1pKQogewogCWxpczNfZGV2LmFjID0gKigodW5pb24gYXhpc19jb252ZXJzaW9uICopZG1pLT5kcml2ZXJfZGF0YSk7Ci0JcHJpbnRrKEtFUk5fSU5GTyBEUklWRVJfTkFNRSAiOiBoYXJkd2FyZSB0eXBlICVzIGZvdW5kLlxuIiwgZG1pLT5pZGVudCk7CisJcHJfaW5mbygiaGFyZHdhcmUgdHlwZSAlcyBmb3VuZFxuIiwgZG1pLT5pZGVudCk7CiAKIAlyZXR1cm4gMTsKIH0KQEAgLTMwMywxMSArMzA1LDEwIEBACiAKIAkvKiBJZiBwb3NzaWJsZSB1c2UgYSAic3RhbmRhcmQiIGF4ZXMgb3JkZXIgKi8KIAlpZiAobGlzM19kZXYuYWMueCAmJiBsaXMzX2Rldi5hYy55ICYmIGxpczNfZGV2LmFjLnopIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyBEUklWRVJfTkFNRSAiOiBVc2luZyBjdXN0b20gYXhlcyAlZCwlZCwlZFxuIiwKLQkJICAgICAgIGxpczNfZGV2LmFjLngsIGxpczNfZGV2LmFjLnksIGxpczNfZGV2LmFjLnopOworCQlwcl9pbmZvKCJVc2luZyBjdXN0b20gYXhlcyAlZCwlZCwlZFxuIiwKKwkJCWxpczNfZGV2LmFjLngsIGxpczNfZGV2LmFjLnksIGxpczNfZGV2LmFjLnopOwogCX0gZWxzZSBpZiAoZG1pX2NoZWNrX3N5c3RlbShsaXMzbHYwMmRfZG1pX2lkcykgPT0gMCkgewotCQlwcmludGsoS0VSTl9JTkZPIERSSVZFUl9OQU1FICI6IGxhcHRvcCBtb2RlbCB1bmtub3duLCAiCi0JCQkJICJ1c2luZyBkZWZhdWx0IGF4ZXMgY29uZmlndXJhdGlvblxuIik7CisJCXByX2luZm8oImxhcHRvcCBtb2RlbCB1bmtub3duLCB1c2luZyBkZWZhdWx0IGF4ZXMgY29uZmlndXJhdGlvblxuIik7CiAJCWxpczNfZGV2LmFjID0gbGlzM2x2MDJkX2F4aXNfbm9ybWFsOwogCX0KIApAQCAtMzg1LDcgKzM4Niw3IEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlwcmludGsoS0VSTl9JTkZPIERSSVZFUl9OQU1FICIgZHJpdmVyIGxvYWRlZC5cbiIpOworCXByX2luZm8oImRyaXZlciBsb2FkZWRcbiIpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2h3bW9uLXZpZC5jIGIvZHJpdmVycy9od21vbi9od21vbi12aWQuYwppbmRleCAyYjJjYTE2Li4yNTgyYmZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2h3bW9uLXZpZC5jCisrKyBiL2RyaXZlcnMvaHdtb24vaHdtb24tdmlkLmMKQEAgLTIyLDYgKzIyLDggQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXZpZC5oPgpAQCAtMTQ2LDggKzE0OCw4IEBACiAJCXJldHVybih2YWwgPiAweDc3ID8gMCA6ICgxNTAwMDAwIC0gKHZhbCAqIDEyNTAwKSArIDUwMCkgLyAxMDAwKTsKIAlkZWZhdWx0OgkJLyogcmVwb3J0IDAgZm9yIHVua25vd24gKi8KIAkJaWYgKHZybSkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImh3bW9uLXZpZDogUmVxdWVzdGVkIHVuc3VwcG9ydGVkICIKLQkJCSAgICAgICAiVlJNIHZlcnNpb24gKCV1KVxuIiwgKHVuc2lnbmVkIGludCl2cm0pOworCQkJcHJfd2FybigiUmVxdWVzdGVkIHVuc3VwcG9ydGVkIFZSTSB2ZXJzaW9uICgldSlcbiIsCisJCQkJKHVuc2lnbmVkIGludCl2cm0pOwogCQlyZXR1cm4gMDsKIAl9CiB9CkBAIC0yNDYsOCArMjQ4LDcgQEAKIAl9CiAJdnJtX3JldCA9IGZpbmRfdnJtKGVmZl9mYW1pbHksIGVmZl9tb2RlbCwgZWZmX3N0ZXBwaW5nLCBjLT54ODZfdmVuZG9yKTsKIAlpZiAodnJtX3JldCA9PSAwKQotCQlwcmludGsoS0VSTl9JTkZPICJod21vbi12aWQ6IFVua25vd24gVlJNIHZlcnNpb24gb2YgeW91ciAiCi0JCSAgICAgICAieDg2IENQVVxuIik7CisJCXByX2luZm8oIlVua25vd24gVlJNIHZlcnNpb24gb2YgeW91ciB4ODYgQ1BVXG4iKTsKIAlyZXR1cm4gdnJtX3JldDsKIH0KIApAQCAtMjU1LDcgKzI1Niw3IEBACiAjZWxzZQogdTggdmlkX3doaWNoX3ZybSh2b2lkKQogewotCXByaW50ayhLRVJOX0lORk8gImh3bW9uLXZpZDogVW5rbm93biBWUk0gdmVyc2lvbiBvZiB5b3VyIENQVVxuIik7CisJcHJfaW5mbygiVW5rbm93biBWUk0gdmVyc2lvbiBvZiB5b3VyIENQVVxuIik7CiAJcmV0dXJuIDA7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vaHdtb24uYyBiL2RyaXZlcnMvaHdtb24vaHdtb24uYwppbmRleCAyOWVhNjc1Li5hNjFlNzgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2h3bW9uLmMKKysrIGIvZHJpdmVycy9od21vbi9od21vbi5jCkBAIC0xMCw2ICsxMCw4IEBACiAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgogKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CkBAIC0xMTksNyArMTIxLDcgQEAKIAogCWh3bW9uX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAiaHdtb24iKTsKIAlpZiAoSVNfRVJSKGh3bW9uX2NsYXNzKSkgewotCQlwcmludGsoS0VSTl9FUlIgImh3bW9uLmM6IGNvdWxkbid0IGNyZWF0ZSBzeXNmcyBjbGFzc1xuIik7CisJCXByX2VycigiY291bGRuJ3QgY3JlYXRlIHN5c2ZzIGNsYXNzXG4iKTsKIAkJcmV0dXJuIFBUUl9FUlIoaHdtb25fY2xhc3MpOwogCX0KIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vaWJtYWVtLmMgYi9kcml2ZXJzL2h3bW9uL2libWFlbS5jCmluZGV4IGVhZWU1NDYuLmJjNmUyYWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vaWJtYWVtLmMKKysrIGIvZHJpdmVycy9od21vbi9pYm1hZW0uYwpAQCAtMjAsNiArMjAsOCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L2lwbWkuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9od21vbi5oPgpAQCAtMTA5MCw3ICsxMDkyLDcgQEAKIAogCXJlcyA9IGRyaXZlcl9yZWdpc3RlcigmYWVtX2RyaXZlci5kcml2ZXIpOwogCWlmIChyZXMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJDYW4ndCByZWdpc3RlciBhZW0gZHJpdmVyXG4iKTsKKwkJcHJfZXJyKCJDYW4ndCByZWdpc3RlciBhZW0gZHJpdmVyXG4iKTsKIAkJcmV0dXJuIHJlczsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbGlzM2x2MDJkLmMgYi9kcml2ZXJzL2h3bW9uL2xpczNsdjAyZC5jCmluZGV4IDBjZWU3M2EuLjFiNjc0YjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbGlzM2x2MDJkLmMKKysrIGIvZHJpdmVycy9od21vbi9saXMzbHYwMmQuYwpAQCAtMjAsNiArMjAsOCBAQAogICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CkBAIC04NjAsOCArODYyLDcgQEAKIAkJCQkJKHAtPmlycV9mbGFnczIgJiBJUlFGX1RSSUdHRVJfTUFTSyksCiAJCQkJCURSSVZFUl9OQU1FLCAmbGlzM19kZXYpOwogCQlpZiAoZXJyIDwgMCkKLQkJCXByaW50ayhLRVJOX0VSUiBEUklWRVJfTkFNRQotCQkJCSJObyBzZWNvbmQgSVJRLiBMaW1pdGVkIGZ1bmN0aW9uYWxpdHlcbiIpOworCQkJcHJfZXJyKCJObyBzZWNvbmQgSVJRLiBMaW1pdGVkIGZ1bmN0aW9uYWxpdHlcbiIpOwogCX0KIH0KIApAQCAtODc5LDcgKzg4MCw3IEBACiAKIAlzd2l0Y2ggKGRldi0+d2hvYW1pKSB7CiAJY2FzZSBXQUlfMTJCOgotCQlwcmludGsoS0VSTl9JTkZPIERSSVZFUl9OQU1FICI6IDEyIGJpdHMgc2Vuc29yIGZvdW5kXG4iKTsKKwkJcHJfaW5mbygiMTIgYml0cyBzZW5zb3IgZm91bmRcbiIpOwogCQlkZXYtPnJlYWRfZGF0YSA9IGxpczNsdjAyZF9yZWFkXzEyOwogCQlkZXYtPm1kcHNfbWF4X3ZhbCA9IDIwNDg7CiAJCWRldi0+cHdyb25fZGVsYXkgPSBMSVMzX1BXUk9OX0RFTEFZX1dBSV8xMkI7CkBAIC04OTAsNyArODkxLDcgQEAKIAkJZGV2LT5yZWdzX3NpemUgPSBBUlJBWV9TSVpFKGxpczNfd2FpMTJfcmVncyk7CiAJCWJyZWFrOwogCWNhc2UgV0FJXzhCOgotCQlwcmludGsoS0VSTl9JTkZPIERSSVZFUl9OQU1FICI6IDggYml0cyBzZW5zb3IgZm91bmRcbiIpOworCQlwcl9pbmZvKCI4IGJpdHMgc2Vuc29yIGZvdW5kXG4iKTsKIAkJZGV2LT5yZWFkX2RhdGEgPSBsaXMzbHYwMmRfcmVhZF84OwogCQlkZXYtPm1kcHNfbWF4X3ZhbCA9IDEyODsKIAkJZGV2LT5wd3Jvbl9kZWxheSA9IExJUzNfUFdST05fREVMQVlfV0FJXzhCOwpAQCAtOTAxLDcgKzkwMiw3IEBACiAJCWRldi0+cmVnc19zaXplID0gQVJSQVlfU0laRShsaXMzX3dhaThfcmVncyk7CiAJCWJyZWFrOwogCWNhc2UgV0FJXzNEQzoKLQkJcHJpbnRrKEtFUk5fSU5GTyBEUklWRVJfTkFNRSAiOiA4IGJpdHMgM0RDIHNlbnNvciBmb3VuZFxuIik7CisJCXByX2luZm8oIjggYml0cyAzREMgc2Vuc29yIGZvdW5kXG4iKTsKIAkJZGV2LT5yZWFkX2RhdGEgPSBsaXMzbHYwMmRfcmVhZF84OwogCQlkZXYtPm1kcHNfbWF4X3ZhbCA9IDEyODsKIAkJZGV2LT5wd3Jvbl9kZWxheSA9IExJUzNfUFdST05fREVMQVlfV0FJXzhCOwpAQCAtOTEwLDggKzkxMSw3IEBACiAJCWRldi0+c2NhbGUgPSBMSVMzX1NFTlNJVElWSVRZXzhCOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9FUlIgRFJJVkVSX05BTUUKLQkJCSI6IHVua25vd24gc2Vuc29yIHR5cGUgMHglWFxuIiwgZGV2LT53aG9hbWkpOworCQlwcl9lcnIoInVua25vd24gc2Vuc29yIHR5cGUgMHglWFxuIiwgZGV2LT53aG9hbWkpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTkzNSw3ICs5MzUsNyBAQAogCX0KIAogCWlmIChsaXMzbHYwMmRfam95c3RpY2tfZW5hYmxlKCkpCi0JCXByaW50ayhLRVJOX0VSUiBEUklWRVJfTkFNRSAiOiBqb3lzdGljayBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOworCQlwcl9lcnIoImpveXN0aWNrIGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CiAKIAkvKiBwYXNzaW5nIGluIHBsYXRmb3JtIHNwZWNpZmljIGRhdGEgaXMgcHVyZWx5IG9wdGlvbmFsIGFuZCBvbmx5CiAJICogdXNlZCBieSB0aGUgU1BJIHRyYW5zcG9ydCBsYXllciBhdCB0aGUgbW9tZW50ICovCkBAIC05NTcsOCArOTU3LDcgQEAKIAogCS8qIGJhaWwgaWYgd2UgZGlkIG5vdCBnZXQgYW4gSVJRIGZyb20gdGhlIGJ1cyBsYXllciAqLwogCWlmICghZGV2LT5pcnEpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSSVZFUl9OQU1FCi0JCQkiOiBObyBJUlEuIERpc2FibGluZyAvZGV2L2ZyZWVmYWxsXG4iKTsKKwkJcHJfZXJyKCJObyBJUlEuIERpc2FibGluZyAvZGV2L2ZyZWVmYWxsXG4iKTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC05ODUsMTIgKzk4NCwxMiBAQAogCQkJCURSSVZFUl9OQU1FLCAmbGlzM19kZXYpOwogCiAJaWYgKGVyciA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSSVZFUl9OQU1FICJDYW5ub3QgZ2V0IElSUVxuIik7CisJCXByX2VycigiQ2Fubm90IGdldCBJUlFcbiIpOwogCQlnb3RvIG91dDsKIAl9CiAKIAlpZiAobWlzY19yZWdpc3RlcigmbGlzM2x2MDJkX21pc2NfZGV2aWNlKSkKLQkJcHJpbnRrKEtFUk5fRVJSIERSSVZFUl9OQU1FICI6IG1pc2NfcmVnaXN0ZXIgZmFpbGVkXG4iKTsKKwkJcHJfZXJyKCJtaXNjX3JlZ2lzdGVyIGZhaWxlZFxuIik7CiBvdXQ6CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xtNzAuYyBiL2RyaXZlcnMvaHdtb24vbG03MC5jCmluZGV4IGZkMTA4Y2YuLjNiODRmYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbG03MC5jCisrKyBiL2RyaXZlcnMvaHdtb24vbG03MC5jCkBAIC0yNCw2ICsyNCw4IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC02Nyw4ICs2OSw3IEBACiAJICovCiAJc3RhdHVzID0gc3BpX3dyaXRlX3RoZW5fcmVhZChzcGksIE5VTEwsIDAsICZyeGJ1ZlswXSwgMik7CiAJaWYgKHN0YXR1cyA8IDApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkic3BpX3dyaXRlX3RoZW5fcmVhZCBmYWlsZWQgd2l0aCBzdGF0dXMgJWRcbiIsIHN0YXR1cyk7CisJCXByX3dhcm4oInNwaV93cml0ZV90aGVuX3JlYWQgZmFpbGVkIHdpdGggc3RhdHVzICVkXG4iLCBzdGF0dXMpOwogCQlnb3RvIG91dDsKIAl9CiAJcmF3ID0gKHJ4YnVmWzBdIDw8IDgpICsgcnhidWZbMV07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xtOTUyNDEuYyBiL2RyaXZlcnMvaHdtb24vbG05NTI0MS5jCmluZGV4IDQ1NDZkODIuLjFhNmRmYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbG05NTI0MS5jCisrKyBiL2RyaXZlcnMvaHdtb24vbG05NTI0MS5jCkBAIC0xLDEzICsxLDkgQEAKIC8qCi0gKiBsbTk1MjQxLmMgLSBQYXJ0IG9mIGxtX3NlbnNvcnMsIExpbnV4IGtlcm5lbCBtb2R1bGVzIGZvciBoYXJkd2FyZQotICogICAgICAgICAgICAgbW9uaXRvcmluZwotICogQ29weXJpZ2h0IChDKSAyMDA4IERhdmlkZSBSaXp6byA8ZWxwYS1yaXp6b0BnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMTAgRGF2aWRlIFJpenpvIDxlbHBhLnJpenpvQGdtYWlsLmNvbT4KICAqCi0gKiBCYXNlZCBvbiB0aGUgbWF4MTYxOSBkcml2ZXIuIFRoZSBMTTk1MjQxIGlzIGEgc2Vuc29yIGNoaXAgbWFkZSBieSBOYXRpb25hbAotICogICBTZW1pY29uZHVjdG9ycy4KLSAqIEl0IHJlcG9ydHMgdXAgdG8gdGhyZWUgdGVtcGVyYXR1cmVzIChpdHMgb3duIHBsdXMgdXAgdG8KLSAqIHR3byBleHRlcm5hbCBvbmVzKS4gQ29tcGxldGUgZGF0YXNoZWV0IGNhbiBiZQotICogb2J0YWluZWQgZnJvbSBOYXRpb25hbCdzIHdlYnNpdGUgYXQ6CisgKiBUaGUgTE05NTI0MSBpcyBhIHNlbnNvciBjaGlwIG1hZGUgYnkgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvcnMuCisgKiBJdCByZXBvcnRzIHVwIHRvIHRocmVlIHRlbXBlcmF0dXJlcyAoaXRzIG93biBwbHVzIHVwIHRvIHR3byBleHRlcm5hbCBvbmVzKS4KKyAqIENvbXBsZXRlIGRhdGFzaGVldCBjYW4gYmUgb2J0YWluZWQgZnJvbSBOYXRpb25hbCdzIHdlYnNpdGUgYXQ6CiAgKiAgIGh0dHA6Ly93d3cubmF0aW9uYWwuY29tL2RzLmNnaS9MTS9MTTk1MjQxLnBkZgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CkBAIC0zNiw4ICszMiwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KIAorI2RlZmluZSBERVZOQU1FICJsbTk1MjQxIgorCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0gewotCTB4MTksIDB4MmEsIDB4MmIsIEkyQ19DTElFTlRfRU5EfTsKKwkweDE5LCAweDJhLCAweDJiLCBJMkNfQ0xJRU5UX0VORCB9OwogCiAvKiBMTTk1MjQxIHJlZ2lzdGVycyAqLwogI2RlZmluZSBMTTk1MjQxX1JFR19SX01BTl9JRAkJMHhGRQpAQCAtNDYsNyArNDQsNyBAQAogI2RlZmluZSBMTTk1MjQxX1JFR19SV19DT05GSUcJCTB4MDMKICNkZWZpbmUgTE05NTI0MV9SRUdfUldfUkVNX0ZJTFRFUgkweDA2CiAjZGVmaW5lIExNOTUyNDFfUkVHX1JXX1RSVVRIRVJNCQkweDA3Ci0jZGVmaW5lIExNOTUyNDFfUkVHX1dfT05FX1NIT1QgIAkweDBGCisjZGVmaW5lIExNOTUyNDFfUkVHX1dfT05FX1NIT1QJCTB4MEYKICNkZWZpbmUgTE05NTI0MV9SRUdfUl9MT0NBTF9URU1QSAkweDEwCiAjZGVmaW5lIExNOTUyNDFfUkVHX1JfUkVNT1RFMV9URU1QSAkweDExCiAjZGVmaW5lIExNOTUyNDFfUkVHX1JfUkVNT1RFMl9URU1QSAkweDEyCkBAIC03OSw1MiArNzcsMjA1IEBACiAjZGVmaW5lIE1BTlVGQUNUVVJFUl9JRCAweDAxCiAjZGVmaW5lIERFRkFVTFRfUkVWSVNJT04gMHhBNAogCi0vKiBDb252ZXJzaW9ucyBhbmQgdmFyaW91cyBtYWNyb3MgKi8KLSNkZWZpbmUgVEVNUF9GUk9NX1JFRyh2YWxfaCwgdmFsX2wpICgoKHZhbF9oKSAmIDB4ODAgPyAodmFsX2gpIC0gMHgxMDAgOiBcCi0gICAgKHZhbF9oKSkgKiAxMDAwICsgKHZhbF9sKSAqIDEwMDAgLyAyNTYpCi0KLS8qIEZ1bmN0aW9ucyBkZWNsYXJhdGlvbiAqLwotc3RhdGljIHZvaWQgbG05NTI0MV9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKLXN0YXRpYyBzdHJ1Y3QgbG05NTI0MV9kYXRhICpsbTk1MjQxX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KTsKK3N0YXRpYyBjb25zdCB1OCBsbTk1MjQxX3JlZ19hZGRyZXNzW10gPSB7CisJTE05NTI0MV9SRUdfUl9MT0NBTF9URU1QSCwKKwlMTTk1MjQxX1JFR19SX0xPQ0FMX1RFTVBMLAorCUxNOTUyNDFfUkVHX1JfUkVNT1RFMV9URU1QSCwKKwlMTTk1MjQxX1JFR19SX1JFTU9URTFfVEVNUEwsCisJTE05NTI0MV9SRUdfUl9SRU1PVEUyX1RFTVBILAorCUxNOTUyNDFfUkVHX1JfUkVNT1RFMl9URU1QTAorfTsKIAogLyogQ2xpZW50IGRhdGEgKGVhY2ggY2xpZW50IGdldHMgaXRzIG93bikgKi8KIHN0cnVjdCBsbTk1MjQxX2RhdGEgewogCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKIAlzdHJ1Y3QgbXV0ZXggdXBkYXRlX2xvY2s7Ci0JdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQsIGludGVydmFsOyAvKiBpbiBqaWZmaWVzICovCi0JY2hhciB2YWxpZDsgLyogemVybyB1bnRpbCBmb2xsb3dpbmcgZmllbGRzIGFyZSB2YWxpZCAqLworCXVuc2lnbmVkIGxvbmcgbGFzdF91cGRhdGVkLCBpbnRlcnZhbDsJLyogaW4gamlmZmllcyAqLworCWNoYXIgdmFsaWQ7CQkvKiB6ZXJvIHVudGlsIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCiAJLyogcmVnaXN0ZXJzIHZhbHVlcyAqLwotCXU4IGxvY2FsX2gsIGxvY2FsX2w7IC8qIGxvY2FsICovCi0JdTggcmVtb3RlMV9oLCByZW1vdGUxX2w7IC8qIHJlbW90ZTEgKi8KLQl1OCByZW1vdGUyX2gsIHJlbW90ZTJfbDsgLyogcmVtb3RlMiAqLworCXU4IHRlbXBbQVJSQVlfU0laRShsbTk1MjQxX3JlZ19hZGRyZXNzKV07CiAJdTggY29uZmlnLCBtb2RlbCwgdHJ1dGhlcm07CiB9OwogCi0vKiBTeXNmcyBzdHVmZiAqLwotI2RlZmluZSBzaG93X3RlbXAodmFsdWUpIFwKLXN0YXRpYyBzc2l6ZV90IHNob3dfIyN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIFwKLSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKSBcCi17IFwKLQlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gbG05NTI0MV91cGRhdGVfZGV2aWNlKGRldik7IFwKLQlzbnByaW50ZihidWYsIFBBR0VfU0laRSAtIDEsICIlZFxuIiwgXAotCQlURU1QX0ZST01fUkVHKGRhdGEtPnZhbHVlIyNfaCwgZGF0YS0+dmFsdWUjI19sKSk7IFwKLQlyZXR1cm4gc3RybGVuKGJ1Zik7IFwKKy8qIENvbnZlcnNpb25zICovCitzdGF0aWMgaW50IFRlbXBGcm9tUmVnKHU4IHZhbF9oLCB1OCB2YWxfbCkKK3sKKwlpZiAodmFsX2ggJiAweDgwKQorCQlyZXR1cm4gdmFsX2ggLSAweDEwMDsKKwlyZXR1cm4gdmFsX2ggKiAxMDAwICsgdmFsX2wgKiAxMDAwIC8gMjU2OwogfQotc2hvd190ZW1wKGxvY2FsKTsKLXNob3dfdGVtcChyZW1vdGUxKTsKLXNob3dfdGVtcChyZW1vdGUyKTsKIAotc3RhdGljIHNzaXplX3Qgc2hvd19pbnRlcnZhbChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJIGNoYXIgKmJ1ZikKK3N0YXRpYyBzdHJ1Y3QgbG05NTI0MV9kYXRhICpsbTk1MjQxX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgZGF0YS0+aW50ZXJ2YWwpIHx8CisJICAgICFkYXRhLT52YWxpZCkgeworCQlpbnQgaTsKKworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlVwZGF0aW5nIGxtOTUyNDEgZGF0YS5cbiIpOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShsbTk1MjQxX3JlZ19hZGRyZXNzKTsgaSsrKQorCQkJZGF0YS0+dGVtcFtpXQorCQkJICA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCQkgICAgIGxtOTUyNDFfcmVnX2FkZHJlc3NbaV0pOworCQlkYXRhLT5sYXN0X3VwZGF0ZWQgPSBqaWZmaWVzOworCQlkYXRhLT52YWxpZCA9IDE7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworLyogU3lzZnMgc3R1ZmYgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfaW5wdXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgY2hhciAqYnVmKQogewogCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBsbTk1MjQxX3VwZGF0ZV9kZXZpY2UoZGV2KTsKIAotCXNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFIC0gMSwgIiVsdVxuIiwgMTAwMCAqIGRhdGEtPmludGVydmFsIC8gSFopOwotCXJldHVybiBzdHJsZW4oYnVmKTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUgLSAxLCAiJWRcbiIsCisJCVRlbXBGcm9tUmVnKGRhdGEtPnRlbXBbdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleF0sCisJCQkgICAgZGF0YS0+dGVtcFt0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4ICsgMV0pKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd190eXBlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgY2hhciAqYnVmKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFIC0gMSwKKwkJZGF0YS0+bW9kZWwgJiB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4ID8gIjFcbiIgOiAiMlxuIik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF90eXBlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwlpbnQgc2hpZnQ7CisJdTggbWFzayA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CisKKwlpZiAoc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJnZhbCkgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodmFsICE9IDEgJiYgdmFsICE9IDIpCisJCXJldHVybiAtRUlOVkFMOworCisJc2hpZnQgPSBtYXNrID09IFIxTVNfTUFTSyA/IFRUMV9TSElGVCA6IFRUMl9TSElGVDsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWRhdGEtPnRydXRoZXJtICY9IH4oVFRfTUFTSyA8PCBzaGlmdCk7CisJaWYgKHZhbCA9PSAxKSB7CisJCWRhdGEtPm1vZGVsIHw9IG1hc2s7CisJCWRhdGEtPnRydXRoZXJtIHw9IChUVF9PTiA8PCBzaGlmdCk7CisJfSBlbHNlIHsKKwkJZGF0YS0+bW9kZWwgJj0gfm1hc2s7CisJCWRhdGEtPnRydXRoZXJtIHw9IChUVF9PRkYgPDwgc2hpZnQpOworCX0KKwlkYXRhLT52YWxpZCA9IDA7CisKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05NTI0MV9SRUdfUldfUkVNT1RFX01PREVMLAorCQkJCSAgZGF0YS0+bW9kZWwpOworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMTTk1MjQxX1JFR19SV19UUlVUSEVSTSwKKwkJCQkgIGRhdGEtPnRydXRoZXJtKTsKKworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFIC0gMSwKKwkJCWRhdGEtPmNvbmZpZyAmIHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXggPworCQkJIi0xMjcwMDBcbiIgOiAiMFxuIik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF9taW4oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWxvbmcgdmFsOworCisJaWYgKHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnZhbCkgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodmFsIDwgLTEyODAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlpZiAodmFsIDwgMCkKKwkJZGF0YS0+Y29uZmlnIHw9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CisJZWxzZQorCQlkYXRhLT5jb25maWcgJj0gfnRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CisJZGF0YS0+dmFsaWQgPSAwOworCisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTUyNDFfUkVHX1JXX0NPTkZJRywgZGF0YS0+Y29uZmlnKTsKKworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFIC0gMSwKKwkJCWRhdGEtPmNvbmZpZyAmIHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXggPworCQkJIjEyNzAwMFxuIiA6ICIyNTUwMDBcbiIpOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlsb25nIHZhbDsKKworCWlmIChzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ2YWwpIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHZhbCA+PSAyNTYwMDApCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKHZhbCA8PSAxMjcwMDApCisJCWRhdGEtPmNvbmZpZyB8PSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OworCWVsc2UKKwkJZGF0YS0+Y29uZmlnICY9IH50b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OworCWRhdGEtPnZhbGlkID0gMDsKKworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMTTk1MjQxX1JFR19SV19DT05GSUcsIGRhdGEtPmNvbmZpZyk7CisKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19pbnRlcnZhbChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGxtOTUyNDFfdXBkYXRlX2RldmljZShkZXYpOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFIC0gMSwgIiVsdVxuIiwgMTAwMCAqIGRhdGEtPmludGVydmFsCisJCQkvIEhaKTsKIH0KIAogc3RhdGljIHNzaXplX3Qgc2V0X2ludGVydmFsKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKKwkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwogCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKQEAgLTEzOCwxNzYgKzI4OSwzNCBAQAogCXJldHVybiBjb3VudDsKIH0KIAotI2RlZmluZSBzaG93X3R5cGUoZmxhZykgXAotc3RhdGljIHNzaXplX3Qgc2hvd190eXBlIyNmbGFnKHN0cnVjdCBkZXZpY2UgKmRldiwgXAotCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpIFwKLXsgXAotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7IFwKLQlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7IFwKLVwKLQlzbnByaW50ZihidWYsIFBBR0VfU0laRSAtIDEsIFwKLQkJZGF0YS0+bW9kZWwgJiBSIyNmbGFnIyNNU19NQVNLID8gIjFcbiIgOiAiMlxuIik7IFwKLQlyZXR1cm4gc3RybGVuKGJ1Zik7IFwKLX0KLXNob3dfdHlwZSgxKTsKLXNob3dfdHlwZSgyKTsKLQotI2RlZmluZSBzaG93X21pbihmbGFnKSBcCi1zdGF0aWMgc3NpemVfdCBzaG93X21pbiMjZmxhZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIFwKLSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKSBcCi17IFwKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCi0Jc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCi1cCi0Jc25wcmludGYoYnVmLCBQQUdFX1NJWkUgLSAxLCBcCi0JCWRhdGEtPmNvbmZpZyAmIFIjI2ZsYWcjI0RGX01BU0sgPwlcCi0JCSItMTI3MDAwXG4iIDogIjBcbiIpOyBcCi0JcmV0dXJuIHN0cmxlbihidWYpOyBcCi19Ci1zaG93X21pbigxKTsKLXNob3dfbWluKDIpOwotCi0jZGVmaW5lIHNob3dfbWF4KGZsYWcpIFwKLXN0YXRpYyBzc2l6ZV90IHNob3dfbWF4IyNmbGFnKHN0cnVjdCBkZXZpY2UgKmRldiwgXAotICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpIFwKLXsgXAotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7IFwKLQlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7IFwKLVwKLQlzbnByaW50ZihidWYsIFBBR0VfU0laRSAtIDEsIFwKLQkJZGF0YS0+Y29uZmlnICYgUiMjZmxhZyMjREZfTUFTSyA/IFwKLQkJIjEyNzAwMFxuIiA6ICIyNTUwMDBcbiIpOyBcCi0JcmV0dXJuIHN0cmxlbihidWYpOyBcCi19Ci1zaG93X21heCgxKTsKLXNob3dfbWF4KDIpOwotCi0jZGVmaW5lIHNldF90eXBlKGZsYWcpIFwKLXN0YXRpYyBzc2l6ZV90IHNldF90eXBlIyNmbGFnKHN0cnVjdCBkZXZpY2UgKmRldiwgXAotCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIFwKLQkJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSBcCi17IFwKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCi0Jc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCi1cCi0JbG9uZyB2YWw7IFwKLVwKLQlpZiAoc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKSA8IDApIFwKLQkJcmV0dXJuIC1FSU5WQUw7IFwKLVwKLQlpZiAoKHZhbCA9PSAxKSB8fCAodmFsID09IDIpKSB7IFwKLVwKLQkJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOyBcCi1cCi0JCWRhdGEtPnRydXRoZXJtICY9IH4oVFRfTUFTSyA8PCBUVCMjZmxhZyMjX1NISUZUKTsgXAotCQlpZiAodmFsID09IDEpIHsgXAotCQkJZGF0YS0+bW9kZWwgfD0gUiMjZmxhZyMjTVNfTUFTSzsgXAotCQkJZGF0YS0+dHJ1dGhlcm0gfD0gKFRUX09OIDw8IFRUIyNmbGFnIyNfU0hJRlQpOyBcCi0JCX0gXAotCQllbHNlIHsgXAotCQkJZGF0YS0+bW9kZWwgJj0gflIjI2ZsYWcjI01TX01BU0s7IFwKLQkJCWRhdGEtPnRydXRoZXJtIHw9IChUVF9PRkYgPDwgVFQjI2ZsYWcjI19TSElGVCk7IFwKLQkJfSBcCi1cCi0JCWRhdGEtPnZhbGlkID0gMDsgXAotXAotCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05NTI0MV9SRUdfUldfUkVNT1RFX01PREVMLCBcCi0JCQkJCSAgZGF0YS0+bW9kZWwpOyBcCi0JCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMTTk1MjQxX1JFR19SV19UUlVUSEVSTSwgXAotCQkJCQkgIGRhdGEtPnRydXRoZXJtKTsgXAotXAotCQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAotXAotCX0gXAotCXJldHVybiBjb3VudDsgXAotfQotc2V0X3R5cGUoMSk7Ci1zZXRfdHlwZSgyKTsKLQotI2RlZmluZSBzZXRfbWluKGZsYWcpIFwKLXN0YXRpYyBzc2l6ZV90IHNldF9taW4jI2ZsYWcoc3RydWN0IGRldmljZSAqZGV2LCBcCi0Jc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSBcCi17IFwKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCi0Jc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCi1cCi0JbG9uZyB2YWw7IFwKLVwKLQlpZiAoc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKSA8IDApIFwKLQkJcmV0dXJuIC1FSU5WQUw7XAotXAotCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAotXAotCWlmICh2YWwgPCAwKSBcCi0JCWRhdGEtPmNvbmZpZyB8PSBSIyNmbGFnIyNERl9NQVNLOyBcCi0JZWxzZSBcCi0JCWRhdGEtPmNvbmZpZyAmPSB+UiMjZmxhZyMjREZfTUFTSzsgXAotXAotCWRhdGEtPnZhbGlkID0gMDsgXAotXAotCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMTTk1MjQxX1JFR19SV19DT05GSUcsIFwKLQkJZGF0YS0+Y29uZmlnKTsgXAotXAotCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOyBcCi1cCi0JcmV0dXJuIGNvdW50OyBcCi19Ci1zZXRfbWluKDEpOwotc2V0X21pbigyKTsKLQotI2RlZmluZSBzZXRfbWF4KGZsYWcpIFwKLXN0YXRpYyBzc2l6ZV90IHNldF9tYXgjI2ZsYWcoc3RydWN0IGRldmljZSAqZGV2LCBcCi0Jc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSBcCi17IFwKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCi0Jc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCi1cCi0JbG9uZyB2YWw7IFwKLVwKLQlpZiAoc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKSA8IDApIFwKLQkJcmV0dXJuIC1FSU5WQUw7IFwKLVwKLQltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKLVwKLQlpZiAodmFsIDw9IDEyNzAwMCkgXAotCQlkYXRhLT5jb25maWcgfD0gUiMjZmxhZyMjREZfTUFTSzsgXAotCWVsc2UgXAotCQlkYXRhLT5jb25maWcgJj0gflIjI2ZsYWcjI0RGX01BU0s7IFwKLVwKLQlkYXRhLT52YWxpZCA9IDA7IFwKLVwKLQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05NTI0MV9SRUdfUldfQ09ORklHLCBcCi0JCWRhdGEtPmNvbmZpZyk7IFwKLVwKLQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAotXAotCXJldHVybiBjb3VudDsgXAotfQotc2V0X21heCgxKTsKLXNldF9tYXgoMik7Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgc2hvd19sb2NhbCwgTlVMTCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIodGVtcDJfaW5wdXQsIFNfSVJVR08sIHNob3dfcmVtb3RlMSwgTlVMTCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIodGVtcDNfaW5wdXQsIFNfSVJVR08sIHNob3dfcmVtb3RlMiwgTlVMTCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIodGVtcDJfdHlwZSwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdHlwZTEsIHNldF90eXBlMSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIodGVtcDNfdHlwZSwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdHlwZTIsIHNldF90eXBlMik7Ci1zdGF0aWMgREVWSUNFX0FUVFIodGVtcDJfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19taW4xLCBzZXRfbWluMSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIodGVtcDNfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19taW4yLCBzZXRfbWluMik7Ci1zdGF0aWMgREVWSUNFX0FUVFIodGVtcDJfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19tYXgxLCBzZXRfbWF4MSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIodGVtcDNfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19tYXgyLCBzZXRfbWF4Mik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2lucHV0LCBTX0lSVUdPLCBzaG93X2lucHV0LCBOVUxMLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfaW5wdXQsIFNfSVJVR08sIHNob3dfaW5wdXQsIE5VTEwsIDIpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19pbnB1dCwgU19JUlVHTywgc2hvd19pbnB1dCwgTlVMTCwgNCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX3R5cGUsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3R5cGUsIHNldF90eXBlLAorCQkJICBSMU1TX01BU0spOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM190eXBlLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190eXBlLCBzZXRfdHlwZSwKKwkJCSAgUjJNU19NQVNLKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19taW4sIHNldF9taW4sCisJCQkgIFIxREZfTUFTSyk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX21pbiwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfbWluLCBzZXRfbWluLAorCQkJICBSMkRGX01BU0spOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X21heCwgc2V0X21heCwKKwkJCSAgUjFERl9NQVNLKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19tYXgsIHNldF9tYXgsCisJCQkgIFIyREZfTUFTSyk7CiBzdGF0aWMgREVWSUNFX0FUVFIodXBkYXRlX2ludGVydmFsLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19pbnRlcnZhbCwKIAkJICAgc2V0X2ludGVydmFsKTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmxtOTUyNDFfYXR0cmlidXRlc1tdID0gewotCSZkZXZfYXR0cl90ZW1wMV9pbnB1dC5hdHRyLAotCSZkZXZfYXR0cl90ZW1wMl9pbnB1dC5hdHRyLAotCSZkZXZfYXR0cl90ZW1wM19pbnB1dC5hdHRyLAotCSZkZXZfYXR0cl90ZW1wMl90eXBlLmF0dHIsCi0JJmRldl9hdHRyX3RlbXAzX3R5cGUuYXR0ciwKLQkmZGV2X2F0dHJfdGVtcDJfbWluLmF0dHIsCi0JJmRldl9hdHRyX3RlbXAzX21pbi5hdHRyLAotCSZkZXZfYXR0cl90ZW1wMl9tYXguYXR0ciwKLQkmZGV2X2F0dHJfdGVtcDNfbWF4LmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl90eXBlLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wM190eXBlLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX21pbi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19tYXguZGV2X2F0dHIuYXR0ciwKIAkmZGV2X2F0dHJfdXBkYXRlX2ludGVydmFsLmF0dHIsCiAJTlVMTAogfTsKQEAgLTMyOSw5ICszMzgsOSBAQAogCiAJaWYgKChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgTE05NTI0MV9SRUdfUl9NQU5fSUQpCiAJICAgICA9PSBNQU5VRkFDVFVSRVJfSUQpCi0JICYmIChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgTE05NTI0MV9SRUdfUl9DSElQX0lEKQotCSAgICAgPj0gREVGQVVMVF9SRVZJU0lPTikpIHsKLQkJbmFtZSA9ICJsbTk1MjQxIjsKKwkgICAgJiYgKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LCBMTTk1MjQxX1JFR19SX0NISVBfSUQpCisJCT49IERFRkFVTFRfUkVWSVNJT04pKSB7CisJCW5hbWUgPSBERVZOQU1FOwogCX0gZWxzZSB7CiAJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwgIkxNOTUyNDEgZGV0ZWN0aW9uIGZhaWxlZCBhdCAweCUwMnhcbiIsCiAJCQlhZGRyZXNzKTsKQEAgLTM0Myw2ICszNTIsMjUgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgbG05NTI0MV9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWRhdGEtPmludGVydmFsID0gSFo7CS8qIDEgc2VjIGRlZmF1bHQgKi8KKwlkYXRhLT52YWxpZCA9IDA7CisJZGF0YS0+Y29uZmlnID0gQ0ZHX0NSMDA3NjsKKwlkYXRhLT5tb2RlbCA9IDA7CisJZGF0YS0+dHJ1dGhlcm0gPSAoVFRfT0ZGIDw8IFRUMV9TSElGVCkgfCAoVFRfT0ZGIDw8IFRUMl9TSElGVCk7CisKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05NTI0MV9SRUdfUldfQ09ORklHLCBkYXRhLT5jb25maWcpOworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMTTk1MjQxX1JFR19SV19SRU1fRklMVEVSLAorCQkJCSAgUjFGRV9NQVNLIHwgUjJGRV9NQVNLKTsKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05NTI0MV9SRUdfUldfVFJVVEhFUk0sCisJCQkJICBkYXRhLT50cnV0aGVybSk7CisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTUyNDFfUkVHX1JXX1JFTU9URV9NT0RFTCwKKwkJCQkgIGRhdGEtPm1vZGVsKTsKK30KKwogc3RhdGljIGludCBsbTk1MjQxX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50LAogCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKQEAgLTM4MiwyNiArNDEwLDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgdm9pZCBsbTk1MjQxX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0Jc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCi0JZGF0YS0+aW50ZXJ2YWwgPSBIWjsgICAgLyogMSBzZWMgZGVmYXVsdCAqLwotCWRhdGEtPnZhbGlkID0gMDsKLQlkYXRhLT5jb25maWcgPSBDRkdfQ1IwMDc2OwotCWRhdGEtPm1vZGVsID0gMDsKLQlkYXRhLT50cnV0aGVybSA9IChUVF9PRkYgPDwgVFQxX1NISUZUKSB8IChUVF9PRkYgPDwgVFQyX1NISUZUKTsKLQotCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMTTk1MjQxX1JFR19SV19DT05GSUcsCi0JCQkJICBkYXRhLT5jb25maWcpOwotCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMTTk1MjQxX1JFR19SV19SRU1fRklMVEVSLAotCQkJCSAgUjFGRV9NQVNLIHwgUjJGRV9NQVNLKTsKLQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05NTI0MV9SRUdfUldfVFJVVEhFUk0sCi0JCQkJICBkYXRhLT50cnV0aGVybSk7Ci0JaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTUyNDFfUkVHX1JXX1JFTU9URV9NT0RFTCwKLQkJCQkgIGRhdGEtPm1vZGVsKTsKLX0KLQogc3RhdGljIGludCBsbTk1MjQxX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKQEAgLTQxMyw0NiArNDIxLDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBsbTk1MjQxX2RhdGEgKmxtOTUyNDFfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0KLQltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0KLQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3VwZGF0ZWQgKyBkYXRhLT5pbnRlcnZhbCkgfHwKLQkgICAgIWRhdGEtPnZhbGlkKSB7Ci0JCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiVXBkYXRpbmcgbG05NTI0MSBkYXRhLlxuIik7Ci0JCWRhdGEtPmxvY2FsX2ggPQotCQkJaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKLQkJCQkJCSBMTTk1MjQxX1JFR19SX0xPQ0FMX1RFTVBIKTsKLQkJZGF0YS0+bG9jYWxfbCA9Ci0JCQlpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAotCQkJCQkJIExNOTUyNDFfUkVHX1JfTE9DQUxfVEVNUEwpOwotCQlkYXRhLT5yZW1vdGUxX2ggPQotCQkJaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKLQkJCQkJCSBMTTk1MjQxX1JFR19SX1JFTU9URTFfVEVNUEgpOwotCQlkYXRhLT5yZW1vdGUxX2wgPQotCQkJaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKLQkJCQkJCSBMTTk1MjQxX1JFR19SX1JFTU9URTFfVEVNUEwpOwotCQlkYXRhLT5yZW1vdGUyX2ggPQotCQkJaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKLQkJCQkJCSBMTTk1MjQxX1JFR19SX1JFTU9URTJfVEVNUEgpOwotCQlkYXRhLT5yZW1vdGUyX2wgPQotCQkJaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKLQkJCQkJCSBMTTk1MjQxX1JFR19SX1JFTU9URTJfVEVNUEwpOwotCQlkYXRhLT5sYXN0X3VwZGF0ZWQgPSBqaWZmaWVzOwotCQlkYXRhLT52YWxpZCA9IDE7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0KLQlyZXR1cm4gZGF0YTsKLX0KLQogLyogRHJpdmVyIGRhdGEgKGNvbW1vbiB0byBhbGwgY2xpZW50cykgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBsbTk1MjQxX2lkW10gPSB7Ci0JeyAibG05NTI0MSIsIDAgfSwKKwl7IERFVk5BTUUsIDAgfSwKIAl7IH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgbG05NTI0MV9pZCk7CkBAIC00NjAsNyArNDMxLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBsbTk1MjQxX2RyaXZlciA9IHsKIAkuY2xhc3MJCT0gSTJDX0NMQVNTX0hXTU9OLAogCS5kcml2ZXIgPSB7Ci0JCS5uYW1lICAgPSAibG05NTI0MSIsCisJCS5uYW1lCT0gREVWTkFNRSwKIAl9LAogCS5wcm9iZQkJPSBsbTk1MjQxX3Byb2JlLAogCS5yZW1vdmUJCT0gbG05NTI0MV9yZW1vdmUsCkBAIC00NzksNyArNDUwLDcgQEAKIAlpMmNfZGVsX2RyaXZlcigmbG05NTI0MV9kcml2ZXIpOwogfQogCi1NT0RVTEVfQVVUSE9SKCJEYXZpZGUgUml6em8gPGVscGEtcml6em9AZ21haWwuY29tPiIpOworTU9EVUxFX0FVVEhPUigiRGF2aWRlIFJpenpvIDxlbHBhLnJpenpvQGdtYWlsLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiTE05NTI0MSBzZW5zb3IgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vcGNmODU5MS5jIGIvZHJpdmVycy9od21vbi9wY2Y4NTkxLmMKaW5kZXggZGM3MjU5ZC4uNzMxYjA5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9wY2Y4NTkxLmMKKysrIGIvZHJpdmVycy9od21vbi9wY2Y4NTkxLmMKQEAgLTE4LDYgKzE4LDggQEAKICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC0yOTAsOCArMjkyLDcgQEAKIHN0YXRpYyBpbnQgX19pbml0IHBjZjg1OTFfaW5pdCh2b2lkKQogewogCWlmIChpbnB1dF9tb2RlIDwgMCB8fCBpbnB1dF9tb2RlID4gMykgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJwY2Y4NTkxOiBpbnZhbGlkIGlucHV0X21vZGUgKCVkKVxuIiwKLQkJICAgICAgIGlucHV0X21vZGUpOworCQlwcl93YXJuKCJpbnZhbGlkIGlucHV0X21vZGUgKCVkKVxuIiwgaW5wdXRfbW9kZSk7CiAJCWlucHV0X21vZGUgPSAwOwogCX0KIAlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJnBjZjg1OTFfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vcGtndGVtcC5jIGIvZHJpdmVycy9od21vbi9wa2d0ZW1wLmMKaW5kZXggMDc5ODIxMC4uMjFjODE3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9wa2d0ZW1wLmMKKysrIGIvZHJpdmVycy9od21vbi9wa2d0ZW1wLmMKQEAgLTIwLDYgKzIwLDggQEAKICAqIDAyMTEwLTEzMDEgVVNBLgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC0zMDMsNyArMzA1LDcgQEAKIAlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKERSVk5BTUUsIGNwdSk7CiAJaWYgKCFwZGV2KSB7CiAJCWVyciA9IC1FTk9NRU07Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IERldmljZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXByX2VycigiRGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKIAkJZ290byBleGl0OwogCX0KIApAQCAtMzE1LDggKzMxNyw3IEBACiAKIAllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogRGV2aWNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLAotCQkgICAgICAgZXJyKTsKKwkJcHJfZXJyKCJEZXZpY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsIGVycik7CiAJCWdvdG8gZXhpdF9kZXZpY2VfZnJlZTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vc2h0MjEuYyBiL2RyaXZlcnMvaHdtb24vc2h0MjEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzhjOTgxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9od21vbi9zaHQyMS5jCkBAIC0wLDAgKzEsMzA3IEBACisvKiBTZW5zaXJpb24gU0hUMjEgaHVtaWRpdHkgYW5kIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVXJzIEZsZWlzY2ggPHVycy5mbGVpc2NoQHNlbnNpcmlvbi5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICoKKyAqIERhdGEgc2hlZXQgYXZhaWxhYmxlICg1LzIwMTApIGF0CisgKiBodHRwOi8vd3d3LnNlbnNpcmlvbi5jb20vZW4vcGRmL3Byb2R1Y3RfaW5mb3JtYXRpb24vRGF0YXNoZWV0LWh1bWlkaXR5LXNlbnNvci1TSFQyMS5wZGYKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXN5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworLyogSTJDIGNvbW1hbmQgYnl0ZXMgKi8KKyNkZWZpbmUgU0hUMjFfVFJJR19UX01FQVNVUkVNRU5UX0hNICAweGUzCisjZGVmaW5lIFNIVDIxX1RSSUdfUkhfTUVBU1VSRU1FTlRfSE0gMHhlNQorCisvKioKKyAqIHN0cnVjdCBzaHQyMSAtIFNIVDIxIGRldmljZSBzcGVjaWZpYyBkYXRhCisgKiBAaHdtb25fZGV2OiBkZXZpY2UgcmVnaXN0ZXJlZCB3aXRoIGh3bW9uCisgKiBAbG9jazogbXV0ZXggdG8gcHJvdGVjdCBtZWFzdXJlbWVudCB2YWx1ZXMKKyAqIEB2YWxpZDogb25seSAwIGJlZm9yZSBmaXJzdCBtZWFzdXJlbWVudCBpcyB0YWtlbgorICogQGxhc3RfdXBkYXRlOiB0aW1lIG9mIGxhc3QgdXBkYXRlIChqaWZmaWVzKQorICogQHRlbXBlcmF0dXJlOiBjYWNoZWQgdGVtcGVyYXR1cmUgbWVhc3VyZW1lbnQgdmFsdWUKKyAqIEBodW1pZGl0eTogY2FjaGVkIGh1bWlkaXR5IG1lYXN1cmVtZW50IHZhbHVlCisgKi8KK3N0cnVjdCBzaHQyMSB7CisJc3RydWN0IGRldmljZSAqaHdtb25fZGV2OworCXN0cnVjdCBtdXRleCBsb2NrOworCWNoYXIgdmFsaWQ7CisJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZTsKKwlpbnQgdGVtcGVyYXR1cmU7CisJaW50IGh1bWlkaXR5OworfTsKKworLyoqCisgKiBzaHQyMV90ZW1wX3RpY2tzX3RvX21pbGxpY2Vsc2l1cygpIC0gY29udmVydCByYXcgdGVtcGVyYXR1cmUgdGlja3MgdG8KKyAqIG1pbGxpIGNlbHNpdXMKKyAqIEB0aWNrczogdGVtcGVyYXR1cmUgdGlja3MgdmFsdWUgcmVjZWl2ZWQgZnJvbSBzZW5zb3IKKyAqLworc3RhdGljIGlubGluZSBpbnQgc2h0MjFfdGVtcF90aWNrc190b19taWxsaWNlbHNpdXMoaW50IHRpY2tzKQoreworCXRpY2tzICY9IH4weDAwMDM7IC8qIGNsZWFyIHN0YXR1cyBiaXRzICovCisJLyoKKwkgKiBGb3JtdWxhIFQgPSAtNDYuODUgKyAxNzUuNzIgKiBTVCAvIDJeMTYgZnJvbSBkYXRhIHNoZWV0IDYuMiwKKwkgKiBvcHRpbWl6ZWQgZm9yIGludGVnZXIgZml4ZWQgcG9pbnQgKDMgZGlnaXRzKSBhcml0aG1ldGljCisJICovCisJcmV0dXJuICgoMjE5NjUgKiB0aWNrcykgPj4gMTMpIC0gNDY4NTA7Cit9CisKKy8qKgorICogc2h0MjFfcmhfdGlja3NfdG9fcGVyX2NlbnRfbWlsbGUoKSAtIGNvbnZlcnQgcmF3IGh1bWlkaXR5IHRpY2tzIHRvCisgKiBvbmUtdGhvdXNhbmR0aHMgb2YgYSBwZXJjZW50IHJlbGF0aXZlIGh1bWlkaXR5CisgKiBAdGlja3M6IGh1bWlkaXR5IHRpY2tzIHZhbHVlIHJlY2VpdmVkIGZyb20gc2Vuc29yCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNodDIxX3JoX3RpY2tzX3RvX3Blcl9jZW50X21pbGxlKGludCB0aWNrcykKK3sKKwl0aWNrcyAmPSB+MHgwMDAzOyAvKiBjbGVhciBzdGF0dXMgYml0cyAqLworCS8qCisJICogRm9ybXVsYSBSSCA9IC02ICsgMTI1ICogU1JIIC8gMl4xNiBmcm9tIGRhdGEgc2hlZXQgNi4xLAorCSAqIG9wdGltaXplZCBmb3IgaW50ZWdlciBmaXhlZCBwb2ludCAoMyBkaWdpdHMpIGFyaXRobWV0aWMKKwkgKi8KKwlyZXR1cm4gKCgxNTYyNSAqIHRpY2tzKSA+PiAxMykgLSA2MDAwOworfQorCisvKioKKyAqIHNodDIxX3JlYWRfd29yZF9kYXRhKCkgLSByZWFkIHdvcmQgZnJvbSByZWdpc3RlcgorICogQGNsaWVudDogSTJDIGNsaWVudCBkZXZpY2UKKyAqIEByZWc6IEkyQyBjb21tYW5kIGJ5dGUKKyAqCisgKiBSZXR1cm5zIHZhbHVlLCBuZWdhdGl2ZSBlcnJubyBvbiBlcnJvci4KKyAqLworc3RhdGljIGlubGluZSBpbnQgc2h0MjFfcmVhZF93b3JkX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKQoreworCWludCByZXQgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCByZWcpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCS8qCisJICogU01CdXMgc3BlY2lmaWVzIGxvdyBieXRlIGZpcnN0LCBidXQgdGhlIFNIVDIxIHJldHVybnMgTVNCCisJICogZmlyc3QsIHNvIHdlIGhhdmUgdG8gc3dhYjE2IHRoZSB2YWx1ZXMKKwkgKi8KKwlyZXR1cm4gc3dhYjE2KHJldCk7Cit9CisKKy8qKgorICogc2h0MjFfdXBkYXRlX21lYXN1cmVtZW50cygpIC0gZ2V0IHVwZGF0ZWQgbWVhc3VyZW1lbnRzIGZyb20gZGV2aWNlCisgKiBAY2xpZW50OiBJMkMgY2xpZW50IGRldmljZQorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBlbHNlIG5lZ2F0aXZlIGVycm5vLgorICovCitzdGF0aWMgaW50IHNodDIxX3VwZGF0ZV9tZWFzdXJlbWVudHMoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgc2h0MjEgKnNodDIxID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwltdXRleF9sb2NrKCZzaHQyMS0+bG9jayk7CisJLyoKKwkgKiBEYXRhIHNoZWV0IDIuNDoKKwkgKiBTSFQyeCBzaG91bGQgbm90IGJlIGFjdGl2ZSBmb3IgbW9yZSB0aGFuIDEwJSBvZiB0aGUgdGltZSAtIGUuZy4KKwkgKiBtYXhpbXVtIHR3byBtZWFzdXJlbWVudHMgcGVyIHNlY29uZCBhdCAxMmJpdCBhY2N1cmFjeSBzaGFsbCBiZSBtYWRlLgorCSAqLworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHNodDIxLT5sYXN0X3VwZGF0ZSArIEhaIC8gMikgfHwgIXNodDIxLT52YWxpZCkgeworCQlyZXQgPSBzaHQyMV9yZWFkX3dvcmRfZGF0YShjbGllbnQsIFNIVDIxX1RSSUdfVF9NRUFTVVJFTUVOVF9ITSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisJCXNodDIxLT50ZW1wZXJhdHVyZSA9IHNodDIxX3RlbXBfdGlja3NfdG9fbWlsbGljZWxzaXVzKHJldCk7CisJCXJldCA9IHNodDIxX3JlYWRfd29yZF9kYXRhKGNsaWVudCwKKwkJCQkJU0hUMjFfVFJJR19SSF9NRUFTVVJFTUVOVF9ITSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisJCXNodDIxLT5odW1pZGl0eSA9IHNodDIxX3JoX3RpY2tzX3RvX3Blcl9jZW50X21pbGxlKHJldCk7CisJCXNodDIxLT5sYXN0X3VwZGF0ZSA9IGppZmZpZXM7CisJCXNodDIxLT52YWxpZCA9IDE7CisJfQorb3V0OgorCW11dGV4X3VubG9jaygmc2h0MjEtPmxvY2spOworCisJcmV0dXJuIHJldCA+PSAwID8gMCA6IHJldDsKK30KKworLyoqCisgKiBzaHQyMV9zaG93X3RlbXBlcmF0dXJlKCkgLSBzaG93IHRlbXBlcmF0dXJlIG1lYXN1cmVtZW50IHZhbHVlIGluIHN5c2ZzCisgKiBAZGV2OiBkZXZpY2UKKyAqIEBhdHRyOiBkZXZpY2UgYXR0cmlidXRlCisgKiBAYnVmOiBzeXNmcyBidWZmZXIgKFBBR0VfU0laRSkgd2hlcmUgbWVhc3VyZW1lbnQgdmFsdWVzIGFyZSB3cml0dGVuIHRvCisgKgorICogV2lsbCBiZSBjYWxsZWQgb24gcmVhZCBhY2Nlc3MgdG8gdGVtcDFfaW5wdXQgc3lzZnMgYXR0cmlidXRlLgorICogUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBpbnRvIGJ1ZmZlciwgbmVnYXRpdmUgZXJybm8gb24gZXJyb3IuCisgKi8KK3N0YXRpYyBzc2l6ZV90IHNodDIxX3Nob3dfdGVtcGVyYXR1cmUoc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBzaHQyMSAqc2h0MjEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgcmV0ID0gc2h0MjFfdXBkYXRlX21lYXN1cmVtZW50cyhjbGllbnQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBzaHQyMS0+dGVtcGVyYXR1cmUpOworfQorCisvKioKKyAqIHNodDIxX3Nob3dfaHVtaWRpdHkoKSAtIHNob3cgaHVtaWRpdHkgbWVhc3VyZW1lbnQgdmFsdWUgaW4gc3lzZnMKKyAqIEBkZXY6IGRldmljZQorICogQGF0dHI6IGRldmljZSBhdHRyaWJ1dGUKKyAqIEBidWY6IHN5c2ZzIGJ1ZmZlciAoUEFHRV9TSVpFKSB3aGVyZSBtZWFzdXJlbWVudCB2YWx1ZXMgYXJlIHdyaXR0ZW4gdG8KKyAqCisgKiBXaWxsIGJlIGNhbGxlZCBvbiByZWFkIGFjY2VzcyB0byBodW1pZGl0eTFfaW5wdXQgc3lzZnMgYXR0cmlidXRlLgorICogUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBpbnRvIGJ1ZmZlciwgbmVnYXRpdmUgZXJybm8gb24gZXJyb3IuCisgKi8KK3N0YXRpYyBzc2l6ZV90IHNodDIxX3Nob3dfaHVtaWRpdHkoc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBzaHQyMSAqc2h0MjEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgcmV0ID0gc2h0MjFfdXBkYXRlX21lYXN1cmVtZW50cyhjbGllbnQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBzaHQyMS0+aHVtaWRpdHkpOworfQorCisvKiBzeXNmcyBhdHRyaWJ1dGVzICovCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2lucHV0LCBTX0lSVUdPLCBzaHQyMV9zaG93X3RlbXBlcmF0dXJlLAorCU5VTEwsIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihodW1pZGl0eTFfaW5wdXQsIFNfSVJVR08sIHNodDIxX3Nob3dfaHVtaWRpdHksCisJTlVMTCwgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpzaHQyMV9hdHRyaWJ1dGVzW10gPSB7CisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaHVtaWRpdHkxX2lucHV0LmRldl9hdHRyLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgc2h0MjFfYXR0cl9ncm91cCA9IHsKKwkuYXR0cnMgPSBzaHQyMV9hdHRyaWJ1dGVzLAorfTsKKworLyoqCisgKiBzaHQyMV9wcm9iZSgpIC0gcHJvYmUgZGV2aWNlCisgKiBAY2xpZW50OiBJMkMgY2xpZW50IGRldmljZQorICogQGlkOiBkZXZpY2UgSUQKKyAqCisgKiBDYWxsZWQgYnkgdGhlIEkyQyBjb3JlIHdoZW4gYW4gZW50cnkgaW4gdGhlIElEIHRhYmxlIG1hdGNoZXMgYQorICogZGV2aWNlJ3MgbmFtZS4KKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzaHQyMV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3Qgc2h0MjEgKnNodDIxOworCWludCBlcnI7CisKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwKKwkJCQkgICAgIEkyQ19GVU5DX1NNQlVTX1dPUkRfREFUQSkpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCQkiYWRhcHRlciBkb2VzIG5vdCBzdXBwb3J0IFNNQnVzIHdvcmQgdHJhbnNhY3Rpb25zXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJc2h0MjEgPSBremFsbG9jKHNpemVvZigqc2h0MjEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNodDIxKSB7CisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAia3phbGxvYyBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgc2h0MjEpOworCisJbXV0ZXhfaW5pdCgmc2h0MjEtPmxvY2spOworCisJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmc2h0MjFfYXR0cl9ncm91cCk7CisJaWYgKGVycikgeworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgImNvdWxkIG5vdCBjcmVhdGUgc3lzZnMgZmlsZXNcbiIpOworCQlnb3RvIGZhaWxfZnJlZTsKKwl9CisJc2h0MjEtPmh3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmY2xpZW50LT5kZXYpOworCWlmIChJU19FUlIoc2h0MjEtPmh3bW9uX2RldikpIHsKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJ1bmFibGUgdG8gcmVnaXN0ZXIgaHdtb24gZGV2aWNlXG4iKTsKKwkJZXJyID0gUFRSX0VSUihzaHQyMS0+aHdtb25fZGV2KTsKKwkJZ290byBmYWlsX3JlbW92ZV9zeXNmczsKKwl9CisKKwlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJpbml0aWFsaXplZFxuIik7CisKKwlyZXR1cm4gMDsKKworZmFpbF9yZW1vdmVfc3lzZnM6CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmc2h0MjFfYXR0cl9ncm91cCk7CitmYWlsX2ZyZWU6CisJa2ZyZWUoc2h0MjEpOworCisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBzaHQyMV9yZW1vdmUoKSAtIHJlbW92ZSBkZXZpY2UKKyAqIEBjbGllbnQ6IEkyQyBjbGllbnQgZGV2aWNlCisgKi8KK3N0YXRpYyBpbnQgX19kZXZleGl0IHNodDIxX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBzaHQyMSAqc2h0MjEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKHNodDIxLT5od21vbl9kZXYpOworCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJnNodDIxX2F0dHJfZ3JvdXApOworCWtmcmVlKHNodDIxKTsKKworCXJldHVybiAwOworfQorCisvKiBEZXZpY2UgSUQgdGFibGUgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBzaHQyMV9pZFtdID0geworCXsgInNodDIxIiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBzaHQyMV9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBzaHQyMV9kcml2ZXIgPSB7CisJLmRyaXZlci5uYW1lID0gInNodDIxIiwKKwkucHJvYmUgICAgICAgPSBzaHQyMV9wcm9iZSwKKwkucmVtb3ZlICAgICAgPSBfX2RldmV4aXRfcChzaHQyMV9yZW1vdmUpLAorCS5pZF90YWJsZSAgICA9IHNodDIxX2lkLAorfTsKKworLyoqCisgKiBzaHQyMV9pbml0KCkgLSBpbml0aWFsaXplIGRyaXZlcgorICoKKyAqIENhbGxlZCB3aGVuIGtlcm5lbCBpcyBib290ZWQgb3IgbW9kdWxlIGlzIGluc2VydGVkLgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHNodDIxX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJnNodDIxX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChzaHQyMV9pbml0KTsKKworLyoqCisgKiBzaHQyMV9pbml0KCkgLSBjbGVhbiB1cCBkcml2ZXIKKyAqCisgKiBDYWxsZWQgd2hlbiBtb2R1bGUgaXMgcmVtb3ZlZC4KKyAqLworc3RhdGljIHZvaWQgX19leGl0IHNodDIxX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmc2h0MjFfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHNodDIxX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJVcnMgRmxlaXNjaCA8dXJzLmZsZWlzY2hAc2Vuc2lyaW9uLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU2Vuc2lyaW9uIFNIVDIxIGh1bWlkaXR5IGFuZCB0ZW1wZXJhdHVyZSBzZW5zb3IgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3NpczU1OTUuYyBiL2RyaXZlcnMvaHdtb24vc2lzNTU5NS5jCmluZGV4IDc5YzI5MzEuLjQ3ZDdjZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vc2lzNTU5NS5jCisrKyBiL2RyaXZlcnMvaHdtb24vc2lzNTU5NS5jCkBAIC01MCw2ICs1MCw4IEBACiAJIDczNQkJMDAwOAkJMDczNQogKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgpAQCAtNzM1LDIxICs3MzcsMTkgQEAKIAlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJzaXM1NTk1IiwgYWRkcmVzcyk7CiAJaWYgKCFwZGV2KSB7CiAJCWVyciA9IC1FTk9NRU07Ci0JCXByaW50ayhLRVJOX0VSUiAic2lzNTU5NTogRGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcHJfZXJyKCJEZXZpY2UgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwogCQlnb3RvIGV4aXQ7CiAJfQogCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGRldiwgJnJlcywgMSk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgInNpczU1OTU6IERldmljZSByZXNvdXJjZSBhZGRpdGlvbiBmYWlsZWQgIgotCQkgICAgICAgIiglZClcbiIsIGVycik7CisJCXByX2VycigiRGV2aWNlIHJlc291cmNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwogCQlnb3RvIGV4aXRfZGV2aWNlX3B1dDsKIAl9CiAKIAllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJzaXM1NTk1OiBEZXZpY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsCi0JCSAgICAgICBlcnIpOworCQlwcl9lcnIoIkRldmljZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBleGl0X2RldmljZV9wdXQ7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3Ntc2M0N2IzOTcuYyBiL2RyaXZlcnMvaHdtb24vc21zYzQ3YjM5Ny5jCmluZGV4IGY0NmQ5MzYuLjlmYjc1MTZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3Ntc2M0N2IzOTcuYworKysgYi9kcml2ZXJzL2h3bW9uL3Ntc2M0N2IzOTcuYwpAQCAtMjYsNiArMjYsOCBAQAogICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgpAQCAtMzExLDIxICszMTMsMTkgQEAKIAlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKERSVk5BTUUsIGFkZHJlc3MpOwogCWlmICghcGRldikgewogCQllcnIgPSAtRU5PTUVNOwotCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBEZXZpY2UgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlwcl9lcnIoIkRldmljZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX3Jlc291cmNlcyhwZGV2LCAmcmVzLCAxKTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IERldmljZSByZXNvdXJjZSBhZGRpdGlvbiBmYWlsZWQgIgotCQkgICAgICAgIiglZClcbiIsIGVycik7CisJCXByX2VycigiRGV2aWNlIHJlc291cmNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwogCQlnb3RvIGV4aXRfZGV2aWNlX3B1dDsKIAl9CiAKIAllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogRGV2aWNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLAotCQkgICAgICAgZXJyKTsKKwkJcHJfZXJyKCJEZXZpY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsIGVycik7CiAJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwogCX0KIApAQCAtMzY3LDggKzM2Nyw3IEBACiAJKmFkZHIgPSAoc3VwZXJpb19pbmIoU1VQRVJJT19SRUdfQkFTRV9NU0IpIDw8IDgpCiAJCSB8ICBzdXBlcmlvX2luYihTVVBFUklPX1JFR19CQVNFX0xTQik7CiAKLQlwcmludGsoS0VSTl9JTkZPIERSVk5BTUUgIjogZm91bmQgU01TQyAlcyAiCi0JCSIoYmFzZSBhZGRyZXNzIDB4JTA0eCwgcmV2aXNpb24gJXUpXG4iLAorCXByX2luZm8oImZvdW5kIFNNU0MgJXMgKGJhc2UgYWRkcmVzcyAweCUwNHgsIHJldmlzaW9uICV1KVxuIiwKIAkJbmFtZSwgKmFkZHIsIHJldik7CiAKIAlzdXBlcmlvX2V4aXQoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vc21zYzQ3bTEuYyBiL2RyaXZlcnMvaHdtb24vc21zYzQ3bTEuYwppbmRleCA4ZmE0NjJmLi5mNDRhODlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3Ntc2M0N20xLmMKKysrIGIvZHJpdmVycy9od21vbi9zbXNjNDdtMS5jCkBAIC0yNiw2ICsyNiw4IEBACiAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CkBAIC00MzUsMzAgKzQzNywyOSBAQAogCSAqLwogCXN3aXRjaCAodmFsKSB7CiAJY2FzZSAweDUxOgotCQlwcl9pbmZvKERSVk5BTUUgIjogRm91bmQgU01TQyBMUEM0N0IyN3hcbiIpOworCQlwcl9pbmZvKCJGb3VuZCBTTVNDIExQQzQ3QjI3eFxuIik7CiAJCXNpb19kYXRhLT50eXBlID0gc21zYzQ3bTE7CiAJCWJyZWFrOwogCWNhc2UgMHg1OToKLQkJcHJfaW5mbyhEUlZOQU1FICI6IEZvdW5kIFNNU0MgTFBDNDdNMTB4L0xQQzQ3TTExMi9MUEM0N00xM3hcbiIpOworCQlwcl9pbmZvKCJGb3VuZCBTTVNDIExQQzQ3TTEweC9MUEM0N00xMTIvTFBDNDdNMTN4XG4iKTsKIAkJc2lvX2RhdGEtPnR5cGUgPSBzbXNjNDdtMTsKIAkJYnJlYWs7CiAJY2FzZSAweDVGOgotCQlwcl9pbmZvKERSVk5BTUUgIjogRm91bmQgU01TQyBMUEM0N00xNHhcbiIpOworCQlwcl9pbmZvKCJGb3VuZCBTTVNDIExQQzQ3TTE0eFxuIik7CiAJCXNpb19kYXRhLT50eXBlID0gc21zYzQ3bTE7CiAJCWJyZWFrOwogCWNhc2UgMHg2MDoKLQkJcHJfaW5mbyhEUlZOQU1FICI6IEZvdW5kIFNNU0MgTFBDNDdNMTV4L0xQQzQ3TTE5Mi9MUEM0N005OTdcbiIpOworCQlwcl9pbmZvKCJGb3VuZCBTTVNDIExQQzQ3TTE1eC9MUEM0N00xOTIvTFBDNDdNOTk3XG4iKTsKIAkJc2lvX2RhdGEtPnR5cGUgPSBzbXNjNDdtMTsKIAkJYnJlYWs7CiAJY2FzZSAweDZCOgogCQlpZiAoc3VwZXJpb19pbmIoU1VQRVJJT19SRUdfREVWUkVWKSAmIDB4ODApIHsKLQkJCXByX2RlYnVnKERSVk5BTUUgIjogIgotCQkJCSAiRm91bmQgU01TQyBMUEM0N00yMzMsIHVuc3VwcG9ydGVkXG4iKTsKKwkJCXByX2RlYnVnKCJGb3VuZCBTTVNDIExQQzQ3TTIzMywgdW5zdXBwb3J0ZWRcbiIpOwogCQkJc3VwZXJpb19leGl0KCk7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQogCi0JCXByX2luZm8oRFJWTkFNRSAiOiBGb3VuZCBTTVNDIExQQzQ3TTI5MlxuIik7CisJCXByX2luZm8oIkZvdW5kIFNNU0MgTFBDNDdNMjkyXG4iKTsKIAkJc2lvX2RhdGEtPnR5cGUgPSBzbXNjNDdtMjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTQ3MCw3ICs0NzEsNyBAQAogCSphZGRyID0gKHN1cGVyaW9faW5iKFNVUEVSSU9fUkVHX0JBU0UpIDw8IDgpCiAJICAgICAgfCAgc3VwZXJpb19pbmIoU1VQRVJJT19SRUdfQkFTRSArIDEpOwogCWlmICgqYWRkciA9PSAwKSB7Ci0JCXByX2luZm8oRFJWTkFNRSAiOiBEZXZpY2UgYWRkcmVzcyBub3Qgc2V0LCB3aWxsIG5vdCB1c2VcbiIpOworCQlwcl9pbmZvKCJEZXZpY2UgYWRkcmVzcyBub3Qgc2V0LCB3aWxsIG5vdCB1c2VcbiIpOwogCQlzdXBlcmlvX2V4aXQoKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpAQCAtNDc5LDcgKzQ4MCw3IEBACiAJICogQ29tcGFxIFByZXNhcmlvIFM0MDAwTlgpICovCiAJc2lvX2RhdGEtPmFjdGl2YXRlID0gc3VwZXJpb19pbmIoU1VQRVJJT19SRUdfQUNUKTsKIAlpZiAoKHNpb19kYXRhLT5hY3RpdmF0ZSAmIDB4MDEpID09IDApIHsKLQkJcHJfaW5mbyhEUlZOQU1FICI6IEVuYWJsaW5nIGRldmljZVxuIik7CisJCXByX2luZm8oIkVuYWJsaW5nIGRldmljZVxuIik7CiAJCXN1cGVyaW9fb3V0YihTVVBFUklPX1JFR19BQ1QsIHNpb19kYXRhLT5hY3RpdmF0ZSB8IDB4MDEpOwogCX0KIApAQCAtNDk0LDcgKzQ5NSw3IEBACiAJCXN1cGVyaW9fZW50ZXIoKTsKIAkJc3VwZXJpb19zZWxlY3QoKTsKIAotCQlwcl9pbmZvKERSVk5BTUUgIjogRGlzYWJsaW5nIGRldmljZVxuIik7CisJCXByX2luZm8oIkRpc2FibGluZyBkZXZpY2VcbiIpOwogCQlzdXBlcmlvX291dGIoU1VQRVJJT19SRUdfQUNULCBzaW9fZGF0YS0+YWN0aXZhdGUpOwogCiAJCXN1cGVyaW9fZXhpdCgpOwpAQCAtODIzLDI4ICs4MjQsMjYgQEAKIAlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKERSVk5BTUUsIGFkZHJlc3MpOwogCWlmICghcGRldikgewogCQllcnIgPSAtRU5PTUVNOwotCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBEZXZpY2UgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlwcl9lcnIoIkRldmljZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX3Jlc291cmNlcyhwZGV2LCAmcmVzLCAxKTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IERldmljZSByZXNvdXJjZSBhZGRpdGlvbiBmYWlsZWQgIgotCQkgICAgICAgIiglZClcbiIsIGVycik7CisJCXByX2VycigiRGV2aWNlIHJlc291cmNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwogCQlnb3RvIGV4aXRfZGV2aWNlX3B1dDsKIAl9CiAKIAllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEocGRldiwgc2lvX2RhdGEsCiAJCQkJICAgICAgIHNpemVvZihzdHJ1Y3Qgc21zYzQ3bTFfc2lvX2RhdGEpKTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IFBsYXRmb3JtIGRhdGEgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlwcl9lcnIoIlBsYXRmb3JtIGRhdGEgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwogCQlnb3RvIGV4aXRfZGV2aWNlX3B1dDsKIAl9CiAKIAllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogRGV2aWNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLAotCQkgICAgICAgZXJyKTsKKwkJcHJfZXJyKCJEZXZpY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsIGVycik7CiAJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi92aWEtY3B1dGVtcC5jIGIvZHJpdmVycy9od21vbi92aWEtY3B1dGVtcC5jCmluZGV4IGVjN2ZhZDcuLjBkMThkZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vdmlhLWNwdXRlbXAuYworKysgYi9kcml2ZXJzL2h3bW9uL3ZpYS1jcHV0ZW1wLmMKQEAgLTIxLDYgKzIxLDggQEAKICAqIDAyMTEwLTEzMDEgVVNBLgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC0yMDIsNyArMjA0LDcgQEAKIAlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKERSVk5BTUUsIGNwdSk7CiAJaWYgKCFwZGV2KSB7CiAJCWVyciA9IC1FTk9NRU07Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IERldmljZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXByX2VycigiRGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKIAkJZ290byBleGl0OwogCX0KIApAQCAtMjE0LDggKzIxNiw3IEBACiAKIAllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogRGV2aWNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLAotCQkgICAgICAgZXJyKTsKKwkJcHJfZXJyKCJEZXZpY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsIGVycik7CiAJCWdvdG8gZXhpdF9kZXZpY2VfZnJlZTsKIAl9CiAKQEAgLTIzNywxMyArMjM4LDE2IEBACiAKIHN0YXRpYyB2b2lkIF9fY3B1aW5pdCB2aWFfY3B1dGVtcF9kZXZpY2VfcmVtb3ZlKHVuc2lnbmVkIGludCBjcHUpCiB7Ci0Jc3RydWN0IHBkZXZfZW50cnkgKnAsICpuOworCXN0cnVjdCBwZGV2X2VudHJ5ICpwOworCiAJbXV0ZXhfbG9jaygmcGRldl9saXN0X211dGV4KTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocCwgbiwgJnBkZXZfbGlzdCwgbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJnBkZXZfbGlzdCwgbGlzdCkgewogCQlpZiAocC0+Y3B1ID09IGNwdSkgewogCQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocC0+cGRldik7CiAJCQlsaXN0X2RlbCgmcC0+bGlzdCk7CisJCQltdXRleF91bmxvY2soJnBkZXZfbGlzdF9tdXRleCk7CiAJCQlrZnJlZShwKTsKKwkJCXJldHVybjsKIAkJfQogCX0KIAltdXRleF91bmxvY2soJnBkZXZfbGlzdF9tdXRleCk7CkBAIC0yNzMsNyArMjc3LDYgQEAKIHN0YXRpYyBpbnQgX19pbml0IHZpYV9jcHV0ZW1wX2luaXQodm9pZCkKIHsKIAlpbnQgaSwgZXJyOwotCXN0cnVjdCBwZGV2X2VudHJ5ICpwLCAqbjsKIAogCWlmIChjcHVfZGF0YSgwKS54ODZfdmVuZG9yICE9IFg4Nl9WRU5ET1JfQ0VOVEFVUikgewogCQlwcmludGsoS0VSTl9ERUJVRyBEUlZOQU1FICI6IE5vdCBhIFZJQSBDUFVcbiIpOwpAQCAtMjk1LDMzICsyOTgsMjcgQEAKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChjLT54ODZfbW9kZWwgPiAweDBmKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVk5BTUUgIjogVW5rbm93biBDUFUgIgotCQkJCSJtb2RlbCAweCV4XG4iLCBjLT54ODZfbW9kZWwpOworCQkJcHJfd2FybigiVW5rbm93biBDUFUgbW9kZWwgMHgleFxuIiwgYy0+eDg2X21vZGVsKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJZXJyID0gdmlhX2NwdXRlbXBfZGV2aWNlX2FkZChpKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gZXhpdF9kZXZpY2VzX3VucmVnOworCQl2aWFfY3B1dGVtcF9kZXZpY2VfYWRkKGkpOwogCX0KKworI2lmbmRlZiBDT05GSUdfSE9UUExVR19DUFUKIAlpZiAobGlzdF9lbXB0eSgmcGRldl9saXN0KSkgewogCQllcnIgPSAtRU5PREVWOwogCQlnb3RvIGV4aXRfZHJpdmVyX3VucmVnOwogCX0KKyNlbmRpZgogCiAJcmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZ2aWFfY3B1dGVtcF9jcHVfbm90aWZpZXIpOwogCXJldHVybiAwOwogCi1leGl0X2RldmljZXNfdW5yZWc6Ci0JbXV0ZXhfbG9jaygmcGRldl9saXN0X211dGV4KTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocCwgbiwgJnBkZXZfbGlzdCwgbGlzdCkgewotCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihwLT5wZGV2KTsKLQkJbGlzdF9kZWwoJnAtPmxpc3QpOwotCQlrZnJlZShwKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZwZGV2X2xpc3RfbXV0ZXgpOworI2lmbmRlZiBDT05GSUdfSE9UUExVR19DUFUKIGV4aXRfZHJpdmVyX3VucmVnOgogCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ2aWFfY3B1dGVtcF9kcml2ZXIpOworI2VuZGlmCiBleGl0OgogCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3ZpYTY4NmEuYyBiL2RyaXZlcnMvaHdtb24vdmlhNjg2YS5jCmluZGV4IGYzOTdjZTcuLjEzZThkMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vdmlhNjg2YS5jCisrKyBiL2RyaXZlcnMvaHdtb24vdmlhNjg2YS5jCkBAIC0zMCw2ICszMCw4IEBACiAgICAgV2FybmluZyAtIG9ubHkgc3VwcG9ydHMgYSBzaW5nbGUgZGV2aWNlLgogKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgpAQCAtNzkxLDIxICs3OTMsMTkgQEAKIAlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJ2aWE2ODZhIiwgYWRkcmVzcyk7CiAJaWYgKCFwZGV2KSB7CiAJCWVyciA9IC1FTk9NRU07Ci0JCXByaW50ayhLRVJOX0VSUiAidmlhNjg2YTogRGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcHJfZXJyKCJEZXZpY2UgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwogCQlnb3RvIGV4aXQ7CiAJfQogCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGRldiwgJnJlcywgMSk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgInZpYTY4NmE6IERldmljZSByZXNvdXJjZSBhZGRpdGlvbiBmYWlsZWQgIgotCQkgICAgICAgIiglZClcbiIsIGVycik7CisJCXByX2VycigiRGV2aWNlIHJlc291cmNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwogCQlnb3RvIGV4aXRfZGV2aWNlX3B1dDsKIAl9CiAKIAllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ2aWE2ODZhOiBEZXZpY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsCi0JCSAgICAgICBlcnIpOworCQlwcl9lcnIoIkRldmljZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBleGl0X2RldmljZV9wdXQ7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3Z0MTIxMS5jIGIvZHJpdmVycy9od21vbi92dDEyMTEuYwppbmRleCBhZTMzYmJiLi40OTE2M2Q0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3Z0MTIxMS5jCisrKyBiL2RyaXZlcnMvaHdtb24vdnQxMjExLmMKQEAgLTIxLDYgKzIxLDggQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC0xMjU0LDggKzEyNTYsNyBAQAogCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoRFJWTkFNRSwgYWRkcmVzcyk7CiAJaWYgKCFwZGV2KSB7CiAJCWVyciA9IC1FTk9NRU07Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IERldmljZSBhbGxvY2F0aW9uIGZhaWxlZCAoJWQpXG4iLAotCQkgICAgICAgZXJyKTsKKwkJcHJfZXJyKCJEZXZpY2UgYWxsb2NhdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBFWElUOwogCX0KIApAQCAtMTI2NiwxNSArMTI2NywxMyBAQAogCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGRldiwgJnJlcywgMSk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBEZXZpY2UgcmVzb3VyY2UgYWRkaXRpb24gZmFpbGVkICIKLQkJICAgICAgICIoJWQpXG4iLCBlcnIpOworCQlwcl9lcnIoIkRldmljZSByZXNvdXJjZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBFWElUX0RFVl9QVVQ7CiAJfQogCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZChwZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IERldmljZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwKLQkJICAgICAgIGVycik7CisJCXByX2VycigiRGV2aWNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwogCQlnb3RvIEVYSVRfREVWX1BVVDsKIAl9CiAKQEAgLTEzMDEsMjMgKzEzMDAsMjAgQEAKIAlzdXBlcmlvX3NlbGVjdChzaW9fY2lwLCBTSU9fVlQxMjExX0xETl9IV01PTik7CiAKIAlpZiAoKHN1cGVyaW9faW5iKHNpb19jaXAsIFNJT19WVDEyMTFfQUNUSVZFKSAmIDEpID09IDApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZOQU1FICI6IEhXIG1vbml0b3IgaXMgZGlzYWJsZWQsICIKLQkJICAgICAgICJza2lwcGluZ1xuIik7CisJCXByX3dhcm4oIkhXIG1vbml0b3IgaXMgZGlzYWJsZWQsIHNraXBwaW5nXG4iKTsKIAkJZ290byBFWElUOwogCX0KIAogCSphZGRyZXNzID0gKChzdXBlcmlvX2luYihzaW9fY2lwLCBTSU9fVlQxMjExX0JBRERSKSA8PCA4KSB8CiAJCSAgICAoc3VwZXJpb19pbmIoc2lvX2NpcCwgU0lPX1ZUMTIxMV9CQUREUiArIDEpKSkgJiAweGZmMDA7CiAJaWYgKCphZGRyZXNzID09IDApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZOQU1FICI6IEJhc2UgYWRkcmVzcyBpcyBub3Qgc2V0LCAiCi0JCSAgICAgICAic2tpcHBpbmdcbiIpOworCQlwcl93YXJuKCJCYXNlIGFkZHJlc3MgaXMgbm90IHNldCwgc2tpcHBpbmdcbiIpOwogCQlnb3RvIEVYSVQ7CiAJfQogCiAJZXJyID0gMDsKLQlwcmludGsoS0VSTl9JTkZPIERSVk5BTUUgIjogRm91bmQgVlQxMjExIGNoaXAgYXQgMHglMDR4LCAiCi0JICAgICAgICJyZXZpc2lvbiAldVxuIiwgKmFkZHJlc3MsCi0JICAgICAgIHN1cGVyaW9faW5iKHNpb19jaXAsIFNJT19WVDEyMTFfREVWUkVWKSk7CisJcHJfaW5mbygiRm91bmQgVlQxMjExIGNoaXAgYXQgMHglMDR4LCByZXZpc2lvbiAldVxuIiwKKwkJKmFkZHJlc3MsIHN1cGVyaW9faW5iKHNpb19jaXAsIFNJT19WVDEyMTFfREVWUkVWKSk7CiAKIEVYSVQ6CiAJc3VwZXJpb19leGl0KHNpb19jaXApOwpAQCAtMTMzNiwxNSArMTMzMiwxNSBAQAogCiAJaWYgKCh1Y2hfY29uZmlnIDwgLTEpIHx8ICh1Y2hfY29uZmlnID4gMzEpKSB7CiAJCWVyciA9IC1FSU5WQUw7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWTkFNRSAiOiBJbnZhbGlkIFVDSCBjb25maWd1cmF0aW9uICVkLiAiCi0JCSAgICAgICAiQ2hvb3NlIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAzMS5cbiIsIHVjaF9jb25maWcpOworCQlwcl93YXJuKCJJbnZhbGlkIFVDSCBjb25maWd1cmF0aW9uICVkLiAiCisJCQkiQ2hvb3NlIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAzMS5cbiIsIHVjaF9jb25maWcpOwogCSAgZ290byBFWElUOwogCX0KIAogCWlmICgoaW50X21vZGUgPCAtMSkgfHwgKGludF9tb2RlID4gMCkpIHsKIAkJZXJyID0gLUVJTlZBTDsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZOQU1FICI6IEludmFsaWQgaW50ZXJydXB0IG1vZGUgJWQuICIKLQkJICAgICAgICJPbmx5IG1vZGUgMCBpcyBzdXBwb3J0ZWQuXG4iLCBpbnRfbW9kZSk7CisJCXByX3dhcm4oIkludmFsaWQgaW50ZXJydXB0IG1vZGUgJWQuICIKKwkJCSJPbmx5IG1vZGUgMCBpcyBzdXBwb3J0ZWQuXG4iLCBpbnRfbW9kZSk7CiAJICBnb3RvIEVYSVQ7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3Z0ODIzMS5jIGIvZHJpdmVycy9od21vbi92dDgyMzEuYwppbmRleCBlNjA3OGM5Li5kYjNiMmU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3Z0ODIzMS5jCisrKyBiL2RyaXZlcnMvaHdtb24vdnQ4MjMxLmMKQEAgLTI0LDYgKzI0LDggQEAKIC8qIFN1cHBvcnRzIFZJQSBWVDgyMzEgU291dGggQnJpZGdlIGVtYmVkZGVkIHNlbnNvcnMKICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC05MDIsMjEgKzkwNCwxOSBAQAogCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoInZ0ODIzMSIsIGFkZHJlc3MpOwogCWlmICghcGRldikgewogCQllcnIgPSAtRU5PTUVNOwotCQlwcmludGsoS0VSTl9FUlIgInZ0ODIzMTogRGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcHJfZXJyKCJEZXZpY2UgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwogCQlnb3RvIGV4aXQ7CiAJfQogCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGRldiwgJnJlcywgMSk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgInZ0ODIzMTogRGV2aWNlIHJlc291cmNlIGFkZGl0aW9uIGZhaWxlZCAiCi0JCSAgICAgICAiKCVkKVxuIiwgZXJyKTsKKwkJcHJfZXJyKCJEZXZpY2UgcmVzb3VyY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsIGVycik7CiAJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwogCX0KIAogCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGQocGRldik7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgInZ0ODIzMTogRGV2aWNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLAotCQkgICAgICAgZXJyKTsKKwkJcHJfZXJyKCJEZXZpY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsIGVycik7CiAJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi93ODM2MjdlaGYuYyBiL2RyaXZlcnMvaHdtb24vdzgzNjI3ZWhmLmMKaW5kZXggMDcyYzU4MC4uMDczZWFiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi93ODM2MjdlaGYuYworKysgYi9kcml2ZXJzL2h3bW9uL3c4MzYyN2VoZi5jCkBAIC00Miw2ICs0Miw4IEBACiAgICAgdzgzNjY3aGctYiAgIDkgICAgICA1ICAgICAgIDMgICAgICAgMyAgICAgIDB4YjM1MCAweGMxICAgIDB4NWNhMwogKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTE2NjgsOCArMTY3MCw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWlmICh2YWwgIT0gMHhmZmZmKQotCQkJcHJfZGVidWcoRFJWTkFNRSAiOiB1bnN1cHBvcnRlZCBjaGlwIElEOiAweCUwNHhcbiIsCi0JCQkJIHZhbCk7CisJCQlwcl9kZWJ1ZygidW5zdXBwb3J0ZWQgY2hpcCBJRDogMHglMDR4XG4iLCB2YWwpOwogCQlzdXBlcmlvX2V4aXQoc2lvYWRkcik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTE2ODAsOCArMTY4MSw3IEBACiAJICAgIHwgc3VwZXJpb19pbmIoc2lvYWRkciwgU0lPX1JFR19BRERSICsgMSk7CiAJKmFkZHIgPSB2YWwgJiBJT1JFR0lPTl9BTElHTk1FTlQ7CiAJaWYgKCphZGRyID09IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogUmVmdXNpbmcgdG8gZW5hYmxlIGEgU3VwZXItSS9PICIKLQkJICAgICAgICJkZXZpY2Ugd2l0aCBhIGJhc2UgSS9PIHBvcnQgMC5cbiIpOworCQlwcl9lcnIoIlJlZnVzaW5nIHRvIGVuYWJsZSBhIFN1cGVyLUkvTyBkZXZpY2Ugd2l0aCBhIGJhc2UgSS9PIHBvcnQgMFxuIik7CiAJCXN1cGVyaW9fZXhpdChzaW9hZGRyKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpAQCAtMTY4OSwxMyArMTY4OSwxMiBAQAogCS8qIEFjdGl2YXRlIGxvZ2ljYWwgZGV2aWNlIGlmIG5lZWRlZCAqLwogCXZhbCA9IHN1cGVyaW9faW5iKHNpb2FkZHIsIFNJT19SRUdfRU5BQkxFKTsKIAlpZiAoISh2YWwgJiAweDAxKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVk5BTUUgIjogRm9yY2libHkgZW5hYmxpbmcgU3VwZXItSS9PLiAiCi0JCSAgICAgICAiU2Vuc29yIGlzIHByb2JhYmx5IHVudXNhYmxlLlxuIik7CisJCXByX3dhcm4oIkZvcmNpYmx5IGVuYWJsaW5nIFN1cGVyLUkvTy4gU2Vuc29yIGlzIHByb2JhYmx5IHVudXNhYmxlLlxuIik7CiAJCXN1cGVyaW9fb3V0YihzaW9hZGRyLCBTSU9fUkVHX0VOQUJMRSwgdmFsIHwgMHgwMSk7CiAJfQogCiAJc3VwZXJpb19leGl0KHNpb2FkZHIpOwotCXByX2luZm8oRFJWTkFNRSAiOiBGb3VuZCAlcyBjaGlwIGF0ICUjeFxuIiwgc2lvX25hbWUsICphZGRyKTsKKwlwcl9pbmZvKCJGb3VuZCAlcyBjaGlwIGF0ICUjeFxuIiwgc2lvX25hbWUsICphZGRyKTsKIAlzaW9fZGF0YS0+c2lvcmVnID0gc2lvYWRkcjsKIAogCXJldHVybiAwOwpAQCAtMTcyOSwxNCArMTcyOCwxNCBAQAogCiAJaWYgKCEocGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhEUlZOQU1FLCBhZGRyZXNzKSkpIHsKIAkJZXJyID0gLUVOT01FTTsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogRGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcHJfZXJyKCJEZXZpY2UgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwogCQlnb3RvIGV4aXRfdW5yZWdpc3RlcjsKIAl9CiAKIAllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEocGRldiwgJnNpb19kYXRhLAogCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHc4MzYyN2VoZl9zaW9fZGF0YSkpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogUGxhdGZvcm0gZGF0YSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXByX2VycigiUGxhdGZvcm0gZGF0YSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CiAJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwogCX0KIApAQCAtMTc1MiwxNiArMTc1MSwxNCBAQAogCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGRldiwgJnJlcywgMSk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBEZXZpY2UgcmVzb3VyY2UgYWRkaXRpb24gZmFpbGVkICIKLQkJICAgICAgICIoJWQpXG4iLCBlcnIpOworCQlwcl9lcnIoIkRldmljZSByZXNvdXJjZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBleGl0X2RldmljZV9wdXQ7CiAJfQogCiAJLyogcGxhdGZvcm1fZGV2aWNlX2FkZCBjYWxscyBwcm9iZSgpICovCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZChwZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IERldmljZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwKLQkJICAgICAgIGVycik7CisJCXByX2VycigiRGV2aWNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwogCQlnb3RvIGV4aXRfZGV2aWNlX3B1dDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vdzgzNjI3aGYuYyBiL2RyaXZlcnMvaHdtb24vdzgzNjI3aGYuYwppbmRleCAzOGUyODA1Li5iZGU1MGUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3c4MzYyN2hmLmMKKysrIGIvZHJpdmVycy9od21vbi93ODM2MjdoZi5jCkBAIC0zOSw2ICszOSw4IEBACiAgICAgc3VwcG9ydGVkIHlldC4KICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC0xMTY2LDE0ICsxMTY4LDEzIEBACiAJICAgICAgIHN1cGVyaW9faW5iKHNpb19kYXRhLCBXSU5CX0JBU0VfUkVHICsgMSk7CiAJKmFkZHIgPSB2YWwgJiBXSU5CX0FMSUdOTUVOVDsKIAlpZiAoKmFkZHIgPT0gMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVk5BTUUgIjogQmFzZSBhZGRyZXNzIG5vdCBzZXQsICIKLQkJICAgICAgICJza2lwcGluZ1xuIik7CisJCXByX3dhcm4oIkJhc2UgYWRkcmVzcyBub3Qgc2V0LCBza2lwcGluZ1xuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAl2YWwgPSBzdXBlcmlvX2luYihzaW9fZGF0YSwgV0lOQl9BQ1RfUkVHKTsKIAlpZiAoISh2YWwgJiAweDAxKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVk5BTUUgIjogRW5hYmxpbmcgSFdNIGxvZ2ljYWwgZGV2aWNlXG4iKTsKKwkJcHJfd2FybigiRW5hYmxpbmcgSFdNIGxvZ2ljYWwgZGV2aWNlXG4iKTsKIAkJc3VwZXJpb19vdXRiKHNpb19kYXRhLCBXSU5CX0FDVF9SRUcsIHZhbCB8IDB4MDEpOwogCX0KIApAQCAtMTc4OSwyOCArMTc5MCwyNiBAQAogCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoRFJWTkFNRSwgYWRkcmVzcyk7CiAJaWYgKCFwZGV2KSB7CiAJCWVyciA9IC1FTk9NRU07Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IERldmljZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXByX2VycigiRGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKIAkJZ290byBleGl0OwogCX0KIAogCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKHBkZXYsICZyZXMsIDEpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogRGV2aWNlIHJlc291cmNlIGFkZGl0aW9uIGZhaWxlZCAiCi0JCSAgICAgICAiKCVkKVxuIiwgZXJyKTsKKwkJcHJfZXJyKCJEZXZpY2UgcmVzb3VyY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsIGVycik7CiAJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwogCX0KIAogCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YShwZGV2LCBzaW9fZGF0YSwKIAkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB3ODM2MjdoZl9zaW9fZGF0YSkpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogUGxhdGZvcm0gZGF0YSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXByX2VycigiUGxhdGZvcm0gZGF0YSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CiAJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwogCX0KIAogCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGQocGRldik7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBEZXZpY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsCi0JCSAgICAgICBlcnIpOworCQlwcl9lcnIoIkRldmljZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBleGl0X2RldmljZV9wdXQ7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL2JjbTU5NzQuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvYmNtNTk3NC5jCmluZGV4IGI5NTIzMTcuLmVlODI4NTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvYmNtNTk3NC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvYmNtNTk3NC5jCkBAIC01NSw2ICs1NSwxNCBAQAogI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkczX0FOU0kJMHgwMjM2CiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzNfSVNPCTB4MDIzNwogI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkczX0pJUwkweDAyMzgKKy8qIE1hY2Jvb2tBaXIzLDIgKHVuaWJvZHkpLCBha2Egd2VsbHNwcmluZzUgKi8KKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNF9BTlNJCTB4MDIzZgorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0X0lTTwkweDAyNDAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNF9KSVMJMHgwMjQxCisvKiBNYWNib29rQWlyMywxICh1bmlib2R5KSwgYWthIHdlbGxzcHJpbmc0ICovCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRBX0FOU0kJMHgwMjQyCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRBX0lTTwkweDAyNDMKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNEFfSklTCTB4MDI0NAogCiAjZGVmaW5lIEJDTTU5NzRfREVWSUNFKHByb2QpIHsJCQkJCVwKIAkubWF0Y2hfZmxhZ3MgPSAoVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0UgfAkJXApAQCAtODAsNiArODgsMTQgQEAKIAlCQ001OTc0X0RFVklDRShVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkczX0FOU0kpLAogCUJDTTU5NzRfREVWSUNFKFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzNfSVNPKSwKIAlCQ001OTc0X0RFVklDRShVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkczX0pJUyksCisJLyogTWFjYm9va0FpcjMsMiAqLworCUJDTTU5NzRfREVWSUNFKFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRfQU5TSSksCisJQkNNNTk3NF9ERVZJQ0UoVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNF9JU08pLAorCUJDTTU5NzRfREVWSUNFKFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRfSklTKSwKKwkvKiBNYWNib29rQWlyMywxICovCisJQkNNNTk3NF9ERVZJQ0UoVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNEFfQU5TSSksCisJQkNNNTk3NF9ERVZJQ0UoVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNEFfSVNPKSwKKwlCQ001OTc0X0RFVklDRShVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0QV9KSVMpLAogCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCiAJe30KIH07CkBAIC0yMzQsNiArMjUwLDMwIEBACiAJCXsgRElNX1gsIERJTV9YIC8gU05fQ09PUkQsIC00NDYwLCA1MTY2IH0sCiAJCXsgRElNX1ksIERJTV9ZIC8gU05fQ09PUkQsIC03NSwgNjcwMCB9CiAJfSwKKwl7CisJCVVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRfQU5TSSwKKwkJVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNF9JU08sCisJCVVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRfSklTLAorCQlIQVNfSU5URUdSQVRFRF9CVVRUT04sCisJCTB4ODQsIHNpemVvZihzdHJ1Y3QgYnRfZGF0YSksCisJCTB4ODEsIFRZUEUyLCBGSU5HRVJfVFlQRTIsIEZJTkdFUl9UWVBFMiArIFNJWkVPRl9BTExfRklOR0VSUywKKwkJeyBESU1fUFJFU1NVUkUsIERJTV9QUkVTU1VSRSAvIFNOX1BSRVNTVVJFLCAwLCAzMDAgfSwKKwkJeyBESU1fV0lEVEgsIERJTV9XSURUSCAvIFNOX1dJRFRILCAwLCAyMDQ4IH0sCisJCXsgRElNX1gsIERJTV9YIC8gU05fQ09PUkQsIC00NjIwLCA1MTQwIH0sCisJCXsgRElNX1ksIERJTV9ZIC8gU05fQ09PUkQsIC0xNTAsIDY2MDAgfQorCX0sCisJeworCQlVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0QV9BTlNJLAorCQlVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0QV9JU08sCisJCVVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRBX0pJUywKKwkJSEFTX0lOVEVHUkFURURfQlVUVE9OLAorCQkweDg0LCBzaXplb2Yoc3RydWN0IGJ0X2RhdGEpLAorCQkweDgxLCBUWVBFMiwgRklOR0VSX1RZUEUyLCBGSU5HRVJfVFlQRTIgKyBTSVpFT0ZfQUxMX0ZJTkdFUlMsCisJCXsgRElNX1BSRVNTVVJFLCBESU1fUFJFU1NVUkUgLyBTTl9QUkVTU1VSRSwgMCwgMzAwIH0sCisJCXsgRElNX1dJRFRILCBESU1fV0lEVEggLyBTTl9XSURUSCwgMCwgMjA0OCB9LAorCQl7IERJTV9YLCBESU1fWCAvIFNOX0NPT1JELCAtNDYxNiwgNTExMiB9LAorCQl7IERJTV9ZLCBESU1fWSAvIFNOX0NPT1JELCAtMTQyLCA1MjM0IH0KKwl9LAogCXt9CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvZWVwcm9tL2F0MjQuYyBiL2RyaXZlcnMvbWlzYy9lZXByb20vYXQyNC5jCmluZGV4IDU1OWIwYjMuLmFiMWFkNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9lZXByb20vYXQyNC5jCisrKyBiL2RyaXZlcnMvbWlzYy9lZXByb20vYXQyNC5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvbG9nMi5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy9hdDI0Lmg+CiAKQEAgLTQ1Nyw2ICs0NTgsMjcgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAorI2lmZGVmIENPTkZJR19PRgorc3RhdGljIHZvaWQgYXQyNF9nZXRfb2ZkYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCXN0cnVjdCBhdDI0X3BsYXRmb3JtX2RhdGEgKmNoaXApCit7CisJY29uc3QgX19iZTMyICp2YWw7CisJc3RydWN0IGRldmljZV9ub2RlICpub2RlID0gY2xpZW50LT5kZXYub2Zfbm9kZTsKKworCWlmIChub2RlKSB7CisJCWlmIChvZl9nZXRfcHJvcGVydHkobm9kZSwgInJlYWQtb25seSIsIE5VTEwpKQorCQkJY2hpcC0+ZmxhZ3MgfD0gQVQyNF9GTEFHX1JFQURPTkxZOworCQl2YWwgPSBvZl9nZXRfcHJvcGVydHkobm9kZSwgInBhZ2VzaXplIiwgTlVMTCk7CisJCWlmICh2YWwpCisJCQljaGlwLT5wYWdlX3NpemUgPSBiZTMyX3RvX2NwdXAodmFsKTsKKwl9Cit9CisjZWxzZQorc3RhdGljIHZvaWQgYXQyNF9nZXRfb2ZkYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCXN0cnVjdCBhdDI0X3BsYXRmb3JtX2RhdGEgKmNoaXApCit7IH0KKyNlbmRpZiAvKiBDT05GSUdfT0YgKi8KKwogc3RhdGljIGludCBhdDI0X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgYXQyNF9wbGF0Zm9ybV9kYXRhIGNoaXA7CkBAIC00ODUsNiArNTA3LDkgQEAKIAkJICovCiAJCWNoaXAucGFnZV9zaXplID0gMTsKIAorCQkvKiB1cGRhdGUgY2hpcGRhdGEgaWYgT0YgaXMgcHJlc2VudCAqLworCQlhdDI0X2dldF9vZmRhdGEoY2xpZW50LCAmY2hpcCk7CisKIAkJY2hpcC5zZXR1cCA9IE5VTEw7CiAJCWNoaXAuY29udGV4dCA9IE5VTEw7CiAJfQpAQCAtNDkyLDYgKzUxNywxMSBAQAogCWlmICghaXNfcG93ZXJfb2ZfMihjaGlwLmJ5dGVfbGVuKSkKIAkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LAogCQkJImJ5dGVfbGVuIGxvb2tzIHN1c3BpY2lvdXMgKG5vIHBvd2VyIG9mIDIpIVxuIik7CisJaWYgKCFjaGlwLnBhZ2Vfc2l6ZSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInBhZ2Vfc2l6ZSBtdXN0IG5vdCBiZSAwIVxuIik7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX291dDsKKwl9CiAJaWYgKCFpc19wb3dlcl9vZl8yKGNoaXAucGFnZV9zaXplKSkKIAkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LAogCQkJInBhZ2Vfc2l6ZSBsb29rcyBzdXNwaWNpb3VzIChubyBwb3dlciBvZiAyKSFcbiIpOwpAQCAtNTk3LDE5ICs2MjcsMTUgQEAKIAogCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGF0MjQpOwogCi0JZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiJXp1IGJ5dGUgJXMgRUVQUk9NICVzXG4iLAorCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIiV6dSBieXRlICVzIEVFUFJPTSwgJXMsICV1IGJ5dGVzL3dyaXRlXG4iLAogCQlhdDI0LT5iaW4uc2l6ZSwgY2xpZW50LT5uYW1lLAotCQl3cml0YWJsZSA/ICIod3JpdGFibGUpIiA6ICIocmVhZC1vbmx5KSIpOworCQl3cml0YWJsZSA/ICJ3cml0YWJsZSIgOiAicmVhZC1vbmx5IiwgYXQyNC0+d3JpdGVfbWF4KTsKIAlpZiAodXNlX3NtYnVzID09IEkyQ19TTUJVU19XT1JEX0RBVEEgfHwKIAkgICAgdXNlX3NtYnVzID09IEkyQ19TTUJVU19CWVRFX0RBVEEpIHsKIAkJZGV2X25vdGljZSgmY2xpZW50LT5kZXYsICJGYWxsaW5nIGJhY2sgdG8gJXMgcmVhZHMsICIKIAkJCSAgICJwZXJmb3JtYW5jZSB3aWxsIHN1ZmZlclxuIiwgdXNlX3NtYnVzID09CiAJCQkgICBJMkNfU01CVVNfV09SRF9EQVRBID8gIndvcmQiIDogImJ5dGUiKTsKIAl9Ci0JZGV2X2RiZygmY2xpZW50LT5kZXYsCi0JCSJwYWdlX3NpemUgJWQsIG51bV9hZGRyZXNzZXMgJWQsIHdyaXRlX21heCAlZCwgdXNlX3NtYnVzICVkXG4iLAotCQljaGlwLnBhZ2Vfc2l6ZSwgbnVtX2FkZHJlc3NlcywKLQkJYXQyNC0+d3JpdGVfbWF4LCB1c2Vfc21idXMpOwogCiAJLyogZXhwb3J0IGRhdGEgdG8ga2VybmVsIGNvZGUgKi8KIAlpZiAoY2hpcC5zZXR1cCkKQEAgLTY2MCw2ICs2ODYsMTEgQEAKIAogc3RhdGljIGludCBfX2luaXQgYXQyNF9pbml0KHZvaWQpCiB7CisJaWYgKCFpb19saW1pdCkgeworCQlwcl9lcnIoImF0MjQ6IGlvX2xpbWl0IG11c3Qgbm90IGJlIDAhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJaW9fbGltaXQgPSByb3VuZGRvd25fcG93X29mX3R3byhpb19saW1pdCk7CiAJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZhdDI0X2RyaXZlcik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L0tjb25maWcgYi9kcml2ZXJzL21tYy9ob3N0L0tjb25maWcKaW5kZXggZDYxOGU4Ni4uZTk2MGE5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvS2NvbmZpZwpAQCAtODMsNyArODMsNyBAQAogCiBjb25maWcgTU1DX1NESENJX09GCiAJdHJpc3RhdGUgIlNESENJIHN1cHBvcnQgb24gT3BlbkZpcm13YXJlIHBsYXRmb3JtcyIKLQlkZXBlbmRzIG9uIE1NQ19TREhDSSAmJiBQUENfT0YKKwlkZXBlbmRzIG9uIE1NQ19TREhDSSAmJiBPRgogCWhlbHAKIAkgIFRoaXMgc2VsZWN0cyB0aGUgT0Ygc3VwcG9ydCBmb3IgU2VjdXJlIERpZ2l0YWwgSG9zdCBDb250cm9sbGVyCiAJICBJbnRlcmZhY2VzLgpAQCAtOTMsNiArOTMsNyBAQAogY29uZmlnIE1NQ19TREhDSV9PRl9FU0RIQwogCWJvb2wgIlNESENJIE9GIHN1cHBvcnQgZm9yIHRoZSBGcmVlc2NhbGUgZVNESEMgY29udHJvbGxlciIKIAlkZXBlbmRzIG9uIE1NQ19TREhDSV9PRgorCWRlcGVuZHMgb24gUFBDX09GCiAJc2VsZWN0IE1NQ19TREhDSV9CSUdfRU5ESUFOXzMyQklUX0JZVEVfU1dBUFBFUgogCWhlbHAKIAkgIFRoaXMgc2VsZWN0cyB0aGUgRnJlZXNjYWxlIGVTREhDIGNvbnRyb2xsZXIgc3VwcG9ydC4KQEAgLTEwMiw2ICsxMDMsNyBAQAogY29uZmlnIE1NQ19TREhDSV9PRl9ITFdECiAJYm9vbCAiU0RIQ0kgT0Ygc3VwcG9ydCBmb3IgdGhlIE5pbnRlbmRvIFdpaSBTREhDSSBjb250cm9sbGVycyIKIAlkZXBlbmRzIG9uIE1NQ19TREhDSV9PRgorCWRlcGVuZHMgb24gUFBDX09GCiAJc2VsZWN0IE1NQ19TREhDSV9CSUdfRU5ESUFOXzMyQklUX0JZVEVfU1dBUFBFUgogCWhlbHAKIAkgIFRoaXMgc2VsZWN0cyB0aGUgU2VjdXJlIERpZ2l0YWwgSG9zdCBDb250cm9sbGVyIEludGVyZmFjZSAoU0RIQ0kpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLWNvcmUuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktb2YtY29yZS5jCmluZGV4IGM1MWI3MTEuLmZhMTlkODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktb2YtY29yZS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktb2YtY29yZS5jCkBAIC0xMjIsNyArMTIyLDcgQEAKIAlzdHJ1Y3Qgc2RoY2lfb2ZfZGF0YSAqc2RoY2lfb2ZfZGF0YSA9IG1hdGNoLT5kYXRhOwogCXN0cnVjdCBzZGhjaV9ob3N0ICpob3N0OwogCXN0cnVjdCBzZGhjaV9vZl9ob3N0ICpvZl9ob3N0OwotCWNvbnN0IHUzMiAqY2xrOworCWNvbnN0IF9fYmUzMiAqY2xrOwogCWludCBzaXplOwogCWludCByZXQ7CiAKQEAgLTE2Niw3ICsxNjYsNyBAQAogCiAJY2xrID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiY2xvY2stZnJlcXVlbmN5IiwgJnNpemUpOwogCWlmIChjbGsgJiYgc2l6ZSA9PSBzaXplb2YoKmNsaykgJiYgKmNsaykKLQkJb2ZfaG9zdC0+Y2xvY2sgPSAqY2xrOworCQlvZl9ob3N0LT5jbG9jayA9IGJlMzJfdG9fY3B1cChjbGspOwogCiAJcmV0ID0gc2RoY2lfYWRkX2hvc3QoaG9zdCk7CiAJaWYgKHJldCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL0tjb25maWcgYi9kcml2ZXJzL210ZC9LY29uZmlnCmluZGV4IDFlMmNiZjUuLmIxZjc2ODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL0tjb25maWcKKysrIGIvZHJpdmVycy9tdGQvS2NvbmZpZwpAQCAtMTU5LDcgKzE1OSw3IEBACiAKIGNvbmZpZyBNVERfT0ZfUEFSVFMKIAl0cmlzdGF0ZSAiRmxhc2ggcGFydGl0aW9uIG1hcCBiYXNlZCBvbiBPRiBkZXNjcmlwdGlvbiIKLQlkZXBlbmRzIG9uIChNSUNST0JMQVpFIHx8IFBQQ19PRikgJiYgTVREX1BBUlRJVElPTlMKKwlkZXBlbmRzIG9uIE9GICYmIE1URF9QQVJUSVRJT05TCiAJaGVscAogCSAgVGhpcyBwcm92aWRlcyBhIHBhcnRpdGlvbiBwYXJzaW5nIGZ1bmN0aW9uIHdoaWNoIGRlcml2ZXMKIAkgIHRoZSBwYXJ0aXRpb24gbWFwIGZyb20gdGhlIGNoaWxkcmVuIG9mIHRoZSBmbGFzaCBub2RlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9LY29uZmlnIGIvZHJpdmVycy9tdGQvbWFwcy9LY29uZmlnCmluZGV4IGEwZGQ3YmIuLjVkMzdkMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvS2NvbmZpZworKysgYi9kcml2ZXJzL210ZC9tYXBzL0tjb25maWcKQEAgLTcyLDcgKzcyLDcgQEAKIAogY29uZmlnIE1URF9QSFlTTUFQX09GCiAJdHJpc3RhdGUgIkZsYXNoIGRldmljZSBpbiBwaHlzaWNhbCBtZW1vcnkgbWFwIGJhc2VkIG9uIE9GIGRlc2NyaXB0aW9uIgotCWRlcGVuZHMgb24gKE1JQ1JPQkxBWkUgfHwgUFBDX09GKSAmJiAoTVREX0NGSSB8fCBNVERfSkVERUNQUk9CRSB8fCBNVERfUk9NKQorCWRlcGVuZHMgb24gT0YgJiYgKE1URF9DRkkgfHwgTVREX0pFREVDUFJPQkUgfHwgTVREX1JPTSkKIAloZWxwCiAJICBUaGlzIHByb3ZpZGVzIGEgJ21hcHBpbmcnIGRyaXZlciB3aGljaCBhbGxvd3MgdGhlIE5PUiBGbGFzaCBhbmQKIAkgIFJPTSBkcml2ZXIgY29kZSB0byBjb21tdW5pY2F0ZSB3aXRoIGNoaXBzIHdoaWNoIGFyZSBtYXBwZWQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZGluZy5oIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kaW5nLmgKaW5kZXggNGRhMzg0Yy4uMzFmZTk4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kaW5nLmgKKysrIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kaW5nLmgKQEAgLTE4LDcgKzE4LDYgQEAKICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9ib25kaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgva29iamVjdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KICNpbmNsdWRlIDxsaW51eC9pbjYuaD4KICNpbmNsdWRlICJib25kXzNhZC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZnNfZW5ldC9mc19lbmV0LW1haW4uYyBiL2RyaXZlcnMvbmV0L2ZzX2VuZXQvZnNfZW5ldC1tYWluLmMKaW5kZXggZDY4NGYxOC4uN2ExZjNkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZnNfZW5ldC9mc19lbmV0LW1haW4uYworKysgYi9kcml2ZXJzL25ldC9mc19lbmV0L2ZzX2VuZXQtbWFpbi5jCkBAIC00MCw2ICs0MCw3IEBACiAjaW5jbHVkZSA8bGludXgvb2ZfbWRpby5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L29mX25ldC5oPgogCiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9naWFuZmFyLmMgYi9kcml2ZXJzL25ldC9naWFuZmFyLmMKaW5kZXggNDVjNGI3Yi4uNmRlNDY3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZ2lhbmZhci5jCisrKyBiL2RyaXZlcnMvbmV0L2dpYW5mYXIuYwpAQCAtOTUsNiArOTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgogI2luY2x1ZGUgPGxpbnV4L3BoeV9maXhlZC5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfbmV0Lmg+CiAKICNpbmNsdWRlICJnaWFuZmFyLmgiCiAjaW5jbHVkZSAiZnNsX3BxX21kaW8uaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VjY19nZXRoLmMgYi9kcml2ZXJzL25ldC91Y2NfZ2V0aC5jCmluZGV4IGFjYmRhYjMuLjczYTNlMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VjY19nZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvdWNjX2dldGguYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX21kaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9uZXQuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3hpbGlueF9lbWFjbGl0ZS5jIGIvZHJpdmVycy9uZXQveGlsaW54X2VtYWNsaXRlLmMKaW5kZXggZGU2YzMwOC4uY2FkNjZjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQveGlsaW54X2VtYWNsaXRlLmMKKysrIGIvZHJpdmVycy9uZXQveGlsaW54X2VtYWNsaXRlLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX21kaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9uZXQuaD4KICNpbmNsdWRlIDxsaW51eC9waHkuaD4KIAogI2RlZmluZSBEUklWRVJfTkFNRSAieGlsaW54X2VtYWNsaXRlIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9vZi9LY29uZmlnIGIvZHJpdmVycy9vZi9LY29uZmlnCmluZGV4IGFhNjc1ZWIuLjNjNmUxMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2YvS2NvbmZpZworKysgYi9kcml2ZXJzL29mL0tjb25maWcKQEAgLTE5LDYgKzE5LDEwIEBACiAJYm9vbAogCXNlbGVjdCBEVEMKIAorY29uZmlnIE9GX0VBUkxZX0ZMQVRUUkVFCisJYm9vbAorCXNlbGVjdCBPRl9GTEFUVFJFRQorCiBjb25maWcgT0ZfUFJPTVRSRUUKIAlib29sCiAKQEAgLTQ5LDYgKzUzLDEwIEBACiAJaGVscAogCSAgT3BlbkZpcm13YXJlIEkyQyBhY2Nlc3NvcnMKIAorY29uZmlnIE9GX05FVAorCWRlcGVuZHMgb24gTkVUREVWSUNFUworCWRlZl9ib29sIHkKKwogY29uZmlnIE9GX1NQSQogCWRlZl90cmlzdGF0ZSBTUEkKIAlkZXBlbmRzIG9uIFNQSSAmJiAhU1BBUkMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2YvTWFrZWZpbGUgYi9kcml2ZXJzL29mL01ha2VmaWxlCmluZGV4IDc4ODgxNTUuLjNhYjIxYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2YvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9vZi9NYWtlZmlsZQpAQCAtNiw1ICs2LDYgQEAKIG9iai0kKENPTkZJR19PRl9ERVZJQ0UpICs9IGRldmljZS5vIHBsYXRmb3JtLm8KIG9iai0kKENPTkZJR19PRl9HUElPKSAgICs9IGdwaW8ubwogb2JqLSQoQ09ORklHX09GX0kyQykJKz0gb2ZfaTJjLm8KK29iai0kKENPTkZJR19PRl9ORVQpCSs9IG9mX25ldC5vCiBvYmotJChDT05GSUdfT0ZfU1BJKQkrPSBvZl9zcGkubwogb2JqLSQoQ09ORklHX09GX01ESU8pCSs9IG9mX21kaW8ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9vZi9hZGRyZXNzLmMgYi9kcml2ZXJzL29mL2FkZHJlc3MuYwppbmRleCAzYTFjN2U3Li5iNDU1OWM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL29mL2FkZHJlc3MuYworKysgYi9kcml2ZXJzL29mL2FkZHJlc3MuYwpAQCAtMTIsMTMgKzEyLDEzIEBACiAJCQkobnMpID4gMCkKIAogc3RhdGljIHN0cnVjdCBvZl9idXMgKm9mX21hdGNoX2J1cyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKLXN0YXRpYyBpbnQgX19vZl9hZGRyZXNzX3RvX3Jlc291cmNlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBjb25zdCB1MzIgKmFkZHJwLAotCQkJCSAgICB1NjQgc2l6ZSwgdW5zaWduZWQgaW50IGZsYWdzLAorc3RhdGljIGludCBfX29mX2FkZHJlc3NfdG9fcmVzb3VyY2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYsCisJCWNvbnN0IF9fYmUzMiAqYWRkcnAsIHU2NCBzaXplLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCiAJCQkJICAgIHN0cnVjdCByZXNvdXJjZSAqcik7CiAKIC8qIERlYnVnIHV0aWxpdHkgKi8KICNpZmRlZiBERUJVRwotc3RhdGljIHZvaWQgb2ZfZHVtcF9hZGRyKGNvbnN0IGNoYXIgKnMsIGNvbnN0IHUzMiAqYWRkciwgaW50IG5hKQorc3RhdGljIHZvaWQgb2ZfZHVtcF9hZGRyKGNvbnN0IGNoYXIgKnMsIGNvbnN0IF9fYmUzMiAqYWRkciwgaW50IG5hKQogewogCXByaW50ayhLRVJOX0RFQlVHICIlcyIsIHMpOwogCXdoaWxlIChuYS0tKQpAQCAtMjYsNyArMjYsNyBAQAogCXByaW50aygiXG4iKTsKIH0KICNlbHNlCi1zdGF0aWMgdm9pZCBvZl9kdW1wX2FkZHIoY29uc3QgY2hhciAqcywgY29uc3QgdTMyICphZGRyLCBpbnQgbmEpIHsgfQorc3RhdGljIHZvaWQgb2ZfZHVtcF9hZGRyKGNvbnN0IGNoYXIgKnMsIGNvbnN0IF9fYmUzMiAqYWRkciwgaW50IG5hKSB7IH0KICNlbmRpZgogCiAvKiBDYWxsYmFja3MgZm9yIGJ1cyBzcGVjaWZpYyB0cmFuc2xhdG9ycyAqLwpAQCAtMzYsMTAgKzM2LDEwIEBACiAJaW50CQkoKm1hdGNoKShzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCk7CiAJdm9pZAkJKCpjb3VudF9jZWxscykoc3RydWN0IGRldmljZV9ub2RlICpjaGlsZCwKIAkJCQkgICAgICAgaW50ICphZGRyYywgaW50ICpzaXplYyk7Ci0JdTY0CQkoKm1hcCkodTMyICphZGRyLCBjb25zdCB1MzIgKnJhbmdlLAorCXU2NAkJKCptYXApKHUzMiAqYWRkciwgY29uc3QgX19iZTMyICpyYW5nZSwKIAkJCQlpbnQgbmEsIGludCBucywgaW50IHBuYSk7CiAJaW50CQkoKnRyYW5zbGF0ZSkodTMyICphZGRyLCB1NjQgb2Zmc2V0LCBpbnQgbmEpOwotCXVuc2lnbmVkIGludAkoKmdldF9mbGFncykoY29uc3QgdTMyICphZGRyKTsKKwl1bnNpZ25lZCBpbnQJKCpnZXRfZmxhZ3MpKGNvbnN0IF9fYmUzMiAqYWRkcik7CiB9OwogCiAvKgpAQCAtNTUsNyArNTUsNyBAQAogCQkqc2l6ZWMgPSBvZl9uX3NpemVfY2VsbHMoZGV2KTsKIH0KIAotc3RhdGljIHU2NCBvZl9idXNfZGVmYXVsdF9tYXAodTMyICphZGRyLCBjb25zdCB1MzIgKnJhbmdlLAorc3RhdGljIHU2NCBvZl9idXNfZGVmYXVsdF9tYXAodTMyICphZGRyLCBjb25zdCBfX2JlMzIgKnJhbmdlLAogCQlpbnQgbmEsIGludCBucywgaW50IHBuYSkKIHsKIAl1NjQgY3AsIHMsIGRhOwpAQCAtODUsNyArODUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IG9mX2J1c19kZWZhdWx0X2dldF9mbGFncyhjb25zdCB1MzIgKmFkZHIpCitzdGF0aWMgdW5zaWduZWQgaW50IG9mX2J1c19kZWZhdWx0X2dldF9mbGFncyhjb25zdCBfX2JlMzIgKmFkZHIpCiB7CiAJcmV0dXJuIElPUkVTT1VSQ0VfTUVNOwogfQpAQCAtMTEwLDEwICsxMTAsMTAgQEAKIAkJKnNpemVjID0gMjsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBvZl9idXNfcGNpX2dldF9mbGFncyhjb25zdCB1MzIgKmFkZHIpCitzdGF0aWMgdW5zaWduZWQgaW50IG9mX2J1c19wY2lfZ2V0X2ZsYWdzKGNvbnN0IF9fYmUzMiAqYWRkcikKIHsKIAl1bnNpZ25lZCBpbnQgZmxhZ3MgPSAwOwotCXUzMiB3ID0gYWRkclswXTsKKwl1MzIgdyA9IGJlMzJfdG9fY3B1cChhZGRyKTsKIAogCXN3aXRjaCgodyA+PiAyNCkgJiAweDAzKSB7CiAJY2FzZSAweDAxOgpAQCAtMTI5LDcgKzEyOSw4IEBACiAJcmV0dXJuIGZsYWdzOwogfQogCi1zdGF0aWMgdTY0IG9mX2J1c19wY2lfbWFwKHUzMiAqYWRkciwgY29uc3QgdTMyICpyYW5nZSwgaW50IG5hLCBpbnQgbnMsIGludCBwbmEpCitzdGF0aWMgdTY0IG9mX2J1c19wY2lfbWFwKHUzMiAqYWRkciwgY29uc3QgX19iZTMyICpyYW5nZSwgaW50IG5hLCBpbnQgbnMsCisJCWludCBwbmEpCiB7CiAJdTY0IGNwLCBzLCBkYTsKIAl1bnNpZ25lZCBpbnQgYWYsIHJmOwpAQCAtMTYwLDcgKzE2MSw3IEBACiAJcmV0dXJuIG9mX2J1c19kZWZhdWx0X3RyYW5zbGF0ZShhZGRyICsgMSwgb2Zmc2V0LCBuYSAtIDEpOwogfQogCi1jb25zdCB1MzIgKm9mX2dldF9wY2lfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgaW50IGJhcl9ubywgdTY0ICpzaXplLAorY29uc3QgX19iZTMyICpvZl9nZXRfcGNpX2FkZHJlc3Moc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGludCBiYXJfbm8sIHU2NCAqc2l6ZSwKIAkJCXVuc2lnbmVkIGludCAqZmxhZ3MpCiB7CiAJY29uc3QgX19iZTMyICpwcm9wOwpAQCAtMjA3LDcgKzIwOCw3IEBACiBpbnQgb2ZfcGNpX2FkZHJlc3NfdG9fcmVzb3VyY2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGludCBiYXIsCiAJCQkgICAgICAgc3RydWN0IHJlc291cmNlICpyKQogewotCWNvbnN0IHUzMgkqYWRkcnA7CisJY29uc3QgX19iZTMyCSphZGRycDsKIAl1NjQJCXNpemU7CiAJdW5zaWduZWQgaW50CWZsYWdzOwogCkBAIC0yMzcsMTIgKzIzOCwxMyBAQAogCQkqc2l6ZWMgPSAxOwogfQogCi1zdGF0aWMgdTY0IG9mX2J1c19pc2FfbWFwKHUzMiAqYWRkciwgY29uc3QgdTMyICpyYW5nZSwgaW50IG5hLCBpbnQgbnMsIGludCBwbmEpCitzdGF0aWMgdTY0IG9mX2J1c19pc2FfbWFwKHUzMiAqYWRkciwgY29uc3QgX19iZTMyICpyYW5nZSwgaW50IG5hLCBpbnQgbnMsCisJCWludCBwbmEpCiB7CiAJdTY0IGNwLCBzLCBkYTsKIAogCS8qIENoZWNrIGFkZHJlc3MgdHlwZSBtYXRjaCAqLwotCWlmICgoYWRkclswXSBeIHJhbmdlWzBdKSAmIDB4MDAwMDAwMDEpCisJaWYgKChhZGRyWzBdIF4gcmFuZ2VbMF0pICYgY3B1X3RvX2JlMzIoMSkpCiAJCXJldHVybiBPRl9CQURfQUREUjsKIAogCS8qIFJlYWQgYWRkcmVzcyB2YWx1ZXMsIHNraXBwaW5nIGhpZ2ggY2VsbCAqLwpAQCAtMjY0LDEwICsyNjYsMTAgQEAKIAlyZXR1cm4gb2ZfYnVzX2RlZmF1bHRfdHJhbnNsYXRlKGFkZHIgKyAxLCBvZmZzZXQsIG5hIC0gMSk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgb2ZfYnVzX2lzYV9nZXRfZmxhZ3MoY29uc3QgdTMyICphZGRyKQorc3RhdGljIHVuc2lnbmVkIGludCBvZl9idXNfaXNhX2dldF9mbGFncyhjb25zdCBfX2JlMzIgKmFkZHIpCiB7CiAJdW5zaWduZWQgaW50IGZsYWdzID0gMDsKLQl1MzIgdyA9IGFkZHJbMF07CisJdTMyIHcgPSBiZTMyX3RvX2NwdXAoYWRkcik7CiAKIAlpZiAodyAmIDEpCiAJCWZsYWdzIHw9IElPUkVTT1VSQ0VfSU87CkBAIC0zMzAsNyArMzMyLDcgQEAKIAkJCSAgICBzdHJ1Y3Qgb2ZfYnVzICpwYnVzLCB1MzIgKmFkZHIsCiAJCQkgICAgaW50IG5hLCBpbnQgbnMsIGludCBwbmEsIGNvbnN0IGNoYXIgKnJwcm9wKQogewotCWNvbnN0IHUzMiAqcmFuZ2VzOworCWNvbnN0IF9fYmUzMiAqcmFuZ2VzOwogCXVuc2lnbmVkIGludCBybGVuOwogCWludCByb25lOwogCXU2NCBvZmZzZXQgPSBPRl9CQURfQUREUjsKQEAgLTM5OCw3ICs0MDAsNyBAQAogICogdGhhdCBjYW4gYmUgbWFwcGVkIHRvIGEgY3B1IHBoeXNpY2FsIGFkZHJlc3MpLiBUaGlzIGlzIG5vdCByZWFsbHkgc3BlY2lmaWVkCiAgKiB0aGF0IHdheSwgYnV0IHRoaXMgaXMgdHJhZGl0aW9uYWxseSB0aGUgd2F5IElCTSBhdCBsZWFzdCBkbyB0aGluZ3MKICAqLwotdTY0IF9fb2ZfdHJhbnNsYXRlX2FkZHJlc3Moc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGNvbnN0IHUzMiAqaW5fYWRkciwKK3U2NCBfX29mX3RyYW5zbGF0ZV9hZGRyZXNzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBjb25zdCBfX2JlMzIgKmluX2FkZHIsCiAJCQkgICBjb25zdCBjaGFyICpycHJvcCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCA9IE5VTEw7CkBAIC00NzUsMjIgKzQ3NywyMiBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXU2NCBvZl90cmFuc2xhdGVfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgY29uc3QgdTMyICppbl9hZGRyKQordTY0IG9mX3RyYW5zbGF0ZV9hZGRyZXNzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBjb25zdCBfX2JlMzIgKmluX2FkZHIpCiB7CiAJcmV0dXJuIF9fb2ZfdHJhbnNsYXRlX2FkZHJlc3MoZGV2LCBpbl9hZGRyLCAicmFuZ2VzIik7CiB9CiBFWFBPUlRfU1lNQk9MKG9mX3RyYW5zbGF0ZV9hZGRyZXNzKTsKIAotdTY0IG9mX3RyYW5zbGF0ZV9kbWFfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgY29uc3QgdTMyICppbl9hZGRyKQordTY0IG9mX3RyYW5zbGF0ZV9kbWFfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgY29uc3QgX19iZTMyICppbl9hZGRyKQogewogCXJldHVybiBfX29mX3RyYW5zbGF0ZV9hZGRyZXNzKGRldiwgaW5fYWRkciwgImRtYS1yYW5nZXMiKTsKIH0KIEVYUE9SVF9TWU1CT0wob2ZfdHJhbnNsYXRlX2RtYV9hZGRyZXNzKTsKIAotY29uc3QgdTMyICpvZl9nZXRfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgaW50IGluZGV4LCB1NjQgKnNpemUsCitjb25zdCBfX2JlMzIgKm9mX2dldF9hZGRyZXNzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBpbnQgaW5kZXgsIHU2NCAqc2l6ZSwKIAkJICAgIHVuc2lnbmVkIGludCAqZmxhZ3MpCiB7Ci0JY29uc3QgdTMyICpwcm9wOworCWNvbnN0IF9fYmUzMiAqcHJvcDsKIAl1bnNpZ25lZCBpbnQgcHNpemU7CiAJc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQ7CiAJc3RydWN0IG9mX2J1cyAqYnVzOwpAQCAtNTI1LDggKzUyNyw4IEBACiB9CiBFWFBPUlRfU1lNQk9MKG9mX2dldF9hZGRyZXNzKTsKIAotc3RhdGljIGludCBfX29mX2FkZHJlc3NfdG9fcmVzb3VyY2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGNvbnN0IHUzMiAqYWRkcnAsCi0JCQkJICAgIHU2NCBzaXplLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCitzdGF0aWMgaW50IF9fb2ZfYWRkcmVzc190b19yZXNvdXJjZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwKKwkJY29uc3QgX19iZTMyICphZGRycCwgdTY0IHNpemUsIHVuc2lnbmVkIGludCBmbGFncywKIAkJCQkgICAgc3RydWN0IHJlc291cmNlICpyKQogewogCXU2NCB0YWRkcjsKQEAgLTU2NCw3ICs1NjYsNyBAQAogaW50IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGludCBpbmRleCwKIAkJCSAgIHN0cnVjdCByZXNvdXJjZSAqcikKIHsKLQljb25zdCB1MzIJKmFkZHJwOworCWNvbnN0IF9fYmUzMgkqYWRkcnA7CiAJdTY0CQlzaXplOwogCXVuc2lnbmVkIGludAlmbGFnczsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9vZi9mZHQuYyBiL2RyaXZlcnMvb2YvZmR0LmMKaW5kZXggYzEzNjBlMC4uYzc4N2MzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9vZi9mZHQuYworKysgYi9kcml2ZXJzL29mL2ZkdC5jCkBAIC0xMSwxMCArMTEsMTIgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXRyZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZmR0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpZmRlZiBDT05GSUdfUFBDCiAjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KQEAgLTIyLDEwNCArMjQsMTkgQEAKIAogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAKLWludCBfX2luaXRkYXRhIGR0X3Jvb3RfYWRkcl9jZWxsczsKLWludCBfX2luaXRkYXRhIGR0X3Jvb3Rfc2l6ZV9jZWxsczsKLQotc3RydWN0IGJvb3RfcGFyYW1faGVhZGVyICppbml0aWFsX2Jvb3RfcGFyYW1zOwotCi1jaGFyICpmaW5kX2ZsYXRfZHRfc3RyaW5nKHUzMiBvZmZzZXQpCitjaGFyICpvZl9mZHRfZ2V0X3N0cmluZyhzdHJ1Y3QgYm9vdF9wYXJhbV9oZWFkZXIgKmJsb2IsIHUzMiBvZmZzZXQpCiB7Ci0JcmV0dXJuICgoY2hhciAqKWluaXRpYWxfYm9vdF9wYXJhbXMpICsKLQkJYmUzMl90b19jcHUoaW5pdGlhbF9ib290X3BhcmFtcy0+b2ZmX2R0X3N0cmluZ3MpICsgb2Zmc2V0OworCXJldHVybiAoKGNoYXIgKilibG9iKSArCisJCWJlMzJfdG9fY3B1KGJsb2ItPm9mZl9kdF9zdHJpbmdzKSArIG9mZnNldDsKIH0KIAogLyoqCi0gKiBvZl9zY2FuX2ZsYXRfZHQgLSBzY2FuIGZsYXR0ZW5lZCB0cmVlIGJsb2IgYW5kIGNhbGwgY2FsbGJhY2sgb24gZWFjaC4KLSAqIEBpdDogY2FsbGJhY2sgZnVuY3Rpb24KLSAqIEBkYXRhOiBjb250ZXh0IGRhdGEgcG9pbnRlcgotICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzY2FuIHRoZSBmbGF0dGVuZWQgZGV2aWNlLXRyZWUsIGl0IGlzCi0gKiB1c2VkIHRvIGV4dHJhY3QgdGhlIG1lbW9yeSBpbmZvcm1hdGlvbiBhdCBib290IGJlZm9yZSB3ZSBjYW4KLSAqIHVuZmxhdHRlbiB0aGUgdHJlZQorICogb2ZfZmR0X2dldF9wcm9wZXJ0eSAtIEdpdmVuIGEgbm9kZSBpbiB0aGUgZ2l2ZW4gZmxhdCBibG9iLCByZXR1cm4KKyAqIHRoZSBwcm9wZXJ0eSBwdHIKICAqLwotaW50IF9faW5pdCBvZl9zY2FuX2ZsYXRfZHQoaW50ICgqaXQpKHVuc2lnbmVkIGxvbmcgbm9kZSwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKnVuYW1lLCBpbnQgZGVwdGgsCi0JCQkJICAgICB2b2lkICpkYXRhKSwKLQkJCSAgIHZvaWQgKmRhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyBwID0gKCh1bnNpZ25lZCBsb25nKWluaXRpYWxfYm9vdF9wYXJhbXMpICsKLQkJYmUzMl90b19jcHUoaW5pdGlhbF9ib290X3BhcmFtcy0+b2ZmX2R0X3N0cnVjdCk7Ci0JaW50IHJjID0gMDsKLQlpbnQgZGVwdGggPSAtMTsKLQotCWRvIHsKLQkJdTMyIHRhZyA9IGJlMzJfdG9fY3B1cCgoX19iZTMyICopcCk7Ci0JCWNoYXIgKnBhdGhwOwotCi0JCXAgKz0gNDsKLQkJaWYgKHRhZyA9PSBPRl9EVF9FTkRfTk9ERSkgewotCQkJZGVwdGgtLTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICh0YWcgPT0gT0ZfRFRfTk9QKQotCQkJY29udGludWU7Ci0JCWlmICh0YWcgPT0gT0ZfRFRfRU5EKQotCQkJYnJlYWs7Ci0JCWlmICh0YWcgPT0gT0ZfRFRfUFJPUCkgewotCQkJdTMyIHN6ID0gYmUzMl90b19jcHVwKChfX2JlMzIgKilwKTsKLQkJCXAgKz0gODsKLQkJCWlmIChiZTMyX3RvX2NwdShpbml0aWFsX2Jvb3RfcGFyYW1zLT52ZXJzaW9uKSA8IDB4MTApCi0JCQkJcCA9IEFMSUdOKHAsIHN6ID49IDggPyA4IDogNCk7Ci0JCQlwICs9IHN6OwotCQkJcCA9IEFMSUdOKHAsIDQpOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKHRhZyAhPSBPRl9EVF9CRUdJTl9OT0RFKSB7Ci0JCQlwcl9lcnIoIkludmFsaWQgdGFnICV4IGluIGZsYXQgZGV2aWNlIHRyZWUhXG4iLCB0YWcpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJZGVwdGgrKzsKLQkJcGF0aHAgPSAoY2hhciAqKXA7Ci0JCXAgPSBBTElHTihwICsgc3RybGVuKHBhdGhwKSArIDEsIDQpOwotCQlpZiAoKCpwYXRocCkgPT0gJy8nKSB7Ci0JCQljaGFyICpscCwgKm5wOwotCQkJZm9yIChscCA9IE5VTEwsIG5wID0gcGF0aHA7ICpucDsgbnArKykKLQkJCQlpZiAoKCpucCkgPT0gJy8nKQotCQkJCQlscCA9IG5wKzE7Ci0JCQlpZiAobHAgIT0gTlVMTCkKLQkJCQlwYXRocCA9IGxwOwotCQl9Ci0JCXJjID0gaXQocCwgcGF0aHAsIGRlcHRoLCBkYXRhKTsKLQkJaWYgKHJjICE9IDApCi0JCQlicmVhazsKLQl9IHdoaWxlICgxKTsKLQotCXJldHVybiByYzsKLX0KLQotLyoqCi0gKiBvZl9nZXRfZmxhdF9kdF9yb290IC0gZmluZCB0aGUgcm9vdCBub2RlIGluIHRoZSBmbGF0IGJsb2IKLSAqLwotdW5zaWduZWQgbG9uZyBfX2luaXQgb2ZfZ2V0X2ZsYXRfZHRfcm9vdCh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgcCA9ICgodW5zaWduZWQgbG9uZylpbml0aWFsX2Jvb3RfcGFyYW1zKSArCi0JCWJlMzJfdG9fY3B1KGluaXRpYWxfYm9vdF9wYXJhbXMtPm9mZl9kdF9zdHJ1Y3QpOwotCi0Jd2hpbGUgKGJlMzJfdG9fY3B1cCgoX19iZTMyICopcCkgPT0gT0ZfRFRfTk9QKQotCQlwICs9IDQ7Ci0JQlVHX09OKGJlMzJfdG9fY3B1cCgoX19iZTMyICopcCkgIT0gT0ZfRFRfQkVHSU5fTk9ERSk7Ci0JcCArPSA0OwotCXJldHVybiBBTElHTihwICsgc3RybGVuKChjaGFyICopcCkgKyAxLCA0KTsKLX0KLQotLyoqCi0gKiBvZl9nZXRfZmxhdF9kdF9wcm9wIC0gR2l2ZW4gYSBub2RlIGluIHRoZSBmbGF0IGJsb2IsIHJldHVybiB0aGUgcHJvcGVydHkgcHRyCi0gKgotICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB3aXRoaW4gc2Nhbl9mbGF0dGVuZWRfZHQgY2FsbGJhY2sgdG8gZ2V0Ci0gKiBhY2Nlc3MgdG8gcHJvcGVydGllcwotICovCi12b2lkICpfX2luaXQgb2ZfZ2V0X2ZsYXRfZHRfcHJvcCh1bnNpZ25lZCBsb25nIG5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJIHVuc2lnbmVkIGxvbmcgKnNpemUpCit2b2lkICpvZl9mZHRfZ2V0X3Byb3BlcnR5KHN0cnVjdCBib290X3BhcmFtX2hlYWRlciAqYmxvYiwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgKnNpemUpCiB7CiAJdW5zaWduZWQgbG9uZyBwID0gbm9kZTsKIApAQCAtMTM3LDEwICs1NCwxMCBAQAogCQlzeiA9IGJlMzJfdG9fY3B1cCgoX19iZTMyICopcCk7CiAJCW5vZmYgPSBiZTMyX3RvX2NwdXAoKF9fYmUzMiAqKShwICsgNCkpOwogCQlwICs9IDg7Ci0JCWlmIChiZTMyX3RvX2NwdShpbml0aWFsX2Jvb3RfcGFyYW1zLT52ZXJzaW9uKSA8IDB4MTApCisJCWlmIChiZTMyX3RvX2NwdShibG9iLT52ZXJzaW9uKSA8IDB4MTApCiAJCQlwID0gQUxJR04ocCwgc3ogPj0gOCA/IDggOiA0KTsKIAotCQluc3RyID0gZmluZF9mbGF0X2R0X3N0cmluZyhub2ZmKTsKKwkJbnN0ciA9IG9mX2ZkdF9nZXRfc3RyaW5nKGJsb2IsIG5vZmYpOwogCQlpZiAobnN0ciA9PSBOVUxMKSB7CiAJCQlwcl93YXJuaW5nKCJDYW4ndCBmaW5kIHByb3BlcnR5IGluZGV4IG5hbWUgIVxuIik7CiAJCQlyZXR1cm4gTlVMTDsKQEAgLTE1NiwyMSArNzMsMjggQEAKIH0KIAogLyoqCi0gKiBvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUgLSBSZXR1cm4gdHJ1ZSBpZiBnaXZlbiBub2RlIGhhcyBjb21wYXQgaW4gY29tcGF0aWJsZSBsaXN0CisgKiBvZl9mZHRfaXNfY29tcGF0aWJsZSAtIFJldHVybiB0cnVlIGlmIGdpdmVuIG5vZGUgZnJvbSB0aGUgZ2l2ZW4gYmxvYiBoYXMKKyAqIGNvbXBhdCBpbiBpdHMgY29tcGF0aWJsZSBsaXN0CisgKiBAYmxvYjogQSBkZXZpY2UgdHJlZSBibG9iCiAgKiBAbm9kZTogbm9kZSB0byB0ZXN0CiAgKiBAY29tcGF0OiBjb21wYXRpYmxlIHN0cmluZyB0byBjb21wYXJlIHdpdGggY29tcGF0aWJsZSBsaXN0LgorICoKKyAqIE9uIG1hdGNoLCByZXR1cm5zIGEgbm9uLXplcm8gdmFsdWUgd2l0aCBzbWFsbGVyIHZhbHVlcyByZXR1cm5lZCBmb3IgbW9yZQorICogc3BlY2lmaWMgY29tcGF0aWJsZSB2YWx1ZXMuCiAgKi8KLWludCBfX2luaXQgb2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHVuc2lnbmVkIGxvbmcgbm9kZSwgY29uc3QgY2hhciAqY29tcGF0KQoraW50IG9mX2ZkdF9pc19jb21wYXRpYmxlKHN0cnVjdCBib290X3BhcmFtX2hlYWRlciAqYmxvYiwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBub2RlLCBjb25zdCBjaGFyICpjb21wYXQpCiB7CiAJY29uc3QgY2hhciAqY3A7Ci0JdW5zaWduZWQgbG9uZyBjcGxlbiwgbDsKKwl1bnNpZ25lZCBsb25nIGNwbGVuLCBsLCBzY29yZSA9IDA7CiAKLQljcCA9IG9mX2dldF9mbGF0X2R0X3Byb3Aobm9kZSwgImNvbXBhdGlibGUiLCAmY3BsZW4pOworCWNwID0gb2ZfZmR0X2dldF9wcm9wZXJ0eShibG9iLCBub2RlLCAiY29tcGF0aWJsZSIsICZjcGxlbik7CiAJaWYgKGNwID09IE5VTEwpCiAJCXJldHVybiAwOwogCXdoaWxlIChjcGxlbiA+IDApIHsKKwkJc2NvcmUrKzsKIAkJaWYgKG9mX2NvbXBhdF9jbXAoY3AsIGNvbXBhdCwgc3RybGVuKGNvbXBhdCkpID09IDApCi0JCQlyZXR1cm4gMTsKKwkJCXJldHVybiBzY29yZTsKIAkJbCA9IHN0cmxlbihjcCkgKyAxOwogCQljcCArPSBsOwogCQljcGxlbiAtPSBsOwpAQCAtMTc5LDcgKzEwMywyOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCAqX19pbml0IHVuZmxhdHRlbl9kdF9hbGxvYyh1bnNpZ25lZCBsb25nICptZW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKy8qKgorICogb2ZfZmR0X21hdGNoIC0gUmV0dXJuIHRydWUgaWYgbm9kZSBtYXRjaGVzIGEgbGlzdCBvZiBjb21wYXRpYmxlIHZhbHVlcworICovCitpbnQgb2ZfZmR0X21hdGNoKHN0cnVjdCBib290X3BhcmFtX2hlYWRlciAqYmxvYiwgdW5zaWduZWQgbG9uZyBub2RlLAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqY29tcGF0KQoreworCXVuc2lnbmVkIGludCB0bXAsIHNjb3JlID0gMDsKKworCWlmICghY29tcGF0KQorCQlyZXR1cm4gMDsKKworCXdoaWxlICgqY29tcGF0KSB7CisJCXRtcCA9IG9mX2ZkdF9pc19jb21wYXRpYmxlKGJsb2IsIG5vZGUsICpjb21wYXQpOworCQlpZiAodG1wICYmIChzY29yZSA9PSAwIHx8ICh0bXAgPCBzY29yZSkpKQorCQkJc2NvcmUgPSB0bXA7CisJCWNvbXBhdCsrOworCX0KKworCXJldHVybiBzY29yZTsKK30KKworc3RhdGljIHZvaWQgKnVuZmxhdHRlbl9kdF9hbGxvYyh1bnNpZ25lZCBsb25nICptZW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSwKIAkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhbGlnbikKIHsKIAl2b2lkICpyZXM7CkBAIC0xOTMsMTYgKzEzOCwxOCBAQAogCiAvKioKICAqIHVuZmxhdHRlbl9kdF9ub2RlIC0gQWxsb2MgYW5kIHBvcHVsYXRlIGEgZGV2aWNlX25vZGUgZnJvbSB0aGUgZmxhdCB0cmVlCisgKiBAYmxvYjogVGhlIHBhcmVudCBkZXZpY2UgdHJlZSBibG9iCiAgKiBAcDogcG9pbnRlciB0byBub2RlIGluIGZsYXQgdHJlZQogICogQGRhZDogUGFyZW50IHN0cnVjdCBkZXZpY2Vfbm9kZQogICogQGFsbG5leHRwcDogcG9pbnRlciB0byAtPmFsbG5leHQgZnJvbSBsYXN0IGFsbG9jYXRlZCBkZXZpY2Vfbm9kZQogICogQGZwc2l6ZTogU2l6ZSBvZiB0aGUgbm9kZSBwYXRoIHVwIGF0IHRoZSBjdXJyZW50IGRlcHRoLgogICovCi11bnNpZ25lZCBsb25nIF9faW5pdCB1bmZsYXR0ZW5fZHRfbm9kZSh1bnNpZ25lZCBsb25nIG1lbSwKLQkJCQkJdW5zaWduZWQgbG9uZyAqcCwKLQkJCQkJc3RydWN0IGRldmljZV9ub2RlICpkYWQsCi0JCQkJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqKiphbGxuZXh0cHAsCi0JCQkJCXVuc2lnbmVkIGxvbmcgZnBzaXplKQordW5zaWduZWQgbG9uZyB1bmZsYXR0ZW5fZHRfbm9kZShzdHJ1Y3QgYm9vdF9wYXJhbV9oZWFkZXIgKmJsb2IsCisJCQkJdW5zaWduZWQgbG9uZyBtZW0sCisJCQkJdW5zaWduZWQgbG9uZyAqcCwKKwkJCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRhZCwKKwkJCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKioqYWxsbmV4dHBwLAorCQkJCXVuc2lnbmVkIGxvbmcgZnBzaXplKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CiAJc3RydWN0IHByb3BlcnR5ICpwcCwgKipwcmV2X3BwID0gTlVMTDsKQEAgLTI5OCwxMCArMjQ1LDEwIEBACiAJCXN6ID0gYmUzMl90b19jcHVwKChfX2JlMzIgKikoKnApKTsKIAkJbm9mZiA9IGJlMzJfdG9fY3B1cCgoX19iZTMyICopKCgqcCkgKyA0KSk7CiAJCSpwICs9IDg7Ci0JCWlmIChiZTMyX3RvX2NwdShpbml0aWFsX2Jvb3RfcGFyYW1zLT52ZXJzaW9uKSA8IDB4MTApCisJCWlmIChiZTMyX3RvX2NwdShibG9iLT52ZXJzaW9uKSA8IDB4MTApCiAJCQkqcCA9IEFMSUdOKCpwLCBzeiA+PSA4ID8gOCA6IDQpOwogCi0JCXBuYW1lID0gZmluZF9mbGF0X2R0X3N0cmluZyhub2ZmKTsKKwkJcG5hbWUgPSBvZl9mZHRfZ2V0X3N0cmluZyhibG9iLCBub2ZmKTsKIAkJaWYgKHBuYW1lID09IE5VTEwpIHsKIAkJCXByX2luZm8oIkNhbid0IGZpbmQgcHJvcGVydHkgbmFtZSBpbiBsaXN0ICFcbiIpOwogCQkJYnJlYWs7CkBAIC0zODAsNyArMzI3LDggQEAKIAkJaWYgKHRhZyA9PSBPRl9EVF9OT1ApCiAJCQkqcCArPSA0OwogCQllbHNlCi0JCQltZW0gPSB1bmZsYXR0ZW5fZHRfbm9kZShtZW0sIHAsIG5wLCBhbGxuZXh0cHAsIGZwc2l6ZSk7CisJCQltZW0gPSB1bmZsYXR0ZW5fZHRfbm9kZShibG9iLCBtZW0sIHAsIG5wLCBhbGxuZXh0cHAsCisJCQkJCQlmcHNpemUpOwogCQl0YWcgPSBiZTMyX3RvX2NwdXAoKF9fYmUzMiAqKSgqcCkpOwogCX0KIAlpZiAodGFnICE9IE9GX0RUX0VORF9OT0RFKSB7CkBAIC0zOTEsNiArMzM5LDIxMSBAQAogCXJldHVybiBtZW07CiB9CiAKKy8qKgorICogX191bmZsYXR0ZW5fZGV2aWNlX3RyZWUgLSBjcmVhdGUgdHJlZSBvZiBkZXZpY2Vfbm9kZXMgZnJvbSBmbGF0IGJsb2IKKyAqCisgKiB1bmZsYXR0ZW5zIGEgZGV2aWNlLXRyZWUsIGNyZWF0aW5nIHRoZQorICogdHJlZSBvZiBzdHJ1Y3QgZGV2aWNlX25vZGUuIEl0IGFsc28gZmlsbHMgdGhlICJuYW1lIiBhbmQgInR5cGUiCisgKiBwb2ludGVycyBvZiB0aGUgbm9kZXMgc28gdGhlIG5vcm1hbCBkZXZpY2UtdHJlZSB3YWxraW5nIGZ1bmN0aW9ucworICogY2FuIGJlIHVzZWQuCisgKiBAYmxvYjogVGhlIGJsb2IgdG8gZXhwYW5kCisgKiBAbXlub2RlczogVGhlIGRldmljZV9ub2RlIHRyZWUgY3JlYXRlZCBieSB0aGUgY2FsbAorICogQGR0X2FsbG9jOiBBbiBhbGxvY2F0b3IgdGhhdCBwcm92aWRlcyBhIHZpcnR1YWwgYWRkcmVzcyB0byBtZW1vcnkKKyAqIGZvciB0aGUgcmVzdWx0aW5nIHRyZWUKKyAqLwordm9pZCBfX3VuZmxhdHRlbl9kZXZpY2VfdHJlZShzdHJ1Y3QgYm9vdF9wYXJhbV9oZWFkZXIgKmJsb2IsCisJCQkgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqKm15bm9kZXMsCisJCQkgICAgIHZvaWQgKiAoKmR0X2FsbG9jKSh1NjQgc2l6ZSwgdTY0IGFsaWduKSkKK3sKKwl1bnNpZ25lZCBsb25nIHN0YXJ0LCBtZW0sIHNpemU7CisJc3RydWN0IGRldmljZV9ub2RlICoqYWxsbmV4dHAgPSBteW5vZGVzOworCisJcHJfZGVidWcoIiAtPiB1bmZsYXR0ZW5fZGV2aWNlX3RyZWUoKVxuIik7CisKKwlpZiAoIWJsb2IpIHsKKwkJcHJfZGVidWcoIk5vIGRldmljZSB0cmVlIHBvaW50ZXJcbiIpOworCQlyZXR1cm47CisJfQorCisJcHJfZGVidWcoIlVuZmxhdHRlbmluZyBkZXZpY2UgdHJlZTpcbiIpOworCXByX2RlYnVnKCJtYWdpYzogJTA4eFxuIiwgYmUzMl90b19jcHUoYmxvYi0+bWFnaWMpKTsKKwlwcl9kZWJ1Zygic2l6ZTogJTA4eFxuIiwgYmUzMl90b19jcHUoYmxvYi0+dG90YWxzaXplKSk7CisJcHJfZGVidWcoInZlcnNpb246ICUwOHhcbiIsIGJlMzJfdG9fY3B1KGJsb2ItPnZlcnNpb24pKTsKKworCWlmIChiZTMyX3RvX2NwdShibG9iLT5tYWdpYykgIT0gT0ZfRFRfSEVBREVSKSB7CisJCXByX2VycigiSW52YWxpZCBkZXZpY2UgdHJlZSBibG9iIGhlYWRlclxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBGaXJzdCBwYXNzLCBzY2FuIGZvciBzaXplICovCisJc3RhcnQgPSAoKHVuc2lnbmVkIGxvbmcpYmxvYikgKworCQliZTMyX3RvX2NwdShibG9iLT5vZmZfZHRfc3RydWN0KTsKKwlzaXplID0gdW5mbGF0dGVuX2R0X25vZGUoYmxvYiwgMCwgJnN0YXJ0LCBOVUxMLCBOVUxMLCAwKTsKKwlzaXplID0gKHNpemUgfCAzKSArIDE7CisKKwlwcl9kZWJ1ZygiICBzaXplIGlzICVseCwgYWxsb2NhdGluZy4uLlxuIiwgc2l6ZSk7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBleHBhbmRlZCBkZXZpY2UgdHJlZSAqLworCW1lbSA9ICh1bnNpZ25lZCBsb25nKQorCQlkdF9hbGxvYyhzaXplICsgNCwgX19hbGlnbm9mX18oc3RydWN0IGRldmljZV9ub2RlKSk7CisKKwkoKF9fYmUzMiAqKW1lbSlbc2l6ZSAvIDRdID0gY3B1X3RvX2JlMzIoMHhkZWFkYmVlZik7CisKKwlwcl9kZWJ1ZygiICB1bmZsYXR0ZW5pbmcgJWx4Li4uXG4iLCBtZW0pOworCisJLyogU2Vjb25kIHBhc3MsIGRvIGFjdHVhbCB1bmZsYXR0ZW5pbmcgKi8KKwlzdGFydCA9ICgodW5zaWduZWQgbG9uZylibG9iKSArCisJCWJlMzJfdG9fY3B1KGJsb2ItPm9mZl9kdF9zdHJ1Y3QpOworCXVuZmxhdHRlbl9kdF9ub2RlKGJsb2IsIG1lbSwgJnN0YXJ0LCBOVUxMLCAmYWxsbmV4dHAsIDApOworCWlmIChiZTMyX3RvX2NwdXAoKF9fYmUzMiAqKXN0YXJ0KSAhPSBPRl9EVF9FTkQpCisJCXByX3dhcm5pbmcoIldlaXJkIHRhZyBhdCBlbmQgb2YgdHJlZTogJTA4eFxuIiwgKigodTMyICopc3RhcnQpKTsKKwlpZiAoYmUzMl90b19jcHUoKChfX2JlMzIgKiltZW0pW3NpemUgLyA0XSkgIT0gMHhkZWFkYmVlZikKKwkJcHJfd2FybmluZygiRW5kIG9mIHRyZWUgbWFya2VyIG92ZXJ3cml0dGVuOiAlMDh4XG4iLAorCQkJICAgYmUzMl90b19jcHUoKChfX2JlMzIgKiltZW0pW3NpemUgLyA0XSkpOworCSphbGxuZXh0cCA9IE5VTEw7CisKKwlwcl9kZWJ1ZygiIDwtIHVuZmxhdHRlbl9kZXZpY2VfdHJlZSgpXG4iKTsKK30KKworc3RhdGljIHZvaWQgKmtlcm5lbF90cmVlX2FsbG9jKHU2NCBzaXplLCB1NjQgYWxpZ24pCit7CisJcmV0dXJuIGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Cit9CisKKy8qKgorICogb2ZfZmR0X3VuZmxhdHRlbl90cmVlIC0gY3JlYXRlIHRyZWUgb2YgZGV2aWNlX25vZGVzIGZyb20gZmxhdCBibG9iCisgKgorICogdW5mbGF0dGVucyB0aGUgZGV2aWNlLXRyZWUgcGFzc2VkIGJ5IHRoZSBmaXJtd2FyZSwgY3JlYXRpbmcgdGhlCisgKiB0cmVlIG9mIHN0cnVjdCBkZXZpY2Vfbm9kZS4gSXQgYWxzbyBmaWxscyB0aGUgIm5hbWUiIGFuZCAidHlwZSIKKyAqIHBvaW50ZXJzIG9mIHRoZSBub2RlcyBzbyB0aGUgbm9ybWFsIGRldmljZS10cmVlIHdhbGtpbmcgZnVuY3Rpb25zCisgKiBjYW4gYmUgdXNlZC4KKyAqLwordm9pZCBvZl9mZHRfdW5mbGF0dGVuX3RyZWUodW5zaWduZWQgbG9uZyAqYmxvYiwKKwkJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqKm15bm9kZXMpCit7CisJc3RydWN0IGJvb3RfcGFyYW1faGVhZGVyICpkZXZpY2VfdHJlZSA9CisJCShzdHJ1Y3QgYm9vdF9wYXJhbV9oZWFkZXIgKilibG9iOworCV9fdW5mbGF0dGVuX2RldmljZV90cmVlKGRldmljZV90cmVlLCBteW5vZGVzLCAma2VybmVsX3RyZWVfYWxsb2MpOworfQorRVhQT1JUX1NZTUJPTF9HUEwob2ZfZmR0X3VuZmxhdHRlbl90cmVlKTsKKworLyogRXZlcnl0aGluZyBiZWxvdyBoZXJlIHJlZmVyZW5jZXMgaW5pdGlhbF9ib290X3BhcmFtcyBkaXJlY3RseS4gKi8KK2ludCBfX2luaXRkYXRhIGR0X3Jvb3RfYWRkcl9jZWxsczsKK2ludCBfX2luaXRkYXRhIGR0X3Jvb3Rfc2l6ZV9jZWxsczsKKworc3RydWN0IGJvb3RfcGFyYW1faGVhZGVyICppbml0aWFsX2Jvb3RfcGFyYW1zOworCisjaWZkZWYgQ09ORklHX09GX0VBUkxZX0ZMQVRUUkVFCisKKy8qKgorICogb2Zfc2Nhbl9mbGF0X2R0IC0gc2NhbiBmbGF0dGVuZWQgdHJlZSBibG9iIGFuZCBjYWxsIGNhbGxiYWNrIG9uIGVhY2guCisgKiBAaXQ6IGNhbGxiYWNrIGZ1bmN0aW9uCisgKiBAZGF0YTogY29udGV4dCBkYXRhIHBvaW50ZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2NhbiB0aGUgZmxhdHRlbmVkIGRldmljZS10cmVlLCBpdCBpcworICogdXNlZCB0byBleHRyYWN0IHRoZSBtZW1vcnkgaW5mb3JtYXRpb24gYXQgYm9vdCBiZWZvcmUgd2UgY2FuCisgKiB1bmZsYXR0ZW4gdGhlIHRyZWUKKyAqLworaW50IF9faW5pdCBvZl9zY2FuX2ZsYXRfZHQoaW50ICgqaXQpKHVuc2lnbmVkIGxvbmcgbm9kZSwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKnVuYW1lLCBpbnQgZGVwdGgsCisJCQkJICAgICB2b2lkICpkYXRhKSwKKwkJCSAgIHZvaWQgKmRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBwID0gKCh1bnNpZ25lZCBsb25nKWluaXRpYWxfYm9vdF9wYXJhbXMpICsKKwkJYmUzMl90b19jcHUoaW5pdGlhbF9ib290X3BhcmFtcy0+b2ZmX2R0X3N0cnVjdCk7CisJaW50IHJjID0gMDsKKwlpbnQgZGVwdGggPSAtMTsKKworCWRvIHsKKwkJdTMyIHRhZyA9IGJlMzJfdG9fY3B1cCgoX19iZTMyICopcCk7CisJCWNoYXIgKnBhdGhwOworCisJCXAgKz0gNDsKKwkJaWYgKHRhZyA9PSBPRl9EVF9FTkRfTk9ERSkgeworCQkJZGVwdGgtLTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICh0YWcgPT0gT0ZfRFRfTk9QKQorCQkJY29udGludWU7CisJCWlmICh0YWcgPT0gT0ZfRFRfRU5EKQorCQkJYnJlYWs7CisJCWlmICh0YWcgPT0gT0ZfRFRfUFJPUCkgeworCQkJdTMyIHN6ID0gYmUzMl90b19jcHVwKChfX2JlMzIgKilwKTsKKwkJCXAgKz0gODsKKwkJCWlmIChiZTMyX3RvX2NwdShpbml0aWFsX2Jvb3RfcGFyYW1zLT52ZXJzaW9uKSA8IDB4MTApCisJCQkJcCA9IEFMSUdOKHAsIHN6ID49IDggPyA4IDogNCk7CisJCQlwICs9IHN6OworCQkJcCA9IEFMSUdOKHAsIDQpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHRhZyAhPSBPRl9EVF9CRUdJTl9OT0RFKSB7CisJCQlwcl9lcnIoIkludmFsaWQgdGFnICV4IGluIGZsYXQgZGV2aWNlIHRyZWUhXG4iLCB0YWcpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJZGVwdGgrKzsKKwkJcGF0aHAgPSAoY2hhciAqKXA7CisJCXAgPSBBTElHTihwICsgc3RybGVuKHBhdGhwKSArIDEsIDQpOworCQlpZiAoKCpwYXRocCkgPT0gJy8nKSB7CisJCQljaGFyICpscCwgKm5wOworCQkJZm9yIChscCA9IE5VTEwsIG5wID0gcGF0aHA7ICpucDsgbnArKykKKwkJCQlpZiAoKCpucCkgPT0gJy8nKQorCQkJCQlscCA9IG5wKzE7CisJCQlpZiAobHAgIT0gTlVMTCkKKwkJCQlwYXRocCA9IGxwOworCQl9CisJCXJjID0gaXQocCwgcGF0aHAsIGRlcHRoLCBkYXRhKTsKKwkJaWYgKHJjICE9IDApCisJCQlicmVhazsKKwl9IHdoaWxlICgxKTsKKworCXJldHVybiByYzsKK30KKworLyoqCisgKiBvZl9nZXRfZmxhdF9kdF9yb290IC0gZmluZCB0aGUgcm9vdCBub2RlIGluIHRoZSBmbGF0IGJsb2IKKyAqLwordW5zaWduZWQgbG9uZyBfX2luaXQgb2ZfZ2V0X2ZsYXRfZHRfcm9vdCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgcCA9ICgodW5zaWduZWQgbG9uZylpbml0aWFsX2Jvb3RfcGFyYW1zKSArCisJCWJlMzJfdG9fY3B1KGluaXRpYWxfYm9vdF9wYXJhbXMtPm9mZl9kdF9zdHJ1Y3QpOworCisJd2hpbGUgKGJlMzJfdG9fY3B1cCgoX19iZTMyICopcCkgPT0gT0ZfRFRfTk9QKQorCQlwICs9IDQ7CisJQlVHX09OKGJlMzJfdG9fY3B1cCgoX19iZTMyICopcCkgIT0gT0ZfRFRfQkVHSU5fTk9ERSk7CisJcCArPSA0OworCXJldHVybiBBTElHTihwICsgc3RybGVuKChjaGFyICopcCkgKyAxLCA0KTsKK30KKworLyoqCisgKiBvZl9nZXRfZmxhdF9kdF9wcm9wIC0gR2l2ZW4gYSBub2RlIGluIHRoZSBmbGF0IGJsb2IsIHJldHVybiB0aGUgcHJvcGVydHkgcHRyCisgKgorICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB3aXRoaW4gc2Nhbl9mbGF0dGVuZWRfZHQgY2FsbGJhY2sgdG8gZ2V0CisgKiBhY2Nlc3MgdG8gcHJvcGVydGllcworICovCit2b2lkICpfX2luaXQgb2ZfZ2V0X2ZsYXRfZHRfcHJvcCh1bnNpZ25lZCBsb25nIG5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJIHVuc2lnbmVkIGxvbmcgKnNpemUpCit7CisJcmV0dXJuIG9mX2ZkdF9nZXRfcHJvcGVydHkoaW5pdGlhbF9ib290X3BhcmFtcywgbm9kZSwgbmFtZSwgc2l6ZSk7Cit9CisKKy8qKgorICogb2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlIC0gUmV0dXJuIHRydWUgaWYgZ2l2ZW4gbm9kZSBoYXMgY29tcGF0IGluIGNvbXBhdGlibGUgbGlzdAorICogQG5vZGU6IG5vZGUgdG8gdGVzdAorICogQGNvbXBhdDogY29tcGF0aWJsZSBzdHJpbmcgdG8gY29tcGFyZSB3aXRoIGNvbXBhdGlibGUgbGlzdC4KKyAqLworaW50IF9faW5pdCBvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUodW5zaWduZWQgbG9uZyBub2RlLCBjb25zdCBjaGFyICpjb21wYXQpCit7CisJcmV0dXJuIG9mX2ZkdF9pc19jb21wYXRpYmxlKGluaXRpYWxfYm9vdF9wYXJhbXMsIG5vZGUsIGNvbXBhdCk7Cit9CisKKy8qKgorICogb2ZfZmxhdF9kdF9tYXRjaCAtIFJldHVybiB0cnVlIGlmIG5vZGUgbWF0Y2hlcyBhIGxpc3Qgb2YgY29tcGF0aWJsZSB2YWx1ZXMKKyAqLworaW50IF9faW5pdCBvZl9mbGF0X2R0X21hdGNoKHVuc2lnbmVkIGxvbmcgbm9kZSwgY29uc3QgY2hhciAqKmNvbXBhdCkKK3sKKwlyZXR1cm4gb2ZfZmR0X21hdGNoKGluaXRpYWxfYm9vdF9wYXJhbXMsIG5vZGUsIGNvbXBhdCk7Cit9CisKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKIC8qKgogICogZWFybHlfaW5pdF9kdF9jaGVja19mb3JfaW5pdHJkIC0gRGVjb2RlIGluaXRyZCBsb2NhdGlvbiBmcm9tIGZsYXQgdHJlZQpAQCAtNTM5LDYgKzY5MiwxMiBAQAogCXJldHVybiAxOwogfQogCitzdGF0aWMgdm9pZCAqX19pbml0IGVhcmx5X2RldmljZV90cmVlX2FsbG9jKHU2NCBzaXplLCB1NjQgYWxpZ24pCit7CisJdW5zaWduZWQgbG9uZyBtZW0gPSBlYXJseV9pbml0X2R0X2FsbG9jX21lbW9yeV9hcmNoKHNpemUsIGFsaWduKTsKKwlyZXR1cm4gX192YShtZW0pOworfQorCiAvKioKICAqIHVuZmxhdHRlbl9kZXZpY2VfdHJlZSAtIGNyZWF0ZSB0cmVlIG9mIGRldmljZV9ub2RlcyBmcm9tIGZsYXQgYmxvYgogICoKQEAgLTU0OSw1OCArNzA4LDEzIEBACiAgKi8KIHZvaWQgX19pbml0IHVuZmxhdHRlbl9kZXZpY2VfdHJlZSh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgc3RhcnQsIG1lbSwgc2l6ZTsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKiphbGxuZXh0cCA9ICZhbGxub2RlczsKLQotCXByX2RlYnVnKCIgLT4gdW5mbGF0dGVuX2RldmljZV90cmVlKClcbiIpOwotCi0JaWYgKCFpbml0aWFsX2Jvb3RfcGFyYW1zKSB7Ci0JCXByX2RlYnVnKCJObyBkZXZpY2UgdHJlZSBwb2ludGVyXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCXByX2RlYnVnKCJVbmZsYXR0ZW5pbmcgZGV2aWNlIHRyZWU6XG4iKTsKLQlwcl9kZWJ1ZygibWFnaWM6ICUwOHhcbiIsIGJlMzJfdG9fY3B1KGluaXRpYWxfYm9vdF9wYXJhbXMtPm1hZ2ljKSk7Ci0JcHJfZGVidWcoInNpemU6ICUwOHhcbiIsIGJlMzJfdG9fY3B1KGluaXRpYWxfYm9vdF9wYXJhbXMtPnRvdGFsc2l6ZSkpOwotCXByX2RlYnVnKCJ2ZXJzaW9uOiAlMDh4XG4iLCBiZTMyX3RvX2NwdShpbml0aWFsX2Jvb3RfcGFyYW1zLT52ZXJzaW9uKSk7Ci0KLQlpZiAoYmUzMl90b19jcHUoaW5pdGlhbF9ib290X3BhcmFtcy0+bWFnaWMpICE9IE9GX0RUX0hFQURFUikgewotCQlwcl9lcnIoIkludmFsaWQgZGV2aWNlIHRyZWUgYmxvYiBoZWFkZXJcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogRmlyc3QgcGFzcywgc2NhbiBmb3Igc2l6ZSAqLwotCXN0YXJ0ID0gKCh1bnNpZ25lZCBsb25nKWluaXRpYWxfYm9vdF9wYXJhbXMpICsKLQkJYmUzMl90b19jcHUoaW5pdGlhbF9ib290X3BhcmFtcy0+b2ZmX2R0X3N0cnVjdCk7Ci0Jc2l6ZSA9IHVuZmxhdHRlbl9kdF9ub2RlKDAsICZzdGFydCwgTlVMTCwgTlVMTCwgMCk7Ci0Jc2l6ZSA9IChzaXplIHwgMykgKyAxOwotCi0JcHJfZGVidWcoIiAgc2l6ZSBpcyAlbHgsIGFsbG9jYXRpbmcuLi5cbiIsIHNpemUpOwotCi0JLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgZXhwYW5kZWQgZGV2aWNlIHRyZWUgKi8KLQltZW0gPSBlYXJseV9pbml0X2R0X2FsbG9jX21lbW9yeV9hcmNoKHNpemUgKyA0LAotCQkJX19hbGlnbm9mX18oc3RydWN0IGRldmljZV9ub2RlKSk7Ci0JbWVtID0gKHVuc2lnbmVkIGxvbmcpIF9fdmEobWVtKTsKLQotCSgoX19iZTMyICopbWVtKVtzaXplIC8gNF0gPSBjcHVfdG9fYmUzMigweGRlYWRiZWVmKTsKLQotCXByX2RlYnVnKCIgIHVuZmxhdHRlbmluZyAlbHguLi5cbiIsIG1lbSk7Ci0KLQkvKiBTZWNvbmQgcGFzcywgZG8gYWN0dWFsIHVuZmxhdHRlbmluZyAqLwotCXN0YXJ0ID0gKCh1bnNpZ25lZCBsb25nKWluaXRpYWxfYm9vdF9wYXJhbXMpICsKLQkJYmUzMl90b19jcHUoaW5pdGlhbF9ib290X3BhcmFtcy0+b2ZmX2R0X3N0cnVjdCk7Ci0JdW5mbGF0dGVuX2R0X25vZGUobWVtLCAmc3RhcnQsIE5VTEwsICZhbGxuZXh0cCwgMCk7Ci0JaWYgKGJlMzJfdG9fY3B1cCgoX19iZTMyICopc3RhcnQpICE9IE9GX0RUX0VORCkKLQkJcHJfd2FybmluZygiV2VpcmQgdGFnIGF0IGVuZCBvZiB0cmVlOiAlMDh4XG4iLCAqKCh1MzIgKilzdGFydCkpOwotCWlmIChiZTMyX3RvX2NwdSgoKF9fYmUzMiAqKW1lbSlbc2l6ZSAvIDRdKSAhPSAweGRlYWRiZWVmKQotCQlwcl93YXJuaW5nKCJFbmQgb2YgdHJlZSBtYXJrZXIgb3ZlcndyaXR0ZW46ICUwOHhcbiIsCi0JCQkgICBiZTMyX3RvX2NwdSgoKF9fYmUzMiAqKW1lbSlbc2l6ZSAvIDRdKSk7Ci0JKmFsbG5leHRwID0gTlVMTDsKKwlfX3VuZmxhdHRlbl9kZXZpY2VfdHJlZShpbml0aWFsX2Jvb3RfcGFyYW1zLCAmYWxsbm9kZXMsCisJCQkJZWFybHlfZGV2aWNlX3RyZWVfYWxsb2MpOwogCiAJLyogR2V0IHBvaW50ZXIgdG8gT0YgIi9jaG9zZW4iIG5vZGUgZm9yIHVzZSBldmVyeXdoZXJlICovCiAJb2ZfY2hvc2VuID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi9jaG9zZW4iKTsKIAlpZiAob2ZfY2hvc2VuID09IE5VTEwpCiAJCW9mX2Nob3NlbiA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvY2hvc2VuQDAiKTsKLQotCXByX2RlYnVnKCIgPC0gdW5mbGF0dGVuX2RldmljZV90cmVlKClcbiIpOwogfQorCisjZW5kaWYgLyogQ09ORklHX09GX0VBUkxZX0ZMQVRUUkVFICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL29mL29mX21kaW8uYyBiL2RyaXZlcnMvb2Yvb2ZfbWRpby5jCmluZGV4IDFmY2UwMGUuLmRjZDc4NTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2Yvb2ZfbWRpby5jCisrKyBiL2RyaXZlcnMvb2Yvb2ZfbWRpby5jCkBAIC01MiwyNyArNTIsMzUgQEAKIAogCS8qIExvb3Agb3ZlciB0aGUgY2hpbGQgbm9kZXMgYW5kIHJlZ2lzdGVyIGEgcGh5X2RldmljZSBmb3IgZWFjaCBvbmUgKi8KIAlmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKG5wLCBjaGlsZCkgewotCQljb25zdCBfX2JlMzIgKmFkZHI7CisJCWNvbnN0IF9fYmUzMiAqcGFkZHI7CisJCXUzMiBhZGRyOwogCQlpbnQgbGVuOwogCiAJCS8qIEEgUEhZIG11c3QgaGF2ZSBhIHJlZyBwcm9wZXJ0eSBpbiB0aGUgcmFuZ2UgWzAtMzFdICovCi0JCWFkZHIgPSBvZl9nZXRfcHJvcGVydHkoY2hpbGQsICJyZWciLCAmbGVuKTsKLQkJaWYgKCFhZGRyIHx8IGxlbiA8IHNpemVvZigqYWRkcikgfHwgKmFkZHIgPj0gMzIgfHwgKmFkZHIgPCAwKSB7CisJCXBhZGRyID0gb2ZfZ2V0X3Byb3BlcnR5KGNoaWxkLCAicmVnIiwgJmxlbik7CisJCWlmICghcGFkZHIgfHwgbGVuIDwgc2l6ZW9mKCpwYWRkcikpIHsKIAkJCWRldl9lcnIoJm1kaW8tPmRldiwgIiVzIGhhcyBpbnZhbGlkIFBIWSBhZGRyZXNzXG4iLAogCQkJCWNoaWxkLT5mdWxsX25hbWUpOwogCQkJY29udGludWU7CiAJCX0KIAotCQlpZiAobWRpby0+aXJxKSB7Ci0JCQltZGlvLT5pcnFbKmFkZHJdID0gaXJxX29mX3BhcnNlX2FuZF9tYXAoY2hpbGQsIDApOwotCQkJaWYgKCFtZGlvLT5pcnFbKmFkZHJdKQotCQkJCW1kaW8tPmlycVsqYWRkcl0gPSBQSFlfUE9MTDsKKwkJYWRkciA9IGJlMzJfdG9fY3B1cChwYWRkcik7CisJCWlmIChhZGRyID49IDMyKSB7CisJCQlkZXZfZXJyKCZtZGlvLT5kZXYsICIlcyBQSFkgYWRkcmVzcyAlaSBpcyB0b28gbGFyZ2VcbiIsCisJCQkJY2hpbGQtPmZ1bGxfbmFtZSwgYWRkcik7CisJCQljb250aW51ZTsKIAkJfQogCi0JCXBoeSA9IGdldF9waHlfZGV2aWNlKG1kaW8sIGJlMzJfdG9fY3B1cChhZGRyKSk7CisJCWlmIChtZGlvLT5pcnEpIHsKKwkJCW1kaW8tPmlycVthZGRyXSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKGNoaWxkLCAwKTsKKwkJCWlmICghbWRpby0+aXJxW2FkZHJdKQorCQkJCW1kaW8tPmlycVthZGRyXSA9IFBIWV9QT0xMOworCQl9CisKKwkJcGh5ID0gZ2V0X3BoeV9kZXZpY2UobWRpbywgYWRkcik7CiAJCWlmICghcGh5IHx8IElTX0VSUihwaHkpKSB7CiAJCQlkZXZfZXJyKCZtZGlvLT5kZXYsICJlcnJvciBwcm9iaW5nIFBIWSBhdCBhZGRyZXNzICVpXG4iLAotCQkJCSphZGRyKTsKKwkJCQlhZGRyKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCXBoeV9zY2FuX2ZpeHVwcyhwaHkpOwpAQCAtOTEsNyArOTksNyBAQAogCQl9CiAKIAkJZGV2X2RiZygmbWRpby0+ZGV2LCAicmVnaXN0ZXJlZCBwaHkgJXMgYXQgYWRkcmVzcyAlaVxuIiwKLQkJCWNoaWxkLT5uYW1lLCAqYWRkcik7CisJCQljaGlsZC0+bmFtZSwgYWRkcik7CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL29mL29mX25ldC5jIGIvZHJpdmVycy9vZi9vZl9uZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmYzMzRhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9vZi9vZl9uZXQuYwpAQCAtMCwwICsxLDQ4IEBACisvKgorICogT0YgaGVscGVycyBmb3IgbmV0d29yayBkZXZpY2VzLgorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIKKyAqCisgKiBJbml0aWFsbHkgY29waWVkIG91dCBvZiBhcmNoL3Bvd2VycGMva2VybmVsL3Byb21fcGFyc2UuYworICovCisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9uZXQuaD4KKworLyoqCisgKiBTZWFyY2ggdGhlIGRldmljZSB0cmVlIGZvciB0aGUgYmVzdCBNQUMgYWRkcmVzcyB0byB1c2UuICAnbWFjLWFkZHJlc3MnIGlzCisgKiBjaGVja2VkIGZpcnN0LCBiZWNhdXNlIHRoYXQgaXMgc3VwcG9zZWQgdG8gY29udGFpbiB0byAibW9zdCByZWNlbnQiIE1BQworICogYWRkcmVzcy4gSWYgdGhhdCBpc24ndCBzZXQsIHRoZW4gJ2xvY2FsLW1hYy1hZGRyZXNzJyBpcyBjaGVja2VkIG5leHQsCisgKiBiZWNhdXNlIHRoYXQgaXMgdGhlIGRlZmF1bHQgYWRkcmVzcy4gIElmIHRoYXQgaXNuJ3Qgc2V0LCB0aGVuIHRoZSBvYnNvbGV0ZQorICogJ2FkZHJlc3MnIGlzIGNoZWNrZWQsIGp1c3QgaW4gY2FzZSB3ZSdyZSB1c2luZyBhbiBvbGQgZGV2aWNlIHRyZWUuCisgKgorICogTm90ZSB0aGF0IHRoZSAnYWRkcmVzcycgcHJvcGVydHkgaXMgc3VwcG9zZWQgdG8gY29udGFpbiBhIHZpcnR1YWwgYWRkcmVzcyBvZgorICogdGhlIHJlZ2lzdGVyIHNldCwgYnV0IHNvbWUgRFRTIGZpbGVzIGhhdmUgcmVkZWZpbmVkIHRoYXQgcHJvcGVydHkgdG8gYmUgdGhlCisgKiBNQUMgYWRkcmVzcy4KKyAqCisgKiBBbGwtemVybyBNQUMgYWRkcmVzc2VzIGFyZSByZWplY3RlZCwgYmVjYXVzZSB0aG9zZSBjb3VsZCBiZSBwcm9wZXJ0aWVzIHRoYXQKKyAqIGV4aXN0IGluIHRoZSBkZXZpY2UgdHJlZSwgYnV0IHdlcmUgbm90IHNldCBieSBVLUJvb3QuICBGb3IgZXhhbXBsZSwgdGhlCisgKiBEVFMgY291bGQgZGVmaW5lICdtYWMtYWRkcmVzcycgYW5kICdsb2NhbC1tYWMtYWRkcmVzcycsIHdpdGggemVybyBNQUMKKyAqIGFkZHJlc3Nlcy4gIFNvbWUgb2xkZXIgVS1Cb290cyBvbmx5IGluaXRpYWxpemVkICdsb2NhbC1tYWMtYWRkcmVzcycuICBJbgorICogdGhpcyBjYXNlLCB0aGUgcmVhbCBNQUMgaXMgaW4gJ2xvY2FsLW1hYy1hZGRyZXNzJywgYW5kICdtYWMtYWRkcmVzcycgZXhpc3RzCisgKiBidXQgaXMgYWxsIHplcm9zLgorKi8KK2NvbnN0IHZvaWQgKm9mX2dldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHA7CisKKwlwcCA9IG9mX2ZpbmRfcHJvcGVydHkobnAsICJtYWMtYWRkcmVzcyIsIE5VTEwpOworCWlmIChwcCAmJiAocHAtPmxlbmd0aCA9PSA2KSAmJiBpc192YWxpZF9ldGhlcl9hZGRyKHBwLT52YWx1ZSkpCisJCXJldHVybiBwcC0+dmFsdWU7CisKKwlwcCA9IG9mX2ZpbmRfcHJvcGVydHkobnAsICJsb2NhbC1tYWMtYWRkcmVzcyIsIE5VTEwpOworCWlmIChwcCAmJiAocHAtPmxlbmd0aCA9PSA2KSAmJiBpc192YWxpZF9ldGhlcl9hZGRyKHBwLT52YWx1ZSkpCisJCXJldHVybiBwcC0+dmFsdWU7CisKKwlwcCA9IG9mX2ZpbmRfcHJvcGVydHkobnAsICJhZGRyZXNzIiwgTlVMTCk7CisJaWYgKHBwICYmIChwcC0+bGVuZ3RoID09IDYpICYmIGlzX3ZhbGlkX2V0aGVyX2FkZHIocHAtPnZhbHVlKSkKKwkJcmV0dXJuIHBwLT52YWx1ZTsKKworCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTChvZl9nZXRfbWFjX2FkZHJlc3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9vZi9wbGF0Zm9ybS5jIGIvZHJpdmVycy9vZi9wbGF0Zm9ybS5jCmluZGV4IDViNGEwN2YuLmMwMWNkMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2YvcGxhdGZvcm0uYworKysgYi9kcml2ZXJzL29mL3BsYXRmb3JtLmMKQEAgLTYzMyw2ICs2MzMsOSBAQAogICogQG5wOiBwb2ludGVyIHRvIG5vZGUgdG8gY3JlYXRlIGRldmljZSBmb3IKICAqIEBidXNfaWQ6IG5hbWUgdG8gYXNzaWduIGRldmljZQogICogQHBhcmVudDogTGludXggZGV2aWNlIG1vZGVsIHBhcmVudCBkZXZpY2UuCisgKgorICogUmV0dXJucyBwb2ludGVyIHRvIGNyZWF0ZWQgcGxhdGZvcm0gZGV2aWNlLCBvciBOVUxMIGlmIGEgZGV2aWNlIHdhcyBub3QKKyAqIHJlZ2lzdGVyZWQuICBVbmF2YWlsYWJsZSBkZXZpY2VzIHdpbGwgbm90IGdldCByZWdpc3RlcmVkLgogICovCiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvZl9wbGF0Zm9ybV9kZXZpY2VfY3JlYXRlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCiAJCQkJCSAgICBjb25zdCBjaGFyICpidXNfaWQsCkBAIC02NDAsNiArNjQzLDkgQEAKIHsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXY7CiAKKwlpZiAoIW9mX2RldmljZV9pc19hdmFpbGFibGUobnApKQorCQlyZXR1cm4gTlVMTDsKKwogCWRldiA9IG9mX2RldmljZV9hbGxvYyhucCwgYnVzX2lkLCBwYXJlbnQpOwogCWlmICghZGV2KQogCQlyZXR1cm4gTlVMTDsKQEAgLTY4Myw4ICs2ODksOSBAQAogCQlwcl9kZWJ1ZygiICAgY3JlYXRlIGNoaWxkOiAlc1xuIiwgY2hpbGQtPmZ1bGxfbmFtZSk7CiAJCWRldiA9IG9mX3BsYXRmb3JtX2RldmljZV9jcmVhdGUoY2hpbGQsIE5VTEwsIHBhcmVudCk7CiAJCWlmIChkZXYgPT0gTlVMTCkKLQkJCXJjID0gLUVOT01FTTsKLQkJZWxzZSBpZiAoIW9mX21hdGNoX25vZGUobWF0Y2hlcywgY2hpbGQpKQorCQkJY29udGludWU7CisKKwkJaWYgKCFvZl9tYXRjaF9ub2RlKG1hdGNoZXMsIGNoaWxkKSkKIAkJCWNvbnRpbnVlOwogCQlpZiAocmMgPT0gMCkgewogCQkJcHJfZGVidWcoIiAgIGFuZCBzdWIgYnVzc2VzXG4iKTsKQEAgLTczMywxMCArNzQwLDkgQEAKIAlpZiAob2ZfbWF0Y2hfbm9kZShtYXRjaGVzLCByb290KSkgewogCQlwcl9kZWJ1ZygiIHJvb3QgbWF0Y2gsIGNyZWF0ZSBhbGwgc3ViIGRldmljZXNcbiIpOwogCQlkZXYgPSBvZl9wbGF0Zm9ybV9kZXZpY2VfY3JlYXRlKHJvb3QsIE5VTEwsIHBhcmVudCk7Ci0JCWlmIChkZXYgPT0gTlVMTCkgewotCQkJcmMgPSAtRU5PTUVNOworCQlpZiAoZGV2ID09IE5VTEwpCiAJCQlnb3RvIGJhaWw7Ci0JCX0KKwogCQlwcl9kZWJ1ZygiIGNyZWF0ZSBhbGwgc3ViIGJ1c3Nlc1xuIik7CiAJCXJjID0gb2ZfcGxhdGZvcm1fYnVzX2NyZWF0ZShyb290LCBtYXRjaGVzLCAmZGV2LT5kZXYpOwogCQlnb3RvIGJhaWw7CkBAIC03NDgsOSArNzU0LDkgQEAKIAkJcHJfZGVidWcoIiAgbWF0Y2g6ICVzXG4iLCBjaGlsZC0+ZnVsbF9uYW1lKTsKIAkJZGV2ID0gb2ZfcGxhdGZvcm1fZGV2aWNlX2NyZWF0ZShjaGlsZCwgTlVMTCwgcGFyZW50KTsKIAkJaWYgKGRldiA9PSBOVUxMKQotCQkJcmMgPSAtRU5PTUVNOwotCQllbHNlCi0JCQlyYyA9IG9mX3BsYXRmb3JtX2J1c19jcmVhdGUoY2hpbGQsIG1hdGNoZXMsICZkZXYtPmRldik7CisJCQljb250aW51ZTsKKworCQlyYyA9IG9mX3BsYXRmb3JtX2J1c19jcmVhdGUoY2hpbGQsIG1hdGNoZXMsICZkZXYtPmRldik7CiAJCWlmIChyYykgewogCQkJb2Zfbm9kZV9wdXQoY2hpbGQpOwogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHAuaCBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocC5oCmluZGV4IGJhYjUyMDQuLjc3MjIxMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocC5oCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocC5oCkBAIC0zNiw3ICszNiw2IEBACiAjZGVmaW5lIF9BQ1BJUEhQX0gKIAogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KLSNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9wY2lfaG90cGx1Zy5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3JwYXBocF9zbG90LmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3JwYXBocF9zbG90LmMKaW5kZXggMmVhOWNmMS4uYjI4M2JiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFwaHBfc2xvdC5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhcGhwX3Nsb3QuYwpAQCAtMjQsNyArMjQsNiBAQAogICovCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva29iamVjdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9LY29uZmlnIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvS2NvbmZpZwppbmRleCBmYWVjNzc3Li5kMTYzYmMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L0tjb25maWcKQEAgLTE4LDEyICsxOCwxNCBAQAogY29uZmlnIEFDRVJfV01JCiAJdHJpc3RhdGUgIkFjZXIgV01JIExhcHRvcCBFeHRyYXMiCiAJZGVwZW5kcyBvbiBBQ1BJCi0JZGVwZW5kcyBvbiBMRURTX0NMQVNTCi0JZGVwZW5kcyBvbiBORVdfTEVEUworCXNlbGVjdCBMRURTX0NMQVNTCisJc2VsZWN0IE5FV19MRURTCiAJZGVwZW5kcyBvbiBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCiAJZGVwZW5kcyBvbiBTRVJJT19JODA0MgorCWRlcGVuZHMgb24gSU5QVVQKIAlkZXBlbmRzIG9uIFJGS0lMTCB8fCBSRktJTEwgPSBuCi0Jc2VsZWN0IEFDUElfV01JCisJZGVwZW5kcyBvbiBBQ1BJX1dNSQorCXNlbGVjdCBJTlBVVF9TUEFSU0VLTUFQCiAJLS0taGVscC0tLQogCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgbmV3ZXIgQWNlciAoYW5kIFdpc3Ryb24pIGxhcHRvcHMuIEl0IGFkZHMKIAkgIHdpcmVsZXNzIHJhZGlvIGFuZCBibHVldG9vdGggY29udHJvbCwgYW5kIG9uIHNvbWUgbGFwdG9wcywKQEAgLTEzMSw3ICsxMzMsNyBAQAogCWRlcGVuZHMgb24gIVg4Nl82NAogCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCiAJZGVwZW5kcyBvbiBBQ1BJCi0Jc2VsZWN0IEFDUElfV01JCisJZGVwZW5kcyBvbiBBQ1BJX1dNSQogCS0tLWhlbHAtLS0KIAkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSBXTUkgZXh0ZW5zaW9ucyAod2lyZWxlc3MgYW5kIGJsdWV0b290aCBwb3dlcgogCSAgY29udHJvbCkgb2YgdGhlIEhQIENvbXBhcSBUQzExMDAgdGFibGV0LgpAQCAtMjI2LDYgKzIyOCw3IEBACiAJdHJpc3RhdGUgIkxlbm92byBJZGVhUGFkIExhcHRvcCBFeHRyYXMiCiAJZGVwZW5kcyBvbiBBQ1BJCiAJZGVwZW5kcyBvbiBSRktJTEwKKwlzZWxlY3QgSU5QVVRfU1BBUlNFS01BUAogCWhlbHAKIAkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSByZmtpbGwgc3dpdGNoZXMgb24gTGVub3ZvIElkZWFQYWQgbmV0Ym9va3MuCiAKQEAgLTQyNSw3ICs0MjgsMTAgQEAKIAlkZXBlbmRzIG9uIElOUFVUCiAJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKIAlkZXBlbmRzIG9uIEJBQ0tMSUdIVF9DTEFTU19ERVZJQ0UKKwlkZXBlbmRzIG9uIFJGS0lMTCB8fCBSRktJTEwgPSBuCiAJc2VsZWN0IElOUFVUX1NQQVJTRUtNQVAKKwlzZWxlY3QgTEVEU19DTEFTUworCXNlbGVjdCBORVdfTEVEUwogCS0tLWhlbHAtLS0KIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gc3VwcG9ydCBXTUktYmFzZWQgaG90a2V5cyBvbiBFZWUgUEMgbGFwdG9wcy4KIApAQCAtNTEwLDggKzUxNiw4IEBACiBjb25maWcgQUNQSV9UT1NISUJBCiAJdHJpc3RhdGUgIlRvc2hpYmEgTGFwdG9wIEV4dHJhcyIKIAlkZXBlbmRzIG9uIEFDUEkKLQlkZXBlbmRzIG9uIExFRFNfQ0xBU1MKLQlkZXBlbmRzIG9uIE5FV19MRURTCisJc2VsZWN0IExFRFNfQ0xBU1MKKwlzZWxlY3QgTkVXX0xFRFMKIAlkZXBlbmRzIG9uIEJBQ0tMSUdIVF9DTEFTU19ERVZJQ0UKIAlkZXBlbmRzIG9uIElOUFVUCiAJZGVwZW5kcyBvbiBSRktJTEwgfHwgUkZLSUxMID0gbgpAQCAtNTc2LDYgKzU4MiwxNSBAQAogCSAgc29tZSBlbWJlZGRlZCBJbnRlbCB4ODYgcGxhdGZvcm1zLiBUaGlzIGlzIG5vdCBuZWVkZWQgZm9yIFBDLXR5cGUKIAkgIG1hY2hpbmVzLgogCitjb25maWcgSU5URUxfU0NVX0lQQ19VVElMCisJdHJpc3RhdGUgIkludGVsIFNDVSBJUEMgdXRpbGl0eSBkcml2ZXIiCisJZGVwZW5kcyBvbiBJTlRFTF9TQ1VfSVBDCisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCSAgVGhlIElQQyBVdGlsIGRyaXZlciBwcm92aWRlcyBhbiBpbnRlcmZhY2Ugd2l0aCB0aGUgU0NVIGVuYWJsaW5nCisJICBsb3cgbGV2ZWwgYWNjZXNzIGZvciBkZWJ1ZyB3b3JrIGFuZCB1cGRhdGluZyB0aGUgZmlybXdhcmUuIFNheQorCSAgTiB1bmxlc3MgeW91IHdpbGwgYmUgZG9pbmcgdGhpcyBvbiBhbiBJbnRlbCBNSUQgcGxhdGZvcm0uCisKIGNvbmZpZyBHUElPX0lOVEVMX1BNSUMKIAlib29sICJJbnRlbCBQTUlDIEdQSU8gc3VwcG9ydCIKIAlkZXBlbmRzIG9uIElOVEVMX1NDVV9JUEMgJiYgR1BJT0xJQgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvTWFrZWZpbGUgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9NYWtlZmlsZQppbmRleCA5OTUwY2NjLi40ZWM0ZmY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9NYWtlZmlsZQpAQCAtMjgsNiArMjgsNyBAQAogb2JqLSQoQ09ORklHX0FDUElfVE9TSElCQSkJKz0gdG9zaGliYV9hY3BpLm8KIG9iai0kKENPTkZJR19UT1NISUJBX0JUX1JGS0lMTCkJKz0gdG9zaGliYV9ibHVldG9vdGgubwogb2JqLSQoQ09ORklHX0lOVEVMX1NDVV9JUEMpCSs9IGludGVsX3NjdV9pcGMubworb2JqLSQoQ09ORklHX0lOVEVMX1NDVV9JUENfVVRJTCkrPSBpbnRlbF9zY3VfaXBjdXRpbC5vCiBvYmotJChDT05GSUdfUkFSX1JFR0lTVEVSKQkrPSBpbnRlbF9yYXJfcmVnaXN0ZXIubwogb2JqLSQoQ09ORklHX0lOVEVMX0lQUykJCSs9IGludGVsX2lwcy5vCiBvYmotJChDT05GSUdfR1BJT19JTlRFTF9QTUlDKQkrPSBpbnRlbF9wbWljX2dwaW8ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvYWNlci13bWkuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2FjZXItd21pLmMKaW5kZXggYzhjNjUzNy4uZWU0MGQ2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvYWNlci13bWkuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9hY2VyLXdtaS5jCkBAIC0zNyw2ICszNyw5IEBACiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0L3NwYXJzZS1rZXltYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWkuaD4KIAogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CiAKQEAgLTQ4LDYgKzUxLDcgQEAKICNkZWZpbmUgQUNFUl9FUlIgS0VSTl9FUlIgQUNFUl9MT0dQUkVGSVgKICNkZWZpbmUgQUNFUl9OT1RJQ0UgS0VSTl9OT1RJQ0UgQUNFUl9MT0dQUkVGSVgKICNkZWZpbmUgQUNFUl9JTkZPIEtFUk5fSU5GTyBBQ0VSX0xPR1BSRUZJWAorI2RlZmluZSBBQ0VSX1dBUk5JTkcgS0VSTl9XQVJOSU5HIEFDRVJfTE9HUFJFRklYCiAKIC8qCiAgKiBNYWdpYyBOdW1iZXIKQEAgLTgyLDkgKzg2LDgyIEBACiAjZGVmaW5lIEFNVzBfR1VJRDIJCSI0MzFGMTZFRC0wQzJCLTQ0NEMtQjI2Ny0yN0RFQjE0MENGOUMiCiAjZGVmaW5lIFdNSURfR1VJRDEJCSI2QUY0RjI1OC1CNDAxLTQyZmQtQkU5MS0zRDRBQzJEN0MwRDMiCiAjZGVmaW5lIFdNSURfR1VJRDIJCSI5NTc2NEUwOS1GQjU2LTRlODMtQjMxQS0zNzc2MUY2MDk5NEEiCisjZGVmaW5lIFdNSURfR1VJRDMJCSI2MUVGNjlFQS04NjVDLTRCQzMtQTUwMi1BMERFQkEwQ0I1MzEiCisKKy8qCisgKiBBY2VyIEFDUEkgZXZlbnQgR1VJRHMKKyAqLworI2RlZmluZSBBQ0VSV01JRF9FVkVOVF9HVUlEICI2NzZBQTE1RS02QTQ3LTREOUYtQTJDQy0xRTZEMThEMTQwMjYiCiAKIE1PRFVMRV9BTElBUygid21pOjY3QzMzNzFELTk1QTMtNEMzNy1CQjYxLURENDdCNDkxREFBQiIpOwogTU9EVUxFX0FMSUFTKCJ3bWk6NkFGNEYyNTgtQjQwMS00MmZkLUJFOTEtM0Q0QUMyRDdDMEQzIik7CitNT0RVTEVfQUxJQVMoIndtaTo2NzZBQTE1RS02QTQ3LTREOUYtQTJDQy0xRTZEMThEMTQwMjYiKTsKKworZW51bSBhY2VyX3dtaV9ldmVudF9pZHMgeworCVdNSURfSE9US0VZX0VWRU5UID0gMHgxLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBrZXlfZW50cnkgYWNlcl93bWlfa2V5bWFwW10gPSB7CisJe0tFX0tFWSwgMHgwMSwge0tFWV9XTEFOfSB9LCAgICAgLyogV2lGaSAqLworCXtLRV9LRVksIDB4MTIsIHtLRVlfQkxVRVRPT1RIfSB9LAkvKiBCVCAqLworCXtLRV9LRVksIDB4MjEsIHtLRVlfUFJPRzF9IH0sICAgIC8qIEJhY2t1cCAqLworCXtLRV9LRVksIDB4MjIsIHtLRVlfUFJPRzJ9IH0sICAgIC8qIEFyY2FkZSAqLworCXtLRV9LRVksIDB4MjMsIHtLRVlfUFJPRzN9IH0sICAgIC8qIFBfS2V5ICovCisJe0tFX0tFWSwgMHgyNCwge0tFWV9QUk9HNH0gfSwgICAgLyogU29jaWFsIG5ldHdvcmtpbmdfS2V5ICovCisJe0tFX0tFWSwgMHg2NCwge0tFWV9TV0lUQ0hWSURFT01PREV9IH0sCS8qIERpc3BsYXkgU3dpdGNoICovCisJe0tFX0tFWSwgMHg4Miwge0tFWV9GMjJ9IH0sICAgICAgLyogVG91Y2ggUGFkIE9uL09mZiAqLworCXtLRV9FTkQsIDB9Cit9OworCitzdGF0aWMgc3RydWN0IGlucHV0X2RldiAqYWNlcl93bWlfaW5wdXRfZGV2OworCitzdHJ1Y3QgZXZlbnRfcmV0dXJuX3ZhbHVlIHsKKwl1OCBmdW5jdGlvbjsKKwl1OCBrZXlfbnVtOworCXUxNiBkZXZpY2Vfc3RhdGU7CisJdTMyIHJlc2VydmVkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyoKKyAqIEdVSUQzIEdldCBEZXZpY2UgU3RhdHVzIGRldmljZSBmbGFncworICovCisjZGVmaW5lIEFDRVJfV01JRDNfR0RTX1dJUkVMRVNTCQkoMTw8MCkJLyogV2lGaSAqLworI2RlZmluZSBBQ0VSX1dNSUQzX0dEU19USFJFRUcJCSgxPDw2KQkvKiAzRyAqLworI2RlZmluZSBBQ0VSX1dNSUQzX0dEU19CTFVFVE9PVEgJKDE8PDExKQkvKiBCVCAqLworCitzdHJ1Y3QgbG1faW5wdXRfcGFyYW1zIHsKKwl1OCBmdW5jdGlvbl9udW07ICAgICAgICAvKiBGdW5jdGlvbiBOdW1iZXIgKi8KKwl1MTYgY29tbXVuX2RldmljZXM7ICAgICAvKiBDb21tdW5pY2F0aW9uIHR5cGUgZGV2aWNlcyBkZWZhdWx0IHN0YXR1cyAqLworCXUxNiBkZXZpY2VzOyAgICAgICAgICAgIC8qIE90aGVyIHR5cGUgZGV2aWNlcyBkZWZhdWx0IHN0YXR1cyAqLworCXU4IGxtX3N0YXR1czsgICAgICAgICAgIC8qIExhdW5jaCBNYW5hZ2VyIFN0YXR1cyAqLworCXUxNiByZXNlcnZlZDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBsbV9yZXR1cm5fdmFsdWUgeworCXU4IGVycm9yX2NvZGU7ICAgICAgICAgIC8qIEVycm9yIENvZGUgKi8KKwl1OCBlY19yZXR1cm5fdmFsdWU7ICAgICAvKiBFQyBSZXR1cm4gVmFsdWUgKi8KKwl1MTYgcmVzZXJ2ZWQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgd21pZDNfZ2RzX2lucHV0X3BhcmFtIHsJLyogR2V0IERldmljZSBTdGF0dXMgaW5wdXQgcGFyYW1ldGVyICovCisJdTggZnVuY3Rpb25fbnVtOwkvKiBGdW5jdGlvbiBOdW1iZXIgKi8KKwl1OCBob3RrZXlfbnVtYmVyOwkvKiBIb3RrZXkgTnVtYmVyICovCisJdTE2IGRldmljZXM7CQkvKiBHZXQgRGV2aWNlICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgd21pZDNfZ2RzX3JldHVybl92YWx1ZSB7CS8qIEdldCBEZXZpY2UgU3RhdHVzIHJldHVybiB2YWx1ZSovCisJdTggZXJyb3JfY29kZTsJCS8qIEVycm9yIENvZGUgKi8KKwl1OCBlY19yZXR1cm5fdmFsdWU7CS8qIEVDIFJldHVybiBWYWx1ZSAqLworCXUxNiBkZXZpY2VzOwkJLyogQ3VycmVudCBEZXZpY2UgU3RhdHVzICovCisJdTMyIHJlc2VydmVkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGhvdGtleV9mdW5jdGlvbl90eXBlX2FhIHsKKwl1OCB0eXBlOworCXU4IGxlbmd0aDsKKwl1MTYgaGFuZGxlOworCXUxNiBjb21tdW5fZnVuY19iaXRtYXA7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKgogICogSW50ZXJmYWNlIGNhcGFiaWxpdHkgZmxhZ3MKQEAgLTExNiwxNSArMTkzLDE5IEBACiBzdGF0aWMgaW50IGJyaWdodG5lc3MgPSAtMTsKIHN0YXRpYyBpbnQgdGhyZWVnID0gLTE7CiBzdGF0aWMgaW50IGZvcmNlX3NlcmllczsKK3N0YXRpYyBib29sIGVjX3Jhd19tb2RlOworc3RhdGljIGJvb2wgaGFzX3R5cGVfYWE7CiAKIG1vZHVsZV9wYXJhbShtYWlsbGVkLCBpbnQsIDA0NDQpOwogbW9kdWxlX3BhcmFtKGJyaWdodG5lc3MsIGludCwgMDQ0NCk7CiBtb2R1bGVfcGFyYW0odGhyZWVnLCBpbnQsIDA0NDQpOwogbW9kdWxlX3BhcmFtKGZvcmNlX3NlcmllcywgaW50LCAwNDQ0KTsKK21vZHVsZV9wYXJhbShlY19yYXdfbW9kZSwgYm9vbCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKG1haWxsZWQsICJTZXQgaW5pdGlhbCBzdGF0ZSBvZiBNYWlsIExFRCIpOwogTU9EVUxFX1BBUk1fREVTQyhicmlnaHRuZXNzLCAiU2V0IGluaXRpYWwgTENEIGJhY2tsaWdodCBicmlnaHRuZXNzIik7CiBNT0RVTEVfUEFSTV9ERVNDKHRocmVlZywgIlNldCBpbml0aWFsIHN0YXRlIG9mIDNHIGhhcmR3YXJlIik7CiBNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX3NlcmllcywgIkZvcmNlIGEgZGlmZmVyZW50IGxhcHRvcCBzZXJpZXMiKTsKK01PRFVMRV9QQVJNX0RFU0MoZWNfcmF3X21vZGUsICJFbmFibGUgRUMgcmF3IG1vZGUiKTsKIAogc3RydWN0IGFjZXJfZGF0YSB7CiAJaW50IG1haWxsZWQ7CkBAIC0xNDAsNiArMjIxLDcgQEAKIAogc3RhdGljIHN0cnVjdCByZmtpbGwgKndpcmVsZXNzX3Jma2lsbDsKIHN0YXRpYyBzdHJ1Y3QgcmZraWxsICpibHVldG9vdGhfcmZraWxsOworc3RhdGljIHN0cnVjdCByZmtpbGwgKnRocmVlZ19yZmtpbGw7CiAKIC8qIEVhY2ggbG93LWxldmVsIGludGVyZmFjZSBtdXN0IGRlZmluZSBhdCBsZWFzdCBzb21lIG9mIHRoZSBmb2xsb3dpbmcgKi8KIHN0cnVjdCB3bWlfaW50ZXJmYWNlIHsKQEAgLTc1Myw2ICs4MzUsMjggQEAKIAlyZXR1cm4gV01JX2V4ZWN1dGVfdTMyKG1ldGhvZF9pZCwgKHUzMil2YWx1ZSwgTlVMTCk7CiB9CiAKK3N0YXRpYyB2b2lkIHR5cGVfYWFfZG1pX2RlY29kZShjb25zdCBzdHJ1Y3QgZG1pX2hlYWRlciAqaGVhZGVyLCB2b2lkICpkdW1teSkKK3sKKwlzdHJ1Y3QgaG90a2V5X2Z1bmN0aW9uX3R5cGVfYWEgKnR5cGVfYWE7CisKKwkvKiBXZSBhcmUgbG9va2luZyBmb3IgT0VNLXNwZWNpZmljIFR5cGUgQUFoICovCisJaWYgKGhlYWRlci0+dHlwZSAhPSAweEFBKQorCQlyZXR1cm47CisKKwloYXNfdHlwZV9hYSA9IHRydWU7CisJdHlwZV9hYSA9IChzdHJ1Y3QgaG90a2V5X2Z1bmN0aW9uX3R5cGVfYWEgKikgaGVhZGVyOworCisJcHJpbnRrKEFDRVJfSU5GTyAiRnVuY3Rpb24gYml0bWFwIGZvciBDb21tdW5pY2F0aW9uIEJ1dHRvbjogMHgleFxuIiwKKwkJdHlwZV9hYS0+Y29tbXVuX2Z1bmNfYml0bWFwKTsKKworCWlmICh0eXBlX2FhLT5jb21tdW5fZnVuY19iaXRtYXAgJiBBQ0VSX1dNSUQzX0dEU19XSVJFTEVTUykKKwkJaW50ZXJmYWNlLT5jYXBhYmlsaXR5IHw9IEFDRVJfQ0FQX1dJUkVMRVNTOworCWlmICh0eXBlX2FhLT5jb21tdW5fZnVuY19iaXRtYXAgJiBBQ0VSX1dNSUQzX0dEU19USFJFRUcpCisJCWludGVyZmFjZS0+Y2FwYWJpbGl0eSB8PSBBQ0VSX0NBUF9USFJFRUc7CisJaWYgKHR5cGVfYWEtPmNvbW11bl9mdW5jX2JpdG1hcCAmIEFDRVJfV01JRDNfR0RTX0JMVUVUT09USCkKKwkJaW50ZXJmYWNlLT5jYXBhYmlsaXR5IHw9IEFDRVJfQ0FQX0JMVUVUT09USDsKK30KKwogc3RhdGljIGFjcGlfc3RhdHVzIFdNSURfc2V0X2NhcGFiaWxpdGllcyh2b2lkKQogewogCXN0cnVjdCBhY3BpX2J1ZmZlciBvdXQgPSB7QUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEx9OwpAQCAtNzczLDE2ICs4NzcsMTcgQEAKIAkJcmV0dXJuIEFFX0VSUk9SOwogCX0KIAotCS8qIE5vdCBzdXJlIG9uIHRoZSBtZWFuaW5nIG9mIHRoZSByZWxldmFudCBiaXRzIHlldCB0byBkZXRlY3QgdGhlc2UgKi8KLQlpbnRlcmZhY2UtPmNhcGFiaWxpdHkgfD0gQUNFUl9DQVBfV0lSRUxFU1M7Ci0JaW50ZXJmYWNlLT5jYXBhYmlsaXR5IHw9IEFDRVJfQ0FQX1RIUkVFRzsKKwlkbWlfd2Fsayh0eXBlX2FhX2RtaV9kZWNvZGUsIE5VTEwpOworCWlmICghaGFzX3R5cGVfYWEpIHsKKwkJaW50ZXJmYWNlLT5jYXBhYmlsaXR5IHw9IEFDRVJfQ0FQX1dJUkVMRVNTOworCQlpbnRlcmZhY2UtPmNhcGFiaWxpdHkgfD0gQUNFUl9DQVBfVEhSRUVHOworCQlpZiAoZGV2aWNlcyAmIDB4MTApCisJCQlpbnRlcmZhY2UtPmNhcGFiaWxpdHkgfD0gQUNFUl9DQVBfQkxVRVRPT1RIOworCX0KIAogCS8qIFdNSUQgYWx3YXlzIHByb3ZpZGVzIGJyaWdodG5lc3MgbWV0aG9kcyAqLwogCWludGVyZmFjZS0+Y2FwYWJpbGl0eSB8PSBBQ0VSX0NBUF9CUklHSFRORVNTOwogCi0JaWYgKGRldmljZXMgJiAweDEwKQotCQlpbnRlcmZhY2UtPmNhcGFiaWxpdHkgfD0gQUNFUl9DQVBfQkxVRVRPT1RIOwotCiAJaWYgKCEoZGV2aWNlcyAmIDB4MjApKQogCQltYXhfYnJpZ2h0bmVzcyA9IDB4OTsKIApAQCAtODYxLDcgKzk2Niw4IEBACiAJICogY2FwYWJpbGl0eSBpc24ndCBhdmFpbGFibGUgb24gdGhlIGdpdmVuIGludGVyZmFjZQogCSAqLwogCXNldF91MzIobWFpbGxlZCwgQUNFUl9DQVBfTUFJTExFRCk7Ci0Jc2V0X3UzMih0aHJlZWcsIEFDRVJfQ0FQX1RIUkVFRyk7CisJaWYgKCFoYXNfdHlwZV9hYSkKKwkJc2V0X3UzMih0aHJlZWcsIEFDRVJfQ0FQX1RIUkVFRyk7CiAJc2V0X3UzMihicmlnaHRuZXNzLCBBQ0VSX0NBUF9CUklHSFRORVNTKTsKIH0KIApAQCAtOTQ4LDYgKzEwNTQsNzkgQEAKIAliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoYWNlcl9iYWNrbGlnaHRfZGV2aWNlKTsKIH0KIAorc3RhdGljIGFjcGlfc3RhdHVzIHdtaWQzX2dldF9kZXZpY2Vfc3RhdHVzKHUzMiAqdmFsdWUsIHUxNiBkZXZpY2UpCit7CisJc3RydWN0IHdtaWQzX2dkc19yZXR1cm5fdmFsdWUgcmV0dXJuX3ZhbHVlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bmlvbiBhY3BpX29iamVjdCAqb2JqOworCXN0cnVjdCB3bWlkM19nZHNfaW5wdXRfcGFyYW0gcGFyYW1zID0geworCQkuZnVuY3Rpb25fbnVtID0gMHgxLAorCQkuaG90a2V5X251bWJlciA9IDB4MDEsCisJCS5kZXZpY2VzID0gZGV2aWNlLAorCX07CisJc3RydWN0IGFjcGlfYnVmZmVyIGlucHV0ID0geworCQlzaXplb2Yoc3RydWN0IHdtaWQzX2dkc19pbnB1dF9wYXJhbSksCisJCSZwYXJhbXMKKwl9OworCXN0cnVjdCBhY3BpX2J1ZmZlciBvdXRwdXQgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisKKwlzdGF0dXMgPSB3bWlfZXZhbHVhdGVfbWV0aG9kKFdNSURfR1VJRDMsIDAsIDB4MiwgJmlucHV0LCAmb3V0cHV0KTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCXJldHVybiBzdGF0dXM7CisKKwlvYmogPSBvdXRwdXQucG9pbnRlcjsKKworCWlmICghb2JqKQorCQlyZXR1cm4gQUVfRVJST1I7CisJZWxzZSBpZiAob2JqLT50eXBlICE9IEFDUElfVFlQRV9CVUZGRVIpIHsKKwkJa2ZyZWUob2JqKTsKKwkJcmV0dXJuIEFFX0VSUk9SOworCX0KKwlpZiAob2JqLT5idWZmZXIubGVuZ3RoICE9IDgpIHsKKwkJcHJpbnRrKEFDRVJfV0FSTklORyAiVW5rbm93biBidWZmZXIgbGVuZ3RoICVkXG4iLAorCQkJb2JqLT5idWZmZXIubGVuZ3RoKTsKKwkJa2ZyZWUob2JqKTsKKwkJcmV0dXJuIEFFX0VSUk9SOworCX0KKworCXJldHVybl92YWx1ZSA9ICooKHN0cnVjdCB3bWlkM19nZHNfcmV0dXJuX3ZhbHVlICopb2JqLT5idWZmZXIucG9pbnRlcik7CisJa2ZyZWUob2JqKTsKKworCWlmIChyZXR1cm5fdmFsdWUuZXJyb3JfY29kZSB8fCByZXR1cm5fdmFsdWUuZWNfcmV0dXJuX3ZhbHVlKQorCQlwcmludGsoQUNFUl9XQVJOSU5HICJHZXQgRGV2aWNlIFN0YXR1cyBmYWlsZWQ6ICIKKwkJCSIweCV4IC0gMHgleFxuIiwgcmV0dXJuX3ZhbHVlLmVycm9yX2NvZGUsCisJCQlyZXR1cm5fdmFsdWUuZWNfcmV0dXJuX3ZhbHVlKTsKKwllbHNlCisJCSp2YWx1ZSA9ICEhKHJldHVybl92YWx1ZS5kZXZpY2VzICYgZGV2aWNlKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBhY3BpX3N0YXR1cyBnZXRfZGV2aWNlX3N0YXR1cyh1MzIgKnZhbHVlLCB1MzIgY2FwKQoreworCWlmICh3bWlfaGFzX2d1aWQoV01JRF9HVUlEMykpIHsKKwkJdTE2IGRldmljZTsKKworCQlzd2l0Y2ggKGNhcCkgeworCQljYXNlIEFDRVJfQ0FQX1dJUkVMRVNTOgorCQkJZGV2aWNlID0gQUNFUl9XTUlEM19HRFNfV0lSRUxFU1M7CisJCQlicmVhazsKKwkJY2FzZSBBQ0VSX0NBUF9CTFVFVE9PVEg6CisJCQlkZXZpY2UgPSBBQ0VSX1dNSUQzX0dEU19CTFVFVE9PVEg7CisJCQlicmVhazsKKwkJY2FzZSBBQ0VSX0NBUF9USFJFRUc6CisJCQlkZXZpY2UgPSBBQ0VSX1dNSUQzX0dEU19USFJFRUc7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBBRV9FUlJPUjsKKwkJfQorCQlyZXR1cm4gd21pZDNfZ2V0X2RldmljZV9zdGF0dXModmFsdWUsIGRldmljZSk7CisKKwl9IGVsc2UgeworCQlyZXR1cm4gZ2V0X3UzMih2YWx1ZSwgY2FwKTsKKwl9Cit9CisKIC8qCiAgKiBSZmtpbGwgZGV2aWNlcwogICovCkBAIC05NjgsNiArMTE0NywxMyBAQAogCQkJcmZraWxsX3NldF9zd19zdGF0ZShibHVldG9vdGhfcmZraWxsLCAhc3RhdGUpOwogCX0KIAorCWlmIChoYXNfY2FwKEFDRVJfQ0FQX1RIUkVFRykgJiYgd21pX2hhc19ndWlkKFdNSURfR1VJRDMpKSB7CisJCXN0YXR1cyA9IHdtaWQzX2dldF9kZXZpY2Vfc3RhdHVzKCZzdGF0ZSwKKwkJCQlBQ0VSX1dNSUQzX0dEU19USFJFRUcpOworCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCisJCQlyZmtpbGxfc2V0X3N3X3N0YXRlKHRocmVlZ19yZmtpbGwsICFzdGF0ZSk7CisJfQorCiAJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZhY2VyX3Jma2lsbF93b3JrLCByb3VuZF9qaWZmaWVzX3JlbGF0aXZlKEhaKSk7CiB9CiAKQEAgLTk5MSw2ICsxMTc3LDggQEAKIHsKIAlpbnQgZXJyOwogCXN0cnVjdCByZmtpbGwgKnJma2lsbF9kZXY7CisJdTMyIHN0YXRlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAogCXJma2lsbF9kZXYgPSByZmtpbGxfYWxsb2MobmFtZSwgZGV2LCB0eXBlLAogCQkJCSAgJmFjZXJfcmZraWxsX29wcywKQEAgLTk5OCw2ICsxMTg2LDEwIEBACiAJaWYgKCFyZmtpbGxfZGV2KQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAorCXN0YXR1cyA9IGdldF9kZXZpY2Vfc3RhdHVzKCZzdGF0ZSwgY2FwKTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCisJCXJma2lsbF9pbml0X3N3X3N0YXRlKHJma2lsbF9kZXYsICFzdGF0ZSk7CisKIAllcnIgPSByZmtpbGxfcmVnaXN0ZXIocmZraWxsX2Rldik7CiAJaWYgKGVycikgewogCQlyZmtpbGxfZGVzdHJveShyZmtpbGxfZGV2KTsKQEAgLTEwMjQsNiArMTIxNiwxOSBAQAogCQl9CiAJfQogCisJaWYgKGhhc19jYXAoQUNFUl9DQVBfVEhSRUVHKSkgeworCQl0aHJlZWdfcmZraWxsID0gYWNlcl9yZmtpbGxfcmVnaXN0ZXIoZGV2LAorCQkJUkZLSUxMX1RZUEVfV1dBTiwgImFjZXItdGhyZWVnIiwKKwkJCUFDRVJfQ0FQX1RIUkVFRyk7CisJCWlmIChJU19FUlIodGhyZWVnX3Jma2lsbCkpIHsKKwkJCXJma2lsbF91bnJlZ2lzdGVyKHdpcmVsZXNzX3Jma2lsbCk7CisJCQlyZmtpbGxfZGVzdHJveSh3aXJlbGVzc19yZmtpbGwpOworCQkJcmZraWxsX3VucmVnaXN0ZXIoYmx1ZXRvb3RoX3Jma2lsbCk7CisJCQlyZmtpbGxfZGVzdHJveShibHVldG9vdGhfcmZraWxsKTsKKwkJCXJldHVybiBQVFJfRVJSKHRocmVlZ19yZmtpbGwpOworCQl9CisJfQorCiAJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZhY2VyX3Jma2lsbF93b3JrLCByb3VuZF9qaWZmaWVzX3JlbGF0aXZlKEhaKSk7CiAKIAlyZXR1cm4gMDsKQEAgLTEwNDAsNiArMTI0NSwxMSBAQAogCQlyZmtpbGxfdW5yZWdpc3RlcihibHVldG9vdGhfcmZraWxsKTsKIAkJcmZraWxsX2Rlc3Ryb3koYmx1ZXRvb3RoX3Jma2lsbCk7CiAJfQorCisJaWYgKGhhc19jYXAoQUNFUl9DQVBfVEhSRUVHKSkgeworCQlyZmtpbGxfdW5yZWdpc3Rlcih0aHJlZWdfcmZraWxsKTsKKwkJcmZraWxsX2Rlc3Ryb3kodGhyZWVnX3Jma2lsbCk7CisJfQogCXJldHVybjsKIH0KIApAQCAtMTA1MCw3ICsxMjYwLDEyIEBACiAJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAl1MzIgcmVzdWx0OyBcCi0JYWNwaV9zdGF0dXMgc3RhdHVzID0gZ2V0X3UzMigmcmVzdWx0LCBBQ0VSX0NBUF9USFJFRUcpOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlpZiAod21pX2hhc19ndWlkKFdNSURfR1VJRDMpKQorCQlzdGF0dXMgPSB3bWlkM19nZXRfZGV2aWNlX3N0YXR1cygmcmVzdWx0LAorCQkJCUFDRVJfV01JRDNfR0RTX1RIUkVFRyk7CisJZWxzZQorCQlzdGF0dXMgPSBnZXRfdTMyKCZyZXN1bHQsIEFDRVJfQ0FQX1RIUkVFRyk7CiAJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKQogCQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgcmVzdWx0KTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICJSZWFkIGVycm9yXG4iKTsKQEAgLTEwODUsNiArMTMwMCwxNzggQEAKIAogc3RhdGljIERFVklDRV9BVFRSKGludGVyZmFjZSwgU19JUlVHTywgc2hvd19pbnRlcmZhY2UsIE5VTEwpOwogCitzdGF0aWMgdm9pZCBhY2VyX3dtaV9ub3RpZnkodTMyIHZhbHVlLCB2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBhY3BpX2J1ZmZlciByZXNwb25zZSA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKKwl1bmlvbiBhY3BpX29iamVjdCAqb2JqOworCXN0cnVjdCBldmVudF9yZXR1cm5fdmFsdWUgcmV0dXJuX3ZhbHVlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCXN0YXR1cyA9IHdtaV9nZXRfZXZlbnRfZGF0YSh2YWx1ZSwgJnJlc3BvbnNlKTsKKwlpZiAoc3RhdHVzICE9IEFFX09LKSB7CisJCXByaW50ayhBQ0VSX1dBUk5JTkcgImJhZCBldmVudCBzdGF0dXMgMHgleFxuIiwgc3RhdHVzKTsKKwkJcmV0dXJuOworCX0KKworCW9iaiA9ICh1bmlvbiBhY3BpX29iamVjdCAqKXJlc3BvbnNlLnBvaW50ZXI7CisKKwlpZiAoIW9iaikKKwkJcmV0dXJuOworCWlmIChvYmotPnR5cGUgIT0gQUNQSV9UWVBFX0JVRkZFUikgeworCQlwcmludGsoQUNFUl9XQVJOSU5HICJVbmtub3duIHJlc3BvbnNlIHJlY2VpdmVkICVkXG4iLAorCQkJb2JqLT50eXBlKTsKKwkJa2ZyZWUob2JqKTsKKwkJcmV0dXJuOworCX0KKwlpZiAob2JqLT5idWZmZXIubGVuZ3RoICE9IDgpIHsKKwkJcHJpbnRrKEFDRVJfV0FSTklORyAiVW5rbm93biBidWZmZXIgbGVuZ3RoICVkXG4iLAorCQkJb2JqLT5idWZmZXIubGVuZ3RoKTsKKwkJa2ZyZWUob2JqKTsKKwkJcmV0dXJuOworCX0KKworCXJldHVybl92YWx1ZSA9ICooKHN0cnVjdCBldmVudF9yZXR1cm5fdmFsdWUgKilvYmotPmJ1ZmZlci5wb2ludGVyKTsKKwlrZnJlZShvYmopOworCisJc3dpdGNoIChyZXR1cm5fdmFsdWUuZnVuY3Rpb24pIHsKKwljYXNlIFdNSURfSE9US0VZX0VWRU5UOgorCQlpZiAoIXNwYXJzZV9rZXltYXBfcmVwb3J0X2V2ZW50KGFjZXJfd21pX2lucHV0X2RldiwKKwkJCQlyZXR1cm5fdmFsdWUua2V5X251bSwgMSwgdHJ1ZSkpCisJCQlwcmludGsoQUNFUl9XQVJOSU5HICJVbmtub3duIGtleSBudW1iZXIgLSAweCV4XG4iLAorCQkJCXJldHVybl92YWx1ZS5rZXlfbnVtKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEFDRVJfV0FSTklORyAiVW5rbm93biBmdW5jdGlvbiBudW1iZXIgLSAlZCAtICVkXG4iLAorCQkJcmV0dXJuX3ZhbHVlLmZ1bmN0aW9uLCByZXR1cm5fdmFsdWUua2V5X251bSk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGFjcGlfc3RhdHVzCit3bWlkM19zZXRfbG1fbW9kZShzdHJ1Y3QgbG1faW5wdXRfcGFyYW1zICpwYXJhbXMsCisJCSAgc3RydWN0IGxtX3JldHVybl92YWx1ZSAqcmV0dXJuX3ZhbHVlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bmlvbiBhY3BpX29iamVjdCAqb2JqOworCisJc3RydWN0IGFjcGlfYnVmZmVyIGlucHV0ID0geyBzaXplb2Yoc3RydWN0IGxtX2lucHV0X3BhcmFtcyksIHBhcmFtcyB9OworCXN0cnVjdCBhY3BpX2J1ZmZlciBvdXRwdXQgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisKKwlzdGF0dXMgPSB3bWlfZXZhbHVhdGVfbWV0aG9kKFdNSURfR1VJRDMsIDAsIDB4MSwgJmlucHV0LCAmb3V0cHV0KTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCXJldHVybiBzdGF0dXM7CisKKwlvYmogPSBvdXRwdXQucG9pbnRlcjsKKworCWlmICghb2JqKQorCQlyZXR1cm4gQUVfRVJST1I7CisJZWxzZSBpZiAob2JqLT50eXBlICE9IEFDUElfVFlQRV9CVUZGRVIpIHsKKwkJa2ZyZWUob2JqKTsKKwkJcmV0dXJuIEFFX0VSUk9SOworCX0KKwlpZiAob2JqLT5idWZmZXIubGVuZ3RoICE9IDQpIHsKKwkJcHJpbnRrKEFDRVJfV0FSTklORyAiVW5rbm93biBidWZmZXIgbGVuZ3RoICVkXG4iLAorCQkgICAgICAgb2JqLT5idWZmZXIubGVuZ3RoKTsKKwkJa2ZyZWUob2JqKTsKKwkJcmV0dXJuIEFFX0VSUk9SOworCX0KKworCSpyZXR1cm5fdmFsdWUgPSAqKChzdHJ1Y3QgbG1fcmV0dXJuX3ZhbHVlICopb2JqLT5idWZmZXIucG9pbnRlcik7CisJa2ZyZWUob2JqKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgYWNlcl93bWlfZW5hYmxlX2VjX3Jhdyh2b2lkKQoreworCXN0cnVjdCBsbV9yZXR1cm5fdmFsdWUgcmV0dXJuX3ZhbHVlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgbG1faW5wdXRfcGFyYW1zIHBhcmFtcyA9IHsKKwkJLmZ1bmN0aW9uX251bSA9IDB4MSwKKwkJLmNvbW11bl9kZXZpY2VzID0gMHhGRkZGLAorCQkuZGV2aWNlcyA9IDB4RkZGRiwKKwkJLmxtX3N0YXR1cyA9IDB4MDAsICAgICAgICAgICAgLyogTGF1bmNoIE1hbmFnZXIgRGVhY3RpdmUgKi8KKwl9OworCisJc3RhdHVzID0gd21pZDNfc2V0X2xtX21vZGUoJnBhcmFtcywgJnJldHVybl92YWx1ZSk7CisKKwlpZiAocmV0dXJuX3ZhbHVlLmVycm9yX2NvZGUgfHwgcmV0dXJuX3ZhbHVlLmVjX3JldHVybl92YWx1ZSkKKwkJcHJpbnRrKEFDRVJfV0FSTklORyAiRW5hYmxpbmcgRUMgcmF3IG1vZGUgZmFpbGVkOiAiCisJCSAgICAgICAiMHgleCAtIDB4JXhcbiIsIHJldHVybl92YWx1ZS5lcnJvcl9jb2RlLAorCQkgICAgICAgcmV0dXJuX3ZhbHVlLmVjX3JldHVybl92YWx1ZSk7CisJZWxzZQorCQlwcmludGsoQUNFUl9JTkZPICJFbmFibGVkIEVDIHJhdyBtb2RlIik7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGFjZXJfd21pX2VuYWJsZV9sbSh2b2lkKQoreworCXN0cnVjdCBsbV9yZXR1cm5fdmFsdWUgcmV0dXJuX3ZhbHVlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgbG1faW5wdXRfcGFyYW1zIHBhcmFtcyA9IHsKKwkJLmZ1bmN0aW9uX251bSA9IDB4MSwKKwkJLmNvbW11bl9kZXZpY2VzID0gMHhGRkZGLAorCQkuZGV2aWNlcyA9IDB4RkZGRiwKKwkJLmxtX3N0YXR1cyA9IDB4MDEsICAgICAgICAgICAgLyogTGF1bmNoIE1hbmFnZXIgQWN0aXZlICovCisJfTsKKworCXN0YXR1cyA9IHdtaWQzX3NldF9sbV9tb2RlKCZwYXJhbXMsICZyZXR1cm5fdmFsdWUpOworCisJaWYgKHJldHVybl92YWx1ZS5lcnJvcl9jb2RlIHx8IHJldHVybl92YWx1ZS5lY19yZXR1cm5fdmFsdWUpCisJCXByaW50ayhBQ0VSX1dBUk5JTkcgIkVuYWJsaW5nIExhdW5jaCBNYW5hZ2VyIGZhaWxlZDogIgorCQkgICAgICAgIjB4JXggLSAweCV4XG4iLCByZXR1cm5fdmFsdWUuZXJyb3JfY29kZSwKKwkJICAgICAgIHJldHVybl92YWx1ZS5lY19yZXR1cm5fdmFsdWUpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBfX2luaXQgYWNlcl93bWlfaW5wdXRfc2V0dXAodm9pZCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJaW50IGVycjsKKworCWFjZXJfd21pX2lucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmICghYWNlcl93bWlfaW5wdXRfZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWFjZXJfd21pX2lucHV0X2Rldi0+bmFtZSA9ICJBY2VyIFdNSSBob3RrZXlzIjsKKwlhY2VyX3dtaV9pbnB1dF9kZXYtPnBoeXMgPSAid21pL2lucHV0MCI7CisJYWNlcl93bWlfaW5wdXRfZGV2LT5pZC5idXN0eXBlID0gQlVTX0hPU1Q7CisKKwllcnIgPSBzcGFyc2Vfa2V5bWFwX3NldHVwKGFjZXJfd21pX2lucHV0X2RldiwgYWNlcl93bWlfa2V5bWFwLCBOVUxMKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9mcmVlX2RldjsKKworCXN0YXR1cyA9IHdtaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKEFDRVJXTUlEX0VWRU5UX0dVSUQsCisJCQkJCQlhY2VyX3dtaV9ub3RpZnksIE5VTEwpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQllcnIgPSAtRUlPOworCQlnb3RvIGVycl9mcmVlX2tleW1hcDsKKwl9CisKKwllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoYWNlcl93bWlfaW5wdXRfZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl91bmluc3RhbGxfbm90aWZpZXI7CisKKwlyZXR1cm4gMDsKKworZXJyX3VuaW5zdGFsbF9ub3RpZmllcjoKKwl3bWlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKEFDRVJXTUlEX0VWRU5UX0dVSUQpOworZXJyX2ZyZWVfa2V5bWFwOgorCXNwYXJzZV9rZXltYXBfZnJlZShhY2VyX3dtaV9pbnB1dF9kZXYpOworZXJyX2ZyZWVfZGV2OgorCWlucHV0X2ZyZWVfZGV2aWNlKGFjZXJfd21pX2lucHV0X2Rldik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgYWNlcl93bWlfaW5wdXRfZGVzdHJveSh2b2lkKQoreworCXdtaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIoQUNFUldNSURfRVZFTlRfR1VJRCk7CisJc3BhcnNlX2tleW1hcF9mcmVlKGFjZXJfd21pX2lucHV0X2Rldik7CisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoYWNlcl93bWlfaW5wdXRfZGV2KTsKK30KKwogLyoKICAqIGRlYnVnZnMgZnVuY3Rpb25zCiAgKi8KQEAgLTEzMjcsNiArMTcxNCwyNiBAQAogCQkgICAgICAgImdlbmVyaWMgdmlkZW8gZHJpdmVyXG4iKTsKIAl9CiAKKwlpZiAod21pX2hhc19ndWlkKFdNSURfR1VJRDMpKSB7CisJCWlmIChlY19yYXdfbW9kZSkgeworCQkJaWYgKEFDUElfRkFJTFVSRShhY2VyX3dtaV9lbmFibGVfZWNfcmF3KCkpKSB7CisJCQkJcHJpbnRrKEFDRVJfRVJSICJDYW5ub3QgZW5hYmxlIEVDIHJhdyBtb2RlXG4iKTsKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCX0KKwkJfSBlbHNlIGlmIChBQ1BJX0ZBSUxVUkUoYWNlcl93bWlfZW5hYmxlX2xtKCkpKSB7CisJCQlwcmludGsoQUNFUl9FUlIgIkNhbm5vdCBlbmFibGUgTGF1bmNoIE1hbmFnZXIgbW9kZVxuIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0gZWxzZSBpZiAoZWNfcmF3X21vZGUpIHsKKwkJcHJpbnRrKEFDRVJfSU5GTyAiTm8gV01JRCBFQyByYXcgbW9kZSBlbmFibGUgbWV0aG9kXG4iKTsKKwl9CisKKwlpZiAod21pX2hhc19ndWlkKEFDRVJXTUlEX0VWRU5UX0dVSUQpKSB7CisJCWVyciA9IGFjZXJfd21pX2lucHV0X3NldHVwKCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKwogCWVyciA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYWNlcl9wbGF0Zm9ybV9kcml2ZXIpOwogCWlmIChlcnIpIHsKIAkJcHJpbnRrKEFDRVJfRVJSICJVbmFibGUgdG8gcmVnaXN0ZXIgcGxhdGZvcm0gZHJpdmVyLlxuIik7CkBAIC0xMzY4LDExICsxNzc1LDE3IEBACiBlcnJvcl9kZXZpY2VfYWxsb2M6CiAJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmFjZXJfcGxhdGZvcm1fZHJpdmVyKTsKIGVycm9yX3BsYXRmb3JtX3JlZ2lzdGVyOgorCWlmICh3bWlfaGFzX2d1aWQoQUNFUldNSURfRVZFTlRfR1VJRCkpCisJCWFjZXJfd21pX2lucHV0X2Rlc3Ryb3koKTsKKwogCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBhY2VyX3dtaV9leGl0KHZvaWQpCiB7CisJaWYgKHdtaV9oYXNfZ3VpZChBQ0VSV01JRF9FVkVOVF9HVUlEKSkKKwkJYWNlcl93bWlfaW5wdXRfZGVzdHJveSgpOworCiAJcmVtb3ZlX3N5c2ZzKGFjZXJfcGxhdGZvcm1fZGV2aWNlKTsKIAlyZW1vdmVfZGVidWdmcygpOwogCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGFjZXJfcGxhdGZvcm1fZGV2aWNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2NsYXNzbWF0ZS1sYXB0b3AuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2NsYXNzbWF0ZS1sYXB0b3AuYwppbmRleCAzNDFjYmZlLi45MTExMzU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9jbGFzc21hdGUtbGFwdG9wLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvY2xhc3NtYXRlLWxhcHRvcC5jCkBAIC01MjIsMTggKzUyMiwyMCBAQAogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAlhY3BpX2hhbmRsZSBoYW5kbGU7CiAJdW5zaWduZWQgbG9uZyBsb25nIHN0YXRlOworCWJvb2wgaXNfYmxvY2tlZDsKIAogCWhhbmRsZSA9IGRhdGE7CiAJc3RhdHVzID0gY21wY19nZXRfcmZraWxsX3dsYW4oaGFuZGxlLCAmc3RhdGUpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JaWYgKGJsb2NrZWQpCi0JCXN0YXRlICY9IH4xOwotCWVsc2UKLQkJc3RhdGUgfD0gMTsKLQlzdGF0dXMgPSBjbXBjX3NldF9yZmtpbGxfd2xhbihoYW5kbGUsIHN0YXRlKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCi0JCXJldHVybiAtRU5PREVWOworCS8qIENoZWNrIGlmIHdlIHJlYWxseSBuZWVkIHRvIGNhbGwgY21wY19zZXRfcmZraWxsX3dsYW4gKi8KKwlpc19ibG9ja2VkID0gc3RhdGUgJiAxID8gZmFsc2UgOiB0cnVlOworCWlmIChpc19ibG9ja2VkICE9IGJsb2NrZWQpIHsKKwkJc3RhdGUgPSBibG9ja2VkID8gMCA6IDE7CisJCXN0YXR1cyA9IGNtcGNfc2V0X3Jma2lsbF93bGFuKGhhbmRsZSwgc3RhdGUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTY1Myw4ICs2NTUsOSBAQAogCiAJaWYgKChldmVudCAmIDB4MEYpIDwgQVJSQVlfU0laRShjbXBjX2tleXNfY29kZXMpKQogCQljb2RlID0gY21wY19rZXlzX2NvZGVzW2V2ZW50ICYgMHgwRl07Ci0JaW5wdXRkZXYgPSBkZXZfZ2V0X2RydmRhdGEoJmRldi0+ZGV2KTs7CisJaW5wdXRkZXYgPSBkZXZfZ2V0X2RydmRhdGEoJmRldi0+ZGV2KTsKIAlpbnB1dF9yZXBvcnRfa2V5KGlucHV0ZGV2LCBjb2RlLCAhKGV2ZW50ICYgMHgxMCkpOworCWlucHV0X3N5bmMoaW5wdXRkZXYpOwogfQogCiBzdGF0aWMgdm9pZCBjbXBjX2tleXNfaWRldl9pbml0KHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0ZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvY29tcGFsLWxhcHRvcC5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvY29tcGFsLWxhcHRvcC5jCmluZGV4IDA5NzA4M2MuLjAzNDU3MmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2NvbXBhbC1sYXB0b3AuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9jb21wYWwtbGFwdG9wLmMKQEAgLTg3Miw2ICs4NzIsMTQgQEAKIAkJfSwKIAkJLmNhbGxiYWNrID0gZG1pX2NoZWNrX2NiX2V4dHJhCiAJfSwKKwl7CisJCS5pZGVudCA9ICJLSExCMiIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiS0hMQjIiKSwKKwkJCURNSV9NQVRDSChETUlfQk9BUkRfVkVSU0lPTiwgIlJFRkVSRU5DRSIpLAorCQl9LAorCQkuY2FsbGJhY2sgPSBkbWlfY2hlY2tfY2JfZXh0cmEKKwl9LAogCXsgfQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvZWVlcGMtbGFwdG9wLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9lZWVwYy1sYXB0b3AuYwppbmRleCBiMmVkZmRjLi5lOWZjNTMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9lZWVwYy1sYXB0b3AuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9lZWVwYy1sYXB0b3AuYwpAQCAtNTI5LDYgKzUyOSwxNSBAQAogCXF1ZXVlX3dvcmsoZWVlcGMtPmxlZF93b3JrcXVldWUsICZlZWVwYy0+dHBkX2xlZF93b3JrKTsKIH0KIAorc3RhdGljIGVudW0gbGVkX2JyaWdodG5lc3MgdHBkX2xlZF9nZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYpCit7CisJc3RydWN0IGVlZXBjX2xhcHRvcCAqZWVlcGM7CisKKwllZWVwYyA9IGNvbnRhaW5lcl9vZihsZWRfY2Rldiwgc3RydWN0IGVlZXBjX2xhcHRvcCwgdHBkX2xlZCk7CisKKwlyZXR1cm4gZ2V0X2FjcGkoZWVlcGMsIENNX0FTTF9UUEQpOworfQorCiBzdGF0aWMgaW50IGVlZXBjX2xlZF9pbml0KHN0cnVjdCBlZWVwY19sYXB0b3AgKmVlZXBjKQogewogCWludCBydjsKQEAgLTU0Myw2ICs1NTIsOCBAQAogCiAJZWVlcGMtPnRwZF9sZWQubmFtZSA9ICJlZWVwYzo6dG91Y2hwYWQiOwogCWVlZXBjLT50cGRfbGVkLmJyaWdodG5lc3Nfc2V0ID0gdHBkX2xlZF9zZXQ7CisJaWYgKGdldF9hY3BpKGVlZXBjLCBDTV9BU0xfVFBEKSA+PSAwKSAvKiBpZiBtZXRob2QgaXMgYXZhaWxhYmxlICovCisJICBlZWVwYy0+dHBkX2xlZC5icmlnaHRuZXNzX2dldCA9IHRwZF9sZWRfZ2V0OwogCWVlZXBjLT50cGRfbGVkLm1heF9icmlnaHRuZXNzID0gMTsKIAogCXJ2ID0gbGVkX2NsYXNzZGV2X3JlZ2lzdGVyKCZlZWVwYy0+cGxhdGZvcm1fZGV2aWNlLT5kZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9lZWVwYy13bWkuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2VlZXBjLXdtaS5jCmluZGV4IDBkNTBmYmIuLjRkMzhmOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2VlZXBjLXdtaS5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2VlZXBjLXdtaS5jCkBAIC0yLDYgKzIsNyBAQAogICogRWVlIFBDIFdNSSBob3RrZXkgZHJpdmVyCiAgKgogICogQ29weXJpZ2h0KEMpIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24uCisgKiBDb3B5cmlnaHQoQykgMjAxMCBDb3JlbnRpbiBDaGFyeSA8Y29yZW50aW4uY2hhcnlAZ21haWwuY29tPgogICoKICAqIFBvcnRpb25zIGJhc2VkIG9uIHdpc3Ryb25fYnRucy5jOgogICogQ29weXJpZ2h0IChDKSAyMDA1IE1pbG9zbGF2IFRybWFjIDxtaXRyQHZvbG55LmN6PgpAQCAtMzQsNiArMzUsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC9zcGFyc2Uta2V5bWFwLmg+CiAjaW5jbHVkZSA8bGludXgvZmIuaD4KICNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KKyNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CisjaW5jbHVkZSA8bGludXgvcmZraWxsLmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CkBAIC00NCw2ICs0OSw4IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIkVlZSBQQyBXTUkgSG90a2V5IERyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCisjZGVmaW5lIEVFRVBDX0FDUElfSElECQkiQVNVUzAxMCIgLyogb2xkIF9ISUQgdXNlZCBpbiBlZWVwYy1sYXB0b3AgKi8KKwogI2RlZmluZSBFRUVQQ19XTUlfRVZFTlRfR1VJRAkiQUJCQzBGNzItOEVBMS0xMUQxLTAwQTAtQzkwNjI5MTAwMDAwIgogI2RlZmluZSBFRUVQQ19XTUlfTUdNVF9HVUlECSI5Nzg0NUVEMC00RTZELTExREUtOEEzOS0wODAwMjAwQzlBNjYiCiAKQEAgLTYwLDYgKzY3LDEwIEBACiAjZGVmaW5lIEVFRVBDX1dNSV9NRVRIT0RJRF9DRlZTCTB4NTM1NjQ2NDMKIAogI2RlZmluZSBFRUVQQ19XTUlfREVWSURfQkFDS0xJR0hUCTB4MDAwNTAwMTIKKyNkZWZpbmUgRUVFUENfV01JX0RFVklEX1RQRExFRAkJMHgwMDEwMDAxMQorI2RlZmluZSBFRUVQQ19XTUlfREVWSURfV0xBTgkJMHgwMDAxMDAxMQorI2RlZmluZSBFRUVQQ19XTUlfREVWSURfQkxVRVRPT1RICTB4MDAwMTAwMTMKKyNkZWZpbmUgRUVFUENfV01JX0RFVklEX1dXQU4zRwkJMHgwMDAxMDAxOQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGtleV9lbnRyeSBlZWVwY193bWlfa2V5bWFwW10gPSB7CiAJLyogU2xlZXAgYWxyZWFkeSBoYW5kbGVkIHZpYSBnZW5lcmljIEFDUEkgY29kZSAqLwpAQCAtODMsMTEgKzk0LDM3IEBACiAJdTMyCWN0cmxfcGFyYW07CiB9OwogCisvKgorICogZWVlcGMtd21pLyAgICAtIGRlYnVnZnMgcm9vdCBkaXJlY3RvcnkKKyAqICAgZGV2X2lkICAgICAgLSBjdXJyZW50IGRldl9pZAorICogICBjdHJsX3BhcmFtICAtIGN1cnJlbnQgY3RybF9wYXJhbQorICogICBkZXZzICAgICAgICAtIGNhbGwgREVWUyhkZXZfaWQsIGN0cmxfcGFyYW0pIGFuZCBwcmludCByZXN1bHQKKyAqICAgZHN0cyAgICAgICAgLSBjYWxsIERTVFMoZGV2X2lkKSAgYW5kIHByaW50IHJlc3VsdAorICovCitzdHJ1Y3QgZWVlcGNfd21pX2RlYnVnIHsKKwlzdHJ1Y3QgZGVudHJ5ICpyb290OworCXUzMiBkZXZfaWQ7CisJdTMyIGN0cmxfcGFyYW07Cit9OworCiBzdHJ1Y3QgZWVlcGNfd21pIHsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dGRldjsKIAlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmFja2xpZ2h0X2RldmljZTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9kZXZpY2U7CisKKwlzdHJ1Y3QgbGVkX2NsYXNzZGV2IHRwZF9sZWQ7CisJaW50IHRwZF9sZWRfd2s7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmxlZF93b3JrcXVldWU7CisJc3RydWN0IHdvcmtfc3RydWN0IHRwZF9sZWRfd29yazsKKworCXN0cnVjdCByZmtpbGwgKndsYW5fcmZraWxsOworCXN0cnVjdCByZmtpbGwgKmJsdWV0b290aF9yZmtpbGw7CisJc3RydWN0IHJma2lsbCAqd3dhbjNnX3Jma2lsbDsKKworCXN0cnVjdCBlZWVwY193bWlfZGVidWcgZGVidWc7CiB9OwogCisvKiBPbmx5IHVzZWQgaW4gZWVlcGNfd21pX2luaXQoKSBhbmQgZWVlcGNfd21pX2V4aXQoKSAqLwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsYXRmb3JtX2RldmljZTsKIAogc3RhdGljIGludCBlZWVwY193bWlfaW5wdXRfaW5pdChzdHJ1Y3QgZWVlcGNfd21pICplZWVwYykKQEAgLTEwMSw3ICsxMzgsNyBAQAogCWVlZXBjLT5pbnB1dGRldi0+bmFtZSA9ICJFZWUgUEMgV01JIGhvdGtleXMiOwogCWVlZXBjLT5pbnB1dGRldi0+cGh5cyA9IEVFRVBDX1dNSV9GSUxFICIvaW5wdXQwIjsKIAllZWVwYy0+aW5wdXRkZXYtPmlkLmJ1c3R5cGUgPSBCVVNfSE9TVDsKLQllZWVwYy0+aW5wdXRkZXYtPmRldi5wYXJlbnQgPSAmcGxhdGZvcm1fZGV2aWNlLT5kZXY7CisJZWVlcGMtPmlucHV0ZGV2LT5kZXYucGFyZW50ID0gJmVlZXBjLT5wbGF0Zm9ybV9kZXZpY2UtPmRldjsKIAogCWVyciA9IHNwYXJzZV9rZXltYXBfc2V0dXAoZWVlcGMtPmlucHV0ZGV2LCBlZWVwY193bWlfa2V5bWFwLCBOVUxMKTsKIAlpZiAoZXJyKQpAQCAtMTMwLDcgKzE2Nyw3IEBACiAJZWVlcGMtPmlucHV0ZGV2ID0gTlVMTDsKIH0KIAotc3RhdGljIGFjcGlfc3RhdHVzIGVlZXBjX3dtaV9nZXRfZGV2c3RhdGUodTMyIGRldl9pZCwgdTMyICpjdHJsX3BhcmFtKQorc3RhdGljIGFjcGlfc3RhdHVzIGVlZXBjX3dtaV9nZXRfZGV2c3RhdGUodTMyIGRldl9pZCwgdTMyICpyZXR2YWwpCiB7CiAJc3RydWN0IGFjcGlfYnVmZmVyIGlucHV0ID0geyAoYWNwaV9zaXplKXNpemVvZih1MzIpLCAmZGV2X2lkIH07CiAJc3RydWN0IGFjcGlfYnVmZmVyIG91dHB1dCA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKQEAgLTE1MCw4ICsxODcsOCBAQAogCWVsc2UKIAkJdG1wID0gMDsKIAotCWlmIChjdHJsX3BhcmFtKQotCQkqY3RybF9wYXJhbSA9IHRtcDsKKwlpZiAocmV0dmFsKQorCQkqcmV0dmFsID0gdG1wOwogCiAJa2ZyZWUob2JqKTsKIApAQCAtMTU5LDcgKzE5Niw4IEBACiAKIH0KIAotc3RhdGljIGFjcGlfc3RhdHVzIGVlZXBjX3dtaV9zZXRfZGV2c3RhdGUodTMyIGRldl9pZCwgdTMyIGN0cmxfcGFyYW0pCitzdGF0aWMgYWNwaV9zdGF0dXMgZWVlcGNfd21pX3NldF9kZXZzdGF0ZSh1MzIgZGV2X2lkLCB1MzIgY3RybF9wYXJhbSwKKwkJCQkJICB1MzIgKnJldHZhbCkKIHsKIAlzdHJ1Y3QgYmlvc19hcmdzIGFyZ3MgPSB7CiAJCS5kZXZfaWQgPSBkZXZfaWQsCkBAIC0xNjgsMzQgKzIwNiwyODEgQEAKIAlzdHJ1Y3QgYWNwaV9idWZmZXIgaW5wdXQgPSB7IChhY3BpX3NpemUpc2l6ZW9mKGFyZ3MpLCAmYXJncyB9OwogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCXN0YXR1cyA9IHdtaV9ldmFsdWF0ZV9tZXRob2QoRUVFUENfV01JX01HTVRfR1VJRCwKLQkJCTEsIEVFRVBDX1dNSV9NRVRIT0RJRF9ERVZTLCAmaW5wdXQsIE5VTEwpOworCWlmICghcmV0dmFsKSB7CisJCXN0YXR1cyA9IHdtaV9ldmFsdWF0ZV9tZXRob2QoRUVFUENfV01JX01HTVRfR1VJRCwgMSwKKwkJCQkJICAgICBFRUVQQ19XTUlfTUVUSE9ESURfREVWUywKKwkJCQkJICAgICAmaW5wdXQsIE5VTEwpOworCX0gZWxzZSB7CisJCXN0cnVjdCBhY3BpX2J1ZmZlciBvdXRwdXQgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisJCXVuaW9uIGFjcGlfb2JqZWN0ICpvYmo7CisJCXUzMiB0bXA7CisKKwkJc3RhdHVzID0gd21pX2V2YWx1YXRlX21ldGhvZChFRUVQQ19XTUlfTUdNVF9HVUlELCAxLAorCQkJCQkgICAgIEVFRVBDX1dNSV9NRVRIT0RJRF9ERVZTLAorCQkJCQkgICAgICZpbnB1dCwgJm91dHB1dCk7CisKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQkJcmV0dXJuIHN0YXR1czsKKworCQlvYmogPSAodW5pb24gYWNwaV9vYmplY3QgKilvdXRwdXQucG9pbnRlcjsKKwkJaWYgKG9iaiAmJiBvYmotPnR5cGUgPT0gQUNQSV9UWVBFX0lOVEVHRVIpCisJCQl0bXAgPSAodTMyKW9iai0+aW50ZWdlci52YWx1ZTsKKwkJZWxzZQorCQkJdG1wID0gMDsKKworCQkqcmV0dmFsID0gdG1wOworCisJCWtmcmVlKG9iaik7CisJfQogCiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGludCByZWFkX2JyaWdodG5lc3Moc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQorLyoKKyAqIExFRHMKKyAqLworLyoKKyAqIFRoZXNlIGZ1bmN0aW9ucyBhY3R1YWxseSB1cGRhdGUgdGhlIExFRCdzLCBhbmQgYXJlIGNhbGxlZCBmcm9tIGEKKyAqIHdvcmtxdWV1ZS4gQnkgZG9pbmcgdGhpcyBhcyBzZXBhcmF0ZSB3b3JrIHJhdGhlciB0aGFuIHdoZW4gdGhlIExFRAorICogc3Vic3lzdGVtIGFza3MsIHdlIGF2b2lkIG1lc3Npbmcgd2l0aCB0aGUgRWVlcGMgQUNQSSBzdHVmZiBkdXJpbmcgYQorICogcG90ZW50aWFsbHkgYmFkIHRpbWUsIHN1Y2ggYXMgYSB0aW1lciBpbnRlcnJ1cHQuCisgKi8KK3N0YXRpYyB2b2lkIHRwZF9sZWRfdXBkYXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdGF0aWMgdTMyIGN0cmxfcGFyYW07CisJaW50IGN0cmxfcGFyYW07CisJc3RydWN0IGVlZXBjX3dtaSAqZWVlcGM7CisKKwllZWVwYyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZWVlcGNfd21pLCB0cGRfbGVkX3dvcmspOworCisJY3RybF9wYXJhbSA9IGVlZXBjLT50cGRfbGVkX3drOworCWVlZXBjX3dtaV9zZXRfZGV2c3RhdGUoRUVFUENfV01JX0RFVklEX1RQRExFRCwgY3RybF9wYXJhbSwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIHRwZF9sZWRfc2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2LAorCQkJZW51bSBsZWRfYnJpZ2h0bmVzcyB2YWx1ZSkKK3sKKwlzdHJ1Y3QgZWVlcGNfd21pICplZWVwYzsKKworCWVlZXBjID0gY29udGFpbmVyX29mKGxlZF9jZGV2LCBzdHJ1Y3QgZWVlcGNfd21pLCB0cGRfbGVkKTsKKworCWVlZXBjLT50cGRfbGVkX3drID0gISF2YWx1ZTsKKwlxdWV1ZV93b3JrKGVlZXBjLT5sZWRfd29ya3F1ZXVlLCAmZWVlcGMtPnRwZF9sZWRfd29yayk7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF90cGRfc3RhdGUoc3RydWN0IGVlZXBjX3dtaSAqZWVlcGMpCit7CisJdTMyIHJldHZhbDsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQlzdGF0dXMgPSBlZWVwY193bWlfZ2V0X2RldnN0YXRlKEVFRVBDX1dNSV9ERVZJRF9CQUNLTElHSFQsICZjdHJsX3BhcmFtKTsKKwlzdGF0dXMgPSBlZWVwY193bWlfZ2V0X2RldnN0YXRlKEVFRVBDX1dNSV9ERVZJRF9UUERMRUQsICZyZXR2YWwpOworCisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQlyZXR1cm4gLTE7CisJZWxzZSBpZiAoIXJldHZhbCB8fCByZXR2YWwgPT0gMHgwMDA2MDAwMCkKKwkJLyoKKwkJICogaWYgdG91Y2hwYWQgbGVkIGlzIHByZXNlbnQsIERTVFMgd2lsbCBzZXQgc29tZSBiaXRzLAorCQkgKiB1c3VhbGx5IDB4MDAwMjAwMDAuCisJCSAqIDB4MDAwNjAwMDAgbWVhbnMgdGhhdCB0aGUgZGV2aWNlIGlzIG5vdCBzdXBwb3J0ZWQKKwkJICovCisJCXJldHVybiAtRU5PREVWOworCWVsc2UKKwkJLyogU3RhdHVzIGlzIHN0b3JlZCBpbiB0aGUgZmlyc3QgYml0ICovCisJCXJldHVybiByZXR2YWwgJiAweDE7Cit9CisKK3N0YXRpYyBlbnVtIGxlZF9icmlnaHRuZXNzIHRwZF9sZWRfZ2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2KQoreworCXN0cnVjdCBlZWVwY193bWkgKmVlZXBjOworCisJZWVlcGMgPSBjb250YWluZXJfb2YobGVkX2NkZXYsIHN0cnVjdCBlZWVwY193bWksIHRwZF9sZWQpOworCisJcmV0dXJuIHJlYWRfdHBkX3N0YXRlKGVlZXBjKTsKK30KKworc3RhdGljIGludCBlZWVwY193bWlfbGVkX2luaXQoc3RydWN0IGVlZXBjX3dtaSAqZWVlcGMpCit7CisJaW50IHJ2OworCisJaWYgKHJlYWRfdHBkX3N0YXRlKGVlZXBjKSA8IDApCisJCXJldHVybiAwOworCisJZWVlcGMtPmxlZF93b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgibGVkX3dvcmtxdWV1ZSIpOworCWlmICghZWVlcGMtPmxlZF93b3JrcXVldWUpCisJCXJldHVybiAtRU5PTUVNOworCUlOSVRfV09SSygmZWVlcGMtPnRwZF9sZWRfd29yaywgdHBkX2xlZF91cGRhdGUpOworCisJZWVlcGMtPnRwZF9sZWQubmFtZSA9ICJlZWVwYzo6dG91Y2hwYWQiOworCWVlZXBjLT50cGRfbGVkLmJyaWdodG5lc3Nfc2V0ID0gdHBkX2xlZF9zZXQ7CisJZWVlcGMtPnRwZF9sZWQuYnJpZ2h0bmVzc19nZXQgPSB0cGRfbGVkX2dldDsKKwllZWVwYy0+dHBkX2xlZC5tYXhfYnJpZ2h0bmVzcyA9IDE7CisKKwlydiA9IGxlZF9jbGFzc2Rldl9yZWdpc3RlcigmZWVlcGMtPnBsYXRmb3JtX2RldmljZS0+ZGV2LAorCQkJCSAgICZlZWVwYy0+dHBkX2xlZCk7CisJaWYgKHJ2KSB7CisJCWRlc3Ryb3lfd29ya3F1ZXVlKGVlZXBjLT5sZWRfd29ya3F1ZXVlKTsKKwkJcmV0dXJuIHJ2OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlZWVwY193bWlfbGVkX2V4aXQoc3RydWN0IGVlZXBjX3dtaSAqZWVlcGMpCit7CisJaWYgKGVlZXBjLT50cGRfbGVkLmRldikKKwkJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmVlZXBjLT50cGRfbGVkKTsKKwlpZiAoZWVlcGMtPmxlZF93b3JrcXVldWUpCisJCWRlc3Ryb3lfd29ya3F1ZXVlKGVlZXBjLT5sZWRfd29ya3F1ZXVlKTsKK30KKworLyoKKyAqIFJma2lsbCBkZXZpY2VzCisgKi8KK3N0YXRpYyBpbnQgZWVlcGNfcmZraWxsX3NldCh2b2lkICpkYXRhLCBib29sIGJsb2NrZWQpCit7CisJaW50IGRldl9pZCA9ICh1bnNpZ25lZCBsb25nKWRhdGE7CisJdTMyIGN0cmxfcGFyYW0gPSAhYmxvY2tlZDsKKworCXJldHVybiBlZWVwY193bWlfc2V0X2RldnN0YXRlKGRldl9pZCwgY3RybF9wYXJhbSwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIGVlZXBjX3Jma2lsbF9xdWVyeShzdHJ1Y3QgcmZraWxsICpyZmtpbGwsIHZvaWQgKmRhdGEpCit7CisJaW50IGRldl9pZCA9ICh1bnNpZ25lZCBsb25nKWRhdGE7CisJdTMyIHJldHZhbDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlzdGF0dXMgPSBlZWVwY193bWlfZ2V0X2RldnN0YXRlKGRldl9pZCwgJnJldHZhbCk7CisKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCXJldHVybiA7CisKKwlyZmtpbGxfc2V0X3N3X3N0YXRlKHJma2lsbCwgIShyZXR2YWwgJiAweDEpKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCByZmtpbGxfb3BzIGVlZXBjX3Jma2lsbF9vcHMgPSB7CisJLnNldF9ibG9jayA9IGVlZXBjX3Jma2lsbF9zZXQsCisJLnF1ZXJ5ID0gZWVlcGNfcmZraWxsX3F1ZXJ5LAorfTsKKworc3RhdGljIGludCBlZWVwY19uZXdfcmZraWxsKHN0cnVjdCBlZWVwY193bWkgKmVlZXBjLAorCQkJICAgIHN0cnVjdCByZmtpbGwgKipyZmtpbGwsCisJCQkgICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgICBlbnVtIHJma2lsbF90eXBlIHR5cGUsIGludCBkZXZfaWQpCit7CisJaW50IHJlc3VsdDsKKwl1MzIgcmV0dmFsOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCXN0YXR1cyA9IGVlZXBjX3dtaV9nZXRfZGV2c3RhdGUoZGV2X2lkLCAmcmV0dmFsKTsKKworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJcmV0dXJuIC0xOworCisJLyogSWYgdGhlIGRldmljZSBpcyBwcmVzZW50LCBEU1RTIHdpbGwgYWx3YXlzIHNldCBzb21lIGJpdHMKKwkgKiAweDAwMDcwMDAwIC0gMTExMDAwMDAwMDAwMDAwMDAwMCAtIGRldmljZSBzdXBwb3J0ZWQKKwkgKiAweDAwMDYwMDAwIC0gMTEwMDAwMDAwMDAwMDAwMDAwMCAtIG5vdCBzdXBwb3J0ZWQKKwkgKiAweDAwMDIwMDAwIC0gMDEwMDAwMDAwMDAwMDAwMDAwMCAtIGRldmljZSBzdXBwb3J0ZWQKKwkgKiAweDAwMDEwMDAwIC0gMDAxMDAwMDAwMDAwMDAwMDAwMCAtIG5vdCBzdXBwb3J0ZWQgLyBzcGVjaWFsIG1vZGUgPworCSAqLworCWlmICghcmV0dmFsIHx8IHJldHZhbCA9PSAweDAwMDYwMDAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCSpyZmtpbGwgPSByZmtpbGxfYWxsb2MobmFtZSwgJmVlZXBjLT5wbGF0Zm9ybV9kZXZpY2UtPmRldiwgdHlwZSwKKwkJCSAgICAgICAmZWVlcGNfcmZraWxsX29wcywgKHZvaWQgKikobG9uZylkZXZfaWQpOworCisJaWYgKCEqcmZraWxsKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJma2lsbF9pbml0X3N3X3N0YXRlKCpyZmtpbGwsICEocmV0dmFsICYgMHgxKSk7CisJcmVzdWx0ID0gcmZraWxsX3JlZ2lzdGVyKCpyZmtpbGwpOworCWlmIChyZXN1bHQpIHsKKwkJcmZraWxsX2Rlc3Ryb3koKnJma2lsbCk7CisJCSpyZmtpbGwgPSBOVUxMOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZWVlcGNfd21pX3Jma2lsbF9leGl0KHN0cnVjdCBlZWVwY193bWkgKmVlZXBjKQoreworCWlmIChlZWVwYy0+d2xhbl9yZmtpbGwpIHsKKwkJcmZraWxsX3VucmVnaXN0ZXIoZWVlcGMtPndsYW5fcmZraWxsKTsKKwkJcmZraWxsX2Rlc3Ryb3koZWVlcGMtPndsYW5fcmZraWxsKTsKKwkJZWVlcGMtPndsYW5fcmZraWxsID0gTlVMTDsKKwl9CisJaWYgKGVlZXBjLT5ibHVldG9vdGhfcmZraWxsKSB7CisJCXJma2lsbF91bnJlZ2lzdGVyKGVlZXBjLT5ibHVldG9vdGhfcmZraWxsKTsKKwkJcmZraWxsX2Rlc3Ryb3koZWVlcGMtPmJsdWV0b290aF9yZmtpbGwpOworCQllZWVwYy0+Ymx1ZXRvb3RoX3Jma2lsbCA9IE5VTEw7CisJfQorCWlmIChlZWVwYy0+d3dhbjNnX3Jma2lsbCkgeworCQlyZmtpbGxfdW5yZWdpc3RlcihlZWVwYy0+d3dhbjNnX3Jma2lsbCk7CisJCXJma2lsbF9kZXN0cm95KGVlZXBjLT53d2FuM2dfcmZraWxsKTsKKwkJZWVlcGMtPnd3YW4zZ19yZmtpbGwgPSBOVUxMOworCX0KK30KKworc3RhdGljIGludCBlZWVwY193bWlfcmZraWxsX2luaXQoc3RydWN0IGVlZXBjX3dtaSAqZWVlcGMpCit7CisJaW50IHJlc3VsdCA9IDA7CisKKwlyZXN1bHQgPSBlZWVwY19uZXdfcmZraWxsKGVlZXBjLCAmZWVlcGMtPndsYW5fcmZraWxsLAorCQkJCSAgImVlZXBjLXdsYW4iLCBSRktJTExfVFlQRV9XTEFOLAorCQkJCSAgRUVFUENfV01JX0RFVklEX1dMQU4pOworCisJaWYgKHJlc3VsdCAmJiByZXN1bHQgIT0gLUVOT0RFVikKKwkJZ290byBleGl0OworCisJcmVzdWx0ID0gZWVlcGNfbmV3X3Jma2lsbChlZWVwYywgJmVlZXBjLT5ibHVldG9vdGhfcmZraWxsLAorCQkJCSAgImVlZXBjLWJsdWV0b290aCIsIFJGS0lMTF9UWVBFX0JMVUVUT09USCwKKwkJCQkgIEVFRVBDX1dNSV9ERVZJRF9CTFVFVE9PVEgpOworCisJaWYgKHJlc3VsdCAmJiByZXN1bHQgIT0gLUVOT0RFVikKKwkJZ290byBleGl0OworCisJcmVzdWx0ID0gZWVlcGNfbmV3X3Jma2lsbChlZWVwYywgJmVlZXBjLT53d2FuM2dfcmZraWxsLAorCQkJCSAgImVlZXBjLXd3YW4zZyIsIFJGS0lMTF9UWVBFX1dXQU4sCisJCQkJICBFRUVQQ19XTUlfREVWSURfV1dBTjNHKTsKKworCWlmIChyZXN1bHQgJiYgcmVzdWx0ICE9IC1FTk9ERVYpCisJCWdvdG8gZXhpdDsKKworZXhpdDoKKwlpZiAocmVzdWx0ICYmIHJlc3VsdCAhPSAtRU5PREVWKQorCQllZWVwY193bWlfcmZraWxsX2V4aXQoZWVlcGMpOworCisJaWYgKHJlc3VsdCA9PSAtRU5PREVWKQorCQlyZXN1bHQgPSAwOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIEJhY2tsaWdodAorICovCitzdGF0aWMgaW50IHJlYWRfYnJpZ2h0bmVzcyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCit7CisJdTMyIHJldHZhbDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlzdGF0dXMgPSBlZWVwY193bWlfZ2V0X2RldnN0YXRlKEVFRVBDX1dNSV9ERVZJRF9CQUNLTElHSFQsICZyZXR2YWwpOwogCiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQlyZXR1cm4gLTE7CiAJZWxzZQotCQlyZXR1cm4gY3RybF9wYXJhbSAmIDB4RkY7CisJCXJldHVybiByZXR2YWwgJiAweEZGOwogfQogCiBzdGF0aWMgaW50IHVwZGF0ZV9ibF9zdGF0dXMoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQogewogCi0Jc3RhdGljIHUzMiBjdHJsX3BhcmFtOworCXUzMiBjdHJsX3BhcmFtOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAogCWN0cmxfcGFyYW0gPSBiZC0+cHJvcHMuYnJpZ2h0bmVzczsKIAotCXN0YXR1cyA9IGVlZXBjX3dtaV9zZXRfZGV2c3RhdGUoRUVFUENfV01JX0RFVklEX0JBQ0tMSUdIVCwgY3RybF9wYXJhbSk7CisJc3RhdHVzID0gZWVlcGNfd21pX3NldF9kZXZzdGF0ZShFRUVQQ19XTUlfREVWSURfQkFDS0xJR0hULAorCQkJCQljdHJsX3BhcmFtLCBOVUxMKTsKIAogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJcmV0dXJuIC0xOwpAQCAtMjM0LDcgKzUxOSw3IEBACiAJbWVtc2V0KCZwcm9wcywgMCwgc2l6ZW9mKHN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcykpOwogCXByb3BzLm1heF9icmlnaHRuZXNzID0gMTU7CiAJYmQgPSBiYWNrbGlnaHRfZGV2aWNlX3JlZ2lzdGVyKEVFRVBDX1dNSV9GSUxFLAotCQkJCSAgICAgICAmcGxhdGZvcm1fZGV2aWNlLT5kZXYsIGVlZXBjLAorCQkJCSAgICAgICAmZWVlcGMtPnBsYXRmb3JtX2RldmljZS0+ZGV2LCBlZWVwYywKIAkJCQkgICAgICAgJmVlZXBjX3dtaV9ibF9vcHMsICZwcm9wcyk7CiAJaWYgKElTX0VSUihiZCkpIHsKIAkJcHJfZXJyKCJDb3VsZCBub3QgcmVnaXN0ZXIgYmFja2xpZ2h0IGRldmljZVxuIik7CkBAIC0zMjEsNjUgKzYwNiwyNDAgQEAKIAogc3RhdGljIERFVklDRV9BVFRSKGNwdWZ2LCBTX0lSVUdPIHwgU19JV1VTUiwgTlVMTCwgc3RvcmVfY3B1ZnYpOwogCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqcGxhdGZvcm1fYXR0cmlidXRlc1tdID0geworCSZkZXZfYXR0cl9jcHVmdi5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHBsYXRmb3JtX2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBwbGF0Zm9ybV9hdHRyaWJ1dGVzCit9OworCiBzdGF0aWMgdm9pZCBlZWVwY193bWlfc3lzZnNfZXhpdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2UpCiB7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZkZXZpY2UtPmRldiwgJmRldl9hdHRyX2NwdWZ2KTsKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmRldmljZS0+ZGV2LmtvYmosICZwbGF0Zm9ybV9hdHRyaWJ1dGVfZ3JvdXApOwogfQogCiBzdGF0aWMgaW50IGVlZXBjX3dtaV9zeXNmc19pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZSkKIHsKLQlpbnQgcmV0dmFsID0gLUVOT01FTTsKLQotCXJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZSgmZGV2aWNlLT5kZXYsICZkZXZfYXR0cl9jcHVmdik7Ci0JaWYgKHJldHZhbCkKLQkJZ290byBlcnJvcl9zeXNmczsKLQotCXJldHVybiAwOwotCi1lcnJvcl9zeXNmczoKLQllZWVwY193bWlfc3lzZnNfZXhpdChwbGF0Zm9ybV9kZXZpY2UpOwotCXJldHVybiByZXR2YWw7CisJcmV0dXJuIHN5c2ZzX2NyZWF0ZV9ncm91cCgmZGV2aWNlLT5kZXYua29iaiwgJnBsYXRmb3JtX2F0dHJpYnV0ZV9ncm91cCk7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IGVlZXBjX3dtaV9wbGF0Zm9ybV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2UpCisvKgorICogUGxhdGZvcm0gZGV2aWNlCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGVlZXBjX3dtaV9wbGF0Zm9ybV9pbml0KHN0cnVjdCBlZWVwY193bWkgKmVlZXBjKQogewotCXN0cnVjdCBlZWVwY193bWkgKmVlZXBjOwogCWludCBlcnI7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0JZWVlcGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXZpY2UpOworCWVlZXBjLT5wbGF0Zm9ybV9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoRUVFUENfV01JX0ZJTEUsIC0xKTsKKwlpZiAoIWVlZXBjLT5wbGF0Zm9ybV9kZXZpY2UpCisJCXJldHVybiAtRU5PTUVNOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKGVlZXBjLT5wbGF0Zm9ybV9kZXZpY2UsIGVlZXBjKTsKIAotCWVyciA9IGVlZXBjX3dtaV9pbnB1dF9pbml0KGVlZXBjKTsKKwllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKGVlZXBjLT5wbGF0Zm9ybV9kZXZpY2UpOwogCWlmIChlcnIpCi0JCWdvdG8gZXJyb3JfaW5wdXQ7CisJCWdvdG8gZmFpbF9wbGF0Zm9ybV9kZXZpY2U7CiAKLQlpZiAoIWFjcGlfdmlkZW9fYmFja2xpZ2h0X3N1cHBvcnQoKSkgewotCQllcnIgPSBlZWVwY193bWlfYmFja2xpZ2h0X2luaXQoZWVlcGMpOwotCQlpZiAoZXJyKQotCQkJZ290byBlcnJvcl9iYWNrbGlnaHQ7Ci0JfSBlbHNlCi0JCXByX2luZm8oIkJhY2tsaWdodCBjb250cm9sbGVkIGJ5IEFDUEkgdmlkZW8gZHJpdmVyXG4iKTsKKwllcnIgPSBlZWVwY193bWlfc3lzZnNfaW5pdChlZWVwYy0+cGxhdGZvcm1fZGV2aWNlKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWxfc3lzZnM7CisJcmV0dXJuIDA7CiAKLQlzdGF0dXMgPSB3bWlfaW5zdGFsbF9ub3RpZnlfaGFuZGxlcihFRUVQQ19XTUlfRVZFTlRfR1VJRCwKLQkJCQkJZWVlcGNfd21pX25vdGlmeSwgZWVlcGMpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlwcl9lcnIoIlVuYWJsZSB0byByZWdpc3RlciBub3RpZnkgaGFuZGxlciAtICVkXG4iLAotCQkJc3RhdHVzKTsKLQkJZXJyID0gLUVOT0RFVjsKLQkJZ290byBlcnJvcl93bWk7CitmYWlsX3N5c2ZzOgorCXBsYXRmb3JtX2RldmljZV9kZWwoZWVlcGMtPnBsYXRmb3JtX2RldmljZSk7CitmYWlsX3BsYXRmb3JtX2RldmljZToKKwlwbGF0Zm9ybV9kZXZpY2VfcHV0KGVlZXBjLT5wbGF0Zm9ybV9kZXZpY2UpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGVlZXBjX3dtaV9wbGF0Zm9ybV9leGl0KHN0cnVjdCBlZWVwY193bWkgKmVlZXBjKQoreworCWVlZXBjX3dtaV9zeXNmc19leGl0KGVlZXBjLT5wbGF0Zm9ybV9kZXZpY2UpOworCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGVlZXBjLT5wbGF0Zm9ybV9kZXZpY2UpOworfQorCisvKgorICogZGVidWdmcworICovCitzdHJ1Y3QgZWVlcGNfd21pX2RlYnVnZnNfbm9kZSB7CisJc3RydWN0IGVlZXBjX3dtaSAqZWVlcGM7CisJY2hhciAqbmFtZTsKKwlpbnQgKCpzaG93KShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKmRhdGEpOworfTsKKworc3RhdGljIGludCBzaG93X2RzdHMoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBlZWVwY193bWkgKmVlZXBjID0gbS0+cHJpdmF0ZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdTMyIHJldHZhbCA9IC0xOworCisJc3RhdHVzID0gZWVlcGNfd21pX2dldF9kZXZzdGF0ZShlZWVwYy0+ZGVidWcuZGV2X2lkLCAmcmV0dmFsKTsKKworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJcmV0dXJuIC1FSU87CisKKwlzZXFfcHJpbnRmKG0sICJEU1RTKCV4KSA9ICV4XG4iLCBlZWVwYy0+ZGVidWcuZGV2X2lkLCByZXR2YWwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2hvd19kZXZzKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZWVlcGNfd21pICplZWVwYyA9IG0tPnByaXZhdGU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXUzMiByZXR2YWwgPSAtMTsKKworCXN0YXR1cyA9IGVlZXBjX3dtaV9zZXRfZGV2c3RhdGUoZWVlcGMtPmRlYnVnLmRldl9pZCwKKwkJCQkJZWVlcGMtPmRlYnVnLmN0cmxfcGFyYW0sICZyZXR2YWwpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJcmV0dXJuIC1FSU87CisKKwlzZXFfcHJpbnRmKG0sICJERVZTKCV4LCAleCkgPSAleFxuIiwgZWVlcGMtPmRlYnVnLmRldl9pZCwKKwkJICAgZWVlcGMtPmRlYnVnLmN0cmxfcGFyYW0sIHJldHZhbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBlZWVwY193bWlfZGVidWdmc19ub2RlIGVlZXBjX3dtaV9kZWJ1Z19maWxlc1tdID0geworCXsgTlVMTCwgImRldnMiLCBzaG93X2RldnMgfSwKKwl7IE5VTEwsICJkc3RzIiwgc2hvd19kc3RzIH0sCit9OworCitzdGF0aWMgaW50IGVlZXBjX3dtaV9kZWJ1Z2ZzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGVlZXBjX3dtaV9kZWJ1Z2ZzX25vZGUgKm5vZGUgPSBpbm9kZS0+aV9wcml2YXRlOworCisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIG5vZGUtPnNob3csIG5vZGUtPmVlZXBjKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZWVlcGNfd21pX2RlYnVnZnNfaW9fb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuICA9IGVlZXBjX3dtaV9kZWJ1Z2ZzX29wZW4sCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgdm9pZCBlZWVwY193bWlfZGVidWdmc19leGl0KHN0cnVjdCBlZWVwY193bWkgKmVlZXBjKQoreworCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShlZWVwYy0+ZGVidWcucm9vdCk7Cit9CisKK3N0YXRpYyBpbnQgZWVlcGNfd21pX2RlYnVnZnNfaW5pdChzdHJ1Y3QgZWVlcGNfd21pICplZWVwYykKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50OworCWludCBpOworCisJZWVlcGMtPmRlYnVnLnJvb3QgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoRUVFUENfV01JX0ZJTEUsIE5VTEwpOworCWlmICghZWVlcGMtPmRlYnVnLnJvb3QpIHsKKwkJcHJfZXJyKCJmYWlsZWQgdG8gY3JlYXRlIGRlYnVnZnMgZGlyZWN0b3J5Iik7CisJCWdvdG8gZXJyb3JfZGVidWdmczsKKwl9CisKKwlkZW50ID0gZGVidWdmc19jcmVhdGVfeDMyKCJkZXZfaWQiLCBTX0lSVUdPfFNfSVdVU1IsCisJCQkJICBlZWVwYy0+ZGVidWcucm9vdCwgJmVlZXBjLT5kZWJ1Zy5kZXZfaWQpOworCWlmICghZGVudCkKKwkJZ290byBlcnJvcl9kZWJ1Z2ZzOworCisJZGVudCA9IGRlYnVnZnNfY3JlYXRlX3gzMigiY3RybF9wYXJhbSIsIFNfSVJVR098U19JV1VTUiwKKwkJCQkgIGVlZXBjLT5kZWJ1Zy5yb290LCAmZWVlcGMtPmRlYnVnLmN0cmxfcGFyYW0pOworCWlmICghZGVudCkKKwkJZ290byBlcnJvcl9kZWJ1Z2ZzOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZWVlcGNfd21pX2RlYnVnX2ZpbGVzKTsgaSsrKSB7CisJCXN0cnVjdCBlZWVwY193bWlfZGVidWdmc19ub2RlICpub2RlID0gJmVlZXBjX3dtaV9kZWJ1Z19maWxlc1tpXTsKKworCQlub2RlLT5lZWVwYyA9IGVlZXBjOworCQlkZW50ID0gZGVidWdmc19jcmVhdGVfZmlsZShub2RlLT5uYW1lLCBTX0lGUkVHIHwgU19JUlVHTywKKwkJCQkJICAgZWVlcGMtPmRlYnVnLnJvb3QsIG5vZGUsCisJCQkJCSAgICZlZWVwY193bWlfZGVidWdmc19pb19vcHMpOworCQlpZiAoIWRlbnQpIHsKKwkJCXByX2VycigiZmFpbGVkIHRvIGNyZWF0ZSBkZWJ1ZyBmaWxlOiAlc1xuIiwgbm9kZS0+bmFtZSk7CisJCQlnb3RvIGVycm9yX2RlYnVnZnM7CisJCX0KIAl9CiAKIAlyZXR1cm4gMDsKIAotZXJyb3Jfd21pOgotCWVlZXBjX3dtaV9iYWNrbGlnaHRfZXhpdChlZWVwYyk7Ci1lcnJvcl9iYWNrbGlnaHQ6Ci0JZWVlcGNfd21pX2lucHV0X2V4aXQoZWVlcGMpOwotZXJyb3JfaW5wdXQ6Ci0JcmV0dXJuIGVycjsKK2Vycm9yX2RlYnVnZnM6CisJZWVlcGNfd21pX2RlYnVnZnNfZXhpdChlZWVwYyk7CisJcmV0dXJuIC1FTk9NRU07CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZleGl0IGVlZXBjX3dtaV9wbGF0Zm9ybV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlKQorLyoKKyAqIFdNSSBEcml2ZXIKKyAqLworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKiBfX2luaXQgZWVlcGNfd21pX2FkZCh2b2lkKQoreworCXN0cnVjdCBlZWVwY193bWkgKmVlZXBjOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlpbnQgZXJyOworCisJZWVlcGMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZWVlcGNfd21pKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlZWVwYykKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwkvKgorCSAqIFJlZ2lzdGVyIHRoZSBwbGF0Zm9ybSBkZXZpY2UgZmlyc3QuICBJdCBpcyB1c2VkIGFzIGEgcGFyZW50IGZvciB0aGUKKwkgKiBzdWItZGV2aWNlcyBiZWxvdy4KKwkgKi8KKwllcnIgPSBlZWVwY193bWlfcGxhdGZvcm1faW5pdChlZWVwYyk7CisJaWYgKGVycikKKwkJZ290byBmYWlsX3BsYXRmb3JtOworCisJZXJyID0gZWVlcGNfd21pX2lucHV0X2luaXQoZWVlcGMpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbF9pbnB1dDsKKworCWVyciA9IGVlZXBjX3dtaV9sZWRfaW5pdChlZWVwYyk7CisJaWYgKGVycikKKwkJZ290byBmYWlsX2xlZHM7CisKKwllcnIgPSBlZWVwY193bWlfcmZraWxsX2luaXQoZWVlcGMpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbF9yZmtpbGw7CisKKwlpZiAoIWFjcGlfdmlkZW9fYmFja2xpZ2h0X3N1cHBvcnQoKSkgeworCQllcnIgPSBlZWVwY193bWlfYmFja2xpZ2h0X2luaXQoZWVlcGMpOworCQlpZiAoZXJyKQorCQkJZ290byBmYWlsX2JhY2tsaWdodDsKKwl9IGVsc2UKKwkJcHJfaW5mbygiQmFja2xpZ2h0IGNvbnRyb2xsZWQgYnkgQUNQSSB2aWRlbyBkcml2ZXJcbiIpOworCisJc3RhdHVzID0gd21pX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIoRUVFUENfV01JX0VWRU5UX0dVSUQsCisJCQkJCSAgICBlZWVwY193bWlfbm90aWZ5LCBlZWVwYyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXByX2VycigiVW5hYmxlIHRvIHJlZ2lzdGVyIG5vdGlmeSBoYW5kbGVyIC0gJWRcbiIsCisJCQlzdGF0dXMpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGZhaWxfd21pX2hhbmRsZXI7CisJfQorCisJZXJyID0gZWVlcGNfd21pX2RlYnVnZnNfaW5pdChlZWVwYyk7CisJaWYgKGVycikKKwkJZ290byBmYWlsX2RlYnVnZnM7CisKKwlyZXR1cm4gZWVlcGMtPnBsYXRmb3JtX2RldmljZTsKKworZmFpbF9kZWJ1Z2ZzOgorCXdtaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIoRUVFUENfV01JX0VWRU5UX0dVSUQpOworZmFpbF93bWlfaGFuZGxlcjoKKwllZWVwY193bWlfYmFja2xpZ2h0X2V4aXQoZWVlcGMpOworZmFpbF9iYWNrbGlnaHQ6CisJZWVlcGNfd21pX3Jma2lsbF9leGl0KGVlZXBjKTsKK2ZhaWxfcmZraWxsOgorCWVlZXBjX3dtaV9sZWRfZXhpdChlZWVwYyk7CitmYWlsX2xlZHM6CisJZWVlcGNfd21pX2lucHV0X2V4aXQoZWVlcGMpOworZmFpbF9pbnB1dDoKKwllZWVwY193bWlfcGxhdGZvcm1fZXhpdChlZWVwYyk7CitmYWlsX3BsYXRmb3JtOgorCWtmcmVlKGVlZXBjKTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorCitzdGF0aWMgaW50IGVlZXBjX3dtaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlKQogewogCXN0cnVjdCBlZWVwY193bWkgKmVlZXBjOwogCkBAIC0zODcsNyArODQ3LDEyIEBACiAJd21pX3JlbW92ZV9ub3RpZnlfaGFuZGxlcihFRUVQQ19XTUlfRVZFTlRfR1VJRCk7CiAJZWVlcGNfd21pX2JhY2tsaWdodF9leGl0KGVlZXBjKTsKIAllZWVwY193bWlfaW5wdXRfZXhpdChlZWVwYyk7CisJZWVlcGNfd21pX2xlZF9leGl0KGVlZXBjKTsKKwllZWVwY193bWlfcmZraWxsX2V4aXQoZWVlcGMpOworCWVlZXBjX3dtaV9kZWJ1Z2ZzX2V4aXQoZWVlcGMpOworCWVlZXBjX3dtaV9wbGF0Zm9ybV9leGl0KGVlZXBjKTsKIAorCWtmcmVlKGVlZXBjKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzk2LDEzICs4NjEsMzEgQEAKIAkJLm5hbWUgPSBFRUVQQ19XTUlfRklMRSwKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJfSwKLQkucHJvYmUgPSBlZWVwY193bWlfcGxhdGZvcm1fcHJvYmUsCi0JLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGVlZXBjX3dtaV9wbGF0Zm9ybV9yZW1vdmUpLAogfTsKIAorc3RhdGljIGFjcGlfc3RhdHVzIF9faW5pdCBlZWVwY193bWlfcGFyc2VfZGV2aWNlKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGxldmVsLAorCQkJCQkJIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXR2YWwpCit7CisJcHJfd2FybmluZygiRm91bmQgbGVnYWN5IEFUS0QgZGV2aWNlICglcykiLCBFRUVQQ19BQ1BJX0hJRCk7CisJKihib29sICopY29udGV4dCA9IHRydWU7CisJcmV0dXJuIEFFX0NUUkxfVEVSTUlOQVRFOworfQorCitzdGF0aWMgaW50IF9faW5pdCBlZWVwY193bWlfY2hlY2tfYXRrZCh2b2lkKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlib29sIGZvdW5kID0gZmFsc2U7CisKKwlzdGF0dXMgPSBhY3BpX2dldF9kZXZpY2VzKEVFRVBDX0FDUElfSElELCBlZWVwY193bWlfcGFyc2VfZGV2aWNlLAorCQkJCSAgJmZvdW5kLCBOVUxMKTsKKworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSB8fCAhZm91bmQpCisJCXJldHVybiAwOworCXJldHVybiAtMTsKK30KKwogc3RhdGljIGludCBfX2luaXQgZWVlcGNfd21pX2luaXQodm9pZCkKIHsKLQlzdHJ1Y3QgZWVlcGNfd21pICplZWVwYzsKIAlpbnQgZXJyOwogCiAJaWYgKCF3bWlfaGFzX2d1aWQoRUVFUENfV01JX0VWRU5UX0dVSUQpIHx8CkBAIC00MTEsNTggKzg5NCw0MCBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQllZWVwYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBlZWVwY193bWkpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWVlZXBjKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXBsYXRmb3JtX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhFRUVQQ19XTUlfRklMRSwgLTEpOwotCWlmICghcGxhdGZvcm1fZGV2aWNlKSB7Ci0JCXByX3dhcm5pbmcoIlVuYWJsZSB0byBhbGxvY2F0ZSBwbGF0Zm9ybSBkZXZpY2VcbiIpOwotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGZhaWxfcGxhdGZvcm07CisJaWYgKGVlZXBjX3dtaV9jaGVja19hdGtkKCkpIHsKKwkJcHJfd2FybmluZygiV01JIGRldmljZSBwcmVzZW50LCBidXQgbGVnYWN5IEFUS0QgZGV2aWNlIGlzIGFsc28gIgorCQkJICAgInByZXNlbnQgYW5kIGVuYWJsZWQuIik7CisJCXByX3dhcm5pbmcoIllvdSBwcm9iYWJseSBib290ZWQgd2l0aCBhY3BpX29zaT1cIkxpbnV4XCIgb3IgIgorCQkJICAgImFjcGlfb3NpPVwiIVdpbmRvd3MgMjAwOVwiIik7CisJCXByX3dhcm5pbmcoIkNhbid0IGxvYWQgZWVlcGMtd21pLCB1c2UgZGVmYXVsdCBhY3BpX29zaSAiCisJCQkgICAiKHByZWZlcnJlZCkgb3IgZWVlcGMtbGFwdG9wIik7CisJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGQocGxhdGZvcm1fZGV2aWNlKTsKLQlpZiAoZXJyKSB7Ci0JCXByX3dhcm5pbmcoIlVuYWJsZSB0byBhZGQgcGxhdGZvcm0gZGV2aWNlXG4iKTsKLQkJZ290byBwdXRfZGV2OworCXBsYXRmb3JtX2RldmljZSA9IGVlZXBjX3dtaV9hZGQoKTsKKwlpZiAoSVNfRVJSKHBsYXRmb3JtX2RldmljZSkpIHsKKwkJZXJyID0gUFRSX0VSUihwbGF0Zm9ybV9kZXZpY2UpOworCQlnb3RvIGZhaWxfZWVlcGNfd21pOwogCX0KIAotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBsYXRmb3JtX2RldmljZSwgZWVlcGMpOwotCiAJZXJyID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZwbGF0Zm9ybV9kcml2ZXIpOwogCWlmIChlcnIpIHsKIAkJcHJfd2FybmluZygiVW5hYmxlIHRvIHJlZ2lzdGVyIHBsYXRmb3JtIGRyaXZlclxuIik7Ci0JCWdvdG8gZGVsX2RldjsKKwkJZ290byBmYWlsX3BsYXRmb3JtX2RyaXZlcjsKIAl9CiAKLQllcnIgPSBlZWVwY193bWlfc3lzZnNfaW5pdChwbGF0Zm9ybV9kZXZpY2UpOwotCWlmIChlcnIpCi0JCWdvdG8gZGVsX3N5c2ZzOwotCiAJcmV0dXJuIDA7CiAKLWRlbF9zeXNmczoKLQllZWVwY193bWlfc3lzZnNfZXhpdChwbGF0Zm9ybV9kZXZpY2UpOwotZGVsX2RldjoKLQlwbGF0Zm9ybV9kZXZpY2VfZGVsKHBsYXRmb3JtX2RldmljZSk7Ci1wdXRfZGV2OgotCXBsYXRmb3JtX2RldmljZV9wdXQocGxhdGZvcm1fZGV2aWNlKTsKLWZhaWxfcGxhdGZvcm06Ci0Ja2ZyZWUoZWVlcGMpOwotCitmYWlsX3BsYXRmb3JtX2RyaXZlcjoKKwllZWVwY193bWlfcmVtb3ZlKHBsYXRmb3JtX2RldmljZSk7CitmYWlsX2VlZXBjX3dtaToKIAlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZWVlcGNfd21pX2V4aXQodm9pZCkKIHsKLQlzdHJ1Y3QgZWVlcGNfd21pICplZWVwYzsKLQotCWVlZXBjX3dtaV9zeXNmc19leGl0KHBsYXRmb3JtX2RldmljZSk7Ci0JZWVlcGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwbGF0Zm9ybV9kZXZpY2UpOworCWVlZXBjX3dtaV9yZW1vdmUocGxhdGZvcm1fZGV2aWNlKTsKIAlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmcGxhdGZvcm1fZHJpdmVyKTsKLQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihwbGF0Zm9ybV9kZXZpY2UpOwotCWtmcmVlKGVlZXBjKTsKIH0KIAogbW9kdWxlX2luaXQoZWVlcGNfd21pX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvZnVqaXRzdS1sYXB0b3AuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2Z1aml0c3UtbGFwdG9wLmMKaW5kZXggZjQ0Y2QyNi4uYWQ4OGIyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvZnVqaXRzdS1sYXB0b3AuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9mdWppdHN1LWxhcHRvcC5jCkBAIC0xMjQwLDcgKzEyNDAsNyBAQAogTU9EVUxFX0FMSUFTKCJkbWk6Kjpzdm5GVUpJVFNVU0lFTUVOUzoqOnB2cjpydm5GVUpJVFNVOnJuRkpOQjFFNjoqOmN2clM2NDIwOioiKTsKIE1PRFVMRV9BTElBUygiZG1pOio6c3ZuRlVKSVRTVToqOnB2cjpydm5GVUpJVFNVOnJuRkpOQjE5QzoqOmN2clM3MDIwOioiKTsKIAotc3RhdGljIHN0cnVjdCBwbnBfZGV2aWNlX2lkIHBucF9pZHNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcG5wX2RldmljZV9pZCBwbnBfaWRzW10gX191c2VkID0gewogCXsuaWQgPSAiRlVKMDJiZiJ9LAogCXsuaWQgPSAiRlVKMDJCMSJ9LAogCXsuaWQgPSAiRlVKMDJFMyJ9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvaWRlYXBhZC1sYXB0b3AuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2lkZWFwYWQtbGFwdG9wLmMKaW5kZXggNWZmMTIyMC4uMTE0ZDk1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvaWRlYXBhZC1sYXB0b3AuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pZGVhcGFkLWxhcHRvcC5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICBpZGVhcGFkX2FjcGkuYyAtIExlbm92byBJZGVhUGFkIEFDUEkgRXh0cmFzCisgKiAgaWRlYXBhZC1sYXB0b3AuYyAtIExlbm92byBJZGVhUGFkIEFDUEkgRXh0cmFzCiAgKgogICogIENvcHlyaWdodCDCqSAyMDEwIEludGVsIENvcnBvcmF0aW9uCiAgKiAgQ29weXJpZ2h0IMKpIDIwMTAgRGF2aWQgV29vZGhvdXNlIDxkd213MkBpbmZyYWRlYWQub3JnPgpAQCAtMjcsMzEgKzI3LDE5IEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CiAjaW5jbHVkZSA8bGludXgvcmZraWxsLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC9zcGFyc2Uta2V5bWFwLmg+CiAKLSNkZWZpbmUgSURFQVBBRF9ERVZfQ0FNRVJBCTAKLSNkZWZpbmUgSURFQVBBRF9ERVZfV0xBTgkxCi0jZGVmaW5lIElERUFQQURfREVWX0JMVUVUT09USAkyCi0jZGVmaW5lIElERUFQQURfREVWXzNHCQkzCi0jZGVmaW5lIElERUFQQURfREVWX0tJTExTVwk0CisjZGVmaW5lIElERUFQQURfUkZLSUxMX0RFVl9OVU0JKDMpCiAKIHN0cnVjdCBpZGVhcGFkX3ByaXZhdGUgewotCWFjcGlfaGFuZGxlIGhhbmRsZTsKLQlzdHJ1Y3QgcmZraWxsICpyZmtbNV07Ci19ICppZGVhcGFkX3ByaXY7Ci0KLXN0YXRpYyBzdHJ1Y3QgewotCWNoYXIgKm5hbWU7Ci0JaW50IGNmZ2JpdDsKLQlpbnQgb3Bjb2RlOwotCWludCB0eXBlOwotfSBpZGVhcGFkX3Jma19kYXRhW10gPSB7Ci0JeyAiaWRlYXBhZF9jYW1lcmEiLAkxOSwgMHgxRSwgTlVNX1JGS0lMTF9UWVBFUyB9LAotCXsgImlkZWFwYWRfd2xhbiIsCTE4LCAweDE1LCBSRktJTExfVFlQRV9XTEFOIH0sCi0JeyAiaWRlYXBhZF9ibHVldG9vdGgiLAkxNiwgMHgxNywgUkZLSUxMX1RZUEVfQkxVRVRPT1RIIH0sCi0JeyAiaWRlYXBhZF8zZyIsCQkxNywgMHgyMCwgUkZLSUxMX1RZUEVfV1dBTiB9LAotCXsgImlkZWFwYWRfa2lsbHN3IiwJMCwgIDAsICAgIFJGS0lMTF9UWVBFX1dMQU4gfQorCXN0cnVjdCByZmtpbGwgKnJma1tJREVBUEFEX1JGS0lMTF9ERVZfTlVNXTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9kZXZpY2U7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRkZXY7CiB9OwogCitzdGF0aWMgYWNwaV9oYW5kbGUgaWRlYXBhZF9oYW5kbGU7CiBzdGF0aWMgYm9vbCBub19idF9yZmtpbGw7CiBtb2R1bGVfcGFyYW0obm9fYnRfcmZraWxsLCBib29sLCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0Mobm9fYnRfcmZraWxsLCAiTm8gcmZraWxsIGZvciBibHVldG9vdGguIik7CkBAIC0xNjMsMTcgKzE1MSwxNyBAQAogCXByX2VycigidGltZW91dCBpbiB3cml0ZV9lY19jbWRcbiIpOwogCXJldHVybiAtMTsKIH0KLS8qIHRoZSBhYm92ZSBpcyBBQ1BJIGhlbHBlcnMgKi8KIAorLyoKKyAqIGNhbWVyYSBwb3dlcgorICovCiBzdGF0aWMgc3NpemVfdCBzaG93X2lkZWFwYWRfY2FtKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCQljaGFyICpidWYpCiB7Ci0Jc3RydWN0IGlkZWFwYWRfcHJpdmF0ZSAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWFjcGlfaGFuZGxlIGhhbmRsZSA9IHByaXYtPmhhbmRsZTsKIAl1bnNpZ25lZCBsb25nIHJlc3VsdDsKIAotCWlmIChyZWFkX2VjX2RhdGEoaGFuZGxlLCAweDFELCAmcmVzdWx0KSkKKwlpZiAocmVhZF9lY19kYXRhKGlkZWFwYWRfaGFuZGxlLCAweDFELCAmcmVzdWx0KSkKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiLTFcbiIpOwogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsdVxuIiwgcmVzdWx0KTsKIH0KQEAgLTE4MiwxNSArMTcwLDEzIEBACiAJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgaWRlYXBhZF9wcml2YXRlICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JYWNwaV9oYW5kbGUgaGFuZGxlID0gcHJpdi0+aGFuZGxlOwogCWludCByZXQsIHN0YXRlOwogCiAJaWYgKCFjb3VudCkKIAkJcmV0dXJuIDA7CiAJaWYgKHNzY2FuZihidWYsICIlaSIsICZzdGF0ZSkgIT0gMSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JcmV0ID0gd3JpdGVfZWNfY21kKGhhbmRsZSwgMHgxRSwgc3RhdGUpOworCXJldCA9IHdyaXRlX2VjX2NtZChpZGVhcGFkX2hhbmRsZSwgMHgxRSwgc3RhdGUpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCXJldHVybiBjb3VudDsKQEAgLTE5OCwxNiArMTg0LDI3IEBACiAKIHN0YXRpYyBERVZJQ0VfQVRUUihjYW1lcmFfcG93ZXIsIDA2NDQsIHNob3dfaWRlYXBhZF9jYW0sIHN0b3JlX2lkZWFwYWRfY2FtKTsKIAorLyoKKyAqIFJma2lsbAorICovCitzdHJ1Y3QgaWRlYXBhZF9yZmtfZGF0YSB7CisJY2hhciAqbmFtZTsKKwlpbnQgY2ZnYml0OworCWludCBvcGNvZGU7CisJaW50IHR5cGU7Cit9OworCitjb25zdCBzdHJ1Y3QgaWRlYXBhZF9yZmtfZGF0YSBpZGVhcGFkX3Jma19kYXRhW10gPSB7CisJeyAiaWRlYXBhZF93bGFuIiwJMTgsIDB4MTUsIFJGS0lMTF9UWVBFX1dMQU4gfSwKKwl7ICJpZGVhcGFkX2JsdWV0b290aCIsCTE2LCAweDE3LCBSRktJTExfVFlQRV9CTFVFVE9PVEggfSwKKwl7ICJpZGVhcGFkXzNnIiwJCTE3LCAweDIwLCBSRktJTExfVFlQRV9XV0FOIH0sCit9OworCiBzdGF0aWMgaW50IGlkZWFwYWRfcmZrX3NldCh2b2lkICpkYXRhLCBib29sIGJsb2NrZWQpCiB7Ci0JaW50IGRldmljZSA9ICh1bnNpZ25lZCBsb25nKWRhdGE7CisJdW5zaWduZWQgbG9uZyBvcGNvZGUgPSAodW5zaWduZWQgbG9uZylkYXRhOwogCi0JaWYgKGRldmljZSA9PSBJREVBUEFEX0RFVl9LSUxMU1cpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0dXJuIHdyaXRlX2VjX2NtZChpZGVhcGFkX3ByaXYtPmhhbmRsZSwKLQkJCSAgICBpZGVhcGFkX3Jma19kYXRhW2RldmljZV0ub3Bjb2RlLAotCQkJICAgICFibG9ja2VkKTsKKwlyZXR1cm4gd3JpdGVfZWNfY21kKGlkZWFwYWRfaGFuZGxlLCBvcGNvZGUsICFibG9ja2VkKTsKIH0KIAogc3RhdGljIHN0cnVjdCByZmtpbGxfb3BzIGlkZWFwYWRfcmZrX29wcyA9IHsKQEAgLTIxNywyMCArMjE0LDIwIEBACiBzdGF0aWMgdm9pZCBpZGVhcGFkX3N5bmNfcmZrX3N0YXRlKHN0cnVjdCBhY3BpX2RldmljZSAqYWRldmljZSkKIHsKIAlzdHJ1Y3QgaWRlYXBhZF9wcml2YXRlICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKCZhZGV2aWNlLT5kZXYpOwotCWFjcGlfaGFuZGxlIGhhbmRsZSA9IHByaXYtPmhhbmRsZTsKIAl1bnNpZ25lZCBsb25nIGh3X2Jsb2NrZWQ7CiAJaW50IGk7CiAKLQlpZiAocmVhZF9lY19kYXRhKGhhbmRsZSwgMHgyMywgJmh3X2Jsb2NrZWQpKQorCWlmIChyZWFkX2VjX2RhdGEoaWRlYXBhZF9oYW5kbGUsIDB4MjMsICZod19ibG9ja2VkKSkKIAkJcmV0dXJuOwogCWh3X2Jsb2NrZWQgPSAhaHdfYmxvY2tlZDsKIAotCWZvciAoaSA9IElERUFQQURfREVWX1dMQU47IGkgPD0gSURFQVBBRF9ERVZfS0lMTFNXOyBpKyspCisJZm9yIChpID0gMDsgaSA8IElERUFQQURfUkZLSUxMX0RFVl9OVU07IGkrKykKIAkJaWYgKHByaXYtPnJma1tpXSkKIAkJCXJma2lsbF9zZXRfaHdfc3RhdGUocHJpdi0+cmZrW2ldLCBod19ibG9ja2VkKTsKIH0KIAotc3RhdGljIGludCBpZGVhcGFkX3JlZ2lzdGVyX3Jma2lsbChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXZpY2UsIGludCBkZXYpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpZGVhcGFkX3JlZ2lzdGVyX3Jma2lsbChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXZpY2UsCisJCQkJCSAgICAgaW50IGRldikKIHsKIAlzdHJ1Y3QgaWRlYXBhZF9wcml2YXRlICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKCZhZGV2aWNlLT5kZXYpOwogCWludCByZXQ7CkBAIC0yMzksNyArMjM2LDcgQEAKIAlpZiAobm9fYnRfcmZraWxsICYmCiAJICAgIChpZGVhcGFkX3Jma19kYXRhW2Rldl0udHlwZSA9PSBSRktJTExfVFlQRV9CTFVFVE9PVEgpKSB7CiAJCS8qIEZvcmNlIHRvIGVuYWJsZSBibHVldG9vdGggd2hlbiBub19idF9yZmtpbGw9MSAqLwotCQl3cml0ZV9lY19jbWQoaWRlYXBhZF9wcml2LT5oYW5kbGUsCisJCXdyaXRlX2VjX2NtZChpZGVhcGFkX2hhbmRsZSwKIAkJCSAgICAgaWRlYXBhZF9yZmtfZGF0YVtkZXZdLm9wY29kZSwgMSk7CiAJCXJldHVybiAwOwogCX0KQEAgLTI1MCw3ICsyNDcsNyBAQAogCWlmICghcHJpdi0+cmZrW2Rldl0pCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaWYgKHJlYWRfZWNfZGF0YShpZGVhcGFkX3ByaXYtPmhhbmRsZSwgaWRlYXBhZF9yZmtfZGF0YVtkZXZdLm9wY29kZS0xLAorCWlmIChyZWFkX2VjX2RhdGEoaWRlYXBhZF9oYW5kbGUsIGlkZWFwYWRfcmZrX2RhdGFbZGV2XS5vcGNvZGUtMSwKIAkJCSAmc3dfYmxvY2tlZCkpIHsKIAkJcmZraWxsX2luaXRfc3dfc3RhdGUocHJpdi0+cmZrW2Rldl0sIDApOwogCX0gZWxzZSB7CkBAIC0yNjYsNyArMjYzLDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgaWRlYXBhZF91bnJlZ2lzdGVyX3Jma2lsbChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXZpY2UsIGludCBkZXYpCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgaWRlYXBhZF91bnJlZ2lzdGVyX3Jma2lsbChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXZpY2UsCisJCQkJCQlpbnQgZGV2KQogewogCXN0cnVjdCBpZGVhcGFkX3ByaXZhdGUgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoJmFkZXZpY2UtPmRldik7CiAKQEAgLTI3Nyw3MyArMjc1LDE3NyBAQAogCXJma2lsbF9kZXN0cm95KHByaXYtPnJma1tkZXZdKTsKIH0KIAorLyoKKyAqIFBsYXRmb3JtIGRldmljZQorICovCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaWRlYXBhZF9hdHRyaWJ1dGVzW10gPSB7CisJJmRldl9hdHRyX2NhbWVyYV9wb3dlci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGlkZWFwYWRfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGlkZWFwYWRfYXR0cmlidXRlcworfTsKKworc3RhdGljIGludCBfX2RldmluaXQgaWRlYXBhZF9wbGF0Zm9ybV9pbml0KHN0cnVjdCBpZGVhcGFkX3ByaXZhdGUgKnByaXYpCit7CisJaW50IHJlc3VsdDsKKworCXByaXYtPnBsYXRmb3JtX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygiaWRlYXBhZCIsIC0xKTsKKwlpZiAoIXByaXYtPnBsYXRmb3JtX2RldmljZSkKKwkJcmV0dXJuIC1FTk9NRU07CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocHJpdi0+cGxhdGZvcm1fZGV2aWNlLCBwcml2KTsKKworCXJlc3VsdCA9IHBsYXRmb3JtX2RldmljZV9hZGQocHJpdi0+cGxhdGZvcm1fZGV2aWNlKTsKKwlpZiAocmVzdWx0KQorCQlnb3RvIGZhaWxfcGxhdGZvcm1fZGV2aWNlOworCisJcmVzdWx0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZwcml2LT5wbGF0Zm9ybV9kZXZpY2UtPmRldi5rb2JqLAorCQkJCSAgICAmaWRlYXBhZF9hdHRyaWJ1dGVfZ3JvdXApOworCWlmIChyZXN1bHQpCisJCWdvdG8gZmFpbF9zeXNmczsKKwlyZXR1cm4gMDsKKworZmFpbF9zeXNmczoKKwlwbGF0Zm9ybV9kZXZpY2VfZGVsKHByaXYtPnBsYXRmb3JtX2RldmljZSk7CitmYWlsX3BsYXRmb3JtX2RldmljZToKKwlwbGF0Zm9ybV9kZXZpY2VfcHV0KHByaXYtPnBsYXRmb3JtX2RldmljZSk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgaWRlYXBhZF9wbGF0Zm9ybV9leGl0KHN0cnVjdCBpZGVhcGFkX3ByaXZhdGUgKnByaXYpCit7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZwcml2LT5wbGF0Zm9ybV9kZXZpY2UtPmRldi5rb2JqLAorCQkJICAgJmlkZWFwYWRfYXR0cmlidXRlX2dyb3VwKTsKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcihwcml2LT5wbGF0Zm9ybV9kZXZpY2UpOworfQorCisvKgorICogaW5wdXQgZGV2aWNlCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qga2V5X2VudHJ5IGlkZWFwYWRfa2V5bWFwW10gPSB7CisJeyBLRV9LRVksIDB4MDYsIHsgS0VZX1NXSVRDSFZJREVPTU9ERSB9IH0sCisJeyBLRV9LRVksIDB4MEQsIHsgS0VZX1dMQU4gfSB9LAorCXsgS0VfRU5ELCAwIH0sCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpZGVhcGFkX2lucHV0X2luaXQoc3RydWN0IGlkZWFwYWRfcHJpdmF0ZSAqcHJpdikKK3sKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dGRldjsKKwlpbnQgZXJyb3I7CisKKwlpbnB1dGRldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmICghaW5wdXRkZXYpIHsKKwkJcHJfaW5mbygiVW5hYmxlIHRvIGFsbG9jYXRlIGlucHV0IGRldmljZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlucHV0ZGV2LT5uYW1lID0gIklkZWFwYWQgZXh0cmEgYnV0dG9ucyI7CisJaW5wdXRkZXYtPnBoeXMgPSAiaWRlYXBhZC9pbnB1dDAiOworCWlucHV0ZGV2LT5pZC5idXN0eXBlID0gQlVTX0hPU1Q7CisJaW5wdXRkZXYtPmRldi5wYXJlbnQgPSAmcHJpdi0+cGxhdGZvcm1fZGV2aWNlLT5kZXY7CisKKwllcnJvciA9IHNwYXJzZV9rZXltYXBfc2V0dXAoaW5wdXRkZXYsIGlkZWFwYWRfa2V5bWFwLCBOVUxMKTsKKwlpZiAoZXJyb3IpIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gc2V0dXAgaW5wdXQgZGV2aWNlIGtleW1hcFxuIik7CisJCWdvdG8gZXJyX2ZyZWVfZGV2OworCX0KKworCWVycm9yID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGlucHV0ZGV2KTsKKwlpZiAoZXJyb3IpIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gcmVnaXN0ZXIgaW5wdXQgZGV2aWNlXG4iKTsKKwkJZ290byBlcnJfZnJlZV9rZXltYXA7CisJfQorCisJcHJpdi0+aW5wdXRkZXYgPSBpbnB1dGRldjsKKwlyZXR1cm4gMDsKKworZXJyX2ZyZWVfa2V5bWFwOgorCXNwYXJzZV9rZXltYXBfZnJlZShpbnB1dGRldik7CitlcnJfZnJlZV9kZXY6CisJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRkZXYpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGlkZWFwYWRfaW5wdXRfZXhpdChzdHJ1Y3QgaWRlYXBhZF9wcml2YXRlICpwcml2KQoreworCXNwYXJzZV9rZXltYXBfZnJlZShwcml2LT5pbnB1dGRldik7CisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UocHJpdi0+aW5wdXRkZXYpOworCXByaXYtPmlucHV0ZGV2ID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgaWRlYXBhZF9pbnB1dF9yZXBvcnQoc3RydWN0IGlkZWFwYWRfcHJpdmF0ZSAqcHJpdiwKKwkJCQkgdW5zaWduZWQgbG9uZyBzY2FuY29kZSkKK3sKKwlzcGFyc2Vfa2V5bWFwX3JlcG9ydF9ldmVudChwcml2LT5pbnB1dGRldiwgc2NhbmNvZGUsIDEsIHRydWUpOworfQorCisvKgorICogbW9kdWxlIGluaXQvZXhpdAorICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkIGlkZWFwYWRfZGV2aWNlX2lkc1tdID0gewogCXsgIlZQQzIwMDQiLCAwfSwKIAl7ICIiLCAwfSwKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGFjcGksIGlkZWFwYWRfZGV2aWNlX2lkcyk7CiAKLXN0YXRpYyBpbnQgaWRlYXBhZF9hY3BpX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXZpY2UpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpZGVhcGFkX2FjcGlfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqYWRldmljZSkKIHsKLQlpbnQgaSwgY2ZnOwotCWludCBkZXZzX3ByZXNlbnRbNV07CisJaW50IHJldCwgaSwgY2ZnOwogCXN0cnVjdCBpZGVhcGFkX3ByaXZhdGUgKnByaXY7CiAKIAlpZiAocmVhZF9tZXRob2RfaW50KGFkZXZpY2UtPmhhbmRsZSwgIl9DRkciLCAmY2ZnKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlmb3IgKGkgPSBJREVBUEFEX0RFVl9DQU1FUkE7IGkgPCBJREVBUEFEX0RFVl9LSUxMU1c7IGkrKykgewotCQlpZiAodGVzdF9iaXQoaWRlYXBhZF9yZmtfZGF0YVtpXS5jZmdiaXQsICh1bnNpZ25lZCBsb25nICopJmNmZykpCi0JCQlkZXZzX3ByZXNlbnRbaV0gPSAxOwotCQllbHNlCi0JCQlkZXZzX3ByZXNlbnRbaV0gPSAwOwotCX0KLQotCS8qIFRoZSBoYXJkd2FyZSBzd2l0Y2ggaXMgYWx3YXlzIHByZXNlbnQgKi8KLQlkZXZzX3ByZXNlbnRbSURFQVBBRF9ERVZfS0lMTFNXXSA9IDE7Ci0KIAlwcml2ID0ga3phbGxvYyhzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXByaXYpCiAJCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKGRldnNfcHJlc2VudFtJREVBUEFEX0RFVl9DQU1FUkFdKSB7Ci0JCWludCByZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmFkZXZpY2UtPmRldiwgJmRldl9hdHRyX2NhbWVyYV9wb3dlcik7Ci0JCWlmIChyZXQpIHsKLQkJCWtmcmVlKHByaXYpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQotCXByaXYtPmhhbmRsZSA9IGFkZXZpY2UtPmhhbmRsZTsKIAlkZXZfc2V0X2RydmRhdGEoJmFkZXZpY2UtPmRldiwgcHJpdik7Ci0JaWRlYXBhZF9wcml2ID0gcHJpdjsKLQlmb3IgKGkgPSBJREVBUEFEX0RFVl9XTEFOOyBpIDw9IElERUFQQURfREVWX0tJTExTVzsgaSsrKSB7Ci0JCWlmICghZGV2c19wcmVzZW50W2ldKQotCQkJY29udGludWU7CisJaWRlYXBhZF9oYW5kbGUgPSBhZGV2aWNlLT5oYW5kbGU7CiAKLQkJaWRlYXBhZF9yZWdpc3Rlcl9yZmtpbGwoYWRldmljZSwgaSk7CisJcmV0ID0gaWRlYXBhZF9wbGF0Zm9ybV9pbml0KHByaXYpOworCWlmIChyZXQpCisJCWdvdG8gcGxhdGZvcm1fZmFpbGVkOworCisJcmV0ID0gaWRlYXBhZF9pbnB1dF9pbml0KHByaXYpOworCWlmIChyZXQpCisJCWdvdG8gaW5wdXRfZmFpbGVkOworCisJZm9yIChpID0gMDsgaSA8IElERUFQQURfUkZLSUxMX0RFVl9OVU07IGkrKykgeworCQlpZiAodGVzdF9iaXQoaWRlYXBhZF9yZmtfZGF0YVtpXS5jZmdiaXQsICh1bnNpZ25lZCBsb25nICopJmNmZykpCisJCQlpZGVhcGFkX3JlZ2lzdGVyX3Jma2lsbChhZGV2aWNlLCBpKTsKKwkJZWxzZQorCQkJcHJpdi0+cmZrW2ldID0gTlVMTDsKIAl9CiAJaWRlYXBhZF9zeW5jX3Jma19zdGF0ZShhZGV2aWNlKTsKKwogCXJldHVybiAwOworCitpbnB1dF9mYWlsZWQ6CisJaWRlYXBhZF9wbGF0Zm9ybV9leGl0KHByaXYpOworcGxhdGZvcm1fZmFpbGVkOgorCWtmcmVlKHByaXYpOworCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgaWRlYXBhZF9hY3BpX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXZpY2UsIGludCB0eXBlKQorc3RhdGljIGludCBfX2RldmV4aXQgaWRlYXBhZF9hY3BpX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXZpY2UsIGludCB0eXBlKQogewogCXN0cnVjdCBpZGVhcGFkX3ByaXZhdGUgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoJmFkZXZpY2UtPmRldik7CiAJaW50IGk7CiAKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmFkZXZpY2UtPmRldiwgJmRldl9hdHRyX2NhbWVyYV9wb3dlcik7Ci0KLQlmb3IgKGkgPSBJREVBUEFEX0RFVl9XTEFOOyBpIDw9IElERUFQQURfREVWX0tJTExTVzsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBJREVBUEFEX1JGS0lMTF9ERVZfTlVNOyBpKyspCiAJCWlkZWFwYWRfdW5yZWdpc3Rlcl9yZmtpbGwoYWRldmljZSwgaSk7Ci0KKwlpZGVhcGFkX2lucHV0X2V4aXQocHJpdik7CisJaWRlYXBhZF9wbGF0Zm9ybV9leGl0KHByaXYpOwogCWRldl9zZXRfZHJ2ZGF0YSgmYWRldmljZS0+ZGV2LCBOVUxMKTsKIAlrZnJlZShwcml2KTsKKwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBpZGVhcGFkX2FjcGlfbm90aWZ5KHN0cnVjdCBhY3BpX2RldmljZSAqYWRldmljZSwgdTMyIGV2ZW50KQogeworCXN0cnVjdCBpZGVhcGFkX3ByaXZhdGUgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoJmFkZXZpY2UtPmRldik7CiAJYWNwaV9oYW5kbGUgaGFuZGxlID0gYWRldmljZS0+aGFuZGxlOwogCXVuc2lnbmVkIGxvbmcgdnBjMSwgdnBjMiwgdnBjX2JpdDsKIApAQCAtMzU3LDYgKzQ1OSw4IEBACiAJCWlmICh0ZXN0X2JpdCh2cGNfYml0LCAmdnBjMSkpIHsKIAkJCWlmICh2cGNfYml0ID09IDkpCiAJCQkJaWRlYXBhZF9zeW5jX3Jma19zdGF0ZShhZGV2aWNlKTsKKwkJCWVsc2UKKwkJCQlpZGVhcGFkX2lucHV0X3JlcG9ydChwcml2LCB2cGNfYml0KTsKIAkJfQogCX0KIH0KQEAgLTM3MSwxOSArNDc1LDE0IEBACiAJLm93bmVyID0gVEhJU19NT0RVTEUsCiB9OwogCi0KIHN0YXRpYyBpbnQgX19pbml0IGlkZWFwYWRfYWNwaV9tb2R1bGVfaW5pdCh2b2lkKQogewotCWFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcigmaWRlYXBhZF9hY3BpX2RyaXZlcik7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKCZpZGVhcGFkX2FjcGlfZHJpdmVyKTsKIH0KIAotCiBzdGF0aWMgdm9pZCBfX2V4aXQgaWRlYXBhZF9hY3BpX21vZHVsZV9leGl0KHZvaWQpCiB7CiAJYWNwaV9idXNfdW5yZWdpc3Rlcl9kcml2ZXIoJmlkZWFwYWRfYWNwaV9kcml2ZXIpOwotCiB9CiAKIE1PRFVMRV9BVVRIT1IoIkRhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX2lwcy5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvaW50ZWxfaXBzLmMKaW5kZXggZjBiM2FkMS4uMTI5NGEzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvaW50ZWxfaXBzLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvaW50ZWxfaXBzLmMKQEAgLTE0NzQsNyArMTQ3NCw3IEBACiB9CiAKIHZvaWQKLWlwc19saW5rX3RvX2k5MTVfZHJpdmVyKCkKK2lwc19saW5rX3RvX2k5MTVfZHJpdmVyKHZvaWQpCiB7CiAJLyogV2UgY2FuJ3QgY2xlYW5seSBnZXQgYXQgdGhlIHZhcmlvdXMgaXBzX2RyaXZlciBzdHJ1Y3RzIGZyb20KIAkgKiB0aGlzIGNhbGxlciAodGhlIGk5MTUgZHJpdmVyKSwgc28ganVzdCBzZXQgYSBmbGFnIHNheWluZwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvaW50ZWxfcG1pY19ncGlvLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9wbWljX2dwaW8uYwppbmRleCBlNjFkYjlkLi45MzBlNjI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9wbWljX2dwaW8uYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9wbWljX2dwaW8uYwpAQCAtMjQ0LDcgKzI0NCwxMSBAQAogCQkJZ2VuZXJpY19oYW5kbGVfaXJxKHBnLT5pcnFfYmFzZSArIGdwaW8pOwogCQl9CiAJfQotCWRlc2MtPmNoaXAtPmVvaShpcnEpOworCisJaWYgKGRlc2MtPmNoaXAtPmlycV9lb2kpCisJCWRlc2MtPmNoaXAtPmlycV9lb2koaXJxX2dldF9pcnFfZGF0YShpcnEpKTsKKwllbHNlCisJCWRldl93YXJuKHBnLT5jaGlwLmRldiwgIm1pc3NpbmcgRU9JIGhhbmRsZXIgZm9yIGlycSAlZFxuIiwgaXJxKTsKIH0KIAogc3RhdGljIGludCBfX2RldmluaXQgcGxhdGZvcm1fcG1pY19ncGlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9zY3VfaXBjLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9zY3VfaXBjLmMKaW5kZXggY2EzNWIwYy4uMTc1MmVmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvaW50ZWxfc2N1X2lwYy5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX3NjdV9pcGMuYwpAQCAtNDk3LDcgKzQ5Nyw3IEBACiAJCQkiaW50ZWxfc2N1X2lwYzogSTJDIElOVkFMSURfQ01EID0gMHgleFxuIiwgY21kKTsKIAogCQltdXRleF91bmxvY2soJmlwY2xvY2spOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRUlPOwogCX0KIAltdXRleF91bmxvY2soJmlwY2xvY2spOwogCXJldHVybiAwOwpAQCAtNjQyLDcgKzY0Miw3IEBACiAKIAlpZiAoc3RhdHVzID09IElQQ19GV19VUERBVEVfU1VDQ0VTUykKIAkJcmV0dXJuIDA7Ci0JcmV0dXJuIC0xOworCXJldHVybiAtRUlPOwogfQogRVhQT1JUX1NZTUJPTChpbnRlbF9zY3VfaXBjX2Z3X3VwZGF0ZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX3NjdV9pcGN1dGlsLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9zY3VfaXBjdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMzIzMWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9zY3VfaXBjdXRpbC5jCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogaW50ZWxfc2N1X2lwYy5jOiBEcml2ZXIgZm9yIHRoZSBJbnRlbCBTQ1UgSVBDIG1lY2hhbmlzbQorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwOC0yMDEwIEludGVsIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IFNyZWVkaGFyYSBEUyAoc3JlZWRoYXJhLmRzQGludGVsLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UuCisgKgorICogVGhpcyBkcml2ZXIgcHJvdmlkZXMgaW9jdGwgaW50ZXJmYWNlcyB0byBjYWxsIGludGVsIHNjdSBpcGMgZHJpdmVyIGFwaQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL2ludGVsX3NjdV9pcGMuaD4KKworc3RhdGljIHUzMiBtYWpvcjsKKworI2RlZmluZSBNQVhfRldfU0laRSAyNjQxOTIKKworLyogaW9jdGwgY29tbW5kcyAqLworI2RlZmluZQlJTlRFX1NDVV9JUENfUkVHSVNURVJfUkVBRAkwCisjZGVmaW5lIElOVEVfU0NVX0lQQ19SRUdJU1RFUl9XUklURQkxCisjZGVmaW5lIElOVEVfU0NVX0lQQ19SRUdJU1RFUl9VUERBVEUJMgorI2RlZmluZSBJTlRFX1NDVV9JUENfRldfVVBEQVRFCQkweEEyCisKK3N0cnVjdCBzY3VfaXBjX2RhdGEgeworCXUzMiAgICAgY291bnQ7ICAvKiBOby4gb2YgcmVnaXN0ZXJzICovCisJdTE2ICAgICBhZGRyWzVdOyAvKiBSZWdpc3RlciBhZGRyZXNzZXMgKi8KKwl1OCAgICAgIGRhdGFbNV07IC8qIFJlZ2lzdGVyIGRhdGEgKi8KKwl1OCAgICAgIG1hc2s7IC8qIFZhbGlkIGZvciByZWFkLW1vZGlmeS13cml0ZSAqLworfTsKKworLyoqCisgKglzY3VfcmVnX2FjY2VzcwkJLQlpbXBsZW1lbnQgcmVnaXN0ZXIgYWNjZXNzIGlvY3RscworICoJQGNtZDogY29tbWFuZCB3ZSBhcmUgZG9pbmcgKHJlYWQvd3JpdGUvdXBkYXRlKQorICoJQGRhdGE6IGtlcm5lbCBjb3B5IG9mIGlvY3RsIGRhdGEKKyAqCisgKglBbGxvdyB0aGUgdXNlciB0byBwZXJmb3JtIHJlZ2lzdGVyIGFjY2Vzc2VzIG9uIHRoZSBTQ1UgdmlhIHRoZQorICoJa2VybmVsIGludGVyZmFjZQorICovCisKK3N0YXRpYyBpbnQgc2N1X3JlZ19hY2Nlc3ModTMyIGNtZCwgc3RydWN0IHNjdV9pcGNfZGF0YSAgKmRhdGEpCit7CisJaW50IGNvdW50ID0gZGF0YS0+Y291bnQ7CisKKwlpZiAoY291bnQgPT0gMCB8fCBjb3VudCA9PSAzIHx8IGNvdW50ID4gNCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgSU5URV9TQ1VfSVBDX1JFR0lTVEVSX1JFQUQ6CisJCXJldHVybiBpbnRlbF9zY3VfaXBjX3JlYWR2KGRhdGEtPmFkZHIsIGRhdGEtPmRhdGEsIGNvdW50KTsKKwljYXNlIElOVEVfU0NVX0lQQ19SRUdJU1RFUl9XUklURToKKwkJcmV0dXJuIGludGVsX3NjdV9pcGNfd3JpdGV2KGRhdGEtPmFkZHIsIGRhdGEtPmRhdGEsIGNvdW50KTsKKwljYXNlIElOVEVfU0NVX0lQQ19SRUdJU1RFUl9VUERBVEU6CisJCXJldHVybiBpbnRlbF9zY3VfaXBjX3VwZGF0ZV9yZWdpc3RlcihkYXRhLT5hZGRyWzBdLAorCQkJCQkJICAgIGRhdGEtPmRhdGFbMF0sIGRhdGEtPm1hc2spOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PVFRZOworCX0KK30KKworLyoqCisgKglzY3VfaXBjX2lvY3RsCQktCWNvbnRyb2wgaW9jdGxzIGZvciB0aGUgU0NVCisgKglAZnA6IGZpbGUgaGFuZGxlIG9mIHRoZSBTQ1UgZGV2aWNlCisgKglAY21kOiBpb2N0bCBjb2NlCisgKglAYXJnOiBwb2ludGVyIHRvIHVzZXIgcGFzc2VkIHN0cnVjdHVyZQorICoKKyAqCVN1cHBvcnQgdGhlIEkvTyBhbmQgZmlybXdhcmUgZmxhc2hpbmcgaW50ZXJmYWNlcyBvZiB0aGUgU0NVCisgKi8KK3N0YXRpYyBsb25nIHNjdV9pcGNfaW9jdGwoc3RydWN0IGZpbGUgKmZwLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCQkJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCByZXQ7CisJc3RydWN0IHNjdV9pcGNfZGF0YSAgZGF0YTsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmIChjbWQgPT0gSU5URV9TQ1VfSVBDX0ZXX1VQREFURSkgeworCQkJdTggKmZ3YnVmID0ga21hbGxvYyhNQVhfRldfU0laRSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoZndidWYgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcihmd2J1ZiwgKHU4ICopYXJnLCBNQVhfRldfU0laRSkpIHsKKwkJCQlrZnJlZShmd2J1Zik7CisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisJCQlyZXQgPSBpbnRlbF9zY3VfaXBjX2Z3X3VwZGF0ZShmd2J1ZiwgTUFYX0ZXX1NJWkUpOworCQkJa2ZyZWUoZndidWYpOworCQkJcmV0dXJuIHJldDsKKwl9IGVsc2UgeworCQlpZiAoY29weV9mcm9tX3VzZXIoJmRhdGEsIGFyZ3AsIHNpemVvZihzdHJ1Y3Qgc2N1X2lwY19kYXRhKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0ID0gc2N1X3JlZ19hY2Nlc3MoY21kLCAmZGF0YSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmZGF0YSwgc2l6ZW9mKHN0cnVjdCBzY3VfaXBjX2RhdGEpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNjdV9pcGNfZm9wcyA9IHsKKwkudW5sb2NrZWRfaW9jdGwgPSBzY3VfaXBjX2lvY3RsLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaXBjX21vZHVsZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX2NocmRldigwLCAiaW50ZWxfbWlkX3NjdSIsICZzY3VfaXBjX2ZvcHMpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaXBjX21vZHVsZV9leGl0KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9jaHJkZXYobWFqb3IsICJpbnRlbF9taWRfc2N1Iik7Cit9CisKK21vZHVsZV9pbml0KGlwY19tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChpcGNfbW9kdWxlX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIFYyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlV0aWxpdHkgZHJpdmVyIGZvciBpbnRlbCBzY3UgaXBjIik7CitNT0RVTEVfQVVUSE9SKCJTcmVlZGhhcmEgPHNyZWVkaGFyYS5kc0BpbnRlbC5jb20+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9zb255LWxhcHRvcC5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvc29ueS1sYXB0b3AuYwppbmRleCBmMjAwNjc3Li5iNGE5NWJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9zb255LWxhcHRvcC5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L3NvbnktbGFwdG9wLmMKQEAgLTIzNSw2ICsyMzUsNyBAQAogCTU3LAkvKiA3MCBTT05ZUElfRVZFTlRfVk9MVU1FX0RFQ19QUkVTU0VEICovCiAJLTEsCS8qIDcxIFNPTllQSV9FVkVOVF9CUklHSFRORVNTX1BSRVNTRUQgKi8KIAk1OCwJLyogNzIgU09OWVBJX0VWRU5UX01FRElBX1BSRVNTRUQgKi8KKwk1OSwJLyogNzIgU09OWVBJX0VWRU5UX1ZFTkRPUl9QUkVTU0VEICovCiB9OwogCiBzdGF0aWMgaW50IHNvbnlfbGFwdG9wX2lucHV0X2tleWNvZGVfbWFwW10gPSB7CkBAIC0yOTcsNiArMjk4LDcgQEAKIAlLRVlfVk9MVU1FVVAsCS8qIDU2IFNPTllQSV9FVkVOVF9WT0xVTUVfSU5DX1BSRVNTRUQgKi8KIAlLRVlfVk9MVU1FRE9XTiwJLyogNTcgU09OWVBJX0VWRU5UX1ZPTFVNRV9ERUNfUFJFU1NFRCAqLwogCUtFWV9NRURJQSwJLyogNTggU09OWVBJX0VWRU5UX01FRElBX1BSRVNTRUQgKi8KKwlLRVlfVkVORE9SLAkvKiA1OSBTT05ZUElfRVZFTlRfVkVORE9SX1BSRVNTRUQgKi8KIH07CiAKIC8qIHJlbGVhc2UgYnV0dG9ucyBhZnRlciBhIHNob3J0IGRlbGF5IGlmIHByZXNzZWQgKi8KQEAgLTg5NCwxMCArODk2LDE4IEBACiAJeyAweDBBLCBTT05ZUElfRVZFTlRfRk5LRVlfUkVMRUFTRUQgfSwKIAl7IDB4OEMsIFNPTllQSV9FVkVOVF9GTktFWV9GMTIgfSwKIAl7IDB4MEMsIFNPTllQSV9FVkVOVF9GTktFWV9SRUxFQVNFRCB9LAorCXsgMHg5ZCwgU09OWVBJX0VWRU5UX1pPT01fUFJFU1NFRCB9LAorCXsgMHgxZCwgU09OWVBJX0VWRU5UX0FOWUJVVFRPTl9SRUxFQVNFRCB9LAogCXsgMHg5ZiwgU09OWVBJX0VWRU5UX0NEX0VKRUNUX1BSRVNTRUQgfSwKIAl7IDB4MWYsIFNPTllQSV9FVkVOVF9BTllCVVRUT05fUkVMRUFTRUQgfSwKIAl7IDB4YTEsIFNPTllQSV9FVkVOVF9NRURJQV9QUkVTU0VEIH0sCiAJeyAweDIxLCBTT05ZUElfRVZFTlRfQU5ZQlVUVE9OX1JFTEVBU0VEIH0sCisJeyAweGE0LCBTT05ZUElfRVZFTlRfQ0RfRUpFQ1RfUFJFU1NFRCB9LAorCXsgMHgyNCwgU09OWVBJX0VWRU5UX0FOWUJVVFRPTl9SRUxFQVNFRCB9LAorCXsgMHhhNSwgU09OWVBJX0VWRU5UX1ZFTkRPUl9QUkVTU0VEIH0sCisJeyAweDI1LCBTT05ZUElfRVZFTlRfQU5ZQlVUVE9OX1JFTEVBU0VEIH0sCisJeyAweGE2LCBTT05ZUElfRVZFTlRfSEVMUF9QUkVTU0VEIH0sCisJeyAweDI2LCBTT05ZUElfRVZFTlRfQU5ZQlVUVE9OX1JFTEVBU0VEIH0sCiAJeyAwLCAwIH0sCiB9OwogCkBAIC0xMTMxLDcgKzExNDEsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB2b2lkIHNvbnlfbmNfcmZraWxsX3VwZGF0ZSgpCitzdGF0aWMgdm9pZCBzb255X25jX3Jma2lsbF91cGRhdGUodm9pZCkKIHsKIAllbnVtIHNvbnlfbmNfcmZraWxsIGk7CiAJaW50IHJlc3VsdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L3RoaW5rcGFkX2FjcGkuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L3RoaW5rcGFkX2FjcGkuYwppbmRleCBlOGMyMTk5Li5hOTc0Y2EzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni90aGlua3BhZF9hY3BpLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvdGhpbmtwYWRfYWNwaS5jCkBAIC01ODksNiArNTg5LDcgQEAKIAkJZGVmYXVsdDoKIAkJCXByaW50ayhUUEFDUElfRVJSICJhY3BpX2V2YWxmKCkgY2FsbGVkICIKIAkJCSAgICAgICAid2l0aCBpbnZhbGlkIGZvcm1hdCBjaGFyYWN0ZXIgJyVjJ1xuIiwgYyk7CisJCQl2YV9lbmQoYXApOwogCQkJcmV0dXJuIDA7CiAJCX0KIAl9CkBAIC02MzQ1LDcgKzYzNDYsNyBAQAogCQkJImFzIGNoYW5nZSBub3RpZmljYXRpb25cbiIpOwogCXRwYWNwaV9ob3RrZXlfZHJpdmVyX21hc2tfc2V0KGhvdGtleV9kcml2ZXJfbWFzawogCQkJCXwgVFBfQUNQSV9IS0VZX0JSR0hUVVBfTUFTSwotCQkJCXwgVFBfQUNQSV9IS0VZX0JSR0hURFdOX01BU0spOzsKKwkJCQl8IFRQX0FDUElfSEtFWV9CUkdIVERXTl9NQVNLKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvd21pLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni93bWkuYwppbmRleCBhZWNkOWE5Li4wNWNjNzk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni93bWkuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni93bWkuYwpAQCAtNTQ5LDIxICs1NDksMzQgQEAKIHdtaV9ub3RpZnlfaGFuZGxlciBoYW5kbGVyLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCB3bWlfYmxvY2sgKmJsb2NrOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9OT1RfRVhJU1Q7CisJY2hhciB0bXBbMTZdLCBndWlkX2lucHV0WzE2XTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOwogCiAJaWYgKCFndWlkIHx8ICFoYW5kbGVyKQogCQlyZXR1cm4gQUVfQkFEX1BBUkFNRVRFUjsKIAotCWlmICghZmluZF9ndWlkKGd1aWQsICZibG9jaykpCi0JCXJldHVybiBBRV9OT1RfRVhJU1Q7CisJd21pX3BhcnNlX2d1aWQoZ3VpZCwgdG1wKTsKKwl3bWlfc3dhcF9ieXRlcyh0bXAsIGd1aWRfaW5wdXQpOwogCi0JaWYgKGJsb2NrLT5oYW5kbGVyICYmIGJsb2NrLT5oYW5kbGVyICE9IHdtaV9ub3RpZnlfZGVidWcpCi0JCXJldHVybiBBRV9BTFJFQURZX0FDUVVJUkVEOworCWxpc3RfZm9yX2VhY2gocCwgJndtaV9ibG9ja19saXN0KSB7CisJCWFjcGlfc3RhdHVzIHdtaV9zdGF0dXM7CisJCWJsb2NrID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3Qgd21pX2Jsb2NrLCBsaXN0KTsKIAotCWJsb2NrLT5oYW5kbGVyID0gaGFuZGxlcjsKLQlibG9jay0+aGFuZGxlcl9kYXRhID0gZGF0YTsKKwkJaWYgKG1lbWNtcChibG9jay0+Z2Jsb2NrLmd1aWQsIGd1aWRfaW5wdXQsIDE2KSA9PSAwKSB7CisJCQlpZiAoYmxvY2stPmhhbmRsZXIgJiYKKwkJCSAgICBibG9jay0+aGFuZGxlciAhPSB3bWlfbm90aWZ5X2RlYnVnKQorCQkJCXJldHVybiBBRV9BTFJFQURZX0FDUVVJUkVEOwogCi0Jc3RhdHVzID0gd21pX21ldGhvZF9lbmFibGUoYmxvY2ssIDEpOworCQkJYmxvY2stPmhhbmRsZXIgPSBoYW5kbGVyOworCQkJYmxvY2stPmhhbmRsZXJfZGF0YSA9IGRhdGE7CisKKwkJCXdtaV9zdGF0dXMgPSB3bWlfbWV0aG9kX2VuYWJsZShibG9jaywgMSk7CisJCQlpZiAoKHdtaV9zdGF0dXMgIT0gQUVfT0spIHx8CisJCQkgICAgKCh3bWlfc3RhdHVzID09IEFFX09LKSAmJiAoc3RhdHVzID09IEFFX05PVF9FWElTVCkpKQorCQkJCXN0YXR1cyA9IHdtaV9zdGF0dXM7CisJCX0KKwl9CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtNTc3LDI0ICs1OTAsNDAgQEAKIGFjcGlfc3RhdHVzIHdtaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIoY29uc3QgY2hhciAqZ3VpZCkKIHsKIAlzdHJ1Y3Qgd21pX2Jsb2NrICpibG9jazsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9OT1RfRVhJU1Q7CisJY2hhciB0bXBbMTZdLCBndWlkX2lucHV0WzE2XTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOwogCiAJaWYgKCFndWlkKQogCQlyZXR1cm4gQUVfQkFEX1BBUkFNRVRFUjsKIAotCWlmICghZmluZF9ndWlkKGd1aWQsICZibG9jaykpCi0JCXJldHVybiBBRV9OT1RfRVhJU1Q7CisJd21pX3BhcnNlX2d1aWQoZ3VpZCwgdG1wKTsKKwl3bWlfc3dhcF9ieXRlcyh0bXAsIGd1aWRfaW5wdXQpOwogCi0JaWYgKCFibG9jay0+aGFuZGxlciB8fCBibG9jay0+aGFuZGxlciA9PSB3bWlfbm90aWZ5X2RlYnVnKQotCQlyZXR1cm4gQUVfTlVMTF9FTlRSWTsKKwlsaXN0X2Zvcl9lYWNoKHAsICZ3bWlfYmxvY2tfbGlzdCkgeworCQlhY3BpX3N0YXR1cyB3bWlfc3RhdHVzOworCQlibG9jayA9IGxpc3RfZW50cnkocCwgc3RydWN0IHdtaV9ibG9jaywgbGlzdCk7CiAKLQlpZiAoZGVidWdfZXZlbnQpIHsKLQkJYmxvY2stPmhhbmRsZXIgPSB3bWlfbm90aWZ5X2RlYnVnOwotCX0gZWxzZSB7Ci0JCXN0YXR1cyA9IHdtaV9tZXRob2RfZW5hYmxlKGJsb2NrLCAwKTsKLQkJYmxvY2stPmhhbmRsZXIgPSBOVUxMOwotCQlibG9jay0+aGFuZGxlcl9kYXRhID0gTlVMTDsKKwkJaWYgKG1lbWNtcChibG9jay0+Z2Jsb2NrLmd1aWQsIGd1aWRfaW5wdXQsIDE2KSA9PSAwKSB7CisJCQlpZiAoIWJsb2NrLT5oYW5kbGVyIHx8CisJCQkgICAgYmxvY2stPmhhbmRsZXIgPT0gd21pX25vdGlmeV9kZWJ1ZykKKwkJCQlyZXR1cm4gQUVfTlVMTF9FTlRSWTsKKworCQkJaWYgKGRlYnVnX2V2ZW50KSB7CisJCQkJYmxvY2stPmhhbmRsZXIgPSB3bWlfbm90aWZ5X2RlYnVnOworCQkJCXN0YXR1cyA9IEFFX09LOworCQkJfSBlbHNlIHsKKwkJCQl3bWlfc3RhdHVzID0gd21pX21ldGhvZF9lbmFibGUoYmxvY2ssIDApOworCQkJCWJsb2NrLT5oYW5kbGVyID0gTlVMTDsKKwkJCQlibG9jay0+aGFuZGxlcl9kYXRhID0gTlVMTDsKKwkJCQlpZiAoKHdtaV9zdGF0dXMgIT0gQUVfT0spIHx8CisJCQkJICAgICgod21pX3N0YXR1cyA9PSBBRV9PSykgJiYKKwkJCQkgICAgIChzdGF0dXMgPT0gQUVfTk9UX0VYSVNUKSkpCisJCQkJCXN0YXR1cyA9IHdtaV9zdGF0dXM7CisJCQl9CisJCX0KIAl9CisKIAlyZXR1cm4gc3RhdHVzOwogfQogRVhQT1JUX1NZTUJPTF9HUEwod21pX3JlbW92ZV9ub3RpZnlfaGFuZGxlcik7CkBAIC03MDUsMjIgKzczNCwxMSBAQAogCS5kZXZfYXR0cnMgPSB3bWlfZGV2X2F0dHJzLAogfTsKIAotc3RhdGljIHN0cnVjdCB3bWlfYmxvY2sgKndtaV9jcmVhdGVfZGV2aWNlKGNvbnN0IHN0cnVjdCBndWlkX2Jsb2NrICpnYmxvY2ssCi0JCQkJCSAgIGFjcGlfaGFuZGxlIGhhbmRsZSkKK3N0YXRpYyBpbnQgd21pX2NyZWF0ZV9kZXZpY2UoY29uc3Qgc3RydWN0IGd1aWRfYmxvY2sgKmdibG9jaywKKwkJCSAgICAgc3RydWN0IHdtaV9ibG9jayAqd2Jsb2NrLCBhY3BpX2hhbmRsZSBoYW5kbGUpCiB7Ci0Jc3RydWN0IHdtaV9ibG9jayAqd2Jsb2NrOwotCWludCBlcnJvcjsKIAljaGFyIGd1aWRfc3RyaW5nWzM3XTsKIAotCXdibG9jayA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB3bWlfYmxvY2spLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXdibG9jaykgewotCQllcnJvciA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX291dDsKLQl9Ci0KLQl3YmxvY2stPmhhbmRsZSA9IGhhbmRsZTsKLQl3YmxvY2stPmdibG9jayA9ICpnYmxvY2s7Ci0KIAl3YmxvY2stPmRldi5jbGFzcyA9ICZ3bWlfY2xhc3M7CiAKIAl3bWlfZ3RvYShnYmxvY2stPmd1aWQsIGd1aWRfc3RyaW5nKTsKQEAgLTcyOCwxNyArNzQ2LDcgQEAKIAogCWRldl9zZXRfZHJ2ZGF0YSgmd2Jsb2NrLT5kZXYsIHdibG9jayk7CiAKLQllcnJvciA9IGRldmljZV9yZWdpc3Rlcigmd2Jsb2NrLT5kZXYpOwotCWlmIChlcnJvcikKLQkJZ290byBlcnJfZnJlZTsKLQotCWxpc3RfYWRkX3RhaWwoJndibG9jay0+bGlzdCwgJndtaV9ibG9ja19saXN0KTsKLQlyZXR1cm4gd2Jsb2NrOwotCi1lcnJfZnJlZToKLQlrZnJlZSh3YmxvY2spOwotZXJyX291dDoKLQlyZXR1cm4gRVJSX1BUUihlcnJvcik7CisJcmV0dXJuIGRldmljZV9yZWdpc3Rlcigmd2Jsb2NrLT5kZXYpOwogfQogCiBzdGF0aWMgdm9pZCB3bWlfZnJlZV9kZXZpY2VzKHZvaWQpCkBAIC03NDcsNyArNzU1LDggQEAKIAogCS8qIERlbGV0ZSBkZXZpY2VzIGZvciBhbGwgdGhlIEdVSURzICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHdibG9jaywgbmV4dCwgJndtaV9ibG9ja19saXN0LCBsaXN0KQotCQlkZXZpY2VfdW5yZWdpc3Rlcigmd2Jsb2NrLT5kZXYpOworCQlpZiAod2Jsb2NrLT5kZXYuY2xhc3MpCisJCQlkZXZpY2VfdW5yZWdpc3Rlcigmd2Jsb2NrLT5kZXYpOwogfQogCiBzdGF0aWMgYm9vbCBndWlkX2FscmVhZHlfcGFyc2VkKGNvbnN0IGNoYXIgKmd1aWRfc3RyaW5nKQpAQCAtNzcwLDcgKzc3OSw2IEBACiAJdW5pb24gYWNwaV9vYmplY3QgKm9iajsKIAljb25zdCBzdHJ1Y3QgZ3VpZF9ibG9jayAqZ2Jsb2NrOwogCXN0cnVjdCB3bWlfYmxvY2sgKndibG9jazsKLQljaGFyIGd1aWRfc3RyaW5nWzM3XTsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJaW50IHJldHZhbDsKIAl1MzIgaSwgdG90YWw7CkBAIC03OTIsMjkgKzgwMCwzMiBAQAogCXRvdGFsID0gb2JqLT5idWZmZXIubGVuZ3RoIC8gc2l6ZW9mKHN0cnVjdCBndWlkX2Jsb2NrKTsKIAogCWZvciAoaSA9IDA7IGkgPCB0b3RhbDsgaSsrKSB7Ci0JCS8qCi0JCSAgU29tZSBXTUkgZGV2aWNlcywgbGlrZSB0aG9zZSBmb3IgblZpZGlhIGhvb2tzLCBoYXZlIGEKLQkJICBkdXBsaWNhdGUgR1VJRC4gSXQncyBub3QgY2xlYXIgd2hhdCB3ZSBzaG91bGQgZG8gaW4gdGhpcwotCQkgIGNhc2UgeWV0LCBzbyBmb3Igbm93LCB3ZSdsbCBqdXN0IGlnbm9yZSB0aGUgZHVwbGljYXRlLgotCQkgIEFueW9uZSB3aG8gd2FudHMgdG8gYWRkIHN1cHBvcnQgZm9yIHRoYXQgZGV2aWNlIGNhbiBjb21lCi0JCSAgdXAgd2l0aCBhIGJldHRlciB3b3JrYXJvdW5kIGZvciB0aGUgbWVzcyB0aGVuLgotCQkqLwotCQlpZiAoZ3VpZF9hbHJlYWR5X3BhcnNlZChnYmxvY2tbaV0uZ3VpZCkgPT0gdHJ1ZSkgewotCQkJd21pX2d0b2EoZ2Jsb2NrW2ldLmd1aWQsIGd1aWRfc3RyaW5nKTsKLQkJCXByX2luZm8oIlNraXBwaW5nIGR1cGxpY2F0ZSBHVUlEICVzXG4iLCBndWlkX3N0cmluZyk7Ci0JCQljb250aW51ZTsKLQkJfQotCiAJCWlmIChkZWJ1Z19kdW1wX3dkZykKIAkJCXdtaV9kdW1wX3dkZygmZ2Jsb2NrW2ldKTsKIAotCQl3YmxvY2sgPSB3bWlfY3JlYXRlX2RldmljZSgmZ2Jsb2NrW2ldLCBoYW5kbGUpOwotCQlpZiAoSVNfRVJSKHdibG9jaykpIHsKLQkJCXJldHZhbCA9IFBUUl9FUlIod2Jsb2NrKTsKLQkJCXdtaV9mcmVlX2RldmljZXMoKTsKLQkJCWJyZWFrOworCQl3YmxvY2sgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgd21pX2Jsb2NrKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghd2Jsb2NrKQorCQkJcmV0dXJuIEFFX05PX01FTU9SWTsKKworCQl3YmxvY2stPmhhbmRsZSA9IGhhbmRsZTsKKwkJd2Jsb2NrLT5nYmxvY2sgPSBnYmxvY2tbaV07CisKKwkJLyoKKwkJICBTb21lIFdNSSBkZXZpY2VzLCBsaWtlIHRob3NlIGZvciBuVmlkaWEgaG9va3MsIGhhdmUgYQorCQkgIGR1cGxpY2F0ZSBHVUlELiBJdCdzIG5vdCBjbGVhciB3aGF0IHdlIHNob3VsZCBkbyBpbiB0aGlzCisJCSAgY2FzZSB5ZXQsIHNvIGZvciBub3csIHdlJ2xsIGp1c3QgaWdub3JlIHRoZSBkdXBsaWNhdGUKKwkJICBmb3IgZGV2aWNlIGNyZWF0aW9uLgorCQkqLworCQlpZiAoIWd1aWRfYWxyZWFkeV9wYXJzZWQoZ2Jsb2NrW2ldLmd1aWQpKSB7CisJCQlyZXR2YWwgPSB3bWlfY3JlYXRlX2RldmljZSgmZ2Jsb2NrW2ldLCB3YmxvY2ssIGhhbmRsZSk7CisJCQlpZiAocmV0dmFsKSB7CisJCQkJd21pX2ZyZWVfZGV2aWNlcygpOworCQkJCWdvdG8gb3V0X2ZyZWVfcG9pbnRlcjsKKwkJCX0KIAkJfQogCisJCWxpc3RfYWRkX3RhaWwoJndibG9jay0+bGlzdCwgJndtaV9ibG9ja19saXN0KTsKKwogCQlpZiAoZGVidWdfZXZlbnQpIHsKIAkJCXdibG9jay0+aGFuZGxlciA9IHdtaV9ub3RpZnlfZGVidWc7CiAJCQl3bWlfbWV0aG9kX2VuYWJsZSh3YmxvY2ssIDEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV9jbGFzcy5oIGIvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV9jbGFzcy5oCmluZGV4IDcwN2I3ZjQuLjllMzI3ODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfY2xhc3MuaAorKysgYi9kcml2ZXJzL3MzOTAvY2hhci90YXBlX2NsYXNzLmgKQEAgLTE0LDcgKzE0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+Ci0jaW5jbHVkZSA8bGludXgva29iamVjdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tvYmpfbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvY2Rldi5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NidXMvY2hhci9qc2ZsYXNoLmMgYi9kcml2ZXJzL3NidXMvY2hhci9qc2ZsYXNoLmMKaW5kZXggYTYyNGY1YS4uZTg1NjYyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zYnVzL2NoYXIvanNmbGFzaC5jCisrKyBiL2RyaXZlcnMvc2J1cy9jaGFyL2pzZmxhc2guYwpAQCAtNDY3LDcgKzQ2Nyw3IEBACiAKIAlub2RlID0gcHJvbV9nZXRjaGlsZChwcm9tX3Jvb3Rfbm9kZSk7CiAJbm9kZSA9IHByb21fc2VhcmNoc2libGluZ3Mobm9kZSwgImZsYXNoLW1lbW9yeSIpOwotCWlmIChub2RlICE9IDAgJiYgbm9kZSAhPSAtMSkgeworCWlmIChub2RlICE9IDAgJiYgKHMzMilub2RlICE9IC0xKSB7CiAJCWlmIChwcm9tX2dldHByb3BlcnR5KG5vZGUsICJyZWciLAogCQkgICAgKGNoYXIgKikmcmVnMCwgc2l6ZW9mKHJlZzApKSA9PSAtMSkgewogCQkJcHJpbnRrKCJqc2ZsYXNoOiBubyBcInJlZ1wiIHByb3BlcnR5XG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pcHIuYyBiL2RyaXZlcnMvc2NzaS9pcHIuYwppbmRleCBkZTJlMDllLi5kM2M1OTA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaXByLmMKKysrIGIvZHJpdmVycy9zY3NpL2lwci5jCkBAIC01NzQ4LDcgKzU3NDgsNyBAQAogCX0KIAogCWlmIChpcHJfaXNfZ2F0YShyZXMpICYmIHJlcy0+c2F0YV9wb3J0KQotCQlyZXR1cm4gYXRhX3Nhc19xdWV1ZWNtZChzY3NpX2NtZCwgZG9uZSwgcmVzLT5zYXRhX3BvcnQtPmFwKTsKKwkJcmV0dXJuIGF0YV9zYXNfcXVldWVjbWQoc2NzaV9jbWQsIHJlcy0+c2F0YV9wb3J0LT5hcCk7CiAKIAlpcHJfY21kID0gaXByX2dldF9mcmVlX2lwcl9jbW5kKGlvYV9jZmcpOwogCWlvYXJjYiA9ICZpcHJfY21kLT5pb2FyY2I7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19zY3NpX2hvc3QuYyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX3Njc2lfaG9zdC5jCmluZGV4IDI5MjUxZmEuLjU4MTVjYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX3Njc2lfaG9zdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX3Njc2lfaG9zdC5jCkBAIC0yMTEsOCArMjExLDcgQEAKIAkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkJCXNwaW5fbG9ja19pcnFzYXZlKGRldi0+c2F0YV9kZXYuYXAtPmxvY2ssIGZsYWdzKTsKLQkJCXJlcyA9IGF0YV9zYXNfcXVldWVjbWQoY21kLCBzY3NpX2RvbmUsCi0JCQkJCSAgICAgICBkZXYtPnNhdGFfZGV2LmFwKTsKKwkJCXJlcyA9IGF0YV9zYXNfcXVldWVjbWQoY21kLCBkZXYtPnNhdGFfZGV2LmFwKTsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZGV2LT5zYXRhX2Rldi5hcC0+bG9jaywgZmxhZ3MpOwogCQkJZ290byBvdXQ7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL0tjb25maWcgYi9kcml2ZXJzL3NlcmlhbC9LY29uZmlnCmluZGV4IGNlMzkzNTcuLmMxZGY3NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL0tjb25maWcKKysrIGIvZHJpdmVycy9zZXJpYWwvS2NvbmZpZwpAQCAtMTM1MCw3ICsxMzUwLDcgQEAKIAogY29uZmlnIFNFUklBTF9PRl9QTEFURk9STQogCXRyaXN0YXRlICJTZXJpYWwgcG9ydCBvbiBPcGVuIEZpcm13YXJlIHBsYXRmb3JtIGJ1cyIKLQlkZXBlbmRzIG9uIFBQQ19PRiB8fCBNSUNST0JMQVpFCisJZGVwZW5kcyBvbiBPRgogCWRlcGVuZHMgb24gU0VSSUFMXzgyNTAgfHwgU0VSSUFMX09GX1BMQVRGT1JNX05XUFNFUklBTAogCWhlbHAKIAkgIElmIHlvdSBoYXZlIGEgUG93ZXJQQyBiYXNlZCBzeXN0ZW0gdGhhdCBoYXMgc2VyaWFsIHBvcnRzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9vZl9zZXJpYWwuYyBiL2RyaXZlcnMvc2VyaWFsL29mX3NlcmlhbC5jCmluZGV4IDE3ODQ5ZGMuLjVjN2FiZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL29mX3NlcmlhbC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL29mX3NlcmlhbC5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPGxpbnV4L253cHNlcmlhbC5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NoL2Nsay9jb3JlLmMgYi9kcml2ZXJzL3NoL2Nsay9jb3JlLmMKaW5kZXggM2Y1ZTM4Ny4uNWY2M2MzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zaC9jbGsvY29yZS5jCisrKyBiL2RyaXZlcnMvc2gvY2xrL2NvcmUuYwpAQCAtMjEsNyArMjEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLmMgYi9kcml2ZXJzL3NwaS9zcGkuYwppbmRleCBiMDJkMGNiLi4zNGJiMTdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGkuYworKysgYi9kcml2ZXJzL3NwaS9zcGkuYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZF9kZXZpY2V0YWJsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAKIHN0YXRpYyB2b2lkIHNwaWRldl9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKQEAgLTEwMCw5ICsxMDEsOCBAQAogCXJldHVybiAwOwogfQogCi0jaWZkZWYJQ09ORklHX1BNCi0KLXN0YXRpYyBpbnQgc3BpX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKK3N0YXRpYyBpbnQgc3BpX2xlZ2FjeV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCiB7CiAJaW50CQkJdmFsdWUgPSAwOwogCXN0cnVjdCBzcGlfZHJpdmVyCSpkcnYgPSB0b19zcGlfZHJpdmVyKGRldi0+ZHJpdmVyKTsKQEAgLTExNyw3ICsxMTcsNyBAQAogCXJldHVybiB2YWx1ZTsKIH0KIAotc3RhdGljIGludCBzcGlfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgc3BpX2xlZ2FjeV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewogCWludAkJCXZhbHVlID0gMDsKIAlzdHJ1Y3Qgc3BpX2RyaXZlcgkqZHJ2ID0gdG9fc3BpX2RyaXZlcihkZXYtPmRyaXZlcik7CkBAIC0xMzIsMTggKzEzMiw5NCBAQAogCXJldHVybiB2YWx1ZTsKIH0KIAorc3RhdGljIGludCBzcGlfcG1fc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgKnBtID0gZGV2LT5kcml2ZXIgPyBkZXYtPmRyaXZlci0+cG0gOiBOVUxMOworCisJaWYgKHBtKQorCQlyZXR1cm4gcG1fZ2VuZXJpY19zdXNwZW5kKGRldik7CisJZWxzZQorCQlyZXR1cm4gc3BpX2xlZ2FjeV9zdXNwZW5kKGRldiwgUE1TR19TVVNQRU5EKTsKK30KKworc3RhdGljIGludCBzcGlfcG1fcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwljb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyAqcG0gPSBkZXYtPmRyaXZlciA/IGRldi0+ZHJpdmVyLT5wbSA6IE5VTEw7CisKKwlpZiAocG0pCisJCXJldHVybiBwbV9nZW5lcmljX3Jlc3VtZShkZXYpOworCWVsc2UKKwkJcmV0dXJuIHNwaV9sZWdhY3lfcmVzdW1lKGRldik7Cit9CisKK3N0YXRpYyBpbnQgc3BpX3BtX2ZyZWV6ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgKnBtID0gZGV2LT5kcml2ZXIgPyBkZXYtPmRyaXZlci0+cG0gOiBOVUxMOworCisJaWYgKHBtKQorCQlyZXR1cm4gcG1fZ2VuZXJpY19mcmVlemUoZGV2KTsKKwllbHNlCisJCXJldHVybiBzcGlfbGVnYWN5X3N1c3BlbmQoZGV2LCBQTVNHX0ZSRUVaRSk7Cit9CisKK3N0YXRpYyBpbnQgc3BpX3BtX3RoYXcoc3RydWN0IGRldmljZSAqZGV2KQoreworCWNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzICpwbSA9IGRldi0+ZHJpdmVyID8gZGV2LT5kcml2ZXItPnBtIDogTlVMTDsKKworCWlmIChwbSkKKwkJcmV0dXJuIHBtX2dlbmVyaWNfdGhhdyhkZXYpOworCWVsc2UKKwkJcmV0dXJuIHNwaV9sZWdhY3lfcmVzdW1lKGRldik7Cit9CisKK3N0YXRpYyBpbnQgc3BpX3BtX3Bvd2Vyb2ZmKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwljb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyAqcG0gPSBkZXYtPmRyaXZlciA/IGRldi0+ZHJpdmVyLT5wbSA6IE5VTEw7CisKKwlpZiAocG0pCisJCXJldHVybiBwbV9nZW5lcmljX3Bvd2Vyb2ZmKGRldik7CisJZWxzZQorCQlyZXR1cm4gc3BpX2xlZ2FjeV9zdXNwZW5kKGRldiwgUE1TR19ISUJFUk5BVEUpOworfQorCitzdGF0aWMgaW50IHNwaV9wbV9yZXN0b3JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwljb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyAqcG0gPSBkZXYtPmRyaXZlciA/IGRldi0+ZHJpdmVyLT5wbSA6IE5VTEw7CisKKwlpZiAocG0pCisJCXJldHVybiBwbV9nZW5lcmljX3Jlc3RvcmUoZGV2KTsKKwllbHNlCisJCXJldHVybiBzcGlfbGVnYWN5X3Jlc3VtZShkZXYpOworfQogI2Vsc2UKLSNkZWZpbmUgc3BpX3N1c3BlbmQJTlVMTAotI2RlZmluZSBzcGlfcmVzdW1lCU5VTEwKKyNkZWZpbmUgc3BpX3BtX3N1c3BlbmQJTlVMTAorI2RlZmluZSBzcGlfcG1fcmVzdW1lCU5VTEwKKyNkZWZpbmUgc3BpX3BtX2ZyZWV6ZQlOVUxMCisjZGVmaW5lIHNwaV9wbV90aGF3CU5VTEwKKyNkZWZpbmUgc3BpX3BtX3Bvd2Vyb2ZmCU5VTEwKKyNkZWZpbmUgc3BpX3BtX3Jlc3RvcmUJTlVMTAogI2VuZGlmCiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBzcGlfcG0gPSB7CisJLnN1c3BlbmQgPSBzcGlfcG1fc3VzcGVuZCwKKwkucmVzdW1lID0gc3BpX3BtX3Jlc3VtZSwKKwkuZnJlZXplID0gc3BpX3BtX2ZyZWV6ZSwKKwkudGhhdyA9IHNwaV9wbV90aGF3LAorCS5wb3dlcm9mZiA9IHNwaV9wbV9wb3dlcm9mZiwKKwkucmVzdG9yZSA9IHNwaV9wbV9yZXN0b3JlLAorCVNFVF9SVU5USU1FX1BNX09QUygKKwkJcG1fZ2VuZXJpY19ydW50aW1lX3N1c3BlbmQsCisJCXBtX2dlbmVyaWNfcnVudGltZV9yZXN1bWUsCisJCXBtX2dlbmVyaWNfcnVudGltZV9pZGxlCisJKQorfTsKKwogc3RydWN0IGJ1c190eXBlIHNwaV9idXNfdHlwZSA9IHsKIAkubmFtZQkJPSAic3BpIiwKIAkuZGV2X2F0dHJzCT0gc3BpX2Rldl9hdHRycywKIAkubWF0Y2gJCT0gc3BpX21hdGNoX2RldmljZSwKIAkudWV2ZW50CQk9IHNwaV91ZXZlbnQsCi0JLnN1c3BlbmQJPSBzcGlfc3VzcGVuZCwKLQkucmVzdW1lCQk9IHNwaV9yZXN1bWUsCisJLnBtCQk9ICZzcGlfcG0sCiB9OwogRVhQT1JUX1NZTUJPTF9HUEwoc3BpX2J1c190eXBlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvS2NvbmZpZwppbmRleCBiZGM2MzJiNi4uZTJkNTg2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL0tjb25maWcKQEAgLTExOSw2ICsxMTksOCBAQAogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9tZW1yYXIvS2NvbmZpZyIKIAorc291cmNlICJkcml2ZXJzL3N0YWdpbmcvc2VwL0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2lpby9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy96cmFtL0tjb25maWciCkBAIC0xMjcsOCArMTI5LDYgQEAKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvS2NvbmZpZyIKIAotc291cmNlICJkcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9LY29uZmlnIgotCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9zYW1zdW5nLWxhcHRvcC9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9zbTd4eC9LY29uZmlnIgpAQCAtMTQxLDggKzE0MSw2IEBACiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3RpLXN0L0tjb25maWciCiAKLXNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2FkaXMxNjI1NS9LY29uZmlnIgotCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy94Z2lmYi9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9tc20vS2NvbmZpZyIKQEAgLTE3NSw1ICsxNzMsOSBAQAogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9zcGVha3VwL0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2NwdG0xMjE3L0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3N0ZV9ybWk0L0tjb25maWciCisKIGVuZGlmICMgIVNUQUdJTkdfRVhDTFVERV9CVUlMRAogZW5kaWYgIyBTVEFHSU5HCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvTWFrZWZpbGUKaW5kZXggM2VkYTVjNy4uYzdkMjIyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9NYWtlZmlsZQpAQCAtNDIsMTggKzQyLDE3IEBACiBvYmotJChDT05GSUdfSFlQRVJWKQkJKz0gaHYvCiBvYmotJChDT05GSUdfVk1FX0JVUykJCSs9IHZtZS8KIG9iai0kKENPTkZJR19NUlNUX1JBUl9IQU5ETEVSKQkrPSBtZW1yYXIvCitvYmotJChDT05GSUdfRFhfU0VQKSAgICAgICAgICAgICs9IHNlcC8KIG9iai0kKENPTkZJR19JSU8pCQkrPSBpaW8vCiBvYmotJChDT05GSUdfWlJBTSkJCSs9IHpyYW0vCiBvYmotJChDT05GSUdfV0xBR1M0OV9IMikJKz0gd2xhZ3M0OV9oMi8KIG9iai0kKENPTkZJR19XTEFHUzQ5X0gyNSkJKz0gd2xhZ3M0OV9oMjUvCi1vYmotJChDT05GSUdfQkFUTUFOX0FEVikJKz0gYmF0bWFuLWFkdi8KIG9iai0kKENPTkZJR19TQU1TVU5HX0xBUFRPUCkJKz0gc2Ftc3VuZy1sYXB0b3AvCiBvYmotJChDT05GSUdfRkJfU003WFgpCQkrPSBzbTd4eC8KIG9iai0kKENPTkZJR19WSURFT19EVDMxNTUpCSs9IGR0MzE1NXY0bC8KIG9iai0kKENPTkZJR19DUllTVEFMSEQpCQkrPSBjcnlzdGFsaGQvCiBvYmotJChDT05GSUdfQ1hUMUUxKQkJKz0gY3h0MWUxLwogb2JqLSQoQ09ORklHX1RJX1NUKQkJKz0gdGktc3QvCi1vYmotJChDT05GSUdfQURJUzE2MjU1KQkJKz0gYWRpczE2MjU1Lwogb2JqLSQoQ09ORklHX0ZCX1hHSSkJCSs9IHhnaWZiLwogb2JqLSQoQ09ORklHX01TTV9TVEFHSU5HKQkrPSBtc20vCiBvYmotJChDT05GSUdfRUFTWUNBUCkJCSs9IGVhc3ljYXAvCkBAIC02OCwzICs2Nyw1IEBACiBvYmotJChDT05GSUdfRlQxMDAwKQkJKz0gZnQxMDAwLwogb2JqLSQoQ09ORklHX1NORF9JTlRFTF9TU1QpCQkrPSBpbnRlbF9zc3QvCiBvYmotJChDT05GSUdfU1BFQUtVUCkJKz0gc3BlYWt1cC8KK29iai0kKENPTkZJR19UT1VDSFNDUkVFTl9DTEVBUlBBRF9UTTEyMTcpCSs9IGNwdG0xMjE3Lworb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX1NZTkFQVElDU19JMkNfUk1JNCkJKz0gc3RlX3JtaTQvCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWRpczE2MjU1L0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvYWRpczE2MjU1L0tjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ODNjMWYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FkaXMxNjI1NS9LY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotY29uZmlnIEFESVMxNjI1NQotCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRElTMTYyNTAvMTYyNTUiCi0JZGVwZW5kcyBvbiBTUEkgJiYgU1lTRlMKLQktLS1oZWxwLS0tCi0JSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBBbmFsb2cgRGV2aWNlcwotCUFESVMxNjI1MC8xNjI1NSBMb3cgUG93ZXIgR3lyb3Njb3BlLiBUaGUgZHJpdmVyIGV4cG9zZXMKLQlvcmllbnRhdGlvbiBhbmQgZ3lyb3Njb3BlIHZhbHVlLCBhcyB3ZWxsIGFzIHNhbXBsZSByYXRlCi0JdG8gdGhlIHN5c2ZzLgotCi0JVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCi0Jd2lsbCBiZSBjYWxsZWQgYWRpczE2MjU1LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FkaXMxNjI1NS9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9hZGlzMTYyNTUvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMzkwODEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FkaXMxNjI1NS9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLW9iai0kKENPTkZJR19BRElTMTYyNTUpCQkrPSBhZGlzMTYyNTUubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FkaXMxNjI1NS9hZGlzMTYyNTUuYyBiL2RyaXZlcnMvc3RhZ2luZy9hZGlzMTYyNTUvYWRpczE2MjU1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNGQ3Y2IuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FkaXMxNjI1NS9hZGlzMTYyNTUuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2OCArMCwwIEBACi0vKgotICogQW5hbG9nIERldmljZXMgQURJUzE2MjUwL0FESVMxNjI1NSBMb3cgUG93ZXIgR3lyb3Njb3BlCi0gKgotICogV3JpdHRlbiBieTogTWF0dGhpYXMgQnJ1Z2dlciA8bV9icnVnZ2VyQHdlYi5kZT4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCi0gKi8KLQotLyoKLSAqIFRoZSBkcml2ZXIganVzdCBoYXMgYSBiYXJlIGludGVyZmFjZSB0byB0aGUgc3lzZnMgKHNhbXBsZSByYXRlIGluIEh6LAotICogb3JpZW50YXRpb24gKHgsIHksIHopIGFuZCBneXJvc2NvcGUgZGF0YSBpbiDCsC9zZWMuCi0gKgotICogSXQgc2hvdWxkIGJlIGFkZGVkIHRvIGlpbyBzdWJzeXN0ZW0gd2hlbiB0aGlzIGhhcyBsZWZ0IHN0YWdpbmcuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgotI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotCi0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotCi0jaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotCi0jaW5jbHVkZSAiYWRpczE2MjU1LmgiCi0KLSNkZWZpbmUgQURJU19TVEFUVVMgICAgICAgIDB4M2QKLSNkZWZpbmUgQURJU19TTVBMX1BSRF9NU0IgIDB4MzcKLSNkZWZpbmUgQURJU19TTVBMX1BSRF9MU0IgIDB4MzYKLSNkZWZpbmUgQURJU19NU0NfQ1RSTF9NU0IgIDB4MzUKLSNkZWZpbmUgQURJU19NU0NfQ1RSTF9MU0IgIDB4MzQKLSNkZWZpbmUgQURJU19HUElPX0NUUkwgICAgIDB4MzMKLSNkZWZpbmUgQURJU19BTE1fU01QTDEgICAgIDB4MjUKLSNkZWZpbmUgQURJU19BTE1fTUFHMSAgICAgIDB4MjEKLSNkZWZpbmUgQURJU19HWVJPX1NDQUxFICAgIDB4MTcKLSNkZWZpbmUgQURJU19HWVJPX09VVCAgICAgIDB4MDUKLSNkZWZpbmUgQURJU19TVVBQTFlfT1VUICAgIDB4MDMKLSNkZWZpbmUgQURJU19FTkRVUkFOQ0UgICAgIDB4MDEKLQotLyoKLSAqIGRhdGEgc3RydWN0dXJlIGZvciBldmVyeSBzZW5zb3IKLSAqCi0gKiBAZGV2OiAgICAgICBEcml2ZXIgbW9kZWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRldmljZS4KLSAqIEBzcGk6ICAgICAgIFBvaW50ZXIgdG8gdGhlIHNwaSBkZXZpY2Ugd2hpY2ggd2lsbCBtYW5hZ2UgaS9vIHRvIHNwaSBidXMuCi0gKiBAZGF0YTogICAgICBMYXN0IHJlYWQgZGF0YSBmcm9tIGRldmljZS4KLSAqIEBpcnFfYWRpczogIEdQSU8gTnVtYmVyIG9mIElSUSBzaWduYWwKLSAqIEBpcnE6ICAgICAgIGlycSBsaW5lIG1hbmFnZSBieSBrZXJuZWwKLSAqIEBuZWdhdGl2ZTogIGluZGljYXRlcyBpZiBzZW5zb3IgaXMgdXBzaWRlIGRvd24gKG5lZ2F0aXZlID09IDEpCi0gKiBAZGlyZWN0aW9uOiBpbmRpY2F0ZXMgYXhpcyAoeCwgeSwgeikgdGhlIHNlbnNvciBpcyBtZWFzc3VyaW5nCi0gKi8KLXN0cnVjdCBzcGlfYWRpczE2MjU1X2RhdGEgewotCXN0cnVjdCBkZXZpY2UgZGV2OwotCXN0cnVjdCBzcGlfZGV2aWNlICpzcGk7Ci0JczE2IGRhdGE7Ci0JaW50IGlycTsKLQl1OCBuZWdhdGl2ZTsKLQljaGFyIGRpcmVjdGlvbjsKLX07Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpbnQgc3BpX2FkaXMxNjI1NV9yZWFkX2RhdGEoc3RydWN0IHNwaV9hZGlzMTYyNTVfZGF0YSAqc3BpYWRpcywKLQkJCQkJdTggYWRyLAotCQkJCQl1OCAqcmJ1ZikKLXsKLQlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gc3BpYWRpcy0+c3BpOwotCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyMSwgeGZlcjI7Ci0JdTggKmJ1ZiwgKnJ4OwotCWludCByZXQ7Ci0KLQlidWYgPSBremFsbG9jKDQsIEdGUF9LRVJORUwpOwotCWlmIChidWYgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlyeCA9IGt6YWxsb2MoNCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHJ4ID09IE5VTEwpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJfYnVmOwotCX0KLQotCWJ1ZlswXSA9IGFkcjsKLQotCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7Ci0JbWVtc2V0KCZ4ZmVyMSwgMCwgc2l6ZW9mKHhmZXIxKSk7Ci0JbWVtc2V0KCZ4ZmVyMiwgMCwgc2l6ZW9mKHhmZXIyKSk7Ci0KLQl4ZmVyMS50eF9idWYgPSBidWY7Ci0JeGZlcjEucnhfYnVmID0gYnVmICsgMjsKLQl4ZmVyMS5sZW4gPSAyOwotCXhmZXIxLmRlbGF5X3VzZWNzID0gOTsKLQotCXhmZXIyLnR4X2J1ZiA9IHJ4ICsgMjsKLQl4ZmVyMi5yeF9idWYgPSByeDsKLQl4ZmVyMi5sZW4gPSAyOwotCi0Jc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIxLCAmbXNnKTsKLQlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcjIsICZtc2cpOwotCi0JcmV0ID0gc3BpX3N5bmMoc3BpLCAmbXNnKTsKLQlpZiAocmV0ID09IDApIHsKLQkJcmJ1ZlswXSA9IHJ4WzBdOwotCQlyYnVmWzFdID0gcnhbMV07Ci0JfQotCi0Ja2ZyZWUocngpOwotZXJyX2J1ZjoKLQlrZnJlZShidWYpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBzcGlfYWRpczE2MjU1X3dyaXRlX2RhdGEoc3RydWN0IHNwaV9hZGlzMTYyNTVfZGF0YSAqc3BpYWRpcywKLQkJCQkJdTggYWRyMSwKLQkJCQkJdTggYWRyMiwKLQkJCQkJdTggKndidWYpCi17Ci0Jc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IHNwaWFkaXMtPnNwaTsKLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgICBtc2c7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciAgeGZlcjEsIHhmZXIyOwotCXU4ICAgICAgICpidWYsICpyeDsKLQlpbnQgICAgICAgICByZXQ7Ci0KLQlidWYgPSBrbWFsbG9jKDQsIEdGUF9LRVJORUwpOwotCWlmIChidWYgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlyeCA9IGt6YWxsb2MoNCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHJ4ID09IE5VTEwpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJfYnVmOwotCX0KLQotCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7Ci0JbWVtc2V0KCZ4ZmVyMSwgMCwgc2l6ZW9mKHhmZXIxKSk7Ci0JbWVtc2V0KCZ4ZmVyMiwgMCwgc2l6ZW9mKHhmZXIyKSk7Ci0KLQlidWZbMF0gPSBhZHIxIHwgMHg4MDsKLQlidWZbMV0gPSAqd2J1ZjsKLQotCWJ1ZlsyXSA9IGFkcjIgfCAweDgwOwotCWJ1ZlszXSA9ICood2J1ZiArIDEpOwotCi0JeGZlcjEudHhfYnVmID0gYnVmOwotCXhmZXIxLnJ4X2J1ZiA9IHJ4OwotCXhmZXIxLmxlbiA9IDI7Ci0JeGZlcjEuZGVsYXlfdXNlY3MgPSA5OwotCi0JeGZlcjIudHhfYnVmID0gYnVmKzI7Ci0JeGZlcjIucnhfYnVmID0gcngrMjsKLQl4ZmVyMi5sZW4gPSAyOwotCi0Jc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIxLCAmbXNnKTsKLQlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcjIsICZtc2cpOwotCi0JcmV0ID0gc3BpX3N5bmMoc3BpLCAmbXNnKTsKLQlpZiAocmV0ICE9IDApCi0JCWRldl93YXJuKCZzcGktPmRldiwgIndyaXRlIGRhdGEgdG8gJSN4ICUjeCBmYWlsZWRcbiIsCi0JCQkJYnVmWzBdLCBidWZbMl0pOwotCi0Ja2ZyZWUocngpOwotZXJyX2J1ZjoKLQlrZnJlZShidWYpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpcnFyZXR1cm5fdCBhZGlzX2lycV90aHJlYWQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCXN0cnVjdCBzcGlfYWRpczE2MjU1X2RhdGEgKnNwaWFkaXMgPSBkZXZfaWQ7Ci0JaW50IHN0YXR1czsKLQl1MTYgdmFsdWUgPSAwOwotCi0Jc3RhdHVzID0gIHNwaV9hZGlzMTYyNTVfcmVhZF9kYXRhKHNwaWFkaXMsIEFESVNfR1lST19PVVQsICh1OCAqKSZ2YWx1ZSk7Ci0JaWYgKHN0YXR1cyAhPSAwKSB7Ci0JCWRldl93YXJuKCZzcGlhZGlzLT5zcGktPmRldiwgIlNQSSBGQUlMRURcbiIpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JLyogcGVyZm9ybSBvbiBuZXcgZGF0YSBvbmx5Li4uICovCi0JaWYgKHZhbHVlICYgMHg4MDAwKSB7Ci0JCS8qIGRlbGV0ZSBlcnJvciBhbmQgbmV3IGRhdGEgYml0ICovCi0JCXZhbHVlID0gdmFsdWUgJiAweDNmZmY7Ci0JCS8qIHNldCBuZWdhdGl2ZSB2YWx1ZSAqLwotCQlpZiAodmFsdWUgJiAweDIwMDApCi0JCQl2YWx1ZSA9IHZhbHVlIHwgMHhlMDAwOwotCi0JCWlmIChsaWtlbHkoc3BpYWRpcy0+bmVnYXRpdmUpKQotCQkJdmFsdWUgPSAtdmFsdWU7Ci0KLQkJc3BpYWRpcy0+ZGF0YSA9IChzMTYpIHZhbHVlOwotCX0KLQotZXhpdDoKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXNzaXplX3QgYWRpczE2MjU1X3Nob3dfZGF0YShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkYSwKLQkJY2hhciAqYnVmKQotewotCXN0cnVjdCBzcGlfYWRpczE2MjU1X2RhdGEgKnNwaWFkaXMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgc3BpYWRpcy0+ZGF0YSk7Ci19Ci1ERVZJQ0VfQVRUUihkYXRhLCBTX0lSVUdPICwgYWRpczE2MjU1X3Nob3dfZGF0YSwgTlVMTCk7Ci0KLXNzaXplX3QgYWRpczE2MjU1X3Nob3dfZGlyZWN0aW9uKHN0cnVjdCBkZXZpY2UgKmRldmljZSwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhLAotCQljaGFyICpidWYpCi17Ci0Jc3RydWN0IHNwaV9hZGlzMTYyNTVfZGF0YSAqc3BpYWRpcyA9IGRldl9nZXRfZHJ2ZGF0YShkZXZpY2UpOwotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVjXG4iLCBzcGlhZGlzLT5kaXJlY3Rpb24pOwotfQotREVWSUNFX0FUVFIoZGlyZWN0aW9uLCBTX0lSVUdPICwgYWRpczE2MjU1X3Nob3dfZGlyZWN0aW9uLCBOVUxMKTsKLQotc3NpemVfdCBhZGlzMTYyNTVfc2hvd19zYW1wbGVfcmF0ZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkYSwKLQkJY2hhciAqYnVmKQotewotCXN0cnVjdCBzcGlfYWRpczE2MjU1X2RhdGEgKnNwaWFkaXMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKLQlpbnQgc3RhdHVzID0gMDsKLQl1MTYgdmFsdWUgPSAwOwotCWludCB0cyA9IDA7Ci0KLQlzdGF0dXMgPSBzcGlfYWRpczE2MjU1X3JlYWRfZGF0YShzcGlhZGlzLCBBRElTX1NNUExfUFJEX01TQiwKLQkJCQkodTggKikmdmFsdWUpOwotCWlmIChzdGF0dXMgIT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAodmFsdWUgJiAweDgwKSB7Ci0JCS8qIHRpbWViYXNlID0gNjAuNTQgbXMgKi8KLQkJdHMgPSA2MDU0MCAqICgoMHg3ZiAmIHZhbHVlKSArIDEpOwotCX0gZWxzZSB7Ci0JCS8qIHRpbWViYXNlID0gMS45NTMgbXMgKi8KLQkJdHMgPSAxOTUzICogKCgweDdmICYgdmFsdWUpICsgMSk7Ci0JfQotCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsICgxMDAwKjEwMDApL3RzKTsKLX0KLURFVklDRV9BVFRSKHNhbXBsZV9yYXRlLCBTX0lSVUdPICwgYWRpczE2MjU1X3Nob3dfc2FtcGxlX3JhdGUsIE5VTEwpOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRpczE2MjU1X2F0dHJpYnV0ZXNbXSA9IHsKLQkmZGV2X2F0dHJfZGF0YS5hdHRyLAotCSZkZXZfYXR0cl9kaXJlY3Rpb24uYXR0ciwKLQkmZGV2X2F0dHJfc2FtcGxlX3JhdGUuYXR0ciwKLQlOVUxMCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZGlzMTYyNTVfYXR0cl9ncm91cCA9IHsKLQkuYXR0cnMgPSBhZGlzMTYyNTVfYXR0cmlidXRlcywKLX07Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpbnQgc3BpX2FkaXMxNjI1NV9zaHV0ZG93bihzdHJ1Y3Qgc3BpX2FkaXMxNjI1NV9kYXRhICpzcGlhZGlzKQotewotCXUxNiB2YWx1ZSA9IDA7Ci0JLyogdHVybiBzZW5zb3Igb2ZmICovCi0Jc3BpX2FkaXMxNjI1NV93cml0ZV9kYXRhKHNwaWFkaXMsCi0JCQlBRElTX1NNUExfUFJEX01TQiwgQURJU19TTVBMX1BSRF9MU0IsCi0JCQkodTggKikmdmFsdWUpOwotCXNwaV9hZGlzMTYyNTVfd3JpdGVfZGF0YShzcGlhZGlzLAotCQkJQURJU19NU0NfQ1RSTF9NU0IsIEFESVNfTVNDX0NUUkxfTFNCLAotCQkJKHU4ICopJnZhbHVlKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzcGlfYWRpczE2MjU1X2JyaW5ndXAoc3RydWN0IHNwaV9hZGlzMTYyNTVfZGF0YSAqc3BpYWRpcykKLXsKLQlpbnQgc3RhdHVzID0gMDsKLQl1MTYgdmFsdWUgPSAwOwotCi0Jc3RhdHVzID0gc3BpX2FkaXMxNjI1NV9yZWFkX2RhdGEoc3BpYWRpcywgQURJU19HWVJPX1NDQUxFLAotCQkJCSh1OCAqKSZ2YWx1ZSk7Ci0JaWYgKHN0YXR1cyAhPSAwKQotCQlnb3RvIGVycjsKLQlpZiAodmFsdWUgIT0gMHgwODAwKSB7Ci0JCWRldl93YXJuKCZzcGlhZGlzLT5zcGktPmRldiwgIlNjYWxlIGZhY3RvciBpcyBub25lIGRlZmF1bHQgIgotCQkJCSJ2YWx1ZSAoJS40eClcbiIsIHZhbHVlKTsKLQl9Ci0KLQkvKiB0aW1lYmFzZSA9IDEuOTUzIG1zLCBOcyA9IDAgLT4gNTEyIEh6IHNhbXBsZSByYXRlICovCi0JdmFsdWUgPSAgMHgwMDAxOwotCXN0YXR1cyA9IHNwaV9hZGlzMTYyNTVfd3JpdGVfZGF0YShzcGlhZGlzLAotCQkJCUFESVNfU01QTF9QUkRfTVNCLCBBRElTX1NNUExfUFJEX0xTQiwKLQkJCQkodTggKikmdmFsdWUpOwotCWlmIChzdGF0dXMgIT0gMCkKLQkJZ290byBlcnI7Ci0KLQkvKiBzdGFydCBpbnRlcm5hbCBzZWxmLXRlc3QgKi8KLQl2YWx1ZSA9IDB4MDQwMDsKLQlzdGF0dXMgPSBzcGlfYWRpczE2MjU1X3dyaXRlX2RhdGEoc3BpYWRpcywKLQkJCQlBRElTX01TQ19DVFJMX01TQiwgQURJU19NU0NfQ1RSTF9MU0IsCi0JCQkJKHU4ICopJnZhbHVlKTsKLQlpZiAoc3RhdHVzICE9IDApCi0JCWdvdG8gZXJyOwotCi0JLyogd2FpdCAzNSBtcyB0byBmaW5pc2ggc2VsZi10ZXN0ICovCi0JbXNsZWVwKDM1KTsKLQotCXZhbHVlID0gMHgwMDAwOwotCXN0YXR1cyA9IHNwaV9hZGlzMTYyNTVfcmVhZF9kYXRhKHNwaWFkaXMsIEFESVNfU1RBVFVTLAotCQkJCSh1OCAqKSZ2YWx1ZSk7Ci0JaWYgKHN0YXR1cyAhPSAwKQotCQlnb3RvIGVycjsKLQotCWlmICh2YWx1ZSAmIDB4MjMpIHsKLQkJaWYgKHZhbHVlICYgMHgyMCkgewotCQkJZGV2X3dhcm4oJnNwaWFkaXMtPnNwaS0+ZGV2LCAic2VsZi10ZXN0IGVycm9yXG4iKTsKLQkJCXN0YXR1cyA9IC1FTk9ERVY7Ci0JCQlnb3RvIGVycjsKLQkJfSBlbHNlIGlmICh2YWx1ZSAmIDB4MykJewotCQkJZGV2X3dhcm4oJnNwaWFkaXMtPnNwaS0+ZGV2LCAiU2Vuc29yIHZvbHRhZ2UgIgotCQkJCQkJIm91dCBvZiByYW5nZS5cbiIpOwotCQkJc3RhdHVzID0gLUVOT0RFVjsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JfQotCi0JLyogc2V0IGludGVycnVwdCB0byBhY3RpdmUgaGlnaCBvbiBESU8wIHdoZW4gZGF0YSByZWFkeSAqLwotCXZhbHVlID0gMHgwMDA2OwotCXN0YXR1cyA9IHNwaV9hZGlzMTYyNTVfd3JpdGVfZGF0YShzcGlhZGlzLAotCQkJCUFESVNfTVNDX0NUUkxfTVNCLCBBRElTX01TQ19DVFJMX0xTQiwKLQkJCQkodTggKikmdmFsdWUpOwotCWlmIChzdGF0dXMgIT0gMCkKLQkJZ290byBlcnI7Ci0JcmV0dXJuIHN0YXR1czsKLQotZXJyOgotCXNwaV9hZGlzMTYyNTVfc2h1dGRvd24oc3BpYWRpcyk7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludCBfX2RldmluaXQgc3BpX2FkaXMxNjI1NV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCi0Jc3RydWN0IGFkaXMxNjI1NV9pbml0X2RhdGEgKmluaXRfZGF0YSA9IHNwaS0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0Jc3RydWN0IHNwaV9hZGlzMTYyNTVfZGF0YSAgKnNwaWFkaXM7Ci0JaW50IHN0YXR1cyA9IDA7Ci0KLQlzcGlhZGlzID0ga3phbGxvYyhzaXplb2YoKnNwaWFkaXMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNwaWFkaXMpCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jc3BpYWRpcy0+c3BpID0gc3BpOwotCXNwaWFkaXMtPmRpcmVjdGlvbiA9IGluaXRfZGF0YS0+ZGlyZWN0aW9uOwotCi0JaWYgKGluaXRfZGF0YS0+bmVnYXRpdmUpCi0JCXNwaWFkaXMtPm5lZ2F0aXZlID0gMTsKLQotCXN0YXR1cyA9IGdwaW9fcmVxdWVzdChpbml0X2RhdGEtPmlycSwgImFkaXMxNjI1NSIpOwotCWlmIChzdGF0dXMgIT0gMCkKLQkJZ290byBlcnI7Ci0KLQlzdGF0dXMgPSBncGlvX2RpcmVjdGlvbl9pbnB1dChpbml0X2RhdGEtPmlycSk7Ci0JaWYgKHN0YXR1cyAhPSAwKQotCQlnb3RvIGdwaW9fZXJyOwotCi0Jc3BpYWRpcy0+aXJxID0gZ3Bpb190b19pcnEoaW5pdF9kYXRhLT5pcnEpOwotCi0Jc3RhdHVzID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoc3BpYWRpcy0+aXJxLAotCQkJTlVMTCwgYWRpc19pcnFfdGhyZWFkLAotCQkJSVJRRl9ESVNBQkxFRCwgImFkaXMtZHJpdmVyIiwgc3BpYWRpcyk7Ci0KLQlpZiAoc3RhdHVzICE9IDApIHsKLQkJZGV2X2Vycigmc3BpLT5kZXYsICJJUlEgcmVxdWVzdCBmYWlsZWRcbiIpOwotCQlnb3RvIGdwaW9fZXJyOwotCX0KLQotCWRldl9kYmcoJnNwaS0+ZGV2LCAiR1BJTyAlZCBJUlEgJWRcbiIsIGluaXRfZGF0YS0+aXJxLCBzcGlhZGlzLT5pcnEpOwotCi0JZGV2X3NldF9kcnZkYXRhKCZzcGktPmRldiwgc3BpYWRpcyk7Ci0Jc3RhdHVzID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZzcGktPmRldi5rb2JqLCAmYWRpczE2MjU1X2F0dHJfZ3JvdXApOwotCWlmIChzdGF0dXMgIT0gMCkKLQkJZ290byBpcnFfZXJyOwotCi0Jc3RhdHVzID0gc3BpX2FkaXMxNjI1NV9icmluZ3VwKHNwaWFkaXMpOwotCWlmIChzdGF0dXMgIT0gMCkKLQkJZ290byBzeXNmc19lcnI7Ci0KLQlkZXZfaW5mbygmc3BpLT5kZXYsICJzcGlfYWRpczE2MjU1IGRyaXZlciBhZGRlZCFcbiIpOwotCi0JcmV0dXJuIHN0YXR1czsKLQotc3lzZnNfZXJyOgotCXN5c2ZzX3JlbW92ZV9ncm91cCgmc3BpYWRpcy0+c3BpLT5kZXYua29iaiwgJmFkaXMxNjI1NV9hdHRyX2dyb3VwKTsKLWlycV9lcnI6Ci0JZnJlZV9pcnEoc3BpYWRpcy0+aXJxLCBzcGlhZGlzKTsKLWdwaW9fZXJyOgotCWdwaW9fZnJlZShpbml0X2RhdGEtPmlycSk7Ci1lcnI6Ci0Ja2ZyZWUoc3BpYWRpcyk7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGludCBfX2RldmV4aXQgc3BpX2FkaXMxNjI1NV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlzdHJ1Y3Qgc3BpX2FkaXMxNjI1NV9kYXRhICAqc3BpYWRpcyAgICA9IGRldl9nZXRfZHJ2ZGF0YSgmc3BpLT5kZXYpOwotCi0Jc3BpX2FkaXMxNjI1NV9zaHV0ZG93bihzcGlhZGlzKTsKLQotCWZyZWVfaXJxKHNwaWFkaXMtPmlycSwgc3BpYWRpcyk7Ci0JZ3Bpb19mcmVlKGlycV90b19ncGlvKHNwaWFkaXMtPmlycSkpOwotCi0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZzcGlhZGlzLT5zcGktPmRldi5rb2JqLCAmYWRpczE2MjU1X2F0dHJfZ3JvdXApOwotCi0Ja2ZyZWUoc3BpYWRpcyk7Ci0KLQlkZXZfaW5mbygmc3BpLT5kZXYsICJzcGlfYWRpczE2MjU1IGRyaXZlciByZW1vdmVkIVxuIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBzcGlfYWRpczE2MjU1X2RydiA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICAic3BpX2FkaXMxNjI1NSIsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAotCX0sCi0JLnByb2JlID0gc3BpX2FkaXMxNjI1NV9wcm9iZSwKLQkucmVtb3ZlID0gICBfX2RldmV4aXRfcChzcGlfYWRpczE2MjU1X3JlbW92ZSksCi19OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50IF9faW5pdCBzcGlfYWRpczE2MjU1X2luaXQodm9pZCkKLXsKLQlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmc3BpX2FkaXMxNjI1NV9kcnYpOwotfQotbW9kdWxlX2luaXQoc3BpX2FkaXMxNjI1NV9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IHNwaV9hZGlzMTYyNTVfZXhpdCh2b2lkKQotewotCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmc3BpX2FkaXMxNjI1NV9kcnYpOwotfQotbW9kdWxlX2V4aXQoc3BpX2FkaXMxNjI1NV9leGl0KTsKLQotTU9EVUxFX0FVVEhPUigiTWF0dGhpYXMgQnJ1Z2dlciIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJTUEkgZGV2aWNlIGRyaXZlciBmb3IgQURJUzE2MjU1IHNlbnNvciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FkaXMxNjI1NS9hZGlzMTYyNTUuaCBiL2RyaXZlcnMvc3RhZ2luZy9hZGlzMTYyNTUvYWRpczE2MjU1LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZTA3MDAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FkaXMxNjI1NS9hZGlzMTYyNTUuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNpZm5kZWYgQURJUzE2MjU1X0gKLSNkZWZpbmUgQURJUzE2MjU1X0gKLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0KLXN0cnVjdCBhZGlzMTYyNTVfaW5pdF9kYXRhIHsKLQljaGFyIGRpcmVjdGlvbjsKLQl1OCAgIG5lZ2F0aXZlOwotCWludCAgaXJxOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL2FzdXNfb2xlZC5jIGIvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC9hc3VzX29sZWQuYwppbmRleCAwMTZjNmY3Li43YmI3ZGE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL2FzdXNfb2xlZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvYXN1c19vbGVkLmMKQEAgLTcwLDcgKzcwLDcgQEAKIE1PRFVMRV9QQVJNX0RFU0Moc3RhcnRfb2ZmLAogCQkgIlNldCB0byAxIHRvIHN3aXRjaCBvZmYgT0xFRCBkaXNwbGF5IGFmdGVyIGl0IGlzIGF0dGFjaGVkIik7CiAKLWVudW0gb2xlZF9wYWNrX21vZGV7CitlbnVtIG9sZWRfcGFja19tb2RlIHsKIAlQQUNLX01PREVfRzEsCiAJUEFDS19NT0RFX0c1MCwKIAlQQUNLX01PREVfTEFTVApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2F0aDZrbC9oaWYvc2Rpby9saW51eF9zZGlvL3NyYy9oaWYuYyBiL2RyaXZlcnMvc3RhZ2luZy9hdGg2a2wvaGlmL3NkaW8vbGludXhfc2Rpby9zcmMvaGlmLmMKaW5kZXggYzMwN2E1NS4uZTk2NjYyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2F0aDZrbC9oaWYvc2Rpby9saW51eF9zZGlvL3NyYy9oaWYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYXRoNmtsL2hpZi9zZGlvL2xpbnV4X3NkaW8vc3JjL2hpZi5jCkBAIC04NzYsNyArODc2LDcgQEAKIHZvaWQKIEhJRlVuTWFza0ludGVycnVwdChISUZfREVWSUNFICpkZXZpY2UpCiB7Ci0gICAgaW50IHJldDs7CisgICAgaW50IHJldDsKIAogICAgIEFSX0RFQlVHX0FTU0VSVChkZXZpY2UgIT0gTlVMTCk7CiAgICAgQVJfREVCVUdfQVNTRVJUKGRldmljZS0+ZnVuYyAhPSBOVUxMKTsKQEAgLTExODgsNyArMTE4OCw3IEBACiAgICAgSElGX0RFVklDRSAqaGlmZGV2aWNlOwogICAgIEFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfVFJBQ0UsICgiQVI2MDAwOiBhZGRIaWZEZXZpY2VcbiIpKTsKICAgICBBUl9ERUJVR19BU1NFUlQoZnVuYyAhPSBOVUxMKTsKLSAgICBoaWZkZXZpY2UgPSAoSElGX0RFVklDRSAqKWt6YWxsb2Moc2l6ZW9mKEhJRl9ERVZJQ0UpLCBHRlBfS0VSTkVMKTsKKyAgICBoaWZkZXZpY2UgPSBremFsbG9jKHNpemVvZihISUZfREVWSUNFKSwgR0ZQX0tFUk5FTCk7CiAgICAgQVJfREVCVUdfQVNTRVJUKGhpZmRldmljZSAhPSBOVUxMKTsKICNpZiBISUZfVVNFX0RNQV9CT1VOQ0VfQlVGRkVSCiAgICAgaGlmZGV2aWNlLT5kbWFfYnVmZmVyID0ga21hbGxvYyhISUZfRE1BX0JVRkZFUl9TSVpFLCBHRlBfS0VSTkVMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hdGg2a2wvb3MvbGludXgvYXI2MDAwX2Rydi5jIGIvZHJpdmVycy9zdGFnaW5nL2F0aDZrbC9vcy9saW51eC9hcjYwMDBfZHJ2LmMKaW5kZXggYTY1OWY3MC4uMTI2YTM2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2F0aDZrbC9vcy9saW51eC9hcjYwMDBfZHJ2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2F0aDZrbC9vcy9saW51eC9hcjYwMDBfZHJ2LmMKQEAgLTQ0MzksNyArNDQzOSw3IEBACiAgICAgICAgIGZvciAoaSA9IGFzc29jX3JlcV9pZV9wb3M7IGkgPCBhc3NvY19yZXFfaWVfcG9zICsgYXNzb2NSZXFMZW4gLSA0OyBpKyspIHsKICAgICAgICAgICAgIEFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfV0xBTl9DT05ORUNULCgiJTIuMnggIiwgYXNzb2NJbmZvW2ldKSk7CiAgICAgICAgICAgICBzcHJpbnRmKHBvcywgIiUyLjJ4IiwgYXNzb2NJbmZvW2ldKTsKLSAgICAgICAgICAgIHBvcyArPSAyOzsKKyAgICAgICAgICAgIHBvcyArPSAyOwogICAgICAgICB9CiAgICAgICAgIEFSX0RFQlVHX1BSSU5URihBVEhfREVCVUdfV0xBTl9DT05ORUNULCgiXG4iKSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hdXRvZnMvZGlyaGFzaC5jIGIvZHJpdmVycy9zdGFnaW5nL2F1dG9mcy9kaXJoYXNoLmMKaW5kZXggOGYzZTJiOC4uZDNmNDJjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2F1dG9mcy9kaXJoYXNoLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2F1dG9mcy9kaXJoYXNoLmMKQEAgLTMwLDcgKzMwLDcgQEAKIAkJCSBzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQgKmVudCkKIHsKIAlhdXRvZnNfZGVsZXRlX3VzYWdlKGVudCk7ICAgLyogVW5saW5rIGZyb20gY3VycmVudCBwb3NpdGlvbiAqLwotCWF1dG9mc19pbml0X3VzYWdlKGRoLGVudCk7ICAvKiBSZWxpbmsgYXQgcXVldWUgdGFpbCAqLworCWF1dG9mc19pbml0X3VzYWdlKGRoLCBlbnQpOyAgLyogUmVsaW5rIGF0IHF1ZXVlIHRhaWwgKi8KIH0KIAogc3RydWN0IGF1dG9mc19kaXJfZW50ICphdXRvZnNfZXhwaXJlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCkBAIC00NSwxNyArNDUsMTggQEAKIAkJc3RydWN0IHBhdGggcGF0aDsKIAkJaW50IHVtb3VudF9vazsKIAotCQlpZiAoIGxpc3RfZW1wdHkoJmRoLT5leHBpcnlfaGVhZCkgfHwgc2JpLT5jYXRhdG9uaWMgKQorCQlpZiAobGlzdF9lbXB0eSgmZGgtPmV4cGlyeV9oZWFkKSB8fCBzYmktPmNhdGF0b25pYykKIAkJCXJldHVybiBOVUxMOwkvKiBObyBlbnRyaWVzICovCiAJCS8qIFdlIGtlZXAgdGhlIGxpc3Qgc29ydGVkIGJ5IGxhc3RfdXNhZ2UgYW5kIHdhbnQgb2xkIHN0dWZmICovCi0JCWVudCA9IGxpc3RfZW50cnkoZGgtPmV4cGlyeV9oZWFkLm5leHQsIHN0cnVjdCBhdXRvZnNfZGlyX2VudCwgZXhwKTsKKwkJZW50ID0gbGlzdF9lbnRyeShkaC0+ZXhwaXJ5X2hlYWQubmV4dCwKKwkJCQkJCXN0cnVjdCBhdXRvZnNfZGlyX2VudCwgZXhwKTsKIAkJaWYgKGppZmZpZXMgLSBlbnQtPmxhc3RfdXNhZ2UgPCB0aW1lb3V0KQogCQkJYnJlYWs7CiAJCS8qIE1vdmUgdG8gZW5kIG9mIGxpc3QgaW4gY2FzZSBleHBpcnkgaXNuJ3QgZGVzaXJhYmxlICovCiAJCWF1dG9mc191cGRhdGVfdXNhZ2UoZGgsIGVudCk7CiAKIAkJLyogQ2hlY2sgdG8gc2VlIHRoYXQgZW50cnkgaXMgZXhwaXJhYmxlICovCi0JCWlmICggZW50LT5pbm8gPCBBVVRPRlNfRklSU1RfRElSX0lOTyApCisJCWlmIChlbnQtPmlubyA8IEFVVE9GU19GSVJTVF9ESVJfSU5PKQogCQkJcmV0dXJuIGVudDsgLyogU3ltbGlua3MgYXJlIGFsd2F5cyBleHBpcmFibGUgKi8KIAogCQkvKiBHZXQgdGhlIGRlbnRyeSBmb3IgdGhlIGF1dG9mcyBzdWJkaXJlY3RvcnkgKi8KQEAgLTYzLDE0ICs2NCwxNSBAQAogCiAJCWlmICghcGF0aC5kZW50cnkpIHsKIAkJCS8qIFNob3VsZCBvbmx5IGhhcHBlbiBpbiBjYXRhdG9uaWMgbW9kZSAqLwotCQkJcHJpbnRrKCJhdXRvZnM6IGRlbnRyeSA9PSBOVUxMIGJ1dCBpbm9kZSByYW5nZSBpcyBkaXJlY3RvcnksIGVudHJ5ICVzXG4iLCBlbnQtPm5hbWUpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgImF1dG9mczogZGVudHJ5ID09IE5VTEwgYnV0IGlub2RlIFwKKwkJCQlyYW5nZSBpcyBkaXJlY3RvcnksIGVudHJ5ICVzXG4iLCBlbnQtPm5hbWUpOwogCQkJYXV0b2ZzX2RlbGV0ZV91c2FnZShlbnQpOwogCQkJY29udGludWU7CiAJCX0KIAogCQlpZiAoIXBhdGguZGVudHJ5LT5kX2lub2RlKSB7CiAJCQlkcHV0KHBhdGguZGVudHJ5KTsKLQkJCXByaW50aygiYXV0b2ZzOiBuZWdhdGl2ZSBkZW50cnkgb24gZXhwaXJ5IHF1ZXVlOiAlc1xuIiwKKwkJCXByaW50ayhLRVJOX0RFQlVHICJhdXRvZnM6IG5lZ2F0aXZlIGRlbnRyeSBvbiBleHBpcnkgcXVldWU6ICVzXG4iLAogCQkJICAgICAgIGVudC0+bmFtZSk7CiAJCQlhdXRvZnNfZGVsZXRlX3VzYWdlKGVudCk7CiAJCQljb250aW51ZTsKQEAgLTgwLDE0ICs4MiwxNiBAQAogCQkgICBwb2ludCB0byB0aGUgbW91bnRlZC1vbi10b3Agcm9vdC4gKi8KIAkJaWYgKCFTX0lTRElSKHBhdGguZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpIHx8CiAJCSAgICAhZF9tb3VudHBvaW50KHBhdGguZGVudHJ5KSkgewotCQkJRFBSSU5USygoImF1dG9mczogbm90IGV4cGlyYWJsZSAobm90IGEgbW91bnRlZCBkaXJlY3RvcnkpOiAlc1xuIiwgZW50LT5uYW1lKSk7CisJCQlEUFJJTlRLKCgiYXV0b2ZzOiBub3QgZXhwaXJhYmxlIFwKKwkJCQkobm90IGEgbW91bnRlZCBkaXJlY3RvcnkpOiAlc1xuIiwgZW50LT5uYW1lKSk7CiAJCQljb250aW51ZTsKIAkJfQogCQlwYXRoLm1udCA9IG1udDsKIAkJcGF0aF9nZXQoJnBhdGgpOwogCQlpZiAoIWZvbGxvd19kb3duKCZwYXRoKSkgewogCQkJcGF0aF9wdXQoJnBhdGgpOwotCQkJRFBSSU5USygoImF1dG9mczogbm90IGV4cGlyYWJsZSAobm90IGEgbW91bnRlZCBkaXJlY3RvcnkpOiAlc1xuIiwgZW50LT5uYW1lKSk7CisJCQlEUFJJTlRLKCgiYXV0b2ZzOiBub3QgZXhwaXJhYmxlXAorCQkJKG5vdCBhIG1vdW50ZWQgZGlyZWN0b3J5KTogJXNcbiIsIGVudC0+bmFtZSkpOwogCQkJY29udGludWU7CiAJCX0KIAkJd2hpbGUgKGRfbW91bnRwb2ludChwYXRoLmRlbnRyeSkgJiYgZm9sbG93X2Rvd24oJnBhdGgpKQpAQCAtOTYsMzAgKzEwMCwzNyBAQAogCQlwYXRoX3B1dCgmcGF0aCk7CiAKIAkJaWYgKHVtb3VudF9vaykgewotCQkJRFBSSU5USygoImF1dG9mczogc2lnbmFsaW5nIGV4cGlyZSBvbiAlc1xuIiwgZW50LT5uYW1lKSk7CisJCQlEUFJJTlRLKCgiYXV0b2ZzOiBzaWduYWxpbmcgZXhwaXJlIG9uICVzXG4iLAorCQkJCQkJCQllbnQtPm5hbWUpKTsKIAkJCXJldHVybiBlbnQ7IC8qIEV4cGlyYWJsZSEgKi8KIAkJfQotCQlEUFJJTlRLKCgiYXV0b2ZzOiBkaWRuJ3QgZXhwaXJlIGR1ZSB0byBtYXlfdW1vdW50OiAlc1xuIiwgZW50LT5uYW1lKSk7CisKKwkJRFBSSU5USygoImF1dG9mczogZGlkbid0IGV4cGlyZSBkdWUgdG8gbWF5X3Vtb3VudDogJXNcbiIsCisJCQkJCQkJCWVudC0+bmFtZSkpOwogCX0KIAlyZXR1cm4gTlVMTDsJCS8qIE5vIGV4cGlyYWJsZSBlbnRyaWVzICovCiB9CiAKLXZvaWQgYXV0b2ZzX2luaXRpYWxpemVfaGFzaChzdHJ1Y3QgYXV0b2ZzX2Rpcmhhc2ggKmRoKSB7Cit2b2lkIGF1dG9mc19pbml0aWFsaXplX2hhc2goc3RydWN0IGF1dG9mc19kaXJoYXNoICpkaCkKK3sKIAltZW1zZXQoJmRoLT5oLCAwLCBBVVRPRlNfSEFTSF9TSVpFKnNpemVvZihzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQgKikpOwogCUlOSVRfTElTVF9IRUFEKCZkaC0+ZXhwaXJ5X2hlYWQpOwogfQogCi1zdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQgKmF1dG9mc19oYXNoX2xvb2t1cChjb25zdCBzdHJ1Y3QgYXV0b2ZzX2Rpcmhhc2ggKmRoLCBzdHJ1Y3QgcXN0ciAqbmFtZSkKK3N0cnVjdCBhdXRvZnNfZGlyX2VudCAqYXV0b2ZzX2hhc2hfbG9va3VwKGNvbnN0IHN0cnVjdCBhdXRvZnNfZGlyaGFzaCAqZGgsCisJCQkJCQlzdHJ1Y3QgcXN0ciAqbmFtZSkKIHsKIAlzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQgKmRobjsKIAogCURQUklOVEsoKCJhdXRvZnNfaGFzaF9sb29rdXA6IGhhc2ggPSAweCUwOHgsIG5hbWUgPSAiLCBuYW1lLT5oYXNoKSk7Ci0JYXV0b2ZzX3NheShuYW1lLT5uYW1lLG5hbWUtPmxlbik7CisJYXV0b2ZzX3NheShuYW1lLT5uYW1lLCBuYW1lLT5sZW4pOwogCi0JZm9yICggZGhuID0gZGgtPmhbKHVuc2lnbmVkKSBuYW1lLT5oYXNoICUgQVVUT0ZTX0hBU0hfU0laRV0gOyBkaG4gOyBkaG4gPSBkaG4tPm5leHQgKSB7Ci0JCWlmICggbmFtZS0+aGFzaCA9PSBkaG4tPmhhc2ggJiYKKwlmb3IgKGRobiA9IGRoLT5oWyh1bnNpZ25lZCkgbmFtZS0+aGFzaCAlIEFVVE9GU19IQVNIX1NJWkVdOworCQlkaG47CisJCWRobiA9IGRobi0+bmV4dCkgeworCQlpZiAobmFtZS0+aGFzaCA9PSBkaG4tPmhhc2ggJiYKIAkJICAgICBuYW1lLT5sZW4gPT0gZGhuLT5sZW4gJiYKLQkJICAgICAhbWVtY21wKG5hbWUtPm5hbWUsIGRobi0+bmFtZSwgbmFtZS0+bGVuKSApCisJCSAgICAgIW1lbWNtcChuYW1lLT5uYW1lLCBkaG4tPm5hbWUsIG5hbWUtPmxlbikpCiAJCQlicmVhazsKIAl9CiAKQEAgLTEzMSw5ICsxNDIsOSBAQAogCXN0cnVjdCBhdXRvZnNfZGlyX2VudCAqKmRobnA7CiAKIAlEUFJJTlRLKCgiYXV0b2ZzX2hhc2hfaW5zZXJ0OiBoYXNoID0gMHglMDh4LCBuYW1lID0gIiwgZW50LT5oYXNoKSk7Ci0JYXV0b2ZzX3NheShlbnQtPm5hbWUsZW50LT5sZW4pOworCWF1dG9mc19zYXkoZW50LT5uYW1lLCBlbnQtPmxlbik7CiAKLQlhdXRvZnNfaW5pdF91c2FnZShkaCxlbnQpOworCWF1dG9mc19pbml0X3VzYWdlKGRoLCBlbnQpOwogCWlmIChlbnQtPmRlbnRyeSkKIAkJZGdldChlbnQtPmRlbnRyeSk7CiAKQEAgLTE0MSwxOSArMTUyLDE5IEBACiAJZW50LT5uZXh0ID0gKmRobnA7CiAJZW50LT5iYWNrID0gZGhucDsKIAkqZGhucCA9IGVudDsKLQlpZiAoIGVudC0+bmV4dCApCisJaWYgKGVudC0+bmV4dCkKIAkJZW50LT5uZXh0LT5iYWNrID0gJihlbnQtPm5leHQpOwogfQogCiB2b2lkIGF1dG9mc19oYXNoX2RlbGV0ZShzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQgKmVudCkKIHsKIAkqKGVudC0+YmFjaykgPSBlbnQtPm5leHQ7Ci0JaWYgKCBlbnQtPm5leHQgKQorCWlmIChlbnQtPm5leHQpCiAJCWVudC0+bmV4dC0+YmFjayA9IGVudC0+YmFjazsKIAogCWF1dG9mc19kZWxldGVfdXNhZ2UoZW50KTsKIAotCWlmICggZW50LT5kZW50cnkgKQorCWlmIChlbnQtPmRlbnRyeSkKIAkJZHB1dChlbnQtPmRlbnRyeSk7CiAJa2ZyZWUoZW50LT5uYW1lKTsKIAlrZnJlZShlbnQpOwpAQCAtMTc2LDM3ICsxODcsMzcgQEAKIAlidWNrZXQgPSAoKnB0ciA+PiAxNikgLSAxOwogCWVjb3VudCA9ICpwdHIgJiAweGZmZmY7CiAKLQlpZiAoIGJ1Y2tldCA8IDAgKSB7CisJaWYgKGJ1Y2tldCA8IDApCiAJCWJ1Y2tldCA9IGVjb3VudCA9IDA7Ci0JfSAKIAogCURQUklOVEsoKCJhdXRvZnNfaGFzaF9lbnVtOiBidWNrZXQgJWQsIGVudHJ5ICVkXG4iLCBidWNrZXQsIGVjb3VudCkpOwogCiAJZW50ID0gbGFzdCA/IGxhc3QtPm5leHQgOiBOVUxMOwogCi0JaWYgKCBlbnQgKSB7CisJaWYgKGVudCkgewogCQllY291bnQrKzsKIAl9IGVsc2UgewotCQl3aGlsZSAgKCBidWNrZXQgPCBBVVRPRlNfSEFTSF9TSVpFICkgeworCQl3aGlsZSAgKGJ1Y2tldCA8IEFVVE9GU19IQVNIX1NJWkUpIHsKIAkJCWVudCA9IGRoLT5oW2J1Y2tldF07Ci0JCQlmb3IgKCBpID0gZWNvdW50IDsgZW50ICYmIGkgOyBpLS0gKQorCQkJZm9yIChpID0gZWNvdW50IDsgZW50ICYmIGkgOyBpLS0pCiAJCQkJZW50ID0gZW50LT5uZXh0OwotCQkJCisKIAkJCWlmIChlbnQpIHsKIAkJCQllY291bnQrKzsgLyogUG9pbnQgdG8gKm5leHQqIGVudHJ5ICovCiAJCQkJYnJlYWs7CiAJCQl9Ci0JCQkKKwogCQkJYnVja2V0Kys7IGVjb3VudCA9IDA7CiAJCX0KIAl9CiAKICNpZmRlZiBERUJVRwotCWlmICggIWVudCApCi0JCXByaW50aygiYXV0b2ZzX2hhc2hfZW51bTogbm90aGluZyBmb3VuZFxuIik7CisJaWYgKCFlbnQpCisJCXByaW50ayhLRVJOX0RFQlVHICJhdXRvZnNfaGFzaF9lbnVtOiBub3RoaW5nIGZvdW5kXG4iKTsKIAllbHNlIHsKLQkJcHJpbnRrKCJhdXRvZnNfaGFzaF9lbnVtOiBmb3VuZCBoYXNoICUwOHgsIG5hbWUiLCBlbnQtPmhhc2gpOwotCQlhdXRvZnNfc2F5KGVudC0+bmFtZSxlbnQtPmxlbik7CisJCXByaW50ayhLRVJOX0RFQlVHICJhdXRvZnNfaGFzaF9lbnVtOiBmb3VuZCBoYXNoICUwOHgsIG5hbWUiLAorCQkJCQkJCQllbnQtPmhhc2gpOworCQlhdXRvZnNfc2F5KGVudC0+bmFtZSwgZW50LT5sZW4pOwogCX0KICNlbmRpZgogCkBAIC0yMjEsOSArMjMyLDkgQEAKIAlpbnQgaTsKIAlzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQgKmVudDsKIAotCWZvciAoIGkgPSAwIDsgaSA8IEFVVE9GU19IQVNIX1NJWkUgOyBpKysgKSB7Ci0JCWZvciAoIGVudCA9IGRoLT5oW2ldIDsgZW50IDsgZW50ID0gZW50LT5uZXh0ICkgewotCQkJaWYgKCBlbnQtPmRlbnRyeSApIHsKKwlmb3IgKGkgPSAwIDsgaSA8IEFVVE9GU19IQVNIX1NJWkUgOyBpKyspIHsKKwkJZm9yIChlbnQgPSBkaC0+aFtpXSA7IGVudCA7IGVudCA9IGVudC0+bmV4dCkgeworCQkJaWYgKGVudC0+ZGVudHJ5KSB7CiAJCQkJZHB1dChlbnQtPmRlbnRyeSk7CiAJCQkJZW50LT5kZW50cnkgPSBOVUxMOwogCQkJfQpAQCAtMjM4LDEwICsyNDksMTAgQEAKIAlpbnQgaTsKIAlzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQgKmVudCwgKm5lbnQ7CiAKLQlmb3IgKCBpID0gMCA7IGkgPCBBVVRPRlNfSEFTSF9TSVpFIDsgaSsrICkgewotCQlmb3IgKCBlbnQgPSBzYmktPmRpcmhhc2guaFtpXSA7IGVudCA7IGVudCA9IG5lbnQgKSB7CisJZm9yIChpID0gMCA7IGkgPCBBVVRPRlNfSEFTSF9TSVpFIDsgaSsrKSB7CisJCWZvciAoZW50ID0gc2JpLT5kaXJoYXNoLmhbaV0gOyBlbnQgOyBlbnQgPSBuZW50KSB7CiAJCQluZW50ID0gZW50LT5uZXh0OwotCQkJaWYgKCBlbnQtPmRlbnRyeSApCisJCQlpZiAoZW50LT5kZW50cnkpCiAJCQkJZHB1dChlbnQtPmRlbnRyeSk7CiAJCQlrZnJlZShlbnQtPm5hbWUpOwogCQkJa2ZyZWUoZW50KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9LY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTUzZjM1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L0tjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jCi0jIEIuQS5ULk0uQS5OIG1lc2hpbmcgcHJvdG9jb2wKLSMKLQotY29uZmlnIEJBVE1BTl9BRFYKLQl0cmlzdGF0ZSAiQi5BLlQuTS5BLk4uIEFkdmFuY2VkIE1lc2hpbmcgUHJvdG9jb2wiCi0JZGVwZW5kcyBvbiBORVQKLSAgICAgICAgZGVmYXVsdCBuCi0JLS0taGVscC0tLQotCi0gICAgICAgIEIuQS5ULk0uQS5OLiAoYmV0dGVyIGFwcHJvYWNoIHRvIG1vYmlsZSBhZC1ob2MgbmV0d29ya2luZykgaXMKLSAgICAgICAgYSByb3V0aW5nIHByb3RvY29sIGZvciBtdWx0aS1ob3AgYWQtaG9jIG1lc2ggbmV0d29ya3MuIFRoZQotICAgICAgICBuZXR3b3JrcyBtYXkgYmUgd2lyZWQgb3Igd2lyZWxlc3MuIFNlZQotICAgICAgICBodHRwOi8vd3d3Lm9wZW4tbWVzaC5vcmcvIGZvciBtb3JlIGluZm9ybWF0aW9uIGFuZCB1c2VyIHNwYWNlCi0gICAgICAgIHRvb2xzLgotCi1jb25maWcgQkFUTUFOX0FEVl9ERUJVRwotCWJvb2wgIkIuQS5ULk0uQS5OLiBkZWJ1Z2dpbmciCi0JZGVwZW5kcyBvbiBCQVRNQU5fQURWICE9IG4KLQktLS1oZWxwLS0tCi0KLQkgIFRoaXMgaXMgYW4gb3B0aW9uIGZvciB1c2UgYnkgZGV2ZWxvcGVyczsgbW9zdCBwZW9wbGUgc2hvdWxkCi0JICBzYXkgTiBoZXJlLiBUaGlzIGVuYWJsZXMgY29tcGlsYXRpb24gb2Ygc3VwcG9ydCBmb3IKLQkgIG91dHB1dHRpbmcgZGVidWdnaW5nIGluZm9ybWF0aW9uIHRvIHRoZSBrZXJuZWwgbG9nLiBUaGUKLQkgIG91dHB1dCBpcyBjb250cm9sbGVkIHZpYSB0aGUgbW9kdWxlIHBhcmFtZXRlciBkZWJ1Zy4KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg5MjQyODMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6Ci0jCi0jIE1hcmVrIExpbmRuZXIsIFNpbW9uIFd1bmRlcmxpY2gKLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0jIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCi0jIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotIyAwMjExMC0xMzAxLCBVU0EKLSMKLQotb2JqLSQoQ09ORklHX0JBVE1BTl9BRFYpICs9IGJhdG1hbi1hZHYubwotYmF0bWFuLWFkdi15IDo9IG1haW4ubyBiYXRfZGVidWdmcy5vIGJhdF9zeXNmcy5vIHNlbmQubyByb3V0aW5nLm8gc29mdC1pbnRlcmZhY2UubyBpY21wX3NvY2tldC5vIHRyYW5zbGF0aW9uLXRhYmxlLm8gYml0YXJyYXkubyBoYXNoLm8gcmluZ19idWZmZXIubyB2aXMubyBoYXJkLWludGVyZmFjZS5vIGFnZ3JlZ2F0aW9uLm8gb3JpZ2luYXRvci5vIHVuaWNhc3QubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvUkVBRE1FIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Yzg3OGJiMC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotW3N0YXRlOiAwNC0wOS0yMDEwXQotCi1CQVRNQU4tQURWCi0tLS0tLS0tLS0tCi0KLUJhdG1hbiAgYWR2YW5jZWQgIGlzICBhIG5ldyBhcHByb2FjaCB0byB3aXJlbGVzcyBuZXR3b3JraW5nIHdoaWNoCi1kb2VzIG5vIGxvbmdlciBvcGVyYXRlIG9uIHRoZSBJUCBiYXNpcy4gVW5saWtlIHRoZSBiYXRtYW4gZGFlbW9uLAotd2hpY2ggIGV4Y2hhbmdlcyAgaW5mb3JtYXRpb24gIHVzaW5nIFVEUCBwYWNrZXRzIGFuZCBzZXRzIHJvdXRpbmcKLXRhYmxlcywgYmF0bWFuLWFkdmFuY2VkIG9wZXJhdGVzIG9uIElTTy9PU0kgTGF5ZXIgMiBvbmx5IGFuZCB1c2VzCi1hbmQgIHJvdXRlcyAgKG9yICBiZXR0ZXI6IGJyaWRnZXMpIEV0aGVybmV0IEZyYW1lcy4gSXQgZW11bGF0ZXMgYQotdmlydHVhbCBuZXR3b3JrIHN3aXRjaCBvZiBhbGwgbm9kZXMgcGFydGljaXBhdGluZy4gIFRoZXJlZm9yZSBhbGwKLW5vZGVzICBhcHBlYXIgIHRvIGJlIGxpbmsgbG9jYWwsIHRodXMgYWxsIGhpZ2hlciBvcGVyYXRpbmcgcHJvdG8tCi1jb2xzIHdvbid0IGJlIGFmZmVjdGVkIGJ5IGFueSBjaGFuZ2VzIHdpdGhpbiB0aGUgbmV0d29yay4gWW91IGNhbgotcnVuIGFsbW9zdCBhbnkgcHJvdG9jb2wgYWJvdmUgYmF0bWFuIGFkdmFuY2VkLCBwcm9taW5lbnQgZXhhbXBsZXMKLWFyZTogSVB2NCwgSVB2NiwgREhDUCwgSVBYLgotCi1CYXRtYW4gYWR2YW5jZWQgd2FzIGltcGxlbWVudGVkIGFzIGEgTGludXgga2VybmVsIGRyaXZlciAgdG8gIHJlLQotZHVjZSB0aGUgb3ZlcmhlYWQgdG8gYSBtaW5pbXVtLiBJdCBkb2VzIG5vdCBkZXBlbmQgb24gYW55IChvdGhlcikKLW5ldHdvcmsgZHJpdmVyLCBhbmQgY2FuIGJlIHVzZWQgb24gd2lmaSBhcyB3ZWxsIGFzIGV0aGVybmV0ICBsYW4sCi12cG4sICBldGMgLi4uIChhbnl0aGluZyB3aXRoIGV0aGVybmV0LXN0eWxlIGxheWVyIDIpLgotCi1DT05GSUdVUkFUSU9OCi0tLS0tLS0tLS0tLS0tCi0KLUxvYWQgdGhlIGJhdG1hbi1hZHYgbW9kdWxlIGludG8geW91ciBrZXJuZWw6Ci0KLSMgaW5zbW9kIGJhdG1hbi1hZHYua28KLQotVGhlICBtb2R1bGUgIGlzIG5vdyB3YWl0aW5nIGZvciBhY3RpdmF0aW9uLiBZb3UgbXVzdCBhZGQgc29tZSBpbi0KLXRlcmZhY2VzIG9uIHdoaWNoIGJhdG1hbiBjYW4gb3BlcmF0ZS4gQWZ0ZXIgIGxvYWRpbmcgIHRoZSAgbW9kdWxlCi1iYXRtYW4gIGFkdmFuY2VkICB3aWxsIHNjYW4geW91ciBzeXN0ZW1zIGludGVyZmFjZXMgdG8gc2VhcmNoIGZvcgotY29tcGF0aWJsZSBpbnRlcmZhY2VzLiBPbmNlIGZvdW5kLCBpdCB3aWxsIGNyZWF0ZSAgc3ViZm9sZGVycyAgaW4KLXRoZSAvc3lzIGRpcmVjdG9yaWVzIG9mIGVhY2ggc3VwcG9ydGVkIGludGVyZmFjZSwgZS5nLgotCi0jIGxzIC9zeXMvY2xhc3MvbmV0L2V0aDAvYmF0bWFuX2Fkdi8KLSMgaWZhY2Vfc3RhdHVzICBtZXNoX2lmYWNlCi0KLUlmIGFuIGludGVyZmFjZSBkb2VzIG5vdCBoYXZlIHRoZSAiYmF0bWFuX2FkdiIgc3ViZm9sZGVyIGl0IHByb2ItCi1hYmx5IGlzIG5vdCBzdXBwb3J0ZWQuIE5vdCBzdXBwb3J0ZWQgIGludGVyZmFjZXMgIGFyZTogIGxvb3BiYWNrLAotbm9uLWV0aGVybmV0IGFuZCBiYXRtYW4ncyBvd24gaW50ZXJmYWNlcy4KLQotTm90ZTogIEFmdGVyIHRoZSBtb2R1bGUgd2FzIGxvYWRlZCBpdCB3aWxsIGNvbnRpbnVvdXNseSB3YXRjaCBmb3IKLW5ldyBpbnRlcmZhY2VzIHRvIHZlcmlmeSB0aGUgY29tcGF0aWJpbGl0eS4gVGhlcmUgaXMgbm8gIG5lZWQgIHRvCi1yZWxvYWQgdGhlIG1vZHVsZSBpZiB5b3UgcGx1ZyB5b3VyIFVTQiB3aWZpIGFkYXB0ZXIgaW50byB5b3VyIG1hLQotY2hpbmUgYWZ0ZXIgYmF0bWFuIGFkdmFuY2VkIHdhcyBpbml0aWFsbHkgbG9hZGVkLgotCi1UbyBhY3RpdmF0ZSBhICBnaXZlbiAgaW50ZXJmYWNlICBzaW1wbHkgIHdyaXRlICAiYmF0MCIgIGludG8gIGl0cwotIm1lc2hfaWZhY2UiIGZpbGUgaW5zaWRlIHRoZSBiYXRtYW5fYWR2IHN1YmZvbGRlcjoKLQotIyBlY2hvIGJhdDAgPiAvc3lzL2NsYXNzL25ldC9ldGgwL2JhdG1hbl9hZHYvbWVzaF9pZmFjZQotCi1SZXBlYXQgIHRoaXMgc3RlcCBmb3IgYWxsIGludGVyZmFjZXMgeW91IHdpc2ggdG8gYWRkLiAgTm93IGJhdG1hbgotc3RhcnRzIHVzaW5nL2Jyb2FkY2FzdGluZyBvbiB0aGlzL3RoZXNlIGludGVyZmFjZShzKS4KLQotQnkgcmVhZGluZyB0aGUgImlmYWNlX3N0YXR1cyIgZmlsZSB5b3UgY2FuIGNoZWNrIGl0cyBzdGF0dXM6Ci0KLSMgY2F0IC9zeXMvY2xhc3MvbmV0L2V0aDAvYmF0bWFuX2Fkdi9pZmFjZV9zdGF0dXMKLSMgYWN0aXZlCi0KLVRvIGRlYWN0aXZhdGUgYW4gaW50ZXJmYWNlIHlvdSBoYXZlICB0byAgd3JpdGUgICJub25lIiAgaW50byAgaXRzCi0ibWVzaF9pZmFjZSIgZmlsZToKLQotIyBlY2hvIG5vbmUgPiAvc3lzL2NsYXNzL25ldC9ldGgwL2JhdG1hbl9hZHYvbWVzaF9pZmFjZQotCi0KLUFsbCAgbWVzaCAgd2lkZSAgc2V0dGluZ3MgIGNhbiBiZSBmb3VuZCBpbiBiYXRtYW4ncyBvd24gaW50ZXJmYWNlCi1mb2xkZXI6Ci0KLSMgIGxzICAvc3lzL2NsYXNzL25ldC9iYXQwL21lc2gvCi0jICBhZ2dyZWdhdGVkX29nbXMgIGJvbmRpbmcgIG9yaWdfaW50ZXJ2YWwgIHZpc19tb2RlCi0KLQotVGhlcmUgaXMgYSBzcGVjaWFsIGZvbGRlciBmb3IgZGVidWdnaW5nIGluZm9ybWF0aW9uczoKLQotIyAgbHMgL3N5cy9rZXJuZWwvZGVidWcvYmF0bWFuX2Fkdi9iYXQwLwotIyAgb3JpZ2luYXRvcnMgIHNvY2tldCAgdHJhbnN0YWJsZV9nbG9iYWwgIHRyYW5zdGFibGVfbG9jYWwKLSMgIHZpc19kYXRhCi0KLQotU29tZSBvZiB0aGUgZmlsZXMgY29udGFpbiBhbGwgc29ydCBvZiBzdGF0dXMgaW5mb3JtYXRpb24gIHJlZ2FyZC0KLWluZyAgdGhlICBtZXNoICBuZXR3b3JrLiAgRm9yICBleGFtcGxlLCB5b3UgY2FuIHZpZXcgdGhlIHRhYmxlIG9mCi1vcmlnaW5hdG9ycyAobWVzaCBwYXJ0aWNpcGFudHMpIHdpdGg6Ci0KLSMgY2F0IC9zeXMva2VybmVsL2RlYnVnL2JhdG1hbl9hZHYvYmF0MC9vcmlnaW5hdG9ycwotCi1PdGhlciBmaWxlcyBhbGxvdyB0byBjaGFuZ2UgYmF0bWFuJ3MgYmVoYXZpb3VyIHRvIGJldHRlciBmaXQgeW91cgotcmVxdWlyZW1lbnRzLiAgRm9yIGluc3RhbmNlLCB5b3UgY2FuIGNoZWNrIHRoZSBjdXJyZW50IG9yaWdpbmF0b3IKLWludGVydmFsICh2YWx1ZSBpbiBtaWxsaXNlY29uZHMgd2hpY2ggZGV0ZXJtaW5lcyBob3cgb2Z0ZW4gYmF0bWFuCi1zZW5kcyBpdHMgYnJvYWRjYXN0IHBhY2tldHMpOgotCi0jIGNhdCAvc3lzL2NsYXNzL25ldC9iYXQwL21lc2gvb3JpZ19pbnRlcnZhbAotIyAxMDAwCi0KLWFuZCBhbHNvIGNoYW5nZSBpdHMgdmFsdWU6Ci0KLSMgZWNobyAzMDAwID4gL3N5cy9jbGFzcy9uZXQvYmF0MC9tZXNoL29yaWdfaW50ZXJ2YWwKLQotSW4gdmVyeSBtb2JpbGUgc2NlbmFyaW9zLCB5b3UgbWlnaHQgd2FudCB0byBhZGp1c3QgdGhlIG9yaWdpbmF0b3IKLWludGVydmFsIHRvIGEgbG93ZXIgdmFsdWUuIFRoaXMgd2lsbCBtYWtlIHRoZSBtZXNoICBtb3JlICByZXNwb24tCi1zaXZlIHRvIHRvcG9sb2d5IGNoYW5nZXMsIGJ1dCB3aWxsIGFsc28gaW5jcmVhc2UgdGhlIG92ZXJoZWFkLgotCi0KLVVTQUdFCi0tLS0tLQotCi1UbyAgbWFrZSB1c2Ugb2YgeW91ciBuZXdseSBjcmVhdGVkIG1lc2gsIGJhdG1hbiBhZHZhbmNlZCBwcm92aWRlcwotYSBuZXcgaW50ZXJmYWNlICJiYXQwIiB3aGljaCB5b3Ugc2hvdWxkIHVzZSBmcm9tIHRoaXMgIHBvaW50ICBvbi4KLUFsbCAgaW50ZXJmYWNlcyAgYWRkZWQgIHRvICBiYXRtYW4gIGFkdmFuY2VkIGFyZSBub3QgcmVsZXZhbnQgYW55Ci1sb25nZXIgYmVjYXVzZSBiYXRtYW4gaGFuZGxlcyB0aGVtIGZvciB5b3UuIEJhc2ljYWxseSwgb25lICJoYW5kcwotb3ZlciIgdGhlIGRhdGEgYnkgdXNpbmcgdGhlIGJhdG1hbiBpbnRlcmZhY2UgYW5kIGJhdG1hbiB3aWxsIG1ha2UKLXN1cmUgaXQgcmVhY2hlcyBpdHMgZGVzdGluYXRpb24uCi0KLVRoZSAiYmF0MCIgaW50ZXJmYWNlIGNhbiBiZSB1c2VkIGxpa2UgYW55ICBvdGhlciAgcmVndWxhciAgaW50ZXItCi1mYWNlLiAgSXQgbmVlZHMgYW4gSVAgYWRkcmVzcyB3aGljaCBjYW4gYmUgZWl0aGVyIHN0YXRpY2FsbHkgY29uLQotZmlndXJlZCBvciBkeW5hbWljYWxseSAoYnkgdXNpbmcgREhDUCBvciBzaW1pbGFyIHNlcnZpY2VzKToKLQotIyBOb2RlQTogaWZjb25maWcgYmF0MCAxOTIuMTY4LjAuMQotIyBOb2RlQjogaWZjb25maWcgYmF0MCAxOTIuMTY4LjAuMgotIyBOb2RlQjogcGluZyAxOTIuMTY4LjAuMQotCi1Ob3RlOiAgSW4gIG9yZGVyIHRvIGF2b2lkIHByb2JsZW1zIHJlbW92ZSBhbGwgSVAgYWRkcmVzc2VzIHByZXZpLQotb3VzbHkgYXNzaWduZWQgdG8gaW50ZXJmYWNlcyBub3cgdXNlZCBieSBiYXRtYW4gYWR2YW5jZWQsIGUuZy4KLQotIyBpZmNvbmZpZyBldGgwIDAuMC4wLjAKLQotCi1WSVNVQUxJWkFUSU9OCi0tLS0tLS0tLS0tLS0tCi0KLUlmIHlvdSB3YW50IHRvcG9sb2d5IHZpc3VhbGl6YXRpb24sIGF0IGxlYXN0IG9uZSBtZXNoICBub2RlICBtdXN0Ci1iZSBjb25maWd1cmVkIGFzIFZJUy1zZXJ2ZXI6Ci0KLSMgZWNobyAic2VydmVyIiA+IC9zeXMvY2xhc3MvbmV0L2JhdDAvbWVzaC92aXNfbW9kZQotCi1FYWNoICBub2RlICBpcyAgZWl0aGVyIGNvbmZpZ3VyZWQgYXMgInNlcnZlciIgb3IgYXMgImNsaWVudCIgKGRlLQotZmF1bHQ6ICJjbGllbnQiKS4gIENsaWVudHMgc2VuZCB0aGVpciB0b3BvbG9neSBkYXRhIHRvIHRoZSBzZXJ2ZXIKLW5leHQgdG8gdGhlbSwgYW5kIHNlcnZlciBzeW5jaHJvbml6ZSB3aXRoIG90aGVyIHNlcnZlcnMuIElmIHRoZXJlCi1pcyBubyBzZXJ2ZXIgY29uZmlndXJlZCAoZGVmYXVsdCkgd2l0aGluIHRoZSAgbWVzaCwgIG5vICB0b3BvbG9neQotaW5mb3JtYXRpb24gICB3aWxsICBiZSAgdHJhbnNtaXR0ZWQuICBXaXRoICB0aGVzZSAgInN5bmNocm9uaXppbmcKLXNlcnZlcnMiLCB0aGVyZSBjYW4gYmUgMSBvciBtb3JlIHZpcyBzZXJ2ZXJzIHNoYXJpbmcgdGhlIHNhbWUgKG9yCi1hdCBsZWFzdCB2ZXJ5IHNpbWlsYXIpIGRhdGEuCi0KLVdoZW4gIGNvbmZpZ3VyZWQgIGFzICBzZXJ2ZXIsICB5b3UgY2FuIGdldCBhIHRvcG9sb2d5IHNuYXBzaG90IG9mCi15b3VyIG1lc2g6Ci0KLSMgY2F0IC9zeXMva2VybmVsL2RlYnVnL2JhdG1hbl9hZHYvYmF0MC92aXNfZGF0YQotCi1UaGlzIHJhdyBvdXRwdXQgaXMgaW50ZW5kZWQgdG8gYmUgZWFzaWx5IHBhcnNhYmxlIGFuZCBjb252ZXJ0YWJsZQotd2l0aCAgb3RoZXIgdG9vbHMuIEhhdmUgYSBsb29rIGF0IHRoZSBiYXRjdGwgUkVBRE1FIGlmIHlvdSB3YW50IGEKLXZpcyBvdXRwdXQgaW4gZG90IG9yIGpzb24gZm9ybWF0IGZvciBpbnN0YW5jZSBhbmQgaG93IHRob3NlICBvdXQtCi1wdXRzIGNvdWxkIHRoZW4gYmUgdmlzdWFsaXNlZCBpbiBhbiBpbWFnZS4KLQotVGhlIHJhdyBmb3JtYXQgY29uc2lzdHMgb2YgY29tbWEgc2VwYXJhdGVkIHZhbHVlcyBwZXIgZW50cnkgd2hlcmUKLWVhY2ggZW50cnkgaXMgZ2l2aW5nIGluZm9ybWF0aW9uIGFib3V0IGEgIGNlcnRhaW4gIHNvdXJjZSAgaW50ZXItCi1mYWNlLiAgRWFjaCAgZW50cnkgY2FuL2hhcyB0byBoYXZlIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotLT4gIm1hYyIgLSBtYWMgYWRkcmVzcyBvZiBhbiBvcmlnaW5hdG9yJ3Mgc291cmNlIGludGVyZmFjZQotICAgICAgICAgICAoZWFjaCBsaW5lIGJlZ2lucyB3aXRoIGl0KQotLT4gIlRRIG1hYyAgdmFsdWUiICAtICBzcmMgbWFjJ3MgbGluayBxdWFsaXR5IHRvd2FyZHMgbWFjIGFkZHJlc3MKLSAgICAgICAgICAgICAgICAgICAgICAgb2YgYSBuZWlnaGJvciBvcmlnaW5hdG9yJ3MgaW50ZXJmYWNlIHdoaWNoCi0gICAgICAgICAgICAgICAgICAgICAgIGlzIGJlaW5nIHVzZWQgZm9yIHJvdXRpbmcKLS0+ICJITkEgbWFjIiAtIEhOQSBhbm5vdW5jZWQgYnkgc291cmNlIG1hYwotLT4gIlBSSU1BUlkiIC0gdGhpcyAgaXMgYSBwcmltYXJ5IGludGVyZmFjZQotLT4gIlNFQyBtYWMiIC0gc2Vjb25kYXJ5IG1hYyBhZGRyZXNzIG9mIHNvdXJjZQotICAgICAgICAgICAgICAgKHJlcXVpcmVzIHByZWNlZGluZyBQUklNQVJZKQotCi1UaGUgVFEgdmFsdWUgaGFzIGEgcmFuZ2UgZnJvbSA0IHRvIDI1NSB3aXRoIDI1NSBiZWluZyAgdGhlICBiZXN0LgotVGhlIEhOQSBlbnRyaWVzIGFyZSBzaG93aW5nIHdoaWNoIGhvc3RzIGFyZSBjb25uZWN0ZWQgdG8gdGhlIG1lc2gKLXZpYSBiYXQwIG9yIGJlaW5nIGJyaWRnZWQgaW50byB0aGUgbWVzaCBuZXR3b3JrLiAgVGhlIFBSSU1BUlkvU0VDCi12YWx1ZXMgYXJlIG9ubHkgYXBwbGllZCBvbiBwcmltYXJ5IGludGVyZmFjZXMKLQotCi1MT0dHSU5HL0RFQlVHR0lORwotLS0tLS0tLS0tLS0tLS0tLS0KLQotQWxsIGVycm9yIG1lc3NhZ2VzLCB3YXJuaW5ncyBhbmQgaW5mb3JtYXRpb24gbWVzc2FnZXMgYXJlIHNlbnQgdG8KLXRoZSBrZXJuZWwgbG9nLiBEZXBlbmRpbmcgb24geW91ciBvcGVyYXRpbmcgIHN5c3RlbSAgZGlzdHJpYnV0aW9uCi10aGlzICBjYW4gIGJlIHJlYWQgaW4gb25lIG9mIGEgbnVtYmVyIG9mIHdheXMuIFRyeSB1c2luZyB0aGUgY29tLQotbWFuZHM6IGRtZXNnLCBsb2dyZWFkLCBvciBsb29raW5nIGluIHRoZSBmaWxlcyAgL3Zhci9sb2cva2Vybi5sb2cKLW9yICAvdmFyL2xvZy9zeXNsb2cuICBBbGwgIGJhdG1hbi1hZHYgIG1lc3NhZ2VzIGFyZSBwcmVmaXhlZCB3aXRoCi0iYmF0bWFuLWFkdjoiIFNvIHRvIHNlZSBqdXN0IHRoZXNlIG1lc3NhZ2VzIHRyeQotCi0jIGRtZXNnIHwgZ3JlcCBiYXRtYW4tYWR2Ci0KLVdoZW4gaW52ZXN0aWdhdGluZyBwcm9ibGVtcyB3aXRoIHlvdXIgbWVzaCBuZXR3b3JrICBpdCAgaXMgIHNvbWUtCi10aW1lcyAgbmVjZXNzYXJ5ICB0byBzZWUgbW9yZSBkZXRhaWwgZGVidWcgbWVzc2FnZXMuIFRoaXMgbXVzdCBiZQotZW5hYmxlZCB3aGVuIGNvbXBpbGluZyB0aGUgYmF0bWFuLWFkdiBtb2R1bGUuIFdoZW4gYnVpbGRpbmcgIGJhdC0KLW1hbi1hZHYgIGFzICBwYXJ0IG9mIGtlcm5lbCwgdXNlICJtYWtlIG1lbnVjb25maWciIGFuZCBlbmFibGUgdGhlCi1vcHRpb24gIkIuQS5ULk0uQS5OLiBkZWJ1Z2dpbmciLgotCi1UaG9zZSBhZGRpdGlvbmFsICBkZWJ1ZyBtZXNzYWdlcyBjYW4gYmUgYWNjZXNzZWQgIHVzaW5nIGEgc3BlY2lhbAotZmlsZSBpbiBkZWJ1Z2ZzCi0KLSMgY2F0IC9zeXMva2VybmVsL2RlYnVnL2JhdG1hbl9hZHYvYmF0MC9sb2cKLQotVGhlIGFkZGl0aW9uYWwgZGVidWcgb3V0cHV0IGlzIGJ5IGRlZmF1bHQgZGlzYWJsZWQuIEl0IGNhbiBiZSBlbi0KLWFibGVkICBkdXJpbmcgcnVuIHRpbWUuIEZvbGxvd2luZyBsb2dfbGV2ZWxzIGFyZSBkZWZpbmVkOgotCi0wIC0gQWxsICBkZWJ1ZyAgb3V0cHV0ICBkaXNhYmxlZAotMSAtIEVuYWJsZSBtZXNzYWdlcyByZWxhdGVkIHRvIHJvdXRpbmcgLyBmbG9vZGluZyAvIGJyb2FkY2FzdGluZwotMiAtIEVuYWJsZSByb3V0ZSBvciBobmEgYWRkZWQgLyBjaGFuZ2VkIC8gZGVsZXRlZAotMyAtIEVuYWJsZSBhbGwgbWVzc2FnZXMKLQotVGhlIGRlYnVnIG91dHB1dCBjYW4gYmUgY2hhbmdlZCBhdCBydW50aW1lICB1c2luZyAgdGhlICBmaWxlCi0vc3lzL2NsYXNzL25ldC9iYXQwL21lc2gvbG9nX2xldmVsLiBlLmcuCi0KLSMgZWNobyAyID4gL3N5cy9jbGFzcy9uZXQvYmF0MC9tZXNoL2xvZ19sZXZlbAotCi13aWxsIGVuYWJsZSBkZWJ1ZyBtZXNzYWdlcyBmb3Igd2hlbiByb3V0ZXMgb3IgSE5BcyBjaGFuZ2UuCi0KLQotQkFUQ1RMCi0tLS0tLS0KLQotQXMgYmF0bWFuIGFkdmFuY2VkIG9wZXJhdGVzIG9uIGxheWVyIDIgYWxsIGhvc3RzIHBhcnRpY2lwYXRpbmcgaW4KLXRoZSAgdmlydHVhbCBzd2l0Y2ggYXJlIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQgZm9yIGFsbCAgcHJvdG9jb2xzCi1hYm92ZSBsYXllciAyLiBUaGVyZWZvcmUgdGhlIGNvbW1vbiBkaWFnbm9zaXMgdG9vbHMgZG8gIG5vdCAgd29yawotYXMgIGV4cGVjdGVkLiAgVG8gIG92ZXJjb21lIHRoZXNlIHByb2JsZW1zIGJhdGN0bCB3YXMgY3JlYXRlZC4gQXQKLXRoZSAgbW9tZW50IHRoZSAgYmF0Y3RsIGNvbnRhaW5zIHBpbmcsICB0cmFjZXJvdXRlLCAgdGNwZHVtcCAgYW5kCi1pbnRlcmZhY2VzIHRvIHRoZSBrZXJuZWwgbW9kdWxlIHNldHRpbmdzLgotCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHNlZSB0aGUgbWFucGFnZSAobWFuIGJhdGN0bCkuCi0KLWJhdGN0bCBpcyBhdmFpbGFibGUgb24gaHR0cDovL3d3dy5vcGVuLW1lc2gub3JnLwotCi0KLUNPTlRBQ1QKLS0tLS0tLS0KLQotUGxlYXNlIHNlbmQgdXMgY29tbWVudHMsIGV4cGVyaWVuY2VzLCBxdWVzdGlvbnMsIGFueXRoaW5nIDopCi0KLUlSQzogICAgICAgICAgICAjYmF0bWFuICAgb24gICBpcmMuZnJlZW5vZGUub3JnCi1NYWlsaW5nLWxpc3Q6ICAgYi5hLnQubS5hLm5AYi5hLnQubS5hLm5AbGlzdHMub3Blbi1tZXNoLm9yZwotICAgICAgICAgICAgICAgIChvcHRpb25hbCAgIHN1YnNjcmlwdGlvbiAgIGF0Ci0gICAgICAgICAgICAgICAgIGh0dHBzOi8vbGlzdHMub3Blbi1tZXNoLm9yZy9tbS9saXN0aW5mby9iLmEudC5tLmEubikKLQotWW91IGNhbiBhbHNvIGNvbnRhY3QgdGhlIEF1dGhvcnM6Ci0KLU1hcmVrICBMaW5kbmVyICA8bGluZG5lcl9tYXJla0B5YWhvby5kZT4KLVNpbW9uICBXdW5kZXJsaWNoICA8c2l3dUBocnoudHUtY2hlbW5pdHouZGU+Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9UT0RPCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWMzODRmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L1RPRE8KKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0gKiByZW1vdmUgb3duIGxpc3QgZnVuY3Rpb25hbGl0eSBmcm9tIGhhc2gKLSAqIHVzZSBobGlzdF9oZWFkLCBobGlzdF9ub2RlIGluIGhhc2gKLSAqIGRvbid0IHVzZSBjYWxsYmFja3MgZm9yIGNvbXBhcmUrY2hvb3NlIGluIGhhc2gKLSAqIHRoaW5rIGFib3V0IG1vcmUgZWZmaWNpZW50IHdheXMgaW5zdGVhZCBvZiBhYnN0cmFjdGlvbiBvZiBoYXNoCi0gKiBSZXF1ZXN0IGEgbmV3IHJldmlldwotICogUHJvY2VzcyB0aGUgY29tbWVudHMgZnJvbSB0aGUgcmV2aWV3Ci0gKiBNb3ZlIGludG8gbWFpbmxpbmUgcHJvcGVyCi0KLVBsZWFzZSBzZW5kIGFsbCBwYXRjaGVzIHRvOgotCU1hcmVrIExpbmRuZXIgPGxpbmRuZXJfbWFyZWtAeWFob28uZGU+Ci0JU2ltb24gV3VuZGVybGljaCA8c2l3dUBocnoudHUtY2hlbW5pdHouZGU+Ci0JQW5kcmV3IEx1bm4gPGFuZHJld0BsdW5uLmNoPgotCWIuYS50Lm0uYS5uQGxpc3RzLm9wZW4tbWVzaC5vcmcKLQlHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdraEBzdXNlLmRlPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYWdncmVnYXRpb24uYyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2FnZ3JlZ2F0aW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NjI0ZDQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYWdncmVnYXRpb24uYworKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKLSAqCi0gKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxLCBVU0EKLSAqCi0gKi8KLQotI2luY2x1ZGUgIm1haW4uaCIKLSNpbmNsdWRlICJhZ2dyZWdhdGlvbi5oIgotI2luY2x1ZGUgInNlbmQuaCIKLSNpbmNsdWRlICJyb3V0aW5nLmgiCi0KLS8qIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgaG5hIGluZm9ybWF0aW9uIGZvciBhIGdpdmVuIHBhY2tldCAqLwotc3RhdGljIGludCBobmFfbGVuKHN0cnVjdCBiYXRtYW5fcGFja2V0ICpiYXRtYW5fcGFja2V0KQotewotCXJldHVybiBiYXRtYW5fcGFja2V0LT5udW1faG5hICogRVRIX0FMRU47Ci19Ci0KLS8qIHJldHVybiB0cnVlIGlmIG5ld19wYWNrZXQgY2FuIGJlIGFnZ3JlZ2F0ZWQgd2l0aCBmb3J3X3BhY2tldCAqLwotc3RhdGljIGJvb2wgY2FuX2FnZ3JlZ2F0ZV93aXRoKHN0cnVjdCBiYXRtYW5fcGFja2V0ICpuZXdfYmF0bWFuX3BhY2tldCwKLQkJCSAgICAgICBpbnQgcGFja2V0X2xlbiwKLQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHNlbmRfdGltZSwKLQkJCSAgICAgICBib29sIGRpcmVjdGxpbmssCi0JCQkgICAgICAgc3RydWN0IGJhdG1hbl9pZiAqaWZfaW5jb21pbmcsCi0JCQkgICAgICAgc3RydWN0IGZvcndfcGFja2V0ICpmb3J3X3BhY2tldCkKLXsKLQlzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldCA9Ci0JCShzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqKWZvcndfcGFja2V0LT5za2ItPmRhdGE7Ci0JaW50IGFnZ3JlZ2F0ZWRfYnl0ZXMgPSBmb3J3X3BhY2tldC0+cGFja2V0X2xlbiArIHBhY2tldF9sZW47Ci0KLQkvKioKLQkgKiB3ZSBjYW4gYWdncmVnYXRlIHRoZSBjdXJyZW50IHBhY2tldCB0byB0aGlzIGFnZ3JlZ2F0ZWQgcGFja2V0Ci0JICogaWY6Ci0JICoKLQkgKiAtIHRoZSBzZW5kIHRpbWUgaXMgd2l0aGluIG91ciBNQVhfQUdHUkVHQVRJT05fTVMgdGltZQotCSAqIC0gdGhlIHJlc3VsdGluZyBwYWNrZXQgd29udCBiZSBiaWdnZXIgdGhhbgotCSAqICAgTUFYX0FHR1JFR0FUSU9OX0JZVEVTCi0JICovCi0KLQlpZiAodGltZV9iZWZvcmUoc2VuZF90aW1lLCBmb3J3X3BhY2tldC0+c2VuZF90aW1lKSAmJgotCSAgICB0aW1lX2FmdGVyX2VxKHNlbmRfdGltZSArIG1zZWNzX3RvX2ppZmZpZXMoTUFYX0FHR1JFR0FUSU9OX01TKSwKLQkJCQkJZm9yd19wYWNrZXQtPnNlbmRfdGltZSkgJiYKLQkgICAgKGFnZ3JlZ2F0ZWRfYnl0ZXMgPD0gTUFYX0FHR1JFR0FUSU9OX0JZVEVTKSkgewotCi0JCS8qKgotCQkgKiBjaGVjayBhZ2dyZWdhdGlvbiBjb21wYXRpYmlsaXR5Ci0JCSAqIC0+IGRpcmVjdCBsaW5rIHBhY2tldHMgYXJlIGJyb2FkY2FzdGVkIG9uCi0JCSAqICAgIHRoZWlyIGludGVyZmFjZSBvbmx5Ci0JCSAqIC0+IGFnZ3JlZ2F0ZSBwYWNrZXQgaWYgdGhlIGN1cnJlbnQgcGFja2V0IGlzCi0JCSAqICAgIGEgImdsb2JhbCIgcGFja2V0IGFzIHdlbGwgYXMgdGhlIGJhc2UKLQkJICogICAgcGFja2V0Ci0JCSAqLwotCi0JCS8qIHBhY2tldHMgd2l0aG91dCBkaXJlY3QgbGluayBmbGFnIGFuZCBoaWdoIFRUTAotCQkgKiBhcmUgZmxvb2RlZCB0aHJvdWdoIHRoZSBuZXQgICovCi0JCWlmICgoIWRpcmVjdGxpbmspICYmCi0JCSAgICAoIShiYXRtYW5fcGFja2V0LT5mbGFncyAmIERJUkVDVExJTkspKSAmJgotCQkgICAgKGJhdG1hbl9wYWNrZXQtPnR0bCAhPSAxKSAmJgotCi0JCSAgICAvKiBvd24gcGFja2V0cyBvcmlnaW5hdGluZyBub24tcHJpbWFyeQotCQkgICAgICogaW50ZXJmYWNlcyBsZWF2ZSBvbmx5IHRoYXQgaW50ZXJmYWNlICovCi0JCSAgICAoKCFmb3J3X3BhY2tldC0+b3duKSB8fAotCQkgICAgIChmb3J3X3BhY2tldC0+aWZfaW5jb21pbmctPmlmX251bSA9PSAwKSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQkvKiBpZiB0aGUgaW5jb21pbmcgcGFja2V0IGlzIHNlbnQgdmlhIHRoaXMgb25lCi0JCSAqIGludGVyZmFjZSBvbmx5IC0gd2Ugc3RpbGwgY2FuIGFnZ3JlZ2F0ZSAqLwotCQlpZiAoKGRpcmVjdGxpbmspICYmCi0JCSAgICAobmV3X2JhdG1hbl9wYWNrZXQtPnR0bCA9PSAxKSAmJgotCQkgICAgKGZvcndfcGFja2V0LT5pZl9pbmNvbWluZyA9PSBpZl9pbmNvbWluZykgJiYKLQotCQkgICAgLyogcGFja2V0cyBmcm9tIGRpcmVjdCBuZWlnaGJvcnMgb3IKLQkJICAgICAqIG93biBzZWNvbmRhcnkgaW50ZXJmYWNlIHBhY2tldHMKLQkJICAgICAqICg9IHNlY29uZGFyeSBpbnRlcmZhY2UgcGFja2V0cyBpbiBnZW5lcmFsKSAqLwotCQkgICAgKGJhdG1hbl9wYWNrZXQtPmZsYWdzICYgRElSRUNUTElOSyB8fAotCQkgICAgIChmb3J3X3BhY2tldC0+b3duICYmCi0JCSAgICAgIGZvcndfcGFja2V0LT5pZl9pbmNvbWluZy0+aWZfbnVtICE9IDApKSkKLQkJCXJldHVybiB0cnVlOwotCX0KLQotCXJldHVybiBmYWxzZTsKLX0KLQotI2RlZmluZSBhdG9taWNfZGVjX25vdF96ZXJvKHYpICAgICAgICAgIGF0b21pY19hZGRfdW5sZXNzKCh2KSwgLTEsIDApCi0vKiBjcmVhdGUgYSBuZXcgYWdncmVnYXRlZCBwYWNrZXQgYW5kIGFkZCB0aGlzIHBhY2tldCB0byBpdCAqLwotc3RhdGljIHZvaWQgbmV3X2FnZ3JlZ2F0ZWRfcGFja2V0KHVuc2lnbmVkIGNoYXIgKnBhY2tldF9idWZmLCBpbnQgcGFja2V0X2xlbiwKLQkJCQkgIHVuc2lnbmVkIGxvbmcgc2VuZF90aW1lLCBib29sIGRpcmVjdF9saW5rLAotCQkJCSAgc3RydWN0IGJhdG1hbl9pZiAqaWZfaW5jb21pbmcsCi0JCQkJICBpbnQgb3duX3BhY2tldCkKLXsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoaWZfaW5jb21pbmctPnNvZnRfaWZhY2UpOwotCXN0cnVjdCBmb3J3X3BhY2tldCAqZm9yd19wYWNrZXRfYWdncjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGNoYXIgKnNrYl9idWZmOwotCi0JLyogb3duIHBhY2tldCBzaG91bGQgYWx3YXlzIGJlIHNjaGVkdWxlZCAqLwotCWlmICghb3duX3BhY2tldCkgewotCQlpZiAoIWF0b21pY19kZWNfbm90X3plcm8oJmJhdF9wcml2LT5iYXRtYW5fcXVldWVfbGVmdCkpIHsKLQkJCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCi0JCQkJImJhdG1hbiBwYWNrZXQgcXVldWUgZnVsbFxuIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlmb3J3X3BhY2tldF9hZ2dyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGZvcndfcGFja2V0KSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFmb3J3X3BhY2tldF9hZ2dyKSB7Ci0JCWlmICghb3duX3BhY2tldCkKLQkJCWF0b21pY19pbmMoJmJhdF9wcml2LT5iYXRtYW5fcXVldWVfbGVmdCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoKGF0b21pY19yZWFkKCZiYXRfcHJpdi0+YWdncmVnYXRpb25fZW5hYmxlZCkpICYmCi0JICAgIChwYWNrZXRfbGVuIDwgTUFYX0FHR1JFR0FUSU9OX0JZVEVTKSkKLQkJZm9yd19wYWNrZXRfYWdnci0+c2tiID0gZGV2X2FsbG9jX3NrYihNQVhfQUdHUkVHQVRJT05fQllURVMgKwotCQkJCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBldGhoZHIpKTsKLQllbHNlCi0JCWZvcndfcGFja2V0X2FnZ3ItPnNrYiA9IGRldl9hbGxvY19za2IocGFja2V0X2xlbiArCi0JCQkJCQkgICAgICBzaXplb2Yoc3RydWN0IGV0aGhkcikpOwotCi0JaWYgKCFmb3J3X3BhY2tldF9hZ2dyLT5za2IpIHsKLQkJaWYgKCFvd25fcGFja2V0KQotCQkJYXRvbWljX2luYygmYmF0X3ByaXYtPmJhdG1hbl9xdWV1ZV9sZWZ0KTsKLQkJa2ZyZWUoZm9yd19wYWNrZXRfYWdncik7Ci0JCXJldHVybjsKLQl9Ci0Jc2tiX3Jlc2VydmUoZm9yd19wYWNrZXRfYWdnci0+c2tiLCBzaXplb2Yoc3RydWN0IGV0aGhkcikpOwotCi0JSU5JVF9ITElTVF9OT0RFKCZmb3J3X3BhY2tldF9hZ2dyLT5saXN0KTsKLQotCXNrYl9idWZmID0gc2tiX3B1dChmb3J3X3BhY2tldF9hZ2dyLT5za2IsIHBhY2tldF9sZW4pOwotCWZvcndfcGFja2V0X2FnZ3ItPnBhY2tldF9sZW4gPSBwYWNrZXRfbGVuOwotCW1lbWNweShza2JfYnVmZiwgcGFja2V0X2J1ZmYsIHBhY2tldF9sZW4pOwotCi0JZm9yd19wYWNrZXRfYWdnci0+b3duID0gb3duX3BhY2tldDsKLQlmb3J3X3BhY2tldF9hZ2dyLT5pZl9pbmNvbWluZyA9IGlmX2luY29taW5nOwotCWZvcndfcGFja2V0X2FnZ3ItPm51bV9wYWNrZXRzID0gMDsKLQlmb3J3X3BhY2tldF9hZ2dyLT5kaXJlY3RfbGlua19mbGFncyA9IDA7Ci0JZm9yd19wYWNrZXRfYWdnci0+c2VuZF90aW1lID0gc2VuZF90aW1lOwotCi0JLyogc2F2ZSBwYWNrZXQgZGlyZWN0IGxpbmsgZmxhZyBzdGF0dXMgKi8KLQlpZiAoZGlyZWN0X2xpbmspCi0JCWZvcndfcGFja2V0X2FnZ3ItPmRpcmVjdF9saW5rX2ZsYWdzIHw9IDE7Ci0KLQkvKiBhZGQgbmV3IHBhY2tldCB0byBwYWNrZXQgbGlzdCAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+Zm9yd19iYXRfbGlzdF9sb2NrLCBmbGFncyk7Ci0JaGxpc3RfYWRkX2hlYWQoJmZvcndfcGFja2V0X2FnZ3ItPmxpc3QsICZiYXRfcHJpdi0+Zm9yd19iYXRfbGlzdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPmZvcndfYmF0X2xpc3RfbG9jaywgZmxhZ3MpOwotCi0JLyogc3RhcnQgdGltZXIgZm9yIHRoaXMgcGFja2V0ICovCi0JSU5JVF9ERUxBWUVEX1dPUksoJmZvcndfcGFja2V0X2FnZ3ItPmRlbGF5ZWRfd29yaywKLQkJCSAgc2VuZF9vdXRzdGFuZGluZ19iYXRfcGFja2V0KTsKLQlxdWV1ZV9kZWxheWVkX3dvcmsoYmF0X2V2ZW50X3dvcmtxdWV1ZSwKLQkJCSAgICZmb3J3X3BhY2tldF9hZ2dyLT5kZWxheWVkX3dvcmssCi0JCQkgICBzZW5kX3RpbWUgLSBqaWZmaWVzKTsKLX0KLQotLyogYWdncmVnYXRlIGEgbmV3IHBhY2tldCBpbnRvIHRoZSBleGlzdGluZyBhZ2dyZWdhdGlvbiAqLwotc3RhdGljIHZvaWQgYWdncmVnYXRlKHN0cnVjdCBmb3J3X3BhY2tldCAqZm9yd19wYWNrZXRfYWdnciwKLQkJICAgICAgdW5zaWduZWQgY2hhciAqcGFja2V0X2J1ZmYsCi0JCSAgICAgIGludCBwYWNrZXRfbGVuLAotCQkgICAgICBib29sIGRpcmVjdF9saW5rKQotewotCXVuc2lnbmVkIGNoYXIgKnNrYl9idWZmOwotCi0Jc2tiX2J1ZmYgPSBza2JfcHV0KGZvcndfcGFja2V0X2FnZ3ItPnNrYiwgcGFja2V0X2xlbik7Ci0JbWVtY3B5KHNrYl9idWZmLCBwYWNrZXRfYnVmZiwgcGFja2V0X2xlbik7Ci0JZm9yd19wYWNrZXRfYWdnci0+cGFja2V0X2xlbiArPSBwYWNrZXRfbGVuOwotCWZvcndfcGFja2V0X2FnZ3ItPm51bV9wYWNrZXRzKys7Ci0KLQkvKiBzYXZlIHBhY2tldCBkaXJlY3QgbGluayBmbGFnIHN0YXR1cyAqLwotCWlmIChkaXJlY3RfbGluaykKLQkJZm9yd19wYWNrZXRfYWdnci0+ZGlyZWN0X2xpbmtfZmxhZ3MgfD0KLQkJCSgxIDw8IGZvcndfcGFja2V0X2FnZ3ItPm51bV9wYWNrZXRzKTsKLX0KLQotdm9pZCBhZGRfYmF0X3BhY2tldF90b19saXN0KHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkgICAgdW5zaWduZWQgY2hhciAqcGFja2V0X2J1ZmYsIGludCBwYWNrZXRfbGVuLAotCQkJICAgIHN0cnVjdCBiYXRtYW5faWYgKmlmX2luY29taW5nLCBjaGFyIG93bl9wYWNrZXQsCi0JCQkgICAgdW5zaWduZWQgbG9uZyBzZW5kX3RpbWUpCi17Ci0JLyoqCi0JICogX2FnZ3IgLT4gcG9pbnRlciB0byB0aGUgcGFja2V0IHdlIHdhbnQgdG8gYWdncmVnYXRlIHdpdGgKLQkgKiBfcG9zIC0+IHBvaW50ZXIgdG8gdGhlIHBvc2l0aW9uIGluIHRoZSBxdWV1ZQotCSAqLwotCXN0cnVjdCBmb3J3X3BhY2tldCAqZm9yd19wYWNrZXRfYWdnciA9IE5VTEwsICpmb3J3X3BhY2tldF9wb3MgPSBOVUxMOwotCXN0cnVjdCBobGlzdF9ub2RlICp0bXBfbm9kZTsKLQlzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldCA9Ci0JCShzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqKXBhY2tldF9idWZmOwotCWJvb2wgZGlyZWN0X2xpbmsgPSBiYXRtYW5fcGFja2V0LT5mbGFncyAmIERJUkVDVExJTksgPyAxIDogMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JLyogZmluZCBwb3NpdGlvbiBmb3IgdGhlIHBhY2tldCBpbiB0aGUgZm9yd2FyZCBxdWV1ZSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+Zm9yd19iYXRfbGlzdF9sb2NrLCBmbGFncyk7Ci0JLyogb3duIHBhY2tldHMgYXJlIG5vdCB0byBiZSBhZ2dyZWdhdGVkICovCi0JaWYgKChhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmFnZ3JlZ2F0aW9uX2VuYWJsZWQpKSAmJiAoIW93bl9wYWNrZXQpKSB7Ci0JCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGZvcndfcGFja2V0X3BvcywgdG1wX25vZGUsCi0JCQkJICAgICAmYmF0X3ByaXYtPmZvcndfYmF0X2xpc3QsIGxpc3QpIHsKLQkJCWlmIChjYW5fYWdncmVnYXRlX3dpdGgoYmF0bWFuX3BhY2tldCwKLQkJCQkJICAgICAgIHBhY2tldF9sZW4sCi0JCQkJCSAgICAgICBzZW5kX3RpbWUsCi0JCQkJCSAgICAgICBkaXJlY3RfbGluaywKLQkJCQkJICAgICAgIGlmX2luY29taW5nLAotCQkJCQkgICAgICAgZm9yd19wYWNrZXRfcG9zKSkgewotCQkJCWZvcndfcGFja2V0X2FnZ3IgPSBmb3J3X3BhY2tldF9wb3M7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiBub3RoaW5nIHRvIGFnZ3JlZ2F0ZSB3aXRoIC0gZWl0aGVyIGFnZ3JlZ2F0aW9uIGRpc2FibGVkIG9yIG5vCi0JICogc3VpdGFibGUgYWdncmVnYXRpb24gcGFja2V0IGZvdW5kICovCi0JaWYgKGZvcndfcGFja2V0X2FnZ3IgPT0gTlVMTCkgewotCQkvKiB0aGUgZm9sbG93aW5nIHNlY3Rpb24gY2FuIHJ1biB3aXRob3V0IHRoZSBsb2NrICovCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5mb3J3X2JhdF9saXN0X2xvY2ssIGZsYWdzKTsKLQotCQkvKioKLQkJICogaWYgd2UgY291bGQgbm90IGFnZ3JlZ2F0ZSB0aGlzIHBhY2tldCB3aXRoIG9uZSBvZiB0aGUgb3RoZXJzCi0JCSAqIHdlIGhvbGQgaXQgYmFjayBmb3IgYSB3aGlsZSwgc28gdGhhdCBpdCBtaWdodCBiZSBhZ2dyZWdhdGVkCi0JCSAqIGxhdGVyIG9uCi0JCSAqLwotCQlpZiAoKCFvd25fcGFja2V0KSAmJgotCQkgICAgKGF0b21pY19yZWFkKCZiYXRfcHJpdi0+YWdncmVnYXRpb25fZW5hYmxlZCkpKQotCQkJc2VuZF90aW1lICs9IG1zZWNzX3RvX2ppZmZpZXMoTUFYX0FHR1JFR0FUSU9OX01TKTsKLQotCQluZXdfYWdncmVnYXRlZF9wYWNrZXQocGFja2V0X2J1ZmYsIHBhY2tldF9sZW4sCi0JCQkJICAgICAgc2VuZF90aW1lLCBkaXJlY3RfbGluaywKLQkJCQkgICAgICBpZl9pbmNvbWluZywgb3duX3BhY2tldCk7Ci0JfSBlbHNlIHsKLQkJYWdncmVnYXRlKGZvcndfcGFja2V0X2FnZ3IsCi0JCQkgIHBhY2tldF9idWZmLCBwYWNrZXRfbGVuLAotCQkJICBkaXJlY3RfbGluayk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5mb3J3X2JhdF9saXN0X2xvY2ssIGZsYWdzKTsKLQl9Ci19Ci0KLS8qIHVucGFjayB0aGUgYWdncmVnYXRlZCBwYWNrZXRzIGFuZCBwcm9jZXNzIHRoZW0gb25lIGJ5IG9uZSAqLwotdm9pZCByZWNlaXZlX2FnZ3JfYmF0X3BhY2tldChzdHJ1Y3QgZXRoaGRyICpldGhoZHIsIHVuc2lnbmVkIGNoYXIgKnBhY2tldF9idWZmLAotCQkJICAgICBpbnQgcGFja2V0X2xlbiwgc3RydWN0IGJhdG1hbl9pZiAqaWZfaW5jb21pbmcpCi17Ci0Jc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQ7Ci0JaW50IGJ1ZmZfcG9zID0gMDsKLQl1bnNpZ25lZCBjaGFyICpobmFfYnVmZjsKLQotCWJhdG1hbl9wYWNrZXQgPSAoc3RydWN0IGJhdG1hbl9wYWNrZXQgKilwYWNrZXRfYnVmZjsKLQotCWRvIHsKLQkJLyogbmV0d29yayB0byBob3N0IG9yZGVyIGZvciBvdXIgMzJiaXQgc2Vxbm8sIGFuZCB0aGUKLQkJICAgb3JpZ19pbnRlcnZhbC4gKi8KLQkJYmF0bWFuX3BhY2tldC0+c2Vxbm8gPSBudG9obChiYXRtYW5fcGFja2V0LT5zZXFubyk7Ci0KLQkJaG5hX2J1ZmYgPSBwYWNrZXRfYnVmZiArIGJ1ZmZfcG9zICsgQkFUX1BBQ0tFVF9MRU47Ci0JCXJlY2VpdmVfYmF0X3BhY2tldChldGhoZHIsIGJhdG1hbl9wYWNrZXQsCi0JCQkJICAgaG5hX2J1ZmYsIGhuYV9sZW4oYmF0bWFuX3BhY2tldCksCi0JCQkJICAgaWZfaW5jb21pbmcpOwotCi0JCWJ1ZmZfcG9zICs9IEJBVF9QQUNLRVRfTEVOICsgaG5hX2xlbihiYXRtYW5fcGFja2V0KTsKLQkJYmF0bWFuX3BhY2tldCA9IChzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqKQotCQkJKHBhY2tldF9idWZmICsgYnVmZl9wb3MpOwotCX0gd2hpbGUgKGFnZ3JlZ2F0ZWRfcGFja2V0KGJ1ZmZfcG9zLCBwYWNrZXRfbGVuLAotCQkJCSAgIGJhdG1hbl9wYWNrZXQtPm51bV9obmEpKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2FnZ3JlZ2F0aW9uLmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9hZ2dyZWdhdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWE5MWIzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2FnZ3JlZ2F0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKLSAqCi0gKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxLCBVU0EKLSAqCi0gKi8KLQotI2lmbmRlZiBfTkVUX0JBVE1BTl9BRFZfQUdHUkVHQVRJT05fSF8KLSNkZWZpbmUgX05FVF9CQVRNQU5fQURWX0FHR1JFR0FUSU9OX0hfCi0KLSNpbmNsdWRlICJtYWluLmgiCi0KLS8qIGlzIHRoZXJlIGFub3RoZXIgYWdncmVnYXRlZCBwYWNrZXQgaGVyZT8gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGFnZ3JlZ2F0ZWRfcGFja2V0KGludCBidWZmX3BvcywgaW50IHBhY2tldF9sZW4sIGludCBudW1faG5hKQotewotCWludCBuZXh0X2J1ZmZfcG9zID0gYnVmZl9wb3MgKyBCQVRfUEFDS0VUX0xFTiArIChudW1faG5hICogRVRIX0FMRU4pOwotCi0JcmV0dXJuIChuZXh0X2J1ZmZfcG9zIDw9IHBhY2tldF9sZW4pICYmCi0JCShuZXh0X2J1ZmZfcG9zIDw9IE1BWF9BR0dSRUdBVElPTl9CWVRFUyk7Ci19Ci0KLXZvaWQgYWRkX2JhdF9wYWNrZXRfdG9fbGlzdChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJICAgIHVuc2lnbmVkIGNoYXIgKnBhY2tldF9idWZmLCBpbnQgcGFja2V0X2xlbiwKLQkJCSAgICBzdHJ1Y3QgYmF0bWFuX2lmICppZl9pbmNvbWluZywgY2hhciBvd25fcGFja2V0LAotCQkJICAgIHVuc2lnbmVkIGxvbmcgc2VuZF90aW1lKTsKLXZvaWQgcmVjZWl2ZV9hZ2dyX2JhdF9wYWNrZXQoc3RydWN0IGV0aGhkciAqZXRoaGRyLCB1bnNpZ25lZCBjaGFyICpwYWNrZXRfYnVmZiwKLQkJCSAgICAgaW50IHBhY2tldF9sZW4sIHN0cnVjdCBiYXRtYW5faWYgKmlmX2luY29taW5nKTsKLQotI2VuZGlmIC8qIF9ORVRfQkFUTUFOX0FEVl9BR0dSRUdBVElPTl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYmF0X2RlYnVnZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2JhdF9kZWJ1Z2ZzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3Zjg0YTkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYmF0X2RlYnVnZnMuYworKysgL2Rldi9udWxsCkBAIC0xLDM0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6Ci0gKgotICogTWFyZWsgTGluZG5lcgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotICogMDIxMTAtMTMwMSwgVVNBCi0gKgotICovCi0KLSNpbmNsdWRlICJtYWluLmgiCi0KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0KLSNpbmNsdWRlICJiYXRfZGVidWdmcy5oIgotI2luY2x1ZGUgInRyYW5zbGF0aW9uLXRhYmxlLmgiCi0jaW5jbHVkZSAib3JpZ2luYXRvci5oIgotI2luY2x1ZGUgImhhcmQtaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAidmlzLmgiCi0jaW5jbHVkZSAiaWNtcF9zb2NrZXQuaCIKLQotc3RhdGljIHN0cnVjdCBkZW50cnkgKmJhdF9kZWJ1Z2ZzOwotCi0jaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfREVCVUcKLSNkZWZpbmUgTE9HX0JVRkZfTUFTSyAobG9nX2J1ZmZfbGVuLTEpCi0jZGVmaW5lIExPR19CVUZGKGlkeCkgKGRlYnVnX2xvZy0+bG9nX2J1ZmZbKGlkeCkgJiBMT0dfQlVGRl9NQVNLXSkKLQotc3RhdGljIGludCBsb2dfYnVmZl9sZW4gPSBMT0dfQlVGX0xFTjsKLQotc3RhdGljIHZvaWQgZW1pdF9sb2dfY2hhcihzdHJ1Y3QgZGVidWdfbG9nICpkZWJ1Z19sb2csIGNoYXIgYykKLXsKLQlMT0dfQlVGRihkZWJ1Z19sb2ctPmxvZ19lbmQpID0gYzsKLQlkZWJ1Z19sb2ctPmxvZ19lbmQrKzsKLQotCWlmIChkZWJ1Z19sb2ctPmxvZ19lbmQgLSBkZWJ1Z19sb2ctPmxvZ19zdGFydCA+IGxvZ19idWZmX2xlbikKLQkJZGVidWdfbG9nLT5sb2dfc3RhcnQgPSBkZWJ1Z19sb2ctPmxvZ19lbmQgLSBsb2dfYnVmZl9sZW47Ci19Ci0KLXN0YXRpYyBpbnQgZmRlYnVnX2xvZyhzdHJ1Y3QgZGVidWdfbG9nICpkZWJ1Z19sb2csIGNoYXIgKmZtdCwgLi4uKQotewotCWludCBwcmludGVkX2xlbjsKLQl2YV9saXN0IGFyZ3M7Ci0Jc3RhdGljIGNoYXIgZGVidWdfbG9nX2J1ZlsyNTZdOwotCWNoYXIgKnA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICghZGVidWdfbG9nKQotCQlyZXR1cm4gMDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkZWJ1Z19sb2ctPmxvY2ssIGZsYWdzKTsKLQl2YV9zdGFydChhcmdzLCBmbXQpOwotCXByaW50ZWRfbGVuID0gdnNjbnByaW50ZihkZWJ1Z19sb2dfYnVmLCBzaXplb2YoZGVidWdfbG9nX2J1ZiksCi0JCQkJIGZtdCwgYXJncyk7Ci0JdmFfZW5kKGFyZ3MpOwotCi0JZm9yIChwID0gZGVidWdfbG9nX2J1ZjsgKnAgIT0gMDsgcCsrKQotCQllbWl0X2xvZ19jaGFyKGRlYnVnX2xvZywgKnApOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGVidWdfbG9nLT5sb2NrLCBmbGFncyk7Ci0KLQl3YWtlX3VwKCZkZWJ1Z19sb2ctPnF1ZXVlX3dhaXQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBkZWJ1Z19sb2coc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwgY2hhciAqZm10LCAuLi4pCi17Ci0JdmFfbGlzdCBhcmdzOwotCWNoYXIgdG1wX2xvZ19idWZbMjU2XTsKLQotCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JdnNjbnByaW50Zih0bXBfbG9nX2J1Ziwgc2l6ZW9mKHRtcF9sb2dfYnVmKSwgZm10LCBhcmdzKTsKLQlmZGVidWdfbG9nKGJhdF9wcml2LT5kZWJ1Z19sb2csICJbJTEwdV0gJXMiLAotCQkgICAoamlmZmllcyAvIEhaKSwgdG1wX2xvZ19idWYpOwotCXZhX2VuZChhcmdzKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGxvZ19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCW5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOwotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7Ci0JaW5jX21vZHVsZV9jb3VudCgpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGxvZ19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWRlY19tb2R1bGVfY291bnQoKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3QgbG9nX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCi0JCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBkZWJ1Z19sb2cgKmRlYnVnX2xvZyA9IGJhdF9wcml2LT5kZWJ1Z19sb2c7Ci0JaW50IGVycm9yLCBpID0gMDsKLQljaGFyIGM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICgoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spICYmCi0JICAgICEoZGVidWdfbG9nLT5sb2dfZW5kIC0gZGVidWdfbG9nLT5sb2dfc3RhcnQpKQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCWlmICgoIWJ1ZikgfHwgKGNvdW50IDwgMCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGNvdW50ID09IDApCi0JCXJldHVybiAwOwotCi0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWYsIGNvdW50KSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQllcnJvciA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShkZWJ1Z19sb2ctPnF1ZXVlX3dhaXQsCi0JCQkJKGRlYnVnX2xvZy0+bG9nX3N0YXJ0IC0gZGVidWdfbG9nLT5sb2dfZW5kKSk7Ci0KLQlpZiAoZXJyb3IpCi0JCXJldHVybiBlcnJvcjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkZWJ1Z19sb2ctPmxvY2ssIGZsYWdzKTsKLQotCXdoaWxlICgoIWVycm9yKSAmJiAoaSA8IGNvdW50KSAmJgotCSAgICAgICAoZGVidWdfbG9nLT5sb2dfc3RhcnQgIT0gZGVidWdfbG9nLT5sb2dfZW5kKSkgewotCQljID0gTE9HX0JVRkYoZGVidWdfbG9nLT5sb2dfc3RhcnQpOwotCi0JCWRlYnVnX2xvZy0+bG9nX3N0YXJ0Kys7Ci0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGVidWdfbG9nLT5sb2NrLCBmbGFncyk7Ci0KLQkJZXJyb3IgPSBfX3B1dF91c2VyKGMsIGJ1Zik7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRlYnVnX2xvZy0+bG9jaywgZmxhZ3MpOwotCi0JCWJ1ZisrOwotCQlpKys7Ci0KLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZWJ1Z19sb2ctPmxvY2ssIGZsYWdzKTsKLQotCWlmICghZXJyb3IpCi0JCXJldHVybiBpOwotCi0JcmV0dXJuIGVycm9yOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGxvZ19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQotewotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGRlYnVnX2xvZyAqZGVidWdfbG9nID0gYmF0X3ByaXYtPmRlYnVnX2xvZzsKLQotCXBvbGxfd2FpdChmaWxlLCAmZGVidWdfbG9nLT5xdWV1ZV93YWl0LCB3YWl0KTsKLQotCWlmIChkZWJ1Z19sb2ctPmxvZ19lbmQgLSBkZWJ1Z19sb2ctPmxvZ19zdGFydCkKLQkJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbG9nX2ZvcHMgPSB7Ci0JLm9wZW4gICAgICAgICAgID0gbG9nX29wZW4sCi0JLnJlbGVhc2UgICAgICAgID0gbG9nX3JlbGVhc2UsCi0JLnJlYWQgICAgICAgICAgID0gbG9nX3JlYWQsCi0JLnBvbGwgICAgICAgICAgID0gbG9nX3BvbGwsCi0JLmxsc2VlayAgICAgICAgID0gbm9fbGxzZWVrLAotfTsKLQotc3RhdGljIGludCBkZWJ1Z19sb2dfc2V0dXAoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKLXsKLQlzdHJ1Y3QgZGVudHJ5ICpkOwotCi0JaWYgKCFiYXRfcHJpdi0+ZGVidWdfZGlyKQotCQlnb3RvIGVycjsKLQotCWJhdF9wcml2LT5kZWJ1Z19sb2cgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGVidWdfbG9nKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFiYXRfcHJpdi0+ZGVidWdfbG9nKQotCQlnb3RvIGVycjsKLQotCXNwaW5fbG9ja19pbml0KCZiYXRfcHJpdi0+ZGVidWdfbG9nLT5sb2NrKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZiYXRfcHJpdi0+ZGVidWdfbG9nLT5xdWV1ZV93YWl0KTsKLQotCWQgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJsb2ciLCBTX0lGUkVHIHwgU19JUlVTUiwKLQkJCQliYXRfcHJpdi0+ZGVidWdfZGlyLCBiYXRfcHJpdiwgJmxvZ19mb3BzKTsKLQlpZiAoZCkKLQkJZ290byBlcnI7Ci0KLQlyZXR1cm4gMDsKLQotZXJyOgotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCBkZWJ1Z19sb2dfY2xlYW51cChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KQotewotCWtmcmVlKGJhdF9wcml2LT5kZWJ1Z19sb2cpOwotCWJhdF9wcml2LT5kZWJ1Z19sb2cgPSBOVUxMOwotfQotI2Vsc2UgLyogQ09ORklHX0JBVE1BTl9BRFZfREVCVUcgKi8KLXN0YXRpYyBpbnQgZGVidWdfbG9nX3NldHVwKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpCi17Ci0JYmF0X3ByaXYtPmRlYnVnX2xvZyA9IE5VTEw7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlYnVnX2xvZ19jbGVhbnVwKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpCi17Ci0JcmV0dXJuOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbnQgb3JpZ2luYXRvcnNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWlub2RlLT5pX3ByaXZhdGU7Ci0JcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIG9yaWdfc2VxX3ByaW50X3RleHQsIG5ldF9kZXYpOwotfQotCi1zdGF0aWMgaW50IHRyYW5zdGFibGVfZ2xvYmFsX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilpbm9kZS0+aV9wcml2YXRlOwotCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBobmFfZ2xvYmFsX3NlcV9wcmludF90ZXh0LCBuZXRfZGV2KTsKLX0KLQotc3RhdGljIGludCB0cmFuc3RhYmxlX2xvY2FsX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilpbm9kZS0+aV9wcml2YXRlOwotCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBobmFfbG9jYWxfc2VxX3ByaW50X3RleHQsIG5ldF9kZXYpOwotfQotCi1zdGF0aWMgaW50IHZpc19kYXRhX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilpbm9kZS0+aV9wcml2YXRlOwotCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCB2aXNfc2VxX3ByaW50X3RleHQsIG5ldF9kZXYpOwotfQotCi1zdHJ1Y3QgYmF0X2RlYnVnaW5mbyB7Ci0Jc3RydWN0IGF0dHJpYnV0ZSBhdHRyOwotCWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZm9wczsKLX07Ci0KLSNkZWZpbmUgQkFUX0RFQlVHSU5GTyhfbmFtZSwgX21vZGUsIF9vcGVuKQlcCi1zdHJ1Y3QgYmF0X2RlYnVnaW5mbyBiYXRfZGVidWdpbmZvXyMjX25hbWUgPSB7CVwKLQkuYXR0ciA9IHsgLm5hbWUgPSBfX3N0cmluZ2lmeShfbmFtZSksCVwKLQkJICAubW9kZSA9IF9tb2RlLCB9LAkJXAotCS5mb3BzID0geyAub3duZXIgPSBUSElTX01PRFVMRSwJCVwKLQkJICAub3BlbiA9IF9vcGVuLAkJXAotCQkgIC5yZWFkCT0gc2VxX3JlYWQsCQlcCi0JCSAgLmxsc2VlayA9IHNlcV9sc2VlaywJCVwKLQkJICAucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAlcCi0JCX0JCQkJXAotfTsKLQotc3RhdGljIEJBVF9ERUJVR0lORk8ob3JpZ2luYXRvcnMsIFNfSVJVR08sIG9yaWdpbmF0b3JzX29wZW4pOwotc3RhdGljIEJBVF9ERUJVR0lORk8odHJhbnN0YWJsZV9nbG9iYWwsIFNfSVJVR08sIHRyYW5zdGFibGVfZ2xvYmFsX29wZW4pOwotc3RhdGljIEJBVF9ERUJVR0lORk8odHJhbnN0YWJsZV9sb2NhbCwgU19JUlVHTywgdHJhbnN0YWJsZV9sb2NhbF9vcGVuKTsKLXN0YXRpYyBCQVRfREVCVUdJTkZPKHZpc19kYXRhLCBTX0lSVUdPLCB2aXNfZGF0YV9vcGVuKTsKLQotc3RhdGljIHN0cnVjdCBiYXRfZGVidWdpbmZvICptZXNoX2RlYnVnaW5mb3NbXSA9IHsKLQkmYmF0X2RlYnVnaW5mb19vcmlnaW5hdG9ycywKLQkmYmF0X2RlYnVnaW5mb190cmFuc3RhYmxlX2dsb2JhbCwKLQkmYmF0X2RlYnVnaW5mb190cmFuc3RhYmxlX2xvY2FsLAotCSZiYXRfZGVidWdpbmZvX3Zpc19kYXRhLAotCU5VTEwsCi19OwotCi12b2lkIGRlYnVnZnNfaW5pdCh2b2lkKQotewotCWJhdF9kZWJ1Z2ZzID0gZGVidWdmc19jcmVhdGVfZGlyKERFQlVHRlNfQkFUX1NVQkRJUiwgTlVMTCk7Ci0JaWYgKGJhdF9kZWJ1Z2ZzID09IEVSUl9QVFIoLUVOT0RFVikpCi0JCWJhdF9kZWJ1Z2ZzID0gTlVMTDsKLX0KLQotdm9pZCBkZWJ1Z2ZzX2Rlc3Ryb3kodm9pZCkKLXsKLQlpZiAoYmF0X2RlYnVnZnMpIHsKLQkJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGJhdF9kZWJ1Z2ZzKTsKLQkJYmF0X2RlYnVnZnMgPSBOVUxMOwotCX0KLX0KLQotaW50IGRlYnVnZnNfYWRkX21lc2hpZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBiYXRfZGVidWdpbmZvICoqYmF0X2RlYnVnOwotCXN0cnVjdCBkZW50cnkgKmZpbGU7Ci0KLQlpZiAoIWJhdF9kZWJ1Z2ZzKQotCQlnb3RvIG91dDsKLQotCWJhdF9wcml2LT5kZWJ1Z19kaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoZGV2LT5uYW1lLCBiYXRfZGVidWdmcyk7Ci0JaWYgKCFiYXRfcHJpdi0+ZGVidWdfZGlyKQotCQlnb3RvIG91dDsKLQotCWJhdF9zb2NrZXRfc2V0dXAoYmF0X3ByaXYpOwotCWRlYnVnX2xvZ19zZXR1cChiYXRfcHJpdik7Ci0KLQlmb3IgKGJhdF9kZWJ1ZyA9IG1lc2hfZGVidWdpbmZvczsgKmJhdF9kZWJ1ZzsgKytiYXRfZGVidWcpIHsKLQkJZmlsZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoKCgqYmF0X2RlYnVnKS0+YXR0cikubmFtZSwKLQkJCQkJICBTX0lGUkVHIHwgKCgqYmF0X2RlYnVnKS0+YXR0cikubW9kZSwKLQkJCQkJICBiYXRfcHJpdi0+ZGVidWdfZGlyLAotCQkJCQkgIGRldiwgJigqYmF0X2RlYnVnKS0+Zm9wcyk7Ci0JCWlmICghZmlsZSkgewotCQkJYmF0X2VycihkZXYsICJDYW4ndCBhZGQgZGVidWdmcyBmaWxlOiAlcy8lc1xuIiwKLQkJCQlkZXYtPm5hbWUsICgoKmJhdF9kZWJ1ZyktPmF0dHIpLm5hbWUpOwotCQkJZ290byByZW1fYXR0cjsKLQkJfQotCX0KLQotCXJldHVybiAwOwotcmVtX2F0dHI6Ci0JZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGJhdF9wcml2LT5kZWJ1Z19kaXIpOwotCWJhdF9wcml2LT5kZWJ1Z19kaXIgPSBOVUxMOwotb3V0OgotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCXJldHVybiAtRU5PTUVNOwotI2Vsc2UKLQlyZXR1cm4gMDsKLSNlbmRpZiAvKiBDT05GSUdfREVCVUdfRlMgKi8KLX0KLQotdm9pZCBkZWJ1Z2ZzX2RlbF9tZXNoaWYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCWRlYnVnX2xvZ19jbGVhbnVwKGJhdF9wcml2KTsKLQotCWlmIChiYXRfZGVidWdmcykgewotCQlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoYmF0X3ByaXYtPmRlYnVnX2Rpcik7Ci0JCWJhdF9wcml2LT5kZWJ1Z19kaXIgPSBOVUxMOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2JhdF9kZWJ1Z2ZzLmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9iYXRfZGVidWdmcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmRmNTMyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2JhdF9kZWJ1Z2ZzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6Ci0gKgotICogTWFyZWsgTGluZG5lcgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotICogMDIxMTAtMTMwMSwgVVNBCi0gKgotICovCi0KLQotI2lmbmRlZiBfTkVUX0JBVE1BTl9BRFZfREVCVUdGU19IXwotI2RlZmluZSBfTkVUX0JBVE1BTl9BRFZfREVCVUdGU19IXwotCi0jZGVmaW5lIERFQlVHRlNfQkFUX1NVQkRJUiAiYmF0bWFuX2FkdiIKLQotdm9pZCBkZWJ1Z2ZzX2luaXQodm9pZCk7Ci12b2lkIGRlYnVnZnNfZGVzdHJveSh2b2lkKTsKLWludCBkZWJ1Z2ZzX2FkZF9tZXNoaWYoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci12b2lkIGRlYnVnZnNfZGVsX21lc2hpZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLQotI2VuZGlmIC8qIF9ORVRfQkFUTUFOX0FEVl9ERUJVR0ZTX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9iYXRfc3lzZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2JhdF9zeXNmcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzE3ZmI4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2JhdF9zeXNmcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTU4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKLSAqCi0gKiBNYXJlayBMaW5kbmVyCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxLCBVU0EKLSAqCi0gKi8KLQotI2luY2x1ZGUgIm1haW4uaCIKLSNpbmNsdWRlICJiYXRfc3lzZnMuaCIKLSNpbmNsdWRlICJ0cmFuc2xhdGlvbi10YWJsZS5oIgotI2luY2x1ZGUgIm9yaWdpbmF0b3IuaCIKLSNpbmNsdWRlICJoYXJkLWludGVyZmFjZS5oIgotI2luY2x1ZGUgInZpcy5oIgotCi0jZGVmaW5lIHRvX2RldihvYmopICAgICBjb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKQotCi0jZGVmaW5lIEJBVF9BVFRSKF9uYW1lLCBfbW9kZSwgX3Nob3csIF9zdG9yZSkJXAotc3RydWN0IGJhdF9hdHRyaWJ1dGUgYmF0X2F0dHJfIyNfbmFtZSA9IHsJXAotCS5hdHRyID0gey5uYW1lID0gX19zdHJpbmdpZnkoX25hbWUpLAlcCi0JCSAubW9kZSA9IF9tb2RlIH0sCQlcCi0JLnNob3cgICA9IF9zaG93LAkJCVwKLQkuc3RvcmUgID0gX3N0b3JlLAkJCVwKLX07Ci0KLXN0YXRpYyBzc2l6ZV90IHNob3dfYWdncl9vZ21zKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJICAgICBjaGFyICpidWZmKQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRvX2Rldihrb2JqLT5wYXJlbnQpOwotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdih0b19uZXRfZGV2KGRldikpOwotCWludCBhZ2dyX3N0YXR1cyA9IGF0b21pY19yZWFkKCZiYXRfcHJpdi0+YWdncmVnYXRpb25fZW5hYmxlZCk7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWZmLCAiJXNcbiIsCi0JCSAgICAgICBhZ2dyX3N0YXR1cyA9PSAwID8gImRpc2FibGVkIiA6ICJlbmFibGVkIik7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHN0b3JlX2FnZ3Jfb2dtcyhzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICAgIGNoYXIgKmJ1ZmYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0b19kZXYoa29iai0+cGFyZW50KTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IHRvX25ldF9kZXYoZGV2KTsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7Ci0JaW50IGFnZ3JfdG1wID0gLTE7Ci0KLQlpZiAoKChjb3VudCA9PSAyKSAmJiAoYnVmZlswXSA9PSAnMScpKSB8fAotCSAgICAoc3RybmNtcChidWZmLCAiZW5hYmxlIiwgNikgPT0gMCkpCi0JCWFnZ3JfdG1wID0gMTsKLQotCWlmICgoKGNvdW50ID09IDIpICYmIChidWZmWzBdID09ICcwJykpIHx8Ci0JICAgIChzdHJuY21wKGJ1ZmYsICJkaXNhYmxlIiwgNykgPT0gMCkpCi0JCWFnZ3JfdG1wID0gMDsKLQotCWlmIChhZ2dyX3RtcCA8IDApIHsKLQkJaWYgKGJ1ZmZbY291bnQgLSAxXSA9PSAnXG4nKQotCQkJYnVmZltjb3VudCAtIDFdID0gJ1wwJzsKLQotCQliYXRfaW5mbyhuZXRfZGV2LAotCQkJICJJbnZhbGlkIHBhcmFtZXRlciBmb3IgJ2FnZ3JlZ2F0ZSBPR00nIHNldHRpbmciCi0JCQkgInJlY2VpdmVkOiAlc1xuIiwgYnVmZik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmFnZ3JlZ2F0aW9uX2VuYWJsZWQpID09IGFnZ3JfdG1wKQotCQlyZXR1cm4gY291bnQ7Ci0KLQliYXRfaW5mbyhuZXRfZGV2LCAiQ2hhbmdpbmcgYWdncmVnYXRpb24gZnJvbTogJXMgdG86ICVzXG4iLAotCQkgYXRvbWljX3JlYWQoJmJhdF9wcml2LT5hZ2dyZWdhdGlvbl9lbmFibGVkKSA9PSAxID8KLQkJICJlbmFibGVkIiA6ICJkaXNhYmxlZCIsIGFnZ3JfdG1wID09IDEgPyAiZW5hYmxlZCIgOgotCQkgImRpc2FibGVkIik7Ci0KLQlhdG9taWNfc2V0KCZiYXRfcHJpdi0+YWdncmVnYXRpb25fZW5hYmxlZCwgKHVuc2lnbmVkKWFnZ3JfdG1wKTsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNob3dfYm9uZChzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICAgY2hhciAqYnVmZikKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0b19kZXYoa29iai0+cGFyZW50KTsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYodG9fbmV0X2RldihkZXYpKTsKLQlpbnQgYm9uZF9zdGF0dXMgPSBhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmJvbmRpbmdfZW5hYmxlZCk7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWZmLCAiJXNcbiIsCi0JCSAgICAgICBib25kX3N0YXR1cyA9PSAwID8gImRpc2FibGVkIiA6ICJlbmFibGVkIik7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHN0b3JlX2JvbmQoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCi0JCQkgIGNoYXIgKmJ1ZmYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0b19kZXYoa29iai0+cGFyZW50KTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IHRvX25ldF9kZXYoZGV2KTsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7Ci0JaW50IGJvbmRpbmdfZW5hYmxlZF90bXAgPSAtMTsKLQotCWlmICgoKGNvdW50ID09IDIpICYmIChidWZmWzBdID09ICcxJykpIHx8Ci0JICAgIChzdHJuY21wKGJ1ZmYsICJlbmFibGUiLCA2KSA9PSAwKSkKLQkJYm9uZGluZ19lbmFibGVkX3RtcCA9IDE7Ci0KLQlpZiAoKChjb3VudCA9PSAyKSAmJiAoYnVmZlswXSA9PSAnMCcpKSB8fAotCSAgICAoc3RybmNtcChidWZmLCAiZGlzYWJsZSIsIDcpID09IDApKQotCQlib25kaW5nX2VuYWJsZWRfdG1wID0gMDsKLQotCWlmIChib25kaW5nX2VuYWJsZWRfdG1wIDwgMCkgewotCQlpZiAoYnVmZltjb3VudCAtIDFdID09ICdcbicpCi0JCQlidWZmW2NvdW50IC0gMV0gPSAnXDAnOwotCi0JCWJhdF9lcnIobmV0X2RldiwKLQkJCSJJbnZhbGlkIHBhcmFtZXRlciBmb3IgJ2JvbmRpbmcnIHNldHRpbmcgcmVjZWl2ZWQ6ICIKLQkJCSIlc1xuIiwgYnVmZik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmJvbmRpbmdfZW5hYmxlZCkgPT0gYm9uZGluZ19lbmFibGVkX3RtcCkKLQkJcmV0dXJuIGNvdW50OwotCi0JYmF0X2luZm8obmV0X2RldiwgIkNoYW5naW5nIGJvbmRpbmcgZnJvbTogJXMgdG86ICVzXG4iLAotCQkgYXRvbWljX3JlYWQoJmJhdF9wcml2LT5ib25kaW5nX2VuYWJsZWQpID09IDEgPwotCQkgImVuYWJsZWQiIDogImRpc2FibGVkIiwKLQkJIGJvbmRpbmdfZW5hYmxlZF90bXAgPT0gMSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOwotCi0JYXRvbWljX3NldCgmYmF0X3ByaXYtPmJvbmRpbmdfZW5hYmxlZCwgKHVuc2lnbmVkKWJvbmRpbmdfZW5hYmxlZF90bXApOwotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2hvd19mcmFnKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJICAgICBjaGFyICpidWZmKQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRvX2Rldihrb2JqLT5wYXJlbnQpOwotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdih0b19uZXRfZGV2KGRldikpOwotCWludCBmcmFnX3N0YXR1cyA9IGF0b21pY19yZWFkKCZiYXRfcHJpdi0+ZnJhZ19lbmFibGVkKTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZmYsICIlc1xuIiwKLQkJICAgICAgIGZyYWdfc3RhdHVzID09IDAgPyAiZGlzYWJsZWQiIDogImVuYWJsZWQiKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc3RvcmVfZnJhZyhzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgY2hhciAqYnVmZiwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRvX2Rldihrb2JqLT5wYXJlbnQpOwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gdG9fbmV0X2RldihkZXYpOwotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKLQlpbnQgZnJhZ19lbmFibGVkX3RtcCA9IC0xOwotCi0JaWYgKCgoY291bnQgPT0gMikgJiYgKGJ1ZmZbMF0gPT0gJzEnKSkgfHwKLQkgICAgKHN0cm5jbXAoYnVmZiwgImVuYWJsZSIsIDYpID09IDApKQotCQlmcmFnX2VuYWJsZWRfdG1wID0gMTsKLQotCWlmICgoKGNvdW50ID09IDIpICYmIChidWZmWzBdID09ICcwJykpIHx8Ci0JICAgIChzdHJuY21wKGJ1ZmYsICJkaXNhYmxlIiwgNykgPT0gMCkpCi0JCWZyYWdfZW5hYmxlZF90bXAgPSAwOwotCi0JaWYgKGZyYWdfZW5hYmxlZF90bXAgPCAwKSB7Ci0JCWlmIChidWZmW2NvdW50IC0gMV0gPT0gJ1xuJykKLQkJCWJ1ZmZbY291bnQgLSAxXSA9ICdcMCc7Ci0KLQkJYmF0X2VycihuZXRfZGV2LAotCQkJIkludmFsaWQgcGFyYW1ldGVyIGZvciAnZnJhZ21lbnRhdGlvbicgc2V0dGluZyBvbiBtZXNoIgotCQkJInJlY2VpdmVkOiAlc1xuIiwgYnVmZik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmZyYWdfZW5hYmxlZCkgPT0gZnJhZ19lbmFibGVkX3RtcCkKLQkJcmV0dXJuIGNvdW50OwotCi0JYmF0X2luZm8obmV0X2RldiwgIkNoYW5naW5nIGZyYWdtZW50YXRpb24gZnJvbTogJXMgdG86ICVzXG4iLAotCQkgYXRvbWljX3JlYWQoJmJhdF9wcml2LT5mcmFnX2VuYWJsZWQpID09IDEgPwotCQkgImVuYWJsZWQiIDogImRpc2FibGVkIiwKLQkJIGZyYWdfZW5hYmxlZF90bXAgPT0gMSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOwotCi0JYXRvbWljX3NldCgmYmF0X3ByaXYtPmZyYWdfZW5hYmxlZCwgKHVuc2lnbmVkKWZyYWdfZW5hYmxlZF90bXApOwotCXVwZGF0ZV9taW5fbXR1KG5ldF9kZXYpOwotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2hvd192aXNfbW9kZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICAgY2hhciAqYnVmZikKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0b19kZXYoa29iai0+cGFyZW50KTsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYodG9fbmV0X2RldihkZXYpKTsKLQlpbnQgdmlzX21vZGUgPSBhdG9taWNfcmVhZCgmYmF0X3ByaXYtPnZpc19tb2RlKTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZmYsICIlc1xuIiwKLQkJICAgICAgIHZpc19tb2RlID09IFZJU19UWVBFX0NMSUVOVF9VUERBVEUgPwotCQkJCQkJCSJjbGllbnQiIDogInNlcnZlciIpOwotfQotCi1zdGF0aWMgc3NpemVfdCBzdG9yZV92aXNfbW9kZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICAgIGNoYXIgKmJ1ZmYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0b19kZXYoa29iai0+cGFyZW50KTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IHRvX25ldF9kZXYoZGV2KTsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7Ci0JdW5zaWduZWQgbG9uZyB2YWw7Ci0JaW50IHJldCwgdmlzX21vZGVfdG1wID0gLTE7Ci0KLQlyZXQgPSBzdHJpY3Rfc3RydG91bChidWZmLCAxMCwgJnZhbCk7Ci0KLQlpZiAoKChjb3VudCA9PSAyKSAmJiAoIXJldCkgJiYgKHZhbCA9PSBWSVNfVFlQRV9DTElFTlRfVVBEQVRFKSkgfHwKLQkgICAgKHN0cm5jbXAoYnVmZiwgImNsaWVudCIsIDYpID09IDApIHx8Ci0JICAgIChzdHJuY21wKGJ1ZmYsICJvZmYiLCAzKSA9PSAwKSkKLQkJdmlzX21vZGVfdG1wID0gVklTX1RZUEVfQ0xJRU5UX1VQREFURTsKLQotCWlmICgoKGNvdW50ID09IDIpICYmICghcmV0KSAmJiAodmFsID09IFZJU19UWVBFX1NFUlZFUl9TWU5DKSkgfHwKLQkgICAgKHN0cm5jbXAoYnVmZiwgInNlcnZlciIsIDYpID09IDApKQotCQl2aXNfbW9kZV90bXAgPSBWSVNfVFlQRV9TRVJWRVJfU1lOQzsKLQotCWlmICh2aXNfbW9kZV90bXAgPCAwKSB7Ci0JCWlmIChidWZmW2NvdW50IC0gMV0gPT0gJ1xuJykKLQkJCWJ1ZmZbY291bnQgLSAxXSA9ICdcMCc7Ci0KLQkJYmF0X2luZm8obmV0X2RldiwKLQkJCSAiSW52YWxpZCBwYXJhbWV0ZXIgZm9yICd2aXMgbW9kZScgc2V0dGluZyByZWNlaXZlZDogIgotCQkJICIlc1xuIiwgYnVmZik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChhdG9taWNfcmVhZCgmYmF0X3ByaXYtPnZpc19tb2RlKSA9PSB2aXNfbW9kZV90bXApCi0JCXJldHVybiBjb3VudDsKLQotCWJhdF9pbmZvKG5ldF9kZXYsICJDaGFuZ2luZyB2aXMgbW9kZSBmcm9tOiAlcyB0bzogJXNcbiIsCi0JCSBhdG9taWNfcmVhZCgmYmF0X3ByaXYtPnZpc19tb2RlKSA9PSBWSVNfVFlQRV9DTElFTlRfVVBEQVRFID8KLQkJICJjbGllbnQiIDogInNlcnZlciIsIHZpc19tb2RlX3RtcCA9PSBWSVNfVFlQRV9DTElFTlRfVVBEQVRFID8KLQkJICJjbGllbnQiIDogInNlcnZlciIpOwotCi0JYXRvbWljX3NldCgmYmF0X3ByaXYtPnZpc19tb2RlLCAodW5zaWduZWQpdmlzX21vZGVfdG1wKTsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNob3dfb3JpZ19pbnRlcnZhbChzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgY2hhciAqYnVmZikKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0b19kZXYoa29iai0+cGFyZW50KTsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYodG9fbmV0X2RldihkZXYpKTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZmYsICIlaVxuIiwKLQkJICAgICAgIGF0b21pY19yZWFkKCZiYXRfcHJpdi0+b3JpZ19pbnRlcnZhbCkpOwotfQotCi1zdGF0aWMgc3NpemVfdCBzdG9yZV9vcmlnX2ludGVydmFsKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJCSAgY2hhciAqYnVmZiwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRvX2Rldihrb2JqLT5wYXJlbnQpOwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gdG9fbmV0X2RldihkZXYpOwotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKLQl1bnNpZ25lZCBsb25nIG9yaWdfaW50ZXJ2YWxfdG1wOwotCWludCByZXQ7Ci0KLQlyZXQgPSBzdHJpY3Rfc3RydG91bChidWZmLCAxMCwgJm9yaWdfaW50ZXJ2YWxfdG1wKTsKLQlpZiAocmV0KSB7Ci0JCWJhdF9pbmZvKG5ldF9kZXYsICJJbnZhbGlkIHBhcmFtZXRlciBmb3IgJ29yaWdfaW50ZXJ2YWwnICIKLQkJCSAic2V0dGluZyByZWNlaXZlZDogJXNcbiIsIGJ1ZmYpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAob3JpZ19pbnRlcnZhbF90bXAgPCBKSVRURVIgKiAyKSB7Ci0JCWJhdF9pbmZvKG5ldF9kZXYsICJOZXcgb3JpZ2luYXRvciBpbnRlcnZhbCB0b28gc21hbGw6ICVsaSAiCi0JCQkgIihtaW46ICVpKVxuIiwgb3JpZ19pbnRlcnZhbF90bXAsIEpJVFRFUiAqIDIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoYXRvbWljX3JlYWQoJmJhdF9wcml2LT5vcmlnX2ludGVydmFsKSA9PSBvcmlnX2ludGVydmFsX3RtcCkKLQkJcmV0dXJuIGNvdW50OwotCi0JYmF0X2luZm8obmV0X2RldiwgIkNoYW5naW5nIG9yaWdpbmF0b3IgaW50ZXJ2YWwgZnJvbTogJWkgdG86ICVsaVxuIiwKLQkJIGF0b21pY19yZWFkKCZiYXRfcHJpdi0+b3JpZ19pbnRlcnZhbCksCi0JCSBvcmlnX2ludGVydmFsX3RtcCk7Ci0KLQlhdG9taWNfc2V0KCZiYXRfcHJpdi0+b3JpZ19pbnRlcnZhbCwgb3JpZ19pbnRlcnZhbF90bXApOwotCXJldHVybiBjb3VudDsKLX0KLQotI2lmZGVmIENPTkZJR19CQVRNQU5fQURWX0RFQlVHCi1zdGF0aWMgc3NpemVfdCBzaG93X2xvZ19sZXZlbChzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICAgY2hhciAqYnVmZikKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0b19kZXYoa29iai0+cGFyZW50KTsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYodG9fbmV0X2RldihkZXYpKTsKLQlpbnQgbG9nX2xldmVsID0gYXRvbWljX3JlYWQoJmJhdF9wcml2LT5sb2dfbGV2ZWwpOwotCi0JcmV0dXJuIHNwcmludGYoYnVmZiwgIiVkXG4iLCBsb2dfbGV2ZWwpOwotfQotCi1zdGF0aWMgc3NpemVfdCBzdG9yZV9sb2dfbGV2ZWwoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICAgICBjaGFyICpidWZmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gdG9fZGV2KGtvYmotPnBhcmVudCk7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSB0b19uZXRfZGV2KGRldik7Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KG5ldF9kZXYpOwotCXVuc2lnbmVkIGxvbmcgbG9nX2xldmVsX3RtcDsKLQlpbnQgcmV0OwotCi0JcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmZiwgMTAsICZsb2dfbGV2ZWxfdG1wKTsKLQlpZiAocmV0KSB7Ci0JCWJhdF9pbmZvKG5ldF9kZXYsICJJbnZhbGlkIHBhcmFtZXRlciBmb3IgJ2xvZ19sZXZlbCcgIgotCQkJICJzZXR0aW5nIHJlY2VpdmVkOiAlc1xuIiwgYnVmZik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChsb2dfbGV2ZWxfdG1wID4gMykgewotCQliYXRfaW5mbyhuZXRfZGV2LCAiTmV3IGxvZyBsZXZlbCB0b28gYmlnOiAlbGkgIgotCQkJICIobWF4OiAlaSlcbiIsIGxvZ19sZXZlbF90bXAsIDMpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoYXRvbWljX3JlYWQoJmJhdF9wcml2LT5sb2dfbGV2ZWwpID09IGxvZ19sZXZlbF90bXApCi0JCXJldHVybiBjb3VudDsKLQotCWJhdF9pbmZvKG5ldF9kZXYsICJDaGFuZ2luZyBsb2cgbGV2ZWwgZnJvbTogJWkgdG86ICVsaVxuIiwKLQkJIGF0b21pY19yZWFkKCZiYXRfcHJpdi0+bG9nX2xldmVsKSwKLQkJIGxvZ19sZXZlbF90bXApOwotCi0JYXRvbWljX3NldCgmYmF0X3ByaXYtPmxvZ19sZXZlbCwgKHVuc2lnbmVkKWxvZ19sZXZlbF90bXApOwotCXJldHVybiBjb3VudDsKLX0KLSNlbmRpZgotCi1zdGF0aWMgQkFUX0FUVFIoYWdncmVnYXRlZF9vZ21zLCBTX0lSVUdPIHwgU19JV1VTUiwKLQkJc2hvd19hZ2dyX29nbXMsIHN0b3JlX2FnZ3Jfb2dtcyk7Ci1zdGF0aWMgQkFUX0FUVFIoYm9uZGluZywgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfYm9uZCwgc3RvcmVfYm9uZCk7Ci1zdGF0aWMgQkFUX0FUVFIoZnJhZ21lbnRhdGlvbiwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfZnJhZywgc3RvcmVfZnJhZyk7Ci1zdGF0aWMgQkFUX0FUVFIodmlzX21vZGUsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3Zpc19tb2RlLCBzdG9yZV92aXNfbW9kZSk7Ci1zdGF0aWMgQkFUX0FUVFIob3JpZ19pbnRlcnZhbCwgU19JUlVHTyB8IFNfSVdVU1IsCi0JCXNob3dfb3JpZ19pbnRlcnZhbCwgc3RvcmVfb3JpZ19pbnRlcnZhbCk7Ci0jaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfREVCVUcKLXN0YXRpYyBCQVRfQVRUUihsb2dfbGV2ZWwsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X2xvZ19sZXZlbCwgc3RvcmVfbG9nX2xldmVsKTsKLSNlbmRpZgotCi1zdGF0aWMgc3RydWN0IGJhdF9hdHRyaWJ1dGUgKm1lc2hfYXR0cnNbXSA9IHsKLQkmYmF0X2F0dHJfYWdncmVnYXRlZF9vZ21zLAotCSZiYXRfYXR0cl9ib25kaW5nLAotCSZiYXRfYXR0cl9mcmFnbWVudGF0aW9uLAotCSZiYXRfYXR0cl92aXNfbW9kZSwKLQkmYmF0X2F0dHJfb3JpZ19pbnRlcnZhbCwKLSNpZmRlZiBDT05GSUdfQkFUTUFOX0FEVl9ERUJVRwotCSZiYXRfYXR0cl9sb2dfbGV2ZWwsCi0jZW5kaWYKLQlOVUxMLAotfTsKLQotaW50IHN5c2ZzX2FkZF9tZXNoaWYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3Qga29iamVjdCAqYmF0aWZfa29iamVjdCA9ICZkZXYtPmRldi5rb2JqOwotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBiYXRfYXR0cmlidXRlICoqYmF0X2F0dHI7Ci0JaW50IGVycjsKLQotCWJhdF9wcml2LT5tZXNoX29iaiA9IGtvYmplY3RfY3JlYXRlX2FuZF9hZGQoU1lTRlNfSUZfTUVTSF9TVUJESVIsCi0JCQkJCQkgICAgYmF0aWZfa29iamVjdCk7Ci0JaWYgKCFiYXRfcHJpdi0+bWVzaF9vYmopIHsKLQkJYmF0X2VycihkZXYsICJDYW4ndCBhZGQgc3lzZnMgZGlyZWN0b3J5OiAlcy8lc1xuIiwgZGV2LT5uYW1lLAotCQkJU1lTRlNfSUZfTUVTSF9TVUJESVIpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlmb3IgKGJhdF9hdHRyID0gbWVzaF9hdHRyczsgKmJhdF9hdHRyOyArK2JhdF9hdHRyKSB7Ci0JCWVyciA9IHN5c2ZzX2NyZWF0ZV9maWxlKGJhdF9wcml2LT5tZXNoX29iaiwKLQkJCQkJJigoKmJhdF9hdHRyKS0+YXR0cikpOwotCQlpZiAoZXJyKSB7Ci0JCQliYXRfZXJyKGRldiwgIkNhbid0IGFkZCBzeXNmcyBmaWxlOiAlcy8lcy8lc1xuIiwKLQkJCQlkZXYtPm5hbWUsIFNZU0ZTX0lGX01FU0hfU1VCRElSLAotCQkJCSgoKmJhdF9hdHRyKS0+YXR0cikubmFtZSk7Ci0JCQlnb3RvIHJlbV9hdHRyOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLXJlbV9hdHRyOgotCWZvciAoYmF0X2F0dHIgPSBtZXNoX2F0dHJzOyAqYmF0X2F0dHI7ICsrYmF0X2F0dHIpCi0JCXN5c2ZzX3JlbW92ZV9maWxlKGJhdF9wcml2LT5tZXNoX29iaiwgJigoKmJhdF9hdHRyKS0+YXR0cikpOwotCi0Ja29iamVjdF9wdXQoYmF0X3ByaXYtPm1lc2hfb2JqKTsKLQliYXRfcHJpdi0+bWVzaF9vYmogPSBOVUxMOwotb3V0OgotCXJldHVybiAtRU5PTUVNOwotfQotCi12b2lkIHN5c2ZzX2RlbF9tZXNoaWYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgYmF0X2F0dHJpYnV0ZSAqKmJhdF9hdHRyOwotCi0JZm9yIChiYXRfYXR0ciA9IG1lc2hfYXR0cnM7ICpiYXRfYXR0cjsgKytiYXRfYXR0cikKLQkJc3lzZnNfcmVtb3ZlX2ZpbGUoYmF0X3ByaXYtPm1lc2hfb2JqLCAmKCgqYmF0X2F0dHIpLT5hdHRyKSk7Ci0KLQlrb2JqZWN0X3B1dChiYXRfcHJpdi0+bWVzaF9vYmopOwotCWJhdF9wcml2LT5tZXNoX29iaiA9IE5VTEw7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNob3dfbWVzaF9pZmFjZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICAgICBjaGFyICpidWZmKQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRvX2Rldihrb2JqLT5wYXJlbnQpOwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gdG9fbmV0X2RldihkZXYpOwotCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZiA9IGdldF9iYXRtYW5faWZfYnlfbmV0ZGV2KG5ldF9kZXYpOwotCXNzaXplX3QgbGVuZ3RoOwotCi0JaWYgKCFiYXRtYW5faWYpCi0JCXJldHVybiAwOwotCi0JbGVuZ3RoID0gc3ByaW50ZihidWZmLCAiJXNcbiIsIGJhdG1hbl9pZi0+aWZfc3RhdHVzID09IElGX05PVF9JTl9VU0UgPwotCQkJICJub25lIiA6IGJhdG1hbl9pZi0+c29mdF9pZmFjZS0+bmFtZSk7Ci0KLQloYXJkaWZfcHV0KGJhdG1hbl9pZik7Ci0KLQlyZXR1cm4gbGVuZ3RoOwotfQotCi1zdGF0aWMgc3NpemVfdCBzdG9yZV9tZXNoX2lmYWNlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJCWNoYXIgKmJ1ZmYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0b19kZXYoa29iai0+cGFyZW50KTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IHRvX25ldF9kZXYoZGV2KTsKLQlzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYgPSBnZXRfYmF0bWFuX2lmX2J5X25ldGRldihuZXRfZGV2KTsKLQlpbnQgc3RhdHVzX3RtcCA9IC0xOwotCWludCByZXQ7Ci0KLQlpZiAoIWJhdG1hbl9pZikKLQkJcmV0dXJuIGNvdW50OwotCi0JaWYgKGJ1ZmZbY291bnQgLSAxXSA9PSAnXG4nKQotCQlidWZmW2NvdW50IC0gMV0gPSAnXDAnOwotCi0JaWYgKHN0cmxlbihidWZmKSA+PSBJRk5BTVNJWikgewotCQlwcl9lcnIoIkludmFsaWQgcGFyYW1ldGVyIGZvciAnbWVzaF9pZmFjZScgc2V0dGluZyByZWNlaXZlZDogIgotCQkgICAgICAgImludGVyZmFjZSBuYW1lIHRvbyBsb25nICclcydcbiIsIGJ1ZmYpOwotCQloYXJkaWZfcHV0KGJhdG1hbl9pZik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChzdHJuY21wKGJ1ZmYsICJub25lIiwgNCkgPT0gMCkKLQkJc3RhdHVzX3RtcCA9IElGX05PVF9JTl9VU0U7Ci0JZWxzZQotCQlzdGF0dXNfdG1wID0gSUZfSV9XQU5UX1lPVTsKLQotCWlmICgoYmF0bWFuX2lmLT5pZl9zdGF0dXMgPT0gc3RhdHVzX3RtcCkgfHwgKChiYXRtYW5faWYtPnNvZnRfaWZhY2UpICYmCi0JICAgIChzdHJuY21wKGJhdG1hbl9pZi0+c29mdF9pZmFjZS0+bmFtZSwgYnVmZiwgSUZOQU1TSVopID09IDApKSkgewotCQloYXJkaWZfcHV0KGJhdG1hbl9pZik7Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0KLQlpZiAoc3RhdHVzX3RtcCA9PSBJRl9OT1RfSU5fVVNFKSB7Ci0JCXJ0bmxfbG9jaygpOwotCQloYXJkaWZfZGlzYWJsZV9pbnRlcmZhY2UoYmF0bWFuX2lmKTsKLQkJcnRubF91bmxvY2soKTsKLQkJaGFyZGlmX3B1dChiYXRtYW5faWYpOwotCQlyZXR1cm4gY291bnQ7Ci0JfQotCi0JLyogaWYgdGhlIGludGVyZmFjZSBhbHJlYWR5IGlzIGluIHVzZSAqLwotCWlmIChiYXRtYW5faWYtPmlmX3N0YXR1cyAhPSBJRl9OT1RfSU5fVVNFKSB7Ci0JCXJ0bmxfbG9jaygpOwotCQloYXJkaWZfZGlzYWJsZV9pbnRlcmZhY2UoYmF0bWFuX2lmKTsKLQkJcnRubF91bmxvY2soKTsKLQl9Ci0KLQlyZXQgPSBoYXJkaWZfZW5hYmxlX2ludGVyZmFjZShiYXRtYW5faWYsIGJ1ZmYpOwotCWhhcmRpZl9wdXQoYmF0bWFuX2lmKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNob3dfaWZhY2Vfc3RhdHVzKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJCSBjaGFyICpidWZmKQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRvX2Rldihrb2JqLT5wYXJlbnQpOwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gdG9fbmV0X2RldihkZXYpOwotCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZiA9IGdldF9iYXRtYW5faWZfYnlfbmV0ZGV2KG5ldF9kZXYpOwotCXNzaXplX3QgbGVuZ3RoOwotCi0JaWYgKCFiYXRtYW5faWYpCi0JCXJldHVybiAwOwotCi0Jc3dpdGNoIChiYXRtYW5faWYtPmlmX3N0YXR1cykgewotCWNhc2UgSUZfVE9fQkVfUkVNT1ZFRDoKLQkJbGVuZ3RoID0gc3ByaW50ZihidWZmLCAiZGlzYWJsaW5nXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBJRl9JTkFDVElWRToKLQkJbGVuZ3RoID0gc3ByaW50ZihidWZmLCAiaW5hY3RpdmVcbiIpOwotCQlicmVhazsKLQljYXNlIElGX0FDVElWRToKLQkJbGVuZ3RoID0gc3ByaW50ZihidWZmLCAiYWN0aXZlXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBJRl9UT19CRV9BQ1RJVkFURUQ6Ci0JCWxlbmd0aCA9IHNwcmludGYoYnVmZiwgImVuYWJsaW5nXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBJRl9OT1RfSU5fVVNFOgotCWRlZmF1bHQ6Ci0JCWxlbmd0aCA9IHNwcmludGYoYnVmZiwgIm5vdCBpbiB1c2VcbiIpOwotCQlicmVhazsKLQl9Ci0KLQloYXJkaWZfcHV0KGJhdG1hbl9pZik7Ci0KLQlyZXR1cm4gbGVuZ3RoOwotfQotCi1zdGF0aWMgQkFUX0FUVFIobWVzaF9pZmFjZSwgU19JUlVHTyB8IFNfSVdVU1IsCi0JCXNob3dfbWVzaF9pZmFjZSwgc3RvcmVfbWVzaF9pZmFjZSk7Ci1zdGF0aWMgQkFUX0FUVFIoaWZhY2Vfc3RhdHVzLCBTX0lSVUdPLCBzaG93X2lmYWNlX3N0YXR1cywgTlVMTCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYmF0X2F0dHJpYnV0ZSAqYmF0bWFuX2F0dHJzW10gPSB7Ci0JJmJhdF9hdHRyX21lc2hfaWZhY2UsCi0JJmJhdF9hdHRyX2lmYWNlX3N0YXR1cywKLQlOVUxMLAotfTsKLQotaW50IHN5c2ZzX2FkZF9oYXJkaWYoc3RydWN0IGtvYmplY3QgKipoYXJkaWZfb2JqLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBrb2JqZWN0ICpoYXJkaWZfa29iamVjdCA9ICZkZXYtPmRldi5rb2JqOwotCXN0cnVjdCBiYXRfYXR0cmlidXRlICoqYmF0X2F0dHI7Ci0JaW50IGVycjsKLQotCSpoYXJkaWZfb2JqID0ga29iamVjdF9jcmVhdGVfYW5kX2FkZChTWVNGU19JRl9CQVRfU1VCRElSLAotCQkJCQkJICAgIGhhcmRpZl9rb2JqZWN0KTsKLQotCWlmICghKmhhcmRpZl9vYmopIHsKLQkJYmF0X2VycihkZXYsICJDYW4ndCBhZGQgc3lzZnMgZGlyZWN0b3J5OiAlcy8lc1xuIiwgZGV2LT5uYW1lLAotCQkJU1lTRlNfSUZfQkFUX1NVQkRJUik7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWZvciAoYmF0X2F0dHIgPSBiYXRtYW5fYXR0cnM7ICpiYXRfYXR0cjsgKytiYXRfYXR0cikgewotCQllcnIgPSBzeXNmc19jcmVhdGVfZmlsZSgqaGFyZGlmX29iaiwgJigoKmJhdF9hdHRyKS0+YXR0cikpOwotCQlpZiAoZXJyKSB7Ci0JCQliYXRfZXJyKGRldiwgIkNhbid0IGFkZCBzeXNmcyBmaWxlOiAlcy8lcy8lc1xuIiwKLQkJCQlkZXYtPm5hbWUsIFNZU0ZTX0lGX0JBVF9TVUJESVIsCi0JCQkJKCgqYmF0X2F0dHIpLT5hdHRyKS5uYW1lKTsKLQkJCWdvdG8gcmVtX2F0dHI7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLQotcmVtX2F0dHI6Ci0JZm9yIChiYXRfYXR0ciA9IGJhdG1hbl9hdHRyczsgKmJhdF9hdHRyOyArK2JhdF9hdHRyKQotCQlzeXNmc19yZW1vdmVfZmlsZSgqaGFyZGlmX29iaiwgJigoKmJhdF9hdHRyKS0+YXR0cikpOwotb3V0OgotCXJldHVybiAtRU5PTUVNOwotfQotCi12b2lkIHN5c2ZzX2RlbF9oYXJkaWYoc3RydWN0IGtvYmplY3QgKipoYXJkaWZfb2JqKQotewotCWtvYmplY3RfcHV0KCpoYXJkaWZfb2JqKTsKLQkqaGFyZGlmX29iaiA9IE5VTEw7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9iYXRfc3lzZnMuaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2JhdF9zeXNmcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjE4NmMwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2JhdF9zeXNmcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgotICoKLSAqIE1hcmVrIExpbmRuZXIKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVTQQotICoKLSAqLwotCi0KLSNpZm5kZWYgX05FVF9CQVRNQU5fQURWX1NZU0ZTX0hfCi0jZGVmaW5lIF9ORVRfQkFUTUFOX0FEVl9TWVNGU19IXwotCi0jZGVmaW5lIFNZU0ZTX0lGX01FU0hfU1VCRElSICJtZXNoIgotI2RlZmluZSBTWVNGU19JRl9CQVRfU1VCRElSICJiYXRtYW5fYWR2IgotCi1zdHJ1Y3QgYmF0X2F0dHJpYnV0ZSB7Ci0Jc3RydWN0IGF0dHJpYnV0ZSBhdHRyOwotCXNzaXplX3QgKCpzaG93KShzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKLQkJCWNoYXIgKmJ1Zik7Ci0Jc3NpemVfdCAoKnN0b3JlKShzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKLQkJCSBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7Ci19OwotCi1pbnQgc3lzZnNfYWRkX21lc2hpZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXZvaWQgc3lzZnNfZGVsX21lc2hpZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLWludCBzeXNmc19hZGRfaGFyZGlmKHN0cnVjdCBrb2JqZWN0ICoqaGFyZGlmX29iaiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci12b2lkIHN5c2ZzX2RlbF9oYXJkaWYoc3RydWN0IGtvYmplY3QgKipoYXJkaWZfb2JqKTsKLQotI2VuZGlmIC8qIF9ORVRfQkFUTUFOX0FEVl9TWVNGU19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYml0YXJyYXkuYyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2JpdGFycmF5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNDI3NGYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYml0YXJyYXkuYworKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMTAgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKLSAqCi0gKiBTaW1vbiBXdW5kZXJsaWNoLCBNYXJlayBMaW5kbmVyCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxLCBVU0EKLSAqCi0gKi8KLQotI2luY2x1ZGUgIm1haW4uaCIKLSNpbmNsdWRlICJiaXRhcnJheS5oIgotCi0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0KLS8qIHJldHVybnMgdHJ1ZSBpZiB0aGUgY29ycmVzcG9uZGluZyBiaXQgaW4gdGhlIGdpdmVuIHNlcV9iaXRzIGluZGljYXRlcyB0cnVlCi0gKiBhbmQgY3Vycl9zZXFubyBpcyB3aXRoaW4gcmFuZ2Ugb2YgbGFzdF9zZXFubyAqLwotdWludDhfdCBnZXRfYml0X3N0YXR1cyhUWVBFX09GX1dPUkQgKnNlcV9iaXRzLCB1aW50MzJfdCBsYXN0X3NlcW5vLAotCQkgICAgICAgdWludDMyX3QgY3Vycl9zZXFubykKLXsKLQlpbnQzMl90IGRpZmYsIHdvcmRfb2Zmc2V0LCB3b3JkX251bTsKLQotCWRpZmYgPSBsYXN0X3NlcW5vIC0gY3Vycl9zZXFubzsKLQlpZiAoZGlmZiA8IDAgfHwgZGlmZiA+PSBUUV9MT0NBTF9XSU5ET1dfU0laRSkgewotCQlyZXR1cm4gMDsKLQl9IGVsc2UgewotCQkvKiB3aGljaCB3b3JkICovCi0JCXdvcmRfbnVtID0gKGxhc3Rfc2Vxbm8gLSBjdXJyX3NlcW5vKSAvIFdPUkRfQklUX1NJWkU7Ci0JCS8qIHdoaWNoIHBvc2l0aW9uIGluIHRoZSBzZWxlY3RlZCB3b3JkICovCi0JCXdvcmRfb2Zmc2V0ID0gKGxhc3Rfc2Vxbm8gLSBjdXJyX3NlcW5vKSAlIFdPUkRfQklUX1NJWkU7Ci0KLQkJaWYgKHNlcV9iaXRzW3dvcmRfbnVtXSAmIDEgPDwgd29yZF9vZmZzZXQpCi0JCQlyZXR1cm4gMTsKLQkJZWxzZQotCQkJcmV0dXJuIDA7Ci0JfQotfQotCi0vKiB0dXJuIGNvcnJlc3BvbmRpbmcgYml0IG9uLCBzbyB3ZSBjYW4gcmVtZW1iZXIgdGhhdCB3ZSBnb3QgdGhlIHBhY2tldCAqLwotdm9pZCBiaXRfbWFyayhUWVBFX09GX1dPUkQgKnNlcV9iaXRzLCBpbnQzMl90IG4pCi17Ci0JaW50MzJfdCB3b3JkX29mZnNldCwgd29yZF9udW07Ci0KLQkvKiBpZiB0b28gb2xkLCBqdXN0IGRyb3AgaXQgKi8KLQlpZiAobiA8IDAgfHwgbiA+PSBUUV9MT0NBTF9XSU5ET1dfU0laRSkKLQkJcmV0dXJuOwotCi0JLyogd2hpY2ggd29yZCAqLwotCXdvcmRfbnVtID0gbiAvIFdPUkRfQklUX1NJWkU7Ci0JLyogd2hpY2ggcG9zaXRpb24gaW4gdGhlIHNlbGVjdGVkIHdvcmQgKi8KLQl3b3JkX29mZnNldCA9IG4gJSBXT1JEX0JJVF9TSVpFOwotCi0Jc2VxX2JpdHNbd29yZF9udW1dIHw9IDEgPDwgd29yZF9vZmZzZXQ7CS8qIHR1cm4gdGhlIHBvc2l0aW9uIG9uICovCi19Ci0KLS8qIHNoaWZ0IHRoZSBwYWNrZXQgYXJyYXkgYnkgbiBwbGFjZXMuICovCi1zdGF0aWMgdm9pZCBiaXRfc2hpZnQoVFlQRV9PRl9XT1JEICpzZXFfYml0cywgaW50MzJfdCBuKQotewotCWludDMyX3Qgd29yZF9vZmZzZXQsIHdvcmRfbnVtOwotCWludDMyX3QgaTsKLQotCWlmIChuIDw9IDAgfHwgbiA+PSBUUV9MT0NBTF9XSU5ET1dfU0laRSkKLQkJcmV0dXJuOwotCi0Jd29yZF9vZmZzZXQgPSBuICUgV09SRF9CSVRfU0laRTsvKiBzaGlmdCBob3cgbXVjaCBpbnNpZGUgZWFjaCB3b3JkICovCi0Jd29yZF9udW0gPSBuIC8gV09SRF9CSVRfU0laRTsJLyogc2hpZnQgb3ZlciBob3cgbXVjaCAoZnVsbCkgd29yZHMgKi8KLQotCWZvciAoaSA9IE5VTV9XT1JEUyAtIDE7IGkgPiB3b3JkX251bTsgaS0tKSB7Ci0JCS8qIGdvaW5nIGZyb20gb2xkIHRvIG5ldywgc28gd2UgZG9uJ3Qgb3ZlcndyaXRlIHRoZSBkYXRhIHdlIGNvcHkKLQkJICogZnJvbS4KLQkJICoKLQkJICogbGVmdCBpcyBoaWdoLCByaWdodCBpcyBsb3c6IEZFREMgQkE5OCA3NjU0IDMyMTAKLQkJICoJCQkJCSAgXl4gXl4KLQkJICoJCQkgICAgICAgdnZ2dgotCQkgKiBeXl5eID0gZnJvbSwgdnZ2dnYgPXRvLCB3ZSdkIGhhdmUgd29yZF9udW09PTEgYW5kCi0JCSAqIHdvcmRfb2Zmc2V0PT1XT1JEX0JJVF9TSVpFLzIgPz8/Pz8gaW4gdGhpcyBleGFtcGxlLgotCQkgKiAoPTI0IGJpdHMpCi0JCSAqCi0JCSAqIG91ciBkZXNpcmVkIG91dHB1dCB3b3VsZCBiZTogOTg3NiA1NDMyIDEwMDAgMDAwMAotCQkgKiAqLwotCi0JCXNlcV9iaXRzW2ldID0KLQkJCShzZXFfYml0c1tpIC0gd29yZF9udW1dIDw8IHdvcmRfb2Zmc2V0KSArCi0JCQkvKiB0YWtlIHRoZSBsb3dlciBwb3J0IGZyb20gdGhlIGxlZnQgaGFsZiwgc2hpZnQgaXQgbGVmdAotCQkJICogdG8gaXRzIGZpbmFsIHBvc2l0aW9uICovCi0JCQkoc2VxX2JpdHNbaSAtIHdvcmRfbnVtIC0gMV0gPj4KLQkJCSAoV09SRF9CSVRfU0laRS13b3JkX29mZnNldCkpOwotCQkvKiBhbmQgdGhlIHVwcGVyIHBhcnQgb2YgdGhlIHJpZ2h0IGhhbGYgYW5kIHNoaWZ0IGl0IGxlZnQgdG8KLQkJICogaXQncyBwb3NpdGlvbiAqLwotCQkvKiBmb3Igb3VyIGV4YW1wbGUgdGhhdCB3b3VsZCBiZTogd29yZFswXSA9IDk4MDAgKyAwMDc2ID0KLQkJICogOTg3NiAqLwotCX0KLQkvKiBub3cgZm9yIG91ciBsYXN0IHdvcmQsIGk9PXdvcmRfbnVtLCB3ZSBvbmx5IGhhdmUgdGhlIGl0J3MgImxlZnQiCi0JICogaGFsZi4gdGhhdCdzIHRoZSAxMDAwIHdvcmQgaW4gb3VyIGV4YW1wbGUuKi8KLQotCXNlcV9iaXRzW2ldID0gKHNlcV9iaXRzW2kgLSB3b3JkX251bV0gPDwgd29yZF9vZmZzZXQpOwotCi0JLyogcGFkIHRoZSByZXN0IHdpdGggMCwgaWYgdGhlcmUgaXMgYW55dGhpbmcgKi8KLQlpLS07Ci0KLQlmb3IgKDsgaSA+PSAwOyBpLS0pCi0JCXNlcV9iaXRzW2ldID0gMDsKLX0KLQotc3RhdGljIHZvaWQgYml0X3Jlc2V0X3dpbmRvdyhUWVBFX09GX1dPUkQgKnNlcV9iaXRzKQotewotCWludCBpOwotCWZvciAoaSA9IDA7IGkgPCBOVU1fV09SRFM7IGkrKykKLQkJc2VxX2JpdHNbaV0gPSAwOwotfQotCi0KLS8qIHJlY2VpdmUgYW5kIHByb2Nlc3Mgb25lIHBhY2tldCB3aXRoaW4gdGhlIHNlcXVlbmNlIG51bWJlciB3aW5kb3cuCi0gKgotICogcmV0dXJuczoKLSAqICAxIGlmIHRoZSB3aW5kb3cgd2FzIG1vdmVkIChlaXRoZXIgbmV3IG9yIHZlcnkgb2xkKQotICogIDAgaWYgdGhlIHdpbmRvdyB3YXMgbm90IG1vdmVkL3NoaWZ0ZWQuCi0gKi8KLWNoYXIgYml0X2dldF9wYWNrZXQodm9pZCAqcHJpdiwgVFlQRV9PRl9XT1JEICpzZXFfYml0cywKLQkJICAgIGludDMyX3Qgc2VxX251bV9kaWZmLCBpbnQ4X3Qgc2V0X21hcmspCi17Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IChzdHJ1Y3QgYmF0X3ByaXYgKilwcml2OwotCi0JLyogc2VxdWVuY2UgbnVtYmVyIGlzIHNsaWdodGx5IG9sZGVyLiBXZSBhbHJlYWR5IGdvdCBhIHNlcXVlbmNlIG51bWJlcgotCSAqIGhpZ2hlciB0aGFuIHRoaXMgb25lLCBzbyB3ZSBqdXN0IG1hcmsgaXQuICovCi0KLQlpZiAoKHNlcV9udW1fZGlmZiA8PSAwKSAmJiAoc2VxX251bV9kaWZmID4gLVRRX0xPQ0FMX1dJTkRPV19TSVpFKSkgewotCQlpZiAoc2V0X21hcmspCi0JCQliaXRfbWFyayhzZXFfYml0cywgLXNlcV9udW1fZGlmZik7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIHNlcXVlbmNlIG51bWJlciBpcyBzbGlnaHRseSBuZXdlciwgc28gd2Ugc2hpZnQgdGhlIHdpbmRvdyBhbmQKLQkgKiBzZXQgdGhlIG1hcmsgaWYgcmVxdWlyZWQgKi8KLQotCWlmICgoc2VxX251bV9kaWZmID4gMCkgJiYgKHNlcV9udW1fZGlmZiA8IFRRX0xPQ0FMX1dJTkRPV19TSVpFKSkgewotCQliaXRfc2hpZnQoc2VxX2JpdHMsIHNlcV9udW1fZGlmZik7Ci0KLQkJaWYgKHNldF9tYXJrKQotCQkJYml0X21hcmsoc2VxX2JpdHMsIDApOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQkvKiBzZXF1ZW5jZSBudW1iZXIgaXMgbXVjaCBuZXdlciwgcHJvYmFibHkgbWlzc2VkIGEgbG90IG9mIHBhY2tldHMgKi8KLQotCWlmICgoc2VxX251bV9kaWZmID49IFRRX0xPQ0FMX1dJTkRPV19TSVpFKQotCQl8fCAoc2VxX251bV9kaWZmIDwgRVhQRUNURURfU0VRTk9fUkFOR0UpKSB7Ci0JCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCi0JCQkiV2UgbWlzc2VkIGEgbG90IG9mIHBhY2tldHMgKCVpKSAhXG4iLAotCQkJc2VxX251bV9kaWZmIC0gMSk7Ci0JCWJpdF9yZXNldF93aW5kb3coc2VxX2JpdHMpOwotCQlpZiAoc2V0X21hcmspCi0JCQliaXRfbWFyayhzZXFfYml0cywgMCk7Ci0JCXJldHVybiAxOwotCX0KLQotCS8qIHJlY2VpdmVkIGEgbXVjaCBvbGRlciBwYWNrZXQuIFRoZSBvdGhlciBob3N0IGVpdGhlciByZXN0YXJ0ZWQKLQkgKiBvciB0aGUgb2xkIHBhY2tldCBnb3QgZGVsYXllZCBzb21ld2hlcmUgaW4gdGhlIG5ldHdvcmsuIFRoZQotCSAqIHBhY2tldCBzaG91bGQgYmUgZHJvcHBlZCB3aXRob3V0IGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBpZiB0aGUKLQkgKiBzZXFubyB3aW5kb3cgaXMgcHJvdGVjdGVkLiAqLwotCi0JaWYgKChzZXFfbnVtX2RpZmYgPD0gLVRRX0xPQ0FMX1dJTkRPV19TSVpFKQotCQl8fCAoc2VxX251bV9kaWZmID49IEVYUEVDVEVEX1NFUU5PX1JBTkdFKSkgewotCi0JCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCi0JCQkiT3RoZXIgaG9zdCBwcm9iYWJseSByZXN0YXJ0ZWQhXG4iKTsKLQotCQliaXRfcmVzZXRfd2luZG93KHNlcV9iaXRzKTsKLQkJaWYgKHNldF9tYXJrKQotCQkJYml0X21hcmsoc2VxX2JpdHMsIDApOwotCi0JCXJldHVybiAxOwotCX0KLQotCS8qIG5ldmVyIHJlYWNoZWQgKi8KLQlyZXR1cm4gMDsKLX0KLQotLyogY291bnQgdGhlIGhhbW1pbmcgd2VpZ2h0LCBob3cgbWFueSBnb29kIHBhY2tldHMgZGlkIHdlIHJlY2VpdmU/IGp1c3QgY291bnQKLSAqIHRoZSAxJ3MuCi0gKi8KLWludCBiaXRfcGFja2V0X2NvdW50KFRZUEVfT0ZfV09SRCAqc2VxX2JpdHMpCi17Ci0JaW50IGksIGhhbW1pbmcgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IE5VTV9XT1JEUzsgaSsrKQotCQloYW1taW5nICs9IGh3ZWlnaHRfbG9uZyhzZXFfYml0c1tpXSk7Ci0KLQlyZXR1cm4gaGFtbWluZzsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2JpdGFycmF5LmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9iaXRhcnJheS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2IxZTYxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2JpdGFycmF5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMTAgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKLSAqCi0gKiBTaW1vbiBXdW5kZXJsaWNoLCBNYXJlayBMaW5kbmVyCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxLCBVU0EKLSAqCi0gKi8KLQotI2lmbmRlZiBfTkVUX0JBVE1BTl9BRFZfQklUQVJSQVlfSF8KLSNkZWZpbmUgX05FVF9CQVRNQU5fQURWX0JJVEFSUkFZX0hfCi0KLS8qIHlvdSBzaG91bGQgY2hvb3NlIHNvbWV0aGluZyBiaWcsIGlmIHlvdSBkb24ndCB3YW50IHRvIHdhc3RlIGNwdQotICogYW5kIGtlZXAgdGhlIHR5cGUgaW4gc3luYyB3aXRoIGJpdF9wYWNrZXRfY291bnQgKi8KLSNkZWZpbmUgVFlQRV9PRl9XT1JEIHVuc2lnbmVkIGxvbmcKLSNkZWZpbmUgV09SRF9CSVRfU0laRSAoc2l6ZW9mKFRZUEVfT0ZfV09SRCkgKiA4KQotCi0vKiByZXR1cm5zIHRydWUgaWYgdGhlIGNvcnJlc3BvbmRpbmcgYml0IGluIHRoZSBnaXZlbiBzZXFfYml0cyBpbmRpY2F0ZXMgdHJ1ZQotICogYW5kIGN1cnJfc2Vxbm8gaXMgd2l0aGluIHJhbmdlIG9mIGxhc3Rfc2Vxbm8gKi8KLXVpbnQ4X3QgZ2V0X2JpdF9zdGF0dXMoVFlQRV9PRl9XT1JEICpzZXFfYml0cywgdWludDMyX3QgbGFzdF9zZXFubywKLQkJCQkJICAgdWludDMyX3QgY3Vycl9zZXFubyk7Ci0KLS8qIHR1cm4gY29ycmVzcG9uZGluZyBiaXQgb24sIHNvIHdlIGNhbiByZW1lbWJlciB0aGF0IHdlIGdvdCB0aGUgcGFja2V0ICovCi12b2lkIGJpdF9tYXJrKFRZUEVfT0ZfV09SRCAqc2VxX2JpdHMsIGludDMyX3Qgbik7Ci0KLQotLyogcmVjZWl2ZSBhbmQgcHJvY2VzcyBvbmUgcGFja2V0LCByZXR1cm5zIDEgaWYgcmVjZWl2ZWQgc2VxX251bSBpcyBjb25zaWRlcmVkCi0gKiBuZXcsIDAgaWYgb2xkICAqLwotY2hhciBiaXRfZ2V0X3BhY2tldCh2b2lkICpwcml2LCBUWVBFX09GX1dPUkQgKnNlcV9iaXRzLAotCQkgICAgaW50MzJfdCBzZXFfbnVtX2RpZmYsIGludDhfdCBzZXRfbWFyayk7Ci0KLS8qIGNvdW50IHRoZSBoYW1taW5nIHdlaWdodCwgaG93IG1hbnkgZ29vZCBwYWNrZXRzIGRpZCB3ZSByZWNlaXZlPyAqLwotaW50ICBiaXRfcGFja2V0X2NvdW50KFRZUEVfT0ZfV09SRCAqc2VxX2JpdHMpOwotCi0jZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX0JJVEFSUkFZX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9oYXJkLWludGVyZmFjZS5jIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvaGFyZC1pbnRlcmZhY2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg1ZGU4Mi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9oYXJkLWludGVyZmFjZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgotICoKLSAqIE1hcmVrIExpbmRuZXIsIFNpbW9uIFd1bmRlcmxpY2gKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVTQQotICoKLSAqLwotCi0jaW5jbHVkZSAibWFpbi5oIgotI2luY2x1ZGUgImhhcmQtaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAic29mdC1pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJzZW5kLmgiCi0jaW5jbHVkZSAidHJhbnNsYXRpb24tdGFibGUuaCIKLSNpbmNsdWRlICJyb3V0aW5nLmgiCi0jaW5jbHVkZSAiYmF0X3N5c2ZzLmgiCi0jaW5jbHVkZSAib3JpZ2luYXRvci5oIgotI2luY2x1ZGUgImhhc2guaCIKLQotI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgotCi0jZGVmaW5lIE1JTih4LCB5KSAoKHgpIDwgKHkpID8gKHgpIDogKHkpKQotCi0vKiBwcm90ZWN0IHVwZGF0ZSBjcml0aWNhbCBzaWRlIG9mIGlmX2xpc3QgLSBidXQgbm90IHRoZSBjb250ZW50ICovCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGlmX2xpc3RfbG9jayk7Ci0KLXN0cnVjdCBiYXRtYW5faWYgKmdldF9iYXRtYW5faWZfYnlfbmV0ZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQotewotCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZjsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShiYXRtYW5faWYsICZpZl9saXN0LCBsaXN0KSB7Ci0JCWlmIChiYXRtYW5faWYtPm5ldF9kZXYgPT0gbmV0X2RldikKLQkJCWdvdG8gb3V0OwotCX0KLQotCWJhdG1hbl9pZiA9IE5VTEw7Ci0KLW91dDoKLQlpZiAoYmF0bWFuX2lmKQotCQloYXJkaWZfaG9sZChiYXRtYW5faWYpOwotCi0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0JcmV0dXJuIGJhdG1hbl9pZjsKLX0KLQotc3RhdGljIGludCBpc192YWxpZF9pZmFjZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKLXsKLQlpZiAobmV0X2Rldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0spCi0JCXJldHVybiAwOwotCi0JaWYgKG5ldF9kZXYtPnR5cGUgIT0gQVJQSFJEX0VUSEVSKQotCQlyZXR1cm4gMDsKLQotCWlmIChuZXRfZGV2LT5hZGRyX2xlbiAhPSBFVEhfQUxFTikKLQkJcmV0dXJuIDA7Ci0KLQkvKiBubyBiYXRtYW4gb3ZlciBiYXRtYW4gKi8KLSNpZmRlZiBIQVZFX05FVF9ERVZJQ0VfT1BTCi0JaWYgKG5ldF9kZXYtPm5ldGRldl9vcHMtPm5kb19zdGFydF94bWl0ID09IGludGVyZmFjZV90eCkKLQkJcmV0dXJuIDA7Ci0jZWxzZQotCWlmIChuZXRfZGV2LT5oYXJkX3N0YXJ0X3htaXQgPT0gaW50ZXJmYWNlX3R4KQotCQlyZXR1cm4gMDsKLSNlbmRpZgotCi0JLyogRGV2aWNlIGlzIGJlaW5nIGJyaWRnZWQgKi8KLQkvKiBpZiAobmV0X2Rldi0+cHJpdl9mbGFncyAmIElGRl9CUklER0VfUE9SVCkKLQkJcmV0dXJuIDA7ICovCi0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHN0cnVjdCBiYXRtYW5faWYgKmdldF9hY3RpdmVfYmF0bWFuX2lmKHN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlKQotewotCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZjsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShiYXRtYW5faWYsICZpZl9saXN0LCBsaXN0KSB7Ci0JCWlmIChiYXRtYW5faWYtPnNvZnRfaWZhY2UgIT0gc29mdF9pZmFjZSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChiYXRtYW5faWYtPmlmX3N0YXR1cyA9PSBJRl9BQ1RJVkUpCi0JCQlnb3RvIG91dDsKLQl9Ci0KLQliYXRtYW5faWYgPSBOVUxMOwotCi1vdXQ6Ci0JaWYgKGJhdG1hbl9pZikKLQkJaGFyZGlmX2hvbGQoYmF0bWFuX2lmKTsKLQotCXJjdV9yZWFkX3VubG9jaygpOwotCXJldHVybiBiYXRtYW5faWY7Ci19Ci0KLXN0YXRpYyB2b2lkIHVwZGF0ZV9wcmltYXJ5X2FkZHIoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKLXsKLQlzdHJ1Y3QgdmlzX3BhY2tldCAqdmlzX3BhY2tldDsKLQotCXZpc19wYWNrZXQgPSAoc3RydWN0IHZpc19wYWNrZXQgKikKLQkJCQliYXRfcHJpdi0+bXlfdmlzX2luZm8tPnNrYl9wYWNrZXQtPmRhdGE7Ci0JbWVtY3B5KHZpc19wYWNrZXQtPnZpc19vcmlnLAotCSAgICAgICBiYXRfcHJpdi0+cHJpbWFyeV9pZi0+bmV0X2Rldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKLQltZW1jcHkodmlzX3BhY2tldC0+c2VuZGVyX29yaWcsCi0JICAgICAgIGJhdF9wcml2LT5wcmltYXJ5X2lmLT5uZXRfZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwotfQotCi1zdGF0aWMgdm9pZCBzZXRfcHJpbWFyeV9pZihzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJICAgc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmKQotewotCXN0cnVjdCBiYXRtYW5fcGFja2V0ICpiYXRtYW5fcGFja2V0OwotCXN0cnVjdCBiYXRtYW5faWYgKm9sZF9pZjsKLQotCWlmIChiYXRtYW5faWYpCi0JCWhhcmRpZl9ob2xkKGJhdG1hbl9pZik7Ci0KLQlvbGRfaWYgPSBiYXRfcHJpdi0+cHJpbWFyeV9pZjsKLQliYXRfcHJpdi0+cHJpbWFyeV9pZiA9IGJhdG1hbl9pZjsKLQotCWlmIChvbGRfaWYpCi0JCWhhcmRpZl9wdXQob2xkX2lmKTsKLQotCWlmICghYmF0X3ByaXYtPnByaW1hcnlfaWYpCi0JCXJldHVybjsKLQotCWJhdG1hbl9wYWNrZXQgPSAoc3RydWN0IGJhdG1hbl9wYWNrZXQgKikoYmF0bWFuX2lmLT5wYWNrZXRfYnVmZik7Ci0JYmF0bWFuX3BhY2tldC0+ZmxhZ3MgPSBQUklNQVJJRVNfRklSU1RfSE9QOwotCWJhdG1hbl9wYWNrZXQtPnR0bCA9IFRUTDsKLQotCXVwZGF0ZV9wcmltYXJ5X2FkZHIoYmF0X3ByaXYpOwotCi0JLyoqKgotCSAqIGhhY2t5IHRyaWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIHNlbmQgdGhlIEhOQSBpbmZvcm1hdGlvbiB2aWEKLQkgKiBvdXIgbmV3IHByaW1hcnkgaW50ZXJmYWNlCi0JICovCi0JYXRvbWljX3NldCgmYmF0X3ByaXYtPmhuYV9sb2NhbF9jaGFuZ2VkLCAxKTsKLX0KLQotc3RhdGljIGJvb2wgaGFyZGlmX2lzX2lmYWNlX3VwKHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZikKLXsKLQlpZiAoYmF0bWFuX2lmLT5uZXRfZGV2LT5mbGFncyAmIElGRl9VUCkKLQkJcmV0dXJuIHRydWU7Ci0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB2b2lkIHVwZGF0ZV9tYWNfYWRkcmVzc2VzKHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZikKLXsKLQltZW1jcHkoKChzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqKShiYXRtYW5faWYtPnBhY2tldF9idWZmKSktPm9yaWcsCi0JICAgICAgIGJhdG1hbl9pZi0+bmV0X2Rldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKLQltZW1jcHkoKChzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqKShiYXRtYW5faWYtPnBhY2tldF9idWZmKSktPnByZXZfc2VuZGVyLAotCSAgICAgICBiYXRtYW5faWYtPm5ldF9kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7Ci19Ci0KLXN0YXRpYyB2b2lkIGNoZWNrX2tub3duX21hY19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQotewotCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZjsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShiYXRtYW5faWYsICZpZl9saXN0LCBsaXN0KSB7Ci0JCWlmICgoYmF0bWFuX2lmLT5pZl9zdGF0dXMgIT0gSUZfQUNUSVZFKSAmJgotCQkgICAgKGJhdG1hbl9pZi0+aWZfc3RhdHVzICE9IElGX1RPX0JFX0FDVElWQVRFRCkpCi0JCQljb250aW51ZTsKLQotCQlpZiAoYmF0bWFuX2lmLT5uZXRfZGV2ID09IG5ldF9kZXYpCi0JCQljb250aW51ZTsKLQotCQlpZiAoIWNvbXBhcmVfb3JpZyhiYXRtYW5faWYtPm5ldF9kZXYtPmRldl9hZGRyLAotCQkJCSAgbmV0X2Rldi0+ZGV2X2FkZHIpKQotCQkJY29udGludWU7Ci0KLQkJcHJfd2FybmluZygiVGhlIG5ld2x5IGFkZGVkIG1hYyBhZGRyZXNzICglcE0pIGFscmVhZHkgZXhpc3RzICIKLQkJCSAgICJvbjogJXNcbiIsIG5ldF9kZXYtPmRldl9hZGRyLAotCQkJICAgYmF0bWFuX2lmLT5uZXRfZGV2LT5uYW1lKTsKLQkJcHJfd2FybmluZygiSXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8ga2VlcCBtYWMgYWRkcmVzc2VzICIKLQkJCSAgICJ1bmlxdWUgdG8gYXZvaWQgcHJvYmxlbXMhXG4iKTsKLQl9Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci19Ci0KLWludCBoYXJkaWZfbWluX210dShzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZSkKLXsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoc29mdF9pZmFjZSk7Ci0Jc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOwotCS8qIGFsbG93IGJpZyBmcmFtZXMgaWYgYWxsIGRldmljZXMgYXJlIGNhcGFibGUgdG8gZG8gc28KLQkgKiAoaGF2ZSBNVFUgPiAxNTAwICsgQkFUX0hFQURFUl9MRU4pICovCi0JaW50IG1pbl9tdHUgPSBFVEhfREFUQV9MRU47Ci0KLQlpZiAoYXRvbWljX3JlYWQoJmJhdF9wcml2LT5mcmFnX2VuYWJsZWQpKQotCQlnb3RvIG91dDsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShiYXRtYW5faWYsICZpZl9saXN0LCBsaXN0KSB7Ci0JCWlmICgoYmF0bWFuX2lmLT5pZl9zdGF0dXMgIT0gSUZfQUNUSVZFKSAmJgotCQkgICAgKGJhdG1hbl9pZi0+aWZfc3RhdHVzICE9IElGX1RPX0JFX0FDVElWQVRFRCkpCi0JCQljb250aW51ZTsKLQotCQlpZiAoYmF0bWFuX2lmLT5zb2Z0X2lmYWNlICE9IHNvZnRfaWZhY2UpCi0JCQljb250aW51ZTsKLQotCQltaW5fbXR1ID0gTUlOKGJhdG1hbl9pZi0+bmV0X2Rldi0+bXR1IC0gQkFUX0hFQURFUl9MRU4sCi0JCQkgICAgICBtaW5fbXR1KTsKLQl9Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci1vdXQ6Ci0JcmV0dXJuIG1pbl9tdHU7Ci19Ci0KLS8qIGFkanVzdHMgdGhlIE1UVSBpZiBhIG5ldyBpbnRlcmZhY2Ugd2l0aCBhIHNtYWxsZXIgTVRVIGFwcGVhcmVkLiAqLwotdm9pZCB1cGRhdGVfbWluX210dShzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZSkKLXsKLQlpbnQgbWluX210dTsKLQotCW1pbl9tdHUgPSBoYXJkaWZfbWluX210dShzb2Z0X2lmYWNlKTsKLQlpZiAoc29mdF9pZmFjZS0+bXR1ICE9IG1pbl9tdHUpCi0JCXNvZnRfaWZhY2UtPm10dSA9IG1pbl9tdHU7Ci19Ci0KLXN0YXRpYyB2b2lkIGhhcmRpZl9hY3RpdmF0ZV9pbnRlcmZhY2Uoc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmKQotewotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXY7Ci0KLQlpZiAoYmF0bWFuX2lmLT5pZl9zdGF0dXMgIT0gSUZfSU5BQ1RJVkUpCi0JCXJldHVybjsKLQotCWJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoYmF0bWFuX2lmLT5zb2Z0X2lmYWNlKTsKLQotCXVwZGF0ZV9tYWNfYWRkcmVzc2VzKGJhdG1hbl9pZik7Ci0JYmF0bWFuX2lmLT5pZl9zdGF0dXMgPSBJRl9UT19CRV9BQ1RJVkFURUQ7Ci0KLQkvKioKLQkgKiB0aGUgZmlyc3QgYWN0aXZlIGludGVyZmFjZSBiZWNvbWVzIG91ciBwcmltYXJ5IGludGVyZmFjZSBvcgotCSAqIHRoZSBuZXh0IGFjdGl2ZSBpbnRlcmZhY2UgYWZ0ZXIgdGhlIG9sZCBwcmltYXkgaW50ZXJmYWNlIHdhcyByZW1vdmVkCi0JICovCi0JaWYgKCFiYXRfcHJpdi0+cHJpbWFyeV9pZikKLQkJc2V0X3ByaW1hcnlfaWYoYmF0X3ByaXYsIGJhdG1hbl9pZik7Ci0KLQliYXRfaW5mbyhiYXRtYW5faWYtPnNvZnRfaWZhY2UsICJJbnRlcmZhY2UgYWN0aXZhdGVkOiAlc1xuIiwKLQkJIGJhdG1hbl9pZi0+bmV0X2Rldi0+bmFtZSk7Ci0KLQl1cGRhdGVfbWluX210dShiYXRtYW5faWYtPnNvZnRfaWZhY2UpOwotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgaGFyZGlmX2RlYWN0aXZhdGVfaW50ZXJmYWNlKHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZikKLXsKLQlpZiAoKGJhdG1hbl9pZi0+aWZfc3RhdHVzICE9IElGX0FDVElWRSkgJiYKLQkgICAoYmF0bWFuX2lmLT5pZl9zdGF0dXMgIT0gSUZfVE9fQkVfQUNUSVZBVEVEKSkKLQkJcmV0dXJuOwotCi0JYmF0bWFuX2lmLT5pZl9zdGF0dXMgPSBJRl9JTkFDVElWRTsKLQotCWJhdF9pbmZvKGJhdG1hbl9pZi0+c29mdF9pZmFjZSwgIkludGVyZmFjZSBkZWFjdGl2YXRlZDogJXNcbiIsCi0JCSBiYXRtYW5faWYtPm5ldF9kZXYtPm5hbWUpOwotCi0JdXBkYXRlX21pbl9tdHUoYmF0bWFuX2lmLT5zb2Z0X2lmYWNlKTsKLX0KLQotaW50IGhhcmRpZl9lbmFibGVfaW50ZXJmYWNlKHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZiwgY2hhciAqaWZhY2VfbmFtZSkKLXsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2OwotCXN0cnVjdCBiYXRtYW5fcGFja2V0ICpiYXRtYW5fcGFja2V0OwotCi0JaWYgKGJhdG1hbl9pZi0+aWZfc3RhdHVzICE9IElGX05PVF9JTl9VU0UpCi0JCWdvdG8gb3V0OwotCi0JYmF0bWFuX2lmLT5zb2Z0X2lmYWNlID0gZGV2X2dldF9ieV9uYW1lKCZpbml0X25ldCwgaWZhY2VfbmFtZSk7Ci0KLQlpZiAoIWJhdG1hbl9pZi0+c29mdF9pZmFjZSkgewotCQliYXRtYW5faWYtPnNvZnRfaWZhY2UgPSBzb2Z0aWZfY3JlYXRlKGlmYWNlX25hbWUpOwotCi0JCWlmICghYmF0bWFuX2lmLT5zb2Z0X2lmYWNlKQotCQkJZ290byBlcnI7Ci0KLQkJLyogZGV2X2dldF9ieV9uYW1lKCkgaW5jcmVhc2VzIHRoZSByZWZlcmVuY2UgY291bnRlciBmb3IgdXMgKi8KLQkJZGV2X2hvbGQoYmF0bWFuX2lmLT5zb2Z0X2lmYWNlKTsKLQl9Ci0KLQliYXRfcHJpdiA9IG5ldGRldl9wcml2KGJhdG1hbl9pZi0+c29mdF9pZmFjZSk7Ci0JYmF0bWFuX2lmLT5wYWNrZXRfbGVuID0gQkFUX1BBQ0tFVF9MRU47Ci0JYmF0bWFuX2lmLT5wYWNrZXRfYnVmZiA9IGttYWxsb2MoYmF0bWFuX2lmLT5wYWNrZXRfbGVuLCBHRlBfQVRPTUlDKTsKLQotCWlmICghYmF0bWFuX2lmLT5wYWNrZXRfYnVmZikgewotCQliYXRfZXJyKGJhdG1hbl9pZi0+c29mdF9pZmFjZSwgIkNhbid0IGFkZCBpbnRlcmZhY2UgcGFja2V0ICIKLQkJCSIoJXMpOiBvdXQgb2YgbWVtb3J5XG4iLCBiYXRtYW5faWYtPm5ldF9kZXYtPm5hbWUpOwotCQlnb3RvIGVycjsKLQl9Ci0KLQliYXRtYW5fcGFja2V0ID0gKHN0cnVjdCBiYXRtYW5fcGFja2V0ICopKGJhdG1hbl9pZi0+cGFja2V0X2J1ZmYpOwotCWJhdG1hbl9wYWNrZXQtPnBhY2tldF90eXBlID0gQkFUX1BBQ0tFVDsKLQliYXRtYW5fcGFja2V0LT52ZXJzaW9uID0gQ09NUEFUX1ZFUlNJT047Ci0JYmF0bWFuX3BhY2tldC0+ZmxhZ3MgPSAwOwotCWJhdG1hbl9wYWNrZXQtPnR0bCA9IDI7Ci0JYmF0bWFuX3BhY2tldC0+dHEgPSBUUV9NQVhfVkFMVUU7Ci0JYmF0bWFuX3BhY2tldC0+bnVtX2huYSA9IDA7Ci0KLQliYXRtYW5faWYtPmlmX251bSA9IGJhdF9wcml2LT5udW1faWZhY2VzOwotCWJhdF9wcml2LT5udW1faWZhY2VzKys7Ci0JYmF0bWFuX2lmLT5pZl9zdGF0dXMgPSBJRl9JTkFDVElWRTsKLQlvcmlnX2hhc2hfYWRkX2lmKGJhdG1hbl9pZiwgYmF0X3ByaXYtPm51bV9pZmFjZXMpOwotCi0JYmF0bWFuX2lmLT5iYXRtYW5fYWR2X3B0eXBlLnR5cGUgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0JBVE1BTik7Ci0JYmF0bWFuX2lmLT5iYXRtYW5fYWR2X3B0eXBlLmZ1bmMgPSBiYXRtYW5fc2tiX3JlY3Y7Ci0JYmF0bWFuX2lmLT5iYXRtYW5fYWR2X3B0eXBlLmRldiA9IGJhdG1hbl9pZi0+bmV0X2RldjsKLQloYXJkaWZfaG9sZChiYXRtYW5faWYpOwotCWRldl9hZGRfcGFjaygmYmF0bWFuX2lmLT5iYXRtYW5fYWR2X3B0eXBlKTsKLQotCWF0b21pY19zZXQoJmJhdG1hbl9pZi0+c2Vxbm8sIDEpOwotCWF0b21pY19zZXQoJmJhdG1hbl9pZi0+ZnJhZ19zZXFubywgMSk7Ci0JYmF0X2luZm8oYmF0bWFuX2lmLT5zb2Z0X2lmYWNlLCAiQWRkaW5nIGludGVyZmFjZTogJXNcbiIsCi0JCSBiYXRtYW5faWYtPm5ldF9kZXYtPm5hbWUpOwotCi0JaWYgKGF0b21pY19yZWFkKCZiYXRfcHJpdi0+ZnJhZ19lbmFibGVkKSAmJiBiYXRtYW5faWYtPm5ldF9kZXYtPm10dSA8Ci0JCUVUSF9EQVRBX0xFTiArIEJBVF9IRUFERVJfTEVOKQotCQliYXRfaW5mbyhiYXRtYW5faWYtPnNvZnRfaWZhY2UsCi0JCQkiVGhlIE1UVSBvZiBpbnRlcmZhY2UgJXMgaXMgdG9vIHNtYWxsICglaSkgdG8gaGFuZGxlICIKLQkJCSJ0aGUgdHJhbnNwb3J0IG9mIGJhdG1hbi1hZHYgcGFja2V0cy4gUGFja2V0cyBnb2luZyAiCi0JCQkib3ZlciB0aGlzIGludGVyZmFjZSB3aWxsIGJlIGZyYWdtZW50ZWQgb24gbGF5ZXIyICIKLQkJCSJ3aGljaCBjb3VsZCBpbXBhY3QgdGhlIHBlcmZvcm1hbmNlLiBTZXR0aW5nIHRoZSBNVFUgIgotCQkJInRvICV6aSB3b3VsZCBzb2x2ZSB0aGUgcHJvYmxlbS5cbiIsCi0JCQliYXRtYW5faWYtPm5ldF9kZXYtPm5hbWUsIGJhdG1hbl9pZi0+bmV0X2Rldi0+bXR1LAotCQkJRVRIX0RBVEFfTEVOICsgQkFUX0hFQURFUl9MRU4pOwotCi0JaWYgKCFhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmZyYWdfZW5hYmxlZCkgJiYgYmF0bWFuX2lmLT5uZXRfZGV2LT5tdHUgPAotCQlFVEhfREFUQV9MRU4gKyBCQVRfSEVBREVSX0xFTikKLQkJYmF0X2luZm8oYmF0bWFuX2lmLT5zb2Z0X2lmYWNlLAotCQkJIlRoZSBNVFUgb2YgaW50ZXJmYWNlICVzIGlzIHRvbyBzbWFsbCAoJWkpIHRvIGhhbmRsZSAiCi0JCQkidGhlIHRyYW5zcG9ydCBvZiBiYXRtYW4tYWR2IHBhY2tldHMuIElmIHlvdSBleHBlcmllbmNlIgotCQkJIiBwcm9ibGVtcyBnZXR0aW5nIHRyYWZmaWMgdGhyb3VnaCB0cnkgaW5jcmVhc2luZyB0aGUgIgotCQkJIk1UVSB0byAlemkuXG4iLAotCQkJYmF0bWFuX2lmLT5uZXRfZGV2LT5uYW1lLCBiYXRtYW5faWYtPm5ldF9kZXYtPm10dSwKLQkJCUVUSF9EQVRBX0xFTiArIEJBVF9IRUFERVJfTEVOKTsKLQotCWlmIChoYXJkaWZfaXNfaWZhY2VfdXAoYmF0bWFuX2lmKSkKLQkJaGFyZGlmX2FjdGl2YXRlX2ludGVyZmFjZShiYXRtYW5faWYpOwotCWVsc2UKLQkJYmF0X2VycihiYXRtYW5faWYtPnNvZnRfaWZhY2UsICJOb3QgdXNpbmcgaW50ZXJmYWNlICVzICIKLQkJCSIocmV0cnlpbmcgbGF0ZXIpOiBpbnRlcmZhY2Ugbm90IGFjdGl2ZVxuIiwKLQkJCWJhdG1hbl9pZi0+bmV0X2Rldi0+bmFtZSk7Ci0KLQkvKiBiZWdpbiBzY2hlZHVsaW5nIG9yaWdpbmF0b3IgbWVzc2FnZXMgb24gdGhhdCBpbnRlcmZhY2UgKi8KLQlzY2hlZHVsZV9vd25fcGFja2V0KGJhdG1hbl9pZik7Ci0KLW91dDoKLQlyZXR1cm4gMDsKLQotZXJyOgotCXJldHVybiAtRU5PTUVNOwotfQotCi12b2lkIGhhcmRpZl9kaXNhYmxlX2ludGVyZmFjZShzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYpCi17Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KGJhdG1hbl9pZi0+c29mdF9pZmFjZSk7Ci0KLQlpZiAoYmF0bWFuX2lmLT5pZl9zdGF0dXMgPT0gSUZfQUNUSVZFKQotCQloYXJkaWZfZGVhY3RpdmF0ZV9pbnRlcmZhY2UoYmF0bWFuX2lmKTsKLQotCWlmIChiYXRtYW5faWYtPmlmX3N0YXR1cyAhPSBJRl9JTkFDVElWRSkKLQkJcmV0dXJuOwotCi0JYmF0X2luZm8oYmF0bWFuX2lmLT5zb2Z0X2lmYWNlLCAiUmVtb3ZpbmcgaW50ZXJmYWNlOiAlc1xuIiwKLQkJIGJhdG1hbl9pZi0+bmV0X2Rldi0+bmFtZSk7Ci0JZGV2X3JlbW92ZV9wYWNrKCZiYXRtYW5faWYtPmJhdG1hbl9hZHZfcHR5cGUpOwotCWhhcmRpZl9wdXQoYmF0bWFuX2lmKTsKLQotCWJhdF9wcml2LT5udW1faWZhY2VzLS07Ci0Jb3JpZ19oYXNoX2RlbF9pZihiYXRtYW5faWYsIGJhdF9wcml2LT5udW1faWZhY2VzKTsKLQotCWlmIChiYXRtYW5faWYgPT0gYmF0X3ByaXYtPnByaW1hcnlfaWYpIHsKLQkJc3RydWN0IGJhdG1hbl9pZiAqbmV3X2lmOwotCi0JCW5ld19pZiA9IGdldF9hY3RpdmVfYmF0bWFuX2lmKGJhdG1hbl9pZi0+c29mdF9pZmFjZSk7Ci0JCXNldF9wcmltYXJ5X2lmKGJhdF9wcml2LCBuZXdfaWYpOwotCi0JCWlmIChuZXdfaWYpCi0JCQloYXJkaWZfcHV0KG5ld19pZik7Ci0JfQotCi0Ja2ZyZWUoYmF0bWFuX2lmLT5wYWNrZXRfYnVmZik7Ci0JYmF0bWFuX2lmLT5wYWNrZXRfYnVmZiA9IE5VTEw7Ci0JYmF0bWFuX2lmLT5pZl9zdGF0dXMgPSBJRl9OT1RfSU5fVVNFOwotCi0JLyogZGVsZXRlIGFsbCByZWZlcmVuY2VzIHRvIHRoaXMgYmF0bWFuX2lmICovCi0JcHVyZ2Vfb3JpZ19yZWYoYmF0X3ByaXYpOwotCXB1cmdlX291dHN0YW5kaW5nX3BhY2tldHMoYmF0X3ByaXYsIGJhdG1hbl9pZik7Ci0JZGV2X3B1dChiYXRtYW5faWYtPnNvZnRfaWZhY2UpOwotCi0JLyogbm9ib2R5IHVzZXMgdGhpcyBpbnRlcmZhY2UgYW55bW9yZSAqLwotCWlmICghYmF0X3ByaXYtPm51bV9pZmFjZXMpCi0JCXNvZnRpZl9kZXN0cm95KGJhdG1hbl9pZi0+c29mdF9pZmFjZSk7Ci0KLQliYXRtYW5faWYtPnNvZnRfaWZhY2UgPSBOVUxMOwotfQotCi1zdGF0aWMgc3RydWN0IGJhdG1hbl9pZiAqaGFyZGlmX2FkZF9pbnRlcmZhY2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCi17Ci0Jc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOwotCWludCByZXQ7Ci0KLQlyZXQgPSBpc192YWxpZF9pZmFjZShuZXRfZGV2KTsKLQlpZiAocmV0ICE9IDEpCi0JCWdvdG8gb3V0OwotCi0JZGV2X2hvbGQobmV0X2Rldik7Ci0KLQliYXRtYW5faWYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYmF0bWFuX2lmKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFiYXRtYW5faWYpIHsKLQkJcHJfZXJyKCJDYW4ndCBhZGQgaW50ZXJmYWNlICglcyk6IG91dCBvZiBtZW1vcnlcbiIsCi0JCSAgICAgICBuZXRfZGV2LT5uYW1lKTsKLQkJZ290byByZWxlYXNlX2RldjsKLQl9Ci0KLQlyZXQgPSBzeXNmc19hZGRfaGFyZGlmKCZiYXRtYW5faWYtPmhhcmRpZl9vYmosIG5ldF9kZXYpOwotCWlmIChyZXQpCi0JCWdvdG8gZnJlZV9pZjsKLQotCWJhdG1hbl9pZi0+aWZfbnVtID0gLTE7Ci0JYmF0bWFuX2lmLT5uZXRfZGV2ID0gbmV0X2RldjsKLQliYXRtYW5faWYtPnNvZnRfaWZhY2UgPSBOVUxMOwotCWJhdG1hbl9pZi0+aWZfc3RhdHVzID0gSUZfTk9UX0lOX1VTRTsKLQlJTklUX0xJU1RfSEVBRCgmYmF0bWFuX2lmLT5saXN0KTsKLQlhdG9taWNfc2V0KCZiYXRtYW5faWYtPnJlZmNudCwgMCk7Ci0JaGFyZGlmX2hvbGQoYmF0bWFuX2lmKTsKLQotCWNoZWNrX2tub3duX21hY19hZGRyKGJhdG1hbl9pZi0+bmV0X2Rldik7Ci0KLQlzcGluX2xvY2soJmlmX2xpc3RfbG9jayk7Ci0JbGlzdF9hZGRfdGFpbF9yY3UoJmJhdG1hbl9pZi0+bGlzdCwgJmlmX2xpc3QpOwotCXNwaW5fdW5sb2NrKCZpZl9saXN0X2xvY2spOwotCi0JLyogZXh0cmEgcmVmZXJlbmNlIGZvciByZXR1cm4gKi8KLQloYXJkaWZfaG9sZChiYXRtYW5faWYpOwotCXJldHVybiBiYXRtYW5faWY7Ci0KLWZyZWVfaWY6Ci0Ja2ZyZWUoYmF0bWFuX2lmKTsKLXJlbGVhc2VfZGV2OgotCWRldl9wdXQobmV0X2Rldik7Ci1vdXQ6Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIGhhcmRpZl9yZW1vdmVfaW50ZXJmYWNlKHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZikKLXsKLQkvKiBmaXJzdCBkZWFjdGl2YXRlIGludGVyZmFjZSAqLwotCWlmIChiYXRtYW5faWYtPmlmX3N0YXR1cyAhPSBJRl9OT1RfSU5fVVNFKQotCQloYXJkaWZfZGlzYWJsZV9pbnRlcmZhY2UoYmF0bWFuX2lmKTsKLQotCWlmIChiYXRtYW5faWYtPmlmX3N0YXR1cyAhPSBJRl9OT1RfSU5fVVNFKQotCQlyZXR1cm47Ci0KLQliYXRtYW5faWYtPmlmX3N0YXR1cyA9IElGX1RPX0JFX1JFTU9WRUQ7Ci0Jc3luY2hyb25pemVfcmN1KCk7Ci0Jc3lzZnNfZGVsX2hhcmRpZigmYmF0bWFuX2lmLT5oYXJkaWZfb2JqKTsKLQloYXJkaWZfcHV0KGJhdG1hbl9pZik7Ci19Ci0KLXZvaWQgaGFyZGlmX3JlbW92ZV9pbnRlcmZhY2VzKHZvaWQpCi17Ci0Jc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmLCAqYmF0bWFuX2lmX3RtcDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGlmX3F1ZXVlOwotCi0JSU5JVF9MSVNUX0hFQUQoJmlmX3F1ZXVlKTsKLQotCXNwaW5fbG9jaygmaWZfbGlzdF9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYmF0bWFuX2lmLCBiYXRtYW5faWZfdG1wLCAmaWZfbGlzdCwgbGlzdCkgewotCQlsaXN0X2RlbF9yY3UoJmJhdG1hbl9pZi0+bGlzdCk7Ci0JCWxpc3RfYWRkX3RhaWwoJmJhdG1hbl9pZi0+bGlzdCwgJmlmX3F1ZXVlKTsKLQl9Ci0Jc3Bpbl91bmxvY2soJmlmX2xpc3RfbG9jayk7Ci0KLQlydG5sX2xvY2soKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYmF0bWFuX2lmLCBiYXRtYW5faWZfdG1wLCAmaWZfcXVldWUsIGxpc3QpIHsKLQkJaGFyZGlmX3JlbW92ZV9pbnRlcmZhY2UoYmF0bWFuX2lmKTsKLQl9Ci0JcnRubF91bmxvY2soKTsKLX0KLQotc3RhdGljIGludCBoYXJkX2lmX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywKLQkJCSB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwdHIpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilwdHI7Ci0Jc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmID0gZ2V0X2JhdG1hbl9pZl9ieV9uZXRkZXYobmV0X2Rldik7Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdjsKLQotCWlmICghYmF0bWFuX2lmICYmIGV2ZW50ID09IE5FVERFVl9SRUdJU1RFUikKLQkJYmF0bWFuX2lmID0gaGFyZGlmX2FkZF9pbnRlcmZhY2UobmV0X2Rldik7Ci0KLQlpZiAoIWJhdG1hbl9pZikKLQkJZ290byBvdXQ7Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBORVRERVZfVVA6Ci0JCWhhcmRpZl9hY3RpdmF0ZV9pbnRlcmZhY2UoYmF0bWFuX2lmKTsKLQkJYnJlYWs7Ci0JY2FzZSBORVRERVZfR09JTkdfRE9XTjoKLQljYXNlIE5FVERFVl9ET1dOOgotCQloYXJkaWZfZGVhY3RpdmF0ZV9pbnRlcmZhY2UoYmF0bWFuX2lmKTsKLQkJYnJlYWs7Ci0JY2FzZSBORVRERVZfVU5SRUdJU1RFUjoKLQkJc3Bpbl9sb2NrKCZpZl9saXN0X2xvY2spOwotCQlsaXN0X2RlbF9yY3UoJmJhdG1hbl9pZi0+bGlzdCk7Ci0JCXNwaW5fdW5sb2NrKCZpZl9saXN0X2xvY2spOwotCi0JCWhhcmRpZl9yZW1vdmVfaW50ZXJmYWNlKGJhdG1hbl9pZik7Ci0JCWJyZWFrOwotCWNhc2UgTkVUREVWX0NIQU5HRU1UVToKLQkJaWYgKGJhdG1hbl9pZi0+c29mdF9pZmFjZSkKLQkJCXVwZGF0ZV9taW5fbXR1KGJhdG1hbl9pZi0+c29mdF9pZmFjZSk7Ci0JCWJyZWFrOwotCWNhc2UgTkVUREVWX0NIQU5HRUFERFI6Ci0JCWlmIChiYXRtYW5faWYtPmlmX3N0YXR1cyA9PSBJRl9OT1RfSU5fVVNFKSB7Ci0JCQloYXJkaWZfcHV0KGJhdG1hbl9pZik7Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCWNoZWNrX2tub3duX21hY19hZGRyKGJhdG1hbl9pZi0+bmV0X2Rldik7Ci0JCXVwZGF0ZV9tYWNfYWRkcmVzc2VzKGJhdG1hbl9pZik7Ci0KLQkJYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihiYXRtYW5faWYtPnNvZnRfaWZhY2UpOwotCQlpZiAoYmF0bWFuX2lmID09IGJhdF9wcml2LT5wcmltYXJ5X2lmKQotCQkJdXBkYXRlX3ByaW1hcnlfYWRkcihiYXRfcHJpdik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX07Ci0JaGFyZGlmX3B1dChiYXRtYW5faWYpOwotCi1vdXQ6Ci0JcmV0dXJuIE5PVElGWV9ET05FOwotfQotCi0vKiByZWNlaXZlIGEgcGFja2V0IHdpdGggdGhlIGJhdG1hbiBldGhlcnR5cGUgY29taW5nIG9uIGEgaGFyZAotICogaW50ZXJmYWNlICovCi1pbnQgYmF0bWFuX3NrYl9yZWN2KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0Jc3RydWN0IHBhY2tldF90eXBlICpwdHlwZSwgc3RydWN0IG5ldF9kZXZpY2UgKm9yaWdfZGV2KQotewotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXY7Ci0Jc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQ7Ci0Jc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOwotCWludCByZXQ7Ci0KLQliYXRtYW5faWYgPSBjb250YWluZXJfb2YocHR5cGUsIHN0cnVjdCBiYXRtYW5faWYsIGJhdG1hbl9hZHZfcHR5cGUpOwotCXNrYiA9IHNrYl9zaGFyZV9jaGVjayhza2IsIEdGUF9BVE9NSUMpOwotCi0JLyogc2tiIHdhcyByZWxlYXNlZCBieSBza2Jfc2hhcmVfY2hlY2soKSAqLwotCWlmICghc2tiKQotCQlnb3RvIGVycl9vdXQ7Ci0KLQkvKiBwYWNrZXQgc2hvdWxkIGhvbGQgYXQgbGVhc3QgdHlwZSBhbmQgdmVyc2lvbiAqLwotCWlmICh1bmxpa2VseSghcHNrYl9tYXlfcHVsbChza2IsIDIpKSkKLQkJZ290byBlcnJfZnJlZTsKLQotCS8qIGV4cGVjdCBhIHZhbGlkIGV0aGVybmV0IGhlYWRlciBoZXJlLiAqLwotCWlmICh1bmxpa2VseShza2ItPm1hY19sZW4gIT0gc2l6ZW9mKHN0cnVjdCBldGhoZHIpCi0JCQkJfHwgIXNrYl9tYWNfaGVhZGVyKHNrYikpKQotCQlnb3RvIGVycl9mcmVlOwotCi0JaWYgKCFiYXRtYW5faWYtPnNvZnRfaWZhY2UpCi0JCWdvdG8gZXJyX2ZyZWU7Ci0KLQliYXRfcHJpdiA9IG5ldGRldl9wcml2KGJhdG1hbl9pZi0+c29mdF9pZmFjZSk7Ci0KLQlpZiAoYXRvbWljX3JlYWQoJmJhdF9wcml2LT5tZXNoX3N0YXRlKSAhPSBNRVNIX0FDVElWRSkKLQkJZ290byBlcnJfZnJlZTsKLQotCS8qIGRpc2NhcmQgZnJhbWVzIG9uIG5vdCBhY3RpdmUgaW50ZXJmYWNlcyAqLwotCWlmIChiYXRtYW5faWYtPmlmX3N0YXR1cyAhPSBJRl9BQ1RJVkUpCi0JCWdvdG8gZXJyX2ZyZWU7Ci0KLQliYXRtYW5fcGFja2V0ID0gKHN0cnVjdCBiYXRtYW5fcGFja2V0ICopc2tiLT5kYXRhOwotCi0JaWYgKGJhdG1hbl9wYWNrZXQtPnZlcnNpb24gIT0gQ09NUEFUX1ZFUlNJT04pIHsKLQkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJCSJEcm9wIHBhY2tldDogaW5jb21wYXRpYmxlIGJhdG1hbiB2ZXJzaW9uICglaSlcbiIsCi0JCQliYXRtYW5fcGFja2V0LT52ZXJzaW9uKTsKLQkJZ290byBlcnJfZnJlZTsKLQl9Ci0KLQkvKiBhbGwgcmVjZWl2ZSBoYW5kbGVycyByZXR1cm4gd2hldGhlciB0aGV5IHJlY2VpdmVkIG9yIHJldXNlZAotCSAqIHRoZSBzdXBwbGllZCBza2IuIGlmIG5vdCwgd2UgaGF2ZSB0byBmcmVlIHRoZSBza2IuICovCi0KLQlzd2l0Y2ggKGJhdG1hbl9wYWNrZXQtPnBhY2tldF90eXBlKSB7Ci0JCS8qIGJhdG1hbiBvcmlnaW5hdG9yIHBhY2tldCAqLwotCWNhc2UgQkFUX1BBQ0tFVDoKLQkJcmV0ID0gcmVjdl9iYXRfcGFja2V0KHNrYiwgYmF0bWFuX2lmKTsKLQkJYnJlYWs7Ci0KLQkJLyogYmF0bWFuIGljbXAgcGFja2V0ICovCi0JY2FzZSBCQVRfSUNNUDoKLQkJcmV0ID0gcmVjdl9pY21wX3BhY2tldChza2IsIGJhdG1hbl9pZik7Ci0JCWJyZWFrOwotCi0JCS8qIHVuaWNhc3QgcGFja2V0ICovCi0JY2FzZSBCQVRfVU5JQ0FTVDoKLQkJcmV0ID0gcmVjdl91bmljYXN0X3BhY2tldChza2IsIGJhdG1hbl9pZik7Ci0JCWJyZWFrOwotCi0JCS8qIGZyYWdtZW50ZWQgdW5pY2FzdCBwYWNrZXQgKi8KLQljYXNlIEJBVF9VTklDQVNUX0ZSQUc6Ci0JCXJldCA9IHJlY3ZfdWNhc3RfZnJhZ19wYWNrZXQoc2tiLCBiYXRtYW5faWYpOwotCQlicmVhazsKLQotCQkvKiBicm9hZGNhc3QgcGFja2V0ICovCi0JY2FzZSBCQVRfQkNBU1Q6Ci0JCXJldCA9IHJlY3ZfYmNhc3RfcGFja2V0KHNrYiwgYmF0bWFuX2lmKTsKLQkJYnJlYWs7Ci0KLQkJLyogdmlzIHBhY2tldCAqLwotCWNhc2UgQkFUX1ZJUzoKLQkJcmV0ID0gcmVjdl92aXNfcGFja2V0KHNrYiwgYmF0bWFuX2lmKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0ID0gTkVUX1JYX0RST1A7Ci0JfQotCi0JaWYgKHJldCA9PSBORVRfUlhfRFJPUCkKLQkJa2ZyZWVfc2tiKHNrYik7Ci0KLQkvKiByZXR1cm4gTkVUX1JYX1NVQ0NFU1MgaW4gYW55IGNhc2UgYXMgd2UKLQkgKiBtb3N0IHByb2JhYmx5IGRyb3BwZWQgdGhlIHBhY2tldCBmb3IKLQkgKiByb3V0aW5nLWxvZ2ljYWwgcmVhc29ucy4gKi8KLQotCXJldHVybiBORVRfUlhfU1VDQ0VTUzsKLQotZXJyX2ZyZWU6Ci0Ja2ZyZWVfc2tiKHNrYik7Ci1lcnJfb3V0OgotCXJldHVybiBORVRfUlhfRFJPUDsKLX0KLQotc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGhhcmRfaWZfbm90aWZpZXIgPSB7Ci0JLm5vdGlmaWVyX2NhbGwgPSBoYXJkX2lmX2V2ZW50LAotfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2hhcmQtaW50ZXJmYWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9oYXJkLWludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTUwODg5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2hhcmQtaW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKLSAqCi0gKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxLCBVU0EKLSAqCi0gKi8KLQotI2lmbmRlZiBfTkVUX0JBVE1BTl9BRFZfSEFSRF9JTlRFUkZBQ0VfSF8KLSNkZWZpbmUgX05FVF9CQVRNQU5fQURWX0hBUkRfSU5URVJGQUNFX0hfCi0KLSNkZWZpbmUgSUZfTk9UX0lOX1VTRSAwCi0jZGVmaW5lIElGX1RPX0JFX1JFTU9WRUQgMQotI2RlZmluZSBJRl9JTkFDVElWRSAyCi0jZGVmaW5lIElGX0FDVElWRSAzCi0jZGVmaW5lIElGX1RPX0JFX0FDVElWQVRFRCA0Ci0jZGVmaW5lIElGX0lfV0FOVF9ZT1UgNQotCi1leHRlcm4gc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGhhcmRfaWZfbm90aWZpZXI7Ci0KLXN0cnVjdCBiYXRtYW5faWYgKmdldF9iYXRtYW5faWZfYnlfbmV0ZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKLWludCBoYXJkaWZfZW5hYmxlX2ludGVyZmFjZShzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYsIGNoYXIgKmlmYWNlX25hbWUpOwotdm9pZCBoYXJkaWZfZGlzYWJsZV9pbnRlcmZhY2Uoc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmKTsKLXZvaWQgaGFyZGlmX3JlbW92ZV9pbnRlcmZhY2VzKHZvaWQpOwotaW50IGJhdG1hbl9za2JfcmVjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJc3RydWN0IHBhY2tldF90eXBlICpwdHlwZSwKLQkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqb3JpZ19kZXYpOwotaW50IGhhcmRpZl9taW5fbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlKTsKLXZvaWQgdXBkYXRlX21pbl9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRfaWZhY2UpOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgaGFyZGlmX2hvbGQoc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmKQotewotCWF0b21pY19pbmMoJmJhdG1hbl9pZi0+cmVmY250KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGhhcmRpZl9wdXQoc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmKQotewotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZiYXRtYW5faWYtPnJlZmNudCkpIHsKLQkJZGV2X3B1dChiYXRtYW5faWYtPm5ldF9kZXYpOwotCQlrZnJlZShiYXRtYW5faWYpOwotCX0KLX0KLQotI2VuZGlmIC8qIF9ORVRfQkFUTUFOX0FEVl9IQVJEX0lOVEVSRkFDRV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvaGFzaC5jIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvaGFzaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWYyNmViLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2hhc2guYworKysgL2Rldi9udWxsCkBAIC0xLDMwNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMTAgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKLSAqCi0gKiBTaW1vbiBXdW5kZXJsaWNoLCBNYXJlayBMaW5kbmVyCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxLCBVU0EKLSAqCi0gKi8KLQotI2luY2x1ZGUgIm1haW4uaCIKLSNpbmNsdWRlICJoYXNoLmgiCi0KLS8qIGNsZWFycyB0aGUgaGFzaCAqLwotc3RhdGljIHZvaWQgaGFzaF9pbml0KHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCkKLXsKLQlpbnQgaTsKLQotCWhhc2gtPmVsZW1lbnRzID0gMDsKLQotCWZvciAoaSA9IDAgOyBpIDwgaGFzaC0+c2l6ZTsgaSsrKQotCQloYXNoLT50YWJsZVtpXSA9IE5VTEw7Ci19Ci0KLS8qIHJlbW92ZSB0aGUgaGFzaCBzdHJ1Y3R1cmUuIGlmIGhhc2hkYXRhX2ZyZWVfY2IgIT0gTlVMTCwgdGhpcyBmdW5jdGlvbiB3aWxsIGJlCi0gKiBjYWxsZWQgdG8gcmVtb3ZlIHRoZSBlbGVtZW50cyBpbnNpZGUgb2YgdGhlIGhhc2guICBpZiB5b3UgZG9uJ3QgcmVtb3ZlIHRoZQotICogZWxlbWVudHMsIG1lbW9yeSBtaWdodCBiZSBsZWFrZWQuICovCi12b2lkIGhhc2hfZGVsZXRlKHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCwgaGFzaGRhdGFfZnJlZV9jYiBmcmVlX2NiLCB2b2lkICphcmcpCi17Ci0Jc3RydWN0IGVsZW1lbnRfdCAqYnVja2V0LCAqbGFzdF9idWNrZXQ7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgaGFzaC0+c2l6ZTsgaSsrKSB7Ci0JCWJ1Y2tldCA9IGhhc2gtPnRhYmxlW2ldOwotCi0JCXdoaWxlIChidWNrZXQgIT0gTlVMTCkgewotCQkJaWYgKGZyZWVfY2IgIT0gTlVMTCkKLQkJCQlmcmVlX2NiKGJ1Y2tldC0+ZGF0YSwgYXJnKTsKLQotCQkJbGFzdF9idWNrZXQgPSBidWNrZXQ7Ci0JCQlidWNrZXQgPSBidWNrZXQtPm5leHQ7Ci0JCQlrZnJlZShsYXN0X2J1Y2tldCk7Ci0JCX0KLQl9Ci0KLQloYXNoX2Rlc3Ryb3koaGFzaCk7Ci19Ci0KLS8qIGZyZWUgb25seSB0aGUgaGFzaHRhYmxlIGFuZCB0aGUgaGFzaCBpdHNlbGYuICovCi12b2lkIGhhc2hfZGVzdHJveShzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2gpCi17Ci0Ja2ZyZWUoaGFzaC0+dGFibGUpOwotCWtmcmVlKGhhc2gpOwotfQotCi0vKiBpdGVyYXRlIHRob3VnaCB0aGUgaGFzaC4gRmlyc3QgZWxlbWVudCBpcyBzZWxlY3RlZCBpZiBhbiBpdGVyYXRvcgotICogaW5pdGlhbGl6ZWQgd2l0aCBIQVNISVQoKSBpcyBzdXBwbGllZCBhcyBpdGVyLiBVc2UgdGhlIHJldHVybmVkCi0gKiAob3Igc3VwcGxpZWQpIGl0ZXJhdG9yIHRvIGFjY2VzcyB0aGUgZWxlbWVudHMgdW50aWwgaGFzaF9pdGVyYXRlIHJldHVybnMKLSAqIE5VTEwuICovCi0KLXN0cnVjdCBoYXNoX2l0X3QgKmhhc2hfaXRlcmF0ZShzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2gsCi0JCQkgICAgICAgc3RydWN0IGhhc2hfaXRfdCAqaXRlcikKLXsKLQlpZiAoIWhhc2gpCi0JCXJldHVybiBOVUxMOwotCWlmICghaXRlcikKLQkJcmV0dXJuIE5VTEw7Ci0KLQkvKiBzYW5pdHkgY2hlY2tzIGZpcnN0IChpZiBvdXIgYnVja2V0IGdvdCBkZWxldGVkIGluIHRoZSBsYXN0Ci0JICogaXRlcmF0aW9uKTogKi8KLQlpZiAoaXRlci0+YnVja2V0ICE9IE5VTEwpIHsKLQkJaWYgKGl0ZXItPmZpcnN0X2J1Y2tldCAhPSBOVUxMKSB7Ci0JCQkvKiB3ZSdyZSBvbiB0aGUgZmlyc3QgZWxlbWVudCBhbmQgaXQgZ290IHJlbW92ZWQgYWZ0ZXIKLQkJCSAqIHRoZSBsYXN0IGl0ZXJhdGlvbi4gKi8KLQkJCWlmICgoKml0ZXItPmZpcnN0X2J1Y2tldCkgIT0gaXRlci0+YnVja2V0KSB7Ci0JCQkJLyogdGhlcmUgYXJlIHN0aWxsIG90aGVyIGVsZW1lbnRzIGluIHRoZSBsaXN0ICovCi0JCQkJaWYgKCgqaXRlci0+Zmlyc3RfYnVja2V0KSAhPSBOVUxMKSB7Ci0JCQkJCWl0ZXItPnByZXZfYnVja2V0ID0gTlVMTDsKLQkJCQkJaXRlci0+YnVja2V0ID0gKCppdGVyLT5maXJzdF9idWNrZXQpOwotCQkJCQlpdGVyLT5maXJzdF9idWNrZXQgPQotCQkJCQkJJmhhc2gtPnRhYmxlW2l0ZXItPmluZGV4XTsKLQkJCQkJcmV0dXJuIGl0ZXI7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaXRlci0+YnVja2V0ID0gTlVMTDsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoaXRlci0+cHJldl9idWNrZXQgIT0gTlVMTCkgewotCQkJLyoKLQkJCSogd2UncmUgbm90IG9uIHRoZSBmaXJzdCBlbGVtZW50LCBhbmQgdGhlIGJ1Y2tldCBnb3QKLQkJCSogcmVtb3ZlZCBhZnRlciB0aGUgbGFzdCBpdGVyYXRpb24uICB0aGUgbGFzdCBidWNrZXQncwotCQkJKiBuZXh0IHBvaW50ZXIgaXMgbm90IHBvaW50aW5nIHRvIG91ciBhY3R1YWwgYnVja2V0Ci0JCQkqIGFueW1vcmUuICBzZWxlY3QgdGhlIG5leHQuCi0JCQkqLwotCQkJaWYgKGl0ZXItPnByZXZfYnVja2V0LT5uZXh0ICE9IGl0ZXItPmJ1Y2tldCkKLQkJCQlpdGVyLT5idWNrZXQgPSBpdGVyLT5wcmV2X2J1Y2tldDsKLQkJfQotCX0KLQotCS8qIG5vdyBhcyB3ZSBhcmUgc2FuZSwgc2VsZWN0IHRoZSBuZXh0IG9uZSBpZiB0aGVyZSBpcyBzb21lICovCi0JaWYgKGl0ZXItPmJ1Y2tldCAhPSBOVUxMKSB7Ci0JCWlmIChpdGVyLT5idWNrZXQtPm5leHQgIT0gTlVMTCkgewotCQkJaXRlci0+cHJldl9idWNrZXQgPSBpdGVyLT5idWNrZXQ7Ci0JCQlpdGVyLT5idWNrZXQgPSBpdGVyLT5idWNrZXQtPm5leHQ7Ci0JCQlpdGVyLT5maXJzdF9idWNrZXQgPSBOVUxMOwotCQkJcmV0dXJuIGl0ZXI7Ci0JCX0KLQl9Ci0KLQkvKiBpZiBub3QgcmV0dXJuZWQgeWV0LCB3ZSd2ZSByZWFjaGVkIHRoZSBsYXN0IG9uZSBvbiB0aGUgaW5kZXggYW5kIGhhdmUKLQkgKiB0byBzZWFyY2ggZm9yd2FyZCAqLwotCWl0ZXItPmluZGV4Kys7Ci0JLyogZ28gdGhyb3VnaCB0aGUgZW50cmllcyBvZiB0aGUgaGFzaCB0YWJsZSAqLwotCXdoaWxlIChpdGVyLT5pbmRleCA8IGhhc2gtPnNpemUpIHsKLQkJaWYgKChoYXNoLT50YWJsZVtpdGVyLT5pbmRleF0pICE9IE5VTEwpIHsKLQkJCWl0ZXItPnByZXZfYnVja2V0ID0gTlVMTDsKLQkJCWl0ZXItPmJ1Y2tldCA9IGhhc2gtPnRhYmxlW2l0ZXItPmluZGV4XTsKLQkJCWl0ZXItPmZpcnN0X2J1Y2tldCA9ICZoYXNoLT50YWJsZVtpdGVyLT5pbmRleF07Ci0JCQlyZXR1cm4gaXRlcjsKLQkJfSBlbHNlIHsKLQkJCWl0ZXItPmluZGV4Kys7Ci0JCX0KLQl9Ci0KLQkvKiBub3RoaW5nIHRvIGl0ZXJhdGUgb3ZlciBhbnltb3JlICovCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIGFsbG9jYXRlcyBhbmQgY2xlYXJzIHRoZSBoYXNoICovCi1zdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2hfbmV3KGludCBzaXplLCBoYXNoZGF0YV9jb21wYXJlX2NiIGNvbXBhcmUsCi0JCQkgICAgIGhhc2hkYXRhX2Nob29zZV9jYiBjaG9vc2UpCi17Ci0Jc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoOwotCi0JaGFzaCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBoYXNodGFibGVfdCkgLCBHRlBfQVRPTUlDKTsKLQotCWlmIChoYXNoID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0JaGFzaC0+c2l6ZSA9IHNpemU7Ci0JaGFzaC0+dGFibGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZWxlbWVudF90ICopICogc2l6ZSwgR0ZQX0FUT01JQyk7Ci0KLQlpZiAoaGFzaC0+dGFibGUgPT0gTlVMTCkgewotCQlrZnJlZShoYXNoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JaGFzaF9pbml0KGhhc2gpOwotCi0JaGFzaC0+Y29tcGFyZSA9IGNvbXBhcmU7Ci0JaGFzaC0+Y2hvb3NlID0gY2hvb3NlOwotCi0JcmV0dXJuIGhhc2g7Ci19Ci0KLS8qIGFkZHMgZGF0YSB0byB0aGUgaGFzaHRhYmxlLiByZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IgKi8KLWludCBoYXNoX2FkZChzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2gsIHZvaWQgKmRhdGEpCi17Ci0JaW50IGluZGV4OwotCXN0cnVjdCBlbGVtZW50X3QgKmJ1Y2tldCwgKnByZXZfYnVja2V0ID0gTlVMTDsKLQotCWlmICghaGFzaCkKLQkJcmV0dXJuIC0xOwotCi0JaW5kZXggPSBoYXNoLT5jaG9vc2UoZGF0YSwgaGFzaC0+c2l6ZSk7Ci0JYnVja2V0ID0gaGFzaC0+dGFibGVbaW5kZXhdOwotCi0Jd2hpbGUgKGJ1Y2tldCAhPSBOVUxMKSB7Ci0JCWlmIChoYXNoLT5jb21wYXJlKGJ1Y2tldC0+ZGF0YSwgZGF0YSkpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJcHJldl9idWNrZXQgPSBidWNrZXQ7Ci0JCWJ1Y2tldCA9IGJ1Y2tldC0+bmV4dDsKLQl9Ci0KLQkvKiBmb3VuZCB0aGUgdGFpbCBvZiB0aGUgbGlzdCwgYWRkIG5ldyBlbGVtZW50ICovCi0JYnVja2V0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGVsZW1lbnRfdCksIEdGUF9BVE9NSUMpOwotCi0JaWYgKGJ1Y2tldCA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0KLQlidWNrZXQtPmRhdGEgPSBkYXRhOwotCWJ1Y2tldC0+bmV4dCA9IE5VTEw7Ci0KLQkvKiBhbmQgbGluayBpdCAqLwotCWlmIChwcmV2X2J1Y2tldCA9PSBOVUxMKQotCQloYXNoLT50YWJsZVtpbmRleF0gPSBidWNrZXQ7Ci0JZWxzZQotCQlwcmV2X2J1Y2tldC0+bmV4dCA9IGJ1Y2tldDsKLQotCWhhc2gtPmVsZW1lbnRzKys7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIGZpbmRzIGRhdGEsIGJhc2VkIG9uIHRoZSBrZXkgaW4ga2V5ZGF0YS4gcmV0dXJucyB0aGUgZm91bmQgZGF0YSBvbiBzdWNjZXNzLAotICogb3IgTlVMTCBvbiBlcnJvciAqLwotdm9pZCAqaGFzaF9maW5kKHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCwgdm9pZCAqa2V5ZGF0YSkKLXsKLQlpbnQgaW5kZXg7Ci0Jc3RydWN0IGVsZW1lbnRfdCAqYnVja2V0OwotCi0JaWYgKCFoYXNoKQotCQlyZXR1cm4gTlVMTDsKLQotCWluZGV4ID0gaGFzaC0+Y2hvb3NlKGtleWRhdGEgLCBoYXNoLT5zaXplKTsKLQlidWNrZXQgPSBoYXNoLT50YWJsZVtpbmRleF07Ci0KLQl3aGlsZSAoYnVja2V0ICE9IE5VTEwpIHsKLQkJaWYgKGhhc2gtPmNvbXBhcmUoYnVja2V0LT5kYXRhLCBrZXlkYXRhKSkKLQkJCXJldHVybiBidWNrZXQtPmRhdGE7Ci0KLQkJYnVja2V0ID0gYnVja2V0LT5uZXh0OwotCX0KLQotCXJldHVybiBOVUxMOwotfQotCi0vKiByZW1vdmUgYnVja2V0ICh0aGlzIG1pZ2h0IGJlIHVzZWQgaW4gaGFzaF9pdGVyYXRlKCkgaWYgeW91IGFscmVhZHkgZm91bmQgdGhlCi0gKiBidWNrZXQgeW91IHdhbnQgdG8gZGVsZXRlIGFuZCBkb24ndCBuZWVkIHRoZSBvdmVyaGVhZCB0byBmaW5kIGl0IGFnYWluIHdpdGgKLSAqIGhhc2hfcmVtb3ZlKCkuIEJ1dCB1c3VhbGx5LCB5b3UgZG9uJ3Qgd2FudCB0byB1c2UgdGhpcyBmdW5jdGlvbiwgYXMgaXQKLSAqIGZpZGRsZXMgd2l0aCBoYXNoLWludGVybmFscy4gKi8KLXZvaWQgKmhhc2hfcmVtb3ZlX2J1Y2tldChzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2gsIHN0cnVjdCBoYXNoX2l0X3QgKmhhc2hfaXRfdCkKLXsKLQl2b2lkICpkYXRhX3NhdmU7Ci0KLQlkYXRhX3NhdmUgPSBoYXNoX2l0X3QtPmJ1Y2tldC0+ZGF0YTsKLQotCWlmIChoYXNoX2l0X3QtPnByZXZfYnVja2V0ICE9IE5VTEwpCi0JCWhhc2hfaXRfdC0+cHJldl9idWNrZXQtPm5leHQgPSBoYXNoX2l0X3QtPmJ1Y2tldC0+bmV4dDsKLQllbHNlIGlmIChoYXNoX2l0X3QtPmZpcnN0X2J1Y2tldCAhPSBOVUxMKQotCQkoKmhhc2hfaXRfdC0+Zmlyc3RfYnVja2V0KSA9IGhhc2hfaXRfdC0+YnVja2V0LT5uZXh0OwotCi0Ja2ZyZWUoaGFzaF9pdF90LT5idWNrZXQpOwotCWhhc2gtPmVsZW1lbnRzLS07Ci0KLQlyZXR1cm4gZGF0YV9zYXZlOwotfQotCi0vKiByZW1vdmVzIGRhdGEgZnJvbSBoYXNoLCBpZiBmb3VuZC4gcmV0dXJucyBwb2ludGVyIGRvIGRhdGEgb24gc3VjY2Vzcywgc28geW91Ci0gKiBjYW4gcmVtb3ZlIHRoZSB1c2VkIHN0cnVjdHVyZSB5b3Vyc2VsZiwgb3IgTlVMTCBvbiBlcnJvciAuICBkYXRhIGNvdWxkIGJlIHRoZQotICogc3RydWN0dXJlIHlvdSB1c2Ugd2l0aCBqdXN0IHRoZSBrZXkgZmlsbGVkLCB3ZSBqdXN0IG5lZWQgdGhlIGtleSBmb3IKLSAqIGNvbXBhcmluZy4gKi8KLXZvaWQgKmhhc2hfcmVtb3ZlKHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgaGFzaF9pdF90IGhhc2hfaXRfdDsKLQotCWhhc2hfaXRfdC5pbmRleCA9IGhhc2gtPmNob29zZShkYXRhLCBoYXNoLT5zaXplKTsKLQloYXNoX2l0X3QuYnVja2V0ID0gaGFzaC0+dGFibGVbaGFzaF9pdF90LmluZGV4XTsKLQloYXNoX2l0X3QucHJldl9idWNrZXQgPSBOVUxMOwotCi0Jd2hpbGUgKGhhc2hfaXRfdC5idWNrZXQgIT0gTlVMTCkgewotCQlpZiAoaGFzaC0+Y29tcGFyZShoYXNoX2l0X3QuYnVja2V0LT5kYXRhLCBkYXRhKSkgewotCQkJaGFzaF9pdF90LmZpcnN0X2J1Y2tldCA9Ci0JCQkJKGhhc2hfaXRfdC5idWNrZXQgPT0KLQkJCQkgaGFzaC0+dGFibGVbaGFzaF9pdF90LmluZGV4XSA/Ci0JCQkJICZoYXNoLT50YWJsZVtoYXNoX2l0X3QuaW5kZXhdIDogTlVMTCk7Ci0JCQlyZXR1cm4gaGFzaF9yZW1vdmVfYnVja2V0KGhhc2gsICZoYXNoX2l0X3QpOwotCQl9Ci0KLQkJaGFzaF9pdF90LnByZXZfYnVja2V0ID0gaGFzaF9pdF90LmJ1Y2tldDsKLQkJaGFzaF9pdF90LmJ1Y2tldCA9IGhhc2hfaXRfdC5idWNrZXQtPm5leHQ7Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIHJlc2l6ZSB0aGUgaGFzaCwgcmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgbmV3IGhhc2ggb3IgTlVMTCBvbgotICogZXJyb3IuIHJlbW92ZXMgdGhlIG9sZCBoYXNoIG9uIHN1Y2Nlc3MuICovCi1zdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2hfcmVzaXplKHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCwgaW50IHNpemUpCi17Ci0Jc3RydWN0IGhhc2h0YWJsZV90ICpuZXdfaGFzaDsKLQlzdHJ1Y3QgZWxlbWVudF90ICpidWNrZXQ7Ci0JaW50IGk7Ci0KLQkvKiBpbml0aWFsaXplIGEgbmV3IGhhc2ggd2l0aCB0aGUgbmV3IHNpemUgKi8KLQluZXdfaGFzaCA9IGhhc2hfbmV3KHNpemUsIGhhc2gtPmNvbXBhcmUsIGhhc2gtPmNob29zZSk7Ci0KLQlpZiAobmV3X2hhc2ggPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQkvKiBjb3B5IHRoZSBlbGVtZW50cyAqLwotCWZvciAoaSA9IDA7IGkgPCBoYXNoLT5zaXplOyBpKyspIHsKLQkJYnVja2V0ID0gaGFzaC0+dGFibGVbaV07Ci0KLQkJd2hpbGUgKGJ1Y2tldCAhPSBOVUxMKSB7Ci0JCQloYXNoX2FkZChuZXdfaGFzaCwgYnVja2V0LT5kYXRhKTsKLQkJCWJ1Y2tldCA9IGJ1Y2tldC0+bmV4dDsKLQkJfQotCX0KLQotCS8qIHJlbW92ZSBoYXNoIGFuZCBldmVudHVhbCBvdmVyZmxvdyBidWNrZXRzIGJ1dCBub3QgdGhlIGNvbnRlbnQKLQkgKiBpdHNlbGYuICovCi0JaGFzaF9kZWxldGUoaGFzaCwgTlVMTCwgTlVMTCk7Ci0KLQlyZXR1cm4gbmV3X2hhc2g7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9oYXNoLmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9oYXNoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjOGUxNzYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvaGFzaC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgotICoKLSAqIFNpbW9uIFd1bmRlcmxpY2gsIE1hcmVrIExpbmRuZXIKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVTQQotICoKLSAqLwotCi0jaWZuZGVmIF9ORVRfQkFUTUFOX0FEVl9IQVNIX0hfCi0jZGVmaW5lIF9ORVRfQkFUTUFOX0FEVl9IQVNIX0hfCi0KLSNkZWZpbmUgSEFTSElUKG5hbWUpIHN0cnVjdCBoYXNoX2l0X3QgbmFtZSA9IHsgXAotCQkuaW5kZXggPSAtMSwgLmJ1Y2tldCA9IE5VTEwsIFwKLQkJLnByZXZfYnVja2V0ID0gTlVMTCwgXAotCQkuZmlyc3RfYnVja2V0ID0gTlVMTCB9Ci0KLQotdHlwZWRlZiBpbnQgKCpoYXNoZGF0YV9jb21wYXJlX2NiKSh2b2lkICosIHZvaWQgKik7Ci10eXBlZGVmIGludCAoKmhhc2hkYXRhX2Nob29zZV9jYikodm9pZCAqLCBpbnQpOwotdHlwZWRlZiB2b2lkICgqaGFzaGRhdGFfZnJlZV9jYikodm9pZCAqLCB2b2lkICopOwotCi1zdHJ1Y3QgZWxlbWVudF90IHsKLQl2b2lkICpkYXRhOwkJLyogcG9pbnRlciB0byB0aGUgZGF0YSAqLwotCXN0cnVjdCBlbGVtZW50X3QgKm5leHQ7CS8qIG92ZXJmbG93IGJ1Y2tldCBwb2ludGVyICovCi19OwotCi1zdHJ1Y3QgaGFzaF9pdF90IHsKLQlpbnQgaW5kZXg7Ci0Jc3RydWN0IGVsZW1lbnRfdCAqYnVja2V0OwotCXN0cnVjdCBlbGVtZW50X3QgKnByZXZfYnVja2V0OwotCXN0cnVjdCBlbGVtZW50X3QgKipmaXJzdF9idWNrZXQ7Ci19OwotCi1zdHJ1Y3QgaGFzaHRhYmxlX3QgewotCXN0cnVjdCBlbGVtZW50X3QgKip0YWJsZTsgICAvKiB0aGUgaGFzaHRhYmxlIGl0c2VsZiwgd2l0aCB0aGUgYnVja2V0cyAqLwotCWludCBlbGVtZW50czsJCSAgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgcmVnaXN0ZXJlZCAqLwotCWludCBzaXplOwkJICAgIC8qIHNpemUgb2YgaGFzaHRhYmxlICovCi0JaGFzaGRhdGFfY29tcGFyZV9jYiBjb21wYXJlOy8qIGNhbGxiYWNrIHRvIGEgY29tcGFyZSBmdW5jdGlvbi4gIHNob3VsZAotCQkJCSAgICAgKiBjb21wYXJlIDIgZWxlbWVudCBkYXRhcyBmb3IgdGhlaXIga2V5cywKLQkJCQkgICAgICogcmV0dXJuIDAgaWYgc2FtZSBhbmQgbm90IDAgaWYgbm90Ci0JCQkJICAgICAqIHNhbWUgKi8KLQloYXNoZGF0YV9jaG9vc2VfY2IgY2hvb3NlOyAgLyogdGhlIGhhc2hmdW5jdGlvbiwgc2hvdWxkIHJldHVybiBhbiBpbmRleAotCQkJCSAgICAgKiBiYXNlZCBvbiB0aGUga2V5IGluIHRoZSBkYXRhIG9mIHRoZSBmaXJzdAotCQkJCSAgICAgKiBhcmd1bWVudCBhbmQgdGhlIHNpemUgdGhlIHNlY29uZCAqLwotfTsKLQotLyogYWxsb2NhdGVzIGFuZCBjbGVhcnMgdGhlIGhhc2ggKi8KLXN0cnVjdCBoYXNodGFibGVfdCAqaGFzaF9uZXcoaW50IHNpemUsIGhhc2hkYXRhX2NvbXBhcmVfY2IgY29tcGFyZSwKLQkJCSAgICAgaGFzaGRhdGFfY2hvb3NlX2NiIGNob29zZSk7Ci0KLS8qIHJlbW92ZSBidWNrZXQgKHRoaXMgbWlnaHQgYmUgdXNlZCBpbiBoYXNoX2l0ZXJhdGUoKSBpZiB5b3UgYWxyZWFkeSBmb3VuZCB0aGUKLSAqIGJ1Y2tldCB5b3Ugd2FudCB0byBkZWxldGUgYW5kIGRvbid0IG5lZWQgdGhlIG92ZXJoZWFkIHRvIGZpbmQgaXQgYWdhaW4gd2l0aAotICogaGFzaF9yZW1vdmUoKS4gIEJ1dCB1c3VhbGx5LCB5b3UgZG9uJ3Qgd2FudCB0byB1c2UgdGhpcyBmdW5jdGlvbiwgYXMgaXQKLSAqIGZpZGRsZXMgd2l0aCBoYXNoLWludGVybmFscy4gKi8KLXZvaWQgKmhhc2hfcmVtb3ZlX2J1Y2tldChzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2gsIHN0cnVjdCBoYXNoX2l0X3QgKmhhc2hfaXRfdCk7Ci0KLS8qIHJlbW92ZSB0aGUgaGFzaCBzdHJ1Y3R1cmUuIGlmIGhhc2hkYXRhX2ZyZWVfY2IgIT0gTlVMTCwgdGhpcyBmdW5jdGlvbiB3aWxsIGJlCi0gKiBjYWxsZWQgdG8gcmVtb3ZlIHRoZSBlbGVtZW50cyBpbnNpZGUgb2YgdGhlIGhhc2guICBpZiB5b3UgZG9uJ3QgcmVtb3ZlIHRoZQotICogZWxlbWVudHMsIG1lbW9yeSBtaWdodCBiZSBsZWFrZWQuICovCi12b2lkIGhhc2hfZGVsZXRlKHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCwgaGFzaGRhdGFfZnJlZV9jYiBmcmVlX2NiLCB2b2lkICphcmcpOwotCi0vKiBmcmVlIG9ubHkgdGhlIGhhc2h0YWJsZSBhbmQgdGhlIGhhc2ggaXRzZWxmLiAqLwotdm9pZCBoYXNoX2Rlc3Ryb3koc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoKTsKLQotLyogYWRkcyBkYXRhIHRvIHRoZSBoYXNodGFibGUuIHJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvciAqLwotaW50IGhhc2hfYWRkKHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCwgdm9pZCAqZGF0YSk7Ci0KLS8qIHJlbW92ZXMgZGF0YSBmcm9tIGhhc2gsIGlmIGZvdW5kLiByZXR1cm5zIHBvaW50ZXIgZG8gZGF0YSBvbiBzdWNjZXNzLCBzbyB5b3UKLSAqIGNhbiByZW1vdmUgdGhlIHVzZWQgc3RydWN0dXJlIHlvdXJzZWxmLCBvciBOVUxMIG9uIGVycm9yIC4gIGRhdGEgY291bGQgYmUgdGhlCi0gKiBzdHJ1Y3R1cmUgeW91IHVzZSB3aXRoIGp1c3QgdGhlIGtleSBmaWxsZWQsIHdlIGp1c3QgbmVlZCB0aGUga2V5IGZvcgotICogY29tcGFyaW5nLiAqLwotdm9pZCAqaGFzaF9yZW1vdmUoc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoLCB2b2lkICpkYXRhKTsKLQotLyogZmluZHMgZGF0YSwgYmFzZWQgb24gdGhlIGtleSBpbiBrZXlkYXRhLiByZXR1cm5zIHRoZSBmb3VuZCBkYXRhIG9uIHN1Y2Nlc3MsCi0gKiBvciBOVUxMIG9uIGVycm9yICovCi12b2lkICpoYXNoX2ZpbmQoc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoLCB2b2lkICprZXlkYXRhKTsKLQotLyogcmVzaXplIHRoZSBoYXNoLCByZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBuZXcgaGFzaCBvciBOVUxMIG9uCi0gKiBlcnJvci4gcmVtb3ZlcyB0aGUgb2xkIGhhc2ggb24gc3VjY2VzcyAqLwotc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoX3Jlc2l6ZShzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2gsIGludCBzaXplKTsKLQotLyogaXRlcmF0ZSB0aG91Z2ggdGhlIGhhc2guIGZpcnN0IGVsZW1lbnQgaXMgc2VsZWN0ZWQgd2l0aCBpdGVyX2luIE5VTEwuICB1c2UKLSAqIHRoZSByZXR1cm5lZCBpdGVyYXRvciB0byBhY2Nlc3MgdGhlIGVsZW1lbnRzIHVudGlsIGhhc2hfaXRfdCByZXR1cm5zIE5VTEwuICovCi1zdHJ1Y3QgaGFzaF9pdF90ICpoYXNoX2l0ZXJhdGUoc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoLAotCQkJICAgICAgIHN0cnVjdCBoYXNoX2l0X3QgKml0ZXJfaW4pOwotCi0jZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX0hBU0hfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2ljbXBfc29ja2V0LmMgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9pY21wX3NvY2tldC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODg1NmNhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2ljbXBfc29ja2V0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6Ci0gKgotICogTWFyZWsgTGluZG5lcgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotICogMDIxMTAtMTMwMSwgVVNBCi0gKgotICovCi0KLSNpbmNsdWRlICJtYWluLmgiCi0jaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlICJpY21wX3NvY2tldC5oIgotI2luY2x1ZGUgInNlbmQuaCIKLSNpbmNsdWRlICJ0eXBlcy5oIgotI2luY2x1ZGUgImhhc2guaCIKLSNpbmNsdWRlICJoYXJkLWludGVyZmFjZS5oIgotCi0KLXN0YXRpYyBzdHJ1Y3Qgc29ja2V0X2NsaWVudCAqc29ja2V0X2NsaWVudF9oYXNoWzI1Nl07Ci0KLXN0YXRpYyB2b2lkIGJhdF9zb2NrZXRfYWRkX3BhY2tldChzdHJ1Y3Qgc29ja2V0X2NsaWVudCAqc29ja2V0X2NsaWVudCwKLQkJCQkgIHN0cnVjdCBpY21wX3BhY2tldF9yciAqaWNtcF9wYWNrZXQsCi0JCQkJICBzaXplX3QgaWNtcF9sZW4pOwotCi12b2lkIGJhdF9zb2NrZXRfaW5pdCh2b2lkKQotewotCW1lbXNldChzb2NrZXRfY2xpZW50X2hhc2gsIDAsIHNpemVvZihzb2NrZXRfY2xpZW50X2hhc2gpKTsKLX0KLQotc3RhdGljIGludCBiYXRfc29ja2V0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0Jc3RydWN0IHNvY2tldF9jbGllbnQgKnNvY2tldF9jbGllbnQ7Ci0KLQlub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKLQotCXNvY2tldF9jbGllbnQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc29ja2V0X2NsaWVudCksIEdGUF9LRVJORUwpOwotCi0JaWYgKCFzb2NrZXRfY2xpZW50KQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNvY2tldF9jbGllbnRfaGFzaCk7IGkrKykgewotCQlpZiAoIXNvY2tldF9jbGllbnRfaGFzaFtpXSkgewotCQkJc29ja2V0X2NsaWVudF9oYXNoW2ldID0gc29ja2V0X2NsaWVudDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKGkgPT0gQVJSQVlfU0laRShzb2NrZXRfY2xpZW50X2hhc2gpKSB7Ci0JCXByX2VycigiRXJyb3IgLSBjYW4ndCBhZGQgYW5vdGhlciBwYWNrZXQgY2xpZW50OiAiCi0JCSAgICAgICAibWF4aW11bSBudW1iZXIgb2YgY2xpZW50cyByZWFjaGVkXG4iKTsKLQkJa2ZyZWUoc29ja2V0X2NsaWVudCk7Ci0JCXJldHVybiAtRVhGVUxMOwotCX0KLQotCUlOSVRfTElTVF9IRUFEKCZzb2NrZXRfY2xpZW50LT5xdWV1ZV9saXN0KTsKLQlzb2NrZXRfY2xpZW50LT5xdWV1ZV9sZW4gPSAwOwotCXNvY2tldF9jbGllbnQtPmluZGV4ID0gaTsKLQlzb2NrZXRfY2xpZW50LT5iYXRfcHJpdiA9IGlub2RlLT5pX3ByaXZhdGU7Ci0Jc3Bpbl9sb2NrX2luaXQoJnNvY2tldF9jbGllbnQtPmxvY2spOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNvY2tldF9jbGllbnQtPnF1ZXVlX3dhaXQpOwotCi0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gc29ja2V0X2NsaWVudDsKLQotCWluY19tb2R1bGVfY291bnQoKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBiYXRfc29ja2V0X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHNvY2tldF9jbGllbnQgKnNvY2tldF9jbGllbnQgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNvY2tldF9wYWNrZXQgKnNvY2tldF9wYWNrZXQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGlzdF9wb3MsICpsaXN0X3Bvc190bXA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZzb2NrZXRfY2xpZW50LT5sb2NrLCBmbGFncyk7Ci0KLQkvKiBmb3IgYWxsIHBhY2tldHMgaW4gdGhlIHF1ZXVlIC4uLiAqLwotCWxpc3RfZm9yX2VhY2hfc2FmZShsaXN0X3BvcywgbGlzdF9wb3NfdG1wLCAmc29ja2V0X2NsaWVudC0+cXVldWVfbGlzdCkgewotCQlzb2NrZXRfcGFja2V0ID0gbGlzdF9lbnRyeShsaXN0X3BvcywKLQkJCQkJICAgc3RydWN0IHNvY2tldF9wYWNrZXQsIGxpc3QpOwotCi0JCWxpc3RfZGVsKGxpc3RfcG9zKTsKLQkJa2ZyZWUoc29ja2V0X3BhY2tldCk7Ci0JfQotCi0Jc29ja2V0X2NsaWVudF9oYXNoW3NvY2tldF9jbGllbnQtPmluZGV4XSA9IE5VTEw7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc29ja2V0X2NsaWVudC0+bG9jaywgZmxhZ3MpOwotCi0Ja2ZyZWUoc29ja2V0X2NsaWVudCk7Ci0JZGVjX21vZHVsZV9jb3VudCgpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGJhdF9zb2NrZXRfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3Qgc29ja2V0X2NsaWVudCAqc29ja2V0X2NsaWVudCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc29ja2V0X3BhY2tldCAqc29ja2V0X3BhY2tldDsKLQlzaXplX3QgcGFja2V0X2xlbjsKLQlpbnQgZXJyb3I7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICgoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spICYmIChzb2NrZXRfY2xpZW50LT5xdWV1ZV9sZW4gPT0gMCkpCi0JCXJldHVybiAtRUFHQUlOOwotCi0JaWYgKCghYnVmKSB8fCAoY291bnQgPCBzaXplb2Yoc3RydWN0IGljbXBfcGFja2V0KSkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWYsIGNvdW50KSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQllcnJvciA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShzb2NrZXRfY2xpZW50LT5xdWV1ZV93YWl0LAotCQkJCQkgc29ja2V0X2NsaWVudC0+cXVldWVfbGVuKTsKLQotCWlmIChlcnJvcikKLQkJcmV0dXJuIGVycm9yOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNvY2tldF9jbGllbnQtPmxvY2ssIGZsYWdzKTsKLQotCXNvY2tldF9wYWNrZXQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZzb2NrZXRfY2xpZW50LT5xdWV1ZV9saXN0LAotCQkJCQkgc3RydWN0IHNvY2tldF9wYWNrZXQsIGxpc3QpOwotCWxpc3RfZGVsKCZzb2NrZXRfcGFja2V0LT5saXN0KTsKLQlzb2NrZXRfY2xpZW50LT5xdWV1ZV9sZW4tLTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNvY2tldF9jbGllbnQtPmxvY2ssIGZsYWdzKTsKLQotCWVycm9yID0gX19jb3B5X3RvX3VzZXIoYnVmLCAmc29ja2V0X3BhY2tldC0+aWNtcF9wYWNrZXQsCi0JCQkgICAgICAgc29ja2V0X3BhY2tldC0+aWNtcF9sZW4pOwotCi0JcGFja2V0X2xlbiA9IHNvY2tldF9wYWNrZXQtPmljbXBfbGVuOwotCWtmcmVlKHNvY2tldF9wYWNrZXQpOwotCi0JaWYgKGVycm9yKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXJldHVybiBwYWNrZXRfbGVuOwotfQotCi1zdGF0aWMgc3NpemVfdCBiYXRfc29ja2V0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZiwKLQkJCQlzaXplX3QgbGVuLCBsb2ZmX3QgKm9mZikKLXsKLQlzdHJ1Y3Qgc29ja2V0X2NsaWVudCAqc29ja2V0X2NsaWVudCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gc29ja2V0X2NsaWVudC0+YmF0X3ByaXY7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlzdHJ1Y3QgaWNtcF9wYWNrZXRfcnIgKmljbXBfcGFja2V0OwotCi0Jc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOwotCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZjsKLQlzaXplX3QgcGFja2V0X2xlbiA9IHNpemVvZihzdHJ1Y3QgaWNtcF9wYWNrZXQpOwotCXVpbnQ4X3QgZHN0YWRkcltFVEhfQUxFTl07Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChsZW4gPCBzaXplb2Yoc3RydWN0IGljbXBfcGFja2V0KSkgewotCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LAotCQkJIkVycm9yIC0gY2FuJ3Qgc2VuZCBwYWNrZXQgZnJvbSBjaGFyIGRldmljZTogIgotCQkJImludmFsaWQgcGFja2V0IHNpemVcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoIWJhdF9wcml2LT5wcmltYXJ5X2lmKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWlmIChsZW4gPj0gc2l6ZW9mKHN0cnVjdCBpY21wX3BhY2tldF9ycikpCi0JCXBhY2tldF9sZW4gPSBzaXplb2Yoc3RydWN0IGljbXBfcGFja2V0X3JyKTsKLQotCXNrYiA9IGRldl9hbGxvY19za2IocGFja2V0X2xlbiArIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSk7Ci0JaWYgKCFza2IpCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jc2tiX3Jlc2VydmUoc2tiLCBzaXplb2Yoc3RydWN0IGV0aGhkcikpOwotCWljbXBfcGFja2V0ID0gKHN0cnVjdCBpY21wX3BhY2tldF9yciAqKXNrYl9wdXQoc2tiLCBwYWNrZXRfbGVuKTsKLQotCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWZmLCBwYWNrZXRfbGVuKSkgewotCQlsZW4gPSAtRUZBVUxUOwotCQlnb3RvIGZyZWVfc2tiOwotCX0KLQotCWlmIChfX2NvcHlfZnJvbV91c2VyKGljbXBfcGFja2V0LCBidWZmLCBwYWNrZXRfbGVuKSkgewotCQlsZW4gPSAtRUZBVUxUOwotCQlnb3RvIGZyZWVfc2tiOwotCX0KLQotCWlmIChpY21wX3BhY2tldC0+cGFja2V0X3R5cGUgIT0gQkFUX0lDTVApIHsKLQkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJCSJFcnJvciAtIGNhbid0IHNlbmQgcGFja2V0IGZyb20gY2hhciBkZXZpY2U6ICIKLQkJCSJnb3QgYm9ndXMgcGFja2V0IHR5cGUgKGV4cGVjdGVkOiBCQVRfSUNNUClcbiIpOwotCQlsZW4gPSAtRUlOVkFMOwotCQlnb3RvIGZyZWVfc2tiOwotCX0KLQotCWlmIChpY21wX3BhY2tldC0+bXNnX3R5cGUgIT0gRUNIT19SRVFVRVNUKSB7Ci0JCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCi0JCQkiRXJyb3IgLSBjYW4ndCBzZW5kIHBhY2tldCBmcm9tIGNoYXIgZGV2aWNlOiAiCi0JCQkiZ290IGJvZ3VzIG1lc3NhZ2UgdHlwZSAoZXhwZWN0ZWQ6IEVDSE9fUkVRVUVTVClcbiIpOwotCQlsZW4gPSAtRUlOVkFMOwotCQlnb3RvIGZyZWVfc2tiOwotCX0KLQotCWljbXBfcGFja2V0LT51aWQgPSBzb2NrZXRfY2xpZW50LT5pbmRleDsKLQotCWlmIChpY21wX3BhY2tldC0+dmVyc2lvbiAhPSBDT01QQVRfVkVSU0lPTikgewotCQlpY21wX3BhY2tldC0+bXNnX3R5cGUgPSBQQVJBTUVURVJfUFJPQkxFTTsKLQkJaWNtcF9wYWNrZXQtPnR0bCA9IENPTVBBVF9WRVJTSU9OOwotCQliYXRfc29ja2V0X2FkZF9wYWNrZXQoc29ja2V0X2NsaWVudCwgaWNtcF9wYWNrZXQsIHBhY2tldF9sZW4pOwotCQlnb3RvIGZyZWVfc2tiOwotCX0KLQotCWlmIChhdG9taWNfcmVhZCgmYmF0X3ByaXYtPm1lc2hfc3RhdGUpICE9IE1FU0hfQUNUSVZFKQotCQlnb3RvIGRzdF91bnJlYWNoOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCW9yaWdfbm9kZSA9ICgoc3RydWN0IG9yaWdfbm9kZSAqKWhhc2hfZmluZChiYXRfcHJpdi0+b3JpZ19oYXNoLAotCQkJCQkJICAgaWNtcF9wYWNrZXQtPmRzdCkpOwotCi0JaWYgKCFvcmlnX25vZGUpCi0JCWdvdG8gdW5sb2NrOwotCi0JaWYgKCFvcmlnX25vZGUtPnJvdXRlcikKLQkJZ290byB1bmxvY2s7Ci0KLQliYXRtYW5faWYgPSBvcmlnX25vZGUtPnJvdXRlci0+aWZfaW5jb21pbmc7Ci0JbWVtY3B5KGRzdGFkZHIsIG9yaWdfbm9kZS0+cm91dGVyLT5hZGRyLCBFVEhfQUxFTik7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQotCWlmICghYmF0bWFuX2lmKQotCQlnb3RvIGRzdF91bnJlYWNoOwotCi0JaWYgKGJhdG1hbl9pZi0+aWZfc3RhdHVzICE9IElGX0FDVElWRSkKLQkJZ290byBkc3RfdW5yZWFjaDsKLQotCW1lbWNweShpY21wX3BhY2tldC0+b3JpZywKLQkgICAgICAgYmF0X3ByaXYtPnByaW1hcnlfaWYtPm5ldF9kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7Ci0KLQlpZiAocGFja2V0X2xlbiA9PSBzaXplb2Yoc3RydWN0IGljbXBfcGFja2V0X3JyKSkKLQkJbWVtY3B5KGljbXBfcGFja2V0LT5yciwgYmF0bWFuX2lmLT5uZXRfZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwotCi0KLQlzZW5kX3NrYl9wYWNrZXQoc2tiLCBiYXRtYW5faWYsIGRzdGFkZHIpOwotCi0JZ290byBvdXQ7Ci0KLXVubG9jazoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLWRzdF91bnJlYWNoOgotCWljbXBfcGFja2V0LT5tc2dfdHlwZSA9IERFU1RJTkFUSU9OX1VOUkVBQ0hBQkxFOwotCWJhdF9zb2NrZXRfYWRkX3BhY2tldChzb2NrZXRfY2xpZW50LCBpY21wX3BhY2tldCwgcGFja2V0X2xlbik7Ci1mcmVlX3NrYjoKLQlrZnJlZV9za2Ioc2tiKTsKLW91dDoKLQlyZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGJhdF9zb2NrZXRfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKLXsKLQlzdHJ1Y3Qgc29ja2V0X2NsaWVudCAqc29ja2V0X2NsaWVudCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCXBvbGxfd2FpdChmaWxlLCAmc29ja2V0X2NsaWVudC0+cXVldWVfd2FpdCwgd2FpdCk7Ci0KLQlpZiAoc29ja2V0X2NsaWVudC0+cXVldWVfbGVuID4gMCkKLQkJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZm9wcyA9IHsKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkub3BlbiA9IGJhdF9zb2NrZXRfb3BlbiwKLQkucmVsZWFzZSA9IGJhdF9zb2NrZXRfcmVsZWFzZSwKLQkucmVhZCA9IGJhdF9zb2NrZXRfcmVhZCwKLQkud3JpdGUgPSBiYXRfc29ja2V0X3dyaXRlLAotCS5wb2xsID0gYmF0X3NvY2tldF9wb2xsLAotCS5sbHNlZWsgPSBub19sbHNlZWssCi19OwotCi1pbnQgYmF0X3NvY2tldF9zZXR1cChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KQotewotCXN0cnVjdCBkZW50cnkgKmQ7Ci0KLQlpZiAoIWJhdF9wcml2LT5kZWJ1Z19kaXIpCi0JCWdvdG8gZXJyOwotCi0JZCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoSUNNUF9TT0NLRVQsIFNfSUZSRUcgfCBTX0lXVVNSIHwgU19JUlVTUiwKLQkJCQliYXRfcHJpdi0+ZGVidWdfZGlyLCBiYXRfcHJpdiwgJmZvcHMpOwotCWlmIChkKQotCQlnb3RvIGVycjsKLQotCXJldHVybiAwOwotCi1lcnI6Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGJhdF9zb2NrZXRfYWRkX3BhY2tldChzdHJ1Y3Qgc29ja2V0X2NsaWVudCAqc29ja2V0X2NsaWVudCwKLQkJCQkgIHN0cnVjdCBpY21wX3BhY2tldF9yciAqaWNtcF9wYWNrZXQsCi0JCQkJICBzaXplX3QgaWNtcF9sZW4pCi17Ci0Jc3RydWN0IHNvY2tldF9wYWNrZXQgKnNvY2tldF9wYWNrZXQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNvY2tldF9wYWNrZXQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc29ja2V0X3BhY2tldCksIEdGUF9BVE9NSUMpOwotCi0JaWYgKCFzb2NrZXRfcGFja2V0KQotCQlyZXR1cm47Ci0KLQlJTklUX0xJU1RfSEVBRCgmc29ja2V0X3BhY2tldC0+bGlzdCk7Ci0JbWVtY3B5KCZzb2NrZXRfcGFja2V0LT5pY21wX3BhY2tldCwgaWNtcF9wYWNrZXQsIGljbXBfbGVuKTsKLQlzb2NrZXRfcGFja2V0LT5pY21wX2xlbiA9IGljbXBfbGVuOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNvY2tldF9jbGllbnQtPmxvY2ssIGZsYWdzKTsKLQotCS8qIHdoaWxlIHdhaXRpbmcgZm9yIHRoZSBsb2NrIHRoZSBzb2NrZXRfY2xpZW50IGNvdWxkIGhhdmUgYmVlbgotCSAqIGRlbGV0ZWQgKi8KLQlpZiAoIXNvY2tldF9jbGllbnRfaGFzaFtpY21wX3BhY2tldC0+dWlkXSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzb2NrZXRfY2xpZW50LT5sb2NrLCBmbGFncyk7Ci0JCWtmcmVlKHNvY2tldF9wYWNrZXQpOwotCQlyZXR1cm47Ci0JfQotCi0JbGlzdF9hZGRfdGFpbCgmc29ja2V0X3BhY2tldC0+bGlzdCwgJnNvY2tldF9jbGllbnQtPnF1ZXVlX2xpc3QpOwotCXNvY2tldF9jbGllbnQtPnF1ZXVlX2xlbisrOwotCi0JaWYgKHNvY2tldF9jbGllbnQtPnF1ZXVlX2xlbiA+IDEwMCkgewotCQlzb2NrZXRfcGFja2V0ID0gbGlzdF9maXJzdF9lbnRyeSgmc29ja2V0X2NsaWVudC0+cXVldWVfbGlzdCwKLQkJCQkJCSBzdHJ1Y3Qgc29ja2V0X3BhY2tldCwgbGlzdCk7Ci0KLQkJbGlzdF9kZWwoJnNvY2tldF9wYWNrZXQtPmxpc3QpOwotCQlrZnJlZShzb2NrZXRfcGFja2V0KTsKLQkJc29ja2V0X2NsaWVudC0+cXVldWVfbGVuLS07Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc29ja2V0X2NsaWVudC0+bG9jaywgZmxhZ3MpOwotCi0Jd2FrZV91cCgmc29ja2V0X2NsaWVudC0+cXVldWVfd2FpdCk7Ci19Ci0KLXZvaWQgYmF0X3NvY2tldF9yZWNlaXZlX3BhY2tldChzdHJ1Y3QgaWNtcF9wYWNrZXRfcnIgKmljbXBfcGFja2V0LAotCQkJICAgICAgIHNpemVfdCBpY21wX2xlbikKLXsKLQlzdHJ1Y3Qgc29ja2V0X2NsaWVudCAqaGFzaCA9IHNvY2tldF9jbGllbnRfaGFzaFtpY21wX3BhY2tldC0+dWlkXTsKLQotCWlmIChoYXNoKQotCQliYXRfc29ja2V0X2FkZF9wYWNrZXQoaGFzaCwgaWNtcF9wYWNrZXQsIGljbXBfbGVuKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2ljbXBfc29ja2V0LmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9pY21wX3NvY2tldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjliMzQ4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2ljbXBfc29ja2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKLSAqCi0gKiBNYXJlayBMaW5kbmVyCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxLCBVU0EKLSAqCi0gKi8KLQotI2lmbmRlZiBfTkVUX0JBVE1BTl9BRFZfSUNNUF9TT0NLRVRfSF8KLSNkZWZpbmUgX05FVF9CQVRNQU5fQURWX0lDTVBfU09DS0VUX0hfCi0KLSNpbmNsdWRlICJ0eXBlcy5oIgotCi0jZGVmaW5lIElDTVBfU09DS0VUICJzb2NrZXQiCi0KLXZvaWQgYmF0X3NvY2tldF9pbml0KHZvaWQpOwotaW50IGJhdF9zb2NrZXRfc2V0dXAoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdik7Ci12b2lkIGJhdF9zb2NrZXRfcmVjZWl2ZV9wYWNrZXQoc3RydWN0IGljbXBfcGFja2V0X3JyICppY21wX3BhY2tldCwKLQkJCSAgICAgICBzaXplX3QgaWNtcF9sZW4pOwotCi0jZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX0lDTVBfU09DS0VUX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9tYWluLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9tYWluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ODc5NDAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvbWFpbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgotICoKLSAqIE1hcmVrIExpbmRuZXIsIFNpbW9uIFd1bmRlcmxpY2gKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVTQQotICoKLSAqLwotCi0jaW5jbHVkZSAibWFpbi5oIgotI2luY2x1ZGUgImJhdF9zeXNmcy5oIgotI2luY2x1ZGUgImJhdF9kZWJ1Z2ZzLmgiCi0jaW5jbHVkZSAicm91dGluZy5oIgotI2luY2x1ZGUgInNlbmQuaCIKLSNpbmNsdWRlICJvcmlnaW5hdG9yLmgiCi0jaW5jbHVkZSAic29mdC1pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJpY21wX3NvY2tldC5oIgotI2luY2x1ZGUgInRyYW5zbGF0aW9uLXRhYmxlLmgiCi0jaW5jbHVkZSAiaGFyZC1pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJ0eXBlcy5oIgotI2luY2x1ZGUgInZpcy5oIgotI2luY2x1ZGUgImhhc2guaCIKLQotc3RydWN0IGxpc3RfaGVhZCBpZl9saXN0OwotCi11bnNpZ25lZCBjaGFyIGJyb2FkY2FzdF9hZGRyW10gPSB7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07Ci0KLXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpiYXRfZXZlbnRfd29ya3F1ZXVlOwotCi1zdGF0aWMgaW50IF9faW5pdCBiYXRtYW5faW5pdCh2b2lkKQotewotCUlOSVRfTElTVF9IRUFEKCZpZl9saXN0KTsKLQotCS8qIHRoZSBuYW1lIHNob3VsZCBub3QgYmUgbG9uZ2VyIHRoYW4gMTAgY2hhcnMgLSBzZWUKLQkgKiBodHRwOi8vbHduLm5ldC9BcnRpY2xlcy8yMzYzNC8gKi8KLQliYXRfZXZlbnRfd29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImJhdF9ldmVudHMiKTsKLQotCWlmICghYmF0X2V2ZW50X3dvcmtxdWV1ZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQliYXRfc29ja2V0X2luaXQoKTsKLQlkZWJ1Z2ZzX2luaXQoKTsKLQotCXJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmaGFyZF9pZl9ub3RpZmllcik7Ci0KLQlwcl9pbmZvKCJCLkEuVC5NLkEuTi4gYWR2YW5jZWQgJXMlcyAoY29tcGF0aWJpbGl0eSB2ZXJzaW9uICVpKSAiCi0JCSJsb2FkZWRcbiIsIFNPVVJDRV9WRVJTSU9OLCBSRVZJU0lPTl9WRVJTSU9OX1NUUiwKLQkJQ09NUEFUX1ZFUlNJT04pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBiYXRtYW5fZXhpdCh2b2lkKQotewotCWRlYnVnZnNfZGVzdHJveSgpOwotCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZoYXJkX2lmX25vdGlmaWVyKTsKLQloYXJkaWZfcmVtb3ZlX2ludGVyZmFjZXMoKTsKLQotCWZsdXNoX3dvcmtxdWV1ZShiYXRfZXZlbnRfd29ya3F1ZXVlKTsKLQlkZXN0cm95X3dvcmtxdWV1ZShiYXRfZXZlbnRfd29ya3F1ZXVlKTsKLQliYXRfZXZlbnRfd29ya3F1ZXVlID0gTlVMTDsKLQotCXJjdV9iYXJyaWVyKCk7Ci19Ci0KLWludCBtZXNoX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRfaWZhY2UpCi17Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KHNvZnRfaWZhY2UpOwotCi0Jc3Bpbl9sb2NrX2luaXQoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmJhdF9wcml2LT5mb3J3X2JhdF9saXN0X2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZiYXRfcHJpdi0+Zm9yd19iY2FzdF9saXN0X2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZiYXRfcHJpdi0+aG5hX2xoYXNoX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZiYXRfcHJpdi0+aG5hX2doYXNoX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZiYXRfcHJpdi0+dmlzX2hhc2hfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmJhdF9wcml2LT52aXNfbGlzdF9sb2NrKTsKLQotCUlOSVRfSExJU1RfSEVBRCgmYmF0X3ByaXYtPmZvcndfYmF0X2xpc3QpOwotCUlOSVRfSExJU1RfSEVBRCgmYmF0X3ByaXYtPmZvcndfYmNhc3RfbGlzdCk7Ci0KLQlpZiAob3JpZ2luYXRvcl9pbml0KGJhdF9wcml2KSA8IDEpCi0JCWdvdG8gZXJyOwotCi0JaWYgKGhuYV9sb2NhbF9pbml0KGJhdF9wcml2KSA8IDEpCi0JCWdvdG8gZXJyOwotCi0JaWYgKGhuYV9nbG9iYWxfaW5pdChiYXRfcHJpdikgPCAxKQotCQlnb3RvIGVycjsKLQotCWhuYV9sb2NhbF9hZGQoc29mdF9pZmFjZSwgc29mdF9pZmFjZS0+ZGV2X2FkZHIpOwotCi0JaWYgKHZpc19pbml0KGJhdF9wcml2KSA8IDEpCi0JCWdvdG8gZXJyOwotCi0JYXRvbWljX3NldCgmYmF0X3ByaXYtPm1lc2hfc3RhdGUsIE1FU0hfQUNUSVZFKTsKLQlnb3RvIGVuZDsKLQotZXJyOgotCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgbWVzaCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmVzOiAiCi0JICAgICAgICJvdXQgb2YgbWVtID9cbiIpOwotCW1lc2hfZnJlZShzb2Z0X2lmYWNlKTsKLQlyZXR1cm4gLTE7Ci0KLWVuZDoKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBtZXNoX2ZyZWUoc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRfaWZhY2UpCi17Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KHNvZnRfaWZhY2UpOwotCi0JYXRvbWljX3NldCgmYmF0X3ByaXYtPm1lc2hfc3RhdGUsIE1FU0hfREVBQ1RJVkFUSU5HKTsKLQotCXB1cmdlX291dHN0YW5kaW5nX3BhY2tldHMoYmF0X3ByaXYsIE5VTEwpOwotCi0JdmlzX3F1aXQoYmF0X3ByaXYpOwotCi0Jb3JpZ2luYXRvcl9mcmVlKGJhdF9wcml2KTsKLQotCWhuYV9sb2NhbF9mcmVlKGJhdF9wcml2KTsKLQlobmFfZ2xvYmFsX2ZyZWUoYmF0X3ByaXYpOwotCi0JYXRvbWljX3NldCgmYmF0X3ByaXYtPm1lc2hfc3RhdGUsIE1FU0hfSU5BQ1RJVkUpOwotfQotCi12b2lkIGluY19tb2R1bGVfY291bnQodm9pZCkKLXsKLQl0cnlfbW9kdWxlX2dldChUSElTX01PRFVMRSk7Ci19Ci0KLXZvaWQgZGVjX21vZHVsZV9jb3VudCh2b2lkKQotewotCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOwotfQotCi0vKiByZXR1cm5zIDEgaWYgdGhleSBhcmUgdGhlIHNhbWUgb3JpZ2luYXRvciAqLwotCi1pbnQgY29tcGFyZV9vcmlnKHZvaWQgKmRhdGExLCB2b2lkICpkYXRhMikKLXsKLQlyZXR1cm4gKG1lbWNtcChkYXRhMSwgZGF0YTIsIEVUSF9BTEVOKSA9PSAwID8gMSA6IDApOwotfQotCi0vKiBoYXNoZnVuY3Rpb24gdG8gY2hvb3NlIGFuIGVudHJ5IGluIGEgaGFzaCB0YWJsZSBvZiBnaXZlbiBzaXplICovCi0vKiBoYXNoIGFsZ29yaXRobSBmcm9tIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSGFzaF90YWJsZSAqLwotaW50IGNob29zZV9vcmlnKHZvaWQgKmRhdGEsIGludDMyX3Qgc2l6ZSkKLXsKLQl1bnNpZ25lZCBjaGFyICprZXkgPSBkYXRhOwotCXVpbnQzMl90IGhhc2ggPSAwOwotCXNpemVfdCBpOwotCi0JZm9yIChpID0gMDsgaSA8IDY7IGkrKykgewotCQloYXNoICs9IGtleVtpXTsKLQkJaGFzaCArPSAoaGFzaCA8PCAxMCk7Ci0JCWhhc2ggXj0gKGhhc2ggPj4gNik7Ci0JfQotCi0JaGFzaCArPSAoaGFzaCA8PCAzKTsKLQloYXNoIF49IChoYXNoID4+IDExKTsKLQloYXNoICs9IChoYXNoIDw8IDE1KTsKLQotCXJldHVybiBoYXNoICUgc2l6ZTsKLX0KLQotaW50IGlzX215X21hYyh1aW50OF90ICphZGRyKQotewotCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZjsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShiYXRtYW5faWYsICZpZl9saXN0LCBsaXN0KSB7Ci0JCWlmIChiYXRtYW5faWYtPmlmX3N0YXR1cyAhPSBJRl9BQ1RJVkUpCi0JCQljb250aW51ZTsKLQotCQlpZiAoY29tcGFyZV9vcmlnKGJhdG1hbl9pZi0+bmV0X2Rldi0+ZGV2X2FkZHIsIGFkZHIpKSB7Ci0JCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JfQotCXJjdV9yZWFkX3VubG9jaygpOwotCXJldHVybiAwOwotCi19Ci0KLWludCBpc19iY2FzdCh1aW50OF90ICphZGRyKQotewotCXJldHVybiAoYWRkclswXSA9PSAodWludDhfdCkweGZmKSAmJiAoYWRkclsxXSA9PSAodWludDhfdCkweGZmKTsKLX0KLQotaW50IGlzX21jYXN0KHVpbnQ4X3QgKmFkZHIpCi17Ci0JcmV0dXJuICphZGRyICYgMHgwMTsKLX0KLQotbW9kdWxlX2luaXQoYmF0bWFuX2luaXQpOwotbW9kdWxlX2V4aXQoYmF0bWFuX2V4aXQpOwotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLU1PRFVMRV9BVVRIT1IoRFJJVkVSX0FVVEhPUik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOwotTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoRFJJVkVSX0RFVklDRSk7Ci0jaWZkZWYgUkVWSVNJT05fVkVSU0lPTgotTU9EVUxFX1ZFUlNJT04oU09VUkNFX1ZFUlNJT04gIi0iIFJFVklTSU9OX1ZFUlNJT04pOwotI2Vsc2UKLU1PRFVMRV9WRVJTSU9OKFNPVVJDRV9WRVJTSU9OKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvbWFpbi5oIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvbWFpbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTNmNTE2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L21haW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKLSAqCi0gKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxLCBVU0EKLSAqCi0gKi8KLQotI2lmbmRlZiBfTkVUX0JBVE1BTl9BRFZfTUFJTl9IXwotI2RlZmluZSBfTkVUX0JBVE1BTl9BRFZfTUFJTl9IXwotCi0vKiBLZXJuZWwgUHJvZ3JhbW1pbmcgKi8KLSNkZWZpbmUgTElOVVgKLQotI2RlZmluZSBEUklWRVJfQVVUSE9SICJNYXJlayBMaW5kbmVyIDxsaW5kbmVyX21hcmVrQHlhaG9vLmRlPiwgIiBcCi0JCSAgICAgICJTaW1vbiBXdW5kZXJsaWNoIDxzaXd1QGhyei50dS1jaGVtbml0ei5kZT4iCi0jZGVmaW5lIERSSVZFUl9ERVNDICAgIkIuQS5ULk0uQS5OLiBhZHZhbmNlZCIKLSNkZWZpbmUgRFJJVkVSX0RFVklDRSAiYmF0bWFuLWFkdiIKLQotI2RlZmluZSBTT1VSQ0VfVkVSU0lPTiAibmV4dCIKLQotCi0vKiBCLkEuVC5NLkEuTi4gcGFyYW1ldGVycyAqLwotCi0jZGVmaW5lIFRRX01BWF9WQUxVRSAyNTUKLSNkZWZpbmUgSklUVEVSIDIwCi0jZGVmaW5lIFRUTCA1MAkJCSAgLyogVGltZSBUbyBMaXZlIG9mIGJyb2FkY2FzdCBtZXNzYWdlcyAqLwotCi0jZGVmaW5lIFBVUkdFX1RJTUVPVVQgMjAwCS8qIHB1cmdlIG9yaWdpbmF0b3JzIGFmdGVyIHRpbWUgaW4gc2Vjb25kcyBpZiBubwotCQkJCSAgICogdmFsaWQgcGFja2V0IGNvbWVzIGluIC0+IFRPRE86IGNoZWNrCi0JCQkJICAgKiBpbmZsdWVuY2Ugb24gVFFfTE9DQUxfV0lORE9XX1NJWkUgKi8KLSNkZWZpbmUgTE9DQUxfSE5BX1RJTUVPVVQgMzYwMCAvKiBpbiBzZWNvbmRzICovCi0KLSNkZWZpbmUgVFFfTE9DQUxfV0lORE9XX1NJWkUgNjQJICAvKiBzbGlkaW5nIHBhY2tldCByYW5nZSBvZiByZWNlaXZlZCBvcmlnaW5hdG9yCi0JCQkJICAgKiBtZXNzYWdlcyBpbiBzcXVlbmNlIG51bWJlcnMgKHNob3VsZCBiZSBhCi0JCQkJICAgKiBtdWx0aXBsZSBvZiBvdXIgd29yZCBzaXplKSAqLwotI2RlZmluZSBUUV9HTE9CQUxfV0lORE9XX1NJWkUgNQotI2RlZmluZSBUUV9MT0NBTF9CSURSRUNUX1NFTkRfTUlOSU1VTSAxCi0jZGVmaW5lIFRRX0xPQ0FMX0JJRFJFQ1RfUkVDVl9NSU5JTVVNIDEKLSNkZWZpbmUgVFFfVE9UQUxfQklEUkVDVF9MSU1JVCAxCi0KLSNkZWZpbmUgVFFfSE9QX1BFTkFMVFkgMTAKLQotI2RlZmluZSBOVU1fV09SRFMgKFRRX0xPQ0FMX1dJTkRPV19TSVpFIC8gV09SRF9CSVRfU0laRSkKLQotI2RlZmluZSBQQUNLQlVGRl9TSVpFIDIwMDAKLSNkZWZpbmUgTE9HX0JVRl9MRU4gODE5MgkgIC8qIGhhcyB0byBiZSBhIHBvd2VyIG9mIDIgKi8KLQotI2RlZmluZSBWSVNfSU5URVJWQUwgNTAwMAkvKiA1IHNlY29uZHMgKi8KLQotLyogaG93IG11Y2ggd29yc2Ugc2Vjb25kYXJ5IGludGVyZmFjZXMgbWF5IGJlIHRvCi0gKiB0byBiZSBjb25zaWRlcmVkIGFzIGJvbmRpbmcgY2FuZGlkYXRlcyAqLwotCi0jZGVmaW5lIEJPTkRJTkdfVFFfVEhSRVNIT0xECTUwCi0KLSNkZWZpbmUgTUFYX0FHR1JFR0FUSU9OX0JZVEVTIDUxMiAvKiBzaG91bGQgbm90IGJlIGJpZ2dlciB0aGFuIDUxMiBieXRlcyBvcgotCQkJCSAgICogY2hhbmdlIHRoZSBzaXplIG9mCi0JCQkJICAgKiBmb3J3X3BhY2tldC0+ZGlyZWN0X2xpbmtfZmxhZ3MgKi8KLSNkZWZpbmUgTUFYX0FHR1JFR0FUSU9OX01TIDEwMAotCi0jZGVmaW5lIFJFU0VUX1BST1RFQ1RJT05fTVMgMzAwMDAKLSNkZWZpbmUgRVhQRUNURURfU0VRTk9fUkFOR0UJNjU1MzYKLS8qIGRvbid0IHJlc2V0IGFnYWluIHdpdGhpbiAzMCBzZWNvbmRzICovCi0KLSNkZWZpbmUgTUVTSF9JTkFDVElWRSAwCi0jZGVmaW5lIE1FU0hfQUNUSVZFIDEKLSNkZWZpbmUgTUVTSF9ERUFDVElWQVRJTkcgMgotCi0jZGVmaW5lIEJDQVNUX1FVRVVFX0xFTgkJMjU2Ci0jZGVmaW5lIEJBVE1BTl9RVUVVRV9MRU4JMjU2Ci0KLS8qCi0gKiBEZWJ1ZyBNZXNzYWdlcwotICovCi0jZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10IC8qIEFwcGVuZCAnYmF0bWFuLWFkdjogJyBiZWZvcmUKLQkJCQkJICAgICAqIGtlcm5lbCBtZXNzYWdlcyAqLwotCi0jZGVmaW5lIERCR19CQVRNQU4gMQkvKiBhbGwgbWVzc2FnZXMgcmVsYXRlZCB0byByb3V0aW5nIC8gZmxvb2RpbmcgLwotCQkJICogYnJvYWRjYXN0aW5nIC8gZXRjICovCi0jZGVmaW5lIERCR19ST1VURVMgMgkvKiByb3V0ZSBvciBobmEgYWRkZWQgLyBjaGFuZ2VkIC8gZGVsZXRlZCAqLwotI2RlZmluZSBEQkdfQUxMIDMKLQotI2RlZmluZSBMT0dfQlVGX0xFTiA4MTkyICAgICAgICAgIC8qIGhhcyB0byBiZSBhIHBvd2VyIG9mIDIgKi8KLQotCi0vKgotICogIFZpcwotICovCi0KLS8qICNkZWZpbmUgVklTX1NVQkNMVVNURVJTX0RJU0FCTEVEICovCi0KLS8qCi0gKiBLZXJuZWwgaGVhZGVycwotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgkvKiBtdXRleCAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgkvKiBuZWVkZWQgYnkgYWxsIG1vZHVsZXMgKi8KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4JLyogbmV0ZGV2aWNlICovCi0jaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4JLyogZXRoZXJuZXQgaGVhZGVyICovCi0jaW5jbHVkZSA8bGludXgvcG9sbC5oPgkJLyogcG9sbF90YWJsZSAqLwotI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4JLyoga2VybmVsIHRocmVhZHMgKi8KLSNpbmNsdWRlIDxsaW51eC9wa3Rfc2NoZWQuaD4JLyogc2NoZWR1bGUgdHlwZXMgKi8KLSNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4JLyogd29ya3F1ZXVlICovCi0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPG5ldC9zb2NrLmg+CQkvKiBzdHJ1Y3Qgc29jayAqLwotI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotI2luY2x1ZGUgInR5cGVzLmgiCi0KLSNpZm5kZWYgUkVWSVNJT05fVkVSU0lPTgotI2RlZmluZSBSRVZJU0lPTl9WRVJTSU9OX1NUUiAiIgotI2Vsc2UKLSNkZWZpbmUgUkVWSVNJT05fVkVSU0lPTl9TVFIgIiAiUkVWSVNJT05fVkVSU0lPTgotI2VuZGlmCi0KLWV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIGlmX2xpc3Q7Ci0KLWV4dGVybiB1bnNpZ25lZCBjaGFyIGJyb2FkY2FzdF9hZGRyW107Ci1leHRlcm4gc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmJhdF9ldmVudF93b3JrcXVldWU7Ci0KLWludCBtZXNoX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRfaWZhY2UpOwotdm9pZCBtZXNoX2ZyZWUoc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRfaWZhY2UpOwotdm9pZCBpbmNfbW9kdWxlX2NvdW50KHZvaWQpOwotdm9pZCBkZWNfbW9kdWxlX2NvdW50KHZvaWQpOwotaW50IGNvbXBhcmVfb3JpZyh2b2lkICpkYXRhMSwgdm9pZCAqZGF0YTIpOwotaW50IGNob29zZV9vcmlnKHZvaWQgKmRhdGEsIGludDMyX3Qgc2l6ZSk7Ci1pbnQgaXNfbXlfbWFjKHVpbnQ4X3QgKmFkZHIpOwotaW50IGlzX2JjYXN0KHVpbnQ4X3QgKmFkZHIpOwotaW50IGlzX21jYXN0KHVpbnQ4X3QgKmFkZHIpOwotCi0jaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfREVCVUcKLWludCBkZWJ1Z19sb2coc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwgY2hhciAqZm10LCAuLi4pOwotCi0jZGVmaW5lIGJhdF9kYmcodHlwZSwgYmF0X3ByaXYsIGZtdCwgYXJnLi4uKQkJCVwKLQlkbyB7CQkJCQkJCVwKLQkJaWYgKGF0b21pY19yZWFkKCZiYXRfcHJpdi0+bG9nX2xldmVsKSAmIHR5cGUpCVwKLQkJCWRlYnVnX2xvZyhiYXRfcHJpdiwgZm10LCAjIyBhcmcpOwlcCi0JfQkJCQkJCQlcCi0Jd2hpbGUgKDApCi0jZWxzZSAvKiAhQ09ORklHX0JBVE1BTl9BRFZfREVCVUcgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBiYXRfZGJnKGNoYXIgdHlwZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKLQkJCSAgIHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCi0JCQkgICBjaGFyICpmbXQgX19hdHRyaWJ1dGVfXygodW51c2VkKSksIC4uLikKLXsKLX0KLSNlbmRpZgotCi0jZGVmaW5lIGJhdF93YXJuaW5nKG5ldF9kZXYsIGZtdCwgYXJnLi4uKQkJCQlcCi0JZG8gewkJCQkJCQkJXAotCQlzdHJ1Y3QgbmV0X2RldmljZSAqX25ldGRldiA9IChuZXRfZGV2KTsgICAgICAgICAgICAgICAgIFwKLQkJc3RydWN0IGJhdF9wcml2ICpfYmF0cHJpdiA9IG5ldGRldl9wcml2KF9uZXRkZXYpOyAgICAgICBcCi0JCWJhdF9kYmcoREJHX0FMTCwgX2JhdHByaXYsIGZtdCwgIyMgYXJnKTsJCVwKLQkJcHJfd2FybmluZygiJXM6ICIgZm10LCBfbmV0ZGV2LT5uYW1lLCAjIyBhcmcpOwkJXAotCX0gd2hpbGUgKDApCi0jZGVmaW5lIGJhdF9pbmZvKG5ldF9kZXYsIGZtdCwgYXJnLi4uKQkJCQkJXAotCWRvIHsJCQkJCQkJCVwKLQkJc3RydWN0IG5ldF9kZXZpY2UgKl9uZXRkZXYgPSAobmV0X2Rldik7ICAgICAgICAgICAgICAgICBcCi0JCXN0cnVjdCBiYXRfcHJpdiAqX2JhdHByaXYgPSBuZXRkZXZfcHJpdihfbmV0ZGV2KTsgICAgICAgXAotCQliYXRfZGJnKERCR19BTEwsIF9iYXRwcml2LCBmbXQsICMjIGFyZyk7CQlcCi0JCXByX2luZm8oIiVzOiAiIGZtdCwgX25ldGRldi0+bmFtZSwgIyMgYXJnKTsJCVwKLQl9IHdoaWxlICgwKQotI2RlZmluZSBiYXRfZXJyKG5ldF9kZXYsIGZtdCwgYXJnLi4uKQkJCQkJXAotCWRvIHsJCQkJCQkJCVwKLQkJc3RydWN0IG5ldF9kZXZpY2UgKl9uZXRkZXYgPSAobmV0X2Rldik7ICAgICAgICAgICAgICAgICBcCi0JCXN0cnVjdCBiYXRfcHJpdiAqX2JhdHByaXYgPSBuZXRkZXZfcHJpdihfbmV0ZGV2KTsgICAgICAgXAotCQliYXRfZGJnKERCR19BTEwsIF9iYXRwcml2LCBmbXQsICMjIGFyZyk7CQlcCi0JCXByX2VycigiJXM6ICIgZm10LCBfbmV0ZGV2LT5uYW1lLCAjIyBhcmcpOwkJXAotCX0gd2hpbGUgKDApCi0KLSNlbmRpZiAvKiBfTkVUX0JBVE1BTl9BRFZfTUFJTl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvb3JpZ2luYXRvci5jIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvb3JpZ2luYXRvci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTI3MDA4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L29yaWdpbmF0b3IuYworKysgL2Rldi9udWxsCkBAIC0xLDUzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKLSAqCi0gKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxLCBVU0EKLSAqCi0gKi8KLQotLyogaW5jcmVhc2UgdGhlIHJlZmVyZW5jZSBjb3VudGVyIGZvciB0aGlzIG9yaWdpbmF0b3IgKi8KLQotI2luY2x1ZGUgIm1haW4uaCIKLSNpbmNsdWRlICJvcmlnaW5hdG9yLmgiCi0jaW5jbHVkZSAiaGFzaC5oIgotI2luY2x1ZGUgInRyYW5zbGF0aW9uLXRhYmxlLmgiCi0jaW5jbHVkZSAicm91dGluZy5oIgotI2luY2x1ZGUgImhhcmQtaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAidW5pY2FzdC5oIgotCi1zdGF0aWMgdm9pZCBwdXJnZV9vcmlnKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Ci0KLXN0YXRpYyB2b2lkIHN0YXJ0X3B1cmdlX3RpbWVyKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpCi17Ci0JSU5JVF9ERUxBWUVEX1dPUksoJmJhdF9wcml2LT5vcmlnX3dvcmssIHB1cmdlX29yaWcpOwotCXF1ZXVlX2RlbGF5ZWRfd29yayhiYXRfZXZlbnRfd29ya3F1ZXVlLCAmYmF0X3ByaXYtPm9yaWdfd29yaywgMSAqIEhaKTsKLX0KLQotaW50IG9yaWdpbmF0b3JfaW5pdChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaWYgKGJhdF9wcml2LT5vcmlnX2hhc2gpCi0JCXJldHVybiAxOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCWJhdF9wcml2LT5vcmlnX2hhc2ggPSBoYXNoX25ldygxMjgsIGNvbXBhcmVfb3JpZywgY2hvb3NlX29yaWcpOwotCi0JaWYgKCFiYXRfcHJpdi0+b3JpZ19oYXNoKQotCQlnb3RvIGVycjsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCXN0YXJ0X3B1cmdlX3RpbWVyKGJhdF9wcml2KTsKLQlyZXR1cm4gMTsKLQotZXJyOgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCXJldHVybiAwOwotfQotCi1zdHJ1Y3QgbmVpZ2hfbm9kZSAqCi1jcmVhdGVfbmVpZ2hib3Ioc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLCBzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25laWdoX25vZGUsCi0JCXVpbnQ4X3QgKm5laWdoLCBzdHJ1Y3QgYmF0bWFuX2lmICppZl9pbmNvbWluZykKLXsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoaWZfaW5jb21pbmctPnNvZnRfaWZhY2UpOwotCXN0cnVjdCBuZWlnaF9ub2RlICpuZWlnaF9ub2RlOwotCi0JYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJIkNyZWF0aW5nIG5ldyBsYXN0LWhvcCBuZWlnaGJvciBvZiBvcmlnaW5hdG9yXG4iKTsKLQotCW5laWdoX25vZGUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbmVpZ2hfbm9kZSksIEdGUF9BVE9NSUMpOwotCWlmICghbmVpZ2hfbm9kZSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlJTklUX0xJU1RfSEVBRCgmbmVpZ2hfbm9kZS0+bGlzdCk7Ci0KLQltZW1jcHkobmVpZ2hfbm9kZS0+YWRkciwgbmVpZ2gsIEVUSF9BTEVOKTsKLQluZWlnaF9ub2RlLT5vcmlnX25vZGUgPSBvcmlnX25laWdoX25vZGU7Ci0JbmVpZ2hfbm9kZS0+aWZfaW5jb21pbmcgPSBpZl9pbmNvbWluZzsKLQotCWxpc3RfYWRkX3RhaWwoJm5laWdoX25vZGUtPmxpc3QsICZvcmlnX25vZGUtPm5laWdoX2xpc3QpOwotCXJldHVybiBuZWlnaF9ub2RlOwotfQotCi1zdGF0aWMgdm9pZCBmcmVlX29yaWdfbm9kZSh2b2lkICpkYXRhLCB2b2lkICphcmcpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGlzdF9wb3MsICpsaXN0X3Bvc190bXA7Ci0Jc3RydWN0IG5laWdoX25vZGUgKm5laWdoX25vZGU7Ci0Jc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlID0gKHN0cnVjdCBvcmlnX25vZGUgKilkYXRhOwotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSAoc3RydWN0IGJhdF9wcml2ICopYXJnOwotCi0JLyogZm9yIGFsbCBuZWlnaGJvcnMgdG93YXJkcyB0aGlzIG9yaWdpbmF0b3IgLi4uICovCi0JbGlzdF9mb3JfZWFjaF9zYWZlKGxpc3RfcG9zLCBsaXN0X3Bvc190bXAsICZvcmlnX25vZGUtPm5laWdoX2xpc3QpIHsKLQkJbmVpZ2hfbm9kZSA9IGxpc3RfZW50cnkobGlzdF9wb3MsIHN0cnVjdCBuZWlnaF9ub2RlLCBsaXN0KTsKLQotCQlsaXN0X2RlbChsaXN0X3Bvcyk7Ci0JCWtmcmVlKG5laWdoX25vZGUpOwotCX0KLQotCWZyYWdfbGlzdF9mcmVlKCZvcmlnX25vZGUtPmZyYWdfbGlzdCk7Ci0JaG5hX2dsb2JhbF9kZWxfb3JpZyhiYXRfcHJpdiwgb3JpZ19ub2RlLCAib3JpZ2luYXRvciB0aW1lZCBvdXQiKTsKLQotCWtmcmVlKG9yaWdfbm9kZS0+YmNhc3Rfb3duKTsKLQlrZnJlZShvcmlnX25vZGUtPmJjYXN0X293bl9zdW0pOwotCWtmcmVlKG9yaWdfbm9kZSk7Ci19Ci0KLXZvaWQgb3JpZ2luYXRvcl9mcmVlKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICghYmF0X3ByaXYtPm9yaWdfaGFzaCkKLQkJcmV0dXJuOwotCi0JY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZiYXRfcHJpdi0+b3JpZ193b3JrKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQloYXNoX2RlbGV0ZShiYXRfcHJpdi0+b3JpZ19oYXNoLCBmcmVlX29yaWdfbm9kZSwgYmF0X3ByaXYpOwotCWJhdF9wcml2LT5vcmlnX2hhc2ggPSBOVUxMOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotfQotCi0vKiB0aGlzIGZ1bmN0aW9uIGZpbmRzIG9yIGNyZWF0ZXMgYW4gb3JpZ2luYXRvciBlbnRyeSBmb3IgdGhlIGdpdmVuCi0gKiBhZGRyZXNzIGlmIGl0IGRvZXMgbm90IGV4aXRzICovCi1zdHJ1Y3Qgb3JpZ19ub2RlICpnZXRfb3JpZ19ub2RlKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsIHVpbnQ4X3QgKmFkZHIpCi17Ci0Jc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOwotCXN0cnVjdCBoYXNodGFibGVfdCAqc3dhcGhhc2g7Ci0JaW50IHNpemU7Ci0KLQlvcmlnX25vZGUgPSAoKHN0cnVjdCBvcmlnX25vZGUgKiloYXNoX2ZpbmQoYmF0X3ByaXYtPm9yaWdfaGFzaCwgYWRkcikpOwotCi0JaWYgKG9yaWdfbm9kZSkKLQkJcmV0dXJuIG9yaWdfbm9kZTsKLQotCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCi0JCSJDcmVhdGluZyBuZXcgb3JpZ2luYXRvcjogJXBNXG4iLCBhZGRyKTsKLQotCW9yaWdfbm9kZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBvcmlnX25vZGUpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIW9yaWdfbm9kZSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlJTklUX0xJU1RfSEVBRCgmb3JpZ19ub2RlLT5uZWlnaF9saXN0KTsKLQotCW1lbWNweShvcmlnX25vZGUtPm9yaWcsIGFkZHIsIEVUSF9BTEVOKTsKLQlvcmlnX25vZGUtPnJvdXRlciA9IE5VTEw7Ci0Jb3JpZ19ub2RlLT5obmFfYnVmZiA9IE5VTEw7Ci0Jb3JpZ19ub2RlLT5iY2FzdF9zZXFub19yZXNldCA9IGppZmZpZXMgLSAxCi0JCQkJCS0gbXNlY3NfdG9famlmZmllcyhSRVNFVF9QUk9URUNUSU9OX01TKTsKLQlvcmlnX25vZGUtPmJhdG1hbl9zZXFub19yZXNldCA9IGppZmZpZXMgLSAxCi0JCQkJCS0gbXNlY3NfdG9famlmZmllcyhSRVNFVF9QUk9URUNUSU9OX01TKTsKLQotCXNpemUgPSBiYXRfcHJpdi0+bnVtX2lmYWNlcyAqIHNpemVvZihUWVBFX09GX1dPUkQpICogTlVNX1dPUkRTOwotCi0Jb3JpZ19ub2RlLT5iY2FzdF9vd24gPSBremFsbG9jKHNpemUsIEdGUF9BVE9NSUMpOwotCWlmICghb3JpZ19ub2RlLT5iY2FzdF9vd24pCi0JCWdvdG8gZnJlZV9vcmlnX25vZGU7Ci0KLQlzaXplID0gYmF0X3ByaXYtPm51bV9pZmFjZXMgKiBzaXplb2YodWludDhfdCk7Ci0Jb3JpZ19ub2RlLT5iY2FzdF9vd25fc3VtID0ga3phbGxvYyhzaXplLCBHRlBfQVRPTUlDKTsKLQotCUlOSVRfTElTVF9IRUFEKCZvcmlnX25vZGUtPmZyYWdfbGlzdCk7Ci0Jb3JpZ19ub2RlLT5sYXN0X2ZyYWdfcGFja2V0ID0gMDsKLQotCWlmICghb3JpZ19ub2RlLT5iY2FzdF9vd25fc3VtKQotCQlnb3RvIGZyZWVfYmNhc3Rfb3duOwotCi0JaWYgKGhhc2hfYWRkKGJhdF9wcml2LT5vcmlnX2hhc2gsIG9yaWdfbm9kZSkgPCAwKQotCQlnb3RvIGZyZWVfYmNhc3Rfb3duX3N1bTsKLQotCWlmIChiYXRfcHJpdi0+b3JpZ19oYXNoLT5lbGVtZW50cyAqIDQgPiBiYXRfcHJpdi0+b3JpZ19oYXNoLT5zaXplKSB7Ci0JCXN3YXBoYXNoID0gaGFzaF9yZXNpemUoYmF0X3ByaXYtPm9yaWdfaGFzaCwKLQkJCQkgICAgICAgYmF0X3ByaXYtPm9yaWdfaGFzaC0+c2l6ZSAqIDIpOwotCi0JCWlmICghc3dhcGhhc2gpCi0JCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LAotCQkJCSJDb3VsZG4ndCByZXNpemUgb3JpZyBoYXNoIHRhYmxlXG4iKTsKLQkJZWxzZQotCQkJYmF0X3ByaXYtPm9yaWdfaGFzaCA9IHN3YXBoYXNoOwotCX0KLQotCXJldHVybiBvcmlnX25vZGU7Ci1mcmVlX2JjYXN0X293bl9zdW06Ci0Ja2ZyZWUob3JpZ19ub2RlLT5iY2FzdF9vd25fc3VtKTsKLWZyZWVfYmNhc3Rfb3duOgotCWtmcmVlKG9yaWdfbm9kZS0+YmNhc3Rfb3duKTsKLWZyZWVfb3JpZ19ub2RlOgotCWtmcmVlKG9yaWdfbm9kZSk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBib29sIHB1cmdlX29yaWdfbmVpZ2hib3JzKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkJIHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwKLQkJCQkgc3RydWN0IG5laWdoX25vZGUgKipiZXN0X25laWdoX25vZGUpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGlzdF9wb3MsICpsaXN0X3Bvc190bXA7Ci0Jc3RydWN0IG5laWdoX25vZGUgKm5laWdoX25vZGU7Ci0JYm9vbCBuZWlnaF9wdXJnZWQgPSBmYWxzZTsKLQotCSpiZXN0X25laWdoX25vZGUgPSBOVUxMOwotCi0JLyogZm9yIGFsbCBuZWlnaGJvcnMgdG93YXJkcyB0aGlzIG9yaWdpbmF0b3IgLi4uICovCi0JbGlzdF9mb3JfZWFjaF9zYWZlKGxpc3RfcG9zLCBsaXN0X3Bvc190bXAsICZvcmlnX25vZGUtPm5laWdoX2xpc3QpIHsKLQkJbmVpZ2hfbm9kZSA9IGxpc3RfZW50cnkobGlzdF9wb3MsIHN0cnVjdCBuZWlnaF9ub2RlLCBsaXN0KTsKLQotCQlpZiAoKHRpbWVfYWZ0ZXIoamlmZmllcywKLQkJCW5laWdoX25vZGUtPmxhc3RfdmFsaWQgKyBQVVJHRV9USU1FT1VUICogSFopKSB8fAotCQkgICAgKG5laWdoX25vZGUtPmlmX2luY29taW5nLT5pZl9zdGF0dXMgPT0gSUZfSU5BQ1RJVkUpIHx8Ci0JCSAgICAobmVpZ2hfbm9kZS0+aWZfaW5jb21pbmctPmlmX3N0YXR1cyA9PSBJRl9UT19CRV9SRU1PVkVEKSkgewotCi0JCQlpZiAobmVpZ2hfbm9kZS0+aWZfaW5jb21pbmctPmlmX3N0YXR1cyA9PQotCQkJCQkJCUlGX1RPX0JFX1JFTU9WRUQpCi0JCQkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJCQkJIm5laWdoYm9yIHB1cmdlOiBvcmlnaW5hdG9yICVwTSwgIgotCQkJCQkibmVpZ2hib3I6ICVwTSwgaWZhY2U6ICVzXG4iLAotCQkJCQlvcmlnX25vZGUtPm9yaWcsIG5laWdoX25vZGUtPmFkZHIsCi0JCQkJCW5laWdoX25vZGUtPmlmX2luY29taW5nLT5uZXRfZGV2LT5uYW1lKTsKLQkJCWVsc2UKLQkJCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LAotCQkJCQkibmVpZ2hib3IgdGltZW91dDogb3JpZ2luYXRvciAlcE0sICIKLQkJCQkJIm5laWdoYm9yOiAlcE0sIGxhc3RfdmFsaWQ6ICVsdVxuIiwKLQkJCQkJb3JpZ19ub2RlLT5vcmlnLCBuZWlnaF9ub2RlLT5hZGRyLAotCQkJCQkobmVpZ2hfbm9kZS0+bGFzdF92YWxpZCAvIEhaKSk7Ci0KLQkJCW5laWdoX3B1cmdlZCA9IHRydWU7Ci0JCQlsaXN0X2RlbChsaXN0X3Bvcyk7Ci0JCQlrZnJlZShuZWlnaF9ub2RlKTsKLQkJfSBlbHNlIHsKLQkJCWlmICgoKmJlc3RfbmVpZ2hfbm9kZSA9PSBOVUxMKSB8fAotCQkJICAgIChuZWlnaF9ub2RlLT50cV9hdmcgPiAoKmJlc3RfbmVpZ2hfbm9kZSktPnRxX2F2ZykpCi0JCQkJKmJlc3RfbmVpZ2hfbm9kZSA9IG5laWdoX25vZGU7Ci0JCX0KLQl9Ci0JcmV0dXJuIG5laWdoX3B1cmdlZDsKLX0KLQotc3RhdGljIGJvb2wgcHVyZ2Vfb3JpZ19ub2RlKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkgICAgc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlKQotewotCXN0cnVjdCBuZWlnaF9ub2RlICpiZXN0X25laWdoX25vZGU7Ci0KLQlpZiAodGltZV9hZnRlcihqaWZmaWVzLAotCQlvcmlnX25vZGUtPmxhc3RfdmFsaWQgKyAyICogUFVSR0VfVElNRU9VVCAqIEhaKSkgewotCi0JCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCi0JCQkiT3JpZ2luYXRvciB0aW1lb3V0OiBvcmlnaW5hdG9yICVwTSwgbGFzdF92YWxpZCAlbHVcbiIsCi0JCQlvcmlnX25vZGUtPm9yaWcsIChvcmlnX25vZGUtPmxhc3RfdmFsaWQgLyBIWikpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9IGVsc2UgewotCQlpZiAocHVyZ2Vfb3JpZ19uZWlnaGJvcnMoYmF0X3ByaXYsIG9yaWdfbm9kZSwKLQkJCQkJCQkmYmVzdF9uZWlnaF9ub2RlKSkgewotCQkJdXBkYXRlX3JvdXRlcyhiYXRfcHJpdiwgb3JpZ19ub2RlLAotCQkJCSAgICAgIGJlc3RfbmVpZ2hfbm9kZSwKLQkJCQkgICAgICBvcmlnX25vZGUtPmhuYV9idWZmLAotCQkJCSAgICAgIG9yaWdfbm9kZS0+aG5hX2J1ZmZfbGVuKTsKLQkJCS8qIHVwZGF0ZSBib25kaW5nIGNhbmRpZGF0ZXMsIHdlIGNvdWxkIGhhdmUgbG9zdAotCQkJICogc29tZSBjYW5kaWRhdGVzLiAqLwotCQkJdXBkYXRlX2JvbmRpbmdfY2FuZGlkYXRlcyhiYXRfcHJpdiwgb3JpZ19ub2RlKTsKLQkJfQotCX0KLQotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIHZvaWQgX3B1cmdlX29yaWcoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKLXsKLQlIQVNISVQoaGFzaGl0KTsKLQlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQotCS8qIGZvciBhbGwgb3JpZ2lucy4uLiAqLwotCXdoaWxlIChoYXNoX2l0ZXJhdGUoYmF0X3ByaXYtPm9yaWdfaGFzaCwgJmhhc2hpdCkpIHsKLQkJb3JpZ19ub2RlID0gaGFzaGl0LmJ1Y2tldC0+ZGF0YTsKLQotCQlpZiAocHVyZ2Vfb3JpZ19ub2RlKGJhdF9wcml2LCBvcmlnX25vZGUpKSB7Ci0JCQloYXNoX3JlbW92ZV9idWNrZXQoYmF0X3ByaXYtPm9yaWdfaGFzaCwgJmhhc2hpdCk7Ci0JCQlmcmVlX29yaWdfbm9kZShvcmlnX25vZGUsIGJhdF9wcml2KTsKLQkJfQotCi0JCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIChvcmlnX25vZGUtPmxhc3RfZnJhZ19wYWNrZXQgKwotCQkJCQltc2Vjc190b19qaWZmaWVzKEZSQUdfVElNRU9VVCkpKSkKLQkJCWZyYWdfbGlzdF9mcmVlKCZvcmlnX25vZGUtPmZyYWdfbGlzdCk7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0KLX0KLQotc3RhdGljIHZvaWQgcHVyZ2Vfb3JpZyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayAqZGVsYXllZF93b3JrID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkZWxheWVkX3dvcmssIHdvcmspOwotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPQotCQljb250YWluZXJfb2YoZGVsYXllZF93b3JrLCBzdHJ1Y3QgYmF0X3ByaXYsIG9yaWdfd29yayk7Ci0KLQlfcHVyZ2Vfb3JpZyhiYXRfcHJpdik7Ci0Jc3RhcnRfcHVyZ2VfdGltZXIoYmF0X3ByaXYpOwotfQotCi12b2lkIHB1cmdlX29yaWdfcmVmKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpCi17Ci0JX3B1cmdlX29yaWcoYmF0X3ByaXYpOwotfQotCi1pbnQgb3JpZ19zZXFfcHJpbnRfdGV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQotewotCUhBU0hJVChoYXNoaXQpOwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopc2VxLT5wcml2YXRlOwotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKLQlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7Ci0Jc3RydWN0IG5laWdoX25vZGUgKm5laWdoX25vZGU7Ci0JaW50IGJhdG1hbl9jb3VudCA9IDA7Ci0JaW50IGxhc3Rfc2Vlbl9zZWNzOwotCWludCBsYXN0X3NlZW5fbXNlY3M7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICgoIWJhdF9wcml2LT5wcmltYXJ5X2lmKSB8fAotCSAgICAoYmF0X3ByaXYtPnByaW1hcnlfaWYtPmlmX3N0YXR1cyAhPSBJRl9BQ1RJVkUpKSB7Ci0JCWlmICghYmF0X3ByaXYtPnByaW1hcnlfaWYpCi0JCQlyZXR1cm4gc2VxX3ByaW50ZihzZXEsICJCQVRNQU4gbWVzaCAlcyBkaXNhYmxlZCAtICIKLQkJCQkgICAgICJwbGVhc2Ugc3BlY2lmeSBpbnRlcmZhY2VzIHRvIGVuYWJsZSBpdFxuIiwKLQkJCQkgICAgIG5ldF9kZXYtPm5hbWUpOwotCi0JCXJldHVybiBzZXFfcHJpbnRmKHNlcSwgIkJBVE1BTiBtZXNoICVzICIKLQkJCQkgICJkaXNhYmxlZCAtIHByaW1hcnkgaW50ZXJmYWNlIG5vdCBhY3RpdmVcbiIsCi0JCQkJICBuZXRfZGV2LT5uYW1lKTsKLQl9Ci0KLQlzZXFfcHJpbnRmKHNlcSwgIltCLkEuVC5NLkEuTi4gYWR2ICVzJXMsIE1haW5JRi9NQUM6ICVzLyVwTSAoJXMpXVxuIiwKLQkJICAgU09VUkNFX1ZFUlNJT04sIFJFVklTSU9OX1ZFUlNJT05fU1RSLAotCQkgICBiYXRfcHJpdi0+cHJpbWFyeV9pZi0+bmV0X2Rldi0+bmFtZSwKLQkJICAgYmF0X3ByaXYtPnByaW1hcnlfaWYtPm5ldF9kZXYtPmRldl9hZGRyLCBuZXRfZGV2LT5uYW1lKTsKLQlzZXFfcHJpbnRmKHNlcSwgIiAgJS0xNXMgJXMgKCVzLyVpKSAlMTdzIFslMTBzXTogJTIwcyAuLi5cbiIsCi0JCSAgICJPcmlnaW5hdG9yIiwgImxhc3Qtc2VlbiIsICIjIiwgVFFfTUFYX1ZBTFVFLCAiTmV4dGhvcCIsCi0JCSAgICJvdXRnb2luZ0lGIiwgIlBvdGVudGlhbCBuZXh0aG9wcyIpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCi0Jd2hpbGUgKGhhc2hfaXRlcmF0ZShiYXRfcHJpdi0+b3JpZ19oYXNoLCAmaGFzaGl0KSkgewotCi0JCW9yaWdfbm9kZSA9IGhhc2hpdC5idWNrZXQtPmRhdGE7Ci0KLQkJaWYgKCFvcmlnX25vZGUtPnJvdXRlcikKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChvcmlnX25vZGUtPnJvdXRlci0+dHFfYXZnID09IDApCi0JCQljb250aW51ZTsKLQotCQlsYXN0X3NlZW5fc2VjcyA9IGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtCi0JCQkJCQlvcmlnX25vZGUtPmxhc3RfdmFsaWQpIC8gMTAwMDsKLQkJbGFzdF9zZWVuX21zZWNzID0gamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0KLQkJCQkJCW9yaWdfbm9kZS0+bGFzdF92YWxpZCkgJSAxMDAwOwotCi0JCXNlcV9wcmludGYoc2VxLCAiJXBNICU0aS4lMDNpcyAgICglM2kpICVwTSBbJTEwc106IiwKLQkJCSAgIG9yaWdfbm9kZS0+b3JpZywgbGFzdF9zZWVuX3NlY3MsIGxhc3Rfc2Vlbl9tc2VjcywKLQkJCSAgIG9yaWdfbm9kZS0+cm91dGVyLT50cV9hdmcsIG9yaWdfbm9kZS0+cm91dGVyLT5hZGRyLAotCQkJICAgb3JpZ19ub2RlLT5yb3V0ZXItPmlmX2luY29taW5nLT5uZXRfZGV2LT5uYW1lKTsKLQotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5laWdoX25vZGUsICZvcmlnX25vZGUtPm5laWdoX2xpc3QsIGxpc3QpIHsKLQkJCXNlcV9wcmludGYoc2VxLCAiICVwTSAoJTNpKSIsIG5laWdoX25vZGUtPmFkZHIsCi0JCQkJCSAgIG5laWdoX25vZGUtPnRxX2F2Zyk7Ci0JCX0KLQotCQlzZXFfcHJpbnRmKHNlcSwgIlxuIik7Ci0JCWJhdG1hbl9jb3VudCsrOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCi0JaWYgKChiYXRtYW5fY291bnQgPT0gMCkpCi0JCXNlcV9wcmludGYoc2VxLCAiTm8gYmF0bWFuIG5vZGVzIGluIHJhbmdlIC4uLlxuIik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBvcmlnX25vZGVfYWRkX2lmKHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwgaW50IG1heF9pZl9udW0pCi17Ci0Jdm9pZCAqZGF0YV9wdHI7Ci0KLQlkYXRhX3B0ciA9IGttYWxsb2MobWF4X2lmX251bSAqIHNpemVvZihUWVBFX09GX1dPUkQpICogTlVNX1dPUkRTLAotCQkJICAgR0ZQX0FUT01JQyk7Ci0JaWYgKCFkYXRhX3B0cikgewotCQlwcl9lcnIoIkNhbid0IHJlc2l6ZSBvcmlnOiBvdXQgb2YgbWVtb3J5XG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCW1lbWNweShkYXRhX3B0ciwgb3JpZ19ub2RlLT5iY2FzdF9vd24sCi0JICAgICAgIChtYXhfaWZfbnVtIC0gMSkgKiBzaXplb2YoVFlQRV9PRl9XT1JEKSAqIE5VTV9XT1JEUyk7Ci0Ja2ZyZWUob3JpZ19ub2RlLT5iY2FzdF9vd24pOwotCW9yaWdfbm9kZS0+YmNhc3Rfb3duID0gZGF0YV9wdHI7Ci0KLQlkYXRhX3B0ciA9IGttYWxsb2MobWF4X2lmX251bSAqIHNpemVvZih1aW50OF90KSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFkYXRhX3B0cikgewotCQlwcl9lcnIoIkNhbid0IHJlc2l6ZSBvcmlnOiBvdXQgb2YgbWVtb3J5XG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCW1lbWNweShkYXRhX3B0ciwgb3JpZ19ub2RlLT5iY2FzdF9vd25fc3VtLAotCSAgICAgICAobWF4X2lmX251bSAtIDEpICogc2l6ZW9mKHVpbnQ4X3QpKTsKLQlrZnJlZShvcmlnX25vZGUtPmJjYXN0X293bl9zdW0pOwotCW9yaWdfbm9kZS0+YmNhc3Rfb3duX3N1bSA9IGRhdGFfcHRyOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBvcmlnX2hhc2hfYWRkX2lmKHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZiwgaW50IG1heF9pZl9udW0pCi17Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KGJhdG1hbl9pZi0+c29mdF9pZmFjZSk7Ci0Jc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JSEFTSElUKGhhc2hpdCk7Ci0KLQkvKiByZXNpemUgYWxsIG9yaWcgbm9kZXMgYmVjYXVzZSBvcmlnX25vZGUtPmJjYXN0X293bihfc3VtKSBkZXBlbmQgb24KLQkgKiBpZl9udW0gKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0KLQl3aGlsZSAoaGFzaF9pdGVyYXRlKGJhdF9wcml2LT5vcmlnX2hhc2gsICZoYXNoaXQpKSB7Ci0JCW9yaWdfbm9kZSA9IGhhc2hpdC5idWNrZXQtPmRhdGE7Ci0KLQkJaWYgKG9yaWdfbm9kZV9hZGRfaWYob3JpZ19ub2RlLCBtYXhfaWZfbnVtKSA9PSAtMSkKLQkJCWdvdG8gZXJyOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCXJldHVybiAwOwotCi1lcnI6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIC1FTk9NRU07Ci19Ci0KLXN0YXRpYyBpbnQgb3JpZ19ub2RlX2RlbF9pZihzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUsCi0JCSAgICAgaW50IG1heF9pZl9udW0sIGludCBkZWxfaWZfbnVtKQotewotCXZvaWQgKmRhdGFfcHRyID0gTlVMTDsKLQlpbnQgY2h1bmtfc2l6ZTsKLQotCS8qIGxhc3QgaW50ZXJmYWNlIHdhcyByZW1vdmVkICovCi0JaWYgKG1heF9pZl9udW0gPT0gMCkKLQkJZ290byBmcmVlX2JjYXN0X293bjsKLQotCWNodW5rX3NpemUgPSBzaXplb2YoVFlQRV9PRl9XT1JEKSAqIE5VTV9XT1JEUzsKLQlkYXRhX3B0ciA9IGttYWxsb2MobWF4X2lmX251bSAqIGNodW5rX3NpemUsIEdGUF9BVE9NSUMpOwotCWlmICghZGF0YV9wdHIpIHsKLQkJcHJfZXJyKCJDYW4ndCByZXNpemUgb3JpZzogb3V0IG9mIG1lbW9yeVxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKiBjb3B5IGZpcnN0IHBhcnQgKi8KLQltZW1jcHkoZGF0YV9wdHIsIG9yaWdfbm9kZS0+YmNhc3Rfb3duLCBkZWxfaWZfbnVtICogY2h1bmtfc2l6ZSk7Ci0KLQkvKiBjb3B5IHNlY29uZCBwYXJ0ICovCi0JbWVtY3B5KGRhdGFfcHRyICsgZGVsX2lmX251bSAqIGNodW5rX3NpemUsCi0JICAgICAgIG9yaWdfbm9kZS0+YmNhc3Rfb3duICsgKChkZWxfaWZfbnVtICsgMSkgKiBjaHVua19zaXplKSwKLQkgICAgICAgKG1heF9pZl9udW0gLSBkZWxfaWZfbnVtKSAqIGNodW5rX3NpemUpOwotCi1mcmVlX2JjYXN0X293bjoKLQlrZnJlZShvcmlnX25vZGUtPmJjYXN0X293bik7Ci0Jb3JpZ19ub2RlLT5iY2FzdF9vd24gPSBkYXRhX3B0cjsKLQotCWlmIChtYXhfaWZfbnVtID09IDApCi0JCWdvdG8gZnJlZV9vd25fc3VtOwotCi0JZGF0YV9wdHIgPSBrbWFsbG9jKG1heF9pZl9udW0gKiBzaXplb2YodWludDhfdCksIEdGUF9BVE9NSUMpOwotCWlmICghZGF0YV9wdHIpIHsKLQkJcHJfZXJyKCJDYW4ndCByZXNpemUgb3JpZzogb3V0IG9mIG1lbW9yeVxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQltZW1jcHkoZGF0YV9wdHIsIG9yaWdfbm9kZS0+YmNhc3Rfb3duX3N1bSwKLQkgICAgICAgZGVsX2lmX251bSAqIHNpemVvZih1aW50OF90KSk7Ci0KLQltZW1jcHkoZGF0YV9wdHIgKyBkZWxfaWZfbnVtICogc2l6ZW9mKHVpbnQ4X3QpLAotCSAgICAgICBvcmlnX25vZGUtPmJjYXN0X293bl9zdW0gKyAoKGRlbF9pZl9udW0gKyAxKSAqIHNpemVvZih1aW50OF90KSksCi0JICAgICAgIChtYXhfaWZfbnVtIC0gZGVsX2lmX251bSkgKiBzaXplb2YodWludDhfdCkpOwotCi1mcmVlX293bl9zdW06Ci0Ja2ZyZWUob3JpZ19ub2RlLT5iY2FzdF9vd25fc3VtKTsKLQlvcmlnX25vZGUtPmJjYXN0X293bl9zdW0gPSBkYXRhX3B0cjsKLQotCXJldHVybiAwOwotfQotCi1pbnQgb3JpZ19oYXNoX2RlbF9pZihzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYsIGludCBtYXhfaWZfbnVtKQotewotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihiYXRtYW5faWYtPnNvZnRfaWZhY2UpOwotCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZl90bXA7Ci0Jc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JSEFTSElUKGhhc2hpdCk7Ci0JaW50IHJldDsKLQotCS8qIHJlc2l6ZSBhbGwgb3JpZyBub2RlcyBiZWNhdXNlIG9yaWdfbm9kZS0+YmNhc3Rfb3duKF9zdW0pIGRlcGVuZCBvbgotCSAqIGlmX251bSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQotCXdoaWxlIChoYXNoX2l0ZXJhdGUoYmF0X3ByaXYtPm9yaWdfaGFzaCwgJmhhc2hpdCkpIHsKLQkJb3JpZ19ub2RlID0gaGFzaGl0LmJ1Y2tldC0+ZGF0YTsKLQotCQlyZXQgPSBvcmlnX25vZGVfZGVsX2lmKG9yaWdfbm9kZSwgbWF4X2lmX251bSwKLQkJCQkgICAgICAgYmF0bWFuX2lmLT5pZl9udW0pOwotCi0JCWlmIChyZXQgPT0gLTEpCi0JCQlnb3RvIGVycjsKLQl9Ci0KLQkvKiByZW51bWJlciByZW1haW5pbmcgYmF0bWFuIGludGVyZmFjZXMgX2luc2lkZV8gb2Ygb3JpZ19oYXNoX2xvY2sgKi8KLQlyY3VfcmVhZF9sb2NrKCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoYmF0bWFuX2lmX3RtcCwgJmlmX2xpc3QsIGxpc3QpIHsKLQkJaWYgKGJhdG1hbl9pZl90bXAtPmlmX3N0YXR1cyA9PSBJRl9OT1RfSU5fVVNFKQotCQkJY29udGludWU7Ci0KLQkJaWYgKGJhdG1hbl9pZiA9PSBiYXRtYW5faWZfdG1wKQotCQkJY29udGludWU7Ci0KLQkJaWYgKGJhdG1hbl9pZi0+c29mdF9pZmFjZSAhPSBiYXRtYW5faWZfdG1wLT5zb2Z0X2lmYWNlKQotCQkJY29udGludWU7Ci0KLQkJaWYgKGJhdG1hbl9pZl90bXAtPmlmX251bSA+IGJhdG1hbl9pZi0+aWZfbnVtKQotCQkJYmF0bWFuX2lmX3RtcC0+aWZfbnVtLS07Ci0JfQotCXJjdV9yZWFkX3VubG9jaygpOwotCi0JYmF0bWFuX2lmLT5pZl9udW0gPSAtMTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gMDsKLQotZXJyOgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCXJldHVybiAtRU5PTUVNOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvb3JpZ2luYXRvci5oIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvb3JpZ2luYXRvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTdjNDAwNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9vcmlnaW5hdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKLSAqCi0gKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxLCBVU0EKLSAqCi0gKi8KLQotI2lmbmRlZiBfTkVUX0JBVE1BTl9BRFZfT1JJR0lOQVRPUl9IXwotI2RlZmluZSBfTkVUX0JBVE1BTl9BRFZfT1JJR0lOQVRPUl9IXwotCi1pbnQgb3JpZ2luYXRvcl9pbml0KHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpOwotdm9pZCBvcmlnaW5hdG9yX2ZyZWUoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdik7Ci12b2lkIHB1cmdlX29yaWdfcmVmKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpOwotc3RydWN0IG9yaWdfbm9kZSAqZ2V0X29yaWdfbm9kZShzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LCB1aW50OF90ICphZGRyKTsKLXN0cnVjdCBuZWlnaF9ub2RlICoKLWNyZWF0ZV9uZWlnaGJvcihzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUsIHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbmVpZ2hfbm9kZSwKLQkJdWludDhfdCAqbmVpZ2gsIHN0cnVjdCBiYXRtYW5faWYgKmlmX2luY29taW5nKTsKLWludCBvcmlnX3NlcV9wcmludF90ZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpOwotaW50IG9yaWdfaGFzaF9hZGRfaWYoc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmLCBpbnQgbWF4X2lmX251bSk7Ci1pbnQgb3JpZ19oYXNoX2RlbF9pZihzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYsIGludCBtYXhfaWZfbnVtKTsKLQotI2VuZGlmIC8qIF9ORVRfQkFUTUFOX0FEVl9PUklHSU5BVE9SX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9wYWNrZXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3BhY2tldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjkzMzgzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3BhY2tldC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgotICoKLSAqIE1hcmVrIExpbmRuZXIsIFNpbW9uIFd1bmRlcmxpY2gKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVTQQotICoKLSAqLwotCi0jaWZuZGVmIF9ORVRfQkFUTUFOX0FEVl9QQUNLRVRfSF8KLSNkZWZpbmUgX05FVF9CQVRNQU5fQURWX1BBQ0tFVF9IXwotCi0jZGVmaW5lIEVUSF9QX0JBVE1BTiAgMHg0MzA1CS8qIHVub2ZmaWNpYWwvbm90IHJlZ2lzdGVyZWQgRXRoZXJ0eXBlICovCi0KLSNkZWZpbmUgQkFUX1BBQ0tFVCAgICAgICAweDAxCi0jZGVmaW5lIEJBVF9JQ01QICAgICAgICAgMHgwMgotI2RlZmluZSBCQVRfVU5JQ0FTVCAgICAgIDB4MDMKLSNkZWZpbmUgQkFUX0JDQVNUICAgICAgICAweDA0Ci0jZGVmaW5lIEJBVF9WSVMgICAgICAgICAgMHgwNQotI2RlZmluZSBCQVRfVU5JQ0FTVF9GUkFHIDB4MDYKLQotLyogdGhpcyBmaWxlIGlzIGluY2x1ZGVkIGJ5IGJhdGN0bCB3aGljaCBuZWVkcyB0aGVzZSBkZWZpbmVzICovCi0jZGVmaW5lIENPTVBBVF9WRVJTSU9OIDEzCi0jZGVmaW5lIERJUkVDVExJTksgMHg0MAotI2RlZmluZSBWSVNfU0VSVkVSIDB4MjAKLSNkZWZpbmUgUFJJTUFSSUVTX0ZJUlNUX0hPUCAweDEwCi0KLS8qIElDTVAgbWVzc2FnZSB0eXBlcyAqLwotI2RlZmluZSBFQ0hPX1JFUExZIDAKLSNkZWZpbmUgREVTVElOQVRJT05fVU5SRUFDSEFCTEUgMwotI2RlZmluZSBFQ0hPX1JFUVVFU1QgOAotI2RlZmluZSBUVExfRVhDRUVERUQgMTEKLSNkZWZpbmUgUEFSQU1FVEVSX1BST0JMRU0gMTIKLQotLyogdmlzIGRlZmluZXMgKi8KLSNkZWZpbmUgVklTX1RZUEVfU0VSVkVSX1NZTkMJCTAKLSNkZWZpbmUgVklTX1RZUEVfQ0xJRU5UX1VQREFURQkJMQotCi0vKiBmcmFnbWVudGF0aW9uIGRlZmluZXMgKi8KLSNkZWZpbmUgVU5JX0ZSQUdfSEVBRCAweDAxCi0KLXN0cnVjdCBiYXRtYW5fcGFja2V0IHsKLQl1aW50OF90ICBwYWNrZXRfdHlwZTsKLQl1aW50OF90ICB2ZXJzaW9uOyAgLyogYmF0bWFuIHZlcnNpb24gZmllbGQgKi8KLQl1aW50OF90ICBmbGFnczsgICAgLyogMHg0MDogRElSRUNUTElOSyBmbGFnLCAweDIwIFZJU19TRVJWRVIgZmxhZy4uLiAqLwotCXVpbnQ4X3QgIHRxOwotCXVpbnQzMl90IHNlcW5vOwotCXVpbnQ4X3QgIG9yaWdbNl07Ci0JdWludDhfdCAgcHJldl9zZW5kZXJbNl07Ci0JdWludDhfdCAgdHRsOwotCXVpbnQ4X3QgIG51bV9obmE7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0jZGVmaW5lIEJBVF9QQUNLRVRfTEVOIHNpemVvZihzdHJ1Y3QgYmF0bWFuX3BhY2tldCkKLQotc3RydWN0IGljbXBfcGFja2V0IHsKLQl1aW50OF90ICBwYWNrZXRfdHlwZTsKLQl1aW50OF90ICB2ZXJzaW9uOyAgLyogYmF0bWFuIHZlcnNpb24gZmllbGQgKi8KLQl1aW50OF90ICBtc2dfdHlwZTsgLyogc2VlIElDTVAgbWVzc2FnZSB0eXBlcyBhYm92ZSAqLwotCXVpbnQ4X3QgIHR0bDsKLQl1aW50OF90ICBkc3RbNl07Ci0JdWludDhfdCAgb3JpZ1s2XTsKLQl1aW50MTZfdCBzZXFubzsKLQl1aW50OF90ICB1aWQ7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0jZGVmaW5lIEJBVF9SUl9MRU4gMTYKLQotLyogaWNtcF9wYWNrZXRfcnIgbXVzdCBzdGFydCB3aXRoIGFsbCBmaWVsZHMgZnJvbSBpbWNwX3BhY2tldAotICogYXMgdGhpcyBpcyBhc3N1bWVkIGJ5IGNvZGUgdGhhdCBoYW5kbGVzIElDTVAgcGFja2V0cyAqLwotc3RydWN0IGljbXBfcGFja2V0X3JyIHsKLQl1aW50OF90ICBwYWNrZXRfdHlwZTsKLQl1aW50OF90ICB2ZXJzaW9uOyAgLyogYmF0bWFuIHZlcnNpb24gZmllbGQgKi8KLQl1aW50OF90ICBtc2dfdHlwZTsgLyogc2VlIElDTVAgbWVzc2FnZSB0eXBlcyBhYm92ZSAqLwotCXVpbnQ4X3QgIHR0bDsKLQl1aW50OF90ICBkc3RbNl07Ci0JdWludDhfdCAgb3JpZ1s2XTsKLQl1aW50MTZfdCBzZXFubzsKLQl1aW50OF90ICB1aWQ7Ci0JdWludDhfdCAgcnJfY3VyOwotCXVpbnQ4X3QgIHJyW0JBVF9SUl9MRU5dW0VUSF9BTEVOXTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCB1bmljYXN0X3BhY2tldCB7Ci0JdWludDhfdCAgcGFja2V0X3R5cGU7Ci0JdWludDhfdCAgdmVyc2lvbjsgIC8qIGJhdG1hbiB2ZXJzaW9uIGZpZWxkICovCi0JdWludDhfdCAgZGVzdFs2XTsKLQl1aW50OF90ICB0dGw7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3QgdW5pY2FzdF9mcmFnX3BhY2tldCB7Ci0JdWludDhfdCAgcGFja2V0X3R5cGU7Ci0JdWludDhfdCAgdmVyc2lvbjsgIC8qIGJhdG1hbiB2ZXJzaW9uIGZpZWxkICovCi0JdWludDhfdCAgZGVzdFs2XTsKLQl1aW50OF90ICB0dGw7Ci0JdWludDhfdCAgZmxhZ3M7Ci0JdWludDhfdCAgb3JpZ1s2XTsKLQl1aW50MTZfdCBzZXFubzsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCBiY2FzdF9wYWNrZXQgewotCXVpbnQ4X3QgIHBhY2tldF90eXBlOwotCXVpbnQ4X3QgIHZlcnNpb247ICAvKiBiYXRtYW4gdmVyc2lvbiBmaWVsZCAqLwotCXVpbnQ4X3QgIG9yaWdbNl07Ci0JdWludDhfdCAgdHRsOwotCXVpbnQzMl90IHNlcW5vOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RydWN0IHZpc19wYWNrZXQgewotCXVpbnQ4X3QgIHBhY2tldF90eXBlOwotCXVpbnQ4X3QgIHZlcnNpb247ICAgICAgICAvKiBiYXRtYW4gdmVyc2lvbiBmaWVsZCAqLwotCXVpbnQ4X3QgIHZpc190eXBlOwkgLyogd2hpY2ggdHlwZSBvZiB2aXMtcGFydGljaXBhbnQgc2VudCB0aGlzPyAqLwotCXVpbnQ4X3QgIGVudHJpZXM7CSAvKiBudW1iZXIgb2YgZW50cmllcyBiZWhpbmQgdGhpcyBzdHJ1Y3QgKi8KLQl1aW50MzJfdCBzZXFubzsJCSAvKiBzZXF1ZW5jZSBudW1iZXIgKi8KLQl1aW50OF90ICB0dGw7CQkgLyogVFRMICovCi0JdWludDhfdCAgdmlzX29yaWdbNl07CSAvKiBvcmlnaW5hdG9yIHRoYXQgaW5mb3JtcyBhYm91dCBpdHMKLQkJCQkgICogbmVpZ2hib3JzICovCi0JdWludDhfdCAgdGFyZ2V0X29yaWdbNl07IC8qIHdobyBzaG91bGQgcmVjZWl2ZSB0aGlzIHBhY2tldCAqLwotCXVpbnQ4X3QgIHNlbmRlcl9vcmlnWzZdOyAvKiB3aG8gc2VudCBvciByZWJyb2FkY2FzdGVkIHRoaXMgcGFja2V0ICovCi19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0jZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX1BBQ0tFVF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvcmluZ19idWZmZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3JpbmdfYnVmZmVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlZmQzN2MuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvcmluZ19idWZmZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgotICoKLSAqIE1hcmVrIExpbmRuZXIKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVTQQotICoKLSAqLwotCi0jaW5jbHVkZSAibWFpbi5oIgotI2luY2x1ZGUgInJpbmdfYnVmZmVyLmgiCi0KLXZvaWQgcmluZ19idWZmZXJfc2V0KHVpbnQ4X3QgbHFfcmVjdltdLCB1aW50OF90ICpscV9pbmRleCwgdWludDhfdCB2YWx1ZSkKLXsKLQlscV9yZWN2WypscV9pbmRleF0gPSB2YWx1ZTsKLQkqbHFfaW5kZXggPSAoKmxxX2luZGV4ICsgMSkgJSBUUV9HTE9CQUxfV0lORE9XX1NJWkU7Ci19Ci0KLXVpbnQ4X3QgcmluZ19idWZmZXJfYXZnKHVpbnQ4X3QgbHFfcmVjdltdKQotewotCXVpbnQ4X3QgKnB0cjsKLQl1aW50MTZfdCBjb3VudCA9IDAsIGkgPSAwLCBzdW0gPSAwOwotCi0JcHRyID0gbHFfcmVjdjsKLQotCXdoaWxlIChpIDwgVFFfR0xPQkFMX1dJTkRPV19TSVpFKSB7Ci0JCWlmICgqcHRyICE9IDApIHsKLQkJCWNvdW50Kys7Ci0JCQlzdW0gKz0gKnB0cjsKLQkJfQotCi0JCWkrKzsKLQkJcHRyKys7Ci0JfQotCi0JaWYgKGNvdW50ID09IDApCi0JCXJldHVybiAwOwotCi0JcmV0dXJuICh1aW50OF90KShzdW0gLyBjb3VudCk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9yaW5nX2J1ZmZlci5oIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvcmluZ19idWZmZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIwY2I5YS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9yaW5nX2J1ZmZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6Ci0gKgotICogTWFyZWsgTGluZG5lcgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotICogMDIxMTAtMTMwMSwgVVNBCi0gKgotICovCi0KLSNpZm5kZWYgX05FVF9CQVRNQU5fQURWX1JJTkdfQlVGRkVSX0hfCi0jZGVmaW5lIF9ORVRfQkFUTUFOX0FEVl9SSU5HX0JVRkZFUl9IXwotCi12b2lkIHJpbmdfYnVmZmVyX3NldCh1aW50OF90IGxxX3JlY3ZbXSwgdWludDhfdCAqbHFfaW5kZXgsIHVpbnQ4X3QgdmFsdWUpOwotdWludDhfdCByaW5nX2J1ZmZlcl9hdmcodWludDhfdCBscV9yZWN2W10pOwotCi0jZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX1JJTkdfQlVGRkVSX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9yb3V0aW5nLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9yb3V0aW5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1N2I2OWUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvcm91dGluZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM4OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKLSAqCi0gKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxLCBVU0EKLSAqCi0gKi8KLQotI2luY2x1ZGUgIm1haW4uaCIKLSNpbmNsdWRlICJyb3V0aW5nLmgiCi0jaW5jbHVkZSAic2VuZC5oIgotI2luY2x1ZGUgImhhc2guaCIKLSNpbmNsdWRlICJzb2Z0LWludGVyZmFjZS5oIgotI2luY2x1ZGUgImhhcmQtaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiaWNtcF9zb2NrZXQuaCIKLSNpbmNsdWRlICJ0cmFuc2xhdGlvbi10YWJsZS5oIgotI2luY2x1ZGUgIm9yaWdpbmF0b3IuaCIKLSNpbmNsdWRlICJ0eXBlcy5oIgotI2luY2x1ZGUgInJpbmdfYnVmZmVyLmgiCi0jaW5jbHVkZSAidmlzLmgiCi0jaW5jbHVkZSAiYWdncmVnYXRpb24uaCIKLSNpbmNsdWRlICJ1bmljYXN0LmgiCi0KLXZvaWQgc2xpZGVfb3duX2JjYXN0X3dpbmRvdyhzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYpCi17Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KGJhdG1hbl9pZi0+c29mdF9pZmFjZSk7Ci0JSEFTSElUKGhhc2hpdCk7Ci0Jc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOwotCVRZUEVfT0ZfV09SRCAqd29yZDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCi0Jd2hpbGUgKGhhc2hfaXRlcmF0ZShiYXRfcHJpdi0+b3JpZ19oYXNoLCAmaGFzaGl0KSkgewotCQlvcmlnX25vZGUgPSBoYXNoaXQuYnVja2V0LT5kYXRhOwotCQl3b3JkID0gJihvcmlnX25vZGUtPmJjYXN0X293bltiYXRtYW5faWYtPmlmX251bSAqIE5VTV9XT1JEU10pOwotCi0JCWJpdF9nZXRfcGFja2V0KGJhdF9wcml2LCB3b3JkLCAxLCAwKTsKLQkJb3JpZ19ub2RlLT5iY2FzdF9vd25fc3VtW2JhdG1hbl9pZi0+aWZfbnVtXSA9Ci0JCQliaXRfcGFja2V0X2NvdW50KHdvcmQpOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCB1cGRhdGVfSE5BKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsIHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwKLQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKmhuYV9idWZmLCBpbnQgaG5hX2J1ZmZfbGVuKQotewotCWlmICgoaG5hX2J1ZmZfbGVuICE9IG9yaWdfbm9kZS0+aG5hX2J1ZmZfbGVuKSB8fAotCSAgICAoKGhuYV9idWZmX2xlbiA+IDApICYmCi0JICAgICAob3JpZ19ub2RlLT5obmFfYnVmZl9sZW4gPiAwKSAmJgotCSAgICAgKG1lbWNtcChvcmlnX25vZGUtPmhuYV9idWZmLCBobmFfYnVmZiwgaG5hX2J1ZmZfbGVuKSAhPSAwKSkpIHsKLQotCQlpZiAob3JpZ19ub2RlLT5obmFfYnVmZl9sZW4gPiAwKQotCQkJaG5hX2dsb2JhbF9kZWxfb3JpZyhiYXRfcHJpdiwgb3JpZ19ub2RlLAotCQkJCQkgICAgIm9yaWdpbmF0b3IgY2hhbmdlZCBobmEiKTsKLQotCQlpZiAoKGhuYV9idWZmX2xlbiA+IDApICYmIChobmFfYnVmZiAhPSBOVUxMKSkKLQkJCWhuYV9nbG9iYWxfYWRkX29yaWcoYmF0X3ByaXYsIG9yaWdfbm9kZSwKLQkJCQkJICAgIGhuYV9idWZmLCBobmFfYnVmZl9sZW4pOwotCX0KLX0KLQotc3RhdGljIHZvaWQgdXBkYXRlX3JvdXRlKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkgc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLAotCQkJIHN0cnVjdCBuZWlnaF9ub2RlICpuZWlnaF9ub2RlLAotCQkJIHVuc2lnbmVkIGNoYXIgKmhuYV9idWZmLCBpbnQgaG5hX2J1ZmZfbGVuKQotewotCS8qIHJvdXRlIGRlbGV0ZWQgKi8KLQlpZiAoKG9yaWdfbm9kZS0+cm91dGVyICE9IE5VTEwpICYmIChuZWlnaF9ub2RlID09IE5VTEwpKSB7Ci0KLQkJYmF0X2RiZyhEQkdfUk9VVEVTLCBiYXRfcHJpdiwgIkRlbGV0aW5nIHJvdXRlIHRvd2FyZHM6ICVwTVxuIiwKLQkJCW9yaWdfbm9kZS0+b3JpZyk7Ci0JCWhuYV9nbG9iYWxfZGVsX29yaWcoYmF0X3ByaXYsIG9yaWdfbm9kZSwKLQkJCQkgICAgIm9yaWdpbmF0b3IgdGltZWQgb3V0Iik7Ci0KLQkJLyogcm91dGUgYWRkZWQgKi8KLQl9IGVsc2UgaWYgKChvcmlnX25vZGUtPnJvdXRlciA9PSBOVUxMKSAmJiAobmVpZ2hfbm9kZSAhPSBOVUxMKSkgewotCi0JCWJhdF9kYmcoREJHX1JPVVRFUywgYmF0X3ByaXYsCi0JCQkiQWRkaW5nIHJvdXRlIHRvd2FyZHM6ICVwTSAodmlhICVwTSlcbiIsCi0JCQlvcmlnX25vZGUtPm9yaWcsIG5laWdoX25vZGUtPmFkZHIpOwotCQlobmFfZ2xvYmFsX2FkZF9vcmlnKGJhdF9wcml2LCBvcmlnX25vZGUsCi0JCQkJICAgIGhuYV9idWZmLCBobmFfYnVmZl9sZW4pOwotCi0JCS8qIHJvdXRlIGNoYW5nZWQgKi8KLQl9IGVsc2UgewotCQliYXRfZGJnKERCR19ST1VURVMsIGJhdF9wcml2LAotCQkJIkNoYW5naW5nIHJvdXRlIHRvd2FyZHM6ICVwTSAiCi0JCQkiKG5vdyB2aWEgJXBNIC0gd2FzIHZpYSAlcE0pXG4iLAotCQkJb3JpZ19ub2RlLT5vcmlnLCBuZWlnaF9ub2RlLT5hZGRyLAotCQkJb3JpZ19ub2RlLT5yb3V0ZXItPmFkZHIpOwotCX0KLQotCW9yaWdfbm9kZS0+cm91dGVyID0gbmVpZ2hfbm9kZTsKLX0KLQotCi12b2lkIHVwZGF0ZV9yb3V0ZXMoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwgc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLAotCQkgICBzdHJ1Y3QgbmVpZ2hfbm9kZSAqbmVpZ2hfbm9kZSwgdW5zaWduZWQgY2hhciAqaG5hX2J1ZmYsCi0JCSAgIGludCBobmFfYnVmZl9sZW4pCi17Ci0KLQlpZiAob3JpZ19ub2RlID09IE5VTEwpCi0JCXJldHVybjsKLQotCWlmIChvcmlnX25vZGUtPnJvdXRlciAhPSBuZWlnaF9ub2RlKQotCQl1cGRhdGVfcm91dGUoYmF0X3ByaXYsIG9yaWdfbm9kZSwgbmVpZ2hfbm9kZSwKLQkJCSAgICAgaG5hX2J1ZmYsIGhuYV9idWZmX2xlbik7Ci0JLyogbWF5IGJlIGp1c3QgSE5BIGNoYW5nZWQgKi8KLQllbHNlCi0JCXVwZGF0ZV9ITkEoYmF0X3ByaXYsIG9yaWdfbm9kZSwgaG5hX2J1ZmYsIGhuYV9idWZmX2xlbik7Ci19Ci0KLXN0YXRpYyBpbnQgaXNfYmlkaXJlY3Rpb25hbF9uZWlnaChzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUsCi0JCQkJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19uZWlnaF9ub2RlLAotCQkJCXN0cnVjdCBiYXRtYW5fcGFja2V0ICpiYXRtYW5fcGFja2V0LAotCQkJCXN0cnVjdCBiYXRtYW5faWYgKmlmX2luY29taW5nKQotewotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihpZl9pbmNvbWluZy0+c29mdF9pZmFjZSk7Ci0Jc3RydWN0IG5laWdoX25vZGUgKm5laWdoX25vZGUgPSBOVUxMLCAqdG1wX25laWdoX25vZGUgPSBOVUxMOwotCXVuc2lnbmVkIGNoYXIgdG90YWxfY291bnQ7Ci0KLQlpZiAob3JpZ19ub2RlID09IG9yaWdfbmVpZ2hfbm9kZSkgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcF9uZWlnaF9ub2RlLAotCQkJCSAgICAmb3JpZ19ub2RlLT5uZWlnaF9saXN0LAotCQkJCSAgICBsaXN0KSB7Ci0KLQkJCWlmIChjb21wYXJlX29yaWcodG1wX25laWdoX25vZGUtPmFkZHIsCi0JCQkJCSBvcmlnX25laWdoX25vZGUtPm9yaWcpICYmCi0JCQkgICAgKHRtcF9uZWlnaF9ub2RlLT5pZl9pbmNvbWluZyA9PSBpZl9pbmNvbWluZykpCi0JCQkJbmVpZ2hfbm9kZSA9IHRtcF9uZWlnaF9ub2RlOwotCQl9Ci0KLQkJaWYgKCFuZWlnaF9ub2RlKQotCQkJbmVpZ2hfbm9kZSA9IGNyZWF0ZV9uZWlnaGJvcihvcmlnX25vZGUsCi0JCQkJCQkgICAgIG9yaWdfbmVpZ2hfbm9kZSwKLQkJCQkJCSAgICAgb3JpZ19uZWlnaF9ub2RlLT5vcmlnLAotCQkJCQkJICAgICBpZl9pbmNvbWluZyk7Ci0JCS8qIGNyZWF0ZV9uZWlnaGJvciBmYWlsZWQsIHJldHVybiAwICovCi0JCWlmICghbmVpZ2hfbm9kZSkKLQkJCXJldHVybiAwOwotCi0JCW5laWdoX25vZGUtPmxhc3RfdmFsaWQgPSBqaWZmaWVzOwotCX0gZWxzZSB7Ci0JCS8qIGZpbmQgcGFja2V0IGNvdW50IG9mIGNvcnJlc3BvbmRpbmcgb25lIGhvcCBuZWlnaGJvciAqLwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcF9uZWlnaF9ub2RlLAotCQkJCSAgICAmb3JpZ19uZWlnaF9ub2RlLT5uZWlnaF9saXN0LCBsaXN0KSB7Ci0KLQkJCWlmIChjb21wYXJlX29yaWcodG1wX25laWdoX25vZGUtPmFkZHIsCi0JCQkJCSBvcmlnX25laWdoX25vZGUtPm9yaWcpICYmCi0JCQkgICAgKHRtcF9uZWlnaF9ub2RlLT5pZl9pbmNvbWluZyA9PSBpZl9pbmNvbWluZykpCi0JCQkJbmVpZ2hfbm9kZSA9IHRtcF9uZWlnaF9ub2RlOwotCQl9Ci0KLQkJaWYgKCFuZWlnaF9ub2RlKQotCQkJbmVpZ2hfbm9kZSA9IGNyZWF0ZV9uZWlnaGJvcihvcmlnX25laWdoX25vZGUsCi0JCQkJCQkgICAgIG9yaWdfbmVpZ2hfbm9kZSwKLQkJCQkJCSAgICAgb3JpZ19uZWlnaF9ub2RlLT5vcmlnLAotCQkJCQkJICAgICBpZl9pbmNvbWluZyk7Ci0JCS8qIGNyZWF0ZV9uZWlnaGJvciBmYWlsZWQsIHJldHVybiAwICovCi0JCWlmICghbmVpZ2hfbm9kZSkKLQkJCXJldHVybiAwOwotCX0KLQotCW9yaWdfbm9kZS0+bGFzdF92YWxpZCA9IGppZmZpZXM7Ci0KLQkvKiBwYXkgYXR0ZW50aW9uIHRvIG5vdCBnZXQgYSB2YWx1ZSBiaWdnZXIgdGhhbiAxMDAgJSAqLwotCXRvdGFsX2NvdW50ID0gKG9yaWdfbmVpZ2hfbm9kZS0+YmNhc3Rfb3duX3N1bVtpZl9pbmNvbWluZy0+aWZfbnVtXSA+Ci0JCSAgICAgICBuZWlnaF9ub2RlLT5yZWFsX3BhY2tldF9jb3VudCA/Ci0JCSAgICAgICBuZWlnaF9ub2RlLT5yZWFsX3BhY2tldF9jb3VudCA6Ci0JCSAgICAgICBvcmlnX25laWdoX25vZGUtPmJjYXN0X293bl9zdW1baWZfaW5jb21pbmctPmlmX251bV0pOwotCi0JLyogaWYgd2UgaGF2ZSB0b28gZmV3IHBhY2tldHMgKHRvbyBsZXNzIGRhdGEpIHdlIHNldCB0cV9vd24gdG8gemVybyAqLwotCS8qIGlmIHdlIHJlY2VpdmUgdG9vIGZldyBwYWNrZXRzIGl0IGlzIG5vdCBjb25zaWRlcmVkIGJpZGlyZWN0aW9uYWwgKi8KLQlpZiAoKHRvdGFsX2NvdW50IDwgVFFfTE9DQUxfQklEUkVDVF9TRU5EX01JTklNVU0pIHx8Ci0JICAgIChuZWlnaF9ub2RlLT5yZWFsX3BhY2tldF9jb3VudCA8IFRRX0xPQ0FMX0JJRFJFQ1RfUkVDVl9NSU5JTVVNKSkKLQkJb3JpZ19uZWlnaF9ub2RlLT50cV9vd24gPSAwOwotCWVsc2UKLQkJLyogbmVpZ2hfbm9kZS0+cmVhbF9wYWNrZXRfY291bnQgaXMgbmV2ZXIgemVybyBhcyB3ZQotCQkgKiBvbmx5IHB1cmdlIG9sZCBpbmZvcm1hdGlvbiB3aGVuIGdldHRpbmcgbmV3Ci0JCSAqIGluZm9ybWF0aW9uICovCi0JCW9yaWdfbmVpZ2hfbm9kZS0+dHFfb3duID0gKFRRX01BWF9WQUxVRSAqIHRvdGFsX2NvdW50KSAvCi0JCQluZWlnaF9ub2RlLT5yZWFsX3BhY2tldF9jb3VudDsKLQotCS8qCi0JICogMSAtICgoMS14KSAqKiAzKSwgbm9ybWFsaXplZCB0byBUUV9NQVhfVkFMVUUgdGhpcyBkb2VzCi0JICogYWZmZWN0IHRoZSBuZWFybHktc3ltbWV0cmljIGxpbmtzIG9ubHkgYSBsaXR0bGUsIGJ1dAotCSAqIHB1bmlzaGVzIGFzeW1tZXRyaWMgbGlua3MgbW9yZS4gIFRoaXMgd2lsbCBnaXZlIGEgdmFsdWUKLQkgKiBiZXR3ZWVuIDAgYW5kIFRRX01BWF9WQUxVRQotCSAqLwotCW9yaWdfbmVpZ2hfbm9kZS0+dHFfYXN5bV9wZW5hbHR5ID0KLQkJVFFfTUFYX1ZBTFVFIC0KLQkJKFRRX01BWF9WQUxVRSAqCi0JCSAoVFFfTE9DQUxfV0lORE9XX1NJWkUgLSBuZWlnaF9ub2RlLT5yZWFsX3BhY2tldF9jb3VudCkgKgotCQkgKFRRX0xPQ0FMX1dJTkRPV19TSVpFIC0gbmVpZ2hfbm9kZS0+cmVhbF9wYWNrZXRfY291bnQpICoKLQkJIChUUV9MT0NBTF9XSU5ET1dfU0laRSAtIG5laWdoX25vZGUtPnJlYWxfcGFja2V0X2NvdW50KSkgLwotCQkoVFFfTE9DQUxfV0lORE9XX1NJWkUgKgotCQkgVFFfTE9DQUxfV0lORE9XX1NJWkUgKgotCQkgVFFfTE9DQUxfV0lORE9XX1NJWkUpOwotCi0JYmF0bWFuX3BhY2tldC0+dHEgPSAoKGJhdG1hbl9wYWNrZXQtPnRxICoKLQkJCSAgICAgIG9yaWdfbmVpZ2hfbm9kZS0+dHFfb3duICoKLQkJCSAgICAgIG9yaWdfbmVpZ2hfbm9kZS0+dHFfYXN5bV9wZW5hbHR5KSAvCi0JCQkgICAgIChUUV9NQVhfVkFMVUUgKiBUUV9NQVhfVkFMVUUpKTsKLQotCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCi0JCSJiaWRpcmVjdGlvbmFsOiAiCi0JCSJvcmlnID0gJS0xNXBNIG5laWdoID0gJS0xNXBNID0+IG93bl9iY2FzdCA9ICUyaSwgIgotCQkicmVhbCByZWN2ID0gJTJpLCBsb2NhbCB0cTogJTNpLCBhc3ltX3BlbmFsdHk6ICUzaSwgIgotCQkidG90YWwgdHE6ICUzaVxuIiwKLQkJb3JpZ19ub2RlLT5vcmlnLCBvcmlnX25laWdoX25vZGUtPm9yaWcsIHRvdGFsX2NvdW50LAotCQluZWlnaF9ub2RlLT5yZWFsX3BhY2tldF9jb3VudCwgb3JpZ19uZWlnaF9ub2RlLT50cV9vd24sCi0JCW9yaWdfbmVpZ2hfbm9kZS0+dHFfYXN5bV9wZW5hbHR5LCBiYXRtYW5fcGFja2V0LT50cSk7Ci0KLQkvKiBpZiBsaW5rIGhhcyB0aGUgbWluaW11bSByZXF1aXJlZCB0cmFuc21pc3Npb24gcXVhbGl0eQotCSAqIGNvbnNpZGVyIGl0IGJpZGlyZWN0aW9uYWwgKi8KLQlpZiAoYmF0bWFuX3BhY2tldC0+dHEgPj0gVFFfVE9UQUxfQklEUkVDVF9MSU1JVCkKLQkJcmV0dXJuIDE7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgdXBkYXRlX29yaWcoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwKLQkJCXN0cnVjdCBldGhoZHIgKmV0aGhkciwKLQkJCXN0cnVjdCBiYXRtYW5fcGFja2V0ICpiYXRtYW5fcGFja2V0LAotCQkJc3RydWN0IGJhdG1hbl9pZiAqaWZfaW5jb21pbmcsCi0JCQl1bnNpZ25lZCBjaGFyICpobmFfYnVmZiwgaW50IGhuYV9idWZmX2xlbiwKLQkJCWNoYXIgaXNfZHVwbGljYXRlKQotewotCXN0cnVjdCBuZWlnaF9ub2RlICpuZWlnaF9ub2RlID0gTlVMTCwgKnRtcF9uZWlnaF9ub2RlID0gTlVMTDsKLQlpbnQgdG1wX2huYV9idWZmX2xlbjsKLQotCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsICJ1cGRhdGVfb3JpZ2luYXRvcigpOiAiCi0JCSJTZWFyY2hpbmcgYW5kIHVwZGF0aW5nIG9yaWdpbmF0b3IgZW50cnkgb2YgcmVjZWl2ZWQgcGFja2V0XG4iKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wX25laWdoX25vZGUsICZvcmlnX25vZGUtPm5laWdoX2xpc3QsIGxpc3QpIHsKLQkJaWYgKGNvbXBhcmVfb3JpZyh0bXBfbmVpZ2hfbm9kZS0+YWRkciwgZXRoaGRyLT5oX3NvdXJjZSkgJiYKLQkJICAgICh0bXBfbmVpZ2hfbm9kZS0+aWZfaW5jb21pbmcgPT0gaWZfaW5jb21pbmcpKSB7Ci0JCQluZWlnaF9ub2RlID0gdG1wX25laWdoX25vZGU7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWlmIChpc19kdXBsaWNhdGUpCi0JCQljb250aW51ZTsKLQotCQlyaW5nX2J1ZmZlcl9zZXQodG1wX25laWdoX25vZGUtPnRxX3JlY3YsCi0JCQkJJnRtcF9uZWlnaF9ub2RlLT50cV9pbmRleCwgMCk7Ci0JCXRtcF9uZWlnaF9ub2RlLT50cV9hdmcgPQotCQkJcmluZ19idWZmZXJfYXZnKHRtcF9uZWlnaF9ub2RlLT50cV9yZWN2KTsKLQl9Ci0KLQlpZiAoIW5laWdoX25vZGUpIHsKLQkJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ190bXA7Ci0KLQkJb3JpZ190bXAgPSBnZXRfb3JpZ19ub2RlKGJhdF9wcml2LCBldGhoZHItPmhfc291cmNlKTsKLQkJaWYgKCFvcmlnX3RtcCkKLQkJCXJldHVybjsKLQotCQluZWlnaF9ub2RlID0gY3JlYXRlX25laWdoYm9yKG9yaWdfbm9kZSwgb3JpZ190bXAsCi0JCQkJCSAgICAgZXRoaGRyLT5oX3NvdXJjZSwgaWZfaW5jb21pbmcpOwotCQlpZiAoIW5laWdoX25vZGUpCi0JCQlyZXR1cm47Ci0JfSBlbHNlCi0JCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCi0JCQkiVXBkYXRpbmcgZXhpc3RpbmcgbGFzdC1ob3AgbmVpZ2hib3Igb2Ygb3JpZ2luYXRvclxuIik7Ci0KLQlvcmlnX25vZGUtPmZsYWdzID0gYmF0bWFuX3BhY2tldC0+ZmxhZ3M7Ci0JbmVpZ2hfbm9kZS0+bGFzdF92YWxpZCA9IGppZmZpZXM7Ci0KLQlyaW5nX2J1ZmZlcl9zZXQobmVpZ2hfbm9kZS0+dHFfcmVjdiwKLQkJCSZuZWlnaF9ub2RlLT50cV9pbmRleCwKLQkJCWJhdG1hbl9wYWNrZXQtPnRxKTsKLQluZWlnaF9ub2RlLT50cV9hdmcgPSByaW5nX2J1ZmZlcl9hdmcobmVpZ2hfbm9kZS0+dHFfcmVjdik7Ci0KLQlpZiAoIWlzX2R1cGxpY2F0ZSkgewotCQlvcmlnX25vZGUtPmxhc3RfdHRsID0gYmF0bWFuX3BhY2tldC0+dHRsOwotCQluZWlnaF9ub2RlLT5sYXN0X3R0bCA9IGJhdG1hbl9wYWNrZXQtPnR0bDsKLQl9Ci0KLQl0bXBfaG5hX2J1ZmZfbGVuID0gKGhuYV9idWZmX2xlbiA+IGJhdG1hbl9wYWNrZXQtPm51bV9obmEgKiBFVEhfQUxFTiA/Ci0JCQkgICAgYmF0bWFuX3BhY2tldC0+bnVtX2huYSAqIEVUSF9BTEVOIDogaG5hX2J1ZmZfbGVuKTsKLQotCS8qIGlmIHRoaXMgbmVpZ2hib3IgYWxyZWFkeSBpcyBvdXIgbmV4dCBob3AgdGhlcmUgaXMgbm90aGluZwotCSAqIHRvIGNoYW5nZSAqLwotCWlmIChvcmlnX25vZGUtPnJvdXRlciA9PSBuZWlnaF9ub2RlKQotCQlnb3RvIHVwZGF0ZV9obmE7Ci0KLQkvKiBpZiB0aGlzIG5laWdoYm9yIGRvZXMgbm90IG9mZmVyIGEgYmV0dGVyIFRRIHdlIHdvbid0IGNvbnNpZGVyIGl0ICovCi0JaWYgKChvcmlnX25vZGUtPnJvdXRlcikgJiYKLQkgICAgKG9yaWdfbm9kZS0+cm91dGVyLT50cV9hdmcgPiBuZWlnaF9ub2RlLT50cV9hdmcpKQotCQlnb3RvIHVwZGF0ZV9obmE7Ci0KLQkvKiBpZiB0aGUgVFEgaXMgdGhlIHNhbWUgYW5kIHRoZSBsaW5rIG5vdCBtb3JlIHN5bWV0cmljIHdlCi0JICogd29uJ3QgY29uc2lkZXIgaXQgZWl0aGVyICovCi0JaWYgKChvcmlnX25vZGUtPnJvdXRlcikgJiYKLQkgICAgICgobmVpZ2hfbm9kZS0+dHFfYXZnID09IG9yaWdfbm9kZS0+cm91dGVyLT50cV9hdmcpICYmCi0JICAgICAob3JpZ19ub2RlLT5yb3V0ZXItPm9yaWdfbm9kZS0+YmNhc3Rfb3duX3N1bVtpZl9pbmNvbWluZy0+aWZfbnVtXQotCSAgICAgID49IG5laWdoX25vZGUtPm9yaWdfbm9kZS0+YmNhc3Rfb3duX3N1bVtpZl9pbmNvbWluZy0+aWZfbnVtXSkpKQotCQlnb3RvIHVwZGF0ZV9obmE7Ci0KLQl1cGRhdGVfcm91dGVzKGJhdF9wcml2LCBvcmlnX25vZGUsIG5laWdoX25vZGUsCi0JCSAgICAgIGhuYV9idWZmLCB0bXBfaG5hX2J1ZmZfbGVuKTsKLQlyZXR1cm47Ci0KLXVwZGF0ZV9obmE6Ci0JdXBkYXRlX3JvdXRlcyhiYXRfcHJpdiwgb3JpZ19ub2RlLCBvcmlnX25vZGUtPnJvdXRlciwKLQkJICAgICAgaG5hX2J1ZmYsIHRtcF9obmFfYnVmZl9sZW4pOwotfQotCi0vKiBjaGVja3Mgd2hldGhlciB0aGUgaG9zdCByZXN0YXJ0ZWQgYW5kIGlzIGluIHRoZSBwcm90ZWN0aW9uIHRpbWUuCi0gKiByZXR1cm5zOgotICogIDAgaWYgdGhlIHBhY2tldCBpcyB0byBiZSBhY2NlcHRlZAotICogIDEgaWYgdGhlIHBhY2tldCBpcyB0byBiZSBpZ25vcmVkLgotICovCi1zdGF0aWMgaW50IHdpbmRvd19wcm90ZWN0ZWQoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCSAgICBpbnQzMl90IHNlcV9udW1fZGlmZiwKLQkJCSAgICB1bnNpZ25lZCBsb25nICpsYXN0X3Jlc2V0KQotewotCWlmICgoc2VxX251bV9kaWZmIDw9IC1UUV9MT0NBTF9XSU5ET1dfU0laRSkKLQkJfHwgKHNlcV9udW1fZGlmZiA+PSBFWFBFQ1RFRF9TRVFOT19SQU5HRSkpIHsKLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgKmxhc3RfcmVzZXQgKwotCQkJbXNlY3NfdG9famlmZmllcyhSRVNFVF9QUk9URUNUSU9OX01TKSkpIHsKLQotCQkJKmxhc3RfcmVzZXQgPSBqaWZmaWVzOwotCQkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJCQkib2xkIHBhY2tldCByZWNlaXZlZCwgc3RhcnQgcHJvdGVjdGlvblxuIik7Ci0KLQkJCXJldHVybiAwOwotCQl9IGVsc2UKLQkJCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyogcHJvY2Vzc2VzIGEgYmF0bWFuIHBhY2tldCBmb3IgYWxsIGludGVyZmFjZXMsIGFkanVzdHMgdGhlIHNlcXVlbmNlIG51bWJlciBhbmQKLSAqIGZpbmRzIG91dCB3aGV0aGVyIGl0IGlzIGEgZHVwbGljYXRlLgotICogcmV0dXJuczoKLSAqICAgMSB0aGUgcGFja2V0IGlzIGEgZHVwbGljYXRlCi0gKiAgIDAgdGhlIHBhY2tldCBoYXMgbm90IHlldCBiZWVuIHJlY2VpdmVkCi0gKiAgLTEgdGhlIHBhY2tldCBpcyBvbGQgYW5kIGhhcyBiZWVuIHJlY2VpdmVkIHdoaWxlIHRoZSBzZXFubyB3aW5kb3cKLSAqICAgICB3YXMgcHJvdGVjdGVkLiBDYWxsZXIgc2hvdWxkIGRyb3AgaXQuCi0gKi8KLXN0YXRpYyBjaGFyIGNvdW50X3JlYWxfcGFja2V0cyhzdHJ1Y3QgZXRoaGRyICpldGhoZHIsCi0JCQkgICAgICAgc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQsCi0JCQkgICAgICAgc3RydWN0IGJhdG1hbl9pZiAqaWZfaW5jb21pbmcpCi17Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KGlmX2luY29taW5nLT5zb2Z0X2lmYWNlKTsKLQlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7Ci0Jc3RydWN0IG5laWdoX25vZGUgKnRtcF9uZWlnaF9ub2RlOwotCWNoYXIgaXNfZHVwbGljYXRlID0gMDsKLQlpbnQzMl90IHNlcV9kaWZmOwotCWludCBuZWVkX3VwZGF0ZSA9IDA7Ci0JaW50IHNldF9tYXJrOwotCi0Jb3JpZ19ub2RlID0gZ2V0X29yaWdfbm9kZShiYXRfcHJpdiwgYmF0bWFuX3BhY2tldC0+b3JpZyk7Ci0JaWYgKG9yaWdfbm9kZSA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQotCXNlcV9kaWZmID0gYmF0bWFuX3BhY2tldC0+c2Vxbm8gLSBvcmlnX25vZGUtPmxhc3RfcmVhbF9zZXFubzsKLQotCS8qIHNpZ25hbGl6ZSBjYWxsZXIgdGhhdCB0aGUgcGFja2V0IGlzIHRvIGJlIGRyb3BwZWQuICovCi0JaWYgKHdpbmRvd19wcm90ZWN0ZWQoYmF0X3ByaXYsIHNlcV9kaWZmLAotCQkJICAgICAmb3JpZ19ub2RlLT5iYXRtYW5fc2Vxbm9fcmVzZXQpKQotCQlyZXR1cm4gLTE7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcF9uZWlnaF9ub2RlLCAmb3JpZ19ub2RlLT5uZWlnaF9saXN0LCBsaXN0KSB7Ci0KLQkJaXNfZHVwbGljYXRlIHw9IGdldF9iaXRfc3RhdHVzKHRtcF9uZWlnaF9ub2RlLT5yZWFsX2JpdHMsCi0JCQkJCSAgICAgICBvcmlnX25vZGUtPmxhc3RfcmVhbF9zZXFubywKLQkJCQkJICAgICAgIGJhdG1hbl9wYWNrZXQtPnNlcW5vKTsKLQotCQlpZiAoY29tcGFyZV9vcmlnKHRtcF9uZWlnaF9ub2RlLT5hZGRyLCBldGhoZHItPmhfc291cmNlKSAmJgotCQkgICAgKHRtcF9uZWlnaF9ub2RlLT5pZl9pbmNvbWluZyA9PSBpZl9pbmNvbWluZykpCi0JCQlzZXRfbWFyayA9IDE7Ci0JCWVsc2UKLQkJCXNldF9tYXJrID0gMDsKLQotCQkvKiBpZiB0aGUgd2luZG93IG1vdmVkLCBzZXQgdGhlIHVwZGF0ZSBmbGFnLiAqLwotCQluZWVkX3VwZGF0ZSB8PSBiaXRfZ2V0X3BhY2tldChiYXRfcHJpdiwKLQkJCQkJICAgICAgdG1wX25laWdoX25vZGUtPnJlYWxfYml0cywKLQkJCQkJICAgICAgc2VxX2RpZmYsIHNldF9tYXJrKTsKLQotCQl0bXBfbmVpZ2hfbm9kZS0+cmVhbF9wYWNrZXRfY291bnQgPQotCQkJYml0X3BhY2tldF9jb3VudCh0bXBfbmVpZ2hfbm9kZS0+cmVhbF9iaXRzKTsKLQl9Ci0KLQlpZiAobmVlZF91cGRhdGUpIHsKLQkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJCSJ1cGRhdGluZyBsYXN0X3NlcW5vOiBvbGQgJWQsIG5ldyAlZFxuIiwKLQkJCW9yaWdfbm9kZS0+bGFzdF9yZWFsX3NlcW5vLCBiYXRtYW5fcGFja2V0LT5zZXFubyk7Ci0JCW9yaWdfbm9kZS0+bGFzdF9yZWFsX3NlcW5vID0gYmF0bWFuX3BhY2tldC0+c2Vxbm87Ci0JfQotCi0JcmV0dXJuIGlzX2R1cGxpY2F0ZTsKLX0KLQotLyogY29weSBwcmltYXJ5IGFkZHJlc3MgZm9yIGJvbmRpbmcgKi8KLXN0YXRpYyB2b2lkIG1hcmtfYm9uZGluZ19hZGRyZXNzKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkJIHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwKLQkJCQkgc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19uZWlnaF9ub2RlLAotCQkJCSBzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldCkKLQotewotCWlmIChiYXRtYW5fcGFja2V0LT5mbGFncyAmIFBSSU1BUklFU19GSVJTVF9IT1ApCi0JCW1lbWNweShvcmlnX25laWdoX25vZGUtPnByaW1hcnlfYWRkciwKLQkJICAgICAgIG9yaWdfbm9kZS0+b3JpZywgRVRIX0FMRU4pOwotCi0JcmV0dXJuOwotfQotCi0vKiBtYXJrIHBvc3NpYmxlIGJvbmQuY2FuZGlkYXRlcyBpbiB0aGUgbmVpZ2hib3IgbGlzdCAqLwotdm9pZCB1cGRhdGVfYm9uZGluZ19jYW5kaWRhdGVzKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkgICAgICAgc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlKQotewotCWludCBjYW5kaWRhdGVzOwotCWludCBpbnRlcmZlcmVuY2VfY2FuZGlkYXRlOwotCWludCBiZXN0X3RxOwotCXN0cnVjdCBuZWlnaF9ub2RlICp0bXBfbmVpZ2hfbm9kZSwgKnRtcF9uZWlnaF9ub2RlMjsKLQlzdHJ1Y3QgbmVpZ2hfbm9kZSAqZmlyc3RfY2FuZGlkYXRlLCAqbGFzdF9jYW5kaWRhdGU7Ci0KLQkvKiB1cGRhdGUgdGhlIGNhbmRpZGF0ZXMgZm9yIHRoaXMgb3JpZ2luYXRvciAqLwotCWlmICghb3JpZ19ub2RlLT5yb3V0ZXIpIHsKLQkJb3JpZ19ub2RlLT5ib25kLmNhbmRpZGF0ZXMgPSAwOwotCQlyZXR1cm47Ci0JfQotCi0JYmVzdF90cSA9IG9yaWdfbm9kZS0+cm91dGVyLT50cV9hdmc7Ci0KLQkvKiB1cGRhdGUgYm9uZC5jYW5kaWRhdGVzICovCi0KLQljYW5kaWRhdGVzID0gMDsKLQotCS8qIG1hcmsgb3RoZXIgbm9kZXMgd2hpY2ggYWxzbyByZWNlaXZlZCAiUFJJTUFSSUVTIEZJUlNUIEhPUCIgcGFja2V0cwotCSAqIGFzICJib25kaW5nIHBhcnRuZXIiICovCi0KLQkvKiBmaXJzdCwgemVybyB0aGUgbGlzdCAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wX25laWdoX25vZGUsICZvcmlnX25vZGUtPm5laWdoX2xpc3QsIGxpc3QpIHsKLQkJdG1wX25laWdoX25vZGUtPm5leHRfYm9uZF9jYW5kaWRhdGUgPSBOVUxMOwotCX0KLQotCWZpcnN0X2NhbmRpZGF0ZSA9IE5VTEw7Ci0JbGFzdF9jYW5kaWRhdGUgPSBOVUxMOwotCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wX25laWdoX25vZGUsICZvcmlnX25vZGUtPm5laWdoX2xpc3QsIGxpc3QpIHsKLQotCQkvKiBvbmx5IGNvbnNpZGVyIGlmIGl0IGhhcyB0aGUgc2FtZSBwcmltYXJ5IGFkZHJlc3MgLi4uICAqLwotCQlpZiAobWVtY21wKG9yaWdfbm9kZS0+b3JpZywKLQkJCQl0bXBfbmVpZ2hfbm9kZS0+b3JpZ19ub2RlLT5wcmltYXJ5X2FkZHIsCi0JCQkJRVRIX0FMRU4pICE9IDApCi0JCQljb250aW51ZTsKLQotCQkvKiAuLi4gYW5kIGlzIGdvb2QgZW5vdWdoIHRvIGJlIGNvbnNpZGVyZWQgKi8KLQkJaWYgKHRtcF9uZWlnaF9ub2RlLT50cV9hdmcgPCBiZXN0X3RxIC0gQk9ORElOR19UUV9USFJFU0hPTEQpCi0JCQljb250aW51ZTsKLQotCQkvKiBjaGVjayBpZiB3ZSBoYXZlIGFub3RoZXIgY2FuZGlkYXRlIHdpdGggdGhlIHNhbWUKLQkJICogbWFjIGFkZHJlc3Mgb3IgaW50ZXJmYWNlLiBJZiB3ZSBkbywgd2Ugd29uJ3QKLQkJICogc2VsZWN0IHRoaXMgY2FuZGlkYXRlIGJlY2F1c2Ugb2YgcG9zc2libGUgaW50ZXJmZXJlbmNlLiAqLwotCi0JCWludGVyZmVyZW5jZV9jYW5kaWRhdGUgPSAwOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcF9uZWlnaF9ub2RlMiwKLQkJCQkmb3JpZ19ub2RlLT5uZWlnaF9saXN0LCBsaXN0KSB7Ci0KLQkJCWlmICh0bXBfbmVpZ2hfbm9kZTIgPT0gdG1wX25laWdoX25vZGUpCi0JCQkJY29udGludWU7Ci0KLQkJCS8qIHdlIG9ubHkgY2FyZSBpZiB0aGUgb3RoZXIgY2FuZGlkYXRlIGlzIGV2ZW4KLQkJCSAqIGNvbnNpZGVyZWQgYXMgY2FuZGlkYXRlLiAqLwotCQkJaWYgKHRtcF9uZWlnaF9ub2RlMi0+bmV4dF9ib25kX2NhbmRpZGF0ZSA9PSBOVUxMKQotCQkJCWNvbnRpbnVlOwotCi0KLQkJCWlmICgodG1wX25laWdoX25vZGUtPmlmX2luY29taW5nID09Ci0JCQkJdG1wX25laWdoX25vZGUyLT5pZl9pbmNvbWluZykKLQkJCQl8fCAobWVtY21wKHRtcF9uZWlnaF9ub2RlLT5hZGRyLAotCQkJCXRtcF9uZWlnaF9ub2RlMi0+YWRkciwgRVRIX0FMRU4pID09IDApKSB7Ci0KLQkJCQlpbnRlcmZlcmVuY2VfY2FuZGlkYXRlID0gMTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkvKiBkb24ndCBjYXJlIGZ1cnRoZXIgaWYgaXQgaXMgYW4gaW50ZXJmZXJlbmNlIGNhbmRpZGF0ZSAqLwotCQlpZiAoaW50ZXJmZXJlbmNlX2NhbmRpZGF0ZSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChmaXJzdF9jYW5kaWRhdGUgPT0gTlVMTCkgewotCQkJZmlyc3RfY2FuZGlkYXRlID0gdG1wX25laWdoX25vZGU7Ci0JCQl0bXBfbmVpZ2hfbm9kZS0+bmV4dF9ib25kX2NhbmRpZGF0ZSA9IGZpcnN0X2NhbmRpZGF0ZTsKLQkJfSBlbHNlCi0JCQl0bXBfbmVpZ2hfbm9kZS0+bmV4dF9ib25kX2NhbmRpZGF0ZSA9IGxhc3RfY2FuZGlkYXRlOwotCi0JCWxhc3RfY2FuZGlkYXRlID0gdG1wX25laWdoX25vZGU7Ci0KLQkJY2FuZGlkYXRlcysrOwotCX0KLQotCWlmIChjYW5kaWRhdGVzID4gMCkgewotCQlmaXJzdF9jYW5kaWRhdGUtPm5leHRfYm9uZF9jYW5kaWRhdGUgPSBsYXN0X2NhbmRpZGF0ZTsKLQkJb3JpZ19ub2RlLT5ib25kLnNlbGVjdGVkID0gZmlyc3RfY2FuZGlkYXRlOwotCX0KLQotCW9yaWdfbm9kZS0+Ym9uZC5jYW5kaWRhdGVzID0gY2FuZGlkYXRlczsKLX0KLQotdm9pZCByZWNlaXZlX2JhdF9wYWNrZXQoc3RydWN0IGV0aGhkciAqZXRoaGRyLAotCQkJCXN0cnVjdCBiYXRtYW5fcGFja2V0ICpiYXRtYW5fcGFja2V0LAotCQkJCXVuc2lnbmVkIGNoYXIgKmhuYV9idWZmLCBpbnQgaG5hX2J1ZmZfbGVuLAotCQkJCXN0cnVjdCBiYXRtYW5faWYgKmlmX2luY29taW5nKQotewotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihpZl9pbmNvbWluZy0+c29mdF9pZmFjZSk7Ci0Jc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOwotCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbmVpZ2hfbm9kZSwgKm9yaWdfbm9kZTsKLQljaGFyIGhhc19kaXJlY3RsaW5rX2ZsYWc7Ci0JY2hhciBpc19teV9hZGRyID0gMCwgaXNfbXlfb3JpZyA9IDAsIGlzX215X29sZG9yaWcgPSAwOwotCWNoYXIgaXNfYnJvYWRjYXN0ID0gMCwgaXNfYmlkaXJlY3Rpb25hbCwgaXNfc2luZ2xlX2hvcF9uZWlnaDsKLQljaGFyIGlzX2R1cGxpY2F0ZTsKLQl1aW50MzJfdCBpZl9pbmNvbWluZ19zZXFubzsKLQotCS8qIFNpbGVudGx5IGRyb3Agd2hlbiB0aGUgYmF0bWFuIHBhY2tldCBpcyBhY3R1YWxseSBub3QgYQotCSAqIGNvcnJlY3QgcGFja2V0LgotCSAqCi0JICogVGhpcyBtaWdodCBoYXBwZW4gaWYgYSBwYWNrZXQgaXMgcGFkZGVkIChlLmcuIEV0aGVybmV0IGhhcyBhCi0JICogbWluaW11bSBmcmFtZSBsZW5ndGggb2YgNjQgYnl0ZSkgYW5kIHRoZSBhZ2dyZWdhdGlvbiBpbnRlcnByZXRzCi0JICogaXQgYXMgYW4gYWRkaXRpb25hbCBsZW5ndGguCi0JICoKLQkgKiBUT0RPOiBBIG1vcmUgc2FuZSBzb2x1dGlvbiB3b3VsZCBiZSB0byBoYXZlIGEgYml0IGluIHRoZQotCSAqIGJhdG1hbl9wYWNrZXQgdG8gZGV0ZWN0IHdoZXRoZXIgdGhlIHBhY2tldCBpcyB0aGUgbGFzdAotCSAqIHBhY2tldCBpbiBhbiBhZ2dyZWdhdGlvbi4gIEhlcmUgd2UgZXhwZWN0IHRoYXQgdGhlIHBhZGRpbmcKLQkgKiBpcyBhbHdheXMgemVybyAob3Igbm90IDB4MDEpCi0JICovCi0JaWYgKGJhdG1hbl9wYWNrZXQtPnBhY2tldF90eXBlICE9IEJBVF9QQUNLRVQpCi0JCXJldHVybjsKLQotCS8qIGNvdWxkIGJlIGNoYW5nZWQgYnkgc2NoZWR1bGVfb3duX3BhY2tldCgpICovCi0JaWZfaW5jb21pbmdfc2Vxbm8gPSBhdG9taWNfcmVhZCgmaWZfaW5jb21pbmctPnNlcW5vKTsKLQotCWhhc19kaXJlY3RsaW5rX2ZsYWcgPSAoYmF0bWFuX3BhY2tldC0+ZmxhZ3MgJiBESVJFQ1RMSU5LID8gMSA6IDApOwotCi0JaXNfc2luZ2xlX2hvcF9uZWlnaCA9IChjb21wYXJlX29yaWcoZXRoaGRyLT5oX3NvdXJjZSwKLQkJCQkJICAgIGJhdG1hbl9wYWNrZXQtPm9yaWcpID8gMSA6IDApOwotCi0JYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJIlJlY2VpdmVkIEJBVE1BTiBwYWNrZXQgdmlhIE5COiAlcE0sIElGOiAlcyBbJXBNXSAiCi0JCSIoZnJvbSBPRzogJXBNLCB2aWEgcHJldiBPRzogJXBNLCBzZXFubyAlZCwgdHEgJWQsICIKLQkJIlRUTCAlZCwgViAlZCwgSURGICVkKVxuIiwKLQkJZXRoaGRyLT5oX3NvdXJjZSwgaWZfaW5jb21pbmctPm5ldF9kZXYtPm5hbWUsCi0JCWlmX2luY29taW5nLT5uZXRfZGV2LT5kZXZfYWRkciwgYmF0bWFuX3BhY2tldC0+b3JpZywKLQkJYmF0bWFuX3BhY2tldC0+cHJldl9zZW5kZXIsIGJhdG1hbl9wYWNrZXQtPnNlcW5vLAotCQliYXRtYW5fcGFja2V0LT50cSwgYmF0bWFuX3BhY2tldC0+dHRsLCBiYXRtYW5fcGFja2V0LT52ZXJzaW9uLAotCQloYXNfZGlyZWN0bGlua19mbGFnKTsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShiYXRtYW5faWYsICZpZl9saXN0LCBsaXN0KSB7Ci0JCWlmIChiYXRtYW5faWYtPmlmX3N0YXR1cyAhPSBJRl9BQ1RJVkUpCi0JCQljb250aW51ZTsKLQotCQlpZiAoYmF0bWFuX2lmLT5zb2Z0X2lmYWNlICE9IGlmX2luY29taW5nLT5zb2Z0X2lmYWNlKQotCQkJY29udGludWU7Ci0KLQkJaWYgKGNvbXBhcmVfb3JpZyhldGhoZHItPmhfc291cmNlLAotCQkJCSBiYXRtYW5faWYtPm5ldF9kZXYtPmRldl9hZGRyKSkKLQkJCWlzX215X2FkZHIgPSAxOwotCi0JCWlmIChjb21wYXJlX29yaWcoYmF0bWFuX3BhY2tldC0+b3JpZywKLQkJCQkgYmF0bWFuX2lmLT5uZXRfZGV2LT5kZXZfYWRkcikpCi0JCQlpc19teV9vcmlnID0gMTsKLQotCQlpZiAoY29tcGFyZV9vcmlnKGJhdG1hbl9wYWNrZXQtPnByZXZfc2VuZGVyLAotCQkJCSBiYXRtYW5faWYtPm5ldF9kZXYtPmRldl9hZGRyKSkKLQkJCWlzX215X29sZG9yaWcgPSAxOwotCi0JCWlmIChjb21wYXJlX29yaWcoZXRoaGRyLT5oX3NvdXJjZSwgYnJvYWRjYXN0X2FkZHIpKQotCQkJaXNfYnJvYWRjYXN0ID0gMTsKLQl9Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0KLQlpZiAoYmF0bWFuX3BhY2tldC0+dmVyc2lvbiAhPSBDT01QQVRfVkVSU0lPTikgewotCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LAotCQkJIkRyb3AgcGFja2V0OiBpbmNvbXBhdGlibGUgYmF0bWFuIHZlcnNpb24gKCVpKVxuIiwKLQkJCWJhdG1hbl9wYWNrZXQtPnZlcnNpb24pOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGlzX215X2FkZHIpIHsKLQkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJCSJEcm9wIHBhY2tldDogcmVjZWl2ZWQgbXkgb3duIGJyb2FkY2FzdCAoc2VuZGVyOiAlcE0iCi0JCQkiKVxuIiwKLQkJCWV0aGhkci0+aF9zb3VyY2UpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGlzX2Jyb2FkY2FzdCkgewotCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LCAiRHJvcCBwYWNrZXQ6ICIKLQkJImlnbm9yaW5nIGFsbCBwYWNrZXRzIHdpdGggYnJvYWRjYXN0IHNvdXJjZSBhZGRyIChzZW5kZXI6ICVwTSIKLQkJIilcbiIsIGV0aGhkci0+aF9zb3VyY2UpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGlzX215X29yaWcpIHsKLQkJVFlQRV9PRl9XT1JEICp3b3JkOwotCQlpbnQgb2Zmc2V0OwotCi0JCW9yaWdfbmVpZ2hfbm9kZSA9IGdldF9vcmlnX25vZGUoYmF0X3ByaXYsIGV0aGhkci0+aF9zb3VyY2UpOwotCi0JCWlmICghb3JpZ19uZWlnaF9ub2RlKQotCQkJcmV0dXJuOwotCi0JCS8qIG5laWdoYm9yIGhhcyB0byBpbmRpY2F0ZSBkaXJlY3QgbGluayBhbmQgaXQgaGFzIHRvCi0JCSAqIGNvbWUgdmlhIHRoZSBjb3JyZXNwb25kaW5nIGludGVyZmFjZSAqLwotCQkvKiBpZiByZWNlaXZlZCBzZXFubyBlcXVhbHMgbGFzdCBzZW5kIHNlcW5vIHNhdmUgbmV3Ci0JCSAqIHNlcW5vIGZvciBiaWRpcmVjdGlvbmFsIGNoZWNrICovCi0JCWlmIChoYXNfZGlyZWN0bGlua19mbGFnICYmCi0JCSAgICBjb21wYXJlX29yaWcoaWZfaW5jb21pbmctPm5ldF9kZXYtPmRldl9hZGRyLAotCQkJCSBiYXRtYW5fcGFja2V0LT5vcmlnKSAmJgotCQkgICAgKGJhdG1hbl9wYWNrZXQtPnNlcW5vIC0gaWZfaW5jb21pbmdfc2Vxbm8gKyAyID09IDApKSB7Ci0JCQlvZmZzZXQgPSBpZl9pbmNvbWluZy0+aWZfbnVtICogTlVNX1dPUkRTOwotCQkJd29yZCA9ICYob3JpZ19uZWlnaF9ub2RlLT5iY2FzdF9vd25bb2Zmc2V0XSk7Ci0JCQliaXRfbWFyayh3b3JkLCAwKTsKLQkJCW9yaWdfbmVpZ2hfbm9kZS0+YmNhc3Rfb3duX3N1bVtpZl9pbmNvbWluZy0+aWZfbnVtXSA9Ci0JCQkJYml0X3BhY2tldF9jb3VudCh3b3JkKTsKLQkJfQotCi0JCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsICJEcm9wIHBhY2tldDogIgotCQkJIm9yaWdpbmF0b3IgcGFja2V0IGZyb20gbXlzZWxmICh2aWEgbmVpZ2hib3IpXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChpc19teV9vbGRvcmlnKSB7Ci0JCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCi0JCQkiRHJvcCBwYWNrZXQ6IGlnbm9yaW5nIGFsbCByZWJyb2FkY2FzdCBlY2hvcyAoc2VuZGVyOiAiCi0JCQkiJXBNKVxuIiwgZXRoaGRyLT5oX3NvdXJjZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlvcmlnX25vZGUgPSBnZXRfb3JpZ19ub2RlKGJhdF9wcml2LCBiYXRtYW5fcGFja2V0LT5vcmlnKTsKLQlpZiAob3JpZ19ub2RlID09IE5VTEwpCi0JCXJldHVybjsKLQotCWlzX2R1cGxpY2F0ZSA9IGNvdW50X3JlYWxfcGFja2V0cyhldGhoZHIsIGJhdG1hbl9wYWNrZXQsIGlmX2luY29taW5nKTsKLQotCWlmIChpc19kdXBsaWNhdGUgPT0gLTEpIHsKLQkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJCSJEcm9wIHBhY2tldDogcGFja2V0IHdpdGhpbiBzZXFubyBwcm90ZWN0aW9uIHRpbWUgIgotCQkJIihzZW5kZXI6ICVwTSlcbiIsIGV0aGhkci0+aF9zb3VyY2UpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGJhdG1hbl9wYWNrZXQtPnRxID09IDApIHsKLQkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJCSJEcm9wIHBhY2tldDogb3JpZ2luYXRvciBwYWNrZXQgd2l0aCB0cSBlcXVhbCAwXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIGF2b2lkIHRlbXBvcmFyeSByb3V0aW5nIGxvb3BzICovCi0JaWYgKChvcmlnX25vZGUtPnJvdXRlcikgJiYKLQkgICAgKG9yaWdfbm9kZS0+cm91dGVyLT5vcmlnX25vZGUtPnJvdXRlcikgJiYKLQkgICAgKGNvbXBhcmVfb3JpZyhvcmlnX25vZGUtPnJvdXRlci0+YWRkciwKLQkJCSAgYmF0bWFuX3BhY2tldC0+cHJldl9zZW5kZXIpKSAmJgotCSAgICAhKGNvbXBhcmVfb3JpZyhiYXRtYW5fcGFja2V0LT5vcmlnLCBiYXRtYW5fcGFja2V0LT5wcmV2X3NlbmRlcikpICYmCi0JICAgIChjb21wYXJlX29yaWcob3JpZ19ub2RlLT5yb3V0ZXItPmFkZHIsCi0JCQkgIG9yaWdfbm9kZS0+cm91dGVyLT5vcmlnX25vZGUtPnJvdXRlci0+YWRkcikpKSB7Ci0JCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCi0JCQkiRHJvcCBwYWNrZXQ6IGlnbm9yaW5nIGFsbCByZWJyb2FkY2FzdCBwYWNrZXRzIHRoYXQgIgotCQkJIm1heSBtYWtlIG1lIGxvb3AgKHNlbmRlcjogJXBNKVxuIiwgZXRoaGRyLT5oX3NvdXJjZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBpZiBzZW5kZXIgaXMgYSBkaXJlY3QgbmVpZ2hib3IgdGhlIHNlbmRlciBtYWMgZXF1YWxzCi0JICogb3JpZ2luYXRvciBtYWMgKi8KLQlvcmlnX25laWdoX25vZGUgPSAoaXNfc2luZ2xlX2hvcF9uZWlnaCA/Ci0JCQkgICBvcmlnX25vZGUgOgotCQkJICAgZ2V0X29yaWdfbm9kZShiYXRfcHJpdiwgZXRoaGRyLT5oX3NvdXJjZSkpOwotCWlmIChvcmlnX25laWdoX25vZGUgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JLyogZHJvcCBwYWNrZXQgaWYgc2VuZGVyIGlzIG5vdCBhIGRpcmVjdCBuZWlnaGJvciBhbmQgaWYgd2UKLQkgKiBkb24ndCByb3V0ZSB0b3dhcmRzIGl0ICovCi0JaWYgKCFpc19zaW5nbGVfaG9wX25laWdoICYmCi0JICAgIChvcmlnX25laWdoX25vZGUtPnJvdXRlciA9PSBOVUxMKSkgewotCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LAotCQkJIkRyb3AgcGFja2V0OiBPR00gdmlhIHVua25vd24gbmVpZ2hib3IhXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWlzX2JpZGlyZWN0aW9uYWwgPSBpc19iaWRpcmVjdGlvbmFsX25laWdoKG9yaWdfbm9kZSwgb3JpZ19uZWlnaF9ub2RlLAotCQkJCQkJYmF0bWFuX3BhY2tldCwgaWZfaW5jb21pbmcpOwotCi0JLyogdXBkYXRlIHJhbmtpbmcgaWYgaXQgaXMgbm90IGEgZHVwbGljYXRlIG9yIGhhcyB0aGUgc2FtZQotCSAqIHNlcW5vIGFuZCBzaW1pbGFyIHR0bCBhcyB0aGUgbm9uLWR1cGxpY2F0ZSAqLwotCWlmIChpc19iaWRpcmVjdGlvbmFsICYmCi0JICAgICghaXNfZHVwbGljYXRlIHx8Ci0JICAgICAoKG9yaWdfbm9kZS0+bGFzdF9yZWFsX3NlcW5vID09IGJhdG1hbl9wYWNrZXQtPnNlcW5vKSAmJgotCSAgICAgIChvcmlnX25vZGUtPmxhc3RfdHRsIC0gMyA8PSBiYXRtYW5fcGFja2V0LT50dGwpKSkpCi0JCXVwZGF0ZV9vcmlnKGJhdF9wcml2LCBvcmlnX25vZGUsIGV0aGhkciwgYmF0bWFuX3BhY2tldCwKLQkJCSAgICBpZl9pbmNvbWluZywgaG5hX2J1ZmYsIGhuYV9idWZmX2xlbiwgaXNfZHVwbGljYXRlKTsKLQotCW1hcmtfYm9uZGluZ19hZGRyZXNzKGJhdF9wcml2LCBvcmlnX25vZGUsCi0JCQkgICAgIG9yaWdfbmVpZ2hfbm9kZSwgYmF0bWFuX3BhY2tldCk7Ci0JdXBkYXRlX2JvbmRpbmdfY2FuZGlkYXRlcyhiYXRfcHJpdiwgb3JpZ19ub2RlKTsKLQotCS8qIGlzIHNpbmdsZSBob3AgKGRpcmVjdCkgbmVpZ2hib3IgKi8KLQlpZiAoaXNfc2luZ2xlX2hvcF9uZWlnaCkgewotCi0JCS8qIG1hcmsgZGlyZWN0IGxpbmsgb24gaW5jb21pbmcgaW50ZXJmYWNlICovCi0JCXNjaGVkdWxlX2ZvcndhcmRfcGFja2V0KG9yaWdfbm9kZSwgZXRoaGRyLCBiYXRtYW5fcGFja2V0LAotCQkJCQkxLCBobmFfYnVmZl9sZW4sIGlmX2luY29taW5nKTsKLQotCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LCAiRm9yd2FyZGluZyBwYWNrZXQ6ICIKLQkJCSJyZWJyb2FkY2FzdCBuZWlnaGJvciBwYWNrZXQgd2l0aCBkaXJlY3QgbGluayBmbGFnXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIG11bHRpaG9wIG9yaWdpbmF0b3IgKi8KLQlpZiAoIWlzX2JpZGlyZWN0aW9uYWwpIHsKLQkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJCSJEcm9wIHBhY2tldDogbm90IHJlY2VpdmVkIHZpYSBiaWRpcmVjdGlvbmFsIGxpbmtcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGlzX2R1cGxpY2F0ZSkgewotCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LAotCQkJIkRyb3AgcGFja2V0OiBkdXBsaWNhdGUgcGFja2V0IHJlY2VpdmVkXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCi0JCSJGb3J3YXJkaW5nIHBhY2tldDogcmVicm9hZGNhc3Qgb3JpZ2luYXRvciBwYWNrZXRcbiIpOwotCXNjaGVkdWxlX2ZvcndhcmRfcGFja2V0KG9yaWdfbm9kZSwgZXRoaGRyLCBiYXRtYW5fcGFja2V0LAotCQkJCTAsIGhuYV9idWZmX2xlbiwgaWZfaW5jb21pbmcpOwotfQotCi1pbnQgcmVjdl9iYXRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZikKLXsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoYmF0bWFuX2lmLT5zb2Z0X2lmYWNlKTsKLQlzdHJ1Y3QgZXRoaGRyICpldGhoZHI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qIGRyb3AgcGFja2V0IGlmIGl0IGhhcyBub3QgbmVjZXNzYXJ5IG1pbmltdW0gc2l6ZSAqLwotCWlmICh1bmxpa2VseSghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgYmF0bWFuX3BhY2tldCkpKSkKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCi0JZXRoaGRyID0gKHN0cnVjdCBldGhoZHIgKilza2JfbWFjX2hlYWRlcihza2IpOwotCi0JLyogcGFja2V0IHdpdGggYnJvYWRjYXN0IGluZGljYXRpb24gYnV0IHVuaWNhc3QgcmVjaXBpZW50ICovCi0JaWYgKCFpc19iY2FzdChldGhoZHItPmhfZGVzdCkpCi0JCXJldHVybiBORVRfUlhfRFJPUDsKLQotCS8qIHBhY2tldCB3aXRoIGJyb2FkY2FzdCBzZW5kZXIgYWRkcmVzcyAqLwotCWlmIChpc19iY2FzdChldGhoZHItPmhfc291cmNlKSkKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCi0JLyogY3JlYXRlIGEgY29weSBvZiB0aGUgc2tiLCBpZiBuZWVkZWQsIHRvIG1vZGlmeSBpdC4gKi8KLQlpZiAoc2tiX2Nvdyhza2IsIDApIDwgMCkKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCi0JLyoga2VlcCBza2IgbGluZWFyICovCi0JaWYgKHNrYl9saW5lYXJpemUoc2tiKSA8IDApCi0JCXJldHVybiBORVRfUlhfRFJPUDsKLQotCWV0aGhkciA9IChzdHJ1Y3QgZXRoaGRyICopc2tiX21hY19oZWFkZXIoc2tiKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQlyZWNlaXZlX2FnZ3JfYmF0X3BhY2tldChldGhoZHIsCi0JCQkJc2tiLT5kYXRhLAotCQkJCXNrYl9oZWFkbGVuKHNrYiksCi0JCQkJYmF0bWFuX2lmKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQotCWtmcmVlX3NrYihza2IpOwotCXJldHVybiBORVRfUlhfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludCByZWN2X215X2ljbXBfcGFja2V0KHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc2l6ZV90IGljbXBfbGVuKQotewotCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZTsKLQlzdHJ1Y3QgaWNtcF9wYWNrZXRfcnIgKmljbXBfcGFja2V0OwotCXN0cnVjdCBldGhoZHIgKmV0aGhkcjsKLQlzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWY7Ci0JaW50IHJldDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVpbnQ4X3QgZHN0YWRkcltFVEhfQUxFTl07Ci0KLQlpY21wX3BhY2tldCA9IChzdHJ1Y3QgaWNtcF9wYWNrZXRfcnIgKilza2ItPmRhdGE7Ci0JZXRoaGRyID0gKHN0cnVjdCBldGhoZHIgKilza2JfbWFjX2hlYWRlcihza2IpOwotCi0JLyogYWRkIGRhdGEgdG8gZGV2aWNlIHF1ZXVlICovCi0JaWYgKGljbXBfcGFja2V0LT5tc2dfdHlwZSAhPSBFQ0hPX1JFUVVFU1QpIHsKLQkJYmF0X3NvY2tldF9yZWNlaXZlX3BhY2tldChpY21wX3BhY2tldCwgaWNtcF9sZW4pOwotCQlyZXR1cm4gTkVUX1JYX0RST1A7Ci0JfQotCi0JaWYgKCFiYXRfcHJpdi0+cHJpbWFyeV9pZikKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCi0JLyogYW5zd2VyIGVjaG8gcmVxdWVzdCAocGluZykgKi8KLQkvKiBnZXQgcm91dGluZyBpbmZvcm1hdGlvbiAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQlvcmlnX25vZGUgPSAoKHN0cnVjdCBvcmlnX25vZGUgKiloYXNoX2ZpbmQoYmF0X3ByaXYtPm9yaWdfaGFzaCwKLQkJCQkJCSAgIGljbXBfcGFja2V0LT5vcmlnKSk7Ci0JcmV0ID0gTkVUX1JYX0RST1A7Ci0KLQlpZiAoKG9yaWdfbm9kZSAhPSBOVUxMKSAmJgotCSAgICAob3JpZ19ub2RlLT5yb3V0ZXIgIT0gTlVMTCkpIHsKLQotCQkvKiBkb24ndCBsb2NrIHdoaWxlIHNlbmRpbmcgdGhlIHBhY2tldHMgLi4uIHdlIHRoZXJlZm9yZQotCQkgKiBjb3B5IHRoZSByZXF1aXJlZCBkYXRhIGJlZm9yZSBzZW5kaW5nICovCi0JCWJhdG1hbl9pZiA9IG9yaWdfbm9kZS0+cm91dGVyLT5pZl9pbmNvbWluZzsKLQkJbWVtY3B5KGRzdGFkZHIsIG9yaWdfbm9kZS0+cm91dGVyLT5hZGRyLCBFVEhfQUxFTik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCi0JCS8qIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIHNrYiwgaWYgbmVlZGVkLCB0byBtb2RpZnkgaXQuICovCi0JCWlmIChza2JfY293KHNrYiwgc2l6ZW9mKHN0cnVjdCBldGhoZHIpKSA8IDApCi0JCQlyZXR1cm4gTkVUX1JYX0RST1A7Ci0KLQkJaWNtcF9wYWNrZXQgPSAoc3RydWN0IGljbXBfcGFja2V0X3JyICopc2tiLT5kYXRhOwotCQlldGhoZHIgPSAoc3RydWN0IGV0aGhkciAqKXNrYl9tYWNfaGVhZGVyKHNrYik7Ci0KLQkJbWVtY3B5KGljbXBfcGFja2V0LT5kc3QsIGljbXBfcGFja2V0LT5vcmlnLCBFVEhfQUxFTik7Ci0JCW1lbWNweShpY21wX3BhY2tldC0+b3JpZywKLQkJICAgICAgIGJhdF9wcml2LT5wcmltYXJ5X2lmLT5uZXRfZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwotCQlpY21wX3BhY2tldC0+bXNnX3R5cGUgPSBFQ0hPX1JFUExZOwotCQlpY21wX3BhY2tldC0+dHRsID0gVFRMOwotCi0JCXNlbmRfc2tiX3BhY2tldChza2IsIGJhdG1hbl9pZiwgZHN0YWRkcik7Ci0JCXJldCA9IE5FVF9SWF9TVUNDRVNTOwotCi0JfSBlbHNlCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCByZWN2X2ljbXBfdHRsX2V4Y2VlZGVkKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzaXplX3QgaWNtcF9sZW4pCi17Ci0Jc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOwotCXN0cnVjdCBpY21wX3BhY2tldCAqaWNtcF9wYWNrZXQ7Ci0Jc3RydWN0IGV0aGhkciAqZXRoaGRyOwotCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZjsKLQlpbnQgcmV0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdWludDhfdCBkc3RhZGRyW0VUSF9BTEVOXTsKLQotCWljbXBfcGFja2V0ID0gKHN0cnVjdCBpY21wX3BhY2tldCAqKXNrYi0+ZGF0YTsKLQlldGhoZHIgPSAoc3RydWN0IGV0aGhkciAqKXNrYl9tYWNfaGVhZGVyKHNrYik7Ci0KLQkvKiBzZW5kIFRUTCBleGNlZWRlZCBpZiBwYWNrZXQgaXMgYW4gZWNobyByZXF1ZXN0ICh0cmFjZXJvdXRlKSAqLwotCWlmIChpY21wX3BhY2tldC0+bXNnX3R5cGUgIT0gRUNIT19SRVFVRVNUKSB7Ci0JCXByX2RlYnVnKCJXYXJuaW5nIC0gY2FuJ3QgZm9yd2FyZCBpY21wIHBhY2tldCBmcm9tICVwTSB0byAiCi0JCQkgIiVwTTogdHRsIGV4Y2VlZGVkXG4iLCBpY21wX3BhY2tldC0+b3JpZywKLQkJCSBpY21wX3BhY2tldC0+ZHN0KTsKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCX0KLQotCWlmICghYmF0X3ByaXYtPnByaW1hcnlfaWYpCi0JCXJldHVybiBORVRfUlhfRFJPUDsKLQotCS8qIGdldCByb3V0aW5nIGluZm9ybWF0aW9uICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCW9yaWdfbm9kZSA9ICgoc3RydWN0IG9yaWdfbm9kZSAqKQotCQkgICAgIGhhc2hfZmluZChiYXRfcHJpdi0+b3JpZ19oYXNoLCBpY21wX3BhY2tldC0+b3JpZykpOwotCXJldCA9IE5FVF9SWF9EUk9QOwotCi0JaWYgKChvcmlnX25vZGUgIT0gTlVMTCkgJiYKLQkgICAgKG9yaWdfbm9kZS0+cm91dGVyICE9IE5VTEwpKSB7Ci0KLQkJLyogZG9uJ3QgbG9jayB3aGlsZSBzZW5kaW5nIHRoZSBwYWNrZXRzIC4uLiB3ZSB0aGVyZWZvcmUKLQkJICogY29weSB0aGUgcmVxdWlyZWQgZGF0YSBiZWZvcmUgc2VuZGluZyAqLwotCQliYXRtYW5faWYgPSBvcmlnX25vZGUtPnJvdXRlci0+aWZfaW5jb21pbmc7Ci0JCW1lbWNweShkc3RhZGRyLCBvcmlnX25vZGUtPnJvdXRlci0+YWRkciwgRVRIX0FMRU4pOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQotCQkvKiBjcmVhdGUgYSBjb3B5IG9mIHRoZSBza2IsIGlmIG5lZWRlZCwgdG8gbW9kaWZ5IGl0LiAqLwotCQlpZiAoc2tiX2Nvdyhza2IsIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSkgPCAwKQotCQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCi0JCWljbXBfcGFja2V0ID0gKHN0cnVjdCBpY21wX3BhY2tldCAqKSBza2ItPmRhdGE7Ci0JCWV0aGhkciA9IChzdHJ1Y3QgZXRoaGRyICopc2tiX21hY19oZWFkZXIoc2tiKTsKLQotCQltZW1jcHkoaWNtcF9wYWNrZXQtPmRzdCwgaWNtcF9wYWNrZXQtPm9yaWcsIEVUSF9BTEVOKTsKLQkJbWVtY3B5KGljbXBfcGFja2V0LT5vcmlnLAotCQkgICAgICAgYmF0X3ByaXYtPnByaW1hcnlfaWYtPm5ldF9kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7Ci0JCWljbXBfcGFja2V0LT5tc2dfdHlwZSA9IFRUTF9FWENFRURFRDsKLQkJaWNtcF9wYWNrZXQtPnR0bCA9IFRUTDsKLQotCQlzZW5kX3NrYl9wYWNrZXQoc2tiLCBiYXRtYW5faWYsIGRzdGFkZHIpOwotCQlyZXQgPSBORVRfUlhfU1VDQ0VTUzsKLQotCX0gZWxzZQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLQotaW50IHJlY3ZfaWNtcF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGJhdG1hbl9pZiAqcmVjdl9pZikKLXsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYocmVjdl9pZi0+c29mdF9pZmFjZSk7Ci0Jc3RydWN0IGljbXBfcGFja2V0X3JyICppY21wX3BhY2tldDsKLQlzdHJ1Y3QgZXRoaGRyICpldGhoZHI7Ci0Jc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOwotCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZjsKLQlpbnQgaGRyX3NpemUgPSBzaXplb2Yoc3RydWN0IGljbXBfcGFja2V0KTsKLQlpbnQgcmV0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdWludDhfdCBkc3RhZGRyW0VUSF9BTEVOXTsKLQotCS8qKgotCSAqIHdlIHRydW5jYXRlIGFsbCBpbmNvbWluZyBpY21wIHBhY2tldHMgaWYgdGhleSBkb24ndCBtYXRjaCBvdXIgc2l6ZQotCSAqLwotCWlmIChza2ItPmxlbiA+PSBzaXplb2Yoc3RydWN0IGljbXBfcGFja2V0X3JyKSkKLQkJaGRyX3NpemUgPSBzaXplb2Yoc3RydWN0IGljbXBfcGFja2V0X3JyKTsKLQotCS8qIGRyb3AgcGFja2V0IGlmIGl0IGhhcyBub3QgbmVjZXNzYXJ5IG1pbmltdW0gc2l6ZSAqLwotCWlmICh1bmxpa2VseSghcHNrYl9tYXlfcHVsbChza2IsIGhkcl9zaXplKSkpCi0JCXJldHVybiBORVRfUlhfRFJPUDsKLQotCWV0aGhkciA9IChzdHJ1Y3QgZXRoaGRyICopc2tiX21hY19oZWFkZXIoc2tiKTsKLQotCS8qIHBhY2tldCB3aXRoIHVuaWNhc3QgaW5kaWNhdGlvbiBidXQgYnJvYWRjYXN0IHJlY2lwaWVudCAqLwotCWlmIChpc19iY2FzdChldGhoZHItPmhfZGVzdCkpCi0JCXJldHVybiBORVRfUlhfRFJPUDsKLQotCS8qIHBhY2tldCB3aXRoIGJyb2FkY2FzdCBzZW5kZXIgYWRkcmVzcyAqLwotCWlmIChpc19iY2FzdChldGhoZHItPmhfc291cmNlKSkKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCi0JLyogbm90IGZvciBtZSAqLwotCWlmICghaXNfbXlfbWFjKGV0aGhkci0+aF9kZXN0KSkKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCi0JaWNtcF9wYWNrZXQgPSAoc3RydWN0IGljbXBfcGFja2V0X3JyICopc2tiLT5kYXRhOwotCi0JLyogYWRkIHJlY29yZCByb3V0ZSBpbmZvcm1hdGlvbiBpZiBub3QgZnVsbCAqLwotCWlmICgoaGRyX3NpemUgPT0gc2l6ZW9mKHN0cnVjdCBpY21wX3BhY2tldF9ycikpICYmCi0JICAgIChpY21wX3BhY2tldC0+cnJfY3VyIDwgQkFUX1JSX0xFTikpIHsKLQkJbWVtY3B5KCYoaWNtcF9wYWNrZXQtPnJyW2ljbXBfcGFja2V0LT5ycl9jdXJdKSwKLQkJCWV0aGhkci0+aF9kZXN0LCBFVEhfQUxFTik7Ci0JCWljbXBfcGFja2V0LT5ycl9jdXIrKzsKLQl9Ci0KLQkvKiBwYWNrZXQgZm9yIG1lICovCi0JaWYgKGlzX215X21hYyhpY21wX3BhY2tldC0+ZHN0KSkKLQkJcmV0dXJuIHJlY3ZfbXlfaWNtcF9wYWNrZXQoYmF0X3ByaXYsIHNrYiwgaGRyX3NpemUpOwotCi0JLyogVFRMIGV4Y2VlZGVkICovCi0JaWYgKGljbXBfcGFja2V0LT50dGwgPCAyKQotCQlyZXR1cm4gcmVjdl9pY21wX3R0bF9leGNlZWRlZChiYXRfcHJpdiwgc2tiLCBoZHJfc2l6ZSk7Ci0KLQlyZXQgPSBORVRfUlhfRFJPUDsKLQotCS8qIGdldCByb3V0aW5nIGluZm9ybWF0aW9uICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCW9yaWdfbm9kZSA9ICgoc3RydWN0IG9yaWdfbm9kZSAqKQotCQkgICAgIGhhc2hfZmluZChiYXRfcHJpdi0+b3JpZ19oYXNoLCBpY21wX3BhY2tldC0+ZHN0KSk7Ci0KLQlpZiAoKG9yaWdfbm9kZSAhPSBOVUxMKSAmJgotCSAgICAob3JpZ19ub2RlLT5yb3V0ZXIgIT0gTlVMTCkpIHsKLQotCQkvKiBkb24ndCBsb2NrIHdoaWxlIHNlbmRpbmcgdGhlIHBhY2tldHMgLi4uIHdlIHRoZXJlZm9yZQotCQkgKiBjb3B5IHRoZSByZXF1aXJlZCBkYXRhIGJlZm9yZSBzZW5kaW5nICovCi0JCWJhdG1hbl9pZiA9IG9yaWdfbm9kZS0+cm91dGVyLT5pZl9pbmNvbWluZzsKLQkJbWVtY3B5KGRzdGFkZHIsIG9yaWdfbm9kZS0+cm91dGVyLT5hZGRyLCBFVEhfQUxFTik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCi0JCS8qIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIHNrYiwgaWYgbmVlZGVkLCB0byBtb2RpZnkgaXQuICovCi0JCWlmIChza2JfY293KHNrYiwgc2l6ZW9mKHN0cnVjdCBldGhoZHIpKSA8IDApCi0JCQlyZXR1cm4gTkVUX1JYX0RST1A7Ci0KLQkJaWNtcF9wYWNrZXQgPSAoc3RydWN0IGljbXBfcGFja2V0X3JyICopc2tiLT5kYXRhOwotCQlldGhoZHIgPSAoc3RydWN0IGV0aGhkciAqKXNrYl9tYWNfaGVhZGVyKHNrYik7Ci0KLQkJLyogZGVjcmVtZW50IHR0bCAqLwotCQlpY21wX3BhY2tldC0+dHRsLS07Ci0KLQkJLyogcm91dGUgaXQgKi8KLQkJc2VuZF9za2JfcGFja2V0KHNrYiwgYmF0bWFuX2lmLCBkc3RhZGRyKTsKLQkJcmV0ID0gTkVUX1JYX1NVQ0NFU1M7Ci0KLQl9IGVsc2UKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKiBmaW5kIGEgc3VpdGFibGUgcm91dGVyIGZvciB0aGlzIG9yaWdpbmF0b3IsIGFuZCB1c2UKLSAqIGJvbmRpbmcgaWYgcG9zc2libGUuICovCi1zdHJ1Y3QgbmVpZ2hfbm9kZSAqZmluZF9yb3V0ZXIoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCSAgICAgICBzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUsCi0JCQkgICAgICAgc3RydWN0IGJhdG1hbl9pZiAqcmVjdl9pZikKLXsKLQlzdHJ1Y3Qgb3JpZ19ub2RlICpwcmltYXJ5X29yaWdfbm9kZTsKLQlzdHJ1Y3Qgb3JpZ19ub2RlICpyb3V0ZXJfb3JpZzsKLQlzdHJ1Y3QgbmVpZ2hfbm9kZSAqcm91dGVyLCAqZmlyc3RfY2FuZGlkYXRlLCAqYmVzdF9yb3V0ZXI7Ci0Jc3RhdGljIHVpbnQ4X3QgemVyb19tYWNbRVRIX0FMRU5dID0gezAsIDAsIDAsIDAsIDAsIDB9OwotCWludCBib25kaW5nX2VuYWJsZWQ7Ci0KLQlpZiAoIW9yaWdfbm9kZSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAoIW9yaWdfbm9kZS0+cm91dGVyKQotCQlyZXR1cm4gTlVMTDsKLQotCS8qIHdpdGhvdXQgYm9uZGluZywgdGhlIGZpcnN0IG5vZGUgc2hvdWxkCi0JICogYWx3YXlzIGNob29zZSB0aGUgZGVmYXVsdCByb3V0ZXIuICovCi0KLQlib25kaW5nX2VuYWJsZWQgPSBhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmJvbmRpbmdfZW5hYmxlZCk7Ci0KLQlpZiAoKCFyZWN2X2lmKSAmJiAoIWJvbmRpbmdfZW5hYmxlZCkpCi0JCXJldHVybiBvcmlnX25vZGUtPnJvdXRlcjsKLQotCXJvdXRlcl9vcmlnID0gb3JpZ19ub2RlLT5yb3V0ZXItPm9yaWdfbm9kZTsKLQotCS8qIGlmIHdlIGhhdmUgc29tZXRoaW5nIGluIHRoZSBwcmltYXJ5X2FkZHIsIHdlIGNhbiBzZWFyY2gKLQkgKiBmb3IgYSBwb3RlbnRpYWwgYm9uZGluZyBjYW5kaWRhdGUuICovCi0JaWYgKG1lbWNtcChyb3V0ZXJfb3JpZy0+cHJpbWFyeV9hZGRyLCB6ZXJvX21hYywgRVRIX0FMRU4pID09IDApCi0JCXJldHVybiBvcmlnX25vZGUtPnJvdXRlcjsKLQotCS8qIGZpbmQgdGhlIG9yaWdfbm9kZSB3aGljaCBoYXMgdGhlIHByaW1hcnkgaW50ZXJmYWNlLiBtaWdodAotCSAqIGV2ZW4gYmUgdGhlIHNhbWUgYXMgb3VyIHJvdXRlcl9vcmlnIGluIG1hbnkgY2FzZXMgKi8KLQotCWlmIChtZW1jbXAocm91dGVyX29yaWctPnByaW1hcnlfYWRkciwKLQkJCQlyb3V0ZXJfb3JpZy0+b3JpZywgRVRIX0FMRU4pID09IDApIHsKLQkJcHJpbWFyeV9vcmlnX25vZGUgPSByb3V0ZXJfb3JpZzsKLQl9IGVsc2UgewotCQlwcmltYXJ5X29yaWdfbm9kZSA9IGhhc2hfZmluZChiYXRfcHJpdi0+b3JpZ19oYXNoLAotCQkJCQkJcm91dGVyX29yaWctPnByaW1hcnlfYWRkcik7Ci0KLQkJaWYgKCFwcmltYXJ5X29yaWdfbm9kZSkKLQkJCXJldHVybiBvcmlnX25vZGUtPnJvdXRlcjsKLQl9Ci0KLQkvKiB3aXRoIGxlc3MgdGhhbiAyIGNhbmRpZGF0ZXMsIHdlIGNhbid0IGRvIGFueQotCSAqIGJvbmRpbmcgYW5kIHByZWZlciB0aGUgb3JpZ2luYWwgcm91dGVyLiAqLwotCi0JaWYgKHByaW1hcnlfb3JpZ19ub2RlLT5ib25kLmNhbmRpZGF0ZXMgPCAyKQotCQlyZXR1cm4gb3JpZ19ub2RlLT5yb3V0ZXI7Ci0KLQotCS8qIGFsbCBub2RlcyBiZXR3ZWVuIHNob3VsZCBjaG9vc2UgYSBjYW5kaWRhdGUgd2hpY2gKLQkgKiBpcyBpcyBub3Qgb24gdGhlIGludGVyZmFjZSB3aGVyZSB0aGUgcGFja2V0IGNhbWUKLQkgKiBpbi4gKi8KLQlmaXJzdF9jYW5kaWRhdGUgPSBwcmltYXJ5X29yaWdfbm9kZS0+Ym9uZC5zZWxlY3RlZDsKLQlyb3V0ZXIgPSBmaXJzdF9jYW5kaWRhdGU7Ci0KLQlpZiAoYm9uZGluZ19lbmFibGVkKSB7Ci0JCS8qIGluIHRoZSBib25kaW5nIGNhc2UsIHNlbmQgdGhlIHBhY2tldHMgaW4gYSByb3VuZAotCQkgKiByb2JpbiBmYXNoaW9uIG92ZXIgdGhlIHJlbWFpbmluZyBpbnRlcmZhY2VzLiAqLwotCQlkbyB7Ci0JCQkvKiByZWN2X2lmID09IE5VTEwgb24gdGhlIGZpcnN0IG5vZGUuICovCi0JCQlpZiAocm91dGVyLT5pZl9pbmNvbWluZyAhPSByZWN2X2lmKQotCQkJCWJyZWFrOwotCi0JCQlyb3V0ZXIgPSByb3V0ZXItPm5leHRfYm9uZF9jYW5kaWRhdGU7Ci0JCX0gd2hpbGUgKHJvdXRlciAhPSBmaXJzdF9jYW5kaWRhdGUpOwotCi0JCXByaW1hcnlfb3JpZ19ub2RlLT5ib25kLnNlbGVjdGVkID0gcm91dGVyLT5uZXh0X2JvbmRfY2FuZGlkYXRlOwotCi0JfSBlbHNlIHsKLQkJLyogaWYgYm9uZGluZyBpcyBkaXNhYmxlZCwgdXNlIHRoZSBiZXN0IG9mIHRoZQotCQkgKiByZW1haW5pbmcgY2FuZGlkYXRlcyB3aGljaCBhcmUgbm90IHVzaW5nCi0JCSAqIHRoaXMgaW50ZXJmYWNlLiAqLwotCQliZXN0X3JvdXRlciA9IGZpcnN0X2NhbmRpZGF0ZTsKLQotCQlkbyB7Ci0JCQkvKiByZWN2X2lmID09IE5VTEwgb24gdGhlIGZpcnN0IG5vZGUuICovCi0JCQlpZiAoKHJvdXRlci0+aWZfaW5jb21pbmcgIT0gcmVjdl9pZikgJiYKLQkJCQkocm91dGVyLT50cV9hdmcgPiBiZXN0X3JvdXRlci0+dHFfYXZnKSkKLQkJCQkJYmVzdF9yb3V0ZXIgPSByb3V0ZXI7Ci0KLQkJCXJvdXRlciA9IHJvdXRlci0+bmV4dF9ib25kX2NhbmRpZGF0ZTsKLQkJfSB3aGlsZSAocm91dGVyICE9IGZpcnN0X2NhbmRpZGF0ZSk7Ci0KLQkJcm91dGVyID0gYmVzdF9yb3V0ZXI7Ci0JfQotCi0JcmV0dXJuIHJvdXRlcjsKLX0KLQotc3RhdGljIGludCBjaGVja191bmljYXN0X3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX3NpemUpCi17Ci0Jc3RydWN0IGV0aGhkciAqZXRoaGRyOwotCi0JLyogZHJvcCBwYWNrZXQgaWYgaXQgaGFzIG5vdCBuZWNlc3NhcnkgbWluaW11bSBzaXplICovCi0JaWYgKHVubGlrZWx5KCFwc2tiX21heV9wdWxsKHNrYiwgaGRyX3NpemUpKSkKLQkJcmV0dXJuIC0xOwotCi0JZXRoaGRyID0gKHN0cnVjdCBldGhoZHIgKilza2JfbWFjX2hlYWRlcihza2IpOwotCi0JLyogcGFja2V0IHdpdGggdW5pY2FzdCBpbmRpY2F0aW9uIGJ1dCBicm9hZGNhc3QgcmVjaXBpZW50ICovCi0JaWYgKGlzX2JjYXN0KGV0aGhkci0+aF9kZXN0KSkKLQkJcmV0dXJuIC0xOwotCi0JLyogcGFja2V0IHdpdGggYnJvYWRjYXN0IHNlbmRlciBhZGRyZXNzICovCi0JaWYgKGlzX2JjYXN0KGV0aGhkci0+aF9zb3VyY2UpKQotCQlyZXR1cm4gLTE7Ci0KLQkvKiBub3QgZm9yIG1lICovCi0JaWYgKCFpc19teV9tYWMoZXRoaGRyLT5oX2Rlc3QpKQotCQlyZXR1cm4gLTE7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCByb3V0ZV91bmljYXN0X3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCXN0cnVjdCBiYXRtYW5faWYgKnJlY3ZfaWYsIGludCBoZHJfc2l6ZSkKLXsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYocmVjdl9pZi0+c29mdF9pZmFjZSk7Ci0Jc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOwotCXN0cnVjdCBuZWlnaF9ub2RlICpyb3V0ZXI7Ci0Jc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOwotCXVpbnQ4X3QgZHN0YWRkcltFVEhfQUxFTl07Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgdW5pY2FzdF9wYWNrZXQgKnVuaWNhc3RfcGFja2V0OwotCXN0cnVjdCBldGhoZHIgKmV0aGhkciA9IChzdHJ1Y3QgZXRoaGRyICopc2tiX21hY19oZWFkZXIoc2tiKTsKLQotCXVuaWNhc3RfcGFja2V0ID0gKHN0cnVjdCB1bmljYXN0X3BhY2tldCAqKXNrYi0+ZGF0YTsKLQotCS8qIHBhY2tldCBmb3IgbWUgKi8KLQlpZiAoaXNfbXlfbWFjKHVuaWNhc3RfcGFja2V0LT5kZXN0KSkgewotCQlpbnRlcmZhY2VfcngocmVjdl9pZi0+c29mdF9pZmFjZSwgc2tiLCBoZHJfc2l6ZSk7Ci0JCXJldHVybiBORVRfUlhfU1VDQ0VTUzsKLQl9Ci0KLQkvKiBUVEwgZXhjZWVkZWQgKi8KLQlpZiAodW5pY2FzdF9wYWNrZXQtPnR0bCA8IDIpIHsKLQkJcHJfZGVidWcoIldhcm5pbmcgLSBjYW4ndCBmb3J3YXJkIHVuaWNhc3QgcGFja2V0IGZyb20gJXBNIHRvICIKLQkJCSAiJXBNOiB0dGwgZXhjZWVkZWRcbiIsIGV0aGhkci0+aF9zb3VyY2UsCi0JCQkgdW5pY2FzdF9wYWNrZXQtPmRlc3QpOwotCQlyZXR1cm4gTkVUX1JYX0RST1A7Ci0JfQotCi0JLyogZ2V0IHJvdXRpbmcgaW5mb3JtYXRpb24gKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0Jb3JpZ19ub2RlID0gKChzdHJ1Y3Qgb3JpZ19ub2RlICopCi0JCSAgICAgaGFzaF9maW5kKGJhdF9wcml2LT5vcmlnX2hhc2gsIHVuaWNhc3RfcGFja2V0LT5kZXN0KSk7Ci0KLQlyb3V0ZXIgPSBmaW5kX3JvdXRlcihiYXRfcHJpdiwgb3JpZ19ub2RlLCByZWN2X2lmKTsKLQotCWlmICghcm91dGVyKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gTkVUX1JYX0RST1A7Ci0JfQotCi0JLyogZG9uJ3QgbG9jayB3aGlsZSBzZW5kaW5nIHRoZSBwYWNrZXRzIC4uLiB3ZSB0aGVyZWZvcmUKLQkgKiBjb3B5IHRoZSByZXF1aXJlZCBkYXRhIGJlZm9yZSBzZW5kaW5nICovCi0KLQliYXRtYW5faWYgPSByb3V0ZXItPmlmX2luY29taW5nOwotCW1lbWNweShkc3RhZGRyLCByb3V0ZXItPmFkZHIsIEVUSF9BTEVOKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCi0JLyogY3JlYXRlIGEgY29weSBvZiB0aGUgc2tiLCBpZiBuZWVkZWQsIHRvIG1vZGlmeSBpdC4gKi8KLQlpZiAoc2tiX2Nvdyhza2IsIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSkgPCAwKQotCQlyZXR1cm4gTkVUX1JYX0RST1A7Ci0KLQl1bmljYXN0X3BhY2tldCA9IChzdHJ1Y3QgdW5pY2FzdF9wYWNrZXQgKilza2ItPmRhdGE7Ci0JZXRoaGRyID0gKHN0cnVjdCBldGhoZHIgKilza2JfbWFjX2hlYWRlcihza2IpOwotCi0JLyogZGVjcmVtZW50IHR0bCAqLwotCXVuaWNhc3RfcGFja2V0LT50dGwtLTsKLQotCS8qIHJvdXRlIGl0ICovCi0Jc2VuZF9za2JfcGFja2V0KHNrYiwgYmF0bWFuX2lmLCBkc3RhZGRyKTsKLQotCXJldHVybiBORVRfUlhfU1VDQ0VTUzsKLX0KLQotaW50IHJlY3ZfdW5pY2FzdF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGJhdG1hbl9pZiAqcmVjdl9pZikKLXsKLQlzdHJ1Y3QgdW5pY2FzdF9wYWNrZXQgKnVuaWNhc3RfcGFja2V0OwotCWludCBoZHJfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdW5pY2FzdF9wYWNrZXQpOwotCi0JaWYgKGNoZWNrX3VuaWNhc3RfcGFja2V0KHNrYiwgaGRyX3NpemUpIDwgMCkKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCi0JdW5pY2FzdF9wYWNrZXQgPSAoc3RydWN0IHVuaWNhc3RfcGFja2V0ICopc2tiLT5kYXRhOwotCi0JLyogcGFja2V0IGZvciBtZSAqLwotCWlmIChpc19teV9tYWModW5pY2FzdF9wYWNrZXQtPmRlc3QpKSB7Ci0JCWludGVyZmFjZV9yeChyZWN2X2lmLT5zb2Z0X2lmYWNlLCBza2IsIGhkcl9zaXplKTsKLQkJcmV0dXJuIE5FVF9SWF9TVUNDRVNTOwotCX0KLQotCXJldHVybiByb3V0ZV91bmljYXN0X3BhY2tldChza2IsIHJlY3ZfaWYsIGhkcl9zaXplKTsKLX0KLQotaW50IHJlY3ZfdWNhc3RfZnJhZ19wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGJhdG1hbl9pZiAqcmVjdl9pZikKLXsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYocmVjdl9pZi0+c29mdF9pZmFjZSk7Ci0Jc3RydWN0IHVuaWNhc3RfZnJhZ19wYWNrZXQgKnVuaWNhc3RfcGFja2V0OwotCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZTsKLQlzdHJ1Y3QgZnJhZ19wYWNrZXRfbGlzdF9lbnRyeSAqdG1wX2ZyYWdfZW50cnk7Ci0JaW50IGhkcl9zaXplID0gc2l6ZW9mKHN0cnVjdCB1bmljYXN0X2ZyYWdfcGFja2V0KTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKGNoZWNrX3VuaWNhc3RfcGFja2V0KHNrYiwgaGRyX3NpemUpIDwgMCkKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCi0JdW5pY2FzdF9wYWNrZXQgPSAoc3RydWN0IHVuaWNhc3RfZnJhZ19wYWNrZXQgKilza2ItPmRhdGE7Ci0KLQkvKiBwYWNrZXQgZm9yIG1lICovCi0JaWYgKGlzX215X21hYyh1bmljYXN0X3BhY2tldC0+ZGVzdCkpIHsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0JCW9yaWdfbm9kZSA9ICgoc3RydWN0IG9yaWdfbm9kZSAqKQotCQkJaGFzaF9maW5kKGJhdF9wcml2LT5vcmlnX2hhc2gsIHVuaWNhc3RfcGFja2V0LT5vcmlnKSk7Ci0KLQkJaWYgKCFvcmlnX25vZGUpIHsKLQkJCXByX2RlYnVnKCJjb3VsZG4ndCBmaW5kIG9yaWcgbm9kZSBmb3IgZnJhZ21lbnRhdGlvblxuIik7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssCi0JCQkJCSAgICAgICBmbGFncyk7Ci0JCQlyZXR1cm4gTkVUX1JYX0RST1A7Ci0JCX0KLQotCQlvcmlnX25vZGUtPmxhc3RfZnJhZ19wYWNrZXQgPSBqaWZmaWVzOwotCi0JCWlmIChsaXN0X2VtcHR5KCZvcmlnX25vZGUtPmZyYWdfbGlzdCkgJiYKLQkJCWNyZWF0ZV9mcmFnX2J1ZmZlcigmb3JpZ19ub2RlLT5mcmFnX2xpc3QpKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssCi0JCQkJCSAgICAgICBmbGFncyk7Ci0JCQlyZXR1cm4gTkVUX1JYX0RST1A7Ci0JCX0KLQotCQl0bXBfZnJhZ19lbnRyeSA9Ci0JCQlzZWFyY2hfZnJhZ19wYWNrZXQoJm9yaWdfbm9kZS0+ZnJhZ19saXN0LAotCQkJCQkgICB1bmljYXN0X3BhY2tldCk7Ci0KLQkJaWYgKCF0bXBfZnJhZ19lbnRyeSkgewotCQkJY3JlYXRlX2ZyYWdfZW50cnkoJm9yaWdfbm9kZS0+ZnJhZ19saXN0LCBza2IpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLAotCQkJCQkgICAgICAgZmxhZ3MpOwotCQkJcmV0dXJuIE5FVF9SWF9TVUNDRVNTOwotCQl9Ci0KLQkJc2tiID0gbWVyZ2VfZnJhZ19wYWNrZXQoJm9yaWdfbm9kZS0+ZnJhZ19saXN0LAotCQkJCQl0bXBfZnJhZ19lbnRyeSwgc2tiKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0JCWlmICghc2tiKQotCQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCi0JCWludGVyZmFjZV9yeChyZWN2X2lmLT5zb2Z0X2lmYWNlLCBza2IsIGhkcl9zaXplKTsKLQkJcmV0dXJuIE5FVF9SWF9TVUNDRVNTOwotCX0KLQotCXJldHVybiByb3V0ZV91bmljYXN0X3BhY2tldChza2IsIHJlY3ZfaWYsIGhkcl9zaXplKTsKLX0KLQotCi1pbnQgcmVjdl9iY2FzdF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGJhdG1hbl9pZiAqcmVjdl9pZikKLXsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYocmVjdl9pZi0+c29mdF9pZmFjZSk7Ci0Jc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOwotCXN0cnVjdCBiY2FzdF9wYWNrZXQgKmJjYXN0X3BhY2tldDsKLQlzdHJ1Y3QgZXRoaGRyICpldGhoZHI7Ci0JaW50IGhkcl9zaXplID0gc2l6ZW9mKHN0cnVjdCBiY2FzdF9wYWNrZXQpOwotCWludDMyX3Qgc2VxX2RpZmY7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qIGRyb3AgcGFja2V0IGlmIGl0IGhhcyBub3QgbmVjZXNzYXJ5IG1pbmltdW0gc2l6ZSAqLwotCWlmICh1bmxpa2VseSghcHNrYl9tYXlfcHVsbChza2IsIGhkcl9zaXplKSkpCi0JCXJldHVybiBORVRfUlhfRFJPUDsKLQotCWV0aGhkciA9IChzdHJ1Y3QgZXRoaGRyICopc2tiX21hY19oZWFkZXIoc2tiKTsKLQotCS8qIHBhY2tldCB3aXRoIGJyb2FkY2FzdCBpbmRpY2F0aW9uIGJ1dCB1bmljYXN0IHJlY2lwaWVudCAqLwotCWlmICghaXNfYmNhc3QoZXRoaGRyLT5oX2Rlc3QpKQotCQlyZXR1cm4gTkVUX1JYX0RST1A7Ci0KLQkvKiBwYWNrZXQgd2l0aCBicm9hZGNhc3Qgc2VuZGVyIGFkZHJlc3MgKi8KLQlpZiAoaXNfYmNhc3QoZXRoaGRyLT5oX3NvdXJjZSkpCi0JCXJldHVybiBORVRfUlhfRFJPUDsKLQotCS8qIGlnbm9yZSBicm9hZGNhc3RzIHNlbnQgYnkgbXlzZWxmICovCi0JaWYgKGlzX215X21hYyhldGhoZHItPmhfc291cmNlKSkKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCi0JYmNhc3RfcGFja2V0ID0gKHN0cnVjdCBiY2FzdF9wYWNrZXQgKilza2ItPmRhdGE7Ci0KLQkvKiBpZ25vcmUgYnJvYWRjYXN0cyBvcmlnaW5hdGVkIGJ5IG15c2VsZiAqLwotCWlmIChpc19teV9tYWMoYmNhc3RfcGFja2V0LT5vcmlnKSkKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCi0JaWYgKGJjYXN0X3BhY2tldC0+dHRsIDwgMikKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCW9yaWdfbm9kZSA9ICgoc3RydWN0IG9yaWdfbm9kZSAqKQotCQkgICAgIGhhc2hfZmluZChiYXRfcHJpdi0+b3JpZ19oYXNoLCBiY2FzdF9wYWNrZXQtPm9yaWcpKTsKLQotCWlmIChvcmlnX25vZGUgPT0gTlVMTCkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCX0KLQotCS8qIGNoZWNrIHdoZXRoZXIgdGhlIHBhY2tldCBpcyBhIGR1cGxpY2F0ZSAqLwotCWlmIChnZXRfYml0X3N0YXR1cyhvcmlnX25vZGUtPmJjYXN0X2JpdHMsCi0JCQkgICBvcmlnX25vZGUtPmxhc3RfYmNhc3Rfc2Vxbm8sCi0JCQkgICBudG9obChiY2FzdF9wYWNrZXQtPnNlcW5vKSkpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiBORVRfUlhfRFJPUDsKLQl9Ci0KLQlzZXFfZGlmZiA9IG50b2hsKGJjYXN0X3BhY2tldC0+c2Vxbm8pIC0gb3JpZ19ub2RlLT5sYXN0X2JjYXN0X3NlcW5vOwotCi0JLyogY2hlY2sgd2hldGhlciB0aGUgcGFja2V0IGlzIG9sZCBhbmQgdGhlIGhvc3QganVzdCByZXN0YXJ0ZWQuICovCi0JaWYgKHdpbmRvd19wcm90ZWN0ZWQoYmF0X3ByaXYsIHNlcV9kaWZmLAotCQkJICAgICAmb3JpZ19ub2RlLT5iY2FzdF9zZXFub19yZXNldCkpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiBORVRfUlhfRFJPUDsKLQl9Ci0KLQkvKiBtYXJrIGJyb2FkY2FzdCBpbiBmbG9vZCBoaXN0b3J5LCB1cGRhdGUgd2luZG93IHBvc2l0aW9uCi0JICogaWYgcmVxdWlyZWQuICovCi0JaWYgKGJpdF9nZXRfcGFja2V0KGJhdF9wcml2LCBvcmlnX25vZGUtPmJjYXN0X2JpdHMsIHNlcV9kaWZmLCAxKSkKLQkJb3JpZ19ub2RlLT5sYXN0X2JjYXN0X3NlcW5vID0gbnRvaGwoYmNhc3RfcGFja2V0LT5zZXFubyk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQkvKiByZWJyb2FkY2FzdCBwYWNrZXQgKi8KLQlhZGRfYmNhc3RfcGFja2V0X3RvX2xpc3QoYmF0X3ByaXYsIHNrYik7Ci0KLQkvKiBicm9hZGNhc3QgZm9yIG1lICovCi0JaW50ZXJmYWNlX3J4KHJlY3ZfaWYtPnNvZnRfaWZhY2UsIHNrYiwgaGRyX3NpemUpOwotCi0JcmV0dXJuIE5FVF9SWF9TVUNDRVNTOwotfQotCi1pbnQgcmVjdl92aXNfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBiYXRtYW5faWYgKnJlY3ZfaWYpCi17Ci0Jc3RydWN0IHZpc19wYWNrZXQgKnZpc19wYWNrZXQ7Ci0Jc3RydWN0IGV0aGhkciAqZXRoaGRyOwotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihyZWN2X2lmLT5zb2Z0X2lmYWNlKTsKLQlpbnQgaGRyX3NpemUgPSBzaXplb2Yoc3RydWN0IHZpc19wYWNrZXQpOwotCi0JLyoga2VlcCBza2IgbGluZWFyICovCi0JaWYgKHNrYl9saW5lYXJpemUoc2tiKSA8IDApCi0JCXJldHVybiBORVRfUlhfRFJPUDsKLQotCWlmICh1bmxpa2VseSghcHNrYl9tYXlfcHVsbChza2IsIGhkcl9zaXplKSkpCi0JCXJldHVybiBORVRfUlhfRFJPUDsKLQotCXZpc19wYWNrZXQgPSAoc3RydWN0IHZpc19wYWNrZXQgKilza2ItPmRhdGE7Ci0JZXRoaGRyID0gKHN0cnVjdCBldGhoZHIgKilza2JfbWFjX2hlYWRlcihza2IpOwotCi0JLyogbm90IGZvciBtZSAqLwotCWlmICghaXNfbXlfbWFjKGV0aGhkci0+aF9kZXN0KSkKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCi0JLyogaWdub3JlIG93biBwYWNrZXRzICovCi0JaWYgKGlzX215X21hYyh2aXNfcGFja2V0LT52aXNfb3JpZykpCi0JCXJldHVybiBORVRfUlhfRFJPUDsKLQotCWlmIChpc19teV9tYWModmlzX3BhY2tldC0+c2VuZGVyX29yaWcpKQotCQlyZXR1cm4gTkVUX1JYX0RST1A7Ci0KLQlzd2l0Y2ggKHZpc19wYWNrZXQtPnZpc190eXBlKSB7Ci0JY2FzZSBWSVNfVFlQRV9TRVJWRVJfU1lOQzoKLQkJcmVjZWl2ZV9zZXJ2ZXJfc3luY19wYWNrZXQoYmF0X3ByaXYsIHZpc19wYWNrZXQsCi0JCQkJCSAgIHNrYl9oZWFkbGVuKHNrYikpOwotCQlicmVhazsKLQotCWNhc2UgVklTX1RZUEVfQ0xJRU5UX1VQREFURToKLQkJcmVjZWl2ZV9jbGllbnRfdXBkYXRlX3BhY2tldChiYXRfcHJpdiwgdmlzX3BhY2tldCwKLQkJCQkJICAgICBza2JfaGVhZGxlbihza2IpKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgkvKiBpZ25vcmUgdW5rbm93biBwYWNrZXQgKi8KLQkJYnJlYWs7Ci0JfQotCi0JLyogV2UgdGFrZSBhIGNvcHkgb2YgdGhlIGRhdGEgaW4gdGhlIHBhY2tldCwgc28gd2Ugc2hvdWxkCi0JICAgYWx3YXlzIGZyZWUgdGhlIHNrYnVmLiAqLwotCXJldHVybiBORVRfUlhfRFJPUDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3JvdXRpbmcuaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3JvdXRpbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI2NzRjOC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9yb3V0aW5nLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKLSAqCi0gKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxLCBVU0EKLSAqCi0gKi8KLQotI2lmbmRlZiBfTkVUX0JBVE1BTl9BRFZfUk9VVElOR19IXwotI2RlZmluZSBfTkVUX0JBVE1BTl9BRFZfUk9VVElOR19IXwotCi0jaW5jbHVkZSAidHlwZXMuaCIKLQotdm9pZCBzbGlkZV9vd25fYmNhc3Rfd2luZG93KHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZik7Ci12b2lkIHJlY2VpdmVfYmF0X3BhY2tldChzdHJ1Y3QgZXRoaGRyICpldGhoZHIsCi0JCQkJc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQsCi0JCQkJdW5zaWduZWQgY2hhciAqaG5hX2J1ZmYsIGludCBobmFfYnVmZl9sZW4sCi0JCQkJc3RydWN0IGJhdG1hbl9pZiAqaWZfaW5jb21pbmcpOwotdm9pZCB1cGRhdGVfcm91dGVzKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsIHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwKLQkJICAgc3RydWN0IG5laWdoX25vZGUgKm5laWdoX25vZGUsIHVuc2lnbmVkIGNoYXIgKmhuYV9idWZmLAotCQkgICBpbnQgaG5hX2J1ZmZfbGVuKTsKLWludCByZWN2X2ljbXBfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBiYXRtYW5faWYgKnJlY3ZfaWYpOwotaW50IHJlY3ZfdW5pY2FzdF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGJhdG1hbl9pZiAqcmVjdl9pZik7Ci1pbnQgcmVjdl91Y2FzdF9mcmFnX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgYmF0bWFuX2lmICpyZWN2X2lmKTsKLWludCByZWN2X2JjYXN0X3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgYmF0bWFuX2lmICpyZWN2X2lmKTsKLWludCByZWN2X3Zpc19wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGJhdG1hbl9pZiAqcmVjdl9pZik7Ci1pbnQgcmVjdl9iYXRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBiYXRtYW5faWYgKnJlY3ZfaWYpOwotc3RydWN0IG5laWdoX25vZGUgKmZpbmRfcm91dGVyKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwgc3RydWN0IGJhdG1hbl9pZiAqcmVjdl9pZik7Ci12b2lkIHVwZGF0ZV9ib25kaW5nX2NhbmRpZGF0ZXMoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCSAgICAgICBzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUpOwotCi0jZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX1JPVVRJTkdfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3NlbmQuYyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3NlbmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FkZjc2ZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9zZW5kLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1ODAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6Ci0gKgotICogTWFyZWsgTGluZG5lciwgU2ltb24gV3VuZGVybGljaAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotICogMDIxMTAtMTMwMSwgVVNBCi0gKgotICovCi0KLSNpbmNsdWRlICJtYWluLmgiCi0jaW5jbHVkZSAic2VuZC5oIgotI2luY2x1ZGUgInJvdXRpbmcuaCIKLSNpbmNsdWRlICJ0cmFuc2xhdGlvbi10YWJsZS5oIgotI2luY2x1ZGUgInNvZnQtaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiaGFyZC1pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJ0eXBlcy5oIgotI2luY2x1ZGUgInZpcy5oIgotI2luY2x1ZGUgImFnZ3JlZ2F0aW9uLmgiCi0KLQotc3RhdGljIHZvaWQgc2VuZF9vdXRzdGFuZGluZ19iY2FzdF9wYWNrZXQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKLQotLyogYXBwbHkgaG9wIHBlbmFsdHkgZm9yIGEgbm9ybWFsIGxpbmsgKi8KLXN0YXRpYyB1aW50OF90IGhvcF9wZW5hbHR5KGNvbnN0IHVpbnQ4X3QgdHEpCi17Ci0JcmV0dXJuICh0cSAqIChUUV9NQVhfVkFMVUUgLSBUUV9IT1BfUEVOQUxUWSkpIC8gKFRRX01BWF9WQUxVRSk7Ci19Ci0KLS8qIHdoZW4gZG8gd2Ugc2NoZWR1bGUgb3VyIG93biBwYWNrZXQgdG8gYmUgc2VudCAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgb3duX3NlbmRfdGltZShzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KQotewotCXJldHVybiBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygKLQkJICAgYXRvbWljX3JlYWQoJmJhdF9wcml2LT5vcmlnX2ludGVydmFsKSAtCi0JCSAgIEpJVFRFUiArIChyYW5kb20zMigpICUgMipKSVRURVIpKTsKLX0KLQotLyogd2hlbiBkbyB3ZSBzY2hlZHVsZSBhIGZvcndhcmRlZCBwYWNrZXQgdG8gYmUgc2VudCAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZm9yd2FyZF9zZW5kX3RpbWUoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKLXsKLQlyZXR1cm4gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMocmFuZG9tMzIoKSAlIChKSVRURVIvMikpOwotfQotCi0vKiBzZW5kIG91dCBhbiBhbHJlYWR5IHByZXBhcmVkIHBhY2tldCB0byB0aGUgZ2l2ZW4gYWRkcmVzcyB2aWEgdGhlCi0gKiBzcGVjaWZpZWQgYmF0bWFuIGludGVyZmFjZSAqLwotaW50IHNlbmRfc2tiX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZiwKLQkJCQl1aW50OF90ICpkc3RfYWRkcikKLXsKLQlzdHJ1Y3QgZXRoaGRyICpldGhoZHI7Ci0KLQlpZiAoYmF0bWFuX2lmLT5pZl9zdGF0dXMgIT0gSUZfQUNUSVZFKQotCQlnb3RvIHNlbmRfc2tiX2VycjsKLQotCWlmICh1bmxpa2VseSghYmF0bWFuX2lmLT5uZXRfZGV2KSkKLQkJZ290byBzZW5kX3NrYl9lcnI7Ci0KLQlpZiAoIShiYXRtYW5faWYtPm5ldF9kZXYtPmZsYWdzICYgSUZGX1VQKSkgewotCQlwcl93YXJuaW5nKCJJbnRlcmZhY2UgJXMgaXMgbm90IHVwIC0gY2FuJ3Qgc2VuZCBwYWNrZXQgdmlhICIKLQkJCSAgICJ0aGF0IGludGVyZmFjZSFcbiIsIGJhdG1hbl9pZi0+bmV0X2Rldi0+bmFtZSk7Ci0JCWdvdG8gc2VuZF9za2JfZXJyOwotCX0KLQotCS8qIHB1c2ggdG8gdGhlIGV0aGVybmV0IGhlYWRlci4gKi8KLQlpZiAobXlfc2tiX2hlYWRfcHVzaChza2IsIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSkgPCAwKQotCQlnb3RvIHNlbmRfc2tiX2VycjsKLQotCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7Ci0KLQlldGhoZHIgPSAoc3RydWN0IGV0aGhkciAqKSBza2JfbWFjX2hlYWRlcihza2IpOwotCW1lbWNweShldGhoZHItPmhfc291cmNlLCBiYXRtYW5faWYtPm5ldF9kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7Ci0JbWVtY3B5KGV0aGhkci0+aF9kZXN0LCBkc3RfYWRkciwgRVRIX0FMRU4pOwotCWV0aGhkci0+aF9wcm90byA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfQkFUTUFOKTsKLQotCXNrYl9zZXRfbmV0d29ya19oZWFkZXIoc2tiLCBFVEhfSExFTik7Ci0Jc2tiLT5wcmlvcml0eSA9IFRDX1BSSU9fQ09OVFJPTDsKLQlza2ItPnByb3RvY29sID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9CQVRNQU4pOwotCi0Jc2tiLT5kZXYgPSBiYXRtYW5faWYtPm5ldF9kZXY7Ci0KLQkvKiBkZXZfcXVldWVfeG1pdCgpIHJldHVybnMgYSBuZWdhdGl2ZSByZXN1bHQgb24gZXJyb3IuCSBIb3dldmVyIG9uCi0JICogY29uZ2VzdGlvbiBhbmQgdHJhZmZpYyBzaGFwaW5nLCBpdCBkcm9wcyBhbmQgcmV0dXJucyBORVRfWE1JVF9EUk9QCi0JICogKHdoaWNoIGlzID4gMCkuIFRoaXMgd2lsbCBub3QgYmUgdHJlYXRlZCBhcyBhbiBlcnJvci4gKi8KLQotCXJldHVybiBkZXZfcXVldWVfeG1pdChza2IpOwotc2VuZF9za2JfZXJyOgotCWtmcmVlX3NrYihza2IpOwotCXJldHVybiBORVRfWE1JVF9EUk9QOwotfQotCi0vKiBTZW5kIGEgcGFja2V0IHRvIGEgZ2l2ZW4gaW50ZXJmYWNlICovCi1zdGF0aWMgdm9pZCBzZW5kX3BhY2tldF90b19pZihzdHJ1Y3QgZm9yd19wYWNrZXQgKmZvcndfcGFja2V0LAotCQkJICAgICAgc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmKQotewotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihiYXRtYW5faWYtPnNvZnRfaWZhY2UpOwotCWNoYXIgKmZ3ZF9zdHI7Ci0JdWludDhfdCBwYWNrZXRfbnVtOwotCWludDE2X3QgYnVmZl9wb3M7Ci0Jc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQ7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQotCWlmIChiYXRtYW5faWYtPmlmX3N0YXR1cyAhPSBJRl9BQ1RJVkUpCi0JCXJldHVybjsKLQotCXBhY2tldF9udW0gPSAwOwotCWJ1ZmZfcG9zID0gMDsKLQliYXRtYW5fcGFja2V0ID0gKHN0cnVjdCBiYXRtYW5fcGFja2V0ICopZm9yd19wYWNrZXQtPnNrYi0+ZGF0YTsKLQotCS8qIGFkanVzdCBhbGwgZmxhZ3MgYW5kIGxvZyBwYWNrZXRzICovCi0Jd2hpbGUgKGFnZ3JlZ2F0ZWRfcGFja2V0KGJ1ZmZfcG9zLAotCQkJCSBmb3J3X3BhY2tldC0+cGFja2V0X2xlbiwKLQkJCQkgYmF0bWFuX3BhY2tldC0+bnVtX2huYSkpIHsKLQotCQkvKiB3ZSBtaWdodCBoYXZlIGFnZ3JlZ2F0ZWQgZGlyZWN0IGxpbmsgcGFja2V0cyB3aXRoIGFuCi0JCSAqIG9yZGluYXJ5IGJhc2UgcGFja2V0ICovCi0JCWlmICgoZm9yd19wYWNrZXQtPmRpcmVjdF9saW5rX2ZsYWdzICYgKDEgPDwgcGFja2V0X251bSkpICYmCi0JCSAgICAoZm9yd19wYWNrZXQtPmlmX2luY29taW5nID09IGJhdG1hbl9pZikpCi0JCQliYXRtYW5fcGFja2V0LT5mbGFncyB8PSBESVJFQ1RMSU5LOwotCQllbHNlCi0JCQliYXRtYW5fcGFja2V0LT5mbGFncyAmPSB+RElSRUNUTElOSzsKLQotCQlmd2Rfc3RyID0gKHBhY2tldF9udW0gPiAwID8gIkZvcndhcmRpbmciIDogKGZvcndfcGFja2V0LT5vd24gPwotCQkJCQkJCSAgICAiU2VuZGluZyBvd24iIDoKLQkJCQkJCQkgICAgIkZvcndhcmRpbmciKSk7Ci0JCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCi0JCQkiJXMgJXNwYWNrZXQgKG9yaWdpbmF0b3IgJXBNLCBzZXFubyAlZCwgVFEgJWQsIFRUTCAlZCwiCi0JCQkiIElERiAlcykgb24gaW50ZXJmYWNlICVzIFslcE1dXG4iLAotCQkJZndkX3N0ciwgKHBhY2tldF9udW0gPiAwID8gImFnZ3JlZ2F0ZWQgIiA6ICIiKSwKLQkJCWJhdG1hbl9wYWNrZXQtPm9yaWcsIG50b2hsKGJhdG1hbl9wYWNrZXQtPnNlcW5vKSwKLQkJCWJhdG1hbl9wYWNrZXQtPnRxLCBiYXRtYW5fcGFja2V0LT50dGwsCi0JCQkoYmF0bWFuX3BhY2tldC0+ZmxhZ3MgJiBESVJFQ1RMSU5LID8KLQkJCSAib24iIDogIm9mZiIpLAotCQkJYmF0bWFuX2lmLT5uZXRfZGV2LT5uYW1lLCBiYXRtYW5faWYtPm5ldF9kZXYtPmRldl9hZGRyKTsKLQotCQlidWZmX3BvcyArPSBzaXplb2Yoc3RydWN0IGJhdG1hbl9wYWNrZXQpICsKLQkJCShiYXRtYW5fcGFja2V0LT5udW1faG5hICogRVRIX0FMRU4pOwotCQlwYWNrZXRfbnVtKys7Ci0JCWJhdG1hbl9wYWNrZXQgPSAoc3RydWN0IGJhdG1hbl9wYWNrZXQgKikKLQkJCShmb3J3X3BhY2tldC0+c2tiLT5kYXRhICsgYnVmZl9wb3MpOwotCX0KLQotCS8qIGNyZWF0ZSBjbG9uZSBiZWNhdXNlIGZ1bmN0aW9uIGlzIGNhbGxlZCBtb3JlIHRoYW4gb25jZSAqLwotCXNrYiA9IHNrYl9jbG9uZShmb3J3X3BhY2tldC0+c2tiLCBHRlBfQVRPTUlDKTsKLQlpZiAoc2tiKQotCQlzZW5kX3NrYl9wYWNrZXQoc2tiLCBiYXRtYW5faWYsIGJyb2FkY2FzdF9hZGRyKTsKLX0KLQotLyogc2VuZCBhIGJhdG1hbiBwYWNrZXQgKi8KLXN0YXRpYyB2b2lkIHNlbmRfcGFja2V0KHN0cnVjdCBmb3J3X3BhY2tldCAqZm9yd19wYWNrZXQpCi17Ci0Jc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOwotCXN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlOwotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXY7Ci0Jc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQgPQotCQkoc3RydWN0IGJhdG1hbl9wYWNrZXQgKikoZm9yd19wYWNrZXQtPnNrYi0+ZGF0YSk7Ci0JdW5zaWduZWQgY2hhciBkaXJlY3RsaW5rID0gKGJhdG1hbl9wYWNrZXQtPmZsYWdzICYgRElSRUNUTElOSyA/IDEgOiAwKTsKLQotCWlmICghZm9yd19wYWNrZXQtPmlmX2luY29taW5nKSB7Ci0JCXByX2VycigiRXJyb3IgLSBjYW4ndCBmb3J3YXJkIHBhY2tldDogaW5jb21pbmcgaWZhY2Ugbm90ICIKLQkJICAgICAgICJzcGVjaWZpZWRcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0Jc29mdF9pZmFjZSA9IGZvcndfcGFja2V0LT5pZl9pbmNvbWluZy0+c29mdF9pZmFjZTsKLQliYXRfcHJpdiA9IG5ldGRldl9wcml2KHNvZnRfaWZhY2UpOwotCi0JaWYgKGZvcndfcGFja2V0LT5pZl9pbmNvbWluZy0+aWZfc3RhdHVzICE9IElGX0FDVElWRSkKLQkJcmV0dXJuOwotCi0JLyogbXVsdGlob21lZCBwZWVyIGFzc3VtZWQgKi8KLQkvKiBub24tcHJpbWFyeSBPR01zIGFyZSBvbmx5IGJyb2FkY2FzdGVkIG9uIHRoZWlyIGludGVyZmFjZSAqLwotCWlmICgoZGlyZWN0bGluayAmJiAoYmF0bWFuX3BhY2tldC0+dHRsID09IDEpKSB8fAotCSAgICAoZm9yd19wYWNrZXQtPm93biAmJiAoZm9yd19wYWNrZXQtPmlmX2luY29taW5nLT5pZl9udW0gPiAwKSkpIHsKLQotCQkvKiBGSVhNRTogd2hhdCBhYm91dCBhZ2dyZWdhdGVkIHBhY2tldHMgPyAqLwotCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LAotCQkJIiVzIHBhY2tldCAob3JpZ2luYXRvciAlcE0sIHNlcW5vICVkLCBUVEwgJWQpICIKLQkJCSJvbiBpbnRlcmZhY2UgJXMgWyVwTV1cbiIsCi0JCQkoZm9yd19wYWNrZXQtPm93biA/ICJTZW5kaW5nIG93biIgOiAiRm9yd2FyZGluZyIpLAotCQkJYmF0bWFuX3BhY2tldC0+b3JpZywgbnRvaGwoYmF0bWFuX3BhY2tldC0+c2Vxbm8pLAotCQkJYmF0bWFuX3BhY2tldC0+dHRsLAotCQkJZm9yd19wYWNrZXQtPmlmX2luY29taW5nLT5uZXRfZGV2LT5uYW1lLAotCQkJZm9yd19wYWNrZXQtPmlmX2luY29taW5nLT5uZXRfZGV2LT5kZXZfYWRkcik7Ci0KLQkJLyogc2tiIGlzIG9ubHkgdXNlZCBvbmNlIGFuZCB0aGFuIGZvcndfcGFja2V0IGlzIGZyZWUnZCAqLwotCQlzZW5kX3NrYl9wYWNrZXQoZm9yd19wYWNrZXQtPnNrYiwgZm9yd19wYWNrZXQtPmlmX2luY29taW5nLAotCQkJCWJyb2FkY2FzdF9hZGRyKTsKLQkJZm9yd19wYWNrZXQtPnNrYiA9IE5VTEw7Ci0KLQkJcmV0dXJuOwotCX0KLQotCS8qIGJyb2FkY2FzdCBvbiBldmVyeSBpbnRlcmZhY2UgKi8KLQlyY3VfcmVhZF9sb2NrKCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoYmF0bWFuX2lmLCAmaWZfbGlzdCwgbGlzdCkgewotCQlpZiAoYmF0bWFuX2lmLT5zb2Z0X2lmYWNlICE9IHNvZnRfaWZhY2UpCi0JCQljb250aW51ZTsKLQotCQlzZW5kX3BhY2tldF90b19pZihmb3J3X3BhY2tldCwgYmF0bWFuX2lmKTsKLQl9Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlYnVpbGRfYmF0bWFuX3BhY2tldChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJCSAgc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmKQotewotCWludCBuZXdfbGVuOwotCXVuc2lnbmVkIGNoYXIgKm5ld19idWZmOwotCXN0cnVjdCBiYXRtYW5fcGFja2V0ICpiYXRtYW5fcGFja2V0OwotCi0JbmV3X2xlbiA9IHNpemVvZihzdHJ1Y3QgYmF0bWFuX3BhY2tldCkgKwotCQkJKGJhdF9wcml2LT5udW1fbG9jYWxfaG5hICogRVRIX0FMRU4pOwotCW5ld19idWZmID0ga21hbGxvYyhuZXdfbGVuLCBHRlBfQVRPTUlDKTsKLQotCS8qIGtlZXAgb2xkIGJ1ZmZlciBpZiBrbWFsbG9jIHNob3VsZCBmYWlsICovCi0JaWYgKG5ld19idWZmKSB7Ci0JCW1lbWNweShuZXdfYnVmZiwgYmF0bWFuX2lmLT5wYWNrZXRfYnVmZiwKLQkJICAgICAgIHNpemVvZihzdHJ1Y3QgYmF0bWFuX3BhY2tldCkpOwotCQliYXRtYW5fcGFja2V0ID0gKHN0cnVjdCBiYXRtYW5fcGFja2V0ICopbmV3X2J1ZmY7Ci0KLQkJYmF0bWFuX3BhY2tldC0+bnVtX2huYSA9IGhuYV9sb2NhbF9maWxsX2J1ZmZlcihiYXRfcHJpdiwKLQkJCQluZXdfYnVmZiArIHNpemVvZihzdHJ1Y3QgYmF0bWFuX3BhY2tldCksCi0JCQkJbmV3X2xlbiAtIHNpemVvZihzdHJ1Y3QgYmF0bWFuX3BhY2tldCkpOwotCi0JCWtmcmVlKGJhdG1hbl9pZi0+cGFja2V0X2J1ZmYpOwotCQliYXRtYW5faWYtPnBhY2tldF9idWZmID0gbmV3X2J1ZmY7Ci0JCWJhdG1hbl9pZi0+cGFja2V0X2xlbiA9IG5ld19sZW47Ci0JfQotfQotCi12b2lkIHNjaGVkdWxlX293bl9wYWNrZXQoc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmKQotewotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihiYXRtYW5faWYtPnNvZnRfaWZhY2UpOwotCXVuc2lnbmVkIGxvbmcgc2VuZF90aW1lOwotCXN0cnVjdCBiYXRtYW5fcGFja2V0ICpiYXRtYW5fcGFja2V0OwotCWludCB2aXNfc2VydmVyOwotCi0JaWYgKChiYXRtYW5faWYtPmlmX3N0YXR1cyA9PSBJRl9OT1RfSU5fVVNFKSB8fAotCSAgICAoYmF0bWFuX2lmLT5pZl9zdGF0dXMgPT0gSUZfVE9fQkVfUkVNT1ZFRCkpCi0JCXJldHVybjsKLQotCXZpc19zZXJ2ZXIgPSBhdG9taWNfcmVhZCgmYmF0X3ByaXYtPnZpc19tb2RlKTsKLQotCS8qKgotCSAqIHRoZSBpbnRlcmZhY2UgZ2V0cyBhY3RpdmF0ZWQgaGVyZSB0byBhdm9pZCByYWNlIGNvbmRpdGlvbnMgYmV0d2VlbgotCSAqIHRoZSBtb21lbnQgb2YgYWN0aXZhdGluZyB0aGUgaW50ZXJmYWNlIGluCi0JICogaGFyZGlmX2FjdGl2YXRlX2ludGVyZmFjZSgpIHdoZXJlIHRoZSBvcmlnaW5hdG9yIG1hYyBpcyBzZXQgYW5kCi0JICogb3V0ZGF0ZWQgcGFja2V0cyAoZXNwZWNpYWxseSB1bmluaXRpYWxpemVkIG1hYyBhZGRyZXNzZXMpIGluIHRoZQotCSAqIHBhY2tldCBxdWV1ZQotCSAqLwotCWlmIChiYXRtYW5faWYtPmlmX3N0YXR1cyA9PSBJRl9UT19CRV9BQ1RJVkFURUQpCi0JCWJhdG1hbl9pZi0+aWZfc3RhdHVzID0gSUZfQUNUSVZFOwotCi0JLyogaWYgbG9jYWwgaG5hIGhhcyBjaGFuZ2VkIGFuZCBpbnRlcmZhY2UgaXMgYSBwcmltYXJ5IGludGVyZmFjZSAqLwotCWlmICgoYXRvbWljX3JlYWQoJmJhdF9wcml2LT5obmFfbG9jYWxfY2hhbmdlZCkpICYmCi0JICAgIChiYXRtYW5faWYgPT0gYmF0X3ByaXYtPnByaW1hcnlfaWYpKQotCQlyZWJ1aWxkX2JhdG1hbl9wYWNrZXQoYmF0X3ByaXYsIGJhdG1hbl9pZik7Ci0KLQkvKioKLQkgKiBOT1RFOiBwYWNrZXRfYnVmZiBtaWdodCBqdXN0IGhhdmUgYmVlbiByZS1hbGxvY2F0ZWQgaW4KLQkgKiByZWJ1aWxkX2JhdG1hbl9wYWNrZXQoKQotCSAqLwotCWJhdG1hbl9wYWNrZXQgPSAoc3RydWN0IGJhdG1hbl9wYWNrZXQgKiliYXRtYW5faWYtPnBhY2tldF9idWZmOwotCi0JLyogY2hhbmdlIHNlcXVlbmNlIG51bWJlciB0byBuZXR3b3JrIG9yZGVyICovCi0JYmF0bWFuX3BhY2tldC0+c2Vxbm8gPQotCQlodG9ubCgodWludDMyX3QpYXRvbWljX3JlYWQoJmJhdG1hbl9pZi0+c2Vxbm8pKTsKLQotCWlmICh2aXNfc2VydmVyID09IFZJU19UWVBFX1NFUlZFUl9TWU5DKQotCQliYXRtYW5fcGFja2V0LT5mbGFncyB8PSBWSVNfU0VSVkVSOwotCWVsc2UKLQkJYmF0bWFuX3BhY2tldC0+ZmxhZ3MgJj0gflZJU19TRVJWRVI7Ci0KLQlhdG9taWNfaW5jKCZiYXRtYW5faWYtPnNlcW5vKTsKLQotCXNsaWRlX293bl9iY2FzdF93aW5kb3coYmF0bWFuX2lmKTsKLQlzZW5kX3RpbWUgPSBvd25fc2VuZF90aW1lKGJhdF9wcml2KTsKLQlhZGRfYmF0X3BhY2tldF90b19saXN0KGJhdF9wcml2LAotCQkJICAgICAgIGJhdG1hbl9pZi0+cGFja2V0X2J1ZmYsCi0JCQkgICAgICAgYmF0bWFuX2lmLT5wYWNrZXRfbGVuLAotCQkJICAgICAgIGJhdG1hbl9pZiwgMSwgc2VuZF90aW1lKTsKLX0KLQotdm9pZCBzY2hlZHVsZV9mb3J3YXJkX3BhY2tldChzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUsCi0JCQkgICAgIHN0cnVjdCBldGhoZHIgKmV0aGhkciwKLQkJCSAgICAgc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQsCi0JCQkgICAgIHVpbnQ4X3QgZGlyZWN0bGluaywgaW50IGhuYV9idWZmX2xlbiwKLQkJCSAgICAgc3RydWN0IGJhdG1hbl9pZiAqaWZfaW5jb21pbmcpCi17Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KGlmX2luY29taW5nLT5zb2Z0X2lmYWNlKTsKLQl1bnNpZ25lZCBjaGFyIGluX3RxLCBpbl90dGwsIHRxX2F2ZyA9IDA7Ci0JdW5zaWduZWQgbG9uZyBzZW5kX3RpbWU7Ci0KLQlpZiAoYmF0bWFuX3BhY2tldC0+dHRsIDw9IDEpIHsKLQkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwgInR0bCBleGNlZWRlZFxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpbl90cSA9IGJhdG1hbl9wYWNrZXQtPnRxOwotCWluX3R0bCA9IGJhdG1hbl9wYWNrZXQtPnR0bDsKLQotCWJhdG1hbl9wYWNrZXQtPnR0bC0tOwotCW1lbWNweShiYXRtYW5fcGFja2V0LT5wcmV2X3NlbmRlciwgZXRoaGRyLT5oX3NvdXJjZSwgRVRIX0FMRU4pOwotCi0JLyogcmVicm9hZGNhc3QgdHEgb2Ygb3VyIGJlc3QgcmFua2luZyBuZWlnaGJvciB0byBlbnN1cmUgdGhlIHJlYnJvYWRjYXN0Ci0JICogb2Ygb3VyIGJlc3QgdHEgdmFsdWUgKi8KLQlpZiAoKG9yaWdfbm9kZS0+cm91dGVyKSAmJiAob3JpZ19ub2RlLT5yb3V0ZXItPnRxX2F2ZyAhPSAwKSkgewotCi0JCS8qIHJlYnJvYWRjYXN0IG9nbSBvZiBiZXN0IHJhbmtpbmcgbmVpZ2hib3IgYXMgaXMgKi8KLQkJaWYgKCFjb21wYXJlX29yaWcob3JpZ19ub2RlLT5yb3V0ZXItPmFkZHIsIGV0aGhkci0+aF9zb3VyY2UpKSB7Ci0JCQliYXRtYW5fcGFja2V0LT50cSA9IG9yaWdfbm9kZS0+cm91dGVyLT50cV9hdmc7Ci0KLQkJCWlmIChvcmlnX25vZGUtPnJvdXRlci0+bGFzdF90dGwpCi0JCQkJYmF0bWFuX3BhY2tldC0+dHRsID0gb3JpZ19ub2RlLT5yb3V0ZXItPmxhc3RfdHRsCi0JCQkJCQkJLSAxOwotCQl9Ci0KLQkJdHFfYXZnID0gb3JpZ19ub2RlLT5yb3V0ZXItPnRxX2F2ZzsKLQl9Ci0KLQkvKiBhcHBseSBob3AgcGVuYWx0eSAqLwotCWJhdG1hbl9wYWNrZXQtPnRxID0gaG9wX3BlbmFsdHkoYmF0bWFuX3BhY2tldC0+dHEpOwotCi0JYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJIkZvcndhcmRpbmcgcGFja2V0OiB0cV9vcmlnOiAlaSwgdHFfYXZnOiAlaSwgIgotCQkidHFfZm9ydzogJWksIHR0bF9vcmlnOiAlaSwgdHRsX2Zvcnc6ICVpXG4iLAotCQlpbl90cSwgdHFfYXZnLCBiYXRtYW5fcGFja2V0LT50cSwgaW5fdHRsIC0gMSwKLQkJYmF0bWFuX3BhY2tldC0+dHRsKTsKLQotCWJhdG1hbl9wYWNrZXQtPnNlcW5vID0gaHRvbmwoYmF0bWFuX3BhY2tldC0+c2Vxbm8pOwotCi0JLyogc3dpdGNoIG9mIHByaW1hcmllcyBmaXJzdCBob3AgZmxhZyB3aGVuIGZvcndhcmRpbmcgKi8KLQliYXRtYW5fcGFja2V0LT5mbGFncyAmPSB+UFJJTUFSSUVTX0ZJUlNUX0hPUDsKLQlpZiAoZGlyZWN0bGluaykKLQkJYmF0bWFuX3BhY2tldC0+ZmxhZ3MgfD0gRElSRUNUTElOSzsKLQllbHNlCi0JCWJhdG1hbl9wYWNrZXQtPmZsYWdzICY9IH5ESVJFQ1RMSU5LOwotCi0Jc2VuZF90aW1lID0gZm9yd2FyZF9zZW5kX3RpbWUoYmF0X3ByaXYpOwotCWFkZF9iYXRfcGFja2V0X3RvX2xpc3QoYmF0X3ByaXYsCi0JCQkgICAgICAgKHVuc2lnbmVkIGNoYXIgKiliYXRtYW5fcGFja2V0LAotCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgYmF0bWFuX3BhY2tldCkgKyBobmFfYnVmZl9sZW4sCi0JCQkgICAgICAgaWZfaW5jb21pbmcsIDAsIHNlbmRfdGltZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZvcndfcGFja2V0X2ZyZWUoc3RydWN0IGZvcndfcGFja2V0ICpmb3J3X3BhY2tldCkKLXsKLQlpZiAoZm9yd19wYWNrZXQtPnNrYikKLQkJa2ZyZWVfc2tiKGZvcndfcGFja2V0LT5za2IpOwotCWtmcmVlKGZvcndfcGFja2V0KTsKLX0KLQotc3RhdGljIHZvaWQgX2FkZF9iY2FzdF9wYWNrZXRfdG9fbGlzdChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJCSAgICAgIHN0cnVjdCBmb3J3X3BhY2tldCAqZm9yd19wYWNrZXQsCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBzZW5kX3RpbWUpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlJTklUX0hMSVNUX05PREUoJmZvcndfcGFja2V0LT5saXN0KTsKLQotCS8qIGFkZCBuZXcgcGFja2V0IHRvIHBhY2tldCBsaXN0ICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5mb3J3X2JjYXN0X2xpc3RfbG9jaywgZmxhZ3MpOwotCWhsaXN0X2FkZF9oZWFkKCZmb3J3X3BhY2tldC0+bGlzdCwgJmJhdF9wcml2LT5mb3J3X2JjYXN0X2xpc3QpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5mb3J3X2JjYXN0X2xpc3RfbG9jaywgZmxhZ3MpOwotCi0JLyogc3RhcnQgdGltZXIgZm9yIHRoaXMgcGFja2V0ICovCi0JSU5JVF9ERUxBWUVEX1dPUksoJmZvcndfcGFja2V0LT5kZWxheWVkX3dvcmssCi0JCQkgIHNlbmRfb3V0c3RhbmRpbmdfYmNhc3RfcGFja2V0KTsKLQlxdWV1ZV9kZWxheWVkX3dvcmsoYmF0X2V2ZW50X3dvcmtxdWV1ZSwgJmZvcndfcGFja2V0LT5kZWxheWVkX3dvcmssCi0JCQkgICBzZW5kX3RpbWUpOwotfQotCi0jZGVmaW5lIGF0b21pY19kZWNfbm90X3plcm8odikgICAgICAgICAgYXRvbWljX2FkZF91bmxlc3MoKHYpLCAtMSwgMCkKLS8qIGFkZCBhIGJyb2FkY2FzdCBwYWNrZXQgdG8gdGhlIHF1ZXVlIGFuZCBzZXR1cCB0aW1lcnMuIGJyb2FkY2FzdCBwYWNrZXRzCi0gKiBhcmUgc2VudCBtdWx0aXBsZSB0aW1lcyB0byBpbmNyZWFzZSBwcm9iYWJpbGl0eSBmb3IgYmVlaW5nIHJlY2VpdmVkLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBORVRERVZfVFhfT0sgb24gc3VjY2VzcyBhbmQgTkVUREVWX1RYX0JVU1kgb24KLSAqIGVycm9ycy4KLSAqCi0gKiBUaGUgc2tiIGlzIG5vdCBjb25zdW1lZCwgc28gdGhlIGNhbGxlciBzaG91bGQgbWFrZSBzdXJlIHRoYXQgdGhlCi0gKiBza2IgaXMgZnJlZWQuICovCi1pbnQgYWRkX2JjYXN0X3BhY2tldF90b19saXN0KHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IGZvcndfcGFja2V0ICpmb3J3X3BhY2tldDsKLQlzdHJ1Y3QgYmNhc3RfcGFja2V0ICpiY2FzdF9wYWNrZXQ7Ci0KLQlpZiAoIWF0b21pY19kZWNfbm90X3plcm8oJmJhdF9wcml2LT5iY2FzdF9xdWV1ZV9sZWZ0KSkgewotCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LCAiYmNhc3QgcGFja2V0IHF1ZXVlIGZ1bGxcbiIpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAoIWJhdF9wcml2LT5wcmltYXJ5X2lmKQotCQlnb3RvIG91dDsKLQotCWZvcndfcGFja2V0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGZvcndfcGFja2V0KSwgR0ZQX0FUT01JQyk7Ci0KLQlpZiAoIWZvcndfcGFja2V0KQotCQlnb3RvIG91dF9hbmRfaW5jOwotCi0Jc2tiID0gc2tiX2NvcHkoc2tiLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXNrYikKLQkJZ290byBwYWNrZXRfZnJlZTsKLQotCS8qIGFzIHdlIGhhdmUgYSBjb3B5IG5vdywgaXQgaXMgc2FmZSB0byBkZWNyZWFzZSB0aGUgVFRMICovCi0JYmNhc3RfcGFja2V0ID0gKHN0cnVjdCBiY2FzdF9wYWNrZXQgKilza2ItPmRhdGE7Ci0JYmNhc3RfcGFja2V0LT50dGwtLTsKLQotCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7Ci0KLQlmb3J3X3BhY2tldC0+c2tiID0gc2tiOwotCWZvcndfcGFja2V0LT5pZl9pbmNvbWluZyA9IGJhdF9wcml2LT5wcmltYXJ5X2lmOwotCi0JLyogaG93IG9mdGVuIGRpZCB3ZSBzZW5kIHRoZSBiY2FzdCBwYWNrZXQgPyAqLwotCWZvcndfcGFja2V0LT5udW1fcGFja2V0cyA9IDA7Ci0KLQlfYWRkX2JjYXN0X3BhY2tldF90b19saXN0KGJhdF9wcml2LCBmb3J3X3BhY2tldCwgMSk7Ci0JcmV0dXJuIE5FVERFVl9UWF9PSzsKLQotcGFja2V0X2ZyZWU6Ci0Ja2ZyZWUoZm9yd19wYWNrZXQpOwotb3V0X2FuZF9pbmM6Ci0JYXRvbWljX2luYygmYmF0X3ByaXYtPmJjYXN0X3F1ZXVlX2xlZnQpOwotb3V0OgotCXJldHVybiBORVRERVZfVFhfQlVTWTsKLX0KLQotc3RhdGljIHZvaWQgc2VuZF9vdXRzdGFuZGluZ19iY2FzdF9wYWNrZXQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZjsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrICpkZWxheWVkX3dvcmsgPQotCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGRlbGF5ZWRfd29yaywgd29yayk7Ci0Jc3RydWN0IGZvcndfcGFja2V0ICpmb3J3X3BhY2tldCA9Ci0JCWNvbnRhaW5lcl9vZihkZWxheWVkX3dvcmssIHN0cnVjdCBmb3J3X3BhY2tldCwgZGVsYXllZF93b3JrKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBza19idWZmICpza2IxOwotCXN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlID0gZm9yd19wYWNrZXQtPmlmX2luY29taW5nLT5zb2Z0X2lmYWNlOwotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihzb2Z0X2lmYWNlKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+Zm9yd19iY2FzdF9saXN0X2xvY2ssIGZsYWdzKTsKLQlobGlzdF9kZWwoJmZvcndfcGFja2V0LT5saXN0KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+Zm9yd19iY2FzdF9saXN0X2xvY2ssIGZsYWdzKTsKLQotCWlmIChhdG9taWNfcmVhZCgmYmF0X3ByaXYtPm1lc2hfc3RhdGUpID09IE1FU0hfREVBQ1RJVkFUSU5HKQotCQlnb3RvIG91dDsKLQotCS8qIHJlYnJvYWRjYXN0IHBhY2tldCAqLwotCXJjdV9yZWFkX2xvY2soKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShiYXRtYW5faWYsICZpZl9saXN0LCBsaXN0KSB7Ci0JCWlmIChiYXRtYW5faWYtPnNvZnRfaWZhY2UgIT0gc29mdF9pZmFjZSkKLQkJCWNvbnRpbnVlOwotCi0JCS8qIHNlbmQgYSBjb3B5IG9mIHRoZSBzYXZlZCBza2IgKi8KLQkJc2tiMSA9IHNrYl9jbG9uZShmb3J3X3BhY2tldC0+c2tiLCBHRlBfQVRPTUlDKTsKLQkJaWYgKHNrYjEpCi0JCQlzZW5kX3NrYl9wYWNrZXQoc2tiMSwgYmF0bWFuX2lmLCBicm9hZGNhc3RfYWRkcik7Ci0JfQotCXJjdV9yZWFkX3VubG9jaygpOwotCi0JZm9yd19wYWNrZXQtPm51bV9wYWNrZXRzKys7Ci0KLQkvKiBpZiB3ZSBzdGlsbCBoYXZlIHNvbWUgbW9yZSBiY2FzdHMgdG8gc2VuZCAqLwotCWlmIChmb3J3X3BhY2tldC0+bnVtX3BhY2tldHMgPCAzKSB7Ci0JCV9hZGRfYmNhc3RfcGFja2V0X3RvX2xpc3QoYmF0X3ByaXYsIGZvcndfcGFja2V0LAotCQkJCQkgICgoNSAqIEhaKSAvIDEwMDApKTsKLQkJcmV0dXJuOwotCX0KLQotb3V0OgotCWZvcndfcGFja2V0X2ZyZWUoZm9yd19wYWNrZXQpOwotCWF0b21pY19pbmMoJmJhdF9wcml2LT5iY2FzdF9xdWV1ZV9sZWZ0KTsKLX0KLQotdm9pZCBzZW5kX291dHN0YW5kaW5nX2JhdF9wYWNrZXQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBkZWxheWVkX3dvcmsgKmRlbGF5ZWRfd29yayA9Ci0JCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZGVsYXllZF93b3JrLCB3b3JrKTsKLQlzdHJ1Y3QgZm9yd19wYWNrZXQgKmZvcndfcGFja2V0ID0KLQkJY29udGFpbmVyX29mKGRlbGF5ZWRfd29yaywgc3RydWN0IGZvcndfcGFja2V0LCBkZWxheWVkX3dvcmspOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdjsKLQotCWJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoZm9yd19wYWNrZXQtPmlmX2luY29taW5nLT5zb2Z0X2lmYWNlKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPmZvcndfYmF0X2xpc3RfbG9jaywgZmxhZ3MpOwotCWhsaXN0X2RlbCgmZm9yd19wYWNrZXQtPmxpc3QpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5mb3J3X2JhdF9saXN0X2xvY2ssIGZsYWdzKTsKLQotCWlmIChhdG9taWNfcmVhZCgmYmF0X3ByaXYtPm1lc2hfc3RhdGUpID09IE1FU0hfREVBQ1RJVkFUSU5HKQotCQlnb3RvIG91dDsKLQotCXNlbmRfcGFja2V0KGZvcndfcGFja2V0KTsKLQotCS8qKgotCSAqIHdlIGhhdmUgdG8gaGF2ZSBhdCBsZWFzdCBvbmUgcGFja2V0IGluIHRoZSBxdWV1ZQotCSAqIHRvIGRldGVybWluZSB0aGUgcXVldWVzIHdha2UgdXAgdGltZSB1bmxlc3Mgd2UgYXJlCi0JICogc2h1dHRpbmcgZG93bgotCSAqLwotCWlmIChmb3J3X3BhY2tldC0+b3duKQotCQlzY2hlZHVsZV9vd25fcGFja2V0KGZvcndfcGFja2V0LT5pZl9pbmNvbWluZyk7Ci0KLW91dDoKLQkvKiBkb24ndCBjb3VudCBvd24gcGFja2V0ICovCi0JaWYgKCFmb3J3X3BhY2tldC0+b3duKQotCQlhdG9taWNfaW5jKCZiYXRfcHJpdi0+YmF0bWFuX3F1ZXVlX2xlZnQpOwotCi0JZm9yd19wYWNrZXRfZnJlZShmb3J3X3BhY2tldCk7Ci19Ci0KLXZvaWQgcHVyZ2Vfb3V0c3RhbmRpbmdfcGFja2V0cyhzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJICAgICAgIHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZikKLXsKLQlzdHJ1Y3QgZm9yd19wYWNrZXQgKmZvcndfcGFja2V0OwotCXN0cnVjdCBobGlzdF9ub2RlICp0bXBfbm9kZSwgKnNhZmVfdG1wX25vZGU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChiYXRtYW5faWYpCi0JCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCi0JCQkicHVyZ2Vfb3V0c3RhbmRpbmdfcGFja2V0cygpOiAlc1xuIiwKLQkJCWJhdG1hbl9pZi0+bmV0X2Rldi0+bmFtZSk7Ci0JZWxzZQotCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LAotCQkJInB1cmdlX291dHN0YW5kaW5nX3BhY2tldHMoKVxuIik7Ci0KLQkvKiBmcmVlIGJjYXN0IGxpc3QgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPmZvcndfYmNhc3RfbGlzdF9sb2NrLCBmbGFncyk7Ci0JaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShmb3J3X3BhY2tldCwgdG1wX25vZGUsIHNhZmVfdG1wX25vZGUsCi0JCQkJICAmYmF0X3ByaXYtPmZvcndfYmNhc3RfbGlzdCwgbGlzdCkgewotCi0JCS8qKgotCQkgKiBpZiBwdXJnZV9vdXRzdGFuZGluZ19wYWNrZXRzKCkgd2FzIGNhbGxlZCB3aXRoIGFuIGFyZ211bWVudAotCQkgKiB3ZSBkZWxldGUgb25seSBwYWNrZXRzIGJlbG9uZ2luZyB0byB0aGUgZ2l2ZW4gaW50ZXJmYWNlCi0JCSAqLwotCQlpZiAoKGJhdG1hbl9pZikgJiYKLQkJICAgIChmb3J3X3BhY2tldC0+aWZfaW5jb21pbmcgIT0gYmF0bWFuX2lmKSkKLQkJCWNvbnRpbnVlOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5mb3J3X2JjYXN0X2xpc3RfbG9jaywgZmxhZ3MpOwotCi0JCS8qKgotCQkgKiBzZW5kX291dHN0YW5kaW5nX2JjYXN0X3BhY2tldCgpIHdpbGwgbG9jayB0aGUgbGlzdCB0bwotCQkgKiBkZWxldGUgdGhlIGl0ZW0gZnJvbSB0aGUgbGlzdAotCQkgKi8KLQkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZmb3J3X3BhY2tldC0+ZGVsYXllZF93b3JrKTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5mb3J3X2JjYXN0X2xpc3RfbG9jaywgZmxhZ3MpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+Zm9yd19iY2FzdF9saXN0X2xvY2ssIGZsYWdzKTsKLQotCS8qIGZyZWUgYmF0bWFuIHBhY2tldCBsaXN0ICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5mb3J3X2JhdF9saXN0X2xvY2ssIGZsYWdzKTsKLQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGZvcndfcGFja2V0LCB0bXBfbm9kZSwgc2FmZV90bXBfbm9kZSwKLQkJCQkgICZiYXRfcHJpdi0+Zm9yd19iYXRfbGlzdCwgbGlzdCkgewotCi0JCS8qKgotCQkgKiBpZiBwdXJnZV9vdXRzdGFuZGluZ19wYWNrZXRzKCkgd2FzIGNhbGxlZCB3aXRoIGFuIGFyZ211bWVudAotCQkgKiB3ZSBkZWxldGUgb25seSBwYWNrZXRzIGJlbG9uZ2luZyB0byB0aGUgZ2l2ZW4gaW50ZXJmYWNlCi0JCSAqLwotCQlpZiAoKGJhdG1hbl9pZikgJiYKLQkJICAgIChmb3J3X3BhY2tldC0+aWZfaW5jb21pbmcgIT0gYmF0bWFuX2lmKSkKLQkJCWNvbnRpbnVlOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5mb3J3X2JhdF9saXN0X2xvY2ssIGZsYWdzKTsKLQotCQkvKioKLQkJICogc2VuZF9vdXRzdGFuZGluZ19iYXRfcGFja2V0KCkgd2lsbCBsb2NrIHRoZSBsaXN0IHRvCi0JCSAqIGRlbGV0ZSB0aGUgaXRlbSBmcm9tIHRoZSBsaXN0Ci0JCSAqLwotCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmZvcndfcGFja2V0LT5kZWxheWVkX3dvcmspOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPmZvcndfYmF0X2xpc3RfbG9jaywgZmxhZ3MpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+Zm9yd19iYXRfbGlzdF9sb2NrLCBmbGFncyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9zZW5kLmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9zZW5kLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0Y2VmYTguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvc2VuZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6Ci0gKgotICogTWFyZWsgTGluZG5lciwgU2ltb24gV3VuZGVybGljaAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotICogMDIxMTAtMTMwMSwgVVNBCi0gKgotICovCi0KLSNpZm5kZWYgX05FVF9CQVRNQU5fQURWX1NFTkRfSF8KLSNkZWZpbmUgX05FVF9CQVRNQU5fQURWX1NFTkRfSF8KLQotI2luY2x1ZGUgInR5cGVzLmgiCi0KLWludCBzZW5kX3NrYl9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQlzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYsCi0JCQkJdWludDhfdCAqZHN0X2FkZHIpOwotdm9pZCBzY2hlZHVsZV9vd25fcGFja2V0KHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZik7Ci12b2lkIHNjaGVkdWxlX2ZvcndhcmRfcGFja2V0KHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwKLQkJCSAgICAgc3RydWN0IGV0aGhkciAqZXRoaGRyLAotCQkJICAgICBzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldCwKLQkJCSAgICAgdWludDhfdCBkaXJlY3RsaW5rLCBpbnQgaG5hX2J1ZmZfbGVuLAotCQkJICAgICBzdHJ1Y3QgYmF0bWFuX2lmICppZl9vdXRnb2luZyk7Ci1pbnQgYWRkX2JjYXN0X3BhY2tldF90b19saXN0KHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsIHN0cnVjdCBza19idWZmICpza2IpOwotdm9pZCBzZW5kX291dHN0YW5kaW5nX2JhdF9wYWNrZXQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKLXZvaWQgcHVyZ2Vfb3V0c3RhbmRpbmdfcGFja2V0cyhzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJICAgICAgIHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZik7Ci0KLSNlbmRpZiAvKiBfTkVUX0JBVE1BTl9BRFZfU0VORF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvc29mdC1pbnRlcmZhY2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3NvZnQtaW50ZXJmYWNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlOTk2MTguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvc29mdC1pbnRlcmZhY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDM5OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKLSAqCi0gKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxLCBVU0EKLSAqCi0gKi8KLQotI2luY2x1ZGUgIm1haW4uaCIKLSNpbmNsdWRlICJzb2Z0LWludGVyZmFjZS5oIgotI2luY2x1ZGUgImhhcmQtaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAicm91dGluZy5oIgotI2luY2x1ZGUgInNlbmQuaCIKLSNpbmNsdWRlICJiYXRfZGVidWdmcy5oIgotI2luY2x1ZGUgInRyYW5zbGF0aW9uLXRhYmxlLmgiCi0jaW5jbHVkZSAidHlwZXMuaCIKLSNpbmNsdWRlICJoYXNoLmgiCi0jaW5jbHVkZSAic2VuZC5oIgotI2luY2x1ZGUgImJhdF9zeXNmcy5oIgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlICJ1bmljYXN0LmgiCi0KLQotc3RhdGljIGludCBiYXRfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKTsKLXN0YXRpYyB2b2lkIGJhdF9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pOwotc3RhdGljIHUzMiBiYXRfZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotc3RhdGljIHZvaWQgYmF0X3NldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgdmFsdWUpOwotc3RhdGljIHUzMiBiYXRfZ2V0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1zdGF0aWMgdTMyIGJhdF9nZXRfcnhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyBpbnQgYmF0X3NldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBiYXRfZXRodG9vbF9vcHMgPSB7Ci0JLmdldF9zZXR0aW5ncyA9IGJhdF9nZXRfc2V0dGluZ3MsCi0JLmdldF9kcnZpbmZvID0gYmF0X2dldF9kcnZpbmZvLAotCS5nZXRfbXNnbGV2ZWwgPSBiYXRfZ2V0X21zZ2xldmVsLAotCS5zZXRfbXNnbGV2ZWwgPSBiYXRfc2V0X21zZ2xldmVsLAotCS5nZXRfbGluayA9IGJhdF9nZXRfbGluaywKLQkuZ2V0X3J4X2NzdW0gPSBiYXRfZ2V0X3J4X2NzdW0sCi0JLnNldF9yeF9jc3VtID0gYmF0X3NldF9yeF9jc3VtCi19OwotCi1pbnQgbXlfc2tiX2hlYWRfcHVzaChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgbGVuKQotewotCWludCByZXN1bHQ7Ci0KLQkvKioKLQkgKiBUT0RPOiBXZSBtdXN0IGNoZWNrIGlmIHdlIGNhbiByZWxlYXNlIGFsbCByZWZlcmVuY2VzIHRvIG5vbi1wYXlsb2FkCi0JICogZGF0YSB1c2luZyBza2JfaGVhZGVyX3JlbGVhc2UgaW4gb3VyIHNrYnMgdG8gYWxsb3cgc2tiX2Nvd19oZWFkZXIgdG8KLQkgKiB3b3JrIG9wdGltYWxseS4gVGhpcyBtZWFucyB0aGF0IHRob3NlIHNrYnMgYXJlIG5vdCBhbGxvd2VkIHRvIHJlYWQKLQkgKiBvciB3cml0ZSBhbnkgZGF0YSB3aGljaCBpcyBiZWZvcmUgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2Ygc2tiLT5kYXRhCi0JICogYWZ0ZXIgdGhhdCBjYWxsIGFuZCB0aHVzIGFsbG93IG90aGVyIHNrYnMgd2l0aCB0aGUgc2FtZSBkYXRhIGJ1ZmZlcgotCSAqIHRvIHdyaXRlIGZyZWVseSBpbiB0aGF0IGFyZWEuCi0JICovCi0JcmVzdWx0ID0gc2tiX2Nvd19oZWFkKHNrYiwgbGVuKTsKLQlpZiAocmVzdWx0IDwgMCkKLQkJcmV0dXJuIHJlc3VsdDsKLQotCXNrYl9wdXNoKHNrYiwgbGVuKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBpbnRlcmZhY2Vfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaW50ZXJmYWNlX3JlbGVhc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQluZXRpZl9zdG9wX3F1ZXVlKGRldik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaW50ZXJmYWNlX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0JcmV0dXJuICZiYXRfcHJpdi0+c3RhdHM7Ci19Ci0KLXN0YXRpYyBpbnQgaW50ZXJmYWNlX3NldF9tYWNfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICpwKQotewotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IHA7Ci0KLQlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoYWRkci0+c2FfZGF0YSkpCi0JCXJldHVybiAtRUFERFJOT1RBVkFJTDsKLQotCS8qIG9ubHkgbW9kaWZ5IGhuYS10YWJsZSBpZiBpdCBoYXMgYmVlbiBpbml0aWFsaXNlZCBiZWZvcmUgKi8KLQlpZiAoYXRvbWljX3JlYWQoJmJhdF9wcml2LT5tZXNoX3N0YXRlKSA9PSBNRVNIX0FDVElWRSkgewotCQlobmFfbG9jYWxfcmVtb3ZlKGJhdF9wcml2LCBkZXYtPmRldl9hZGRyLAotCQkJCSAibWFjIGFkZHJlc3MgY2hhbmdlZCIpOwotCQlobmFfbG9jYWxfYWRkKGRldiwgYWRkci0+c2FfZGF0YSk7Ci0JfQotCi0JbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIEVUSF9BTEVOKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGludGVyZmFjZV9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQotewotCS8qIGNoZWNrIHJhbmdlcyAqLwotCWlmICgobmV3X210dSA8IDY4KSB8fCAobmV3X210dSA+IGhhcmRpZl9taW5fbXR1KGRldikpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWRldi0+bXR1ID0gbmV3X210dTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgaW50ZXJmYWNlX3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlKQotewotCXN0cnVjdCBldGhoZHIgKmV0aGhkciA9IChzdHJ1Y3QgZXRoaGRyICopc2tiLT5kYXRhOwotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihzb2Z0X2lmYWNlKTsKLQlzdHJ1Y3QgYmNhc3RfcGFja2V0ICpiY2FzdF9wYWNrZXQ7Ci0JaW50IGRhdGFfbGVuID0gc2tiLT5sZW4sIHJldDsKLQotCWlmIChhdG9taWNfcmVhZCgmYmF0X3ByaXYtPm1lc2hfc3RhdGUpICE9IE1FU0hfQUNUSVZFKQotCQlnb3RvIGRyb3BwZWQ7Ci0KLQlzb2Z0X2lmYWNlLT50cmFuc19zdGFydCA9IGppZmZpZXM7Ci0KLQkvKiBUT0RPOiBjaGVjayB0aGlzIGZvciBsb2NrcyAqLwotCWhuYV9sb2NhbF9hZGQoc29mdF9pZmFjZSwgZXRoaGRyLT5oX3NvdXJjZSk7Ci0KLQkvKiBldGhlcm5ldCBwYWNrZXQgc2hvdWxkIGJlIGJyb2FkY2FzdGVkICovCi0JaWYgKGlzX2JjYXN0KGV0aGhkci0+aF9kZXN0KSB8fCBpc19tY2FzdChldGhoZHItPmhfZGVzdCkpIHsKLQkJaWYgKCFiYXRfcHJpdi0+cHJpbWFyeV9pZikKLQkJCWdvdG8gZHJvcHBlZDsKLQotCQlpZiAobXlfc2tiX2hlYWRfcHVzaChza2IsIHNpemVvZihzdHJ1Y3QgYmNhc3RfcGFja2V0KSkgPCAwKQotCQkJZ290byBkcm9wcGVkOwotCi0JCWJjYXN0X3BhY2tldCA9IChzdHJ1Y3QgYmNhc3RfcGFja2V0ICopc2tiLT5kYXRhOwotCQliY2FzdF9wYWNrZXQtPnZlcnNpb24gPSBDT01QQVRfVkVSU0lPTjsKLQkJYmNhc3RfcGFja2V0LT50dGwgPSBUVEw7Ci0KLQkJLyogYmF0bWFuIHBhY2tldCB0eXBlOiBicm9hZGNhc3QgKi8KLQkJYmNhc3RfcGFja2V0LT5wYWNrZXRfdHlwZSA9IEJBVF9CQ0FTVDsKLQotCQkvKiBodyBhZGRyZXNzIG9mIGZpcnN0IGludGVyZmFjZSBpcyB0aGUgb3JpZyBtYWMgYmVjYXVzZSBvbmx5Ci0JCSAqIHRoaXMgbWFjIGlzIGtub3duIHRocm91Z2hvdXQgdGhlIG1lc2ggKi8KLQkJbWVtY3B5KGJjYXN0X3BhY2tldC0+b3JpZywKLQkJICAgICAgIGJhdF9wcml2LT5wcmltYXJ5X2lmLT5uZXRfZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwotCi0JCS8qIHNldCBicm9hZGNhc3Qgc2VxdWVuY2UgbnVtYmVyICovCi0JCWJjYXN0X3BhY2tldC0+c2Vxbm8gPQotCQkJaHRvbmwoYXRvbWljX2luY19yZXR1cm4oJmJhdF9wcml2LT5iY2FzdF9zZXFubykpOwotCi0JCWFkZF9iY2FzdF9wYWNrZXRfdG9fbGlzdChiYXRfcHJpdiwgc2tiKTsKLQotCQkvKiBhIGNvcHkgaXMgc3RvcmVkIGluIHRoZSBiY2FzdCBsaXN0LCB0aGVyZWZvcmUgcmVtb3ZpbmcKLQkJICogdGhlIG9yaWdpbmFsIHNrYi4gKi8KLQkJa2ZyZWVfc2tiKHNrYik7Ci0KLQkvKiB1bmljYXN0IHBhY2tldCAqLwotCX0gZWxzZSB7Ci0JCXJldCA9IHVuaWNhc3Rfc2VuZF9za2Ioc2tiLCBiYXRfcHJpdik7Ci0JCWlmIChyZXQgIT0gMCkKLQkJCWdvdG8gZHJvcHBlZF9mcmVlZDsKLQl9Ci0KLQliYXRfcHJpdi0+c3RhdHMudHhfcGFja2V0cysrOwotCWJhdF9wcml2LT5zdGF0cy50eF9ieXRlcyArPSBkYXRhX2xlbjsKLQlnb3RvIGVuZDsKLQotZHJvcHBlZDoKLQlrZnJlZV9za2Ioc2tiKTsKLWRyb3BwZWRfZnJlZWQ6Ci0JYmF0X3ByaXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKLWVuZDoKLQlyZXR1cm4gTkVUREVWX1RYX09LOwotfQotCi12b2lkIGludGVyZmFjZV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZSwKLQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX3NpemUpCi17Ci0Jc3RydWN0IGJhdF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoc29mdF9pZmFjZSk7Ci0KLQkvKiBjaGVjayBpZiBlbm91Z2ggc3BhY2UgaXMgYXZhaWxhYmxlIGZvciBwdWxsaW5nLCBhbmQgcHVsbCAqLwotCWlmICghcHNrYl9tYXlfcHVsbChza2IsIGhkcl9zaXplKSkKLQkJZ290byBkcm9wcGVkOwotCi0Jc2tiX3B1bGxfcmNzdW0oc2tiLCBoZHJfc2l6ZSk7Ci0vKglza2Jfc2V0X21hY19oZWFkZXIoc2tiLCAtc2l6ZW9mKHN0cnVjdCBldGhoZHIpKTsqLwotCi0JLyogc2tiLT5kZXYgJiBza2ItPnBrdF90eXBlIGFyZSBzZXQgaGVyZSAqLwotCWlmICh1bmxpa2VseSghcHNrYl9tYXlfcHVsbChza2IsIEVUSF9ITEVOKSkpCi0JCWdvdG8gZHJvcHBlZDsKLQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBzb2Z0X2lmYWNlKTsKLQotCS8qIHNob3VsZCBub3QgYmUgbmVjY2VzYXJ5IGFueW1vcmUgYXMgd2UgdXNlIHNrYl9wdWxsX3Jjc3VtKCkKLQkgKiBUT0RPOiBwbGVhc2UgdmVyaWZ5IHRoaXMgYW5kIHJlbW92ZSB0aGlzIFRPRE8KLQkgKiAtLSBEZWMgMjFzdCAyMDA5LCBTaW1vbiBXdW5kZXJsaWNoICovCi0KLS8qCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7Ki8KLQotCXByaXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKLQlwcml2LT5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbiArIHNpemVvZihzdHJ1Y3QgZXRoaGRyKTsKLQotCXNvZnRfaWZhY2UtPmxhc3RfcnggPSBqaWZmaWVzOwotCi0JbmV0aWZfcngoc2tiKTsKLQlyZXR1cm47Ci0KLWRyb3BwZWQ6Ci0Ja2ZyZWVfc2tiKHNrYik7Ci0JcmV0dXJuOwotfQotCi0jaWZkZWYgSEFWRV9ORVRfREVWSUNFX09QUwotc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBiYXRfbmV0ZGV2X29wcyA9IHsKLQkubmRvX29wZW4gPSBpbnRlcmZhY2Vfb3BlbiwKLQkubmRvX3N0b3AgPSBpbnRlcmZhY2VfcmVsZWFzZSwKLQkubmRvX2dldF9zdGF0cyA9IGludGVyZmFjZV9zdGF0cywKLQkubmRvX3NldF9tYWNfYWRkcmVzcyA9IGludGVyZmFjZV9zZXRfbWFjX2FkZHIsCi0JLm5kb19jaGFuZ2VfbXR1ID0gaW50ZXJmYWNlX2NoYW5nZV9tdHUsCi0JLm5kb19zdGFydF94bWl0ID0gaW50ZXJmYWNlX3R4LAotCS5uZG9fdmFsaWRhdGVfYWRkciA9IGV0aF92YWxpZGF0ZV9hZGRyCi19OwotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGludGVyZmFjZV9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBiYXRfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0JY2hhciBkZXZfYWRkcltFVEhfQUxFTl07Ci0KLQlldGhlcl9zZXR1cChkZXYpOwotCi0jaWZkZWYgSEFWRV9ORVRfREVWSUNFX09QUwotCWRldi0+bmV0ZGV2X29wcyA9ICZiYXRfbmV0ZGV2X29wczsKLSNlbHNlCi0JZGV2LT5vcGVuID0gaW50ZXJmYWNlX29wZW47Ci0JZGV2LT5zdG9wID0gaW50ZXJmYWNlX3JlbGVhc2U7Ci0JZGV2LT5nZXRfc3RhdHMgPSBpbnRlcmZhY2Vfc3RhdHM7Ci0JZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBpbnRlcmZhY2Vfc2V0X21hY19hZGRyOwotCWRldi0+Y2hhbmdlX210dSA9IGludGVyZmFjZV9jaGFuZ2VfbXR1OwotCWRldi0+aGFyZF9zdGFydF94bWl0ID0gaW50ZXJmYWNlX3R4OwotI2VuZGlmCi0JZGV2LT5kZXN0cnVjdG9yID0gZnJlZV9uZXRkZXY7Ci0KLQkvKioKLQkgKiBjYW4ndCBjYWxsIG1pbl9tdHUsIGJlY2F1c2UgdGhlIG5lZWRlZCB2YXJpYWJsZXMKLQkgKiBoYXZlIG5vdCBiZWVuIGluaXRpYWxpemVkIHlldAotCSAqLwotCWRldi0+bXR1ID0gRVRIX0RBVEFfTEVOOwotCWRldi0+aGFyZF9oZWFkZXJfbGVuID0gQkFUX0hFQURFUl9MRU47IC8qIHJlc2VydmUgbW9yZSBzcGFjZSBpbiB0aGUKLQkJCQkJCSogc2tidWZmIGZvciBvdXIgaGVhZGVyICovCi0KLQkvKiBnZW5lcmF0ZSByYW5kb20gYWRkcmVzcyAqLwotCXJhbmRvbV9ldGhlcl9hZGRyKGRldl9hZGRyKTsKLQltZW1jcHkoZGV2LT5kZXZfYWRkciwgZGV2X2FkZHIsIEVUSF9BTEVOKTsKLQotCVNFVF9FVEhUT09MX09QUyhkZXYsICZiYXRfZXRodG9vbF9vcHMpOwotCi0JbWVtc2V0KHByaXYsIDAsIHNpemVvZihzdHJ1Y3QgYmF0X3ByaXYpKTsKLX0KLQotc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRpZl9jcmVhdGUoY2hhciAqbmFtZSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZTsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2OwotCWludCByZXQ7Ci0KLQlzb2Z0X2lmYWNlID0gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3QgYmF0X3ByaXYpICwgbmFtZSwKLQkJCQkgICBpbnRlcmZhY2Vfc2V0dXApOwotCi0JaWYgKCFzb2Z0X2lmYWNlKSB7Ci0JCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIHRoZSBiYXRtYW4gaW50ZXJmYWNlOiAlc1xuIiwgbmFtZSk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXJldCA9IHJlZ2lzdGVyX25ldGRldihzb2Z0X2lmYWNlKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIlVuYWJsZSB0byByZWdpc3RlciB0aGUgYmF0bWFuIGludGVyZmFjZSAnJXMnOiAlaVxuIiwKLQkJICAgICAgIG5hbWUsIHJldCk7Ci0JCWdvdG8gZnJlZV9zb2Z0X2lmYWNlOwotCX0KLQotCWJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoc29mdF9pZmFjZSk7Ci0KLQlhdG9taWNfc2V0KCZiYXRfcHJpdi0+YWdncmVnYXRpb25fZW5hYmxlZCwgMSk7Ci0JYXRvbWljX3NldCgmYmF0X3ByaXYtPmJvbmRpbmdfZW5hYmxlZCwgMCk7Ci0JYXRvbWljX3NldCgmYmF0X3ByaXYtPnZpc19tb2RlLCBWSVNfVFlQRV9DTElFTlRfVVBEQVRFKTsKLQlhdG9taWNfc2V0KCZiYXRfcHJpdi0+b3JpZ19pbnRlcnZhbCwgMTAwMCk7Ci0JYXRvbWljX3NldCgmYmF0X3ByaXYtPmxvZ19sZXZlbCwgMCk7Ci0JYXRvbWljX3NldCgmYmF0X3ByaXYtPmZyYWdfZW5hYmxlZCwgMSk7Ci0JYXRvbWljX3NldCgmYmF0X3ByaXYtPmJjYXN0X3F1ZXVlX2xlZnQsIEJDQVNUX1FVRVVFX0xFTik7Ci0JYXRvbWljX3NldCgmYmF0X3ByaXYtPmJhdG1hbl9xdWV1ZV9sZWZ0LCBCQVRNQU5fUVVFVUVfTEVOKTsKLQotCWF0b21pY19zZXQoJmJhdF9wcml2LT5tZXNoX3N0YXRlLCBNRVNIX0lOQUNUSVZFKTsKLQlhdG9taWNfc2V0KCZiYXRfcHJpdi0+YmNhc3Rfc2Vxbm8sIDEpOwotCWF0b21pY19zZXQoJmJhdF9wcml2LT5obmFfbG9jYWxfY2hhbmdlZCwgMCk7Ci0KLQliYXRfcHJpdi0+cHJpbWFyeV9pZiA9IE5VTEw7Ci0JYmF0X3ByaXYtPm51bV9pZmFjZXMgPSAwOwotCi0JcmV0ID0gc3lzZnNfYWRkX21lc2hpZihzb2Z0X2lmYWNlKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byB1bnJlZ19zb2Z0X2lmYWNlOwotCi0JcmV0ID0gZGVidWdmc19hZGRfbWVzaGlmKHNvZnRfaWZhY2UpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIHVucmVnX3N5c2ZzOwotCi0JcmV0ID0gbWVzaF9pbml0KHNvZnRfaWZhY2UpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIHVucmVnX2RlYnVnZnM7Ci0KLQlyZXR1cm4gc29mdF9pZmFjZTsKLQotdW5yZWdfZGVidWdmczoKLQlkZWJ1Z2ZzX2RlbF9tZXNoaWYoc29mdF9pZmFjZSk7Ci11bnJlZ19zeXNmczoKLQlzeXNmc19kZWxfbWVzaGlmKHNvZnRfaWZhY2UpOwotdW5yZWdfc29mdF9pZmFjZToKLQl1bnJlZ2lzdGVyX25ldGRldihzb2Z0X2lmYWNlKTsKLQlyZXR1cm4gTlVMTDsKLQotZnJlZV9zb2Z0X2lmYWNlOgotCWZyZWVfbmV0ZGV2KHNvZnRfaWZhY2UpOwotb3V0OgotCXJldHVybiBOVUxMOwotfQotCi12b2lkIHNvZnRpZl9kZXN0cm95KHN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlKQotewotCWRlYnVnZnNfZGVsX21lc2hpZihzb2Z0X2lmYWNlKTsKLQlzeXNmc19kZWxfbWVzaGlmKHNvZnRfaWZhY2UpOwotCW1lc2hfZnJlZShzb2Z0X2lmYWNlKTsKLQl1bnJlZ2lzdGVyX25ldGRldmljZShzb2Z0X2lmYWNlKTsKLX0KLQotLyogZXRodG9vbCAqLwotc3RhdGljIGludCBiYXRfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQotewotCWNtZC0+c3VwcG9ydGVkID0gMDsKLQljbWQtPmFkdmVydGlzaW5nID0gMDsKLQljbWQtPnNwZWVkID0gU1BFRURfMTA7Ci0JY21kLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKLQljbWQtPnBvcnQgPSBQT1JUX1RQOwotCWNtZC0+cGh5X2FkZHJlc3MgPSAwOwotCWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0lOVEVSTkFMOwotCWNtZC0+YXV0b25lZyA9IEFVVE9ORUdfRElTQUJMRTsKLQljbWQtPm1heHR4cGt0ID0gMDsKLQljbWQtPm1heHJ4cGt0ID0gMDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBiYXRfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQotewotCXN0cmNweShpbmZvLT5kcml2ZXIsICJCLkEuVC5NLkEuTi4gYWR2YW5jZWQiKTsKLQlzdHJjcHkoaW5mby0+dmVyc2lvbiwgU09VUkNFX1ZFUlNJT04pOwotCXN0cmNweShpbmZvLT5md192ZXJzaW9uLCAiTi9BIik7Ci0Jc3RyY3B5KGluZm8tPmJ1c19pbmZvLCAiYmF0bWFuIik7Ci19Ci0KLXN0YXRpYyB1MzIgYmF0X2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXJldHVybiAtRU9QTk9UU1VQUDsKLX0KLQotc3RhdGljIHZvaWQgYmF0X3NldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgdmFsdWUpCi17Ci19Ci0KLXN0YXRpYyB1MzIgYmF0X2dldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB1MzIgYmF0X2dldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYmF0X3NldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhKQotewotCXJldHVybiAtRU9QTk9UU1VQUDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3NvZnQtaW50ZXJmYWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9zb2Z0LWludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDNhN2VjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3NvZnQtaW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKLSAqCi0gKiBNYXJlayBMaW5kbmVyCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxLCBVU0EKLSAqCi0gKi8KLQotI2lmbmRlZiBfTkVUX0JBVE1BTl9BRFZfU09GVF9JTlRFUkZBQ0VfSF8KLSNkZWZpbmUgX05FVF9CQVRNQU5fQURWX1NPRlRfSU5URVJGQUNFX0hfCi0KLWludCBteV9za2JfaGVhZF9wdXNoKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBsZW4pOwotaW50IGludGVyZmFjZV90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZSk7Ci12b2lkIGludGVyZmFjZV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZSwKLQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX3NpemUpOwotc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRpZl9jcmVhdGUoY2hhciAqbmFtZSk7Ci12b2lkIHNvZnRpZl9kZXN0cm95KHN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlKTsKLQotI2VuZGlmIC8qIF9ORVRfQkFUTUFOX0FEVl9TT0ZUX0lOVEVSRkFDRV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvc3lzZnMtY2xhc3MtbmV0LWJhdG1hbi1hZHYgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9zeXNmcy1jbGFzcy1uZXQtYmF0bWFuLWFkdgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhkZDc2MmRlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3N5c2ZzLWNsYXNzLW5ldC1iYXRtYW4tYWR2CisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotCi1XaGF0OiAgICAgICAgICAgL3N5cy9jbGFzcy9uZXQvPGlmYWNlPi9iYXRtYW4tYWR2L21lc2hfaWZhY2UKLURhdGU6ICAgICAgICAgICBNYXkgMjAxMAotQ29udGFjdDogICAgICAgIE1hcmVrIExpbmRuZXIgPGxpbmRuZXJfbWFyZWtAeWFob28uZGU+Ci1EZXNjcmlwdGlvbjoKLSAgICAgICAgICAgICAgICBUaGUgL3N5cy9jbGFzcy9uZXQvPGlmYWNlPi9iYXRtYW4tYWR2L21lc2hfaWZhY2UgZmlsZQotICAgICAgICAgICAgICAgIGRpc3BsYXlzIHRoZSBiYXRtYW4gbWVzaCBpbnRlcmZhY2UgdGhpcyA8aWZhY2U+Ci0gICAgICAgICAgICAgICAgY3VycmVudGx5IGlzIGFzc29jaWF0ZWQgd2l0aC4KLQotV2hhdDogICAgICAgICAgIC9zeXMvY2xhc3MvbmV0LzxpZmFjZT4vYmF0bWFuLWFkdi9pZmFjZV9zdGF0dXMKLURhdGU6ICAgICAgICAgICBNYXkgMjAxMAotQ29udGFjdDogICAgICAgIE1hcmVrIExpbmRuZXIgPGxpbmRuZXJfbWFyZWtAeWFob28uZGU+Ci1EZXNjcmlwdGlvbjoKLSAgICAgICAgICAgICAgICBJbmRpY2F0ZXMgdGhlIHN0YXR1cyBvZiA8aWZhY2U+IGFzIGl0IGlzIHNlZW4gYnkgYmF0bWFuLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvc3lzZnMtY2xhc3MtbmV0LW1lc2ggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9zeXNmcy1jbGFzcy1uZXQtbWVzaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRjZGI2MC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9zeXNmcy1jbGFzcy1uZXQtbWVzaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLQotV2hhdDogICAgICAgICAgIC9zeXMvY2xhc3MvbmV0LzxtZXNoX2lmYWNlPi9tZXNoL2FnZ3JlZ2F0ZWRfb2dtcwotRGF0ZTogICAgICAgICAgIE1heSAyMDEwCi1Db250YWN0OiAgICAgICAgTWFyZWsgTGluZG5lciA8bGluZG5lcl9tYXJla0B5YWhvby5kZT4KLURlc2NyaXB0aW9uOgotICAgICAgICAgICAgICAgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBiYXRtYW4gcHJvdG9jb2wgbWVzc2FnZXMgb2YgdGhlCi0gICAgICAgICAgICAgICAgbWVzaCA8bWVzaF9pZmFjZT4gc2hhbGwgYmUgYWdncmVnYXRlZCBvciBub3QuCi0KLVdoYXQ6ICAgICAgICAgICAvc3lzL2NsYXNzL25ldC88bWVzaF9pZmFjZT4vbWVzaC9ib25kaW5nCi1EYXRlOiAgICAgICAgICAgSnVuZSAyMDEwCi1Db250YWN0OiAgICAgICAgU2ltb24gV3VuZGVybGljaCA8c2l3dUBocnoudHUtY2hlbW5pdHouZGU+Ci1EZXNjcmlwdGlvbjoKLSAgICAgICAgICAgICAgICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZGF0YSB0cmFmZmljIGdvaW5nIHRocm91Z2ggdGhlCi0gICAgICAgICAgICAgICAgbWVzaCB3aWxsIGJlIHNlbnQgdXNpbmcgbXVsdGlwbGUgaW50ZXJmYWNlcyBhdCB0aGUKLSAgICAgICAgICAgICAgICBzYW1lIHRpbWUgKGlmIGF2YWlsYWJsZSkuCi0KLVdoYXQ6ICAgICAgICAgICAvc3lzL2NsYXNzL25ldC88bWVzaF9pZmFjZT4vbWVzaC9mcmFnbWVudGF0aW9uCi1EYXRlOiAgICAgICAgICAgT2N0b2JlciAyMDEwCi1Db250YWN0OiAgICAgICAgQW5kcmVhcyBMYW5nZXIgPGFuLmxhbmdlckBnbXguZGU+Ci1EZXNjcmlwdGlvbjoKLSAgICAgICAgICAgICAgICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZGF0YSB0cmFmZmljIGdvaW5nIHRocm91Z2ggdGhlCi0gICAgICAgICAgICAgICAgbWVzaCB3aWxsIGJlIGZyYWdtZW50ZWQgb3Igc2lsZW50bHkgZGlzY2FyZGVkIGlmIHRoZQotICAgICAgICAgICAgICAgIHBhY2tldCBzaXplIGV4Y2VlZHMgdGhlIG91dGdvaW5nIGludGVyZmFjZSBNVFUuCi0KLVdoYXQ6ICAgICAgICAgICAvc3lzL2NsYXNzL25ldC88bWVzaF9pZmFjZT4vbWVzaC9vcmlnX2ludGVydmFsCi1EYXRlOiAgICAgICAgICAgTWF5IDIwMTAKLUNvbnRhY3Q6ICAgICAgICBNYXJlayBMaW5kbmVyIDxsaW5kbmVyX21hcmVrQHlhaG9vLmRlPgotRGVzY3JpcHRpb246Ci0gICAgICAgICAgICAgICAgRGVmaW5lcyB0aGUgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzIGluIHdoaWNoIGJhdG1hbgotICAgICAgICAgICAgICAgIHNlbmRzIGl0cyBwcm90b2NvbCBtZXNzYWdlcy4KLQotV2hhdDogICAgICAgICAgIC9zeXMvY2xhc3MvbmV0LzxtZXNoX2lmYWNlPi9tZXNoL3Zpc19tb2RlCi1EYXRlOiAgICAgICAgICAgTWF5IDIwMTAKLUNvbnRhY3Q6ICAgICAgICBNYXJlayBMaW5kbmVyIDxsaW5kbmVyX21hcmVrQHlhaG9vLmRlPgotRGVzY3JpcHRpb246Ci0gICAgICAgICAgICAgICAgRWFjaCBiYXRtYW4gbm9kZSBvbmx5IG1haW50YWlucyBpbmZvcm1hdGlvbiBhYm91dCBpdHMKLSAgICAgICAgICAgICAgICBvd24gbG9jYWwgbmVpZ2hib3Job29kLCB0aGVyZWZvcmUgZ2VuZXJhdGluZyBncmFwaHMKLSAgICAgICAgICAgICAgICBzaG93aW5nIHRoZSB0b3BvbG9neSBvZiB0aGUgZW50aXJlIG1lc2ggaXMgbm90IGVhc2lseQotICAgICAgICAgICAgICAgIGZlYXNpYmxlIHdpdGhvdXQgaGF2aW5nIGEgY2VudHJhbCBpbnN0YW5jZSB0byBjb2xsZWN0Ci0gICAgICAgICAgICAgICAgdGhlIGxvY2FsIHRvcG9sb2dpZXMgZnJvbSBhbGwgbm9kZXMuIFRoaXMgZmlsZSBhbGxvd3MKLSAgICAgICAgICAgICAgICB0byBhY3RpdmF0ZSB0aGUgY29sbGVjdGluZyAoc2VydmVyKSBtb2RlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvdHJhbnNsYXRpb24tdGFibGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3RyYW5zbGF0aW9uLXRhYmxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MWNjYmQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvdHJhbnNsYXRpb24tdGFibGUuYworKysgL2Rldi9udWxsCkBAIC0xLDUxOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKLSAqCi0gKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxLCBVU0EKLSAqCi0gKi8KLQotI2luY2x1ZGUgIm1haW4uaCIKLSNpbmNsdWRlICJ0cmFuc2xhdGlvbi10YWJsZS5oIgotI2luY2x1ZGUgInNvZnQtaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAidHlwZXMuaCIKLSNpbmNsdWRlICJoYXNoLmgiCi0KLXN0YXRpYyB2b2lkIGhuYV9sb2NhbF9wdXJnZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwotc3RhdGljIHZvaWQgX2huYV9nbG9iYWxfZGVsX29yaWcoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCQkgc3RydWN0IGhuYV9nbG9iYWxfZW50cnkgKmhuYV9nbG9iYWxfZW50cnksCi0JCQkJIGNoYXIgKm1lc3NhZ2UpOwotCi1zdGF0aWMgdm9pZCBobmFfbG9jYWxfc3RhcnRfdGltZXIoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKLXsKLQlJTklUX0RFTEFZRURfV09SSygmYmF0X3ByaXYtPmhuYV93b3JrLCBobmFfbG9jYWxfcHVyZ2UpOwotCXF1ZXVlX2RlbGF5ZWRfd29yayhiYXRfZXZlbnRfd29ya3F1ZXVlLCAmYmF0X3ByaXYtPmhuYV93b3JrLCAxMCAqIEhaKTsKLX0KLQotaW50IGhuYV9sb2NhbF9pbml0KHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpCi17Ci0JaWYgKGJhdF9wcml2LT5obmFfbG9jYWxfaGFzaCkKLQkJcmV0dXJuIDE7Ci0KLQliYXRfcHJpdi0+aG5hX2xvY2FsX2hhc2ggPSBoYXNoX25ldygxMjgsIGNvbXBhcmVfb3JpZywgY2hvb3NlX29yaWcpOwotCi0JaWYgKCFiYXRfcHJpdi0+aG5hX2xvY2FsX2hhc2gpCi0JCXJldHVybiAwOwotCi0JYXRvbWljX3NldCgmYmF0X3ByaXYtPmhuYV9sb2NhbF9jaGFuZ2VkLCAwKTsKLQlobmFfbG9jYWxfc3RhcnRfdGltZXIoYmF0X3ByaXYpOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXZvaWQgaG5hX2xvY2FsX2FkZChzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZSwgdWludDhfdCAqYWRkcikKLXsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoc29mdF9pZmFjZSk7Ci0Jc3RydWN0IGhuYV9sb2NhbF9lbnRyeSAqaG5hX2xvY2FsX2VudHJ5OwotCXN0cnVjdCBobmFfZ2xvYmFsX2VudHJ5ICpobmFfZ2xvYmFsX2VudHJ5OwotCXN0cnVjdCBoYXNodGFibGVfdCAqc3dhcGhhc2g7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmVxdWlyZWRfYnl0ZXM7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPmhuYV9saGFzaF9sb2NrLCBmbGFncyk7Ci0JaG5hX2xvY2FsX2VudHJ5ID0KLQkJKChzdHJ1Y3QgaG5hX2xvY2FsX2VudHJ5ICopaGFzaF9maW5kKGJhdF9wcml2LT5obmFfbG9jYWxfaGFzaCwKLQkJCQkJCSAgICAgYWRkcikpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5obmFfbGhhc2hfbG9jaywgZmxhZ3MpOwotCi0JaWYgKGhuYV9sb2NhbF9lbnRyeSkgewotCQlobmFfbG9jYWxfZW50cnktPmxhc3Rfc2VlbiA9IGppZmZpZXM7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBvbmx5IGFubm91bmNlIGFzIG1hbnkgaG9zdHMgYXMgcG9zc2libGUgaW4gdGhlIGJhdG1hbi1wYWNrZXQgYW5kCi0JICAgc3BhY2UgaW4gYmF0bWFuX3BhY2tldC0+bnVtX2huYSBUaGF0IGFsc28gc2hvdWxkIGdpdmUgYSBsaW1pdCB0bwotCSAgIE1BQy1mbG9vZGluZy4gKi8KLQlyZXF1aXJlZF9ieXRlcyA9IChiYXRfcHJpdi0+bnVtX2xvY2FsX2huYSArIDEpICogRVRIX0FMRU47Ci0JcmVxdWlyZWRfYnl0ZXMgKz0gQkFUX1BBQ0tFVF9MRU47Ci0KLQlpZiAoKHJlcXVpcmVkX2J5dGVzID4gRVRIX0RBVEFfTEVOKSB8fAotCSAgICAoYXRvbWljX3JlYWQoJmJhdF9wcml2LT5hZ2dyZWdhdGlvbl9lbmFibGVkKSAmJgotCSAgICAgcmVxdWlyZWRfYnl0ZXMgPiBNQVhfQUdHUkVHQVRJT05fQllURVMpIHx8Ci0JICAgIChiYXRfcHJpdi0+bnVtX2xvY2FsX2huYSArIDEgPiAyNTUpKSB7Ci0JCWJhdF9kYmcoREJHX1JPVVRFUywgYmF0X3ByaXYsCi0JCQkiQ2FuJ3QgYWRkIG5ldyBsb2NhbCBobmEgZW50cnkgKCVwTSk6ICIKLQkJCSJudW1iZXIgb2YgbG9jYWwgaG5hIGVudHJpZXMgZXhjZWVkcyBwYWNrZXQgc2l6ZVxuIiwKLQkJCWFkZHIpOwotCQlyZXR1cm47Ci0JfQotCi0JYmF0X2RiZyhEQkdfUk9VVEVTLCBiYXRfcHJpdiwKLQkJIkNyZWF0aW5nIG5ldyBsb2NhbCBobmEgZW50cnk6ICVwTVxuIiwgYWRkcik7Ci0KLQlobmFfbG9jYWxfZW50cnkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaG5hX2xvY2FsX2VudHJ5KSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFobmFfbG9jYWxfZW50cnkpCi0JCXJldHVybjsKLQotCW1lbWNweShobmFfbG9jYWxfZW50cnktPmFkZHIsIGFkZHIsIEVUSF9BTEVOKTsKLQlobmFfbG9jYWxfZW50cnktPmxhc3Rfc2VlbiA9IGppZmZpZXM7Ci0KLQkvKiB0aGUgYmF0bWFuIGludGVyZmFjZSBtYWMgYWRkcmVzcyBzaG91bGQgbmV2ZXIgYmUgcHVyZ2VkICovCi0JaWYgKGNvbXBhcmVfb3JpZyhhZGRyLCBzb2Z0X2lmYWNlLT5kZXZfYWRkcikpCi0JCWhuYV9sb2NhbF9lbnRyeS0+bmV2ZXJfcHVyZ2UgPSAxOwotCWVsc2UKLQkJaG5hX2xvY2FsX2VudHJ5LT5uZXZlcl9wdXJnZSA9IDA7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPmhuYV9saGFzaF9sb2NrLCBmbGFncyk7Ci0KLQloYXNoX2FkZChiYXRfcHJpdi0+aG5hX2xvY2FsX2hhc2gsIGhuYV9sb2NhbF9lbnRyeSk7Ci0JYmF0X3ByaXYtPm51bV9sb2NhbF9obmErKzsKLQlhdG9taWNfc2V0KCZiYXRfcHJpdi0+aG5hX2xvY2FsX2NoYW5nZWQsIDEpOwotCi0JaWYgKGJhdF9wcml2LT5obmFfbG9jYWxfaGFzaC0+ZWxlbWVudHMgKiA0ID4KLQkJCQkJYmF0X3ByaXYtPmhuYV9sb2NhbF9oYXNoLT5zaXplKSB7Ci0JCXN3YXBoYXNoID0gaGFzaF9yZXNpemUoYmF0X3ByaXYtPmhuYV9sb2NhbF9oYXNoLAotCQkJCSAgICAgICBiYXRfcHJpdi0+aG5hX2xvY2FsX2hhc2gtPnNpemUgKiAyKTsKLQotCQlpZiAoIXN3YXBoYXNoKQotCQkJcHJfZXJyKCJDb3VsZG4ndCByZXNpemUgbG9jYWwgaG5hIGhhc2ggdGFibGVcbiIpOwotCQllbHNlCi0JCQliYXRfcHJpdi0+aG5hX2xvY2FsX2hhc2ggPSBzd2FwaGFzaDsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+aG5hX2xoYXNoX2xvY2ssIGZsYWdzKTsKLQotCS8qIHJlbW92ZSBhZGRyZXNzIGZyb20gZ2xvYmFsIGhhc2ggaWYgcHJlc2VudCAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+aG5hX2doYXNoX2xvY2ssIGZsYWdzKTsKLQotCWhuYV9nbG9iYWxfZW50cnkgPSAoKHN0cnVjdCBobmFfZ2xvYmFsX2VudHJ5ICopCi0JCQkJaGFzaF9maW5kKGJhdF9wcml2LT5obmFfZ2xvYmFsX2hhc2gsIGFkZHIpKTsKLQotCWlmIChobmFfZ2xvYmFsX2VudHJ5KQotCQlfaG5hX2dsb2JhbF9kZWxfb3JpZyhiYXRfcHJpdiwgaG5hX2dsb2JhbF9lbnRyeSwKLQkJCQkgICAgICJsb2NhbCBobmEgcmVjZWl2ZWQiKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5obmFfZ2hhc2hfbG9jaywgZmxhZ3MpOwotfQotCi1pbnQgaG5hX2xvY2FsX2ZpbGxfYnVmZmVyKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkgIHVuc2lnbmVkIGNoYXIgKmJ1ZmYsIGludCBidWZmX2xlbikKLXsKLQlzdHJ1Y3QgaG5hX2xvY2FsX2VudHJ5ICpobmFfbG9jYWxfZW50cnk7Ci0JSEFTSElUKGhhc2hpdCk7Ci0JaW50IGkgPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPmhuYV9saGFzaF9sb2NrLCBmbGFncyk7Ci0KLQl3aGlsZSAoaGFzaF9pdGVyYXRlKGJhdF9wcml2LT5obmFfbG9jYWxfaGFzaCwgJmhhc2hpdCkpIHsKLQotCQlpZiAoYnVmZl9sZW4gPCAoaSArIDEpICogRVRIX0FMRU4pCi0JCQlicmVhazsKLQotCQlobmFfbG9jYWxfZW50cnkgPSBoYXNoaXQuYnVja2V0LT5kYXRhOwotCQltZW1jcHkoYnVmZiArIChpICogRVRIX0FMRU4pLCBobmFfbG9jYWxfZW50cnktPmFkZHIsIEVUSF9BTEVOKTsKLQotCQlpKys7Ci0JfQotCi0JLyogaWYgd2UgZGlkIG5vdCBnZXQgYWxsIG5ldyBsb2NhbCBobmFzIHNlZSB5b3UgbmV4dCB0aW1lICA7LSkgKi8KLQlpZiAoaSA9PSBiYXRfcHJpdi0+bnVtX2xvY2FsX2huYSkKLQkJYXRvbWljX3NldCgmYmF0X3ByaXYtPmhuYV9sb2NhbF9jaGFuZ2VkLCAwKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5obmFfbGhhc2hfbG9jaywgZmxhZ3MpOwotCXJldHVybiBpOwotfQotCi1pbnQgaG5hX2xvY2FsX3NlcV9wcmludF90ZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilzZXEtPnByaXZhdGU7Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KG5ldF9kZXYpOwotCXN0cnVjdCBobmFfbG9jYWxfZW50cnkgKmhuYV9sb2NhbF9lbnRyeTsKLQlIQVNISVQoaGFzaGl0KTsKLQlIQVNISVQoaGFzaGl0X2NvdW50KTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXNpemVfdCBidWZfc2l6ZSwgcG9zOwotCWNoYXIgKmJ1ZmY7Ci0KLQlpZiAoIWJhdF9wcml2LT5wcmltYXJ5X2lmKSB7Ci0JCXJldHVybiBzZXFfcHJpbnRmKHNlcSwgIkJBVE1BTiBtZXNoICVzIGRpc2FibGVkIC0gIgotCQkJICAgICAgICJwbGVhc2Ugc3BlY2lmeSBpbnRlcmZhY2VzIHRvIGVuYWJsZSBpdFxuIiwKLQkJCSAgICAgICBuZXRfZGV2LT5uYW1lKTsKLQl9Ci0KLQlzZXFfcHJpbnRmKHNlcSwgIkxvY2FsbHkgcmV0cmlldmVkIGFkZHJlc3NlcyAoZnJvbSAlcykgIgotCQkgICAiYW5ub3VuY2VkIHZpYSBITkE6XG4iLAotCQkgICBuZXRfZGV2LT5uYW1lKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+aG5hX2xoYXNoX2xvY2ssIGZsYWdzKTsKLQotCWJ1Zl9zaXplID0gMTsKLQkvKiBFc3RpbWF0ZSBsZW5ndGggZm9yOiAiICogeHg6eHg6eHg6eHg6eHg6eHhcbiIgKi8KLQl3aGlsZSAoaGFzaF9pdGVyYXRlKGJhdF9wcml2LT5obmFfbG9jYWxfaGFzaCwgJmhhc2hpdF9jb3VudCkpCi0JCWJ1Zl9zaXplICs9IDIxOwotCi0JYnVmZiA9IGttYWxsb2MoYnVmX3NpemUsIEdGUF9BVE9NSUMpOwotCWlmICghYnVmZikgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+aG5hX2xoYXNoX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCWJ1ZmZbMF0gPSAnXDAnOwotCXBvcyA9IDA7Ci0KLQl3aGlsZSAoaGFzaF9pdGVyYXRlKGJhdF9wcml2LT5obmFfbG9jYWxfaGFzaCwgJmhhc2hpdCkpIHsKLQkJaG5hX2xvY2FsX2VudHJ5ID0gaGFzaGl0LmJ1Y2tldC0+ZGF0YTsKLQotCQlwb3MgKz0gc25wcmludGYoYnVmZiArIHBvcywgMjIsICIgKiAlcE1cbiIsCi0JCQkJaG5hX2xvY2FsX2VudHJ5LT5hZGRyKTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+aG5hX2xoYXNoX2xvY2ssIGZsYWdzKTsKLQotCXNlcV9wcmludGYoc2VxLCAiJXMiLCBidWZmKTsKLQlrZnJlZShidWZmKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX2huYV9sb2NhbF9kZWwodm9pZCAqZGF0YSwgdm9pZCAqYXJnKQotewotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSAoc3RydWN0IGJhdF9wcml2ICopYXJnOwotCi0Ja2ZyZWUoZGF0YSk7Ci0JYmF0X3ByaXYtPm51bV9sb2NhbF9obmEtLTsKLQlhdG9taWNfc2V0KCZiYXRfcHJpdi0+aG5hX2xvY2FsX2NoYW5nZWQsIDEpOwotfQotCi1zdGF0aWMgdm9pZCBobmFfbG9jYWxfZGVsKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkgIHN0cnVjdCBobmFfbG9jYWxfZW50cnkgKmhuYV9sb2NhbF9lbnRyeSwKLQkJCSAgY2hhciAqbWVzc2FnZSkKLXsKLQliYXRfZGJnKERCR19ST1VURVMsIGJhdF9wcml2LCAiRGVsZXRpbmcgbG9jYWwgaG5hIGVudHJ5ICglcE0pOiAlc1xuIiwKLQkJaG5hX2xvY2FsX2VudHJ5LT5hZGRyLCBtZXNzYWdlKTsKLQotCWhhc2hfcmVtb3ZlKGJhdF9wcml2LT5obmFfbG9jYWxfaGFzaCwgaG5hX2xvY2FsX2VudHJ5LT5hZGRyKTsKLQlfaG5hX2xvY2FsX2RlbChobmFfbG9jYWxfZW50cnksIGJhdF9wcml2KTsKLX0KLQotdm9pZCBobmFfbG9jYWxfcmVtb3ZlKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCSAgICAgIHVpbnQ4X3QgKmFkZHIsIGNoYXIgKm1lc3NhZ2UpCi17Ci0Jc3RydWN0IGhuYV9sb2NhbF9lbnRyeSAqaG5hX2xvY2FsX2VudHJ5OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPmhuYV9saGFzaF9sb2NrLCBmbGFncyk7Ci0KLQlobmFfbG9jYWxfZW50cnkgPSAoc3RydWN0IGhuYV9sb2NhbF9lbnRyeSAqKQotCQloYXNoX2ZpbmQoYmF0X3ByaXYtPmhuYV9sb2NhbF9oYXNoLCBhZGRyKTsKLQlpZiAoaG5hX2xvY2FsX2VudHJ5KQotCQlobmFfbG9jYWxfZGVsKGJhdF9wcml2LCBobmFfbG9jYWxfZW50cnksIG1lc3NhZ2UpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPmhuYV9saGFzaF9sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGhuYV9sb2NhbF9wdXJnZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayAqZGVsYXllZF93b3JrID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkZWxheWVkX3dvcmssIHdvcmspOwotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPQotCQljb250YWluZXJfb2YoZGVsYXllZF93b3JrLCBzdHJ1Y3QgYmF0X3ByaXYsIGhuYV93b3JrKTsKLQlzdHJ1Y3QgaG5hX2xvY2FsX2VudHJ5ICpobmFfbG9jYWxfZW50cnk7Ci0JSEFTSElUKGhhc2hpdCk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPmhuYV9saGFzaF9sb2NrLCBmbGFncyk7Ci0KLQl3aGlsZSAoaGFzaF9pdGVyYXRlKGJhdF9wcml2LT5obmFfbG9jYWxfaGFzaCwgJmhhc2hpdCkpIHsKLQkJaG5hX2xvY2FsX2VudHJ5ID0gaGFzaGl0LmJ1Y2tldC0+ZGF0YTsKLQotCQl0aW1lb3V0ID0gaG5hX2xvY2FsX2VudHJ5LT5sYXN0X3NlZW4gKyBMT0NBTF9ITkFfVElNRU9VVCAqIEhaOwotCi0JCWlmICgoIWhuYV9sb2NhbF9lbnRyeS0+bmV2ZXJfcHVyZ2UpICYmCi0JCSAgICB0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQotCQkJaG5hX2xvY2FsX2RlbChiYXRfcHJpdiwgaG5hX2xvY2FsX2VudHJ5LAotCQkJCSAgICAgICJhZGRyZXNzIHRpbWVkIG91dCIpOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5obmFfbGhhc2hfbG9jaywgZmxhZ3MpOwotCWhuYV9sb2NhbF9zdGFydF90aW1lcihiYXRfcHJpdik7Ci19Ci0KLXZvaWQgaG5hX2xvY2FsX2ZyZWUoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKLXsKLQlpZiAoIWJhdF9wcml2LT5obmFfbG9jYWxfaGFzaCkKLQkJcmV0dXJuOwotCi0JY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZiYXRfcHJpdi0+aG5hX3dvcmspOwotCWhhc2hfZGVsZXRlKGJhdF9wcml2LT5obmFfbG9jYWxfaGFzaCwgX2huYV9sb2NhbF9kZWwsIGJhdF9wcml2KTsKLQliYXRfcHJpdi0+aG5hX2xvY2FsX2hhc2ggPSBOVUxMOwotfQotCi1pbnQgaG5hX2dsb2JhbF9pbml0KHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpCi17Ci0JaWYgKGJhdF9wcml2LT5obmFfZ2xvYmFsX2hhc2gpCi0JCXJldHVybiAxOwotCi0JYmF0X3ByaXYtPmhuYV9nbG9iYWxfaGFzaCA9IGhhc2hfbmV3KDEyOCwgY29tcGFyZV9vcmlnLCBjaG9vc2Vfb3JpZyk7Ci0KLQlpZiAoIWJhdF9wcml2LT5obmFfZ2xvYmFsX2hhc2gpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXZvaWQgaG5hX2dsb2JhbF9hZGRfb3JpZyhzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJIHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwKLQkJCSB1bnNpZ25lZCBjaGFyICpobmFfYnVmZiwgaW50IGhuYV9idWZmX2xlbikKLXsKLQlzdHJ1Y3QgaG5hX2dsb2JhbF9lbnRyeSAqaG5hX2dsb2JhbF9lbnRyeTsKLQlzdHJ1Y3QgaG5hX2xvY2FsX2VudHJ5ICpobmFfbG9jYWxfZW50cnk7Ci0Jc3RydWN0IGhhc2h0YWJsZV90ICpzd2FwaGFzaDsKLQlpbnQgaG5hX2J1ZmZfY291bnQgPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgY2hhciAqaG5hX3B0cjsKLQotCXdoaWxlICgoaG5hX2J1ZmZfY291bnQgKyAxKSAqIEVUSF9BTEVOIDw9IGhuYV9idWZmX2xlbikgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPmhuYV9naGFzaF9sb2NrLCBmbGFncyk7Ci0KLQkJaG5hX3B0ciA9IGhuYV9idWZmICsgKGhuYV9idWZmX2NvdW50ICogRVRIX0FMRU4pOwotCQlobmFfZ2xvYmFsX2VudHJ5ID0gKHN0cnVjdCBobmFfZ2xvYmFsX2VudHJ5ICopCi0JCQloYXNoX2ZpbmQoYmF0X3ByaXYtPmhuYV9nbG9iYWxfaGFzaCwgaG5hX3B0cik7Ci0KLQkJaWYgKCFobmFfZ2xvYmFsX2VudHJ5KSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+aG5hX2doYXNoX2xvY2ssCi0JCQkJCSAgICAgICBmbGFncyk7Ci0KLQkJCWhuYV9nbG9iYWxfZW50cnkgPQotCQkJCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBobmFfZ2xvYmFsX2VudHJ5KSwKLQkJCQkJR0ZQX0FUT01JQyk7Ci0KLQkJCWlmICghaG5hX2dsb2JhbF9lbnRyeSkKLQkJCQlicmVhazsKLQotCQkJbWVtY3B5KGhuYV9nbG9iYWxfZW50cnktPmFkZHIsIGhuYV9wdHIsIEVUSF9BTEVOKTsKLQotCQkJYmF0X2RiZyhEQkdfUk9VVEVTLCBiYXRfcHJpdiwKLQkJCQkiQ3JlYXRpbmcgbmV3IGdsb2JhbCBobmEgZW50cnk6ICIKLQkJCQkiJXBNICh2aWEgJXBNKVxuIiwKLQkJCQlobmFfZ2xvYmFsX2VudHJ5LT5hZGRyLCBvcmlnX25vZGUtPm9yaWcpOwotCi0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPmhuYV9naGFzaF9sb2NrLCBmbGFncyk7Ci0JCQloYXNoX2FkZChiYXRfcHJpdi0+aG5hX2dsb2JhbF9oYXNoLCBobmFfZ2xvYmFsX2VudHJ5KTsKLQotCQl9Ci0KLQkJaG5hX2dsb2JhbF9lbnRyeS0+b3JpZ19ub2RlID0gb3JpZ19ub2RlOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+aG5hX2doYXNoX2xvY2ssIGZsYWdzKTsKLQotCQkvKiByZW1vdmUgYWRkcmVzcyBmcm9tIGxvY2FsIGhhc2ggaWYgcHJlc2VudCAqLwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPmhuYV9saGFzaF9sb2NrLCBmbGFncyk7Ci0KLQkJaG5hX3B0ciA9IGhuYV9idWZmICsgKGhuYV9idWZmX2NvdW50ICogRVRIX0FMRU4pOwotCQlobmFfbG9jYWxfZW50cnkgPSAoc3RydWN0IGhuYV9sb2NhbF9lbnRyeSAqKQotCQkJaGFzaF9maW5kKGJhdF9wcml2LT5obmFfbG9jYWxfaGFzaCwgaG5hX3B0cik7Ci0KLQkJaWYgKGhuYV9sb2NhbF9lbnRyeSkKLQkJCWhuYV9sb2NhbF9kZWwoYmF0X3ByaXYsIGhuYV9sb2NhbF9lbnRyeSwKLQkJCQkgICAgICAiZ2xvYmFsIGhuYSByZWNlaXZlZCIpOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5obmFfbGhhc2hfbG9jaywgZmxhZ3MpOwotCi0JCWhuYV9idWZmX2NvdW50Kys7Ci0JfQotCi0JLyogaW5pdGlhbGl6ZSwgYW5kIG92ZXJ3cml0ZSBpZiBtYWxsb2Mgc3VjY2VlZHMgKi8KLQlvcmlnX25vZGUtPmhuYV9idWZmID0gTlVMTDsKLQlvcmlnX25vZGUtPmhuYV9idWZmX2xlbiA9IDA7Ci0KLQlpZiAoaG5hX2J1ZmZfbGVuID4gMCkgewotCQlvcmlnX25vZGUtPmhuYV9idWZmID0ga21hbGxvYyhobmFfYnVmZl9sZW4sIEdGUF9BVE9NSUMpOwotCQlpZiAob3JpZ19ub2RlLT5obmFfYnVmZikgewotCQkJbWVtY3B5KG9yaWdfbm9kZS0+aG5hX2J1ZmYsIGhuYV9idWZmLCBobmFfYnVmZl9sZW4pOwotCQkJb3JpZ19ub2RlLT5obmFfYnVmZl9sZW4gPSBobmFfYnVmZl9sZW47Ci0JCX0KLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPmhuYV9naGFzaF9sb2NrLCBmbGFncyk7Ci0KLQlpZiAoYmF0X3ByaXYtPmhuYV9nbG9iYWxfaGFzaC0+ZWxlbWVudHMgKiA0ID4KLQkJCQkJYmF0X3ByaXYtPmhuYV9nbG9iYWxfaGFzaC0+c2l6ZSkgewotCQlzd2FwaGFzaCA9IGhhc2hfcmVzaXplKGJhdF9wcml2LT5obmFfZ2xvYmFsX2hhc2gsCi0JCQkJICAgICAgIGJhdF9wcml2LT5obmFfZ2xvYmFsX2hhc2gtPnNpemUgKiAyKTsKLQotCQlpZiAoIXN3YXBoYXNoKQotCQkJcHJfZXJyKCJDb3VsZG4ndCByZXNpemUgZ2xvYmFsIGhuYSBoYXNoIHRhYmxlXG4iKTsKLQkJZWxzZQotCQkJYmF0X3ByaXYtPmhuYV9nbG9iYWxfaGFzaCA9IHN3YXBoYXNoOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5obmFfZ2hhc2hfbG9jaywgZmxhZ3MpOwotfQotCi1pbnQgaG5hX2dsb2JhbF9zZXFfcHJpbnRfdGV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopc2VxLT5wcml2YXRlOwotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKLQlzdHJ1Y3QgaG5hX2dsb2JhbF9lbnRyeSAqaG5hX2dsb2JhbF9lbnRyeTsKLQlIQVNISVQoaGFzaGl0KTsKLQlIQVNISVQoaGFzaGl0X2NvdW50KTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXNpemVfdCBidWZfc2l6ZSwgcG9zOwotCWNoYXIgKmJ1ZmY7Ci0KLQlpZiAoIWJhdF9wcml2LT5wcmltYXJ5X2lmKSB7Ci0JCXJldHVybiBzZXFfcHJpbnRmKHNlcSwgIkJBVE1BTiBtZXNoICVzIGRpc2FibGVkIC0gIgotCQkJCSAgInBsZWFzZSBzcGVjaWZ5IGludGVyZmFjZXMgdG8gZW5hYmxlIGl0XG4iLAotCQkJCSAgbmV0X2Rldi0+bmFtZSk7Ci0JfQotCi0Jc2VxX3ByaW50ZihzZXEsICJHbG9iYWxseSBhbm5vdW5jZWQgSE5BcyByZWNlaXZlZCB2aWEgdGhlIG1lc2ggJXNcbiIsCi0JCSAgIG5ldF9kZXYtPm5hbWUpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5obmFfZ2hhc2hfbG9jaywgZmxhZ3MpOwotCi0JYnVmX3NpemUgPSAxOwotCS8qIEVzdGltYXRlIGxlbmd0aCBmb3I6ICIgKiB4eDp4eDp4eDp4eDp4eDp4eCB2aWEgeHg6eHg6eHg6eHg6eHg6eHhcbiIqLwotCXdoaWxlIChoYXNoX2l0ZXJhdGUoYmF0X3ByaXYtPmhuYV9nbG9iYWxfaGFzaCwgJmhhc2hpdF9jb3VudCkpCi0JCWJ1Zl9zaXplICs9IDQzOwotCi0JYnVmZiA9IGttYWxsb2MoYnVmX3NpemUsIEdGUF9BVE9NSUMpOwotCWlmICghYnVmZikgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+aG5hX2doYXNoX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCWJ1ZmZbMF0gPSAnXDAnOwotCXBvcyA9IDA7Ci0KLQl3aGlsZSAoaGFzaF9pdGVyYXRlKGJhdF9wcml2LT5obmFfZ2xvYmFsX2hhc2gsICZoYXNoaXQpKSB7Ci0JCWhuYV9nbG9iYWxfZW50cnkgPSBoYXNoaXQuYnVja2V0LT5kYXRhOwotCi0JCXBvcyArPSBzbnByaW50ZihidWZmICsgcG9zLCA0NCwKLQkJCQkiICogJXBNIHZpYSAlcE1cbiIsIGhuYV9nbG9iYWxfZW50cnktPmFkZHIsCi0JCQkJaG5hX2dsb2JhbF9lbnRyeS0+b3JpZ19ub2RlLT5vcmlnKTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+aG5hX2doYXNoX2xvY2ssIGZsYWdzKTsKLQotCXNlcV9wcmludGYoc2VxLCAiJXMiLCBidWZmKTsKLQlrZnJlZShidWZmKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX2huYV9nbG9iYWxfZGVsX29yaWcoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCQkgc3RydWN0IGhuYV9nbG9iYWxfZW50cnkgKmhuYV9nbG9iYWxfZW50cnksCi0JCQkJIGNoYXIgKm1lc3NhZ2UpCi17Ci0JYmF0X2RiZyhEQkdfUk9VVEVTLCBiYXRfcHJpdiwKLQkJIkRlbGV0aW5nIGdsb2JhbCBobmEgZW50cnkgJXBNICh2aWEgJXBNKTogJXNcbiIsCi0JCWhuYV9nbG9iYWxfZW50cnktPmFkZHIsIGhuYV9nbG9iYWxfZW50cnktPm9yaWdfbm9kZS0+b3JpZywKLQkJbWVzc2FnZSk7Ci0KLQloYXNoX3JlbW92ZShiYXRfcHJpdi0+aG5hX2dsb2JhbF9oYXNoLCBobmFfZ2xvYmFsX2VudHJ5LT5hZGRyKTsKLQlrZnJlZShobmFfZ2xvYmFsX2VudHJ5KTsKLX0KLQotdm9pZCBobmFfZ2xvYmFsX2RlbF9vcmlnKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkgc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLCBjaGFyICptZXNzYWdlKQotewotCXN0cnVjdCBobmFfZ2xvYmFsX2VudHJ5ICpobmFfZ2xvYmFsX2VudHJ5OwotCWludCBobmFfYnVmZl9jb3VudCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBjaGFyICpobmFfcHRyOwotCi0JaWYgKG9yaWdfbm9kZS0+aG5hX2J1ZmZfbGVuID09IDApCi0JCXJldHVybjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+aG5hX2doYXNoX2xvY2ssIGZsYWdzKTsKLQotCXdoaWxlICgoaG5hX2J1ZmZfY291bnQgKyAxKSAqIEVUSF9BTEVOIDw9IG9yaWdfbm9kZS0+aG5hX2J1ZmZfbGVuKSB7Ci0JCWhuYV9wdHIgPSBvcmlnX25vZGUtPmhuYV9idWZmICsgKGhuYV9idWZmX2NvdW50ICogRVRIX0FMRU4pOwotCQlobmFfZ2xvYmFsX2VudHJ5ID0gKHN0cnVjdCBobmFfZ2xvYmFsX2VudHJ5ICopCi0JCQloYXNoX2ZpbmQoYmF0X3ByaXYtPmhuYV9nbG9iYWxfaGFzaCwgaG5hX3B0cik7Ci0KLQkJaWYgKChobmFfZ2xvYmFsX2VudHJ5KSAmJgotCQkgICAgKGhuYV9nbG9iYWxfZW50cnktPm9yaWdfbm9kZSA9PSBvcmlnX25vZGUpKQotCQkJX2huYV9nbG9iYWxfZGVsX29yaWcoYmF0X3ByaXYsIGhuYV9nbG9iYWxfZW50cnksCi0JCQkJCSAgICAgbWVzc2FnZSk7Ci0KLQkJaG5hX2J1ZmZfY291bnQrKzsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+aG5hX2doYXNoX2xvY2ssIGZsYWdzKTsKLQotCW9yaWdfbm9kZS0+aG5hX2J1ZmZfbGVuID0gMDsKLQlrZnJlZShvcmlnX25vZGUtPmhuYV9idWZmKTsKLQlvcmlnX25vZGUtPmhuYV9idWZmID0gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgaG5hX2dsb2JhbF9kZWwodm9pZCAqZGF0YSwgdm9pZCAqYXJnKQotewotCWtmcmVlKGRhdGEpOwotfQotCi12b2lkIGhuYV9nbG9iYWxfZnJlZShzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KQotewotCWlmICghYmF0X3ByaXYtPmhuYV9nbG9iYWxfaGFzaCkKLQkJcmV0dXJuOwotCi0JaGFzaF9kZWxldGUoYmF0X3ByaXYtPmhuYV9nbG9iYWxfaGFzaCwgaG5hX2dsb2JhbF9kZWwsIE5VTEwpOwotCWJhdF9wcml2LT5obmFfZ2xvYmFsX2hhc2ggPSBOVUxMOwotfQotCi1zdHJ1Y3Qgb3JpZ19ub2RlICp0cmFuc3RhYmxlX3NlYXJjaChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LCB1aW50OF90ICphZGRyKQotewotCXN0cnVjdCBobmFfZ2xvYmFsX2VudHJ5ICpobmFfZ2xvYmFsX2VudHJ5OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPmhuYV9naGFzaF9sb2NrLCBmbGFncyk7Ci0JaG5hX2dsb2JhbF9lbnRyeSA9IChzdHJ1Y3QgaG5hX2dsb2JhbF9lbnRyeSAqKQotCQkJCWhhc2hfZmluZChiYXRfcHJpdi0+aG5hX2dsb2JhbF9oYXNoLCBhZGRyKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+aG5hX2doYXNoX2xvY2ssIGZsYWdzKTsKLQotCWlmICghaG5hX2dsb2JhbF9lbnRyeSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlyZXR1cm4gaG5hX2dsb2JhbF9lbnRyeS0+b3JpZ19ub2RlOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvdHJhbnNsYXRpb24tdGFibGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3RyYW5zbGF0aW9uLXRhYmxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYzRjNWMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvdHJhbnNsYXRpb24tdGFibGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgotICoKLSAqIE1hcmVrIExpbmRuZXIsIFNpbW9uIFd1bmRlcmxpY2gKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVTQQotICoKLSAqLwotCi0jaWZuZGVmIF9ORVRfQkFUTUFOX0FEVl9UUkFOU0xBVElPTl9UQUJMRV9IXwotI2RlZmluZSBfTkVUX0JBVE1BTl9BRFZfVFJBTlNMQVRJT05fVEFCTEVfSF8KLQotI2luY2x1ZGUgInR5cGVzLmgiCi0KLWludCBobmFfbG9jYWxfaW5pdChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KTsKLXZvaWQgaG5hX2xvY2FsX2FkZChzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZSwgdWludDhfdCAqYWRkcik7Ci12b2lkIGhuYV9sb2NhbF9yZW1vdmUoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJICAgICAgdWludDhfdCAqYWRkciwgY2hhciAqbWVzc2FnZSk7Ci1pbnQgaG5hX2xvY2FsX2ZpbGxfYnVmZmVyKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkgIHVuc2lnbmVkIGNoYXIgKmJ1ZmYsIGludCBidWZmX2xlbik7Ci1pbnQgaG5hX2xvY2FsX3NlcV9wcmludF90ZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpOwotdm9pZCBobmFfbG9jYWxfZnJlZShzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KTsKLWludCBobmFfZ2xvYmFsX2luaXQoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdik7Ci12b2lkIGhuYV9nbG9iYWxfYWRkX29yaWcoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCSBzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUsCi0JCQkgdW5zaWduZWQgY2hhciAqaG5hX2J1ZmYsIGludCBobmFfYnVmZl9sZW4pOwotaW50IGhuYV9nbG9iYWxfc2VxX3ByaW50X3RleHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCk7Ci12b2lkIGhuYV9nbG9iYWxfZGVsX29yaWcoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCSBzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUsIGNoYXIgKm1lc3NhZ2UpOwotdm9pZCBobmFfZ2xvYmFsX2ZyZWUoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdik7Ci1zdHJ1Y3Qgb3JpZ19ub2RlICp0cmFuc3RhYmxlX3NlYXJjaChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LCB1aW50OF90ICphZGRyKTsKLQotI2VuZGlmIC8qIF9ORVRfQkFUTUFOX0FEVl9UUkFOU0xBVElPTl9UQUJMRV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvdHlwZXMuaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3R5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZjczNjYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvdHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKLSAqCi0gKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxLCBVU0EKLSAqCi0gKi8KLQotCi0KLSNpZm5kZWYgX05FVF9CQVRNQU5fQURWX1RZUEVTX0hfCi0jZGVmaW5lIF9ORVRfQkFUTUFOX0FEVl9UWVBFU19IXwotCi0jaW5jbHVkZSAicGFja2V0LmgiCi0jaW5jbHVkZSAiYml0YXJyYXkuaCIKLQotI2RlZmluZSBCQVRfSEVBREVSX0xFTiAoc2l6ZW9mKHN0cnVjdCBldGhoZHIpICsgXAotCSgoc2l6ZW9mKHN0cnVjdCB1bmljYXN0X3BhY2tldCkgPiBzaXplb2Yoc3RydWN0IGJjYXN0X3BhY2tldCkgPyBcCi0JIHNpemVvZihzdHJ1Y3QgdW5pY2FzdF9wYWNrZXQpIDogXAotCSBzaXplb2Yoc3RydWN0IGJjYXN0X3BhY2tldCkpKSkKLQotCi1zdHJ1Y3QgYmF0bWFuX2lmIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0JaW50MTZfdCBpZl9udW07Ci0JY2hhciBpZl9zdGF0dXM7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXY7Ci0JYXRvbWljX3Qgc2Vxbm87Ci0JYXRvbWljX3QgZnJhZ19zZXFubzsKLQl1bnNpZ25lZCBjaGFyICpwYWNrZXRfYnVmZjsKLQlpbnQgcGFja2V0X2xlbjsKLQlzdHJ1Y3Qga29iamVjdCAqaGFyZGlmX29iajsKLQlhdG9taWNfdCByZWZjbnQ7Ci0Jc3RydWN0IHBhY2tldF90eXBlIGJhdG1hbl9hZHZfcHR5cGU7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRfaWZhY2U7Ci19OwotCi0vKioKLSAqCW9yaWdfbm9kZSAtIHN0cnVjdHVyZSBmb3Igb3JpZ19saXN0IG1haW50YWluaW5nIG5vZGVzIG9mIG1lc2gKLSAqCUBwcmltYXJ5X2FkZHI6IGhvc3RzIHByaW1hcnkgaW50ZXJmYWNlIGFkZHJlc3MKLSAqCUBsYXN0X3ZhbGlkOiB3aGVuIGxhc3QgcGFja2V0IGZyb20gdGhpcyBub2RlIHdhcyByZWNlaXZlZAotICoJQGJjYXN0X3NlcW5vX3Jlc2V0OiB0aW1lIHdoZW4gdGhlIGJyb2FkY2FzdCBzZXFubyB3aW5kb3cgd2FzIHJlc2V0Ci0gKglAYmF0bWFuX3NlcW5vX3Jlc2V0OiB0aW1lIHdoZW4gdGhlIGJhdG1hbiBzZXFubyB3aW5kb3cgd2FzIHJlc2V0Ci0gKglAZmxhZ3M6IGZvciBub3cgb25seSBWSVNfU0VSVkVSIGZsYWcKLSAqCUBsYXN0X3JlYWxfc2Vxbm86IGxhc3QgYW5kIGJlc3Qga25vd24gc3F1ZW5jZSBudW1iZXIKLSAqCUBsYXN0X3R0bDogdHRsIG9mIGxhc3QgcmVjZWl2ZWQgcGFja2V0Ci0gKglAbGFzdF9iY2FzdF9zZXFubzogbGFzdCBicm9hZGNhc3Qgc2VxdWVuY2UgbnVtYmVyIHJlY2VpdmVkIGJ5IHRoaXMgaG9zdAotICoKLSAqCUBjYW5kaWRhdGVzOiBob3cgbWFueSBjYW5kaWRhdGVzIGFyZSBhdmFpbGFibGUKLSAqCUBzZWxlY3RlZDogbmV4dCBib25kaW5nIGNhbmRpZGF0ZQotICovCi1zdHJ1Y3Qgb3JpZ19ub2RlIHsKLQl1aW50OF90IG9yaWdbRVRIX0FMRU5dOwotCXVpbnQ4X3QgcHJpbWFyeV9hZGRyW0VUSF9BTEVOXTsKLQlzdHJ1Y3QgbmVpZ2hfbm9kZSAqcm91dGVyOwotCVRZUEVfT0ZfV09SRCAqYmNhc3Rfb3duOwotCXVpbnQ4X3QgKmJjYXN0X293bl9zdW07Ci0JdWludDhfdCB0cV9vd247Ci0JaW50IHRxX2FzeW1fcGVuYWx0eTsKLQl1bnNpZ25lZCBsb25nIGxhc3RfdmFsaWQ7Ci0JdW5zaWduZWQgbG9uZyBiY2FzdF9zZXFub19yZXNldDsKLQl1bnNpZ25lZCBsb25nIGJhdG1hbl9zZXFub19yZXNldDsKLQl1aW50OF90ICBmbGFnczsKLQl1bnNpZ25lZCBjaGFyICpobmFfYnVmZjsKLQlpbnQxNl90IGhuYV9idWZmX2xlbjsKLQl1aW50MzJfdCBsYXN0X3JlYWxfc2Vxbm87Ci0JdWludDhfdCBsYXN0X3R0bDsKLQlUWVBFX09GX1dPUkQgYmNhc3RfYml0c1tOVU1fV09SRFNdOwotCXVpbnQzMl90IGxhc3RfYmNhc3Rfc2Vxbm87Ci0Jc3RydWN0IGxpc3RfaGVhZCBuZWlnaF9saXN0OwotCXN0cnVjdCBsaXN0X2hlYWQgZnJhZ19saXN0OwotCXVuc2lnbmVkIGxvbmcgbGFzdF9mcmFnX3BhY2tldDsKLQlzdHJ1Y3QgewotCQl1aW50OF90IGNhbmRpZGF0ZXM7Ci0JCXN0cnVjdCBuZWlnaF9ub2RlICpzZWxlY3RlZDsKLQl9IGJvbmQ7Ci19OwotCi0vKioKLSAqCW5laWdoX25vZGUKLSAqCUBsYXN0X3ZhbGlkOiB3aGVuIGxhc3QgcGFja2V0IHZpYSB0aGlzIG5laWdoYm9yIHdhcyByZWNlaXZlZAotICovCi1zdHJ1Y3QgbmVpZ2hfbm9kZSB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXVpbnQ4X3QgYWRkcltFVEhfQUxFTl07Ci0JdWludDhfdCByZWFsX3BhY2tldF9jb3VudDsKLQl1aW50OF90IHRxX3JlY3ZbVFFfR0xPQkFMX1dJTkRPV19TSVpFXTsKLQl1aW50OF90IHRxX2luZGV4OwotCXVpbnQ4X3QgdHFfYXZnOwotCXVpbnQ4X3QgbGFzdF90dGw7Ci0Jc3RydWN0IG5laWdoX25vZGUgKm5leHRfYm9uZF9jYW5kaWRhdGU7Ci0JdW5zaWduZWQgbG9uZyBsYXN0X3ZhbGlkOwotCVRZUEVfT0ZfV09SRCByZWFsX2JpdHNbTlVNX1dPUkRTXTsKLQlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7Ci0Jc3RydWN0IGJhdG1hbl9pZiAqaWZfaW5jb21pbmc7Ci19OwotCi0KLXN0cnVjdCBiYXRfcHJpdiB7Ci0JYXRvbWljX3QgbWVzaF9zdGF0ZTsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKLQlhdG9taWNfdCBhZ2dyZWdhdGlvbl9lbmFibGVkOwotCWF0b21pY190IGJvbmRpbmdfZW5hYmxlZDsKLQlhdG9taWNfdCBmcmFnX2VuYWJsZWQ7Ci0JYXRvbWljX3QgdmlzX21vZGU7Ci0JYXRvbWljX3Qgb3JpZ19pbnRlcnZhbDsKLQlhdG9taWNfdCBsb2dfbGV2ZWw7Ci0JYXRvbWljX3QgYmNhc3Rfc2Vxbm87Ci0JYXRvbWljX3QgYmNhc3RfcXVldWVfbGVmdDsKLQlhdG9taWNfdCBiYXRtYW5fcXVldWVfbGVmdDsKLQljaGFyIG51bV9pZmFjZXM7Ci0Jc3RydWN0IGRlYnVnX2xvZyAqZGVidWdfbG9nOwotCXN0cnVjdCBiYXRtYW5faWYgKnByaW1hcnlfaWY7Ci0Jc3RydWN0IGtvYmplY3QgKm1lc2hfb2JqOwotCXN0cnVjdCBkZW50cnkgKmRlYnVnX2RpcjsKLQlzdHJ1Y3QgaGxpc3RfaGVhZCBmb3J3X2JhdF9saXN0OwotCXN0cnVjdCBobGlzdF9oZWFkIGZvcndfYmNhc3RfbGlzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIHZpc19zZW5kX2xpc3Q7Ci0Jc3RydWN0IGhhc2h0YWJsZV90ICpvcmlnX2hhc2g7Ci0Jc3RydWN0IGhhc2h0YWJsZV90ICpobmFfbG9jYWxfaGFzaDsKLQlzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhuYV9nbG9iYWxfaGFzaDsKLQlzdHJ1Y3QgaGFzaHRhYmxlX3QgKnZpc19oYXNoOwotCXNwaW5sb2NrX3Qgb3JpZ19oYXNoX2xvY2s7IC8qIHByb3RlY3RzIG9yaWdfaGFzaCAqLwotCXNwaW5sb2NrX3QgZm9yd19iYXRfbGlzdF9sb2NrOyAvKiBwcm90ZWN0cyBmb3J3X2JhdF9saXN0ICovCi0Jc3BpbmxvY2tfdCBmb3J3X2JjYXN0X2xpc3RfbG9jazsgLyogcHJvdGVjdHMgICovCi0Jc3BpbmxvY2tfdCBobmFfbGhhc2hfbG9jazsgLyogcHJvdGVjdHMgaG5hX2xvY2FsX2hhc2ggKi8KLQlzcGlubG9ja190IGhuYV9naGFzaF9sb2NrOyAvKiBwcm90ZWN0cyBobmFfZ2xvYmFsX2hhc2ggKi8KLQlzcGlubG9ja190IHZpc19oYXNoX2xvY2s7IC8qIHByb3RlY3RzIHZpc19oYXNoICovCi0Jc3BpbmxvY2tfdCB2aXNfbGlzdF9sb2NrOyAvKiBwcm90ZWN0cyB2aXNfaW5mbzo6cmVjdl9saXN0ICovCi0JaW50MTZfdCBudW1fbG9jYWxfaG5hOwotCWF0b21pY190IGhuYV9sb2NhbF9jaGFuZ2VkOwotCXN0cnVjdCBkZWxheWVkX3dvcmsgaG5hX3dvcms7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayBvcmlnX3dvcms7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayB2aXNfd29yazsKLQlzdHJ1Y3QgdmlzX2luZm8gKm15X3Zpc19pbmZvOwotfTsKLQotc3RydWN0IHNvY2tldF9jbGllbnQgewotCXN0cnVjdCBsaXN0X2hlYWQgcXVldWVfbGlzdDsKLQl1bnNpZ25lZCBpbnQgcXVldWVfbGVuOwotCXVuc2lnbmVkIGNoYXIgaW5kZXg7Ci0Jc3BpbmxvY2tfdCBsb2NrOyAvKiBwcm90ZWN0cyBxdWV1ZV9saXN0LCBxdWV1ZV9sZW4sIGluZGV4ICovCi0Jd2FpdF9xdWV1ZV9oZWFkX3QgcXVldWVfd2FpdDsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2OwotfTsKLQotc3RydWN0IHNvY2tldF9wYWNrZXQgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlzaXplX3QgaWNtcF9sZW47Ci0Jc3RydWN0IGljbXBfcGFja2V0X3JyIGljbXBfcGFja2V0OwotfTsKLQotc3RydWN0IGhuYV9sb2NhbF9lbnRyeSB7Ci0JdWludDhfdCBhZGRyW0VUSF9BTEVOXTsKLQl1bnNpZ25lZCBsb25nIGxhc3Rfc2VlbjsKLQljaGFyIG5ldmVyX3B1cmdlOwotfTsKLQotc3RydWN0IGhuYV9nbG9iYWxfZW50cnkgewotCXVpbnQ4X3QgYWRkcltFVEhfQUxFTl07Ci0Jc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOwotfTsKLQotLyoqCi0gKglmb3J3X3BhY2tldCAtIHN0cnVjdHVyZSBmb3IgZm9yd19saXN0IG1haW50YWluaW5nIHBhY2tldHMgdG8gYmUKLSAqCSAgICAgICAgICAgICAgc2VuZC9mb3J3YXJkZWQKLSAqLwotc3RydWN0IGZvcndfcGFja2V0IHsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSBsaXN0OwotCXVuc2lnbmVkIGxvbmcgc2VuZF90aW1lOwotCXVpbnQ4X3Qgb3duOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0JdWludDE2X3QgcGFja2V0X2xlbjsKLQl1aW50MzJfdCBkaXJlY3RfbGlua19mbGFnczsKLQl1aW50OF90IG51bV9wYWNrZXRzOwotCXN0cnVjdCBkZWxheWVkX3dvcmsgZGVsYXllZF93b3JrOwotCXN0cnVjdCBiYXRtYW5faWYgKmlmX2luY29taW5nOwotfTsKLQotLyogV2hpbGUgc2Nhbm5pbmcgZm9yIHZpcy1lbnRyaWVzIG9mIGEgcGFydGljdWxhciB2aXMtb3JpZ2luYXRvcgotICogdGhpcyBsaXN0IGNvbGxlY3RzIGl0cyBpbnRlcmZhY2VzIHRvIGNyZWF0ZSBhIHN1YmdyYXBoL2NsdXN0ZXIKLSAqIG91dCBvZiB0aGVtIGxhdGVyCi0gKi8KLXN0cnVjdCBpZl9saXN0X2VudHJ5IHsKLQl1aW50OF90IGFkZHJbRVRIX0FMRU5dOwotCWJvb2wgcHJpbWFyeTsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSBsaXN0OwotfTsKLQotc3RydWN0IGRlYnVnX2xvZyB7Ci0JY2hhciBsb2dfYnVmZltMT0dfQlVGX0xFTl07Ci0JdW5zaWduZWQgbG9uZyBsb2dfc3RhcnQ7Ci0JdW5zaWduZWQgbG9uZyBsb2dfZW5kOwotCXNwaW5sb2NrX3QgbG9jazsgLyogcHJvdGVjdHMgbG9nX2J1ZmYsIGxvZ19zdGFydCBhbmQgbG9nX2VuZCAqLwotCXdhaXRfcXVldWVfaGVhZF90IHF1ZXVlX3dhaXQ7Ci19OwotCi1zdHJ1Y3QgZnJhZ19wYWNrZXRfbGlzdF9lbnRyeSB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXVpbnQxNl90IHNlcW5vOwotCXN0cnVjdCBza19idWZmICpza2I7Ci19OwotCi1zdHJ1Y3QgdmlzX2luZm8gewotCXVuc2lnbmVkIGxvbmcgICAgICAgZmlyc3Rfc2VlbjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICAgIHJlY3ZfbGlzdDsKLQkJCSAgICAvKiBsaXN0IG9mIHNlcnZlci1uZWlnaGJvcnMgd2UgcmVjZWl2ZWQgYSB2aXMtcGFja2V0Ci0JCQkgICAgICogZnJvbS4gIHdlIHNob3VsZCBub3QgcmVwbHkgdG8gdGhlbS4gKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIHNlbmRfbGlzdDsKLQlzdHJ1Y3Qga3JlZiByZWZjb3VudDsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2OwotCS8qIHRoaXMgcGFja2V0IG1pZ2h0IGJlIHBhcnQgb2YgdGhlIHZpcyBzZW5kIHF1ZXVlLiAqLwotCXN0cnVjdCBza19idWZmICpza2JfcGFja2V0OwotCS8qIHZpc19pbmZvIG1heSBmb2xsb3cgaGVyZSovCi19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3QgdmlzX2luZm9fZW50cnkgewotCXVpbnQ4X3QgIHNyY1tFVEhfQUxFTl07Ci0JdWludDhfdCAgZGVzdFtFVEhfQUxFTl07Ci0JdWludDhfdCAgcXVhbGl0eTsJLyogcXVhbGl0eSA9IDAgbWVhbnMgSE5BICovCi19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3QgcmVjdmxpc3Rfbm9kZSB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXVpbnQ4X3QgbWFjW0VUSF9BTEVOXTsKLX07Ci0KLSNlbmRpZiAvKiBfTkVUX0JBVE1BTl9BRFZfVFlQRVNfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3VuaWNhc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3VuaWNhc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ1OTQxMy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi91bmljYXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgotICoKLSAqIEFuZHJlYXMgTGFuZ2VyCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxLCBVU0EKLSAqCi0gKi8KLQotI2luY2x1ZGUgIm1haW4uaCIKLSNpbmNsdWRlICJ1bmljYXN0LmgiCi0jaW5jbHVkZSAic2VuZC5oIgotI2luY2x1ZGUgInNvZnQtaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiaGFzaC5oIgotI2luY2x1ZGUgInRyYW5zbGF0aW9uLXRhYmxlLmgiCi0jaW5jbHVkZSAicm91dGluZy5oIgotI2luY2x1ZGUgImhhcmQtaW50ZXJmYWNlLmgiCi0KLQotc3RydWN0IHNrX2J1ZmYgKm1lcmdlX2ZyYWdfcGFja2V0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsCi0JCQkJICBzdHJ1Y3QgZnJhZ19wYWNrZXRfbGlzdF9lbnRyeSAqdGZwLAotCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgdW5pY2FzdF9mcmFnX3BhY2tldCAqdXAgPQotCQkoc3RydWN0IHVuaWNhc3RfZnJhZ19wYWNrZXQgKilza2ItPmRhdGE7Ci0Jc3RydWN0IHNrX2J1ZmYgKnRtcF9za2I7Ci0KLQkvKiBzZXQgc2tiIHRvIHRoZSBmaXJzdCBwYXJ0IGFuZCB0bXBfc2tiIHRvIHRoZSBzZWNvbmQgcGFydCAqLwotCWlmICh1cC0+ZmxhZ3MgJiBVTklfRlJBR19IRUFEKSB7Ci0JCXRtcF9za2IgPSB0ZnAtPnNrYjsKLQl9IGVsc2UgewotCQl0bXBfc2tiID0gc2tiOwotCQlza2IgPSB0ZnAtPnNrYjsKLQl9Ci0KLQlza2JfcHVsbCh0bXBfc2tiLCBzaXplb2Yoc3RydWN0IHVuaWNhc3RfZnJhZ19wYWNrZXQpKTsKLQlpZiAocHNrYl9leHBhbmRfaGVhZChza2IsIDAsIHRtcF9za2ItPmxlbiwgR0ZQX0FUT01JQykgPCAwKSB7Ci0JCS8qIGZyZWUgYnVmZmVyZWQgc2tiLCBza2Igd2lsbCBiZSBmcmVlZCBsYXRlciAqLwotCQlrZnJlZV9za2IodGZwLT5za2IpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQkvKiBtb3ZlIGZyZWUgZW50cnkgdG8gZW5kICovCi0JdGZwLT5za2IgPSBOVUxMOwotCXRmcC0+c2Vxbm8gPSAwOwotCWxpc3RfbW92ZV90YWlsKCZ0ZnAtPmxpc3QsIGhlYWQpOwotCi0JbWVtY3B5KHNrYl9wdXQoc2tiLCB0bXBfc2tiLT5sZW4pLCB0bXBfc2tiLT5kYXRhLCB0bXBfc2tiLT5sZW4pOwotCWtmcmVlX3NrYih0bXBfc2tiKTsKLQlyZXR1cm4gc2tiOwotfQotCi12b2lkIGNyZWF0ZV9mcmFnX2VudHJ5KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IGZyYWdfcGFja2V0X2xpc3RfZW50cnkgKnRmcDsKLQlzdHJ1Y3QgdW5pY2FzdF9mcmFnX3BhY2tldCAqdXAgPQotCQkoc3RydWN0IHVuaWNhc3RfZnJhZ19wYWNrZXQgKilza2ItPmRhdGE7Ci0KLQkvKiBmcmVlIGFuZCBvbGRlc3QgcGFja2V0cyBzdGFuZCBhdCB0aGUgZW5kICovCi0JdGZwID0gbGlzdF9lbnRyeSgoaGVhZCktPnByZXYsIHR5cGVvZigqdGZwKSwgbGlzdCk7Ci0Ja2ZyZWVfc2tiKHRmcC0+c2tiKTsKLQotCXRmcC0+c2Vxbm8gPSBudG9ocyh1cC0+c2Vxbm8pOwotCXRmcC0+c2tiID0gc2tiOwotCWxpc3RfbW92ZSgmdGZwLT5saXN0LCBoZWFkKTsKLQlyZXR1cm47Ci19Ci0KLWludCBjcmVhdGVfZnJhZ19idWZmZXIoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgZnJhZ19wYWNrZXRfbGlzdF9lbnRyeSAqdGZwOwotCi0JZm9yIChpID0gMDsgaSA8IEZSQUdfQlVGRkVSX1NJWkU7IGkrKykgewotCQl0ZnAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZnJhZ19wYWNrZXRfbGlzdF9lbnRyeSksCi0JCQlHRlBfQVRPTUlDKTsKLQkJaWYgKCF0ZnApIHsKLQkJCWZyYWdfbGlzdF9mcmVlKGhlYWQpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQkJdGZwLT5za2IgPSBOVUxMOwotCQl0ZnAtPnNlcW5vID0gMDsKLQkJSU5JVF9MSVNUX0hFQUQoJnRmcC0+bGlzdCk7Ci0JCWxpc3RfYWRkKCZ0ZnAtPmxpc3QsIGhlYWQpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdHJ1Y3QgZnJhZ19wYWNrZXRfbGlzdF9lbnRyeSAqc2VhcmNoX2ZyYWdfcGFja2V0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsCi0JCQkJCQkgc3RydWN0IHVuaWNhc3RfZnJhZ19wYWNrZXQgKnVwKQotewotCXN0cnVjdCBmcmFnX3BhY2tldF9saXN0X2VudHJ5ICp0ZnA7Ci0Jc3RydWN0IHVuaWNhc3RfZnJhZ19wYWNrZXQgKnRtcF91cCA9IE5VTEw7Ci0JdWludDE2X3Qgc2VhcmNoX3NlcW5vOwotCi0JaWYgKHVwLT5mbGFncyAmIFVOSV9GUkFHX0hFQUQpCi0JCXNlYXJjaF9zZXFubyA9IG50b2hzKHVwLT5zZXFubykrMTsKLQllbHNlCi0JCXNlYXJjaF9zZXFubyA9IG50b2hzKHVwLT5zZXFubyktMTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkodGZwLCBoZWFkLCBsaXN0KSB7Ci0KLQkJaWYgKCF0ZnAtPnNrYikKLQkJCWNvbnRpbnVlOwotCi0JCWlmICh0ZnAtPnNlcW5vID09IG50b2hzKHVwLT5zZXFubykpCi0JCQlnb3RvIG1vdl90YWlsOwotCi0JCXRtcF91cCA9IChzdHJ1Y3QgdW5pY2FzdF9mcmFnX3BhY2tldCAqKXRmcC0+c2tiLT5kYXRhOwotCi0JCWlmICh0ZnAtPnNlcW5vID09IHNlYXJjaF9zZXFubykgewotCi0JCQlpZiAoKHRtcF91cC0+ZmxhZ3MgJiBVTklfRlJBR19IRUFEKSAhPQotCQkJICAgICh1cC0+ZmxhZ3MgJiBVTklfRlJBR19IRUFEKSkKLQkJCQlyZXR1cm4gdGZwOwotCQkJZWxzZQotCQkJCWdvdG8gbW92X3RhaWw7Ci0JCX0KLQl9Ci0JcmV0dXJuIE5VTEw7Ci0KLW1vdl90YWlsOgotCWxpc3RfbW92ZV90YWlsKCZ0ZnAtPmxpc3QsIGhlYWQpOwotCXJldHVybiBOVUxMOwotfQotCi12b2lkIGZyYWdfbGlzdF9mcmVlKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCi17Ci0Jc3RydWN0IGZyYWdfcGFja2V0X2xpc3RfZW50cnkgKnBmLCAqdG1wX3BmOwotCi0JaWYgKCFsaXN0X2VtcHR5KGhlYWQpKSB7Ci0KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBmLCB0bXBfcGYsIGhlYWQsIGxpc3QpIHsKLQkJCWtmcmVlX3NrYihwZi0+c2tiKTsKLQkJCWxpc3RfZGVsKCZwZi0+bGlzdCk7Ci0JCQlrZnJlZShwZik7Ci0JCX0KLQl9Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgaW50IHVuaWNhc3Rfc2VuZF9mcmFnX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJICBzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYsIHVpbnQ4X3QgZHN0YWRkcltdLAotCQkJICBzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUpCi17Ci0Jc3RydWN0IHVuaWNhc3RfZnJhZ19wYWNrZXQgKnVjYXN0X2ZyYWcxLCAqdWNhc3RfZnJhZzI7Ci0JaW50IGhkcl9sZW4gPSBzaXplb2Yoc3RydWN0IHVuaWNhc3RfZnJhZ19wYWNrZXQpOwotCXN0cnVjdCBza19idWZmICpmcmFnX3NrYjsKLQlpbnQgZGF0YV9sZW4gPSBza2ItPmxlbjsKLQotCWlmICghYmF0X3ByaXYtPnByaW1hcnlfaWYpCi0JCWdvdG8gZHJvcHBlZDsKLQotCWZyYWdfc2tiID0gZGV2X2FsbG9jX3NrYihkYXRhX2xlbiAtIChkYXRhX2xlbiAvIDIpICsgaGRyX2xlbik7Ci0Jc2tiX3NwbGl0KHNrYiwgZnJhZ19za2IsIGRhdGFfbGVuIC8gMik7Ci0KLQlpZiAobXlfc2tiX2hlYWRfcHVzaChmcmFnX3NrYiwgaGRyX2xlbikgPCAwIHx8Ci0JICAgIG15X3NrYl9oZWFkX3B1c2goc2tiLCBoZHJfbGVuKSA8IDApCi0JCWdvdG8gZHJvcF9mcmFnOwotCi0JdWNhc3RfZnJhZzEgPSAoc3RydWN0IHVuaWNhc3RfZnJhZ19wYWNrZXQgKilza2ItPmRhdGE7Ci0JdWNhc3RfZnJhZzIgPSAoc3RydWN0IHVuaWNhc3RfZnJhZ19wYWNrZXQgKilmcmFnX3NrYi0+ZGF0YTsKLQotCXVjYXN0X2ZyYWcxLT52ZXJzaW9uID0gQ09NUEFUX1ZFUlNJT047Ci0JdWNhc3RfZnJhZzEtPnBhY2tldF90eXBlID0gQkFUX1VOSUNBU1RfRlJBRzsKLQl1Y2FzdF9mcmFnMS0+dHRsID0gVFRMOwotCW1lbWNweSh1Y2FzdF9mcmFnMS0+b3JpZywKLQkgICAgICAgYmF0X3ByaXYtPnByaW1hcnlfaWYtPm5ldF9kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7Ci0JbWVtY3B5KHVjYXN0X2ZyYWcxLT5kZXN0LCBvcmlnX25vZGUtPm9yaWcsIEVUSF9BTEVOKTsKLQotCW1lbWNweSh1Y2FzdF9mcmFnMiwgdWNhc3RfZnJhZzEsIHNpemVvZihzdHJ1Y3QgdW5pY2FzdF9mcmFnX3BhY2tldCkpOwotCi0JdWNhc3RfZnJhZzEtPmZsYWdzIHw9IFVOSV9GUkFHX0hFQUQ7Ci0JdWNhc3RfZnJhZzItPmZsYWdzICY9IH5VTklfRlJBR19IRUFEOwotCi0JdWNhc3RfZnJhZzEtPnNlcW5vID0gaHRvbnMoKHVpbnQxNl90KWF0b21pY19pbmNfcmV0dXJuKAotCQkJCQkJJmJhdG1hbl9pZi0+ZnJhZ19zZXFubykpOwotCi0JdWNhc3RfZnJhZzItPnNlcW5vID0gaHRvbnMoKHVpbnQxNl90KWF0b21pY19pbmNfcmV0dXJuKAotCQkJCQkJJmJhdG1hbl9pZi0+ZnJhZ19zZXFubykpOwotCi0Jc2VuZF9za2JfcGFja2V0KHNrYiwgYmF0bWFuX2lmLCBkc3RhZGRyKTsKLQlzZW5kX3NrYl9wYWNrZXQoZnJhZ19za2IsIGJhdG1hbl9pZiwgZHN0YWRkcik7Ci0JcmV0dXJuIDA7Ci0KLWRyb3BfZnJhZzoKLQlrZnJlZV9za2IoZnJhZ19za2IpOwotZHJvcHBlZDoKLQlrZnJlZV9za2Ioc2tiKTsKLQlyZXR1cm4gMTsKLX0KLQotaW50IHVuaWNhc3Rfc2VuZF9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKLXsKLQlzdHJ1Y3QgZXRoaGRyICpldGhoZHIgPSAoc3RydWN0IGV0aGhkciAqKXNrYi0+ZGF0YTsKLQlzdHJ1Y3QgdW5pY2FzdF9wYWNrZXQgKnVuaWNhc3RfcGFja2V0OwotCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZTsKLQlzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWY7Ci0Jc3RydWN0IG5laWdoX25vZGUgKnJvdXRlcjsKLQlpbnQgZGF0YV9sZW4gPSBza2ItPmxlbjsKLQl1aW50OF90IGRzdGFkZHJbNl07Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQotCS8qIGdldCByb3V0aW5nIGluZm9ybWF0aW9uICovCi0Jb3JpZ19ub2RlID0gKChzdHJ1Y3Qgb3JpZ19ub2RlICopaGFzaF9maW5kKGJhdF9wcml2LT5vcmlnX2hhc2gsCi0JCQkJCQkgICBldGhoZHItPmhfZGVzdCkpOwotCi0JLyogY2hlY2sgZm9yIGhuYSBob3N0ICovCi0JaWYgKCFvcmlnX25vZGUpCi0JCW9yaWdfbm9kZSA9IHRyYW5zdGFibGVfc2VhcmNoKGJhdF9wcml2LCBldGhoZHItPmhfZGVzdCk7Ci0KLQlyb3V0ZXIgPSBmaW5kX3JvdXRlcihiYXRfcHJpdiwgb3JpZ19ub2RlLCBOVUxMKTsKLQotCWlmICghcm91dGVyKQotCQlnb3RvIHVubG9jazsKLQotCS8qIGRvbid0IGxvY2sgd2hpbGUgc2VuZGluZyB0aGUgcGFja2V0cyAuLi4gd2UgdGhlcmVmb3JlCi0JCSogY29weSB0aGUgcmVxdWlyZWQgZGF0YSBiZWZvcmUgc2VuZGluZyAqLwotCi0JYmF0bWFuX2lmID0gcm91dGVyLT5pZl9pbmNvbWluZzsKLQltZW1jcHkoZHN0YWRkciwgcm91dGVyLT5hZGRyLCBFVEhfQUxFTik7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQotCWlmIChiYXRtYW5faWYtPmlmX3N0YXR1cyAhPSBJRl9BQ1RJVkUpCi0JCWdvdG8gZHJvcHBlZDsKLQotCWlmIChhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmZyYWdfZW5hYmxlZCkgJiYKLQkgICAgZGF0YV9sZW4gKyBzaXplb2Yoc3RydWN0IHVuaWNhc3RfcGFja2V0KSA+IGJhdG1hbl9pZi0+bmV0X2Rldi0+bXR1KQotCQlyZXR1cm4gdW5pY2FzdF9zZW5kX2ZyYWdfc2tiKHNrYiwgYmF0X3ByaXYsIGJhdG1hbl9pZiwKLQkJCQkJICAgICBkc3RhZGRyLCBvcmlnX25vZGUpOwotCi0JaWYgKG15X3NrYl9oZWFkX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IHVuaWNhc3RfcGFja2V0KSkgPCAwKQotCQlnb3RvIGRyb3BwZWQ7Ci0KLQl1bmljYXN0X3BhY2tldCA9IChzdHJ1Y3QgdW5pY2FzdF9wYWNrZXQgKilza2ItPmRhdGE7Ci0KLQl1bmljYXN0X3BhY2tldC0+dmVyc2lvbiA9IENPTVBBVF9WRVJTSU9OOwotCS8qIGJhdG1hbiBwYWNrZXQgdHlwZTogdW5pY2FzdCAqLwotCXVuaWNhc3RfcGFja2V0LT5wYWNrZXRfdHlwZSA9IEJBVF9VTklDQVNUOwotCS8qIHNldCB1bmljYXN0IHR0bCAqLwotCXVuaWNhc3RfcGFja2V0LT50dGwgPSBUVEw7Ci0JLyogY29weSB0aGUgZGVzdGluYXRpb24gZm9yIGZhc3RlciByb3V0aW5nICovCi0JbWVtY3B5KHVuaWNhc3RfcGFja2V0LT5kZXN0LCBvcmlnX25vZGUtPm9yaWcsIEVUSF9BTEVOKTsKLQotCXNlbmRfc2tiX3BhY2tldChza2IsIGJhdG1hbl9pZiwgZHN0YWRkcik7Ci0JcmV0dXJuIDA7Ci0KLXVubG9jazoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLWRyb3BwZWQ6Ci0Ja2ZyZWVfc2tiKHNrYik7Ci0JcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi91bmljYXN0LmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi91bmljYXN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NzM2OTcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvdW5pY2FzdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgotICoKLSAqIEFuZHJlYXMgTGFuZ2VyCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxLCBVU0EKLSAqCi0gKi8KLQotI2lmbmRlZiBfTkVUX0JBVE1BTl9BRFZfVU5JQ0FTVF9IXwotI2RlZmluZSBfTkVUX0JBVE1BTl9BRFZfVU5JQ0FTVF9IXwotCi0jZGVmaW5lIEZSQUdfVElNRU9VVCAxMDAwMAkvKiBwdXJnZSBmcmFnIGxpc3QgZW50cnlzIGFmdGVyIHRpbWUgaW4gbXMgKi8KLSNkZWZpbmUgRlJBR19CVUZGRVJfU0laRSA2CS8qIG51bWJlciBvZiBsaXN0IGVsZW1lbnRzIGluIGJ1ZmZlciAqLwotCi1zdHJ1Y3Qgc2tfYnVmZiAqbWVyZ2VfZnJhZ19wYWNrZXQoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwKLQlzdHJ1Y3QgZnJhZ19wYWNrZXRfbGlzdF9lbnRyeSAqdGZwLAotCXN0cnVjdCBza19idWZmICpza2IpOwotCi12b2lkIGNyZWF0ZV9mcmFnX2VudHJ5KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIHN0cnVjdCBza19idWZmICpza2IpOwotaW50IGNyZWF0ZV9mcmFnX2J1ZmZlcihzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKTsKLXN0cnVjdCBmcmFnX3BhY2tldF9saXN0X2VudHJ5ICpzZWFyY2hfZnJhZ19wYWNrZXQoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwKLQlzdHJ1Y3QgdW5pY2FzdF9mcmFnX3BhY2tldCAqdXApOwotdm9pZCBmcmFnX2xpc3RfZnJlZShzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKTsKLWludCB1bmljYXN0X3NlbmRfc2tiKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpOwotCi0jZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX1VOSUNBU1RfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3Zpcy5jIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvdmlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMmMxYmMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvdmlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4OTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOC0yMDEwIEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6Ci0gKgotICogU2ltb24gV3VuZGVybGljaAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotICogMDIxMTAtMTMwMSwgVVNBCi0gKgotICovCi0KLSNpbmNsdWRlICJtYWluLmgiCi0jaW5jbHVkZSAic2VuZC5oIgotI2luY2x1ZGUgInRyYW5zbGF0aW9uLXRhYmxlLmgiCi0jaW5jbHVkZSAidmlzLmgiCi0jaW5jbHVkZSAic29mdC1pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJoYXJkLWludGVyZmFjZS5oIgotI2luY2x1ZGUgImhhc2guaCIKLQotI2RlZmluZSBNQVhfVklTX1BBQ0tFVF9TSVpFIDEwMDAKLQotLyogUmV0dXJucyB0aGUgc21hbGxlc3Qgc2lnbmVkIGludGVnZXIgaW4gdHdvJ3MgY29tcGxlbWVudCB3aXRoIHRoZSBzaXplb2YgeCAqLwotI2RlZmluZSBzbWFsbGVzdF9zaWduZWRfaW50KHgpICgxdSA8PCAoN3UgKyA4dSAqIChzaXplb2YoeCkgLSAxdSkpKQotCi0vKiBDaGVja3MgaWYgYSBzZXF1ZW5jZSBudW1iZXIgeCBpcyBhIHByZWRlY2Vzc29yL3N1Y2Nlc3NvciBvZiB5LgotICogdGhleSBoYW5kbGUgb3ZlcmZsb3dzL3VuZGVyZmxvd3MgYW5kIGNhbiBjb3JyZWN0bHkgY2hlY2sgZm9yIGEKLSAqIHByZWRlY2Vzc29yL3N1Y2Nlc3NvciB1bmxlc3MgdGhlIHZhcmlhYmxlIHNlcXVlbmNlIG51bWJlciBoYXMgZ3Jvd24gYnkKLSAqIG1vcmUgdGhlbiAyKiooYml0d2lkdGgoeCktMSktMS4KLSAqIFRoaXMgbWVhbnMgdGhhdCBmb3IgYSB1aW50OF90IHdpdGggdGhlIG1heGltdW0gdmFsdWUgMjU1LCBpdCB3b3VsZCB0aGluazoKLSAqICAtIHdoZW4gYWRkaW5nIG5vdGhpbmcgLSBpdCBpcyBuZWl0aGVyIGEgcHJlZGVjZXNzb3Igbm9yIGEgc3VjY2Vzc29yCi0gKiAgLSBiZWZvcmUgYWRkaW5nIG1vcmUgdGhhbiAxMjcgdG8gdGhlIHN0YXJ0aW5nIHZhbHVlIC0gaXQgaXMgYSBwcmVkZWNlc3NvciwKLSAqICAtIHdoZW4gYWRkaW5nIDEyOCAtIGl0IGlzIG5laXRoZXIgYSBwcmVkZWNlc3NvciBub3IgYSBzdWNjZXNzb3IsCi0gKiAgLSBhZnRlciBhZGRpbmcgbW9yZSB0aGFuIDEyNyB0byB0aGUgc3RhcnRpbmcgdmFsdWUgLSBpdCBpcyBhIHN1Y2Nlc3NvciAqLwotI2RlZmluZSBzZXFfYmVmb3JlKHgsIHkpICh7dHlwZW9mKHgpIF9kdW1teSA9ICh4IC0geSk7IFwKLQkJCV9kdW1teSA+IHNtYWxsZXN0X3NpZ25lZF9pbnQoX2R1bW15KTsgfSkKLSNkZWZpbmUgc2VxX2FmdGVyKHgsIHkpIHNlcV9iZWZvcmUoeSwgeCkKLQotc3RhdGljIHZvaWQgc3RhcnRfdmlzX3RpbWVyKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpOwotCi0vKiBmcmVlIHRoZSBpbmZvICovCi1zdGF0aWMgdm9pZCBmcmVlX2luZm8oc3RydWN0IGtyZWYgKnJlZikKLXsKLQlzdHJ1Y3QgdmlzX2luZm8gKmluZm8gPSBjb250YWluZXJfb2YocmVmLCBzdHJ1Y3QgdmlzX2luZm8sIHJlZmNvdW50KTsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gaW5mby0+YmF0X3ByaXY7Ci0Jc3RydWN0IHJlY3ZsaXN0X25vZGUgKmVudHJ5LCAqdG1wOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlsaXN0X2RlbF9pbml0KCZpbmZvLT5zZW5kX2xpc3QpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+dmlzX2xpc3RfbG9jaywgZmxhZ3MpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlbnRyeSwgdG1wLCAmaW5mby0+cmVjdl9saXN0LCBsaXN0KSB7Ci0JCWxpc3RfZGVsKCZlbnRyeS0+bGlzdCk7Ci0JCWtmcmVlKGVudHJ5KTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+dmlzX2xpc3RfbG9jaywgZmxhZ3MpOwotCWtmcmVlX3NrYihpbmZvLT5za2JfcGFja2V0KTsKLX0KLQotLyogQ29tcGFyZSB0d28gdmlzIHBhY2tldHMsIHVzZWQgYnkgdGhlIGhhc2hpbmcgYWxnb3JpdGhtICovCi1zdGF0aWMgaW50IHZpc19pbmZvX2NtcCh2b2lkICpkYXRhMSwgdm9pZCAqZGF0YTIpCi17Ci0Jc3RydWN0IHZpc19pbmZvICpkMSwgKmQyOwotCXN0cnVjdCB2aXNfcGFja2V0ICpwMSwgKnAyOwotCWQxID0gZGF0YTE7Ci0JZDIgPSBkYXRhMjsKLQlwMSA9IChzdHJ1Y3QgdmlzX3BhY2tldCAqKWQxLT5za2JfcGFja2V0LT5kYXRhOwotCXAyID0gKHN0cnVjdCB2aXNfcGFja2V0ICopZDItPnNrYl9wYWNrZXQtPmRhdGE7Ci0JcmV0dXJuIGNvbXBhcmVfb3JpZyhwMS0+dmlzX29yaWcsIHAyLT52aXNfb3JpZyk7Ci19Ci0KLS8qIGhhc2ggZnVuY3Rpb24gdG8gY2hvb3NlIGFuIGVudHJ5IGluIGEgaGFzaCB0YWJsZSBvZiBnaXZlbiBzaXplICovCi0vKiBoYXNoIGFsZ29yaXRobSBmcm9tIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSGFzaF90YWJsZSAqLwotc3RhdGljIGludCB2aXNfaW5mb19jaG9vc2Uodm9pZCAqZGF0YSwgaW50IHNpemUpCi17Ci0Jc3RydWN0IHZpc19pbmZvICp2aXNfaW5mbyA9IGRhdGE7Ci0Jc3RydWN0IHZpc19wYWNrZXQgKnBhY2tldDsKLQl1bnNpZ25lZCBjaGFyICprZXk7Ci0JdWludDMyX3QgaGFzaCA9IDA7Ci0Jc2l6ZV90IGk7Ci0KLQlwYWNrZXQgPSAoc3RydWN0IHZpc19wYWNrZXQgKil2aXNfaW5mby0+c2tiX3BhY2tldC0+ZGF0YTsKLQlrZXkgPSBwYWNrZXQtPnZpc19vcmlnOwotCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKSB7Ci0JCWhhc2ggKz0ga2V5W2ldOwotCQloYXNoICs9IChoYXNoIDw8IDEwKTsKLQkJaGFzaCBePSAoaGFzaCA+PiA2KTsKLQl9Ci0KLQloYXNoICs9IChoYXNoIDw8IDMpOwotCWhhc2ggXj0gKGhhc2ggPj4gMTEpOwotCWhhc2ggKz0gKGhhc2ggPDwgMTUpOwotCi0JcmV0dXJuIGhhc2ggJSBzaXplOwotfQotCi0vKiBpbnNlcnQgaW50ZXJmYWNlIHRvIHRoZSBsaXN0IG9mIGludGVyZmFjZXMgb2Ygb25lIG9yaWdpbmF0b3IsIGlmIGl0Ci0gKiBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IGluIHRoZSBsaXN0ICovCi1zdGF0aWMgdm9pZCB2aXNfZGF0YV9pbnNlcnRfaW50ZXJmYWNlKGNvbnN0IHVpbnQ4X3QgKmludGVyZmFjZSwKLQkJCQkgICAgICBzdHJ1Y3QgaGxpc3RfaGVhZCAqaWZfbGlzdCwKLQkJCQkgICAgICBib29sIHByaW1hcnkpCi17Ci0Jc3RydWN0IGlmX2xpc3RfZW50cnkgKmVudHJ5OwotCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7Ci0KLQlobGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgcG9zLCBpZl9saXN0LCBsaXN0KSB7Ci0JCWlmIChjb21wYXJlX29yaWcoZW50cnktPmFkZHIsICh2b2lkICopaW50ZXJmYWNlKSkKLQkJCXJldHVybjsKLQl9Ci0KLQkvKiBpdHMgYSBuZXcgYWRkcmVzcywgYWRkIGl0IHRvIHRoZSBsaXN0ICovCi0JZW50cnkgPSBrbWFsbG9jKHNpemVvZigqZW50cnkpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWVudHJ5KQotCQlyZXR1cm47Ci0JbWVtY3B5KGVudHJ5LT5hZGRyLCBpbnRlcmZhY2UsIEVUSF9BTEVOKTsKLQllbnRyeS0+cHJpbWFyeSA9IHByaW1hcnk7Ci0JaGxpc3RfYWRkX2hlYWQoJmVudHJ5LT5saXN0LCBpZl9saXN0KTsKLX0KLQotc3RhdGljIHNzaXplX3QgdmlzX2RhdGFfcmVhZF9wcmltX3NlYyhjaGFyICpidWZmLCBzdHJ1Y3QgaGxpc3RfaGVhZCAqaWZfbGlzdCkKLXsKLQlzdHJ1Y3QgaWZfbGlzdF9lbnRyeSAqZW50cnk7Ci0Jc3RydWN0IGhsaXN0X25vZGUgKnBvczsKLQlzaXplX3QgbGVuID0gMDsKLQotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCBwb3MsIGlmX2xpc3QsIGxpc3QpIHsKLQkJaWYgKGVudHJ5LT5wcmltYXJ5KQotCQkJbGVuICs9IHNwcmludGYoYnVmZiArIGxlbiwgIlBSSU1BUlksICIpOwotCQllbHNlIHsKLQkJCWxlbiArPSBzcHJpbnRmKGJ1ZmYgKyBsZW4sICAiU0VDICVwTSwgIiwgZW50cnktPmFkZHIpOwotCQl9Ci0JfQotCi0JcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIHNpemVfdCB2aXNfZGF0YV9jb3VudF9wcmltX3NlYyhzdHJ1Y3QgaGxpc3RfaGVhZCAqaWZfbGlzdCkKLXsKLQlzdHJ1Y3QgaWZfbGlzdF9lbnRyeSAqZW50cnk7Ci0Jc3RydWN0IGhsaXN0X25vZGUgKnBvczsKLQlzaXplX3QgY291bnQgPSAwOwotCi0JaGxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksIHBvcywgaWZfbGlzdCwgbGlzdCkgewotCQlpZiAoZW50cnktPnByaW1hcnkpCi0JCQljb3VudCArPSA5OwotCQllbHNlCi0JCQljb3VudCArPSAyMzsKLQl9Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLS8qIHJlYWQgYW4gZW50cnkgICovCi1zdGF0aWMgc3NpemVfdCB2aXNfZGF0YV9yZWFkX2VudHJ5KGNoYXIgKmJ1ZmYsIHN0cnVjdCB2aXNfaW5mb19lbnRyeSAqZW50cnksCi0JCQkJICAgdWludDhfdCAqc3JjLCBib29sIHByaW1hcnkpCi17Ci0JLyogbWF4aW1hbCBsZW5ndGg6IG1heCg0KzE3KzIsIDMrMTcrMSszKzIpID09IDI2ICovCi0JaWYgKHByaW1hcnkgJiYgZW50cnktPnF1YWxpdHkgPT0gMCkKLQkJcmV0dXJuIHNwcmludGYoYnVmZiwgIkhOQSAlcE0sICIsIGVudHJ5LT5kZXN0KTsKLQllbHNlIGlmIChjb21wYXJlX29yaWcoZW50cnktPnNyYywgc3JjKSkKLQkJcmV0dXJuIHNwcmludGYoYnVmZiwgIlRRICVwTSAlZCwgIiwgZW50cnktPmRlc3QsCi0JCQkgICAgICAgZW50cnktPnF1YWxpdHkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCB2aXNfc2VxX3ByaW50X3RleHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKLXsKLQlIQVNISVQoaGFzaGl0KTsKLQlIQVNISVQoaGFzaGl0X2NvdW50KTsKLQlzdHJ1Y3QgdmlzX2luZm8gKmluZm87Ci0Jc3RydWN0IHZpc19wYWNrZXQgKnBhY2tldDsKLQlzdHJ1Y3QgdmlzX2luZm9fZW50cnkgKmVudHJpZXM7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilzZXEtPnByaXZhdGU7Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KG5ldF9kZXYpOwotCUhMSVNUX0hFQUQodmlzX2lmX2xpc3QpOwotCXN0cnVjdCBpZl9saXN0X2VudHJ5ICplbnRyeTsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcG9zLCAqbjsKLQlpbnQgaTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCB2aXNfc2VydmVyID0gYXRvbWljX3JlYWQoJmJhdF9wcml2LT52aXNfbW9kZSk7Ci0Jc2l6ZV90IGJ1ZmZfcG9zLCBidWZfc2l6ZTsKLQljaGFyICpidWZmOwotCi0JaWYgKCghYmF0X3ByaXYtPnByaW1hcnlfaWYpIHx8Ci0JICAgICh2aXNfc2VydmVyID09IFZJU19UWVBFX0NMSUVOVF9VUERBVEUpKQotCQlyZXR1cm4gMDsKLQotCWJ1Zl9zaXplID0gMTsKLQkvKiBFc3RpbWF0ZSBsZW5ndGggKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPnZpc19oYXNoX2xvY2ssIGZsYWdzKTsKLQl3aGlsZSAoaGFzaF9pdGVyYXRlKGJhdF9wcml2LT52aXNfaGFzaCwgJmhhc2hpdF9jb3VudCkpIHsKLQkJaW5mbyA9IGhhc2hpdF9jb3VudC5idWNrZXQtPmRhdGE7Ci0JCXBhY2tldCA9IChzdHJ1Y3QgdmlzX3BhY2tldCAqKWluZm8tPnNrYl9wYWNrZXQtPmRhdGE7Ci0JCWVudHJpZXMgPSAoc3RydWN0IHZpc19pbmZvX2VudHJ5ICopCi0JCQkgICgoY2hhciAqKXBhY2tldCArIHNpemVvZihzdHJ1Y3QgdmlzX3BhY2tldCkpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBwYWNrZXQtPmVudHJpZXM7IGkrKykgewotCQkJaWYgKGVudHJpZXNbaV0ucXVhbGl0eSA9PSAwKQotCQkJCWNvbnRpbnVlOwotCQkJdmlzX2RhdGFfaW5zZXJ0X2ludGVyZmFjZShlbnRyaWVzW2ldLnNyYywgJnZpc19pZl9saXN0LAotCQkJCWNvbXBhcmVfb3JpZyhlbnRyaWVzW2ldLnNyYywgcGFja2V0LT52aXNfb3JpZykpOwotCQl9Ci0KLQkJaGxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksIHBvcywgJnZpc19pZl9saXN0LCBsaXN0KSB7Ci0JCQlidWZfc2l6ZSArPSAxOCArIDI2ICogcGFja2V0LT5lbnRyaWVzOwotCi0JCQkvKiBhZGQgcHJpbWFyeS9zZWNvbmRhcnkgcmVjb3JkcyAqLwotCQkJaWYgKGNvbXBhcmVfb3JpZyhlbnRyeS0+YWRkciwgcGFja2V0LT52aXNfb3JpZykpCi0JCQkJYnVmX3NpemUgKz0KLQkJCQkJdmlzX2RhdGFfY291bnRfcHJpbV9zZWMoJnZpc19pZl9saXN0KTsKLQotCQkJYnVmX3NpemUgKz0gMTsKLQkJfQotCi0JCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIHBvcywgbiwgJnZpc19pZl9saXN0LCBsaXN0KSB7Ci0JCQlobGlzdF9kZWwoJmVudHJ5LT5saXN0KTsKLQkJCWtmcmVlKGVudHJ5KTsKLQkJfQotCX0KLQotCWJ1ZmYgPSBrbWFsbG9jKGJ1Zl9zaXplLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWJ1ZmYpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPnZpc19oYXNoX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCWJ1ZmZbMF0gPSAnXDAnOwotCWJ1ZmZfcG9zID0gMDsKLQotCXdoaWxlIChoYXNoX2l0ZXJhdGUoYmF0X3ByaXYtPnZpc19oYXNoLCAmaGFzaGl0KSkgewotCQlpbmZvID0gaGFzaGl0LmJ1Y2tldC0+ZGF0YTsKLQkJcGFja2V0ID0gKHN0cnVjdCB2aXNfcGFja2V0ICopaW5mby0+c2tiX3BhY2tldC0+ZGF0YTsKLQkJZW50cmllcyA9IChzdHJ1Y3QgdmlzX2luZm9fZW50cnkgKikKLQkJCSAgKChjaGFyICopcGFja2V0ICsgc2l6ZW9mKHN0cnVjdCB2aXNfcGFja2V0KSk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IHBhY2tldC0+ZW50cmllczsgaSsrKSB7Ci0JCQlpZiAoZW50cmllc1tpXS5xdWFsaXR5ID09IDApCi0JCQkJY29udGludWU7Ci0JCQl2aXNfZGF0YV9pbnNlcnRfaW50ZXJmYWNlKGVudHJpZXNbaV0uc3JjLCAmdmlzX2lmX2xpc3QsCi0JCQkJY29tcGFyZV9vcmlnKGVudHJpZXNbaV0uc3JjLCBwYWNrZXQtPnZpc19vcmlnKSk7Ci0JCX0KLQotCQlobGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgcG9zLCAmdmlzX2lmX2xpc3QsIGxpc3QpIHsKLQkJCWJ1ZmZfcG9zICs9IHNwcmludGYoYnVmZiArIGJ1ZmZfcG9zLCAiJXBNLCIsCi0JCQkJCSAgICBlbnRyeS0+YWRkcik7Ci0KLQkJCWZvciAoaSA9IDA7IGkgPCBwYWNrZXQtPmVudHJpZXM7IGkrKykKLQkJCQlidWZmX3BvcyArPSB2aXNfZGF0YV9yZWFkX2VudHJ5KGJ1ZmYgKyBidWZmX3BvcywKLQkJCQkJCQkJJmVudHJpZXNbaV0sCi0JCQkJCQkJCWVudHJ5LT5hZGRyLAotCQkJCQkJCQllbnRyeS0+cHJpbWFyeSk7Ci0KLQkJCS8qIGFkZCBwcmltYXJ5L3NlY29uZGFyeSByZWNvcmRzICovCi0JCQlpZiAoY29tcGFyZV9vcmlnKGVudHJ5LT5hZGRyLCBwYWNrZXQtPnZpc19vcmlnKSkKLQkJCQlidWZmX3BvcyArPQotCQkJCQl2aXNfZGF0YV9yZWFkX3ByaW1fc2VjKGJ1ZmYgKyBidWZmX3BvcywKLQkJCQkJCQkgICAgICAgJnZpc19pZl9saXN0KTsKLQotCQkJYnVmZl9wb3MgKz0gc3ByaW50ZihidWZmICsgYnVmZl9wb3MsICJcbiIpOwotCQl9Ci0KLQkJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlbnRyeSwgcG9zLCBuLCAmdmlzX2lmX2xpc3QsIGxpc3QpIHsKLQkJCWhsaXN0X2RlbCgmZW50cnktPmxpc3QpOwotCQkJa2ZyZWUoZW50cnkpOwotCQl9Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPnZpc19oYXNoX2xvY2ssIGZsYWdzKTsKLQotCXNlcV9wcmludGYoc2VxLCAiJXMiLCBidWZmKTsKLQlrZnJlZShidWZmKTsKLQotCXJldHVybiAwOwotfQotCi0vKiBhZGQgdGhlIGluZm8gcGFja2V0IHRvIHRoZSBzZW5kIGxpc3QsIGlmIGl0IHdhcyBub3QKLSAqIGFscmVhZHkgbGlua2VkIGluLiAqLwotc3RhdGljIHZvaWQgc2VuZF9saXN0X2FkZChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LCBzdHJ1Y3QgdmlzX2luZm8gKmluZm8pCi17Ci0JaWYgKGxpc3RfZW1wdHkoJmluZm8tPnNlbmRfbGlzdCkpIHsKLQkJa3JlZl9nZXQoJmluZm8tPnJlZmNvdW50KTsKLQkJbGlzdF9hZGRfdGFpbCgmaW5mby0+c2VuZF9saXN0LCAmYmF0X3ByaXYtPnZpc19zZW5kX2xpc3QpOwotCX0KLX0KLQotLyogZGVsZXRlIHRoZSBpbmZvIHBhY2tldCBmcm9tIHRoZSBzZW5kIGxpc3QsIGlmIGl0IHdhcwotICogbGlua2VkIGluLiAqLwotc3RhdGljIHZvaWQgc2VuZF9saXN0X2RlbChzdHJ1Y3QgdmlzX2luZm8gKmluZm8pCi17Ci0JaWYgKCFsaXN0X2VtcHR5KCZpbmZvLT5zZW5kX2xpc3QpKSB7Ci0JCWxpc3RfZGVsX2luaXQoJmluZm8tPnNlbmRfbGlzdCk7Ci0JCWtyZWZfcHV0KCZpbmZvLT5yZWZjb3VudCwgZnJlZV9pbmZvKTsKLQl9Ci19Ci0KLS8qIHRyaWVzIHRvIGFkZCBvbmUgZW50cnkgdG8gdGhlIHJlY2VpdmUgbGlzdC4gKi8KLXN0YXRpYyB2b2lkIHJlY3ZfbGlzdF9hZGQoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCSAgc3RydWN0IGxpc3RfaGVhZCAqcmVjdl9saXN0LCBjaGFyICptYWMpCi17Ci0Jc3RydWN0IHJlY3ZsaXN0X25vZGUgKmVudHJ5OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQllbnRyeSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCByZWN2bGlzdF9ub2RlKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFlbnRyeSkKLQkJcmV0dXJuOwotCi0JbWVtY3B5KGVudHJ5LT5tYWMsIG1hYywgRVRIX0FMRU4pOwotCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+dmlzX2xpc3RfbG9jaywgZmxhZ3MpOwotCWxpc3RfYWRkX3RhaWwoJmVudHJ5LT5saXN0LCByZWN2X2xpc3QpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT52aXNfbGlzdF9sb2NrLCBmbGFncyk7Ci19Ci0KLS8qIHJldHVybnMgMSBpZiB0aGlzIG1hYyBpcyBpbiB0aGUgcmVjdl9saXN0ICovCi1zdGF0aWMgaW50IHJlY3ZfbGlzdF9pc19pbihzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJICAgc3RydWN0IGxpc3RfaGVhZCAqcmVjdl9saXN0LCBjaGFyICptYWMpCi17Ci0Jc3RydWN0IHJlY3ZsaXN0X25vZGUgKmVudHJ5OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPnZpc19saXN0X2xvY2ssIGZsYWdzKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCByZWN2X2xpc3QsIGxpc3QpIHsKLQkJaWYgKG1lbWNtcChlbnRyeS0+bWFjLCBtYWMsIEVUSF9BTEVOKSA9PSAwKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+dmlzX2xpc3RfbG9jaywKLQkJCQkJICAgICAgIGZsYWdzKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT52aXNfbGlzdF9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIHRyeSB0byBhZGQgdGhlIHBhY2tldCB0byB0aGUgdmlzX2hhc2guIHJldHVybiBOVUxMIGlmIGludmFsaWQgKGUuZy4gdG9vIG9sZCwKLSAqIGJyb2tlbi4uICkuCXZpcyBoYXNoIG11c3QgYmUgbG9ja2VkIG91dHNpZGUuICBpc19uZXcgaXMgc2V0IHdoZW4gdGhlIHBhY2tldAotICogaXMgbmV3ZXIgdGhhbiBvbGQgZW50cmllcyBpbiB0aGUgaGFzaC4gKi8KLXN0YXRpYyBzdHJ1Y3QgdmlzX2luZm8gKmFkZF9wYWNrZXQoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCQkgICBzdHJ1Y3QgdmlzX3BhY2tldCAqdmlzX3BhY2tldCwKLQkJCQkgICBpbnQgdmlzX2luZm9fbGVuLCBpbnQgKmlzX25ldywKLQkJCQkgICBpbnQgbWFrZV9icm9hZGNhc3QpCi17Ci0Jc3RydWN0IHZpc19pbmZvICppbmZvLCAqb2xkX2luZm87Ci0Jc3RydWN0IHZpc19wYWNrZXQgKnNlYXJjaF9wYWNrZXQsICpvbGRfcGFja2V0OwotCXN0cnVjdCB2aXNfaW5mbyBzZWFyY2hfZWxlbTsKLQlzdHJ1Y3QgdmlzX3BhY2tldCAqcGFja2V0OwotCi0JKmlzX25ldyA9IDA7Ci0JLyogc2FuaXR5IGNoZWNrICovCi0JaWYgKCFiYXRfcHJpdi0+dmlzX2hhc2gpCi0JCXJldHVybiBOVUxMOwotCi0JLyogc2VlIGlmIHRoZSBwYWNrZXQgaXMgYWxyZWFkeSBpbiB2aXNfaGFzaCAqLwotCXNlYXJjaF9lbGVtLnNrYl9wYWNrZXQgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgdmlzX3BhY2tldCkpOwotCWlmICghc2VhcmNoX2VsZW0uc2tiX3BhY2tldCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2VhcmNoX3BhY2tldCA9IChzdHJ1Y3QgdmlzX3BhY2tldCAqKXNrYl9wdXQoc2VhcmNoX2VsZW0uc2tiX3BhY2tldCwKLQkJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCB2aXNfcGFja2V0KSk7Ci0KLQltZW1jcHkoc2VhcmNoX3BhY2tldC0+dmlzX29yaWcsIHZpc19wYWNrZXQtPnZpc19vcmlnLCBFVEhfQUxFTik7Ci0Jb2xkX2luZm8gPSBoYXNoX2ZpbmQoYmF0X3ByaXYtPnZpc19oYXNoLCAmc2VhcmNoX2VsZW0pOwotCWtmcmVlX3NrYihzZWFyY2hfZWxlbS5za2JfcGFja2V0KTsKLQotCWlmIChvbGRfaW5mbyAhPSBOVUxMKSB7Ci0JCW9sZF9wYWNrZXQgPSAoc3RydWN0IHZpc19wYWNrZXQgKilvbGRfaW5mby0+c2tiX3BhY2tldC0+ZGF0YTsKLQkJaWYgKCFzZXFfYWZ0ZXIobnRvaGwodmlzX3BhY2tldC0+c2Vxbm8pLAotCQkJICAgICAgIG50b2hsKG9sZF9wYWNrZXQtPnNlcW5vKSkpIHsKLQkJCWlmIChvbGRfcGFja2V0LT5zZXFubyA9PSB2aXNfcGFja2V0LT5zZXFubykgewotCQkJCXJlY3ZfbGlzdF9hZGQoYmF0X3ByaXYsICZvbGRfaW5mby0+cmVjdl9saXN0LAotCQkJCQkgICAgICB2aXNfcGFja2V0LT5zZW5kZXJfb3JpZyk7Ci0JCQkJcmV0dXJuIG9sZF9pbmZvOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBuZXdlciBwYWNrZXQgaXMgYWxyZWFkeSBpbiBoYXNoLiAqLwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQl9Ci0JCS8qIHJlbW92ZSBvbGQgZW50cnkgKi8KLQkJaGFzaF9yZW1vdmUoYmF0X3ByaXYtPnZpc19oYXNoLCBvbGRfaW5mbyk7Ci0JCXNlbmRfbGlzdF9kZWwob2xkX2luZm8pOwotCQlrcmVmX3B1dCgmb2xkX2luZm8tPnJlZmNvdW50LCBmcmVlX2luZm8pOwotCX0KLQotCWluZm8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdmlzX2luZm8pLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWluZm8pCi0JCXJldHVybiBOVUxMOwotCi0JaW5mby0+c2tiX3BhY2tldCA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKHN0cnVjdCB2aXNfcGFja2V0KSArCi0JCQkJCSB2aXNfaW5mb19sZW4gKyBzaXplb2Yoc3RydWN0IGV0aGhkcikpOwotCWlmICghaW5mby0+c2tiX3BhY2tldCkgewotCQlrZnJlZShpbmZvKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXNrYl9yZXNlcnZlKGluZm8tPnNrYl9wYWNrZXQsIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSk7Ci0JcGFja2V0ID0gKHN0cnVjdCB2aXNfcGFja2V0ICopc2tiX3B1dChpbmZvLT5za2JfcGFja2V0LAotCQkJCQkgICAgICBzaXplb2Yoc3RydWN0IHZpc19wYWNrZXQpICsKLQkJCQkJICAgICAgdmlzX2luZm9fbGVuKTsKLQotCWtyZWZfaW5pdCgmaW5mby0+cmVmY291bnQpOwotCUlOSVRfTElTVF9IRUFEKCZpbmZvLT5zZW5kX2xpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZpbmZvLT5yZWN2X2xpc3QpOwotCWluZm8tPmZpcnN0X3NlZW4gPSBqaWZmaWVzOwotCWluZm8tPmJhdF9wcml2ID0gYmF0X3ByaXY7Ci0JbWVtY3B5KHBhY2tldCwgdmlzX3BhY2tldCwgc2l6ZW9mKHN0cnVjdCB2aXNfcGFja2V0KSArIHZpc19pbmZvX2xlbik7Ci0KLQkvKiBpbml0aWFsaXplIGFuZCBhZGQgbmV3IHBhY2tldC4gKi8KLQkqaXNfbmV3ID0gMTsKLQotCS8qIE1ha2UgaXQgYSBicm9hZGNhc3QgcGFja2V0LCBpZiByZXF1aXJlZCAqLwotCWlmIChtYWtlX2Jyb2FkY2FzdCkKLQkJbWVtY3B5KHBhY2tldC0+dGFyZ2V0X29yaWcsIGJyb2FkY2FzdF9hZGRyLCBFVEhfQUxFTik7Ci0KLQkvKiByZXBhaXIgaWYgZW50cmllcyBpcyBsb25nZXIgdGhhbiBwYWNrZXQuICovCi0JaWYgKHBhY2tldC0+ZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgdmlzX2luZm9fZW50cnkpID4gdmlzX2luZm9fbGVuKQotCQlwYWNrZXQtPmVudHJpZXMgPSB2aXNfaW5mb19sZW4gLyBzaXplb2Yoc3RydWN0IHZpc19pbmZvX2VudHJ5KTsKLQotCXJlY3ZfbGlzdF9hZGQoYmF0X3ByaXYsICZpbmZvLT5yZWN2X2xpc3QsIHBhY2tldC0+c2VuZGVyX29yaWcpOwotCi0JLyogdHJ5IHRvIGFkZCBpdCAqLwotCWlmIChoYXNoX2FkZChiYXRfcHJpdi0+dmlzX2hhc2gsIGluZm8pIDwgMCkgewotCQkvKiBkaWQgbm90IHdvcmsgKGZvciBzb21lIHJlYXNvbikgKi8KLQkJa3JlZl9wdXQoJm9sZF9pbmZvLT5yZWZjb3VudCwgZnJlZV9pbmZvKTsKLQkJaW5mbyA9IE5VTEw7Ci0JfQotCi0JcmV0dXJuIGluZm87Ci19Ci0KLS8qIGhhbmRsZSB0aGUgc2VydmVyIHN5bmMgcGFja2V0LCBmb3J3YXJkIGlmIG5lZWRlZC4gKi8KLXZvaWQgcmVjZWl2ZV9zZXJ2ZXJfc3luY19wYWNrZXQoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCQlzdHJ1Y3QgdmlzX3BhY2tldCAqdmlzX3BhY2tldCwKLQkJCQlpbnQgdmlzX2luZm9fbGVuKQotewotCXN0cnVjdCB2aXNfaW5mbyAqaW5mbzsKLQlpbnQgaXNfbmV3LCBtYWtlX2Jyb2FkY2FzdDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCB2aXNfc2VydmVyID0gYXRvbWljX3JlYWQoJmJhdF9wcml2LT52aXNfbW9kZSk7Ci0KLQltYWtlX2Jyb2FkY2FzdCA9ICh2aXNfc2VydmVyID09IFZJU19UWVBFX1NFUlZFUl9TWU5DKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+dmlzX2hhc2hfbG9jaywgZmxhZ3MpOwotCWluZm8gPSBhZGRfcGFja2V0KGJhdF9wcml2LCB2aXNfcGFja2V0LCB2aXNfaW5mb19sZW4sCi0JCQkgICZpc19uZXcsIG1ha2VfYnJvYWRjYXN0KTsKLQlpZiAoIWluZm8pCi0JCWdvdG8gZW5kOwotCi0JLyogb25seSBpZiB3ZSBhcmUgc2VydmVyIG91cnNlbHZlcyBhbmQgcGFja2V0IGlzIG5ld2VyIHRoYW4gdGhlIG9uZSBpbgotCSAqIGhhc2guKi8KLQlpZiAodmlzX3NlcnZlciA9PSBWSVNfVFlQRV9TRVJWRVJfU1lOQyAmJiBpc19uZXcpCi0JCXNlbmRfbGlzdF9hZGQoYmF0X3ByaXYsIGluZm8pOwotZW5kOgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT52aXNfaGFzaF9sb2NrLCBmbGFncyk7Ci19Ci0KLS8qIGhhbmRsZSBhbiBpbmNvbWluZyBjbGllbnQgdXBkYXRlIHBhY2tldCBhbmQgc2NoZWR1bGUgZm9yd2FyZCBpZiBuZWVkZWQuICovCi12b2lkIHJlY2VpdmVfY2xpZW50X3VwZGF0ZV9wYWNrZXQoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCQkgIHN0cnVjdCB2aXNfcGFja2V0ICp2aXNfcGFja2V0LAotCQkJCSAgaW50IHZpc19pbmZvX2xlbikKLXsKLQlzdHJ1Y3QgdmlzX2luZm8gKmluZm87Ci0Jc3RydWN0IHZpc19wYWNrZXQgKnBhY2tldDsKLQlpbnQgaXNfbmV3OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHZpc19zZXJ2ZXIgPSBhdG9taWNfcmVhZCgmYmF0X3ByaXYtPnZpc19tb2RlKTsKLQlpbnQgYXJlX3RhcmdldCA9IDA7Ci0KLQkvKiBjbGllbnRzIHNoYWxsIG5vdCBicm9hZGNhc3QuICovCi0JaWYgKGlzX2JjYXN0KHZpc19wYWNrZXQtPnRhcmdldF9vcmlnKSkKLQkJcmV0dXJuOwotCi0JLyogQXJlIHdlIHRoZSB0YXJnZXQgZm9yIHRoaXMgVklTIHBhY2tldD8gKi8KLQlpZiAodmlzX3NlcnZlciA9PSBWSVNfVFlQRV9TRVJWRVJfU1lOQwkmJgotCSAgICBpc19teV9tYWModmlzX3BhY2tldC0+dGFyZ2V0X29yaWcpKQotCQlhcmVfdGFyZ2V0ID0gMTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+dmlzX2hhc2hfbG9jaywgZmxhZ3MpOwotCWluZm8gPSBhZGRfcGFja2V0KGJhdF9wcml2LCB2aXNfcGFja2V0LCB2aXNfaW5mb19sZW4sCi0JCQkgICZpc19uZXcsIGFyZV90YXJnZXQpOwotCi0JaWYgKCFpbmZvKQotCQlnb3RvIGVuZDsKLQkvKiBub3RlIHRoYXQgb3V0ZGF0ZWQgcGFja2V0cyB3aWxsIGJlIGRyb3BwZWQgYXQgdGhpcyBwb2ludC4gKi8KLQotCXBhY2tldCA9IChzdHJ1Y3QgdmlzX3BhY2tldCAqKWluZm8tPnNrYl9wYWNrZXQtPmRhdGE7Ci0KLQkvKiBzZW5kIG9ubHkgaWYgd2UncmUgdGhlIHRhcmdldCBzZXJ2ZXIgb3IgLi4uICovCi0JaWYgKGFyZV90YXJnZXQgJiYgaXNfbmV3KSB7Ci0JCXBhY2tldC0+dmlzX3R5cGUgPSBWSVNfVFlQRV9TRVJWRVJfU1lOQzsJLyogdXBncmFkZSEgKi8KLQkJc2VuZF9saXN0X2FkZChiYXRfcHJpdiwgaW5mbyk7Ci0KLQkJLyogLi4uIHdlJ3JlIG5vdCB0aGUgcmVjaXBpZW50IChhbmQgdGh1cyBuZWVkIHRvIGZvcndhcmQpLiAqLwotCX0gZWxzZSBpZiAoIWlzX215X21hYyhwYWNrZXQtPnRhcmdldF9vcmlnKSkgewotCQlzZW5kX2xpc3RfYWRkKGJhdF9wcml2LCBpbmZvKTsKLQl9Ci0KLWVuZDoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+dmlzX2hhc2hfbG9jaywgZmxhZ3MpOwotfQotCi0vKiBXYWxrIHRoZSBvcmlnaW5hdG9ycyBhbmQgZmluZCB0aGUgVklTIHNlcnZlciB3aXRoIHRoZSBiZXN0IHRxLiBTZXQgdGhlIHBhY2tldAotICogYWRkcmVzcyB0byBpdHMgYWRkcmVzcyBhbmQgcmV0dXJuIHRoZSBiZXN0X3RxLgotICoKLSAqIE11c3QgYmUgY2FsbGVkIHdpdGggdGhlIG9yaWdpbmF0b3IgaGFzaCBsb2NrZWQgKi8KLXN0YXRpYyBpbnQgZmluZF9iZXN0X3Zpc19zZXJ2ZXIoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCQlzdHJ1Y3QgdmlzX2luZm8gKmluZm8pCi17Ci0JSEFTSElUKGhhc2hpdCk7Ci0Jc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOwotCXN0cnVjdCB2aXNfcGFja2V0ICpwYWNrZXQ7Ci0JaW50IGJlc3RfdHEgPSAtMTsKLQotCXBhY2tldCA9IChzdHJ1Y3QgdmlzX3BhY2tldCAqKWluZm8tPnNrYl9wYWNrZXQtPmRhdGE7Ci0KLQl3aGlsZSAoaGFzaF9pdGVyYXRlKGJhdF9wcml2LT5vcmlnX2hhc2gsICZoYXNoaXQpKSB7Ci0JCW9yaWdfbm9kZSA9IGhhc2hpdC5idWNrZXQtPmRhdGE7Ci0JCWlmICgob3JpZ19ub2RlKSAmJiAob3JpZ19ub2RlLT5yb3V0ZXIpICYmCi0JCSAgICAob3JpZ19ub2RlLT5mbGFncyAmIFZJU19TRVJWRVIpICYmCi0JCSAgICAob3JpZ19ub2RlLT5yb3V0ZXItPnRxX2F2ZyA+IGJlc3RfdHEpKSB7Ci0JCQliZXN0X3RxID0gb3JpZ19ub2RlLT5yb3V0ZXItPnRxX2F2ZzsKLQkJCW1lbWNweShwYWNrZXQtPnRhcmdldF9vcmlnLCBvcmlnX25vZGUtPm9yaWcsIEVUSF9BTEVOKTsKLQkJfQotCX0KLQlyZXR1cm4gYmVzdF90cTsKLX0KLQotLyogUmV0dXJuIHRydWUgaWYgdGhlIHZpcyBwYWNrZXQgaXMgZnVsbC4gKi8KLXN0YXRpYyBib29sIHZpc19wYWNrZXRfZnVsbChzdHJ1Y3QgdmlzX2luZm8gKmluZm8pCi17Ci0Jc3RydWN0IHZpc19wYWNrZXQgKnBhY2tldDsKLQlwYWNrZXQgPSAoc3RydWN0IHZpc19wYWNrZXQgKilpbmZvLT5za2JfcGFja2V0LT5kYXRhOwotCi0JaWYgKE1BWF9WSVNfUEFDS0VUX1NJWkUgLyBzaXplb2Yoc3RydWN0IHZpc19pbmZvX2VudHJ5KQotCQk8IHBhY2tldC0+ZW50cmllcyArIDEpCi0JCXJldHVybiB0cnVlOwotCXJldHVybiBmYWxzZTsKLX0KLQotLyogZ2VuZXJhdGVzIGEgcGFja2V0IG9mIG93biB2aXMgZGF0YSwKLSAqIHJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBpZiBubyBwYWNrZXQgY291bGQgYmUgZ2VuZXJhdGVkICovCi1zdGF0aWMgaW50IGdlbmVyYXRlX3Zpc19wYWNrZXQoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKLXsKLQlIQVNISVQoaGFzaGl0X2xvY2FsKTsKLQlIQVNISVQoaGFzaGl0X2dsb2JhbCk7Ci0Jc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOwotCXN0cnVjdCB2aXNfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgdmlzX2luZm8gKiliYXRfcHJpdi0+bXlfdmlzX2luZm87Ci0Jc3RydWN0IHZpc19wYWNrZXQgKnBhY2tldCA9IChzdHJ1Y3QgdmlzX3BhY2tldCAqKWluZm8tPnNrYl9wYWNrZXQtPmRhdGE7Ci0Jc3RydWN0IHZpc19pbmZvX2VudHJ5ICplbnRyeTsKLQlzdHJ1Y3QgaG5hX2xvY2FsX2VudHJ5ICpobmFfbG9jYWxfZW50cnk7Ci0JaW50IGJlc3RfdHEgPSAtMTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaW5mby0+Zmlyc3Rfc2VlbiA9IGppZmZpZXM7Ci0JcGFja2V0LT52aXNfdHlwZSA9IGF0b21pY19yZWFkKCZiYXRfcHJpdi0+dmlzX21vZGUpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCW1lbWNweShwYWNrZXQtPnRhcmdldF9vcmlnLCBicm9hZGNhc3RfYWRkciwgRVRIX0FMRU4pOwotCXBhY2tldC0+dHRsID0gVFRMOwotCXBhY2tldC0+c2Vxbm8gPSBodG9ubChudG9obChwYWNrZXQtPnNlcW5vKSArIDEpOwotCXBhY2tldC0+ZW50cmllcyA9IDA7Ci0Jc2tiX3RyaW0oaW5mby0+c2tiX3BhY2tldCwgc2l6ZW9mKHN0cnVjdCB2aXNfcGFja2V0KSk7Ci0KLQlpZiAocGFja2V0LT52aXNfdHlwZSA9PSBWSVNfVFlQRV9DTElFTlRfVVBEQVRFKSB7Ci0JCWJlc3RfdHEgPSBmaW5kX2Jlc3RfdmlzX3NlcnZlcihiYXRfcHJpdiwgaW5mbyk7Ci0KLQkJaWYgKGJlc3RfdHEgPCAwKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssCi0JCQkJCSAgICAgICBmbGFncyk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0KLQl3aGlsZSAoaGFzaF9pdGVyYXRlKGJhdF9wcml2LT5vcmlnX2hhc2gsICZoYXNoaXRfZ2xvYmFsKSkgewotCQlvcmlnX25vZGUgPSBoYXNoaXRfZ2xvYmFsLmJ1Y2tldC0+ZGF0YTsKLQotCQlpZiAoIW9yaWdfbm9kZS0+cm91dGVyKQotCQkJY29udGludWU7Ci0KLQkJaWYgKCFjb21wYXJlX29yaWcob3JpZ19ub2RlLT5yb3V0ZXItPmFkZHIsIG9yaWdfbm9kZS0+b3JpZykpCi0JCQljb250aW51ZTsKLQotCQlpZiAob3JpZ19ub2RlLT5yb3V0ZXItPmlmX2luY29taW5nLT5pZl9zdGF0dXMgIT0gSUZfQUNUSVZFKQotCQkJY29udGludWU7Ci0KLQkJaWYgKG9yaWdfbm9kZS0+cm91dGVyLT50cV9hdmcgPCAxKQotCQkJY29udGludWU7Ci0KLQkJLyogZmlsbCBvbmUgZW50cnkgaW50byBidWZmZXIuICovCi0JCWVudHJ5ID0gKHN0cnVjdCB2aXNfaW5mb19lbnRyeSAqKQotCQkJCXNrYl9wdXQoaW5mby0+c2tiX3BhY2tldCwgc2l6ZW9mKCplbnRyeSkpOwotCQltZW1jcHkoZW50cnktPnNyYywKLQkJICAgICAgIG9yaWdfbm9kZS0+cm91dGVyLT5pZl9pbmNvbWluZy0+bmV0X2Rldi0+ZGV2X2FkZHIsCi0JCSAgICAgICBFVEhfQUxFTik7Ci0JCW1lbWNweShlbnRyeS0+ZGVzdCwgb3JpZ19ub2RlLT5vcmlnLCBFVEhfQUxFTik7Ci0JCWVudHJ5LT5xdWFsaXR5ID0gb3JpZ19ub2RlLT5yb3V0ZXItPnRxX2F2ZzsKLQkJcGFja2V0LT5lbnRyaWVzKys7Ci0KLQkJaWYgKHZpc19wYWNrZXRfZnVsbChpbmZvKSkgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgKLQkJCQkJJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+aG5hX2xoYXNoX2xvY2ssIGZsYWdzKTsKLQl3aGlsZSAoaGFzaF9pdGVyYXRlKGJhdF9wcml2LT5obmFfbG9jYWxfaGFzaCwgJmhhc2hpdF9sb2NhbCkpIHsKLQkJaG5hX2xvY2FsX2VudHJ5ID0gaGFzaGl0X2xvY2FsLmJ1Y2tldC0+ZGF0YTsKLQkJZW50cnkgPSAoc3RydWN0IHZpc19pbmZvX2VudHJ5ICopc2tiX3B1dChpbmZvLT5za2JfcGFja2V0LAotCQkJCQkJCSBzaXplb2YoKmVudHJ5KSk7Ci0JCW1lbXNldChlbnRyeS0+c3JjLCAwLCBFVEhfQUxFTik7Ci0JCW1lbWNweShlbnRyeS0+ZGVzdCwgaG5hX2xvY2FsX2VudHJ5LT5hZGRyLCBFVEhfQUxFTik7Ci0JCWVudHJ5LT5xdWFsaXR5ID0gMDsgLyogMCBtZWFucyBITkEgKi8KLQkJcGFja2V0LT5lbnRyaWVzKys7Ci0KLQkJaWYgKHZpc19wYWNrZXRfZnVsbChpbmZvKSkgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPmhuYV9saGFzaF9sb2NrLAotCQkJCQkgICAgICAgZmxhZ3MpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+aG5hX2xoYXNoX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogZnJlZSBvbGQgdmlzIHBhY2tldHMuIE11c3QgYmUgY2FsbGVkIHdpdGggdGhpcyB2aXNfaGFzaF9sb2NrCi0gKiBoZWxkICovCi1zdGF0aWMgdm9pZCBwdXJnZV92aXNfcGFja2V0cyhzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KQotewotCUhBU0hJVChoYXNoaXQpOwotCXN0cnVjdCB2aXNfaW5mbyAqaW5mbzsKLQotCXdoaWxlIChoYXNoX2l0ZXJhdGUoYmF0X3ByaXYtPnZpc19oYXNoLCAmaGFzaGl0KSkgewotCQlpbmZvID0gaGFzaGl0LmJ1Y2tldC0+ZGF0YTsKLQotCQkvKiBuZXZlciBwdXJnZSBvd24gZGF0YS4gKi8KLQkJaWYgKGluZm8gPT0gYmF0X3ByaXYtPm15X3Zpc19pbmZvKQotCQkJY29udGludWU7Ci0KLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywKLQkJCSAgICAgICBpbmZvLT5maXJzdF9zZWVuICsgVklTX1RJTUVPVVQgKiBIWikpIHsKLQkJCWhhc2hfcmVtb3ZlX2J1Y2tldChiYXRfcHJpdi0+dmlzX2hhc2gsICZoYXNoaXQpOwotCQkJc2VuZF9saXN0X2RlbChpbmZvKTsKLQkJCWtyZWZfcHV0KCZpbmZvLT5yZWZjb3VudCwgZnJlZV9pbmZvKTsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgYnJvYWRjYXN0X3Zpc19wYWNrZXQoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCQkgc3RydWN0IHZpc19pbmZvICppbmZvKQotewotCUhBU0hJVChoYXNoaXQpOwotCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZTsKLQlzdHJ1Y3QgdmlzX3BhY2tldCAqcGFja2V0OwotCXN0cnVjdCBza19idWZmICpza2I7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWY7Ci0JdWludDhfdCBkc3RhZGRyW0VUSF9BTEVOXTsKLQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCXBhY2tldCA9IChzdHJ1Y3QgdmlzX3BhY2tldCAqKWluZm8tPnNrYl9wYWNrZXQtPmRhdGE7Ci0KLQkvKiBzZW5kIHRvIGFsbCByb3V0ZXJzIGluIHJhbmdlLiAqLwotCXdoaWxlIChoYXNoX2l0ZXJhdGUoYmF0X3ByaXYtPm9yaWdfaGFzaCwgJmhhc2hpdCkpIHsKLQkJb3JpZ19ub2RlID0gaGFzaGl0LmJ1Y2tldC0+ZGF0YTsKLQotCQkvKiBpZiBpdCdzIGEgdmlzIHNlcnZlciBhbmQgcmVhY2hhYmxlLCBzZW5kIGl0LiAqLwotCQlpZiAoKCFvcmlnX25vZGUpIHx8ICghb3JpZ19ub2RlLT5yb3V0ZXIpKQotCQkJY29udGludWU7Ci0JCWlmICghKG9yaWdfbm9kZS0+ZmxhZ3MgJiBWSVNfU0VSVkVSKSkKLQkJCWNvbnRpbnVlOwotCQkvKiBkb24ndCBzZW5kIGl0IGlmIHdlIGFscmVhZHkgcmVjZWl2ZWQgdGhlIHBhY2tldCBmcm9tCi0JCSAqIHRoaXMgbm9kZS4gKi8KLQkJaWYgKHJlY3ZfbGlzdF9pc19pbihiYXRfcHJpdiwgJmluZm8tPnJlY3ZfbGlzdCwKLQkJCQkJCQlvcmlnX25vZGUtPm9yaWcpKQotCQkJY29udGludWU7Ci0KLQkJbWVtY3B5KHBhY2tldC0+dGFyZ2V0X29yaWcsIG9yaWdfbm9kZS0+b3JpZywgRVRIX0FMRU4pOwotCQliYXRtYW5faWYgPSBvcmlnX25vZGUtPnJvdXRlci0+aWZfaW5jb21pbmc7Ci0JCW1lbWNweShkc3RhZGRyLCBvcmlnX25vZGUtPnJvdXRlci0+YWRkciwgRVRIX0FMRU4pOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQotCQlza2IgPSBza2JfY2xvbmUoaW5mby0+c2tiX3BhY2tldCwgR0ZQX0FUT01JQyk7Ci0JCWlmIChza2IpCi0JCQlzZW5kX3NrYl9wYWNrZXQoc2tiLCBiYXRtYW5faWYsIGRzdGFkZHIpOwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCB1bmljYXN0X3Zpc19wYWNrZXQoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCSAgICAgICBzdHJ1Y3QgdmlzX2luZm8gKmluZm8pCi17Ci0Jc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0Jc3RydWN0IHZpc19wYWNrZXQgKnBhY2tldDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZjsKLQl1aW50OF90IGRzdGFkZHJbRVRIX0FMRU5dOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCXBhY2tldCA9IChzdHJ1Y3QgdmlzX3BhY2tldCAqKWluZm8tPnNrYl9wYWNrZXQtPmRhdGE7Ci0Jb3JpZ19ub2RlID0gKChzdHJ1Y3Qgb3JpZ19ub2RlICopaGFzaF9maW5kKGJhdF9wcml2LT5vcmlnX2hhc2gsCi0JCQkJCQkgICBwYWNrZXQtPnRhcmdldF9vcmlnKSk7Ci0KLQlpZiAoKCFvcmlnX25vZGUpIHx8ICghb3JpZ19ub2RlLT5yb3V0ZXIpKQotCQlnb3RvIG91dDsKLQotCS8qIGRvbid0IGxvY2sgd2hpbGUgc2VuZGluZyB0aGUgcGFja2V0cyAuLi4gd2UgdGhlcmVmb3JlCi0JICogY29weSB0aGUgcmVxdWlyZWQgZGF0YSBiZWZvcmUgc2VuZGluZyAqLwotCWJhdG1hbl9pZiA9IG9yaWdfbm9kZS0+cm91dGVyLT5pZl9pbmNvbWluZzsKLQltZW1jcHkoZHN0YWRkciwgb3JpZ19ub2RlLT5yb3V0ZXItPmFkZHIsIEVUSF9BTEVOKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQotCXNrYiA9IHNrYl9jbG9uZShpbmZvLT5za2JfcGFja2V0LCBHRlBfQVRPTUlDKTsKLQlpZiAoc2tiKQotCQlzZW5kX3NrYl9wYWNrZXQoc2tiLCBiYXRtYW5faWYsIGRzdGFkZHIpOwotCi0JcmV0dXJuOwotCi1vdXQ6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci19Ci0KLS8qIG9ubHkgc2VuZCBvbmUgdmlzIHBhY2tldC4gY2FsbGVkIGZyb20gc2VuZF92aXNfcGFja2V0cygpICovCi1zdGF0aWMgdm9pZCBzZW5kX3Zpc19wYWNrZXQoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwgc3RydWN0IHZpc19pbmZvICppbmZvKQotewotCXN0cnVjdCB2aXNfcGFja2V0ICpwYWNrZXQ7Ci0KLQlwYWNrZXQgPSAoc3RydWN0IHZpc19wYWNrZXQgKilpbmZvLT5za2JfcGFja2V0LT5kYXRhOwotCWlmIChwYWNrZXQtPnR0bCA8IDIpIHsKLQkJcHJfZGVidWcoIkVycm9yIC0gY2FuJ3Qgc2VuZCB2aXMgcGFja2V0OiB0dGwgZXhjZWVkZWRcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JbWVtY3B5KHBhY2tldC0+c2VuZGVyX29yaWcsIGJhdF9wcml2LT5wcmltYXJ5X2lmLT5uZXRfZGV2LT5kZXZfYWRkciwKLQkgICAgICAgRVRIX0FMRU4pOwotCXBhY2tldC0+dHRsLS07Ci0KLQlpZiAoaXNfYmNhc3QocGFja2V0LT50YXJnZXRfb3JpZykpCi0JCWJyb2FkY2FzdF92aXNfcGFja2V0KGJhdF9wcml2LCBpbmZvKTsKLQllbHNlCi0JCXVuaWNhc3RfdmlzX3BhY2tldChiYXRfcHJpdiwgaW5mbyk7Ci0JcGFja2V0LT50dGwrKzsgLyogcmVzdG9yZSBUVEwgKi8KLX0KLQotLyogY2FsbGVkIGZyb20gdGltZXI7IHNlbmQgKGFuZCBtYXliZSBnZW5lcmF0ZSkgdmlzIHBhY2tldC4gKi8KLXN0YXRpYyB2b2lkIHNlbmRfdmlzX3BhY2tldHMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBkZWxheWVkX3dvcmsgKmRlbGF5ZWRfd29yayA9Ci0JCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZGVsYXllZF93b3JrLCB3b3JrKTsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0KLQkJY29udGFpbmVyX29mKGRlbGF5ZWRfd29yaywgc3RydWN0IGJhdF9wcml2LCB2aXNfd29yayk7Ci0Jc3RydWN0IHZpc19pbmZvICppbmZvLCAqdGVtcDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT52aXNfaGFzaF9sb2NrLCBmbGFncyk7Ci0JcHVyZ2VfdmlzX3BhY2tldHMoYmF0X3ByaXYpOwotCi0JaWYgKGdlbmVyYXRlX3Zpc19wYWNrZXQoYmF0X3ByaXYpID09IDApIHsKLQkJLyogc2NoZWR1bGUgaWYgZ2VuZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCAqLwotCQlzZW5kX2xpc3RfYWRkKGJhdF9wcml2LCBiYXRfcHJpdi0+bXlfdmlzX2luZm8pOwotCX0KLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpbmZvLCB0ZW1wLCAmYmF0X3ByaXYtPnZpc19zZW5kX2xpc3QsCi0JCQkJIHNlbmRfbGlzdCkgewotCi0JCWtyZWZfZ2V0KCZpbmZvLT5yZWZjb3VudCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT52aXNfaGFzaF9sb2NrLCBmbGFncyk7Ci0KLQkJaWYgKGJhdF9wcml2LT5wcmltYXJ5X2lmKQotCQkJc2VuZF92aXNfcGFja2V0KGJhdF9wcml2LCBpbmZvKTsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPnZpc19oYXNoX2xvY2ssIGZsYWdzKTsKLQkJc2VuZF9saXN0X2RlbChpbmZvKTsKLQkJa3JlZl9wdXQoJmluZm8tPnJlZmNvdW50LCBmcmVlX2luZm8pOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+dmlzX2hhc2hfbG9jaywgZmxhZ3MpOwotCXN0YXJ0X3Zpc190aW1lcihiYXRfcHJpdik7Ci19Ci0KLS8qIGluaXQgdGhlIHZpcyBzZXJ2ZXIuIHRoaXMgbWF5IG9ubHkgYmUgY2FsbGVkIHdoZW4gaWZfbGlzdCBpcyBhbHJlYWR5Ci0gKiBpbml0aWFsaXplZCAoZS5nLiBiYXQwIGlzIGluaXRpYWxpemVkLCBpbnRlcmZhY2VzIGhhdmUgYmVlbiBhZGRlZCkgKi8KLWludCB2aXNfaW5pdChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KQotewotCXN0cnVjdCB2aXNfcGFja2V0ICpwYWNrZXQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChiYXRfcHJpdi0+dmlzX2hhc2gpCi0JCXJldHVybiAxOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT52aXNfaGFzaF9sb2NrLCBmbGFncyk7Ci0KLQliYXRfcHJpdi0+dmlzX2hhc2ggPSBoYXNoX25ldygyNTYsIHZpc19pbmZvX2NtcCwgdmlzX2luZm9fY2hvb3NlKTsKLQlpZiAoIWJhdF9wcml2LT52aXNfaGFzaCkgewotCQlwcl9lcnIoIkNhbid0IGluaXRpYWxpemUgdmlzX2hhc2hcbiIpOwotCQlnb3RvIGVycjsKLQl9Ci0KLQliYXRfcHJpdi0+bXlfdmlzX2luZm8gPSBrbWFsbG9jKE1BWF9WSVNfUEFDS0VUX1NJWkUsIEdGUF9BVE9NSUMpOwotCWlmICghYmF0X3ByaXYtPm15X3Zpc19pbmZvKSB7Ci0JCXByX2VycigiQ2FuJ3QgaW5pdGlhbGl6ZSB2aXMgcGFja2V0XG4iKTsKLQkJZ290byBlcnI7Ci0JfQotCi0JYmF0X3ByaXYtPm15X3Zpc19pbmZvLT5za2JfcGFja2V0ID0gZGV2X2FsbG9jX3NrYigKLQkJCQkJCXNpemVvZihzdHJ1Y3QgdmlzX3BhY2tldCkgKwotCQkJCQkJTUFYX1ZJU19QQUNLRVRfU0laRSArCi0JCQkJCQlzaXplb2Yoc3RydWN0IGV0aGhkcikpOwotCWlmICghYmF0X3ByaXYtPm15X3Zpc19pbmZvLT5za2JfcGFja2V0KQotCQlnb3RvIGZyZWVfaW5mbzsKLQotCXNrYl9yZXNlcnZlKGJhdF9wcml2LT5teV92aXNfaW5mby0+c2tiX3BhY2tldCwgc2l6ZW9mKHN0cnVjdCBldGhoZHIpKTsKLQlwYWNrZXQgPSAoc3RydWN0IHZpc19wYWNrZXQgKilza2JfcHV0KAotCQkJCQliYXRfcHJpdi0+bXlfdmlzX2luZm8tPnNrYl9wYWNrZXQsCi0JCQkJCXNpemVvZihzdHJ1Y3QgdmlzX3BhY2tldCkpOwotCi0JLyogcHJlZmlsbCB0aGUgdmlzIGluZm8gKi8KLQliYXRfcHJpdi0+bXlfdmlzX2luZm8tPmZpcnN0X3NlZW4gPSBqaWZmaWVzIC0KLQkJCQkJCW1zZWNzX3RvX2ppZmZpZXMoVklTX0lOVEVSVkFMKTsKLQlJTklUX0xJU1RfSEVBRCgmYmF0X3ByaXYtPm15X3Zpc19pbmZvLT5yZWN2X2xpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZiYXRfcHJpdi0+bXlfdmlzX2luZm8tPnNlbmRfbGlzdCk7Ci0Ja3JlZl9pbml0KCZiYXRfcHJpdi0+bXlfdmlzX2luZm8tPnJlZmNvdW50KTsKLQliYXRfcHJpdi0+bXlfdmlzX2luZm8tPmJhdF9wcml2ID0gYmF0X3ByaXY7Ci0JcGFja2V0LT52ZXJzaW9uID0gQ09NUEFUX1ZFUlNJT047Ci0JcGFja2V0LT5wYWNrZXRfdHlwZSA9IEJBVF9WSVM7Ci0JcGFja2V0LT50dGwgPSBUVEw7Ci0JcGFja2V0LT5zZXFubyA9IDA7Ci0JcGFja2V0LT5lbnRyaWVzID0gMDsKLQotCUlOSVRfTElTVF9IRUFEKCZiYXRfcHJpdi0+dmlzX3NlbmRfbGlzdCk7Ci0KLQlpZiAoaGFzaF9hZGQoYmF0X3ByaXYtPnZpc19oYXNoLCBiYXRfcHJpdi0+bXlfdmlzX2luZm8pIDwgMCkgewotCQlwcl9lcnIoIkNhbid0IGFkZCBvd24gdmlzIHBhY2tldCBpbnRvIGhhc2hcbiIpOwotCQkvKiBub3QgaW4gaGFzaCwgbmVlZCB0byByZW1vdmUgaXQgbWFudWFsbHkuICovCi0JCWtyZWZfcHV0KCZiYXRfcHJpdi0+bXlfdmlzX2luZm8tPnJlZmNvdW50LCBmcmVlX2luZm8pOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+dmlzX2hhc2hfbG9jaywgZmxhZ3MpOwotCXN0YXJ0X3Zpc190aW1lcihiYXRfcHJpdik7Ci0JcmV0dXJuIDE7Ci0KLWZyZWVfaW5mbzoKLQlrZnJlZShiYXRfcHJpdi0+bXlfdmlzX2luZm8pOwotCWJhdF9wcml2LT5teV92aXNfaW5mbyA9IE5VTEw7Ci1lcnI6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPnZpc19oYXNoX2xvY2ssIGZsYWdzKTsKLQl2aXNfcXVpdChiYXRfcHJpdik7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIERlY3JlYXNlIHRoZSByZWZlcmVuY2UgY291bnQgb24gYSBoYXNoIGl0ZW0gaW5mbyAqLwotc3RhdGljIHZvaWQgZnJlZV9pbmZvX3JlZih2b2lkICpkYXRhLCB2b2lkICphcmcpCi17Ci0Jc3RydWN0IHZpc19pbmZvICppbmZvID0gZGF0YTsKLQotCXNlbmRfbGlzdF9kZWwoaW5mbyk7Ci0Ja3JlZl9wdXQoJmluZm8tPnJlZmNvdW50LCBmcmVlX2luZm8pOwotfQotCi0vKiBzaHV0ZG93biB2aXMtc2VydmVyICovCi12b2lkIHZpc19xdWl0KHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpZiAoIWJhdF9wcml2LT52aXNfaGFzaCkKLQkJcmV0dXJuOwotCi0JY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZiYXRfcHJpdi0+dmlzX3dvcmspOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT52aXNfaGFzaF9sb2NrLCBmbGFncyk7Ci0JLyogcHJvcGVybHkgcmVtb3ZlLCBraWxsIHRpbWVycyAuLi4gKi8KLQloYXNoX2RlbGV0ZShiYXRfcHJpdi0+dmlzX2hhc2gsIGZyZWVfaW5mb19yZWYsIE5VTEwpOwotCWJhdF9wcml2LT52aXNfaGFzaCA9IE5VTEw7Ci0JYmF0X3ByaXYtPm15X3Zpc19pbmZvID0gTlVMTDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+dmlzX2hhc2hfbG9jaywgZmxhZ3MpOwotfQotCi0vKiBzY2hlZHVsZSBwYWNrZXRzIGZvciAocmUpdHJhbnNtaXNzaW9uICovCi1zdGF0aWMgdm9pZCBzdGFydF92aXNfdGltZXIoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKLXsKLQlJTklUX0RFTEFZRURfV09SSygmYmF0X3ByaXYtPnZpc193b3JrLCBzZW5kX3Zpc19wYWNrZXRzKTsKLQlxdWV1ZV9kZWxheWVkX3dvcmsoYmF0X2V2ZW50X3dvcmtxdWV1ZSwgJmJhdF9wcml2LT52aXNfd29yaywKLQkJCSAgIG1zZWNzX3RvX2ppZmZpZXMoVklTX0lOVEVSVkFMKSk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi92aXMuaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3Zpcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzNiMzMwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3Zpcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOC0yMDEwIEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6Ci0gKgotICogU2ltb24gV3VuZGVybGljaCwgTWFyZWsgTGluZG5lcgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotICogMDIxMTAtMTMwMSwgVVNBCi0gKgotICovCi0KLSNpZm5kZWYgX05FVF9CQVRNQU5fQURWX1ZJU19IXwotI2RlZmluZSBfTkVUX0JBVE1BTl9BRFZfVklTX0hfCi0KLSNkZWZpbmUgVklTX1RJTUVPVVQJCTIwMAkvKiB0aW1lb3V0IG9mIHZpcyBwYWNrZXRzIGluIHNlY29uZHMgKi8KLQotaW50IHZpc19zZXFfcHJpbnRfdGV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KTsKLXZvaWQgcmVjZWl2ZV9zZXJ2ZXJfc3luY19wYWNrZXQoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCQlzdHJ1Y3QgdmlzX3BhY2tldCAqdmlzX3BhY2tldCwKLQkJCQlpbnQgdmlzX2luZm9fbGVuKTsKLXZvaWQgcmVjZWl2ZV9jbGllbnRfdXBkYXRlX3BhY2tldChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJCSAgc3RydWN0IHZpc19wYWNrZXQgKnZpc19wYWNrZXQsCi0JCQkJICBpbnQgdmlzX2luZm9fbGVuKTsKLWludCB2aXNfaW5pdChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KTsKLXZvaWQgdmlzX3F1aXQoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdik7Ci0KLSNlbmRpZiAvKiBfTkVUX0JBVE1BTl9BRFZfVklTX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0FkYXB0ZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9iY20vQWRhcHRlci5oCmluZGV4IDc0ODQ2MGUuLjMyOTA5ZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vQWRhcHRlci5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vQWRhcHRlci5oCkBAIC03LDUzICs3LDYgQEAKICNkZWZpbmUgTUFYX0ZSQUdNRU5URURJUF9DTEFTU0lGSUNBVElPTl9FTlRSSUVTIDI1NgogI2luY2x1ZGUgIkRlYnVnLmgiCiAKLXR5cGVkZWYgc3RydWN0IF9MSVNUX0VOVFJZewotCXN0cnVjdCBfTElTVF9FTlRSWSAJKm5leHQ7Ci0Jc3RydWN0IF9MSVNUX0VOVFJZIAkqcHJldjsKLX0gTElTVF9FTlRSWSwgKlBMSVNUX0VOVFJZOwotCi10eXBlZGVmIHN0cnVjdCBfQkNNX0xJU1RfRU5UUlkgewotCi0gICAgTElTVF9FTlRSWSAgCQlMaW5rOwotCi19IEJDTV9MSVNUX0VOVFJZLCAqUEJDTV9MSVNUX0VOVFJZOwotCi10eXBlZGVmIGVudW0gX1JDQl9TVEFUVVMKLXsKLQlEUklWRVJfUFJPQ0VTU0VEPTEsCi0JQVBQTElDQVRJT05fUFJPQ0VTU0VECi19IFJDQl9TVEFUVVMsICpQUkNCX1NUQVRVUzsKLQotI2RlZmluZSBmRklMTEVEIDEKLSNkZWZpbmUgZkVNUFRZIDAKLQotc3RydWN0IF9CQ01fQ0IKLXsKLQkvLyBUaGUgbmV0d29yayBwYWNrZXQgdGhhdCB0aGlzIFJDQiBpcyByZWNlaXZpbmcKLQlQVk9JRCAgICAgIAkJCXB2X3BhY2tldDsKLQkvLyBEZXNjcmliZXMgdGhlIGxlbmd0aCBvZiB0aGUgcGFja2V0IC4KLQlVSU5UICAgICAgICAgICAgICAgIHVpX3BhY2tldF9sZW5ndGg7Ci0JLy8gUG9pbnRlciB0byB0aGUgZmlyc3QgYnVmZmVyIGluIHRoZSBwYWNrZXQgKG9ubHkgb25lIGJ1ZmZlciBmb3IgUngpCi0JUFVDSEFSCQkJCWJ1ZmZlcjsKLQlhdG9taWNfdAkgICAgICAgIHN0YXR1czsKLQlVSU5UCSAgICAgICAgICAgIGZpbGxlZDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci10eXBlZGVmIHN0cnVjdCBfQkNNX0NCIEJDTV9DQiwqUEJDTV9DQjsKLQotdHlwZWRlZiBCQ01fQ0IgQkNNX1JDQiwgKlBCQ01fUkNCOwotdHlwZWRlZiBCQ01fQ0IgQkNNX1RDQiwgKlBCQ01fVENCOwotCi0vKiBUaGlzIGlzIHRvIGJlIHN0b3JlZCBpbiB0aGUgInB2T3NEZXBEYXRhIiBvZiBBREFQVEVSICovCi10eXBlZGVmIHN0cnVjdCBMSU5VWF9ERVBfREFUQQotewotCXN0cnVjdCBuZXRfZGV2aWNlCQkqdmlydHVhbGRldjsJLyogT3VyIEludGVyZmFjZSAodmV0aDApICovCi0Jc3RydWN0IG5ldF9kZXZpY2UJCSphY3R1YWxkZXY7CS8qIFRydWUgSW50ZXJmYWNlIChldGgwKSAqLwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIG5ldHN0YXRzOwkvKiBOZXQgc3RhdGlzdGljcyAqLwotCXN0cnVjdCBmYXN5bmNfc3RydWN0CSphc3luY19xdWV1ZTsJLyogRm9yIGFzeW5jaHJvbnVzIG5vdGlmaWNhdGlvbiAqLwotCi19IExJTlVYX0RFUF9EQVRBLCAqUExJTlVYX0RFUF9EQVRBOwotCi0KIHN0cnVjdCBfTEVBREVSCiB7CiAJVVNIT1JUIAlWY2lkOwpAQCAtNDI5LDI2ICszODIsMjggQEAKIHN0cnVjdCBfTUlOSV9BREFQVEVSCiB7CiAJc3RydWN0IF9NSU5JX0FEQVBURVIgKm5leHQ7Ci0JUFZPSUQJCQkgICAgcHZPc0RlcERhdGE7CisJc3RydWN0IG5ldF9kZXZpY2UJKmRldjsKKwl1MzIJCQltc2dfZW5hYmxlOworCiAJQ0hBUiAgICAgICAgICAgICAgICAqY2FEc3hSZXFSZXNwOwotCWF0b21pY190CQkJQXBwbGljYXRpb25SdW5uaW5nOworCWF0b21pY190CQlBcHBsaWNhdGlvblJ1bm5pbmc7CiAJdm9sYXRpbGUgSU5UCQlDdHJsUXVldWVMZW47Ci0JYXRvbWljX3QgICAgICAgICAgICBBcHBDdHJsUXVldWVMZW47Ci0JQk9PTEVBTiAgICAgICAgICAgICBBcHBDdHJsUXVldWVPdmVyRmxvdzsKLQlhdG9taWNfdAkJCUN1cnJlbnRBcHBsaWNhdGlvbkNvdW50OwotCWF0b21pY190IAkJCVJlZ2lzdGVyZWRBcHBsaWNhdGlvbkNvdW50OwotCUJPT0xFQU4JCQkgICAgVGltZXJBY3RpdmU7Ci0JVUxPTkcJCQkJU3RhdGlzdGljc1BvaW50ZXI7CisJYXRvbWljX3QgICAgICAgICAgICAJQXBwQ3RybFF1ZXVlTGVuOworCUJPT0xFQU4gICAgICAgICAgICAgCUFwcEN0cmxRdWV1ZU92ZXJGbG93OworCWF0b21pY190CQlDdXJyZW50QXBwbGljYXRpb25Db3VudDsKKwlhdG9taWNfdCAJCVJlZ2lzdGVyZWRBcHBsaWNhdGlvbkNvdW50OworCUJPT0xFQU4JCSAgCUxpbmtVcFN0YXR1czsKKwlCT09MRUFOCQkgICAgCVRpbWVyQWN0aXZlOworCXUzMgkJCVN0YXRpc3RpY3NQb2ludGVyOwogCXN0cnVjdCBza19idWZmCQkqUnhDb250cm9sSGVhZDsKIAlzdHJ1Y3Qgc2tfYnVmZgkJKlJ4Q29udHJvbFRhaWw7Ci0vLwlzcGlubG9ja190CQkJUnhDb250cm9sUXVldWVsb2NrOworCiAJc3RydWN0IHNlbWFwaG9yZQlSeEFwcENvbnRyb2xRdWV1ZWxvY2s7CiAJc3RydWN0IHNlbWFwaG9yZQlmd19kb3dubG9hZF9zZW1hOwogCiAJUFBFUl9UQVJBTkdfREFUQSAgICBwVGFyYW5nczsKIAlzcGlubG9ja190CQkJY29udHJvbF9xdWV1ZV9sb2NrOwogCXdhaXRfcXVldWVfaGVhZF90CXByb2Nlc3NfcmVhZF93YWl0X3F1ZXVlOwotCVVMT05HCQkgICAgCWJjbV9qaWZmaWVzOwkvKiBTdG9yZSBKaWZmaWVzIHZhbHVlICovCiAKIAkvLyB0aGUgcG9pbnRlciB0byB0aGUgZmlyc3QgcGFja2V0IHdlIGhhdmUgcXVldWVkIGluIHNlbmQKIAkvLyBkZXNlcmlhbGl6ZWQgbWluaXBvcnQgc3VwcG9ydCB2YXJpYWJsZXMKQEAgLTQ1OCwyNCArNDEzLDE1IEBACiAJLy8gdGhpcyB0byBrZWVwIHRyYWNrIG9mIHRoZSBUeCBhbmQgUnggTWFpbEJveCBSZWdpc3RlcnMuCiAJYXRvbWljX3QJCSAgICBDdXJyTnVtRnJlZVR4RGVzYzsKIAkvLyB0byBrZWVwIHRyYWNrIHRoZSBubyBvZiBieXRlIHJlY2lldmVkCi0JYXRvbWljX3QJCQlSeFJvbGxPdmVyQ291bnQ7CiAJVVNIT1JUCQkJCVByZXZOdW1SZWN2RGVzY3M7CiAJVVNIT1JUCQkJCUN1cnJOdW1SZWN2RGVzY3M7Ci0JYXRvbWljX3QJCQlHb29kUnhCeXRlQ291bnQ7Ci0JYXRvbWljX3QJCQlHb29kUnhQa3RDb3VudDsKLQlhdG9taWNfdAkJCUJhZFJ4Qnl0ZUNvdW50OwotCWF0b21pY190CQkJUnhQYWNrZXREcm9wcGVkQ291bnQ7Ci0JYXRvbWljX3QJCQlHb29kVHhCeXRlQ291bnQ7Ci0JYXRvbWljX3QJCQlUeFRvdGFsUGFja2V0Q291bnQ7Ci0JYXRvbWljX3QJCQlUeERyb3BwZWRQYWNrZXRDb3VudDsKLQlVTE9ORwkJCSAgIAlMaW5rVXBTdGF0dXM7Ci0JQk9PTEVBTgkJCSAgICBUcmFuc2Zlck1vZGU7CiAJVUlOVAkJCQl1MzJUb3RhbERTRDsKIAlQYWNrZXRJbmZvCQkgICAgUGFja0luZm9bTk9fT0ZfUVVFVUVTXTsKIAlTX0NMQVNTSUZJRVJfUlVMRQlhc3RDbGFzc2lmaWVyVGFibGVbTUFYX0NMQVNTSUZJRVJTXTsKKwlCT09MRUFOCQkJICAgIFRyYW5zZmVyTW9kZTsKIAogCS8qKioqKioqKioqKioqKiogcW9zICoqKioqKioqKioqKioqKioqKi8KLQlVSU5UCQkJCWJFVEhDU0VuYWJsZWQ7CisJQk9PTEVBTgkJCSAgICBiRVRIQ1NFbmFibGVkOwogCiAJVUxPTkcJCQkgICAgQkVCdWNrZXRTaXplOwogCVVMT05HCQkJICAgIHJ0UFNCdWNrZXRTaXplOwpAQCAtNDgzLDcgKzQyOSw2IEBACiAJQk9PTEVBTgkJCSAgICBBdXRvTGlua1VwOwogCUJPT0xFQU4JCQkgICAgQXV0b1N5bmN1cDsKIAotCXN0cnVjdCBuZXRfZGV2aWNlCSpkZXY7CiAJaW50CQkJCW1ham9yOwogCWludAkJCQltaW5vcjsKIAl3YWl0X3F1ZXVlX2hlYWRfdCAJdHhfcGFja2V0X3dhaXRfcXVldWU7CkBAIC00OTEsOCArNDM2LDYgQEAKIAlhdG9taWNfdAkJCXByb2Nlc3Nfd2FpdGluZzsKIAlCT09MRUFOIAkJCWZ3X2Rvd25sb2FkX2RvbmU7CiAKLQl1bnNpZ25lZCBpbnQJCWN0cmxwa3RfcHJlc2VudDsKLQlCT09MRUFOIAkJCXBhY2tldHNfZ2l2ZW5fdG9fYWxsOwogCWNoYXIgCQkJCSp0eGN0bHBhY2tldFtNQVhfQ05UUkxfUEtUU107CiAJYXRvbWljX3QJCQljbnRybHBrdENudCA7CiAJYXRvbWljX3QJCQlpbmRleF9hcHBfcmVhZF9jbnRybHBrdDsKQEAgLTUwMiwzNCArNDQ1LDMwIEBACiAJc3RydWN0IHNlbWFwaG9yZSAJcmRtd3Jtc3luYzsKIAogCVNUVEFSR0VURFNYQlVGRkVSCWFzdFRhcmdldERzeEJ1ZmZlcltNQVhfVEFSR0VUX0RTWF9CVUZGRVJTXTsKLQlVTE9ORwkJCQl1bEZyZWVUYXJnZXRCdWZmZXJDbnQ7CisJVUxPTkcJCQl1bEZyZWVUYXJnZXRCdWZmZXJDbnQ7CiAJVUxPTkcgICAgICAgICAgICAgIAl1bEN1cnJlbnRUYXJnZXRCdWZmZXI7CiAJVUxPTkcgICAgICAgICAgICAgIAl1bFRvdGFsVGFyZ2V0QnVmZmVyc0F2YWlsYWJsZTsKLQl1bnNpZ25lZCBpbnQJCXRpbWVvdXQ7Ci0JaW50IAkJCQlpcnE7CisKIAl1bnNpZ25lZCBsb25nIAkJY2hpcF9pZDsKLQl1bnNpZ25lZCBpbnQJCWJGbGFzaEJvb3Q7Ci0JdW5zaWduZWQgaW50IAkJaWZfdXA7Ci0vLwlzcGlubG9ja190CQkJc2xlZXBlcl9sb2NrOwotCWF0b21pY190CQkJcmRtX3dybV9hY2Nlc3M7Ci0JYXRvbWljX3QJCQl0eF9yeF9hY2Nlc3M7CisKIAl3YWl0X3F1ZXVlX2hlYWRfdCAJbG93cG93ZXJfbW9kZV93YWl0X3F1ZXVlOwotCWF0b21pY190CQkJYkFib3J0ZWRCeUhvc3Q7Ci0JQk9PTEVBTgkJCQliQmluRG93bmxvYWRlZDsKLQlCT09MRUFOCQkJCWJDZmdEb3dubG9hZGVkOwotCVVTSE9SVAkJCQl1c0Jlc3RFZmZvcnRRdWV1ZUluZGV4OwotCUJPT0xFQU4JCQkJYlN5bmNVcFJlcXVlc3RTZW50OwotLy8Jc3RydWN0IHNlbWFwaG9yZSAJZGF0YV9wYWNrZXRfcXVldWVfbG9jazsKKworCUJPT0xFQU4JCQliRmxhc2hCb290OworCUJPT0xFQU4JCQliQmluRG93bmxvYWRlZDsKKwlCT09MRUFOCQkJYkNmZ0Rvd25sb2FkZWQ7CisJQk9PTEVBTgkJCWJTeW5jVXBSZXF1ZXN0U2VudDsKKwlVU0hPUlQJCQl1c0Jlc3RFZmZvcnRRdWV1ZUluZGV4OworCiAJd2FpdF9xdWV1ZV9oZWFkX3QgCWlvY3RsX2Z3X2RubGRfd2FpdF9xdWV1ZTsKIAlCT09MRUFOCQkJCXdhaXRpbmdfdG9fZndfZG93bmxvYWRfZG9uZTsKIAlwaWRfdAkJCQlmd19kb3dubG9hZF9wcm9jZXNzX3BpZDsKIAlQU1RBUkdFVFBBUkFNUwkJcHN0YXJnZXRwYXJhbXM7CiAJQk9PTEVBTgkJCQlkZXZpY2VfcmVtb3ZlZDsKIAlCT09MRUFOCQkJCURldmljZUFjY2VzczsKLQlJTlQJCQkJCUREUlNldHRpbmc7Ci0JQk9PTEVBTgkJCQliRERSSW5pdERvbmU7Ci0JVUxPTkcJCQkJdWxQb3dlclNhdmVNb2RlOwogCUJPT0xFQU4JCQkJYklzQXV0b0NvcnJlY3RFbmFibGVkOworCUJPT0xFQU4JCQkJYkREUkluaXREb25lOworCUlOVAkJCQlERFJTZXR0aW5nOworCVVMT05HCQkJCXVsUG93ZXJTYXZlTW9kZTsKIAlzcGlubG9ja190CQkJdHh0cmFuc21pdGxvY2s7CiAJQl9VSU5UOAkJCQl0eHRyYW5zbWl0X3J1bm5pbmc7CiAJLyogVGhyZWFkIGZvciBjb250cm9sIHBhY2tldCBoYW5kbGluZyAqLwpAQCAtNTY3LDEzICs1MDYsMTMgQEAKIAl1bnNpZ25lZCBpbnQJdXNJZGxlTW9kZVBhdHRlcm47CiAJLy9CT09MRUFOCQkJYlRyaWVkVG9XYWtlVXBGcm9tU2h1dGRvd247CiAJQk9PTEVBTgkJCWJMaW5rRG93blJlcXVlc3RlZDsKLQl1bnNpZ25lZCBpbnQJY2hlY2tfZm9yX2hhbmc7CisKIAlpbnQgCQkJZG93bmxvYWRERFI7CiAJUEhTX0RFVklDRV9FWFRFTlNJT04gc3RCQ01QaHNDb250ZXh0OwogCVNfSERSX1NVUFJFU1NJT05fQ09OVEVYVElORk8Jc3RQaHNUeENvbnRleHRJbmZvOwogCXVpbnQ4X3QJCQl1Y2FQSFNQa3RSZXN0b3JlQnVmWzIwNDhdOwogCXVpbnQ4X3QJCQliUEhTRW5hYmxlZDsKLQlpbnQgCQkJQXV0b0Zpcm1EbGQ7CisJQk9PTEVBTgkJCUF1dG9GaXJtRGxkOwogCUJPT0xFQU4gICAgICAgICBiTWlwc0NvbmZpZzsKIAlCT09MRUFOICAgICAgICAgYkRQTExDb25maWc7CiAJVUlOVDMyCQkJYVR4UGt0U2l6ZUhpc3RbTUlCU19NQVhfSElTVF9FTlRSSUVTXTsKQEAgLTU5OSwxMCArNTM4LDkgQEAKIAogCiAJc3RydWN0IHNlbWFwaG9yZQlOVk1SZG1Xcm1Mb2NrOwotCUJPT0xFQU4JCQliTmV0d29ya0ludGVyZmFjZVJlZ2lzdGVyZWQ7Ci0JQk9PTEVBTgkJCWJOZXRkZXZpY2VOb3RpZmllclJlZ2lzdGVyZWQ7CisKIAlzdHJ1Y3QgZGV2aWNlICpwc3RDcmVhdGVkQ2xhc3NEZXZpY2U7Ci0JQk9PTEVBTgkJCWJVc2JDbGFzc0RyaXZlclJlZ2lzdGVyZWQ7CisKIC8vCUJPT0xFQU4JCQkJSW50ZXJmYWNlVXBTdGF0dXM7CiAJUEZMQVNIMlhfQ1NfSU5GTyBwc0ZsYXNoMnhDU0luZm87CiAJUEZMQVNIX0NTX0lORk8gcHNGbGFzaENTSW5mbyA7CkBAIC02MzAsMTcgKzU2OCwxMyBAQAogCXN0cnVjdCBzZW1hcGhvcmUJTG93UG93ZXJNb2RlU3luYzsKIAlVTE9ORwlsaURyYWluQ2FsY3VsYXRlZDsKIAlVSU5UIGdwaW9CaXRNYXA7CisKICAgICBTX0JDTV9ERUJVR19TVEFURSBzdERlYnVnU3RhdGU7CiAKIH07CiB0eXBlZGVmIHN0cnVjdCBfTUlOSV9BREFQVEVSIE1JTklfQURBUFRFUiwgKlBNSU5JX0FEQVBURVI7CiAKLQotdHlwZWRlZiBzdHJ1Y3QgX0RFVklDRV9FWFRFTlNJT04KLXsKLQlQTUlOSV9BREFQVEVSIHBBZGFwdDsKLX1ERVZJQ0VfRVhURU5TSU9OLCpQREVWSUNFX0VYVEVOU0lPTjsKLQorI2RlZmluZSBHRVRfQkNNX0FEQVBURVIobmV0X2RldikJbmV0ZGV2X3ByaXYobmV0X2RldikKIAogc3RydWN0IF9FVEhfSEVBREVSX1NUUlVDIHsKICAgICBVQ0hBUiAgICAgICBhdThEZXN0aW5hdGlvbkFkZHJlc3NbNl07CkBAIC02NjcsOCArNjAxLDggQEAKIAogdHlwZWRlZiBzdHJ1Y3QgX0REUl9TRVRUSU5HCiB7Ci0JVUxPTkcgdWxSZWdBZGRyZXNzOwotCVVMT05HIHVsUmVnVmFsdWU7CisJVUlOVCB1bFJlZ0FkZHJlc3M7CisJVUlOVCB1bFJlZ1ZhbHVlOwogfUREUl9TRVRUSU5HLCAqUEREUl9TRVRUSU5HOwogdHlwZWRlZiBERFJfU0VUVElORyBERFJfU0VUX05PREUsICpQRERSX1NFVF9OT0RFOwogSU5UCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0FycC5jIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9BcnAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYwZDg1OS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0FycC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotCi0vKgotICogRmlsZSBOYW1lOiBBcnAuYwotICogQWJzdHJhY3Q6IFRoaXMgZmlsZSBjb250YWlucyB0aGUgcm91dGluZXMgZm9yIGhhbmRsaW5nIEFSUCBQQUNLRVRTCi0gKi8KLSNpbmNsdWRlICJoZWFkZXJzLmgiCi0jZGVmaW5lCUFSUF9QS1RfU0laRQk2MAotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBGdW5jdGlvbiAgICAtIHJlcGx5X3RvX2FycF9yZXF1ZXN0KCkKLSAqCi0gKiBEZXNjcmlwdGlvbiAtIFdoZW4gdGhpcyBob3N0IHRyaWVzIHRvIGJyb2FkY2FzdCBBUlAgcmVxdWVzdCBwYWNrZXQgdGhyb3VnaAotICoJCSAJCSB0aGUgdmlydHVhbCBpbnRlcmZhY2UgKHZldGgwKSwgcmVwbHkgZGlyZWN0bHkgdG8gdXBwZXIgbGF5ZXIuCi0gKgkJIAkJIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGEgbmV3IHNrYiBmb3IgQVJQIHJlcGx5IHBhY2tldCwKLSAqCQkgCQkgZmlsbHMgaW4gdGhlIGZpZWxkcyBvZiB0aGUgcGFja2V0IGFuZCB0aGVuIHNlbmRzIGl0IHRvCi0gKgkJIAkJIHVwcGVyIGxheWVyLgotICoKLSAqIFBhcmFtZXRlcnMgIC0gc2tiOglQb2ludGVyIHRvIHNrX2J1ZmYgc3RydWN0dXJlIG9mIHRoZSBBUlAgcmVxdWVzdCBwa3QuCi0gKgotICogUmV0dXJucyAgICAgLSBOb25lCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotVk9JRAotcmVwbHlfdG9fYXJwX3JlcXVlc3Qoc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlQTUlOSV9BREFQVEVSCQlBZGFwdGVyOwotCXN0cnVjdCBBcnBIZWFkZXIgCSpwQXJwSGRyID0gTlVMTDsKLQlzdHJ1Y3QgZXRoaGRyCQkqcGV0aGhkciA9IE5VTEw7Ci0JVUNIQVIgCQkJCXVpSVBIZHJbNF07Ci0JLyogQ2hlY2sgZm9yIHZhbGlkIHNrYiAqLwotCWlmKHNrYiA9PSBOVUxMKQotCXsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiSW52YWxpZCBza2I6IENhbm5vdCByZXBseSB0byBBUlAgcmVxdWVzdFxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQotCUFkYXB0ZXIgPSBHRVRfQkNNX0FEQVBURVIoc2tiLT5kZXYpOwotCS8qIFByaW50IHRoZSBBUlAgUmVxdWVzdCBQYWNrZXQgKi8KLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgQVJQX1JFU1AsIERCR19MVkxfQUxMLCAiQVJQIFBhY2tldCBEdW1wIDoiKTsKLQlCQ01fREVCVUdfUFJJTlRfQlVGRkVSKEFkYXB0ZXIsREJHX1RZUEVfVFgsIEFSUF9SRVNQLCBEQkdfTFZMX0FMTCwgKFBVQ0hBUikoc2tiLT5kYXRhKSwgc2tiLT5sZW4pOwotCi0JLyoKLQkgKiBFeHRyYWN0IHRoZSBFdGhlcm5ldCBIZWFkZXIgYW5kIEFycCBQYXlsb2FkIGluY2x1ZGluZyBIZWFkZXIKLSAgICAgKi8KLQlwZXRoaGRyID0gKHN0cnVjdCBldGhoZHIgKilza2ItPmRhdGE7Ci0JcEFycEhkciAgPSAoc3RydWN0IEFycEhlYWRlciAqKShza2ItPmRhdGErRVRIX0hMRU4pOwotCi0JaWYoQWRhcHRlci0+YkVUSENTRW5hYmxlZCkKLQl7Ci0JCWlmKG1lbWNtcChwZXRoaGRyLT5oX3NvdXJjZSwgQWRhcHRlci0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pKQotCQl7Ci0JCQliY21fa2ZyZWVfc2tiKHNrYik7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQkvLyBTZXQgdGhlIEV0aGVybmV0IEhlYWRlciBGaXJzdC4KLQltZW1jcHkocGV0aGhkci0+aF9kZXN0LCBwZXRoaGRyLT5oX3NvdXJjZSwgRVRIX0FMRU4pOwotCWlmKCFtZW1jbXAocGV0aGhkci0+aF9zb3VyY2UsIEFkYXB0ZXItPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKSkKLQl7Ci0JCXBldGhoZHItPmhfc291cmNlWzVdKys7Ci0JfQotCi0JLyogU2V0IHRoZSByZXBseSB0byBBUlAgUmVwbHkgKi8KLQlwQXJwSGRyLT5hcnAuYXJfb3AgPSBudG9ocyhBUlBPUF9SRVBMWSk7Ci0KLQkvKiBTZXQgdGhlIEhXIEFkZHJlc3MgcHJvcGVybHkgKi8KLQltZW1jcHkocEFycEhkci0+YXJfc2hhLCBwZXRoaGRyLT5oX3NvdXJjZSwgRVRIX0FMRU4pOwotCW1lbWNweShwQXJwSGRyLT5hcl90aGEsIHBldGhoZHItPmhfZGVzdCwgRVRIX0FMRU4pOwotCi0JLy8gU3dhcHBpbmcgdGhlIElQIEFkZGRyZXNzCi0JbWVtY3B5KHVpSVBIZHIscEFycEhkci0+YXJfc2lwLDQpOwotCW1lbWNweShwQXJwSGRyLT5hcl9zaXAscEFycEhkci0+YXJfdGlwLDQpOwotCW1lbWNweShwQXJwSGRyLT5hcl90aXAsdWlJUEhkciw0KTsKLQotCS8qIFByaW50IHRoZSBBUlAgUmVwbHkgUGFja2V0ICovCi0KLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgQVJQX1JFU1AsIERCR19MVkxfQUxMLCAiQVJQIFJFUExZIFBBQ0tFVDogIik7Ci0KLQkvKiBTZW5kIHRoZSBQYWNrZXQgdG8gdXBwZXIgbGF5ZXIgKi8KLQlCQ01fREVCVUdfUFJJTlRfQlVGRkVSKEFkYXB0ZXIsREJHX1RZUEVfVFgsIEFSUF9SRVNQLCBEQkdfTFZMX0FMTCwgKFBVQ0hBUikoc2tiLT5kYXRhKSwgc2tiLT5sZW4pOwotCi0Jc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYixza2ItPmRldik7Ci0Jc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9IT1NUOwotCi0vLwlza2ItPm1hYy5yYXc9c2tiLT5kYXRhK0xFQURFUl9TSVpFOwotCXNrYl9zZXRfbWFjX2hlYWRlciAoc2tiLCBMRUFERVJfU0laRSk7Ci0JbmV0aWZfcngoc2tiKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgQVJQX1JFU1AsIERCR19MVkxfQUxMLCAiPD09PT09PT09PT09PT1cbiIpOwotCXJldHVybjsKLX0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0JjbWNoYXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vQmNtY2hhci5jCmluZGV4IGZlYWQ5YzUuLjMxNjc0ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vQmNtY2hhci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vQmNtY2hhci5jCkBAIC0xMiw3ICsxMiw3IEBACiAqCiAqIFJldHVybnMJICAtIFplcm8oU3VjY2VzcykKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgc3RydWN0IGNsYXNzICpiY21fY2xhc3MgPSBOVUxMOworCiBzdGF0aWMgaW50IGJjbV9jaGFyX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxwKQogewogCVBNSU5JX0FEQVBURVIgCQlBZGFwdGVyID0gTlVMTDsKQEAgLTkzLDcgKzkzLDcgQEAKICAgICAvKlN0b3AgUXVldWluZyB0aGUgY29udHJvbCByZXNwb25zZSBQYWNrZXRzKi8KICAgICBhdG9taWNfZGVjKCZBZGFwdGVyLT5BcHBsaWNhdGlvblJ1bm5pbmcpOwogCi0gICAgYmNtX2tmcmVlKHBUYXJhbmcpOworICAgIGtmcmVlKHBUYXJhbmcpOwogCiAJLyogcmVtb3ZlIHRoaXMgZmlscCBmcm9tIHRoZSBhc3luY2hyb25vdXNseSBub3RpZmllZCBmaWxwJ3MgKi8KICAgICBmaWxwLT5wcml2YXRlX2RhdGEgPSBOVUxMOwpAQCAtMTAyLDExICsxMDIsMTEgQEAKIAogc3RhdGljIHNzaXplX3QgYmNtX2NoYXJfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IHNpemUsIGxvZmZfdCAqZl9wb3MpCiB7Ci0gICAgUFBFUl9UQVJBTkdfREFUQSBwVGFyYW5nID0gKFBQRVJfVEFSQU5HX0RBVEEpZmlscC0+cHJpdmF0ZV9kYXRhOworCVBQRVJfVEFSQU5HX0RBVEEgcFRhcmFuZyA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAlQTUlOSV9BREFQVEVSCUFkYXB0ZXIgPSBwVGFyYW5nLT5BZGFwdGVyOwotICAgIHN0cnVjdCBza19idWZmKiBQYWNrZXQgPSBOVUxMOwotICAgIFVJTlQgICAgICAgICAgICBQa3RMZW4gPSAwOwotCWludCAJCQl3YWl0X3JldF92YWw9MDsKKwlzdHJ1Y3Qgc2tfYnVmZiogUGFja2V0ID0gTlVMTDsKKwlzc2l6ZV90ICAgICAgICAgUGt0TGVuID0gMDsKKwlpbnQgCQl3YWl0X3JldF92YWw9MDsKIAogCXdhaXRfcmV0X3ZhbCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShBZGFwdGVyLT5wcm9jZXNzX3JlYWRfd2FpdF9xdWV1ZSwKIAkJKHBUYXJhbmctPlJ4QXBwQ29udHJvbEhlYWQgfHwgQWRhcHRlci0+ZGV2aWNlX3JlbW92ZWQpKTsKQEAgLTEzOSwxNCArMTM5LDE2IEBACiAJaWYoUGFja2V0KQogCXsKIAkJUGt0TGVuID0gUGFja2V0LT5sZW47Ci0JCWlmKGNvcHlfdG9fdXNlcihidWYsIFBhY2tldC0+ZGF0YSwgUGt0TGVuKSkKKwkJaWYoY29weV90b191c2VyKGJ1ZiwgUGFja2V0LT5kYXRhLCBtaW5fdChzaXplX3QsIFBrdExlbiwgc2l6ZSkpKQogCQl7Ci0JCQliY21fa2ZyZWVfc2tiKFBhY2tldCk7CisJCQlkZXZfa2ZyZWVfc2tiKFBhY2tldCk7CiAJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJcblJldHVybmluZyBmcm9tIGNvcHkgdG8gdXNlciBmYWlsdXJlIFxuIik7CiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJfQotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIlJlYWQgJWQgQnl0ZXMgRnJvbSBBZGFwdGVyIHBhY2tldCA9IDB4JXAgYnkgcHJvY2VzcyAlZCFcbiIsIFBrdExlbiwgUGFja2V0LCBjdXJyZW50LT5waWQpOwotCQliY21fa2ZyZWVfc2tiKFBhY2tldCk7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLAorCQkJCSJSZWFkICV6ZCBCeXRlcyBGcm9tIEFkYXB0ZXIgcGFja2V0ID0gJXAgYnkgcHJvY2VzcyAlZCFcbiIsCisJCQkJUGt0TGVuLCBQYWNrZXQsIGN1cnJlbnQtPnBpZCk7CisJCWRldl9rZnJlZV9za2IoUGFja2V0KTsKIAl9CiAKICAgICBCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIjw9PT09XG4iKTsKQEAgLTE1NSwxNSArMTU3LDEyIEBACiAKIHN0YXRpYyBsb25nIGJjbV9jaGFyX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCBVSU5UIGNtZCwgVUxPTkcgYXJnKQogewotICAgIFBQRVJfVEFSQU5HX0RBVEEgIHBUYXJhbmcgPSAoUFBFUl9UQVJBTkdfREFUQSlmaWxwLT5wcml2YXRlX2RhdGE7Ci0Jdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmdwOworCVBQRVJfVEFSQU5HX0RBVEEgIHBUYXJhbmcgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJUE1JTklfQURBUFRFUiAJQWRhcHRlciA9IHBUYXJhbmctPkFkYXB0ZXI7CiAJSU5UICAJCQlTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKLQlJT0NUTF9CVUZGRVIgCUlvQnVmZmVyPXt9OwotI2lmbmRlZiBCQ01fU0hNX0lOVEVSRkFDRQotICAgIGludCB0aW1lb3V0ID0gMDsKLSNlbmRpZgotCisJaW50IHRpbWVvdXQgPSAwOworCUlPQ1RMX0JVRkZFUiAJSW9CdWZmZXI7CiAKIAlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIlBhcmFtZXRlcnMgUGFzc2VkIHRvIGNvbnRyb2wgSU9DVEwgY21kPTB4JVggYXJnPTB4JWxYIiwgY21kLCBhcmcpOwogCkBAIC0yMDQsNTAgKzIwMyw0MSBAQAogCiAJU3RhdHVzID0gdmVuZG9yZXh0bklvY3RsKEFkYXB0ZXIsIGNtZCwgYXJnKTsKIAlpZihTdGF0dXMgIT0gQ09OVElOVUVfQ09NTU9OX1BBVEggKQotCXsKIAkJIHJldHVybiBTdGF0dXM7Ci0JfQogCiAJc3dpdGNoKGNtZCl7CiAJCS8vIFJkbXMgZm9yIFN3aW4gSWRsZS4uLgogCQljYXNlIElPQ1RMX0JDTV9SRUdJU1RFUl9SRUFEX1BSSVZBVEU6CiAJCXsKIAkJCVJETV9CVUZGRVIgIHNSZG1CdWZmZXIgPSB7MH07Ci0JCQlQQ0hBUiB0ZW1wX2J1ZmYgPSBOVUxMOwotCQkJVUlOVCBCdWZmbGVuID0gMDsKLQkJCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLwotCQkJaWYoY29weV9mcm9tX3VzZXIoKFBDSEFSKSZJb0J1ZmZlciwgYXJncCwKLQkJCQlzaXplb2YoSU9DVExfQlVGRkVSKSkpCi0JCQl7Ci0JCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KKwkJCVBDSEFSIHRlbXBfYnVmZjsKKwkJCVVJTlQgQnVmZmxlbjsKIAorCQkJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCisJCQlpZihjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYgKElvQnVmZmVyLklucHV0TGVuZ3RoID4gc2l6ZW9mKHNSZG1CdWZmZXIpKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQlpZihjb3B5X2Zyb21fdXNlcigmc1JkbUJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIElvQnVmZmVyLklucHV0TGVuZ3RoKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJLyogRklYTUU6IG5lZWQgdG8gcmVzdHJpY3QgQnVmZkxlbiAqLwogCQkJQnVmZmxlbiA9IElvQnVmZmVyLk91dHB1dExlbmd0aCArICg0IC0gSW9CdWZmZXIuT3V0cHV0TGVuZ3RoJTQpJTQ7Ci0JCQl0ZW1wX2J1ZmYgPSAoUENIQVIpa21hbGxvYyhCdWZmbGVuLCBHRlBfS0VSTkVMKTsKKwkJCXRlbXBfYnVmZiA9IGttYWxsb2MoQnVmZmxlbiwgR0ZQX0tFUk5FTCk7CiAJCQlpZighdGVtcF9idWZmKQotCQkJewotCQkJCXJldHVybiBTVEFUVVNfRkFJTFVSRTsKLQkJCX0KLQkJCWlmKGNvcHlfZnJvbV91c2VyKCZzUmRtQnVmZmVyLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwKLQkJCQlJb0J1ZmZlci5JbnB1dExlbmd0aCkpCi0JCQl7Ci0JCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KKwkJCQlyZXR1cm4gLUVOT01FTTsKKwogCQkJU3RhdHVzID0gcmRtYWx0KEFkYXB0ZXIsIChVSU5UKXNSZG1CdWZmZXIuUmVnaXN0ZXIsCiAJCQkJCShQVUlOVCl0ZW1wX2J1ZmYsIEJ1ZmZsZW4pOwotCQkJaWYoU3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKQorCQkJaWYoU3RhdHVzID09IFNUQVRVU19TVUNDRVNTKQogCQkJewotCQkJCWJjbV9rZnJlZSh0ZW1wX2J1ZmYpOwotCQkJCXJldHVybiBTdGF0dXM7CisJCQkJaWYoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgdGVtcF9idWZmLCBJb0J1ZmZlci5PdXRwdXRMZW5ndGgpKQorCQkJCQlTdGF0dXMgPSAtRUZBVUxUOwogCQkJfQotCQkJaWYoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwKLQkJCQkoUENIQVIpdGVtcF9idWZmLCAoVUlOVClJb0J1ZmZlci5PdXRwdXRMZW5ndGgpKQotCQkJewotCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQl9Ci0JCQliY21fa2ZyZWUodGVtcF9idWZmKTsKKworCQkJa2ZyZWUodGVtcF9idWZmKTsKIAkJCWJyZWFrOwogCQl9CiAJCWNhc2UgSU9DVExfQkNNX1JFR0lTVEVSX1dSSVRFX1BSSVZBVEU6CkBAIC0yNTYsMTkgKzI0NiwxNiBAQAogCQkJVUlOVCB1aVRlbXBWYXI9MDsKIAkJCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLwogCi0JCQlpZihjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsCi0JCQkJc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQotCQkJewotCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJCQlpZihjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYgKElvQnVmZmVyLklucHV0TGVuZ3RoID4gc2l6ZW9mKHNXcm1CdWZmZXIpKQorCQkJCXJldHVybiAtRUlOVkFMOworCiAJCQkvKiBHZXQgV3JtQnVmZmVyIHN0cnVjdHVyZSAqLwotCQkJaWYoY29weV9mcm9tX3VzZXIoJnNXcm1CdWZmZXIsIElvQnVmZmVyLklucHV0QnVmZmVyLAotCQkJCUlvQnVmZmVyLklucHV0TGVuZ3RoKSkKLQkJCXsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQorCQkJaWYoY29weV9mcm9tX3VzZXIoJnNXcm1CdWZmZXIsIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKIAkJCXVpVGVtcFZhciA9IHNXcm1CdWZmZXIuUmVnaXN0ZXIgJiBFRVBST01fUkVKRUNUX01BU0s7CiAJCQlpZighKChBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJDdXN0b21pemUpICYgVlNHX01PREUpICYmCiAJCQkgCSgodWlUZW1wVmFyID09IEVFUFJPTV9SRUpFQ1RfUkVHXzEpfHwKQEAgLTI3Nyw4ICsyNjQsNyBAQAogCQkJCSh1aVRlbXBWYXIgPT0gRUVQUk9NX1JFSkVDVF9SRUdfNCkpKQogCQkJewogCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkVFUFJPTSBBY2Nlc3MgRGVuaWVkLCBub3QgaW4gVlNHIE1vZGVcbiIpOwotCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7CisJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQl9CiAJCQlTdGF0dXMgPSB3cm1hbHQoQWRhcHRlciwgKFVJTlQpc1dybUJ1ZmZlci5SZWdpc3RlciwKIAkJCQkJCShQVUlOVClzV3JtQnVmZmVyLkRhdGEsIHNpemVvZihVTE9ORykpOwpAQCAtMzA1LDU2ICsyOTEsMzkgQEAKIAkJCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PVRSVUUpKQogCQkJewogCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkRldmljZSBpbiBJZGxlIE1vZGUsIEJsb2NraW5nIFJkbXNcbiIpOwotCQkJCVN0YXR1cyA9IC1FQUNDRVM7Ci0JCQkJYnJlYWs7CisJCQkJcmV0dXJuIC1FQUNDRVM7CiAJCQl9CiAJCQkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KLQkJCWlmKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwKLQkJCQlzaXplb2YoSU9DVExfQlVGRkVSKSkpCi0JCQl7Ci0JCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KKwkJCWlmKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQorCQkJCXJldHVybiAtRUZBVUxUOwogCi0JCQl0ZW1wX2J1ZmYgPSAoUENIQVIpa21hbGxvYyhJb0J1ZmZlci5PdXRwdXRMZW5ndGgsIEdGUF9LRVJORUwpOworCQkJaWYgKElvQnVmZmVyLklucHV0TGVuZ3RoID4gc2l6ZW9mKHNSZG1CdWZmZXIpKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQlpZihjb3B5X2Zyb21fdXNlcigmc1JkbUJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIElvQnVmZmVyLklucHV0TGVuZ3RoKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJLyogRklYTUU6IGRvbid0IHRydXN0IHVzZXIgc3VwcGxpZWQgbGVuZ3RoICovCisJCQl0ZW1wX2J1ZmYgPSBrbWFsbG9jKElvQnVmZmVyLk91dHB1dExlbmd0aCwgR0ZQX0tFUk5FTCk7CiAJCQlpZighdGVtcF9idWZmKQotCQkJewogCQkJCXJldHVybiBTVEFUVVNfRkFJTFVSRTsKLQkJCX0KLQkJCWlmKGNvcHlfZnJvbV91c2VyKCZzUmRtQnVmZmVyLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwKLQkJCQlJb0J1ZmZlci5JbnB1dExlbmd0aCkpCi0JCQl7Ci0JCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KIAotCQkJaWYoCi0jaWYgIWRlZmluZWQoQkNNX1NITV9JTlRFUkZBQ0UpCi0JCQkJKCgoVUxPTkcpc1JkbUJ1ZmZlci5SZWdpc3RlciAmIDB4MEYwMDAwMDApICE9IDB4MEYwMDAwMDApIHx8Ci0jZW5kaWYKLQkJCQkJKChVTE9ORylzUmRtQnVmZmVyLlJlZ2lzdGVyICYgMHgzKQotCQkJICApCisJCQlpZigoKChVTE9ORylzUmRtQnVmZmVyLlJlZ2lzdGVyICYgMHgwRjAwMDAwMCkgIT0gMHgwRjAwMDAwMCkgfHwKKwkJCSAgICgoVUxPTkcpc1JkbUJ1ZmZlci5SZWdpc3RlciAmIDB4MykpCiAJCQl7CiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiUkRNIERvbmUgT24gaW52YWxpZCBBZGRyZXNzIDogJXggQWNjZXNzIERlbmllZC5cbiIsCiAJCQkJCShpbnQpc1JkbUJ1ZmZlci5SZWdpc3Rlcik7Ci0JCQkJU3RhdHVzID0gLUVJTlZBTDsKLQkJCQlicmVhazsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIAogCQkJdWlUZW1wVmFyID0gc1JkbUJ1ZmZlci5SZWdpc3RlciAmIEVFUFJPTV9SRUpFQ1RfTUFTSzsKIAkJCVN0YXR1cyA9IHJkbWFsdFdpdGhMb2NrKEFkYXB0ZXIsIChVSU5UKXNSZG1CdWZmZXIuUmVnaXN0ZXIsCiAJCQkJCQkoUFVJTlQpdGVtcF9idWZmLCBJb0J1ZmZlci5PdXRwdXRMZW5ndGgpOwotCQkJaWYoU3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKQotCQkJewotCQkJCWJjbV9rZnJlZSh0ZW1wX2J1ZmYpOwotCQkJCXJldHVybiBTdGF0dXM7Ci0JCQl9Ci0JCQlpZihjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLAotCQkJCShQQ0hBUil0ZW1wX2J1ZmYsIChVSU5UKUlvQnVmZmVyLk91dHB1dExlbmd0aCkpCi0JCQl7Ci0JCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCX0KLQkJCWJjbV9rZnJlZSh0ZW1wX2J1ZmYpOworCQkJaWYoU3RhdHVzID09IFNUQVRVU19TVUNDRVNTKQorCQkJCWlmKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsIHRlbXBfYnVmZiwgSW9CdWZmZXIuT3V0cHV0TGVuZ3RoKSkKKwkJCQkJU3RhdHVzID0gLUVGQVVMVDsKKworCQkJa2ZyZWUodGVtcF9idWZmKTsKIAkJCWJyZWFrOwogCQl9CiAJCWNhc2UgSU9DVExfQkNNX1JFR0lTVEVSX1dSSVRFOgpAQCAtMzY3LDM2ICszMzYsMjggQEAKIAkJCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PVRSVUUpKQogCQkJewogCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkRldmljZSBpbiBJZGxlIE1vZGUsIEJsb2NraW5nIFdybXNcbiIpOwotCQkJCVN0YXR1cyA9IC1FQUNDRVM7Ci0JCQkJYnJlYWs7CisJCQkJcmV0dXJuIC1FQUNDRVM7CiAJCQl9Ci0JCQkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KLQkJCWlmKGNvcHlfZnJvbV91c2VyKChQQ0hBUikmSW9CdWZmZXIsIGFyZ3AsCi0JCQkJCXNpemVvZihJT0NUTF9CVUZGRVIpKSkKLQkJCXsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJLyogR2V0IFdybUJ1ZmZlciBzdHJ1Y3R1cmUgKi8KLQkJCWlmKGNvcHlfZnJvbV91c2VyKCZzV3JtQnVmZmVyLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwKLQkJCQlJb0J1ZmZlci5JbnB1dExlbmd0aCkpCi0JCQl7Ci0JCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmKAotI2lmICFkZWZpbmVkKEJDTV9TSE1fSU5URVJGQUNFKQogCi0JCQkJKCgoVUxPTkcpc1dybUJ1ZmZlci5SZWdpc3RlciAmIDB4MEYwMDAwMDApICE9IDB4MEYwMDAwMDApIHx8Ci0jZW5kaWYKLQkJCQkJKChVTE9ORylzV3JtQnVmZmVyLlJlZ2lzdGVyICYgMHgzKQotCQkJICkKKwkJCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLworCQkJaWYoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IHNpemVvZihzV3JtQnVmZmVyKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJLyogR2V0IFdybUJ1ZmZlciBzdHJ1Y3R1cmUgKi8KKwkJCWlmKGNvcHlfZnJvbV91c2VyKCZzV3JtQnVmZmVyLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlpZiggKCgoVUxPTkcpc1dybUJ1ZmZlci5SZWdpc3RlciAmIDB4MEYwMDAwMDApICE9IDB4MEYwMDAwMDApIHx8CisJCQkJCSgoVUxPTkcpc1dybUJ1ZmZlci5SZWdpc3RlciAmIDB4MykgKQogCQkJewogCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIldSTSBEb25lIE9uIGludmFsaWQgQWRkcmVzcyA6ICV4IEFjY2VzcyBEZW5pZWQuXG4iLAogCQkJCQkJKGludClzV3JtQnVmZmVyLlJlZ2lzdGVyKTsKLQkJCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJCWJyZWFrOworCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQorCiAJCQl1aVRlbXBWYXIgPSBzV3JtQnVmZmVyLlJlZ2lzdGVyICYgRUVQUk9NX1JFSkVDVF9NQVNLOwogCQkJaWYoISgoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMyQ3VzdG9taXplKSAmIFZTR19NT0RFKSAmJgogCQkJCSgodWlUZW1wVmFyID09IEVFUFJPTV9SRUpFQ1RfUkVHXzEpfHwKQEAgLTQwNiw4ICszNjcsNyBAQAogCQkJCShjbWQgPT0gSU9DVExfQkNNX1JFR0lTVEVSX1dSSVRFKSkKIAkJCXsKIAkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJFRVBST00gQWNjZXNzIERlbmllZCwgbm90IGluIFZTRyBNb2RlXG4iKTsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOworCQkJCXJldHVybiAtRUZBVUxUOwogCQkJfQogCiAJCQlTdGF0dXMgPSB3cm1hbHRXaXRoTG9jayhBZGFwdGVyLCAoVUlOVClzV3JtQnVmZmVyLlJlZ2lzdGVyLApAQCAtNDM2LDE5ICszOTYsMTQgQEAKIAkJCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PVRSVUUpKQogCQkJewogCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCJHUElPIENhbid0IGJlIHNldC9jbGVhciBpbiBMb3cgcG93ZXIgTW9kZSIpOwotCQkJCVN0YXR1cyA9IC1FQUNDRVM7Ci0JCQkJYnJlYWs7CisJCQkJcmV0dXJuIC1FQUNDRVM7CiAJCQl9CiAJCQlpZihjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKLQkJCXsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkgICAgfQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYgKElvQnVmZmVyLklucHV0TGVuZ3RoID4gc2l6ZW9mKGdwaW9faW5mbykpCisJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQlpZihjb3B5X2Zyb21fdXNlcigmZ3Bpb19pbmZvLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQotCQkJewotCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQl1aUJpdCAgPSBncGlvX2luZm8udWlHcGlvTnVtYmVyOwogCQkJdWlPcGVyYXRpb24gPSBncGlvX2luZm8udWlHcGlvVmFsdWU7CiAKQEAgLTUxNyw4ICs0NzIsNyBAQAogCQlicmVhazsKIAkJY2FzZSBCQ01fTEVEX1RIUkVBRF9TVEFURV9DSEFOR0VfUkVROgogCQl7Ci0KLQkJCVVTRVJfVEhSRUFEX1JFUSB0aHJlYWRSZXEgPSB7MH07CisJCQlVU0VSX1RIUkVBRF9SRVEgdGhyZWFkUmVxID0geyAwIH07CiAJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwiVXNlciBtYWRlIExFRCB0aHJlYWQgSW5BY3RpdmUiKTsKIAogCQkJaWYoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8CkBAIC01MjksMjEgKzQ4MywxNiBAQAogCQkJCVN0YXR1cyA9IC1FQUNDRVM7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCQlTdGF0dXMgPWNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpOwotCQkJaWYoU3RhdHVzKQotCQkJewotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiRmFpbGVkIHdoaWxlIGNvcHlpbmcgdGhlIElPQnVmZXIgZnJvbSB1c2VyIHNwYWNlIGVycjolZCIsU3RhdHVzKTsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQogCi0JCQlTdGF0dXM9IGNvcHlfZnJvbV91c2VyKCZ0aHJlYWRSZXEsIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCk7Ci0JCQlpZihTdGF0dXMpCi0JCQl7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJGYWlsZWQgd2hpbGUgY29weWluZyB0aGUgSW5wdXRCdWZmZXIgZnJvbSB1c2VyIHNwYWNlIGVycjolZCIsU3RhdHVzKTsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQorCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPiBzaXplb2YodGhyZWFkUmVxKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ0aHJlYWRSZXEsIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKIAkJCS8vaWYgTEVEIHRocmVhZCBpcyBydW5uaW5nKEFjdGl2ZWx5IG9yIEluYWN0aXZlbHkpIHNldCBpdCBzdGF0ZSB0byBtYWtlIGluYWN0aXZlCiAJCQlpZihBZGFwdGVyLT5MRURJbmZvLmxlZF90aHJlYWRfcnVubmluZykKIAkJCXsKQEAgLTU3MiwxOSArNTIxLDEzIEBACiAJCQlpZigoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKIAkJCQkoQWRhcHRlci0+YlNodXRTdGF0dXMgPT1UUlVFKSB8fAogCQkJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09VFJVRSkpCi0JCQl7Ci0JCQkJU3RhdHVzID0gLUVBQ0NFUzsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmKGNvcHlfZnJvbV91c2VyKChQQ0hBUikmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgCVN0YXR1cyA9IC1FRkFVTFQ7Ci0gICAgICAgICAgICAgICAgICAgIAkJYnJlYWs7Ci0gICAgICAgICAgICAgICAgCX0KLSAgICAgICAgICAgICAgICBpZihjb3B5X2Zyb21fdXNlcigmZ3Bpb19pbmZvLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQorCQkJCXJldHVybiAtRUFDQ0VTOworCQkJaWYoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPiBzaXplb2YoZ3Bpb19pbmZvKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmKGNvcHlfZnJvbV91c2VyKCZncGlvX2luZm8sIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CiAgICAgICAgICAgICAgICAgdWlCaXQgID0gZ3Bpb19pbmZvLnVpR3Bpb051bWJlcjsKIAkJCQkgIC8vU2V0IHRoZSBncGlvIG91dHB1dCByZWdpc3RlcgogCQkJCVN0YXR1cyA9IHJkbWFsdFdpdGhMb2NrKEFkYXB0ZXIsIChVSU5UKUdQSU9fUElOX1NUQVRFX1JFR0lTVEVSLApAQCAtNjA4LDI1ICs1NTEsMTQgQEAKIAkJCQlpZigoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKIAkJCQkoQWRhcHRlci0+YlNodXRTdGF0dXMgPT1UUlVFKSB8fAogCQkJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09VFJVRSkpCi0JCQkJewotCQkJCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoIChQQ0hBUikmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZiggSU9DVExfQlVGRkVSKSk7Ci0JCQkJaWYoU3RhdHVzKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJGYWlsZWQgd2hpbGUgY29weWluZyB0aGUgSU9CdWZlciBmcm9tIHVzZXIgc3BhY2UgZXJyOiVkIixTdGF0dXMpOwotCQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCQlicmVhazsKLQkJCQl9CisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJaWYgKElvQnVmZmVyLklucHV0TGVuZ3RoID4gc2l6ZW9mKGdwaW9fbXVsdGlfaW5mbykpCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCWlmIChjb3B5X2Zyb21fdXNlcigmZ3Bpb19tdWx0aV9pbmZvLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKIAotCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCAmZ3Bpb19tdWx0aV9pbmZvLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRMZW5ndGgpOwotCQkJCWlmKFN0YXR1cykKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiRmFpbGVkIHdoaWxlIGNvcHlpbmcgdGhlIElPQnVmZXIgQ29udGVudHMgZnJvbSB1c2VyIHNwYWNlIGVycjolZCIsU3RhdHVzKTsKLQkJCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQogCQkJCWlmKElzUmVxR3Bpb0lzTGVkSW5OVk0oQWRhcHRlcixwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPTWFzayk9PSBGQUxTRSkKIAkJCQl7CiAJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiU29ycnksIFJlcXVlc3RlZCBHUElPPDB4JVg+IGlzIG5vdCBjb3JyZXNwb25kIHRvIE5WTSBMRUQgYml0IG1hcDwweCVYPiEhISIscGdwaW9fbXVsdGlfaW5mb1tXSU1BWF9JRFhdLnVpR1BJT01hc2ssQWRhcHRlci0+Z3Bpb0JpdE1hcCk7CkBAIC02ODYsNyArNjE4LDYgQEAKIAkJCQlpZihTdGF0dXMpCiAJCQkJewogCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkZhaWxlZCB3aGlsZSBjb3B5aW5nIENvbnRlbnQgdG8gSU9CdWZlciBmb3IgdXNlciBzcGFjZSBlcnI6JWQiLFN0YXR1cyk7Ci0JCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCX0KQEAgLTcwMCwyNSArNjMxLDE0IEBACiAJCQlpZigoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKIAkJCQkoQWRhcHRlci0+YlNodXRTdGF0dXMgPT1UUlVFKSB8fAogCQkJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09VFJVRSkpCi0JCQl7Ci0JCQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoIElPQ1RMX0JVRkZFUikpOwotCQkJaWYoU3RhdHVzKQotCQkJewotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiRmFpbGVkIHdoaWxlIGNvcHlpbmcgdGhlIElPQnVmZXIgZnJvbSB1c2VyIHNwYWNlIGVycjolZCIsU3RhdHVzKTsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoICZncGlvX211bHRpX21vZGUsIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCk7Ci0JCQlpZihTdGF0dXMpCi0JCQl7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJGYWlsZWQgd2hpbGUgY29weWluZyB0aGUgSU9CdWZlciBDb250ZW50cyBmcm9tIHVzZXIgc3BhY2UgZXJyOiVkIixTdGF0dXMpOwotCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPiBzaXplb2YoZ3Bpb19tdWx0aV9tb2RlKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmZ3Bpb19tdWx0aV9tb2RlLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQorCQkJCXJldHVybiAtRUZBVUxUOwogCiAJCQlTdGF0dXMgPSByZG1hbHRXaXRoTG9jayggQWRhcHRlciwgKCBVSU5UKSBHUElPX01PREVfUkVHSVNURVIsICggUFVJTlQpIHVjUmVzZXRWYWx1ZSwgc2l6ZW9mKCBVSU5UKSk7CiAJCQlpZiggU1RBVFVTX1NVQ0NFU1MgIT0gU3RhdHVzKQpAQCAtNzY5LDcgKzY4OSw2IEBACiAJCQlpZihTdGF0dXMpCiAJCQl7CiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJGYWlsZWQgd2hpbGUgY29weWluZyBDb250ZW50IHRvIElPQnVmZXIgZm9yIHVzZXIgc3BhY2UgZXJyOiVkIixTdGF0dXMpOwotCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KQEAgLTc4MywyNCArNzAyLDIwIEBACiAJCWNhc2UgSU9DVExfSURMRV9SRVE6CiAJCXsKIAkJCVBWT0lEIHB2QnVmZmVyPU5VTEw7Ci0JCQkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KLQkJCWlmKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwKLQkJCQkJCQlzaXplb2YoSU9DVExfQlVGRkVSKSkpCi0JCQl7Ci0JCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXB2QnVmZmVyPWttYWxsb2MoSW9CdWZmZXIuSW5wdXRMZW5ndGgsIEdGUF9LRVJORUwpOwotCQkJaWYoIXB2QnVmZmVyKQotCQkJewotCQkJCXJldHVybiAtRU5PTUVNOwotCQkJfQogCi0JCQlpZihjb3B5X2Zyb21fdXNlcihwdkJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsCi0JCQkJCUlvQnVmZmVyLklucHV0TGVuZ3RoKSkKKwkJCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLworCQkJaWYoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCS8qIEZJWE1FOiBkb24ndCBhY2NlcHQgYW55IGxlbmd0aCBmcm9tIHVzZXIgKi8KKwkJCXB2QnVmZmVyID0ga21hbGxvYyhJb0J1ZmZlci5JbnB1dExlbmd0aCwgR0ZQX0tFUk5FTCk7CisJCQlpZighcHZCdWZmZXIpCisJCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJCWlmKGNvcHlfZnJvbV91c2VyKHB2QnVmZmVyLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQogCQkJewogCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJYmNtX2tmcmVlKHB2QnVmZmVyKTsKKwkJCQlrZnJlZShwdkJ1ZmZlcik7CiAJCQkJYnJlYWs7CiAJCQl9CiAKQEAgLTgyMCwxMCArNzM1LDkgQEAKIAkJCVN0YXR1cyA9IENvcHlCdWZmZXJUb0NvbnRyb2xQYWNrZXQoQWRhcHRlciwgKFBWT0lEKXB2QnVmZmVyKTsKIAkJY250cmxFbmQ6CiAJCQl1cCgmQWRhcHRlci0+TG93UG93ZXJNb2RlU3luYyk7Ci0JCQliY21fa2ZyZWUocHZCdWZmZXIpOworCQkJa2ZyZWUocHZCdWZmZXIpOwogCQkJYnJlYWs7CiAJCX0KLSNpZm5kZWYgQkNNX1NITV9JTlRFUkZBQ0UKIAkJY2FzZSBJT0NUTF9CQ01fQlVGRkVSX0RPV05MT0FEX1NUQVJUOgogCQl7CiAJCQlJTlQgTlZNQWNjZXNzID0gZG93bl90cnlsb2NrKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKSA7CkBAIC04NDQsNyArNzU4LDcgQEAKIAkJCQlTdGF0dXMgPSByZXNldF9jYXJkX3Byb2MoQWRhcHRlcik7CiAJCQkJaWYoU3RhdHVzKQogCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAicmVzZXRfY2FyZF9wcm9jIEZhaWxlZCFcbiIpOworCQkJCQlwcl9lcnIoUEZYICIlczogcmVzZXRfY2FyZF9wcm9jIEZhaWxlZCFcbiIsIEFkYXB0ZXItPmRldi0+bmFtZSk7CiAJCQkJCXVwKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKTsKIAkJCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwogCQkJCQlicmVhazsKQEAgLTg2Miw3ICs3NzYsNyBAQAogCQl9CiAJCWNhc2UgSU9DVExfQkNNX0JVRkZFUl9ET1dOTE9BRDoKIAkJCXsKLQkJCQlGSVJNV0FSRV9JTkZPIAkqcHNGd0luZm89TlVMTDsKKwkJCQlGSVJNV0FSRV9JTkZPIAkqcHNGd0luZm8gPSBOVUxMOwogCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIlN0YXJ0aW5nIHRoZSBmaXJtd2FyZSBkb3dubG9hZCBQSUQgPTB4JXghISEhXG4iLCBjdXJyZW50LT5waWQpOwogCQkJZG97CiAJCQkJaWYoIWRvd25fdHJ5bG9jaygmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSkpCkBAIC04NzEsMjkgKzc4NSwyMyBAQAogCQkJCQlTdGF0dXM9LUVJTlZBTDsKIAkJCQkJYnJlYWs7CiAJCQkJfQorCiAJCQkJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCiAJCQkJaWYoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJjb3B5X2Zyb21fdXNlciAxIGZhaWxlZFxuIik7Ci0JCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisKIAkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJMZW5ndGggZm9yIEZXIERMRCBpcyA6ICVseFxuIiwKIAkJCQkJCQkJCQlJb0J1ZmZlci5JbnB1dExlbmd0aCk7Ci0JCQkJcHNGd0luZm89a21hbGxvYyhzaXplb2YoKnBzRndJbmZvKSwgR0ZQX0tFUk5FTCk7CisKKwkJCQlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPiBzaXplb2YoRklSTVdBUkVfSU5GTykpCisJCQkJCXJldHVybiAtRUlOVkFMOworCisJCQkJcHNGd0luZm8gPSBrbWFsbG9jKHNpemVvZigqcHNGd0luZm8pLCBHRlBfS0VSTkVMKTsKIAkJCQlpZighcHNGd0luZm8pCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJGYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVyISEhIVxuIik7Ci0JCQkJCVN0YXR1cyA9IC1FTk9NRU07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZihjb3B5X2Zyb21fdXNlcihwc0Z3SW5mbywgSW9CdWZmZXIuSW5wdXRCdWZmZXIsCi0JCQkJCQkJSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29weV9mcm9tX3VzZXIgMiBmYWlsZWRcbiIpOwotCQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCQlicmVhazsKLQkJCQl9CisJCQkJCXJldHVybiAtRU5PTUVNOworCisJCQkJaWYoY29weV9mcm9tX3VzZXIocHNGd0luZm8sIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCkpCisJCQkJCXJldHVybiAtRUZBVUxUOwogCiAJCQkJaWYoIXBzRndJbmZvLT5wdk1hcHBlZEZpcm13YXJlQWRkcmVzcyB8fAogCQkJCQkJKHBzRndJbmZvLT51MzJGaXJtd2FyZUxlbmd0aCA9PSAwKSkKQEAgLTkyOSw3ICs4MzcsNyBAQAogCQkJICBpZihTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpCiAJCQkJCXVwKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKTsKIAkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIklPQ1RMOiBGaXJtd2FyZSBGaWxlIFVwbG9hZGVkXG4iKTsKLQkJCQliY21fa2ZyZWUocHNGd0luZm8pOworCQkJCWtmcmVlKHBzRndJbmZvKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJY2FzZSBJT0NUTF9CQ01fQlVGRkVSX0RPV05MT0FEX1NUT1A6CkBAIC05NDYsNyArODU0LDcgQEAKIAkJCQlBZGFwdGVyLT5iQmluRG93bmxvYWRlZD1UUlVFOwogCQkJCUFkYXB0ZXItPmJDZmdEb3dubG9hZGVkPVRSVUU7CiAJCQkJYXRvbWljX3NldCgmQWRhcHRlci0+Q3Vyck51bUZyZWVUeERlc2MsIDApOwotCQkJCWF0b21pY19zZXQoJkFkYXB0ZXItPlJ4Um9sbE92ZXJDb3VudCwgMCk7CisKIAkJCQlBZGFwdGVyLT5DdXJyTnVtUmVjdkRlc2NzPTA7CiAJCQkJQWRhcHRlci0+ZG93bmxvYWRERFIgPSAwOwogCkBAIC05OTksNyArOTA3LDYgQEAKIAkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKIAkJCWJyZWFrOwogCQl9Ci0jZW5kaWYKIAkJY2FzZSBJT0NUTF9CRV9CVUNLRVRfU0laRToKIAkJCVN0YXR1cyA9IDA7CiAJCQlpZiAoZ2V0X3VzZXIoQWRhcHRlci0+QkVCdWNrZXRTaXplLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhcmcpKQpAQCAtMTA1MCwyMiArOTU3LDE2IEBACiAJCQlicmVhazsKIAogCQljYXNlIElPQ1RMX0dFVF9QQUNLX0lORk86Ci0JCQlpZihjb3B5X3RvX3VzZXIoYXJncCwgJkFkYXB0ZXItPlBhY2tJbmZvLAotCQkJCXNpemVvZihQYWNrZXRJbmZvKSpOT19PRl9RVUVVRVMpKQotCQkJewotCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJCQlpZihjb3B5X3RvX3VzZXIoYXJncCwgJkFkYXB0ZXItPlBhY2tJbmZvLCBzaXplb2YoUGFja2V0SW5mbykqTk9fT0ZfUVVFVUVTKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwogCQkJYnJlYWs7CiAJCWNhc2UgSU9DVExfQkNNX1NXSVRDSF9UUkFOU0ZFUl9NT0RFOgogCQl7CiAJCQlVSU5UIHVpRGF0YSA9IDA7CiAJCQlpZihjb3B5X2Zyb21fdXNlcigmdWlEYXRhLCBhcmdwLCBzaXplb2YoVUlOVCkpKQotCQkJewotCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKIAkJCWlmKHVpRGF0YSkJLyogQWxsb3cgQWxsIFBhY2tldHMgKi8KIAkJCXsKIAkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIklPQ1RMX0JDTV9TV0lUQ0hfVFJBTlNGRVJfTU9ERTogRVRIX1BBQ0tFVF9UVU5ORUxJTkdfTU9ERVxuIik7CkBAIC0xMDg0LDIyICs5ODUsMTYgQEAKIAkJewogCQkJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCiAJCQlpZihjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKLQkJCXsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwKLQkJCQlWRVJfRklMRVZFUlNJT05fU1RSLCAoVUlOVClJb0J1ZmZlci5PdXRwdXRMZW5ndGgpKQotCQkJewotCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsIFZFUl9GSUxFVkVSU0lPTl9TVFIsIElvQnVmZmVyLk91dHB1dExlbmd0aCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKIAkJCWJyZWFrOwogCQl9CiAJCWNhc2UgSU9DVExfQkNNX0dFVF9DVVJSRU5UX1NUQVRVUzoKIAkJewotCQkJTElOS19TVEFURSBwbGlua19zdGF0ZTsKKwkJCUxJTktfU1RBVEUgbGlua19zdGF0ZTsKIAogCQkJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCiAJCQlpZihjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKQEAgLTExMDgsMTkgKzEwMDMsMTkgQEAKIAkJCQlTdGF0dXMgPSAtRUZBVUxUOwogCQkJCWJyZWFrOwogCQkJfQotCQkJaWYgKElvQnVmZmVyLk91dHB1dExlbmd0aCAhPSBzaXplb2YocGxpbmtfc3RhdGUpKSB7CisJCQlpZiAoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoICE9IHNpemVvZihsaW5rX3N0YXRlKSkgewogCQkJCVN0YXR1cyA9IC1FSU5WQUw7CiAJCQkJYnJlYWs7CiAJCQl9CiAKLQkJCWlmIChjb3B5X2Zyb21fdXNlcigmcGxpbmtfc3RhdGUsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKHBsaW5rX3N0YXRlKSkpIHsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJcGxpbmtfc3RhdGUuYklkbGVNb2RlID0gKFVDSEFSKUFkYXB0ZXItPklkbGVNb2RlOwotCQkJcGxpbmtfc3RhdGUuYlNodXRkb3duTW9kZSA9IEFkYXB0ZXItPmJTaHV0U3RhdHVzOwotCQkJcGxpbmtfc3RhdGUudWNMaW5rU3RhdHVzID0gKFVDSEFSKUFkYXB0ZXItPkxpbmtTdGF0dXM7Ci0JCQlpZiAoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgJnBsaW5rX3N0YXRlLCBJb0J1ZmZlci5PdXRwdXRMZW5ndGgpKSB7CisJCQltZW1zZXQoJmxpbmtfc3RhdGUsIDAsIHNpemVvZihsaW5rX3N0YXRlKSk7CisJCQlsaW5rX3N0YXRlLmJJZGxlTW9kZSA9IEFkYXB0ZXItPklkbGVNb2RlOworCQkJbGlua19zdGF0ZS5iU2h1dGRvd25Nb2RlID0gQWRhcHRlci0+YlNodXRTdGF0dXM7CisJCQlsaW5rX3N0YXRlLnVjTGlua1N0YXR1cyA9IEFkYXB0ZXItPkxpbmtTdGF0dXM7CisKKwkJCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCAmbGlua19zdGF0ZSwKKwkJCQkJIG1pbl90KHNpemVfdCwgc2l6ZW9mKGxpbmtfc3RhdGUpLCBJb0J1ZmZlci5PdXRwdXRMZW5ndGgpKSkKKwkJCXsKIAkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJDb3B5X3RvX3VzZXIgRmFpbGVkLi5cbiIpOwogCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CiAJCQkJYnJlYWs7CkBAIC0xMTMxLDE3ICsxMDI2LDE0IEBACiAgICAgICAgIGNhc2UgSU9DVExfQkNNX1NFVF9NQUNfVFJBQ0lORzoKICAgICAgICAgewogICAgICAgICAgICAgVUlOVCAgdHJhY2luZ19mbGFnOworCiAgICAgICAgICAgICAvKiBjb3B5IGlvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KLQkJCWlmKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQotCQkJewotCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZihjb3B5X2Zyb21fdXNlcigmdHJhY2luZ19mbGFnLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlcixzaXplb2YoVUlOVCkpKQotICAgICAgICAgICAgewotCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJICAgIGlmKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQorCQkgICAgcmV0dXJuIC1FRkFVTFQ7CisKKwkgICAgaWYoY29weV9mcm9tX3VzZXIoJnRyYWNpbmdfZmxhZyxJb0J1ZmZlci5JbnB1dEJ1ZmZlcixzaXplb2YoVUlOVCkpKQorCQkgICAgcmV0dXJuIC1FRkFVTFQ7CisKICAgICAgICAgICAgIGlmICh0cmFjaW5nX2ZsYWcpCiAgICAgICAgICAgICAgICAgQWRhcHRlci0+cFRhcmFuZ3MtPk1hY1RyYWNpbmdFbmFibGVkID0gVFJVRTsKICAgICAgICAgICAgIGVsc2UKQEAgLTExNTEsNzIgKzEwNDMsNTMgQEAKIAkJY2FzZSBJT0NUTF9CQ01fR0VUX0RTWF9JTkRJQ0FUSU9OOgogCQl7CiAJCQlVTE9ORyB1bFNGSWQ9MDsKLQkJCWlmKGNvcHlfZnJvbV91c2VyKChQQ0hBUikmSW9CdWZmZXIsIGFyZ3AsCi0JCQkJCXNpemVvZihJT0NUTF9CVUZGRVIpKSkKLQkJCXsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJJbnZhbGlkIElPIGJ1ZmZlciEhISIgKTsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQorCQkJaWYoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKIAkJCWlmKElvQnVmZmVyLk91dHB1dExlbmd0aCA8IHNpemVvZihzdExvY2FsU0ZBZGRJbmRpY2F0aW9uQWx0KSkKIAkJCXsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJNaXNtYXRjaCByZXE6ICVseCBuZWVkZWQgaXMgPTB4JXp4ISEhIiwKLQkJCQkJSW9CdWZmZXIuT3V0cHV0TGVuZ3RoLCBzaXplb2Yoc3RMb2NhbFNGQWRkSW5kaWNhdGlvbkFsdCkpOworCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCQkJCSJNaXNtYXRjaCByZXE6ICVseCBuZWVkZWQgaXMgPTB4JXp4ISEhIiwKKwkJCQkJCUlvQnVmZmVyLk91dHB1dExlbmd0aCwgc2l6ZW9mKHN0TG9jYWxTRkFkZEluZGljYXRpb25BbHQpKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KLQkJCWlmKGNvcHlfZnJvbV91c2VyKCZ1bFNGSWQsIElvQnVmZmVyLklucHV0QnVmZmVyLAotCQkJCQlzaXplb2YodWxTRklkKSkpCi0JCQl7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJJbnZhbGlkIFNGSUQhISEgJWx1IiwgdWxTRklkICk7Ci0JCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KKworCQkJaWYoY29weV9mcm9tX3VzZXIoJnVsU0ZJZCwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIHNpemVvZih1bFNGSWQpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwogCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJHZXQgRFNYIERhdGEgU0YgSUQgaXMgPSVseFxuIiwgdWxTRklkICk7Ci0JCQlnZXRfZHN4X3NmX2RhdGFfdG9fYXBwbGljYXRpb24oQWRhcHRlciwgdWxTRklkLAotCQkJCUlvQnVmZmVyLk91dHB1dEJ1ZmZlcik7CisJCQlnZXRfZHN4X3NmX2RhdGFfdG9fYXBwbGljYXRpb24oQWRhcHRlciwgdWxTRklkLCBJb0J1ZmZlci5PdXRwdXRCdWZmZXIpOwogCQkJU3RhdHVzPVNUQVRVU19TVUNDRVNTOwogCQl9CiAJCWJyZWFrOwogCQljYXNlIElPQ1RMX0JDTV9HRVRfSE9TVF9NSUJTOgogCQl7Ci0JCQlQQ0hBUiB0ZW1wX2J1ZmY7CisJCQlQVk9JRCB0ZW1wX2J1ZmY7CiAKIAkJCWlmKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQotCQkJewotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNvcHlfZnJvbSB1c2VyIGZvciBJb0J1ZmYgZmFpbGVkXG4iKTsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQorCQkJCXJldHVybiAtRUZBVUxUOwogCiAJCQlpZihJb0J1ZmZlci5PdXRwdXRMZW5ndGggIT0gc2l6ZW9mKFNfTUlCU19IT1NUX1NUQVRTX01JQlMpKQogCQkJewotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkxlbmd0aCBDaGVjayBmYWlsZWQgJWx1ICV6ZFxuIiwgSW9CdWZmZXIuT3V0cHV0TGVuZ3RoLAotCQkJCQkJCQkJCQlzaXplb2YoU19NSUJTX0hPU1RfU1RBVFNfTUlCUykpOwotCSAgICAgICAgICAJcmV0dXJuIC1FSU5WQUw7CisJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJCQkJIkxlbmd0aCBDaGVjayBmYWlsZWQgJWx1ICV6ZFxuIiwKKwkJCQkJCUlvQnVmZmVyLk91dHB1dExlbmd0aCwgc2l6ZW9mKFNfTUlCU19IT1NUX1NUQVRTX01JQlMpKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIAotCQkJdGVtcF9idWZmID0gKFBDSEFSKWttYWxsb2MoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoLCBHRlBfS0VSTkVMKTsKLQorCQkJLyogRklYTUU6IEhPU1RfU1RBVFMgYXJlIHRvbyBiaWcgZm9yIGttYWxsb2MgKDEyMjA0OCkhICovCisJCQl0ZW1wX2J1ZmYgPSBremFsbG9jKHNpemVvZihTX01JQlNfSE9TVF9TVEFUU19NSUJTKSwgR0ZQX0tFUk5FTCk7CiAJCQlpZighdGVtcF9idWZmKQotCQkJewogCQkJCXJldHVybiBTVEFUVVNfRkFJTFVSRTsKLQkJCX0KIAotCQkJU3RhdHVzID0gUHJvY2Vzc0dldEhvc3RNaWJzKEFkYXB0ZXIsCi0JCQkJCShQVUNIQVIpdGVtcF9idWZmLCBJb0J1ZmZlci5PdXRwdXRMZW5ndGgpOworCQkJU3RhdHVzID0gUHJvY2Vzc0dldEhvc3RNaWJzKEFkYXB0ZXIsIHRlbXBfYnVmZik7CisJCQlHZXREcm9wcGVkQXBwQ250cmxQa3RNaWJzKHRlbXBfYnVmZiwgcFRhcmFuZyk7CiAKLQkgICAgICAgIFN0YXR1cyA9IEdldERyb3BwZWRBcHBDbnRybFBrdE1pYnMoKFBWT0lEKXRlbXBfYnVmZiwKLQkJCQkJCQkJCShQUEVSX1RBUkFOR19EQVRBKWZpbHAtPnByaXZhdGVfZGF0YSk7CisJCQlpZiAoU3RhdHVzICE9IFNUQVRVU19GQUlMVVJFKQorCQkJCWlmKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsIHRlbXBfYnVmZiwgc2l6ZW9mKFNfTUlCU19IT1NUX1NUQVRTX01JQlMpKSkKKwkJCQkJU3RhdHVzID0gLUVGQVVMVDsKIAotCQkJaWYoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwoUENIQVIpdGVtcF9idWZmLAotCQkJCXNpemVvZihTX01JQlNfSE9TVF9TVEFUU19NSUJTKSkpCi0JCQl7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29weSB0byB1c2VyIGZhaWxlZFxuIik7Ci0JCQkJYmNtX2tmcmVlKHRlbXBfYnVmZik7Ci0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQl9Ci0KLQkJCWJjbV9rZnJlZSh0ZW1wX2J1ZmYpOworCQkJa2ZyZWUodGVtcF9idWZmKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTEyMjYsMTAgKzEwOTksNiBAQAogCQkJCUFkYXB0ZXItPnVzSWRsZU1vZGVQYXR0ZXJuID0gQUJPUlRfSURMRV9NT0RFOwogCQkJCUFkYXB0ZXItPmJXYWtlVXBEZXZpY2UgPSBUUlVFOwogCQkJCXdha2VfdXAoJkFkYXB0ZXItPnByb2Nlc3NfcnhfY250cmxwa3QpOwotCQkJCSNpZiAwCi0JCQkJQWRhcHRlci0+YlRyaWVkVG9XYWtlVXBGcm9tbG93UG93ZXJNb2RlID0gVFJVRTsKLQkJCQlJbnRlcmZhY2VBYm9ydElkbGVtb2RlIChBZGFwdGVyLCBBZGFwdGVyLT51c0lkbGVNb2RlUGF0dGVybik7Ci0JCQkJI2VuZGlmCiAJCQl9CiAJCQlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKIAkJCWJyZWFrOwpAQCAtMTI0OCwyNCArMTExNywyMCBAQAogCQkJCQlTdGF0dXMgPSAtRUFDQ0VTOwogCQkJCQlicmVhazsKIAkJCQl9Ci0JCQkJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCi0JCQkJaWYoY29weV9mcm9tX3VzZXIoKFBDSEFSKSZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQotCQkJCXsKLQkJCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQogCi0JCQkJcHZCdWZmZXI9a21hbGxvYyhJb0J1ZmZlci5JbnB1dExlbmd0aCwgR0ZQX0tFUk5FTCk7CisJCQkJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCisJCQkJaWYoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCisJCQkJLyogRklYTUU6IHJlc3RyaWN0IGxlbmd0aCAqLworCQkJCXB2QnVmZmVyID0ga21hbGxvYyhJb0J1ZmZlci5JbnB1dExlbmd0aCwgR0ZQX0tFUk5FTCk7CiAJCQkJaWYoIXB2QnVmZmVyKQotCQkJCXsKIAkJCQkJcmV0dXJuIC1FTk9NRU07Ci0JCQkJCWJyZWFrOwotCQkJCX0KIAogCQkJCS8qIEdldCBXcm1CdWZmZXIgc3RydWN0dXJlICovCi0gICAgICAgICAgICAgICAgaWYoY29weV9mcm9tX3VzZXIocHZCdWZmZXIsIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCkpCisJCQkJaWYoY29weV9mcm9tX3VzZXIocHZCdWZmZXIsIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCkpCiAJCQkJewotCQkJCQliY21fa2ZyZWUocHZCdWZmZXIpOworCQkJCQlrZnJlZShwdkJ1ZmZlcik7CiAJCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CiAJCQkJCWJyZWFrOwogCQkJCX0KQEAgLTEyNzUsNyArMTE0MCw3IEBACiAJCQkJaWYoKChVTE9ORylwQnVsa0J1ZmZlci0+UmVnaXN0ZXIgJiAweDBGMDAwMDAwKSAhPSAweDBGMDAwMDAwIHx8CiAJCQkJCSgoVUxPTkcpcEJ1bGtCdWZmZXItPlJlZ2lzdGVyICYgMHgzKSkKIAkJCQl7Ci0JCQkJCWJjbV9rZnJlZShwdkJ1ZmZlcik7CisJCQkJCWtmcmVlKHB2QnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICAgQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsIldSTSBEb25lIE9uIGludmFsaWQgQWRkcmVzcyA6ICV4IEFjY2VzcyBEZW5pZWQuXG4iLChpbnQpcEJ1bGtCdWZmZXItPlJlZ2lzdGVyKTsKIAkJCQkJU3RhdHVzID0gLUVJTlZBTDsKIAkJCQkJYnJlYWs7CkBAIC0xMjkwLDcgKzExNTUsNyBAQAogCQkJCQkodWlUZW1wVmFyID09IEVFUFJPTV9SRUpFQ1RfUkVHXzQpKSAmJgogCQkJCQkoY21kID09IElPQ1RMX0JDTV9SRUdJU1RFUl9XUklURSkpCiAJCQkJewotCQkJCQliY21fa2ZyZWUocHZCdWZmZXIpOworCQkJCQlrZnJlZShwdkJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgICAgIEJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJFRVBST00gQWNjZXNzIERlbmllZCwgbm90IGluIFZTRyBNb2RlXG4iKTsKIAkJCQkJU3RhdHVzID0gLUVGQVVMVDsKIAkJCQkJYnJlYWs7CkBAIC0xMzA2LDMwICsxMTcxLDE5IEBACiAJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIldSTSBGYWlsZWRcbiIpOwogCQkJCX0KIAotCQkJCWJjbV9rZnJlZShwdkJ1ZmZlcik7CisJCQkJa2ZyZWUocHZCdWZmZXIpOwogCQkJCWJyZWFrOwogCQkJfQogCiAJCWNhc2UgSU9DVExfQkNNX0dFVF9OVk1fU0laRToKLQkJCXsKLQogCQkJaWYoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCi0JCQl7Ci0JCQkJLy9JT0xvZygiZmFpbGVkIE5WTSBmaXJzdCIpOwotCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZihBZGFwdGVyLT5lTlZNVHlwZSA9PSBOVk1fRUVQUk9NIHx8IEFkYXB0ZXItPmVOVk1UeXBlID09IE5WTV9GTEFTSCApIHsKLQkJCQlpZihjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLAotCQkJCQkodW5zaWduZWQgY2hhciAqKSZBZGFwdGVyLT51aU5WTURTRFNpemUsIChVSU5UKXNpemVvZihVSU5UKSkpCi0JCQkJewotCQkJCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQkJCXJldHVybiBTdGF0dXM7Ci0JCQkJfQotCQkJfQorCQkJCXJldHVybiAtRUZBVUxUOwogCi0JCQlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUyA7CisJCQlpZihBZGFwdGVyLT5lTlZNVHlwZSA9PSBOVk1fRUVQUk9NIHx8IEFkYXB0ZXItPmVOVk1UeXBlID09IE5WTV9GTEFTSCApIHsKKwkJCQlpZihjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCAmQWRhcHRlci0+dWlOVk1EU0RTaXplLCBzaXplb2YoVUlOVCkpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCX0KKwkJCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTIDsKIAkJCWJyZWFrOwogCiAJCWNhc2UgSU9DVExfQkNNX0NBTF9JTklUIDoKQEAgLTEzMzgsNDAgKzExOTIsMjYgQEAKIAkJCQlVSU5UIHVpU2VjdG9yU2l6ZSA9IDAgOwogCQkJCWlmKEFkYXB0ZXItPmVOVk1UeXBlID09IE5WTV9GTEFTSCkKIAkJCQl7Ci0JCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpOwotCQkJCQlpZihTdGF0dXMpCi0JCQkJCXsKLQkJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiQ29weSBGcm9tIFVzZXIgc3BhY2UgZmFpbGVkLiBzdGF0dXMgOiVkIiwgU3RhdHVzKTsKKwkJCQkJaWYoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCiAJCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQkJfQotCQkJCQlpZiAoZ2V0X3VzZXIodWlTZWN0b3JTaXplLCAodW5zaWduZWQgaW50IF9fdXNlciAqKUlvQnVmZmVyLklucHV0QnVmZmVyKSkKKworCQkJCQlpZiAoY29weV9mcm9tX3VzZXIoJnVpU2VjdG9yU2l6ZSwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIHNpemVvZihVSU5UKSkpCiAJCQkJCQlyZXR1cm4gLUVGQVVMVDsKIAogCQkJCQlpZigodWlTZWN0b3JTaXplIDwgTUlOX1NFQ1RPUl9TSVpFKSB8fCAodWlTZWN0b3JTaXplID4gTUFYX1NFQ1RPUl9TSVpFKSkKIAkJCQkJewotCi0JCQkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLAotCQkJCQkJCQkJKHVuc2lnbmVkIGNoYXIgKikmQWRhcHRlci0+dWlTZWN0b3JTaXplICwKLQkJCQkJCQkJCShVSU5UKXNpemVvZihVSU5UKSk7Ci0JCQkJCQlpZihTdGF0dXMpCi0JCQkJCQl7Ci0JCQkJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiQ29waW5nIHRoZSBzZWN0b3Igc2l6ZSB0byB1c2Ugc3BhY2UgZmFpbGVkLiBzdGF0dXM6JWQiLFN0YXR1cyk7Ci0JCQkJCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCQkJfQorCQkJCQkJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsICZBZGFwdGVyLT51aVNlY3RvclNpemUsCisJCQkJCQkJCSBzaXplb2YoVUlOVCkpKQorCQkJCQkJCXJldHVybiAtRUZBVUxUOwogCQkJCQl9CiAJCQkJCWVsc2UKIAkJCQkJewogCQkJCQkJaWYoSXNGbGFzaDJ4KEFkYXB0ZXIpKQogCQkJCQkJewotCQkJCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsCi0JCQkJCQkJCQkodW5zaWduZWQgY2hhciAqKSZBZGFwdGVyLT51aVNlY3RvclNpemUgLAotCQkJCQkJCQkJKFVJTlQpc2l6ZW9mKFVJTlQpKTsKLQkJCQkJCQlpZihTdGF0dXMpCi0JCQkJCQkJewotCQkJCQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJDb3BpbmcgdGhlIHNlY3RvciBzaXplIHRvIHVzZSBzcGFjZSBmYWlsZWQuIHN0YXR1czolZCIsU3RhdHVzKTsKLQkJCQkJCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCQkJCX0KLQorCQkJCQkJCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLAorCQkJCQkJCQkJICZBZGFwdGVyLT51aVNlY3RvclNpemUgLAorCQkJCQkJCQkJIHNpemVvZihVSU5UKSkpCisJCQkJCQkJICAgIHJldHVybiAtRUZBVUxUOwogCQkJCQkJfQogCQkJCQkJZWxzZQogCQkJCQkJewpAQCAtMTM5NSwyNSArMTIzNSwxOSBAQAogCQkJfQogCQkJYnJlYWs7CiAgICAgICAgIGNhc2UgSU9DVExfQkNNX1NFVF9ERUJVRyA6CisjaWZkZWYgREVCVUcKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBVU0VSX0JDTV9EQkdfU1RBVEUgc1VzZXJEZWJ1Z1N0YXRlOwogCiAvLwkJCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIkVudGVyZWQgdGhlIGlvY3RsICV4IFxuIiwgSU9DVExfQkNNX1NFVF9ERUJVRyApOwogCiAJCQkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIkluIFNFVF9ERUJVRyBpb2N0bFxuIik7Ci0JCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoKFBDSEFSKSZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpOwotCQkJCWlmKFN0YXR1cykKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29weSBmcm9tIHVzZXIgZmFpbGVkXG4iKTsKLQkJCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZzVXNlckRlYnVnU3RhdGUsSW9CdWZmZXIuSW5wdXRCdWZmZXIsIHNpemVvZihVU0VSX0JDTV9EQkdfU1RBVEUpKTsKLQkJCQlpZihTdGF0dXMpCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgICJDb3B5IG9mIElvQnVmZmVyLklucHV0QnVmZmVyIGZhaWxlZCIpOworCQkJCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKIAkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfQorCisJCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZzVXNlckRlYnVnU3RhdGUsIElvQnVmZmVyLklucHV0QnVmZmVyLCBzaXplb2YoVVNFUl9CQ01fREJHX1NUQVRFKSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCiAKIAkJCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIklPQ1RMX0JDTV9TRVRfREVCVUc6IE9uT2ZmPSVkIFR5cGUgPSAweCV4ICIsCiAJCQkJc1VzZXJEZWJ1Z1N0YXRlLk9uT2ZmLCBzVXNlckRlYnVnU3RhdGUuVHlwZSk7CkBAIC0xNDM2LDE1ICsxMjcwLDE0IEBACiAgICAgICAgICAgICAgICAgQkNNX1NIT1dfREVCVUdfQklUTUFQKEFkYXB0ZXIpOwogCiAJCQl9CisjZW5kaWYKIAkJCWJyZWFrOwogCQljYXNlIElPQ1RMX0JDTV9OVk1fUkVBRDoKIAkJY2FzZSBJT0NUTF9CQ01fTlZNX1dSSVRFOgogCQkJewotCi0JCQkJTlZNX1JFQURXUklURSAgc3ROVk1SZWFkV3JpdGUgPSB7fTsKKwkJCQlOVk1fUkVBRFdSSVRFICBzdE5WTVJlYWRXcml0ZTsKIAkJCQlQVUNIQVIgcFJlYWREYXRhID0gTlVMTDsKLQkJCQl2b2lkIF9fdXNlciAqIHBCdWZmZXJ0b2JlQ29waWVkID0gTlVMTDsKLQkJCQlVTE9ORyB1bERTRE1hZ2ljTnVtSW5Vc3JCdWZmID0gMCA7CisJCQkJVUxPTkcgdWxEU0RNYWdpY051bUluVXNyQnVmZiA9IDA7CiAJCQkJc3RydWN0IHRpbWV2YWwgdHYwLCB0djE7CiAJCQkJbWVtc2V0KCZ0djAsMCxzaXplb2Yoc3RydWN0IHRpbWV2YWwpKTsKIAkJCQltZW1zZXQoJnR2MSwwLHNpemVvZihzdHJ1Y3QgdGltZXZhbCkpOwpAQCAtMTQ2OSwyMSArMTMwMiwxMiBAQAogCQkJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCiAKIAkJCQlpZihjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iKTsKLQkJCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmKElPQ1RMX0JDTV9OVk1fUkVBRCA9PSBjbWQpCi0JCQkJCXBCdWZmZXJ0b2JlQ29waWVkID0gSW9CdWZmZXIuT3V0cHV0QnVmZmVyOwotCQkJCWVsc2UKLQkJCQkJcEJ1ZmZlcnRvYmVDb3BpZWQgPSBJb0J1ZmZlci5JbnB1dEJ1ZmZlcjsKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CiAKLQkJCQlpZihjb3B5X2Zyb21fdXNlcigmc3ROVk1SZWFkV3JpdGUsIHBCdWZmZXJ0b2JlQ29waWVkLHNpemVvZihOVk1fUkVBRFdSSVRFKSkpCi0JCQkJewotCQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCQlicmVhazsKLQkJCQl9CisJCQkJaWYoY29weV9mcm9tX3VzZXIoJnN0TlZNUmVhZFdyaXRlLAorCQkJCQkJICAoSU9DVExfQkNNX05WTV9SRUFEID09IGNtZCkgPyBJb0J1ZmZlci5PdXRwdXRCdWZmZXIgOiBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwKKwkJCQkJCSAgc2l6ZW9mKE5WTV9SRUFEV1JJVEUpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkJCQkvLwogCQkJCS8vIERlbnkgdGhlIGFjY2VzcyBpZiB0aGUgb2Zmc2V0IGNyb3NzZXMgdGhlIGNhbCBhcmVhIGxpbWl0LgpAQCAtMTQ5NiwxOCArMTMyMCwxNSBAQAogCQkJCQlicmVhazsKIAkJCQl9CiAKLQkJCQlwUmVhZERhdGEgPShQQ0hBUilrbWFsbG9jKHN0TlZNUmVhZFdyaXRlLnVpTnVtQnl0ZXMsIEdGUF9LRVJORUwpOwotCisJCQkJcFJlYWREYXRhID0ga3phbGxvYyhzdE5WTVJlYWRXcml0ZS51aU51bUJ5dGVzLCBHRlBfS0VSTkVMKTsKIAkJCQlpZighcFJlYWREYXRhKQogCQkJCQlyZXR1cm4gLUVOT01FTTsKIAotCQkJCW1lbXNldChwUmVhZERhdGEsMCxzdE5WTVJlYWRXcml0ZS51aU51bUJ5dGVzKTsKLQogCQkJCWlmKGNvcHlfZnJvbV91c2VyKHBSZWFkRGF0YSwgc3ROVk1SZWFkV3JpdGUucEJ1ZmZlciwKIAkJCQkJCQlzdE5WTVJlYWRXcml0ZS51aU51bUJ5dGVzKSkKIAkJCQl7CiAJCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJCWJjbV9rZnJlZShwUmVhZERhdGEpOworCQkJCQlrZnJlZShwUmVhZERhdGEpOwogCQkJCQlicmVhazsKIAkJCQl9CiAKQEAgLTE1MjIsNyArMTM0Myw3IEBACiAJCQkJCXsKIAkJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCJEZXZpY2UgaXMgaW4gSWRsZS9TaHV0ZG93biBNb2RlXG4iKTsKIAkJCQkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQkJCQkJCWJjbV9rZnJlZShwUmVhZERhdGEpOworCQkJCQkJa2ZyZWUocFJlYWREYXRhKTsKIAkJCQkJCXJldHVybiAtRUFDQ0VTOwogCQkJCQl9CiAKQEAgLTE1MzMsMTMgKzEzNTQsMTIgQEAKIAogCQkJCQlpZihTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpCiAJCQkJCQl7Ci0JCQkJCQkJYmNtX2tmcmVlKHBSZWFkRGF0YSk7CisJCQkJCQkJa2ZyZWUocFJlYWREYXRhKTsKIAkJCQkJCQlyZXR1cm4gU3RhdHVzOwogCQkJCQkJfQotCQkJCQlpZihjb3B5X3RvX3VzZXIoc3ROVk1SZWFkV3JpdGUucEJ1ZmZlciwKLQkJCQkJCQlwUmVhZERhdGEsIChVSU5UKXN0TlZNUmVhZFdyaXRlLnVpTnVtQnl0ZXMpKQorCQkJCQlpZihjb3B5X3RvX3VzZXIoc3ROVk1SZWFkV3JpdGUucEJ1ZmZlcixwUmVhZERhdGEsIHN0TlZNUmVhZFdyaXRlLnVpTnVtQnl0ZXMpKQogCQkJCQkJewotCQkJCQkJCWJjbV9rZnJlZShwUmVhZERhdGEpOworCQkJCQkJCWtmcmVlKHBSZWFkRGF0YSk7CiAJCQkJCQkJU3RhdHVzID0gLUVGQVVMVDsKIAkJCQkJCX0KIAkJCQl9CkBAIC0xNTU0LDcgKzEzNzQsNyBAQAogCQkJCQl7CiAJCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwiRGV2aWNlIGlzIGluIElkbGUvU2h1dGRvd24gTW9kZVxuIik7CiAJCQkJCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCQkJCQliY21fa2ZyZWUocFJlYWREYXRhKTsKKwkJCQkJCWtmcmVlKHBSZWFkRGF0YSk7CiAJCQkJCQlyZXR1cm4gLUVBQ0NFUzsKIAkJCQkJfQogCkBAIC0xNTgyLDcgKzE0MDIsNyBAQAogCQkJCQkJCXsKIAkJCQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIkRTRCBTaWcgaXMgcHJlc2VudCBuZWl0aGVyIGluIEZsYXNoIG5vciBVc2VyIHByb3ZpZGVkIElucHV0Li4iKTsKIAkJCQkJCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCQkJCQkJCQliY21fa2ZyZWUocFJlYWREYXRhKTsKKwkJCQkJCQkJa2ZyZWUocFJlYWREYXRhKTsKIAkJCQkJCQkJcmV0dXJuIFN0YXR1czsKIAkJCQkJCQl9CiAKQEAgLTE1OTEsNyArMTQxMSw3IEBACiAJCQkJCQkJewogCQkJCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwiRFNEIFNpZyBpcyBwcmVzZW50IG5laXRoZXIgaW4gRmxhc2ggbm9yIFVzZXIgcHJvdmlkZWQgSW5wdXQuLiIpOwogCQkJCQkJCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCQkJCQkJCWJjbV9rZnJlZShwUmVhZERhdGEpOworCQkJCQkJCQlrZnJlZShwUmVhZERhdGEpOwogCQkJCQkJCQlyZXR1cm4gU3RhdHVzOwogCQkJCQkJCX0KIAkJCQkJCX0KQEAgLTE2MDgsNyArMTQyOCw3IEBACiAKIAkJCQkJaWYoU3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKQogCQkJCQl7Ci0JCQkJCQliY21fa2ZyZWUocFJlYWREYXRhKTsKKwkJCQkJCWtmcmVlKHBSZWFkRGF0YSk7CiAJCQkJCQlyZXR1cm4gU3RhdHVzOwogCQkJCQl9CiAJCQkJfQpAQCAtMTYxNiw3ICsxNDM2LDcgQEAKIAkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIiB0aW1ldGFrZW4gYnkgV3JpdGUvcmVhZCA6JWxkIG1zZWNcbiIsKHR2MS50dl9zZWMgLSB0djAudHZfc2VjKSoxMDAwICsodHYxLnR2X3VzZWMgLSB0djAudHZfdXNlYykvMTAwMCk7CiAKIAotCQkJCWJjbV9rZnJlZShwUmVhZERhdGEpOworCQkJCWtmcmVlKHBSZWFkRGF0YSk7CiAJCQkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CiAJCQl9CiAJCQlicmVhazsKQEAgLTE2MjksNyArMTQ0OSw3IEBACiAJCQkJVUlOVCBCdWZmU2l6ZSA9IDA7CiAJCQkJVUlOVCBSZWFkQnl0ZXMgPSAwOwogCQkJCVVJTlQgUmVhZE9mZnNldCA9IDA7Ci0JCQkJY2hhciBfX3VzZXIgKk91dFB1dEJ1ZmYgPSBOVUxMOworCQkJCXZvaWQgX191c2VyICpPdXRQdXRCdWZmOwogCiAJCQkJaWYoSXNGbGFzaDJ4KEFkYXB0ZXIpICE9IFRSVUUpCiAJCQkJewpAQCAtMTYzOCwyMCArMTQ1OCwxMiBAQAogCQkJCX0KIAogCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiSU9DVExfQkNNX0ZMQVNIMlhfU0VDVElPTl9SRUFEIENhbGxlZCIpOwotCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpOwotCQkJCWlmKFN0YXR1cykKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNvcHkgb2YgSU9DVEwgQlVGRkVSIGZhaWxlZCIpOworCQkJCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKIAkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfQogCiAJCQkJLy9SZWFkaW5nIEZMQVNIIDIueCBSRUFEIHN0cnVjdHVyZQotCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZzRmxhc2gyeFJlYWQsIElvQnVmZmVyLklucHV0QnVmZmVyLHNpemVvZihGTEFTSDJYX1JFQURXUklURSkpOwotCQkJCWlmKFN0YXR1cykKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNvcHkgb2YgSW5wdXQgQnVmZmVyIGZhaWxlZCIpOworCQkJCWlmIChjb3B5X2Zyb21fdXNlcigmc0ZsYXNoMnhSZWFkLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlcixzaXplb2YoRkxBU0gyWF9SRUFEV1JJVEUpKSkKIAkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfQogCiAKIAkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwiXG5zRmxhc2gyeFJlYWQuU2VjdGlvbiA6JXgiICxzRmxhc2gyeFJlYWQuU2VjdGlvbik7CkBAIC0xNjg3LDcgKzE0OTksNyBAQAogCQkJCXsKIAkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIkRldmljZSBpcyBpbiBJZGxlL1NodXRkb3duIE1vZGVcbiIpOwogCQkJCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCQkJCWJjbV9rZnJlZShwUmVhZEJ1ZmYpOworCQkJCQlrZnJlZShwUmVhZEJ1ZmYpOwogCQkJCQlyZXR1cm4gLUVBQ0NFUzsKIAkJCQl9CiAKQEAgLTE3MTUsNyArMTUyNyw2IEBACiAJCQkJIAlpZihTdGF0dXMpCiAJCQkJIAl7CiAJCQkJIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIkNvcHkgdG8gdXNlIGZhaWxlZCB3aXRoIHN0YXR1cyA6JWQiLCBTdGF0dXMpOwotCQkJCQkJU3RhdHVzID0gLUVGQVVMVDsKIAkJCQkJCWJyZWFrOwogCQkJCSAJfQogCQkJCQlOT0IgPSBOT0IgLSBSZWFkQnl0ZXM7CkBAIC0xNzI3LDE1ICsxNTM4LDE1IEBACiAKIAkJCQl9CiAJCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCQkJCWJjbV9rZnJlZShwUmVhZEJ1ZmYpOworCQkJCWtmcmVlKHBSZWFkQnVmZik7CiAKIAkJCSB9CiAJCQkgYnJlYWsgOwogCQljYXNlIElPQ1RMX0JDTV9GTEFTSDJYX1NFQ1RJT05fV1JJVEUgOgogCQkJIHsKIAkJCSAJRkxBU0gyWF9SRUFEV1JJVEUgc0ZsYXNoMnhXcml0ZSA9IHswfTsKLQkJCQlQVUNIQVIgcFdyaXRlQnVmZiA9IE5VTEw7Ci0JCQkJdm9pZCBfX3VzZXIgKklucHV0QWRkciA9IE5VTEw7CisJCQkJUFVDSEFSIHBXcml0ZUJ1ZmY7CisJCQkJdm9pZCBfX3VzZXIgKklucHV0QWRkcjsKIAkJCQlVSU5UIE5PQiA9IDA7CiAJCQkJVUlOVCBCdWZmU2l6ZSA9IDA7CiAJCQkJVUlOVCBXcml0ZU9mZnNldCA9IDA7CkBAIC0xNzUyLDMzICsxNTYzLDE3IEBACiAKIAogCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiIElPQ1RMX0JDTV9GTEFTSDJYX1NFQ1RJT05fV1JJVEUgQ2FsbGVkIik7Ci0JCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSk7Ci0JCQkJaWYoU3RhdHVzKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29weSBvZiBJT0NUTCBCVUZGRVIgZmFpbGVkIik7CisJCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQogCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQl9CiAKIAkJCQkvL1JlYWRpbmcgRkxBU0ggMi54IFJFQUQgc3RydWN0dXJlCi0JCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJnNGbGFzaDJ4V3JpdGUsIElvQnVmZmVyLklucHV0QnVmZmVyLCBzaXplb2YoRkxBU0gyWF9SRUFEV1JJVEUpKTsKLQkJCQlpZihTdGF0dXMpCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJSZWFkaW5nIG9mIG91dHB1dCBCdWZmZXIgZnJvbSBJT0NUTCBidWZmZXIgZmFpbHMiKTsKKwkJCQlpZiAoY29weV9mcm9tX3VzZXIoJnNGbGFzaDJ4V3JpdGUsIElvQnVmZmVyLklucHV0QnVmZmVyLCBzaXplb2YoRkxBU0gyWF9SRUFEV1JJVEUpKSkKIAkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfQogCiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIlxuc0ZsYXNoMnhSZWFkLlNlY3Rpb24gOiV4IiAsc0ZsYXNoMnhXcml0ZS5TZWN0aW9uKTsKIAkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwiXG5zRmxhc2gyeFJlYWQub2Zmc2V0IDolZCIgLHNGbGFzaDJ4V3JpdGUub2Zmc2V0KTsKIAkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwiXG5zRmxhc2gyeFJlYWQubnVtT2ZCeXRlcyA6JXgiICxzRmxhc2gyeFdyaXRlLm51bU9mQnl0ZXMpOwogCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCJcbnNGbGFzaDJ4UmVhZC5iVmVyaWZ5IDoleFxuIiAsc0ZsYXNoMnhXcml0ZS5iVmVyaWZ5KTsKLQkJCQkjaWYgMAotCQkJCWlmKChzRmxhc2gyeFdyaXRlLlNlY3Rpb24gPT0gSVNPX0lNQUdFMSkgfHwoc0ZsYXNoMnhXcml0ZS5TZWN0aW9uID09IElTT19JTUFHRTIpIHx8Ci0JCQkJCShzRmxhc2gyeFdyaXRlLlNlY3Rpb24gPT0gRFNEMCkgfHwgKHNGbGFzaDJ4V3JpdGUuU2VjdGlvbiA9PSBEU0QxKSB8fCAoc0ZsYXNoMnhXcml0ZS5TZWN0aW9uID09IERTRDIpKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIklTTy9EU0QgSW1hZ2Ugd3JpdGUgaXMgbm90IGFsbG93ZWQuLi4uICAiKTsKLQkJCQkJcmV0dXJuIFNUQVRVU19GQUlMVVJFIDsKLQkJCQl9Ci0JCQkJI2VuZGlmCiAJCQkJaWYoKHNGbGFzaDJ4V3JpdGUuU2VjdGlvbiAhPSBWU0EwKSAmJiAoc0ZsYXNoMnhXcml0ZS5TZWN0aW9uICE9IFZTQTEpICYmCiAJCQkJCShzRmxhc2gyeFdyaXRlLlNlY3Rpb24gIT0gVlNBMikgKQogCQkJCXsKQEAgLTE3OTgsMTIgKzE1OTMsMTAgQEAKIAkJCQllbHNlCiAJCQkJCUJ1ZmZTaXplID0gTk9CIDsKIAotCQkJCXBXcml0ZUJ1ZmYgPSAoUENIQVIpa21hbGxvYyhCdWZmU2l6ZSwgR0ZQX0tFUk5FTCk7CisJCQkJcFdyaXRlQnVmZiA9IGttYWxsb2MoQnVmZlNpemUsIEdGUF9LRVJORUwpOwogCQkJCWlmKHBXcml0ZUJ1ZmYgPT0gTlVMTCkKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIGZvciBGbGFzaCAyLnggUmVhZCBTdHJ1Y3R1cmUiKTsKIAkJCQkJcmV0dXJuIC1FTk9NRU07Ci0JCQkJfQorCiAKIAkJCQkvL2V4dHJhY3RpbmcgdGhlIHJlbWFpbmRlciBvZiB0aGUgZ2l2ZW4gb2Zmc2V0LgogCQkJCVdyaXRlQnl0ZXMgPSBBZGFwdGVyLT51aVNlY3RvclNpemUgOwpAQCAtMTgyMCw3ICsxNjEzLDcgQEAKIAkJCQl7CiAJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCJEZXZpY2UgaXMgaW4gSWRsZS9TaHV0ZG93biBNb2RlXG4iKTsKIAkJCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCQkJCQliY21fa2ZyZWUocFdyaXRlQnVmZik7CisJCQkJCWtmcmVlKHBXcml0ZUJ1ZmYpOwogCQkJCQlyZXR1cm4gLUVBQ0NFUzsKIAkJCQl9CiAKQEAgLTE4MzEsNyArMTYyNCw2IEBACiAJCQkJIAlpZihTdGF0dXMpCiAJCQkJIAl7CiAJCQkJIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJDb3B5IHRvIHVzZXIgZmFpbGVkIHdpdGggc3RhdHVzIDolZCIsIFN0YXR1cyk7Ci0JCQkJCQlTdGF0dXMgPSAtRUZBVUxUOwogCQkJCQkJYnJlYWsgOwogCQkJCSAJfQogCQkJCQlCQ01fREVCVUdfUFJJTlRfQlVGRkVSKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwscFdyaXRlQnVmZixXcml0ZUJ5dGVzKTsKQEAgLTE4NTksMjggKzE2NTEsMjIgQEAKIAkJCQl9CXdoaWxlKE5PQiA+IDApOwogCQkJCUJjbUZsYXNoMnhXcml0ZVNpZyhBZGFwdGVyLHNGbGFzaDJ4V3JpdGUuU2VjdGlvbik7CiAJCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCQkJCWJjbV9rZnJlZShwV3JpdGVCdWZmKTsKKwkJCQlrZnJlZShwV3JpdGVCdWZmKTsKIAkJCSB9CiAJCQkgYnJlYWsgOwogCQljYXNlIElPQ1RMX0JDTV9HRVRfRkxBU0gyWF9TRUNUSU9OX0JJVE1BUCA6CiAJCQkgewogCi0JCQkgCVBGTEFTSDJYX0JJVE1BUCBwc0ZsYXNoMnhCaXRNYXAgPSBOVUxMIDsKKwkJCQkgUEZMQVNIMlhfQklUTUFQIHBzRmxhc2gyeEJpdE1hcDsKIAkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIklPQ1RMX0JDTV9HRVRfRkxBU0gyWF9TRUNUSU9OX0JJVE1BUCBDYWxsZWQiKTsKIAotCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpOwotCQkJCWlmKFN0YXR1cykKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNvcHkgb2YgSU9DVEwgQlVGRkVSIGZhaWxlZCIpOworCQkJCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKIAkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfQotCQkJCWlmKElvQnVmZmVyLk91dHB1dExlbmd0aCAhPSBzaXplb2YoRkxBU0gyWF9CSVRNQVApKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJTdHJ1Y3R1cmUgc2l6ZSBtaXNtYXRjaCBMaWIgOjB4JWx4IERyaXZlciA6MHglenggIixJb0J1ZmZlci5PdXRwdXRMZW5ndGgsIHNpemVvZihGTEFTSDJYX0JJVE1BUCkpOwotCQkJCQlicmVhazsKLQkJCQl9CiAKLQkJCQlwc0ZsYXNoMnhCaXRNYXAgPSAoUEZMQVNIMlhfQklUTUFQKWt6YWxsb2Moc2l6ZW9mKEZMQVNIMlhfQklUTUFQKSwgR0ZQX0tFUk5FTCk7CisJCQkJaWYoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoICE9IHNpemVvZihGTEFTSDJYX0JJVE1BUCkpCisJCQkJCXJldHVybiAtRUlOVkFMOworCisJCQkJcHNGbGFzaDJ4Qml0TWFwID0ga3phbGxvYyhzaXplb2YoRkxBU0gyWF9CSVRNQVApLCBHRlBfS0VSTkVMKTsKIAkJCQlpZihwc0ZsYXNoMnhCaXRNYXAgPT0gTlVMTCkKIAkJCQl7CiAJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiTWVtb3J5IGlzIG5vdCBhdmFpbGFibGUiKTsKQEAgLTE4OTUsMjAgKzE2ODEsMTYgQEAKIAkJCQl7CiAJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCJEZXZpY2UgaXMgaW4gSWRsZS9TaHV0ZG93biBNb2RlXG4iKTsKIAkJCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCQkJCQliY21fa2ZyZWUocHNGbGFzaDJ4Qml0TWFwKTsKKwkJCQkJa2ZyZWUocHNGbGFzaDJ4Qml0TWFwKTsKIAkJCQkJcmV0dXJuIC1FQUNDRVM7CiAJCQkJfQogCiAJCQkJQmNtR2V0Rmxhc2gyeFNlY3Rpb25hbEJpdE1hcChBZGFwdGVyLCBwc0ZsYXNoMnhCaXRNYXApOwogCQkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCBwc0ZsYXNoMnhCaXRNYXAsIHNpemVvZihGTEFTSDJYX0JJVE1BUCkpOwotCQkJCWlmKFN0YXR1cykKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgImNvcHlpbmcgRmxhc2gyeCBiaXRNYXAgZmFpbGVkIik7Ci0JCQkJCWJjbV9rZnJlZShwc0ZsYXNoMnhCaXRNYXApOwotCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQl9Ci0JCQkJYmNtX2tmcmVlKHBzRmxhc2gyeEJpdE1hcCk7CisJCQkJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsIHBzRmxhc2gyeEJpdE1hcCwgc2l6ZW9mKEZMQVNIMlhfQklUTUFQKSkpCisJCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisKKwkJCQlrZnJlZShwc0ZsYXNoMnhCaXRNYXApOwogCQkJIH0KIAkJCSBicmVhayA7CiAJCWNhc2UgSU9DVExfQkNNX1NFVF9BQ1RJVkVfU0VDVElPTiA6CkBAIC0xOTI2LDE0ICsxNzA4LDE0IEBACiAJCQkJaWYoU3RhdHVzKQogCQkJCXsKIAkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29weSBvZiBJT0NUTCBCVUZGRVIgZmFpbGVkIik7Ci0JCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQlyZXR1cm4gU3RhdHVzOwogCQkJCX0KIAogCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZlRmxhc2gyeFNlY3Rpb25WYWwsSW9CdWZmZXIuSW5wdXRCdWZmZXIsIHNpemVvZihJTlQpKTsKIAkJCQlpZihTdGF0dXMpCiAJCQkJewogCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJDb3B5IG9mIGZsYXNoIHNlY3Rpb24gdmFsIGZhaWxlZCIpOwotCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQkJcmV0dXJuIFN0YXR1czsKIAkJCQl9CiAKIAkJCQlkb3duKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKQEAgLTE5NjEsMjkgKzE3NDMsNiBAQAogCQkJCUFkYXB0ZXItPmJBbGxEU0RXcml0ZUFsbG93ID0gRkFMU0UgOwogCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCJJT0NUTF9CQ01fSURFTlRJRllfQUNUSVZFX1NFQ1RJT04gY2FsbGVkIik7CiAKLQkJCQkjaWYgMAotCQkJCVNFQ1RJT05fVFlQRSBzZWN0aW9uID0gMCA7Ci0KLQotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiSU9DVExfQkNNX0lERU5USUZZX0FDVElWRV9TRUNUSU9OIENhbGxlZCIpOwotCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKChQQ0hBUikmSW9CdWZmZXIsIChQQ0hBUilhcmcsIHNpemVvZihJT0NUTF9CVUZGRVIpKTsKLQkJCQlpZihTdGF0dXMpCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIkNvcHkgb2YgSU9DVEwgQlVGRkVSIGZhaWxlZCIpOwotCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQl9Ci0JCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoKFBDSEFSKXNlY3Rpb24sKFBDSEFSKSZJb0J1ZmZlciwgc2l6ZW9mKElOVCkpOwotCQkJCWlmKFN0YXR1cykKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiQ29weSBvZiBzZWN0aW9uIHR5cGUgZmFpbGVkIGZhaWxlZCIpOwotCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQl9Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIlJlYWQgU2VjdGlvbiA6JWQiLCBzZWN0aW9uKTsKLQkJCSAJaWYoc2VjdGlvbiA9PSBEU0QpCi0JCQkJCUFkYXB0ZXItPnVsRmxhc2hDYWxTdGFydCA9IEFkYXB0ZXItPnVpQWN0aXZlRFNET2Zmc2V0QXRGd0RsZCA7Ci0JCQkJZWxzZQotCQkJCQlTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRSA7Ci0JCQkJI2VuZGlmCiAJCQkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1MgOwogCQkJIH0KIAkJCSBicmVhayA7CkBAIC0yMDA0LDE0ICsxNzYzLDE0IEBACiAJCQkJaWYoU3RhdHVzKQogCQkJCXsKIAkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29weSBvZiBJT0NUTCBCVUZGRVIgZmFpbGVkIFN0YXR1cyA6JWQiLCBTdGF0dXMpOwotCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQkJcmV0dXJuIFN0YXR1czsKIAkJCQl9CiAKLQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmc0NvcHlTZWN0U3RydXQsSW9CdWZmZXIuSW5wdXRCdWZmZXIsIHNpemVvZihGTEFTSDJYX0NPUFlfU0VDVElPTikpOworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZzQ29weVNlY3RTdHJ1dCwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIHNpemVvZihGTEFTSDJYX0NPUFlfU0VDVElPTikpOwogCQkJCWlmKFN0YXR1cykKIAkJCQl7CiAJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNvcHkgb2YgQ29weV9TZWN0aW9uX1N0cnVjdCBmYWlsZWQgd2l0aCBTdGF0dXMgOiVkIiwgU3RhdHVzKTsKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCXJldHVybiBTdGF0dXM7CiAJCQkJfQogCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiU291cmNlIFNFY3Rpb24gOiV4Iiwgc0NvcHlTZWN0U3RydXQuU3JjU2VjdGlvbik7CiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJEZXN0aW5hdGlvbiBTRWN0aW9uIDoleCIsIHNDb3B5U2VjdFN0cnV0LkRzdFNlY3Rpb24pOwpAQCAtMjA4Miw3ICsxODQxLDYgQEAKIAkJCQlpZihTdGF0dXMpCiAJCQkJewogCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJDb3B5IG9mIElPQ1RMIEJVRkZFUiBmYWlsZWQiKTsKLQkJCQkJU3RhdHVzID0gLUVGQVVMVDsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJCWlmKEFkYXB0ZXItPmVOVk1UeXBlICE9IE5WTV9GTEFTSCkKQEAgLTIwOTUsMzUgKzE4NTMsMTggQEAKIAkJCQl7CiAKIAkJCQkJaWYoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoIDwgc2l6ZW9mKEZMQVNIMlhfQ1NfSU5GTykpCi0JCQkJCXsKLQkJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiIFBhc3NlZCBidWZmZXIgc2l6ZToweCVsWCBpcyBpbnN1ZmZpY2llbnQgZm9yIHRoZSBDUyBzdHJ1Y3R1cmUuLiBcblJlcXVpcmVkIHNpemUgOjB4JXp4ICIsSW9CdWZmZXIuT3V0cHV0TGVuZ3RoLCBzaXplb2YoRkxBU0gyWF9DU19JTkZPKSk7Ci0JCQkJCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KKwkJCQkJCXJldHVybiAtRUlOVkFMOwogCi0JCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsIEFkYXB0ZXItPnBzRmxhc2gyeENTSW5mbywgc2l6ZW9mKEZMQVNIMlhfQ1NfSU5GTykpOwotCQkJCQlpZihTdGF0dXMpCi0JCQkJCXsKLQkJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgImNvcHlpbmcgRmxhc2gyeCBjcyBpbmZvIGZhaWxlZCIpOwotCQkJCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9CisJCQkJCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCBBZGFwdGVyLT5wc0ZsYXNoMnhDU0luZm8sIHNpemVvZihGTEFTSDJYX0NTX0lORk8pKSkKKwkJCQkJCXJldHVybiAtRUZBVUxUOwogCQkJCX0KIAkJCQllbHNlCiAJCQkJewogCQkJCQlpZihJb0J1ZmZlci5PdXRwdXRMZW5ndGggPCBzaXplb2YoRkxBU0hfQ1NfSU5GTykpCi0JCQkJCXsKLQkJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiIFBhc3NlZCBidWZmZXIgc2l6ZToweCVsWCBpcyBpbnN1ZmZpY2llbnQgZm9yIHRoZSBDUyBzdHJ1Y3R1cmUuLiBSZXF1aXJlZCBzaXplIDoweCV6eCAiLElvQnVmZmVyLk91dHB1dExlbmd0aCwgc2l6ZW9mKEZMQVNIX0NTX0lORk8pKTsKLQkJCQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCBBZGFwdGVyLT5wc0ZsYXNoQ1NJbmZvLCBzaXplb2YoRkxBU0hfQ1NfSU5GTykpOwotCQkJCQlpZihTdGF0dXMpCi0JCQkJCXsKLQkJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgImNvcHlpbmcgRmxhc2ggQ1MgaW5mbyBmYWlsZWQiKTsKLQkJCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQorCQkJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCQkJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsIEFkYXB0ZXItPnBzRmxhc2hDU0luZm8sIHNpemVvZihGTEFTSF9DU19JTkZPKSkpCisJCQkJCQlyZXR1cm4gLUVGQVVMVDsKIAogCQkJIAkgfQogCQkJICB9CkBAIC0yMTQ1LDEzICsxODg2LDEzIEBACiAJCQkJaWYoU3RhdHVzKQogCQkJCXsKIAkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29weSBvZiBJT0NUTCBCVUZGRVIgZmFpbGVkIik7Ci0JCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQlyZXR1cm4gU3RhdHVzOwogCQkJCX0KLQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmZUZsYXNoMnhTZWN0aW9uVmFsLElvQnVmZmVyLklucHV0QnVmZmVyLCBzaXplb2YoSU5UKSk7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJmVGbGFzaDJ4U2VjdGlvblZhbCwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIHNpemVvZihJTlQpKTsKIAkJCQlpZihTdGF0dXMpCiAJCQkJewogCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJDb3B5IG9mIGZsYXNoIHNlY3Rpb24gdmFsIGZhaWxlZCIpOwotCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQkJcmV0dXJuIFN0YXR1czsKIAkJCQl9CiAKIAkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwiUmVhZCBTZWN0aW9uIDolZCIsIGVGbGFzaDJ4U2VjdGlvblZhbCk7CkBAIC0yMTgxLDEzICsxOTIyLDEzIEBACiAJCWNhc2UgSU9DVExfQkNNX05WTV9SQVdfUkVBRCA6CiAJCQkgewogCi0JCQkJTlZNX1JFQURXUklURSAgc3ROVk1SZWFkID0ge307CisJCQkJIE5WTV9SRUFEV1JJVEUgc3ROVk1SZWFkOwogCQkJCUlOVCBOT0IgOwogCQkJCUlOVCBCdWZmU2l6ZSA7CiAJCQkJSU5UIFJlYWRPZmZzZXQgPSAwOwogCQkJCVVJTlQgUmVhZEJ5dGVzID0gMCA7Ci0JCQkJUFVDSEFSIHBSZWFkQnVmZiA9IE5VTEwgOwotCQkJCWNoYXIgX191c2VyICpPdXRQdXRCdWZmID0gTlVMTCA7CisJCQkJUFVDSEFSIHBSZWFkQnVmZjsKKwkJCQl2b2lkIF9fdXNlciAqT3V0UHV0QnVmZjsKIAogCQkJCWlmKEFkYXB0ZXItPmVOVk1UeXBlICE9IE5WTV9GTEFTSCkKIAkJCQl7CkBAIC0yMjA0LDEwICsxOTQ1LDcgQEAKIAkJCQl9CiAKIAkJCQlpZihjb3B5X2Zyb21fdXNlcigmc3ROVk1SZWFkLCBJb0J1ZmZlci5PdXRwdXRCdWZmZXIsc2l6ZW9mKE5WTV9SRUFEV1JJVEUpKSkKLQkJCQl7Ci0JCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkJCQlOT0IgPSBzdE5WTVJlYWQudWlOdW1CeXRlczsKIAkJCQkvL0luIFJhdy1SZWFkIG1heCBCdWZmIHNpemUgOiA2NE1CCkBAIC0yMjE3LDExICsxOTU1LDEwIEBACiAJCQkJZWxzZQogCQkJCQlCdWZmU2l6ZSA9IE5PQiA7CiAKLQkJCQlSZWFkT2Zmc2V0ID0gc3ROVk1SZWFkLnVpT2Zmc2V0IDsKKwkJCQlSZWFkT2Zmc2V0ID0gc3ROVk1SZWFkLnVpT2Zmc2V0OwogCQkJCU91dFB1dEJ1ZmYgPSBzdE5WTVJlYWQucEJ1ZmZlcjsKIAotCi0JCQkJcFJlYWRCdWZmID0gKFBDSEFSKWt6YWxsb2MoQnVmZlNpemUgLCBHRlBfS0VSTkVMKTsKKwkJCQlwUmVhZEJ1ZmYgPSBremFsbG9jKEJ1ZmZTaXplICwgR0ZQX0tFUk5FTCk7CiAJCQkJaWYocFJlYWRCdWZmID09IE5VTEwpCiAJCQkJewogCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCBmb3IgRmxhc2ggMi54IFJlYWQgU3RydWN0dXJlIik7CkBAIC0yMjM1LDcgKzE5NzIsNyBAQAogCQkJCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PVRSVUUpKQogCQkJCXsKIAkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIkRldmljZSBpcyBpbiBJZGxlL1NodXRkb3duIE1vZGVcbiIpOwotCQkJCQliY21fa2ZyZWUocFJlYWRCdWZmKTsKKwkJCQkJa2ZyZWUocFJlYWRCdWZmKTsKIAkJCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwogCQkJCQlyZXR1cm4gLUVBQ0NFUzsKIAkJCQl9CkBAIC0yMjU2LDEzICsxOTkzLDEyIEBACiAJCQkJCQlicmVhazsKIAkJCQkJfQogCi0JCQkJCUJDTV9ERUJVR19QUklOVF9CVUZGRVIoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCxwUmVhZEJ1ZmYsIFJlYWRCeXRlcyk7CisJCQkJCUJDTV9ERUJVR19QUklOVF9CVUZGRVIoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCxwUmVhZEJ1ZmYsUmVhZEJ5dGVzKTsKIAogCQkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIoT3V0UHV0QnVmZiwgcFJlYWRCdWZmLFJlYWRCeXRlcyk7CiAJCQkJIAlpZihTdGF0dXMpCiAJCQkJIAl7CiAJCQkJIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJDb3B5IHRvIHVzZSBmYWlsZWQgd2l0aCBzdGF0dXMgOiVkIiwgU3RhdHVzKTsKLQkJCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CiAJCQkJCQlicmVhazsKIAkJCQkgCX0KIAkJCQkJTk9CID0gTk9CIC0gUmVhZEJ5dGVzOwpAQCAtMjI3NSw3ICsyMDExLDcgQEAKIAkJCQl9CiAJCQkJQWRhcHRlci0+YkZsYXNoUmF3UmVhZCA9IEZBTFNFIDsKIAkJCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCQkJYmNtX2tmcmVlKHBSZWFkQnVmZik7CisJCQkJa2ZyZWUocFJlYWRCdWZmKTsKIAkJCQlicmVhayA7CiAJCQkgfQogCkBAIC0yMjg4LDcgKzIwMjQsNiBAQAogCQkJCWlmKFN0YXR1cykKIAkJCQl7CiAJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCJjb3B5IG9mIElvY3RsIGJ1ZmZlciBpcyBmYWlsZWQgZnJvbSB1c2VyIHNwYWNlIik7Ci0JCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CiAJCQkJCWJyZWFrOwogCQkJCX0KIApAQCAtMjI5Niw3ICsyMDMxLDYgQEAKIAkJCQlpZihTdGF0dXMpCiAJCQkJewogCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwiY29weSBvZiBjb250cm9sIGJpdCBtYXNrIGZhaWxlZCBmcm9tIHVzZXIgc3BhY2UiKTsKLQkJCQkJU3RhdHVzID0gLUVGQVVMVDsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCJcbiBHb3QgdXNlciBkZWZpbmVkIGNudHJsIG1zZyBiaXQgbWFzayA6JWx4IiwgUnhDbnRybE1zZ0JpdE1hc2spOwpAQCAtMjMxNSw3MSArMjA0OSw0NCBAQAogCQkJCURldkluZm8udTMyTlZNVHlwZSA9IEFkYXB0ZXItPmVOVk1UeXBlOwogCQkJCURldkluZm8udTMySW50ZXJmYWNlVHlwZSA9IEJDTV9VU0I7CiAKLQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKTsKLQkJCQlpZihTdGF0dXMpCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJDb3B5IG9mIElPQ1RMIEJVRkZFUiBmYWlsZWQiKTsKLQkJCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQorCQkJCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisKIAkJCQlpZihJb0J1ZmZlci5PdXRwdXRMZW5ndGggPCBzaXplb2YoRGV2SW5mbykpCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIlVzZXIgUGFzc2VkIGJ1ZmZlciBsZW5ndGggaXMgbGVzcyB0aGFuIGFjdHVyYWwgYnVmZmVyIHNpemUiKTsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJ1c2VyIHBhc3NlZCBidWZmZXIgc2l6ZSA6MHglbFgsIGV4cGVjdGVkIHNpemUgOjB4JXp4IixJb0J1ZmZlci5PdXRwdXRMZW5ndGgsIHNpemVvZihEZXZJbmZvKSk7Ci0JCQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCAmRGV2SW5mbywgc2l6ZW9mKERldkluZm8pKTsKLQkJCQlpZihTdGF0dXMpCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsImNvcHlpbmcgRGV2IGluZm8gc3RydWN0dXJlIHRvIHVzZXIgc3BhY2UgYnVmZmVyIGZhaWxlZCIpOwotCQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCQlicmVhazsKLQkJCQl9CisJCQkJCXJldHVybiAtRUlOVkFMOworCisJCQkJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsICZEZXZJbmZvLCBzaXplb2YoRGV2SW5mbykpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCX0KIAkJCWJyZWFrIDsKIAogCQkJY2FzZSBJT0NUTF9CQ01fVElNRV9TSU5DRV9ORVRfRU5UUlk6CiAJCQl7CiAJCQkJU1RfVElNRV9FTEFQU0VEIHN0VGltZUVsYXBzZWRTaW5jZU5ldEVudHJ5ID0gezB9OwotCQkJCXN0cnVjdCB0aW1ldmFsIHR2ID0gezB9IDsKIAogCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCJJT0NUTF9CQ01fVElNRV9TSU5DRV9ORVRfRU5UUlkgY2FsbGVkIik7CiAKLQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKTsKLQkJCQlpZihTdGF0dXMpCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJDb3B5IG9mIElPQ1RMIEJVRkZFUiBmYWlsZWQiKTsKLQkJCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQorCQkJCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisKIAkJCQlpZihJb0J1ZmZlci5PdXRwdXRMZW5ndGggPCBzaXplb2YoU1RfVElNRV9FTEFQU0VEKSkKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiVXNlciBQYXNzZWQgYnVmZmVyIGxlbmd0aDoweCVseCBpcyBsZXNzIHRoYW4gZXhwZWN0ZWQgYnVmZiBzaXplIDoweCV6WCIsSW9CdWZmZXIuT3V0cHV0TGVuZ3RoLHNpemVvZihTVF9USU1FX0VMQVBTRUQpKTsKLQkJCQkJU3RhdHVzID0gLUVJTlZBTDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQkJCS8vc3RUaW1lRWxhcHNlZFNpbmNlTmV0RW50cnkudWw2NFRpbWVFbGFwc2VkU2luY2VOZXRFbnRyeSA9IEFkYXB0ZXItPmxpVGltZVNpbmNlTGFzdE5ldEVudHJ5OwotCQkJCWRvX2dldHRpbWVvZmRheSgmdHYpOwotCQkJCXN0VGltZUVsYXBzZWRTaW5jZU5ldEVudHJ5LnVsNjRUaW1lRWxhcHNlZFNpbmNlTmV0RW50cnkgPSB0di50dl9zZWMgLSBBZGFwdGVyLT5saVRpbWVTaW5jZUxhc3ROZXRFbnRyeTsKKwkJCQlzdFRpbWVFbGFwc2VkU2luY2VOZXRFbnRyeS51bDY0VGltZUVsYXBzZWRTaW5jZU5ldEVudHJ5ID0gZ2V0X3NlY29uZHMoKSAtIEFkYXB0ZXItPmxpVGltZVNpbmNlTGFzdE5ldEVudHJ5OwogCi0JCQkJU3RhdHVzID0gY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgJnN0VGltZUVsYXBzZWRTaW5jZU5ldEVudHJ5LCBzaXplb2YoU1RfVElNRV9FTEFQU0VEKSk7Ci0JCQkJaWYoU3RhdHVzKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJjb3B5aW5nIFNUX1RJTUVfRUxBUFNFRCBzdHJ1Y3R1cmUgdG8gdXNlciBzcGFjZSBidWZmZXIgZmFpbGVkIik7Ci0JCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KKwkJCQlpZiAoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgJnN0VGltZUVsYXBzZWRTaW5jZU5ldEVudHJ5LCBzaXplb2YoU1RfVElNRV9FTEFQU0VEKSkpCisJCQkJCXJldHVybiAtRUZBVUxUOwogCiAJCQl9CiAJCQlicmVhazsKIAotCQlkZWZhdWx0OgotICAgICAgICAgICAgQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJ3cm9uZyBpbnB1dCAleCIsY21kKTsKLQkJCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJJbiBkZWZhdWx0IGlvY3RsICVkXG4iLCBjbWQpOwotCQkJIFN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworCQljYXNlIElPQ1RMX0NMT1NFX05PVElGSUNBVElPTjoKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCJJT0NUTF9DTE9TRV9OT1RJRklDQVRJT04iKTsKKwkJCWJyZWFrOwogCisJCWRlZmF1bHQ6CisJCQlwcl9pbmZvKERSVl9OQU1FICI6IHVua25vd24gaW9jdGwgY21kPSUjeFxuIiwgY21kKTsKKwkJCVN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOwogCQkJYnJlYWs7CiAJfQogCXJldHVybiBTdGF0dXM7CkBAIC0yMzk1LDU5ICsyMTAyLDM3IEBACiAJLmxsc2VlayA9IG5vX2xsc2VlaywKIH07CiAKK2V4dGVybiBzdHJ1Y3QgY2xhc3MgKmJjbV9jbGFzczsKIAogaW50IHJlZ2lzdGVyX2NvbnRyb2xfZGV2aWNlX2ludGVyZmFjZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCiB7CisKIAlpZihBZGFwdGVyLT5tYWpvcj4wKQotICAgIAlyZXR1cm4gQWRhcHRlci0+bWFqb3I7Ci0gICAgQWRhcHRlci0+bWFqb3IgPSByZWdpc3Rlcl9jaHJkZXYoMCwgInRhcmFuZyIsICZiY21fZm9wcyk7Ci0gICAgaWYoQWRhcHRlci0+bWFqb3IgPCAwKQotICAgIHsKLSAgICAJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJyZWdpc3Rlcl9jaHJkZXY6RmFpbGVkIHRvIHJlZ2lzdGVyaW5nIFdpTWF4IGNvbnRyb2wgY2hhciBkZXZpY2UhIik7Ci0gICAgICAgIHJldHVybiBBZGFwdGVyLT5tYWpvcjsKLSAgICB9CisJCXJldHVybiBBZGFwdGVyLT5tYWpvcjsKIAotCWJjbV9jbGFzcyA9IE5VTEw7Ci0JYmNtX2NsYXNzID0gY2xhc3NfY3JlYXRlIChUSElTX01PRFVMRSwgInRhcmFuZyIpOwotCWlmKElTX0VSUiAoYmNtX2NsYXNzKSkKLQl7Ci0gICAgCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiVW5hYmxlIHRvIGNyZWF0ZSBjbGFzc1xuIik7Ci0gICAgICAgIHVucmVnaXN0ZXJfY2hyZGV2KEFkYXB0ZXItPm1ham9yLCAidGFyYW5nIik7Ci0JCUFkYXB0ZXItPm1ham9yID0gMDsKLQkJcmV0dXJuIC1FTk9ERVY7CisJQWRhcHRlci0+bWFqb3IgPSByZWdpc3Rlcl9jaHJkZXYoMCwgREVWX05BTUUsICZiY21fZm9wcyk7CisJaWYoQWRhcHRlci0+bWFqb3IgPCAwKSB7CisJCXByX2VycihEUlZfTkFNRSAiOiBjb3VsZCBub3QgY3JlYXRlZCBjaGFyYWN0ZXIgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIEFkYXB0ZXItPm1ham9yOwogCX0KKwogCUFkYXB0ZXItPnBzdENyZWF0ZWRDbGFzc0RldmljZSA9IGRldmljZV9jcmVhdGUgKGJjbV9jbGFzcywgTlVMTCwKLQkJCQkJCQkJTUtERVYoQWRhcHRlci0+bWFqb3IsIDApLAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwyNikKLQkJCQkJCQkJTlVMTAksCi0jZW5kaWYKLQkJCQkJCQkJInRhcmFuZyIpOworCQkJCQkJCU1LREVWKEFkYXB0ZXItPm1ham9yLCAwKSwgQWRhcHRlciwKKwkJCQkJCQlERVZfTkFNRSk7CiAKLQlpZihJU19FUlIoQWRhcHRlci0+cHN0Q3JlYXRlZENsYXNzRGV2aWNlKSkKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiY2xhc3MgZGV2aWNlIGRpZCBub3QgZ2V0IGNyZWF0ZWQgOiAlbGQiLCBQVFJfRVJSKEFkYXB0ZXItPnBzdENyZWF0ZWRDbGFzc0RldmljZSkgKTsKKwlpZihJU19FUlIoQWRhcHRlci0+cHN0Q3JlYXRlZENsYXNzRGV2aWNlKSkgeworCQlwcl9lcnIoRFJWX05BTUUgIjogY2xhc3MgZGV2aWNlIGNyZWF0ZSBmYWlsZWRcbiIpOworCQl1bnJlZ2lzdGVyX2NocmRldihBZGFwdGVyLT5tYWpvciwgREVWX05BTUUpOworCQlyZXR1cm4gUFRSX0VSUihBZGFwdGVyLT5wc3RDcmVhdGVkQ2xhc3NEZXZpY2UpOwogCX0KLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIkdvdCBNYWpvciBObzogJWQiLCBBZGFwdGVyLT5tYWpvcik7Ci0gICAgcmV0dXJuIDA7CisJCQkKKwlyZXR1cm4gMDsKIH0KIAogdm9pZCB1bnJlZ2lzdGVyX2NvbnRyb2xfZGV2aWNlX2ludGVyZmFjZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCiB7Ci0JaWYoQWRhcHRlci0+bWFqb3IgPiAwKQotCXsKLSAgICAgICAgQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJkZXN0cm95aW5nIGNsYXNzIGRldmljZSIpOworCWlmKEFkYXB0ZXItPm1ham9yID4gMCkgewogCQlkZXZpY2VfZGVzdHJveSAoYmNtX2NsYXNzLCBNS0RFVihBZGFwdGVyLT5tYWpvciwgMCkpOworCQl1bnJlZ2lzdGVyX2NocmRldihBZGFwdGVyLT5tYWpvciwgREVWX05BTUUpOwogCX0KLSAgICBpZighSVNfRVJSKGJjbV9jbGFzcykpCi0JewotICAgICAgICBCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgImRlc3Ryb3lpbmcgY3JlYXRlZCBjbGFzcyAiKTsKLSAgICAgICAgY2xhc3NfZGVzdHJveSAoYmNtX2NsYXNzKTsKLQkJYmNtX2NsYXNzID0gTlVMTDsKLQl9Ci0JaWYoQWRhcHRlci0+bWFqb3IgPiAwKQotCXsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsInVucmVnaXN0ZXJpbmcgY2hhcmFjdGVyIGludGVyZmFjZSIpOwotICAgICAgICB1bnJlZ2lzdGVyX2NocmRldihBZGFwdGVyLT5tYWpvciwgInRhcmFuZyIpOwotCX0KLQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9CY21uZXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vQmNtbmV0LmMKaW5kZXggYmMyOTY5OC4uYTZjZTIzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9CY21uZXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0JjbW5ldC5jCkBAIC0xLDI2NCArMSwyMzggQEAKICNpbmNsdWRlICJoZWFkZXJzLmgiCiAKLXN0YXRpYyBJTlQgYmNtX25vdGlmeV9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCBVTE9ORyBldmVudCwgUFZPSUQgZGV2KQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlKilkZXY7Ci0gICAgUE1JTklfQURBUFRFUiBBZGFwdGVyID0gR0VUX0JDTV9BREFQVEVSKGdibHBuZXRkZXYpOwotCS8vUE1JTklfQURBUFRFUiAJQWRhcHRlciA9IChQTUlOSV9BREFQVEVSKW5kZXYtPnByaXY7Ci0JaWYoc3RybmNtcChuZGV2LT5uYW1lLGdibHBuZXRkZXYtPm5hbWUsNSk9PTApCi0JewotCQlzd2l0Y2goZXZlbnQpCi0JCXsKLQkJCWNhc2UgTkVUREVWX0NIQU5HRUFERFI6Ci0JCQljYXNlIE5FVERFVl9HT0lOR19ET1dOOgotCQkJCS8qaWdub3JlIHRoaXMgKi8KLQkJCQkJYnJlYWs7Ci0JCQljYXNlIE5FVERFVl9ET1dOOgotCQkJCWJyZWFrOwotCi0JCQljYXNlIE5FVERFVl9VUDoKLQkJCQlicmVhazsKLQotCQkJY2FzZSBORVRERVZfUkVHSVNURVI6Ci0JCQkJIC8qIEluY3JlbWVudCB0aGUgUmVmZXJlbmNlIENvdW50IGZvciAidmV0aDAiICovCi0JCQkJIEJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiUmVnaXN0ZXIgUmVmQ291bnQ6ICV4XG4iLAotCQkJCQkJCQkJbmV0ZGV2X3JlZmNudF9yZWFkKG5kZXYpKTsKLQkJCQkgZGV2X2hvbGQobmRldik7Ci0JCQkJIGJyZWFrOwotCi0JCQljYXNlIE5FVERFVl9VTlJFR0lTVEVSOgotCQkJCSAvKiBEZWNyZW1lbnQgdGhlIFJlZmVyZW5jZSBDb3VudCBmb3IgInZldGgwIiAqLwotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiVW5yZWdpc3RlciBSZWZDbnQ6ICV4XG4iLAotCQkJCQkJCQkJbmV0ZGV2X3JlZmNudF9yZWFkKG5kZXYpKTsKLQkJCQlkZXZfcHV0KG5kZXYpOwotCQkJCWJyZWFrOwotCQl9OwotCX0KLQlyZXR1cm4gTk9USUZZX0RPTkU7Ci19Ci0KLS8qIE5vdGlmaWVyIGJsb2NrIHRvIHJlY2VpdmUgbmV0ZGV2aWNlIGV2ZW50cyAqLwotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBiY21fbm90aWZpZXJfYmxvY2sgPQotewotCS5ub3RpZmllcl9jYWxsID0gYmNtX25vdGlmeV9ldmVudCwKLX07Ci0KIHN0cnVjdCBuZXRfZGV2aWNlICpnYmxwbmV0ZGV2OwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIHByb3RvLXR5cGUgb2YgbG93ZXIgZnVuY3Rpb24gKi8KLSNpZmRlZiBCQ01fU0hNX0lOVEVSRkFDRQotY29uc3QgY2hhciAqYmNtVmlydERldmljZU5hbWU9ImJjbWV0aCI7Ci0jZW5kaWYKIAogc3RhdGljIElOVCBiY21fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotICAgIFBNSU5JX0FEQVBURVIgQWRhcHRlciA9IE5VTEwgOyAvLyhQTUlOSV9BREFQVEVSKWRldi0+cHJpdjsKLQlBZGFwdGVyID0gR0VUX0JDTV9BREFQVEVSKGRldik7Ci0gICAgQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICI9PT09PT0+Iik7Ci0gICAgaWYoQWRhcHRlci0+ZndfZG93bmxvYWRfZG9uZT09RkFMU0UpCi0gICAgICAgIHJldHVybiAtRUlOVkFMOwotCUFkYXB0ZXItPmlmX3VwPTE7Ci0JaWYoQWRhcHRlci0+TGlua1VwU3RhdHVzID09IDEpewotCQlpZihuZXRpZl9xdWV1ZV9zdG9wcGVkKEFkYXB0ZXItPmRldikpewotCQkJbmV0aWZfY2Fycmllcl9vbihBZGFwdGVyLT5kZXYpOwotCQkJbmV0aWZfc3RhcnRfcXVldWUoQWRhcHRlci0+ZGV2KTsKLQkJfQorCVBNSU5JX0FEQVBURVIgQWRhcHRlciA9IEdFVF9CQ01fQURBUFRFUihkZXYpOworCisJaWYgKEFkYXB0ZXItPmZ3X2Rvd25sb2FkX2RvbmUgPT0gRkFMU0UpIHsKKwkJcHJfbm90aWNlKFBGWCAiJXM6IGxpbmsgdXAgZmFpbGVkIChkb3dubG9hZCBpbiBwcm9ncmVzcylcbiIsCisgCQkJICBkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVCVVNZOwogCX0KIAotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiPD09PT09PSIpOwotICAgIHJldHVybiAwOwotfQorCWlmIChuZXRpZl9tc2dfaWZ1cChBZGFwdGVyKSkKKwkJcHJfaW5mbyhQRlggIiVzOiBlbmFibGluZyBpbnRlcmZhY2VcbiIsIGRldi0+bmFtZSk7CiAKLXN0YXRpYyBJTlQgYmNtX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0gICBQTUlOSV9BREFQVEVSIEFkYXB0ZXIgPSBOVUxMIDsvL2dwYWRhcHRlciA7Ci0gICBBZGFwdGVyID0gR0VUX0JDTV9BREFQVEVSKGRldik7Ci0gICAgQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICI9PT09PT4iKTsKLQlBZGFwdGVyLT5pZl91cD0wOwotCWlmKCFuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpIHsKLQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKLQkgICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCWlmIChBZGFwdGVyLT5MaW5rVXBTdGF0dXMpIHsKKwkJaWYgKG5ldGlmX21zZ19saW5rKEFkYXB0ZXIpKQorCQkJcHJfaW5mbyhQRlggIiVzOiBsaW5rIHVwXG4iLCBkZXYtPm5hbWUpOworCisJCW5ldGlmX2NhcnJpZXJfb24oQWRhcHRlci0+ZGV2KTsKKwkJbmV0aWZfc3RhcnRfcXVldWUoQWRhcHRlci0+ZGV2KTsKIAl9Ci0gICAgQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsIjw9PT09PSIpOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmJjbV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLSAgICBQTElOVVhfREVQX0RBVEEgcExpbnV4RGF0YT1OVUxMOwotCVBNSU5JX0FEQVBURVIgQWRhcHRlciA9IE5VTEwgOy8vIGdwYWRhcHRlciA7Ci0JQWRhcHRlciA9IEdFVF9CQ01fQURBUFRFUihkZXYpOwotICAgIHBMaW51eERhdGEgPSAoUExJTlVYX0RFUF9EQVRBKShBZGFwdGVyLT5wdk9zRGVwRGF0YSk7Ci0KLSAgICAvL0JDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiRGV2ID0gJXAsIHBMaW51eERhdGEgPSAlcCIsIGRldiwgcExpbnV4RGF0YSk7Ci0JcExpbnV4RGF0YS0+bmV0c3RhdHMucnhfcGFja2V0cz1hdG9taWNfcmVhZCgmQWRhcHRlci0+UnhSb2xsT3ZlckNvdW50KSo2NCoxMDI0K0FkYXB0ZXItPlByZXZOdW1SZWN2RGVzY3M7Ci0JcExpbnV4RGF0YS0+bmV0c3RhdHMucnhfYnl0ZXM9YXRvbWljX3JlYWQoJkFkYXB0ZXItPkdvb2RSeEJ5dGVDb3VudCkrYXRvbWljX3JlYWQoJkFkYXB0ZXItPkJhZFJ4Qnl0ZUNvdW50KTsKLQlwTGludXhEYXRhLT5uZXRzdGF0cy5yeF9kcm9wcGVkPWF0b21pY19yZWFkKCZBZGFwdGVyLT5SeFBhY2tldERyb3BwZWRDb3VudCk7Ci0JcExpbnV4RGF0YS0+bmV0c3RhdHMucnhfZXJyb3JzPWF0b21pY19yZWFkKCZBZGFwdGVyLT5SeFBhY2tldERyb3BwZWRDb3VudCk7Ci0JcExpbnV4RGF0YS0+bmV0c3RhdHMucnhfbGVuZ3RoX2Vycm9ycz0wOwotCXBMaW51eERhdGEtPm5ldHN0YXRzLnJ4X2ZyYW1lX2Vycm9ycz0wOwotCXBMaW51eERhdGEtPm5ldHN0YXRzLnJ4X2NyY19lcnJvcnM9MDsKLQlwTGludXhEYXRhLT5uZXRzdGF0cy50eF9ieXRlcz1hdG9taWNfcmVhZCgmQWRhcHRlci0+R29vZFR4Qnl0ZUNvdW50KTsKLQlwTGludXhEYXRhLT5uZXRzdGF0cy50eF9wYWNrZXRzPWF0b21pY19yZWFkKCZBZGFwdGVyLT5UeFRvdGFsUGFja2V0Q291bnQpOwotCXBMaW51eERhdGEtPm5ldHN0YXRzLnR4X2Ryb3BwZWQ9YXRvbWljX3JlYWQoJkFkYXB0ZXItPlR4RHJvcHBlZFBhY2tldENvdW50KTsKLQotICAgIHJldHVybiAmKHBMaW51eERhdGEtPm5ldHN0YXRzKTsKLX0KLS8qKgotQGluZ3JvdXAgaW5pdF9mdW5jdGlvbnMKLVJlZ2lzdGVyIG90aGVyIGRyaXZlciBlbnRyeSBwb2ludHMgd2l0aCB0aGUga2VybmVsCi0qLwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLCA2LCAyOSkKLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgYmNtTmV0RGV2T3BzID0gewotICAgIC5uZG9fb3BlbgkJPSBiY21fb3BlbiwKLSAgICAubmRvX3N0b3AgCQk9IGJjbV9jbG9zZSwKLSAgICAubmRvX2dldF9zdGF0cyAJPSBiY21fZ2V0X3N0YXRzLAotICAgIC5uZG9fc3RhcnRfeG1pdAk9IGJjbV90cmFuc21pdCwKLSAgICAubmRvX2NoYW5nZV9tdHUJPSBldGhfY2hhbmdlX210dSwKLSAgICAubmRvX3NldF9tYWNfYWRkcmVzcyA9IGV0aF9tYWNfYWRkciwKLSAgICAubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKLX07Ci0jZW5kaWYKLQotaW50IHJlZ2lzdGVyX25ldHdvcmtkZXYoUE1JTklfQURBUFRFUiBBZGFwdGVyKQotewotCWludCByZXN1bHQ9MDsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI3KQotCXZvaWQgKip0ZW1wID0gTlVMTDsgLyogYWN0dWFsbHkgd2UncmUgKmFsbG9jYXRpbmcqIHRoZSBkZXZpY2UgaW4gYWxsb2NfZXRoZXJkZXYgKi8KLSNlbmRpZgotCUFkYXB0ZXItPmRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihQTUlOSV9BREFQVEVSKSk7Ci0JaWYoIUFkYXB0ZXItPmRldikKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiRVJSOiBObyBEZXYiKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCWdibHBuZXRkZXYJCQkJCQkJPSBBZGFwdGVyLT5kZXY7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI3KQotCUFkYXB0ZXItPmRldi0+cHJpdiAgICAgIAkJCT0gQWRhcHRlcjsKLSNlbHNlCi0JdGVtcCA9IG5ldGRldl9wcml2KEFkYXB0ZXItPmRldik7Ci0JKnRlbXAgPSAodm9pZCAqKUFkYXB0ZXI7Ci0jZW5kaWYKLQkvL0JDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgImluaXQgYWRhcHRlcnB0cjogJXggJXhcbiIsIChVSU5UKUFkYXB0ZXIsIHRlbXApOwotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDI5KQotICAgICAgICBBZGFwdGVyLT5kZXYtPm5ldGRldl9vcHMgICAgICAgICAgICAgICAgPSAmYmNtTmV0RGV2T3BzOwotI2Vsc2UKLQlBZGFwdGVyLT5kZXYtPm9wZW4gICAgICAJCQk9IGJjbV9vcGVuOwotCUFkYXB0ZXItPmRldi0+c3RvcCAgICAgICAgICAgICAgIAk9IGJjbV9jbG9zZTsKLQlBZGFwdGVyLT5kZXYtPmdldF9zdGF0cyAgICAgICAgICAJPSBiY21fZ2V0X3N0YXRzOwotCUFkYXB0ZXItPmRldi0+aGFyZF9zdGFydF94bWl0ICAgIAk9IGJjbV90cmFuc21pdDsKLQlBZGFwdGVyLT5kZXYtPmhhcmRfaGVhZGVyX2xlbiAgICAJPSBFVEhfSExFTiArIExFQURFUl9TSVpFOwotI2VuZGlmCi0KLSNpZm5kZWYgQkNNX1NITV9JTlRFUkZBQ0UKLQlBZGFwdGVyLT5kZXYtPm10dQkJCQkJPSBNVFVfU0laRTsgLyogMTQwMCBCeXRlcyAqLwotCS8qIFJlYWQgdGhlIE1BQyBBZGRyZXNzIGZyb20gRUVQUk9NICovCi0JUmVhZE1hY0FkZHJlc3NGcm9tTlZNKEFkYXB0ZXIpOwotCi0KLQkvKiBSZWdpc3RlciB0aGUgbm90aWZpZXIgYmxvY2sgZm9yIGdldHRpbmcgbmV0ZGV2aWNlIGV2ZW50cyAqLwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiUmVnaXN0ZXJpbmcgbmV0ZGV2aWNlIG5vdGlmaWVyXG4iKTsKLQlyZXN1bHQgPSByZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmJjbV9ub3RpZmllcl9ibG9jayk7Ci0JaWYocmVzdWx0KQotCXsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJCQ00gTm90aWZpZXIgQmxvY2sgZGlkIG5vdCBnZXQgcmVnaXN0ZXJlZCIpOwotCQlBZGFwdGVyLT5iTmV0ZGV2aWNlTm90aWZpZXJSZWdpc3RlcmVkID0gRkFMU0U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCWVsc2UKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiQkNNIE5vdGlmaWVyIGdvdCBSZWdpc3RlcmVkIik7Ci0JCUFkYXB0ZXItPmJOZXRkZXZpY2VOb3RpZmllclJlZ2lzdGVyZWQgPSBUUlVFOwotCX0KLQotI2Vsc2UKLQotCUFkYXB0ZXItPmRldi0+bXR1CQkJPSBDUEVfTVRVX1NJWkU7Ci0KLSNpZiAwCi0JLy9mb3IgQ1BFIC0gaGFyY29kZSB0aGUgdmlydHVhbCBtYWMgYWRkcmVzcwotCUFkYXB0ZXItPmRldi0+ZGV2X2FkZHJbMF0gPSAgTUlJX1dJTUFYX01BQ0FERFJFU1NbMF07Ci0JQWRhcHRlci0+ZGV2LT5kZXZfYWRkclsxXSA9ICBNSUlfV0lNQVhfTUFDQUREUkVTU1sxXTsKLQlBZGFwdGVyLT5kZXYtPmRldl9hZGRyWzJdID0gIE1JSV9XSU1BWF9NQUNBRERSRVNTWzJdOwotCUFkYXB0ZXItPmRldi0+ZGV2X2FkZHJbM10gPSAgTUlJX1dJTUFYX01BQ0FERFJFU1NbM107Ci0JQWRhcHRlci0+ZGV2LT5kZXZfYWRkcls0XSA9ICBNSUlfV0lNQVhfTUFDQUREUkVTU1s0XTsKLQlBZGFwdGVyLT5kZXYtPmRldl9hZGRyWzVdID0gIE1JSV9XSU1BWF9NQUNBRERSRVNTWzVdOwotI2Vsc2UKLQlSZWFkTWFjQWRkcmVzc0Zyb21OVk0oQWRhcHRlcik7Ci0jZW5kaWYKLQlzdHJjcHkoQWRhcHRlci0+ZGV2LT5uYW1lLCBiY21WaXJ0RGV2aWNlTmFtZSk7IC8vQ29weSB0aGUgZGV2aWNlIG5hbWUKLQotI2VuZGlmCi0KLQlyZXN1bHQgPSByZWdpc3Rlcl9uZXRkZXYoQWRhcHRlci0+ZGV2KTsKLQlpZiAoIXJlc3VsdCkKLQl7Ci0JCUFkYXB0ZXItPmJOZXR3b3JrSW50ZXJmYWNlUmVnaXN0ZXJlZCA9IFRSVUUgOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIkJlY2VlbSBOZXR3b3JrIGRldmljZSBuYW1lIGlzICVzISIsIEFkYXB0ZXItPmRldi0+bmFtZSk7Ci0JfQotCWVsc2UKLQl7Ci0gICAgCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiTmV0d29yayBkZXZpY2UgY2FuIG5vdCBiZSByZWdpc3RlcmVkISIpOwotCQlBZGFwdGVyLT5iTmV0d29ya0ludGVyZmFjZVJlZ2lzdGVyZWQgPSBGQUxTRSA7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0jaWYgMAotIEFkYXB0ZXItPnN0RGVidWdTdGF0ZS5kZWJ1Z19sZXZlbCA9IERCR19MVkxfQ1VSUjsKLSBBZGFwdGVyLT5zdERlYnVnU3RhdGUudHlwZSA9KFVJTlQpMHhmZmZmZmZmZjsKLSBBZGFwdGVyLT5zdERlYnVnU3RhdGUuc3VidHlwZVtEQkdfVFlQRV9PVEhFUlNdID0gMHhmZmZmZmZmZjsKLSBBZGFwdGVyLT5zdERlYnVnU3RhdGUuc3VidHlwZVtEQkdfVFlQRV9SWF0gPSAweGZmZmZmZmZmOwotIEFkYXB0ZXItPnN0RGVidWdTdGF0ZS5zdWJ0eXBlW0RCR19UWVBFX1RYXSA9IDB4ZmZmZmZmZmY7Ci0gQWRhcHRlci0+c3REZWJ1Z1N0YXRlLnN1YnR5cGVbREJHX1RZUEVfSU5JVEVYSVRdID0gMHhmZmZmZmZmZjsKLQotIHByaW50aygiLS0tLS0tLXBzX2FkYXB0ZXItPnN0RGVidWdTdGF0ZS50eXBlPSV4XG4iLEFkYXB0ZXItPnN0RGVidWdTdGF0ZS50eXBlKTsKLSBwcmludGsoIi0tLS0tLS1wc19hZGFwdGVyLT5zdERlYnVnU3RhdGUuc3VidHlwZVtEQkdfVFlQRV9PVEhFUlNdPSV4XG4iLEFkYXB0ZXItPnN0RGVidWdTdGF0ZS5zdWJ0eXBlW0RCR19UWVBFX09USEVSU10pOwotIHByaW50aygiLS0tLS0tLXBzX2FkYXB0ZXItPnN0RGVidWdTdGF0ZS5zdWJ0eXBlW0RCR19UWVBFX1JYXT0leFxuIixBZGFwdGVyLT5zdERlYnVnU3RhdGUuc3VidHlwZVtEQkdfVFlQRV9SWF0pOwotIHByaW50aygiLS0tLS0tLXBzX2FkYXB0ZXItPnN0RGVidWdTdGF0ZS5zdWJ0eXBlW0RCR19UWVBFX1RYXT0leFxuIixBZGFwdGVyLT5zdERlYnVnU3RhdGUuc3VidHlwZVtEQkdfVFlQRV9UWF0pOwotI2VuZGlmCiAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBiY21fdW5yZWdpc3Rlcl9uZXR3b3JrZGV2KFBNSU5JX0FEQVBURVIgQWRhcHRlcikKK3N0YXRpYyBJTlQgYmNtX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJVbnJlZ2lzdGVyaW5nIHRoZSBOZXQgRGV2Li4uXG4iKTsKLQlpZihBZGFwdGVyLT5kZXYgJiYgIUlTX0VSUihBZGFwdGVyLT5kZXYpICYmIEFkYXB0ZXItPmJOZXR3b3JrSW50ZXJmYWNlUmVnaXN0ZXJlZCkKLQkJdW5yZWdpc3Rlcl9uZXRkZXYoQWRhcHRlci0+ZGV2KTsKLQkJLyogVW5yZWdpc3RlciB0aGUgbm90aWZpZXIgYmxvY2sgKi8KLQlpZihBZGFwdGVyLT5iTmV0ZGV2aWNlTm90aWZpZXJSZWdpc3RlcmVkID09IFRSVUUpCi0JewotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiVW5yZWdpc3RlcmluZyBuZXRkZXZpY2Ugbm90aWZpZXJcbiIpOwotCQkJdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmJjbV9ub3RpZmllcl9ibG9jayk7Ci0gIH0KKwlQTUlOSV9BREFQVEVSIEFkYXB0ZXIgPSBHRVRfQkNNX0FEQVBURVIoZGV2KTsKKworCWlmIChuZXRpZl9tc2dfaWZkb3duKEFkYXB0ZXIpKQorCQlwcl9pbmZvKFBGWCAiJXM6IGRpc2FibGluZyBpbnRlcmZhY2VcbiIsIGRldi0+bmFtZSk7CisKKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGJjbV9pbml0KHZvaWQpCitzdGF0aWMgdTE2IGJjbV9zZWxlY3RfcXVldWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKKwlyZXR1cm4gQ2xhc3NpZnlQYWNrZXQobmV0ZGV2X3ByaXYoZGV2KSwgc2tiKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogRnVuY3Rpb24gICAgLQliY21fdHJhbnNtaXQoKQorKgorKiBEZXNjcmlwdGlvbiAtIFRoaXMgaXMgdGhlIG1haW4gdHJhbnNtaXQgZnVuY3Rpb24gZm9yIG91ciB2aXJ0dWFsCisqCQlpbnRlcmZhY2UoZXRoMCkuIEl0IGhhbmRsZXMgdGhlIEFSUCBwYWNrZXRzLiBJdAorKgkJY2xvbmVzIHRoaXMgcGFja2V0IGFuZCB0aGVuIFF1ZXVlIGl0IHRvIGEgc3VpdGFibGUKKyogCQlRdWV1ZS4gVGhlbiBjYWxscyB0aGUgdHJhbnNtaXRfcGFja2V0KCkuCisqCisqIFBhcmFtZXRlciAgIC0JIHNrYiAtIFBvaW50ZXIgdG8gdGhlIHNvY2tldCBidWZmZXIgc3RydWN0dXJlCisqCQkgZGV2IC0gUG9pbnRlciB0byB0aGUgdmlydHVhbCBuZXQgZGV2aWNlIHN0cnVjdHVyZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgbmV0ZGV2X3R4X3QgYmNtX3RyYW5zbWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJUE1JTklfQURBUFRFUiBBZGFwdGVyID0gR0VUX0JDTV9BREFQVEVSKGRldik7CisJdTE2IHFpbmRleCA9IHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpOworCisKKwlpZiAoQWRhcHRlci0+ZGV2aWNlX3JlbW92ZWQgfHwgIUFkYXB0ZXItPkxpbmtVcFN0YXR1cykKKwkJZ290byBkcm9wOworCisJaWYgKEFkYXB0ZXItPlRyYW5zZmVyTW9kZSAhPSBJUF9QQUNLRVRfT05MWV9NT0RFKQorCQlnb3RvIGRyb3A7CisKKwlpZiAoSU5WQUxJRF9RVUVVRV9JTkRFWCA9PSBxaW5kZXgpCisJCWdvdG8gZHJvcDsKKworCWlmIChBZGFwdGVyLT5QYWNrSW5mb1txaW5kZXhdLnVpQ3VycmVudFBhY2tldHNPbkhvc3QgPj0KKwkgICAgU0ZfTUFYX0FMTE9XRURfUEFDS0VUU19UT19CQUNLVVApCisJCXJldHVybiBORVRERVZfVFhfQlVTWTsKKworCS8qIE5vdyBFbnF1ZXVlIHRoZSBwYWNrZXQgKi8KKwlpZiAobmV0aWZfbXNnX3R4X3F1ZXVlZChBZGFwdGVyKSkKKwkJcHJfaW5mbyhQRlggIiVzOiBlbnF1ZXVlaW5nIHBhY2tldCB0byBxdWV1ZSAlZFxuIiwKKwkJCWRldi0+bmFtZSwgcWluZGV4KTsKKworCXNwaW5fbG9jaygmQWRhcHRlci0+UGFja0luZm9bcWluZGV4XS5TRlF1ZXVlTG9jayk7CisJQWRhcHRlci0+UGFja0luZm9bcWluZGV4XS51aUN1cnJlbnRCeXRlc09uSG9zdCArPSBza2ItPmxlbjsKKwlBZGFwdGVyLT5QYWNrSW5mb1txaW5kZXhdLnVpQ3VycmVudFBhY2tldHNPbkhvc3QrKzsKKworCSooKEJfVUlOVDMyICopIHNrYi0+Y2IgKyBTS0JfQ0JfTEFURU5DWV9PRkZTRVQpID0gamlmZmllczsKKwlFTlFVRVVFUEFDS0VUKEFkYXB0ZXItPlBhY2tJbmZvW3FpbmRleF0uRmlyc3RUeFF1ZXVlLAorCQkgICAgICBBZGFwdGVyLT5QYWNrSW5mb1txaW5kZXhdLkxhc3RUeFF1ZXVlLCBza2IpOworCWF0b21pY19pbmMoJkFkYXB0ZXItPlRvdGFsUGFja2V0Q291bnQpOworCXNwaW5fdW5sb2NrKCZBZGFwdGVyLT5QYWNrSW5mb1txaW5kZXhdLlNGUXVldWVMb2NrKTsKKworCS8qIEZJWE1FIC0gdGhpcyBpcyByYWN5IGFuZCBpbmNvcnJlY3QsIHJlcGxhY2Ugd2l0aCB3b3JrIHF1ZXVlICovCisJaWYgKCFhdG9taWNfcmVhZCgmQWRhcHRlci0+VHhQa3RBdmFpbCkpIHsKKwkJYXRvbWljX3NldCgmQWRhcHRlci0+VHhQa3RBdmFpbCwgMSk7CisJCXdha2VfdXAoJkFkYXB0ZXItPnR4X3BhY2tldF93YWl0X3F1ZXVlKTsKKwl9CisJcmV0dXJuIE5FVERFVl9UWF9PSzsKKworIGRyb3A6CisJZGV2X2tmcmVlX3NrYihza2IpOworCXJldHVybiBORVRERVZfVFhfT0s7Cit9CisKKworCisvKioKK0Bpbmdyb3VwIGluaXRfZnVuY3Rpb25zCitSZWdpc3RlciBvdGhlciBkcml2ZXIgZW50cnkgcG9pbnRzIHdpdGggdGhlIGtlcm5lbAorKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgYmNtTmV0RGV2T3BzID0geworICAgIC5uZG9fb3BlbgkJPSBiY21fb3BlbiwKKyAgICAubmRvX3N0b3AgCQk9IGJjbV9jbG9zZSwKKyAgICAubmRvX3N0YXJ0X3htaXQJPSBiY21fdHJhbnNtaXQsCisgICAgLm5kb19jaGFuZ2VfbXR1CT0gZXRoX2NoYW5nZV9tdHUsCisgICAgLm5kb19zZXRfbWFjX2FkZHJlc3MgPSBldGhfbWFjX2FkZHIsCisgICAgLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCisgICAgLm5kb19zZWxlY3RfcXVldWUJPSBiY21fc2VsZWN0X3F1ZXVlLAorfTsKKworc3RhdGljIHN0cnVjdCBkZXZpY2VfdHlwZSB3aW1heF90eXBlID0geworCS5uYW1lCT0gIndpbWF4IiwKK307CisKK3N0YXRpYyBpbnQgYmNtX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwljbWQtPnN1cHBvcnRlZAkJPSAwOworCWNtZC0+YWR2ZXJ0aXNpbmcJPSAwOworCWNtZC0+c3BlZWQJCT0gU1BFRURfMTAwMDA7CisJY21kLT5kdXBsZXgJCT0gRFVQTEVYX0ZVTEw7CisJY21kLT5wb3J0CQk9IFBPUlRfVFA7CisJY21kLT5waHlfYWRkcmVzcwk9IDA7CisJY21kLT50cmFuc2NlaXZlcgk9IFhDVlJfSU5URVJOQUw7CisJY21kLT5hdXRvbmVnCQk9IEFVVE9ORUdfRElTQUJMRTsKKwljbWQtPm1heHR4cGt0CQk9IDA7CisJY21kLT5tYXhyeHBrdAkJPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBiY21fZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlQTUlOSV9BREFQVEVSIEFkYXB0ZXIgPSBHRVRfQkNNX0FEQVBURVIoZGV2KTsKKwlQU19JTlRFUkZBQ0VfQURBUFRFUiBwc0ludGZBZGFwdGVyID0gQWRhcHRlci0+cHZJbnRlcmZhY2VBZGFwdGVyOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihwc0ludGZBZGFwdGVyLT5pbnRlcmZhY2UpOworCisJc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJc25wcmludGYoaW5mby0+ZndfdmVyc2lvbiwgc2l6ZW9mKGluZm8tPmZ3X3ZlcnNpb24pLCAiJXUuJXUiLAorCQkgQWRhcHRlci0+dWlGbGFzaExheW91dE1ham9yVmVyc2lvbiwKKwkJIEFkYXB0ZXItPnVpRmxhc2hMYXlvdXRNaW5vclZlcnNpb24pOworCisJdXNiX21ha2VfcGF0aCh1ZGV2LCBpbmZvLT5idXNfaW5mbywgc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSk7Cit9CisKK3N0YXRpYyB1MzIgYmNtX2dldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJUE1JTklfQURBUFRFUiBBZGFwdGVyID0gR0VUX0JDTV9BREFQVEVSKGRldik7CisKKwlyZXR1cm4gQWRhcHRlci0+TGlua1VwU3RhdHVzOworfQorCitzdGF0aWMgdTMyIGJjbV9nZXRfbXNnbGV2ZWwgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJUE1JTklfQURBUFRFUiBBZGFwdGVyID0gR0VUX0JDTV9BREFQVEVSKGRldik7CisKKwlyZXR1cm4gQWRhcHRlci0+bXNnX2VuYWJsZTsKK30KKworc3RhdGljIHZvaWQgYmNtX3NldF9tc2dsZXZlbCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGxldmVsKQoreworCVBNSU5JX0FEQVBURVIgQWRhcHRlciA9IEdFVF9CQ01fQURBUFRFUihkZXYpOworCisJQWRhcHRlci0+bXNnX2VuYWJsZSA9IGxldmVsOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIGJjbV9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X3NldHRpbmdzCT0gYmNtX2dldF9zZXR0aW5ncywKKwkuZ2V0X2RydmluZm8JPSBiY21fZ2V0X2RydmluZm8sCisJLmdldF9saW5rIAk9IGJjbV9nZXRfbGluaywKKwkuZ2V0X21zZ2xldmVsCT0gYmNtX2dldF9tc2dsZXZlbCwKKwkuc2V0X21zZ2xldmVsCT0gYmNtX3NldF9tc2dsZXZlbCwKK307CisKK2ludCByZWdpc3Rlcl9uZXR3b3JrZGV2KFBNSU5JX0FEQVBURVIgQWRhcHRlcikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ID0gQWRhcHRlci0+ZGV2OworCVBTX0lOVEVSRkFDRV9BREFQVEVSIEludGZBZGFwdGVyID0gQWRhcHRlci0+cHZJbnRlcmZhY2VBZGFwdGVyOworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICp1ZGV2ID0gSW50ZkFkYXB0ZXItPmludGVyZmFjZTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqeGRldiA9IEludGZBZGFwdGVyLT51ZGV2OworCiAJaW50IHJlc3VsdDsKLSAgIAlyZXN1bHQgPSBJbnRlcmZhY2VJbml0aWFsaXplKCk7Ci0JaWYocmVzdWx0KQotCXsKLSAJCXByaW50aygiSW5pdGlhbGlzYXRpb24gZmFpbGVkIGZvciB1c2JiY20iKTsKKworCW5ldC0+bmV0ZGV2X29wcyA9ICZiY21OZXREZXZPcHM7CisJbmV0LT5ldGh0b29sX29wcyA9ICZiY21fZXRodG9vbF9vcHM7CisJbmV0LT5tdHUgPSBNVFVfU0laRTsJLyogMTQwMCBCeXRlcyAqLworCW5ldC0+dHhfcXVldWVfbGVuID0gVFhfUUxFTjsKKwluZXQtPmZsYWdzIHw9IElGRl9OT0FSUDsKKworCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldCk7CisKKwlTRVRfTkVUREVWX0RFVlRZUEUobmV0LCAmd2ltYXhfdHlwZSk7CisKKwkvKiBSZWFkIHRoZSBNQUMgQWRkcmVzcyBmcm9tIEVFUFJPTSAqLworCXJlc3VsdCA9IFJlYWRNYWNBZGRyZXNzRnJvbU5WTShBZGFwdGVyKTsKKwlpZiAocmVzdWx0ICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCWRldl9lcnIoJnVkZXYtPmRldiwKKwkJCVBGWCAiRXJyb3IgaW4gUmVhZGluZyB0aGUgbWFjIEFkZHJlc3M6ICVkIiwgcmVzdWx0KTsKKyAJCXJldHVybiAtRUlPOwogCX0KLQllbHNlCi0JewotCQlwcmludGsoIkluaXRpYWxpc2VkIHVzYmJjbSIpOwotCX0KLQlyZXR1cm4gcmVzdWx0OworCisJcmVzdWx0ID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldCk7CisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCWdibHBuZXRkZXYgPSBBZGFwdGVyLT5kZXY7CisKKwlpZiAobmV0aWZfbXNnX3Byb2JlKEFkYXB0ZXIpKQorCQlkZXZfaW5mbygmdWRldi0+ZGV2LCBQRlggIiVzOiByZWdpc3RlciB1c2ItJXMtJXMgJXBNXG4iLAorCQkJIG5ldC0+bmFtZSwgeGRldi0+YnVzLT5idXNfbmFtZSwgeGRldi0+ZGV2cGF0aCwKKwkJCSBuZXQtPmRldl9hZGRyKTsKKworCXJldHVybiAwOwogfQogCi0KLXN0YXRpYyB2b2lkIGJjbV9leGl0KHZvaWQpCit2b2lkIHVucmVnaXN0ZXJfbmV0d29ya2RldihQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCiB7Ci0gICAgcHJpbnRrKCIlcyAlcyBDYWxsaW5nIEludGVyZmFjZUV4aXRcbiIsX19GSUxFX18sIF9fRlVOQ1RJT05fXyk7Ci0JSW50ZXJmYWNlRXhpdCgpOwotICAgIHByaW50aygiJXMgJXMgSW50ZXJmYWNlRXhpdCByZXR1cm5lZFxuIixfX0ZJTEVfXywgX19GVU5DVElPTl9fKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ID0gQWRhcHRlci0+ZGV2OworCVBTX0lOVEVSRkFDRV9BREFQVEVSIEludGZBZGFwdGVyID0gQWRhcHRlci0+cHZJbnRlcmZhY2VBZGFwdGVyOworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICp1ZGV2ID0gSW50ZkFkYXB0ZXItPmludGVyZmFjZTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqeGRldiA9IEludGZBZGFwdGVyLT51ZGV2OworCisJaWYgKG5ldGlmX21zZ19wcm9iZShBZGFwdGVyKSkKKwkJZGV2X2luZm8oJnVkZXYtPmRldiwgUEZYICIlczogdW5yZWdpc3RlciB1c2ItJXMlc1xuIiwKKwkJCSBuZXQtPm5hbWUsIHhkZXYtPmJ1cy0+YnVzX25hbWUsIHhkZXYtPmRldnBhdGgpOworIAorCXVucmVnaXN0ZXJfbmV0ZGV2KEFkYXB0ZXItPmRldik7CiB9Ci0KLW1vZHVsZV9pbml0KGJjbV9pbml0KTsKLW1vZHVsZV9leGl0KGJjbV9leGl0KTsKLU1PRFVMRV9MSUNFTlNFICgiR1BMIik7Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9DbUhvc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vQ21Ib3N0LmMKaW5kZXggNmYzODhhMy4uNWFjNDU4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9DbUhvc3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0NtSG9zdC5jCkBAIC0xNSw2ICsxNSw3IEBACiAJZURlbGV0ZUNsYXNzaWZpZXIKIH1FX0NMQVNTSUZJRVJfQUNUSU9OOwogCitzdGF0aWMgVUxPTkcgR2V0TmV4dFRhcmdldEJ1ZmZlckxvY2F0aW9uKFBNSU5JX0FEQVBURVIgQWRhcHRlcixCX1VJTlQxNiB0aWQpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEZ1bmN0aW9uCSAgLQlTZWFyY2hTZmlkCkBAIC0yOCw3ICsyOSw3IEBACiAqIFJldHVybnMJICAtIFF1ZXVlIGluZGV4IGZvciB0aGlzIFNGSUQoSWYgbWF0Y2hlZCkKIAkJCQlFbHNlIEludmFsaWQgUXVldWUgSW5kZXgoSWYgTm90IG1hdGNoZWQpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1fX2lubGluZSBJTlQgU2VhcmNoU2ZpZChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsVUlOVCB1aVNmaWQpCitJTlQgU2VhcmNoU2ZpZChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsVUlOVCB1aVNmaWQpCiB7CiAJSU5UIAlpSW5kZXg9MDsKIAlmb3IoaUluZGV4PShOT19PRl9RVUVVRVMtMSk7IGlJbmRleD49MDsgaUluZGV4LS0pCkBAIC00NywyNiArNDgsMTYgQEAKICogUmV0dXJucwkgIC0gUXVldWUgaW5kZXggZm9yIHRoZSBmcmVlIFNGSUQKICoJCQkJRWxzZSByZXR1cm5zIEludmFsaWQgSW5kZXguCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotX19pbmxpbmUgSU5UIFNlYXJjaEZyZWVTZmlkKFBNSU5JX0FEQVBURVIgQWRhcHRlcikKK3N0YXRpYyBJTlQgU2VhcmNoRnJlZVNmaWQoUE1JTklfQURBUFRFUiBBZGFwdGVyKQogewogCVVJTlQgCXVpSW5kZXg9MDsKKwogCWZvcih1aUluZGV4PTA7IHVpSW5kZXggPCAoTk9fT0ZfUVVFVUVTLTEpOyB1aUluZGV4KyspCiAJCWlmKEFkYXB0ZXItPlBhY2tJbmZvW3VpSW5kZXhdLnVsU0ZJRD09MCkKIAkJCXJldHVybiB1aUluZGV4OwogCXJldHVybiBOT19PRl9RVUVVRVMrMTsKIH0KIAotX19pbmxpbmUgaW50IFNlYXJjaFZjaWQoUE1JTklfQURBUFRFUiBBZGFwdGVyLHVuc2lnbmVkIHNob3J0IHVzVmNpZCkKLXsKLQkgaW50IGlJbmRleD0wOwotCWZvcihpSW5kZXg9KE5PX09GX1FVRVVFUy0xKTtpSW5kZXg+PTA7aUluZGV4LS0pCi0JCWlmKEFkYXB0ZXItPlBhY2tJbmZvW2lJbmRleF0udXNWQ0lEX1ZhbHVlID09IHVzVmNpZCkKLQkJCXJldHVybiBpSW5kZXg7Ci0JcmV0dXJuIE5PX09GX1FVRVVFUysxOwotCi19Ci0KLQogLyoKIEZ1bmN0aW9uOgkJCQlTZWFyY2hDbHNpZAogRGVzY3JpcHRpb246CQkJVGhpcyByb3V0aW51ZSB3b3VsZCBzZWFyY2ggQ2xhc3NpZmllciAgaGF2aW5nIHNwZWNpZmllZCBDbGFzc2lmaWVySUQgYXMgaW5wdXQgcGFyYW1ldGVyCkBAIC03Niw3ICs2Nyw3IEBACiBSZXR1cm46CQkJCQlpbnQgOkNsYXNzaWZpZXIgdGFibGUgaW5kZXggb2YgbWF0Y2hpbmcgZW50cnkKICovCiAKLV9faW5saW5lIGludCBTZWFyY2hDbHNpZChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsVUxPTkcgdWxTRklELEJfVUlOVDE2ICB1aUNsYXNzaWZpZXJJRCkKK3N0YXRpYyBpbnQgU2VhcmNoQ2xzaWQoUE1JTklfQURBUFRFUiBBZGFwdGVyLFVMT05HIHVsU0ZJRCxCX1VJTlQxNiAgdWlDbGFzc2lmaWVySUQpCiB7CiAJdW5zaWduZWQgaW50IHVpQ2xhc3NpZmllckluZGV4ID0gMDsKIAlmb3IodWlDbGFzc2lmaWVySW5kZXg9MDt1aUNsYXNzaWZpZXJJbmRleDxNQVhfQ0xBU1NJRklFUlM7dWlDbGFzc2lmaWVySW5kZXgrKykKQEAgLTk0LDcgKzg1LDcgQEAKIFRoaXMgcm91dGludWUgd291bGQgc2VhcmNoIEZyZWUgYXZhaWxhYmxlIENsYXNzaWZpZXIgZW50cnkgaW4gY2xhc3NpZmllciB0YWJsZS4KIEByZXR1cm4gZnJlZSBDbGFzc2lmaWVyIEVudHJ5IGluZGV4IGluIGNsYXNzaWZpZXIgdGFibGUgZm9yIHNwZWNpZmllZCBTRgogKi8KLXN0YXRpYyBfX2lubGluZSBpbnQgU2VhcmNoRnJlZUNsc2lkKFBNSU5JX0FEQVBURVIgQWRhcHRlciAvKipBZGFwdGVyIENvbnRleHQqLworc3RhdGljIGludCBTZWFyY2hGcmVlQ2xzaWQoUE1JTklfQURBUFRFUiBBZGFwdGVyIC8qKkFkYXB0ZXIgQ29udGV4dCovCiAJCQkJCQkpCiB7CiAJdW5zaWduZWQgaW50IHVpQ2xhc3NpZmllckluZGV4ID0gMDsKQEAgLTEwNiw3ICs5Nyw3IEBACiAJcmV0dXJuIE1BWF9DTEFTU0lGSUVSUysxOwogfQogCi1WT0lEIGRlbGV0ZVNGQnlTZmlkKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgVUlOVCB1aVNlYXJjaFJ1bGVJbmRleCkKK3N0YXRpYyBWT0lEIGRlbGV0ZVNGQnlTZmlkKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgVUlOVCB1aVNlYXJjaFJ1bGVJbmRleCkKIHsKIAkvL2RlbGV0aW5nIGFsbCB0aGUgcGFja2V0IGhlbGQgaW4gdGhlIFNGCiAJZmx1c2hfcXVldWUoQWRhcHRlcix1aVNlYXJjaFJ1bGVJbmRleCk7CkBAIC05ODUsNyArOTc2LDcgQEAKIAogCWlmKEFkYXB0ZXItPlBhY2tJbmZvW3VpU2VhcmNoUnVsZUluZGV4XS5wc3RTRkluZGljYXRpb24pCiAJewotCQliY21fa2ZyZWUoQWRhcHRlci0+UGFja0luZm9bdWlTZWFyY2hSdWxlSW5kZXhdLnBzdFNGSW5kaWNhdGlvbik7CisJCWtmcmVlKEFkYXB0ZXItPlBhY2tJbmZvW3VpU2VhcmNoUnVsZUluZGV4XS5wc3RTRkluZGljYXRpb24pOwogCQlBZGFwdGVyLT5QYWNrSW5mb1t1aVNlYXJjaFJ1bGVJbmRleF0ucHN0U0ZJbmRpY2F0aW9uID0gTlVMTDsKIAl9CiAJQWRhcHRlci0+UGFja0luZm9bdWlTZWFyY2hSdWxlSW5kZXhdLnBzdFNGSW5kaWNhdGlvbiA9IHBzdEFkZEluZGljYXRpb247CkBAIC0xMDYxLDEyICsxMDUyLDYgQEAKIAkJcHN0QWRkSW5kaWNhdGlvbi0+c2ZBdXRob3JpemVkU2V0LnUzMk1heFRyYWZmaWNCdXJzdCk7CiAJQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgRFVNUF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgInUzMk1pblJlc2VydmVkVHJhZmZpY1JhdGUJOiAweCVYIiwKIAkJcHN0QWRkSW5kaWNhdGlvbi0+c2ZBdXRob3JpemVkU2V0LnUzMk1pblJlc2VydmVkVHJhZmZpY1JhdGUpOwotI2lmIDAKLQlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBEVU1QX0NPTlRST0wsIERCR19MVkxfQUxMLCAgInUzMk1pbmltdW1Ub2xlcmFibGVUcmFmZmljUmF0ZQk6IDB4JVgiLAotCQlwc3RBZGRJbmRpY2F0aW9uLT5zZkF1dGhvcml6ZWRTZXQudTMyTWluaW11bVRvbGVyYWJsZVRyYWZmaWNSYXRlKTsKLQlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBEVU1QX0NPTlRST0wsIERCR19MVkxfQUxMLCAgInUzMlJlcXVlc3R0cmFuc21pc3Npb25Qb2xpY3kJOiAweCVYIiwKLQkJcHN0QWRkSW5kaWNhdGlvbi0+c2ZBdXRob3JpemVkU2V0LnUzMlJlcXVlc3R0cmFuc21pc3Npb25Qb2xpY3kpOwotI2VuZGlmCiAJQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgRFVNUF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgInU4VmVuZG9yU3BlY2lmaWNRb1NQYXJhbUxlbmd0aAk6IDB4JVgiLAogCQlwc3RBZGRJbmRpY2F0aW9uLT5zZkF1dGhvcml6ZWRTZXQudThWZW5kb3JTcGVjaWZpY1FvU1BhcmFtTGVuZ3RoKTsKIAlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBEVU1QX0NPTlRST0wsIERCR19MVkxfQUxMLCAidThWZW5kb3JTcGVjaWZpY1FvU1BhcmFtCQk6IDB4JVgiLApAQCAtMTExNCwxMyArMTA5OSw2IEBACiAJCXBzdEFkZEluZGljYXRpb24tPnNmQXV0aG9yaXplZFNldC51OFBhZ2luZ1ByZWZlcmVuY2UpOwogCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIERVTVBfQ09OVFJPTCwgREJHX0xWTF9BTEwsICAidTE2VW5zb2xpY2l0ZWRQb2xsaW5nSW50ZXJ2YWwJCTogMHglWCIsCiAJCXBzdEFkZEluZGljYXRpb24tPnNmQXV0aG9yaXplZFNldC51MTZVbnNvbGljaXRlZFBvbGxpbmdJbnRlcnZhbCk7Ci0jaWYgMAotCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIERVTVBfQ09OVFJPTCwgREJHX0xWTF9BTEwsICAiTUJTWm9uZUlkZW50aWZpZXJhc3NpZ25tZW50TGVuZ3RoCTogMHglWCIsCi0JCXBzdEFkZEluZGljYXRpb24tPnNmQXV0aG9yaXplZFNldC5NQlNab25lSWRlbnRpZmllcmFzc2lnbm1lbnRMZW5ndGgpOwotCWZvcih1aUxvb3BJbmRleD0wOyB1aUxvb3BJbmRleCA8IE1BWF9TVFJJTkdfTEVOOyB1aUxvb3BJbmRleCsrKQotCQlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBEVU1QX0NPTlRST0wsIERCR19MVkxfQUxMLCAgIk1CU1pvbmVJZGVudGlmaWVyYXNzaWdubWVudCA6IDB4JVgiLAotCQkJcHN0QWRkSW5kaWNhdGlvbi0+c2ZBdXRob3JpemVkU2V0Lk1CU1pvbmVJZGVudGlmaWVyYXNzaWdubWVudFt1aUxvb3BJbmRleF0pOwotI2VuZGlmCiAKIAlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBEVU1QX0NPTlRST0wsIERCR19MVkxfQUxMLCAgInNmQXV0aG9yaXplZFNldC51OEhBUlFDaGFubmVsTWFwcGluZyAleCAgJXggJXggIiwKIAkJCQkqKHVuc2lnbmVkIGludCopcHN0QWRkSW5kaWNhdGlvbi0+c2ZBdXRob3JpemVkU2V0LnU4SEFSUUNoYW5uZWxNYXBwaW5nLApAQCAtMTE1OCwxMSArMTEzNiw2IEBACiAJCQlwc2ZDU1R5cGUtPmNDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlLnU4SVBUeXBlT2ZTZXJ2aWNlWzBdLAogCQkJcHNmQ1NUeXBlLT5jQ1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZS51OElQVHlwZU9mU2VydmljZVsxXSwKIAkJCXBzZkNTVHlwZS0+Y0NQYWNrZXRDbGFzc2lmaWNhdGlvblJ1bGUudThJUFR5cGVPZlNlcnZpY2VbMl0pOwotI2lmIDAKLQotCQlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBDT05OX01TRywgREJHX0xWTF9BTEwsICAidThQcm90b2NvbExlbmd0aAkJCQk6MHglWCAiLAotCQkJcHNmQ1NUeXBlLT5jQ1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZS51OFByb3RvY29sTGVuZ3RoKTsKLSNlbmRpZgogCiAJCWZvcih1aUxvb3BJbmRleD0wOyB1aUxvb3BJbmRleCA8IDE7IHVpTG9vcEluZGV4KyspCiAJCQlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBEVU1QX0NPTlRST0wsIERCR19MVkxfQUxMLCAgInU4UHJvdG9jb2wgOiAweCUwMlggIiwKQEAgLTEyNzgsMTQgKzEyNTEsNiBAQAogCQkJcHN0QWRkSW5kaWNhdGlvbi0+c2ZBZG1pdHRlZFNldC51OFFvc1BhcmFtU2V0KTsKIAlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBEVU1QX0NPTlRST0wsIERCR19MVkxfQUxMLCAgInU4VHJhZmZpY1ByaW9yaXR5CQkJOiAweCUwMlgiLAogCQkJcHN0QWRkSW5kaWNhdGlvbi0+c2ZBZG1pdHRlZFNldC51OFRyYWZmaWNQcmlvcml0eSk7Ci0jaWYgMAotCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIENPTk5fTVNHLCBEQkdfTFZMX0FMTCwgICJ1MzJNYXhTdXN0YWluZWRUcmFmZmljUmF0ZQk6IDB4JTAyWCIsCi0JCQludG9obChwc3RBZGRJbmRpY2F0aW9uLT5zZkFkbWl0dGVkU2V0LnUzMk1heFN1c3RhaW5lZFRyYWZmaWNSYXRlKSk7Ci0JQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgQ09OTl9NU0csIERCR19MVkxfQUxMLCAgInUzMk1pbmltdW1Ub2xlcmFibGVUcmFmZmljUmF0ZQk6IDB4JVgiLAotCQlwc3RBZGRJbmRpY2F0aW9uLT5zZkFkbWl0dGVkU2V0LnUzMk1pbmltdW1Ub2xlcmFibGVUcmFmZmljUmF0ZSk7Ci0JQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgQ09OTl9NU0csIERCR19MVkxfQUxMLCAgInUzMlJlcXVlc3R0cmFuc21pc3Npb25Qb2xpY3kJOiAweCVYIiwKLQkJcHN0QWRkSW5kaWNhdGlvbi0+c2ZBZG1pdHRlZFNldC51MzJSZXF1ZXN0dHJhbnNtaXNzaW9uUG9saWN5KTsKLSNlbmRpZgogCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIERVTVBfQ09OVFJPTCwgREJHX0xWTF9BTEwsICAidTMyTWF4VHJhZmZpY0J1cnN0CQkJOiAweCVYIiwKIAkJCXBzdEFkZEluZGljYXRpb24tPnNmQWRtaXR0ZWRTZXQudTMyTWF4VHJhZmZpY0J1cnN0KTsKIAlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBEVU1QX0NPTlRST0wsIERCR19MVkxfQUxMLCAgInUzMk1pblJlc2VydmVkVHJhZmZpY1JhdGUJOiAweCVYIiwKQEAgLTEzMzksMTMgKzEzMDQsNiBAQAogCQlwc3RBZGRJbmRpY2F0aW9uLT5zZkFkbWl0dGVkU2V0LnUxNlRpbWVCYXNlKTsKIAlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBEVU1QX0NPTlRST0wsIERCR19MVkxfQUxMLCAgInU4UGFnaW5nUHJlZmVyZW5jZQkJOiAweCVYIiwKIAkJcHN0QWRkSW5kaWNhdGlvbi0+c2ZBZG1pdHRlZFNldC51OFBhZ2luZ1ByZWZlcmVuY2UpOwotI2lmIDAKLQlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBEVU1QX0NPTlRST0wsIERCR19MVkxfQUxMLCAgIk1CU1pvbmVJZGVudGlmaWVyYXNzaWdubWVudExlbmd0aAk6IDB4JVgiLAotCQlwc3RBZGRJbmRpY2F0aW9uLT5zZkFkbWl0dGVkU2V0Lk1CU1pvbmVJZGVudGlmaWVyYXNzaWdubWVudExlbmd0aCk7Ci0JZm9yKHVpTG9vcEluZGV4PTA7IHVpTG9vcEluZGV4IDwgTUFYX1NUUklOR19MRU47IHVpTG9vcEluZGV4KyspCi0JCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIERVTVBfQ09OVFJPTCwgREJHX0xWTF9BTEwsICAiTUJTWm9uZUlkZW50aWZpZXJhc3NpZ25tZW50IDogMHglWCIsCi0JcHN0QWRkSW5kaWNhdGlvbi0+c2ZBZG1pdHRlZFNldC5NQlNab25lSWRlbnRpZmllcmFzc2lnbm1lbnRbdWlMb29wSW5kZXhdKTsKLSNlbmRpZgogCiAKIAlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBEVU1QX0NPTlRST0wsIERCR19MVkxfQUxMLCAgInU4VHJhZmZpY0luZGljYXRpb25QcmVmZXJlbmNlCTogMHglMDJYIiwKQEAgLTEzNzgsMTEgKzEzMzYsNiBAQAogCQkJcHNmQ1NUeXBlLT5jQ1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZS51OElQVHlwZU9mU2VydmljZVswXSwKIAkJCXBzZkNTVHlwZS0+Y0NQYWNrZXRDbGFzc2lmaWNhdGlvblJ1bGUudThJUFR5cGVPZlNlcnZpY2VbMV0sCiAJCQlwc2ZDU1R5cGUtPmNDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlLnU4SVBUeXBlT2ZTZXJ2aWNlWzJdKTsKLSNpZiAwCi0KLQkJQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgRFVNUF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgICJ1OFByb3RvY29sTGVuZ3RoCQkJOjB4JTAyWCAiLAotCQkJcHNmQ1NUeXBlLT5jQ1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZS51OFByb3RvY29sTGVuZ3RoKTsKLSNlbmRpZgogCQlmb3IodWlMb29wSW5kZXg9MDsgdWlMb29wSW5kZXggPCAxOyB1aUxvb3BJbmRleCsrKQogCQkJQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgRFVNUF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgICJ1OFByb3RvY29sOiAweCUwMlggIiwKIAkJCXBzZkNTVHlwZS0+Y0NQYWNrZXRDbGFzc2lmaWNhdGlvblJ1bGUudThQcm90b2NvbCk7CkBAIC0xNDk3LDIwICsxNDUwLDEwIEBACiAJCXBzdEFkZEluZGljYXRpb24tPnNmQWN0aXZlU2V0LnU4UW9zUGFyYW1TZXQpOwogCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIERVTVBfQ09OVFJPTCwgREJHX0xWTF9BTEwsICAidThUcmFmZmljUHJpb3JpdHkJCQk6IDB4JTAyWCIsCiAJCXBzdEFkZEluZGljYXRpb24tPnNmQWN0aXZlU2V0LnU4VHJhZmZpY1ByaW9yaXR5KTsKLSNpZiAwCi0JQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgQ09OTl9NU0csIERCR19MVkxfQUxMLCAgInUzMk1heFN1c3RhaW5lZFRyYWZmaWNSYXRlCTogMHglMDJYIiwKLQkJbnRvaGwocHN0QWRkSW5kaWNhdGlvbi0+c2ZBY3RpdmVTZXQudTMyTWF4U3VzdGFpbmVkVHJhZmZpY1JhdGUpKTsKLSNlbmRpZgogCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIERVTVBfQ09OVFJPTCwgREJHX0xWTF9BTEwsICAidTMyTWF4VHJhZmZpY0J1cnN0CQkJOiAweCVYIiwKIAkJcHN0QWRkSW5kaWNhdGlvbi0+c2ZBY3RpdmVTZXQudTMyTWF4VHJhZmZpY0J1cnN0KTsKIAlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBEVU1QX0NPTlRST0wsIERCR19MVkxfQUxMLCAgInUzMk1pblJlc2VydmVkVHJhZmZpY1JhdGUJOiAweCVYIiwKIAkJcHN0QWRkSW5kaWNhdGlvbi0+c2ZBY3RpdmVTZXQudTMyTWluUmVzZXJ2ZWRUcmFmZmljUmF0ZSk7Ci0jaWYgMAotCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIENPTk5fTVNHLCBEQkdfTFZMX0FMTCwgICJ1MzJNaW5pbXVtVG9sZXJhYmxlVHJhZmZpY1JhdGUJOiAweCVYIiwKLQkJcHN0QWRkSW5kaWNhdGlvbi0+c2ZBY3RpdmVTZXQudTMyTWluaW11bVRvbGVyYWJsZVRyYWZmaWNSYXRlKTsKLQlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBDT05OX01TRywgREJHX0xWTF9BTEwsICAidTMyUmVxdWVzdHRyYW5zbWlzc2lvblBvbGljeQk6IDB4JVgiLAotCQlwc3RBZGRJbmRpY2F0aW9uLT5zZkFjdGl2ZVNldC51MzJSZXF1ZXN0dHJhbnNtaXNzaW9uUG9saWN5KTsKLSNlbmRpZgogCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIERVTVBfQ09OVFJPTCwgREJHX0xWTF9BTEwsICAidThWZW5kb3JTcGVjaWZpY1FvU1BhcmFtTGVuZ3RoCTogMHglMDJYIiwKIAkJcHN0QWRkSW5kaWNhdGlvbi0+c2ZBY3RpdmVTZXQudThWZW5kb3JTcGVjaWZpY1FvU1BhcmFtTGVuZ3RoKTsKIAlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBEVU1QX0NPTlRST0wsIERCR19MVkxfQUxMLCAgInU4VmVuZG9yU3BlY2lmaWNRb1NQYXJhbQkJOiAweCUwMlgiLApAQCAtMTU1OCwxMyArMTUwMSw2IEBACiAJCXBzdEFkZEluZGljYXRpb24tPnNmQWN0aXZlU2V0LnUxNlRpbWVCYXNlKTsKIAlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBEVU1QX0NPTlRST0wsIERCR19MVkxfQUxMLCAgIiB1OFBhZ2luZ1ByZWZlcmVuY2UJCTogMHglWCIsCiAJCXBzdEFkZEluZGljYXRpb24tPnNmQWN0aXZlU2V0LnU4UGFnaW5nUHJlZmVyZW5jZSk7Ci0jaWYgMAotCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIERVTVBfQ09OVFJPTCwgREJHX0xWTF9BTEwsICAiIE1CU1pvbmVJZGVudGlmaWVyYXNzaWdubWVudExlbmd0aAk6IDB4JVgiLAotCQlwc3RBZGRJbmRpY2F0aW9uLT5zZkFjdGl2ZVNldC5NQlNab25lSWRlbnRpZmllcmFzc2lnbm1lbnRMZW5ndGgpOwotCWZvcih1aUxvb3BJbmRleD0wOyB1aUxvb3BJbmRleCA8IE1BWF9TVFJJTkdfTEVOOyB1aUxvb3BJbmRleCsrKQotCQlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBEVU1QX0NPTlRST0wsIERCR19MVkxfQUxMLCAgIiBNQlNab25lSWRlbnRpZmllcmFzc2lnbm1lbnQgOiAweCVYIiwKLQkJcHN0QWRkSW5kaWNhdGlvbi0+c2ZBY3RpdmVTZXQuTUJTWm9uZUlkZW50aWZpZXJhc3NpZ25tZW50W3VpTG9vcEluZGV4XSk7Ci0jZW5kaWYKIAogCiAJQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgRFVNUF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgICIgdThUcmFmZmljSW5kaWNhdGlvblByZWZlcmVuY2UJOiAweCVYIiwKQEAgLTE1OTcsMTEgKzE1MzMsNiBAQAogCQkJcHNmQ1NUeXBlLT5jQ1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZS51OElQVHlwZU9mU2VydmljZVswXSwKIAkJCXBzZkNTVHlwZS0+Y0NQYWNrZXRDbGFzc2lmaWNhdGlvblJ1bGUudThJUFR5cGVPZlNlcnZpY2VbMV0sCiAJCQlwc2ZDU1R5cGUtPmNDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlLnU4SVBUeXBlT2ZTZXJ2aWNlWzJdKTsKLSNpZiAwCi0KLQkJQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgQ09OTl9NU0csIERCR19MVkxfQUxMLCAgIiB1OFByb3RvY29sTGVuZ3RoCQkJCToweCVYICIsCi0JCQlwc2ZDU1R5cGUtPmNDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlLnU4UHJvdG9jb2xMZW5ndGgpOwotI2VuZGlmCiAJCWZvcih1aUxvb3BJbmRleD0wOyB1aUxvb3BJbmRleCA8IDE7IHVpTG9vcEluZGV4KyspCiAJCQlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBEVU1QX0NPTlRST0wsIERCR19MVkxfQUxMLCAgIiB1OFByb3RvY29sCTogMHglWCAiLAogCQkJcHNmQ1NUeXBlLT5jQ1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZS51OFByb3RvY29sKTsKQEAgLTE3MDYsMTIgKzE2MzcsOCBAQAogCQlyZXR1cm4gMDsKIAl9CiAJdWxBZGRyU0ZQYXJhbVNldCA9IG50b2hsKHVsQWRkclNGUGFyYW1TZXQpOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgQ09OTl9NU0csIERCR19MVkxfQUxMLCAgIiBSZXN0b3JlU0ZQYXJhbTogVG90YWwgV29yZHMgb2YgRFNYIE1lc3NhZ2UgVG8gUmVhZDogMHglenggIEZyb20gVGFyZ2V0IEF0IDogMHglbHggIiwKLQkJCQluQnl0ZXNUb1JlYWQvc2l6ZW9mKFVMT05HKSx1bEFkZHJTRlBhcmFtU2V0KTsKLQlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBDT05OX01TRywgREJHX0xWTF9BTEwsICAic2l6ZW9mKHN0U2VydmljZUZsb3dQYXJhbVNJKSA9ICV6eCIsIHNpemVvZihzdFNlcnZpY2VGbG93UGFyYW1TSSkpOwogCiAJLy9SZWFkIG91dCB0aGUgU0YgUGFyYW0gU2V0IEF0IHRoZSBpbmRpY2F0ZWQgTG9jYXRpb24KLQlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBDT05OX01TRywgREJHX0xWTF9BTEwsICAibkJ5dGVzVG9SZWFkID0gJXgiLCBuQnl0ZXNUb1JlYWQpOwogCWlmKHJkbShBZGFwdGVyLCB1bEFkZHJTRlBhcmFtU2V0LCAoUFVDSEFSKXB1Y0Rlc3RCdWZmZXIsIG5CeXRlc1RvUmVhZCkgPCAwKQogCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7CiAKQEAgLTE3MTksMjMgKzE2NDYsMjAgQEAKIH0KIAogCi1zdGF0aWMgX19pbmxpbmUgVUxPTkcgU3RvcmVTRlBhcmFtKFBNSU5JX0FEQVBURVIgQWRhcHRlcixQVUNIQVIgcHVjU3JjQnVmZmVyLFVMT05HICB1bEFkZHJTRlBhcmFtU2V0KQorc3RhdGljIFVMT05HIFN0b3JlU0ZQYXJhbShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsUFVDSEFSIHB1Y1NyY0J1ZmZlcixVTE9ORyAgdWxBZGRyU0ZQYXJhbVNldCkKIHsKICAgICBVSU5UCW5CeXRlc1RvV3JpdGUgPSBzaXplb2Yoc3RTZXJ2aWNlRmxvd1BhcmFtU0kpOwotCVVJTlQgCXVpUmV0VmFsID0wOworCWludCByZXQgPSAwOwogCiAJaWYodWxBZGRyU0ZQYXJhbVNldCA9PSAwIHx8IE5VTEwgPT0gcHVjU3JjQnVmZmVyKQogCXsKIAkJcmV0dXJuIDA7CiAJfQotCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIENPTk5fTVNHLCBEQkdfTFZMX0FMTCwgICIgU3RvcmVTRlBhcmFtOiBUb3RhbCBXb3JkcyBvZiBEU1ggTWVzc2FnZSBUbyBXcml0ZTogMHglelggIFRvIFRhcmdldCBBdCA6IDB4JWxYICIsKG5CeXRlc1RvV3JpdGUvc2l6ZW9mKFVMT05HKSksdWxBZGRyU0ZQYXJhbVNldCk7CiAKLQlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBDT05OX01TRywgREJHX0xWTF9BTEwsICAiV1JNICB3aXRoICV4IGJ5dGVzIixuQnl0ZXNUb1dyaXRlKTsKLQotCXVpUmV0VmFsID0gd3JtKEFkYXB0ZXIsdWxBZGRyU0ZQYXJhbVNldCwoUFVDSEFSKXB1Y1NyY0J1ZmZlciwgbkJ5dGVzVG9Xcml0ZSk7Ci0JaWYodWlSZXRWYWwgPCAwKSB7CisJcmV0ID0gd3JtKEFkYXB0ZXIsIHVsQWRkclNGUGFyYW1TZXQsICh1OCAqKXB1Y1NyY0J1ZmZlciwgbkJ5dGVzVG9Xcml0ZSk7CisJaWYgKHJldCA8IDApIHsKIAkJQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgQ09OTl9NU0csIERCR19MVkxfQUxMLCAgIiVzOiVkIFdSTSBmYWlsZWQiLF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotCQlyZXR1cm4gdWlSZXRWYWw7CisJCXJldHVybiByZXQ7CiAJfQogCXJldHVybiAxOwogfQpAQCAtMTc3OCw3ICsxNzAyLDcgQEAKIAl9CiAJLy8gRm9yIERTQV9SRVEsIG9ubHkgdXB0byAicHNmQXV0aG9yaXplZFNldCIgcGFyYW1ldGVyIHNob3VsZCBiZSBhY2Nlc3NlZCBieSBkcml2ZXIhCiAKLQlwc3RBZGRJbmRpY2F0aW9uPShzdExvY2FsU0ZBZGRJbmRpY2F0aW9uICopa21hbGxvYyhzaXplb2YoKnBzdEFkZEluZGljYXRpb24pLCBHRlBfS0VSTkVMKTsKKwlwc3RBZGRJbmRpY2F0aW9uPWttYWxsb2Moc2l6ZW9mKCpwc3RBZGRJbmRpY2F0aW9uKSwgR0ZQX0tFUk5FTCk7CiAJaWYoTlVMTD09cHN0QWRkSW5kaWNhdGlvbikKIAkJcmV0dXJuIDA7CiAKQEAgLTE4NDQsNyArMTc2OCw3IEBACiAKIAkoKnB1QnVmZmVyTGVuZ3RoKSA9IHNpemVvZihzdExvY2FsU0ZBZGRJbmRpY2F0aW9uKTsKIAkqKHN0TG9jYWxTRkFkZEluZGljYXRpb24gKilwdkJ1ZmZlciA9ICpwc3RBZGRJbmRpY2F0aW9uOwotCWJjbV9rZnJlZShwc3RBZGRJbmRpY2F0aW9uKTsKKwlrZnJlZShwc3RBZGRJbmRpY2F0aW9uKTsKIAlyZXR1cm4gMTsKIH0KIApAQCAtMTkzMSw3ICsxODU1LDcgQEAKIAlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBDT05OX01TRywgREJHX0xWTF9BTEwsICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKIAlyZXR1cm4gcHN0QWRkSW5kaWNhdGlvbkRlc3Q7CiBmYWlsZWRfcmVzdG9yZV9zZl9wYXJhbToKLQliY21fa2ZyZWUocHN0QWRkSW5kaWNhdGlvbkRlc3QpOworCWtmcmVlKHBzdEFkZEluZGljYXRpb25EZXN0KTsKIAlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBDT05OX01TRywgREJHX0xWTF9BTEwsICI8PT09PT0iICk7CiAJcmV0dXJuIE5VTEw7CiB9CkBAIC0xOTg4LDcgKzE5MTIsNyBAQAogCXJldHVybiAxOwogfQogCi1VTE9ORyBHZXROZXh0VGFyZ2V0QnVmZmVyTG9jYXRpb24oUE1JTklfQURBUFRFUiBBZGFwdGVyLEJfVUlOVDE2IHRpZCkKK3N0YXRpYyBVTE9ORyBHZXROZXh0VGFyZ2V0QnVmZmVyTG9jYXRpb24oUE1JTklfQURBUFRFUiBBZGFwdGVyLEJfVUlOVDE2IHRpZCkKIHsKIAlVTE9ORyAgdWxUYXJnZXREU1hCdWZmZXJBZGRyZXNzOwogCVVMT05HICB1bFRhcmdldERzeEJ1ZmZlckluZGV4VG9Vc2UsdWxNYXhUcnk7CkBAIC0yMDQ5LDcgKzE5NzMsNyBAQAogewogCWlmKEFkYXB0ZXItPmNhRHN4UmVxUmVzcCkKIAl7Ci0JCWJjbV9rZnJlZShBZGFwdGVyLT5jYURzeFJlcVJlc3ApOworCQlrZnJlZShBZGFwdGVyLT5jYURzeFJlcVJlc3ApOwogCX0KIAlyZXR1cm4gMDsKIApAQCAtMjEwMiw3ICsyMDI2LDcgQEAKIAogCQkJQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgQ09OTl9NU0csIERCR19MVkxfQUxMLCAgIiBWQ0lEID0gJXgiLCBudG9ocyhwc3RBZGRJbmRpY2F0aW9uLT51MTZWQ0lEKSk7CiAJCQlDb3B5QnVmZmVyVG9Db250cm9sUGFja2V0KEFkYXB0ZXIsKFBWT0lEKUFkYXB0ZXItPmNhRHN4UmVxUmVzcCk7Ci0JCQliY21fa2ZyZWUocHN0QWRkSW5kaWNhdGlvbik7CisJCQlrZnJlZShwc3RBZGRJbmRpY2F0aW9uKTsKIAkJfQogCQlicmVhazsKIAkJY2FzZSBEU0FfUlNQOgpAQCAtMjExOCw3ICsyMDQyLDcgQEAKIAkJY2FzZSBEU0FfQUNLOgogCQl7CiAJCQlVSU5UIHVpU2VhcmNoUnVsZUluZGV4PTA7Ci0JCQlzdHJ1Y3QgdGltZXZhbCB0diA9IHswfTsKKwogCQkJQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgQ09OTl9NU0csIERCR19MVkxfQUxMLCAiVkNJRDoweCVYIiwKIAkJCQludG9ocyhwc3RBZGRJbmRpY2F0aW9uLT51MTZWQ0lEKSk7CiAgICAgICAgICAgICB1aVNlYXJjaFJ1bGVJbmRleD1TZWFyY2hGcmVlU2ZpZChBZGFwdGVyKTsKQEAgLTIxNjksNyArMjA5Myw3IEBACiAJCQkJCUFkYXB0ZXItPlBhY2tJbmZvW3VpU2VhcmNoUnVsZUluZGV4XS5iQWN0aXZlPUZBTFNFOwogICAgICAgICAgICAgICAgICAgICBBZGFwdGVyLT5QYWNrSW5mb1t1aVNlYXJjaFJ1bGVJbmRleF0uYlZhbGlkPUZBTFNFOwogCQkJCQlBZGFwdGVyLT5QYWNrSW5mb1t1aVNlYXJjaFJ1bGVJbmRleF0udXNWQ0lEX1ZhbHVlPTA7Ci0JCQkJCWJjbV9rZnJlZShwc3RBZGRJbmRpY2F0aW9uKTsKKwkJCQkJa2ZyZWUocHN0QWRkSW5kaWNhdGlvbik7CiAJCQkJfQogCiAJCQkJZWxzZSBpZihwc2ZMb2NhbFNldC0+YlZhbGlkICYmIChwc3RBZGRJbmRpY2F0aW9uLT51OENDID09IDApKQpAQCAtMjIwMCwxNCArMjEyNCwxMyBAQAogCQkJCQkJCWlmKCFBZGFwdGVyLT5MaW5rVXBTdGF0dXMpCiAJCQkJCQkJewogCQkJCQkJCQluZXRpZl9jYXJyaWVyX29uKEFkYXB0ZXItPmRldik7Ci0gICAgCQkJCQkJCW5ldGlmX3N0YXJ0X3F1ZXVlKEFkYXB0ZXItPmRldik7CisJCQkJCQkJCW5ldGlmX3N0YXJ0X3F1ZXVlKEFkYXB0ZXItPmRldik7CiAJCQkJCQkJCUFkYXB0ZXItPkxpbmtVcFN0YXR1cyA9IDE7Ci0JCQkJCQkJCWRvX2dldHRpbWVvZmRheSgmdHYpOwotCisJCQkJCQkJCWlmIChuZXRpZl9tc2dfbGluayhBZGFwdGVyKSkKKwkJCQkJCQkJCXByX2luZm8oUEZYICIlczogbGluayB1cFxuIiwgQWRhcHRlci0+ZGV2LT5uYW1lKTsKIAkJCQkJCQkJYXRvbWljX3NldCgmQWRhcHRlci0+VHhQa3RBdmFpbCwgMSk7CiAJCQkJCQkJCXdha2VfdXAoJkFkYXB0ZXItPnR4X3BhY2tldF93YWl0X3F1ZXVlKTsKLQkJCQkJCQkJQWRhcHRlci0+bGlUaW1lU2luY2VMYXN0TmV0RW50cnkgPSB0di50dl9zZWM7Ci0JCQkJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgQ09OTl9NU0csIERCR19MVkxfQUxMLCAiPT09PT09PT09PT09VHggU2VydmljZSBGbG93IENyZWF0ZWQhIik7CisJCQkJCQkJCUFkYXB0ZXItPmxpVGltZVNpbmNlTGFzdE5ldEVudHJ5ID0gZ2V0X3NlY29uZHMoKTsKIAkJCQkJCQl9CiAJCQkJCQl9CiAJCQkJCX0KQEAgLTIyMTgsMTMgKzIxNDEsMTMgQEAKIAkJCQkJQWRhcHRlci0+UGFja0luZm9bdWlTZWFyY2hSdWxlSW5kZXhdLmJBY3RpdmU9RkFMU0U7CiAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXItPlBhY2tJbmZvW3VpU2VhcmNoUnVsZUluZGV4XS5iVmFsaWQ9RkFMU0U7CiAJCQkJCUFkYXB0ZXItPlBhY2tJbmZvW3VpU2VhcmNoUnVsZUluZGV4XS51c1ZDSURfVmFsdWU9MDsKLQkJCQkJYmNtX2tmcmVlKHBzdEFkZEluZGljYXRpb24pOworCQkJCQlrZnJlZShwc3RBZGRJbmRpY2F0aW9uKTsKIAkJCQl9CiAJCQl9CiAJCQllbHNlCiAJCQl7CiAJCQkJQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkRTQSBBQ0sgZGlkIG5vdCBnZXQgdmFsaWQgU0ZJRCIpOwotCQkJCWJjbV9rZnJlZShwc3RBZGRJbmRpY2F0aW9uKTsKKwkJCQlrZnJlZShwc3RBZGRJbmRpY2F0aW9uKTsKIAkJCQlyZXR1cm4gRkFMU0U7CiAJCQl9CiAJCX0KQEAgLTIyMzksNyArMjE2Miw3IEBACiAJCQkoKHN0TG9jYWxTRkNoYW5nZUluZGljYXRpb25BbHQqKSYoQWRhcHRlci0+Y2FEc3hSZXFSZXNwW0xFQURFUl9TSVpFXSkpLT51OFR5cGUgPSBEU0NfUlNQOwogCiAJCQlDb3B5QnVmZmVyVG9Db250cm9sUGFja2V0KEFkYXB0ZXIsKFBWT0lEKUFkYXB0ZXItPmNhRHN4UmVxUmVzcCk7Ci0JCQliY21fa2ZyZWUocHN0QWRkSW5kaWNhdGlvbik7CisJCQlrZnJlZShwc3RBZGRJbmRpY2F0aW9uKTsKIAkJfQogCQlicmVhazsKIAkJY2FzZSBEU0NfUlNQOgpAQCAtMjMxMiwxMyArMjIzNSwxMyBAQAogCQkJCWVsc2UgaWYocHN0Q2hhbmdlSW5kaWNhdGlvbi0+dThDQyA9PSA2KQogCQkJCXsKIAkJCQkJZGVsZXRlU0ZCeVNmaWQoQWRhcHRlcix1aVNlYXJjaFJ1bGVJbmRleCk7Ci0JCQkJCWJjbV9rZnJlZShwc3RBZGRJbmRpY2F0aW9uKTsKKwkJCQkJa2ZyZWUocHN0QWRkSW5kaWNhdGlvbik7CiAJCQkJfQogCQkJfQogCQkJZWxzZQogCQkJewogCQkJCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJEU0MgQUNLIGRpZCBub3QgZ2V0IHZhbGlkIFNGSUQiKTsKLQkJCQliY21fa2ZyZWUocHN0QWRkSW5kaWNhdGlvbik7CisJCQkJa2ZyZWUocHN0QWRkSW5kaWNhdGlvbik7CiAJCQkJcmV0dXJuIEZBTFNFOwogCQkJfQogCQl9CkBAIC0yMzU1LDcgKzIyNzgsNyBAQAogCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBDT05OX01TRywgREJHX0xWTF9BTEwsICJEU0QgQUNLIFJjZCwgbGV0IEFwcCBoYW5kbGUgaXRcbiIpOwogCQkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJYmNtX2tmcmVlKHBzdEFkZEluZGljYXRpb24pOworCQlrZnJlZShwc3RBZGRJbmRpY2F0aW9uKTsKIAkJcmV0dXJuIEZBTFNFIDsKIAl9CiAJcmV0dXJuIFRSVUU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0NtSG9zdC5oIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9DbUhvc3QuaAppbmRleCA4NDc3ODJjLi44ZjY4OTc2OWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vQ21Ib3N0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9DbUhvc3QuaApAQCAtMTUwLDggKzE1MCw2IEBACiAKIFVMT05HIFN0b3JlQ21Db250cm9sUmVzcG9uc2VNZXNzYWdlKFBNSU5JX0FEQVBURVIgQWRhcHRlcixQVk9JRCBwdkJ1ZmZlcixVSU5UICpwdUJ1ZmZlckxlbmd0aCk7CiAKLVVMT05HIEdldE5leHRUYXJnZXRCdWZmZXJMb2NhdGlvbihQTUlOSV9BREFQVEVSIEFkYXB0ZXIsQl9VSU5UMTYgdGlkKTsKLQogSU5UIEFsbG9jQWRhcHRlckRzeEJ1ZmZlcihQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwogCiBJTlQgRnJlZUFkYXB0ZXJEc3hCdWZmZXIoUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKQEAgLTE1OSw3ICsxNTcsNiBAQAogCiBCT09MRUFOIENtQ29udHJvbFJlc3BvbnNlTWVzc2FnZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsUFZPSUQgcHZCdWZmZXIpOwogCi1WT0lEIGRlbGV0ZVNGQnlTZmlkKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgVUlOVCB1aVNlYXJjaFJ1bGVJbmRleCk7CiAKICNwcmFnbWEgcGFjayAocG9wKQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0REUkluaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vRERSSW5pdC5jCmluZGV4IDg5MDdlMjEuLjFjN2RiODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vRERSSW5pdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vRERSSW5pdC5jCkBAIC0xLDYgKzEsNSBAQAogI2luY2x1ZGUgImhlYWRlcnMuaCIKIAotI2lmbmRlZiBCQ01fU0hNX0lOVEVSRkFDRQogCiAKICNkZWZpbmUgRERSX0RVTVBfSU5URVJOQUxfREVWSUNFX01FTU9SWSAweEJGQzAyQjAwCkBAIC0xODgsMTcgKzE4Nyw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MGYwMDA4NDAsMHgwRkZGMUIwMH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MGYwMDA4NzAsMHgwMDAwMDAwMn0KIAkJCQkJCQkJCSAgfTsKLSNpZiAwCi1zdGF0aWMgRERSX1NFVF9OT0RFIGFzRFBMTF84MDBNSFpbXSA9IHsKLQkJCQkJCQkJCQl7MHgwZjAwMDgxMCwweDAwMDAwRjk1fSwKLQkJCQkJCQkJCQl7MHgwZjAwMDgxMCwweDAwMDAwRjk1fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwZjAwMDgxMCwweDAwMDAwRjk1fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwZjAwMDgyMCwweDAzRjEzNjVCfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwZjAwMDg0MCwweDBGRkYwMDAwfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwZjAwMDg4MCwweDAwMDAwM0REfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwZjAwMDg2MCwweDAwMDAwMDAwfQotCQkJCQkJCQkJICB9OwotI2VuZGlmCiAKICNkZWZpbmUgVDNCX1NLSVBfQ0xPQ0tfUFJPR1JBTV9EVU1QXzEzM01IWiAxMSAgLy9pbmRleCBmb3IgMHgwRjAwNzAwMAogc3RhdGljIEREUl9TRVRfTk9ERSBhc1QzQl9ERFJTZXR0aW5nMTMzTUh6W10gPSB7Ly8gICAgICAjIERQTEwgQ2xvY2sgU2V0dGluZwpAQCAtNzg4LDcgKzc3Niw3IEBACiB7CiAJUEREUl9TRVRUSU5HIHBzRERSU2V0dGluZz1OVUxMOwogCVVMT05HIFJlZ0NvdW50PTA7Ci0JVUxPTkcgdmFsdWUgPSAwOworCVVJTlQgdmFsdWUgPSAwOwogCVVJTlQgIHVpUmVzZXRWYWx1ZSA9IDA7CiAJVUlOVCB1aUNsb2NrU2V0dGluZyA9IDA7CiAJaW50IHJldHZhbCA9IFNUQVRVU19TVUNDRVNTOwpAQCAtOTgyLDcgKzk3MCw3IEBACiAJCXsKIAkJCXZhbHVlID0gcHNERFJTZXR0aW5nLT51bFJlZ1ZhbHVlOwogCQl9Ci0JCXJldHZhbCA9IHdybWFsdChBZGFwdGVyLCBwc0REUlNldHRpbmctPnVsUmVnQWRkcmVzcywgKFBVSU5UKSZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7CisJCXJldHZhbCA9IHdybWFsdChBZGFwdGVyLCBwc0REUlNldHRpbmctPnVsUmVnQWRkcmVzcywgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKIAkJaWYoU1RBVFVTX1NVQ0NFU1MgIT0gcmV0dmFsKSB7CiAJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIiVzOiVkXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKIAkJCWJyZWFrOwpAQCAtMTI5OCw1ICsxMjg2LDQgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi0jZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9EZWJ1Zy5jIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9EZWJ1Zy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzAzZjMwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vRGVidWcuYworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLSNpbmNsdWRlICJoZWFkZXJzLmgiCi0KLXN0YXRpYyBVSU5UIGN1cnJlbnRfZGVidWdfbGV2ZWw9QkNNX1NDUkVBTTsKLQotaW50IGJjbV9wcmludF9idWZmZXIoIFVJTlQgZGVidWdfbGV2ZWwsIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsCi0JCQkJICBjaGFyICpmaWxlX25hbWUsIGludCBsaW5lX251bWJlciwgdW5zaWduZWQgY2hhciAqYnVmZmVyLCBpbnQgYnVmZmVybGVuLCBlbnVtIF9CQVNFX1RZUEUgYmFzZSkKLXsKLQlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJ1ZmZfZHVtcF9iYXNlW10gPSB7Ci0JCSJERUMiLCAiSEVYIiwgIk9DVCIsICJCSU4iCi0JfTsKLQlpZihkZWJ1Z19sZXZlbD49Y3VycmVudF9kZWJ1Z19sZXZlbCkKLQl7Ci0JCWludCBpPTA7Ci0JCXByaW50aygiXG4lczolczolZDpCdWZmZXIgZHVtcCBvZiBzaXplIDB4JXggaW4gdGhlICVzOlxuIiwgZmlsZV9uYW1lLCBmdW5jdGlvbl9uYW1lLCBsaW5lX251bWJlciwgYnVmZmVybGVuLCBidWZmX2R1bXBfYmFzZVsxXSk7Ci0JCWZvcig7aTxidWZmZXJsZW47aSsrKQotCQl7Ci0JCQlpZihpICYmICEoaSUxNikgKQotCQkJCXByaW50aygiXG4iKTsKLQkJCXN3aXRjaChiYXNlKQotCQkJewotCQkJCWNhc2UgQkNNX0JBU0VfVFlQRV9ERUM6Ci0JCQkJCXByaW50aygiJTAzZCAiLCBidWZmZXJbaV0pOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEJDTV9CQVNFX1RZUEVfT0NUOgotCQkJCQlwcmludGsoIiUweDAzbyAiLCBidWZmZXJbaV0pOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEJDTV9CQVNFX1RZUEVfQklOOgotCQkJCQlwcmludGsoIiUwMnggIiwgYnVmZmVyW2ldKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBCQ01fQkFTRV9UWVBFX0hFWDoKLQkJCQlkZWZhdWx0OgotCQkJCQlwcmludGsoIiUwMlggIiwgYnVmZmVyW2ldKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcHJpbnRrKCJcbiIpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0RlYnVnLmggYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0RlYnVnLmgKaW5kZXggM2Q3ODhiNS4uMzEzODcyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9EZWJ1Zy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vRGVidWcuaApAQCAtOSwzNCArOSw2IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjZGVmaW5lIE5PTkUgMHhGRkZGCiAKLXR5cGVkZWYgZW51bSBfQkFTRV9UWVBFCi17Ci0JQkNNX0JBU0VfVFlQRV9ERUMsCi0JQkNNX0JBU0VfVFlQRV9PQ1QsCi0JQkNNX0JBU0VfVFlQRV9CSU4sCi0JQkNNX0JBU0VfVFlQRV9IRVgsCi0JQkNNX0JBU0VfVFlQRV9OT05FLAotfSBCQVNFX1RZUEUsICpQQkFTRV9UWVBFOwotCi1pbnQgYmNtX3ByaW50X2J1ZmZlciggVUlOVCBkZWJ1Z19sZXZlbCwgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwKLQkJCQkgIGNoYXIgKmZpbGVfbmFtZSwgaW50IGxpbmVfbnVtYmVyLCB1bnNpZ25lZCBjaGFyICpidWZmZXIsIGludCBidWZmZXJsZW4sIEJBU0VfVFlQRSBiYXNlKTsKLQotI2lmZGVmIEJDTV9TSE1fSU5URVJGQUNFCi0jZGVmaW5lIENQRV9WSVJUVUFMX0VSUk9SX0NPREVfQkFTRV9BRERSCQkoMHhCRkMwMkUwMCArIDB4NEMpCi0vLyBFUlJPUiBjb2RlcyBmb3IgZGVidWdnaW5nCi1leHRlcm4gdW5zaWduZWQgY2hhciB1MzJFcnJvckNvdW50ZXIgOwotI2RlZmluZSBFUlJPUl9ERVZJQ0VfUkVNT1ZFRCAgMHgxCi0jZGVmaW5lIEVSUk9SX0xFQURFUl9MRU5HVEhfWkVSTyAgMHgyCi0jZGVmaW5lIEVSUk9SX0xFQURFUl9MRU5HVEhfQ09SUlVQVEVEICAweDMKLSNkZWZpbmUgRVJST1JfTk9fU0tCVUZGICAweDQKLQotI2RlZmluZSBFUlJPUl9ETF9NT0RVTEUgMHhhYTAwMDAwMAotZXh0ZXJuIHZvaWQgIENQRV9FUlJPUl9MT0codW5zaWduZWQgaW50IG1vZHVsZSx1bnNpZ25lZCBpbnQgY29kZSk7Ci0KLSNlbmRpZgotCi0KLQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTI0Miw0MyArMjE0LDMzIEBACiAKIC8vLS0tIE9ubHkgZm9yIGRpcmVjdCBwcmludGsnczsgImhpZGRlbiIgdG8gQVBJLgogI2RlZmluZSBEQkdfVFlQRV9QUklOVEsJCTMKLSNkZWZpbmUgUFJJTlRLU19PTgkJCTEJLy8gImhpZGRlbiIgZnJvbSBBUEksIHNldCB0byAwIHRvIHR1cm4gb2ZmIGFsbCBwcmludGsncwogCi0jZGVmaW5lIEJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBUeXBlLCBTdWJUeXBlLCBkYmdfbGV2ZWwsIHN0cmluZywgYXJncy4uLikgZG8geyBcCi0JaWYgKChEQkdfVFlQRV9QUklOVEsgPT0gVHlwZSkgJiYgKFBSSU5US1NfT04pKSB7CVwKLQkJcHJpbnRrICgiJXM6IiBzdHJpbmcsIF9fRlVOQ1RJT05fXywgIyNhcmdzKTsJXAotCQlwcmludGsoIlxuIik7CVwKLQl9IGVsc2UgaWYgKCFBZGFwdGVyKQkJCVwKLQkJOwkJCQkJCQlcCi0JZWxzZSB7CQkJCQkJCVwKLQkJaWYgKCgoZGJnX2xldmVsICYgREJHX0xWTF9CSVRNQVNLKSA8PSBBZGFwdGVyLT5zdERlYnVnU3RhdGUuZGVidWdfbGV2ZWwpICYmCVwKLQkJICAgKChUeXBlICYgQWRhcHRlci0+c3REZWJ1Z1N0YXRlLnR5cGUpICYmIChTdWJUeXBlICYgQWRhcHRlci0+c3REZWJ1Z1N0YXRlLnN1YnR5cGVbVHlwZV0pKSkgeyBcCi0JCSAgIAkJaWYgKGRiZ19sZXZlbCAmIERCR19OT19GVU5DX1BSSU5UKQkJXAotCQkJCQlwcmludGsgKHN0cmluZywgIyNhcmdzKTsJCQkJCQlcCi0JCQkJZWxzZQlcCi0JCQkJCXsJCQkJCQkJCQkJCQlcCi0JCQkJCXByaW50ayAoIiVzOiIgc3RyaW5nLCBfX0ZVTkNUSU9OX18sICMjYXJncyk7CVwKLQkJCQkJcHJpbnRrKCJcbiIpOyBcCi0JCQkJCX0gXAotCQl9CVwKLQkJfQlcCi19IHdoaWxlICgwKQorI2RlZmluZSBCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgVHlwZSwgU3ViVHlwZSwgZGJnX2xldmVsLCBzdHJpbmcsIGFyZ3MuLi4pIFwKKwlkbyB7CQkJCQkJCQlcCisJCWlmIChEQkdfVFlQRV9QUklOVEsgPT0gVHlwZSkJCQkJXAorCQkJcHJfaW5mbygiJXM6IiBzdHJpbmcsIF9fZnVuY19fLCAjI2FyZ3MpOwlcCisJCWVsc2UgaWYgKEFkYXB0ZXIgJiYJCQkJCVwKKwkJCSAoZGJnX2xldmVsICYgREJHX0xWTF9CSVRNQVNLKSA8PSBBZGFwdGVyLT5zdERlYnVnU3RhdGUuZGVidWdfbGV2ZWwgJiYgXAorCQkJIChUeXBlICYgQWRhcHRlci0+c3REZWJ1Z1N0YXRlLnR5cGUpICYmCQlcCisJCQkgKFN1YlR5cGUgJiBBZGFwdGVyLT5zdERlYnVnU3RhdGUuc3VidHlwZVtUeXBlXSkpIHsgXAorCQkJaWYgKGRiZ19sZXZlbCAmIERCR19OT19GVU5DX1BSSU5UKQkJXAorCQkJCXByaW50ayhLRVJOX0RFQlVHIHN0cmluZywgIyNhcmdzKTsJXAorCQkJZWxzZQkJCQkJCVwKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IiBzdHJpbmcsIF9fZnVuY19fLCAjI2FyZ3MpOwlcCisJCX0JCQkJCQkJXAorCX0gd2hpbGUgKDApCiAKICNkZWZpbmUgQkNNX0RFQlVHX1BSSU5UX0JVRkZFUihBZGFwdGVyLCBUeXBlLCBTdWJUeXBlLCBkYmdfbGV2ZWwsICBidWZmZXIsIGJ1ZmZlcmxlbikgZG8geyBcCi0JCWlmICgoREJHX1RZUEVfUFJJTlRLID09IFR5cGUpICYmIChQUklOVEtTX09OKSkgewlcCi0JCQliY21fcHJpbnRfYnVmZmVyKCBkYmdfbGV2ZWwsIF9fRlVOQ1RJT05fXywgX19GSUxFX18sIF9fTElORV9fLCBidWZmZXIsIGJ1ZmZlcmxlbiwgQkNNX0JBU0VfVFlQRV9IRVgpOwlcCi0JCX0gZWxzZSBpZiAoIUFkYXB0ZXIpCQkJXAotCQkJOwkJCQkJCQlcCi0JCWVsc2UgewkJCQkJCQlcCi0JCQlpZiAoKChkYmdfbGV2ZWwgJiBEQkdfTFZMX0JJVE1BU0spIDw9IEFkYXB0ZXItPnN0RGVidWdTdGF0ZS5kZWJ1Z19sZXZlbCkgICYmIFwKLQkJCSAgICgoVHlwZSAmIEFkYXB0ZXItPnN0RGVidWdTdGF0ZS50eXBlKSAmJiAoU3ViVHlwZSAmIEFkYXB0ZXItPnN0RGVidWdTdGF0ZS5zdWJ0eXBlW1R5cGVdKSkpIHsgXAotCQkJCQlpZiAoZGJnX2xldmVsICYgREJHX05PX0ZVTkNfUFJJTlQpCQlcCi0JCQkJCQliY21fcHJpbnRfYnVmZmVyKCBkYmdfbGV2ZWwsIE5VTEwsIE5VTEwsIF9fTElORV9fLCBidWZmZXIsIGJ1ZmZlcmxlbiwgQkNNX0JBU0VfVFlQRV9IRVgpOwkJCQkJCVwKLQkJCQkJZWxzZQkJCQkJCQkJCQkJCVwKLQkJCQkJCWJjbV9wcmludF9idWZmZXIoIGRiZ19sZXZlbCwgX19GVU5DVElPTl9fLCBfX0ZJTEVfXywgX19MSU5FX18sIGJ1ZmZlciwgYnVmZmVybGVuLCBCQ01fQkFTRV9UWVBFX0hFWCk7CVwKLQkJCX0JXAotCQl9CVwKLQl9IHdoaWxlICgwKQorCWlmIChEQkdfVFlQRV9QUklOVEsgPT0gVHlwZSB8fAkJCQkJXAorCSAgICAoQWRhcHRlciAmJgkJCQkJCQlcCisJICAgICAoZGJnX2xldmVsICYgREJHX0xWTF9CSVRNQVNLKSA8PSBBZGFwdGVyLT5zdERlYnVnU3RhdGUuZGVidWdfbGV2ZWwgICYmIFwKKwkgICAgIChUeXBlICYgQWRhcHRlci0+c3REZWJ1Z1N0YXRlLnR5cGUpICYmCQkJXAorCSAgICAgKFN1YlR5cGUgJiBBZGFwdGVyLT5zdERlYnVnU3RhdGUuc3VidHlwZVtUeXBlXSkpKSB7CVwKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOlxuIiwgX19mdW5jX18pOwkJCVwKKwkJcHJpbnRfaGV4X2R1bXAoS0VSTl9ERUJVRywgIiAiLCBEVU1QX1BSRUZJWF9PRkZTRVQsCVwKKwkJCSAgICAgICAxNiwgMSwgYnVmZmVyLCBidWZmZXJsZW4sIGZhbHNlKTsJXAorCX0JCQkJCQkJCVwKK30gd2hpbGUoMCkKIAogCiAjZGVmaW5lIEJDTV9TSE9XX0RFQlVHX0JJVE1BUChBZGFwdGVyKQlkbyB7IFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vSGFuZGxlQ29udHJvbFBhY2tldC5jIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9IYW5kbGVDb250cm9sUGFja2V0LmMKaW5kZXggN2IyZWMyOC4uMmIxZTllMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9IYW5kbGVDb250cm9sUGFja2V0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9IYW5kbGVDb250cm9sUGFja2V0LmMKQEAgLTExLDggKzExLDcgQEAKIEVucXVldWUgdGhlIGNvbnRyb2wgcGFja2V0IGZvciBBcHBsaWNhdGlvbi4KIEByZXR1cm4gTm9uZQogKi8KLVZPSUQgaGFuZGxlX3J4X2NvbnRyb2xfcGFja2V0KFBNSU5JX0FEQVBURVIgQWRhcHRlciwgCS8qKjxQb2ludGVyIHRvIHRoZSBBZGFwdGVyIHN0cnVjdHVyZSovCi0JCQkJCQkJCXN0cnVjdCBza19idWZmICpza2IpCQkJCS8qKjxQb2ludGVyIHRvIHRoZSBzb2NrZXQgYnVmZmVyKi8KK3N0YXRpYyBWT0lEIGhhbmRsZV9yeF9jb250cm9sX3BhY2tldChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJUFBFUl9UQVJBTkdfREFUQQlwVGFyYW5nID0gTlVMTDsKIAlCT09MRUFOIEhpZ2hQcmlvcml0eU1lc3NhZ2UgPSBGQUxTRTsKQEAgLTIwLDggKzE5LDEwIEBACiAJQ0hBUiBjbnRybF9tc2dfbWFza19iaXQgPSAwOwogCUJPT0xFQU4gZHJvcF9wa3RfZmxhZyA9IFRSVUUgOwogCVVTSE9SVCB1c1N0YXR1cyA9ICooUFVTSE9SVCkoc2tiLT5kYXRhKTsKLQlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBDUF9DVFJMX1BLVCwgREJHX0xWTF9BTEwsICI9PT09PT4iKTsKLQkvKiBHZXQgdGhlIExlYWRlciBmaWVsZCAqLworCisJaWYgKG5ldGlmX21zZ19wa3RkYXRhKEFkYXB0ZXIpKQorCQlwcmludF9oZXhfZHVtcChLRVJOX0RFQlVHLCBQRlggInJ4IGNvbnRyb2w6ICIsIERVTVBfUFJFRklYX05PTkUsCisJCQkgICAgICAgMTYsIDEsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sIDApOwogCiAJc3dpdGNoKHVzU3RhdHVzKQogCXsKQEAgLTEzNCw3ICsxMzUsNyBAQAogICAgIH0KIAl1cCgmQWRhcHRlci0+UnhBcHBDb250cm9sUXVldWVsb2NrKTsKICAgICB3YWtlX3VwKCZBZGFwdGVyLT5wcm9jZXNzX3JlYWRfd2FpdF9xdWV1ZSk7Ci0gICAgYmNtX2tmcmVlX3NrYihza2IpOworICAgIGRldl9rZnJlZV9za2Ioc2tiKTsKIAlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBDUF9DVFJMX1BLVCwgREJHX0xWTF9BTEwsICJBZnRlciB3YWtlX3VwX2ludGVycnVwdGlibGUiKTsKIH0KIApAQCAtMTg1LDMzICsxODYsNyBAQAogCQkJewogCQkJCURFUVVFVUVQQUNLRVQoQWRhcHRlci0+UnhDb250cm9sSGVhZCxBZGFwdGVyLT5SeENvbnRyb2xUYWlsKTsKIC8vCQkJCUFkYXB0ZXItPlJ4Q29udHJvbEhlYWQ9Y3RybF9wYWNrZXQtPm5leHQ7Ci0JCQkJKChQTElOVVhfREVQX0RBVEEpQWRhcHRlci0+cHZPc0RlcERhdGEpLT5uZXRzdGF0cy5yeF9wYWNrZXRzKys7Ci0JCQkJKChQTElOVVhfREVQX0RBVEEpQWRhcHRlci0+cHZPc0RlcERhdGEpLT5uZXRzdGF0cy5yeF9ieXRlcys9Ci0JCQkJKChQTEVBREVSKWN0cmxfcGFja2V0LT5kYXRhKS0+UExlbmd0aDsKIAkJCX0KLQkJCSNpZiAwICAvL0lkbGUgbW9kZSBkZWJ1ZyBwcm9maWxpbmcuLi4KLQkJCWlmKCooUFVTSE9SVCljdHJsX3BhY2tldC0+ZGF0YSA9PSBJRExFX01PREVfU1RBVFVTKQotCQkJewotCQkJCXB1aUJ1ZmZlciA9IChQVUlOVCkoY3RybF9wYWNrZXQtPmRhdGEgK3NpemVvZihVU0hPUlQpKTsKLQkJCQlpZigobnRvaGwoKnB1aUJ1ZmZlcikgPT0gR09fVE9fSURMRV9NT0RFX1BBWUxPQUQpKQotCQkJCXsKLQkJCQkJbWVtc2V0KCZ0diwgMCwgc2l6ZW9mKHR2KSk7Ci0JCQkJCWRvX2dldHRpbWVvZmRheSgmdHYpOwotCQkJCQlpZigobnRvaGwoKihwdWlCdWZmZXIrMSkpID09IDApKQotCQkJCQl7Ci0JCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIENQX0NUUkxfUEtULCBEQkdfTFZMX0FMTCwgIklkbGVNb2RlIFdha2UtdXAgTXNnIGZyb20gZi93IGF0IHRpbWUgOiVsZCBtcyIsIHR2LnR2X3NlYyAqMTAwMCArIHR2LnR2X3VzZWMgLzEwMDApOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIENQX0NUUkxfUEtULCBEQkdfTFZMX0FMTCwgIklkbGVNb2RlIHJlcSBNc2cgZnJvbSBmL3cgYXQgdGltZSA6JWxkIG1zIiwgdHYudHZfc2VjICoxMDAwICsgdHYudHZfdXNlYyAvMTAwMCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZigobnRvaGwoKnB1aUJ1ZmZlcikgPT0gSURMRV9NT0RFX1NGX1VQREFURV9NU0cpKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBDUF9DVFJMX1BLVCwgREJHX0xWTF9BTEwsICJHT1QgSURMRV9NT0RFX1NGX1VQREFURSBNU0cgYXQgdGltZSA6JWxkIG1zIiwgdHYudHZfc2VjICoxMDAwICsgdHYudHZfdXNlYyAvMTAwMCk7Ci0JCQkJfQotCQkJfQotCQkJI2VuZGlmCiAKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZBZGFwdGVyLT5jb250cm9sX3F1ZXVlX2xvY2ssIGZsYWdzKTsKIAkJIAloYW5kbGVfcnhfY29udHJvbF9wYWNrZXQoQWRhcHRlciwgY3RybF9wYWNrZXQpOwpAQCAtMjM0LDcgKzIwOSw3IEBACiAJCXsKIAkJCVBhY2tldFRvRHJvcD1wVGFyYW5nLT5SeEFwcENvbnRyb2xIZWFkOwogCQkJREVRVUVVRVBBQ0tFVChwVGFyYW5nLT5SeEFwcENvbnRyb2xIZWFkLHBUYXJhbmctPlJ4QXBwQ29udHJvbFRhaWwpOwotCQkJYmNtX2tmcmVlX3NrYihQYWNrZXRUb0Ryb3ApOworCQkJZGV2X2tmcmVlX3NrYihQYWNrZXRUb0Ryb3ApOwogCQl9CiAJCXBUYXJhbmctPkFwcEN0cmxRdWV1ZUxlbiA9IDA7CiAJCS8vZHJvcHBlZCBjb250cmwgcGFja2V0IHN0YXRpc3RpY3MgYWxzbyBzaG91bGQgYmUgcmVzZXQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0hvc3RNaWJzLmggYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0hvc3RNaWJzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YTU3ODMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9Ib3N0TWlicy5oCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jaWZuZGVmIF9IT1NUX01JQlNfSAotI2RlZmluZSBfSE9TVF9NSUJTX0gKLQotSU5UIFByb2Nlc3NHZXRIb3N0TWlicyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIsCi0JCQkJCQkgIFBWT0lEIGlvQnVmZmVyLAotCQkJCQkJICBVTE9ORyBpbnB1dEJ1ZmZlckxlbmd0aCk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vSVB2NlByb3RvY29sLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0lQdjZQcm90b2NvbC5jCmluZGV4IDVlYzNiODkuLjkxYjZmYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vSVB2NlByb3RvY29sLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9JUHY2UHJvdG9jb2wuYwpAQCAtMSw1ICsxLDkgQEAKICNpbmNsdWRlICJoZWFkZXJzLmgiCiAKK3N0YXRpYyBCT09MRUFOIE1hdGNoU3JjSXB2NkFkZHJlc3MoU19DTEFTU0lGSUVSX1JVTEUgKnBzdENsYXNzaWZpZXJSdWxlLElQVjZIZWFkZXIgKnBzdElwdjZIZWFkZXIpOworc3RhdGljIEJPT0xFQU4gTWF0Y2hEZXN0SXB2NkFkZHJlc3MoU19DTEFTU0lGSUVSX1JVTEUgKnBzdENsYXNzaWZpZXJSdWxlLElQVjZIZWFkZXIgKnBzdElwdjZIZWFkZXIpOworc3RhdGljIFZPSUQgRHVtcElwdjZIZWFkZXIoSVBWNkhlYWRlciAqcHN0SXB2NkhlYWRlcik7CisKIHN0YXRpYyBVQ0hBUiAqIEdldE5leHRJUFY2Q2hhaW5lZEhlYWRlcihVQ0hBUiAqKnBwdWNQYXlsb2FkLFVDSEFSICpwdWNOZXh0SGVhZGVyLEJPT0xFQU4gKmJQYXJzZURvbmUsVVNIT1JUICpwdXNQYXlsb2FkTGVuZ3RoKQogewogCVVDSEFSICpwdWNSZXRIZWFkZXJQdHIgPSBOVUxMOwpAQCAtMjU3LDcgKzI2MSw3IEBACiB9CiAKIAotQk9PTEVBTiBNYXRjaFNyY0lwdjZBZGRyZXNzKFNfQ0xBU1NJRklFUl9SVUxFICpwc3RDbGFzc2lmaWVyUnVsZSxJUFY2SGVhZGVyICpwc3RJcHY2SGVhZGVyKQorc3RhdGljIEJPT0xFQU4gTWF0Y2hTcmNJcHY2QWRkcmVzcyhTX0NMQVNTSUZJRVJfUlVMRSAqcHN0Q2xhc3NpZmllclJ1bGUsSVBWNkhlYWRlciAqcHN0SXB2NkhlYWRlcikKIHsKIAlVSU5UIHVpTG9vcEluZGV4PTA7CiAJVUlOVCAgdWlJcHY2QWRkSW5kZXg9MDsKQEAgLTMxMCw3ICszMTQsNyBAQAogCXJldHVybiBGQUxTRTsKIH0KIAotQk9PTEVBTiBNYXRjaERlc3RJcHY2QWRkcmVzcyhTX0NMQVNTSUZJRVJfUlVMRSAqcHN0Q2xhc3NpZmllclJ1bGUsSVBWNkhlYWRlciAqcHN0SXB2NkhlYWRlcikKK3N0YXRpYyBCT09MRUFOIE1hdGNoRGVzdElwdjZBZGRyZXNzKFNfQ0xBU1NJRklFUl9SVUxFICpwc3RDbGFzc2lmaWVyUnVsZSxJUFY2SGVhZGVyICpwc3RJcHY2SGVhZGVyKQogewogCVVJTlQgdWlMb29wSW5kZXg9MDsKIAlVSU5UICB1aUlwdjZBZGRJbmRleD0wOwpAQCAtMzc2LDcgKzM4MCw3IEBACiAKIH0KIAotVk9JRCBEdW1wSXB2NkhlYWRlcihJUFY2SGVhZGVyICpwc3RJcHY2SGVhZGVyKQorc3RhdGljIFZPSUQgRHVtcElwdjZIZWFkZXIoSVBWNkhlYWRlciAqcHN0SXB2NkhlYWRlcikKIHsKIAlVQ0hBUiB1Y1ZlcnNpb247CiAJVUNIQVIgIHVjUHJpbyA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0lQdjZQcm90b2NvbEhkci5oIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9JUHY2UHJvdG9jb2xIZHIuaAppbmRleCBiOTNmNzkwLi5hMGRiNWExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0lQdjZQcm90b2NvbEhkci5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vSVB2NlByb3RvY29sSGRyLmgKQEAgLTEwMSwxNSArMTAxLDEyIEBACiAKIAogLy9GdW5jdGlvbiBQcm90b3R5cGVzCi1CT09MRUFOIE1hdGNoU3JjSXB2NkFkZHJlc3MoU19DTEFTU0lGSUVSX1JVTEUgKnBzdENsYXNzaWZpZXJSdWxlLElQVjZIZWFkZXIgKnBzdElwdjZIZWFkZXIpOwotQk9PTEVBTiBNYXRjaERlc3RJcHY2QWRkcmVzcyhTX0NMQVNTSUZJRVJfUlVMRSAqcHN0Q2xhc3NpZmllclJ1bGUsSVBWNkhlYWRlciAqcHN0SXB2NkhlYWRlcik7CiAKIFVTSE9SVAlJcFZlcnNpb242KFBNSU5JX0FEQVBURVIgQWRhcHRlciwgLyoqPCBQb2ludGVyIHRvIHRoZSBkcml2ZXIgY29udHJvbCBzdHJ1Y3R1cmUgKi8KIAkJCQkJUFZPSUQgcGNJcEhlYWRlciwgLyoqPFBvaW50ZXIgdG8gdGhlIElQIEhkciBvZiB0aGUgcGFja2V0Ki8KIAkJCQkJU19DTEFTU0lGSUVSX1JVTEUgKnBzdENsYXNzaWZpZXJSdWxlICk7CiAKIFZPSUQgRHVtcElwdjZBZGRyZXNzKFVMT05HICpwdUlwdjZBZGRyZXNzKTsKLVZPSUQgRHVtcElwdjZIZWFkZXIoSVBWNkhlYWRlciAqcHN0SXB2NkhlYWRlcik7CiAKIGV4dGVybiBCT09MRUFOIE1hdGNoU3JjUG9ydChTX0NMQVNTSUZJRVJfUlVMRSAqcHN0Q2xhc3NpZmllclJ1bGUsVVNIT1JUIHVzaFNyY1BvcnQpOwogZXh0ZXJuIEJPT0xFQU4gTWF0Y2hEZXN0UG9ydChTX0NMQVNTSUZJRVJfUlVMRSAqcHN0Q2xhc3NpZmllclJ1bGUsVVNIT1JUIHVzaFNyY1BvcnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VEbGQuYyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlRGxkLmMKaW5kZXggNjBjMGYyOS4uZGY2NGFjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VEbGQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZURsZC5jCkBAIC0xLDIwICsxLDE4IEBACiAjaW5jbHVkZSAiaGVhZGVycy5oIgogCi0jaWZuZGVmIEJDTV9TSE1fSU5URVJGQUNFCiAKIGludCBJbnRlcmZhY2VGaWxlRG93bmxvYWQoIFBWT0lEIGFyZywKICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBmaWxlICpmbHAsCiAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgb25fY2hpcF9sb2MpCiB7Ci0gICAgY2hhciAgICAgICAgICAgICpidWZmPU5VTEw7CiAgICAvLyB1bnNpZ25lZCBpbnQgICAgcmVnPTA7CiAgICAgbW1fc2VnbWVudF90ICAgIG9sZGZzPXswfTsKICAgICBpbnQgICAgICAgICAgICAgZXJybm89MCwgbGVuPTAgLyosaXNfY29uZmlnX2ZpbGUgPSAwKi87CiAgICAgbG9mZl90ICAgICAgICAgIHBvcz0wOwogCVBTX0lOVEVSRkFDRV9BREFQVEVSIHBzSW50ZkFkYXB0ZXIgPSAoUFNfSU5URVJGQUNFX0FEQVBURVIpYXJnOwogCS8vUE1JTklfQURBUFRFUiBBZGFwdGVyID0gcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyOworICAgIGNoYXIgICAgICAgICAgICAqYnVmZj1rbWFsbG9jKE1BWF9UUkFOU0ZFUl9DVFJMX0JZVEVfVVNCLCBHRlBfS0VSTkVMKTsKIAotICAgIGJ1ZmY9KFBDSEFSKWttYWxsb2MoTUFYX1RSQU5TRkVSX0NUUkxfQllURV9VU0IsIEdGUF9LRVJORUwpOwogICAgIGlmKCFidWZmKQogICAgIHsKICAgICAgICAgcmV0dXJuIC1FTk9NRU07CkBAIC00OSw3ICs0Nyw3IEBACiAgICAgICAgIG9uX2NoaXBfbG9jKz1NQVhfVFJBTlNGRVJfQ1RSTF9CWVRFX1VTQjsKIAl9LyogRW5kIG9mIGZvcig7OykqLwogCi0JYmNtX2tmcmVlKGJ1ZmYpOworCWtmcmVlKGJ1ZmYpOwogICAgIHJldHVybiBlcnJubzsKIH0KIApAQCAtNTcsNyArNTUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGZpbGUgKmZscCwKICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBvbl9jaGlwX2xvYykKIHsKLSAgICBjaGFyICAgICAgICAgICAgKmJ1ZmY9TlVMTCwgKmJ1ZmZfcmVhZGJhY2s9TlVMTDsKKyAgICBjaGFyICAgICAgICAgICAgKmJ1ZmYsICpidWZmX3JlYWRiYWNrOwogICAgIHVuc2lnbmVkIGludCAgICByZWc9MDsKICAgICBtbV9zZWdtZW50X3QgICAgb2xkZnM9ezB9OwogICAgIGludCAgICAgICAgICAgICBlcnJubz0wLCBsZW49MCwgaXNfY29uZmlnX2ZpbGUgPSAwOwpAQCAtNjYsMTIgKzY0LDEyIEBACiAJSU5UCQkJCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwogCVBTX0lOVEVSRkFDRV9BREFQVEVSIHBzSW50ZkFkYXB0ZXIgPSAoUFNfSU5URVJGQUNFX0FEQVBURVIpYXJnOwogCi0gICAgYnVmZj0oUENIQVIpa21hbGxvYyhNQVhfVFJBTlNGRVJfQ1RSTF9CWVRFX1VTQiwgR0ZQX0RNQSk7Ci0gICAgYnVmZl9yZWFkYmFjaz0oUENIQVIpa21hbGxvYyhNQVhfVFJBTlNGRVJfQ1RSTF9CWVRFX1VTQiAsIEdGUF9ETUEpOworICAgIGJ1ZmY9a21hbGxvYyhNQVhfVFJBTlNGRVJfQ1RSTF9CWVRFX1VTQiwgR0ZQX0RNQSk7CisgICAgYnVmZl9yZWFkYmFjaz1rbWFsbG9jKE1BWF9UUkFOU0ZFUl9DVFJMX0JZVEVfVVNCICwgR0ZQX0RNQSk7CiAgICAgaWYoIWJ1ZmYgfHwgIWJ1ZmZfcmVhZGJhY2spCiAgICAgewotICAgICAgICBiY21fa2ZyZWUoYnVmZik7Ci0gICAgICAgIGJjbV9rZnJlZShidWZmX3JlYWRiYWNrKTsKKyAgICAgICAga2ZyZWUoYnVmZik7CisgICAgICAgIGtmcmVlKGJ1ZmZfcmVhZGJhY2spOwogCiAgICAgICAgIHJldHVybiAtRU5PTUVNOwogICAgIH0KQEAgLTEzOCw4ICsxMzYsOCBAQAogICAgICAgICBvbl9jaGlwX2xvYys9TUFYX1RSQU5TRkVSX0NUUkxfQllURV9VU0I7CiAgICAgfS8qIEVuZCBvZiB3aGlsZSgxKSovCiBleGl0OgotICAgIGJjbV9rZnJlZShidWZmKTsKLSAgICBiY21fa2ZyZWUoYnVmZl9yZWFkYmFjayk7CisgICAga2ZyZWUoYnVmZik7CisgICAga2ZyZWUoYnVmZl9yZWFkYmFjayk7CiAJcmV0dXJuIFN0YXR1czsKIH0KIApAQCAtMTY1LDcgKzE2Myw3IEBACiAJCQlwc0Z3SW5mby0+cHZNYXBwZWRGaXJtd2FyZUFkZHJlc3MsIHBzRndJbmZvLT51MzJGaXJtd2FyZUxlbmd0aCk7CiAJaWYocmV0dmFsKQogCXsKLQkJYmNtX2tmcmVlIChBZGFwdGVyLT5wc3RhcmdldHBhcmFtcyk7CisJCWtmcmVlKEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zKTsKIAkJQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMgPSBOVUxMOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CkBAIC0yMzEsNDEgKzIyOSw2IEBACiAKIAlyZXR1cm4gcmV0dmFsOwogfQotI2lmIDAKLXN0YXRpYyBpbnQgYmNtX2Rvd25sb2FkX2J1ZmZlcihQTUlOSV9BREFQVEVSIEFkYXB0ZXIsCi0JdW5zaWduZWQgY2hhciAqbWFwcGVkYnVmZmVyLCB1bnNpZ25lZCBpbnQgdTMyRmlybXdhcmVMZW5ndGgsCi0JdW5zaWduZWQgbG9uZyB1MzJTdGFydGluZ0FkZHJlc3MpCi17Ci0gICAgY2hhciAgICAgICAgICAgICpidWZmPU5VTEw7Ci0gICAgdW5zaWduZWQgaW50ICAgIGxlbiA9IDA7Ci0JaW50IAkJCXJldHZhbCA9IFNUQVRVU19TVUNDRVNTOwotCWJ1ZmYgPSBremFsbG9jKE1BWF9UUkFOU0ZFUl9DVFJMX0JZVEVfVVNCLCBHRlBfS0VSTkVMKTsKLQotCWxlbiA9IHUzMkZpcm13YXJlTGVuZ3RoOwotCi0Jd2hpbGUodTMyRmlybXdhcmVMZW5ndGgpCi0JewotCQlsZW4gPSBNSU5fVkFMICh1MzJGaXJtd2FyZUxlbmd0aCwgTUFYX1RSQU5TRkVSX0NUUkxfQllURV9VU0IpOwotCQlpZihTVEFUVVNfU1VDQ0VTUyAhPSAocmV0dmFsID0gY29weV9mcm9tX3VzZXIoYnVmZiwKLQkJCQkodW5zaWduZWQgY2hhciAqKW1hcHBlZGJ1ZmZlciwgbGVuKSkpCi0JCXsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgImNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIik7Ci0JCQlicmVhazsKLQkJfQotCQlyZXR2YWwgPSB3cm0gKEFkYXB0ZXIsIHUzMlN0YXJ0aW5nQWRkcmVzcywgYnVmZiwgbGVuKTsKLQkJaWYocmV0dmFsKQotCQl7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJ3cm0gZmFpbGVkXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JCXUzMlN0YXJ0aW5nQWRkcmVzcyAJKz0gbGVuOwotCQl1MzJGaXJtd2FyZUxlbmd0aCAgCS09IGxlbjsKLQkJbWFwcGVkYnVmZmVyCSAgIAkrPWxlbjsKLQl9Ci0JYmNtX2tmcmVlKGJ1ZmYpOwotCXJldHVybiByZXR2YWw7Ci19Ci0jZW5kaWYKIHN0YXRpYyBpbnQgYmNtX2NvbXBhcmVfYnVmZl9jb250ZW50cyh1bnNpZ25lZCBjaGFyICpyZWFkYmFja2J1ZmYsCiAJdW5zaWduZWQgY2hhciAqYnVmZix1bnNpZ25lZCBpbnQgbGVuKQogewpAQCAtMjk3LDU4ICsyNjAsNiBAQAogCX0KIAlyZXR1cm4gcmV0dmFsOwogfQotI2lmIDAKLXN0YXRpYyBpbnQgYmNtX2J1ZmZlcl9yZWFkYmFjayhQTUlOSV9BREFQVEVSIEFkYXB0ZXIsCi0JdW5zaWduZWQgY2hhciAqbWFwcGVkYnVmZmVyLCB1bnNpZ25lZCBpbnQgdTMyRmlybXdhcmVMZW5ndGgsCi0JdW5zaWduZWQgbG9uZyB1MzJTdGFydGluZ0FkZHJlc3MpCi17Ci0JdW5zaWduZWQgY2hhciAqYnVmZiA9IE5VTEw7Ci0JdW5zaWduZWQgY2hhciAqcmVhZGJhY2tidWZmID0gTlVMTDsKLQl1bnNpZ25lZCBpbnQgIGxlbiA9IHUzMkZpcm13YXJlTGVuZ3RoOwotCWludCByZXR2YWwgPSBTVEFUVVNfU1VDQ0VTUzsKLQotICAgIGJ1ZmY9KHVuc2lnbmVkIGNoYXIgKilremFsbG9jKE1BWF9UUkFOU0ZFUl9DVFJMX0JZVEVfVVNCLCBHRlBfS0VSTkVMKTsKLQlpZihOVUxMID09IGJ1ZmYpCi0JCXJldHVybiAtRU5PTUVNOwotCXJlYWRiYWNrYnVmZiA9ICAodW5zaWduZWQgY2hhciAqKWt6YWxsb2MoTUFYX1RSQU5TRkVSX0NUUkxfQllURV9VU0IsCi0JCQkJCUdGUF9LRVJORUwpOwotCWlmKE5VTEwgPT0gcmVhZGJhY2tidWZmKQotCXsKLQkJYmNtX2tmcmVlKGJ1ZmYpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0Jd2hpbGUgKHUzMkZpcm13YXJlTGVuZ3RoICYmICFyZXR2YWwpCi0JewotCQlsZW4gPSBNSU5fVkFMICh1MzJGaXJtd2FyZUxlbmd0aCwgTUFYX1RSQU5TRkVSX0NUUkxfQllURV9VU0IpOwotCi0JCS8qIHJlYWQgZnJvbSB0aGUgYXBwbCBidWZmIGFuZCB0aGVuIHJlYWQgZnJvbSB0aGUgdGFyZ2V0LCBjb21wYXJlICovCi0JCWlmKFNUQVRVU19TVUNDRVNTICE9IChyZXR2YWwgPSBjb3B5X2Zyb21fdXNlcihidWZmLAotCQkJCSh1bnNpZ25lZCBjaGFyICopbWFwcGVkYnVmZmVyLCBsZW4pKSkKLQkJewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JCXJldHZhbCA9IHJkbSAoQWRhcHRlciwgdTMyU3RhcnRpbmdBZGRyZXNzLCByZWFkYmFja2J1ZmYsIGxlbik7Ci0JCWlmKHJldHZhbCkKLQkJewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAicmRtIGZhaWxlZFxuIik7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChTVEFUVVNfU1VDQ0VTUyAhPQotCQkJKHJldHZhbCA9IGJjbV9jb21wYXJlX2J1ZmZfY29udGVudHMgKHJlYWRiYWNrYnVmZiwgYnVmZiwgbGVuKSkpCi0JCXsKLQkJCWJyZWFrOwotCQl9Ci0JCXUzMlN0YXJ0aW5nQWRkcmVzcyAJKz0gbGVuOwotCQl1MzJGaXJtd2FyZUxlbmd0aCAgCS09IGxlbjsKLQkJbWFwcGVkYnVmZmVyCSAgIAkrPWxlbjsKLQl9LyogZW5kIG9mIHdoaWxlICh1MzJGaXJtd2FyZUxlbmd0aCAmJiAhcmV0dmFsKSAqLwotCWJjbV9rZnJlZShidWZmKTsKLQliY21fa2ZyZWUocmVhZGJhY2tidWZmKTsKLQlyZXR1cm4gcmV0dmFsOwotfQotI2VuZGlmCiBpbnQgYmNtX2lvY3RsX2Z3X2Rvd25sb2FkKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgRklSTVdBUkVfSU5GTyAqcHNGd0luZm8pCiB7CiAJaW50IHJldHZhbCA9IFNUQVRVU19TVUNDRVNTOwpAQCAtMzc1LDcgKzI4Niw3IEBACiAJZWxzZQogCXsKIAotCQlidWZmID0gKFBVQ0hBUilremFsbG9jKHBzRndJbmZvLT51MzJGaXJtd2FyZUxlbmd0aCxHRlBfS0VSTkVMKTsKKwkJYnVmZiA9IGt6YWxsb2MocHNGd0luZm8tPnUzMkZpcm13YXJlTGVuZ3RoLEdGUF9LRVJORUwpOwogCQlpZihidWZmPT1OVUxMKQogCQl7CiAJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsIkZhaWxlZCBpbiBhbGxvY2F0aW9uIG1lbW9yeSIpOwpAQCAtMzg5LDIzICszMDAsNiBAQAogCQkJZ290byBlcnJvciA7CiAJCX0KIAotCQkjaWYgMAotCQlyZXR2YWwgPSBiY21fZG93bmxvYWRfYnVmZmVyKEFkYXB0ZXIsCi0JCQkJKHVuc2lnbmVkIGNoYXIgKilwc0Z3SW5mby0+cHZNYXBwZWRGaXJtd2FyZUFkZHJlc3MsCi0JCQkJcHNGd0luZm8tPnUzMkZpcm13YXJlTGVuZ3RoLCBwc0Z3SW5mby0+dTMyU3RhcnRpbmdBZGRyZXNzKTsKLQkJaWYocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQl7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJVc2VyIHNwYWNlIGJ1ZmZlciBkb3dubG9hZCBmYWlscy4uLi4iKTsKLQkJfQotCQlyZXR2YWwgPSBiY21fYnVmZmVyX3JlYWRiYWNrIChBZGFwdGVyLAotCQkJCSh1bnNpZ25lZCBjaGFyICopcHNGd0luZm8tPnB2TWFwcGVkRmlybXdhcmVBZGRyZXNzLAotCQkJCXBzRndJbmZvLT51MzJGaXJtd2FyZUxlbmd0aCwgcHNGd0luZm8tPnUzMlN0YXJ0aW5nQWRkcmVzcyk7Ci0KLQkJaWYocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQl7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJyZWFkIGJhY2sgdmVyaWZpZXIgZmFpbGVkIC4uLi4iKTsKLQkJfQotCQkjZW5kaWYKIAkJcmV0dmFsID0gYnVmZkRubGRWZXJpZnkoQWRhcHRlciwKIAkJCQkJYnVmZiwKIAkJCQkJcHNGd0luZm8tPnUzMkZpcm13YXJlTGVuZ3RoLApAQCAtNDE3LDcgKzMxMSw3IEBACiAJCX0KIAl9CiBlcnJvcjoKLQliY21fa2ZyZWUoYnVmZik7CisJa2ZyZWUoYnVmZik7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtNDUwLDExICszNDQsMTAgQEAKIAkJCVBVQ0hBUiBtYXBwZWRidWZmZXIsIFVJTlQgdTMyRmlybXdhcmVMZW5ndGgsCiAJCQlVTE9ORyB1MzJTdGFydGluZ0FkZHJlc3MpCiB7Ci0JUFVDSEFSIHJlYWRiYWNrYnVmZiA9IE5VTEw7CiAJVUlOVCBsZW4gPSB1MzJGaXJtd2FyZUxlbmd0aDsKIAlJTlQgcmV0dmFsID0gU1RBVFVTX1NVQ0NFU1M7CisJUFVDSEFSIHJlYWRiYWNrYnVmZiA9IGt6YWxsb2MoTUFYX1RSQU5TRkVSX0NUUkxfQllURV9VU0IsR0ZQX0tFUk5FTCk7CiAKLQlyZWFkYmFja2J1ZmYgPSAoUFVDSEFSKWt6YWxsb2MoTUFYX1RSQU5TRkVSX0NUUkxfQllURV9VU0IsR0ZQX0tFUk5FTCk7CiAJaWYoTlVMTCA9PSByZWFkYmFja2J1ZmYpCiAJewogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJNRU1PUlkgQUxMT0NBVElPTiBGQUlMRUQiKTsKQEAgLTQ4MCw3ICszNzMsNyBAQAogCQl1MzJGaXJtd2FyZUxlbmd0aCAgCS09IGxlbjsKIAkJbWFwcGVkYnVmZmVyCSAgIAkrPWxlbjsKIAl9LyogZW5kIG9mIHdoaWxlICh1MzJGaXJtd2FyZUxlbmd0aCAmJiAhcmV0dmFsKSAqLwotCWJjbV9rZnJlZShyZWFkYmFja2J1ZmYpOworCWtmcmVlKHJlYWRiYWNrYnVmZik7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtNTA2LDUgKzM5OSw0IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlSWRsZU1vZGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlSWRsZU1vZGUuYwppbmRleCAwNzUwMzgyLi5iZjVjMGFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZUlkbGVNb2RlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VJZGxlTW9kZS5jCkBAIC05OCwxNCArOTgsNiBAQAogCQkJQWRhcHRlci0+YlRyaWVkVG9XYWtlVXBGcm9tbG93UG93ZXJNb2RlID0gRkFMU0U7CiAKIAkJCXdha2VfdXAoJkFkYXB0ZXItPmxvd3Bvd2VyX21vZGVfd2FpdF9xdWV1ZSk7Ci0JCSNpZiAwCi0JCQlpZihBZGFwdGVyLT5MRURJbmZvLmxlZF90aHJlYWRfcnVubmluZyAmIEJDTV9MRURfVEhSRUFEX1JVTk5JTkdfQUNUSVZFTFkpCi0JCQl7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBJRExFX01PREUsIERCR19MVkxfQUxMLCJMRUQgVGhyZWFkIGlzIFJ1bm5pbmcuIEhlbmNlIFNldHRpbmcgdGhlIExFRCBFdmVudCBhcyBJRExFTU9ERV9FWElUIik7Ci0JCQkJQWRhcHRlci0+RHJpdmVyU3RhdGUgPSBJRExFTU9ERV9FWElUOwotCQkJCXdha2VfdXAoJkFkYXB0ZXItPkxFREluZm8ubm90aWZ5X2xlZF9ldmVudCk7Ci0JCQl9Ci0JCSNlbmRpZgogCiAJCX0KIAkJZWxzZQpAQCAtMTU0LDE3ICsxNDYsNyBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLQotVk9JRCBJbnRlcmZhY2VXcml0ZUlkbGVNb2RlV2FrZVBhdHRlcm4oUE1JTklfQURBUFRFUiBBZGFwdGVyKQotewotLyoJQmVjZWVtV3JpdGVNZW1vcnlVc2hvcnQoQWRhcHRlciwgSG9zdDJDUFVfTWFpbGJveF9Mb3csIDB4MWQxZSk7Ci0JQmVjZWVtV3JpdGVNZW1vcnlVc2hvcnQoQWRhcHRlciwgSG9zdDJDUFVfTWFpbGJveF9Mb3csIDB4MWQxZSk7Ci0JQmVjZWVtV3JpdGVNZW1vcnlVc2hvcnQoQWRhcHRlciwgSG9zdDJDUFVfTWFpbGJveF9VcHAsIDB4ZDBlYSk7Ci0JQmVjZWVtV3JpdGVNZW1vcnlVc2hvcnQoQWRhcHRlciwgSG9zdDJDUFVfTWFpbGJveF9VcHAsIDB4ZDBlYSk7Ki8KLQlyZXR1cm47Ci19Ci0KLWludCBJbnRlcmZhY2VBYm9ydElkbGVtb2RlKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgdW5zaWduZWQgaW50IFBhdHRlcm4pCitzdGF0aWMgaW50IEludGVyZmFjZUFib3J0SWRsZW1vZGUoUE1JTklfQURBUFRFUiBBZGFwdGVyLCB1bnNpZ25lZCBpbnQgUGF0dGVybikKIHsKIAlpbnQgCXN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwogCXVuc2lnbmVkIGludCB2YWx1ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlSWRsZU1vZGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlSWRsZU1vZGUuaAppbmRleCAxYmM3MjNkLi44NTlhMmZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZUlkbGVNb2RlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VJZGxlTW9kZS5oCkBAIC03LDggKzcsNiBAQAogCiBWT0lEIEludGVyZmFjZVdyaXRlSWRsZU1vZGVXYWtlUGF0dGVybihQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwogCi1JTlQgSW50ZXJmYWNlQWJvcnRJZGxlbW9kZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIHVuc2lnbmVkIGludCBQYXR0ZXJuKTsKLQogSU5UIEludGVyZmFjZVdha2VVcChQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwogCiBWT0lEIEludGVyZmFjZUhhbmRsZVNodXRkb3duTW9kZVdha2V1cChQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VJbml0LmMgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZUluaXQuYwppbmRleCBlOTdhZDk5Li5kNzhkNWVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZUluaXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZUluaXQuYwpAQCAtMSw1NCArMSw2MyBAQAogI2luY2x1ZGUgImhlYWRlcnMuaCIKIAogc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIEludGVyZmFjZVVzYnRhYmxlW10gPSB7Ci0gICAgeyBVU0JfREVWSUNFKEJDTV9VU0JfVkVORE9SX0lEX1QzLCBCQ01fVVNCX1BST0RVQ1RfSURfVDMpIH0sCisJeyBVU0JfREVWSUNFKEJDTV9VU0JfVkVORE9SX0lEX1QzLCBCQ01fVVNCX1BST0RVQ1RfSURfVDMpIH0sCiAJeyBVU0JfREVWSUNFKEJDTV9VU0JfVkVORE9SX0lEX1QzLCBCQ01fVVNCX1BST0RVQ1RfSURfVDNCKSB9LAogCXsgVVNCX0RFVklDRShCQ01fVVNCX1ZFTkRPUl9JRF9UMywgQkNNX1VTQl9QUk9EVUNUX0lEX1QzTCkgfSwKLSAgICAJeyBVU0JfREVWSUNFKEJDTV9VU0JfVkVORE9SX0lEX1pURSwgQkNNX1VTQl9QUk9EVUNUX0lEXzIyNikgfSwKKwl7IFVTQl9ERVZJQ0UoQkNNX1VTQl9WRU5ET1JfSURfVDMsIEJDTV9VU0JfUFJPRFVDVF9JRF9TTTI1MCkgfSwKKwl7IFVTQl9ERVZJQ0UoQkNNX1VTQl9WRU5ET1JfSURfWlRFLCBCQ01fVVNCX1BST0RVQ1RfSURfMjI2KSB9LAogCXsgVVNCX0RFVklDRShCQ01fVVNCX1ZFTkRPUl9JRF9GT1hDT05OLCBCQ01fVVNCX1BST0RVQ1RfSURfMTkwMSkgfSwKLSAgICB7fQorCXsgVVNCX0RFVklDRShCQ01fVVNCX1ZFTkRPUl9JRF9aVEUsIEJDTV9VU0JfUFJPRFVDVF9JRF9aVEVfVFUyNSkgfSwKKwl7IH0KIH07CitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgSW50ZXJmYWNlVXNidGFibGUpOwogCi1WT0lEIEludGVyZmFjZUFkYXB0ZXJGcmVlKFBTX0lOVEVSRkFDRV9BREFQVEVSIHBzSW50ZkFkYXB0ZXIpCitzdGF0aWMgaW50IGRlYnVnID0gLTE7Cittb2R1bGVfcGFyYW0oZGVidWcsIHVpbnQsIDA2MDApOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGxldmVsICgwPW5vbmUsLi4uLDE2PWFsbCkiKTsKKworc3RhdGljIGNvbnN0IHUzMiBkZWZhdWx0X21zZyA9CisJTkVUSUZfTVNHX0RSViB8IE5FVElGX01TR19QUk9CRSB8IE5FVElGX01TR19MSU5LCisJfCBORVRJRl9NU0dfVElNRVIgfCBORVRJRl9NU0dfVFhfRVJSIHwgTkVUSUZfTVNHX1JYX0VSUgorCXwgTkVUSUZfTVNHX0lGVVAgfCBORVRJRl9NU0dfSUZET1dOOworCitzdGF0aWMgaW50IEludGVyZmFjZUFkYXB0ZXJJbml0KFBTX0lOVEVSRkFDRV9BREFQVEVSIEFkYXB0ZXIpOworCitzdGF0aWMgdm9pZCBJbnRlcmZhY2VBZGFwdGVyRnJlZShQU19JTlRFUkZBQ0VfQURBUFRFUiBwc0ludGZBZGFwdGVyKQogewotCUlOVCBpID0gMDsKLQkvLyBXYWtlIHVwIHRoZSB3YWl0X3F1ZXVlLi4uCi0JaWYocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5MRURJbmZvLmxlZF90aHJlYWRfcnVubmluZyAmIEJDTV9MRURfVEhSRUFEX1JVTk5JTkdfQUNUSVZFTFkpCi0JeworCWludCBpID0gMDsKKworCS8qIFdha2UgdXAgdGhlIHdhaXRfcXVldWUuLi4gKi8KKwlpZiAocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5MRURJbmZvLmxlZF90aHJlYWRfcnVubmluZyAmIEJDTV9MRURfVEhSRUFEX1JVTk5JTkdfQUNUSVZFTFkpIHsKIAkJcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5Ecml2ZXJTdGF0ZSA9IERSSVZFUl9IQUxUOwogCQl3YWtlX3VwKCZwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPkxFREluZm8ubm90aWZ5X2xlZF9ldmVudCk7CiAJfQogCXJlc2V0X2NhcmRfcHJvYyhwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIpOwogCi0JLy93b3JzdCBjYXNlIHRpbWUgdGFrZW4gYnkgdGhlIFJETS9XUk0gd2lsbCBiZSA1IHNlYy4gd2lsbCBjaGVjayBhZnRlciBldmVyeSAxMDAgbXMKLQkvL3RvIGFjY2VydGFpbiB0aGUgZGV2aWNlIGlzIG5vdCBiZWluZyBhY2Nlc3NlZC4gQWZ0ZXIgdGhpcyBObyBSRE0vV1JNIHNob3VsZCBiZSBtYWRlLgotCXdoaWxlKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+RGV2aWNlQWNjZXNzKQotCXsKLQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwiRGV2aWNlIGlzIGJlaW5nIEFjY2Vzc2VkIFxuIik7CisJLyoKKwkgKiB3b3JzdCBjYXNlIHRpbWUgdGFrZW4gYnkgdGhlIFJETS9XUk0gd2lsbCBiZSA1IHNlYy4gd2lsbCBjaGVjayBhZnRlciBldmVyeSAxMDAgbXMKKwkgKiB0byBhY2NlcnRhaW4gdGhlIGRldmljZSBpcyBub3QgYmVpbmcgYWNjZXNzZWQuIEFmdGVyIHRoaXMgTm8gUkRNL1dSTSBzaG91bGQgYmUgbWFkZS4KKwkgKi8KKwl3aGlsZSAocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5EZXZpY2VBY2Nlc3MpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsCisJCQkiRGV2aWNlIGlzIGJlaW5nIGFjY2Vzc2VkLlxuIik7CiAJCW1zbGVlcCgxMDApOwogCX0KIAkvKiBGcmVlIGludGVycnVwdCBVUkIgKi8KLQkvL3BzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+ZGV2aWNlX3JlbW92ZWQgPSBUUlVFOwotCWlmKHBzSW50ZkFkYXB0ZXItPnBzSW50ZXJydXB0VXJiKQotCXsKLQkJdXNiX2ZyZWVfdXJiKHBzSW50ZkFkYXB0ZXItPnBzSW50ZXJydXB0VXJiKTsKLQl9CisJLyogcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5kZXZpY2VfcmVtb3ZlZCA9IFRSVUU7ICovCisJdXNiX2ZyZWVfdXJiKHBzSW50ZkFkYXB0ZXItPnBzSW50ZXJydXB0VXJiKTsKIAogCS8qIEZyZWUgdHJhbnNtaXQgVVJCcyAqLwotCWZvcihpID0gMDsgaSA8IE1BWElNVU1fVVNCX1RDQjsgaSsrKQotCXsKLQkJaWYocHNJbnRmQWRhcHRlci0+YXNVc2JUY2JbaV0udXJiICAhPSBOVUxMKQotCQl7CisJZm9yIChpID0gMDsgaSA8IE1BWElNVU1fVVNCX1RDQjsgaSsrKSB7CisJCWlmIChwc0ludGZBZGFwdGVyLT5hc1VzYlRjYltpXS51cmIgICE9IE5VTEwpIHsKIAkJCXVzYl9mcmVlX3VyYihwc0ludGZBZGFwdGVyLT5hc1VzYlRjYltpXS51cmIpOwogCQkJcHNJbnRmQWRhcHRlci0+YXNVc2JUY2JbaV0udXJiID0gTlVMTDsKIAkJfQogCX0KIAkvKiBGcmVlIHJlY2VpdmUgVVJCIGFuZCBidWZmZXJzICovCi0JZm9yKGkgPSAwOyBpIDwgTUFYSU1VTV9VU0JfUkNCOyBpKyspCi0JewotCQlpZiAocHNJbnRmQWRhcHRlci0+YXNVc2JSY2JbaV0udXJiICE9IE5VTEwpCi0JCXsKLQkJCWJjbV9rZnJlZShwc0ludGZBZGFwdGVyLT5hc1VzYlJjYltpXS51cmItPnRyYW5zZmVyX2J1ZmZlcik7CisJZm9yIChpID0gMDsgaSA8IE1BWElNVU1fVVNCX1JDQjsgaSsrKSB7CisJCWlmIChwc0ludGZBZGFwdGVyLT5hc1VzYlJjYltpXS51cmIgIT0gTlVMTCkgeworCQkJa2ZyZWUocHNJbnRmQWRhcHRlci0+YXNVc2JSY2JbaV0udXJiLT50cmFuc2Zlcl9idWZmZXIpOwogCQkJdXNiX2ZyZWVfdXJiKHBzSW50ZkFkYXB0ZXItPmFzVXNiUmNiW2ldLnVyYik7CiAJCQlwc0ludGZBZGFwdGVyLT5hc1VzYlJjYltpXS51cmIgPSBOVUxMOwogCQl9CkBAIC01NiwxNTEgKzY1LDEwOSBAQAogCUFkYXB0ZXJGcmVlKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcik7CiB9CiAKLQotCi1zdGF0aWMgaW50IHVzYmJjbV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQorc3RhdGljIHZvaWQgQ29uZmlndXJlRW5kUG9pbnRUeXBlc1Rocm91Z2hFRVBST00oUE1JTklfQURBUFRFUiBBZGFwdGVyKQogewotCXJldHVybiAwOwotfQorCXVuc2lnbmVkIGxvbmcgdWxSZWcgPSAwOworCWludCByZXQ7CiAKLXN0YXRpYyBpbnQgdXNiYmNtX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHVzYmJjbV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3QgdXNiYmNtX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXJldHVybiAwOwotfQotCi0KLVZPSUQgQ29uZmlndXJlRW5kUG9pbnRUeXBlc1Rocm91Z2hFRVBST00oUE1JTklfQURBUFRFUiBBZGFwdGVyKQotewotCVVMT05HIHVsUmVnID0gMDsKLQotLy8gUHJvZ3JhbSBFUDIgTUFYX1BLVF9TSVpFCisJLyogUHJvZ3JhbSBFUDIgTUFYX1BLVF9TSVpFICovCiAJdWxSZWcgPSBudG9obChFUDJfTVBTX1JFRyk7Ci0JQmVjZWVtRUVQUk9NQnVsa1dyaXRlKEFkYXB0ZXIsKFBVQ0hBUikmdWxSZWcsMHgxMjgsNCxUUlVFKTsKKwlCZWNlZW1FRVBST01CdWxrV3JpdGUoQWRhcHRlciwgKFBVQ0hBUikmdWxSZWcsIDB4MTI4LCA0LCBUUlVFKTsKIAl1bFJlZyA9IG50b2hsKEVQMl9NUFMpOwotCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShBZGFwdGVyLChQVUNIQVIpJnVsUmVnLDB4MTJDLDQsVFJVRSk7CisJQmVjZWVtRUVQUk9NQnVsa1dyaXRlKEFkYXB0ZXIsIChQVUNIQVIpJnVsUmVnLCAweDEyQywgNCwgVFJVRSk7CiAKIAl1bFJlZyA9IG50b2hsKEVQMl9DRkdfUkVHKTsKLQlCZWNlZW1FRVBST01CdWxrV3JpdGUoQWRhcHRlciwoUFVDSEFSKSZ1bFJlZywweDEzMiw0LFRSVUUpOwotCWlmKCgoUFNfSU5URVJGQUNFX0FEQVBURVIpKEFkYXB0ZXItPnB2SW50ZXJmYWNlQWRhcHRlcikpLT5iSGlnaFNwZWVkRGV2aWNlID09IFRSVUUpCi0JeworCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShBZGFwdGVyLCAoUFVDSEFSKSZ1bFJlZywgMHgxMzIsIDQsIFRSVUUpOworCWlmICgoKFBTX0lOVEVSRkFDRV9BREFQVEVSKShBZGFwdGVyLT5wdkludGVyZmFjZUFkYXB0ZXIpKS0+YkhpZ2hTcGVlZERldmljZSA9PSBUUlVFKSB7CiAJCXVsUmVnID0gbnRvaGwoRVAyX0NGR19JTlQpOwotCQlCZWNlZW1FRVBST01CdWxrV3JpdGUoQWRhcHRlciwoUFVDSEFSKSZ1bFJlZywweDEzNiw0LFRSVUUpOwotCX0KLQllbHNlCi0JewotLy8gVVNFIEJVTEsgRVAgYXMgVFggaW4gRlMgbW9kZS4KKwkJQmVjZWVtRUVQUk9NQnVsa1dyaXRlKEFkYXB0ZXIsIChQVUNIQVIpJnVsUmVnLCAweDEzNiwgNCwgVFJVRSk7CisJfSBlbHNlIHsKKwkJLyogVVNFIEJVTEsgRVAgYXMgVFggaW4gRlMgbW9kZS4gKi8KIAkJdWxSZWcgPSBudG9obChFUDJfQ0ZHX0JVTEspOwotCQlCZWNlZW1FRVBST01CdWxrV3JpdGUoQWRhcHRlciwoUFVDSEFSKSZ1bFJlZywweDEzNiw0LFRSVUUpOworCQlCZWNlZW1FRVBST01CdWxrV3JpdGUoQWRhcHRlciwgKFBVQ0hBUikmdWxSZWcsIDB4MTM2LCA0LCBUUlVFKTsKIAl9CiAKLQotLy8gUHJvZ3JhbSBFUDQgTUFYX1BLVF9TSVpFLgorCS8qIFByb2dyYW0gRVA0IE1BWF9QS1RfU0laRS4gKi8KIAl1bFJlZyA9IG50b2hsKEVQNF9NUFNfUkVHKTsKLQlCZWNlZW1FRVBST01CdWxrV3JpdGUoQWRhcHRlciwoUFVDSEFSKSZ1bFJlZywweDEzQyw0LFRSVUUpOworCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShBZGFwdGVyLCAoUFVDSEFSKSZ1bFJlZywgMHgxM0MsIDQsIFRSVUUpOwogCXVsUmVnID0gbnRvaGwoRVA0X01QUyk7Ci0JQmVjZWVtRUVQUk9NQnVsa1dyaXRlKEFkYXB0ZXIsKFBVQ0hBUikmdWxSZWcsMHgxNDAsNCxUUlVFKTsKKwlCZWNlZW1FRVBST01CdWxrV3JpdGUoQWRhcHRlciwgKFBVQ0hBUikmdWxSZWcsIDB4MTQwLCA0LCBUUlVFKTsKIAotLy8JUHJvZ3JhbSBUWCBFUCBhcyBpbnRlcnJ1cHQgKEFsdGVybmF0ZSBTZXR0aW5nKQotCWlmKCByZG1hbHQoQWRhcHRlciwweDBGMDExMEY4LCAoUFVJTlQpJnVsUmVnLDQpKQotCXsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJyZWFkaW5nIG9mIFR4IEVQIGlzIGZhaWxpbmciKTsKLQkJcmV0dXJuIDsKKwkvKiBQcm9ncmFtIFRYIEVQIGFzIGludGVycnVwdChBbHRlcm5hdGUgU2V0dGluZykgKi8KKwlyZXQgPSByZG1hbHQoQWRhcHRlciwgMHgwRjAxMTBGOCwgKHUzMiAqKSZ1bFJlZywgc2l6ZW9mKHUzMikpOworCWlmIChyZXQpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLAorCQkJInJlYWRpbmcgb2YgVHggRVAgZmFpbGVkXG4iKTsKKwkJcmV0dXJuOwogCX0KIAl1bFJlZyB8PSAweDY7CiAKIAl1bFJlZyA9IG50b2hsKHVsUmVnKTsKLQlCZWNlZW1FRVBST01CdWxrV3JpdGUoQWRhcHRlciwoUFVDSEFSKSZ1bFJlZywweDFDQyw0LFRSVUUpOworCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShBZGFwdGVyLCAoUFVDSEFSKSZ1bFJlZywgMHgxQ0MsIDQsIFRSVUUpOwogCiAJdWxSZWcgPSBudG9obChFUDRfQ0ZHX1JFRyk7Ci0JQmVjZWVtRUVQUk9NQnVsa1dyaXRlKEFkYXB0ZXIsKFBVQ0hBUikmdWxSZWcsMHgxQzgsNCxUUlVFKTsKLS8vIFByb2dyYW0gSVNPQ0hST05PVVMgRVAgc2l6ZSB0byB6ZXJvLgorCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShBZGFwdGVyLCAoUFVDSEFSKSZ1bFJlZywgMHgxQzgsIDQsIFRSVUUpOworCS8qIFByb2dyYW0gSVNPQ0hST05PVVMgRVAgc2l6ZSB0byB6ZXJvLiAqLwogCXVsUmVnID0gbnRvaGwoSVNPX01QU19SRUcpOwotCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShBZGFwdGVyLChQVUNIQVIpJnVsUmVnLDB4MUQyLDQsVFJVRSk7CisJQmVjZWVtRUVQUk9NQnVsa1dyaXRlKEFkYXB0ZXIsIChQVUNIQVIpJnVsUmVnLCAweDFEMiwgNCwgVFJVRSk7CiAJdWxSZWcgPSBudG9obChJU09fTVBTKTsKLQlCZWNlZW1FRVBST01CdWxrV3JpdGUoQWRhcHRlciwoUFVDSEFSKSZ1bFJlZywweDFENiw0LFRSVUUpOworCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShBZGFwdGVyLCAoUFVDSEFSKSZ1bFJlZywgMHgxRDYsIDQsIFRSVUUpOwogCi0vLyBVcGRhdGUgRUVQUk9NIFZlcnNpb24uCi0vLyBSZWFkIDQgYnl0ZXMgZnJvbSA1MDggYW5kIG1vZGlmeSA1MTEgYW5kIDUxMC4KLS8vCi0JUmVhZEJlY2VlbUVFUFJPTShBZGFwdGVyLDB4MUZDLChQVUlOVCkmdWxSZWcpOworCS8qCisJICogVXBkYXRlIEVFUFJPTSBWZXJzaW9uLgorCSAqIFJlYWQgNCBieXRlcyBmcm9tIDUwOCBhbmQgbW9kaWZ5IDUxMSBhbmQgNTEwLgorCSAqLworCVJlYWRCZWNlZW1FRVBST00oQWRhcHRlciwgMHgxRkMsIChQVUlOVCkmdWxSZWcpOwogCXVsUmVnICY9IDB4MDEwMUZGRkY7Ci0JQmVjZWVtRUVQUk9NQnVsa1dyaXRlKEFkYXB0ZXIsKFBVQ0hBUikmdWxSZWcsMHgxRkMsNCxUUlVFKTsKLS8vCi0vL1VwZGF0ZSBsZW5ndGggZmllbGQgaWYgcmVxdWlyZWQuIEFsc28gbWFrZSB0aGUgc3RyaW5nIE5VTEwgdGVybWluYXRlZC4KLS8vCi0JUmVhZEJlY2VlbUVFUFJPTShBZGFwdGVyLDB4QTgsKFBVSU5UKSZ1bFJlZyk7Ci0JaWYoKHVsUmVnJjB4MDBGRjAwMDApPj4xNiA+IDB4MzApCi0JewotCQl1bFJlZyA9ICh1bFJlZyYweEZGMDBGRkZGKXwoMHgzMDw8MTYpOwotCQlCZWNlZW1FRVBST01CdWxrV3JpdGUoQWRhcHRlciwoUFVDSEFSKSZ1bFJlZywweEE4LDQsVFJVRSk7Ci0JfQotCVJlYWRCZWNlZW1FRVBST00oQWRhcHRlciwweDE0OCwoUFVJTlQpJnVsUmVnKTsKLQlpZigodWxSZWcmMHgwMEZGMDAwMCk+PjE2ID4gMHgzMCkKLQl7Ci0JCXVsUmVnID0gKHVsUmVnJjB4RkYwMEZGRkYpfCgweDMwPDwxNik7Ci0JCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShBZGFwdGVyLChQVUNIQVIpJnVsUmVnLDB4MTQ4LDQsVFJVRSk7Ci0JfQotCXVsUmVnID0gMDsKLQlCZWNlZW1FRVBST01CdWxrV3JpdGUoQWRhcHRlciwoUFVDSEFSKSZ1bFJlZywweDEyMiw0LFRSVUUpOwotCXVsUmVnID0gMDsKLQlCZWNlZW1FRVBST01CdWxrV3JpdGUoQWRhcHRlciwoUFVDSEFSKSZ1bFJlZywweDFDMiw0LFRSVUUpOworCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShBZGFwdGVyLCAoUFVDSEFSKSZ1bFJlZywgMHgxRkMsIDQsIFRSVUUpOwogCisJLyogVXBkYXRlIGxlbmd0aCBmaWVsZCBpZiByZXF1aXJlZC4gQWxzbyBtYWtlIHRoZSBzdHJpbmcgTlVMTCB0ZXJtaW5hdGVkLiAqLworCisJUmVhZEJlY2VlbUVFUFJPTShBZGFwdGVyLCAweEE4LCAoUFVJTlQpJnVsUmVnKTsKKwlpZiAoKHVsUmVnJjB4MDBGRjAwMDApPj4xNiA+IDB4MzApIHsKKwkJdWxSZWcgPSAodWxSZWcmMHhGRjAwRkZGRil8KDB4MzA8PDE2KTsKKwkJQmVjZWVtRUVQUk9NQnVsa1dyaXRlKEFkYXB0ZXIsIChQVUNIQVIpJnVsUmVnLCAweEE4LCA0LCBUUlVFKTsKKwl9CisJUmVhZEJlY2VlbUVFUFJPTShBZGFwdGVyLCAweDE0OCwgKFBVSU5UKSZ1bFJlZyk7CisJaWYgKCh1bFJlZyYweDAwRkYwMDAwKT4+MTYgPiAweDMwKSB7CisJCXVsUmVnID0gKHVsUmVnJjB4RkYwMEZGRkYpfCgweDMwPDwxNik7CisJCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShBZGFwdGVyLCAoUFVDSEFSKSZ1bFJlZywgMHgxNDgsIDQsIFRSVUUpOworCX0KKwl1bFJlZyA9IDA7CisJQmVjZWVtRUVQUk9NQnVsa1dyaXRlKEFkYXB0ZXIsIChQVUNIQVIpJnVsUmVnLCAweDEyMiwgNCwgVFJVRSk7CisJdWxSZWcgPSAwOworCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShBZGFwdGVyLCAoUFVDSEFSKSZ1bFJlZywgMHgxQzIsIDQsIFRSVUUpOwogfQogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1c2JiY21fZm9wcyA9IHsKLSAgICAub3BlbiAgICA9ICB1c2JiY21fb3BlbiwKLSAgICAucmVsZWFzZSA9ICB1c2JiY21fcmVsZWFzZSwKLSAgICAucmVhZCAgICA9ICB1c2JiY21fcmVhZCwKLSAgICAud3JpdGUgICA9ICB1c2JiY21fd3JpdGUsCi0gICAgLm93bmVyICAgPSAgVEhJU19NT0RVTEUsCi0JLmxsc2VlayA9IG5vX2xsc2VlaywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdXNiX2NsYXNzX2RyaXZlciB1c2JiY21fY2xhc3MgPSB7Ci0gICAgLm5hbWUgPSAgICAgCSJ1c2JiY20iLAotICAgIC5mb3BzID0gICAgIAkmdXNiYmNtX2ZvcHMsCi0gICAgLm1pbm9yX2Jhc2UgPSAgIEJDTV9VU0JfTUlOT1JfQkFTRSwKLX07Ci0KIHN0YXRpYyBpbnQKIHVzYmJjbV9kZXZpY2VfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKIHsKLQlpbnQgcmV0dmFsID0wIDsKLSAgIAlQTUlOSV9BREFQVEVSIHBzQWRhcHRlciA9IE5VTEw7Ci0JUFNfSU5URVJGQUNFX0FEQVBURVIgcHNJbnRmQWRhcHRlciA9IE5VTEw7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgICAgICAqdWRldiA9IE5VTEw7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCWludCByZXR2YWw7CisJUE1JTklfQURBUFRFUiBwc0FkYXB0ZXI7CisJUFNfSU5URVJGQUNFX0FEQVBURVIgcHNJbnRmQWRhcHRlcjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKIAotLy8JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJVc2JiY20gcHJvYmUhISIpOwotCWlmKChpbnRmID09IE5VTEwpIHx8IChpZCA9PSBOVUxMKSkKLQl7Ci0JLy8JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJpbnRmIG9yIGlkIGlzIE5VTEwiKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyogQWxsb2NhdGUgQWRhcHRlciBzdHJ1Y3R1cmUgKi8KLQlpZigocHNBZGFwdGVyID0ga3phbGxvYyhzaXplb2YoTUlOSV9BREFQVEVSKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCi0JewotCQlCQ01fREVCVUdfUFJJTlQocHNBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIk91dCBvZiBtZW1vcnkiKTsKKwkvKiBSZXNlcnZlIG9uZSBleHRyYSBxdWV1ZSBmb3IgdGhlIGJpdC1idWNrZXQgKi8KKwluZGV2ID0gYWxsb2NfZXRoZXJkZXZfbXEoc2l6ZW9mKE1JTklfQURBUFRFUiksIE5PX09GX1FVRVVFUysxKTsKKwlpZiAobmRldiA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnVkZXYtPmRldiwgRFJWX05BTUUgIjogbm8gbWVtb3J5IGZvciBkZXZpY2VcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLSAgICAvKiBJbml0IGRlZmF1bHQgZHJpdmVyIGRlYnVnIHN0YXRlICovCisJU0VUX05FVERFVl9ERVYobmRldiwgJmludGYtPmRldik7CiAKLSAgICBwc0FkYXB0ZXItPnN0RGVidWdTdGF0ZS5kZWJ1Z19sZXZlbCA9IERCR19MVkxfQ1VSUjsKKwlwc0FkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlwc0FkYXB0ZXItPmRldiA9IG5kZXY7CisJcHNBZGFwdGVyLT5tc2dfZW5hYmxlID0gbmV0aWZfbXNnX2luaXQoZGVidWcsIGRlZmF1bHRfbXNnKTsKKworCS8qIEluaXQgZGVmYXVsdCBkcml2ZXIgZGVidWcgc3RhdGUgKi8KKworCXBzQWRhcHRlci0+c3REZWJ1Z1N0YXRlLmRlYnVnX2xldmVsID0gREJHX0xWTF9DVVJSOwogCXBzQWRhcHRlci0+c3REZWJ1Z1N0YXRlLnR5cGUgPSBEQkdfVFlQRV9JTklURVhJVDsKLQltZW1zZXQgKHBzQWRhcHRlci0+c3REZWJ1Z1N0YXRlLnN1YnR5cGUsIDAsIHNpemVvZiAocHNBZGFwdGVyLT5zdERlYnVnU3RhdGUuc3VidHlwZSkpOwogCi0gICAgLyogVGVjaG5pY2FsbHksIG9uZSBjYW4gc3RhcnQgdXNpbmcgQkNNX0RFQlVHX1BSSU5UIGFmdGVyIHRoaXMgcG9pbnQuCisJLyoKKwkgKiBUZWNobmljYWxseSwgb25lIGNhbiBzdGFydCB1c2luZyBCQ01fREVCVUdfUFJJTlQgYWZ0ZXIgdGhpcyBwb2ludC4KIAkgKiBIb3dldmVyLCByZWFsaXplIHRoYXQgYnkgZGVmYXVsdCB0aGUgVHlwZS9TdWJ0eXBlIGJpdG1hcHMgYXJlIGFsbCB6ZXJvIG5vdzsKIAkgKiBzbyBubyBwcmludHMgd2lsbCBhY3R1YWxseSBhcHBlYXIgdW50aWwgdGhlIFRlc3RBcHAgdHVybnMgb24gZGVidWcgcGF0aHMgdmlhCiAJICogdGhlIGlvY3RsKCk7IHNvIHByYWN0aWNhbGx5IHNwZWFraW5nLCBpbiBlYXJseSBpbml0LCBubyBsb2dnaW5nIGhhcHBlbnMuCkBAIC0yMTEsMTYwICsxNzgsMTI4IEBACiAJICogRnVydGhlciwgd2UgdHVybiB0aGlzIE9GRiBvbmNlIGluaXRfbW9kdWxlKCkgY29tcGxldGVzLgogCSAqLwogCi0gICAgcHNBZGFwdGVyLT5zdERlYnVnU3RhdGUuc3VidHlwZVtEQkdfVFlQRV9JTklURVhJVF0gPSAweGZmOworCXBzQWRhcHRlci0+c3REZWJ1Z1N0YXRlLnN1YnR5cGVbREJHX1RZUEVfSU5JVEVYSVRdID0gMHhmZjsKIAlCQ01fU0hPV19ERUJVR19CSVRNQVAocHNBZGFwdGVyKTsKIAogCXJldHZhbCA9IEluaXRBZGFwdGVyKHBzQWRhcHRlcik7Ci0JaWYocmV0dmFsKQotCXsKLQkJQkNNX0RFQlVHX1BSSU5UIChwc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJJbml0QWRhcHRlciBGYWlsZWRcbiIpOworCWlmIChyZXR2YWwpIHsKKwkJZGV2X2VycigmdWRldi0+ZGV2LCBEUlZfTkFNRSAiOiBJbml0QWRhcHRlciBGYWlsZWRcbiIpOwogCQlBZGFwdGVyRnJlZShwc0FkYXB0ZXIpOwogCQlyZXR1cm4gcmV0dmFsOwogCX0KIAogCS8qIEFsbG9jYXRlIGludGVyZmFjZSBhZGFwdGVyIHN0cnVjdHVyZSAqLwotCWlmKChwc0FkYXB0ZXItPnB2SW50ZXJmYWNlQWRhcHRlciA9Ci0JCWttYWxsb2Moc2l6ZW9mKFNfSU5URVJGQUNFX0FEQVBURVIpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiT3V0IG9mIG1lbW9yeSIpOwotCQlBZGFwdGVyRnJlZSAocHNBZGFwdGVyKTsKKwlwc0ludGZBZGFwdGVyID0ga3phbGxvYyhzaXplb2YoU19JTlRFUkZBQ0VfQURBUFRFUiksIEdGUF9LRVJORUwpOworCWlmIChwc0ludGZBZGFwdGVyID09IE5VTEwpIHsKKwkJZGV2X2VycigmdWRldi0+ZGV2LCBEUlZfTkFNRSAiOiBubyBtZW1vcnkgZm9yIEludGVyZmFjZSBhZGFwdGVyXG4iKTsKKwkJQWRhcHRlckZyZWUocHNBZGFwdGVyKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCW1lbXNldChwc0FkYXB0ZXItPnB2SW50ZXJmYWNlQWRhcHRlciwgMCwgc2l6ZW9mKFNfSU5URVJGQUNFX0FEQVBURVIpKTsKIAotCXBzSW50ZkFkYXB0ZXIgPSBJbnRlcmZhY2VBZGFwdGVyR2V0KHBzQWRhcHRlcik7CisJcHNBZGFwdGVyLT5wdkludGVyZmFjZUFkYXB0ZXIgPSBwc0ludGZBZGFwdGVyOwogCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciA9IHBzQWRhcHRlcjsKIAogCS8qIFN0b3JlIHVzYiBpbnRlcmZhY2UgaW4gSW50ZXJmYWNlIEFkYXB0ZXIgKi8KIAlwc0ludGZBZGFwdGVyLT5pbnRlcmZhY2UgPSBpbnRmOwogCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgcHNJbnRmQWRhcHRlcik7CiAKLQlCQ01fREVCVUdfUFJJTlQocHNBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAicHNJbnRmQWRhcHRlciAweCVwIixwc0ludGZBZGFwdGVyKTsKKwlCQ01fREVCVUdfUFJJTlQocHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwKKwkJInBzSW50ZkFkYXB0ZXIgMHglcFxuIiwgcHNJbnRmQWRhcHRlcik7CiAJcmV0dmFsID0gSW50ZXJmYWNlQWRhcHRlckluaXQocHNJbnRmQWRhcHRlcik7Ci0JaWYocmV0dmFsKQotCXsKKwlpZiAocmV0dmFsKSB7CiAJCS8qIElmIHRoZSBGaXJtd2FyZS9DZmcgRmlsZSBpcyBub3QgcHJlc2VudAotIAkJICogdGhlbiByZXR1cm4gc3VjY2VzcywgbGV0IHRoZSBhcHBsaWNhdGlvbgotIAkJICogZG93bmxvYWQgdGhlIGZpbGVzLgotIAkJICovCi0JCWlmKC1FTk9FTlQgPT0gcmV0dmFsKXsKLQkJCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJGaWxlIE5vdCBGb3VuZCwgVXNlIEFwcCB0byBEb3dubG9hZFxuIik7CisJCSAqIHRoZW4gcmV0dXJuIHN1Y2Nlc3MsIGxldCB0aGUgYXBwbGljYXRpb24KKwkJICogZG93bmxvYWQgdGhlIGZpbGVzLgorCQkgKi8KKwkJaWYgKC1FTk9FTlQgPT0gcmV0dmFsKSB7CisJCQlCQ01fREVCVUdfUFJJTlQocHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwKKwkJCQkiRmlsZSBOb3QgRm91bmQuICBVc2UgYXBwIHRvIGRvd25sb2FkLlxuIik7CiAJCQlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiAJCX0KLQkJQkNNX0RFQlVHX1BSSU5UKHBzQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIkludGVyZmFjZUFkYXB0ZXJJbml0IEZhaWxlZCBcbiIpOworCQlCQ01fREVCVUdfUFJJTlQocHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwKKwkJCSJJbnRlcmZhY2VBZGFwdGVySW5pdCBmYWlsZWQuXG4iKTsKIAkJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKLQkJdWRldiA9IGludGVyZmFjZV90b191c2JkZXYgKGludGYpOworCQl1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKIAkJdXNiX3B1dF9kZXYodWRldik7Ci0JCWlmKHBzQWRhcHRlci0+YlVzYkNsYXNzRHJpdmVyUmVnaXN0ZXJlZCA9PSBUUlVFKQotCQkJCXVzYl9kZXJlZ2lzdGVyX2RldiAoaW50ZiwgJnVzYmJjbV9jbGFzcyk7CiAJCUludGVyZmFjZUFkYXB0ZXJGcmVlKHBzSW50ZkFkYXB0ZXIpOwotCQlyZXR1cm4gcmV0dmFsIDsKKwkJcmV0dXJuIHJldHZhbDsKIAl9Ci0JaWYocHNBZGFwdGVyLT5jaGlwX2lkID4gVDMpCi0JewotCQl1aW50MzJfdCB1aU5hY2taZXJvTGVuZ3RoSW50PTQ7Ci0JCWlmKHdybWFsdChwc0FkYXB0ZXIsIERJU0FCTEVfVVNCX1pFUk9fTEVOX0lOVCwgJnVpTmFja1plcm9MZW5ndGhJbnQsIHNpemVvZih1aU5hY2taZXJvTGVuZ3RoSW50KSkpCi0JCXsKLQkJCXJldHVybiAtRUlPOzsKLQkJfQorCWlmIChwc0FkYXB0ZXItPmNoaXBfaWQgPiBUMykgeworCQl1aW50MzJfdCB1aU5hY2taZXJvTGVuZ3RoSW50ID0gNDsKKworCQlyZXR2YWwgPSB3cm1hbHQocHNBZGFwdGVyLCBESVNBQkxFX1VTQl9aRVJPX0xFTl9JTlQsICZ1aU5hY2taZXJvTGVuZ3RoSW50LCBzaXplb2YodWlOYWNrWmVyb0xlbmd0aEludCkpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKIAl9CiAKLQl1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldiAoaW50Zik7CiAJLyogQ2hlY2sgd2hldGhlciB0aGUgVVNCLURldmljZSBTdXBwb3J0cyByZW1vdGUgV2FrZS1VcCAqLwotCWlmKFVTQl9DT05GSUdfQVRUX1dBS0VVUCAmIHVkZXYtPmFjdGNvbmZpZy0+ZGVzYy5ibUF0dHJpYnV0ZXMpCi0JeworCWlmIChVU0JfQ09ORklHX0FUVF9XQUtFVVAgJiB1ZGV2LT5hY3Rjb25maWctPmRlc2MuYm1BdHRyaWJ1dGVzKSB7CiAJCS8qIElmIFN1c3BlbmQgdGhlbiBvbmx5IHN1cHBvcnQgZHluYW1pYyBzdXNwZW5kICovCi0JCWlmKHBzQWRhcHRlci0+YkRvU3VzcGVuZCkKLQkJeworCQlpZiAocHNBZGFwdGVyLT5iRG9TdXNwZW5kKSB7CiAjaWZkZWYgQ09ORklHX1BNCiAJCQlwbV9ydW50aW1lX3NldF9hdXRvc3VzcGVuZF9kZWxheSgmdWRldi0+ZGV2LCAwKTsKIAkJCWludGYtPm5lZWRzX3JlbW90ZV93YWtldXAgPSAxOwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDM1KQotIAkJCXVkZXYtPmF1dG9zdXNwZW5kX2Rpc2FibGVkID0gMDsKLSNlbHNlCiAJCQl1c2JfZW5hYmxlX2F1dG9zdXNwZW5kKHVkZXYpOwotI2VuZGlmCi0gCQkJZGV2aWNlX2luaXRfd2FrZXVwKCZpbnRmLT5kZXYsMSk7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwgNiwgMzIpCi0gCQkJdXNiX2F1dG9wbV9kaXNhYmxlKGludGYpOwotI2VuZGlmCisJCQlkZXZpY2VfaW5pdF93YWtldXAoJmludGYtPmRldiwgMSk7CiAJCQlJTklUX1dPUksoJnBzSW50ZkFkYXB0ZXItPnVzYlN1c3BlbmRXb3JrLCBwdXRVc2JTdXNwZW5kKTsKLQkJCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJFbmFibGluZyBVU0IgQXV0by1TdXNwZW5kXG4iKTsKKwkJCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLAorCQkJCSJFbmFibGluZyBVU0IgQXV0by1TdXNwZW5kXG4iKTsKICNlbmRpZgotCQl9Ci0JCWVsc2UKLQkJeworCQl9IGVsc2UgewogCQkJaW50Zi0+bmVlZHNfcmVtb3RlX3dha2V1cCA9IDA7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwgNiwgMzUpCi0gCQkJdWRldi0+YXV0b3N1c3BlbmRfZGlzYWJsZWQgPSAxOwotI2Vsc2UKIAkJCXVzYl9kaXNhYmxlX2F1dG9zdXNwZW5kKHVkZXYpOwotI2VuZGlmCiAJCX0KIAl9CiAKLSAgICBwc0FkYXB0ZXItPnN0RGVidWdTdGF0ZS5zdWJ0eXBlW0RCR19UWVBFX0lOSVRFWElUXSA9IDB4MDsKLSAgICByZXR1cm4gcmV0dmFsOworCXBzQWRhcHRlci0+c3REZWJ1Z1N0YXRlLnN1YnR5cGVbREJHX1RZUEVfSU5JVEVYSVRdID0gMHgwOworCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyB2b2lkIHVzYmJjbV9kaXNjb25uZWN0IChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3N0YXRpYyB2b2lkIHVzYmJjbV9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewotCVBTX0lOVEVSRkFDRV9BREFQVEVSIHBzSW50ZkFkYXB0ZXIgPSBOVUxMOwotCVBNSU5JX0FEQVBURVIgcHNBZGFwdGVyID0gTlVMTDsKLQlzdHJ1Y3QgdXNiX2RldmljZSAgICAgICAqdWRldiA9IE5VTEw7Ci0gICAgUE1JTklfQURBUFRFUiBBZGFwdGVyID0gR0VUX0JDTV9BREFQVEVSKGdibHBuZXRkZXYpOworCVBTX0lOVEVSRkFDRV9BREFQVEVSIHBzSW50ZkFkYXB0ZXIgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCVBNSU5JX0FEQVBURVIgcHNBZGFwdGVyOworCXN0cnVjdCB1c2JfZGV2aWNlICAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CiAKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIlVzYiBkaXNjb25uZWN0ZWQiKTsKLQlpZihpbnRmID09IE5VTEwpCi0JewotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgImludGYgcG9pbnRlciBpcyBOVUxMIik7CisJaWYgKHBzSW50ZkFkYXB0ZXIgPT0gTlVMTCkKIAkJcmV0dXJuOwotCX0KLQlwc0ludGZBZGFwdGVyID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgInBzSW50ZkFkYXB0ZXIgMHglcCIscHNJbnRmQWRhcHRlcik7Ci0JaWYocHNJbnRmQWRhcHRlciA9PSBOVUxMKQotCXsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJJbnRlcmZhY2VBZGFwdGVyIHBvaW50ZXIgaXMgTlVMTCIpOwotCQlyZXR1cm47Ci0JfQorCiAJcHNBZGFwdGVyID0gcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyOwotCWlmKHBzQWRhcHRlci0+YkRvU3VzcGVuZCkKKwluZXRpZl9kZXZpY2VfZGV0YWNoKHBzQWRhcHRlci0+ZGV2KTsKKworCWlmIChwc0FkYXB0ZXItPmJEb1N1c3BlbmQpCiAJCWludGYtPm5lZWRzX3JlbW90ZV93YWtldXAgPSAwOwogCiAJcHNBZGFwdGVyLT5kZXZpY2VfcmVtb3ZlZCA9IFRSVUUgOwogCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CiAJSW50ZXJmYWNlQWRhcHRlckZyZWUocHNJbnRmQWRhcHRlcik7Ci0JdWRldiA9IGludGVyZmFjZV90b191c2JkZXYgKGludGYpOwogCXVzYl9wdXRfZGV2KHVkZXYpOwotCXVzYl9kZXJlZ2lzdGVyX2RldiAoaW50ZiwgJnVzYmJjbV9jbGFzcyk7CiB9CiAKLQotc3RhdGljIF9faW5saW5lIGludCBBbGxvY1VzYkNiKFBTX0lOVEVSRkFDRV9BREFQVEVSIHBzSW50ZkFkYXB0ZXIpCitzdGF0aWMgaW50IEFsbG9jVXNiQ2IoUFNfSU5URVJGQUNFX0FEQVBURVIgcHNJbnRmQWRhcHRlcikKIHsKIAlpbnQgaSA9IDA7Ci0JZm9yKGkgPSAwOyBpIDwgTUFYSU1VTV9VU0JfVENCOyBpKyspCi0JewotCQlpZigocHNJbnRmQWRhcHRlci0+YXNVc2JUY2JbaV0udXJiID0KLQkJCQl1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpKSA9PSBOVUxMKQotCQl7Ci0JCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNhbnQgYWxsb2NhdGUgVHggdXJiIGZvciBpbmRleCAlZCIsIGkpOworCisJZm9yIChpID0gMDsgaSA8IE1BWElNVU1fVVNCX1RDQjsgaSsrKSB7CisJCWlmICgocHNJbnRmQWRhcHRlci0+YXNVc2JUY2JbaV0udXJiID0KKwkJCQl1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkJIkNhbid0IGFsbG9jYXRlIFR4IHVyYiBmb3IgaW5kZXggJWRcbiIsIGkpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAl9CiAKLQlmb3IoaSA9IDA7IGkgPCBNQVhJTVVNX1VTQl9SQ0I7IGkrKykKLQl7CisJZm9yIChpID0gMDsgaSA8IE1BWElNVU1fVVNCX1JDQjsgaSsrKSB7CiAJCWlmICgocHNJbnRmQWRhcHRlci0+YXNVc2JSY2JbaV0udXJiID0KLQkJCQl1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpKSA9PSBOVUxMKQotCQl7Ci0JCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNhbnQgYWxsb2NhdGUgUnggdXJiIGZvciBpbmRleCAlZCIsIGkpOworCQkJCXVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKwkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCQkiQ2FuJ3QgYWxsb2NhdGUgUnggdXJiIGZvciBpbmRleCAlZFxuIiwgaSk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQotCQlpZigocHNJbnRmQWRhcHRlci0+YXNVc2JSY2JbaV0udXJiLT50cmFuc2Zlcl9idWZmZXIgPQotCQkJa21hbGxvYyhNQVhfREFUQV9CVUZGRVJfU0laRSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCi0JCXsKLQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ2FudCBhbGxvY2F0ZSBSeCBidWZmZXIgZm9yIGluZGV4ICVkIiwgaSk7CisJCWlmICgocHNJbnRmQWRhcHRlci0+YXNVc2JSY2JbaV0udXJiLT50cmFuc2Zlcl9idWZmZXIgPQorCQkJa21hbGxvYyhNQVhfREFUQV9CVUZGRVJfU0laRSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKwkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCQkiQ2FuJ3QgYWxsb2NhdGUgUnggYnVmZmVyIGZvciBpbmRleCAlZFxuIiwgaSk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCQlwc0ludGZBZGFwdGVyLT5hc1VzYlJjYltpXS51cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBNQVhfREFUQV9CVUZGRVJfU0laRTsKQEAgLTM3Miw3NyArMzA3LDQxIEBACiAJcmV0dXJuIDA7CiB9CiAKLQotCiBzdGF0aWMgaW50IGRldmljZV9ydW4oUFNfSU5URVJGQUNFX0FEQVBURVIgcHNJbnRmQWRhcHRlcikKIHsKLQlJTlQgdmFsdWUgPSAwOworCWludCB2YWx1ZSA9IDA7CiAJVUlOVCBzdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKIAogCXN0YXR1cyA9IEluaXRDYXJkQW5kRG93bmxvYWRGaXJtd2FyZShwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIpOwotCWlmKHN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiSW5pdENhcmRBbmREb3dubG9hZEZpcm13YXJlIGZhaWxlZC5cbiIpOworCWlmIChzdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcHJfZXJyKERSVl9OQU1FICJJbml0Q2FyZEFuZERvd25sb2FkRmlybXdhcmUgZmFpbGVkLlxuIik7CiAJCXJldHVybiBzdGF0dXM7CiAJfQotCWlmKFRSVUUgPT0gcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5md19kb3dubG9hZF9kb25lKQotCXsKLQotCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiU2VuZGluZyBmaXJzdCBpbnRlcnJ1cHQgVVJCIGRvd24uLi4uLi4iKTsKLQkJaWYoU3RhcnRJbnRlcnJ1cHRVcmIocHNJbnRmQWRhcHRlcikpCi0JCXsKLQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJDYW5ub3Qgc2VuZCBpbnRlcnJ1cHQgaW4gVVJCIik7CisJaWYgKFRSVUUgPT0gcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5md19kb3dubG9hZF9kb25lKSB7CisJCWlmIChTdGFydEludGVycnVwdFVyYihwc0ludGZBZGFwdGVyKSkgeworCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsCisJCQkiQ2Fubm90IHNlbmQgaW50ZXJydXB0IGluIFVSQlxuIik7CiAJCX0KLQkJLy9ub3cgcmVnaXN0ZXIgdGhlIGNudHJsIGludGVyZmFjZS4KLQkJLy9hZnRlciBkb3dubG9hZGluZyB0aGUgZi93IHdhaXRpbmcgZm9yIDUgc2VjIHRvIGdldCB0aGUgbWFpbGJveCBpbnRlcnJ1cHQuCiAKKwkJLyoKKwkJICogbm93IHJlZ2lzdGVyIHRoZSBjbnRybCBpbnRlcmZhY2UuCisJCSAqIGFmdGVyIGRvd25sb2FkaW5nIHRoZSBmL3cgd2FpdGluZyBmb3IgNSBzZWMgdG8gZ2V0IHRoZSBtYWlsYm94IGludGVycnVwdC4KKwkJICovCiAJCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+d2FpdGluZ190b19md19kb3dubG9hZF9kb25lID0gRkFMU0U7CiAJCXZhbHVlID0gd2FpdF9ldmVudF90aW1lb3V0KHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+aW9jdGxfZndfZG5sZF93YWl0X3F1ZXVlLAogCQkJCQlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPndhaXRpbmdfdG9fZndfZG93bmxvYWRfZG9uZSwgNSpIWik7CiAKLQkJaWYodmFsdWUgPT0gMCkKLQkJewotCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwiTWFpbGJveCBJbnRlcnJ1cHQgaGFzIG5vdCByZWFjaGVkIHRvIERyaXZlci4uIik7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCJHb3QgdGhlIG1haWxib3ggaW50ZXJydXB0IC4uLlJlZ2lzdGVyaW5nIGNvbnRyb2wgaW50ZXJmYWNlLi4uXG4gIik7Ci0JCX0KLQkJaWYocmVnaXN0ZXJfY29udHJvbF9kZXZpY2VfaW50ZXJmYWNlKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcikgPCAwKQotCQl7Ci0JCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIlJlZ2lzdGVyIENvbnRyb2wgRGV2aWNlIGZhaWxlZC4uLiIpOworCQlpZiAodmFsdWUgPT0gMCkKKwkJCXByX2VycihEUlZfTkFNRSAiOiBUaW1lb3V0IHdhaXRpbmcgZm9yIG1haWxib3ggaW50ZXJydXB0LlxuIik7CisKKwkJaWYgKHJlZ2lzdGVyX2NvbnRyb2xfZGV2aWNlX2ludGVyZmFjZShwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIpIDwgMCkgeworCQkJcHJfZXJyKERSVl9OQU1FICI6IFJlZ2lzdGVyIENvbnRyb2wgRGV2aWNlIGZhaWxlZC5cbiIpOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KIAl9CiAJcmV0dXJuIDA7CiB9CiAKLSNpZiAwCi1zdGF0aWMgdm9pZAlwcmludF91c2JfaW50ZXJmYWNlX2Rlc2Moc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciAqdXNiX2ludGZfZGVzYykKLXsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICIqKioqKioqKioqKioqKioqIElOVEVSRkFDRSBERVNDUklQVE9SICoqKioqKioqKioqKioqKioqKioqKiIpOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgImJMZW5ndGg6ICV4IiwgdXNiX2ludGZfZGVzYy0+Ykxlbmd0aCk7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiYkRlc2NyaXB0b3JUeXBlOiAleCIsIHVzYl9pbnRmX2Rlc2MtPmJEZXNjcmlwdG9yVHlwZSk7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiYkludGVyZmFjZU51bWJlcjogJXgiLCB1c2JfaW50Zl9kZXNjLT5iSW50ZXJmYWNlTnVtYmVyKTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJiQWx0ZXJuYXRlU2V0dGluZzogJXgiLCB1c2JfaW50Zl9kZXNjLT5iQWx0ZXJuYXRlU2V0dGluZyk7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiYk51bUVuZHBvaW50czogJXgiLCB1c2JfaW50Zl9kZXNjLT5iTnVtRW5kcG9pbnRzKTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJiSW50ZXJmYWNlQ2xhc3M6ICV4IiwgdXNiX2ludGZfZGVzYy0+YkludGVyZmFjZUNsYXNzKTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJiSW50ZXJmYWNlU3ViQ2xhc3M6ICV4IiwgdXNiX2ludGZfZGVzYy0+YkludGVyZmFjZVN1YkNsYXNzKTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJiSW50ZXJmYWNlUHJvdG9jb2w6ICV4IiwgdXNiX2ludGZfZGVzYy0+YkludGVyZmFjZVByb3RvY29sKTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJpSW50ZXJmYWNlIDoleFxuIix1c2JfaW50Zl9kZXNjLT5pSW50ZXJmYWNlKTsKLX0KLXN0YXRpYyB2b2lkCXByaW50X3VzYl9lbmRwb2ludF9kZXNjcmlwdG9yKHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqdXNiX2VwX2Rlc2MpCi17Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiKioqKioqKioqKioqKioqKiBFTkRQT0lOVCBERVNDUklQVE9SICoqKioqKioqKioqKioqKioqKioqKiIpOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgImJMZW5ndGggIDoleCAiLCB1c2JfZXBfZGVzYy0+Ykxlbmd0aCk7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiYkRlc2NyaXB0b3JUeXBlICA6JXggIiwgdXNiX2VwX2Rlc2MtPmJEZXNjcmlwdG9yVHlwZSk7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiYkVuZHBvaW50QWRkcmVzcyAgOiV4ICIsIHVzYl9lcF9kZXNjLT5iRW5kcG9pbnRBZGRyZXNzKTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJibUF0dHJpYnV0ZXMgIDoleCAiLCB1c2JfZXBfZGVzYy0+Ym1BdHRyaWJ1dGVzKTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJ3TWF4UGFja2V0U2l6ZSAgOiV4ICIsdXNiX2VwX2Rlc2MtPndNYXhQYWNrZXRTaXplKTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJiSW50ZXJ2YWwgIDoleCAiLHVzYl9lcF9kZXNjLT5iSW50ZXJ2YWwpOwotfQotCi0jZW5kaWYKIAogc3RhdGljIGlubGluZSBpbnQgYmNtX3VzYl9lbmRwb2ludF9udW0oY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCiB7CkBAIC01MTgsMTI0ICs0MTcsMTExIEBACiAJcmV0dXJuIChiY21fdXNiX2VuZHBvaW50X3hmZXJfaXNvYyhlcGQpICYmIGJjbV91c2JfZW5kcG9pbnRfZGlyX291dChlcGQpKTsKIH0KIAotSU5UIEludGVyZmFjZUFkYXB0ZXJJbml0KFBTX0lOVEVSRkFDRV9BREFQVEVSIHBzSW50ZkFkYXB0ZXIpCitzdGF0aWMgaW50IEludGVyZmFjZUFkYXB0ZXJJbml0KFBTX0lOVEVSRkFDRV9BREFQVEVSIHBzSW50ZkFkYXB0ZXIpCiB7CiAJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaWZhY2VfZGVzYzsKIAlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50OwogCXNpemVfdCBidWZmZXJfc2l6ZTsKLQlVTE9ORyB2YWx1ZTsKLQlJTlQgcmV0dmFsID0gMDsKLQlJTlQgdXNlZEludE91dEZvckJ1bGtUcmFuc2ZlciA9IDAgOworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisJaW50IHJldHZhbCA9IDA7CisJaW50IHVzZWRJbnRPdXRGb3JCdWxrVHJhbnNmZXIgPSAwIDsKIAlCT09MRUFOIGJCY20xNiA9IEZBTFNFOwogCVVJTlQgdWlEYXRhID0gMDsKIAogCS8qIFN0b3JlIHRoZSB1c2IgZGV2IGludG8gaW50ZXJmYWNlIGFkYXB0ZXIgKi8KLQlwc0ludGZBZGFwdGVyLT51ZGV2ID0gdXNiX2dldF9kZXYoaW50ZXJmYWNlX3RvX3VzYmRldigKLQkJCQkJCQkJcHNJbnRmQWRhcHRlci0+aW50ZXJmYWNlKSk7CisJcHNJbnRmQWRhcHRlci0+dWRldiA9IHVzYl9nZXRfZGV2KGludGVyZmFjZV90b191c2JkZXYocHNJbnRmQWRhcHRlci0+aW50ZXJmYWNlKSk7CiAKLQlpZigocHNJbnRmQWRhcHRlci0+dWRldi0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpKQotCXsKLQkJcHNJbnRmQWRhcHRlci0+YkhpZ2hTcGVlZERldmljZSA9IFRSVUUgOwotCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiTU9ERU0gSVMgQ09ORklHVVJFRCBUTyBISUdIX1NQRUVEICIpOwotCX0KLQllbHNlCi0JewotCQlwc0ludGZBZGFwdGVyLT5iSGlnaFNwZWVkRGV2aWNlID0gRkFMU0UgOwotCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiTU9ERU0gSVMgQ09ORklHVVJFRCBUTyBGVUxMX1NQRUVEICIpOwotCX0KLQorCXBzSW50ZkFkYXB0ZXItPmJIaWdoU3BlZWREZXZpY2UgPSAocHNJbnRmQWRhcHRlci0+dWRldi0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpOwogCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+aW50ZXJmYWNlX3JkbSA9IEJjbVJETTsKIAlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmludGVyZmFjZV93cm0gPSBCY21XUk07CiAKLQlpZihyZG1hbHQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBDSElQX0lEX1JFRywgKFBVSU5UKSYocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5jaGlwX2lkKSwgc2l6ZW9mKFVJTlQpKSA8IDApCi0JewotCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNISVAgSUQgUmVhZCBGYWlsZWRcbiIpOwotCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7Ci0JfQotICAgIGlmKDB4YmVjZTMyMDA9PShwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmNoaXBfaWQmfigweEYwKSkpCi0JewotCQlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmNoaXBfaWQ9KHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+Y2hpcF9pZCZ+KDB4RjApKTsKKwlyZXR2YWwgPSByZG1hbHQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBDSElQX0lEX1JFRywKKwkJCSh1MzIgKikmKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+Y2hpcF9pZCksIHNpemVvZih1MzIpKTsKKwlpZiAocmV0dmFsKSB7CisJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNISVAgSUQgUmVhZCBGYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0dmFsOwogCX0KIAotCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJGaXJzdCBSRE0gQ2hpcCBJRCAweCVseFxuIiwgcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5jaGlwX2lkKTsKKwlpZiAoMHhiZWNlMzIwMCA9PSAocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5jaGlwX2lkICYgfigweEYwKSkpCisJCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+Y2hpcF9pZCAmPSB+MHhGMDsKIAotICAgIGlmYWNlX2Rlc2MgPSBwc0ludGZBZGFwdGVyLT5pbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nOwotCS8vcHJpbnRfdXNiX2ludGVyZmFjZV9kZXNjKCYoaWZhY2VfZGVzYy0+ZGVzYykpOworCWRldl9pbmZvKCZwc0ludGZBZGFwdGVyLT51ZGV2LT5kZXYsICJSRE0gQ2hpcCBJRCAweCVseFxuIiwKKwkJIHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+Y2hpcF9pZCk7CiAKLQlpZihwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmNoaXBfaWQgPT0gVDNCKQotCXsKKwlpZmFjZV9kZXNjID0gcHNJbnRmQWRhcHRlci0+aW50ZXJmYWNlLT5jdXJfYWx0c2V0dGluZzsKIAotCQkvLwotCQkvL1QzQiBkZXZpY2Ugd2lsbCBoYXZlIEVFUFJPTSxjaGVjayBpZiBFRVBST00gaXMgcHJvcGVyIGFuZCBCQ00xNiBjYW4gYmUgZG9uZSBvciBub3QuCi0JCS8vCi0JCUJlY2VlbUVFUFJPTUJ1bGtSZWFkKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwmdWlEYXRhLDB4MCw0KTsKLQkJaWYodWlEYXRhID09IEJFQ00pCi0JCXsKKwlpZiAocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5jaGlwX2lkID09IFQzQikgeworCQkvKiBUM0IgZGV2aWNlIHdpbGwgaGF2ZSBFRVBST00sIGNoZWNrIGlmIEVFUFJPTSBpcyBwcm9wZXIgYW5kIEJDTTE2IGNhbiBiZSBkb25lIG9yIG5vdC4gKi8KKwkJQmVjZWVtRUVQUk9NQnVsa1JlYWQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCAmdWlEYXRhLCAweDAsIDQpOworCQlpZiAodWlEYXRhID09IEJFQ00pCiAJCQliQmNtMTYgPSBUUlVFOwotCQl9Ci0JCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJOdW1iZXIgb2YgQWx0c2V0dGluZyBhdmlhaWxhYmxlIGZvciBUaGlzIE1vZGVtIDB4JXhcbiIsIHBzSW50ZkFkYXB0ZXItPmludGVyZmFjZS0+bnVtX2FsdHNldHRpbmcpOwotCQlpZihiQmNtMTYgPT0gVFJVRSkKLQkJewotCQkJLy9zZWxlY3RpbmcgYWx0ZXJuYXRlIHNldHRpbmcgb25lIGFzIGEgZGVmYXVsdCBzZXR0aW5nIGZvciBIaWdoIFNwZWVkICBtb2RlbS4KLQkJCWlmKHBzSW50ZkFkYXB0ZXItPmJIaWdoU3BlZWREZXZpY2UpCi0JCQkJcmV0dmFsPSB1c2Jfc2V0X2ludGVyZmFjZShwc0ludGZBZGFwdGVyLT51ZGV2LERFRkFVTFRfU0VUVElOR18wLEFMVEVSTkFURV9TRVRUSU5HXzEpOwotCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIkJDTTE2IGlzIEFwcGxpY2FibGUgb24gdGhpcyBkb25nbGUiKTsKLQkJCWlmKHJldHZhbCB8fCAocHNJbnRmQWRhcHRlci0+YkhpZ2hTcGVlZERldmljZSA9PSBGQUxTRSkpCi0JCQl7CisKKwkJZGV2X2luZm8oJnBzSW50ZkFkYXB0ZXItPnVkZXYtPmRldiwgIm51bWJlciBvZiBhbHRlcm5hdGUgc2V0dGluZyAlZFxuIiwKKwkJCSBwc0ludGZBZGFwdGVyLT5pbnRlcmZhY2UtPm51bV9hbHRzZXR0aW5nKTsKKworCQlpZiAoYkJjbTE2ID09IFRSVUUpIHsKKwkJCS8qIHNlbGVjdGluZyBhbHRlcm5hdGUgc2V0dGluZyBvbmUgYXMgYSBkZWZhdWx0IHNldHRpbmcgZm9yIEhpZ2ggU3BlZWQgIG1vZGVtLiAqLworCQkJaWYgKHBzSW50ZkFkYXB0ZXItPmJIaWdoU3BlZWREZXZpY2UpCisJCQkJcmV0dmFsPSB1c2Jfc2V0X2ludGVyZmFjZShwc0ludGZBZGFwdGVyLT51ZGV2LCBERUZBVUxUX1NFVFRJTkdfMCwgQUxURVJOQVRFX1NFVFRJTkdfMSk7CisJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwKKwkJCQkiQkNNMTYgaXMgYXBwbGljYWJsZSBvbiB0aGlzIGRvbmdsZVxuIik7CisJCQlpZiAocmV0dmFsIHx8IChwc0ludGZBZGFwdGVyLT5iSGlnaFNwZWVkRGV2aWNlID09IEZBTFNFKSkgewogCQkJCXVzZWRJbnRPdXRGb3JCdWxrVHJhbnNmZXIgPSBFUDIgOwogCQkJCWVuZHBvaW50ID0gJmlmYWNlX2Rlc2MtPmVuZHBvaW50W0VQMl0uZGVzYzsKLQkJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiSW50ZXJmYWNlIGFsdHNldHRpbmcgIGdvdCBmYWlsZWQgb3IgTW9lbWQgaXMgY29uZmlndXJlZCB0byBGUy5oZW5jZSB3aWxsIHdvcmsgb24gZGVmYXVsdCBzZXR0aW5nIDAgXG4iKTsKKwkJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwKKwkJCQkJICJJbnRlcmZhY2UgYWx0c2V0dGluZyBmYWlsZWQgb3IgbW9kZW0gaXMgY29uZmlndXJlZCB0byBGdWxsIFNwZWVkLCBoZW5jZSB3aWxsIHdvcmsgb24gZGVmYXVsdCBzZXR0aW5nIDBcbiIpOwogCQkJCS8qCi0JCQkJSWYgTW9kZW0gaXMgaGlnaCBzcGVlZCBkZXZpY2UgRVAyIHNob3VsZCBiZSBJTlQgT1VUIEVuZCBwb2ludAotCQkJCUlmIE1vZGUgaXMgRlMgdGhlbiBFUDIgc2hvdWxkIGJlIGJ1bGsgZW5kIHBvaW50Ci0JCQkJKi8KLQkJCQlpZigoKHBzSW50ZkFkYXB0ZXItPmJIaWdoU3BlZWREZXZpY2UgPT1UUlVFICkgJiYgKGJjbV91c2JfZW5kcG9pbnRfaXNfaW50X291dChlbmRwb2ludCk9PSBGQUxTRSkpCi0JCQkJCXx8KChwc0ludGZBZGFwdGVyLT5iSGlnaFNwZWVkRGV2aWNlID09IEZBTFNFKSYmIChiY21fdXNiX2VuZHBvaW50X2lzX2J1bGtfb3V0KGVuZHBvaW50KT09IEZBTFNFKSkpCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCJDb25maWd1cmluZyB0aGUgRUVQUk9NICIpOwotCQkJCQkvL2NoYW5nZSB0aGUgRVAyLCBFUDQgdG8gSU5UIE9VVCBlbmQgcG9pbnQKKwkJCQkgKiBJZiBNb2RlbSBpcyBoaWdoIHNwZWVkIGRldmljZSBFUDIgc2hvdWxkIGJlIElOVCBPVVQgRW5kIHBvaW50CisJCQkJICogSWYgTW9kZSBpcyBGUyB0aGVuIEVQMiBzaG91bGQgYmUgYnVsayBlbmQgcG9pbnQKKwkJCQkgKi8KKwkJCQlpZiAoKChwc0ludGZBZGFwdGVyLT5iSGlnaFNwZWVkRGV2aWNlID09IFRSVUUpICYmIChiY21fdXNiX2VuZHBvaW50X2lzX2ludF9vdXQoZW5kcG9pbnQpID09IEZBTFNFKSkKKwkJCQkJfHwgKChwc0ludGZBZGFwdGVyLT5iSGlnaFNwZWVkRGV2aWNlID09IEZBTFNFKSAmJiAoYmNtX3VzYl9lbmRwb2ludF9pc19idWxrX291dChlbmRwb2ludCkgPT0gRkFMU0UpKSkgeworCQkJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwKKwkJCQkJCSJDb25maWd1cmluZyB0aGUgRUVQUk9NXG4iKTsKKwkJCQkJLyogY2hhbmdlIHRoZSBFUDIsIEVQNCB0byBJTlQgT1VUIGVuZCBwb2ludCAqLwogCQkJCQlDb25maWd1cmVFbmRQb2ludFR5cGVzVGhyb3VnaEVFUFJPTShwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIpOwogCiAJCQkJCS8qCi0JCQkJCUl0IHJlc2V0cyB0aGUgZGV2aWNlIGFuZCBpZiBhbnkgdGhpbmcgZ2V0cyBjaGFuZ2VkIGluIFVTQiBkZXNjcmlwdG9yIGl0IHdpbGwgc2hvdyBmYWlsIGFuZAotCQkJCQlyZS1lbnVtZXJhdGUgdGhlIGRldmljZQotCQkJCQkqLworCQkJCQkgKiBJdCByZXNldHMgdGhlIGRldmljZSBhbmQgaWYgYW55IHRoaW5nIGdldHMgY2hhbmdlZAorCQkJCQkgKiAgaW4gVVNCIGRlc2NyaXB0b3IgaXQgd2lsbCBzaG93IGZhaWwgYW5kIHJlLWVudW1lcmF0ZQorCQkJCQkgKiB0aGUgZGV2aWNlCisJCQkJCSAqLwogCQkJCQlyZXR2YWwgPSB1c2JfcmVzZXRfZGV2aWNlKHBzSW50ZkFkYXB0ZXItPnVkZXYpOwotCQkJCQlpZihyZXR2YWwpCi0JCQkJCXsKLQkJCQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJyZXNldCBnb3QgZmFpbGVkLiBoZW5jZSBSZS1lbnVtZXJhdGluZyB0aGUgZGV2aWNlIFxuIik7CisJCQkJCWlmIChyZXR2YWwpIHsKKwkJCQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLAorCQkJCQkJCSJyZXNldCBmYWlsZWQuICBSZS1lbnVtZXJhdGluZyB0aGUgZGV2aWNlLlxuIik7CiAJCQkJCQlyZXR1cm4gcmV0dmFsIDsKIAkJCQkJfQogCiAJCQkJfQotCQkJCWlmKChwc0ludGZBZGFwdGVyLT5iSGlnaFNwZWVkRGV2aWNlID09IEZBTFNFKSAmJiBiY21fdXNiX2VuZHBvaW50X2lzX2J1bGtfb3V0KGVuZHBvaW50KSkKLQkJCQl7Ci0JCQkJCS8vIE9uY2UgQlVMSyBpcyBzZWxlY3RlZCBpbiBGUyBtb2RlLiBSZXZlcnQgaXQgYmFjayB0byBJTlQuIEVsc2UgVVNCX0lGIHdpbGwgZmFpbC4KKwkJCQlpZiAoKHBzSW50ZkFkYXB0ZXItPmJIaWdoU3BlZWREZXZpY2UgPT0gRkFMU0UpICYmIGJjbV91c2JfZW5kcG9pbnRfaXNfYnVsa19vdXQoZW5kcG9pbnQpKSB7CisJCQkJCS8qIE9uY2UgQlVMSyBpcyBzZWxlY3RlZCBpbiBGUyBtb2RlLiBSZXZlcnQgaXQgYmFjayB0byBJTlQuIEVsc2UgVVNCX0lGIHdpbGwgZmFpbC4gKi8KIAkJCQkJVUlOVCBfdWlEYXRhID0gbnRvaGwoRVAyX0NGR19JTlQpOwotCQkJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCJSZXZlcnRpbmcgQnVsayB0byBJTlQgYXMgaXQgaXMgRlMgTU9ERSIpOwotCQkJCQlCZWNlZW1FRVBST01CdWxrV3JpdGUocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLChQVUNIQVIpJl91aURhdGEsMHgxMzYsNCxUUlVFKTsKKwkJCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsIAorCQkJCQkJIlJldmVydGluZyBCdWxrIHRvIElOVCBhcyBpdCBpcyBpbiBGdWxsIFNwZWVkIG1vZGUuXG4iKTsKKwkJCQkJQmVjZWVtRUVQUk9NQnVsa1dyaXRlKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgKFBVQ0hBUikmX3VpRGF0YSwgMHgxMzYsIDQsIFRSVUUpOwogCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKKwkJCX0gZWxzZSB7CiAJCQkJdXNlZEludE91dEZvckJ1bGtUcmFuc2ZlciA9IEVQNCA7CiAJCQkJZW5kcG9pbnQgPSAmaWZhY2VfZGVzYy0+ZW5kcG9pbnRbRVA0XS5kZXNjOwotCQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJDaG9vc2luZyBBbHRTZXR0aW5nIGFzIGEgZGVmYXVsdCBzZXR0aW5nIik7Ci0JCQkJaWYoIGJjbV91c2JfZW5kcG9pbnRfaXNfaW50X291dChlbmRwb2ludCkgPT0gRkFMU0UpCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiIERvbmdsZSBkb2VzIG5vdCBoYXZlIEJDTTE2IEZpeCIpOwotCQkJCQkvL2NoYW5nZSB0aGUgRVAyLCBFUDQgdG8gSU5UIE9VVCBlbmQgcG9pbnQgYW5kIHVzZSBFUDQgaW4gYWx0c2V0dGluZworCQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLAorCQkJCQkiQ2hvb3NpbmcgQWx0U2V0dGluZyBhcyBhIGRlZmF1bHQgc2V0dGluZy5cbiIpOworCQkJCWlmIChiY21fdXNiX2VuZHBvaW50X2lzX2ludF9vdXQoZW5kcG9pbnQpID09IEZBTFNFKSB7CisJCQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLAorCQkJCQkJIkRvbmdsZSBkb2VzIG5vdCBoYXZlIEJDTTE2IEZpeC5cbiIpOworCQkJCQkvKiBjaGFuZ2UgdGhlIEVQMiwgRVA0IHRvIElOVCBPVVQgZW5kIHBvaW50IGFuZCB1c2UgRVA0IGluIGFsdHNldHRpbmcgKi8KIAkJCQkJQ29uZmlndXJlRW5kUG9pbnRUeXBlc1Rocm91Z2hFRVBST00ocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyKTsKIAogCQkJCQkvKgotCQkJCQlJdCByZXNldHMgdGhlIGRldmljZSBhbmQgaWYgYW55IHRoaW5nIGdldHMgY2hhbmdlZCBpbiBVU0IgZGVzY3JpcHRvciBpdCB3aWxsIHNob3cgZmFpbCBhbmQKLQkJCQkJcmUtZW51bWVyYXRlIHRoZSBkZXZpY2UKLQkJCQkJKi8KKwkJCQkJICogSXQgcmVzZXRzIHRoZSBkZXZpY2UgYW5kIGlmIGFueSB0aGluZyBnZXRzIGNoYW5nZWQgaW4KKwkJCQkJICogIFVTQiBkZXNjcmlwdG9yIGl0IHdpbGwgc2hvdyBmYWlsIGFuZCByZS1lbnVtZXJhdGUgdGhlCisJCQkJCSAqIGRldmljZQorCQkJCQkgKi8KIAkJCQkJcmV0dmFsID0gdXNiX3Jlc2V0X2RldmljZShwc0ludGZBZGFwdGVyLT51ZGV2KTsKLQkJCQkJaWYocmV0dmFsKQotCQkJCQl7Ci0JCQkJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAicmVzZXQgZ290IGZhaWxlZC4gaGVuY2UgUmUtZW51bWVyYXRpbmcgdGhlIGRldmljZSBcbiIpOwotCQkJCQkJcmV0dXJuIHJldHZhbCA7CisJCQkJCWlmIChyZXR2YWwpIHsKKwkJCQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLAorCQkJCQkJCSJyZXNldCBmYWlsZWQuICBSZS1lbnVtZXJhdGluZyB0aGUgZGV2aWNlLlxuIik7CisJCQkJCQlyZXR1cm4gcmV0dmFsOwogCQkJCQl9CiAKIAkJCQl9CkBAIC02NDQsOTggKzUzMCw2NiBAQAogCX0KIAogCWlmYWNlX2Rlc2MgPSBwc0ludGZBZGFwdGVyLT5pbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nOwotCS8vcHJpbnRfdXNiX2ludGVyZmFjZV9kZXNjKCYoaWZhY2VfZGVzYy0+ZGVzYykpOwotICAgCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ3VycmVudCBudW1iZXIgb2YgZW5kcG9pbnRzIDoleCBcbiIsIGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50cyk7Ci0gICAgZm9yICh2YWx1ZSA9IDA7IHZhbHVlIDwgaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzOyArK3ZhbHVlKQotCXsKLSAgICAgICAgZW5kcG9pbnQgPSAmaWZhY2VfZGVzYy0+ZW5kcG9pbnRbdmFsdWVdLmRlc2M7Ci0JCS8vcHJpbnRfdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IoZW5kcG9pbnQpOwogCi0gICAgICAgIGlmICghcHNJbnRmQWRhcHRlci0+c0J1bGtJbi5idWxrX2luX2VuZHBvaW50QWRkciAmJiBiY21fdXNiX2VuZHBvaW50X2lzX2J1bGtfaW4oZW5kcG9pbnQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBidWZmZXJfc2l6ZSA9IGxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7Ci0gICAgICAgICAgICBwc0ludGZBZGFwdGVyLT5zQnVsa0luLmJ1bGtfaW5fc2l6ZSA9IGJ1ZmZlcl9zaXplOwotICAgICAgICAgICAgcHNJbnRmQWRhcHRlci0+c0J1bGtJbi5idWxrX2luX2VuZHBvaW50QWRkciA9Ci0JCQkJCQkJCWVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOwotCSAgICAJcHNJbnRmQWRhcHRlci0+c0J1bGtJbi5idWxrX2luX3BpcGUgPQorCWZvciAodmFsdWUgPSAwOyB2YWx1ZSA8IGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50czsgKyt2YWx1ZSkgeworCQllbmRwb2ludCA9ICZpZmFjZV9kZXNjLT5lbmRwb2ludFt2YWx1ZV0uZGVzYzsKKworCQlpZiAoIXBzSW50ZkFkYXB0ZXItPnNCdWxrSW4uYnVsa19pbl9lbmRwb2ludEFkZHIgJiYgYmNtX3VzYl9lbmRwb2ludF9pc19idWxrX2luKGVuZHBvaW50KSkgeworCQkJYnVmZmVyX3NpemUgPSBsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpOworCQkJcHNJbnRmQWRhcHRlci0+c0J1bGtJbi5idWxrX2luX3NpemUgPSBidWZmZXJfc2l6ZTsKKwkJCXBzSW50ZkFkYXB0ZXItPnNCdWxrSW4uYnVsa19pbl9lbmRwb2ludEFkZHIgPSBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKKwkJCXBzSW50ZkFkYXB0ZXItPnNCdWxrSW4uYnVsa19pbl9waXBlID0KIAkJCQkJdXNiX3JjdmJ1bGtwaXBlKHBzSW50ZkFkYXB0ZXItPnVkZXYsCiAJCQkJCQkJCXBzSW50ZkFkYXB0ZXItPnNCdWxrSW4uYnVsa19pbl9lbmRwb2ludEFkZHIpOwotICAgICAgICB9CisJCX0KIAotICAgICAgICBpZiAoIXBzSW50ZkFkYXB0ZXItPnNCdWxrT3V0LmJ1bGtfb3V0X2VuZHBvaW50QWRkciAmJiBiY21fdXNiX2VuZHBvaW50X2lzX2J1bGtfb3V0KGVuZHBvaW50KSkKLSAgICAgICAgewotCi0JCQlwc0ludGZBZGFwdGVyLT5zQnVsa091dC5idWxrX291dF9lbmRwb2ludEFkZHIgPQotCQkJCQkJCQkJCWVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOwotCSAgICAJcHNJbnRmQWRhcHRlci0+c0J1bGtPdXQuYnVsa19vdXRfcGlwZSA9Ci0JCQl1c2Jfc25kYnVsa3BpcGUocHNJbnRmQWRhcHRlci0+dWRldiwKKwkJaWYgKCFwc0ludGZBZGFwdGVyLT5zQnVsa091dC5idWxrX291dF9lbmRwb2ludEFkZHIgJiYgYmNtX3VzYl9lbmRwb2ludF9pc19idWxrX291dChlbmRwb2ludCkpIHsKKwkJCXBzSW50ZkFkYXB0ZXItPnNCdWxrT3V0LmJ1bGtfb3V0X2VuZHBvaW50QWRkciA9IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOworCQkJcHNJbnRmQWRhcHRlci0+c0J1bGtPdXQuYnVsa19vdXRfcGlwZSA9CisJCQkJdXNiX3NuZGJ1bGtwaXBlKHBzSW50ZkFkYXB0ZXItPnVkZXYsCiAJCQkJCXBzSW50ZkFkYXB0ZXItPnNCdWxrT3V0LmJ1bGtfb3V0X2VuZHBvaW50QWRkcik7Ci0gICAgICAgIH0KKwkJfQogCi0gICAgICAgIGlmICghcHNJbnRmQWRhcHRlci0+c0ludHJJbi5pbnRfaW5fZW5kcG9pbnRBZGRyICYmIGJjbV91c2JfZW5kcG9pbnRfaXNfaW50X2luKGVuZHBvaW50KSkKLSAgICAgICAgewotICAgICAgICAgICAgYnVmZmVyX3NpemUgPSBsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpOwotICAgICAgICAgICAgcHNJbnRmQWRhcHRlci0+c0ludHJJbi5pbnRfaW5fc2l6ZSA9IGJ1ZmZlcl9zaXplOwotICAgICAgICAgICAgcHNJbnRmQWRhcHRlci0+c0ludHJJbi5pbnRfaW5fZW5kcG9pbnRBZGRyID0KLQkJCQkJCQkJZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7Ci0gICAgICAgICAgICBwc0ludGZBZGFwdGVyLT5zSW50ckluLmludF9pbl9pbnRlcnZhbCA9IGVuZHBvaW50LT5iSW50ZXJ2YWw7Ci0gICAgICAgICAgICBwc0ludGZBZGFwdGVyLT5zSW50ckluLmludF9pbl9idWZmZXIgPQorCQlpZiAoIXBzSW50ZkFkYXB0ZXItPnNJbnRySW4uaW50X2luX2VuZHBvaW50QWRkciAmJiBiY21fdXNiX2VuZHBvaW50X2lzX2ludF9pbihlbmRwb2ludCkpIHsKKwkJCWJ1ZmZlcl9zaXplID0gbGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKTsKKwkJCXBzSW50ZkFkYXB0ZXItPnNJbnRySW4uaW50X2luX3NpemUgPSBidWZmZXJfc2l6ZTsKKwkJCXBzSW50ZkFkYXB0ZXItPnNJbnRySW4uaW50X2luX2VuZHBvaW50QWRkciA9IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOworCQkJcHNJbnRmQWRhcHRlci0+c0ludHJJbi5pbnRfaW5faW50ZXJ2YWwgPSBlbmRwb2ludC0+YkludGVydmFsOworCQkJcHNJbnRmQWRhcHRlci0+c0ludHJJbi5pbnRfaW5fYnVmZmVyID0KIAkJCQkJCWttYWxsb2MoYnVmZmVyX3NpemUsIEdGUF9LRVJORUwpOwotICAgICAgICAgICAgaWYgKCFwc0ludGZBZGFwdGVyLT5zSW50ckluLmludF9pbl9idWZmZXIpIHsKLSAgICAgICAgICAgICAgICBCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiQ291bGQgbm90IGFsbG9jYXRlIGludGVycnVwdF9pbl9idWZmZXIiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLQkJCS8vcHNJbnRmQWRhcHRlci0+c0ludHJJbi5pbnRfaW5fcGlwZSA9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXBzSW50ZkFkYXB0ZXItPnNJbnRyT3V0LmludF9vdXRfZW5kcG9pbnRBZGRyICYmIGJjbV91c2JfZW5kcG9pbnRfaXNfaW50X291dChlbmRwb2ludCkpCi0gICAgICAgIHsKLQotCQkJaWYoICFwc0ludGZBZGFwdGVyLT5zQnVsa091dC5idWxrX291dF9lbmRwb2ludEFkZHIgJiYKLQkJCQkocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5jaGlwX2lkID09IFQzQikgJiYgKHZhbHVlID09IHVzZWRJbnRPdXRGb3JCdWxrVHJhbnNmZXIpKQotCQkJewotCQkJCS8vdXNlIGZpcnN0IGludG91dCBlbmQgcG9pbnQgYXMgYSBidWxrIG91dCBlbmQgcG9pbnQKLSAgICAgICAgICAgIAlidWZmZXJfc2l6ZSA9IGxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7Ci0gICAgICAgICAgICAJcHNJbnRmQWRhcHRlci0+c0J1bGtPdXQuYnVsa19vdXRfc2l6ZSA9IGJ1ZmZlcl9zaXplOwotCQkJCS8vcHJpbnRrKCJcbklOVCBPVVQgRW5kcG9pbmcgYnVmZmVyIHNpemUgOiV4IGVuZHBvaW50IDoleFxuIiwgYnVmZmVyX3NpemUsIHZhbHVlICsxKTsKLQkJCQlwc0ludGZBZGFwdGVyLT5zQnVsa091dC5idWxrX291dF9lbmRwb2ludEFkZHIgPQotCQkJCQkJCQkJCWVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOwotCSAgICAJCXBzSW50ZkFkYXB0ZXItPnNCdWxrT3V0LmJ1bGtfb3V0X3BpcGUgPQotCQkJCXVzYl9zbmRpbnRwaXBlKHBzSW50ZkFkYXB0ZXItPnVkZXYsCi0JCQkJCXBzSW50ZkFkYXB0ZXItPnNCdWxrT3V0LmJ1bGtfb3V0X2VuZHBvaW50QWRkcik7Ci0gICAgICAgICAgCSAgCXBzSW50ZkFkYXB0ZXItPnNCdWxrT3V0LmludF9vdXRfaW50ZXJ2YWwgPSBlbmRwb2ludC0+YkludGVydmFsOwotCisJCQlpZiAoIXBzSW50ZkFkYXB0ZXItPnNJbnRySW4uaW50X2luX2J1ZmZlcikgeworCQkJCWRldl9lcnIoJnBzSW50ZkFkYXB0ZXItPnVkZXYtPmRldiwKKwkJCQkJImNvdWxkIG5vdCBhbGxvY2F0ZSBpbnRlcnJ1cHRfaW5fYnVmZmVyXG4iKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KLQkJCWVsc2UgaWYodmFsdWUgPT0gRVA2KQotCQkJewotCSAgICAgICAgICAgIGJ1ZmZlcl9zaXplID0gbGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKTsKLQkgICAgICAgICAgICBwc0ludGZBZGFwdGVyLT5zSW50ck91dC5pbnRfb3V0X3NpemUgPSBidWZmZXJfc2l6ZTsKLQkgICAgICAgICAgICBwc0ludGZBZGFwdGVyLT5zSW50ck91dC5pbnRfb3V0X2VuZHBvaW50QWRkciA9Ci0JCQkJCQkJCQkJZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7Ci0JICAgICAgICAgICAgcHNJbnRmQWRhcHRlci0+c0ludHJPdXQuaW50X291dF9pbnRlcnZhbCA9IGVuZHBvaW50LT5iSW50ZXJ2YWw7Ci0JICAgICAgICAgICAgcHNJbnRmQWRhcHRlci0+c0ludHJPdXQuaW50X291dF9idWZmZXI9IGttYWxsb2MoYnVmZmVyX3NpemUsCi0JCQkJCQkJCQkJCQkJCUdGUF9LRVJORUwpOwotCSAgICAgICAgICAgIAlpZiAoIXBzSW50ZkFkYXB0ZXItPnNJbnRyT3V0LmludF9vdXRfYnVmZmVyKQotCQkJCQl7Ci0JICAgICAgICAgICAgICAgIEJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJDb3VsZCBub3QgYWxsb2NhdGUgaW50ZXJydXB0X291dF9idWZmZXIiKTsKLQkgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9CisJCX0KKworCQlpZiAoIXBzSW50ZkFkYXB0ZXItPnNJbnRyT3V0LmludF9vdXRfZW5kcG9pbnRBZGRyICYmIGJjbV91c2JfZW5kcG9pbnRfaXNfaW50X291dChlbmRwb2ludCkpIHsKKwkJCWlmICghcHNJbnRmQWRhcHRlci0+c0J1bGtPdXQuYnVsa19vdXRfZW5kcG9pbnRBZGRyICYmCisJCQkJKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+Y2hpcF9pZCA9PSBUM0IpICYmICh2YWx1ZSA9PSB1c2VkSW50T3V0Rm9yQnVsa1RyYW5zZmVyKSkgeworCQkJCS8qIHVzZSBmaXJzdCBpbnRvdXQgZW5kIHBvaW50IGFzIGEgYnVsayBvdXQgZW5kIHBvaW50ICovCisJCQkJYnVmZmVyX3NpemUgPSBsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpOworCQkJCXBzSW50ZkFkYXB0ZXItPnNCdWxrT3V0LmJ1bGtfb3V0X3NpemUgPSBidWZmZXJfc2l6ZTsKKwkJCQlwc0ludGZBZGFwdGVyLT5zQnVsa091dC5idWxrX291dF9lbmRwb2ludEFkZHIgPSBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKKwkJCQlwc0ludGZBZGFwdGVyLT5zQnVsa091dC5idWxrX291dF9waXBlID0gdXNiX3NuZGludHBpcGUocHNJbnRmQWRhcHRlci0+dWRldiwKKwkJCQkJCQkJCXBzSW50ZkFkYXB0ZXItPnNCdWxrT3V0LmJ1bGtfb3V0X2VuZHBvaW50QWRkcik7CisJCQkJcHNJbnRmQWRhcHRlci0+c0J1bGtPdXQuaW50X291dF9pbnRlcnZhbCA9IGVuZHBvaW50LT5iSW50ZXJ2YWw7CisJCQl9IGVsc2UgaWYgKHZhbHVlID09IEVQNikgeworCQkJCWJ1ZmZlcl9zaXplID0gbGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKTsKKwkJCQlwc0ludGZBZGFwdGVyLT5zSW50ck91dC5pbnRfb3V0X3NpemUgPSBidWZmZXJfc2l6ZTsKKwkJCQlwc0ludGZBZGFwdGVyLT5zSW50ck91dC5pbnRfb3V0X2VuZHBvaW50QWRkciA9IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOworCQkJCXBzSW50ZkFkYXB0ZXItPnNJbnRyT3V0LmludF9vdXRfaW50ZXJ2YWwgPSBlbmRwb2ludC0+YkludGVydmFsOworCQkJCXBzSW50ZkFkYXB0ZXItPnNJbnRyT3V0LmludF9vdXRfYnVmZmVyPSBrbWFsbG9jKGJ1ZmZlcl9zaXplLCBHRlBfS0VSTkVMKTsKKwkJCQlpZiAoIXBzSW50ZkFkYXB0ZXItPnNJbnRyT3V0LmludF9vdXRfYnVmZmVyKSB7CisJCQkJCWRldl9lcnIoJnBzSW50ZkFkYXB0ZXItPnVkZXYtPmRldiwKKwkJCQkJCSJjb3VsZCBub3QgYWxsb2NhdGUgaW50ZXJydXB0X291dF9idWZmZXJcbiIpOworCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisJCQl9CisJCX0KIAl9Ci0gICAgdXNiX3NldF9pbnRmZGF0YShwc0ludGZBZGFwdGVyLT5pbnRlcmZhY2UsIHBzSW50ZkFkYXB0ZXIpOwotICAgIHJldHZhbCA9IHVzYl9yZWdpc3Rlcl9kZXYocHNJbnRmQWRhcHRlci0+aW50ZXJmYWNlLCAmdXNiYmNtX2NsYXNzKTsKLQlpZihyZXR2YWwpCi0JewotCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgInVzYiByZWdpc3RlciBkZXYgZmFpbGVkID0gJWQiLCByZXR2YWwpOwotCQlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmJVc2JDbGFzc0RyaXZlclJlZ2lzdGVyZWQgPSBGQUxTRTsKLQkJcmV0dXJuIHJldHZhbDsKLQl9Ci0JZWxzZQotCXsKLQkJcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5iVXNiQ2xhc3NEcml2ZXJSZWdpc3RlcmVkID0gVFJVRTsKLQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJ1c2IgZGV2IHJlZ2lzdGVyZWQiKTsKLQl9CisKKwl1c2Jfc2V0X2ludGZkYXRhKHBzSW50ZkFkYXB0ZXItPmludGVyZmFjZSwgcHNJbnRmQWRhcHRlcik7CiAKIAlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmJjbV9maWxlX2Rvd25sb2FkID0gSW50ZXJmYWNlRmlsZURvd25sb2FkOwogCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+YmNtX2ZpbGVfcmVhZGJhY2tfZnJvbV9jaGlwID0KQEAgLTc0NCw2NyArNTk4LDUxIEBACiAKIAlyZXR2YWwgPSBDcmVhdGVJbnRlcnJ1cHRVcmIocHNJbnRmQWRhcHRlcik7CiAKLQlpZihyZXR2YWwpCi0JewotCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNhbm5vdCBjcmVhdGUgaW50ZXJydXB0IHVyYiIpOworCWlmIChyZXR2YWwpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJIkNhbm5vdCBjcmVhdGUgaW50ZXJydXB0IHVyYlxuIik7CiAJCXJldHVybiByZXR2YWw7CiAJfQogCiAJcmV0dmFsID0gQWxsb2NVc2JDYihwc0ludGZBZGFwdGVyKTsKLQlpZihyZXR2YWwpCi0JeworCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7Ci0JfQogCi0KLQlyZXR2YWwgPSBkZXZpY2VfcnVuKHBzSW50ZkFkYXB0ZXIpOwotCWlmKHJldHZhbCkKLQl7Ci0JCXJldHVybiByZXR2YWw7Ci0JfQotCi0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gZGV2aWNlX3J1bihwc0ludGZBZGFwdGVyKTsKIH0KIAotc3RhdGljIGludCBJbnRlcmZhY2VTdXNwZW5kIChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCitzdGF0aWMgaW50IEludGVyZmFjZVN1c3BlbmQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIHBtX21lc3NhZ2VfdCBtZXNzYWdlKQogewogCVBTX0lOVEVSRkFDRV9BREFQVEVSICBwc0ludGZBZGFwdGVyID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKLQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKLQkvL0JjbV9raWxsX2FsbF9VUkJzKHBzSW50ZkFkYXB0ZXIpOworCiAJcHNJbnRmQWRhcHRlci0+YlN1c3BlbmRlZCA9IFRSVUU7CiAKLQlpZihUUlVFID09IHBzSW50ZkFkYXB0ZXItPmJQcmVwYXJpbmdGb3JCdXNTdXNwZW5kKQotCXsKKwlpZiAoVFJVRSA9PSBwc0ludGZBZGFwdGVyLT5iUHJlcGFyaW5nRm9yQnVzU3VzcGVuZCkgewogCQlwc0ludGZBZGFwdGVyLT5iUHJlcGFyaW5nRm9yQnVzU3VzcGVuZCA9IEZBTFNFOwogCi0JCWlmKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+TGlua1N0YXR1cyA9PSBMSU5LVVBfRE9ORSkKLQkJeworCQlpZiAocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5MaW5rU3RhdHVzID09IExJTktVUF9ET05FKSB7CiAJCQlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPklkbGVNb2RlID0gVFJVRSA7Ci0JCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiSG9zdCBFbnRlcmVkIGluIFBNVSBJZGxlIE1vZGUuLiIpOwotCQl9Ci0JCWVsc2UKLQkJeworCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsCisJCQkJIkhvc3QgRW50ZXJlZCBpbiBQTVUgSWRsZSBNb2RlLlxuIik7CisJCX0gZWxzZSB7CiAJCQlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmJTaHV0U3RhdHVzID0gVFJVRTsKLQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJIb3N0IEVudGVyZWQgaW4gUE1VIFNodXRkb3duIE1vZGUuLiIpOworCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsCisJCQkJIkhvc3QgRW50ZXJlZCBpbiBQTVUgU2h1dGRvd24gTW9kZS5cbiIpOwogCQl9CiAJfQogCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9IEZBTFNFOwogCi0JLy9TaWduYWxpbmcgdGhlIGNvbnRyb2wgcGt0IHBhdGgKKwkvKiBTaWduYWxpbmcgdGhlIGNvbnRyb2wgcGt0IHBhdGggKi8KIAl3YWtlX3VwKCZwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmxvd3Bvd2VyX21vZGVfd2FpdF9xdWV1ZSk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBJbnRlcmZhY2VSZXN1bWUgKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQorc3RhdGljIGludCBJbnRlcmZhY2VSZXN1bWUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7Ci0gICAgUFNfSU5URVJGQUNFX0FEQVBURVIgIHBzSW50ZkFkYXB0ZXIgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwotCXByaW50aygiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKwlQU19JTlRFUkZBQ0VfQURBUFRFUiAgcHNJbnRmQWRhcHRlciA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CiAJbWRlbGF5KDEwMCk7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwgNiwgMzIpCi0gCWludGYtPnBtX3VzYWdlX2NudCA9MSA7Ci0jZW5kaWYKKwogCXBzSW50ZkFkYXB0ZXItPmJTdXNwZW5kZWQgPSBGQUxTRTsKIAogCVN0YXJ0SW50ZXJydXB0VXJiKHBzSW50ZkFkYXB0ZXIpOwpAQCAtODEyLDU3ICs2NTAsNDEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBJbnRlcmZhY2VQcmVSZXNldChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKLXsKLSAgICBwcmludGsoIj09PT09PT09PT09PT09PT09PT09PiIpOwotCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludCBJbnRlcmZhY2VQb3N0UmVzZXQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCi17Ci0gICAgcHJpbnRrKCJEbyBQb3N0IGNoaXAgcmVzZXQgc2V0dGluZyBoZXJlIGlmIGl0IGlzIHJlcXVpcmVkIik7Ci0gICAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwotfQogc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHVzYmJjbV9kcml2ZXIgPSB7Ci0gICAgLm5hbWUgPSAidXNiYmNtIiwKLSAgICAucHJvYmUgPSB1c2JiY21fZGV2aWNlX3Byb2JlLAotICAgIC5kaXNjb25uZWN0ID0gdXNiYmNtX2Rpc2Nvbm5lY3QsCi0gICAgLnN1c3BlbmQgPSBJbnRlcmZhY2VTdXNwZW5kLAotICAgIC5yZXN1bWUgPSBJbnRlcmZhY2VSZXN1bWUsCi0JLnByZV9yZXNldD1JbnRlcmZhY2VQcmVSZXNldCwKLQkucG9zdF9yZXNldD1JbnRlcmZhY2VQb3N0UmVzZXQsCi0gICAgLmlkX3RhYmxlID0gSW50ZXJmYWNlVXNidGFibGUsCi0gICAgLnN1cHBvcnRzX2F1dG9zdXNwZW5kID0gMSwKKwkubmFtZSA9ICJ1c2JiY20iLAorCS5wcm9iZSA9IHVzYmJjbV9kZXZpY2VfcHJvYmUsCisJLmRpc2Nvbm5lY3QgPSB1c2JiY21fZGlzY29ubmVjdCwKKwkuc3VzcGVuZCA9IEludGVyZmFjZVN1c3BlbmQsCisJLnJlc3VtZSA9IEludGVyZmFjZVJlc3VtZSwKKwkuaWRfdGFibGUgPSBJbnRlcmZhY2VVc2J0YWJsZSwKKwkuc3VwcG9ydHNfYXV0b3N1c3BlbmQgPSAxLAogfTsKIAorc3RydWN0IGNsYXNzICpiY21fY2xhc3M7CiAKLS8qCi1GdW5jdGlvbjoJCQkJSW50ZXJmYWNlSW5pdGlhbGl6ZQotCi1EZXNjcmlwdGlvbjoJCQlUaGlzIGlzIHRoZSBoYXJkd2FyZSBzcGVjaWZpYyBpbml0aWFsaXphdGlvbiBGdW5jdGlvbi4KLQkJCQkJCVJlZ2lzdGVyaW5nIHRoZSBkcml2ZXIgd2l0aCBORElTICwgb3RoZXIgZGV2aWNlIHNwZWNpZmljIE5ESVMKLQkJCQkJCWFuZCBoYXJkd2FyZSBpbml0aWFsaXphdGlvbnMgYXJlIGRvbmUgaGVyZS4KLQotSW5wdXQgcGFyYW1ldGVyczoJCUlOIFBNSU5JX0FEQVBURVIgQWRhcHRlciAgIC0gTWluaXBvcnQgQWRhcHRlciBDb250ZXh0Ci0KLQotUmV0dXJuOgkJCQkJQkNNX1NUQVRVU19TVUNDRVNTIC0gSWYgSW5pdGlhbGl6YXRpb24gb2YgdGhlCi0JCQkJCQlIVyBJbnRlcmZhY2Ugd2FzIHN1Y2Nlc3NmdWwuCi0JCQkJCQlPdGhlciAgICAgICAgICAgLSBJZiBhbiBlcnJvciBvY2N1cmVkLgotKi8KLUlOVCBJbnRlcmZhY2VJbml0aWFsaXplKHZvaWQpCitzdGF0aWMgX19pbml0IGludCBiY21faW5pdCh2b2lkKQogewotLy8JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJSZWdpc3RlcmluZyBVc2IgZHJpdmVyISEiKTsKKwlwcmludGsoS0VSTl9JTkZPICIlczogJXMsICVzXG4iLCBEUlZfTkFNRSwgRFJWX0RFU0NSSVBUSU9OLCBEUlZfVkVSU0lPTik7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIERSVl9DT1BZUklHSFQpOworCisJYmNtX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCBEUlZfTkFNRSk7CisJaWYgKElTX0VSUihiY21fY2xhc3MpKSB7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiOiBjb3VsZCBub3QgY3JlYXRlIGNsYXNzXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoYmNtX2NsYXNzKTsKKwl9CisKIAlyZXR1cm4gdXNiX3JlZ2lzdGVyKCZ1c2JiY21fZHJpdmVyKTsKIH0KIAotSU5UIEludGVyZmFjZUV4aXQodm9pZCkKK3N0YXRpYyBfX2V4aXQgdm9pZCBiY21fZXhpdCh2b2lkKQogewotCS8vUE1JTklfQURBUFRFUiBwc0FkYXB0ZXIgPSBOVUxMOwotCWludCBzdGF0dXMgPSAwOwotCi0JLy9CQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIkRlcmVnaXN0ZXJpbmcgVXNiIGRyaXZlciEhIik7CiAJdXNiX2RlcmVnaXN0ZXIoJnVzYmJjbV9kcml2ZXIpOwotCXJldHVybiBzdGF0dXM7CisJY2xhc3NfZGVzdHJveShiY21fY2xhc3MpOwogfQotTU9EVUxFX0xJQ0VOU0UgKCJHUEwiKTsKKworbW9kdWxlX2luaXQoYmNtX2luaXQpOworbW9kdWxlX2V4aXQoYmNtX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oRFJWX0RFU0NSSVBUSU9OKTsKK01PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlSW5pdC5oIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VJbml0LmgKaW5kZXggZTdhOTZlNS4uMDU4MzE1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VJbml0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VJbml0LmgKQEAgLTgsOSArOCwxMSBAQAogI2RlZmluZSBCQ01fVVNCX1BST0RVQ1RfSURfVDMgCTB4MDMwMAogI2RlZmluZSBCQ01fVVNCX1BST0RVQ1RfSURfVDNCIAkweDAyMTAKICNkZWZpbmUgQkNNX1VTQl9QUk9EVUNUX0lEX1QzTCAJMHgwMjIwCisjZGVmaW5lIEJDTV9VU0JfUFJPRFVDVF9JRF9TTTI1MCAJMHhiY2NkCiAjZGVmaW5lIEJDTV9VU0JfUFJPRFVDVF9JRF9TWU0gIDB4MTVFCiAjZGVmaW5lIEJDTV9VU0JfUFJPRFVDVF9JRF8xOTAxIDB4ZTAxNwogI2RlZmluZSBCQ01fVVNCX1BST0RVQ1RfSURfMjI2ICAweDAxMzIKKyNkZWZpbmUgQkNNX1VTQl9QUk9EVUNUX0lEX1pURV9UVTI1IDB4MDAwNwogCiAjZGVmaW5lIEJDTV9VU0JfTUlOT1JfQkFTRSAJCTE5MgogCkBAIC0xOSwzMyArMjEsNyBAQAogCiBJTlQgSW50ZXJmYWNlRXhpdCh2b2lkKTsKIAotI2lmbmRlZiBCQ01fU0hNX0lOVEVSRkFDRQotSU5UIEludGVyZmFjZUFkYXB0ZXJJbml0KFBTX0lOVEVSRkFDRV9BREFQVEVSIEFkYXB0ZXIpOwotCiBJTlQgdXNiYmNtX3dvcmtlcl90aHJlYWQoUFNfSU5URVJGQUNFX0FEQVBURVIgcHNJbnRmQWRhcHRlcik7CiAKLVZPSUQgSW50ZXJmYWNlQWRhcHRlckZyZWUoUFNfSU5URVJGQUNFX0FEQVBURVIgcHNJbnRmQWRhcHRlcik7Ci0KLSNlbHNlCi1JTlQgSW50ZXJmYWNlQWRhcHRlckluaXQoUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKLSNlbmRpZgotCi0KLSNpZiAwCi0KLVVMT05HIEludGVyZmFjZUNsYWltQWRhcHRlcihQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwotCi1WT0lEIEludGVyZmFjZUREUkNvbnRyb2xsZXJJbml0KFBNSU5JX0FEQVBURVIgQWRhcHRlcik7Ci0KLVVMT05HIEludGVyZmFjZVJlc2V0KFBNSU5JX0FEQVBURVIgQWRhcHRlcik7Ci0KLVVMT05HIEludGVyZmFjZVJlZ2lzdGVyUmVzb3VyY2VzKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7Ci0KLVZPSUQgSW50ZXJmYWNlVW5SZWdpc3RlclJlc291cmNlcyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwotCi1VTE9ORyBJbnRlcmZhY2VGaXJtd2FyZURvd25sb2FkKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7Ci0KLSNlbmRpZgotCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VJc3IuYyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlSXNyLmMKaW5kZXggZjkyOGZlNC4uMjIwZmY5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VJc3IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZUlzci5jCkBAIC0xLDYgKzEsNSBAQAogI2luY2x1ZGUgImhlYWRlcnMuaCIKIAotI2lmbmRlZiBCQ01fU0hNX0lOVEVSRkFDRQogCiBzdGF0aWMgdm9pZCByZWFkX2ludF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIvKiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MqLykKIHsKQEAgLTgsNiArNywxMCBAQAogCVBTX0lOVEVSRkFDRV9BREFQVEVSIHBzSW50ZkFkYXB0ZXIgPSAoUFNfSU5URVJGQUNFX0FEQVBURVIpdXJiLT5jb250ZXh0OwogCVBNSU5JX0FEQVBURVIgQWRhcHRlciA9IHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciA7CiAKKwlpZiAobmV0aWZfbXNnX2ludHIoQWRhcHRlcikpCisJCXByX2luZm8oUEZYICIlczogaW50ZXJydXB0IHN0YXR1cyAlZFxuIiwKKwkJCUFkYXB0ZXItPmRldi0+bmFtZSwgc3RhdHVzKTsKKwogCWlmKEFkYXB0ZXItPmRldmljZV9yZW1vdmVkID09IFRSVUUpCiAJewogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIElOVEZfSU5JVCwgREJHX0xWTF9BTEwsIkRldmljZSBoYXMgR290IFJlbW92ZWQuIik7CkBAIC04Nyw3ICs5MCw3IEBACiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBJTlRGX0lOSVQsIERCR19MVkxfQUxMLCJJbnRlcnJ1cHQgSU4gZW5kUG9pbnQgIGhhcyBnb3QgaGFsdGVkL3N0YWxsZWQuLi5uZWVkIHRvIGNsZWFyIHRoaXMiKTsKIAkJCQlBZGFwdGVyLT5iRW5kUG9pbnRIYWx0ZWQgPSBUUlVFIDsKIAkJCQl3YWtlX3VwKCZBZGFwdGVyLT50eF9wYWNrZXRfd2FpdF9xdWV1ZSk7Ci0JCQkJdXJiLT5zdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUyA7OworCQkJCXVyYi0+c3RhdHVzID0gU1RBVFVTX1NVQ0NFU1MgOwogCQkJCXJldHVybjsKIAkJfQogCSAgICAvKiBzb2Z0d2FyZS1kcml2ZW4gaW50ZXJmYWNlIHNodXRkb3duICovCkBAIC0xNjQsNDAgKzE2NywzIEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotLyoKLUZ1bmN0aW9uOgkJCQlJbnRlcmZhY2VFbmFibGVJbnRlcnJ1cHQKLQotRGVzY3JpcHRpb246CQkJVGhpcyBpcyB0aGUgaGFyZHdhcmUgc3BlY2lmaWMgRnVuY3Rpb24gZm9yIGNvbmZpZ3VyaW5nCi0JCQkJCQlhbmQgZW5hYmxpbmcgdGhlIGludGVycnVwdHMgb24gdGhlIGRldmljZS4KLQotSW5wdXQgcGFyYW1ldGVyczoJCUlOIFBNSU5JX0FEQVBURVIgQWRhcHRlciAgIC0gTWluaXBvcnQgQWRhcHRlciBDb250ZXh0Ci0KLQotUmV0dXJuOgkJCQlCQ01fU1RBVFVTX1NVQ0NFU1MgLSBJZiBjb25maWd1cmluZyB0aGUgaW50ZXJydXB0cyB3YXMgc3VjY2Vzc2Z1bC4KLQkJCQkJCU90aGVyICAgICAgICAgICAtIElmIGFuIGVycm9yIG9jY3VyZWQuCi0qLwotCi12b2lkIEludGVyZmFjZUVuYWJsZUludGVycnVwdChQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCi17Ci0KLX0KLQotLyoKLUZ1bmN0aW9uOgkJCQlJbnRlcmZhY2VEaXNhYmxlSW50ZXJydXB0Ci0KLURlc2NyaXB0aW9uOgkJCVRoaXMgaXMgdGhlIGhhcmR3YXJlIHNwZWNpZmljIEZ1bmN0aW9uIGZvciBkaXNhYmxpbmcgdGhlIGludGVycnVwdHMgb24gdGhlIGRldmljZS4KLQotSW5wdXQgcGFyYW1ldGVyczoJCUlOIFBNSU5JX0FEQVBURVIgQWRhcHRlciAgIC0gTWluaXBvcnQgQWRhcHRlciBDb250ZXh0Ci0KLQotUmV0dXJuOgkJCQlCQ01fU1RBVFVTX1NVQ0NFU1MgLSBJZiBkaXNhYmxpbmcgdGhlIGludGVycnVwdHMgd2FzIHN1Y2Nlc3NmdWwuCi0JCQkJCQlPdGhlciAgICAgICAgICAgLSBJZiBhbiBlcnJvciBvY2N1cmVkLgotKi8KLQotdm9pZCBJbnRlcmZhY2VEaXNhYmxlSW50ZXJydXB0KFBNSU5JX0FEQVBURVIgQWRhcHRlcikKLXsKLQotfQotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VNaXNjLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZU1pc2MuYwppbmRleCA4ZmM4OTNiLi5hNTExODViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZU1pc2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZU1pc2MuYwpAQCAtMSwxNyArMSw1IEBACiAjaW5jbHVkZSAiaGVhZGVycy5oIgogCi0jaWZuZGVmIEJDTV9TSE1fSU5URVJGQUNFCi0KLVBTX0lOVEVSRkFDRV9BREFQVEVSCi1JbnRlcmZhY2VBZGFwdGVyR2V0KFBNSU5JX0FEQVBURVIgcHNBZGFwdGVyKQotewotCWlmKHBzQWRhcHRlciA9PSBOVUxMKQotCXsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAoUFNfSU5URVJGQUNFX0FEQVBURVIpKHBzQWRhcHRlci0+cHZJbnRlcmZhY2VBZGFwdGVyKTsKLX0KLQogSU5UCiBJbnRlcmZhY2VSRE0oUFNfSU5URVJGQUNFX0FEQVBURVIgcHNJbnRmQWRhcHRlciwKICAgICAgICAgICAgIFVJTlQgYWRkciwKQEAgLTEwMiw3ICs5MCw3IEBACiAJaWYoKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+U3RvcEFsbFhhY3Rpb24gPT0gVFJVRSkgJiYgKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+Y2hpcF9pZCA+PSBUM0xQQikpCiAJewogCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX09USEVSUywgV1JNLCBEQkdfTFZMX0FMTCwiQ3VycmVudGx5IFhhY3Rpb24gaXMgbm90IGFsbG93ZWQgb24gdGhlIGJ1cy4uLiIpOwotCQlyZXR1cm4gRUFDQ0VTOworCQlyZXR1cm4gLUVBQ0NFUzsKIAl9CiAKIAlpZihwc0ludGZBZGFwdGVyLT5iU3VzcGVuZGVkID09VFJVRSB8fCBwc0ludGZBZGFwdGVyLT5iUHJlcGFyaW5nRm9yQnVzU3VzcGVuZCA9PSBUUlVFKQpAQCAtMjM2LDkgKzIyNCw3IEBACiAJfQogCiAJLyogQ2FuY2VsIEFsbCBzdWJtaXR0ZWQgVFggVVJCJ3MgKi8KLQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNhbmNlbGxpbmcgQWxsIFN1Ym1pdHRlZCBUWCBVcmJzIFxuIik7Ci0KLSAgICBmb3IoaSA9IDA7IGkgPCBNQVhJTVVNX1VTQl9UQ0I7IGkrKykKKwlmb3IoaSA9IDA7IGkgPCBNQVhJTVVNX1VTQl9UQ0I7IGkrKykKIAl7CiAJCXRlbXBVcmIgPSBwc0ludGZBZGFwdGVyLT5hc1VzYlRjYltpXS51cmI7CiAJCWlmKHRlbXBVcmIpCkBAIC0yNDgsOSArMjM0LDYgQEAKIAkJfQogCX0KIAotCi0gICAgQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJDYW5jZWxsaW5nIEFsbCBzdWJtaXR0ZWQgUnggVXJicyBcbiIpOwotCiAJZm9yKGkgPSAwOyBpIDwgTUFYSU1VTV9VU0JfUkNCOyBpKyspCiAJewogCQl0ZW1wVXJiID0gcHNJbnRmQWRhcHRlci0+YXNVc2JSY2JbaV0udXJiOwpAQCAtMjYxLDE2ICsyNDQsMTEgQEAKIAkJfQogCX0KIAotCiAJYXRvbWljX3NldCgmcHNJbnRmQWRhcHRlci0+dU51bVRjYlVzZWQsIDApOwogCWF0b21pY19zZXQoJnBzSW50ZkFkYXB0ZXItPnVDdXJyVGNiLCAwKTsKIAogCWF0b21pY19zZXQoJnBzSW50ZkFkYXB0ZXItPnVOdW1SY2JVc2VkLCAwKTsKIAlhdG9taWNfc2V0KCZwc0ludGZBZGFwdGVyLT51Q3VyclJjYiwgMCk7Ci0KLQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIlRDQjogdXNlZC0gJWQgY3VyLSVkXG4iLCBhdG9taWNfcmVhZCgmcHNJbnRmQWRhcHRlci0+dU51bVRjYlVzZWQpLCBhdG9taWNfcmVhZCgmcHNJbnRmQWRhcHRlci0+dUN1cnJUY2IpKTsKLQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIlJDQjogdXNlZC0gJWQgY3VyLSVkXG4iLCBhdG9taWNfcmVhZCgmcHNJbnRmQWRhcHRlci0+dU51bVJjYlVzZWQpLCBhdG9taWNfcmVhZCgmcHNJbnRmQWRhcHRlci0+dUN1cnJSY2IpKTsKLQogfQogCiBWT0lEIHB1dFVzYlN1c3BlbmQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQpAQCAtMjgyLDkgKzI2MCw2IEBACiAKIAlpZihwc0ludGZBZGFwdGVyLT5iU3VzcGVuZGVkID09IEZBTFNFKQogCQl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2UoaW50Zik7Ci0JZWxzZQotCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX1RYLCBORVhUX1NFTkQsIERCR19MVkxfQUxMLCAiSW50ZXJmYWNlIFJlc3VtZWQgQ29tcGxldGVseVxuIik7CiAKIH0KIAotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZU1pc2MuaCBiL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlTWlzYy5oCmluZGV4IDc0YzgxZDQuLjZjOWUzOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlTWlzYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlTWlzYy5oCkBAIC0xLDkgKzEsNiBAQAogI2lmbmRlZiBfX0lOVEVSRkFDRV9NSVNDX0gKICNkZWZpbmUgX19JTlRFUkZBQ0VfTUlTQ19ICiAKLVBTX0lOVEVSRkFDRV9BREFQVEVSCi1JbnRlcmZhY2VBZGFwdGVyR2V0KFBNSU5JX0FEQVBURVIgcHNBZGFwdGVyKTsKLQogSU5UCiBJbnRlcmZhY2VSRE0oUFNfSU5URVJGQUNFX0FEQVBURVIgcHNJbnRmQWRhcHRlciwKIAkJCVVJTlQgYWRkciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlUnguYyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlUnguYwppbmRleCA2ZmVlOTY4Li41MzNmOGViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZVJ4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VSeC5jCkBAIC0xLDUgKzEsMTUgQEAKICNpbmNsdWRlICJoZWFkZXJzLmgiCi1leHRlcm4gaW50IFNlYXJjaFZjaWQoUE1JTklfQURBUFRFUiAsIHVuc2lnbmVkIHNob3J0KTsKKworc3RhdGljIGludCBTZWFyY2hWY2lkKFBNSU5JX0FEQVBURVIgQWRhcHRlcix1bnNpZ25lZCBzaG9ydCB1c1ZjaWQpCit7CisJaW50IGlJbmRleD0wOworCisJZm9yKGlJbmRleD0oTk9fT0ZfUVVFVUVTLTEpO2lJbmRleD49MDtpSW5kZXgtLSkKKwkJaWYoQWRhcHRlci0+UGFja0luZm9baUluZGV4XS51c1ZDSURfVmFsdWUgPT0gdXNWY2lkKQorCQkJcmV0dXJuIGlJbmRleDsKKwlyZXR1cm4gTk9fT0ZfUVVFVUVTKzE7CisKK30KIAogCiBzdGF0aWMgUFVTQl9SQ0IKQEAgLTM4LDEzICs0OCw5IEBACiAJUE1JTklfQURBUFRFUiBBZGFwdGVyID0gcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyOwogCVBMRUFERVIgcExlYWRlciA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwogCi0KLQkjaWYgMAotCWludCAqcHVpQnVmZmVyID0gTlVMTDsKLQlzdHJ1Y3QgdGltZXZhbCB0djsKLQltZW1zZXQoJnR2LCAwLCBzaXplb2YodHYpKTsKLQlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKLQkjZW5kaWYKKwlpZiAodW5saWtlbHkobmV0aWZfbXNnX3J4X3N0YXR1cyhBZGFwdGVyKSkpCisJCXByX2luZm8oUEZYICIlczogcnggdXJiIHN0YXR1cyAlZCBsZW5ndGggJWRcbiIsCisJCQlBZGFwdGVyLT5kZXYtPm5hbWUsIHVyYi0+c3RhdHVzLCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCiAJaWYoKEFkYXB0ZXItPmRldmljZV9yZW1vdmVkID09IFRSVUUpICB8fAogCQkoVFJVRSA9PSBBZGFwdGVyLT5iRW5kUG9pbnRIYWx0ZWQpIHx8CkBAIC04OSwxMCArOTUsMTAgQEAKIAlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9SWCwgUlhfRFBDLCBEQkdfTFZMX0FMTCwgIkxlYWRlciBTdGF0dXM6MHglaFgsIExlbmd0aDoweCVoWCwgVkNJRDoweCVoWCIsIHBMZWFkZXItPlN0YXR1cyxwTGVhZGVyLT5QTGVuZ3RoLHBMZWFkZXItPlZjaWQpOwogCWlmKE1BWF9DTlRMX1BLVF9TSVpFIDwgcExlYWRlci0+UExlbmd0aCkKIAl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNvcnJ1cHRlZCBsZWFkZXIgbGVuZ3RoLi4uJWRcbiIsCi0JCQkJCXBMZWFkZXItPlBMZW5ndGgpOwotCQlhdG9taWNfaW5jKCZBZGFwdGVyLT5SeFBhY2tldERyb3BwZWRDb3VudCk7Ci0JCWF0b21pY19hZGQocExlYWRlci0+UExlbmd0aCwgJkFkYXB0ZXItPkJhZFJ4Qnl0ZUNvdW50KTsKKwkJaWYgKG5ldGlmX21zZ19yeF9lcnIoQWRhcHRlcikpCisJCQlwcl9pbmZvKFBGWCAiJXM6IGNvcnJ1cHRlZCBsZWFkZXIgbGVuZ3RoLi4uJWRcbiIsCisJCQkJQWRhcHRlci0+ZGV2LT5uYW1lLCBwTGVhZGVyLT5QTGVuZ3RoKTsKKwkJKytBZGFwdGVyLT5kZXYtPnN0YXRzLnJ4X2Ryb3BwZWQ7CiAJCWF0b21pY19kZWMoJnBzSW50ZkFkYXB0ZXItPnVOdW1SY2JVc2VkKTsKIAkJcmV0dXJuOwogCX0KQEAgLTE0NSwxMCArMTUxLDkgQEAKIAkJc2tiX3B1dCAoc2tiLCBwTGVhZGVyLT5QTGVuZ3RoICsgRVRIX0hMRU4pOwogCQlBZGFwdGVyLT5QYWNrSW5mb1tRdWV1ZUluZGV4XS51aVRvdGFsUnhCeXRlcys9cExlYWRlci0+UExlbmd0aDsKIAkJQWRhcHRlci0+UGFja0luZm9bUXVldWVJbmRleF0udWlUaGlzUGVyaW9kUnhCeXRlcys9IHBMZWFkZXItPlBMZW5ndGg7Ci0JCWF0b21pY19hZGQocExlYWRlci0+UExlbmd0aCwgJkFkYXB0ZXItPkdvb2RSeEJ5dGVDb3VudCk7CiAgICAgICAgIEJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfUlgsIFJYX0RBVEEsIERCR19MVkxfQUxMLCAiUmVjaXZlZCBEYXRhIHBrdCBvZiBsZW4gOjB4JVgiLCBwTGVhZGVyLT5QTGVuZ3RoKTsKIAotCQlpZihBZGFwdGVyLT5pZl91cCkKKwkJaWYobmV0aWZfcnVubmluZyhBZGFwdGVyLT5kZXYpKQogCQl7CiAJCQkvKiBNb3ZpbmcgYWhlYWQgYnkgRVRIX0hMRU4gdG8gdGhlIGRhdGEgcHRyIGFzIHJlY2VpdmVkIGZyb20gRlcgKi8KIAkJCXNrYl9wdWxsKHNrYiwgRVRIX0hMRU4pOwpAQCAtMTczLDkgKzE3OCwxMiBAQAogCQllbHNlCiAJCXsKIAkJICAgIEJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfUlgsIFJYX0RBVEEsIERCR19MVkxfQUxMLCAiaS9mIG5vdCB1cCBoYW5jZSBmcmVlaW5nIFNLQi4uLiIpOwotCQkJYmNtX2tmcmVlX3NrYihza2IpOworCQkJZGV2X2tmcmVlX3NrYihza2IpOwogCQl9Ci0JCWF0b21pY19pbmMoJkFkYXB0ZXItPkdvb2RSeFBrdENvdW50KTsKKworCQkrK0FkYXB0ZXItPmRldi0+c3RhdHMucnhfcGFja2V0czsKKwkJQWRhcHRlci0+ZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBwTGVhZGVyLT5QTGVuZ3RoOworCiAJCWZvcih1aUluZGV4ID0gMCA7IHVpSW5kZXggPCBNSUJTX01BWF9ISVNUX0VOVFJJRVMgOyB1aUluZGV4KyspCiAJCXsKIAkJCWlmKChwTGVhZGVyLT5QTGVuZ3RoIDw9IE1JQlNfUEtUU0laRUhJU1RfUkFOR0UqKHVpSW5kZXgrMSkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZVR4LmMgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZVR4LmMKaW5kZXggNzcxZjdiMy4uYTg0MmRlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VUeC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlVHguYwpAQCAtMSw1MCArMSw1IEBACiAjaW5jbHVkZSAiaGVhZGVycy5oIgogCi0jaWZuZGVmIEJDTV9TSE1fSU5URVJGQUNFCi0KLS8qCi1GdW5jdGlvbjoJCQkJSW50ZXJmYWNlVHhEYXRhUGFja2V0Ci0KLURlc2NyaXB0aW9uOgkJCVRoaXMgaXMgdGhlIGhhcmR3YXJlIHNwZWNpZmljIEZ1bmN0aW9uIGZvciBUcmFuc21pdHRpbmcKLQkJCQkJCWRhdGEgcGFja2V0IHRvIHRoZSBkZXZpY2UuCi0KLUlucHV0IHBhcmFtZXRlcnM6CQlJTiBQTUlOSV9BREFQVEVSIEFkYXB0ZXIgICAtIE1pbmlwb3J0IEFkYXB0ZXIgQ29udGV4dAotCQkJCQkJUFZPSUQgUGFja2V0CQkJCS0gIFBhY2tldCBDb250YWluaW5nIHRoZSBkYXRhIHRvIGJlIHRyYW5zbWl0dGVkCi0JCQkJCQlVU0hPUlQgdXNWY2lkCQkJICAgLSBWQ0lEIG9uIHdoaWNoIGRhdGEgcGFja2V0IGlzIHRvIGJlIHNlbnQKLQotCi1SZXR1cm46CQkJCUJDTV9TVEFUVVNfU1VDQ0VTUyAtIElmIFR4IHdhcyBzdWNjZXNzZnVsLgotCQkJCQkJT3RoZXIgICAgICAgICAgIC0gSWYgYW4gZXJyb3Igb2NjdXJlZC4KLSovCi0KLVVMT05HIEludGVyZmFjZVR4RGF0YVBhY2tldChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsUFZPSUQgUGFja2V0LFVTSE9SVCB1c1ZjaWQpCi17Ci0JVUxPTkcJU3RhdHVzID0gMDsKLQlyZXR1cm4gU3RhdHVzOwotfQotCi0vKgotRnVuY3Rpb246CQkJCUludGVyZmFjZVR4Q29udHJvbFBhY2tldAotCi1EZXNjcmlwdGlvbjoJCQlUaGlzIGlzIHRoZSBoYXJkd2FyZSBzcGVjaWZpYyBGdW5jdGlvbiBmb3IgVHJhbnNtaXR0aW5nCi0JCQkJCQljb250cm9sIHBhY2tldCB0byB0aGUgZGV2aWNlLgotCi1JbnB1dCBwYXJhbWV0ZXJzOgkJSU4gUE1JTklfQURBUFRFUiBBZGFwdGVyICAgLSBNaW5pcG9ydCBBZGFwdGVyIENvbnRleHQKLQkJCQkJCVBWT0lEIHB2QnVmZmVyCQkJICAgLSBCdWZmZXIgY29udGFpbmcgY29udHJvbCBwYWNrZXQKLQkJCQkJCVVJTlQgdWlCdWZmZXJMZW5ndGgJCSAgIC0gQnVmZmVyIExlbmd0aAotCi1SZXR1cm46CQkJCUJDTV9TVEFUVVNfU1VDQ0VTUyAtIElmIGNvbnRyb2wgcGFja2V0IHRyYW5zbWl0IHdhcyBzdWNjZXNzZnVsLgotCQkJCQkJT3RoZXIgICAgICAgICAgIC0gSWYgYW4gZXJyb3Igb2NjdXJlZC4KLSovCi0KLVVMT05HIEludGVyZmFjZVR4Q29udHJvbFBhY2tldChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsUFZPSUQgcHZCdWZmZXIsVUlOVCB1aUJ1ZmZlckxlbmd0aCkKLXsKLQlVTE9ORwlTdGF0dXMgPSAwOwotCi0KLQotCXJldHVybiBTdGF0dXM7Ci19CiAvKnRoaXMgaXMgdHJhbnNtaXQgY2FsbC1iYWNrKEJVTEsgT1VUKSovCiBzdGF0aWMgdm9pZCB3cml0ZV9idWxrX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYi8qLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyovKQogewpAQCAtNTQsMTAgKzksMTAgQEAKIAlQTUlOSV9BREFQVEVSIHBzQWRhcHRlciA9IHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciA7CiAJQk9PTEVBTiBicG93ZXJEb3duTXNnID0gRkFMU0UgOwogICAgIFBNSU5JX0FEQVBURVIgQWRhcHRlciA9IEdFVF9CQ01fQURBUFRFUihnYmxwbmV0ZGV2KTsKLSNpZiAwCi0Jc3RydWN0IHRpbWV2YWwgdHY7Ci0JVUlOVCB0aW1lX21zID0gMDsKLSNlbmRpZgorCisgICAgaWYgKHVubGlrZWx5KG5ldGlmX21zZ190eF9kb25lKEFkYXB0ZXIpKSkKKwkgICAgcHJfaW5mbyhQRlggIiVzOiB0cmFuc21pdCBzdGF0dXMgJWRcbiIsIEFkYXB0ZXItPmRldi0+bmFtZSwgdXJiLT5zdGF0dXMpOworCiAJaWYodXJiLT5zdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpCiAJewogCQlpZih1cmItPnN0YXR1cyA9PSAtRVBJUEUpCkBAIC03OCwxMSArMzMsNiBAQAogCiAJaWYoVFJVRSA9PSBwc0FkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUpCiAJewotCQkjaWYgMAotCQlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKLQkJdGltZV9tcyA9IHR2LnR2X3NlYyAqMTAwMCArIHR2LnR2X3VzZWMvMTAwMDsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiICVzIElkbGUgTW9kZSBBQ0tfU2VudCBnb3QgZnJvbSBkZXZpY2UgYXQgdGltZSA6MHgleCIsIF9fRlVOQ1RJT05fXywgdGltZV9tcyk7Ci0JCSNlbmRpZgogCiAJCWlmKCgocENvbnRyb2xNc2ctPnN6RGF0YVswXSA9PSBHT19UT19JRExFX01PREVfUEFZTE9BRCkgJiYKIAkJCShwQ29udHJvbE1zZy0+c3pEYXRhWzFdID09IFRBUkdFVF9DQU5fR09fVE9fSURMRV9NT0RFKSkpCkBAIC0xNTIsMTcgKzEwMiwxMiBAQAogCX0KIAogZXJyX2V4aXQgOgotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDM1KQotIAl1c2JfYnVmZmVyX2ZyZWUodXJiLT5kZXYsIHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKLSAJCQl1cmItPnRyYW5zZmVyX2J1ZmZlciwgdXJiLT50cmFuc2Zlcl9kbWEpOwotI2Vsc2UKIAl1c2JfZnJlZV9jb2hlcmVudCh1cmItPmRldiwgdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLAogIAkJCXVyYi0+dHJhbnNmZXJfYnVmZmVyLCB1cmItPnRyYW5zZmVyX2RtYSk7Ci0jZW5kaWYKIH0KIAogCi1zdGF0aWMgX19pbmxpbmUgUFVTQl9UQ0IgR2V0QnVsa091dFRjYihQU19JTlRFUkZBQ0VfQURBUFRFUiBwc0ludGZBZGFwdGVyKQorc3RhdGljIFBVU0JfVENCIEdldEJ1bGtPdXRUY2IoUFNfSU5URVJGQUNFX0FEQVBURVIgcHNJbnRmQWRhcHRlcikKIHsKIAlQVVNCX1RDQiBwVGNiID0gTlVMTDsKIAlVSU5UIGluZGV4ID0gMDsKQEAgLTE4MywyMCArMTI4LDE0IEBACiAJcmV0dXJuIHBUY2I7CiB9CiAKLXN0YXRpYyBfX2lubGluZSBpbnQgVHJhbnNtaXRUY2IoUFNfSU5URVJGQUNFX0FEQVBURVIgcHNJbnRmQWRhcHRlciwgUFVTQl9UQ0IgcFRjYiwgUFZPSUQgZGF0YSwgaW50IGxlbikKK3N0YXRpYyBpbnQgVHJhbnNtaXRUY2IoUFNfSU5URVJGQUNFX0FEQVBURVIgcHNJbnRmQWRhcHRlciwgUFVTQl9UQ0IgcFRjYiwgUFZPSUQgZGF0YSwgaW50IGxlbikKIHsKIAogCXN0cnVjdCB1cmIgKnVyYiA9IHBUY2ItPnVyYjsKIAlpbnQgcmV0dmFsID0gMDsKIAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDM1KQotIAl1cmItPnRyYW5zZmVyX2J1ZmZlciA9IHVzYl9idWZmZXJfYWxsb2MocHNJbnRmQWRhcHRlci0+dWRldiwgbGVuLAotIAkJCQkJCUdGUF9BVE9NSUMsICZ1cmItPnRyYW5zZmVyX2RtYSk7Ci0jZWxzZQogCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0gdXNiX2FsbG9jX2NvaGVyZW50KHBzSW50ZkFkYXB0ZXItPnVkZXYsIGxlbiwKICAJCQkJCQlHRlBfQVRPTUlDLCAmdXJiLT50cmFuc2Zlcl9kbWEpOwotI2VuZGlmCi0KIAlpZiAoIXVyYi0+dHJhbnNmZXJfYnVmZmVyKQogCXsKIAkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJFcnJvciBhbGxvY2F0aW5nIG1lbW9yeVxuIik7CkBAIC0yNTUsNSArMTk0LDQgQEAKIAlyZXR1cm4gVHJhbnNtaXRUY2IocHNJbnRmQWRhcHRlciwgcFRjYiwgZGF0YSwgbGVuKTsKIH0KIAotI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlVHguaCBiL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlVHguaAppbmRleCAwNTNmNjMxLi4yNzMxNDc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZVR4LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VUeC5oCkBAIC0zLDExICszLDUgQEAKIAogSU5UIEludGVyZmFjZVRyYW5zbWl0UGFja2V0KFBWT0lEIGFyZywgUFZPSUQgZGF0YSwgVUlOVCBsZW4pOwogCi0KLVVMT05HIEludGVyZmFjZVR4RGF0YVBhY2tldChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsUFZPSUQgUGFja2V0LFVTSE9SVCB1c1ZjaWQpOwotCi1VTE9ORyBJbnRlcmZhY2VUeENvbnRyb2xQYWNrZXQoUE1JTklfQURBUFRFUiBBZGFwdGVyLFBWT0lEIHB2QnVmZmVyLFVJTlQgdWlCdWZmZXJMZW5ndGgpOwotCi0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZW1haW4uaCBiL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlbWFpbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGRiNTYzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlbWFpbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotI2lmbmRlZiBfTUFJTl8KLSNkZWZpbmUgX01BSU5fCi0jaWYgMAotdHlwZWRlZiBzdHJ1Y3QgX01JTklfQURBUFRFUgotewotCVNfSU5URVJGQUNFX0FEQVBURVIgc3RJbnRlcmZhY2VBZGFwdGVyOwotfU1JTklfQURBUFRFUiwqUE1JTklfQURBUFRFUjsKLQotI2VuZGlmCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vTGVha3lCdWNrZXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vTGVha3lCdWNrZXQuYwppbmRleCBjYWUzODIzLi5mNGNmNDFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0xlYWt5QnVja2V0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9MZWFreUJ1Y2tldC5jCkBAIC03NSwxNCArNzUsMTQgQEAKICogUmV0dXJucyAgICAgLSBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFsbG93ZWQgZm9yIHRyYW5zbWlzc2lvbi4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIF9faW5saW5lIFVMT05HIEdldFNGVG9rZW5Db3VudChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFBhY2tldEluZm8gKnBzU0YpCitzdGF0aWMgVUxPTkcgR2V0U0ZUb2tlbkNvdW50KFBNSU5JX0FEQVBURVIgQWRhcHRlciwgUGFja2V0SW5mbyAqcHNTRikKIHsKIAlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgVE9LRU5fQ09VTlRTLCBEQkdfTFZMX0FMTCwgIklzUGFja2V0QWxsb3dlZEZvckZsb3cgPT09PiIpOwogCS8qIFZhbGlkYXRlIHRoZSBwYXJhbWV0ZXJzICovCiAJaWYoTlVMTCA9PSBBZGFwdGVyIHx8IChwc1NGIDwgQWRhcHRlci0+UGFja0luZm8gJiYKIAkJKHVpbnRwdHJfdClwc1NGID4gKHVpbnRwdHJfdCkgJkFkYXB0ZXItPlBhY2tJbmZvW0hpUHJpb3JpdHldKSkKIAl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBUT0tFTl9DT1VOVFMsIERCR19MVkxfQUxMLCAiSVBBRkY6IEdvdCB3cm9uZyBQYXJhbWV0ZXJzOkFkYXB0ZXI6ICVwLCBRSW5kZXg6ICVsZFxuIiwgQWRhcHRlciwgKHBzU0YtQWRhcHRlci0+UGFja0luZm8pKTsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRPS0VOX0NPVU5UUywgREJHX0xWTF9BTEwsICJJUEFGRjogR290IHdyb25nIFBhcmFtZXRlcnM6QWRhcHRlcjogJXAsIFFJbmRleDogJXpkXG4iLCBBZGFwdGVyLCAocHNTRi1BZGFwdGVyLT5QYWNrSW5mbykpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTk0LDUxICs5NCwyNyBAQAogCQl9CiAJCWVsc2UKIAkJewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRPS0VOX0NPVU5UUywgREJHX0xWTF9BTEwsICJOb3QgZW5vdWdoIHRva2VucyBpbiBxdWV1ZSAlbGQgQXZhaWxhYmxlICV1XG4iLAorCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRPS0VOX0NPVU5UUywgREJHX0xWTF9BTEwsICJOb3QgZW5vdWdoIHRva2VucyBpbiBxdWV1ZSAlemQgQXZhaWxhYmxlICV1XG4iLAogCQkJCXBzU0YtQWRhcHRlci0+UGFja0luZm8sIHBzU0YtPnVpQ3VycmVudFRva2VuQ291bnQpOwogCQkJcHNTRi0+dWlQZW5kZWRMYXN0ID0gMTsKIAkJfQogCX0KIAllbHNlCiAJewotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgVE9LRU5fQ09VTlRTLCBEQkdfTFZMX0FMTCwgIklQQUZGOiBRdWV1ZSAlbGQgbm90IHZhbGlkXG4iLCBwc1NGLUFkYXB0ZXItPlBhY2tJbmZvKTsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRPS0VOX0NPVU5UUywgREJHX0xWTF9BTEwsICJJUEFGRjogUXVldWUgJXpkIG5vdCB2YWxpZFxuIiwgcHNTRi1BZGFwdGVyLT5QYWNrSW5mbyk7CiAJfQogCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBUT0tFTl9DT1VOVFMsIERCR19MVkxfQUxMLCAiSXNQYWNrZXRBbGxvd2VkRm9yRmxvdyA8PT09Iik7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBfX2lubGluZSB2b2lkIFJlbW92ZVBhY2tldEZyb21RdWV1ZShQYWNrZXRJbmZvICpwUGFja0luZm8gLCBzdHJ1Y3Qgc2tfYnVmZiAqUGFja2V0KQotewotCXN0cnVjdCBza19idWZmICpwc1F1ZXVlQ3VycmVudD1OVUxMLCAqcHNMYXN0UXVldWVOb2RlPU5VTEw7Ci0JcHNRdWV1ZUN1cnJlbnQgPSBwUGFja0luZm8tPkZpcnN0VHhRdWV1ZTsKLQl3aGlsZShwc1F1ZXVlQ3VycmVudCkKLQl7Ci0JCWlmKFBhY2tldCA9PSBwc1F1ZXVlQ3VycmVudCkKLQkJewotCQkJaWYocHNRdWV1ZUN1cnJlbnQgPT0gcFBhY2tJbmZvLT5GaXJzdFR4UXVldWUpCi0JCQl7Ci0JCQkJcFBhY2tJbmZvLT5GaXJzdFR4UXVldWU9cHNRdWV1ZUN1cnJlbnQtPm5leHQ7Ci0JCQkJaWYocHNRdWV1ZUN1cnJlbnQ9PXBQYWNrSW5mby0+TGFzdFR4UXVldWUpCi0JCQkJCXBQYWNrSW5mby0+TGFzdFR4UXVldWU9TlVMTDsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlwc0xhc3RRdWV1ZU5vZGUtPm5leHQ9cHNRdWV1ZUN1cnJlbnQtPm5leHQ7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQlwc0xhc3RRdWV1ZU5vZGUgPSBwc1F1ZXVlQ3VycmVudDsKLQkJcHNRdWV1ZUN1cnJlbnQ9cHNRdWV1ZUN1cnJlbnQtPm5leHQ7Ci0JfQotfQogLyoqCiBAaW5ncm91cCB0eF9mdW5jdGlvbnMKIFRoaXMgZnVuY3Rpb24gZGVzcGF0Y2hlcyBwYWNrZXQgZnJvbSB0aGUgc3BlY2lmaWVkIHF1ZXVlLgogQHJldHVybiBaZXJvKHN1Y2Nlc3MpIG9yIE5lZ2F0aXZlIHZhbHVlKGZhaWx1cmUpCiAqLwotc3RhdGljIF9faW5saW5lIElOVCBTZW5kUGFja2V0RnJvbVF1ZXVlKFBNSU5JX0FEQVBURVIgQWRhcHRlciwvKio8TG9naWNhbCBBZGFwdGVyKi8KLQkJCQkJCQkJUGFja2V0SW5mbyAqcHNTRiwJCS8qKjxRdWV1ZSBpZGVudGlmaWVyKi8KLQkJCQkJCQkJc3RydWN0IHNrX2J1ZmYqICBQYWNrZXQpCS8qKjxQb2ludGVyIHRvIHRoZSBwYWNrZXQgdG8gYmUgc2VudCovCitzdGF0aWMgSU5UIFNlbmRQYWNrZXRGcm9tUXVldWUoUE1JTklfQURBUFRFUiBBZGFwdGVyLC8qKjxMb2dpY2FsIEFkYXB0ZXIqLworCQkJICAgICAgIFBhY2tldEluZm8gKnBzU0YsCQkvKio8UXVldWUgaWRlbnRpZmllciovCisJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYqICBQYWNrZXQpCS8qKjxQb2ludGVyIHRvIHRoZSBwYWNrZXQgdG8gYmUgc2VudCovCiB7CiAJSU5UICAJU3RhdHVzPVNUQVRVU19GQUlMVVJFOwogCVVJTlQgdWlJbmRleCA9MCxQa3RMZW4gPSAwOwpAQCAtMTgwLDggKzE1Niw3IEBACiAqIFJldHVybnMgICAgIC0gTm9uZS4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgX19pbmxpbmUgVk9JRCBDaGVja0FuZFNlbmRQYWNrZXRGcm9tSW5kZXgKLShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFBhY2tldEluZm8gKnBzU0YpCitzdGF0aWMgVk9JRCBDaGVja0FuZFNlbmRQYWNrZXRGcm9tSW5kZXgoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBQYWNrZXRJbmZvICpwc1NGKQogewogCXN0cnVjdCBza19idWZmCSpRdWV1ZVBhY2tldD1OVUxMOwogCWNoYXIgCQkJKnBDb250cm9sUGFja2V0ID0gTlVMTDsKQEAgLTE4OSw3ICsxNjQsNyBAQAogCWludAkJCQlpUGFja2V0TGVuPTA7CiAKIAotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBUWF9QQUNLRVRTLCBEQkdfTFZMX0FMTCwgIiVsZCA9PT09PiIsIChwc1NGLUFkYXB0ZXItPlBhY2tJbmZvKSk7CisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRYX1BBQ0tFVFMsIERCR19MVkxfQUxMLCAiJXpkID09PT0+IiwgKHBzU0YtQWRhcHRlci0+UGFja0luZm8pKTsKIAlpZigocHNTRiAhPSAmQWRhcHRlci0+UGFja0luZm9bSGlQcmlvcml0eV0pICYmIEFkYXB0ZXItPkxpbmtVcFN0YXR1cyAmJiBhdG9taWNfcmVhZCgmcHNTRi0+dWlQZXJTRlR4UmVzb3VyY2VDb3VudCkpLy9HZXQgZGF0YSBwYWNrZXQKICAgCXsKIAkJaWYoIXBzU0YtPnVjRGlyZWN0aW9uICkKQEAgLTE5NywxMCArMTcyLDggQEAKIAogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgVFhfUEFDS0VUUywgREJHX0xWTF9BTEwsICJVcGRhdGVUb2tlbkNvdW50ICIpOwogCQlpZihBZGFwdGVyLT5JZGxlTW9kZSB8fCBBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlKQotCQl7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkRldmljZSBpcyBpbiBJZGxlIE1vZGUuLkhlbmNlIGJsb2NraW5nIERhdGEgUGFja2V0cy4uXG4iKTsKLQkJCXJldHVybjsKLQkJfQorCQkJcmV0dXJuOwkvKiBpbiBpZGxlIG1vZGUgKi8KKwogCQkvLyBDaGVjayBmb3IgRnJlZSBEZXNjcmlwdG9ycwogCQlpZihhdG9taWNfcmVhZCgmQWRhcHRlci0+Q3Vyck51bUZyZWVUeERlc2MpIDw9IE1JTklNVU1fUEVORElOR19ERVNDUklQVE9SUykKIAkJewpAQCAtMjA4LDkgKzE4MSw2IEBACiAJCQlyZXR1cm4gOwogCQl9CiAKLSNpZiAwCi0JCVBydW5lUXVldWUoQWRhcHRlciwocHNTRi1BZGFwdGVyLT5QYWNrSW5mbykpOwotI2VuZGlmCiAJCXNwaW5fbG9ja19iaCgmcHNTRi0+U0ZRdWV1ZUxvY2spOwogCQlRdWV1ZVBhY2tldD1wc1NGLT5GaXJzdFR4UXVldWU7CiAKQEAgLTI0MCw3ICsyMTAsNyBAQAogCQkJfQogCQkJZWxzZQogCQkJewotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBUWF9QQUNLRVRTLCBEQkdfTFZMX0FMTCwgIkZvciBRdWV1ZTogJWxkXG4iLCBwc1NGLUFkYXB0ZXItPlBhY2tJbmZvKTsKKwkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgVFhfUEFDS0VUUywgREJHX0xWTF9BTEwsICJGb3IgUXVldWU6ICV6ZFxuIiwgcHNTRi1BZGFwdGVyLT5QYWNrSW5mbyk7CiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRYX1BBQ0tFVFMsIERCR19MVkxfQUxMLCAiXG5BdmFpbGFibGUgVG9rZW5zID0gJWQgcmVxdWlyZWQgPSAlZFxuIiwKIAkJCQkJcHNTRi0+dWlDdXJyZW50VG9rZW5Db3VudCwgaVBhY2tldExlbik7CiAJCQkJLy90aGlzIHBhcnQgaW5kaWNhdGVzIHRoYXQgYmVjdWFzZSBvZiBub24tYXZhaWxhYmlsaXR5IG9mIHRoZSB0b2tlbnMKQEAgLTI5MCwxNyArMjYwLDYgQEAKIAkJCX0KIAkgICAJfQogCX0KLQotCWlmKFN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykJLy9UeCBvZiBkYXRhIHBhY2tldCB0byBkZXZpY2UgRmFpbGVkCi0JewotCQlpZihBZGFwdGVyLT5iY21famlmZmllcyA9PSAwKQotCQkJQWRhcHRlci0+YmNtX2ppZmZpZXMgPSBqaWZmaWVzOwotCX0KLQllbHNlCi0JewotCQlBZGFwdGVyLT5iY21famlmZmllcyA9IDA7Ci0JfQotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBUWF9QQUNLRVRTLCBEQkdfTFZMX0FMTCwgIjw9PT09PSIpOwogfQogCiAKQEAgLTM4NywxMiArMzQ2LDcgQEAKIAkJaWYoZXhpdF9mbGFnID09IFRSVUUgKQogCQkgICAgYnJlYWsgOwogCX0vKiBlbmQgb2YgaW5uZXIgd2hpbGUgbG9vcCAqLwotCWlmKEFkYXB0ZXItPmJjbV9qaWZmaWVzID09IDAgJiYKLQkJYXRvbWljX3JlYWQoJkFkYXB0ZXItPlRvdGFsUGFja2V0Q291bnQpICE9IDAgJiYKLQkgICAJdWlQcmV2VG90YWxDb3VudCA9PSBhdG9taWNfcmVhZCgmQWRhcHRlci0+VG90YWxQYWNrZXRDb3VudCkpCi0JewotCQlBZGFwdGVyLT5iY21famlmZmllcyA9IGppZmZpZXM7Ci0JfQorCiAJdXBkYXRlX3Blcl9jaWRfcnggIChBZGFwdGVyKTsKIAlBZGFwdGVyLT50eHRyYW5zbWl0X3J1bm5pbmcgPSAwOwogCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBUWF9QQUNLRVRTLCBEQkdfTFZMX0FMTCwgIjw9PT09PT0iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vTWFjcm9zLmggYi9kcml2ZXJzL3N0YWdpbmcvYmNtL01hY3Jvcy5oCmluZGV4IDAyNDEyMzQuLmZlYjM1MTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vTWFjcm9zLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9NYWNyb3MuaApAQCAtNCwxMCArNCw2IEBACiAjaWZuZGVmCV9fTUFDUk9TX0hfXwogI2RlZmluZSBfX01BQ1JPU19IX18KIAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQotI2RlZmluZSBrdGhyZWFkX3J1bih0aHJlYWRmbixkYXRhLGRhdGFmbXQpKHN0cnVjdCB0YXNrX3N0cnVjdCAqKWtlcm5lbF90aHJlYWQodGhyZWFkZm4sZGF0YSwwKQotI2VuZGlmCi0KICNkZWZpbmUgVFhfVElNRVJfUEVSSU9EIDEwCS8vMTAgbXNlYwogI2RlZmluZSBNQVhfQ0xBU1NJRklFUlMgMTAwCiAvLyNkZWZpbmUgTUFYX0NMQVNTSUZJRVJTX1BFUl9TRiAgMjAKQEAgLTE3LDEwICsxMyw5IEBACiAjZGVmaW5lIE1BWF9EQVRBX1BLVFMgCQkyMDAKICNkZWZpbmUgTUFYX0VUSF9TSVpFIAkJMTUzNgogI2RlZmluZSBNQVhfQ05UTF9QS1RfU0laRSAyMDQ4Ci0vKiBUSU1FUiBSRUxBVEVEICovCi0jZGVmaW5lIEpJRkZJRVNfMl9RVUFEUEFSVCgpCShVTE9ORykoamlmZmllcyAqIDEwMDAwKSAvLyBqaWZmaWVzKDFtc2VjKSB0byBRdWFkcGFydCgxMDBuc2VjKQogCiAjZGVmaW5lIE1UVV9TSVpFIDE0MDAKKyNkZWZpbmUgVFhfUUxFTiAgNQogCiAjZGVmaW5lIE1BQ19BRERSX1JFR0lTVEVSIDB4YmY2MGQwMDAKIApAQCAtMjY2LDcgKzI2MSw3IEBACiAKICNkZWZpbmUgRklSTVdBUkVfQkVHSU5fQUREUiAweEJGQzAwMDAwCiAKLSNkZWZpbmUgSU5WQUxJRF9RVUVVRV9JTkRFWCAoVVNIT1JUKS0xCisjZGVmaW5lIElOVkFMSURfUVVFVUVfSU5ERVggTk9fT0ZfUVVFVUVTCiAKICNkZWZpbmUgSU5WQUxJRF9QSUQgKHBpZF90KS0xCiAjZGVmaW5lIEREUl84MF9NSFogIAkwCkBAIC0zMDAsMTIgKzI5NSw3IEBACiAKIC8qIElkbGUgTW9kZSBSZWxhdGVkIFJlZ2lzdGVycyAqLwogI2RlZmluZSBERUJVR19JTlRFUlJVUFRfR0VORVJBVE9SX1JFR0lTVE9SIDB4MEYwMDAwN0MKLSNpZmRlZiBCQ01fU0hNX0lOVEVSRkFDRQotI2RlZmluZSBTV19BQk9SVF9JRExFTU9ERV9MT0MgCQkweGJmYzAyZjljCi0jZGVmaW5lIENQRV9WSVJUVUFMX01BSUxCT1hfUkVHICAgICAweEJGQzAyRTU4Ci0jZWxzZQogI2RlZmluZSBTV19BQk9SVF9JRExFTU9ERV9MT0MgCQkweDBGRjAxRkZDCi0jZW5kaWYKIAogI2RlZmluZSBTV19BQk9SVF9JRExFTU9ERV9QQVRURVJOIAkweGQwZWExZDFlCiAjZGVmaW5lIERFVklDRV9JTlRfT1VUX0VQX1JFRzAJCTB4MEYwMTE4NzAKQEAgLTM1NSwxMiArMzQ1LDcgQEAKIAlIWUJSSURfTU9ERV82ICAgPSAyCiB9UE1VX01PREU7CiAKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMzApCi0jZGVmaW5lIE1BWF9SRE1fV1JNX1JFVElSRVMgMTYKLSNlbHNlCiAjZGVmaW5lIE1BWF9SRE1fV1JNX1JFVElSRVMgMQotI2VuZGlmCi0KIAogZW51bSBlQWJvcnRQYXR0ZXJuIHsKIAlBQk9SVF9TSFVURE9XTl9NT0RFID0gMSwKQEAgLTM2OSwyNyArMzU0LDYgQEAKIAlBQk9SVF9JRExFX1NZTkNET1dOID0gMwogfTsKIAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyNykKLQkjZGVmaW5lIEdFVF9CQ01fQURBUFRFUihuZXRfZGV2KSAgKHtcCi0gICAgUE1JTklfQURBUFRFUiBfX0FkYXB0ZXIgPSBOVUxMOwlcCi0gICAgaWYgKG5ldF9kZXYpICAgIHsgICBcCi0gICAgICAgICBfX0FkYXB0ZXIgPSAoUE1JTklfQURBUFRFUikobmV0X2Rldi0+cHJpdik7IFwKLSAgICB9IFwKLSAgICBlbHNlICAgIHsgICBcCi0gICAgICAgICBfX0FkYXB0ZXIgPSBOVUxMOyAgXAotICAgIH1fX0FkYXB0ZXI7fSApCi0jZWxzZQotCSNkZWZpbmUgR0VUX0JDTV9BREFQVEVSKG5ldF9kZXYpICh7XAotICAgIFBNSU5JX0FEQVBURVIgX19BZGFwdGVyID0gTlVMTDsJXAotICAgIGlmIChuZXRfZGV2KSAgICB7ICAgXAotICAgICAgICAgX19BZGFwdGVyID0gKFBNSU5JX0FEQVBURVIpKCooKHVuc2lnbmVkIGxvbmcgKiluZXRkZXZfcHJpdihuZXRfZGV2KSkpOyAgXAotICAgIH0gXAotICAgIGVsc2UgICAgeyAgIFwKLSAgICAgICAgIF9fQWRhcHRlciA9IE5VTEw7ICBcCi0gICAgfV9fQWRhcHRlcjt9KQotCi0KLSNlbmRpZgogCiAvKiBPZmZzZXRzIHVzZWQgYnkgZHJpdmVyIGluIHNrYiBjYiB2YXJpYWJsZSAqLwogI2RlZmluZSBTS0JfQ0JfQ0xBU1NJRklDQVRJT05fT0ZGU0VUICAgIDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL01ha2VmaWxlCmluZGV4IGMzYWUyNWEuLjY1MmI3ZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9NYWtlZmlsZQpAQCAtNiw3ICs2LDcgQEAKIAogYmNtX3dpbWF4LXkgOj0gIEludGVyZmFjZURsZC5vIEludGVyZmFjZUlkbGVNb2RlLm8gSW50ZXJmYWNlSW5pdC5vIEludGVyZmFjZVJ4Lm8gXAogCQlJbnRlcmZhY2VJc3IubyBJbnRlcmZhY2VNaXNjLm8gSW50ZXJmYWNlVHgubyBcCi0JCUFycC5vIENtSG9zdC5vIERlYnVnLm8gSVB2NlByb3RvY29sLm8gUW9zLm8gVHJhbnNtaXQub1wKKwkJQ21Ib3N0Lm8gSVB2NlByb3RvY29sLm8gUW9zLm8gVHJhbnNtaXQub1wKIAkJQmNtbmV0Lm8gRERSSW5pdC5vIEhhbmRsZUNvbnRyb2xQYWNrZXQub1wKIAkJTGVha3lCdWNrZXQubyBNaXNjLm8gc29ydC5vIEJjbWNoYXIubyBob3N0bWlicy5vIFBIU01vZHVsZS5vXAotCSAJT3NhbF9NaXNjLm8gbGVkX2NvbnRyb2wubyBudm0ubyB2ZW5kb3JzcGVjaWZpY2V4dG4ubworCQlsZWRfY29udHJvbC5vIG52bS5vIHZlbmRvcnNwZWNpZmljZXh0bi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL01pc2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vTWlzYy5jCmluZGV4IDIyNTUwZjcuLmY1ODVhYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vTWlzYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vTWlzYy5jCkBAIC0xLDUgKzEsMTIgQEAKICNpbmNsdWRlICJoZWFkZXJzLmgiCiAKK3N0YXRpYyBpbnQgQmNtRmlsZURvd25sb2FkKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgY29uc3QgY2hhciAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBsb2MpOworc3RhdGljIFZPSUQgZG9Qb3dlckF1dG9Db3JyZWN0aW9uKFBNSU5JX0FEQVBURVIgcHNBZGFwdGVyKTsKK3N0YXRpYyB2b2lkIEhhbmRsZVNodXREb3duTW9kZVJlcXVlc3QoUE1JTklfQURBUFRFUiBBZGFwdGVyLFBVQ0hBUiBwdWNCdWZmZXIpOworc3RhdGljIGludCBiY21fcGFyc2VfdGFyZ2V0X3BhcmFtcyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOworc3RhdGljIHZvaWQgYmVjZWVtX3Byb3RvY29sX3Jlc2V0IChQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOworCiBzdGF0aWMgVk9JRCBkZWZhdWx0X3dpbWF4X3Byb3RvY29sX2luaXRpYWxpemUoUE1JTklfQURBUFRFUiBBZGFwdGVyKQogewogCkBAIC02MCwyMSArNjcsMTEgQEAKICAgICAvL2luaXRfd2FpdHF1ZXVlX2hlYWQoJnBzQWRhcHRlci0+ZGV2aWNlX3dha2VfcXVldWUpOwogICAgIHBzQWRhcHRlci0+ZndfZG93bmxvYWRfZG9uZT1GQUxTRTsKIAotICAgIHBzQWRhcHRlci0+cHZPc0RlcERhdGEgPSAoUExJTlVYX0RFUF9EQVRBKSBrbWFsbG9jKHNpemVvZihMSU5VWF9ERVBfREFUQSksCi0gICAgICAgICAgICAgICAgIEdGUF9LRVJORUwpOwotCi0gICAgaWYocHNBZGFwdGVyLT5wdk9zRGVwRGF0YSA9PSBOVUxMKQotCXsKLSAgICAgICAgQkNNX0RFQlVHX1BSSU5UKHBzQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJMaW51eCBTcGVjaWZpYyBEYXRhIGFsbG9jYXRpb24gZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiAtRU5PTUVNOwotICAgIH0KLSAgICBtZW1zZXQocHNBZGFwdGVyLT5wdk9zRGVwRGF0YSwgMCwgc2l6ZW9mKExJTlVYX0RFUF9EQVRBKSk7CiAKIAlkZWZhdWx0X3dpbWF4X3Byb3RvY29sX2luaXRpYWxpemUocHNBZGFwdGVyKTsKIAlmb3IgKGk9MDtpPE1BWF9DTlRSTF9QS1RTO2krKykKIAl7Ci0JCXBzQWRhcHRlci0+dHhjdGxwYWNrZXRbaV0gPSAoY2hhciAqKWttYWxsb2MoTUFYX0NOVExfUEtUX1NJWkUsCi0JCQkJCQkJCQkJCQlHRlBfS0VSTkVMKTsKKwkJcHNBZGFwdGVyLT50eGN0bHBhY2tldFtpXSA9IGttYWxsb2MoTUFYX0NOVExfUEtUX1NJWkUsIEdGUF9LRVJORUwpOwogCQlpZighcHNBZGFwdGVyLT50eGN0bHBhY2tldFtpXSkKIAkJewogCQkJQkNNX0RFQlVHX1BSSU5UKHBzQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJObyBNb3JlIENudGwgcGt0cyBnb3QsIG1heCBnb3QgaXMgJWQiLCBpKTsKQEAgLTExNyw3ICsxMTQsNyBAQAogCiBWT0lEIEFkYXB0ZXJGcmVlKFBNSU5JX0FEQVBURVIgQWRhcHRlcikKIHsKLQlJTlQgY291bnQgPSAwOworCWludCBjb3VudDsKIAogCWJlY2VlbV9wcm90b2NvbF9yZXNldChBZGFwdGVyKTsKIApAQCAtMTI1LDcyICsxMjIsNjYgQEAKIAogCWlmKEFkYXB0ZXItPmNvbnRyb2xfcGFja2V0X2hhbmRsZXIgJiYgIUlTX0VSUihBZGFwdGVyLT5jb250cm9sX3BhY2tldF9oYW5kbGVyKSkKIAkgIAlrdGhyZWFkX3N0b3AgKEFkYXB0ZXItPmNvbnRyb2xfcGFja2V0X2hhbmRsZXIpOworCiAJaWYoQWRhcHRlci0+dHJhbnNtaXRfcGFja2V0X3RocmVhZCAmJiAhSVNfRVJSKEFkYXB0ZXItPnRyYW5zbWl0X3BhY2tldF90aHJlYWQpKQotICAgIAlrdGhyZWFkX3N0b3AgKEFkYXB0ZXItPnRyYW5zbWl0X3BhY2tldF90aHJlYWQpOwotICAgIHdha2VfdXAoJkFkYXB0ZXItPnByb2Nlc3NfcmVhZF93YWl0X3F1ZXVlKTsKKwkJa3RocmVhZF9zdG9wIChBZGFwdGVyLT50cmFuc21pdF9wYWNrZXRfdGhyZWFkKTsKKworCXdha2VfdXAoJkFkYXB0ZXItPnByb2Nlc3NfcmVhZF93YWl0X3F1ZXVlKTsKKwogCWlmKEFkYXB0ZXItPkxFREluZm8ubGVkX3RocmVhZF9ydW5uaW5nICYgKEJDTV9MRURfVEhSRUFEX1JVTk5JTkdfQUNUSVZFTFkgfCBCQ01fTEVEX1RIUkVBRF9SVU5OSU5HX0lOQUNUSVZFTFkpKQogCQlrdGhyZWFkX3N0b3AgKEFkYXB0ZXItPkxFREluZm8ubGVkX2NudHJsX3RocmVhZGlkKTsKLQliY21fdW5yZWdpc3Rlcl9uZXR3b3JrZGV2KEFkYXB0ZXIpOworCisJdW5yZWdpc3Rlcl9uZXR3b3JrZGV2KEFkYXB0ZXIpOworCisJLyogRklYTUU6IHVzZSBwcm9wZXIgd2FpdF9ldmVudCBhbmQgcmVmY291bnRpbmcgKi8KIAl3aGlsZShhdG9taWNfcmVhZCgmQWRhcHRlci0+QXBwbGljYXRpb25SdW5uaW5nKSkKIAl7CiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIldhaXRpbmcgZm9yIEFwcGxpY2F0aW9uIHRvIGNsb3NlLi4gJWRcbiIsYXRvbWljX3JlYWQoJkFkYXB0ZXItPkFwcGxpY2F0aW9uUnVubmluZykpOwogCQltc2xlZXAoMTAwKTsKIAl9CiAJdW5yZWdpc3Rlcl9jb250cm9sX2RldmljZV9pbnRlcmZhY2UoQWRhcHRlcik7Ci0JaWYoQWRhcHRlci0+ZGV2ICYmICFJU19FUlIoQWRhcHRlci0+ZGV2KSkKLQkJZnJlZV9uZXRkZXYoQWRhcHRlci0+ZGV2KTsKLQlpZihBZGFwdGVyLT5wc3RhcmdldHBhcmFtcyAhPSBOVUxMKQotCXsKLQkJYmNtX2tmcmVlKEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zKTsKLQl9CisKKwlrZnJlZShBZGFwdGVyLT5wc3RhcmdldHBhcmFtcyk7CisKIAlmb3IgKGNvdW50ID0wO2NvdW50IDwgTUFYX0NOVFJMX1BLVFM7Y291bnQrKykKLQl7Ci0JCWlmKEFkYXB0ZXItPnR4Y3RscGFja2V0W2NvdW50XSkKLQkJCWJjbV9rZnJlZShBZGFwdGVyLT50eGN0bHBhY2tldFtjb3VudF0pOwotCX0KKwkJa2ZyZWUoQWRhcHRlci0+dHhjdGxwYWNrZXRbY291bnRdKTsKKwogCUZyZWVBZGFwdGVyRHN4QnVmZmVyKEFkYXB0ZXIpOwotCWlmKEFkYXB0ZXItPnB2T3NEZXBEYXRhKQotCQliY21fa2ZyZWUgKEFkYXB0ZXItPnB2T3NEZXBEYXRhKTsKLQlpZihBZGFwdGVyLT5wdkludGVyZmFjZUFkYXB0ZXIpCi0JCWJjbV9rZnJlZShBZGFwdGVyLT5wdkludGVyZmFjZUFkYXB0ZXIpOworCisJa2ZyZWUoQWRhcHRlci0+cHZJbnRlcmZhY2VBZGFwdGVyKTsKIAogCS8vRnJlZSB0aGUgUEhTIEludGVyZmFjZQogCVBoc0NsZWFudXAoJkFkYXB0ZXItPnN0QkNNUGhzQ29udGV4dCk7CiAKLSNpZm5kZWYgQkNNX1NITV9JTlRFUkZBQ0UKIAlCY21EZUFsbG9jRmxhc2hDU1N0cnVjdHVyZShBZGFwdGVyKTsKLSNlbmRpZgogCi0JYmNtX2tmcmVlIChBZGFwdGVyKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICI8PT09PT09PT1cbiIpOworCWZyZWVfbmV0ZGV2KEFkYXB0ZXItPmRldik7CiB9CiAKLQotaW50IGNyZWF0ZV93b3JrZXJfdGhyZWFkcyhQTUlOSV9BREFQVEVSIHBzQWRhcHRlcikKK3N0YXRpYyBpbnQgY3JlYXRlX3dvcmtlcl90aHJlYWRzKFBNSU5JX0FEQVBURVIgcHNBZGFwdGVyKQogewotCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiSW5pdCBUaHJlYWRzLi4uIik7CiAJLy8gUnggQ29udHJvbCBQYWNrZXRzIFByb2Nlc3NpbmcKIAlwc0FkYXB0ZXItPmNvbnRyb2xfcGFja2V0X2hhbmRsZXIgPSBrdGhyZWFkX3J1bigoaW50ICgqKSh2b2lkICopKQotCQkJY29udHJvbF9wYWNrZXRfaGFuZGxlciwgcHNBZGFwdGVyLCAiQ3RybFBrdEhkbHIiKTsKKwkJCQkJCQljb250cm9sX3BhY2tldF9oYW5kbGVyLCBwc0FkYXB0ZXIsICIlcy1yeCIsIERSVl9OQU1FKTsKIAlpZihJU19FUlIocHNBZGFwdGVyLT5jb250cm9sX3BhY2tldF9oYW5kbGVyKSkKIAl7Ci0JCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiTm8gS2VybmVsIFRocmVhZCwgYnV0IHN0aWxsIHJldHVybmluZyBzdWNjZXNzXG4iKTsKKwkJcHJfbm90aWNlKERSVl9OQU1FICI6IGNvdWxkIG5vdCBjcmVhdGUgY29udHJvbCB0aHJlYWRcbiIpOwogCQlyZXR1cm4gUFRSX0VSUihwc0FkYXB0ZXItPmNvbnRyb2xfcGFja2V0X2hhbmRsZXIpOwogCX0KKwogCS8vIFR4IFRocmVhZAogCXBzQWRhcHRlci0+dHJhbnNtaXRfcGFja2V0X3RocmVhZCA9IGt0aHJlYWRfcnVuKChpbnQgKCopKHZvaWQgKikpCi0JCXR4X3BrdF9oYW5kbGVyLCBwc0FkYXB0ZXIsICJUeFBrdFRocmVhZCIpOworCQkJCQkJCXR4X3BrdF9oYW5kbGVyLCBwc0FkYXB0ZXIsICIlcy10eCIsIERSVl9OQU1FKTsKIAlpZihJU19FUlIgKHBzQWRhcHRlci0+dHJhbnNtaXRfcGFja2V0X3RocmVhZCkpCiAJewotCQlCQ01fREVCVUdfUFJJTlQocHNBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIk5vIEtlcm5lbCBUaHJlYWQsIGJ1dCBzdGlsbCByZXR1cm5pbmcgc3VjY2VzcyIpOworCQlwcl9ub3RpY2UoRFJWX05BTUUgIjogY291bGQgbm90IGNyZWF0IHRyYW5zbWl0IHRocmVhZFxuIik7CiAJCWt0aHJlYWRfc3RvcChwc0FkYXB0ZXItPmNvbnRyb2xfcGFja2V0X2hhbmRsZXIpOwogCQlyZXR1cm4gUFRSX0VSUihwc0FkYXB0ZXItPnRyYW5zbWl0X3BhY2tldF90aHJlYWQpOwogCX0KIAlyZXR1cm4gMDsKIH0KIAotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBmaWxlICpvcGVuX2Zpcm13YXJlX2ZpbGUoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBjaGFyICpwYXRoKQorc3RhdGljIHN0cnVjdCBmaWxlICpvcGVuX2Zpcm13YXJlX2ZpbGUoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBjb25zdCBjaGFyICpwYXRoKQogewogICAgIHN0cnVjdCBmaWxlICAgICAgICAgICAgICpmbHA9TlVMTDsKICAgICBtbV9zZWdtZW50X3QgICAgICAgIG9sZGZzOwpAQCAtMjAwLDI2ICsxOTEsMjAgQEAKICAgICBzZXRfZnMob2xkZnMpOwogICAgIGlmKElTX0VSUihmbHApKQogICAgIHsKLSAgICAgICAgQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiVW5hYmxlIFRvIE9wZW4gRmlsZSAlcywgZXJyICAlbHgiLAotCQkJCXBhdGgsIFBUUl9FUlIoZmxwKSk7Ci0JCWZscCA9IE5VTEw7CisJICAgIHByX2VycihEUlZfTkFNRSAiVW5hYmxlIFRvIE9wZW4gRmlsZSAlcywgZXJyICVsZCIsCisJCSAgIHBhdGgsIFBUUl9FUlIoZmxwKSk7CisJICAgIGZscCA9IE5VTEw7CiAgICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIEJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIkdvdCBmaWxlIGRlc2NyaXB0b3IgcG9pbnRlciBvZiAlcyEiLAotCQkJcGF0aCk7Ci0gICAgfQotCWlmKEFkYXB0ZXItPmRldmljZV9yZW1vdmVkKQotCXsKLQkJZmxwID0gTlVMTDsKLQl9CisKKyAgICBpZihBZGFwdGVyLT5kZXZpY2VfcmVtb3ZlZCkKKwkgICAgZmxwID0gTlVMTDsKIAogICAgIHJldHVybiBmbHA7CiB9CiAKIAotaW50IEJjbUZpbGVEb3dubG9hZChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsLyoqPCBMb2dpY2FsIEFkYXB0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnBhdGgsICAgICAvKio8IHBhdGggdG8gaW1hZ2UgZmlsZSAqLworc3RhdGljIGludCBCY21GaWxlRG93bmxvYWQoUE1JTklfQURBUFRFUiBBZGFwdGVyLC8qKjwgTG9naWNhbCBBZGFwdGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXRoLCAgICAgLyoqPCBwYXRoIHRvIGltYWdlIGZpbGUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBsb2MgICAgLyoqPCBEb3dubG9hZCBBZGRyZXNzIG9uIHRoZSBjaGlwKi8KICAgICAgICAgICAgICAgICAgICAgICAgICkKIHsKQEAgLTI0OCw5ICsyMzMsNyBAQAogICAgICAgICBnb3RvIGV4aXRfZG93bmxvYWQ7CiAgICAgfQogICAgIG9sZGZzPWdldF9mcygpO3NldF9mcyhnZXRfZHMoKSk7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQogICAgIHZmc19sbHNlZWsoZmxwLCAwLCAwKTsKLSNlbmRpZgogICAgIHNldF9mcyhvbGRmcyk7CiAgICAgaWYoQWRhcHRlci0+YmNtX2ZpbGVfcmVhZGJhY2tfZnJvbV9jaGlwKEFkYXB0ZXItPnB2SW50ZXJmYWNlQWRhcHRlciwKIAkJCQkJCQkJCQlmbHAsIGxvYykpCkBAIC0yNjUsMzEgKzI0OCwxMCBAQAogCWlmKGZscCAmJiAhKElTX0VSUihmbHApKSkKICAgICAJZmlscF9jbG9zZShmbHAsIGN1cnJlbnQtPmZpbGVzKTsKICAgICBzZXRfZnMob2xkZnMpOwotICAgIGRvX2dldHRpbWVvZmRheSgmdHYpOwotICAgIEJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgImZpbGUgZG93bmxvYWQgZG9uZSBhdCAlbHgiLCAoKHR2LnR2X3NlYyAqIDEwMDApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHYudHZfdXNlYy8xMDAwKSkpOworCiAgICAgcmV0dXJuIGVycm9ybm87CiB9CiAKLQotdm9pZCBiY21fa2ZyZWVfc2tiKHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JaWYoc2tiKQotICAgIHsKLSAgICAJa2ZyZWVfc2tiKHNrYik7Ci0gICAgfQotCXNrYiA9IE5VTEwgOwotfQotCi1WT0lEIGJjbV9rZnJlZShWT0lEICpwdHIpCi17Ci0JaWYocHRyKQotCXsKLQkJa2ZyZWUocHRyKTsKLQl9Ci0JcHRyID0gTlVMTCA7Ci19Ci0KIC8qKgogQGluZ3JvdXAgY3RybF9wa3RfZnVuY3Rpb25zCiBUaGlzIGZ1bmN0aW9uIGNvcGllcyB0aGUgY29udGVudHMgb2YgZ2l2ZW4gYnVmZmVyCkBAIC0zOTUsMTMgKzM1Nyw2IEBACiAJCQkvKlNldHRpbmcgYklkbGVNb2RlX3R4X2Zyb21faG9zdCB0byBUUlVFIHRvIGluZGljYXRlIExFRCBjb250cm9sIHRocmVhZCB0byByZXByZXNlbnQKIAkJCSAgdGhlIHdha2UgdXAgZnJvbSBpZGxlbW9kZSBpcyBmcm9tIGhvc3QqLwogCQkJLy9BZGFwdGVyLT5MRURJbmZvLmJJZGxlTW9kZV90eF9mcm9tX2hvc3QgPSBUUlVFOwotI2lmIDAKLQkJCWlmKFNUQVRVU19TVUNDRVNTICE9IEludGVyZmFjZUlkbGVNb2RlV2FrZXVwKEFkYXB0ZXIpKQotCQkJewotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBORVhUX1NFTkQsIERCR19MVkxfQUxMLCAiSWRsZSBNb2RlIFdha2UgdXAgRmFpbGVkXG4iKTsKLQkJCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7Ci0JCQl9Ci0jZW5kaWYKIAkJCUFkYXB0ZXItPmJXYWtlVXBEZXZpY2UgPSBUUlVFOwogCQkJd2FrZV91cCgmQWRhcHRlci0+cHJvY2Vzc19yeF9jbnRybHBrdCk7CiAKQEAgLTQ4OSw5ICs0NDQsNiBAQAogCQlhdG9taWNfaW5jKCZBZGFwdGVyLT5pbmRleF93cl90eGNudHJscGt0KTsKIAkJQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX1RYLCBUWF9DT05UUk9MLERCR19MVkxfQUxMLCAiQ2FsbGluZyB0cmFuc21pdF9wYWNrZXRzIik7CiAJCWF0b21pY19zZXQoJkFkYXB0ZXItPlR4UGt0QXZhaWwsIDEpOwotI2lmZGVmIEJDTV9TSE1fSU5URVJGQUNFCi0JCXZpcnR1YWxfbWFpbF9ib3hfaW50ZXJydXB0KCk7Ci0jZW5kaWYKIAkJd2FrZV91cCgmQWRhcHRlci0+dHhfcGFja2V0X3dhaXRfcXVldWUpOwogCX0KIAllbHNlCkBAIC01MzAsMTggKzQ4Miw2IEBACiAjZW5kaWYKIAogCi12b2lkIFNlbmRMaW5rRG93bihQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCi17Ci0JTElOS19SRVFVRVNUCXN0TGlua0Rvd25SZXF1ZXN0OwotCW1lbXNldCgmc3RMaW5rRG93blJlcXVlc3QsIDAsIHNpemVvZihMSU5LX1JFUVVFU1QpKTsKLQlzdExpbmtEb3duUmVxdWVzdC5MZWFkZXIuU3RhdHVzPUxJTktfVVBfQ09OVFJPTF9SRVE7Ci0Jc3RMaW5rRG93blJlcXVlc3QuTGVhZGVyLlBMZW5ndGg9c2l6ZW9mKFVMT05HKTsvL21pbmltdW0gNCBieXRlcwotCXN0TGlua0Rvd25SZXF1ZXN0LnN6RGF0YVswXT1MSU5LX0RPV05fUkVRX1BBWUxPQUQ7Ci0JQWRhcHRlci0+YkxpbmtEb3duUmVxdWVzdGVkID0gVFJVRTsKLQotCUNvcHlCdWZmZXJUb0NvbnRyb2xQYWNrZXQoQWRhcHRlciwmc3RMaW5rRG93blJlcXVlc3QpOwotfQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEZ1bmN0aW9uICAgIC0gTGlua01lc3NhZ2UoKQogKgpAQCAtNTUyLDcgKzQ5Miw3IEBACiAqCiAqIFJldHVybnMgICAgIC0gTm9uZS4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1fX2lubGluZSBWT0lEIExpbmtNZXNzYWdlKFBNSU5JX0FEQVBURVIgQWRhcHRlcikKK1ZPSUQgTGlua01lc3NhZ2UoUE1JTklfQURBUFRFUiBBZGFwdGVyKQogewogCVBMSU5LX1JFUVVFU1QJcHN0TGlua1JlcXVlc3Q9TlVMTDsKIAlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIExJTktfVVBfTVNHLCBEQkdfTFZMX0FMTCwgIj09PT09PiIpOwpAQCAtNTk0LDcgKzUzNCw3IEBACiAJewogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIExJTktfVVBfTVNHLCBEQkdfTFZMX0FMTCwgIkNhbGxpbmcgQ29weUJ1ZmZlclRvQ29udHJvbFBhY2tldCIpOwogCQlDb3B5QnVmZmVyVG9Db250cm9sUGFja2V0KEFkYXB0ZXIsIHBzdExpbmtSZXF1ZXN0KTsKLQkJYmNtX2tmcmVlKHBzdExpbmtSZXF1ZXN0KTsKKwkJa2ZyZWUocHN0TGlua1JlcXVlc3QpOwogCX0KIAlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIExJTktfVVBfTVNHLCBEQkdfTFZMX0FMTCwgIkxpbmtNZXNzYWdlIDw9PT09PSIpOwogCXJldHVybjsKQEAgLTYxNCw4ICs1NTQsOCBAQAogVk9JRCBTdGF0aXN0aWNzUmVzcG9uc2UoUE1JTklfQURBUFRFUiBBZGFwdGVyLFBWT0lEIHB2QnVmZmVyKQogewogCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwgIiVzPT09PT4iLF9fRlVOQ1RJT05fXyk7Ci0JQWRhcHRlci0+U3RhdGlzdGljc1BvaW50ZXIgPSBudG9obCgqKFBVTE9ORylwdkJ1ZmZlcik7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCAiU3RhdHMgYXQgJWx4IiwgQWRhcHRlci0+U3RhdGlzdGljc1BvaW50ZXIpOworCUFkYXB0ZXItPlN0YXRpc3RpY3NQb2ludGVyID0gbnRvaGwoKihfX2JlMzIgKilwdkJ1ZmZlcik7CisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCAiU3RhdHMgYXQgJXgiLCAoVUlOVClBZGFwdGVyLT5TdGF0aXN0aWNzUG9pbnRlcik7CiAJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCAiJXMgPD09PT0iLF9fRlVOQ1RJT05fXyk7CiAJcmV0dXJuOwogfQpAQCAtNzY0LDcgKzcwNCw3IEBACiAKIAkJCS8qIFdha2UgdGhlIExFRCBUaHJlYWQgd2l0aCBJRExFTU9ERV9FTlRFUiBTdGF0ZSAqLwogCQkJQWRhcHRlci0+RHJpdmVyU3RhdGUgPSBMT1dQT1dFUl9NT0RFX0VOVEVSOwotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUlgsIFJYX0RQQywgREJHX0xWTF9BTEwsIkxFRCBUaHJlYWQgaXMgUnVubmluZy4uSGVuY2UgU2V0dGluZyBMRUQgRXZlbnQgYXMgSURMRU1PREVfRU5URVIgamlmZmllczolbGQiLGppZmZpZXMpOzsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1JYLCBSWF9EUEMsIERCR19MVkxfQUxMLCJMRUQgVGhyZWFkIGlzIFJ1bm5pbmcuLkhlbmNlIFNldHRpbmcgTEVEIEV2ZW50IGFzIElETEVNT0RFX0VOVEVSIGppZmZpZXM6JWxkIixqaWZmaWVzKTsKIAkJCXdha2VfdXAoJkFkYXB0ZXItPkxFREluZm8ubm90aWZ5X2xlZF9ldmVudCk7CiAKIAkJCS8qIFdhaXQgZm9yIDEgU0VDIGZvciBMRUQgdG8gT0ZGICovCkBAIC03ODcsMTIgKzcyNywxMCBAQAogCQkJZG93bigmQWRhcHRlci0+cmRtd3Jtc3luYyk7CiAJCQlBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID0gVFJVRTsKIAkJCXVwKCZBZGFwdGVyLT5yZG13cm1zeW5jKTsKLSNpZm5kZWYgQkNNX1NITV9JTlRFUkZBQ0UKIAkJCS8vS2lsbGluZyBhbGwgVVJCUy4KIAkJCWlmKEFkYXB0ZXItPmJEb1N1c3BlbmQgPT0gVFJVRSkKIAkJCQlCY21fa2lsbF9hbGxfVVJCcygoUFNfSU5URVJGQUNFX0FEQVBURVIpKEFkYXB0ZXItPnB2SW50ZXJmYWNlQWRhcHRlcikpOwogCi0jZW5kaWYKIAkJfQogCQllbHNlCiAJCXsKQEAgLTgxMSw5ICs3NDksNyBAQAogCXsKIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJmYWlsIHRvIHNlbmQgdGhlIElkbGUgbW9kZSBSZXF1ZXN0IFxuIik7CiAJCUFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPSBGQUxTRTsKLSNpZm5kZWYgQkNNX1NITV9JTlRFUkZBQ0UKIAkJU3RhcnRJbnRlcnJ1cHRVcmIoKFBTX0lOVEVSRkFDRV9BREFQVEVSKShBZGFwdGVyLT5wdkludGVyZmFjZUFkYXB0ZXIpKTsKLSNlbmRpZgogCX0KIAlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKIAlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9SWCwgUlhfRFBDLCBEQkdfTFZMX0FMTCwgIklkbGVNb2RlIE1zZyBzdWJtaXR0ZXIgdG8gUSA6JWxkIG1zIiwgdHYudHZfc2VjICoxMDAwICsgdHYudHZfdXNlYyAvMTAwMCk7CkBAIC05ODAsMTIgKzkxNiwxMCBAQAogCiB9CiAKLQotX19pbmxpbmUgaW50IHJlc2V0X2NhcmRfcHJvYyhQTUlOSV9BREFQVEVSIHBzX2FkYXB0ZXIpCitpbnQgcmVzZXRfY2FyZF9wcm9jKFBNSU5JX0FEQVBURVIgcHNfYWRhcHRlcikKIHsKIAlpbnQgcmV0dmFsID0gU1RBVFVTX1NVQ0NFU1M7CiAKLSNpZm5kZWYgQkNNX1NITV9JTlRFUkZBQ0UKICAgICBQTUlOSV9BREFQVEVSIEFkYXB0ZXIgPSBHRVRfQkNNX0FEQVBURVIoZ2JscG5ldGRldik7CiAJUFNfSU5URVJGQUNFX0FEQVBURVIgcHNJbnRmQWRhcHRlciA9IE5VTEw7CiAJdW5zaWduZWQgaW50IHZhbHVlID0gMCwgdWlSZXNldFZhbHVlID0gMDsKQEAgLTEwMDYsMTEgKzk0MCw5IEBACiAJCXdybWFsdChwc19hZGFwdGVyLCBTWVNfQ0ZHLCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOwogCX0KIAotI2lmbmRlZiBCQ01fU0hNX0lOVEVSRkFDRQogCS8va2lsbGluZyBhbGwgc3VibWl0dGVkIFVSQnMuCiAJcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5TdG9wQWxsWGFjdGlvbiA9IFRSVUUgOwogCUJjbV9raWxsX2FsbF9VUkJzKHBzSW50ZkFkYXB0ZXIpOwotI2VuZGlmCiAJLyogUmVzZXQgdGhlIFVNQS1CIERldmljZSAqLwogCWlmKHBzX2FkYXB0ZXItPmNoaXBfaWQgPj0gVDNMUEIpCiAJewpAQCAtMTExMSwxMSArMTA0MywxMCBAQAogCiBlcnJfZXhpdCA6CiAJcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5TdG9wQWxsWGFjdGlvbiA9IEZBTFNFIDsKLSNlbmRpZgogCXJldHVybiByZXR2YWw7CiB9CiAKLV9faW5saW5lIGludCBydW5fY2FyZF9wcm9jKFBNSU5JX0FEQVBURVIgcHNfYWRhcHRlciApCitpbnQgcnVuX2NhcmRfcHJvYyhQTUlOSV9BREFQVEVSIHBzX2FkYXB0ZXIgKQogewogCXVuc2lnbmVkIGludCB2YWx1ZT0wOwogCXsKQEAgLTExNDYsMjEgKzEwNzcsMTcgQEAKIGludCBJbml0Q2FyZEFuZERvd25sb2FkRmlybXdhcmUoUE1JTklfQURBUFRFUiBwc19hZGFwdGVyKQogewogCi0JVUlOVCBzdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKKwlpbnQgc3RhdHVzOwogCVVJTlQgdmFsdWUgPSAwOwotI2lmZGVmIEJDTV9TSE1fSU5URVJGQUNFCi0JdW5zaWduZWQgY2hhciAqcENvbmZpZ0ZpbGVBZGRyID0gKHVuc2lnbmVkIGNoYXIgKilDUEVfTUFDWFZJX0NGR19BRERSOwotI2VuZGlmCiAJLyoKICAJICogQ3JlYXRlIHRoZSB0aHJlYWRzIGZpcnN0IGFuZCB0aGVuIGRvd25sb2FkIHRoZQogIAkgKiBGaXJtL0REUiBTZXR0aW5ncy4uCiAgCSAqLwogCi0JaWYoKHN0YXR1cyA9IGNyZWF0ZV93b3JrZXJfdGhyZWFkcyhwc19hZGFwdGVyKSk8MCkKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChwc19hZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIkNhbm5vdCBjcmVhdGUgdGhyZWFkIik7CisJc3RhdHVzID0gY3JlYXRlX3dvcmtlcl90aHJlYWRzKHBzX2FkYXB0ZXIpOworCWlmIChzdGF0dXM8MCkKIAkJcmV0dXJuIHN0YXR1czsKLQl9CisKIAkvKgogIAkgKiBGb3IgRG93bmxvYWRpbmcgdGhlIEZpcm0sIHBhcnNlIHRoZSBjZmcgZmlsZSBmaXJzdC4KICAJICovCkBAIC0xMTY5LDcgKzEwOTYsNiBAQAogCQlyZXR1cm4gc3RhdHVzOwogCX0KIAotI2lmbmRlZiBCQ01fU0hNX0lOVEVSRkFDRQogCWlmKHBzX2FkYXB0ZXItPmNoaXBfaWQgPj0gVDNMUEIpCiAJewogCQlyZG1hbHQocHNfYWRhcHRlciwgU1lTX0NGRywgJnZhbHVlLCBzaXplb2YgKHZhbHVlKSk7CkBAIC0xMTg3LDcgKzExMTMsNyBAQAogCXN0YXR1cyA9IGRkcl9pbml0KHBzX2FkYXB0ZXIpOwogCWlmKHN0YXR1cykKIAl7Ci0JCUJDTV9ERUJVR19QUklOVCAocHNfYWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJkZHJfaW5pdCBGYWlsZWRcbiIpOworCQlwcl9lcnIoRFJWX05BTUUgImRkcl9pbml0IEZhaWxlZFxuIik7CiAJCXJldHVybiBzdGF0dXM7CiAJfQogCkBAIC0xMjAxLDcgKzExMjcsNiBAQAogCQlCQ01fREVCVUdfUFJJTlQocHNfYWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJFcnJvciBkb3dubG9hZGluZyBDRkcgZmlsZSIpOwogCQlnb3RvIE9VVDsKIAl9Ci0JQkNNX0RFQlVHX1BSSU5UKHBzX2FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiQ0ZHIGZpbGUgZG93bmxvYWRlZCIpOwogCiAJaWYocmVnaXN0ZXJfbmV0d29ya2Rldihwc19hZGFwdGVyKSkKIAl7CkBAIC0xMjY2LDEyICsxMTkxLDYgQEAKIAkJCWdvdG8gT1VUOwogCQl9CiAJfQotI2lmIDAKLQllbHNlIGlmKHBzQWRhcHRlci0+ZU5WTVR5cGUgPT0gTlZNX0VFUFJPTSkKLQl7Ci0JCVByb3BhZ2F0ZUNhbFBhcmFtc0Zyb21FRVBST01Ub01lbW9yeSgpOwotCX0KLSNlbmRpZgogCiAJLyogRG93bmxvYWQgRmlybWFyZSAqLwogCWlmICgoc3RhdHVzID0gQmNtRmlsZURvd25sb2FkKCBwc19hZGFwdGVyLCBCSU5fRklMRSwgRklSTVdBUkVfQkVHSU5fQUREUikpKQpAQCAtMTI4MCw3ICsxMTk5LDYgQEAKIAkJZ290byBPVVQ7CiAJfQogCi0JQkNNX0RFQlVHX1BSSU5UKHBzX2FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiQklOIGZpbGUgZG93bmxvYWRlZCIpOwogCXN0YXR1cyA9IHJ1bl9jYXJkX3Byb2MocHNfYWRhcHRlcik7CiAJaWYoc3RhdHVzKQogCXsKQEAgLTEyOTksNjggKzEyMTcsMTkgQEAKIAkJd2FrZV91cCgmcHNfYWRhcHRlci0+TEVESW5mby5ub3RpZnlfbGVkX2V2ZW50KTsKIAl9CiAKLSNlbHNlCi0KLQlwc19hZGFwdGVyLT5iRERSSW5pdERvbmUgPSBUUlVFOwotCS8vSW5pdGlhbGl6aW5nIHRoZSBOVk0uCi0JQmNtSW5pdE5WTShwc19hZGFwdGVyKTsKLQotCS8vUHJvcGFnYXRpbmcgdGhlIGNhbCBwYXJhbSBmcm9tIEZsYXNoIHRvIEREUgotCXZhbHVlID0gMDsKLQl3cm1hbHQocHNfYWRhcHRlciwgRUVQUk9NX0NBTF9EQVRBX0lOVEVSTkFMX0xPQyAtIDQsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7Ci0Jd3JtYWx0KHBzX2FkYXB0ZXIsIEVFUFJPTV9DQUxfREFUQV9JTlRFUk5BTF9MT0MgLSA4LCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOwotCi0JaWYocHNfYWRhcHRlci0+ZU5WTVR5cGUgPT0gTlZNX0ZMQVNIKQotCXsKLQkJc3RhdHVzID0gUHJvcGFnYXRlQ2FsUGFyYW1zRnJvbUZsYXNoVG9NZW1vcnkocHNfYWRhcHRlcik7Ci0JCWlmKHN0YXR1cykKLQkJewotCQkJcHJpbnRrKCJcblByb3BvZ2F0aW9uIG9mIENhbCBwYXJhbSBmcm9tIGZsYXNoIHRvIEREUiBmYWlsZWQgLi5cbiIgKTsKLQkJfQotCX0KLQotCS8vQ29weSBjb25maWcgZmlsZSBwYXJhbSB0byBERFIuCi0JbWVtY3B5KHBDb25maWdGaWxlQWRkcixwc19hZGFwdGVyLT5wc3RhcmdldHBhcmFtcywgc2l6ZW9mKFNUQVJHRVRQQVJBTVMpKTsKLQotCWlmKHJlZ2lzdGVyX25ldHdvcmtkZXYocHNfYWRhcHRlcikpCi0JewotCQlCQ01fREVCVUdfUFJJTlQocHNfYWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJSZWdpc3RlciBOZXRkZXZpY2UgZmFpbGVkLiBDbGVhbnVwIG5lZWRzIHRvIGJlIHBlcmZvcm1lZC4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0KLQlzdGF0dXMgPSBJbml0TGVkU2V0dGluZ3MgKHBzX2FkYXB0ZXIpOwotCWlmKHN0YXR1cykKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChwc19hZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiSU5JVCBMRUQgRkFJTEVEXG4iKTsKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQotCWlmKHJlZ2lzdGVyX2NvbnRyb2xfZGV2aWNlX2ludGVyZmFjZShwc19hZGFwdGVyKSA8IDApCi0JewotCQlCQ01fREVCVUdfUFJJTlQocHNfYWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJSZWdpc3RlciBDb250cm9sIERldmljZSBmYWlsZWQuIENsZWFudXAgbmVlZHMgdG8gYmUgcGVyZm9ybWVkLiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlwc19hZGFwdGVyLT5md19kb3dubG9hZF9kb25lID0gVFJVRTsKLSNlbmRpZgogCXJldHVybiBzdGF0dXM7CiB9CiAKIAotaW50IGJjbV9wYXJzZV90YXJnZXRfcGFyYW1zKFBNSU5JX0FEQVBURVIgQWRhcHRlcikKK3N0YXRpYyBpbnQgYmNtX3BhcnNlX3RhcmdldF9wYXJhbXMoUE1JTklfQURBUFRFUiBBZGFwdGVyKQogewotI2lmZGVmIEJDTV9TSE1fSU5URVJGQUNFCi0JZXh0ZXJuIHZvaWQgcmVhZF9jZmdfZmlsZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwotI2VuZGlmCiAJc3RydWN0IGZpbGUgCQkqZmxwPU5VTEw7CiAJbW1fc2VnbWVudF90IAlvbGRmcz17MH07Ci0JY2hhciAqYnVmZiA9IE5VTEw7CisJY2hhciAqYnVmZjsKIAlpbnQgbGVuID0gMDsKIAlsb2ZmX3QJcG9zID0gMDsKIAotCWJ1ZmY9KFBDSEFSKWttYWxsb2MoQlVGRkVSXzFLLCBHRlBfS0VSTkVMKTsKKwlidWZmPWttYWxsb2MoQlVGRkVSXzFLLCBHRlBfS0VSTkVMKTsKIAlpZighYnVmZikKIAl7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMTM2OCwxNCArMTIzNywxNCBAQAogCWlmKChBZGFwdGVyLT5wc3RhcmdldHBhcmFtcyA9CiAJCWttYWxsb2Moc2l6ZW9mKFNUQVJHRVRQQVJBTVMpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKIAl7Ci0JCWJjbV9rZnJlZShidWZmKTsKKwkJa2ZyZWUoYnVmZik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlmbHA9b3Blbl9maXJtd2FyZV9maWxlKEFkYXB0ZXIsIENGR19GSUxFKTsKIAlpZighZmxwKSB7CiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIk5PVCBBQkxFIFRPIE9QRU4gVEhFICVzIEZJTEUgXG4iLCBDRkdfRklMRSk7Ci0JCWJjbV9rZnJlZShidWZmKTsKLQkJYmNtX2tmcmVlKEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zKTsKKwkJa2ZyZWUoYnVmZik7CisJCWtmcmVlKEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zKTsKIAkJQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMgPSBOVUxMOwogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CkBAIC0xMzg2LDggKzEyNTUsOCBAQAogCWlmKGxlbiAhPSBzaXplb2YoU1RBUkdFVFBBUkFNUykpCiAJewogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsIk1pc21hdGNoIGluIFRhcmdldCBQYXJhbSBTdHJ1Y3R1cmUhXG4iKTsKLQkJYmNtX2tmcmVlKGJ1ZmYpOwotCQliY21fa2ZyZWUoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMpOworCQlrZnJlZShidWZmKTsKKwkJa2ZyZWUoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMpOwogCQlBZGFwdGVyLT5wc3RhcmdldHBhcmFtcyA9IE5VTEw7CiAJCWZpbHBfY2xvc2UoZmxwLCBjdXJyZW50LT5maWxlcyk7CiAJCXJldHVybiAtRU5PRU5UOwpAQCAtMTM5OSwzNyArMTI2OCwzNCBAQAogCSAqIFZhbHVlcyBpbiBBZGFwdGVyLT5wc3RhcmdldHBhcmFtcyBhcmUgaW4gbmV0d29yayBieXRlIG9yZGVyCiAJICovCiAJbWVtY3B5KEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLCBidWZmLCBzaXplb2YoU1RBUkdFVFBBUkFNUykpOwotCWJjbV9rZnJlZSAoYnVmZik7CisJa2ZyZWUgKGJ1ZmYpOwogCWJlY2VlbV9wYXJzZV90YXJnZXRfc3RydWN0KEFkYXB0ZXIpOwotI2lmZGVmIEJDTV9TSE1fSU5URVJGQUNFCi0JcmVhZF9jZmdfZmlsZShBZGFwdGVyKTsKLQotI2VuZGlmCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQogCiB2b2lkIGJlY2VlbV9wYXJzZV90YXJnZXRfc3RydWN0KFBNSU5JX0FEQVBURVIgQWRhcHRlcikKIHsKLQlVSU5UIHVpSG9zdERydnJDZmc2ID0wLCB1aUVFUFJPTUZsYWcgPSAwOzsKKwlVSU5UIHVpSG9zdERydnJDZmc2ID0wLCB1aUVFUFJPTUZsYWcgPSAwOwogCiAJaWYobnRvaGwoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMyUGh5UGFyYW1ldGVyMikgJiBBVVRPX1NZTkNfRElTQUJMRSkKIAl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIkF1dG9TeW5jdXAgaXMgRGlzYWJsZWRcbiIpOworCQlwcl9pbmZvKERSVl9OQU1FICI6IEF1dG9TeW5jdXAgaXMgRGlzYWJsZWRcbiIpOwogCQlBZGFwdGVyLT5BdXRvU3luY3VwID0gRkFMU0U7CiAJfQogCWVsc2UKIAl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIkF1dG9TeW5jdXAgaXMgRW5hYmxlZFxuIik7CisJCXByX2luZm8oRFJWX05BTUUgIjogQXV0b1N5bmN1cCBpcyBFbmFibGVkXG4iKTsKIAkJQWRhcHRlci0+QXV0b1N5bmN1cAk9IFRSVUU7CiAJfQorCiAJaWYobnRvaGwoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPkhvc3REcnZyQ29uZmlnNikgJiBBVVRPX0xJTktVUF9FTkFCTEUpCiAJewotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJFbmFibGluZyBhdXRvbGluayB1cCIpOworCQlwcl9pbmZvKERSVl9OQU1FICI6IEVuYWJsaW5nIGF1dG9saW5rIHVwIik7CiAJCUFkYXB0ZXItPkF1dG9MaW5rVXAgPSBUUlVFOwogCX0KIAllbHNlCiAJewotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJEaXNhYmxpbmcgYXV0b2xpbmsgdXAiKTsKKwkJcHJfaW5mbyhEUlZfTkFNRSAiOiBEaXNhYmxpbmcgYXV0b2xpbmsgdXAiKTsKIAkJQWRhcHRlci0+QXV0b0xpbmtVcCA9IEZBTFNFOwogCX0KIAkvLyBTZXR0aW5nIHRoZSBERFIgU2V0dGluZy4uCkBAIC0xNDM4LDU5ICsxMzA0LDU0IEBACiAJQWRhcHRlci0+dWxQb3dlclNhdmVNb2RlID0KIAkJCShudG9obChBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+SG9zdERydnJDb25maWc2KT4+MTIpJjB4MEY7CiAKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJERFIgU2V0dGluZzogJXhcbiIsIEFkYXB0ZXItPkREUlNldHRpbmcpOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULERCR19MVkxfQUxMLCAiUG93ZXIgU2F2ZSBNb2RlOiAlbHhcbiIsCi0JCQkJCQkJQWRhcHRlci0+dWxQb3dlclNhdmVNb2RlKTsKKwlwcl9pbmZvKERSVl9OQU1FICI6IEREUiBTZXR0aW5nOiAleFxuIiwgQWRhcHRlci0+RERSU2V0dGluZyk7CisJcHJfaW5mbyhEUlZfTkFNRSAiOiBQb3dlciBTYXZlIE1vZGU6ICVseFxuIiwgQWRhcHRlci0+dWxQb3dlclNhdmVNb2RlKTsKIAlpZihudG9obChBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+SG9zdERydnJDb25maWc2KSAmIEFVVE9fRklSTV9ET1dOTE9BRCkKICAgICB7Ci0gICAgICAgIEJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIkVuYWJsaW5nIEF1dG8gRmlybXdhcmUgRG93bmxvYWRcbiIpOworICAgICAgICBwcl9pbmZvKERSVl9OQU1FICI6IEVuYWJsaW5nIEF1dG8gRmlybXdhcmUgRG93bmxvYWRcbiIpOwogICAgICAgICBBZGFwdGVyLT5BdXRvRmlybURsZCA9IFRSVUU7CiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICAgIEJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIkRpc2FibGluZyBBdXRvIEZpcm13YXJlIERvd25sb2FkXG4iKTsKKyAgICAgICAgcHJfaW5mbyhEUlZfTkFNRSAiOiBEaXNhYmxpbmcgQXV0byBGaXJtd2FyZSBEb3dubG9hZFxuIik7CiAgICAgICAgIEFkYXB0ZXItPkF1dG9GaXJtRGxkID0gRkFMU0U7CiAgICAgfQogCXVpSG9zdERydnJDZmc2ID0gbnRvaGwoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPkhvc3REcnZyQ29uZmlnNik7CiAJQWRhcHRlci0+Yk1pcHNDb25maWcgPSAodWlIb3N0RHJ2ckNmZzY+PjIwKSYweDAxOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwiTUlQU0NvbmZpZyAgIDogMHglWFxuIixBZGFwdGVyLT5iTWlwc0NvbmZpZyk7CisJcHJfaW5mbyhEUlZfTkFNRSAiOiBNSVBTQ29uZmlnICAgOiAweCVYXG4iLEFkYXB0ZXItPmJNaXBzQ29uZmlnKTsKIAkvL3VzZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCiAJQWRhcHRlci0+YkRQTExDb25maWcgPSAodWlIb3N0RHJ2ckNmZzY+PjE5KSYweDAxOwogCiAJQWRhcHRlci0+UG11TW9kZT0gKHVpSG9zdERydnJDZmc2ID4+IDI0ICkgJiAweDAzOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIlBNVSBNT0RFOiAleCIsIEFkYXB0ZXItPlBtdU1vZGUpOworCXByX2luZm8oRFJWX05BTUUgIjogUE1VIE1PREU6ICV4IiwgQWRhcHRlci0+UG11TW9kZSk7CiAKICAgICBpZigodWlIb3N0RHJ2ckNmZzYgPj4gSE9TVF9CVVNfU1VTUEVORF9CSVQgKSAmICgweDAxKSkKICAgICB7CiAgICAgICAgIEFkYXB0ZXItPmJEb1N1c3BlbmQgPSBUUlVFOwotICAgICAgICBCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJNYWtpbmcgRG9TdXNwZW5kIFRSVUUgYXMgcGVyIGNvbmZpZ0ZpbGUiKTsKKyAgICAgICAgcHJfaW5mbyhEUlZfTkFNRSAiOiBNYWtpbmcgRG9TdXNwZW5kIFRSVUUgYXMgcGVyIGNvbmZpZ0ZpbGUiKTsKICAgICB9CiAKIAl1aUVFUFJPTUZsYWcgPSBudG9obChBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJFRVBST01GbGFnKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJ1aUVFUFJPTUZsYWcgIDogMHglWFxuIix1aUVFUFJPTUZsYWcpOworCXByX2luZm8oRFJWX05BTUUgIjogdWlFRVBST01GbGFnICA6IDB4JVhcbiIsdWlFRVBST01GbGFnKTsKIAlBZGFwdGVyLT5lTlZNVHlwZSA9IChOVk1fVFlQRSkoKHVpRUVQUk9NRmxhZz4+NCkmMHgzKTsKIAotCiAJQWRhcHRlci0+YlN0YXR1c1dyaXRlID0gKHVpRUVQUk9NRmxhZz4+NikmMHgxOwotCS8vcHJpbnRrKCgiYlN0YXR1c1dyaXRlICAgOiAweCVYXG4iLCBBZGFwdGVyLT5iU3RhdHVzV3JpdGUpKTsKIAogCUFkYXB0ZXItPnVpU2VjdG9yU2l6ZUluQ0ZHID0gMTAyNCooMHhGRkZGICYgbnRvaGwoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPkhvc3REcnZyQ29uZmlnNCkpOwotCS8vcHJpbnRrKCgidWlTZWN0b3JTaXplICAgOiAweCVYXG4iLCBBZGFwdGVyLT51aVNlY3RvclNpemVJbkNGRykpOwogCiAJQWRhcHRlci0+YlNlY3RvclNpemVPdmVycmlkZSA9KGJvb2wpICgobnRvaGwoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPkhvc3REcnZyQ29uZmlnNCkpPj4xNikmMHgxOwotCS8vcHJpbnRrKE1QX0lOSVQsKCJiU2VjdG9yU2l6ZU92ZXJyaWRlICAgOiAweCVYXG4iLEFkYXB0ZXItPmJTZWN0b3JTaXplT3ZlcnJpZGUpKTsKIAogCWlmKG50b2hsKEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMlBvd2VyU2F2aW5nTW9kZU9wdGlvbnMpICYweDAxKQogCQlBZGFwdGVyLT51bFBvd2VyU2F2ZU1vZGUgPSBERVZJQ0VfUE9XRVJTQVZFX01PREVfQVNfUFJPVE9DT0xfSURMRV9NT0RFOwotCS8vYXV0b2NvcnJlY3Rpb24gcGFydAorCiAJaWYoQWRhcHRlci0+dWxQb3dlclNhdmVNb2RlICE9IERFVklDRV9QT1dFUlNBVkVfTU9ERV9BU19QUk9UT0NPTF9JRExFX01PREUpCiAJCWRvUG93ZXJBdXRvQ29ycmVjdGlvbihBZGFwdGVyKTsKIAogfQogCi1WT0lEIGRvUG93ZXJBdXRvQ29ycmVjdGlvbihQTUlOSV9BREFQVEVSIHBzQWRhcHRlcikKK3N0YXRpYyBWT0lEIGRvUG93ZXJBdXRvQ29ycmVjdGlvbihQTUlOSV9BREFQVEVSIHBzQWRhcHRlcikKIHsKLQlVSU5UIHJlcG9ydGluZ19tb2RlID0gMDsKKwlVSU5UIHJlcG9ydGluZ19tb2RlOwogCiAJcmVwb3J0aW5nX21vZGUgPSBudG9obChwc0FkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMlBvd2VyU2F2aW5nTW9kZU9wdGlvbnMpICYweDAyIDsKIAlwc0FkYXB0ZXItPmJJc0F1dG9Db3JyZWN0RW5hYmxlZCA9ICEoKGNoYXIpKHBzQWRhcHRlci0+dWxQb3dlclNhdmVNb2RlID4+IDMpICYgMHgxKTsKQEAgLTE1MDQsMjAgKzEzNjUsOSBAQAogCWlmIChwc0FkYXB0ZXItPmJJc0F1dG9Db3JyZWN0RW5hYmxlZCAmJiAocHNBZGFwdGVyLT5jaGlwX2lkID49IFQzTFBCKSkKIAl7CiAJCS8vSWYgcmVwb3J0aW5nIG1vZGUgaXMgZW5hYmxlLCBzd2l0Y2ggUE1VIHRvIFBNQwotCQkjaWYgMAotCQlpZihyZXBvcnRpbmdfbW9kZSA9PSBGQUxTRSkKLQkJewotCQkJcHNBZGFwdGVyLT51bFBvd2VyU2F2ZU1vZGUgPSBERVZJQ0VfUE9XRVJTQVZFX01PREVfQVNfUE1VX1NIVVRET1dOOwotCQkJcHNBZGFwdGVyLT5iRG9TdXNwZW5kID0gVFJVRTsKLQkJCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCJQTVUgc2VsZWN0ZWQgLi4uLiIpOwotCi0JCX0KLQkJZWxzZQotCQkjZW5kaWYKIAkJewogCQkJcHNBZGFwdGVyLT51bFBvd2VyU2F2ZU1vZGUgPSBERVZJQ0VfUE9XRVJTQVZFX01PREVfQVNfUE1VX0NMT0NLX0dBVElORzsKIAkJCXBzQWRhcHRlci0+YkRvU3VzcGVuZCA9RkFMU0U7Ci0JCQlCQ01fREVCVUdfUFJJTlQocHNBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwiUE1DIHNlbGVjdGVkLi4iKTsKIAogCQl9CiAKQEAgLTE1NDAsMTIgKzEzOTAsMTAgQEAKICNpZiAwCiBzdGF0aWMgdW5zaWduZWQgY2hhciAqUmVhZE1hY0FkZHJFRVBST00oUE1JTklfQURBUFRFUiBBZGFwdGVyLCB1bG9uZyBkd0FkZHJlc3MpCiB7Ci0JdW5zaWduZWQgY2hhciAqcHVjbWFjYWRkciA9IE5VTEw7Ci0JaW50IHN0YXR1cyA9IDAsIGk9MDsKLQl1bnNpZ25lZCBpbnQgdGVtcCA9MDsKKwlpbnQgc3RhdHVzID0gMCwgaSA9IDA7CisJdW5zaWduZWQgaW50IHRlbXAgPSAwOworCXVuc2lnbmVkIGNoYXIgKnB1Y21hY2FkZHIgPSBrbWFsbG9jKE1BQ19BRERSRVNTX1NJWkUsIEdGUF9LRVJORUwpOwogCi0KLQlwdWNtYWNhZGRyID0gKHVuc2lnbmVkIGNoYXIgKilrbWFsbG9jKE1BQ19BRERSRVNTX1NJWkUsIEdGUF9LRVJORUwpOwogCWlmKCFwdWNtYWNhZGRyKQogCXsKIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiTm8gQnVmZmVycyB0byBSZWFkIHRoZSBFRVBST00gQWRkcmVzc1xuIik7CkBAIC0xNTU4LDcgKzE0MDYsNyBAQAogCWlmKHN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykKIAl7CiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIndybSBGYWlsZWQuLlxuIik7Ci0JCWJjbV9rZnJlZShwdWNtYWNhZGRyKTsKKwkJa2ZyZWUocHVjbWFjYWRkcik7CiAJCXB1Y21hY2FkZHIgPSBOVUxMOwogCQlnb3RvIE9VVDsKIAl9CkBAIC0xNTY4LDcgKzE0MTYsNyBAQAogCQlpZihzdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpCiAJCXsKIAkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgInJkbSBGYWlsZWQuLlxuIik7Ci0JCQliY21fa2ZyZWUocHVjbWFjYWRkcik7CisJCQlrZnJlZShwdWNtYWNhZGRyKTsKIAkJCXB1Y21hY2FkZHIgPSBOVUxMOwogCQkJZ290byBPVVQ7CiAJCX0KQEAgLTE1ODAsNDMgKzE0MjgsNiBAQAogfQogI2VuZGlmCiAKLSNpZiAwCi1JTlQgUmVhZE1hY0FkZHJlc3NGcm9tRUVQUk9NKFBNSU5JX0FEQVBURVIgQWRhcHRlcikKLXsKLQl1bnNpZ25lZCBjaGFyICpwdU1hY0FkZHIgPSBOVUxMOwotCWludCBpID0wOwotCi0JcHVNYWNBZGRyID0gUmVhZE1hY0FkZHJFRVBST00oQWRhcHRlciwweDIwMCk7Ci0JaWYoIXB1TWFjQWRkcikKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBORVhUX1NFTkQsIERCR19MVkxfQUxMLCAiQ291bGRuJ3QgcmV0cmlldmUgdGhlIE1hYyBBZGRyZXNzXG4iKTsKLQkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOwotCX0KLQllbHNlCi0JewotCQlpZigocHVNYWNBZGRyWzBdID09IDB4MCAgJiYgcHVNYWNBZGRyWzFdID09IDB4MCAgJiYKLQkJCXB1TWFjQWRkclsyXSA9PSAweDAgICYmIHB1TWFjQWRkclszXSA9PSAweDAgICYmCi0JCQlwdU1hY0FkZHJbNF0gPT0gMHgwICAmJiBwdU1hY0FkZHJbNV0gPT0gMHgwKSB8fAotCQkgICAocHVNYWNBZGRyWzBdID09IDB4RkYgJiYgcHVNYWNBZGRyWzFdID09IDB4RkYgJiYKLQkJCXB1TWFjQWRkclsyXSA9PSAweEZGICYmIHB1TWFjQWRkclszXSA9PSAweEZGICYmCi0JCQlwdU1hY0FkZHJbNF0gPT0gMHhGRiAmJiBwdU1hY0FkZHJbNV0gPT0gMHhGRikpCi0JCXsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBORVhUX1NFTkQsIERCR19MVkxfQUxMLCAiSW52YWxpZCBNYWMgQWRkcmVzc1xuIik7Ci0JCQliY21fa2ZyZWUocHVNYWNBZGRyKTsKLQkJCXJldHVybiBTVEFUVVNfRkFJTFVSRTsKLQkJfQotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgTkVYVF9TRU5ELCBEQkdfTFZMX0FMTCwgIlRoZSBNYWMgQWRkcmVzcyByZWNlaXZlZCBpczogXG4iKTsKLQkJbWVtY3B5KEFkYXB0ZXItPmRldi0+ZGV2X2FkZHIsIHB1TWFjQWRkciwgTUFDX0FERFJFU1NfU0laRSk7Ci0gICAgICAgIGZvcihpPTA7aTxNQUNfQUREUkVTU19TSVpFO2krKykKLSAgICAgICAgewotICAgICAgICAgICAgQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCIlMDJ4ICIsIEFkYXB0ZXItPmRldi0+ZGV2X2FkZHJbaV0pOwotICAgICAgICB9Ci0gICAgICAgIEJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiXG4iKTsKLQkJYmNtX2tmcmVlKHB1TWFjQWRkcik7Ci0JfQotCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKLX0KLSNlbmRpZgogCiBzdGF0aWMgdm9pZCBjb252ZXJ0RW5kaWFuKEJfVUlOVDggcndGbGFnLCBQVUlOVCBwdWlCdWZmZXIsIFVJTlQgdWlCeXRlQ291bnQpCiB7CkBAIC0xNjQwLDgxICsxNDUxLDIxIEBACiB7CiAJSU5UIHVpUmV0VmFsID0wOwogCi0jaWZuZGVmIEJDTV9TSE1fSU5URVJGQUNFCiAJdWlSZXRWYWwgPSBBZGFwdGVyLT5pbnRlcmZhY2VfcmRtKEFkYXB0ZXItPnB2SW50ZXJmYWNlQWRhcHRlciwKIAkJCXVpQWRkcmVzcywgcHVjQnVmZiwgc1NpemUpOwogCiAJaWYodWlSZXRWYWwgPCAwKQogCQlyZXR1cm4gdWlSZXRWYWw7CiAKLSNlbHNlCi0JaW50IGluZHg7Ci0JdWlSZXRWYWwgPSBTVEFUVVNfU1VDQ0VTUzsKLQlpZih1aUFkZHJlc3MgJiAweDEwMDAwMDAwKSB7Ci0JCQkvLyBERFIgTWVtb3J5IEFjY2VzcwotCQl1aUFkZHJlc3MgfD0gQ0FDSEVfQUREUkVTU19NQVNLOwotCQltZW1jcHkocHVjQnVmZiwodW5zaWduZWQgY2hhciAqKXVpQWRkcmVzcyAsc1NpemUpOwotCX0KLQllbHNlIHsKLQkJLy8gUmVnaXN0ZXIsIFNQUkFNLCBGbGFzaAotCQl1aUFkZHJlc3MgfD0gVU5DQUNIRV9BRERSRVNTX01BU0s7Ci0gICAgaWYgKCh1aUFkZHJlc3MgJiBGTEFTSF9BRERSX01BU0spID09IChGTEFTSF9DT05USUdJT1VTX1NUQVJUX0FERFJfQkNTMzUwICYgRkxBU0hfQUREUl9NQVNLKSkKLQl7Ci0JCSNpZiBkZWZpbmVkKEZMQVNIX0RJUkVDVF9BQ0NFU1MpCi0gICAgICAgIAltZW1jcHkocHVjQnVmZiwodW5zaWduZWQgY2hhciAqKXVpQWRkcmVzcyAsc1NpemUpOwotCQkjZWxzZQotCQkJcHJpbnRrKCJcbkludmFsaWQgR1NQSSBBQ0NFU1MgOkFkZHIgOiUjWCIsIHVpQWRkcmVzcyk7Ci0JCQl1aVJldFZhbCA9IFNUQVRVU19GQUlMVVJFOwotCQkjZW5kaWYKLQl9Ci0gICAgZWxzZSBpZigoKHVuc2lnbmVkIGludCApdWlBZGRyZXNzICYgMHgzKSB8fAotCQkJKCh1bnNpZ25lZCBpbnQgKXB1Y0J1ZmYgJiAweDMpIHx8Ci0JCQkoKHVuc2lnbmVkIGludCApc1NpemUgJiAweDMpKSB7Ci0JCSAgCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwicmRtYWx0IDp1bmFsbGlnbmVkIHJlZ2lzdGVyIGFjY2VzcyB1aUFkZHJlc3MgPSAgJXgscHVjQnVmZiA9ICV4ICBzaXplID0gJXhcbiIsKHVuc2lnbmVkIGludCApdWlBZGRyZXNzLCh1bnNpZ25lZCBpbnQgKXB1Y0J1ZmYsKHVuc2lnbmVkIGludCApc1NpemUpOwotCQkJIHVpUmV0VmFsID0gU1RBVFVTX0ZBSUxVUkU7Ci0JCX0KLQkJZWxzZSB7Ci0JCSAJZm9yIChpbmR4PTA7aW5keDxzU2l6ZTtpbmR4Kz00KXsKLQkJICAgCQkqKFBVSU5UKShwdWNCdWZmICsgaW5keCkgPSAqKFBVSU5UKSh1aUFkZHJlc3MgKyBpbmR4KTsKLQkJICAJfQotCQl9Ci0JfQotI2VuZGlmCiAJcmV0dXJuIHVpUmV0VmFsOwogfQogaW50IHdybShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFVJTlQgdWlBZGRyZXNzLCBQQ0hBUiBwdWNCdWZmLCBzaXplX3Qgc1NpemUpCiB7CiAJaW50IGlSZXRWYWw7CiAKLSNpZm5kZWYgQkNNX1NITV9JTlRFUkZBQ0UKIAlpUmV0VmFsID0gQWRhcHRlci0+aW50ZXJmYWNlX3dybShBZGFwdGVyLT5wdkludGVyZmFjZUFkYXB0ZXIsCiAJCQl1aUFkZHJlc3MsIHB1Y0J1ZmYsIHNTaXplKTsKIAotI2Vsc2UKLQlpbnQgaW5keDsKLQlpZih1aUFkZHJlc3MgJiAweDEwMDAwMDAwKSB7Ci0JCS8vIEREUiBNZW1vcnkgQWNjZXNzCi0JCXVpQWRkcmVzcyB8PSBDQUNIRV9BRERSRVNTX01BU0s7Ci0JCW1lbWNweSgodW5zaWduZWQgY2hhciAqKSh1aUFkZHJlc3MpLHB1Y0J1ZmYsc1NpemUpOwotCX0KLQllbHNlIHsKLQkJLy8gUmVnaXN0ZXIsIFNQUkFNLCBGbGFzaAotCQl1aUFkZHJlc3MgfD0gVU5DQUNIRV9BRERSRVNTX01BU0s7Ci0KLQkJaWYoKCh1bnNpZ25lZCBpbnQgKXVpQWRkcmVzcyAmIDB4MykgfHwKLQkJCSgodW5zaWduZWQgaW50IClwdWNCdWZmICYgMHgzKSB8fAotCQkJKCh1bnNpZ25lZCBpbnQgKXNTaXplICYgMHgzKSkgewotCQkgIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJ3cm1hbHQ6IHVuYWxsaWduZWQgcmVnaXN0ZXIgYWNjZXNzIHVpQWRkcmVzcyA9ICAleCxwdWNCdWZmID0gJXggIHNpemUgPSAleFxuIiwodW5zaWduZWQgaW50ICl1aUFkZHJlc3MsKHVuc2lnbmVkIGludCApcHVjQnVmZiwodW5zaWduZWQgaW50IClzU2l6ZSk7Ci0JCQkgaVJldFZhbCA9IFNUQVRVU19GQUlMVVJFOwotCQl9Ci0JCWVsc2UgewotCQkgCWZvciAoaW5keD0wO2luZHg8c1NpemU7aW5keCs9NCkgewotCQkgIAkJKihQVUlOVCkodWlBZGRyZXNzICsgaW5keCkgPSAqKFBVSU5UKShwdWNCdWZmICsgaW5keCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JaVJldFZhbCA9IFNUQVRVU19TVUNDRVNTOwotI2VuZGlmCiAKIAlyZXR1cm4gaVJldFZhbDsKIH0KQEAgLTE3MzUsMjYgKzE0ODYsNyBAQAogCXJldHVybiB1aVJldFZhbDsKIH0KIAotaW50IHJkbVdpdGhMb2NrKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgVUlOVCB1aUFkZHJlc3MsIFBDSEFSIHB1Y0J1ZmYsIHNpemVfdCBzU2l6ZSkKLXsKIAotCUlOVCBzdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUyA7Ci0JZG93bigmQWRhcHRlci0+cmRtd3Jtc3luYyk7Ci0KLQlpZigoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKLQkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09VFJVRSkgfHwKLQkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT1UUlVFKSkKLQl7Ci0JCXN0YXR1cyA9IC1FQUNDRVM7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlzdGF0dXMgPSByZG0oQWRhcHRlciwgdWlBZGRyZXNzLCBwdWNCdWZmLCBzU2l6ZSk7Ci0KLWV4aXQ6Ci0JdXAoJkFkYXB0ZXItPnJkbXdybXN5bmMpOwotCXJldHVybiBzdGF0dXMgOwotfQogaW50IHdybVdpdGhMb2NrKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgVUlOVCB1aUFkZHJlc3MsIFBDSEFSIHB1Y0J1ZmYsIHNpemVfdCBzU2l6ZSkKIHsKIAlJTlQgc3RhdHVzID0gU1RBVFVTX1NVQ0NFU1MgOwpAQCAtMTkyMSwxMCArMTY1Myw4IEBACiAJCQlBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID0gVFJVRTsKIAkJCXVwKCZBZGFwdGVyLT5yZG13cm1zeW5jKTsKIAkJCS8vS2lsbGluZyBhbGwgVVJCUy4KLSNpZm5kZWYgQkNNX1NITV9JTlRFUkZBQ0UKIAkJCWlmKEFkYXB0ZXItPmJEb1N1c3BlbmQgPT0gVFJVRSkKIAkJCQlCY21fa2lsbF9hbGxfVVJCcygoUFNfSU5URVJGQUNFX0FEQVBURVIpKEFkYXB0ZXItPnB2SW50ZXJmYWNlQWRhcHRlcikpOwotI2VuZGlmCiAJCX0KIAkJZWxzZQogCQl7CkBAIC0xOTQzLDE0ICsxNjczLDEyIEBACiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTVBfU0hVVERPV04sIERCR19MVkxfQUxMLCJmYWlsIHRvIHNlbmQgdGhlIElkbGUgbW9kZSBSZXF1ZXN0IFxuIik7CiAJCUFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPSBGQUxTRTsKIAotI2lmbmRlZiBCQ01fU0hNX0lOVEVSRkFDRQogCQlTdGFydEludGVycnVwdFVyYigoUFNfSU5URVJGQUNFX0FEQVBURVIpKEFkYXB0ZXItPnB2SW50ZXJmYWNlQWRhcHRlcikpOwotI2VuZGlmCiAJfQogfQogCiAKLXZvaWQgSGFuZGxlU2h1dERvd25Nb2RlUmVxdWVzdChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsUFVDSEFSIHB1Y0J1ZmZlcikKK3N0YXRpYyB2b2lkIEhhbmRsZVNodXREb3duTW9kZVJlcXVlc3QoUE1JTklfQURBUFRFUiBBZGFwdGVyLFBVQ0hBUiBwdWNCdWZmZXIpCiB7CiAJQl9VSU5UMzIgdWlSZXNldFZhbHVlID0gMDsKIApAQCAtMjA3NywxMSArMTgwNSw3IEBACiAJaWYoIWF0b21pY19yZWFkICgmQWRhcHRlci0+dWlNQnVwZGF0ZSkpCiAJCXJldHVybjsKIAotI2lmZGVmIEJDTV9TSE1fSU5URVJGQUNFCi0JaWYocmRtYWx0KEFkYXB0ZXIsIFRBUkdFVF9TRklEX1RYREVTQ19NQVBfTE9DLCAoUFVJTlQpdWlidWZmLCBzaXplb2YoVUlOVCkgKiBNQVhfVEFSR0VUX0RTWF9CVUZGRVJTKTwwKQotI2Vsc2UKIAlpZihyZG1hbHRXaXRoTG9jayhBZGFwdGVyLCBUQVJHRVRfU0ZJRF9UWERFU0NfTUFQX0xPQywgKFBVSU5UKXVpYnVmZiwgc2l6ZW9mKFVJTlQpICogTUFYX1RBUkdFVF9EU1hfQlVGRkVSUyk8MCkKLSNlbmRpZgogCXsKIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAicmRtIGZhaWxlZFxuIik7CiAJCXJldHVybjsKQEAgLTIxMDcsOSArMTgzMSw3IEBACiB2b2lkIGZsdXNoX3F1ZXVlKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgVUlOVCBpUUluZGV4KQogewogCXN0cnVjdCBza19idWZmKiAJCQlQYWNrZXRUb0Ryb3A9TlVMTDsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyoJCW5ldHN0YXRzPU5VTEw7Ci0KLQluZXRzdGF0cyA9ICYoKFBMSU5VWF9ERVBfREFUQSlBZGFwdGVyLT5wdk9zRGVwRGF0YSktPm5ldHN0YXRzOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKgkJbmV0c3RhdHMgPSAmQWRhcHRlci0+ZGV2LT5zdGF0czsKIAogCXNwaW5fbG9ja19iaCgmQWRhcHRlci0+UGFja0luZm9baVFJbmRleF0uU0ZRdWV1ZUxvY2spOwogCkBAIC0yMTMwLDI1ICsxODUyLDIzIEBACiAJCQlBZGFwdGVyLT5QYWNrSW5mb1tpUUluZGV4XS51aURyb3BwZWRDb3VudEJ5dGVzICs9IFBhY2tldFRvRHJvcC0+bGVuOwogCQkJQWRhcHRlci0+UGFja0luZm9baVFJbmRleF0udWlEcm9wcGVkQ291bnRQYWNrZXRzKys7CiAKLQkJCWJjbV9rZnJlZV9za2IoUGFja2V0VG9Ecm9wKTsKKwkJCWRldl9rZnJlZV9za2IoUGFja2V0VG9Ecm9wKTsKIAkJCWF0b21pY19kZWMoJkFkYXB0ZXItPlRvdGFsUGFja2V0Q291bnQpOwotCQkJYXRvbWljX2luYygmQWRhcHRlci0+VHhEcm9wcGVkUGFja2V0Q291bnQpOwotCiAJCX0KIAl9CiAJc3Bpbl91bmxvY2tfYmgoJkFkYXB0ZXItPlBhY2tJbmZvW2lRSW5kZXhdLlNGUXVldWVMb2NrKTsKIAogfQogCi12b2lkIGJlY2VlbV9wcm90b2NvbF9yZXNldCAoUE1JTklfQURBUFRFUiBBZGFwdGVyKQorc3RhdGljIHZvaWQgYmVjZWVtX3Byb3RvY29sX3Jlc2V0IChQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCiB7Ci0JaW50IGkgPTA7CisJaW50IGk7CiAKLQlpZihOVUxMICE9IEFkYXB0ZXItPmRldikKLQl7Ci0JCW5ldGlmX2NhcnJpZXJfb2ZmKEFkYXB0ZXItPmRldik7Ci0JCW5ldGlmX3N0b3BfcXVldWUoQWRhcHRlci0+ZGV2KTsKLQl9CisJaWYgKG5ldGlmX21zZ19saW5rKEFkYXB0ZXIpKQorCQlwcl9ub3RpY2UoUEZYICIlczogcHJvdG9jb2wgcmVzZXRcbiIsIEFkYXB0ZXItPmRldi0+bmFtZSk7CisKKwluZXRpZl9jYXJyaWVyX29mZihBZGFwdGVyLT5kZXYpOworCW5ldGlmX3N0b3BfcXVldWUoQWRhcHRlci0+ZGV2KTsKIAogCUFkYXB0ZXItPklkbGVNb2RlID0gRkFMU0U7CiAJQWRhcHRlci0+TGlua1VwU3RhdHVzID0gRkFMU0U7CkBAIC0yMTY2LDc4ICsxODg2LDE4IEBACiAJCUFkYXB0ZXItPlRpbWVyQWN0aXZlID0gRkFMU0U7CiAKIAltZW1zZXQoQWRhcHRlci0+YXN0RnJhZ21lbnRlZFBrdENsYXNzaWZpZXJUYWJsZSwgMCwKLQkJCXNpemVvZihTX0ZSQUdNRU5URURfUEFDS0VUX0lORk8pICoKLQkJCU1BWF9GUkFHTUVOVEVESVBfQ0xBU1NJRklDQVRJT05fRU5UUklFUyk7CisJICAgICAgIHNpemVvZihTX0ZSQUdNRU5URURfUEFDS0VUX0lORk8pICogTUFYX0ZSQUdNRU5URURJUF9DTEFTU0lGSUNBVElPTl9FTlRSSUVTKTsKIAogCWZvcihpID0gMDtpPEhpUHJpb3JpdHk7aSsrKQogCXsKIAkJLy9yZXNldHRpbmcgb25seSB0aGUgZmlyc3Qgc2l6ZSAoU19NSUJTX1NFUlZJQ0VGTE9XX1RBQkxFKSBmb3IgdGhlIFNGLgogCQkvLyBJdCBpcyBzYW1lIGJldHdlZW4gTUlCcyBhbmQgU0YuCi0JCW1lbXNldCgoUFZPSUQpJkFkYXB0ZXItPlBhY2tJbmZvW2ldLDAsc2l6ZW9mKFNfTUlCU19TRVJWSUNFRkxPV19UQUJMRSkpOworCQltZW1zZXQoJkFkYXB0ZXItPlBhY2tJbmZvW2ldLnN0TWlic0V4dFNlcnZpY2VGbG93VGFibGUsCisJCSAgICAgICAwLCBzaXplb2YoU19NSUJTX0VYVFNFUlZJQ0VGTE9XX1BBUkFNRVRFUlMpKTsKIAl9CiB9CiAKIAogCi0jaWZkZWYgQkNNX1NITV9JTlRFUkZBQ0UKLQotCi0jZGVmaW5lIEdFVF9HVEJfRElGRihzdGFydCwgZW5kKSAgXAotKCAoc3RhcnQpIDwgKGVuZCkgKT8gKCAoZW5kKSAtIChzdGFydCkgKSA6ICggfjB4MCAtICggKHN0YXJ0KSAtIChlbmQpKSArMSApCi0KLXZvaWQgdXNkZWxheSAoIHVuc2lnbmVkIGludCBhKSB7Ci0JdW5zaWduZWQgaW50IHN0YXJ0PSAqKHVuc2lnbmVkIGludCAqKTB4YWY4MDUxYjQ7Ci0JdW5zaWduZWQgaW50IGVuZCAgPSBzdGFydCsxOwotCXVuc2lnbmVkIGludCBkaWZmID0gMDsKLQotCXdoaWxlKDEpIHsKLQkJZW5kID0gKih1bnNpZ25lZCBpbnQgKikweGFmODA1MWI0OwotCQlkaWZmID0gKEdFVF9HVEJfRElGRihzdGFydCxlbmQpKS84MDsKLQkJaWYgKGRpZmYgPj0gYSkKLQkJCWJyZWFrOwotCX0KLX0KLXZvaWQgcmVhZF9jZmdfZmlsZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpIHsKLQotCi0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJDb25maWcgRmlsZSBWZXJzaW9uID0gMHgleCBcbiIsQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMyQ2ZnVmVyc2lvbiApOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiQ2VudGVyIEZyZXF1ZW5jeSA9ICAweCV4IFxuIixBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJDZW50ZXJGcmVxdWVuY3kgKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkJhbmQgQSBTY2FuID0gMHgleCBcbiIsQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMyQmFuZEFTY2FuICk7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJCYW5kIEIgU2NhbiA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMkJhbmRCU2NhbiApOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiQmFuZCBDIFNjYW4gPSAweCV4IFxuIixBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJCYW5kQ1NjYW4gKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkVSVFBTIE9wdGlvbnMgPSAweCV4IFxuIixBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJFcnRwc09wdGlvbnMgKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIlBIUyBFbmFibGUgPSAweCV4IFxuIixBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJQSFNFbmFibGUgKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkhhbmRvZmYgRW5hYmxlID0gMHgleCBcbiIsQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMySG9FbmFibGUgKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkhPIFJlc2VydmVkMSA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMkhvUmVzZXJ2ZWQxICk7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJITyBSZXNlcnZlZDIgPSAweCV4IFxuIixBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJIb1Jlc2VydmVkMiApOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiTUlNTyBFbmFibGUgPSAweCV4IFxuIixBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJNaW1vRW5hYmxlICk7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJQS012MiBFbmFibGUgPSAweCV4IFxuIixBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJTZWN1cml0eUVuYWJsZSApOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiUG93ZXJzYXZpbmcgTW9kZXMgRW5hYmxlID0gMHgleCBcbiIsQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMyUG93ZXJTYXZpbmdNb2Rlc0VuYWJsZSApOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiUG93ZXIgU2F2aW5nIE1vZGUgT3B0aW9ucyA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMlBvd2VyU2F2aW5nTW9kZU9wdGlvbnMgKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkFSUSBFbmFibGUgPSAweCV4IFxuIixBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJBcnFFbmFibGUgKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkhhcnEgRW5hYmxlID0gMHgleCBcbiIsQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMySGFycUVuYWJsZSApOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiRUVQUk9NIEZsYWcgPSAweCV4IFxuIixBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJFRVBST01GbGFnICk7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJDdXN0b21pemUgPSAweCV4IFxuIixBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJDdXN0b21pemUgKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkJhbmR3aWR0aCA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMkNvbmZpZ0JXICk7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJTaHV0RG93biBUaW1lciBWYWx1ZSA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMlNodXREb3duSW5pdFRocmVzaG9sZFRpbWVyICk7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJSYWRpb1BhcmFtZXRlciA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMlJhZGlvUGFyYW1ldGVyICk7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJQaHlQYXJhbWV0ZXIxID0gMHgleCBcbiIsQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMyUGh5UGFyYW1ldGVyMSApOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiUGh5UGFyYW1ldGVyMiA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMlBoeVBhcmFtZXRlcjIgKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIlBoeVBhcmFtZXRlcjMgPSAweCV4IFxuIixBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJQaHlQYXJhbWV0ZXIzICk7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJtX3UzMlRlc3RPcHRpb25zID0gMHgleCBcbiIsQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMyVGVzdE9wdGlvbnMgKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIk1heE1BQ0RhdGFwZXJETEZyYW1lID0gMHgleCBcbiIsQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMyTWF4TUFDRGF0YXBlckRMRnJhbWUgKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIk1heE1BQ0RhdGFwZXJVTEZyYW1lID0gMHgleCBcbiIsQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMyTWF4TUFDRGF0YXBlclVMRnJhbWUgKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkNvcnIyTWFjRmxhZ3MgPSAweCV4IFxuIixBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJDb3JyMk1hY0ZsYWdzICk7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJIb3N0RHJ2ckNvbmZpZzEgPSAweCV4IFxuIixBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+SG9zdERydnJDb25maWcxICk7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJIb3N0RHJ2ckNvbmZpZzIgPSAweCV4IFxuIixBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+SG9zdERydnJDb25maWcyICk7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJIb3N0RHJ2ckNvbmZpZzMgPSAweCV4IFxuIixBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+SG9zdERydnJDb25maWczICk7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJIb3N0RHJ2ckNvbmZpZzQgPSAweCV4IFxuIixBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+SG9zdERydnJDb25maWc0ICk7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJIb3N0RHJ2ckNvbmZpZzUgPSAweCV4IFxuIixBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+SG9zdERydnJDb25maWc1ICk7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJIb3N0RHJ2ckNvbmZpZzYgPSAweCV4IFxuIixBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+SG9zdERydnJDb25maWc2ICk7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJTZWdtZW50ZWQgUFVTQyBFbmFibGUgPSAweCV4IFxuIixBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJTZWdtZW50ZWRQVVNDZW5hYmxlICk7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJCYW1jRW5hYmxlID0gMHgleCBcbiIsQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMyQmFuZEFNQ0VuYWJsZSApOwotfQotCi0jZW5kaWYKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL09zYWxfTWlzYy5jIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9Pc2FsX01pc2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVlZmQyMC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL09zYWxfTWlzYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotCS8qKysKLQotCUNvcHlyaWdodCAoYykgQmVjZWVtIENvbW11bmljYXRpb25zIEluYy4KLQotCU1vZHVsZSBOYW1lOgotCQlXSU5fTWlzYy5jCi0KLQlBYnN0cmFjdDoKLQkJSW1wbGVtZW50cyB0aGUgTWlzY2VsYW5uZW91cyBPUyBDb25zdHJ1dHMKLQkJCUxpbmtlZCBMaXN0cwotCQkJRGlzcGF0Y2hlciBPYmplY3RzKEV2ZW50cyxTZW1hcGhvcmVzLFNwaW4gTG9ja3MgYW5kIHRoZSBsaWtlKQotCQkJRmlsZXMKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JCVdobyAgICAgICAgIFdoZW4gICAgICAgIFdoYXQKLQkJLS0tLS0tLS0gICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQlOYW1lCQlEYXRlCQlDcmVhdGVkL3Jldmlld2VkL21vZGlmaWVkCi0JCVJhamVldgkJMjQvMS8wOAkJQ3JlYXRlZAotCU5vdGVzOgotCi0JLS0qLwotI2luY2x1ZGUgImhlYWRlcnMuaCIKLQotYm9vbCBPc2FsTWVtQ29tcGFyZSh2b2lkICpkZXN0LCB2b2lkICpzcmMsIFVJTlQgbGVuKQotewotCXJldHVybiAobWVtY21wKHNyYywgZGVzdCwgbGVuKSk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL1BIU01vZHVsZS5jIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9QSFNNb2R1bGUuYwppbmRleCA4YTM4Y2Y0Li5kMWNhMTkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL1BIU01vZHVsZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vUEhTTW9kdWxlLmMKQEAgLTEsMTAgKzEsNTQgQEAKICNpbmNsdWRlICJoZWFkZXJzLmgiCiAKK3N0YXRpYyBVSU5UIENyZWF0ZVNGVG9DbGFzc2lmaWVyUnVsZU1hcHBpbmcoQl9VSU5UMTYgdWlWY2lkLEJfVUlOVDE2ICB1aUNsc0lkLFNfU0VSVklDRUZMT1dfVEFCTEUgKnBzU2VydmljZUZsb3dUYWJsZSxTX1BIU19SVUxFICpwc1Boc1J1bGUsQl9VSU5UOCB1OEFzc29jaWF0ZWRQSFNJKTsKKworc3RhdGljIFVJTlQgQ3JlYXRlQ2xhc3NpZmVyVG9QSFNSdWxlTWFwcGluZyhCX1VJTlQxNiB1aVZjaWQsQl9VSU5UMTYgIHVpQ2xzSWQsU19TRVJWSUNFRkxPV19FTlRSWSAqcHN0U2VydmljZUZsb3dFbnRyeSxTX1BIU19SVUxFICpwc1Boc1J1bGUsQl9VSU5UOCB1OEFzc29jaWF0ZWRQSFNJKTsKKworc3RhdGljIFVJTlQgQ3JlYXRlQ2xhc3NpZmllclBIU1J1bGUoQl9VSU5UMTYgIHVpQ2xzSWQsU19DTEFTU0lGSUVSX1RBQkxFICpwc2FDbGFzc2lmaWVydGFibGUgLFNfUEhTX1JVTEUgKnBzUGhzUnVsZSxFX0NMQVNTSUZJRVJfRU5UUllfQ09OVEVYVCBlQ2xzQ29udGV4dCxCX1VJTlQ4IHU4QXNzb2NpYXRlZFBIU0kpOworCitzdGF0aWMgVUlOVCBVcGRhdGVDbGFzc2lmaWVyUEhTUnVsZShCX1VJTlQxNiAgdWlDbHNJZCxTX0NMQVNTSUZJRVJfRU5UUlkgKnBzdENsYXNzaWZpZXJFbnRyeSxTX0NMQVNTSUZJRVJfVEFCTEUgKnBzYUNsYXNzaWZpZXJ0YWJsZSAsU19QSFNfUlVMRSAqcHNQaHNSdWxlLEJfVUlOVDggdThBc3NvY2lhdGVkUEhTSSk7CisKK3N0YXRpYyBCT09MRUFOIFZhbGlkYXRlUEhTUnVsZUNvbXBsZXRlKFNfUEhTX1JVTEUgKnBzUGhzUnVsZSk7CisKK3N0YXRpYyBCT09MRUFOIERlcmVmUGhzUnVsZShCX1VJTlQxNiAgdWlDbHNJZCxTX0NMQVNTSUZJRVJfVEFCTEUgKnBzYUNsYXNzaWZpZXJ0YWJsZSxTX1BIU19SVUxFICpwc3RQaHNSdWxlKTsKKworc3RhdGljIFVJTlQgR2V0Q2xhc3NpZmllckVudHJ5KFNfQ0xBU1NJRklFUl9UQUJMRSAqcHN0Q2xhc3NpZmllclRhYmxlLEJfVUlOVDMyIHVpQ2xzaWQsRV9DTEFTU0lGSUVSX0VOVFJZX0NPTlRFWFQgZUNsc0NvbnRleHQsIFNfQ0xBU1NJRklFUl9FTlRSWSAqKnBwc3RDbGFzc2lmaWVyRW50cnkpOworCitzdGF0aWMgVUlOVCBHZXRQaHNSdWxlRW50cnkoU19DTEFTU0lGSUVSX1RBQkxFICpwc3RDbGFzc2lmaWVyVGFibGUsQl9VSU5UMzIgdWlQSFNJLEVfQ0xBU1NJRklFUl9FTlRSWV9DT05URVhUIGVDbHNDb250ZXh0LFNfUEhTX1JVTEUgKipwcHN0UGhzUnVsZSk7CisKK3N0YXRpYyB2b2lkIGZyZWVfcGhzX3NlcnZpY2VmbG93X3J1bGVzKFNfU0VSVklDRUZMT1dfVEFCTEUgKnBzU2VydmljZUZsb3dSdWxlc1RhYmxlKTsKKworc3RhdGljIGludCBwaHNfY29tcHJlc3MoU19QSFNfUlVMRSAgICpwaHNfbWVtYmVycyx1bnNpZ25lZCBjaGFyICppbl9idWYsCisJCQkJCQl1bnNpZ25lZCBjaGFyICpvdXRfYnVmLHVuc2lnbmVkIGludCAqaGVhZGVyX3NpemUsVUlOVCAqbmV3X2hlYWRlcl9zaXplICk7CisKKworc3RhdGljIGludCB2ZXJpZnlfc3VwcHJlc3NfcGhzZih1bnNpZ25lZCBjaGFyICppbl9idWZmZXIsdW5zaWduZWQgY2hhciAqb3V0X2J1ZmZlciwKKwkJCQkJCQkJdW5zaWduZWQgY2hhciAqcGhzZix1bnNpZ25lZCBjaGFyICpwaHNtLHVuc2lnbmVkIGludCBwaHNzLHVuc2lnbmVkIGludCBwaHN2LFVJTlQgKm5ld19oZWFkZXJfc2l6ZSApOworCitzdGF0aWMgaW50IHBoc19kZWNvbXByZXNzKHVuc2lnbmVkIGNoYXIgKmluX2J1Zix1bnNpZ25lZCBjaGFyICpvdXRfYnVmLFwKKwkJCQkJCSAgU19QSFNfUlVMRSAgICpwaHNfcnVsZXMsVUlOVCAqaGVhZGVyX3NpemUpOworCisKK3N0YXRpYyBVTE9ORyBQaHNDb21wcmVzcyh2b2lkKiBwdkNvbnRleHQsCisJCQkJICBCX1VJTlQxNiB1aVZjaWQsCisJCQkJICBCX1VJTlQxNiB1aUNsc0lkLAorCQkJCSAgdm9pZCAqcHZJbnB1dEJ1ZmZlciwKKwkJCQkgIHZvaWQgKnB2T3V0cHV0QnVmZmVyLAorCQkJCSAgVUlOVCAqcE9sZEhlYWRlclNpemUsCisJCQkJICBVSU5UICpwTmV3SGVhZGVyU2l6ZSApOworCitzdGF0aWMgVUxPTkcgUGhzRGVDb21wcmVzcyh2b2lkKiBwdkNvbnRleHQsCisJCQkJICBCX1VJTlQxNiB1aVZjaWQsCisJCQkJICB2b2lkICpwdklucHV0QnVmZmVyLAorCQkJCSAgdm9pZCAqcHZPdXRwdXRCdWZmZXIsCisJCQkJICBVSU5UICpwSW5IZWFkZXJTaXplLAorCQkJCSAgVUlOVCAqcE91dEhlYWRlclNpemUpOworCisKKwogI2RlZmluZSBJTgogI2RlZmluZSBPVVQKIAotdm9pZCBEdW1wRGF0YVBhY2tldEhlYWRlcihQVUNIQVIgcFBrdCk7Ci0KIC8qCiBGdW5jdGlvbjoJCQkJUEhTVHJhbnNtaXQKIApAQCAtODEsOCArMTI1LDYgQEAKIAl7CiAKIAotCQkvL0R1bXBEYXRhUGFja2V0SGVhZGVyKHB1Y1BIU1BrdEhkckluQnVmKTsKLQogCQkvLyBTdGVwIDIgU3VwcmVzcyBIZWFkZXIgdXNpbmcgUEhTIGFuZCBmaWxsIGludG8gaW50ZXJtZWRpYXRlIHVjYVBIU1BrdEhkck91dEJ1Zi4KIAkvLyBTdXBwcmVzcyBvbmx5IGlmIElQIEhlYWRlciBhbmQgUEhTIEVuYWJsZWQgRm9yIHRoZSBTZXJ2aWNlIEZsb3cKIAkJaWYoKCh1c1BhY2tldFR5cGUgPT0gRVRIRVJORVRfRlJBTUVUWVBFX0lQVjQpIHx8CkBAIC0xMjAsMTUgKzE2MiwxNSBAQAogCQkJCQkJaWYobmV3UGFja2V0ID09IE5VTEwpCiAJCQkJCQkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOwogCi0JCQkJCQliY21fa2ZyZWVfc2tiKFBhY2tldCk7CisJCQkJCQlkZXZfa2ZyZWVfc2tiKFBhY2tldCk7CiAJCQkJCQkqcFBhY2tldCA9IFBhY2tldCA9IG5ld1BhY2tldDsKIAkJCQkJCXB1Y1BIU1BrdEhkckluQnVmID0gUGFja2V0LT5kYXRhICArIEJ5dGVzVG9SZW1vdmU7CiAJCQkJCX0KIAogCQkJCQludW1CeXRlc0NvbXByZXNzZWQgPSB1blBoc09sZEhkclNpemUgLSAodW5QSFNOZXdQa3RIZWFkZXJMZW4rUEhTSV9MRU4pOwogCi0JCQkJCU9zYWxNZW1Nb3ZlKHB1Y1BIU1BrdEhkckluQnVmICsgbnVtQnl0ZXNDb21wcmVzc2VkLCBwdWNQSFNQa3RIZHJPdXRCdWYsIHVuUEhTTmV3UGt0SGVhZGVyTGVuICsgUEhTSV9MRU4pOwotCQkJCQlPc2FsTWVtTW92ZShQYWNrZXQtPmRhdGEgKyBudW1CeXRlc0NvbXByZXNzZWQsIFBhY2tldC0+ZGF0YSwgQnl0ZXNUb1JlbW92ZSk7CisJCQkJCW1lbWNweShwdWNQSFNQa3RIZHJJbkJ1ZiArIG51bUJ5dGVzQ29tcHJlc3NlZCwgcHVjUEhTUGt0SGRyT3V0QnVmLCB1blBIU05ld1BrdEhlYWRlckxlbiArIFBIU0lfTEVOKTsKKwkJCQkJbWVtY3B5KFBhY2tldC0+ZGF0YSArIG51bUJ5dGVzQ29tcHJlc3NlZCwgUGFja2V0LT5kYXRhLCBCeXRlc1RvUmVtb3ZlKTsKIAkJCQkJc2tiX3B1bGwoUGFja2V0LCBudW1CeXRlc0NvbXByZXNzZWQpOwogCiAJCQkJCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKQEAgLTIyMywyMyArMjY1LDEyIEBACiAJCQl9CiAJCX0KIAotCQlPc2FsTWVtTW92ZShwYWNrZXQtPmRhdGEsIEFkYXB0ZXItPnVjYVBIU1BrdFJlc3RvcmVCdWYsIG5TdGFuZGFyZFBrdEhkckxlbik7CisJCW1lbWNweShwYWNrZXQtPmRhdGEsIEFkYXB0ZXItPnVjYVBIU1BrdFJlc3RvcmVCdWYsIG5TdGFuZGFyZFBrdEhkckxlbik7CiAJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQogCi12b2lkIER1bXBEYXRhUGFja2V0SGVhZGVyKFBVQ0hBUiBwUGt0KQotewotCXN0cnVjdCBpcGhkciAqaXBoZCA9IChzdHJ1Y3QgaXBoZHIqKXBQa3Q7Ci0gICAgUE1JTklfQURBUFRFUiBBZGFwdGVyID0gR0VUX0JDTV9BREFQVEVSKGdibHBuZXRkZXYpOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgUEhTX1NFTkQsIERCR19MVkxfQUxMLCJQaHMgU2VuZC9SZWNpZXZlIDogSVAgUGFja2V0IEhkciBcbiIpOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgUEhTX1NFTkQsIERCR19MVkxfQUxMLCJUT1MgOiAleCBcbiIsaXBoZC0+dG9zKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIFBIU19TRU5ELCBEQkdfTFZMX0FMTCwiU3JjICBJUCA6ICV4IFxuIixpcGhkLT5zYWRkcik7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBQSFNfU0VORCwgREJHX0xWTF9BTEwsIkRlc3QgSVAgOiAleCBcbiBcbiIsaXBoZC0+ZGFkZHIpOwotCi19Ci0KIHZvaWQgRHVtcEZ1bGxQYWNrZXQoVUNIQVIgKnBCdWYsVUlOVCBuUGt0TGVuKQogewogCVBNSU5JX0FEQVBURVIgQWRhcHRlciA9IEdFVF9CQ01fQURBUFRFUihnYmxwbmV0ZGV2KTsKQEAgLTI3MCwxNSArMzAxLDkgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlwUGhzZGV2aWNlRXh0ZW5zaW9uLT5wc3RTZXJ2aWNlRmxvd1Boc1J1bGVzVGFibGUgPQotICAgICAgKFNfU0VSVklDRUZMT1dfVEFCTEUqKU9zYWxNZW1BbGxvYyhzaXplb2YoU19TRVJWSUNFRkxPV19UQUJMRSksCi0gICAgICAgICAgICBQSFNfTUVNX1RBRyk7CisJCWt6YWxsb2Moc2l6ZW9mKFNfU0VSVklDRUZMT1dfVEFCTEUpLCBHRlBfS0VSTkVMKTsKIAotICAgIGlmKHBQaHNkZXZpY2VFeHRlbnNpb24tPnBzdFNlcnZpY2VGbG93UGhzUnVsZXNUYWJsZSkKLQl7Ci0JCU9zYWxaZXJvTWVtb3J5KHBQaHNkZXZpY2VFeHRlbnNpb24tPnBzdFNlcnZpY2VGbG93UGhzUnVsZXNUYWJsZSwKLSAgICAgICAgICAgICAgc2l6ZW9mKFNfU0VSVklDRUZMT1dfVEFCTEUpKTsKLQl9Ci0JZWxzZQorICAgIGlmKCFwUGhzZGV2aWNlRXh0ZW5zaW9uLT5wc3RTZXJ2aWNlRmxvd1Boc1J1bGVzVGFibGUpCiAJewogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIFBIU19ESVNQQVRDSCwgREJHX0xWTF9BTEwsICJcbkFsbG9jYXRpb24gU2VydmljZUZsb3dQaHNSdWxlc1RhYmxlIGZhaWxlZCIpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTI4OCwxNCArMzEzLDggQEAKIAlmb3IoaT0wO2k8TUFYX1NFUlZJQ0VGTE9XUztpKyspCiAJewogCQlTX1NFUlZJQ0VGTE9XX0VOVFJZIHNTZXJ2aWNlRmxvdyA9IHBzdFNlcnZpY2VGbG93VGFibGUtPnN0U0ZMaXN0W2ldOwotCQlzU2VydmljZUZsb3cucHN0Q2xhc3NpZmllclRhYmxlID0gKFNfQ0xBU1NJRklFUl9UQUJMRSopT3NhbE1lbUFsbG9jKAotICAgICAgICAgICAgc2l6ZW9mKFNfQ0xBU1NJRklFUl9UQUJMRSksIFBIU19NRU1fVEFHKTsKLQkJaWYoc1NlcnZpY2VGbG93LnBzdENsYXNzaWZpZXJUYWJsZSkKLQkJewotCQkJT3NhbFplcm9NZW1vcnkoc1NlcnZpY2VGbG93LnBzdENsYXNzaWZpZXJUYWJsZSxzaXplb2YoU19DTEFTU0lGSUVSX1RBQkxFKSk7Ci0JCQlwc3RTZXJ2aWNlRmxvd1RhYmxlLT5zdFNGTGlzdFtpXS5wc3RDbGFzc2lmaWVyVGFibGUgPSBzU2VydmljZUZsb3cucHN0Q2xhc3NpZmllclRhYmxlOwotICAgIAl9Ci0JCWVsc2UKKwkJc1NlcnZpY2VGbG93LnBzdENsYXNzaWZpZXJUYWJsZSA9IGt6YWxsb2Moc2l6ZW9mKFNfQ0xBU1NJRklFUl9UQUJMRSksIEdGUF9LRVJORUwpOworCQlpZighc1NlcnZpY2VGbG93LnBzdENsYXNzaWZpZXJUYWJsZSkKIAkJewogCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBQSFNfRElTUEFUQ0gsIERCR19MVkxfQUxMLCAiXG5BbGxvY2F0aW9uIGZhaWxlZCIpOwogCQkJZnJlZV9waHNfc2VydmljZWZsb3dfcnVsZXMocFBoc2RldmljZUV4dGVuc2lvbi0+CkBAIC0zMDUsOSArMzI0LDcgQEAKIAkJfQogCX0KIAotCi0JcFBoc2RldmljZUV4dGVuc2lvbi0+Q29tcHJlc3NlZFR4QnVmZmVyID0KLSAgICAgICAgICBPc2FsTWVtQWxsb2MoUEhTX0JVRkZFUl9TSVpFLFBIU19NRU1fVEFHKTsKKwlwUGhzZGV2aWNlRXh0ZW5zaW9uLT5Db21wcmVzc2VkVHhCdWZmZXIgPSBrbWFsbG9jKFBIU19CVUZGRVJfU0laRSwgR0ZQX0tFUk5FTCk7CiAKICAgICBpZihwUGhzZGV2aWNlRXh0ZW5zaW9uLT5Db21wcmVzc2VkVHhCdWZmZXIgPT0gTlVMTCkKIAl7CkBAIC0zMTcsMTIgKzMzNCwxMSBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlwUGhzZGV2aWNlRXh0ZW5zaW9uLT5VbkNvbXByZXNzZWRSeEJ1ZmZlciA9Ci0gICAgICBPc2FsTWVtQWxsb2MoUEhTX0JVRkZFUl9TSVpFLFBIU19NRU1fVEFHKTsKKyAgICBwUGhzZGV2aWNlRXh0ZW5zaW9uLT5VbkNvbXByZXNzZWRSeEJ1ZmZlciA9IGttYWxsb2MoUEhTX0JVRkZFUl9TSVpFLCBHRlBfS0VSTkVMKTsKIAlpZihwUGhzZGV2aWNlRXh0ZW5zaW9uLT5VbkNvbXByZXNzZWRSeEJ1ZmZlciA9PSBOVUxMKQogCXsKIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBQSFNfRElTUEFUQ0gsIERCR19MVkxfQUxMLCAiXG5BbGxvY2F0aW9uIGZhaWxlZCIpOwotCQlPc2FsTWVtRnJlZShwUGhzZGV2aWNlRXh0ZW5zaW9uLT5Db21wcmVzc2VkVHhCdWZmZXIsUEhTX0JVRkZFUl9TSVpFKTsKKwkJa2ZyZWUocFBoc2RldmljZUV4dGVuc2lvbi0+Q29tcHJlc3NlZFR4QnVmZmVyKTsKIAkJZnJlZV9waHNfc2VydmljZWZsb3dfcnVsZXMocFBoc2RldmljZUV4dGVuc2lvbi0+cHN0U2VydmljZUZsb3dQaHNSdWxlc1RhYmxlKTsKIAkJcFBoc2RldmljZUV4dGVuc2lvbi0+cHN0U2VydmljZUZsb3dQaHNSdWxlc1RhYmxlID0gTlVMTDsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0zNDMsMTYgKzM1OSwxMSBAQAogCQlwUEhTRGV2aWNlRXh0LT5wc3RTZXJ2aWNlRmxvd1Boc1J1bGVzVGFibGUgPSBOVUxMOwogCX0KIAotCWlmKHBQSFNEZXZpY2VFeHQtPkNvbXByZXNzZWRUeEJ1ZmZlcikKLQl7Ci0JCU9zYWxNZW1GcmVlKHBQSFNEZXZpY2VFeHQtPkNvbXByZXNzZWRUeEJ1ZmZlcixQSFNfQlVGRkVSX1NJWkUpOwotCQlwUEhTRGV2aWNlRXh0LT5Db21wcmVzc2VkVHhCdWZmZXIgPSBOVUxMOwotCX0KLQlpZihwUEhTRGV2aWNlRXh0LT5VbkNvbXByZXNzZWRSeEJ1ZmZlcikKLQl7Ci0JCU9zYWxNZW1GcmVlKHBQSFNEZXZpY2VFeHQtPlVuQ29tcHJlc3NlZFJ4QnVmZmVyLFBIU19CVUZGRVJfU0laRSk7Ci0JCXBQSFNEZXZpY2VFeHQtPlVuQ29tcHJlc3NlZFJ4QnVmZmVyID0gTlVMTDsKLQl9CisJa2ZyZWUocFBIU0RldmljZUV4dC0+Q29tcHJlc3NlZFR4QnVmZmVyKTsKKwlwUEhTRGV2aWNlRXh0LT5Db21wcmVzc2VkVHhCdWZmZXIgPSBOVUxMOworCisJa2ZyZWUocFBIU0RldmljZUV4dC0+VW5Db21wcmVzc2VkUnhCdWZmZXIpOworCXBQSFNEZXZpY2VFeHQtPlVuQ29tcHJlc3NlZFJ4QnVmZmVyID0gTlVMTDsKIAogCXJldHVybiAwOwogfQpAQCAtNDc4LDIwICs0ODksMTIgQEAKIAkJCXsKIAkJCQlpZihwc3RDbGFzc2lmaWVyUnVsZXNUYWJsZS0+c3RBY3RpdmVQaHNSdWxlc0xpc3RbbkNsc2lkSW5kZXhdLmJVc2VkICYmIHBzdENsYXNzaWZpZXJSdWxlc1RhYmxlLT5zdEFjdGl2ZVBoc1J1bGVzTGlzdFtuQ2xzaWRJbmRleF0ucHN0UGhzUnVsZSkKIAkJCQl7Ci0JCQkJCWlmKHBzdENsYXNzaWZpZXJSdWxlc1RhYmxlLT5zdEFjdGl2ZVBoc1J1bGVzTGlzdFtuQ2xzaWRJbmRleF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHN0UGhzUnVsZS0+dThQSFNJID09IHU4UEhTSSkKLQkJCQkJewotCQkJCQkJaWYocHN0Q2xhc3NpZmllclJ1bGVzVGFibGUtPnN0QWN0aXZlUGhzUnVsZXNMaXN0W25DbHNpZEluZGV4XS5wc3RQaHNSdWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnU4UmVmQ250KQotCQkJCQkJCXBzdENsYXNzaWZpZXJSdWxlc1RhYmxlLT5zdEFjdGl2ZVBoc1J1bGVzTGlzdFtuQ2xzaWRJbmRleF0ucHN0UGhzUnVsZQotCQkJCQkJICAgICAgICAgIC0+dThSZWZDbnQtLTsKLQkJCQkJCWlmKDAgPT0gcHN0Q2xhc3NpZmllclJ1bGVzVGFibGUtPnN0QWN0aXZlUGhzUnVsZXNMaXN0W25DbHNpZEluZGV4XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wc3RQaHNSdWxlLT51OFJlZkNudCkKLQkJCQkJCQlPc2FsTWVtRnJlZShwc3RDbGFzc2lmaWVyUnVsZXNUYWJsZQotCQkJCQkJICAgIC0+c3RBY3RpdmVQaHNSdWxlc0xpc3RbbkNsc2lkSW5kZXhdLnBzdFBoc1J1bGUsCi0JCQkJCQkgICAgICBzaXplb2YoU19QSFNfUlVMRSkpOwotCQkJCQkJT3NhbFplcm9NZW1vcnkoJnBzdENsYXNzaWZpZXJSdWxlc1RhYmxlCi0JCQkJCQkJLT5zdEFjdGl2ZVBoc1J1bGVzTGlzdFtuQ2xzaWRJbmRleF0sCisJCQkJCWlmKHBzdENsYXNzaWZpZXJSdWxlc1RhYmxlLT5zdEFjdGl2ZVBoc1J1bGVzTGlzdFtuQ2xzaWRJbmRleF0ucHN0UGhzUnVsZS0+dThQSFNJID09IHU4UEhTSSkJCQkJCXsKKwkJCQkJCWlmKHBzdENsYXNzaWZpZXJSdWxlc1RhYmxlLT5zdEFjdGl2ZVBoc1J1bGVzTGlzdFtuQ2xzaWRJbmRleF0ucHN0UGhzUnVsZS0+dThSZWZDbnQpCisJCQkJCQkJcHN0Q2xhc3NpZmllclJ1bGVzVGFibGUtPnN0QWN0aXZlUGhzUnVsZXNMaXN0W25DbHNpZEluZGV4XS5wc3RQaHNSdWxlLT51OFJlZkNudC0tOworCQkJCQkJaWYoMCA9PSBwc3RDbGFzc2lmaWVyUnVsZXNUYWJsZS0+c3RBY3RpdmVQaHNSdWxlc0xpc3RbbkNsc2lkSW5kZXhdLnBzdFBoc1J1bGUtPnU4UmVmQ250KQorCQkJCQkJCWtmcmVlKHBzdENsYXNzaWZpZXJSdWxlc1RhYmxlLT5zdEFjdGl2ZVBoc1J1bGVzTGlzdFtuQ2xzaWRJbmRleF0ucHN0UGhzUnVsZSk7CisJCQkJCQltZW1zZXQoJnBzdENsYXNzaWZpZXJSdWxlc1RhYmxlLT5zdEFjdGl2ZVBoc1J1bGVzTGlzdFtuQ2xzaWRJbmRleF0sIDAsCiAJCQkJCQkJc2l6ZW9mKFNfQ0xBU1NJRklFUl9FTlRSWSkpOwogCQkJCQl9CiAJCQkJfQpAQCAtNTQ4LDEwICs1NTEsMTAgQEAKIAkJCQlpZihwc3RDbGFzc2lmaWVyRW50cnktPnBzdFBoc1J1bGUtPnU4UmVmQ250KQogCQkJCXBzdENsYXNzaWZpZXJFbnRyeS0+cHN0UGhzUnVsZS0+dThSZWZDbnQtLTsKIAkJCQlpZigwPT1wc3RDbGFzc2lmaWVyRW50cnktPnBzdFBoc1J1bGUtPnU4UmVmQ250KQotCQkJCU9zYWxNZW1GcmVlKHBzdENsYXNzaWZpZXJFbnRyeS0+cHN0UGhzUnVsZSxzaXplb2YoU19QSFNfUlVMRSkpOworCQkJCQlrZnJlZShwc3RDbGFzc2lmaWVyRW50cnktPnBzdFBoc1J1bGUpOwogCiAJCQl9Ci0JCQlPc2FsWmVyb01lbW9yeShwc3RDbGFzc2lmaWVyRW50cnksc2l6ZW9mKFNfQ0xBU1NJRklFUl9FTlRSWSkpOworCQkJbWVtc2V0KHBzdENsYXNzaWZpZXJFbnRyeSwgMCwgc2l6ZW9mKFNfQ0xBU1NJRklFUl9FTlRSWSkpOwogCQl9CiAKIAkJbkNsc2lkSW5kZXggPSBHZXRDbGFzc2lmaWVyRW50cnkocHN0U2VydmljZUZsb3dFbnRyeS0+cHN0Q2xhc3NpZmllclRhYmxlLApAQCAtNTU5LDEwICs1NjIsOCBAQAogCiAJICAgaWYoKG5DbHNpZEluZGV4ICE9IFBIU19JTlZBTElEX1RBQkxFX0lOREVYKSAmJiAoIXBzdENsYXNzaWZpZXJFbnRyeS0+YlVuY2xhc3NpZmllZFBIU1J1bGUpKQogCQl7Ci0JCQlpZihwc3RDbGFzc2lmaWVyRW50cnktPnBzdFBoc1J1bGUpCi0JCQkvL0RlbGV0ZSB0aGUgY2xhc3NpZmllciBlbnRyeQotCQkJT3NhbE1lbUZyZWUocHN0Q2xhc3NpZmllckVudHJ5LT5wc3RQaHNSdWxlLHNpemVvZihTX1BIU19SVUxFKSk7Ci0JCQlPc2FsWmVyb01lbW9yeShwc3RDbGFzc2lmaWVyRW50cnksc2l6ZW9mKFNfQ0xBU1NJRklFUl9FTlRSWSkpOworCQkJa2ZyZWUocHN0Q2xhc3NpZmllckVudHJ5LT5wc3RQaHNSdWxlKTsKKwkJCW1lbXNldChwc3RDbGFzc2lmaWVyRW50cnksIDAsIHNpemVvZihTX0NMQVNTSUZJRVJfRU5UUlkpKTsKIAkJfQogCX0KIAlyZXR1cm4gbFN0YXR1czsKQEAgLTYxOSwxNCArNjIwLDExIEBACiAJCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHN0UGhzUnVsZS0+dThSZWZDbnQtLTsKIAkJCQkJaWYoMD09cHN0Q2xhc3NpZmllclJ1bGVzVGFibGUtPnN0QWN0aXZlUGhzUnVsZXNMaXN0W25DbHNpZEluZGV4XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wc3RQaHNSdWxlLT51OFJlZkNudCkKLQkJCQkJCU9zYWxNZW1GcmVlKHBzdENsYXNzaWZpZXJSdWxlc1RhYmxlCi0JCQkJCQkgICAgICAgICAgICAtPnN0QWN0aXZlUGhzUnVsZXNMaXN0W25DbHNpZEluZGV4XS5wc3RQaHNSdWxlLAotCQkJCQkJICAgICAgICAgICAgIHNpemVvZihTX1BIU19SVUxFKSk7CisJCQkJCQlrZnJlZShwc3RDbGFzc2lmaWVyUnVsZXNUYWJsZS0+c3RBY3RpdmVQaHNSdWxlc0xpc3RbbkNsc2lkSW5kZXhdLnBzdFBoc1J1bGUpOwogCQkJCQkgICAgcHN0Q2xhc3NpZmllclJ1bGVzVGFibGUtPnN0QWN0aXZlUGhzUnVsZXNMaXN0W25DbHNpZEluZGV4XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wc3RQaHNSdWxlID0gTlVMTDsKIAkJCQl9Ci0JCQkJT3NhbFplcm9NZW1vcnkoJnBzdENsYXNzaWZpZXJSdWxlc1RhYmxlCi0gICAgICAgICAgICAgICAgICAgIC0+c3RBY3RpdmVQaHNSdWxlc0xpc3RbbkNsc2lkSW5kZXhdLHNpemVvZihTX0NMQVNTSUZJRVJfRU5UUlkpKTsKKwkJCQltZW1zZXQoJnBzdENsYXNzaWZpZXJSdWxlc1RhYmxlLT5zdEFjdGl2ZVBoc1J1bGVzTGlzdFtuQ2xzaWRJbmRleF0sIDAsIHNpemVvZihTX0NMQVNTSUZJRVJfRU5UUlkpKTsKIAkJCQlpZihwc3RDbGFzc2lmaWVyUnVsZXNUYWJsZS0+c3RPbGRQaHNSdWxlc0xpc3RbbkNsc2lkSW5kZXhdLnBzdFBoc1J1bGUpCiAJCQkJewogCQkJCQlpZihwc3RDbGFzc2lmaWVyUnVsZXNUYWJsZS0+c3RPbGRQaHNSdWxlc0xpc3RbbkNsc2lkSW5kZXhdCkBAIC02MzUsMTUgKzYzMywxMiBAQAogCQkJCQkJICAgICAgICAgICAgICAgICAgLnBzdFBoc1J1bGUtPnU4UmVmQ250LS07CiAJCQkJCWlmKDAgPT0gcHN0Q2xhc3NpZmllclJ1bGVzVGFibGUtPnN0T2xkUGhzUnVsZXNMaXN0W25DbHNpZEluZGV4XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wc3RQaHNSdWxlLT51OFJlZkNudCkKLQkJCQkJCU9zYWxNZW1GcmVlKHBzdENsYXNzaWZpZXJSdWxlc1RhYmxlCi0JCQkJCQkgICAgICAtPnN0T2xkUGhzUnVsZXNMaXN0W25DbHNpZEluZGV4XS5wc3RQaHNSdWxlLAotCQkJCQkJICAgICAgIHNpemVvZihTX1BIU19SVUxFKSk7CisJCQkJCQlrZnJlZShwc3RDbGFzc2lmaWVyUnVsZXNUYWJsZQorCQkJCQkJICAgICAgLT5zdE9sZFBoc1J1bGVzTGlzdFtuQ2xzaWRJbmRleF0ucHN0UGhzUnVsZSk7CiAJCQkJCXBzdENsYXNzaWZpZXJSdWxlc1RhYmxlLT5zdE9sZFBoc1J1bGVzTGlzdFtuQ2xzaWRJbmRleF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wc3RQaHNSdWxlID0gTlVMTDsKIAkJCQl9Ci0JCQkJT3NhbFplcm9NZW1vcnkoJnBzdENsYXNzaWZpZXJSdWxlc1RhYmxlCi0gICAgICAgICAgICAgICAgICAtPnN0T2xkUGhzUnVsZXNMaXN0W25DbHNpZEluZGV4XSwKLSAgICAgICAgICAgICAgICAgICBzaXplb2YoU19DTEFTU0lGSUVSX0VOVFJZKSk7CisJCQkJbWVtc2V0KCZwc3RDbGFzc2lmaWVyUnVsZXNUYWJsZS0+c3RPbGRQaHNSdWxlc0xpc3RbbkNsc2lkSW5kZXhdLCAwLCBzaXplb2YoU19DTEFTU0lGSUVSX0VOVFJZKSk7CiAJCQl9CiAJCX0KIAkJcHN0U2VydmljZUZsb3dFbnRyeS0+YlVzZWQgPSBGQUxTRTsKQEAgLTg0OSw3ICs4NDQsNyBAQAogLy8gRG9lcyBub3QgcmV0dXJuIGFueSB2YWx1ZS4KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotdm9pZCBmcmVlX3Boc19zZXJ2aWNlZmxvd19ydWxlcyhTX1NFUlZJQ0VGTE9XX1RBQkxFICpwc1NlcnZpY2VGbG93UnVsZXNUYWJsZSkKK3N0YXRpYyB2b2lkIGZyZWVfcGhzX3NlcnZpY2VmbG93X3J1bGVzKFNfU0VSVklDRUZMT1dfVEFCTEUgKnBzU2VydmljZUZsb3dSdWxlc1RhYmxlKQogewogCWludCBpLGo7CiAgICAgUE1JTklfQURBUFRFUiBBZGFwdGVyID0gR0VUX0JDTV9BREFQVEVSKGdibHBuZXRkZXYpOwpAQCAtODc2LDggKzg3MSw3IEBACiAgIAkJCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnU4UmVmQ250LS07CiAJCQkJCQlpZigwPT1wc3RDbGFzc2lmaWVyUnVsZXNUYWJsZS0+c3RBY3RpdmVQaHNSdWxlc0xpc3Rbal0ucHN0UGhzUnVsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+dThSZWZDbnQpCi0JCQkJCQkJT3NhbE1lbUZyZWUocHN0Q2xhc3NpZmllclJ1bGVzVGFibGUtPnN0QWN0aXZlUGhzUnVsZXNMaXN0W2pdLgotCQkJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3RQaHNSdWxlLCBzaXplb2YoU19QSFNfUlVMRSkpOworCQkJCQkJCWtmcmVlKHBzdENsYXNzaWZpZXJSdWxlc1RhYmxlLT5zdEFjdGl2ZVBoc1J1bGVzTGlzdFtqXS5wc3RQaHNSdWxlKTsKIAkJCQkJCXBzdENsYXNzaWZpZXJSdWxlc1RhYmxlLT5zdEFjdGl2ZVBoc1J1bGVzTGlzdFtqXS5wc3RQaHNSdWxlID0gTlVMTDsKIAkJCQkJfQogCQkJCQlpZihwc3RDbGFzc2lmaWVyUnVsZXNUYWJsZS0+c3RPbGRQaHNSdWxlc0xpc3Rbal0ucHN0UGhzUnVsZSkKQEAgLTg4OCwyNCArODgyLDIzIEBACiAJCQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT51OFJlZkNudC0tOwogCQkJCQkJaWYoMD09cHN0Q2xhc3NpZmllclJ1bGVzVGFibGUtPnN0T2xkUGhzUnVsZXNMaXN0W2pdLnBzdFBoc1J1bGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnU4UmVmQ250KQotCQkJCQkJCU9zYWxNZW1GcmVlKHBzdENsYXNzaWZpZXJSdWxlc1RhYmxlLT5zdE9sZFBoc1J1bGVzTGlzdFtqXQotCQkJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgIC5wc3RQaHNSdWxlLHNpemVvZihTX1BIU19SVUxFKSk7CisJCQkJCQkJa2ZyZWUocHN0Q2xhc3NpZmllclJ1bGVzVGFibGUtPnN0T2xkUGhzUnVsZXNMaXN0W2pdLnBzdFBoc1J1bGUpOwogCQkJCQkJcHN0Q2xhc3NpZmllclJ1bGVzVGFibGUtPnN0T2xkUGhzUnVsZXNMaXN0W2pdLnBzdFBoc1J1bGUgPSBOVUxMOwogCQkJCQl9CiAJCQkJfQotCQkJICAgIE9zYWxNZW1GcmVlKHBzdENsYXNzaWZpZXJSdWxlc1RhYmxlLHNpemVvZihTX0NMQVNTSUZJRVJfVEFCTEUpKTsKKwkJCQlrZnJlZShwc3RDbGFzc2lmaWVyUnVsZXNUYWJsZSk7CiAJCQkgICAgc3RTZXJ2aWNlRmxvd0VudHJ5LnBzdENsYXNzaWZpZXJUYWJsZSA9IHBzdENsYXNzaWZpZXJSdWxlc1RhYmxlID0gTlVMTDsKIAkJCX0KIAkJfQogCX0KIAotCU9zYWxNZW1GcmVlKHBzU2VydmljZUZsb3dSdWxlc1RhYmxlLHNpemVvZihTX1NFUlZJQ0VGTE9XX1RBQkxFKSk7Ci0JcHNTZXJ2aWNlRmxvd1J1bGVzVGFibGUgPSBOVUxMOworICAgIGtmcmVlKHBzU2VydmljZUZsb3dSdWxlc1RhYmxlKTsKKyAgICBwc1NlcnZpY2VGbG93UnVsZXNUYWJsZSA9IE5VTEw7CiB9CiAKIAogCi1CT09MRUFOIFZhbGlkYXRlUEhTUnVsZUNvbXBsZXRlKElOIFNfUEhTX1JVTEUgKnBzUGhzUnVsZSkKK3N0YXRpYyBCT09MRUFOIFZhbGlkYXRlUEhTUnVsZUNvbXBsZXRlKElOIFNfUEhTX1JVTEUgKnBzUGhzUnVsZSkKIHsKIAlpZihwc1Boc1J1bGUpCiAJewpAQCAtOTg4LDkgKzk4MSw5IEBACiAJcmV0dXJuIFBIU19JTlZBTElEX1RBQkxFX0lOREVYOwogfQogCi1VSU5UIEdldFBoc1J1bGVFbnRyeShJTiBTX0NMQVNTSUZJRVJfVEFCTEUgKnBzdENsYXNzaWZpZXJUYWJsZSwKLSAgICAgIElOIEJfVUlOVDMyIHVpUEhTSSxFX0NMQVNTSUZJRVJfRU5UUllfQ09OVEVYVCBlQ2xzQ29udGV4dCwKLSAgICAgIE9VVCBTX1BIU19SVUxFICoqcHBzdFBoc1J1bGUpCitzdGF0aWMgVUlOVCBHZXRQaHNSdWxlRW50cnkoSU4gU19DTEFTU0lGSUVSX1RBQkxFICpwc3RDbGFzc2lmaWVyVGFibGUsCisJCQkgICAgSU4gQl9VSU5UMzIgdWlQSFNJLEVfQ0xBU1NJRklFUl9FTlRSWV9DT05URVhUIGVDbHNDb250ZXh0LAorCQkJICAgIE9VVCBTX1BIU19SVUxFICoqcHBzdFBoc1J1bGUpCiB7CiAJaW50ICBpOwogCVNfQ0xBU1NJRklFUl9FTlRSWSAqcHN0Q2xhc3NpZmllclJ1bGUgPSBOVUxMOwpAQCAtMTEwMiw3ICsxMDk1LDcgQEAKIAkJaWYocHNQaHNSdWxlLT51OFBIU0ZMZW5ndGgpCiAJCXsKIAkJCS8vdXBkYXRlIFBIU0YKLQkJCU9zYWxNZW1Nb3ZlKHBzdENsYXNzaWZpZXJFbnRyeS0+cHN0UGhzUnVsZS0+dThQSFNGLAorCQkJbWVtY3B5KHBzdENsYXNzaWZpZXJFbnRyeS0+cHN0UGhzUnVsZS0+dThQSFNGLAogCQkJICAgIHBzUGhzUnVsZS0+dThQSFNGICwgTUFYX1BIU19MRU5HVEhTKTsKIAkJfQogCQlpZihwc1Boc1J1bGUtPnU4UEhTRkxlbmd0aCkKQEAgLTExMTQsNyArMTEwNyw3IEBACiAJCWlmKHBzUGhzUnVsZS0+dThQSFNNTGVuZ3RoKQogCQl7CiAJCQkvL3VwZGF0ZSBQSFNNCi0JCQlPc2FsTWVtTW92ZShwc3RDbGFzc2lmaWVyRW50cnktPnBzdFBoc1J1bGUtPnU4UEhTTSwKKwkJCW1lbWNweShwc3RDbGFzc2lmaWVyRW50cnktPnBzdFBoc1J1bGUtPnU4UEhTTSwKIAkJCSAgICBwc1Boc1J1bGUtPnU4UEhTTSwgTUFYX1BIU19MRU5HVEhTKTsKIAkJfQogCQlpZihwc1Boc1J1bGUtPnU4UEhTTUxlbmd0aCkKQEAgLTExNDcsNyArMTE0MCw3IEBACiAJcmV0dXJuIHVpU3RhdHVzOwogfQogCi1VSU5UIENyZWF0ZUNsYXNzaWZpZXJQSFNSdWxlKElOIEJfVUlOVDE2ICB1aUNsc0lkLAorc3RhdGljIFVJTlQgQ3JlYXRlQ2xhc3NpZmllclBIU1J1bGUoSU4gQl9VSU5UMTYgIHVpQ2xzSWQsCiAgICAgU19DTEFTU0lGSUVSX1RBQkxFICpwc2FDbGFzc2lmaWVydGFibGUgLFNfUEhTX1JVTEUgKnBzUGhzUnVsZSwKICAgICBFX0NMQVNTSUZJRVJfRU5UUllfQ09OVEVYVCBlQ2xzQ29udGV4dCxCX1VJTlQ4IHU4QXNzb2NpYXRlZFBIU0kpCiB7CkBAIC0xMjM0LDggKzEyMjcsNyBAQAogCXsKIAkJaWYocHNDbGFzc2lmaWVyUnVsZXMtPnBzdFBoc1J1bGUgPT0gTlVMTCkKIAkJewotCQkJcHNDbGFzc2lmaWVyUnVsZXMtPnBzdFBoc1J1bGUgPSAoU19QSFNfUlVMRSopT3NhbE1lbUFsbG9jCi0gICAgICAgICAgICAgICAgKHNpemVvZihTX1BIU19SVUxFKSxQSFNfTUVNX1RBRyk7CisJCQlwc0NsYXNzaWZpZXJSdWxlcy0+cHN0UGhzUnVsZSA9IGttYWxsb2Moc2l6ZW9mKFNfUEhTX1JVTEUpLEdGUF9LRVJORUwpOwogCiAgICAgICAgICAgaWYoTlVMTCA9PSBwc0NsYXNzaWZpZXJSdWxlcy0+cHN0UGhzUnVsZSkKIAkJCQlyZXR1cm4gRVJSX1BIU1JVTEVfTUVNQUxMT0NfRkFJTDsKQEAgLTEyNDcsNyArMTIzOSw3IEBACiAJCXBzQ2xhc3NpZmllclJ1bGVzLT5iVW5jbGFzc2lmaWVkUEhTUnVsZSA9IHBzUGhzUnVsZS0+YlVuY2xhc3NpZmllZFBIU1J1bGU7CiAKICAgICAgICAgLyogVXBkYXRlIFRoZSBQSFMgcnVsZSAqLwotCQlPc2FsTWVtTW92ZShwc0NsYXNzaWZpZXJSdWxlcy0+cHN0UGhzUnVsZSwKKwkJbWVtY3B5KHBzQ2xhc3NpZmllclJ1bGVzLT5wc3RQaHNSdWxlLAogCQkgICAgcHNQaHNSdWxlLCBzaXplb2YoU19QSFNfUlVMRSkpOwogCX0KIAllbHNlCkBAIC0xMjU5LDcgKzEyNTEsNyBAQAogfQogCiAKLVVJTlQgVXBkYXRlQ2xhc3NpZmllclBIU1J1bGUoSU4gQl9VSU5UMTYgIHVpQ2xzSWQsCitzdGF0aWMgVUlOVCBVcGRhdGVDbGFzc2lmaWVyUEhTUnVsZShJTiBCX1VJTlQxNiAgdWlDbHNJZCwKICAgICAgIElOIFNfQ0xBU1NJRklFUl9FTlRSWSAqcHN0Q2xhc3NpZmllckVudHJ5LAogICAgICAgU19DTEFTU0lGSUVSX1RBQkxFICpwc2FDbGFzc2lmaWVydGFibGUgLFNfUEhTX1JVTEUgKnBzUGhzUnVsZSwKICAgICAgIEJfVUlOVDggdThBc3NvY2lhdGVkUEhTSSkKQEAgLTEyODksMTMgKzEyODEsMTMgQEAKIAkJLy9TdGVwIDIuYSBQSFMgUnVsZSBEb2VzIE5vdCBFeGlzdCAuQ3JlYXRlIE5ldyBQSFMgUnVsZSBmb3IgdWlDbHNJZAogCQlpZihGQUxTRSA9PSBiUEhTUnVsZU9ycGhhbmVkKQogCQl7Ci0JCQlwc3RDbGFzc2lmaWVyRW50cnktPnBzdFBoc1J1bGUgPSAoU19QSFNfUlVMRSopT3NhbE1lbUFsbG9jKHNpemVvZihTX1BIU19SVUxFKSxQSFNfTUVNX1RBRyk7CisJCQlwc3RDbGFzc2lmaWVyRW50cnktPnBzdFBoc1J1bGUgPSBrbWFsbG9jKHNpemVvZihTX1BIU19SVUxFKSwgR0ZQX0tFUk5FTCk7CiAJCQlpZihOVUxMID09IHBzdENsYXNzaWZpZXJFbnRyeS0+cHN0UGhzUnVsZSkKIAkJCXsKIAkJCQlyZXR1cm4gRVJSX1BIU1JVTEVfTUVNQUxMT0NfRkFJTDsKIAkJCX0KIAkJfQotCQlPc2FsTWVtTW92ZShwc3RDbGFzc2lmaWVyRW50cnktPnBzdFBoc1J1bGUsIHBzUGhzUnVsZSwgc2l6ZW9mKFNfUEhTX1JVTEUpKTsKKwkJbWVtY3B5KHBzdENsYXNzaWZpZXJFbnRyeS0+cHN0UGhzUnVsZSwgcHNQaHNSdWxlLCBzaXplb2YoU19QSFNfUlVMRSkpOwogCiAJfQogCWVsc2UKQEAgLTEzMDQsMTQgKzEyOTYsOCBAQAogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIFBIU19ESVNQQVRDSCwgREJHX0xWTF9BTEwsICJcblR5aW5nIENsYXNzaWZpZXIgdG8gRXhpc3RpbmcgUEhTIFJ1bGUiKTsKIAkJaWYoYlBIU1J1bGVPcnBoYW5lZCkKIAkJewotCQkgICAgaWYocHN0Q2xhc3NpZmllckVudHJ5LT5wc3RQaHNSdWxlKQotCQkgICAgewotCQkgICAgCS8vSnVzdCBGcmVlIHRoZSBQSFMgUnVsZSBhcyBSZWYgQ291bnQgaXMgWmVybwotCQkgICAgCU9zYWxNZW1GcmVlKHBzdENsYXNzaWZpZXJFbnRyeS0+cHN0UGhzUnVsZSxzaXplb2YoU19QSFNfUlVMRSkpOworCQkJa2ZyZWUocHN0Q2xhc3NpZmllckVudHJ5LT5wc3RQaHNSdWxlKTsKIAkJCXBzdENsYXNzaWZpZXJFbnRyeS0+cHN0UGhzUnVsZSA9IE5VTEw7Ci0KLQkJICAgIH0KLQogCQl9CiAJCXBzdENsYXNzaWZpZXJFbnRyeS0+cHN0UGhzUnVsZSA9IHBzdEFkZFBoc1J1bGU7CiAKQEAgLTEzMjYsNyArMTMxMiw3IEBACiAKIH0KIAotQk9PTEVBTiBEZXJlZlBoc1J1bGUoSU4gQl9VSU5UMTYgIHVpQ2xzSWQsU19DTEFTU0lGSUVSX1RBQkxFICpwc2FDbGFzc2lmaWVydGFibGUsU19QSFNfUlVMRSAqcHN0UGhzUnVsZSkKK3N0YXRpYyBCT09MRUFOIERlcmVmUGhzUnVsZShJTiBCX1VJTlQxNiAgdWlDbHNJZCxTX0NMQVNTSUZJRVJfVEFCTEUgKnBzYUNsYXNzaWZpZXJ0YWJsZSxTX1BIU19SVUxFICpwc3RQaHNSdWxlKQogewogCWlmKHBzdFBoc1J1bGU9PU5VTEwpCiAJCXJldHVybiBGQUxTRTsKQEAgLTEzNDUsMjIgKzEzMzEsNiBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgRHVtcEJ1ZmZlcihQVk9JRCBCdWZmVkFkZHJlc3MsIGludCB4ZmVyU2l6ZSkKLXsKLQlpbnQgaTsKLQlpbnQgaVByaW50TGVuZ3RoOwotCVBVQ0hBUiB0ZW1wPShQVUNIQVIpQnVmZlZBZGRyZXNzOwotICAgIFBNSU5JX0FEQVBURVIgQWRhcHRlciA9IEdFVF9CQ01fQURBUFRFUihnYmxwbmV0ZGV2KTsKLQlpUHJpbnRMZW5ndGg9KHhmZXJTaXplPDMyP3hmZXJTaXplOjMyKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIFBIU19ESVNQQVRDSCwgREJHX0xWTF9BTEwsICJcbiIpOwotCi0JZm9yIChpPTA7aSA8IGlQcmludExlbmd0aDtpKyspIHsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgUEhTX0RJU1BBVENILCBEQkdfTFZMX0FMTCwgIiV4fCIsdGVtcFtpXSk7Ci0JfQotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgUEhTX0RJU1BBVENILCBEQkdfTFZMX0FMTCwgIlxuIik7Ci19Ci0KLQogdm9pZCBEdW1wUGhzUnVsZXMoUFBIU19ERVZJQ0VfRVhURU5TSU9OIHBEZXZpY2VFeHRlbnNpb24pCiB7CiAJaW50IGksaixrLGw7CkBAIC0xNTIwLDggKzE0OTAsOCBAQAogLy8Jc2l6ZS1UaGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBpbnRvIHRoZSBvdXRwdXQgYnVmZmVyIGkuZSBkeW5hbWljIGZpZWxkcwogLy8JMAktSWYgUEhTIHJ1bGUgaXMgTlVMTC5JZiBQSFNWIGZpZWxkIGlzIG5vdCBzZXQuSWYgdGhlIHZlcmlmaWNhdGlvbiBmYWlscy4KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWludCBwaHNfY29tcHJlc3MoU19QSFNfUlVMRSAgKnBoc19ydWxlLHVuc2lnbmVkIGNoYXIgKmluX2J1ZgotCQkJCQkJLHVuc2lnbmVkIGNoYXIgKm91dF9idWYsVUlOVCAqaGVhZGVyX3NpemUsVUlOVCAqbmV3X2hlYWRlcl9zaXplKQorc3RhdGljIGludCBwaHNfY29tcHJlc3MoU19QSFNfUlVMRSAgKnBoc19ydWxlLHVuc2lnbmVkIGNoYXIgKmluX2J1ZgorCQkJLHVuc2lnbmVkIGNoYXIgKm91dF9idWYsVUlOVCAqaGVhZGVyX3NpemUsVUlOVCAqbmV3X2hlYWRlcl9zaXplKQogewogCXVuc2lnbmVkIGNoYXIgKm9sZF9hZGRyID0gb3V0X2J1ZjsKIAlpbnQgc3VwcmVzcyA9IDA7CkBAIC0xNTgxLDkgKzE1NTEsOSBAQAogLy8JMAktUGFja2V0IGhhcyBmYWlsZWQgdGhlIHZlcmlmaWNhdGlvbi4KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotIGludCB2ZXJpZnlfc3VwcHJlc3NfcGhzZih1bnNpZ25lZCBjaGFyICppbl9idWZmZXIsdW5zaWduZWQgY2hhciAqb3V0X2J1ZmZlciwKLQkJCQkJCQkJdW5zaWduZWQgY2hhciAqcGhzZix1bnNpZ25lZCBjaGFyICpwaHNtLHVuc2lnbmVkIGludCBwaHNzLAotCQkJCQkJCQl1bnNpZ25lZCBpbnQgcGhzdixVSU5UKiBuZXdfaGVhZGVyX3NpemUpCitzdGF0aWMgaW50IHZlcmlmeV9zdXBwcmVzc19waHNmKHVuc2lnbmVkIGNoYXIgKmluX2J1ZmZlcix1bnNpZ25lZCBjaGFyICpvdXRfYnVmZmVyLAorCQkJCXVuc2lnbmVkIGNoYXIgKnBoc2YsdW5zaWduZWQgY2hhciAqcGhzbSx1bnNpZ25lZCBpbnQgcGhzcywKKwkJCQl1bnNpZ25lZCBpbnQgcGhzdixVSU5UKiBuZXdfaGVhZGVyX3NpemUpCiB7CiAJdW5zaWduZWQgaW50IHNpemU9MDsKIAlpbnQgYml0LGk9MDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vUEhTTW9kdWxlLmggYi9kcml2ZXJzL3N0YWdpbmcvYmNtL1BIU01vZHVsZS5oCmluZGV4IGJmMmI1NzYuLjBkZDA1YTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vUEhTTW9kdWxlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9QSFNNb2R1bGUuaApAQCAtMjcsMTkgKzI3LDYgQEAKIAogaW50IHBoc19pbml0KFBQSFNfREVWSUNFX0VYVEVOU0lPTiBwUGhzZGV2aWNlRXh0ZW5zaW9uLFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CiAKLXZvaWQgZnJlZV9waHNfc2VydmljZWZsb3dfcnVsZXMoU19TRVJWSUNFRkxPV19UQUJMRSAqcHNTZXJ2aWNlRmxvd1J1bGVzVGFibGUpOwotCi1pbnQgcGhzX2NvbXByZXNzKFNfUEhTX1JVTEUgICAqcGhzX21lbWJlcnMsdW5zaWduZWQgY2hhciAqaW5fYnVmLAotCQkJCQkJdW5zaWduZWQgY2hhciAqb3V0X2J1Zix1bnNpZ25lZCBpbnQgKmhlYWRlcl9zaXplLFVJTlQgKm5ld19oZWFkZXJfc2l6ZSApOwotCi0KLWludCB2ZXJpZnlfc3VwcHJlc3NfcGhzZih1bnNpZ25lZCBjaGFyICppbl9idWZmZXIsdW5zaWduZWQgY2hhciAqb3V0X2J1ZmZlciwKLQkJCQkJCQkJdW5zaWduZWQgY2hhciAqcGhzZix1bnNpZ25lZCBjaGFyICpwaHNtLHVuc2lnbmVkIGludCBwaHNzLHVuc2lnbmVkIGludCBwaHN2LFVJTlQgKm5ld19oZWFkZXJfc2l6ZSApOwotCi1pbnQgcGhzX2RlY29tcHJlc3ModW5zaWduZWQgY2hhciAqaW5fYnVmLHVuc2lnbmVkIGNoYXIgKm91dF9idWYsXAotCQkJCQkJICBTX1BIU19SVUxFICAgKnBoc19ydWxlcyxVSU5UICpoZWFkZXJfc2l6ZSk7Ci0KLQogaW50IFBoc0NsZWFudXAoUFBIU19ERVZJQ0VfRVhURU5TSU9OIHBQSFNEZXZpY2VFeHQpOwogCiAvL1V0aWxpdHkgRnVuY3Rpb25zCkBAIC01Miw0MiArMzksMTAgQEAKIFVMT05HIFBoc0RlbGV0ZVNGUnVsZXModm9pZCogcHZDb250ZXh0LEJfVUlOVDE2IHVpVmNpZCkgOwogCiAKLVVMT05HIFBoc0NvbXByZXNzKHZvaWQqIHB2Q29udGV4dCwKLQkJCQkgIEJfVUlOVDE2IHVpVmNpZCwKLQkJCQkgIEJfVUlOVDE2IHVpQ2xzSWQsCi0JCQkJICB2b2lkICpwdklucHV0QnVmZmVyLAotCQkJCSAgdm9pZCAqcHZPdXRwdXRCdWZmZXIsCi0JCQkJICBVSU5UICpwT2xkSGVhZGVyU2l6ZSwKLQkJCQkgIFVJTlQgKnBOZXdIZWFkZXJTaXplICk7Ci0KLVVMT05HIFBoc0RlQ29tcHJlc3Modm9pZCogcHZDb250ZXh0LAotCQkJCSAgQl9VSU5UMTYgdWlWY2lkLAotCQkJCSAgdm9pZCAqcHZJbnB1dEJ1ZmZlciwKLQkJCQkgIHZvaWQgKnB2T3V0cHV0QnVmZmVyLAotCQkJCSAgVUlOVCAqcEluSGVhZGVyU2l6ZSwKLQkJCQkgIFVJTlQgKnBPdXRIZWFkZXJTaXplKTsKLQotCiBCT09MRUFOIFZhbGlkYXRlUEhTUnVsZShTX1BIU19SVUxFICpwc1Boc1J1bGUpOwogCi1CT09MRUFOIFZhbGlkYXRlUEhTUnVsZUNvbXBsZXRlKFNfUEhTX1JVTEUgKnBzUGhzUnVsZSk7Ci0KIFVJTlQgR2V0U2VydmljZUZsb3dFbnRyeShTX1NFUlZJQ0VGTE9XX1RBQkxFICpwc1NlcnZpY2VGbG93VGFibGUsQl9VSU5UMTYgdWlWY2lkLFNfU0VSVklDRUZMT1dfRU5UUlkgKipwcHN0U2VydmljZUZsb3dFbnRyeSk7CiAKLVVJTlQgR2V0Q2xhc3NpZmllckVudHJ5KFNfQ0xBU1NJRklFUl9UQUJMRSAqcHN0Q2xhc3NpZmllclRhYmxlLEJfVUlOVDMyIHVpQ2xzaWQsRV9DTEFTU0lGSUVSX0VOVFJZX0NPTlRFWFQgZUNsc0NvbnRleHQsIFNfQ0xBU1NJRklFUl9FTlRSWSAqKnBwc3RDbGFzc2lmaWVyRW50cnkpOwotCi1VSU5UIEdldFBoc1J1bGVFbnRyeShTX0NMQVNTSUZJRVJfVEFCTEUgKnBzdENsYXNzaWZpZXJUYWJsZSxCX1VJTlQzMiB1aVBIU0ksRV9DTEFTU0lGSUVSX0VOVFJZX0NPTlRFWFQgZUNsc0NvbnRleHQsU19QSFNfUlVMRSAqKnBwc3RQaHNSdWxlKTsKLQotCi1VSU5UIENyZWF0ZVNGVG9DbGFzc2lmaWVyUnVsZU1hcHBpbmcoQl9VSU5UMTYgdWlWY2lkLEJfVUlOVDE2ICB1aUNsc0lkLFNfU0VSVklDRUZMT1dfVEFCTEUgKnBzU2VydmljZUZsb3dUYWJsZSxTX1BIU19SVUxFICpwc1Boc1J1bGUsQl9VSU5UOCB1OEFzc29jaWF0ZWRQSFNJKTsKLQotVUlOVCBDcmVhdGVDbGFzc2lmZXJUb1BIU1J1bGVNYXBwaW5nKEJfVUlOVDE2IHVpVmNpZCxCX1VJTlQxNiAgdWlDbHNJZCxTX1NFUlZJQ0VGTE9XX0VOVFJZICpwc3RTZXJ2aWNlRmxvd0VudHJ5LFNfUEhTX1JVTEUgKnBzUGhzUnVsZSxCX1VJTlQ4IHU4QXNzb2NpYXRlZFBIU0kpOwotCi1VSU5UIENyZWF0ZUNsYXNzaWZpZXJQSFNSdWxlKEJfVUlOVDE2ICB1aUNsc0lkLFNfQ0xBU1NJRklFUl9UQUJMRSAqcHNhQ2xhc3NpZmllcnRhYmxlICxTX1BIU19SVUxFICpwc1Boc1J1bGUsRV9DTEFTU0lGSUVSX0VOVFJZX0NPTlRFWFQgZUNsc0NvbnRleHQsQl9VSU5UOCB1OEFzc29jaWF0ZWRQSFNJKTsKLQotVUlOVCBVcGRhdGVDbGFzc2lmaWVyUEhTUnVsZShCX1VJTlQxNiAgdWlDbHNJZCxTX0NMQVNTSUZJRVJfRU5UUlkgKnBzdENsYXNzaWZpZXJFbnRyeSxTX0NMQVNTSUZJRVJfVEFCTEUgKnBzYUNsYXNzaWZpZXJ0YWJsZSAsU19QSFNfUlVMRSAqcHNQaHNSdWxlLEJfVUlOVDggdThBc3NvY2lhdGVkUEhTSSk7Ci0KLUJPT0xFQU4gRGVyZWZQaHNSdWxlKEJfVUlOVDE2ICB1aUNsc0lkLFNfQ0xBU1NJRklFUl9UQUJMRSAqcHNhQ2xhc3NpZmllcnRhYmxlLFNfUEhTX1JVTEUgKnBzdFBoc1J1bGUpOwogCiB2b2lkIER1bXBQaHNSdWxlcyhQUEhTX0RFVklDRV9FWFRFTlNJT04gcERldmljZUV4dGVuc2lvbik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vUHJvdG9jb2wuaCBiL2RyaXZlcnMvc3RhZ2luZy9iY20vUHJvdG9jb2wuaAppbmRleCAwMGYxY2MxLi5iOGE0MDA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL1Byb3RvY29sLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9Qcm90b2NvbC5oCkBAIC04NSwxMCArODUsMTAgQEAKIAlFVEhfSEVBREVSX1NUUlVDIEVUaEhkcjsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgRVRIX0NTX0VUSDJfRlJBTUU7CiAKKyNkZWZpbmUgRVRIRVJORVRfRlJBTUVUWVBFX0lQVjQJCW50b2hzKDB4MDgwMCkKKyNkZWZpbmUgRVRIRVJORVRfRlJBTUVUWVBFX0lQVjYgCW50b2hzKDB4ODZkZCkKKyNkZWZpbmUgRVRIRVJORVRfRlJBTUVUWVBFXzgwMlFWTEFOIAludG9ocygweDgxMDApCiAKLSNkZWZpbmUgRVRIRVJORVRfRlJBTUVUWVBFX0lQVjQgbnRvaHMoMHgwODAwKQotI2RlZmluZSBFVEhFUk5FVF9GUkFNRVRZUEVfSVBWNiBudG9ocygweDg2ZGQpCi0jZGVmaW5lIEVUSEVSTkVUX0ZSQU1FVFlQRV84MDJRVkxBTiAweDgxMDAKIC8vUGVyIFNGIENTIFNwZWNpZmljYXRpb24gRW5jb2RpbmdzCiB0eXBlZGVmIGVudW0gX0VfU0VSVklDRUZMT1dfQ1NfU1BFQ18KIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vUHJvdG90eXBlcy5oIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9Qcm90b3R5cGVzLmgKaW5kZXggNzBlYzhiYy4uYjgwYjgwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9Qcm90b3R5cGVzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9Qcm90b3R5cGVzLmgKQEAgLTEsMjMgKzEsMTIgQEAKICNpZm5kZWYgX1BST1RPVFlQRVNfSF8KICNkZWZpbmUgX1BST1RPVFlQRVNfSF8KIAotaW50IEJjbUZpbGVEb3dubG9hZChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsLyoqPCBMb2dpY2FsIEFkYXB0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnBhdGgsICAgICAvKio8IHBhdGggdG8gaW1hZ2UgZmlsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGxvYyAgICAvKio8IERvd25sb2FkIEFkZHJlc3Mgb24gdGhlIGNoaXAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKTsKIFZPSUQgTGlua0NvbnRyb2xSZXNwb25zZU1lc3NhZ2UoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBQVUNIQVIgcHVjQnVmZmVyKTsKIAogVk9JRCBTdGF0aXN0aWNzUmVzcG9uc2UoUE1JTklfQURBUFRFUiBBZGFwdGVyLFBWT0lEIHB2QnVmZmVyKTsKIAogVk9JRCBJZGxlTW9kZVJlc3BvbnNlKFBNSU5JX0FEQVBURVIgQWRhcHRlcixQVUlOVCBwdWlCdWZmZXIpOwogCi12b2lkIGJjbV9rZnJlZV9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci1WT0lEIGJjbV9rZnJlZShWT0lEICpwdHIpOwotCi0KLVZPSUQgaGFuZGxlX3J4X2NvbnRyb2xfcGFja2V0KFBNSU5JX0FEQVBURVIgQWRhcHRlciwgCS8qKjxQb2ludGVyIHRvIHRoZSBBZGFwdGVyIHN0cnVjdHVyZSovCi0JCQkJCQkJCXN0cnVjdCBza19idWZmICpza2IpOwkJCQkvKio8UG9pbnRlciB0byB0aGUgc29ja2V0IGJ1ZmZlciovCi0KIGludCBjb250cm9sX3BhY2tldF9oYW5kbGVyCShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwogCiBWT0lEIERlbGV0ZUFsbENsYXNzaWZpZXJzRm9yU0YoUE1JTklfQURBUFRFUiBBZGFwdGVyLFVJTlQgdWlTZWFyY2hSdWxlSW5kZXgpOwpAQCAtMzgsMjUgKzI3LDE2IEBACiAKIFZPSUQgZmx1c2hfYWxsX3F1ZXVlcyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwogCi1VU0hPUlQJSXBWZXJzaW9uNChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIC8qKjwgUG9pbnRlciB0byB0aGUgZHJpdmVyIGNvbnRyb2wgc3RydWN0dXJlICovCi0JCQkJCXN0cnVjdCBpcGhkciAqaXBoZCwgLyoqPFBvaW50ZXIgdG8gdGhlIElQIEhkciBvZiB0aGUgcGFja2V0Ki8KLQkJCQkJU19DTEFTU0lGSUVSX1JVTEUgKnBzdENsYXNzaWZpZXJSdWxlICk7Ci0KLVZPSUQgUHJ1bmVRdWV1ZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsLyoqPFBvaW50ZXIgdG8gdGhlIGRyaXZlciBjb250cm9sIHN0cnVjdHVyZSovCi0JCQkJCUlOVCBpSW5kZXgvKio8UXVldWUgSW5kZXgqLwotCQkJCQkpOwotCiBWT0lEIFBydW5lUXVldWVBbGxTRihQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwogCiBJTlQgU2VhcmNoU2ZpZChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsVUlOVCB1aVNmaWQpOwogCi1VU0hPUlQgR2V0UGFja2V0UXVldWVJbmRleChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIC8qKjxQb2ludGVyIHRvIHRoZSBkcml2ZXIgY29udHJvbCBzdHJ1Y3R1cmUgKi8KLQkJCQkJCQkJc3RydWN0IHNrX2J1ZmYqIFBhY2tldCAvKio8IFBvaW50ZXIgdG8gdGhlIFBhY2tldCB0byBiZSBzZW50Ki8KLQkJCQkJCQkJKTsKK1VTSE9SVCBDbGFzc2lmeVBhY2tldChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsc3RydWN0IHNrX2J1ZmYqIHNrYik7CiAKLVZPSUQKLXJlcGx5X3RvX2FycF9yZXF1ZXN0KHN0cnVjdCBza19idWZmICpza2IgIC8qKjxza19idWZmIG9mIEFSUCByZXF1ZXN0Ki8KLQkJCQkJCSk7CitCT09MRUFOIE1hdGNoU3JjUG9ydChTX0NMQVNTSUZJRVJfUlVMRSAqcHN0Q2xhc3NpZmllclJ1bGUsVVNIT1JUIHVzaFNyY1BvcnQpOworQk9PTEVBTiBNYXRjaERlc3RQb3J0KFNfQ0xBU1NJRklFUl9SVUxFICpwc3RDbGFzc2lmaWVyUnVsZSxVU0hPUlQgdXNoU3JjUG9ydCk7CitCT09MRUFOIE1hdGNoUHJvdG9jb2woU19DTEFTU0lGSUVSX1JVTEUgKnBzdENsYXNzaWZpZXJSdWxlLFVDSEFSIHVjUHJvdG9jb2wpOworCiAKIElOVCBTZXR1cE5leHRTZW5kKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgLyoqPExvZ2ljYWwgQWRhcHRlciovCiAJCQkJCXN0cnVjdCBza19idWZmICpQYWNrZXQsIC8qKjxkYXRhIGJ1ZmZlciovCkBAIC03MCwxMSArNTAsOSBAQAogCQkJCQkJCWNoYXIgKnBDb250cm9sUGFja2V0LyoqPENvbnRyb2wgUGFja2V0Ki8KIAkJCQkJCQkpOwogCi1JTlQgYmNtX3RyYW5zbWl0KHN0cnVjdCBza19idWZmICpza2IsIAkJLyoqPCBza2IgKi8KLQkJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiAJLyoqPCBuZXQgZGV2aWNlIHBvaW50ZXIgKi8KLQkJCQkJKTsKIAogaW50IHJlZ2lzdGVyX25ldHdvcmtkZXYoUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKK3ZvaWQgdW5yZWdpc3Rlcl9uZXR3b3JrZGV2KFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CiAKIElOVCBBbGxvY0FkYXB0ZXJEc3hCdWZmZXIoUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKIApAQCAtODIsOCArNjAsNiBAQAogCiBJTlQgRnJlZUFkYXB0ZXJEc3hCdWZmZXIoUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKIAotaW50IGNyZWF0ZV93b3JrZXJfdGhyZWFkcyhQTUlOSV9BREFQVEVSIHBzQWRhcHRlcik7Ci0KIGludCB0eF9wa3RfaGFuZGxlcihQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwogCiBpbnQgIHJlc2V0X2NhcmRfcHJvYyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIgKTsKQEAgLTkyLDcgKzY4LDYgQEAKIAogaW50IEluaXRDYXJkQW5kRG93bmxvYWRGaXJtd2FyZShQTUlOSV9BREFQVEVSIHBzX2FkYXB0ZXIpOwogCi1pbnQgYmNtX3BhcnNlX3RhcmdldF9wYXJhbXMoUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKIAogSU5UIFJlYWRNYWNBZGRyZXNzRnJvbU5WTShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwogCkBAIC0xMTAsMjYgKzg1LDE1IEBACiAKIGludCBnZXRfZHN4X3NmX2RhdGFfdG9fYXBwbGljYXRpb24oUE1JTklfQURBUFRFUiBBZGFwdGVyLCBVSU5UIHVpU0ZJZCwgdm9pZCBfX3VzZXIgKiB1c2VyX2J1ZmZlcik7CiAKLXZvaWQgU2VuZExpbmtEb3duKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7Ci0KIHZvaWQgU2VuZElkbGVNb2RlUmVzcG9uc2UoUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKIAotdm9pZCBIYW5kbGVTaHV0RG93bk1vZGVSZXF1ZXN0KFBNSU5JX0FEQVBURVIgQWRhcHRlcixQVUNIQVIgcHVjQnVmZmVyKTsKIAotaW50ICBQcm9jZXNzR2V0SG9zdE1pYnMoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBQVk9JRCBpb0J1ZmZlciwKLQlVTE9ORyBpbnB1dEJ1ZmZlckxlbmd0aCk7Ci0KLWludCBHZXREcm9wcGVkQXBwQ250cmxQa3RNaWJzKFBWT0lEIGlvQnVmZmVyLCBQUEVSX1RBUkFOR19EQVRBIHBUYXJhbmcpOworaW50ICBQcm9jZXNzR2V0SG9zdE1pYnMoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBTX01JQlNfSE9TVF9TVEFUU19NSUJTICpidWYpOwordm9pZCBHZXREcm9wcGVkQXBwQ250cmxQa3RNaWJzKFNfTUlCU19IT1NUX1NUQVRTX01JQlMgKmlvQnVmZmVyLCBQUEVSX1RBUkFOR19EQVRBIHBUYXJhbmcpOwogdm9pZCBiZWNlZW1fcGFyc2VfdGFyZ2V0X3N0cnVjdChQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwogCi12b2lkIGRvUG93ZXJBdXRvQ29ycmVjdGlvbihQTUlOSV9BREFQVEVSIHBzQWRhcHRlcik7Ci0KIGludCBiY21faW9jdGxfZndfZG93bmxvYWQoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBGSVJNV0FSRV9JTkZPICpwc0Z3SW5mbyk7CiAKLXZvaWQgYmNtX3VucmVnaXN0ZXJfbmV0d29ya2RldihQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwotCi1pbnQgU2VhcmNoVmNpZChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsdW5zaWduZWQgc2hvcnQgdXNWY2lkKTsKLQogdm9pZCBDb3B5TUlCU0V4dGVuZGVkU0ZQYXJhbWV0ZXJzKFBNSU5JX0FEQVBURVIgQWRhcHRlciwKIAkJQ1NlcnZpY2VGbG93UGFyYW1TSSAqcHNmTG9jYWxTZXQsIFVJTlQgdWlTZWFyY2hSdWxlSW5kZXgpOwogCkBAIC0xNDksNyArMTEzLDYgQEAKIAogdm9pZCBDbGVhclRhcmdldERTWEJ1ZmZlcihQTUlOSV9BREFQVEVSIEFkYXB0ZXIsQl9VSU5UMTYgVElELEJPT0xFQU4gYkZyZWVBbGwpOwogCi12b2lkIGJlY2VlbV9wcm90b2NvbF9yZXNldCAoUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKIAogdm9pZCBmbHVzaF9xdWV1ZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFVJTlQgaVFJbmRleCk7CiAKQEAgLTE2NCwzMSArMTI3LDExIEBACiAJVUlOVCB1aU51bUJ5dGVzKTsKIAogCi1JTlQgQmVjZWVtRmxhc2hCdWxrUmVhZCgKLQlQTUlOSV9BREFQVEVSIEFkYXB0ZXIsCi0JUFVJTlQgcEJ1ZmZlciwKLQlVSU5UIHVpT2Zmc2V0LAotCVVJTlQgdWlOdW1CeXRlcyk7Ci0KLVVJTlQgQmNtR2V0RUVQUk9NU2l6ZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwogCiBJTlQgV3JpdGVCZWNlZW1FRVBST00oUE1JTklfQURBUFRFUiBBZGFwdGVyLFVJTlQgdWlFRVBST01PZmZzZXQsIFVJTlQgdWlEYXRhKTsKIAotVUlOVCBCY21HZXRGbGFzaFNpemUoUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKLQotVUlOVCBCY21HZXRGbGFzaFNlY3RvclNpemUoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBVSU5UIEZsYXNoU2VjdG9yU2l6ZVNpZywgVUlOVCBGbGFzaFNlY3RvclNpemUpOwotCi1JTlQgQmVjZWVtRmxhc2hCdWxrV3JpdGUoCi0JUE1JTklfQURBUFRFUiBBZGFwdGVyLAotCVBVSU5UIHBCdWZmZXIsCi0JVUlOVCB1aU9mZnNldCwKLQlVSU5UIHVpTnVtQnl0ZXMsCi0JQk9PTEVBTiBiVmVyaWZ5KTsKLQogSU5UIFByb3BhZ2F0ZUNhbFBhcmFtc0Zyb21GbGFzaFRvTWVtb3J5KFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CiAKLUlOVCBQcm9wYWdhdGVDYWxQYXJhbXNGcm9tRUVQUk9NVG9NZW1vcnkoUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKLQogCiBJTlQgQmVjZWVtRUVQUk9NQnVsa1dyaXRlKAogCVBNSU5JX0FEQVBURVIgQWRhcHRlciwKQEAgLTE5OCwxMSArMTQxLDggQEAKIAlCT09MRUFOIGJWZXJpZnkpOwogCiAKLUlOVCBSZWFkQmVjZWVtRUVQUk9NQnVsayhQTUlOSV9BREFQVEVSIEFkYXB0ZXIsVUlOVCBkd0FkZHJlc3MsIFVJTlQgKnBkd0RhdGEsIFVJTlQgZHdOdW1EYXRhKTsKLQogSU5UIFJlYWRCZWNlZW1FRVBST00oUE1JTklfQURBUFRFUiBBZGFwdGVyLFVJTlQgZHdBZGRyZXNzLCBVSU5UICpwZHdEYXRhKTsKIAotTlZNX1RZUEUgQmNtR2V0TnZtVHlwZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwogCiBJTlQgQmVjZWVtTlZNUmVhZCgKIAlQTUlOSV9BREFQVEVSIEFkYXB0ZXIsCkBAIC0yMTcsMjQgKzE1NywxMiBAQAogCVVJTlQgdWlOdW1CeXRlcywKIAlCT09MRUFOIGJWZXJpZnkpOwogCi1JTlQgQmNtVXBkYXRlU2VjdG9yU2l6ZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsVUlOVCB1aVNlY3RvclNpemUpOwogCiBJTlQgQmNtSW5pdE5WTShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwogCi1JTlQgQmNtR2V0TnZtU2l6ZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOworSU5UIEJjbVVwZGF0ZVNlY3RvclNpemUoUE1JTklfQURBUFRFUiBBZGFwdGVyLFVJTlQgdWlTZWN0b3JTaXplKTsKK0JPT0xFQU4gSXNTZWN0aW9uRXhpc3RJbkZsYXNoKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgRkxBU0gyWF9TRUNUSU9OX1ZBTCBzZWN0aW9uKTsKIAotSU5UIElzU2VjdGlvbkV4aXN0SW5WZW5kb3JJbmZvKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgRkxBU0gyWF9TRUNUSU9OX1ZBTCBzZWN0aW9uKTsKLQotVk9JRCBCY21WYWxpZGF0ZU52bVR5cGUoUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKLQotVk9JRCBDb25maWd1cmVFbmRQb2ludFR5cGVzVGhyb3VnaEVFUFJPTShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwotCi1JTlQgQmNtR2V0Rmxhc2hDU0luZm8oUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKLUlOVCBSZWFkRFNESGVhZGVyKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgUERTRF9IRUFERVIgcHNEU0RIZWFkZXIsIEZMQVNIMlhfU0VDVElPTl9WQUwgZHNkKTsKLUlOVCBCY21HZXRBY3RpdmVEU0QoUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKLUlOVCBSZWFkSVNPSGVhZGVyKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgUElTT19IRUFERVIgcHNJU09IZWFkZXIsIEZMQVNIMlhfU0VDVElPTl9WQUwgSXNvSW1hZ2UpOwotSU5UIEJjbUdldEFjdGl2ZUlTTyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwotQl9VSU5UOCBJc09mZnNldFdyaXRhYmxlKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgVUlOVCB1aU9mZnNldCk7CiBJTlQgQmNtR2V0Rmxhc2gyeFNlY3Rpb25hbEJpdE1hcChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFBGTEFTSDJYX0JJVE1BUCBwc0ZsYXNoMnhCaXRNYXApOwogCiBJTlQgQmNtRmxhc2gyeEJ1bGtXcml0ZSgKQEAgLTI1MSw3ICsxNzksNiBAQAogCUZMQVNIMlhfU0VDVElPTl9WQUwgZUZsYXNoU2VjdGlvblZhbCwKIAlVSU5UIHVpT2Zmc2V0V2l0aGluU2VjdGlvblZhbCwKIAlVSU5UIHVpTnVtQnl0ZXMpOwotSU5UIEJjbUdldFNlY3Rpb25WYWxFbmRPZmZzZXQoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBGTEFTSDJYX1NFQ1RJT05fVkFMIGVGbGFzaFNlY3Rpb25WYWwpOwogCiBJTlQgQmNtR2V0U2VjdGlvblZhbFN0YXJ0T2Zmc2V0KFBNSU5JX0FEQVBURVIgQWRhcHRlciwgRkxBU0gyWF9TRUNUSU9OX1ZBTCBlRmxhc2hTZWN0aW9uVmFsKTsKIApAQCAtMjY0LDM0ICsxOTEsMTMgQEAKIElOVCBCY21GbGFzaDJ4V3JpdGVTaWcoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBGTEFTSDJYX1NFQ1RJT05fVkFMIGVGbGFzaFNlY3Rpb25WYWwpOwogSU5UCXZhbGlkYXRlRmxhc2gyeFJlYWRXcml0ZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFBGTEFTSDJYX1JFQURXUklURSBwc0ZsYXNoMnhSZWFkV3JpdGUpOwogSU5UIElzRmxhc2gyeChQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwotSU5UIEdldEZsYXNoQmFzZUFkZHIoUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKLUlOVCBTYXZlSGVhZGVySWZQcmVzZW50KFBNSU5JX0FEQVBURVIgQWRhcHRlciwgUFVDSEFSIHBCdWZmLCBVSU5UIHVpU2VjdEFsaWduQWRkcik7CiBJTlQJQmNtQ29weVNlY3Rpb24oUE1JTklfQURBUFRFUiBBZGFwdGVyLAogCQkJCQkJRkxBU0gyWF9TRUNUSU9OX1ZBTCBTcmNTZWN0aW9uLAogCQkJCQkJRkxBU0gyWF9TRUNUSU9OX1ZBTCBEc3RTZWN0aW9uLAogCQkJCQkJVUlOVCBvZmZzZXQsCiAJCQkJCQlVSU5UIG51bU9mQnl0ZXMpOwogCi1JTlQgQmNtRG9DaGlwU2VsZWN0KFBNSU5JX0FEQVBURVIgQWRhcHRlciwgVUlOVCBvZmZzZXQpOwotSU5UIEJjbU1ha2VGbGFzaENTQWN0aXZlKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgVUlOVCBvZmZzZXQpOwotSU5UIFJlYWREU0RTaWduYXR1cmUoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBGTEFTSDJYX1NFQ1RJT05fVkFMIGRzZCk7Ci1JTlQgUmVhZERTRFByaW9yaXR5KFBNSU5JX0FEQVBURVIgQWRhcHRlciwgRkxBU0gyWF9TRUNUSU9OX1ZBTCBkc2QpOwotRkxBU0gyWF9TRUNUSU9OX1ZBTCBnZXRIaWdoZXN0UHJpRFNEKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7Ci1JTlQgUmVhZElTT1NpZ25hdHVyZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIEZMQVNIMlhfU0VDVElPTl9WQUwgaXNvKTsKLUlOVCBSZWFkSVNPUHJpb3JpdHkoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBGTEFTSDJYX1NFQ1RJT05fVkFMIGlzbyk7Ci1GTEFTSDJYX1NFQ1RJT05fVkFMIGdldEhpZ2hlc3RQcmlJU08oUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKLUlOVCBXcml0ZVRvRmxhc2hXaXRob3V0U2VjdG9yRXJhc2UoUE1JTklfQURBUFRFUiBBZGFwdGVyLAotCQkJCQkJCQkJCVBVSU5UIHBCdWZmLAotCQkJCQkJCQkJCUZMQVNIMlhfU0VDVElPTl9WQUwgZUZsYXNoMnhTZWN0aW9uVmFsLAotCQkJCQkJCQkJCVVJTlQgdWlPZmZzZXQsCi0JCQkJCQkJCQkJVUlOVCB1aU51bUJ5dGVzCi0JCQkJCQkJCQkJKTsKIAotLy9VSU5UIGdldE51bU9mU3ViU2VjdGlvbldpdGhXUlBlcm1pc3NvbihQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFNFQ1RJT05fVFlQRSBzZWNUeXBlKTsKLUJPT0xFQU4gSXNTZWN0aW9uRXhpc3RJbkZsYXNoKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgRkxBU0gyWF9TRUNUSU9OX1ZBTCBzZWN0aW9uKTsKLUlOVCBJc1NlY3Rpb25Xcml0YWJsZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIEZMQVNIMlhfU0VDVElPTl9WQUwgU2VjdGlvbik7Ci1JTlQgQ29ycnVwdERTRFNpZyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIEZMQVNIMlhfU0VDVElPTl9WQUwgZUZsYXNoMnhTZWN0aW9uVmFsKTsKLUlOVCBDb3JydXB0SVNPU2lnKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgRkxBU0gyWF9TRUNUSU9OX1ZBTCBlRmxhc2gyeFNlY3Rpb25WYWwpOwogQk9PTEVBTiBJc05vbkNETGVzc0RldmljZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwogCiAKQEAgLTMwMCw3ICsyMDYsNiBAQAogaW50IHdybWFsdFdpdGhMb2NrIChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFVJTlQgdWlBZGRyZXNzLCBQVUlOVCBwdWNCdWZmLCBzaXplX3Qgc1NpemUpOwogaW50IHJkbWFsdFdpdGhMb2NrIChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFVJTlQgdWlBZGRyZXNzLCBQVUlOVCBwdWNCdWZmLCBzaXplX3Qgc1NpemUpOwogCi1pbnQgcmRtV2l0aExvY2soUE1JTklfQURBUFRFUiBBZGFwdGVyLCBVSU5UIHVpQWRkcmVzcywgUENIQVIgcHVjQnVmZiwgc2l6ZV90IHNpemUpOwogaW50IHdybVdpdGhMb2NrKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgVUlOVCB1aUFkZHJlc3MsIFBDSEFSIHB1Y0J1ZmYsIHNpemVfdCBzaXplKTsKIElOVCBidWZmRG5sZFZlcmlmeShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIHVuc2lnbmVkIGNoYXIgKm1hcHBlZGJ1ZmZlciwgdW5zaWduZWQgaW50IHUzMkZpcm13YXJlTGVuZ3RoLAogCQl1bnNpZ25lZCBsb25nIHUzMlN0YXJ0aW5nQWRkcmVzcyk7CkBAIC0zMDksMTEgKzIxNCw2IEBACiBWT0lEIHB1dFVzYlN1c3BlbmQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIEJPT0xFQU4gSXNSZXFHcGlvSXNMZWRJbk5WTShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFVJTlQgZ3Bpb3MpOwogCi0jaWZkZWYgQkNNX1NITV9JTlRFUkZBQ0UKLUlOVCBiZWNlZW1fdmlydHVhbF9kZXZpY2VfaW5pdCh2b2lkKTsKLVZPSUQgdmlydHVhbF9tYWlsX2JveF9pbnRlcnJ1cHQodm9pZCk7Ci1JTlQgYmVjZWVtX3ZpcnR1YWxfZGV2aWNlX2V4aXQodm9pZCk7Ci0jZW5kaWYKIAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vUW9zLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL1Fvcy5jCmluZGV4IDc1YjJiODcuLjhjZTQ1MzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vUW9zLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9Rb3MuYwpAQCAtNCwxNSArNCwxNCBAQAogKi8KICNpbmNsdWRlICJoZWFkZXJzLmgiCiAKLUJPT0xFQU4gTWF0Y2hTcmNJcEFkZHJlc3MoU19DTEFTU0lGSUVSX1JVTEUgKnBzdENsYXNzaWZpZXJSdWxlLFVMT05HIHVsU3JjSVApOwotQk9PTEVBTiBNYXRjaFRvcyhTX0NMQVNTSUZJRVJfUlVMRSAqcHN0Q2xhc3NpZmllclJ1bGUsVUNIQVIgdWNUeXBlT2ZTZXJ2aWNlKTsKLUJPT0xFQU4gTWF0Y2hTcmNQb3J0KFNfQ0xBU1NJRklFUl9SVUxFICpwc3RDbGFzc2lmaWVyUnVsZSxVU0hPUlQgdXNoU3JjUG9ydCk7Ci1CT09MRUFOIE1hdGNoRGVzdFBvcnQoU19DTEFTU0lGSUVSX1JVTEUgKnBzdENsYXNzaWZpZXJSdWxlLFVTSE9SVCB1c2hEZXN0UG9ydCk7Ci1CT09MRUFOIE1hdGNoUHJvdG9jb2woU19DTEFTU0lGSUVSX1JVTEUgKnBzdENsYXNzaWZpZXJSdWxlLFVDSEFSIHVjUHJvdG9jb2wpOwotQk9PTEVBTiBNYXRjaERlc3RJcEFkZHJlc3MoU19DTEFTU0lGSUVSX1JVTEUgKnBzdENsYXNzaWZpZXJSdWxlLFVMT05HIHVsRGVzdElQKTsKLVVTSE9SVCBDbGFzc2lmeVBhY2tldChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsc3RydWN0IHNrX2J1ZmYqIHNrYik7Ci12b2lkIEVUaENTR2V0UGt0SW5mbyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIsUFZPSUQgcHZFdGhQYXlsb2FkLFBTX0VUSENTX1BLVF9JTkZPIHBzdEV0aENzUGt0SW5mbyk7Ci1CT09MRUFOIEVUaENTQ2xhc3NpZnlQa3QoUE1JTklfQURBUFRFUiBBZGFwdGVyLHN0cnVjdCBza19idWZmKiBza2IsUFNfRVRIQ1NfUEtUX0lORk8gcHN0RXRoQ3NQa3RJbmZvLFNfQ0xBU1NJRklFUl9SVUxFICpwc3RDbGFzc2lmaWVyUnVsZSwgQl9VSU5UOCBFdGhDU0N1cHBvcnQpOworc3RhdGljIHZvaWQgRVRoQ1NHZXRQa3RJbmZvKFBNSU5JX0FEQVBURVIgQWRhcHRlcixQVk9JRCBwdkV0aFBheWxvYWQsUFNfRVRIQ1NfUEtUX0lORk8gcHN0RXRoQ3NQa3RJbmZvKTsKK3N0YXRpYyBCT09MRUFOIEVUaENTQ2xhc3NpZnlQa3QoUE1JTklfQURBUFRFUiBBZGFwdGVyLHN0cnVjdCBza19idWZmKiBza2IsUFNfRVRIQ1NfUEtUX0lORk8gcHN0RXRoQ3NQa3RJbmZvLFNfQ0xBU1NJRklFUl9SVUxFICpwc3RDbGFzc2lmaWVyUnVsZSwgQl9VSU5UOCBFdGhDU0N1cHBvcnQpOworCitzdGF0aWMgVVNIT1JUCUlwVmVyc2lvbjQoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBzdHJ1Y3QgaXBoZHIgKmlwaGQsCisJCQkgICBTX0NMQVNTSUZJRVJfUlVMRSAqcHN0Q2xhc3NpZmllclJ1bGUgKTsKKworc3RhdGljIFZPSUQgUHJ1bmVRdWV1ZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIElOVCBpSW5kZXgpOworCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEZ1bmN0aW9uICAgIC0gTWF0Y2hTcmNJcEFkZHJlc3MoKQpAQCAtMjA1LDExICsyMDQsMTAgQEAKIENvbXBhcmVzIElQVjQgSXAgYWRkcmVzcyBhbmQgcG9ydCBudW1iZXIKIEByZXR1cm4gUXVldWUgSW5kZXguCiAqLwotVVNIT1JUCUlwVmVyc2lvbjQoUE1JTklfQURBUFRFUiBBZGFwdGVyLCAvKio8IFBvaW50ZXIgdG8gdGhlIGRyaXZlciBjb250cm9sIHN0cnVjdHVyZSAqLwotCQkJCQlzdHJ1Y3QgaXBoZHIgKmlwaGQsIC8qKjxQb2ludGVyIHRvIHRoZSBJUCBIZHIgb2YgdGhlIHBhY2tldCovCi0JCQkJCVNfQ0xBU1NJRklFUl9SVUxFICpwc3RDbGFzc2lmaWVyUnVsZSApCitzdGF0aWMgVVNIT1JUCUlwVmVyc2lvbjQoUE1JTklfQURBUFRFUiBBZGFwdGVyLAorCQkJICAgc3RydWN0IGlwaGRyICppcGhkLAorCQkJICAgU19DTEFTU0lGSUVSX1JVTEUgKnBzdENsYXNzaWZpZXJSdWxlICkKIHsKLQkvL0lQSGVhZGVyRm9ybWF0IAkJKnBJcEhlYWRlcj1OVUxMOwogCXhwb3J0aGRyICAgICAJCSp4cHJ0X2hkcj1OVUxMOwogCUJPT0xFQU4JYkNsYXNzaWZpY2F0aW9uU3VjY2VlZD1GQUxTRTsKIApAQCAtMjYxLDE1ICsyNTksNiBAQAogCQkvL2lmIHByb3RvY29sIGlzIG5vdCBUQ1Agb3IgVURQIHRoZW4gbm8gbmVlZCBvZiBjb21wYXJpbmcgc291cmNlIHBvcnQgYW5kIGRlc3RpbmF0aW9uIHBvcnQKIAkJaWYoaXBoZC0+cHJvdG9jb2whPVRDUCAmJiBpcGhkLT5wcm90b2NvbCE9VURQKQogCQkJYnJlYWs7Ci0jaWYgMAotCQkvL2NoZWNrIGlmIG1lbW9yeSBpcyBhdmFpbGFibGUgb2Ygc3JjIGFuZCBEZXN0IHBvcnQKLQkJaWYoRVRIX0FORF9JUF9IRUFERVJfTEVOICsgTDRfU1JDX1BPUlRfTEVOICsgTDRfREVTVF9QT1JUX0xFTiA+IFBhY2tldC0+bGVuKQotCQl7Ci0JCQkvL1RoaXMgaXMgbm90IGFuIGVycm9uZW91cyBjb25kaXRpb24gYW5kIHBrdCB3aWxsIGJlIGNoZWNrZWQgZm9yIG5leHQgY2xhc3NpZmljYXRpb24uCi0JCQliQ2xhc3NpZmljYXRpb25TdWNjZWVkID0gRkFMU0U7Ci0JCQlicmVhazsKLQkJfQotI2VuZGlmCiAJCS8vKioqKioqKioqKioqKioqKioqQ2hlY2tpbmcgVHJhbnNwb3J0IExheWVyIEhlYWRlciBmaWVsZCBpZiBwcmVzZW50ICoqKioqKioqKioqKioqKioqLy8KIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIElQVjRfREJHLCBEQkdfTFZMX0FMTCwgIlNvdXJjZSBQb3J0ICUwNHgiLAogCQkJKGlwaGQtPnByb3RvY29sPT1VRFApP3hwcnRfaGRyLT51aGRyLnNvdXJjZTp4cHJ0X2hkci0+dGhkci5zb3VyY2UpOwpAQCAtMzEyLDI5ICszMDEsNiBAQAogCiAJcmV0dXJuIGJDbGFzc2lmaWNhdGlvblN1Y2NlZWQ7CiB9Ci0vKioKLUBpbmdyb3VwIHR4X2Z1bmN0aW9ucwotQHJldHVybiAgUXVldWUgSW5kZXggYmFzZWQgb24gcHJpb3JpdHkuCi0qLwotVVNIT1JUIEdldFBhY2tldFF1ZXVlSW5kZXgoUE1JTklfQURBUFRFUiBBZGFwdGVyLCAvKio8UG9pbnRlciB0byB0aGUgZHJpdmVyIGNvbnRyb2wgc3RydWN0dXJlICovCi0JCQkJCQkJCXN0cnVjdCBza19idWZmKiBQYWNrZXQgLyoqPCBQb2ludGVyIHRvIHRoZSBQYWNrZXQgdG8gYmUgc2VudCovCi0JCQkJCQkJCSkKLXsKLQlVU0hPUlQJCQl1c0luZGV4PS0xOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBRVUVVRV9JTkRFWCwgREJHX0xWTF9BTEwsICI9PT09PT4iKTsKLQotCWlmKE5VTEw9PUFkYXB0ZXIgfHwgTlVMTD09UGFja2V0KQotCXsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFFVRVVFX0lOREVYLCBEQkdfTFZMX0FMTCwgIkdvdCBOVUxMIFZhbHVlczw9PT09PT0iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXVzSW5kZXggPSBDbGFzc2lmeVBhY2tldChBZGFwdGVyLFBhY2tldCk7Ci0KLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgUVVFVUVfSU5ERVgsIERCR19MVkxfQUxMLCAiR290IFF1ZXVlIEluZGV4ICV4Iix1c0luZGV4KTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgUVVFVUVfSU5ERVgsIERCR19MVkxfQUxMLCAiR2V0UGFja2V0UXVldWVJbmRleCA8PT09PT09PT09PT09PT0iKTsKLQlyZXR1cm4gdXNJbmRleDsKLX0KIAogVk9JRCBQcnVuZVF1ZXVlQWxsU0YoUE1JTklfQURBUFRFUiBBZGFwdGVyKQogewpAQCAtMzU3LDIzICszMjMsMjEgQEAKIGRyb3BzIHBhY2tldHMgZnJvbSB0aGUgSGVhZCB0aWxsIHRoZSBudW1iZXIgb2YgYnl0ZXMgaXMKIGxlc3MgdGhhbiBvciBlcXVhbCB0byBtYXggcXVldWUgc2l6ZSBmb3IgdGhlIHF1ZXVlLgogKi8KLVZPSUQgUHJ1bmVRdWV1ZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsLyoqPFBvaW50ZXIgdG8gdGhlIGRyaXZlciBjb250cm9sIHN0cnVjdHVyZSovCi0JCQkJCUlOVCBpSW5kZXgvKio8UXVldWUgSW5kZXgqLwotCQkJCQkpCitzdGF0aWMgVk9JRCBQcnVuZVF1ZXVlKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgSU5UIGlJbmRleCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiogUGFja2V0VG9Ecm9wPU5VTEw7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMqICBuZXRzdGF0cz1OVUxMOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuZXRzdGF0czsKIAogCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBQUlVORV9RVUVVRSwgREJHX0xWTF9BTEwsICI9PT09PT4gSW5kZXggJWQiLGlJbmRleCk7CiAKICAgIAlpZihpSW5kZXggPT0gSGlQcmlvcml0eSkKLSAgICAgICAJcmV0dXJuOworCQlyZXR1cm47CiAKIAlpZighQWRhcHRlciB8fCAoaUluZGV4IDwgMCkgfHwgKGlJbmRleCA+IEhpUHJpb3JpdHkpKQogCQlyZXR1cm47CiAKIAkvKiBUbyBTdG9yZSB0aGUgbmV0ZGV2aWNlIHN0YXRpc3RpYyAqLwotCW5ldHN0YXRzID0gJigoUExJTlVYX0RFUF9EQVRBKUFkYXB0ZXItPnB2T3NEZXBEYXRhKS0+bmV0c3RhdHM7CisJbmV0c3RhdHMgPSAmQWRhcHRlci0+ZGV2LT5zdGF0czsKIAogCXNwaW5fbG9ja19iaCgmQWRhcHRlci0+UGFja0luZm9baUluZGV4XS5TRlF1ZXVlTG9jayk7CiAKQEAgLTM5NSw5ICszNTksMTMgQEAKIAogCQlpZihQYWNrZXRUb0Ryb3ApCiAJCXsKLQkJCWlmKG5ldHN0YXRzKQotCQkJCW5ldHN0YXRzLT50eF9kcm9wcGVkKys7Ci0JCQlhdG9taWNfaW5jKCZBZGFwdGVyLT5UeERyb3BwZWRQYWNrZXRDb3VudCk7CisJCQlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICp0eHEgPSBuZXRkZXZfZ2V0X3R4X3F1ZXVlKEFkYXB0ZXItPmRldiwgaUluZGV4KTsKKwkJCWlmIChuZXRpZl9tc2dfdHhfZXJyKEFkYXB0ZXIpKQorCQkJCXByX2luZm8oUEZYICIlczogdHggcXVldWUgJWQgb3ZlcmxpbWl0XG4iLCAKKwkJCQkJQWRhcHRlci0+ZGV2LT5uYW1lLCBpSW5kZXgpOworCisJCQl0eHEtPnR4X2Ryb3BwZWQrKzsKKwogCQkJREVRVUVVRVBBQ0tFVChBZGFwdGVyLT5QYWNrSW5mb1tpSW5kZXhdLkZpcnN0VHhRdWV1ZSwKIAkJCQkJCUFkYXB0ZXItPlBhY2tJbmZvW2lJbmRleF0uTGFzdFR4UXVldWUpOwogCQkJLy8vIHVwZGF0ZSBjdXJyZW50IGJ5dGVzIGFuZCBwYWNrZXRzIGNvdW50CkBAIC00MDcsNyArMzc1LDcgQEAKIAkJCS8vLyB1cGRhdGUgZHJvcHBlZCBieXRlcyBhbmQgcGFja2V0cyBjb3VudHMKIAkJCUFkYXB0ZXItPlBhY2tJbmZvW2lJbmRleF0udWlEcm9wcGVkQ291bnRCeXRlcyArPSBQYWNrZXRUb0Ryb3AtPmxlbjsKIAkJCUFkYXB0ZXItPlBhY2tJbmZvW2lJbmRleF0udWlEcm9wcGVkQ291bnRQYWNrZXRzKys7Ci0JCQliY21fa2ZyZWVfc2tiKFBhY2tldFRvRHJvcCk7CisJCQlkZXZfa2ZyZWVfc2tiKFBhY2tldFRvRHJvcCk7CiAKIAkJfQogCkBAIC00MTYsNyArMzg0LDYgQEAKIAkJCUFkYXB0ZXItPlBhY2tJbmZvW2lJbmRleF0udWlEcm9wcGVkQ291bnRQYWNrZXRzKTsKIAogCQlhdG9taWNfZGVjKCZBZGFwdGVyLT5Ub3RhbFBhY2tldENvdW50KTsKLQkJQWRhcHRlci0+YmNtX2ppZmZpZXMgPSBqaWZmaWVzOwogCX0KIAogCXNwaW5fdW5sb2NrX2JoKCZBZGFwdGVyLT5QYWNrSW5mb1tpSW5kZXhdLlNGUXVldWVMb2NrKTsKQEAgLTQzMCwxNiArMzk3LDE1IEBACiB7CiAJSU5UCQlpUUluZGV4OwogCVVJTlQJdWlUb3RhbFBhY2tldExlbmd0aDsKLQlzdHJ1Y3Qgc2tfYnVmZioJCQkJUGFja2V0VG9Ecm9wPU5VTEw7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMqICAJbmV0c3RhdHM9TlVMTDsKKwlzdHJ1Y3Qgc2tfYnVmZioJCQlQYWNrZXRUb0Ryb3A9TlVMTDsKIAogCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwgIj09PT09PiIpOwotCS8qIFRvIFN0b3JlIHRoZSBuZXRkZXZpY2Ugc3RhdGlzdGljICovCi0JbmV0c3RhdHMgPSAmKChQTElOVVhfREVQX0RBVEEpQWRhcHRlci0+cHZPc0RlcERhdGEpLT5uZXRzdGF0czsKIAogLy8JZG93bigmQWRhcHRlci0+ZGF0YV9wYWNrZXRfcXVldWVfbG9jayk7CiAJZm9yKGlRSW5kZXg9TG93UHJpb3JpdHk7IGlRSW5kZXg8SGlQcmlvcml0eTsgaVFJbmRleCsrKQogCXsKKwkJc3RydWN0IG5ldGRldl9xdWV1ZSAqdHhxID0gbmV0ZGV2X2dldF90eF9xdWV1ZShBZGFwdGVyLT5kZXYsIGlRSW5kZXgpOworCiAJCXNwaW5fbG9ja19iaCgmQWRhcHRlci0+UGFja0luZm9baVFJbmRleF0uU0ZRdWV1ZUxvY2spOwogCQl3aGlsZShBZGFwdGVyLT5QYWNrSW5mb1tpUUluZGV4XS5GaXJzdFR4UXVldWUpCiAJCXsKQEAgLTQ0Nyw4ICs0MTMsNyBAQAogCQkJaWYoUGFja2V0VG9Ecm9wKQogCQkJewogCQkJCXVpVG90YWxQYWNrZXRMZW5ndGggPSBQYWNrZXRUb0Ryb3AtPmxlbjsKLQkJCQluZXRzdGF0cy0+dHhfZHJvcHBlZCsrOwotCQkJCWF0b21pY19pbmMoJkFkYXB0ZXItPlR4RHJvcHBlZFBhY2tldENvdW50KTsKKwkJCQl0eHEtPnR4X2Ryb3BwZWQrKzsKIAkJCX0KIAkJCWVsc2UKIAkJCQl1aVRvdGFsUGFja2V0TGVuZ3RoID0gMDsKQEAgLTQ1Nyw3ICs0MjIsNyBAQAogCQkJCQkJQWRhcHRlci0+UGFja0luZm9baVFJbmRleF0uTGFzdFR4UXVldWUpOwogCiAJCQkvKiBGcmVlIHRoZSBza2IgKi8KLQkJCWJjbV9rZnJlZV9za2IoUGFja2V0VG9Ecm9wKTsKKwkJCWRldl9rZnJlZV9za2IoUGFja2V0VG9Ecm9wKTsKIAogCQkJLy8vIHVwZGF0ZSBjdXJyZW50IGJ5dGVzIGFuZCBwYWNrZXRzIGNvdW50CiAJCQlBZGFwdGVyLT5QYWNrSW5mb1tpUUluZGV4XS51aUN1cnJlbnRCeXRlc09uSG9zdCAtPSB1aVRvdGFsUGFja2V0TGVuZ3RoOwpAQCAtNTU5LDEyICs1MjQsNiBAQAogCiAJZm9yKHVpTG9vcEluZGV4ID0gTUFYX0NMQVNTSUZJRVJTIC0gMTsgdWlMb29wSW5kZXggPj0gMDsgdWlMb29wSW5kZXgtLSkKIAl7Ci0JCWlmIChBZGFwdGVyLT5kZXZpY2VfcmVtb3ZlZCkKLQkJewotCQkJYkNsYXNzaWZpY2F0aW9uU3VjY2VlZCA9IEZBTFNFOwotCQkJYnJlYWs7Ci0JCX0KLQogCQlpZihiQ2xhc3NpZmljYXRpb25TdWNjZWVkKQogCQkJYnJlYWs7CiAJCS8vSXRlcmF0ZSB0aHJvdWdoIGFsbCBjbGFzc2lmaWVycyB3aGljaCBhcmUgYWxyZWFkeSBpbiBvcmRlciBvZiBwcmlvcml0eQpAQCAtODEwLDcgKzc2OSwxMCBAQAogfQogCiAKLUJPT0xFQU4gRVRoQ1NDbGFzc2lmeVBrdChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsc3RydWN0IHNrX2J1ZmYqIHNrYixQU19FVEhDU19QS1RfSU5GTyBwc3RFdGhDc1BrdEluZm8sU19DTEFTU0lGSUVSX1JVTEUgKnBzdENsYXNzaWZpZXJSdWxlLCBCX1VJTlQ4IEV0aENTQ3VwcG9ydCkKK3N0YXRpYyBCT09MRUFOIEVUaENTQ2xhc3NpZnlQa3QoUE1JTklfQURBUFRFUiBBZGFwdGVyLHN0cnVjdCBza19idWZmKiBza2IsCisJCQkJUFNfRVRIQ1NfUEtUX0lORk8gcHN0RXRoQ3NQa3RJbmZvLAorCQkJCVNfQ0xBU1NJRklFUl9SVUxFICpwc3RDbGFzc2lmaWVyUnVsZSwKKwkJCQlCX1VJTlQ4IEV0aENTQ3VwcG9ydCkKIHsKIAlCT09MRUFOIGJDbGFzc2lmaWNhdGlvblN1Y2NlZWQgPSBGQUxTRTsKIAliQ2xhc3NpZmljYXRpb25TdWNjZWVkID0gRXRoQ1NNYXRjaFNyY01BQ0FkZHJlc3MocHN0Q2xhc3NpZmllclJ1bGUsKChFVEhfSEVBREVSX1NUUlVDICopKHNrYi0+ZGF0YSkpLT5hdThTb3VyY2VBZGRyZXNzKTsKQEAgLTg0MCw5ICs4MDIsMTEgQEAKIAlyZXR1cm4gYkNsYXNzaWZpY2F0aW9uU3VjY2VlZDsKIH0KIAotdm9pZCBFVGhDU0dldFBrdEluZm8oUE1JTklfQURBUFRFUiBBZGFwdGVyLFBWT0lEIHB2RXRoUGF5bG9hZCxQU19FVEhDU19QS1RfSU5GTyBwc3RFdGhDc1BrdEluZm8pCitzdGF0aWMgdm9pZCBFVGhDU0dldFBrdEluZm8oUE1JTklfQURBUFRFUiBBZGFwdGVyLFBWT0lEIHB2RXRoUGF5bG9hZCwKKwkJCSAgICBQU19FVEhDU19QS1RfSU5GTyBwc3RFdGhDc1BrdEluZm8pCiB7CiAJVVNIT1JUIHUxNkV0eXBlID0gbnRvaHMoKChFVEhfSEVBREVSX1NUUlVDKilwdkV0aFBheWxvYWQpLT51MTZFdHlwZSk7CisKIAlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfVFgsIElQVjRfREJHLCBEQkdfTFZMX0FMTCwgICJFdGhDU0dldFBrdEluZm8gOiBFdGggSGRyIFR5cGUgOiAlWFxuIix1MTZFdHlwZSk7CiAJaWYodTE2RXR5cGUgPiAweDVkYykKIAl7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvYmNtL1RPRE8KaW5kZXggMzY2NjM0Yi4uY2QzZTlmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9UT0RPCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vVE9ETwpAQCAtMSwxNSArMSwyMiBAQAorVGhpcyBkcml2ZXIgaXMgYmFyZWx5IGZ1bmN0aW9uYWwgaW4gaXRzIGN1cnJlbnQgc3RhdGUuCisKK0JJRzoKKwktIGV4aXN0aW5nIEFQSSBpcyAoL2Rldi90YXJhbmcpIHNob3VsZCBiZSByZXBsYWNlZAorCSAgSXMgaXQgcG9zc2libGUgdG8gdXNlIHNhbWUgQVBJIGFzIEludGVsIFdpbWF4IHN0YWNrIGFuZAorCSAgaGF2ZSBzYW1lIHVzZXIgbGV2ZWwgY29tcG9uZW50cy4KKwktIFFvcyBhbmQgcXVldWUgbW9kZWwgaXMgbm9uLXN0YW5kYXJkIGFuZCBpbmZsZXhpYmxlLgorCSAgVXNlIGV4aXN0aW5nIFRDIFFvcz8KKwogVE9ETzoKKwktIHN1cHBvcnQgbW9yZSB0aGFuIG9uZSBib2FyZCAtIGVsaW1pbmF0ZSBnbG9iYWwgdmFyaWFibGVzCisJLSByZW1vdmUgZGV2ZWxvcGVyIGRlYnVnIEJDTV9ERUJVRygpIG1hY3JvcworCSAgYWRkIGEgbGltaXRlZCBudW1iZXIgb2YgbWVzc2FnZXMgdGhyb3VnaCBuZXRpZl9tc2coKQogCS0gZml4IG5vbi1zdGFuZGFyZCBrZXJuZWwgc3R5bGUKLQktIHNwYXJzZSB3YXJuaW5ncwogCS0gY2hlY2twYXRjaCB3YXJuaW5ncwotICAgCS0gcmVtb3ZlIGNvbXBhdGlhYmxpdHkgY29kZSBmb3Igb2xkZXIga2VybmVscwotCS0gcmVtb3ZlICNpZmRlZidzCi0JLSBmaXggYm9ndXMgZGV2aWNlIG5hbWVpbmcgYW5kIHJlZmVyZW5jZSBjb3VudGluZyAoc2VlIGJjbV9ub3RpZnlfZXZlbnQpCi0JLSBmaXggdXNlIG9mIGZpbGUgSS9PIHRvIGxvYWQgY29uZmlnCi0JLSByZXF1ZXN0IGZpcm13YXJlCi0JLSB1cGRhdGUgdG8gY3VycmVudCBuZXR3b3JrIGRldmljZSBBUEkKLQktIG1lcmdlIHNvbWUgZmlsZXMgdG9nZXRoZXIKKwktIHVzZSByZXF1ZXN0IGZpcm13YXJlCisJLSBmaXggdXNlIG9mIGZpbGUgSS9PIHRvIGxvYWQgY29uZmlnIHdpdGggYmV0dGVyIEFQSQorCS0gbWVyZ2Ugc29tZSBmaWxlcyB0b2dldGhlcj8KIAktIGNsZWFudXAvZWxpbWluYXRlIGRlYnVnIG1lc3NhZ2VzCiAKLQktIGludGVncmF0ZSB3aXRoIGV4aXN0aW5nIFdpbWF4IHN0YWNrPworCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vVHJhbnNtaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vVHJhbnNtaXQuYwppbmRleCAxMmY5ZTEzLi4wZjcwMDA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL1RyYW5zbWl0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9UcmFuc21pdC5jCkBAIC02LDcgKzYsNyBAQAogZGlncmFwaCB0cmFuc21pdDEgewogbm9kZVtzaGFwZT1ib3hdCiBlZGdlW3dlaWdodD01O2NvbG9yPXJlZF0KLWJjbV90cmFuc21pdC0+cmVwbHlfdG9fYXJwX3JlcXVlc3RbbGFiZWw9IkFSUCJdCisKIGJjbV90cmFuc21pdC0+R2V0UGFja2V0UXVldWVJbmRleFtsYWJlbD0iSVAgUGFja2V0Il0KIEdldFBhY2tldFF1ZXVlSW5kZXgtPklwVmVyc2lvbjRbbGFiZWw9IklQVjQiXQogR2V0UGFja2V0UXVldWVJbmRleC0+SXBWZXJzaW9uNltsYWJlbD0iSVBWNiJdCkBAIC0zNSwxNjkgKzM1LDE2IEBACiAKICNpbmNsdWRlICJoZWFkZXJzLmgiCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEZ1bmN0aW9uICAgIC0JYmNtX3RyYW5zbWl0KCkKLSoKLSogRGVzY3JpcHRpb24gLSBUaGlzIGlzIHRoZSBtYWluIHRyYW5zbWl0IGZ1bmN0aW9uIGZvciBvdXIgdmlydHVhbAotKgkJCQlpbnRlcmZhY2UodmV0aDApLiBJdCBoYW5kbGVzIHRoZSBBUlAgcGFja2V0cy4gSXQKLSoJCQkJY2xvbmVzIHRoaXMgcGFja2V0IGFuZCB0aGVuIFF1ZXVlIGl0IHRvIGEgc3VpdGFibGUKLSogCQkgCQlRdWV1ZS4gVGhlbiBjYWxscyB0aGUgdHJhbnNtaXRfcGFja2V0KCkuCi0qCi0qIFBhcmFtZXRlciAgIC0JIHNrYiAtIFBvaW50ZXIgdG8gdGhlIHNvY2tldCBidWZmZXIgc3RydWN0dXJlCi0qCQkJCSBkZXYgLSBQb2ludGVyIHRvIHRoZSB2aXJ0dWFsIG5ldCBkZXZpY2Ugc3RydWN0dXJlCi0qCi0qIFJldHVybnMgICAgIC0JIHplcm8gKHN1Y2Nlc3MpIG9yIC12ZSB2YWx1ZSAoZmFpbHVyZSkKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotSU5UIGJjbV90cmFuc21pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAJCS8qKjwgc2tiICovCi0JCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgCS8qKjwgbmV0IGRldmljZSBwb2ludGVyICovCi0JCQkJCSkKLXsKLQlQTUlOSV9BREFQVEVSICAgICAgCUFkYXB0ZXIgPSBOVUxMOwotCVVTSE9SVAkJCQlxaW5kZXg9MDsKLQlzdHJ1Y3QgdGltZXZhbCB0djsKLQlVSU5UCQlwa3RfdHlwZSA9IDA7Ci0JVUlOVCAJCWNhbGx0cmFuc21pdCA9IDA7Ci0KLQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX1RYLCBUWF9PU0FMX0RCRywgREJHX0xWTF9BTEwsICJcbiVzPT09PT5cbiIsX19GVU5DVElPTl9fKTsKLQotCW1lbXNldCgmdHYsIDAsIHNpemVvZih0dikpOwotCS8qIENoZWNrIGZvciB2YWxpZCBwYXJhbWV0ZXJzICovCi0JaWYoc2tiID09IE5VTEwgfHwgZGV2PT1OVUxMKQotCXsKLQkgICAgQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9UWCxUWF9PU0FMX0RCRywgREJHX0xWTF9BTEwsICJHb3QgTlVMTCBza2Igb3IgZGV2XG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JQWRhcHRlciA9IEdFVF9CQ01fQURBUFRFUihkZXYpOwotCWlmKCFBZGFwdGVyKQotCXsKLQkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9UWCwgVFhfT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiR290IEludmFsaWQgQWRhcHRlclxuIik7Ci0gIAkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmKEFkYXB0ZXItPmRldmljZV9yZW1vdmVkID09IFRSVUUgfHwgIUFkYXB0ZXItPkxpbmtVcFN0YXR1cykKLQl7Ci0JCWlmKCFuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpIHsKLQkJCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOwotCQkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKLQkJfQotCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7Ci0JfQotCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfVFgsIFRYX09TQUxfREJHLCBEQkdfTFZMX0FMTCwgIlBhY2tldCBzaXplIDogJWRcbiIsIHNrYi0+bGVuKTsKLQotCS8qQWRkIEV0aGVybmV0IENTIGNoZWNrIGhlcmUqLwotCWlmKEFkYXB0ZXItPlRyYW5zZmVyTW9kZSA9PSBJUF9QQUNLRVRfT05MWV9NT0RFICkKLQl7Ci0gICAgICAgIHBrdF90eXBlID0gbnRvaHMoKihQVVNIT1JUKShza2ItPmRhdGEgKyAxMikpOwotCQkvKiBHZXQgdGhlIHF1ZXVlIGluZGV4IHdoZXJlIHRoZSBwYWNrZXQgaXMgdG8gYmUgcXVldWVkICovCi0JCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfVFgsIFRYX09TQUxfREJHLCBEQkdfTFZMX0FMTCwgIkdldHRpbmcgdGhlIFF1ZXVlIEluZGV4Li4uLi4iKTsKLQotCQlxaW5kZXggPSBHZXRQYWNrZXRRdWV1ZUluZGV4KEFkYXB0ZXIsc2tiKTsKLQotCQlpZigoU0hPUlQpSU5WQUxJRF9RVUVVRV9JTkRFWD09KFNIT1JUKXFpbmRleCkKLQkJewotCQkJaWYocGt0X3R5cGUgPT0gRVRIX0FSUF9GUkFNRSkKLQkJCXsKLQkJCQkvKgotCQkJCVJlcGx5IGRpcmVjdGx5IHRvIEFSUCByZXF1ZXN0IHBhY2tldAotCQkJCUFSUCBTcG9vZmluZyBvbmx5IGlmIE5PIEVUSCBDUyBydWxlIG1hdGNoZXMgZm9yIGl0Ci0JCQkJKi8KLQkJCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRYX09TQUxfREJHLCBEQkdfTFZMX0FMTCwiQVJQIE9QQ09ERSA9ICUwMngiLAotCi0gICAgICAgICAgICAgICAgKCooUFVDSEFSKShza2ItPmRhdGEgKyAyMSkpKTsKLQotICAgICAgICAgICAgICAgIHJlcGx5X3RvX2FycF9yZXF1ZXN0KHNrYik7Ci0KLSAgICAgICAgICAgICAgICBCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX1RYLFRYX09TQUxfREJHLCBEQkdfTFZMX0FMTCwiQWZ0ZXIgcmVwbHlfdG9fYXJwX3JlcXVlc3QgXG4iKTsKLQotCQkJfQotCQkJZWxzZQotCQkJewotICAgICAgICAgICAgICAgIEJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfVFgsIFRYX09TQUxfREJHLCBEQkdfTFZMX0FMTCwKLSAgICAJCQkiSW52YWxpZCBxdWV1ZSBpbmRleCwgZHJvcHBpbmcgcGt0XG4iKTsKLQotCQkJCWJjbV9rZnJlZV9za2Ioc2tiKTsKLQkJCX0KLQkJCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKLSAgICAgICAgfQotCi0JCWlmKEFkYXB0ZXItPlBhY2tJbmZvW3FpbmRleF0udWlDdXJyZW50UGFja2V0c09uSG9zdCA+PSBTRl9NQVhfQUxMT1dFRF9QQUNLRVRTX1RPX0JBQ0tVUCkKLQkJewotCQkJYXRvbWljX2luYygmQWRhcHRlci0+VHhEcm9wcGVkUGFja2V0Q291bnQpOwotCQkJYmNtX2tmcmVlX3NrYihza2IpOwotCQkJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwotCQl9Ci0KLQkJLyogTm93IEVucXVldWUgdGhlIHBhY2tldCAqLwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgTkVYVF9TRU5ELCBEQkdfTFZMX0FMTCwgImJjbV90cmFuc21pdCBFbnF1ZXVlaW5nIHRoZSBQYWNrZXQgVG8gUXVldWUgJWQiLHFpbmRleCk7Ci0JCXNwaW5fbG9jaygmQWRhcHRlci0+UGFja0luZm9bcWluZGV4XS5TRlF1ZXVlTG9jayk7Ci0JCUFkYXB0ZXItPlBhY2tJbmZvW3FpbmRleF0udWlDdXJyZW50Qnl0ZXNPbkhvc3QgKz0gc2tiLT5sZW47Ci0JCUFkYXB0ZXItPlBhY2tJbmZvW3FpbmRleF0udWlDdXJyZW50UGFja2V0c09uSG9zdCsrOwotCi0JCSooKEJfVUlOVDMyICopc2tiLT5jYiArIFNLQl9DQl9MQVRFTkNZX09GRlNFVCApID0gamlmZmllczsKLQkJRU5RVUVVRVBBQ0tFVChBZGFwdGVyLT5QYWNrSW5mb1txaW5kZXhdLkZpcnN0VHhRdWV1ZSwKLSAgCSAgICAgICAgICAgICAgICAgIEFkYXB0ZXItPlBhY2tJbmZvW3FpbmRleF0uTGFzdFR4UXVldWUsIHNrYik7Ci0JCWF0b21pY19pbmMoJkFkYXB0ZXItPlRvdGFsUGFja2V0Q291bnQpOwotCQlzcGluX3VubG9jaygmQWRhcHRlci0+UGFja0luZm9bcWluZGV4XS5TRlF1ZXVlTG9jayk7Ci0JCWRvX2dldHRpbWVvZmRheSgmdHYpOwotCi0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBUWF9PU0FMX0RCRywgREJHX0xWTF9BTEwsIkVOUTogXG4iKTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRYX09TQUxfREJHLCBEQkdfTFZMX0FMTCwgIlBrdCBMZW4gPSAlZCwgc2VjOiAlbGQsIHVzZWM6ICVsZFxuIiwKLQkJKHNrYi0+bGVuLUVUSF9ITEVOKSwgdHYudHZfc2VjLCB0di50dl91c2VjKTsKLQotI2lmZGVmIEJDTV9TSE1fSU5URVJGQUNFCi0JCXNwaW5fbG9jaygmQWRhcHRlci0+dHh0cmFuc21pdGxvY2spOwotCQlpZihBZGFwdGVyLT50eHRyYW5zbWl0X3J1bm5pbmcgPT0gMCkKLQkJewotCQkJQWRhcHRlci0+dHh0cmFuc21pdF9ydW5uaW5nID0gMTsKLQkJCWNhbGx0cmFuc21pdCA9IDE7Ci0JCX0KLQkJZWxzZQotCQkJY2FsbHRyYW5zbWl0ID0gMDsKLQotCQlzcGluX3VubG9jaygmQWRhcHRlci0+dHh0cmFuc21pdGxvY2spOwotI2VuZGlmCi0JCWlmKGNhbGx0cmFuc21pdCA9PSAxKQotCQkJdHJhbnNtaXRfcGFja2V0cyhBZGFwdGVyKTsKLQkJZWxzZQotCQl7Ci0JCQlpZighYXRvbWljX3JlYWQoJkFkYXB0ZXItPlR4UGt0QXZhaWwpKQotCQkJewotCQkJCWF0b21pY19zZXQoJkFkYXB0ZXItPlR4UGt0QXZhaWwsIDEpOwotI2lmZGVmIEJDTV9TSE1fSU5URVJGQUNFCi0JCQkJdmlydHVhbF9tYWlsX2JveF9pbnRlcnJ1cHQoKTsKLSNlbmRpZgotCQkJCXdha2VfdXAoJkFkYXB0ZXItPnR4X3BhY2tldF93YWl0X3F1ZXVlKTsKLQkJCX0KLQkJfQotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgVFhfT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiPD09PT0iKTsKLQl9Ci0JZWxzZQotCQliY21fa2ZyZWVfc2tiKHNrYik7Ci0KLSAgcmV0dXJuIFNUQVRVU19TVUNDRVNTOwotfQotCiAKIC8qKgogQGluZ3JvdXAgY3RybF9wa3RfZnVuY3Rpb25zCiBUaGlzIGZ1bmN0aW9uIGRpc3BhdGNoZXMgY29udHJvbCBwYWNrZXQgdG8gdGhlIGgvdyBpbnRlcmZhY2UKIEByZXR1cm4gemVybyhzdWNjZXNzKSBvciAtdmUgdmFsdWUoZmFpbHVyZSkKICovCi1JTlQgU2VuZENvbnRyb2xQYWNrZXQoUE1JTklfQURBUFRFUiBBZGFwdGVyLCAvKio8TG9naWNhbCBBZGFwdGVyKi8KLQkJCQkJCQljaGFyICpwQ29udHJvbFBhY2tldC8qKjxDb250cm9sIFBhY2tldCovCi0JCQkJCQkJKQorSU5UIFNlbmRDb250cm9sUGFja2V0KFBNSU5JX0FEQVBURVIgQWRhcHRlciwgY2hhciAqcENvbnRyb2xQYWNrZXQpCiB7Ci0JUExFQURFUiBQTGVhZGVyID0gTlVMTDsKLQlzdHJ1Y3QgdGltZXZhbCB0djsKLQltZW1zZXQoJnR2LCAwLCBzaXplb2YodHYpKTsKKwlQTEVBREVSIFBMZWFkZXIgPSAoUExFQURFUilwQ29udHJvbFBhY2tldDsKIAotCi0KLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgVFhfQ09OVFJPTCwgREJHX0xWTF9BTEwsICI9PT09PT09PT4iKTsKLQotCVBMZWFkZXI9KFBMRUFERVIpcENvbnRyb2xQYWNrZXQ7CiAJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRYX0NPTlRST0wsIERCR19MVkxfQUxMLCAiVHgiKTsKIAlpZighcENvbnRyb2xQYWNrZXQgfHwgIUFkYXB0ZXIpCiAJewpAQCAtMjA4LDEyICs1NSw2IEBACiAJCSgoUExlYWRlci0+UExlbmd0aC0xKS9NQVhfREVWSUNFX0RFU0NfU0laRSkrMSkpCiAgICAgewogICAgIAlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgVFhfQ09OVFJPTCwgREJHX0xWTF9BTEwsICJOTyBGUkVFIERFU0NSSVBUT1JTIFRPIFNFTkQgQ09OVFJPTCBQQUNLRVQiKTsKLSAgICAgICAJaWYoQWRhcHRlci0+YmNtX2ppZmZpZXMgPT0gMCkKLSAgICAgICAgewotICAgICAgICAJQWRhcHRlci0+YmNtX2ppZmZpZXMgPSBqaWZmaWVzOwotICAgICAgICAgICAgQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRYX0NPTlRST0wsIERCR19MVkxfQUxMLCAiVVBEQVRFRCBUSU1FKGhleCk6ICVsdSIsCi0JCQkJQWRhcHRlci0+YmNtX2ppZmZpZXMpOwotICAgICAgICB9CiAgICAgICAgIHJldHVybiBTVEFUVVNfRkFJTFVSRTsKICAgICB9CiAKQEAgLTIyNCw3NiArNjUsMzMgQEAKIAlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgVFhfQ09OVFJPTCwgREJHX0xWTF9BTEwsICJMZWFkZXIgTGVuZ3RoOiAleCIsUExlYWRlci0+UExlbmd0aCk7CiAJaWYoQWRhcHRlci0+ZGV2aWNlX3JlbW92ZWQpCiAJCXJldHVybiAwOwotI2lmbmRlZiBCQ01fU0hNX0lOVEVSRkFDRQorCisJaWYgKG5ldGlmX21zZ19wa3RkYXRhKEFkYXB0ZXIpKQorCQlwcmludF9oZXhfZHVtcChLRVJOX0RFQlVHLCBQRlggInR4IGNvbnRyb2w6ICIsIERVTVBfUFJFRklYX05PTkUsCisJCQkgICAgICAgMTYsIDEsIHBDb250cm9sUGFja2V0LCBQTGVhZGVyLT5QTGVuZ3RoICsgTEVBREVSX1NJWkUsIDApOworCiAJQWRhcHRlci0+aW50ZXJmYWNlX3RyYW5zbWl0KEFkYXB0ZXItPnB2SW50ZXJmYWNlQWRhcHRlciwKIAkJCQkJcENvbnRyb2xQYWNrZXQsIChQTGVhZGVyLT5QTGVuZ3RoICsgTEVBREVSX1NJWkUpKTsKLSNlbHNlCi0JdHhfcGt0c190b19maXJtd2FyZShwQ29udHJvbFBhY2tldCwoUExlYWRlci0+UExlbmd0aCArIExFQURFUl9TSVpFKSwxKTsKIAotCWlmKFBMZWFkZXItPlN0YXR1cz09SURMRV9NRVNTQUdFKQotCXsKLQkJaWYoKChDT05UUk9MX01FU1NBR0UqKVBMZWFkZXIpLT5zekRhdGFbMF0gPT0gR09fVE9fSURMRV9NT0RFX1BBWUxPQUQgJiYKLQkJKChDT05UUk9MX01FU1NBR0UqKVBMZWFkZXIpLT5zekRhdGFbMV0gPT0gVEFSR0VUX0NBTl9HT19UT19JRExFX01PREUpCi0JCXsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBUWF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgIklkbGUgTW9kZSBBY2sgU2VudCB0byB0aGUgRGV2aWNlXG4iKTsKLSAgICAgICAgCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBUWF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgIkhvc3QgRW50ZXJpbmcgaW50byBJZGxlIE1vZGVcbiIpOwotCQkJZG9fZ2V0dGltZW9mZGF5KCZ0dik7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgVFhfQ09OVFJPTCwgREJHX0xWTF9BTEwsICJJZGxlTW9kZSBNc2cgc2VudCB0byBmL3cgYXQgdGltZSA6JWxkIG1zIiwgdHYudHZfc2VjICoxMDAwICsgdHYudHZfdXNlYyAvMTAwMCk7Ci0JCQlpZihBZGFwdGVyLT5iRG9TdXNwZW5kICE9IFRSVUUpCi0JCQl7Ci0JCQkJQWRhcHRlci0+SWRsZU1vZGUgPSBUUlVFOwotCQkJCUFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPSBGQUxTRSA7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYoKFBMZWFkZXItPlN0YXR1cyA9PSBMSU5LX1VQX0NPTlRST0xfUkVRKSAmJgotCQkoKFBVQ0hBUilwQ29udHJvbFBhY2tldClbc2l6ZW9mKExFQURFUildID09IExJTktfVVBfQUNLICYmCi0JCSgoUFVDSEFSKXBDb250cm9sUGFja2V0KVtzaXplb2YoTEVBREVSKSsxXSA9PQotCQkJCQkJCQlMSU5LX1NIVVRET1dOX1JFUV9GUk9NX0ZJUk1XQVJFICAmJgotCQkoKFBVQ0hBUilwQ29udHJvbFBhY2tldClbc2l6ZW9mKExFQURFUikrMl0gPT0gU0hVVERPV05fQUNLX0ZST01fRFJJVkVSKQotCXsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRYX0NPTlRST0wsIERCR19MVkxfQUxMLCAiU2h1dCBEb3duIEFDSyBTZW50IGFuZCBIb3N0IGVudGVyaW5nIFNodXQgU3RhdGUgXG4iKTsKLQkJaWYoQWRhcHRlci0+YkRvU3VzcGVuZCAhPSBUUlVFKQotCQl7Ci0JCQlBZGFwdGVyLT5iU2h1dFN0YXR1cyA9IFRSVUU7Ci0JCQlBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID0gRkFMU0U7Ci0JCQlBZGFwdGVyLT5iVHJpZWRUb1dha2VVcEZyb21sb3dQb3dlck1vZGUgPSBGQUxTRTsKLQkJfQotCi0JfQotI2VuZGlmCi0KLQkoKFBMSU5VWF9ERVBfREFUQSlBZGFwdGVyLT5wdk9zRGVwRGF0YSktPm5ldHN0YXRzLnR4X3BhY2tldHMrKzsKLQkoKFBMSU5VWF9ERVBfREFUQSlBZGFwdGVyLT5wdk9zRGVwRGF0YSktPm5ldHN0YXRzLnR4X2J5dGVzKz0KLQkJCVBMZWFkZXItPlBMZW5ndGg7CiAJYXRvbWljX2RlYygmQWRhcHRlci0+Q3Vyck51bUZyZWVUeERlc2MpOwogCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBUWF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgIjw9PT09PT09PT0iKTsKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9Ci1zdGF0aWMJTEVBREVSIExlYWRlcj17MH07CisKIC8qKgogQGluZ3JvdXAgdHhfZnVuY3Rpb25zCiBUaGlzIGZ1bmN0aW9uIGRlc3BhdGNoZXMgdGhlIElQIHBhY2tldHMgd2l0aCB0aGUgZ2l2ZW4gdmNpZAogdG8gdGhlIHRhcmdldCB2aWEgdGhlIGhvc3QgaC93IGludGVyZmFjZS4KIEByZXR1cm4gIHplcm8oc3VjY2Vzcykgb3IgLXZlIHZhbHVlKGZhaWx1cmUpCiAqLwotSU5UIFNldHVwTmV4dFNlbmQoUE1JTklfQURBUFRFUiBBZGFwdGVyLCAvKio8TG9naWNhbCBBZGFwdGVyKi8KLQkJCQkJc3RydWN0IHNrX2J1ZmYgKlBhY2tldCwgLyoqPGRhdGEgYnVmZmVyKi8KLQkJCQkJVVNIT1JUIFZjaWQpCQkJLyoqPFZDSUQgZm9yIHRoaXMgcGFja2V0Ki8KK0lOVCBTZXR1cE5leHRTZW5kKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgIHN0cnVjdCBza19idWZmICpQYWNrZXQsIFVTSE9SVCBWY2lkKQogewogCWludAkJc3RhdHVzPTA7Ci0jaWZkZWYgR0RNQV9JTlRFUkZBQ0UKLQlpbnQgZG9udGZyZWUgPSAwOwotI2VuZGlmCiAJQk9PTEVBTiBiSGVhZGVyU3VwcmVzc2lvbkVuYWJsZWQgPSBGQUxTRTsKIAlCX1VJTlQxNiAgICAgICAgICAgIHVpQ2xhc3NpZmllclJ1bGVJRDsKLQlpbnQgUXVldWVJbmRleCA9IE5PX09GX1FVRVVFUyArIDE7CisJdTE2CVF1ZXVlSW5kZXggPSBza2JfZ2V0X3F1ZXVlX21hcHBpbmcoUGFja2V0KTsKKwlMRUFERVIgTGVhZGVyPXswfTsKIAotCWlmKCFBZGFwdGVyIHx8ICFQYWNrZXQpCi0JewotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgTkVYVF9TRU5ELCBEQkdfTFZMX0FMTCwgIkdvdCBOVUxMIEFkYXB0ZXIgb3IgUGFja2V0Iik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KIAlpZihQYWNrZXQtPmxlbiA+IE1BWF9ERVZJQ0VfREVTQ19TSVpFKQogCXsKIAkJc3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CkBAIC0zMDIsMTQgKzEwMCwxMCBAQAogCiAJLyogR2V0IHRoZSBDbGFzc2lmaWVyIFJ1bGUgSUQgKi8KIAl1aUNsYXNzaWZpZXJSdWxlSUQgPSAqKChVSU5UMzIqKSAoUGFja2V0LT5jYikrU0tCX0NCX0NMQVNTSUZJQ0FUSU9OX09GRlNFVCk7Ci0JUXVldWVJbmRleCA9IFNlYXJjaFZjaWQoIEFkYXB0ZXIsVmNpZCk7Ci0JaWYoUXVldWVJbmRleCA8IE5PX09GX1FVRVVFUykKLQl7Ci0JCWJIZWFkZXJTdXByZXNzaW9uRW5hYmxlZCA9Ci0JCQlBZGFwdGVyLT5QYWNrSW5mb1tRdWV1ZUluZGV4XS5iSGVhZGVyU3VwcHJlc3Npb25FbmFibGVkOwotCQliSGVhZGVyU3VwcmVzc2lvbkVuYWJsZWQgPQotCQkJYkhlYWRlclN1cHJlc3Npb25FbmFibGVkICYgQWRhcHRlci0+YlBIU0VuYWJsZWQ7Ci0JfQorCisJYkhlYWRlclN1cHJlc3Npb25FbmFibGVkID0gQWRhcHRlci0+UGFja0luZm9bUXVldWVJbmRleF0uYkhlYWRlclN1cHByZXNzaW9uRW5hYmxlZAorCQkmIEFkYXB0ZXItPmJQSFNFbmFibGVkOworCiAJaWYoQWRhcHRlci0+ZGV2aWNlX3JlbW92ZWQpCiAJCXsKIAkJc3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CkBAIC0zMjcsMTUgKzEyMSwxMCBAQAogCiAJTGVhZGVyLlZjaWQJPSBWY2lkOwogCi0gICAgaWYoVENQX0FDSyA9PSAqKChVSU5UMzIqKSAoUGFja2V0LT5jYikgKyBTS0JfQ0JfVENQQUNLX09GRlNFVCApKQotCXsKLSAgICAgICAgQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIE5FWFRfU0VORCwgREJHX0xWTF9BTEwsICJTZW5kaW5nIFRDUCBBQ0tcbiIpOworCWlmKFRDUF9BQ0sgPT0gKigoVUlOVDMyKikgKFBhY2tldC0+Y2IpICsgU0tCX0NCX1RDUEFDS19PRkZTRVQgKSkKIAkJTGVhZGVyLlN0YXR1cyA9IExFQURFUl9TVEFUVVNfVENQX0FDSzsKLQl9CiAJZWxzZQotCXsKIAkJTGVhZGVyLlN0YXR1cyA9IExFQURFUl9TVEFUVVM7Ci0JfQogCiAJaWYoQWRhcHRlci0+UGFja0luZm9bUXVldWVJbmRleF0uYkV0aENTU3VwcG9ydCkKIAl7CkBAIC0zNTEsNjggKzE0MCw1MyBAQAogCQlza2JfcHVzaChQYWNrZXQsIExFQURFUl9TSVpFKTsKIAkJbWVtY3B5KFBhY2tldC0+ZGF0YSwgJkxlYWRlciwgTEVBREVSX1NJWkUpOwogCX0KLQogCWVsc2UKIAl7CiAJCUxlYWRlci5QTGVuZ3RoID0gUGFja2V0LT5sZW4gLSBFVEhfSExFTjsKIAkJbWVtY3B5KChMRUFERVIqKXNrYl9wdWxsKFBhY2tldCwgKEVUSF9ITEVOIC0gTEVBREVSX1NJWkUpKSwgJkxlYWRlciwgTEVBREVSX1NJWkUpOwogCX0KIAotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBORVhUX1NFTkQsIERCR19MVkxfQUxMLCAiUGFja2V0LT5sZW4gPSAlZCIsIFBhY2tldC0+bGVuKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgTkVYVF9TRU5ELCBEQkdfTFZMX0FMTCwgIlZjaWQgPSAlZCIsIFZjaWQpOwotCi0jaWZuZGVmIEJDTV9TSE1fSU5URVJGQUNFCiAJc3RhdHVzID0gQWRhcHRlci0+aW50ZXJmYWNlX3RyYW5zbWl0KEFkYXB0ZXItPnB2SW50ZXJmYWNlQWRhcHRlciwKIAkJCVBhY2tldC0+ZGF0YSwgKExlYWRlci5QTGVuZ3RoICsgTEVBREVSX1NJWkUpKTsKLSNlbHNlCi0Jc3RhdHVzID0gdHhfcGt0c190b19maXJtd2FyZShQYWNrZXQsUGFja2V0LT5sZW4sMCk7Ci0jZW5kaWYKIAlpZihzdGF0dXMpCiAJewotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgTkVYVF9TRU5ELCBEQkdfTFZMX0FMTCwgIlR4IEZhaWxlZC4uXG4iKTsKKwkJKytBZGFwdGVyLT5kZXYtPnN0YXRzLnR4X2Vycm9yczsKKwkJaWYgKG5ldGlmX21zZ190eF9lcnIoQWRhcHRlcikpCisJCQlwcl9pbmZvKFBGWCAiJXM6IHRyYW5zbWl0IGVycm9yICVkXG4iLCBBZGFwdGVyLT5kZXYtPm5hbWUsCisJCQkJc3RhdHVzKTsKIAl9CiAJZWxzZQogCXsKKwkJc3RydWN0IG5ldGRldl9xdWV1ZSAqdHhxID0gbmV0ZGV2X2dldF90eF9xdWV1ZShBZGFwdGVyLT5kZXYsIFF1ZXVlSW5kZXgpOwogCQlBZGFwdGVyLT5QYWNrSW5mb1tRdWV1ZUluZGV4XS51aVRvdGFsVHhCeXRlcyArPSBMZWFkZXIuUExlbmd0aDsKLQkJYXRvbWljX2FkZChMZWFkZXIuUExlbmd0aCwgJkFkYXB0ZXItPkdvb2RUeEJ5dGVDb3VudCk7Ci0JCWF0b21pY19pbmMoJkFkYXB0ZXItPlR4VG90YWxQYWNrZXRDb3VudCk7Ci0jaWZkZWYgR0RNQV9JTlRFUkZBQ0UKLSAgICBkb250ZnJlZSA9IDE7Ci0jZW5kaWYKLQl9CiAKLQlhdG9taWNfZGVjKCZBZGFwdGVyLT5DdXJyTnVtRnJlZVR4RGVzYyk7CisJCXR4cS0+dHhfYnl0ZXMgKz0gTGVhZGVyLlBMZW5ndGg7CisJCSsrdHhxLT50eF9wYWNrZXRzOwogCi1lcnJFeGl0OgotCi0JaWYoU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzKQotCXsKIAkJQWRhcHRlci0+UGFja0luZm9bUXVldWVJbmRleF0udWlDdXJyZW50VG9rZW5Db3VudCAtPSBMZWFkZXIuUExlbmd0aCA8PCAzOwogCQlBZGFwdGVyLT5QYWNrSW5mb1tRdWV1ZUluZGV4XS51aVNlbnRCeXRlcyArPSAoUGFja2V0LT5sZW4pOwogCQlBZGFwdGVyLT5QYWNrSW5mb1tRdWV1ZUluZGV4XS51aVNlbnRQYWNrZXRzKys7CiAJCUFkYXB0ZXItPlBhY2tJbmZvW1F1ZXVlSW5kZXhdLk51bU9mUGFja2V0c1NlbnQrKzsKIAogCQlhdG9taWNfZGVjKCZBZGFwdGVyLT5QYWNrSW5mb1tRdWV1ZUluZGV4XS51aVBlclNGVHhSZXNvdXJjZUNvdW50KTsKLSNpZmRlZiBCQ01fU0hNX0lOVEVSRkFDRQotCQlpZihhdG9taWNfcmVhZCgmQWRhcHRlci0+UGFja0luZm9bUXVldWVJbmRleF0udWlQZXJTRlR4UmVzb3VyY2VDb3VudCkgPCAwKQotCQl7Ci0JCQlhdG9taWNfc2V0KCZBZGFwdGVyLT5QYWNrSW5mb1tRdWV1ZUluZGV4XS51aVBlclNGVHhSZXNvdXJjZUNvdW50LCAwKTsKLQkJfQotI2VuZGlmCiAJCUFkYXB0ZXItPlBhY2tJbmZvW1F1ZXVlSW5kZXhdLnVpVGhpc1BlcmlvZFNlbnRCeXRlcyArPSBMZWFkZXIuUExlbmd0aDsKIAl9CiAKKwlhdG9taWNfZGVjKCZBZGFwdGVyLT5DdXJyTnVtRnJlZVR4RGVzYyk7CiAKLSNpZmRlZiBHRE1BX0lOVEVSRkFDRQotICBpZighZG9udGZyZWUpewotICAJYmNtX2tmcmVlX3NrYihQYWNrZXQpOwotICB9Ci0jZWxzZQotICAJYmNtX2tmcmVlX3NrYihQYWNrZXQpOwotI2VuZGlmCitlcnJFeGl0OgorCisJZGV2X2tmcmVlX3NrYihQYWNrZXQpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKK3N0YXRpYyBpbnQgdHhfcGVuZGluZyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCit7CisJcmV0dXJuIChhdG9taWNfcmVhZCgmQWRhcHRlci0+VHhQa3RBdmFpbCkKKwkJJiYgTUlOSU1VTV9QRU5ESU5HX0RFU0NSSVBUT1JTIDwgYXRvbWljX3JlYWQoJkFkYXB0ZXItPkN1cnJOdW1GcmVlVHhEZXNjKSkKKwkJfHwgQWRhcHRlci0+ZGV2aWNlX3JlbW92ZWQgfHwgKDEgPT0gQWRhcHRlci0+ZG93bmxvYWRERFIpOworfQorCiAvKioKIEBpbmdyb3VwIHR4X2Z1bmN0aW9ucwogVHJhbnNtaXQgdGhyZWFkCkBAIC00MjAsNTcgKzE5NCwyNiBAQAogaW50IHR4X3BrdF9oYW5kbGVyKFBNSU5JX0FEQVBURVIgQWRhcHRlciAgLyoqPCBwb2ludGVyIHRvIGFkYXB0ZXIgb2JqZWN0Ki8KIAkJCQkpCiB7Ci0jaWZuZGVmIEJDTV9TSE1fSU5URVJGQUNFCiAJaW50IHN0YXR1cyA9IDA7Ci0jZW5kaWYKIAotCVVJTlQgY2FsbHRyYW5zbWl0ID0gMTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgVFhfUEFDS0VUUywgREJHX0xWTF9BTEwsICJFbnRyaW5nIHRvIHdhaXQgZm9yIHNpZ25hbCBmcm9tIHRoZSBpbnRlcnJ1cHQgc2VydmljZSB0aHJlYWQhQWRhcHRlciA9ICVwIixBZGFwdGVyKTsKLQotCi0Jd2hpbGUoMSkKLQl7Ci0JCWlmKEFkYXB0ZXItPkxpbmtVcFN0YXR1cyl7CisJd2hpbGUoISBrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKKwkJLyogRklYTUUgLSB0aGUgdGltZW91dCBsb29rcyBsaWtlIHdvcmthcm91bmQgZm9yIHJhY2V5IHVzYWdlIG9mIFR4UGt0QXZhaWwgKi8KKwkJaWYoQWRhcHRlci0+TGlua1VwU3RhdHVzKQogCQkJd2FpdF9ldmVudF90aW1lb3V0KEFkYXB0ZXItPnR4X3BhY2tldF93YWl0X3F1ZXVlLAotCQkJCSgoYXRvbWljX3JlYWQoJkFkYXB0ZXItPlR4UGt0QXZhaWwpICYmCi0JCQkJKE1JTklNVU1fUEVORElOR19ERVNDUklQVE9SUyA8Ci0JCQkJYXRvbWljX3JlYWQoJkFkYXB0ZXItPkN1cnJOdW1GcmVlVHhEZXNjKSkgJiYKLQkJCQkoQWRhcHRlci0+ZGV2aWNlX3JlbW92ZWQgPT0gRkFMU0UpKSkgfHwKLQkJCQkoMSA9PSBBZGFwdGVyLT5kb3dubG9hZEREUikgfHwga3RocmVhZF9zaG91bGRfc3RvcCgpCi0jaWZuZGVmIEJDTV9TSE1fSU5URVJGQUNFCi0JCQkJfHwgKFRSVUUgPT0gQWRhcHRlci0+YkVuZFBvaW50SGFsdGVkKQotI2VuZGlmCi0JCQkJLCBtc2Vjc190b19qaWZmaWVzKDEwKSk7Ci0JCX0KLQkJZWxzZXsKLQkJCXdhaXRfZXZlbnQoQWRhcHRlci0+dHhfcGFja2V0X3dhaXRfcXVldWUsCi0JCQkJKChhdG9taWNfcmVhZCgmQWRhcHRlci0+VHhQa3RBdmFpbCkgJiYKLQkJCQkoTUlOSU1VTV9QRU5ESU5HX0RFU0NSSVBUT1JTIDwKLQkJCQlhdG9taWNfcmVhZCgmQWRhcHRlci0+Q3Vyck51bUZyZWVUeERlc2MpKSAmJgotCQkJCShBZGFwdGVyLT5kZXZpY2VfcmVtb3ZlZCA9PSBGQUxTRSkpKSB8fAotCQkJCSgxID09IEFkYXB0ZXItPmRvd25sb2FkRERSKSB8fCBrdGhyZWFkX3Nob3VsZF9zdG9wKCkKLSNpZm5kZWYgQkNNX1NITV9JTlRFUkZBQ0UKLQkJCQl8fCAoVFJVRSA9PSBBZGFwdGVyLT5iRW5kUG9pbnRIYWx0ZWQpCi0jZW5kaWYKLQkJCQkpOwotCQl9CisJCQkJCSAgIHR4X3BlbmRpbmcoQWRhcHRlciksIG1zZWNzX3RvX2ppZmZpZXMoMTApKTsKKwkJZWxzZQorCQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKEFkYXB0ZXItPnR4X3BhY2tldF93YWl0X3F1ZXVlLAorCQkJCQkJIHR4X3BlbmRpbmcoQWRhcHRlcikpOwogCi0JCWlmKGt0aHJlYWRfc2hvdWxkX3N0b3AoKSB8fCBBZGFwdGVyLT5kZXZpY2VfcmVtb3ZlZCkKLQkJewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRYX1BBQ0tFVFMsIERCR19MVkxfQUxMLCAiRXhpdGluZyB0aGUgdHggdGhyZWFkLi5cbiIpOwotCQkJQWRhcHRlci0+dHJhbnNtaXRfcGFja2V0X3RocmVhZCA9IE5VTEw7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0jaWZuZGVmIEJDTV9TSE1fSU5URVJGQUNFCisJCWlmIChBZGFwdGVyLT5kZXZpY2VfcmVtb3ZlZCkKKwkJCWJyZWFrOwogCiAJCWlmKEFkYXB0ZXItPmRvd25sb2FkRERSID09IDEpCiAJCXsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBUWF9QQUNLRVRTLCBEQkdfTFZMX0FMTCwgIkRvd25sb2FkaW5nIEREUiBTZXR0aW5nc1xuIik7CiAJCQlBZGFwdGVyLT5kb3dubG9hZEREUiArPTE7CiAJCQlzdGF0dXMgPSBkb3dubG9hZF9kZHJfc2V0dGluZ3MoQWRhcHRlcik7CiAJCQlpZihzdGF0dXMpCi0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRYX1BBQ0tFVFMsIERCR19MVkxfQUxMLCAiRERSIERPV05MT0FEIEZBSUxFRCFcbiIpOworCQkJCXByX2VycihQRlggIkREUiBET1dOTE9BRCBGQUlMRUQhICVkXG4iLCBzdGF0dXMpOwogCQkJY29udGludWU7CiAJCX0KIApAQCAtNDg5LDcgKzIzMiw2IEBACiAJCQkJdXBkYXRlX3Blcl9zZl9kZXNjX2NudHMoQWRhcHRlcik7CiAJCQl9CiAJCX0KLSNlbmRpZgogCiAJCWlmKCBhdG9taWNfcmVhZCgmQWRhcHRlci0+Q3Vyck51bUZyZWVUeERlc2MpICYmCiAJCQlBZGFwdGVyLT5MaW5rU3RhdHVzID09IFNZTkNfVVBfUkVRVUVTVCAmJgpAQCAtNTA3LDQ5ICsyNDksMTIgQEAKIAkJCQl3YWtlX3VwKCZBZGFwdGVyLT5wcm9jZXNzX3J4X2NudHJscGt0KTsKIAkJfQogCi0jaWZkZWYgQkNNX1NITV9JTlRFUkZBQ0UKLQkJc3Bpbl9sb2NrX2JoKCZBZGFwdGVyLT50eHRyYW5zbWl0bG9jayk7Ci0JCWlmKEFkYXB0ZXItPnR4dHJhbnNtaXRfcnVubmluZyA9PSAwKQotCQl7Ci0JCQlBZGFwdGVyLT50eHRyYW5zbWl0X3J1bm5pbmcgPSAxOwotCQkJY2FsbHRyYW5zbWl0ID0gMTsKLQkJfQotCQllbHNlCi0JCQljYWxsdHJhbnNtaXQgPSAwOwotCQlzcGluX3VubG9ja19iaCgmQWRhcHRlci0+dHh0cmFuc21pdGxvY2spOwotI2VuZGlmCi0KLQkJaWYoY2FsbHRyYW5zbWl0KQotCQkJdHJhbnNtaXRfcGFja2V0cyhBZGFwdGVyKTsKKwkJdHJhbnNtaXRfcGFja2V0cyhBZGFwdGVyKTsKIAogCQlhdG9taWNfc2V0KCZBZGFwdGVyLT5UeFBrdEF2YWlsLCAwKTsKIAl9CisKKwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgVFhfUEFDS0VUUywgREJHX0xWTF9BTEwsICJFeGl0aW5nIHRoZSB0eCB0aHJlYWQuLlxuIik7CisJQWRhcHRlci0+dHJhbnNtaXRfcGFja2V0X3RocmVhZCA9IE5VTEw7CiAJcmV0dXJuIDA7CiB9Ci0KLSNpZmRlZiBCQ01fU0hNX0lOVEVSRkFDRQotZXh0ZXJuIFBNSU5JX0FEQVBURVIgcHNBZGFwdGVydGVzdDsKLXZvaWQgIHZpcnR1YWxfbWFpbF9ib3hfaW50ZXJydXB0KHZvaWQpCi17Ci0KLSNpZm5kZWYgR0RNQV9JTlRFUkZBQ0UKLQlQVUlOVCBwdHIgPSAgKFBVSU5UKUNQRV9WSVJUVUFMX01BSUxCT1hfUkVHOwotCVVJTlQgaW50dmFsID0gKFVJTlQpKCgqcHRyICYgMHhGRjAwKSA+PiA4KTsKLQlpZiAoaW50dmFsICE9IDApCi0JewotCQlhdG9taWNfc2V0KCZwc0FkYXB0ZXJ0ZXN0LT5DdXJyTnVtRnJlZVR4RGVzYywJaW50dmFsKTsKLQkJYXRvbWljX3NldCAoJnBzQWRhcHRlcnRlc3QtPnVpTUJ1cGRhdGUsIFRSVUUpOwotCi0JCS8vbWFrZSBpdCB0byAwCi0JCSpwdHIgPSAqcHRyICYgMHhmZmZmMDBmZjsKLQl9Ci0jZW5kaWYKLX0KLXVuc2lnbmVkIGludCB0b3RhbF90eF9wa3RzX3BlbmRpbmcodm9pZCkKLXsKLQlyZXR1cm4gYXRvbWljX3JlYWQoJnBzQWRhcHRlcnRlc3QtPlRvdGFsUGFja2V0Q291bnQpOwotfQotCi0jZW5kaWYKLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL2NudHJsX1NpZ25hbGluZ0ludGVyZmFjZS5oIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9jbnRybF9TaWduYWxpbmdJbnRlcmZhY2UuaAppbmRleCA0Y2JlMzAwLi44OTA3Nzg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL2NudHJsX1NpZ25hbGluZ0ludGVyZmFjZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vY250cmxfU2lnbmFsaW5nSW50ZXJmYWNlLmgKQEAgLTIsMTkgKzIsNiBAQAogI2RlZmluZSBDTlRSTF9TSUdOQUxJTkdfSU5URVJGQUNFXwogCiAKLSNpZmRlZiBCRUNFRU1fVEFSR0VUCi0KLSNpbmNsdWRlIDxtYWNfY29tbW9uLmg+Ci0jaW5jbHVkZSA8bXNnX0RzYS5oPgotI2luY2x1ZGUgPG1zZ19Ec2MuaD4KLSNpbmNsdWRlIDxtc2dfRHNkLmg+Ci0jaW5jbHVkZSA8c2NoX2RlZmluaXRpb25zLmg+Ci11c2luZyBuYW1lc3BhY2UgQmVjZWVtOwotI2lmZGVmIEVOQUJMRV9DT1JSSUdFTkRVTTJfVVBEQVRFCi1leHRlcm4gQl9VSU5UMzIgZ191MzJDb3JyMk1hY0ZsYWdzOwotI2VuZGlmCi0KLSNlbHNlCiAKIAogI2RlZmluZSBEU0FfUkVRIDExCkBAIC0yOCw3ICsxNSw2IEBACiAjZGVmaW5lIERTRF9BQ0sgMTkKICNkZWZpbmUgTUFYX0NMQVNTSUZJRVJTX0lOX1NGICA0CiAKLSNlbmRpZgogCiAjZGVmaW5lIE1BWF9TVFJJTkdfTEVOIDIwCiAjZGVmaW5lIE1BWF9QSFNfTEVOR1RIUyAyNTUKQEAgLTU3LDM3ICs0Myw3IEBACiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9zdHJ1Y3R1cmUgRGVmaW5pdGlvbnMvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vLyBcYnJpZWYgY2xhc3MgY0NQYWNrZXRDbGFzc2lmaWNhdGlvblJ1bGUKLSNpZmRlZiBCRUNFRU1fVEFSR0VUCi1jbGFzcyBDQ1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZVNJewotCXB1YmxpYzoKLQkJLy8vIFxicmllZiBDb25zdHJ1Y3RvciBmb3IgdGhlIGNsYXNzCi0JQ0NQYWNrZXRDbGFzc2lmaWNhdGlvblJ1bGVTSSgpOgotCQl1OENsYXNzaWZpZXJSdWxlUHJpb3JpdHkobUNsYXNzaWZpZXJSdWxlUHJpb3JpdHkpLAotCQl1OElQVHlwZU9mU2VydmljZUxlbmd0aChtSVBUeXBlT2ZTZXJ2aWNlKSwKLQkJdThQcm90b2NvbChtUHJvdG9jb2wpLAotCQl1OElQTWFza2VkU291cmNlQWRkcmVzc0xlbmd0aCgwKSwKLQkJdThJUERlc3RpbmF0aW9uQWRkcmVzc0xlbmd0aCgwKSwKLQkJdThQcm90b2NvbFNvdXJjZVBvcnRSYW5nZUxlbmd0aCgwKSwKLQkJdThQcm90b2NvbERlc3RQb3J0UmFuZ2VMZW5ndGgoMCksCi0JCXU4RXRoZXJuZXREZXN0TWFjQWRkcmVzc0xlbmd0aCgwKSwKLQkJdThFdGhlcm5ldFNvdXJjZU1BQ0FkZHJlc3NMZW5ndGgoMCksCi0JCXU4RXRoZXJ0eXBlTGVuZ3RoKDApLAotCQl1MTZVc2VyUHJpb3JpdHkobVVzZXJQcmlvcml0eSksCi0JCXUxNlZMQU5JRChtVkxBTklEKSwKLQkJdThBc3NvY2lhdGVkUEhTSShtQXNzb2NpYXRlZFBIU0kpLAotCQl1MTZQYWNrZXRDbGFzc2lmaWNhdGlvblJ1bGVJbmRleChtUGFja2V0Q2xhc3NpZmllclJ1bGVJbmRleCksCi0JCXU4VmVuZG9yU3BlY2lmaWNDbGFzc2lmaWVyUGFyYW1MZW5ndGgobVZlbmRvclNwZWNpZmljQ2xhc3NpZmllclBhcmFtTGVuZ3RoKSwKLQkJdThJUHY2Rmxvd0xhYmxlTGVuZ3RoKG1JUHY2Rmxvd0xhYmxlTGVuZ3RoKSwKLQkJdThDbGFzc2lmaWVyQWN0aW9uUnVsZShtQ2xhc3NpZmllckFjdGlvblJ1bGUpCi0KLQkJe30KLSAgICAgICAgICAgICAgdm9pZCBSZXNldCgpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ0NQYWNrZXRDbGFzc2lmaWNhdGlvblJ1bGVTSSgpOwotICAgICAgICAgICAgICB9Ci0jZWxzZQogc3RydWN0IF9zdENQYWNrZXRDbGFzc2lmaWNhdGlvblJ1bGVTSXsKLSNlbmRpZgogCiAJLyoqICAxNmJpdCBVc2VyUHJpb3JpdHkgT2YgVGhlIFNlcnZpY2UgRmxvdyovCiAgICAgQl9VSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICB1MTZVc2VyUHJpb3JpdHk7CkBAIC0xNDUsMjkgKzEwMSwxMCBAQAogICAgIEJfVUlOVDgJCQkJCQkJdThDbGFzc2lmaWVyQWN0aW9uUnVsZTsKICAgICBCX1VJTlQxNgkJCQkJCQl1MTZWYWxpZGl0eUJpdE1hcDsKIH07Ci0jaWZuZGVmIEJFQ0VFTV9UQVJHRVQKIHR5cGVkZWYgc3RydWN0IF9zdENQYWNrZXRDbGFzc2lmaWNhdGlvblJ1bGVTSSBDQ1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZVNJLHN0Q1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZVNJLCAqcHN0Q1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZVNJOwotI2VuZGlmCiAKIC8vLyBcYnJpZWYgY2xhc3MgQ1Boc1J1bGVTSQotI2lmZGVmIEJFQ0VFTV9UQVJHRVQKLWNsYXNzIENQaHNSdWxlU0l7Ci0JcHVibGljOgotCQkvLy8gXGJyaWVmIENvbnN0cnVjdG9yIGZvciB0aGUgY2xhc3MKLQkJQ1Boc1J1bGVTSSgpOgotCQkJdThQSFNJKG1QSFNJKSwKLQkJCXU4UEhTRkxlbmd0aCgwKSwKLQkJCXU4UEhTTUxlbmd0aCgwKSwKLQkJCXU4UEhTUyhtUEhTUyksCi0JCQl1OFBIU1YobVBIU1YpLAotCQkJdThWZW5kb3JTcGVjaWZpY1BIU1BhcmFtc0xlbmd0aChtVmVuZG9yU3BlY2lmaWNQSFNQYXJhbUxlbmd0aCl7fQotICAgICAgICAgICAgICAgIHZvaWQgUmVzZXQoKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgCQlDUGhzUnVsZVNJKCk7Ci0gICAgICAgICAgICAgICAgfQotI2Vsc2UKIHR5cGVkZWYgc3RydWN0IF9zdFBoc1J1bGVTSSB7Ci0jZW5kaWYKIAkvKiogIDhiaXQgUEhTIEluZGV4IE9mIFRoZSBTZXJ2aWNlIEZsb3cqLwogICAgIEJfVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgdThQSFNJOwogCS8qKiAgUEhTRiBMZW5ndGggT2YgVGhlIFNlcnZpY2UgRmxvdyovCkBAIC0xODgsMzEgKzEyNSwxMSBAQAogICAgIEJfVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgdThWZW5kb3JTcGVjaWZpY1BIU1BhcmFtc1tWRU5ET1JfUEhTX1BBUkFNX0xFTkdUSF07CiAKIAlCX1VJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgIHU4UGFkZGluZ1syXTsKLSNpZmRlZiBCRUNFRU1fVEFSR0VUCi19OwotI2Vsc2UKIH1zdFBoc1J1bGVTSSwqcHN0UGhzUnVsZVNJOwogdHlwZWRlZiBzdFBoc1J1bGVTSSBDUGhzUnVsZVNJOwotI2VuZGlmCiAKIC8vLyBcYnJpZWYgc3RydWN0dXJlIGNDb252ZXJnZW5jZVNMVHlwZXMKLSNpZmRlZiBCRUNFRU1fVEFSR0VUCi1jbGFzcyBDQ29udmVyZ2VuY2VTTFR5cGVzewotCXB1YmxpYzoKLQkJLy8vIFxicmllZiBDb25zdHJ1Y3RvciBmb3IgdGhlIGNsYXNzCi0JCUNDb252ZXJnZW5jZVNMVHlwZXMoKToKLQkJdThDbGFzc2ZpZXJEU0NBY3Rpb24obUNsYXNzaWZpZXJEU0NBY3Rpb24pLAotCQl1OFBoc0RTQ0FjdGlvbgkobVBoc0RTQ0FjdGlvbikKLQkJe30KLSAgICAgICAgICAgICAgdm9pZCBSZXNldCgpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ0NvbnZlcmdlbmNlU0xUeXBlcygpOwotICAgICAgICAgICAgICAgICAgICBjQ1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZS5SZXNldCgpOwotICAgICAgICAgICAgICAgICAgICBjUGhzUnVsZS5SZXNldCgpOwotICAgICAgICAgICAgICB9Ci0jZWxzZQogc3RydWN0IF9zdENvbnZlcmdlbmNlU0xUeXBlc3sKLSNlbmRpZgogCS8qKiAgOGJpdCBQaHMgQ2xhc3NmaWVyIEFjdGlvbiBPZiBUaGUgU2VydmljZSBGbG93Ki8KICAgICBCX1VJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgIHU4Q2xhc3NmaWVyRFNDQWN0aW9uOwogCS8qKiAgOGJpdCBQaHMgRFNDIEFjdGlvbiBPZiBUaGUgU2VydmljZSBGbG93Ki8KQEAgLTIyMCwxMTEgKzEzNywxNSBAQAogCS8qKiAgIDE2Yml0IFBhZGRpbmcgKi8KICAgICBCX1VJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgIHU4UGFkZGluZ1syXTsKICAgICAvLy8gXGJyaWVmIGNsYXNzIGNDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlCi0jaWZkZWYgQkVDRUVNX1RBUkdFVAotICAgIENDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlU0kgICAgICBjQ1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZTsKLSNlbHNlCiAgICAgc3RDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlU0kgICAgIGNDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlOwotI2VuZGlmCiAgICAgLy8vIFxicmllZiBjbGFzcyBDUGhzUnVsZVNJCi0jaWZkZWYgQkVDRUVNX1RBUkdFVAotICAgIENQaHNSdWxlU0kJCQkJY1Boc1J1bGU7Ci0jZWxzZQogICAgICBzdHJ1Y3QgX3N0UGhzUnVsZVNJCQljUGhzUnVsZTsKLSNlbmRpZgogfTsKLSNpZm5kZWYgQkVDRUVNX1RBUkdFVAogdHlwZWRlZiBzdHJ1Y3QgX3N0Q29udmVyZ2VuY2VTTFR5cGVzIHN0Q29udmVyZ2VuY2VTTFR5cGVzLENDb252ZXJnZW5jZVNMVHlwZXMsICpwc3RDb252ZXJnZW5jZVNMVHlwZXM7Ci0jZW5kaWYKIAogCiAvLy8gXGJyaWVmIHN0cnVjdHVyZSBDU2VydmljZUZsb3dQYXJhbVNJCi0jaWZkZWYgQkVDRUVNX1RBUkdFVAotY2xhc3MgQ1NlcnZpY2VGbG93UGFyYW1TSXsKLQlwdWJsaWM6Ci0JCS8vLyBcYnJpZWYgQ29uc3RydWN0b3IgZm9yIHRoZSBjbGFzcwotCQlDU2VydmljZUZsb3dQYXJhbVNJKCk6Ci0JCQl1MzJTRklEKG1TRmlkKSwKLQkJCXUxNkNJRChtQ2lkKSwKLQkJCXU4U2VydmljZUNsYXNzTmFtZUxlbmd0aChtU2VydmljZUNsYXNzTmFtZUxlbmd0aCksCi0JCQl1OE1CU1NlcnZpY2UobU1CU1NlcnZpY2UpLAotCQkJdThRb3NQYXJhbVNldChtUW9zUGFyYW1TZXRUeXBlKSwKLQkJCXU4VHJhZmZpY1ByaW9yaXR5KG1UcmFmZmljUHJpb3JpdHkpLAotCQkJdTMyTWF4U3VzdGFpbmVkVHJhZmZpY1JhdGUobU1heGltdW1TdXN0YWluZWRUcmFmZmljUmF0ZSksCi0JCQl1MzJNYXhUcmFmZmljQnVyc3QobU1heGltdW1UcmFmZmljQnVyc3QpLAotCQkJdTMyTWluUmVzZXJ2ZWRUcmFmZmljUmF0ZShtTWluaW11bVJlc2VydmVkVHJhZmZpY1JhdGUpLAotCQkJdThTZXJ2aWNlRmxvd1NjaGVkdWxpbmdUeXBlKG1TZXJ2aWNlRmxvd1NjaGVkdWxpbmdUeXBlKSwKLQkJCXU4UmVxdWVzdHRyYW5zbWlzc2lvblBvbGljeShtUmVxdWVzdFRyYW5zbWlzc2lvblBvbGljeSksCi0JCQl1MzJUb2xlcmF0ZWRKaXR0ZXIobVRvbGVyYXRlZEppdHRlciksCi0JCQl1MzJNYXhpbXVtTGF0ZW5jeShtTWF4aW11bUxhdGVuY3kpLAotCQkJdThGaXhlZExlbmd0aFZTVmFyaWFibGVMZW5ndGhTRFVJbmRpY2F0b3IKLQkJCShtRml4ZWRMZW5ndGhWU1ZhcmlhYmxlTGVuZ3RoKSwKLQkJCXU4U0RVU2l6ZShtU0RVU2l6ZSksCi0JCQl1MTZUYXJnZXRTQUlEKG1UYXJnZXRTQUlEKSwKLQkJCXU4QVJRRW5hYmxlKG1BUlFFbmFibGUpLAotCQkJdTE2QVJRV2luZG93U2l6ZShtQVJRV2luZG93U2l6ZSksCi0JCQl1MTZBUlFCbG9ja0xpZmVUaW1lKG1BUlFCbG9ja0xpZmVUaW1lKSwKLQkJCXUxNkFSUVN5bmNMb3NzVGltZU91dChtQVJRU3luY0xvc3NUaW1lT3V0KSwKLQkJCXU4QVJRRGVsaXZlckluT3JkZXIobUFSUURlbGl2ZXJJbk9yZGVyKSwKLQkJCXUxNkFSUVJ4UHVyZ2VUaW1lT3V0KG1BUlFSWFB1cmdlVGltZU91dCksCi0JCQkvL0FkZCBBUlEgQkxPQ0sgU0laRSwgQVJRIFRYIGFuZCBSWCBkZWxheSBpbml0aWFsaXphdGlvbnMgaGVyZQotCQkJLy9hZnRlciB3ZSBtb3ZlIHRvIG9ubHkgQ09SUjIKLQkJCXU4UnhBUlFBY2tQcm9jZXNzaW5nVGltZShtUnhBUlFBY2tQcm9jZXNzaW5nVGltZSksCi0JCQl1OENTU3BlY2lmaWNhdGlvbihtQ1NTcGVjaWZpY2F0aW9uKSwKLQkJCXU4VHlwZU9mRGF0YURlbGl2ZXJ5U2VydmljZShtVHlwZU9mRGF0YURlbGl2ZXJ5U2VydmljZSksCi0JCQl1MTZTRFVJbnRlckFycml2YWxUaW1lKG1TRFVJbnRlckFycml2YWxUaW1lKSwKLQkJCXUxNlRpbWVCYXNlKG1UaW1lQmFzZSksCi0JCQl1OFBhZ2luZ1ByZWZlcmVuY2UobVBhZ2luZ1ByZWZlcmVuY2UpLAotCQkJdThNQlNab25lSWRlbnRpZmllcmFzc2lnbm1lbnQobU1CU1pvbmVJZGVudGlmaWVyYXNzaWdubWVudExlbmd0aCksCi0JCQl1OFRyYWZmaWNJbmRpY2F0aW9uUHJlZmVyZW5jZShtVHJhZmZpY0luZGljYXRpb25QcmVmZXJlbmNlKSwKLQkJCXU4R2xvYmFsU2VydmljZXNDbGFzc05hbWVMZW5ndGgobUdsb2JhbFNlcnZpY2VzQ2xhc3NOYW1lTGVuZ3RoKSwKLQkJCXU4U05GZWVkYmFja0VuYWJsZWQobVNORmVlZGJhY2tFbmFibGVkKSwKLQkJCXU4RlNOU2l6ZShtRlNOU2l6ZSksCi0JCQl1OENJREFsbG9jYXRpb240YWN0aXZlQlNzTGVuZ3RoKG1DSURBbGxvY2F0aW9uNGFjdGl2ZUJTc0xlbmd0aCksCi0JCQl1MTZVbnNvbGljaXRlZEdyYW50SW50ZXJ2YWwobVVuc29saWNpdGVkR3JhbnRJbnRlcnZhbCksCi0JCQl1MTZVbnNvbGljaXRlZFBvbGxpbmdJbnRlcnZhbChtVW5zb2xpY2l0ZWRQb2xsaW5nSW50ZXJ2YWwpLAotCQkJdThQRFVTTkV4dGVuZGVkU3ViaGVhZGVyNEhhcnFSZW9yZGVyaW5nKG1QRFVTTkV4dGVuZGVkU3ViaGVhZGVyNEhhcnFSZW9yZGVyaW5nKSwKLQkJCXU4TUJTQ29udGVudHNJRExlbmd0aChtTUJTQ29udGVudHNJRExlbmd0aCksCi0JCQl1OEhBUlFTZXJ2aWNlRmxvd3MobUhBUlFTZXJ2aWNlRmxvd3MpLAotCQkJdThBdXRoVG9rZW5MZW5ndGgobUF1dGhUb2tlbkxlbmd0aCksCi0JCQl1OEhhcnFDaGFubmVsTWFwcGluZ0xlbmd0aChtSGFycUNoYW5uZWxNYXBwaW5nTGVuZ3RoKSwKLQkJCXU4VmVuZG9yU3BlY2lmaWNRb1NQYXJhbUxlbmd0aChtVmVuZG9yU3BlY2lmaWNRb1NQYXJhbUxlbmd0aCksCi0gICAgICAgICAgICBiVmFsaWQoRkFMU0UpLAotCSAgICAgdThUb3RhbENsYXNzaWZpZXJzKCkKLXsKLS8vUmVtb3ZlIHRoZSBib2xjayBhZnRlciB3ZSBtb3ZlIHRvIENvcnIyIG9ubHkgY29kZQotI2lmZGVmIEVOQUJMRV9DT1JSSUdFTkRVTTJfVVBEQVRFCi0JaWYoKGdfdTMyQ29ycjJNYWNGbGFncyAmIENPUlJfMl9EU1gpICB8fCAgKGdfdTMyQ29ycjJNYWNGbGFncyAmIENPUlJfMl9BUlEpKQotCXsKLQkvKiBJRUVFIENvbW1lbnQgIzYyNyAvIE1URyBDb21tZW50ICM0MjYgKi8KLSAgICAgICAJdTE2QVJRQmxvY2tTaXplID0gbUFSUUJsb2NrU2l6ZTsKLQkJaWYoZ191MzJDb3JyMk1hY0ZsYWdzICYgQ09SUl8yX0FSUSkgewotCQkJdTE2QVJRUmV0cnlUeFRpbWVPdXQgPSBtQVJRUmV0cnlUaW1lT3V0VHhEZWxheTsKLQkJCWlmKGdfdTMyVkVORE9SX1RZUEUgPT0gVkVORE9SX0FMQ0FURUwpIHsKLQkJCQl1MTZBUlFSZXRyeVJ4VGltZU91dCA9IG1BUlFSZXRyeVRpbWVPdXRSeERlbGF5X0FMVTsKLQkJCX0gZWxzZSB7Ci0JCQkJdTE2QVJRUmV0cnlSeFRpbWVPdXQgPSBtQVJRUmV0cnlUaW1lT3V0UnhEZWxheTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCXUxNkFSUVJldHJ5VHhUaW1lT3V0ID0gbUFSUVJldHJ5VGltZU91dFR4RGVsYXlDb3JyMTsKLQkJCXUxNkFSUVJldHJ5UnhUaW1lT3V0ID0gbUFSUVJldHJ5VGltZU91dFJ4RGVsYXlDb3JyMTsKLQkJfQotCX0KLQllbHNlCi0jZW5kaWYKLQl7Ci0JCXUxNkFSUUJsb2NrU2l6ZSA9IG1BUlFCbG9ja1NpemVDb3JyMTsKLQkJdTE2QVJRUmV0cnlUeFRpbWVPdXQgPSBtQVJRUmV0cnlUaW1lT3V0VHhEZWxheUNvcnIxOwotCQl1MTZBUlFSZXRyeVJ4VGltZU91dCA9IG1BUlFSZXRyeVRpbWVPdXRSeERlbGF5Q29ycjE7Ci0JfQotfQotCi0Jdm9pZCBDb21wdXRlTWFjT3ZlcmhlYWQoQl9VSU5UOAl1OFNlY092cmhlYWQpOwotCUJfVUlOVDE2CUdldE1hY092ZXJoZWFkKCkgeyByZXR1cm4gCXUxNk1hY092ZXJoZWFkOyB9Ci0jZWxzZQogdHlwZWRlZiBzdHJ1Y3QgX3N0U2VydmljZUZsb3dQYXJhbVNJewotI2VuZGlmIC8vZW5kIG9mIGlmZGVmIEJFQ0VFTV9UQVJHRVQKIAogICAgICAvKiogIDMyYml0U0ZJRCBPZiBUaGUgU2VydmljZSBGbG93Ki8KICAgICBCX1VJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgIHUzMlNGSUQ7CkBAIC0zNjcsMTEgKzE4OCw2IEBACiAKIAkgLyoqICAxNmJpdCBBUlEgUHVyZ2UgdGltZW91dCAqLwogICAgIEJfVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgdTE2QVJRUnhQdXJnZVRpbWVPdXQ7Ci0jaWYgMCAvL2RlZiBFTkFCTEVfQ09SUklHRU5EVU0yX1VQREFURQotLyogSUVFRSBDb21tZW50ICM2MjcgLyBNVEcgQ29tbWVudCAjNDI2ICovCi0gICAgLy8vIFxicmllZiBTaXplIG9mIGFuIEFSUSBibG9jaywgY2hhbmdlZCBmcm9tIDIgYnl0ZXMgdG8gMQotICAgIEJfVUlOVDggICAgICAgICAgICAgICAgICAgICAgICB1OEFSUUJsb2NrU2l6ZTsKLSNlbmRpZgogLy9UT0RPOjpSZW1vdmUgdGhpcyBvbmNlIHdlIG1vdmUgdG8gYSBuZXcgQ09SUjIgZHJpdmVyCiAgICAgLy8vIFxicmllZiBTaXplIG9mIGFuIEFSUSBibG9jawogICAgIEJfVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgdTE2QVJRQmxvY2tTaXplOwpAQCAtNDk2LDM1ICszMTIsMTggQEAKIAlCX1VJTlQ4CQkJCQkJCWJWYWxpZDsJLyoqPCAgVmFsaWRpdHkgZmxhZyAqLwogCUJfVUlOVDgJCQkJdThQYWRkaW5nOwkgLyoqPCAgUGFkZGluZyBieXRlKi8KIAotI2lmZGVmIEJFQ0VFTV9UQVJHRVQKLS8qKgotU3RydWN0dXJlIGZvciBDb252ZXJnZW5jZSBTdWJMYXllciBUeXBlcyB3aXRoIGEgbWF4aW11bSBvZiA0IGNsYXNzaWZpZXJzCi0qLwotCUNDb252ZXJnZW5jZVNMVHlwZXMJCWNDb252ZXJnZW5jZVNMVHlwZXNbTUFYX0NMQVNTSUZJRVJTX0lOX1NGXTsKLSNlbHNlCiAvKioKIFN0cnVjdHVyZSBmb3IgQ29udmVyZ2VuY2UgU3ViTGF5ZXIgVHlwZXMgd2l0aCBhIG1heGltdW0gb2YgNCBjbGFzc2lmaWVycwogKi8KIAlzdENvbnZlcmdlbmNlU0xUeXBlcwkJY0NvbnZlcmdlbmNlU0xUeXBlc1tNQVhfQ0xBU1NJRklFUlNfSU5fU0ZdOwotI2VuZGlmCiAKLSNpZmRlZiBCRUNFRU1fVEFSR0VUCi19OwotI2Vsc2UKIH0gc3RTZXJ2aWNlRmxvd1BhcmFtU0ksICpwc3RTZXJ2aWNlRmxvd1BhcmFtU0k7CiB0eXBlZGVmIHN0U2VydmljZUZsb3dQYXJhbVNJIENTZXJ2aWNlRmxvd1BhcmFtU0k7Ci0jZW5kaWYKIAogLyoqCiBzdHJ1Y3R1cmUgc3RMb2NhbFNGQWRkUmVxdWVzdAogKi8KIHR5cGVkZWYgc3RydWN0IF9zdExvY2FsU0ZBZGRSZXF1ZXN0ewotI2lmZGVmIEJFQ0VFTV9UQVJHRVQKLQkgICBfc3RMb2NhbFNGQWRkUmVxdWVzdCggKSA6Ci0JICAgCXU4VHlwZSgweDAwKSwgIGVDb25uZWN0aW9uRGlyKDB4MDApLAotCQl1MTZUSUQoMHgwMDAwKSwgdTE2Q0lEKDB4MDAwMCksICB1MTZWQ0lEKDB4MDAwMCkKLQkgICAJCXt9Ci0jZW5kaWYKIAogCUJfVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgdThUeXBlOwkvKio8ICBUeXBlKi8KIAlCX1VJTlQ4ICAgICAgZUNvbm5lY3Rpb25EaXI7CQkvKio8ICBDb25uZWN0aW9uIGRpcmVjdGlvbiovCkBAIC01MzUsMTkgKzMzNCw5IEBACiAJLy8vIFxicmllZiAxNmJpdFZDSUQKIAlCX1VJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgIHUxNlZDSUQ7CS8qKjwgIDE2Yml0IFZDSUQqLwogICAgIC8vLyBcYnJpZWYgc3RydWN0dXJlIFBhcmFtZXRlclNldAotI2lmZGVmIEJFQ0VFTV9TSUdOQUxMSU5HX0lOVEVSRkFDRV9BUEkKLQlDU2VydmljZUZsb3dQYXJhbVNJIHNmUGFyYW1ldGVyU2V0OwotI2VuZGlmCiAKLSNpZmRlZiBCRUNFRU1fVEFSR0VUCi0gICAgQ1NlcnZpY2VGbG93UGFyYW1TSSAgICAgICAgICAgICAgKnBzZlBhcmFtZXRlclNldDsKLSNlbHNlCiAJc3RTZXJ2aWNlRmxvd1BhcmFtU0kJKnBzZlBhcmFtZXRlclNldDsJLyoqPCAgc3RydWN0dXJlIFBhcmFtZXRlclNldCovCi0jZW5kaWYKIAotI2lmZGVmIFVTSU5HX1ZYV09SS1MKLSAgICBVU0VfREFUQV9NRU1PUllfTUFOQUdFUigpOwotI2VuZGlmCiB9c3RMb2NhbFNGQWRkUmVxdWVzdCwgKnBzdExvY2FsU0ZBZGRSZXF1ZXN0OwogCiAKQEAgLTU1NSwxMiArMzQ0LDYgQEAKIHN0cnVjdHVyZSBzdExvY2FsU0ZBZGRJbmRpY2F0aW9uCiAqLwogdHlwZWRlZiBzdHJ1Y3QgX3N0TG9jYWxTRkFkZEluZGljYXRpb257Ci0jaWZkZWYgQkVDRUVNX1RBUkdFVAotCSAgIF9zdExvY2FsU0ZBZGRJbmRpY2F0aW9uKCApIDoKLQkgICAJdThUeXBlKDB4MDApLCAgZUNvbm5lY3Rpb25EaXIoMHgwMCksCi0JCXUxNlRJRCgweDAwMDApLCB1MTZDSUQoMHgwMDAwKSwgIHUxNlZDSUQoMHgwMDAwKQotCSAgIAkJe30KLSNlbmRpZgogCiAJQl9VSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICB1OFR5cGU7CS8qKjwgIFR5cGUqLwogCUJfVUlOVDggICAgICBlQ29ubmVjdGlvbkRpcjsJLyoqPCAgQ29ubmVjdGlvbiBEaXJlY3Rpb24qLwpAQCAtNTcxLDM3ICszNTQsMTkgQEAKICAgICAvLy8gXGJyaWVmIDE2Yml0VkNJRAogICAgIEJfVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgdTE2VkNJRDsJIC8qKjwgIDE2Yml0VkNJRCovCiAKLSNpZmRlZiAJQkVDRUVNX1NJR05BTExJTkdfSU5URVJGQUNFX0FQSQotCUNTZXJ2aWNlRmxvd1BhcmFtU0kgICAgICAgICAgICAgIHNmQXV0aG9yaXplZFNldDsKLSAgICAvLy8gXGJyaWVmIHN0cnVjdHVyZSBBZG1pdHRlZFNldAotICAgIENTZXJ2aWNlRmxvd1BhcmFtU0kgICAgICAgICAgICAgIHNmQWRtaXR0ZWRTZXQ7Ci0gICAgLy8vIFxicmllZiBzdHJ1Y3R1cmUgQWN0aXZlU2V0Ci0gICAgQ1NlcnZpY2VGbG93UGFyYW1TSSAgICAgICAgICAgICAgc2ZBY3RpdmVTZXQ7Ci0jZW5kaWYKIAogICAgIC8vLyBcYnJpZWYgc3RydWN0dXJlIEF1dGhvcml6ZWRTZXQKLSNpZmRlZiBCRUNFRU1fVEFSR0VUCi0gICAgQ1NlcnZpY2VGbG93UGFyYW1TSSAgICAgICAgICAgICAgKnBzZkF1dGhvcml6ZWRTZXQ7Ci0gICAgLy8vIFxicmllZiBzdHJ1Y3R1cmUgQWRtaXR0ZWRTZXQKLSAgICBDU2VydmljZUZsb3dQYXJhbVNJICAgICAgICAgICAgICAqcHNmQWRtaXR0ZWRTZXQ7Ci0gICAgLy8vIFxicmllZiBzdHJ1Y3R1cmUgQWN0aXZlU2V0Ci0gICAgQ1NlcnZpY2VGbG93UGFyYW1TSSAgICAgICAgICAgICAgKnBzZkFjdGl2ZVNldDsKLSNlbHNlCiAgICAgLy8vIFxicmllZiBzdHJ1Y3R1cmUgQXV0aG9yaXplZFNldAogICAgIHN0U2VydmljZUZsb3dQYXJhbVNJICAgICAgICAgICAgICAqcHNmQXV0aG9yaXplZFNldDsJLyoqPCAgQXV0aG9yaXplZFNldCBvZiB0eXBlIHN0U2VydmljZUZsb3dQYXJhbVNJKi8KICAgICAvLy8gXGJyaWVmIHN0cnVjdHVyZSBBZG1pdHRlZFNldAogICAgIHN0U2VydmljZUZsb3dQYXJhbVNJICAgICAgICAgICAgICAqcHNmQWRtaXR0ZWRTZXQ7CS8qKjwgIEFkbWl0dGVkU2V0IG9mIHR5cGUgc3RTZXJ2aWNlRmxvd1BhcmFtU0kqLwogICAgIC8vLyBcYnJpZWYgc3RydWN0dXJlIEFjdGl2ZVNldAogICAgIHN0U2VydmljZUZsb3dQYXJhbVNJICAgICAgICAgICAgICAqcHNmQWN0aXZlU2V0OwkvKio8ICBzZkFjdGl2ZVNldCBvZiB0eXBlIHN0U2VydmljZUZsb3dQYXJhbVNJKi8KLSNlbmRpZgogCUJfVUlOVDgJCQkJICAgdThDQzsJLyoqPCAgQ29uZmlybWF0aW9uIENvZGUqLwogCUJfVUlOVDgJCQkJICAgdThQYWRkOwkJLyoqPCAgOC1iaXQgUGFkZGluZyAqLwogCiAgICAgQl9VSU5UMTYgICAgICAgICAgICAgICB1MTZQYWRkOwkvKio8IDE2IGJpdCBQYWRkaW5nICovCiAKLSNpZmRlZiBVU0lOR19WWFdPUktTCi0gICAgVVNFX0RBVEFfTUVNT1JZX01BTkFHRVIoKTsKLSNlbmRpZgogfXN0TG9jYWxTRkFkZEluZGljYXRpb247CiAKIApAQCAtNjE5LDMzICszODQsMTcgQEAKIHN0cnVjdHVyZSBzdExvY2FsU0ZEZWxldGVSZXF1ZXN0CiAqLwogdHlwZWRlZiBzdHJ1Y3QgX3N0TG9jYWxTRkRlbGV0ZVJlcXVlc3R7Ci0jaWZkZWYgQkVDRUVNX1RBUkdFVAotCSAgIF9zdExvY2FsU0ZEZWxldGVSZXF1ZXN0KCApIDoKLQkgICAJdThUeXBlKDB4MDApLCAgdThQYWRkaW5nKDB4MDApLAotCQl1MTZUSUQoMHgwMDAwKSwgdTMyU0ZJRCAoMHgwMDAwMDAwMCkKLQkgICAJCXt9Ci0jZW5kaWYKIAlCX1VJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgIHU4VHlwZTsJIC8qKjwgVHlwZSovCiAJQl9VSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICB1OFBhZGRpbmc7CSAvKio8ICBQYWRkaW5nIGJ5dGUqLwogCUJfVUlOVDE2CQkJdTE2VElEOwkJIC8qKjwgIFRJRCovCiAgICAgLy8vIFxicmllZiAzMmJpdFNGSUQKICAgICBCX1VJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgIHUzMlNGSUQ7CSAvKio8ICBTRklEKi8KLSNpZmRlZiBVU0lOR19WWFdPUktTCi0gICAgVVNFX0RBVEFfTUVNT1JZX01BTkFHRVIoKTsKLSNlbmRpZgogfXN0TG9jYWxTRkRlbGV0ZVJlcXVlc3QsICpwc3RMb2NhbFNGRGVsZXRlUmVxdWVzdDsKIAogLyoqCiBzdHJ1Y3R1cmUgc3RMb2NhbFNGRGVsZXRlSW5kaWNhdGlvbgogKi8KIHR5cGVkZWYgc3RydWN0IHN0TG9jYWxTRkRlbGV0ZUluZGljYXRpb257Ci0jaWZkZWYgQkVDRUVNX1RBUkdFVAotCSAgIHN0TG9jYWxTRkRlbGV0ZUluZGljYXRpb24oICkgOgotCSAgIAl1OFR5cGUoMHgwMCksICB1OFBhZGRpbmcoMHgwMCksCi0JCXUxNlRJRCgweDAwMDApLCB1MTZDSUQoMHgwMDAwKSwKLQkJdTE2VkNJRCgweDAwMDApLHUzMlNGSUQgKDB4MDAwMDAwMDApCi0JICAgCQl7fQotI2VuZGlmCiAJQl9VSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICB1OFR5cGU7CS8qKjwgVHlwZSAqLwogCUJfVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgdThQYWRkaW5nOwkvKio8IFBhZGRpbmcgICovCiAJQl9VSU5UMTYJCQl1MTZUSUQ7CQkJLyoqPCBUSUQgKi8KQEAgLTY1OCw5ICs0MDcsNiBAQAogCS8vLyBcYnJpZWYgOGJpdCBDb25maXJtYXRpb24gY29kZQogCUJfVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgdThDb25maXJtYXRpb25Db2RlOwkvKio8IENvbmZpcm1hdGlvbiBjb2RlICovCiAJQl9VSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICB1OFBhZGRpbmcxWzNdOwkJLyoqPCAzIGJ5dGUgUGFkZGluZyAgKi8KLSNpZmRlZiBVU0lOR19WWFdPUktTCi0gICAgVVNFX0RBVEFfTUVNT1JZX01BTkFHRVIoKTsKLSNlbmRpZgogfXN0TG9jYWxTRkRlbGV0ZUluZGljYXRpb247CiAKIHR5cGVkZWYgc3RydWN0IF9zdElNX1NGSG9zdE5vdGlmeQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9oZWFkZXJzLmggYi9kcml2ZXJzL3N0YWdpbmcvYmNtL2hlYWRlcnMuaAppbmRleCA5ZDRlM2FjLi4xMTQ4ZTVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL2hlYWRlcnMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL2hlYWRlcnMuaApAQCAtMjIsNyArMjIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bmV0L2lwLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCkBAIC0zNiwyNiArMzUsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+Ci0jZW5kaWYKICNpbmNsdWRlIDxsaW51eC90Y3AuaD4KICNpbmNsdWRlIDxsaW51eC91ZHAuaD4KLSNpZm5kZWYgQkNNX1NITV9JTlRFUkZBQ0UKICNpbmNsdWRlIDxsaW51eC91c2IuaD4KLSNlbmRpZgotI2lmZGVmIEJFQ0VFTV9UQVJHRVQKLQotI2luY2x1ZGUgPG1hY19jb21tb24uaD4KLSNpbmNsdWRlIDxtc2dfRHNhLmg+Ci0jaW5jbHVkZSA8bXNnX0RzYy5oPgotI2luY2x1ZGUgPG1zZ19Ec2QuaD4KLSNpbmNsdWRlIDxzY2hfZGVmaW5pdGlvbnMuaD4KLXVzaW5nIG5hbWVzcGFjZSBCZWNlZW07Ci0jaWZkZWYgRU5BQkxFX0NPUlJJR0VORFVNMl9VUERBVEUKLWV4dGVybiBCX1VJTlQzMiBnX3UzMkNvcnIyTWFjRmxhZ3M7Ci0jZW5kaWYKLSNlbmRpZgogCiAjaW5jbHVkZSAiVHlwZWRlZnMuaCIKICNpbmNsdWRlICJWZXJzaW9uLmgiCkBAIC03MSwzOSArNTQsMjggQEAKICNpbmNsdWRlICJDbUhvc3QuaCIKICNpbmNsdWRlICJERFJJbml0LmgiCiAjaW5jbHVkZSAiRGVidWcuaCIKLSNpbmNsdWRlICJIb3N0TWlicy5oIgogI2luY2x1ZGUgIklQdjZQcm90b2NvbEhkci5oIgotI2luY2x1ZGUgIm9zYWxfbWlzYy5oIgogI2luY2x1ZGUgIlBIU01vZHVsZS5oIgogI2luY2x1ZGUgIlByb3RvY29sLmgiCiAjaW5jbHVkZSAiUHJvdG90eXBlcy5oIgogI2luY2x1ZGUgIlF1ZXVlLmgiCiAjaW5jbHVkZSAidmVuZG9yc3BlY2lmaWNleHRuLmgiCiAKLSNpZm5kZWYgQkNNX1NITV9JTlRFUkZBQ0UKIAogI2luY2x1ZGUgIkludGVyZmFjZU1hY3Jvcy5oIgogI2luY2x1ZGUgIkludGVyZmFjZUFkYXB0ZXIuaCIKICNpbmNsdWRlICJJbnRlcmZhY2VJc3IuaCIKLSNpbmNsdWRlICJJbnRlcmZhY2VtYWluLmgiCiAjaW5jbHVkZSAiSW50ZXJmYWNlTWlzYy5oIgogI2luY2x1ZGUgIkludGVyZmFjZVJ4LmgiCiAjaW5jbHVkZSAiSW50ZXJmYWNlVHguaCIKLSNlbmRpZgogI2luY2x1ZGUgIkludGVyZmFjZUlkbGVNb2RlLmgiCiAjaW5jbHVkZSAiSW50ZXJmYWNlSW5pdC5oIgogCi0jaWZkZWYgQkNNX1NITV9JTlRFUkZBQ0UKLSNpbmNsdWRlIDxsaW51eC9jcGVfY29uZmlnLmg+Ci0KLSNpZmRlZiBHRE1BX0lOVEVSRkFDRQotI2luY2x1ZGUgIkdkbWFJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJzeW1waG9ueS5oIgotI2Vsc2UKLSNpbmNsdWRlICJ2aXJ0dWFsX2ludGVyZmFjZS5oIgotCi0jZW5kaWYKLQotI2VuZGlmCisjZGVmaW5lIERSVl9OQU1FCSJiZWNlZW0iCisjZGVmaW5lIERFVl9OQU1FCSJ0YXJhbmciCisjZGVmaW5lIERSVl9ERVNDUklQVElPTiAiQmVjZWVtIENvbW11bmljYXRpb25zIEluYy4gV2lNQVggZHJpdmVyIgorI2RlZmluZSBEUlZfQ09QWVJJR0hUCSJDb3B5cmlnaHQgMjAxMC4gQmVjZWVtIENvbW11bmljYXRpb25zIEluYyIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JVkVSX0ZJTEVWRVJTSU9OX1NUUgorI2RlZmluZSBQRlgJCURSVl9OQU1FICIgIgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vaG9zdG1pYnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vaG9zdG1pYnMuYwppbmRleCBlOWRhNTEzLi5jMTNlYTVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL2hvc3RtaWJzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9ob3N0bWlicy5jCkBAIC0xMCwxMiArMTAsOCBAQAogICovCiAjaW5jbHVkZSAiaGVhZGVycy5oIgogCi1JTlQgIFByb2Nlc3NHZXRIb3N0TWlicyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIsCi0JCQkJCQkgIFBWT0lEIGlvQnVmZmVyLAotCQkJCQkJICBVTE9ORyBpbnB1dEJ1ZmZlckxlbmd0aCkKK0lOVCAgUHJvY2Vzc0dldEhvc3RNaWJzKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgU19NSUJTX0hPU1RfU1RBVFNfTUlCUyAqcHN0SG9zdE1pYnMpCiB7Ci0KLQlTX01JQlNfSE9TVF9TVEFUU19NSUJTICpwc3RIb3N0TWlicyAgICAgICAgID0gTlVMTDsKIAlTX1NFUlZJQ0VGTE9XX0VOVFJZICAgICpwc3RTZXJ2aWNlRmxvd0VudHJ5ID0gTlVMTDsKIAlTX1BIU19SVUxFICAgICAgICAgICAgICpwc3RQaHNSdWxlICAgICAgICAgID0gTlVMTDsKIAlTX0NMQVNTSUZJRVJfVEFCTEUgICAgICpwc3RDbGFzc2lmaWVyVGFibGUgID0gTlVMTDsKQEAgLTMwLDE1ICsyNiw2IEBACiAJCXJldHVybiBTVEFUVVNfRkFJTFVSRTsKIAl9CiAKLQlpZihpb0J1ZmZlciA9PSBOVUxMKQotCXsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCW1lbXNldChpb0J1ZmZlciwwLHNpemVvZihTX01JQlNfSE9TVF9TVEFUU19NSUJTKSk7Ci0KLQlwc3RIb3N0TWlicyA9IChTX01JQlNfSE9TVF9TVEFUU19NSUJTICopaW9CdWZmZXI7Ci0KLQogCS8vQ29weSB0aGUgY2xhc3NpZmllciBUYWJsZQogCWZvcihuQ2xhc3NpZmllckluZGV4PTA7IG5DbGFzc2lmaWVySW5kZXggPCBNQVhfQ0xBU1NJRklFUlM7CiAJCQluQ2xhc3NpZmllckluZGV4KyspCkBAIC01NCw3ICs0MSw3IEBACiAJewogCWlmKEFkYXB0ZXItPlBhY2tJbmZvW25TZkluZGV4XS5iVmFsaWQpCiAJewotCQkJT3NhbE1lbU1vdmUoKFBWT0lEKSZwc3RIb3N0TWlicy0+YXN0U0Z0YWJsZVtuU2ZJbmRleF0sKFBWT0lEKSZBZGFwdGVyLT5QYWNrSW5mb1tuU2ZJbmRleF0sc2l6ZW9mKFNfTUlCU19TRVJWSUNFRkxPV19UQUJMRSkpOworCQkJbWVtY3B5KChQVk9JRCkmcHN0SG9zdE1pYnMtPmFzdFNGdGFibGVbblNmSW5kZXhdLChQVk9JRCkmQWRhcHRlci0+UGFja0luZm9bblNmSW5kZXhdLHNpemVvZihTX01JQlNfU0VSVklDRUZMT1dfVEFCTEUpKTsKIAl9CiAJZWxzZQogCXsKQEAgLTgzLDcgKzcwLDcgQEAKIAogCQkJcHN0SG9zdE1pYnMtPmFzdFBoc1J1bGVzVGFibGVbblBoc1RhYmxlSW5kZXhdLnVsU0ZJRCA9IEFkYXB0ZXItPlBhY2tJbmZvW25TZkluZGV4XS51bFNGSUQ7CiAKLQkJCU9zYWxNZW1Nb3ZlKCZwc3RIb3N0TWlicy0+YXN0UGhzUnVsZXNUYWJsZVtuUGhzVGFibGVJbmRleF0udThQSFNJLAorCQkJbWVtY3B5KCZwc3RIb3N0TWlicy0+YXN0UGhzUnVsZXNUYWJsZVtuUGhzVGFibGVJbmRleF0udThQSFNJLAogCQkJCQkJJnBzdFBoc1J1bGUtPnU4UEhTSSwKIAkJCQkJCXNpemVvZihTX1BIU19SVUxFKSk7CiAJCQkJblBoc1RhYmxlSW5kZXgrKzsKQEAgLTk1LDEyICs4Miw5IEBACiAJfQogCiAKLQogCS8vY29weSBvdGhlciBIb3N0IFN0YXRpc3RpY3MgcGFyYW1ldGVycwotCXBzdEhvc3RNaWJzLT5zdEhvc3RJbmZvLkdvb2RUcmFuc21pdHMgPQotCQkJCWF0b21pY19yZWFkKCZBZGFwdGVyLT5UeFRvdGFsUGFja2V0Q291bnQpOwotCXBzdEhvc3RNaWJzLT5zdEhvc3RJbmZvLkdvb2RSZWNlaXZlcyA9Ci0JCQkJYXRvbWljX3JlYWQoJkFkYXB0ZXItPkdvb2RSeFBrdENvdW50KTsKKwlwc3RIb3N0TWlicy0+c3RIb3N0SW5mby5Hb29kVHJhbnNtaXRzID0gQWRhcHRlci0+ZGV2LT5zdGF0cy50eF9wYWNrZXRzOworCXBzdEhvc3RNaWJzLT5zdEhvc3RJbmZvLkdvb2RSZWNlaXZlcyA9IEFkYXB0ZXItPmRldi0+c3RhdHMucnhfcGFja2V0czsKIAlwc3RIb3N0TWlicy0+c3RIb3N0SW5mby5DdXJyTnVtRnJlZURlc2MgPQogCQkJYXRvbWljX3JlYWQoJkFkYXB0ZXItPkN1cnJOdW1GcmVlVHhEZXNjKTsKIAlwc3RIb3N0TWlicy0+c3RIb3N0SW5mby5CRUJ1Y2tldFNpemUgPSBBZGFwdGVyLT5CRUJ1Y2tldFNpemU7CkBAIC0xMTUsMTMgKzk5LDEwIEBACiB9CiAKIAotSU5UIEdldERyb3BwZWRBcHBDbnRybFBrdE1pYnMoUFZPSUQgaW9CdWZmZXIsIFBQRVJfVEFSQU5HX0RBVEEgcFRhcmFuZykKK1ZPSUQgR2V0RHJvcHBlZEFwcENudHJsUGt0TWlicyhTX01JQlNfSE9TVF9TVEFUU19NSUJTICpwc3RIb3N0TWlicywgY29uc3QgUFBFUl9UQVJBTkdfREFUQSBwVGFyYW5nKQogewotCVNfTUlCU19IT1NUX1NUQVRTX01JQlMgKnBzdEhvc3RNaWJzID0gKFNfTUlCU19IT1NUX1NUQVRTX01JQlMgKilpb0J1ZmZlcjsKLQotCW1lbWNweSgoUFZPSUQpJihwc3RIb3N0TWlicy0+c3REcm9wcGVkQXBwQ250cmxNc2dzKSwoUFZPSUQpJihwVGFyYW5nLT5zdERyb3BwZWRBcHBDbnRybE1zZ3MpLHNpemVvZihTX01JQlNfRFJPUFBFRF9BUFBfQ05UUkxfTUVTU0FHRVMpKTsKLQotCXJldHVybiBTVEFUVVNfU1VDQ0VTUyA7CisJbWVtY3B5KCYocHN0SG9zdE1pYnMtPnN0RHJvcHBlZEFwcENudHJsTXNncyksCisJICAgICAgICYocFRhcmFuZy0+c3REcm9wcGVkQXBwQ250cmxNc2dzKSxzaXplb2YoU19NSUJTX0RST1BQRURfQVBQX0NOVFJMX01FU1NBR0VTKSk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9sZWRfY29udHJvbC5jIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9sZWRfY29udHJvbC5jCmluZGV4IDk3YWRhYWUuLjE2ZTkzOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vbGVkX2NvbnRyb2wuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL2xlZF9jb250cm9sLmMKQEAgLTEwOCw1MiArMTA4LDE2IEBACiAJdWxvbmcgdGltZW91dCA9IDA7CiAKIAkvKlJlYWQgaW5pdGlhbCB2YWx1ZSBvZiBwYWNrZXRzIHNlbnQvcmVjZWl2ZWQgKi8KLQlJbml0aWFsX251bV9vZl9wYWNrdHNfdHggPSBhdG9taWNfcmVhZCgmQWRhcHRlci0+VHhUb3RhbFBhY2tldENvdW50KTsKLQlJbml0aWFsX251bV9vZl9wYWNrdHNfcnggPSBhdG9taWNfcmVhZCgmQWRhcHRlci0+R29vZFJ4UGt0Q291bnQpOworCUluaXRpYWxfbnVtX29mX3BhY2t0c190eCA9IEFkYXB0ZXItPmRldi0+c3RhdHMudHhfcGFja2V0czsKKwlJbml0aWFsX251bV9vZl9wYWNrdHNfcnggPSBBZGFwdGVyLT5kZXYtPnN0YXRzLnJ4X3BhY2tldHM7CisKIAkvKlNjYWxlIHRoZSByYXRlIG9mIHRyYW5zZmVyIHRvIG5vIG9mIGJsaW5rcy4qLwogCW51bV9vZl90aW1lX3R4PSBTY2FsZVJhdGVvZlRyYW5zZmVyKChVTE9ORylyYXRlX29mX3RyYW5zZmVyX3R4KTsKIAludW1fb2ZfdGltZV9yeD0gU2NhbGVSYXRlb2ZUcmFuc2ZlcigoVUxPTkcpcmF0ZV9vZl90cmFuc2Zlcl9yeCk7CiAKIAl3aGlsZSgoQWRhcHRlci0+ZGV2aWNlX3JlbW92ZWQgPT0gRkFMU0UpKQogCXsKLQkJI2lmIDAKLQkJaWYoMCA9PSBudW1fb2ZfdGltZV90eCAmJiAwID09IG51bV9vZl90aW1lX3J4KQotCQl7Ci0JCQl0aW1lb3V0ID0gMTAwMDsKLQkJCVN0YXR1cyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KEFkYXB0ZXItPkxFREluZm8ubm90aWZ5X2xlZF9ldmVudCwKLQkJCQljdXJyZHJpdmVyc3RhdGUhPSBBZGFwdGVyLT5Ecml2ZXJTdGF0ZSB8fCBrdGhyZWFkX3Nob3VsZF9zdG9wKCksCi0JCQkJbXNlY3NfdG9famlmZmllcyAodGltZW91dCkpOwotCQkJaWYoa3RocmVhZF9zaG91bGRfc3RvcCgpKQotCQkJewotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTEVEX0RVTVBfSU5GTywgREJHX0xWTF9BTEwsICJMZWQgdGhyZWFkIGdvdCBzaWduYWwgdG8gZXhpdC4uaGVuY2UgZXhpdGluZyIpOwotCQkJCUFkYXB0ZXItPkxFREluZm8ubGVkX3RocmVhZF9ydW5uaW5nPSBCQ01fTEVEX1RIUkVBRF9ESVNBQkxFRDsKLQkJCQlyZXR1cm4gRVZFTlRfU0lHTkFMRUQ7Ci0JCQl9Ci0JCQlpZihTdGF0dXMpCi0JCQkJcmV0dXJuIEVWRU5UX1NJR05BTEVEOwotCi0JCX0KLQkJI2VuZGlmCi0KIAkJdGltZW91dCA9IDUwOwotCQkjaWYgMAotCQkvKlR1cm4gb24gTEVEIGlmIFR4IGlzIGhpZ2ggYmFuZHdpZHRoKi8KLQkJaWYobnVtX29mX3RpbWVfdHggPiBNQVhfTlVNX09GX0JMSU5LUykKLQkJewotCQkJVFVSTl9PTl9MRUQoMTw8R1BJT19OdW1fdHgsIHVpVHhMZWRJbmRleCk7Ci0JCQludW1fb2ZfdGltZV90eCA9IDA7Ci0JCQliQmxpbmtCb3RoTEVEID0gRkFMU0U7Ci0JCQludW1fb2ZfdGltZSA9IG51bV9vZl90aW1lX3J4OwotCQl9Ci0JCQkvKlR1cm4gb24gTEVEIGlmIFJ4IGlzIGhpZ2ggYmFuZHdpZHRoKi8KLQkJaWYobnVtX29mX3RpbWVfcnggPiBNQVhfTlVNX09GX0JMSU5LUykKLQkJewotCQkJVFVSTl9PTl9MRUQoMTw8R1BJT19OdW1fcngsIHVpUnhMZWRJbmRleCk7Ci0JCQludW1fb2ZfdGltZV9yeCA9IDA7Ci0JCQliQmxpbmtCb3RoTEVEID0gRkFMU0U7Ci0JCQludW1fb2ZfdGltZSA9IG51bV9vZl90aW1lX3R4OwotCQl9Ci0JCSNlbmRpZgogCQkvKkJsaW5rIFR4IGFuZCBSeCBMRUQgd2hlbiBib3RoIFR4IGFuZCBSeCBpcyBpbiBub3JtYWwgYmFuZHdpZHRoKi8KIAkJaWYoYkJsaW5rQm90aExFRCkKIAkJewpAQCAtMjQ5LDkgKzIxMywxMCBAQAogIAkJICogUmVhZCB0aGUgVHggJiBSeCBwYWNrZXRzIHRyYW5zbWlzc2lvbiBhZnRlciAxIHNlY29uZCBhbmQKICAJCSAqIGNhbGN1bGF0ZSByYXRlIG9mIHRyYW5zZmVyCiAgCQkgKi8KLQkJRmluYWxfbnVtX29mX3BhY2t0c190eCA9IGF0b21pY19yZWFkKCZBZGFwdGVyLT5UeFRvdGFsUGFja2V0Q291bnQpOworCQlGaW5hbF9udW1fb2ZfcGFja3RzX3R4ID0gQWRhcHRlci0+ZGV2LT5zdGF0cy50eF9wYWNrZXRzOworCQlGaW5hbF9udW1fb2ZfcGFja3RzX3J4ID0gQWRhcHRlci0+ZGV2LT5zdGF0cy5yeF9wYWNrZXRzOworCiAJCXJhdGVfb2ZfdHJhbnNmZXJfdHggPSBGaW5hbF9udW1fb2ZfcGFja3RzX3R4IC0gSW5pdGlhbF9udW1fb2ZfcGFja3RzX3R4OwotCQlGaW5hbF9udW1fb2ZfcGFja3RzX3J4ID0gYXRvbWljX3JlYWQoJkFkYXB0ZXItPkdvb2RSeFBrdENvdW50KTsKIAkJcmF0ZV9vZl90cmFuc2Zlcl9yeCA9IEZpbmFsX251bV9vZl9wYWNrdHNfcnggLSBJbml0aWFsX251bV9vZl9wYWNrdHNfcng7CiAKIAkJLypSZWFkIGluaXRpYWwgdmFsdWUgb2YgcGFja2V0cyBzZW50L3JlY2VpdmVkICovCkBAIC0yOTMsNyArMjU4LDcgQEAKIAogCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTEVEX0RVTVBfSU5GTywgREJHX0xWTF9BTEwsIkxFRCBUaHJlYWQ6VmFsaWRhdGVEU0RQYXJhbXNDaGVja3N1bTogMHglbHggMHglWCIsdWxQYXJhbU9mZnNldCwgdXNQYXJhbUxlbik7CiAKLQlwdUJ1ZmZlciA9IE9zYWxNZW1BbGxvYyh1c1BhcmFtTGVuLCIhTUVNIik7CisJcHVCdWZmZXIgPSBrbWFsbG9jKHVzUGFyYW1MZW4sIEdGUF9LRVJORUwpOwogCWlmKCFwdUJ1ZmZlcikKIAl7CiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTEVEX0RVTVBfSU5GTywgREJHX0xWTF9BTEwsIkxFRCBUaHJlYWQ6IFZhbGlkYXRlRFNEUGFyYW1zQ2hlY2tzdW0gQWxsb2NhdGlvbiBmYWlsZWQiKTsKQEAgLTM0MSwxMCArMzA2LDcgQEAKIAl9CiAKIGV4aXQ6Ci0JaWYocHVCdWZmZXIpCi0JewotCQlPc2FsTWVtRnJlZShwdUJ1ZmZlciwgdXNQYXJhbUxlbik7Ci0JfQorCWtmcmVlKHB1QnVmZmVyKTsKIAlyZXR1cm4gU3RhdHVzOwogfQogCkBAIC00OTcsMTIgKzQ1OSwxMCBAQAogewogCWludCBTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKIAlVQ0hBUiBHUElPX0FycmF5W05VTV9PRl9MRURTKzFdOyAvKkFycmF5IHRvIHN0b3JlIEdQSU8gbnVtYmVycyBmcm9tIEVFUFJPTSovCi0jaWZuZGVmIEJDTV9TSE1fSU5URVJGQUNFCiAJVUlOVCB1aUluZGV4ID0gMDsKIAlVSU5UIHVpTnVtX29mX0xFRF9UeXBlID0gMDsKIAlQVUNIQVIgcHVDRkdEYXRhCT0gTlVMTDsKIAlVQ0hBUiBiRGF0YSA9IDA7Ci0jZW5kaWYKIAltZW1zZXQoR1BJT19BcnJheSwgRElTQUJMRV9HUElPX05VTSwgTlVNX09GX0xFRFMrMSk7CiAKIAlpZighQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMgfHwgSVNfRVJSKEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zKSkKQEAgLTUyNCwxMCArNDg0LDYgQEAKIAkJKmJFbmFibGVUaHJlYWQgPSBGQUxTRTsKIAkJcmV0dXJuIFN0YXR1czsKIAl9Ci0jaWZkZWYgQkNNX1NITV9JTlRFUkZBQ0UKLQkqYkVuYWJsZVRocmVhZCA9IEZBTFNFOwotCXJldHVybiBTdGF0dXMgOwotI2Vsc2UKICAgLyoKICAgICAgKiBDT05GSUcgZmlsZSByZWFkIHN1Y2Nlc3NmdWxseS4gRGVhbGxvY2F0ZSB0aGUgbWVtb3J5IG9mCiAgICAgICogdWlGaWxlTmFtZUJ1ZmZlclNpemUKQEAgLTU3OCwyMyArNTM0LDcgQEAKIAl9CiAJaWYodWlOdW1fb2ZfTEVEX1R5cGUgPj0gTlVNX09GX0xFRFMpCiAJCSpiRW5hYmxlVGhyZWFkID0gRkFMU0U7Ci0jZW5kaWYKIAotI2lmIDAKLQlmb3IodWlJbmRleD0wOyB1aUluZGV4PE5VTV9PRl9MRURTOyB1aUluZGV4KyspCi0JewotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIExFRF9EVU1QX0lORk8sIERCR19MVkxfQUxMLCJMRURTdGF0ZVslZF0uTEVEX1R5cGUgPSAleFxuIiwgdWlJbmRleCwKLQkJCUFkYXB0ZXItPkxFREluZm8uTEVEU3RhdGVbdWlJbmRleF0uTEVEX1R5cGUpOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIExFRF9EVU1QX0lORk8sIERCR19MVkxfQUxMLCJMRURTdGF0ZVslZF0uTEVEX09uX1N0YXRlID0gJXhcbiIsIHVpSW5kZXgsCi0JCQlBZGFwdGVyLT5MRURJbmZvLkxFRFN0YXRlW3VpSW5kZXhdLkxFRF9Pbl9TdGF0ZSk7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTEVEX0RVTVBfSU5GTywgREJHX0xWTF9BTEwsIkxFRFN0YXRlWyVkXS5MRURfQmxpbmtfU3RhdGUgPSAleFxuIiwgdWlJbmRleCwKLQkJCUFkYXB0ZXItPkxFREluZm8uTEVEU3RhdGVbdWlJbmRleF0uTEVEX0JsaW5rX1N0YXRlKTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBMRURfRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwiTEVEU3RhdGVbJWRdLkdQSU9fTnVtID0gJXhcbiIsIHVpSW5kZXgsCi0JCQlBZGFwdGVyLT5MRURJbmZvLkxFRFN0YXRlW3VpSW5kZXhdLkdQSU9fTnVtKTsKLQl9Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBMRURfRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwiTEVEIFRocmVhZDogUG9sYXJpdHkgPSAlZFxuIiwKLQkJCUFkYXB0ZXItPkxFREluZm8uQml0UG9sYXJ0eSk7Ci0jZW5kaWYKIAlyZXR1cm4gU3RhdHVzOwogfQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNzIxLDIwICs2NjEsNiBAQAogCQkJVFVSTl9PRkZfTEVEKDE8PEdQSU9fbnVtLCB1aUxlZEluZGV4KTsKIAkJCXJldHVybiA7Ly9TVEFUVVNfRkFJTFVSRTsKIAkJfQotCSNpZiAwCi0JCWlmKEFkYXB0ZXItPmRldmljZV9yZW1vdmVkKQotCQl7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIExFRF9EVU1QX0lORk8sIERCR19MVkxfQUxMLCJEZXZpY2UgcmVtb3ZlZCBoZW5jZSBleGl0aW5nIGZyb20gTGVkIFRocmVhZC4uIik7Ci0JCQlyZXR1cm4gOyAvLy1FTk9ERVY7Ci0JCX0KLQkjZW5kaWYKLQkJI2lmIDAKLQkJaWYoKEdQSU9fbnVtICE9IERJU0FCTEVfR1BJT19OVU0pICYmCi0JCQkoKGN1cnJkcml2ZXJzdGF0ZSAhPSBGV19ET1dOTE9BRCkgJiYKLQkJCShjdXJyZHJpdmVyc3RhdGUgIT0gTk9STUFMX09QRVJBVElPTikgJiYKLQkJCShjdXJyZHJpdmVyc3RhdGUgIT0gSURMRU1PREVfRVhJVCkpKQotCQkJVFVSTl9PRkZfTEVEKDE8PEdQSU9fbnVtLCB1aUxlZEluZGV4KTsKLQkJI2VuZGlmCiAKIAkJaWYoR1BJT19udW0gIT0gRElTQUJMRV9HUElPX05VTSkKIAkJewpAQCAtNzUyLDEwICs2NzgsNiBAQAogCQkJY2FzZSBEUklWRVJfSU5JVDoKIAkJCXsKIAkJCQljdXJyZHJpdmVyc3RhdGUgPSBEUklWRVJfSU5JVDsvL0FkYXB0ZXItPkRyaXZlclN0YXRlOwotCSNpZiAwCi0JCQkJTGVkR3Bpb0luaXQoQWRhcHRlcik7Ci0JCQkJQWRhcHRlci0+TEVESW5mby5iTGVkSW5pdERvbmUgPSBUUlVFOwotCSNlbmRpZgogCQkJCUJjbUdldEdQSU9QaW5JbmZvKEFkYXB0ZXIsICZHUElPX251bSwgJmR1bW15R1BJT051bSwgJnVpTGVkSW5kZXgsICZkdW1teUluZGV4LCBjdXJyZHJpdmVyc3RhdGUpOwogCiAJCQkJaWYoR1BJT19udW0gICE9IERJU0FCTEVfR1BJT19OVU0pCkBAIC03NjgsMTMgKzY5MCw2IEBACiAJCQl7CiAJCQkJLy9CQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBMRURfRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwiTEVEIFRocmVhZDogRldfRE5fRE9ORSBjYWxsZWRcbiIpOwogCQkJCWN1cnJkcml2ZXJzdGF0ZSA9IEZXX0RPV05MT0FEOwotCQkJI2lmIDAKLQkJCQlpZihBZGFwdGVyLT5MRURJbmZvLmJMZWRJbml0RG9uZSA9PSBGQUxTRSkKLQkJCQl7Ci0JCQkJCUxlZEdwaW9Jbml0KEFkYXB0ZXIpOwotCQkJCQlBZGFwdGVyLT5MRURJbmZvLmJMZWRJbml0RG9uZSA9IFRSVUU7Ci0JCQkJfQotCQkJI2VuZGlmCiAJCQkJQmNtR2V0R1BJT1BpbkluZm8oQWRhcHRlciwgJkdQSU9fbnVtLCAmZHVtbXlHUElPTnVtLCAgJnVpTGVkSW5kZXgsICZkdW1teUluZGV4LCBjdXJyZHJpdmVyc3RhdGUpOwogCiAJCQkJaWYoR1BJT19udW0gIT0gRElTQUJMRV9HUElPX05VTSkKQEAgLTc5NiwxMiArNzExLDYgQEAKIAkJCWJyZWFrOwogCiAJCQljYXNlIFNIVVRET1dOX0VYSVQ6Ci0JCQkjaWYgMAotCQkJaWYoQWRhcHRlci0+dWxQb3dlclNhdmVNb2RlID09IERFVklDRV9QT1dFUlNBVkVfTU9ERV9BU19QTVVfU0hVVERPV04pCi0JCQl7Ci0JCQkJTGVkR3Bpb0luaXQoQWRhcHRlcik7Ci0JCQl9Ci0JCQkjZW5kaWYKIAkJCS8vbm8gYnJlYWssIGNvbnRpbnVlIHRvIE5PX05FVFdPUktfRU5UUlkgc3RhdGUgYXMgd2VsbC4KIAogCQkJY2FzZSBOT19ORVRXT1JLX0VOVFJZOgpAQCAtODc1LDM0ICs3ODQsNiBAQAogCQkJYnJlYWs7CiAJCQljYXNlIElETEVNT0RFX0VYSVQ6CiAJCQl7Ci0jaWYgMAotCQkJCVVDSEFSIEdQSU9fbnVtX3R4ID0gRElTQUJMRV9HUElPX05VTTsKLQkJCQlVQ0hBUiBHUElPX251bV9yeCA9IERJU0FCTEVfR1BJT19OVU07Ci0JCQkJVUNIQVIgdWlUeExlZEluZGV4ID0gMDsKLQkJCQlVQ0hBUiB1aVJ4TGVkSW5kZXggPSAwOwotCi0JCQkJY3VycmRyaXZlcnN0YXRlICA9IElETEVNT0RFX0VYSVQ7Ci0JCQkJaWYoREVWSUNFX1BPV0VSU0FWRV9NT0RFX0FTX1BNVV9TSFVURE9XTiA9PSBBZGFwdGVyLT51bFBvd2VyU2F2ZU1vZGUpCi0JCQkJewotCQkJCQlMZWRHcGlvSW5pdChBZGFwdGVyKTsKLQkJCQl9Ci0JCQkJQmNtR2V0R1BJT1BpbkluZm8oQWRhcHRlciwgJkdQSU9fbnVtX3R4LCAmR1BJT19udW1fcngsICZ1aVR4TGVkSW5kZXgsJnVpUnhMZWRJbmRleCxjdXJyZHJpdmVyc3RhdGUpOwotCi0JCQkJQWRhcHRlci0+TEVESW5mby5iSWRsZV9sZWRfb2ZmID0gIEZBTFNFOwotCi0JCQkJaWYoKEdQSU9fbnVtX3R4ID09IERJU0FCTEVfR1BJT19OVU0pICYmIChHUElPX251bV9yeCA9PSBESVNBQkxFX0dQSU9fTlVNKSkKLQkJCQl7Ci0JCQkJCUdQSU9fbnVtID0gRElTQUJMRV9HUElPX05VTSA7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXRpbWVvdXQgPSA1MDsKLQkJCQkJaWYoQWRhcHRlci0+TEVESW5mby5iSWRsZU1vZGVfdHhfZnJvbV9ob3N0KQotCQkJCQkJTEVEX0JsaW5rKEFkYXB0ZXIsIDE8PEdQSU9fbnVtX3R4LCB1aVR4TGVkSW5kZXgsIHRpbWVvdXQsIC0xLGN1cnJkcml2ZXJzdGF0ZSk7Ci0JCQkJCWVsc2UKLQkJCQkJCUxFRF9CbGluayhBZGFwdGVyLCAxPDxHUElPX251bV9yeCwgdWlSeExlZEluZGV4LCB0aW1lb3V0LCAtMSxjdXJyZHJpdmVyc3RhdGUpOwotCQkJCX0KLSNlbmRpZgogCQkJfQogCQkJYnJlYWs7CiAJCQljYXNlIERSSVZFUl9IQUxUOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9udm0uYyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vbnZtLmMKaW5kZXggNDFjOWFiOC4uYzcyOTIzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9udm0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL252bS5jCkBAIC0xLDYgKzEsNTYgQEAKICNpbmNsdWRlICJoZWFkZXJzLmgiCiAKICNkZWZpbmUgRFdPUkQgdW5zaWduZWQgaW50CisKK3N0YXRpYyBJTlQgQmNtRG9DaGlwU2VsZWN0KFBNSU5JX0FEQVBURVIgQWRhcHRlciwgVUlOVCBvZmZzZXQpOworc3RhdGljIElOVCBCY21HZXRBY3RpdmVEU0QoUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKK3N0YXRpYyBJTlQgQmNtR2V0QWN0aXZlSVNPKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CitzdGF0aWMgVUlOVCBCY21HZXRFRVBST01TaXplKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CitzdGF0aWMgSU5UIEJjbUdldEZsYXNoQ1NJbmZvKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CitzdGF0aWMgVUlOVCBCY21HZXRGbGFzaFNlY3RvclNpemUoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBVSU5UIEZsYXNoU2VjdG9yU2l6ZVNpZywgVUlOVCBGbGFzaFNlY3RvclNpemUpOworCitzdGF0aWMgVk9JRCBCY21WYWxpZGF0ZU52bVR5cGUoUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKK3N0YXRpYyBJTlQgQmNtR2V0TnZtU2l6ZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOworc3RhdGljIFVJTlQgQmNtR2V0Rmxhc2hTaXplKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CitzdGF0aWMgTlZNX1RZUEUgQmNtR2V0TnZtVHlwZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOworCitzdGF0aWMgSU5UIEJjbUdldFNlY3Rpb25WYWxFbmRPZmZzZXQoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBGTEFTSDJYX1NFQ1RJT05fVkFMIGVGbGFzaDJ4U2VjdGlvblZhbCk7CisKK3N0YXRpYyBCX1VJTlQ4IElzT2Zmc2V0V3JpdGFibGUoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBVSU5UIHVpT2Zmc2V0KTsKK3N0YXRpYyBJTlQgSXNTZWN0aW9uV3JpdGFibGUoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBGTEFTSDJYX1NFQ1RJT05fVkFMIFNlY3Rpb24pOworc3RhdGljIElOVCBJc1NlY3Rpb25FeGlzdEluVmVuZG9ySW5mbyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIEZMQVNIMlhfU0VDVElPTl9WQUwgc2VjdGlvbik7CisKK3N0YXRpYyBJTlQgUmVhZERTRFByaW9yaXR5KFBNSU5JX0FEQVBURVIgQWRhcHRlciwgRkxBU0gyWF9TRUNUSU9OX1ZBTCBkc2QpOworc3RhdGljIElOVCBSZWFkRFNEU2lnbmF0dXJlKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgRkxBU0gyWF9TRUNUSU9OX1ZBTCBkc2QpOworc3RhdGljIElOVCBSZWFkSVNPUHJpb3JpdHkoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBGTEFTSDJYX1NFQ1RJT05fVkFMIGlzbyk7CitzdGF0aWMgSU5UIFJlYWRJU09TaWduYXR1cmUoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBGTEFTSDJYX1NFQ1RJT05fVkFMIGlzbyk7CisKK3N0YXRpYyBJTlQgQ29ycnVwdERTRFNpZyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIEZMQVNIMlhfU0VDVElPTl9WQUwgZUZsYXNoMnhTZWN0aW9uVmFsKTsKK3N0YXRpYyBJTlQgQ29ycnVwdElTT1NpZyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIEZMQVNIMlhfU0VDVElPTl9WQUwgZUZsYXNoMnhTZWN0aW9uVmFsKTsKK3N0YXRpYyBJTlQgU2F2ZUhlYWRlcklmUHJlc2VudChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFBVQ0hBUiBwQnVmZiwgVUlOVCB1aVNlY3RBbGlnbkFkZHIpOworc3RhdGljIElOVCBXcml0ZVRvRmxhc2hXaXRob3V0U2VjdG9yRXJhc2UoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBQVUlOVCBwQnVmZiwKKwkJCQkJICBGTEFTSDJYX1NFQ1RJT05fVkFMIGVGbGFzaDJ4U2VjdGlvblZhbCwKKwkJCQkJICBVSU5UIHVpT2Zmc2V0LCBVSU5UIHVpTnVtQnl0ZXMpOworc3RhdGljIEZMQVNIMlhfU0VDVElPTl9WQUwgZ2V0SGlnaGVzdFByaURTRChQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOworc3RhdGljIEZMQVNIMlhfU0VDVElPTl9WQUwgZ2V0SGlnaGVzdFByaUlTTyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOworCitzdGF0aWMgSU5UIEJlY2VlbUZsYXNoQnVsa1JlYWQoCisJUE1JTklfQURBUFRFUiBBZGFwdGVyLAorCVBVSU5UIHBCdWZmZXIsCisJVUlOVCB1aU9mZnNldCwKKwlVSU5UIHVpTnVtQnl0ZXMpOworCitzdGF0aWMgSU5UIEJlY2VlbUZsYXNoQnVsa1dyaXRlKAorCVBNSU5JX0FEQVBURVIgQWRhcHRlciwKKwlQVUlOVCBwQnVmZmVyLAorCVVJTlQgdWlPZmZzZXQsCisJVUlOVCB1aU51bUJ5dGVzLAorCUJPT0xFQU4gYlZlcmlmeSk7CisKK3N0YXRpYyBJTlQgR2V0Rmxhc2hCYXNlQWRkcihQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOworCitzdGF0aWMgSU5UIFJlYWRCZWNlZW1FRVBST01CdWxrKFBNSU5JX0FEQVBURVIgQWRhcHRlcixVSU5UIGR3QWRkcmVzcywgVUlOVCAqcGR3RGF0YSwgVUlOVCBkd051bURhdGEpOworCiAvLyBQcm9jZWR1cmU6CVJlYWRFRVBST01TdGF0dXNSZWdpc3RlcgogLy8KIC8vIERlc2NyaXB0aW9uOiBSZWFkcyB0aGUgc3RhbmRhcmQgRUVQUk9NIFN0YXR1cyBSZWdpc3Rlci4KQEAgLTIyOCwyMTMgKzI3OCwyNyBAQAogCQlSZWFkQmVjZWVtRUVQUk9NQnVsayhBZGFwdGVyLCB1aVRlbXBPZmZzZXQgKyBNQVhfUldfU0laRSwgKFBVSU5UKSZ1aURhdGFbNF0sIDQpOwogCX0KIAotCU9zYWxNZW1Nb3ZlKCAoUFVDSEFSKSBwQnVmZmVyLCAoICgoUFVDSEFSKSZ1aURhdGFbMF0pICsgdWlCeXRlT2Zmc2V0ICksIDQpOworCW1lbWNweSggKFBVQ0hBUikgcEJ1ZmZlciwgKCAoKFBVQ0hBUikmdWlEYXRhWzBdKSArIHVpQnl0ZU9mZnNldCApLCA0KTsKIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0gLyogUmVhZEJlY2VlbUVFUFJPTSgpICovCiAKIAotI2lmIDAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFByb2NlZHVyZToJSXNFRVBST01Xcml0ZURvbmUKLS8vCi0vLyBEZXNjcmlwdGlvbjogUmVhZHMgdGhlIFNQSSBzdGF0dXMgdG8gc2VlIHRoZSBzdGF0dXMgb2YgcHJldmlvdXMgd3JpdGUuCi0vLwotLy8gQXJndW1lbnRzOgotLy8JCUFkYXB0ZXIgICAgLSBwdHIgdG8gQWRhcHRlciBvYmplY3QgaW5zdGFuY2UKLS8vCi0vLyBSZXR1cm5zOgotLy8JCUJPT0xFQU4gLSBUUlVFICAtIHdyaXRlIHdlbnQgdGhyb3VnaAotLy8gICAgICAgICAgICAgIC0gRkFMU0UgLSBXcml0ZSBGYWlsZWQuCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUJPT0xFQU4gSXNFRVBST01Xcml0ZURvbmUoUE1JTklfQURBUFRFUiBBZGFwdGVyKQotewotCVVJTlQgdWlSZXRyaWVzID0gMTY7Ci0JLy9VSU5UIHVpU3RhdHVzICA9IDA7Ci0JVUlOVCB2YWx1ZTsKLQotCS8vc2xlZXAgZm9yIDEuMm1zIC4ud29yc3QgY2FzZSBFRVBST00gd3JpdGUgY2FuIHRha2UgdXAgdG8gMS4ybXMuCi0JbWRlbGF5KDIpOwotCi0JdmFsdWUgPSAwOwotCXJkbWFsdChBZGFwdGVyLCBFRVBST01fU1BJX1FfU1RBVFVTMV9SRUcsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7Ci0KLQl3aGlsZSgoKHZhbHVlID4+IDE0KSAmIDEpID09IDEpCi0JewotCQkvLyBFRVBST01fU1BJX1FfU1RBVFVTMV9SRUcgd2lsbCBiZSBjbGVhcmVkIG9ubHkgaWYgd3JpdGUgYmFjayB0byB0aGF0LgotCQl2YWx1ZSA9ICgweDEgPDwgMTQpOwotCQl3cm1hbHQoQWRhcHRlciwgRUVQUk9NX1NQSV9RX1NUQVRVUzFfUkVHLCZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7Ci0JCXVkZWxheSgxMDAwKTsKLQkJdWlSZXRyaWVzLS07Ci0JCWlmKHVpUmV0cmllcyA9PSAwKQotCQl7Ci0JCQlyZXR1cm4gRkFMU0U7Ci0JCX0KLQkJdmFsdWUgPSAwOwotCQlyZG1hbHQoQWRhcHRlciwgRUVQUk9NX1NQSV9RX1NUQVRVUzFfUkVHLCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOwotCX0KLQlyZXR1cm4gVFJVRTsKLQotCi19Ci0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUHJvY2VkdXJlOglSZWFkQmVjZWVtRUVQUk9NQnVsawotLy8KLS8vIERlc2NyaXB0aW9uOiBUaGlzIHJvdXRpbmUgcmVhZHMgMTZCeXRlIGRhdGEgZnJvbSBFRVBST00KLS8vCi0vLyBBcmd1bWVudHM6Ci0vLwkJQWRhcHRlciAgICAgLSBwdHIgdG8gQWRhcHRlciBvYmplY3QgaW5zdGFuY2UKLS8vICAgICAgICAgIGR3QWRkcmVzcyAtIEVFUFJPTSBPZmZzZXQgdG8gcmVhZCB0aGUgZGF0YSBmcm9tLgotLy8gICAgICAgICAgcGR3RGF0YSAgICAtIFBvaW50ZXIgdG8gZG91YmxlIHdvcmQgd2hlcmUgZGF0YSBuZWVkcyB0byBiZSBzdG9yZWQgaW4uCi0vLwotLy8gUmV0dXJuczoKLS8vCQlPU0FMX1NUQVRVU19DT0RFOgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1JTlQgUmVhZEJlY2VlbUVFUFJPTUJ1bGsoUE1JTklfQURBUFRFUiBBZGFwdGVyLERXT1JEIGR3QWRkcmVzcywgRFdPUkQgKnBkd0RhdGEpCi17Ci0JRFdPUkQgZHdSZXRyaWVzID0gMTY7Ci0JRFdPUkQgZHdJbmRleCA9IDA7Ci0JVUlOVCB2YWx1ZSwgdG1wVmFsOwotCi0KLQl2YWx1ZSA9IDA7Ci0JcmRtYWx0IChBZGFwdGVyLCAweDBmMDAzMDA4LCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOwotCi0JLy9yZWFkIDB4MGYwMDMwMjAgdW50aWxsICBiaXQgMSBvZiAweDBmMDAzMDA4IGlzIHNldC4KLQl3aGlsZSgoKHZhbHVlID4+IDEpICYgMSkgPT0gMCkKLQl7Ci0KLQkJcmRtYWx0IChBZGFwdGVyLCAweDBmMDAzMDIwLCAmdG1wVmFsLCBzaXplb2YodG1wVmFsKSk7Ci0JCWR3UmV0cmllcy0tOwotCQlpZihkd1JldHJpZXMgPT0gMCkKLQkJewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCXZhbHVlID0gMDsKLQkJcmRtYWx0IChBZGFwdGVyLCAweDBmMDAzMDA4LCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOwotCX0KLQotCXZhbHVlID0gZHdBZGRyZXNzIHwgMHhmYjAwMDAwMDsKLQl3cm1hbHQgKEFkYXB0ZXIsIDB4MGYwMDMwMTgsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7Ci0KLQl1ZGVsYXkoMTAwMCk7Ci0JdmFsdWUgPSAwOwotCWZvcihkd0luZGV4ID0gMDtkd0luZGV4IDwgNCA7IGR3SW5kZXgrKykKLQl7Ci0JCXZhbHVlID0gMDsKLQkJcmRtYWx0IChBZGFwdGVyLCAweDBmMDAzMDIwLCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOwotCQlwZHdEYXRhW2R3SW5kZXhdID0gdmFsdWU7Ci0KLQkJdmFsdWUgPSAwOwotCQlyZG1hbHQgKEFkYXB0ZXIsIDB4MGYwMDMwMjAsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7Ci0JCXBkd0RhdGFbZHdJbmRleF0gfD0gKHZhbHVlIDw8IDgpOwotCi0JCXZhbHVlID0gMDsKLQkJcmRtYWx0IChBZGFwdGVyLCAweDBmMDAzMDIwLCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOwotCQlwZHdEYXRhW2R3SW5kZXhdIHw9ICh2YWx1ZSA8PCAxNik7Ci0KLQkJdmFsdWUgPSAwOwotCQlyZG1hbHQgKEFkYXB0ZXIsIDB4MGYwMDMwMjAsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7Ci0JCXBkd0RhdGFbZHdJbmRleF0gfD0gKHZhbHVlIDw8IDI0KTsKLQotCX0KLQlyZXR1cm4gMDsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUHJvY2VkdXJlOglSZWFkQmVjZWVtRUVQUk9NCi0vLwotLy8gRGVzY3JpcHRpb246IFRoaXMgcm91dGluZSByZWFkcyA0Qnl0ZSBkYXRhIGZyb20gRUVQUk9NCi0vLwotLy8gQXJndW1lbnRzOgotLy8JCUFkYXB0ZXIgICAgIC0gcHRyIHRvIEFkYXB0ZXIgb2JqZWN0IGluc3RhbmNlCi0vLyAgICAgICAgICBkd0FkZHJlc3MgLSBFRVBST00gT2Zmc2V0IHRvIHJlYWQgdGhlIGRhdGEgZnJvbS4KLS8vICAgICAgICAgIHBkd0RhdGEgICAgLSBQb2ludGVyIHRvIGRvdWJsZSB3b3JkIHdoZXJlIGRhdGEgbmVlZHMgdG8gYmUgc3RvcmVkIGluLgotLy8KLS8vIFJldHVybnM6Ci0vLwkJT1NBTF9TVEFUVVNfQ09ERToKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSU5UIFJlYWRCZWNlZW1FRVBST00oUE1JTklfQURBUFRFUiBBZGFwdGVyLERXT1JEIGR3QWRkcmVzcywgRFdPUkQgKnBkd0RhdGEpCi17Ci0KLQlEV09SRCBkd1JlYWRWYWx1ZSA9IDA7Ci0JRFdPUkQgZHdSZXRyaWVzID0gMTYsIGR3Q29tcGxldGVXb3JkID0gMDsKLQlVSU5UCXZhbHVlLCB0bXBWYWw7Ci0KLQlyZG1hbHQoQWRhcHRlciwgMHgwZjAwMzAwOCwgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKLQl3aGlsZSAoKCh2YWx1ZSA+PiAxKSAmIDEpID09IDApIHsKLQkJcmRtYWx0KEFkYXB0ZXIsIDB4MGYwMDMwMjAsICZ0bXBWYWwsIHNpemVvZih0bXBWYWwpKTsKLQotCQlpZiAoZHdSZXRyaWVzID09IDApIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlyZG1hbHQoQWRhcHRlciwgMHgwZjAwMzAwOCwgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKLQl9Ci0KLQotCS8vd3JtICgweDBmMDAzMDE4LCAweE5iWFhYWFhYKSAgICAgIC8vIE4gaXMgdGhlIG51bWJlciBvZiBieXRlcyB1IHdhbnQgdG8gcmVhZCAgKDAgbWVhbnMgMSwgZiBtZWFucyAxNiwgICBiIGlzIHRoZSBvcGNvZGUgZm9yIHBhZ2UgcmVhZCkKLQkvLyAgICAgRm9sbG93IGl0IHVwIGJ5IE4gZXhlY3V0aW9ucyBvZiAgcmRtKDB4MGYwMDMwMjApIHRvIHJlYWQgdGhlIHJ4ZWQgYnl0ZXMgZnJvbSByeCBxdWV1ZS4KLQlkd0FkZHJlc3MgfD0gMHgzYjAwMDAwMDsKLQl3cm1hbHQoQWRhcHRlciwgMHgwZjAwMzAxOCwmZHdBZGRyZXNzLDQpOwotCW1kZWxheSgxMCk7Ci0JcmRtYWx0KEFkYXB0ZXIsIDB4MGYwMDMwMjAsJmR3UmVhZFZhbHVlLDQpOwotCWR3Q29tcGxldGVXb3JkPWR3UmVhZFZhbHVlOwotCXJkbWFsdChBZGFwdGVyLCAweDBmMDAzMDIwLCZkd1JlYWRWYWx1ZSw0KTsKLQlkd0NvbXBsZXRlV29yZHw9KGR3UmVhZFZhbHVlPDw4KTsKLQlyZG1hbHQoQWRhcHRlciwgMHgwZjAwMzAyMCwmZHdSZWFkVmFsdWUsNCk7Ci0JZHdDb21wbGV0ZVdvcmR8PShkd1JlYWRWYWx1ZTw8MTYpOwotCXJkbWFsdChBZGFwdGVyLCAweDBmMDAzMDIwLCZkd1JlYWRWYWx1ZSw0KTsKLQlkd0NvbXBsZXRlV29yZHw9KGR3UmVhZFZhbHVlPDwyNCk7Ci0KLQkqcGR3RGF0YSA9IGR3Q29tcGxldGVXb3JkOwotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKIAogSU5UIFJlYWRNYWNBZGRyZXNzRnJvbU5WTShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCiB7Ci0JSU5UIFN0YXR1cz0wLCBpOwotCXVuc2lnbmVkIGNoYXIgcHVNYWNBZGRyWzZdID0gezB9OwotCUlOVCBBbGxaZXJvTWFjID0gMDsKLQlJTlQgQWxsRkZNYWMgPSAwOworCUlOVCBTdGF0dXM7CisJdW5zaWduZWQgY2hhciBwdU1hY0FkZHJbNl07CiAKIAlTdGF0dXMgPSBCZWNlZW1OVk1SZWFkKEFkYXB0ZXIsCiAJCQkoUFVJTlQpJnB1TWFjQWRkclswXSwKIAkJCUlOSVRfUEFSQU1TXzFfTUFDQUREUkVTU19BRERSRVNTLAogCQkJTUFDX0FERFJFU1NfU0laRSk7CiAKLQlpZihTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkVycm9yIGluIFJlYWRpbmcgdGhlIG1hYyBBZGRyZXMgd2l0aCBzdGF0dXMgOiVkIiwgU3RhdHVzKTsKLQkJcmV0dXJuIFN0YXR1czsKLQl9Ci0KLQltZW1jcHkoQWRhcHRlci0+ZGV2LT5kZXZfYWRkciwgcHVNYWNBZGRyLCBNQUNfQUREUkVTU19TSVpFKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE5WTV9SVywgREJHX0xWTF9BTEwsIk1vZGVtIE1BQyBBZGRyIDoiKTsKLSAgICBCQ01fREVCVUdfUFJJTlRfQlVGRkVSKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCBEQkdfTFZMX0FMTCwmQWRhcHRlci0+ZGV2LT5kZXZfYWRkclswXSxNQUNfQUREUkVTU19TSVpFKTsKLQlmb3IoaT0wO2k8TUFDX0FERFJFU1NfU0laRTtpKyspCi0JewotCi0JCWlmKEFkYXB0ZXItPmRldi0+ZGV2X2FkZHJbaV0gPT0gMHgwMCkKLQkJCUFsbFplcm9NYWMrKzsKLQkJaWYoQWRhcHRlci0+ZGV2LT5kZXZfYWRkcltpXSA9PSAweEZGKQotCQkJQWxsRkZNYWMrKzsKLQotCX0KLQkvL0JDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIlxuIik7Ci0JaWYoQWxsWmVyb01hYyA9PSBNQUNfQUREUkVTU19TSVpFKQotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE5WTV9SVywgREJHX0xWTF9BTEwsIldhcm5pbmcgOjogTUFDIEFkZHJlc3MgaGFzIGFsbCAwMCdzIik7Ci0JaWYoQWxsRkZNYWMgPT0gTUFDX0FERFJFU1NfU0laRSkKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBOVk1fUlcsIERCR19MVkxfQUxMLCJXYXJuaW5nIDo6IE1BQyBBZGRyZXNzIGhhcyBhbGwgRkYncyIpOworCWlmKFN0YXR1cyA9PSBTVEFUVVNfU1VDQ0VTUykKKwkJbWVtY3B5KEFkYXB0ZXItPmRldi0+ZGV2X2FkZHIsIHB1TWFjQWRkciwgTUFDX0FERFJFU1NfU0laRSk7CiAKIAlyZXR1cm4gU3RhdHVzOwotCiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTQ3Niw3ICszNDAsNyBAQAogCQlSZWFkQmVjZWVtRUVQUk9NQnVsayhBZGFwdGVyLHVpVGVtcE9mZnNldCwoUFVJTlQpJnVpRGF0YVswXSw0KTsKIAkJaWYodWlCeXRlc1JlbWFpbmluZyA+PSAoTUFYX1JXX1NJWkUgLSB1aUV4dHJhQnl0ZXMpKQogCQl7Ci0JCQlPc2FsTWVtTW92ZShwQnVmZmVyLCgoKFBVQ0hBUikmdWlEYXRhWzBdKSt1aUV4dHJhQnl0ZXMpLE1BWF9SV19TSVpFIC0gdWlFeHRyYUJ5dGVzKTsKKwkJCW1lbWNweShwQnVmZmVyLCgoKFBVQ0hBUikmdWlEYXRhWzBdKSt1aUV4dHJhQnl0ZXMpLE1BWF9SV19TSVpFIC0gdWlFeHRyYUJ5dGVzKTsKIAogCQkJdWlCeXRlc1JlbWFpbmluZyAtPSAoTUFYX1JXX1NJWkUgLSB1aUV4dHJhQnl0ZXMpOwogCQkJdWlJbmRleCArPSAoTUFYX1JXX1NJWkUgLSB1aUV4dHJhQnl0ZXMpOwpAQCAtNDg0LDcgKzM0OCw3IEBACiAJCX0KIAkJZWxzZQogCQl7Ci0JCQlPc2FsTWVtTW92ZShwQnVmZmVyLCgoKFBVQ0hBUikmdWlEYXRhWzBdKSt1aUV4dHJhQnl0ZXMpLHVpQnl0ZXNSZW1haW5pbmcpOworCQkJbWVtY3B5KHBCdWZmZXIsKCgoUFVDSEFSKSZ1aURhdGFbMF0pK3VpRXh0cmFCeXRlcyksdWlCeXRlc1JlbWFpbmluZyk7CiAJCQl1aUluZGV4ICs9IHVpQnl0ZXNSZW1haW5pbmc7CiAJCQl1aU9mZnNldCArPSB1aUJ5dGVzUmVtYWluaW5nOwogCQkJdWlCeXRlc1JlbWFpbmluZyA9IDA7CkBAIC01MDgsNyArMzcyLDcgQEAKIAkJCSAqIFdlIHJlYWQgNCBEd29yZHMgb2YgZGF0YSAqLwogCQkJaWYoMCA9PSBSZWFkQmVjZWVtRUVQUk9NQnVsayhBZGFwdGVyLHVpT2Zmc2V0LCZ1aURhdGFbMF0sNCkpCiAJCQl7Ci0JCQkJT3NhbE1lbU1vdmUocGNCdWZmK3VpSW5kZXgsJnVpRGF0YVswXSxNQVhfUldfU0laRSk7CisJCQkJbWVtY3B5KHBjQnVmZit1aUluZGV4LCZ1aURhdGFbMF0sTUFYX1JXX1NJWkUpOwogCQkJCXVpT2Zmc2V0ICs9IE1BWF9SV19TSVpFOwogCQkJCXVpQnl0ZXNSZW1haW5pbmcgLT0gTUFYX1JXX1NJWkU7CiAJCQkJdWlJbmRleCArPSBNQVhfUldfU0laRTsKQEAgLTUyMyw3ICszODcsNyBAQAogCQl7CiAJCQlpZigwID09IFJlYWRCZWNlZW1FRVBST00oQWRhcHRlcix1aU9mZnNldCwmdWlEYXRhWzBdKSkKIAkJCXsKLQkJCQlPc2FsTWVtTW92ZShwY0J1ZmYrdWlJbmRleCwmdWlEYXRhWzBdLDQpOworCQkJCW1lbWNweShwY0J1ZmYrdWlJbmRleCwmdWlEYXRhWzBdLDQpOwogCQkJCXVpT2Zmc2V0ICs9IDQ7CiAJCQkJdWlCeXRlc1JlbWFpbmluZyAtPSA0OwogCQkJCXVpSW5kZXggKz00OwpAQCAtNTQwLDcgKzQwNCw3IEBACiAJCQlwQ2hhckJ1ZmYgKz0gdWlJbmRleDsKIAkJCWlmKDAgPT0gUmVhZEJlY2VlbUVFUFJPTShBZGFwdGVyLHVpT2Zmc2V0LCZ1aURhdGFbMF0pKQogCQkJewotCQkJCU9zYWxNZW1Nb3ZlKHBDaGFyQnVmZiwmdWlEYXRhWzBdLHVpQnl0ZXNSZW1haW5pbmcpOy8vY29weSBvbmx5IGJ5dGVzIHJlcXVlc3RlZC4KKwkJCQltZW1jcHkocENoYXJCdWZmLCZ1aURhdGFbMF0sdWlCeXRlc1JlbWFpbmluZyk7Ly9jb3B5IG9ubHkgYnl0ZXMgcmVxdWVzdGVkLgogCQkJCXVpQnl0ZXNSZW1haW5pbmcgPSAwOwogCQkJfQogCQkJZWxzZQpAQCAtNTcxLDcgKzQzNSw3IEBACiAvLwkJPEZBSUxVUkU+CQkJLSBpZiBmYWlsZWQuCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLUlOVCBCZWNlZW1GbGFzaEJ1bGtSZWFkKAorc3RhdGljIElOVCBCZWNlZW1GbGFzaEJ1bGtSZWFkKAogCVBNSU5JX0FEQVBURVIgQWRhcHRlciwKIAlQVUlOVCBwQnVmZmVyLAogCVVJTlQgdWlPZmZzZXQsCkBAIC02NTMsMTYgKzUxNyw4IEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1VSU5UIEJjbUdldEZsYXNoU2l6ZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCitzdGF0aWMgVUlOVCBCY21HZXRGbGFzaFNpemUoUE1JTklfQURBUFRFUiBBZGFwdGVyKQogewotI2lmIDAKLQlpZihBZGFwdGVyLT5iRERSSW5pdERvbmUpCi0JewotCQlyZXR1cm4gcmRtKEFkYXB0ZXIsRkxBU0hfQ09OVElHSU9VU19TVEFSVF9BRERSX0FGVEVSX0lOSVR8RkxBU0hfU0laRV9BRERSKTsKLQl9Ci0KLQlyZXR1cm4gcmRtKEFkYXB0ZXIsRkxBU0hfQ09OVElHSU9VU19TVEFSVF9BRERSX0JFRk9SRV9JTklUfEZMQVNIX1NJWkVfQUREUik7Ci0jZW5kaWYKIAlpZihJc0ZsYXNoMngoQWRhcHRlcikpCiAJCXJldHVybiAJKEFkYXB0ZXItPnBzRmxhc2gyeENTSW5mby0+T2Zmc2V0RnJvbURTRFN0YXJ0Rm9yRFNESGVhZGVyICsgc2l6ZW9mKERTRF9IRUFERVIpKTsKIAllbHNlCkBAIC02ODQsNyArNTQwLDcgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLVVJTlQgQmNtR2V0RUVQUk9NU2l6ZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCitzdGF0aWMgVUlOVCBCY21HZXRFRVBST01TaXplKFBNSU5JX0FEQVBURVIgQWRhcHRlcikKIHsKIAlVSU5UIHVpRGF0YSA9IDA7CiAJVUlOVCB1aUluZGV4ID0gMDsKQEAgLTczMyw2MCArNTg5LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmIDAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8vCi0vLyAgV3JpdGVCZWNlZW1FRVBST006IFdyaXRlcyA0IGJ5dGUgZGF0YSB0byBFRVBST00gb2Zmc2V0LgotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgdWlFRVBST01PZmZzZXQgLSBPZmZzZXQgdG8gYmUgd3JpdHRlbiB0by4KLS8vICAgICAgICAgICAgICAgICAgICAgdWlEYXRhICAgICAgICAgLSBEYXRhIHRvIGJlIHdyaXR0ZW4uCi0vLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1JTlQgV3JpdGVCZWNlZW1FRVBST00oUE1JTklfQURBUFRFUiBBZGFwdGVyLFVJTlQgdWlFRVBST01PZmZzZXQsIFVJTlQgdWlEYXRhKQotewotCUlOVCBTdGF0dXMgPSAwOwotCVVMT05HIHVsUmRCayA9IDA7Ci0JVUxPTkcgdWxSZXRyeUNvdW50ID0gMzsKLQlVSU5UIHZhbHVlOwotCi0JaWYodWlFRVBST01PZmZzZXQgPiBFRVBST01fRU5EKQotCXsKLQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JdWlEYXRhID0gaHRvbmwodWlEYXRhKTsKLQl3aGlsZSh1bFJldHJ5Q291bnQtLSkKLQl7Ci0JCXZhbHVlID0gMHgwNjAwMDAwMDsKLQkJd3JtYWx0KEFkYXB0ZXIsIDB4MEYwMDMwMTgsJnZhbHVlLCBzaXplb2YodmFsdWUpKTsvL2ZsdXNoIHRoZSBFRVBST00gRklGTy4KLQkJd3JtYWx0KEFkYXB0ZXIsIDB4MEYwMDMwMUMsJnVpRGF0YSwgc2l6ZW9mKHVpRGF0YSkpOwotCQl2YWx1ZSA9IDB4M0EwMDAwMDAgfCB1aUVFUFJPTU9mZnNldDsKLQkJd3JtYWx0KEFkYXB0ZXIsIDB4MEYwMDMwMTgsJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKLQkJX191ZGVsYXkoMTAwMDAwKTsKLQkJLy9yZWFkIGJhY2sgYW5kIHZlcmlmeS4KLQkJU3RhdHVzID0gUmVhZEJlY2VlbUVFUFJPTShBZGFwdGVyLHVpRUVQUk9NT2Zmc2V0LChVSU5UICopJnVsUmRCayk7Ci0JCWlmKFN0YXR1cyA9PSAwKQotCQl7Ci0JCQlpZih1bFJkQmsgPT0gdWlEYXRhKQotCQkJewotCQkJCXJldHVybiBTdGF0dXM7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiV3JpdGVCZWNlZW1FRVBST006IFJlYWRiYWNrIGRvZXMgbm90IG1hdGNoXG4iKTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIldyaXRlQmVjZWVtRUVQUk9NOiBSZWFkYmFjayBmYWlsZWRcbiIpOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gUHJvY2VkdXJlOglGbGFzaFNlY3RvckVyYXNlCkBAIC05NzMsNyArNzc1LDcgQEAKIC8vIG5lZWQgbm90IHdyaXRlIDB4RkZGRkZGRkYgYmVjYXVzZSB3cml0ZSByZXF1aXJlcyBhbiBlcmFzZSBhbmQgZXJhc2Ugd2lsbAogLy8gbWFrZSB3aG9sZSBzZWN0b3IgMHhGRkZGRkZGRi4KIC8vCi0JaWYgKCFPc2FsTWVtQ29tcGFyZShwRGF0YSwgdWlFcmFzZVBhdHRlcm4sIE1BWF9SV19TSVpFKSkKKwlpZiAoIW1lbWNtcChwRGF0YSwgdWlFcmFzZVBhdHRlcm4sIE1BWF9SV19TSVpFKSkKIAl7CiAJCXJldHVybiAwOwogCX0KQEAgLTExMzgsNyArOTQwLDcgQEAKIC8vIG5lZWQgbm90IHdyaXRlIDB4RkZGRkZGRkYgYmVjYXVzZSB3cml0ZSByZXF1aXJlcyBhbiBlcmFzZSBhbmQgZXJhc2Ugd2lsbAogLy8gbWFrZSB3aG9sZSBzZWN0b3IgMHhGRkZGRkZGRi4KIC8vCi0JaWYgKCFPc2FsTWVtQ29tcGFyZShwRGF0YSx1aUVyYXNlUGF0dGVybixNQVhfUldfU0laRSkpCisJaWYgKCFtZW1jbXAocERhdGEsdWlFcmFzZVBhdHRlcm4sTUFYX1JXX1NJWkUpKQogCXsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMTMzMiw3ICsxMTM0LDcgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLUlOVCBCZWNlZW1GbGFzaEJ1bGtXcml0ZSgKK3N0YXRpYyBJTlQgQmVjZWVtRmxhc2hCdWxrV3JpdGUoCiAJUE1JTklfQURBUFRFUiBBZGFwdGVyLAogCVBVSU5UIHBCdWZmZXIsCiAJVUlOVCB1aU9mZnNldCwKQEAgLTEzNTMsMTUgKzExNTUsNiBAQAogCVVJTlQgdWlUZW1wIAkJCQk9IDA7CiAJVUlOVCBpbmRleCAJCQkJCT0gMDsKIAlVSU5UIHVpUGFydE9mZnNldCAJCQk9IDA7Ci0JI2lmIDAKLQlzdHJ1Y3QgdGltZXZhbCB0djEgPSB7MH07Ci0Jc3RydWN0IHRpbWV2YWwgdHYyID0gezB9OwotCi0Jc3RydWN0IHRpbWV2YWwgdHIgPSB7MH07Ci0Jc3RydWN0IHRpbWV2YWwgdGUgPSB7MH07Ci0Jc3RydWN0IHRpbWV2YWwgdHcgPSB7MH07Ci0Jc3RydWN0IHRpbWV2YWwgdHd2ID0gezB9OwotCSNlbmRpZgogCiAjaWYgZGVmaW5lZChCQ01fU0hNX0lOVEVSRkFDRSkgJiYgIWRlZmluZWQoRkxBU0hfRElSRUNUX0FDQ0VTUykKICAgU3RhdHVzID0gYmNtZmxhc2hfcmF3X3dyaXRlKCh1aU9mZnNldC9GTEFTSF9QQVJUX1NJWkUpLCh1aU9mZnNldCAlIEZMQVNIX1BBUlRfU0laRSksKCB1bnNpZ25lZCBjaGFyICopcEJ1ZmZlcix1aU51bUJ5dGVzKTsKQEAgLTEzNzcsMTIgKzExNzAsOSBAQAogCXVpQ3VyclNlY3RPZmZzZXRBZGRyCT0gdWlPZmZzZXQgJiAoQWRhcHRlci0+dWlTZWN0b3JTaXplIC0gMSk7CiAJdWlTZWN0Qm91bmRhcnkJICAJCT0gdWlTZWN0QWxpZ25BZGRyICsgQWRhcHRlci0+dWlTZWN0b3JTaXplOwogCi0JLy9wVGVtcEJ1ZmYgPSBPc2FsTWVtQWxsb2MoTUFYX1NFQ1RPUl9TSVpFLCchTVZOJyk7Ci0JcFRlbXBCdWZmID0gT3NhbE1lbUFsbG9jKEFkYXB0ZXItPnVpU2VjdG9yU2l6ZSAsIiFNVk4iKTsKKwlwVGVtcEJ1ZmYgPSBrbWFsbG9jKEFkYXB0ZXItPnVpU2VjdG9yU2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYoTlVMTCA9PSBwVGVtcEJ1ZmYpCi0JewogCQlnb3RvIEJlY2VlbUZsYXNoQnVsa1dyaXRlX0VYSVQ7Ci0JfQogLy8KIC8vIGNoZWNrIGlmIHRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4gaXMgb3ZlcmxhcHBlZCBhY2Nyb3NzIHNlY3RvcnMKIC8vCkBAIC0xMzk5LDcgKzExODksNiBAQAogCQkJdWlOdW1TZWN0VG9iZVJlYWQrKzsKIAkJfQogCX0KLQkjaWYgMQogCS8vQ2hlY2sgd2hldGhlciBSZXF1ZXN0ZWQgc2VjdG9yIGlzIHdyaXRhYmxlIG9yIG5vdCBpbiBjYXNlIG9mIGZsYXNoMnggd3JpdGUuIEJ1dCBpZiAgd3JpdGUgY2FsbCBpcwogCS8vIGZvciBEU0QgY2FsaWJyYXRpb24sIGFsbG93IGl0IHdpdGhvdXQgY2hlY2tpbmcgb2Ygc2VjdG9yIHBlcm1pc3Npb24KIApAQCAtMTQyMCw3ICsxMjA5LDYgQEAKIAkJCSBpbmRleCA9IGluZGV4ICsgMSA7CiAJCX0KIAl9Ci0JI2VuZGlmCiAJQWRhcHRlci0+U2VsZWN0ZWRDaGlwID0gUkVTRVRfQ0hJUF9TRUxFQ1Q7CiAJd2hpbGUodWlOdW1TZWN0VG9iZVJlYWQpCiAJewpAQCAtMTQ0OCwxMyArMTIzNiwxMyBAQAogCQlpZih1aU51bVNlY3RUb2JlUmVhZCA+IDEpCiAJCXsKIAotCQkJT3NhbE1lbU1vdmUoJnBUZW1wQnVmZlt1aUN1cnJTZWN0T2Zmc2V0QWRkcl0scGNCdWZmZXIsdWlTZWN0Qm91bmRhcnktKHVpU2VjdEFsaWduQWRkcit1aUN1cnJTZWN0T2Zmc2V0QWRkcikpOworCQkJbWVtY3B5KCZwVGVtcEJ1ZmZbdWlDdXJyU2VjdE9mZnNldEFkZHJdLHBjQnVmZmVyLHVpU2VjdEJvdW5kYXJ5LSh1aVNlY3RBbGlnbkFkZHIrdWlDdXJyU2VjdE9mZnNldEFkZHIpKTsKIAkJCXBjQnVmZmVyICs9ICgodWlTZWN0Qm91bmRhcnktKHVpU2VjdEFsaWduQWRkcit1aUN1cnJTZWN0T2Zmc2V0QWRkcikpKTsKIAkJCXVpTnVtQnl0ZXMgLT0gKHVpU2VjdEJvdW5kYXJ5LSh1aVNlY3RBbGlnbkFkZHIrdWlDdXJyU2VjdE9mZnNldEFkZHIpKTsKIAkJfQogCQllbHNlCiAJCXsKLQkJCQlPc2FsTWVtTW92ZSgmcFRlbXBCdWZmW3VpQ3VyclNlY3RPZmZzZXRBZGRyXSxwY0J1ZmZlcix1aU51bUJ5dGVzKTsKKwkJCQltZW1jcHkoJnBUZW1wQnVmZlt1aUN1cnJTZWN0T2Zmc2V0QWRkcl0scGNCdWZmZXIsdWlOdW1CeXRlcyk7CiAJCX0KIAogCQlpZihJc0ZsYXNoMngoQWRhcHRlcikpCkBAIC0xNTAzLDcgKzEyOTEsNyBAQAogCQkJCX0KIAkJCQllbHNlCiAJCQkJewotCQkJCQlpZihPc2FsTWVtQ29tcGFyZSh1Y1JlYWRCaywmcFRlbXBCdWZmW3VpSW5kZXhdLE1BWF9SV19TSVpFKSkKKwkJCQkJaWYobWVtY21wKHVjUmVhZEJrLCZwVGVtcEJ1ZmZbdWlJbmRleF0sTUFYX1JXX1NJWkUpKQogCQkJCQl7CiAJCQkJCQlpZihTVEFUVVNfU1VDQ0VTUyAhPSAoKkFkYXB0ZXItPmZwRmxhc2hXcml0ZVdpdGhTdGF0dXNDaGVjaykoQWRhcHRlcix1aVBhcnRPZmZzZXQrdWlJbmRleCwmcFRlbXBCdWZmW3VpSW5kZXhdKSkKIAkJCQkJCXsKQEAgLTE1NDEsMTAgKzEzMjksOCBAQAogCXsKIAkJQmNtUmVzdG9yZUJsb2NrUHJvdGVjdFN0YXR1cyhBZGFwdGVyLHVsU3RhdHVzKTsKIAl9Ci0JaWYocFRlbXBCdWZmKQotCXsKLQkJT3NhbE1lbUZyZWUocFRlbXBCdWZmLEFkYXB0ZXItPnVpU2VjdG9yU2l6ZSk7Ci0JfQorCQorCWtmcmVlKHBUZW1wQnVmZik7CiAKIAlBZGFwdGVyLT5TZWxlY3RlZENoaXAgPSBSRVNFVF9DSElQX1NFTEVDVDsKIAlyZXR1cm4gU3RhdHVzOwpAQCAtMTU5OSwxNCArMTM4NSwxMCBAQAogCXVpQ3VyclNlY3RPZmZzZXRBZGRyCT0gdWlPZmZzZXQgJiAoQWRhcHRlci0+dWlTZWN0b3JTaXplIC0gMSk7CiAJdWlTZWN0Qm91bmRhcnkJCQk9IHVpU2VjdEFsaWduQWRkciArIEFkYXB0ZXItPnVpU2VjdG9yU2l6ZTsKIAotCi0KLS8vCXBUZW1wQnVmZiA9IE9zYWxNZW1BbGxvYyhNQVhfU0VDVE9SX1NJWkUsJyFNVk4nKTsKLQlwVGVtcEJ1ZmYgPSBPc2FsTWVtQWxsb2MoQWRhcHRlci0+dWlTZWN0b3JTaXplLCIhTVZOIik7CisJcFRlbXBCdWZmID0ga21hbGxvYyhBZGFwdGVyLT51aVNlY3RvclNpemUsIEdGUF9LRVJORUwpOwogCWlmKE5VTEwgPT0gcFRlbXBCdWZmKQotCXsKIAkJZ290byBCZWNlZW1GbGFzaEJ1bGtXcml0ZVN0YXR1c19FWElUOwotCX0KKwogLy8KIC8vIGNoZWNrIGlmIHRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4gaXMgb3ZlcmxhcHBlZCBhY2Nyb3NzIHNlY3RvcnMKIC8vCkBAIC0xNjYyLDEzICsxNDQ0LDEzIEBACiAJCWlmKHVpTnVtU2VjdFRvYmVSZWFkID4gMSkKIAkJewogCi0JCQlPc2FsTWVtTW92ZSgmcFRlbXBCdWZmW3VpQ3VyclNlY3RPZmZzZXRBZGRyXSxwY0J1ZmZlcix1aVNlY3RCb3VuZGFyeS0odWlTZWN0QWxpZ25BZGRyK3VpQ3VyclNlY3RPZmZzZXRBZGRyKSk7CisJCQltZW1jcHkoJnBUZW1wQnVmZlt1aUN1cnJTZWN0T2Zmc2V0QWRkcl0scGNCdWZmZXIsdWlTZWN0Qm91bmRhcnktKHVpU2VjdEFsaWduQWRkcit1aUN1cnJTZWN0T2Zmc2V0QWRkcikpOwogCQkJcGNCdWZmZXIgKz0gKCh1aVNlY3RCb3VuZGFyeS0odWlTZWN0QWxpZ25BZGRyK3VpQ3VyclNlY3RPZmZzZXRBZGRyKSkpOwogCQkJdWlOdW1CeXRlcyAtPSAodWlTZWN0Qm91bmRhcnktKHVpU2VjdEFsaWduQWRkcit1aUN1cnJTZWN0T2Zmc2V0QWRkcikpOwogCQl9CiAJCWVsc2UKIAkJewotCQkJT3NhbE1lbU1vdmUoJnBUZW1wQnVmZlt1aUN1cnJTZWN0T2Zmc2V0QWRkcl0scGNCdWZmZXIsdWlOdW1CeXRlcyk7CisJCQltZW1jcHkoJnBUZW1wQnVmZlt1aUN1cnJTZWN0T2Zmc2V0QWRkcl0scGNCdWZmZXIsdWlOdW1CeXRlcyk7CiAJCX0KIAogCQlpZihJc0ZsYXNoMngoQWRhcHRlcikpCkBAIC0xNjk4LDI1ICsxNDgwLDEwIEBACiAJCXsKIAkJCWZvcih1aUluZGV4ID0gMDt1aUluZGV4IDwgQWRhcHRlci0+dWlTZWN0b3JTaXplO3VpSW5kZXggKz0gTUFYX1JXX1NJWkUpCiAJCQl7Ci0jaWYgMAotCQkJCWlmKDAgPT0gQmVjZWVtRmxhc2hCdWxrUmVhZChBZGFwdGVyLHVpUmVhZEJrLHVpT2Zmc2V0RnJvbVNlY3RTdGFydCt1aUluZGV4ICsgQWRhcHRlci0+dWxGbGFzaENhbFN0YXJ0ICxNQVhfUldfU0laRSkpCi0JCQkJewotCQkJCQlmb3IodWlSZWFkSW5kZXggPSAwO3VpUmVhZEluZGV4IDwgNDsgdWlSZWFkSW5kZXgrKykKLQkJCQkJewotCQkJCQkJaWYoKigoUFVJTlQpJnBUZW1wQnVmZlt1aUluZGV4K3VpUmVhZEluZGV4KjRdKSAhPSB1aVJlYWRCa1t1aVJlYWRJbmRleF0pCi0JCQkJCQl7Ci0JCQkJCQkJU3RhdHVzID0gLTE7Ci0JCQkJCQkJZ290byBCZWNlZW1GbGFzaEJ1bGtXcml0ZVN0YXR1c19FWElUOwotCi0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCX0KLSNlbmRpZgogCiAJCQkJaWYoU1RBVFVTX1NVQ0NFU1MgPT0gQmVjZWVtRmxhc2hCdWxrUmVhZChBZGFwdGVyLChQVUlOVCl1Y1JlYWRCayx1aU9mZnNldEZyb21TZWN0U3RhcnQrdWlJbmRleCxNQVhfUldfU0laRSkpCiAJCQkJewotCQkJCQlpZihPc2FsTWVtQ29tcGFyZSh1Y1JlYWRCaywmcFRlbXBCdWZmW3VpSW5kZXhdLE1BWF9SV19TSVpFKSkKKwkJCQkJaWYobWVtY21wKHVjUmVhZEJrLCZwVGVtcEJ1ZmZbdWlJbmRleF0sTUFYX1JXX1NJWkUpKQogCQkJCQl7CiAJCQkJCQlTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKIAkJCQkJCWdvdG8gQmVjZWVtRmxhc2hCdWxrV3JpdGVTdGF0dXNfRVhJVDsKQEAgLTE3NDcsMTAgKzE1MTQsOCBAQAogCXsKIAkJQmNtUmVzdG9yZUJsb2NrUHJvdGVjdFN0YXR1cyhBZGFwdGVyLHVsU3RhdHVzKTsKIAl9Ci0JaWYocFRlbXBCdWZmKQotCXsKLQkJT3NhbE1lbUZyZWUocFRlbXBCdWZmLEFkYXB0ZXItPnVpU2VjdG9yU2l6ZSk7Ci0JfQorCisJa2ZyZWUocFRlbXBCdWZmKTsKIAlBZGFwdGVyLT5TZWxlY3RlZENoaXAgPSBSRVNFVF9DSElQX1NFTEVDVDsKIAlyZXR1cm4gU3RhdHVzOwogCkBAIC0xNzcxLDcgKzE1MzYsNyBAQAogCiBJTlQgUHJvcGFnYXRlQ2FsUGFyYW1zRnJvbUVFUFJPTVRvTWVtb3J5KFBNSU5JX0FEQVBURVIgQWRhcHRlcikKIHsKLQlQQ0hBUiBwQnVmZiA9IE9zYWxNZW1BbGxvYyhCVUZGRVJfNEssIjNNVk4iKTsKKwlQQ0hBUiBwQnVmZiA9IGttYWxsb2MoQlVGRkVSXzRLLCBHRlBfS0VSTkVMKTsKIAlVSU5UIHVpRWVwcm9tU2l6ZSA9IDA7CiAJVUlOVCB1aUluZGV4ID0gMDsKIAlVSU5UIHVpQnl0ZXNUb0NvcHkgPSAwOwpAQCAtMTc4NywxNCArMTU1MiwxNCBAQAogCWlmKDAgIT0gQmVjZWVtRUVQUk9NQnVsa1JlYWQoQWRhcHRlciwmdWlFZXByb21TaXplLEVFUFJPTV9TSVpFX09GRlNFVCw0KSkKIAl7CiAKLQkJT3NhbE1lbUZyZWUocEJ1ZmYsQlVGRkVSXzRLKTsKKwkJa2ZyZWUocEJ1ZmYpOwogCQlyZXR1cm4gLTE7CiAJfQogCiAJdWlFZXByb21TaXplID4+PSAxNjsKIAlpZih1aUVlcHJvbVNpemUgPiAxMDI0KjEwMjQpCiAJewotCQlPc2FsTWVtRnJlZShwQnVmZixCVUZGRVJfNEspOworCQlrZnJlZShwQnVmZik7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTE4MjAsNyArMTU4NSw3IEBACiAJd3JtYWx0KEFkYXB0ZXIsIEVFUFJPTV9DQUxfREFUQV9JTlRFUk5BTF9MT0MtNCwmdmFsdWUsIHNpemVvZih2YWx1ZSkpOwogCXZhbHVlID0gMHhiZWFkYmVhZDsKIAl3cm1hbHQoQWRhcHRlciwgRUVQUk9NX0NBTF9EQVRBX0lOVEVSTkFMX0xPQy04LCZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7Ci0JT3NhbE1lbUZyZWUocEJ1ZmYsTUFYX1JXX1NJWkUpOworCWtmcmVlKHBCdWZmKTsKIAogCXJldHVybiBTdGF0dXM7CiAKQEAgLTE4NzMsMTYgKzE2MzgsMTMgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAotCXBCdWZmID0gT3NhbE1lbUFsbG9jKHVpRWVwcm9tU2l6ZSwgMCk7Ci0KKwlwQnVmZiA9IGttYWxsb2ModWlFZXByb21TaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoIHBCdWZmID09IE5VTEwgKQotCXsKIAkJcmV0dXJuIC0xOwotCX0KIAogCWlmKDAgIT0gQmVjZWVtTlZNUmVhZChBZGFwdGVyLChQVUlOVClwQnVmZix1aUNhbFN0YXJ0QWRkciwgdWlFZXByb21TaXplKSkKIAl7Ci0JCU9zYWxNZW1GcmVlKHBCdWZmLCAwKTsKKwkJa2ZyZWUocEJ1ZmYpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC0xOTA1LDcgKzE2NjcsNyBAQAogCQl1aUJ5dGVzVG9Db3B5ID0gTUlOKEJVRkZFUl80Syx1aUVlcHJvbVNpemUpOwogCX0KIAotCU9zYWxNZW1GcmVlKHBCdWZmLCAwKTsKKwlrZnJlZShwQnVmZik7CiAJcmV0dXJuIFN0YXR1czsKIAogfQpAQCAtMTk0NywxNCArMTcwOSwxNCBAQAogCQl7Ly8gZm9yIHRoZSByZXF1ZXN0cyBtb3JlIHRoYW4gb3IgZXF1YWwgdG8gTUFYX1JXX1NJWkUgYnl0ZXMsIHVzZSBidWxrIHJlYWQgZnVuY3Rpb24gdG8gbWFrZSB0aGUgYWNjZXNzIGZhc3Rlci4KIAkJCUJlY2VlbUVFUFJPTUJ1bGtSZWFkKEFkYXB0ZXIsJmF1aURhdGFbMF0sdWlPZmZzZXQsTUFYX1JXX1NJWkUpOwogCi0JCQlpZihPc2FsTWVtQ29tcGFyZSgmcEJ1ZmZlclt1aUluZGV4XSwmYXVpRGF0YVswXSxNQVhfUldfU0laRSkpCisJCQlpZihtZW1jbXAoJnBCdWZmZXJbdWlJbmRleF0sJmF1aURhdGFbMF0sTUFYX1JXX1NJWkUpKQogCQkJewogCQkJCS8vIHJlLXdyaXRlCiAJCQkJQmVjZWVtRUVQUk9NQnVsa1dyaXRlKEFkYXB0ZXIsKFBVQ0hBUikocEJ1ZmZlcit1aUluZGV4KSx1aU9mZnNldCxNQVhfUldfU0laRSxGQUxTRSk7CiAJCQkJbWRlbGF5KDMpOwogCQkJCUJlY2VlbUVFUFJPTUJ1bGtSZWFkKEFkYXB0ZXIsJmF1aURhdGFbMF0sdWlPZmZzZXQsTUFYX1JXX1NJWkUpOwogCi0JCQkJaWYoT3NhbE1lbUNvbXBhcmUoJnBCdWZmZXJbdWlJbmRleF0sJmF1aURhdGFbMF0sTUFYX1JXX1NJWkUpKQorCQkJCWlmKG1lbWNtcCgmcEJ1ZmZlclt1aUluZGV4XSwmYXVpRGF0YVswXSxNQVhfUldfU0laRSkpCiAJCQkJewogCQkJCQlyZXR1cm4gLTE7CiAJCQkJfQpAQCAtMTk4Niw3ICsxNzQ4LDcgQEAKIAkJZWxzZQogCQl7IC8vIEhhbmRsZSB0aGUgcmVhZHMgbGVzcyB0aGFuIDQgYnl0ZXMuLi4KIAkJCXVpRGF0YSA9IDA7Ci0JCQlPc2FsTWVtTW92ZSgmdWlEYXRhLCgoUFVDSEFSKXBCdWZmZXIpKyh1aUluZGV4KnNpemVvZihVSU5UKSksdWlOdW1CeXRlcyk7CisJCQltZW1jcHkoJnVpRGF0YSwoKFBVQ0hBUilwQnVmZmVyKSsodWlJbmRleCpzaXplb2YoVUlOVCkpLHVpTnVtQnl0ZXMpOwogCQkJQmVjZWVtRUVQUk9NQnVsa1JlYWQoQWRhcHRlciwmdWlSZGJrLHVpT2Zmc2V0LDQpOwogCiAJCQlpZihtZW1jbXAoJnVpRGF0YSwgJnVpUmRiaywgdWlOdW1CeXRlcykpCkBAIC0yMTg2LDcgKzE5NDgsNyBAQAogCiAJCWlmKHVpQnl0ZXNUb0NvcHkgPj0gKDE2IC11aUV4dHJhQnl0ZXMpKQogCQl7Ci0JCQlPc2FsTWVtTW92ZSgoKChQVUNIQVIpJnVpRGF0YVswXSkrdWlFeHRyYUJ5dGVzKSxwQnVmZmVyLE1BWF9SV19TSVpFLSB1aUV4dHJhQnl0ZXMpOworCQkJbWVtY3B5KCgoKFBVQ0hBUikmdWlEYXRhWzBdKSt1aUV4dHJhQnl0ZXMpLHBCdWZmZXIsTUFYX1JXX1NJWkUtIHVpRXh0cmFCeXRlcyk7CiAKIAkJCWlmICggU1RBVFVTX0ZBSUxVUkUgPT0gQmVjZWVtRUVQUk9NV3JpdGVQYWdlKCBBZGFwdGVyLCB1aURhdGEsIHVpVGVtcE9mZnNldCApICkKIAkJCQkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOwpAQCAtMjE5Nyw3ICsxOTU5LDcgQEAKIAkJfQogCQllbHNlCiAJCXsKLQkJCU9zYWxNZW1Nb3ZlKCgoKFBVQ0hBUikmdWlEYXRhWzBdKSt1aUV4dHJhQnl0ZXMpLHBCdWZmZXIsdWlCeXRlc1RvQ29weSk7CisJCQltZW1jcHkoKCgoUFVDSEFSKSZ1aURhdGFbMF0pK3VpRXh0cmFCeXRlcykscEJ1ZmZlcix1aUJ5dGVzVG9Db3B5KTsKIAogCQkJaWYgKCBTVEFUVVNfRkFJTFVSRSA9PSBCZWNlZW1FRVBST01Xcml0ZVBhZ2UoIEFkYXB0ZXIsIHVpRGF0YSwgdWlUZW1wT2Zmc2V0ICkgKQogCQkJCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7CkBAIC0yMjMzLDcgKzE5OTUsNyBAQAogCS8vIFRvIHByb2dyYW0gbm9uIDE2Ynl0ZSBhbGlnbmVkIGRhdGEsIHJlYWQgMTZieXRlIGFuZCB0aGVuIHVwZGF0ZS4KIAkvLwogCQkJQmVjZWVtRUVQUk9NQnVsa1JlYWQoQWRhcHRlciwmdWlEYXRhWzBdLHVpT2Zmc2V0LDE2KTsKLQkJCU9zYWxNZW1Nb3ZlKCZ1aURhdGFbMF0scEJ1ZmZlcit1aUluZGV4LHVpQnl0ZXNUb0NvcHkpOworCQkJbWVtY3B5KCZ1aURhdGFbMF0scEJ1ZmZlcit1aUluZGV4LHVpQnl0ZXNUb0NvcHkpOwogCiAKIAkJCWlmICggU1RBVFVTX0ZBSUxVUkUgPT0gQmVjZWVtRUVQUk9NV3JpdGVQYWdlKCBBZGFwdGVyLCB1aURhdGEsIHVpT2Zmc2V0ICkgKQpAQCAtMjUzNSw3ICsyMjk3LDcgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLVVJTlQgQmNtR2V0Rmxhc2hTZWN0b3JTaXplKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgVUlOVCBGbGFzaFNlY3RvclNpemVTaWcsIFVJTlQgRmxhc2hTZWN0b3JTaXplKQorc3RhdGljIFVJTlQgQmNtR2V0Rmxhc2hTZWN0b3JTaXplKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgVUlOVCBGbGFzaFNlY3RvclNpemVTaWcsIFVJTlQgRmxhc2hTZWN0b3JTaXplKQogewogCVVJTlQgdWlTZWN0b3JTaXplID0gMDsKIAlVSU5UIHVpU2VjdG9yU2lnID0gMDsKQEAgLTI2NDIsMjAgKzI0MDQsOCBAQAogCiBJTlQgQmNtSW5pdE5WTShQTUlOSV9BREFQVEVSIHBzX2FkYXB0ZXIpCiB7Ci0jaWZkZWYgQkNNX1NITV9JTlRFUkZBQ0UKLSNpZmRlZiBGTEFTSF9ESVJFQ1RfQUNDRVNTCi0JdW5zaWduZWQgaW50IGRhdGEsZGF0YTEsZGF0YTIgPSAxOwotCXdybShwc19hZGFwdGVyLCBQQURfU0VMRUNUX1JFR0lTVEVSLCAmZGF0YTIsIDQpOwotCWRhdGExID0gcmRtKHBzX2FkYXB0ZXIsU1lTX0NGRywmZGF0YSw0KTsKLQlkYXRhMSA9IHJkbShwc19hZGFwdGVyLFNZU19DRkcsJmRhdGEsNCk7Ci0JZGF0YTIgPSAoZGF0YSB8IDB4ODAgfCAweDgwMDApOwotCXdybShwc19hZGFwdGVyLFNZU19DRkcsICZkYXRhMiw0KTsgLy8gb3Zlci13cml0ZSBhcyBGbGFzaCBib290IG1vZGUKLSNlbmRpZgotCXBzX2FkYXB0ZXItPmVOVk1UeXBlID0gTlZNX0ZMQVNIOwotI2Vsc2UKIAlCY21WYWxpZGF0ZU52bVR5cGUocHNfYWRhcHRlcik7CiAJQmNtSW5pdEVFUFJPTVF1ZXVlcyhwc19hZGFwdGVyKTsKLSNlbmRpZgogCiAJaWYocHNfYWRhcHRlci0+ZU5WTVR5cGUgPT0gTlZNX0FVVE9ERVRFQ1QpCiAJewpAQCAtMjY4NCw3ICsyNDM0LDcgQEAKICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1JTlQgQmNtR2V0TnZtU2l6ZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCitzdGF0aWMgSU5UIEJjbUdldE52bVNpemUoUE1JTklfQURBUFRFUiBBZGFwdGVyKQogewogCWlmKEFkYXB0ZXItPmVOVk1UeXBlID09IE5WTV9FRVBST00pCiAJewpAQCAtMjcwOCw3ICsyNDU4LDcgQEAKIC8vIFJldHVybnM6CiAvLwkJPFZPSUQ+CiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1WT0lEIEJjbVZhbGlkYXRlTnZtVHlwZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCitzdGF0aWMgVk9JRCBCY21WYWxpZGF0ZU52bVR5cGUoUE1JTklfQURBUFRFUiBBZGFwdGVyKQogewogCiAJLy8KQEAgLTI3NzUsNyArMjUyNSw3IEBACiAJaWYocHNBZGFwdGVyLT5wc0ZsYXNoMnhDU0luZm8gPT0gTlVMTCkKIAl7CiAJCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJDYW4ndCBBbGxvY2F0ZSBtZW1vcnkgZm9yIEZsYXNoIDIueCIpOwotCQliY21fa2ZyZWUocHNBZGFwdGVyLT5wc0ZsYXNoQ1NJbmZvKTsKKwkJa2ZyZWUocHNBZGFwdGVyLT5wc0ZsYXNoQ1NJbmZvKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0yNzgzLDggKzI1MzMsOCBAQAogCWlmKHBzQWRhcHRlci0+cHNGbGFzaDJ4VmVuZG9ySW5mbyA9PSBOVUxMKQogCXsKIAkJQkNNX0RFQlVHX1BSSU5UKHBzQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkNhbid0IEFsbG9jYXRlIFZlbmRvciBJbmZvIE1lbW9yeSBmb3IgRmxhc2ggMi54Iik7Ci0JCWJjbV9rZnJlZShwc0FkYXB0ZXItPnBzRmxhc2hDU0luZm8pOwotCQliY21fa2ZyZWUocHNBZGFwdGVyLT5wc0ZsYXNoMnhDU0luZm8pOworCQlrZnJlZShwc0FkYXB0ZXItPnBzRmxhc2hDU0luZm8pOworCQlrZnJlZShwc0FkYXB0ZXItPnBzRmxhc2gyeENTSW5mbyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMjc5OCw5ICsyNTQ4LDkgQEAKIAkJQkNNX0RFQlVHX1BSSU5UKHBzQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIiBBZGFwdGVyIHN0cnVjdHVyZSBwb2ludCBpcyBOVUxMIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQliY21fa2ZyZWUocHNBZGFwdGVyLT5wc0ZsYXNoQ1NJbmZvKTsKLQliY21fa2ZyZWUocHNBZGFwdGVyLT5wc0ZsYXNoMnhDU0luZm8pOwotCWJjbV9rZnJlZShwc0FkYXB0ZXItPnBzRmxhc2gyeFZlbmRvckluZm8pOworCWtmcmVlKHBzQWRhcHRlci0+cHNGbGFzaENTSW5mbyk7CisJa2ZyZWUocHNBZGFwdGVyLT5wc0ZsYXNoMnhDU0luZm8pOworCWtmcmVlKHBzQWRhcHRlci0+cHNGbGFzaDJ4VmVuZG9ySW5mbyk7CiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTIDsKIH0KIApAQCAtMjk1NCw3ICsyNzA0LDcgQEAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CiAKLUlOVCBJc1NlY3Rpb25FeGlzdEluVmVuZG9ySW5mbyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIEZMQVNIMlhfU0VDVElPTl9WQUwgc2VjdGlvbikKK3N0YXRpYyBJTlQgSXNTZWN0aW9uRXhpc3RJblZlbmRvckluZm8oUE1JTklfQURBUFRFUiBBZGFwdGVyLCBGTEFTSDJYX1NFQ1RJT05fVkFMIHNlY3Rpb24pCiB7CiAgCXJldHVybiAoIEFkYXB0ZXItPnVpVmVuZG9yRXh0bkZsYWcgJiYKICAJCShBZGFwdGVyLT5wc0ZsYXNoMnhWZW5kb3JJbmZvLT5WZW5kb3JTZWN0aW9uW3NlY3Rpb25dLkFjY2Vzc0ZsYWdzICYgRkxBU0gyWF9TRUNUSU9OX1BSRVNFTlQpICYmCkBAIC0zMDUyLDcgKzI4MDIsNyBAQAogLy8JCTxWT0lEPgogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1JTlQgQmNtR2V0Rmxhc2hDU0luZm8oUE1JTklfQURBUFRFUiBBZGFwdGVyKQorc3RhdGljIElOVCBCY21HZXRGbGFzaENTSW5mbyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCiB7CiAJLy9GTEFTSF9DU19JTkZPIHNGbGFzaENzSW5mbyA9IHswfTsKIApAQCAtMzA3MCw3ICsyODIwLDYgQEAKIAltZW1zZXQoQWRhcHRlci0+cHNGbGFzaENTSW5mbywgMCAsc2l6ZW9mKEZMQVNIX0NTX0lORk8pKTsKIAltZW1zZXQoQWRhcHRlci0+cHNGbGFzaDJ4Q1NJbmZvLCAwICxzaXplb2YoRkxBU0gyWF9DU19JTkZPKSk7CiAKLSNpZm5kZWYgQkNNX1NITV9JTlRFUkZBQ0UKIAlpZighQWRhcHRlci0+YkREUkluaXREb25lKQogCXsKIAkJewpAQCAtMzA3OSw3ICsyODI4LDYgQEAKIAkJfQogCX0KIAotI2VuZGlmCiAKIAkvLyBSZWFkaW5nIGZpcnN0IDggQnl0ZXMgdG8gZ2V0IHRoZSBGbGFzaCBMYXlvdXQKIAkvLyBNYWdpY051bWJlcig0IGJ5dGVzKSArRmxhc2hMYXlvdXRNaW5vclZlcnNpb24oMiBCeXRlcykgK0ZsYXNoTGF5b3V0TWFqb3JWZXJzaW9uKDIgQnl0ZXMpCkBAIC0zMTQ3LDkgKzI4OTUsNyBAQAogCQkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOwogCQl9CiAJCUNvbnZlcnRFbmRpYW5PZjJYQ1NTdHJ1Y3R1cmUoQWRhcHRlci0+cHNGbGFzaDJ4Q1NJbmZvKTsKLSNpZm5kZWYgQkNNX1NITV9JTlRFUkZBQ0UKIAkJQmNtRHVtcEZsYXNoMlhDU1N0cnVjdHVyZShBZGFwdGVyLT5wc0ZsYXNoMnhDU0luZm8sQWRhcHRlcik7Ci0jZW5kaWYKIAkJaWYoKEZMQVNIX0NPTlRST0xfU1RSVUNUX1NJR05BVFVSRSA9PSBBZGFwdGVyLT5wc0ZsYXNoMnhDU0luZm8tPk1hZ2ljTnVtYmVyKSAmJgogCQkgICAoU0NTSV9GSVJNV0FSRV9NSU5PUl9WRVJTSU9OIDw9IE1JTk9SX1ZFUlNJT04oQWRhcHRlci0+cHNGbGFzaDJ4Q1NJbmZvLT5TQ1NJRmlybXdhcmVWZXJzaW9uKSkgJiYKIAkJICAgKEZMQVNIX1NFQ1RPUl9TSVpFX1NJRyA9PSBBZGFwdGVyLT5wc0ZsYXNoMnhDU0luZm8tPkZsYXNoU2VjdG9yU2l6ZVNpZykgJiYKQEAgLTMxODEsMjEgKzI5MjcsMTAgQEAKIAlDb25jZXJuczogd2hhdCBpZiBDUyBzZWN0b3Igc2l6ZSBkb2VzIG5vdCBtYXRjaCB3aXRoIHRoaXMgc2VjdG9yIHNpemUgPz8/CiAJd2hhdCBpcyB0aGUgaW5kaWNhdGlvbiBvZiBBY2Nlc3NCaXRNYXAgIGluIENTIGluIGZsYXNoIDIueCA/Pz8/CiAJKi8KLSNpZm5kZWYgQkNNX1NITV9JTlRFUkZBQ0UKIAlBZGFwdGVyLT51bEZsYXNoSUQgPSBCY21SZWFkRmxhc2hSRElEKEFkYXB0ZXIpOwotI2VuZGlmCiAKIAlBZGFwdGVyLT51aUZsYXNoTGF5b3V0TWFqb3JWZXJzaW9uID0gdWlGbGFzaExheW91dE1ham9yVmVyc2lvbjsKIAotCSNpZiAwCi0JaWYoRkxBU0hfUEFSVF9TU1QyNVZGMDgwQiA9PSBBZGFwdGVyLT51bEZsYXNoSUQpCi0JewotCS8vCi0JLy8gMU1CIGZsYXNoIGhhcyBiZWVuIHNlbGVjdGVkLiB3ZSBoYXZlIHRvIHVzZSA2NEsgYXMgc2VjdG9yIHNpemUgbm8gbWF0dGVyIHdoYXQgaXMga2VwdCBpbiBGTEFTSF9DUy4KLQkvLwotCQlBZGFwdGVyLT51aVNlY3RvclNpemUgPSAweDEwMDAwOwotCX0KLQkjZW5kaWYKIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUyA7CiB9CkBAIC0zMjE0LDcgKzI5NDksNyBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotTlZNX1RZUEUgQmNtR2V0TnZtVHlwZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCitzdGF0aWMgTlZNX1RZUEUgQmNtR2V0TnZtVHlwZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCiB7CiAJVUlOVCB1aURhdGEgPSAwOwogCkBAIC0zNTY5LDM5ICszMzA0LDYgQEAKIH0KIAogLyoqCi0qCVJlYWREU0RIZWFkZXIgOiBSZWFkIHRoZSBEU0QgbWFwIGZvciB0aGUgRFNEIFNlY3Rpb24gdmFsIHByb3ZpZGVkIGluIEFyZ3VtZW50LgotKglAQWRhcHRlciA6IEJlY2VlbSBQcml2YXRlIERhdGEgU3RydWN0dXJlCi0qCUBwc0RTREhlYWRlciA6UG9pbnRlciBvZiB0aGUgYnVmZmVyIHdoZXJlIGhlYWRlciBoYXMgdG8gYmUgcmVhZAotKglAZHNkIDp2YWx1ZSBvZiB0aGUgRHlhbm1pYyBEU0QgbGlrZSBEU0QwIG9mIERTRDEgb3IgRFNEMgotKgotKglSZXR1cm4gVmFsdWU6LQotKgkJaWYgc3VjZWVkcyByZXR1cm4gU1RBVFVTX1NVQ0NFU1Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZS4KLSoqLwotSU5UIFJlYWREU0RIZWFkZXIoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBQRFNEX0hFQURFUiBwc0RTREhlYWRlciwgRkxBU0gyWF9TRUNUSU9OX1ZBTCBkc2QpCi17Ci0JSU5UIFN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwotCi0JU3RhdHVzID1CY21GbGFzaDJ4QnVsa1JlYWQoQWRhcHRlciwKLQkJCQkJCSAgICAoUFVJTlQpcHNEU0RIZWFkZXIsCi0JCQkJCQkJZHNkLAotCQkJCQkJCUFkYXB0ZXItPnBzRmxhc2gyeENTSW5mby0+T2Zmc2V0RnJvbURTRFN0YXJ0Rm9yRFNESGVhZGVyLAotCQkJCQkJCXNpemVvZihEU0RfSEVBREVSKSk7Ci0JaWYoU3RhdHVzID09IFNUQVRVU19TVUNDRVNTKQotCXsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBOVk1fUlcsIERCR19MVkxfQUxMLCAiRFNESW1hZ2VNYWdpY051bWJlciA6MFgleCIsIG50b2hsKHBzRFNESGVhZGVyLT5EU0RJbWFnZU1hZ2ljTnVtYmVyKSk7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTlZNX1JXLCBEQkdfTFZMX0FMTCwgIkRTREltYWdlU2l6ZSA6MFgleCAiLG50b2hsKHBzRFNESGVhZGVyLT5EU0RJbWFnZVNpemUpKTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBOVk1fUlcsIERCR19MVkxfQUxMLCAiRFNESW1hZ2VDUkMgOjBYJXgiLG50b2hsKHBzRFNESGVhZGVyLT5EU0RJbWFnZUNSQykpOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE5WTV9SVywgREJHX0xWTF9BTEwsICJEU0RJbWFnZVByaW9yaXR5IDowWCV4IixudG9obChwc0RTREhlYWRlci0+RFNESW1hZ2VQcmlvcml0eSkpOwotCX0KLQllbHNlCi0JewotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkRTRCBIZWFkZXIgcmVhZCBpcyBmYWlsZWQgd2l0aCBzdGF0dXMgOiVkIiwgU3RhdHVzKTsKLQl9Ci0KLQlyZXR1cm4gU3RhdHVzOwotfQotCi0vKioKICoJQmNtR2V0QWN0aXZlRFNEIDogU2V0IHRoZSBBY3RpdmUgRFNEIGluIEFkYXB0ZXIgU3RydWN0dXJlIHdoaWNoIGhhcyB0byBiZSBkdW1wZWQgaW4gRERSCiAqCUBBZGFwdGVyIDotRHJpdmVycyBwcml2YXRlIERhdGEgU3RydWN0dXJlCiAqCkBAIC0zNjA5LDcgKzMzMTEsNyBAQAogKgkJUmV0dXJuIFNUQVRVU19TVUNFU1MgaWYgZ2V0IHN1Y2VzcyBpbiBzZXR0aW5nIHRoZSByaWdodCBEU0QgZWxzZSBuZWdhaXZlIGVycm9yIGNvZGUKICoKICoqLwotSU5UIEJjbUdldEFjdGl2ZURTRChQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCitzdGF0aWMgSU5UIEJjbUdldEFjdGl2ZURTRChQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCiB7CiAJRkxBU0gyWF9TRUNUSU9OX1ZBTCB1aUhpZ2hlc3RQcmlEU0QgPSAwIDsKIApAQCAtMzY0NywzOSArMzM0OSw2IEBACiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQogCi0vKioKLSoJUmVhZElTT1VuUmVzZXJ2ZWRCeXRlcyA6IFJlYWQgdGhlIElTTyBtYXAgZm9yIHRoZSBJU08gU2VjdGlvbiB2YWwgcHJvdmlkZWQgaW4gQXJndW1lbnQuCi0qCUBBZGFwdGVyIDogRHJpdmVyIFByaXZhdGUgRGF0YSBTdHJ1Y3R1cmUKLSoJQHBzSVNPSGVhZGVyIDpQb2ludGVyIG9mIHRoZSBsb2NhdGlvbiB3aGVyZSBoZWFkZXIgaGFzIHRvIGJlIHJlYWQKLSoJQElzb0ltYWdlIDp2YWx1ZSBvZiB0aGUgRHlhbm1pYyBJU08gbGlrZSBJU09fSU1BR0UxIG9mIElTT19JTUFHRTIKLSoKLSoJUmV0dXJuIFZhbHVlOi0KLSoJCWlmIHN1Y2VlZHMgcmV0dXJuIFNUQVRVU19TVUNDRVNTIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUuCi0qKi8KLQotSU5UIFJlYWRJU09IZWFkZXIoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBQSVNPX0hFQURFUiBwc0lTT0hlYWRlciwgRkxBU0gyWF9TRUNUSU9OX1ZBTCBJc29JbWFnZSkKLXsKLQlJTlQgU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7Ci0KLQlTdGF0dXMgPSBCY21GbGFzaDJ4QnVsa1JlYWQoQWRhcHRlciwKLQkJCQkJICAgIChQVUlOVClwc0lTT0hlYWRlciwKLQkJCQkJCUlzb0ltYWdlLAotCQkJCQkJMCwKLQkJCQkJCXNpemVvZihJU09fSEVBREVSKSk7Ci0KLQlpZihTdGF0dXMgPT0gU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE5WTV9SVywgREJHX0xWTF9BTEwsICJJU09JbWFnZU1hZ2ljTnVtYmVyIDowWCV4IiwgbnRvaGwocHNJU09IZWFkZXItPklTT0ltYWdlTWFnaWNOdW1iZXIpKTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBOVk1fUlcsIERCR19MVkxfQUxMLCAiSVNPSW1hZ2VTaXplIDowWCV4ICIsbnRvaGwocHNJU09IZWFkZXItPklTT0ltYWdlU2l6ZSkpOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE5WTV9SVywgREJHX0xWTF9BTEwsICJJU09JbWFnZUNSQyA6MFgleCIsbnRvaGwocHNJU09IZWFkZXItPklTT0ltYWdlQ1JDKSk7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTlZNX1JXLCBEQkdfTFZMX0FMTCwgIklTT0ltYWdlUHJpb3JpdHkgOjBYJXgiLG50b2hsKHBzSVNPSGVhZGVyLT5JU09JbWFnZVByaW9yaXR5KSk7Ci0JfQotCWVsc2UKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIklTTyBIZWFkZXIgUmVhZCBmYWlsZWQiKTsKLQl9Ci0JcmV0dXJuIFN0YXR1czsKLX0KIAogLyoqCiAqCUJjbUdldEFjdGl2ZUlTTyA6LSBTZXQgdGhlIEFjdGl2ZSBJU08gaW4gQWRhcHRlciBEYXRhIFN0cnVjdHVlCkBAIC0zNjkxLDcgKzMzNjAsNyBAQAogKgogKiovCiAKLUlOVCBCY21HZXRBY3RpdmVJU08oUE1JTklfQURBUFRFUiBBZGFwdGVyKQorc3RhdGljIElOVCBCY21HZXRBY3RpdmVJU08oUE1JTklfQURBUFRFUiBBZGFwdGVyKQogewogCiAJSU5UIEhpZ2hlc3RQcmlJU08gPSAwIDsKQEAgLTQ1ODgsNyArNDI1Nyw3IEBACiAKIAl9CiAKLQliY21fa2ZyZWUoQnVmZik7CisJa2ZyZWUoQnVmZik7CiAKIAlyZXR1cm4gU3RhdHVzOwogfQpAQCAtNDc4OSw3ICs0NDU4LDcgQEAKIAlTdWNjZXNzIDotIEJhc2UgQWRkcmVzcyBvZiB0aGUgRmxhc2gKICoqLwogCi1JTlQgR2V0Rmxhc2hCYXNlQWRkcihQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCitzdGF0aWMgSU5UIEdldEZsYXNoQmFzZUFkZHIoUE1JTklfQURBUFRFUiBBZGFwdGVyKQogewogCiAJVUlOVCB1aUJhc2VBZGRyID0gMDsKQEAgLTQ4NjYsMjAgKzQ1MzUsNiBAQAogCQlyZXR1cm4gIC1FSU5WQUw7CiAJfQogCi0JI2lmIDAKLQllbHNlCi0JewotCQlpZigoU3JjU2VjdGlvbiA9PSBWU0EwKSB8fCAoU3JjU2VjdGlvbiA9PSBWU0ExKSB8fCAoU3JjU2VjdGlvbiA9PSBWU0EyKSkKLQkJewotCQkJaWYoKERzdFNlY3Rpb24gIT0gVlNBMCkgJiYgKERzdFNlY3Rpb24gIT0gVlNBMSkgJiYgKERzdFNlY3Rpb24gIT0gVlNBMikpCi0JCQl7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBOVk1fUlcsIERCR19MVkxfQUxMLCJTb3VyY2UgYW5kIERlc3Rpb24gc2VjdG9uIGlzIG5vdCBvZiBzYW1lIHR5cGUiKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJfQotCi0JfQotCSNlbmRpZgogCS8vaWYgb2Zmc2V0IHplcm8gbWVhbnMgaGF2ZSB0byBjb3B5IGNvbXBsZXRlIHNlY3RvbgogCiAJaWYobnVtT2ZCeXRlcyA9PSAwKQpAQCAtNDk1NCw3ICs0NjA5LDcgQEAKIAkJCQlCeXRlc1RvQmVDb3BpZWQgPSBudW1PZkJ5dGVzOwogCQl9CiAJfXdoaWxlKG51bU9mQnl0ZXMgPiAwKSA7Ci0JYmNtX2tmcmVlKHBCdWZmKTsKKwlrZnJlZShwQnVmZik7CiAJQWRhcHRlci0+YkhlYWRlckNoYW5nZUFsbG93ZWQgPSBGQUxTRSA7CiAJcmV0dXJuIFN0YXR1czsKIH0KQEAgLTQ5NzksMTQgKzQ2MzQsNiBAQAogCVVJTlQgdWlTZWN0QWxpZ25BZGRyID0gMDsKIAlVSU5UIHNpZyA9IDA7CiAKLQkjaWYgMAotCS8vaWYgQ2hlbmdlcyBpbiBIZWFkZXIgaXMgYWxsb3dlZCwgUmV0dXJuIGJhY2sKLQlpZihBZGFwdGVyLT5iSGVhZGVyQ2hhbmdlQWxsb3dlZCA9PSBUUlVFKQotCXsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBOVk1fUlcsIERCR19MVkxfQUxMLCAiSGVhZGVyIENoYW5nZSBpcyBhbGxvd2VkIik7Ci0JCXJldHVybiBTVEFUVVNfU1VDQ0VTUyA7Ci0JfQotCSNlbmRpZgogCS8vbWFraW5nIHRoZSBvZmZzZXQgc2VjdG9yIGFsbGlnbmVkCiAJdWlTZWN0QWxpZ25BZGRyID0gdWlPZmZzZXQgJiB+KEFkYXB0ZXItPnVpU2VjdG9yU2l6ZSAtIDEpOwogCkBAIC01MDI0LDcgKzQ2NzEsNyBAQAogCQkvL1JlcGxhY2UgQnVmZmVyIGNvbnRlbnQgd2l0aCBIZWFkZXIKIAkJbWVtY3B5KHBCdWZmICtvZmZzZXRUb1Byb3RlY3QscFRlbXBCdWZmLEhlYWRlclNpemVUb1Byb3RlY3QpOwogCi0JCWJjbV9rZnJlZShwVGVtcEJ1ZmYpOworCQlrZnJlZShwVGVtcEJ1ZmYpOwogCX0KIAlpZihiSGFzSGVhZGVyICYmIEFkYXB0ZXItPmJTaWdDb3JydXB0ZWQpCiAJewpAQCAtNTA0NCwyOSArNDY5MSw3IEBACiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1MgOwogfQotSU5UIEJjbU1ha2VGbGFzaENTQWN0aXZlKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgVUlOVCBvZmZzZXQpCi17Ci0JVUlOVCBHUElPQ29uZmlnID0gMCA7CiAKLQotCWlmKEFkYXB0ZXItPmJGbGFzaFJhd1JlYWQgPT0gRkFMU0UpCi0JewotCQkvL0FwcGxpY2FibGUgZm9yIEZsYXNoMi54Ci0JCWlmKElzRmxhc2gyeChBZGFwdGVyKSA9PSBGQUxTRSkKLQkJCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKLQl9Ci0KLQlpZihvZmZzZXQvRkxBU0hfUEFSVF9TSVpFKQotCXsKLQkJLy9iaXRbMTQuLjEyXSAtPiB3aWxsIHNlbGVjdCBtYWtlIEFjdGl2ZSBDUzEsIENTMiBvciBDUzMKLQkJLy8gU2VsZWN0IENTMSwgQ1MyIGFuZCBDUzMgKENTMCBpcyBkZWRpY2F0ZWQgcGluKQotCQlyZG1hbHQoQWRhcHRlcixGTEFTSF9HUElPX0NPTkZJR19SRUcsICZHUElPQ29uZmlnLCA0KTsKLQkJR1BJT0NvbmZpZyB8PSAoNyA8PCAxMik7Ci0JCXdybWFsdChBZGFwdGVyLEZMQVNIX0dQSU9fQ09ORklHX1JFRywgJkdQSU9Db25maWcsIDQpOwotCX0KLQotCXJldHVybiBTVEFUVVNfU1VDQ0VTUyA7Ci19CiAvKioKIEJjbURvQ2hpcFNlbGVjdCA6IFRoaXMgd2lsbCBzZWxjZXQgdGhlIGFwcHJvcHJpYXRlIGNoaXAgZm9yIHdyaXRpbmcuCiBAQWRhcGF0ZXIgOi0gQmNtIERyaXZlciBQcml2YXRlIERhdGEgU3RydWN0dXJlCkBAIC01MDc0LDcgKzQ2OTksNyBAQAogT3V0UHV0Oi0KIAlTZWxlY3QgdGhlIEFwcHJvcHJpYXRlIGNoaXAgYW5kIHJldHJuIHN0YXR1cyBTdWNlc3MKICoqLwotSU5UIEJjbURvQ2hpcFNlbGVjdChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFVJTlQgb2Zmc2V0KQorc3RhdGljIElOVCBCY21Eb0NoaXBTZWxlY3QoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBVSU5UIG9mZnNldCkKIHsKIAlVSU5UIEZsYXNoQ29uZmlnID0gMDsKIAlJTlQgQ2hpcE51bSA9IDA7CkBAIC01MzY1LDM5ICs0OTkwLDYgQEAKIAlyZXR1cm4gU3RhdHVzOwogfQogCi0jaWYgMAotVUlOVCBnZXROdW1PZlN1YlNlY3Rpb25XaXRoV1JQZXJtaXNzb24oUE1JTklfQURBUFRFUiBBZGFwdGVyLCBTRUNUSU9OX1RZUEUgc2VjVHlwZSkKLXsKLQotCVVJTlQgbnVtT2ZXUlN1YlNlYyA9IDA7Ci0Jc3dpdGNoKHNlY1R5cGUpCi0JewotCQljYXNlIElTTyA6Ci0JCQlpZihJc1NlY3Rpb25Xcml0YWJsZShBZGFwdGVyLElTT19JTUFHRTEpKQotCQkJCW51bU9mV1JTdWJTZWMgPSBudW1PZldSU3ViU2VjICsgMTsKLQkJCWlmKElzU2VjdGlvbldyaXRhYmxlKEFkYXB0ZXIsSVNPX0lNQUdFMikpCi0JCQkJbnVtT2ZXUlN1YlNlYyA9IG51bU9mV1JTdWJTZWMgKyAxOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBEU0QgOgotCQkJaWYoSXNTZWN0aW9uV3JpdGFibGUoQWRhcHRlcixEU0QyKSkKLQkJCQludW1PZldSU3ViU2VjID0gbnVtT2ZXUlN1YlNlYyArIDE7Ci0JCQlpZihJc1NlY3Rpb25Xcml0YWJsZShBZGFwdGVyLERTRDEpKQotCQkJCW51bU9mV1JTdWJTZWMgPSBudW1PZldSU3ViU2VjICsgMTsKLQkJCWlmKElzU2VjdGlvbldyaXRhYmxlKEFkYXB0ZXIsRFNEMCkpCi0JCQkJbnVtT2ZXUlN1YlNlYyA9IG51bU9mV1JTdWJTZWMgKyAxOwotCQkJYnJlYWsgOwotCi0JCWNhc2UgVlNBIDoKLQkJCQkvL2ZvciBWU0EgQWRkIGNvZGUgSGVyZQotCQkgZGVmYXVsdCA6Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE5WTV9SVywgREJHX0xWTF9BTEwsIkludmFsaWQgc2VjdG9uPCVkPiBpcyBwYXNzZWQiLCBzZWNUeXBlKTtcCi0JCQludW1PZldSU3ViU2VjID0gMDsKLQotCX0KLQlyZXR1cm4gbnVtT2ZXUlN1YlNlYzsKLX0KLSNlbmRpZgogQk9PTEVBTiBJc1NlY3Rpb25FeGlzdEluRmxhc2goUE1JTklfQURBUFRFUiBBZGFwdGVyLCBGTEFTSDJYX1NFQ1RJT05fVkFMIHNlY3Rpb24pCiB7CiAKQEAgLTU0NzksNyArNTA3MSw3IEBACiAJCXJldHVybiBTdGF0dXMgOwogfQogCi1JTlQgQ29ycnVwdERTRFNpZyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIEZMQVNIMlhfU0VDVElPTl9WQUwgZUZsYXNoMnhTZWN0aW9uVmFsKQorc3RhdGljIElOVCBDb3JydXB0RFNEU2lnKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgRkxBU0gyWF9TRUNUSU9OX1ZBTCBlRmxhc2gyeFNlY3Rpb25WYWwpCiB7CiAKIAlQVUNIQVIgcEJ1ZmYgPSBOVUxMOwpAQCAtNTU0MywxNiArNTEzNSwxNiBAQAogCWVsc2UKIAl7CiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiQkNNIFNpZ25hdHVyZSBpcyBub3QgcHJlc2VudCBpbiBoZWFkZXIiKTsKLQkJYmNtX2tmcmVlKHBCdWZmKTsKKwkJa2ZyZWUocEJ1ZmYpOwogCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7CiAJfQogCi0JYmNtX2tmcmVlKHBCdWZmKTsKKwlrZnJlZShwQnVmZik7CiAJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBOVk1fUlcsIERCR19MVkxfQUxMLCJDb3JydXB0ZWQgdGhlIHNpZ25hdHVyZSIpOwogCXJldHVybiBTVEFUVVNfU1VDQ0VTUyA7CiB9CiAKLUlOVCBDb3JydXB0SVNPU2lnKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgRkxBU0gyWF9TRUNUSU9OX1ZBTCBlRmxhc2gyeFNlY3Rpb25WYWwpCitzdGF0aWMgSU5UIENvcnJ1cHRJU09TaWcoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBGTEFTSDJYX1NFQ1RJT05fVkFMIGVGbGFzaDJ4U2VjdGlvblZhbCkKIHsKIAogCVBVQ0hBUiBwQnVmZiA9IE5VTEw7CkBAIC01NTkzLDE0ICs1MTg1LDE0IEBACiAJZWxzZQogCXsKIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJCQ00gU2lnbmF0dXJlIGlzIG5vdCBwcmVzZW50IGluIGhlYWRlciIpOwotCQliY21fa2ZyZWUocEJ1ZmYpOworCQlrZnJlZShwQnVmZik7CiAJCXJldHVybiBTVEFUVVNfRkFJTFVSRTsKIAl9CiAKIAlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE5WTV9SVywgREJHX0xWTF9BTEwsIkNvcnJ1cHRlZCB0aGUgc2lnbmF0dXJlIik7CiAJQkNNX0RFQlVHX1BSSU5UX0JVRkZFUihBZGFwdGVyLERCR19UWVBFX09USEVSUywgTlZNX1JXLCBEQkdfTFZMX0FMTCxwQnVmZixNQVhfUldfU0laRSk7CiAKLQliY21fa2ZyZWUocEJ1ZmYpOworCWtmcmVlKHBCdWZmKTsKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1MgOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL252bS5oIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9udm0uaAppbmRleCA2ZWM2Y2E4Li42NTFiNWE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL252bS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vbnZtLmgKQEAgLTMyMywxNSArMzIzLDYgQEAKIAogCiAKLSNpZmRlZiBCQ01fU0hNX0lOVEVSRkFDRQotCi0jZGVmaW5lIEZMQVNIX0FERFJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRjAwMDAwMAotZXh0ZXJuIGludCBiY21mbGFzaF9yYXdfcmVhZCh1bnNpZ25lZCBpbnQgZmxhc2hfaWQsIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGNoYXIgKmluYnVmLCB1bnNpZ25lZCBpbnQgbGVuKTsKLWV4dGVybiBpbnQgYmNtZmxhc2hfcmF3X3dyaXRlKHVuc2lnbmVkIGludCBmbGFzaF9pZCwgdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgY2hhciAqb3V0YnVmLCB1bnNpZ25lZCBpbnQgbGVuKTsKLWV4dGVybiBpbnQgYmNtZmxhc2hfcmF3X3dyaXRlbm9lcmFzZSh1bnNpZ25lZCBpbnQgZmxhc2hfaWQsIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGNoYXIgKm91dGJ1ZiwgdW5zaWduZWQgaW50IGxlbik7Ci0KLQotI2VuZGlmCiAKICNkZWZpbmUgRkxBU0hfQ09OVElHSU9VU19TVEFSVF9BRERSX0FGVEVSX0lOSVQgICAweDFDMDAwMDAwCiAjZGVmaW5lIEZMQVNIX0NPTlRJR0lPVVNfU1RBUlRfQUREUl9CRUZPUkVfSU5JVCAgMHgxRjAwMDAwMApAQCAtNDE0LDc2ICs0MDUsNSBAQAogCiAjZGVmaW5lIEZJRUxEX09GRlNFVF9JTl9IRUFERVIoSGVhZGVyUG9pbnRlcixGaWVsZCkgKChQVUNIQVIpJigoSGVhZGVyUG9pbnRlcikoTlVMTCkpLT5GaWVsZCAtIChQVUNIQVIpKE5VTEwpKQogCi0jaWYgMAotSU5UIEJlY2VlbUVFUFJPTUJ1bGtSZWFkKAotCVBNSU5JX0FEQVBURVIgQWRhcHRlciwKLQlQVUlOVCBwQnVmZmVyLAotCVVJTlQgdWlPZmZzZXQsCi0JVUlOVCB1aU51bUJ5dGVzKTsKLQotCi1JTlQgQmVjZWVtRmxhc2hCdWxrUmVhZCgKLQlQTUlOSV9BREFQVEVSIEFkYXB0ZXIsCi0JUFVJTlQgcEJ1ZmZlciwKLQlVSU5UIHVpT2Zmc2V0LAotCVVJTlQgdWlOdW1CeXRlcyk7Ci0KLVVJTlQgQmNtR2V0RUVQUk9NU2l6ZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwotCi1VSU5UIEJjbUdldEZsYXNoU2l6ZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwotCi1VSU5UIEJjbUdldEZsYXNoU2VjdG9yU2l6ZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwotCi0KLQotSU5UIEJlY2VlbUZsYXNoQnVsa1dyaXRlKAotCVBNSU5JX0FEQVBURVIgQWRhcHRlciwKLQlQVUlOVCBwQnVmZmVyLAotCVVJTlQgdWlPZmZzZXQsCi0JVUlOVCB1aU51bUJ5dGVzLAotCUJPT0xFQU4gYlZlcmlmeSk7Ci0KLUlOVCBQcm9wYWdhdGVDYWxQYXJhbXNGcm9tRmxhc2hUb01lbW9yeShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwotCi1JTlQgUHJvcGFnYXRlQ2FsUGFyYW1zRnJvbUVFUFJPTVRvTWVtb3J5KFBNSU5JX0FEQVBURVIgQWRhcHRlcik7Ci0KLQotSU5UIEJlY2VlbUVFUFJPTUJ1bGtXcml0ZSgKLQlQTUlOSV9BREFQVEVSIEFkYXB0ZXIsCi0JUFVDSEFSIHBCdWZmZXIsCi0JVUlOVCB1aU9mZnNldCwKLQlVSU5UIHVpTnVtQnl0ZXMsCi0JQk9PTEVBTiBiVmVyaWZ5KTsKLQotCi1JTlQgUmVhZEJlY2VlbUVFUFJPTShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsVUlOVCBkd0FkZHJlc3MsIFVJTlQgKnBkd0RhdGEpOwotCi1OVk1fVFlQRSBCY21HZXROdm1UeXBlKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7Ci0KLUlOVCBCZWNlZW1OVk1SZWFkKAotCVBNSU5JX0FEQVBURVIgQWRhcHRlciwKLQlQVUlOVCBwQnVmZmVyLAotCVVJTlQgdWlPZmZzZXQsCi0JVUlOVCB1aU51bUJ5dGVzKTsKLQotSU5UIEJlY2VlbU5WTVdyaXRlKAotCVBNSU5JX0FEQVBURVIgQWRhcHRlciwKLQlQVUlOVCBwQnVmZmVyLAotCVVJTlQgdWlPZmZzZXQsCi0JVUlOVCB1aU51bUJ5dGVzLAotCUJPT0xFQU4gYlZlcmlmeSk7Ci0KLUlOVCBSZWFkTWFjQWRkcmVzc0Zyb21FRVBST00oUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKLQotSU5UIEJjbVVwZGF0ZVNlY3RvclNpemUoUE1JTklfQURBUFRFUiBBZGFwdGVyLFVJTlQgdWlTZWN0b3JTaXplKTsKLQotSU5UIEJjbUluaXROVk0oUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKLQotVk9JRCBCY21WYWxpZGF0ZU52bVR5cGUoUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKLQotVk9JRCBCY21HZXRGbGFzaENTSW5mbyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwotCi0jZW5kaWYKLQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vb3NhbF9taXNjLmggYi9kcml2ZXJzL3N0YWdpbmcvYmNtL29zYWxfbWlzYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjRhZGRlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vb3NhbF9taXNjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0JLyorKwotCi0JQ29weXJpZ2h0IChjKSBCZWNlZW0gQ29tbXVuaWNhdGlvbnMgSW5jLgotCi0JTW9kdWxlIE5hbWU6Ci0JCU9TQUxfTWlzYy5oCi0KLQlBYnN0cmFjdDoKLQkJUHJvdmlkZXMgdGhlIE9TIEFic3RyYWN0ZWQgbWFjcm9zIHRvIGFjY2VzczoKLQkJCUxpbmtlZCBMaXN0cwotCQkJRGlzcGF0Y2hlciBPYmplY3RzKEV2ZW50cyxTZW1hcGhvcmVzLFNwaW4gTG9ja3MgYW5kIHRoZSBsaWtlKQotCQkJRmlsZXMKLQotCi0JUmV2aXNpb24gSGlzdG9yeToKLQkJV2hvICAgICAgICAgV2hlbiAgICAgICAgV2hhdAotCQktLS0tLS0tLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCU5hbWUJCURhdGUJCUNyZWF0ZWQvcmV2aWV3ZWQvbW9kaWZpZWQKLQkJUmFqZWV2CQkyNC8xLzA4CQlDcmVhdGVkCi0JTm90ZXM6Ci0KLQktLSovCi0jaWZuZGVmIF9PU0FMX01JU0NfSF8KLSNkZWZpbmUgX09TQUxfTUlTQ19IXwotLy9PU0FMIE1hY3JvcwotLy9PU0FMIFByaW1pdGl2ZXMKLXR5cGVkZWYgUFVDSEFSICBQT1NBTF9OV19QQUNLRVQgIDsJCS8vTncgcGFja2V0cwotCi0KLSNkZWZpbmUgT3NhbE1lbUFsbG9jKG4sdCkga21hbGxvYyhuLEdGUF9LRVJORUwpCi0KLSNkZWZpbmUgT3NhbE1lbUZyZWUoeCxuKSBiY21fa2ZyZWUoeCkKLQotI2RlZmluZSBPc2FsTWVtTW92ZShkZXN0LCBzcmMsIGxlbikJCVwKLXsJCQkJCQkJCQkJXAotCQkJbWVtY3B5KGRlc3Qsc3JjLCBsZW4pOwkJXAotfQotCi0jZGVmaW5lIE9zYWxaZXJvTWVtb3J5KHBEZXN0LCBMZW4pCQlcCi17CQkJCQkJCQkJCVwKLQkJCW1lbXNldChwRGVzdCwwLExlbik7CQlcCi19Ci0KLS8vI2RlZmluZSBPc2FsTWVtU2V0KHBTcmMsQ2hhcixMZW4pIG1lbXNldChwU3JjLENoYXIsTGVuKQotCi1ib29sIE9zYWxNZW1Db21wYXJlKHZvaWQgKmRlc3QsIHZvaWQgKnNyYywgVUlOVCBsZW4pOwotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9SRUFETUUgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL1JFQURNRQppbmRleCBhMjdiYjBiLi45OWU2NzY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL1JFQURNRQorKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL1JFQURNRQpAQCAtNDMsMTQgKzQzLDggQEAKIAlodHRwOi8vZ2l0Lmtlcm5lbC5vcmcvP3A9bGludXgva2VybmVsL2dpdC9kd213Mi9saW51eC1maXJtd2FyZS5naXQKIAlodHRwczovL2dpdC5rZXJuZWwub3JnLz9wPWxpbnV4L2tlcm5lbC9naXQvZHdtdzIvbGludXgtZmlybXdhcmUuZ2l0CiAKLUZvciBhbGwgY2hpcHMsIGNvcHkgYnJjbS9iY200M3h4LTAtNjEwLTgwOS0wLmZ3IGFuZAotYnJjbS9iY200M3h4X2hkci0wLTYxMC04MDktMC5mdyB0byAvbGliL2Zpcm13YXJlL2JyY20gKG9yIHdoZXJldmVyIGZpcm13YXJlIGlzCi1ub3JtYWxseSBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbSkuICBJbiB0aGUgL2xpYi9maXJtd2FyZS9icmNtIGRpcmVjdG9yeSwgdGhlbgotY3JlYXRlIHRoZSBmb2xsb3dpbmcgc3ltbGlua3M6Ci0KLQlsbiAtcyBiY200M3h4LTAtNjEwLTgwOS0wLmZ3IGJjbTQzeHgtMC5mdwotCWxuIC1zIGJjbTQzeHhfaGRyLTAtNjEwLTgwOS0wLmZ3IGJjbTQzeHhfaGRyLTAuZncKLQorRm9yIGFsbCBjaGlwcywgY29weSBicmNtL2JjbTQzeHgtMC5mdyBhbmQgYnJjbS9iY200M3h4X2hkci0wLmZ3IHRvCisvbGliL2Zpcm13YXJlL2JyY20gKG9yIHdoZXJldmVyIGZpcm13YXJlIGlzIG5vcm1hbGx5IGluc3RhbGxlZCBvbiB5b3VyIHN5c3RlbSkuCiAKIEN1cnJlbnRseSBzdXBwb3J0ZWQgY2hpcHMKID09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL1JFQURNRSBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvUkVBRE1FCmluZGV4IDQzNjAxZmEuLmJlMjllNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvUkVBRE1FCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvUkVBRE1FCkBAIC0yNSw4ICsyNSw5IEBACiAJaHR0cDovL2dpdC5rZXJuZWwub3JnLz9wPWxpbnV4L2tlcm5lbC9naXQvZHdtdzIvbGludXgtZmlybXdhcmUuZ2l0CiAJaHR0cHM6Ly9naXQua2VybmVsLm9yZy8/cD1saW51eC9rZXJuZWwvZ2l0L2R3bXcyL2xpbnV4LWZpcm13YXJlLmdpdAogCi1Gb3IgNDMyOSBjaGlwLCBjb3B5IGJyY20vYmNtNDMyOS1mdWxsbWFjLTQtMjE4LTI0OC01LmJpbiBhbmQKLWJjbTQzMjktZnVsbG1hYy00LTIxOC0yNDgtNS50eHQgdG8gL2xpYi9maXJtd2FyZS9icmNtCitGb3IgNDMyOSBjaGlwLCBjb3B5IGJyY20vYmNtNDMyOS1mdWxsbWFjLTQuYmluIGFuZCBicmNtL2JjbTQzMjktZnVsbG1hYy00LnR4dAordG8gL2xpYi9maXJtd2FyZS9icmNtIChvciB3aGVyZXZlciBmaXJtd2FyZSBpcyBub3JtYWxseSBpbnN0YWxsZWQgb24geW91cgorc3lzdGVtKS4KIAogQ29udGFjdCBJbmZvOgogPT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9iY21zZGguYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvYmNtc2RoLmMKaW5kZXggNGM2MTNkYS4uYWNmNDNhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9iY21zZGguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2JjbXNkaC5jCkBAIC0xNiwxMyArMTYsMTQgQEAKIC8qICoqKioqKioqKioqKioqKioqKiBCQ01TREggSW50ZXJmYWNlIEZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8YmNtZGVmcy5oPgogI2luY2x1ZGUgPGJjbWRldnMuaD4KICNpbmNsdWRlIDxiY21lbmRpYW4uaD4KKyNpbmNsdWRlIDxvc2wuaD4KICNpbmNsdWRlIDxiY211dGlscy5oPgogI2luY2x1ZGUgPGhuZHNvYy5oPgogI2luY2x1ZGUgPHNpdXRpbHMuaD4KLSNpbmNsdWRlIDxvc2wuaD4KIAogI2luY2x1ZGUgPGJjbXNkaC5oPgkJLyogQlJDTSBBUEkgZm9yIFNESU8KIAkJCSBjbGllbnRzIChzdWNoIGFzIHdsLCBkaGQpICovCkBAIC0zOCw3ICszOSw3IEBACiAJYm9vbCBpbml0X3N1Y2Nlc3M7CS8qIHVuZGVybHlpbmcgZHJpdmVyIHN1Y2Nlc3NmdWxseSBhdHRhY2hlZCAqLwogCXZvaWQgKnNkaW9oOwkJLyogaGFuZGxlciBmb3Igc2Rpb2ggKi8KIAl1MzIgdmVuZGV2aWQ7CS8qIFRhcmdldCBWZW5kb3IgYW5kIERldmljZSBJRCBvbiBTRCBidXMgKi8KLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCWJvb2wgcmVnZmFpbDsJCS8qIFNhdmUgc3RhdHVzIG9mIGxhc3QKIAkJCQkgcmVnX3JlYWQvcmVnX3dyaXRlIGNhbGwgKi8KIAl1MzIgc2J3YWQ7CQkvKiBTYXZlIGJhY2twbGFuZSB3aW5kb3cgYWRkcmVzcyAqLwpAQCAtNTUsNyArNTYsOCBAQAogfQogI2VuZGlmCiAKLWJjbXNkaF9pbmZvX3QgKmJjbXNkaF9hdHRhY2gob3NsX3QgKm9zaCwgdm9pZCAqY2ZnaGRsLCB2b2lkICoqcmVnc3ZhLCB1aW50IGlycSkKK2JjbXNkaF9pbmZvX3QgKmJjbXNkaF9hdHRhY2goc3RydWN0IG9zbF9pbmZvICpvc2gsIHZvaWQgKmNmZ2hkbCwKKwkJCQl2b2lkICoqcmVnc3ZhLCB1aW50IGlycSkKIHsKIAliY21zZGhfaW5mb190ICpiY21zZGg7CiAKQEAgLTg0LDcgKzg2LDcgQEAKIAlyZXR1cm4gYmNtc2RoOwogfQogCi1pbnQgYmNtc2RoX2RldGFjaChvc2xfdCAqb3NoLCB2b2lkICpzZGgpCitpbnQgYmNtc2RoX2RldGFjaChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqc2RoKQogewogCWJjbXNkaF9pbmZvX3QgKmJjbXNkaCA9IChiY21zZGhfaW5mb190ICopIHNkaDsKIApAQCAtNDUxLDcgKzQ1Myw3IEBACiAKIGludAogYmNtc2RoX3JlY3ZfYnVmKHZvaWQgKnNkaCwgdTMyIGFkZHIsIHVpbnQgZm4sIHVpbnQgZmxhZ3MsCi0JCXU4ICpidWYsIHVpbnQgbmJ5dGVzLCB2b2lkICpwa3QsCisJCXU4ICpidWYsIHVpbnQgbmJ5dGVzLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0LAogCQliY21zZGhfY21wbHRfZm5fdCBjb21wbGV0ZSwgdm9pZCAqaGFuZGxlKQogewogCWJjbXNkaF9pbmZvX3QgKmJjbXNkaCA9IChiY21zZGhfaW5mb190ICopIHNkaDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvYmNtc2RoX2xpbnV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2JjbXNkaF9saW51eC5jCmluZGV4IDkwMjhjZDAuLmQyNGI1ZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvYmNtc2RoX2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9iY21zZGhfbGludXguYwpAQCAtMjAsOCArMjAsNyBAQAogCiAjZGVmaW5lIF9fVU5ERUZfTk9fVkVSU0lPTl9fCiAKLSNpbmNsdWRlIDxsaW51eHZlci5oPgotCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogCkBAIC01Nyw3ICs1Niw3IEBACiAjZWxzZQogCXN0cnVjdCBwY2lfZGV2ICpkZXY7CS8qIHBjaSBkZXZpY2UgaGFuZGxlICovCiAjZW5kaWYJCQkJLyogQkNNUExBVEZPUk1fQlVTICovCi0Jb3NsX3QgKm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsKIAl2b2lkICpyZWdzOwkJLyogU0RJTyBIb3N0IENvbnRyb2xsZXIgYWRkcmVzcyAqLwogCWJjbXNkaF9pbmZvX3QgKnNkaDsJLyogU0RJTyBIb3N0IENvbnRyb2xsZXIgaGFuZGxlICovCiAJdm9pZCAqY2g7CkBAIC0xMzksMjIgKzEzOCwxMSBAQAogI2VuZGlmCQkJCS8qIEJDTUxYU0RNTUMgKi8KIAogI2lmbmRlZiBCQ01MWFNETU1DCi1zdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgYmNtc2RoX2RyaXZlciA9IHsKLQkubmFtZSA9ICJweGEyeHgtbWNpIiwKLQkuYnVzID0gJnBsYXRmb3JtX2J1c190eXBlLAotCS5wcm9iZSA9IGJjbXNkaF9wcm9iZSwKLQkucmVtb3ZlID0gYmNtc2RoX3JlbW92ZSwKLQkuc3VzcGVuZCA9IE5VTEwsCi0JLnJlc3VtZSA9IE5VTEwsCi19OwotI2VuZGlmCQkJCS8qIEJDTUxYU0RNTUMgKi8KLQotI2lmbmRlZiBCQ01MWFNETU1DCiBzdGF0aWMKICNlbmRpZgkJCQkvKiBCQ01MWFNETU1DICovCiBpbnQgYmNtc2RoX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlvc2xfdCAqb3NoID0gTlVMTDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaCA9IE5VTEw7CiAJYmNtc2RoX2hjX3QgKnNkaGMgPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgcmVncyA9IDA7CiAJYmNtc2RoX2luZm9fdCAqc2RoID0gTlVMTDsKQEAgLTE4OSw3ICsxNzcsNyBAQAogCX0KICNlbmRpZgkJCQkvKiBkZWZpbmVkKE9PQl9JTlRSX09OTFkpICovCiAJLyogYWxsb2NhdGUgU0RJTyBIb3N0IENvbnRyb2xsZXIgc3RhdGUgaW5mbyAqLwotCW9zaCA9IG9zbF9hdHRhY2goZGV2LCBQQ0lfQlVTLCBmYWxzZSk7CisJb3NoID0gb3NsX2F0dGFjaChkZXYsIFBDSV9CVVMpOwogCWlmICghb3NoKSB7CiAJCVNETFhfTVNHKCgiJXM6IG9zbF9hdHRhY2ggZmFpbGVkXG4iLCBfX2Z1bmNfXykpOwogCQlnb3RvIGVycjsKQEAgLTI1OCw3ICsyNDYsNyBAQAogaW50IGJjbXNkaF9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQogewogCWJjbXNkaF9oY190ICpzZGhjLCAqcHJldjsKLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCiAJc2RoYyA9IHNkaGNpbmZvOwogCWRydmluZm8uZGV0YWNoKHNkaGMtPmNoKTsKQEAgLTI5MSwyNjkgKzI3OSwyMyBAQAogCiAJcmV0dXJuIDA7CiB9Ci0KLSNlbHNlCQkJCS8qIEJDTVBMQVRGT1JNX0JVUyAqLwotCi0jaWYgIWRlZmluZWQoQkNNTFhTRE1NQykKLS8qIGZvcndhcmQgZGVjbGFyYXRpb25zIGZvciBQQ0kgcHJvYmUgYW5kIHJlbW92ZSBmdW5jdGlvbnMuICovCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBiY21zZGhfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAotCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOwotc3RhdGljIHZvaWQgX19kZXZleGl0IGJjbXNkaF9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKLQotLyoqCi0gKiBwY2kgaWQgdGFibGUKLSAqLwotc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGJjbXNkaF9wY2lfZGV2aWRbXSBfX2RldmluaXRkYXRhID0gewotewotCS52ZW5kb3IgPSBQQ0lfQU5ZX0lELAotCS5kZXZpY2UgPSBQQ0lfQU5ZX0lELAotCS5zdWJ2ZW5kb3IgPSBQQ0lfQU5ZX0lELAotCS5zdWJkZXZpY2UgPSBQQ0lfQU5ZX0lELAotCS5jbGFzcyA9IDAsCi0JLmNsYXNzX21hc2sgPSAwLAotCS5kcml2ZXJfZGF0YSA9IDAsCi19LAotezAsfQotfTsKLQotTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGJjbXNkaF9wY2lfZGV2aWQpOwotCi0vKioKLSAqIFNESU8gSG9zdCBDb250cm9sbGVyIHBjaSBkcml2ZXIgaW5mbwotICovCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgYmNtc2RoX3BjaV9kcml2ZXIgPSB7Ci0JLm5vZGUgPSB7fSwKLQkubmFtZSA9ICJiY21zZGgiLAotCS5pZF90YWJsZSA9IGJjbXNkaF9wY2lfZGV2aWQsCi0JLnByb2JlID0gYmNtc2RoX3BjaV9wcm9iZSwKLQkucmVtb3ZlID0gYmNtc2RoX3BjaV9yZW1vdmUsCi0JLnN1c3BlbmQgPSBOVUxMLAotCS5yZXN1bWUgPSBOVUxMLAotfTsKLQotZXh0ZXJuIHVpbnQgc2RfcGNpX3Nsb3Q7CS8qIEZvcmNlIGRldGVjdGlvbiB0byBhIHBhcnRpY3VsYXIgUENJICovCi0JCQkJLyogc2xvdCBvbmx5IC4gQWxsb3dzIGZvciBoYXZpbmcgbXVsdGlwbGUgKi8KLQkJCQkvKiBXTCBkZXZpY2VzIGF0IG9uY2UgaW4gYSBQQyAqLwotCQkJCS8qIE9ubHkgb25lIGluc3RhbmNlIG9mIGRoZCB3aWxsIGJlICovCi0JCQkJLyogdXNhYmxlIGF0IGEgdGltZSAqLwotCQkJCS8qIFVwcGVyIHdvcmQgaXMgYnVzIG51bWJlciwgKi8KLQkJCQkvKiBsb3dlciB3b3JkIGlzIHNsb3QgbnVtYmVyICovCi0JCQkJLyogRGVmYXVsdCB2YWx1ZSBvZiAweEZGRkZmZmZmIHR1cm5zIHRoaXMgKi8KLQkJCQkvKiBvZmYgKi8KLW1vZHVsZV9wYXJhbShzZF9wY2lfc2xvdCwgdWludCwgMCk7Ci0KLS8qKgotICogRGV0ZWN0IHN1cHBvcnRlZCBTRElPIEhvc3QgQ29udHJvbGxlciBhbmQgYXR0YWNoIGlmIGZvdW5kLgotICoKLSAqIERldGVybWluZSBpZiB0aGUgZGV2aWNlIGRlc2NyaWJlZCBieSBwZGV2IGlzIGEgc3VwcG9ydGVkIFNESU8gSG9zdAotICogQ29udHJvbGxlci4gIElmIHNvLCBhdHRhY2ggdG8gaXQgYW5kIGF0dGFjaCB0byB0aGUgdGFyZ2V0IGRldmljZS4KLSAqLwotc3RhdGljIGludCBfX2RldmluaXQKLWJjbXNkaF9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCi17Ci0Jb3NsX3QgKm9zaCA9IE5VTEw7Ci0JYmNtc2RoX2hjX3QgKnNkaGMgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgcmVnczsKLQliY21zZGhfaW5mb190ICpzZGggPSBOVUxMOwotCWludCByYzsKLQotCWlmIChzZF9wY2lfc2xvdCAhPSAweEZGRkZmZmZmKSB7Ci0JCWlmIChwZGV2LT5idXMtPm51bWJlciAhPSAoc2RfcGNpX3Nsb3QgPj4gMTYpIHx8Ci0JCSAgICBQQ0lfU0xPVChwZGV2LT5kZXZmbikgIT0gKHNkX3BjaV9zbG90ICYgMHhmZmZmKSkgewotCQkJU0RMWF9NU0coKCIlczogJXM6IGJ1cyAlWCwgc2xvdCAlWCwgdmVuZCAlWCwgZGV2ICVYXG4iLAotCQkJCSAgX19mdW5jX18sCi0JCQkJICBiY21zZGhfY2hpcG1hdGNoKHBkZXYtPnZlbmRvciwgcGRldi0+ZGV2aWNlKSA/Ci0JCQkJICAiRm91bmQgY29tcGF0aWJsZSBTRElPSEMiIDoKLQkJCQkgICJQcm9iaW5nIHVua25vd24gZGV2aWNlIiwKLQkJCQkgIHBkZXYtPmJ1cy0+bnVtYmVyLCBQQ0lfU0xPVChwZGV2LT5kZXZmbiksCi0JCQkJICBwZGV2LT52ZW5kb3IsIHBkZXYtPmRldmljZSkpOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KLQkJU0RMWF9NU0coKCIlczogJXM6IGJ1cyAlWCwgc2xvdCAlWCwgdmVuZG9yICVYLCBkZXZpY2UgJVggIgotCQkJIihnb29kIFBDSSBsb2NhdGlvbilcbiIsIF9fZnVuY19fLAotCQkJYmNtc2RoX2NoaXBtYXRjaChwZGV2LT52ZW5kb3IsIHBkZXYtPmRldmljZSkgPwotCQkJIlVzaW5nIGNvbXBhdGlibGUgU0RJT0hDIiA6ICJXQVJOSU5HLCBmb3JjZWQgdXNlICIKLQkJCSJvZiB1bmtvd24gZGV2aWNlIiwKLQkJcGRldi0+YnVzLT5udW1iZXIsIFBDSV9TTE9UKHBkZXYtPmRldmZuKSwgcGRldi0+dmVuZG9yLAotCQlwZGV2LT5kZXZpY2UpKTsKLQl9Ci0KLQlpZiAoKHBkZXYtPnZlbmRvciA9PSBWRU5ET1JfVEkpCi0JICAgICYmICgocGRldi0+ZGV2aWNlID09IFBDSVhYMjFfRkxBU0hNRURJQV9JRCkKLQkJfHwgKHBkZXYtPmRldmljZSA9PSBQQ0lYWDIxX0ZMQVNITUVESUEwX0lEKSkpIHsKLQkJdTMyIGNvbmZpZ19yZWc7Ci0KLQkJU0RMWF9NU0coKCIlczogRGlzYWJsaW5nIFRJIEZsYXNoTWVkaWEgQ29udHJvbGxlci5cbiIsCi0JCQkgIF9fZnVuY19fKSk7Ci0JCW9zaCA9IG9zbF9hdHRhY2gocGRldiwgUENJX0JVUywgZmFsc2UpOwotCQlpZiAoIW9zaCkgewotCQkJU0RMWF9NU0coKCIlczogb3NsX2F0dGFjaCBmYWlsZWRcbiIsIF9fZnVuY19fKSk7Ci0JCQlnb3RvIGVycjsKLQkJfQotCi0JCWNvbmZpZ19yZWcgPSBPU0xfUENJX1JFQURfQ09ORklHKG9zaCwgMHg0YywgNCk7Ci0KLQkJLyoKLQkJICogU2V0IE1NQ19TRF9ESVMgYml0IGluIEZsYXNoTWVkaWEgQ29udHJvbGxlci4KLQkJICogRGlzYmxpbmcgdGhlIFNEL01NQyBDb250cm9sbGVyIGluIHRoZSBGbGFzaE1lZGlhIENvbnRyb2xsZXIKLQkJICogYWxsb3dzIHRoZSBTdGFuZGFyZCBTRCBIb3N0IENvbnRyb2xsZXIgdG8gdGFrZSBvdmVyIGNvbnRyb2wKLQkJICogb2YgdGhlIFNEIFNsb3QuCi0JCSAqLwotCQljb25maWdfcmVnIHw9IDB4MDI7Ci0JCU9TTF9QQ0lfV1JJVEVfQ09ORklHKG9zaCwgMHg0YywgNCwgY29uZmlnX3JlZyk7Ci0JCW9zbF9kZXRhY2gob3NoKTsKLQl9Ci0JLyogbWF0Y2ggdGhpcyBwY2kgZGV2aWNlIHdpdGggd2hhdCB3ZSBzdXBwb3J0ICovCi0JLyogd2UgY2FuJ3Qgc29sZWx5IHJlbHkgb24gdGhpcyB0byBiZWxpZXZlIGl0IGlzCi0JCW91ciBTRElPIEhvc3QgQ29udHJvbGxlciEgKi8KLQlpZiAoIWJjbXNkaF9jaGlwbWF0Y2gocGRldi0+dmVuZG9yLCBwZGV2LT5kZXZpY2UpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCS8qIHRoaXMgaXMgYSBwY2kgZGV2aWNlIHdlIG1pZ2h0IHN1cHBvcnQgKi8KLQlTRExYX01TRygoIiVzOiBGb3VuZCBwb3NzaWJsZSBTRElPIEhvc3QgQ29udHJvbGxlcjogIgotCQkiYnVzICVkIHNsb3QgJWQgZnVuYyAlZCBpcnEgJWRcbiIsIF9fZnVuY19fLAotCQlwZGV2LT5idXMtPm51bWJlciwgUENJX1NMT1QocGRldi0+ZGV2Zm4pLAotCQlQQ0lfRlVOQyhwZGV2LT5kZXZmbiksIHBkZXYtPmlycSkpOwotCi0JLyogdXNlIGJjbXNkaF9xdWVyeV9kZXZpY2UoKSB0byBnZXQgdGhlIHZlbmRvciBJRCBvZiB0aGUgdGFyZ2V0IGRldmljZQotCSAqIHNvIGl0IHdpbGwgZXZlbnR1YWxseSBhcHBlYXIgaW4gdGhlIEJyb2FkY29tIHN0cmluZyBvbiB0aGUgY29uc29sZQotCSAqLwotCi0JLyogYWxsb2NhdGUgU0RJTyBIb3N0IENvbnRyb2xsZXIgc3RhdGUgaW5mbyAqLwotCW9zaCA9IG9zbF9hdHRhY2gocGRldiwgUENJX0JVUywgZmFsc2UpOwotCWlmICghb3NoKSB7Ci0JCVNETFhfTVNHKCgiJXM6IG9zbF9hdHRhY2ggZmFpbGVkXG4iLCBfX2Z1bmNfXykpOwotCQlnb3RvIGVycjsKLQl9Ci0Jc2RoYyA9IGt6YWxsb2Moc2l6ZW9mKGJjbXNkaF9oY190KSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFzZGhjKSB7Ci0JCVNETFhfTVNHKCgiJXM6IG91dCBvZiBtZW1vcnlcbiIsIF9fZnVuY19fKSk7Ci0JCWdvdG8gZXJyOwotCX0KLQlzZGhjLT5vc2ggPSBvc2g7Ci0KLQlzZGhjLT5kZXYgPSBwZGV2OwotCi0JLyogbWFwIHRvIGFkZHJlc3Mgd2hlcmUgaG9zdCBjYW4gYWNjZXNzICovCi0JcGNpX3NldF9tYXN0ZXIocGRldik7Ci0JcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKLQlpZiAocmMpIHsKLQkJU0RMWF9NU0coKCIlczogQ2Fubm90IGVuYWJsZSBQQ0kgZGV2aWNlXG4iLCBfX2Z1bmNfXykpOwotCQlnb3RvIGVycjsKLQl9Ci0Jc2RoID0gYmNtc2RoX2F0dGFjaChvc2gsICh2b2lkICopKHVuc2lnbmVkIGxvbmcpcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApLAotCQkJKHZvaWQgKiopJnJlZ3MsIHBkZXYtPmlycSk7Ci0JaWYgKCFzZGgpIHsKLQkJU0RMWF9NU0coKCIlczogYmNtc2RoX2F0dGFjaCBmYWlsZWRcbiIsIF9fZnVuY19fKSk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCXNkaGMtPnNkaCA9IHNkaDsKLQotCS8qIHRyeSB0byBhdHRhY2ggdG8gdGhlIHRhcmdldCBkZXZpY2UgKi8KLQlzZGhjLT5jaCA9IGRydmluZm8uYXR0YWNoKFZFTkRPUl9CUk9BRENPTSwgLyogcGRldi0+dmVuZG9yLCAqLwotCQkJCWJjbXNkaF9xdWVyeV9kZXZpY2Uoc2RoKSAmIDB4RkZGRiwgMCwgMCwgMCwgMCwKLQkJCQkodm9pZCAqKXJlZ3MsIE5VTEwsIHNkaCk7Ci0JaWYgKCFzZGhjLT5jaCkgewotCQlTRExYX01TRygoIiVzOiBkZXZpY2UgYXR0YWNoIGZhaWxlZFxuIiwgX19mdW5jX18pKTsKLQkJZ290byBlcnI7Ci0JfQotCi0JLyogY2hhaW4gU0RJTyBIb3N0IENvbnRyb2xsZXIgaW5mbyB0b2dldGhlciAqLwotCXNkaGMtPm5leHQgPSBzZGhjaW5mbzsKLQlzZGhjaW5mbyA9IHNkaGM7Ci0KLQlyZXR1cm4gMDsKLQotCS8qIGVycm9yIGhhbmRsaW5nICovCi1lcnI6Ci0JaWYgKHNkaGMtPnNkaCkKLQkJYmNtc2RoX2RldGFjaChzZGhjLT5vc2gsIHNkaGMtPnNkaCk7Ci0JaWYgKHNkaGMpCi0JCWtmcmVlKHNkaGMpOwotCWlmIChvc2gpCi0JCW9zbF9kZXRhY2gob3NoKTsKLQlyZXR1cm4gLUVOT0RFVjsKLX0KLQotLyoqCi0gKiBEZXRhY2ggZnJvbSB0YXJnZXQgZGV2aWNlcyBhbmQgU0RJTyBIb3N0IENvbnRyb2xsZXIKLSAqLwotc3RhdGljIHZvaWQgX19kZXZleGl0IGJjbXNkaF9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCWJjbXNkaF9oY190ICpzZGhjLCAqcHJldjsKLQlvc2xfdCAqb3NoOwotCi0JLyogZmluZCB0aGUgU0RJTyBIb3N0IENvbnRyb2xsZXIgc3RhdGUgZm9yIHRoaXMKLQkJIHBkZXYgYW5kIHRha2UgaXQgb3V0IGZyb20gdGhlIGxpc3QgKi8KLQlmb3IgKHNkaGMgPSBzZGhjaW5mbywgcHJldiA9IE5VTEw7IHNkaGM7IHNkaGMgPSBzZGhjLT5uZXh0KSB7Ci0JCWlmIChzZGhjLT5kZXYgPT0gcGRldikgewotCQkJaWYgKHByZXYpCi0JCQkJcHJldi0+bmV4dCA9IHNkaGMtPm5leHQ7Ci0JCQllbHNlCi0JCQkJc2RoY2luZm8gPSBOVUxMOwotCQkJYnJlYWs7Ci0JCX0KLQkJcHJldiA9IHNkaGM7Ci0JfQotCWlmICghc2RoYykKLQkJcmV0dXJuOwotCi0JZHJ2aW5mby5kZXRhY2goc2RoYy0+Y2gpOwotCi0JYmNtc2RoX2RldGFjaChzZGhjLT5vc2gsIHNkaGMtPnNkaCk7Ci0KLQkvKiByZWxlYXNlIFNESU8gSG9zdCBDb250cm9sbGVyIGluZm8gKi8KLQlvc2ggPSBzZGhjLT5vc2g7Ci0Ja2ZyZWUoc2RoYyk7Ci0Jb3NsX2RldGFjaChvc2gpOwotfQotI2VuZGlmCQkJCS8qIEJDTUxYU0RNTUMgKi8KICNlbmRpZgkJCQkvKiBCQ01QTEFURk9STV9CVVMgKi8KIAogZXh0ZXJuIGludCBzZGlvX2Z1bmN0aW9uX2luaXQodm9pZCk7CiAKIGludCBiY21zZGhfcmVnaXN0ZXIoYmNtc2RoX2RyaXZlcl90ICpkcml2ZXIpCiB7Ci0JaW50IGVycm9yID0gMDsKLQogCWRydmluZm8gPSAqZHJpdmVyOwogCi0jaWYgZGVmaW5lZChCQ01QTEFURk9STV9CVVMpCi0jaWYgZGVmaW5lZChCQ01MWFNETU1DKQogCVNETFhfTVNHKCgiTGludXggS2VybmVsIFNESU8vTU1DIERyaXZlclxuIikpOwotCWVycm9yID0gc2Rpb19mdW5jdGlvbl9pbml0KCk7Ci0jZWxzZQotCVNETFhfTVNHKCgiSW50ZWwgUFhBMjcwIFNESU8gRHJpdmVyXG4iKSk7Ci0JZXJyb3IgPSBkcml2ZXJfcmVnaXN0ZXIoJmJjbXNkaF9kcml2ZXIpOwotI2VuZGlmCQkJCS8qIGRlZmluZWQoQkNNTFhTRE1NQykgKi8KLQlyZXR1cm4gZXJyb3I7Ci0jZW5kaWYJCQkJLyogZGVmaW5lZChCQ01QTEFURk9STV9CVVMpICovCi0KLSNpZiAhZGVmaW5lZChCQ01QTEFURk9STV9CVVMpICYmICFkZWZpbmVkKEJDTUxYU0RNTUMpCi0JZXJyb3IgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZiY21zZGhfcGNpX2RyaXZlcik7Ci0JaWYgKCFlcnJvcikKLQkJcmV0dXJuIDA7Ci0KLQlTRExYX01TRygoIiVzOiBwY2lfcmVnaXN0ZXJfZHJpdmVyIGZhaWxlZCAweCV4XG4iLCBfX2Z1bmNfXywgZXJyb3IpKTsKLSNlbmRpZgkJCQkvKiBCQ01QTEFURk9STV9CVVMgKi8KLQotCXJldHVybiBlcnJvcjsKKwlyZXR1cm4gc2Rpb19mdW5jdGlvbl9pbml0KCk7CiB9CiAKIGV4dGVybiB2b2lkIHNkaW9fZnVuY3Rpb25fY2xlYW51cCh2b2lkKTsKIAogdm9pZCBiY21zZGhfdW5yZWdpc3Rlcih2b2lkKQogewotI2lmIGRlZmluZWQoQkNNUExBVEZPUk1fQlVTKSAmJiAhZGVmaW5lZChCQ01MWFNETU1DKQotCQlkcml2ZXJfdW5yZWdpc3RlcigmYmNtc2RoX2RyaXZlcik7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKEJDTUxYU0RNTUMpCiAJc2Rpb19mdW5jdGlvbl9jbGVhbnVwKCk7Ci0jZW5kaWYJCQkJLyogQkNNTFhTRE1NQyAqLwotI2lmICFkZWZpbmVkKEJDTVBMQVRGT1JNX0JVUykgJiYgIWRlZmluZWQoQkNNTFhTRE1NQykKLQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmJjbXNkaF9wY2lfZHJpdmVyKTsKLSNlbmRpZgkJCQkvKiBCQ01QTEFURk9STV9CVVMgKi8KIH0KIAogI2lmIGRlZmluZWQoT09CX0lOVFJfT05MWSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvYmNtc2RoX3NkbW1jLmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2JjbXNkaF9zZG1tYy5jCmluZGV4IGY2YzljNDUuLmQzOTliNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvYmNtc2RoX3NkbW1jLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9iY21zZGhfc2RtbWMuYwpAQCAtMTQsMTEgKzE0LDEyIEBACiAgKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogICovCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxiY21kZWZzLmg+CiAjaW5jbHVkZSA8YmNtZGV2cy5oPgogI2luY2x1ZGUgPGJjbWVuZGlhbi5oPgotI2luY2x1ZGUgPGJjbXV0aWxzLmg+CiAjaW5jbHVkZSA8b3NsLmg+CisjaW5jbHVkZSA8YmNtdXRpbHMuaD4KICNpbmNsdWRlIDxzZGlvLmg+CQkvKiBTRElPIERldmljZSBhbmQgUHJvdG9jb2wgU3BlY3MgKi8KICNpbmNsdWRlIDxzZGlvaC5oPgkJLyogU0RJTyBIb3N0IENvbnRyb2xsZXIgU3BlY2lmaWNhdGlvbiAqLwogI2luY2x1ZGUgPGJjbXNkYnVzLmg+CQkvKiBiY21zZGggdG8vZnJvbSBzcGVjaWZpYyBjb250cm9sbGVyIEFQSXMgKi8KQEAgLTExMSw3ICsxMTIsNyBAQAogLyoKICAqCVB1YmxpYyBlbnRyeSBwb2ludHMgJiBleHRlcm4ncwogICovCi1leHRlcm4gc2Rpb2hfaW5mb190ICpzZGlvaF9hdHRhY2gob3NsX3QgKm9zaCwgdm9pZCAqYmFyMCwgdWludCBpcnEpCitleHRlcm4gc2Rpb2hfaW5mb190ICpzZGlvaF9hdHRhY2goc3RydWN0IG9zbF9pbmZvICpvc2gsIHZvaWQgKmJhcjAsIHVpbnQgaXJxKQogewogCXNkaW9oX2luZm9fdCAqc2Q7CiAJaW50IGVycl9yZXQ7CkBAIC0xNzQsNyArMTc1LDcgQEAKIAlyZXR1cm4gc2Q7CiB9CiAKLWV4dGVybiBTRElPSF9BUElfUkMgc2Rpb2hfZGV0YWNoKG9zbF90ICpvc2gsIHNkaW9oX2luZm9fdCAqc2QpCitleHRlcm4gU0RJT0hfQVBJX1JDIHNkaW9oX2RldGFjaChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc2Rpb2hfaW5mb190ICpzZCkKIHsKIAlzZF90cmFjZSgoIiVzXG4iLCBfX2Z1bmNfXykpOwogCkBAIC03NTAsNyArNzUxLDcgQEAKIAlzZF90cmFjZSgoIiVzOiBGdW5jID0gJWRcbiIsIF9fZnVuY19fLCBmdW5jKSk7CiAKIAlpZiAoIXNkLT5mdW5jX2Npc19wdHJbZnVuY10pIHsKLQkJYnplcm8oY2lzLCBsZW5ndGgpOworCQltZW1zZXQoY2lzLCAwLCBsZW5ndGgpOwogCQlzZF9lcnIoKCIlczogbm8gZnVuY19jaXNfcHRyWyVkXVxuIiwgX19mdW5jX18sIGZ1bmMpKTsKIAkJcmV0dXJuIFNESU9IX0FQSV9SQ19GQUlMOwogCX0KQEAgLTkyNywxMyArOTI4LDEzIEBACiAKIHN0YXRpYyBTRElPSF9BUElfUkMKIHNkaW9oX3JlcXVlc3RfcGFja2V0KHNkaW9oX2luZm9fdCAqc2QsIHVpbnQgZml4X2luYywgdWludCB3cml0ZSwgdWludCBmdW5jLAotCQkgICAgIHVpbnQgYWRkciwgdm9pZCAqcGt0KQorCQkgICAgIHVpbnQgYWRkciwgc3RydWN0IHNrX2J1ZmYgKnBrdCkKIHsKIAlib29sIGZpZm8gPSAoZml4X2luYyA9PSBTRElPSF9EQVRBX0ZJWCk7CiAJdTMyIFNHQ291bnQgPSAwOwogCWludCBlcnJfcmV0ID0gMDsKIAotCXZvaWQgKnBuZXh0OworCXN0cnVjdCBza19idWZmICpwbmV4dDsKIAogCXNkX3RyYWNlKCgiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXykpOwogCkBAIC05NDMsOCArOTQ0LDggQEAKIAogCS8qIENsYWltIGhvc3QgY29udHJvbGxlciAqLwogCXNkaW9fY2xhaW1faG9zdChnSW5zdGFuY2UtPmZ1bmNbZnVuY10pOwotCWZvciAocG5leHQgPSBwa3Q7IHBuZXh0OyBwbmV4dCA9IFBLVE5FWFQocG5leHQpKSB7Ci0JCXVpbnQgcGt0X2xlbiA9IFBLVExFTihwbmV4dCk7CisJZm9yIChwbmV4dCA9IHBrdDsgcG5leHQ7IHBuZXh0ID0gcG5leHQtPm5leHQpIHsKKwkJdWludCBwa3RfbGVuID0gcG5leHQtPmxlbjsKIAkJcGt0X2xlbiArPSAzOwogCQlwa3RfbGVuICY9IDB4RkZGRkZGRkM7CiAKQEAgLTk2MSwyMyArOTYyLDIzIEBACiAJCSAqIGlzIHN1cHBvc2VkIHRvIGdpdmUKIAkJICogdXMgc29tZXRoaW5nIHdlIGNhbiB3b3JrIHdpdGguCiAJCSAqLwotCQlBU1NFUlQoKCh1MzIpIChQS1REQVRBKHBrdCkpICYgRE1BX0FMSUdOX01BU0spID09IDApOworCQlBU1NFUlQoKCh1MzIpIChwa3QtPmRhdGEpICYgRE1BX0FMSUdOX01BU0spID09IDApOwogCiAJCWlmICgod3JpdGUpICYmICghZmlmbykpIHsKIAkJCWVycl9yZXQgPSBzZGlvX21lbWNweV90b2lvKGdJbnN0YW5jZS0+ZnVuY1tmdW5jXSwgYWRkciwKLQkJCQkJCSAgICgodTggKikgUEtUREFUQShwbmV4dCkpLAorCQkJCQkJICAgKCh1OCAqKSAocG5leHQtPmRhdGEpKSwKIAkJCQkJCSAgIHBrdF9sZW4pOwogCQl9IGVsc2UgaWYgKHdyaXRlKSB7CiAJCQllcnJfcmV0ID0gc2Rpb19tZW1jcHlfdG9pbyhnSW5zdGFuY2UtPmZ1bmNbZnVuY10sIGFkZHIsCi0JCQkJCQkgICAoKHU4ICopIFBLVERBVEEocG5leHQpKSwKKwkJCQkJCSAgICgodTggKikgKHBuZXh0LT5kYXRhKSksCiAJCQkJCQkgICBwa3RfbGVuKTsKIAkJfSBlbHNlIGlmIChmaWZvKSB7CiAJCQllcnJfcmV0ID0gc2Rpb19yZWFkc2IoZ0luc3RhbmNlLT5mdW5jW2Z1bmNdLAotCQkJCQkgICAgICAoKHU4ICopIFBLVERBVEEocG5leHQpKSwKKwkJCQkJICAgICAgKCh1OCAqKSAocG5leHQtPmRhdGEpKSwKIAkJCQkJICAgICAgYWRkciwgcGt0X2xlbik7CiAJCX0gZWxzZSB7CiAJCQllcnJfcmV0ID0gc2Rpb19tZW1jcHlfZnJvbWlvKGdJbnN0YW5jZS0+ZnVuY1tmdW5jXSwKLQkJCQkJCSAgICAgKCh1OCAqKSBQS1REQVRBKHBuZXh0KSksCisJCQkJCQkgICAgICgodTggKikgKHBuZXh0LT5kYXRhKSksCiAJCQkJCQkgICAgIGFkZHIsIHBrdF9sZW4pOwogCQl9CiAKQEAgLTEwMjUsMTAgKzEwMjYsMTAgQEAKIGV4dGVybiBTRElPSF9BUElfUkMKIHNkaW9oX3JlcXVlc3RfYnVmZmVyKHNkaW9oX2luZm9fdCAqc2QsIHVpbnQgcGlvX2RtYSwgdWludCBmaXhfaW5jLCB1aW50IHdyaXRlLAogCQkgICAgIHVpbnQgZnVuYywgdWludCBhZGRyLCB1aW50IHJlZ193aWR0aCwgdWludCBidWZsZW5fdSwKLQkJICAgICB1OCAqYnVmZmVyLCB2b2lkICpwa3QpCisJCSAgICAgdTggKmJ1ZmZlciwgc3RydWN0IHNrX2J1ZmYgKnBrdCkKIHsKIAlTRElPSF9BUElfUkMgU3RhdHVzOwotCXZvaWQgKm15cGt0ID0gTlVMTDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbXlwa3QgPSBOVUxMOwogCiAJc2RfdHJhY2UoKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKSk7CiAKQEAgLTEwMzgsNTIgKzEwMzksNTIgQEAKIAlpZiAocGt0ID09IE5VTEwpIHsKIAkJc2RfZGF0YSgoIiVzOiBDcmVhdGluZyBuZXcgJXMgUGFja2V0LCBsZW49JWRcbiIsCiAJCQkgX19mdW5jX18sIHdyaXRlID8gIlRYIiA6ICJSWCIsIGJ1Zmxlbl91KSk7Ci0JCW15cGt0ID0gUEtUR0VUKHNkLT5vc2gsIGJ1Zmxlbl91LCB3cml0ZSA/IHRydWUgOiBmYWxzZSk7CisJCW15cGt0ID0gcGt0X2J1Zl9nZXRfc2tiKHNkLT5vc2gsIGJ1Zmxlbl91KTsKIAkJaWYgKCFteXBrdCkgewotCQkJc2RfZXJyKCgiJXM6IFBLVEdFVCBmYWlsZWQ6IGxlbiAlZFxuIiwKKwkJCXNkX2VycigoIiVzOiBwa3RfYnVmX2dldF9za2IgZmFpbGVkOiBsZW4gJWRcbiIsCiAJCQkJX19mdW5jX18sIGJ1Zmxlbl91KSk7CiAJCQlyZXR1cm4gU0RJT0hfQVBJX1JDX0ZBSUw7CiAJCX0KIAogCQkvKiBGb3IgYSB3cml0ZSwgY29weSB0aGUgYnVmZmVyIGRhdGEgaW50byB0aGUgcGFja2V0LiAqLwogCQlpZiAod3JpdGUpCi0JCQliY29weShidWZmZXIsIFBLVERBVEEobXlwa3QpLCBidWZsZW5fdSk7CisJCQliY29weShidWZmZXIsIG15cGt0LT5kYXRhLCBidWZsZW5fdSk7CiAKIAkJU3RhdHVzID0KIAkJICAgIHNkaW9oX3JlcXVlc3RfcGFja2V0KHNkLCBmaXhfaW5jLCB3cml0ZSwgZnVuYywgYWRkciwgbXlwa3QpOwogCiAJCS8qIEZvciBhIHJlYWQsIGNvcHkgdGhlIHBhY2tldCBkYXRhIGJhY2sgdG8gdGhlIGJ1ZmZlci4gKi8KIAkJaWYgKCF3cml0ZSkKLQkJCWJjb3B5KFBLVERBVEEobXlwa3QpLCBidWZmZXIsIGJ1Zmxlbl91KTsKKwkJCWJjb3B5KG15cGt0LT5kYXRhLCBidWZmZXIsIGJ1Zmxlbl91KTsKIAotCQlQS1RGUkVFKHNkLT5vc2gsIG15cGt0LCB3cml0ZSA/IHRydWUgOiBmYWxzZSk7Ci0JfSBlbHNlIGlmICgoKHUzMikgKFBLVERBVEEocGt0KSkgJiBETUFfQUxJR05fTUFTSykgIT0gMCkgeworCQlwa3RfYnVmX2ZyZWVfc2tiKHNkLT5vc2gsIG15cGt0LCB3cml0ZSA/IHRydWUgOiBmYWxzZSk7CisJfSBlbHNlIGlmICgoKHUzMikgKHBrdC0+ZGF0YSkgJiBETUFfQUxJR05fTUFTSykgIT0gMCkgewogCQkvKiBDYXNlIDI6IFdlIGhhdmUgYSBwYWNrZXQsIGJ1dCBpdCBpcyB1bmFsaWduZWQuICovCiAKIAkJLyogSW4gdGhpcyBjYXNlLCB3ZSBjYW5ub3QgaGF2ZSBhIGNoYWluLiAqLwotCQlBU1NFUlQoUEtUTkVYVChwa3QpID09IE5VTEwpOworCQlBU1NFUlQocGt0LT5uZXh0ID09IE5VTEwpOwogCiAJCXNkX2RhdGEoKCIlczogQ3JlYXRpbmcgYWxpZ25lZCAlcyBQYWNrZXQsIGxlbj0lZFxuIiwKLQkJCSBfX2Z1bmNfXywgd3JpdGUgPyAiVFgiIDogIlJYIiwgUEtUTEVOKHBrdCkpKTsKLQkJbXlwa3QgPSBQS1RHRVQoc2QtPm9zaCwgUEtUTEVOKHBrdCksIHdyaXRlID8gdHJ1ZSA6IGZhbHNlKTsKKwkJCSBfX2Z1bmNfXywgd3JpdGUgPyAiVFgiIDogIlJYIiwgcGt0LT5sZW4pKTsKKwkJbXlwa3QgPSBwa3RfYnVmX2dldF9za2Ioc2QtPm9zaCwgcGt0LT5sZW4pOwogCQlpZiAoIW15cGt0KSB7Ci0JCQlzZF9lcnIoKCIlczogUEtUR0VUIGZhaWxlZDogbGVuICVkXG4iLAotCQkJCV9fZnVuY19fLCBQS1RMRU4ocGt0KSkpOworCQkJc2RfZXJyKCgiJXM6IHBrdF9idWZfZ2V0X3NrYiBmYWlsZWQ6IGxlbiAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcGt0LT5sZW4pKTsKIAkJCXJldHVybiBTRElPSF9BUElfUkNfRkFJTDsKIAkJfQogCiAJCS8qIEZvciBhIHdyaXRlLCBjb3B5IHRoZSBidWZmZXIgZGF0YSBpbnRvIHRoZSBwYWNrZXQuICovCiAJCWlmICh3cml0ZSkKLQkJCWJjb3B5KFBLVERBVEEocGt0KSwgUEtUREFUQShteXBrdCksIFBLVExFTihwa3QpKTsKKwkJCWJjb3B5KHBrdC0+ZGF0YSwgbXlwa3QtPmRhdGEsIHBrdC0+bGVuKTsKIAogCQlTdGF0dXMgPQogCQkgICAgc2Rpb2hfcmVxdWVzdF9wYWNrZXQoc2QsIGZpeF9pbmMsIHdyaXRlLCBmdW5jLCBhZGRyLCBteXBrdCk7CiAKIAkJLyogRm9yIGEgcmVhZCwgY29weSB0aGUgcGFja2V0IGRhdGEgYmFjayB0byB0aGUgYnVmZmVyLiAqLwogCQlpZiAoIXdyaXRlKQotCQkJYmNvcHkoUEtUREFUQShteXBrdCksIFBLVERBVEEocGt0KSwgUEtUTEVOKG15cGt0KSk7CisJCQliY29weShteXBrdC0+ZGF0YSwgcGt0LT5kYXRhLCBteXBrdC0+bGVuKTsKIAotCQlQS1RGUkVFKHNkLT5vc2gsIG15cGt0LCB3cml0ZSA/IHRydWUgOiBmYWxzZSk7CisJCXBrdF9idWZfZnJlZV9za2Ioc2QtPm9zaCwgbXlwa3QsIHdyaXRlID8gdHJ1ZSA6IGZhbHNlKTsKIAl9IGVsc2UgewkJLyogY2FzZSAzOiBXZSBoYXZlIGEgcGFja2V0IGFuZAogCQkJCSBpdCBpcyBhbGlnbmVkLiAqLwogCQlzZF9kYXRhKCgiJXM6IEFsaWduZWQgJXMgUGFja2V0LCBkaXJlY3QgRE1BXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9iY21zZGhfc2RtbWNfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvYmNtc2RoX3NkbW1jX2xpbnV4LmMKaW5kZXggYWU3YjU2Ni4uY2VhYTQ3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9iY21zZGhfc2RtbWNfbGludXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2JjbXNkaF9zZG1tY19saW51eC5jCkBAIC0xNSw3ICsxNSw5IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CS8qIHJlcXVlc3RfaXJxKCkgKi8KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxiY21kZWZzLmg+CisjaW5jbHVkZSA8b3NsLmg+CiAjaW5jbHVkZSA8YmNtdXRpbHMuaD4KICNpbmNsdWRlIDxzZGlvLmg+CQkvKiBTRElPIFNwZWNzICovCiAjaW5jbHVkZSA8YmNtc2RidXMuaD4JCS8qIGJjbXNkaCB0by9mcm9tIHNwZWNpZmljIGNvbnRyb2xsZXIgQVBJcyAqLwpAQCAtMjExLDcgKzIxMyw3IEBACiAJaWYgKCFnSW5zdGFuY2UpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JYnplcm8oJnNkbW1jX2Rldiwgc2l6ZW9mKHNkbW1jX2RldikpOworCW1lbXNldCgmc2RtbWNfZGV2LCAwLCBzaXplb2Yoc2RtbWNfZGV2KSk7CiAJZXJyb3IgPSBzZGlvX3JlZ2lzdGVyX2RyaXZlcigmYmNtc2RoX3NkbW1jX2RyaXZlcik7CiAKIAlyZXR1cm4gZXJyb3I7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZC5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGQuaAppbmRleCA1N2QwNmIyLi42OWM2YTAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkLmgKQEAgLTc3LDcgKzc3LDcgQEAKIC8qIENvbW1vbiBzdHJ1Y3R1cmUgZm9yIG1vZHVsZSBhbmQgaW5zdGFuY2UgbGlua2FnZSAqLwogdHlwZWRlZiBzdHJ1Y3QgZGhkX3B1YiB7CiAJLyogTGlua2FnZSBwb250ZXJzICovCi0Jb3NsX3QgKm9zaDsJCS8qIE9TTCBoYW5kbGUgKi8KKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsJCS8qIE9TTCBoYW5kbGUgKi8KIAlzdHJ1Y3QgZGhkX2J1cyAqYnVzOwkvKiBCdXMgbW9kdWxlIGhhbmRsZSAqLwogCXN0cnVjdCBkaGRfcHJvdCAqcHJvdDsJLyogUHJvdG9jb2wgbW9kdWxlIGhhbmRsZSAqLwogCXN0cnVjdCBkaGRfaW5mbyAqaW5mbzsJLyogSW5mbyBtb2R1bGUgaGFuZGxlICovCkBAIC0yNzcsMTUgKzI3NywxNiBAQAogICovCiAKIC8qIFRvIGFsbG93IG9zbF9hdHRhY2gvZGV0YWNoIGNhbGxzIGZyb20gb3MtaW5kZXBlbmRlbnQgbW9kdWxlcyAqLwotb3NsX3QgKmRoZF9vc2xfYXR0YWNoKHZvaWQgKnBkZXYsIHVpbnQgYnVzdHlwZSk7Ci12b2lkIGRoZF9vc2xfZGV0YWNoKG9zbF90ICpvc2gpOworc3RydWN0IG9zbF9pbmZvICpkaGRfb3NsX2F0dGFjaCh2b2lkICpwZGV2LCB1aW50IGJ1c3R5cGUpOwordm9pZCBkaGRfb3NsX2RldGFjaChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCk7CiAKIC8qIEluZGljYXRpb24gZnJvbSBidXMgbW9kdWxlIHJlZ2FyZGluZyBwcmVzZW5jZS9pbnNlcnRpb24gb2YgZG9uZ2xlLgogICogUmV0dXJuIGRoZF9wdWJfdCBwb2ludGVyLCB1c2VkIGFzIGhhbmRsZSB0byBPUyBtb2R1bGUgaW4gbGF0ZXIgY2FsbHMuCiAgKiBSZXR1cm5lZCBzdHJ1Y3R1cmUgc2hvdWxkIGhhdmUgYnVzIGFuZCBwcm90IHBvaW50ZXJzIGZpbGxlZCBpbi4KICAqIGJ1c19oZHJsZW4gc3BlY2lmaWVzIHJlcXVpcmVkIGhlYWRyb29tIGZvciBidXMgbW9kdWxlIGhlYWRlci4KICAqLwotZXh0ZXJuIGRoZF9wdWJfdCAqZGhkX2F0dGFjaChvc2xfdCAqb3NoLCBzdHJ1Y3QgZGhkX2J1cyAqYnVzLCB1aW50IGJ1c19oZHJsZW4pOworZXh0ZXJuIGRoZF9wdWJfdCAqZGhkX2F0dGFjaChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc3RydWN0IGRoZF9idXMgKmJ1cywKKwkJCQl1aW50IGJ1c19oZHJsZW4pOwogZXh0ZXJuIGludCBkaGRfbmV0X2F0dGFjaChkaGRfcHViX3QgKmRoZHAsIGludCBpZHgpOwogCiAvKiBJbmRpY2F0aW9uIGZyb20gYnVzIG1vZHVsZSByZWdhcmRpbmcgcmVtb3ZhbC9hYnNlbmNlIG9mIGRvbmdsZSAqLwpAQCAtMjk0LDEwICsyOTUsMTIgQEAKIC8qIEluZGljYXRpb24gZnJvbSBidXMgbW9kdWxlIHRvIGNoYW5nZSBmbG93LWNvbnRyb2wgc3RhdGUgKi8KIGV4dGVybiB2b2lkIGRoZF90eGZsb3djb250cm9sKGRoZF9wdWJfdCAqZGhkcCwgaW50IGlmaWR4LCBib29sIG9uKTsKIAotZXh0ZXJuIGJvb2wgZGhkX3ByZWNfZW5xKGRoZF9wdWJfdCAqZGhkcCwgc3RydWN0IHBrdHEgKnEsIHZvaWQgKnBrdCwgaW50IHByZWMpOworZXh0ZXJuIGJvb2wgZGhkX3ByZWNfZW5xKGRoZF9wdWJfdCAqZGhkcCwgc3RydWN0IHBrdHEgKnEsCisJCQkgc3RydWN0IHNrX2J1ZmYgKnBrdCwgaW50IHByZWMpOwogCiAvKiBSZWNlaXZlIGZyYW1lIGZvciBkZWxpdmVyeSB0byBPUy4gIENhbGxlZSBkaXNwb3NlcyBvZiByeHAuICovCi1leHRlcm4gdm9pZCBkaGRfcnhfZnJhbWUoZGhkX3B1Yl90ICpkaGRwLCBpbnQgaWZpZHgsIHZvaWQgKnJ4cCwgaW50IG51bXBrdCk7CitleHRlcm4gdm9pZCBkaGRfcnhfZnJhbWUoZGhkX3B1Yl90ICpkaGRwLCBpbnQgaWZpZHgsCisJCQkgc3RydWN0IHNrX2J1ZmYgKnJ4cCwgaW50IG51bXBrdCk7CiAKIC8qIFJldHVybiBwb2ludGVyIHRvIGludGVyZmFjZSBuYW1lICovCiBleHRlcm4gY2hhciAqZGhkX2lmbmFtZShkaGRfcHViX3QgKmRoZHAsIGludCBpZHgpOwpAQCAtMzA2LDcgKzMwOSw3IEBACiBleHRlcm4gdm9pZCBkaGRfc2NoZWRfZHBjKGRoZF9wdWJfdCAqZGhkcCk7CiAKIC8qIE5vdGlmeSB0eCBjb21wbGV0aW9uICovCi1leHRlcm4gdm9pZCBkaGRfdHhjb21wbGV0ZShkaGRfcHViX3QgKmRoZHAsIHZvaWQgKnR4cCwgYm9vbCBzdWNjZXNzKTsKK2V4dGVybiB2b2lkIGRoZF90eGNvbXBsZXRlKGRoZF9wdWJfdCAqZGhkcCwgc3RydWN0IHNrX2J1ZmYgKnR4cCwgYm9vbCBzdWNjZXNzKTsKIAogLyogUXVlcnkgaW9jdGwgKi8KIGV4dGVybiBpbnQgZGhkY2RjX3F1ZXJ5X2lvY3RsKGRoZF9wdWJfdCAqZGhkLCBpbnQgaWZpZHgsIHVpbnQgY21kLCB2b2lkICpidWYsCkBAIC0zNzcsNyArMzgwLDcgQEAKIAkJCSAgIGludCBsZW4pOwogCiAvKiBTZW5kIHBhY2tldCB0byBkb25nbGUgdmlhIGRhdGEgY2hhbm5lbCAqLwotZXh0ZXJuIGludCBkaGRfc2VuZHBrdChkaGRfcHViX3QgKmRoZHAsIGludCBpZmlkeCwgdm9pZCAqcGt0KTsKK2V4dGVybiBpbnQgZGhkX3NlbmRwa3QoZGhkX3B1Yl90ICpkaGRwLCBpbnQgaWZpZHgsIHN0cnVjdCBza19idWZmICpwa3QpOwogCiAvKiBTZW5kIGV2ZW50IHRvIGhvc3QgKi8KIGV4dGVybiB2b2lkIGRoZF9zZW5kdXBfZXZlbnQoZGhkX3B1Yl90ICpkaGRwLCB3bF9ldmVudF9tc2dfdCAqZXZlbnQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9idXMuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2J1cy5oCmluZGV4IDNiMzljOTkuLmNkMGQ1NDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2J1cy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2J1cy5oCkBAIC0yNiw4ICsyNiw4IEBACiBleHRlcm4gdm9pZCBkaGRfYnVzX3VucmVnaXN0ZXIodm9pZCk7CiAKIC8qIERvd25sb2FkIGZpcm13YXJlIGltYWdlIGFuZCBudnJhbSBpbWFnZSAqLwotZXh0ZXJuIGJvb2wgZGhkX2J1c19kb3dubG9hZF9maXJtd2FyZShzdHJ1Y3QgZGhkX2J1cyAqYnVzLCBvc2xfdCAqIG9zaCwKLQkJCQkgICAgICBjaGFyICpmd19wYXRoLCBjaGFyICpudl9wYXRoKTsKK2V4dGVybiBib29sIGRoZF9idXNfZG93bmxvYWRfZmlybXdhcmUoc3RydWN0IGRoZF9idXMgKmJ1cywKKwkgICAgICBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgY2hhciAqZndfcGF0aCwgY2hhciAqbnZfcGF0aCk7CiAKIC8qIFN0b3AgYnVzIG1vZHVsZTogY2xlYXIgcGVuZGluZyBmcmFtZXMsIGRpc2FibGUgZGF0YSBmbG93ICovCiBleHRlcm4gdm9pZCBkaGRfYnVzX3N0b3Aoc3RydWN0IGRoZF9idXMgKmJ1cywgYm9vbCBlbmZvcmNlX211dGV4KTsKQEAgLTM2LDcgKzM2LDcgQEAKIGV4dGVybiBpbnQgZGhkX2J1c19pbml0KGRoZF9wdWJfdCAqZGhkcCwgYm9vbCBlbmZvcmNlX211dGV4KTsKIAogLyogU2VuZCBhIGRhdGEgZnJhbWUgdG8gdGhlIGRvbmdsZS4gIENhbGxlZSBkaXNwb3NlcyBvZiB0eHAuICovCi1leHRlcm4gaW50IGRoZF9idXNfdHhkYXRhKHN0cnVjdCBkaGRfYnVzICpidXMsIHZvaWQgKnR4cCk7CitleHRlcm4gaW50IGRoZF9idXNfdHhkYXRhKHN0cnVjdCBkaGRfYnVzICpidXMsIHN0cnVjdCBza19idWZmICp0eHApOwogCiAvKiBTZW5kL3JlY2VpdmUgYSBjb250cm9sIG1lc3NhZ2UgdG8vZnJvbSB0aGUgZG9uZ2xlLgogICogRXhwZWN0cyBjYWxsZXIgdG8gZW5mb3JjZSBhIHNpbmdsZSBvdXRzdGFuZGluZyB0cmFuc2FjdGlvbi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2NkYy5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfY2RjLmMKaW5kZXggYmNiYWFjOS4uYjdiNTI3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfY2RjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfY2RjLmMKQEAgLTE1LDYgKzE1LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxiY21kZWZzLmg+CiAjaW5jbHVkZSA8b3NsLmg+CiAKQEAgLTI5Nyw2ICsyOTgsMTUgQEAKIAlyZXR1cm4gcmV0OwogfQogCisjZGVmaW5lIFBLVFNVTU5FRURFRChza2IpIFwKKwkJKCgoc3RydWN0IHNrX2J1ZmYgKikoc2tiKSktPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKQorI2RlZmluZSBQS1RTRVRTVU1HT09EKHNrYiwgeCkgXAorCQkoKChzdHJ1Y3Qgc2tfYnVmZiAqKShza2IpKS0+aXBfc3VtbWVkID0gXAorCQkoKHgpID8gQ0hFQ0tTVU1fVU5ORUNFU1NBUlkgOiBDSEVDS1NVTV9OT05FKSkKKworLyogUEtUU0VUU1VNTkVFREVEIGFuZCBQS1RTVU1HT09EIGFyZSBub3QgcG9zc2libGUgYmVjYXVzZQorCXNrYi0+aXBfc3VtbWVkIGlzIG92ZXJsb2FkZWQgKi8KKwogaW50CiBkaGRfcHJvdF9pb3Zhcl9vcChkaGRfcHViX3QgKmRoZHAsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCSAgdm9pZCAqcGFyYW1zLCBpbnQgcGxlbiwgdm9pZCAqYXJnLCBpbnQgbGVuLCBib29sIHNldCkKQEAgLTMwOSw3ICszMTksNyBAQAogCWJjbV9icHJpbnRmKHN0cmJ1ZiwgIlByb3RvY29sIENEQzogcmVxaWQgJWRcbiIsIGRoZHAtPnByb3QtPnJlcWlkKTsKIH0KIAotdm9pZCBkaGRfcHJvdF9oZHJwdXNoKGRoZF9wdWJfdCAqZGhkLCBpbnQgaWZpZHgsIHZvaWQgKnBrdGJ1ZikKK3ZvaWQgZGhkX3Byb3RfaGRycHVzaChkaGRfcHViX3QgKmRoZCwgaW50IGlmaWR4LCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0YnVmKQogewogI2lmZGVmIEJEQwogCXN0cnVjdCBiZGNfaGVhZGVyICpoOwpAQCAtMzIwLDMzICszMzAsMzMgQEAKICNpZmRlZiBCREMKIAkvKiBQdXNoIEJEQyBoZWFkZXIgdXNlZCB0byBjb252ZXkgcHJpb3JpdHkgZm9yIGJ1c2VzIHRoYXQgZG9uJ3QgKi8KIAotCVBLVFBVU0gocGt0YnVmLCBCRENfSEVBREVSX0xFTik7CisJc2tiX3B1c2gocGt0YnVmLCBCRENfSEVBREVSX0xFTik7CiAKLQloID0gKHN0cnVjdCBiZGNfaGVhZGVyICopUEtUREFUQShwa3RidWYpOworCWggPSAoc3RydWN0IGJkY19oZWFkZXIgKikocGt0YnVmLT5kYXRhKTsKIAogCWgtPmZsYWdzID0gKEJEQ19QUk9UT19WRVIgPDwgQkRDX0ZMQUdfVkVSX1NISUZUKTsKIAlpZiAoUEtUU1VNTkVFREVEKHBrdGJ1ZikpCiAJCWgtPmZsYWdzIHw9IEJEQ19GTEFHX1NVTV9ORUVERUQ7CiAKLQloLT5wcmlvcml0eSA9IChQS1RQUklPKHBrdGJ1ZikgJiBCRENfUFJJT1JJVFlfTUFTSyk7CisJaC0+cHJpb3JpdHkgPSAocGt0YnVmLT5wcmlvcml0eSAmIEJEQ19QUklPUklUWV9NQVNLKTsKIAloLT5mbGFnczIgPSAwOwogCWgtPnJzc2kgPSAwOwogI2VuZGlmCQkJCS8qIEJEQyAqLwogCUJEQ19TRVRfSUZfSURYKGgsIGlmaWR4KTsKIH0KIAotYm9vbCBkaGRfcHJvdG9fZmNpbmZvKGRoZF9wdWJfdCAqZGhkLCB2b2lkICpwa3RidWYsIHU4ICogZmNiaXRzKQorYm9vbCBkaGRfcHJvdG9fZmNpbmZvKGRoZF9wdWJfdCAqZGhkLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0YnVmLCB1OCAqIGZjYml0cykKIHsKICNpZmRlZiBCREMKIAlzdHJ1Y3QgYmRjX2hlYWRlciAqaDsKIAotCWlmIChQS1RMRU4ocGt0YnVmKSA8IEJEQ19IRUFERVJfTEVOKSB7CisJaWYgKHBrdGJ1Zi0+bGVuIDwgQkRDX0hFQURFUl9MRU4pIHsKIAkJREhEX0VSUk9SKCgiJXM6IHJ4IGRhdGEgdG9vIHNob3J0ICglZCA8ICVkKVxuIiwKLQkJCSAgIF9fZnVuY19fLCBQS1RMRU4ocGt0YnVmKSwgQkRDX0hFQURFUl9MRU4pKTsKKwkJCSAgIF9fZnVuY19fLCBwa3RidWYtPmxlbiwgQkRDX0hFQURFUl9MRU4pKTsKIAkJcmV0dXJuIEJDTUVfRVJST1I7CiAJfQogCi0JaCA9IChzdHJ1Y3QgYmRjX2hlYWRlciAqKVBLVERBVEEocGt0YnVmKTsKKwloID0gKHN0cnVjdCBiZGNfaGVhZGVyICopKHBrdGJ1Zi0+ZGF0YSk7CiAKIAkqZmNiaXRzID0gaC0+cHJpb3JpdHkgPj4gQkRDX1BSSU9SSVRZX0ZDX1NISUZUOwogCWlmICgoaC0+ZmxhZ3MyICYgQkRDX0ZMQUcyX0ZDX0ZMQUcpID09IEJEQ19GTEFHMl9GQ19GTEFHKQpAQCAtMzU1LDcgKzM2NSw3IEBACiAJcmV0dXJuIGZhbHNlOwogfQogCi1pbnQgZGhkX3Byb3RfaGRycHVsbChkaGRfcHViX3QgKmRoZCwgaW50ICppZmlkeCwgdm9pZCAqcGt0YnVmKQoraW50IGRoZF9wcm90X2hkcnB1bGwoZGhkX3B1Yl90ICpkaGQsIGludCAqaWZpZHgsIHN0cnVjdCBza19idWZmICpwa3RidWYpCiB7CiAjaWZkZWYgQkRDCiAJc3RydWN0IGJkY19oZWFkZXIgKmg7CkBAIC0zNjYsMTMgKzM3NiwxMyBAQAogI2lmZGVmIEJEQwogCS8qIFBvcCBCREMgaGVhZGVyIHVzZWQgdG8gY29udmV5IHByaW9yaXR5IGZvciBidXNlcyB0aGF0IGRvbid0ICovCiAKLQlpZiAoUEtUTEVOKHBrdGJ1ZikgPCBCRENfSEVBREVSX0xFTikgeworCWlmIChwa3RidWYtPmxlbiA8IEJEQ19IRUFERVJfTEVOKSB7CiAJCURIRF9FUlJPUigoIiVzOiByeCBkYXRhIHRvbyBzaG9ydCAoJWQgPCAlZClcbiIsIF9fZnVuY19fLAotCQkJICAgUEtUTEVOKHBrdGJ1ZiksIEJEQ19IRUFERVJfTEVOKSk7CisJCQkgICBwa3RidWYtPmxlbiwgQkRDX0hFQURFUl9MRU4pKTsKIAkJcmV0dXJuIEJDTUVfRVJST1I7CiAJfQogCi0JaCA9IChzdHJ1Y3QgYmRjX2hlYWRlciAqKVBLVERBVEEocGt0YnVmKTsKKwloID0gKHN0cnVjdCBiZGNfaGVhZGVyICopKHBrdGJ1Zi0+ZGF0YSk7CiAKIAkqaWZpZHggPSBCRENfR0VUX0lGX0lEWChoKTsKIAlpZiAoKmlmaWR4ID49IERIRF9NQVhfSUZTKSB7CkBAIC0zOTUsOSArNDA1LDkgQEAKIAkJUEtUU0VUU1VNR09PRChwa3RidWYsIHRydWUpOwogCX0KIAotCVBLVFNFVFBSSU8ocGt0YnVmLCAoaC0+cHJpb3JpdHkgJiBCRENfUFJJT1JJVFlfTUFTSykpOworCXBrdGJ1Zi0+cHJpb3JpdHkgPSBoLT5wcmlvcml0eSAmIEJEQ19QUklPUklUWV9NQVNLOwogCi0JUEtUUFVMTChwa3RidWYsIEJEQ19IRUFERVJfTEVOKTsKKwlza2JfcHVsbChwa3RidWYsIEJEQ19IRUFERVJfTEVOKTsKICNlbmRpZgkJCQkvKiBCREMgKi8KIAogCXJldHVybiAwOwpAQCAtNDY3LDcgKzQ3Nyw3IEBACiAJCWRoZF9vc19wcm90b191bmJsb2NrKGRoZCk7CiAJCXJldHVybiByZXQ7CiAJfQotCW1lbWNweShkaGQtPm1hYy5vY3RldCwgYnVmLCBFVEhFUl9BRERSX0xFTik7CisJbWVtY3B5KGRoZC0+bWFjLm9jdGV0LCBidWYsIEVUSF9BTEVOKTsKIAogCWRoZF9vc19wcm90b191bmJsb2NrKGRoZCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2NvbW1vbi5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfY29tbW9uLmMKaW5kZXggNzAzMTg4Zi4uM2RiZjcyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfY29tbW9uLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfY29tbW9uLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxiY21kZWZzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8b3NsLmg+CiAjaW5jbHVkZSA8YmNtdXRpbHMuaD4KICNpbmNsdWRlIDxiY21lbmRpYW4uaD4KQEAgLTMyNiw5ICszMjcsMTAgQEAKIAl9CiB9CiAKLWJvb2wgZGhkX3ByZWNfZW5xKGRoZF9wdWJfdCAqZGhkcCwgc3RydWN0IHBrdHEgKnEsIHZvaWQgKnBrdCwgaW50IHByZWMpCitib29sIGRoZF9wcmVjX2VucShkaGRfcHViX3QgKmRoZHAsIHN0cnVjdCBwa3RxICpxLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0LAorCQkgIGludCBwcmVjKQogewotCXZvaWQgKnA7CisJc3RydWN0IHNrX2J1ZmYgKnA7CiAJaW50IGVwcmVjID0gLTE7CQkvKiBwcmVjZWRlbmNlIHRvIGV2aWN0IGZyb20gKi8KIAlib29sIGRpc2NhcmRfb2xkZXN0OwogCkBAIC0zNjYsNyArMzY4LDcgQEAKIAkJCUFTU0VSVChwKTsKIAkJfQogCi0JCVBLVEZSRUUoZGhkcC0+b3NoLCBwLCB0cnVlKTsKKwkJcGt0X2J1Zl9mcmVlX3NrYihkaGRwLT5vc2gsIHAsIHRydWUpOwogCX0KIAogCS8qIEVucXVldWUgKi8KQEAgLTgzMiw3ICs4MzQsNyBAQAogCXUxNiBmbGFnczsKIAlpbnQgZXZsZW47CiAKLQlpZiAoYmNtcChCUkNNX09VSSwgJnB2dF9kYXRhLT5iY21faGRyLm91aVswXSwgRE9UMTFfT1VJX0xFTikpIHsKKwlpZiAobWVtY21wKEJSQ01fT1VJLCAmcHZ0X2RhdGEtPmJjbV9oZHIub3VpWzBdLCBET1QxMV9PVUlfTEVOKSkgewogCQlESERfRVJST1IoKCIlczogbWlzbWF0Y2hlZCBPVUksIGJhaWxpbmdcbiIsIF9fZnVuY19fKSk7CiAJCXJldHVybiBCQ01FX0VSUk9SOwogCX0KQEAgLTEyNTQsNyArMTI1Niw3IEBACiAJICovCiAJcmV0ID0gZGhkX2N1c3RvbV9nZXRfbWFjX2FkZHJlc3MoZWFfYWRkci5vY3RldCk7CiAJaWYgKCFyZXQpIHsKLQkJYmNtX21raW92YXIoImN1cl9ldGhlcmFkZHIiLCAodm9pZCAqKSZlYV9hZGRyLCBFVEhFUl9BRERSX0xFTiwKKwkJYmNtX21raW92YXIoImN1cl9ldGhlcmFkZHIiLCAodm9pZCAqKSZlYV9hZGRyLCBFVEhfQUxFTiwKIAkJCSAgICBidWYsIHNpemVvZihidWYpKTsKIAkJcmV0ID0gZGhkY2RjX3NldF9pb2N0bChkaGQsIDAsIFdMQ19TRVRfVkFSLCBidWYsIHNpemVvZihidWYpKTsKIAkJaWYgKHJldCA8IDApIHsKQEAgLTEyNjIsNyArMTI2NCw3IEBACiAJCQkJICAgX19mdW5jX18sIHJldCkpOwogCQl9IGVsc2UKIAkJCW1lbWNweShkaGQtPm1hYy5vY3RldCwgKHZvaWQgKikmZWFfYWRkciwKLQkJCSAgICAgICBFVEhFUl9BRERSX0xFTik7CisJCQkgICAgICAgRVRIX0FMRU4pOwogCX0KICNlbmRpZgkJCQkvKiBHRVRfQ1VTVE9NX01BQ19FTkFCTEUgKi8KIApAQCAtMTUzMiw3ICsxNTM0LDcgQEAKIAkJCQkJYnJlYWs7CiAKIAkJCQlpZiAoIW1lbWNtcAotCQkJCSAgICAoYmktPkJTU0lELm9jdGV0LCBhZGRyLCBFVEhFUl9BRERSX0xFTikpIHsKKwkJCQkgICAgKGJpLT5CU1NJRC5vY3RldCwgYWRkciwgRVRIX0FMRU4pKSB7CiAJCQkJCURIRF9JU0NBTigoIiVzOiBEZWwgQlNTWyUyLjJkOiUyLjJkXSAiCiAJCQkJCSIlWDolWDolWDolWDolWDolWFxuIiwKIAkJCQkJX19mdW5jX18sIGwsIGksIGJpLT5CU1NJRC5vY3RldFswXSwKQEAgLTE2NzAsNyArMTY3Miw3IEBACiAJY2hhciBidWZbV0xDX0lPQ1RMX1NNTEVOXTsKIAogCW1lbXNldCgmcGFyYW1zLCAwLCBzaXplb2Yod2xfaXNjYW5fcGFyYW1zX3QpKTsKLQltZW1jcHkoJnBhcmFtcy5wYXJhbXMuYnNzaWQsICZldGhlcl9iY2FzdCwgRVRIRVJfQUREUl9MRU4pOworCW1lbWNweSgmcGFyYW1zLnBhcmFtcy5ic3NpZCwgJmV0aGVyX2JjYXN0LCBFVEhfQUxFTik7CiAKIAlwYXJhbXMucGFyYW1zLmJzc190eXBlID0gRE9UMTFfQlNTVFlQRV9BTlk7CiAJcGFyYW1zLnBhcmFtcy5zY2FuX3R5cGUgPSBET1QxMV9TQ0FOVFlQRV9BQ1RJVkU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9jdXN0b21fZ3Bpby5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfY3VzdG9tX2dwaW8uYwppbmRleCBmNjQ3MDM0Li5jM2YxOGJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9jdXN0b21fZ3Bpby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2N1c3RvbV9ncGlvLmMKQEAgLTE0LDcgKzE0LDcgQEAKICAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4dmVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8b3NsLmg+CiAjaW5jbHVkZSA8YmNtdXRpbHMuaD4KIApAQCAtMjQsOCArMjQsOCBAQAogI2luY2x1ZGUgPHdsaW9jdGwuaD4KICNpbmNsdWRlIDx3bF9pdy5oPgogCi0jZGVmaW5lIFdMX0VSUk9SKHgpIHByaW50ZiB4Ci0jZGVmaW5lIFdMX1RSQUNFKHgpCisjZGVmaW5lIFdMX0VSUk9SKGZtdCwgYXJncy4uLikgcHJpbnRrKGZtdCwgIyNhcmdzKQorI2RlZmluZSBXTF9UUkFDRShmbXQsIGFyZ3MuLi4pIG5vX3ByaW50ayhmbXQsICMjYXJncykKIAogI2lmZGVmIENVU1RPTUVSX0hXCiBleHRlcm4gdm9pZCBiY21fd2xhbl9wb3dlcl9vZmYoaW50KTsKQEAgLTY3LDEzICs2NywxMyBAQAogI2VuZGlmCiAKIAlpZiAoZGhkX29vYl9ncGlvX251bSA8IDApIHsKLQkJV0xfRVJST1IoKCIlczogRVJST1IgY3VzdG9tZXIgc3BlY2lmaWMgSG9zdCBHUElPIGlzIE5PVCBkZWZpbmVkXG4iLAotCQkJX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIiVzOiBFUlJPUiBjdXN0b21lciBzcGVjaWZpYyBIb3N0IEdQSU8gaXMgTk9UIGRlZmluZWRcbiIsCisJCQkgX19mdW5jX18pOwogCQlyZXR1cm4gZGhkX29vYl9ncGlvX251bTsKIAl9CiAKLQlXTF9FUlJPUigoIiVzOiBjdXN0b21lciBzcGVjaWZpYyBIb3N0IEdQSU8gbnVtYmVyIGlzICglZClcbiIsCi0JCSAgX19mdW5jX18sIGRoZF9vb2JfZ3Bpb19udW0pKTsKKwlXTF9FUlJPUigiJXM6IGN1c3RvbWVyIHNwZWNpZmljIEhvc3QgR1BJTyBudW1iZXIgaXMgKCVkKVxuIiwKKwkJIF9fZnVuY19fLCBkaGRfb29iX2dwaW9fbnVtKTsKIAogI2lmIGRlZmluZWQgQ1VTVE9NRVJfSFcKIAlob3N0X29vYl9pcnEgPSBNU01fR1BJT19UT19JTlQoZGhkX29vYl9ncGlvX251bSk7CkBAIC05Myw0MCArOTMsNDAgQEAKIHsKIAlzd2l0Y2ggKG9ub2ZmKSB7CiAJY2FzZSBXTEFOX1JFU0VUX09GRjoKLQkJV0xfVFJBQ0UoKCIlczogY2FsbCBjdXN0b21lciBzcGVjaWZpYyBHUElPIHRvIGluc2VydCBXTEFOIFJFU0VUXG4iLAotCQkJX19mdW5jX18pKTsKKwkJV0xfVFJBQ0UoIiVzOiBjYWxsIGN1c3RvbWVyIHNwZWNpZmljIEdQSU8gdG8gaW5zZXJ0IFdMQU4gUkVTRVRcbiIsCisJCQkgX19mdW5jX18pOwogI2lmZGVmIENVU1RPTUVSX0hXCiAJCWJjbV93bGFuX3Bvd2VyX29mZigyKTsKICNlbmRpZgkJCQkvKiBDVVNUT01FUl9IVyAqLwogI2lmZGVmIENVU1RPTUVSX0hXMgogCQl3aWZpX3NldF9wb3dlcigwLCAwKTsKICNlbmRpZgotCQlXTF9FUlJPUigoIj09PT09PT09PT09IFdMQU4gcGxhY2VkIGluIFJFU0VUID09PT09PT09XG4iKSk7CisJCVdMX0VSUk9SKCI9PT09PT09PT09PSBXTEFOIHBsYWNlZCBpbiBSRVNFVCA9PT09PT09PVxuIik7CiAJCWJyZWFrOwogCiAJY2FzZSBXTEFOX1JFU0VUX09OOgotCQlXTF9UUkFDRSgoIiVzOiBjYWxsYyBjdXN0b21lciBzcGVjaWZpYyBHUElPIHRvIHJlbW92ZSBXTEFOIFJFU0VUXG4iLAotCQkJX19mdW5jX18pKTsKKwkJV0xfVFJBQ0UoIiVzOiBjYWxsYyBjdXN0b21lciBzcGVjaWZpYyBHUElPIHRvIHJlbW92ZSBXTEFOIFJFU0VUXG4iLAorCQkJIF9fZnVuY19fKTsKICNpZmRlZiBDVVNUT01FUl9IVwogCQliY21fd2xhbl9wb3dlcl9vbigyKTsKICNlbmRpZgkJCQkvKiBDVVNUT01FUl9IVyAqLwogI2lmZGVmIENVU1RPTUVSX0hXMgogCQl3aWZpX3NldF9wb3dlcigxLCAwKTsKICNlbmRpZgotCQlXTF9FUlJPUigoIj09PT09PT09PT09IFdMQU4gZ29pbmcgYmFjayB0byBsaXZlICA9PT09PT09PVxuIikpOworCQlXTF9FUlJPUigiPT09PT09PT09PT0gV0xBTiBnb2luZyBiYWNrIHRvIGxpdmUgID09PT09PT09XG4iKTsKIAkJYnJlYWs7CiAKIAljYXNlIFdMQU5fUE9XRVJfT0ZGOgotCQlXTF9UUkFDRSgoIiVzOiBjYWxsIGN1c3RvbWVyIHNwZWNpZmljIEdQSU8gdG8gdHVybiBvZmYgV0xfUkVHX09OXG4iLAotCQkJX19mdW5jX18pKTsKKwkJV0xfVFJBQ0UoIiVzOiBjYWxsIGN1c3RvbWVyIHNwZWNpZmljIEdQSU8gdG8gdHVybiBvZmYgV0xfUkVHX09OXG4iLAorCQkJIF9fZnVuY19fKTsKICNpZmRlZiBDVVNUT01FUl9IVwogCQliY21fd2xhbl9wb3dlcl9vZmYoMSk7CiAjZW5kaWYJCQkJLyogQ1VTVE9NRVJfSFcgKi8KIAkJYnJlYWs7CiAKIAljYXNlIFdMQU5fUE9XRVJfT046Ci0JCVdMX1RSQUNFKCgiJXM6IGNhbGwgY3VzdG9tZXIgc3BlY2lmaWMgR1BJTyB0byB0dXJuIG9uIFdMX1JFR19PTlxuIiwKLQkJCV9fZnVuY19fKSk7CisJCVdMX1RSQUNFKCIlczogY2FsbCBjdXN0b21lciBzcGVjaWZpYyBHUElPIHRvIHR1cm4gb24gV0xfUkVHX09OXG4iLAorCQkJIF9fZnVuY19fKTsKICNpZmRlZiBDVVNUT01FUl9IVwogCQliY21fd2xhbl9wb3dlcl9vbigxKTsKICNlbmRpZgkJCQkvKiBDVVNUT01FUl9IVyAqLwpAQCAtMTQwLDcgKzE0MCw3IEBACiAvKiBGdW5jdGlvbiB0byBnZXQgY3VzdG9tIE1BQyBhZGRyZXNzICovCiBpbnQgZGhkX2N1c3RvbV9nZXRfbWFjX2FkZHJlc3ModW5zaWduZWQgY2hhciAqYnVmKQogewotCVdMX1RSQUNFKCgiJXMgRW50ZXJcbiIsIF9fZnVuY19fKSk7CisJV0xfVFJBQ0UoIiVzIEVudGVyXG4iLCBfX2Z1bmNfXyk7CiAJaWYgKCFidWYpCiAJCXJldHVybiAtRUlOVkFMOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfbGludXguYwppbmRleCA5MzM1ZjAyLi5kYjQ1MDgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9saW51eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2xpbnV4LmMKQEAgLTMyLDcgKzMyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxiY21kZWZzLmg+Ci0jaW5jbHVkZSA8bGludXh2ZXIuaD4KICNpbmNsdWRlIDxvc2wuaD4KICNpbmNsdWRlIDxiY211dGlscy5oPgogI2luY2x1ZGUgPGJjbWVuZGlhbi5oPgpAQCAtMjExLDcgKzIxMCw3IEBACiAJaW50IGlkeDsJCS8qIGlmYWNlIGlkeCBpbiBkb25nbGUgKi8KIAlpbnQgc3RhdGU7CQkvKiBpbnRlcmZhY2Ugc3RhdGUgKi8KIAl1aW50IHN1YnVuaXQ7CQkvKiBzdWJ1bml0ICovCi0JdTggbWFjX2FkZHJbRVRIRVJfQUREUl9MRU5dOwkvKiBhc3NpZ25lZCBNQUMgYWRkcmVzcyAqLworCXU4IG1hY19hZGRyW0VUSF9BTEVOXTsJLyogYXNzaWduZWQgTUFDIGFkZHJlc3MgKi8KIAlib29sIGF0dGFjaGVkOwkJLyogRGVsYXllZCBhdHRhY2htZW50IHdoZW4gdW5zZXQgKi8KIAlib29sIHR4Zmxvd2NvbnRyb2w7CS8qIFBlciBpbnRlcmZhY2UgZmxvdyBjb250cm9sIGluZGljYXRvciAqLwogCWNoYXIgbmFtZVtJRk5BTVNJWl07CS8qIGxpbnV4IGludGVyZmFjZSBuYW1lICovCkBAIC03MDksNyArNzA4LDcgQEAKIAogCS8qIFNlbmQgZG93biB0aGUgbXVsdGljYXN0IGxpc3QgZmlyc3QuICovCiAKLQlidWZsZW4gPSBzaXplb2YoIm1jYXN0X2xpc3QiKSArIHNpemVvZihjbnQpICsgKGNudCAqIEVUSEVSX0FERFJfTEVOKTsKKwlidWZsZW4gPSBzaXplb2YoIm1jYXN0X2xpc3QiKSArIHNpemVvZihjbnQpICsgKGNudCAqIEVUSF9BTEVOKTsKIAlidWZwID0gYnVmID0ga21hbGxvYyhidWZsZW4sIEdGUF9BVE9NSUMpOwogCWlmICghYnVmcCkgewogCQlESERfRVJST1IoKCIlczogb3V0IG9mIG1lbW9yeSBmb3IgbWNhc3RfbGlzdCwgY250ICVkXG4iLApAQCAtNzI3LDggKzcyNiw4IEBACiAJbmV0ZGV2X2Zvcl9lYWNoX21jX2FkZHIoaGEsIGRldikgewogCQlpZiAoIWNudCkKIAkJCWJyZWFrOwotCQltZW1jcHkoYnVmcCwgaGEtPmFkZHIsIEVUSEVSX0FERFJfTEVOKTsKLQkJYnVmcCArPSBFVEhFUl9BRERSX0xFTjsKKwkJbWVtY3B5KGJ1ZnAsIGhhLT5hZGRyLCBFVEhfQUxFTik7CisJCWJ1ZnAgKz0gRVRIX0FMRU47CiAJCWNudC0tOwogCX0KIApAQCAtODEyLDcgKzgxMSw3IEBACiAKIAlESERfVFJBQ0UoKCIlcyBlbnRlclxuIiwgX19mdW5jX18pKTsKIAlpZiAoIWJjbV9ta2lvdmFyCi0JICAgICgiY3VyX2V0aGVyYWRkciIsIChjaGFyICopYWRkciwgRVRIRVJfQUREUl9MRU4sIGJ1ZiwgMzIpKSB7CisJICAgICgiY3VyX2V0aGVyYWRkciIsIChjaGFyICopYWRkciwgRVRIX0FMRU4sIGJ1ZiwgMzIpKSB7CiAJCURIRF9FUlJPUigoIiVzOiBta2lvdmFyIGZhaWxlZCBmb3IgY3VyX2V0aGVyYWRkclxuIiwKIAkJCSAgIGRoZF9pZm5hbWUoJmRoZC0+cHViLCBpZmlkeCkpKTsKIAkJcmV0dXJuIC0xOwpAQCAtODI4LDcgKzgyNyw3IEBACiAJCURIRF9FUlJPUigoIiVzOiBzZXQgY3VyX2V0aGVyYWRkciBmYWlsZWRcbiIsCiAJCQkgICBkaGRfaWZuYW1lKCZkaGQtPnB1YiwgaWZpZHgpKSk7CiAJfSBlbHNlIHsKLQkJbWVtY3B5KGRoZC0+aWZsaXN0W2lmaWR4XS0+bmV0LT5kZXZfYWRkciwgYWRkciwgRVRIRVJfQUREUl9MRU4pOworCQltZW1jcHkoZGhkLT5pZmxpc3RbaWZpZHhdLT5uZXQtPmRldl9hZGRyLCBhZGRyLCBFVEhfQUxFTik7CiAJfQogCiAJcmV0dXJuIHJldDsKQEAgLTk5OCw3ICs5OTcsNyBAQAogCQlyZXR1cm4gLTE7CiAKIAlBU1NFUlQoZGhkLT5zeXNpb2NfdHNrKTsKLQltZW1jcHkoJmRoZC0+bWFjdmFsdWUsIHNhLT5zYV9kYXRhLCBFVEhFUl9BRERSX0xFTik7CisJbWVtY3B5KCZkaGQtPm1hY3ZhbHVlLCBzYS0+c2FfZGF0YSwgRVRIX0FMRU4pOwogCWRoZC0+c2V0X21hY2FkZHJlc3MgPSB0cnVlOwogCXVwKCZkaGQtPnN5c2lvY19zZW0pOwogCkBAIC0xMDE5LDcgKzEwMTgsNyBAQAogCXVwKCZkaGQtPnN5c2lvY19zZW0pOwogfQogCi1pbnQgZGhkX3NlbmRwa3QoZGhkX3B1Yl90ICpkaGRwLCBpbnQgaWZpZHgsIHZvaWQgKnBrdGJ1ZikKK2ludCBkaGRfc2VuZHBrdChkaGRfcHViX3QgKmRoZHAsIGludCBpZmlkeCwgc3RydWN0IHNrX2J1ZmYgKnBrdGJ1ZikKIHsKIAlpbnQgcmV0OwogCWRoZF9pbmZvX3QgKmRoZCA9IChkaGRfaW5mb190ICopIChkaGRwLT5pbmZvKTsKQEAgLTEwMjksMTMgKzEwMjgsMTMgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAkvKiBVcGRhdGUgbXVsdGljYXN0IHN0YXRpc3RpYyAqLwotCWlmIChQS1RMRU4ocGt0YnVmKSA+PSBFVEhFUl9BRERSX0xFTikgewotCQl1OCAqcGt0ZGF0YSA9ICh1OCAqKSBQS1REQVRBKHBrdGJ1Zik7CisJaWYgKHBrdGJ1Zi0+bGVuID49IEVUSF9BTEVOKSB7CisJCXU4ICpwa3RkYXRhID0gKHU4ICopIChwa3RidWYtPmRhdGEpOwogCQlzdHJ1Y3QgZXRoZXJfaGVhZGVyICplaCA9IChzdHJ1Y3QgZXRoZXJfaGVhZGVyICopcGt0ZGF0YTsKIAotCQlpZiAoRVRIRVJfSVNNVUxUSShlaC0+ZXRoZXJfZGhvc3QpKQorCQlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoZWgtPmV0aGVyX2Rob3N0KSkKIAkJCWRoZHAtPnR4X211bHRpY2FzdCsrOwotCQlpZiAobnRvaDE2KGVoLT5ldGhlcl90eXBlKSA9PSBFVEhFUl9UWVBFXzgwMl8xWCkKKwkJaWYgKG50b2gxNihlaC0+ZXRoZXJfdHlwZSkgPT0gRVRIX1BfUEFFKQogCQkJYXRvbWljX2luYygmZGhkLT5wZW5kXzgwMjF4X2NudCk7CiAJfQogCkBAIC0xMDUzLDYgKzEwNTIsMzIgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgKgorb3NsX3BrdF9mcm1uYXRpdmUoc3RydWN0IG9zbF9pbmZvICpvc2gsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNrX2J1ZmYgKm5za2I7CisKKwlmb3IgKG5za2IgPSBza2I7IG5za2I7IG5za2IgPSBuc2tiLT5uZXh0KQorCQlvc2gtPnBrdGFsbG9jZWQrKzsKKworCXJldHVybiAodm9pZCAqKXNrYjsKK30KKyNkZWZpbmUgUEtURlJNTkFUSVZFKG9zaCwgc2tiKQlcCisJb3NsX3BrdF9mcm1uYXRpdmUoKG9zaCksIChzdHJ1Y3Qgc2tfYnVmZiAqKShza2IpKQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICoKK29zbF9wa3RfdG9uYXRpdmUoc3RydWN0IG9zbF9pbmZvICpvc2gsIHZvaWQgKnBrdCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYjsKKworCWZvciAobnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKXBrdDsgbnNrYjsgbnNrYiA9IG5za2ItPm5leHQpCisJCW9zaC0+cGt0YWxsb2NlZC0tOworCisJcmV0dXJuIChzdHJ1Y3Qgc2tfYnVmZiAqKXBrdDsKK30KKyNkZWZpbmUgUEtUVE9OQVRJVkUob3NoLCBwa3QpCVwKKwlvc2xfcGt0X3RvbmF0aXZlKChvc2gpLCAocGt0KSkKKwogc3RhdGljIGludCBkaGRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQogewogCWludCByZXQ7CkBAIC0xMTMzLDEzICsxMTU4LDE1IEBACiAJCW5ldGlmX3dha2VfcXVldWUobmV0KTsKIH0KIAotdm9pZCBkaGRfcnhfZnJhbWUoZGhkX3B1Yl90ICpkaGRwLCBpbnQgaWZpZHgsIHZvaWQgKnBrdGJ1ZiwgaW50IG51bXBrdCkKK3ZvaWQgZGhkX3J4X2ZyYW1lKGRoZF9wdWJfdCAqZGhkcCwgaW50IGlmaWR4LCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0YnVmLAorCQkgIGludCBudW1wa3QpCiB7CiAJZGhkX2luZm9fdCAqZGhkID0gKGRoZF9pbmZvX3QgKikgZGhkcC0+aW5mbzsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXVuc2lnbmVkIGNoYXIgKmV0aDsKIAl1aW50IGxlbjsKLQl2b2lkICpkYXRhLCAqcG5leHQsICpzYXZlX3BrdGJ1ZjsKKwl2b2lkICpkYXRhOworCXN0cnVjdCBza19idWZmICpwbmV4dCwgKnNhdmVfcGt0YnVmOwogCWludCBpOwogCWRoZF9pZl90ICppZnA7CiAJd2xfZXZlbnRfbXNnX3QgZXZlbnQ7CkBAIC0xMTUwLDggKzExNzcsOCBAQAogCiAJZm9yIChpID0gMDsgcGt0YnVmICYmIGkgPCBudW1wa3Q7IGkrKywgcGt0YnVmID0gcG5leHQpIHsKIAotCQlwbmV4dCA9IFBLVE5FWFQocGt0YnVmKTsKLQkJUEtUU0VUTkVYVChwa3RidWYsIE5VTEwpOworCQlwbmV4dCA9IHBrdGJ1Zi0+bmV4dDsKKwkJcGt0YnVmLT5uZXh0ID0gTlVMTDsKIAogCQlza2IgPSBQS1RUT05BVElWRShkaGRwLT5vc2gsIHBrdGJ1Zik7CiAKQEAgLTExOTAsNyArMTIxNyw3IEBACiAJCS8qIFByb2Nlc3Mgc3BlY2lhbCBldmVudCBwYWNrZXRzIGFuZCB0aGVuIGRpc2NhcmQgdGhlbSAqLwogCQlpZiAobnRvaDE2KHNrYi0+cHJvdG9jb2wpID09IEVUSEVSX1RZUEVfQlJDTSkKIAkJCWRoZF93bF9ob3N0X2V2ZW50KGRoZCwgJmlmaWR4LAotCQkJCQkgIHNrYi0+bWFjX2hlYWRlciwKKwkJCQkJICBza2JfbWFjX2hlYWRlcihza2IpLAogCQkJCQkgICZldmVudCwgJmRhdGEpOwogCiAJCUFTU0VSVChpZmlkeCA8IERIRF9NQVhfSUZTICYmIGRoZC0+aWZsaXN0W2lmaWR4XSk7CkBAIC0xMjIzLDcgKzEyNTAsNyBAQAogCXJldHVybjsKIH0KIAotdm9pZCBkaGRfdHhjb21wbGV0ZShkaGRfcHViX3QgKmRoZHAsIHZvaWQgKnR4cCwgYm9vbCBzdWNjZXNzKQordm9pZCBkaGRfdHhjb21wbGV0ZShkaGRfcHViX3QgKmRoZHAsIHN0cnVjdCBza19idWZmICp0eHAsIGJvb2wgc3VjY2VzcykKIHsKIAl1aW50IGlmaWR4OwogCWRoZF9pbmZvX3QgKmRoZCA9IChkaGRfaW5mb190ICopIChkaGRwLT5pbmZvKTsKQEAgLTEyMzIsMTAgKzEyNTksMTAgQEAKIAogCWRoZF9wcm90X2hkcnB1bGwoZGhkcCwgJmlmaWR4LCB0eHApOwogCi0JZWggPSAoc3RydWN0IGV0aGVyX2hlYWRlciAqKVBLVERBVEEodHhwKTsKKwllaCA9IChzdHJ1Y3QgZXRoZXJfaGVhZGVyICopKHR4cC0+ZGF0YSk7CiAJdHlwZSA9IG50b2gxNihlaC0+ZXRoZXJfdHlwZSk7CiAKLQlpZiAodHlwZSA9PSBFVEhFUl9UWVBFXzgwMl8xWCkKKwlpZiAodHlwZSA9PSBFVEhfUF9QQUUpCiAJCWF0b21pY19kZWMoJmRoZC0+cGVuZF84MDIxeF9jbnQpOwogCiB9CkBAIC0xNjIxLDYgKzE2NDgsNTEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHMxNiBsaW51eGJjbWVycm9ybWFwW10gPSB7IDAsCS8qIDAgKi8KKwktRUlOVkFMLAkJLyogQkNNRV9FUlJPUiAqLworCS1FSU5WQUwsCQkvKiBCQ01FX0JBREFSRyAqLworCS1FSU5WQUwsCQkvKiBCQ01FX0JBRE9QVElPTiAqLworCS1FSU5WQUwsCQkvKiBCQ01FX05PVFVQICovCisJLUVJTlZBTCwJCS8qIEJDTUVfTk9URE9XTiAqLworCS1FSU5WQUwsCQkvKiBCQ01FX05PVEFQICovCisJLUVJTlZBTCwJCS8qIEJDTUVfTk9UU1RBICovCisJLUVJTlZBTCwJCS8qIEJDTUVfQkFES0VZSURYICovCisJLUVJTlZBTCwJCS8qIEJDTUVfUkFESU9PRkYgKi8KKwktRUlOVkFMLAkJLyogQkNNRV9OT1RCQU5ETE9DS0VEICovCisJLUVJTlZBTCwJCS8qIEJDTUVfTk9DTEsgKi8KKwktRUlOVkFMLAkJLyogQkNNRV9CQURSQVRFU0VUICovCisJLUVJTlZBTCwJCS8qIEJDTUVfQkFEQkFORCAqLworCS1FMkJJRywJCQkvKiBCQ01FX0JVRlRPT1NIT1JUICovCisJLUUyQklHLAkJCS8qIEJDTUVfQlVGVE9PTE9ORyAqLworCS1FQlVTWSwJCQkvKiBCQ01FX0JVU1kgKi8KKwktRUlOVkFMLAkJLyogQkNNRV9OT1RBU1NPQ0lBVEVEICovCisJLUVJTlZBTCwJCS8qIEJDTUVfQkFEU1NJRExFTiAqLworCS1FSU5WQUwsCQkvKiBCQ01FX09VVE9GUkFOR0VDSEFOICovCisJLUVJTlZBTCwJCS8qIEJDTUVfQkFEQ0hBTiAqLworCS1FRkFVTFQsCQkvKiBCQ01FX0JBREFERFIgKi8KKwktRU5PTUVNLAkJLyogQkNNRV9OT1JFU09VUkNFICovCisJLUVPUE5PVFNVUFAsCQkvKiBCQ01FX1VOU1VQUE9SVEVEICovCisJLUVNU0dTSVpFLAkJLyogQkNNRV9CQURMRU5HVEggKi8KKwktRUlOVkFMLAkJLyogQkNNRV9OT1RSRUFEWSAqLworCS1FUEVSTSwJCQkvKiBCQ01FX05PVFBFUk1JVFRFRCAqLworCS1FTk9NRU0sCQkvKiBCQ01FX05PTUVNICovCisJLUVJTlZBTCwJCS8qIEJDTUVfQVNTT0NJQVRFRCAqLworCS1FUkFOR0UsCQkvKiBCQ01FX1JBTkdFICovCisJLUVJTlZBTCwJCS8qIEJDTUVfTk9URk9VTkQgKi8KKwktRUlOVkFMLAkJLyogQkNNRV9XTUVfTk9UX0VOQUJMRUQgKi8KKwktRUlOVkFMLAkJLyogQkNNRV9UU1BFQ19OT1RGT1VORCAqLworCS1FSU5WQUwsCQkvKiBCQ01FX0FDTV9OT1RTVVBQT1JURUQgKi8KKwktRUlOVkFMLAkJLyogQkNNRV9OT1RfV01FX0FTU09DSUFUSU9OICovCisJLUVJTywJCQkvKiBCQ01FX1NESU9fRVJST1IgKi8KKwktRU5PREVWLAkJLyogQkNNRV9ET05HTEVfRE9XTiAqLworCS1FSU5WQUwsCQkvKiBCQ01FX1ZFUlNJT04gKi8KKwktRUlPLAkJCS8qIEJDTUVfVFhGQUlMICovCisJLUVJTywJCQkvKiBCQ01FX1JYRkFJTCAqLworCS1FSU5WQUwsCQkvKiBCQ01FX05PREVWSUNFICovCisJLUVJTlZBTCwJCS8qIEJDTUVfTk1PREVfRElTQUJMRUQgKi8KKwktRU5PREFUQSwJCS8qIEJDTUVfTk9OUkVTSURFTlQgKi8KK307CisKIHN0YXRpYyBpbnQgZGhkX2lvY3RsX2VudHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQogewogCWRoZF9pbmZvX3QgKmRoZCA9ICooZGhkX2luZm9fdCAqKikgbmV0ZGV2X3ByaXYobmV0KTsKQEAgLTE3NDIsNyArMTgxNCwxMiBAQAogCWlmIChidWYpCiAJCWtmcmVlKGJ1Zik7CiAKLQlyZXR1cm4gT1NMX0VSUk9SKGJjbWVycm9yKTsKKwlpZiAoYmNtZXJyb3IgPiAwKQorCQliY21lcnJvciA9IDA7CisJZWxzZSBpZiAoYmNtZXJyb3IgPCBCQ01FX0xBU1QpCisJCWJjbWVycm9yID0gQkNNRV9FUlJPUjsKKworCXJldHVybiBsaW51eGJjbWVycm9ybWFwWy1iY21lcnJvcl07CiB9CiAKIHN0YXRpYyBpbnQgZGhkX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKQEAgLTE3ODksNyArMTg2Niw3IEBACiAJCX0KIAkJYXRvbWljX3NldCgmZGhkLT5wZW5kXzgwMjF4X2NudCwgMCk7CiAKLQkJbWVtY3B5KG5ldC0+ZGV2X2FkZHIsIGRoZC0+cHViLm1hYy5vY3RldCwgRVRIRVJfQUREUl9MRU4pOworCQltZW1jcHkobmV0LT5kZXZfYWRkciwgZGhkLT5wdWIubWFjLm9jdGV0LCBFVEhfQUxFTik7CiAKICNpZmRlZiBUT0UKIAkJLyogR2V0IGN1cnJlbnQgVE9FIG1vZGUgZnJvbSBkb25nbGUgKi8KQEAgLTE4MTQsMTIgKzE4OTEsMTIgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1vc2xfdCAqZGhkX29zbF9hdHRhY2godm9pZCAqcGRldiwgdWludCBidXN0eXBlKQorc3RydWN0IG9zbF9pbmZvICpkaGRfb3NsX2F0dGFjaCh2b2lkICpwZGV2LCB1aW50IGJ1c3R5cGUpCiB7Ci0JcmV0dXJuIG9zbF9hdHRhY2gocGRldiwgYnVzdHlwZSwgdHJ1ZSk7CisJcmV0dXJuIG9zbF9hdHRhY2gocGRldiwgYnVzdHlwZSk7CiB9CiAKLXZvaWQgZGhkX29zbF9kZXRhY2gob3NsX3QgKm9zaCkKK3ZvaWQgZGhkX29zbF9kZXRhY2goc3RydWN0IG9zbF9pbmZvICpvc2gpCiB7CiAJb3NsX2RldGFjaChvc2gpOwogfQpAQCAtMTg0NSw3ICsxOTIyLDcgQEAKIAlkaGQtPmlmbGlzdFtpZmlkeF0gPSBpZnA7CiAJc3RybGNweShpZnAtPm5hbWUsIG5hbWUsIElGTkFNU0laKTsKIAlpZiAobWFjX2FkZHIgIT0gTlVMTCkKLQkJbWVtY3B5KCZpZnAtPm1hY19hZGRyLCBtYWNfYWRkciwgRVRIRVJfQUREUl9MRU4pOworCQltZW1jcHkoJmlmcC0+bWFjX2FkZHIsIG1hY19hZGRyLCBFVEhfQUxFTik7CiAKIAlpZiAoaGFuZGxlID09IE5VTEwpIHsKIAkJaWZwLT5zdGF0ZSA9IFdMQ19FX0lGX0FERDsKQEAgLTE4NzcsNyArMTk1NCw4IEBACiAJdXAoJmRoZC0+c3lzaW9jX3NlbSk7CiB9CiAKLWRoZF9wdWJfdCAqZGhkX2F0dGFjaChvc2xfdCAqb3NoLCBzdHJ1Y3QgZGhkX2J1cyAqYnVzLCB1aW50IGJ1c19oZHJsZW4pCitkaGRfcHViX3QgKmRoZF9hdHRhY2goc3RydWN0IG9zbF9pbmZvICpvc2gsIHN0cnVjdCBkaGRfYnVzICpidXMsCisJCQl1aW50IGJ1c19oZHJsZW4pCiB7CiAJZGhkX2luZm9fdCAqZGhkID0gTlVMTDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0OwpAQCAtMjE5OSwxOSArMjI3NywxMSBAQAogCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gZGhkX3NldF9tdWx0aWNhc3RfbGlzdAogfTsKIAotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX29wcyBkaGRfb3BzX3ZpcnQgPSB7Ci0JLm5kb19nZXRfc3RhdHMgPSBkaGRfZ2V0X3N0YXRzLAotCS5uZG9fZG9faW9jdGwgPSBkaGRfaW9jdGxfZW50cnksCi0JLm5kb19zdGFydF94bWl0ID0gZGhkX3N0YXJ0X3htaXQsCi0JLm5kb19zZXRfbWFjX2FkZHJlc3MgPSBkaGRfc2V0X21hY19hZGRyZXNzLAotCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gZGhkX3NldF9tdWx0aWNhc3RfbGlzdAotfTsKLQogaW50IGRoZF9uZXRfYXR0YWNoKGRoZF9wdWJfdCAqZGhkcCwgaW50IGlmaWR4KQogewogCWRoZF9pbmZvX3QgKmRoZCA9IChkaGRfaW5mb190ICopIGRoZHAtPmluZm87CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldDsKLQl1OCB0ZW1wX2FkZHJbRVRIRVJfQUREUl9MRU5dID0geworCXU4IHRlbXBfYWRkcltFVEhfQUxFTl0gPSB7CiAJCTB4MDAsIDB4OTAsIDB4NGMsIDB4MTEsIDB4MjIsIDB4MzN9OwogCiAJREhEX1RSQUNFKCgiJXM6IGlmaWR4ICVkXG4iLCBfX2Z1bmNfXywgaWZpZHgpKTsKQEAgLTIyMjksNyArMjI5OSw3IEBACiAJICovCiAJaWYgKGlmaWR4ICE9IDApIHsKIAkJLyogZm9yIHZpcnR1YWwgaW50ZXJmYWNlcyB1c2UgdGhlIHByaW1hcnkgTUFDICAqLwotCQltZW1jcHkodGVtcF9hZGRyLCBkaGQtPnB1Yi5tYWMub2N0ZXQsIEVUSEVSX0FERFJfTEVOKTsKKwkJbWVtY3B5KHRlbXBfYWRkciwgZGhkLT5wdWIubWFjLm9jdGV0LCBFVEhfQUxFTik7CiAKIAl9CiAKQEAgLTIyNTcsNyArMjMyNyw3IEBACiAKIAlkaGQtPnB1Yi5yeHN6ID0gbmV0LT5tdHUgKyBuZXQtPmhhcmRfaGVhZGVyX2xlbiArIGRoZC0+cHViLmhkcmxlbjsKIAotCW1lbWNweShuZXQtPmRldl9hZGRyLCB0ZW1wX2FkZHIsIEVUSEVSX0FERFJfTEVOKTsKKwltZW1jcHkobmV0LT5kZXZfYWRkciwgdGVtcF9hZGRyLCBFVEhfQUxFTik7CiAKIAlpZiAocmVnaXN0ZXJfbmV0ZGV2KG5ldCkgIT0gMCkgewogCQlESERfRVJST1IoKCIlczogY291bGRuJ3QgcmVnaXN0ZXIgdGhlIG5ldCBkZXZpY2VcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9saW51eF9zY2hlZC5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfbGludXhfc2NoZWQuYwppbmRleCBiZjhkZjk4Li5jNjZmMWMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9saW51eF9zY2hlZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2xpbnV4X3NjaGVkLmMKQEAgLTE2LDcgKzE2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4dmVyLmg+CiAKIGludCBzZXRTY2hlZHVsZXIoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgcG9saWN5LCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKnBhcmFtKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfcHJvdG8uaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX3Byb3RvLmgKaW5kZXggY2M0MmZhNC4uYTUzMDllMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfcHJvdG8uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9wcm90by5oCkBAIC00NiwxNSArNDYsMTYgQEAKIC8qIFN0b3AgcHJvdG9jb2w6IHN5bmMgdy9kb25nbGUgc3RhdGUuICovCiBleHRlcm4gdm9pZCBkaGRfcHJvdF9zdG9wKGRoZF9wdWJfdCAqZGhkcCk7CiAKLWV4dGVybiBib29sIGRoZF9wcm90b19mY2luZm8oZGhkX3B1Yl90ICpkaGQsIHZvaWQgKnBrdGJ1ZiwgdTggKmZjYml0cyk7CitleHRlcm4gYm9vbCBkaGRfcHJvdG9fZmNpbmZvKGRoZF9wdWJfdCAqZGhkLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0YnVmLAorCQkJICAgICB1OCAqZmNiaXRzKTsKIAogLyogQWRkIGFueSBwcm90b2NvbC1zcGVjaWZpYyBkYXRhIGhlYWRlci4KICAqIENhbGxlciBtdXN0IHJlc2VydmUgcHJvdF9oZHJsZW4gcHJlcGVuZCBzcGFjZS4KICAqLwotZXh0ZXJuIHZvaWQgZGhkX3Byb3RfaGRycHVzaChkaGRfcHViX3QgKiwgaW50IGlmaWR4LCB2b2lkICp0eHApOworZXh0ZXJuIHZvaWQgZGhkX3Byb3RfaGRycHVzaChkaGRfcHViX3QgKiwgaW50IGlmaWR4LCBzdHJ1Y3Qgc2tfYnVmZiAqdHhwKTsKIAogLyogUmVtb3ZlIGFueSBwcm90b2NvbC1zcGVjaWZpYyBkYXRhIGhlYWRlci4gKi8KLWV4dGVybiBpbnQgZGhkX3Byb3RfaGRycHVsbChkaGRfcHViX3QgKiwgaW50ICppZmlkeCwgdm9pZCAqcnhwKTsKK2V4dGVybiBpbnQgZGhkX3Byb3RfaGRycHVsbChkaGRfcHViX3QgKiwgaW50ICppZmlkeCwgc3RydWN0IHNrX2J1ZmYgKnJ4cCk7CiAKIC8qIFVzZSBwcm90b2NvbCB0byBpc3N1ZSBpb2N0bCB0byBkb25nbGUgKi8KIGV4dGVybiBpbnQgZGhkX3Byb3RfaW9jdGwoZGhkX3B1Yl90ICpkaGQsIGludCBpZmlkeCwgd2xfaW9jdGxfdCAqaW9jLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfc2Rpby5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfc2Rpby5jCmluZGV4IGIyMjgxZDkuLjNlZGNlNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX3NkaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9zZGlvLmMKQEAgLTE2LDYgKzE2LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8YmNtZGVmcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPG9zbC5oPgogI2luY2x1ZGUgPGJjbXNkaC5oPgogCkBAIC0xNDMsNyArMTQ0LDcgQEAKICAqIGJ1ZnBvb2wgd2FzIHByZXNlbnQgZm9yIGdzcGkgYnVzLgogICovCiAjZGVmaW5lIFBLVEZSRUUyKCkJCWlmICgoYnVzLT5idXMgIT0gU1BJX0JVUykgfHwgYnVzLT51c2VidWZwb29sKSBcCi0JCQkJCVBLVEZSRUUoYnVzLT5kaGQtPm9zaCwgcGt0LCBmYWxzZSk7CisJCQkJCQkJcGt0X2J1Zl9mcmVlX3NrYihidXMtPmRoZC0+b3NoLCBwa3QsIGZhbHNlKTsKIERIRF9TUElOV0FJVF9TTEVFUF9JTklUKHNkaW9oX3NwaW53YWl0X3NsZWVwKTsKIGV4dGVybiBpbnQgZGhkY2RjX3NldF9pb2N0bChkaGRfcHViX3QgKmRoZCwgaW50IGlmaWR4LCB1aW50IGNtZCwgdm9pZCAqYnVmLAogCQkJICAgIHVpbnQgbGVuKTsKQEAgLTIwMiw4ICsyMDMsOCBAQAogCXU4IHJ4X3NlcTsJCS8qIFJlY2VpdmUgc2VxdWVuY2UgbnVtYmVyIChleHBlY3RlZCkgKi8KIAlib29sIHJ4c2tpcDsJCS8qIFNraXAgcmVjZWl2ZSAoYXdhaXRpbmcgTkFLIEFDSykgKi8KIAotCXZvaWQgKmdsb21kOwkJLyogUGFja2V0IGNvbnRhaW5pbmcgZ2xvbW1pbmcgZGVzY3JpcHRvciAqLwotCXZvaWQgKmdsb207CQkvKiBQYWNrZXQgY2hhaW4gZm9yIGdsb21tZWQgc3VwZXJmcmFtZSAqLworCXN0cnVjdCBza19idWZmICpnbG9tZDsJLyogUGFja2V0IGNvbnRhaW5pbmcgZ2xvbW1pbmcgZGVzY3JpcHRvciAqLworCXN0cnVjdCBza19idWZmICpnbG9tOwkvKiBQYWNrZXQgY2hhaW4gZm9yIGdsb21tZWQgc3VwZXJmcmFtZSAqLwogCXVpbnQgZ2xvbWVycjsJCS8qIEdsb20gcGFja2V0IHJlYWQgZXJyb3JzICovCiAKIAl1OCAqcnhidWY7CQkvKiBCdWZmZXIgZm9yIHJlY2VpdmluZyBjb250cm9sIHBhY2tldHMgKi8KQEAgLTM1NiwxNiArMzU3LDE2IEBACiAjaWYgZGVmaW5lZChPT0JfSU5UUl9PTkxZKSAmJiBkZWZpbmVkKFNESU9fSVNSX1RIUkVBRCkKICNlcnJvciBPT0JfSU5UUl9PTkxZIGlzIE5PVCB3b3JraW5nIHdpdGggU0RJT19JU1JfVEhSRUFECiAjZW5kaWYJLyogZGVmaW5lZChPT0JfSU5UUl9PTkxZKSAmJiBkZWZpbmVkKFNESU9fSVNSX1RIUkVBRCkgKi8KLSNkZWZpbmUgUEtUQUxJR04ob3NoLCBwLCBsZW4sIGFsaWduKQkJCQkJXAorI2RlZmluZSBQS1RBTElHTihfb3NoLCBfcCwgX2xlbiwgX2FsaWduKQkJCQlcCiAJZG8gewkJCQkJCQkJXAogCQl1aW50IGRhdGFsaWduOwkJCQkJCVwKLQkJZGF0YWxpZ24gPSAodW5zaWduZWQgbG9uZylQS1REQVRBKChwKSk7CQkJXAotCQlkYXRhbGlnbiA9IHJvdW5kdXAoZGF0YWxpZ24sIChhbGlnbikpIC0gZGF0YWxpZ247CVwKLQkJQVNTRVJUKGRhdGFsaWduIDwgKGFsaWduKSk7CQkJCVwKLQkJQVNTRVJUKFBLVExFTigocCkpID49ICgobGVuKSArIGRhdGFsaWduKSk7CVwKKwkJZGF0YWxpZ24gPSAodW5zaWduZWQgbG9uZykoKF9wKS0+ZGF0YSk7CQkJXAorCQlkYXRhbGlnbiA9IHJvdW5kdXAoZGF0YWxpZ24sIChfYWxpZ24pKSAtIGRhdGFsaWduOwlcCisJCUFTU0VSVChkYXRhbGlnbiA8IChfYWxpZ24pKTsJCQkJXAorCQlBU1NFUlQoKF9wKS0+bGVuID49ICgoX2xlbikgKyBkYXRhbGlnbikpOwkJXAogCQlpZiAoZGF0YWxpZ24pCQkJCQkJXAotCQkJUEtUUFVMTCgocCksIGRhdGFsaWduKTsJCQlcCi0JCVBLVFNFVExFTigocCksIChsZW4pKTsJCQkJXAorCQkJc2tiX3B1bGwoKF9wKSwgZGF0YWxpZ24pOwkJCVwKKwkJX19za2JfdHJpbSgoX3ApLCAoX2xlbikpOwkJCQlcCiAJfSB3aGlsZSAoMCkKIAogLyogTGltaXQgb24gcm91bmRpbmcgdXAgZnJhbWVzICovCkBAIC00MzAsMjcgKzQzMSwzMCBAQAogI2VuZGlmCQkJCS8qIERIRF9ERUJVRyAgKi8KIHN0YXRpYyBpbnQgZGhkc2Rpb19kb3dubG9hZF9zdGF0ZShkaGRfYnVzX3QgKmJ1cywgYm9vbCBlbnRlcik7CiAKLXN0YXRpYyB2b2lkIGRoZHNkaW9fcmVsZWFzZShkaGRfYnVzX3QgKmJ1cywgb3NsX3QgKm9zaCk7Ci1zdGF0aWMgdm9pZCBkaGRzZGlvX3JlbGVhc2VfbWFsbG9jKGRoZF9idXNfdCAqYnVzLCBvc2xfdCAqb3NoKTsKK3N0YXRpYyB2b2lkIGRoZHNkaW9fcmVsZWFzZShkaGRfYnVzX3QgKmJ1cywgc3RydWN0IG9zbF9pbmZvICpvc2gpOworc3RhdGljIHZvaWQgZGhkc2Rpb19yZWxlYXNlX21hbGxvYyhkaGRfYnVzX3QgKmJ1cywgc3RydWN0IG9zbF9pbmZvICpvc2gpOwogc3RhdGljIHZvaWQgZGhkc2Rpb19kaXNjb25uZWN0KHZvaWQgKnB0cik7CiBzdGF0aWMgYm9vbCBkaGRzZGlvX2NoaXBtYXRjaCh1MTYgY2hpcGlkKTsKLXN0YXRpYyBib29sIGRoZHNkaW9fcHJvYmVfYXR0YWNoKGRoZF9idXNfdCAqYnVzLCBvc2xfdCAqb3NoLCB2b2lkICpzZGgsCi0JCQkJIHZvaWQgKnJlZ3N2YSwgdTE2IGRldmlkKTsKLXN0YXRpYyBib29sIGRoZHNkaW9fcHJvYmVfbWFsbG9jKGRoZF9idXNfdCAqYnVzLCBvc2xfdCAqb3NoLCB2b2lkICpzZGgpOwotc3RhdGljIGJvb2wgZGhkc2Rpb19wcm9iZV9pbml0KGRoZF9idXNfdCAqYnVzLCBvc2xfdCAqb3NoLCB2b2lkICpzZGgpOwotc3RhdGljIHZvaWQgZGhkc2Rpb19yZWxlYXNlX2RvbmdsZShkaGRfYnVzX3QgKmJ1cywgb3NsX3QgKiBvc2gpOworc3RhdGljIGJvb2wgZGhkc2Rpb19wcm9iZV9hdHRhY2goZGhkX2J1c190ICpidXMsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLAorCQkJCSB2b2lkICpzZGgsIHZvaWQgKnJlZ3N2YSwgdTE2IGRldmlkKTsKK3N0YXRpYyBib29sIGRoZHNkaW9fcHJvYmVfbWFsbG9jKGRoZF9idXNfdCAqYnVzLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwKKwkJCQkgdm9pZCAqc2RoKTsKK3N0YXRpYyBib29sIGRoZHNkaW9fcHJvYmVfaW5pdChkaGRfYnVzX3QgKmJ1cywgc3RydWN0IG9zbF9pbmZvICpvc2gsIHZvaWQgKnNkaCk7CitzdGF0aWMgdm9pZCBkaGRzZGlvX3JlbGVhc2VfZG9uZ2xlKGRoZF9idXNfdCAqYnVzLCBzdHJ1Y3Qgb3NsX2luZm8gKiBvc2gpOwogCiBzdGF0aWMgdWludCBwcm9jZXNzX252cmFtX3ZhcnMoY2hhciAqdmFyYnVmLCB1aW50IGxlbik7CiAKIHN0YXRpYyB2b2lkIGRoZF9kb25nbGVfc2V0bWVtc2l6ZShzdHJ1Y3QgZGhkX2J1cyAqYnVzLCBpbnQgbWVtX3NpemUpOwogc3RhdGljIGludCBkaGRfYmNtc2RoX3JlY3ZfYnVmKGRoZF9idXNfdCAqYnVzLCB1MzIgYWRkciwgdWludCBmbiwKLQkJCSAgICAgICB1aW50IGZsYWdzLCB1OCAqYnVmLCB1aW50IG5ieXRlcywgdm9pZCAqcGt0LAotCQkJICAgICAgIGJjbXNkaF9jbXBsdF9mbl90IGNvbXBsZXRlLCB2b2lkICpoYW5kbGUpOworCQkJICAgICAgIHVpbnQgZmxhZ3MsIHU4ICpidWYsIHVpbnQgbmJ5dGVzLAorCQkJICAgICAgIHN0cnVjdCBza19idWZmICpwa3QsIGJjbXNkaF9jbXBsdF9mbl90IGNvbXBsZXRlLAorCQkJICAgICAgIHZvaWQgKmhhbmRsZSk7CiBzdGF0aWMgaW50IGRoZF9iY21zZGhfc2VuZF9idWYoZGhkX2J1c190ICpidXMsIHUzMiBhZGRyLCB1aW50IGZuLAotCQkJICAgICAgIHVpbnQgZmxhZ3MsIHU4ICpidWYsIHVpbnQgbmJ5dGVzLCB2b2lkICpwa3QsCi0JCQkgICAgICAgYmNtc2RoX2NtcGx0X2ZuX3QgY29tcGxldGUsIHZvaWQgKmhhbmRsZSk7CisJCQkgICAgICAgdWludCBmbGFncywgdTggKmJ1ZiwgdWludCBuYnl0ZXMsCisJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnBrdCwgYmNtc2RoX2NtcGx0X2ZuX3QgY29tcGxldGUsCisJCQkgICAgICAgdm9pZCAqaGFuZGxlKTsKIAotc3RhdGljIGJvb2wgZGhkc2Rpb19kb3dubG9hZF9maXJtd2FyZShzdHJ1Y3QgZGhkX2J1cyAqYnVzLCBvc2xfdCAqb3NoLAorc3RhdGljIGJvb2wgZGhkc2Rpb19kb3dubG9hZF9maXJtd2FyZShzdHJ1Y3QgZGhkX2J1cyAqYnVzLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwKIAkJCQkgICAgICB2b2lkICpzZGgpOwogc3RhdGljIGludCBfZGhkc2Rpb19kb3dubG9hZF9maXJtd2FyZShzdHJ1Y3QgZGhkX2J1cyAqYnVzKTsKIApAQCAtOTAwLDE2ICs5MDQsMTcgQEAKIAogLyogV3JpdGVzIGEgSFcvU1cgaGVhZGVyIGludG8gdGhlIHBhY2tldCBhbmQgc2VuZHMgaXQuICovCiAvKiBBc3N1bWVzOiAoYSkgaGVhZGVyIHNwYWNlIGFscmVhZHkgdGhlcmUsIChiKSBjYWxsZXIgaG9sZHMgbG9jayAqLwotc3RhdGljIGludCBkaGRzZGlvX3R4cGt0KGRoZF9idXNfdCAqYnVzLCB2b2lkICpwa3QsIHVpbnQgY2hhbiwgYm9vbCBmcmVlX3BrdCkKK3N0YXRpYyBpbnQgZGhkc2Rpb190eHBrdChkaGRfYnVzX3QgKmJ1cywgc3RydWN0IHNrX2J1ZmYgKnBrdCwgdWludCBjaGFuLAorCQkJIGJvb2wgZnJlZV9wa3QpCiB7CiAJaW50IHJldDsKLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCXU4ICpmcmFtZTsKIAl1MTYgbGVuLCBwYWQgPSAwOwogCXUzMiBzd2hlYWRlcjsKIAl1aW50IHJldHJpZXMgPSAwOwogCWJjbXNkaF9pbmZvX3QgKnNkaDsKLQl2b2lkICpuZXc7CisJc3RydWN0IHNrX2J1ZmYgKm5ldzsKIAlpbnQgaTsKIAogCURIRF9UUkFDRSgoIiVzOiBFbnRlclxuIiwgX19mdW5jX18pKTsKQEAgLTkyMiw0NiArOTI3LDQ2IEBACiAJCWdvdG8gZG9uZTsKIAl9CiAKLQlmcmFtZSA9ICh1OCAqKSBQS1REQVRBKHBrdCk7CisJZnJhbWUgPSAodTggKikgKHBrdC0+ZGF0YSk7CiAKIAkvKiBBZGQgYWxpZ25tZW50IHBhZGRpbmcsIGFsbG9jYXRlIG5ldyBwYWNrZXQgaWYgbmVlZGVkICovCiAJcGFkID0gKCh1bnNpZ25lZCBsb25nKWZyYW1lICUgREhEX1NEQUxJR04pOwogCWlmIChwYWQpIHsKLQkJaWYgKFBLVEhFQURST09NKHBrdCkgPCBwYWQpIHsKKwkJaWYgKHNrYl9oZWFkcm9vbShwa3QpIDwgcGFkKSB7CiAJCQlESERfSU5GTygoIiVzOiBpbnN1ZmZpY2llbnQgaGVhZHJvb20gJWQgZm9yICVkIHBhZFxuIiwKLQkJCQkgIF9fZnVuY19fLCAoaW50KVBLVEhFQURST09NKHBrdCksIHBhZCkpOworCQkJCSAgX19mdW5jX18sIHNrYl9oZWFkcm9vbShwa3QpLCBwYWQpKTsKIAkJCWJ1cy0+ZGhkLT50eF9yZWFsbG9jKys7Ci0JCQluZXcgPSBQS1RHRVQob3NoLCAoUEtUTEVOKHBrdCkgKyBESERfU0RBTElHTiksIHRydWUpOworCQkJbmV3ID0gcGt0X2J1Zl9nZXRfc2tiKG9zaCwgKHBrdC0+bGVuICsgREhEX1NEQUxJR04pKTsKIAkJCWlmICghbmV3KSB7CiAJCQkJREhEX0VSUk9SKCgiJXM6IGNvdWxkbid0IGFsbG9jYXRlIG5ldyAlZC1ieXRlICIKIAkJCQkJInBhY2tldFxuIiwKLQkJCQkJX19mdW5jX18sIFBLVExFTihwa3QpICsgREhEX1NEQUxJR04pKTsKKwkJCQkJX19mdW5jX18sIHBrdC0+bGVuICsgREhEX1NEQUxJR04pKTsKIAkJCQlyZXQgPSBCQ01FX05PTUVNOwogCQkJCWdvdG8gZG9uZTsKIAkJCX0KIAotCQkJUEtUQUxJR04ob3NoLCBuZXcsIFBLVExFTihwa3QpLCBESERfU0RBTElHTik7Ci0JCQliY29weShQS1REQVRBKHBrdCksIFBLVERBVEEobmV3KSwgUEtUTEVOKHBrdCkpOworCQkJUEtUQUxJR04ob3NoLCBuZXcsIHBrdC0+bGVuLCBESERfU0RBTElHTik7CisJCQliY29weShwa3QtPmRhdGEsIG5ldy0+ZGF0YSwgcGt0LT5sZW4pOwogCQkJaWYgKGZyZWVfcGt0KQotCQkJCVBLVEZSRUUob3NoLCBwa3QsIHRydWUpOworCQkJCXBrdF9idWZfZnJlZV9za2Iob3NoLCBwa3QsIHRydWUpOwogCQkJLyogZnJlZSB0aGUgcGt0IGlmIGNhbm5lZCBvbmUgaXMgbm90IHVzZWQgKi8KIAkJCWZyZWVfcGt0ID0gdHJ1ZTsKIAkJCXBrdCA9IG5ldzsKLQkJCWZyYW1lID0gKHU4ICopIFBLVERBVEEocGt0KTsKKwkJCWZyYW1lID0gKHU4ICopIChwa3QtPmRhdGEpOwogCQkJQVNTRVJUKCgodW5zaWduZWQgbG9uZylmcmFtZSAlIERIRF9TREFMSUdOKSA9PSAwKTsKIAkJCXBhZCA9IDA7CiAJCX0gZWxzZSB7Ci0JCQlQS1RQVVNIKHBrdCwgcGFkKTsKLQkJCWZyYW1lID0gKHU4ICopIFBLVERBVEEocGt0KTsKKwkJCXNrYl9wdXNoKHBrdCwgcGFkKTsKKwkJCWZyYW1lID0gKHU4ICopIChwa3QtPmRhdGEpOwogCi0JCQlBU1NFUlQoKHBhZCArIFNEUENNX0hEUkxFTikgPD0gKGludClQS1RMRU4ocGt0KSk7Ci0JCQliemVybyhmcmFtZSwgcGFkICsgU0RQQ01fSERSTEVOKTsKKwkJCUFTU0VSVCgocGFkICsgU0RQQ01fSERSTEVOKSA8PSAoaW50KShwa3QtPmxlbikpOworCQkJbWVtc2V0KGZyYW1lLCAwLCBwYWQgKyBTRFBDTV9IRFJMRU4pOwogCQl9CiAJfQogCUFTU0VSVChwYWQgPCBESERfU0RBTElHTik7CiAKIAkvKiBIYXJkd2FyZSB0YWc6IDIgYnl0ZSBsZW4gZm9sbG93ZWQgYnkgMiBieXRlIH5sZW4gY2hlY2sgKGFsbCBMRSkgKi8KLQlsZW4gPSAodTE2KSBQS1RMRU4ocGt0KTsKKwlsZW4gPSAodTE2KSAocGt0LT5sZW4pOwogCSoodTE2ICopIGZyYW1lID0gaHRvbDE2KGxlbik7CiAJKigoKHUxNiAqKSBmcmFtZSkgKyAxKSA9IGh0b2wxNih+bGVuKTsKIApAQCAtOTc0LDcgKzk3OSw3IEBACiAJaHRvbDMyX3VhX3N0b3JlKDAsIGZyYW1lICsgU0RQQ01fRlJBTUVUQUdfTEVOICsgc2l6ZW9mKHN3aGVhZGVyKSk7CiAKICNpZmRlZiBESERfREVCVUcKLQl0eF9wYWNrZXRzW1BLVFBSSU8ocGt0KV0rKzsKKwl0eF9wYWNrZXRzW3BrdC0+cHJpb3JpdHldKys7CiAJaWYgKERIRF9CWVRFU19PTigpICYmCiAJICAgICgoKERIRF9DVExfT04oKSAmJiAoY2hhbiA9PSBTRFBDTV9DT05UUk9MX0NIQU5ORUwpKSB8fAogCSAgICAgIChESERfREFUQV9PTigpICYmIChjaGFuICE9IFNEUENNX0NPTlRST0xfQ0hBTk5FTCkpKSkpIHsKQEAgLTk4OSw3ICs5OTQsNyBAQAogCQl1MTYgcGFkID0gYnVzLT5ibG9ja3NpemUgLSAobGVuICUgYnVzLT5ibG9ja3NpemUpOwogCQlpZiAoKHBhZCA8PSBidXMtPnJvdW5kdXApICYmIChwYWQgPCBidXMtPmJsb2Nrc2l6ZSkpCiAjaWZkZWYgTk9UVVNFRAotCQkJaWYgKHBhZCA8PSBQS1RUQUlMUk9PTShwa3QpKQorCQkJaWYgKHBhZCA8PSBza2JfdGFpbHJvb20ocGt0KSkKICNlbmRpZgkJCQkvKiBOT1RVU0VEICovCiAJCQkJbGVuICs9IHBhZDsKIAl9IGVsc2UgaWYgKGxlbiAlIERIRF9TREFMSUdOKSB7CkBAIC05OTksNyArMTAwNCw3IEBACiAJLyogU29tZSBjb250cm9sbGVycyBoYXZlIHRyb3VibGUgd2l0aCBvZGQgYnl0ZXMgLS0gcm91bmQgdG8gZXZlbiAqLwogCWlmIChmb3JjZWFsaWduICYmIChsZW4gJiAoQUxJR05NRU5UIC0gMSkpKSB7CiAjaWZkZWYgTk9UVVNFRAotCQlpZiAoUEtUVEFJTFJPT00ocGt0KSkKKwkJaWYgKHNrYl90YWlscm9vbShwa3QpKQogI2VuZGlmCiAJCQlsZW4gPSByb3VuZHVwKGxlbiwgQUxJR05NRU5UKTsKICNpZmRlZiBOT1RVU0VECkBAIC0xMDUwLDM0ICsxMDU1LDM0IEBACiAKIGRvbmU6CiAJLyogcmVzdG9yZSBwa3QgYnVmZmVyIHBvaW50ZXIgYmVmb3JlIGNhbGxpbmcgdHggY29tcGxldGUgcm91dGluZSAqLwotCVBLVFBVTEwocGt0LCBTRFBDTV9IRFJMRU4gKyBwYWQpOworCXNrYl9wdWxsKHBrdCwgU0RQQ01fSERSTEVOICsgcGFkKTsKIAlkaGRfb3Nfc2R1bmxvY2soYnVzLT5kaGQpOwogCWRoZF90eGNvbXBsZXRlKGJ1cy0+ZGhkLCBwa3QsIHJldCAhPSAwKTsKIAlkaGRfb3Nfc2Rsb2NrKGJ1cy0+ZGhkKTsKIAogCWlmIChmcmVlX3BrdCkKLQkJUEtURlJFRShvc2gsIHBrdCwgdHJ1ZSk7CisJCXBrdF9idWZfZnJlZV9za2Iob3NoLCBwa3QsIHRydWUpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGRoZF9idXNfdHhkYXRhKHN0cnVjdCBkaGRfYnVzICpidXMsIHZvaWQgKnBrdCkKK2ludCBkaGRfYnVzX3R4ZGF0YShzdHJ1Y3QgZGhkX2J1cyAqYnVzLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0KQogewogCWludCByZXQgPSBCQ01FX0VSUk9SOwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAJdWludCBkYXRhbGVuLCBwcmVjOwogCiAJREhEX1RSQUNFKCgiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXykpOwogCiAJb3NoID0gYnVzLT5kaGQtPm9zaDsKLQlkYXRhbGVuID0gUEtUTEVOKHBrdCk7CisJZGF0YWxlbiA9IHBrdC0+bGVuOwogCiAjaWZkZWYgU0RURVNUCiAJLyogUHVzaCB0aGUgdGVzdCBoZWFkZXIgaWYgZG9pbmcgbG9vcGJhY2sgKi8KIAlpZiAoYnVzLT5leHRfbG9vcCkgewogCQl1OCAqZGF0YTsKLQkJUEtUUFVTSChwa3QsIFNEUENNX1RFU1RfSERSTEVOKTsKLQkJZGF0YSA9IFBLVERBVEEocGt0KTsKKwkJc2tiX3B1c2gocGt0LCBTRFBDTV9URVNUX0hEUkxFTik7CisJCWRhdGEgPSBwa3QtPmRhdGE7CiAJCSpkYXRhKysgPSBTRFBDTV9URVNUX0VDSE9SRVE7CiAJCSpkYXRhKysgPSAodTgpIGJ1cy0+bG9vcGlkKys7CiAJCSpkYXRhKysgPSAoZGF0YWxlbiA+PiAwKTsKQEAgLTEwODcsMTAgKzEwOTIsMTAgQEAKICNlbmRpZgkJCQkvKiBTRFRFU1QgKi8KIAogCS8qIEFkZCBzcGFjZSBmb3IgdGhlIGhlYWRlciAqLwotCVBLVFBVU0gocGt0LCBTRFBDTV9IRFJMRU4pOwotCUFTU0VSVChJU19BTElHTkVEKCh1bnNpZ25lZCBsb25nKVBLVERBVEEocGt0KSwgMikpOworCXNrYl9wdXNoKHBrdCwgU0RQQ01fSERSTEVOKTsKKwlBU1NFUlQoSVNfQUxJR05FRCgodW5zaWduZWQgbG9uZykocGt0LT5kYXRhKSwgMikpOwogCi0JcHJlYyA9IFBSSU8yUFJFQygoUEtUUFJJTyhwa3QpICYgUFJJT01BU0spKTsKKwlwcmVjID0gUFJJTzJQUkVDKChwa3QtPnByaW9yaXR5ICYgUFJJT01BU0spKTsKIAogCS8qIENoZWNrIGZvciBleGlzdGluZyBxdWV1ZSwgY3VycmVudCBmbG93LWNvbnRyb2wsCiAJCQkgcGVuZGluZyBldmVudCwgb3IgcGVuZGluZyBjbG9jayAqLwpAQCAtMTEwNSw5ICsxMTEwLDkgQEAKIAkJLyogUHJpb3JpdHkgYmFzZWQgZW5xICovCiAJCWRoZF9vc19zZGxvY2tfdHhxKGJ1cy0+ZGhkKTsKIAkJaWYgKGRoZF9wcmVjX2VucShidXMtPmRoZCwgJmJ1cy0+dHhxLCBwa3QsIHByZWMpID09IGZhbHNlKSB7Ci0JCQlQS1RQVUxMKHBrdCwgU0RQQ01fSERSTEVOKTsKKwkJCXNrYl9wdWxsKHBrdCwgU0RQQ01fSERSTEVOKTsKIAkJCWRoZF90eGNvbXBsZXRlKGJ1cy0+ZGhkLCBwa3QsIGZhbHNlKTsKLQkJCVBLVEZSRUUob3NoLCBwa3QsIHRydWUpOworCQkJcGt0X2J1Zl9mcmVlX3NrYihvc2gsIHBrdCwgdHJ1ZSk7CiAJCQlESERfRVJST1IoKCIlczogb3V0IG9mIGJ1cy0+dHhxICEhIVxuIiwgX19mdW5jX18pKTsKIAkJCXJldCA9IEJDTUVfTk9SRVNPVVJDRTsKIAkJfSBlbHNlIHsKQEAgLTExNjIsNyArMTE2Nyw3IEBACiAKIHN0YXRpYyB1aW50IGRoZHNkaW9fc2VuZGZyb21xKGRoZF9idXNfdCAqYnVzLCB1aW50IG1heGZyYW1lcykKIHsKLQl2b2lkICpwa3Q7CisJc3RydWN0IHNrX2J1ZmYgKnBrdDsKIAl1MzIgaW50c3RhdHVzID0gMDsKIAl1aW50IHJldHJpZXMgPSAwOwogCWludCByZXQgPSAwLCBwcmVjX291dDsKQEAgLTExODYsNyArMTE5MSw3IEBACiAJCQlicmVhazsKIAkJfQogCQlkaGRfb3Nfc2R1bmxvY2tfdHhxKGJ1cy0+ZGhkKTsKLQkJZGF0YWxlbiA9IFBLVExFTihwa3QpIC0gU0RQQ01fSERSTEVOOworCQlkYXRhbGVuID0gcGt0LT5sZW4gLSBTRFBDTV9IRFJMRU47CiAKICNpZm5kZWYgU0RURVNUCiAJCXJldCA9IGRoZHNkaW9fdHhwa3QoYnVzLCBwa3QsIFNEUENNX0RBVEFfQ0hBTk5FTCwgdHJ1ZSk7CkBAIC0xMjQ3LDcgKzEyNTIsNyBAQAogCQkJZnJhbWUgLT0gZG9mZjsKIAkJCWxlbiArPSBkb2ZmOwogCQkJbXNnbGVuICs9IGRvZmY7Ci0JCQliemVybyhmcmFtZSwgZG9mZiArIFNEUENNX0hEUkxFTik7CisJCQltZW1zZXQoZnJhbWUsIDAsIGRvZmYgKyBTRFBDTV9IRFJMRU4pOwogCQl9CiAJCUFTU0VSVChkb2ZmIDwgREhEX1NEQUxJR04pOwogCX0KQEAgLTI1MzEsNyArMjUzNiw3IEBACiAJCWlmICghdmJ1ZmZlcikKIAkJCXJldHVybiBCQ01FX05PTUVNOwogCi0JCWJ6ZXJvKHZidWZmZXIsIHZhcnNpemUpOworCQltZW1zZXQodmJ1ZmZlciwgMCwgdmFyc2l6ZSk7CiAJCWJjb3B5KGJ1cy0+dmFycywgdmJ1ZmZlciwgYnVzLT52YXJzeik7CiAKIAkJLyogV3JpdGUgdGhlIHZhcnMgbGlzdCAqLwpAQCAtMjgyMyw3ICsyODI4LDcgQEAKIAogdm9pZCBkaGRfYnVzX3N0b3Aoc3RydWN0IGRoZF9idXMgKmJ1cywgYm9vbCBlbmZvcmNlX211dGV4KQogewotCW9zbF90ICpvc2ggPSBidXMtPmRoZC0+b3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoID0gYnVzLT5kaGQtPm9zaDsKIAl1MzIgbG9jYWxfaG9zdGludG1hc2s7CiAJdTggc2F2ZWNsazsKIAl1aW50IHJldHJpZXM7CkBAIC0yODc3LDEwICsyODgyLDEwIEBACiAKIAkvKiBDbGVhciBhbnkgaGVsZCBnbG9tbWluZyBzdHVmZiAqLwogCWlmIChidXMtPmdsb21kKQotCQlQS1RGUkVFKG9zaCwgYnVzLT5nbG9tZCwgZmFsc2UpOworCQlwa3RfYnVmX2ZyZWVfc2tiKG9zaCwgYnVzLT5nbG9tZCwgZmFsc2UpOwogCiAJaWYgKGJ1cy0+Z2xvbSkKLQkJUEtURlJFRShvc2gsIGJ1cy0+Z2xvbSwgZmFsc2UpOworCQlwa3RfYnVmX2ZyZWVfc2tiKG9zaCwgYnVzLT5nbG9tLCBmYWxzZSk7CiAKIAlidXMtPmdsb20gPSBidXMtPmdsb21kID0gTlVMTDsKIApAQCAtMzE3OCw4ICszMTgzLDggQEAKIAl1OCAqZHB0ciwgbnVtID0gMDsKIAogCXUxNiBzdWJsZW4sIGNoZWNrOwotCXZvaWQgKnBmaXJzdCwgKnBsYXN0LCAqcG5leHQsICpzYXZlX3BmaXJzdDsKLQlvc2xfdCAqb3NoID0gYnVzLT5kaGQtPm9zaDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcGZpcnN0LCAqcGxhc3QsICpwbmV4dCwgKnNhdmVfcGZpcnN0OworCXN0cnVjdCBvc2xfaW5mbyAqb3NoID0gYnVzLT5kaGQtPm9zaDsKIAogCWludCBlcnJjb2RlOwogCXU4IGNoYW4sIHNlcSwgZG9mZiwgc2Zkb2ZmOwpAQCAtMzE5OSw4ICszMjA0LDggQEAKIAkJZGhkX29zX3NkbG9ja19yeHEoYnVzLT5kaGQpOwogCiAJCXBmaXJzdCA9IHBsYXN0ID0gcG5leHQgPSBOVUxMOwotCQlkbGVuID0gKHUxNikgUEtUTEVOKGJ1cy0+Z2xvbWQpOwotCQlkcHRyID0gUEtUREFUQShidXMtPmdsb21kKTsKKwkJZGxlbiA9ICh1MTYpIChidXMtPmdsb21kLT5sZW4pOworCQlkcHRyID0gYnVzLT5nbG9tZC0+ZGF0YTsKIAkJaWYgKCFkbGVuIHx8IChkbGVuICYgMSkpIHsKIAkJCURIRF9FUlJPUigoIiVzOiBiYWQgZ2xvbWQgbGVuKCVkKSwgaWdub3JlIGRlc2NyaXB0b3JcbiIsCiAJCQlfX2Z1bmNfXywgZGxlbikpOwpAQCAtMzIzNSwxOSArMzI0MCwxOSBAQAogCQkJfQogCiAJCQkvKiBBbGxvY2F0ZS9jaGFpbiBwYWNrZXQgZm9yIG5leHQgc3ViZnJhbWUgKi8KLQkJCXBuZXh0ID0gUEtUR0VUKG9zaCwgc3VibGVuICsgREhEX1NEQUxJR04sIGZhbHNlKTsKKwkJCXBuZXh0ID0gcGt0X2J1Zl9nZXRfc2tiKG9zaCwgc3VibGVuICsgREhEX1NEQUxJR04pOwogCQkJaWYgKHBuZXh0ID09IE5VTEwpIHsKLQkJCQlESERfRVJST1IoKCIlczogUEtUR0VUIGZhaWxlZCwgbnVtICVkIGxlbiAlZFxuIiwKKwkJCQlESERfRVJST1IoKCIlczogcGt0X2J1Zl9nZXRfc2tiIGZhaWxlZCwgbnVtICVkIGxlbiAlZFxuIiwKIAkJCQkJICAgX19mdW5jX18sIG51bSwgc3VibGVuKSk7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCQlBU1NFUlQoIVBLVExJTksocG5leHQpKTsKKwkJCUFTU0VSVCghKHBuZXh0LT5wcmV2KSk7CiAJCQlpZiAoIXBmaXJzdCkgewogCQkJCUFTU0VSVCghcGxhc3QpOwogCQkJCXBmaXJzdCA9IHBsYXN0ID0gcG5leHQ7CiAJCQl9IGVsc2UgewogCQkJCUFTU0VSVChwbGFzdCk7Ci0JCQkJUEtUU0VUTkVYVChwbGFzdCwgcG5leHQpOworCQkJCXBsYXN0LT5uZXh0ID0gcG5leHQ7CiAJCQkJcGxhc3QgPSBwbmV4dDsKIAkJCX0KIApAQCAtMzI3MSwxMyArMzI3NiwxMyBAQAogCQkJcGZpcnN0ID0gcG5leHQgPSBOVUxMOwogCQl9IGVsc2UgewogCQkJaWYgKHBmaXJzdCkKLQkJCQlQS1RGUkVFKG9zaCwgcGZpcnN0LCBmYWxzZSk7CisJCQkJcGt0X2J1Zl9mcmVlX3NrYihvc2gsIHBmaXJzdCwgZmFsc2UpOwogCQkJYnVzLT5nbG9tID0gTlVMTDsKIAkJCW51bSA9IDA7CiAJCX0KIAogCQkvKiBEb25lIHdpdGggZGVzY3JpcHRvciBwYWNrZXQgKi8KLQkJUEtURlJFRShvc2gsIGJ1cy0+Z2xvbWQsIGZhbHNlKTsKKwkJcGt0X2J1Zl9mcmVlX3NrYihvc2gsIGJ1cy0+Z2xvbWQsIGZhbHNlKTsKIAkJYnVzLT5nbG9tZCA9IE5VTEw7CiAJCWJ1cy0+bmV4dGxlbiA9IDA7CiAKQEAgLTMyOTAsMTAgKzMyOTUsMTAgQEAKIAkJaWYgKERIRF9HTE9NX09OKCkpIHsKIAkJCURIRF9HTE9NKCgiJXM6IHRyeSBzdXBlcmZyYW1lIHJlYWQsIHBhY2tldCBjaGFpbjpcbiIsCiAJCQkJX19mdW5jX18pKTsKLQkJCWZvciAocG5leHQgPSBidXMtPmdsb207IHBuZXh0OyBwbmV4dCA9IFBLVE5FWFQocG5leHQpKSB7CisJCQlmb3IgKHBuZXh0ID0gYnVzLT5nbG9tOyBwbmV4dDsgcG5leHQgPSBwbmV4dC0+bmV4dCkgewogCQkJCURIRF9HTE9NKCgiICAgICVwOiAlcCBsZW4gMHglMDR4ICglZClcbiIsCi0JCQkJCSAgcG5leHQsICh1OCAqKSBQS1REQVRBKHBuZXh0KSwKLQkJCQkJICBQS1RMRU4ocG5leHQpLCBQS1RMRU4ocG5leHQpKSk7CisJCQkJCSAgcG5leHQsICh1OCAqKSAocG5leHQtPmRhdGEpLAorCQkJCQkgIHBuZXh0LT5sZW4sIHBuZXh0LT5sZW4pKTsKIAkJCX0KIAkJfQogCkBAIC0zMzA5LDcgKzMzMTQsNyBAQAogCQkJCQkJICAgICAgYmNtc2RoX2N1cl9zYndhZAogCQkJCQkJICAgICAgKGJ1cy0+c2RoKSwgU0RJT19GVU5DXzIsCiAJCQkJCQkgICAgICBGMlNZTkMsCi0JCQkJCQkgICAgICAodTggKikgUEtUREFUQShwZmlyc3QpLAorCQkJCQkJICAgICAgKHU4ICopIHBmaXJzdC0+ZGF0YSwKIAkJCQkJCSAgICAgIGRsZW4sIHBmaXJzdCwgTlVMTCwgTlVMTCk7CiAJCX0gZWxzZSBpZiAoYnVzLT5kYXRhcHRyKSB7CiAJCQllcnJjb2RlID0gZGhkX2JjbXNkaF9yZWN2X2J1ZihidXMsCkBAIC0zMzQ2LDcgKzMzNTEsNyBAQAogCQkJCWJ1cy0+Z2xvbWVyciA9IDA7CiAJCQkJZGhkc2Rpb19yeGZhaWwoYnVzLCB0cnVlLCBmYWxzZSk7CiAJCQkJZGhkX29zX3NkbG9ja19yeHEoYnVzLT5kaGQpOwotCQkJCVBLVEZSRUUob3NoLCBidXMtPmdsb20sIGZhbHNlKTsKKwkJCQlwa3RfYnVmX2ZyZWVfc2tiKG9zaCwgYnVzLT5nbG9tLCBmYWxzZSk7CiAJCQkJZGhkX29zX3NkdW5sb2NrX3J4cShidXMtPmRoZCk7CiAJCQkJYnVzLT5yeGdsb21mYWlsKys7CiAJCQkJYnVzLT5nbG9tID0gTlVMTDsKQEAgLTMzNTUsMTMgKzMzNjAsMTMgQEAKIAkJfQogI2lmZGVmIERIRF9ERUJVRwogCQlpZiAoREhEX0dMT01fT04oKSkgewotCQkJcHJoZXgoIlNVUEVSRlJBTUUiLCBQS1REQVRBKHBmaXJzdCksCi0JCQkgICAgICBtaW5fdChpbnQsIFBLVExFTihwZmlyc3QpLCA0OCkpOworCQkJcHJoZXgoIlNVUEVSRlJBTUUiLCBwZmlyc3QtPmRhdGEsCisJCQkgICAgICBtaW5fdChpbnQsIHBmaXJzdC0+bGVuLCA0OCkpOwogCQl9CiAjZW5kaWYKIAogCQkvKiBWYWxpZGF0ZSB0aGUgc3VwZXJmcmFtZSBoZWFkZXIgKi8KLQkJZHB0ciA9ICh1OCAqKSBQS1REQVRBKHBmaXJzdCk7CisJCWRwdHIgPSAodTggKikgKHBmaXJzdC0+ZGF0YSk7CiAJCXN1YmxlbiA9IGx0b2gxNl91YShkcHRyKTsKIAkJY2hlY2sgPSBsdG9oMTZfdWEoZHB0ciArIHNpemVvZih1MTYpKTsKIApAQCAtMzM5OSwxMSArMzQwNCwxMSBAQAogCQkJCSAgIF9fZnVuY19fKSk7CiAJCQllcnJjb2RlID0gLTE7CiAJCX0gZWxzZSBpZiAoKGRvZmYgPCBTRFBDTV9IRFJMRU4pIHx8Ci0JCQkgICAoZG9mZiA+IChQS1RMRU4ocGZpcnN0KSAtIFNEUENNX0hEUkxFTikpKSB7CisJCQkgICAoZG9mZiA+IChwZmlyc3QtPmxlbiAtIFNEUENNX0hEUkxFTikpKSB7CiAJCQlESERfRVJST1IoKCIlcyAoc3VwZXJmcmFtZSk6IEJhZCBkYXRhIG9mZnNldCAlZDogSFcgJWQgIgogCQkJCSJwa3QgJWQgbWluICVkXG4iLAogCQkJCV9fZnVuY19fLCBkb2ZmLCBzdWJsZW4sCi0JCQkJUEtUTEVOKHBmaXJzdCksIFNEUENNX0hEUkxFTikpOworCQkJCXBmaXJzdC0+bGVuLCBTRFBDTV9IRFJMRU4pKTsKIAkJCWVycmNvZGUgPSAtMTsKIAkJfQogCkBAIC0zNDI0LDE0ICszNDI5LDE0IEBACiAJCWJ1cy0+dHhfbWF4ID0gdHhtYXg7CiAKIAkJLyogUmVtb3ZlIHN1cGVyZnJhbWUgaGVhZGVyLCByZW1lbWJlciBvZmZzZXQgKi8KLQkJUEtUUFVMTChwZmlyc3QsIGRvZmYpOworCQlza2JfcHVsbChwZmlyc3QsIGRvZmYpOwogCQlzZmRvZmYgPSBkb2ZmOwogCiAJCS8qIFZhbGlkYXRlIGFsbCB0aGUgc3ViZnJhbWUgaGVhZGVycyAqLwogCQlmb3IgKG51bSA9IDAsIHBuZXh0ID0gcGZpcnN0OyBwbmV4dCAmJiAhZXJyY29kZTsKLQkJICAgICBudW0rKywgcG5leHQgPSBQS1RORVhUKHBuZXh0KSkgewotCQkJZHB0ciA9ICh1OCAqKSBQS1REQVRBKHBuZXh0KTsKLQkJCWRsZW4gPSAodTE2KSBQS1RMRU4ocG5leHQpOworCQkgICAgIG51bSsrLCBwbmV4dCA9IHBuZXh0LT5uZXh0KSB7CisJCQlkcHRyID0gKHU4ICopIChwbmV4dC0+ZGF0YSk7CisJCQlkbGVuID0gKHUxNikgKHBuZXh0LT5sZW4pOwogCQkJc3VibGVuID0gbHRvaDE2X3VhKGRwdHIpOwogCQkJY2hlY2sgPSBsdG9oMTZfdWEoZHB0ciArIHNpemVvZih1MTYpKTsKIAkJCWNoYW4gPSBTRFBDTV9QQUNLRVRfQ0hBTk5FTCgmZHB0cltTRFBDTV9GUkFNRVRBR19MRU5dKTsKQEAgLTM0NjksMTMgKzM0NzQsMTMgQEAKIAkJCQkgYSBjb3VwbGUgcmV0cmllcyAqLwogCQkJaWYgKGJ1cy0+Z2xvbWVycisrIDwgMykgewogCQkJCS8qIFJlc3RvcmUgc3VwZXJmcmFtZSBoZWFkZXIgc3BhY2UgKi8KLQkJCQlQS1RQVVNIKHBmaXJzdCwgc2Zkb2ZmKTsKKwkJCQlza2JfcHVzaChwZmlyc3QsIHNmZG9mZik7CiAJCQkJZGhkc2Rpb19yeGZhaWwoYnVzLCB0cnVlLCB0cnVlKTsKIAkJCX0gZWxzZSB7CiAJCQkJYnVzLT5nbG9tZXJyID0gMDsKIAkJCQlkaGRzZGlvX3J4ZmFpbChidXMsIHRydWUsIGZhbHNlKTsKIAkJCQlkaGRfb3Nfc2Rsb2NrX3J4cShidXMtPmRoZCk7Ci0JCQkJUEtURlJFRShvc2gsIGJ1cy0+Z2xvbSwgZmFsc2UpOworCQkJCXBrdF9idWZfZnJlZV9za2Iob3NoLCBidXMtPmdsb20sIGZhbHNlKTsKIAkJCQlkaGRfb3Nfc2R1bmxvY2tfcnhxKGJ1cy0+ZGhkKTsKIAkJCQlidXMtPnJ4Z2xvbWZhaWwrKzsKIAkJCQlidXMtPmdsb20gPSBOVUxMOwpAQCAtMzQ5MSwxMCArMzQ5NiwxMCBAQAogCiAJCWRoZF9vc19zZGxvY2tfcnhxKGJ1cy0+ZGhkKTsKIAkJZm9yIChudW0gPSAwOyBwZmlyc3Q7IHJ4c2VxKyssIHBmaXJzdCA9IHBuZXh0KSB7Ci0JCQlwbmV4dCA9IFBLVE5FWFQocGZpcnN0KTsKLQkJCVBLVFNFVE5FWFQocGZpcnN0LCBOVUxMKTsKKwkJCXBuZXh0ID0gcGZpcnN0LT5uZXh0OworCQkJcGZpcnN0LT5uZXh0ID0gTlVMTDsKIAotCQkJZHB0ciA9ICh1OCAqKSBQS1REQVRBKHBmaXJzdCk7CisJCQlkcHRyID0gKHU4ICopIChwZmlyc3QtPmRhdGEpOwogCQkJc3VibGVuID0gbHRvaDE2X3VhKGRwdHIpOwogCQkJY2hhbiA9IFNEUENNX1BBQ0tFVF9DSEFOTkVMKCZkcHRyW1NEUENNX0ZSQU1FVEFHX0xFTl0pOwogCQkJc2VxID0gU0RQQ01fUEFDS0VUX1NFUVVFTkNFKCZkcHRyW1NEUENNX0ZSQU1FVEFHX0xFTl0pOwpAQCAtMzUwMiw4ICszNTA3LDggQEAKIAogCQkJREhEX0dMT00oKCIlczogR2V0IHN1YmZyYW1lICVkLCAlcCglcC8lZCksIHN1YmxlbiAlZCAiCiAJCQkJImNoYW4gJWQgc2VxICVkXG4iLAotCQkJCV9fZnVuY19fLCBudW0sIHBmaXJzdCwgUEtUREFUQShwZmlyc3QpLAotCQkJCVBLVExFTihwZmlyc3QpLCBzdWJsZW4sIGNoYW4sIHNlcSkpOworCQkJCV9fZnVuY19fLCBudW0sIHBmaXJzdCwgcGZpcnN0LT5kYXRhLAorCQkJCXBmaXJzdC0+bGVuLCBzdWJsZW4sIGNoYW4sIHNlcSkpOwogCiAJCQlBU1NFUlQoKGNoYW4gPT0gU0RQQ01fREFUQV9DSEFOTkVMKQogCQkJICAgICAgIHx8IChjaGFuID09IFNEUENNX0VWRU5UX0NIQU5ORUwpKTsKQEAgLTM1MTksMTMgKzM1MjQsMTMgQEAKIAkJCQlwcmhleCgiUnggU3ViZnJhbWUgRGF0YSIsIGRwdHIsIGRsZW4pOwogI2VuZGlmCiAKLQkJCVBLVFNFVExFTihwZmlyc3QsIHN1Ymxlbik7Ci0JCQlQS1RQVUxMKHBmaXJzdCwgZG9mZik7CisJCQlfX3NrYl90cmltKHBmaXJzdCwgc3VibGVuKTsKKwkJCXNrYl9wdWxsKHBmaXJzdCwgZG9mZik7CiAKLQkJCWlmIChQS1RMRU4ocGZpcnN0KSA9PSAwKSB7Ci0JCQkJUEtURlJFRShidXMtPmRoZC0+b3NoLCBwZmlyc3QsIGZhbHNlKTsKKwkJCWlmIChwZmlyc3QtPmxlbiA9PSAwKSB7CisJCQkJcGt0X2J1Zl9mcmVlX3NrYihidXMtPmRoZC0+b3NoLCBwZmlyc3QsIGZhbHNlKTsKIAkJCQlpZiAocGxhc3QpIHsKLQkJCQkJUEtUU0VUTkVYVChwbGFzdCwgcG5leHQpOworCQkJCQlwbGFzdC0+bmV4dCA9IHBuZXh0OwogCQkJCX0gZWxzZSB7CiAJCQkJCUFTU0VSVChzYXZlX3BmaXJzdCA9PSBwZmlyc3QpOwogCQkJCQlzYXZlX3BmaXJzdCA9IHBuZXh0OwpAQCAtMzUzNiw5ICszNTQxLDkgQEAKIAkJCQlESERfRVJST1IoKCIlczogcnggcHJvdG9jb2wgZXJyb3JcbiIsCiAJCQkJCSAgIF9fZnVuY19fKSk7CiAJCQkJYnVzLT5kaGQtPnJ4X2Vycm9ycysrOwotCQkJCVBLVEZSRUUob3NoLCBwZmlyc3QsIGZhbHNlKTsKKwkJCQlwa3RfYnVmX2ZyZWVfc2tiKG9zaCwgcGZpcnN0LCBmYWxzZSk7CiAJCQkJaWYgKHBsYXN0KSB7Ci0JCQkJCVBLVFNFVE5FWFQocGxhc3QsIHBuZXh0KTsKKwkJCQkJcGxhc3QtPm5leHQgPSBwbmV4dDsKIAkJCQl9IGVsc2UgewogCQkJCQlBU1NFUlQoc2F2ZV9wZmlyc3QgPT0gcGZpcnN0KTsKIAkJCQkJc2F2ZV9wZmlyc3QgPSBwbmV4dDsKQEAgLTM1NDgsNyArMzU1Myw3IEBACiAKIAkJCS8qIHRoaXMgcGFja2V0IHdpbGwgZ28gdXAsIGxpbmsgYmFjayBpbnRvCiAJCQkJIGNoYWluIGFuZCBjb3VudCBpdCAqLwotCQkJUEtUU0VUTkVYVChwZmlyc3QsIHBuZXh0KTsKKwkJCXBmaXJzdC0+bmV4dCA9IHBuZXh0OwogCQkJcGxhc3QgPSBwZmlyc3Q7CiAJCQludW0rKzsKIApAQCAtMzU1NiwxMSArMzU2MSwxMSBAQAogCQkJaWYgKERIRF9HTE9NX09OKCkpIHsKIAkJCQlESERfR0xPTSgoIiVzIHN1YmZyYW1lICVkIHRvIHN0YWNrLCAlcCglcC8lZCkgIgogCQkJCSJueHQvbG5rICVwLyVwXG4iLAotCQkJCV9fZnVuY19fLCBudW0sIHBmaXJzdCwgUEtUREFUQShwZmlyc3QpLAotCQkJCVBLVExFTihwZmlyc3QpLCBQS1RORVhUKHBmaXJzdCksCi0JCQkJUEtUTElOSyhwZmlyc3QpKSk7Ci0JCQkJcHJoZXgoIiIsICh1OCAqKSBQS1REQVRBKHBmaXJzdCksCi0JCQkJICAgICAgbWluX3QoaW50LCBQS1RMRU4ocGZpcnN0KSwgMzIpKTsKKwkJCQlfX2Z1bmNfXywgbnVtLCBwZmlyc3QsIHBmaXJzdC0+ZGF0YSwKKwkJCQlwZmlyc3QtPmxlbiwgcGZpcnN0LT5uZXh0LAorCQkJCXBmaXJzdC0+cHJldikpOworCQkJCXByaGV4KCIiLCAodTggKikgcGZpcnN0LT5kYXRhLAorCQkJCSAgICAgIG1pbl90KGludCwgcGZpcnN0LT5sZW4sIDMyKSk7CiAJCQl9CiAjZW5kaWYJCQkJLyogREhEX0RFQlVHICovCiAJCX0KQEAgLTM1ODAsNyArMzU4NSw3IEBACiAvKiBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBtYXkgYmUgbW9yZSBmcmFtZXMgdG8gcmVhZCAqLwogc3RhdGljIHVpbnQgZGhkc2Rpb19yZWFkZnJhbWVzKGRoZF9idXNfdCAqYnVzLCB1aW50IG1heGZyYW1lcywgYm9vbCAqZmluaXNoZWQpCiB7Ci0Jb3NsX3QgKm9zaCA9IGJ1cy0+ZGhkLT5vc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2ggPSBidXMtPmRoZC0+b3NoOwogCWJjbXNkaF9pbmZvX3QgKnNkaCA9IGJ1cy0+c2RoOwogCiAJdTE2IGxlbiwgY2hlY2s7CS8qIEV4dHJhY3RlZCBoYXJkd2FyZSBoZWFkZXIgZmllbGRzICovCkBAIC0zNTg4LDcgKzM1OTMsNyBAQAogCXU4IGZjYml0czsJCS8qIEV4dHJhY3RlZCBmY2JpdHMgZnJvbSBzb2Z0d2FyZSBoZWFkZXIgKi8KIAl1OCBkZWx0YTsKIAotCXZvaWQgKnBrdDsJCS8qIFBhY2tldCBmb3IgZXZlbnQgb3IgZGF0YSBmcmFtZXMgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqcGt0OwkJLyogUGFja2V0IGZvciBldmVudCBvciBkYXRhIGZyYW1lcyAqLwogCXUxNiBwYWQ7CQkvKiBOdW1iZXIgb2YgcGFkIGJ5dGVzIHRvIHJlYWQgKi8KIAl1MTYgcmRsZW47CQkvKiBUb3RhbCBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCAqLwogCXU4IHJ4c2VxOwkJLyogTmV4dCBzZXF1ZW5jZSBudW1iZXIgdG8gZXhwZWN0ICovCkBAIC0zNjc1LDcgKzM2ODAsNyBAQAogCQkJICovCiAJCQkvKiBBbGxvY2F0ZSBhIHBhY2tldCBidWZmZXIgKi8KIAkJCWRoZF9vc19zZGxvY2tfcnhxKGJ1cy0+ZGhkKTsKLQkJCXBrdCA9IFBLVEdFVChvc2gsIHJkbGVuICsgREhEX1NEQUxJR04sIGZhbHNlKTsKKwkJCXBrdCA9IHBrdF9idWZfZ2V0X3NrYihvc2gsIHJkbGVuICsgREhEX1NEQUxJR04pOwogCQkJaWYgKCFwa3QpIHsKIAkJCQlpZiAoYnVzLT5idXMgPT0gU1BJX0JVUykgewogCQkJCQlidXMtPnVzZWJ1ZnBvb2wgPSBmYWxzZTsKQEAgLTM3MjEsNyArMzcyNiw3IEBACiAJCQkJfSBlbHNlIHsKIAkJCQkJLyogR2l2ZSB1cCBvbiBkYXRhLAogCQkJCQlyZXF1ZXN0IHJ0eCBvZiBldmVudHMgKi8KLQkJCQkJREhEX0VSUk9SKCgiJXMgKG5leHRsZW4pOiBQS1RHRVQgZmFpbGVkOiBsZW4gJWQgcmRsZW4gJWQgIiAiZXhwZWN0ZWQgcnhzZXEgJWRcbiIsCisJCQkJCURIRF9FUlJPUigoIiVzIChuZXh0bGVuKTogcGt0X2J1Zl9nZXRfc2tiIGZhaWxlZDogbGVuICVkIHJkbGVuICVkICIgImV4cGVjdGVkIHJ4c2VxICVkXG4iLAogCQkJCQkJX19mdW5jX18sIGxlbiwgcmRsZW4sIHJ4c2VxKSk7CiAJCQkJCS8qIEp1c3QgZ28gdHJ5IGFnYWluIHcvbm9ybWFsCiAJCQkJCWhlYWRlciByZWFkICovCkBAIC0zNzMyLDkgKzM3MzcsOSBAQAogCQkJCWlmIChidXMtPmJ1cyA9PSBTUElfQlVTKQogCQkJCQlidXMtPnVzZWJ1ZnBvb2wgPSB0cnVlOwogCi0JCQkJQVNTRVJUKCFQS1RMSU5LKHBrdCkpOworCQkJCUFTU0VSVCghKHBrdC0+cHJldikpOwogCQkJCVBLVEFMSUdOKG9zaCwgcGt0LCByZGxlbiwgREhEX1NEQUxJR04pOwotCQkJCXJ4YnVmID0gKHU4ICopIFBLVERBVEEocGt0KTsKKwkJCQlyeGJ1ZiA9ICh1OCAqKSAocGt0LT5kYXRhKTsKIAkJCQkvKiBSZWFkIHRoZSBlbnRpcmUgZnJhbWUgKi8KIAkJCQlzZHJldCA9CiAJCQkJICAgIGRoZF9iY21zZGhfcmVjdl9idWYoYnVzLApAQCAtMzc0OCw3ICszNzUzLDcgQEAKIAkJCQlpZiAoc2RyZXQgPCAwKSB7CiAJCQkJCURIRF9FUlJPUigoIiVzIChuZXh0bGVuKTogcmVhZCAlZCBieXRlcyBmYWlsZWQ6ICVkXG4iLAogCQkJCQkJX19mdW5jX18sIHJkbGVuLCBzZHJldCkpOwotCQkJCQlQS1RGUkVFKGJ1cy0+ZGhkLT5vc2gsIHBrdCwgZmFsc2UpOworCQkJCQlwa3RfYnVmX2ZyZWVfc2tiKGJ1cy0+ZGhkLT5vc2gsIHBrdCwgZmFsc2UpOwogCQkJCQlidXMtPmRoZC0+cnhfZXJyb3JzKys7CiAJCQkJCWRoZF9vc19zZHVubG9ja19yeHEoYnVzLT5kaGQpOwogCQkJCQkvKiBGb3JjZSByZXRyeSB3L25vcm1hbCBoZWFkZXIgcmVhZC4KQEAgLTM4OTYsNyArMzkwMSw3IEBACiAJCQkJCQkJICAgICBkb2ZmKTsKIAkJCQkJaWYgKGJ1cy0+dXNlYnVmcG9vbCkgewogCQkJCQkJZGhkX29zX3NkbG9ja19yeHEoYnVzLT5kaGQpOwotCQkJCQkJUEtURlJFRShidXMtPmRoZC0+b3NoLCBwa3QsCisJCQkJCQlwa3RfYnVmX2ZyZWVfc2tiKGJ1cy0+ZGhkLT5vc2gsIHBrdCwKIAkJCQkJCQlmYWxzZSk7CiAJCQkJCQlkaGRfb3Nfc2R1bmxvY2tfcnhxKGJ1cy0+ZGhkKTsKIAkJCQkJfQpAQCAtNDA4NiwxMCArNDA5MSwxMCBAQAogCQl9CiAKIAkJZGhkX29zX3NkbG9ja19yeHEoYnVzLT5kaGQpOwotCQlwa3QgPSBQS1RHRVQob3NoLCAocmRsZW4gKyBmaXJzdHJlYWQgKyBESERfU0RBTElHTiksIGZhbHNlKTsKKwkJcGt0ID0gcGt0X2J1Zl9nZXRfc2tiKG9zaCwgKHJkbGVuICsgZmlyc3RyZWFkICsgREhEX1NEQUxJR04pKTsKIAkJaWYgKCFwa3QpIHsKIAkJCS8qIEdpdmUgdXAgb24gZGF0YSwgcmVxdWVzdCBydHggb2YgZXZlbnRzICovCi0JCQlESERfRVJST1IoKCIlczogUEtUR0VUIGZhaWxlZDogcmRsZW4gJWQgY2hhbiAlZFxuIiwKKwkJCURIRF9FUlJPUigoIiVzOiBwa3RfYnVmX2dldF9za2IgZmFpbGVkOiByZGxlbiAlZCBjaGFuICVkXG4iLAogCQkJCSAgIF9fZnVuY19fLCByZGxlbiwgY2hhbikpOwogCQkJYnVzLT5kaGQtPnJ4X2Ryb3BwZWQrKzsKIAkJCWRoZF9vc19zZHVubG9ja19yeHEoYnVzLT5kaGQpOwpAQCAtNDA5OCwxNyArNDEwMywxNyBAQAogCQl9CiAJCWRoZF9vc19zZHVubG9ja19yeHEoYnVzLT5kaGQpOwogCi0JCUFTU0VSVCghUEtUTElOSyhwa3QpKTsKKwkJQVNTRVJUKCEocGt0LT5wcmV2KSk7CiAKIAkJLyogTGVhdmUgcm9vbSBmb3Igd2hhdCB3ZSBhbHJlYWR5IHJlYWQsIGFuZCBhbGlnbiByZW1haW5kZXIgKi8KLQkJQVNTRVJUKGZpcnN0cmVhZCA8IChQS1RMRU4ocGt0KSkpOwotCQlQS1RQVUxMKHBrdCwgZmlyc3RyZWFkKTsKKwkJQVNTRVJUKGZpcnN0cmVhZCA8IHBrdC0+bGVuKTsKKwkJc2tiX3B1bGwocGt0LCBmaXJzdHJlYWQpOwogCQlQS1RBTElHTihvc2gsIHBrdCwgcmRsZW4sIERIRF9TREFMSUdOKTsKIAogCQkvKiBSZWFkIHRoZSByZW1haW5pbmcgZnJhbWUgZGF0YSAqLwogCQlzZHJldCA9CiAJCSAgICBkaGRfYmNtc2RoX3JlY3ZfYnVmKGJ1cywgYmNtc2RoX2N1cl9zYndhZChzZGgpLCBTRElPX0ZVTkNfMiwKLQkJCQkJRjJTWU5DLCAoKHU4ICopIFBLVERBVEEocGt0KSksIHJkbGVuLAorCQkJCQlGMlNZTkMsICgodTggKikgKHBrdC0+ZGF0YSkpLCByZGxlbiwKIAkJCQkJcGt0LCBOVUxMLCBOVUxMKTsKIAkJYnVzLT5mMnJ4ZGF0YSsrOwogCQlBU1NFUlQoc2RyZXQgIT0gQkNNRV9QRU5ESU5HKTsKQEAgLTQxMjIsNyArNDEyNyw3IEBACiAJCQkJICAgICAgID8gImRhdGEiIDogInRlc3QiKSksCiAJCQkJICAgc2RyZXQpKTsKIAkJCWRoZF9vc19zZGxvY2tfcnhxKGJ1cy0+ZGhkKTsKLQkJCVBLVEZSRUUoYnVzLT5kaGQtPm9zaCwgcGt0LCBmYWxzZSk7CisJCQlwa3RfYnVmX2ZyZWVfc2tiKGJ1cy0+ZGhkLT5vc2gsIHBrdCwgZmFsc2UpOwogCQkJZGhkX29zX3NkdW5sb2NrX3J4cShidXMtPmRoZCk7CiAJCQlidXMtPmRoZC0+cnhfZXJyb3JzKys7CiAJCQlkaGRzZGlvX3J4ZmFpbChidXMsIHRydWUsIFJFVFJZQ0hBTihjaGFuKSk7CkBAIC00MTMwLDEyICs0MTM1LDEyIEBACiAJCX0KIAogCQkvKiBDb3B5IHRoZSBhbHJlYWR5LXJlYWQgcG9ydGlvbiAqLwotCQlQS1RQVVNIKHBrdCwgZmlyc3RyZWFkKTsKLQkJYmNvcHkoYnVzLT5yeGhkciwgUEtUREFUQShwa3QpLCBmaXJzdHJlYWQpOworCQlza2JfcHVzaChwa3QsIGZpcnN0cmVhZCk7CisJCWJjb3B5KGJ1cy0+cnhoZHIsIHBrdC0+ZGF0YSwgZmlyc3RyZWFkKTsKIAogI2lmZGVmIERIRF9ERUJVRwogCQlpZiAoREhEX0JZVEVTX09OKCkgJiYgREhEX0RBVEFfT04oKSkKLQkJCXByaGV4KCJSeCBEYXRhIiwgUEtUREFUQShwa3QpLCBsZW4pOworCQkJcHJoZXgoIlJ4IERhdGEiLCBwa3QtPmRhdGEsIGxlbik7CiAjZW5kaWYKIAogZGVsaXZlcjoKQEAgLTQxNDYsMTIgKzQxNTEsMTIgQEAKIAkJCQkJX19mdW5jX18sIGxlbikpOwogI2lmZGVmIERIRF9ERUJVRwogCQkJCWlmIChESERfR0xPTV9PTigpKSB7Ci0JCQkJCXByaGV4KCJHbG9tIERhdGEiLCBQS1REQVRBKHBrdCksIGxlbik7CisJCQkJCXByaGV4KCJHbG9tIERhdGEiLCBwa3QtPmRhdGEsIGxlbik7CiAJCQkJfQogI2VuZGlmCi0JCQkJUEtUU0VUTEVOKHBrdCwgbGVuKTsKKwkJCQlfX3NrYl90cmltKHBrdCwgbGVuKTsKIAkJCQlBU1NFUlQoZG9mZiA9PSBTRFBDTV9IRFJMRU4pOwotCQkJCVBLVFBVTEwocGt0LCBTRFBDTV9IRFJMRU4pOworCQkJCXNrYl9wdWxsKHBrdCwgU0RQQ01fSERSTEVOKTsKIAkJCQlidXMtPmdsb21kID0gcGt0OwogCQkJfSBlbHNlIHsKIAkJCQlESERfRVJST1IoKCIlczogZ2xvbSBzdXBlcmZyYW1lIHcvbyAiCkBAIC00MTYyLDggKzQxNjcsOCBAQAogCQl9CiAKIAkJLyogRmlsbCBpbiBwYWNrZXQgbGVuIGFuZCBwcmlvLCBkZWxpdmVyIHVwd2FyZCAqLwotCQlQS1RTRVRMRU4ocGt0LCBsZW4pOwotCQlQS1RQVUxMKHBrdCwgZG9mZik7CisJCV9fc2tiX3RyaW0ocGt0LCBsZW4pOworCQlza2JfcHVsbChwa3QsIGRvZmYpOwogCiAjaWZkZWYgU0RURVNUCiAJCS8qIFRlc3QgY2hhbm5lbCBwYWNrZXRzIGFyZSBwcm9jZXNzZWQgc2VwYXJhdGVseSAqLwpAQCAtNDE3MywxNSArNDE3OCwxNSBAQAogCQl9CiAjZW5kaWYJCQkJLyogU0RURVNUICovCiAKLQkJaWYgKFBLVExFTihwa3QpID09IDApIHsKKwkJaWYgKHBrdC0+bGVuID09IDApIHsKIAkJCWRoZF9vc19zZGxvY2tfcnhxKGJ1cy0+ZGhkKTsKLQkJCVBLVEZSRUUoYnVzLT5kaGQtPm9zaCwgcGt0LCBmYWxzZSk7CisJCQlwa3RfYnVmX2ZyZWVfc2tiKGJ1cy0+ZGhkLT5vc2gsIHBrdCwgZmFsc2UpOwogCQkJZGhkX29zX3NkdW5sb2NrX3J4cShidXMtPmRoZCk7CiAJCQljb250aW51ZTsKIAkJfSBlbHNlIGlmIChkaGRfcHJvdF9oZHJwdWxsKGJ1cy0+ZGhkLCAmaWZpZHgsIHBrdCkgIT0gMCkgewogCQkJREhEX0VSUk9SKCgiJXM6IHJ4IHByb3RvY29sIGVycm9yXG4iLCBfX2Z1bmNfXykpOwogCQkJZGhkX29zX3NkbG9ja19yeHEoYnVzLT5kaGQpOwotCQkJUEtURlJFRShidXMtPmRoZC0+b3NoLCBwa3QsIGZhbHNlKTsKKwkJCXBrdF9idWZfZnJlZV9za2IoYnVzLT5kaGQtPm9zaCwgcGt0LCBmYWxzZSk7CiAJCQlkaGRfb3Nfc2R1bmxvY2tfcnhxKGJ1cy0+ZGhkKTsKIAkJCWJ1cy0+ZGhkLT5yeF9lcnJvcnMrKzsKIAkJCWNvbnRpbnVlOwpAQCAtNDYyNiwxMSArNDYzMSwxMSBAQAogCiBzdGF0aWMgdm9pZCBkaGRzZGlvX3BrdGdlbihkaGRfYnVzX3QgKmJ1cykKIHsKLQl2b2lkICpwa3Q7CisJc3RydWN0IHNrX2J1ZmYgKnBrdDsKIAl1OCAqZGF0YTsKIAl1aW50IHBrdGNvdW50OwogCXVpbnQgZmlsbGJ5dGU7Ci0Jb3NsX3QgKm9zaCA9IGJ1cy0+ZGhkLT5vc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2ggPSBidXMtPmRoZC0+b3NoOwogCXUxNiBsZW47CiAKIAkvKiBEaXNwbGF5IGN1cnJlbnQgY291bnQgaWYgYXBwcm9wcmlhdGUgKi8KQEAgLTQ2NTgsMTYgKzQ2NjMsMTYgQEAKIAogCQkvKiBBbGxvY2F0ZSBhbiBhcHByb3ByaWF0ZS1zaXplZCBwYWNrZXQgKi8KIAkJbGVuID0gYnVzLT5wa3RnZW5fbGVuOwotCQlwa3QgPSBQS1RHRVQob3NoLAorCQlwa3QgPSBwa3RfYnVmX2dldF9za2Iob3NoLAogCQkJKGxlbiArIFNEUENNX0hEUkxFTiArIFNEUENNX1RFU1RfSERSTEVOICsgREhEX1NEQUxJR04pLAogCQkJdHJ1ZSk7CiAJCWlmICghcGt0KSB7Ci0JCQlESERfRVJST1IoKCIlczogUEtUR0VUIGZhaWxlZCFcbiIsIF9fZnVuY19fKSk7CisJCQlESERfRVJST1IoKCIlczogcGt0X2J1Zl9nZXRfc2tiIGZhaWxlZCFcbiIsIF9fZnVuY19fKSk7CiAJCQlicmVhazsKIAkJfQogCQlQS1RBTElHTihvc2gsIHBrdCwgKGxlbiArIFNEUENNX0hEUkxFTiArIFNEUENNX1RFU1RfSERSTEVOKSwKIAkJCSBESERfU0RBTElHTik7Ci0JCWRhdGEgPSAodTggKikgUEtUREFUQShwa3QpICsgU0RQQ01fSERSTEVOOworCQlkYXRhID0gKHU4ICopIChwa3QtPmRhdGEpICsgU0RQQ01fSERSTEVOOwogCiAJCS8qIFdyaXRlIHRlc3QgaGVhZGVyIGNtZCBhbmQgZXh0cmEgYmFzZWQgb24gbW9kZSAqLwogCQlzd2l0Y2ggKGJ1cy0+cGt0Z2VuX21vZGUpIHsKQEAgLTQ2ODksNyArNDY5NCw3IEBACiAJCWRlZmF1bHQ6CiAJCQlESERfRVJST1IoKCJVbnJlY29nbml6ZWQgcGt0Z2VuIG1vZGUgJWRcbiIsCiAJCQkJICAgYnVzLT5wa3RnZW5fbW9kZSkpOwotCQkJUEtURlJFRShvc2gsIHBrdCwgdHJ1ZSk7CisJCQlwa3RfYnVmX2ZyZWVfc2tiKG9zaCwgcGt0LCB0cnVlKTsKIAkJCWJ1cy0+cGt0Z2VuX2NvdW50ID0gMDsKIAkJCXJldHVybjsKIAkJfQpAQCAtNDcwNiw5ICs0NzExLDkgQEAKIAogI2lmZGVmIERIRF9ERUJVRwogCQlpZiAoREhEX0JZVEVTX09OKCkgJiYgREhEX0RBVEFfT04oKSkgewotCQkJZGF0YSA9ICh1OCAqKSBQS1REQVRBKHBrdCkgKyBTRFBDTV9IRFJMRU47CisJCQlkYXRhID0gKHU4ICopIChwa3QtPmRhdGEpICsgU0RQQ01fSERSTEVOOwogCQkJcHJoZXgoImRoZHNkaW9fcGt0Z2VuOiBUeCBEYXRhIiwgZGF0YSwKLQkJCSAgICAgIFBLVExFTihwa3QpIC0gU0RQQ01fSERSTEVOKTsKKwkJCSAgICAgIHBrdC0+bGVuIC0gU0RQQ01fSERSTEVOKTsKIAkJfQogI2VuZGlmCiAKQEAgLTQ3MzMsMTkgKzQ3MzgsMTkgQEAKIAogc3RhdGljIHZvaWQgZGhkc2Rpb19zZHRlc3Rfc2V0KGRoZF9idXNfdCAqYnVzLCBib29sIHN0YXJ0KQogewotCXZvaWQgKnBrdDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcGt0OwogCXU4ICpkYXRhOwotCW9zbF90ICpvc2ggPSBidXMtPmRoZC0+b3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoID0gYnVzLT5kaGQtPm9zaDsKIAogCS8qIEFsbG9jYXRlIHRoZSBwYWNrZXQgKi8KLQlwa3QgPSBQS1RHRVQob3NoLCBTRFBDTV9IRFJMRU4gKyBTRFBDTV9URVNUX0hEUkxFTiArIERIRF9TREFMSUdOLAorCXBrdCA9IHBrdF9idWZfZ2V0X3NrYihvc2gsIFNEUENNX0hEUkxFTiArIFNEUENNX1RFU1RfSERSTEVOICsgREhEX1NEQUxJR04sCiAJCQl0cnVlKTsKIAlpZiAoIXBrdCkgewotCQlESERfRVJST1IoKCIlczogUEtUR0VUIGZhaWxlZCFcbiIsIF9fZnVuY19fKSk7CisJCURIRF9FUlJPUigoIiVzOiBwa3RfYnVmX2dldF9za2IgZmFpbGVkIVxuIiwgX19mdW5jX18pKTsKIAkJcmV0dXJuOwogCX0KIAlQS1RBTElHTihvc2gsIHBrdCwgKFNEUENNX0hEUkxFTiArIFNEUENNX1RFU1RfSERSTEVOKSwgREhEX1NEQUxJR04pOwotCWRhdGEgPSAodTggKikgUEtUREFUQShwa3QpICsgU0RQQ01fSERSTEVOOworCWRhdGEgPSAodTggKikgKHBrdC0+ZGF0YSkgKyBTRFBDTV9IRFJMRU47CiAKIAkvKiBGaWxsIGluIHRoZSB0ZXN0IGhlYWRlciAqLwogCSpkYXRhKysgPSBTRFBDTV9URVNUX1NFTkQ7CkBAIC00NzU4LDkgKzQ3NjMsOSBAQAogCQlidXMtPnBrdGdlbl9mYWlsKys7CiB9CiAKLXN0YXRpYyB2b2lkIGRoZHNkaW9fdGVzdHJjdihkaGRfYnVzX3QgKmJ1cywgdm9pZCAqcGt0LCB1aW50IHNlcSkKK3N0YXRpYyB2b2lkIGRoZHNkaW9fdGVzdHJjdihkaGRfYnVzX3QgKmJ1cywgc3RydWN0IHNrX2J1ZmYgKnBrdCwgdWludCBzZXEpCiB7Ci0Jb3NsX3QgKm9zaCA9IGJ1cy0+ZGhkLT5vc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2ggPSBidXMtPmRoZC0+b3NoOwogCXU4ICpkYXRhOwogCXVpbnQgcGt0bGVuOwogCkBAIC00NzcwLDE2ICs0Nzc1LDE2IEBACiAJdTE2IG9mZnNldDsKIAogCS8qIENoZWNrIGZvciBtaW4gbGVuZ3RoICovCi0JcGt0bGVuID0gUEtUTEVOKHBrdCk7CisJcGt0bGVuID0gcGt0LT5sZW47CiAJaWYgKHBrdGxlbiA8IFNEUENNX1RFU1RfSERSTEVOKSB7CiAJCURIRF9FUlJPUigoImRoZHNkaW9fcmVzdHJjdjogdG9zcyBydW50IGZyYW1lLCBwa3RsZW4gJWRcbiIsCiAJCQkgICBwa3RsZW4pKTsKLQkJUEtURlJFRShvc2gsIHBrdCwgZmFsc2UpOworCQlwa3RfYnVmX2ZyZWVfc2tiKG9zaCwgcGt0LCBmYWxzZSk7CiAJCXJldHVybjsKIAl9CiAKIAkvKiBFeHRyYWN0IGhlYWRlciBmaWVsZHMgKi8KLQlkYXRhID0gUEtUREFUQShwa3QpOworCWRhdGEgPSBwa3QtPmRhdGE7CiAJY21kID0gKmRhdGErKzsKIAlleHRyYSA9ICpkYXRhKys7CiAJbGVuID0gKmRhdGErKzsKQEAgLTQ3OTIsNyArNDc5Nyw3IEBACiAJCQlESERfRVJST1IoKCJkaGRzZGlvX3Rlc3RyY3Y6IGZyYW1lIGxlbmd0aCBtaXNtYXRjaCwgIgogCQkJCSJwa3RsZW4gJWQgc2VxICVkIiAiIGNtZCAlZCBleHRyYSAlZCBsZW4gJWRcbiIsCiAJCQkJcGt0bGVuLCBzZXEsIGNtZCwgZXh0cmEsIGxlbikpOwotCQkJUEtURlJFRShvc2gsIHBrdCwgZmFsc2UpOworCQkJcGt0X2J1Zl9mcmVlX3NrYihvc2gsIHBrdCwgZmFsc2UpOwogCQkJcmV0dXJuOwogCQl9CiAJfQpAQCAtNDgwMiwxOSArNDgwNywxOSBAQAogCWNhc2UgU0RQQ01fVEVTVF9FQ0hPUkVROgogCQkvKiBSeC0+VHggdHVybmFyb3VuZCBvayAoZXZlbiBvbiBORElTIHcvY3VycmVudAogCQkJIGltcGxlbWVudGF0aW9uKSAqLwotCQkqKHU4ICopIChQS1REQVRBKHBrdCkpID0gU0RQQ01fVEVTVF9FQ0hPUlNQOworCQkqKHU4ICopIChwa3QtPmRhdGEpID0gU0RQQ01fVEVTVF9FQ0hPUlNQOwogCQlpZiAoZGhkc2Rpb190eHBrdChidXMsIHBrdCwgU0RQQ01fVEVTVF9DSEFOTkVMLCB0cnVlKSA9PSAwKSB7CiAJCQlidXMtPnBrdGdlbl9zZW50Kys7CiAJCX0gZWxzZSB7CiAJCQlidXMtPnBrdGdlbl9mYWlsKys7Ci0JCQlQS1RGUkVFKG9zaCwgcGt0LCBmYWxzZSk7CisJCQlwa3RfYnVmX2ZyZWVfc2tiKG9zaCwgcGt0LCBmYWxzZSk7CiAJCX0KIAkJYnVzLT5wa3RnZW5fcmN2ZCsrOwogCQlicmVhazsKIAogCWNhc2UgU0RQQ01fVEVTVF9FQ0hPUlNQOgogCQlpZiAoYnVzLT5leHRfbG9vcCkgewotCQkJUEtURlJFRShvc2gsIHBrdCwgZmFsc2UpOworCQkJcGt0X2J1Zl9mcmVlX3NrYihvc2gsIHBrdCwgZmFsc2UpOwogCQkJYnVzLT5wa3RnZW5fcmN2ZCsrOwogCQkJYnJlYWs7CiAJCX0KQEAgLTQ4MjcsMTIgKzQ4MzIsMTIgQEAKIAkJCQlicmVhazsKIAkJCX0KIAkJfQotCQlQS1RGUkVFKG9zaCwgcGt0LCBmYWxzZSk7CisJCXBrdF9idWZfZnJlZV9za2Iob3NoLCBwa3QsIGZhbHNlKTsKIAkJYnVzLT5wa3RnZW5fcmN2ZCsrOwogCQlicmVhazsKIAogCWNhc2UgU0RQQ01fVEVTVF9ESVNDQVJEOgotCQlQS1RGUkVFKG9zaCwgcGt0LCBmYWxzZSk7CisJCXBrdF9idWZfZnJlZV9za2Iob3NoLCBwa3QsIGZhbHNlKTsKIAkJYnVzLT5wa3RnZW5fcmN2ZCsrOwogCQlicmVhazsKIApAQCAtNDg0Miw3ICs0ODQ3LDcgQEAKIAkJREhEX0lORk8oKCJkaGRzZGlvX3Rlc3RyY3Y6IHVuc3VwcG9ydGVkIG9yIHVua25vd24gY29tbWFuZCwgIgogCQkJInBrdGxlbiAlZCBzZXEgJWQiICIgY21kICVkIGV4dHJhICVkIGxlbiAlZFxuIiwKIAkJCXBrdGxlbiwgc2VxLCBjbWQsIGV4dHJhLCBsZW4pKTsKLQkJUEtURlJFRShvc2gsIHBrdCwgZmFsc2UpOworCQlwa3RfYnVmX2ZyZWVfc2tiKG9zaCwgcGt0LCBmYWxzZSk7CiAJCWJyZWFrOwogCX0KIApAQCAtNDk2MCw3ICs0OTY1LDcgQEAKIAlkaGRfYnVzX3QgKmJ1cyA9IGRoZHAtPmJ1czsKIAl1MzIgYWRkciwgdmFsOwogCWludCBydjsKLQl2b2lkICpwa3Q7CisJc3RydWN0IHNrX2J1ZmYgKnBrdDsKIAogCS8qIEFkZHJlc3MgY291bGQgYmUgemVybyBpZiBDT05TT0xFIDo9IDAgaW4gZG9uZ2xlIE1ha2VmaWxlICovCiAJaWYgKGJ1cy0+Y29uc29sZV9hZGRyID09IDApCkBAIC01MDAzLDcgKzUwMDgsNyBAQAogCS8qIEJ1bXAgZG9uZ2xlIGJ5IHNlbmRpbmcgYW4gZW1wdHkgZXZlbnQgcGt0LgogCSAqIHNkcGNtX3NlbmR1cCAoUlgpIGNoZWNrcyBmb3IgdmlydHVhbCBjb25zb2xlIGlucHV0LgogCSAqLwotCXBrdCA9IFBLVEdFVChidXMtPmRoZC0+b3NoLCA0ICsgU0RQQ01fUkVTRVJWRSwgdHJ1ZSk7CisJcGt0ID0gcGt0X2J1Zl9nZXRfc2tiKGJ1cy0+ZGhkLT5vc2gsIDQgKyBTRFBDTV9SRVNFUlZFKTsKIAlpZiAoKHBrdCAhPSBOVUxMKSAmJiBidXMtPmNsa3N0YXRlID09IENMS19BVkFJTCkKIAkJZGhkc2Rpb190eHBrdChidXMsIHBrdCwgU0RQQ01fRVZFTlRfQ0hBTk5FTCwgdHJ1ZSk7CiAKQEAgLTUwNjEsNyArNTA2Niw3IEBACiAKIHN0YXRpYyB2b2lkICpkaGRzZGlvX3Byb2JlKHUxNiB2ZW5pZCwgdTE2IGRldmlkLCB1MTYgYnVzX25vLAogCQkJICAgdTE2IHNsb3QsIHUxNiBmdW5jLCB1aW50IGJ1c3R5cGUsIHZvaWQgKnJlZ3N2YSwKLQkJCSAgIG9zbF90ICpvc2gsIHZvaWQgKnNkaCkKKwkJCSAgIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB2b2lkICpzZGgpCiB7CiAJaW50IHJldDsKIAlkaGRfYnVzX3QgKmJ1czsKQEAgLTUyMjAsOCArNTIyNSw4IEBACiB9CiAKIHN0YXRpYyBib29sCi1kaGRzZGlvX3Byb2JlX2F0dGFjaChzdHJ1Y3QgZGhkX2J1cyAqYnVzLCBvc2xfdCAqb3NoLCB2b2lkICpzZGgsIHZvaWQgKnJlZ3N2YSwKLQkJICAgICB1MTYgZGV2aWQpCitkaGRzZGlvX3Byb2JlX2F0dGFjaChzdHJ1Y3QgZGhkX2J1cyAqYnVzLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqc2RoLAorCQkJdm9pZCAqcmVnc3ZhLCB1MTYgZGV2aWQpCiB7CiAJdTggY2xrY3RsID0gMDsKIAlpbnQgZXJyID0gMDsKQEAgLTUyODAsNyArNTI4NSw3IEBACiAJCQkJCSJmYWlsZWRcbiIsIGZuKSk7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCQliemVybyhjaXNbZm5dLCBTQlNESU9fQ0lTX1NJWkVfTElNSVQpOworCQkJbWVtc2V0KGNpc1tmbl0sIDAsIFNCU0RJT19DSVNfU0laRV9MSU1JVCk7CiAKIAkJCWVyciA9IGJjbXNkaF9jaXNfcmVhZChzZGgsIGZuLCBjaXNbZm5dLAogCQkJCQkJU0JTRElPX0NJU19TSVpFX0xJTUlUKTsKQEAgLTUzNzgsNyArNTM4Myw4IEBACiAJcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgYm9vbCBkaGRzZGlvX3Byb2JlX21hbGxvYyhkaGRfYnVzX3QgKmJ1cywgb3NsX3QgKm9zaCwgdm9pZCAqc2RoKQorc3RhdGljIGJvb2wgZGhkc2Rpb19wcm9iZV9tYWxsb2MoZGhkX2J1c190ICpidXMsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLAorCQkJCSB2b2lkICpzZGgpCiB7CiAJREhEX1RSQUNFKCgiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXykpOwogCkBAIC01NDE5LDcgKzU0MjUsNyBAQAogCXJldHVybiBmYWxzZTsKIH0KIAotc3RhdGljIGJvb2wgZGhkc2Rpb19wcm9iZV9pbml0KGRoZF9idXNfdCAqYnVzLCBvc2xfdCAqb3NoLCB2b2lkICpzZGgpCitzdGF0aWMgYm9vbCBkaGRzZGlvX3Byb2JlX2luaXQoZGhkX2J1c190ICpidXMsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB2b2lkICpzZGgpCiB7CiAJczMyIGZudW07CiAKQEAgLTU0OTYsNyArNTUwMiw3IEBACiB9CiAKIGJvb2wKLWRoZF9idXNfZG93bmxvYWRfZmlybXdhcmUoc3RydWN0IGRoZF9idXMgKmJ1cywgb3NsX3QgKm9zaCwKK2RoZF9idXNfZG93bmxvYWRfZmlybXdhcmUoc3RydWN0IGRoZF9idXMgKmJ1cywgc3RydWN0IG9zbF9pbmZvICpvc2gsCiAJCQkgIGNoYXIgKmZ3X3BhdGgsIGNoYXIgKm52X3BhdGgpCiB7CiAJYm9vbCByZXQ7CkBAIC01NTA5LDcgKzU1MTUsNyBAQAogfQogCiBzdGF0aWMgYm9vbAotZGhkc2Rpb19kb3dubG9hZF9maXJtd2FyZShzdHJ1Y3QgZGhkX2J1cyAqYnVzLCBvc2xfdCAqb3NoLCB2b2lkICpzZGgpCitkaGRzZGlvX2Rvd25sb2FkX2Zpcm13YXJlKHN0cnVjdCBkaGRfYnVzICpidXMsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB2b2lkICpzZGgpCiB7CiAJYm9vbCByZXQ7CiAKQEAgLTU1MjQsNyArNTUzMCw3IEBACiB9CiAKIC8qIERldGFjaCBhbmQgZnJlZSBldmVyeXRoaW5nICovCi1zdGF0aWMgdm9pZCBkaGRzZGlvX3JlbGVhc2UoZGhkX2J1c190ICpidXMsIG9zbF90ICpvc2gpCitzdGF0aWMgdm9pZCBkaGRzZGlvX3JlbGVhc2UoZGhkX2J1c190ICpidXMsIHN0cnVjdCBvc2xfaW5mbyAqb3NoKQogewogCURIRF9UUkFDRSgoIiVzOiBFbnRlclxuIiwgX19mdW5jX18pKTsKIApAQCAtNTU1NCw3ICs1NTYwLDcgQEAKIAlESERfVFJBQ0UoKCIlczogRGlzY29ubmVjdGVkXG4iLCBfX2Z1bmNfXykpOwogfQogCi1zdGF0aWMgdm9pZCBkaGRzZGlvX3JlbGVhc2VfbWFsbG9jKGRoZF9idXNfdCAqYnVzLCBvc2xfdCAqb3NoKQorc3RhdGljIHZvaWQgZGhkc2Rpb19yZWxlYXNlX21hbGxvYyhkaGRfYnVzX3QgKmJ1cywgc3RydWN0IG9zbF9pbmZvICpvc2gpCiB7CiAJREhEX1RSQUNFKCgiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXykpOwogCkBAIC01NTczLDcgKzU1NzksNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgZGhkc2Rpb19yZWxlYXNlX2RvbmdsZShkaGRfYnVzX3QgKmJ1cywgb3NsX3QgKm9zaCkKK3N0YXRpYyB2b2lkIGRoZHNkaW9fcmVsZWFzZV9kb25nbGUoZGhkX2J1c190ICpidXMsIHN0cnVjdCBvc2xfaW5mbyAqb3NoKQogewogCURIRF9UUkFDRSgoIiVzOiBFbnRlclxuIiwgX19mdW5jX18pKTsKIApAQCAtNTk4Niw3ICs1OTkyLDcgQEAKIAogc3RhdGljIGludAogZGhkX2JjbXNkaF9yZWN2X2J1ZihkaGRfYnVzX3QgKmJ1cywgdTMyIGFkZHIsIHVpbnQgZm4sIHVpbnQgZmxhZ3MsCi0JCSAgICB1OCAqYnVmLCB1aW50IG5ieXRlcywgdm9pZCAqcGt0LAorCQkgICAgdTggKmJ1ZiwgdWludCBuYnl0ZXMsIHN0cnVjdCBza19idWZmICpwa3QsCiAJCSAgICBiY21zZGhfY21wbHRfZm5fdCBjb21wbGV0ZSwgdm9pZCAqaGFuZGxlKQogewogCWludCBzdGF0dXM7CkBAIC02MDAwLDcgKzYwMDYsNyBAQAogCiBzdGF0aWMgaW50CiBkaGRfYmNtc2RoX3NlbmRfYnVmKGRoZF9idXNfdCAqYnVzLCB1MzIgYWRkciwgdWludCBmbiwgdWludCBmbGFncywKLQkJICAgIHU4ICpidWYsIHVpbnQgbmJ5dGVzLCB2b2lkICpwa3QsCisJCSAgICB1OCAqYnVmLCB1aW50IG5ieXRlcywgc3RydWN0IHNrX2J1ZmYgKnBrdCwKIAkJICAgIGJjbXNkaF9jbXBsdF9mbl90IGNvbXBsZXRlLCB2b2lkICpoYW5kbGUpCiB7CiAJcmV0dXJuIGJjbXNkaF9zZW5kX2J1ZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy93bF9jZmc4MDIxMS5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy93bF9jZmc4MDIxMS5jCmluZGV4IGVhMDgyNTIuLjk5MTQ2M2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvd2xfY2ZnODAyMTEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL3dsX2NmZzgwMjExLmMKQEAgLTE2LDcgKzE2LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgotI2luY2x1ZGUgPGxpbnV4dmVyLmg+CiAjaW5jbHVkZSA8b3NsLmg+CiAKICNpbmNsdWRlIDxiY211dGlscy5oPgpAQCAtMzAsMTAgKzI5LDYgQEAKICNpbmNsdWRlIDxkaGRpb2N0bC5oPgogI2luY2x1ZGUgPHdsaW9jdGwuaD4KIAotI2luY2x1ZGUgPHByb3RvL2V0aGVybmV0Lmg+Ci0jaW5jbHVkZSA8ZG5nbF9zdGF0cy5oPgotI2luY2x1ZGUgPGRoZC5oPgotCiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CkBAIC0zNDIsNyArMzM3LDcgQEAKIAlzdHJ1Y3Qgd2xfaWZhY2UgKmNpOwkJCQkJCVwKIAlpZiAodW5saWtlbHkoISh3bF9jZmc4MDIxMV9kZXYgJiYgCQkJCVwKIAkJKGNpID0gd2xfZ2V0X2RydmRhdGEod2xfY2ZnODAyMTFfZGV2KSkpKSkgewkJXAotCQlXTF9FUlIoKCJ3bF9jZmc4MDIxMV9kZXYgaXMgdW5hdmFpbGFibGVcbiIpKTsJCVwKKwkJV0xfRVJSKCJ3bF9jZmc4MDIxMV9kZXYgaXMgdW5hdmFpbGFibGVcbiIpOwkJXAogCQlCVUcoKTsJCQkJCQkJXAogCX0gCQkJCQkJCQlcCiAJY2lfdG9fd2woY2kpOwkJCQkJCQlcCkBAIC0zNTIsOCArMzQ3LDggQEAKIGRvIHsJCQkJCQkJCQlcCiAJc3RydWN0IHdsX3ByaXYgKndsID0gd2lwaHlfdG9fd2wod2lwaHkpOwkJCVwKIAlpZiAodW5saWtlbHkoIXRlc3RfYml0KFdMX1NUQVRVU19SRUFEWSwgJndsLT5zdGF0dXMpKSkgewlcCi0JCVdMX0lORk8oKCJkZXZpY2UgaXMgbm90IHJlYWR5IDogc3RhdHVzICglZClcbiIsCQlcCi0JCQkoaW50KXdsLT5zdGF0dXMpKTsJCQkJXAorCQlXTF9JTkZPKCJkZXZpY2UgaXMgbm90IHJlYWR5IDogc3RhdHVzICglZClcbiIsCQlcCisJCQkoaW50KXdsLT5zdGF0dXMpOwkJCQlcCiAJCXJldHVybiAtRUlPOwkJCQkJCVwKIAl9CQkJCQkJCQlcCiB9IHdoaWxlICgwKQpAQCAtNjE4LDggKzYxMyw4IEBACiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9NT05JVE9SOgogCWNhc2UgTkw4MDIxMV9JRlRZUEVfV0RTOgotCQlXTF9FUlIoKCJ0eXBlICglZCkgOiBjdXJyZW50bHkgd2UgZG8gbm90IHN1cHBvcnQgdGhpcyB0eXBlXG4iLAotCQkJdHlwZSkpOworCQlXTF9FUlIoInR5cGUgKCVkKSA6IGN1cnJlbnRseSB3ZSBkbyBub3Qgc3VwcG9ydCB0aGlzIHR5cGVcbiIsCisJCSAgICAgICB0eXBlKTsKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6CiAJCXdsLT5jb25mLT5tb2RlID0gV0xfTU9ERV9JQlNTOwpAQCAtNjM1LDE1ICs2MzAsMTUgQEAKIAlhcCA9IGh0b2QzMihhcCk7CiAJd2RldiA9IG5kZXYtPmllZWU4MDIxMV9wdHI7CiAJd2Rldi0+aWZ0eXBlID0gdHlwZTsKLQlXTF9EQkcoKCIlcyA6IGFwICglZCksIGluZnJhICglZClcbiIsIG5kZXYtPm5hbWUsIGFwLCBpbmZyYSkpOworCVdMX0RCRygiJXMgOiBhcCAoJWQpLCBpbmZyYSAoJWQpXG4iLCBuZGV2LT5uYW1lLCBhcCwgaW5mcmEpOwogCWVyciA9IHdsX2Rldl9pb2N0bChuZGV2LCBXTENfU0VUX0lORlJBLCAmaW5mcmEsIHNpemVvZihpbmZyYSkpOwogCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigoIldMQ19TRVRfSU5GUkEgZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0VSUigiV0xDX1NFVF9JTkZSQSBlcnJvciAoJWQpXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAllcnIgPSB3bF9kZXZfaW9jdGwobmRldiwgV0xDX1NFVF9BUCwgJmFwLCBzaXplb2YoYXApKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJXTENfU0VUX0FQIGVycm9yICglZClcbiIsIGVycikpOworCQlXTF9FUlIoIldMQ19TRVRfQVAgZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTY1Myw3ICs2NDgsNyBAQAogCiBzdGF0aWMgdm9pZCB3bF9pc2Nhbl9wcmVwKHN0cnVjdCB3bF9zY2FuX3BhcmFtcyAqcGFyYW1zLCBzdHJ1Y3Qgd2xjX3NzaWQgKnNzaWQpCiB7Ci0JbWVtY3B5KCZwYXJhbXMtPmJzc2lkLCAmZXRoZXJfYmNhc3QsIEVUSEVSX0FERFJfTEVOKTsKKwltZW1jcHkoJnBhcmFtcy0+YnNzaWQsICZldGhlcl9iY2FzdCwgRVRIX0FMRU4pOwogCXBhcmFtcy0+YnNzX3R5cGUgPSBET1QxMV9CU1NUWVBFX0FOWTsKIAlwYXJhbXMtPnNjYW5fdHlwZSA9IDA7CiAJcGFyYW1zLT5ucHJvYmVzID0gLTE7CkBAIC03MDUsNyArNzAwLDcgQEAKIAogCWlmIChzc2lkICYmIHNzaWQtPlNTSURfbGVuKQogCQlwYXJhbXNfc2l6ZSArPSBzaXplb2Yoc3RydWN0IHdsY19zc2lkKTsKLQlwYXJhbXMgPSAoc3RydWN0IHdsX2lzY2FuX3BhcmFtcyAqKWt6YWxsb2MocGFyYW1zX3NpemUsIEdGUF9LRVJORUwpOworCXBhcmFtcyA9IGt6YWxsb2MocGFyYW1zX3NpemUsIEdGUF9LRVJORUwpOwogCWlmICh1bmxpa2VseSghcGFyYW1zKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAJbWVtc2V0KHBhcmFtcywgMCwgcGFyYW1zX3NpemUpOwpAQCAtNzIyLDkgKzcxNyw5IEBACiAJCQkJaXNjYW4tPmlvY3RsX2J1ZiwgV0xDX0lPQ1RMX1NNTEVOKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewogCQlpZiAoZXJyID09IC1FQlVTWSkgewotCQkJV0xfSU5GTygoInN5c3RlbSBidXN5IDogaXNjYW4gY2FuY2VsZWRcbiIpKTsKKwkJCVdMX0lORk8oInN5c3RlbSBidXN5IDogaXNjYW4gY2FuY2VsZWRcbiIpOwogCQl9IGVsc2UgewotCQkJV0xfRVJSKCgiZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCQlXTF9FUlIoImVycm9yICglZClcbiIsIGVycik7CiAJCX0KIAl9CiAJa2ZyZWUocGFyYW1zKTsKQEAgLTc0OCw3ICs3NDMsNyBAQAogCWVyciA9IHdsX2Rldl9pb2N0bCh3bF90b19uZGV2KHdsKSwgV0xDX1NFVF9QQVNTSVZFX1NDQU4sCiAJCQkmcGFzc2l2ZV9zY2FuLCBzaXplb2YocGFzc2l2ZV9zY2FuKSk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfREJHKCgiZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0RCRygiZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJd2xfc2V0X21wYyhuZGV2LCAwKTsKQEAgLTc3NCwxMiArNzY5LDEyIEBACiAJczMyIGVyciA9IDA7CiAKIAlpZiAodW5saWtlbHkodGVzdF9iaXQoV0xfU1RBVFVTX1NDQU5OSU5HLCAmd2wtPnN0YXR1cykpKSB7Ci0JCVdMX0VSUigoIlNjYW5uaW5nIGFscmVhZHkgOiBzdGF0dXMgKCVkKVxuIiwgKGludCl3bC0+c3RhdHVzKSk7CisJCVdMX0VSUigiU2Nhbm5pbmcgYWxyZWFkeSA6IHN0YXR1cyAoJWQpXG4iLCAoaW50KXdsLT5zdGF0dXMpOwogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CiAJaWYgKHVubGlrZWx5KHRlc3RfYml0KFdMX1NUQVRVU19TQ0FOX0FCT1JUSU5HLCAmd2wtPnN0YXR1cykpKSB7Ci0JCVdMX0VSUigoIlNjYW5uaW5nIGJlaW5nIGFib3J0ZWQgOiBzdGF0dXMgKCVkKVxuIiwKLQkJCShpbnQpd2wtPnN0YXR1cykpOworCQlXTF9FUlIoIlNjYW5uaW5nIGJlaW5nIGFib3J0ZWQgOiBzdGF0dXMgKCVkKVxuIiwKKwkJICAgICAgIChpbnQpd2wtPnN0YXR1cyk7CiAJCXJldHVybiAtRUFHQUlOOwogCX0KIApAQCAtODExLDI2ICs4MDYsMjYgQEAKIAkJZWxzZQogCQkJZ290byBzY2FuX291dDsKIAl9IGVsc2UgewotCQlXTF9EQkcoKCJzc2lkIFwiJXNcIiwgc3NpZF9sZW4gKCVkKVxuIiwKLQkJCXNzaWRzLT5zc2lkLCBzc2lkcy0+c3NpZF9sZW4pKTsKKwkJV0xfREJHKCJzc2lkIFwiJXNcIiwgc3NpZF9sZW4gKCVkKVxuIiwKKwkJICAgICAgIHNzaWRzLT5zc2lkLCBzc2lkcy0+c3NpZF9sZW4pOwogCQltZW1zZXQoJnNyLT5zc2lkLCAwLCBzaXplb2Yoc3ItPnNzaWQpKTsKIAkJc3ItPnNzaWQuU1NJRF9sZW4gPQogCQkJICAgIG1pbl90KHU4LCBzaXplb2Yoc3ItPnNzaWQuU1NJRCksIHNzaWRzLT5zc2lkX2xlbik7CiAJCWlmIChzci0+c3NpZC5TU0lEX2xlbikgewogCQkJbWVtY3B5KHNyLT5zc2lkLlNTSUQsIHNzaWRzLT5zc2lkLCBzci0+c3NpZC5TU0lEX2xlbik7CiAJCQlzci0+c3NpZC5TU0lEX2xlbiA9IGh0b2QzMihzci0+c3NpZC5TU0lEX2xlbik7Ci0JCQlXTF9EQkcoKCJTcGVjaWZpYyBzY2FuIHNzaWQ9XCIlc1wiIGxlbj0lZFxuIiwKLQkJCQkJc3ItPnNzaWQuU1NJRCwgc3ItPnNzaWQuU1NJRF9sZW4pKTsKKwkJCVdMX0RCRygiU3BlY2lmaWMgc2NhbiBzc2lkPVwiJXNcIiBsZW49JWRcbiIsCisJCQkgICAgICAgc3ItPnNzaWQuU1NJRCwgc3ItPnNzaWQuU1NJRF9sZW4pOwogCQkJc3BlY19zY2FuID0gdHJ1ZTsKIAkJfSBlbHNlIHsKLQkJCVdMX0RCRygoIkJyb2FkY2FzdCBzY2FuXG4iKSk7CisJCQlXTF9EQkcoIkJyb2FkY2FzdCBzY2FuXG4iKTsKIAkJfQotCQlXTF9EQkcoKCJzci0+c3NpZC5TU0lEX2xlbiAoJWQpXG4iLCBzci0+c3NpZC5TU0lEX2xlbikpOworCQlXTF9EQkcoInNyLT5zc2lkLlNTSURfbGVuICglZClcbiIsIHNyLT5zc2lkLlNTSURfbGVuKTsKIAkJcGFzc2l2ZV9zY2FuID0gd2wtPmFjdGl2ZV9zY2FuID8gMCA6IDE7CiAJCWVyciA9IHdsX2Rldl9pb2N0bChuZGV2LCBXTENfU0VUX1BBU1NJVkVfU0NBTiwKIAkJCQkmcGFzc2l2ZV9zY2FuLCBzaXplb2YocGFzc2l2ZV9zY2FuKSk7CiAJCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCQlXTF9FUlIoKCJXTENfU0VUX1BBU1NJVkVfU0NBTiBlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJCVdMX0VSUigiV0xDX1NFVF9QQVNTSVZFX1NDQU4gZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJCWdvdG8gc2Nhbl9vdXQ7CiAJCX0KIAkJd2xfc2V0X21wYyhuZGV2LCAwKTsKQEAgLTgzOCwxMCArODMzLDEwIEBACiAJCQkJc2l6ZW9mKHNyLT5zc2lkKSk7CiAJCWlmIChlcnIpIHsKIAkJCWlmIChlcnIgPT0gLUVCVVNZKSB7Ci0JCQkJV0xfSU5GTygoInN5c3RlbSBidXN5IDogc2NhbiBmb3IgXCIlc1wiICIKLQkJCQkJImNhbmNlbGVkXG4iLCBzci0+c3NpZC5TU0lEKSk7CisJCQkJV0xfSU5GTygic3lzdGVtIGJ1c3kgOiBzY2FuIGZvciBcIiVzXCIgY2FuY2VsZWRcbiIsCisJCQkJCXNyLT5zc2lkLlNTSUQpOwogCQkJfSBlbHNlIHsKLQkJCQlXTF9FUlIoKCJXTENfU0NBTiBlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJCQlXTF9FUlIoIldMQ19TQ0FOIGVycm9yICglZClcbiIsIGVycik7CiAJCQl9CiAJCQl3bF9zZXRfbXBjKG5kZXYsIDEpOwogCQkJZ290byBzY2FuX291dDsKQEAgLTg2NSw3ICs4NjAsNyBAQAogCUNIRUNLX1NZU19VUCgpOwogCWVyciA9IF9fd2xfY2ZnODAyMTFfc2Nhbih3aXBoeSwgbmRldiwgcmVxdWVzdCwgTlVMTCk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfREJHKCgic2NhbiBlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfREJHKCJzY2FuIGVycm9yICglZClcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC04ODQsNyArODc5LDcgQEAKIAogCWVyciA9IHdsX2Rldl9pb2N0bChkZXYsIFdMQ19TRVRfVkFSLCBidWYsIGxlbik7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgiZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0VSUigiZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAl9CiAKIAlyZXR1cm4gZXJyOwpAQCAtOTA3LDcgKzkwMiw3IEBACiAJQlVHX09OKHVubGlrZWx5KCFsZW4pKTsKIAllcnIgPSB3bF9kZXZfaW9jdGwoZGV2LCBXTENfR0VUX1ZBUiwgJnZhciwgbGVuKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfRVJSKCJlcnJvciAoJWQpXG4iLCBlcnIpOwogCX0KIAkqcmV0dmFsID0gZHRvaDMyKHZhci52YWwpOwogCkBAIC05MjAsNyArOTE1LDcgQEAKIAogCWVyciA9IHdsX2Rldl9pbnR2YXJfc2V0KGRldiwgInJ0c3RocmVzaCIsIHJ0c190aHJlc2hvbGQpOwogCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigoIkVycm9yICglZClcbiIsIGVycikpOworCQlXTF9FUlIoIkVycm9yICglZClcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCXJldHVybiBlcnI7CkBAIC05MzIsNyArOTI3LDcgQEAKIAogCWVyciA9IHdsX2Rldl9pbnR2YXJfc2V0KGRldiwgImZyYWd0aHJlc2giLCBmcmFnX3RocmVzaG9sZCk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgiRXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0VSUigiRXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJcmV0dXJuIGVycjsKQEAgLTk0Niw3ICs5NDEsNyBAQAogCXJldHJ5ID0gaHRvZDMyKHJldHJ5KTsKIAllcnIgPSB3bF9kZXZfaW9jdGwoZGV2LCBjbWQsICZyZXRyeSwgc2l6ZW9mKHJldHJ5KSk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgiY21kICglZCkgLCBlcnJvciAoJWQpXG4iLCBjbWQsIGVycikpOworCQlXTF9FUlIoImNtZCAoJWQpICwgZXJyb3IgKCVkKVxuIiwgY21kLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAlyZXR1cm4gZXJyOwpAQCAtMTAwNiw3ICsxMDAxLDcgQEAKIAogCUNIRUNLX1NZU19VUCgpOwogCWlmIChwYXJhbXMtPmJzc2lkKSB7Ci0JCVdMX0VSUigoIkludmFsaWQgYnNzaWRcbiIpKTsKKwkJV0xfRVJSKCJJbnZhbGlkIGJzc2lkXG4iKTsKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KIAlic3MgPSBjZmc4MDIxMV9nZXRfaWJzcyh3aXBoeSwgTlVMTCwgcGFyYW1zLT5zc2lkLCBwYXJhbXMtPnNzaWRfbGVuKTsKQEAgLTEwMzIsNyArMTAyNyw3IEBACiAJfQogCWlmIChic3MpIHsKIAkJd2wtPmlic3Nfc3RhcnRlciA9IGZhbHNlOwotCQlXTF9EQkcoKCJGb3VuZCBJQlNTXG4iKSk7CisJCVdMX0RCRygiRm91bmQgSUJTU1xuIik7CiAJfSBlbHNlIHsKIAkJd2wtPmlic3Nfc3RhcnRlciA9IHRydWU7CiAJfQpAQCAtMTA0OSwxNCArMTA0NCwxNCBAQAogCWpvaW5fcGFyYW1zLnNzaWQuU1NJRF9sZW4gPSBodG9kMzIocGFyYW1zLT5zc2lkX2xlbik7CiAJaWYgKHBhcmFtcy0+YnNzaWQpCiAJCW1lbWNweSgmam9pbl9wYXJhbXMucGFyYW1zLmJzc2lkLCBwYXJhbXMtPmJzc2lkLAotCQkgICAgICAgRVRIRVJfQUREUl9MRU4pOworCQkgICAgICAgRVRIX0FMRU4pOwogCWVsc2UKLQkJbWVtc2V0KCZqb2luX3BhcmFtcy5wYXJhbXMuYnNzaWQsIDAsIEVUSEVSX0FERFJfTEVOKTsKKwkJbWVtc2V0KCZqb2luX3BhcmFtcy5wYXJhbXMuYnNzaWQsIDAsIEVUSF9BTEVOKTsKIAogCWVyciA9IHdsX2Rldl9pb2N0bChkZXYsIFdMQ19TRVRfU1NJRCwgJmpvaW5fcGFyYW1zLAogCQkJc2l6ZW9mKGpvaW5fcGFyYW1zKSk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgiRXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0VSUigiRXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJcmV0dXJuIGVycjsKQEAgLTEwODcsMTAgKzEwODIsMTAgQEAKIAkJdmFsID0gV1BBMl9BVVRIX1BTSyB8IFdQQTJfQVVUSF9VTlNQRUNJRklFRDsKIAllbHNlCiAJCXZhbCA9IFdQQV9BVVRIX0RJU0FCTEVEOwotCVdMX0RCRygoInNldHRpbmcgd3BhX2F1dGggdG8gMHglMHhcbiIsIHZhbCkpOworCVdMX0RCRygic2V0dGluZyB3cGFfYXV0aCB0byAweCUweFxuIiwgdmFsKTsKIAllcnIgPSB3bF9kZXZfaW50dmFyX3NldChkZXYsICJ3cGFfYXV0aCIsIHZhbCk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgic2V0IHdwYV9hdXRoIGZhaWxlZCAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfRVJSKCJzZXQgd3BhX2F1dGggZmFpbGVkICglZClcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCXNlYyA9IHdsX3JlYWRfcHJvZih3bCwgV0xfUFJPRl9TRUMpOwpAQCAtMTEwOSwyNyArMTEwNCwyNyBAQAogCXN3aXRjaCAoc21lLT5hdXRoX3R5cGUpIHsKIAljYXNlIE5MODAyMTFfQVVUSFRZUEVfT1BFTl9TWVNURU06CiAJCXZhbCA9IDA7Ci0JCVdMX0RCRygoIm9wZW4gc3lzdGVtXG4iKSk7CisJCVdMX0RCRygib3BlbiBzeXN0ZW1cbiIpOwogCQlicmVhazsKIAljYXNlIE5MODAyMTFfQVVUSFRZUEVfU0hBUkVEX0tFWToKIAkJdmFsID0gMTsKLQkJV0xfREJHKCgic2hhcmVkIGtleVxuIikpOworCQlXTF9EQkcoInNoYXJlZCBrZXlcbiIpOwogCQlicmVhazsKIAljYXNlIE5MODAyMTFfQVVUSFRZUEVfQVVUT01BVElDOgogCQl2YWwgPSAyOwotCQlXTF9EQkcoKCJhdXRvbWF0aWNcbiIpKTsKKwkJV0xfREJHKCJhdXRvbWF0aWNcbiIpOwogCQlicmVhazsKIAljYXNlIE5MODAyMTFfQVVUSFRZUEVfTkVUV09SS19FQVA6Ci0JCVdMX0RCRygoIm5ldHdvcmsgZWFwXG4iKSk7CisJCVdMX0RCRygibmV0d29yayBlYXBcbiIpOwogCWRlZmF1bHQ6CiAJCXZhbCA9IDI7Ci0JCVdMX0VSUigoImludmFsaWQgYXV0aCB0eXBlICglZClcbiIsIHNtZS0+YXV0aF90eXBlKSk7CisJCVdMX0VSUigiaW52YWxpZCBhdXRoIHR5cGUgKCVkKVxuIiwgc21lLT5hdXRoX3R5cGUpOwogCQlicmVhazsKIAl9CiAKIAllcnIgPSB3bF9kZXZfaW50dmFyX3NldChkZXYsICJhdXRoIiwgdmFsKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJzZXQgYXV0aCBmYWlsZWQgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0VSUigic2V0IGF1dGggZmFpbGVkICglZClcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCXNlYyA9IHdsX3JlYWRfcHJvZih3bCwgV0xfUFJPRl9TRUMpOwpAQCAtMTE2Miw4ICsxMTU3LDggQEAKIAkJCXB2YWwgPSBBRVNfRU5BQkxFRDsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJV0xfRVJSKCgiaW52YWxpZCBjaXBoZXIgcGFpcndpc2UgKCVkKVxuIiwKLQkJCQlzbWUtPmNyeXB0by5jaXBoZXJzX3BhaXJ3aXNlWzBdKSk7CisJCQlXTF9FUlIoImludmFsaWQgY2lwaGVyIHBhaXJ3aXNlICglZClcbiIsCisJCQkgICAgICAgc21lLT5jcnlwdG8uY2lwaGVyc19wYWlyd2lzZVswXSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0KQEAgLTExODMsMTYgKzExNzgsMTYgQEAKIAkJCWd2YWwgPSBBRVNfRU5BQkxFRDsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJV0xfRVJSKCgiaW52YWxpZCBjaXBoZXIgZ3JvdXAgKCVkKVxuIiwKLQkJCQlzbWUtPmNyeXB0by5jaXBoZXJfZ3JvdXApKTsKKwkJCVdMX0VSUigiaW52YWxpZCBjaXBoZXIgZ3JvdXAgKCVkKVxuIiwKKwkJCSAgICAgICBzbWUtPmNyeXB0by5jaXBoZXJfZ3JvdXApOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9CiAKLQlXTF9EQkcoKCJwdmFsICglZCkgZ3ZhbCAoJWQpXG4iLCBwdmFsLCBndmFsKSk7CisJV0xfREJHKCJwdmFsICglZCkgZ3ZhbCAoJWQpXG4iLCBwdmFsLCBndmFsKTsKIAllcnIgPSB3bF9kZXZfaW50dmFyX3NldChkZXYsICJ3c2VjIiwgcHZhbCB8IGd2YWwpOwogCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigoImVycm9yICglZClcbiIsIGVycikpOworCQlXTF9FUlIoImVycm9yICglZClcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC0xMjE0LDcgKzEyMDksNyBAQAogCWlmIChzbWUtPmNyeXB0by5uX2FrbV9zdWl0ZXMpIHsKIAkJZXJyID0gd2xfZGV2X2ludHZhcl9nZXQoZGV2LCAid3BhX2F1dGgiLCAmdmFsKTsKIAkJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJCVdMX0VSUigoImNvdWxkIG5vdCBnZXQgd3BhX2F1dGggKCVkKVxuIiwgZXJyKSk7CisJCQlXTF9FUlIoImNvdWxkIG5vdCBnZXQgd3BhX2F1dGggKCVkKVxuIiwgZXJyKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAkJaWYgKHZhbCAmIChXUEFfQVVUSF9QU0sgfCBXUEFfQVVUSF9VTlNQRUNJRklFRCkpIHsKQEAgLTEyMjYsOCArMTIyMSw4IEBACiAJCQkJdmFsID0gV1BBX0FVVEhfUFNLOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKLQkJCQlXTF9FUlIoKCJpbnZhbGlkIGNpcGhlciBncm91cCAoJWQpXG4iLAotCQkJCQlzbWUtPmNyeXB0by5jaXBoZXJfZ3JvdXApKTsKKwkJCQlXTF9FUlIoImludmFsaWQgY2lwaGVyIGdyb3VwICglZClcbiIsCisJCQkJICAgICAgIHNtZS0+Y3J5cHRvLmNpcGhlcl9ncm91cCk7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAJCX0gZWxzZSBpZiAodmFsICYgKFdQQTJfQVVUSF9QU0sgfCBXUEEyX0FVVEhfVU5TUEVDSUZJRUQpKSB7CkBAIC0xMjM5LDE2ICsxMjM0LDE2IEBACiAJCQkJdmFsID0gV1BBMl9BVVRIX1BTSzsKIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6Ci0JCQkJV0xfRVJSKCgiaW52YWxpZCBjaXBoZXIgZ3JvdXAgKCVkKVxuIiwKLQkJCQkJc21lLT5jcnlwdG8uY2lwaGVyX2dyb3VwKSk7CisJCQkJV0xfRVJSKCJpbnZhbGlkIGNpcGhlciBncm91cCAoJWQpXG4iLAorCQkJCSAgICAgICBzbWUtPmNyeXB0by5jaXBoZXJfZ3JvdXApOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCQl9CiAKLQkJV0xfREJHKCgic2V0dGluZyB3cGFfYXV0aCB0byAlZFxuIiwgdmFsKSk7CisJCVdMX0RCRygic2V0dGluZyB3cGFfYXV0aCB0byAlZFxuIiwgdmFsKTsKIAkJZXJyID0gd2xfZGV2X2ludHZhcl9zZXQoZGV2LCAid3BhX2F1dGgiLCB2YWwpOwogCQlpZiAodW5saWtlbHkoZXJyKSkgewotCQkJV0xfRVJSKCgiY291bGQgbm90IHNldCB3cGFfYXV0aCAoJWQpXG4iLCBlcnIpKTsKKwkJCVdMX0VSUigiY291bGQgbm90IHNldCB3cGFfYXV0aCAoJWQpXG4iLCBlcnIpOwogCQkJcmV0dXJuIGVycjsKIAkJfQogCX0KQEAgLTEyNjgsMTEgKzEyNjMsMTEgQEAKIAlzMzIgdmFsOwogCXMzMiBlcnIgPSAwOwogCi0JV0xfREJHKCgia2V5IGxlbiAoJWQpXG4iLCBzbWUtPmtleV9sZW4pKTsKKwlXTF9EQkcoImtleSBsZW4gKCVkKVxuIiwgc21lLT5rZXlfbGVuKTsKIAlpZiAoc21lLT5rZXlfbGVuKSB7CiAJCXNlYyA9IHdsX3JlYWRfcHJvZih3bCwgV0xfUFJPRl9TRUMpOwotCQlXTF9EQkcoKCJ3cGFfdmVyc2lvbnMgMHgleCBjaXBoZXJfcGFpcndpc2UgMHgleFxuIiwKLQkJCXNlYy0+d3BhX3ZlcnNpb25zLCBzZWMtPmNpcGhlcl9wYWlyd2lzZSkpOworCQlXTF9EQkcoIndwYV92ZXJzaW9ucyAweCV4IGNpcGhlcl9wYWlyd2lzZSAweCV4XG4iLAorCQkgICAgICAgc2VjLT53cGFfdmVyc2lvbnMsIHNlYy0+Y2lwaGVyX3BhaXJ3aXNlKTsKIAkJaWYgKCEKIAkJICAgIChzZWMtPndwYV92ZXJzaW9ucyAmIChOTDgwMjExX1dQQV9WRVJTSU9OXzEgfAogCQkJCQkgIE5MODAyMTFfV1BBX1ZFUlNJT05fMikpCkBAIC0xMjgyLDcgKzEyNzcsNyBAQAogCQkJa2V5LmxlbiA9ICh1MzIpIHNtZS0+a2V5X2xlbjsKIAkJCWtleS5pbmRleCA9ICh1MzIpIHNtZS0+a2V5X2lkeDsKIAkJCWlmICh1bmxpa2VseShrZXkubGVuID4gc2l6ZW9mKGtleS5kYXRhKSkpIHsKLQkJCQlXTF9FUlIoKCJUb28gbG9uZyBrZXkgbGVuZ3RoICgldSlcbiIsIGtleS5sZW4pKTsKKwkJCQlXTF9FUlIoIlRvbyBsb25nIGtleSBsZW5ndGggKCV1KVxuIiwga2V5Lmxlbik7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAJCQltZW1jcHkoa2V5LmRhdGEsIHNtZS0+a2V5LCBrZXkubGVuKTsKQEAgLTEyOTUsMjcgKzEyOTAsMjcgQEAKIAkJCQlrZXkuYWxnbyA9IENSWVBUT19BTEdPX1dFUDEyODsKIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6Ci0JCQkJV0xfRVJSKCgiSW52YWxpZCBhbGdvcml0aG0gKCVkKVxuIiwKLQkJCQkJc21lLT5jcnlwdG8uY2lwaGVyc19wYWlyd2lzZVswXSkpOworCQkJCVdMX0VSUigiSW52YWxpZCBhbGdvcml0aG0gKCVkKVxuIiwKKwkJCQkgICAgICAgc21lLT5jcnlwdG8uY2lwaGVyc19wYWlyd2lzZVswXSk7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAJCQkvKiBTZXQgdGhlIG5ldyBrZXkvaW5kZXggKi8KLQkJCVdMX0RCRygoImtleSBsZW5ndGggKCVkKSBrZXkgaW5kZXggKCVkKSBhbGdvICglZClcbiIsCi0JCQkJa2V5Lmxlbiwga2V5LmluZGV4LCBrZXkuYWxnbykpOwotCQkJV0xfREJHKCgia2V5IFwiJXNcIlxuIiwga2V5LmRhdGEpKTsKKwkJCVdMX0RCRygia2V5IGxlbmd0aCAoJWQpIGtleSBpbmRleCAoJWQpIGFsZ28gKCVkKVxuIiwKKwkJCSAgICAgICBrZXkubGVuLCBrZXkuaW5kZXgsIGtleS5hbGdvKTsKKwkJCVdMX0RCRygia2V5IFwiJXNcIlxuIiwga2V5LmRhdGEpOwogCQkJc3dhcF9rZXlfZnJvbV9CRSgma2V5KTsKIAkJCWVyciA9IHdsX2Rldl9pb2N0bChkZXYsIFdMQ19TRVRfS0VZLCAma2V5LAogCQkJCQlzaXplb2Yoa2V5KSk7CiAJCQlpZiAodW5saWtlbHkoZXJyKSkgewotCQkJCVdMX0VSUigoIldMQ19TRVRfS0VZIGVycm9yICglZClcbiIsIGVycikpOworCQkJCVdMX0VSUigiV0xDX1NFVF9LRVkgZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJCQlyZXR1cm4gZXJyOwogCQkJfQogCQkJaWYgKHNlYy0+YXV0aF90eXBlID09IE5MODAyMTFfQVVUSFRZUEVfT1BFTl9TWVNURU0pIHsKLQkJCQlXTF9EQkcoKCJzZXQgYXV0aF90eXBlIHRvIHNoYXJlZCBrZXlcbiIpKTsKKwkJCQlXTF9EQkcoInNldCBhdXRoX3R5cGUgdG8gc2hhcmVkIGtleVxuIik7CiAJCQkJdmFsID0gMTsJLyogc2hhcmVkIGtleSAqLwogCQkJCWVyciA9IHdsX2Rldl9pbnR2YXJfc2V0KGRldiwgImF1dGgiLCB2YWwpOwogCQkJCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCQkJCVdMX0VSUigoInNldCBhdXRoIGZhaWxlZCAoJWQpXG4iLCBlcnIpKTsKKwkJCQkJV0xfRVJSKCJzZXQgYXV0aCBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJCQkJcmV0dXJuIGVycjsKIAkJCQl9CiAJCQl9CkBAIC0xMzM3LDE1ICsxMzMyLDE1IEBACiAKIAlDSEVDS19TWVNfVVAoKTsKIAlpZiAodW5saWtlbHkoIXNtZS0+c3NpZCkpIHsKLQkJV0xfRVJSKCgiSW52YWxpZCBzc2lkXG4iKSk7CisJCVdMX0VSUigiSW52YWxpZCBzc2lkXG4iKTsKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KIAlpZiAoY2hhbikgewogCQl3bC0+Y2hhbm5lbCA9IGllZWU4MDIxMV9mcmVxdWVuY3lfdG9fY2hhbm5lbChjaGFuLT5jZW50ZXJfZnJlcSk7Ci0JCVdMX0RCRygoImNoYW5uZWwgKCVkKSwgY2VudGVyX3JlcSAoJWQpXG4iLCB3bC0+Y2hhbm5lbCwKLQkJCWNoYW4tPmNlbnRlcl9mcmVxKSk7CisJCVdMX0RCRygiY2hhbm5lbCAoJWQpLCBjZW50ZXJfcmVxICglZClcbiIsCisJCSAgICAgICB3bC0+Y2hhbm5lbCwgY2hhbi0+Y2VudGVyX2ZyZXEpOwogCX0KLQlXTF9EQkcoKCJpZSAoJXApLCBpZV9sZW4gKCV6ZClcbiIsIHNtZS0+aWUsIHNtZS0+aWVfbGVuKSk7CisJV0xfREJHKCJpZSAoJXApLCBpZV9sZW4gKCV6ZClcbiIsIHNtZS0+aWUsIHNtZS0+aWVfbGVuKTsKIAllcnIgPSB3bF9zZXRfd3BhX3ZlcnNpb24oZGV2LCBzbWUpOwogCWlmICh1bmxpa2VseShlcnIpKQogCQlyZXR1cm4gZXJyOwpAQCAtMTM3OCwxOCArMTM3MywxOCBAQAogCW1lbWNweSgmam9pbl9wYXJhbXMuc3NpZC5TU0lELCBzbWUtPnNzaWQsIGpvaW5fcGFyYW1zLnNzaWQuU1NJRF9sZW4pOwogCWpvaW5fcGFyYW1zLnNzaWQuU1NJRF9sZW4gPSBodG9kMzIoam9pbl9wYXJhbXMuc3NpZC5TU0lEX2xlbik7CiAJd2xfdXBkYXRlX3Byb2Yod2wsIE5VTEwsICZqb2luX3BhcmFtcy5zc2lkLCBXTF9QUk9GX1NTSUQpOwotCW1lbWNweSgmam9pbl9wYXJhbXMucGFyYW1zLmJzc2lkLCAmZXRoZXJfYmNhc3QsIEVUSEVSX0FERFJfTEVOKTsKKwltZW1jcHkoJmpvaW5fcGFyYW1zLnBhcmFtcy5ic3NpZCwgJmV0aGVyX2JjYXN0LCBFVEhfQUxFTik7CiAKIAl3bF9jaF90b19jaGFuc3BlYyh3bC0+Y2hhbm5lbCwgJmpvaW5fcGFyYW1zLCAmam9pbl9wYXJhbXNfc2l6ZSk7Ci0JV0xfREJHKCgiam9pbl9wYXJhbV9zaXplICVkXG4iLCBqb2luX3BhcmFtc19zaXplKSk7CisJV0xfREJHKCJqb2luX3BhcmFtX3NpemUgJWRcbiIsIGpvaW5fcGFyYW1zX3NpemUpOwogCiAJaWYgKGpvaW5fcGFyYW1zLnNzaWQuU1NJRF9sZW4gPCBJRUVFODAyMTFfTUFYX1NTSURfTEVOKSB7Ci0JCVdMX0RCRygoInNzaWQgXCIlc1wiLCBsZW4gKCVkKVxuIiwgam9pbl9wYXJhbXMuc3NpZC5TU0lELAotCQkJam9pbl9wYXJhbXMuc3NpZC5TU0lEX2xlbikpOworCQlXTF9EQkcoInNzaWQgXCIlc1wiLCBsZW4gKCVkKVxuIiwKKwkJICAgICAgIGpvaW5fcGFyYW1zLnNzaWQuU1NJRCwgam9pbl9wYXJhbXMuc3NpZC5TU0lEX2xlbik7CiAJfQogCWVyciA9IHdsX2Rldl9pb2N0bChkZXYsIFdMQ19TRVRfU1NJRCwgJmpvaW5fcGFyYW1zLCBqb2luX3BhcmFtc19zaXplKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfRVJSKCJlcnJvciAoJWQpXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAlzZXRfYml0KFdMX1NUQVRVU19DT05ORUNUSU5HLCAmd2wtPnN0YXR1cyk7CkBAIC0xNDA2LDE3ICsxNDAxLDE3IEBACiAJYm9vbCBhY3QgPSBmYWxzZTsKIAlzMzIgZXJyID0gMDsKIAotCVdMX0RCRygoIlJlYXNvbiAlZFxuIiwgcmVhc29uX2NvZGUpKTsKKwlXTF9EQkcoIlJlYXNvbiAlZFxuIiwgcmVhc29uX2NvZGUpOwogCUNIRUNLX1NZU19VUCgpOwogCWFjdCA9ICooYm9vbCAqKSB3bF9yZWFkX3Byb2Yod2wsIFdMX1BST0ZfQUNUKTsKIAlpZiAobGlrZWx5KGFjdCkpIHsKIAkJc2NidmFsLnZhbCA9IHJlYXNvbl9jb2RlOwotCQltZW1jcHkoJnNjYnZhbC5lYSwgJndsLT5ic3NpZCwgRVRIRVJfQUREUl9MRU4pOworCQltZW1jcHkoJnNjYnZhbC5lYSwgJndsLT5ic3NpZCwgRVRIX0FMRU4pOwogCQlzY2J2YWwudmFsID0gaHRvZDMyKHNjYnZhbC52YWwpOwogCQllcnIgPSB3bF9kZXZfaW9jdGwoZGV2LCBXTENfRElTQVNTT0MsICZzY2J2YWwsCiAJCQkJc2l6ZW9mKHNjYl92YWxfdCkpOwogCQlpZiAodW5saWtlbHkoZXJyKSkgewotCQkJV0xfRVJSKCgiZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCQlXTF9FUlIoImVycm9yICglZClcbiIsIGVycik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJfQpAQCAtMTQ0MSwxMyArMTQzNiwxMyBAQAogCQlicmVhazsKIAljYXNlIE5MODAyMTFfVFhfUE9XRVJfTElNSVRFRDoKIAkJaWYgKGRibSA8IDApIHsKLQkJCVdMX0VSUigoIlRYX1BPV0VSX0xJTUlUVEVEIC0gZGJtIGlzIG5lZ2F0aXZlXG4iKSk7CisJCQlXTF9FUlIoIlRYX1BPV0VSX0xJTUlURUQgLSBkYm0gaXMgbmVnYXRpdmVcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBOTDgwMjExX1RYX1BPV0VSX0ZJWEVEOgogCQlpZiAoZGJtIDwgMCkgewotCQkJV0xfRVJSKCgiVFhfUE9XRVJfRklYRUQgLSBkYm0gaXMgbmVnYXRpdmUuLlxuIikpOworCQkJV0xfRVJSKCJUWF9QT1dFUl9GSVhFRCAtIGRibSBpcyBuZWdhdGl2ZVxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlicmVhazsKQEAgLTE0NTcsNyArMTQ1Miw3IEBACiAJZGlzYWJsZSA9IGh0b2QzMihkaXNhYmxlKTsKIAllcnIgPSB3bF9kZXZfaW9jdGwobmRldiwgV0xDX1NFVF9SQURJTywgJmRpc2FibGUsIHNpemVvZihkaXNhYmxlKSk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgiV0xDX1NFVF9SQURJTyBlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfRVJSKCJXTENfU0VUX1JBRElPIGVycm9yICglZClcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC0xNDY4LDcgKzE0NjMsNyBAQAogCWVyciA9IHdsX2Rldl9pbnR2YXJfc2V0KG5kZXYsICJxdHhwb3dlciIsCiAJCQkoczMyKSAoYmNtX213X3RvX3FkYm0odHhwd3JtdykpKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJxdHhwb3dlciBlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfRVJSKCJxdHhwb3dlciBlcnJvciAoJWQpXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAl3bC0+Y29uZi0+dHhfcG93ZXIgPSBkYm07CkBAIC0xNDg3LDcgKzE0ODIsNyBAQAogCUNIRUNLX1NZU19VUCgpOwogCWVyciA9IHdsX2Rldl9pbnR2YXJfZ2V0KG5kZXYsICJxdHhwb3dlciIsICZ0eHB3cmRibSk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgiZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0VSUigiZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJcmVzdWx0ID0gKHU4KSAodHhwd3JkYm0gJiB+V0xfVFhQV1JfT1ZFUlJJREUpOwpAQCAtMTUwNCwxMiArMTQ5OSwxMiBAQAogCXMzMiB3c2VjOwogCXMzMiBlcnIgPSAwOwogCi0JV0xfREJHKCgia2V5IGluZGV4ICglZClcbiIsIGtleV9pZHgpKTsKKwlXTF9EQkcoImtleSBpbmRleCAoJWQpXG4iLCBrZXlfaWR4KTsKIAlDSEVDS19TWVNfVVAoKTsKIAogCWVyciA9IHdsX2Rldl9pb2N0bChkZXYsIFdMQ19HRVRfV1NFQywgJndzZWMsIHNpemVvZih3c2VjKSk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgiV0xDX0dFVF9XU0VDIGVycm9yICglZClcbiIsIGVycikpOworCQlXTF9FUlIoIldMQ19HRVRfV1NFQyBlcnJvciAoJWQpXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAl3c2VjID0gZHRvaDMyKHdzZWMpOwpAQCAtMTUyMCw3ICsxNTE1LDcgQEAKIAkJZXJyID0gd2xfZGV2X2lvY3RsKGRldiwgV0xDX1NFVF9LRVlfUFJJTUFSWSwgJmluZGV4LAogCQkJCXNpemVvZihpbmRleCkpOwogCQlpZiAodW5saWtlbHkoZXJyKSkgewotCQkJV0xfRVJSKCgiZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCQlXTF9FUlIoImVycm9yICglZClcbiIsIGVycik7CiAJCX0KIAl9CiAJcmV0dXJuIGVycjsKQEAgLTE1MzcsOCArMTUzMiw4IEBACiAJa2V5LmluZGV4ID0gKHUzMikga2V5X2lkeDsKIAkvKiBJbnN0ZWFkIG9mIGJjYXN0IGZvciBlYSBhZGRyZXNzIGZvciBkZWZhdWx0IHdlcCBrZXlzLAogCQkgZHJpdmVyIG5lZWRzIGl0IHRvIGJlIE51bGwgKi8KLQlpZiAoIUVUSEVSX0lTTVVMVEkobWFjX2FkZHIpKQotCQltZW1jcHkoKGNoYXIgKikma2V5LmVhLCAodm9pZCAqKW1hY19hZGRyLCBFVEhFUl9BRERSX0xFTik7CisJaWYgKCFpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihtYWNfYWRkcikpCisJCW1lbWNweSgoY2hhciAqKSZrZXkuZWEsICh2b2lkICopbWFjX2FkZHIsIEVUSF9BTEVOKTsKIAlrZXkubGVuID0gKHUzMikgcGFyYW1zLT5rZXlfbGVuOwogCS8qIGNoZWNrIGZvciBrZXkgaW5kZXggY2hhbmdlICovCiAJaWYgKGtleS5sZW4gPT0gMCkgewpAQCAtMTU0NiwxNiArMTU0MSwxNiBAQAogCQlzd2FwX2tleV9mcm9tX0JFKCZrZXkpOwogCQllcnIgPSB3bF9kZXZfaW9jdGwoZGV2LCBXTENfU0VUX0tFWSwgJmtleSwgc2l6ZW9mKGtleSkpOwogCQlpZiAodW5saWtlbHkoZXJyKSkgewotCQkJV0xfRVJSKCgia2V5IGRlbGV0ZSBlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJCVdMX0VSUigia2V5IGRlbGV0ZSBlcnJvciAoJWQpXG4iLCBlcnIpOwogCQkJcmV0dXJuIGVycjsKIAkJfQogCX0gZWxzZSB7CiAJCWlmIChrZXkubGVuID4gc2l6ZW9mKGtleS5kYXRhKSkgewotCQkJV0xfRVJSKCgiSW52YWxpZCBrZXkgbGVuZ3RoICglZClcbiIsIGtleS5sZW4pKTsKKwkJCVdMX0VSUigiSW52YWxpZCBrZXkgbGVuZ3RoICglZClcbiIsIGtleS5sZW4pOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAotCQlXTF9EQkcoKCJTZXR0aW5nIHRoZSBrZXkgaW5kZXggJWRcbiIsIGtleS5pbmRleCkpOworCQlXTF9EQkcoIlNldHRpbmcgdGhlIGtleSBpbmRleCAlZFxuIiwga2V5LmluZGV4KTsKIAkJbWVtY3B5KGtleS5kYXRhLCBwYXJhbXMtPmtleSwga2V5Lmxlbik7CiAKIAkJaWYgKHBhcmFtcy0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVApIHsKQEAgLTE1NzksMjYgKzE1NzQsMjYgQEAKIAkJc3dpdGNoIChwYXJhbXMtPmNpcGhlcikgewogCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOgogCQkJa2V5LmFsZ28gPSBDUllQVE9fQUxHT19XRVAxOwotCQkJV0xfREJHKCgiV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDBcbiIpKTsKKwkJCVdMX0RCRygiV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDBcbiIpOwogCQkJYnJlYWs7CiAJCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OgogCQkJa2V5LmFsZ28gPSBDUllQVE9fQUxHT19XRVAxMjg7Ci0JCQlXTF9EQkcoKCJXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDRcbiIpKTsKKwkJCVdMX0RCRygiV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0XG4iKTsKIAkJCWJyZWFrOwogCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6CiAJCQlrZXkuYWxnbyA9IENSWVBUT19BTEdPX1RLSVA7Ci0JCQlXTF9EQkcoKCJXTEFOX0NJUEhFUl9TVUlURV9US0lQXG4iKSk7CisJCQlXTF9EQkcoIldMQU5fQ0lQSEVSX1NVSVRFX1RLSVBcbiIpOwogCQkJYnJlYWs7CiAJCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQUVTX0NNQUM6CiAJCQlrZXkuYWxnbyA9IENSWVBUT19BTEdPX0FFU19DQ007Ci0JCQlXTF9EQkcoKCJXTEFOX0NJUEhFUl9TVUlURV9BRVNfQ01BQ1xuIikpOworCQkJV0xfREJHKCJXTEFOX0NJUEhFUl9TVUlURV9BRVNfQ01BQ1xuIik7CiAJCQlicmVhazsKIAkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QOgogCQkJa2V5LmFsZ28gPSBDUllQVE9fQUxHT19BRVNfQ0NNOwotCQkJV0xfREJHKCgiV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUFxuIikpOworCQkJV0xfREJHKCJXTEFOX0NJUEhFUl9TVUlURV9DQ01QXG4iKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJV0xfRVJSKCgiSW52YWxpZCBjaXBoZXIgKDB4JXgpXG4iLCBwYXJhbXMtPmNpcGhlcikpOworCQkJV0xfRVJSKCJJbnZhbGlkIGNpcGhlciAoMHgleClcbiIsIHBhcmFtcy0+Y2lwaGVyKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCXN3YXBfa2V5X2Zyb21fQkUoJmtleSk7CkBAIC0xNjA2LDcgKzE2MDEsNyBAQAogCQlkaGRfd2FpdF9wZW5kODAyMXgoZGV2KTsKIAkJZXJyID0gd2xfZGV2X2lvY3RsKGRldiwgV0xDX1NFVF9LRVksICZrZXksIHNpemVvZihrZXkpKTsKIAkJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJCVdMX0VSUigoIldMQ19TRVRfS0VZIGVycm9yICglZClcbiIsIGVycikpOworCQkJV0xfRVJSKCJXTENfU0VUX0tFWSBlcnJvciAoJWQpXG4iLCBlcnIpOwogCQkJcmV0dXJuIGVycjsKIAkJfQogCX0KQEAgLTE2MjMsNyArMTYxOCw3IEBACiAJczMyIHdzZWM7CiAJczMyIGVyciA9IDA7CiAKLQlXTF9EQkcoKCJrZXkgaW5kZXggKCVkKVxuIiwga2V5X2lkeCkpOworCVdMX0RCRygia2V5IGluZGV4ICglZClcbiIsIGtleV9pZHgpOwogCUNIRUNLX1NZU19VUCgpOwogCiAJaWYgKG1hY19hZGRyKQpAQCAtMTYzNCw3ICsxNjI5LDcgQEAKIAlrZXkuaW5kZXggPSAodTMyKSBrZXlfaWR4OwogCiAJaWYgKHVubGlrZWx5KGtleS5sZW4gPiBzaXplb2Yoa2V5LmRhdGEpKSkgewotCQlXTF9FUlIoKCJUb28gbG9uZyBrZXkgbGVuZ3RoICgldSlcbiIsIGtleS5sZW4pKTsKKwkJV0xfRVJSKCJUb28gbG9uZyBrZXkgbGVuZ3RoICgldSlcbiIsIGtleS5sZW4pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJbWVtY3B5KGtleS5kYXRhLCBwYXJhbXMtPmtleSwga2V5Lmxlbik7CkBAIC0xNjQzLDI2ICsxNjM4LDI2IEBACiAJc3dpdGNoIChwYXJhbXMtPmNpcGhlcikgewogCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA6CiAJCWtleS5hbGdvID0gQ1JZUFRPX0FMR09fV0VQMTsKLQkJV0xfREJHKCgiV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDBcbiIpKTsKKwkJV0xfREJHKCJXTEFOX0NJUEhFUl9TVUlURV9XRVA0MFxuIik7CiAJCWJyZWFrOwogCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OgogCQlrZXkuYWxnbyA9IENSWVBUT19BTEdPX1dFUDEyODsKLQkJV0xfREJHKCgiV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0XG4iKSk7CisJCVdMX0RCRygiV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0XG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOgogCQlrZXkuYWxnbyA9IENSWVBUT19BTEdPX1RLSVA7Ci0JCVdMX0RCRygoIldMQU5fQ0lQSEVSX1NVSVRFX1RLSVBcbiIpKTsKKwkJV0xfREJHKCJXTEFOX0NJUEhFUl9TVUlURV9US0lQXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9BRVNfQ01BQzoKIAkJa2V5LmFsZ28gPSBDUllQVE9fQUxHT19BRVNfQ0NNOwotCQlXTF9EQkcoKCJXTEFOX0NJUEhFUl9TVUlURV9BRVNfQ01BQ1xuIikpOworCQlXTF9EQkcoIldMQU5fQ0lQSEVSX1NVSVRFX0FFU19DTUFDXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QOgogCQlrZXkuYWxnbyA9IENSWVBUT19BTEdPX0FFU19DQ007Ci0JCVdMX0RCRygoIldMQU5fQ0lQSEVSX1NVSVRFX0NDTVBcbiIpKTsKKwkJV0xfREJHKCJXTEFOX0NJUEhFUl9TVUlURV9DQ01QXG4iKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJV0xfRVJSKCgiSW52YWxpZCBjaXBoZXIgKDB4JXgpXG4iLCBwYXJhbXMtPmNpcGhlcikpOworCQlXTF9FUlIoIkludmFsaWQgY2lwaGVyICgweCV4KVxuIiwgcGFyYW1zLT5jaXBoZXIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTE2NzAsMjEgKzE2NjUsMjEgQEAKIAlzd2FwX2tleV9mcm9tX0JFKCZrZXkpOwogCWVyciA9IHdsX2Rldl9pb2N0bChkZXYsIFdMQ19TRVRfS0VZLCAma2V5LCBzaXplb2Yoa2V5KSk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgiV0xDX1NFVF9LRVkgZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0VSUigiV0xDX1NFVF9LRVkgZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKIAl2YWwgPSBXRVBfRU5BQkxFRDsKIAllcnIgPSB3bF9kZXZfaW50dmFyX2dldChkZXYsICJ3c2VjIiwgJndzZWMpOwogCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigoImdldCB3c2VjIGVycm9yICglZClcbiIsIGVycikpOworCQlXTF9FUlIoImdldCB3c2VjIGVycm9yICglZClcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCXdzZWMgJj0gfihXRVBfRU5BQkxFRCk7CiAJd3NlYyB8PSB2YWw7CiAJZXJyID0gd2xfZGV2X2ludHZhcl9zZXQoZGV2LCAid3NlYyIsIHdzZWMpOwogCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigoInNldCB3c2VjIGVycm9yICglZClcbiIsIGVycikpOworCQlXTF9FUlIoInNldCB3c2VjIGVycm9yICglZClcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC0xNjkyLDcgKzE2ODcsNyBAQAogCXZhbCA9IGh0b2QzMih2YWwpOwogCWVyciA9IHdsX2Rldl9pb2N0bChkZXYsIFdMQ19TRVRfQVVUSCwgJnZhbCwgc2l6ZW9mKHZhbCkpOwogCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigoIldMQ19TRVRfQVVUSCBlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfRVJSKCJXTENfU0VUX0FVVEggZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJcmV0dXJuIGVycjsKQEAgLTE3MTQsNyArMTcwOSw3IEBACiAJa2V5LmZsYWdzID0gV0xfUFJJTUFSWV9LRVk7CiAJa2V5LmFsZ28gPSBDUllQVE9fQUxHT19PRkY7CiAKLQlXTF9EQkcoKCJrZXkgaW5kZXggKCVkKVxuIiwga2V5X2lkeCkpOworCVdMX0RCRygia2V5IGluZGV4ICglZClcbiIsIGtleV9pZHgpOwogCS8qIFNldCB0aGUgbmV3IGtleS9pbmRleCAqLwogCXN3YXBfa2V5X2Zyb21fQkUoJmtleSk7CiAJZXJyID0gd2xfZGV2X2lvY3RsKGRldiwgV0xDX1NFVF9LRVksICZrZXksIHNpemVvZihrZXkpKTsKQEAgLTE3MjIsMTAgKzE3MTcsMTAgQEAKIAkJaWYgKGVyciA9PSAtRUlOVkFMKSB7CiAJCQlpZiAoa2V5LmluZGV4ID49IERPVDExX01BWF9ERUZBVUxUX0tFWVMpIHsKIAkJCQkvKiB3ZSBpZ25vcmUgdGhpcyBrZXkgaW5kZXggaW4gdGhpcyBjYXNlICovCi0JCQkJV0xfREJHKCgiaW52YWxpZCBrZXkgaW5kZXggKCVkKVxuIiwga2V5X2lkeCkpOworCQkJCVdMX0RCRygiaW52YWxpZCBrZXkgaW5kZXggKCVkKVxuIiwga2V5X2lkeCk7CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQlXTF9FUlIoKCJXTENfU0VUX0tFWSBlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJCVdMX0VSUigiV0xDX1NFVF9LRVkgZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJfQogCQlyZXR1cm4gZXJyOwogCX0KQEAgLTE3MzMsMTQgKzE3MjgsMTQgQEAKIAl2YWwgPSAwOwogCWVyciA9IHdsX2Rldl9pbnR2YXJfZ2V0KGRldiwgIndzZWMiLCAmd3NlYyk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgiZ2V0IHdzZWMgZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0VSUigiZ2V0IHdzZWMgZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJd3NlYyAmPSB+KFdFUF9FTkFCTEVEKTsKIAl3c2VjIHw9IHZhbDsKIAllcnIgPSB3bF9kZXZfaW50dmFyX3NldChkZXYsICJ3c2VjIiwgd3NlYyk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgic2V0IHdzZWMgZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0VSUigic2V0IHdzZWMgZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTE3NDgsNyArMTc0Myw3IEBACiAJdmFsID0gaHRvZDMyKHZhbCk7CiAJZXJyID0gd2xfZGV2X2lvY3RsKGRldiwgV0xDX1NFVF9BVVRILCAmdmFsLCBzaXplb2YodmFsKSk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgiV0xDX1NFVF9BVVRIIGVycm9yICglZClcbiIsIGVycikpOworCQlXTF9FUlIoIldMQ19TRVRfQVVUSCBlcnJvciAoJWQpXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAlyZXR1cm4gZXJyOwpAQCAtMTc2Niw3ICsxNzYxLDcgQEAKIAlzMzIgd3NlYzsKIAlzMzIgZXJyID0gMDsKIAotCVdMX0RCRygoImtleSBpbmRleCAoJWQpXG4iLCBrZXlfaWR4KSk7CisJV0xfREJHKCJrZXkgaW5kZXggKCVkKVxuIiwga2V5X2lkeCk7CiAJQ0hFQ0tfU1lTX1VQKCk7CiAKIAltZW1zZXQoJmtleSwgMCwgc2l6ZW9mKGtleSkpOwpAQCAtMTc3OCw3ICsxNzczLDcgQEAKIAogCWVyciA9IHdsX2Rldl9pb2N0bChkZXYsIFdMQ19HRVRfV1NFQywgJndzZWMsIHNpemVvZih3c2VjKSk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgiV0xDX0dFVF9XU0VDIGVycm9yICglZClcbiIsIGVycikpOworCQlXTF9FUlIoIldMQ19HRVRfV1NFQyBlcnJvciAoJWQpXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAl3c2VjID0gZHRvaDMyKHdzZWMpOwpAQCAtMTc4NywyMiArMTc4MiwyMiBAQAogCQlzZWMgPSB3bF9yZWFkX3Byb2Yod2wsIFdMX1BST0ZfU0VDKTsKIAkJaWYgKHNlYy0+Y2lwaGVyX3BhaXJ3aXNlICYgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDApIHsKIAkJCXBhcmFtcy5jaXBoZXIgPSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDsKLQkJCVdMX0RCRygoIldMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwXG4iKSk7CisJCQlXTF9EQkcoIldMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwXG4iKTsKIAkJfSBlbHNlIGlmIChzZWMtPmNpcGhlcl9wYWlyd2lzZSAmIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNCkgewogCQkJcGFyYW1zLmNpcGhlciA9IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNDsKLQkJCVdMX0RCRygoIldMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNFxuIikpOworCQkJV0xfREJHKCJXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDRcbiIpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgVEtJUF9FTkFCTEVEOgogCQlwYXJhbXMuY2lwaGVyID0gV0xBTl9DSVBIRVJfU1VJVEVfVEtJUDsKLQkJV0xfREJHKCgiV0xBTl9DSVBIRVJfU1VJVEVfVEtJUFxuIikpOworCQlXTF9EQkcoIldMQU5fQ0lQSEVSX1NVSVRFX1RLSVBcbiIpOwogCQlicmVhazsKIAljYXNlIEFFU19FTkFCTEVEOgogCQlwYXJhbXMuY2lwaGVyID0gV0xBTl9DSVBIRVJfU1VJVEVfQUVTX0NNQUM7Ci0JCVdMX0RCRygoIldMQU5fQ0lQSEVSX1NVSVRFX0FFU19DTUFDXG4iKSk7CisJCVdMX0RCRygiV0xBTl9DSVBIRVJfU1VJVEVfQUVTX0NNQUNcbiIpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlXTF9FUlIoKCJJbnZhbGlkIGFsZ28gKDB4JXgpXG4iLCB3c2VjKSk7CisJCVdMX0VSUigiSW52YWxpZCBhbGdvICgweCV4KVxuIiwgd3NlYyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTgxNCw3ICsxODA5LDcgQEAKIHdsX2NmZzgwMjExX2NvbmZpZ19kZWZhdWx0X21nbXRfa2V5KHN0cnVjdCB3aXBoeSAqd2lwaHksCiAJCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGtleV9pZHgpCiB7Ci0JV0xfSU5GTygoIk5vdCBzdXBwb3J0ZWRcbiIpKTsKKwlXTF9JTkZPKCJOb3Qgc3VwcG9ydGVkXG4iKTsKIAlDSEVDS19TWVNfVVAoKTsKIAlyZXR1cm4gLUVPUE5PVFNVUFA7CiB9CkBAIC0xODMxLDIwICsxODI2LDIwIEBACiAKIAlDSEVDS19TWVNfVVAoKTsKIAlpZiAodW5saWtlbHkKLQkgICAgKG1lbWNtcChtYWMsIHdsX3JlYWRfcHJvZih3bCwgV0xfUFJPRl9CU1NJRCksIEVUSEVSX0FERFJfTEVOKSkpIHsKLQkJV0xfRVJSKCgiV3JvbmcgTWFjIGFkZHJlc3NcbiIpKTsKKwkgICAgKG1lbWNtcChtYWMsIHdsX3JlYWRfcHJvZih3bCwgV0xfUFJPRl9CU1NJRCksIEVUSF9BTEVOKSkpIHsKKwkJV0xfRVJSKCJXcm9uZyBNYWMgYWRkcmVzc1xuIik7CiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAogCS8qIFJlcG9ydCB0aGUgY3VycmVudCB0eCByYXRlICovCiAJZXJyID0gd2xfZGV2X2lvY3RsKGRldiwgV0xDX0dFVF9SQVRFLCAmcmF0ZSwgc2l6ZW9mKHJhdGUpKTsKIAlpZiAoZXJyKSB7Ci0JCVdMX0VSUigoIkNvdWxkIG5vdCBnZXQgcmF0ZSAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfRVJSKCJDb3VsZCBub3QgZ2V0IHJhdGUgKCVkKVxuIiwgZXJyKTsKIAl9IGVsc2UgewogCQlyYXRlID0gZHRvaDMyKHJhdGUpOwogCQlzaW5mby0+ZmlsbGVkIHw9IFNUQVRJT05fSU5GT19UWF9CSVRSQVRFOwogCQlzaW5mby0+dHhyYXRlLmxlZ2FjeSA9IHJhdGUgKiA1OwotCQlXTF9EQkcoKCJSYXRlICVkIE1icHNcbiIsIChyYXRlIC8gMikpKTsKKwkJV0xfREJHKCJSYXRlICVkIE1icHNcbiIsIHJhdGUgLyAyKTsKIAl9CiAKIAlpZiAodGVzdF9iaXQoV0xfU1RBVFVTX0NPTk5FQ1RFRCwgJndsLT5zdGF0dXMpKSB7CkBAIC0xODUyLDEzICsxODQ3LDEzIEBACiAJCWVyciA9IHdsX2Rldl9pb2N0bChkZXYsIFdMQ19HRVRfUlNTSSwgJnNjYl92YWwsCiAJCQkJc2l6ZW9mKHNjYl92YWxfdCkpOwogCQlpZiAodW5saWtlbHkoZXJyKSkgewotCQkJV0xfRVJSKCgiQ291bGQgbm90IGdldCByc3NpICglZClcbiIsIGVycikpOworCQkJV0xfRVJSKCJDb3VsZCBub3QgZ2V0IHJzc2kgKCVkKVxuIiwgZXJyKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAkJcnNzaSA9IGR0b2gzMihzY2JfdmFsLnZhbCk7CiAJCXNpbmZvLT5maWxsZWQgfD0gU1RBVElPTl9JTkZPX1NJR05BTDsKIAkJc2luZm8tPnNpZ25hbCA9IHJzc2k7Ci0JCVdMX0RCRygoIlJTU0kgJWQgZEJtXG4iLCByc3NpKSk7CisJCVdMX0RCRygiUlNTSSAlZCBkQm1cbiIsIHJzc2kpOwogCX0KIAogCXJldHVybiBlcnI7CkBAIC0xODc0LDEzICsxODY5LDEzIEBACiAJQ0hFQ0tfU1lTX1VQKCk7CiAJcG0gPSBlbmFibGVkID8gUE1fRkFTVCA6IFBNX09GRjsKIAlwbSA9IGh0b2QzMihwbSk7Ci0JV0xfREJHKCgicG93ZXIgc2F2ZSAlc1xuIiwgKHBtID8gImVuYWJsZWQiIDogImRpc2FibGVkIikpKTsKKwlXTF9EQkcoInBvd2VyIHNhdmUgJXNcbiIsIChwbSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpKTsKIAllcnIgPSB3bF9kZXZfaW9jdGwoZGV2LCBXTENfU0VUX1BNLCAmcG0sIHNpemVvZihwbSkpOwogCWlmICh1bmxpa2VseShlcnIpKSB7CiAJCWlmIChlcnIgPT0gLUVOT0RFVikKLQkJCVdMX0RCRygoIm5ldF9kZXZpY2UgaXMgbm90IHJlYWR5IHlldFxuIikpOworCQkJV0xfREJHKCJuZXRfZGV2aWNlIGlzIG5vdCByZWFkeSB5ZXRcbiIpOwogCQllbHNlCi0JCQlXTF9FUlIoKCJlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJCVdMX0VSUigiZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJcmV0dXJuIGVycjsKQEAgLTE5MzIsNyArMTkyNyw3IEBACiAJZXJyID0gd2xfZGV2X2lvY3RsKGRldiwgV0xDX0dFVF9DVVJSX1JBVEVTRVQsICZyYXRlc2V0LAogCQkJc2l6ZW9mKHJhdGVzZXQpKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJjb3VsZCBub3QgZ2V0IGN1cnJlbnQgcmF0ZXNldCAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfRVJSKCJjb3VsZCBub3QgZ2V0IGN1cnJlbnQgcmF0ZXNldCAoJWQpXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtMTk1Miw3ICsxOTQ3LDcgQEAKIAkJcmF0ZSA9IHZhbCAvIDUwMDAwMDsKIAl9CiAKLQlXTF9EQkcoKCJyYXRlICVkIG1icHNcbiIsIChyYXRlIC8gMikpKTsKKwlXTF9EQkcoInJhdGUgJWQgbWJwc1xuIiwgcmF0ZSAvIDIpOwogCiAJLyoKIAkgKgpAQCAtMTk2Miw3ICsxOTU3LDcgQEAKIAllcnJfYmcgPSB3bF9kZXZfaW50dmFyX3NldChkZXYsICJiZ19yYXRlIiwgcmF0ZSk7CiAJZXJyX2EgPSB3bF9kZXZfaW50dmFyX3NldChkZXYsICJhX3JhdGUiLCByYXRlKTsKIAlpZiAodW5saWtlbHkoZXJyX2JnICYmIGVycl9hKSkgewotCQlXTF9FUlIoKCJjb3VsZCBub3Qgc2V0IGZpeGVkIHJhdGUgKCVkKSAoJWQpXG4iLCBlcnJfYmcsIGVycl9hKSk7CisJCVdMX0VSUigiY291bGQgbm90IHNldCBmaXhlZCByYXRlICglZCkgKCVkKVxuIiwgZXJyX2JnLCBlcnJfYSk7CiAJCXJldHVybiBlcnJfYmcgfCBlcnJfYTsKIAl9CiAKQEAgLTIwMDcsMTIgKzIwMDIsMTIgQEAKIHsKIAlpbnQgaSwgajsKIAotCVdMX0RCRygoIk5vIG9mIGVsZW1lbnRzICVkXG4iLCBwbWtfbGlzdC0+cG1raWRzLm5wbWtpZCkpOworCVdMX0RCRygiTm8gb2YgZWxlbWVudHMgJWRcbiIsIHBta19saXN0LT5wbWtpZHMubnBta2lkKTsKIAlmb3IgKGkgPSAwOyBpIDwgcG1rX2xpc3QtPnBta2lkcy5ucG1raWQ7IGkrKykgewotCQlXTF9EQkcoKCJQTUtJRFslZF06ICVwTSA9XG4iLCBpLAotCQkJJnBta19saXN0LT5wbWtpZHMucG1raWRbaV0uQlNTSUQpKTsKKwkJV0xfREJHKCJQTUtJRFslZF06ICVwTSA9XG4iLCBpLAorCQkgICAgICAgJnBta19saXN0LT5wbWtpZHMucG1raWRbaV0uQlNTSUQpOwogCQlmb3IgKGogPSAwOyBqIDwgV1BBMl9QTUtJRF9MRU47IGorKykgewotCQkJV0xfREJHKCgiJTAyeFxuIiwgcG1rX2xpc3QtPnBta2lkcy5wbWtpZFtpXS5QTUtJRFtqXSkpOworCQkJV0xfREJHKCIlMDJ4XG4iLCBwbWtfbGlzdC0+cG1raWRzLnBta2lkW2ldLlBNS0lEW2pdKTsKIAkJfQogCX0KIAlpZiAobGlrZWx5KCFlcnIpKSB7CkBAIC0yMDM0LDExICsyMDI5LDExIEBACiAJQ0hFQ0tfU1lTX1VQKCk7CiAJZm9yIChpID0gMDsgaSA8IHdsLT5wbWtfbGlzdC0+cG1raWRzLm5wbWtpZDsgaSsrKQogCQlpZiAoIW1lbWNtcChwbWtzYS0+YnNzaWQsICZ3bC0+cG1rX2xpc3QtPnBta2lkcy5wbWtpZFtpXS5CU1NJRCwKLQkJCSAgICBFVEhFUl9BRERSX0xFTikpCisJCQkgICAgRVRIX0FMRU4pKQogCQkJYnJlYWs7CiAJaWYgKGkgPCBXTF9OVU1fUE1LSURTX01BWCkgewogCQltZW1jcHkoJndsLT5wbWtfbGlzdC0+cG1raWRzLnBta2lkW2ldLkJTU0lELCBwbWtzYS0+YnNzaWQsCi0JCSAgICAgICBFVEhFUl9BRERSX0xFTik7CisJCSAgICAgICBFVEhfQUxFTik7CiAJCW1lbWNweSgmd2wtPnBta19saXN0LT5wbWtpZHMucG1raWRbaV0uUE1LSUQsIHBta3NhLT5wbWtpZCwKIAkJICAgICAgIFdQQTJfUE1LSURfTEVOKTsKIAkJaWYgKGkgPT0gd2wtPnBta19saXN0LT5wbWtpZHMubnBta2lkKQpAQCAtMjA0NiwxMiArMjA0MSwxMiBAQAogCX0gZWxzZSB7CiAJCWVyciA9IC1FSU5WQUw7CiAJfQotCVdMX0RCRygoInNldF9wbWtzYSxJV19QTUtTQV9BREQgLSBQTUtJRDogJXBNID1cbiIsCi0JCSZ3bC0+cG1rX2xpc3QtPnBta2lkcy5wbWtpZFt3bC0+cG1rX2xpc3QtPnBta2lkcy5ucG1raWRdLkJTU0lEKSk7CisJV0xfREJHKCJzZXRfcG1rc2EsSVdfUE1LU0FfQUREIC0gUE1LSUQ6ICVwTSA9XG4iLAorCSAgICAgICAmd2wtPnBta19saXN0LT5wbWtpZHMucG1raWRbd2wtPnBta19saXN0LT5wbWtpZHMubnBta2lkXS5CU1NJRCk7CiAJZm9yIChpID0gMDsgaSA8IFdQQTJfUE1LSURfTEVOOyBpKyspIHsKLQkJV0xfREJHKCgiJTAyeFxuIiwKLQkJCXdsLT5wbWtfbGlzdC0+cG1raWRzLnBta2lkW3dsLT5wbWtfbGlzdC0+cG1raWRzLm5wbWtpZF0uCi0JCQlQTUtJRFtpXSkpOworCQlXTF9EQkcoIiUwMnhcbiIsCisJCSAgICAgICB3bC0+cG1rX2xpc3QtPnBta2lkcy5wbWtpZFt3bC0+cG1rX2xpc3QtPnBta2lkcy5ucG1raWRdLgorCQkgICAgICAgUE1LSURbaV0pOwogCX0KIAogCWVyciA9IHdsX3VwZGF0ZV9wbWtsaXN0KGRldiwgd2wtPnBta19saXN0LCBlcnIpOwpAQCAtMjA2OSwxOSArMjA2NCwxOSBAQAogCWludCBpOwogCiAJQ0hFQ0tfU1lTX1VQKCk7Ci0JbWVtY3B5KCZwbWtpZC5wbWtpZFswXS5CU1NJRCwgcG1rc2EtPmJzc2lkLCBFVEhFUl9BRERSX0xFTik7CisJbWVtY3B5KCZwbWtpZC5wbWtpZFswXS5CU1NJRCwgcG1rc2EtPmJzc2lkLCBFVEhfQUxFTik7CiAJbWVtY3B5KCZwbWtpZC5wbWtpZFswXS5QTUtJRCwgcG1rc2EtPnBta2lkLCBXUEEyX1BNS0lEX0xFTik7CiAKLQlXTF9EQkcoKCJkZWxfcG1rc2EsSVdfUE1LU0FfUkVNT1ZFIC0gUE1LSUQ6ICVwTSA9XG4iLAotCQkmcG1raWQucG1raWRbMF0uQlNTSUQpKTsKKwlXTF9EQkcoImRlbF9wbWtzYSxJV19QTUtTQV9SRU1PVkUgLSBQTUtJRDogJXBNID1cbiIsCisJICAgICAgICZwbWtpZC5wbWtpZFswXS5CU1NJRCk7CiAJZm9yIChpID0gMDsgaSA8IFdQQTJfUE1LSURfTEVOOyBpKyspIHsKLQkJV0xfREJHKCgiJTAyeFxuIiwgcG1raWQucG1raWRbMF0uUE1LSURbaV0pKTsKKwkJV0xfREJHKCIlMDJ4XG4iLCBwbWtpZC5wbWtpZFswXS5QTUtJRFtpXSk7CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IHdsLT5wbWtfbGlzdC0+cG1raWRzLm5wbWtpZDsgaSsrKQogCQlpZiAoIW1lbWNtcAogCQkgICAgKHBta3NhLT5ic3NpZCwgJndsLT5wbWtfbGlzdC0+cG1raWRzLnBta2lkW2ldLkJTU0lELAotCQkgICAgIEVUSEVSX0FERFJfTEVOKSkKKwkJICAgICBFVEhfQUxFTikpCiAJCQlicmVhazsKIAogCWlmICgod2wtPnBta19saXN0LT5wbWtpZHMubnBta2lkID4gMCkKQEAgLTIwOTAsNyArMjA4NSw3IEBACiAJCWZvciAoOyBpIDwgKHdsLT5wbWtfbGlzdC0+cG1raWRzLm5wbWtpZCAtIDEpOyBpKyspIHsKIAkJCW1lbWNweSgmd2wtPnBta19saXN0LT5wbWtpZHMucG1raWRbaV0uQlNTSUQsCiAJCQkgICAgICAgJndsLT5wbWtfbGlzdC0+cG1raWRzLnBta2lkW2kgKyAxXS5CU1NJRCwKLQkJCSAgICAgICBFVEhFUl9BRERSX0xFTik7CisJCQkgICAgICAgRVRIX0FMRU4pOwogCQkJbWVtY3B5KCZ3bC0+cG1rX2xpc3QtPnBta2lkcy5wbWtpZFtpXS5QTUtJRCwKIAkJCSAgICAgICAmd2wtPnBta19saXN0LT5wbWtpZHMucG1raWRbaSArIDFdLlBNS0lELAogCQkJICAgICAgIFdQQTJfUE1LSURfTEVOKTsKQEAgLTIxNjgsMTMgKzIxNjMsMTMgQEAKIAogCXdkZXYgPSBremFsbG9jKHNpemVvZigqd2RldiksIEdGUF9LRVJORUwpOwogCWlmICh1bmxpa2VseSghd2RldikpIHsKLQkJV0xfRVJSKCgiQ291bGQgbm90IGFsbG9jYXRlIHdpcmVsZXNzIGRldmljZVxuIikpOworCQlXTF9FUlIoIkNvdWxkIG5vdCBhbGxvY2F0ZSB3aXJlbGVzcyBkZXZpY2VcbiIpOwogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAl9CiAJd2Rldi0+d2lwaHkgPQogCSAgICB3aXBoeV9uZXcoJndsX2NmZzgwMjExX29wcywgc2l6ZW9mKHN0cnVjdCB3bF9wcml2KSArIHNpemVvZl9pZmFjZSk7CiAJaWYgKHVubGlrZWx5KCF3ZGV2LT53aXBoeSkpIHsKLQkJV0xfRVJSKCgiQ291bGRuIG5vdCBhbGxvY2F0ZSB3aXBoeSBkZXZpY2VcbiIpKTsKKwkJV0xfRVJSKCJDb3VsZG4gbm90IGFsbG9jYXRlIHdpcGh5IGRldmljZVxuIik7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gd2lwaHlfbmV3X291dDsKIAl9CkBAIC0yMjA0LDcgKzIxOTksNyBAQAogI2VuZGlmCQkJCS8qICFXTF9QT1dFUlNBVkVfRElTQUJMRUQgKi8KIAllcnIgPSB3aXBoeV9yZWdpc3Rlcih3ZGV2LT53aXBoeSk7CiAJaWYgKHVubGlrZWx5KGVyciA8IDApKSB7Ci0JCVdMX0VSUigoIkNvdWxkbiBub3QgcmVnaXN0ZXIgd2lwaHkgZGV2aWNlICglZClcbiIsIGVycikpOworCQlXTF9FUlIoIkNvdWxkbiBub3QgcmVnaXN0ZXIgd2lwaHkgZGV2aWNlICglZClcbiIsIGVycik7CiAJCWdvdG8gd2lwaHlfcmVnaXN0ZXJfb3V0OwogCX0KIAlyZXR1cm4gd2RldjsKQEAgLTIyMjMsNyArMjIxOCw3IEBACiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IHdsX3RvX3dkZXYod2wpOwogCiAJaWYgKHVubGlrZWx5KCF3ZGV2KSkgewotCQlXTF9FUlIoKCJ3ZGV2IGlzIGludmFsaWRcbiIpKTsKKwkJV0xfRVJSKCJ3ZGV2IGlzIGludmFsaWRcbiIpOwogCQlyZXR1cm47CiAJfQogCXdpcGh5X3VucmVnaXN0ZXIod2Rldi0+d2lwaHkpOwpAQCAtMjI0MSwxMSArMjIzNiwxMSBAQAogCiAJYnNzX2xpc3QgPSB3bC0+YnNzX2xpc3Q7CiAJaWYgKHVubGlrZWx5KGJzc19saXN0LT52ZXJzaW9uICE9IFdMX0JTU19JTkZPX1ZFUlNJT04pKSB7Ci0JCVdMX0VSUigoIlZlcnNpb24gJWQgIT0gV0xfQlNTX0lORk9fVkVSU0lPTlxuIiwKLQkJCWJzc19saXN0LT52ZXJzaW9uKSk7CisJCVdMX0VSUigiVmVyc2lvbiAlZCAhPSBXTF9CU1NfSU5GT19WRVJTSU9OXG4iLAorCQkgICAgICAgYnNzX2xpc3QtPnZlcnNpb24pOwogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQotCVdMX0RCRygoInNjYW5uZWQgQVAgY291bnQgKCVkKVxuIiwgYnNzX2xpc3QtPmNvdW50KSk7CisJV0xfREJHKCJzY2FubmVkIEFQIGNvdW50ICglZClcbiIsIGJzc19saXN0LT5jb3VudCk7CiAJYmkgPSBuZXh0X2Jzcyhic3NfbGlzdCwgYmkpOwogCWZvcl9lYWNoX2Jzcyhic3NfbGlzdCwgYmksIGkpIHsKIAkJZXJyID0gd2xfaW5mb3JtX3NpbmdsZV9ic3Mod2wsIGJpKTsKQEAgLTIyNzAsMTQgKzIyNjUsMTQgQEAKIAlzMzIgZXJyID0gMDsKIAogCWlmICh1bmxpa2VseShkdG9oMzIoYmktPmxlbmd0aCkgPiBXTF9CU1NfSU5GT19NQVgpKSB7Ci0JCVdMX0RCRygoIkJlYWNvbiBpcyBsYXJnZXIgdGhhbiBidWZmZXIuIERpc2NhcmRpbmdcbiIpKTsKKwkJV0xfREJHKCJCZWFjb24gaXMgbGFyZ2VyIHRoYW4gYnVmZmVyLiBEaXNjYXJkaW5nXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJbm90aWZfYnNzX2luZm8gPQogCSAgICBremFsbG9jKHNpemVvZigqbm90aWZfYnNzX2luZm8pICsgc2l6ZW9mKCptZ210KSAtIHNpemVvZih1OCkgKwogCQkgICAgV0xfQlNTX0lORk9fTUFYLCBHRlBfS0VSTkVMKTsKIAlpZiAodW5saWtlbHkoIW5vdGlmX2Jzc19pbmZvKSkgewotCQlXTF9FUlIoKCJub3RpZl9ic3NfaW5mbyBhbGxvYyBmYWlsZWRcbiIpKTsKKwkJV0xfRVJSKCJub3RpZl9ic3NfaW5mbyBhbGxvYyBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKilub3RpZl9ic3NfaW5mby0+ZnJhbWVfYnVmOwpAQCAtMjI4OSw3ICsyMjg0LDcgQEAKIAllbHNlCiAJCWJhbmQgPSB3aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl07CiAJbm90aWZfYnNzX2luZm8tPnJzc2kgPSBiaS0+UlNTSTsKLQltZW1jcHkobWdtdC0+YnNzaWQsICZiaS0+QlNTSUQsIEVUSEVSX0FERFJfTEVOKTsKKwltZW1jcHkobWdtdC0+YnNzaWQsICZiaS0+QlNTSUQsIEVUSF9BTEVOKTsKIAltZ210X3R5cGUgPSB3bC0+YWN0aXZlX3NjYW4gPwogCQlJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUCA6IElFRUU4MDIxMV9TVFlQRV9CRUFDT047CiAJaWYgKCFtZW1jbXAoYmktPlNTSUQsIHNyLT5zc2lkLlNTSUQsIGJpLT5TU0lEX2xlbikpIHsKQEAgLTIzMjEsMTcgKzIzMTYsMTcgQEAKIAlmcmVxID0gaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KG5vdGlmX2Jzc19pbmZvLT5jaGFubmVsKTsKIAljaGFubmVsID0gaWVlZTgwMjExX2dldF9jaGFubmVsKHdpcGh5LCBmcmVxKTsKIAotCVdMX0RCRygoIlNTSUQgOiBcIiVzXCIsIHJzc2kgJWQsIGNoYW5uZWwgJWQsIGNhcGFiaWxpdHkgOiAweDA0JXgsIGJzc2lkICVwTVxuIiwKLQkJYmktPlNTSUQsCi0JCW5vdGlmX2Jzc19pbmZvLT5yc3NpLCBub3RpZl9ic3NfaW5mby0+Y2hhbm5lbCwKLQkJbWdtdC0+dS5iZWFjb24uY2FwYWJfaW5mbywgJmJpLT5CU1NJRCkpOworCVdMX0RCRygiU1NJRCA6IFwiJXNcIiwgcnNzaSAlZCwgY2hhbm5lbCAlZCwgY2FwYWJpbGl0eSA6IDB4MDQleCwgYnNzaWQgJXBNXG4iLAorCSAgICAgICBiaS0+U1NJRCwKKwkgICAgICAgbm90aWZfYnNzX2luZm8tPnJzc2ksIG5vdGlmX2Jzc19pbmZvLT5jaGFubmVsLAorCSAgICAgICBtZ210LT51LmJlYWNvbi5jYXBhYl9pbmZvLCAmYmktPkJTU0lEKTsKIAogCXNpZ25hbCA9IG5vdGlmX2Jzc19pbmZvLT5yc3NpICogMTAwOwogCWlmICh1bmxpa2VseSghY2ZnODAyMTFfaW5mb3JtX2Jzc19mcmFtZSh3aXBoeSwgY2hhbm5lbCwgbWdtdCwKIAkJCQkJCWxlMTZfdG9fY3B1CiAJCQkJCQkobm90aWZfYnNzX2luZm8tPmZyYW1lX2xlbiksCiAJCQkJCQlzaWduYWwsIEdGUF9LRVJORUwpKSkgewotCQlXTF9FUlIoKCJjZmc4MDIxMV9pbmZvcm1fYnNzX2ZyYW1lIGVycm9yXG4iKSk7CisJCVdMX0VSUigiY2ZnODAyMTFfaW5mb3JtX2Jzc19mcmFtZSBlcnJvclxuIik7CiAJCWtmcmVlKG5vdGlmX2Jzc19pbmZvKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMjM5OSwxMiArMjM5NCwxMiBAQAogCQlpZiAod2xfaXNfaWJzc21vZGUod2wpKSB7CiAJCQljZmc4MDIxMV9pYnNzX2pvaW5lZChuZGV2LCAoczggKikmZS0+YWRkciwKIAkJCQkJICAgICBHRlBfS0VSTkVMKTsKLQkJCVdMX0RCRygoImpvaW5lZCBpbiBJQlNTIG5ldHdvcmtcbiIpKTsKKwkJCVdMX0RCRygiam9pbmVkIGluIElCU1MgbmV0d29ya1xuIik7CiAJCX0gZWxzZSB7CiAJCQl3bF9ic3NfY29ubmVjdF9kb25lKHdsLCBuZGV2LCBlLCBkYXRhLCB0cnVlKTsKLQkJCVdMX0RCRygoImpvaW5lZCBpbiBCU1MgbmV0d29yayBcIiVzXCJcbiIsCi0JCQkJKChzdHJ1Y3Qgd2xjX3NzaWQgKikKLQkJCQkgd2xfcmVhZF9wcm9mKHdsLCBXTF9QUk9GX1NTSUQpKS0+U1NJRCkpOworCQkJV0xfREJHKCJqb2luZWQgaW4gQlNTIG5ldHdvcmsgXCIlc1wiXG4iLAorCQkJICAgICAgICgoc3RydWN0IHdsY19zc2lkICopCisJCQkJd2xfcmVhZF9wcm9mKHdsLCBXTF9QUk9GX1NTSUQpKS0+U1NJRCk7CiAJCX0KIAkJYWN0ID0gdHJ1ZTsKIAkJd2xfdXBkYXRlX3Byb2Yod2wsIGUsICZhY3QsIFdMX1BST0ZfQUNUKTsKQEAgLTI0NTksNyArMjQ1NCw3IEBACiAJZXJyID0gd2xfZGV2X2lvY3RsKGRldiwgV0xDX0dFVF9WQVIsICh2b2lkICopd2wtPmlvY3RsX2J1ZiwKIAkJCVdMX0lPQ1RMX0xFTl9NQVgpOwogCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigoImVycm9yICglZClcbiIsIGVycikpOworCQlXTF9FUlIoImVycm9yICglZClcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCW1lbWNweShidWYsIHdsLT5pb2N0bF9idWYsIGJ1Zl9sZW4pOwpAQCAtMjQ3OSw3ICsyNDc0LDcgQEAKIAllcnIgPSB3bF9kZXZfYnVmdmFyX2dldChuZGV2LCAiYXNzb2NfaW5mbyIsIHdsLT5leHRyYV9idWYsCiAJCQkJV0xfQVNTT0NfSU5GT19NQVgpOwogCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigoImNvdWxkIG5vdCBnZXQgYXNzb2MgaW5mbyAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfRVJSKCJjb3VsZCBub3QgZ2V0IGFzc29jIGluZm8gKCVkKVxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJYXNzb2NfaW5mbyA9IChzdHJ1Y3Qgd2xfYXNzb2NfaWVsZW4gKil3bC0+ZXh0cmFfYnVmOwpAQCAtMjQ4OSw3ICsyNDg0LDcgQEAKIAkJZXJyID0gd2xfZGV2X2J1ZnZhcl9nZXQobmRldiwgImFzc29jX3JlcV9pZXMiLCB3bC0+ZXh0cmFfYnVmLAogCQkJCQlXTF9BU1NPQ19JTkZPX01BWCk7CiAJCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCQlXTF9FUlIoKCJjb3VsZCBub3QgZ2V0IGFzc29jIHJlcSAoJWQpXG4iLCBlcnIpKTsKKwkJCVdMX0VSUigiY291bGQgbm90IGdldCBhc3NvYyByZXEgKCVkKVxuIiwgZXJyKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAkJY29ubl9pbmZvLT5yZXFfaWVfbGVuID0gcmVxX2xlbjsKQEAgLTI1MDMsNyArMjQ5OCw3IEBACiAJCWVyciA9IHdsX2Rldl9idWZ2YXJfZ2V0KG5kZXYsICJhc3NvY19yZXNwX2llcyIsIHdsLT5leHRyYV9idWYsCiAJCQkJCVdMX0FTU09DX0lORk9fTUFYKTsKIAkJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJCVdMX0VSUigoImNvdWxkIG5vdCBnZXQgYXNzb2MgcmVzcCAoJWQpXG4iLCBlcnIpKTsKKwkJCVdMX0VSUigiY291bGQgbm90IGdldCBhc3NvYyByZXNwICglZClcbiIsIGVycik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJCWNvbm5faW5mby0+cmVzcF9pZV9sZW4gPSByZXNwX2xlbjsKQEAgLTI1MTMsOCArMjUwOCw4IEBACiAJCWNvbm5faW5mby0+cmVzcF9pZV9sZW4gPSAwOwogCQljb25uX2luZm8tPnJlc3BfaWUgPSBOVUxMOwogCX0KLQlXTF9EQkcoKCJyZXEgbGVuICglZCkgcmVzcCBsZW4gKCVkKVxuIiwgY29ubl9pbmZvLT5yZXFfaWVfbGVuLAotCQljb25uX2luZm8tPnJlc3BfaWVfbGVuKSk7CisJV0xfREJHKCJyZXEgbGVuICglZCkgcmVzcCBsZW4gKCVkKVxuIiwKKwkgICAgICAgY29ubl9pbmZvLT5yZXFfaWVfbGVuLCBjb25uX2luZm8tPnJlc3BfaWVfbGVuKTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC0yNTQ3LDggKzI1NDIsOCBAQAogCQlqb2luX3BhcmFtcy0+cGFyYW1zLmNoYW5zcGVjX251bSA9CiAJCQlodG9kMzIoam9pbl9wYXJhbXMtPnBhcmFtcy5jaGFuc3BlY19udW0pOwogCi0JCVdMX0RCRygoImpvaW5fcGFyYW1zLT5wYXJhbXMuY2hhbnNwZWNfbGlzdFswXT0gJSNYLCBjaGFubmVsICVkLCBjaGFuc3BlYyAlI1hcbiIsCi0JCQlqb2luX3BhcmFtcy0+cGFyYW1zLmNoYW5zcGVjX2xpc3RbMF0sIGNoLCBjaGFuc3BlYykpOworCQlXTF9EQkcoImpvaW5fcGFyYW1zLT5wYXJhbXMuY2hhbnNwZWNfbGlzdFswXT0gJSNYLCBjaGFubmVsICVkLCBjaGFuc3BlYyAlI1hcbiIsCisJCSAgICAgICBqb2luX3BhcmFtcy0+cGFyYW1zLmNoYW5zcGVjX2xpc3RbMF0sIGNoLCBjaGFuc3BlYyk7CiAJfQogfQogCkBAIC0yNTc1LDE2ICsyNTcwLDE2IEBACiAKIAlydG5sX2xvY2soKTsKIAlpZiAodW5saWtlbHkoIWJzcykpIHsKLQkJV0xfREJHKCgiQ291bGQgbm90IGZpbmQgdGhlIEFQXG4iKSk7CisJCVdMX0RCRygiQ291bGQgbm90IGZpbmQgdGhlIEFQXG4iKTsKIAkJKih1MzIgKikgd2wtPmV4dHJhX2J1ZiA9IGh0b2QzMihXTF9FWFRSQV9CVUZfTUFYKTsKIAkJZXJyID0gd2xfZGV2X2lvY3RsKHdsX3RvX25kZXYod2wpLCBXTENfR0VUX0JTU19JTkZPLAogCQkJCXdsLT5leHRyYV9idWYsIFdMX0VYVFJBX0JVRl9NQVgpOwogCQlpZiAodW5saWtlbHkoZXJyKSkgewotCQkJV0xfRVJSKCgiQ291bGQgbm90IGdldCBic3MgaW5mbyAlZFxuIiwgZXJyKSk7CisJCQlXTF9FUlIoIkNvdWxkIG5vdCBnZXQgYnNzIGluZm8gJWRcbiIsIGVycik7CiAJCQlnb3RvIHVwZGF0ZV9ic3NfaW5mb19vdXQ7CiAJCX0KIAkJYmkgPSAoc3RydWN0IHdsX2Jzc19pbmZvICopKHdsLT5leHRyYV9idWYgKyA0KTsKLQkJaWYgKHVubGlrZWx5KG1lbWNtcCgmYmktPkJTU0lELCAmd2wtPmJzc2lkLCBFVEhFUl9BRERSX0xFTikpKSB7CisJCWlmICh1bmxpa2VseShtZW1jbXAoJmJpLT5CU1NJRCwgJndsLT5ic3NpZCwgRVRIX0FMRU4pKSkgewogCQkJZXJyID0gLUVJTzsKIAkJCWdvdG8gdXBkYXRlX2Jzc19pbmZvX291dDsKIAkJfQpAQCAtMjU5Niw3ICsyNTkxLDcgQEAKIAkJaWVfbGVuID0gYmktPmllX2xlbmd0aDsKIAkJYmVhY29uX2ludGVydmFsID0gY3B1X3RvX2xlMTYoYmktPmJlYWNvbl9wZXJpb2QpOwogCX0gZWxzZSB7Ci0JCVdMX0RCRygoIkZvdW5kIHRoZSBBUCBpbiB0aGUgbGlzdCAtIEJTU0lEICVwTVxuIiwgYnNzLT5ic3NpZCkpOworCQlXTF9EQkcoIkZvdW5kIHRoZSBBUCBpbiB0aGUgbGlzdCAtIEJTU0lEICVwTVxuIiwgYnNzLT5ic3NpZCk7CiAJCWllID0gYnNzLT5pbmZvcm1hdGlvbl9lbGVtZW50czsKIAkJaWVfbGVuID0gYnNzLT5sZW5faW5mb3JtYXRpb25fZWxlbWVudHM7CiAJCWJlYWNvbl9pbnRlcnZhbCA9IGJzcy0+YmVhY29uX2ludGVydmFsOwpAQCAtMjYxNSw3ICsyNjEwLDcgQEAKIAkJZXJyID0gd2xfZGV2X2lvY3RsKHdsX3RvX25kZXYod2wpLCBXTENfR0VUX0RUSU1QUkQsCiAJCQkmZHRpbV9wZXJpb2QsIHNpemVvZihkdGltX3BlcmlvZCkpOwogCQlpZiAodW5saWtlbHkoZXJyKSkgewotCQkJV0xfRVJSKCgiV0xDX0dFVF9EVElNUFJEIGVycm9yICglZClcbiIsIGVycikpOworCQkJV0xfRVJSKCJXTENfR0VUX0RUSU1QUkQgZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJCWdvdG8gdXBkYXRlX2Jzc19pbmZvX291dDsKIAkJfQogCX0KQEAgLTI2MzYsMTMgKzI2MzEsMTMgQEAKIAlzMzIgZXJyID0gMDsKIAogCXdsX2dldF9hc3NvY19pZXMod2wpOwotCW1lbWNweSgmd2wtPmJzc2lkLCAmZS0+YWRkciwgRVRIRVJfQUREUl9MRU4pOworCW1lbWNweSgmd2wtPmJzc2lkLCAmZS0+YWRkciwgRVRIX0FMRU4pOwogCXdsX3VwZGF0ZV9ic3NfaW5mbyh3bCk7CiAJY2ZnODAyMTFfcm9hbWVkKG5kZXYsCiAJCQkodTggKikmd2wtPmJzc2lkLAogCQkJY29ubl9pbmZvLT5yZXFfaWUsIGNvbm5faW5mby0+cmVxX2llX2xlbiwKIAkJCWNvbm5faW5mby0+cmVzcF9pZSwgY29ubl9pbmZvLT5yZXNwX2llX2xlbiwgR0ZQX0tFUk5FTCk7Ci0JV0xfREJHKCgiUmVwb3J0IHJvYW1pbmcgcmVzdWx0XG4iKSk7CisJV0xfREJHKCJSZXBvcnQgcm9hbWluZyByZXN1bHRcbiIpOwogCiAJc2V0X2JpdChXTF9TVEFUVVNfQ09OTkVDVEVELCAmd2wtPnN0YXR1cyk7CiAKQEAgLTI2NTcsNyArMjY1Miw3IEBACiAJczMyIGVyciA9IDA7CiAKIAl3bF9nZXRfYXNzb2NfaWVzKHdsKTsKLQltZW1jcHkoJndsLT5ic3NpZCwgJmUtPmFkZHIsIEVUSEVSX0FERFJfTEVOKTsKKwltZW1jcHkoJndsLT5ic3NpZCwgJmUtPmFkZHIsIEVUSF9BTEVOKTsKIAl3bF91cGRhdGVfYnNzX2luZm8od2wpOwogCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoV0xfU1RBVFVTX0NPTk5FQ1RJTkcsICZ3bC0+c3RhdHVzKSkgewogCQljZmc4MDIxMV9jb25uZWN0X3Jlc3VsdChuZGV2LApAQCAtMjY2OCwxNSArMjY2MywxNSBAQAogCQkJCQljb25uX2luZm8tPnJlc3BfaWVfbGVuLAogCQkJCQljb21wbGV0ZWQgPyBXTEFOX1NUQVRVU19TVUNDRVNTIDogV0xBTl9TVEFUVVNfQVVUSF9USU1FT1VULAogCQkJCQlHRlBfS0VSTkVMKTsKLQkJV0xfREJHKCgiUmVwb3J0IGNvbm5lY3QgcmVzdWx0IC0gY29ubmVjdGlvbiAlc1xuIiwKLQkJCWNvbXBsZXRlZCA/ICJzdWNjZWVkZWQiIDogImZhaWxlZCIpKTsKKwkJV0xfREJHKCJSZXBvcnQgY29ubmVjdCByZXN1bHQgLSBjb25uZWN0aW9uICVzXG4iLAorCQkgICAgICAgY29tcGxldGVkID8gInN1Y2NlZWRlZCIgOiAiZmFpbGVkIik7CiAJfSBlbHNlIHsKIAkJY2ZnODAyMTFfcm9hbWVkKG5kZXYsCiAJCQkJKHU4ICopJndsLT5ic3NpZCwKIAkJCQljb25uX2luZm8tPnJlcV9pZSwgY29ubl9pbmZvLT5yZXFfaWVfbGVuLAogCQkJCWNvbm5faW5mby0+cmVzcF9pZSwgY29ubl9pbmZvLT5yZXNwX2llX2xlbiwKIAkJCQlHRlBfS0VSTkVMKTsKLQkJV0xfREJHKCgiUmVwb3J0IHJvYW1pbmcgcmVzdWx0XG4iKSk7CisJCVdMX0RCRygiUmVwb3J0IHJvYW1pbmcgcmVzdWx0XG4iKTsKIAl9CiAJc2V0X2JpdChXTF9TVEFUVVNfQ09OTkVDVEVELCAmd2wtPnN0YXR1cyk7CiAKQEAgLTI3MTYsNyArMjcxMSw3IEBACiAJCXJldHVybiB3bF93YWtldXBfaXNjYW4od2xfdG9faXNjYW4od2wpKTsKIAogCWlmICh1bmxpa2VseSghdGVzdF9hbmRfY2xlYXJfYml0KFdMX1NUQVRVU19TQ0FOTklORywgJndsLT5zdGF0dXMpKSkgewotCQlXTF9FUlIoKCJTY2FuIGNvbXBsZXRlIHdoaWxlIGRldmljZSBub3Qgc2Nhbm5pbmdcbiIpKTsKKwkJV0xfRVJSKCJTY2FuIGNvbXBsZXRlIHdoaWxlIGRldmljZSBub3Qgc2Nhbm5pbmdcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJaWYgKHVubGlrZWx5KCF3bC0+c2Nhbl9yZXF1ZXN0KSkgewpAQCAtMjcyNSwxNCArMjcyMCwxNCBAQAogCWVyciA9IHdsX2Rldl9pb2N0bChuZGV2LCBXTENfR0VUX0NIQU5ORUwsICZjaGFubmVsX2luZm9ybSwKIAkJCXNpemVvZihjaGFubmVsX2luZm9ybSkpOwogCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigoInNjYW4gYnVzeSAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfRVJSKCJzY2FuIGJ1c3kgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBzY2FuX2RvbmVfb3V0OwogCX0KIAljaGFubmVsX2luZm9ybS5zY2FuX2NoYW5uZWwgPSBkdG9oMzIoY2hhbm5lbF9pbmZvcm0uc2Nhbl9jaGFubmVsKTsKIAlpZiAodW5saWtlbHkoY2hhbm5lbF9pbmZvcm0uc2Nhbl9jaGFubmVsKSkgewogCi0JCVdMX0RCRygoImNoYW5uZWxfaW5mb3JtLnNjYW5fY2hhbm5lbCAoJWQpXG4iLAotCQkJY2hhbm5lbF9pbmZvcm0uc2Nhbl9jaGFubmVsKSk7CisJCVdMX0RCRygiY2hhbm5lbF9pbmZvcm0uc2Nhbl9jaGFubmVsICglZClcbiIsCisJCSAgICAgICBjaGFubmVsX2luZm9ybS5zY2FuX2NoYW5uZWwpOwogCX0KIAl3bC0+YnNzX2xpc3QgPSB3bC0+c2Nhbl9yZXN1bHRzOwogCWJzc19saXN0ID0gd2wtPmJzc19saXN0OwpAQCAtMjc0MCw3ICsyNzM1LDcgQEAKIAlic3NfbGlzdC0+YnVmbGVuID0gaHRvZDMyKGxlbik7CiAJZXJyID0gd2xfZGV2X2lvY3RsKG5kZXYsIFdMQ19TQ0FOX1JFU1VMVFMsIGJzc19saXN0LCBsZW4pOwogCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigoIiVzIFNjYW5fcmVzdWx0cyBlcnJvciAoJWQpXG4iLCBuZGV2LT5uYW1lLCBlcnIpKTsKKwkJV0xfRVJSKCIlcyBTY2FuX3Jlc3VsdHMgZXJyb3IgKCVkKVxuIiwgbmRldi0+bmFtZSwgZXJyKTsKIAkJZXJyID0gLUVJTlZBTDsKIAkJZ290byBzY2FuX2RvbmVfb3V0OwogCX0KQEAgLTI3OTQsNTUgKzI3ODksNTQgQEAKIAogc3RhdGljIHMzMiB3bF9pbml0X3ByaXZfbWVtKHN0cnVjdCB3bF9wcml2ICp3bCkKIHsKLQl3bC0+c2Nhbl9yZXN1bHRzID0gKHZvaWQgKilremFsbG9jKFdMX1NDQU5fQlVGX01BWCwgR0ZQX0tFUk5FTCk7CisJd2wtPnNjYW5fcmVzdWx0cyA9IGt6YWxsb2MoV0xfU0NBTl9CVUZfTUFYLCBHRlBfS0VSTkVMKTsKIAlpZiAodW5saWtlbHkoIXdsLT5zY2FuX3Jlc3VsdHMpKSB7Ci0JCVdMX0VSUigoIlNjYW4gcmVzdWx0cyBhbGxvYyBmYWlsZWRcbiIpKTsKKwkJV0xfRVJSKCJTY2FuIHJlc3VsdHMgYWxsb2MgZmFpbGVkXG4iKTsKIAkJZ290byBpbml0X3ByaXZfbWVtX291dDsKIAl9Ci0Jd2wtPmNvbmYgPSAodm9pZCAqKWt6YWxsb2Moc2l6ZW9mKCp3bC0+Y29uZiksIEdGUF9LRVJORUwpOworCXdsLT5jb25mID0ga3phbGxvYyhzaXplb2YoKndsLT5jb25mKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHVubGlrZWx5KCF3bC0+Y29uZikpIHsKLQkJV0xfRVJSKCgid2xfY29uZiBhbGxvYyBmYWlsZWRcbiIpKTsKKwkJV0xfRVJSKCJ3bF9jb25mIGFsbG9jIGZhaWxlZFxuIik7CiAJCWdvdG8gaW5pdF9wcml2X21lbV9vdXQ7CiAJfQotCXdsLT5wcm9maWxlID0gKHZvaWQgKilremFsbG9jKHNpemVvZigqd2wtPnByb2ZpbGUpLCBHRlBfS0VSTkVMKTsKKwl3bC0+cHJvZmlsZSA9IGt6YWxsb2Moc2l6ZW9mKCp3bC0+cHJvZmlsZSksIEdGUF9LRVJORUwpOwogCWlmICh1bmxpa2VseSghd2wtPnByb2ZpbGUpKSB7Ci0JCVdMX0VSUigoIndsX3Byb2ZpbGUgYWxsb2MgZmFpbGVkXG4iKSk7CisJCVdMX0VSUigid2xfcHJvZmlsZSBhbGxvYyBmYWlsZWRcbiIpOwogCQlnb3RvIGluaXRfcHJpdl9tZW1fb3V0OwogCX0KLQl3bC0+YnNzX2luZm8gPSAodm9pZCAqKWt6YWxsb2MoV0xfQlNTX0lORk9fTUFYLCBHRlBfS0VSTkVMKTsKKwl3bC0+YnNzX2luZm8gPSBremFsbG9jKFdMX0JTU19JTkZPX01BWCwgR0ZQX0tFUk5FTCk7CiAJaWYgKHVubGlrZWx5KCF3bC0+YnNzX2luZm8pKSB7Ci0JCVdMX0VSUigoIkJzcyBpbmZvcm1hdGlvbiBhbGxvYyBmYWlsZWRcbiIpKTsKKwkJV0xfRVJSKCJCc3MgaW5mb3JtYXRpb24gYWxsb2MgZmFpbGVkXG4iKTsKIAkJZ290byBpbml0X3ByaXZfbWVtX291dDsKIAl9Ci0Jd2wtPnNjYW5fcmVxX2ludCA9Ci0JICAgICh2b2lkICopa3phbGxvYyhzaXplb2YoKndsLT5zY2FuX3JlcV9pbnQpLCBHRlBfS0VSTkVMKTsKKwl3bC0+c2Nhbl9yZXFfaW50ID0ga3phbGxvYyhzaXplb2YoKndsLT5zY2FuX3JlcV9pbnQpLCBHRlBfS0VSTkVMKTsKIAlpZiAodW5saWtlbHkoIXdsLT5zY2FuX3JlcV9pbnQpKSB7Ci0JCVdMX0VSUigoIlNjYW4gcmVxIGFsbG9jIGZhaWxlZFxuIikpOworCQlXTF9FUlIoIlNjYW4gcmVxIGFsbG9jIGZhaWxlZFxuIik7CiAJCWdvdG8gaW5pdF9wcml2X21lbV9vdXQ7CiAJfQotCXdsLT5pb2N0bF9idWYgPSAodm9pZCAqKWt6YWxsb2MoV0xfSU9DVExfTEVOX01BWCwgR0ZQX0tFUk5FTCk7CisJd2wtPmlvY3RsX2J1ZiA9IGt6YWxsb2MoV0xfSU9DVExfTEVOX01BWCwgR0ZQX0tFUk5FTCk7CiAJaWYgKHVubGlrZWx5KCF3bC0+aW9jdGxfYnVmKSkgewotCQlXTF9FUlIoKCJJb2N0bCBidWYgYWxsb2MgZmFpbGVkXG4iKSk7CisJCVdMX0VSUigiSW9jdGwgYnVmIGFsbG9jIGZhaWxlZFxuIik7CiAJCWdvdG8gaW5pdF9wcml2X21lbV9vdXQ7CiAJfQotCXdsLT5leHRyYV9idWYgPSAodm9pZCAqKWt6YWxsb2MoV0xfRVhUUkFfQlVGX01BWCwgR0ZQX0tFUk5FTCk7CisJd2wtPmV4dHJhX2J1ZiA9IGt6YWxsb2MoV0xfRVhUUkFfQlVGX01BWCwgR0ZQX0tFUk5FTCk7CiAJaWYgKHVubGlrZWx5KCF3bC0+ZXh0cmFfYnVmKSkgewotCQlXTF9FUlIoKCJFeHRyYSBidWYgYWxsb2MgZmFpbGVkXG4iKSk7CisJCVdMX0VSUigiRXh0cmEgYnVmIGFsbG9jIGZhaWxlZFxuIik7CiAJCWdvdG8gaW5pdF9wcml2X21lbV9vdXQ7CiAJfQotCXdsLT5pc2NhbiA9ICh2b2lkICopa3phbGxvYyhzaXplb2YoKndsLT5pc2NhbiksIEdGUF9LRVJORUwpOworCXdsLT5pc2NhbiA9IGt6YWxsb2Moc2l6ZW9mKCp3bC0+aXNjYW4pLCBHRlBfS0VSTkVMKTsKIAlpZiAodW5saWtlbHkoIXdsLT5pc2NhbikpIHsKLQkJV0xfRVJSKCgiSXNjYW4gYnVmIGFsbG9jIGZhaWxlZFxuIikpOworCQlXTF9FUlIoIklzY2FuIGJ1ZiBhbGxvYyBmYWlsZWRcbiIpOwogCQlnb3RvIGluaXRfcHJpdl9tZW1fb3V0OwogCX0KLQl3bC0+ZncgPSAodm9pZCAqKWt6YWxsb2Moc2l6ZW9mKCp3bC0+ZncpLCBHRlBfS0VSTkVMKTsKKwl3bC0+ZncgPSBremFsbG9jKHNpemVvZigqd2wtPmZ3KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHVubGlrZWx5KCF3bC0+ZncpKSB7Ci0JCVdMX0VSUigoImZ3IG9iamVjdCBhbGxvYyBmYWlsZWRcbiIpKTsKKwkJV0xfRVJSKCJmdyBvYmplY3QgYWxsb2MgZmFpbGVkXG4iKTsKIAkJZ290byBpbml0X3ByaXZfbWVtX291dDsKIAl9Ci0Jd2wtPnBta19saXN0ID0gKHZvaWQgKilremFsbG9jKHNpemVvZigqd2wtPnBta19saXN0KSwgR0ZQX0tFUk5FTCk7CisJd2wtPnBta19saXN0ID0ga3phbGxvYyhzaXplb2YoKndsLT5wbWtfbGlzdCksIEdGUF9LRVJORUwpOwogCWlmICh1bmxpa2VseSghd2wtPnBta19saXN0KSkgewotCQlXTF9FUlIoKCJwbWsgbGlzdCBhbGxvYyBmYWlsZWRcbiIpKTsKKwkJV0xfRVJSKCJwbWsgbGlzdCBhbGxvYyBmYWlsZWRcbiIpOwogCQlnb3RvIGluaXRfcHJpdl9tZW1fb3V0OwogCX0KIApAQCAtMjg4NCw3ICsyODc4LDcgQEAKIAl3bC0+ZXZlbnRfdHNrID0ga3RocmVhZF9ydW4od2xfZXZlbnRfaGFuZGxlciwgd2wsICJ3bF9ldmVudF9oYW5kbGVyIik7CiAJaWYgKElTX0VSUih3bC0+ZXZlbnRfdHNrKSkgewogCQl3bC0+ZXZlbnRfdHNrID0gTlVMTDsKLQkJV0xfRVJSKCgiZmFpbGVkIHRvIGNyZWF0ZSBldmVudCB0aHJlYWRcbiIpKTsKKwkJV0xfRVJSKCJmYWlsZWQgdG8gY3JlYXRlIGV2ZW50IHRocmVhZFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlyZXR1cm4gMDsKQEAgLTI5MTcsNyArMjkxMSw3IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSB3bF90b19uZGV2KHdsKTsKIAogCWlmICh1bmxpa2VseSghdGVzdF9hbmRfY2xlYXJfYml0KFdMX1NUQVRVU19TQ0FOTklORywgJndsLT5zdGF0dXMpKSkgewotCQlXTF9FUlIoKCJTY2FuIGNvbXBsZXRlIHdoaWxlIGRldmljZSBub3Qgc2Nhbm5pbmdcbiIpKTsKKwkJV0xfRVJSKCJTY2FuIGNvbXBsZXRlIHdoaWxlIGRldmljZSBub3Qgc2Nhbm5pbmdcbiIpOwogCQlyZXR1cm47CiAJfQogCWlmIChsaWtlbHkod2wtPnNjYW5fcmVxdWVzdCkpIHsKQEAgLTI5MzEsNyArMjkyNSw3IEBACiBzdGF0aWMgczMyIHdsX3dha2V1cF9pc2NhbihzdHJ1Y3Qgd2xfaXNjYW5fY3RybCAqaXNjYW4pCiB7CiAJaWYgKGxpa2VseShpc2Nhbi0+c3RhdGUgIT0gV0xfSVNDQU5fU1RBVEVfSURMRSkpIHsKLQkJV0xfREJHKCgid2FrZSB1cCBpc2NhblxuIikpOworCQlXTF9EQkcoIndha2UgdXAgaXNjYW5cbiIpOwogCQl1cCgmaXNjYW4tPnN5bmMpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0yOTYxLDE0ICsyOTU1LDE0IEBACiAJCQkJV0xfSVNDQU5fUkVTVUxUU19GSVhFRF9TSVpFLCBpc2Nhbi0+c2Nhbl9idWYsCiAJCQkJV0xfSVNDQU5fQlVGX01BWCk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgiZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0VSUigiZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJcmVzdWx0cy0+YnVmbGVuID0gZHRvaDMyKHJlc3VsdHMtPmJ1Zmxlbik7CiAJcmVzdWx0cy0+dmVyc2lvbiA9IGR0b2gzMihyZXN1bHRzLT52ZXJzaW9uKTsKIAlyZXN1bHRzLT5jb3VudCA9IGR0b2gzMihyZXN1bHRzLT5jb3VudCk7Ci0JV0xfREJHKCgicmVzdWx0cy0+Y291bnQgPSAlZFxuIiwgcmVzdWx0cy0+Y291bnQpKTsKLQlXTF9EQkcoKCJyZXN1bHRzLT5idWZsZW4gPSAlZFxuIiwgcmVzdWx0cy0+YnVmbGVuKSk7CisJV0xfREJHKCJyZXN1bHRzLT5jb3VudCA9ICVkXG4iLCByZXN1bHRzLT5jb3VudCk7CisJV0xfREJHKCJyZXN1bHRzLT5idWZsZW4gPSAlZFxuIiwgcmVzdWx0cy0+YnVmbGVuKTsKIAkqc3RhdHVzID0gZHRvaDMyKGxpc3RfYnVmLT5zdGF0dXMpOwogCSpic3NfbGlzdCA9IHJlc3VsdHM7CiAKQEAgLTMwNTMsNyArMzA0Nyw3IEBACiAJCWVyciA9IHdsX2dldF9pc2Nhbl9yZXN1bHRzKGlzY2FuLCAmc3RhdHVzLCAmd2wtPmJzc19saXN0KTsKIAkJaWYgKHVubGlrZWx5KGVycikpIHsKIAkJCXN0YXR1cyA9IFdMX1NDQU5fUkVTVUxUU19BQk9SVEVEOwotCQkJV0xfRVJSKCgiQWJvcnQgaXNjYW5cbiIpKTsKKwkJCVdMX0VSUigiQWJvcnQgaXNjYW5cbiIpOwogCQl9CiAJCXJ0bmxfdW5sb2NrKCk7CiAJCWVsLT5oYW5kbGVyW3N0YXR1c10gKHdsKTsKQEAgLTMwNjIsNyArMzA1Niw3IEBACiAJCWRlbF90aW1lcl9zeW5jKCZpc2Nhbi0+dGltZXIpOwogCQlpc2Nhbi0+dGltZXJfb24gPSAwOwogCX0KLQlXTF9EQkcoKCIlcyB3YXMgdGVybWluYXRlZFxuIiwgX19mdW5jX18pKTsKKwlXTF9EQkcoIiVzIHdhcyB0ZXJtaW5hdGVkXG4iLCBfX2Z1bmNfXyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTMwNzMsNyArMzA2Nyw3IEBACiAKIAlpZiAoaXNjYW4pIHsKIAkJaXNjYW4tPnRpbWVyX29uID0gMDsKLQkJV0xfREJHKCgidGltZXIgZXhwaXJlZFxuIikpOworCQlXTF9EQkcoInRpbWVyIGV4cGlyZWRcbiIpOwogCQl3bF93YWtldXBfaXNjYW4oaXNjYW4pOwogCX0KIH0KQEAgLTMwODgsNyArMzA4Miw3IEBACiAJCXNlbWFfaW5pdCgmaXNjYW4tPnN5bmMsIDApOwogCQlpc2Nhbi0+dHNrID0ga3RocmVhZF9ydW4od2xfaXNjYW5fdGhyZWFkLCBpc2NhbiwgIndsX2lzY2FuIik7CiAJCWlmIChJU19FUlIoaXNjYW4tPnRzaykpIHsKLQkJCVdMX0VSUigoIkNvdWxkIG5vdCBjcmVhdGUgaXNjYW4gdGhyZWFkXG4iKSk7CisJCQlXTF9FUlIoIkNvdWxkIG5vdCBjcmVhdGUgaXNjYW4gdGhyZWFkXG4iKTsKIAkJCWlzY2FuLT50c2sgPSBOVUxMOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KQEAgLTMxMjMsNyArMzExNyw3IEBACiAJCXNlbWFfaW5pdCgmaXNjYW4tPnN5bmMsIDApOwogCQlpc2Nhbi0+dHNrID0ga3RocmVhZF9ydW4od2xfaXNjYW5fdGhyZWFkLCBpc2NhbiwgIndsX2lzY2FuIik7CiAJCWlmIChJU19FUlIoaXNjYW4tPnRzaykpIHsKLQkJCVdMX0VSUigoIkNvdWxkIG5vdCBjcmVhdGUgaXNjYW4gdGhyZWFkXG4iKSk7CisJCQlXTF9FUlIoIkNvdWxkIG5vdCBjcmVhdGUgaXNjYW4gdGhyZWFkXG4iKTsKIAkJCWlzY2FuLT50c2sgPSBOVUxMOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KQEAgLTMxOTIsMTcgKzMxODYsMTcgQEAKIAlzMzIgZXJyID0gMDsKIAogCWlmICh1bmxpa2VseSghbmRldikpIHsKLQkJV0xfRVJSKCgibmRldiBpcyBpbnZhaWxkXG4iKSk7CisJCVdMX0VSUigibmRldiBpcyBpbnZhbGlkXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCXdsX2NmZzgwMjExX2RldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB3bF9kZXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAodW5saWtlbHkoIXdsX2NmZzgwMjExX2RldikpIHsKLQkJV0xfRVJSKCgid2xfY2ZnODAyMTFfZGV2IGlzIGludmFsaWRcbiIpKTsKKwkJV0xfRVJSKCJ3bF9jZmc4MDIxMV9kZXYgaXMgaW52YWxpZFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQlXTF9EQkcoKCJmdW5jICVwXG4iLCB3bF9jZmc4MDIxMV9nZXRfc2Rpb19mdW5jKCkpKTsKKwlXTF9EQkcoImZ1bmMgJXBcbiIsIHdsX2NmZzgwMjExX2dldF9zZGlvX2Z1bmMoKSk7CiAJd2RldiA9IHdsX2FsbG9jX3dkZXYoc2l6ZW9mKHN0cnVjdCB3bF9pZmFjZSksICZ3bF9jZmc4MDIxMV9nZXRfc2Rpb19mdW5jKCktPmRldik7Ci0JaWYgKHVubGlrZWx5KElTX0VSUih3ZGV2KSkpCisJaWYgKElTX0VSUih3ZGV2KSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAl3ZGV2LT5pZnR5cGUgPSB3bF9tb2RlX3RvX25sODAyMTFfaWZ0eXBlKFdMX01PREVfQlNTKTsKQEAgLTMyMTYsNyArMzIxMCw3IEBACiAJd2Rldi0+bmV0ZGV2ID0gbmRldjsKIAllcnIgPSB3bF9pbml0X3ByaXYod2wpOwogCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigoIkZhaWxlZCB0byBpbml0IGl3bV9wcml2ICglZClcbiIsIGVycikpOworCQlXTF9FUlIoIkZhaWxlZCB0byBpbml0IGl3bV9wcml2ICglZClcbiIsIGVycik7CiAJCWdvdG8gY2ZnODAyMTFfYXR0YWNoX291dDsKIAl9CiAJd2xfc2V0X2RydmRhdGEod2xfY2ZnODAyMTFfZGV2LCBjaSk7CkBAIC0zMjYxLDE5ICszMjU1LDE5IEBACiAJCQlicmVhazsKIAkJZSA9IHdsX2RlcV9ldmVudCh3bCk7CiAJCWlmICh1bmxpa2VseSghZSkpIHsKLQkJCVdMX0VSUigoImVxZXVlIGVtcHR5Li5cbiIpKTsKKwkJCVdMX0VSUigiZXZlbnQgcXVldWUgZW1wdHkuLi5cbiIpOwogCQkJQlVHKCk7CiAJCX0KLQkJV0xfREJHKCgiZXZlbnQgdHlwZSAoJWQpXG4iLCBlLT5ldHlwZSkpOworCQlXTF9EQkcoImV2ZW50IHR5cGUgKCVkKVxuIiwgZS0+ZXR5cGUpOwogCQlpZiAod2wtPmVsLmhhbmRsZXJbZS0+ZXR5cGVdKSB7CiAJCQl3bC0+ZWwuaGFuZGxlcltlLT5ldHlwZV0gKHdsLCB3bF90b19uZGV2KHdsKSwgJmUtPmVtc2csCiAJCQkJCQkgIGUtPmVkYXRhKTsKIAkJfSBlbHNlIHsKLQkJCVdMX0RCRygoIlVua25vd24gRXZlbnQgKCVkKTogaWdub3JpbmdcbiIsIGUtPmV0eXBlKSk7CisJCQlXTF9EQkcoIlVua25vd24gRXZlbnQgKCVkKTogaWdub3JpbmdcbiIsIGUtPmV0eXBlKTsKIAkJfQogCQl3bF9wdXRfZXZlbnQoZSk7CiAJfQotCVdMX0RCRygoIiVzIHdhcyB0ZXJtaW5hdGVkXG4iLCBfX2Z1bmNfXykpOworCVdMX0RCRygiJXMgd2FzIHRlcm1pbmF0ZWRcbiIsIF9fZnVuY19fKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzI4Niw3ICszMjgwLDcgQEAKIAlzOCAqZXN0ciA9IChldmVudF90eXBlIDw9IHNpemVvZih3bF9kYmdfZXN0cikgLyBXTF9EQkdfRVNUUl9NQVggLSAxKSA/CiAJICAgIHdsX2RiZ19lc3RyW2V2ZW50X3R5cGVdIDogKHM4ICopICJVbmtub3duIjsKICNlbmRpZgkJCQkvKiAoV0xfREJHX0xFVkVMID4gMCkgKi8KLQlXTF9EQkcoKCJldmVudF90eXBlICglZCk6IiAiV0xDX0VfIiAiJXNcbiIsIGV2ZW50X3R5cGUsIGVzdHIpKTsKKwlXTF9EQkcoImV2ZW50X3R5cGUgKCVkKToiICJXTENfRV8iICIlc1xuIiwgZXZlbnRfdHlwZSwgZXN0cik7CiAJaWYgKGxpa2VseSghd2xfZW5xX2V2ZW50KHdsLCBldmVudF90eXBlLCBlLCBkYXRhKSkpCiAJCXdsX3dha2V1cF9ldmVudCh3bCk7CiB9CkBAIC0zMzQxLDcgKzMzMzUsNyBAQAogCiAJZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB3bF9ldmVudF9xKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHVubGlrZWx5KCFlKSkgewotCQlXTF9FUlIoKCJldmVudCBhbGxvYyBmYWlsZWRcbiIpKTsKKwkJV0xfRVJSKCJldmVudCBhbGxvYyBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTMzODUsOCArMzM3OSw4IEBACiAJc3dpdGNoIChpZnR5cGUpIHsKIAljYXNlIE5MODAyMTFfSUZUWVBFX01PTklUT1I6CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9XRFM6Ci0JCVdMX0VSUigoInR5cGUgKCVkKSA6IGN1cnJlbnRseSB3ZSBkbyBub3Qgc3VwcG9ydCB0aGlzIG1vZGVcbiIsCi0JCQlpZnR5cGUpKTsKKwkJV0xfRVJSKCJ0eXBlICglZCkgOiBjdXJyZW50bHkgd2UgZG8gbm90IHN1cHBvcnQgdGhpcyBtb2RlXG4iLAorCQkgICAgICAgaWZ0eXBlKTsKIAkJZXJyID0gLUVJTlZBTDsKIAkJcmV0dXJuIGVycjsKIAljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgpAQCAtMzM5NiwyMCArMzM5MCwyMCBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQllcnIgPSAtRUlOVkFMOwotCQlXTF9FUlIoKCJpbnZhbGlkIHR5cGUgKCVkKVxuIiwgaWZ0eXBlKSk7CisJCVdMX0VSUigiaW52YWxpZCB0eXBlICglZClcbiIsIGlmdHlwZSk7CiAJCXJldHVybiBlcnI7CiAJfQogCWluZnJhID0gaHRvZDMyKGluZnJhKTsKIAlhcCA9IGh0b2QzMihhcCk7Ci0JV0xfREJHKCgiJXMgYXAgKCVkKSwgaW5mcmEgKCVkKVxuIiwgbmRldi0+bmFtZSwgYXAsIGluZnJhKSk7CisJV0xfREJHKCIlcyBhcCAoJWQpLCBpbmZyYSAoJWQpXG4iLCBuZGV2LT5uYW1lLCBhcCwgaW5mcmEpOwogCWVyciA9IHdsX2Rldl9pb2N0bChuZGV2LCBXTENfU0VUX0lORlJBLCAmaW5mcmEsIHNpemVvZihpbmZyYSkpOwogCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigoIldMQ19TRVRfSU5GUkEgZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0VSUigiV0xDX1NFVF9JTkZSQSBlcnJvciAoJWQpXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAllcnIgPSB3bF9kZXZfaW9jdGwobmRldiwgV0xDX1NFVF9BUCwgJmFwLCBzaXplb2YoYXApKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJXTENfU0VUX0FQIGVycm9yICglZClcbiIsIGVycikpOworCQlXTF9FUlIoIldMQ19TRVRfQVAgZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTM0MzEsNyArMzQyNSw3IEBACiAKIAllcnIgPSB3bF9kZXZfaW9jdGwobmRldiwgV0xDX1VQLCAmdXAsIHNpemVvZih1cCkpOwogCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigoIldMQ19VUCBlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfRVJSKCJXTENfVVAgZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAl9CiAJcmV0dXJuIGVycjsKIH0KQEAgLTM0NDIsNyArMzQzNiw3IEBACiAKIAllcnIgPSB3bF9kZXZfaW9jdGwobmRldiwgV0xDX1NFVF9QTSwgJnBvd2VyX21vZGUsIHNpemVvZihwb3dlcl9tb2RlKSk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgiV0xDX1NFVF9QTSBlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfRVJSKCJXTENfU0VUX1BNIGVycm9yICglZClcbiIsIGVycik7CiAJfQogCXJldHVybiBlcnI7CiB9CkBAIC0zNDU5LDE0ICszNDUzLDE0IEBACiAJCSAgICBzaXplb2YoaW92YnVmKSk7CiAJZXJyID0gd2xfZGV2X2lvY3RsKG5kZXYsIFdMQ19TRVRfVkFSLCBpb3ZidWYsIHNpemVvZihpb3ZidWYpKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJ0eGdsb21hbGlnbiBlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfRVJSKCJ0eGdsb21hbGlnbiBlcnJvciAoJWQpXG4iLCBlcnIpOwogCQlnb3RvIGRvbmdsZV9nbG9tX291dDsKIAl9CiAJLyogZGlzYWJsZSBnbG9tIG9wdGlvbiBwZXIgZGVmYXVsdCAqLwogCWJjbV9ta2lvdmFyKCJidXM6dHhnbG9tIiwgKGNoYXIgKikmZ2xvbSwgNCwgaW92YnVmLCBzaXplb2YoaW92YnVmKSk7CiAJZXJyID0gd2xfZGV2X2lvY3RsKG5kZXYsIFdMQ19TRVRfVkFSLCBpb3ZidWYsIHNpemVvZihpb3ZidWYpKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJ0eGdsb20gZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0VSUigidHhnbG9tIGVycm9yICglZClcbiIsIGVycik7CiAJCWdvdG8gZG9uZ2xlX2dsb21fb3V0OwogCX0KIGRvbmdsZV9nbG9tX291dDoKQEAgLTM0ODcsNyArMzQ4MSw3IEBACiAJCQkgICAgc2l6ZW9mKGlvdmJ1ZikpOwogCQllcnIgPSB3bF9kZXZfaW9jdGwobmRldiwgV0xDX1NFVF9WQVIsIGlvdmJ1Ziwgc2l6ZW9mKGlvdmJ1ZikpOwogCQlpZiAodW5saWtlbHkoZXJyKSkgewotCQkJV0xfRVJSKCgiYmNuX3RpbWVvdXQgZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCQlXTF9FUlIoImJjbl90aW1lb3V0IGVycm9yICglZClcbiIsIGVycik7CiAJCQlnb3RvIGRvbmdsZV9yb21fb3V0OwogCQl9CiAJfQpAQCAtMzQ5Niw3ICszNDkwLDcgQEAKIAliY21fbWtpb3Zhcigicm9hbV9vZmYiLCAoY2hhciAqKSZyb2FtdmFyLCA0LCBpb3ZidWYsIHNpemVvZihpb3ZidWYpKTsKIAllcnIgPSB3bF9kZXZfaW9jdGwobmRldiwgV0xDX1NFVF9WQVIsIGlvdmJ1Ziwgc2l6ZW9mKGlvdmJ1ZikpOwogCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigoInJvYW1fb2ZmIGVycm9yICglZClcbiIsIGVycikpOworCQlXTF9FUlIoInJvYW1fb2ZmIGVycm9yICglZClcbiIsIGVycik7CiAJCWdvdG8gZG9uZ2xlX3JvbV9vdXQ7CiAJfQogZG9uZ2xlX3JvbV9vdXQ6CkBAIC0zNTE2LDcgKzM1MTAsNyBAQAogCQkgICAgc2l6ZW9mKGlvdmJ1ZikpOwogCWVyciA9IHdsX2Rldl9pb2N0bChuZGV2LCBXTENfR0VUX1ZBUiwgaW92YnVmLCBzaXplb2YoaW92YnVmKSk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgiR2V0IGV2ZW50X21zZ3MgZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0VSUigiR2V0IGV2ZW50X21zZ3MgZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBkb25nbGVfZXZlbnRtc2dfb3V0OwogCX0KIAltZW1jcHkoZXZlbnRtYXNrLCBpb3ZidWYsIFdMX0VWRU5USU5HX01BU0tfTEVOKTsKQEAgLTM1NDQsNyArMzUzOCw3IEBACiAJCSAgICBzaXplb2YoaW92YnVmKSk7CiAJZXJyID0gd2xfZGV2X2lvY3RsKG5kZXYsIFdMQ19TRVRfVkFSLCBpb3ZidWYsIHNpemVvZihpb3ZidWYpKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJTZXQgZXZlbnRfbXNncyBlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfRVJSKCJTZXQgZXZlbnRfbXNncyBlcnJvciAoJWQpXG4iLCBlcnIpOwogCQlnb3RvIGRvbmdsZV9ldmVudG1zZ19vdXQ7CiAJfQogCkBAIC0zNTYyLDkgKzM1NTYsOSBAQAogCQkJc2l6ZW9mKHNjYW5fYXNzb2NfdGltZSkpOwogCWlmIChlcnIpIHsKIAkJaWYgKGVyciA9PSAtRU9QTk9UU1VQUCkgewotCQkJV0xfSU5GTygoIlNjYW4gYXNzb2MgdGltZSBpcyBub3Qgc3VwcG9ydGVkXG4iKSk7CisJCQlXTF9JTkZPKCJTY2FuIGFzc29jIHRpbWUgaXMgbm90IHN1cHBvcnRlZFxuIik7CiAJCX0gZWxzZSB7Ci0JCQlXTF9FUlIoKCJTY2FuIGFzc29jIHRpbWUgZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCQlXTF9FUlIoIlNjYW4gYXNzb2MgdGltZSBlcnJvciAoJWQpXG4iLCBlcnIpOwogCQl9CiAJCWdvdG8gZG9uZ2xlX3NjYW50aW1lX291dDsKIAl9CkBAIC0zNTcyLDkgKzM1NjYsOSBAQAogCQkJc2l6ZW9mKHNjYW5fdW5hc3NvY190aW1lKSk7CiAJaWYgKGVycikgewogCQlpZiAoZXJyID09IC1FT1BOT1RTVVBQKSB7Ci0JCQlXTF9JTkZPKCgiU2NhbiB1bmFzc29jIHRpbWUgaXMgbm90IHN1cHBvcnRlZFxuIikpOworCQkJV0xfSU5GTygiU2NhbiB1bmFzc29jIHRpbWUgaXMgbm90IHN1cHBvcnRlZFxuIik7CiAJCX0gZWxzZSB7Ci0JCQlXTF9FUlIoKCJTY2FuIHVuYXNzb2MgdGltZSBlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJCVdMX0VSUigiU2NhbiB1bmFzc29jIHRpbWUgZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJfQogCQlnb3RvIGRvbmdsZV9zY2FudGltZV9vdXQ7CiAJfQpAQCAtMzU5NSw5ICszNTg5LDkgQEAKIAllcnIgPSB3bF9kZXZfaW9jdGwobmRldiwgV0xDX1NFVF9WQVIsIGlvdmJ1Ziwgc2l6ZW9mKGlvdmJ1ZikpOwogCWlmIChlcnIpIHsKIAkJaWYgKGVyciA9PSAtRU9QTk9UU1VQUCkKLQkJCVdMX0lORk8oKCJhcnBvZSBpcyBub3Qgc3VwcG9ydGVkXG4iKSk7CisJCQlXTF9JTkZPKCJhcnBvZSBpcyBub3Qgc3VwcG9ydGVkXG4iKTsKIAkJZWxzZQotCQkJV0xfRVJSKCgiYXJwb2UgZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCQlXTF9FUlIoImFycG9lIGVycm9yICglZClcbiIsIGVycik7CiAKIAkJZ290byBkb25nbGVfb2ZmbG9hZF9vdXQ7CiAJfQpAQCAtMzYwNSw5ICszNTk5LDkgQEAKIAllcnIgPSB3bF9kZXZfaW9jdGwobmRldiwgV0xDX1NFVF9WQVIsIGlvdmJ1Ziwgc2l6ZW9mKGlvdmJ1ZikpOwogCWlmIChlcnIpIHsKIAkJaWYgKGVyciA9PSAtRU9QTk9UU1VQUCkKLQkJCVdMX0lORk8oKCJhcnBfb2wgaXMgbm90IHN1cHBvcnRlZFxuIikpOworCQkJV0xfSU5GTygiYXJwX29sIGlzIG5vdCBzdXBwb3J0ZWRcbiIpOwogCQllbHNlCi0JCQlXTF9FUlIoKCJhcnBfb2wgZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCQlXTF9FUlIoImFycF9vbCBlcnJvciAoJWQpXG4iLCBlcnIpOwogCiAJCWdvdG8gZG9uZ2xlX29mZmxvYWRfb3V0OwogCX0KQEAgLTM2MjAsMTIgKzM2MTQsMTIgQEAKIHsKIAlpbnQgaTsKIAlpZiAoc3RybmNtcChzcmMsICIweCIsIDIpICE9IDAgJiYgc3RybmNtcChzcmMsICIwWCIsIDIpICE9IDApIHsKLQkJV0xfRVJSKCgiTWFzayBpbnZhbGlkIGZvcm1hdC4gTmVlZHMgdG8gc3RhcnQgd2l0aCAweFxuIikpOworCQlXTF9FUlIoIk1hc2sgaW52YWxpZCBmb3JtYXQuIE5lZWRzIHRvIHN0YXJ0IHdpdGggMHhcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCXNyYyA9IHNyYyArIDI7CQkvKiBTa2lwIHBhc3QgMHggKi8KIAlpZiAoc3RybGVuKHNyYykgJSAyICE9IDApIHsKLQkJV0xfRVJSKCgiTWFzayBpbnZhbGlkIGZvcm1hdC4gTmVlZHMgdG8gYmUgb2YgZXZlbiBsZW5ndGhcbiIpKTsKKwkJV0xfRVJSKCJNYXNrIGludmFsaWQgZm9ybWF0LiBOZWVkcyB0byBiZSBvZiBldmVuIGxlbmd0aFxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAJZm9yIChpID0gMDsgKnNyYyAhPSAnXDAnOyBpKyspIHsKQEAgLTM2ODQsNyArMzY3OCw3IEBACiAJCQkJCSAgICAgIG1hc2tfYW5kX3BhdHRlcm5bbWFza19zaXplXSkpOwogCiAJaWYgKG1hc2tfc2l6ZSAhPSBwYXR0ZXJuX3NpemUpIHsKLQkJV0xfRVJSKCgiTWFzayBhbmQgcGF0dGVybiBub3QgdGhlIHNhbWUgc2l6ZVxuIikpOworCQlXTF9FUlIoIk1hc2sgYW5kIHBhdHRlcm4gbm90IHRoZSBzYW1lIHNpemVcbiIpOwogCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIGRvbmdsZV9maWx0ZXJfb3V0OwogCX0KQEAgLTM3MDQsOSArMzY5OCw5IEBACiAJZXJyID0gd2xfZGV2X2lvY3RsKG5kZXYsIFdMQ19TRVRfVkFSLCBidWYsIGJ1Zl9sZW4pOwogCWlmIChlcnIpIHsKIAkJaWYgKGVyciA9PSAtRU9QTk9UU1VQUCkgewotCQkJV0xfSU5GTygoImZpbHRlciBub3Qgc3VwcG9ydGVkXG4iKSk7CisJCQlXTF9JTkZPKCJmaWx0ZXIgbm90IHN1cHBvcnRlZFxuIik7CiAJCX0gZWxzZSB7Ci0JCQlXTF9FUlIoKCJmaWx0ZXIgKCVkKVxuIiwgZXJyKSk7CisJCQlXTF9FUlIoImZpbHRlciAoJWQpXG4iLCBlcnIpOwogCQl9CiAJCWdvdG8gZG9uZ2xlX2ZpbHRlcl9vdXQ7CiAJfQpAQCAtMzcxNyw5ICszNzExLDkgQEAKIAllcnIgPSB3bF9kZXZfaW9jdGwobmRldiwgV0xDX1NFVF9WQVIsIGlvdmJ1Ziwgc2l6ZW9mKGlvdmJ1ZikpOwogCWlmIChlcnIpIHsKIAkJaWYgKGVyciA9PSAtRU9QTk9UU1VQUCkgewotCQkJV0xfSU5GTygoImZpbHRlcl9tb2RlIG5vdCBzdXBwb3J0ZWRcbiIpKTsKKwkJCVdMX0lORk8oImZpbHRlcl9tb2RlIG5vdCBzdXBwb3J0ZWRcbiIpOwogCQl9IGVsc2UgewotCQkJV0xfRVJSKCgiZmlsdGVyX21vZGUgKCVkKVxuIiwgZXJyKSk7CisJCQlXTF9FUlIoImZpbHRlcl9tb2RlICglZClcbiIsIGVycik7CiAJCX0KIAkJZ290byBkb25nbGVfZmlsdGVyX291dDsKIAl9CkBAIC0zODAwLDEyICszNzk0LDEyIEBACiAJZXJyID0gd2xfZGV2X2lvY3RsKHdsX3RvX25kZXYod2wpLCBXTENfR0VUX1BIWUxJU1QsICZwaHlfbGlzdCwKIAkJCXNpemVvZihwaHlfbGlzdCkpOwogCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigoImVycm9yICglZClcbiIsIGVycikpOworCQlXTF9FUlIoImVycm9yICglZClcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCiAJcGh5ID0gKChjaGFyICopJnBoeV9saXN0KVsxXTsKLQlXTF9EQkcoKCIlYyBwaHlcbiIsIHBoeSkpOworCVdMX0RCRygiJWMgcGh5XG4iLCBwaHkpOwogCWlmIChwaHkgPT0gJ24nIHx8IHBoeSA9PSAnYScpIHsKIAkJd2lwaHkgPSB3bF90b193aXBoeSh3bCk7CiAJCXdpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXSA9ICZfX3dsX2JhbmRfNWdoel9uOwpAQCAtMzkxMSw3ICszOTA1LDcgQEAKIAljYXNlIFdMX1BST0ZfU1NJRDoKIAkJcmV0dXJuICZ3bC0+cHJvZmlsZS0+c3NpZDsKIAl9Ci0JV0xfRVJSKCgiaW52YWxpZCBpdGVtICglZClcbiIsIGl0ZW0pKTsKKwlXTF9FUlIoImludmFsaWQgaXRlbSAoJWQpXG4iLCBpdGVtKTsKIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtMzkzMiw5ICszOTI2LDkgQEAKIAkJYnJlYWs7CiAJY2FzZSBXTF9QUk9GX0JTU0lEOgogCQlpZiAoZGF0YSkKLQkJCW1lbWNweSh3bC0+cHJvZmlsZS0+YnNzaWQsIGRhdGEsIEVUSEVSX0FERFJfTEVOKTsKKwkJCW1lbWNweSh3bC0+cHJvZmlsZS0+YnNzaWQsIGRhdGEsIEVUSF9BTEVOKTsKIAkJZWxzZQotCQkJbWVtc2V0KHdsLT5wcm9maWxlLT5ic3NpZCwgMCwgRVRIRVJfQUREUl9MRU4pOworCQkJbWVtc2V0KHdsLT5wcm9maWxlLT5ic3NpZCwgMCwgRVRIX0FMRU4pOwogCQlicmVhazsKIAljYXNlIFdMX1BST0ZfU0VDOgogCQltZW1jcHkoJndsLT5wcm9maWxlLT5zZWMsIGRhdGEsIHNpemVvZih3bC0+cHJvZmlsZS0+c2VjKSk7CkBAIC0zOTQ5LDcgKzM5NDMsNyBAQAogCQl3bC0+cHJvZmlsZS0+ZHRpbV9wZXJpb2QgPSAqKHU4ICopZGF0YTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJV0xfRVJSKCgidW5zdXBwb3J0ZWQgaXRlbSAoJWQpXG4iLCBpdGVtKSk7CisJCVdMX0VSUigidW5zdXBwb3J0ZWQgaXRlbSAoJWQpXG4iLCBpdGVtKTsKIAkJZXJyID0gLUVPUE5PVFNVUFA7CiAJCWJyZWFrOwogCX0KQEAgLTM5OTEsNyArMzk4NSw3IEBACiAJczMyIGVyciA9IDA7CiAKIAlpZiAodW5saWtlbHkoaWUtPm9mZnNldCArIGwgKyAyID4gV0xfVExWX0lORk9fTUFYKSkgewotCQlXTF9FUlIoKCJlaSBjcm9zc2VzIGJ1ZmZlciBib3VuZGFyeVxuIikpOworCQlXTF9FUlIoImVpIGNyb3NzZXMgYnVmZmVyIGJvdW5kYXJ5XG4iKTsKIAkJcmV0dXJuIC1FTk9TUEM7CiAJfQogCWllLT5idWZbaWUtPm9mZnNldF0gPSB0OwpAQCAtNDAwOCw3ICs0MDAyLDcgQEAKIAlzMzIgZXJyID0gMDsKIAogCWlmICh1bmxpa2VseShpZS0+b2Zmc2V0ICsgaWVfc2l6ZSA+IFdMX1RMVl9JTkZPX01BWCkpIHsKLQkJV0xfRVJSKCgiZWlfc3RyZWFtIGNyb3NzZXMgYnVmZmVyIGJvdW5kYXJ5XG4iKSk7CisJCVdMX0VSUigiZWlfc3RyZWFtIGNyb3NzZXMgYnVmZmVyIGJvdW5kYXJ5XG4iKTsKIAkJcmV0dXJuIC1FTk9TUEM7CiAJfQogCW1lbWNweSgmaWUtPmJ1ZltpZS0+b2Zmc2V0XSwgaWVfc3RyZWFtLCBpZV9zaXplKTsKQEAgLTQwMjMsNyArNDAxNyw3IEBACiAJczMyIGVyciA9IDA7CiAKIAlpZiAodW5saWtlbHkoaWUtPm9mZnNldCA+IGRzdF9zaXplKSkgewotCQlXTF9FUlIoKCJkc3Rfc2l6ZSBpcyBub3QgZW5vdWdoXG4iKSk7CisJCVdMX0VSUigiZHN0X3NpemUgaXMgbm90IGVub3VnaFxuIik7CiAJCXJldHVybiAtRU5PU1BDOwogCX0KIAltZW1jcHkoZHN0LCAmaWUtPmJ1ZlswXSwgaWUtPm9mZnNldCk7CkBAIC00MTIzLDM3ICs0MTE3LDM3IEBACiAJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmd19lbnRyeSA9IE5VTEw7CiAJczMyIGVyciA9IDA7CiAKLQlXTF9EQkcoKCJmaWxlIG5hbWUgOiBcIiVzXCJcbiIsIGZpbGVfbmFtZSkpOworCVdMX0RCRygiZmlsZSBuYW1lIDogXCIlc1wiXG4iLCBmaWxlX25hbWUpOwogCXdsID0gV0xfUFJJVl9HRVQoKTsKIAogCWlmICghdGVzdF9iaXQoV0xfRldfTE9BRElOR19ET05FLCAmd2wtPmZ3LT5zdGF0dXMpKSB7CiAJCWVyciA9IHJlcXVlc3RfZmlybXdhcmUoJndsLT5mdy0+ZndfZW50cnksIGZpbGVfbmFtZSwKIAkJCQkmd2xfY2ZnODAyMTFfZ2V0X3NkaW9fZnVuYygpLT5kZXYpOwogCQlpZiAodW5saWtlbHkoZXJyKSkgewotCQkJV0xfRVJSKCgiQ291bGQgbm90IGRvd25sb2FkIGZ3ICglZClcbiIsIGVycikpOworCQkJV0xfRVJSKCJDb3VsZCBub3QgZG93bmxvYWQgZncgKCVkKVxuIiwgZXJyKTsKIAkJCWdvdG8gcmVxX2Z3X291dDsKIAkJfQogCQlzZXRfYml0KFdMX0ZXX0xPQURJTkdfRE9ORSwgJndsLT5mdy0+c3RhdHVzKTsKIAkJZndfZW50cnkgPSB3bC0+ZnctPmZ3X2VudHJ5OwogCQlpZiAoZndfZW50cnkpIHsKLQkJCVdMX0RCRygoImZ3IHNpemUgKCV6ZCksIGRhdGEgKCVwKVxuIiwgZndfZW50cnktPnNpemUsCi0JCQkJZndfZW50cnktPmRhdGEpKTsKKwkJCVdMX0RCRygiZncgc2l6ZSAoJXpkKSwgZGF0YSAoJXApXG4iLAorCQkJICAgICAgIGZ3X2VudHJ5LT5zaXplLCBmd19lbnRyeS0+ZGF0YSk7CiAJCX0KIAl9IGVsc2UgaWYgKCF0ZXN0X2JpdChXTF9OVlJBTV9MT0FESU5HX0RPTkUsICZ3bC0+ZnctPnN0YXR1cykpIHsKIAkJZXJyID0gcmVxdWVzdF9maXJtd2FyZSgmd2wtPmZ3LT5md19lbnRyeSwgZmlsZV9uYW1lLAogCQkJCSZ3bF9jZmc4MDIxMV9nZXRfc2Rpb19mdW5jKCktPmRldik7CiAJCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCQlXTF9FUlIoKCJDb3VsZCBub3QgZG93bmxvYWQgbnZyYW0gKCVkKVxuIiwgZXJyKSk7CisJCQlXTF9FUlIoIkNvdWxkIG5vdCBkb3dubG9hZCBudnJhbSAoJWQpXG4iLCBlcnIpOwogCQkJZ290byByZXFfZndfb3V0OwogCQl9CiAJCXNldF9iaXQoV0xfTlZSQU1fTE9BRElOR19ET05FLCAmd2wtPmZ3LT5zdGF0dXMpOwogCQlmd19lbnRyeSA9IHdsLT5mdy0+ZndfZW50cnk7CiAJCWlmIChmd19lbnRyeSkgewotCQkJV0xfREJHKCgibnZyYW0gc2l6ZSAoJXpkKSwgZGF0YSAoJXApXG4iLCBmd19lbnRyeS0+c2l6ZSwKLQkJCQlmd19lbnRyeS0+ZGF0YSkpOworCQkJV0xfREJHKCJudnJhbSBzaXplICglemQpLCBkYXRhICglcClcbiIsCisJCQkgICAgICAgZndfZW50cnktPnNpemUsIGZ3X2VudHJ5LT5kYXRhKTsKIAkJfQogCX0gZWxzZSB7Ci0JCVdMX0RCRygoIkRvd25sb2FkaW5nIGFscmVhZHkgZG9uZS4gTm90aGluZyB0byBkbyBtb3JlXG4iKSk7CisJCVdMX0RCRygiRG93bmxvYWRpbmcgYWxyZWFkeSBkb25lLiBOb3RoaW5nIHRvIGRvIG1vcmVcbiIpOwogCQllcnIgPSAtRVBFUk07CiAJfQogCkBAIC00MTg5LDEwICs0MTgzLDEwIEBACiAKIAllcnIgPSB3bF9kZXZfaW50dmFyX3NldChuZGV2LCAibXBjIiwgbXBjKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJmYWlsIHRvIHNldCBtcGNcbiIpKTsKKwkJV0xfRVJSKCJmYWlsIHRvIHNldCBtcGNcbiIpOwogCQlyZXR1cm47CiAJfQotCVdMX0RCRygoIk1QQyA6ICVkXG4iLCBtcGMpKTsKKwlXTF9EQkcoIk1QQyA6ICVkXG4iLCBtcGMpOwogfQogCiBzdGF0aWMgaW50IHdsX2RlYnVnZnNfYWRkX25ldGRldl9wYXJhbXMoc3RydWN0IHdsX3ByaXYgKndsKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy93bF9jZmc4MDIxMS5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy93bF9jZmc4MDIxMS5oCmluZGV4IDc3MGU2M2YuLjQ4MjY5MWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvd2xfY2ZnODAyMTEuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL3dsX2NmZzgwMjExLmgKQEAgLTU0LDM0ICs1NCwzNiBAQAogCiAjZGVmaW5lIFdMX0RCR19MRVZFTCAxCQkvKiAwIGludmFsaWRhdGVzIGFsbCBkZWJ1ZyBtZXNzYWdlcy4KIAkJCQkgZGVmYXVsdCBpcyAxICovCi0jZGVmaW5lCVdMX0VSUihhcmdzKQkJCQkJCQkJCVwKLWRvIHsJCQkJCQkJCQkJXAotCWlmICh3bF9kYmdfbGV2ZWwgJiBXTF9EQkdfRVJSKSB7CQkJCVwKLQkJaWYgKG5ldF9yYXRlbGltaXQoKSkgewkJCQkJCVwKLQkJCXByaW50ayhLRVJOX0VSUiAiRVJST1IgQCVzIDogIiwgX19mdW5jX18pOwlcCi0JCQlwcmludGsgYXJnczsJCQkJCQlcCi0JCX0gCQkJCQkJCQlcCi0JfQkJCQkJCQkJCVwKKyNkZWZpbmUJV0xfRVJSKGZtdCwgYXJncy4uLikJCQkJCVwKK2RvIHsJCQkJCQkJCVwKKwlpZiAod2xfZGJnX2xldmVsICYgV0xfREJHX0VSUikgewkJCVwKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkgewkJCQlcCisJCQlwcmludGsoS0VSTl9FUlIgIkVSUk9SIEAlcyA6ICIgZm10LAlcCisJCQkgICAgICAgX19mdW5jX18sICMjYXJncyk7CQlcCisJCX0JCQkJCQlcCisJfQkJCQkJCQlcCiB9IHdoaWxlICgwKQotI2RlZmluZQlXTF9JTkZPKGFyZ3MpCQkJCQkJCQkJXAotZG8gewkJCQkJCQkJCQlcCi0JaWYgKHdsX2RiZ19sZXZlbCAmIFdMX0RCR19JTkZPKSB7CQkJCVwKLQkJaWYgKG5ldF9yYXRlbGltaXQoKSkgewkJCQkJCVwKLQkJCXByaW50ayhLRVJOX0VSUiAiSU5GTyBAJXMgOiAiLCBfX2Z1bmNfXyk7CVwKLQkJCXByaW50ayBhcmdzOwkJCQkJCVwKLQkJfQkJCQkJCQkJXAotCX0JCQkJCQkJCQlcCisKKyNkZWZpbmUJV0xfSU5GTyhmbXQsIGFyZ3MuLi4pCQkJCQlcCitkbyB7CQkJCQkJCQlcCisJaWYgKHdsX2RiZ19sZXZlbCAmIFdMX0RCR19JTkZPKSB7CQkJXAorCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CQkJCVwKKwkJCXByaW50ayhLRVJOX0VSUiAiSU5GTyBAJXMgOiAiIGZtdCwJXAorCQkJICAgICAgIF9fZnVuY19fLCAjI2FyZ3MpOwkJXAorCQl9CQkJCQkJXAorCX0JCQkJCQkJXAogfSB3aGlsZSAoMCkKKwogI2lmIChXTF9EQkdfTEVWRUwgPiAwKQotI2RlZmluZQlXTF9EQkcoYXJncykJCQkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCisjZGVmaW5lCVdMX0RCRyhmbXQsIGFyZ3MuLi4pCQkJCQlcCitkbyB7CQkJCQkJCQlcCiAJaWYgKHdsX2RiZ19sZXZlbCAmIFdMX0RCR19EQkcpIHsJCQlcCi0JCXByaW50ayhLRVJOX0VSUiAiREVCVUcgQCVzIDoiLCBfX2Z1bmNfXyk7CVwKLQkJcHJpbnRrIGFyZ3M7CQkJCQkJCVwKLQl9CQkJCQkJCQkJXAorCQlwcmludGsoS0VSTl9FUlIgIkRFQlVHIEAlcyA6IiBmbXQsCQlcCisJCSAgICAgICBfX2Z1bmNfXywgIyNhcmdzKTsJCQlcCisJfQkJCQkJCQlcCiB9IHdoaWxlICgwKQogI2Vsc2UJCQkJLyogIShXTF9EQkdfTEVWRUwgPiAwKSAqLwotI2RlZmluZQlXTF9EQkcoYXJncykKKyNkZWZpbmUJV0xfREJHKGZtdCwgYXJncy4uLikgbm9wcmludGsoZm10LCAjI2FyZ3MpCiAjZW5kaWYJCQkJLyogKFdMX0RCR19MRVZFTCA+IDApICovCiAKICNkZWZpbmUgV0xfU0NBTl9SRVRSWV9NQVgJMwkvKiB1c2VkIGZvciBpYnNzIHNjYW4gKi8KQEAgLTIzNyw3ICsyMzksNyBAQAogc3RydWN0IHdsX3Byb2ZpbGUgewogCXUzMiBtb2RlOwogCXN0cnVjdCB3bGNfc3NpZCBzc2lkOwotCXU4IGJzc2lkW0VUSEVSX0FERFJfTEVOXTsKKwl1OCBic3NpZFtFVEhfQUxFTl07CiAJdTE2IGJlYWNvbl9pbnRlcnZhbDsKIAl1OCBkdGltX3BlcmlvZDsKIAlzdHJ1Y3Qgd2xfc2VjdXJpdHkgc2VjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy93bF9pdy5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy93bF9pdy5jCmluZGV4IDk3OWE0OTQuLmRiNmU2OGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvd2xfaXcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL3dsX2l3LmMKQEAgLTE1LDggKzE1LDkgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KLSNpbmNsdWRlIDxsaW51eHZlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPG9zbC5oPgogI2luY2x1ZGUgPHdsaW9jdGwuaD4KIApAQCAtMzEsMjAgKzMyLDE4IEBACiAjaW5jbHVkZSA8ZGhkLmg+CiAjaW5jbHVkZSA8ZGhkaW9jdGwuaD4KIAotdHlwZWRlZiB2b2lkIHdsY19pbmZvX3Q7Ci10eXBlZGVmIHZvaWQgd2xfaW5mb190OwogdHlwZWRlZiBjb25zdCBzdHJ1Y3Qgc2lfcHViIHNpX3Q7CiAjaW5jbHVkZSA8d2xpb2N0bC5oPgogCiAjaW5jbHVkZSA8cHJvdG8vZXRoZXJuZXQuaD4KICNpbmNsdWRlIDxkbmdsX3N0YXRzLmg+CiAjaW5jbHVkZSA8ZGhkLmg+Ci0jZGVmaW5lIFdMX0VSUk9SKHgpIHByaW50ZiB4Ci0jZGVmaW5lIFdMX1RSQUNFKHgpCi0jZGVmaW5lIFdMX0FTU09DKHgpCi0jZGVmaW5lIFdMX0lORk9STSh4KQotI2RlZmluZSBXTF9XU0VDKHgpCi0jZGVmaW5lIFdMX1NDQU4oeCkKKworI2RlZmluZSBXTF9FUlJPUihmbXQsIGFyZ3MuLi4pCXByaW50ayhmbXQsICMjYXJncykKKyNkZWZpbmUgV0xfVFJBQ0UoZm10LCBhcmdzLi4uKQlub19wcmludGsoZm10LCAjI2FyZ3MpCisjZGVmaW5lIFdMX0lORk9STShmbXQsIGFyZ3MuLi4pCW5vX3ByaW50ayhmbXQsICMjYXJncykKKyNkZWZpbmUgV0xfV1NFQyhmbXQsIGFyZ3MuLi4pCW5vX3ByaW50ayhmbXQsICMjYXJncykKKyNkZWZpbmUgV0xfU0NBTihmbXQsIGFyZ3MuLi4pCW5vX3ByaW50ayhmbXQsICMjYXJncykKIAogI2luY2x1ZGUgPHdsX2l3Lmg+CiAKQEAgLTE4NywxMiArMTg2LDEyIEBACiAJaW50IHJldCA9IC1FSU5WQUw7CiAKIAlpZiAoIWRldikgewotCQlXTF9FUlJPUigoIiVzOiBkZXYgaXMgbnVsbFxuIiwgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIiVzOiBkZXYgaXMgbnVsbFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gcmV0OwogCX0KIAotCVdMX0lORk9STSgoIlxuJXMsIFBJRDoleDogc2VuZCBMb2NhbCBJT0NUTCAtPiBkaGQ6IGNtZDoweCV4LCBidWY6JXAsICIKLQkJImxlbjolZCAsXG4iLCBfX2Z1bmNfXywgY3VycmVudC0+cGlkLCBjbWQsIGFyZywgbGVuKSk7CisJV0xfSU5GT1JNKCJcbiVzLCBQSUQ6JXg6IHNlbmQgTG9jYWwgSU9DVEwgLT4gZGhkOiBjbWQ6MHgleCwgYnVmOiVwLCBsZW46JWRcbiIsCisJCSAgX19mdW5jX18sIGN1cnJlbnQtPnBpZCwgY21kLCBhcmcsIGxlbik7CiAKIAlpZiAoZ19vbm9mZiA9PSBHX1dMQU5fU0VUX09OKSB7CiAJCW1lbXNldCgmaW9jLCAwLCBzaXplb2YoaW9jKSk7CkBAIC0yMDUsNyArMjA0LDcgQEAKIAogCQlyZXQgPSBkZXZfb3BlbihkZXYpOwogCQlpZiAocmV0KSB7Ci0JCQlXTF9FUlJPUigoIiVzOiBFcnJvciBkZXZfb3BlbjogJWRcbiIsIF9fZnVuY19fLCByZXQpKTsKKwkJCVdMX0VSUk9SKCIlczogRXJyb3IgZGV2X29wZW46ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKIAkJCXJldHVybiByZXQ7CiAJCX0KIApAQCAtMjE0LDcgKzIxMyw3IEBACiAJCXJldCA9IGRldi0+bmV0ZGV2X29wcy0+bmRvX2RvX2lvY3RsKGRldiwgJmlmciwgU0lPQ0RFVlBSSVZBVEUpOwogCQlzZXRfZnMoZnMpOwogCX0gZWxzZSB7Ci0JCVdMX1RSQUNFKCgiJXM6IGNhbGwgYWZ0ZXIgZHJpdmVyIHN0b3AgOiBpZ25vcmVkXG4iLCBfX2Z1bmNfXykpOworCQlXTF9UUkFDRSgiJXM6IGNhbGwgYWZ0ZXIgZHJpdmVyIHN0b3AgOiBpZ25vcmVkXG4iLCBfX2Z1bmNfXyk7CiAJfQogCXJldHVybiByZXQ7CiB9CkBAIC0zMzUsNyArMzM0LDcgQEAKIAlpbnQgZXJyb3I7CiAJc3RydWN0IHNvY2thZGRyIGJzc2lkOwogCi0JV0xfVFJBQ0UoKCIlczogU0lPQ1NJV0NPTU1JVFxuIiwgZGV2LT5uYW1lKSk7CisJV0xfVFJBQ0UoIiVzOiBTSU9DU0lXQ09NTUlUXG4iLCBkZXYtPm5hbWUpOwogCiAJZXJyb3IgPSBkZXZfd2xjX2lvY3RsKGRldiwgV0xDX0dFVF9TU0lELCAmc3NpZCwgc2l6ZW9mKHNzaWQpKTsKIAlpZiAoZXJyb3IpCkBAIC0zNDYsMTEgKzM0NSwxMSBAQAogCWlmICghc3NpZC5TU0lEX2xlbikKIAkJcmV0dXJuIDA7CiAKLQliemVybygmYnNzaWQsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpKTsKLQllcnJvciA9IGRldl93bGNfaW9jdGwoZGV2LCBXTENfUkVBU1NPQywgJmJzc2lkLCBFVEhFUl9BRERSX0xFTik7CisJbWVtc2V0KCZic3NpZCwgMCwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikpOworCWVycm9yID0gZGV2X3dsY19pb2N0bChkZXYsIFdMQ19SRUFTU09DLCAmYnNzaWQsIEVUSF9BTEVOKTsKIAlpZiAoZXJyb3IpIHsKLQkJV0xfRVJST1IoKCIlczogV0xDX1JFQVNTT0MgdG8gJXMgZmFpbGVkIFxuIiwgX19mdW5jX18sCi0JCQkgIHNzaWQuU1NJRCkpOworCQlXTF9FUlJPUigiJXM6IFdMQ19SRUFTU09DIHRvICVzIGZhaWxlZFxuIiwKKwkJCSBfX2Z1bmNfXywgc3NpZC5TU0lEKTsKIAkJcmV0dXJuIGVycm9yOwogCX0KIApAQCAtMzYxLDcgKzM2MCw3IEBACiB3bF9pd19nZXRfbmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLCBjaGFyICpjd3JxLCBjaGFyICpleHRyYSkKIHsKLQlXTF9UUkFDRSgoIiVzOiBTSU9DR0lXTkFNRVxuIiwgZGV2LT5uYW1lKSk7CisJV0xfVFJBQ0UoIiVzOiBTSU9DR0lXTkFNRVxuIiwgZGV2LT5uYW1lKTsKIAogCXN0cmNweShjd3JxLCAiSUVFRSA4MDIuMTEtRFMiKTsKIApAQCAtMzc1LDcgKzM3NCw3IEBACiAJaW50IGVycm9yLCBjaGFuOwogCXVpbnQgc2YgPSAwOwogCi0JV0xfVFJBQ0UoKCJcbiAlcyAlczogU0lPQ1NJV0ZSRVFcbiIsIF9fZnVuY19fLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiXG4gJXMgJXM6IFNJT0NTSVdGUkVRXG4iLCBfX2Z1bmNfXywgZGV2LT5uYW1lKTsKIAogCWlmIChmd3JxLT5lID09IDAgJiYgZndycS0+bSA8IE1BWENIQU5ORUwpIHsKIAkJY2hhbiA9IGZ3cnEtPm07CkBAIC00MTAsNyArNDA5LDcgQEAKIAljaGFubmVsX2luZm9fdCBjaTsKIAlpbnQgZXJyb3I7CiAKLQlXTF9UUkFDRSgoIiVzOiBTSU9DR0lXRlJFUVxuIiwgZGV2LT5uYW1lKSk7CisJV0xfVFJBQ0UoIiVzOiBTSU9DR0lXRlJFUVxuIiwgZGV2LT5uYW1lKTsKIAogCWVycm9yID0gZGV2X3dsY19pb2N0bChkZXYsIFdMQ19HRVRfQ0hBTk5FTCwgJmNpLCBzaXplb2YoY2kpKTsKIAlpZiAoZXJyb3IpCkBAIC00MjcsNyArNDI2LDcgQEAKIHsKIAlpbnQgaW5mcmEgPSAwLCBhcCA9IDAsIGVycm9yID0gMDsKIAotCVdMX1RSQUNFKCgiJXM6IFNJT0NTSVdNT0RFXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NTSVdNT0RFXG4iLCBkZXYtPm5hbWUpOwogCiAJc3dpdGNoICgqdXdycSkgewogCWNhc2UgSVdfTU9ERV9NQVNURVI6CkBAIC00NjIsNyArNDYxLDcgQEAKIHsKIAlpbnQgZXJyb3IsIGluZnJhID0gMCwgYXAgPSAwOwogCi0JV0xfVFJBQ0UoKCIlczogU0lPQ0dJV01PREVcbiIsIGRldi0+bmFtZSkpOworCVdMX1RSQUNFKCIlczogU0lPQ0dJV01PREVcbiIsIGRldi0+bmFtZSk7CiAKIAllcnJvciA9IGRldl93bGNfaW9jdGwoZGV2LCBXTENfR0VUX0lORlJBLCAmaW5mcmEsIHNpemVvZihpbmZyYSkpOwogCWlmIChlcnJvcikKQEAgLTUwMSwxNCArNTAwLDE0IEBACiAJezMwLCA2MCwgOTAsIDEyMCwgMTgwLCAyNDAsIDI3MCwgMzAwfQogCX07CiAKLQlXTF9UUkFDRSgoIiVzOiBTSU9DR0lXUkFOR0VcbiIsIGRldi0+bmFtZSkpOworCVdMX1RSQUNFKCIlczogU0lPQ0dJV1JBTkdFXG4iLCBkZXYtPm5hbWUpOwogCiAJaWYgKCFleHRyYSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAljaGFubmVscyA9IGttYWxsb2MoKE1BWENIQU5ORUwgKyAxKSAqIDQsIEdGUF9LRVJORUwpOwogCWlmICghY2hhbm5lbHMpIHsKLQkJV0xfRVJST1IoKCJDb3VsZCBub3QgYWxsb2MgY2hhbm5lbHNcbiIpKTsKKwkJV0xfRVJST1IoIkNvdWxkIG5vdCBhbGxvYyBjaGFubmVsc1xuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlsaXN0ID0gKHdsX3UzMl9saXN0X3QgKikgY2hhbm5lbHM7CkBAIC02ODQsMTQgKzY4MywxNCBAQAogCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKilleHRyYTsKIAlpbnQgaTsKIAotCVdMX1RSQUNFKCgiJXM6IFNJT0NTSVdTUFlcbiIsIGRldi0+bmFtZSkpOworCVdMX1RSQUNFKCIlczogU0lPQ1NJV1NQWVxuIiwgZGV2LT5uYW1lKTsKIAogCWlmICghZXh0cmEpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaXctPnNweV9udW0gPSBtaW5fdChpbnQsIEFSUkFZX1NJWkUoaXctPnNweV9hZGRyKSwgZHdycS0+bGVuZ3RoKTsKIAlmb3IgKGkgPSAwOyBpIDwgaXctPnNweV9udW07IGkrKykKLQkJbWVtY3B5KCZpdy0+c3B5X2FkZHJbaV0sIGFkZHJbaV0uc2FfZGF0YSwgRVRIRVJfQUREUl9MRU4pOworCQltZW1jcHkoJml3LT5zcHlfYWRkcltpXSwgYWRkcltpXS5zYV9kYXRhLCBFVEhfQUxFTik7CiAJbWVtc2V0KGl3LT5zcHlfcXVhbCwgMCwgc2l6ZW9mKGl3LT5zcHlfcXVhbCkpOwogCiAJcmV0dXJuIDA7CkBAIC03MDYsMTQgKzcwNSwxNCBAQAogCXN0cnVjdCBpd19xdWFsaXR5ICpxdWFsID0gKHN0cnVjdCBpd19xdWFsaXR5ICopJmFkZHJbaXctPnNweV9udW1dOwogCWludCBpOwogCi0JV0xfVFJBQ0UoKCIlczogU0lPQ0dJV1NQWVxuIiwgZGV2LT5uYW1lKSk7CisJV0xfVFJBQ0UoIiVzOiBTSU9DR0lXU1BZXG4iLCBkZXYtPm5hbWUpOwogCiAJaWYgKCFleHRyYSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlkd3JxLT5sZW5ndGggPSBpdy0+c3B5X251bTsKIAlmb3IgKGkgPSAwOyBpIDwgaXctPnNweV9udW07IGkrKykgewotCQltZW1jcHkoYWRkcltpXS5zYV9kYXRhLCAmaXctPnNweV9hZGRyW2ldLCBFVEhFUl9BRERSX0xFTik7CisJCW1lbWNweShhZGRyW2ldLnNhX2RhdGEsICZpdy0+c3B5X2FkZHJbaV0sIEVUSF9BTEVOKTsKIAkJYWRkcltpXS5zYV9mYW1pbHkgPSBBRl9VTklYOwogCQltZW1jcHkoJnF1YWxbaV0sICZpdy0+c3B5X3F1YWxbaV0sIHNpemVvZihzdHJ1Y3QgaXdfcXVhbGl0eSkpOwogCQlpdy0+c3B5X3F1YWxbaV0udXBkYXRlZCA9IDA7CkBAIC03NTEsOCArNzUwLDggQEAKIAkJam9pbl9wYXJhbXMtPnBhcmFtcy5jaGFuc3BlY19udW0gPQogCQkgICAgaHRvZDMyKGpvaW5fcGFyYW1zLT5wYXJhbXMuY2hhbnNwZWNfbnVtKTsKIAotCQlXTF9UUkFDRSgoIiVzICBqb2luX3BhcmFtcy0+cGFyYW1zLmNoYW5zcGVjX2xpc3RbMF09ICVYXG4iLAotCQkJICBfX2Z1bmNfXywgam9pbl9wYXJhbXMtPnBhcmFtcy5jaGFuc3BlY19saXN0WzBdKSk7CisJCVdMX1RSQUNFKCIlcyAgam9pbl9wYXJhbXMtPnBhcmFtcy5jaGFuc3BlY19saXN0WzBdPSAlWFxuIiwKKwkJCSBfX2Z1bmNfXywgam9pbl9wYXJhbXMtPnBhcmFtcy5jaGFuc3BlY19saXN0WzBdKTsKIAl9CiAJcmV0dXJuIDE7CiB9CkBAIC03NjUsMTYgKzc2NCwxNyBAQAogCXdsX2pvaW5fcGFyYW1zX3Qgam9pbl9wYXJhbXM7CiAJaW50IGpvaW5fcGFyYW1zX3NpemU7CiAKLQlXTF9UUkFDRSgoIiVzOiBTSU9DU0lXQVBcbiIsIGRldi0+bmFtZSkpOworCVdMX1RSQUNFKCIlczogU0lPQ1NJV0FQXG4iLCBkZXYtPm5hbWUpOwogCiAJaWYgKGF3cnEtPnNhX2ZhbWlseSAhPSBBUlBIUkRfRVRIRVIpIHsKLQkJV0xfRVJST1IoKCJJbnZhbGlkIEhlYWRlci4uLnNhX2ZhbWlseVxuIikpOworCQlXTF9FUlJPUigiSW52YWxpZCBIZWFkZXIuLi5zYV9mYW1pbHlcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAoRVRIRVJfSVNCQ0FTVChhd3JxLT5zYV9kYXRhKSB8fCBFVEhFUl9JU05VTExBRERSKGF3cnEtPnNhX2RhdGEpKSB7CisJaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGF3cnEtPnNhX2RhdGEpIHx8CisJICAgIGlzX3plcm9fZXRoZXJfYWRkcihhd3JxLT5zYV9kYXRhKSkgewogCQlzY2JfdmFsX3Qgc2NidmFsOwotCQliemVybygmc2NidmFsLCBzaXplb2Yoc2NiX3ZhbF90KSk7CisJCW1lbXNldCgmc2NidmFsLCAwLCBzaXplb2Yoc2NiX3ZhbF90KSk7CiAJCSh2b2lkKWRldl93bGNfaW9jdGwoZGV2LCBXTENfRElTQVNTT0MsICZzY2J2YWwsCiAJCQkJICAgIHNpemVvZihzY2JfdmFsX3QpKTsKIAkJcmV0dXJuIDA7CkBAIC03ODUsMjMgKzc4NSwyMyBAQAogCiAJbWVtY3B5KGpvaW5fcGFyYW1zLnNzaWQuU1NJRCwgZ19zc2lkLlNTSUQsIGdfc3NpZC5TU0lEX2xlbik7CiAJam9pbl9wYXJhbXMuc3NpZC5TU0lEX2xlbiA9IGh0b2QzMihnX3NzaWQuU1NJRF9sZW4pOwotCW1lbWNweSgmam9pbl9wYXJhbXMucGFyYW1zLmJzc2lkLCBhd3JxLT5zYV9kYXRhLCBFVEhFUl9BRERSX0xFTik7CisJbWVtY3B5KCZqb2luX3BhcmFtcy5wYXJhbXMuYnNzaWQsIGF3cnEtPnNhX2RhdGEsIEVUSF9BTEVOKTsKIAotCVdMX1RSQUNFKCgiJXMgIHRhcmdldF9jaGFubmVsPSVkXG4iLCBfX2Z1bmNfXywKLQkJICBnX3dsX2l3X3BhcmFtcy50YXJnZXRfY2hhbm5lbCkpOworCVdMX1RSQUNFKCIlcyAgdGFyZ2V0X2NoYW5uZWw9JWRcbiIsCisJCSBfX2Z1bmNfXywgZ193bF9pd19wYXJhbXMudGFyZ2V0X2NoYW5uZWwpOwogCXdsX2l3X2NoX3RvX2NoYW5zcGVjKGdfd2xfaXdfcGFyYW1zLnRhcmdldF9jaGFubmVsLCAmam9pbl9wYXJhbXMsCiAJCQkgICAgICZqb2luX3BhcmFtc19zaXplKTsKIAogCWVycm9yID0gZGV2X3dsY19pb2N0bChkZXYsIFdMQ19TRVRfU1NJRCwgJmpvaW5fcGFyYW1zLAogCQkJCWpvaW5fcGFyYW1zX3NpemUpOwogCWlmIChlcnJvcikgewotCQlXTF9FUlJPUigoIiVzIEludmFsaWQgaW9jdGwgZGF0YT0lZFxuIiwgX19mdW5jX18sIGVycm9yKSk7CisJCVdMX0VSUk9SKCIlcyBJbnZhbGlkIGlvY3RsIGRhdGE9JWRcbiIsIF9fZnVuY19fLCBlcnJvcik7CiAJfQogCiAJaWYgKGdfc3NpZC5TU0lEX2xlbikgewotCQlXTF9UUkFDRSgoIiVzOiBqb2luIFNTSUQ9JXMgQlNTSUQ9JXBNIGNoPSVkXG4iLAotCQkJICBfX2Z1bmNfXywgZ19zc2lkLlNTSUQsIGF3cnEtPnNhX2RhdGEsCi0JCQkgIGdfd2xfaXdfcGFyYW1zLnRhcmdldF9jaGFubmVsKSk7CisJCVdMX1RSQUNFKCIlczogam9pbiBTU0lEPSVzIEJTU0lEPSVwTSBjaD0lZFxuIiwKKwkJCSBfX2Z1bmNfXywgZ19zc2lkLlNTSUQsIGF3cnEtPnNhX2RhdGEsCisJCQkgZ193bF9pd19wYXJhbXMudGFyZ2V0X2NoYW5uZWwpOwogCX0KIAogCW1lbXNldCgmZ19zc2lkLCAwLCBzaXplb2YoZ19zc2lkKSk7CkBAIC04MTIsMTIgKzgxMiwxMiBAQAogd2xfaXdfZ2V0X3dhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIHN0cnVjdCBzb2NrYWRkciAqYXdycSwgY2hhciAqZXh0cmEpCiB7Ci0JV0xfVFJBQ0UoKCIlczogU0lPQ0dJV0FQXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NHSVdBUFxuIiwgZGV2LT5uYW1lKTsKIAogCWF3cnEtPnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKLQltZW1zZXQoYXdycS0+c2FfZGF0YSwgMCwgRVRIRVJfQUREUl9MRU4pOworCW1lbXNldChhd3JxLT5zYV9kYXRhLCAwLCBFVEhfQUxFTik7CiAKLQkodm9pZClkZXZfd2xjX2lvY3RsKGRldiwgV0xDX0dFVF9CU1NJRCwgYXdycS0+c2FfZGF0YSwgRVRIRVJfQUREUl9MRU4pOworCSh2b2lkKWRldl93bGNfaW9jdGwoZGV2LCBXTENfR0VUX0JTU0lELCBhd3JxLT5zYV9kYXRhLCBFVEhfQUxFTik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTgzMSwxNiArODMxLDE2IEBACiAJc2NiX3ZhbF90IHNjYnZhbDsKIAlpbnQgZXJyb3IgPSAtRUlOVkFMOwogCi0JV0xfVFJBQ0UoKCIlczogU0lPQ1NJV01MTUUgRElTQVNTT0MvREVBVVRIXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NTSVdNTE1FIERJU0FTU09DL0RFQVVUSFxuIiwgZGV2LT5uYW1lKTsKIAogCW1sbWUgPSAoc3RydWN0IGl3X21sbWUgKilleHRyYTsKIAlpZiAobWxtZSA9PSBOVUxMKSB7Ci0JCVdMX0VSUk9SKCgiSW52YWxpZCBpb2N0bCBkYXRhLlxuIikpOworCQlXTF9FUlJPUigiSW52YWxpZCBpb2N0bCBkYXRhXG4iKTsKIAkJcmV0dXJuIGVycm9yOwogCX0KIAogCXNjYnZhbC52YWwgPSBtbG1lLT5yZWFzb25fY29kZTsKLQliY29weSgmbWxtZS0+YWRkci5zYV9kYXRhLCAmc2NidmFsLmVhLCBFVEhFUl9BRERSX0xFTik7CisJYmNvcHkoJm1sbWUtPmFkZHIuc2FfZGF0YSwgJnNjYnZhbC5lYSwgRVRIX0FMRU4pOwogCiAJaWYgKG1sbWUtPmNtZCA9PSBJV19NTE1FX0RJU0FTU09DKSB7CiAJCXNjYnZhbC52YWwgPSBodG9kMzIoc2NidmFsLnZhbCk7CkBAIC04NTMsNyArODUzLDcgQEAKIAkJICAgIGRldl93bGNfaW9jdGwoZGV2LCBXTENfU0NCX0RFQVVUSEVOVElDQVRFX0ZPUl9SRUFTT04sCiAJCQkJICAmc2NidmFsLCBzaXplb2Yoc2NiX3ZhbF90KSk7CiAJfSBlbHNlIHsKLQkJV0xfRVJST1IoKCJJbnZhbGlkIGlvY3RsIGRhdGEuXG4iKSk7CisJCVdMX0VSUk9SKCJJbnZhbGlkIGlvY3RsIGRhdGFcbiIpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQogCkBAIC04NzQsNyArODc0LDcgQEAKIAlpbnQgZXJyb3IsIGk7CiAJdWludCBidWZsZW4gPSBkd3JxLT5sZW5ndGg7CiAKLQlXTF9UUkFDRSgoIiVzOiBTSU9DR0lXQVBMSVNUXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NHSVdBUExJU1RcbiIsIGRldi0+bmFtZSk7CiAKIAlpZiAoIWV4dHJhKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTg4Niw3ICs4ODYsNyBAQAogCWxpc3QtPmJ1ZmxlbiA9IGh0b2QzMihidWZsZW4pOwogCWVycm9yID0gZGV2X3dsY19pb2N0bChkZXYsIFdMQ19TQ0FOX1JFU1VMVFMsIGxpc3QsIGJ1Zmxlbik7CiAJaWYgKGVycm9yKSB7Ci0JCVdMX0VSUk9SKCgiJWQ6IFNjYW4gcmVzdWx0cyBlcnJvciAlZFxuIiwgX19MSU5FX18sIGVycm9yKSk7CisJCVdMX0VSUk9SKCIlZDogU2NhbiByZXN1bHRzIGVycm9yICVkXG4iLCBfX0xJTkVfXywgZXJyb3IpOwogCQlrZnJlZShsaXN0KTsKIAkJcmV0dXJuIGVycm9yOwogCX0KQEAgLTg5NCw4ICs4OTQsOCBAQAogCWxpc3QtPnZlcnNpb24gPSBkdG9oMzIobGlzdC0+dmVyc2lvbik7CiAJbGlzdC0+Y291bnQgPSBkdG9oMzIobGlzdC0+Y291bnQpOwogCWlmIChsaXN0LT52ZXJzaW9uICE9IFdMX0JTU19JTkZPX1ZFUlNJT04pIHsKLQkJV0xfRVJST1IoKCIlcyA6IGxpc3QtPnZlcnNpb24gJWQgIT0gV0xfQlNTX0lORk9fVkVSU0lPTlxuIiwKLQkJCSAgX19mdW5jX18sIGxpc3QtPnZlcnNpb24pKTsKKwkJV0xfRVJST1IoIiVzIDogbGlzdC0+dmVyc2lvbiAlZCAhPSBXTF9CU1NfSU5GT19WRVJTSU9OXG4iLAorCQkJIF9fZnVuY19fLCBsaXN0LT52ZXJzaW9uKTsKIAkJa2ZyZWUobGlzdCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTkxMSw3ICs5MTEsNyBAQAogCQlpZiAoIShkdG9oMTYoYmktPmNhcGFiaWxpdHkpICYgRE9UMTFfQ0FQX0VTUykpCiAJCQljb250aW51ZTsKIAotCQltZW1jcHkoYWRkcltkd3JxLT5sZW5ndGhdLnNhX2RhdGEsICZiaS0+QlNTSUQsIEVUSEVSX0FERFJfTEVOKTsKKwkJbWVtY3B5KGFkZHJbZHdycS0+bGVuZ3RoXS5zYV9kYXRhLCAmYmktPkJTU0lELCBFVEhfQUxFTik7CiAJCWFkZHJbZHdycS0+bGVuZ3RoXS5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CiAJCXF1YWxbZHdycS0+bGVuZ3RoXS5xdWFsID0gcnNzaV90b19xdWFsKGR0b2gxNihiaS0+UlNTSSkpOwogCQlxdWFsW2R3cnEtPmxlbmd0aF0ubGV2ZWwgPSAweDEwMCArIGR0b2gxNihiaS0+UlNTSSk7CkBAIC05NTIsMTMgKzk1MiwxMyBAQAogCXdsX2Jzc19pbmZvX3QgKmJpID0gTlVMTDsKIAlpbnQgaTsKIAotCVdMX1RSQUNFKCgiJXM6IFNJT0NHSVdBUExJU1RcbiIsIGRldi0+bmFtZSkpOworCVdMX1RSQUNFKCIlczogU0lPQ0dJV0FQTElTVFxuIiwgZGV2LT5uYW1lKTsKIAogCWlmICghZXh0cmEpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKCghaXNjYW4pIHx8ICghaXNjYW4tPnN5c2lvY190c2spKSB7Ci0JCVdMX0VSUk9SKCgiJXMgZXJyb3JcbiIsIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCIlcyBlcnJvclxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTk2Niw5ICs5NjYsOCBAQAogCXdoaWxlIChidWYpIHsKIAkJbGlzdCA9ICYoKHdsX2lzY2FuX3Jlc3VsdHNfdCAqKSBidWYtPmlzY2FuX2J1ZiktPnJlc3VsdHM7CiAJCWlmIChsaXN0LT52ZXJzaW9uICE9IFdMX0JTU19JTkZPX1ZFUlNJT04pIHsKLQkJCVdMX0VSUk9SKCgiJXMgOiBsaXN0LT52ZXJzaW9uICVkICE9ICIKLQkJCQkiV0xfQlNTX0lORk9fVkVSU0lPTlxuIiwKLQkJCQlfX2Z1bmNfXywgbGlzdC0+dmVyc2lvbikpOworCQkJV0xfRVJST1IoIiVzIDogbGlzdC0+dmVyc2lvbiAlZCAhPSBXTF9CU1NfSU5GT19WRVJTSU9OXG4iLAorCQkJCSBfX2Z1bmNfXywgbGlzdC0+dmVyc2lvbik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCkBAIC05ODUsNyArOTg0LDcgQEAKIAkJCQljb250aW51ZTsKIAogCQkJbWVtY3B5KGFkZHJbZHdycS0+bGVuZ3RoXS5zYV9kYXRhLCAmYmktPkJTU0lELAotCQkJICAgICAgIEVUSEVSX0FERFJfTEVOKTsKKwkJCSAgICAgICBFVEhfQUxFTik7CiAJCQlhZGRyW2R3cnEtPmxlbmd0aF0uc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwogCQkJcXVhbFtkd3JxLT5sZW5ndGhdLnF1YWwgPQogCQkJICAgIHJzc2lfdG9fcXVhbChkdG9oMTYoYmktPlJTU0kpKTsKQEAgLTEwMTYsNyArMTAxNSw3IEBACiB7CiAJaW50IGVyciA9IDA7CiAKLQltZW1jcHkoJnBhcmFtcy0+YnNzaWQsICZldGhlcl9iY2FzdCwgRVRIRVJfQUREUl9MRU4pOworCW1lbWNweSgmcGFyYW1zLT5ic3NpZCwgJmV0aGVyX2JjYXN0LCBFVEhfQUxFTik7CiAJcGFyYW1zLT5ic3NfdHlwZSA9IERPVDExX0JTU1RZUEVfQU5ZOwogCXBhcmFtcy0+c2Nhbl90eXBlID0gMDsKIAlwYXJhbXMtPm5wcm9iZXMgPSAtMTsKQEAgLTEwNDMsMTUgKzEwNDIsMTUgQEAKIAlpc2Nhbi0+aXNjYW5fZXhfcGFyYW1zX3AtPmFjdGlvbiA9IGh0b2QxNihhY3Rpb24pOwogCWlzY2FuLT5pc2Nhbl9leF9wYXJhbXNfcC0+c2Nhbl9kdXJhdGlvbiA9IGh0b2QxNigwKTsKIAotCVdMX1NDQU4oKCIlcyA6IG5wcm9iZXM9JWRcbiIsIF9fZnVuY19fLAotCQkgaXNjYW4tPmlzY2FuX2V4X3BhcmFtc19wLT5wYXJhbXMubnByb2JlcykpOwotCVdMX1NDQU4oKCJhY3RpdmVfdGltZT0lZFxuIiwKLQkJIGlzY2FuLT5pc2Nhbl9leF9wYXJhbXNfcC0+cGFyYW1zLmFjdGl2ZV90aW1lKSk7Ci0JV0xfU0NBTigoInBhc3NpdmVfdGltZT0lZFxuIiwKLQkJIGlzY2FuLT5pc2Nhbl9leF9wYXJhbXNfcC0+cGFyYW1zLnBhc3NpdmVfdGltZSkpOwotCVdMX1NDQU4oKCJob21lX3RpbWU9JWRcbiIsIGlzY2FuLT5pc2Nhbl9leF9wYXJhbXNfcC0+cGFyYW1zLmhvbWVfdGltZSkpOwotCVdMX1NDQU4oKCJzY2FuX3R5cGU9JWRcbiIsIGlzY2FuLT5pc2Nhbl9leF9wYXJhbXNfcC0+cGFyYW1zLnNjYW5fdHlwZSkpOwotCVdMX1NDQU4oKCJic3NfdHlwZT0lZFxuIiwgaXNjYW4tPmlzY2FuX2V4X3BhcmFtc19wLT5wYXJhbXMuYnNzX3R5cGUpKTsKKwlXTF9TQ0FOKCIlcyA6IG5wcm9iZXM9JWRcbiIsCisJCV9fZnVuY19fLCBpc2Nhbi0+aXNjYW5fZXhfcGFyYW1zX3AtPnBhcmFtcy5ucHJvYmVzKTsKKwlXTF9TQ0FOKCJhY3RpdmVfdGltZT0lZFxuIiwKKwkJIGlzY2FuLT5pc2Nhbl9leF9wYXJhbXNfcC0+cGFyYW1zLmFjdGl2ZV90aW1lKTsKKwlXTF9TQ0FOKCJwYXNzaXZlX3RpbWU9JWRcbiIsCisJCSBpc2Nhbi0+aXNjYW5fZXhfcGFyYW1zX3AtPnBhcmFtcy5wYXNzaXZlX3RpbWUpOworCVdMX1NDQU4oImhvbWVfdGltZT0lZFxuIiwgaXNjYW4tPmlzY2FuX2V4X3BhcmFtc19wLT5wYXJhbXMuaG9tZV90aW1lKTsKKwlXTF9TQ0FOKCJzY2FuX3R5cGU9JWRcbiIsIGlzY2FuLT5pc2Nhbl9leF9wYXJhbXNfcC0+cGFyYW1zLnNjYW5fdHlwZSk7CisJV0xfU0NBTigiYnNzX3R5cGU9JWRcbiIsIGlzY2FuLT5pc2Nhbl9leF9wYXJhbXNfcC0+cGFyYW1zLmJzc190eXBlKTsKIAogCSh2b2lkKWRldl9pd19pb3Zhcl9zZXRidWYoaXNjYW4tPmRldiwgImlzY2FuIiwgaXNjYW4tPmlzY2FuX2V4X3BhcmFtc19wLAogCQkJCSAgaXNjYW4tPmlzY2FuX2V4X3BhcmFtX3NpemUsIGlzY2FuLT5pb2N0bGJ1ZiwKQEAgLTEwNjYsNyArMTA2NSw3IEBACiAJaWYgKGlzY2FuKSB7CiAJCWlzY2FuLT50aW1lcl9vbiA9IDA7CiAJCWlmIChpc2Nhbi0+aXNjYW5fc3RhdGUgIT0gSVNDQU5fU1RBVEVfSURMRSkgewotCQkJV0xfVFJBQ0UoKCJ0aW1lciB0cmlnZ2VyXG4iKSk7CisJCQlXTF9UUkFDRSgidGltZXIgdHJpZ2dlclxuIik7CiAJCQl1cCgmaXNjYW4tPnN5c2lvY19zZW0pOwogCQl9CiAJfQpAQCAtMTEwMSw4ICsxMTAwLDggQEAKIAl9IGVsc2UgewogCQlidWYgPSBrbWFsbG9jKHNpemVvZihpc2Nhbl9idWZfdCksIEdGUF9LRVJORUwpOwogCQlpZiAoIWJ1ZikgewotCQkJV0xfRVJST1IoKCIlcyBjYW4ndCBhbGxvYyBpc2Nhbl9idWZfdCA6IGdvaW5nIHRvIGFib3J0ICIKLQkJCQkiY3VycmVjdCBpc2NhblxuIiwgX19mdW5jX18pKTsKKwkJCVdMX0VSUk9SKCIlcyBjYW4ndCBhbGxvYyBpc2Nhbl9idWZfdCA6IGdvaW5nIHRvIGFib3J0IGN1cnJlbnQgaXNjYW5cbiIsCisJCQkJIF9fZnVuY19fKTsKIAkJCU1VVEVYX1VOTE9DS19XTF9TQ0FOX1NFVCgpOwogCQkJcmV0dXJuIFdMX1NDQU5fUkVTVUxUU19OT19NRU07CiAJCX0KQEAgLTExMzUsMTEgKzExMzQsMTEgQEAKIAkJcmVzdWx0cy0+YnVmbGVuID0gZHRvaDMyKHJlc3VsdHMtPmJ1Zmxlbik7CiAJCXJlc3VsdHMtPnZlcnNpb24gPSBkdG9oMzIocmVzdWx0cy0+dmVyc2lvbik7CiAJCXJlc3VsdHMtPmNvdW50ID0gZHRvaDMyKHJlc3VsdHMtPmNvdW50KTsKLQkJV0xfVFJBQ0UoKCJyZXN1bHRzLT5jb3VudCA9ICVkXG4iLCByZXN1bHRzLT5jb3VudCkpOwotCQlXTF9UUkFDRSgoInJlc3VsdHMtPmJ1ZmxlbiA9ICVkXG4iLCByZXN1bHRzLT5idWZsZW4pKTsKKwkJV0xfVFJBQ0UoInJlc3VsdHMtPmNvdW50ID0gJWRcbiIsIHJlc3VsdHMtPmNvdW50KTsKKwkJV0xfVFJBQ0UoInJlc3VsdHMtPmJ1ZmxlbiA9ICVkXG4iLCByZXN1bHRzLT5idWZsZW4pOwogCQlzdGF0dXMgPSBkdG9oMzIobGlzdF9idWYtPnN0YXR1cyk7CiAJfSBlbHNlIHsKLQkJV0xfRVJST1IoKCIlcyByZXR1cm5zIGVycm9yICVkXG4iLCBfX2Z1bmNfXywgcmVzKSk7CisJCVdMX0VSUk9SKCIlcyByZXR1cm5zIGVycm9yICVkXG4iLCBfX2Z1bmNfXywgcmVzKTsKIAkJc3RhdHVzID0gV0xfU0NBTl9SRVNVTFRTX05PX01FTTsKIAl9CiAJTVVURVhfVU5MT0NLX1dMX1NDQU5fU0VUKCk7CkBAIC0xMTQ4LDggKzExNDcsOCBAQAogCiBzdGF0aWMgdm9pZCB3bF9pd19mb3JjZV9zcGVjaWZpY19zY2FuKGlzY2FuX2luZm9fdCAqaXNjYW4pCiB7Ci0JV0xfVFJBQ0UoKCIlcyBmb3JjZSBTcGVjaWZpYyBTQ0FOIGZvciAlc1xuIiwgX19mdW5jX18sCi0JCSAgZ19zcGVjaWZpY19zc2lkLlNTSUQpKTsKKwlXTF9UUkFDRSgiJXMgZm9yY2UgU3BlY2lmaWMgU0NBTiBmb3IgJXNcbiIsCisJCSBfX2Z1bmNfXywgZ19zcGVjaWZpY19zc2lkLlNTSUQpOwogCXJ0bmxfbG9jaygpOwogCiAJKHZvaWQpZGV2X3dsY19pb2N0bChpc2Nhbi0+ZGV2LCBXTENfU0NBTiwgJmdfc3BlY2lmaWNfc3NpZCwKQEAgLTExNjYsNyArMTE2NSw3IEBACiAJbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOwogCiAJd2lyZWxlc3Nfc2VuZF9ldmVudChpc2Nhbi0+ZGV2LCBTSU9DR0lXU0NBTiwgJndycXUsIE5VTEwpOwotCVdMX1RSQUNFKCgiU2VuZCBFdmVudCBJU0NBTiBjb21wbGV0ZVxuIikpOworCVdMX1RSQUNFKCJTZW5kIEV2ZW50IElTQ0FOIGNvbXBsZXRlXG4iKTsKICNlbmRpZgogfQogCkBAIC0xMTkwLDggKzExODksOCBAQAogCQlzdGF0dXMgPSB3bF9pd19pc2Nhbl9nZXQoaXNjYW4pOwogCQlydG5sX3VubG9jaygpOwogCQlpZiAoZ19zY2FuX3NwZWNpZmllZF9zc2lkICYmIChpc2Nhbl9wYXNzX2Fib3J0ID09IHRydWUpKSB7Ci0JCQlXTF9UUkFDRSgoIiVzIEdldCByZXN1bHRzIGZyb20gc3BlY2lmaWMgc2NhbiAiCi0JCQkJInN0YXR1cyA9ICVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKSk7CisJCQlXTF9UUkFDRSgiJXMgR2V0IHJlc3VsdHMgZnJvbSBzcGVjaWZpYyBzY2FuIHN0YXR1cyA9ICVkXG4iLAorCQkJCSBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJCXdsX2l3X3NlbmRfc2Nhbl9jb21wbGV0ZShpc2Nhbik7CiAJCQlpc2Nhbl9wYXNzX2Fib3J0ID0gZmFsc2U7CiAJCQlzdGF0dXMgPSAtMTsKQEAgLTExOTksNyArMTE5OCw3IEBACiAKIAkJc3dpdGNoIChzdGF0dXMpIHsKIAkJY2FzZSBXTF9TQ0FOX1JFU1VMVFNfUEFSVElBTDoKLQkJCVdMX1RSQUNFKCgiaXNjYW5yZXN1bHRzIGluY29tcGxldGVcbiIpKTsKKwkJCVdMX1RSQUNFKCJpc2NhbnJlc3VsdHMgaW5jb21wbGV0ZVxuIik7CiAJCQlydG5sX2xvY2soKTsKIAkJCXdsX2l3X2lzY2FuKGlzY2FuLCBOVUxMLCBXTF9TQ0FOX0FDVElPTl9DT05USU5VRSk7CiAJCQlydG5sX3VubG9jaygpOwpAQCAtMTIwOCwxOCArMTIwNywxOCBAQAogCQkJaXNjYW4tPnRpbWVyX29uID0gMTsKIAkJCWJyZWFrOwogCQljYXNlIFdMX1NDQU5fUkVTVUxUU19TVUNDRVNTOgotCQkJV0xfVFJBQ0UoKCJpc2NhbnJlc3VsdHMgY29tcGxldGVcbiIpKTsKKwkJCVdMX1RSQUNFKCJpc2NhbnJlc3VsdHMgY29tcGxldGVcbiIpOwogCQkJaXNjYW4tPmlzY2FuX3N0YXRlID0gSVNDQU5fU1RBVEVfSURMRTsKIAkJCXdsX2l3X3NlbmRfc2Nhbl9jb21wbGV0ZShpc2Nhbik7CiAJCQlicmVhazsKIAkJY2FzZSBXTF9TQ0FOX1JFU1VMVFNfUEVORElORzoKLQkJCVdMX1RSQUNFKCgiaXNjYW5yZXN1bHRzIHBlbmRpbmdcbiIpKTsKKwkJCVdMX1RSQUNFKCJpc2NhbnJlc3VsdHMgcGVuZGluZ1xuIik7CiAJCQltb2RfdGltZXIoJmlzY2FuLT50aW1lciwKIAkJCQkgIGppZmZpZXMgKyBpc2Nhbi0+dGltZXJfbXMgKiBIWiAvIDEwMDApOwogCQkJaXNjYW4tPnRpbWVyX29uID0gMTsKIAkJCWJyZWFrOwogCQljYXNlIFdMX1NDQU5fUkVTVUxUU19BQk9SVEVEOgotCQkJV0xfVFJBQ0UoKCJpc2NhbnJlc3VsdHMgYWJvcnRlZFxuIikpOworCQkJV0xfVFJBQ0UoImlzY2FucmVzdWx0cyBhYm9ydGVkXG4iKTsKIAkJCWlzY2FuLT5pc2Nhbl9zdGF0ZSA9IElTQ0FOX1NUQVRFX0lETEU7CiAJCQlpZiAoZ19zY2FuX3NwZWNpZmllZF9zc2lkID09IDApCiAJCQkJd2xfaXdfc2VuZF9zY2FuX2NvbXBsZXRlKGlzY2FuKTsKQEAgLTEyMjksMTIgKzEyMjgsMTIgQEAKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIFdMX1NDQU5fUkVTVUxUU19OT19NRU06Ci0JCQlXTF9UUkFDRSgoImlzY2FucmVzdWx0cyBjYW4ndCBhbGxvYyBtZW1vcnk6IHNraXBcbiIpKTsKKwkJCVdMX1RSQUNFKCJpc2NhbnJlc3VsdHMgY2FuJ3QgYWxsb2MgbWVtb3J5OiBza2lwXG4iKTsKIAkJCWlzY2FuLT5pc2Nhbl9zdGF0ZSA9IElTQ0FOX1NUQVRFX0lETEU7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCVdMX1RSQUNFKCgiaXNjYW5yZXN1bHRzIHJldHVybmVkIHVua25vd24gc3RhdHVzICVkXG4iLAotCQkJCSAgc3RhdHVzKSk7CisJCQlXTF9UUkFDRSgiaXNjYW5yZXN1bHRzIHJldHVybmVkIHVua25vd24gc3RhdHVzICVkXG4iLAorCQkJCSBzdGF0dXMpOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC0xMjUzLDExICsxMjUyLDExIEBACiAJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewogCWludCBlcnJvcjsKLQlXTF9UUkFDRSgoIlxuOiVzIGRldjolczogU0lPQ1NJV1NDQU4gOiBTQ0FOXG4iLCBfX2Z1bmNfXywgZGV2LT5uYW1lKSk7CisJV0xfVFJBQ0UoIlxuOiVzIGRldjolczogU0lPQ1NJV1NDQU4gOiBTQ0FOXG4iLCBfX2Z1bmNfXywgZGV2LT5uYW1lKTsKIAogCWdfc2V0X2Vzc2lkX2JlZm9yZV9zY2FuID0gZmFsc2U7CiAjaWYgZGVmaW5lZChDU0NBTikKLQlXTF9FUlJPUigoIiVzOiBTY2FuIGZyb20gU0lPQ0dJV1NDQU4gbm90IHN1cHBvcnRlZFxuIiwgX19mdW5jX18pKTsKKwlXTF9FUlJPUigiJXM6IFNjYW4gZnJvbSBTSU9DR0lXU0NBTiBub3Qgc3VwcG9ydGVkXG4iLCBfX2Z1bmNfXyk7CiAJcmV0dXJuIC1FSU5WQUw7CiAjZW5kaWYKIApAQCAtMTI3NCw5ICsxMjczLDggQEAKIAkJaWYgKHdycXUtPmRhdGEuZmxhZ3MgJiBJV19TQ0FOX1RISVNfRVNTSUQpIHsKIAkJCXN0cnVjdCBpd19zY2FuX3JlcSAqcmVxID0gKHN0cnVjdCBpd19zY2FuX3JlcSAqKWV4dHJhOwogCQkJaWYgKGdfc2Nhbl9zcGVjaWZpZWRfc3NpZCkgewotCQkJCVdMX1RSQUNFKCgiJXMgU3BlY2lmaWMgU0NBTiBpcyBub3QgZG9uZSBpZ25vcmUgIgotCQkJCQkic2NhbiBmb3IgPSAlc1xuIiwKLQkJCQkJX19mdW5jX18sIHJlcS0+ZXNzaWQpKTsKKwkJCQlXTF9UUkFDRSgiJXMgU3BlY2lmaWMgU0NBTiBpcyBub3QgZG9uZSBpZ25vcmUgc2NhbiBmb3IgPSAlc1xuIiwKKwkJCQkJIF9fZnVuY19fLCByZXEtPmVzc2lkKTsKIAkJCQlyZXR1cm4gLUVCVVNZOwogCQkJfSBlbHNlIHsKIAkJCQlnX3NwZWNpZmljX3NzaWQuU1NJRF9sZW4gPSBtaW5fdChzaXplX3QsCkBAIC0xMjg3LDkgKzEyODUsOSBAQAogCQkJCWdfc3BlY2lmaWNfc3NpZC5TU0lEX2xlbiA9CiAJCQkJICAgIGh0b2QzMihnX3NwZWNpZmljX3NzaWQuU1NJRF9sZW4pOwogCQkJCWdfc2Nhbl9zcGVjaWZpZWRfc3NpZCA9IDE7Ci0JCQkJV0xfVFJBQ0UoKCIjIyMgU3BlY2lmaWMgc2NhbiBzc2lkPSVzIGxlbj0lZFxuIiwKLQkJCQkJICBnX3NwZWNpZmljX3NzaWQuU1NJRCwKLQkJCQkJICBnX3NwZWNpZmljX3NzaWQuU1NJRF9sZW4pKTsKKwkJCQlXTF9UUkFDRSgiIyMjIFNwZWNpZmljIHNjYW4gc3NpZD0lcyBsZW49JWRcbiIsCisJCQkJCSBnX3NwZWNpZmljX3NzaWQuU1NJRCwKKwkJCQkJIGdfc3BlY2lmaWNfc3NpZC5TU0lEX2xlbik7CiAJCQl9CiAJCX0KIAl9CkBAIC0xMjk3LDggKzEyOTUsOCBAQAogCWVycm9yID0gZGV2X3dsY19pb2N0bChkZXYsIFdMQ19TQ0FOLCAmZ19zcGVjaWZpY19zc2lkLAogCQkJCXNpemVvZihnX3NwZWNpZmljX3NzaWQpKTsKIAlpZiAoZXJyb3IpIHsKLQkJV0xfVFJBQ0UoKCIjIyMjIFNldCBTQ0FOIGZvciAlcyBmYWlsZWQgd2l0aCAlZFxuIiwKLQkJCSAgZ19zcGVjaWZpY19zc2lkLlNTSUQsIGVycm9yKSk7CisJCVdMX1RSQUNFKCIjIyMjIFNldCBTQ0FOIGZvciAlcyBmYWlsZWQgd2l0aCAlZFxuIiwKKwkJCSBnX3NwZWNpZmljX3NzaWQuU1NJRCwgZXJyb3IpOwogCQlnX3NjYW5fc3BlY2lmaWVkX3NzaWQgPSAwOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTEzMTcsNyArMTMxNSw3IEBACiAKIAl3bF9pd19zZXRfZXZlbnRfbWFzayhkZXYpOwogCi0JV0xfVFJBQ0UoKCIrKys6IFNldCBCcm9hZGNhc3QgSVNDQU5cbiIpKTsKKwlXTF9UUkFDRSgiKysrOiBTZXQgQnJvYWRjYXN0IElTQ0FOXG4iKTsKIAltZW1zZXQoJnNzaWQsIDAsIHNpemVvZihzc2lkKSk7CiAKIAlpc2Nhbi0+bGlzdF9jdXIgPSBpc2Nhbi0+bGlzdF9oZHI7CkBAIC0xMzQ2LDIwICsxMzQ0LDIwIEBACiAJd2xjX3NzaWRfdCBzc2lkOwogCWlzY2FuX2luZm9fdCAqaXNjYW4gPSBnX2lzY2FuOwogCi0JV0xfVFJBQ0UoKCIlczogU0lPQ1NJV1NDQU4gOiBJU0NBTlxuIiwgZGV2LT5uYW1lKSk7CisJV0xfVFJBQ0UoIiVzOiBTSU9DU0lXU0NBTiA6IElTQ0FOXG4iLCBkZXYtPm5hbWUpOwogCiAjaWYgZGVmaW5lZChDU0NBTikKLQlXTF9FUlJPUigoIiVzOiBTY2FuIGZyb20gU0lPQ0dJV1NDQU4gbm90IHN1cHBvcnRlZFxuIiwgX19mdW5jX18pKTsKKwlXTF9FUlJPUigiJXM6IFNjYW4gZnJvbSBTSU9DR0lXU0NBTiBub3Qgc3VwcG9ydGVkXG4iLCBfX2Z1bmNfXyk7CiAJcmV0dXJuIC1FSU5WQUw7CiAjZW5kaWYKIAogCWlmIChnX29ub2ZmID09IEdfV0xBTl9TRVRfT0ZGKSB7Ci0JCVdMX1RSQUNFKCgiJXM6IGRyaXZlciBpcyBub3QgdXAgeWV0IGFmdGVyIFNUQVJUXG4iLCBfX2Z1bmNfXykpOworCQlXTF9UUkFDRSgiJXM6IGRyaXZlciBpcyBub3QgdXAgeWV0IGFmdGVyIFNUQVJUXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAwOwogCX0KICNpZmRlZiBQTk9fU1VQUE9SVAogCWlmIChkaGRfZGV2X2dldF9wbm9fc3RhdHVzKGRldikpIHsKLQkJV0xfRVJST1IoKCIlczogU2NhbiBjYWxsZWQgd2hlbiBQTk8gaXMgYWN0aXZlXG4iLCBfX2Z1bmNfXykpOworCQlXTF9FUlJPUigiJXM6IFNjYW4gY2FsbGVkIHdoZW4gUE5PIGlzIGFjdGl2ZVxuIiwgX19mdW5jX18pOwogCX0KICNlbmRpZgogCkBAIC0xMzY3LDggKzEzNjUsOCBAQAogCQlyZXR1cm4gd2xfaXdfc2V0X3NjYW4oZGV2LCBpbmZvLCB3cnF1LCBleHRyYSk7CiAKIAlpZiAoZ19zY2FuX3NwZWNpZmllZF9zc2lkKSB7Ci0JCVdMX1RSQUNFKCgiJXMgU3BlY2lmaWMgU0NBTiBhbHJlYWR5IHJ1bm5pbmcgaWdub3JpbmcgQkMgc2NhblxuIiwKLQkJCSAgX19mdW5jX18pKTsKKwkJV0xfVFJBQ0UoIiVzIFNwZWNpZmljIFNDQU4gYWxyZWFkeSBydW5uaW5nIGlnbm9yaW5nIEJDIHNjYW5cbiIsCisJCQkgX19mdW5jX18pOwogCQlyZXR1cm4gRUJVU1k7CiAJfQogCkBAIC0xMzg2LDggKzEzODQsOCBAQAogCQkJZ19zY2FuX3NwZWNpZmllZF9zc2lkID0gMDsKIAogCQkJaWYgKGlzY2FuLT5pc2Nhbl9zdGF0ZSA9PSBJU0NBTl9TVEFURV9TQ0FOSU5HKSB7Ci0JCQkJV0xfVFJBQ0UoKCIlcyBJU0NBTiBhbHJlYWR5IGluIHByb2dyZXNzIFxuIiwKLQkJCQkJICBfX2Z1bmNfXykpOworCQkJCVdMX1RSQUNFKCIlcyBJU0NBTiBhbHJlYWR5IGluIHByb2dyZXNzXG4iLAorCQkJCQkgX19mdW5jX18pOwogCQkJCXJldHVybiAwOwogCQkJfQogCQl9CkBAIC0xNDA2LDcgKzE0MDQsNyBAQAogCXU4ICppZSA9ICp3cGFpZTsKIAogCWlmICgoaWVbMV0gPj0gNikgJiYKLQkgICAgIWJjbXAoKGNvbnN0IHZvaWQgKikmaWVbMl0sIChjb25zdCB2b2lkICopKFdQQV9PVUkgIlx4MDEiKSwgNCkpIHsKKwkgICAgIW1lbWNtcCgoY29uc3Qgdm9pZCAqKSZpZVsyXSwgKGNvbnN0IHZvaWQgKikoV1BBX09VSSAiXHgwMSIpLCA0KSkgewogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKQEAgLTE0MjIsNyArMTQyMCw3IEBACiAJdTggKmllID0gKndwc2llOwogCiAJaWYgKChpZVsxXSA+PSA0KSAmJgotCSAgICAhYmNtcCgoY29uc3Qgdm9pZCAqKSZpZVsyXSwgKGNvbnN0IHZvaWQgKikoV1BBX09VSSAiXHgwNCIpLCA0KSkgeworCSAgICAhbWVtY21wKChjb25zdCB2b2lkICopJmllWzJdLCAoY29uc3Qgdm9pZCAqKShXUEFfT1VJICJceDA0IiksIDQpKSB7CiAJCXJldHVybiB0cnVlOwogCX0KIApAQCAtMTUwMSw5ICsxNDk5LDggQEAKIAogCWZvciAoaSA9IDA7IGkgPCBsaXN0LT5jb3VudCAmJiBpIDwgSVdfTUFYX0FQOyBpKyspIHsKIAkJaWYgKGxpc3QtPnZlcnNpb24gIT0gV0xfQlNTX0lORk9fVkVSU0lPTikgewotCQkJV0xfRVJST1IoKCIlcyA6IGxpc3QtPnZlcnNpb24gJWQgIT0gIgotCQkJCSJXTF9CU1NfSU5GT19WRVJTSU9OXG4iLAotCQkJCV9fZnVuY19fLCBsaXN0LT52ZXJzaW9uKSk7CisJCQlXTF9FUlJPUigiJXMgOiBsaXN0LT52ZXJzaW9uICVkICE9IFdMX0JTU19JTkZPX1ZFUlNJT05cbiIsCisJCQkJIF9fZnVuY19fLCBsaXN0LT52ZXJzaW9uKTsKIAkJCXJldHVybiByZXQ7CiAJCX0KIApAQCAtMTUxMSwxMSArMTUwOCwxMSBAQAogCQkJCQkgICAgIGR0b2gzMihiaS0+bGVuZ3RoKSkgOiBsaXN0LT4KIAkJICAgIGJzc19pbmZvOwogCi0JCVdMX1RSQUNFKCgiJXMgOiAlc1xuIiwgX19mdW5jX18sIGJpLT5TU0lEKSk7CisJCVdMX1RSQUNFKCIlcyA6ICVzXG4iLCBfX2Z1bmNfXywgYmktPlNTSUQpOwogCiAJCWl3ZS5jbWQgPSBTSU9DR0lXQVA7CiAJCWl3ZS51LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwotCQltZW1jcHkoaXdlLnUuYXBfYWRkci5zYV9kYXRhLCAmYmktPkJTU0lELCBFVEhFUl9BRERSX0xFTik7CisJCW1lbWNweShpd2UudS5hcF9hZGRyLnNhX2RhdGEsICZiaS0+QlNTSUQsIEVUSF9BTEVOKTsKIAkJZXZlbnQgPQogCQkgICAgSVdFX1NUUkVBTV9BRERfRVZFTlQoaW5mbywgZXZlbnQsIGVuZCwgJml3ZSwKIAkJCQkJIElXX0VWX0FERFJfTEVOKTsKQEAgLTE1OTAsMTEgKzE1ODcsMTEgQEAKIAogCXJldCA9IGV2ZW50IC0gZXh0cmE7CiAJaWYgKHJldCA8IDApIHsKLQkJV0xfRVJST1IoKCI9PT4gV3Jvbmcgc2l6ZVxuIikpOworCQlXTF9FUlJPUigiPT0+IFdyb25nIHNpemVcbiIpOwogCQlyZXQgPSAwOwogCX0KLQlXTF9UUkFDRSgoIiVzOiBzaXplPSVkIGJ5dGVzIHByZXBhcmVkXG4iLCBfX2Z1bmNfXywKLQkJICAodW5zaWduZWQgaW50KShldmVudCAtIGV4dHJhKSkpOworCVdMX1RSQUNFKCIlczogc2l6ZT0lZCBieXRlcyBwcmVwYXJlZFxuIiwKKwkJIF9fZnVuY19fLCAodW5zaWduZWQgaW50KShldmVudCAtIGV4dHJhKSk7CiAJcmV0dXJuICh1aW50KXJldDsKIH0KIApAQCAtMTYxNCwxMCArMTYxMSwxMCBAQAogCWlzY2FuX2J1Zl90ICpwX2J1ZjsKICNlbmRpZgogCi0JV0xfVFJBQ0UoKCIlczogYnVmbGVuX2Zyb21fdXNlciAlZDogXG4iLCBkZXYtPm5hbWUsIGJ1Zmxlbl9mcm9tX3VzZXIpKTsKKwlXTF9UUkFDRSgiJXM6IGJ1Zmxlbl9mcm9tX3VzZXIgJWQ6XG4iLCBkZXYtPm5hbWUsIGJ1Zmxlbl9mcm9tX3VzZXIpOwogCiAJaWYgKCFleHRyYSkgewotCQlXTF9UUkFDRSgoIiVzOiB3bF9pd19nZXRfc2NhbiByZXR1cm4gLUVJTlZBTFxuIiwgZGV2LT5uYW1lKSk7CisJCVdMX1RSQUNFKCIlczogd2xfaXdfZ2V0X3NjYW4gcmV0dXJuIC1FSU5WQUxcbiIsIGRldi0+bmFtZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTYzMSw4ICsxNjI4LDggQEAKIAlpZiAoZ19zY2FuX3NwZWNpZmllZF9zc2lkKSB7CiAJCWxpc3QgPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CiAJCWlmICghbGlzdCkgewotCQkJV0xfVFJBQ0UoKCIlczogd2xfaXdfZ2V0X3NjYW4gcmV0dXJuIC1FTk9NRU1cbiIsCi0JCQkJICBkZXYtPm5hbWUpKTsKKwkJCVdMX1RSQUNFKCIlczogd2xfaXdfZ2V0X3NjYW4gcmV0dXJuIC1FTk9NRU1cbiIsCisJCQkJIGRldi0+bmFtZSk7CiAJCQlnX3NjYW5fc3BlY2lmaWVkX3NzaWQgPSAwOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KQEAgLTE2NDIsOCArMTYzOSw4IEBACiAJbGlzdC0+YnVmbGVuID0gaHRvZDMyKGxlbik7CiAJZXJyb3IgPSBkZXZfd2xjX2lvY3RsKGRldiwgV0xDX1NDQU5fUkVTVUxUUywgbGlzdCwgbGVuKTsKIAlpZiAoZXJyb3IpIHsKLQkJV0xfRVJST1IoKCIlczogJXMgOiBTY2FuX3Jlc3VsdHMgRVJST1IgJWRcbiIsIGRldi0+bmFtZSwKLQkJCSAgX19mdW5jX18sIGVycm9yKSk7CisJCVdMX0VSUk9SKCIlczogJXMgOiBTY2FuX3Jlc3VsdHMgRVJST1IgJWRcbiIsCisJCQkgZGV2LT5uYW1lLCBfX2Z1bmNfXywgZXJyb3IpOwogCQlkd3JxLT5sZW5ndGggPSBsZW47CiAJCWlmIChnX3NjYW5fc3BlY2lmaWVkX3NzaWQpIHsKIAkJCWdfc2Nhbl9zcGVjaWZpZWRfc3NpZCA9IDA7CkBAIC0xNjU2LDggKzE2NTMsOCBAQAogCWxpc3QtPmNvdW50ID0gZHRvaDMyKGxpc3QtPmNvdW50KTsKIAogCWlmIChsaXN0LT52ZXJzaW9uICE9IFdMX0JTU19JTkZPX1ZFUlNJT04pIHsKLQkJV0xfRVJST1IoKCIlcyA6IGxpc3QtPnZlcnNpb24gJWQgIT0gV0xfQlNTX0lORk9fVkVSU0lPTlxuIiwKLQkJCSAgX19mdW5jX18sIGxpc3QtPnZlcnNpb24pKTsKKwkJV0xfRVJST1IoIiVzIDogbGlzdC0+dmVyc2lvbiAlZCAhPSBXTF9CU1NfSU5GT19WRVJTSU9OXG4iLAorCQkJIF9fZnVuY19fLCBsaXN0LT52ZXJzaW9uKTsKIAkJaWYgKGdfc2Nhbl9zcGVjaWZpZWRfc3NpZCkgewogCQkJZ19zY2FuX3NwZWNpZmllZF9zc2lkID0gMDsKIAkJCWtmcmVlKGxpc3QpOwpAQCAtMTY2Niw4ICsxNjYzLDggQEAKIAl9CiAKIAlpZiAoZ19zY2FuX3NwZWNpZmllZF9zc2lkKSB7Ci0JCVdMX1RSQUNFKCgiJXM6IFNwZWNpZmllZCBzY2FuIEFQcyBpbiB0aGUgbGlzdCA9JWRcbiIsCi0JCQkgIF9fZnVuY19fLCBsaXN0LT5jb3VudCkpOworCQlXTF9UUkFDRSgiJXM6IFNwZWNpZmllZCBzY2FuIEFQcyBpbiB0aGUgbGlzdCA9JWRcbiIsCisJCQkgX19mdW5jX18sIGxpc3QtPmNvdW50KTsKIAkJbGVuX3JldCA9CiAJCSAgICAoX191MTYpIHdsX2l3X2dldF9zY2FuX3ByZXAobGlzdCwgaW5mbywgZXh0cmEsCiAJCQkJCQlidWZsZW5fZnJvbV91c2VyKTsKQEAgLTE2NzgsOCArMTY3NSw4IEBACiAJCXdoaWxlIChwX2J1ZiAhPSBpc2Nhbi0+bGlzdF9jdXIpIHsKIAkJCWxpc3RfbWVyZ2UgPQogCQkJICAgICYoKHdsX2lzY2FuX3Jlc3VsdHNfdCAqKSBwX2J1Zi0+aXNjYW5fYnVmKS0+cmVzdWx0czsKLQkJCVdMX1RSQUNFKCgiJXM6IEJjYXN0IEFQcyBsaXN0PSVkXG4iLCBfX2Z1bmNfXywKLQkJCQkgIGxpc3RfbWVyZ2UtPmNvdW50KSk7CisJCQlXTF9UUkFDRSgiJXM6IEJjYXN0IEFQcyBsaXN0PSVkXG4iLAorCQkJCSBfX2Z1bmNfXywgbGlzdF9tZXJnZS0+Y291bnQpOwogCQkJaWYgKGxpc3RfbWVyZ2UtPmNvdW50ID4gMCkKIAkJCQlsZW5fcmV0ICs9CiAJCQkJICAgIChfX3UxNikgd2xfaXdfZ2V0X3NjYW5fcHJlcChsaXN0X21lcmdlLApAQCAtMTY4OSw4ICsxNjg2LDggQEAKIAkJfQogI2Vsc2UKIAkJbGlzdF9tZXJnZSA9ICh3bF9zY2FuX3Jlc3VsdHNfdCAqKSBnX3NjYW47Ci0JCVdMX1RSQUNFKCgiJXM6IEJjYXN0IEFQcyBsaXN0PSVkXG4iLCBfX2Z1bmNfXywKLQkJCSAgbGlzdF9tZXJnZS0+Y291bnQpKTsKKwkJV0xfVFJBQ0UoIiVzOiBCY2FzdCBBUHMgbGlzdD0lZFxuIiwKKwkJCSBfX2Z1bmNfXywgbGlzdF9tZXJnZS0+Y291bnQpOwogCQlpZiAobGlzdF9tZXJnZS0+Y291bnQgPiAwKQogCQkJbGVuX3JldCArPQogCQkJICAgIChfX3UxNikgd2xfaXdfZ2V0X3NjYW5fcHJlcChsaXN0X21lcmdlLCBpbmZvLApAQCAtMTcxNCw4ICsxNzExLDggQEAKIAlkd3JxLT5sZW5ndGggPSBsZW47CiAJZHdycS0+ZmxhZ3MgPSAwOwogCi0JV0xfVFJBQ0UoKCIlcyByZXR1cm4gdG8gV0UgJWQgYnl0ZXMgQVBzPSVkXG4iLCBfX2Z1bmNfXywKLQkJICBkd3JxLT5sZW5ndGgsIGxpc3QtPmNvdW50KSk7CisJV0xfVFJBQ0UoIiVzIHJldHVybiB0byBXRSAlZCBieXRlcyBBUHM9JWRcbiIsCisJCSBfX2Z1bmNfXywgZHdycS0+bGVuZ3RoLCBsaXN0LT5jb3VudCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE3MzYsMjYgKzE3MzMsMjYgQEAKIAl1MzIgY291bnRlciA9IDA7CiAJdTggY2hhbm5lbDsKIAotCVdMX1RSQUNFKCgiJXMgJXMgYnVmbGVuX2Zyb21fdXNlciAlZDpcbiIsIGRldi0+bmFtZSwgX19mdW5jX18sCi0JCSAgZHdycS0+bGVuZ3RoKSk7CisJV0xfVFJBQ0UoIiVzICVzIGJ1Zmxlbl9mcm9tX3VzZXIgJWQ6XG4iLAorCQkgZGV2LT5uYW1lLCBfX2Z1bmNfXywgZHdycS0+bGVuZ3RoKTsKIAogCWlmICghZXh0cmEpIHsKLQkJV0xfVFJBQ0UoKCIlczogSU5WQUxJRCBTSU9DR0lXU0NBTiBHRVQgYmFkIHBhcmFtZXRlclxuIiwKLQkJCSAgZGV2LT5uYW1lKSk7CisJCVdMX1RSQUNFKCIlczogSU5WQUxJRCBTSU9DR0lXU0NBTiBHRVQgYmFkIHBhcmFtZXRlclxuIiwKKwkJCSBkZXYtPm5hbWUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlpZiAoKCFpc2NhbikgfHwgKCFpc2Nhbi0+c3lzaW9jX3RzaykpIHsKLQkJV0xfRVJST1IoKCIlc3N5c2lvY190c2tcbiIsIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCIlc3N5c2lvY190c2tcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIHdsX2l3X2dldF9zY2FuKGRldiwgaW5mbywgZHdycSwgZXh0cmEpOwogCX0KIAogCWlmIChpc2Nhbi0+aXNjYW5fc3RhdGUgPT0gSVNDQU5fU1RBVEVfU0NBTklORykgewotCQlXTF9UUkFDRSgoIiVzOiBTSU9DR0lXU0NBTiBHRVQgc3RpbGwgc2Nhbm5pbmdcbiIsIGRldi0+bmFtZSkpOworCQlXTF9UUkFDRSgiJXM6IFNJT0NHSVdTQ0FOIEdFVCBzdGlsbCBzY2FubmluZ1xuIiwgZGV2LT5uYW1lKTsKIAkJcmV0dXJuIC1FQUdBSU47CiAJfQogCi0JV0xfVFJBQ0UoKCIlczogU0lPQ0dJV1NDQU4gR0VUIGJyb2FkY2FzdCByZXN1bHRzXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NHSVdTQ0FOIEdFVCBicm9hZGNhc3QgcmVzdWx0c1xuIiwgZGV2LT5uYW1lKTsKIAlhcGNudCA9IDA7CiAJcF9idWYgPSBpc2Nhbi0+bGlzdF9oZHI7CiAJd2hpbGUgKHBfYnVmICE9IGlzY2FuLT5saXN0X2N1cikgewpAQCAtMTc2NCw5ICsxNzYxLDggQEAKIAkJY291bnRlciArPSBsaXN0LT5jb3VudDsKIAogCQlpZiAobGlzdC0+dmVyc2lvbiAhPSBXTF9CU1NfSU5GT19WRVJTSU9OKSB7Ci0JCQlXTF9FUlJPUigoIiVzIDogbGlzdC0+dmVyc2lvbiAlZCAhPSAiCi0JCQkJIldMX0JTU19JTkZPX1ZFUlNJT05cbiIsCi0JCQkJX19mdW5jX18sIGxpc3QtPnZlcnNpb24pKTsKKwkJCVdMX0VSUk9SKCIlcyA6IGxpc3QtPnZlcnNpb24gJWQgIT0gV0xfQlNTX0lORk9fVkVSU0lPTlxuIiwKKwkJCQkgX19mdW5jX18sIGxpc3QtPnZlcnNpb24pOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIApAQCAtMTc3OSwxNCArMTc3NSwxNCBAQAogCQkJQVNTRVJUKCgodW5zaWduZWQgbG9uZyliaSArIGR0b2gzMihiaS0+bGVuZ3RoKSkgPD0KIAkJCSAgICAgICAoKHVuc2lnbmVkIGxvbmcpbGlzdCArIFdMQ19JV19JU0NBTl9NQVhMRU4pKTsKIAotCQkJaWYgKGV2ZW50ICsgRVRIRVJfQUREUl9MRU4gKyBiaS0+U1NJRF9sZW4gKworCQkJaWYgKGV2ZW50ICsgRVRIX0FMRU4gKyBiaS0+U1NJRF9sZW4gKwogCQkJICAgIElXX0VWX1VJTlRfTEVOICsgSVdfRVZfRlJFUV9MRU4gKyBJV19FVl9RVUFMX0xFTiA+PQogCQkJICAgIGVuZCkKIAkJCQlyZXR1cm4gLUUyQklHOwogCQkJaXdlLmNtZCA9IFNJT0NHSVdBUDsKIAkJCWl3ZS51LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwogCQkJbWVtY3B5KGl3ZS51LmFwX2FkZHIuc2FfZGF0YSwgJmJpLT5CU1NJRCwKLQkJCSAgICAgICBFVEhFUl9BRERSX0xFTik7CisJCQkgICAgICAgRVRIX0FMRU4pOwogCQkJZXZlbnQgPQogCQkJICAgIElXRV9TVFJFQU1fQUREX0VWRU5UKGluZm8sIGV2ZW50LCBlbmQsICZpd2UsCiAJCQkJCQkgSVdfRVZfQUREUl9MRU4pOwpAQCAtMTg3Niw4ICsxODcyLDggQEAKIAlkd3JxLT5sZW5ndGggPSBldmVudCAtIGV4dHJhOwogCWR3cnEtPmZsYWdzID0gMDsKIAotCVdMX1RSQUNFKCgiJXMgcmV0dXJuIHRvIFdFICVkIGJ5dGVzIEFQcz0lZFxuIiwgX19mdW5jX18sCi0JCSAgZHdycS0+bGVuZ3RoLCBjb3VudGVyKSk7CisJV0xfVFJBQ0UoIiVzIHJldHVybiB0byBXRSAlZCBieXRlcyBBUHM9JWRcbiIsCisJCSBfX2Z1bmNfXywgZHdycS0+bGVuZ3RoLCBjb3VudGVyKTsKIAogCWlmICghZHdycS0+bGVuZ3RoKQogCQlyZXR1cm4gLUVBR0FJTjsKQEAgLTE4OTUsNyArMTg5MSw3IEBACiAJd2xfam9pbl9wYXJhbXNfdCBqb2luX3BhcmFtczsKIAlpbnQgam9pbl9wYXJhbXNfc2l6ZTsKIAotCVdMX1RSQUNFKCgiJXM6IFNJT0NTSVdFU1NJRFxuIiwgZGV2LT5uYW1lKSk7CisJV0xfVFJBQ0UoIiVzOiBTSU9DU0lXRVNTSURcbiIsIGRldi0+bmFtZSk7CiAKIAlpZiAoZ19zZXRfZXNzaWRfYmVmb3JlX3NjYW4pCiAJCXJldHVybiAtRUFHQUlOOwpAQCAtMTkyMyw3ICsxOTE5LDcgQEAKIAogCW1lbWNweSgmam9pbl9wYXJhbXMuc3NpZC5TU0lELCBnX3NzaWQuU1NJRCwgZ19zc2lkLlNTSURfbGVuKTsKIAlqb2luX3BhcmFtcy5zc2lkLlNTSURfbGVuID0gaHRvZDMyKGdfc3NpZC5TU0lEX2xlbik7Ci0JbWVtY3B5KCZqb2luX3BhcmFtcy5wYXJhbXMuYnNzaWQsICZldGhlcl9iY2FzdCwgRVRIRVJfQUREUl9MRU4pOworCW1lbWNweSgmam9pbl9wYXJhbXMucGFyYW1zLmJzc2lkLCAmZXRoZXJfYmNhc3QsIEVUSF9BTEVOKTsKIAogCXdsX2l3X2NoX3RvX2NoYW5zcGVjKGdfd2xfaXdfcGFyYW1zLnRhcmdldF9jaGFubmVsLCAmam9pbl9wYXJhbXMsCiAJCQkgICAgICZqb2luX3BhcmFtc19zaXplKTsKQEAgLTE5MzEsMTEgKzE5MjcsMTEgQEAKIAllcnJvciA9IGRldl93bGNfaW9jdGwoZGV2LCBXTENfU0VUX1NTSUQsICZqb2luX3BhcmFtcywKIAkJCQlqb2luX3BhcmFtc19zaXplKTsKIAlpZiAoZXJyb3IpCi0JCVdMX0VSUk9SKCgiSW52YWxpZCBpb2N0bCBkYXRhPSVkXG4iLCBlcnJvcikpOworCQlXTF9FUlJPUigiSW52YWxpZCBpb2N0bCBkYXRhPSVkXG4iLCBlcnJvcik7CiAKIAlpZiAoZ19zc2lkLlNTSURfbGVuKSB7Ci0JCVdMX1RSQUNFKCgiJXM6IGpvaW4gU1NJRD0lcyBjaD0lZFxuIiwgX19mdW5jX18sCi0JCQkgIGdfc3NpZC5TU0lELCBnX3dsX2l3X3BhcmFtcy50YXJnZXRfY2hhbm5lbCkpOworCQlXTF9UUkFDRSgiJXM6IGpvaW4gU1NJRD0lcyBjaD0lZFxuIiwKKwkJCSBfX2Z1bmNfXywgZ19zc2lkLlNTSUQsIGdfd2xfaXdfcGFyYW1zLnRhcmdldF9jaGFubmVsKTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0xOTQ4LDE0ICsxOTQ0LDE0IEBACiAJd2xjX3NzaWRfdCBzc2lkOwogCWludCBlcnJvcjsKIAotCVdMX1RSQUNFKCgiJXM6IFNJT0NHSVdFU1NJRFxuIiwgZGV2LT5uYW1lKSk7CisJV0xfVFJBQ0UoIiVzOiBTSU9DR0lXRVNTSURcbiIsIGRldi0+bmFtZSk7CiAKIAlpZiAoIWV4dHJhKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWVycm9yID0gZGV2X3dsY19pb2N0bChkZXYsIFdMQ19HRVRfU1NJRCwgJnNzaWQsIHNpemVvZihzc2lkKSk7CiAJaWYgKGVycm9yKSB7Ci0JCVdMX0VSUk9SKCgiRXJyb3IgZ2V0dGluZyB0aGUgU1NJRFxuIikpOworCQlXTF9FUlJPUigiRXJyb3IgZ2V0dGluZyB0aGUgU1NJRFxuIik7CiAJCXJldHVybiBlcnJvcjsKIAl9CiAKQEAgLTE5NzYsNyArMTk3Miw3IEBACiB7CiAJd2xfaXdfdCAqaXcgPSAqKHdsX2l3X3QgKiopIG5ldGRldl9wcml2KGRldik7CiAKLQlXTF9UUkFDRSgoIiVzOiBTSU9DU0lXTklDS05cbiIsIGRldi0+bmFtZSkpOworCVdMX1RSQUNFKCIlczogU0lPQ1NJV05JQ0tOXG4iLCBkZXYtPm5hbWUpOwogCiAJaWYgKCFleHRyYSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xOTk2LDcgKzE5OTIsNyBAQAogewogCXdsX2l3X3QgKml3ID0gKih3bF9pd190ICoqKSBuZXRkZXZfcHJpdihkZXYpOwogCi0JV0xfVFJBQ0UoKCIlczogU0lPQ0dJV05JQ0tOXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NHSVdOSUNLTlxuIiwgZGV2LT5uYW1lKTsKIAogCWlmICghZXh0cmEpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjAxNCw3ICsyMDEwLDcgQEAKIAl3bF9yYXRlc2V0X3QgcmF0ZXNldDsKIAlpbnQgZXJyb3IsIHJhdGUsIGksIGVycm9yX2JnLCBlcnJvcl9hOwogCi0JV0xfVFJBQ0UoKCIlczogU0lPQ1NJV1JBVEVcbiIsIGRldi0+bmFtZSkpOworCVdMX1RSQUNFKCIlczogU0lPQ1NJV1JBVEVcbiIsIGRldi0+bmFtZSk7CiAKIAllcnJvciA9IGRldl93bGNfaW9jdGwoZGV2LCBXTENfR0VUX0NVUlJfUkFURVNFVCwgJnJhdGVzZXQsCiAJCQkJc2l6ZW9mKHJhdGVzZXQpKTsKQEAgLTIwNjMsNyArMjA1OSw3IEBACiB7CiAJaW50IGVycm9yLCByYXRlOwogCi0JV0xfVFJBQ0UoKCIlczogU0lPQ0dJV1JBVEVcbiIsIGRldi0+bmFtZSkpOworCVdMX1RSQUNFKCIlczogU0lPQ0dJV1JBVEVcbiIsIGRldi0+bmFtZSk7CiAKIAllcnJvciA9IGRldl93bGNfaW9jdGwoZGV2LCBXTENfR0VUX1JBVEUsICZyYXRlLCBzaXplb2YocmF0ZSkpOwogCWlmIChlcnJvcikKQEAgLTIwODAsNyArMjA3Niw3IEBACiB7CiAJaW50IGVycm9yLCBydHM7CiAKLQlXTF9UUkFDRSgoIiVzOiBTSU9DU0lXUlRTXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NTSVdSVFNcbiIsIGRldi0+bmFtZSk7CiAKIAlpZiAodndycS0+ZGlzYWJsZWQpCiAJCXJ0cyA9IERPVDExX0RFRkFVTFRfUlRTX0xFTjsKQEAgLTIxMDIsNyArMjA5OCw3IEBACiB7CiAJaW50IGVycm9yLCBydHM7CiAKLQlXTF9UUkFDRSgoIiVzOiBTSU9DR0lXUlRTXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NHSVdSVFNcbiIsIGRldi0+bmFtZSk7CiAKIAllcnJvciA9IGRldl93bGNfaW50dmFyX2dldChkZXYsICJydHN0aHJlc2giLCAmcnRzKTsKIAlpZiAoZXJyb3IpCkBAIC0yMTIxLDcgKzIxMTcsNyBAQAogewogCWludCBlcnJvciwgZnJhZzsKIAotCVdMX1RSQUNFKCgiJXM6IFNJT0NTSVdGUkFHXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NTSVdGUkFHXG4iLCBkZXYtPm5hbWUpOwogCiAJaWYgKHZ3cnEtPmRpc2FibGVkKQogCQlmcmFnID0gRE9UMTFfREVGQVVMVF9GUkFHX0xFTjsKQEAgLTIxNDMsNyArMjEzOSw3IEBACiB7CiAJaW50IGVycm9yLCBmcmFndGhyZXNob2xkOwogCi0JV0xfVFJBQ0UoKCIlczogU0lPQ0dJV0ZSQUdcbiIsIGRldi0+bmFtZSkpOworCVdMX1RSQUNFKCIlczogU0lPQ0dJV0ZSQUdcbiIsIGRldi0+bmFtZSk7CiAKIAllcnJvciA9IGRldl93bGNfaW50dmFyX2dldChkZXYsICJmcmFndGhyZXNoIiwgJmZyYWd0aHJlc2hvbGQpOwogCWlmIChlcnJvcikKQEAgLTIxNjMsNyArMjE1OSw3IEBACiB7CiAJaW50IGVycm9yLCBkaXNhYmxlOwogCXUxNiB0eHB3cm13OwotCVdMX1RSQUNFKCgiJXM6IFNJT0NTSVdUWFBPV1xuIiwgZGV2LT5uYW1lKSk7CisJV0xfVFJBQ0UoIiVzOiBTSU9DU0lXVFhQT1dcbiIsIGRldi0+bmFtZSk7CiAKIAlkaXNhYmxlID0gdndycS0+ZGlzYWJsZWQgPyBXTF9SQURJT19TV19ESVNBQkxFIDogMDsKIAlkaXNhYmxlICs9IFdMX1JBRElPX1NXX0RJU0FCTEUgPDwgMTY7CkBAIC0yMjAwLDcgKzIxOTYsNyBAQAogCWludCBlcnJvciwgZGlzYWJsZSwgdHhwd3JkYm07CiAJdTggcmVzdWx0OwogCi0JV0xfVFJBQ0UoKCIlczogU0lPQ0dJV1RYUE9XXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NHSVdUWFBPV1xuIiwgZGV2LT5uYW1lKTsKIAogCWVycm9yID0gZGV2X3dsY19pb2N0bChkZXYsIFdMQ19HRVRfUkFESU8sICZkaXNhYmxlLCBzaXplb2YoZGlzYWJsZSkpOwogCWlmIChlcnJvcikKQEAgLTIyMjksNyArMjIyNSw3IEBACiB7CiAJaW50IGVycm9yLCBscmwsIHNybDsKIAotCVdMX1RSQUNFKCgiJXM6IFNJT0NTSVdSRVRSWVxuIiwgZGV2LT5uYW1lKSk7CisJV0xfVFJBQ0UoIiVzOiBTSU9DU0lXUkVUUllcbiIsIGRldi0+bmFtZSk7CiAKIAlpZiAodndycS0+ZGlzYWJsZWQgfHwgKHZ3cnEtPmZsYWdzICYgSVdfUkVUUllfTElGRVRJTUUpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTIyNzcsNyArMjI3Myw3IEBACiB7CiAJaW50IGVycm9yLCBscmwsIHNybDsKIAotCVdMX1RSQUNFKCgiJXM6IFNJT0NHSVdSRVRSWVxuIiwgZGV2LT5uYW1lKSk7CisJV0xfVFJBQ0UoIiVzOiBTSU9DR0lXUkVUUllcbiIsIGRldi0+bmFtZSk7CiAKIAl2d3JxLT5kaXNhYmxlZCA9IDA7CiAKQEAgLTIzMTcsNyArMjMxMyw3IEBACiAJd2xfd3NlY19rZXlfdCBrZXk7CiAJaW50IGVycm9yLCB2YWwsIHdzZWM7CiAKLQlXTF9UUkFDRSgoIiVzOiBTSU9DU0lXRU5DT0RFXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NTSVdFTkNPREVcbiIsIGRldi0+bmFtZSk7CiAKIAltZW1zZXQoJmtleSwgMCwgc2l6ZW9mKGtleSkpOwogCkBAIC0yNDA5LDkgKzI0MDUsOSBAQAogCXdsX3dzZWNfa2V5X3Qga2V5OwogCWludCBlcnJvciwgdmFsLCB3c2VjLCBhdXRoOwogCi0JV0xfVFJBQ0UoKCIlczogU0lPQ0dJV0VOQ09ERVxuIiwgZGV2LT5uYW1lKSk7CisJV0xfVFJBQ0UoIiVzOiBTSU9DR0lXRU5DT0RFXG4iLCBkZXYtPm5hbWUpOwogCi0JYnplcm8oJmtleSwgc2l6ZW9mKHdsX3dzZWNfa2V5X3QpKTsKKwltZW1zZXQoJmtleSwgMCwgc2l6ZW9mKHdsX3dzZWNfa2V5X3QpKTsKIAogCWlmICgoZHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpID09IDApIHsKIAkJZm9yIChrZXkuaW5kZXggPSAwOyBrZXkuaW5kZXggPCBET1QxMV9NQVhfREVGQVVMVF9LRVlTOwpAQCAtMjQ2NSw3ICsyNDYxLDcgQEAKIHsKIAlpbnQgZXJyb3IsIHBtOwogCi0JV0xfVFJBQ0UoKCIlczogU0lPQ1NJV1BPV0VSXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NTSVdQT1dFUlxuIiwgZGV2LT5uYW1lKTsKIAogCXBtID0gdndycS0+ZGlzYWJsZWQgPyBQTV9PRkYgOiBQTV9NQVg7CiAKQEAgLTI0ODQsNyArMjQ4MCw3IEBACiB7CiAJaW50IGVycm9yLCBwbTsKIAotCVdMX1RSQUNFKCgiJXM6IFNJT0NHSVdQT1dFUlxuIiwgZGV2LT5uYW1lKSk7CisJV0xfVFJBQ0UoIiVzOiBTSU9DR0lXUE9XRVJcbiIsIGRldi0+bmFtZSk7CiAKIAllcnJvciA9IGRldl93bGNfaW9jdGwoZGV2LCBXTENfR0VUX1BNLCAmcG0sIHNpemVvZihwbSkpOwogCWlmIChlcnJvcikKQEAgLTI1MDMsNyArMjQ5OSw3IEBACiAJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIHN0cnVjdCBpd19wb2ludCAqaXdwLCBjaGFyICpleHRyYSkKIHsKIAotCVdMX1RSQUNFKCgiJXM6IFNJT0NTSVdHRU5JRVxuIiwgZGV2LT5uYW1lKSk7CisJV0xfVFJBQ0UoIiVzOiBTSU9DU0lXR0VOSUVcbiIsIGRldi0+bmFtZSk7CiAKIAlDSEVDS19FWFRSQV9GT1JfTlVMTChleHRyYSk7CiAKQEAgLTI1MTYsNyArMjUxMiw3IEBACiB3bF9pd19nZXRfd3BhaWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgc3RydWN0IGl3X3BvaW50ICppd3AsIGNoYXIgKmV4dHJhKQogewotCVdMX1RSQUNFKCgiJXM6IFNJT0NHSVdHRU5JRVxuIiwgZGV2LT5uYW1lKSk7CisJV0xfVFJBQ0UoIiVzOiBTSU9DR0lXR0VOSUVcbiIsIGRldi0+bmFtZSk7CiAJaXdwLT5sZW5ndGggPSA2NDsKIAlkZXZfd2xjX2J1ZnZhcl9nZXQoZGV2LCAid3BhaWUiLCBleHRyYSwgaXdwLT5sZW5ndGgpOwogCXJldHVybiAwOwpAQCAtMjUzMSw3ICsyNTI3LDcgQEAKIAlpbnQgZXJyb3I7CiAJc3RydWN0IGl3X2VuY29kZV9leHQgKml3ZTsKIAotCVdMX1RSQUNFKCgiJXM6IFNJT0NTSVdFTkNPREVFWFRcbiIsIGRldi0+bmFtZSkpOworCVdMX1RSQUNFKCIlczogU0lPQ1NJV0VOQ09ERUVYVFxuIiwgZGV2LT5uYW1lKTsKIAogCUNIRUNLX0VYVFJBX0ZPUl9OVUxMKGV4dHJhKTsKIApAQCAtMjU0OCwxNCArMjU0NCwxNCBAQAogCiAJa2V5LmxlbiA9IGl3ZS0+a2V5X2xlbjsKIAotCWlmICghRVRIRVJfSVNNVUxUSShpd2UtPmFkZHIuc2FfZGF0YSkpCisJaWYgKCFpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihpd2UtPmFkZHIuc2FfZGF0YSkpCiAJCWJjb3B5KCh2b2lkICopJml3ZS0+YWRkci5zYV9kYXRhLCAoY2hhciAqKSZrZXkuZWEsCi0JCSAgICAgIEVUSEVSX0FERFJfTEVOKTsKKwkJICAgICAgRVRIX0FMRU4pOwogCiAJaWYgKGtleS5sZW4gPT0gMCkgewogCQlpZiAoaXdlLT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX1NFVF9UWF9LRVkpIHsKLQkJCVdMX1dTRUMoKCJDaGFuZ2luZyB0aGUgdGhlIHByaW1hcnkgS2V5IHRvICVkXG4iLAotCQkJCSBrZXkuaW5kZXgpKTsKKwkJCVdMX1dTRUMoIkNoYW5naW5nIHRoZSB0aGUgcHJpbWFyeSBLZXkgdG8gJWRcbiIsCisJCQkJa2V5LmluZGV4KTsKIAkJCWtleS5pbmRleCA9IGh0b2QzMihrZXkuaW5kZXgpOwogCQkJZXJyb3IgPSBkZXZfd2xjX2lvY3RsKGRldiwgV0xDX1NFVF9LRVlfUFJJTUFSWSwKIAkJCQkJICAgICAgJmtleS5pbmRleCwgc2l6ZW9mKGtleS5pbmRleCkpOwpAQCAtMjU2OSw5ICsyNTY1LDkgQEAKIAkJaWYgKGl3ZS0+a2V5X2xlbiA+IHNpemVvZihrZXkuZGF0YSkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQlXTF9XU0VDKCgiU2V0dGluZyB0aGUga2V5IGluZGV4ICVkXG4iLCBrZXkuaW5kZXgpKTsKKwkJV0xfV1NFQygiU2V0dGluZyB0aGUga2V5IGluZGV4ICVkXG4iLCBrZXkuaW5kZXgpOwogCQlpZiAoaXdlLT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX1NFVF9UWF9LRVkpIHsKLQkJCVdMX1dTRUMoKCJrZXkgaXMgYSBQcmltYXJ5IEtleVxuIikpOworCQkJV0xfV1NFQygia2V5IGlzIGEgUHJpbWFyeSBLZXlcbiIpOwogCQkJa2V5LmZsYWdzID0gV0xfUFJJTUFSWV9LRVk7CiAJCX0KIApAQCAtMjYzOCwxNSArMjYzNCwxNSBAQAogCXVpbnQgaTsKIAlpbnQgcmV0ID0gMDsKIAotCVdMX1dTRUMoKCIlczogU0lPQ1NJV1BNS1NBXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9XU0VDKCIlczogU0lPQ1NJV1BNS1NBXG4iLCBkZXYtPm5hbWUpOwogCiAJQ0hFQ0tfRVhUUkFfRk9SX05VTEwoZXh0cmEpOwogCiAJaXdwbWtzYSA9IChzdHJ1Y3QgaXdfcG1rc2EgKilleHRyYTsKIAogCWlmIChpd3Bta3NhLT5jbWQgPT0gSVdfUE1LU0FfRkxVU0gpIHsKLQkJV0xfV1NFQygoIndsX2l3X3NldF9wbWtzYSAtIElXX1BNS1NBX0ZMVVNIXG4iKSk7Ci0JCWJ6ZXJvKChjaGFyICopJnBta2lkX2xpc3QsIHNpemVvZihwbWtpZF9saXN0KSk7CisJCVdMX1dTRUMoIndsX2l3X3NldF9wbWtzYSAtIElXX1BNS1NBX0ZMVVNIXG4iKTsKKwkJbWVtc2V0KChjaGFyICopJnBta2lkX2xpc3QsIDAsIHNpemVvZihwbWtpZF9saXN0KSk7CiAJfQogCiAJZWxzZSBpZiAoaXdwbWtzYS0+Y21kID09IElXX1BNS1NBX1JFTU9WRSkgewpAQCAtMjY1NiwzMCArMjY1MiwzMCBAQAogCQkJcG1raWRwdHIgPSAmcG1raWQ7CiAKIAkJCWJjb3B5KCZpd3Bta3NhLT5ic3NpZC5zYV9kYXRhWzBdLAotCQkJICAgICAgJnBta2lkcHRyLT5wbWtpZFswXS5CU1NJRCwgRVRIRVJfQUREUl9MRU4pOworCQkJICAgICAgJnBta2lkcHRyLT5wbWtpZFswXS5CU1NJRCwgRVRIX0FMRU4pOwogCQkJYmNvcHkoJml3cG1rc2EtPnBta2lkWzBdLCAmcG1raWRwdHItPnBta2lkWzBdLlBNS0lELAogCQkJICAgICAgV1BBMl9QTUtJRF9MRU4pOwogCi0JCQlXTF9XU0VDKCgid2xfaXdfc2V0X3Bta3NhOklXX1BNS1NBX1JFTU9WRTpQTUtJRDogIgotCQkJCSIlcE0gPSAiLCAmcG1raWRwdHItPnBta2lkWzBdLkJTU0lEKSk7CisJCQlXTF9XU0VDKCJ3bF9pd19zZXRfcG1rc2E6SVdfUE1LU0FfUkVNT1ZFOlBNS0lEOiAlcE0gPSAiLAorCQkJCSZwbWtpZHB0ci0+cG1raWRbMF0uQlNTSUQpOwogCQkJZm9yIChqID0gMDsgaiA8IFdQQTJfUE1LSURfTEVOOyBqKyspCi0JCQkJV0xfV1NFQygoIiUwMnggIiwgcG1raWRwdHItPnBta2lkWzBdLlBNS0lEW2pdKSk7Ci0JCQlXTF9XU0VDKCgiXG4iKSk7CisJCQkJV0xfV1NFQygiJTAyeCAiLCBwbWtpZHB0ci0+cG1raWRbMF0uUE1LSURbal0pOworCQkJV0xfV1NFQygiXG4iKTsKIAkJfQogCiAJCWZvciAoaSA9IDA7IGkgPCBwbWtpZF9saXN0LnBta2lkcy5ucG1raWQ7IGkrKykKLQkJCWlmICghYmNtcAorCQkJaWYgKCFtZW1jbXAKIAkJCSAgICAoJml3cG1rc2EtPmJzc2lkLnNhX2RhdGFbMF0sCi0JCQkgICAgICZwbWtpZF9saXN0LnBta2lkcy5wbWtpZFtpXS5CU1NJRCwgRVRIRVJfQUREUl9MRU4pKQorCQkJICAgICAmcG1raWRfbGlzdC5wbWtpZHMucG1raWRbaV0uQlNTSUQsIEVUSF9BTEVOKSkKIAkJCQlicmVhazsKIAogCQlpZiAoKHBta2lkX2xpc3QucG1raWRzLm5wbWtpZCA+IDApCiAJCSAgICAmJiAoaSA8IHBta2lkX2xpc3QucG1raWRzLm5wbWtpZCkpIHsKLQkJCWJ6ZXJvKCZwbWtpZF9saXN0LnBta2lkcy5wbWtpZFtpXSwgc2l6ZW9mKHBta2lkX3QpKTsKKwkJCW1lbXNldCgmcG1raWRfbGlzdC5wbWtpZHMucG1raWRbaV0sIDAsIHNpemVvZihwbWtpZF90KSk7CiAJCQlmb3IgKDsgaSA8IChwbWtpZF9saXN0LnBta2lkcy5ucG1raWQgLSAxKTsgaSsrKSB7CiAJCQkJYmNvcHkoJnBta2lkX2xpc3QucG1raWRzLnBta2lkW2kgKyAxXS5CU1NJRCwKIAkJCQkgICAgICAmcG1raWRfbGlzdC5wbWtpZHMucG1raWRbaV0uQlNTSUQsCi0JCQkJICAgICAgRVRIRVJfQUREUl9MRU4pOworCQkJCSAgICAgIEVUSF9BTEVOKTsKIAkJCQliY29weSgmcG1raWRfbGlzdC5wbWtpZHMucG1raWRbaSArIDFdLlBNS0lELAogCQkJCSAgICAgICZwbWtpZF9saXN0LnBta2lkcy5wbWtpZFtpXS5QTUtJRCwKIAkJCQkgICAgICBXUEEyX1BNS0lEX0xFTik7CkBAIC0yNjkxLDE0ICsyNjg3LDE0IEBACiAKIAllbHNlIGlmIChpd3Bta3NhLT5jbWQgPT0gSVdfUE1LU0FfQUREKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBwbWtpZF9saXN0LnBta2lkcy5ucG1raWQ7IGkrKykKLQkJCWlmICghYmNtcAorCQkJaWYgKCFtZW1jbXAKIAkJCSAgICAoJml3cG1rc2EtPmJzc2lkLnNhX2RhdGFbMF0sCi0JCQkgICAgICZwbWtpZF9saXN0LnBta2lkcy5wbWtpZFtpXS5CU1NJRCwgRVRIRVJfQUREUl9MRU4pKQorCQkJICAgICAmcG1raWRfbGlzdC5wbWtpZHMucG1raWRbaV0uQlNTSUQsIEVUSF9BTEVOKSkKIAkJCQlicmVhazsKIAkJaWYgKGkgPCBNQVhQTUtJRCkgewogCQkJYmNvcHkoJml3cG1rc2EtPmJzc2lkLnNhX2RhdGFbMF0sCiAJCQkgICAgICAmcG1raWRfbGlzdC5wbWtpZHMucG1raWRbaV0uQlNTSUQsCi0JCQkgICAgICBFVEhFUl9BRERSX0xFTik7CisJCQkgICAgICBFVEhfQUxFTik7CiAJCQliY29weSgmaXdwbWtzYS0+cG1raWRbMF0sCiAJCQkgICAgICAmcG1raWRfbGlzdC5wbWtpZHMucG1raWRbaV0uUE1LSUQsCiAJCQkgICAgICBXUEEyX1BNS0lEX0xFTik7CkBAIC0yNzEwLDI1ICsyNzA2LDI1IEBACiAJCQl1aW50IGo7CiAJCQl1aW50IGs7CiAJCQlrID0gcG1raWRfbGlzdC5wbWtpZHMubnBta2lkOwotCQkJV0xfV1NFQygoIndsX2l3X3NldF9wbWtzYSxJV19QTUtTQV9BREQgLSBQTUtJRDogJXBNID0gIiwKLQkJCQkmcG1raWRfbGlzdC5wbWtpZHMucG1raWRba10uQlNTSUQpKTsKKwkJCVdMX1dTRUMoIndsX2l3X3NldF9wbWtzYSxJV19QTUtTQV9BREQgLSBQTUtJRDogJXBNID0gIiwKKwkJCQkmcG1raWRfbGlzdC5wbWtpZHMucG1raWRba10uQlNTSUQpOwogCQkJZm9yIChqID0gMDsgaiA8IFdQQTJfUE1LSURfTEVOOyBqKyspCi0JCQkJV0xfV1NFQygoIiUwMnggIiwKLQkJCQkJIHBta2lkX2xpc3QucG1raWRzLnBta2lkW2tdLlBNS0lEW2pdKSk7Ci0JCQlXTF9XU0VDKCgiXG4iKSk7CisJCQkJV0xfV1NFQygiJTAyeCAiLAorCQkJCQlwbWtpZF9saXN0LnBta2lkcy5wbWtpZFtrXS5QTUtJRFtqXSk7CisJCQlXTF9XU0VDKCJcbiIpOwogCQl9CiAJfQotCVdMX1dTRUMoKCJQUklOVElORyBwbWtpZCBMSVNUIC0gTm8gb2YgZWxlbWVudHMgJWRcbiIsCi0JCSBwbWtpZF9saXN0LnBta2lkcy5ucG1raWQpKTsKKwlXTF9XU0VDKCJQUklOVElORyBwbWtpZCBMSVNUIC0gTm8gb2YgZWxlbWVudHMgJWRcbiIsCisJCXBta2lkX2xpc3QucG1raWRzLm5wbWtpZCk7CiAJZm9yIChpID0gMDsgaSA8IHBta2lkX2xpc3QucG1raWRzLm5wbWtpZDsgaSsrKSB7CiAJCXVpbnQgajsKLQkJV0xfV1NFQygoIlBNS0lEWyVkXTogJXBNID0gIiwgaSwKLQkJCSZwbWtpZF9saXN0LnBta2lkcy5wbWtpZFtpXS5CU1NJRCkpOworCQlXTF9XU0VDKCJQTUtJRFslZF06ICVwTSA9ICIsCisJCQlpLCAmcG1raWRfbGlzdC5wbWtpZHMucG1raWRbaV0uQlNTSUQpOwogCQlmb3IgKGogPSAwOyBqIDwgV1BBMl9QTUtJRF9MRU47IGorKykKLQkJCVdMX1dTRUMoKCIlMDJ4ICIsIHBta2lkX2xpc3QucG1raWRzLnBta2lkW2ldLlBNS0lEW2pdKSk7Ci0JCVdMX1dTRUMoKCJcbiIpKTsKKwkJCVdMX1dTRUMoIiUwMnggIiwgcG1raWRfbGlzdC5wbWtpZHMucG1raWRbaV0uUE1LSURbal0pOworCQlXTF9XU0VDKCJcbiIpOwogCX0KLQlXTF9XU0VDKCgiXG4iKSk7CisJV0xfV1NFQygiXG4iKTsKIAogCWlmICghcmV0KQogCQlyZXQgPSBkZXZfd2xjX2J1ZnZhcl9zZXQoZGV2LCAicG1raWRfaW5mbyIsIChjaGFyICopJnBta2lkX2xpc3QsCkBAIC0yNzQyLDcgKzI3MzgsNyBAQAogCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKIAkJICAgIHN0cnVjdCBpd19wYXJhbSAqdndycSwgY2hhciAqZXh0cmEpCiB7Ci0JV0xfVFJBQ0UoKCIlczogU0lPQ0dJV0VOQ09ERUVYVFxuIiwgZGV2LT5uYW1lKSk7CisJV0xfVFJBQ0UoIiVzOiBTSU9DR0lXRU5DT0RFRVhUXG4iLCBkZXYtPm5hbWUpOwogCXJldHVybiAwOwogfQogCkBAIC0yNzU3LDEzICsyNzUzLDEzIEBACiAJaW50IHZhbCA9IDA7CiAJd2xfaXdfdCAqaXcgPSAqKHdsX2l3X3QgKiopIG5ldGRldl9wcml2KGRldik7CiAKLQlXTF9UUkFDRSgoIiVzOiBTSU9DU0lXQVVUSFxuIiwgZGV2LT5uYW1lKSk7CisJV0xfVFJBQ0UoIiVzOiBTSU9DU0lXQVVUSFxuIiwgZGV2LT5uYW1lKTsKIAogCXBhcmFtaWQgPSB2d3JxLT5mbGFncyAmIElXX0FVVEhfSU5ERVg7CiAJcGFyYW12YWwgPSB2d3JxLT52YWx1ZTsKIAotCVdMX1RSQUNFKCgiJXM6IFNJT0NTSVdBVVRILCBwYXJhbWlkID0gMHglMHgsIHBhcmFtdmFsID0gMHglMHhcbiIsCi0JCSAgZGV2LT5uYW1lLCBwYXJhbWlkLCBwYXJhbXZhbCkpOworCVdMX1RSQUNFKCIlczogU0lPQ1NJV0FVVEgsIHBhcmFtaWQgPSAweCUweCwgcGFyYW12YWwgPSAweCUweFxuIiwKKwkJIGRldi0+bmFtZSwgcGFyYW1pZCwgcGFyYW12YWwpOwogCiAJc3dpdGNoIChwYXJhbWlkKSB7CiAJY2FzZSBJV19BVVRIX1dQQV9WRVJTSU9OOgpAQCAtMjc3Myw4ICsyNzY5LDggQEAKIAkJCXZhbCA9IFdQQV9BVVRIX1BTSyB8IFdQQV9BVVRIX1VOU1BFQ0lGSUVEOwogCQllbHNlIGlmIChwYXJhbXZhbCAmIElXX0FVVEhfV1BBX1ZFUlNJT05fV1BBMikKIAkJCXZhbCA9IFdQQTJfQVVUSF9QU0sgfCBXUEEyX0FVVEhfVU5TUEVDSUZJRUQ7Ci0JCVdMX0lORk9STSgoIiVzOiAlZDogc2V0dGluZyB3cGFfYXV0aCB0byAweCUweFxuIiwgX19mdW5jX18sCi0JCQkgICBfX0xJTkVfXywgdmFsKSk7CisJCVdMX0lORk9STSgiJXM6ICVkOiBzZXR0aW5nIHdwYV9hdXRoIHRvIDB4JTB4XG4iLAorCQkJICBfX2Z1bmNfXywgX19MSU5FX18sIHZhbCk7CiAJCWVycm9yID0gZGV2X3dsY19pbnR2YXJfc2V0KGRldiwgIndwYV9hdXRoIiwgdmFsKTsKIAkJaWYgKGVycm9yKQogCQkJcmV0dXJuIGVycm9yOwpAQCAtMjc5NywyMCArMjc5MywxOSBAQAogCQl9CiAKIAkJaWYgKGl3LT5wcml2YWN5X2ludm9rZWQgJiYgIXZhbCkgewotCQkJV0xfV1NFQygoIiVzOiAlczogJ1ByaXZhY3kgaW52b2tlZCcgdHJ1ZSBidXQgY2xlYXJpbmcgIgotCQkJCSJ3c2VjLCBhc3N1bWluZyAiICJ3ZSdyZSBhIFdQUyBlbnJvbGxlZVxuIiwKLQkJCQlkZXYtPm5hbWUsIF9fZnVuY19fKSk7CisJCQlXTF9XU0VDKCIlczogJXM6ICdQcml2YWN5IGludm9rZWQnIHRydWUgYnV0IGNsZWFyaW5nIHdzZWMsIGFzc3VtaW5nIHdlJ3JlIGEgV1BTIGVucm9sbGVlXG4iLAorCQkJCWRldi0+bmFtZSwgX19mdW5jX18pOwogCQkJZXJyb3IgPSBkZXZfd2xjX2ludHZhcl9zZXQoZGV2LCAiaXNfV1BTX2Vucm9sbGVlIiwKIAkJCQkJCQl0cnVlKTsKIAkJCWlmIChlcnJvcikgewotCQkJCVdMX1dTRUMoKCJGYWlsZWQgdG8gc2V0IGlzX1dQU19lbnJvbGxlZVxuIikpOworCQkJCVdMX1dTRUMoIkZhaWxlZCB0byBzZXQgaXNfV1BTX2Vucm9sbGVlXG4iKTsKIAkJCQlyZXR1cm4gZXJyb3I7CiAJCQl9CiAJCX0gZWxzZSBpZiAodmFsKSB7CiAJCQllcnJvciA9IGRldl93bGNfaW50dmFyX3NldChkZXYsICJpc19XUFNfZW5yb2xsZWUiLAogCQkJCQkJCWZhbHNlKTsKIAkJCWlmIChlcnJvcikgewotCQkJCVdMX1dTRUMoKCJGYWlsZWQgdG8gY2xlYXIgaXNfV1BTX2Vucm9sbGVlXG4iKSk7CisJCQkJV0xfV1NFQygiRmFpbGVkIHRvIGNsZWFyIGlzX1dQU19lbnJvbGxlZVxuIik7CiAJCQkJcmV0dXJuIGVycm9yOwogCQkJfQogCQl9CkBAIC0yODM3LDggKzI4MzIsOCBAQAogCQkJZWxzZQogCQkJCXZhbCA9IFdQQTJfQVVUSF9VTlNQRUNJRklFRDsKIAkJfQotCQlXTF9JTkZPUk0oKCIlczogJWQ6IHNldHRpbmcgd3BhX2F1dGggdG8gJWRcbiIsIF9fZnVuY19fLAotCQkJICAgX19MSU5FX18sIHZhbCkpOworCQlXTF9JTkZPUk0oIiVzOiAlZDogc2V0dGluZyB3cGFfYXV0aCB0byAlZFxuIiwKKwkJCSAgX19mdW5jX18sIF9fTElORV9fLCB2YWwpOwogCQllcnJvciA9IGRldl93bGNfaW50dmFyX3NldChkZXYsICJ3cGFfYXV0aCIsIHZhbCk7CiAJCWlmIChlcnJvcikKIAkJCXJldHVybiBlcnJvcjsKQEAgLTI4NTAsNyArMjg0NSw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBJV19BVVRIXzgwMjExX0FVVEhfQUxHOgotCQlXTF9JTkZPUk0oKCJTZXR0aW5nIHRoZSBEMTFhdXRoICVkXG4iLCBwYXJhbXZhbCkpOworCQlXTF9JTkZPUk0oIlNldHRpbmcgdGhlIEQxMWF1dGggJWRcbiIsIHBhcmFtdmFsKTsKIAkJaWYgKHBhcmFtdmFsID09IElXX0FVVEhfQUxHX09QRU5fU1lTVEVNKQogCQkJdmFsID0gMDsKIAkJZWxzZSBpZiAocGFyYW12YWwgPT0gSVdfQVVUSF9BTEdfU0hBUkVEX0tFWSkKQEAgLTI4NzksOCArMjg3NCw4IEBACiAJCQkJZGV2X3dsY19pbnR2YXJfc2V0KGRldiwgIndzZWMiLCB2YWwpOwogCQkJfQogCQkJdmFsID0gMDsKLQkJCVdMX0lORk9STSgoIiVzOiAlZDogc2V0dGluZyB3cGFfYXV0aCB0byAlZFxuIiwKLQkJCQkgICBfX2Z1bmNfXywgX19MSU5FX18sIHZhbCkpOworCQkJV0xfSU5GT1JNKCIlczogJWQ6IHNldHRpbmcgd3BhX2F1dGggdG8gJWRcbiIsCisJCQkJICBfX2Z1bmNfXywgX19MSU5FX18sIHZhbCk7CiAJCQlkZXZfd2xjX2ludHZhcl9zZXQoZGV2LCAid3BhX2F1dGgiLCAwKTsKIAkJCXJldHVybiBlcnJvcjsKIAkJfQpAQCAtMjg5Nyw3ICsyODkyLDcgQEAKIAogI2lmIFdJUkVMRVNTX0VYVCA+IDE3CiAJY2FzZSBJV19BVVRIX1JPQU1JTkdfQ09OVFJPTDoKLQkJV0xfSU5GT1JNKCgiJXM6IElXX0FVVEhfUk9BTUlOR19DT05UUk9MXG4iLCBfX2Z1bmNfXykpOworCQlXTF9JTkZPUk0oIiVzOiBJV19BVVRIX1JPQU1JTkdfQ09OVFJPTFxuIiwgX19mdW5jX18pOwogCQlicmVhazsKIAljYXNlIElXX0FVVEhfUFJJVkFDWV9JTlZPS0VEOgogCQl7CkBAIC0yOTA4LDggKzI5MDMsNyBAQAogCQkJCWVycm9yID0gZGV2X3dsY19pbnR2YXJfc2V0KGRldiwKIAkJCQkJCSJpc19XUFNfZW5yb2xsZWUiLCBmYWxzZSk7CiAJCQkJaWYgKGVycm9yKSB7Ci0JCQkJCVdMX1dTRUMoKCJGYWlsZWQgdG8gY2xlYXIgaW92YXIgIgotCQkJCQkJImlzX1dQU19lbnJvbGxlZVxuIikpOworCQkJCQlXTF9XU0VDKCJGYWlsZWQgdG8gY2xlYXIgaW92YXIgaXNfV1BTX2Vucm9sbGVlXG4iKTsKIAkJCQkJcmV0dXJuIGVycm9yOwogCQkJCX0KIAkJCX0gZWxzZSB7CkBAIC0yOTIzLDggKzI5MTcsNyBAQAogCQkJCQkJCSJpc19XUFNfZW5yb2xsZWUiLAogCQkJCQkJCXRydWUpOwogCQkJCQlpZiAoZXJyb3IpIHsKLQkJCQkJCVdMX1dTRUMoKCJGYWlsZWQgdG8gc2V0IGlvdmFyICIKLQkJCQkJCSJpc19XUFNfZW5yb2xsZWVcbiIpKTsKKwkJCQkJCVdMX1dTRUMoIkZhaWxlZCB0byBzZXQgaW92YXIgaXNfV1BTX2Vucm9sbGVlXG4iKTsKIAkJCQkJCXJldHVybiBlcnJvcjsKIAkJCQkJfQogCQkJCX0gZWxzZSB7CkBAIC0yOTMyLDggKzI5MjUsNyBAQAogCQkJCQkJCSJpc19XUFNfZW5yb2xsZWUiLAogCQkJCQkJCWZhbHNlKTsKIAkJCQkJaWYgKGVycm9yKSB7Ci0JCQkJCQlXTF9XU0VDKCgiRmFpbGVkIHRvIGNsZWFyICIKLQkJCQkJCQkiaXNfV1BTX2Vucm9sbGVlXG4iKSk7CisJCQkJCQlXTF9XU0VDKCJGYWlsZWQgdG8gY2xlYXIgaXNfV1BTX2Vucm9sbGVlXG4iKTsKIAkJCQkJCXJldHVybiBlcnJvcjsKIAkJCQkJfQogCQkJCX0KQEAgLTI5NjAsNyArMjk1Miw3IEBACiAJaW50IHZhbDsKIAl3bF9pd190ICppdyA9ICood2xfaXdfdCAqKikgbmV0ZGV2X3ByaXYoZGV2KTsKIAotCVdMX1RSQUNFKCgiJXM6IFNJT0NHSVdBVVRIXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NHSVdBVVRIXG4iLCBkZXYtPm5hbWUpOwogCiAJcGFyYW1pZCA9IHZ3cnEtPmZsYWdzICYgSVdfQVVUSF9JTkRFWDsKIApAQCAtMzA0MCw3ICszMDMyLDcgQEAKIAkJYnJlYWs7CiAjaWYgV0lSRUxFU1NfRVhUID4gMTcKIAljYXNlIElXX0FVVEhfUk9BTUlOR19DT05UUk9MOgotCQlXTF9FUlJPUigoIiVzOiBJV19BVVRIX1JPQU1JTkdfQ09OVFJPTFxuIiwgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIiVzOiBJV19BVVRIX1JPQU1JTkdfQ09OVFJPTFxuIiwgX19mdW5jX18pOwogCQlicmVhazsKIAljYXNlIElXX0FVVEhfUFJJVkFDWV9JTlZPS0VEOgogCQlwYXJhbXZhbCA9IGl3LT5wcml2YWN5X2ludm9rZWQ7CkBAIC0zMTU3LDE5ICszMTQ5LDE5IEBACiAJY2hhciAqZXh0cmEgPSBOVUxMOwogCWludCB0b2tlbl9zaXplID0gMSwgbWF4X3Rva2VucyA9IDAsIHJldCA9IDA7CiAKLQlXTF9UUkFDRSgoIlxuJXMsIGNtZDoleCBhbGxlZCB2aWEgZGhkLT5kb19pb2N0bCgpZW50cnkgcG9pbnRcbiIsCi0JCSAgX19mdW5jX18sIGNtZCkpOworCVdMX1RSQUNFKCJcbiVzLCBjbWQ6JXggYWxsZWQgdmlhIGRoZC0+ZG9faW9jdGwoKWVudHJ5IHBvaW50XG4iLAorCQkgX19mdW5jX18sIGNtZCk7CiAJaWYgKGNtZCA8IFNJT0NJV0ZJUlNUIHx8CiAJCUlXX0lPQ1RMX0lEWChjbWQpID49IEFSUkFZX1NJWkUod2xfaXdfaGFuZGxlcikpIHsKLQkJV0xfRVJST1IoKCIlczogZXJyb3IgaW4gY21kPSV4IDogb3V0IG9mIHJhbmdlXG4iLCBfX2Z1bmNfXywKLQkJCWNtZCkpOworCQlXTF9FUlJPUigiJXM6IGVycm9yIGluIGNtZD0leCA6IG91dCBvZiByYW5nZVxuIiwKKwkJCSBfX2Z1bmNfXywgY21kKTsKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KIAogCWhhbmRsZXIgPSB3bF9pd19oYW5kbGVyW0lXX0lPQ1RMX0lEWChjbWQpXTsKIAlpZiAoIWhhbmRsZXIpIHsKLQkJV0xfRVJST1IoKCIlczogZXJyb3IgaW4gY21kPSV4IDogbm90IHN1cHBvcnRlZFxuIiwKLQkJCV9fZnVuY19fLCBjbWQpKTsKKwkJV0xfRVJST1IoIiVzOiBlcnJvciBpbiBjbWQ9JXggOiBub3Qgc3VwcG9ydGVkXG4iLAorCQkJIF9fZnVuY19fLCBjbWQpOwogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQogCkBAIC0zMjM0LDkgKzMyMjYsOCBAQAogCiAJaWYgKG1heF90b2tlbnMgJiYgd3JxLT51LmRhdGEucG9pbnRlcikgewogCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoID4gbWF4X3Rva2VucykgewotCQkJV0xfRVJST1IoKCIlczogZXJyb3IgaW4gY21kPSV4IHdycS0+dS5kYXRhLmxlbmd0aD0lZCAiCi0JCQkiPiBtYXhfdG9rZW5zPSVkXG4iLAotCQkJX19mdW5jX18sIGNtZCwgd3JxLT51LmRhdGEubGVuZ3RoLCBtYXhfdG9rZW5zKSk7CisJCQlXTF9FUlJPUigiJXM6IGVycm9yIGluIGNtZD0leCB3cnEtPnUuZGF0YS5sZW5ndGg9JWQgPiBtYXhfdG9rZW5zPSVkXG4iLAorCQkJCSBfX2Z1bmNfXywgY21kLCB3cnEtPnUuZGF0YS5sZW5ndGgsIG1heF90b2tlbnMpOwogCQkJcmV0dXJuIC1FMkJJRzsKIAkJfQogCQlleHRyYSA9IGttYWxsb2MobWF4X3Rva2VucyAqIHRva2VuX3NpemUsIEdGUF9LRVJORUwpOwpAQCAtMzMzOSw3ICszMzMwLDcgQEAKIAkJbWVtc2V0KHN0cmluZ0J1ZiwgMCwgYnVmbGVuKTsKIAkJc25wcmludGYoc3RyaW5nQnVmLCBidWZsZW4sICIlcyAlcyAlMDJkICUwMmQiLAogCQkJIG5hbWUsIGNhdXNlLCBzdGF0dXMsIHJlYXNvbik7Ci0JCVdMX0lORk9STSgoIkNvbm5lY3Rpb24gc3RhdHVzOiAlc1xuIiwgc3RyaW5nQnVmKSk7CisJCVdMX0lORk9STSgiQ29ubmVjdGlvbiBzdGF0dXM6ICVzXG4iLCBzdHJpbmdCdWYpOwogCQlyZXR1cm4gdHJ1ZTsKIAl9IGVsc2UgewogCQlyZXR1cm4gZmFsc2U7CkBAIC0zMzgzLDQ2ICszMzc0LDQ2IEBACiAJaXcgPSAwOwogCiAJaWYgKCFkZXYpIHsKLQkJV0xfRVJST1IoKCIlczogZGV2IGlzIG51bGxcbiIsIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCIlczogZGV2IGlzIG51bGxcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIAogCWl3ID0gKih3bF9pd190ICoqKSBuZXRkZXZfcHJpdihkZXYpOwogCi0JV0xfVFJBQ0UoKCIlczogZGV2PSVzIGV2ZW50PSVkXG4iLCBfX2Z1bmNfXywgZGV2LT5uYW1lLCBldmVudF90eXBlKSk7CisJV0xfVFJBQ0UoIiVzOiBkZXY9JXMgZXZlbnQ9JWRcbiIsIF9fZnVuY19fLCBkZXYtPm5hbWUsIGV2ZW50X3R5cGUpOwogCiAJc3dpdGNoIChldmVudF90eXBlKSB7CiAJY2FzZSBXTENfRV9UWEZBSUw6CiAJCWNtZCA9IElXRVZUWERST1A7Ci0JCW1lbWNweSh3cnF1LmFkZHIuc2FfZGF0YSwgJmUtPmFkZHIsIEVUSEVSX0FERFJfTEVOKTsKKwkJbWVtY3B5KHdycXUuYWRkci5zYV9kYXRhLCAmZS0+YWRkciwgRVRIX0FMRU4pOwogCQl3cnF1LmFkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwogCQlicmVhazsKICNpZiBXSVJFTEVTU19FWFQgPiAxNAogCWNhc2UgV0xDX0VfSk9JTjoKIAljYXNlIFdMQ19FX0FTU09DX0lORDoKIAljYXNlIFdMQ19FX1JFQVNTT0NfSU5EOgotCQltZW1jcHkod3JxdS5hZGRyLnNhX2RhdGEsICZlLT5hZGRyLCBFVEhFUl9BRERSX0xFTik7CisJCW1lbWNweSh3cnF1LmFkZHIuc2FfZGF0YSwgJmUtPmFkZHIsIEVUSF9BTEVOKTsKIAkJd3JxdS5hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKIAkJY21kID0gSVdFVlJFR0lTVEVSRUQ7CiAJCWJyZWFrOwogCWNhc2UgV0xDX0VfREVBVVRIX0lORDoKIAljYXNlIFdMQ19FX0RJU0FTU09DX0lORDoKIAkJY21kID0gU0lPQ0dJV0FQOwotCQliemVybyh3cnF1LmFkZHIuc2FfZGF0YSwgRVRIRVJfQUREUl9MRU4pOworCQltZW1zZXQod3JxdS5hZGRyLnNhX2RhdGEsIDAsIEVUSF9BTEVOKTsKIAkJd3JxdS5hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKLQkJYnplcm8oJmV4dHJhLCBFVEhFUl9BRERSX0xFTik7CisJCW1lbXNldCgmZXh0cmEsIDAsIEVUSF9BTEVOKTsKIAkJYnJlYWs7CiAJY2FzZSBXTENfRV9MSU5LOgogCWNhc2UgV0xDX0VfTkRJU19MSU5LOgogCQljbWQgPSBTSU9DR0lXQVA7CiAJCWlmICghKGZsYWdzICYgV0xDX0VWRU5UX01TR19MSU5LKSkgewotCQkJYnplcm8od3JxdS5hZGRyLnNhX2RhdGEsIEVUSEVSX0FERFJfTEVOKTsKLQkJCWJ6ZXJvKCZleHRyYSwgRVRIRVJfQUREUl9MRU4pOworCQkJbWVtc2V0KHdycXUuYWRkci5zYV9kYXRhLCAwLCBFVEhfQUxFTik7CisJCQltZW1zZXQoJmV4dHJhLCAwLCBFVEhfQUxFTik7CiAJCQlXQUtFX0xPQ0tfVElNRU9VVChpdy0+cHViLCBXQUtFX0xPQ0tfTElOS19ET1dOX1RNT1VULAogCQkJCQkgIDIwICogSFopOwogCQl9IGVsc2UgewotCQkJbWVtY3B5KHdycXUuYWRkci5zYV9kYXRhLCAmZS0+YWRkciwgRVRIRVJfQUREUl9MRU4pOwotCQkJV0xfVFJBQ0UoKCJMaW5rIFVQXG4iKSk7CisJCQltZW1jcHkod3JxdS5hZGRyLnNhX2RhdGEsICZlLT5hZGRyLCBFVEhfQUxFTik7CisJCQlXTF9UUkFDRSgiTGluayBVUFxuIik7CiAKIAkJfQogCQl3cnF1LmFkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwpAQCAtMzQzMyw4ICszNDI0LDggQEAKIAkJCXdycXUuZGF0YS5sZW5ndGggPSBkYXRhbGVuICsgMTsKIAkJCWV4dHJhWzBdID0gV0xDX0VfQUNUSU9OX0ZSQU1FOwogCQkJbWVtY3B5KCZleHRyYVsxXSwgZGF0YSwgZGF0YWxlbik7Ci0JCQlXTF9UUkFDRSgoIldMQ19FX0FDVElPTl9GUkFNRSBsZW4gJWQgXG4iLAotCQkJCSAgd3JxdS5kYXRhLmxlbmd0aCkpOworCQkJV0xfVFJBQ0UoIldMQ19FX0FDVElPTl9GUkFNRSBsZW4gJWRcbiIsCisJCQkJIHdycXUuZGF0YS5sZW5ndGgpOwogCQl9CiAJCWJyZWFrOwogCkBAIC0zNDY0LDcgKzM0NTUsNyBAQAogCQkJZWxzZQogCQkJCW1pY2VycmV2dC0+ZmxhZ3MgfD0gSVdfTUlDRkFJTFVSRV9QQUlSV0lTRTsKIAkJCW1lbWNweShtaWNlcnJldnQtPnNyY19hZGRyLnNhX2RhdGEsICZlLT5hZGRyLAotCQkJICAgICAgIEVUSEVSX0FERFJfTEVOKTsKKwkJCSAgICAgICBFVEhfQUxFTik7CiAJCQltaWNlcnJldnQtPnNyY19hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKIAogCQkJYnJlYWs7CkBAIC0zNDg3LDE0ICszNDc4LDE0IEBACiAJCQkJd3JxdS5kYXRhLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgaXdfcG1raWRfY2FuZCk7CiAJCQkJcG1raWRjYW5kID0gcG1rY2FuZGxpc3QtPnBta2lkX2NhbmQ7CiAJCQkJd2hpbGUgKGNvdW50KSB7Ci0JCQkJCWJ6ZXJvKGl3cG1raWRjYW5kLAorCQkJCQltZW1zZXQoaXdwbWtpZGNhbmQsIDAsCiAJCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgaXdfcG1raWRfY2FuZCkpOwogCQkJCQlpZiAocG1raWRjYW5kLT5wcmVhdXRoKQogCQkJCQkJaXdwbWtpZGNhbmQtPmZsYWdzIHw9CiAJCQkJCQkgICAgSVdfUE1LSURfQ0FORF9QUkVBVVRIOwogCQkJCQliY29weSgmcG1raWRjYW5kLT5CU1NJRCwKIAkJCQkJICAgICAgJml3cG1raWRjYW5kLT5ic3NpZC5zYV9kYXRhLAotCQkJCQkgICAgICBFVEhFUl9BRERSX0xFTik7CisJCQkJCSAgICAgIEVUSF9BTEVOKTsKICNpZm5kZWYgU0FOREdBVEUyRwogCQkJCQl3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgY21kLCAmd3JxdSwKIAkJCQkJCQkgICAgZXh0cmEpOwpAQCAtMzUxNSwxMyArMzUwNiwxMyBAQAogCQl9IGVsc2UgewogCQkJY21kID0gU0lPQ0dJV1NDQU47CiAJCQl3cnF1LmRhdGEubGVuZ3RoID0gc3RybGVuKGV4dHJhKTsKLQkJCVdMX1RSQUNFKCgiRXZlbnQgV0xDX0VfU0NBTl9DT01QTEVURSBmcm9tIHNwZWNpZmljICIKLQkJCQkic2NhbiAlZFxuIiwgZ19pc2Nhbi0+aXNjYW5fc3RhdGUpKTsKKwkJCVdMX1RSQUNFKCJFdmVudCBXTENfRV9TQ0FOX0NPTVBMRVRFIGZyb20gc3BlY2lmaWMgc2NhbiAlZFxuIiwKKwkJCQkgZ19pc2Nhbi0+aXNjYW5fc3RhdGUpOwogCQl9CiAjZWxzZQogCQljbWQgPSBTSU9DR0lXU0NBTjsKIAkJd3JxdS5kYXRhLmxlbmd0aCA9IHN0cmxlbihleHRyYSk7Ci0JCVdMX1RSQUNFKCgiRXZlbnQgV0xDX0VfU0NBTl9DT01QTEVURVxuIikpOworCQlXTF9UUkFDRSgiRXZlbnQgV0xDX0VfU0NBTl9DT01QTEVURVxuIik7CiAjZW5kaWYKIAkJYnJlYWs7CiAKQEAgLTM1MjksOSArMzUyMCw5IEBACiAJCXsKIAkJCXdsY19zc2lkX3QgKnNzaWQ7CiAJCQlzc2lkID0gKHdsY19zc2lkX3QgKikgZGF0YTsKLQkJCVdMX0VSUk9SKCgiJXMgRXZlbnQgV0xDX0VfUEZOX05FVF9GT1VORCwgc2VuZCAlcyB1cCA6ICIKLQkJCQkiZmluZCAlcyBsZW49JWRcbiIsIF9fZnVuY19fLCBQTk9fRVZFTlRfVVAsCi0JCQkJc3NpZC0+U1NJRCwgc3NpZC0+U1NJRF9sZW4pKTsKKwkJCVdMX0VSUk9SKCIlcyBFdmVudCBXTENfRV9QRk5fTkVUX0ZPVU5ELCBzZW5kICVzIHVwIDogZmluZCAlcyBsZW49JWRcbiIsCisJCQkJIF9fZnVuY19fLCBQTk9fRVZFTlRfVVAsCisJCQkJIHNzaWQtPlNTSUQsIHNzaWQtPlNTSURfbGVuKTsKIAkJCVdBS0VfTE9DS19USU1FT1VUKGl3LT5wdWIsIFdBS0VfTE9DS19QTk9fRklORF9UTU9VVCwKIAkJCQkJICAyMCAqIEhaKTsKIAkJCWNtZCA9IElXRVZDVVNUT007CkBAIC0zNTQyLDcgKzM1MzMsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCVdMX1RSQUNFKCgiVW5rbm93biBFdmVudCAlZDogaWdub3JpbmdcbiIsIGV2ZW50X3R5cGUpKTsKKwkJV0xfVFJBQ0UoIlVua25vd24gRXZlbnQgJWQ6IGlnbm9yaW5nXG4iLCBldmVudF90eXBlKTsKIAkJYnJlYWs7CiAJfQogI2lmbmRlZiBTQU5ER0FURTJHCkBAIC0zNTgzLDE1ICszNTc0LDE1IEBACiAJCWdvdG8gZG9uZTsKIAogCXBoeV9ub2lzZSA9IGR0b2gzMihwaHlfbm9pc2UpOwotCVdMX1RSQUNFKCgid2xfaXdfZ2V0X3dpcmVsZXNzX3N0YXRzIHBoeSBub2lzZT0lZFxuIiwgcGh5X25vaXNlKSk7CisJV0xfVFJBQ0UoIndsX2l3X2dldF93aXJlbGVzc19zdGF0cyBwaHkgbm9pc2U9JWRcbiIsIHBoeV9ub2lzZSk7CiAKLQliemVybygmc2NiX3ZhbCwgc2l6ZW9mKHNjYl92YWxfdCkpOworCW1lbXNldCgmc2NiX3ZhbCwgMCwgc2l6ZW9mKHNjYl92YWxfdCkpOwogCXJlcyA9IGRldl93bGNfaW9jdGwoZGV2LCBXTENfR0VUX1JTU0ksICZzY2JfdmFsLCBzaXplb2Yoc2NiX3ZhbF90KSk7CiAJaWYgKHJlcykKIAkJZ290byBkb25lOwogCiAJcnNzaSA9IGR0b2gzMihzY2JfdmFsLnZhbCk7Ci0JV0xfVFJBQ0UoKCJ3bF9pd19nZXRfd2lyZWxlc3Nfc3RhdHMgcnNzaT0lZFxuIiwgcnNzaSkpOworCVdMX1RSQUNFKCJ3bF9pd19nZXRfd2lyZWxlc3Nfc3RhdHMgcnNzaT0lZFxuIiwgcnNzaSk7CiAJaWYgKHJzc2kgPD0gV0xfSVdfUlNTSV9OT19TSUdOQUwpCiAJCXdzdGF0cy0+cXVhbC5xdWFsID0gMDsKIAllbHNlIGlmIChyc3NpIDw9IFdMX0lXX1JTU0lfVkVSWV9MT1cpCkBAIC0zNjE0LDIzICszNjA1LDIxIEBACiAjZW5kaWYKIAogI2lmIFdJUkVMRVNTX0VYVCA+IDExCi0JV0xfVFJBQ0UoKCJ3bF9pd19nZXRfd2lyZWxlc3Nfc3RhdHMgY291bnRlcnM9JWRcbiIsCi0JCSAgKGludClzaXplb2Yod2xfY250X3QpKSk7CisJV0xfVFJBQ0UoIndsX2l3X2dldF93aXJlbGVzc19zdGF0cyBjb3VudGVycz0lenVcbiIsIHNpemVvZih3bF9jbnRfdCkpOwogCiAJbWVtc2V0KCZjbnQsIDAsIHNpemVvZih3bF9jbnRfdCkpOwogCXJlcyA9CiAJICAgIGRldl93bGNfYnVmdmFyX2dldChkZXYsICJjb3VudGVycyIsIChjaGFyICopJmNudCwgc2l6ZW9mKHdsX2NudF90KSk7CiAJaWYgKHJlcykgewotCQlXTF9FUlJPUigoIndsX2l3X2dldF93aXJlbGVzc19zdGF0cyBjb3VudGVycyBmYWlsZWQgZXJyb3I9JWRcbiIsCi0JCQkgIHJlcykpOworCQlXTF9FUlJPUigid2xfaXdfZ2V0X3dpcmVsZXNzX3N0YXRzIGNvdW50ZXJzIGZhaWxlZCBlcnJvcj0lZFxuIiwKKwkJCSByZXMpOwogCQlnb3RvIGRvbmU7CiAJfQogCiAJY250LnZlcnNpb24gPSBkdG9oMTYoY250LnZlcnNpb24pOwogCWlmIChjbnQudmVyc2lvbiAhPSBXTF9DTlRfVF9WRVJTSU9OKSB7Ci0JCVdMX1RSQUNFKCgiXHRJbmNvcnJlY3QgdmVyc2lvbiBvZiBjb3VudGVycyBzdHJ1Y3Q6IGV4cGVjdGVkICIKLQkJCSIlZDsgZ290ICVkXG4iLAotCQkJV0xfQ05UX1RfVkVSU0lPTiwgY250LnZlcnNpb24pKTsKKwkJV0xfVFJBQ0UoIlx0SW5jb3JyZWN0IHZlcnNpb24gb2YgY291bnRlcnMgc3RydWN0OiBleHBlY3RlZCAlZDsgZ290ICVkXG4iLAorCQkJIFdMX0NOVF9UX1ZFUlNJT04sIGNudC52ZXJzaW9uKTsKIAkJZ290byBkb25lOwogCX0KIApAQCAtMzY0MSwyMiArMzYzMCwyMiBAQAogCXdzdGF0cy0+ZGlzY2FyZC5taXNjID0gZHRvaDMyKGNudC5yeHJ1bnQpICsgZHRvaDMyKGNudC5yeGdpYW50KTsKIAl3c3RhdHMtPm1pc3MuYmVhY29uID0gMDsKIAotCVdMX1RSQUNFKCgid2xfaXdfZ2V0X3dpcmVsZXNzX3N0YXRzIGNvdW50ZXJzIHR4ZnJhbWU9JWQgdHhieXRlPSVkXG4iLAotCQkgIGR0b2gzMihjbnQudHhmcmFtZSksIGR0b2gzMihjbnQudHhieXRlKSkpOwotCVdMX1RSQUNFKCgid2xfaXdfZ2V0X3dpcmVsZXNzX3N0YXRzIGNvdW50ZXJzIHJ4ZnJtdG9vbG9uZz0lZFxuIiwKLQkJICBkdG9oMzIoY250LnJ4ZnJtdG9vbG9uZykpKTsKLQlXTF9UUkFDRSgoIndsX2l3X2dldF93aXJlbGVzc19zdGF0cyBjb3VudGVycyByeGJhZHBsY3A9JWRcbiIsCi0JCSAgZHRvaDMyKGNudC5yeGJhZHBsY3ApKSk7Ci0JV0xfVFJBQ0UoKCJ3bF9pd19nZXRfd2lyZWxlc3Nfc3RhdHMgY291bnRlcnMgcnh1bmRlYz0lZFxuIiwKLQkJICBkdG9oMzIoY250LnJ4dW5kZWMpKSk7Ci0JV0xfVFJBQ0UoKCJ3bF9pd19nZXRfd2lyZWxlc3Nfc3RhdHMgY291bnRlcnMgcnhmcmFnZXJyPSVkXG4iLAotCQkgIGR0b2gzMihjbnQucnhmcmFnZXJyKSkpOwotCVdMX1RSQUNFKCgid2xfaXdfZ2V0X3dpcmVsZXNzX3N0YXRzIGNvdW50ZXJzIHR4ZmFpbD0lZFxuIiwKLQkJICBkdG9oMzIoY250LnR4ZmFpbCkpKTsKLQlXTF9UUkFDRSgoIndsX2l3X2dldF93aXJlbGVzc19zdGF0cyBjb3VudGVycyByeHJ1bnQ9JWRcbiIsCi0JCSAgZHRvaDMyKGNudC5yeHJ1bnQpKSk7Ci0JV0xfVFJBQ0UoKCJ3bF9pd19nZXRfd2lyZWxlc3Nfc3RhdHMgY291bnRlcnMgcnhnaWFudD0lZFxuIiwKLQkJICBkdG9oMzIoY250LnJ4Z2lhbnQpKSk7CisJV0xfVFJBQ0UoIndsX2l3X2dldF93aXJlbGVzc19zdGF0cyBjb3VudGVycyB0eGZyYW1lPSVkIHR4Ynl0ZT0lZFxuIiwKKwkJIGR0b2gzMihjbnQudHhmcmFtZSksIGR0b2gzMihjbnQudHhieXRlKSk7CisJV0xfVFJBQ0UoIndsX2l3X2dldF93aXJlbGVzc19zdGF0cyBjb3VudGVycyByeGZybXRvb2xvbmc9JWRcbiIsCisJCSAgZHRvaDMyKGNudC5yeGZybXRvb2xvbmcpKTsKKwlXTF9UUkFDRSgid2xfaXdfZ2V0X3dpcmVsZXNzX3N0YXRzIGNvdW50ZXJzIHJ4YmFkcGxjcD0lZFxuIiwKKwkJICBkdG9oMzIoY250LnJ4YmFkcGxjcCkpOworCVdMX1RSQUNFKCJ3bF9pd19nZXRfd2lyZWxlc3Nfc3RhdHMgY291bnRlcnMgcnh1bmRlYz0lZFxuIiwKKwkJICBkdG9oMzIoY250LnJ4dW5kZWMpKTsKKwlXTF9UUkFDRSgid2xfaXdfZ2V0X3dpcmVsZXNzX3N0YXRzIGNvdW50ZXJzIHJ4ZnJhZ2Vycj0lZFxuIiwKKwkJICBkdG9oMzIoY250LnJ4ZnJhZ2VycikpOworCVdMX1RSQUNFKCJ3bF9pd19nZXRfd2lyZWxlc3Nfc3RhdHMgY291bnRlcnMgdHhmYWlsPSVkXG4iLAorCQkgIGR0b2gzMihjbnQudHhmYWlsKSk7CisJV0xfVFJBQ0UoIndsX2l3X2dldF93aXJlbGVzc19zdGF0cyBjb3VudGVycyByeHJ1bnQ9JWRcbiIsCisJCSAgZHRvaDMyKGNudC5yeHJ1bnQpKTsKKwlXTF9UUkFDRSgid2xfaXdfZ2V0X3dpcmVsZXNzX3N0YXRzIGNvdW50ZXJzIHJ4Z2lhbnQ9JWRcbiIsCisJCSAgZHRvaDMyKGNudC5yeGdpYW50KSk7CiAjZW5kaWYJCQkJLyogV0lSRUxFU1NfRVhUID4gMTEgKi8KIAogZG9uZToKQEAgLTM2OTAsOCArMzY3OSw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCW1lbXNldChpc2NhbiwgMCwgc2l6ZW9mKGlzY2FuX2luZm9fdCkpOwogCi0JaXNjYW4tPmlzY2FuX2V4X3BhcmFtc19wID0KLQkgICAgKHdsX2lzY2FuX3BhcmFtc190ICopIGttYWxsb2MocGFyYW1zX3NpemUsIEdGUF9LRVJORUwpOworCWlzY2FuLT5pc2Nhbl9leF9wYXJhbXNfcCA9IGttYWxsb2MocGFyYW1zX3NpemUsIEdGUF9LRVJORUwpOwogCWlmICghaXNjYW4tPmlzY2FuX2V4X3BhcmFtc19wKQogCQlyZXR1cm4gLUVOT01FTTsKIAlpc2Nhbi0+aXNjYW5fZXhfcGFyYW1fc2l6ZSA9IHBhcmFtc19zaXplOwpAQCAtMzcyMyw5ICszNzExLDcgQEAKIAlwcml2X2RldiA9IGRldjsKIAlNVVRFWF9MT0NLX1NPRlRBUF9TRVRfSU5JVChpdy0+cHViKTsKICNlbmRpZgotCWdfc2NhbiA9IE5VTEw7Ci0KLQlnX3NjYW4gPSAodm9pZCAqKWttYWxsb2MoR19TQ0FOX1JFU1VMVFMsIEdGUF9LRVJORUwpOworCWdfc2NhbiA9IGttYWxsb2MoR19TQ0FOX1JFU1VMVFMsIEdGUF9LRVJORUwpOwogCWlmICghZ19zY2FuKQogCQlyZXR1cm4gLUVOT01FTTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy93bF9pdy5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy93bF9pdy5oCmluZGV4IGVkYmY2MWYuLmM4NjM3YzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvd2xfaXcuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL3dsX2l3LmgKQEAgLTc4LDcgKzc4LDcgQEAKIAogI2RlZmluZSBDSEVDS19FWFRSQV9GT1JfTlVMTChleHRyYSkgXAogaWYgKCFleHRyYSkgeyBcCi0JV0xfRVJST1IoKCIlczogZXJyb3IgOiBleHRyYSBpcyBudWxsIHBvaW50ZXJcbiIsIF9fZnVuY19fKSk7IFwKKwlXTF9FUlJPUigiJXM6IGVycm9yIDogZXh0cmEgaXMgbnVsbCBwb2ludGVyXG4iLCBfX2Z1bmNfXyk7CVwKIAlyZXR1cm4gLUVJTlZBTDsgXAogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvYmNtX3JwYy5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2JjbV9ycGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdlNWQ4Zi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvYmNtX3JwYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCi0gKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpZm5kZWYgX0JDTV9SUENfSF8KLSNkZWZpbmUgX0JDTV9SUENfSF8KLQotI2luY2x1ZGUgPHJwY19vc2wuaD4KLQotdHlwZWRlZiBzdHJ1Y3QgcnBjX2luZm8gcnBjX2luZm9fdDsKLXR5cGVkZWYgc3RydWN0IHJwY19idWYgcnBjX2J1Zl90Owotc3RydWN0IHJwY190cmFuc3BvcnRfaW5mbzsKLXR5cGVkZWYgdm9pZCAoKnJwY19kaXNwYXRjaF9jYl90KSAodm9pZCAqY3R4LCBzdHJ1Y3QgcnBjX2J1ZiAqYnVmKTsKLXR5cGVkZWYgdm9pZCAoKnJwY19yZXN5bmNfY2JfdCkgKHZvaWQgKmN0eCk7Ci10eXBlZGVmIHZvaWQgKCpycGNfZG93bl9jYl90KSAodm9pZCAqY3R4KTsKLXR5cGVkZWYgdm9pZCAoKnJwY190eGRvbmVfY2JfdCkgKHZvaWQgKmN0eCwgc3RydWN0IHJwY19idWYgKmJ1Zik7Ci1leHRlcm4gc3RydWN0IHJwY19pbmZvICpiY21fcnBjX2F0dGFjaCh2b2lkICpwZGV2LCBvc2xfdCAqb3NoLAotCQkJCSAgICAgICBzdHJ1Y3QgcnBjX3RyYW5zcG9ydF9pbmZvICpycGNfdGgpOwotCi1leHRlcm4gdm9pZCBiY21fcnBjX2RldGFjaChzdHJ1Y3QgcnBjX2luZm8gKnJwYyk7Ci1leHRlcm4gdm9pZCBiY21fcnBjX2Rvd24oc3RydWN0IHJwY19pbmZvICpycGMpOwotZXh0ZXJuIHZvaWQgYmNtX3JwY193YXRjaGRvZyhzdHJ1Y3QgcnBjX2luZm8gKnJwYyk7Ci0KLWV4dGVybiBzdHJ1Y3QgcnBjX2J1ZiAqYmNtX3JwY19idWZfYWxsb2Moc3RydWN0IHJwY19pbmZvICpycGMsIGludCBsZW4pOwotZXh0ZXJuIHZvaWQgYmNtX3JwY19idWZfZnJlZShzdHJ1Y3QgcnBjX2luZm8gKnJwYywgc3RydWN0IHJwY19idWYgKmIpOwotLyogZ2V0IHJwYyB0cmFuc3BvcnQgaGFuZGxlICovCi1leHRlcm4gc3RydWN0IHJwY190cmFuc3BvcnRfaW5mbyAqYmNtX3JwY190cF9nZXQoc3RydWN0IHJwY19pbmZvICpycGMpOwotCi0vKiBjYWxsYmFjayBmb3I6IGRhdGFfcngsIGRvd24sIHJlc3luYyAqLwotZXh0ZXJuIHZvaWQgYmNtX3JwY19yeGNiX2luaXQoc3RydWN0IHJwY19pbmZvICpycGMsIHZvaWQgKmN0eCwKLQkJCSAgICAgIHJwY19kaXNwYXRjaF9jYl90IGNiLCB2b2lkICpkbmN0eCwKLQkJCSAgICAgIHJwY19kb3duX2NiX3QgZG5jYiwgcnBjX3Jlc3luY19jYl90IHJlc3luY19jYiwKLQkJCSAgICAgIHJwY190eGRvbmVfY2JfdCk7Ci1leHRlcm4gdm9pZCBiY21fcnBjX3J4Y2JfZGVpbml0KHN0cnVjdCBycGNfaW5mbyAqcnBjaSk7Ci0KLS8qIEhPU1Qgb3IgQ0xJRU5UIHJwYyBjYWxsLCByZXF1aXJpbmcgbm8gcmV0dXJuIHZhbHVlICovCi1leHRlcm4gaW50IGJjbV9ycGNfY2FsbChzdHJ1Y3QgcnBjX2luZm8gKnJwYywgc3RydWN0IHJwY19idWYgKmIpOwotCi0vKiBIT1NUIHJwYyBjYWxsLCBkZW1hbmRpbmcgcmV0dXJuLgotICogICBUaGUgdGhyZWFkIG1heSBiZSBzdXNwZW5kZWQgYW5kIGNvbnRyb2wgcmV0dXJucyBiYWNrIHRvIE9TCi0gKiAgIFRoZSB0aHJlYWQgd2lsbCByZXN1bWUod2FrZWQgdXApIG9uIGVpdGhlciB0aGUgcmV0dXJuIHNpZ25hbCByZWNlaXZlZCBvciB0aW1lb3V0Ci0gKiAgICAgVGhlIGltcGxlbWVudGF0aW9uIGRldGFpbHMgZGVwZW5kIG9uIE9TCi0gKi8KLWV4dGVybiBzdHJ1Y3QgcnBjX2J1ZiAqYmNtX3JwY19jYWxsX3dpdGhfcmV0dXJuKHN0cnVjdCBycGNfaW5mbyAqcnBjLAotCQkJCQkJc3RydWN0IHJwY19idWYgKmIpOwotCi0vKiBDTElFTlQgcnBjIGNhbGwgdG8gcmVzcG9uZCB0byBiY21fcnBjX2NhbGxfd2l0aF9yZXR1cm4sIHJlcXVpcmluZyBubyByZXR1cm4gdmFsdWUgKi8KLWV4dGVybiBpbnQgYmNtX3JwY19jYWxsX3JldHVybihzdHJ1Y3QgcnBjX2luZm8gKnJwYywgc3RydWN0IHJwY19idWYgKnJldGIpOwotCi1leHRlcm4gdWludCBiY21fcnBjX2J1Zl9oZWFkZXJfbGVuKHN0cnVjdCBycGNfaW5mbyAqcnBjaSk7Ci0KLSNkZWZpbmUgUlBDX1BLVExPR19TSVpFCQk1MAkvKiBEZXB0aCBvZiB0aGUgaGlzdG9yeSAqLwotI2RlZmluZSBSUENfUEtUTE9HX1JEX0xFTgkzCi0jZGVmaW5lIFJQQ19QS1RMT0dfRFVNUF9TSVpFCTE1MAkvKiBkdW1wIHNpemUgc2hvdWxkIGJlIG1vcmUgdGhhbiB0aGUgcHJvZHVjdCBvZiBhYm92ZSB0d28gKi8KLWV4dGVybiBpbnQgYmNtX3JwY19wa3Rsb2dfZ2V0KHN0cnVjdCBycGNfaW5mbyAqcnBjaSwgdTMyICpidWYsCi0JCQkgICAgICB1aW50IGJ1Zl9zaXplLCBib29sIHNlbmQpOwotZXh0ZXJuIGludCBiY21fcnBjX2R1bXAocnBjX2luZm9fdCAqcnBjaSwgc3RydWN0IGJjbXN0cmJ1ZiAqYik7Ci0KLS8qIEhJR0gvQk1BQzogYml0IDE1LTg6IFJQQyBtb2R1bGUsIGJpdCA3LTA6IFRQIG1vZHVsZSAqLwotI2RlZmluZSBSUENfRVJST1JfVkFMCTB4MDAwMQotI2RlZmluZSBSUENfVFJBQ0VfVkFMCTB4MDAwMgotI2RlZmluZSBSUENfUEtUVFJBQ0VfVkFMIDB4MDAwNAotI2RlZmluZSBSUENfUEtUTE9HX1ZBTAkweDAwMDgKLWV4dGVybiB2b2lkIGJjbV9ycGNfbXNnbGV2ZWxfc2V0KHN0cnVjdCBycGNfaW5mbyAqcnBjaSwgdTE2IG1zZ2xldmVsLAotCQkJCSBib29sIGhpZ2hfbG93KTsKLQotI2VuZGlmCQkJCS8qIF9CQ01fUlBDX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvYmNtX3JwY190cC5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2JjbV9ycGNfdHAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI4ZGM2ZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvYmNtX3JwY190cC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgotICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaWZuZGVmIF9iY21fcnBjX3RwX2hfCi0jZGVmaW5lIF9iY21fcnBjX3RwX2hfCi0jaW5jbHVkZSA8YmNtX3JwYy5oPgotCi0jZGVmaW5lIERCVVNfUlhfQlVGRkVSX1NJWkVfUlBDCSgyMTAwKQkvKiByeGJ1ZnNpemUgZm9yIGRidXNfYXR0YWNoLCBsaW51eCBvbmx5IGZvciBub3cgKi8KLQotI2RlZmluZSBCQ01fUlBDX1RQX0VOQ0FQX0xFTgk0CS8qIFRQIGhlYWRlciBpcyA0IGJ5dGVzICovCi0KLSNkZWZpbmUgQkNNX1JQQ19UUF9IT1NUX0FHR19NQVNLCTB4ZmZmZjAwMDAKLSNkZWZpbmUgQkNNX1JQQ19UUF9IT1NUX0FHR19TSElGVAkxNgotI2RlZmluZSBCQ01fUlBDX1RQX0hPU1RfQUdHX0FNUERVCTB4MDAwMTAwMDAJLyogSE9TVC0+RE5HTCBhbXBkdSBhZ2dyZWdhdGlvbiAqLwotI2RlZmluZSBCQ01fUlBDX1RQX0hPU1RfQUdHX1RFU1QJMHgwMDEwMDAwMAkvKiBIT1NULT5ETkdMIHRlc3QgYWdncmVnYXRpb24gKi8KLSNkZWZpbmUgQkNNX1JQQ19UUF9ETkdMX0FHR19NQVNLCTB4MDAwMGZmZmYKLSNkZWZpbmUgQkNNX1JQQ19UUF9ETkdMX0FHR19EUEMJCTB4MDAwMDAwMDEJLyogRE5HTC0+SE9TVCBkYXRhIGFnZ3JlZ2F0aW9uICovCi0jZGVmaW5lIEJDTV9SUENfVFBfRE5HTF9BR0dfRkxPV0NUTAkweDAwMDAwMDAyCS8qIEROR0wtPkhPU1QgdHggZmxvd2NvbnRyb2wgYWdnICovCi0jZGVmaW5lIEJDTV9SUENfVFBfRE5HTF9BR0dfVEVTVAkweDAwMDAwMDEwCS8qIEROR0wtPkhPU1QgdGVzdCBhZ2cgKi8KLQotI2RlZmluZSBCQ01fUlBDX1RQX0ROR0xfQUdHX01BWF9TRlJBTUUJMwkvKiBtYXggYWdnIHN1YmZyYW1lcywgbXVzdCBiZSA8PSBVU0JfTlRYRCAqLwotI2RlZmluZSBCQ01fUlBDX1RQX0ROR0xfQUdHX01BWF9CWVRFCTQwMDAJLyogbWF4IGFnZyBieXRlcyAqLwotCi0jZGVmaW5lIEJDTV9SUENfVFBfSE9TVF9BR0dfTUFYX1NGUkFNRSAgMwkvKiBtYXggYWdnIHN1YmZyYW1lcywgQU1QRFUgb25seSwgMyBpcyBlbm91Z2ggKi8KLSNkZWZpbmUgQkNNX1JQQ19UUF9IT1NUX0FHR19NQVhfQllURSAgICAzNDAwCS8qIG1heCBhZ2cgYnl0ZXM7IHRvIGZpdCAyKyB0Y3AvdWRwIHBrdHMuIEVhY2ggb25lOgotCQkJCQkJICogODAyLjNwa3QgKyA4MDIuMTEgaGRyICsgcnBjIGhkciArIHRwIGhkciA8IDE3MDBCCi0JCQkJCQkgKiBOZWVkIHRvIGJlIGluIHN5bmMgd2l0aCBkb25nbGUgdXNiIHJ4IGRtYQotCQkJCQkJICogIHJ4YnVmc2l6ZShVU0JCVUxLX1JYQlVGX0dJQU5UIGluIHVzYmRldl9zYi5jKQotCQkJCQkJICovCi0vKiBUUC1EQlVTIHBrdHMgZmxvd2NvbnRyb2wgKi8KLSNkZWZpbmUgQkNNX1JQQ19UUF9EQlVTX05UWFEJNTAJLyogcXVldWUgc2l6ZSBmb3IgVFggb24gYnVsayBPVVQsIGFnZ3JlZ2F0aW9uIHBvc3NpYmxlICovCi0jZGVmaW5lIEJDTV9SUENfVFBfREJVU19OUlhRCTUwCS8qIHF1ZXVlIHNpemUgZm9yIFJYIG9uIGJ1bGsgSU4sIGFnZ3JlZ2F0aW9uIHBvc3NpYmxlICovCi0jZGVmaW5lIEJDTV9SUENfVFBfREJVU19OUlhRX0NUUkwJMQkvKiBxdWV1ZSBzaXplIGZvciBSWCBvbiBjdGwgRVAwICovCi0KLSNkZWZpbmUgQkNNX1JQQ19UUF9EQlVTX05SWFFfUEtUCShCQ01fUlBDX1RQX0RCVVNfTlJYUSAqIEJDTV9SUENfVFBfRE5HTF9BR0dfTUFYX1NGUkFNRSkKLSNkZWZpbmUgQkNNX1JQQ19UUF9EQlVTX05UWFFfUEtUCShCQ01fUlBDX1RQX0RCVVNfTlRYUSAqIEJDTV9SUENfVFBfSE9TVF9BR0dfTUFYX1NGUkFNRSkKLQotdHlwZWRlZiBzdHJ1Y3QgcnBjX3RyYW5zcG9ydF9pbmZvIHJwY190cF9pbmZvX3Q7Ci0KLXR5cGVkZWYgdm9pZCAoKnJwY190eF9jb21wbGV0ZV9mbl90KSAodm9pZCAqLCBycGNfYnVmX3QgKiwgaW50IHN0YXR1cyk7Ci10eXBlZGVmIHZvaWQgKCpycGNfcnhfZm5fdCkgKHZvaWQgKiwgcnBjX2J1Zl90ICopOwotCi0jaWZkZWYgV0xDX0xPVwotdHlwZWRlZiB2b2lkICgqcnBjX3R4Zmxvd2N0bF9jYl90KSAodm9pZCAqY3R4LCBib29sIG9uKTsKLSNlbmRpZgotCi1leHRlcm4gcnBjX3RwX2luZm9fdCAqYmNtX3JwY190cF9hdHRhY2gob3NsX3QgKm9zaCwgdm9pZCAqYnVzKTsKLWV4dGVybiB2b2lkIGJjbV9ycGNfdHBfZGV0YWNoKHJwY190cF9pbmZvX3QgKnJwY2IpOwotZXh0ZXJuIHZvaWQgYmNtX3JwY190cF9kb3duKHJwY190cF9pbmZvX3QgKnJwY2IpOwotZXh0ZXJuIHZvaWQgYmNtX3JwY190cF93YXRjaGRvZyhycGNfdHBfaW5mb190ICpycGNiKTsKLQotZXh0ZXJuIGludCBiY21fcnBjX3RwX2J1Zl9zZW5kKHJwY190cF9pbmZvX3QgKnJwY2IsIHJwY19idWZfdCAqYnVmKTsKLQotLyogY2FsbGJhY2sgZm9yIHR4X2NvbXBsZXRlLCByeF9wa3QgKi8KLWV4dGVybiB2b2lkIGJjbV9ycGNfdHBfcmVnaXN0ZXJfY2IocnBjX3RwX2luZm9fdCAqcnBjYiwKLQkJCQkgICBycGNfdHhfY29tcGxldGVfZm5fdCB0eGNtcGx0LAotCQkJCSAgIHZvaWQgKnR4X2NvbnRleHQsIHJwY19yeF9mbl90IHJ4cGt0LAotCQkJCSAgIHZvaWQgKnJ4X2NvbnRleHQsIHJwY19vc2xfdCAqcnBjX29zaCk7Ci1leHRlcm4gdm9pZCBiY21fcnBjX3RwX2RlcmVnaXN0ZXJfY2IocnBjX3RwX2luZm9fdCAqcnBjYik7Ci0KLS8qIEJ1ZmZlciBtYW5pcHVsYXRpb24gKi8KLWV4dGVybiB1aW50IGJjbV9ycGNfYnVmX3RwX2hlYWRlcl9sZW4ocnBjX3RwX2luZm9fdCAqcnBjYik7Ci1leHRlcm4gcnBjX2J1Zl90ICpiY21fcnBjX3RwX2J1Zl9hbGxvYyhycGNfdHBfaW5mb190ICpycGNiLCBpbnQgbGVuKTsKLWV4dGVybiB2b2lkIGJjbV9ycGNfdHBfYnVmX2ZyZWUocnBjX3RwX2luZm9fdCAqcnBjYiwgcnBjX2J1Zl90ICpidWYpOwotZXh0ZXJuIGludCBiY21fcnBjX2J1Zl9sZW5fZ2V0KHJwY190cF9pbmZvX3QgKnJwY2IsIHJwY19idWZfdCAqYik7Ci1leHRlcm4gaW50IGJjbV9ycGNfYnVmX2xlbl9zZXQocnBjX3RwX2luZm9fdCAqcnBjYiwgcnBjX2J1Zl90ICpiLCB1aW50IGxlbik7Ci1leHRlcm4gcnBjX2J1Zl90ICpiY21fcnBjX2J1Zl9uZXh0X2dldChycGNfdHBfaW5mb190ICpycGNiLCBycGNfYnVmX3QgKmIpOwotZXh0ZXJuIHZvaWQgYmNtX3JwY19idWZfbmV4dF9zZXQocnBjX3RwX2luZm9fdCAqcnBjYiwgcnBjX2J1Zl90ICpiLAotCQkJCSBycGNfYnVmX3QgKm5leHRiKTsKLWV4dGVybiB1bnNpZ25lZCBjaGFyICpiY21fcnBjX2J1Zl9kYXRhKHJwY190cF9pbmZvX3QgKnJwY2IsIHJwY19idWZfdCAqYik7Ci1leHRlcm4gdW5zaWduZWQgY2hhciAqYmNtX3JwY19idWZfcHVzaChycGNfdHBfaW5mb190ICpycGNiLCBycGNfYnVmX3QgKmIsCi0JCQkJICAgICAgIHVpbnQgZGVsdGEpOwotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgKmJjbV9ycGNfYnVmX3B1bGwocnBjX3RwX2luZm9fdCAqcnBjYiwgcnBjX2J1Zl90ICpiLAotCQkJCSAgICAgICB1aW50IGRlbHRhKTsKLWV4dGVybiB2b2lkIGJjbV9ycGNfdHBfYnVmX3JlbGVhc2UocnBjX3RwX2luZm9fdCAqcnBjYiwgcnBjX2J1Zl90ICpidWYpOwotZXh0ZXJuIHZvaWQgYmNtX3JwY190cF9idWZfY250X2FkanVzdChycGNfdHBfaW5mb190ICpycGNiLCBpbnQgYWRqdXN0KTsKLS8qIFJQQyBjYWxsX3dpdGhfcmV0dXJuICovCi1leHRlcm4gaW50IGJjbV9ycGNfdHBfcmVjdl9ydG4ocnBjX3RwX2luZm9fdCAqcnBjYik7Ci1leHRlcm4gaW50IGJjbV9ycGNfdHBfZ2V0X2RldmljZV9zcGVlZChycGNfdHBfaW5mb190ICpycGNfdGgpOwotI2lmZGVmIEJDTURCRwotZXh0ZXJuIGludCBiY21fcnBjX3RwX2R1bXAocnBjX3RwX2luZm9fdCAqcnBjYiwgc3RydWN0IGJjbXN0cmJ1ZiAqYik7Ci0jZW5kaWYKLQotI2lmZGVmIFdMQ19MT1cKLS8qIGludGVyY2VwdCBVU0IgcGt0IHRvIHBhcnNlIFJQQyBoZWFkZXI6IFVTQiBkcml2ZXIgcngtPiB3bF9zZW5kIC0+IHRoaXMgLT4gd2wgZHJpdmVyICovCi1leHRlcm4gdm9pZCBiY21fcnBjX3RwX3J4X2Zyb21fZG5nbGJ1cyhycGNfdHBfaW5mb190ICpycGNfdGgsIHN0cnVjdCBsYnVmICpsYik7Ci0KLS8qIFJQQyBjYWxscmV0dXJuIHBrdCwgZ28gdG8gVVNCIGRyaXZlciB0eCAqLwotZXh0ZXJuIGludCBiY21fcnBjX3RwX3NlbmRfY2FsbHJldHVybihycGNfdHBfaW5mb190ICpycGNfdGgsIHJwY19idWZfdCAqYik7Ci0KLWV4dGVybiB2b2lkIGJjbV9ycGNfdHBfZHVtcChycGNfdHBfaW5mb190ICpycGNiKTsKLWV4dGVybiB2b2lkIGJjbV9ycGNfdHBfdHhmbG93Y3RsKHJwY190cF9pbmZvX3QgKnJwY2IsIGJvb2wgc3RhdGUsIGludCBwcmlvKTsKLWV4dGVybiB2b2lkIGJjbV9ycGNfdHBfdHhmbG93Y3RsY2JfaW5pdChycGNfdHBfaW5mb190ICpycGNfdGgsIHZvaWQgKmN0eCwKLQkJCQkJcnBjX3R4Zmxvd2N0bF9jYl90IGNiKTsKLWV4dGVybiB2b2lkIGJjbV9ycGNfdHBfdHhmbG93Y3RsY2JfZGVpbml0KHJwY190cF9pbmZvX3QgKnJwY190aCk7Ci1leHRlcm4gdm9pZCBiY21fcnBjX3RwX3R4cV93bV9zZXQocnBjX3RwX2luZm9fdCAqcnBjX3RoLCB1OCBoaXdtLAotCQkJCSAgdTggbG93bSk7Ci1leHRlcm4gdm9pZCBiY21fcnBjX3RwX3R4cV93bV9nZXQocnBjX3RwX2luZm9fdCAqcnBjX3RoLCB1OCAqaGl3bSwKLQkJCQkgIHU4ICpsb3dtKTsKLSNlbmRpZgkJCQkvKiBXTENfTE9XICovCi0KLWV4dGVybiB2b2lkIGJjbV9ycGNfdHBfYWdnX3NldChycGNfdHBfaW5mb190ICpycGNiLCB1MzIgcmVhc29uLCBib29sIHNldCk7Ci1leHRlcm4gdm9pZCBiY21fcnBjX3RwX2FnZ19saW1pdF9zZXQocnBjX3RwX2luZm9fdCAqcnBjX3RoLCB1OCBzZiwKLQkJCQkgICAgIHUxNiBieXRlcyk7Ci1leHRlcm4gdm9pZCBiY21fcnBjX3RwX2FnZ19saW1pdF9nZXQocnBjX3RwX2luZm9fdCAqcnBjX3RoLCB1OCAqc2YsCi0JCQkJICAgICB1MTYgKmJ5dGVzKTsKLQotI2RlZmluZSBCQ01fUlBDX1RQX01TR19MRVZFTF9NQVNLCTB4MDBmZgotLyogZG9uZ2xlIG1zZyBsZXZlbCAqLwotI2RlZmluZSBSUENfVFBfTVNHX0ROR0xfRVJSX1ZBTAkJMHgwMDAxCS8qIEROR0wgVFAgZXJyb3IgbXNnICovCi0jZGVmaW5lIFJQQ19UUF9NU0dfRE5HTF9EQkdfVkFMCQkweDAwMDIJLyogRE5HTCBUUCBkYmcgbXNnICovCi0jZGVmaW5lIFJQQ19UUF9NU0dfRE5HTF9BR0dfVkFMCQkweDAwMDQJLyogRE5HTCBUUCBhZ2cgbXNnICovCi0jZGVmaW5lIFJQQ19UUF9NU0dfRE5HTF9ERUFfVkFMCQkweDAwMDgJLyogRE5HTCBUUCBkZWFnIG1zZyAqLwotCi0vKiBob3N0IG1zZyBsZXZlbCAqLwotI2RlZmluZSBSUENfVFBfTVNHX0hPU1RfRVJSX1ZBTAkJMHgwMDAxCS8qIEROR0wgVFAgZXJyb3IgbXNnICovCi0jZGVmaW5lIFJQQ19UUF9NU0dfSE9TVF9EQkdfVkFMCQkweDAwMDIJLyogRE5HTCBUUCBkYmcgbXNnICovCi0jZGVmaW5lIFJQQ19UUF9NU0dfSE9TVF9BR0dfVkFMCQkweDAwMDQJLyogRE5HTCBUUCBhZ2cgbXNnICovCi0jZGVmaW5lIFJQQ19UUF9NU0dfSE9TVF9ERUFfVkFMCQkweDAwMDgJLyogRE5HTCBUUCBkZWFnIG1zZyAqLwotCi1leHRlcm4gdm9pZCBiY21fcnBjX3RwX21zZ2xldmVsX3NldChycGNfdHBfaW5mb190ICpycGNfdGgsIHU4IG1zZ2xldmVsLAotCQkJCSAgICBib29sIGhpZ2hfbG93KTsKLQotI2VuZGlmCQkJCS8qIF9iY21fcnBjX3RwX2hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvYmNtX3hkci5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2JjbV94ZHIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBmYmQ3OC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvYmNtX3hkci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCi0gKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpZm5kZWYgX0JDTV9YRFJfSAotI2RlZmluZSBfQkNNX1hEUl9ICi0KLS8qCi0gKiBiY21feGRyX2J1Zl90Ci0gKiBTdHJ1Y3R1cmUgdXNlZCBmb3IgYm9va2tlZXBpbmcgb2YgYSBidWZmZXIgYmVpbmcgcGFja2VkIG9yIHVucGFja2VkLgotICogS2VlcHMgYSBjdXJyZW50IHJlYWQvd3JpdGUgcG9pbnRlciBhbmQgc2l6ZSBhcyB3ZWxsIGFzCi0gKiB0aGUgb3JpZ2luYWwgYnVmZmVyIHBvaW50ZXIgYW5kIHNpemUuCi0gKgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0JdTggKmJ1ZjsJCS8qIHBvaW50ZXIgdG8gY3VycmVudCBwb3NpdGlvbiBpbiBvcmlnYnVmICovCi0JdWludCBzaXplOwkJLyogY3VycmVudCAocmVzaWR1YWwpIHNpemUgaW4gYnl0ZXMgKi8KLQl1OCAqb3JpZ2J1ZjsJCS8qIHVubW9kaWZpZWQgcG9pbnRlciB0byBvcmlnbmFsIGJ1ZmZlciAqLwotCXVpbnQgb3JpZ3NpemU7CQkvKiB1bm1vZGlmaWVkIG9yaWduYWwgYnVmZmVyIHNpemUgaW4gYnl0ZXMgKi8KLX0gYmNtX3hkcl9idWZfdDsKLQotdm9pZCBiY21feGRyX2J1Zl9pbml0KGJjbV94ZHJfYnVmX3QgKmIsIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbik7Ci0KLWludCBiY21feGRyX3BhY2tfdTMyKGJjbV94ZHJfYnVmX3QgKmIsIHUzMiB2YWwpOwotaW50IGJjbV94ZHJfdW5wYWNrX3UzMihiY21feGRyX2J1Zl90ICpiLCB1MzIgKnB2YWwpOwotaW50IGJjbV94ZHJfcGFja19zMzIoYmNtX3hkcl9idWZfdCAqYiwgczMyIHZhbCk7Ci1pbnQgYmNtX3hkcl91bnBhY2tfczMyKGJjbV94ZHJfYnVmX3QgKmIsIHMzMiAqcHZhbCk7Ci1pbnQgYmNtX3hkcl9wYWNrX3M4KGJjbV94ZHJfYnVmX3QgKmIsIHM4IHZhbCk7Ci1pbnQgYmNtX3hkcl91bnBhY2tfczgoYmNtX3hkcl9idWZfdCAqYiwgczggKnB2YWwpOwotaW50IGJjbV94ZHJfcGFja19vcGFxdWUoYmNtX3hkcl9idWZfdCAqYiwgdWludCBsZW4sIHZvaWQgKmRhdGEpOwotaW50IGJjbV94ZHJfdW5wYWNrX29wYXF1ZShiY21feGRyX2J1Zl90ICpiLCB1aW50IGxlbiwgdm9pZCAqKnBkYXRhKTsKLWludCBiY21feGRyX3VucGFja19vcGFxdWVfY3B5KGJjbV94ZHJfYnVmX3QgKmIsIHVpbnQgbGVuLCB2b2lkICpkYXRhKTsKLWludCBiY21feGRyX3BhY2tfb3BhcXVlX3ZhcmxlbihiY21feGRyX2J1Zl90ICpiLCB1aW50IGxlbiwgdm9pZCAqZGF0YSk7Ci1pbnQgYmNtX3hkcl91bnBhY2tfb3BhcXVlX3ZhcmxlbihiY21feGRyX2J1Zl90ICpiLCB1aW50ICpwbGVuLCB2b2lkICoqcGRhdGEpOwotaW50IGJjbV94ZHJfcGFja19zdHJpbmcoYmNtX3hkcl9idWZfdCAqYiwgY2hhciAqc3RyKTsKLWludCBiY21feGRyX3VucGFja19zdHJpbmcoYmNtX3hkcl9idWZfdCAqYiwgdWludCAqcGxlbiwgY2hhciAqKnBzdHIpOwotCi1pbnQgYmNtX3hkcl9wYWNrX3U4X3ZlYyhiY21feGRyX2J1Zl90ICosIHU4ICp2ZWMsIHUzMiBlbGVtcyk7Ci1pbnQgYmNtX3hkcl91bnBhY2tfdThfdmVjKGJjbV94ZHJfYnVmX3QgKiwgdTggKnZlYywgdTMyIGVsZW1zKTsKLWludCBiY21feGRyX3BhY2tfdTE2X3ZlYyhiY21feGRyX2J1Zl90ICpiLCB1aW50IGxlbiwgdm9pZCAqdmVjKTsKLWludCBiY21feGRyX3VucGFja191MTZfdmVjKGJjbV94ZHJfYnVmX3QgKmIsIHVpbnQgbGVuLCB2b2lkICp2ZWMpOwotaW50IGJjbV94ZHJfcGFja191MzJfdmVjKGJjbV94ZHJfYnVmX3QgKmIsIHVpbnQgbGVuLCB2b2lkICp2ZWMpOwotaW50IGJjbV94ZHJfdW5wYWNrX3UzMl92ZWMoYmNtX3hkcl9idWZfdCAqYiwgdWludCBsZW4sIHZvaWQgKnZlYyk7Ci0KLWludCBiY21feGRyX3BhY2tfb3BhcXVlX3JhdyhiY21feGRyX2J1Zl90ICpiLCB1aW50IGxlbiwgdm9pZCAqZGF0YSk7Ci1pbnQgYmNtX3hkcl9wYWNrX29wYXF1ZV9wYWQoYmNtX3hkcl9idWZfdCAqYik7Ci0KLSNlbmRpZgkJCQkvKiBfQkNNX1hEUl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvYmNtZGVmcy5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2JjbWRlZnMuaAppbmRleCBkYzUyZTlkYi4uNzQ2MDFmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2JjbWRlZnMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvYmNtZGVmcy5oCkBAIC00Miw5ICs0Miw2IEBACiAjZGVmaW5lIEJDTUZBU1RQQVRICiAjZW5kaWYKIAotLyogUHV0IHNvbWUgbGlicmFyeSBkYXRhL2NvZGUgaW50byBST00gdG8gcmVkdWNlIFJBTSByZXF1aXJlbWVudHMgKi8KLSNkZWZpbmUgQkNNUk9NRk4oX2ZuKQkJX2ZuCi0KIC8qIEJ1cyB0eXBlcyAqLwogI2RlZmluZQlTSV9CVVMJCQkwCS8qIFNPQyBJbnRlcmNvbm5lY3QgKi8KICNkZWZpbmUJUENJX0JVUwkJCTEJLyogUENJIHRhcmdldCAqLwpAQCAtNTQsMzUgKzUxLDYgQEAKICNkZWZpbmUgU1BJX0JVUwkJCTYJLyogZ1NQSSB0YXJnZXQgKi8KICNkZWZpbmUgUlBDX0JVUwkJCTcJLyogUlBDIHRhcmdldCAqLwogCi0vKiBBbGxvd3Mgc2l6ZSBvcHRpbWl6YXRpb24gZm9yIHNpbmdsZS1idXMgaW1hZ2UgKi8KLSNpZmRlZiBCQ01CVVNUWVBFCi0jZGVmaW5lIEJVU1RZUEUoYnVzKSAJKEJDTUJVU1RZUEUpCi0jZWxzZQotI2RlZmluZSBCVVNUWVBFKGJ1cykgCShidXMpCi0jZW5kaWYKLQotLyogQWxsb3dzIHNpemUgb3B0aW1pemF0aW9uIGZvciBzaW5nbGUtYmFja3BsYW5lIGltYWdlICovCi0jaWZkZWYgQkNNQ0hJUFRZUEUKLSNkZWZpbmUgQ0hJUFRZUEUoYnVzKSAJKEJDTUNISVBUWVBFKQotI2Vsc2UKLSNkZWZpbmUgQ0hJUFRZUEUoYnVzKSAJKGJ1cykKLSNlbmRpZgotCi0vKiBBbGxvd3Mgc2l6ZSBvcHRpbWl6YXRpb24gZm9yIFNQUk9NIHN1cHBvcnQgKi8KLSNkZWZpbmUgU1BST01CVVMJKFBDSV9CVVMpCi0KLS8qIEFsbG93cyBzaXplIG9wdGltaXphdGlvbiBmb3Igc2luZ2xlLWNoaXAgaW1hZ2UgKi8KLSNpZmRlZiBCQ01DSElQSUQKLSNkZWZpbmUgQ0hJUElEKGNoaXApCShCQ01DSElQSUQpCi0jZWxzZQotI2RlZmluZSBDSElQSUQoY2hpcCkJKGNoaXApCi0jZW5kaWYKLQotI2lmZGVmIEJDTUNISVBSRVYKLSNkZWZpbmUgQ0hJUFJFVihyZXYpCShCQ01DSElQUkVWKQotI2Vsc2UKLSNkZWZpbmUgQ0hJUFJFVihyZXYpCShyZXYpCi0jZW5kaWYKIAogLyogRGVmaW5lcyBmb3IgRE1BIEFkZHJlc3MgV2lkdGggLSBTaGFyZWQgYmV0d2VlbiBPU0wgYW5kIEhORERNQSAqLwogI2RlZmluZSBETUFERFJfTUFTS18zMiAweDAJLyogQWRkcmVzcyBtYXNrIGZvciAzMi1iaXRzICovCkBAIC0xNDYsMzEgKzExNCwxMSBAQAogCiAjZGVmaW5lIEJDTUVYVFJBSERST09NIDE3MgogCi0vKiBIZWFkcm9vbSByZXF1aXJlZCBmb3IgZG9uZ2xlLXRvLWhvc3QgY29tbXVuaWNhdGlvbi4gIFBhY2tldHMgYWxsb2NhdGVkCi0gKiBsb2NhbGx5IGluIHRoZSBkb25nbGUgKGUuZy4gZm9yIENEQyBpb2N0bHMgb3IgUk5ESVMgbWVzc2FnZXMpIHNob3VsZAotICogbGVhdmUgdGhpcyBtdWNoIHJvb20gaW4gZnJvbnQgZm9yIGxvdy1sZXZlbCBtZXNzYWdlIGhlYWRlcnMgd2hpY2ggbWF5Ci0gKiBiZSBuZWVkZWQgdG8gZ2V0IGFjcm9zcyB0aGUgZG9uZ2xlIGJ1cyB0byB0aGUgaG9zdC4gIChUaGVzZSBtZXNzYWdlcwotICogZG9uJ3QgZ28gb3ZlciB0aGUgbmV0d29yaywgc28gcm9vbSBmb3IgdGhlIGZ1bGwgV0wgaGVhZGVyIGFib3ZlIHdvdWxkCi0gKiBiZSBhIHdhc3RlLikuCi0qLwotI2RlZmluZSBCQ01ET05HTEVIRFJTWiAxMgotI2RlZmluZSBCQ01ET05HTEVQQURTWiAxNgotCi0jZGVmaW5lIEJDTURPTkdMRU9WRVJIRUFECShCQ01ET05HTEVIRFJTWiArIEJDTURPTkdMRVBBRFNaKQotCiAjaWZkZWYgQkNNREJHCi0KLSNkZWZpbmUgQkNNREJHX0VSUgotCiAjaWZuZGVmIEJDTURCR19BU1NFUlQKICNkZWZpbmUgQkNNREJHX0FTU0VSVAotI2VuZGlmCQkJCS8qIEJDTURCR19BU1NFUlQgKi8KLQotI2VuZGlmCQkJCS8qIEJDTURCRyAqLwotCi0jaWYgZGVmaW5lZChCQ01EQkdfQVNTRVJUKQotI2RlZmluZSBCQ01BU1NFUlRfU1VQUE9SVAotI2VuZGlmCisjZW5kaWYJLyogQkNNREJHX0FTU0VSVCAqLworI2VuZGlmCS8qIEJDTURCRyAqLwogCiAvKiBNYWNyb3MgZm9yIGRvaW5nIGRlZmluaXRpb24gYW5kIGdldC9zZXQgb2YgYml0ZmllbGRzCiAgKiBVc2FnZSBleGFtcGxlLCBlLmcuIGEgdGhyZWUtYml0IGZpZWxkIChiaXRzIDQtNik6CkBAIC0xOTAsMTEgKzEzOCwxMCBAQAogCQkoKCh2YWwpICYgKH4oZmllbGQgIyMgX00gPDwgZmllbGQgIyMgX1MpKSkgfCBcCiAJCSAoKHVuc2lnbmVkKShiaXRzKSA8PCBmaWVsZCAjIyBfUykpCiAKLS8qIGRlZmluZSBCQ01TTUFMTCB0byByZW1vdmUgbWlzYyBmZWF0dXJlcyBmb3IgbWVtb3J5LWNvbnN0cmFpbmVkIGVudmlyb25tZW50cyAqLwotI2RlZmluZQlCQ01TUEFDRQotI2RlZmluZSBiY21zcGFjZQl0cnVlCS8qIGlmIChiY21zcGFjZSkgY29kZSBpcyByZXRhaW5lZCAqLwotCiAvKiBNYXguIG52cmFtIHZhcmlhYmxlIHRhYmxlIHNpemUgKi8KICNkZWZpbmUJTUFYU1pfTlZSQU1fVkFSUwk0MDk2CiAKKy8qIGhhbmRsZSBmb3J3YXJkIGRlY2xhcmF0aW9uICovCitzdHJ1Y3Qgd2xfaW5mbzsKKwogI2VuZGlmCQkJCS8qIF9iY21kZWZzX2hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvYmNtc2RidXMuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9iY21zZGJ1cy5oCmluZGV4IGNhOTk0OTUuLjg5MDU5ZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9iY21zZGJ1cy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9iY21zZGJ1cy5oCkBAIC00Niw4ICs0Niw4IEBACiAgKiAgVGhlIGhhbmRsZXIgc2hhbGwgYmUgcHJvdmlkZWQgYnkgYWxsIHN1YnNlcXVlbnQgY2FsbHMuIE5vIGxvY2FsIGNhY2hlCiAgKiAgY2ZnaGRsIHBvaW50cyB0byB0aGUgc3RhcnRpbmcgYWRkcmVzcyBvZiBwY2kgZGV2aWNlIG1hcHBlZCBtZW1vcnkKICAqLwotZXh0ZXJuIHNkaW9oX2luZm9fdCAqc2Rpb2hfYXR0YWNoKG9zbF90ICpvc2gsIHZvaWQgKmNmZ2hkbCwgdWludCBpcnEpOwotZXh0ZXJuIFNESU9IX0FQSV9SQyBzZGlvaF9kZXRhY2gob3NsX3QgKm9zaCwgc2Rpb2hfaW5mb190ICpzaSk7CitleHRlcm4gc2Rpb2hfaW5mb190ICpzZGlvaF9hdHRhY2goc3RydWN0IG9zbF9pbmZvICpvc2gsIHZvaWQgKmNmZ2hkbCwgdWludCBpcnEpOworZXh0ZXJuIFNESU9IX0FQSV9SQyBzZGlvaF9kZXRhY2goc3RydWN0IG9zbF9pbmZvICpvc2gsIHNkaW9oX2luZm9fdCAqc2kpOwogZXh0ZXJuIFNESU9IX0FQSV9SQyBzZGlvaF9pbnRlcnJ1cHRfcmVnaXN0ZXIoc2Rpb2hfaW5mb190ICpzaSwKIAkJCQkJICAgICBzZGlvaF9jYl9mbl90IGZuLCB2b2lkICphcmdoKTsKIGV4dGVybiBTRElPSF9BUElfUkMgc2Rpb2hfaW50ZXJydXB0X2RlcmVnaXN0ZXIoc2Rpb2hfaW5mb190ICpzaSk7CkBAIC03OSw3ICs3OSw3IEBACiAJCQkJCSB1aW50IGZpeF9pbmMsIHVpbnQgcncsIHVpbnQgZm5jX251bSwKIAkJCQkJIHUzMiBhZGRyLCB1aW50IHJlZ3dpZHRoLAogCQkJCQkgdTMyIGJ1ZmxlbiwgdTggKmJ1ZmZlciwKLQkJCQkJIHZvaWQgKnBrdCk7CisJCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqcGt0KTsKIAogLyogZ2V0IGNpcyBkYXRhICovCiBleHRlcm4gU0RJT0hfQVBJX1JDIHNkaW9oX2Npc19yZWFkKHNkaW9oX2luZm9fdCAqc2ksIHVpbnQgZnVjLCB1OCAqY2lzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2JjbXNkaC5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2JjbXNkaC5oCmluZGV4IDZiODA5ODMuLjBlMWY3OTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9iY21zZGguaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvYmNtc2RoLmgKQEAgLTQwLDExICs0MCwxMSBAQAogICogICAgaW1wbGVtZW50YXRpb24gbWF5IG1haW50YWluIGEgc2luZ2xlICJkZWZhdWx0IiBoYW5kbGUgKGUuZy4gdGhlIGZpcnN0IG9yCiAgKiAgICBtb3N0IHJlY2VudCBvbmUpIHRvIGVuYWJsZSBzaW5nbGUtaW5zdGFuY2UgaW1wbGVtZW50YXRpb25zIHRvIHBhc3MgTlVMTC4KICAqLwotZXh0ZXJuIGJjbXNkaF9pbmZvX3QgKmJjbXNkaF9hdHRhY2gob3NsX3QgKm9zaCwgdm9pZCAqY2ZnaGRsLCB2b2lkICoqcmVnc3ZhLAotCQkJCSAgICB1aW50IGlycSk7CitleHRlcm4gYmNtc2RoX2luZm9fdCAqYmNtc2RoX2F0dGFjaChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqY2ZnaGRsLAorCQkJCSAgICB2b2lkICoqcmVnc3ZhLCB1aW50IGlycSk7CiAKIC8qIERldGFjaCAtIGZyZWV1cCByZXNvdXJjZXMgYWxsb2NhdGVkIGluIGF0dGFjaCAqLwotZXh0ZXJuIGludCBiY21zZGhfZGV0YWNoKG9zbF90ICpvc2gsIHZvaWQgKnNkaCk7CitleHRlcm4gaW50IGJjbXNkaF9kZXRhY2goc3RydWN0IG9zbF9pbmZvICpvc2gsIHZvaWQgKnNkaCk7CiAKIC8qIFF1ZXJ5IGlmIFNEIGRldmljZSBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkICovCiBleHRlcm4gYm9vbCBiY21zZGhfaW50cl9xdWVyeSh2b2lkICpzZGgpOwpAQCAtMTIyLDcgKzEyMiw3IEBACiAJCQkgICB1OCAqYnVmLCB1aW50IG5ieXRlcywgdm9pZCAqcGt0LAogCQkJICAgYmNtc2RoX2NtcGx0X2ZuX3QgY29tcGxldGUsIHZvaWQgKmhhbmRsZSk7CiBleHRlcm4gaW50IGJjbXNkaF9yZWN2X2J1Zih2b2lkICpzZGgsIHUzMiBhZGRyLCB1aW50IGZuLCB1aW50IGZsYWdzLAotCQkJICAgdTggKmJ1ZiwgdWludCBuYnl0ZXMsIHZvaWQgKnBrdCwKKwkJCSAgIHU4ICpidWYsIHVpbnQgbmJ5dGVzLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0LAogCQkJICAgYmNtc2RoX2NtcGx0X2ZuX3QgY29tcGxldGUsIHZvaWQgKmhhbmRsZSk7CiAKIC8qIEZsYWdzIGJpdHMgKi8KQEAgLTE3NCw4ICsxNzQsOCBAQAogdHlwZWRlZiBzdHJ1Y3QgewogCS8qIGF0dGFjaCB0byBkZXZpY2UgKi8KIAl2b2lkICooKmF0dGFjaCkgKHUxNiB2ZW5kX2lkLCB1MTYgZGV2X2lkLCB1MTYgYnVzLCB1MTYgc2xvdCwKLQkJCSB1MTYgZnVuYywgdWludCBidXN0eXBlLCB2b2lkICpyZWdzdmEsIG9zbF90ICpvc2gsCi0JCQkgdm9pZCAqcGFyYW0pOworCQkJIHUxNiBmdW5jLCB1aW50IGJ1c3R5cGUsIHZvaWQgKnJlZ3N2YSwKKwkJCSBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqcGFyYW0pOwogCS8qIGRldGFjaCBmcm9tIGRldmljZSAqLwogCXZvaWQgKCpkZXRhY2gpICh2b2lkICpjaCk7CiB9IGJjbXNkaF9kcml2ZXJfdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9iY21zZGhfc2RtbWMuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9iY21zZGhfc2RtbWMuaAppbmRleCA3ZDVhYTcxLi40ZDY3MWRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvYmNtc2RoX3NkbW1jLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2JjbXNkaF9zZG1tYy5oCkBAIC01MSw3ICs1MSw3IEBACiAjZGVmaW5lIENMSUVOVF9JTlRSIAkJMHgxMDAJLyogR2V0IHJpZCBvZiB0aGlzISAqLwogCiBzdHJ1Y3Qgc2Rpb2hfaW5mbyB7Ci0Jb3NsX3QgKm9zaDsJCS8qIG9zaCBoYW5kbGVyICovCisJc3RydWN0IG9zbF9pbmZvICpvc2g7CQkvKiBvc2ggaGFuZGxlciAqLwogCWJvb2wgY2xpZW50X2ludHJfZW5hYmxlZDsJLyogaW50ZXJydXB0IGNvbm5uZWN0ZWQgZmxhZyAqLwogCWJvb2wgaW50cl9oYW5kbGVyX3ZhbGlkOwkvKiBjbGllbnQgZHJpdmVyIGludGVycnVwdCBoYW5kbGVyIHZhbGlkICovCiAJc2Rpb2hfY2JfZm5fdCBpbnRyX2hhbmRsZXI7CS8qIHJlZ2lzdGVyZWQgaW50ZXJydXB0IGhhbmRsZXIgKi8KQEAgLTk0LDggKzk0LDggQEAKICAqLwogCiAvKiBSZWdpc3RlciBtYXBwaW5nIHJvdXRpbmVzICovCi1leHRlcm4gdTMyICpzZGlvaF9zZG1tY19yZWdfbWFwKG9zbF90ICpvc2gsIHMzMiBhZGRyLCBpbnQgc2l6ZSk7Ci1leHRlcm4gdm9pZCBzZGlvaF9zZG1tY19yZWdfdW5tYXAob3NsX3QgKm9zaCwgczMyIGFkZHIsIGludCBzaXplKTsKK2V4dGVybiB1MzIgKnNkaW9oX3NkbW1jX3JlZ19tYXAoc3RydWN0IG9zbF9pbmZvICpvc2gsIHMzMiBhZGRyLCBpbnQgc2l6ZSk7CitleHRlcm4gdm9pZCBzZGlvaF9zZG1tY19yZWdfdW5tYXAoc3RydWN0IG9zbF9pbmZvICpvc2gsIHMzMiBhZGRyLCBpbnQgc2l6ZSk7CiAKIC8qIEludGVycnVwdCAoZGUpcmVnaXN0cmF0aW9uIHJvdXRpbmVzICovCiBleHRlcm4gaW50IHNkaW9oX3NkbW1jX3JlZ2lzdGVyX2lycShzZGlvaF9pbmZvX3QgKnNkLCB1aW50IGlycSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvYmNtc3JvbS5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2JjbXNyb20uaAppbmRleCA5ZDUzNjU3Li5jZGNlZjc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvYmNtc3JvbS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9iY21zcm9tLmgKQEAgLTIwLDE1ICsyMCwxNSBAQAogI2luY2x1ZGUgPGJjbXNyb21fZm10Lmg+CiAKIC8qIFByb3RvdHlwZXMgKi8KLWV4dGVybiBpbnQgc3JvbV92YXJfaW5pdChzaV90ICpzaWgsIHVpbnQgYnVzLCB2b2lkICpjdXJtYXAsIG9zbF90ICpvc2gsCi0JCQkgY2hhciAqKnZhcnMsIHVpbnQgKmNvdW50KTsKK2V4dGVybiBpbnQgc3JvbV92YXJfaW5pdChzaV90ICpzaWgsIHVpbnQgYnVzLCB2b2lkICpjdXJtYXAsCisJCQkgc3RydWN0IG9zbF9pbmZvICpvc2gsIGNoYXIgKip2YXJzLCB1aW50ICpjb3VudCk7CiAKLWV4dGVybiBpbnQgc3JvbV9yZWFkKHNpX3QgKnNpaCwgdWludCBidXMsIHZvaWQgKmN1cm1hcCwgb3NsX3QgKm9zaCwKK2V4dGVybiBpbnQgc3JvbV9yZWFkKHNpX3QgKnNpaCwgdWludCBidXMsIHZvaWQgKmN1cm1hcCwgc3RydWN0IG9zbF9pbmZvICpvc2gsCiAJCSAgICAgdWludCBieXRlb2ZmLCB1aW50IG5ieXRlcywgdTE2ICpidWYsIGJvb2wgY2hlY2tfY3JjKTsKIAogLyogcGFyc2Ugc3RhbmRhcmQgUENNQ0lBIGNpcywgbm9ybWFsbHkgdXNlZCBieSBTQi9QQ01DSUEvU0RJTy9TUEkvT1RQCiAgKiAgIGFuZCBleHRyYWN0IGZyb20gaXQgaW50byBuYW1lPXZhbHVlIHBhaXJzCiAgKi8KLWV4dGVybiBpbnQgc3JvbV9wYXJzZWNpcyhvc2xfdCAqb3NoLCB1OCAqKnBjaXMsIHVpbnQgY2lzY250LAorZXh0ZXJuIGludCBzcm9tX3BhcnNlY2lzKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB1OCAqKnBjaXMsIHVpbnQgY2lzY250LAogCQkJIGNoYXIgKip2YXJzLCB1aW50ICpjb3VudCk7CiAjZW5kaWYJCQkJLyogX2JjbXNyb21faF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9iY211dGlscy5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2JjbXV0aWxzLmgKaW5kZXggYjUzMzE1OS4uYThmNzZkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2JjbXV0aWxzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2JjbXV0aWxzLmgKQEAgLTMwLDcgKzMwLDYgQEAKIAl9OwogCiAvKiAqKiBkcml2ZXItb25seSBzZWN0aW9uICoqICovCi0jaW5jbHVkZSA8b3NsLmg+CiAKICNkZWZpbmUgR1BJT19QSU5fTk9UREVGSU5FRCAJMHgyMAkvKiBQaW4gbm90IGRlZmluZWQgKi8KIApAQCAtNTYsMTAgKzU1LDEwIEBACiAjZW5kaWYKIAogCXR5cGVkZWYgc3RydWN0IHBrdHFfcHJlYyB7Ci0JCXZvaWQgKmhlYWQ7CS8qIGZpcnN0IHBhY2tldCB0byBkZXF1ZXVlICovCi0JCXZvaWQgKnRhaWw7CS8qIGxhc3QgcGFja2V0IHRvIGRlcXVldWUgKi8KLQkJdTE2IGxlbjsJLyogbnVtYmVyIG9mIHF1ZXVlZCBwYWNrZXRzICovCi0JCXUxNiBtYXg7CS8qIG1heGltdW0gbnVtYmVyIG9mIHF1ZXVlZCBwYWNrZXRzICovCisJCXN0cnVjdCBza19idWZmICpoZWFkOwkvKiBmaXJzdCBwYWNrZXQgdG8gZGVxdWV1ZSAqLworCQlzdHJ1Y3Qgc2tfYnVmZiAqdGFpbDsJLyogbGFzdCBwYWNrZXQgdG8gZGVxdWV1ZSAqLworCQl1MTYgbGVuOwkJLyogbnVtYmVyIG9mIHF1ZXVlZCBwYWNrZXRzICovCisJCXUxNiBtYXg7CQkvKiBtYXhpbXVtIG51bWJlciBvZiBxdWV1ZWQgcGFja2V0cyAqLwogCX0gcGt0cV9wcmVjX3Q7CiAKIC8qIG11bHRpLXByaW9yaXR5IHBrdCBxdWV1ZSAqLwpAQCAtMTA1LDIzICsxMDQsMjYgQEAKICNkZWZpbmUgcGt0cV9wcGVlayhwcSwgcHJlYykgICAgICAgICAgICAoKHBxKS0+cVtwcmVjXS5oZWFkKQogI2RlZmluZSBwa3RxX3BwZWVrX3RhaWwocHEsIHByZWMpICAgICAgICgocHEpLT5xW3ByZWNdLnRhaWwpCiAKLQlleHRlcm4gdm9pZCAqcGt0cV9wZW5xKHN0cnVjdCBwa3RxICpwcSwgaW50IHByZWMsIHZvaWQgKnApOwotCWV4dGVybiB2b2lkICpwa3RxX3BlbnFfaGVhZChzdHJ1Y3QgcGt0cSAqcHEsIGludCBwcmVjLCB2b2lkICpwKTsKLQlleHRlcm4gdm9pZCAqcGt0cV9wZGVxKHN0cnVjdCBwa3RxICpwcSwgaW50IHByZWMpOwotCWV4dGVybiB2b2lkICpwa3RxX3BkZXFfdGFpbChzdHJ1Y3QgcGt0cSAqcHEsIGludCBwcmVjKTsKK2V4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqcGt0cV9wZW5xKHN0cnVjdCBwa3RxICpwcSwgaW50IHByZWMsCisJCQkJIHN0cnVjdCBza19idWZmICpwKTsKK2V4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqcGt0cV9wZW5xX2hlYWQoc3RydWN0IHBrdHEgKnBxLCBpbnQgcHJlYywKKwkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqcCk7CitleHRlcm4gc3RydWN0IHNrX2J1ZmYgKnBrdHFfcGRlcShzdHJ1Y3QgcGt0cSAqcHEsIGludCBwcmVjKTsKK2V4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqcGt0cV9wZGVxX3RhaWwoc3RydWN0IHBrdHEgKnBxLCBpbnQgcHJlYyk7CisKIC8qIEVtcHR5IHRoZSBxdWV1ZSBhdCBwYXJ0aWN1bGFyIHByZWNlZGVuY2UgbGV2ZWwgKi8KICNpZmRlZiBCUkNNX0ZVTExNQUMKLQlleHRlcm4gdm9pZCBwa3RxX3BmbHVzaChvc2xfdCAqb3NoLCBzdHJ1Y3QgcGt0cSAqcHEsIGludCBwcmVjLAorCWV4dGVybiB2b2lkIHBrdHFfcGZsdXNoKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBzdHJ1Y3QgcGt0cSAqcHEsIGludCBwcmVjLAogCQlib29sIGRpcik7CiAjZWxzZQotCWV4dGVybiB2b2lkIHBrdHFfcGZsdXNoKG9zbF90ICpvc2gsIHN0cnVjdCBwa3RxICpwcSwgaW50IHByZWMsCisJZXh0ZXJuIHZvaWQgcGt0cV9wZmx1c2goc3RydWN0IG9zbF9pbmZvICpvc2gsIHN0cnVjdCBwa3RxICpwcSwgaW50IHByZWMsCiAJCWJvb2wgZGlyLCBpZnBrdF9jYl90IGZuLCBpbnQgYXJnKTsKICNlbmRpZiAvKiBCUkNNX0ZVTExNQUMgKi8KIAogLyogb3BlcmF0aW9ucyBvbiBhIHNldCBvZiBwcmVjZWRlbmNlcyBpbiBwYWNrZXQgcXVldWUgKi8KIAotCWV4dGVybiBpbnQgcGt0cV9tbGVuKHN0cnVjdCBwa3RxICpwcSwgdWludCBwcmVjX2JtcCk7Ci0JZXh0ZXJuIHZvaWQgKnBrdHFfbWRlcShzdHJ1Y3QgcGt0cSAqcHEsIHVpbnQgcHJlY19ibXAsIGludCAqcHJlY19vdXQpOworZXh0ZXJuIGludCBwa3RxX21sZW4oc3RydWN0IHBrdHEgKnBxLCB1aW50IHByZWNfYm1wKTsKK2V4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqcGt0cV9tZGVxKHN0cnVjdCBwa3RxICpwcSwgdWludCBwcmVjX2JtcCwgaW50ICpwcmVjX291dCk7CiAKIC8qIG9wZXJhdGlvbnMgb24gcGFja2V0IHF1ZXVlIGFzIGEgd2hvbGUgKi8KIApAQCAtMTQwLDIwICsxNDIsMTkgQEAKIAogCWV4dGVybiB2b2lkIHBrdHFfaW5pdChzdHJ1Y3QgcGt0cSAqcHEsIGludCBudW1fcHJlYywgaW50IG1heF9sZW4pOwogLyogcHJlY19vdXQgbWF5IGJlIE5VTEwgaWYgY2FsbGVyIGlzIG5vdCBpbnRlcmVzdGVkIGluIHJldHVybiB2YWx1ZSAqLwotCWV4dGVybiB2b2lkICpwa3RxX3BlZWtfdGFpbChzdHJ1Y3QgcGt0cSAqcHEsIGludCAqcHJlY19vdXQpOworCWV4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqcGt0cV9wZWVrX3RhaWwoc3RydWN0IHBrdHEgKnBxLCBpbnQgKnByZWNfb3V0KTsKICNpZmRlZiBCUkNNX0ZVTExNQUMKLQlleHRlcm4gdm9pZCBwa3RxX2ZsdXNoKG9zbF90ICpvc2gsIHN0cnVjdCBwa3RxICpwcSwgYm9vbCBkaXIpOworCWV4dGVybiB2b2lkIHBrdHFfZmx1c2goc3RydWN0IG9zbF9pbmZvICpvc2gsIHN0cnVjdCBwa3RxICpwcSwgYm9vbCBkaXIpOwogI2Vsc2UKLQlleHRlcm4gdm9pZCBwa3RxX2ZsdXNoKG9zbF90ICpvc2gsIHN0cnVjdCBwa3RxICpwcSwgYm9vbCBkaXIsCisJZXh0ZXJuIHZvaWQgcGt0cV9mbHVzaChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc3RydWN0IHBrdHEgKnBxLCBib29sIGRpciwKIAkJaWZwa3RfY2JfdCBmbiwgaW50IGFyZyk7CiAjZW5kaWYKIAogLyogZXh0ZXJucyAqLwogLyogcGFja2V0ICovCi0JZXh0ZXJuIHVpbnQgcGt0ZnJvbWJ1Zihvc2xfdCAqb3NoLCB2b2lkICpwLCB1aW50IG9mZnNldCwgaW50IGxlbiwKLQkJCSAgICAgICB1bnNpZ25lZCBjaGFyICpidWYpOwotCWV4dGVybiB1aW50IHBrdHNlZ2NudChvc2xfdCAqb3NoLCB2b2lkICpwKTsKLQlleHRlcm4gdWludCBwa3R0b3RsZW4ob3NsX3QgKm9zaCwgdm9pZCAqcCk7CisJZXh0ZXJuIHVpbnQgcGt0ZnJvbWJ1ZihzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc3RydWN0IHNrX2J1ZmYgKnAsCisJCQkgICAgICAgdWludCBvZmZzZXQsIGludCBsZW4sIHVuc2lnbmVkIGNoYXIgKmJ1Zik7CisJZXh0ZXJuIHVpbnQgcGt0dG90bGVuKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBzdHJ1Y3Qgc2tfYnVmZiAqcCk7CiAKIC8qIGV0aGVybmV0IGFkZHJlc3MgKi8KIAlleHRlcm4gaW50IGJjbV9ldGhlcl9hdG9lKGNoYXIgKnAsIHN0cnVjdCBldGhlcl9hZGRyICplYSk7CkBAIC0xNjYsNyArMTY3LDggQEAKIAlleHRlcm4gY2hhciAqZ2V0dmFyKGNoYXIgKnZhcnMsIGNvbnN0IGNoYXIgKm5hbWUpOwogCWV4dGVybiBpbnQgZ2V0aW50dmFyKGNoYXIgKnZhcnMsIGNvbnN0IGNoYXIgKm5hbWUpOwogI2lmZGVmIEJDTURCRwotCWV4dGVybiB2b2lkIHBycGt0KGNvbnN0IGNoYXIgKm1zZywgb3NsX3QgKm9zaCwgdm9pZCAqcDApOworCWV4dGVybiB2b2lkIHBycGt0KGNvbnN0IGNoYXIgKm1zZywgc3RydWN0IG9zbF9pbmZvICpvc2gsCisJCQkgIHN0cnVjdCBza19idWZmICpwMCk7CiAjZW5kaWYJCQkJLyogQkNNREJHICovCiAjZGVmaW5lIGJjbV9wZXJmX2VuYWJsZSgpCiAjZGVmaW5lIGJjbXN0YXRzKGZtdCkKQEAgLTM1OSw3ICszNjEsMjEgQEAKICNkZWZpbmUgQ0VJTCh4LCB5KQkJKCgoeCkgKyAoKHkpLTEpKSAvICh5KSkKICNkZWZpbmUJSVNQT1dFUk9GMih4KQkJKCgoKHgpLTEpJih4KSkgPT0gMCkKIAotLyogYml0IG1hcCByZWxhdGVkIG1hY3JvcyAqLworLyogbWFwIHBoeXNpY2FsIHRvIHZpcnR1YWwgSS9PICovCisjaWYgIWRlZmluZWQoQ09ORklHX01NQ19NU003WDAwQSkKKyNkZWZpbmUgUkVHX01BUChwYSwgc2l6ZSkgICAgICAgaW9yZW1hcF9ub2NhY2hlKCh1bnNpZ25lZCBsb25nKShwYSksIFwKKwkJCQkJKHVuc2lnbmVkIGxvbmcpKHNpemUpKQorI2Vsc2UKKyNkZWZpbmUgUkVHX01BUChwYSwgc2l6ZSkgICAgICAgKHZvaWQgKikoMCkKKyNlbmRpZgorCisvKiBSZWdpc3RlciBvcGVyYXRpb25zICovCisjZGVmaW5lIEFORF9SRUcob3NoLCByLCB2KQlXX1JFRyhvc2gsIChyKSwgUl9SRUcob3NoLCByKSAmICh2KSkKKyNkZWZpbmUgT1JfUkVHKG9zaCwgciwgdikJV19SRUcob3NoLCAociksIFJfUkVHKG9zaCwgcikgfCAodikpCisKKyNkZWZpbmUgU0VUX1JFRyhvc2gsIHIsIG1hc2ssIHZhbCkgXAorCQlXX1JFRygob3NoKSwgKHIpLCAoKFJfUkVHKChvc2gpLCByKSAmIH4obWFzaykpIHwgKHZhbCkpKQorCiAjaWZuZGVmIHNldGJpdAogI2lmbmRlZiBOQkJZCQkJLyogdGhlIEJTRCBmYW1pbHkgZGVmaW5lcyBOQkJZICovCiAjZGVmaW5lCU5CQlkJOAkJLyogOCBiaXRzIHBlciBieXRlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvZDExLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvZDExLmgKaW5kZXggYzA3NTQ4Yy4uYmUyZDQ5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2QxMS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9kMTEuaApAQCAtMTcsMTMgKzE3LDYgQEAKICNpZm5kZWYJX0QxMV9ICiAjZGVmaW5lCV9EMTFfSAogCi0jaW5jbHVkZSA8YmNtZGVmcy5oPgotI2luY2x1ZGUgPGJjbWRldnMuaD4KLSNpbmNsdWRlIDxobmRzb2MuaD4KLSNpbmNsdWRlIDxzYmhuZHBpby5oPgotI2luY2x1ZGUgPHNiaG5kZG1hLmg+Ci0jaW5jbHVkZSA8cHJvdG8vODAyLjExLmg+Ci0KIC8qIFRoaXMgbWFya3MgdGhlIHN0YXJ0IG9mIGEgcGFja2VkIHN0cnVjdHVyZSBzZWN0aW9uLiAqLwogI2luY2x1ZGUgPHBhY2tlZF9zZWN0aW9uX3N0YXJ0Lmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9kYnVzLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvZGJ1cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWZmZWE3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9kYnVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCi0gKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpZm5kZWYgX19EQlVTX0hfXwotI2RlZmluZSBfX0RCVVNfSF9fCi0KLSNpZmRlZiBCQ01EQkcKLSNkZWZpbmUgREJVU0VSUihhcmdzKSAgICAgICAgZG8geyBpZiAobmV0X3JhdGVsaW1pdCgpKSBwcmludGYgYXJnczsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgREJVU1RSQUNFKGFyZ3MpCi0jZGVmaW5lIERCVVNEQkdMT0NLKGFyZ3MpCi0KLSNlbHNlCi0jZGVmaW5lIERCVVNUUkFDRShhcmdzKQotI2RlZmluZSBEQlVTRVJSKGFyZ3MpCi0jZGVmaW5lIERCVVNEQkdMT0NLKGFyZ3MpCi0jZW5kaWYKLQotZW51bSB7Ci0JREJVU19PSyA9IDAsCi0JREJVU19FUlIgPSAtMjAwLAotCURCVVNfRVJSX1RJTUVPVVQsCi0JREJVU19FUlJfRElTQ09OTkVDVCwKLQlEQlVTX0VSUl9OT0RFVklDRSwKLQlEQlVTX0VSUl9VTlNVUFBPUlRFRCwKLQlEQlVTX0VSUl9QRU5ESU5HLAotCURCVVNfRVJSX05PTUVNLAotCURCVVNfRVJSX1RYRkFJTCwKLQlEQlVTX0VSUl9UWFRJTUVPVVQsCi0JREJVU19FUlJfVFhEUk9QLAotCURCVVNfRVJSX1JYRkFJTCwKLQlEQlVTX0VSUl9SWERST1AsCi0JREJVU19FUlJfVFhDVExGQUlMLAotCURCVVNfRVJSX1JYQ1RMRkFJTCwKLQlEQlVTX0VSUl9SRUdfUEFSQU0sCi0JREJVU19TVEFUVVNfQ0FOQ0VMTEVECi19OwotCi0jZGVmaW5lIEVSUl9DQk1BU0tfVFhGQUlMCQkweDAwMDAwMDAxCi0jZGVmaW5lIEVSUl9DQk1BU0tfUlhGQUlMCQkweDAwMDAwMDAyCi0jZGVmaW5lIEVSUl9DQk1BU0tfQUxMCQkJMHhGRkZGRkZGRgotCi0jZGVmaW5lIERCVVNfQ0JDVExfV1JJVEUJCTAKLSNkZWZpbmUgREJVU19DQkNUTF9SRUFECQkJMQotCi0jZGVmaW5lIERCVVNfVFhfUkVUUllfTElNSVQJCTMJLyogcmV0cmllcyBmb3IgZmFpbGVkIHR4aXJiICovCi0jZGVmaW5lIERCVVNfVFhfVElNRU9VVF9JTlRFUlZBTAkyNTAJLyogdGltZW91dCBmb3IgdHhpcmIgY29tcGxldGUsIGluIG1zICovCi0KLSNkZWZpbmUgREJVU19CVUZGRVJfU0laRV9UWAk1MDAwCi0jZGVmaW5lIERCVVNfQlVGRkVSX1NJWkVfUlgJNTAwMAotCi0jZGVmaW5lIERCVVNfQlVGRkVSX1NJWkVfVFhfTk9BR0cJMjA0OAotI2RlZmluZSBEQlVTX0JVRkZFUl9TSVpFX1JYX05PQUdHCTIwNDgKLQotLyogREJVUyB0eXBlcyAqLwotZW51bSB7Ci0JREJVU19VU0IsCi0JREJVU19TRElPLAotCURCVVNfU1BJLAotCURCVVNfVU5LTk9XTgotfTsKLQotZW51bSBkYnVzX3N0YXRlIHsKLQlEQlVTX1NUQVRFX0RMX1BFTkRJTkcsCi0JREJVU19TVEFURV9ETF9ET05FLAotCURCVVNfU1RBVEVfVVAsCi0JREJVU19TVEFURV9ET1dOLAotCURCVVNfU1RBVEVfUE5QX0ZXREwsCi0JREJVU19TVEFURV9ESVNDT05ORUNUCi19OwotCi1lbnVtIGRidXNfcG5wX3N0YXRlIHsKLQlEQlVTX1BOUF9ESVNDT05ORUNULAotCURCVVNfUE5QX1NMRUVQLAotCURCVVNfUE5QX1JFU1VNRQotfTsKLQotdHlwZWRlZiBlbnVtIF9ERVZJQ0VfU1BFRUQgewotCUlOVkFMSURfU1BFRUQgPSAtMSwKLQlMT1dfU1BFRUQgPSAxLAkJLyogVVNCIDEuMTogMS41IE1icHMgKi8KLQlGVUxMX1NQRUVELAkJLyogVVNCIDEuMTogMTIgIE1icHMgKi8KLQlISUdIX1NQRUVELAkJLyogVVNCIDIuMDogNDgwIE1icHMgKi8KLQlTVVBFUl9TUEVFRCwJCS8qIFVTQiAzLjA6IDQuOCBHYnBzICovCi19IERFVklDRV9TUEVFRDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCWludCBidXN0eXBlOwotCWludCB2aWQ7Ci0JaW50IHBpZDsKLQlpbnQgZGV2aWQ7Ci0JaW50IGNoaXByZXY7CQkvKiBjaGlwIHJldnNpb24gbnVtYmVyICovCi0JaW50IG10dTsKLQlpbnQgbmNoYW47CQkvKiBEYXRhIENoYW5uZWxzICovCi19IGRidXNfYXR0cmliX3Q7Ci0KLS8qIEZJWDogQWNjb3VudCBmb3IgZXJyb3JzIHJlbGF0ZWQgdG8gREJVUzsKLSAqIExldCB1cHBlciBsYXllciBhY2NvdW50IGZvciBwYWNrZXRzL2J5dGVzCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLQl1MzIgcnhfZXJyb3JzOwotCXUzMiB0eF9lcnJvcnM7Ci0JdTMyIHJ4X2Ryb3BwZWQ7Ci0JdTMyIHR4X2Ryb3BwZWQ7Ci19IGRidXNfc3RhdHNfdDsKLQotLyoKLSAqIENvbmZpZ3VyYWJsZSBCVVMgcGFyYW1ldGVycwotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0JYm9vbCByeGN0bF9kZWZlcnJlc3BvazsKLX0gZGJ1c19jb25maWdfdDsKLQotc3RydWN0IGRidXNfY2FsbGJhY2tzOwotc3RydWN0IGV4ZWNfcGFybXM7Ci0KLXR5cGVkZWYgdm9pZCAqKCpwcm9iZV9jYl90KSAodm9pZCAqYXJnLCBjb25zdCBjaGFyICpkZXNjLCB1MzIgYnVzdHlwZSwKLQkJCSAgICAgdTMyIGhkcmxlbik7Ci10eXBlZGVmIHZvaWQgKCpkaXNjb25uZWN0X2NiX3QpICh2b2lkICphcmcpOwotdHlwZWRlZiB2b2lkICooKmV4ZWNfY2JfdCkgKHN0cnVjdCBleGVjX3Bhcm1zICphcmdzKTsKLQotLyogQ2xpZW50IGNhbGxiYWNrcyByZWdpc3RlcmVkIGR1cmluZyBkYnVzX2F0dGFjaCgpICovCi10eXBlZGVmIHN0cnVjdCBkYnVzX2NhbGxiYWNrcyB7Ci0Jdm9pZCAoKnNlbmRfY29tcGxldGUpICh2b2lkICpjYmFyZywgdm9pZCAqaW5mbywgaW50IHN0YXR1cyk7Ci0Jdm9pZCAoKnJlY3ZfYnVmKSAodm9pZCAqY2JhcmcsIHU4ICpidWYsIGludCBsZW4pOwotCXZvaWQgKCpyZWN2X3BrdCkgKHZvaWQgKmNiYXJnLCB2b2lkICpwa3QpOwotCXZvaWQgKCp0eGZsb3djb250cm9sKSAodm9pZCAqY2JhcmcsIGJvb2wgb25vZmYpOwotCXZvaWQgKCplcnJoYW5kbGVyKSAodm9pZCAqY2JhcmcsIGludCBlcnIpOwotCXZvaWQgKCpjdGxfY29tcGxldGUpICh2b2lkICpjYmFyZywgaW50IHR5cGUsIGludCBzdGF0dXMpOwotCXZvaWQgKCpzdGF0ZV9jaGFuZ2UpICh2b2lkICpjYmFyZywgaW50IHN0YXRlKTsKLQl2b2lkICooKnBrdGdldCkgKHZvaWQgKmNiYXJnLCB1aW50IGxlbiwgYm9vbCBzZW5kKTsKLQl2b2lkICgqcGt0ZnJlZSkgKHZvaWQgKmNiYXJnLCB2b2lkICpwLCBib29sIHNlbmQpOwotfSBkYnVzX2NhbGxiYWNrc190OwotCi1zdHJ1Y3QgZGJ1c19wdWI7Ci1zdHJ1Y3QgYmNtc3RyYnVmOwotc3RydWN0IGRidXNfaXJiOwotc3RydWN0IGRidXNfaXJiX3J4Owotc3RydWN0IGRidXNfaXJiX3R4Owotc3RydWN0IGRidXNfaW50Zl9jYWxsYmFja3M7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQl2b2lkICooKmF0dGFjaCkgKHN0cnVjdCBkYnVzX3B1YiAqcHViLCB2b2lkICpjYmFyZywKLQkJCSBzdHJ1Y3QgZGJ1c19pbnRmX2NhbGxiYWNrcyAqY2JzKTsKLQl2b2lkICgqZGV0YWNoKSAoc3RydWN0IGRidXNfcHViICpwdWIsIHZvaWQgKmJ1cyk7Ci0KLQlpbnQgKCp1cCkgKHZvaWQgKmJ1cyk7Ci0JaW50ICgqZG93bikgKHZvaWQgKmJ1cyk7Ci0JaW50ICgqc2VuZF9pcmIpICh2b2lkICpidXMsIHN0cnVjdCBkYnVzX2lyYl90eCAqdHhpcmIpOwotCWludCAoKnJlY3ZfaXJiKSAodm9pZCAqYnVzLCBzdHJ1Y3QgZGJ1c19pcmJfcnggKnJ4aXJiKTsKLQlpbnQgKCpjYW5jZWxfaXJiKSAodm9pZCAqYnVzLCBzdHJ1Y3QgZGJ1c19pcmJfdHggKnR4aXJiKTsKLQlpbnQgKCpzZW5kX2N0bCkgKHZvaWQgKmJ1cywgdTggKmJ1ZiwgaW50IGxlbik7Ci0JaW50ICgqcmVjdl9jdGwpICh2b2lkICpidXMsIHU4ICpidWYsIGludCBsZW4pOwotCWludCAoKmdldF9zdGF0cykgKHZvaWQgKmJ1cywgZGJ1c19zdGF0c190ICpzdGF0cyk7Ci0JaW50ICgqZ2V0X2F0dHJpYikgKHZvaWQgKmJ1cywgZGJ1c19hdHRyaWJfdCAqYXR0cmliKTsKLQotCWludCAoKnBucCkgKHZvaWQgKmJ1cywgaW50IGV2ZW50KTsKLQlpbnQgKCpyZW1vdmUpICh2b2lkICpidXMpOwotCWludCAoKnJlc3VtZSkgKHZvaWQgKmJ1cyk7Ci0JaW50ICgqc3VzcGVuZCkgKHZvaWQgKmJ1cyk7Ci0JaW50ICgqc3RvcCkgKHZvaWQgKmJ1cyk7Ci0JaW50ICgqcmVzZXQpICh2b2lkICpidXMpOwotCi0JLyogQWNjZXNzIHRvIGJ1cyBidWZmZXJzIGRpcmVjdGx5ICovCi0Jdm9pZCAqKCpwa3RnZXQpICh2b2lkICpidXMsIGludCBsZW4pOwotCXZvaWQgKCpwa3RmcmVlKSAodm9pZCAqYnVzLCB2b2lkICpwa3QpOwotCi0JaW50ICgqaW92YXJfb3ApICh2b2lkICpidXMsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKnBhcmFtcywgaW50IHBsZW4sCi0JCQkgdm9pZCAqYXJnLCBpbnQgbGVuLCBib29sIHNldCk7Ci0Jdm9pZCAoKmR1bXApICh2b2lkICpidXMsIHN0cnVjdCBiY21zdHJidWYgKnN0cmJ1Zik7Ci0JaW50ICgqc2V0X2NvbmZpZykgKHZvaWQgKmJ1cywgZGJ1c19jb25maWdfdCAqY29uZmlnKTsKLQlpbnQgKCpnZXRfY29uZmlnKSAodm9pZCAqYnVzLCBkYnVzX2NvbmZpZ190ICpjb25maWcpOwotCi0JIGJvb2woKmRldmljZV9leGlzdHMpICh2b2lkICpidXMpOwotCSBib29sKCpkbG5lZWRlZCkgKHZvaWQgKmJ1cyk7Ci0JaW50ICgqZGxzdGFydCkgKHZvaWQgKmJ1cywgdTggKmZ3LCBpbnQgbGVuKTsKLQlpbnQgKCpkbHJ1bikgKHZvaWQgKmJ1cyk7Ci0JIGJvb2woKnJlY3ZfbmVlZGVkKSAodm9pZCAqYnVzKTsKLQotCXZvaWQgKigqZXhlY19yeGxvY2spICh2b2lkICpidXMsIGV4ZWNfY2JfdCBmdW5jLAotCQkJICAgICAgc3RydWN0IGV4ZWNfcGFybXMgKmFyZ3MpOwotCXZvaWQgKigqZXhlY190eGxvY2spICh2b2lkICpidXMsIGV4ZWNfY2JfdCBmdW5jLAotCQkJICAgICAgc3RydWN0IGV4ZWNfcGFybXMgKmFyZ3MpOwotCi0JaW50ICgqdHhfdGltZXJfaW5pdCkgKHZvaWQgKmJ1cyk7Ci0JaW50ICgqdHhfdGltZXJfc3RhcnQpICh2b2lkICpidXMsIHVpbnQgdGltZW91dCk7Ci0JaW50ICgqdHhfdGltZXJfc3RvcCkgKHZvaWQgKmJ1cyk7Ci0KLQlpbnQgKCpzY2hlZF9kcGMpICh2b2lkICpidXMpOwotCWludCAoKmxvY2spICh2b2lkICpidXMpOwotCWludCAoKnVubG9jaykgKHZvaWQgKmJ1cyk7Ci0JaW50ICgqc2NoZWRfcHJvYmVfY2IpICh2b2lkICpidXMpOwotCi0JaW50ICgqc2h1dGRvd24pICh2b2lkICpidXMpOwotCi0JaW50ICgqcmVjdl9zdG9wKSAodm9pZCAqYnVzKTsKLQlpbnQgKCpyZWN2X3Jlc3VtZSkgKHZvaWQgKmJ1cyk7Ci0KLQkvKiBBZGQgZnJvbSB0aGUgYm90dG9tICovCi19IGRidXNfaW50Zl90OwotCi10eXBlZGVmIHN0cnVjdCBkYnVzX3B1YiB7Ci0Jc3RydWN0IG9zbF9pbmZvICpvc2g7Ci0JZGJ1c19zdGF0c190IHN0YXRzOwotCWRidXNfYXR0cmliX3QgYXR0cmliOwotCWVudW0gZGJ1c19zdGF0ZSBidXNzdGF0ZTsKLQlERVZJQ0VfU1BFRUQgZGV2aWNlX3NwZWVkOwotCWludCBudHhxLCBucnhxLCByeHNpemU7Ci0Jdm9pZCAqYnVzOwotCXN0cnVjdCBzaGFyZWRfaW5mbyAqc2g7Ci19IGRidXNfcHViX3Q7Ci0KLSNkZWZpbmUgQlVTX0lORk8oYnVzLCB0eXBlKSAoKCh0eXBlICopIGJ1cyktPnB1Yi0+YnVzKQotCi0vKgotICogUHVibGljIEJ1cyBGdW5jdGlvbiBJbnRlcmZhY2UKLSAqLwotZXh0ZXJuIGludCBkYnVzX3JlZ2lzdGVyKGludCB2aWQsIGludCBwaWQsIHByb2JlX2NiX3QgcHJjYiwKLQkJCSBkaXNjb25uZWN0X2NiX3QgZGlzY2IsIHZvaWQgKnByYXJnLCB2b2lkICpwYXJhbTEsCi0JCQkgdm9pZCAqcGFyYW0yKTsKLWV4dGVybiBpbnQgZGJ1c19kZXJlZ2lzdGVyKHZvaWQpOwotCi1leHRlcm4gY29uc3QgZGJ1c19wdWJfdCAqZGJ1c19hdHRhY2goc3RydWN0IG9zbF9pbmZvICpvc2gsIGludCByeHNpemUsIGludCBucnhxLAotCQkJCSAgICAgaW50IG50eHEsIHZvaWQgKmNiYXJnLAotCQkJCSAgICAgZGJ1c19jYWxsYmFja3NfdCAqY2JzLAotCQkJCSAgICAgc3RydWN0IHNoYXJlZF9pbmZvICpzaCk7Ci1leHRlcm4gdm9pZCBkYnVzX2RldGFjaChjb25zdCBkYnVzX3B1Yl90ICpwdWIpOwotCi1leHRlcm4gaW50IGRidXNfdXAoY29uc3QgZGJ1c19wdWJfdCAqcHViKTsKLWV4dGVybiBpbnQgZGJ1c19kb3duKGNvbnN0IGRidXNfcHViX3QgKnB1Yik7Ci1leHRlcm4gaW50IGRidXNfc3RvcChjb25zdCBkYnVzX3B1Yl90ICpwdWIpOwotZXh0ZXJuIGludCBkYnVzX3NodXRkb3duKGNvbnN0IGRidXNfcHViX3QgKnB1Yik7Ci1leHRlcm4gdm9pZCBkYnVzX2Zsb3djdHJsX3J4KGNvbnN0IGRidXNfcHViX3QgKnB1YiwgYm9vbCBvbik7Ci0KLWV4dGVybiBpbnQgZGJ1c19zZW5kX2J1Zihjb25zdCBkYnVzX3B1Yl90ICpwdWIsIHU4ICpidWYsIGludCBsZW4sCi0JCQkgdm9pZCAqaW5mbyk7Ci1leHRlcm4gaW50IGRidXNfc2VuZF9wa3QoY29uc3QgZGJ1c19wdWJfdCAqcHViLCB2b2lkICpwa3QsIHZvaWQgKmluZm8pOwotZXh0ZXJuIGludCBkYnVzX3NlbmRfY3RsKGNvbnN0IGRidXNfcHViX3QgKnB1YiwgdTggKmJ1ZiwgaW50IGxlbik7Ci1leHRlcm4gaW50IGRidXNfcmVjdl9jdGwoY29uc3QgZGJ1c19wdWJfdCAqcHViLCB1OCAqYnVmLCBpbnQgbGVuKTsKLQotZXh0ZXJuIGludCBkYnVzX2dldF9zdGF0cyhjb25zdCBkYnVzX3B1Yl90ICpwdWIsIGRidXNfc3RhdHNfdCAqc3RhdHMpOwotZXh0ZXJuIGludCBkYnVzX2dldF9hdHRyaWIoY29uc3QgZGJ1c19wdWJfdCAqcHViLCBkYnVzX2F0dHJpYl90ICphdHRyaWIpOwotZXh0ZXJuIGludCBkYnVzX2dldF9kZXZpY2Vfc3BlZWQoY29uc3QgZGJ1c19wdWJfdCAqcHViKTsKLWV4dGVybiBpbnQgZGJ1c19zZXRfY29uZmlnKGNvbnN0IGRidXNfcHViX3QgKnB1YiwgZGJ1c19jb25maWdfdCAqY29uZmlnKTsKLWV4dGVybiBpbnQgZGJ1c19nZXRfY29uZmlnKGNvbnN0IGRidXNfcHViX3QgKnB1YiwgZGJ1c19jb25maWdfdCAqY29uZmlnKTsKLQotZXh0ZXJuIHZvaWQgKmRidXNfcGt0Z2V0KGNvbnN0IGRidXNfcHViX3QgKnB1YiwgaW50IGxlbik7Ci1leHRlcm4gdm9pZCBkYnVzX3BrdGZyZWUoY29uc3QgZGJ1c19wdWJfdCAqcHViLCB2b2lkICpwa3QpOwotCi1leHRlcm4gaW50IGRidXNfc2V0X2Vycm1hc2soY29uc3QgZGJ1c19wdWJfdCAqcHViLCB1MzIgbWFzayk7Ci1leHRlcm4gaW50IGRidXNfcG5wX3NsZWVwKGNvbnN0IGRidXNfcHViX3QgKnB1Yik7Ci1leHRlcm4gaW50IGRidXNfcG5wX3Jlc3VtZShjb25zdCBkYnVzX3B1Yl90ICpwdWIsIGludCAqZndfcmVsb2FkKTsKLWV4dGVybiBpbnQgZGJ1c19wbnBfZGlzY29ubmVjdChjb25zdCBkYnVzX3B1Yl90ICpwdWIpOwotCi1leHRlcm4gaW50IGRidXNfaW92YXJfb3AoY29uc3QgZGJ1c19wdWJfdCAqcHViLCBjb25zdCBjaGFyICpuYW1lLAotCQkJIHZvaWQgKnBhcmFtcywgaW50IHBsZW4sIHZvaWQgKmFyZywgaW50IGxlbiwgYm9vbCBzZXQpOwotI2lmZGVmIEJDTURCRwotZXh0ZXJuIHZvaWQgZGJ1c19oaXN0X2R1bXAoY29uc3QgZGJ1c19wdWJfdCAqcHViLCBzdHJ1Y3QgYmNtc3RyYnVmICpiKTsKLSNlbmRpZgkJCQkvKiBCQ01EQkcgKi8KLS8qCi0gKiBQcml2YXRlIENvbW1vbiBCdXMgSW50ZXJmYWNlCi0gKi8KLQotLyogSU8gUmVxdWVzdCBCbG9jayAoSVJCKSAqLwotdHlwZWRlZiBzdHJ1Y3QgZGJ1c19pcmIgewotCXN0cnVjdCBkYnVzX2lyYiAqbmV4dDsJLyogaXQncyBjYXN0ZWQgZnJvbSBkYnVzX2lyYl90eCBvciBkYnVzX2lyYl9yeCBzdHJ1Y3QgKi8KLX0gZGJ1c19pcmJfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgZGJ1c19pcmJfcnggewotCXN0cnVjdCBkYnVzX2lyYiBpcmI7CS8qIE11c3QgYmUgZmlyc3QgKi8KLQl1OCAqYnVmOwotCWludCBidWZfbGVuOwotCWludCBhY3R1YWxfbGVuOwotCXZvaWQgKnBrdDsKLQl2b2lkICppbmZvOwotCXZvaWQgKmFyZzsKLX0gZGJ1c19pcmJfcnhfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgZGJ1c19pcmJfdHggewotCXN0cnVjdCBkYnVzX2lyYiBpcmI7CS8qIE11c3QgYmUgZmlyc3QgKi8KLQl1OCAqYnVmOwotCWludCBsZW47Ci0Jdm9pZCAqcGt0OwotCWludCByZXRyeV9jb3VudDsKLQl2b2lkICppbmZvOwotCXZvaWQgKmFyZzsKLX0gZGJ1c19pcmJfdHhfdDsKLQotLyogREJVUyBpbnRlcmZhY2UgY2FsbGJhY2tzIGFyZSBkaWZmZXJlbnQgZnJvbSB1c2VyIGNhbGxiYWNrcwotICogc28sIGludGVybmFsbHksIGRpZmZlcmVudCBpbmZvIGNhbiBiZSBwYXNzZWQgdG8gdXBwZXIgbGF5ZXIKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgZGJ1c19pbnRmX2NhbGxiYWNrcyB7Ci0Jdm9pZCAoKnNlbmRfaXJiX3RpbWVvdXQpICh2b2lkICpjYmFyZywgZGJ1c19pcmJfdHhfdCAqdHhpcmIpOwotCXZvaWQgKCpzZW5kX2lyYl9jb21wbGV0ZSkgKHZvaWQgKmNiYXJnLCBkYnVzX2lyYl90eF90ICp0eGlyYiwKLQkJCQkgICBpbnQgc3RhdHVzKTsKLQl2b2lkICgqcmVjdl9pcmJfY29tcGxldGUpICh2b2lkICpjYmFyZywgZGJ1c19pcmJfcnhfdCAqcnhpcmIsCi0JCQkJICAgaW50IHN0YXR1cyk7Ci0Jdm9pZCAoKmVycmhhbmRsZXIpICh2b2lkICpjYmFyZywgaW50IGVycik7Ci0Jdm9pZCAoKmN0bF9jb21wbGV0ZSkgKHZvaWQgKmNiYXJnLCBpbnQgdHlwZSwgaW50IHN0YXR1cyk7Ci0Jdm9pZCAoKnN0YXRlX2NoYW5nZSkgKHZvaWQgKmNiYXJnLCBpbnQgc3RhdGUpOwotCSBib29sKCppc3IpICh2b2lkICpjYmFyZywgYm9vbCAqd2FudGRwYyk7Ci0JIGJvb2woKmRwYykgKHZvaWQgKmNiYXJnLCBib29sIGJvdW5kZWQpOwotCXZvaWQgKCp3YXRjaGRvZykgKHZvaWQgKmNiYXJnKTsKLQl2b2lkICooKnBrdGdldCkgKHZvaWQgKmNiYXJnLCB1aW50IGxlbiwgYm9vbCBzZW5kKTsKLQl2b2lkICgqcGt0ZnJlZSkgKHZvaWQgKmNiYXJnLCB2b2lkICpwLCBib29sIHNlbmQpOwotCXN0cnVjdCBkYnVzX2lyYiAqKCpnZXRpcmIpICh2b2lkICpjYmFyZywgYm9vbCBzZW5kKTsKLQl2b2lkICgqcnhlcnJfaW5kaWNhdGUpICh2b2lkICpjYmFyZywgYm9vbCBvbik7Ci19IGRidXNfaW50Zl9jYWxsYmFja3NfdDsKLQotLyoKLSAqIFBvcnRpbmc6IFRvIHN1cHBvcnQgbmV3IGJ1cywgcG9ydCB0aGVzZSBmdW5jdGlvbnMgYmVsb3cKLSAqLwotCi0vKgotICogQnVzIHNwZWNpZmljIEludGVyZmFjZQotICogSW1wbGVtZW50ZWQgYnkgZGJ1c191c2IuYy9kYnVzX3NkaW8uYwotICovCi1leHRlcm4gaW50IGRidXNfYnVzX3JlZ2lzdGVyKGludCB2aWQsIGludCBwaWQsIHByb2JlX2NiX3QgcHJjYiwKLQkJCSAgICAgZGlzY29ubmVjdF9jYl90IGRpc2NiLCB2b2lkICpwcmFyZywKLQkJCSAgICAgZGJ1c19pbnRmX3QgKippbnRmLCB2b2lkICpwYXJhbTEsIHZvaWQgKnBhcmFtMik7Ci1leHRlcm4gaW50IGRidXNfYnVzX2RlcmVnaXN0ZXIodm9pZCk7Ci0KLS8qCi0gKiBCdXMtc3BlY2lmaWMgYW5kIE9TLXNwZWNpZmljIEludGVyZmFjZQotICogSW1wbGVtZW50ZWQgYnkgZGJ1c191c2JfW2xpbnV4L25kaXNdLmMvZGJ1c19zZGlvX1tsaW51eC9uZGlzXS5jCi0gKi8KLWV4dGVybiBpbnQgZGJ1c19idXNfb3NsX3JlZ2lzdGVyKGludCB2aWQsIGludCBwaWQsIHByb2JlX2NiX3QgcHJjYiwKLQkJCQkgZGlzY29ubmVjdF9jYl90IGRpc2NiLCB2b2lkICpwcmFyZywKLQkJCQkgZGJ1c19pbnRmX3QgKippbnRmLCB2b2lkICpwYXJhbTEsCi0JCQkJIHZvaWQgKnBhcmFtMik7Ci1leHRlcm4gaW50IGRidXNfYnVzX29zbF9kZXJlZ2lzdGVyKHZvaWQpOwotCi0vKgotICogQnVzLXNwZWNpZmljLCBPUy1zcGVjaWZpYywgSFctc3BlY2lmaWMgSW50ZXJmYWNlCi0gKiBNYWlubHkgZm9yIFNESU8gSG9zdCBIVyBjb250cm9sbGVyCi0gKi8KLWV4dGVybiBpbnQgZGJ1c19idXNfb3NsX2h3X3JlZ2lzdGVyKGludCB2aWQsIGludCBwaWQsIHByb2JlX2NiX3QgcHJjYiwKLQkJCQkgICAgZGlzY29ubmVjdF9jYl90IGRpc2NiLCB2b2lkICpwcmFyZywKLQkJCQkgICAgZGJ1c19pbnRmX3QgKippbnRmKTsKLWV4dGVybiBpbnQgZGJ1c19idXNfb3NsX2h3X2RlcmVnaXN0ZXIodm9pZCk7Ci0KLSNlbmRpZgkJCQkvKiBfX0RCVVNfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvZXBpdmVycy5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2VwaXZlcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU2YjUxOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvZXBpdmVycy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCi0gKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpZm5kZWYgX2VwaXZlcnNfaF8KLSNkZWZpbmUgX2VwaXZlcnNfaF8KLQotI2RlZmluZQlFUElfTUFKT1JfVkVSU0lPTgk1Ci0KLSNkZWZpbmUJRVBJX01JTk9SX1ZFUlNJT04JNzUKLQotI2RlZmluZQlFUElfUkNfTlVNQkVSCQkxMQotCi0jZGVmaW5lCUVQSV9JTkNSRU1FTlRBTF9OVU1CRVIJMAotCi0jZGVmaW5lIEVQSV9CVUlMRF9OVU1CRVIJMQotCi0jZGVmaW5lCUVQSV9WRVJTSU9OCQl7IDUsIDc1LCAxMSwgMCB9Ci0KLSNpZmRlZiBCQ01TRElPCi0vKiBFUElfVkVSU0lPTl9OVU0gbXVzdCBtYXRjaCBGVyB2ZXJzaW9uICovCi0jZGVmaW5lCUVQSV9WRVJTSU9OX05VTQkJMHgwNTRiMGMwMAotI2Vsc2UKLSNkZWZpbmUJRVBJX1ZFUlNJT05fTlVNCQkweDA1NGIwYjAwCi0jZW5kaWYKLQotI2RlZmluZSBFUElfVkVSU0lPTl9ERVYJCTUuNzUuMTEKLQotLyogRHJpdmVyIFZlcnNpb24gU3RyaW5nLCBBU0NJSSwgMzIgY2hhcnMgbWF4ICovCi0jZGVmaW5lCUVQSV9WRVJTSU9OX1NUUgkJIjUuNzUuMTEiCi0KLSNlbmRpZgkJCQkvKiBfZXBpdmVyc19oXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2huZGRtYS5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2huZGRtYS5oCmluZGV4IGJlZTRjODkuLjRjNTQ2MmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9obmRkbWEuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvaG5kZG1hLmgKQEAgLTE5LDcgKzE5LDcgQEAKIAogI2lmbmRlZiBfaG5kZG1hX3B1Yl8KICNkZWZpbmUgX2huZGRtYV9wdWJfCi10eXBlZGVmIGNvbnN0IHN0cnVjdCBobmRkbWFfcHViIGhuZGRtYV90Oworc3RydWN0IGhuZGRtYV9wdWI7CiAjZW5kaWYJCQkJLyogX2huZGRtYV9wdWJfICovCiAKIC8qIHJhbmdlIHBhcmFtIGZvciBkbWFfZ2V0bmV4dHR4cCgpIGFuZCBkbWFfdHhyZWNsYWltICovCkBAIC0zMCw1MiArMzAsNTQgQEAKIH0gdHhkX3JhbmdlX3Q7CiAKIC8qIGRtYSBmdW5jdGlvbiB0eXBlICovCi10eXBlZGVmIHZvaWQgKCpkaV9kZXRhY2hfdCkgKGhuZGRtYV90ICpkbWFoKTsKLXR5cGVkZWYgYm9vbCgqZGlfdHhyZXNldF90KSAoaG5kZG1hX3QgKmRtYWgpOwotdHlwZWRlZiBib29sKCpkaV9yeHJlc2V0X3QpIChobmRkbWFfdCAqZG1haCk7Ci10eXBlZGVmIGJvb2woKmRpX3J4aWRsZV90KSAoaG5kZG1hX3QgKmRtYWgpOwotdHlwZWRlZiB2b2lkICgqZGlfdHhpbml0X3QpIChobmRkbWFfdCAqZG1haCk7Ci10eXBlZGVmIGJvb2woKmRpX3R4ZW5hYmxlZF90KSAoaG5kZG1hX3QgKmRtYWgpOwotdHlwZWRlZiB2b2lkICgqZGlfcnhpbml0X3QpIChobmRkbWFfdCAqZG1haCk7Ci10eXBlZGVmIHZvaWQgKCpkaV90eHN1c3BlbmRfdCkgKGhuZGRtYV90ICpkbWFoKTsKLXR5cGVkZWYgdm9pZCAoKmRpX3R4cmVzdW1lX3QpIChobmRkbWFfdCAqZG1haCk7Ci10eXBlZGVmIGJvb2woKmRpX3R4c3VzcGVuZGVkX3QpIChobmRkbWFfdCAqZG1haCk7Ci10eXBlZGVmIGJvb2woKmRpX3R4c3VzcGVuZGVkaWRsZV90KSAoaG5kZG1hX3QgKmRtYWgpOwotdHlwZWRlZiBpbnQgKCpkaV90eGZhc3RfdCkgKGhuZGRtYV90ICpkbWFoLCB2b2lkICpwLCBib29sIGNvbW1pdCk7Ci10eXBlZGVmIGludCAoKmRpX3R4dW5mcmFtZWRfdCkgKGhuZGRtYV90ICpkbWFoLCB2b2lkICpwLCB1aW50IGxlbiwKK3R5cGVkZWYgdm9pZCAoKmRpX2RldGFjaF90KSAoc3RydWN0IGhuZGRtYV9wdWIgKmRtYWgpOwordHlwZWRlZiBib29sKCpkaV90eHJlc2V0X3QpIChzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1haCk7Cit0eXBlZGVmIGJvb2woKmRpX3J4cmVzZXRfdCkgKHN0cnVjdCBobmRkbWFfcHViICpkbWFoKTsKK3R5cGVkZWYgYm9vbCgqZGlfcnhpZGxlX3QpIChzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1haCk7Cit0eXBlZGVmIHZvaWQgKCpkaV90eGluaXRfdCkgKHN0cnVjdCBobmRkbWFfcHViICpkbWFoKTsKK3R5cGVkZWYgYm9vbCgqZGlfdHhlbmFibGVkX3QpIChzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1haCk7Cit0eXBlZGVmIHZvaWQgKCpkaV9yeGluaXRfdCkgKHN0cnVjdCBobmRkbWFfcHViICpkbWFoKTsKK3R5cGVkZWYgdm9pZCAoKmRpX3R4c3VzcGVuZF90KSAoc3RydWN0IGhuZGRtYV9wdWIgKmRtYWgpOwordHlwZWRlZiB2b2lkICgqZGlfdHhyZXN1bWVfdCkgKHN0cnVjdCBobmRkbWFfcHViICpkbWFoKTsKK3R5cGVkZWYgYm9vbCgqZGlfdHhzdXNwZW5kZWRfdCkgKHN0cnVjdCBobmRkbWFfcHViICpkbWFoKTsKK3R5cGVkZWYgYm9vbCgqZGlfdHhzdXNwZW5kZWRpZGxlX3QpIChzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1haCk7Cit0eXBlZGVmIGludCAoKmRpX3R4ZmFzdF90KSAoc3RydWN0IGhuZGRtYV9wdWIgKmRtYWgsIHN0cnVjdCBza19idWZmICpwLAorCQkJICAgIGJvb2wgY29tbWl0KTsKK3R5cGVkZWYgaW50ICgqZGlfdHh1bmZyYW1lZF90KSAoc3RydWN0IGhuZGRtYV9wdWIgKmRtYWgsIHZvaWQgKnAsIHVpbnQgbGVuLAogCQkJCWJvb2wgY29tbWl0KTsKLXR5cGVkZWYgdm9pZCAqKCpkaV9nZXRwb3NfdCkgKGhuZGRtYV90ICpkaSwgYm9vbCBkaXJlY3Rpb24pOwotdHlwZWRlZiB2b2lkICgqZGlfZmlmb2xvb3BiYWNrZW5hYmxlX3QpIChobmRkbWFfdCAqZG1haCk7Ci10eXBlZGVmIGJvb2woKmRpX3R4c3RvcHBlZF90KSAoaG5kZG1hX3QgKmRtYWgpOwotdHlwZWRlZiBib29sKCpkaV9yeHN0b3BwZWRfdCkgKGhuZGRtYV90ICpkbWFoKTsKLXR5cGVkZWYgYm9vbCgqZGlfcnhlbmFibGVfdCkgKGhuZGRtYV90ICpkbWFoKTsKLXR5cGVkZWYgYm9vbCgqZGlfcnhlbmFibGVkX3QpIChobmRkbWFfdCAqZG1haCk7Ci10eXBlZGVmIHZvaWQgKigqZGlfcnhfdCkgKGhuZGRtYV90ICpkbWFoKTsKLXR5cGVkZWYgYm9vbCgqZGlfcnhmaWxsX3QpIChobmRkbWFfdCAqZG1haCk7Ci10eXBlZGVmIHZvaWQgKCpkaV90eHJlY2xhaW1fdCkgKGhuZGRtYV90ICpkbWFoLCB0eGRfcmFuZ2VfdCByYW5nZSk7Ci10eXBlZGVmIHZvaWQgKCpkaV9yeHJlY2xhaW1fdCkgKGhuZGRtYV90ICpkbWFoKTsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyAoKmRpX2dldHZhcl90KSAoaG5kZG1hX3QgKmRtYWgsIGNvbnN0IGNoYXIgKm5hbWUpOwotdHlwZWRlZiB2b2lkICooKmRpX2dldG5leHR0eHBfdCkgKGhuZGRtYV90ICpkbWFoLCB0eGRfcmFuZ2VfdCByYW5nZSk7Ci10eXBlZGVmIHZvaWQgKigqZGlfZ2V0bmV4dHJ4cF90KSAoaG5kZG1hX3QgKmRtYWgsIGJvb2wgZm9yY2VhbGwpOwotdHlwZWRlZiB2b2lkICooKmRpX3BlZWtuZXh0dHhwX3QpIChobmRkbWFfdCAqZG1haCk7Ci10eXBlZGVmIHZvaWQgKigqZGlfcGVla25leHRyeHBfdCkgKGhuZGRtYV90ICpkbWFoKTsKLXR5cGVkZWYgdm9pZCAoKmRpX3J4cGFyYW1fZ2V0X3QpIChobmRkbWFfdCAqZG1haCwgdTE2ICpyeG9mZnNldCwKK3R5cGVkZWYgdm9pZCAqKCpkaV9nZXRwb3NfdCkgKHN0cnVjdCBobmRkbWFfcHViICpkaSwgYm9vbCBkaXJlY3Rpb24pOwordHlwZWRlZiB2b2lkICgqZGlfZmlmb2xvb3BiYWNrZW5hYmxlX3QpIChzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1haCk7Cit0eXBlZGVmIGJvb2woKmRpX3R4c3RvcHBlZF90KSAoc3RydWN0IGhuZGRtYV9wdWIgKmRtYWgpOwordHlwZWRlZiBib29sKCpkaV9yeHN0b3BwZWRfdCkgKHN0cnVjdCBobmRkbWFfcHViICpkbWFoKTsKK3R5cGVkZWYgYm9vbCgqZGlfcnhlbmFibGVfdCkgKHN0cnVjdCBobmRkbWFfcHViICpkbWFoKTsKK3R5cGVkZWYgYm9vbCgqZGlfcnhlbmFibGVkX3QpIChzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1haCk7Cit0eXBlZGVmIHZvaWQgKigqZGlfcnhfdCkgKHN0cnVjdCBobmRkbWFfcHViICpkbWFoKTsKK3R5cGVkZWYgYm9vbCgqZGlfcnhmaWxsX3QpIChzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1haCk7Cit0eXBlZGVmIHZvaWQgKCpkaV90eHJlY2xhaW1fdCkgKHN0cnVjdCBobmRkbWFfcHViICpkbWFoLCB0eGRfcmFuZ2VfdCByYW5nZSk7Cit0eXBlZGVmIHZvaWQgKCpkaV9yeHJlY2xhaW1fdCkgKHN0cnVjdCBobmRkbWFfcHViICpkbWFoKTsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAoKmRpX2dldHZhcl90KSAoc3RydWN0IGhuZGRtYV9wdWIgKmRtYWgsCisJCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSk7Cit0eXBlZGVmIHZvaWQgKigqZGlfZ2V0bmV4dHR4cF90KSAoc3RydWN0IGhuZGRtYV9wdWIgKmRtYWgsIHR4ZF9yYW5nZV90IHJhbmdlKTsKK3R5cGVkZWYgdm9pZCAqKCpkaV9nZXRuZXh0cnhwX3QpIChzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1haCwgYm9vbCBmb3JjZWFsbCk7Cit0eXBlZGVmIHZvaWQgKigqZGlfcGVla25leHR0eHBfdCkgKHN0cnVjdCBobmRkbWFfcHViICpkbWFoKTsKK3R5cGVkZWYgdm9pZCAqKCpkaV9wZWVrbmV4dHJ4cF90KSAoc3RydWN0IGhuZGRtYV9wdWIgKmRtYWgpOwordHlwZWRlZiB2b2lkICgqZGlfcnhwYXJhbV9nZXRfdCkgKHN0cnVjdCBobmRkbWFfcHViICpkbWFoLCB1MTYgKnJ4b2Zmc2V0LAogCQkJCSAgdTE2ICpyeGJ1ZnNpemUpOwotdHlwZWRlZiB2b2lkICgqZGlfdHhibG9ja190KSAoaG5kZG1hX3QgKmRtYWgpOwotdHlwZWRlZiB2b2lkICgqZGlfdHh1bmJsb2NrX3QpIChobmRkbWFfdCAqZG1haCk7Ci10eXBlZGVmIHVpbnQoKmRpX3R4YWN0aXZlX3QpIChobmRkbWFfdCAqZG1haCk7Ci10eXBlZGVmIHZvaWQgKCpkaV90eHJvdGF0ZV90KSAoaG5kZG1hX3QgKmRtYWgpOwotdHlwZWRlZiB2b2lkICgqZGlfY291bnRlcnJlc2V0X3QpIChobmRkbWFfdCAqZG1haCk7Ci10eXBlZGVmIHVpbnQoKmRpX2N0cmxmbGFnc190KSAoaG5kZG1hX3QgKmRtYWgsIHVpbnQgbWFzaywgdWludCBmbGFncyk7Ci10eXBlZGVmIGNoYXIgKigqZGlfZHVtcF90KSAoaG5kZG1hX3QgKmRtYWgsIHN0cnVjdCBiY21zdHJidWYgKmIsCit0eXBlZGVmIHZvaWQgKCpkaV90eGJsb2NrX3QpIChzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1haCk7Cit0eXBlZGVmIHZvaWQgKCpkaV90eHVuYmxvY2tfdCkgKHN0cnVjdCBobmRkbWFfcHViICpkbWFoKTsKK3R5cGVkZWYgdWludCgqZGlfdHhhY3RpdmVfdCkgKHN0cnVjdCBobmRkbWFfcHViICpkbWFoKTsKK3R5cGVkZWYgdm9pZCAoKmRpX3R4cm90YXRlX3QpIChzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1haCk7Cit0eXBlZGVmIHZvaWQgKCpkaV9jb3VudGVycmVzZXRfdCkgKHN0cnVjdCBobmRkbWFfcHViICpkbWFoKTsKK3R5cGVkZWYgdWludCgqZGlfY3RybGZsYWdzX3QpIChzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1haCwgdWludCBtYXNrLCB1aW50IGZsYWdzKTsKK3R5cGVkZWYgY2hhciAqKCpkaV9kdW1wX3QpIChzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1haCwgc3RydWN0IGJjbXN0cmJ1ZiAqYiwKIAkJCSAgICBib29sIGR1bXByaW5nKTsKLXR5cGVkZWYgY2hhciAqKCpkaV9kdW1wdHhfdCkgKGhuZGRtYV90ICpkbWFoLCBzdHJ1Y3QgYmNtc3RyYnVmICpiLAordHlwZWRlZiBjaGFyICooKmRpX2R1bXB0eF90KSAoc3RydWN0IGhuZGRtYV9wdWIgKmRtYWgsIHN0cnVjdCBiY21zdHJidWYgKmIsCiAJCQkgICAgICBib29sIGR1bXByaW5nKTsKLXR5cGVkZWYgY2hhciAqKCpkaV9kdW1wcnhfdCkgKGhuZGRtYV90ICpkbWFoLCBzdHJ1Y3QgYmNtc3RyYnVmICpiLAordHlwZWRlZiBjaGFyICooKmRpX2R1bXByeF90KSAoc3RydWN0IGhuZGRtYV9wdWIgKmRtYWgsIHN0cnVjdCBiY21zdHJidWYgKmIsCiAJCQkgICAgICBib29sIGR1bXByaW5nKTsKLXR5cGVkZWYgdWludCgqZGlfcnhhY3RpdmVfdCkgKGhuZGRtYV90ICpkbWFoKTsKLXR5cGVkZWYgdWludCgqZGlfdHhwZW5kaW5nX3QpIChobmRkbWFfdCAqZG1haCk7Ci10eXBlZGVmIHVpbnQoKmRpX3R4Y29tbWl0dGVkX3QpIChobmRkbWFfdCAqZG1haCk7Cit0eXBlZGVmIHVpbnQoKmRpX3J4YWN0aXZlX3QpIChzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1haCk7Cit0eXBlZGVmIHVpbnQoKmRpX3R4cGVuZGluZ190KSAoc3RydWN0IGhuZGRtYV9wdWIgKmRtYWgpOwordHlwZWRlZiB1aW50KCpkaV90eGNvbW1pdHRlZF90KSAoc3RydWN0IGhuZGRtYV9wdWIgKmRtYWgpOwogCiAvKiBkbWEgb3BzdmVjICovCiB0eXBlZGVmIHN0cnVjdCBkaV9mY25fcyB7CkBAIC0xNDEsNyArMTQzLDggQEAKIAl1aW50IHR4bm9idWY7CQkvKiB0eCBvdXQgb2YgZG1hIGRlc2NyaXB0b3JzICovCiB9OwogCi1leHRlcm4gaG5kZG1hX3QgKmRtYV9hdHRhY2gob3NsX3QgKm9zaCwgY2hhciAqbmFtZSwgc2lfdCAqc2loLAorZXh0ZXJuIHN0cnVjdCBobmRkbWFfcHViICpkbWFfYXR0YWNoKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBjaGFyICpuYW1lLAorCQkJICAgIHNpX3QgKnNpaCwKIAkJCSAgICB2b2lkICpkbWFyZWdzdHgsIHZvaWQgKmRtYXJlZ3NyeCwgdWludCBudHhkLAogCQkJICAgIHVpbnQgbnJ4ZCwgdWludCByeGJ1ZnNpemUsIGludCByeGV4dGhlYWRyb29tLAogCQkJICAgIHVpbnQgbnJ4cG9zdCwgdWludCByeG9mZnNldCwgdWludCAqbXNnX2xldmVsKTsKQEAgLTIzOCw2ICsyNDEsNiBAQAogZXh0ZXJuIHVpbnQgZG1hX2FkZHJ3aWR0aChzaV90ICpzaWgsIHZvaWQgKmRtYXJlZ3MpOwogCiAvKiBwaW8gaGVscGVycyAqLwotZXh0ZXJuIHZvaWQgZG1hX3R4cGlvbG9vcGJhY2sob3NsX3QgKm9zaCwgZG1hMzJyZWdzX3QgKik7CitleHRlcm4gdm9pZCBkbWFfdHhwaW9sb29wYmFjayhzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgZG1hMzJyZWdzX3QgKik7CiAKICNlbmRpZgkJCQkvKiBfaG5kZG1hX2hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvaG5kcG11LmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvaG5kcG11LmgKaW5kZXggYmJjZjBlZS4uYTAxMTBlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2huZHBtdS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9obmRwbXUuaApAQCAtMjgsNDQgKzI4LDQ0IEBACiAjZGVmaW5lIFNFVF9MRE9fVk9MVEFHRV9MTkxETzEJOQogI2RlZmluZSBTRVRfTERPX1ZPTFRBR0VfTE5MRE8yX1NFTAkxMAogCi1leHRlcm4gdm9pZCBzaV9wbXVfaW5pdChzaV90ICpzaWgsIG9zbF90ICpvc2gpOwotZXh0ZXJuIHZvaWQgc2lfcG11X2NoaXBfaW5pdChzaV90ICpzaWgsIG9zbF90ICpvc2gpOwotZXh0ZXJuIHZvaWQgc2lfcG11X3BsbF9pbml0KHNpX3QgKnNpaCwgb3NsX3QgKm9zaCwgdTMyIHh0YWxmcmVxKTsKLWV4dGVybiB2b2lkIHNpX3BtdV9yZXNfaW5pdChzaV90ICpzaWgsIG9zbF90ICpvc2gpOwotZXh0ZXJuIHZvaWQgc2lfcG11X3N3cmVnX2luaXQoc2lfdCAqc2loLCBvc2xfdCAqb3NoKTsKK2V4dGVybiB2b2lkIHNpX3BtdV9pbml0KHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gpOworZXh0ZXJuIHZvaWQgc2lfcG11X2NoaXBfaW5pdChzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoKTsKK2V4dGVybiB2b2lkIHNpX3BtdV9wbGxfaW5pdChzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB1MzIgeHRhbGZyZXEpOworZXh0ZXJuIHZvaWQgc2lfcG11X3Jlc19pbml0KHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gpOworZXh0ZXJuIHZvaWQgc2lfcG11X3N3cmVnX2luaXQoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCk7CiAKLWV4dGVybiB1MzIgc2lfcG11X2ZvcmNlX2lscChzaV90ICpzaWgsIG9zbF90ICpvc2gsIGJvb2wgZm9yY2UpOworZXh0ZXJuIHUzMiBzaV9wbXVfZm9yY2VfaWxwKHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gsIGJvb2wgZm9yY2UpOwogCi1leHRlcm4gdTMyIHNpX3BtdV9zaV9jbG9jayhzaV90ICpzaWgsIG9zbF90ICpvc2gpOwotZXh0ZXJuIHUzMiBzaV9wbXVfY3B1X2Nsb2NrKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCk7Ci1leHRlcm4gdTMyIHNpX3BtdV9tZW1fY2xvY2soc2lfdCAqc2loLCBvc2xfdCAqb3NoKTsKLWV4dGVybiB1MzIgc2lfcG11X2FscF9jbG9jayhzaV90ICpzaWgsIG9zbF90ICpvc2gpOwotZXh0ZXJuIHUzMiBzaV9wbXVfaWxwX2Nsb2NrKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCk7CitleHRlcm4gdTMyIHNpX3BtdV9zaV9jbG9jayhzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoKTsKK2V4dGVybiB1MzIgc2lfcG11X2NwdV9jbG9jayhzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoKTsKK2V4dGVybiB1MzIgc2lfcG11X21lbV9jbG9jayhzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoKTsKK2V4dGVybiB1MzIgc2lfcG11X2FscF9jbG9jayhzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoKTsKK2V4dGVybiB1MzIgc2lfcG11X2lscF9jbG9jayhzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoKTsKIAotZXh0ZXJuIHZvaWQgc2lfcG11X3NldF9zd2l0Y2hlcl92b2x0YWdlKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCwKK2V4dGVybiB2b2lkIHNpX3BtdV9zZXRfc3dpdGNoZXJfdm9sdGFnZShzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLAogCQkJCQl1OCBiYl92b2x0YWdlLCB1OCByZl92b2x0YWdlKTsKLWV4dGVybiB2b2lkIHNpX3BtdV9zZXRfbGRvX3ZvbHRhZ2Uoc2lfdCAqc2loLCBvc2xfdCAqb3NoLCB1OCBsZG8sCitleHRlcm4gdm9pZCBzaV9wbXVfc2V0X2xkb192b2x0YWdlKHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gsIHU4IGxkbywKIAkJCQkgICB1OCB2b2x0YWdlKTsKLWV4dGVybiB1MTYgc2lfcG11X2Zhc3RfcHdydXBfZGVsYXkoc2lfdCAqc2loLCBvc2xfdCAqb3NoKTsKLWV4dGVybiB2b2lkIHNpX3BtdV9yY2FsKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCk7CitleHRlcm4gdTE2IHNpX3BtdV9mYXN0X3B3cnVwX2RlbGF5KHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gpOworZXh0ZXJuIHZvaWQgc2lfcG11X3JjYWwoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCk7CiBleHRlcm4gdm9pZCBzaV9wbXVfcGxsdXBkKHNpX3QgKnNpaCk7Ci1leHRlcm4gdm9pZCBzaV9wbXVfc3B1cmF2b2lkKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCwgdTggc3B1cmF2b2lkKTsKK2V4dGVybiB2b2lkIHNpX3BtdV9zcHVyYXZvaWQoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdTggc3B1cmF2b2lkKTsKIAotZXh0ZXJuIGJvb2wgc2lfcG11X2lzX290cF9wb3dlcmVkKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCk7Ci1leHRlcm4gdTMyIHNpX3BtdV9tZWFzdXJlX2FscGNsayhzaV90ICpzaWgsIG9zbF90ICpvc2gpOworZXh0ZXJuIGJvb2wgc2lfcG11X2lzX290cF9wb3dlcmVkKHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gpOworZXh0ZXJuIHUzMiBzaV9wbXVfbWVhc3VyZV9hbHBjbGsoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCk7CiAKIGV4dGVybiB1MzIgc2lfcG11X2NoaXBjb250cm9sKHNpX3QgKnNpaCwgdWludCByZWcsIHUzMiBtYXNrLCB1MzIgdmFsKTsKIGV4dGVybiB1MzIgc2lfcG11X3JlZ2NvbnRyb2woc2lfdCAqc2loLCB1aW50IHJlZywgdTMyIG1hc2ssIHUzMiB2YWwpOwogZXh0ZXJuIHUzMiBzaV9wbXVfcGxsY29udHJvbChzaV90ICpzaWgsIHVpbnQgcmVnLCB1MzIgbWFzaywgdTMyIHZhbCk7CiBleHRlcm4gdm9pZCBzaV9wbXVfcGxsdXBkKHNpX3QgKnNpaCk7Ci1leHRlcm4gdm9pZCBzaV9wbXVfc3Byb21fZW5hYmxlKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCwgYm9vbCBlbmFibGUpOworZXh0ZXJuIHZvaWQgc2lfcG11X3Nwcm9tX2VuYWJsZShzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBib29sIGVuYWJsZSk7CiAKIGV4dGVybiB2b2lkIHNpX3BtdV9yYWRpb19lbmFibGUoc2lfdCAqc2loLCBib29sIGVuYWJsZSk7Ci1leHRlcm4gdTMyIHNpX3BtdV93YWl0Zm9yY2xrX29uX2JhY2twbGFuZShzaV90ICpzaWgsIG9zbF90ICpvc2gsCitleHRlcm4gdTMyIHNpX3BtdV93YWl0Zm9yY2xrX29uX2JhY2twbGFuZShzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLAogCQkJCQkgICAgIHUzMiBjbGssIHUzMiBkZWxheSk7CiAKLWV4dGVybiB2b2lkIHNpX3BtdV9vdHBfcG93ZXIoc2lfdCAqc2loLCBvc2xfdCAqb3NoLCBib29sIG9uKTsKLWV4dGVybiB2b2lkIHNpX3NkaW9kX2RyaXZlX3N0cmVuZ3RoX2luaXQoc2lfdCAqc2loLCBvc2xfdCAqb3NoLAorZXh0ZXJuIHZvaWQgc2lfcG11X290cF9wb3dlcihzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBib29sIG9uKTsKK2V4dGVybiB2b2lkIHNpX3NkaW9kX2RyaXZlX3N0cmVuZ3RoX2luaXQoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwKIAkJCQkJIHUzMiBkcml2ZXN0cmVuZ3RoKTsKIAogI2VuZGlmCQkJCS8qIF9obmRwbXVfaF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9saW51eF9vc2wuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9saW51eF9vc2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzljODYwYi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvbGludXhfb3NsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCi0gKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpZm5kZWYgX2xpbnV4X29zbF9oXwotI2RlZmluZSBfbGludXhfb3NsX2hfCi0KLQotLyogTGludXggS2VybmVsOiBGaWxlIE9wZXJhdGlvbnM6IHN0YXJ0ICovCi1leHRlcm4gdm9pZCAqb3NsX29zX29wZW5faW1hZ2UoY2hhciAqZmlsZW5hbWUpOwotZXh0ZXJuIGludCBvc2xfb3NfZ2V0X2ltYWdlX2Jsb2NrKGNoYXIgKmJ1ZiwgaW50IGxlbiwgdm9pZCAqaW1hZ2UpOwotZXh0ZXJuIHZvaWQgb3NsX29zX2Nsb3NlX2ltYWdlKHZvaWQgKmltYWdlKTsKLS8qIExpbnV4IEtlcm5lbDogRmlsZSBPcGVyYXRpb25zOiBlbmQgKi8KLQotZXh0ZXJuIG9zbF90ICpvc2xfYXR0YWNoKHZvaWQgKnBkZXYsIHVpbnQgYnVzdHlwZSwgYm9vbCBwa3R0YWcpOwotZXh0ZXJuIHZvaWQgb3NsX2RldGFjaChvc2xfdCAqb3NoKTsKLQotZXh0ZXJuIHUzMiBnX2Fzc2VydF90eXBlOwotCi0jaWYgZGVmaW5lZChCQ01EQkdfQVNTRVJUKQotI2RlZmluZSBBU1NFUlQoZXhwKSBcCi0JICBkbyB7IGlmICghKGV4cCkpIG9zbF9hc3NlcnQoI2V4cCwgX19GSUxFX18sIF9fTElORV9fKTsgfSB3aGlsZSAoMCkKLWV4dGVybiB2b2lkIG9zbF9hc3NlcnQoY2hhciAqZXhwLCBjaGFyICpmaWxlLCBpbnQgbGluZSk7Ci0jZWxzZQotI2lmZGVmIF9fR05VQ19fCi0jZGVmaW5lIEdDQ19WRVJTSU9OIFwKLQkJCShfX0dOVUNfXyAqIDEwMDAwICsgX19HTlVDX01JTk9SX18gKiAxMDAgKyBfX0dOVUNfUEFUQ0hMRVZFTF9fKQotI2lmIEdDQ19WRVJTSU9OID4gMzAxMDAKLSNkZWZpbmUgQVNTRVJUKGV4cCkJZG8ge30gd2hpbGUgKDApCi0jZWxzZQotCQkJLyogQVNTRVJUIGNvdWxkIGNhdXNlIHNlZ21lbnRhdGlvbiBmYXVsdCBvbiBHQ0MzLjEsIHVzZSBlbXB0eSBpbnN0ZWFkICovCi0jZGVmaW5lIEFTU0VSVChleHApCi0jZW5kaWYJCQkJLyogR0NDX1ZFUlNJT04gPiAzMDEwMCAqLwotI2VuZGlmCQkJCS8qIF9fR05VQ19fICovCi0jZW5kaWYJCQkJLyogZGVmaW5lZChCQ01EQkdfQVNTRVJUKSAqLwotCi0vKiBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSBhY2Nlc3MgbWFjcm9zICovCi0jZGVmaW5lCU9TTF9QQ0lfUkVBRF9DT05GSUcob3NoLCBvZmZzZXQsIHNpemUpIFwKLQlvc2xfcGNpX3JlYWRfY29uZmlnKChvc2gpLCAob2Zmc2V0KSwgKHNpemUpKQotI2RlZmluZQlPU0xfUENJX1dSSVRFX0NPTkZJRyhvc2gsIG9mZnNldCwgc2l6ZSwgdmFsKSBcCi0Jb3NsX3BjaV93cml0ZV9jb25maWcoKG9zaCksIChvZmZzZXQpLCAoc2l6ZSksICh2YWwpKQotZXh0ZXJuIHUzMiBvc2xfcGNpX3JlYWRfY29uZmlnKG9zbF90ICpvc2gsIHVpbnQgb2Zmc2V0LCB1aW50IHNpemUpOwotZXh0ZXJuIHZvaWQgb3NsX3BjaV93cml0ZV9jb25maWcob3NsX3QgKm9zaCwgdWludCBvZmZzZXQsIHVpbnQgc2l6ZSwgdWludCB2YWwpOwotCi0vKiBQQ0kgZGV2aWNlIGJ1cyAjIGFuZCBzbG90ICMgKi8KLSNkZWZpbmUgT1NMX1BDSV9CVVMob3NoKQlvc2xfcGNpX2J1cyhvc2gpCi0jZGVmaW5lIE9TTF9QQ0lfU0xPVChvc2gpCW9zbF9wY2lfc2xvdChvc2gpCi1leHRlcm4gdWludCBvc2xfcGNpX2J1cyhvc2xfdCAqb3NoKTsKLWV4dGVybiB1aW50IG9zbF9wY2lfc2xvdChvc2xfdCAqb3NoKTsKLQotLyogUGt0dGFnIGZsYWcgc2hvdWxkIGJlIHBhcnQgb2YgcHVibGljIGluZm9ybWF0aW9uICovCi10eXBlZGVmIHN0cnVjdCB7Ci0JYm9vbCBwa3R0YWc7Ci0JdWludCBwa3RhbGxvY2VkOwkvKiBOdW1iZXIgb2YgYWxsb2NhdGVkIHBhY2tldCBidWZmZXJzICovCi0JYm9vbCBtbWJ1czsJCS8qIEJ1cyBzdXBwb3J0cyBtZW1vcnktbWFwcGVkIHJlZ2lzdGVyIGFjY2Vzc2VzICovCi0JcGt0ZnJlZV9jYl9mbl90IHR4X2ZuOwkvKiBDYWxsYmFjayBmdW5jdGlvbiBmb3IgUEtURlJFRSAqLwotCXZvaWQgKnR4X2N0eDsJCS8qIENvbnRleHQgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCi0jaWYgZGVmaW5lZChCQ01TRElPKSAmJiAhZGVmaW5lZChCUkNNX0ZVTExNQUMpCi0Jb3NsX3JyZWdfZm5fdCBycmVnX2ZuOwkvKiBSZWFkIFJlZ2lzdGVyIGZ1bmN0aW9uICovCi0Jb3NsX3dyZWdfZm5fdCB3cmVnX2ZuOwkvKiBXcml0ZSBSZWdpc3RlciBmdW5jdGlvbiAqLwotCXZvaWQgKnJlZ19jdHg7CQkvKiBDb250ZXh0IHRvIHRoZSByZWcgY2FsbGJhY2sgZnVuY3Rpb25zICovCi0jZW5kaWYKLX0gb3NsX3B1YmluZm9fdDsKLQotI2RlZmluZSBQS1RGUkVFU0VUQ0Iob3NoLCBfdHhfZm4sIF90eF9jdHgpCQkJXAotCWRvIHsJCQkJCQkJXAotCQkoKG9zbF9wdWJpbmZvX3QgKilvc2gpLT50eF9mbiA9IF90eF9mbjsJCVwKLQkJKChvc2xfcHViaW5mb190ICopb3NoKS0+dHhfY3R4ID0gX3R4X2N0eDsJXAotCX0gd2hpbGUgKDApCi0KLSNpZiBkZWZpbmVkKEJDTVNESU8pICYmICFkZWZpbmVkKEJSQ01fRlVMTE1BQykKLSNkZWZpbmUgUkVHT1BTU0VUKG9zaCwgcnJlZywgd3JlZywgY3R4KQkJCVwKLQlkbyB7CQkJCQkJXAotCQkoKG9zbF9wdWJpbmZvX3QgKilvc2gpLT5ycmVnX2ZuID0gcnJlZzsJXAotCQkoKG9zbF9wdWJpbmZvX3QgKilvc2gpLT53cmVnX2ZuID0gd3JlZzsJXAotCQkoKG9zbF9wdWJpbmZvX3QgKilvc2gpLT5yZWdfY3R4ID0gY3R4OwlcCi0JfSB3aGlsZSAoMCkKLSNlbmRpZgotCi0jZGVmaW5lIEJVU19TV0FQMzIodikJCSh2KQotCi0jZGVmaW5lCURNQV9DT05TSVNURU5UX0FMSUdOCW9zbF9kbWFfY29uc2lzdGVudF9hbGlnbigpCi1leHRlcm4gdWludCBvc2xfZG1hX2NvbnNpc3RlbnRfYWxpZ24odm9pZCk7Ci1leHRlcm4gdm9pZCAqb3NsX2RtYV9hbGxvY19jb25zaXN0ZW50KG9zbF90ICpvc2gsIHVpbnQgc2l6ZSwgdTE2IGFsaWduLAotCQkJCSAgICAgIHVpbnQgKnRvdCwgdW5zaWduZWQgbG9uZyAqcGFwKTsKLQotI2lmZGVmIEJSQ01fRlVMTE1BQwotI2RlZmluZQlETUFfQUxMT0NfQ09OU0lTVEVOVChvc2gsIHNpemUsIHBhcCwgZG1haCwgYWxpZ25iaXRzKSBcCi0Jb3NsX2RtYV9hbGxvY19jb25zaXN0ZW50KChvc2gpLCAoc2l6ZSksICgwKSwgKHRvdCksIChwYXApKQotI2Vsc2UKLSNkZWZpbmUJRE1BX0FMTE9DX0NPTlNJU1RFTlQob3NoLCBzaXplLCBhbGlnbiwgdG90LCBwYXAsIGRtYWgpIFwKLQlvc2xfZG1hX2FsbG9jX2NvbnNpc3RlbnQoKG9zaCksIChzaXplKSwgKGFsaWduKSwgKHRvdCksIChwYXApKQotI2VuZGlmIC8qIEJSQ01fRlVMTE1BQyAqLwotCi0jZGVmaW5lCURNQV9GUkVFX0NPTlNJU1RFTlQob3NoLCB2YSwgc2l6ZSwgcGEsIGRtYWgpIFwKLQlvc2xfZG1hX2ZyZWVfY29uc2lzdGVudCgob3NoKSwgKHZvaWQgKikodmEpLCAoc2l6ZSksIChwYSkpCi1leHRlcm4gdm9pZCBvc2xfZG1hX2ZyZWVfY29uc2lzdGVudChvc2xfdCAqb3NoLCB2b2lkICp2YSwgdWludCBzaXplLCB1bnNpZ25lZCBsb25nIHBhKTsKLQotLyogbWFwL3VubWFwIGRpcmVjdGlvbiAqLwotI2RlZmluZQlETUFfVFgJMQkJLyogVFggZGlyZWN0aW9uIGZvciBETUEgKi8KLSNkZWZpbmUJRE1BX1JYCTIJCS8qIFJYIGRpcmVjdGlvbiBmb3IgRE1BICovCi0KLS8qIG1hcC91bm1hcCBzaGFyZWQgKGRtYS1hYmxlKSBtZW1vcnkgKi8KLSNkZWZpbmUJRE1BX01BUChvc2gsIHZhLCBzaXplLCBkaXJlY3Rpb24sIHAsIGRtYWgpIFwKLQlvc2xfZG1hX21hcCgob3NoKSwgKHZhKSwgKHNpemUpLCAoZGlyZWN0aW9uKSkKLSNkZWZpbmUJRE1BX1VOTUFQKG9zaCwgcGEsIHNpemUsIGRpcmVjdGlvbiwgcCwgZG1haCkgXAotCW9zbF9kbWFfdW5tYXAoKG9zaCksIChwYSksIChzaXplKSwgKGRpcmVjdGlvbikpCi1leHRlcm4gdWludCBvc2xfZG1hX21hcChvc2xfdCAqb3NoLCB2b2lkICp2YSwgdWludCBzaXplLCBpbnQgZGlyZWN0aW9uKTsKLWV4dGVybiB2b2lkIG9zbF9kbWFfdW5tYXAob3NsX3QgKm9zaCwgdWludCBwYSwgdWludCBzaXplLCBpbnQgZGlyZWN0aW9uKTsKLQotLyogQVBJIGZvciBETUEgYWRkcmVzc2luZyBjYXBhYmlsaXR5ICovCi0jZGVmaW5lIE9TTF9ETUFERFJXSURUSChvc2gsIGFkZHJ3aWR0aCkgZG8ge30gd2hpbGUgKDApCi0KLS8qIHJlZ2lzdGVyIGFjY2VzcyBtYWNyb3MgKi8KLSNpZiBkZWZpbmVkKEJDTVNESU8pCi0jaWZkZWYgQlJDTV9GVUxMTUFDCi0jaW5jbHVkZSA8YmNtc2RoLmg+Ci0jZW5kaWYKLSNkZWZpbmUgT1NMX1dSSVRFX1JFRyhvc2gsIHIsIHYpIChiY21zZGhfcmVnX3dyaXRlKE5VTEwsICh1bnNpZ25lZCBsb25nKShyKSwgc2l6ZW9mKCoocikpLCAodikpKQotI2RlZmluZSBPU0xfUkVBRF9SRUcob3NoLCByKSAoYmNtc2RoX3JlZ19yZWFkKE5VTEwsICh1bnNpZ25lZCBsb25nKShyKSwgc2l6ZW9mKCoocikpKSkKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChCQ01TRElPKQotI2RlZmluZSBTRUxFQ1RfQlVTX1dSSVRFKG9zaCwgbW1hcF9vcCwgYnVzX29wKSBpZiAoKChvc2xfcHViaW5mb190ICopKG9zaCkpLT5tbWJ1cykgXAotCQltbWFwX29wIGVsc2UgYnVzX29wCi0jZGVmaW5lIFNFTEVDVF9CVVNfUkVBRChvc2gsIG1tYXBfb3AsIGJ1c19vcCkgKCgob3NsX3B1YmluZm9fdCAqKShvc2gpKS0+bW1idXMpID8gXAotCQltbWFwX29wIDogYnVzX29wCi0jZWxzZQotI2RlZmluZSBTRUxFQ1RfQlVTX1dSSVRFKG9zaCwgbW1hcF9vcCwgYnVzX29wKSBtbWFwX29wCi0jZGVmaW5lIFNFTEVDVF9CVVNfUkVBRChvc2gsIG1tYXBfb3AsIGJ1c19vcCkgbW1hcF9vcAotI2VuZGlmCi0KLSNkZWZpbmUgT1NMX0VSUk9SKGJjbWVycm9yKQlvc2xfZXJyb3IoYmNtZXJyb3IpCi1leHRlcm4gaW50IG9zbF9lcnJvcihpbnQgYmNtZXJyb3IpOwotCi0vKiB0aGUgbGFyZ2VzdCByZWFzb25hYmxlIHBhY2tldCBidWZmZXIgZHJpdmVyIHVzZXMgZm9yIGV0aGVybmV0IE1UVSBpbiBieXRlcyAqLwotI2RlZmluZQlQS1RCVUZTWgkyMDQ4CS8qIGxhcmdlc3QgcmVhc29uYWJsZSBwYWNrZXQgYnVmZmVyLCBkcml2ZXIgdXNlcyBmb3IgZXRoZXJuZXQgTVRVICovCi0KLSNkZWZpbmUgT1NMX1NZU1VQVElNRSgpCQkoKHUzMilqaWZmaWVzICogKDEwMDAgLyBIWikpCi0jZGVmaW5lCXByaW50ZihmbXQsIGFyZ3MuLi4pCXByaW50ayhmbXQgLCAjIyBhcmdzKQotI2lmZGVmIEJSQ01fRlVMTE1BQwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgkvKiBmb3IgdnNuL3ByaW50ZidzICovCi0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CS8qIGZvciBtZW0qLCBzdHIqICovCi0jZW5kaWYKLS8qIGJjb3B5J3M6IExpbnV4IGtlcm5lbCBkb2Vzbid0IHByb3ZpZGUgdGhlc2UgKGFueW1vcmUpICovCi0jZGVmaW5lCWJjb3B5KHNyYywgZHN0LCBsZW4pCW1lbWNweSgoZHN0KSwgKHNyYyksIChsZW4pKQotI2RlZmluZQliY21wKGIxLCBiMiwgbGVuKQltZW1jbXAoKGIxKSwgKGIyKSwgKGxlbikpCi0jZGVmaW5lCWJ6ZXJvKGIsIGxlbikJCW1lbXNldCgoYiksICdcMCcsIChsZW4pKQotCi0vKiByZWdpc3RlciBhY2Nlc3MgbWFjcm9zICovCi0jaWYgZGVmaW5lZChPU0xSRUdPUFMpCi0jZWxzZQotI2lmbmRlZiBJTF9CSUdFTkRJQU4KLSNpZm5kZWYgX19taXBzX18KLSNkZWZpbmUgUl9SRUcob3NoLCByKSAoXAotCVNFTEVDVF9CVVNfUkVBRChvc2gsIHNpemVvZigqKHIpKSA9PSBzaXplb2YodTgpID8gcmVhZGIoKHZvbGF0aWxlIHU4KikocikpIDogXAotCXNpemVvZigqKHIpKSA9PSBzaXplb2YodTE2KSA/IHJlYWR3KCh2b2xhdGlsZSB1MTYqKShyKSkgOiBcCi0JcmVhZGwoKHZvbGF0aWxlIHUzMiopKHIpKSwgT1NMX1JFQURfUkVHKG9zaCwgcikpIFwKLSkKLSNlbHNlCQkJCS8qIF9fbWlwc19fICovCi0jZGVmaW5lIFJfUkVHKG9zaCwgcikgKFwKLQlTRUxFQ1RfQlVTX1JFQUQob3NoLCBcCi0JCSh7IFwKLQkJCV9fdHlwZW9mKCoocikpIF9fb3NsX3Y7IFwKLQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jIik7IFwKLQkJCXN3aXRjaCAoc2l6ZW9mKCoocikpKSB7IFwKLQkJCWNhc2Ugc2l6ZW9mKHU4KTogXAotCQkJCV9fb3NsX3YgPSByZWFkYigodm9sYXRpbGUgdTgqKShyKSk7IFwKLQkJCQlicmVhazsgXAotCQkJY2FzZSBzaXplb2YodTE2KTogXAotCQkJCV9fb3NsX3YgPSByZWFkdygodm9sYXRpbGUgdTE2KikocikpOyBcCi0JCQkJYnJlYWs7IFwKLQkJCWNhc2Ugc2l6ZW9mKHUzMik6IFwKLQkJCQlfX29zbF92ID0gXAotCQkJCXJlYWRsKCh2b2xhdGlsZSB1MzIqKShyKSk7IFwKLQkJCQlicmVhazsgXAotCQkJfSBcCi0JCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOyBcCi0JCQlfX29zbF92OyBcCi0JCX0pLCBcCi0JCSh7IFwKLQkJCV9fdHlwZW9mKCoocikpIF9fb3NsX3Y7IFwKLQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jIik7IFwKLQkJCV9fb3NsX3YgPSBPU0xfUkVBRF9SRUcob3NoLCByKTsgXAotCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiKTsgXAotCQkJX19vc2xfdjsgXAotCQl9KSkgXAotKQotI2VuZGlmCQkJCS8qIF9fbWlwc19fICovCi0KLSNkZWZpbmUgV19SRUcob3NoLCByLCB2KSBkbyB7IFwKLQlTRUxFQ1RfQlVTX1dSSVRFKG9zaCwgIFwKLQkJc3dpdGNoIChzaXplb2YoKihyKSkpIHsgXAotCQljYXNlIHNpemVvZih1OCk6IFwKLQkJCXdyaXRlYigodTgpKHYpLCAodm9sYXRpbGUgdTgqKShyKSk7IGJyZWFrOyBcCi0JCWNhc2Ugc2l6ZW9mKHUxNik6IFwKLQkJCXdyaXRldygodTE2KSh2KSwgKHZvbGF0aWxlIHUxNiopKHIpKTsgYnJlYWs7IFwKLQkJY2FzZSBzaXplb2YodTMyKTogXAotCQkJd3JpdGVsKCh1MzIpKHYpLCAodm9sYXRpbGUgdTMyKikocikpOyBicmVhazsgXAotCQl9LCBcCi0JCShPU0xfV1JJVEVfUkVHKG9zaCwgciwgdikpKTsgXAotCX0gd2hpbGUgKDApCi0jZWxzZQkJCQkvKiBJTF9CSUdFTkRJQU4gKi8KLSNkZWZpbmUgUl9SRUcob3NoLCByKSAoXAotCVNFTEVDVF9CVVNfUkVBRChvc2gsIFwKLQkJKHsgXAotCQkJX190eXBlb2YoKihyKSkgX19vc2xfdjsgXAotCQkJc3dpdGNoIChzaXplb2YoKihyKSkpIHsgXAotCQkJY2FzZSBzaXplb2YodTgpOiBcCi0JCQkJX19vc2xfdiA9IFwKLQkJCQlyZWFkYigodm9sYXRpbGUgdTgqKSgocileMykpOyBcCi0JCQkJYnJlYWs7IFwKLQkJCWNhc2Ugc2l6ZW9mKHUxNik6IFwKLQkJCQlfX29zbF92ID0gXAotCQkJCXJlYWR3KCh2b2xhdGlsZSB1MTYqKSgocileMikpOyBcCi0JCQkJYnJlYWs7IFwKLQkJCWNhc2Ugc2l6ZW9mKHUzMik6IFwKLQkJCQlfX29zbF92ID0gcmVhZGwoKHZvbGF0aWxlIHUzMiopKHIpKTsgXAotCQkJCWJyZWFrOyBcCi0JCQl9IFwKLQkJCV9fb3NsX3Y7IFwKLQkJfSksIFwKLQkJT1NMX1JFQURfUkVHKG9zaCwgcikpIFwKLSkKLSNkZWZpbmUgV19SRUcob3NoLCByLCB2KSBkbyB7IFwKLQlTRUxFQ1RfQlVTX1dSSVRFKG9zaCwgIFwKLQkJc3dpdGNoIChzaXplb2YoKihyKSkpIHsgXAotCQljYXNlIHNpemVvZih1OCk6CVwKLQkJCXdyaXRlYigodTgpKHYpLCBcCi0JCQkodm9sYXRpbGUgdTgqKSgocileMykpOyBicmVhazsgXAotCQljYXNlIHNpemVvZih1MTYpOglcCi0JCQl3cml0ZXcoKHUxNikodiksIFwKLQkJCSh2b2xhdGlsZSB1MTYqKSgocileMikpOyBicmVhazsgXAotCQljYXNlIHNpemVvZih1MzIpOglcCi0JCQl3cml0ZWwoKHUzMikodiksIFwKLQkJCSh2b2xhdGlsZSB1MzIqKShyKSk7IGJyZWFrOyBcCi0JCX0sIFwKLQkJKE9TTF9XUklURV9SRUcob3NoLCByLCB2KSkpOyBcCi0JfSB3aGlsZSAoMCkKLSNlbmRpZgkJCQkvKiBJTF9CSUdFTkRJQU4gKi8KLQotI2VuZGlmCQkJCS8qIE9TTFJFR09QUyAqLwotCi0jZGVmaW5lCUFORF9SRUcob3NoLCByLCB2KQkJV19SRUcob3NoLCAociksIFJfUkVHKG9zaCwgcikgJiAodikpCi0jZGVmaW5lCU9SX1JFRyhvc2gsIHIsIHYpCQlXX1JFRyhvc2gsIChyKSwgUl9SRUcob3NoLCByKSB8ICh2KSkKLQotLyogYmNvcHksIGJjbXAsIGFuZCBiemVybyBmdW5jdGlvbnMgKi8KLSNkZWZpbmUJYmNvcHkoc3JjLCBkc3QsIGxlbikJbWVtY3B5KChkc3QpLCAoc3JjKSwgKGxlbikpCi0jZGVmaW5lCWJjbXAoYjEsIGIyLCBsZW4pCW1lbWNtcCgoYjEpLCAoYjIpLCAobGVuKSkKLSNkZWZpbmUJYnplcm8oYiwgbGVuKQkJbWVtc2V0KChiKSwgJ1wwJywgKGxlbikpCi0KLS8qIHVuY2FjaGVkL2NhY2hlZCB2aXJ0dWFsIGFkZHJlc3MgKi8KLSNpZmRlZiBfX21pcHNfXwotI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KLSNkZWZpbmUgT1NMX1VOQ0FDSEVEKHZhKQkoKHZvaWQgKilLU0VHMUFERFIoKHZhKSkpCi0jZGVmaW5lIE9TTF9DQUNIRUQodmEpCQkoKHZvaWQgKilLU0VHMEFERFIoKHZhKSkpCi0jZWxzZQotI2RlZmluZSBPU0xfVU5DQUNIRUQodmEpCSgodm9pZCAqKXZhKQotI2RlZmluZSBPU0xfQ0FDSEVEKHZhKQkJKCh2b2lkICopdmEpCi0jZW5kaWYJCQkJLyogbWlwcyAqLwotCi0jaWYgZGVmaW5lZChtaXBzKQotI2RlZmluZQlPU0xfR0VUQ1lDTEVTKHgpCSgoeCkgPSByZWFkX2MwX2NvdW50KCkgKiAyKQotI2VsaWYgZGVmaW5lZChfX2kzODZfXykKLSNkZWZpbmUJT1NMX0dFVENZQ0xFUyh4KQlyZHRzY2woKHgpKQotI2Vsc2UKLSNkZWZpbmUgT1NMX0dFVENZQ0xFUyh4KQkoKHgpID0gMCkKLSNlbmRpZgkJCQkvKiBkZWZpbmVkKG1pcHMpICovCi0KLS8qIGRlcmVmZXJlbmNlIGFuIGFkZHJlc3MgdGhhdCBtYXkgY2F1c2UgYSBidXMgZXhjZXB0aW9uICovCi0jaWZkZWYgbWlwcwotI2RlZmluZQlCVVNQUk9CRSh2YWwsIGFkZHIpCWdldF9kYmUoKHZhbCksIChhZGRyKSkKLSNpbmNsdWRlIDxhc20vcGFjY2Vzcy5oPgotI2Vsc2UKLSNkZWZpbmUJQlVTUFJPQkUodmFsLCBhZGRyKQkoeyAodmFsKSA9IFJfUkVHKE5VTEwsIChhZGRyKSk7IDA7IH0pCi0jZW5kaWYJCQkJLyogbWlwcyAqLwotCi0vKiBtYXAvdW5tYXAgcGh5c2ljYWwgdG8gdmlydHVhbCBJL08gKi8KLSNpZiAhZGVmaW5lZChDT05GSUdfTU1DX01TTTdYMDBBKQotI2RlZmluZQlSRUdfTUFQKHBhLCBzaXplKQlpb3JlbWFwX25vY2FjaGUoKHVuc2lnbmVkIGxvbmcpKHBhKSwgKHVuc2lnbmVkIGxvbmcpKHNpemUpKQotI2Vsc2UKLSNkZWZpbmUgUkVHX01BUChwYSwgc2l6ZSkgICAgICAgKHZvaWQgKikoMCkKLSNlbmRpZgkJCQkvKiAhZGVmaW5lZChDT05GSUdfTU1DX01TTTdYMDBBICovCi0jZGVmaW5lCVJFR19VTk1BUCh2YSkJCWlvdW5tYXAoKHZhKSkKLQotI2RlZmluZQlSX1NNKHIpCQkJKCoocikpCi0jZGVmaW5lCVdfU00ociwgdikJCSgqKHIpID0gKHYpKQotI2RlZmluZQlCWkVST19TTShyLCBsZW4pCW1lbXNldCgociksICdcMCcsIChsZW4pKQotCi0jaWZkZWYgQlJDTV9GVUxMTUFDCi0jaW5jbHVkZSA8bGludXh2ZXIuaD4JCS8qIHVzZSBjdXJyZW50IDIuNC54IGNhbGxpbmcgY29udmVudGlvbnMgKi8KLSNlbmRpZgotCi0vKiBwYWNrZXQgcHJpbWl0aXZlcyAqLwotI2RlZmluZQlQS1RHRVQob3NoLCBsZW4sIHNlbmQpCQlvc2xfcGt0Z2V0KChvc2gpLCAobGVuKSkKLSNkZWZpbmUJUEtURlJFRShvc2gsIHNrYiwgc2VuZCkJCW9zbF9wa3RmcmVlKChvc2gpLCAoc2tiKSwgKHNlbmQpKQotI2RlZmluZQlQS1REQVRBKHNrYikJCSgoKHN0cnVjdCBza19idWZmICopKHNrYikpLT5kYXRhKQotI2RlZmluZQlQS1RMRU4oc2tiKQkJKCgoc3RydWN0IHNrX2J1ZmYgKikoc2tiKSktPmxlbikKLSNkZWZpbmUgUEtUSEVBRFJPT00oc2tiKQkJKFBLVERBVEEoc2tiKS0oKChzdHJ1Y3Qgc2tfYnVmZiAqKShza2IpKS0+aGVhZCkpCi0jZGVmaW5lIFBLVFRBSUxST09NKHNrYikgKCgoKHN0cnVjdCBza19idWZmICopKHNrYikpLT5lbmQpLSgoKHN0cnVjdCBza19idWZmICopKHNrYikpLT50YWlsKSkKLSNkZWZpbmUJUEtUTkVYVChza2IpCQkoKChzdHJ1Y3Qgc2tfYnVmZiAqKShza2IpKS0+bmV4dCkKLSNkZWZpbmUJUEtUU0VUTkVYVChza2IsIHgpCVwKLQkoKChzdHJ1Y3Qgc2tfYnVmZiAqKShza2IpKS0+bmV4dCA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSh4KSkKLSNkZWZpbmUJUEtUU0VUTEVOKHNrYiwgbGVuKQlfX3NrYl90cmltKChzdHJ1Y3Qgc2tfYnVmZiAqKShza2IpLCAobGVuKSkKLSNkZWZpbmUJUEtUUFVTSChza2IsIGJ5dGVzKQlza2JfcHVzaCgoc3RydWN0IHNrX2J1ZmYgKikoc2tiKSwgKGJ5dGVzKSkKLSNkZWZpbmUJUEtUUFVMTChza2IsIGJ5dGVzKQlza2JfcHVsbCgoc3RydWN0IHNrX2J1ZmYgKikoc2tiKSwgKGJ5dGVzKSkKLSNkZWZpbmUJUEtUVEFHKHNrYikJCSgodm9pZCAqKSgoKHN0cnVjdCBza19idWZmICopKHNrYikpLT5jYikpCi0jZGVmaW5lIFBLVEFMTE9DRUQob3NoKQkJKCgob3NsX3B1YmluZm9fdCAqKShvc2gpKS0+cGt0YWxsb2NlZCkKLSNkZWZpbmUgUEtUU0VUUE9PTChvc2gsIHNrYiwgeCwgeSkJZG8ge30gd2hpbGUgKDApCi0jZGVmaW5lIFBLVFBPT0wob3NoLCBza2IpCQlmYWxzZQotZXh0ZXJuIHZvaWQgKm9zbF9wa3RnZXQob3NsX3QgKm9zaCwgdWludCBsZW4pOwotZXh0ZXJuIHZvaWQgb3NsX3BrdGZyZWUob3NsX3QgKm9zaCwgdm9pZCAqc2tiLCBib29sIHNlbmQpOwotCi0jaWZkZWYgQlJDTV9GVUxMTUFDCi1leHRlcm4gdm9pZCAqb3NsX3BrdGdldF9zdGF0aWMob3NsX3QgKm9zaCwgdWludCBsZW4pOwotZXh0ZXJuIHZvaWQgb3NsX3BrdGZyZWVfc3RhdGljKG9zbF90ICpvc2gsIHZvaWQgKnNrYiwgYm9vbCBzZW5kKTsKLQotc3RhdGljIGlubGluZSB2b2lkICoKLW9zbF9wa3RfZnJtbmF0aXZlKG9zbF9wdWJpbmZvX3QgKm9zaCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYjsKLQotCWlmIChvc2gtPnBrdHRhZykKLQkJYnplcm8oKHZvaWQgKilza2ItPmNiLCBPU0xfUEtUVEFHX1NaKTsKLQotCWZvciAobnNrYiA9IHNrYjsgbnNrYjsgbnNrYiA9IG5za2ItPm5leHQpCi0JCW9zaC0+cGt0YWxsb2NlZCsrOwotCi0JcmV0dXJuICh2b2lkICopc2tiOwotfQotI2RlZmluZSBQS1RGUk1OQVRJVkUob3NoLCBza2IpCVwKLQlvc2xfcGt0X2ZybW5hdGl2ZSgoKG9zbF9wdWJpbmZvX3QgKilvc2gpLCAoc3RydWN0IHNrX2J1ZmYqKShza2IpKQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICoKLW9zbF9wa3RfdG9uYXRpdmUob3NsX3B1YmluZm9fdCAqb3NoLCB2b2lkICpwa3QpCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKm5za2I7Ci0KLQlpZiAob3NoLT5wa3R0YWcpCi0JCWJ6ZXJvKCgoc3RydWN0IHNrX2J1ZmYgKilwa3QpLT5jYiwgT1NMX1BLVFRBR19TWik7Ci0KLQlmb3IgKG5za2IgPSAoc3RydWN0IHNrX2J1ZmYgKilwa3Q7IG5za2I7IG5za2IgPSBuc2tiLT5uZXh0KQotCQlvc2gtPnBrdGFsbG9jZWQtLTsKLQotCXJldHVybiAoc3RydWN0IHNrX2J1ZmYgKilwa3Q7Ci19Ci0jZGVmaW5lIFBLVFRPTkFUSVZFKG9zaCwgcGt0KQlcCi0Jb3NsX3BrdF90b25hdGl2ZSgob3NsX3B1YmluZm9fdCAqKShvc2gpLCAocGt0KSkKLSNlbHNlIC8qICFCUkNNX0ZVTExNQUMgKi8KLSNkZWZpbmUgUEtUVU5BTExPQyhvc2gpCQkJKCgob3NsX3B1YmluZm9fdCAqKShvc2gpKS0+cGt0YWxsb2NlZC0tKQotCi0jZGVmaW5lCVBLVFNFVFNLSVBDVChvc2gsIHNrYikKLSNkZWZpbmUJUEtUQ0xSU0tJUENUKG9zaCwgc2tiKQotI2RlZmluZQlQS1RTS0lQQ1Qob3NoLCBza2IpCi0jZW5kaWYJLyogQlJDTV9GVUxMTUFDICovCi0KLSNkZWZpbmUJUEtUTElOSyhza2IpCQkJKCgoc3RydWN0IHNrX2J1ZmYgKikoc2tiKSktPnByZXYpCi0jZGVmaW5lCVBLVFNFVExJTksoc2tiLCB4KQkJKCgoc3RydWN0IHNrX2J1ZmYgKikoc2tiKSktPnByZXYgPSAoc3RydWN0IHNrX2J1ZmYqKSh4KSkKLSNkZWZpbmUJUEtUUFJJTyhza2IpCQkJKCgoc3RydWN0IHNrX2J1ZmYgKikoc2tiKSktPnByaW9yaXR5KQotI2RlZmluZQlQS1RTRVRQUklPKHNrYiwgeCkJCSgoKHN0cnVjdCBza19idWZmICopKHNrYikpLT5wcmlvcml0eSA9ICh4KSkKLSNkZWZpbmUgUEtUU1VNTkVFREVEKHNrYikJCSgoKHN0cnVjdCBza19idWZmICopKHNrYikpLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkKLSNkZWZpbmUgUEtUU0VUU1VNR09PRChza2IsIHgpCQkoKChzdHJ1Y3Qgc2tfYnVmZiAqKShza2IpKS0+aXBfc3VtbWVkID0gXAotCQkJCQkJKCh4KSA/IENIRUNLU1VNX1VOTkVDRVNTQVJZIDogQ0hFQ0tTVU1fTk9ORSkpCi0vKiBQS1RTRVRTVU1ORUVERUQgYW5kIFBLVFNVTUdPT0QgYXJlIG5vdCBwb3NzaWJsZSBiZWNhdXNlIHNrYi0+aXBfc3VtbWVkIGlzIG92ZXJsb2FkZWQgKi8KLSNkZWZpbmUgUEtUU0hBUkVEKHNrYikgICAgICAgICAgICAgICAgICAoKChzdHJ1Y3Qgc2tfYnVmZiAqKShza2IpKS0+Y2xvbmVkKQotCi0jaWYgZGVmaW5lZChCQ01TRElPKSAmJiAhZGVmaW5lZChCUkNNX0ZVTExNQUMpCi0jZGVmaW5lIFJQQ19SRUFEX1JFRyhvc2gsIHIpIChcCi0Jc2l6ZW9mKCoocikpID09IHNpemVvZih1OCkgPyBvc2xfcmVhZGIoKG9zaCksICh2b2xhdGlsZSB1OCopKHIpKSA6IFwKLQlzaXplb2YoKihyKSkgPT0gc2l6ZW9mKHUxNikgPyBvc2xfcmVhZHcoKG9zaCksICh2b2xhdGlsZSB1MTYqKShyKSkgOiBcCi0Jb3NsX3JlYWRsKChvc2gpLCAodm9sYXRpbGUgdTMyKikocikpIFwKLSkKLSNkZWZpbmUgUlBDX1dSSVRFX1JFRyhvc2gsIHIsIHYpIGRvIHsgXAotCXN3aXRjaCAoc2l6ZW9mKCoocikpKSB7IFwKLQljYXNlIHNpemVvZih1OCk6IFwKLQkJb3NsX3dyaXRlYigob3NoKSwgKHZvbGF0aWxlIHU4KikociksICh1OCkodikpOyBcCi0JCWJyZWFrOyBcCi0JY2FzZSBzaXplb2YodTE2KTogXAotCQlvc2xfd3JpdGV3KChvc2gpLCAodm9sYXRpbGUgdTE2KikociksICh1MTYpKHYpKTsgXAotCQlicmVhazsgXAotCWNhc2Ugc2l6ZW9mKHUzMik6IFwKLQkJb3NsX3dyaXRlbCgob3NoKSwgKHZvbGF0aWxlIHUzMiopKHIpLCAodTMyKSh2KSk7IFwKLQkJYnJlYWs7IFwKLQl9IFwKLX0gd2hpbGUgKDApCi0KLWV4dGVybiB1OCBvc2xfcmVhZGIob3NsX3QgKm9zaCwgdm9sYXRpbGUgdTggKnIpOwotZXh0ZXJuIHUxNiBvc2xfcmVhZHcob3NsX3QgKm9zaCwgdm9sYXRpbGUgdTE2ICpyKTsKLWV4dGVybiB1MzIgb3NsX3JlYWRsKG9zbF90ICpvc2gsIHZvbGF0aWxlIHUzMiAqcik7Ci1leHRlcm4gdm9pZCBvc2xfd3JpdGViKG9zbF90ICpvc2gsIHZvbGF0aWxlIHU4ICpyLCB1OCB2KTsKLWV4dGVybiB2b2lkIG9zbF93cml0ZXcob3NsX3QgKm9zaCwgdm9sYXRpbGUgdTE2ICpyLCB1MTYgdik7Ci1leHRlcm4gdm9pZCBvc2xfd3JpdGVsKG9zbF90ICpvc2gsIHZvbGF0aWxlIHUzMiAqciwgdTMyIHYpOwotI2VuZGlmCQkJCS8qIEJDTVNESU8gKi8KLQotI2VuZGlmCQkJCS8qIF9saW51eF9vc2xfaF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9saW51eHZlci5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2xpbnV4dmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNzIxNDEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2xpbnV4dmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2lmbmRlZiBfbGludXh2ZXJfaF8KLSNkZWZpbmUgX2xpbnV4dmVyX2hfCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2llZWU4MDIxMS5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0KLSN1bmRlZiBJUF9UT1MKLSNpbmNsdWRlIDxhc20vaW8uaD4KLQotI2VuZGlmCQkJCS8qIF9saW51eHZlcl9oXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL25pY3BjaS5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL25pY3BjaS5oCmluZGV4IGNlMTQ2ZTguLjkyODgxOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9uaWNwY2kuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvbmljcGNpLmgKQEAgLTQ1LDE3ICs0NSwxNyBAQAogI2Vsc2UKIHN0cnVjdCBzYnBjaWVyZWdzOwogCi1leHRlcm4gdTggcGNpY29yZV9maW5kX3BjaV9jYXBhYmlsaXR5KG9zbF90ICpvc2gsIHU4IHJlcV9jYXBfaWQsCitleHRlcm4gdTggcGNpY29yZV9maW5kX3BjaV9jYXBhYmlsaXR5KHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB1OCByZXFfY2FwX2lkLAogCQkJCQkgdW5zaWduZWQgY2hhciAqYnVmLCB1MzIgKmJ1Zmxlbik7Ci1leHRlcm4gdWludCBwY2llX3JlYWRyZWcob3NsX3QgKm9zaCwgc3RydWN0IHNicGNpZXJlZ3MgKnBjaWVyZWdzLAorZXh0ZXJuIHVpbnQgcGNpZV9yZWFkcmVnKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBzdHJ1Y3Qgc2JwY2llcmVncyAqcGNpZXJlZ3MsCiAJCQkgdWludCBhZGRydHlwZSwgdWludCBvZmZzZXQpOwotZXh0ZXJuIHVpbnQgcGNpZV93cml0ZXJlZyhvc2xfdCAqb3NoLCBzdHJ1Y3Qgc2JwY2llcmVncyAqcGNpZXJlZ3MsCitleHRlcm4gdWludCBwY2llX3dyaXRlcmVnKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBzdHJ1Y3Qgc2JwY2llcmVncyAqcGNpZXJlZ3MsCiAJCQkgIHVpbnQgYWRkcnR5cGUsIHVpbnQgb2Zmc2V0LCB1aW50IHZhbCk7CiAKIGV4dGVybiB1OCBwY2llX2Nsa3JlcSh2b2lkICpwY2gsIHUzMiBtYXNrLCB1MzIgdmFsKTsKIGV4dGVybiB1MzIgcGNpZV9sY3JlZyh2b2lkICpwY2gsIHUzMiBtYXNrLCB1MzIgdmFsKTsKIAotZXh0ZXJuIHZvaWQgKnBjaWNvcmVfaW5pdChzaV90ICpzaWgsIG9zbF90ICpvc2gsIHZvaWQgKnJlZ3MpOworZXh0ZXJuIHZvaWQgKnBjaWNvcmVfaW5pdChzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB2b2lkICpyZWdzKTsKIGV4dGVybiB2b2lkIHBjaWNvcmVfZGVpbml0KHZvaWQgKnBjaCk7CiBleHRlcm4gdm9pZCBwY2ljb3JlX2F0dGFjaCh2b2lkICpwY2gsIGNoYXIgKnB2YXJzLCBpbnQgc3RhdGUpOwogZXh0ZXJuIHZvaWQgcGNpY29yZV9od3VwKHZvaWQgKnBjaCk7CkBAIC03MCwxMCArNzAsMTAgQEAKIGV4dGVybiB1MzIgcGNpY29yZV9wY2llcmVnKHZvaWQgKnBjaCwgdTMyIG9mZnNldCwgdTMyIG1hc2ssCiAJCQkgICAgICB1MzIgdmFsLCB1aW50IHR5cGUpOwogCi1leHRlcm4gYm9vbCBwY2ljb3JlX3BtZWNhcF9mYXN0KG9zbF90ICpvc2gpOworZXh0ZXJuIGJvb2wgcGNpY29yZV9wbWVjYXBfZmFzdChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCk7CiBleHRlcm4gdm9pZCBwY2ljb3JlX3BtZWVuKHZvaWQgKnBjaCk7CiBleHRlcm4gdm9pZCBwY2ljb3JlX3BtZWNscih2b2lkICpwY2gpOwogZXh0ZXJuIGJvb2wgcGNpY29yZV9wbWVzdGF0KHZvaWQgKnBjaCk7Ci0jZW5kaWYJCQkJLyogZGVmaW5lZChCQ01TRElPKSB8fCAoZGVmaW5lZChCQ01CVVNUWVBFKSAmJiAoQkNNQlVTVFlQRSA9PSBTSV9CVVMpKSAqLworI2VuZGlmIC8qIGRlZmluZWQoQkNNU0RJTyl8fChkZWZpbmVkKEJDTUJVU1RZUEUpICYmIChCQ01CVVNUWVBFPT1TSV9CVVMpKSAqLwogCiAjZW5kaWYJCQkJLyogX05JQ1BDSV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvb3NsLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvb3NsLmgKaW5kZXggYzBlYmIzZC4uYjI4MjM1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL29zbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9vc2wuaApAQCAtMTgsNDIgKzE4LDE5NyBAQAogI2RlZmluZSBfb3NsX2hfCiAKIC8qIG9zbCBoYW5kbGUgdHlwZSBmb3J3YXJkIGRlY2xhcmF0aW9uICovCi10eXBlZGVmIHN0cnVjdCBvc2xfaW5mbyBvc2xfdDsKK3N0cnVjdCBvc2xfaW5mbyB7CisJdWludCBwa3RhbGxvY2VkOwkvKiBOdW1iZXIgb2YgYWxsb2NhdGVkIHBhY2tldCBidWZmZXJzICovCisJYm9vbCBtbWJ1czsJCS8qIEJ1cyBzdXBwb3J0cyBtZW1vcnktbWFwcGVkIHJlZ2lzdGVycyAqLworCXVpbnQgbWFnaWM7CisJdm9pZCAqcGRldjsKKwl1aW50IGJ1c3R5cGU7Cit9OworCiB0eXBlZGVmIHN0cnVjdCBvc2xfZG1haW5mbyBvc2xkbWFfdDsKIAotI2RlZmluZSBPU0xfUEtUVEFHX1NaCTMyCS8qIFNpemUgb2YgUGt0VGFnICovCiAKLS8qIERyaXZlcnMgdXNlIFBLVEZSRUVTRVRDQiB0byByZWdpc3RlciBhIGNhbGxiYWNrIGZ1bmN0aW9uIHdoZW4gYSBwYWNrZXQgaXMgZnJlZWQgYnkgT1NMICovCi10eXBlZGVmIHZvaWQgKCpwa3RmcmVlX2NiX2ZuX3QpICh2b2lkICpjdHgsIHZvaWQgKnBrdCwgdW5zaWduZWQgaW50IHN0YXR1cyk7CitleHRlcm4gc3RydWN0IG9zbF9pbmZvICpvc2xfYXR0YWNoKHZvaWQgKnBkZXYsIHVpbnQgYnVzdHlwZSk7CitleHRlcm4gdm9pZCBvc2xfZGV0YWNoKHN0cnVjdCBvc2xfaW5mbyAqb3NoKTsKIAotI2lmZGVmIEJDTVNESU8KLS8qIERyaXZlcnMgdXNlIFJFR09QU1NFVCgpIHRvIHJlZ2lzdGVyIHJlZ2lzdGVyIHJlYWQvd3JpdGUgZnVuY2l0b25zICovCi10eXBlZGVmIHVuc2lnbmVkIGludCAoKm9zbF9ycmVnX2ZuX3QpICh2b2lkICpjdHgsIHZvaWQgKnJlZywgdW5zaWduZWQgaW50IHNpemUpOwotdHlwZWRlZiB2b2lkICgqb3NsX3dyZWdfZm5fdCkgKHZvaWQgKmN0eCwgdm9pZCAqcmVnLCB1bnNpZ25lZCBpbnQgdmFsLAotCQkJICAgICAgIHVuc2lnbmVkIGludCBzaXplKTsKK2V4dGVybiB1MzIgZ19hc3NlcnRfdHlwZTsKKworI2lmIGRlZmluZWQoQkNNREJHX0FTU0VSVCkKKyNkZWZpbmUgQVNTRVJUKGV4cCkgXAorCSAgZG8geyBpZiAoIShleHApKSBvc2xfYXNzZXJ0KCNleHAsIF9fRklMRV9fLCBfX0xJTkVfXyk7IH0gd2hpbGUgKDApCitleHRlcm4gdm9pZCBvc2xfYXNzZXJ0KGNoYXIgKmV4cCwgY2hhciAqZmlsZSwgaW50IGxpbmUpOworI2Vsc2UKKyNkZWZpbmUgQVNTRVJUKGV4cCkJZG8ge30gd2hpbGUgKDApCisjZW5kaWYgIC8qIGRlZmluZWQoQkNNREJHX0FTU0VSVCkgKi8KKworLyogUENJIGRldmljZSBidXMgIyBhbmQgc2xvdCAjICovCisjZGVmaW5lIE9TTF9QQ0lfQlVTKG9zaCkJb3NsX3BjaV9idXMob3NoKQorI2RlZmluZSBPU0xfUENJX1NMT1Qob3NoKQlvc2xfcGNpX3Nsb3Qob3NoKQorZXh0ZXJuIHVpbnQgb3NsX3BjaV9idXMoc3RydWN0IG9zbF9pbmZvICpvc2gpOworZXh0ZXJuIHVpbnQgb3NsX3BjaV9zbG90KHN0cnVjdCBvc2xfaW5mbyAqb3NoKTsKKworI2RlZmluZSBCVVNfU1dBUDMyKHYpCQkodikKKworZXh0ZXJuIHZvaWQgKm9zbF9kbWFfYWxsb2NfY29uc2lzdGVudChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdWludCBzaXplLAorCQkJCSAgICAgIHUxNiBhbGlnbiwgdWludCAqdG90LCB1bnNpZ25lZCBsb25nICpwYXApOworCisjaWZkZWYgQlJDTV9GVUxMTUFDCisjZGVmaW5lCURNQV9BTExPQ19DT05TSVNURU5UKG9zaCwgc2l6ZSwgcGFwLCBkbWFoLCBhbGlnbmJpdHMpIFwKKwlvc2xfZG1hX2FsbG9jX2NvbnNpc3RlbnQoKG9zaCksIChzaXplKSwgKDApLCAodG90KSwgKHBhcCkpCisjZWxzZQorI2RlZmluZQlETUFfQUxMT0NfQ09OU0lTVEVOVChvc2gsIHNpemUsIGFsaWduLCB0b3QsIHBhcCwgZG1haCkgXAorCW9zbF9kbWFfYWxsb2NfY29uc2lzdGVudCgob3NoKSwgKHNpemUpLCAoYWxpZ24pLCAodG90KSwgKHBhcCkpCisjZW5kaWYgLyogQlJDTV9GVUxMTUFDICovCisKKyNkZWZpbmUJRE1BX0ZSRUVfQ09OU0lTVEVOVChvc2gsIHZhLCBzaXplLCBwYSwgZG1haCkgXAorCW9zbF9kbWFfZnJlZV9jb25zaXN0ZW50KChvc2gpLCAodm9pZCAqKSh2YSksIChzaXplKSwgKHBhKSkKK2V4dGVybiB2b2lkIG9zbF9kbWFfZnJlZV9jb25zaXN0ZW50KHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB2b2lkICp2YSwKKwkJCQkgICAgdWludCBzaXplLCB1bnNpZ25lZCBsb25nIHBhKTsKKworLyogbWFwL3VubWFwIGRpcmVjdGlvbiAqLworI2RlZmluZQlETUFfVFgJMQkJLyogVFggZGlyZWN0aW9uIGZvciBETUEgKi8KKyNkZWZpbmUJRE1BX1JYCTIJCS8qIFJYIGRpcmVjdGlvbiBmb3IgRE1BICovCisKKy8qIG1hcC91bm1hcCBzaGFyZWQgKGRtYS1hYmxlKSBtZW1vcnkgKi8KKyNkZWZpbmUJRE1BX01BUChvc2gsIHZhLCBzaXplLCBkaXJlY3Rpb24sIHAsIGRtYWgpIFwKKwlvc2xfZG1hX21hcCgob3NoKSwgKHZhKSwgKHNpemUpLCAoZGlyZWN0aW9uKSkKKyNkZWZpbmUJRE1BX1VOTUFQKG9zaCwgcGEsIHNpemUsIGRpcmVjdGlvbiwgcCwgZG1haCkgXAorCW9zbF9kbWFfdW5tYXAoKG9zaCksIChwYSksIChzaXplKSwgKGRpcmVjdGlvbikpCitleHRlcm4gdWludCBvc2xfZG1hX21hcChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqdmEsIHVpbnQgc2l6ZSwKKwkJCWludCBkaXJlY3Rpb24pOworZXh0ZXJuIHZvaWQgb3NsX2RtYV91bm1hcChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdWludCBwYSwgdWludCBzaXplLAorCQkJICBpbnQgZGlyZWN0aW9uKTsKKworLyogcmVnaXN0ZXIgYWNjZXNzIG1hY3JvcyAqLworI2lmIGRlZmluZWQoQkNNU0RJTykKKyNpZmRlZiBCUkNNX0ZVTExNQUMKKyNpbmNsdWRlIDxiY21zZGguaD4KKyNlbmRpZgorI2RlZmluZSBPU0xfV1JJVEVfUkVHKG9zaCwgciwgdikgXAorCQkoYmNtc2RoX3JlZ193cml0ZShOVUxMLCAodW5zaWduZWQgbG9uZykociksIHNpemVvZigqKHIpKSwgKHYpKSkKKyNkZWZpbmUgT1NMX1JFQURfUkVHKG9zaCwgcikgXAorCQkoYmNtc2RoX3JlZ19yZWFkKE5VTEwsICh1bnNpZ25lZCBsb25nKShyKSwgc2l6ZW9mKCoocikpKSkKICNlbmRpZgogCi0jaW5jbHVkZSA8bGludXhfb3NsLmg+Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qKiBSZWdpc3RlciBtYW5pcHVsYXRpb24gbWFjcm9zLgotKi8KLQotI2RlZmluZQlTRVRfUkVHKG9zaCwgciwgbWFzaywgdmFsKQlXX1JFRygob3NoKSwgKHIpLCAoKFJfUkVHKChvc2gpLCByKSAmIH4obWFzaykpIHwgKHZhbCkpKQotCi0jaWZuZGVmIEFORF9SRUcKLSNkZWZpbmUgQU5EX1JFRyhvc2gsIHIsIHYpCQlXX1JFRyhvc2gsIChyKSwgUl9SRUcob3NoLCByKSAmICh2KSkKLSNlbmRpZgkJCQkvKiAhQU5EX1JFRyAqLwotCi0jaWZuZGVmIE9SX1JFRwotI2RlZmluZSBPUl9SRUcob3NoLCByLCB2KQkJV19SRUcob3NoLCAociksIFJfUkVHKG9zaCwgcikgfCAodikpCi0jZW5kaWYJCQkJLyogIU9SX1JFRyAqLwotCi0jaWYgIWRlZmluZWQoT1NMX1NZU1VQVElNRSkKLSNkZWZpbmUgT1NMX1NZU1VQVElNRSgpICgwKQotI2RlZmluZSBPU0xfU1lTVVBUSU1FX1NVUFBPUlQgZmFsc2UKKyNpZiBkZWZpbmVkKEJDTVNESU8pCisjZGVmaW5lIFNFTEVDVF9CVVNfV1JJVEUob3NoLCBtbWFwX29wLCBidXNfb3ApIFwKKwlpZiAoKG9zaCktPm1tYnVzKSBcCisJCW1tYXBfb3AgZWxzZSBidXNfb3AKKyNkZWZpbmUgU0VMRUNUX0JVU19SRUFEKG9zaCwgbW1hcF9vcCwgYnVzX29wKSBcCisJKChvc2gpLT5tbWJ1cykgPyAgbW1hcF9vcCA6IGJ1c19vcAogI2Vsc2UKLSNkZWZpbmUgT1NMX1NZU1VQVElNRV9TVVBQT1JUIHRydWUKLSNlbmRpZgkJCQkvKiBPU0xfU1lTVVBUSU1FICovCisjZGVmaW5lIFNFTEVDVF9CVVNfV1JJVEUob3NoLCBtbWFwX29wLCBidXNfb3ApIG1tYXBfb3AKKyNkZWZpbmUgU0VMRUNUX0JVU19SRUFEKG9zaCwgbW1hcF9vcCwgYnVzX29wKSBtbWFwX29wCisjZW5kaWYKIAotI2VuZGlmCQkJCS8qIF9vc2xfaF8gKi8KKy8qIHRoZSBsYXJnZXN0IHJlYXNvbmFibGUgcGFja2V0IGJ1ZmZlciBkcml2ZXIgdXNlcyBmb3IgZXRoZXJuZXQgTVRVIGluIGJ5dGVzICovCisjZGVmaW5lCVBLVEJVRlNaCTIwNDgKKworI2RlZmluZSBPU0xfU1lTVVBUSU1FKCkJCSgodTMyKWppZmZpZXMgKiAoMTAwMCAvIEhaKSkKKyNkZWZpbmUJcHJpbnRmKGZtdCwgYXJncy4uLikJcHJpbnRrKGZtdCAsICMjIGFyZ3MpCisjaWZkZWYgQlJDTV9GVUxMTUFDCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CS8qIGZvciB2c24vcHJpbnRmJ3MgKi8KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4JLyogZm9yIG1lbSosIHN0ciogKi8KKyNlbmRpZgorLyogYmNvcHknczogTGludXgga2VybmVsIGRvZXNuJ3QgcHJvdmlkZSB0aGVzZSAoYW55bW9yZSkgKi8KKyNkZWZpbmUJYmNvcHkoc3JjLCBkc3QsIGxlbikJbWVtY3B5KChkc3QpLCAoc3JjKSwgKGxlbikpCisKKy8qIHJlZ2lzdGVyIGFjY2VzcyBtYWNyb3MgKi8KKyNpZm5kZWYgSUxfQklHRU5ESUFOCisjaWZuZGVmIF9fbWlwc19fCisjZGVmaW5lIFJfUkVHKG9zaCwgcikgKFwKKwlTRUxFQ1RfQlVTX1JFQUQob3NoLCBzaXplb2YoKihyKSkgPT0gc2l6ZW9mKHU4KSA/IFwKKwlyZWFkYigodm9sYXRpbGUgdTgqKShyKSkgOiBcCisJc2l6ZW9mKCoocikpID09IHNpemVvZih1MTYpID8gcmVhZHcoKHZvbGF0aWxlIHUxNiopKHIpKSA6IFwKKwlyZWFkbCgodm9sYXRpbGUgdTMyKikocikpLCBPU0xfUkVBRF9SRUcob3NoLCByKSkgXAorKQorI2Vsc2UJCQkJLyogX19taXBzX18gKi8KKyNkZWZpbmUgUl9SRUcob3NoLCByKSAoXAorCVNFTEVDVF9CVVNfUkVBRChvc2gsIFwKKwkJKHsgXAorCQkJX190eXBlb2YoKihyKSkgX19vc2xfdjsgXAorCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiKTsgXAorCQkJc3dpdGNoIChzaXplb2YoKihyKSkpIHsgXAorCQkJY2FzZSBzaXplb2YodTgpOiBcCisJCQkJX19vc2xfdiA9IHJlYWRiKCh2b2xhdGlsZSB1OCopKHIpKTsgXAorCQkJCWJyZWFrOyBcCisJCQljYXNlIHNpemVvZih1MTYpOiBcCisJCQkJX19vc2xfdiA9IHJlYWR3KCh2b2xhdGlsZSB1MTYqKShyKSk7IFwKKwkJCQlicmVhazsgXAorCQkJY2FzZSBzaXplb2YodTMyKTogXAorCQkJCV9fb3NsX3YgPSBcCisJCQkJcmVhZGwoKHZvbGF0aWxlIHUzMiopKHIpKTsgXAorCQkJCWJyZWFrOyBcCisJCQl9IFwKKwkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jIik7IFwKKwkJCV9fb3NsX3Y7IFwKKwkJfSksIFwKKwkJKHsgXAorCQkJX190eXBlb2YoKihyKSkgX19vc2xfdjsgXAorCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiKTsgXAorCQkJX19vc2xfdiA9IE9TTF9SRUFEX1JFRyhvc2gsIHIpOyBcCisJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOyBcCisJCQlfX29zbF92OyBcCisJCX0pKSBcCispCisjZW5kaWYJCQkJLyogX19taXBzX18gKi8KKworI2RlZmluZSBXX1JFRyhvc2gsIHIsIHYpIGRvIHsgXAorCVNFTEVDVF9CVVNfV1JJVEUob3NoLCAgXAorCQlzd2l0Y2ggKHNpemVvZigqKHIpKSkgeyBcCisJCWNhc2Ugc2l6ZW9mKHU4KTogXAorCQkJd3JpdGViKCh1OCkodiksICh2b2xhdGlsZSB1OCopKHIpKTsgYnJlYWs7IFwKKwkJY2FzZSBzaXplb2YodTE2KTogXAorCQkJd3JpdGV3KCh1MTYpKHYpLCAodm9sYXRpbGUgdTE2KikocikpOyBicmVhazsgXAorCQljYXNlIHNpemVvZih1MzIpOiBcCisJCQl3cml0ZWwoKHUzMikodiksICh2b2xhdGlsZSB1MzIqKShyKSk7IGJyZWFrOyBcCisJCX0sIFwKKwkJKE9TTF9XUklURV9SRUcob3NoLCByLCB2KSkpOyBcCisJfSB3aGlsZSAoMCkKKyNlbHNlCQkJCS8qIElMX0JJR0VORElBTiAqLworI2RlZmluZSBSX1JFRyhvc2gsIHIpIChcCisJU0VMRUNUX0JVU19SRUFEKG9zaCwgXAorCQkoeyBcCisJCQlfX3R5cGVvZigqKHIpKSBfX29zbF92OyBcCisJCQlzd2l0Y2ggKHNpemVvZigqKHIpKSkgeyBcCisJCQljYXNlIHNpemVvZih1OCk6IFwKKwkJCQlfX29zbF92ID0gXAorCQkJCXJlYWRiKCh2b2xhdGlsZSB1OCopKChyKV4zKSk7IFwKKwkJCQlicmVhazsgXAorCQkJY2FzZSBzaXplb2YodTE2KTogXAorCQkJCV9fb3NsX3YgPSBcCisJCQkJcmVhZHcoKHZvbGF0aWxlIHUxNiopKChyKV4yKSk7IFwKKwkJCQlicmVhazsgXAorCQkJY2FzZSBzaXplb2YodTMyKTogXAorCQkJCV9fb3NsX3YgPSByZWFkbCgodm9sYXRpbGUgdTMyKikocikpOyBcCisJCQkJYnJlYWs7IFwKKwkJCX0gXAorCQkJX19vc2xfdjsgXAorCQl9KSwgXAorCQlPU0xfUkVBRF9SRUcob3NoLCByKSkgXAorKQorI2RlZmluZSBXX1JFRyhvc2gsIHIsIHYpIGRvIHsgXAorCVNFTEVDVF9CVVNfV1JJVEUob3NoLCAgXAorCQlzd2l0Y2ggKHNpemVvZigqKHIpKSkgeyBcCisJCWNhc2Ugc2l6ZW9mKHU4KToJXAorCQkJd3JpdGViKCh1OCkodiksIFwKKwkJCSh2b2xhdGlsZSB1OCopKChyKV4zKSk7IGJyZWFrOyBcCisJCWNhc2Ugc2l6ZW9mKHUxNik6CVwKKwkJCXdyaXRldygodTE2KSh2KSwgXAorCQkJKHZvbGF0aWxlIHUxNiopKChyKV4yKSk7IGJyZWFrOyBcCisJCWNhc2Ugc2l6ZW9mKHUzMik6CVwKKwkJCXdyaXRlbCgodTMyKSh2KSwgXAorCQkJKHZvbGF0aWxlIHUzMiopKHIpKTsgYnJlYWs7IFwKKwkJfSwgXAorCQkoT1NMX1dSSVRFX1JFRyhvc2gsIHIsIHYpKSk7IFwKKwl9IHdoaWxlICgwKQorI2VuZGlmCQkJCS8qIElMX0JJR0VORElBTiAqLworCisjZGVmaW5lCWJjb3B5KHNyYywgZHN0LCBsZW4pCW1lbWNweSgoZHN0KSwgKHNyYyksIChsZW4pKQorCisvKiBwYWNrZXQgcHJpbWl0aXZlcyAqLworZXh0ZXJuIHN0cnVjdCBza19idWZmICpwa3RfYnVmX2dldF9za2Ioc3RydWN0IG9zbF9pbmZvICpvc2gsIHVpbnQgbGVuKTsKK2V4dGVybiB2b2lkIHBrdF9idWZfZnJlZV9za2Ioc3RydWN0IG9zbF9pbmZvICpvc2gsIHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgc2VuZCk7CisKKyNlbmRpZiAvKiBfb3NsX2hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvcHJvdG8vZXRoZXJuZXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9wcm90by9ldGhlcm5ldC5oCmluZGV4IGNjMTdiNDIuLjU2NzQwN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9wcm90by9ldGhlcm5ldC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9wcm90by9ldGhlcm5ldC5oCkBAIC0xNywyOCArMTcsMjIgQEAKICNpZm5kZWYgX05FVF9FVEhFUk5FVF9IXwogI2RlZmluZSBfTkVUX0VUSEVSTkVUX0hfCiAKKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorCiAjaW5jbHVkZSA8cGFja2VkX3NlY3Rpb25fc3RhcnQuaD4KIAotI2RlZmluZQlFVEhFUl9BRERSX0xFTgkJNgogI2RlZmluZQlFVEhFUl9UWVBFX0xFTgkJMgogI2RlZmluZQlFVEhFUl9DUkNfTEVOCQk0Ci0jZGVmaW5lCUVUSEVSX0hEUl9MRU4JCShFVEhFUl9BRERSX0xFTiAqIDIgKyBFVEhFUl9UWVBFX0xFTikKICNkZWZpbmUJRVRIRVJfTUlOX0xFTgkJNjQKICNkZWZpbmUJRVRIRVJfTUlOX0RBVEEJCTQ2CiAjZGVmaW5lCUVUSEVSX01BWF9MRU4JCTE1MTgKICNkZWZpbmUJRVRIRVJfTUFYX0RBVEEJCTE1MDAKIAotI2RlZmluZSBFVEhFUl9UWVBFX01JTgkJMHgwNjAwCi0jZGVmaW5lCUVUSEVSX1RZUEVfSVAJCTB4MDgwMAotI2RlZmluZSBFVEhFUl9UWVBFX0FSUAkJMHgwODA2Ci0jZGVmaW5lIEVUSEVSX1RZUEVfODAyMVEJMHg4MTAwCiAjZGVmaW5lCUVUSEVSX1RZUEVfQlJDTQkJMHg4ODZjCi0jZGVmaW5lCUVUSEVSX1RZUEVfODAyXzFYCTB4ODg4ZQotI2RlZmluZQlFVEhFUl9UWVBFXzgwMl8xWF9QUkVBVVRIIDB4ODhjNwogCi0jZGVmaW5lIEVUSEVSX0RFU1RfT0ZGU0VUCSgwICogRVRIRVJfQUREUl9MRU4pCi0jZGVmaW5lIEVUSEVSX1NSQ19PRkZTRVQJKDEgKiBFVEhFUl9BRERSX0xFTikKLSNkZWZpbmUgRVRIRVJfVFlQRV9PRkZTRVQJKDIgKiBFVEhFUl9BRERSX0xFTikKKyNkZWZpbmUgRVRIRVJfREVTVF9PRkZTRVQJKDAgKiBFVEhfQUxFTikKKyNkZWZpbmUgRVRIRVJfU1JDX09GRlNFVAkoMSAqIEVUSF9BTEVOKQorI2RlZmluZSBFVEhFUl9UWVBFX09GRlNFVAkoMiAqIEVUSF9BTEVOKQogCiAjZGVmaW5lCUVUSEVSX0lTX1ZBTElEX0xFTihmb28pCVwKIAkoKGZvbykgPj0gRVRIRVJfTUlOX0xFTiAmJiAoZm9vKSA8PSBFVEhFUl9NQVhfTEVOKQpAQCAtNTMsNTAgKzQ3LDE4IEBACiB9CiAKIEJXTF9QUkVfUEFDS0VEX1NUUlVDVCBzdHJ1Y3QgZXRoZXJfaGVhZGVyIHsKLQl1OCBldGhlcl9kaG9zdFtFVEhFUl9BRERSX0xFTl07Ci0JdTggZXRoZXJfc2hvc3RbRVRIRVJfQUREUl9MRU5dOworCXU4IGV0aGVyX2Rob3N0W0VUSF9BTEVOXTsKKwl1OCBldGhlcl9zaG9zdFtFVEhfQUxFTl07CiAJdTE2IGV0aGVyX3R5cGU7CiB9IEJXTF9QT1NUX1BBQ0tFRF9TVFJVQ1Q7CiAKIEJXTF9QUkVfUEFDS0VEX1NUUlVDVCBzdHJ1Y3QgZXRoZXJfYWRkciB7Ci0JdTggb2N0ZXRbRVRIRVJfQUREUl9MRU5dOworCXU4IG9jdGV0W0VUSF9BTEVOXTsKIH0gQldMX1BPU1RfUEFDS0VEX1NUUlVDVDsKIAotI2RlZmluZSBFVEhFUl9TRVRfTE9DQUxBRERSKGVhKQkoKCh1OCAqKShlYSkpWzBdID0gKCgodTggKikoZWEpKVswXSB8IDIpKQotI2RlZmluZSBFVEhFUl9JU19MT0NBTEFERFIoZWEpIAkoKCh1OCAqKShlYSkpWzBdICYgMikKLSNkZWZpbmUgRVRIRVJfQ0xSX0xPQ0FMQUREUihlYSkJKCgodTggKikoZWEpKVswXSA9IFwKLQkoKCh1OCAqKShlYSkpWzBdICYgMHhkKSkKLSNkZWZpbmUgRVRIRVJfVE9HR0xFX0xPQ0FMQUREUihlYSkJKCgodTggKikoZWEpKVswXSA9IFwKLQkoKCh1OCAqKShlYSkpWzBdIF4gMikpCi0KICNkZWZpbmUgRVRIRVJfU0VUX1VOSUNBU1QoZWEpCSgoKHU4ICopKGVhKSlbMF0gPSAoKCh1OCAqKShlYSkpWzBdICYgfjEpKQogCi0jZGVmaW5lIEVUSEVSX0lTTVVMVEkoZWEpICgoKGNvbnN0IHU4ICopKGVhKSlbMF0gJiAxKQotCi0jZGVmaW5lCWV0aGVyX2NtcChhLCBiKQkoISgoKHNob3J0ICopYSlbMF0gPT0gKChzaG9ydCAqKWIpWzBdKSB8IFwKLQkJCSAhKCgoc2hvcnQgKilhKVsxXSA9PSAoKHNob3J0ICopYilbMV0pIHwgXAotCQkJICEoKChzaG9ydCAqKWEpWzJdID09ICgoc2hvcnQgKiliKVsyXSkpCi0KLSNkZWZpbmUJZXRoZXJfY29weShzLCBkKSB7IFwKLQkJKChzaG9ydCAqKWQpWzBdID0gKChzaG9ydCAqKXMpWzBdOyBcCi0JCSgoc2hvcnQgKilkKVsxXSA9ICgoc2hvcnQgKilzKVsxXTsgXAotCQkoKHNob3J0ICopZClbMl0gPSAoKHNob3J0ICopcylbMl07IH0KLQogc3RhdGljIGNvbnN0IHN0cnVjdCBldGhlcl9hZGRyIGV0aGVyX2JjYXN0ID0geyB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX0gfTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZXRoZXJfYWRkciBldGhlcl9udWxsID0geyB7MCwgMCwgMCwgMCwgMCwgMH0gfTsKLQotI2RlZmluZSBFVEhFUl9JU0JDQVNUKGVhKQkoKCgodTggKikoZWEpKVswXSAmCQlcCi0JKCh1OCAqKShlYSkpWzFdICYJCVwKLQkoKHU4ICopKGVhKSlbMl0gJgkJXAotCSgodTggKikoZWEpKVszXSAmCQlcCi0JKCh1OCAqKShlYSkpWzRdICYJCVwKLQkoKHU4ICopKGVhKSlbNV0pID09IDB4ZmYpCi0jZGVmaW5lIEVUSEVSX0lTTlVMTEFERFIoZWEpCSgoKCh1OCAqKShlYSkpWzBdIHwJCVwKLQkoKHU4ICopKGVhKSlbMV0gfAkJXAotCSgodTggKikoZWEpKVsyXSB8CQlcCi0JKCh1OCAqKShlYSkpWzNdIHwJCVwKLQkoKHU4ICopKGVhKSlbNF0gfAkJXAotCSgodTggKikoZWEpKVs1XSkgPT0gMCkKIAogI2RlZmluZSBFVEhFUl9NT1ZFX0hEUihkLCBzKSBcCiBkbyB7IFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9wcm90by93cGEuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9wcm90by93cGEuaAppbmRleCBlYzg0YzlmLi4xMGMyZmI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvcHJvdG8vd3BhLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL3Byb3RvL3dwYS5oCkBAIC0xOSw5NSArMTksNyBAQAogCiAjaW5jbHVkZSA8cHJvdG8vZXRoZXJuZXQuaD4KIAotI2luY2x1ZGUgPHBhY2tlZF9zZWN0aW9uX3N0YXJ0Lmg+Ci0KLSNkZWZpbmUgRE9UMTFfUkNfSU5WQUxJRF9XUEFfSUUJCTEzCi0jZGVmaW5lIERPVDExX1JDX01JQ19GQUlMVVJFCQkxNAotI2RlZmluZSBET1QxMV9SQ180V0hfVElNRU9VVAkJMTUKLSNkZWZpbmUgRE9UMTFfUkNfR1RLX1VQREFURV9USU1FT1VUCTE2Ci0jZGVmaW5lIERPVDExX1JDX1dQQV9JRV9NSVNNQVRDSAkxNwotI2RlZmluZSBET1QxMV9SQ19JTlZBTElEX01DX0NJUEhFUgkxOAotI2RlZmluZSBET1QxMV9SQ19JTlZBTElEX1VDX0NJUEhFUgkxOQotI2RlZmluZSBET1QxMV9SQ19JTlZBTElEX0FLTVAJCTIwCi0jZGVmaW5lIERPVDExX1JDX0JBRF9XUEFfVkVSU0lPTgkyMQotI2RlZmluZSBET1QxMV9SQ19JTlZBTElEX1dQQV9DQVAJMjIKLSNkZWZpbmUgRE9UMTFfUkNfODAyMVhfQVVUSF9GQUlMCTIzCi0KICNkZWZpbmUgV1BBMl9QTUtJRF9MRU4JMTYKLQotdHlwZWRlZiBCV0xfUFJFX1BBQ0tFRF9TVFJVQ1Qgc3RydWN0IHsKLQl1OCB0YWc7Ci0JdTggbGVuZ3RoOwotCXU4IG91aVszXTsKLQl1OCBvdWlfdHlwZTsKLQlCV0xfUFJFX1BBQ0tFRF9TVFJVQ1Qgc3RydWN0IHsKLQkJdTggbG93OwotCQl1OCBoaWdoOwotCX0gQldMX1BPU1RfUEFDS0VEX1NUUlVDVCB2ZXJzaW9uOwotfSBCV0xfUE9TVF9QQUNLRURfU1RSVUNUIHdwYV9pZV9maXhlZF90OwotI2RlZmluZSBXUEFfSUVfT1VJVFlQRV9MRU4JNAotI2RlZmluZSBXUEFfSUVfRklYRURfTEVOCTgKLSNkZWZpbmUgV1BBX0lFX1RBR19GSVhFRF9MRU4JNgotCi10eXBlZGVmIEJXTF9QUkVfUEFDS0VEX1NUUlVDVCBzdHJ1Y3QgewotCXU4IHRhZzsKLQl1OCBsZW5ndGg7Ci0JQldMX1BSRV9QQUNLRURfU1RSVUNUIHN0cnVjdCB7Ci0JCXU4IGxvdzsKLQkJdTggaGlnaDsKLQl9IEJXTF9QT1NUX1BBQ0tFRF9TVFJVQ1QgdmVyc2lvbjsKLX0gQldMX1BPU1RfUEFDS0VEX1NUUlVDVCB3cGFfcnNuX2llX2ZpeGVkX3Q7Ci0jZGVmaW5lIFdQQV9SU05fSUVfRklYRURfTEVOCTQKLSNkZWZpbmUgV1BBX1JTTl9JRV9UQUdfRklYRURfTEVOCTIKLXR5cGVkZWYgdTggd3BhX3Bta2lkX3RbV1BBMl9QTUtJRF9MRU5dOwotCi10eXBlZGVmIEJXTF9QUkVfUEFDS0VEX1NUUlVDVCBzdHJ1Y3QgewotCXU4IG91aVszXTsKLQl1OCB0eXBlOwotfSBCV0xfUE9TVF9QQUNLRURfU1RSVUNUIHdwYV9zdWl0ZV90LCB3cGFfc3VpdGVfbWNhc3RfdDsKLSNkZWZpbmUgV1BBX1NVSVRFX0xFTgk0Ci0KLXR5cGVkZWYgQldMX1BSRV9QQUNLRURfU1RSVUNUIHN0cnVjdCB7Ci0JQldMX1BSRV9QQUNLRURfU1RSVUNUIHN0cnVjdCB7Ci0JCXU4IGxvdzsKLQkJdTggaGlnaDsKLQl9IEJXTF9QT1NUX1BBQ0tFRF9TVFJVQ1QgY291bnQ7Ci0Jd3BhX3N1aXRlX3QgbGlzdFsxXTsKLX0gQldMX1BPU1RfUEFDS0VEX1NUUlVDVCB3cGFfc3VpdGVfdWNhc3RfdCwgd3BhX3N1aXRlX2F1dGhfa2V5X21nbXRfdDsKLSNkZWZpbmUgV1BBX0lFX1NVSVRFX0NPVU5UX0xFTgkyCi10eXBlZGVmIEJXTF9QUkVfUEFDS0VEX1NUUlVDVCBzdHJ1Y3QgewotCUJXTF9QUkVfUEFDS0VEX1NUUlVDVCBzdHJ1Y3QgewotCQl1OCBsb3c7Ci0JCXU4IGhpZ2g7Ci0JfSBCV0xfUE9TVF9QQUNLRURfU1RSVUNUIGNvdW50OwotCXdwYV9wbWtpZF90IGxpc3RbMV07Ci19IEJXTF9QT1NUX1BBQ0tFRF9TVFJVQ1Qgd3BhX3Bta2lkX2xpc3RfdDsKLQotI2RlZmluZSBXUEFfQ0lQSEVSX05PTkUJCTAKLSNkZWZpbmUgV1BBX0NJUEhFUl9XRVBfNDAJMQotI2RlZmluZSBXUEFfQ0lQSEVSX1RLSVAJCTIKLSNkZWZpbmUgV1BBX0NJUEhFUl9BRVNfT0NCCTMKLSNkZWZpbmUgV1BBX0NJUEhFUl9BRVNfQ0NNCTQKLSNkZWZpbmUgV1BBX0NJUEhFUl9XRVBfMTA0CTUKLQotI2RlZmluZSBJU19XUEFfQ0lQSEVSKGNpcGhlcikJKChjaXBoZXIpID09IFdQQV9DSVBIRVJfTk9ORSB8fCBcCi0JCQkJIChjaXBoZXIpID09IFdQQV9DSVBIRVJfV0VQXzQwIHx8IFwKLQkJCQkgKGNpcGhlcikgPT0gV1BBX0NJUEhFUl9XRVBfMTA0IHx8IFwKLQkJCQkgKGNpcGhlcikgPT0gV1BBX0NJUEhFUl9US0lQIHx8IFwKLQkJCQkgKGNpcGhlcikgPT0gV1BBX0NJUEhFUl9BRVNfT0NCIHx8IFwKLQkJCQkgKGNpcGhlcikgPT0gV1BBX0NJUEhFUl9BRVNfQ0NNKQotCi0jZGVmaW5lIFdQQV9US0lQX0NNX0RFVEVDVAk2MAotI2RlZmluZSBXUEFfVEtJUF9DTV9CTE9DSwk2MAotCi0jZGVmaW5lIFJTTl9DQVBfTEVOCQkyCi0KLSNkZWZpbmUgUlNOX0NBUF9QUkVBVVRICQkJMHgwMDAxCi0jZGVmaW5lIFJTTl9DQVBfTk9QQUlSV0lTRQkJMHgwMDAyCi0jZGVmaW5lIFJTTl9DQVBfUFRLX1JFUExBWV9DTlRSX01BU0sJMHgwMDBDCi0jZGVmaW5lIFJTTl9DQVBfUFRLX1JFUExBWV9DTlRSX1NISUZUCTIKLSNkZWZpbmUgUlNOX0NBUF9HVEtfUkVQTEFZX0NOVFJfTUFTSwkweDAwMzAKLSNkZWZpbmUgUlNOX0NBUF9HVEtfUkVQTEFZX0NOVFJfU0hJRlQJNAogI2RlZmluZSBSU05fQ0FQXzFfUkVQTEFZX0NOVFIJCTAKICNkZWZpbmUgUlNOX0NBUF8yX1JFUExBWV9DTlRSUwkJMQogI2RlZmluZSBSU05fQ0FQXzRfUkVQTEFZX0NOVFJTCQkyCkBAIC0xMTgsMTAgKzMwLDQgQEAKICNkZWZpbmUgV1BBX0NBUF9SRVBMQVlfQ05UUl9TSElGVAlSU05fQ0FQX1BUS19SRVBMQVlfQ05UUl9TSElGVAogI2RlZmluZSBXUEFfQ0FQX1JFUExBWV9DTlRSX01BU0sJUlNOX0NBUF9QVEtfUkVQTEFZX0NOVFJfTUFTSwogCi0jZGVmaW5lIFdQQV9DQVBfTEVOCVJTTl9DQVBfTEVOCi0KLSNkZWZpbmUJV1BBX0NBUF9XUEEyX1BSRUFVVEgJCVJTTl9DQVBfUFJFQVVUSAotCi0jaW5jbHVkZSA8cGFja2VkX3NlY3Rpb25fZW5kLmg+Ci0KICNlbmRpZgkJCQkvKiBfcHJvdG9fd3BhX2hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvcnBjX29zbC5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL3JwY19vc2wuaAppbmRleCA0YTI2NDgwLi5jNTlkOWVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvcnBjX29zbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9ycGNfb3NsLmgKQEAgLTE4LDcgKzE4LDcgQEAKICNkZWZpbmUgX3JwY29zbF9oXwogCiB0eXBlZGVmIHN0cnVjdCBycGNfb3NsIHJwY19vc2xfdDsKLWV4dGVybiBycGNfb3NsX3QgKnJwY19vc2xfYXR0YWNoKG9zbF90ICpvc2gpOworZXh0ZXJuIHJwY19vc2xfdCAqcnBjX29zbF9hdHRhY2goc3RydWN0IG9zbF9pbmZvICpvc2gpOwogZXh0ZXJuIHZvaWQgcnBjX29zbF9kZXRhY2gocnBjX29zbF90ICpycGNfb3NoKTsKIAogI2RlZmluZSBSUENfT1NMX0xPQ0socnBjX29zaCkgcnBjX29zbF9sb2NrKChycGNfb3NoKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9zaXV0aWxzLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvc2l1dGlscy5oCmluZGV4IDU3YzM2NTAuLmE5MzUwOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9zaXV0aWxzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL3NpdXRpbHMuaApAQCAtMTksOSArMTksNiBAQAogCiAjaW5jbHVkZSA8aG5kc29jLmg+CiAKLSNpZiAhZGVmaW5lZChXTENfTE9XKQotI2luY2x1ZGUgImJjbV9ycGMuaCIKLSNlbmRpZgogLyoKICAqIERhdGEgc3RydWN0dXJlIHRvIGV4cG9ydCBhbGwgY2hpcCBzcGVjaWZpYyBjb21tb24gdmFyaWFibGVzCiAgKiAgIHB1YmxpYyAocmVhZC1vbmx5KSBwb3J0aW9uIG9mIHNpdXRpbHMgaGFuZGxlIHJldHVybmVkIGJ5IHNpX2F0dGFjaCgpCkBAIC01MCwxOSArNDcsMTIgQEAKIAl1aW50IHNvY2lyZXY7CQkvKiBTT0MgaW50ZXJjb25uZWN0IHJldiAqLwogCWJvb2wgcGNpX3ByMzI0MTQ7CiAKLSNpZiAhZGVmaW5lZChXTENfTE9XKQotCXJwY19pbmZvX3QgKnJwYzsKLSNlbmRpZgogfTsKIAogLyogZm9yIEhJR0hfT05MWSBkcml2ZXIsIHRoZSBzaV90IG11c3QgYmUgd3JpdGFibGUgdG8gYWxsb3cgc3RhdGVzIHN5bmMgZnJvbSBCTUFDIHRvIEhJR0ggZHJpdmVyCiAgKiBmb3IgbW9ub2xpdGhpYyBkcml2ZXIsIGl0IGlzIHJlYWRvbmx5IHRvIHByZXZlbnQgYWNjaWRlbnQgY2hhbmdlCiAgKi8KLSNpZiAhZGVmaW5lZChXTENfTE9XKQotdHlwZWRlZiBzdHJ1Y3Qgc2lfcHViIHNpX3Q7Ci0jZWxzZQogdHlwZWRlZiBjb25zdCBzdHJ1Y3Qgc2lfcHViIHNpX3Q7Ci0jZW5kaWYKIAogLyoKICAqIE1hbnkgb2YgdGhlIHJvdXRpbmVzIGJlbG93IHRha2UgYW4gJ3NpaCcgaGFuZGxlIGFzIHRoZWlyIGZpcnN0IGFyZy4KQEAgLTEyOCw4ICsxMTgsOCBAQAogI2RlZmluZSBHUElPX0NUUkxfRVBBX0VOX01BU0sgMHg0MAogCiAvKiA9PT0gZXhwb3J0ZWQgZnVuY3Rpb25zID09PSAqLwotZXh0ZXJuIHNpX3QgKnNpX2F0dGFjaCh1aW50IHBjaWRldiwgb3NsX3QgKm9zaCwgdm9pZCAqcmVncywgdWludCBidXN0eXBlLAotCQkgICAgICAgdm9pZCAqc2RoLCBjaGFyICoqdmFycywgdWludCAqdmFyc3opOworZXh0ZXJuIHNpX3QgKnNpX2F0dGFjaCh1aW50IHBjaWRldiwgc3RydWN0IG9zbF9pbmZvICpvc2gsIHZvaWQgKnJlZ3MsCisJCSAgICAgICB1aW50IGJ1c3R5cGUsIHZvaWQgKnNkaCwgY2hhciAqKnZhcnMsIHVpbnQgKnZhcnN6KTsKIAogZXh0ZXJuIHZvaWQgc2lfZGV0YWNoKHNpX3QgKnNpaCk7CiBleHRlcm4gYm9vbCBzaV9wY2lfd2FyMTYxNjUoc2lfdCAqc2loKTsKQEAgLTEzOCw3ICsxMjgsNyBAQAogZXh0ZXJuIHVpbnQgc2lfZmxhZyhzaV90ICpzaWgpOwogZXh0ZXJuIHVpbnQgc2lfY29yZWlkeChzaV90ICpzaWgpOwogZXh0ZXJuIHVpbnQgc2lfY29yZXJldihzaV90ICpzaWgpOwotZXh0ZXJuIHZvaWQgKnNpX29zaChzaV90ICpzaWgpOworc3RydWN0IG9zbF9pbmZvICpzaV9vc2goc2lfdCAqc2loKTsKIGV4dGVybiB1aW50IHNpX2NvcmVyZWcoc2lfdCAqc2loLCB1aW50IGNvcmVpZHgsIHVpbnQgcmVnb2ZmLCB1aW50IG1hc2ssCiAJCXVpbnQgdmFsKTsKIGV4dGVybiB2b2lkIHNpX3dyaXRlX3dyYXBwZXJyZWcoc2lfdCAqc2loLCB1MzIgb2Zmc2V0LCB1MzIgdmFsKTsKQEAgLTIyNyw3ICsyMTcsNyBAQAogLyogbWlzYyBzaSBpbmZvIG5lZWRlZCBieSBzb21lIG9mIHRoZSByb3V0aW5lcyAqLwogdHlwZWRlZiBzdHJ1Y3Qgc2lfaW5mbyB7CiAJc3RydWN0IHNpX3B1YiBwdWI7CS8qIGJhY2sgcGxhbmUgcHVibGljIHN0YXRlIChtdXN0IGJlIGZpcnN0IGZpZWxkKSAqLwotCXZvaWQgKm9zaDsJCS8qIG9zbCBvcyBoYW5kbGUgKi8KKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsJCS8qIG9zbCBvcyBoYW5kbGUgKi8KIAl2b2lkICpzZGg7CQkvKiBiY21zZGggaGFuZGxlICovCiAJdWludCBkZXZfY29yZWlkOwkvKiB0aGUgY29yZSBwcm92aWRlcyBkcml2ZXIgZnVuY3Rpb25zICovCiAJdm9pZCAqaW50cl9hcmc7CQkvKiBpbnRlcnJ1cHQgY2FsbGJhY2sgZnVuY3Rpb24gYXJnICovCkBAIC0zMDUsOSArMjk1LDkgQEAKICNkZWZpbmUJSUxQX0RJVl81TUhaCQkwCS8qIElMUCA9IDUgTUh6ICovCiAjZGVmaW5lCUlMUF9ESVZfMU1IWgkJNAkvKiBJTFAgPSAxIE1IeiAqLwogCi0jZGVmaW5lIFBDSShzaSkJCSgoQlVTVFlQRSgoc2kpLT5wdWIuYnVzdHlwZSkgPT0gUENJX0JVUykgJiYJXAorI2RlZmluZSBQQ0koc2kpCQkoKChzaSktPnB1Yi5idXN0eXBlID09IFBDSV9CVVMpICYmCVwKIAkJCSAoKHNpKS0+cHViLmJ1c2NvcmV0eXBlID09IFBDSV9DT1JFX0lEKSkKLSNkZWZpbmUgUENJRShzaSkJKChCVVNUWVBFKChzaSktPnB1Yi5idXN0eXBlKSA9PSBQQ0lfQlVTKSAmJglcCisjZGVmaW5lIFBDSUUoc2kpCSgoKHNpKS0+cHViLmJ1c3R5cGUgPT0gUENJX0JVUykgJiYJXAogCQkJICgoc2kpLT5wdWIuYnVzY29yZXR5cGUgPT0gUENJRV9DT1JFX0lEKSkKICNkZWZpbmUgUENJX0ZPUkNFSFQoc2kpCVwKIAkoUENJRShzaSkgJiYgKHNpLT5wdWIuY2hpcCA9PSBCQ000NzE2X0NISVBfSUQpKQpAQCAtMzQ0LDkgKzMzNCw5IEBACiBjaGFyICpzaV9nZXRudnJhbWZsdmFyKHNpX3QgKnNpaCwgY29uc3QgY2hhciAqbmFtZSk7CiAKIC8qIEFNQkEgSW50ZXJjb25uZWN0IGV4cG9ydGVkIGV4dGVybnMgKi8KLWV4dGVybiBzaV90ICphaV9hdHRhY2godWludCBwY2lkZXYsIG9zbF90ICpvc2gsIHZvaWQgKnJlZ3MsIHVpbnQgYnVzdHlwZSwKLQkJICAgICAgIHZvaWQgKnNkaCwgY2hhciAqKnZhcnMsIHVpbnQgKnZhcnN6KTsKLWV4dGVybiBzaV90ICphaV9rYXR0YWNoKG9zbF90ICpvc2gpOworZXh0ZXJuIHNpX3QgKmFpX2F0dGFjaCh1aW50IHBjaWRldiwgc3RydWN0IG9zbF9pbmZvICpvc2gsIHZvaWQgKnJlZ3MsCisJCSAgICAgICB1aW50IGJ1c3R5cGUsIHZvaWQgKnNkaCwgY2hhciAqKnZhcnMsIHVpbnQgKnZhcnN6KTsKK2V4dGVybiBzaV90ICphaV9rYXR0YWNoKHN0cnVjdCBvc2xfaW5mbyAqb3NoKTsKIGV4dGVybiB2b2lkIGFpX3NjYW4oc2lfdCAqc2loLCB2b2lkICpyZWdzLCB1aW50IGRldmlkKTsKIAogZXh0ZXJuIHVpbnQgYWlfZmxhZyhzaV90ICpzaWgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL3dsaW9jdGwuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS93bGlvY3RsLmgKaW5kZXggOTY4NjZmYi4uOWJlNzkzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL3dsaW9jdGwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvd2xpb2N0bC5oCkBAIC0zMyw4MiArMzMsOSBAQAogI2RlZmluZSBCV0xfREVGQVVMVF9QQUNLSU5HCiAjaW5jbHVkZSA8cGFja2VkX3NlY3Rpb25fc3RhcnQuaD4KIAotLyogTGVnYWN5IHN0cnVjdHVyZSB0byBoZWxwIGtlZXAgYmFja3dhcmQgY29tcGF0aWJsZSB3bCB0b29sIGFuZCB0cmF5IGFwcCAqLwotCi0jZGVmaW5lCUxFR0FDWV9XTF9CU1NfSU5GT19WRVJTSU9OCTEwNwkvKiBvbGRlciB2ZXJzaW9uIG9mIHdsX2Jzc19pbmZvIHN0cnVjdCAqLwotCi10eXBlZGVmIHN0cnVjdCB3bF9ic3NfaW5mb18xMDcgewotCXUzMiB2ZXJzaW9uOwkJLyogdmVyc2lvbiBmaWVsZCAqLwotCXUzMiBsZW5ndGg7CQkvKiBieXRlIGxlbmd0aCBvZiBkYXRhIGluIHRoaXMgcmVjb3JkLAotCQkJCSAqIHN0YXJ0aW5nIGF0IHZlcnNpb24gYW5kIGluY2x1ZGluZyBJRXMKLQkJCQkgKi8KLQlzdHJ1Y3QgZXRoZXJfYWRkciBCU1NJRDsKLQl1MTYgYmVhY29uX3BlcmlvZDsJLyogdW5pdHMgYXJlIEt1c2VjICovCi0JdTE2IGNhcGFiaWxpdHk7CS8qIENhcGFiaWxpdHkgaW5mb3JtYXRpb24gKi8KLQl1OCBTU0lEX2xlbjsKLQl1OCBTU0lEWzMyXTsKLQlzdHJ1Y3QgewotCQl1aW50IGNvdW50OwkvKiAjIHJhdGVzIGluIHRoaXMgc2V0ICovCi0JCXU4IHJhdGVzWzE2XTsJLyogcmF0ZXMgaW4gNTAwa2JwcyB1bml0cyB3L2hpIGJpdCBzZXQgaWYgYmFzaWMgKi8KLQl9IHJhdGVzZXQ7CQkvKiBzdXBwb3J0ZWQgcmF0ZXMgKi8KLQl1OCBjaGFubmVsOwkJLyogQ2hhbm5lbCBuby4gKi8KLQl1MTYgYXRpbV93aW5kb3c7CS8qIHVuaXRzIGFyZSBLdXNlYyAqLwotCXU4IGR0aW1fcGVyaW9kOwkvKiBEVElNIHBlcmlvZCAqLwotCXMxNiBSU1NJOwkJLyogcmVjZWl2ZSBzaWduYWwgc3RyZW5ndGggKGluIGRCbSkgKi8KLQlzOCBwaHlfbm9pc2U7CQkvKiBub2lzZSAoaW4gZEJtKSAqLwotCXUzMiBpZV9sZW5ndGg7CS8qIGJ5dGUgbGVuZ3RoIG9mIEluZm9ybWF0aW9uIEVsZW1lbnRzICovCi0JLyogdmFyaWFibGUgbGVuZ3RoIEluZm9ybWF0aW9uIEVsZW1lbnRzICovCi19IHdsX2Jzc19pbmZvXzEwN190OwotCi0vKgotICogUGVyLUJTUyBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuCi0gKi8KLQotI2RlZmluZQlMRUdBQ1kyX1dMX0JTU19JTkZPX1ZFUlNJT04JMTA4CS8qIG9sZCB2ZXJzaW9uIG9mIHdsX2Jzc19pbmZvIHN0cnVjdCAqLwotCi0vKiBCU1MgaW5mbyBzdHJ1Y3R1cmUKLSAqIEFwcGxpY2F0aW9ucyBNVVNUIENIRUNLIGllX29mZnNldCBmaWVsZCBhbmQgbGVuZ3RoIGZpZWxkIHRvIGFjY2VzcyBJRXMgYW5kCi0gKiBuZXh0IGJzc19pbmZvIHN0cnVjdHVyZSBpbiBhIHZlY3RvciAoaW4gd2xfc2Nhbl9yZXN1bHRzX3QpCi0gKi8KLXR5cGVkZWYgc3RydWN0IHdsX2Jzc19pbmZvXzEwOCB7Ci0JdTMyIHZlcnNpb247CQkvKiB2ZXJzaW9uIGZpZWxkICovCi0JdTMyIGxlbmd0aDsJCS8qIGJ5dGUgbGVuZ3RoIG9mIGRhdGEgaW4gdGhpcyByZWNvcmQsCi0JCQkJICogc3RhcnRpbmcgYXQgdmVyc2lvbiBhbmQgaW5jbHVkaW5nIElFcwotCQkJCSAqLwotCXN0cnVjdCBldGhlcl9hZGRyIEJTU0lEOwotCXUxNiBiZWFjb25fcGVyaW9kOwkvKiB1bml0cyBhcmUgS3VzZWMgKi8KLQl1MTYgY2FwYWJpbGl0eTsJLyogQ2FwYWJpbGl0eSBpbmZvcm1hdGlvbiAqLwotCXU4IFNTSURfbGVuOwotCXU4IFNTSURbMzJdOwotCXN0cnVjdCB7Ci0JCXVpbnQgY291bnQ7CS8qICMgcmF0ZXMgaW4gdGhpcyBzZXQgKi8KLQkJdTggcmF0ZXNbMTZdOwkvKiByYXRlcyBpbiA1MDBrYnBzIHVuaXRzIHcvaGkgYml0IHNldCBpZiBiYXNpYyAqLwotCX0gcmF0ZXNldDsJCS8qIHN1cHBvcnRlZCByYXRlcyAqLwotCWNoYW5zcGVjX3QgY2hhbnNwZWM7CS8qIGNoYW5zcGVjIGZvciBic3MgKi8KLQl1MTYgYXRpbV93aW5kb3c7CS8qIHVuaXRzIGFyZSBLdXNlYyAqLwotCXU4IGR0aW1fcGVyaW9kOwkvKiBEVElNIHBlcmlvZCAqLwotCXMxNiBSU1NJOwkJLyogcmVjZWl2ZSBzaWduYWwgc3RyZW5ndGggKGluIGRCbSkgKi8KLQlzOCBwaHlfbm9pc2U7CQkvKiBub2lzZSAoaW4gZEJtKSAqLwotCi0JdTggbl9jYXA7CQkvKiBCU1MgaXMgODAyLjExTiBDYXBhYmxlICovCi0JdTMyIG5ic3NfY2FwOwkvKiA4MDIuMTFOIEJTUyBDYXBhYmlsaXRpZXMgKGJhc2VkIG9uIEhUX0NBUF8qKSAqLwotCXU4IGN0bF9jaDsJCS8qIDgwMi4xMU4gQlNTIGNvbnRyb2wgY2hhbm5lbCBudW1iZXIgKi8KLQl1MzIgcmVzZXJ2ZWQzMlsxXTsJLyogUmVzZXJ2ZWQgZm9yIGV4cGFuc2lvbiBvZiBCU1MgcHJvcGVydGllcyAqLwotCXU4IGZsYWdzOwkJLyogZmxhZ3MgKi8KLQl1OCByZXNlcnZlZFszXTsJLyogUmVzZXJ2ZWQgZm9yIGV4cGFuc2lvbiBvZiBCU1MgcHJvcGVydGllcyAqLwotCXU4IGJhc2ljX21jc1tNQ1NTRVRfTEVOXTsJLyogODAyLjExTiBCU1MgcmVxdWlyZWQgTUNTIHNldCAqLwotCi0JdTE2IGllX29mZnNldDsJLyogb2Zmc2V0IGF0IHdoaWNoIElFcyBzdGFydCwgZnJvbSBiZWdpbm5pbmcgKi8KLQl1MzIgaWVfbGVuZ3RoOwkvKiBieXRlIGxlbmd0aCBvZiBJbmZvcm1hdGlvbiBFbGVtZW50cyAqLwotCS8qIEFkZCBuZXcgZmllbGRzIGhlcmUgKi8KLQkvKiB2YXJpYWJsZSBsZW5ndGggSW5mb3JtYXRpb24gRWxlbWVudHMgKi8KLX0gd2xfYnNzX2luZm9fMTA4X3Q7Ci0KICNpZmRlZiBCUkNNX0ZVTExNQUMKKwogI2RlZmluZQlXTF9CU1NfSU5GT19WRVJTSU9OCTEwOAkvKiBjdXJyZW50IHZlciBvZiB3bF9ic3NfaW5mbyBzdHJ1Y3QgKi8KLSNlbHNlCi0jZGVmaW5lCVdMX0JTU19JTkZPX1ZFUlNJT04JMTA5CS8qIGN1cnJlbnQgdmVyIG9mIHdsX2Jzc19pbmZvIHN0cnVjdCAqLwotI2VuZGlmCiAKIC8qIEJTUyBpbmZvIHN0cnVjdHVyZQogICogQXBwbGljYXRpb25zIE1VU1QgQ0hFQ0sgaWVfb2Zmc2V0IGZpZWxkIGFuZCBsZW5ndGggZmllbGQgdG8gYWNjZXNzIElFcyBhbmQKQEAgLTE0OCwxMiArNzUsMTQgQEAKIAkvKiBBZGQgbmV3IGZpZWxkcyBoZXJlICovCiAJLyogdmFyaWFibGUgbGVuZ3RoIEluZm9ybWF0aW9uIEVsZW1lbnRzICovCiB9IHdsX2Jzc19pbmZvX3Q7CisjZW5kaWYgLyogQlJDTV9GVUxMTUFDICovCiAKIHR5cGVkZWYgc3RydWN0IHdsY19zc2lkIHsKIAl1MzIgU1NJRF9sZW47CiAJdW5zaWduZWQgY2hhciBTU0lEWzMyXTsKIH0gd2xjX3NzaWRfdDsKIAorI2lmZGVmIEJSQ01fRlVMTE1BQwogdHlwZWRlZiBzdHJ1Y3QgY2hhbl9zY2FuZGF0YSB7CiAJdTggdHhwb3dlcjsKIAl1OCBwYWQ7CkBAIC0zMDgsNiArMjM3LDcgQEAKIAlzdHJ1Y3QgZXRoZXJfYWRkciBic3NpZDsKIAlzdHJ1Y3QgZXRoZXJfYWRkciBtYWM7CiB9IHdsX3Byb2JlX3BhcmFtc190OworI2VuZGlmIC8qIEJSQ01fRlVMTE1BQyAqLwogCiAjZGVmaW5lIFdMX05VTVJBVEVTCQkxNgkvKiBtYXggIyBvZiByYXRlcyBpbiBhIHJhdGVzZXQgKi8KIHR5cGVkZWYgc3RydWN0IHdsX3JhdGVzZXQgewpAQCAtMzE1LDYgKzI0NSw3IEBACiAJdTggcmF0ZXNbV0xfTlVNUkFURVNdOwkvKiByYXRlcyBpbiA1MDBrYnBzIHVuaXRzIHcvaGkgYml0IHNldCBpZiBiYXNpYyAqLwogfSB3bF9yYXRlc2V0X3Q7CiAKKyNpZmRlZiBCUkNNX0ZVTExNQUMKIHR5cGVkZWYgc3RydWN0IHdsX3JhdGVzZXRfYXJncyB7CiAJdTMyIGNvdW50OwkJLyogIyByYXRlcyBpbiB0aGlzIHNldCAqLwogCXU4IHJhdGVzW1dMX05VTVJBVEVTXTsJLyogcmF0ZXMgaW4gNTAwa2JwcyB1bml0cyB3L2hpIGJpdCBzZXQgaWYgYmFzaWMgKi8KQEAgLTM1Miw2ICsyODMsOCBAQAogfSB3bF9qb2luX3BhcmFtc190OwogI2RlZmluZSBXTF9KT0lOX1BBUkFNU19GSVhFRF9TSVpFIAkoc2l6ZW9mKHdsX2pvaW5fcGFyYW1zX3QpIC0gc2l6ZW9mKGNoYW5zcGVjX3QpKQogCisjZW5kaWYgLyogQlJDTV9GVUxMTUFDICovCisKIC8qIGRlZmluZXMgdXNlZCBieSB0aGUgbnJhdGUgaW92YXIgKi8KICNkZWZpbmUgTlJBVEVfTUNTX0lOVVNFCTB4MDAwMDAwODAJLyogTVNDIGluIHVzZSxpbmRpY2F0ZXMgYjAtNiBob2xkcyBhbiBtY3MgKi8KICNkZWZpbmUgTlJBVEVfUkFURV9NQVNLIDB4MDAwMDAwN2YJLyogcmF0ZS9tY3MgdmFsdWUgKi8KQEAgLTM5MSw2ICszMjQsNyBAQAogCiAjZGVmaW5lIEhJR0hFU1RfU0lOR0xFX1NUUkVBTV9NQ1MJNwkvKiBNQ1MgdmFsdWVzIGdyZWF0ZXIgdGhhbiB0aGlzIGVuYWJsZSBtdWx0aXBsZSBzdHJlYW1zICovCiAKKyNpZmRlZiBCUkNNX0ZVTExNQUMKICNkZWZpbmUgTUFYX0NDQV9DSEFOTkVMUyAzOAkvKiBNYXggbnVtYmVyIG9mIDIwIE1oeiB3aWRlIGNoYW5uZWxzICovCiAjZGVmaW5lIE1BWF9DQ0FfU0VDUyAgICAgNjAJLyogQ0NBIGtlZXBzIHRoaXMgbWFueSBzZWNvbmRzIGhpc3RvcnkgKi8KIApAQCAtNDI4LDggKzM2MiwxMSBAQAogCWNjYV9jb25nZXN0X3Qgc2Vjc1sxXTsJLyogRGF0YSAqLwogfSBjY2FfY29uZ2VzdF9jaGFubmVsX3JlcV90OwogCisjZW5kaWYgLyogQlJDTV9GVUxMTUFDICovCisKICNkZWZpbmUgV0xDX0NOVFJZX0JVRl9TWgk0CS8qIENvdW50cnkgc3RyaW5nIGlzIDMgYnl0ZXMgKyBOVUwgKi8KIAorI2lmZGVmIEJSQ01fRlVMTE1BQwogdHlwZWRlZiBzdHJ1Y3Qgd2xfY291bnRyeSB7CiAJY2hhciBjb3VudHJ5X2FiYnJldltXTENfQ05UUllfQlVGX1NaXTsJLyogbnVsLXRlcm1pbmF0ZWQgY291bnRyeSBjb2RlIHVzZWQgaW4KIAkJCQkJCSAqIHRoZSBDb3VudHJ5IElFCkBAIC01MTYsNiArNDUzLDcgQEAKIAl3bF9ybV9yZXBfZWx0X3QgcmVwWzFdOwkvKiB2YXJpYWJsZSBsZW5ndGggYmxvY2sgb2YgcmVwb3J0cyAqLwogfSB3bF9ybV9yZXBfdDsKICNkZWZpbmUgV0xfUk1fUkVQX0ZJWEVEX0xFTgk4CisjZW5kaWYgLyogQlJDTV9GVUxMTUFDICovCiAKIC8qIEVudW1lcmF0ZSBjcnlwdG8gYWxnb3JpdGhtcyAqLwogI2RlZmluZQlDUllQVE9fQUxHT19PRkYJCQkwCkBAIC02MjEsMjggKzU1OSw2IEBACiAJdTggYWN0aXZlaGk7CiB9IHdsX2xlZF9pbmZvX3Q7CiAKLS8qIGZsYWdzICovCi0jZGVmaW5lIFdMQ19BU1NPQ19SRVFfSVNfUkVBU1NPQyAweDAxCS8qIGFzc29jIHJlcSB3YXMgYWN0dWFsbHkgYSByZWFzc29jICovCi0KLS8qIHNyb20gcmVhZC93cml0ZSBzdHJ1Y3QgcGFzc2VkIHRocm91Z2ggaW9jdGwgKi8KLXR5cGVkZWYgc3RydWN0IHsKLQl1aW50IGJ5dGVvZmY7CQkvKiBieXRlIG9mZnNldCAqLwotCXVpbnQgbmJ5dGVzOwkJLyogbnVtYmVyIG9mIGJ5dGVzICovCi0JdTE2IGJ1ZlsxXTsKLX0gc3JvbV9yd190OwotCi0vKiBzaW1pbGFyIGNpcyAoc3JvbSBvciBvdHApIHN0cnVjdCBbaW92YXI6IG1heSBub3QgYmUgYWxpZ25lZF0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLQl1MzIgc291cmNlOwkJLyogY2lzIHNvdXJjZSAqLwotCXUzMiBieXRlb2ZmOwkJLyogYnl0ZSBvZmZzZXQgKi8KLQl1MzIgbmJ5dGVzOwkJLyogbnVtYmVyIG9mIGJ5dGVzICovCi0JLyogZGF0YSBmb2xsb3dzIGhlcmUgKi8KLX0gY2lzX3J3X3Q7Ci0KLSNkZWZpbmUgV0xDX0NJU19ERUZBVUxUCTAJLyogYnVpbHQtaW4gZGVmYXVsdCAqLwotI2RlZmluZSBXTENfQ0lTX1NST00JMQkvKiBzb3VyY2UgaXMgc3Byb20gKi8KLSNkZWZpbmUgV0xDX0NJU19PVFAJMgkvKiBzb3VyY2UgaXMgb3RwICovCi0KIC8qIFJfUkVHIGFuZCBXX1JFRyBzdHJ1Y3QgcGFzc2VkIHRocm91Z2ggaW9jdGwgKi8KIHR5cGVkZWYgc3RydWN0IHsKIAl1MzIgYnl0ZW9mZjsJCS8qIGJ5dGUgb2Zmc2V0IG9mIHRoZSBmaWVsZCBpbiBkMTFyZWdzX3QgKi8KQEAgLTY1MSwxMDIgKzU2NywxNCBAQAogCXVpbnQgYmFuZDsJCS8qIGJhbmQgKG9wdGlvbmFsKSAqLwogfSByd19yZWdfdDsKIAotLyogU3RydWN0dXJlIHVzZWQgYnkgR0VUL1NFVF9BVFRFTiBpb2N0bHMgLSBpdCBjb250cm9scyBwb3dlciBpbiBiL2ctYmFuZCAqLwotLyogUENMIC0gUG93ZXIgQ29udHJvbCBMb29wICovCi0vKiBjdXJyZW50IGdhaW4gc2V0dGluZyBpcyByZXBsYWNlZCBieSB1c2VyIGlucHV0ICovCi0jZGVmaW5lIFdMX0FUVEVOX0FQUF9JTlBVVF9QQ0xfT0ZGCTAJLyogdHVybiBvZmYgUENMLCBhcHBseSBzdXBwbGllZCBpbnB1dCAqLwotI2RlZmluZSBXTF9BVFRFTl9QQ0xfT04JCQkxCS8qIHR1cm4gb24gUENMICovCi0vKiBjdXJyZW50IGdhaW4gc2V0dGluZyBpcyBtYWludGFpbmVkICovCi0jZGVmaW5lIFdMX0FUVEVOX1BDTF9PRkYJCTIJLyogdHVybiBvZmYgUENMLiAqLwogCi10eXBlZGVmIHN0cnVjdCB7Ci0JdTE2IGF1dG9fY3RybDsJLyogV0xfQVRURU5fWFggKi8KLQl1MTYgYmI7CQkvKiBCYXNlYmFuZCBhdHRlbnVhdGlvbiAqLwotCXUxNiByYWRpbzsJCS8qIFJhZGlvIGF0dGVudWF0aW9uICovCi0JdTE2IHR4Y3RsMTsJCS8qIFJhZGlvIFRYX0NUTDEgdmFsdWUgKi8KLX0gYXR0ZW5fdDsKLQotLyogUGVyLUFDIHJldHJ5IHBhcmFtZXRlcnMgKi8KLXN0cnVjdCB3bWVfdHhfcGFyYW1zX3MgewotCXU4IHNob3J0X3JldHJ5OwotCXU4IHNob3J0X2ZhbGxiYWNrOwotCXU4IGxvbmdfcmV0cnk7Ci0JdTggbG9uZ19mYWxsYmFjazsKLQl1MTYgbWF4X3JhdGU7CS8qIEluIHVuaXRzIG9mIDUxMiBLYnBzICovCi19OwotCi10eXBlZGVmIHN0cnVjdCB3bWVfdHhfcGFyYW1zX3Mgd21lX3R4X3BhcmFtc190OwotCi0jZGVmaW5lIFdMX1dNRV9UWF9QQVJBTVNfSU9fQllURVMgKHNpemVvZih3bWVfdHhfcGFyYW1zX3QpICogQUNfQ09VTlQpCi0KLS8qIGRlZmluZXMgdXNlZCBieSBwb3dlcmlkeCBpb3ZhciAtIGl0IGNvbnRyb2xzIHBvd2VyIGluIGEtYmFuZCAqLwotLyogY3VycmVudCBnYWluIHNldHRpbmcgaXMgbWFpbnRhaW5lZCAqLwotI2RlZmluZSBXTF9QV1JJRFhfUENMX09GRgktMgkvKiB0dXJuIG9mZiBQQ0wuICAqLwotI2RlZmluZSBXTF9QV1JJRFhfUENMX09OCS0xCS8qIHR1cm4gb24gUENMICovCi0jZGVmaW5lIFdMX1BXUklEWF9MT1dFUl9MSU1JVAktMgkvKiBsb3dlciBsaW1pdCAqLwotI2RlZmluZSBXTF9QV1JJRFhfVVBQRVJfTElNSVQJNjMJLyogdXBwZXIgbGltaXQgKi8KLS8qIHZhbHVlID49IDAgY2F1c2VzCi0gKgktIGlucHV0IHRvIGJlIHNldCB0byB0aGF0IHZhbHVlCi0gKgktIFBDTCB0byBiZSBvZmYKLSAqLwotCi0vKiBVc2VkIHRvIGdldCBzcGVjaWZpYyBsaW5rL2FjIHBhcmFtZXRlcnMgKi8KLXR5cGVkZWYgc3RydWN0IHsKLQlpbnQgYWM7Ci0JdTggdmFsOwotCXN0cnVjdCBldGhlcl9hZGRyIGVhOwotfSBsaW5rX3ZhbF90OwotCi0jZGVmaW5lIEJDTV9NQUNfU1RBVFVTX0lORElDQVRJT04JKDB4NDAwMTAyMDBMKQotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdTE2IHZlcjsJCS8qIHZlcnNpb24gb2YgdGhpcyBzdHJ1Y3QgKi8KLQl1MTYgbGVuOwkJLyogbGVuZ3RoIGluIGJ5dGVzIG9mIHRoaXMgc3RydWN0dXJlICovCi0JdTE2IGNhcDsJCS8qIHN0YSdzIGFkdmVydGlzZWQgY2FwYWJpbGl0aWVzICovCi0JdTMyIGZsYWdzOwkJLyogZmxhZ3MgZGVmaW5lZCBiZWxvdyAqLwotCXUzMiBpZGxlOwkJLyogdGltZSBzaW5jZSBkYXRhIHBrdCByeCdkIGZyb20gc3RhICovCi0Jc3RydWN0IGV0aGVyX2FkZHIgZWE7CS8qIFN0YXRpb24gYWRkcmVzcyAqLwotCXdsX3JhdGVzZXRfdCByYXRlc2V0OwkvKiByYXRlc2V0IGluIHVzZSAqLwotCXUzMiBpbjsJCS8qIHNlY29uZHMgZWxhcHNlZCBzaW5jZSBhc3NvY2lhdGVkICovCi0JdTMyIGxpc3Rlbl9pbnRlcnZhbF9pbm1zOwkvKiBNaW4gTGlzdGVuIGludGVydmFsIGluIG1zIGZvciB0aGlzIFNUQSAqLwotCXUzMiB0eF9wa3RzOwkJLyogIyBvZiBwYWNrZXRzIHRyYW5zbWl0dGVkICovCi0JdTMyIHR4X2ZhaWx1cmVzOwkvKiAjIG9mIHBhY2tldHMgZmFpbGVkICovCi0JdTMyIHJ4X3VjYXN0X3BrdHM7CS8qICMgb2YgdW5pY2FzdCBwYWNrZXRzIHJlY2VpdmVkICovCi0JdTMyIHJ4X21jYXN0X3BrdHM7CS8qICMgb2YgbXVsdGljYXN0IHBhY2tldHMgcmVjZWl2ZWQgKi8KLQl1MzIgdHhfcmF0ZTsJCS8qIFJhdGUgb2YgbGFzdCBzdWNjZXNzZnVsIHR4IGZyYW1lICovCi0JdTMyIHJ4X3JhdGU7CQkvKiBSYXRlIG9mIGxhc3Qgc3VjY2Vzc2Z1bCByeCBmcmFtZSAqLwotCXUzMiByeF9kZWNyeXB0X3N1Y2NlZWRzOwkvKiAjIG9mIHBhY2tldCBkZWNyeXB0ZWQgc3VjY2Vzc2Z1bGx5ICovCi0JdTMyIHJ4X2RlY3J5cHRfZmFpbHVyZXM7CS8qICMgb2YgcGFja2V0IGRlY3J5cHRlZCB1bnN1Y2Nlc3NmdWxseSAqLwotfSBzdGFfaW5mb190OwotCi0jZGVmaW5lIFdMX09MRF9TVEFJTkZPX1NJWkUJb2Zmc2V0b2Yoc3RhX2luZm9fdCwgdHhfcGt0cykKLQotI2RlZmluZSBXTF9TVEFfVkVSCQkzCi0KLS8qIEZsYWdzIGZvciBzdGFfaW5mb190IGluZGljYXRpbmcgcHJvcGVydGllcyBvZiBTVEEgKi8KLSNkZWZpbmUgV0xfU1RBX0JSQ00JCTB4MQkvKiBSdW5uaW5nIGEgQnJvYWRjb20gZHJpdmVyICovCi0jZGVmaW5lIFdMX1NUQV9XTUUJCTB4MgkvKiBXTU0gYXNzb2NpYXRpb24gKi8KLSNkZWZpbmUgV0xfU1RBX0FCQ0FQCQkweDQKLSNkZWZpbmUgV0xfU1RBX0FVVEhFCQkweDgJLyogQXV0aGVudGljYXRlZCAqLwotI2RlZmluZSBXTF9TVEFfQVNTT0MJCTB4MTAJLyogQXNzb2NpYXRlZCAqLwotI2RlZmluZSBXTF9TVEFfQVVUSE8JCTB4MjAJLyogQXV0aG9yaXplZCAqLwotI2RlZmluZSBXTF9TVEFfV0RTCQkweDQwCS8qIFdpcmVsZXNzIERpc3RyaWJ1dGlvbiBTeXN0ZW0gKi8KLSNkZWZpbmUgV0xfU1RBX1dEU19MSU5LVVAJMHg4MAkvKiBXRFMgdHJhZmZpYy9wcm9iZXMgZmxvd2luZyBwcm9wZXJseSAqLwotI2RlZmluZSBXTF9TVEFfUFMJCTB4MTAwCS8qIFNUQSBpcyBpbiBwb3dlciBzYXZlIG1vZGUgZnJvbSBBUCdzIHZpZXdwb2ludCAqLwotI2RlZmluZSBXTF9TVEFfQVBTRF9CRQkJMHgyMDAJLyogQVBTRCBkZWx2L3RyaWdnZXIgZm9yIEFDX0JFIGlzIGRlZmF1bHQgZW5hYmxlZCAqLwotI2RlZmluZSBXTF9TVEFfQVBTRF9CSwkJMHg0MDAJLyogQVBTRCBkZWx2L3RyaWdnZXIgZm9yIEFDX0JLIGlzIGRlZmF1bHQgZW5hYmxlZCAqLwotI2RlZmluZSBXTF9TVEFfQVBTRF9WSQkJMHg4MDAJLyogQVBTRCBkZWx2L3RyaWdnZXIgZm9yIEFDX1ZJIGlzIGRlZmF1bHQgZW5hYmxlZCAqLwotI2RlZmluZSBXTF9TVEFfQVBTRF9WTwkJMHgxMDAwCS8qIEFQU0QgZGVsdi90cmlnZ2VyIGZvciBBQ19WTyBpcyBkZWZhdWx0IGVuYWJsZWQgKi8KLSNkZWZpbmUgV0xfU1RBX05fQ0FQCQkweDIwMDAJLyogU1RBIDgwMi4xMW4gY2FwYWJsZSAqLwotI2RlZmluZSBXTF9TVEFfU0NCU1RBVFMJCTB4NDAwMAkvKiBQZXIgU1RBIGRlYnVnIHN0YXRzICovCi0KLSNkZWZpbmUgV0xfV0RTX0xJTktVUAkJV0xfU1RBX1dEU19MSU5LVVAJLyogZGVwcmVjYXRlZCAqLwotCisjaWZkZWYgQlJDTV9GVUxMTUFDCiAvKiBVc2VkIHRvIGdldCBzcGVjaWZpYyBTVEEgcGFyYW1ldGVycyAqLwogdHlwZWRlZiBzdHJ1Y3QgewogCXUzMiB2YWw7CiAJc3RydWN0IGV0aGVyX2FkZHIgZWE7CiB9IHNjYl92YWxfdDsKKyNlbmRpZiAvKiBCUkNNX0ZVTExNQUMgKi8KIAogLyogY2hhbm5lbCBlbmNvZGluZyAqLwogdHlwZWRlZiBzdHJ1Y3QgY2hhbm5lbF9pbmZvIHsKQEAgLTc3MCw2ICs1OTgsNyBAQAogCXVpbnQgcnhfb2Nhc3RfZ29vZF9wa3Q7CS8qIHVuaWNhc3QgcGFja2V0cyBkZXN0aW5lZCBmb3Igb3RoZXJzICovCiB9IGdldF9wa3RjbnRfdDsKIAorI2lmZGVmIEJSQ01fRlVMTE1BQwogLyogTGludXggbmV0d29yayBkcml2ZXIgaW9jdGwgZW5jb2RpbmcgKi8KIHR5cGVkZWYgc3RydWN0IHdsX2lvY3RsIHsKIAl1aW50IGNtZDsJCS8qIGNvbW1vbiBpb2N0bCBkZWZpbml0aW9uICovCkBAIC03NzksMTEgKzYwOCw4IEBACiAJdWludCB1c2VkOwkJLyogYnl0ZXMgcmVhZCBvciB3cml0dGVuIChvcHRpb25hbCkgKi8KIAl1aW50IG5lZWRlZDsJCS8qIGJ5dGVzIG5lZWRlZCAob3B0aW9uYWwpICovCiB9IHdsX2lvY3RsX3Q7CisjZW5kaWYgLyogQlJDTV9GVUxMTUFDICovCiAKLS8qIHJlZmVyZW5jZSB0byB3bF9pb2N0bF90IHN0cnVjdCB1c2VkIGJ5IHVzZXJtb2RlIGRyaXZlciAqLwotI2RlZmluZSBpb2N0bF9zdWJ0eXBlCXNldAkvKiBzdWJ0eXBlIHBhcmFtICovCi0jZGVmaW5lIGlvY3RsX3BpZAl1c2VkCS8qIHBpZCBwYXJhbSAqLwotI2RlZmluZSBpb2N0bF9zdGF0dXMJbmVlZGVkCS8qIHN0YXR1cyBwYXJhbSAqLwogCiAvKgogICogU3RydWN0dXJlIGZvciBwYXNzaW5nIGhhcmR3YXJlIGFuZCBzb2Z0d2FyZQpAQCAtODEwLDQ1ICs2MzYsMTEgQEAKIAogI2RlZmluZSBXTF9SRVZfSU5GT19MRUdBQ1lfTEVOR1RICTQ4CiAKLSNkZWZpbmUgV0xfQlJBTkRfTUFYIDEwCi10eXBlZGVmIHN0cnVjdCB3bF9pbnN0YW5jZV9pbmZvIHsKLQl1aW50IGluc3RhbmNlOwotCWNoYXIgYnJhbmRbV0xfQlJBTkRfTUFYXTsKLX0gd2xfaW5zdGFuY2VfaW5mb190OwotCi0vKiBzdHJ1Y3R1cmUgdG8gY2hhbmdlIHNpemUgb2YgdHggZmlmbyAqLwotdHlwZWRlZiBzdHJ1Y3Qgd2xfdHhmaWZvX3N6IHsKLQl1MTYgbWFnaWM7Ci0JdTE2IGZpZm87Ci0JdTE2IHNpemU7Ci19IHdsX3R4Zmlmb19zel90OwotLyogbWFnaWMgcGF0dGVybiB1c2VkIGZvciBtaXNtYXRjaCBkcml2ZXIgYW5kIHdsICovCi0jZGVmaW5lIFdMX1RYRklGT19TWl9NQUdJQwkweGE1YTUKLQotLyogVHJhbnNmZXIgaW5mbyBhYm91dCBhbiBJT1ZhciBmcm9tIHRoZSBkcml2ZXIgKi8KLS8qIE1heCBzdXBwb3J0ZWQgSU9WIG5hbWUgc2l6ZSBpbiBieXRlcywgKyAxIGZvciBudWwgdGVybWluYXRpb24gKi8KLSNkZWZpbmUgV0xDX0lPVl9OQU1FX0xFTiAzMAotdHlwZWRlZiBzdHJ1Y3Qgd2xjX2lvdl90cnhfcyB7Ci0JdTggbW9kdWxlOwotCXU4IHR5cGU7Ci0JY2hhciBuYW1lW1dMQ19JT1ZfTkFNRV9MRU5dOwotfSB3bGNfaW92X3RyeF90OwotCi0vKiBjaGVjayB0aGlzIG1hZ2ljIG51bWJlciAqLwotI2RlZmluZSBXTENfSU9DVExfTUFHSUMJCTB4MTRlNDZjNzcKLQotI2RlZmluZSBQUk9DX0VOVFJZX05BTUUgImJyY21fZGVidWciCi0vKiBidW1wIHRoaXMgbnVtYmVyIGlmIHlvdSBjaGFuZ2UgdGhlIGlvY3RsIGludGVyZmFjZSAqLwotI2RlZmluZSBXTENfSU9DVExfVkVSU0lPTgkxCi0KICNpZmRlZiBCUkNNX0ZVTExNQUMKLSNkZWZpbmUJV0xDX0lPQ1RMX01BWExFTgk4MTkyCi0jZWxzZQotI2RlZmluZQlXTENfSU9DVExfTUFYTEVOCQkzMDcyCS8qIG1heCBsZW5ndGggaW9jdGwgYnVmZmVyIHJlcXVpcmVkICovCi0jZW5kaWYKICNkZWZpbmUJV0xDX0lPQ1RMX1NNTEVOCQkJMjU2CS8qICJzbWFsbCIgbGVuZ3RoIGlvY3RsIGJ1ZmZlciByZXF1aXJlZCAqLwogI2RlZmluZSBXTENfSU9DVExfTUVETEVOCQkxNTM2CS8qICJtZWQiIGxlbmd0aCBpb2N0bCBidWZmZXIgcmVxdWlyZWQgKi8KLSNkZWZpbmUgV0xDX1NBTVBMRUNPTExFQ1RfTUFYTEVOCTEwMjQwCS8qIE1heCBTYW1wbGUgQ29sbGVjdCBidWZmZXIgZm9yIHR3byBjb3JlcyAqLworI2RlZmluZQlXTENfSU9DVExfTUFYTEVOCTgxOTIKKyNlbmRpZgogCiAvKiBjb21tb24gaW9jdGwgZGVmaW5pdGlvbnMgKi8KICNkZWZpbmUgV0xDX0dFVF9NQUdJQwkJCQkwCkBAIC0xMzk5LDIzICsxMTkxLDYgQEAKICNkZWZpbmUgV0xfVFhfUE9XRVJfTUNTNDBfRklSU1QJICAgICAgICAyOAogI2RlZmluZSBXTF9UWF9QT1dFUl9NQ1M0MF9OVU0JICAgICAgICAxNwogCi10eXBlZGVmIHN0cnVjdCB7Ci0JdTMyIGZsYWdzOwotCWNoYW5zcGVjX3QgY2hhbnNwZWM7CS8qIHR4cHdyIHJlcG9ydCBmb3IgdGhpcyBjaGFubmVsICovCi0JY2hhbnNwZWNfdCBsb2NhbF9jaGFuc3BlYzsJLyogY2hhbm5lbCBvbiB3aGljaCB3ZSBhcmUgYXNzb2NpYXRlZCAqLwotCXU4IGxvY2FsX21heDsJLyogbG9jYWwgbWF4IGFjY29yZGluZyB0byB0aGUgQVAgKi8KLQl1OCBsb2NhbF9jb25zdHJhaW50OwkvKiBsb2NhbCBjb25zdHJhaW50IGFjY29yZGluZyB0byB0aGUgQVAgKi8KLQlzOCBhbnRnYWluWzJdOwkvKiBBbnQgZ2FpbiBmb3IgZWFjaCBiYW5kIC0gZnJvbSBTUk9NICovCi0JdTggcmZfY29yZXM7CQkvKiBjb3VudCBvZiBSRiBDb3JlcyBiZWluZyByZXBvcnRlZCAqLwotCXU4IGVzdF9Qb3V0WzRdOwkvKiBMYXRlc3QgdHggcG93ZXIgb3V0IGVzdGltYXRlIHBlciBSRgotCQkJCSAqIGNoYWluIHdpdGhvdXQgYWRqdXN0bWVudAotCQkJCSAqLwotCXU4IGVzdF9Qb3V0X2NjazsJLyogTGF0ZXN0IENDSyB0eCBwb3dlciBvdXQgZXN0aW1hdGUgKi8KLQl1OCB1c2VyX2xpbWl0W1dMX1RYX1BPV0VSX1JBVEVTX0xFR0FDWV07CS8qIFVzZXIgbGltaXQgKi8KLQl1OCByZWdfbGltaXRbV0xfVFhfUE9XRVJfUkFURVNfTEVHQUNZXTsJLyogUmVndWxhdG9yeSBwb3dlciBsaW1pdCAqLwotCXU4IGJvYXJkX2xpbWl0W1dMX1RYX1BPV0VSX1JBVEVTX0xFR0FDWV07CS8qIE1heCBwb3dlciBib2FyZCBjYW4gc3VwcG9ydCAoU1JPTSkgKi8KLQl1OCB0YXJnZXRbV0xfVFhfUE9XRVJfUkFURVNfTEVHQUNZXTsJLyogTGF0ZXN0IHRhcmdldCBwb3dlciAqLwotfSB0eF9wb3dlcl9sZWdhY3kyX3Q7CiAKICNkZWZpbmUgV0xfVFhfUE9XRVJfUkFURVMJICAgICAgIDEwMQogI2RlZmluZSBXTF9UWF9QT1dFUl9DQ0tfRklSU1QJICAgICAgIDAKQEAgLTE4NDgsNjMgKzE2MjMsNiBAQAogCXU4IHJldHJ5OwkJLyogcmV0cnkgdmFsdWUgKi8KIH07CiAKLS8qIHN0cnVjdHVyZSBmb3IgYWRkdHMgYXJndW1lbnRzICovCi0vKiBGb3IgaW9jdGxzIHRoYXQgdGFrZSBhIGxpc3Qgb2YgVFNQRUMgKi8KLXN0cnVjdCB0c2xpc3QgewotCWludCBjb3VudDsJCS8qIG51bWJlciBvZiB0c3BlY3MgKi8KLQlzdHJ1Y3QgdHNpbmZvX2FyZyB0c2luZm9bMV07CS8qIHZhcmlhYmxlIGxlbmd0aCBhcnJheSBvZiB0c2luZm8gKi8KLX07Ci0KLS8qIHN0cnVjdHVyZSBmb3IgYWRkdHMvZGVsdHMgYXJndW1lbnRzICovCi10eXBlZGVmIHN0cnVjdCB0c3BlY19hcmcgewotCXUxNiB2ZXJzaW9uOwkJLyogc2VlIGRlZmluaXRpb24gb2YgVFNQRUNfQVJHX1ZFUlNJT04gKi8KLQl1MTYgbGVuZ3RoOwkJLyogbGVuZ3RoIG9mIGVudGlyZSBzdHJ1Y3R1cmUgKi8KLQl1aW50IGZsYWc7CQkvKiBiaXQgZmllbGQgKi8KLQkvKiBUU1BFQyBBcmd1bWVudHMgKi8KLQlzdHJ1Y3QgdHNpbmZvX2FyZyB0c2luZm87CS8qIFRTIEluZm8gYml0IGZpZWxkICovCi0JdTE2IG5vbV9tc2R1X3NpemU7CS8qIChOb21pbmFsIG9yIGZpeGVkKSBNU0RVIFNpemUgKGJ5dGVzKSAqLwotCXUxNiBtYXhfbXNkdV9zaXplOwkvKiBNYXhpbXVtIE1TRFUgU2l6ZSAoYnl0ZXMpICovCi0JdWludCBtaW5fc3J2X2ludGVydmFsOwkvKiBNaW5pbXVtIFNlcnZpY2UgSW50ZXJ2YWwgKHVzKSAqLwotCXVpbnQgbWF4X3Nydl9pbnRlcnZhbDsJLyogTWF4aW11bSBTZXJ2aWNlIEludGVydmFsICh1cykgKi8KLQl1aW50IGluYWN0aXZpdHlfaW50ZXJ2YWw7CS8qIEluYWN0aXZpdHkgSW50ZXJ2YWwgKHVzKSAqLwotCXVpbnQgc3VzcGVuc2lvbl9pbnRlcnZhbDsJLyogU3VzcGVuc2lvbiBJbnRlcnZhbCAodXMpICovCi0JdWludCBzcnZfc3RhcnRfdGltZTsJLyogU2VydmljZSBTdGFydCBUaW1lICh1cykgKi8KLQl1aW50IG1pbl9kYXRhX3JhdGU7CS8qIE1pbmltdW0gRGF0YSBSYXRlIChicHMpICovCi0JdWludCBtZWFuX2RhdGFfcmF0ZTsJLyogTWVhbiBEYXRhIFJhdGUgKGJwcykgKi8KLQl1aW50IHBlYWtfZGF0YV9yYXRlOwkvKiBQZWFrIERhdGEgUmF0ZSAoYnBzKSAqLwotCXVpbnQgbWF4X2J1cnN0X3NpemU7CS8qIE1heGltdW0gQnVyc3QgU2l6ZSAoYnl0ZXMpICovCi0JdWludCBkZWxheV9ib3VuZDsJLyogRGVsYXkgQm91bmQgKHVzKSAqLwotCXVpbnQgbWluX3BoeV9yYXRlOwkvKiBNaW5pbXVtIFBIWSBSYXRlIChicHMpICovCi0JdTE2IHN1cnBsdXNfYnc7CS8qIFN1cnBsdXMgQmFuZHdpZHRoIEFsbG93YW5jZSAocmFuZ2UgMS4wIHRvIDguMCkgKi8KLQl1MTYgbWVkaXVtX3RpbWU7CS8qIE1lZGl1bSBUaW1lICgzMiB1cy9zIHBlcmlvZHMpICovCi0JdTggZGlhbG9nX3Rva2VuOwkvKiBkaWFsb2cgdG9rZW4gKi8KLX0gdHNwZWNfYXJnX3Q7Ci0KLS8qIHRzcGVjIGFyZyBmb3IgZGVzaXJlZCBzdGF0aW9uICovCi10eXBlZGVmIHN0cnVjdCB0c3BlY19wZXJfc3RhX2FyZyB7Ci0Jc3RydWN0IGV0aGVyX2FkZHIgZWE7Ci0Jc3RydWN0IHRzcGVjX2FyZyB0czsKLX0gdHNwZWNfcGVyX3N0YV9hcmdfdDsKLQotLyogc3RydWN0dXJlIGZvciBtYXggYmFuZHdpZHRoIGZvciBlYWNoIGFjY2VzcyBjYXRlZ29yeSAqLwotdHlwZWRlZiBzdHJ1Y3Qgd21lX21heF9iYW5kd2lkdGggewotCXUzMiBhY1tBQ19DT1VOVF07CS8qIG1heCBiYW5kd2lkdGggZm9yIGVhY2ggYWNjZXNzIGNhdGVnb3J5ICovCi19IHdtZV9tYXhfYmFuZHdpZHRoX3Q7Ci0KLSNkZWZpbmUgV0xfV01FX01CV19QQVJBTVNfSU9fQllURVMgKHNpemVvZih3bWVfbWF4X2JhbmR3aWR0aF90KSkKLQotLyogY3VycmVudCB2ZXJzaW9uIG9mIHdsX3RzcGVjX2FyZ190IHN0cnVjdCAqLwotI2RlZmluZQlUU1BFQ19BUkdfVkVSU0lPTgkJMgkvKiBjdXJyZW50IHZlcnNpb24gb2Ygd2xfdHNwZWNfYXJnX3Qgc3RydWN0ICovCi0jZGVmaW5lIFRTUEVDX0FSR19MRU5HVEgJCTU1CS8qIGFyZ3VtZW50IGxlbmd0aCBmcm9tIHRzaW5mbyB0byBtZWRpdW1fdGltZSAqLwotI2RlZmluZSBUU1BFQ19ERUZBVUxUX0RJQUxPR19UT0tFTgk0MgkvKiBkZWZhdWx0IGRpYWxvZyB0b2tlbiAqLwotI2RlZmluZSBUU1BFQ19ERUZBVUxUX1NCV19GQUNUT1IJMHgzMDAwCS8qIGRlZmF1bHQgc3VycGx1cyBidyAqLwotCi0vKiBkZWZpbmUgZm9yIGZsYWcgKi8KLSNkZWZpbmUgVFNQRUNfUEVORElORwkJMAkvKiBUU1BFQyBwZW5kaW5nICovCi0jZGVmaW5lIFRTUEVDX0FDQ0VQVEVECQkxCS8qIFRTUEVDIGFjY2VwdGVkICovCi0jZGVmaW5lIFRTUEVDX1JFSkVDVEVECQkyCS8qIFRTUEVDIHJlamVjdGVkICovCi0jZGVmaW5lIFRTUEVDX1VOS05PV04JCTMJLyogVFNQRUMgdW5rbm93biAqLwotI2RlZmluZSBUU1BFQ19TVEFUVVNfTUFTSwk3CS8qIFRTUEVDIHN0YXR1cyBtYXNrICovCiAKIC8qIFNvZnR3YXJlIGZlYXR1cmUgZmxhZyBkZWZpbmVzIHVzZWQgYnkgd2xmZWF0dXJlZmxhZyAqLwogI2RlZmluZSBXTF9TV0ZMX05PSFdSQURJTwkweDAwMDQKQEAgLTE5MTMsMTYgKzE2MzEsNiBAQAogCiAjZGVmaW5lIFdMX0xJRkVUSU1FX01BWCAweEZGRkYJLyogTWF4IHZhbHVlIGluIG1zICovCiAKLS8qCi0gKiBEb25nbGUgcGF0dGVybiBtYXRjaGluZyBmaWx0ZXIuCi0gKi8KLQotLyogUGFja2V0IGZpbHRlciB0eXBlcy4gQ3VycmVudGx5LCBvbmx5IHBhdHRlcm4gbWF0Y2hpbmcgaXMgc3VwcG9ydGVkLiAqLwotdHlwZWRlZiBlbnVtIHdsX3BrdF9maWx0ZXJfdHlwZSB7Ci0JV0xfUEtUX0ZJTFRFUl9UWVBFX1BBVFRFUk5fTUFUQ0gJLyogUGF0dGVybiBtYXRjaGluZyBmaWx0ZXIgKi8KLX0gd2xfcGt0X2ZpbHRlcl90eXBlX3Q7Ci0KLSNkZWZpbmUgV0xfUEtUX0ZJTFRFUl9UWVBFIHdsX3BrdF9maWx0ZXJfdHlwZV90CiAKIC8qIFBhdHRlcm4gbWF0Y2hpbmcgZmlsdGVyLiBTcGVjaWZpZXMgYW4gb2Zmc2V0IHdpdGhpbiByZWNlaXZlZCBwYWNrZXRzIHRvCiAgKiBzdGFydCBtYXRjaGluZywgdGhlIHBhdHRlcm4gdG8gbWF0Y2gsIHRoZSBzaXplIG9mIHRoZSBwYXR0ZXJuLCBhbmQgYSBiaXRtYXNrCkBAIC0xOTU3LDIwICsxNjY1LDYgQEAKIAl1MzIgZW5hYmxlOwkJLyogRW5hYmxlL2Rpc2FibGUgYm9vbCAqLwogfSB3bF9wa3RfZmlsdGVyX2VuYWJsZV90OwogCi0vKiBJT1ZBUiAicGt0X2ZpbHRlcl9saXN0IiBwYXJhbWV0ZXIuIFVzZWQgdG8gcmV0cmlldmUgYSBsaXN0IG9mIGluc3RhbGxlZCBmaWx0ZXJzLiAqLwotdHlwZWRlZiBzdHJ1Y3Qgd2xfcGt0X2ZpbHRlcl9saXN0IHsKLQl1MzIgbnVtOwkJLyogTnVtYmVyIG9mIGluc3RhbGxlZCBwYWNrZXQgZmlsdGVycyAqLwotCXdsX3BrdF9maWx0ZXJfdCBmaWx0ZXJbMV07CS8qIFZhcmlhYmxlIGFycmF5IG9mIHBhY2tldCBmaWx0ZXJzLiAqLwotfSB3bF9wa3RfZmlsdGVyX2xpc3RfdDsKLQotI2RlZmluZSBXTF9QS1RfRklMVEVSX0xJU1RfRklYRURfTEVOCSAgb2Zmc2V0b2Yod2xfcGt0X2ZpbHRlcl9saXN0X3QsIGZpbHRlcikKLQotLyogSU9WQVIgInBrdF9maWx0ZXJfc3RhdHMiIHBhcmFtZXRlci4gVXNlZCB0byByZXRyaWV2ZSBkZWJ1ZyBzdGF0aXN0aWNzLiAqLwotdHlwZWRlZiBzdHJ1Y3Qgd2xfcGt0X2ZpbHRlcl9zdGF0cyB7Ci0JdTMyIG51bV9wa3RzX21hdGNoZWQ7CS8qICMgZmlsdGVyIG1hdGNoZXMgZm9yIHNwZWNpZmllZCBmaWx0ZXIgaWQgKi8KLQl1MzIgbnVtX3BrdHNfZm9yd2FyZGVkOwkvKiAjIHBhY2tldHMgZndkZWQgZnJvbSBkb25nbGUgdG8gaG9zdCBmb3IgYWxsIGZpbHRlcnMgKi8KLQl1MzIgbnVtX3BrdHNfZGlzY2FyZGVkOwkvKiAjIHBhY2tldHMgZGlzY2FyZGVkIGJ5IGRvbmdsZSBmb3IgYWxsIGZpbHRlcnMgKi8KLX0gd2xfcGt0X2ZpbHRlcl9zdGF0c190OwogCiAjZGVmaW5lCVdMQ19SU1NJX0lOVkFMSUQJIDAJLyogaW52YWxpZCBSU1NJIHZhbHVlICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvcGh5L3dsY19waHlfY21uLmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3BoeS93bGNfcGh5X2Ntbi5jCmluZGV4IDgyODcyNjExLi4zYmVkMzdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3BoeS93bGNfcGh5X2Ntbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvcGh5L3dsY19waHlfY21uLmMKQEAgLTIwLDEwICsyMCwxNSBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KICNpbmNsdWRlIDxvc2wuaD4KLSNpbmNsdWRlIDxsaW51eHZlci5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8YmNtZW5kaWFuLmg+CiAjaW5jbHVkZSA8YmNtbnZyYW0uaD4KICNpbmNsdWRlIDxzYmNoaXBjLmg+CisjaW5jbHVkZSA8YmNtZGV2cy5oPgorI2luY2x1ZGUgPHNiaG5kcGlvLmg+CisjaW5jbHVkZSA8c2JobmRkbWEuaD4KIAogI2luY2x1ZGUgPHdsY19waHlfaW50Lmg+CiAjaW5jbHVkZSA8d2xjX3BoeXJlZ19uLmg+CkBAIC0xNjMsNyArMTY4LDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlmb3IgKHMgPSB2YXJzOyBzICYmICpzOykgewotCQlpZiAoKGJjbXAocywgbmFtZSwgbGVuKSA9PSAwKSAmJiAoc1tsZW5dID09ICc9JykpCisJCWlmICgobWVtY21wKHMsIG5hbWUsIGxlbikgPT0gMCkgJiYgKHNbbGVuXSA9PSAnPScpKQogCQkJcmV0dXJuICZzW2xlbiArIDFdOwogCiAJCXdoaWxlICgqcysrKQpAQCAtMjcyLDcgKzI3Nyw3IEBACiAKIHZvaWQgd3JpdGVfcmFkaW9fcmVnKHBoeV9pbmZvX3QgKnBpLCB1MTYgYWRkciwgdTE2IHZhbCkKIHsKLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCiAJaWYgKE5PUkFESU9fRU5BQihwaS0+cHVicGkpKQogCQlyZXR1cm47CkBAIC0yOTYsNyArMzAxLDcgQEAKIAkJV19SRUcob3NoLCAmcGktPnJlZ3MtPnBoeTR3ZGF0YWxvLCB2YWwpOwogCX0KIAotCWlmIChCVVNUWVBFKHBpLT5zaC0+YnVzdHlwZSkgPT0gUENJX0JVUykgeworCWlmIChwaS0+c2gtPmJ1c3R5cGUgPT0gUENJX0JVUykgewogCQlpZiAoKytwaS0+cGh5X3dyZWcgPj0gcGktPnBoeV93cmVnX2xpbWl0KSB7CiAJCQkodm9pZClSX1JFRyhvc2gsICZwaS0+cmVncy0+bWFjY29udHJvbCk7CiAJCQlwaS0+cGh5X3dyZWcgPSAwOwpAQCAtNDA1LDcgKzQxMCw3IEBACiAKIHUxNiByZWFkX3BoeV9yZWcocGh5X2luZm9fdCAqcGksIHUxNiBhZGRyKQogewotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAJZDExcmVnc190ICpyZWdzOwogCiAJb3NoID0gcGktPnNoLT5vc2g7CkBAIC00MjYsNyArNDMxLDcgQEAKIAogdm9pZCB3cml0ZV9waHlfcmVnKHBoeV9pbmZvX3QgKnBpLCB1MTYgYWRkciwgdTE2IHZhbCkKIHsKLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCWQxMXJlZ3NfdCAqcmVnczsKIAogCW9zaCA9IHBpLT5zaC0+b3NoOwpAQCAtNDQxLDcgKzQ0Niw3IEBACiAjZWxzZQogCVdfUkVHKG9zaCwgKHZvbGF0aWxlIHUzMiAqKSgmcmVncy0+cGh5cmVnYWRkciksCiAJICAgICAgYWRkciB8ICh2YWwgPDwgMTYpKTsKLQlpZiAoQlVTVFlQRShwaS0+c2gtPmJ1c3R5cGUpID09IFBDSV9CVVMpIHsKKwlpZiAocGktPnNoLT5idXN0eXBlID09IFBDSV9CVVMpIHsKIAkJaWYgKCsrcGktPnBoeV93cmVnID49IHBpLT5waHlfd3JlZ19saW1pdCkgewogCQkJcGktPnBoeV93cmVnID0gMDsKIAkJCSh2b2lkKVJfUkVHKG9zaCwgJnJlZ3MtPnBoeXZlcnNpb24pOwpAQCAtNDUyLDcgKzQ1Nyw3IEBACiAKIHZvaWQgYW5kX3BoeV9yZWcocGh5X2luZm9fdCAqcGksIHUxNiBhZGRyLCB1MTYgdmFsKQogewotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAJZDExcmVnc190ICpyZWdzOwogCiAJb3NoID0gcGktPnNoLT5vc2g7CkBAIC00NzMsNyArNDc4LDcgQEAKIAogdm9pZCBvcl9waHlfcmVnKHBoeV9pbmZvX3QgKnBpLCB1MTYgYWRkciwgdTE2IHZhbCkKIHsKLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCWQxMXJlZ3NfdCAqcmVnczsKIAogCW9zaCA9IHBpLT5zaC0+b3NoOwpAQCAtNDk0LDcgKzQ5OSw3IEBACiAKIHZvaWQgbW9kX3BoeV9yZWcocGh5X2luZm9fdCAqcGksIHUxNiBhZGRyLCB1MTYgbWFzaywgdTE2IHZhbCkKIHsKLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCWQxMXJlZ3NfdCAqcmVnczsKIAogCW9zaCA9IHBpLT5zaC0+b3NoOwpAQCAtNTkxLDcgKzU5Niw3IEBACiAKIHZvaWQgd2xjX3BoeV9zaGFyZWRfZGV0YWNoKHNoYXJlZF9waHlfdCAqcGh5X3NoKQogewotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAKIAlpZiAocGh5X3NoKSB7CiAJCW9zaCA9IHBoeV9zaC0+b3NoOwpAQCAtNjA5LDcgKzYxNCw3IEBACiAJdTMyIHNmbGFncyA9IDA7CiAJdWludCBwaHl2ZXJzaW9uOwogCWludCBpOwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAKIAlvc2ggPSBzaC0+b3NoOwogCkBAIC0xMDgwLDggKzEwODUsOCBAQAogCXBpLT50YmxfZGF0YV9oaSA9IHRibERhdGFIaTsKIAlwaS0+dGJsX2RhdGFfbG8gPSB0YmxEYXRhTG87CiAKLQlpZiAoKENISVBJRChwaS0+c2gtPmNoaXApID09IEJDTTQzMjI0X0NISVBfSUQgfHwKLQkgICAgIENISVBJRChwaS0+c2gtPmNoaXApID09IEJDTTQzNDIxX0NISVBfSUQpICYmCisJaWYgKChwaS0+c2gtPmNoaXAgPT0gQkNNNDMyMjRfQ0hJUF9JRCB8fAorCSAgICAgcGktPnNoLT5jaGlwID09IEJDTTQzNDIxX0NISVBfSUQpICYmCiAJICAgIChwaS0+c2gtPmNoaXByZXYgPT0gMSkpIHsKIAkJcGktPnRibF9hZGRyID0gdGJsQWRkcjsKIAkJcGktPnRibF9zYXZlX2lkID0gdGJsX2lkOwpAQCAtMTA5Myw4ICsxMDk4LDggQEAKIHsKIAlBU1NFUlQoKHdpZHRoID09IDgpIHx8ICh3aWR0aCA9PSAxNikgfHwgKHdpZHRoID09IDMyKSk7CiAKLQlpZiAoKENISVBJRChwaS0+c2gtPmNoaXApID09IEJDTTQzMjI0X0NISVBfSUQgfHwKLQkgICAgIENISVBJRChwaS0+c2gtPmNoaXApID09IEJDTTQzNDIxX0NISVBfSUQpICYmCisJaWYgKChwaS0+c2gtPmNoaXAgPT0gQkNNNDMyMjRfQ0hJUF9JRCB8fAorCSAgICAgcGktPnNoLT5jaGlwID09IEJDTTQzNDIxX0NISVBfSUQpICYmCiAJICAgIChwaS0+c2gtPmNoaXByZXYgPT0gMSkgJiYKIAkgICAgKHBpLT50Ymxfc2F2ZV9pZCA9PSBOUEhZX1RCTF9JRF9BTlRTV0NUUkxMVVQpKSB7CiAJCXJlYWRfcGh5X3JlZyhwaSwgcGktPnRibF9kYXRhX2xvKTsKQEAgLTExMzIsOCArMTEzNyw4IEBACiAKIAlmb3IgKGlkeCA9IDA7IGlkeCA8IHB0YmxfaW5mby0+dGJsX2xlbjsgaWR4KyspIHsKIAotCQlpZiAoKENISVBJRChwaS0+c2gtPmNoaXApID09IEJDTTQzMjI0X0NISVBfSUQgfHwKLQkJICAgICBDSElQSUQocGktPnNoLT5jaGlwKSA9PSBCQ000MzQyMV9DSElQX0lEKSAmJgorCQlpZiAoKHBpLT5zaC0+Y2hpcCA9PSBCQ000MzIyNF9DSElQX0lEIHx8CisJCSAgICAgcGktPnNoLT5jaGlwID09IEJDTTQzNDIxX0NISVBfSUQpICYmCiAJCSAgICAocGktPnNoLT5jaGlwcmV2ID09IDEpICYmCiAJCSAgICAodGJsX2lkID09IE5QSFlfVEJMX0lEX0FOVFNXQ1RSTExVVCkpIHsKIAkJCXJlYWRfcGh5X3JlZyhwaSwgdGJsRGF0YUxvKTsKQEAgLTExNzUsOCArMTE4MCw4IEBACiAKIAlmb3IgKGlkeCA9IDA7IGlkeCA8IHB0YmxfaW5mby0+dGJsX2xlbjsgaWR4KyspIHsKIAotCQlpZiAoKENISVBJRChwaS0+c2gtPmNoaXApID09IEJDTTQzMjI0X0NISVBfSUQgfHwKLQkJICAgICBDSElQSUQocGktPnNoLT5jaGlwKSA9PSBCQ000MzQyMV9DSElQX0lEKSAmJgorCQlpZiAoKHBpLT5zaC0+Y2hpcCA9PSBCQ000MzIyNF9DSElQX0lEIHx8CisJCSAgICAgcGktPnNoLT5jaGlwID09IEJDTTQzNDIxX0NISVBfSUQpICYmCiAJCSAgICAocGktPnNoLT5jaGlwcmV2ID09IDEpKSB7CiAJCQkodm9pZClyZWFkX3BoeV9yZWcocGksIHRibERhdGFMbyk7CiAKQEAgLTE1MzQsNyArMTUzOSw3IEBACiAKIAlBU1NFUlQoKGJhbmQgPT0gV0xDX0JBTkRfMkcpIHx8IChiYW5kID09IFdMQ19CQU5EXzVHKSk7CiAKLQliemVybyhjaGFubmVscywgc2l6ZW9mKGNoYW52ZWNfdCkpOworCW1lbXNldChjaGFubmVscywgMCwgc2l6ZW9mKGNoYW52ZWNfdCkpOwogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2hhbl9pbmZvX2FsbCk7IGkrKykgewogCQljaGFubmVsID0gY2hhbl9pbmZvX2FsbFtpXS5jaGFuOwpAQCAtMTg5Niw3ICsxOTAxLDcgQEAKIAkJdHhfcHdyX21pbiA9IG1pbih0eF9wd3JfbWluLCB0eF9wd3JfdGFyZ2V0W3JhdGVdKTsKIAl9CiAKLQliemVybyhwaS0+dHhfcG93ZXJfb2Zmc2V0LCBzaXplb2YocGktPnR4X3Bvd2VyX29mZnNldCkpOworCW1lbXNldChwaS0+dHhfcG93ZXJfb2Zmc2V0LCAwLCBzaXplb2YocGktPnR4X3Bvd2VyX29mZnNldCkpOwogCXBpLT50eF9wb3dlcl9tYXggPSB0eF9wd3JfbWF4OwogCXBpLT50eF9wb3dlcl9taW4gPSB0eF9wd3JfbWluOwogCXBpLT50eF9wb3dlcl9tYXhfcmF0ZV9pbmQgPSB0eF9wd3JfbWF4X3JhdGVfaW5kOwpAQCAtMjUwNyw3ICsyNTEyLDcgQEAKIAlzOCBjbXBseF9wd3JfZGJtW1BIWV9DT1JFX01BWF07CiAJdTggaTsKIAotCWJ6ZXJvKCh1OCAqKSBjbXBseF9wd3JfZGJtLCBzaXplb2YoY21wbHhfcHdyX2RibSkpOworCW1lbXNldCgodTggKikgY21wbHhfcHdyX2RibSwgMCwgc2l6ZW9mKGNtcGx4X3B3cl9kYm0pKTsKIAlBU1NFUlQocGktPnB1YnBpLnBoeV9jb3JlbnVtIDw9IFBIWV9DT1JFX01BWCk7CiAJd2xjX3BoeV9jb21wdXRlX2RCKGNtcGx4X3B3ciwgY21wbHhfcHdyX2RibSwgcGktPnB1YnBpLnBoeV9jb3JlbnVtKTsKIApAQCAtMjYyMSw5ICsyNjI2LDkgQEAKIAkJCXU4IHdhaXRfY3JzID0gMDsKIAkJCXU4IGk7CiAKLQkJCWJ6ZXJvKCh1OCAqKSBlc3QsIHNpemVvZihlc3QpKTsKLQkJCWJ6ZXJvKCh1OCAqKSBjbXBseF9wd3IsIHNpemVvZihjbXBseF9wd3IpKTsKLQkJCWJ6ZXJvKCh1OCAqKSBub2lzZV9kYm1fYW50LCBzaXplb2Yobm9pc2VfZGJtX2FudCkpOworCQkJbWVtc2V0KCh1OCAqKSBlc3QsIDAsIHNpemVvZihlc3QpKTsKKwkJCW1lbXNldCgodTggKikgY21wbHhfcHdyLCAwLCBzaXplb2YoY21wbHhfcHdyKSk7CisJCQltZW1zZXQoKHU4ICopIG5vaXNlX2RibV9hbnQsIDAsIHNpemVvZihub2lzZV9kYm1fYW50KSk7CiAKIAkJCWxvZ19udW1fc2FtcHMgPSBQSFlfTk9JU0VfU0FNUExFX0xPR19OVU1fTlBIWTsKIAkJCW51bV9zYW1wcyA9IDEgPDwgbG9nX251bV9zYW1wczsKQEAgLTI3MDQsOCArMjcwOSw4IEBACiAJdTggaWR4LCBjb3JlOwogCiAJQVNTRVJUKHBpLT5wdWJwaS5waHlfY29yZW51bSA8PSBQSFlfQ09SRV9NQVgpOwotCWJ6ZXJvKCh1OCAqKSBjbXBseF9wd3IsIHNpemVvZihjbXBseF9wd3IpKTsKLQliemVybygodTggKikgbm9pc2VfZGJtX2FudCwgc2l6ZW9mKG5vaXNlX2RibV9hbnQpKTsKKwltZW1zZXQoKHU4ICopIGNtcGx4X3B3ciwgMCwgc2l6ZW9mKGNtcGx4X3B3cikpOworCW1lbXNldCgodTggKikgbm9pc2VfZGJtX2FudCwgMCwgc2l6ZW9mKG5vaXNlX2RibV9hbnQpKTsKIAogCWZvciAoaWR4ID0gMCwgY29yZSA9IDA7IGNvcmUgPCBwaS0+cHVicGkucGh5X2NvcmVudW07IGlkeCArPSAyLCBjb3JlKyspIHsKIAkJbG8gPSB3bGFwaV9ibWFjX3JlYWRfc2htKHBpLT5zaC0+cGh5c2hpbSwgTV9QV1JJTkRfTUFQKGlkeCkpOwpAQCAtMzMyNSw3ICszMzMwLDcgQEAKIAogdm9pZCB3bGNfbGNucGh5X2VwYV9zd2l0Y2gocGh5X2luZm9fdCAqcGksIGJvb2wgbW9kZSkKIHsKLQlpZiAoKENISVBJRChwaS0+c2gtPmNoaXApID09IEJDTTQzMTNfQ0hJUF9JRCkgJiYKKwlpZiAoKHBpLT5zaC0+Y2hpcCA9PSBCQ000MzEzX0NISVBfSUQpICYmCiAJICAgIChwaS0+c2gtPmJvYXJkZmxhZ3MgJiBCRkxfRkVNKSkgewogCQlpZiAobW9kZSkgewogCQkJdTE2IHR4YW50ID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvcGh5L3dsY19waHlfaGFsLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3BoeS93bGNfcGh5X2hhbC5oCmluZGV4IDUyMjYwYjIuLjUxNGUxNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvcGh5L3dsY19waHlfaGFsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9waHkvd2xjX3BoeV9oYWwuaApAQCAtMTIyLDExICsxMjIsNyBAQAogCiBzdHJ1Y3QgcGh5X3B1YjsKIAotI2lmZGVmIFdMQ19ISUdIX09OTFkKLXR5cGVkZWYgc3RydWN0IHdsY19ycGNfcGh5IHdsY19waHlfdDsKLSNlbHNlCiB0eXBlZGVmIHN0cnVjdCBwaHlfcHViIHdsY19waHlfdDsKLSNlbmRpZgogCiB0eXBlZGVmIHN0cnVjdCBzaGFyZWRfcGh5X3BhcmFtcyB7CiAJdm9pZCAqb3NoOwpAQCAtMTUwLDcgKzE0Niw2IEBACiAJdTMyIGJvYXJkZmxhZ3MyOwogfSBzaGFyZWRfcGh5X3BhcmFtc190OwogCi0jaWZkZWYgV0xDX0xPVwogCiBleHRlcm4gc2hhcmVkX3BoeV90ICp3bGNfcGh5X3NoYXJlZF9hdHRhY2goc2hhcmVkX3BoeV9wYXJhbXNfdCAqc2hwKTsKIGV4dGVybiB2b2lkIHdsY19waHlfc2hhcmVkX2RldGFjaChzaGFyZWRfcGh5X3QgKnBoeV9zaCk7CkBAIC0xODksNyArMTg0LDYgQEAKIGV4dGVybiB2b2lkIHdsY19waHlfc3dpdGNoX3JhZGlvKHdsY19waHlfdCAqcHBpLCBib29sIG9uKTsKIGV4dGVybiB2b2lkIHdsY19waHlfYW5hY29yZSh3bGNfcGh5X3QgKnBwaSwgYm9vbCBvbik7CiAKLSNlbmRpZgkJCQkvKiBXTENfTE9XICovCiAKIGV4dGVybiB2b2lkIHdsY19waHlfQlNTaW5pdCh3bGNfcGh5X3QgKnBwaSwgYm9vbCBib25seWFwLCBpbnQgcnNzaSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvcGh5L3dsY19waHlfaW50LmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3BoeS93bGNfcGh5X2ludC5oCmluZGV4IDk1MTNiODcuLjcyZWVlOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvcGh5L3dsY19waHlfaW50LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9waHkvd2xjX3BoeV9pbnQuaApAQCAtNTI3LDcgKzUyNyw3IEBACiBzdHJ1Y3Qgc2hhcmVkX3BoeSB7CiAJc3RydWN0IHBoeV9pbmZvICpwaHlfaGVhZDsKIAl1aW50IHVuaXQ7Ci0Jb3NsX3QgKm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsKIAlzaV90ICpzaWg7CiAJdm9pZCAqcGh5c2hpbTsKIAl1aW50IGNvcmVyZXY7CkBAIC0xMTU4LDcgKzExNTgsNyBAQAogCSAocGktPmlwYTVnX29uICYmIENIU1BFQ19JUzVHKHBpLT5yYWRpb19jaGFuc3BlYykpKQogCiAjZGVmaW5lIFdMQ19QSFlfV0FSX1BSNTE1NzEocGkpIFwKLQlpZiAoKEJVU1RZUEUoKHBpKS0+c2gtPmJ1c3R5cGUpID09IFBDSV9CVVMpICYmIE5SRVZfTFQoKHBpKS0+cHVicGkucGh5X3JldiwgMykpIFwKKwlpZiAoKChwaSktPnNoLT5idXN0eXBlID09IFBDSV9CVVMpICYmIE5SRVZfTFQoKHBpKS0+cHVicGkucGh5X3JldiwgMykpIFwKIAkJKHZvaWQpUl9SRUcoKHBpKS0+c2gtPm9zaCwgJihwaSktPnJlZ3MtPm1hY2NvbnRyb2wpCiAKIGV4dGVybiB2b2lkIHdsY19waHlfY2FsX3BlcmljYWxfbnBoeV9ydW4ocGh5X2luZm9fdCAqcGksIHU4IGNhbHR5cGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9waHkvd2xjX3BoeV9sY24uYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvcGh5L3dsY19waHlfbGNuLmMKaW5kZXggM2QzMTEyZS4uM2FjMmI0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9waHkvd2xjX3BoeV9sY24uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3BoeS93bGNfcGh5X2xjbi5jCkBAIC0xNywxMyArMTcsMTggQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPHdsY19jZmcuaD4KICNpbmNsdWRlIDxxbWF0aC5oPgogI2luY2x1ZGUgPG9zbC5oPgotI2luY2x1ZGUgPGxpbnV4dmVyLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8c2l1dGlscy5oPgogI2luY2x1ZGUgPGhuZHBtdS5oPgogCisjaW5jbHVkZSA8YmNtZGV2cy5oPgorI2luY2x1ZGUgPHNiaG5kcGlvLmg+CisjaW5jbHVkZSA8c2JobmRkbWEuaD4KKwogI2luY2x1ZGUgPHdsY19waHlfcmFkaW8uaD4KICNpbmNsdWRlIDx3bGNfcGh5X2ludC5oPgogI2luY2x1ZGUgPHdsY19waHlfbGNuLmg+CkBAIC0xMzI3LDcgKzEzMzIsNyBAQAogCXUzMiBkYXRhX2J1Zls2NF07CiAJcGh5dGJsX2luZm9fdCB0YWI7CiAKLQliemVybyhkYXRhX2J1Ziwgc2l6ZW9mKGRhdGFfYnVmKSk7CisJbWVtc2V0KGRhdGFfYnVmLCAwLCBzaXplb2YoZGF0YV9idWYpKTsKIAogCXRhYi50YmxfaWQgPSBMQ05QSFlfVEJMX0lEX1RYUFdSQ1RMOwogCXRhYi50Ymxfd2lkdGggPSAzMjsKQEAgLTE5NTEsNyArMTk1Niw3IEBACiAJYmFuZF9pZHggPSAoQ0hTUEVDX0lTNUcocGktPnJhZGlvX2NoYW5zcGVjKSA/IDEgOiAwKTsKIAogCWNhbF9nYWlucyA9ICp0YXJnZXRfZ2FpbnM7Ci0JYnplcm8obmNvcnJfb3ZlcnJpZGUsIHNpemVvZihuY29ycl9vdmVycmlkZSkpOworCW1lbXNldChuY29ycl9vdmVycmlkZSwgMCwgc2l6ZW9mKG5jb3JyX292ZXJyaWRlKSk7CiAJZm9yIChqID0gMDsgaiA8IGlxY2FsX2dhaW5wYXJhbXNfbnVtZ2FpbnNfbGNucGh5W2JhbmRfaWR4XTsgaisrKSB7CiAJCWlmIChoYXNoID09IHRibF9pcWNhbF9nYWlucGFyYW1zX2xjbnBoeVtiYW5kX2lkeF1bal1bMF0pIHsKIAkJCWNhbF9nYWlucy5nbV9nYWluID0KQEAgLTI1MjksNyArMjUzNCw3IEBACiAJdGFiLnRibF93aWR0aCA9IDMyOwogCXRhYi50Ymxfb2Zmc2V0ID0gMDsKIAotCWJ6ZXJvKHRlbXBfb2Zmc2V0LCBzaXplb2YodGVtcF9vZmZzZXQpKTsKKwltZW1zZXQodGVtcF9vZmZzZXQsIDAsIHNpemVvZih0ZW1wX29mZnNldCkpOwogCWZvciAoaiA9IDE7IGogPCAxMjg7IGogKz0gMikKIAkJdGVtcF9vZmZzZXRbal0gPSAweDgwMDAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3BoeS93bGNfcGh5X24uYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvcGh5L3dsY19waHlfbi5jCmluZGV4IDk1MDAwOGYuLmM2Y2NlOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvcGh5L3dsY19waHlfbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvcGh5L3dsY19waHlfbi5jCkBAIC0xOCwxMyArMTgsMTggQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxiY21kZWZzLmg+CiAjaW5jbHVkZSA8d2xjX2NmZy5oPgotI2luY2x1ZGUgPGxpbnV4dmVyLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxvc2wuaD4KICNpbmNsdWRlIDxzaXV0aWxzLmg+CiAjaW5jbHVkZSA8c2JjaGlwYy5oPgogI2luY2x1ZGUgPGhuZHBtdS5oPgogI2luY2x1ZGUgPGJjbWVuZGlhbi5oPgogCisjaW5jbHVkZSA8YmNtZGV2cy5oPgorI2luY2x1ZGUgPHNiaG5kcGlvLmg+CisjaW5jbHVkZSA8c2JobmRkbWEuaD4KKwogI2luY2x1ZGUgPHdsY19waHlfcmFkaW8uaD4KICNpbmNsdWRlIDx3bGNfcGh5X2ludC5oPgogI2luY2x1ZGUgPHdsY19waHlyZWdfbi5oPgpAQCAtMTQ1NTQsNyArMTQ1NTksNyBAQAogCQl9CiAJfQogCi0JaWYgKCghUEhZX0lQQShwaSkpICYmIChDSElQSUQocGktPnNoLT5jaGlwKSA9PSBCQ001MzU3X0NISVBfSUQpKSB7CisJaWYgKCghUEhZX0lQQShwaSkpICYmIChwaS0+c2gtPmNoaXAgPT0gQkNNNTM1N19DSElQX0lEKSkgewogCQlzaV9wbXVfY2hpcGNvbnRyb2wocGktPnNoLT5zaWgsIDEsIENDVFJMNTM1N19FWFRQQSwKIAkJCQkgICBDQ1RSTDUzNTdfRVhUUEEpOwogCX0KQEAgLTE3NTk5LDcgKzE3NjA0LDcgQEAKIAogCW1vZF9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfWFRBTFBVT1ZSX1BJTkNUUkwsIDB4MSwgMHgxKTsKIAotCWlmIChDSElQSUQocGktPnNoLT5jaGlwKSA9PSAhQkNNNjM2Ml9DSElQX0lEKSB7CisJaWYgKHBpLT5zaC0+Y2hpcCA9PSAhQkNNNjM2Ml9DSElQX0lEKSB7CiAKIAkJbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1N19YVEFMUFVPVlJfUElOQ1RSTCwgMHgyLCAweDIpOwogCX0KQEAgLTE4MDA3LDggKzE4MDEyLDggQEAKIAkJCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1Nl9TWU5fUExMX0xPT1BGSUxURVIyIHwKIAkJCQkJUkFESU9fMjA1Nl9TWU4sIDB4MWYpOwogCi0JCQlpZiAoKENISVBJRChwaS0+c2gtPmNoaXApID09IEJDTTQ3MTZfQ0hJUF9JRCkgfHwKLQkJCSAgICAoQ0hJUElEKHBpLT5zaC0+Y2hpcCkgPT0gQkNNNDcxNjJfQ0hJUF9JRCkpIHsKKwkJCWlmICgocGktPnNoLT5jaGlwID09IEJDTTQ3MTZfQ0hJUF9JRCkgfHwKKwkJCSAgICAocGktPnNoLT5jaGlwID09IEJDTTQ3MTYyX0NISVBfSUQpKSB7CiAKIAkJCQl3cml0ZV9yYWRpb19yZWcocGksCiAJCQkJCQlSQURJT18yMDU2X1NZTl9QTExfTE9PUEZJTFRFUjQgfApAQCAtMTgwNzAsOCArMTgwNzUsOCBAQAogCQkJCVdSSVRFX1JBRElPX1JFRzIocGksIFJBRElPXzIwNTYsIFRYLCBjb3JlLAogCQkJCQkJIFBBREdfSURBQywgMHhjYyk7CiAKLQkJCQlpZiAoKENISVBJRChwaS0+c2gtPmNoaXApID09IEJDTTQ3MTZfQ0hJUF9JRCkgfHwKLQkJCQkgICAgKENISVBJRChwaS0+c2gtPmNoaXApID09CisJCQkJaWYgKChwaS0+c2gtPmNoaXAgPT0gQkNNNDcxNl9DSElQX0lEKSB8fAorCQkJCSAgICAocGktPnNoLT5jaGlwID09CiAJCQkJICAgICBCQ000NzE2Ml9DSElQX0lEKSkgewogCQkJCQliaWFzID0gMHg0MDsKIAkJCQkJY2FzY2JpYXMgPSAweDQ1OwpAQCAtMTgwODMsMTEgKzE4MDg4LDExIEBACiAJCQkJCWJpYXMgPSAweDI1OwogCQkJCQljYXNjYmlhcyA9IDB4MjA7CiAKLQkJCQkJaWYgKChDSElQSUQocGktPnNoLT5jaGlwKSA9PQorCQkJCQlpZiAoKHBpLT5zaC0+Y2hpcCA9PQogCQkJCQkgICAgIEJDTTQzMjI0X0NISVBfSUQpCi0JCQkJCSAgICB8fCAoQ0hJUElEKHBpLT5zaC0+Y2hpcCkgPT0KKwkJCQkJICAgIHx8IChwaS0+c2gtPmNoaXAgPT0KIAkJCQkJCUJDTTQzMjI1X0NISVBfSUQpCi0JCQkJCSAgICB8fCAoQ0hJUElEKHBpLT5zaC0+Y2hpcCkgPT0KKwkJCQkJICAgIHx8IChwaS0+c2gtPmNoaXAgPT0KIAkJCQkJCUJDTTQzNDIxX0NISVBfSUQpKSB7CiAJCQkJCQlpZiAocGktPnNoLT5jaGlwcGtnID09CiAJCQkJCQkgICAgQkNNNDMyMjRfRkFCX1NNSUMpIHsKQEAgLTE4MTk4LDkgKzE4MjAzLDkgQEAKIAogCQkJY2FzY2JpYXMgPSAweDMwOwogCi0JCQlpZiAoKENISVBJRChwaS0+c2gtPmNoaXApID09IEJDTTQzMjI0X0NISVBfSUQpIHx8Ci0JCQkgICAgKENISVBJRChwaS0+c2gtPmNoaXApID09IEJDTTQzMjI1X0NISVBfSUQpIHx8Ci0JCQkgICAgKENISVBJRChwaS0+c2gtPmNoaXApID09IEJDTTQzNDIxX0NISVBfSUQpKSB7CisJCQlpZiAoKHBpLT5zaC0+Y2hpcCA9PSBCQ000MzIyNF9DSElQX0lEKSB8fAorCQkJICAgIChwaS0+c2gtPmNoaXAgPT0gQkNNNDMyMjVfQ0hJUF9JRCkgfHwKKwkJCSAgICAocGktPnNoLT5jaGlwID09IEJDTTQzNDIxX0NISVBfSUQpKSB7CiAJCQkJaWYgKHBpLT5zaC0+Y2hpcHBrZyA9PSBCQ000MzIyNF9GQUJfU01JQykgewogCQkJCQljYXNjYmlhcyA9IDB4MzU7CiAJCQkJfQpAQCAtMTg5MjcsNyArMTg5MzIsNyBAQAogCQkJY2FzZSAzODoKIAkJCWNhc2UgMTAyOgogCQkJY2FzZSAxMTg6Ci0JCQkJaWYgKChDSElQSUQocGktPnNoLT5jaGlwKSA9PSBCQ000NzE2X0NISVBfSUQpICYmCisJCQkJaWYgKChwaS0+c2gtPmNoaXAgPT0gQkNNNDcxNl9DSElQX0lEKSAmJgogCQkJCSAgICAocGktPnNoLT5jaGlwcGtnID09IEJDTTQ3MTdfUEtHX0lEKSkgewogCQkJCQlucGh5X2Fkal90b25lX2lkX2J1ZlswXSA9IDMyOwogCQkJCQlucGh5X2Fkal9ub2lzZV92YXJfYnVmWzBdID0gMHgyMWY7CkBAIC0xOTA2Miw3ICsxOTA2Nyw3IEBACiAJCQkJaWYgKHBpLT5ucGh5X2FiYW5kX3NwdXJ3YXJfZW4gJiYKIAkJCQkgICAgKCh2YWwgPT0gMzgpIHx8ICh2YWwgPT0gMTAyKQogCQkJCSAgICAgfHwgKHZhbCA9PSAxMTgpKSkgewotCQkJCQlpZiAoKENISVBJRChwaS0+c2gtPmNoaXApID09CisJCQkJCWlmICgocGktPnNoLT5jaGlwID09CiAJCQkJCSAgICAgQkNNNDcxNl9DSElQX0lEKQogCQkJCQkgICAgJiYgKHBpLT5zaC0+Y2hpcHBrZyA9PQogCQkJCQkJQkNNNDcxN19QS0dfSUQpKSB7CkBAIC0xOTA3Nyw4ICsxOTA4Miw4IEBACiAJCWlmIChwaS0+cGh5X3NwdXJhdm9pZCA9PSBTUFVSQVZPSURfRk9SQ0VPTikKIAkJCXNwdXJhdm9pZCA9IDE7CiAKLQkJaWYgKChDSElQSUQocGktPnNoLT5jaGlwKSA9PSBCQ000NzE2X0NISVBfSUQpIHx8Ci0JCSAgICAoQ0hJUElEKHBpLT5zaC0+Y2hpcCkgPT0gQkNNNDcxNjJfQ0hJUF9JRCkpIHsKKwkJaWYgKChwaS0+c2gtPmNoaXAgPT0gQkNNNDcxNl9DSElQX0lEKSB8fAorCQkgICAgKHBpLT5zaC0+Y2hpcCA9PSBCQ000NzE2Ml9DSElQX0lEKSkgewogCQkJc2lfcG11X3NwdXJhdm9pZChwaS0+c2gtPnNpaCwgcGktPnNoLT5vc2gsIHNwdXJhdm9pZCk7CiAJCX0gZWxzZSB7CiAJCQl3bGFwaV9ibWFjX2NvcmVfcGh5cGxsX2N0bChwaS0+c2gtPnBoeXNoaW0sIGZhbHNlKTsKQEAgLTE5MDg2LDkgKzE5MDkxLDkgQEAKIAkJCXdsYXBpX2JtYWNfY29yZV9waHlwbGxfY3RsKHBpLT5zaC0+cGh5c2hpbSwgdHJ1ZSk7CiAJCX0KIAotCQlpZiAoKENISVBJRChwaS0+c2gtPmNoaXApID09IEJDTTQzMjI0X0NISVBfSUQpIHx8Ci0JCSAgICAoQ0hJUElEKHBpLT5zaC0+Y2hpcCkgPT0gQkNNNDMyMjVfQ0hJUF9JRCkgfHwKLQkJICAgIChDSElQSUQocGktPnNoLT5jaGlwKSA9PSBCQ000MzQyMV9DSElQX0lEKSkgeworCQlpZiAoKHBpLT5zaC0+Y2hpcCA9PSBCQ000MzIyNF9DSElQX0lEKSB8fAorCQkgICAgKHBpLT5zaC0+Y2hpcCA9PSBCQ000MzIyNV9DSElQX0lEKSB8fAorCQkgICAgKHBpLT5zaC0+Y2hpcCA9PSBCQ000MzQyMV9DSElQX0lEKSkgewogCiAJCQlpZiAoc3B1cmF2b2lkID09IDEpIHsKIApAQCAtMTkxMDUsOCArMTkxMTAsOCBAQAogCQkJfQogCQl9CiAKLQkJaWYgKCEoKENISVBJRChwaS0+c2gtPmNoaXApID09IEJDTTQ3MTZfQ0hJUF9JRCkgfHwKLQkJICAgICAgKENISVBJRChwaS0+c2gtPmNoaXApID09IEJDTTQ3MTYyX0NISVBfSUQpKSkgeworCQlpZiAoISgocGktPnNoLT5jaGlwID09IEJDTTQ3MTZfQ0hJUF9JRCkgfHwKKwkJICAgICAgKHBpLT5zaC0+Y2hpcCA9PSBCQ000NzE2Ml9DSElQX0lEKSkpIHsKIAkJCXdsYXBpX2JtYWNfY29yZV9waHlwbGxfcmVzZXQocGktPnNoLT5waHlzaGltKTsKIAkJfQogCkBAIC0yMTA2MiwxMSArMjEwNjcsMTEgQEAKIAkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9BRkVDVFJMLCAxLCAweDAzLCAxNiwKIAkJCQkJICZhdXhBRENfcnNzaV9jdHJsSF9zYXZlKTsKIAotCQlpZiAoQ0hJUElEKHBpLT5zaC0+Y2hpcCkgPT0gQkNNNTM1N19DSElQX0lEKSB7CisJCWlmIChwaS0+c2gtPmNoaXAgPT0gQkNNNTM1N19DSElQX0lEKSB7CiAJCQlyYWRpb190ZW1wWzBdID0gKDE5MyAqIChyYWRpb190ZW1wWzFdICsgcmFkaW9fdGVtcDJbMV0pCiAJCQkJCSArIDg4ICogKGF1eEFEQ19WbCkgLSAyNzExMSArCiAJCQkJCSAxMjgpIC8gMjU2OwotCQl9IGVsc2UgaWYgKENISVBJRChwaS0+c2gtPmNoaXApID09IEJDTTQzMjM2X0NISVBfSUQpIHsKKwkJfSBlbHNlIGlmIChwaS0+c2gtPmNoaXAgPT0gQkNNNDMyMzZfQ0hJUF9JRCkgewogCQkJcmFkaW9fdGVtcFswXSA9ICgxOTggKiAocmFkaW9fdGVtcFsxXSArIHJhZGlvX3RlbXAyWzFdKQogCQkJCQkgKyA5MSAqIChhdXhBRENfVmwpIC0gMjcyNDMgKwogCQkJCQkgMTI4KSAvIDI1NjsKQEAgLTI2Mjc3LDcgKzI2MjgyLDcgQEAKIAkJfSBlbHNlIGlmIChOUkVWX0lTKHBpLT5wdWJwaS5waHlfcmV2LCA2KSkgewogCiAJCQl0eF9wd3JjdHJsX3RibCA9IG5waHlfdHBjX3R4Z2Fpbl9pcGFfcmV2NjsKLQkJCWlmIChDSElQSUQocGktPnNoLT5jaGlwKSA9PSBCQ000NzE2Ml9DSElQX0lEKSB7CisJCQlpZiAocGktPnNoLT5jaGlwID09IEJDTTQ3MTYyX0NISVBfSUQpIHsKIAogCQkJCXR4X3B3cmN0cmxfdGJsID0gbnBoeV90cGNfdHhnYWluX2lwYV9yZXY1OwogCQkJfQpAQCAtMjY4MzMsNyArMjY4MzgsNyBAQAogCQlwaHlfYTIgPSA2MzsKIAogCQlpZiAoQ0hTUEVDX0lTMkcocGktPnJhZGlvX2NoYW5zcGVjKSkgewotCQkJaWYgKENISVBJRChwaS0+c2gtPmNoaXApID09IEJDTTYzNjJfQ0hJUF9JRCkgeworCQkJaWYgKHBpLT5zaC0+Y2hpcCA9PSBCQ002MzYyX0NISVBfSUQpIHsKIAkJCQlwaHlfYTEgPSAzNTsKIAkJCQlwaHlfYTMgPSAzNTsKIAkJCX0gZWxzZSBpZiAoKHBpLT5wdWJwaS5yYWRpb3JldiA9PSA0KQpAQCAtMjY5NDYsNyArMjY5NTEsNyBAQAogCQkJCQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgNikpIHsKIAkJCQkJCXBoeV9hNSA9IDB4MDBmNyB8IChwaHlfYTQgPDwgOCk7CiAKLQkJCQkJCWlmIChDSElQSUQocGktPnNoLT5jaGlwKSA9PQorCQkJCQkJaWYgKHBpLT5zaC0+Y2hpcCA9PQogCQkJCQkJICAgIEJDTTQ3MTYyX0NISVBfSUQpIHsKIAkJCQkJCQlwaHlfYTUgPQogCQkJCQkJCSAgICAweDEwZjcgfCAocGh5X2E0IDw8CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3BoeS93bGNfcGh5dGJsX2xjbi5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9waHkvd2xjX3BoeXRibF9sY24uYwppbmRleCA2Y2U5ZTVkLi4zMzBiODgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3BoeS93bGNfcGh5dGJsX2xjbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvcGh5L3dsY19waHl0YmxfbGNuLmMKQEAgLTE1LDYgKzE1LDkgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxzYmhuZHBpby5oPgorI2luY2x1ZGUgPHNiaG5kZG1hLmg+CisjaW5jbHVkZSA8b3NsLmg+CiAjaW5jbHVkZSA8d2xjX3BoeV9pbnQuaD4KICNpbmNsdWRlIDx3bGNfcGh5dGJsX2xjbi5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3BoeS93bGNfcGh5dGJsX24uYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvcGh5L3dsY19waHl0Ymxfbi5jCmluZGV4IDdjYzJjNTYuLmE5ZmMxOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvcGh5L3dsY19waHl0Ymxfbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvcGh5L3dsY19waHl0Ymxfbi5jCkBAIC0xNiw2ICsxNiw5IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KIAorI2luY2x1ZGUgPHNiaG5kcGlvLmg+CisjaW5jbHVkZSA8c2JobmRkbWEuaD4KKyNpbmNsdWRlIDxvc2wuaD4KICNpbmNsdWRlIDx3bGNfcGh5X2ludC5oPgogI2luY2x1ZGUgPHdsY19waHl0Ymxfbi5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bF9kYmcuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsX2RiZy5oCmluZGV4IGU2M2IyN2UuLjU0YWYyNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsX2RiZy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsX2RiZy5oCkBAIC0yMCwxNSArMjAsMjAgQEAKIC8qIHdsX21zZ19sZXZlbCBpcyBhIGJpdCB2ZWN0b3Igd2l0aCBkZWZzIGluIHdsaW9jdGwuaCAqLwogZXh0ZXJuIHUzMiB3bF9tc2dfbGV2ZWw7CiAKLSNkZWZpbmUgV0xfUFJJTlQoYXJncykJCXByaW50ZiBhcmdzCi0jZGVmaW5lIFdMX05PTkUoYXJncykKKyNkZWZpbmUgV0xfTk9ORShmbXQsIGFyZ3MuLi4pIG5vX3ByaW50ayhmbXQsICMjYXJncykKKworI2RlZmluZSBXTF9QUklOVChsZXZlbCwgZm10LCBhcmdzLi4uKQkJXAorZG8gewkJCQkJCVwKKwlpZiAod2xfbXNnX2xldmVsICYgbGV2ZWwpCQlcCisJCXByaW50ayhmbXQsICMjYXJncyk7CQlcCit9IHdoaWxlICgwKQogCiAjaWZkZWYgQkNNREJHCiAKLSNkZWZpbmUJV0xfRVJST1IoYXJncykJCWRvIHtpZiAoKHdsX21zZ19sZXZlbCAmIFdMX0VSUk9SX1ZBTCkpIFdMX1BSSU5UKGFyZ3MpOyB9IHdoaWxlICgwKQotI2RlZmluZQlXTF9UUkFDRShhcmdzKQkJZG8ge2lmICh3bF9tc2dfbGV2ZWwgJiBXTF9UUkFDRV9WQUwpIFdMX1BSSU5UKGFyZ3MpOyB9IHdoaWxlICgwKQotI2RlZmluZSBXTF9BTVBEVShhcmdzKQkJZG8ge2lmICh3bF9tc2dfbGV2ZWwgJiBXTF9BTVBEVV9WQUwpIFdMX1BSSU5UKGFyZ3MpOyB9IHdoaWxlICgwKQotI2RlZmluZSBXTF9GRlBMRChhcmdzKQkJZG8ge2lmICh3bF9tc2dfbGV2ZWwgJiBXTF9GRlBMRF9WQUwpIFdMX1BSSU5UKGFyZ3MpOyB9IHdoaWxlICgwKQorI2RlZmluZQlXTF9FUlJPUihmbXQsIGFyZ3MuLi4pCVdMX1BSSU5UKFdMX0VSUk9SX1ZBTCwgZm10LCAjI2FyZ3MpCisjZGVmaW5lCVdMX1RSQUNFKGZtdCwgYXJncy4uLikJV0xfUFJJTlQoV0xfVFJBQ0VfVkFMLCBmbXQsICMjYXJncykKKyNkZWZpbmUgV0xfQU1QRFUoZm10LCBhcmdzLi4uKQlXTF9QUklOVChXTF9BTVBEVV9WQUwsIGZtdCwgIyNhcmdzKQorI2RlZmluZSBXTF9GRlBMRChmbXQsIGFyZ3MuLi4pCVdMX1BSSU5UKFdMX0ZGUExEX1ZBTCwgZm10LCAjI2FyZ3MpCiAKICNkZWZpbmUgV0xfRVJST1JfT04oKQkJKHdsX21zZ19sZXZlbCAmIFdMX0VSUk9SX1ZBTCkKIApAQCAtNDQsMzUgKzQ5LDUwIEBACiAKIGV4dGVybiB1MzIgd2xfYW1wZHVfZGJnOwogCi0jZGVmaW5lIFdMX0FNUERVX1VQRE4oYXJncykgZG8ge2lmICh3bF9hbXBkdV9kYmcgJiBXTF9BTVBEVV9VUEROX1ZBTCkge1dMX0FNUERVKGFyZ3MpOyB9IH0gd2hpbGUgKDApCi0jZGVmaW5lIFdMX0FNUERVX1JYKGFyZ3MpIGRvIHtpZiAod2xfYW1wZHVfZGJnICYgV0xfQU1QRFVfUlhfVkFMKSB7V0xfQU1QRFUoYXJncyk7IH0gfSB3aGlsZSAoMCkKLSNkZWZpbmUgV0xfQU1QRFVfRVJSKGFyZ3MpIGRvIHtpZiAod2xfYW1wZHVfZGJnICYgV0xfQU1QRFVfRVJSX1ZBTCkge1dMX0FNUERVKGFyZ3MpOyB9IH0gd2hpbGUgKDApCi0jZGVmaW5lIFdMX0FNUERVX1RYKGFyZ3MpIGRvIHtpZiAod2xfYW1wZHVfZGJnICYgV0xfQU1QRFVfVFhfVkFMKSB7V0xfQU1QRFUoYXJncyk7IH0gfSB3aGlsZSAoMCkKLSNkZWZpbmUgV0xfQU1QRFVfQ1RMKGFyZ3MpIGRvIHtpZiAod2xfYW1wZHVfZGJnICYgV0xfQU1QRFVfQ1RMX1ZBTCkge1dMX0FNUERVKGFyZ3MpOyB9IH0gd2hpbGUgKDApCi0jZGVmaW5lIFdMX0FNUERVX0hXKGFyZ3MpIGRvIHtpZiAod2xfYW1wZHVfZGJnICYgV0xfQU1QRFVfSFdfVkFMKSB7V0xfQU1QRFUoYXJncyk7IH0gfSB3aGlsZSAoMCkKLSNkZWZpbmUgV0xfQU1QRFVfSFdUWFMoYXJncykgZG8ge2lmICh3bF9hbXBkdV9kYmcgJiBXTF9BTVBEVV9IV1RYU19WQUwpIHtXTF9BTVBEVShhcmdzKTsgfSB9IHdoaWxlICgwKQotI2RlZmluZSBXTF9BTVBEVV9IV0RCRyhhcmdzKSBkbyB7aWYgKHdsX2FtcGR1X2RiZyAmIFdMX0FNUERVX0hXREJHX1ZBTCkge1dMX0FNUERVKGFyZ3MpOyB9IH0gd2hpbGUgKDApCisjZGVmaW5lIFdMX0FNUERVX1BSSU5UKGxldmVsLCBmbXQsIGFyZ3MuLi4pCVwKK2RvIHsJCQkJCQlcCisJaWYgKHdsX2FtcGR1X2RiZyAmIGxldmVsKSB7CQlcCisJCVdMX0FNUERVKGZtdCwgIyNhcmdzKTsJCVwKKwl9CQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFdMX0FNUERVX1VQRE4oZm10LCBhcmdzLi4uKQkJCVwKKwlXTF9BTVBEVV9QUklOVChXTF9BTVBEVV9VUEROX1ZBTCwgZm10LCAjI2FyZ3MpCisjZGVmaW5lIFdMX0FNUERVX1JYKGZtdCwgYXJncy4uLikJCQlcCisJV0xfQU1QRFVfUFJJTlQoV0xfQU1QRFVfUlhfVkFMLCBmbXQsICMjYXJncykKKyNkZWZpbmUgV0xfQU1QRFVfRVJSKGZtdCwgYXJncy4uLikJCQlcCisJV0xfQU1QRFVfUFJJTlQoV0xfQU1QRFVfRVJSX1ZBTCwgZm10LCAjI2FyZ3MpCisjZGVmaW5lIFdMX0FNUERVX1RYKGZtdCwgYXJncy4uLikJCQlcCisJV0xfQU1QRFVfUFJJTlQoV0xfQU1QRFVfVFhfVkFMLCBmbXQsICMjYXJncykKKyNkZWZpbmUgV0xfQU1QRFVfQ1RMKGZtdCwgYXJncy4uLikJCQlcCisJV0xfQU1QRFVfUFJJTlQoV0xfQU1QRFVfQ1RMX1ZBTCwgZm10LCAjI2FyZ3MpCisjZGVmaW5lIFdMX0FNUERVX0hXKGZtdCwgYXJncy4uLikJCQlcCisJV0xfQU1QRFVfUFJJTlQoV0xfQU1QRFVfSFdfVkFMLCBmbXQsICMjYXJncykKKyNkZWZpbmUgV0xfQU1QRFVfSFdUWFMoZm10LCBhcmdzLi4uKQkJCVwKKwlXTF9BTVBEVV9QUklOVChXTF9BTVBEVV9IV1RYU19WQUwsIGZtdCwgIyNhcmdzKQorI2RlZmluZSBXTF9BTVBEVV9IV0RCRyhmbXQsIGFyZ3MuLi4pCQkJXAorCVdMX0FNUERVX1BSSU5UKFdMX0FNUERVX0hXREJHX1ZBTCwgZm10LCAjI2FyZ3MpCiAjZGVmaW5lIFdMX0FNUERVX0VSUl9PTigpICh3bF9hbXBkdV9kYmcgJiBXTF9BTVBEVV9FUlJfVkFMKQogI2RlZmluZSBXTF9BTVBEVV9IV19PTigpICh3bF9hbXBkdV9kYmcgJiBXTF9BTVBEVV9IV19WQUwpCiAjZGVmaW5lIFdMX0FNUERVX0hXVFhTX09OKCkgKHdsX2FtcGR1X2RiZyAmIFdMX0FNUERVX0hXVFhTX1ZBTCkKIAogI2Vsc2UJCQkJLyogQkNNREJHICovCiAKLSNkZWZpbmUJV0xfRVJST1IoYXJncykKLSNkZWZpbmUJV0xfVFJBQ0UoYXJncykKLSNkZWZpbmUgV0xfQU1QRFUoYXJncykKLSNkZWZpbmUgV0xfRkZQTEQoYXJncykKKyNkZWZpbmUJV0xfRVJST1IoZm10LCBhcmdzLi4uKQkJbm9fcHJpbnRrKGZtdCwgIyNhcmdzKQorI2RlZmluZQlXTF9UUkFDRShmbXQsIGFyZ3MuLi4pCQlub19wcmludGsoZm10LCAjI2FyZ3MpCisjZGVmaW5lIFdMX0FNUERVKGZtdCwgYXJncy4uLikJCW5vX3ByaW50ayhmbXQsICMjYXJncykKKyNkZWZpbmUgV0xfRkZQTEQoZm10LCBhcmdzLi4uKQkJbm9fcHJpbnRrKGZtdCwgIyNhcmdzKQogCiAjZGVmaW5lIFdMX0VSUk9SX09OKCkJCTAKIAotI2RlZmluZSBXTF9BTVBEVV9VUEROKGFyZ3MpCi0jZGVmaW5lIFdMX0FNUERVX1JYKGFyZ3MpCi0jZGVmaW5lIFdMX0FNUERVX0VSUihhcmdzKQotI2RlZmluZSBXTF9BTVBEVV9UWChhcmdzKQotI2RlZmluZSBXTF9BTVBEVV9DVEwoYXJncykKLSNkZWZpbmUgV0xfQU1QRFVfSFcoYXJncykKLSNkZWZpbmUgV0xfQU1QRFVfSFdUWFMoYXJncykKLSNkZWZpbmUgV0xfQU1QRFVfSFdEQkcoYXJncykKKyNkZWZpbmUgV0xfQU1QRFVfVVBETihmbXQsIGFyZ3MuLi4pCW5vX3ByaW50ayhmbXQsICMjYXJncykKKyNkZWZpbmUgV0xfQU1QRFVfUlgoZm10LCBhcmdzLi4uKQlub19wcmludGsoZm10LCAjI2FyZ3MpCisjZGVmaW5lIFdMX0FNUERVX0VSUihmbXQsIGFyZ3MuLi4pCW5vX3ByaW50ayhmbXQsICMjYXJncykKKyNkZWZpbmUgV0xfQU1QRFVfVFgoZm10LCBhcmdzLi4uKQlub19wcmludGsoZm10LCAjI2FyZ3MpCisjZGVmaW5lIFdMX0FNUERVX0NUTChmbXQsIGFyZ3MuLi4pCW5vX3ByaW50ayhmbXQsICMjYXJncykKKyNkZWZpbmUgV0xfQU1QRFVfSFcoZm10LCBhcmdzLi4uKQlub19wcmludGsoZm10LCAjI2FyZ3MpCisjZGVmaW5lIFdMX0FNUERVX0hXVFhTKGZtdCwgYXJncy4uLikJbm9fcHJpbnRrKGZtdCwgIyNhcmdzKQorI2RlZmluZSBXTF9BTVBEVV9IV0RCRyhmbXQsIGFyZ3MuLi4pCW5vX3ByaW50ayhmbXQsICMjYXJncykKICNkZWZpbmUgV0xfQU1QRFVfRVJSX09OKCkgICAgICAgMAogI2RlZmluZSBXTF9BTVBEVV9IV19PTigpICAgICAgICAwCiAjZGVmaW5lIFdMX0FNUERVX0hXVFhTX09OKCkgICAgIDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsX2V4cG9ydC5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xfZXhwb3J0LmgKaW5kZXggMDg0NDJmOC4uYWE4YjVhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xfZXhwb3J0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xfZXhwb3J0LmgKQEAgLTQ1LDEwICs0NSwxMCBAQAogCQkJIGludCBwZXJpb2RpYyk7CiBleHRlcm4gYm9vbCB3bF9kZWxfdGltZXIoc3RydWN0IHdsX2luZm8gKndsLCBzdHJ1Y3Qgd2xfdGltZXIgKnRpbWVyKTsKIAotZXh0ZXJuIHVpbnQgd2xfYnVmX3RvX3BrdGNvcHkob3NsX3QgKm9zaCwgdm9pZCAqcCwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuLAotCQkJICAgICAgdWludCBvZmZzZXQpOwotZXh0ZXJuIHZvaWQgKndsX2dldF9wa3RidWZmZXIob3NsX3QgKm9zaCwgaW50IGxlbik7Ci1leHRlcm4gaW50IHdsX3NldF9wa3RsZW4ob3NsX3QgKm9zaCwgdm9pZCAqcCwgaW50IGxlbik7CitleHRlcm4gdWludCB3bF9idWZfdG9fcGt0Y29weShzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqcCwgdW5zaWduZWQgY2hhciAqYnVmLAorCQkJICAgICAgaW50IGxlbiwgdWludCBvZmZzZXQpOworZXh0ZXJuIHZvaWQgKndsX2dldF9wa3RidWZmZXIoc3RydWN0IG9zbF9pbmZvICpvc2gsIGludCBsZW4pOworZXh0ZXJuIGludCB3bF9zZXRfcGt0bGVuKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB2b2lkICpwLCBpbnQgbGVuKTsKIAogI2RlZmluZSB3bF9zb3J0X2Jzc2xpc3QoYSwgYikgZmFsc2UKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xfbWFjODAyMTEuYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsX21hYzgwMjExLmMKaW5kZXggZDA2MDM3Ny4uYmRkNjI5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xfbWFjODAyMTEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bF9tYWM4MDIxMS5jCkBAIC0yMSw3MiArMjEsMzYgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9wY2lfaWRzLmg+CiAjaW5jbHVkZSA8YmNtZGVmcy5oPgotI2luY2x1ZGUgPGxpbnV4dmVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxvc2wuaD4KICNkZWZpbmUgV0xDX01BWEJTU0NGRwkJMQkvKiBzaW5nbGUgQlNTIGNvbmZpZ3MgKi8KIAogI2luY2x1ZGUgPHdsY19jZmcuaD4KICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KLSNpbmNsdWRlIDxlcGl2ZXJzLmg+Ci0jaWZuZGVmIFdMQ19ISUdIX09OTFkKICNpbmNsdWRlIDxwaHlfdmVyc2lvbi5oPgotI2VuZGlmCiAjaW5jbHVkZSA8YmNtdXRpbHMuaD4KICNpbmNsdWRlIDxwY2ljZmcuaD4KICNpbmNsdWRlIDx3bGlvY3RsLmg+CiAjaW5jbHVkZSA8d2xjX2tleS5oPgorI2luY2x1ZGUgPHNiaG5kcGlvLmg+CisjaW5jbHVkZSA8c2JobmRkbWEuaD4KICNpbmNsdWRlIDx3bGNfY2hhbm5lbC5oPgogI2luY2x1ZGUgPHdsY19wdWIuaD4KICNpbmNsdWRlIDx3bGNfc2NiLmg+CiAjaW5jbHVkZSA8d2xfZGJnLmg+Ci0jaWZkZWYgQkNNU0RJTwotI2luY2x1ZGUgPGJjbXNkaC5oPgotI2VuZGlmCiAjaW5jbHVkZSA8d2xfZXhwb3J0Lmg+Ci0jaWZkZWYgV0xDX0hJR0hfT05MWQotI2luY2x1ZGUgImRidXMuaCIKLSNpbmNsdWRlICJiY21fcnBjX3RwLmgiCi0jaW5jbHVkZSAiYmNtX3JwYy5oIgotI2luY2x1ZGUgImJjbV94ZHIuaCIKLSNpbmNsdWRlICJ3bGNfcnBjLmgiCi0jZW5kaWYKIAogI2luY2x1ZGUgPHdsX21hYzgwMjExLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KLSNpZm5kZWYgV0xDX0hJR0hfT05MWQogI2luY2x1ZGUgPHdsX3Vjb2RlLmg+CiAjaW5jbHVkZSA8ZDExdWNvZGVfZXh0Lmg+Ci0jZW5kaWYKIAotI2lmZGVmIEJDTVNESU8KLWV4dGVybiBzdHJ1Y3QgZGV2aWNlICpzZGlvbW1jX2RldjsKLSNlbmRpZgotCi1leHRlcm4gdm9pZCB3bGNfd21lX3NldHBhcmFtcyh3bGNfaW5mb190ICp3bGMsIHUxNiBhY2ksIHZvaWQgKmFyZywKLQkJCSAgICAgIGJvb2wgc3VzcGVuZCk7Ci1ib29sIHdsY19zZW5kcGt0X21hYzgwMjExKHdsY19pbmZvX3QgKndsYywgdm9pZCAqc2R1LCBzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Ci12b2lkIHdsY19tYWNfYmNuX3Byb21pc2NfY2hhbmdlKHdsY19pbmZvX3QgKndsYywgYm9vbCBwcm9taXNjKTsKLXZvaWQgd2xjX3NldF9hZGRybWF0Y2god2xjX2luZm9fdCAqd2xjLCBpbnQgbWF0Y2hfcmVnX29mZnNldCwKLQkJICAgICAgIGNvbnN0IHN0cnVjdCBldGhlcl9hZGRyICphZGRyKTsKIAogc3RhdGljIHZvaWQgd2xfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKIHN0YXRpYyB2b2lkIF93bF90aW1lcih3bF90aW1lcl90ICp0KTsKIAotI2lmZGVmIFdMQ19ISUdIX09OTFkKLSNkZWZpbmUgUlBDUV9MT0NLKF93bCwgX2ZsYWdzKSBzcGluX2xvY2tfaXJxc2F2ZSgmKF93bCktPnJwY3FfbG9jaywgKF9mbGFncykpCi0jZGVmaW5lIFJQQ1FfVU5MT0NLKF93bCwgX2ZsYWdzKSAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKF93bCktPnJwY3FfbG9jaywgKF9mbGFncykpCi0jZGVmaW5lIFRYUV9MT0NLKF93bCwgX2ZsYWdzKSBzcGluX2xvY2tfaXJxc2F2ZSgmKF93bCktPnR4cV9sb2NrLCAoX2ZsYWdzKSkKLSNkZWZpbmUgVFhRX1VOTE9DSyhfd2wsIF9mbGFncykgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihfd2wpLT50eHFfbG9jaywgKF9mbGFncykpCi1zdGF0aWMgdm9pZCB3bF9ycGNfZG93bih2b2lkICp3bGgpOwotc3RhdGljIHZvaWQgd2xfcnBjcV9mcmVlKHdsX2luZm9fdCAqd2wpOwotc3RhdGljIHZvaWQgd2xfcnBjcV9kaXNwYXRjaChzdHJ1Y3Qgd2xfdGFzayAqdGFzayk7Ci1zdGF0aWMgdm9pZCB3bF9ycGNfZGlzcGF0Y2hfc2NoZWR1bGUodm9pZCAqY3R4LCBzdHJ1Y3QgcnBjX2J1ZiAqYnVmKTsKLXN0YXRpYyB2b2lkIHdsX3N0YXJ0X3R4cXdvcmsoc3RydWN0IHdsX3Rhc2sgKnRhc2spOwotc3RhdGljIHZvaWQgd2xfdHhxX2ZyZWUod2xfaW5mb190ICp3bCk7Ci1zdGF0aWMgdm9pZCB3bF90aW1lcl90YXNrKHdsX3Rhc2tfdCAqdGFzayk7Ci1zdGF0aWMgaW50IHdsX3NjaGVkdWxlX3Rhc2sod2xfaW5mb190ICp3bCwgdm9pZCAoKmZuKSAoc3RydWN0IHdsX3Rhc2sgKiksCi0JCQkgICAgdm9pZCAqY29udGV4dCk7Ci0jZW5kaWYJCQkJLyogV0xDX0hJR0hfT05MWSAqLwogCiBzdGF0aWMgaW50IGllZWVfaHdfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CiBzdGF0aWMgaW50IGllZWVfaHdfcmF0ZV9pbml0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKQEAgLTEzNCwxNiArOTgsMTQgQEAKIAl1OCByeF9oZHJbMTZdLCB0eF9oZHJbMTZdOwogfTsKIAotI2lmbmRlZiBXTENfSElHSF9PTkxZCi0jZGVmaW5lIFdMX0RFVl9JRihkZXYpCQkoKHdsX2lmX3QgKiluZXRkZXZfcHJpdihkZXYpKQotI2RlZmluZQlXTF9JTkZPKGRldikJCSgod2xfaW5mb190ICopKFdMX0RFVl9JRihkZXYpLT53bCkpCS8qIHBvaW50cyB0byB3bCAqLwotc3RhdGljIGludCB3bF9yZXF1ZXN0X2Z3KHdsX2luZm9fdCAqd2wsIHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKLXN0YXRpYyB2b2lkIHdsX3JlbGVhc2VfZncod2xfaW5mb190ICp3bCk7Ci0jZW5kaWYKKyNkZWZpbmUgV0xfREVWX0lGKGRldikJCSgoc3RydWN0IHdsX2lmICopbmV0ZGV2X3ByaXYoZGV2KSkKKyNkZWZpbmUJV0xfSU5GTyhkZXYpCQkoKHN0cnVjdCB3bF9pbmZvICopKFdMX0RFVl9JRihkZXYpLT53bCkpCitzdGF0aWMgaW50IHdsX3JlcXVlc3RfZncoc3RydWN0IHdsX2luZm8gKndsLCBzdHJ1Y3QgcGNpX2RldiAqcGRldik7CitzdGF0aWMgdm9pZCB3bF9yZWxlYXNlX2Z3KHN0cnVjdCB3bF9pbmZvICp3bCk7CiAKIC8qIGxvY2FsIHByb3RvdHlwZXMgKi8KLXN0YXRpYyBpbnQgd2xfc3RhcnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgd2xfaW5mb190ICp3bCk7Ci1zdGF0aWMgaW50IHdsX3N0YXJ0X2ludCh3bF9pbmZvX3QgKndsLCBzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKK3N0YXRpYyBpbnQgd2xfc3RhcnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHdsX2luZm8gKndsKTsKK3N0YXRpYyBpbnQgd2xfc3RhcnRfaW50KHN0cnVjdCB3bF9pbmZvICp3bCwgc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCiAJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIHN0YXRpYyB2b2lkIHdsX2RwYyh1bnNpZ25lZCBsb25nIGRhdGEpOwogCkBAIC0xNTIsNyArMTE0LDYgQEAKIE1PRFVMRV9TVVBQT1JURURfREVWSUNFKCJCcm9hZGNvbSA4MDIuMTFuIFdMQU4gY2FyZHMiKTsKIE1PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKIAotI2lmbmRlZiBCQ01TRElPCiAvKiByZWNvZ25pemVkIFBDSSBJRHMgKi8KIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB3bF9pZF90YWJsZVtdID0gewogCXtQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCAweDQzNTcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAkvKiA0MzIyNSAyRyAqLwpAQCAtMTYzLDU1ICsxMjQsMTggQEAKIAogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHdsX2lkX3RhYmxlKTsKIHN0YXRpYyB2b2lkIHdsX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldik7Ci0jZW5kaWYJCQkJLyogIUJDTVNESU8gKi8KIAotI2lmZGVmIEJDTVNESU8KLXN0YXRpYyB1aW50IHNkX2RyaXZlc3RyZW5ndGggPSA2OwotbW9kdWxlX3BhcmFtKHNkX2RyaXZlc3RyZW5ndGgsIHVpbnQsIDApOwotI2VuZGlmCiAKICNpZmRlZiBCQ01EQkcKIHN0YXRpYyBpbnQgbXNnbGV2ZWwgPSAweGRlYWRiZWVmOwogbW9kdWxlX3BhcmFtKG1zZ2xldmVsLCBpbnQsIDApOwotI2lmbmRlZiBXTENfSElHSF9PTkxZCiBzdGF0aWMgaW50IHBoeW1zZ2xldmVsID0gMHhkZWFkYmVlZjsKIG1vZHVsZV9wYXJhbShwaHltc2dsZXZlbCwgaW50LCAwKTsKLSNlbmRpZgkJCQkvKiBXTENfSElHSF9PTkxZICovCiAjZW5kaWYJCQkJLyogQkNNREJHICovCiAKLXN0YXRpYyBpbnQgb25lb25seTsKLW1vZHVsZV9wYXJhbShvbmVvbmx5LCBpbnQsIDApOwotCi1zdGF0aWMgaW50IHBpb21vZGU7Ci1tb2R1bGVfcGFyYW0ocGlvbW9kZSwgaW50LCAwKTsKLQotc3RhdGljIGludCBpbnN0YW5jZV9iYXNlOwkvKiBTdGFydGluZyBpbnN0YW5jZSBudW1iZXIgKi8KLW1vZHVsZV9wYXJhbShpbnN0YW5jZV9iYXNlLCBpbnQsIDApOwotCi0jaWYgZGVmaW5lZChCQ01EQkcpCi1zdGF0aWMgY2hhciAqbWFjYWRkcjsKLW1vZHVsZV9wYXJhbShtYWNhZGRyLCBjaGFycCwgU19JUlVHTyk7Ci0jZW5kaWYKLQotc3RhdGljIGludCBub21wYyA9IDE7Ci1tb2R1bGVfcGFyYW0obm9tcGMsIGludCwgMCk7Ci0KLXN0YXRpYyBjaGFyIG5hbWVbSUZOQU1TSVpdID0gImV0aCVkIjsKLW1vZHVsZV9wYXJhbV9zdHJpbmcobmFtZSwgbmFtZSwgSUZOQU1TSVosIDApOwotCi0jaWZuZGVmCVNSQ0JBU0UKLSNkZWZpbmUJU1JDQkFTRSAiLiIKLSNlbmRpZgotCi0jZGVmaW5lIFdMX01BR0lDIAkweGRlYWRiZWVmCi0KICNkZWZpbmUgSFdfVE9fV0woaHcpCSAoaHctPnByaXYpCiAjZGVmaW5lIFdMX1RPX0hXKHdsKQkgICh3bC0+cHViLT5pZWVlX2h3KQotI2lmZGVmIFdMQ19ISUdIX09OTFkKLXN0YXRpYyBpbnQgd2xfb3BzX3R4X25sKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLSNlbHNlCiBzdGF0aWMgaW50IHdsX29wc190eChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci0jZW5kaWYKIHN0YXRpYyBpbnQgd2xfb3BzX3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKIHN0YXRpYyB2b2lkIHdsX29wc19zdG9wKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKIHN0YXRpYyBpbnQgd2xfb3BzX2FkZF9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCkBAIC0yNDksMjggKzE3MywxMyBAQAogCQkJICAgZW51bSBpZWVlODAyMTFfYW1wZHVfbWxtZV9hY3Rpb24gYWN0aW9uLAogCQkJICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTE2IHRpZCwgdTE2ICpzc24pOwogCi0jaWZkZWYgV0xDX0hJR0hfT05MWQotc3RhdGljIGludCB3bF9vcHNfdHhfbmwoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JaW50IHN0YXR1czsKLQl3bF9pbmZvX3QgKndsID0gaHctPnByaXY7Ci0JaWYgKCF3bC0+cHViLT51cCkgewotCQlXTF9FUlJPUigoIm9wcy0+dHggY2FsbGVkIHdoaWxlIGRvd25cbiIpKTsKLQkJc3RhdHVzID0gLUVORVRET1dOOwotCQlnb3RvIGRvbmU7Ci0JfQotCXN0YXR1cyA9IHdsX3N0YXJ0KHNrYiwgd2wpOwotIGRvbmU6Ci0JcmV0dXJuIHN0YXR1czsKLX0KLSNlbHNlCiBzdGF0aWMgaW50IHdsX29wc190eChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlpbnQgc3RhdHVzOwotCXdsX2luZm9fdCAqd2wgPSBody0+cHJpdjsKKwlzdHJ1Y3Qgd2xfaW5mbyAqd2wgPSBody0+cHJpdjsKIAlXTF9MT0NLKHdsKTsKIAlpZiAoIXdsLT5wdWItPnVwKSB7Ci0JCVdMX0VSUk9SKCgib3BzLT50eCBjYWxsZWQgd2hpbGUgZG93blxuIikpOworCQlXTF9FUlJPUigib3BzLT50eCBjYWxsZWQgd2hpbGUgZG93blxuIik7CiAJCXN0YXR1cyA9IC1FTkVURE9XTjsKIAkJZ290byBkb25lOwogCX0KQEAgLTI3OSwxMyArMTg4LDE0IEBACiAJV0xfVU5MT0NLKHdsKTsKIAlyZXR1cm4gc3RhdHVzOwogfQotI2VuZGlmCQkJCS8qIFdMQ19ISUdIX09OTFkgKi8KIAogc3RhdGljIGludCB3bF9vcHNfc3RhcnQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCiB7Ci0Jd2xfaW5mb190ICp3bCA9IGh3LT5wcml2OwotCS8qIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY3VyY2hhbiA9IGh3LT5jb25mLmNoYW5uZWw7ICovCi0JV0xfTk9ORSgoIiVzIDogSW5pdGlhbCBjaGFubmVsOiAlZFxuIiwgX19mdW5jX18sIGN1cmNoYW4tPmh3X3ZhbHVlKSk7CisJc3RydWN0IHdsX2luZm8gKndsID0gaHctPnByaXY7CisJLyoKKwkgIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY3VyY2hhbiA9IGh3LT5jb25mLmNoYW5uZWw7CisJICBXTF9OT05FKCIlcyA6IEluaXRpYWwgY2hhbm5lbDogJWRcbiIsIF9fZnVuY19fLCBjdXJjaGFuLT5od192YWx1ZSk7CisJKi8KIAogCVdMX0xPQ0sod2wpOwogCWllZWU4MDIxMV93YWtlX3F1ZXVlcyhodyk7CkBAIC0yOTYsNyArMjA2LDcgQEAKIAogc3RhdGljIHZvaWQgd2xfb3BzX3N0b3Aoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCiB7Ci0Jd2xfaW5mb190ICp3bCA9IGh3LT5wcml2OworCXN0cnVjdCB3bF9pbmZvICp3bCA9IGh3LT5wcml2OwogCUFTU0VSVCh3bCk7CiAJV0xfTE9DSyh3bCk7CiAJd2xfZG93bih3bCk7CkBAIC0zMDksNyArMjE5LDcgQEAKIHN0YXRpYyBpbnQKIHdsX29wc19hZGRfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQogewotCXdsX2luZm9fdCAqd2w7CisJc3RydWN0IHdsX2luZm8gKndsOwogCWludCBlcnI7CiAKIAkvKiBKdXN0IFNUQSBmb3Igbm93ICovCkBAIC0zMTgsOCArMjI4LDggQEAKIAkgICAgdmlmLT50eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gJiYKIAkgICAgdmlmLT50eXBlICE9IE5MODAyMTFfSUZUWVBFX1dEUyAmJgogCSAgICB2aWYtPnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpIHsKLQkJV0xfRVJST1IoKCIlczogQXR0ZW1wdCB0byBhZGQgdHlwZSAlZCwgb25seSBTVEEgZm9yIG5vd1xuIiwKLQkJCSAgX19mdW5jX18sIHZpZi0+dHlwZSkpOworCQlXTF9FUlJPUigiJXM6IEF0dGVtcHQgdG8gYWRkIHR5cGUgJWQsIG9ubHkgU1RBIGZvciBub3dcbiIsCisJCQkgX19mdW5jX18sIHZpZi0+dHlwZSk7CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CiAKQEAgLTMyOSw3ICsyMzksNyBAQAogCVdMX1VOTE9DSyh3bCk7CiAKIAlpZiAoZXJyICE9IDApCi0JCVdMX0VSUk9SKCgiJXM6IHdsX3VwKCkgcmV0dXJuZWQgJWRcbiIsIF9fZnVuY19fLCBlcnIpKTsKKwkJV0xfRVJST1IoIiVzOiB3bF91cCgpIHJldHVybmVkICVkXG4iLCBfX2Z1bmNfXywgZXJyKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0zNDMsNyArMjUzLDcgQEAKIGllZWVfc2V0X2NoYW5uZWwoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbiwKIAkJIGVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgdHlwZSkKIHsKLQl3bF9pbmZvX3QgKndsID0gSFdfVE9fV0woaHcpOworCXN0cnVjdCB3bF9pbmZvICp3bCA9IEhXX1RPX1dMKGh3KTsKIAlpbnQgZXJyID0gMDsKIAogCXN3aXRjaCAodHlwZSkgewpAQCAtMzU1LDggKzI2NSw3IEBACiAJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9DSEFOX0hUNDBNSU5VUzoKIAljYXNlIE5MODAyMTFfQ0hBTl9IVDQwUExVUzoKLQkJV0xfRVJST1IoKCIlczogTmVlZCB0byBpbXBsZW1lbnQgNDAgTWh6IENoYW5uZWxzIVxuIiwKLQkJCSAgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIiVzOiBOZWVkIHRvIGltcGxlbWVudCA0MCBNaHogQ2hhbm5lbHMhXG4iLCBfX2Z1bmNfXyk7CiAJCWJyZWFrOwogCX0KIApAQCAtMzY4LDE3ICsyNzcsMTcgQEAKIHN0YXRpYyBpbnQgd2xfb3BzX2NvbmZpZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTMyIGNoYW5nZWQpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mID0gJmh3LT5jb25mOwotCXdsX2luZm9fdCAqd2wgPSBIV19UT19XTChodyk7CisJc3RydWN0IHdsX2luZm8gKndsID0gSFdfVE9fV0woaHcpOwogCWludCBlcnIgPSAwOwogCWludCBuZXdfaW50OwogCiAJaWYgKGNoYW5nZWQgJiBJRUVFODAyMTFfQ09ORl9DSEFOR0VfTElTVEVOX0lOVEVSVkFMKSB7Ci0JCVdMX05PTkUoKCIlczogU2V0dGluZyBsaXN0ZW4gaW50ZXJ2YWwgdG8gJWRcbiIsCi0JCQkgX19mdW5jX18sIGNvbmYtPmxpc3Rlbl9pbnRlcnZhbCkpOworCQlXTF9OT05FKCIlczogU2V0dGluZyBsaXN0ZW4gaW50ZXJ2YWwgdG8gJWRcbiIsCisJCQlfX2Z1bmNfXywgY29uZi0+bGlzdGVuX2ludGVydmFsKTsKIAkJaWYgKHdsY19pb3Zhcl9zZXRpbnQKIAkJICAgICh3bC0+d2xjLCAiYmNuX2xpX2JjbiIsIGNvbmYtPmxpc3Rlbl9pbnRlcnZhbCkpIHsKLQkJCVdMX0VSUk9SKCgiJXM6IEVycm9yIHNldHRpbmcgbGlzdGVuX2ludGVydmFsXG4iLAotCQkJCSAgX19mdW5jX18pKTsKKwkJCVdMX0VSUk9SKCIlczogRXJyb3Igc2V0dGluZyBsaXN0ZW5faW50ZXJ2YWxcbiIsCisJCQkJIF9fZnVuY19fKTsKIAkJCWVyciA9IC1FSU87CiAJCQlnb3RvIGNvbmZpZ19vdXQ7CiAJCX0KQEAgLTM4Niw0MSArMjk1LDQyIEBACiAJCUFTU0VSVChuZXdfaW50ID09IGNvbmYtPmxpc3Rlbl9pbnRlcnZhbCk7CiAJfQogCWlmIChjaGFuZ2VkICYgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX01PTklUT1IpCi0JCVdMX05PTkUoKCJOZWVkIHRvIHNldCBtb25pdG9yIG1vZGVcbiIpKTsKKwkJV0xfTk9ORSgiTmVlZCB0byBzZXQgbW9uaXRvciBtb2RlXG4iKTsKIAlpZiAoY2hhbmdlZCAmIElFRUU4MDIxMV9DT05GX0NIQU5HRV9QUykKLQkJV0xfTk9ORSgoIk5lZWQgdG8gc2V0IFBvd2VyLXNhdmUgbW9kZVxuIikpOworCQlXTF9OT05FKCJOZWVkIHRvIHNldCBQb3dlci1zYXZlIG1vZGVcbiIpOwogCiAJaWYgKGNoYW5nZWQgJiBJRUVFODAyMTFfQ09ORl9DSEFOR0VfUE9XRVIpIHsKLQkJV0xfTk9ORSgoIiVzOiBTZXR0aW5nIHR4IHBvd2VyIHRvICVkIGRibVxuIiwgX19mdW5jX18sCi0JCQkgY29uZi0+cG93ZXJfbGV2ZWwpKTsKKwkJV0xfTk9ORSgiJXM6IFNldHRpbmcgdHggcG93ZXIgdG8gJWQgZGJtXG4iLAorCQkJX19mdW5jX18sIGNvbmYtPnBvd2VyX2xldmVsKTsKIAkJaWYgKHdsY19pb3Zhcl9zZXRpbnQKIAkJICAgICh3bC0+d2xjLCAicXR4cG93ZXIiLCBjb25mLT5wb3dlcl9sZXZlbCAqIDQpKSB7Ci0JCQlXTF9FUlJPUigoIiVzOiBFcnJvciBzZXR0aW5nIHBvd2VyX2xldmVsXG4iLCBfX2Z1bmNfXykpOworCQkJV0xfRVJST1IoIiVzOiBFcnJvciBzZXR0aW5nIHBvd2VyX2xldmVsXG4iLCBfX2Z1bmNfXyk7CiAJCQllcnIgPSAtRUlPOwogCQkJZ290byBjb25maWdfb3V0OwogCQl9CiAJCXdsY19pb3Zhcl9nZXRpbnQod2wtPndsYywgInF0eHBvd2VyIiwgJm5ld19pbnQpOwogCQlpZiAobmV3X2ludCAhPSAoY29uZi0+cG93ZXJfbGV2ZWwgKiA0KSkKLQkJCVdMX0VSUk9SKCgiJXM6IFBvd2VyIGxldmVsIHJlcSAhPSBhY3R1YWwsICVkICVkXG4iLAotCQkJCSAgX19mdW5jX18sIGNvbmYtPnBvd2VyX2xldmVsICogNCwgbmV3X2ludCkpOworCQkJV0xfRVJST1IoIiVzOiBQb3dlciBsZXZlbCByZXEgIT0gYWN0dWFsLCAlZCAlZFxuIiwKKwkJCQkgX19mdW5jX18sIGNvbmYtPnBvd2VyX2xldmVsICogNCwgbmV3X2ludCk7CiAJfQogCWlmIChjaGFuZ2VkICYgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX0NIQU5ORUwpIHsKIAkJZXJyID0gaWVlZV9zZXRfY2hhbm5lbChodywgY29uZi0+Y2hhbm5lbCwgY29uZi0+Y2hhbm5lbF90eXBlKTsKIAl9CiAJaWYgKGNoYW5nZWQgJiBJRUVFODAyMTFfQ09ORl9DSEFOR0VfUkVUUllfTElNSVRTKSB7Ci0JCVdMX05PTkUoKCIlczogc3JsICVkLCBscmwgJWRcbiIsIF9fZnVuY19fLAotCQkJIGNvbmYtPnNob3J0X2ZyYW1lX21heF90eF9jb3VudCwKLQkJCSBjb25mLT5sb25nX2ZyYW1lX21heF90eF9jb3VudCkpOworCQlXTF9OT05FKCIlczogc3JsICVkLCBscmwgJWRcbiIsCisJCQlfX2Z1bmNfXywKKwkJCWNvbmYtPnNob3J0X2ZyYW1lX21heF90eF9jb3VudCwKKwkJCWNvbmYtPmxvbmdfZnJhbWVfbWF4X3R4X2NvdW50KTsKIAkJaWYgKHdsY19zZXQKIAkJICAgICh3bC0+d2xjLCBXTENfU0VUX1NSTCwKIAkJICAgICBjb25mLT5zaG9ydF9mcmFtZV9tYXhfdHhfY291bnQpIDwgMCkgewotCQkJV0xfRVJST1IoKCIlczogRXJyb3Igc2V0dGluZyBzcmxcbiIsIF9fZnVuY19fKSk7CisJCQlXTF9FUlJPUigiJXM6IEVycm9yIHNldHRpbmcgc3JsXG4iLCBfX2Z1bmNfXyk7CiAJCQllcnIgPSAtRUlPOwogCQkJZ290byBjb25maWdfb3V0OwogCQl9CiAJCWlmICh3bGNfc2V0KHdsLT53bGMsIFdMQ19TRVRfTFJMLCBjb25mLT5sb25nX2ZyYW1lX21heF90eF9jb3VudCkKIAkJICAgIDwgMCkgewotCQkJV0xfRVJST1IoKCIlczogRXJyb3Igc2V0dGluZyBscmxcbiIsIF9fZnVuY19fKSk7CisJCQlXTF9FUlJPUigiJXM6IEVycm9yIHNldHRpbmcgbHJsXG4iLCBfX2Z1bmNfXyk7CiAJCQllcnIgPSAtRUlPOwogCQkJZ290byBjb25maWdfb3V0OwogCQl9CkBAIC00MzUsMzIgKzM0NSwyOSBAQAogCQkJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKIAkJCXN0cnVjdCBpZWVlODAyMTFfYnNzX2NvbmYgKmluZm8sIHUzMiBjaGFuZ2VkKQogewotCXdsX2luZm9fdCAqd2wgPSBIV19UT19XTChodyk7CisJc3RydWN0IHdsX2luZm8gKndsID0gSFdfVE9fV0woaHcpOwogCWludCB2YWw7CiAKLSNpZmRlZiBXTENfSElHSF9PTkxZCi0JV0xfTE9DSyh3bCk7Ci0jZW5kaWYKIAogCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfQVNTT0MpIHsKLQkJV0xfRVJST1IoKCJBc3NvY2lhdGVkOlx0JXNcbiIsIGluZm8tPmFzc29jID8gIlRydWUiIDogIkZhbHNlIikpOworCQlXTF9FUlJPUigiQXNzb2NpYXRlZDpcdCVzXG4iLCBpbmZvLT5hc3NvYyA/ICJUcnVlIiA6ICJGYWxzZSIpOwogCQkvKiBhc3NvY2lhdGlvbiBzdGF0dXMgY2hhbmdlZCAoYXNzb2NpYXRlZC9kaXNhc3NvY2lhdGVkKQogCQkgKiBhbHNvIGltcGxpZXMgYSBjaGFuZ2UgaW4gdGhlIEFJRC4KIAkJICovCiAJfQogCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfRVJQX0NUU19QUk9UKSB7Ci0JCVdMX05PTkUoKCJVc2VfY3RzX3Byb3Q6XHQlcyBJbXBsZW1lbnQgbWVcbiIsCi0JCQkgaW5mby0+dXNlX2N0c19wcm90ID8gIlRydWUiIDogIkZhbHNlIikpOworCQlXTF9OT05FKCJVc2VfY3RzX3Byb3Q6XHQlcyBJbXBsZW1lbnQgbWVcbiIsCisJCQlpbmZvLT51c2VfY3RzX3Byb3QgPyAiVHJ1ZSIgOiAiRmFsc2UiKTsKIAkJLyogQ1RTIHByb3RlY3Rpb24gY2hhbmdlZCAqLwogCX0KIAlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0VSUF9QUkVBTUJMRSkgewotCQlXTF9OT05FKCgiU2hvcnQgcHJlYW1ibGU6XHQlcyBJbXBsZW1lbnQgbWVcbiIsCi0JCQkgaW5mby0+dXNlX3Nob3J0X3ByZWFtYmxlID8gIlRydWUiIDogIkZhbHNlIikpOworCQlXTF9OT05FKCJTaG9ydCBwcmVhbWJsZTpcdCVzIEltcGxlbWVudCBtZVxuIiwKKwkJCWluZm8tPnVzZV9zaG9ydF9wcmVhbWJsZSA/ICJUcnVlIiA6ICJGYWxzZSIpOwogCQkvKiBwcmVhbWJsZSBjaGFuZ2VkICovCiAJfQogCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfRVJQX1NMT1QpIHsKLQkJV0xfTk9ORSgoIkNoYW5naW5nIHNob3J0IHNsb3Q6XHQlc1xuIiwKLQkJCSBpbmZvLT51c2Vfc2hvcnRfc2xvdCA/ICJUcnVlIiA6ICJGYWxzZSIpKTsKKwkJV0xfTk9ORSgiQ2hhbmdpbmcgc2hvcnQgc2xvdDpcdCVzXG4iLAorCQkJaW5mby0+dXNlX3Nob3J0X3Nsb3QgPyAiVHJ1ZSIgOiAiRmFsc2UiKTsKIAkJaWYgKGluZm8tPnVzZV9zaG9ydF9zbG90KQogCQkJdmFsID0gMTsKIAkJZWxzZQpAQCAtNDcwLDM5ICszNzcsMzYgQEAKIAl9CiAKIAlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0hUKSB7Ci0JCVdMX05PTkUoKCIlczogSFQgbW9kZSAtIEltcGxlbWVudCBtZVxuIiwgX19mdW5jX18pKTsKKwkJV0xfTk9ORSgiJXM6IEhUIG1vZGUgLSBJbXBsZW1lbnQgbWVcbiIsIF9fZnVuY19fKTsKIAkJLyogODAyLjExbiBwYXJhbWV0ZXJzIGNoYW5nZWQgKi8KIAl9CiAJaWYgKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9CQVNJQ19SQVRFUykgewotCQlXTF9OT05FKCgiTmVlZCB0byBjaGFuZ2UgQmFzaWMgUmF0ZXM6XHQweCV4ISBJbXBsZW1lbnQgbWVcbiIsCi0JCQkgKHUzMikgaW5mby0+YmFzaWNfcmF0ZXMpKTsKKwkJV0xfTk9ORSgiTmVlZCB0byBjaGFuZ2UgQmFzaWMgUmF0ZXM6XHQweCV4ISBJbXBsZW1lbnQgbWVcbiIsCisJCQkodTMyKSBpbmZvLT5iYXNpY19yYXRlcyk7CiAJCS8qIEJhc2ljIHJhdGVzZXQgY2hhbmdlZCAqLwogCX0KIAlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0JFQUNPTl9JTlQpIHsKLQkJV0xfTk9ORSgoIkJlYWNvbiBJbnRlcnZhbDpcdCVkIEltcGxlbWVudCBtZVxuIiwKLQkJCSBpbmZvLT5iZWFjb25faW50KSk7CisJCVdMX05PTkUoIkJlYWNvbiBJbnRlcnZhbDpcdCVkIEltcGxlbWVudCBtZVxuIiwKKwkJCWluZm8tPmJlYWNvbl9pbnQpOwogCQkvKiBCZWFjb24gaW50ZXJ2YWwgY2hhbmdlZCAqLwogCX0KIAlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0JTU0lEKSB7Ci0JCVdMX05PTkUoKCJuZXcgQlNTSUQ6XHRhaWQgJWQgIGJzczolcE1cbiIsIGluZm8tPmFpZCwKLQkJCWluZm8tPmJzc2lkKSk7CisJCVdMX05PTkUoIm5ldyBCU1NJRDpcdGFpZCAlZCAgYnNzOiVwTVxuIiwKKwkJCWluZm8tPmFpZCwgaW5mby0+YnNzaWQpOwogCQkvKiBCU1NJRCBjaGFuZ2VkLCBmb3Igd2hhdGV2ZXIgcmVhc29uIChJQlNTIGFuZCBtYW5hZ2VkIG1vZGUpICovCiAJCS8qIEZJWE1FOiBuZWVkIHRvIHN0b3JlIGJzc2lkIGluIGJzc2NmZyAqLwogCQl3bGNfc2V0X2FkZHJtYXRjaCh3bC0+d2xjLCBSQ01fQlNTSURfT0ZGU0VULAogCQkJCSAgKHN0cnVjdCBldGhlcl9hZGRyICopaW5mby0+YnNzaWQpOwogCX0KIAlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0JFQUNPTikgewotCQlXTF9FUlJPUigoIkJTU19DSEFOR0VEX0JFQUNPTlxuIikpOworCQlXTF9FUlJPUigiQlNTX0NIQU5HRURfQkVBQ09OXG4iKTsKIAkJLyogQmVhY29uIGRhdGEgY2hhbmdlZCwgcmV0cmlldmUgbmV3IGJlYWNvbiAoYmVhY29uaW5nIG1vZGVzKSAqLwogCX0KIAlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0JFQUNPTl9FTkFCTEVEKSB7Ci0JCVdMX0VSUk9SKCgiQmVhY29uIGVuYWJsZWQ6XHQlc1xuIiwKLQkJCSAgaW5mby0+ZW5hYmxlX2JlYWNvbiA/ICJUcnVlIiA6ICJGYWxzZSIpKTsKKwkJV0xfRVJST1IoIkJlYWNvbiBlbmFibGVkOlx0JXNcbiIsCisJCQkgaW5mby0+ZW5hYmxlX2JlYWNvbiA/ICJUcnVlIiA6ICJGYWxzZSIpOwogCQkvKiBCZWFjb25pbmcgc2hvdWxkIGJlIGVuYWJsZWQvZGlzYWJsZWQgKGJlYWNvbmluZyBtb2RlcykgKi8KIAl9Ci0jaWZkZWYgV0xDX0hJR0hfT05MWQotCVdMX1VOTE9DSyh3bCk7Ci0jZW5kaWYKIAlyZXR1cm47CiB9CiAKQEAgLTUxMSwyNyArNDE1LDI0IEBACiAJCQl1bnNpZ25lZCBpbnQgY2hhbmdlZF9mbGFncywKIAkJCXVuc2lnbmVkIGludCAqdG90YWxfZmxhZ3MsIHU2NCBtdWx0aWNhc3QpCiB7Ci0jaWZuZGVmIFdMQ19ISUdIX09OTFkKLQl3bF9pbmZvX3QgKndsID0gaHctPnByaXY7Ci0jZW5kaWYKKwlzdHJ1Y3Qgd2xfaW5mbyAqd2wgPSBody0+cHJpdjsKIAogCWNoYW5nZWRfZmxhZ3MgJj0gTUFDX0ZJTFRFUlM7CiAJKnRvdGFsX2ZsYWdzICY9IE1BQ19GSUxURVJTOwogCWlmIChjaGFuZ2VkX2ZsYWdzICYgRklGX1BST01JU0NfSU5fQlNTKQotCQlXTF9FUlJPUigoIkZJRl9QUk9NSVNDX0lOX0JTU1xuIikpOworCQlXTF9FUlJPUigiRklGX1BST01JU0NfSU5fQlNTXG4iKTsKIAlpZiAoY2hhbmdlZF9mbGFncyAmIEZJRl9BTExNVUxUSSkKLQkJV0xfRVJST1IoKCJGSUZfQUxMTVVMVElcbiIpKTsKKwkJV0xfRVJST1IoIkZJRl9BTExNVUxUSVxuIik7CiAJaWYgKGNoYW5nZWRfZmxhZ3MgJiBGSUZfRkNTRkFJTCkKLQkJV0xfRVJST1IoKCJGSUZfRkNTRkFJTFxuIikpOworCQlXTF9FUlJPUigiRklGX0ZDU0ZBSUxcbiIpOwogCWlmIChjaGFuZ2VkX2ZsYWdzICYgRklGX1BMQ1BGQUlMKQotCQlXTF9FUlJPUigoIkZJRl9QTENQRkFJTFxuIikpOworCQlXTF9FUlJPUigiRklGX1BMQ1BGQUlMXG4iKTsKIAlpZiAoY2hhbmdlZF9mbGFncyAmIEZJRl9DT05UUk9MKQotCQlXTF9FUlJPUigoIkZJRl9DT05UUk9MXG4iKSk7CisJCVdMX0VSUk9SKCJGSUZfQ09OVFJPTFxuIik7CiAJaWYgKGNoYW5nZWRfZmxhZ3MgJiBGSUZfT1RIRVJfQlNTKQotCQlXTF9FUlJPUigoIkZJRl9PVEhFUl9CU1NcbiIpKTsKKwkJV0xfRVJST1IoIkZJRl9PVEhFUl9CU1NcbiIpOwogCWlmIChjaGFuZ2VkX2ZsYWdzICYgRklGX0JDTl9QUkJSRVNQX1BST01JU0MpIHsKLQkJV0xfTk9ORSgoIkZJRl9CQ05fUFJCUkVTUF9QUk9NSVNDXG4iKSk7Ci0jaWZuZGVmIFdMQ19ISUdIX09OTFkKKwkJV0xfTk9ORSgiRklGX0JDTl9QUkJSRVNQX1BST01JU0NcbiIpOwogCQlXTF9MT0NLKHdsKTsKIAkJaWYgKCp0b3RhbF9mbGFncyAmIEZJRl9CQ05fUFJCUkVTUF9QUk9NSVNDKSB7CiAJCQl3bC0+cHViLT5tYWM4MDIxMV9zdGF0ZSB8PSBNQUM4MDIxMV9QUk9NSVNDX0JDTlM7CkBAIC01NDEsNyArNDQyLDYgQEAKIAkJCXdsLT5wdWItPm1hYzgwMjExX3N0YXRlICY9IH5NQUM4MDIxMV9QUk9NSVNDX0JDTlM7CiAJCX0KIAkJV0xfVU5MT0NLKHdsKTsKLSNlbmRpZgogCX0KIAlyZXR1cm47CiB9CkBAIC01NDksMjUgKzQ0OSwyNSBAQAogc3RhdGljIGludAogd2xfb3BzX3NldF90aW0oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIGJvb2wgc2V0KQogewotCVdMX0VSUk9SKCgiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXykpOworCVdMX0VSUk9SKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgd2xfb3BzX3N3X3NjYW5fc3RhcnQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCiB7Ci0JV0xfTk9ORSgoIlNjYW4gU3RhcnRcbiIpKTsKKwlXTF9OT05FKCJTY2FuIFN0YXJ0XG4iKTsKIAlyZXR1cm47CiB9CiAKIHN0YXRpYyB2b2lkIHdsX29wc19zd19zY2FuX2NvbXBsZXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQogewotCVdMX05PTkUoKCJTY2FuIENvbXBsZXRlXG4iKSk7CisJV0xfTk9ORSgiU2NhbiBDb21wbGV0ZVxuIik7CiAJcmV0dXJuOwogfQogCiBzdGF0aWMgdm9pZCB3bF9vcHNfc2V0X3RzZihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTY0IHRzZikKIHsKLQlXTF9FUlJPUigoIiVzOiBFbnRlclxuIiwgX19mdW5jX18pKTsKKwlXTF9FUlJPUigiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXyk7CiAJcmV0dXJuOwogfQogCkBAIC01NzUsMTMgKzQ3NSwxMyBAQAogd2xfb3BzX2dldF9zdGF0cyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAkJIHN0cnVjdCBpZWVlODAyMTFfbG93X2xldmVsX3N0YXRzICpzdGF0cykKIHsKLQlXTF9FUlJPUigoIiVzOiBFbnRlclxuIiwgX19mdW5jX18pKTsKKwlXTF9FUlJPUigiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXyk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgd2xfb3BzX3NldF9ydHNfdGhyZXNob2xkKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MzIgdmFsdWUpCiB7Ci0JV0xfRVJST1IoKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKSk7CisJV0xfRVJST1IoIiVzOiBFbnRlclxuIiwgX19mdW5jX18pOwogCXJldHVybiAwOwogfQogCkBAIC01ODksMTAgKzQ4OSwxMCBAQAogd2xfb3BzX3N0YV9ub3RpZnkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCiAJCSAgZW51bSBzdGFfbm90aWZ5X2NtZCBjbWQsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpCiB7Ci0JV0xfTk9ORSgoIiVzOiBFbnRlclxuIiwgX19mdW5jX18pKTsKKwlXTF9OT05FKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKTsKIAlzd2l0Y2ggKGNtZCkgewogCWRlZmF1bHQ6Ci0JCVdMX0VSUk9SKCgiJXM6IFVrbm93biBjbWQgPSAlZFxuIiwgX19mdW5jX18sIGNtZCkpOworCQlXTF9FUlJPUigiJXM6IFVua25vd24gY21kID0gJWRcbiIsIF9fZnVuY19fLCBjbWQpOwogCQlicmVhazsKIAl9CiAJcmV0dXJuOwpAQCAtNjAyLDExICs1MDIsMTEgQEAKIHdsX29wc19jb25mX3R4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MTYgcXVldWUsCiAJICAgICAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfdHhfcXVldWVfcGFyYW1zICpwYXJhbXMpCiB7Ci0Jd2xfaW5mb190ICp3bCA9IGh3LT5wcml2OworCXN0cnVjdCB3bF9pbmZvICp3bCA9IGh3LT5wcml2OwogCi0JV0xfTk9ORSgoIiVzOiBFbnRlciAoV01FIGNvbmZpZylcbiIsIF9fZnVuY19fKSk7Ci0JV0xfTk9ORSgoInF1ZXVlICVkLCB0eG9wICVkLCBjd21pbiAlZCwgY3dtYXggJWQsIGFpZnMgJWRcbiIsIHF1ZXVlLAotCQkgcGFyYW1zLT50eG9wLCBwYXJhbXMtPmN3X21pbiwgcGFyYW1zLT5jd19tYXgsIHBhcmFtcy0+YWlmcykpOworCVdMX05PTkUoIiVzOiBFbnRlciAoV01FIGNvbmZpZylcbiIsIF9fZnVuY19fKTsKKwlXTF9OT05FKCJxdWV1ZSAlZCwgdHhvcCAlZCwgY3dtaW4gJWQsIGN3bWF4ICVkLCBhaWZzICVkXG4iLCBxdWV1ZSwKKwkJIHBhcmFtcy0+dHhvcCwgcGFyYW1zLT5jd19taW4sIHBhcmFtcy0+Y3dfbWF4LCBwYXJhbXMtPmFpZnMpOwogCiAJV0xfTE9DSyh3bCk7CiAJd2xjX3dtZV9zZXRwYXJhbXMod2wtPndsYywgcXVldWUsICh2b2lkICopcGFyYW1zLCB0cnVlKTsKQEAgLTYxNyw3ICs1MTcsNyBAQAogCiBzdGF0aWMgdTY0IHdsX29wc19nZXRfdHNmKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQogewotCVdMX0VSUk9SKCgiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXykpOworCVdMX0VSUk9SKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjI4LDExICs1MjgsMTEgQEAKIAlzdHJ1Y3Qgc2NiICpzY2I7CiAKIAlpbnQgaTsKLQl3bF9pbmZvX3QgKndsID0gaHctPnByaXY7CisJc3RydWN0IHdsX2luZm8gKndsID0gaHctPnByaXY7CiAKIAkvKiBJbml0IHRoZSBzY2IgKi8KIAlzY2IgPSAoc3RydWN0IHNjYiAqKXN0YS0+ZHJ2X3ByaXY7Ci0JYnplcm8oc2NiLCBzaXplb2Yoc3RydWN0IHNjYikpOworCW1lbXNldChzY2IsIDAsIHNpemVvZihzdHJ1Y3Qgc2NiKSk7CiAJZm9yIChpID0gMDsgaSA8IE5VTVBSSU87IGkrKykKIAkJc2NiLT5zZXFjdGxbaV0gPSAweEZGRkY7CiAJc2NiLT5zZXFjdGxfbm9ucW9zID0gMHhGRkZGOwpAQCAtNjQxLDIwICs1NDEsMTIgQEAKIAl3bC0+cHViLT5nbG9iYWxfc2NiID0gc2NiOwogCXdsLT5wdWItPmdsb2JhbF9hbXBkdSA9ICYoc2NiLT5zY2JfYW1wZHUpOwogCXdsLT5wdWItPmdsb2JhbF9hbXBkdS0+c2NiID0gc2NiOwotI2lmZGVmIFdMQ19ISUdIX09OTFkKLQl3bC0+cHViLT5nbG9iYWxfYW1wZHUtPm1heF9wZHUgPSBBTVBEVV9OVU1fTVBEVTsKLSNlbHNlCiAJd2wtPnB1Yi0+Z2xvYmFsX2FtcGR1LT5tYXhfcGR1ID0gMTY7Ci0jZW5kaWYKIAlwa3RxX2luaXQoJnNjYi0+c2NiX2FtcGR1LnR4cSwgQU1QRFVfTUFYX1NDQl9USUQsCiAJCSAgQU1QRFVfTUFYX1NDQl9USUQgKiBQS1RRX0xFTl9ERUZBVUxUKTsKIAogCXN0YS0+aHRfY2FwLmh0X3N1cHBvcnRlZCA9IHRydWU7Ci0jaWZkZWYgV0xDX0hJR0hfT05MWQotCXN0YS0+aHRfY2FwLmFtcGR1X2ZhY3RvciA9IEFNUERVX1JYX0ZBQ1RPUl8xNks7Ci0jZWxzZQogCXN0YS0+aHRfY2FwLmFtcGR1X2ZhY3RvciA9IEFNUERVX1JYX0ZBQ1RPUl82NEs7Ci0jZW5kaWYKIAlzdGEtPmh0X2NhcC5hbXBkdV9kZW5zaXR5ID0gQU1QRFVfREVGX01QRFVfREVOU0lUWTsKIAlzdGEtPmh0X2NhcC5jYXAgPSBJRUVFODAyMTFfSFRfQ0FQX0dSTl9GTEQgfAogCSAgICBJRUVFODAyMTFfSFRfQ0FQX1NHSV8yMCB8CkBAIC02NjgsNyArNTYwLDcgQEAKIHdsX3N0YV9yZW1vdmUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCiAJICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKIHsKLQlXTF9OT05FKCgiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXykpOworCVdMX05PTkUoIiVzOiBFbnRlclxuIiwgX19mdW5jX18pOwogCXJldHVybiAwOwogfQogCkBAIC02ODEsMTkgKzU3MywxOSBAQAogI2lmIGRlZmluZWQoQkNNREJHKQogCXN0cnVjdCBzY2IgKnNjYiA9IChzdHJ1Y3Qgc2NiICopc3RhLT5kcnZfcHJpdjsKICNlbmRpZgotCXdsX2luZm9fdCAqd2wgPSBody0+cHJpdjsKKwlzdHJ1Y3Qgd2xfaW5mbyAqd2wgPSBody0+cHJpdjsKIAogCUFTU0VSVChzY2ItPm1hZ2ljID09IFNDQl9NQUdJQyk7CiAJc3dpdGNoIChhY3Rpb24pIHsKIAljYXNlIElFRUU4MDIxMV9BTVBEVV9SWF9TVEFSVDoKLQkJV0xfTk9ORSgoIiVzOiBhY3Rpb24gPSBJRUVFODAyMTFfQU1QRFVfUlhfU1RBUlRcbiIsIF9fZnVuY19fKSk7CisJCVdMX05PTkUoIiVzOiBhY3Rpb24gPSBJRUVFODAyMTFfQU1QRFVfUlhfU1RBUlRcbiIsIF9fZnVuY19fKTsKIAkJYnJlYWs7CiAJY2FzZSBJRUVFODAyMTFfQU1QRFVfUlhfU1RPUDoKLQkJV0xfTk9ORSgoIiVzOiBhY3Rpb24gPSBJRUVFODAyMTFfQU1QRFVfUlhfU1RPUFxuIiwgX19mdW5jX18pKTsKKwkJV0xfTk9ORSgiJXM6IGFjdGlvbiA9IElFRUU4MDIxMV9BTVBEVV9SWF9TVE9QXG4iLCBfX2Z1bmNfXyk7CiAJCWJyZWFrOwogCWNhc2UgSUVFRTgwMjExX0FNUERVX1RYX1NUQVJUOgogCQlpZiAoIXdsY19hZ2dyZWdhdGFibGUod2wtPndsYywgdGlkKSkgewotCQkJLyogV0xfRVJST1IoKCJTVEFSVDogdGlkICVkIGlzIG5vdCBhZ2cnIGFibGUsIHJldHVybiBGQUlMVVJFIHRvIHN0YWNrXG4iLCB0aWQpKTsgKi8KKwkJCS8qIFdMX0VSUk9SKCJTVEFSVDogdGlkICVkIGlzIG5vdCBhZ2cnIGFibGUsIHJldHVybiBGQUlMVVJFIHRvIHN0YWNrXG4iLCB0aWQpOyAqLwogCQkJcmV0dXJuIC0xOwogCQl9CiAJCS8qIFhYWDogVXNlIHRoZSBzdGFydGluZyBzZXF1ZW5jZSBudW1iZXIgcHJvdmlkZWQgLi4uICovCkBAIC03MDcsMjIgKzU5OSwxOCBAQAogCWNhc2UgSUVFRTgwMjExX0FNUERVX1RYX09QRVJBVElPTkFMOgogCQkvKiBOb3Qgc3VyZSB3aGF0IHRvIGRvIGhlcmUgKi8KIAkJLyogUG93ZXIgc2F2ZSB3YWtldXAgKi8KLQkJV0xfTk9ORSgoIiVzOiBhY3Rpb24gPSBJRUVFODAyMTFfQU1QRFVfVFhfT1BFUkFUSU9OQUxcbiIsCi0JCQkgX19mdW5jX18pKTsKKwkJV0xfTk9ORSgiJXM6IGFjdGlvbiA9IElFRUU4MDIxMV9BTVBEVV9UWF9PUEVSQVRJT05BTFxuIiwKKwkJCV9fZnVuY19fKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJV0xfRVJST1IoKCIlczogSW52YWxpZCBjb21tYW5kLCBpZ25vcmluZ1xuIiwgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIiVzOiBJbnZhbGlkIGNvbW1hbmQsIGlnbm9yaW5nXG4iLCBfX2Z1bmNfXyk7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX29wcyB3bF9vcHMgPSB7Ci0jaWZkZWYgV0xDX0hJR0hfT05MWQotCS50eCA9IHdsX29wc190eF9ubCwKLSNlbHNlCiAJLnR4ID0gd2xfb3BzX3R4LAotI2VuZGlmCiAJLnN0YXJ0ID0gd2xfb3BzX3N0YXJ0LAogCS5zdG9wID0gd2xfb3BzX3N0b3AsCiAJLmFkZF9pbnRlcmZhY2UgPSB3bF9vcHNfYWRkX2ludGVyZmFjZSwKQEAgLTc0NCwxMCArNjMyLDEwIEBACiAJLmFtcGR1X2FjdGlvbiA9IHdsX2FtcGR1X2FjdGlvbiwKIH07CiAKLXN0YXRpYyBpbnQgd2xfc2V0X2hpbnQod2xfaW5mb190ICp3bCwgY2hhciAqYWJicmV2KQorc3RhdGljIGludCB3bF9zZXRfaGludChzdHJ1Y3Qgd2xfaW5mbyAqd2wsIGNoYXIgKmFiYnJldikKIHsKLQlXTF9FUlJPUigoIiVzOiBTZW5kaW5nIGNvdW50cnkgY29kZSAlYyVjIHRvIE1BQzgwMjExXG4iLCBfX2Z1bmNfXywKLQkJICBhYmJyZXZbMF0sIGFiYnJldlsxXSkpOworCVdMX0VSUk9SKCIlczogU2VuZGluZyBjb3VudHJ5IGNvZGUgJWMlYyB0byBNQUM4MDIxMVxuIiwKKwkJIF9fZnVuY19fLCBhYmJyZXZbMF0sIGFiYnJldlsxXSk7CiAJcmV0dXJuIHJlZ3VsYXRvcnlfaGludCh3bC0+cHViLT5pZWVlX2h3LT53aXBoeSwgYWJicmV2KTsKIH0KIApAQCAtNzYyLDExNyArNjUwLDYxIEBACiAgKiBhIHdhcm5pbmcgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIGRlZmluZWQgYnV0IG5vdCB1c2VkIGlmIHdlIGRlY2xhcmUKICAqIGl0IGFzIHN0YXRpYy4KICAqLwotc3RhdGljIHdsX2luZm9fdCAqd2xfYXR0YWNoKHUxNiB2ZW5kb3IsIHUxNiBkZXZpY2UsIHVuc2lnbmVkIGxvbmcgcmVncywKK3N0YXRpYyBzdHJ1Y3Qgd2xfaW5mbyAqd2xfYXR0YWNoKHUxNiB2ZW5kb3IsIHUxNiBkZXZpY2UsIHVuc2lnbmVkIGxvbmcgcmVncywKIAkJCSAgICB1aW50IGJ1c3R5cGUsIHZvaWQgKmJ0cGFyYW0sIHVpbnQgaXJxKQogewotCXdsX2luZm9fdCAqd2w7Ci0Jb3NsX3QgKm9zaDsKKwlzdHJ1Y3Qgd2xfaW5mbyAqd2w7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAJaW50IHVuaXQsIGVycjsKIAogCXVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyOwogCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3OwogCXU4IHBlcm1bRVRIX0FMRU5dOwogCi0JdW5pdCA9IHdsX2ZvdW5kICsgaW5zdGFuY2VfYmFzZTsKKwl1bml0ID0gd2xfZm91bmQ7CiAJZXJyID0gMDsKIAogCWlmICh1bml0IDwgMCkgewotCQlXTF9FUlJPUigoIndsJWQ6IHVuaXQgbnVtYmVyIG92ZXJmbG93LCBleGl0aW5nXG4iLCB1bml0KSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB1bml0IG51bWJlciBvdmVyZmxvdywgZXhpdGluZ1xuIiwgdW5pdCk7CiAJCXJldHVybiBOVUxMOwogCX0KIAotCWlmIChvbmVvbmx5ICYmICh1bml0ICE9IGluc3RhbmNlX2Jhc2UpKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogd2xfYXR0YWNoOiBvbmVvbmx5IGlzIHNldCwgZXhpdGluZ1xuIiwgdW5pdCkpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQkvKiBSZXF1aXJlcyBwa3R0YWcgZmVhdHVyZSAqLwotCW9zaCA9IG9zbF9hdHRhY2goYnRwYXJhbSwgYnVzdHlwZSwgdHJ1ZSk7CisJb3NoID0gb3NsX2F0dGFjaChidHBhcmFtLCBidXN0eXBlKTsKIAlBU1NFUlQob3NoKTsKIAotI2lmZGVmIFdMQ19ISUdIX09OTFkKLQlodyA9IGllZWU4MDIxMV9hbGxvY19odyhzaXplb2Yod2xfaW5mb190KSwgJndsX29wcyk7Ci0JaWYgKCFodykgewotCQlXTF9FUlJPUigoIiVzOiBpZWVlODAyMTFfYWxsb2NfaHcgZmFpbGVkXG4iLCBfX2Z1bmNfXykpOwotCQlBU1NFUlQoMCk7Ci0JfQotCi0JYnplcm8oaHctPnByaXYsIHNpemVvZigqd2wpKTsKLQl3bCA9IGh3LT5wcml2OwotI2Vsc2UKIAkvKiBhbGxvY2F0ZSBwcml2YXRlIGluZm8gKi8KIAlodyA9IHBjaV9nZXRfZHJ2ZGF0YShidHBhcmFtKTsJLyogYnRwYXJhbSA9PSBwZGV2ICovCiAJd2wgPSBody0+cHJpdjsKLSNlbmRpZgogCUFTU0VSVCh3bCk7CiAKLQl3bC0+bWFnaWMgPSBXTF9NQUdJQzsKIAl3bC0+b3NoID0gb3NoOwogCWF0b21pY19zZXQoJndsLT5jYWxsYmFja3MsIDApOwogCiAJLyogc2V0dXAgdGhlIGJvdHRvbSBoYWxmIGhhbmRsZXIgKi8KIAl0YXNrbGV0X2luaXQoJndsLT50YXNrbGV0LCB3bF9kcGMsICh1bnNpZ25lZCBsb25nKSB3bCk7CiAKLSNpZmRlZiBXTENfSElHSF9PTkxZCi0Jd2wtPnJwY190aCA9IGJjbV9ycGNfdHBfYXR0YWNoKG9zaCwgTlVMTCk7Ci0JaWYgKHdsLT5ycGNfdGggPT0gTlVMTCkgewotCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBiY21fcnBjX3RwX2F0dGFjaCBmYWlsZWQhXG4iLCB1bml0LAotCQkJICBfX2Z1bmNfXykpOwotCQlnb3RvIGZhaWw7Ci0JfQogCi0Jd2wtPnJwYyA9IGJjbV9ycGNfYXR0YWNoKE5VTEwsIG9zaCwgd2wtPnJwY190aCk7Ci0JaWYgKHdsLT5ycGMgPT0gTlVMTCkgewotCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBiY21fcnBjX2F0dGFjaCBmYWlsZWQhXG4iLCB1bml0LAotCQkJICBfX2Z1bmNfXykpOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JLyogaW5pdCB0eCB3b3JrIHF1ZXVlIGZvciB3bF9zdGFydC9zZW5kIHBrdDsgbm8gbmVlZCB0byBkZXN0cm95IHdvcmtpdGVtICAqLwotCUlOSVRfV09SSygmd2wtPnR4cV90YXNrLndvcmssICh3b3JrX2Z1bmNfdCkgd2xfc3RhcnRfdHhxd29yayk7Ci0Jd2wtPnR4cV90YXNrLmNvbnRleHQgPSB3bDsKLSNlbmRpZgkJCQkvKiBXTENfSElHSF9PTkxZICovCi0KLSNpZmRlZiBCQ01TRElPCi0JU0VUX0lFRUU4MDIxMV9ERVYoaHcsIHNkaW9tbWNfZGV2KTsKLSNlbmRpZgogCiAJYmFzZV9hZGRyID0gcmVnczsKIAogCWlmIChidXN0eXBlID09IFBDSV9CVVMpIHsKLQkJLyogcGlvbW9kZSBjYW4gYmUgb3ZlcndyaXR0ZW4gYnkgY29tbWFuZCBhcmd1bWVudCAqLwotCQl3bC0+cGlvbW9kZSA9IHBpb21vZGU7Ci0JCVdMX1RSQUNFKCgiUENJLyVzXG4iLCB3bC0+cGlvbW9kZSA/ICJQSU8iIDogIkRNQSIpKTsKKwkJd2wtPnBpb21vZGUgPSBmYWxzZTsKIAl9IGVsc2UgaWYgKGJ1c3R5cGUgPT0gUlBDX0JVUykgewogCQkvKiBEbyBub3RoaW5nICovCiAJfSBlbHNlIHsKIAkJYnVzdHlwZSA9IFBDSV9CVVM7Ci0JCVdMX1RSQUNFKCgiZm9yY2UgdG8gUENJXG4iKSk7CisJCVdMX1RSQUNFKCJmb3JjZSB0byBQQ0lcbiIpOwogCX0KIAl3bC0+YmNtX2J1c3R5cGUgPSBidXN0eXBlOwogCi0jaWZkZWYgV0xDX0hJR0hfT05MWQotCWlmICh3bC0+YmNtX2J1c3R5cGUgPT0gUlBDX0JVUykgewotCQl3bC0+cmVnc3ZhID0gKHZvaWQgKikwOwotCQlidHBhcmFtID0gd2wtPnJwYzsKLQl9IGVsc2UKLSNlbmRpZgogCXdsLT5yZWdzdmEgPSBpb3JlbWFwX25vY2FjaGUoYmFzZV9hZGRyLCBQQ0lfQkFSMF9XSU5TWik7CiAJaWYgKHdsLT5yZWdzdmEgPT0gTlVMTCkgewotCQlXTF9FUlJPUigoIndsJWQ6IGlvcmVtYXAoKSBmYWlsZWRcbiIsIHVuaXQpKTsKKwkJV0xfRVJST1IoIndsJWQ6IGlvcmVtYXAoKSBmYWlsZWRcbiIsIHVuaXQpOwogCQlnb3RvIGZhaWw7CiAJfQotI2lmZGVmIFdMQ19ISUdIX09OTFkKLQlzcGluX2xvY2tfaW5pdCgmd2wtPnJwY3FfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJndsLT50eHFfbG9jayk7Ci0KLQlzZW1hX2luaXQoJndsLT5zZW0sIDEpOwotI2Vsc2UKIAlzcGluX2xvY2tfaW5pdCgmd2wtPmxvY2spOwogCXNwaW5fbG9ja19pbml0KCZ3bC0+aXNyX2xvY2spOwotI2VuZGlmCiAKLSNpZm5kZWYgV0xDX0hJR0hfT05MWQogCS8qIHByZXBhcmUgdWNvZGUgKi8KIAlpZiAod2xfcmVxdWVzdF9mdyh3bCwgKHN0cnVjdCBwY2lfZGV2ICopYnRwYXJhbSkpIHsKIAkJcHJpbnRmKCIlczogRmFpbGVkIHRvIGZpbmQgZmlybXdhcmUgdXN1YWxseSBpbiAlc1xuIiwKQEAgLTg4MSwxNyArNzEzLDE0IEBACiAJCXdsX3JlbW92ZSgoc3RydWN0IHBjaV9kZXYgKilidHBhcmFtKTsKIAkJZ290byBmYWlsMTsKIAl9Ci0jZW5kaWYKIAogCS8qIGNvbW1vbiBsb2FkLXRpbWUgaW5pdGlhbGl6YXRpb24gKi8KIAl3bC0+d2xjID0gd2xjX2F0dGFjaCgodm9pZCAqKXdsLCB2ZW5kb3IsIGRldmljZSwgdW5pdCwgd2wtPnBpb21vZGUsIG9zaCwKIAkJCSAgICAgd2wtPnJlZ3N2YSwgd2wtPmJjbV9idXN0eXBlLCBidHBhcmFtLCAmZXJyKTsKLSNpZm5kZWYgV0xDX0hJR0hfT05MWQogCXdsX3JlbGVhc2VfZncod2wpOwotI2VuZGlmCiAJaWYgKCF3bC0+d2xjKSB7Ci0JCXByaW50ZigiJXM6ICVzIHdsY19hdHRhY2goKSBmYWlsZWQgd2l0aCBjb2RlICVkXG4iLAotCQkJS0JVSUxEX01PRE5BTUUsIEVQSV9WRVJTSU9OX1NUUiwgZXJyKTsKKwkJcHJpbnRmKCIlczogd2xjX2F0dGFjaCgpIGZhaWxlZCB3aXRoIGNvZGUgJWRcbiIsCisJCQlLQlVJTERfTU9ETkFNRSwgZXJyKTsKIAkJZ290byBmYWlsOwogCX0KIAl3bC0+cHViID0gd2xjX3B1Yih3bC0+d2xjKTsKQEAgLTkwMCw1MiArNzI5LDM1IEBACiAJQVNTRVJUKHdsLT5wdWItPmllZWVfaHcpOwogCUFTU0VSVCh3bC0+cHViLT5pZWVlX2h3LT5wcml2ID09IHdsKTsKIAotI2lmZGVmIFdMQ19ISUdIX09OTFkKLQlSRUdPUFNTRVQob3NoLCAob3NsX3JyZWdfZm5fdCkgd2xjX3JlZ19yZWFkLAotCQkgIChvc2xfd3JlZ19mbl90KSB3bGNfcmVnX3dyaXRlLCB3bC0+d2xjKTsKLQl3bC0+cnBjX2Rpc3BhdGNoX2N0eC5ycGMgPSB3bC0+cnBjOwotCXdsLT5ycGNfZGlzcGF0Y2hfY3R4LndsYyA9IHdsLT53bGM7Ci0JYmNtX3JwY19yeGNiX2luaXQod2wtPnJwYywgd2wsIHdsX3JwY19kaXNwYXRjaF9zY2hlZHVsZSwgd2wsCi0JCQkgIHdsX3JwY19kb3duLCBOVUxMLCBOVUxMKTsKLSNlbmRpZgkJCQkvKiBXTENfSElHSF9PTkxZICovCiAKLQlpZiAobm9tcGMpIHsKLQkJaWYgKHdsY19pb3Zhcl9zZXRpbnQod2wtPndsYywgIm1wYyIsIDApKSB7Ci0JCQlXTF9FUlJPUigoIndsJWQ6IEVycm9yIHNldHRpbmcgTVBDIHZhcmlhYmxlIHRvIDBcbiIsCi0JCQkJICB1bml0KSk7Ci0JCX0KKwlpZiAod2xjX2lvdmFyX3NldGludCh3bC0+d2xjLCAibXBjIiwgMCkpIHsKKwkJV0xfRVJST1IoIndsJWQ6IEVycm9yIHNldHRpbmcgTVBDIHZhcmlhYmxlIHRvIDBcbiIsIHVuaXQpOwogCX0KLSNpZmRlZiBCQ01TRElPCi0JLyogU2V0IFNESU8gZHJpdmUgc3RyZW5ndGggKi8KLQl3bGNfaW92YXJfc2V0aW50KHdsLT53bGMsICJzZF9kcml2ZXN0cmVuZ3RoIiwgc2RfZHJpdmVzdHJlbmd0aCk7Ci0jZW5kaWYKIAotI2lmZGVmIFdMQ19MT1cKIAkvKiByZWdpc3RlciBvdXIgaW50ZXJydXB0IGhhbmRsZXIgKi8KIAlpZiAocmVxdWVzdF9pcnEoaXJxLCB3bF9pc3IsIElSUUZfU0hBUkVELCBLQlVJTERfTU9ETkFNRSwgd2wpKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogcmVxdWVzdF9pcnEoKSBmYWlsZWRcbiIsIHVuaXQpKTsKKwkJV0xfRVJST1IoIndsJWQ6IHJlcXVlc3RfaXJxKCkgZmFpbGVkXG4iLCB1bml0KTsKIAkJZ290byBmYWlsOwogCX0KIAl3bC0+aXJxID0gaXJxOwotI2VuZGlmCQkJCS8qIFdMQ19MT1cgKi8KIAogCS8qIHJlZ2lzdGVyIG1vZHVsZSAqLwogCXdsY19tb2R1bGVfcmVnaXN0ZXIod2wtPnB1YiwgTlVMTCwgImxpbnV4Iiwgd2wsIE5VTEwsIHdsX2xpbnV4X3dhdGNoZG9nLAogCQkJICAgIE5VTEwpOwogCiAJaWYgKGllZWVfaHdfaW5pdChodykpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiAlczogaWVlZV9od19pbml0IGZhaWxlZCFcbiIsIHVuaXQsIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCJ3bCVkOiAlczogaWVlZV9od19pbml0IGZhaWxlZCFcbiIsIHVuaXQsIF9fZnVuY19fKTsKIAkJZ290byBmYWlsOwogCX0KIAotCWJjb3B5KCZ3bC0+cHViLT5jdXJfZXRoZXJhZGRyLCBwZXJtLCBFVEhFUl9BRERSX0xFTik7CisJYmNvcHkoJndsLT5wdWItPmN1cl9ldGhlcmFkZHIsIHBlcm0sIEVUSF9BTEVOKTsKIAlBU1NFUlQoaXNfdmFsaWRfZXRoZXJfYWRkcihwZXJtKSk7CiAJU0VUX0lFRUU4MDIxMV9QRVJNX0FERFIoaHcsIHBlcm0pOwogCiAJZXJyID0gaWVlZTgwMjExX3JlZ2lzdGVyX2h3KGh3KTsKIAlpZiAoZXJyKSB7Ci0JCVdMX0VSUk9SKCgiJXM6IGllZWU4MDIxMV9yZWdpc3Rlcl9odyBmYWlsZWQsIHN0YXR1cyAlZFxuIiwKLQkJCSAgX19mdW5jX18sIGVycikpOworCQlXTF9FUlJPUigiJXM6IGllZWU4MDIxMV9yZWdpc3Rlcl9odyBmYWlsZWQsIHN0YXR1cyAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgZXJyKTsKIAl9CiAKIAlpZiAod2wtPnB1Yi0+c3JvbV9jY29kZVswXSkKQEAgLTk1MywxOSArNzY1LDE0IEBACiAJZWxzZQogCQllcnIgPSB3bF9zZXRfaGludCh3bCwgIlVTIik7CiAJaWYgKGVycikgewotCQlXTF9FUlJPUigoIiVzOiByZWd1bGF0b3J5X2hpbnQgZmFpbGVkLCBzdGF0dXMgJWRcbiIsIF9fZnVuY19fLAotCQkJICBlcnIpKTsKKwkJV0xfRVJST1IoIiVzOiByZWd1bGF0b3J5X2hpbnQgZmFpbGVkLCBzdGF0dXMgJWRcbiIsCisJCQkgX19mdW5jX18sIGVycik7CiAJfQotI2lmbmRlZiBXTENfSElHSF9PTkxZCi0JV0xfRVJST1IoKCJ3bCVkOiBCcm9hZGNvbSBCQ000M3h4IDgwMi4xMSBNQUM4MDIxMSBEcml2ZXIgIgotCQkgIEVQSV9WRVJTSU9OX1NUUiAiICgiIFBIWV9WRVJTSU9OX1NUUiAiKSIsIHVuaXQpKTsKLSNlbHNlCi0JV0xfRVJST1IoKCJ3bCVkOiBCcm9hZGNvbSBCQ000M3h4IDgwMi4xMSBNQUM4MDIxMSBEcml2ZXIgIgotCQkgIEVQSV9WRVJTSU9OX1NUUiwgdW5pdCkpOwotI2VuZGlmCisJV0xfRVJST1IoIndsJWQ6IEJyb2FkY29tIEJDTTQzeHggODAyLjExIE1BQzgwMjExIERyaXZlciAoIiBQSFlfVkVSU0lPTl9TVFIgIikiLAorCQkgdW5pdCk7CiAKICNpZmRlZiBCQ01EQkcKLQlwcmludGYoIiAoQ29tcGlsZWQgaW4gIiBTUkNCQVNFICIgYXQgIiBfX1RJTUVfXyAiIG9uICIgX19EQVRFX18gIikiKTsKKwlwcmludGYoIiAoQ29tcGlsZWQgYXQgIiBfX1RJTUVfXyAiIG9uICIgX19EQVRFX18gIikiKTsKICNlbmRpZgkJCQkvKiBCQ01EQkcgKi8KIAlwcmludGYoIlxuIik7CiAKQEAgLTk3OCw1NCArNzg1LDYgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotI2lmZGVmIFdMQ19ISUdIX09OTFkKLXN0YXRpYyB2b2lkICp3bF9kYnVzX3Byb2JlX2NiKHZvaWQgKmFyZywgY29uc3QgY2hhciAqZGVzYywgdTMyIGJ1c3R5cGUsCi0JCQkgICAgICB1MzIgaGRybGVuKQotewotCXdsX2luZm9fdCAqd2w7Ci0JV0xfRVJST1IoKCIlczpcbiIsIF9fZnVuY19fKSk7Ci0KLQl3bCA9IHdsX2F0dGFjaChCQ01fRE5HTF9WSUQsIEJDTV9ETkdMX0JEQ19QSUQsICh1bnNpZ25lZCBsb25nKSBOVUxMLCBSUENfQlVTLAotCQlOVUxMLCAwKTsKLQlpZiAoIXdsKSB7Ci0JCVdMX0VSUk9SKCgiJXM6IHdsX2F0dGFjaCBmYWlsZWRcbiIsIF9fZnVuY19fKSk7Ci0JfQotCi0JLyogVGhpcyBpcyBsYXRlciBwYXNzZWQgdG8gd2xfZGJ1c19kaXNjb25uZWN0X2NiICovCi0JcmV0dXJuIHdsOwotfQotCi1zdGF0aWMgdm9pZCB3bF9kYnVzX2Rpc2Nvbm5lY3RfY2Iodm9pZCAqYXJnKQotewotCXdsX2luZm9fdCAqd2wgPSBhcmc7Ci0KLQlXTF9FUlJPUigoIiVzOlxuIiwgX19mdW5jX18pKTsKLQotCWlmICh3bCkgewotI2lmZGVmIFdMQ19ISUdIX09OTFkKLQkJaWYgKHdsLT5wdWItPmllZWVfaHcpIHsKLQkJCWllZWU4MDIxMV91bnJlZ2lzdGVyX2h3KHdsLT5wdWItPmllZWVfaHcpOwotCQkJV0xfRVJST1IoKCIlczogQmFjayBmcm9tIGRvd25cbiIsIF9fZnVuY19fKSk7Ci0JCX0KLQkJd2xjX2RldmljZV9yZW1vdmVkKHdsLT53bGMpOwotCQl3bGNfYm1hY19kbmdsX3JlYm9vdCh3bC0+cnBjKTsKLQkJYmNtX3JwY19kb3duKHdsLT5ycGMpOwotI2VuZGlmCi0JCVdMX0xPQ0sod2wpOwotCQl3bF9kb3duKHdsKTsKLQkJV0xfVU5MT0NLKHdsKTsKLSNpZmRlZiBXTENfSElHSF9PTkxZCi0JCWlmICh3bC0+cHViLT5pZWVlX2h3KSB7Ci0JCQlpZWVlODAyMTFfZnJlZV9odyh3bC0+cHViLT5pZWVlX2h3KTsKLQkJCVdMX0VSUk9SKCgiJXM6IEJhY2sgZnJvbSBpZWVlODAyMTFfZnJlZV9od1xuIiwKLQkJCQkgIF9fZnVuY19fKSk7Ci0JCQl3bC0+cHViLT5pZWVlX2h3ID0gTlVMTDsKLQkJfQotI2VuZGlmCi0JCXdsX2ZyZWUod2wpOwotCX0KLX0KLSNlbmRpZgkJCQkvKiBXTENfSElHSF9PTkxZICovCiAKIAogI2RlZmluZSBDSEFOMkdIWihjaGFubmVsLCBmcmVxZW5jeSwgY2hmbGFncykgIHsgXApAQCAtMTE2MywyOSArOTIyLDEzIEBACiAJCSAgIC5jYXAgPSBJRUVFODAyMTFfSFRfQ0FQX0dSTl9GTEQgfAogCQkgICBJRUVFODAyMTFfSFRfQ0FQX1NHSV8yMCB8CiAJCSAgIElFRUU4MDIxMV9IVF9DQVBfU0dJXzQwIHwgSUVFRTgwMjExX0hUX0NBUF80ME1IWl9JTlRPTEVSQU5ULAotI2lmZGVmIFdMQ19ISUdIX09OTFkKLQkJICAgLmh0X3N1cHBvcnRlZCA9IHRydWUsCi0JCSAgIC5hbXBkdV9mYWN0b3IgPSBBTVBEVV9SWF9GQUNUT1JfMTZLLAotI2Vsc2UKIAkJICAgLmh0X3N1cHBvcnRlZCA9IHRydWUsCiAJCSAgIC5hbXBkdV9mYWN0b3IgPSBBTVBEVV9SWF9GQUNUT1JfNjRLLAotI2VuZGlmCiAJCSAgIC5hbXBkdV9kZW5zaXR5ID0gQU1QRFVfREVGX01QRFVfREVOU0lUWSwKIAkJICAgLm1jcyA9IHsKIAkJCSAgIC8qIHBsYWNlaG9sZGVycyBmb3Igbm93ICovCi0jaWZkZWYgV0xDX0hJR0hfT05MWQotCQkJICAgLyoKLQkJCSAgICAqIHJ4X21hc2tbMF0gPSAweGZmIGJ5IGRlZmF1bHQKLQkJCSAgICAqIHJ4X21hc2tbMV0gPSAweGZmIGlmIG51bWJlciBvZiByeCBjaGFpbiA+PTIKLQkJCSAgICAqIHJ4X21hc2tbMl0gPSAweGZmIGlmIG51bWJlciBvZiByeCBjaGFpbiA+PTMKLQkJCSAgICAqIHJ4X21hc2tbNF0gPSAxIGlmIDQwTWh6IGlzIHN1cHBvcnRlZAotCQkJICAgICovCi0JCQkgICAucnhfbWFzayA9IHsweGZmLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKLQkJCSAgIC5yeF9oaWdoZXN0ID0gNzIsCS8qIG1heCByYXRlIG9mIHNpbmdsZSBzdHJlYW0gKi8KLSNlbHNlCiAJCQkgICAucnhfbWFzayA9IHsweGZmLCAweGZmLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKIAkJCSAgIC5yeF9oaWdoZXN0ID0gNTAwLAotI2VuZGlmCiAJCQkgICAudHhfcGFyYW1zID0gSUVFRTgwMjExX0hUX01DU19UWF9ERUZJTkVEfQogCQkgICB9CiB9OwpAQCAtMTIxMiw3ICs5NTUsNyBAQAogCiBzdGF0aWMgaW50IGllZWVfaHdfcmF0ZV9pbml0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQogewotCXdsX2luZm9fdCAqd2wgPSBIV19UT19XTChodyk7CisJc3RydWN0IHdsX2luZm8gKndsID0gSFdfVE9fV0woaHcpOwogCWludCBoYXNfNWc7CiAJY2hhciBwaHlfbGlzdFs0XTsKIApAQCAtMTIyMiwyMCArOTY1LDE2IEBACiAJaHctPndpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXSA9IE5VTEw7CiAKIAlpZiAod2xjX2dldCh3bC0+d2xjLCBXTENfR0VUX1BIWUxJU1QsIChpbnQgKikmcGh5X2xpc3QpIDwgMCkgewotCQlXTF9FUlJPUigoIlBoeSBsaXN0IGZhaWxlZFxuIikpOworCQlXTF9FUlJPUigiUGh5IGxpc3QgZmFpbGVkXG4iKTsKIAl9Ci0JV0xfTk9ORSgoIiVzOiBwaHlsaXN0ID0gJWNcbiIsIF9fZnVuY19fLCBwaHlfbGlzdFswXSkpOworCVdMX05PTkUoIiVzOiBwaHlsaXN0ID0gJWNcbiIsIF9fZnVuY19fLCBwaHlfbGlzdFswXSk7CiAKLSNpZm5kZWYgV0xDX0hJR0hfT05MWQogCWlmIChwaHlfbGlzdFswXSA9PSAnbicgfHwgcGh5X2xpc3RbMF0gPT0gJ2MnKSB7CiAJCWlmIChwaHlfbGlzdFswXSA9PSAnYycpIHsKIAkJCS8qIFNpbmdsZSBzdHJlYW0gKi8KIAkJCXdsX2JhbmRfMkdIel9ucGh5Lmh0X2NhcC5tY3MucnhfbWFza1sxXSA9IDA7CiAJCQl3bF9iYW5kXzJHSHpfbnBoeS5odF9jYXAubWNzLnJ4X2hpZ2hlc3QgPSA3MjsKIAkJfQotI2Vsc2UKLQlpZiAocGh5X2xpc3RbMF0gPT0gJ3MnKSB7Ci0jZW5kaWYKIAkJaHctPndpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXSA9ICZ3bF9iYW5kXzJHSHpfbnBoeTsKIAl9IGVsc2UgewogCQlCVUcoKTsKQEAgLTEyNDUsMTEgKzk4NCw3IEBACiAJLyogQXNzdW1lIGFsbCBiYW5kcyB1c2UgdGhlIHNhbWUgcGh5LiAgVHJ1ZSBmb3IgMTFuIGRldmljZXMuICovCiAJaWYgKE5CQU5EU19QVUIod2wtPnB1YikgPiAxKSB7CiAJCWhhc181ZysrOwotI2lmbmRlZiBXTENfSElHSF9PTkxZCiAJCWlmIChwaHlfbGlzdFswXSA9PSAnbicgfHwgcGh5X2xpc3RbMF0gPT0gJ2MnKSB7Ci0jZWxzZQotCQlpZiAocGh5X2xpc3RbMF0gPT0gJ3MnKSB7Ci0jZW5kaWYKIAkJCWh3LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0gPQogCQkJICAgICZ3bF9iYW5kXzVHSHpfbnBoeTsKIAkJfSBlbHNlIHsKQEAgLTEyNTcsNyArOTkyLDcgQEAKIAkJfQogCX0KIAotCVdMX05PTkUoKCIlczogMmdoeiA9ICVkLCA1Z2h6ID0gJWRcbiIsIF9fZnVuY19fLCAxLCBoYXNfNWcpKTsKKwlXTF9OT05FKCIlczogMmdoeiA9ICVkLCA1Z2h6ID0gJWRcbiIsIF9fZnVuY19fLCAxLCBoYXNfNWcpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMjg4LDcgKzEwMjMsNiBAQAogCXJldHVybiBpZWVlX2h3X3JhdGVfaW5pdChodyk7CiB9CiAKLSNpZm5kZWYgQkNNU0RJTwogLyoqCiAgKiBkZXRlcm1pbmVzIGlmIGEgZGV2aWNlIGlzIGEgV0wgZGV2aWNlLCBhbmQgaWYgc28sIGF0dGFjaGVzIGl0LgogICoKQEAgLTEzMDAsMTUgKzEwMzQsMTUgQEAKIHdsX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKIAlpbnQgcmM7Ci0Jd2xfaW5mb190ICp3bDsKKwlzdHJ1Y3Qgd2xfaW5mbyAqd2w7CiAJc3RydWN0IGllZWU4MDIxMV9odyAqaHc7CiAJdTMyIHZhbDsKIAogCUFTU0VSVChwZGV2KTsKIAotCVdMX1RSQUNFKCgiJXM6IGJ1cyAlZCBzbG90ICVkIGZ1bmMgJWQgaXJxICVkXG4iLCBfX2Z1bmNfXywKLQkJICBwZGV2LT5idXMtPm51bWJlciwgUENJX1NMT1QocGRldi0+ZGV2Zm4pLAotCQkgIFBDSV9GVU5DKHBkZXYtPmRldmZuKSwgcGRldi0+aXJxKSk7CisJV0xfVFJBQ0UoIiVzOiBidXMgJWQgc2xvdCAlZCBmdW5jICVkIGlycSAlZFxuIiwKKwkJIF9fZnVuY19fLCBwZGV2LT5idXMtPm51bWJlciwgUENJX1NMT1QocGRldi0+ZGV2Zm4pLAorCQkgUENJX0ZVTkMocGRldi0+ZGV2Zm4pLCBwZGV2LT5pcnEpOwogCiAJaWYgKChwZGV2LT52ZW5kb3IgIT0gUENJX1ZFTkRPUl9JRF9CUk9BRENPTSkgfHwKIAkgICAgKCgocGRldi0+ZGV2aWNlICYgMHhmZjAwKSAhPSAweDQzMDApICYmCkBAIC0xMzE4LDkgKzEwNTIsOSBAQAogCiAJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKIAlpZiAocmMpIHsKLQkJV0xfRVJST1IoKCIlczogQ2Fubm90IGVuYWJsZSBkZXZpY2UgJWQtJWRfJWRcbiIsIF9fZnVuY19fLAotCQkJICBwZGV2LT5idXMtPm51bWJlciwgUENJX1NMT1QocGRldi0+ZGV2Zm4pLAotCQkJICBQQ0lfRlVOQyhwZGV2LT5kZXZmbikpKTsKKwkJV0xfRVJST1IoIiVzOiBDYW5ub3QgZW5hYmxlIGRldmljZSAlZC0lZF8lZFxuIiwKKwkJCSBfX2Z1bmNfXywgcGRldi0+YnVzLT5udW1iZXIsIFBDSV9TTE9UKHBkZXYtPmRldmZuKSwKKwkJCSBQQ0lfRlVOQyhwZGV2LT5kZXZmbikpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJcGNpX3NldF9tYXN0ZXIocGRldik7CkBAIC0xMzI5LDkgKzEwNjMsOSBAQAogCWlmICgodmFsICYgMHgwMDAwZmYwMCkgIT0gMCkKIAkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCAweDQwLCB2YWwgJiAweGZmZmYwMGZmKTsKIAotCWh3ID0gaWVlZTgwMjExX2FsbG9jX2h3KHNpemVvZih3bF9pbmZvX3QpLCAmd2xfb3BzKTsKKwlodyA9IGllZWU4MDIxMV9hbGxvY19odyhzaXplb2Yoc3RydWN0IHdsX2luZm8pLCAmd2xfb3BzKTsKIAlpZiAoIWh3KSB7Ci0JCVdMX0VSUk9SKCgiJXM6IGllZWU4MDIxMV9hbGxvY19odyBmYWlsZWRcbiIsIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCIlczogaWVlZTgwMjExX2FsbG9jX2h3IGZhaWxlZFxuIiwgX19mdW5jX18pOwogCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gZXJyXzE7CiAJfQpAQCAtMTM0MCwzNCArMTA3NCwzNCBAQAogCiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGh3KTsKIAotCWJ6ZXJvKGh3LT5wcml2LCBzaXplb2YoKndsKSk7CisJbWVtc2V0KGh3LT5wcml2LCAwLCBzaXplb2YoKndsKSk7CiAKIAl3bCA9IHdsX2F0dGFjaChwZGV2LT52ZW5kb3IsIHBkZXYtPmRldmljZSwgcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApLAogCQkgICAgICAgUENJX0JVUywgcGRldiwgcGRldi0+aXJxKTsKIAogCWlmICghd2wpIHsKLQkJV0xfRVJST1IoKCIlczogJXM6IHdsX2F0dGFjaCBmYWlsZWQhXG4iLAotCQkJS0JVSUxEX01PRE5BTUUsIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCIlczogJXM6IHdsX2F0dGFjaCBmYWlsZWQhXG4iLAorCQkJIEtCVUlMRF9NT0ROQU1FLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAlyZXR1cm4gMDsKICBlcnJfMToKLQlXTF9FUlJPUigoIiVzOiBlcnJfMTogTWFqb3IgaG9hcmthZ2VcbiIsIF9fZnVuY19fKSk7CisJV0xfRVJST1IoIiVzOiBlcnJfMTogTWFqb3IgaG9hcmthZ2VcbiIsIF9fZnVuY19fKTsKIAlyZXR1cm4gMDsKIH0KIAogI2lmZGVmIExJTlVYU1RBX1BTCiBzdGF0aWMgaW50IHdsX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKLQl3bF9pbmZvX3QgKndsOworCXN0cnVjdCB3bF9pbmZvICp3bDsKIAlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsKIAotCVdMX1RSQUNFKCgid2w6IHdsX3N1c3BlbmRcbiIpKTsKKwlXTF9UUkFDRSgid2w6IHdsX3N1c3BlbmRcbiIpOwogCiAJaHcgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJd2wgPSBIV19UT19XTChodyk7CiAJaWYgKCF3bCkgewotCQlXTF9FUlJPUigoIndsOiB3bF9zdXNwZW5kOiBwY2lfZ2V0X2RydmRhdGEgZmFpbGVkXG4iKSk7CisJCVdMX0VSUk9SKCJ3bDogd2xfc3VzcGVuZDogcGNpX2dldF9kcnZkYXRhIGZhaWxlZFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtMTM4MiwxNiArMTExNiwxNiBAQAogCiBzdGF0aWMgaW50IHdsX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKLQl3bF9pbmZvX3QgKndsOworCXN0cnVjdCB3bF9pbmZvICp3bDsKIAlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsKIAlpbnQgZXJyID0gMDsKIAl1MzIgdmFsOwogCi0JV0xfVFJBQ0UoKCJ3bDogd2xfcmVzdW1lXG4iKSk7CisJV0xfVFJBQ0UoIndsOiB3bF9yZXN1bWVcbiIpOwogCWh3ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCXdsID0gSFdfVE9fV0woaHcpOwogCWlmICghd2wpIHsKLQkJV0xfRVJST1IoKCJ3bDogd2xfcmVzdW1lOiBwY2lfZ2V0X2RydmRhdGEgZmFpbGVkXG4iKSk7CisJCVdMX0VSUk9SKCJ3bDogd2xfcmVzdW1lOiBwY2lfZ2V0X2RydmRhdGEgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0xNDIxLDE3ICsxMTU1LDE3IEBACiAKIHN0YXRpYyB2b2lkIHdsX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKLQl3bF9pbmZvX3QgKndsOworCXN0cnVjdCB3bF9pbmZvICp3bDsKIAlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsKIAogCWh3ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCXdsID0gSFdfVE9fV0woaHcpOwogCWlmICghd2wpIHsKLQkJV0xfRVJST1IoKCJ3bDogd2xfcmVtb3ZlOiBwY2lfZ2V0X2RydmRhdGEgZmFpbGVkXG4iKSk7CisJCVdMX0VSUk9SKCJ3bDogd2xfcmVtb3ZlOiBwY2lfZ2V0X2RydmRhdGEgZmFpbGVkXG4iKTsKIAkJcmV0dXJuOwogCX0KIAlpZiAoIXdsY19jaGlwbWF0Y2gocGRldi0+dmVuZG9yLCBwZGV2LT5kZXZpY2UpKSB7Ci0JCVdMX0VSUk9SKCgid2w6IHdsX3JlbW92ZTogd2xjX2NoaXBtYXRjaCBmYWlsZWRcbiIpKTsKKwkJV0xfRVJST1IoIndsOiB3bF9yZW1vdmU6IHdsY19jaGlwbWF0Y2ggZmFpbGVkXG4iKTsKIAkJcmV0dXJuOwogCX0KIAlpZiAod2wtPndsYykgewpAQCAtMTQzOSw3ICsxMTczLDcgQEAKIAkJV0xfTE9DSyh3bCk7CiAJCXdsX2Rvd24od2wpOwogCQlXTF9VTkxPQ0sod2wpOwotCQlXTF9OT05FKCgiJXM6IERvd25cbiIsIF9fZnVuY19fKSk7CisJCVdMX05PTkUoIiVzOiBEb3duXG4iLCBfX2Z1bmNfXyk7CiAJfQogCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIApAQCAtMTQ1OSw3ICsxMTkzLDYgQEAKICAucmVtb3ZlICAgPSBfX2RldmV4aXRfcCh3bF9yZW1vdmUpLAogIC5pZF90YWJsZSA9IHdsX2lkX3RhYmxlLAogfTsKLSNlbmRpZgkJCQkvKiAhQkNNU0RJTyAqLwogCiAvKioKICAqIFRoaXMgaXMgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHRoZSBXTCBkcml2ZXIuCkBAIC0xNDgwLDcgKzEyMTMsNiBAQAogCQlpZiAodmFyKQogCQkJd2xfbXNnX2xldmVsID0gc2ltcGxlX3N0cnRvdWwodmFyLCBOVUxMLCAwKTsKIAl9Ci0jaWZuZGVmIFdMQ19ISUdIX09OTFkKIAl7CiAJCWV4dGVybiB1MzIgcGh5aGFsX21zZ19sZXZlbDsKIApAQCAtMTQ5MiwyNSArMTIyNCwxMyBAQAogCQkJCXBoeWhhbF9tc2dfbGV2ZWwgPSBzaW1wbGVfc3RydG91bCh2YXIsIE5VTEwsIDApOwogCQl9CiAJfQotI2VuZGlmCQkJCS8qIFdMQ19ISUdIX09OTFkgKi8KICNlbmRpZgkJCQkvKiBCQ01EQkcgKi8KIAotI2lmbmRlZiBCQ01TRElPCiAJZXJyb3IgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZ3bF9wY2lfZHJpdmVyKTsKIAlpZiAoIWVycm9yKQogCQlyZXR1cm4gMDsKIAotI2VuZGlmCQkJCS8qICFCQ01TRElPICovCiAKLSNpZmRlZiBXTENfSElHSF9PTkxZCi0JLyogQk1BQ19OT1RFOiBkZWZpbmUgaGFyZGNvZGUgbnVtYmVyLCB3aHkgTk9ERVZJQ0UgaXMgb2sgPyAqLwotCWVycm9yID0KLQkgICAgZGJ1c19yZWdpc3RlcihCQ01fRE5HTF9WSUQsIDAsIHdsX2RidXNfcHJvYmVfY2IsCi0JCQkgIHdsX2RidXNfZGlzY29ubmVjdF9jYiwgTlVMTCwgTlVMTCwgTlVMTCk7Ci0JaWYgKGVycm9yID09IERCVVNfRVJSX05PREVWSUNFKSB7Ci0JCWVycm9yID0gREJVU19PSzsKLQl9Ci0jZW5kaWYJCQkJLyogV0xDX0hJR0hfT05MWSAqLwogCiAJcmV0dXJuIGVycm9yOwogfQpAQCAtMTUyNCwxMyArMTI0NCw4IEBACiAgKi8KIHN0YXRpYyB2b2lkIF9fZXhpdCB3bF9tb2R1bGVfZXhpdCh2b2lkKQogewotI2lmbmRlZiBCQ01TRElPCiAJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZ3bF9wY2lfZHJpdmVyKTsKLSNlbmRpZgkJCQkvKiAhQkNNU0RJTyAqLwogCi0jaWZkZWYgV0xDX0hJR0hfT05MWQotCWRidXNfZGVyZWdpc3RlcigpOwotI2VuZGlmCQkJCS8qIFdMQ19ISUdIX09OTFkgKi8KIH0KIAogbW9kdWxlX2luaXQod2xfbW9kdWxlX2luaXQpOwpAQCAtMTU0MywxOSArMTI1OCwxNyBAQAogICogYnkgdGhlIHdsIHBhcmFtZXRlci4KICAqCiAgKi8KLXZvaWQgd2xfZnJlZSh3bF9pbmZvX3QgKndsKQordm9pZCB3bF9mcmVlKHN0cnVjdCB3bF9pbmZvICp3bCkKIHsKIAl3bF90aW1lcl90ICp0LCAqbmV4dDsKLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCiAJQVNTRVJUKHdsKTsKLSNpZm5kZWYgV0xDX0hJR0hfT05MWQogCS8qIGZyZWUgdWNvZGUgZGF0YSAqLwogCWlmICh3bC0+ZncuZndfY250KQogCQl3bF91Y29kZV9kYXRhX2ZyZWUoKTsKIAlpZiAod2wtPmlycSkKIAkJZnJlZV9pcnEod2wtPmlycSwgd2wpOwotI2VuZGlmCiAKIAkvKiBraWxsIGRwYyAqLwogCXRhc2tsZXRfa2lsbCgmd2wtPnRhc2tsZXQpOwpAQCAtMTU5MywxMDMgKzEzMDYsNTAgQEAKIAkgKiB1bnJlZ2lzdGVyX25ldGRldigpIGNhbGxzIGdldF9zdGF0cygpIHdoaWNoIG1heSByZWFkIGNoaXAgcmVnaXN0ZXJzCiAJICogc28gd2UgY2Fubm90IHVubWFwIHRoZSBjaGlwIHJlZ2lzdGVycyB1bnRpbCBhZnRlciBjYWxsaW5nIHVucmVnaXN0ZXJfbmV0ZGV2KCkgLgogCSAqLwotCWlmICh3bC0+cmVnc3ZhICYmIEJVU1RZUEUod2wtPmJjbV9idXN0eXBlKSAhPSBTRElPX0JVUyAmJgotCSAgICBCVVNUWVBFKHdsLT5iY21fYnVzdHlwZSkgIT0gSlRBR19CVVMpIHsKKwlpZiAod2wtPnJlZ3N2YSAmJiB3bC0+YmNtX2J1c3R5cGUgIT0gU0RJT19CVVMgJiYKKwkgICAgd2wtPmJjbV9idXN0eXBlICE9IEpUQUdfQlVTKSB7CiAJCWlvdW5tYXAoKHZvaWQgKil3bC0+cmVnc3ZhKTsKIAl9CiAJd2wtPnJlZ3N2YSA9IE5VTEw7CiAKLSNpZmRlZiBXTENfSElHSF9PTkxZCi0Jd2xfcnBjcV9mcmVlKHdsKTsKLQotCXdsX3R4cV9mcmVlKHdsKTsKLQotCWlmICh3bC0+cnBjKSB7Ci0JCWJjbV9ycGNfZGV0YWNoKHdsLT5ycGMpOwotCQl3bC0+cnBjID0gTlVMTDsKLQl9Ci0KLQlpZiAod2wtPnJwY190aCkgewotCQliY21fcnBjX3RwX2RldGFjaCh3bC0+cnBjX3RoKTsKLQkJd2wtPnJwY190aCA9IE5VTEw7Ci0JfQotI2VuZGlmCQkJCS8qIFdMQ19ISUdIX09OTFkgKi8KIAogCW9zbF9kZXRhY2gob3NoKTsKIH0KIAotI2lmZGVmIFdMQ19MT1cKIC8qIHRyYW5zbWl0IGEgcGFja2V0ICovCi1zdGF0aWMgaW50IEJDTUZBU1RQQVRIIHdsX3N0YXJ0KHN0cnVjdCBza19idWZmICpza2IsIHdsX2luZm9fdCAqd2wpCitzdGF0aWMgaW50IEJDTUZBU1RQQVRIIHdsX3N0YXJ0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB3bF9pbmZvICp3bCkKIHsKIAlpZiAoIXdsKQogCQlyZXR1cm4gLUVORVRET1dOOwogCiAJcmV0dXJuIHdsX3N0YXJ0X2ludCh3bCwgV0xfVE9fSFcod2wpLCBza2IpOwogfQotI2VuZGlmCQkJCS8qIFdMQ19MT1cgKi8KIAogc3RhdGljIGludCBCQ01GQVNUUEFUSAotd2xfc3RhcnRfaW50KHdsX2luZm9fdCAqd2wsIHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQord2xfc3RhcnRfaW50KHN0cnVjdCB3bF9pbmZvICp3bCwgc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0jaWZkZWYgV0xDX0hJR0hfT05MWQotCVdMX0xPQ0sod2wpOwotI2VuZGlmCiAJd2xjX3NlbmRwa3RfbWFjODAyMTEod2wtPndsYywgc2tiLCBodyk7Ci0jaWZkZWYgV0xDX0hJR0hfT05MWQotCVdMX1VOTE9DSyh3bCk7Ci0jZW5kaWYKIAlyZXR1cm4gTkVUREVWX1RYX09LOwogfQogCi12b2lkIHdsX3R4Zmxvd2NvbnRyb2wod2xfaW5mb190ICp3bCwgc3RydWN0IHdsX2lmICp3bGlmLCBib29sIHN0YXRlLCBpbnQgcHJpbykKK3ZvaWQgd2xfdHhmbG93Y29udHJvbChzdHJ1Y3Qgd2xfaW5mbyAqd2wsIHN0cnVjdCB3bF9pZiAqd2xpZiwgYm9vbCBzdGF0ZSwKKwkJICAgICAgaW50IHByaW8pCiB7Ci0JV0xfRVJST1IoKCJTaG91bGRuJ3QgYmUgaGVyZSAlc1xuIiwgX19mdW5jX18pKTsKKwlXTF9FUlJPUigiU2hvdWxkbid0IGJlIGhlcmUgJXNcbiIsIF9fZnVuY19fKTsKIH0KIAotI2lmIGRlZmluZWQoV0xDX0hJR0hfT05MWSkKLS8qIFNjaGVkdWxlIGEgY29tcGxldGlvbiBoYW5kbGVyIHRvIHJ1biBhdCBzYWZlIHRpbWUgKi8KLXN0YXRpYyBpbnQKLXdsX3NjaGVkdWxlX3Rhc2sod2xfaW5mb190ICp3bCwgdm9pZCAoKmZuKSAoc3RydWN0IHdsX3Rhc2sgKnRhc2spLAotCQkgdm9pZCAqY29udGV4dCkKK3ZvaWQgd2xfaW5pdChzdHJ1Y3Qgd2xfaW5mbyAqd2wpCiB7Ci0Jd2xfdGFza190ICp0YXNrOwotCi0JV0xfVFJBQ0UoKCJ3bCVkOiB3bF9zY2hlZHVsZV90YXNrXG4iLCB3bC0+cHViLT51bml0KSk7Ci0KLQl0YXNrID0ga21hbGxvYyhzaXplb2Yod2xfdGFza190KSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCF0YXNrKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogd2xfc2NoZWR1bGVfdGFzazogb3V0IG9mIG1lbW9yeVxuIiwgd2wtPnB1Yi0+dW5pdCkpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlJTklUX1dPUksoJnRhc2stPndvcmssICh3b3JrX2Z1bmNfdCkgZm4pOwotCXRhc2stPmNvbnRleHQgPSBjb250ZXh0OwotCi0JaWYgKCFzY2hlZHVsZV93b3JrKCZ0YXNrLT53b3JrKSkgewotCQlXTF9FUlJPUigoIndsJWQ6IHNjaGVkdWxlX3dvcmsoKSBmYWlsZWRcbiIsIHdsLT5wdWItPnVuaXQpKTsKLQkJa2ZyZWUodGFzayk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWF0b21pY19pbmMoJndsLT5jYWxsYmFja3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYJCQkJLyogZGVmaW5lZChXTENfSElHSF9PTkxZKSAqLwotCi12b2lkIHdsX2luaXQod2xfaW5mb190ICp3bCkKLXsKLQlXTF9UUkFDRSgoIndsJWQ6IHdsX2luaXRcbiIsIHdsLT5wdWItPnVuaXQpKTsKKwlXTF9UUkFDRSgid2wlZDogd2xfaW5pdFxuIiwgd2wtPnB1Yi0+dW5pdCk7CiAKIAl3bF9yZXNldCh3bCk7CiAKIAl3bGNfaW5pdCh3bC0+d2xjKTsKIH0KIAotdWludCB3bF9yZXNldCh3bF9pbmZvX3QgKndsKQordWludCB3bF9yZXNldChzdHJ1Y3Qgd2xfaW5mbyAqd2wpCiB7Ci0JV0xfVFJBQ0UoKCJ3bCVkOiB3bF9yZXNldFxuIiwgd2wtPnB1Yi0+dW5pdCkpOworCVdMX1RSQUNFKCJ3bCVkOiB3bF9yZXNldFxuIiwgd2wtPnB1Yi0+dW5pdCk7CiAKIAl3bGNfcmVzZXQod2wtPndsYyk7CiAKQEAgLTE3MDMsMjUgKzEzNjMsMjIgQEAKICAqIFRoZXNlIGFyZSBpbnRlcnJ1cHQgb24vb2ZmIGVudHJ5IHBvaW50cy4gRGlzYWJsZSBpbnRlcnJ1cHRzCiAgKiBkdXJpbmcgaW50ZXJydXB0IHN0YXRlIHRyYW5zaXRpb24uCiAgKi8KLXZvaWQgQkNNRkFTVFBBVEggd2xfaW50cnNvbih3bF9pbmZvX3QgKndsKQordm9pZCBCQ01GQVNUUEFUSCB3bF9pbnRyc29uKHN0cnVjdCB3bF9pbmZvICp3bCkKIHsKLSNpZiBkZWZpbmVkKFdMQ19MT1cpCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCUlOVF9MT0NLKHdsLCBmbGFncyk7CiAJd2xjX2ludHJzb24od2wtPndsYyk7CiAJSU5UX1VOTE9DSyh3bCwgZmxhZ3MpOwotI2VuZGlmCQkJCS8qIFdMQ19MT1cgKi8KIH0KIAotYm9vbCB3bF9hbGxvY19kbWFfcmVzb3VyY2VzKHdsX2luZm9fdCAqd2wsIHVpbnQgYWRkcndpZHRoKQorYm9vbCB3bF9hbGxvY19kbWFfcmVzb3VyY2VzKHN0cnVjdCB3bF9pbmZvICp3bCwgdWludCBhZGRyd2lkdGgpCiB7CiAJcmV0dXJuIHRydWU7CiB9CiAKLXUzMiBCQ01GQVNUUEFUSCB3bF9pbnRyc29mZih3bF9pbmZvX3QgKndsKQordTMyIEJDTUZBU1RQQVRIIHdsX2ludHJzb2ZmKHN0cnVjdCB3bF9pbmZvICp3bCkKIHsKLSNpZiBkZWZpbmVkKFdMQ19MT1cpCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MzIgc3RhdHVzOwogCkBAIC0xNzI5LDIzICsxMzg2LDE4IEBACiAJc3RhdHVzID0gd2xjX2ludHJzb2ZmKHdsLT53bGMpOwogCUlOVF9VTkxPQ0sod2wsIGZsYWdzKTsKIAlyZXR1cm4gc3RhdHVzOwotI2Vsc2UKLQlyZXR1cm4gMDsKLSNlbmRpZgkJCQkvKiBXTENfTE9XICovCiB9CiAKLXZvaWQgd2xfaW50cnNyZXN0b3JlKHdsX2luZm9fdCAqd2wsIHUzMiBtYWNpbnRtYXNrKQordm9pZCB3bF9pbnRyc3Jlc3RvcmUoc3RydWN0IHdsX2luZm8gKndsLCB1MzIgbWFjaW50bWFzaykKIHsKLSNpZiBkZWZpbmVkKFdMQ19MT1cpCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCUlOVF9MT0NLKHdsLCBmbGFncyk7CiAJd2xjX2ludHJzcmVzdG9yZSh3bC0+d2xjLCBtYWNpbnRtYXNrKTsKIAlJTlRfVU5MT0NLKHdsLCBmbGFncyk7Ci0jZW5kaWYJCQkJLyogV0xDX0xPVyAqLwogfQogCi1pbnQgd2xfdXAod2xfaW5mb190ICp3bCkKK2ludCB3bF91cChzdHJ1Y3Qgd2xfaW5mbyAqd2wpCiB7CiAJaW50IGVycm9yID0gMDsKIApAQCAtMTc1Nyw3ICsxNDA5LDcgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLXZvaWQgd2xfZG93bih3bF9pbmZvX3QgKndsKQordm9pZCB3bF9kb3duKHN0cnVjdCB3bF9pbmZvICp3bCkKIHsKIAl1aW50IGNhbGxiYWNrcywgcmV0X3ZhbCA9IDA7CiAKQEAgLTE3NjgsMjQgKzE0MjAsMjEgQEAKIAkvKiB3YWl0IGZvciBkb3duIGNhbGxiYWNrcyB0byBjb21wbGV0ZSAqLwogCVdMX1VOTE9DSyh3bCk7CiAKLSNpZm5kZWYgV0xDX0hJR0hfT05MWQogCS8qIEZvciBISUdIX29ubHkgZHJpdmVyLCBpdCdzIGltcG9ydGFudCB0byBhY3R1YWxseSBzY2hlZHVsZSBvdGhlciB3b3JrLAogCSAqIG5vdCBqdXN0IHNwaW4gd2FpdCBzaW5jZSBldmVyeXRoaW5nIHJ1bnMgYXQgc2NoZWR1bGUgbGV2ZWwKIAkgKi8KIAlTUElOV0FJVCgoYXRvbWljX3JlYWQoJndsLT5jYWxsYmFja3MpID4gY2FsbGJhY2tzKSwgMTAwICogMTAwMCk7Ci0jZW5kaWYJCQkJLyogV0xDX0hJR0hfT05MWSAqLwogCiAJV0xfTE9DSyh3bCk7CiB9CiAKIGlycXJldHVybl90IEJDTUZBU1RQQVRIIHdsX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7Ci0jaWYgZGVmaW5lZChXTENfTE9XKQotCXdsX2luZm9fdCAqd2w7CisJc3RydWN0IHdsX2luZm8gKndsOwogCWJvb2wgb3Vycywgd2FudGRwYzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jd2wgPSAod2xfaW5mb190ICopIGRldl9pZDsKKwl3bCA9IChzdHJ1Y3Qgd2xfaW5mbyAqKSBkZXZfaWQ7CiAKIAlXTF9JU1JMT0NLKHdsLCBmbGFncyk7CiAKQEAgLTE4MDUsMTcgKzE0NTQsMTMgQEAKIAlXTF9JU1JVTkxPQ0sod2wsIGZsYWdzKTsKIAogCXJldHVybiBJUlFfUkVUVkFMKG91cnMpOwotI2Vsc2UKLQlyZXR1cm4gSVJRX1JFVFZBTCgwKTsKLSNlbmRpZgkJCQkvKiBXTENfTE9XICovCiB9CiAKIHN0YXRpYyB2b2lkIEJDTUZBU1RQQVRIIHdsX2RwYyh1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0jaWZkZWYgV0xDX0xPVwotCXdsX2luZm9fdCAqd2w7CisJc3RydWN0IHdsX2luZm8gKndsOwogCi0Jd2wgPSAod2xfaW5mb190ICopIGRhdGE7CisJd2wgPSAoc3RydWN0IHdsX2luZm8gKikgZGF0YTsKIAogCVdMX0xPQ0sod2wpOwogCkBAIC0xODQ2LDIwICsxNDkxLDE5IEBACiAKICBkb25lOgogCVdMX1VOTE9DSyh3bCk7Ci0jZW5kaWYJCQkJLyogV0xDX0xPVyAqLwogfQogCi1zdGF0aWMgdm9pZCB3bF9saW5rX3VwKHdsX2luZm9fdCAqd2wsIGNoYXIgKmlmbmFtZSkKK3N0YXRpYyB2b2lkIHdsX2xpbmtfdXAoc3RydWN0IHdsX2luZm8gKndsLCBjaGFyICppZm5hbWUpCiB7Ci0JV0xfRVJST1IoKCJ3bCVkOiBsaW5rIHVwICglcylcbiIsIHdsLT5wdWItPnVuaXQsIGlmbmFtZSkpOworCVdMX0VSUk9SKCJ3bCVkOiBsaW5rIHVwICglcylcbiIsIHdsLT5wdWItPnVuaXQsIGlmbmFtZSk7CiB9CiAKLXN0YXRpYyB2b2lkIHdsX2xpbmtfZG93bih3bF9pbmZvX3QgKndsLCBjaGFyICppZm5hbWUpCitzdGF0aWMgdm9pZCB3bF9saW5rX2Rvd24oc3RydWN0IHdsX2luZm8gKndsLCBjaGFyICppZm5hbWUpCiB7Ci0JV0xfRVJST1IoKCJ3bCVkOiBsaW5rIGRvd24gKCVzKVxuIiwgd2wtPnB1Yi0+dW5pdCwgaWZuYW1lKSk7CisJV0xfRVJST1IoIndsJWQ6IGxpbmsgZG93biAoJXMpXG4iLCB3bC0+cHViLT51bml0LCBpZm5hbWUpOwogfQogCi12b2lkIHdsX2V2ZW50KHdsX2luZm9fdCAqd2wsIGNoYXIgKmlmbmFtZSwgd2xjX2V2ZW50X3QgKmUpCit2b2lkIHdsX2V2ZW50KHN0cnVjdCB3bF9pbmZvICp3bCwgY2hhciAqaWZuYW1lLCB3bGNfZXZlbnRfdCAqZSkKIHsKIAogCXN3aXRjaCAoZS0+ZXZlbnQuZXZlbnRfdHlwZSkgewpAQCAtMTg3NywxMiArMTUyMSw3IEBACiAKIHN0YXRpYyB2b2lkIHdsX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLSNpZm5kZWYgV0xDX0hJR0hfT05MWQogCV93bF90aW1lcigod2xfdGltZXJfdCAqKSBkYXRhKTsKLSNlbHNlCi0Jd2xfdGltZXJfdCAqdCA9ICh3bF90aW1lcl90ICopIGRhdGE7Ci0Jd2xfc2NoZWR1bGVfdGFzayh0LT53bCwgd2xfdGltZXJfdGFzaywgdCk7Ci0jZW5kaWYJCQkJLyogV0xDX0hJR0hfT05MWSAqLwogfQogCiBzdGF0aWMgdm9pZCBfd2xfdGltZXIod2xfdGltZXJfdCAqdCkKQEAgLTE5MDYsMTggKzE1NDUsMTggQEAKIAlXTF9VTkxPQ0sodC0+d2wpOwogfQogCi13bF90aW1lcl90ICp3bF9pbml0X3RpbWVyKHdsX2luZm9fdCAqd2wsIHZvaWQgKCpmbikgKHZvaWQgKmFyZyksIHZvaWQgKmFyZywKK3dsX3RpbWVyX3QgKndsX2luaXRfdGltZXIoc3RydWN0IHdsX2luZm8gKndsLCB2b2lkICgqZm4pICh2b2lkICphcmcpLCB2b2lkICphcmcsCiAJCQkgIGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJd2xfdGltZXJfdCAqdDsKIAogCXQgPSBrbWFsbG9jKHNpemVvZih3bF90aW1lcl90KSwgR0ZQX0FUT01JQyk7CiAJaWYgKCF0KSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogd2xfaW5pdF90aW1lcjogb3V0IG9mIG1lbW9yeVxuIiwgd2wtPnB1Yi0+dW5pdCkpOworCQlXTF9FUlJPUigid2wlZDogd2xfaW5pdF90aW1lcjogb3V0IG9mIG1lbW9yeVxuIiwgd2wtPnB1Yi0+dW5pdCk7CiAJCXJldHVybiAwOwogCX0KIAotCWJ6ZXJvKHQsIHNpemVvZih3bF90aW1lcl90KSk7CisJbWVtc2V0KHQsIDAsIHNpemVvZih3bF90aW1lcl90KSk7CiAKIAlpbml0X3RpbWVyKCZ0LT50aW1lcik7CiAJdC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSB0OwpAQCAtMTk0MCwxMiArMTU3OSwxMiBAQAogLyogQk1BQ19OT1RFOiBBZGQgdGltZXIgYWRkcyBvbmx5IHRoZSBrZXJuZWwgdGltZXIgc2luY2UgaXQncyBnb2luZyB0byBiZSBtb3JlIGFjY3VyYXRlCiAgKiBhcyB3ZWxsIGFzIGl0J3MgZWFzaWVyIHRvIG1ha2UgaXQgcGVyaW9kaWMKICAqLwotdm9pZCB3bF9hZGRfdGltZXIod2xfaW5mb190ICp3bCwgd2xfdGltZXJfdCAqdCwgdWludCBtcywgaW50IHBlcmlvZGljKQordm9pZCB3bF9hZGRfdGltZXIoc3RydWN0IHdsX2luZm8gKndsLCB3bF90aW1lcl90ICp0LCB1aW50IG1zLCBpbnQgcGVyaW9kaWMpCiB7CiAjaWZkZWYgQkNNREJHCiAJaWYgKHQtPnNldCkgewotCQlXTF9FUlJPUigoIiVzOiBBbHJlYWR5IHNldC4gTmFtZTogJXMsIHBlciAlZFxuIiwKLQkJCSAgX19mdW5jX18sIHQtPm5hbWUsIHBlcmlvZGljKSk7CisJCVdMX0VSUk9SKCIlczogQWxyZWFkeSBzZXQuIE5hbWU6ICVzLCBwZXIgJWRcbiIsCisJCQkgX19mdW5jX18sIHQtPm5hbWUsIHBlcmlvZGljKTsKIAl9CiAjZW5kaWYKIAlBU1NFUlQoIXQtPnNldCk7CkBAIC0xOTYwLDcgKzE1OTksNyBAQAogfQogCiAvKiByZXR1cm4gdHJ1ZSBpZiB0aW1lciBzdWNjZXNzZnVsbHkgZGVsZXRlZCwgZmFsc2UgaWYgc3RpbGwgcGVuZGluZyAqLwotYm9vbCB3bF9kZWxfdGltZXIod2xfaW5mb190ICp3bCwgd2xfdGltZXJfdCAqdCkKK2Jvb2wgd2xfZGVsX3RpbWVyKHN0cnVjdCB3bF9pbmZvICp3bCwgd2xfdGltZXJfdCAqdCkKIHsKIAlpZiAodC0+c2V0KSB7CiAJCXQtPnNldCA9IGZhbHNlOwpAQCAtMTk3Myw3ICsxNjEyLDcgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCB3bF9mcmVlX3RpbWVyKHdsX2luZm9fdCAqd2wsIHdsX3RpbWVyX3QgKnQpCit2b2lkIHdsX2ZyZWVfdGltZXIoc3RydWN0IHdsX2luZm8gKndsLCB3bF90aW1lcl90ICp0KQogewogCXdsX3RpbWVyX3QgKnRtcDsKIApAQCAtMjAwOSw3ICsxNjQ4LDcgQEAKIAogc3RhdGljIGludCB3bF9saW51eF93YXRjaGRvZyh2b2lkICpjdHgpCiB7Ci0Jd2xfaW5mb190ICp3bCA9ICh3bF9pbmZvX3QgKikgY3R4OworCXN0cnVjdCB3bF9pbmZvICp3bCA9IChzdHJ1Y3Qgd2xfaW5mbyAqKSBjdHg7CiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gTlVMTDsKIAl1aW50IGlkOwogCS8qIHJlZnJlc2ggc3RhdHMgKi8KQEAgLTIwNDksMjMzICsxNjg4LDEyIEBACiAJdTMyIGlkeDsKIH07CiAKLSNpZmRlZiBXTENfSElHSF9PTkxZCi1zdGF0aWMgdm9pZCB3bF9ycGNfZG93bih2b2lkICp3bGgpCi17Ci0Jd2xfaW5mb190ICp3bCA9ICh3bF9pbmZvX3QgKikgKHdsaCk7Ci0KLQl3bGNfZGV2aWNlX3JlbW92ZWQod2wtPndsYyk7Ci0KLQl3bF9ycGNxX2ZyZWUod2wpOwotfQotCi1zdGF0aWMgaW50IEJDTUZBU1RQQVRIIHdsX3N0YXJ0KHN0cnVjdCBza19idWZmICpza2IsIHdsX2luZm9fdCAqd2wpCi17Ci0KLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc2tiLT5wcmV2ID0gTlVMTDsKLQotCS8qIExvY2sgdGhlIHF1ZXVlIGFzIHRhc2tsZXQgY291bGQgYmUgcnVubmluZyBhdCB0aGlzIHRpbWUgKi8KLQlUWFFfTE9DSyh3bCwgZmxhZ3MpOwotCWlmICh3bC0+dHhxX2hlYWQgPT0gTlVMTCkKLQkJd2wtPnR4cV9oZWFkID0gc2tiOwotCWVsc2UgewotCQl3bC0+dHhxX3RhaWwtPnByZXYgPSBza2I7Ci0JfQotCXdsLT50eHFfdGFpbCA9IHNrYjsKLQotCWlmICh3bC0+dHhxX2Rpc3BhdGNoZWQgPT0gZmFsc2UpIHsKLQkJd2wtPnR4cV9kaXNwYXRjaGVkID0gdHJ1ZTsKLQotCQlpZiAoc2NoZWR1bGVfd29yaygmd2wtPnR4cV90YXNrLndvcmspKSB7Ci0JCQlhdG9taWNfaW5jKCZ3bC0+Y2FsbGJhY2tzKTsKLQkJfSBlbHNlIHsKLQkJCVdMX0VSUk9SKCgid2wlZDogd2xfc3RhcnQvc2NoZWR1bGVfd29yayBmYWlsZWRcbiIsCi0JCQkJICB3bC0+cHViLT51bml0KSk7Ci0JCX0KLQl9Ci0KLQlUWFFfVU5MT0NLKHdsLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLQotfQotCi1zdGF0aWMgdm9pZCB3bF9zdGFydF90eHF3b3JrKHN0cnVjdCB3bF90YXNrICp0YXNrKQotewotCXdsX2luZm9fdCAqd2wgPSAod2xfaW5mb190ICopIHRhc2stPmNvbnRleHQ7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVpbnQgY291bnQgPSAwOwotCi0JV0xfVFJBQ0UoKCJ3bCVkOiB3bF9zdGFydF90eHF3b3JrXG4iLCB3bC0+cHViLT51bml0KSk7Ci0KLQkvKiBGaXJzdCByZW1vdmUgYW4gZW50cnkgdGhlbiBnbyBmb3IgZXhlY3V0aW9uICovCi0JVFhRX0xPQ0sod2wsIGZsYWdzKTsKLQl3aGlsZSAod2wtPnR4cV9oZWFkKSB7Ci0JCXNrYiA9IHdsLT50eHFfaGVhZDsKLQkJd2wtPnR4cV9oZWFkID0gc2tiLT5wcmV2OwotCQlza2ItPnByZXYgPSBOVUxMOwotCQlpZiAod2wtPnR4cV9oZWFkID09IE5VTEwpCi0JCQl3bC0+dHhxX3RhaWwgPSBOVUxMOwotCQlUWFFfVU5MT0NLKHdsLCBmbGFncyk7Ci0KLQkJLyogaXQgaGFzIFdMX0xPQ0svV0xfVU5MT0NLIGluc2lkZSAqLwotCQl3bF9zdGFydF9pbnQod2wsIFdMX1RPX0hXKHdsKSwgc2tiKTsKLQotCQkvKiBib3VuZGVkIG91ciBleGVjdXRpb24sIHJlc2hlZHVsZSBvdXJzZWxmIG5leHQgKi8KLQkJaWYgKCsrY291bnQgPj0gMTApCi0JCQlicmVhazsKLQotCQlUWFFfTE9DSyh3bCwgZmxhZ3MpOwotCX0KLQotCWlmIChjb3VudCA+PSAxMCkgewotCQlpZiAoIXNjaGVkdWxlX3dvcmsoJndsLT50eHFfdGFzay53b3JrKSkgewotCQkJV0xfRVJST1IoKCJ3bCVkOiB3bF9zdGFydC9zY2hlZHVsZV93b3JrIGZhaWxlZFxuIiwKLQkJCQkgIHdsLT5wdWItPnVuaXQpKTsKLQkJCWF0b21pY19kZWMoJndsLT5jYWxsYmFja3MpOwotCQl9Ci0JfSBlbHNlIHsKLQkJd2wtPnR4cV9kaXNwYXRjaGVkID0gZmFsc2U7Ci0JCVRYUV9VTkxPQ0sod2wsIGZsYWdzKTsKLQkJYXRvbWljX2RlYygmd2wtPmNhbGxiYWNrcyk7Ci0JfQotCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCB3bF90eHFfZnJlZSh3bF9pbmZvX3QgKndsKQotewotCXN0cnVjdCBza19idWZmICpza2I7Ci0KLQlpZiAod2wtPnR4cV9oZWFkID09IE5VTEwpIHsKLQkJQVNTRVJUKHdsLT50eHFfdGFpbCA9PSBOVUxMKTsKLQkJcmV0dXJuOwotCX0KLQotCXdoaWxlICh3bC0+dHhxX2hlYWQpIHsKLQkJc2tiID0gd2wtPnR4cV9oZWFkOwotCQl3bC0+dHhxX2hlYWQgPSBza2ItPnByZXY7Ci0JCVBLVEZSRUUod2wtPm9zaCwgc2tiLCB0cnVlKTsKLQl9Ci0KLQl3bC0+dHhxX3RhaWwgPSBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCB3bF9ycGNxX2ZyZWUod2xfaW5mb190ICp3bCkKLXsKLQlycGNfYnVmX3QgKmJ1ZjsKLQotCWlmICh3bC0+cnBjcV9oZWFkID09IE5VTEwpIHsKLQkJQVNTRVJUKHdsLT5ycGNxX3RhaWwgPT0gTlVMTCk7Ci0JCXJldHVybjsKLQl9Ci0KLQl3aGlsZSAod2wtPnJwY3FfaGVhZCkgewotCQlidWYgPSB3bC0+cnBjcV9oZWFkOwotCQl3bC0+cnBjcV9oZWFkID0gYmNtX3JwY19idWZfbmV4dF9nZXQod2wtPnJwY190aCwgYnVmKTsKLQkJYmNtX3JwY19idWZfZnJlZSh3bC0+cnBjX2Rpc3BhdGNoX2N0eC5ycGMsIGJ1Zik7Ci0JfQotCi0Jd2wtPnJwY3FfdGFpbCA9IE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIHdsX3JwY3FfZGlzcGF0Y2goc3RydWN0IHdsX3Rhc2sgKnRhc2spCi17Ci0Jd2xfaW5mb190ICp3bCA9ICh3bF9pbmZvX3QgKikgdGFzay0+Y29udGV4dDsKLQlycGNfYnVmX3QgKmJ1ZjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JLyogRmlyc3QgcmVtb3ZlIGFuIGVudHJ5IHRoZW4gZ28gZm9yIGV4ZWN1dGlvbiAqLwotCVJQQ1FfTE9DSyh3bCwgZmxhZ3MpOwotCXdoaWxlICh3bC0+cnBjcV9oZWFkKSB7Ci0JCWJ1ZiA9IHdsLT5ycGNxX2hlYWQ7Ci0JCXdsLT5ycGNxX2hlYWQgPSBiY21fcnBjX2J1Zl9uZXh0X2dldCh3bC0+cnBjX3RoLCBidWYpOwotCi0JCWlmICh3bC0+cnBjcV9oZWFkID09IE5VTEwpCi0JCQl3bC0+cnBjcV90YWlsID0gTlVMTDsKLQkJUlBDUV9VTkxPQ0sod2wsIGZsYWdzKTsKLQotCQlXTF9MT0NLKHdsKTsKLQkJd2xjX3JwY19oaWdoX2Rpc3BhdGNoKCZ3bC0+cnBjX2Rpc3BhdGNoX2N0eCwgYnVmKTsKLQkJV0xfVU5MT0NLKHdsKTsKLQotCQlSUENRX0xPQ0sod2wsIGZsYWdzKTsKLQl9Ci0KLQl3bC0+cnBjcV9kaXNwYXRjaGVkID0gZmFsc2U7Ci0KLQlSUENRX1VOTE9DSyh3bCwgZmxhZ3MpOwotCi0Ja2ZyZWUodGFzayk7Ci0JYXRvbWljX2RlYygmd2wtPmNhbGxiYWNrcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHdsX3JwY3FfYWRkKHdsX2luZm9fdCAqd2wsIHJwY19idWZfdCAqYnVmKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQliY21fcnBjX2J1Zl9uZXh0X3NldCh3bC0+cnBjX3RoLCBidWYsIE5VTEwpOwotCi0JLyogTG9jayB0aGUgcXVldWUgYXMgdGFza2xldCBjb3VsZCBiZSBydW5uaW5nIGF0IHRoaXMgdGltZSAqLwotCVJQQ1FfTE9DSyh3bCwgZmxhZ3MpOwotCWlmICh3bC0+cnBjcV9oZWFkID09IE5VTEwpCi0JCXdsLT5ycGNxX2hlYWQgPSBidWY7Ci0JZWxzZQotCQliY21fcnBjX2J1Zl9uZXh0X3NldCh3bC0+cnBjX3RoLCB3bC0+cnBjcV90YWlsLCBidWYpOwotCi0Jd2wtPnJwY3FfdGFpbCA9IGJ1ZjsKLQotCWlmICh3bC0+cnBjcV9kaXNwYXRjaGVkID09IGZhbHNlKSB7Ci0JCXdsLT5ycGNxX2Rpc3BhdGNoZWQgPSB0cnVlOwotCQl3bF9zY2hlZHVsZV90YXNrKHdsLCB3bF9ycGNxX2Rpc3BhdGNoLCB3bCk7Ci0JfQotCi0JUlBDUV9VTkxPQ0sod2wsIGZsYWdzKTsKLX0KLQotI2lmIGRlZmluZWQoQkNNREJHKQotc3RhdGljIGNvbnN0IHN0cnVjdCBuYW1lX2VudHJ5IHJwY19uYW1lX3RibFtdID0gUlBDX0lEX1RBQkxFOwotI2VuZGlmCQkJCS8qIEJDTURCRyAqLwotCi0vKiBkb25nbGUtc2lkZSBycGMgZGlzcGF0Y2ggcm91dGluZSAqLwotc3RhdGljIHZvaWQgd2xfcnBjX2Rpc3BhdGNoX3NjaGVkdWxlKHZvaWQgKmN0eCwgc3RydWN0IHJwY19idWYgKmJ1ZikKLXsKLQliY21feGRyX2J1Zl90IGI7Ci0Jd2xfaW5mb190ICp3bCA9ICh3bF9pbmZvX3QgKikgY3R4OwotCXdsY19ycGNfaWRfdCBycGNfaWQ7Ci0JaW50IGVycjsKLQotCWJjbV94ZHJfYnVmX2luaXQoJmIsIGJjbV9ycGNfYnVmX2RhdGEod2wtPnJwY190aCwgYnVmKSwKLQkJCSBiY21fcnBjX2J1Zl9sZW5fZ2V0KHdsLT5ycGNfdGgsIGJ1ZikpOwotCi0JZXJyID0gYmNtX3hkcl91bnBhY2tfdTMyKCZiLCAmcnBjX2lkKTsKLQlBU1NFUlQoIWVycik7Ci0JV0xfVFJBQ0UoKCIlczogRGlzcGF0Y2ggaWQgJXNcbiIsIF9fZnVuY19fLAotCQkgIFdMQ19SUENfSURfTE9PS1VQKHJwY19uYW1lX3RibCwgcnBjX2lkKSkpOwotCi0JLyogSGFuZGxlIGZldyBlbWVyZ2VuY3kgb25lcyAqLwotCXN3aXRjaCAocnBjX2lkKSB7Ci0JZGVmYXVsdDoKLQkJd2xfcnBjcV9hZGQod2wsIGJ1Zik7Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIHZvaWQgd2xfdGltZXJfdGFzayh3bF90YXNrX3QgKnRhc2spCi17Ci0Jd2xfdGltZXJfdCAqdCA9ICh3bF90aW1lcl90ICopIHRhc2stPmNvbnRleHQ7Ci0KLQlfd2xfdGltZXIodCk7Ci0Ja2ZyZWUodGFzayk7Ci0KLQkvKiBUaGlzIGRlYyBpcyBmb3IgdGhlIHRhc2tfc2NoZWR1bGUuIFRoZSB0aW1lciByZWxhdGVkCi0JICogY2FsbGJhY2sgaXMgZGVjcmVtZW50ZWQgaW4gX3dsX3RpbWVyCi0JICovCi0JYXRvbWljX2RlYygmdC0+d2wtPmNhbGxiYWNrcyk7Ci19Ci0jZW5kaWYJCQkJLyogV0xDX0hJR0hfT05MWSAqLwotCi0jaWZuZGVmIFdMQ19ISUdIX09OTFkKIGNoYXIgKndsX2Zpcm13YXJlc1tXTF9NQVhfRlddID0gewogCSJicmNtL2JjbTQzeHgiLAogCU5VTEwKIH07CiAKLSNpZmRlZiBXTENfTE9XCi1pbnQgd2xfdWNvZGVfaW5pdF9idWYod2xfaW5mb190ICp3bCwgdm9pZCAqKnBidWYsIHUzMiBpZHgpCitpbnQgd2xfdWNvZGVfaW5pdF9idWYoc3RydWN0IHdsX2luZm8gKndsLCB2b2lkICoqcGJ1ZiwgdTMyIGlkeCkKIHsKIAlpbnQgaSwgZW50cnk7CiAJY29uc3QgdTggKnBkYXRhOwpAQCAtMjMwMSw3ICsxNzE5LDcgQEAKIAlyZXR1cm4gLTE7CiB9CiAKLWludCB3bF91Y29kZV9pbml0X3VpbnQod2xfaW5mb190ICp3bCwgdTMyICpkYXRhLCB1MzIgaWR4KQoraW50IHdsX3Vjb2RlX2luaXRfdWludChzdHJ1Y3Qgd2xfaW5mbyAqd2wsIHUzMiAqZGF0YSwgdTMyIGlkeCkKIHsKIAlpbnQgaSwgZW50cnk7CiAJY29uc3QgdTggKnBkYXRhOwpAQCAtMjMyMSwyMiArMTczOSwyMSBAQAogCXByaW50ZigiRVJST1I6IHVjb2RlIHRhZzolZCBjYW4gbm90IGJlIGZvdW5kIVxuIiwgaWR4KTsKIAlyZXR1cm4gLTE7CiB9Ci0jZW5kaWYJCQkJLyogV0xDX0xPVyAqLwogCi1zdGF0aWMgaW50IHdsX3JlcXVlc3RfZncod2xfaW5mb190ICp3bCwgc3RydWN0IHBjaV9kZXYgKnBkZXYpCitzdGF0aWMgaW50IHdsX3JlcXVlc3RfZncoc3RydWN0IHdsX2luZm8gKndsLCBzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAlpbnQgc3RhdHVzOwogCXN0cnVjdCBkZXZpY2UgKmRldmljZSA9ICZwZGV2LT5kZXY7CiAJY2hhciBmd19uYW1lWzEwMF07CiAJaW50IGk7CiAKLQliemVybygodm9pZCAqKSZ3bC0+ZncsIHNpemVvZihzdHJ1Y3Qgd2xfZmlybXdhcmUpKTsKKwltZW1zZXQoKHZvaWQgKikmd2wtPmZ3LCAwLCBzaXplb2Yoc3RydWN0IHdsX2Zpcm13YXJlKSk7CiAJZm9yIChpID0gMDsgaSA8IFdMX01BWF9GVzsgaSsrKSB7CiAJCWlmICh3bF9maXJtd2FyZXNbaV0gPT0gTlVMTCkKIAkJCWJyZWFrOwogCQlzcHJpbnRmKGZ3X25hbWUsICIlcy0lZC5mdyIsIHdsX2Zpcm13YXJlc1tpXSwKIAkJCVVDT0RFX0xPQURFUl9BUElfVkVSKTsKLQkJV0xfTk9ORSgoInJlcXVlc3QgZncgJXNcbiIsIGZ3X25hbWUpKTsKKwkJV0xfTk9ORSgicmVxdWVzdCBmdyAlc1xuIiwgZndfbmFtZSk7CiAJCXN0YXR1cyA9IHJlcXVlc3RfZmlybXdhcmUoJndsLT5mdy5md19iaW5baV0sIGZ3X25hbWUsIGRldmljZSk7CiAJCWlmIChzdGF0dXMpIHsKIAkJCXByaW50ZigiJXM6IGZhaWwgdG8gbG9hZCBmaXJtd2FyZSAlc1xuIiwKQEAgLTIzNDQsNyArMTc2MSw3IEBACiAJCQl3bF9yZWxlYXNlX2Z3KHdsKTsKIAkJCXJldHVybiBzdGF0dXM7CiAJCX0KLQkJV0xfTk9ORSgoInJlcXVlc3QgZncgJXNcbiIsIGZ3X25hbWUpKTsKKwkJV0xfTk9ORSgicmVxdWVzdCBmdyAlc1xuIiwgZndfbmFtZSk7CiAJCXNwcmludGYoZndfbmFtZSwgIiVzX2hkci0lZC5mdyIsIHdsX2Zpcm13YXJlc1tpXSwKIAkJCVVDT0RFX0xPQURFUl9BUElfVkVSKTsKIAkJc3RhdHVzID0gcmVxdWVzdF9maXJtd2FyZSgmd2wtPmZ3LmZ3X2hkcltpXSwgZndfbmFtZSwgZGV2aWNlKTsKQEAgLTIzNTYsMjIgKzE3NzMsMTkgQEAKIAkJfQogCQl3bC0+ZncuaGRyX251bV9lbnRyaWVzW2ldID0KIAkJICAgIHdsLT5mdy5md19oZHJbaV0tPnNpemUgLyAoc2l6ZW9mKHN0cnVjdCB3bF9md19oZHIpKTsKLQkJV0xfTk9ORSgoInJlcXVlc3QgZncgJXMgZmluZDogJWQgZW50cmllc1xuIiwgZndfbmFtZSwKLQkJCSB3bC0+ZncuaGRyX251bV9lbnRyaWVzW2ldKSk7CisJCVdMX05PTkUoInJlcXVlc3QgZncgJXMgZmluZDogJWQgZW50cmllc1xuIiwKKwkJCWZ3X25hbWUsIHdsLT5mdy5oZHJfbnVtX2VudHJpZXNbaV0pOwogCX0KIAl3bC0+ZncuZndfY250ID0gaTsKLQl3bF91Y29kZV9kYXRhX2luaXQod2wpOwotCXJldHVybiAwOworCXJldHVybiB3bF91Y29kZV9kYXRhX2luaXQod2wpOwogfQogCi0jaWZkZWYgV0xDX0xPVwogdm9pZCB3bF91Y29kZV9mcmVlX2J1Zih2b2lkICpwKQogewogCWtmcmVlKHApOwogfQotI2VuZGlmCQkJCS8qIFdMQ19MT1cgKi8KIAotc3RhdGljIHZvaWQgd2xfcmVsZWFzZV9mdyh3bF9pbmZvX3QgKndsKQorc3RhdGljIHZvaWQgd2xfcmVsZWFzZV9mdyhzdHJ1Y3Qgd2xfaW5mbyAqd2wpCiB7CiAJaW50IGk7CiAJZm9yIChpID0gMDsgaSA8IFdMX01BWF9GVzsgaSsrKSB7CkBAIC0yMzc5LDQgKzE3OTMsNTQgQEAKIAkJcmVsZWFzZV9maXJtd2FyZSh3bC0+ZncuZndfaGRyW2ldKTsKIAl9CiB9Ci0jZW5kaWYJCQkJLyogV0xDX0hJR0hfT05MWSAqLworCisKKy8qCisgKiBjaGVja3MgdmFsaWRpdHkgb2YgYWxsIGZpcm13YXJlIGltYWdlcyBsb2FkZWQgZnJvbSB1c2VyIHNwYWNlCisgKi8KK2ludCB3bF9jaGVja19maXJtd2FyZXMoc3RydWN0IHdsX2luZm8gKndsKQoreworCWludCBpOworCWludCBlbnRyeTsKKwlpbnQgcmMgPSAwOworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmd19oZHI7CisJc3RydWN0IHdsX2Z3X2hkciAqdWNvZGVfaGRyOworCWZvciAoaSA9IDA7IGkgPCBXTF9NQVhfRlcgJiYgcmMgPT0gMDsgaSsrKSB7CisJCWZ3ID0gIHdsLT5mdy5md19iaW5baV07CisJCWZ3X2hkciA9IHdsLT5mdy5md19oZHJbaV07CisJCWlmIChmdyA9PSBOVUxMICYmIGZ3X2hkciA9PSBOVUxMKSB7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmIChmdyA9PSBOVUxMIHx8IGZ3X2hkciA9PSBOVUxMKSB7CisJCQlXTF9FUlJPUigiJXM6IGludmFsaWQgYmluL2hkciBmd1xuIiwgX19mdW5jX18pOworCQkJcmMgPSAtRUJBREY7CisJCX0gZWxzZSBpZiAoZndfaGRyLT5zaXplICUgc2l6ZW9mKHN0cnVjdCB3bF9md19oZHIpKSB7CisJCQlXTF9FUlJPUigiJXM6IG5vbiBpbnRlZ3JhbCBmdyBoZHIgZmlsZSBzaXplICVkLyV6dVxuIiwKKwkJCQkgX19mdW5jX18sIGZ3X2hkci0+c2l6ZSwKKwkJCQkgc2l6ZW9mKHN0cnVjdCB3bF9md19oZHIpKTsKKwkJCXJjID0gLUVCQURGOworCQl9IGVsc2UgaWYgKGZ3LT5zaXplIDwgTUlOX0ZXX1NJWkUgfHwgZnctPnNpemUgPiBNQVhfRldfU0laRSkgeworCQkJV0xfRVJST1IoIiVzOiBvdXQgb2YgYm91bmRzIGZ3IGZpbGUgc2l6ZSAlZFxuIiwKKwkJCQkgX19mdW5jX18sIGZ3LT5zaXplKTsKKwkJCXJjID0gLUVCQURGOworCQl9IGVsc2UgeworCQkJLyogY2hlY2sgaWYgdWNvZGUgc2VjdGlvbiBvdmVycnVucyBmaXJtd2FyZSBpbWFnZSAqLworCQkJdWNvZGVfaGRyID0gKHN0cnVjdCB3bF9md19oZHIgKilmd19oZHItPmRhdGE7CisJCQlmb3IgKGVudHJ5ID0gMDsgZW50cnkgPCB3bC0+ZncuaGRyX251bV9lbnRyaWVzW2ldICYmIHJjOworCQkJICAgICBlbnRyeSsrLCB1Y29kZV9oZHIrKykgeworCQkJCWlmICh1Y29kZV9oZHItPm9mZnNldCArIHVjb2RlX2hkci0+bGVuID4KKwkJCQkgICAgZnctPnNpemUpIHsKKwkJCQkJV0xfRVJST1IoIiVzOiBjb25mbGljdGluZyBiaW4vaGRyXG4iLAorCQkJCQkJIF9fZnVuY19fKTsKKwkJCQkJcmMgPSAtRUJBREY7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWlmIChyYyA9PSAwICYmIHdsLT5mdy5md19jbnQgIT0gaSkgeworCQlXTF9FUlJPUigiJXM6IGludmFsaWQgZndfY250PSVkXG4iLCBfX2Z1bmNfXywgd2wtPmZ3LmZ3X2NudCk7CisJCXJjID0gLUVCQURGOworCX0KKwlyZXR1cm4gcmM7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsX21hYzgwMjExLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bF9tYWM4MDIxMS5oCmluZGV4IDc4Y2VlNDQuLmJiMzliNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsX21hYzgwMjExLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xfbWFjODAyMTEuaApAQCAtNjAsNTggKzYwLDMyIEBACiB9OwogCiBzdHJ1Y3Qgd2xfaW5mbyB7Ci0Jd2xjX3B1Yl90ICpwdWI7CQkvKiBwb2ludGVyIHRvIHB1YmxpYyB3bGMgc3RhdGUgKi8KKwlzdHJ1Y3Qgd2xjX3B1YiAqcHViOwkJLyogcG9pbnRlciB0byBwdWJsaWMgd2xjIHN0YXRlICovCiAJdm9pZCAqd2xjOwkJLyogcG9pbnRlciB0byBwcml2YXRlIGNvbW1vbiBvcy1pbmRlcGVuZGVudCBkYXRhICovCi0Jb3NsX3QgKm9zaDsJCS8qIHBvaW50ZXIgdG8gb3MgaGFuZGxlciAqLworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwkJLyogcG9pbnRlciB0byBvcyBoYW5kbGVyICovCiAJdTMyIG1hZ2ljOwogCiAJaW50IGlycTsKIAotI2lmZGVmIFdMQ19ISUdIX09OTFkKLQlzdHJ1Y3Qgc2VtYXBob3JlIHNlbTsJLyogdXNlIHNlbWFwaG9yZSB0byBhbGxvdyBzbGVlcCAqLwotI2Vsc2UKIAlzcGlubG9ja190IGxvY2s7CS8qIHBlci1kZXZpY2UgcGVyaW1ldGVyIGxvY2sgKi8KIAlzcGlubG9ja190IGlzcl9sb2NrOwkvKiBwZXItZGV2aWNlIElTUiBzeW5jaHJvbml6YXRpb24gbG9jayAqLwotI2VuZGlmCiAJdWludCBiY21fYnVzdHlwZTsJLyogYnVzIHR5cGUgKi8KIAlib29sIHBpb21vZGU7CQkvKiBzZXQgZnJvbSBpbnNtb2QgYXJndW1lbnQgKi8KIAl2b2lkICpyZWdzdmE7CQkvKiBvcGFxdWUgY2hpcCByZWdpc3RlcnMgdmlydHVhbCBhZGRyZXNzICovCiAJYXRvbWljX3QgY2FsbGJhY2tzOwkvKiAjIG91dHN0YW5kaW5nIGNhbGxiYWNrIGZ1bmN0aW9ucyAqLwogCXN0cnVjdCB3bF90aW1lciAqdGltZXJzOwkvKiB0aW1lciBjbGVhbnVwIHF1ZXVlICovCiAJc3RydWN0IHRhc2tsZXRfc3RydWN0IHRhc2tsZXQ7CS8qIGRwYyB0YXNrbGV0ICovCi0jaWZkZWYgQkNNU0RJTwotCWJjbXNkaF9pbmZvX3QgKnNkaDsJLyogcG9pbnRlciB0byBzZGlvIGJ1cyBoYW5kbGVyICovCi0JdW5zaWduZWQgbG9uZyBmbGFnczsJCS8qIGN1cnJlbnQgaXJxIGZsYWdzICovCi0jZW5kaWYJCQkJLyogQkNNU0RJTyAqLwogCWJvb2wgcmVzY2hlZDsJCS8qIGRwYyBuZWVkcyB0byBiZSBhbmQgaXMgcmVzY2hlZHVsZWQgKi8KICNpZmRlZiBMSU5VWFNUQV9QUwogCXUzMiBwY2lfcHNzdGF0ZVsxNl07CS8qIHBjaSBwcy1zdGF0ZSBzYXZlL3Jlc3RvcmUgKi8KICNlbmRpZgogCS8qIFJQQywgaGFuZGxlLCBsb2NrLCB0eHEsIHdvcmtpdGVtICovCi0jaWZkZWYgV0xDX0hJR0hfT05MWQotCXJwY19pbmZvX3QgKnJwYzsJLyogUlBDIGhhbmRsZSAqLwotCXJwY190cF9pbmZvX3QgKnJwY190aDsJLyogUlBDIHRyYW5zcG9ydCBoYW5kbGUgKi8KLQl3bGNfcnBjX2N0eF90IHJwY19kaXNwYXRjaF9jdHg7Ci0KLQlib29sIHJwY3FfZGlzcGF0Y2hlZDsJLyogQXZvaWQgc2NoZWR1bGluZyBtdWx0aXBsZSB0YXNrcyAqLwotCXNwaW5sb2NrX3QgcnBjcV9sb2NrOwkvKiBMb2NrIGZvciB0aGUgcXVldWUgKi8KLQlycGNfYnVmX3QgKnJwY3FfaGVhZDsJLyogUlBDIFEgKi8KLQlycGNfYnVmX3QgKnJwY3FfdGFpbDsJLyogUG9pbnRzIHRvIHRoZSBsYXN0IGJ1ZiAqLwotCi0JYm9vbCB0eHFfZGlzcGF0Y2hlZDsJLyogQXZvaWQgc2NoZWR1bGluZyBtdWx0aXBsZSB0YXNrcyAqLwotCXNwaW5sb2NrX3QgdHhxX2xvY2s7CS8qIExvY2sgZm9yIHRoZSBxdWV1ZSAqLwotCXN0cnVjdCBza19idWZmICp0eHFfaGVhZDsJLyogVFggUSAqLwotCXN0cnVjdCBza19idWZmICp0eHFfdGFpbDsJLyogUG9pbnRzIHRvIHRoZSBsYXN0IGJ1ZiAqLwotCi0Jd2xfdGFza190IHR4cV90YXNrOwkvKiB3b3JrIHF1ZXVlIGZvciB3bF9zdGFydCgpICovCi0jZW5kaWYJCQkJLyogV0xDX0hJR0hfT05MWSAqLwogCXVpbnQgc3RhdHNfaWQ7CQkvKiB0aGUgY3VycmVudCBzZXQgb2Ygc3RhdHMgKi8KIAkvKiBwaW5nLXBvbmcgc3RhdHMgY291bnRlcnMgdXBkYXRlZCBieSBMaW51eCB3YXRjaGRvZyAqLwogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzX3dhdGNoZG9nWzJdOwogCXN0cnVjdCB3bF9maXJtd2FyZSBmdzsKIH07CiAKLSNpZm5kZWYgV0xDX0hJR0hfT05MWQogI2RlZmluZSBXTF9MT0NLKHdsKQlzcGluX2xvY2tfYmgoJih3bCktPmxvY2spCiAjZGVmaW5lIFdMX1VOTE9DSyh3bCkJc3Bpbl91bmxvY2tfYmgoJih3bCktPmxvY2spCiAKQEAgLTEyMiwxNyArOTYsNiBAQAogLyogbG9ja2luZyB1bmRlciBXTF9MT0NLKCkgdG8gc3luY2hyb25pemUgd2l0aCB3bF9pc3IgKi8KICNkZWZpbmUgSU5UX0xPQ0sod2wsIGZsYWdzKQlzcGluX2xvY2tfaXJxc2F2ZSgmKHdsKS0+aXNyX2xvY2ssIGZsYWdzKQogI2RlZmluZSBJTlRfVU5MT0NLKHdsLCBmbGFncykJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKHdsKS0+aXNyX2xvY2ssIGZsYWdzKQotI2Vsc2UJCQkJLyogQkNNU0RJTyAqLwotCi0jZGVmaW5lIFdMX0xPQ0sod2wpCWRvd24oJih3bCktPnNlbSkKLSNkZWZpbmUgV0xfVU5MT0NLKHdsKQl1cCgmKHdsKS0+c2VtKQotCi0jZGVmaW5lIFdMX0lTUkxPQ0sod2wpCi0jZGVmaW5lIFdMX0lTUlVOTE9DSyh3bCkKLSNlbmRpZgkJCQkvKiBXTENfSElHSF9PTkxZICovCi0KLS8qIGhhbmRsZSBmb3J3YXJkIGRlY2xhcmF0aW9uICovCi10eXBlZGVmIHN0cnVjdCB3bF9pbmZvIHdsX2luZm9fdDsKIAogI2lmbmRlZiBQQ0lfRDAKICNkZWZpbmUgUENJX0QwCQkwCkBAIC0xNDgsMTQgKzExMSw3IEBACiAKIGV4dGVybiBpbnQgX19kZXZpbml0IHdsX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAkJCQkgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOwotZXh0ZXJuIHZvaWQgd2xfZnJlZSh3bF9pbmZvX3QgKndsKTsKK2V4dGVybiB2b2lkIHdsX2ZyZWUoc3RydWN0IHdsX2luZm8gKndsKTsKIGV4dGVybiBpbnQgd2xfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpOwotZXh0ZXJuIGludCB3bF91Y29kZV9kYXRhX2luaXQod2xfaW5mb190ICp3bCk7Ci1leHRlcm4gdm9pZCB3bF91Y29kZV9kYXRhX2ZyZWUodm9pZCk7Ci0jaWZkZWYgV0xDX0xPVwotZXh0ZXJuIHZvaWQgd2xfdWNvZGVfZnJlZV9idWYodm9pZCAqKTsKLWV4dGVybiBpbnQgd2xfdWNvZGVfaW5pdF9idWYod2xfaW5mb190ICp3bCwgdm9pZCAqKnBidWYsIHUzMiBpZHgpOwotZXh0ZXJuIGludCB3bF91Y29kZV9pbml0X3VpbnQod2xfaW5mb190ICp3bCwgdTMyICpkYXRhLCB1MzIgaWR4KTsKLSNlbmRpZgkJCQkvKiBXTENfTE9XICovCiAKICNlbmRpZgkJCQkvKiBfd2xfbWFjODAyMTFfaF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsX3Vjb2RlLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bF91Y29kZS5oCmluZGV4IGExYmEzNzIuLjJhMGY0MDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsX3Vjb2RlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xfdWNvZGUuaApAQCAtMTQsNiArMTQsOSBAQAogICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCisjZGVmaW5lIE1JTl9GV19TSVpFIDQwMDAwCS8qIG1pbmltdW0gZmlybXdhcmUgZmlsZSBzaXplIGluIGJ5dGVzICovCisjZGVmaW5lIE1BWF9GV19TSVpFIDE1MDAwMAorCiB0eXBlZGVmIHN0cnVjdCBkMTFpbml0IHsKIAl1MTYgYWRkcjsKIAl1MTYgc2l6ZTsKQEAgLTM1LDMgKzM4LDEyIEBACiBleHRlcm4gdTMyIGJjbTQzeHhfMjRfbGNuc3o7CiBleHRlcm4gdTMyICpiY200M3h4X2JvbW1ham9yOwogZXh0ZXJuIHUzMiAqYmNtNDN4eF9ib21taW5vcjsKKworZXh0ZXJuIGludCB3bF91Y29kZV9kYXRhX2luaXQoc3RydWN0IHdsX2luZm8gKndsKTsKK2V4dGVybiB2b2lkIHdsX3Vjb2RlX2RhdGFfZnJlZSh2b2lkKTsKKworZXh0ZXJuIGludCB3bF91Y29kZV9pbml0X2J1ZihzdHJ1Y3Qgd2xfaW5mbyAqd2wsIHZvaWQgKipwYnVmLCB1bnNpZ25lZCBpbnQgaWR4KTsKK2V4dGVybiBpbnQgd2xfdWNvZGVfaW5pdF91aW50KHN0cnVjdCB3bF9pbmZvICp3bCwgdW5zaWduZWQgKmRhdGEsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgaWR4KTsKK2V4dGVybiB2b2lkIHdsX3Vjb2RlX2ZyZWVfYnVmKHZvaWQgKik7CitleHRlcm4gaW50ICB3bF9jaGVja19maXJtd2FyZXMoc3RydWN0IHdsX2luZm8gKndsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsX3Vjb2RlX2xvYWRlci5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xfdWNvZGVfbG9hZGVyLmMKaW5kZXggMGI0MWE5Yy4uMjNlMTBmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xfdWNvZGVfbG9hZGVyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xfdWNvZGVfbG9hZGVyLmMKQEAgLTE0LDE3ICsxNCwxMiBAQAogICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCi10eXBlZGVmIHN0cnVjdCB3bF9pbmZvIHdsX2luZm9fdDsKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KICNpbmNsdWRlIDxkMTF1Y29kZV9leHQuaD4KICNpbmNsdWRlIDx3bF91Y29kZS5oPgogCi1leHRlcm4gaW50IHdsX3Vjb2RlX2luaXRfYnVmKHdsX2luZm9fdCAqd2wsIHZvaWQgKipwYnVmLCB1bnNpZ25lZCBpbnQgaWR4KTsKLWV4dGVybiBpbnQgd2xfdWNvZGVfaW5pdF91aW50KHdsX2luZm9fdCAqd2wsIHVuc2lnbmVkICpkYXRhLCB1bnNpZ25lZCBpbnQgaWR4KTsKLWV4dGVybiBpbnQgd2xfdWNvZGVfZGF0YV9pbml0KHdsX2luZm9fdCAqd2wpOwotZXh0ZXJuIHZvaWQgd2xfdWNvZGVfZGF0YV9mcmVlKHZvaWQpOwotZXh0ZXJuIHZvaWQgd2xfdWNvZGVfZnJlZV9idWYodm9pZCAqKTsKKwogCiBkMTFpbml0X3QgKmQxMWxjbjBic2luaXR2YWxzMjQ7CiBkMTFpbml0X3QgKmQxMWxjbjBpbml0dmFsczI0OwpAQCAtNDIsOCArMzcsMTIgQEAKIHUzMiAqYmNtNDN4eF9ib21tYWpvcjsKIHUzMiAqYmNtNDN4eF9ib21taW5vcjsKIAotaW50IHdsX3Vjb2RlX2RhdGFfaW5pdCh3bF9pbmZvX3QgKndsKQoraW50IHdsX3Vjb2RlX2RhdGFfaW5pdChzdHJ1Y3Qgd2xfaW5mbyAqd2wpCiB7CisJaW50IHJjOworCXJjID0gd2xfY2hlY2tfZmlybXdhcmVzKHdsKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CiAJd2xfdWNvZGVfaW5pdF9idWYod2wsICh2b2lkICoqKSZkMTFsY24wYnNpbml0dmFsczI0LAogCQkJICBEMTFMQ04wQlNJTklUVkFMUzI0KTsKIAl3bF91Y29kZV9pbml0X2J1Zih3bCwgKHZvaWQgKiopJmQxMWxjbjBpbml0dmFsczI0LCBEMTFMQ04wSU5JVFZBTFMyNCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfYWxsb2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19hbGxvYy5jCmluZGV4IDJkYzg5ZjkuLjc0NjQzOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19hbGxvYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19hbGxvYy5jCkBAIC0xNywyOCArMTcsMzMgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxiY21kZWZzLmg+CiAjaW5jbHVkZSA8d2xjX2NmZy5oPgotI2luY2x1ZGUgPGxpbnV4dmVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8b3NsLmg+CiAjaW5jbHVkZSA8YmNtdXRpbHMuaD4KICNpbmNsdWRlIDxzaXV0aWxzLmg+CiAjaW5jbHVkZSA8d2xpb2N0bC5oPgogI2luY2x1ZGUgPHdsY19wdWIuaD4KICNpbmNsdWRlIDx3bGNfa2V5Lmg+CisjaW5jbHVkZSA8c2JobmRwaW8uaD4KKyNpbmNsdWRlIDxzYmhuZGRtYS5oPgorI2luY2x1ZGUgPHdsY19ldmVudC5oPgogI2luY2x1ZGUgPHdsY19tYWM4MDIxMS5oPgogI2luY2x1ZGUgPHdsY19hbGxvYy5oPgorI2luY2x1ZGUgPHdsX2RiZy5oPgogCi1zdGF0aWMgd2xjX3B1Yl90ICp3bGNfcHViX21hbGxvYyhvc2xfdCAqb3NoLCB1aW50IHVuaXQsIHVpbnQgKmVyciwKLQkJCQkgdWludCBkZXZpZCk7Ci1zdGF0aWMgdm9pZCB3bGNfcHViX21mcmVlKG9zbF90ICpvc2gsIHdsY19wdWJfdCAqcHViKTsKK3N0YXRpYyBzdHJ1Y3Qgd2xjX3B1YiAqd2xjX3B1Yl9tYWxsb2Moc3RydWN0IG9zbF9pbmZvICpvc2gsIHVpbnQgdW5pdCwKKwkJCQkgICAgICB1aW50ICplcnIsIHVpbnQgZGV2aWQpOworc3RhdGljIHZvaWQgd2xjX3B1Yl9tZnJlZShzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc3RydWN0IHdsY19wdWIgKnB1Yik7CiBzdGF0aWMgdm9pZCB3bGNfdHVuYWJsZXNfaW5pdCh3bGNfdHVuYWJsZXNfdCAqdHVuYWJsZXMsIHVpbnQgZGV2aWQpOwogCi12b2lkICp3bGNfY2FsbG9jKG9zbF90ICpvc2gsIHVpbnQgdW5pdCwgdWludCBzaXplKQordm9pZCAqd2xjX2NhbGxvYyhzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdWludCB1bml0LCB1aW50IHNpemUpCiB7CiAJdm9pZCAqaXRlbTsKIAogCWl0ZW0gPSBremFsbG9jKHNpemUsIEdGUF9BVE9NSUMpOwogCWlmIChpdGVtID09IE5VTEwpCi0JCVdMX0VSUk9SKCgid2wlZDogJXM6IG91dCBvZiBtZW1vcnlcbiIsIHVuaXQsIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCJ3bCVkOiAlczogb3V0IG9mIG1lbW9yeVxuIiwgdW5pdCwgX19mdW5jX18pOwogCXJldHVybiBpdGVtOwogfQogCkBAIC01OCwxOCArNjMsMTQgQEAKIAl0dW5hYmxlcy0+YW1wZHVkYXRhaGl3YXQgPSBXTENfQU1QRFVEQVRBSElXQVQ7CiAJdHVuYWJsZXMtPnJ4Ym5kID0gUlhCTkQ7CiAJdHVuYWJsZXMtPnR4c2JuZCA9IFRYU0JORDsKLSNpZiBkZWZpbmVkKFdMQ19ISUdIX09OTFkpICYmIGRlZmluZWQoTlRYRF9VU0JfNDMxOSkKLQlpZiAoZGV2aWQgPT0gQkNNNDMxOV9DSElQX0lEKSB7Ci0JCXR1bmFibGVzLT5udHhkID0gTlRYRF9VU0JfNDMxOTsKLQl9Ci0jZW5kaWYJCQkJLyogV0xDX0hJR0hfT05MWSAqLwogfQogCi1zdGF0aWMgd2xjX3B1Yl90ICp3bGNfcHViX21hbGxvYyhvc2xfdCAqb3NoLCB1aW50IHVuaXQsIHVpbnQgKmVyciwgdWludCBkZXZpZCkKK3N0YXRpYyBzdHJ1Y3Qgd2xjX3B1YiAqd2xjX3B1Yl9tYWxsb2Moc3RydWN0IG9zbF9pbmZvICpvc2gsIHVpbnQgdW5pdCwKKwkJCQkgICAgICB1aW50ICplcnIsIHVpbnQgZGV2aWQpCiB7Ci0Jd2xjX3B1Yl90ICpwdWI7CisJc3RydWN0IHdsY19wdWIgKnB1YjsKIAotCXB1YiA9ICh3bGNfcHViX3QgKikgd2xjX2NhbGxvYyhvc2gsIHVuaXQsIHNpemVvZih3bGNfcHViX3QpKTsKKwlwdWIgPSAoc3RydWN0IHdsY19wdWIgKikgd2xjX2NhbGxvYyhvc2gsIHVuaXQsIHNpemVvZihzdHJ1Y3Qgd2xjX3B1YikpOwogCWlmIChwdWIgPT0gTlVMTCkgewogCQkqZXJyID0gMTAwMTsKIAkJZ290byBmYWlsOwpAQCAtOTksNyArMTAwLDcgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQgd2xjX3B1Yl9tZnJlZShvc2xfdCAqb3NoLCB3bGNfcHViX3QgKnB1YikKK3N0YXRpYyB2b2lkIHdsY19wdWJfbWZyZWUoc3RydWN0IG9zbF9pbmZvICpvc2gsIHN0cnVjdCB3bGNfcHViICpwdWIpCiB7CiAJaWYgKHB1YiA9PSBOVUxMKQogCQlyZXR1cm47CkBAIC0xMTQsNyArMTE1LDcgQEAKIAlrZnJlZShwdWIpOwogfQogCi13bGNfYnNzY2ZnX3QgKndsY19ic3NjZmdfbWFsbG9jKG9zbF90ICpvc2gsIHVpbnQgdW5pdCkKK3dsY19ic3NjZmdfdCAqd2xjX2Jzc2NmZ19tYWxsb2Moc3RydWN0IG9zbF9pbmZvICpvc2gsIHVpbnQgdW5pdCkKIHsKIAl3bGNfYnNzY2ZnX3QgKmNmZzsKIApAQCAtMTM0LDcgKzEzNSw3IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgd2xjX2Jzc2NmZ19tZnJlZShvc2xfdCAqb3NoLCB3bGNfYnNzY2ZnX3QgKmNmZykKK3ZvaWQgd2xjX2Jzc2NmZ19tZnJlZShzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgd2xjX2Jzc2NmZ190ICpjZmcpCiB7CiAJaWYgKGNmZyA9PSBOVUxMKQogCQlyZXR1cm47CkBAIC0xNTUsNyArMTU2LDcgQEAKIAlrZnJlZShjZmcpOwogfQogCi12b2lkIHdsY19ic3NjZmdfSURfYXNzaWduKHdsY19pbmZvX3QgKndsYywgd2xjX2Jzc2NmZ190ICpic3NjZmcpCit2b2lkIHdsY19ic3NjZmdfSURfYXNzaWduKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB3bGNfYnNzY2ZnX3QgKmJzc2NmZykKIHsKIAlic3NjZmctPklEID0gd2xjLT5uZXh0X2Jzc2NmZ19JRDsKIAl3bGMtPm5leHRfYnNzY2ZnX0lEKys7CkBAIC0xNjQsMTEgKzE2NSwxMyBAQAogLyoKICAqIFRoZSBjb21tb24gZHJpdmVyIGVudHJ5IHJvdXRpbmUuIEVycm9yIGNvZGVzIHNob3VsZCBiZSB1bmlxdWUKICAqLwotd2xjX2luZm9fdCAqd2xjX2F0dGFjaF9tYWxsb2Mob3NsX3QgKm9zaCwgdWludCB1bml0LCB1aW50ICplcnIsIHVpbnQgZGV2aWQpCitzdHJ1Y3Qgd2xjX2luZm8gKndsY19hdHRhY2hfbWFsbG9jKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB1aW50IHVuaXQsIHVpbnQgKmVyciwKKwkJCSAgICAgIHVpbnQgZGV2aWQpCiB7Ci0Jd2xjX2luZm9fdCAqd2xjOworCXN0cnVjdCB3bGNfaW5mbyAqd2xjOwogCi0Jd2xjID0gKHdsY19pbmZvX3QgKikgd2xjX2NhbGxvYyhvc2gsIHVuaXQsIHNpemVvZih3bGNfaW5mb190KSk7CisJd2xjID0gKHN0cnVjdCB3bGNfaW5mbyAqKSB3bGNfY2FsbG9jKG9zaCwgdW5pdCwKKwkJCQkJICAgICBzaXplb2Yoc3RydWN0IHdsY19pbmZvKSk7CiAJaWYgKHdsYyA9PSBOVUxMKSB7CiAJCSplcnIgPSAxMDAyOwogCQlnb3RvIGZhaWw7CkBAIC0xNzYsNyArMTc5LDcgQEAKIAogCXdsYy0+aHdyeG9mZiA9IFdMX0hXUlhPRkY7CiAKLQkvKiBhbGxvY2F0ZSB3bGNfcHViX3Qgc3RhdGUgc3RydWN0dXJlICovCisJLyogYWxsb2NhdGUgc3RydWN0IHdsY19wdWIgc3RhdGUgc3RydWN0dXJlICovCiAJd2xjLT5wdWIgPSB3bGNfcHViX21hbGxvYyhvc2gsIHVuaXQsIGVyciwgZGV2aWQpOwogCWlmICh3bGMtPnB1YiA9PSBOVUxMKSB7CiAJCSplcnIgPSAxMDAzOwpAQCAtMTg0LDE3ICsxODcsMTYgQEAKIAl9CiAJd2xjLT5wdWItPndsYyA9IHdsYzsKIAotCS8qIGFsbG9jYXRlIHdsY19od19pbmZvX3Qgc3RhdGUgc3RydWN0dXJlICovCisJLyogYWxsb2NhdGUgc3RydWN0IHdsY19od19pbmZvIHN0YXRlIHN0cnVjdHVyZSAqLwogCi0Jd2xjLT5odyA9ICh3bGNfaHdfaW5mb190ICopd2xjX2NhbGxvYyhvc2gsIHVuaXQsCi0JCXNpemVvZih3bGNfaHdfaW5mb190KSk7CisJd2xjLT5odyA9IChzdHJ1Y3Qgd2xjX2h3X2luZm8gKil3bGNfY2FsbG9jKG9zaCwgdW5pdCwKKwkJc2l6ZW9mKHN0cnVjdCB3bGNfaHdfaW5mbykpOwogCWlmICh3bGMtPmh3ID09IE5VTEwpIHsKIAkJKmVyciA9IDEwMDU7CiAJCWdvdG8gZmFpbDsKIAl9CiAJd2xjLT5ody0+d2xjID0gd2xjOwogCi0jaWZkZWYgV0xDX0xPVwogCXdsYy0+aHctPmJhbmRzdGF0ZVswXSA9ICh3bGNfaHdiYW5kX3QgKil3bGNfY2FsbG9jKG9zaCwgdW5pdCwKIAkJKHNpemVvZih3bGNfaHdiYW5kX3QpICogTUFYQkFORFMpKTsKIAlpZiAod2xjLT5ody0+YmFuZHN0YXRlWzBdID09IE5VTEwpIHsKQEAgLTIwOSw3ICsyMTEsNiBAQAogCQkJICAgICAoc2l6ZW9mKHdsY19od2JhbmRfdCkgKiBpKSk7CiAJCX0KIAl9Ci0jZW5kaWYJCQkJLyogV0xDX0xPVyAqLwogCiAJd2xjLT5tb2R1bGVjYiA9IChtb2R1bGVjYl90ICopd2xjX2NhbGxvYyhvc2gsIHVuaXQsCiAJCXNpemVvZihtb2R1bGVjYl90KSAqIFdMQ19NQVhNT0RVTEVTKTsKQEAgLTI2Niw4ICsyNjcsOCBAQAogCQlnb3RvIGZhaWw7CiAJfQogCi0Jd2xjLT5iYW5kc3RhdGVbMF0gPSAod2xjYmFuZF90ICopd2xjX2NhbGxvYyhvc2gsIHVuaXQsCi0JCQkJKHNpemVvZih3bGNiYW5kX3QpICogTUFYQkFORFMpKTsKKwl3bGMtPmJhbmRzdGF0ZVswXSA9IChzdHJ1Y3Qgd2xjYmFuZCAqKXdsY19jYWxsb2Mob3NoLCB1bml0LAorCQkJCShzaXplb2Yoc3RydWN0IHdsY2JhbmQpKk1BWEJBTkRTKSk7CiAJaWYgKHdsYy0+YmFuZHN0YXRlWzBdID09IE5VTEwpIHsKIAkJKmVyciA9IDEwMjU7CiAJCWdvdG8gZmFpbDsKQEAgLTI3NiwxMiArMjc3LDEzIEBACiAKIAkJZm9yIChpID0gMTsgaSA8IE1BWEJBTkRTOyBpKyspIHsKIAkJCXdsYy0+YmFuZHN0YXRlW2ldID0KLQkJCSAgICAod2xjYmFuZF90ICopICgodW5zaWduZWQgbG9uZyl3bGMtPmJhbmRzdGF0ZVswXSArCi0JCQkJCSAgIChzaXplb2Yod2xjYmFuZF90KSAqIGkpKTsKKwkJCSAgICAoc3RydWN0IHdsY2JhbmQgKikgKCh1bnNpZ25lZCBsb25nKXdsYy0+YmFuZHN0YXRlWzBdCisJCQkgICAgKyAoc2l6ZW9mKHN0cnVjdCB3bGNiYW5kKSppKSk7CiAJCX0KIAl9CiAKLQl3bGMtPmNvcmVzdGF0ZSA9ICh3bGNjb3JlX3QgKil3bGNfY2FsbG9jKG9zaCwgdW5pdCwgc2l6ZW9mKHdsY2NvcmVfdCkpOworCXdsYy0+Y29yZXN0YXRlID0gKHN0cnVjdCB3bGNjb3JlICopd2xjX2NhbGxvYyhvc2gsIHVuaXQsCisJCQkJCQkgICAgICBzaXplb2Yoc3RydWN0IHdsY2NvcmUpKTsKIAlpZiAod2xjLT5jb3Jlc3RhdGUgPT0gTlVMTCkgewogCQkqZXJyID0gMTAyNjsKIAkJZ290byBmYWlsOwpAQCAtMzAxLDcgKzMwMyw3IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgd2xjX2RldGFjaF9tZnJlZSh3bGNfaW5mb190ICp3bGMsIG9zbF90ICpvc2gpCit2b2lkIHdsY19kZXRhY2hfbWZyZWUoc3RydWN0IHdsY19pbmZvICp3bGMsIHN0cnVjdCBvc2xfaW5mbyAqb3NoKQogewogCWlmICh3bGMgPT0gTlVMTCkKIAkJcmV0dXJuOwpAQCAtMzU1LDEyICszNTcsMTAgQEAKIAl9CiAKIAlpZiAod2xjLT5odykgewotI2lmZGVmIFdMQ19MT1cKIAkJaWYgKHdsYy0+aHctPmJhbmRzdGF0ZVswXSkgewogCQkJa2ZyZWUod2xjLT5ody0+YmFuZHN0YXRlWzBdKTsKIAkJCXdsYy0+aHctPmJhbmRzdGF0ZVswXSA9IE5VTEw7CiAJCX0KLSNlbmRpZgogCiAJCS8qIGZyZWUgaHcgc3RydWN0ICovCiAJCWtmcmVlKHdsYy0+aHcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2FsbG9jLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfYWxsb2MuaAppbmRleCA2NzhhMmI5Li5hYzM0Zjc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfYWxsb2MuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfYWxsb2MuaApAQCAtMTQsMTIgKzE0LDEyIEBACiAgKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogICovCiAKLWV4dGVybiB2b2lkICp3bGNfY2FsbG9jKG9zbF90ICpvc2gsIHVpbnQgdW5pdCwgdWludCBzaXplKTsKK2V4dGVybiB2b2lkICp3bGNfY2FsbG9jKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB1aW50IHVuaXQsIHVpbnQgc2l6ZSk7CiAKLWV4dGVybiB3bGNfaW5mb190ICp3bGNfYXR0YWNoX21hbGxvYyhvc2xfdCAqb3NoLCB1aW50IHVuaXQsIHVpbnQgKmVyciwKLQkJCQkgICAgIHVpbnQgZGV2aWQpOwotZXh0ZXJuIHZvaWQgd2xjX2RldGFjaF9tZnJlZSh3bGNfaW5mb190ICp3bGMsIG9zbF90ICpvc2gpOworZXh0ZXJuIHN0cnVjdCB3bGNfaW5mbyAqd2xjX2F0dGFjaF9tYWxsb2Moc3RydWN0IG9zbF9pbmZvICpvc2gsIHVpbnQgdW5pdCwKKwkJCQkJICB1aW50ICplcnIsIHVpbnQgZGV2aWQpOworZXh0ZXJuIHZvaWQgd2xjX2RldGFjaF9tZnJlZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgc3RydWN0IG9zbF9pbmZvICpvc2gpOwogCiBzdHJ1Y3Qgd2xjX2Jzc2NmZzsKLWV4dGVybiBzdHJ1Y3Qgd2xjX2Jzc2NmZyAqd2xjX2Jzc2NmZ19tYWxsb2Mob3NsX3QgKm9zaCwgdWludCB1bml0KTsKLWV4dGVybiB2b2lkIHdsY19ic3NjZmdfbWZyZWUob3NsX3QgKm9zaCwgc3RydWN0IHdsY19ic3NjZmcgKmNmZyk7CitleHRlcm4gc3RydWN0IHdsY19ic3NjZmcgKndsY19ic3NjZmdfbWFsbG9jKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB1aW50IHVuaXQpOworZXh0ZXJuIHZvaWQgd2xjX2Jzc2NmZ19tZnJlZShzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc3RydWN0IHdsY19ic3NjZmcgKmNmZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfYW1wZHUuYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19hbXBkdS5jCmluZGV4IGE0ZTQ5ZjMuLmQ3NDk5MTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19hbXBkdS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19hbXBkdS5jCkBAIC0xNiwxOSArMTYsMTkgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDx3bGNfY2ZnLmg+CiAjaW5jbHVkZSA8YmNtZGVmcy5oPgotI2luY2x1ZGUgPGxpbnV4dmVyLmg+Ci0jaW5jbHVkZSA8YmNtZGVmcy5oPgogI2luY2x1ZGUgPG9zbC5oPgogI2luY2x1ZGUgPGJjbXV0aWxzLmg+CiAjaW5jbHVkZSA8c2l1dGlscy5oPgogI2luY2x1ZGUgPGJjbWVuZGlhbi5oPgogI2luY2x1ZGUgPHdsaW9jdGwuaD4KKyNpbmNsdWRlIDxzYmhuZHBpby5oPgogI2luY2x1ZGUgPHNiaG5kZG1hLmg+CiAjaW5jbHVkZSA8aG5kZG1hLmg+CiAjaW5jbHVkZSA8ZDExLmg+CiAjaW5jbHVkZSA8d2xjX3JhdGUuaD4KICNpbmNsdWRlIDx3bGNfcHViLmg+CiAjaW5jbHVkZSA8d2xjX2tleS5oPgorI2luY2x1ZGUgPHdsY19ldmVudC5oPgogI2luY2x1ZGUgPHdsY19tYWM4MDIxMS5oPgogI2luY2x1ZGUgPHdsY19waHlfaGFsLmg+CiAjaW5jbHVkZSA8d2xjX2FudHNlbC5oPgpAQCAtMzYsMTEgKzM2LDggQEAKICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KICNpbmNsdWRlIDx3bGNfYW1wZHUuaD4KICNpbmNsdWRlIDx3bF9leHBvcnQuaD4KKyNpbmNsdWRlIDx3bF9kYmcuaD4KIAotI2lmZGVmIFdMQ19ISUdIX09OTFkKLSNpbmNsdWRlIDxiY21fcnBjX3RwLmg+Ci0jaW5jbHVkZSA8d2xjX3JwY3R4Lmg+Ci0jZW5kaWYKIAogI2RlZmluZSBBTVBEVV9NQVhfTVBEVQkJMzIJLyogbWF4IG51bWJlciBvZiBtcGR1cyBpbiBhbiBhbXBkdSAqLwogI2RlZmluZSBBTVBEVV9OVU1fTVBEVV9MRUdBQ1kJMTYJLyogbWF4IG51bWJlciBvZiBtcGR1cyBpbiBhbiBhbXBkdSB0byBhIGxlZ2FjeSAqLwpAQCAtMTAxLDcgKzk4LDcgQEAKIAogLyogQU1QRFUgbW9kdWxlIHNwZWNpZmljIHN0YXRlICovCiBzdHJ1Y3QgYW1wZHVfaW5mbyB7Ci0Jd2xjX2luZm9fdCAqd2xjOwkvKiBwb2ludGVyIHRvIG1haW4gd2xjIHN0cnVjdHVyZSAqLworCXN0cnVjdCB3bGNfaW5mbyAqd2xjOwkvKiBwb2ludGVyIHRvIG1haW4gd2xjIHN0cnVjdHVyZSAqLwogCWludCBzY2JfaGFuZGxlOwkJLyogc2NiIGN1YmJ5IGhhbmRsZSB0byByZXRyaWV2ZSBkYXRhIGZyb20gc2NiICovCiAJdTggaW5pX2VuYWJsZVtBTVBEVV9NQVhfU0NCX1RJRF07CS8qIHBlci10aWQgaW5pdGlhdG9yIGVuYWJsZS9kaXNhYmxlIG9mIGFtcGR1ICovCiAJdTggYmFfdHhfd3NpemU7CS8qIFR4IGJhIHdpbmRvdyBzaXplIChpbiBwZHUpICovCkBAIC0xMjUsMTEgKzEyMiw2IEBACiAJCQkJICovCiAJd2xjX2ZpZm9faW5mb190IGZpZm9fdGJbTlVNX0ZGUExEX0ZJRk9dOwkvKiB0YWJsZSBvZiBmaWZvIGluZm9zICAqLwogCi0jaWZkZWYgV0xDX0hJR0hfT05MWQotCXZvaWQgKnA7Ci0JdHhfc3RhdHVzX3QgdHhzOwotCWJvb2wgd2FpdGluZ19zdGF0dXM7CS8qIFRvIGhlbHAgc2FuaXR5IGNoZWNrcyAqLwotI2VuZGlmCiB9OwogCiAjZGVmaW5lIEFNUERVX0NMRUFOVVBGTEFHX1JYICAgKDB4MSkKQEAgLTEzOCwzOCArMTMwLDM5IEBACiAjZGVmaW5lIFNDQl9BTVBEVV9DVUJCWShhbXBkdSwgc2NiKSAoJihzY2ItPnNjYl9hbXBkdSkpCiAjZGVmaW5lIFNDQl9BTVBEVV9JTkkoc2NiX2FtcGR1LCB0aWQpICgmKHNjYl9hbXBkdS0+aW5pW3RpZF0pKQogCi1zdGF0aWMgdm9pZCB3bGNfZmZwbGRfaW5pdChhbXBkdV9pbmZvX3QgKmFtcGR1KTsKLXN0YXRpYyBpbnQgd2xjX2ZmcGxkX2NoZWNrX3R4ZnVuZmwod2xjX2luZm9fdCAqd2xjLCBpbnQgZik7Ci1zdGF0aWMgdm9pZCB3bGNfZmZwbGRfY2FsY19tY3MyYW1wZHVfdGFibGUoYW1wZHVfaW5mb190ICphbXBkdSwgaW50IGYpOworc3RhdGljIHZvaWQgd2xjX2ZmcGxkX2luaXQoc3RydWN0IGFtcGR1X2luZm8gKmFtcGR1KTsKK3N0YXRpYyBpbnQgd2xjX2ZmcGxkX2NoZWNrX3R4ZnVuZmwoc3RydWN0IHdsY19pbmZvICp3bGMsIGludCBmKTsKK3N0YXRpYyB2b2lkIHdsY19mZnBsZF9jYWxjX21jczJhbXBkdV90YWJsZShzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUsIGludCBmKTsKIAotc3RhdGljIHNjYl9hbXBkdV90aWRfaW5pX3QgKndsY19hbXBkdV9pbml0X3RpZF9pbmkoYW1wZHVfaW5mb190ICphbXBkdSwKK3N0YXRpYyBzY2JfYW1wZHVfdGlkX2luaV90ICp3bGNfYW1wZHVfaW5pdF90aWRfaW5pKHN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSwKIAkJCQkJCSAgIHNjYl9hbXBkdV90ICpzY2JfYW1wZHUsCiAJCQkJCQkgICB1OCB0aWQsIGJvb2wgb3ZlcnJpZGUpOwotc3RhdGljIHZvaWQgYW1wZHVfY2xlYW51cF90aWRfaW5pKGFtcGR1X2luZm9fdCAqYW1wZHUsIHNjYl9hbXBkdV90ICpzY2JfYW1wZHUsCitzdGF0aWMgdm9pZCBhbXBkdV9jbGVhbnVwX3RpZF9pbmkoc3RydWN0IGFtcGR1X2luZm8gKmFtcGR1LAorCQkJCSAgc2NiX2FtcGR1X3QgKnNjYl9hbXBkdSwKIAkJCQkgIHU4IHRpZCwgYm9vbCBmb3JjZSk7Ci1zdGF0aWMgdm9pZCBhbXBkdV91cGRhdGVfbWF4X3R4bGVuKGFtcGR1X2luZm9fdCAqYW1wZHUsIHU4IGR1cik7Ci1zdGF0aWMgdm9pZCBzY2JfYW1wZHVfdXBkYXRlX2NvbmZpZyhhbXBkdV9pbmZvX3QgKmFtcGR1LCBzdHJ1Y3Qgc2NiICpzY2IpOwotc3RhdGljIHZvaWQgc2NiX2FtcGR1X3VwZGF0ZV9jb25maWdfYWxsKGFtcGR1X2luZm9fdCAqYW1wZHUpOworc3RhdGljIHZvaWQgYW1wZHVfdXBkYXRlX21heF90eGxlbihzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUsIHU4IGR1cik7CitzdGF0aWMgdm9pZCBzY2JfYW1wZHVfdXBkYXRlX2NvbmZpZyhzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUsIHN0cnVjdCBzY2IgKnNjYik7CitzdGF0aWMgdm9pZCBzY2JfYW1wZHVfdXBkYXRlX2NvbmZpZ19hbGwoc3RydWN0IGFtcGR1X2luZm8gKmFtcGR1KTsKIAogI2RlZmluZSB3bGNfYW1wZHVfdHhmbG93Y29udHJvbChhLCBiLCBjKQlkbyB7fSB3aGlsZSAoMCkKIAotc3RhdGljIHZvaWQgd2xjX2FtcGR1X2RvdHhzdGF0dXNfY29tcGxldGUoYW1wZHVfaW5mb190ICphbXBkdSwgc3RydWN0IHNjYiAqc2NiLAotCQkJCQkgIHZvaWQgKnAsIHR4X3N0YXR1c190ICp0eHMsCi0JCQkJCSAgdTMyIGZybXR4c3RhdHVzLAotCQkJCQkgIHUzMiBmcm10eHN0YXR1czIpOworc3RhdGljIHZvaWQgd2xjX2FtcGR1X2RvdHhzdGF0dXNfY29tcGxldGUoc3RydWN0IGFtcGR1X2luZm8gKmFtcGR1LAorCQkJCQkgIHN0cnVjdCBzY2IgKnNjYiwKKwkJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqcCwgdHhfc3RhdHVzX3QgKnR4cywKKwkJCQkJICB1MzIgZnJtdHhzdGF0dXMsIHUzMiBmcm10eHN0YXR1czIpOwogCi1zdGF0aWMgaW5saW5lIHUxNiBwa3RfdHhoX3NlcW51bSh3bGNfaW5mb190ICp3bGMsIHZvaWQgKnApCitzdGF0aWMgaW5saW5lIHUxNiBwa3RfdHhoX3NlcW51bShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgc3RydWN0IHNrX2J1ZmYgKnApCiB7CiAJZDExdHhoX3QgKnR4aDsKIAlzdHJ1Y3QgZG90MTFfaGVhZGVyICpoOwotCXR4aCA9IChkMTF0eGhfdCAqKSBQS1REQVRBKHApOworCXR4aCA9IChkMTF0eGhfdCAqKSBwLT5kYXRhOwogCWggPSAoc3RydWN0IGRvdDExX2hlYWRlciAqKSgodTggKikgKHR4aCArIDEpICsgRDExX1BIWV9IRFJfTEVOKTsKIAlyZXR1cm4gbHRvaDE2KGgtPnNlcSkgPj4gU0VRTlVNX1NISUZUOwogfQogCi1hbXBkdV9pbmZvX3QgKndsY19hbXBkdV9hdHRhY2god2xjX2luZm9fdCAqd2xjKQorc3RydWN0IGFtcGR1X2luZm8gKndsY19hbXBkdV9hdHRhY2goc3RydWN0IHdsY19pbmZvICp3bGMpCiB7Ci0JYW1wZHVfaW5mb190ICphbXBkdTsKKwlzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHU7CiAJaW50IGk7CiAKIAkvKiBzb21lIGNvZGUgZGVwZW5kcyBvbiBwYWNrZWQgc3RydWN0dXJlcyAqLwpAQCAtMTc5LDkgKzE3MiwxMCBAQAogCUFTU0VSVCh3bGMtPnB1Yi0+dHVuYWJsZXMtPmFtcGR1bnVtbXBkdSA8PSBBTVBEVV9NQVhfTVBEVSk7CiAJQVNTRVJUKHdsYy0+cHViLT50dW5hYmxlcy0+YW1wZHVudW1tcGR1ID4gMCk7CiAKLQlhbXBkdSA9IGt6YWxsb2Moc2l6ZW9mKGFtcGR1X2luZm9fdCksIEdGUF9BVE9NSUMpOworCWFtcGR1ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFtcGR1X2luZm8pLCBHRlBfQVRPTUlDKTsKIAlpZiAoIWFtcGR1KSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogd2xjX2FtcGR1X2F0dGFjaDogb3V0IG9mIG1lbVxuIiwgd2xjLT5wdWItPnVuaXQpKTsKKwkJV0xfRVJST1IoIndsJWQ6IHdsY19hbXBkdV9hdHRhY2g6IG91dCBvZiBtZW1cbiIsCisJCQkgd2xjLT5wdWItPnVuaXQpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJYW1wZHUtPndsYyA9IHdsYzsKQEAgLTIwOSwxMCArMjAzLDYgQEAKIAkJYW1wZHUtPnJ4X2ZhY3RvciA9IEFNUERVX1JYX0ZBQ1RPUl8zMks7CiAJZWxzZQogCQlhbXBkdS0+cnhfZmFjdG9yID0gQU1QRFVfUlhfRkFDVE9SXzY0SzsKLSNpZmRlZiBXTENfSElHSF9PTkxZCi0JLyogUmVzdHJpY3QgdG8gc21hbGxlciByY3Ygc2l6ZSBmb3IgQk1BQyBkb25nbGUgKi8KLQlhbXBkdS0+cnhfZmFjdG9yID0gQU1QRFVfUlhfRkFDVE9SXzMySzsKLSNlbmRpZgogCWFtcGR1LT5yZXRyeV9saW1pdCA9IEFNUERVX0RFRl9SRVRSWV9MSU1JVDsKIAlhbXBkdS0+cnJfcmV0cnlfbGltaXQgPSBBTVBEVV9ERUZfUlJfUkVUUllfTElNSVQ7CiAKQEAgLTIzMiw3ICsyMjIsNyBAQAogCXJldHVybiBhbXBkdTsKIH0KIAotdm9pZCB3bGNfYW1wZHVfZGV0YWNoKGFtcGR1X2luZm9fdCAqYW1wZHUpCit2b2lkIHdsY19hbXBkdV9kZXRhY2goc3RydWN0IGFtcGR1X2luZm8gKmFtcGR1KQogewogCWludCBpOwogCkBAIC0yNTAsMTIgKzI0MCwxMiBAQAogCWtmcmVlKGFtcGR1KTsKIH0KIAotdm9pZCBzY2JfYW1wZHVfY2xlYW51cChhbXBkdV9pbmZvX3QgKmFtcGR1LCBzdHJ1Y3Qgc2NiICpzY2IpCit2b2lkIHNjYl9hbXBkdV9jbGVhbnVwKHN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSwgc3RydWN0IHNjYiAqc2NiKQogewogCXNjYl9hbXBkdV90ICpzY2JfYW1wZHUgPSBTQ0JfQU1QRFVfQ1VCQlkoYW1wZHUsIHNjYik7CiAJdTggdGlkOwogCi0JV0xfQU1QRFVfVVBETigoInNjYl9hbXBkdV9jbGVhbnVwOiBlbnRlclxuIikpOworCVdMX0FNUERVX1VQRE4oInNjYl9hbXBkdV9jbGVhbnVwOiBlbnRlclxuIik7CiAJQVNTRVJUKHNjYl9hbXBkdSk7CiAKIAlmb3IgKHRpZCA9IDA7IHRpZCA8IEFNUERVX01BWF9TQ0JfVElEOyB0aWQrKykgewpAQCAtMjY2LDEyICsyNTYsMTIgQEAKIC8qIHJlc2V0IHRoZSBhbXBkdSBzdGF0ZSBtYWNoaW5lIHNvIHRoYXQgaXQgY2FuIGdyYWNlZnVsbHkgaGFuZGxlIHBhY2tldHMgdGhhdCB3ZXJlCiAgKiBmcmVlZCBmcm9tIHRoZSBkbWEgYW5kIHR4IHF1ZXVlcyBkdXJpbmcgcmVpbml0CiAgKi8KLXZvaWQgd2xjX2FtcGR1X3Jlc2V0KGFtcGR1X2luZm9fdCAqYW1wZHUpCit2b2lkIHdsY19hbXBkdV9yZXNldChzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUpCiB7Ci0JV0xfTk9ORSgoIiVzOiBFbnRlcmluZ1xuIiwgX19mdW5jX18pKTsKKwlXTF9OT05FKCIlczogRW50ZXJpbmdcbiIsIF9fZnVuY19fKTsKIH0KIAotc3RhdGljIHZvaWQgc2NiX2FtcGR1X3VwZGF0ZV9jb25maWcoYW1wZHVfaW5mb190ICphbXBkdSwgc3RydWN0IHNjYiAqc2NiKQorc3RhdGljIHZvaWQgc2NiX2FtcGR1X3VwZGF0ZV9jb25maWcoc3RydWN0IGFtcGR1X2luZm8gKmFtcGR1LCBzdHJ1Y3Qgc2NiICpzY2IpCiB7CiAJc2NiX2FtcGR1X3QgKnNjYl9hbXBkdSA9IFNDQl9BTVBEVV9DVUJCWShhbXBkdSwgc2NiKTsKIAlpbnQgaTsKQEAgLTMwMSwxMiArMjkxLDEyIEBACiAJQVNTRVJUKHNjYl9hbXBkdS0+cmVsZWFzZSk7CiB9CiAKLXZvaWQgc2NiX2FtcGR1X3VwZGF0ZV9jb25maWdfYWxsKGFtcGR1X2luZm9fdCAqYW1wZHUpCit2b2lkIHNjYl9hbXBkdV91cGRhdGVfY29uZmlnX2FsbChzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUpCiB7CiAJc2NiX2FtcGR1X3VwZGF0ZV9jb25maWcoYW1wZHUsIGFtcGR1LT53bGMtPnB1Yi0+Z2xvYmFsX3NjYik7CiB9CiAKLXN0YXRpYyB2b2lkIHdsY19mZnBsZF9pbml0KGFtcGR1X2luZm9fdCAqYW1wZHUpCitzdGF0aWMgdm9pZCB3bGNfZmZwbGRfaW5pdChzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUpCiB7CiAJaW50IGksIGo7CiAJd2xjX2ZpZm9faW5mb190ICpmaWZvOwpAQCAtMzMwLDkgKzMyMCw5IEBACiAgKiBSZXR1cm4gMSBpZiBwcmUtbG9hZGluZyBub3QgYWN0aXZlLCAtMSBpZiBub3QgYW4gdW5kZXJmbG93IGV2ZW50LAogICogMCBpZiBwcmUtbG9hZGluZyBtb2R1bGUgdG9vayBjYXJlIG9mIHRoZSBldmVudC4KICAqLwotc3RhdGljIGludCB3bGNfZmZwbGRfY2hlY2tfdHhmdW5mbCh3bGNfaW5mb190ICp3bGMsIGludCBmaWQpCitzdGF0aWMgaW50IHdsY19mZnBsZF9jaGVja190eGZ1bmZsKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBpbnQgZmlkKQogewotCWFtcGR1X2luZm9fdCAqYW1wZHUgPSB3bGMtPmFtcGR1OworCXN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSA9IHdsYy0+YW1wZHU7CiAJdTMyIHBoeV9yYXRlID0gTUNTX1JBVEUoRkZQTERfTUFYX01DUywgdHJ1ZSwgZmFsc2UpOwogCXUzMiB0eHVuZmxfcmF0aW87CiAJdTggbWF4X21wZHU7CkBAIC0zNDksNyArMzM5LDcgQEAKIAkJCSBNX1VDT0RFX01BQ1NUQVQgKyBvZmZzZXRvZihtYWNzdGF0X3QsIHR4ZnVuZmxbZmlkXSkpOwogCW5ld190eHVuZmwgPSAodTE2KSAoY3VyX3R4dW5mbCAtIGZpZm8tPnByZXZfdHhmdW5mbCk7CiAJaWYgKG5ld190eHVuZmwgPT0gMCkgewotCQlXTF9GRlBMRCgoImNoZWNrX3R4dW5mbCA6IFRYIHN0YXR1cyBGUkFHIHNldCBidXQgbm8gdHggdW5kZXJmbG93c1xuIikpOworCQlXTF9GRlBMRCgiY2hlY2tfdHh1bmZsIDogVFggc3RhdHVzIEZSQUcgc2V0IGJ1dCBubyB0eCB1bmRlcmZsb3dzXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAlmaWZvLT5wcmV2X3R4ZnVuZmwgPSBjdXJfdHh1bmZsOwpAQCAtMzU5LDcgKzM0OSw3IEBACiAKIAkvKiBjaGVjayBpZiBmaWZvIGlzIGJpZyBlbm91Z2ggKi8KIAlpZiAod2xjX3htdGZpZm9fc3pfZ2V0KHdsYywgZmlkLCAmeG10Zmlmb19zeikpIHsKLQkJV0xfRkZQTEQoKCJjaGVja190eHVuZmwgOiBnZXQgeG10Zmlmb19zeiBmYWlsZWQuXG4iKSk7CisJCVdMX0ZGUExEKCJjaGVja190eHVuZmwgOiBnZXQgeG10Zmlmb19zeiBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC0zNzMsOCArMzYzLDggQEAKIAlpZiAoZmlmby0+YWNjdW1fdHhmdW5mbCA8IDEwKQogCQlyZXR1cm4gMDsKIAotCVdMX0ZGUExEKCgiYW1wZHVfY291bnQgJWQgIHR4X3VuZGVyZmxvd3MgJWRcbiIsCi0JCSAgY3VycmVudF9hbXBkdV9jbnQsIGZpZm8tPmFjY3VtX3R4ZnVuZmwpKTsKKwlXTF9GRlBMRCgiYW1wZHVfY291bnQgJWQgIHR4X3VuZGVyZmxvd3MgJWRcbiIsCisJCSBjdXJyZW50X2FtcGR1X2NudCwgZmlmby0+YWNjdW1fdHhmdW5mbCk7CiAKIAkvKgogCSAgIGNvbXB1dGUgdGhlIGN1cnJlbnQgcmF0aW8gb2YgdHggdW5mbCBwZXIgYW1wZHUuCkBAIC00MjcsOCArNDE3LDggQEAKIAkJICAgICAgKG1heF9tcGR1ICogRkZQTERfTVBEVV9TSVpFIC0gZmlmby0+YW1wZHVfcGxkX3NpemUpKQogCQkgICAgIC8gKG1heF9tcGR1ICogRkZQTERfTVBEVV9TSVpFKSkgKiAxMDA7CiAKLQkJV0xfRkZQTEQoKCJETUEgZXN0aW1hdGVkIHRyYW5zZmVyIHJhdGUgJWQ7IHByZS1sb2FkIHNpemUgJWRcbiIsCi0JCQkgIGZpZm8tPmRtYXhmZXJyYXRlLCBmaWZvLT5hbXBkdV9wbGRfc2l6ZSkpOworCQlXTF9GRlBMRCgiRE1BIGVzdGltYXRlZCB0cmFuc2ZlciByYXRlICVkOyBwcmUtbG9hZCBzaXplICVkXG4iLAorCQkJIGZpZm8tPmRtYXhmZXJyYXRlLCBmaWZvLT5hbXBkdV9wbGRfc2l6ZSk7CiAJfSBlbHNlIHsKIAogCQkvKiBkZWNyZWFzZSBhbXBkdSBzaXplICovCkBAIC00NTAsNyArNDQwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgd2xjX2ZmcGxkX2NhbGNfbWNzMmFtcGR1X3RhYmxlKGFtcGR1X2luZm9fdCAqYW1wZHUsIGludCBmKQorc3RhdGljIHZvaWQgd2xjX2ZmcGxkX2NhbGNfbWNzMmFtcGR1X3RhYmxlKHN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSwgaW50IGYpCiB7CiAJaW50IGk7CiAJdTMyIHBoeV9yYXRlLCBkbWFfcmF0ZSwgdG1wOwpAQCAtNDgzLDExICs0NzMsMTIgQEAKIH0KIAogc3RhdGljIHZvaWQgQkNNRkFTVFBBVEgKLXdsY19hbXBkdV9hZ2coYW1wZHVfaW5mb190ICphbXBkdSwgc3RydWN0IHNjYiAqc2NiLCB2b2lkICpwLCB1aW50IHByZWMpCit3bGNfYW1wZHVfYWdnKHN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSwgc3RydWN0IHNjYiAqc2NiLCBzdHJ1Y3Qgc2tfYnVmZiAqcCwKKwkgICAgICB1aW50IHByZWMpCiB7CiAJc2NiX2FtcGR1X3QgKnNjYl9hbXBkdTsKIAlzY2JfYW1wZHVfdGlkX2luaV90ICppbmk7Ci0JdTggdGlkID0gKHU4KSBQS1RQUklPKHApOworCXU4IHRpZCA9ICh1OCkgKHAtPnByaW9yaXR5KTsKIAogCXNjYl9hbXBkdSA9IFNDQl9BTVBEVV9DVUJCWShhbXBkdSwgc2NiKTsKIApAQCAtNTAwLDExICs0OTEsMTIgQEAKIH0KIAogaW50IEJDTUZBU1RQQVRICi13bGNfc2VuZGFtcGR1KGFtcGR1X2luZm9fdCAqYW1wZHUsIHdsY190eHFfaW5mb190ICpxaSwgdm9pZCAqKnBkdSwgaW50IHByZWMpCit3bGNfc2VuZGFtcGR1KHN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSwgd2xjX3R4cV9pbmZvX3QgKnFpLAorCSAgICAgIHN0cnVjdCBza19idWZmICoqcGR1LCBpbnQgcHJlYykKIHsKLQl3bGNfaW5mb190ICp3bGM7Ci0Jb3NsX3QgKm9zaDsKLQl2b2lkICpwLCAqcGt0W0FNUERVX01BWF9NUERVXTsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYzsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcCwgKnBrdFtBTVBEVV9NQVhfTVBEVV07CiAJdTggdGlkLCBuZGVsaW07CiAJaW50IGVyciA9IDA7CiAJdTggcHJlYW1ibGVfdHlwZSA9IFdMQ19HRl9QUkVBTUJMRTsKQEAgLTU0MCw3ICs1MzIsNyBAQAogCiAJQVNTRVJUKHApOwogCi0JdGlkID0gKHU4KSBQS1RQUklPKHApOworCXRpZCA9ICh1OCkgKHAtPnByaW9yaXR5KTsKIAlBU1NFUlQodGlkIDwgQU1QRFVfTUFYX1NDQl9USUQpOwogCiAJZiA9IGFtcGR1LT5maWZvX3RiICsgcHJpbzJmaWZvW3RpZF07CkBAIC01NjEsNyArNTUzLDcgQEAKIAl3bGNfYW1wZHVfYWdnKGFtcGR1LCBzY2IsIHAsIHRpZCk7CiAKIAlpZiAod2xjLT5ibG9ja19kYXRhZmlmbykgewotCQlXTF9FUlJPUigoIiVzOiBGaWZvIGJsb2NrZWRcbiIsIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCIlczogRmlmbyBibG9ja2VkXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiBCQ01FX0JVU1k7CiAJfQogCXJyX3JldHJ5X2xpbWl0ID0gYW1wZHUtPnJyX3JldHJ5X2xpbWl0X3RpZFt0aWRdOwpAQCAtNTc2LDcgKzU2OCw3IEBACiAJCWlmICh0eF9pbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfQU1QRFUpIHsKIAkJCWVyciA9IHdsY19wcmVwX3BkdSh3bGMsIHAsICZmaWZvKTsKIAkJfSBlbHNlIHsKLQkJCVdMX0VSUk9SKCgiJXM6IEFNUERVIGZsYWcgaXMgb2ZmIVxuIiwgX19mdW5jX18pKTsKKwkJCVdMX0VSUk9SKCIlczogQU1QRFUgZmxhZyBpcyBvZmYhXG4iLCBfX2Z1bmNfXyk7CiAJCQkqcGR1ID0gTlVMTDsKIAkJCWVyciA9IDA7CiAJCQlicmVhazsKQEAgLTU4NCwxNCArNTc2LDE2IEBACiAKIAkJaWYgKGVycikgewogCQkJaWYgKGVyciA9PSBCQ01FX0JVU1kpIHsKLQkJCQlXTF9FUlJPUigoIndsJWQ6IHdsY19zZW5kYW1wZHU6IHByZXBfeGR1IHJldHJ5OyBzZXEgMHgleFxuIiwgd2xjLT5wdWItPnVuaXQsIHNlcSkpOworCQkJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfc2VuZGFtcGR1OiBwcmVwX3hkdSByZXRyeTsgc2VxIDB4JXhcbiIsCisJCQkJCSB3bGMtPnB1Yi0+dW5pdCwgc2VxKTsKIAkJCQlXTENOVElOQ1IoYW1wZHUtPmNudC0+c2R1cmV0cnkpOwogCQkJCSpwZHUgPSBwOwogCQkJCWJyZWFrOwogCQkJfQogCiAJCQkvKiBlcnJvciBpbiB0aGUgcGFja2V0OyByZWplY3QgaXQgKi8KLQkJCVdMX0FNUERVX0VSUigoIndsJWQ6IHdsY19zZW5kYW1wZHU6IHByZXBfeGR1IHJlamVjdGVkOyBzZXEgMHgleFxuIiwgd2xjLT5wdWItPnVuaXQsIHNlcSkpOworCQkJV0xfQU1QRFVfRVJSKCJ3bCVkOiB3bGNfc2VuZGFtcGR1OiBwcmVwX3hkdSByZWplY3RlZDsgc2VxIDB4JXhcbiIsCisJCQkJICAgICB3bGMtPnB1Yi0+dW5pdCwgc2VxKTsKIAkJCVdMQ05USU5DUihhbXBkdS0+Y250LT5zZHVyZWplY3RlZCk7CiAKIAkJCSpwZHUgPSBOVUxMOwpAQCAtNjAwLDcgKzU5NCw3IEBACiAKIAkJLyogcGt0IGlzIGdvb2QgdG8gYmUgYWdncmVnYXRlZCAqLwogCQlBU1NFUlQodHhfaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX0FNUERVKTsKLQkJdHhoID0gKGQxMXR4aF90ICopIFBLVERBVEEocCk7CisJCXR4aCA9IChkMTF0eGhfdCAqKSBwLT5kYXRhOwogCQlwbGNwID0gKHU4ICopICh0eGggKyAxKTsKIAkJaCA9IChzdHJ1Y3QgZG90MTFfaGVhZGVyICopKHBsY3AgKyBEMTFfUEhZX0hEUl9MRU4pOwogCQlzZXEgPSBsdG9oMTYoaC0+c2VxKSA+PiBTRVFOVU1fU0hJRlQ7CkBAIC02MzMsOCArNjI3LDggQEAKIAkJbmRlbGltID0gdHhoLT5SVFNQTENQRmFsbGJhY2tbQU1QRFVfRkJSX05VTExfREVMSU1dOwogCQlzZWdfY250ICs9IDE7CiAKLQkJV0xfQU1QRFVfVFgoKCJ3bCVkOiB3bGNfc2VuZGFtcGR1OiBtcGR1ICVkIHBsY3BfbGVuICVkXG4iLAotCQkJICAgICB3bGMtPnB1Yi0+dW5pdCwgY291bnQsIGxlbikpOworCQlXTF9BTVBEVV9UWCgid2wlZDogd2xjX3NlbmRhbXBkdTogbXBkdSAlZCBwbGNwX2xlbiAlZFxuIiwKKwkJCSAgICB3bGMtPnB1Yi0+dW5pdCwgY291bnQsIGxlbik7CiAKIAkJLyoKIAkJICogYWdncmVnYXRlYWJsZSBtcGR1LiBGb3IgdWNvZGUvaHcgYWdnLApAQCAtNjY1LDcgKzY1OSw4IEBACiAKIAkJZG1hX2xlbiArPSAodTE2KSBwa3R0b3RsZW4ob3NoLCBwKTsKIAotCQlXTF9BTVBEVV9UWCgoIndsJWQ6IHdsY19zZW5kYW1wZHU6IGFtcGR1X2xlbiAlZCBzZWdfY250ICVkIG51bGwgZGVsaW0gJWRcbiIsIHdsYy0+cHViLT51bml0LCBhbXBkdV9sZW4sIHNlZ19jbnQsIG5kZWxpbSkpOworCQlXTF9BTVBEVV9UWCgid2wlZDogd2xjX3NlbmRhbXBkdTogYW1wZHVfbGVuICVkIHNlZ19jbnQgJWQgbnVsbCBkZWxpbSAlZFxuIiwKKwkJCSAgICB3bGMtPnB1Yi0+dW5pdCwgYW1wZHVfbGVuLCBzZWdfY250LCBuZGVsaW0pOwogCiAJCXR4aC0+TWFjVHhDb250cm9sTG93ID0gaHRvbDE2KG1jbCk7CiAKQEAgLTY5NSw4ICs2OTAsOCBAQAogCQkJICAgIG1pbihzY2JfYW1wZHUtPm1heF9yeGxlbiwKIAkJCQlhbXBkdS0+bWF4X3R4bGVuW21jc11baXM0MF1bc2dpXSk7CiAKLQkJCVdMX05PTkUoKCJzZW5kYW1wZHU6IHNnaSAlZCwgaXM0MCAlZCwgbWNzICVkXG4iLCBzZ2ksCi0JCQkJIGlzNDAsIG1jcykpOworCQkJV0xfTk9ORSgic2VuZGFtcGR1OiBzZ2kgJWQsIGlzNDAgJWQsIG1jcyAlZFxuIiwKKwkJCQlzZ2ksIGlzNDAsIG1jcyk7CiAKIAkJCW1heGxlbiA9IDY0ICogMTAyNDsJLyogWFhYIEZpeCBtZSB0byBob25vciByZWFsIG1heF9yeGxlbiAqLwogCkBAIC03MzksMTMgKzczNCwxNCBAQAogCQkvKiB0ZXN0IHdoZXRoZXIgdG8gYWRkIG1vcmUgKi8KIAkJaWYgKChNQ1NfUkFURShtY3MsIHRydWUsIGZhbHNlKSA+PSBmLT5kbWF4ZmVycmF0ZSkgJiYKIAkJICAgIChjb3VudCA9PSBmLT5tY3MyYW1wZHVfdGFibGVbbWNzXSkpIHsKLQkJCVdMX0FNUERVX0VSUigoIndsJWQ6IFBSIDM3NjQ0OiBzdG9wcGluZyBhbXBkdSBhdCAlZCBmb3IgbWNzICVkIiwgd2xjLT5wdWItPnVuaXQsIGNvdW50LCBtY3MpKTsKKwkJCVdMX0FNUERVX0VSUigid2wlZDogUFIgMzc2NDQ6IHN0b3BwaW5nIGFtcGR1IGF0ICVkIGZvciBtY3MgJWRcbiIsCisJCQkJICAgICB3bGMtPnB1Yi0+dW5pdCwgY291bnQsIG1jcyk7CiAJCQlicmVhazsKIAkJfQogCiAJCWlmIChjb3VudCA9PSBzY2JfYW1wZHUtPm1heF9wZHUpIHsKLQkJCVdMX05PTkUoKCJTdG9wIHRha2luZyBmcm9tIHEsIHJlYWNoZWQgJWQgZGVlcFxuIiwKLQkJCQkgc2NiX2FtcGR1LT5tYXhfcGR1KSk7CisJCQlXTF9OT05FKCJTdG9wIHRha2luZyBmcm9tIHEsIHJlYWNoZWQgJWQgZGVlcFxuIiwKKwkJCQlzY2JfYW1wZHUtPm1heF9wZHUpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtNzU1LDcgKzc1MSw3IEBACiAKIAkJaWYgKHApIHsKIAkJCWlmICgodHhfaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX0FNUERVKSAmJgotCQkJICAgICgodTgpIFBLVFBSSU8ocCkgPT0gdGlkKSkgeworCQkJICAgICgodTgpIChwLT5wcmlvcml0eSkgPT0gdGlkKSkgewogCiAJCQkJcGxlbiA9CiAJCQkJICAgIHBrdHRvdGxlbihvc2gsIHApICsgQU1QRFVfTUFYX01QRFVfT1ZFUkhFQUQ7CkBAIC03NjMsMTUgKzc1OSwxNiBAQAogCiAJCQkJaWYgKChwbGVuICsgYW1wZHVfbGVuKSA+IG1heGxlbikgewogCQkJCQlwID0gTlVMTDsKLQkJCQkJV0xfRVJST1IoKCIlczogQm9ndXMgcGxlbiAjMVxuIiwKLQkJCQkJCSAgX19mdW5jX18pKTsKKwkJCQkJV0xfRVJST1IoIiVzOiBCb2d1cyBwbGVuICMxXG4iLAorCQkJCQkJIF9fZnVuY19fKTsKIAkJCQkJQVNTRVJUKDMgPT0gNCk7CiAJCQkJCWNvbnRpbnVlOwogCQkJCX0KIAogCQkJCS8qIGNoZWNrIGlmIHRoZXJlIGFyZSBlbm91Z2ggZGVzY3JpcHRvcnMgYXZhaWxhYmxlICovCiAJCQkJaWYgKFRYQVZBSUwod2xjLCBmaWZvKSA8PSAoc2VnX2NudCArIDEpKSB7Ci0JCQkJCVdMX0VSUk9SKCgiJXM6IE5vIGZpZm8gc3BhY2UgICAhISEhISFcbiIsIF9fZnVuY19fKSk7CisJCQkJCVdMX0VSUk9SKCIlczogTm8gZmlmbyBzcGFjZSAgICEhISEhIVxuIiwKKwkJCQkJCSBfX2Z1bmNfXyk7CiAJCQkJCXAgPSBOVUxMOwogCQkJCQljb250aW51ZTsKIAkJCQl9CkBAIC03ODksNyArNzg2LDcgQEAKIAkJV0xDTlRBREQoYW1wZHUtPmNudC0+dHhtcGR1LCBjb3VudCk7CiAKIAkJLyogcGF0Y2ggdXAgdGhlIGxhc3QgdHhoICovCi0JCXR4aCA9IChkMTF0eGhfdCAqKSBQS1REQVRBKHBrdFtjb3VudCAtIDFdKTsKKwkJdHhoID0gKGQxMXR4aF90ICopIHBrdFtjb3VudCAtIDFdLT5kYXRhOwogCQltY2wgPSBsdG9oMTYodHhoLT5NYWNUeENvbnRyb2xMb3cpOwogCQltY2wgJj0gflRYQ19BTVBEVV9NQVNLOwogCQltY2wgfD0gKFRYQ19BTVBEVV9MQVNUIDw8IFRYQ19BTVBEVV9TSElGVCk7CkBAIC04MDcsNyArODA0LDcgQEAKIAkJYW1wZHVfbGVuIC09IHJvdW5kdXAobGVuLCA0KSAtIGxlbjsKIAogCQkvKiBwYXRjaCB1cCB0aGUgZmlyc3QgdHhoICYgcGxjcCAqLwotCQl0eGggPSAoZDExdHhoX3QgKikgUEtUREFUQShwa3RbMF0pOworCQl0eGggPSAoZDExdHhoX3QgKikgcGt0WzBdLT5kYXRhOwogCQlwbGNwID0gKHU4ICopICh0eGggKyAxKTsKIAogCQlXTENfU0VUX01JTU9fUExDUF9MRU4ocGxjcCwgYW1wZHVfbGVuKTsKQEAgLTg3OCwyNyArODc1LDE4IEBACiAJCQlXTENfU0VUX01JTU9fUExDUF9BTVBEVSh0eGgtPkZyYWdQTENQRmFsbGJhY2spOwogCQl9CiAKLQkJV0xfQU1QRFVfVFgoKCJ3bCVkOiB3bGNfc2VuZGFtcGR1OiBjb3VudCAlZCBhbXBkdV9sZW4gJWRcbiIsCi0JCQkgICAgIHdsYy0+cHViLT51bml0LCBjb3VudCwgYW1wZHVfbGVuKSk7CisJCVdMX0FNUERVX1RYKCJ3bCVkOiB3bGNfc2VuZGFtcGR1OiBjb3VudCAlZCBhbXBkdV9sZW4gJWRcbiIsCisJCQkgICAgd2xjLT5wdWItPnVuaXQsIGNvdW50LCBhbXBkdV9sZW4pOwogCiAJCS8qIGluZm9ybSByYXRlX3NlbCBpZiBpdCB0aGlzIGlzIGEgcmF0ZSBwcm9iZSBwa3QgKi8KIAkJZnJhbWVpZCA9IGx0b2gxNih0eGgtPlR4RnJhbWVJRCk7CiAJCWlmIChmcmFtZWlkICYgVFhGSURfUkFURV9QUk9CRV9NQVNLKSB7Ci0JCQlXTF9FUlJPUigoIiVzOiBYWFggd2hhdCB0byBkbyB3aXRoIFRYRklEX1JBVEVfUFJPQkVfTUFTSyE/XG4iLCBfX2Z1bmNfXykpOworCQkJV0xfRVJST1IoIiVzOiBYWFggd2hhdCB0byBkbyB3aXRoIFRYRklEX1JBVEVfUFJPQkVfTUFTSyE/XG4iLAorCQkJCSBfX2Z1bmNfXyk7CiAJCX0KLSNpZmRlZiBXTENfSElHSF9PTkxZCi0JCWlmICh3bGMtPnJwY19hZ2cgJiBCQ01fUlBDX1RQX0hPU1RfQUdHX0FNUERVKQotCQkJYmNtX3JwY190cF9hZ2dfc2V0KGJjbV9ycGNfdHBfZ2V0KHdsYy0+cnBjKSwKLQkJCQkJICAgQkNNX1JQQ19UUF9IT1NUX0FHR19BTVBEVSwgdHJ1ZSk7Ci0jZW5kaWYKIAkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCiAJCQl3bGNfdHhmaWZvKHdsYywgZmlmbywgcGt0W2ldLCBpID09IChjb3VudCAtIDEpLAogCQkJCSAgIGFtcGR1LT50eHBrdF93ZWlnaHQpOwotI2lmZGVmIFdMQ19ISUdIX09OTFkKLQkJaWYgKHdsYy0+cnBjX2FnZyAmIEJDTV9SUENfVFBfSE9TVF9BR0dfQU1QRFUpCi0JCQliY21fcnBjX3RwX2FnZ19zZXQoYmNtX3JwY190cF9nZXQod2xjLT5ycGMpLAotCQkJCQkgICBCQ01fUlBDX1RQX0hPU1RfQUdHX0FNUERVLCBmYWxzZSk7Ci0jZW5kaWYKIAogCX0KIAkvKiBlbmRpZiAoY291bnQpICovCkBAIC05MDYsMTEgKzg5NCwxMSBAQAogfQogCiB2b2lkIEJDTUZBU1RQQVRICi13bGNfYW1wZHVfZG90eHN0YXR1cyhhbXBkdV9pbmZvX3QgKmFtcGR1LCBzdHJ1Y3Qgc2NiICpzY2IsIHZvaWQgKnAsCi0JCSAgICAgdHhfc3RhdHVzX3QgKnR4cykKK3dsY19hbXBkdV9kb3R4c3RhdHVzKHN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSwgc3RydWN0IHNjYiAqc2NiLAorCQkgICAgIHN0cnVjdCBza19idWZmICpwLCB0eF9zdGF0dXNfdCAqdHhzKQogewogCXNjYl9hbXBkdV90ICpzY2JfYW1wZHU7Ci0Jd2xjX2luZm9fdCAqd2xjID0gYW1wZHUtPndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IGFtcGR1LT53bGM7CiAJc2NiX2FtcGR1X3RpZF9pbmlfdCAqaW5pOwogCXUzMiBzMSA9IDAsIHMyID0gMDsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKnR4X2luZm87CkBAIC05MjIsNyArOTEwLDcgQEAKIAlBU1NFUlQodHhzLT5zdGF0dXMgJiBUWF9TVEFUVVNfQU1QRFUpOwogCXNjYl9hbXBkdSA9IFNDQl9BTVBEVV9DVUJCWShhbXBkdSwgc2NiKTsKIAlBU1NFUlQoc2NiX2FtcGR1KTsKLQlpbmkgPSBTQ0JfQU1QRFVfSU5JKHNjYl9hbXBkdSwgUEtUUFJJTyhwKSk7CisJaW5pID0gU0NCX0FNUERVX0lOSShzY2JfYW1wZHUsIHAtPnByaW9yaXR5KTsKIAlBU1NFUlQoaW5pLT5zY2IgPT0gc2NiKTsKIAogCS8qIEJNQUNfTk9URTogRm9yIHRoZSBzcGxpdCBkcml2ZXIsIHNlY29uZCBsZXZlbCB0eHN0YXR1cyBjb21lcyBsYXRlcgpAQCAtOTMwLDcgKzkxOCw2IEBACiAJICogY2FsbCB0aGUgZmlyc3Qgb25lCiAJICovCiAJaWYgKHR4cy0+c3RhdHVzICYgVFhfU1RBVFVTX0FDS19SQ1YpIHsKLSNpZmRlZiBXTENfTE9XCiAJCXU4IHN0YXR1c19kZWxheSA9IDA7CiAKIAkJLyogd2FpdCB0aWxsIHRoZSBuZXh0IDggYnl0ZXMgb2YgdHhzdGF0dXMgaXMgYXZhaWxhYmxlICovCkBAIC05NDgsNTQgKzkzNSwxNCBAQAogCQlBU1NFUlQoIShzMSAmIFRYX1NUQVRVU19JTlRFUk1FRElBVEUpKTsKIAkJQVNTRVJUKHMxICYgVFhfU1RBVFVTX0FNUERVKTsKIAkJczIgPSBSX1JFRyh3bGMtPm9zaCwgJndsYy0+cmVncy0+ZnJtdHhzdGF0dXMyKTsKLSNlbHNlCQkJCS8qIFdMQ19MT1cgKi8KLQotCQkvKiBTdG9yZSB0aGUgcmVsZXZhbnQgaW5mb3JtYXRpb24gaW4gYW1wZHUgc3RydWN0dXJlICovCi0JCVdMX0FNUERVX1RYKCgid2wlZDogd2xjX2FtcGR1X2RvdHhzdGF0dXM6IEhpZ2ggUmVjdmRcbiIsCi0JCQkgICAgIHdsYy0+cHViLT51bml0KSk7Ci0KLQkJQVNTRVJUKCFhbXBkdS0+cCk7Ci0JCWFtcGR1LT5wID0gcDsKLQkJYmNvcHkodHhzLCAmYW1wZHUtPnR4cywgc2l6ZW9mKHR4X3N0YXR1c190KSk7Ci0JCWFtcGR1LT53YWl0aW5nX3N0YXR1cyA9IHRydWU7Ci0JCXJldHVybjsKLSNlbmRpZgkJCQkvKiBXTENfTE9XICovCiAJfQogCiAJd2xjX2FtcGR1X2RvdHhzdGF0dXNfY29tcGxldGUoYW1wZHUsIHNjYiwgcCwgdHhzLCBzMSwgczIpOwogCXdsY19hbXBkdV90eGZsb3djb250cm9sKHdsYywgc2NiX2FtcGR1LCBpbmkpOwogfQogCi0jaWZkZWYgV0xDX0hJR0hfT05MWQotdm9pZCB3bGNfYW1wZHVfdHhzdGF0dXNfY29tcGxldGUoYW1wZHVfaW5mb190ICphbXBkdSwgdTMyIHMxLCB1MzIgczIpCi17Ci0JV0xfQU1QRFVfVFgoKCJ3bCVkOiB3bGNfYW1wZHVfdHhzdGF0dXNfY29tcGxldGU6IEhpZ2ggUmVjdmQgMHgleCAweCV4IHA6JXBcbiIsIGFtcGR1LT53bGMtPnB1Yi0+dW5pdCwgczEsIHMyLCBhbXBkdS0+cCkpOwotCi0JQVNTRVJUKGFtcGR1LT53YWl0aW5nX3N0YXR1cyk7Ci0KLQkvKiBUaGUgcGFja2V0IG1heSBoYXZlIGJlZW4gZnJlZWQgaWYgdGhlIFNDQiB3ZW50IGF3YXksIGlmIHNvLCB0aGVuIHN0aWxsIGZyZWUgdGhlCi0JICogRE1BIGNoYWluCi0JICovCi0JaWYgKGFtcGR1LT5wKSB7Ci0JCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqdHhfaW5mbzsKLQkJc3RydWN0IHNjYiAqc2NiOwotCi0JCXR4X2luZm8gPSBJRUVFODAyMTFfU0tCX0NCKGFtcGR1LT5wKTsKLQkJc2NiID0gKHN0cnVjdCBzY2IgKil0eF9pbmZvLT5jb250cm9sLnN0YS0+ZHJ2X3ByaXY7Ci0KLQkJd2xjX2FtcGR1X2RvdHhzdGF0dXNfY29tcGxldGUoYW1wZHUsIHNjYiwgYW1wZHUtPnAsICZhbXBkdS0+dHhzLAotCQkJCQkgICAgICBzMSwgczIpOwotCQlhbXBkdS0+cCA9IE5VTEw7Ci0JfQotCi0JYW1wZHUtPndhaXRpbmdfc3RhdHVzID0gZmFsc2U7Ci19Ci0jZW5kaWYJCQkJLyogV0xDX0hJR0hfT05MWSAqLwotdm9pZCByYXRlX3N0YXR1cyh3bGNfaW5mb190ICp3bGMsIHN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqdHhfaW5mbywKLQkJIHR4X3N0YXR1c190ICp0eHMsIHU4IG1jcyk7Ci0KIHZvaWQKLXJhdGVfc3RhdHVzKHdsY19pbmZvX3QgKndsYywgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICp0eF9pbmZvLAorcmF0ZV9zdGF0dXMoc3RydWN0IHdsY19pbmZvICp3bGMsIHN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqdHhfaW5mbywKIAkgICAgdHhfc3RhdHVzX3QgKnR4cywgdTggbWNzKQogewogCXN0cnVjdCBpZWVlODAyMTFfdHhfcmF0ZSAqdHhyYXRlID0gdHhfaW5mby0+c3RhdHVzLnJhdGVzOwpAQCAtMTAwOCwxNyArOTU1LDE1IEBACiAJfQogfQogCi1leHRlcm4gdm9pZCB3bGNfdHhxX2VucSh3bGNfaW5mb190ICp3bGMsIHN0cnVjdCBzY2IgKnNjYiwgdm9pZCAqc2R1LAotCQkJdWludCBwcmVjKTsKLQogI2RlZmluZSBTSE9SVE5BTUUgIkFNUERVIHN0YXR1cyIKIAogc3RhdGljIHZvaWQgQkNNRkFTVFBBVEgKLXdsY19hbXBkdV9kb3R4c3RhdHVzX2NvbXBsZXRlKGFtcGR1X2luZm9fdCAqYW1wZHUsIHN0cnVjdCBzY2IgKnNjYiwgdm9pZCAqcCwKLQkJCSAgICAgIHR4X3N0YXR1c190ICp0eHMsIHUzMiBzMSwgdTMyIHMyKQord2xjX2FtcGR1X2RvdHhzdGF0dXNfY29tcGxldGUoc3RydWN0IGFtcGR1X2luZm8gKmFtcGR1LCBzdHJ1Y3Qgc2NiICpzY2IsCisJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqcCwgdHhfc3RhdHVzX3QgKnR4cywKKwkJCSAgICAgIHUzMiBzMSwgdTMyIHMyKQogewogCXNjYl9hbXBkdV90ICpzY2JfYW1wZHU7Ci0Jd2xjX2luZm9fdCAqd2xjID0gYW1wZHUtPndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IGFtcGR1LT53bGM7CiAJc2NiX2FtcGR1X3RpZF9pbmlfdCAqaW5pOwogCXU4IGJpdG1hcFs4XSwgcXVldWUsIHRpZDsKIAlkMTF0eGhfdCAqdHhoOwpAQCAtMTAzNyw3ICs5ODIsNyBAQAogCiAjaWZkZWYgQkNNREJHCiAJdTggaG9sZVtBTVBEVV9NQVhfTVBEVV07Ci0JYnplcm8oaG9sZSwgc2l6ZW9mKGhvbGUpKTsKKwltZW1zZXQoaG9sZSwgMCwgc2l6ZW9mKGhvbGUpKTsKICNlbmRpZgogCiAJQVNTRVJUKHR4X2luZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BTVBEVSk7CkBAIC0xMDQ2LDcgKzk5MSw3IEBACiAJc2NiX2FtcGR1ID0gU0NCX0FNUERVX0NVQkJZKGFtcGR1LCBzY2IpOwogCUFTU0VSVChzY2JfYW1wZHUpOwogCi0JdGlkID0gKHU4KSBQS1RQUklPKHApOworCXRpZCA9ICh1OCkgKHAtPnByaW9yaXR5KTsKIAogCWluaSA9IFNDQl9BTVBEVV9JTkkoc2NiX2FtcGR1LCB0aWQpOwogCXJldHJ5X2xpbWl0ID0gYW1wZHUtPnJldHJ5X2xpbWl0X3RpZFt0aWRdOwpAQCAtMTA1NCw3ICs5OTksNyBAQAogCiAJQVNTRVJUKGluaS0+c2NiID09IHNjYik7CiAKLQliemVybyhiaXRtYXAsIHNpemVvZihiaXRtYXApKTsKKwltZW1zZXQoYml0bWFwLCAwLCBzaXplb2YoYml0bWFwKSk7CiAJcXVldWUgPSB0eHMtPmZyYW1laWQgJiBUWEZJRF9RVUVVRV9NQVNLOwogCUFTU0VSVChxdWV1ZSA8IEFDX0NPVU5UKTsKIApAQCAtMTA5MSwxMyArMTAzNiwxNiBAQAogCQlpZiAoc3Vwcl9zdGF0dXMpIHsKIAkJCXVwZGF0ZV9yYXRlID0gZmFsc2U7CiAJCQlpZiAoc3Vwcl9zdGF0dXMgPT0gVFhfU1RBVFVTX1NVUFJfQkFEQ0gpIHsKLQkJCQlXTF9FUlJPUigoIiVzOiBQa3QgdHggc3VwcHJlc3NlZCwgaWxsZWdhbCBjaGFubmVsIHBvc3NpYmx5ICVkXG4iLCBfX2Z1bmNfXywgQ0hTUEVDX0NIQU5ORUwod2xjLT5kZWZhdWx0X2Jzcy0+Y2hhbnNwZWMpKSk7CisJCQkJV0xfRVJST1IoIiVzOiBQa3QgdHggc3VwcHJlc3NlZCwgaWxsZWdhbCBjaGFubmVsIHBvc3NpYmx5ICVkXG4iLAorCQkJCQkgX19mdW5jX18sCisJCQkJCSBDSFNQRUNfQ0hBTk5FTCh3bGMtPmRlZmF1bHRfYnNzLT5jaGFuc3BlYykpOwogCQkJfSBlbHNlIHsKIAkJCQlpZiAoc3Vwcl9zdGF0dXMgPT0gVFhfU1RBVFVTX1NVUFJfRlJBRykKLQkJCQkJV0xfTk9ORSgoIiVzOiBBTVBEVSBmcmFnIGVyclxuIiwKLQkJCQkJCSBfX2Z1bmNfXykpOworCQkJCQlXTF9OT05FKCIlczogQU1QRFUgZnJhZyBlcnJcbiIsCisJCQkJCQlfX2Z1bmNfXyk7CiAJCQkJZWxzZQotCQkJCQlXTF9FUlJPUigoIiVzOiB3bGNfYW1wZHVfZG90eHN0YXR1czogc3Vwcl9zdGF0dXMgMHgleFxuIiwgX19mdW5jX18sIHN1cHJfc3RhdHVzKSk7CisJCQkJCVdMX0VSUk9SKCIlczogd2xjX2FtcGR1X2RvdHhzdGF0dXM6IHN1cHJfc3RhdHVzIDB4JXhcbiIsCisJCQkJCQkgX19mdW5jX18sIHN1cHJfc3RhdHVzKTsKIAkJCX0KIAkJCS8qIG5vIG5lZWQgdG8gcmV0cnkgZm9yIGJhZGNoOyB3aWxsIGZhaWwgYWdhaW4gKi8KIAkJCWlmIChzdXByX3N0YXR1cyA9PSBUWF9TVEFUVVNfU1VQUl9CQURDSCB8fApAQCAtMTExNiwyMiArMTA2NCwxOCBAQAogCQkJCWlmICh3bGNfZmZwbGRfY2hlY2tfdHhmdW5mbCh3bGMsIHByaW8yZmlmb1t0aWRdKQogCQkJCSAgICA+IDApIHsKIAkJCQkJdHhfZXJyb3IgPSB0cnVlOwotI2lmZGVmIFdMQ19ISUdIX09OTFkKLQkJCQkJLyogV2l0aCBCTUFDLCBUWCBVbmRlcmZsb3dzIHNob3VsZCBub3QgaGFwcGVuICovCi0JCQkJCVdMX0VSUk9SKCgid2wlZDogQk1BQyBUWCBVbmRlcmZsb3c/IiwKLQkJCQkJCSAgd2xjLT5wdWItPnVuaXQpKTsKLSNlbmRpZgogCQkJCX0KIAkJCX0KIAkJfSBlbHNlIGlmICh0eHMtPnBoeWVycikgewogCQkJdXBkYXRlX3JhdGUgPSBmYWxzZTsKIAkJCVdMQ05USU5DUih3bGMtPnB1Yi0+X2NudC0+dHhwaHllcnIpOwotCQkJV0xfRVJST1IoKCJ3bCVkOiB3bGNfYW1wZHVfZG90eHN0YXR1czogdHggcGh5IGVycm9yICgweCV4KVxuIiwgd2xjLT5wdWItPnVuaXQsIHR4cy0+cGh5ZXJyKSk7CisJCQlXTF9FUlJPUigid2wlZDogd2xjX2FtcGR1X2RvdHhzdGF0dXM6IHR4IHBoeSBlcnJvciAoMHgleClcbiIsCisJCQkJIHdsYy0+cHViLT51bml0LCB0eHMtPnBoeWVycik7CiAKICNpZmRlZiBCQ01EQkcKIAkJCWlmIChXTF9FUlJPUl9PTigpKSB7CiAJCQkJcHJwa3QoInR4cGt0IChBTVBEVSkiLCB3bGMtPm9zaCwgcCk7Ci0JCQkJd2xjX3ByaW50X3R4ZGVzYygoZDExdHhoX3QgKikgUEtUREFUQShwKSk7CisJCQkJd2xjX3ByaW50X3R4ZGVzYygoZDExdHhoX3QgKikgcC0+ZGF0YSk7CiAJCQkJd2xjX3ByaW50X3R4c3RhdHVzKHR4cyk7CiAJCQl9CiAjZW5kaWYJCQkJLyogQkNNREJHICovCkBAIC0xMTQyLDcgKzEwODYsNyBAQAogCXdoaWxlIChwKSB7CiAJCXR4X2luZm8gPSBJRUVFODAyMTFfU0tCX0NCKHApOwogCQlBU1NFUlQodHhfaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX0FNUERVKTsKLQkJdHhoID0gKGQxMXR4aF90ICopIFBLVERBVEEocCk7CisJCXR4aCA9IChkMTF0eGhfdCAqKSBwLT5kYXRhOwogCQltY2wgPSBsdG9oMTYodHhoLT5NYWNUeENvbnRyb2xMb3cpOwogCQlwbGNwID0gKHU4ICopICh0eGggKyAxKTsKIAkJaCA9IChzdHJ1Y3QgZG90MTFfaGVhZGVyICopKHBsY3AgKyBEMTFfUEhZX0hEUl9MRU4pOwpAQCAtMTE1OCwxMCArMTEwMiw5IEBACiAJCWlmIChiYV9yZWNkKSB7CiAJCQliaW5kZXggPSBNT0RTVUJfUE9XMihzZXEsIHN0YXJ0X3NlcSwgU0VRTlVNX01BWCk7CiAKLQkJCVdMX0FNUERVX1RYKCgiJXM6IHRpZCAlZCBzZXEgaXMgJWQsIHN0YXJ0X3NlcSBpcyAlZCwgIgotCQkJCSAgICAgImJpbmRleCBpcyAlZCBzZXQgJWQsIGluZGV4ICVkXG4iLAotCQkJCSAgICAgX19mdW5jX18sIHRpZCwgc2VxLCBzdGFydF9zZXEsIGJpbmRleCwKLQkJCQkgICAgIGlzc2V0KGJpdG1hcCwgYmluZGV4KSwgaW5kZXgpKTsKKwkJCVdMX0FNUERVX1RYKCIlczogdGlkICVkIHNlcSBpcyAlZCwgc3RhcnRfc2VxIGlzICVkLCBiaW5kZXggaXMgJWQgc2V0ICVkLCBpbmRleCAlZFxuIiwKKwkJCQkgICAgX19mdW5jX18sIHRpZCwgc2VxLCBzdGFydF9zZXEsIGJpbmRleCwKKwkJCQkgICAgaXNzZXQoYml0bWFwLCBiaW5kZXgpLCBpbmRleCk7CiAKIAkJCS8qIGlmIGFja2VkIHRoZW4gY2xlYXIgYml0IGFuZCBmcmVlIHBhY2tldCAqLwogCQkJaWYgKChiaW5kZXggPCBBTVBEVV9UWF9CQV9NQVhfV1NJWkUpCkBAIC0xMTg2LDggKzExMjksOCBAQAogCQkJCSAgICAgc3RhdHVzICYgVFhfU1RBVFVTX0ZSTV9SVFhfTUFTSykgPj4KIAkJCQkgICAgVFhfU1RBVFVTX0ZSTV9SVFhfU0hJRlQ7CiAKLQkJCQlQS1RQVUxMKHAsIEQxMV9QSFlfSERSX0xFTik7Ci0JCQkJUEtUUFVMTChwLCBEMTFfVFhIX0xFTik7CisJCQkJc2tiX3B1bGwocCwgRDExX1BIWV9IRFJfTEVOKTsKKwkJCQlza2JfcHVsbChwLCBEMTFfVFhIX0xFTik7CiAKIAkJCQlpZWVlODAyMTFfdHhfc3RhdHVzX2lycXNhZmUod2xjLT5wdWItPmllZWVfaHcsCiAJCQkJCQkJICAgIHApOwpAQCAtMTIxMiw5ICsxMTU1LDEwIEBACiAJCQkJaWVlZTgwMjExX3R4X2luZm9fY2xlYXJfc3RhdHVzKHR4X2luZm8pOwogCQkJCXR4X2luZm8tPmZsYWdzIHw9CiAJCQkJICAgIElFRUU4MDIxMV9UWF9TVEFUX0FNUERVX05PX0JBQ0s7Ci0JCQkJUEtUUFVMTChwLCBEMTFfUEhZX0hEUl9MRU4pOwotCQkJCVBLVFBVTEwocCwgRDExX1RYSF9MRU4pOwotCQkJCVdMX0VSUk9SKCgiJXM6IEJBIFRpbWVvdXQsIHNlcSAlZCwgaW5fdHJhbnNpdCAlZFxuIiwgU0hPUlROQU1FLCBzZXEsIGluaS0+dHhfaW5fdHJhbnNpdCkpOworCQkJCXNrYl9wdWxsKHAsIEQxMV9QSFlfSERSX0xFTik7CisJCQkJc2tiX3B1bGwocCwgRDExX1RYSF9MRU4pOworCQkJCVdMX0VSUk9SKCIlczogQkEgVGltZW91dCwgc2VxICVkLCBpbl90cmFuc2l0ICVkXG4iLAorCQkJCQkgU0hPUlROQU1FLCBzZXEsIGluaS0+dHhfaW5fdHJhbnNpdCk7CiAJCQkJaWVlZTgwMjExX3R4X3N0YXR1c19pcnFzYWZlKHdsYy0+cHViLT5pZWVlX2h3LAogCQkJCQkJCSAgICBwKTsKIAkJCX0KQEAgLTEyNDIsNyArMTE4Niw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1hbXBkdV9jbGVhbnVwX3RpZF9pbmkoYW1wZHVfaW5mb190ICphbXBkdSwgc2NiX2FtcGR1X3QgKnNjYl9hbXBkdSwgdTggdGlkLAorYW1wZHVfY2xlYW51cF90aWRfaW5pKHN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSwgc2NiX2FtcGR1X3QgKnNjYl9hbXBkdSwgdTggdGlkLAogCQkgICAgICBib29sIGZvcmNlKQogewogCXNjYl9hbXBkdV90aWRfaW5pX3QgKmluaTsKQEAgLTEyNTAsOCArMTE5NCw4IEBACiAJaWYgKCFpbmkpCiAJCXJldHVybjsKIAotCVdMX0FNUERVX0NUTCgoIndsJWQ6IGFtcGR1X2NsZWFudXBfdGlkX2luaTogdGlkICVkXG4iLAotCQkgICAgICBhbXBkdS0+d2xjLT5wdWItPnVuaXQsIHRpZCkpOworCVdMX0FNUERVX0NUTCgid2wlZDogYW1wZHVfY2xlYW51cF90aWRfaW5pOiB0aWQgJWRcbiIsCisJCSAgICAgYW1wZHUtPndsYy0+cHViLT51bml0LCB0aWQpOwogCiAJaWYgKGluaS0+dHhfaW5fdHJhbnNpdCAmJiAhZm9yY2UpCiAJCXJldHVybjsKQEAgLTEyNjQsNyArMTIwOCw3IEBACiB9CiAKIC8qIGluaXRpYWxpemUgdGhlIGluaXRpYXRvciBjb2RlIGZvciB0aWQgKi8KLXN0YXRpYyBzY2JfYW1wZHVfdGlkX2luaV90ICp3bGNfYW1wZHVfaW5pdF90aWRfaW5pKGFtcGR1X2luZm9fdCAqYW1wZHUsCitzdGF0aWMgc2NiX2FtcGR1X3RpZF9pbmlfdCAqd2xjX2FtcGR1X2luaXRfdGlkX2luaShzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUsCiAJCQkJCQkgICBzY2JfYW1wZHVfdCAqc2NiX2FtcGR1LAogCQkJCQkJICAgdTggdGlkLCBib29sIG92ZXJyaWRlKQogewpAQCAtMTI3Nyw3ICsxMjIxLDcgQEAKIAogCS8qIGNoZWNrIGZvciBwZXItdGlkIGNvbnRyb2wgb2YgYW1wZHUgKi8KIAlpZiAoIWFtcGR1LT5pbmlfZW5hYmxlW3RpZF0pIHsKLQkJV0xfRVJST1IoKCIlczogUmVqZWN0aW5nIHRpZCAlZFxuIiwgX19mdW5jX18sIHRpZCkpOworCQlXTF9FUlJPUigiJXM6IFJlamVjdGluZyB0aWQgJWRcbiIsIF9fZnVuY19fLCB0aWQpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTEyOTAsMjEgKzEyMzQsMjEgQEAKIAlyZXR1cm4gaW5pOwogfQogCi1pbnQgd2xjX2FtcGR1X3NldChhbXBkdV9pbmZvX3QgKmFtcGR1LCBib29sIG9uKQoraW50IHdsY19hbXBkdV9zZXQoc3RydWN0IGFtcGR1X2luZm8gKmFtcGR1LCBib29sIG9uKQogewotCXdsY19pbmZvX3QgKndsYyA9IGFtcGR1LT53bGM7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSBhbXBkdS0+d2xjOwogCiAJd2xjLT5wdWItPl9hbXBkdSA9IGZhbHNlOwogCiAJaWYgKG9uKSB7CiAJCWlmICghTl9FTkFCKHdsYy0+cHViKSkgewotCQkJV0xfQU1QRFVfRVJSKCgid2wlZDogZHJpdmVyIG5vdCBubW9kZSBlbmFibGVkXG4iLAotCQkJCSAgICAgIHdsYy0+cHViLT51bml0KSk7CisJCQlXTF9BTVBEVV9FUlIoIndsJWQ6IGRyaXZlciBub3Qgbm1vZGUgZW5hYmxlZFxuIiwKKwkJCQkgICAgIHdsYy0+cHViLT51bml0KTsKIAkJCXJldHVybiBCQ01FX1VOU1VQUE9SVEVEOwogCQl9CiAJCWlmICghd2xjX2FtcGR1X2NhcChhbXBkdSkpIHsKLQkJCVdMX0FNUERVX0VSUigoIndsJWQ6IGRldmljZSBub3QgYW1wZHUgY2FwYWJsZVxuIiwKLQkJCQkgICAgICB3bGMtPnB1Yi0+dW5pdCkpOworCQkJV0xfQU1QRFVfRVJSKCJ3bCVkOiBkZXZpY2Ugbm90IGFtcGR1IGNhcGFibGVcbiIsCisJCQkJICAgICB3bGMtPnB1Yi0+dW5pdCk7CiAJCQlyZXR1cm4gQkNNRV9VTlNVUFBPUlRFRDsKIAkJfQogCQl3bGMtPnB1Yi0+X2FtcGR1ID0gb247CkBAIC0xMzEzLDcgKzEyNTcsNyBAQAogCXJldHVybiAwOwogfQogCi1ib29sIHdsY19hbXBkdV9jYXAoYW1wZHVfaW5mb190ICphbXBkdSkKK2Jvb2wgd2xjX2FtcGR1X2NhcChzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUpCiB7CiAJaWYgKFdMQ19QSFlfMTFOX0NBUChhbXBkdS0+d2xjLT5iYW5kKSkKIAkJcmV0dXJuIHRydWU7CkBAIC0xMzIxLDcgKzEyNjUsNyBAQAogCQlyZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyB2b2lkIGFtcGR1X3VwZGF0ZV9tYXhfdHhsZW4oYW1wZHVfaW5mb190ICphbXBkdSwgdTggZHVyKQorc3RhdGljIHZvaWQgYW1wZHVfdXBkYXRlX21heF90eGxlbihzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUsIHU4IGR1cikKIHsKIAl1MzIgcmF0ZSwgbWNzOwogCkBAIC0xMzQzLDcgKzEyODcsNyBAQAogfQogCiB1OCBCQ01GQVNUUEFUSAotd2xjX2FtcGR1X251bGxfZGVsaW1fY250KGFtcGR1X2luZm9fdCAqYW1wZHUsIHN0cnVjdCBzY2IgKnNjYiwKK3dsY19hbXBkdV9udWxsX2RlbGltX2NudChzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUsIHN0cnVjdCBzY2IgKnNjYiwKIAkJCSByYXRlc3BlY190IHJzcGVjLCBpbnQgcGh5bGVuKQogewogCXNjYl9hbXBkdV90ICpzY2JfYW1wZHU7CkBAIC0xMzc5LDI1ICsxMzIzLDI1IEBACiAJCXJldHVybiAwOwogfQogCi12b2lkIHdsY19hbXBkdV9tYWNhZGRyX3VwZCh3bGNfaW5mb190ICp3bGMpCit2b2lkIHdsY19hbXBkdV9tYWNhZGRyX3VwZChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAljaGFyIHRlbXBsYXRlW1RfUkFNX0FDQ0VTU19TWiAqIDJdOwogCiAJLyogZHJpdmVyIG5lZWRzIHRvIHdyaXRlIHRoZSB0YSBpbiB0aGUgdGVtcGxhdGU7IHRhIGlzIGF0IG9mZnNldCAxNiAqLwotCWJ6ZXJvKHRlbXBsYXRlLCBzaXplb2YodGVtcGxhdGUpKTsKLQliY29weSgoY2hhciAqKXdsYy0+cHViLT5jdXJfZXRoZXJhZGRyLm9jdGV0LCB0ZW1wbGF0ZSwgRVRIRVJfQUREUl9MRU4pOworCW1lbXNldCh0ZW1wbGF0ZSwgMCwgc2l6ZW9mKHRlbXBsYXRlKSk7CisJYmNvcHkoKGNoYXIgKil3bGMtPnB1Yi0+Y3VyX2V0aGVyYWRkci5vY3RldCwgdGVtcGxhdGUsIEVUSF9BTEVOKTsKIAl3bGNfd3JpdGVfdGVtcGxhdGVfcmFtKHdsYywgKFRfQkFfVFBMX0JBU0UgKyAxNiksIChUX1JBTV9BQ0NFU1NfU1ogKiAyKSwKIAkJCSAgICAgICB0ZW1wbGF0ZSk7CiB9CiAKLWJvb2wgd2xjX2FnZ3JlZ2F0YWJsZSh3bGNfaW5mb190ICp3bGMsIHU4IHRpZCkKK2Jvb2wgd2xjX2FnZ3JlZ2F0YWJsZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTggdGlkKQogewogCXJldHVybiB3bGMtPmFtcGR1LT5pbmlfZW5hYmxlW3RpZF07CiB9CiAKLXZvaWQgd2xjX2FtcGR1X3NobV91cGQoYW1wZHVfaW5mb190ICphbXBkdSkKK3ZvaWQgd2xjX2FtcGR1X3NobV91cGQoc3RydWN0IGFtcGR1X2luZm8gKmFtcGR1KQogewotCXdsY19pbmZvX3QgKndsYyA9IGFtcGR1LT53bGM7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSBhbXBkdS0+d2xjOwogCiAJLyogRXh0ZW5kIHVjb2RlIGludGVybmFsIHdhdGNoZG9nIHRpbWVyIHRvIG1hdGNoIGxhcmdlciByZWNlaXZlZCBmcmFtZXMgKi8KIAlpZiAoKGFtcGR1LT5yeF9mYWN0b3IgJiBIVF9QQVJBTVNfUlhfRkFDVE9SX01BU0spID09CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfYW1wZHUuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19hbXBkdS5oCmluZGV4IGM3MjFiMTYuLjAzNDU3ZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19hbXBkdS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19hbXBkdS5oCkBAIC0xNywyNCArMTcsMjAgQEAKICNpZm5kZWYgX3dsY19hbXBkdV9oXwogI2RlZmluZSBfd2xjX2FtcGR1X2hfCiAKLWV4dGVybiBhbXBkdV9pbmZvX3QgKndsY19hbXBkdV9hdHRhY2god2xjX2luZm9fdCAqd2xjKTsKLWV4dGVybiB2b2lkIHdsY19hbXBkdV9kZXRhY2goYW1wZHVfaW5mb190ICphbXBkdSk7Ci1leHRlcm4gYm9vbCB3bGNfYW1wZHVfY2FwKGFtcGR1X2luZm9fdCAqYW1wZHUpOwotZXh0ZXJuIGludCB3bGNfYW1wZHVfc2V0KGFtcGR1X2luZm9fdCAqYW1wZHUsIGJvb2wgb24pOwotZXh0ZXJuIGludCB3bGNfc2VuZGFtcGR1KGFtcGR1X2luZm9fdCAqYW1wZHUsIHdsY190eHFfaW5mb190ICpxaSwgdm9pZCAqKmFnZ3AsCi0JCQkgaW50IHByZWMpOwotZXh0ZXJuIHZvaWQgd2xjX2FtcGR1X2RvdHhzdGF0dXMoYW1wZHVfaW5mb190ICphbXBkdSwgc3RydWN0IHNjYiAqc2NiLCB2b2lkICpwLAotCQkJCSB0eF9zdGF0dXNfdCAqdHhzKTsKLWV4dGVybiB2b2lkIHdsY19hbXBkdV9yZXNldChhbXBkdV9pbmZvX3QgKmFtcGR1KTsKLWV4dGVybiB2b2lkIHdsY19hbXBkdV9tYWNhZGRyX3VwZCh3bGNfaW5mb190ICp3bGMpOwotZXh0ZXJuIHZvaWQgd2xjX2FtcGR1X3NobV91cGQoYW1wZHVfaW5mb190ICphbXBkdSk7CitleHRlcm4gc3RydWN0IGFtcGR1X2luZm8gKndsY19hbXBkdV9hdHRhY2goc3RydWN0IHdsY19pbmZvICp3bGMpOworZXh0ZXJuIHZvaWQgd2xjX2FtcGR1X2RldGFjaChzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUpOworZXh0ZXJuIGJvb2wgd2xjX2FtcGR1X2NhcChzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUpOworZXh0ZXJuIGludCB3bGNfYW1wZHVfc2V0KHN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSwgYm9vbCBvbik7CitleHRlcm4gaW50IHdsY19zZW5kYW1wZHUoc3RydWN0IGFtcGR1X2luZm8gKmFtcGR1LCB3bGNfdHhxX2luZm9fdCAqcWksCisJCQkgc3RydWN0IHNrX2J1ZmYgKiphZ2dwLCBpbnQgcHJlYyk7CitleHRlcm4gdm9pZCB3bGNfYW1wZHVfZG90eHN0YXR1cyhzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUsIHN0cnVjdCBzY2IgKnNjYiwKKwkJCQkgc3RydWN0IHNrX2J1ZmYgKnAsIHR4X3N0YXR1c190ICp0eHMpOworZXh0ZXJuIHZvaWQgd2xjX2FtcGR1X3Jlc2V0KHN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSk7CitleHRlcm4gdm9pZCB3bGNfYW1wZHVfbWFjYWRkcl91cGQoc3RydWN0IHdsY19pbmZvICp3bGMpOworZXh0ZXJuIHZvaWQgd2xjX2FtcGR1X3NobV91cGQoc3RydWN0IGFtcGR1X2luZm8gKmFtcGR1KTsKIAotZXh0ZXJuIHU4IHdsY19hbXBkdV9udWxsX2RlbGltX2NudChhbXBkdV9pbmZvX3QgKmFtcGR1LCBzdHJ1Y3Qgc2NiICpzY2IsCitleHRlcm4gdTggd2xjX2FtcGR1X251bGxfZGVsaW1fY250KHN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSwgc3RydWN0IHNjYiAqc2NiLAogCQkJCSAgICAgIHJhdGVzcGVjX3QgcnNwZWMsIGludCBwaHlsZW4pOwotZXh0ZXJuIHZvaWQgc2NiX2FtcGR1X2NsZWFudXAoYW1wZHVfaW5mb190ICphbXBkdSwgc3RydWN0IHNjYiAqc2NiKTsKLSNpZmRlZiBXTENfSElHSF9PTkxZCi1leHRlcm4gdm9pZCB3bGNfYW1wZHVfdHhzdGF0dXNfY29tcGxldGUoYW1wZHVfaW5mb190ICphbXBkdSwgdTMyIHMxLAotCQkJCQl1MzIgczIpOwotI2VuZGlmCitleHRlcm4gdm9pZCBzY2JfYW1wZHVfY2xlYW51cChzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUsIHN0cnVjdCBzY2IgKnNjYik7CiAKICNlbmRpZgkJCQkvKiBfd2xjX2FtcGR1X2hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfYW50c2VsLmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfYW50c2VsLmMKaW5kZXggNWZmODgzMS4uNDAyZGRmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2FudHNlbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19hbnRzZWwuYwpAQCAtMTksMTggKzE5LDIzIEBACiAjaWZkZWYgV0xBTlRTRUwKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4dmVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8YmNtZGVmcy5oPgogI2luY2x1ZGUgPG9zbC5oPgogI2luY2x1ZGUgPGJjbXV0aWxzLmg+CiAjaW5jbHVkZSA8c2l1dGlscy5oPgogI2luY2x1ZGUgPHdsaW9jdGwuaD4KIAorI2luY2x1ZGUgPGJjbWRldnMuaD4KKyNpbmNsdWRlIDxzYmhuZHBpby5oPgorI2luY2x1ZGUgPHNiaG5kZG1hLmg+CiAjaW5jbHVkZSA8ZDExLmg+CiAjaW5jbHVkZSA8d2xjX3JhdGUuaD4KICNpbmNsdWRlIDx3bGNfa2V5Lmg+CiAjaW5jbHVkZSA8d2xjX3B1Yi5oPgogI2luY2x1ZGUgPHdsX2RiZy5oPgorI2luY2x1ZGUgPHdsY19ldmVudC5oPgogI2luY2x1ZGUgPHdsY19tYWM4MDIxMS5oPgogI2luY2x1ZGUgPHdsY19ibWFjLmg+CiAjaW5jbHVkZSA8d2xjX3BoeV9oYWwuaD4KQEAgLTU4LDEwICs2MywxMSBAQAogI2RlZmluZSBBTlRfU0VMQ0ZHX0RFRl8yeDQJMHgwMgkvKiBkZWZhdWx0IGFudGVubmEgY29uZmlndXJhdGlvbiAqLwogCiAvKiBzdGF0aWMgZnVuY3Rpb25zICovCi1zdGF0aWMgaW50IHdsY19hbnRzZWxfY2ZndXBkKGFudHNlbF9pbmZvX3QgKmFzaSwgd2xjX2FudHNlbGNmZ190ICphbnRzZWwpOwotc3RhdGljIHU4IHdsY19hbnRzZWxfaWQyYW50Y2ZnKGFudHNlbF9pbmZvX3QgKmFzaSwgdTggaWQpOwotc3RhdGljIHUxNiB3bGNfYW50c2VsX2FudGNmZzJhbnRzZWwoYW50c2VsX2luZm9fdCAqYXNpLCB1OCBhbnRfY2ZnKTsKLXN0YXRpYyB2b2lkIHdsY19hbnRzZWxfaW5pdF9jZmcoYW50c2VsX2luZm9fdCAqYXNpLCB3bGNfYW50c2VsY2ZnX3QgKmFudHNlbCwKK3N0YXRpYyBpbnQgd2xjX2FudHNlbF9jZmd1cGQoc3RydWN0IGFudHNlbF9pbmZvICphc2ksIHdsY19hbnRzZWxjZmdfdCAqYW50c2VsKTsKK3N0YXRpYyB1OCB3bGNfYW50c2VsX2lkMmFudGNmZyhzdHJ1Y3QgYW50c2VsX2luZm8gKmFzaSwgdTggaWQpOworc3RhdGljIHUxNiB3bGNfYW50c2VsX2FudGNmZzJhbnRzZWwoc3RydWN0IGFudHNlbF9pbmZvICphc2ksIHU4IGFudF9jZmcpOworc3RhdGljIHZvaWQgd2xjX2FudHNlbF9pbml0X2NmZyhzdHJ1Y3QgYW50c2VsX2luZm8gKmFzaSwKKwkJCQl3bGNfYW50c2VsY2ZnX3QgKmFudHNlbCwKIAkJCQlib29sIGF1dG9fc2VsKTsKIAogY29uc3QgdTE2IG1pbW9fMng0X2Rpdl9hbnRzZWxwYXRfdGJsW10gPSB7CkBAIC04OCwxNCArOTQsMTUgQEAKIAkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCS8qIHBhdCB0byBhbnRzZWxpZCAqLwogfTsKIAotYW50c2VsX2luZm9fdCAqd2xjX2FudHNlbF9hdHRhY2god2xjX2luZm9fdCAqd2xjLCBvc2xfdCAqb3NoLAotCQkJCQkJICB3bGNfcHViX3QgKnB1YiwKLQkJCQkJCSAgd2xjX2h3X2luZm9fdCAqd2xjX2h3KSB7Ci0JYW50c2VsX2luZm9fdCAqYXNpOworc3RydWN0IGFudHNlbF9pbmZvICp3bGNfYW50c2VsX2F0dGFjaChzdHJ1Y3Qgd2xjX2luZm8gKndsYywKKwkJCQkgICAgICBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwKKwkJCQkgICAgICBzdHJ1Y3Qgd2xjX3B1YiAqcHViLAorCQkJCSAgICAgIHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KSB7CisJc3RydWN0IGFudHNlbF9pbmZvICphc2k7CiAKLQlhc2kgPSBremFsbG9jKHNpemVvZihhbnRzZWxfaW5mb190KSwgR0ZQX0FUT01JQyk7CisJYXNpID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFudHNlbF9pbmZvKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFhc2kpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiB3bGNfYW50c2VsX2F0dGFjaDogb3V0IG9mIG1lbVxuIiwgcHViLT51bml0KSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfYW50c2VsX2F0dGFjaDogb3V0IG9mIG1lbVxuIiwgcHViLT51bml0KTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC0xMjQsNyArMTMxLDcgQEAKIAkJCQlhc2ktPmFudHNlbF9hdmFpbCA9IGZhbHNlOwogCQkJfSBlbHNlIHsKIAkJCQlhc2ktPmFudHNlbF9hdmFpbCA9IGZhbHNlOwotCQkJCVdMX0VSUk9SKCgid2xjX2FudHNlbF9hdHRhY2g6IDJvMyBib2FyZCBjZmcgaW52YWxpZFxuIikpOworCQkJCVdMX0VSUk9SKCJ3bGNfYW50c2VsX2F0dGFjaDogMm8zIGJvYXJkIGNmZyBpbnZhbGlkXG4iKTsKIAkJCQlBU1NFUlQoMCk7CiAJCQl9CiAJCQlicmVhazsKQEAgLTE1Miw3ICsxNTksNyBAQAogCXJldHVybiBhc2k7CiB9CiAKLXZvaWQgd2xjX2FudHNlbF9kZXRhY2goYW50c2VsX2luZm9fdCAqYXNpKQordm9pZCB3bGNfYW50c2VsX2RldGFjaChzdHJ1Y3QgYW50c2VsX2luZm8gKmFzaSkKIHsKIAlpZiAoIWFzaSkKIAkJcmV0dXJuOwpAQCAtMTYwLDcgKzE2Nyw3IEBACiAJa2ZyZWUoYXNpKTsKIH0KIAotdm9pZCB3bGNfYW50c2VsX2luaXQoYW50c2VsX2luZm9fdCAqYXNpKQordm9pZCB3bGNfYW50c2VsX2luaXQoc3RydWN0IGFudHNlbF9pbmZvICphc2kpCiB7CiAJaWYgKChhc2ktPmFudHNlbF90eXBlID09IEFOVFNFTF8yeDMpIHx8CiAJICAgIChhc2ktPmFudHNlbF90eXBlID09IEFOVFNFTF8yeDQpKQpAQCAtMTY5LDcgKzE3Niw3IEBACiAKIC8qIGJvYXJkbGV2ZWwgYW50ZW5uYSBzZWxlY3Rpb246IGluaXQgYW50ZW5uYSBzZWxlY3Rpb24gc3RydWN0dXJlICovCiBzdGF0aWMgdm9pZAotd2xjX2FudHNlbF9pbml0X2NmZyhhbnRzZWxfaW5mb190ICphc2ksIHdsY19hbnRzZWxjZmdfdCAqYW50c2VsLAord2xjX2FudHNlbF9pbml0X2NmZyhzdHJ1Y3QgYW50c2VsX2luZm8gKmFzaSwgd2xjX2FudHNlbGNmZ190ICphbnRzZWwsCiAJCSAgICBib29sIGF1dG9fc2VsKQogewogCWlmIChhc2ktPmFudHNlbF90eXBlID09IEFOVFNFTF8yeDMpIHsKQEAgLTIwMCw3ICsyMDcsNyBAQAogfQogCiB2b2lkIEJDTUZBU1RQQVRICi13bGNfYW50c2VsX2FudGNmZ19nZXQoYW50c2VsX2luZm9fdCAqYXNpLCBib29sIHVzZWRlZiwgYm9vbCBzZWwsCit3bGNfYW50c2VsX2FudGNmZ19nZXQoc3RydWN0IGFudHNlbF9pbmZvICphc2ksIGJvb2wgdXNlZGVmLCBib29sIHNlbCwKIAkJICAgICAgdTggYW50c2VsaWQsIHU4IGZiYW50c2VsaWQsIHU4ICphbnRjZmcsCiAJCSAgICAgIHU4ICpmYmFudGNmZykKIHsKQEAgLTIzMiw3ICsyMzksNyBAQAogfQogCiAvKiBib2FyZGxldmVsIGFudGVubmEgc2VsZWN0aW9uOiBjb252ZXJ0IG1pbW9fYW50c2VsICh1Y29kZSBpbnRlcmZhY2UpIHRvIGlkICovCi11OCB3bGNfYW50c2VsX2FudHNlbDJpZChhbnRzZWxfaW5mb190ICphc2ksIHUxNiBhbnRzZWwpCit1OCB3bGNfYW50c2VsX2FudHNlbDJpZChzdHJ1Y3QgYW50c2VsX2luZm8gKmFzaSwgdTE2IGFudHNlbCkKIHsKIAl1OCBhbnRzZWxpZCA9IDA7CiAKQEAgLTI1MSw3ICsyNTgsNyBAQAogfQogCiAvKiBib2FyZGxldmVsIGFudGVubmEgc2VsZWN0aW9uOiBjb252ZXJ0IGlkIHRvIGFudF9jZmcgKi8KLXN0YXRpYyB1OCB3bGNfYW50c2VsX2lkMmFudGNmZyhhbnRzZWxfaW5mb190ICphc2ksIHU4IGlkKQorc3RhdGljIHU4IHdsY19hbnRzZWxfaWQyYW50Y2ZnKHN0cnVjdCBhbnRzZWxfaW5mbyAqYXNpLCB1OCBpZCkKIHsKIAl1OCBhbnRjZmcgPSBBTlRfU0VMQ0ZHX0RFRl8yeDI7CiAKQEAgLTI3MCw3ICsyNzcsNyBAQAogfQogCiAvKiBib2FyZGxldmVsIGFudGVubmEgc2VsZWN0aW9uOiBjb252ZXJ0IGFudF9jZmcgdG8gbWltb19hbnRzZWwgKHVjb2RlIGludGVyZmFjZSkgKi8KLXN0YXRpYyB1MTYgd2xjX2FudHNlbF9hbnRjZmcyYW50c2VsKGFudHNlbF9pbmZvX3QgKmFzaSwgdTggYW50X2NmZykKK3N0YXRpYyB1MTYgd2xjX2FudHNlbF9hbnRjZmcyYW50c2VsKHN0cnVjdCBhbnRzZWxfaW5mbyAqYXNpLCB1OCBhbnRfY2ZnKQogewogCXU4IGlkeCA9IFdMQ19BTlRJRFhfMTFOKFdMQ19BTlRTRUxfMTFOKGFudF9jZmcpKTsKIAl1MTYgbWltb19hbnRzZWwgPSAwOwpAQCAtMjkwLDkgKzI5Nyw5IEBACiB9CiAKIC8qIGJvYXJkbGV2ZWwgYW50ZW5uYSBzZWxlY3Rpb246IHVjb2RlIGludGVyZmFjZSBjb250cm9sICovCi1zdGF0aWMgaW50IHdsY19hbnRzZWxfY2ZndXBkKGFudHNlbF9pbmZvX3QgKmFzaSwgd2xjX2FudHNlbGNmZ190ICphbnRzZWwpCitzdGF0aWMgaW50IHdsY19hbnRzZWxfY2ZndXBkKHN0cnVjdCBhbnRzZWxfaW5mbyAqYXNpLCB3bGNfYW50c2VsY2ZnX3QgKmFudHNlbCkKIHsKLQl3bGNfaW5mb190ICp3bGMgPSBhc2ktPndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IGFzaS0+d2xjOwogCXU4IGFudF9jZmc7CiAJdTE2IG1pbW9fYW50c2VsOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfYW50c2VsLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfYW50c2VsLmgKaW5kZXggMWQwNDhiYi4uODg3NWI1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2FudHNlbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19hbnRzZWwuaApAQCAtMTYsMTMgKzE2LDE1IEBACiAKICNpZm5kZWYgX3dsY19hbnRzZWxfaF8KICNkZWZpbmUgX3dsY19hbnRzZWxfaF8KLWV4dGVybiBhbnRzZWxfaW5mb190ICp3bGNfYW50c2VsX2F0dGFjaCh3bGNfaW5mb190ICp3bGMsIG9zbF90ICpvc2gsCi0JCQkJCXdsY19wdWJfdCAqcHViLAotCQkJCQl3bGNfaHdfaW5mb190ICp3bGNfaHcpOwotZXh0ZXJuIHZvaWQgd2xjX2FudHNlbF9kZXRhY2goYW50c2VsX2luZm9fdCAqYXNpKTsKLWV4dGVybiB2b2lkIHdsY19hbnRzZWxfaW5pdChhbnRzZWxfaW5mb190ICphc2kpOwotZXh0ZXJuIHZvaWQgd2xjX2FudHNlbF9hbnRjZmdfZ2V0KGFudHNlbF9pbmZvX3QgKmFzaSwgYm9vbCB1c2VkZWYsIGJvb2wgc2VsLAorZXh0ZXJuIHN0cnVjdCBhbnRzZWxfaW5mbyAqd2xjX2FudHNlbF9hdHRhY2goc3RydWN0IHdsY19pbmZvICp3bGMsCisJCQkJCXN0cnVjdCBvc2xfaW5mbyAqb3NoLAorCQkJCQlzdHJ1Y3Qgd2xjX3B1YiAqcHViLAorCQkJCQlzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odyk7CitleHRlcm4gdm9pZCB3bGNfYW50c2VsX2RldGFjaChzdHJ1Y3QgYW50c2VsX2luZm8gKmFzaSk7CitleHRlcm4gdm9pZCB3bGNfYW50c2VsX2luaXQoc3RydWN0IGFudHNlbF9pbmZvICphc2kpOworZXh0ZXJuIHZvaWQgd2xjX2FudHNlbF9hbnRjZmdfZ2V0KHN0cnVjdCBhbnRzZWxfaW5mbyAqYXNpLCBib29sIHVzZWRlZiwKKwkJCQkgIGJvb2wgc2VsLAogCQkJCSAgdTggaWQsIHU4IGZiaWQsIHU4ICphbnRjZmcsCiAJCQkJICB1OCAqZmJhbnRjZmcpOwotZXh0ZXJuIHU4IHdsY19hbnRzZWxfYW50c2VsMmlkKGFudHNlbF9pbmZvX3QgKmFzaSwgdTE2IGFudHNlbCk7CitleHRlcm4gdTggd2xjX2FudHNlbF9hbnRzZWwyaWQoc3RydWN0IGFudHNlbF9pbmZvICphc2ksIHUxNiBhbnRzZWwpOwogI2VuZGlmCQkJCS8qIF93bGNfYW50c2VsX2hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfYm1hYy5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2JtYWMuYwppbmRleCBiNzBmOWQwLi42OWY2MDBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfYm1hYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19ibWFjLmMKQEAgLTE0LDEzICsxNCwxMyBAQAogICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCi0jaWZuZGVmIFdMQ19MT1cKLSNlcnJvciAiVGhpcyBmaWxlIG5lZWRzIFdMQ19MT1ciCi0jZW5kaWYKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPHdsY19jZmcuaD4KLSNpbmNsdWRlIDxsaW51eHZlci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8YmNtZGVmcy5oPgogI2luY2x1ZGUgPG9zbC5oPgogI2luY2x1ZGUgPHByb3RvLzgwMi4xMS5oPgpAQCAtNDIsMTIgKzQyLDE0IEBACiAjaW5jbHVkZSA8d2xjX2NoYW5uZWwuaD4KICNpbmNsdWRlIDxiY21zcm9tLmg+CiAjaW5jbHVkZSA8d2xjX2tleS5oPgorI2luY2x1ZGUgPGJjbWRldnMuaD4KIC8qIEJNQUNfTk9URTogYSBXTENfSElHSCBjb21waWxlIGluY2x1ZGUgb2Ygd2xjLmggYWRkcyBpbiBtb3JlIHN0cnVjdHVyZXMgYW5kIHR5cGUKICAqIGRlcGVuZGVuY2llcy4gTmVlZCB0byBpbmNsdWRlIHRoZXNlIHRvIGZpbGVzIHRvIGFsbG93IGEgY2xlYW4gaW5jbHVkZSBvZiB3bGMuaAogICogd2l0aCBXTENfSElHSCBkZWZpbmVkLgogICogQXQgc29tZSBwb2ludCB3ZSBtYXkgYmUgYWJsZSB0byBza2lwIHRoZSBpbmNsdWRlIG9mIHdsYy5oIGFuZCBpbnN0ZWFkIGp1c3QKICAqIGRlZmluZSBhIHN0dWIgd2xjX2luZm8gYW5kIGJhbmQgc3RydWN0IHRvIGFsbG93IHJwYyBjYWxscyB0byBnZXQgdGhlIHJwYyBoYW5kbGUuCiAgKi8KKyNpbmNsdWRlIDx3bGNfZXZlbnQuaD4KICNpbmNsdWRlIDx3bGNfbWFjODAyMTEuaD4KICNpbmNsdWRlIDx3bGNfYm1hYy5oPgogI2luY2x1ZGUgPHdsY19waHlfc2hpbS5oPgpAQCAtNTUsOSArNTcsNiBAQAogI2luY2x1ZGUgPHdsX2V4cG9ydC5oPgogI2luY2x1ZGUgIndsX3Vjb2RlLmgiCiAjaW5jbHVkZSAiZDExdWNvZGVfZXh0LmgiCi0jaWZkZWYgQkNNU0RJTwotI2luY2x1ZGUgPGJjbXNkaC5oPgotI2VuZGlmCiAjaW5jbHVkZSA8YmNtb3RwLmg+CiAKIC8qIEJNQUNfTk9URTogV2l0aCBXTENfSElHSCBkZWZpbmVkLCBzb21lIGZucyBpbiB0aGlzIGZpbGUgbWFrZSBjYWxscyB0byBoaWdoIGxldmVsCkBAIC02OSw2ICs2OCw3IEBACiAjaW5jbHVkZSA8cGNpZV9jb3JlLmg+CiAKICNpbmNsdWRlIDx3bGNfYWxsb2MuaD4KKyNpbmNsdWRlIDx3bF9kYmcuaD4KIAogI2RlZmluZQlUSU1FUl9JTlRFUlZBTF9XQVRDSERPR19CTUFDCTEwMDAJLyogd2F0Y2hkb2cgdGltZXIsIGluIHVuaXQgb2YgbXMgKi8KIApAQCAtMTEzLDY0ICsxMTMsNjUgQEAKIAl7OSwgNTgsIDIyLCAxNCwgMTQsIDV9LAkvKiBjb3JlcmV2IDI0OiAyMzA0LCAxNDg0OCwgNTYzMiwgMzU4NCwgMzU4NCwgMTI4MCAqLwogfTsKIAotc3RhdGljIHZvaWQgd2xjX2Nsa2N0bF9jbGsod2xjX2h3X2luZm9fdCAqd2xjLCB1aW50IG1vZGUpOwotc3RhdGljIHZvaWQgd2xjX2NvcmVpbml0KHdsY19pbmZvX3QgKndsYyk7CitzdGF0aWMgdm9pZCB3bGNfY2xrY3RsX2NsayhzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsYywgdWludCBtb2RlKTsKK3N0YXRpYyB2b2lkIHdsY19jb3JlaW5pdChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CiAKIC8qIHVzZWQgYnkgd2xjX3dha2V1Y29kZV9pbml0KCkgKi8KLXN0YXRpYyB2b2lkIHdsY193cml0ZV9pbml0cyh3bGNfaHdfaW5mb190ICp3bGNfaHcsIGNvbnN0IGQxMWluaXRfdCAqaW5pdHMpOwotc3RhdGljIHZvaWQgd2xjX3Vjb2RlX3dyaXRlKHdsY19od19pbmZvX3QgKndsY19odywgY29uc3QgdTMyIHVjb2RlW10sCitzdGF0aWMgdm9pZCB3bGNfd3JpdGVfaW5pdHMoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIGNvbnN0IGQxMWluaXRfdCAqaW5pdHMpOworc3RhdGljIHZvaWQgd2xjX3Vjb2RlX3dyaXRlKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBjb25zdCB1MzIgdWNvZGVbXSwKIAkJCSAgICBjb25zdCB1aW50IG5ieXRlcyk7Ci1zdGF0aWMgdm9pZCB3bGNfdWNvZGVfZG93bmxvYWQod2xjX2h3X2luZm9fdCAqd2xjKTsKLXN0YXRpYyB2b2lkIHdsY191Y29kZV90eGFudF9zZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3KTsKK3N0YXRpYyB2b2lkIHdsY191Y29kZV9kb3dubG9hZChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsYyk7CitzdGF0aWMgdm9pZCB3bGNfdWNvZGVfdHhhbnRfc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KTsKIAogLyogdXNlZCBieSB3bGNfZHBjKCkgKi8KLXN0YXRpYyBib29sIHdsY19ibWFjX2RvdHhzdGF0dXMod2xjX2h3X2luZm9fdCAqd2xjLCB0eF9zdGF0dXNfdCAqdHhzLAorc3RhdGljIGJvb2wgd2xjX2JtYWNfZG90eHN0YXR1cyhzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsYywgdHhfc3RhdHVzX3QgKnR4cywKIAkJCQl1MzIgczIpOwotc3RhdGljIGJvb2wgd2xjX2JtYWNfdHhzdGF0dXNfY29yZXJldjQod2xjX2h3X2luZm9fdCAqd2xjKTsKLXN0YXRpYyBib29sIHdsY19ibWFjX3R4c3RhdHVzKHdsY19od19pbmZvX3QgKndsYywgYm9vbCBib3VuZCwgYm9vbCAqZmF0YWwpOwotc3RhdGljIGJvb2wgd2xjX2JtYWNfcmVjdih3bGNfaHdfaW5mb190ICp3bGNfaHcsIHVpbnQgZmlmbywgYm9vbCBib3VuZCk7CitzdGF0aWMgYm9vbCB3bGNfYm1hY190eHN0YXR1c19jb3JlcmV2NChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsYyk7CitzdGF0aWMgYm9vbCB3bGNfYm1hY190eHN0YXR1cyhzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsYywgYm9vbCBib3VuZCwgYm9vbCAqZmF0YWwpOworc3RhdGljIGJvb2wgd2xjX2JtYWNfcmVjdihzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdWludCBmaWZvLCBib29sIGJvdW5kKTsKIAogLyogdXNlZCBieSB3bGNfZG93bigpICovCi1zdGF0aWMgdm9pZCB3bGNfZmx1c2hxdWV1ZXMod2xjX2luZm9fdCAqd2xjKTsKK3N0YXRpYyB2b2lkIHdsY19mbHVzaHF1ZXVlcyhzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CiAKLXN0YXRpYyB2b2lkIHdsY193cml0ZV9taGYod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1MTYgKm1oZnMpOwotc3RhdGljIHZvaWQgd2xjX21jdHJsX3Jlc2V0KHdsY19od19pbmZvX3QgKndsY19odyk7Ci1zdGF0aWMgdm9pZCB3bGNfY29yZXJldl9maWZvZml4dXAod2xjX2h3X2luZm9fdCAqd2xjX2h3KTsKK3N0YXRpYyB2b2lkIHdsY193cml0ZV9taGYoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHUxNiAqbWhmcyk7CitzdGF0aWMgdm9pZCB3bGNfbWN0cmxfcmVzZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpOworc3RhdGljIHZvaWQgd2xjX2NvcmVyZXZfZmlmb2ZpeHVwKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KTsKIAogLyogTG93IExldmVsIFByb3RvdHlwZXMgKi8KLXN0YXRpYyB1MTYgd2xjX2JtYWNfcmVhZF9vYmptZW0od2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1aW50IG9mZnNldCwKK3N0YXRpYyB1MTYgd2xjX2JtYWNfcmVhZF9vYmptZW0oc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHVpbnQgb2Zmc2V0LAogCQkJCSAgIHUzMiBzZWwpOwotc3RhdGljIHZvaWQgd2xjX2JtYWNfd3JpdGVfb2JqbWVtKHdsY19od19pbmZvX3QgKndsY19odywgdWludCBvZmZzZXQsIHUxNiB2LAotCQkJCSAgdTMyIHNlbCk7Ci1zdGF0aWMgYm9vbCB3bGNfYm1hY19hdHRhY2hfZG1hcGlvKHdsY19pbmZvX3QgKndsYywgdWludCBqLCBib29sIHdtZSk7Ci1zdGF0aWMgdm9pZCB3bGNfYm1hY19kZXRhY2hfZG1hcGlvKHdsY19od19pbmZvX3QgKndsY19odyk7Ci1zdGF0aWMgdm9pZCB3bGNfdWNvZGVfYnNpbml0KHdsY19od19pbmZvX3QgKndsY19odyk7Ci1zdGF0aWMgYm9vbCB3bGNfdmFsaWRib2FyZHR5cGUod2xjX2h3X2luZm9fdCAqd2xjKTsKLXN0YXRpYyBib29sIHdsY19pc2dvb2RjaGlwKHdsY19od19pbmZvX3QgKndsY19odyk7Ci1zdGF0aWMgY2hhciAqd2xjX2dldF9tYWNhZGRyKHdsY19od19pbmZvX3QgKndsY19odyk7Ci1zdGF0aWMgdm9pZCB3bGNfbWhmZGVmKHdsY19pbmZvX3QgKndsYywgdTE2ICptaGZzLCB1MTYgbWhmMl9pbml0KTsKLXN0YXRpYyB2b2lkIHdsY19tY3RybF93cml0ZSh3bGNfaHdfaW5mb190ICp3bGNfaHcpOwotc3RhdGljIHZvaWQgd2xjX3Vjb2RlX211dGVfb3ZlcnJpZGVfc2V0KHdsY19od19pbmZvX3QgKndsY19odyk7Ci1zdGF0aWMgdm9pZCB3bGNfdWNvZGVfbXV0ZV9vdmVycmlkZV9jbGVhcih3bGNfaHdfaW5mb190ICp3bGNfaHcpOwotc3RhdGljIHUzMiB3bGNfd2xpbnRyc29mZih3bGNfaW5mb190ICp3bGMpOwotc3RhdGljIHZvaWQgd2xjX3dsaW50cnNyZXN0b3JlKHdsY19pbmZvX3QgKndsYywgdTMyIG1hY2ludG1hc2spOwotc3RhdGljIHZvaWQgd2xjX2dwaW9faW5pdCh3bGNfaW5mb190ICp3bGMpOwotc3RhdGljIHZvaWQgd2xjX3dyaXRlX2h3X2JjbnRlbXBsYXRlMCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHZvaWQgKmJjbiwKK3N0YXRpYyB2b2lkIHdsY19ibWFjX3dyaXRlX29iam1lbShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdWludCBvZmZzZXQsCisJCQkJICB1MTYgdiwgdTMyIHNlbCk7CitzdGF0aWMgYm9vbCB3bGNfYm1hY19hdHRhY2hfZG1hcGlvKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1aW50IGosIGJvb2wgd21lKTsKK3N0YXRpYyB2b2lkIHdsY19ibWFjX2RldGFjaF9kbWFwaW8oc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpOworc3RhdGljIHZvaWQgd2xjX3Vjb2RlX2JzaW5pdChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odyk7CitzdGF0aWMgYm9vbCB3bGNfdmFsaWRib2FyZHR5cGUoc3RydWN0IHdsY19od19pbmZvICp3bGMpOworc3RhdGljIGJvb2wgd2xjX2lzZ29vZGNoaXAoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpOworc3RhdGljIGNoYXIgKndsY19nZXRfbWFjYWRkcihzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odyk7CitzdGF0aWMgdm9pZCB3bGNfbWhmZGVmKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1MTYgKm1oZnMsIHUxNiBtaGYyX2luaXQpOworc3RhdGljIHZvaWQgd2xjX21jdHJsX3dyaXRlKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KTsKK3N0YXRpYyB2b2lkIHdsY191Y29kZV9tdXRlX292ZXJyaWRlX3NldChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odyk7CitzdGF0aWMgdm9pZCB3bGNfdWNvZGVfbXV0ZV9vdmVycmlkZV9jbGVhcihzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odyk7CitzdGF0aWMgdTMyIHdsY193bGludHJzb2ZmKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK3N0YXRpYyB2b2lkIHdsY193bGludHJzcmVzdG9yZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTMyIG1hY2ludG1hc2spOworc3RhdGljIHZvaWQgd2xjX2dwaW9faW5pdChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CitzdGF0aWMgdm9pZCB3bGNfd3JpdGVfaHdfYmNudGVtcGxhdGUwKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB2b2lkICpiY24sCiAJCQkJICAgICAgaW50IGxlbik7Ci1zdGF0aWMgdm9pZCB3bGNfd3JpdGVfaHdfYmNudGVtcGxhdGUxKHdsY19od19pbmZvX3QgKndsY19odywgdm9pZCAqYmNuLAorc3RhdGljIHZvaWQgd2xjX3dyaXRlX2h3X2JjbnRlbXBsYXRlMShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdm9pZCAqYmNuLAogCQkJCSAgICAgIGludCBsZW4pOwotc3RhdGljIHZvaWQgd2xjX2JtYWNfYnNpbml0KHdsY19pbmZvX3QgKndsYywgY2hhbnNwZWNfdCBjaGFuc3BlYyk7Ci1zdGF0aWMgdTMyIHdsY19zZXRiYW5kX2luYWN0KHdsY19pbmZvX3QgKndsYywgdWludCBiYW5kdW5pdCk7Ci1zdGF0aWMgdm9pZCB3bGNfYm1hY19zZXRiYW5kKHdsY19od19pbmZvX3QgKndsY19odywgdWludCBiYW5kdW5pdCwKK3N0YXRpYyB2b2lkIHdsY19ibWFjX2JzaW5pdChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgY2hhbnNwZWNfdCBjaGFuc3BlYyk7CitzdGF0aWMgdTMyIHdsY19zZXRiYW5kX2luYWN0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1aW50IGJhbmR1bml0KTsKK3N0YXRpYyB2b2lkIHdsY19ibWFjX3NldGJhbmQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHVpbnQgYmFuZHVuaXQsCiAJCQkgICAgIGNoYW5zcGVjX3QgY2hhbnNwZWMpOwotc3RhdGljIHZvaWQgd2xjX2JtYWNfdXBkYXRlX3Nsb3RfdGltaW5nKHdsY19od19pbmZvX3QgKndsY19odywgYm9vbCBzaG9ydHNsb3QpOwotc3RhdGljIHZvaWQgd2xjX3VwZF9vZmRtX3BjdGwxX3RhYmxlKHdsY19od19pbmZvX3QgKndsY19odyk7Ci1zdGF0aWMgdTE2IHdsY19ibWFjX29mZG1fcmF0ZXRhYmxlX29mZnNldCh3bGNfaHdfaW5mb190ICp3bGNfaHcsCitzdGF0aWMgdm9pZCB3bGNfYm1hY191cGRhdGVfc2xvdF90aW1pbmcoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsCisJCQkJCWJvb2wgc2hvcnRzbG90KTsKK3N0YXRpYyB2b2lkIHdsY191cGRfb2ZkbV9wY3RsMV90YWJsZShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odyk7CitzdGF0aWMgdTE2IHdsY19ibWFjX29mZG1fcmF0ZXRhYmxlX29mZnNldChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywKIAkJCQkJICAgICB1OCByYXRlKTsKIAogLyogPT09IExvdyBMZXZlbCBmdW5jdGlvbnMgPT09ICovCiAKLXZvaWQgd2xjX2JtYWNfc2V0X3Nob3J0c2xvdCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIGJvb2wgc2hvcnRzbG90KQordm9pZCB3bGNfYm1hY19zZXRfc2hvcnRzbG90KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBib29sIHNob3J0c2xvdCkKIHsKIAl3bGNfaHctPnNob3J0c2xvdCA9IHNob3J0c2xvdDsKIApAQCAtMTg2LDkgKzE4NywxMCBAQAogICogb3Igc2hvcnRzbG90IDExZyAoOXVzIHNsb3RzKQogICogVGhlIFBTTSBuZWVkcyB0byBiZSBzdXNwZW5kZWQgZm9yIHRoaXMgY2FsbC4KICAqLwotc3RhdGljIHZvaWQgd2xjX2JtYWNfdXBkYXRlX3Nsb3RfdGltaW5nKHdsY19od19pbmZvX3QgKndsY19odywgYm9vbCBzaG9ydHNsb3QpCitzdGF0aWMgdm9pZCB3bGNfYm1hY191cGRhdGVfc2xvdF90aW1pbmcoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsCisJCQkJCWJvb2wgc2hvcnRzbG90KQogewotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAJZDExcmVnc190ICpyZWdzOwogCiAJb3NoID0gd2xjX2h3LT5vc2g7CkBAIC0yMDUsNyArMjA3LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIFdMQkFORElOSVRGTih3bGNfdWNvZGVfYnNpbml0KSAod2xjX2h3X2luZm9fdCAqd2xjX2h3KQorc3RhdGljIHZvaWQgV0xCQU5ESU5JVEZOKHdsY191Y29kZV9ic2luaXQpIChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odykKIHsKIAkvKiBpbml0IG1pY3JvY29kZSBob3N0IGZsYWdzICovCiAJd2xjX3dyaXRlX21oZih3bGNfaHcsIHdsY19ody0+YmFuZC0+bWhmcyk7CkBAIC0yMTUsMzAgKzIxNywzMiBAQAogCQlpZiAoV0xDSVNOUEhZKHdsY19ody0+YmFuZCkpIHsKIAkJCXdsY193cml0ZV9pbml0cyh3bGNfaHcsIGQxMW4wYnNpbml0dmFsczE2KTsKIAkJfSBlbHNlIHsKLQkJCVdMX0VSUk9SKCgiJXM6IHdsJWQ6IHVuc3VwcG9ydGVkIHBoeSBpbiBjb3JlcmV2ICVkXG4iLAotCQkJCSAgX19mdW5jX18sIHdsY19ody0+dW5pdCwgd2xjX2h3LT5jb3JlcmV2KSk7CisJCQlXTF9FUlJPUigiJXM6IHdsJWQ6IHVuc3VwcG9ydGVkIHBoeSBpbiBjb3JlcmV2ICVkXG4iLAorCQkJCSBfX2Z1bmNfXywgd2xjX2h3LT51bml0LCB3bGNfaHctPmNvcmVyZXYpOwogCQl9CiAJfSBlbHNlIHsKIAkJaWYgKEQxMVJFVl9JUyh3bGNfaHctPmNvcmVyZXYsIDI0KSkgewogCQkJaWYgKFdMQ0lTTENOUEhZKHdsY19ody0+YmFuZCkpIHsKIAkJCQl3bGNfd3JpdGVfaW5pdHMod2xjX2h3LCBkMTFsY24wYnNpbml0dmFsczI0KTsKIAkJCX0gZWxzZQotCQkJCVdMX0VSUk9SKCgiJXM6IHdsJWQ6IHVuc3VwcG9ydGVkIHBoeSBpbiBjb3JlcmV2ICVkXG4iLCBfX2Z1bmNfXywgd2xjX2h3LT51bml0LCB3bGNfaHctPmNvcmVyZXYpKTsKKwkJCQlXTF9FUlJPUigiJXM6IHdsJWQ6IHVuc3VwcG9ydGVkIHBoeSBpbiBjb3JlcmV2ICVkXG4iLAorCQkJCQkgX19mdW5jX18sIHdsY19ody0+dW5pdCwKKwkJCQkJIHdsY19ody0+Y29yZXJldik7CiAJCX0gZWxzZSB7Ci0JCQlXTF9FUlJPUigoIiVzOiB3bCVkOiB1bnN1cHBvcnRlZCBjb3JlcmV2ICVkXG4iLAotCQkJCSAgX19mdW5jX18sIHdsY19ody0+dW5pdCwgd2xjX2h3LT5jb3JlcmV2KSk7CisJCQlXTF9FUlJPUigiJXM6IHdsJWQ6IHVuc3VwcG9ydGVkIGNvcmVyZXYgJWRcbiIsCisJCQkJIF9fZnVuY19fLCB3bGNfaHctPnVuaXQsIHdsY19ody0+Y29yZXJldik7CiAJCX0KIAl9CiB9CiAKIC8qIHN3aXRjaCB0byBuZXcgYmFuZCBidXQgbGVhdmUgaXQgaW5hY3RpdmUgKi8KLXN0YXRpYyB1MzIgV0xCQU5ESU5JVEZOKHdsY19zZXRiYW5kX2luYWN0KSAod2xjX2luZm9fdCAqd2xjLCB1aW50IGJhbmR1bml0KQorc3RhdGljIHUzMiBXTEJBTkRJTklURk4od2xjX3NldGJhbmRfaW5hY3QpIChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdWludCBiYW5kdW5pdCkKIHsKLQl3bGNfaHdfaW5mb190ICp3bGNfaHcgPSB3bGMtPmh3OworCXN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3ID0gd2xjLT5odzsKIAl1MzIgbWFjaW50bWFzazsKIAl1MzIgdG1wOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiB3bGNfc2V0YmFuZF9pbmFjdFxuIiwgd2xjX2h3LT51bml0KSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY19zZXRiYW5kX2luYWN0XG4iLCB3bGNfaHctPnVuaXQpOwogCiAJQVNTRVJUKGJhbmR1bml0ICE9IHdsY19ody0+YmFuZC0+YmFuZHVuaXQpOwogCUFTU0VSVChzaV9pc2NvcmV1cCh3bGNfaHctPnNpaCkpOwpAQCAtMjY5LDI0ICsyNzMsMjQgQEAKICAqIFBhcmFtICdib3VuZCcgaW5kaWNhdGVzIG1heC4gIyBmcmFtZXMgdG8gcHJvY2VzcyBiZWZvcmUgYnJlYWsgb3V0LgogICovCiBzdGF0aWMgYm9vbCBCQ01GQVNUUEFUSAotd2xjX2JtYWNfcmVjdih3bGNfaHdfaW5mb190ICp3bGNfaHcsIHVpbnQgZmlmbywgYm9vbCBib3VuZCkKK3dsY19ibWFjX3JlY3Yoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHVpbnQgZmlmbywgYm9vbCBib3VuZCkKIHsKLQl2b2lkICpwOwotCXZvaWQgKmhlYWQgPSBOVUxMOwotCXZvaWQgKnRhaWwgPSBOVUxMOworCXN0cnVjdCBza19idWZmICpwOworCXN0cnVjdCBza19idWZmICpoZWFkID0gTlVMTDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqdGFpbCA9IE5VTEw7CiAJdWludCBuID0gMDsKIAl1aW50IGJvdW5kX2xpbWl0ID0gYm91bmQgPyB3bGNfaHctPndsYy0+cHViLT50dW5hYmxlcy0+cnhibmQgOiAtMTsKIAl1MzIgdHNmX2gsIHRzZl9sOwogCXdsY19kMTFyeGhkcl90ICp3bGNfcnhoZHIgPSBOVUxMOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiAlc1xuIiwgd2xjX2h3LT51bml0LCBfX2Z1bmNfXykpOworCVdMX1RSQUNFKCJ3bCVkOiAlc1xuIiwgd2xjX2h3LT51bml0LCBfX2Z1bmNfXyk7CiAJLyogZ2F0aGVyIHJlY2VpdmVkIGZyYW1lcyAqLwogCXdoaWxlICgocCA9IGRtYV9yeCh3bGNfaHctPmRpW2ZpZm9dKSkpIHsKIAogCQlpZiAoIXRhaWwpCiAJCQloZWFkID0gdGFpbCA9IHA7CiAJCWVsc2UgewotCQkJUEtUU0VUTElOSyh0YWlsLCBwKTsKKwkJCXRhaWwtPnByZXYgPSBwOwogCQkJdGFpbCA9IHA7CiAJCX0KIApAQCAtMzAzLDExICszMDcsMTEgQEAKIAogCS8qIHByb2Nlc3MgZWFjaCBmcmFtZSAqLwogCXdoaWxlICgocCA9IGhlYWQpICE9IE5VTEwpIHsKLQkJaGVhZCA9IFBLVExJTksoaGVhZCk7Ci0JCVBLVFNFVExJTksocCwgTlVMTCk7CisJCWhlYWQgPSBoZWFkLT5wcmV2OworCQlwLT5wcmV2ID0gTlVMTDsKIAogCQkvKiByZWNvcmQgdGhlIHRzZl9sIGluIHdsY19yeGQxMWhkciAqLwotCQl3bGNfcnhoZHIgPSAod2xjX2QxMXJ4aGRyX3QgKikgUEtUREFUQShwKTsKKwkJd2xjX3J4aGRyID0gKHdsY19kMTFyeGhkcl90ICopIHAtPmRhdGE7CiAJCXdsY19yeGhkci0+dHNmX2wgPSBodG9sMzIodHNmX2wpOwogCiAJCS8qIGNvbXB1dGUgdGhlIFJTU0kgZnJvbSBkMTFyeGhkciBhbmQgcmVjb3JkIGl0IGluIHdsY19yeGQxMWhyICovCkBAIC0zMjMsMTUgKzMyNywxNSBAQAogICogICBSZXR1cm4gdHJ1ZSBpZiBhbm90aGVyIGRwYyBuZWVkcyB0byBiZSByZS1zY2hlZHVsZWQuIGZhbHNlIG90aGVyd2lzZS4KICAqICAgUGFyYW0gJ2JvdW5kZWQnIGluZGljYXRlcyBpZiBhcHBsaWNhYmxlIGxvb3BzIHNob3VsZCBiZSBib3VuZGVkLgogICovCi1ib29sIEJDTUZBU1RQQVRIIHdsY19kcGMod2xjX2luZm9fdCAqd2xjLCBib29sIGJvdW5kZWQpCitib29sIEJDTUZBU1RQQVRIIHdsY19kcGMoc3RydWN0IHdsY19pbmZvICp3bGMsIGJvb2wgYm91bmRlZCkKIHsKIAl1MzIgbWFjaW50c3RhdHVzOwotCXdsY19od19pbmZvX3QgKndsY19odyA9IHdsYy0+aHc7CisJc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcgPSB3bGMtPmh3OwogCWQxMXJlZ3NfdCAqcmVncyA9IHdsY19ody0+cmVnczsKIAlib29sIGZhdGFsID0gZmFsc2U7CiAKIAlpZiAoREVWSUNFUkVNT1ZFRCh3bGMpKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogJXM6IGRlYWQgY2hpcFxuIiwgd2xjX2h3LT51bml0LCBfX2Z1bmNfXykpOworCQlXTF9FUlJPUigid2wlZDogJXM6IGRlYWQgY2hpcFxuIiwgd2xjX2h3LT51bml0LCBfX2Z1bmNfXyk7CiAJCXdsX2Rvd24od2xjLT53bCk7CiAJCXJldHVybiBmYWxzZTsKIAl9CkBAIC0zNDAsOCArMzQ0LDggQEAKIAltYWNpbnRzdGF0dXMgPSB3bGMtPm1hY2ludHN0YXR1czsKIAl3bGMtPm1hY2ludHN0YXR1cyA9IDA7CiAKLQlXTF9UUkFDRSgoIndsJWQ6IHdsY19kcGM6IG1hY2ludHN0YXR1cyAweCV4XG4iLCB3bGNfaHctPnVuaXQsCi0JCSAgbWFjaW50c3RhdHVzKSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY19kcGM6IG1hY2ludHN0YXR1cyAweCV4XG4iLAorCQkgd2xjX2h3LT51bml0LCBtYWNpbnRzdGF0dXMpOwogCiAJaWYgKG1hY2ludHN0YXR1cyAmIE1JX1BSUSkgewogCQkvKiBQcm9jZXNzIHByb2JlIHJlcXVlc3QgRklGTyAqLwpAQCAtMzY0LDcgKzM2OCw3IEBACiAJCWlmICh3bGNfYm1hY190eHN0YXR1cyh3bGMtPmh3LCBib3VuZGVkLCAmZmF0YWwpKQogCQkJd2xjLT5tYWNpbnRzdGF0dXMgfD0gTUlfVEZTOwogCQlpZiAoZmF0YWwpIHsKLQkJCVdMX0VSUk9SKCgiTUlfVEZTOiBmYXRhbFxuIikpOworCQkJV0xfRVJST1IoIk1JX1RGUzogZmF0YWxcbiIpOwogCQkJZ290byBmYXRhbDsKIAkJfQogCX0KQEAgLTM3NCw3ICszNzgsNyBAQAogCiAJLyogQVRJTSB3aW5kb3cgZW5kICovCiAJaWYgKG1hY2ludHN0YXR1cyAmIE1JX0FUSU1XSU5FTkQpIHsKLQkJV0xfVFJBQ0UoKCJ3bGNfaXNyOiBlbmQgb2YgQVRJTSB3aW5kb3dcbiIpKTsKKwkJV0xfVFJBQ0UoIndsY19pc3I6IGVuZCBvZiBBVElNIHdpbmRvd1xuIik7CiAKIAkJT1JfUkVHKHdsY19ody0+b3NoLCAmcmVncy0+bWFjY29tbWFuZCwgd2xjLT5xdmFsaWQpOwogCQl3bGMtPnF2YWxpZCA9IDA7CkBAIC0zOTUsNyArMzk5LDcgQEAKIAkvKiBUWCBGSUZPIHN1c3BlbmQvZmx1c2ggY29tcGxldGlvbiAqLwogCWlmIChtYWNpbnRzdGF0dXMgJiBNSV9UWFNUT1ApIHsKIAkJaWYgKHdsY19ibWFjX3R4X2ZpZm9fc3VzcGVuZGVkKHdsY19odywgVFhfREFUQV9GSUZPKSkgewotCQkJLyogICAgICBXTF9FUlJPUigoImRwYzogZmlmb19zdXNwZW5kX2NvbWxldGVcbiIpKTsgKi8KKwkJCS8qICAgICAgV0xfRVJST1IoImRwYzogZmlmb19zdXNwZW5kX2NvbWxldGVcbiIpOyAqLwogCQl9CiAJfQogCkBAIC00MDUsMTEgKzQwOSwxMiBAQAogCX0KIAogCWlmIChtYWNpbnRzdGF0dXMgJiBNSV9HUDApIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiBQU00gbWljcm9jb2RlIHdhdGNoZG9nIGZpcmVkIGF0ICVkIChzZWNvbmRzKS4gUmVzZXR0aW5nLlxuIiwgd2xjX2h3LT51bml0LCB3bGNfaHctPm5vdykpOworCQlXTF9FUlJPUigid2wlZDogUFNNIG1pY3JvY29kZSB3YXRjaGRvZyBmaXJlZCBhdCAlZCAoc2Vjb25kcykuIFJlc2V0dGluZy5cbiIsCisJCQkgd2xjX2h3LT51bml0LCB3bGNfaHctPm5vdyk7CiAKIAkJcHJpbnRrX29uY2UoIiVzIDogUFNNIFdhdGNoZG9nLCBjaGlwaWQgMHgleCwgY2hpcHJldiAweCV4XG4iLAotCQkJICAgIF9fZnVuY19fLCBDSElQSUQod2xjX2h3LT5zaWgtPmNoaXApLAotCQkJICAgIENISVBSRVYod2xjX2h3LT5zaWgtPmNoaXByZXYpKTsKKwkJCQkJX19mdW5jX18sIHdsY19ody0+c2loLT5jaGlwLAorCQkJCQl3bGNfaHctPnNpaC0+Y2hpcHJldik7CiAKIAkJV0xDTlRJTkNSKHdsYy0+cHViLT5fY250LT5wc213ZHMpOwogCkBAIC00MjcsNyArNDMyLDggQEAKIAkJdTMyIHJmZCA9IFJfUkVHKHdsY19ody0+b3NoLCAmcmVncy0+cGh5ZGVidWcpICYgUERCR19SRkQ7CiAjZW5kaWYKIAotCQlXTF9FUlJPUigoIndsJWQ6IE1BQyBEZXRlY3RlZCBhIGNoYW5nZSBvbiB0aGUgUkYgRGlzYWJsZSBJbnB1dCAweCV4XG4iLCB3bGNfaHctPnVuaXQsIHJmZCkpOworCQlXTF9FUlJPUigid2wlZDogTUFDIERldGVjdGVkIGEgY2hhbmdlIG9uIHRoZSBSRiBEaXNhYmxlIElucHV0IDB4JXhcbiIsCisJCQkgd2xjX2h3LT51bml0LCByZmQpOwogCiAJCVdMQ05USU5DUih3bGMtPnB1Yi0+X2NudC0+cmZkaXNhYmxlKTsKIAl9CkBAIC00NTIsMTAgKzQ1OCwxMCBAQAogLyogY29tbW9uIGxvdy1sZXZlbCB3YXRjaGRvZyBjb2RlICovCiB2b2lkIHdsY19ibWFjX3dhdGNoZG9nKHZvaWQgKmFyZykKIHsKLQl3bGNfaW5mb190ICp3bGMgPSAod2xjX2luZm9fdCAqKSBhcmc7Ci0Jd2xjX2h3X2luZm9fdCAqd2xjX2h3ID0gd2xjLT5odzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IChzdHJ1Y3Qgd2xjX2luZm8gKikgYXJnOworCXN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3ID0gd2xjLT5odzsKIAotCVdMX1RSQUNFKCgid2wlZDogd2xjX2JtYWNfd2F0Y2hkb2dcbiIsIHdsY19ody0+dW5pdCkpOworCVdMX1RSQUNFKCJ3bCVkOiB3bGNfYm1hY193YXRjaGRvZ1xuIiwgd2xjX2h3LT51bml0KTsKIAogCWlmICghd2xjX2h3LT51cCkKIAkJcmV0dXJuOwpAQCAtNDc2LDEzICs0ODIsMTMgQEAKIH0KIAogdm9pZAotd2xjX2JtYWNfc2V0X2NoYW5zcGVjKHdsY19od19pbmZvX3QgKndsY19odywgY2hhbnNwZWNfdCBjaGFuc3BlYywgYm9vbCBtdXRlLAotCQkgICAgICBzdHJ1Y3QgdHhwd3JfbGltaXRzICp0eHB3cikKK3dsY19ibWFjX3NldF9jaGFuc3BlYyhzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgY2hhbnNwZWNfdCBjaGFuc3BlYywKKwkJICAgICAgYm9vbCBtdXRlLCBzdHJ1Y3QgdHhwd3JfbGltaXRzICp0eHB3cikKIHsKIAl1aW50IGJhbmR1bml0OwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiB3bGNfYm1hY19zZXRfY2hhbnNwZWMgMHgleFxuIiwgd2xjX2h3LT51bml0LAotCQkgIGNoYW5zcGVjKSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY19ibWFjX3NldF9jaGFuc3BlYyAweCV4XG4iLAorCQkgd2xjX2h3LT51bml0LCBjaGFuc3BlYyk7CiAKIAl3bGNfaHctPmNoYW5zcGVjID0gY2hhbnNwZWM7CiAKQEAgLTUyMCw3ICs1MjYsOCBAQAogCX0KIH0KIAotaW50IHdsY19ibWFjX3JldmluZm9fZ2V0KHdsY19od19pbmZvX3QgKndsY19odywgd2xjX2JtYWNfcmV2aW5mb190ICpyZXZpbmZvKQoraW50IHdsY19ibWFjX3JldmluZm9fZ2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LAorCQkJIHdsY19ibWFjX3JldmluZm9fdCAqcmV2aW5mbykKIHsKIAlzaV90ICpzaWggPSB3bGNfaHctPnNpaDsKIAl1aW50IGlkeDsKQEAgLTU1OCwyMCArNTY1LDIwIEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCB3bGNfYm1hY19zdGF0ZV9nZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB3bGNfYm1hY19zdGF0ZV90ICpzdGF0ZSkKK2ludCB3bGNfYm1hY19zdGF0ZV9nZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHdsY19ibWFjX3N0YXRlX3QgKnN0YXRlKQogewogCXN0YXRlLT5tYWNod2NhcCA9IHdsY19ody0+bWFjaHdjYXA7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGJvb2wgd2xjX2JtYWNfYXR0YWNoX2RtYXBpbyh3bGNfaW5mb190ICp3bGMsIHVpbnQgaiwgYm9vbCB3bWUpCitzdGF0aWMgYm9vbCB3bGNfYm1hY19hdHRhY2hfZG1hcGlvKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1aW50IGosIGJvb2wgd21lKQogewogCXVpbnQgaTsKIAljaGFyIG5hbWVbOF07CiAJLyogdWNvZGUgaG9zdCBmbGFnIDIgbmVlZGVkIGZvciBwaW8gbW9kZSwgaW5kZXBlbmRlbnQgb2YgYmFuZCBhbmQgZmlmbyAqLwogCXUxNiBwaW9fbWhmMiA9IDA7Ci0Jd2xjX2h3X2luZm9fdCAqd2xjX2h3ID0gd2xjLT5odzsKKwlzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odyA9IHdsYy0+aHc7CiAJdWludCB1bml0ID0gd2xjX2h3LT51bml0OwogCXdsY190dW5hYmxlc190ICp0dW5lID0gd2xjLT5wdWItPnR1bmFibGVzOwogCkBAIC01ODEsNyArNTg4LDcgQEAKIAlpZiAod2xjX2h3LT5kaVswXSA9PSAwKSB7CS8qIEluaXQgRklGT3MgKi8KIAkJdWludCBhZGRyd2lkdGg7CiAJCWludCBkbWFfYXR0YWNoX2VyciA9IDA7Ci0JCW9zbF90ICpvc2ggPSB3bGNfaHctPm9zaDsKKwkJc3RydWN0IG9zbF9pbmZvICpvc2ggPSB3bGNfaHctPm9zaDsKIAogCQkvKiBGaW5kIG91dCB0aGUgRE1BIGFkZHJlc3NpbmcgY2FwYWJpbGl0eSBhbmQgbGV0IE9TIGtub3cKIAkJICogQWxsIHRoZSBjaGFubmVscyB3aXRoaW4gb25lIERNQSBjb3JlIGhhdmUgJ2NvbW1vbi1taW5pbXVtJyBzYW1lCkBAIC01ODksMTAgKzU5NiwxMCBAQAogCQkgKi8KIAkJYWRkcndpZHRoID0KIAkJICAgIGRtYV9hZGRyd2lkdGgod2xjX2h3LT5zaWgsIERNQVJFRyh3bGNfaHcsIERNQV9UWCwgMCkpOwotCQlPU0xfRE1BRERSV0lEVEgob3NoLCBhZGRyd2lkdGgpOwogCiAJCWlmICghd2xfYWxsb2NfZG1hX3Jlc291cmNlcyh3bGNfaHctPndsYy0+d2wsIGFkZHJ3aWR0aCkpIHsKLQkJCVdMX0VSUk9SKCgid2wlZDogd2xjX2F0dGFjaDogYWxsb2NfZG1hX3Jlc291cmNlcyBmYWlsZWRcbiIsIHVuaXQpKTsKKwkJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfYXR0YWNoOiBhbGxvY19kbWFfcmVzb3VyY2VzIGZhaWxlZFxuIiwKKwkJCQkgdW5pdCk7CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KIApAQCAtNjY1LDggKzY3Miw3IEBACiAvKiBDbGVhbmVyIHRvIGxlYXZlIHRoaXMgYXMgaWYgd2l0aCBBUCBkZWZpbmVkICovCiAKIAkJaWYgKGRtYV9hdHRhY2hfZXJyKSB7Ci0JCQlXTF9FUlJPUigoIndsJWQ6IHdsY19hdHRhY2g6IGRtYV9hdHRhY2ggZmFpbGVkXG4iLAotCQkJCSAgdW5pdCkpOworCQkJV0xfRVJST1IoIndsJWQ6IHdsY19hdHRhY2g6IGRtYV9hdHRhY2ggZmFpbGVkXG4iLCB1bml0KTsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQogCkBAIC02ODQsNyArNjkwLDcgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIHZvaWQgd2xjX2JtYWNfZGV0YWNoX2RtYXBpbyh3bGNfaHdfaW5mb190ICp3bGNfaHcpCitzdGF0aWMgdm9pZCB3bGNfYm1hY19kZXRhY2hfZG1hcGlvKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KQogewogCXVpbnQgajsKIApAQCAtNzAyLDExICs3MDgsMTEgQEAKICAqICAgIGluaXRpYWxpemUgc29mdHdhcmUgc3RhdGUgZm9yIGVhY2ggY29yZSBhbmQgYmFuZAogICogICAgcHV0IHRoZSB3aG9sZSBjaGlwIGluIHJlc2V0KGRyaXZlciBkb3duIHN0YXRlKSwgbm8gY2xvY2sKICAqLwotaW50IHdsY19ibWFjX2F0dGFjaCh3bGNfaW5mb190ICp3bGMsIHUxNiB2ZW5kb3IsIHUxNiBkZXZpY2UsIHVpbnQgdW5pdCwKLQkJICAgIGJvb2wgcGlvbW9kZSwgb3NsX3QgKm9zaCwgdm9pZCAqcmVnc3ZhLCB1aW50IGJ1c3R5cGUsCi0JCSAgICB2b2lkICpidHBhcmFtKQoraW50IHdsY19ibWFjX2F0dGFjaChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTE2IHZlbmRvciwgdTE2IGRldmljZSwgdWludCB1bml0LAorCQkgICAgYm9vbCBwaW9tb2RlLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqcmVnc3ZhLAorCQkgICAgdWludCBidXN0eXBlLCB2b2lkICpidHBhcmFtKQogewotCXdsY19od19pbmZvX3QgKndsY19odzsKKwlzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odzsKIAlkMTFyZWdzX3QgKnJlZ3M7CiAJY2hhciAqbWFjYWRkciA9IE5VTEw7CiAJY2hhciAqdmFyczsKQEAgLTcxNSw4ICs3MjEsOCBAQAogCWJvb2wgd21lID0gZmFsc2U7CiAJc2hhcmVkX3BoeV9wYXJhbXNfdCBzaGFfcGFyYW1zOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiB3bGNfYm1hY19hdHRhY2g6IHZlbmRvciAweCV4IGRldmljZSAweCV4XG4iLCB1bml0LAotCQkgIHZlbmRvciwgZGV2aWNlKSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY19ibWFjX2F0dGFjaDogdmVuZG9yIDB4JXggZGV2aWNlIDB4JXhcbiIsCisJCSB1bml0LCB2ZW5kb3IsIGRldmljZSk7CiAKIAlBU1NFUlQoc2l6ZW9mKHdsY19kMTFyeGhkcl90KSA8PSBXTF9IV1JYT0ZGKTsKIApAQCAtNzI5LDcgKzczNSw3IEBACiAJd2xjX2h3LT5iYW5kID0gd2xjX2h3LT5iYW5kc3RhdGVbMF07CiAJd2xjX2h3LT5fcGlvbW9kZSA9IHBpb21vZGU7CiAKLQkvKiBwb3B1bGF0ZSB3bGNfaHdfaW5mb190IHdpdGggZGVmYXVsdCB2YWx1ZXMgICovCisJLyogcG9wdWxhdGUgc3RydWN0IHdsY19od19pbmZvIHdpdGggZGVmYXVsdCB2YWx1ZXMgICovCiAJd2xjX2JtYWNfaW5mb19pbml0KHdsY19odyk7CiAKIAkvKgpAQCAtNzQwLDcgKzc0Niw3IEBACiAJd2xjX2h3LT5zaWggPSBzaV9hdHRhY2goKHVpbnQpIGRldmljZSwgb3NoLCByZWdzdmEsIGJ1c3R5cGUsIGJ0cGFyYW0sCiAJCQkJJndsY19ody0+dmFycywgJndsY19ody0+dmFyc19zaXplKTsKIAlpZiAod2xjX2h3LT5zaWggPT0gTlVMTCkgewotCQlXTF9FUlJPUigoIndsJWQ6IHdsY19ibWFjX2F0dGFjaDogc2lfYXR0YWNoIGZhaWxlZFxuIiwgdW5pdCkpOworCQlXTF9FUlJPUigid2wlZDogd2xjX2JtYWNfYXR0YWNoOiBzaV9hdHRhY2ggZmFpbGVkXG4iLCB1bml0KTsKIAkJZXJyID0gMTE7CiAJCWdvdG8gZmFpbDsKIAl9CkBAIC03NjAsMjEgKzc2NiwyMiBAQAogCQl2YXIgPSBnZXR2YXIodmFycywgInZlbmRpZCIpOwogCQlpZiAodmFyKSB7CiAJCQl2ZW5kb3IgPSAodTE2KSBzaW1wbGVfc3RydG91bCh2YXIsIE5VTEwsIDApOwotCQkJV0xfRVJST1IoKCJPdmVycmlkaW5nIHZlbmRvciBpZCA9IDB4JXhcbiIsIHZlbmRvcikpOworCQkJV0xfRVJST1IoIk92ZXJyaWRpbmcgdmVuZG9yIGlkID0gMHgleFxuIiwgdmVuZG9yKTsKIAkJfQogCQl2YXIgPSBnZXR2YXIodmFycywgImRldmlkIik7CiAJCWlmICh2YXIpIHsKIAkJCXUxNiBkZXZpZCA9ICh1MTYpIHNpbXBsZV9zdHJ0b3VsKHZhciwgTlVMTCwgMCk7CiAJCQlpZiAoZGV2aWQgIT0gMHhmZmZmKSB7CiAJCQkJZGV2aWNlID0gZGV2aWQ7Ci0JCQkJV0xfRVJST1IoKCJPdmVycmlkaW5nIGRldmljZSBpZCA9IDB4JXhcbiIsCi0JCQkJCSAgZGV2aWNlKSk7CisJCQkJV0xfRVJST1IoIk92ZXJyaWRpbmcgZGV2aWNlIGlkID0gMHgleFxuIiwKKwkJCQkJIGRldmljZSk7CiAJCQl9CiAJCX0KIAogCQkvKiB2ZXJpZnkgYWdhaW4gdGhlIGRldmljZSBpcyBzdXBwb3J0ZWQgKi8KIAkJaWYgKCF3bGNfY2hpcG1hdGNoKHZlbmRvciwgZGV2aWNlKSkgewotCQkJV0xfRVJST1IoKCJ3bCVkOiB3bGNfYm1hY19hdHRhY2g6IFVuc3VwcG9ydGVkIHZlbmRvci9kZXZpY2UgKDB4JXgvMHgleClcbiIsIHVuaXQsIHZlbmRvciwgZGV2aWNlKSk7CisJCQlXTF9FUlJPUigid2wlZDogd2xjX2JtYWNfYXR0YWNoOiBVbnN1cHBvcnRlZCB2ZW5kb3IvZGV2aWNlICgweCV4LzB4JXgpXG4iLAorCQkJCSB1bml0LCB2ZW5kb3IsIGRldmljZSk7CiAJCQllcnIgPSAxMjsKIAkJCWdvdG8gZmFpbDsKIAkJfQpAQCAtODA5LDcgKzgxNiw4IEBACiAJd2xjX2JtYWNfY29yZXJlc2V0KHdsY19odywgV0xDX1VTRV9DT1JFRkxBR1MpOwogCiAJaWYgKCF3bGNfYm1hY192YWxpZGF0ZV9jaGlwX2FjY2Vzcyh3bGNfaHcpKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogd2xjX2JtYWNfYXR0YWNoOiB2YWxpZGF0ZV9jaGlwX2FjY2VzcyBmYWlsZWRcbiIsIHVuaXQpKTsKKwkJV0xfRVJST1IoIndsJWQ6IHdsY19ibWFjX2F0dGFjaDogdmFsaWRhdGVfY2hpcF9hY2Nlc3MgZmFpbGVkXG4iLAorCQkJIHVuaXQpOwogCQllcnIgPSAxNDsKIAkJZ290byBmYWlsOwogCX0KQEAgLTgyMSw3ICs4MjksOCBAQAogCQlqID0gQk9BUkRSRVZfUFJPTU9URUQ7CiAJd2xjX2h3LT5ib2FyZHJldiA9ICh1MTYpIGo7CiAJaWYgKCF3bGNfdmFsaWRib2FyZHR5cGUod2xjX2h3KSkgewotCQlXTF9FUlJPUigoIndsJWQ6IHdsY19ibWFjX2F0dGFjaDogVW5zdXBwb3J0ZWQgQnJvYWRjb20gYm9hcmQgdHlwZSAoMHgleCkiICIgb3IgcmV2aXNpb24gbGV2ZWwgKDB4JXgpXG4iLCB1bml0LCB3bGNfaHctPnNpaC0+Ym9hcmR0eXBlLCB3bGNfaHctPmJvYXJkcmV2KSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfYm1hY19hdHRhY2g6IFVuc3VwcG9ydGVkIEJyb2FkY29tIGJvYXJkIHR5cGUgKDB4JXgpIiAiIG9yIHJldmlzaW9uIGxldmVsICgweCV4KVxuIiwKKwkJCSB1bml0LCB3bGNfaHctPnNpaC0+Ym9hcmR0eXBlLCB3bGNfaHctPmJvYXJkcmV2KTsKIAkJZXJyID0gMTU7CiAJCWdvdG8gZmFpbDsKIAl9CkBAIC04MzMsNyArODQyLDcgQEAKIAkgICAgfHwgKHdsY19ody0+Ym9hcmRmbGFncyAmIEJGTF9OT1BMTERPV04pKQogCQl3bGNfYm1hY19wbGxyZXEod2xjX2h3LCB0cnVlLCBXTENfUExMUkVRX1NIQVJFRCk7CiAKLQlpZiAoKEJVU1RZUEUod2xjX2h3LT5zaWgtPmJ1c3R5cGUpID09IFBDSV9CVVMpCisJaWYgKCh3bGNfaHctPnNpaC0+YnVzdHlwZSA9PSBQQ0lfQlVTKQogCSAgICAmJiAoc2lfcGNpX3dhcjE2MTY1KHdsY19ody0+c2loKSkpCiAJCXdsYy0+d2FyMTYxNjUgPSB0cnVlOwogCkBAIC04NDQsNyArODUzLDcgQEAKIAl9IGVsc2UKIAkJd2xjX2h3LT5fbmJhbmRzID0gMTsKIAotCWlmICgoQ0hJUElEKHdsY19ody0+c2loLT5jaGlwKSA9PSBCQ000MzIyNV9DSElQX0lEKSkKKwlpZiAoKHdsY19ody0+c2loLT5jaGlwID09IEJDTTQzMjI1X0NISVBfSUQpKQogCQl3bGNfaHctPl9uYmFuZHMgPSAxOwogCiAJLyogQk1BQ19OT1RFOiByZW1vdmUgaW5pdCBvZiBwdWIgdmFsdWVzIHdoZW4gd2xjX2F0dGFjaCgpIHVuY29uZGl0aW9uYWxseSBkb2VzIHRoZQpAQCAtODYzLDggKzg3Miw4IEBACiAJd2xjX2h3LT5waHlzaGltID0gd2xjX3BoeV9zaGltX2F0dGFjaCh3bGNfaHcsIHdsYy0+d2wsIHdsYyk7CiAKIAlpZiAod2xjX2h3LT5waHlzaGltID09IE5VTEwpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiB3bGNfYm1hY19hdHRhY2g6IHdsY19waHlfc2hpbV9hdHRhY2ggZmFpbGVkXG4iLAotCQkJICB1bml0KSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfYm1hY19hdHRhY2g6IHdsY19waHlfc2hpbV9hdHRhY2ggZmFpbGVkXG4iLAorCQkJIHVuaXQpOwogCQllcnIgPSAyNTsKIAkJZ290byBmYWlsOwogCX0KQEAgLTkzMSw3ICs5NDAsOCBAQAogCQl3bGNfaHctPmJhbmQtPnBpID0gd2xjX3BoeV9hdHRhY2god2xjX2h3LT5waHlfc2gsCiAJCQkodm9pZCAqKXJlZ3MsIHdsY19ody0+YmFuZC0+YmFuZHR5cGUsIHZhcnMpOwogCQlpZiAod2xjX2h3LT5iYW5kLT5waSA9PSBOVUxMKSB7Ci0JCQlXTF9FUlJPUigoIndsJWQ6IHdsY19ibWFjX2F0dGFjaDogd2xjX3BoeV9hdHRhY2ggZmFpbGVkXG4iLCB1bml0KSk7CisJCQlXTF9FUlJPUigid2wlZDogd2xjX2JtYWNfYXR0YWNoOiB3bGNfcGh5X2F0dGFjaCBmYWlsZWRcbiIsCisJCQkJIHVuaXQpOwogCQkJZXJyID0gMTc7CiAJCQlnb3RvIGZhaWw7CiAJCX0KQEAgLTk2MSw3ICs5NzEsOSBAQAogCQkJCWdvdG8gYmFkX3BoeTsKIAkJfSBlbHNlIHsKICBiYWRfcGh5OgotCQkJV0xfRVJST1IoKCJ3bCVkOiB3bGNfYm1hY19hdHRhY2g6IHVuc3VwcG9ydGVkIHBoeSB0eXBlL3JldiAoJWQvJWQpXG4iLCB1bml0LCB3bGNfaHctPmJhbmQtPnBoeXR5cGUsIHdsY19ody0+YmFuZC0+cGh5cmV2KSk7CisJCQlXTF9FUlJPUigid2wlZDogd2xjX2JtYWNfYXR0YWNoOiB1bnN1cHBvcnRlZCBwaHkgdHlwZS9yZXYgKCVkLyVkKVxuIiwKKwkJCQkgdW5pdCwKKwkJCQkgd2xjX2h3LT5iYW5kLT5waHl0eXBlLCB3bGNfaHctPmJhbmQtPnBoeXJldik7CiAJCQllcnIgPSAxODsKIAkJCWdvdG8gZmFpbDsKIAkJfQpAQCAtOTkzLDcgKzEwMDUsNyBAQAogCXdsY19jb3JlZGlzYWJsZSh3bGNfaHcpOwogCiAJLyogTWF0Y2ggZHJpdmVyICJkb3duIiBzdGF0ZSAqLwotCWlmIChCVVNUWVBFKHdsY19ody0+c2loLT5idXN0eXBlKSA9PSBQQ0lfQlVTKQorCWlmICh3bGNfaHctPnNpaC0+YnVzdHlwZSA9PSBQQ0lfQlVTKQogCQlzaV9wY2lfZG93bih3bGNfaHctPnNpaCk7CiAKIAkvKiByZWdpc3RlciBzYiBpbnRlcnJ1cHQgY2FsbGJhY2sgZnVuY3Rpb25zICovCkBAIC0xMDE2LDI3ICsxMDI4LDI3IEBACiAJLyogaW5pdCBldGhlcmFkZHIgc3RhdGUgdmFyaWFibGVzICovCiAJbWFjYWRkciA9IHdsY19nZXRfbWFjYWRkcih3bGNfaHcpOwogCWlmIChtYWNhZGRyID09IE5VTEwpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiB3bGNfYm1hY19hdHRhY2g6IG1hY2FkZHIgbm90IGZvdW5kXG4iLCB1bml0KSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfYm1hY19hdHRhY2g6IG1hY2FkZHIgbm90IGZvdW5kXG4iLCB1bml0KTsKIAkJZXJyID0gMjE7CiAJCWdvdG8gZmFpbDsKIAl9CiAJYmNtX2V0aGVyX2F0b2UobWFjYWRkciwgJndsY19ody0+ZXRoZXJhZGRyKTsKLQlpZiAoRVRIRVJfSVNCQ0FTVCgoY2hhciAqKSZ3bGNfaHctPmV0aGVyYWRkcikgfHwKLQkgICAgRVRIRVJfSVNOVUxMQUREUigoY2hhciAqKSZ3bGNfaHctPmV0aGVyYWRkcikpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiB3bGNfYm1hY19hdHRhY2g6IGJhZCBtYWNhZGRyICVzXG4iLCB1bml0LAotCQkJICBtYWNhZGRyKSk7CisJaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKHdsY19ody0+ZXRoZXJhZGRyLm9jdGV0KSB8fAorCSAgICBpc196ZXJvX2V0aGVyX2FkZHIod2xjX2h3LT5ldGhlcmFkZHIub2N0ZXQpKSB7CisJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfYm1hY19hdHRhY2g6IGJhZCBtYWNhZGRyICVzXG4iLAorCQkJIHVuaXQsIG1hY2FkZHIpOwogCQllcnIgPSAyMjsKIAkJZ290byBmYWlsOwogCX0KIAotCVdMX0VSUk9SKCgiJXM6OiBkZXZpY2VpZCAweCV4IG5iYW5kcyAlZCBib2FyZCAweCV4IG1hY2FkZHI6ICVzXG4iLAotCQkgIF9fZnVuY19fLCB3bGNfaHctPmRldmljZWlkLCB3bGNfaHctPl9uYmFuZHMsCi0JCSAgd2xjX2h3LT5zaWgtPmJvYXJkdHlwZSwgbWFjYWRkcikpOworCVdMX0VSUk9SKCIlczo6IGRldmljZWlkIDB4JXggbmJhbmRzICVkIGJvYXJkIDB4JXggbWFjYWRkcjogJXNcbiIsCisJCSBfX2Z1bmNfXywgd2xjX2h3LT5kZXZpY2VpZCwgd2xjX2h3LT5fbmJhbmRzLAorCQkgd2xjX2h3LT5zaWgtPmJvYXJkdHlwZSwgbWFjYWRkcik7CiAKIAlyZXR1cm4gZXJyOwogCiAgZmFpbDoKLQlXTF9FUlJPUigoIndsJWQ6IHdsY19ibWFjX2F0dGFjaDogZmFpbGVkIHdpdGggZXJyICVkXG4iLCB1bml0LCBlcnIpKTsKKwlXTF9FUlJPUigid2wlZDogd2xjX2JtYWNfYXR0YWNoOiBmYWlsZWQgd2l0aCBlcnIgJWRcbiIsIHVuaXQsIGVycik7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTA0NSw5ICsxMDU3LDkgQEAKICAqIG1heSBnZXQgb3ZlcnJpZGVzIGxhdGVyIGluIHRoaXMgZnVuY3Rpb24KICAqICBCTUFDX05PVEVTLCBtb3ZlIGxvdyBvdXQgYW5kIHJlc29sdmUgdGhlIGRhbmdsaW5nIG9uZXMKICAqLwotdm9pZCB3bGNfYm1hY19pbmZvX2luaXQod2xjX2h3X2luZm9fdCAqd2xjX2h3KQordm9pZCB3bGNfYm1hY19pbmZvX2luaXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpCiB7Ci0Jd2xjX2luZm9fdCAqd2xjID0gd2xjX2h3LT53bGM7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSB3bGNfaHctPndsYzsKIAogCS8qIHNldCBkZWZhdWx0IHN3IG1hY2ludG1hc2sgdmFsdWUgKi8KIAl3bGMtPmRlZm1hY2ludG1hc2sgPSBERUZfTUFDSU5UTUFTSzsKQEAgLTEwNjcsMTEgKzEwNzksMTEgQEAKIC8qCiAgKiBsb3cgbGV2ZWwgZGV0YWNoCiAgKi8KLWludCB3bGNfYm1hY19kZXRhY2god2xjX2luZm9fdCAqd2xjKQoraW50IHdsY19ibWFjX2RldGFjaChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAl1aW50IGk7CiAJd2xjX2h3YmFuZF90ICpiYW5kOwotCXdsY19od19pbmZvX3QgKndsY19odyA9IHdsYy0+aHc7CisJc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcgPSB3bGMtPmh3OwogCWludCBjYWxsYmFja3M7CiAKIAljYWxsYmFja3MgPSAwOwpAQCAtMTA4Miw3ICsxMDk0LDcgQEAKIAkJICovCiAJCXNpX2RlcmVnaXN0ZXJfaW50cl9jYWxsYmFjayh3bGNfaHctPnNpaCk7CiAKLQkJaWYgKEJVU1RZUEUod2xjX2h3LT5zaWgtPmJ1c3R5cGUpID09IFBDSV9CVVMpCisJCWlmICh3bGNfaHctPnNpaC0+YnVzdHlwZSA9PSBQQ0lfQlVTKQogCQkJc2lfcGNpX3NsZWVwKHdsY19ody0+c2loKTsKIAl9CiAKQEAgLTExMTgsOSArMTEzMCw5IEBACiAKIH0KIAotdm9pZCB3bGNfYm1hY19yZXNldCh3bGNfaHdfaW5mb190ICp3bGNfaHcpCit2b2lkIHdsY19ibWFjX3Jlc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KQogewotCVdMX1RSQUNFKCgid2wlZDogd2xjX2JtYWNfcmVzZXRcbiIsIHdsY19ody0+dW5pdCkpOworCVdMX1RSQUNFKCJ3bCVkOiB3bGNfYm1hY19yZXNldFxuIiwgd2xjX2h3LT51bml0KTsKIAogCVdMQ05USU5DUih3bGNfaHctPndsYy0+cHViLT5fY250LT5yZXNldCk7CiAKQEAgLTExMzUsMTMgKzExNDcsMTMgQEAKIH0KIAogdm9pZAotd2xjX2JtYWNfaW5pdCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIGNoYW5zcGVjX3QgY2hhbnNwZWMsCit3bGNfYm1hY19pbml0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBjaGFuc3BlY190IGNoYW5zcGVjLAogCQkJICBib29sIG11dGUpIHsKIAl1MzIgbWFjaW50bWFzazsKIAlib29sIGZhc3RjbGs7Ci0Jd2xjX2luZm9fdCAqd2xjID0gd2xjX2h3LT53bGM7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSB3bGNfaHctPndsYzsKIAotCVdMX1RSQUNFKCgid2wlZDogd2xjX2JtYWNfaW5pdFxuIiwgd2xjX2h3LT51bml0KSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY19ibWFjX2luaXRcbiIsIHdsY19ody0+dW5pdCk7CiAKIAkvKiByZXF1ZXN0IEZBU1QgY2xvY2sgaWYgbm90IG9uICovCiAJZmFzdGNsayA9IHdsY19ody0+Zm9yY2VmYXN0Y2xrOwpAQCAtMTE4NiwxMSArMTE5OCwxMSBAQAogCQl3bGNfY2xrY3RsX2Nsayh3bGNfaHcsIENMS19EWU5BTUlDKTsKIH0KIAotaW50IHdsY19ibWFjX3VwX3ByZXAod2xjX2h3X2luZm9fdCAqd2xjX2h3KQoraW50IHdsY19ibWFjX3VwX3ByZXAoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpCiB7CiAJdWludCBjb3JlbWFzazsKIAotCVdMX1RSQUNFKCgid2wlZDogJXM6XG4iLCB3bGNfaHctPnVuaXQsIF9fZnVuY19fKSk7CisJV0xfVFJBQ0UoIndsJWQ6ICVzOlxuIiwgd2xjX2h3LT51bml0LCBfX2Z1bmNfXyk7CiAKIAlBU1NFUlQod2xjX2h3LT53bGMtPnB1Yi0+aHdfdXAgJiYgd2xjX2h3LT53bGMtPm1hY2ludG1hc2sgPT0gMCk7CiAKQEAgLTEyMDgsNyArMTIyMCw3IEBACiAJICovCiAJY29yZW1hc2sgPSAoMSA8PCB3bGNfaHctPndsYy0+Y29yZS0+Y29yZWlkeCk7CiAKLQlpZiAoQlVTVFlQRSh3bGNfaHctPnNpaC0+YnVzdHlwZSkgPT0gUENJX0JVUykKKwlpZiAod2xjX2h3LT5zaWgtPmJ1c3R5cGUgPT0gUENJX0JVUykKIAkJc2lfcGNpX3NldHVwKHdsY19ody0+c2loLCBjb3JlbWFzayk7CiAKIAlBU1NFUlQoc2lfY29yZWlkKHdsY19ody0+c2loKSA9PSBEMTFfQ09SRV9JRCk7CkBAIC0xMjE5LDEzICsxMjMxLDEzIEBACiAJICovCiAJaWYgKHdsY19ibWFjX3JhZGlvX3JlYWRfaHdkaXNhYmxlZCh3bGNfaHcpKSB7CiAJCS8qIHB1dCBTQiBQQ0kgaW4gZG93biBzdGF0ZSBhZ2FpbiAqLwotCQlpZiAoQlVTVFlQRSh3bGNfaHctPnNpaC0+YnVzdHlwZSkgPT0gUENJX0JVUykKKwkJaWYgKHdsY19ody0+c2loLT5idXN0eXBlID09IFBDSV9CVVMpCiAJCQlzaV9wY2lfZG93bih3bGNfaHctPnNpaCk7CiAJCXdsY19ibWFjX3h0YWwod2xjX2h3LCBPRkYpOwogCQlyZXR1cm4gQkNNRV9SQURJT09GRjsKIAl9CiAKLQlpZiAoQlVTVFlQRSh3bGNfaHctPnNpaC0+YnVzdHlwZSkgPT0gUENJX0JVUykKKwlpZiAod2xjX2h3LT5zaWgtPmJ1c3R5cGUgPT0gUENJX0JVUykKIAkJc2lfcGNpX3VwKHdsY19ody0+c2loKTsKIAogCS8qIHJlc2V0IHRoZSBkMTEgY29yZSAqLwpAQCAtMTIzNCw5ICsxMjQ2LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHdsY19ibWFjX3VwX2ZpbmlzaCh3bGNfaHdfaW5mb190ICp3bGNfaHcpCitpbnQgd2xjX2JtYWNfdXBfZmluaXNoKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KQogewotCVdMX1RSQUNFKCgid2wlZDogJXM6XG4iLCB3bGNfaHctPnVuaXQsIF9fZnVuY19fKSk7CisJV0xfVFJBQ0UoIndsJWQ6ICVzOlxuIiwgd2xjX2h3LT51bml0LCBfX2Z1bmNfXyk7CiAKIAl3bGNfaHctPnVwID0gdHJ1ZTsKIAl3bGNfcGh5X2h3X3N0YXRlX3VwZCh3bGNfaHctPmJhbmQtPnBpLCB0cnVlKTsKQEAgLTEyNDgsMTIgKzEyNjAsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHdsY19ibWFjX2Rvd25fcHJlcCh3bGNfaHdfaW5mb190ICp3bGNfaHcpCitpbnQgd2xjX2JtYWNfZG93bl9wcmVwKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KQogewogCWJvb2wgZGV2X2dvbmU7CiAJdWludCBjYWxsYmFja3MgPSAwOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiAlczpcbiIsIHdsY19ody0+dW5pdCwgX19mdW5jX18pKTsKKwlXTF9UUkFDRSgid2wlZDogJXM6XG4iLCB3bGNfaHctPnVuaXQsIF9fZnVuY19fKTsKIAogCWlmICghd2xjX2h3LT51cCkKIAkJcmV0dXJuIGNhbGxiYWNrczsKQEAgLTEyNzYsMTIgKzEyODgsMTIgQEAKIAlyZXR1cm4gY2FsbGJhY2tzOwogfQogCi1pbnQgd2xjX2JtYWNfZG93bl9maW5pc2god2xjX2h3X2luZm9fdCAqd2xjX2h3KQoraW50IHdsY19ibWFjX2Rvd25fZmluaXNoKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KQogewogCXVpbnQgY2FsbGJhY2tzID0gMDsKIAlib29sIGRldl9nb25lOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiAlczpcbiIsIHdsY19ody0+dW5pdCwgX19mdW5jX18pKTsKKwlXTF9UUkFDRSgid2wlZDogJXM6XG4iLCB3bGNfaHctPnVuaXQsIF9fZnVuY19fKTsKIAogCWlmICghd2xjX2h3LT51cCkKIAkJcmV0dXJuIGNhbGxiYWNrczsKQEAgLTEzMTEsNyArMTMyMyw3IEBACiAKIAkJLyogdHVybiBvZmYgcHJpbWFyeSB4dGFsIGFuZCBwbGwgKi8KIAkJaWYgKCF3bGNfaHctPm5vcmVzZXQpIHsKLQkJCWlmIChCVVNUWVBFKHdsY19ody0+c2loLT5idXN0eXBlKSA9PSBQQ0lfQlVTKQorCQkJaWYgKHdsY19ody0+c2loLT5idXN0eXBlID09IFBDSV9CVVMpCiAJCQkJc2lfcGNpX2Rvd24od2xjX2h3LT5zaWgpOwogCQkJd2xjX2JtYWNfeHRhbCh3bGNfaHcsIE9GRik7CiAJCX0KQEAgLTEzMjAsNyArMTMzMiw3IEBACiAJcmV0dXJuIGNhbGxiYWNrczsKIH0KIAotdm9pZCB3bGNfYm1hY193YWl0X2Zvcl93YWtlKHdsY19od19pbmZvX3QgKndsY19odykKK3ZvaWQgd2xjX2JtYWNfd2FpdF9mb3Jfd2FrZShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odykKIHsKIAlpZiAoRDExUkVWX0lTKHdsY19ody0+Y29yZXJldiwgNCkpCS8qIG5vIHNsb3djbG9jayAqLwogCQl1ZGVsYXkoNSk7CkBAIC0xMzM2LDI5ICsxMzQ4LDMwIEBACiAJQVNTRVJUKHdsY19ibWFjX3JlYWRfc2htKHdsY19odywgTV9VQ09ERV9EQkdTVCkgIT0gREJHU1RfQVNMRUVQKTsKIH0KIAotdm9pZCB3bGNfYm1hY19od19ldGhlcmFkZHIod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBzdHJ1Y3QgZXRoZXJfYWRkciAqZWEpCit2b2lkIHdsY19ibWFjX2h3X2V0aGVyYWRkcihzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgc3RydWN0IGV0aGVyX2FkZHIgKmVhKQogewotCWJjb3B5KCZ3bGNfaHctPmV0aGVyYWRkciwgZWEsIEVUSEVSX0FERFJfTEVOKTsKKwliY29weSgmd2xjX2h3LT5ldGhlcmFkZHIsIGVhLCBFVEhfQUxFTik7CiB9CiAKLXZvaWQgd2xjX2JtYWNfc2V0X2h3X2V0aGVyYWRkcih3bGNfaHdfaW5mb190ICp3bGNfaHcsIHN0cnVjdCBldGhlcl9hZGRyICplYSkKK3ZvaWQgd2xjX2JtYWNfc2V0X2h3X2V0aGVyYWRkcihzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywKKwkJCSAgICAgICBzdHJ1Y3QgZXRoZXJfYWRkciAqZWEpCiB7Ci0JYmNvcHkoZWEsICZ3bGNfaHctPmV0aGVyYWRkciwgRVRIRVJfQUREUl9MRU4pOworCWJjb3B5KGVhLCAmd2xjX2h3LT5ldGhlcmFkZHIsIEVUSF9BTEVOKTsKIH0KIAotaW50IHdsY19ibWFjX2JhbmR0eXBlKHdsY19od19pbmZvX3QgKndsY19odykKK2ludCB3bGNfYm1hY19iYW5kdHlwZShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odykKIHsKIAlyZXR1cm4gd2xjX2h3LT5iYW5kLT5iYW5kdHlwZTsKIH0KIAotdm9pZCAqd2xjX2N1cl9waHkod2xjX2luZm9fdCAqd2xjKQordm9pZCAqd2xjX2N1cl9waHkoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7Ci0Jd2xjX2h3X2luZm9fdCAqd2xjX2h3ID0gd2xjLT5odzsKKwlzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odyA9IHdsYy0+aHc7CiAJcmV0dXJuICh2b2lkICopd2xjX2h3LT5iYW5kLT5waTsKIH0KIAogLyogY29udHJvbCBjaGlwIGNsb2NrIHRvIHNhdmUgcG93ZXIsIGVuYWJsZSBkeW5hbWljIGNsb2NrIG9yIGZvcmNlIGZhc3QgY2xvY2sgKi8KLXN0YXRpYyB2b2lkIHdsY19jbGtjdGxfY2xrKHdsY19od19pbmZvX3QgKndsY19odywgdWludCBtb2RlKQorc3RhdGljIHZvaWQgd2xjX2Nsa2N0bF9jbGsoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHVpbnQgbW9kZSkKIHsKIAlpZiAoUE1VQ1RMX0VOQUIod2xjX2h3LT5zaWgpKSB7CiAJCS8qIG5ldyBjaGlwcyB3aXRoIFBNVSwgQ0NTX0ZPUkNFSFQgd2lsbCBkaXN0cmlidXRlIHRoZSBIVCBjbG9jayBvbiBiYWNrcGxhbmUsCkBAIC0xNDU1LDExICsxNDY4LDExIEBACiAKIC8qIHNldCBpbml0aWFsIGhvc3QgZmxhZ3MgdmFsdWUgKi8KIHN0YXRpYyB2b2lkCi13bGNfbWhmZGVmKHdsY19pbmZvX3QgKndsYywgdTE2ICptaGZzLCB1MTYgbWhmMl9pbml0KQord2xjX21oZmRlZihzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTE2ICptaGZzLCB1MTYgbWhmMl9pbml0KQogewotCXdsY19od19pbmZvX3QgKndsY19odyA9IHdsYy0+aHc7CisJc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcgPSB3bGMtPmh3OwogCi0JYnplcm8obWhmcywgc2l6ZW9mKHUxNikgKiBNSEZNQVgpOworCW1lbXNldChtaGZzLCAwLCBNSEZNQVggKiBzaXplb2YodTE2KSk7CiAKIAltaGZzW01IRjJdIHw9IG1oZjJfaW5pdDsKIApAQCAtMTQ4NSw3ICsxNDk4LDcgQEAKICAqICAgICAgICAgICAgICAgICAgIFdMQ19CQU5EX0FMTCAgPC0tLSBBbGwgYmFuZHMKICAqLwogdm9pZAotd2xjX2JtYWNfbWhmKHdsY19od19pbmZvX3QgKndsY19odywgdTggaWR4LCB1MTYgbWFzaywgdTE2IHZhbCwKK3dsY19ibWFjX21oZihzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdTggaWR4LCB1MTYgbWFzaywgdTE2IHZhbCwKIAkgICAgIGludCBiYW5kcykKIHsKIAl1MTYgc2F2ZTsKQEAgLTE1MzksNyArMTU1Miw3IEBACiAJfQogfQogCi11MTYgd2xjX2JtYWNfbWhmX2dldCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHU4IGlkeCwgaW50IGJhbmRzKQordTE2IHdsY19ibWFjX21oZl9nZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHU4IGlkeCwgaW50IGJhbmRzKQogewogCXdsY19od2JhbmRfdCAqYmFuZDsKIAlBU1NFUlQoaWR4IDwgTUhGTUFYKTsKQEAgLTE1NjUsNyArMTU3OCw3IEBACiAJcmV0dXJuIGJhbmQtPm1oZnNbaWR4XTsKIH0KIAotc3RhdGljIHZvaWQgd2xjX3dyaXRlX21oZih3bGNfaHdfaW5mb190ICp3bGNfaHcsIHUxNiAqbWhmcykKK3N0YXRpYyB2b2lkIHdsY193cml0ZV9taGYoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHUxNiAqbWhmcykKIHsKIAl1OCBpZHg7CiAJdTE2IGFkZHJbXSA9IHsKQEAgLTE1ODMsNyArMTU5Niw3IEBACiAvKiBzZXQgdGhlIG1hY2NvbnRyb2wgcmVnaXN0ZXIgdG8gZGVzaXJlZCByZXNldCBzdGF0ZSBhbmQKICAqIGluaXRpYWxpemUgdGhlIHN3IGNhY2hlIG9mIHRoZSByZWdpc3RlcgogICovCi1zdGF0aWMgdm9pZCB3bGNfbWN0cmxfcmVzZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3KQorc3RhdGljIHZvaWQgd2xjX21jdHJsX3Jlc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KQogewogCS8qIElIUiBhY2Nlc3NlcyBhcmUgYWx3YXlzIGVuYWJsZWQsIFBTTSBkaXNhYmxlZCwgSFBTIG9mZiBhbmQgV0FLRSBvbiAqLwogCXdsY19ody0+bWFjY29udHJvbCA9IDA7CkBAIC0xNTk0LDcgKzE2MDcsNyBAQAogfQogCiAvKiBzZXQgb3IgY2xlYXIgbWFjY29udHJvbCBiaXRzICovCi12b2lkIHdsY19ibWFjX21jdHJsKHdsY19od19pbmZvX3QgKndsY19odywgdTMyIG1hc2ssIHUzMiB2YWwpCit2b2lkIHdsY19ibWFjX21jdHJsKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1MzIgbWFzaywgdTMyIHZhbCkKIHsKIAl1MzIgbWFjY29udHJvbDsKIAl1MzIgbmV3X21hY2NvbnRyb2w7CkBAIC0xNjE2LDcgKzE2MjksNyBAQAogfQogCiAvKiB3cml0ZSB0aGUgc29mdHdhcmUgc3RhdGUgb2YgbWFjY29udHJvbCBhbmQgb3ZlcnJpZGVzIHRvIHRoZSBtYWNjb250cm9sIHJlZ2lzdGVyICovCi1zdGF0aWMgdm9pZCB3bGNfbWN0cmxfd3JpdGUod2xjX2h3X2luZm9fdCAqd2xjX2h3KQorc3RhdGljIHZvaWQgd2xjX21jdHJsX3dyaXRlKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KQogewogCXUzMiBtYWNjb250cm9sID0gd2xjX2h3LT5tYWNjb250cm9sOwogCkBAIC0xNjMzLDcgKzE2NDYsNyBAQAogCVdfUkVHKHdsY19ody0+b3NoLCAmd2xjX2h3LT5yZWdzLT5tYWNjb250cm9sLCBtYWNjb250cm9sKTsKIH0KIAotdm9pZCB3bGNfdWNvZGVfd2FrZV9vdmVycmlkZV9zZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1MzIgb3ZlcnJpZGVfYml0KQordm9pZCB3bGNfdWNvZGVfd2FrZV9vdmVycmlkZV9zZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHUzMiBvdmVycmlkZV9iaXQpCiB7CiAJQVNTRVJUKCh3bGNfaHctPndha2Vfb3ZlcnJpZGUgJiBvdmVycmlkZV9iaXQpID09IDApOwogCkBAIC0xNjUwLDcgKzE2NjMsNyBAQAogCXJldHVybjsKIH0KIAotdm9pZCB3bGNfdWNvZGVfd2FrZV9vdmVycmlkZV9jbGVhcih3bGNfaHdfaW5mb190ICp3bGNfaHcsIHUzMiBvdmVycmlkZV9iaXQpCit2b2lkIHdsY191Y29kZV93YWtlX292ZXJyaWRlX2NsZWFyKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1MzIgb3ZlcnJpZGVfYml0KQogewogCUFTU0VSVCh3bGNfaHctPndha2Vfb3ZlcnJpZGUgJiBvdmVycmlkZV9iaXQpOwogCkBAIC0xNjcxLDcgKzE2ODQsNyBAQAogICogU1RBICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgMSA8LS0tIFRoaXMgd2lsbCBlbnN1cmUgbm8gYmVhY29ucwogICogSUJTUyAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgMAogICovCi1zdGF0aWMgdm9pZCB3bGNfdWNvZGVfbXV0ZV9vdmVycmlkZV9zZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3KQorc3RhdGljIHZvaWQgd2xjX3Vjb2RlX211dGVfb3ZlcnJpZGVfc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KQogewogCXdsY19ody0+bXV0ZV9vdmVycmlkZSA9IDE7CiAKQEAgLTE2ODcsNyArMTcwMCw3IEBACiB9CiAKIC8qIENsZWFyIHRoZSBvdmVycmlkZSBvbiBBUCBhbmQgSU5GUkEgYml0cyAqLwotc3RhdGljIHZvaWQgd2xjX3Vjb2RlX211dGVfb3ZlcnJpZGVfY2xlYXIod2xjX2h3X2luZm9fdCAqd2xjX2h3KQorc3RhdGljIHZvaWQgd2xjX3Vjb2RlX211dGVfb3ZlcnJpZGVfY2xlYXIoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpCiB7CiAJaWYgKHdsY19ody0+bXV0ZV9vdmVycmlkZSA9PSAwKQogCQlyZXR1cm47CkBAIC0xNzA3LDE2ICsxNzIwLDE2IEBACiAgKiBXcml0ZSBhIE1BQyBhZGRyZXNzIHRvIHRoZSByY210YSBzdHJ1Y3R1cmUKICAqLwogdm9pZAotd2xjX2JtYWNfc2V0X3JjbXRhKHdsY19od19pbmZvX3QgKndsY19odywgaW50IGlkeCwKK3dsY19ibWFjX3NldF9yY210YShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgaW50IGlkeCwKIAkJICAgY29uc3Qgc3RydWN0IGV0aGVyX2FkZHIgKmFkZHIpCiB7CiAJZDExcmVnc190ICpyZWdzID0gd2xjX2h3LT5yZWdzOwogCXZvbGF0aWxlIHUxNiAqb2JqZGF0YTE2ID0gKHZvbGF0aWxlIHUxNiAqKSZyZWdzLT5vYmpkYXRhOwogCXUzMiBtYWNfaG07CiAJdTE2IG1hY19sOwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAKLQlXTF9UUkFDRSgoIndsJWQ6ICVzXG4iLCB3bGNfaHctPnVuaXQsIF9fZnVuY19fKSk7CisJV0xfVFJBQ0UoIndsJWQ6ICVzXG4iLCB3bGNfaHctPnVuaXQsIF9fZnVuY19fKTsKIAogCUFTU0VSVCh3bGNfaHctPmNvcmVyZXYgPiA0KTsKIApAQCAtMTc0MCwxNiArMTc1MywxNiBAQAogICogV3JpdGUgYSBNQUMgYWRkcmVzcyB0byB0aGUgZ2l2ZW4gbWF0Y2ggcmVnIG9mZnNldCBpbiB0aGUgUlhFIG1hdGNoIGVuZ2luZS4KICAqLwogdm9pZAotd2xjX2JtYWNfc2V0X2FkZHJtYXRjaCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIGludCBtYXRjaF9yZWdfb2Zmc2V0LAord2xjX2JtYWNfc2V0X2FkZHJtYXRjaChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgaW50IG1hdGNoX3JlZ19vZmZzZXQsCiAJCSAgICAgICBjb25zdCBzdHJ1Y3QgZXRoZXJfYWRkciAqYWRkcikKIHsKIAlkMTFyZWdzX3QgKnJlZ3M7CiAJdTE2IG1hY19sOwogCXUxNiBtYWNfbTsKIAl1MTYgbWFjX2g7Ci0Jb3NsX3QgKm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsKIAotCVdMX1RSQUNFKCgid2wlZDogd2xjX2JtYWNfc2V0X2FkZHJtYXRjaFxuIiwgd2xjX2h3LT51bml0KSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY19ibWFjX3NldF9hZGRybWF0Y2hcbiIsIHdsY19ody0+dW5pdCk7CiAKIAlBU1NFUlQoKG1hdGNoX3JlZ19vZmZzZXQgPCBSQ01fU0laRSkgfHwgKHdsY19ody0+Y29yZXJldiA9PSA0KSk7CiAKQEAgLTE3NjksNyArMTc4Miw3IEBACiB9CiAKIHZvaWQKLXdsY19ibWFjX3dyaXRlX3RlbXBsYXRlX3JhbSh3bGNfaHdfaW5mb190ICp3bGNfaHcsIGludCBvZmZzZXQsIGludCBsZW4sCit3bGNfYm1hY193cml0ZV90ZW1wbGF0ZV9yYW0oc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIGludCBvZmZzZXQsIGludCBsZW4sCiAJCQkgICAgdm9pZCAqYnVmKQogewogCWQxMXJlZ3NfdCAqcmVnczsKQEAgLTE3NzgsOSArMTc5MSw5IEBACiAjaWZkZWYgSUxfQklHRU5ESUFOCiAJdm9sYXRpbGUgdTE2ICpkcHRyID0gTlVMTDsKICNlbmRpZgkJCQkvKiBJTF9CSUdFTkRJQU4gKi8KLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiB3bGNfYm1hY193cml0ZV90ZW1wbGF0ZV9yYW1cbiIsIHdsY19ody0+dW5pdCkpOworCVdMX1RSQUNFKCJ3bCVkOiB3bGNfYm1hY193cml0ZV90ZW1wbGF0ZV9yYW1cbiIsIHdsY19ody0+dW5pdCk7CiAKIAlyZWdzID0gd2xjX2h3LT5yZWdzOwogCW9zaCA9IHdsY19ody0+b3NoOwpAQCAtMTgxMiw5ICsxODI1LDkgQEAKIAl9CiB9CiAKLXZvaWQgd2xjX2JtYWNfc2V0X2N3bWluKHdsY19od19pbmZvX3QgKndsY19odywgdTE2IG5ld21pbikKK3ZvaWQgd2xjX2JtYWNfc2V0X2N3bWluKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1MTYgbmV3bWluKQogewotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAKIAlvc2ggPSB3bGNfaHctPm9zaDsKIAl3bGNfaHctPmJhbmQtPkNXbWluID0gbmV3bWluOwpAQCAtMTgyNCw5ICsxODM3LDkgQEAKIAlXX1JFRyhvc2gsICZ3bGNfaHctPnJlZ3MtPm9iamRhdGEsIG5ld21pbik7CiB9CiAKLXZvaWQgd2xjX2JtYWNfc2V0X2N3bWF4KHdsY19od19pbmZvX3QgKndsY19odywgdTE2IG5ld21heCkKK3ZvaWQgd2xjX2JtYWNfc2V0X2N3bWF4KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1MTYgbmV3bWF4KQogewotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAKIAlvc2ggPSB3bGNfaHctPm9zaDsKIAl3bGNfaHctPmJhbmQtPkNXbWF4ID0gbmV3bWF4OwpAQCAtMTgzNiw3ICsxODQ5LDcgQEAKIAlXX1JFRyhvc2gsICZ3bGNfaHctPnJlZ3MtPm9iamRhdGEsIG5ld21heCk7CiB9CiAKLXZvaWQgd2xjX2JtYWNfYndfc2V0KHdsY19od19pbmZvX3QgKndsY19odywgdTE2IGJ3KQordm9pZCB3bGNfYm1hY19id19zZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHUxNiBidykKIHsKIAlib29sIGZhc3RjbGs7CiAJdTMyIHRtcDsKQEAgLTE4NjEsNyArMTg3NCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi13bGNfd3JpdGVfaHdfYmNudGVtcGxhdGUwKHdsY19od19pbmZvX3QgKndsY19odywgdm9pZCAqYmNuLCBpbnQgbGVuKQord2xjX3dyaXRlX2h3X2JjbnRlbXBsYXRlMChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdm9pZCAqYmNuLCBpbnQgbGVuKQogewogCWQxMXJlZ3NfdCAqcmVncyA9IHdsY19ody0+cmVnczsKIApAQCAtMTg3NSw3ICsxODg4LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLXdsY193cml0ZV9od19iY250ZW1wbGF0ZTEod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB2b2lkICpiY24sIGludCBsZW4pCit3bGNfd3JpdGVfaHdfYmNudGVtcGxhdGUxKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB2b2lkICpiY24sIGludCBsZW4pCiB7CiAJZDExcmVnc190ICpyZWdzID0gd2xjX2h3LT5yZWdzOwogCkBAIC0xODkwLDcgKzE5MDMsNyBAQAogCiAvKiBtYWMgaXMgYXNzdW1lZCB0byBiZSBzdXNwZW5kZWQgYXQgdGhpcyBwb2ludCAqLwogdm9pZAotd2xjX2JtYWNfd3JpdGVfaHdfYmNudGVtcGxhdGVzKHdsY19od19pbmZvX3QgKndsY19odywgdm9pZCAqYmNuLCBpbnQgbGVuLAord2xjX2JtYWNfd3JpdGVfaHdfYmNudGVtcGxhdGVzKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB2b2lkICpiY24sIGludCBsZW4sCiAJCQkgICAgICAgYm9vbCBib3RoKQogewogCWQxMXJlZ3NfdCAqcmVncyA9IHdsY19ody0+cmVnczsKQEAgLTE5MTEsMTAgKzE5MjQsMTAgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIFdMQkFORElOSVRGTih3bGNfYm1hY191cGRfc3ludGhwdSkgKHdsY19od19pbmZvX3QgKndsY19odykKK3N0YXRpYyB2b2lkIFdMQkFORElOSVRGTih3bGNfYm1hY191cGRfc3ludGhwdSkgKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KQogewogCXUxNiB2OwotCXdsY19pbmZvX3QgKndsYyA9IHdsY19ody0+d2xjOworCXN0cnVjdCB3bGNfaW5mbyAqd2xjID0gd2xjX2h3LT53bGM7CiAJLyogdXBkYXRlIFNZTlRIUFVfRExZICovCiAKIAlpZiAoV0xDSVNMQ05QSFkod2xjLT5iYW5kKSkgewpAQCAtMTkzMCwxMiArMTk0MywxMiBAQAogCiAvKiBiYW5kLXNwZWNpZmljIGluaXQgKi8KIHN0YXRpYyB2b2lkCi1XTEJBTkRJTklURk4od2xjX2JtYWNfYnNpbml0KSAod2xjX2luZm9fdCAqd2xjLCBjaGFuc3BlY190IGNoYW5zcGVjKQorV0xCQU5ESU5JVEZOKHdsY19ibWFjX2JzaW5pdCkgKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBjaGFuc3BlY190IGNoYW5zcGVjKQogewotCXdsY19od19pbmZvX3QgKndsY19odyA9IHdsYy0+aHc7CisJc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcgPSB3bGMtPmh3OwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiB3bGNfYm1hY19ic2luaXQ6IGJhbmR1bml0ICVkXG4iLCB3bGNfaHctPnVuaXQsCi0JCSAgd2xjX2h3LT5iYW5kLT5iYW5kdW5pdCkpOworCVdMX1RSQUNFKCJ3bCVkOiB3bGNfYm1hY19ic2luaXQ6IGJhbmR1bml0ICVkXG4iLAorCQkgd2xjX2h3LT51bml0LCB3bGNfaHctPmJhbmQtPmJhbmR1bml0KTsKIAogCS8qIHNhbml0eSBjaGVjayAqLwogCWlmIChQSFlfVFlQRShSX1JFRyh3bGNfaHctPm9zaCwgJndsY19ody0+cmVncy0+cGh5dmVyc2lvbikpICE9CkBAIC0xOTY5LDkgKzE5ODIsOSBAQAogCXdsY19ibWFjX3VwZF9zeW50aHB1KHdsY19odyk7CiB9CiAKLXZvaWQgd2xjX2JtYWNfY29yZV9waHlfY2xrKHdsY19od19pbmZvX3QgKndsY19odywgYm9vbCBjbGspCit2b2lkIHdsY19ibWFjX2NvcmVfcGh5X2NsayhzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgYm9vbCBjbGspCiB7Ci0JV0xfVFJBQ0UoKCJ3bCVkOiB3bGNfYm1hY19jb3JlX3BoeV9jbGs6IGNsayAlZFxuIiwgd2xjX2h3LT51bml0LCBjbGspKTsKKwlXTF9UUkFDRSgid2wlZDogd2xjX2JtYWNfY29yZV9waHlfY2xrOiBjbGsgJWRcbiIsIHdsY19ody0+dW5pdCwgY2xrKTsKIAogCXdsY19ody0+cGh5Y2xrID0gY2xrOwogCkBAIC0xOTk0LDkgKzIwMDcsOSBAQAogfQogCiAvKiBQZXJmb3JtIGEgc29mdCByZXNldCBvZiB0aGUgUEhZIFBMTCAqLwotdm9pZCB3bGNfYm1hY19jb3JlX3BoeXBsbF9yZXNldCh3bGNfaHdfaW5mb190ICp3bGNfaHcpCit2b2lkIHdsY19ibWFjX2NvcmVfcGh5cGxsX3Jlc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KQogewotCVdMX1RSQUNFKCgid2wlZDogd2xjX2JtYWNfY29yZV9waHlwbGxfcmVzZXRcbiIsIHdsY19ody0+dW5pdCkpOworCVdMX1RSQUNFKCJ3bCVkOiB3bGNfYm1hY19jb3JlX3BoeXBsbF9yZXNldFxuIiwgd2xjX2h3LT51bml0KTsKIAogCXNpX2NvcmVyZWcod2xjX2h3LT5zaWgsIFNJX0NDX0lEWCwKIAkJICAgb2Zmc2V0b2YoY2hpcGNyZWdzX3QsIGNoaXBjb250cm9sX2FkZHIpLCB+MCwgMCk7CkBAIC0yMDE1LDcgKzIwMjgsNyBAQAogLyogbGlnaHQgd2F5IHRvIHR1cm4gb24gcGh5IGNsb2NrIHdpdGhvdXQgcmVzZXQgZm9yIE5QSFkgb25seQogICogIHJlZmVyIHRvIHdsY19ibWFjX2NvcmVfcGh5X2NsayBmb3IgZnVsbCB2ZXJzaW9uCiAgKi8KLXZvaWQgd2xjX2JtYWNfcGh5Y2xrX2ZnYyh3bGNfaHdfaW5mb190ICp3bGNfaHcsIGJvb2wgY2xrKQordm9pZCB3bGNfYm1hY19waHljbGtfZmdjKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBib29sIGNsaykKIHsKIAkvKiBzdXBwb3J0KG5lY2Vzc2FyeSBmb3IgTlBIWSBhbmQgSFlQSFkpIG9ubHkgKi8KIAlpZiAoIVdMQ0lTTlBIWSh3bGNfaHctPmJhbmQpKQpAQCAtMjAyOCw3ICsyMDQxLDcgQEAKIAogfQogCi12b2lkIHdsY19ibWFjX21hY3BoeWNsa19zZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBib29sIGNsaykKK3ZvaWQgd2xjX2JtYWNfbWFjcGh5Y2xrX3NldChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgYm9vbCBjbGspCiB7CiAJaWYgKE9OID09IGNsaykKIAkJc2lfY29yZV9jZmxhZ3Mod2xjX2h3LT5zaWgsIFNJQ0ZfTVBDTEtFLCBTSUNGX01QQ0xLRSk7CkBAIC0yMDM2LDEzICsyMDQ5LDEzIEBACiAJCXNpX2NvcmVfY2ZsYWdzKHdsY19ody0+c2loLCBTSUNGX01QQ0xLRSwgMCk7CiB9CiAKLXZvaWQgd2xjX2JtYWNfcGh5X3Jlc2V0KHdsY19od19pbmZvX3QgKndsY19odykKK3ZvaWQgd2xjX2JtYWNfcGh5X3Jlc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KQogewogCXdsY19waHlfdCAqcGloID0gd2xjX2h3LT5iYW5kLT5waTsKIAl1MzIgcGh5X2J3X2Nsa2JpdHM7CiAJYm9vbCBwaHlfaW5fcmVzZXQgPSBmYWxzZTsKIAotCVdMX1RSQUNFKCgid2wlZDogd2xjX2JtYWNfcGh5X3Jlc2V0XG4iLCB3bGNfaHctPnVuaXQpKTsKKwlXTF9UUkFDRSgid2wlZDogd2xjX2JtYWNfcGh5X3Jlc2V0XG4iLCB3bGNfaHctPnVuaXQpOwogCiAJaWYgKHBpaCA9PSBOVUxMKQogCQlyZXR1cm47CkBAIC0yMDgwLDkgKzIwOTMsOSBAQAogCiAvKiBzd2l0Y2ggdG8gYW5kIGluaXRpYWxpemUgbmV3IGJhbmQgKi8KIHN0YXRpYyB2b2lkCi1XTEJBTkRJTklURk4od2xjX2JtYWNfc2V0YmFuZCkgKHdsY19od19pbmZvX3QgKndsY19odywgdWludCBiYW5kdW5pdCwKK1dMQkFORElOSVRGTih3bGNfYm1hY19zZXRiYW5kKSAoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHVpbnQgYmFuZHVuaXQsCiAJCQkJY2hhbnNwZWNfdCBjaGFuc3BlYykgewotCXdsY19pbmZvX3QgKndsYyA9IHdsY19ody0+d2xjOworCXN0cnVjdCB3bGNfaW5mbyAqd2xjID0gd2xjX2h3LT53bGM7CiAJdTMyIG1hY2ludG1hc2s7CiAKIAlBU1NFUlQoTkJBTkRTX0hXKHdsY19odykgPiAxKTsKQEAgLTIxMjIsOSArMjEzNSw5IEBACiB9CiAKIC8qIGxvdy1sZXZlbCBiYW5kIHN3aXRjaCB1dGlsaXR5IHJvdXRpbmUgKi8KLXZvaWQgV0xCQU5ESU5JVEZOKHdsY19zZXR4YmFuZCkgKHdsY19od19pbmZvX3QgKndsY19odywgdWludCBiYW5kdW5pdCkKK3ZvaWQgV0xCQU5ESU5JVEZOKHdsY19zZXR4YmFuZCkgKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1aW50IGJhbmR1bml0KQogewotCVdMX1RSQUNFKCgid2wlZDogd2xjX3NldHhiYW5kOiBiYW5kdW5pdCAlZFxuIiwgd2xjX2h3LT51bml0LCBiYW5kdW5pdCkpOworCVdMX1RSQUNFKCJ3bCVkOiB3bGNfc2V0eGJhbmQ6IGJhbmR1bml0ICVkXG4iLCB3bGNfaHctPnVuaXQsIGJhbmR1bml0KTsKIAogCXdsY19ody0+YmFuZCA9IHdsY19ody0+YmFuZHN0YXRlW2JhbmR1bml0XTsKIApAQCAtMjEzOCwxOSArMjE1MSwxOSBAQAogCX0KIH0KIAotc3RhdGljIGJvb2wgd2xjX2lzZ29vZGNoaXAod2xjX2h3X2luZm9fdCAqd2xjX2h3KQorc3RhdGljIGJvb2wgd2xjX2lzZ29vZGNoaXAoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpCiB7CiAKIAkvKiByZWplY3QgdW5zdXBwb3J0ZWQgY29yZXJldiAqLwogCWlmICghVkFMSURfQ09SRVJFVih3bGNfaHctPmNvcmVyZXYpKSB7Ci0JCVdMX0VSUk9SKCgidW5zdXBwb3J0ZWQgY29yZSByZXYgJWRcbiIsIHdsY19ody0+Y29yZXJldikpOworCQlXTF9FUlJPUigidW5zdXBwb3J0ZWQgY29yZSByZXYgJWRcbiIsIHdsY19ody0+Y29yZXJldik7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIGJvb2wgd2xjX3ZhbGlkYm9hcmR0eXBlKHdsY19od19pbmZvX3QgKndsY19odykKK3N0YXRpYyBib29sIHdsY192YWxpZGJvYXJkdHlwZShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odykKIHsKIAlib29sIGdvb2Rib2FyZCA9IHRydWU7CiAJdWludCBib2FyZHJldiA9IHdsY19ody0+Ym9hcmRyZXY7CkBAIC0yMTc0LDcgKzIxODcsNyBAQAogCXJldHVybiBnb29kYm9hcmQ7CiB9CiAKLXN0YXRpYyBjaGFyICp3bGNfZ2V0X21hY2FkZHIod2xjX2h3X2luZm9fdCAqd2xjX2h3KQorc3RhdGljIGNoYXIgKndsY19nZXRfbWFjYWRkcihzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odykKIHsKIAljb25zdCBjaGFyICp2YXJuYW1lID0gIm1hY2FkZHIiOwogCWNoYXIgKm1hY2FkZHI7CkBAIC0yMTkxLDcgKzIyMDQsOCBAQAogCiAJbWFjYWRkciA9IGdldHZhcih3bGNfaHctPnZhcnMsIHZhcm5hbWUpOwogCWlmIChtYWNhZGRyID09IE5VTEwpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiB3bGNfZ2V0X21hY2FkZHI6IG1hY2FkZHIgZ2V0dmFyKCVzKSBub3QgZm91bmRcbiIsIHdsY19ody0+dW5pdCwgdmFybmFtZSkpOworCQlXTF9FUlJPUigid2wlZDogd2xjX2dldF9tYWNhZGRyOiBtYWNhZGRyIGdldHZhciglcykgbm90IGZvdW5kXG4iLAorCQkJIHdsY19ody0+dW5pdCwgdmFybmFtZSk7CiAJfQogCiAJcmV0dXJuIG1hY2FkZHI7CkBAIC0yMjAzLDcgKzIyMTcsNyBAQAogICogdGhpcyBmdW5jdGlvbiBjb3VsZCBiZSBjYWxsZWQgd2hlbiBkcml2ZXIgaXMgZG93biBhbmQgdy9vIGNsb2NrCiAgKiBpdCBvcGVyYXRlcyBvbiBkaWZmZXJlbnQgcmVnaXN0ZXJzIGRlcGVuZGluZyBvbiBjb3JlcmV2IGFuZCBib2FyZGZsYWcuCiAgKi8KLWJvb2wgd2xjX2JtYWNfcmFkaW9fcmVhZF9od2Rpc2FibGVkKHdsY19od19pbmZvX3QgKndsY19odykKK2Jvb2wgd2xjX2JtYWNfcmFkaW9fcmVhZF9od2Rpc2FibGVkKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KQogewogCWJvb2wgdiwgY2xrLCB4dGFsOwogCXUzMiByZXNldGJpdHMgPSAwLCBmbGFncyA9IDA7CkBAIC0yMjI2LDkgKzIyNDAsOSBAQAogCQkJZmxhZ3MgfD0gU0lDRl9QQ0xLRTsKIAogCQkvKiBBSSBjaGlwIGRvZXNuJ3QgcmVzdG9yZSBiYXIwd2luMiBvbiBoaWJlcm5hdGlvbi9yZXN1bWUsIG5lZWQgc3cgZml4dXAgKi8KLQkJaWYgKChDSElQSUQod2xjX2h3LT5zaWgtPmNoaXApID09IEJDTTQzMjI0X0NISVBfSUQpIHx8Ci0JCSAgICAoQ0hJUElEKHdsY19ody0+c2loLT5jaGlwKSA9PSBCQ000MzIyNV9DSElQX0lEKSB8fAotCQkgICAgKENISVBJRCh3bGNfaHctPnNpaC0+Y2hpcCkgPT0gQkNNNDM0MjFfQ0hJUF9JRCkpCisJCWlmICgod2xjX2h3LT5zaWgtPmNoaXAgPT0gQkNNNDMyMjRfQ0hJUF9JRCkgfHwKKwkJICAgICh3bGNfaHctPnNpaC0+Y2hpcCA9PSBCQ000MzIyNV9DSElQX0lEKSB8fAorCQkgICAgKHdsY19ody0+c2loLT5jaGlwID09IEJDTTQzNDIxX0NISVBfSUQpKQogCQkJd2xjX2h3LT5yZWdzID0KIAkJCSAgICAoZDExcmVnc190ICopIHNpX3NldGNvcmUod2xjX2h3LT5zaWgsIEQxMV9DT1JFX0lELAogCQkJCQkJICAgICAwKTsKQEAgLTIyNDksMTIgKzIyNjMsMTIgQEAKIH0KIAogLyogSW5pdGlhbGl6ZSBqdXN0IHRoZSBoYXJkd2FyZSB3aGVuIGNvbWluZyBvdXQgb2YgUE9SIG9yIFMzL1M1IHN5c3RlbSBzdGF0ZXMgKi8KLXZvaWQgd2xjX2JtYWNfaHdfdXAod2xjX2h3X2luZm9fdCAqd2xjX2h3KQordm9pZCB3bGNfYm1hY19od191cChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odykKIHsKIAlpZiAod2xjX2h3LT53bGMtPnB1Yi0+aHdfdXApCiAJCXJldHVybjsKIAotCVdMX1RSQUNFKCgid2wlZDogJXM6XG4iLCB3bGNfaHctPnVuaXQsIF9fZnVuY19fKSk7CisJV0xfVFJBQ0UoIndsJWQ6ICVzOlxuIiwgd2xjX2h3LT51bml0LCBfX2Z1bmNfXyk7CiAKIAkvKgogCSAqIEVuYWJsZSBwbGwgYW5kIHh0YWwsIGluaXRpYWxpemUgdGhlIHBvd2VyIGNvbnRyb2wgcmVnaXN0ZXJzLApAQCAtMjI2NCwxMyArMjI3OCwxMyBAQAogCXNpX2Nsa2N0bF9pbml0KHdsY19ody0+c2loKTsKIAl3bGNfY2xrY3RsX2Nsayh3bGNfaHcsIENMS19GQVNUKTsKIAotCWlmIChCVVNUWVBFKHdsY19ody0+c2loLT5idXN0eXBlKSA9PSBQQ0lfQlVTKSB7CisJaWYgKHdsY19ody0+c2loLT5idXN0eXBlID09IFBDSV9CVVMpIHsKIAkJc2lfcGNpX2ZpeGNmZyh3bGNfaHctPnNpaCk7CiAKIAkJLyogQUkgY2hpcCBkb2Vzbid0IHJlc3RvcmUgYmFyMHdpbjIgb24gaGliZXJuYXRpb24vcmVzdW1lLCBuZWVkIHN3IGZpeHVwICovCi0JCWlmICgoQ0hJUElEKHdsY19ody0+c2loLT5jaGlwKSA9PSBCQ000MzIyNF9DSElQX0lEKSB8fAotCQkgICAgKENISVBJRCh3bGNfaHctPnNpaC0+Y2hpcCkgPT0gQkNNNDMyMjVfQ0hJUF9JRCkgfHwKLQkJICAgIChDSElQSUQod2xjX2h3LT5zaWgtPmNoaXApID09IEJDTTQzNDIxX0NISVBfSUQpKQorCQlpZiAoKHdsY19ody0+c2loLT5jaGlwID09IEJDTTQzMjI0X0NISVBfSUQpIHx8CisJCSAgICAod2xjX2h3LT5zaWgtPmNoaXAgPT0gQkNNNDMyMjVfQ0hJUF9JRCkgfHwKKwkJICAgICh3bGNfaHctPnNpaC0+Y2hpcCA9PSBCQ000MzQyMV9DSElQX0lEKSkKIAkJCXdsY19ody0+cmVncyA9CiAJCQkgICAgKGQxMXJlZ3NfdCAqKSBzaV9zZXRjb3JlKHdsY19ody0+c2loLCBEMTFfQ09SRV9JRCwKIAkJCQkJCSAgICAgMCk7CkBAIC0yMjgzLDcgKzIyOTcsNyBAQAogCXdsY19ody0+d2xjLT5wdWItPmh3X3VwID0gdHJ1ZTsKIAogCWlmICgod2xjX2h3LT5ib2FyZGZsYWdzICYgQkZMX0ZFTSkKLQkgICAgJiYgKENISVBJRCh3bGNfaHctPnNpaC0+Y2hpcCkgPT0gQkNNNDMxM19DSElQX0lEKSkgeworCSAgICAmJiAod2xjX2h3LT5zaWgtPmNoaXAgPT0gQkNNNDMxM19DSElQX0lEKSkgewogCQlpZiAoIQogCQkgICAgKHdsY19ody0+Ym9hcmRyZXYgPj0gMHgxMjUwCiAJCSAgICAgJiYgKHdsY19ody0+Ym9hcmRmbGFncyAmIEJGTF9GRU1fQlQpKSkKQEAgLTIyOTEsMTAgKzIzMDUsMTAgQEAKIAl9CiB9CiAKLXN0YXRpYyBib29sIHdsY19kbWFfcnhyZXNldCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHVpbnQgZmlmbykKK3N0YXRpYyBib29sIHdsY19kbWFfcnhyZXNldChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdWludCBmaWZvKQogewotCWhuZGRtYV90ICpkaSA9IHdsY19ody0+ZGlbZmlmb107Ci0Jb3NsX3QgKm9zaDsKKwlzdHJ1Y3QgaG5kZG1hX3B1YiAqZGkgPSB3bGNfaHctPmRpW2ZpZm9dOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCiAJaWYgKEQxMVJFVl9MVCh3bGNfaHctPmNvcmVyZXYsIDEyKSkgewogCQlib29sIHJ4aWRsZSA9IHRydWU7CkBAIC0yMzA5LDcgKzIzMjMsOCBAQAogCQkJIDUwMDAwKTsKIAogCQlpZiAoIXJ4aWRsZSAmJiAocmN2X2ZybV9jbnQgIT0gMCkpCi0JCQlXTF9FUlJPUigoIndsJWQ6ICVzOiByeGRtYVslZF0gbm90IGlkbGUgJiYgcmN2X2ZybV9jbnQoJWQpIG5vdCB6ZXJvXG4iLCB3bGNfaHctPnVuaXQsIF9fZnVuY19fLCBmaWZvLCByY3ZfZnJtX2NudCkpOworCQkJV0xfRVJST1IoIndsJWQ6ICVzOiByeGRtYVslZF0gbm90IGlkbGUgJiYgcmN2X2ZybV9jbnQoJWQpIG5vdCB6ZXJvXG4iLAorCQkJCSB3bGNfaHctPnVuaXQsIF9fZnVuY19fLCBmaWZvLCByY3ZfZnJtX2NudCk7CiAJCW1kZWxheSgyKTsKIAl9CiAKQEAgLTIzMjQsNyArMjMzOSw3IEBACiAgKiAgIGNsZWFyIHNvZnR3YXJlIG1hY2ludHN0YXR1cyBmb3IgZnJlc2ggbmV3IHN0YXJ0CiAgKiBvbmUgdGVzdGluZyBoYWNrIHdsY19ody0+bm9yZXNldCB3aWxsIGJ5cGFzcyB0aGUgZDExL3BoeSByZXNldAogICovCi12b2lkIHdsY19ibWFjX2NvcmVyZXNldCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHUzMiBmbGFncykKK3ZvaWQgd2xjX2JtYWNfY29yZXJlc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1MzIgZmxhZ3MpCiB7CiAJZDExcmVnc190ICpyZWdzOwogCXVpbnQgaTsKQEAgLTIzMzQsNyArMjM0OSw3IEBACiAJaWYgKGZsYWdzID09IFdMQ19VU0VfQ09SRUZMQUdTKQogCQlmbGFncyA9ICh3bGNfaHctPmJhbmQtPnBpID8gd2xjX2h3LT5iYW5kLT5jb3JlX2ZsYWdzIDogMCk7CiAKLQlXTF9UUkFDRSgoIndsJWQ6ICVzXG4iLCB3bGNfaHctPnVuaXQsIF9fZnVuY19fKSk7CisJV0xfVFJBQ0UoIndsJWQ6ICVzXG4iLCB3bGNfaHctPnVuaXQsIF9fZnVuY19fKTsKIAogCXJlZ3MgPSB3bGNfaHctPnJlZ3M7CiAKQEAgLTIzNDcsMTcgKzIzNjIsMjAgQEAKIAlpZiAoc2lfaXNjb3JldXAod2xjX2h3LT5zaWgpKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBORklGTzsgaSsrKQogCQkJaWYgKCh3bGNfaHctPmRpW2ldKSAmJiAoIWRtYV90eHJlc2V0KHdsY19ody0+ZGlbaV0pKSkgewotCQkJCVdMX0VSUk9SKCgid2wlZDogJXM6IGRtYV90eHJlc2V0WyVkXTogY2Fubm90IHN0b3AgZG1hXG4iLCB3bGNfaHctPnVuaXQsIF9fZnVuY19fLCBpKSk7CisJCQkJV0xfRVJST1IoIndsJWQ6ICVzOiBkbWFfdHhyZXNldFslZF06IGNhbm5vdCBzdG9wIGRtYVxuIiwKKwkJCQkJIHdsY19ody0+dW5pdCwgX19mdW5jX18sIGkpOwogCQkJfQogCiAJCWlmICgod2xjX2h3LT5kaVtSWF9GSUZPXSkKIAkJICAgICYmICghd2xjX2RtYV9yeHJlc2V0KHdsY19odywgUlhfRklGTykpKSB7Ci0JCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBkbWFfcnhyZXNldFslZF06IGNhbm5vdCBzdG9wIGRtYVxuIiwgd2xjX2h3LT51bml0LCBfX2Z1bmNfXywgUlhfRklGTykpOworCQkJV0xfRVJST1IoIndsJWQ6ICVzOiBkbWFfcnhyZXNldFslZF06IGNhbm5vdCBzdG9wIGRtYVxuIiwKKwkJCQkgd2xjX2h3LT51bml0LCBfX2Z1bmNfXywgUlhfRklGTyk7CiAJCX0KIAkJaWYgKEQxMVJFVl9JUyh3bGNfaHctPmNvcmVyZXYsIDQpCiAJCSAgICAmJiB3bGNfaHctPmRpW1JYX1RYU1RBVFVTX0ZJRk9dCiAJCSAgICAmJiAoIXdsY19kbWFfcnhyZXNldCh3bGNfaHcsIFJYX1RYU1RBVFVTX0ZJRk8pKSkgewotCQkJV0xfRVJST1IoKCJ3bCVkOiAlczogZG1hX3J4cmVzZXRbJWRdOiBjYW5ub3Qgc3RvcCBkbWFcbiIsIHdsY19ody0+dW5pdCwgX19mdW5jX18sIFJYX1RYU1RBVFVTX0ZJRk8pKTsKKwkJCVdMX0VSUk9SKCJ3bCVkOiAlczogZG1hX3J4cmVzZXRbJWRdOiBjYW5ub3Qgc3RvcCBkbWFcbiIsCisJCQkJIHdsY19ody0+dW5pdCwgX19mdW5jX18sIFJYX1RYU1RBVFVTX0ZJRk8pOwogCQl9CiAJfQogCS8qIGlmIG5vcmVzZXQsIGp1c3Qgc3RvcCB0aGUgcHNtIGFuZCByZXR1cm4gKi8KQEAgLTI0MTMsMTQgKzI0MzEsMTQgQEAKICAqIHR4ZmlmbyBzaXplcyBuZWVkcyB0byBiZSBtb2RpZmllZChpbmNyZWFzZWQpIHNpbmNlIHRoZSBuZXdlciBjb3JlcwogICogaGF2ZSBtb3JlIG1lbW9yeS4KICAqLwotc3RhdGljIHZvaWQgd2xjX2NvcmVyZXZfZmlmb2ZpeHVwKHdsY19od19pbmZvX3QgKndsY19odykKK3N0YXRpYyB2b2lkIHdsY19jb3JlcmV2X2ZpZm9maXh1cChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odykKIHsKIAlkMTFyZWdzX3QgKnJlZ3MgPSB3bGNfaHctPnJlZ3M7CiAJdTE2IGZpZm9fbnU7CiAJdTE2IHR4Zmlmb19zdGFydGJsayA9IFRYRklGT19TVEFSVF9CTEssIHR4Zmlmb19lbmRibGs7CiAJdTE2IHR4Zmlmb19kZWYsIHR4Zmlmb19kZWYxOwogCXUxNiB0eGZpZm9fY21kOwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAKIAlpZiAoRDExUkVWX0xUKHdsY19ody0+Y29yZXJldiwgOSkpCiAJCWdvdG8gZXhpdDsKQEAgLTI0NzMsMjIgKzI0OTEsMjIgQEAKICAqICAgY29uZmlnIG90aGVyIGNvcmUgcmVnaXN0ZXJzCiAgKiAgIGluaXQgZG1hCiAgKi8KLXN0YXRpYyB2b2lkIHdsY19jb3JlaW5pdCh3bGNfaW5mb190ICp3bGMpCitzdGF0aWMgdm9pZCB3bGNfY29yZWluaXQoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7Ci0Jd2xjX2h3X2luZm9fdCAqd2xjX2h3ID0gd2xjLT5odzsKKwlzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odyA9IHdsYy0+aHc7CiAJZDExcmVnc190ICpyZWdzOwogCXUzMiBzZmxhZ3M7CiAJdWludCBiY25pbnRfdXM7CiAJdWludCBpID0gMDsKIAlib29sIGZpZm9zel9maXh1cCA9IGZhbHNlOwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAJaW50IGVyciA9IDA7CiAJdTE2IGJ1ZltORklGT107CiAKIAlyZWdzID0gd2xjX2h3LT5yZWdzOwogCW9zaCA9IHdsY19ody0+b3NoOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiB3bGNfY29yZWluaXRcbiIsIHdsY19ody0+dW5pdCkpOworCVdMX1RSQUNFKCJ3bCVkOiB3bGNfY29yZWluaXRcbiIsIHdsY19ody0+dW5pdCk7CiAKIAkvKiByZXNldCBQU00gKi8KIAl3bGNfYm1hY19tY3RybCh3bGNfaHcsIH4wLCAoTUNUTF9JSFJfRU4gfCBNQ1RMX1BTTV9KTVBfMCB8IE1DVExfV0FLRSkpOwpAQCAtMjUxMSw4ICsyNTI5LDggQEAKIAlTUElOV0FJVCgoKFJfUkVHKG9zaCwgJnJlZ3MtPm1hY2ludHN0YXR1cykgJiBNSV9NQUNTU1BOREQpID09IDApLAogCQkgMTAwMCAqIDEwMDApOwogCWlmICgoUl9SRUcob3NoLCAmcmVncy0+bWFjaW50c3RhdHVzKSAmIE1JX01BQ1NTUE5ERCkgPT0gMCkKLQkJV0xfRVJST1IoKCJ3bCVkOiB3bGNfY29yZWluaXQ6IHVjb2RlIGRpZCBub3Qgc2VsZi1zdXNwZW5kIVxuIiwKLQkJCSAgd2xjX2h3LT51bml0KSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfY29yZWluaXQ6IHVjb2RlIGRpZCBub3Qgc2VsZi1zdXNwZW5kIVxuIiwKKwkJCSB3bGNfaHctPnVuaXQpOwogCiAJd2xjX2dwaW9faW5pdCh3bGMpOwogCkBAIC0yNTIyLDE4ICsyNTQwLDE4IEBACiAJCWlmIChXTENJU05QSFkod2xjX2h3LT5iYW5kKSkKIAkJCXdsY193cml0ZV9pbml0cyh3bGNfaHcsIGQxMW4waW5pdHZhbHMxNik7CiAJCWVsc2UKLQkJCVdMX0VSUk9SKCgiJXM6IHdsJWQ6IHVuc3VwcG9ydGVkIHBoeSBpbiBjb3JlcmV2ICVkXG4iLAotCQkJCSAgX19mdW5jX18sIHdsY19ody0+dW5pdCwgd2xjX2h3LT5jb3JlcmV2KSk7CisJCQlXTF9FUlJPUigiJXM6IHdsJWQ6IHVuc3VwcG9ydGVkIHBoeSBpbiBjb3JlcmV2ICVkXG4iLAorCQkJCSBfX2Z1bmNfXywgd2xjX2h3LT51bml0LCB3bGNfaHctPmNvcmVyZXYpOwogCX0gZWxzZSBpZiAoRDExUkVWX0lTKHdsY19ody0+Y29yZXJldiwgMjQpKSB7CiAJCWlmIChXTENJU0xDTlBIWSh3bGNfaHctPmJhbmQpKSB7CiAJCQl3bGNfd3JpdGVfaW5pdHMod2xjX2h3LCBkMTFsY24waW5pdHZhbHMyNCk7CiAJCX0gZWxzZSB7Ci0JCQlXTF9FUlJPUigoIiVzOiB3bCVkOiB1bnN1cHBvcnRlZCBwaHkgaW4gY29yZXJldiAlZFxuIiwKLQkJCQkgIF9fZnVuY19fLCB3bGNfaHctPnVuaXQsIHdsY19ody0+Y29yZXJldikpOworCQkJV0xfRVJST1IoIiVzOiB3bCVkOiB1bnN1cHBvcnRlZCBwaHkgaW4gY29yZXJldiAlZFxuIiwKKwkJCQkgX19mdW5jX18sIHdsY19ody0+dW5pdCwgd2xjX2h3LT5jb3JlcmV2KTsKIAkJfQogCX0gZWxzZSB7Ci0JCVdMX0VSUk9SKCgiJXM6IHdsJWQ6IHVuc3VwcG9ydGVkIGNvcmVyZXYgJWRcbiIsCi0JCQkgIF9fZnVuY19fLCB3bGNfaHctPnVuaXQsIHdsY19ody0+Y29yZXJldikpOworCQlXTF9FUlJPUigiJXM6IHdsJWQ6IHVuc3VwcG9ydGVkIGNvcmVyZXYgJWRcbiIsCisJCQkgX19mdW5jX18sIHdsY19ody0+dW5pdCwgd2xjX2h3LT5jb3JlcmV2KTsKIAl9CiAKIAkvKiBGb3Igb2xkIHVjb2RlLCB0eGZpZm8gc2l6ZXMgbmVlZHMgdG8gYmUgbW9kaWZpZWQoaW5jcmVhc2VkKSBmb3IgQ29yZXJldiA+PSA5ICovCkBAIC0yNTc1LDcgKzI1OTMsOCBAQAogCQllcnIgPSAtMTsKIAl9CiAJaWYgKGVyciAhPSAwKSB7Ci0JCVdMX0VSUk9SKCgid2xjX2NvcmVpbml0OiB0eGZpZm8gbWlzbWF0Y2g6IHVjb2RlIHNpemUgJWQgZHJpdmVyIHNpemUgJWQgaW5kZXggJWRcbiIsIGJ1ZltpXSwgd2xjX2h3LT54bXRmaWZvX3N6W2ldLCBpKSk7CisJCVdMX0VSUk9SKCJ3bGNfY29yZWluaXQ6IHR4ZmlmbyBtaXNtYXRjaDogdWNvZGUgc2l6ZSAlZCBkcml2ZXIgc2l6ZSAlZCBpbmRleCAlZFxuIiwKKwkJCSBidWZbaV0sIHdsY19ody0+eG10Zmlmb19zeltpXSwgaSk7CiAJCS8qIERPIE5PVCBBU1NFUlQgY29yZXJldiA8IDQgZXZlbiB0aGVyZSBpcyBhIG1pc21hdGNoCiAJCSAqIHNobWVtLCBzaW5jZSBkcml2ZXIgZG9uJ3Qgb3ZlcndyaXRlIHRob3NlIGNoaXAgYW5kCiAJCSAqIHVjb2RlIGluaXRpYWxpemUgZGF0YSB3aWxsIGJlIHVzZWQuCkBAIC0yNjg0LDE1ICsyNzAzLDE1IEBACiAgKiAgLSA1NTkyNDEgPSAweDg4ODg5ID0+IHRzZl9jbGtfZnJhY19oID0gMHg4LCB0c2ZfY2xrX2ZyYWNfbCA9IDB4ODg4OQogICovCiAKLXZvaWQgd2xjX2JtYWNfc3dpdGNoX21hY2ZyZXEod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1OCBzcHVybW9kZSkKK3ZvaWQgd2xjX2JtYWNfc3dpdGNoX21hY2ZyZXEoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHU4IHNwdXJtb2RlKQogewogCWQxMXJlZ3NfdCAqcmVnczsKLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCXJlZ3MgPSB3bGNfaHctPnJlZ3M7CiAJb3NoID0gd2xjX2h3LT5vc2g7CiAKLQlpZiAoKENISVBJRCh3bGNfaHctPnNpaC0+Y2hpcCkgPT0gQkNNNDMyMjRfQ0hJUF9JRCkgfHwKLQkgICAgKENISVBJRCh3bGNfaHctPnNpaC0+Y2hpcCkgPT0gQkNNNDMyMjVfQ0hJUF9JRCkpIHsKKwlpZiAoKHdsY19ody0+c2loLT5jaGlwID09IEJDTTQzMjI0X0NISVBfSUQpIHx8CisJICAgICh3bGNfaHctPnNpaC0+Y2hpcCA9PSBCQ000MzIyNV9DSElQX0lEKSkgewogCQlpZiAoc3B1cm1vZGUgPT0gV0xfU1BVUkFWT0lEX09OMikgewkvKiAxMjZNaHogKi8KIAkJCVdfUkVHKG9zaCwgJnJlZ3MtPnRzZl9jbGtfZnJhY19sLCAweDIwODIpOwogCQkJV19SRUcob3NoLCAmcmVncy0+dHNmX2Nsa19mcmFjX2gsIDB4OCk7CkBAIC0yNzE1LDEyICsyNzM0LDEyIEBACiB9CiAKIC8qIEluaXRpYWxpemUgR1BJT3MgdGhhdCBhcmUgY29udHJvbGxlZCBieSBEMTEgY29yZSAqLwotc3RhdGljIHZvaWQgd2xjX2dwaW9faW5pdCh3bGNfaW5mb190ICp3bGMpCitzdGF0aWMgdm9pZCB3bGNfZ3Bpb19pbml0KHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewotCXdsY19od19pbmZvX3QgKndsY19odyA9IHdsYy0+aHc7CisJc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcgPSB3bGMtPmh3OwogCWQxMXJlZ3NfdCAqcmVnczsKIAl1MzIgZ2MsIGdtOwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAKIAlyZWdzID0gd2xjX2h3LT5yZWdzOwogCW9zaCA9IHdsY19ody0+b3NoOwpAQCAtMjc4MCw5ICsyNzk5LDkgQEAKIAlzaV9ncGlvY29udHJvbCh3bGNfaHctPnNpaCwgZ20sIGdjLCBHUElPX0RSVl9QUklPUklUWSk7CiB9CiAKLXN0YXRpYyB2b2lkIHdsY191Y29kZV9kb3dubG9hZCh3bGNfaHdfaW5mb190ICp3bGNfaHcpCitzdGF0aWMgdm9pZCB3bGNfdWNvZGVfZG93bmxvYWQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpCiB7Ci0Jd2xjX2luZm9fdCAqd2xjOworCXN0cnVjdCB3bGNfaW5mbyAqd2xjOwogCXdsYyA9IHdsY19ody0+d2xjOwogCiAJaWYgKHdsY19ody0+dWNvZGVfbG9hZGVkKQpAQCAtMjc5NCwzMCArMjgxMywzMCBAQAogCQkJCQliY200M3h4XzE2X21pbW9zeik7CiAJCQl3bGNfaHctPnVjb2RlX2xvYWRlZCA9IHRydWU7CiAJCX0gZWxzZQotCQkJV0xfRVJST1IoKCIlczogd2wlZDogdW5zdXBwb3J0ZWQgcGh5IGluIGNvcmVyZXYgJWRcbiIsCi0JCQkJICBfX2Z1bmNfXywgd2xjX2h3LT51bml0LCB3bGNfaHctPmNvcmVyZXYpKTsKKwkJCVdMX0VSUk9SKCIlczogd2wlZDogdW5zdXBwb3J0ZWQgcGh5IGluIGNvcmVyZXYgJWRcbiIsCisJCQkJIF9fZnVuY19fLCB3bGNfaHctPnVuaXQsIHdsY19ody0+Y29yZXJldik7CiAJfSBlbHNlIGlmIChEMTFSRVZfSVMod2xjX2h3LT5jb3JlcmV2LCAyNCkpIHsKIAkJaWYgKFdMQ0lTTENOUEhZKHdsY19ody0+YmFuZCkpIHsKIAkJCXdsY191Y29kZV93cml0ZSh3bGNfaHcsIGJjbTQzeHhfMjRfbGNuLAogCQkJCQliY200M3h4XzI0X2xjbnN6KTsKIAkJCXdsY19ody0+dWNvZGVfbG9hZGVkID0gdHJ1ZTsKIAkJfSBlbHNlIHsKLQkJCVdMX0VSUk9SKCgiJXM6IHdsJWQ6IHVuc3VwcG9ydGVkIHBoeSBpbiBjb3JlcmV2ICVkXG4iLAotCQkJCSAgX19mdW5jX18sIHdsY19ody0+dW5pdCwgd2xjX2h3LT5jb3JlcmV2KSk7CisJCQlXTF9FUlJPUigiJXM6IHdsJWQ6IHVuc3VwcG9ydGVkIHBoeSBpbiBjb3JlcmV2ICVkXG4iLAorCQkJCSBfX2Z1bmNfXywgd2xjX2h3LT51bml0LCB3bGNfaHctPmNvcmVyZXYpOwogCQl9CiAJfQogfQogCi1zdGF0aWMgdm9pZCB3bGNfdWNvZGVfd3JpdGUod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBjb25zdCB1MzIgdWNvZGVbXSwKK3N0YXRpYyB2b2lkIHdsY191Y29kZV93cml0ZShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgY29uc3QgdTMyIHVjb2RlW10sCiAJCQkgICAgICBjb25zdCB1aW50IG5ieXRlcykgewotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAJZDExcmVnc190ICpyZWdzID0gd2xjX2h3LT5yZWdzOwogCXVpbnQgaTsKIAl1aW50IGNvdW50OwogCiAJb3NoID0gd2xjX2h3LT5vc2g7CiAKLQlXTF9UUkFDRSgoIndsJWQ6IHdsY191Y29kZV93cml0ZVxuIiwgd2xjX2h3LT51bml0KSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY191Y29kZV93cml0ZVxuIiwgd2xjX2h3LT51bml0KTsKIAogCUFTU0VSVChJU19BTElHTkVEKG5ieXRlcywgc2l6ZW9mKHUzMikpKTsKIApAQCAtMjgyOSwxMyArMjg0OCwxMyBAQAogCQlXX1JFRyhvc2gsICZyZWdzLT5vYmpkYXRhLCB1Y29kZVtpXSk7CiB9CiAKLXN0YXRpYyB2b2lkIHdsY193cml0ZV9pbml0cyh3bGNfaHdfaW5mb190ICp3bGNfaHcsIGNvbnN0IGQxMWluaXRfdCAqaW5pdHMpCitzdGF0aWMgdm9pZCB3bGNfd3JpdGVfaW5pdHMoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIGNvbnN0IGQxMWluaXRfdCAqaW5pdHMpCiB7CiAJaW50IGk7Ci0Jb3NsX3QgKm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsKIAl2b2xhdGlsZSB1OCAqYmFzZTsKIAotCVdMX1RSQUNFKCgid2wlZDogd2xjX3dyaXRlX2luaXRzXG4iLCB3bGNfaHctPnVuaXQpKTsKKwlXTF9UUkFDRSgid2wlZDogd2xjX3dyaXRlX2luaXRzXG4iLCB3bGNfaHctPnVuaXQpOwogCiAJb3NoID0gd2xjX2h3LT5vc2g7CiAJYmFzZSA9ICh2b2xhdGlsZSB1OCAqKXdsY19ody0+cmVnczsKQEAgLTI4NTIsNyArMjg3MSw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCB3bGNfdWNvZGVfdHhhbnRfc2V0KHdsY19od19pbmZvX3QgKndsY19odykKK3N0YXRpYyB2b2lkIHdsY191Y29kZV90eGFudF9zZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpCiB7CiAJdTE2IHBoeWN0bDsKIAl1MTYgcGh5dHhhbnQgPSB3bGNfaHctPmJtYWNfcGh5dHhhbnQ7CkBAIC0yODY5LDcgKzI4ODgsNyBAQAogCXdsY19ibWFjX3dyaXRlX3NobSh3bGNfaHcsIE1fUlNQX1BDVExXRCwgcGh5Y3RsKTsKIH0KIAotdm9pZCB3bGNfYm1hY190eGFudF9zZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1MTYgcGh5dHhhbnQpCit2b2lkIHdsY19ibWFjX3R4YW50X3NldChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdTE2IHBoeXR4YW50KQogewogCS8qIHVwZGF0ZSBzdyBzdGF0ZSAqLwogCXdsY19ody0+Ym1hY19waHl0eGFudCA9IHBoeXR4YW50OwpAQCAtMjg4MSwxMiArMjkwMCwxMiBAQAogCiB9CiAKLXUxNiB3bGNfYm1hY19nZXRfdHhhbnQod2xjX2h3X2luZm9fdCAqd2xjX2h3KQordTE2IHdsY19ibWFjX2dldF90eGFudChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odykKIHsKIAlyZXR1cm4gKHUxNikgd2xjX2h3LT53bGMtPnN0Zi0+dHhhbnQ7CiB9CiAKLXZvaWQgd2xjX2JtYWNfYW50c2VsX3R5cGVfc2V0KHdsY19od19pbmZvX3QgKndsY19odywgdTggYW50c2VsX3R5cGUpCit2b2lkIHdsY19ibWFjX2FudHNlbF90eXBlX3NldChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdTggYW50c2VsX3R5cGUpCiB7CiAJd2xjX2h3LT5hbnRzZWxfdHlwZSA9IGFudHNlbF90eXBlOwogCkBAIC0yODk0LDcgKzI5MTMsNyBAQAogCXdsY19waHlfYW50c2VsX3R5cGVfc2V0KHdsY19ody0+YmFuZC0+cGksIGFudHNlbF90eXBlKTsKIH0KIAotdm9pZCB3bGNfYm1hY19maWZvZXJyb3JzKHdsY19od19pbmZvX3QgKndsY19odykKK3ZvaWQgd2xjX2JtYWNfZmlmb2Vycm9ycyhzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odykKIHsKIAlib29sIGZhdGFsID0gZmFsc2U7CiAJdWludCB1bml0OwpAQCAtMjkxMSw0NCArMjkzMCw0NSBAQAogCQlpZiAoIWludHN0YXR1cykKIAkJCWNvbnRpbnVlOwogCi0JCVdMX1RSQUNFKCgid2wlZDogd2xjX2JtYWNfZmlmb2Vycm9yczogaW50c3RhdHVzJWQgMHgleFxuIiwgdW5pdCwKLQkJCSAgaWR4LCBpbnRzdGF0dXMpKTsKKwkJV0xfVFJBQ0UoIndsJWQ6IHdsY19ibWFjX2ZpZm9lcnJvcnM6IGludHN0YXR1cyVkIDB4JXhcbiIsCisJCQkgdW5pdCwgaWR4LCBpbnRzdGF0dXMpOwogCiAJCWlmIChpbnRzdGF0dXMgJiBJX1JPKSB7Ci0JCQlXTF9FUlJPUigoIndsJWQ6IGZpZm8gJWQ6IHJlY2VpdmUgZmlmbyBvdmVyZmxvd1xuIiwKLQkJCQkgIHVuaXQsIGlkeCkpOworCQkJV0xfRVJST1IoIndsJWQ6IGZpZm8gJWQ6IHJlY2VpdmUgZmlmbyBvdmVyZmxvd1xuIiwKKwkJCQkgdW5pdCwgaWR4KTsKIAkJCVdMQ05USU5DUih3bGNfaHctPndsYy0+cHViLT5fY250LT5yeG9mbG8pOwogCQkJZmF0YWwgPSB0cnVlOwogCQl9CiAKIAkJaWYgKGludHN0YXR1cyAmIElfUEMpIHsKLQkJCVdMX0VSUk9SKCgid2wlZDogZmlmbyAlZDogZGVzY3JpcHRvciBlcnJvclxuIiwgdW5pdCwKLQkJCQkgIGlkeCkpOworCQkJV0xfRVJST1IoIndsJWQ6IGZpZm8gJWQ6IGRlc2NyaXB0b3IgZXJyb3JcbiIsCisJCQkJIHVuaXQsIGlkeCk7CiAJCQlXTENOVElOQ1Iod2xjX2h3LT53bGMtPnB1Yi0+X2NudC0+ZG1hZGUpOwogCQkJZmF0YWwgPSB0cnVlOwogCQl9CiAKIAkJaWYgKGludHN0YXR1cyAmIElfUEQpIHsKLQkJCVdMX0VSUk9SKCgid2wlZDogZmlmbyAlZDogZGF0YSBlcnJvclxuIiwgdW5pdCwgaWR4KSk7CisJCQlXTF9FUlJPUigid2wlZDogZmlmbyAlZDogZGF0YSBlcnJvclxuIiwgdW5pdCwgaWR4KTsKIAkJCVdMQ05USU5DUih3bGNfaHctPndsYy0+cHViLT5fY250LT5kbWFkYSk7CiAJCQlmYXRhbCA9IHRydWU7CiAJCX0KIAogCQlpZiAoaW50c3RhdHVzICYgSV9ERSkgewotCQkJV0xfRVJST1IoKCJ3bCVkOiBmaWZvICVkOiBkZXNjcmlwdG9yIHByb3RvY29sIGVycm9yXG4iLAotCQkJCSAgdW5pdCwgaWR4KSk7CisJCQlXTF9FUlJPUigid2wlZDogZmlmbyAlZDogZGVzY3JpcHRvciBwcm90b2NvbCBlcnJvclxuIiwKKwkJCQkgdW5pdCwgaWR4KTsKIAkJCVdMQ05USU5DUih3bGNfaHctPndsYy0+cHViLT5fY250LT5kbWFwZSk7CiAJCQlmYXRhbCA9IHRydWU7CiAJCX0KIAogCQlpZiAoaW50c3RhdHVzICYgSV9SVSkgewotCQkJV0xfRVJST1IoKCJ3bCVkOiBmaWZvICVkOiByZWNlaXZlIGRlc2NyaXB0b3IgdW5kZXJmbG93XG4iLCB1bml0LCBpZHgpKTsKKwkJCVdMX0VSUk9SKCJ3bCVkOiBmaWZvICVkOiByZWNlaXZlIGRlc2NyaXB0b3IgdW5kZXJmbG93XG4iLAorCQkJCSBpZHgsIHVuaXQpOwogCQkJV0xDTlRJTkNSKHdsY19ody0+d2xjLT5wdWItPl9jbnQtPnJ4dWZsb1tpZHhdKTsKIAkJfQogCiAJCWlmIChpbnRzdGF0dXMgJiBJX1hVKSB7Ci0JCQlXTF9FUlJPUigoIndsJWQ6IGZpZm8gJWQ6IHRyYW5zbWl0IGZpZm8gdW5kZXJmbG93XG4iLAotCQkJCSAgaWR4LCB1bml0KSk7CisJCQlXTF9FUlJPUigid2wlZDogZmlmbyAlZDogdHJhbnNtaXQgZmlmbyB1bmRlcmZsb3dcbiIsCisJCQkJIGlkeCwgdW5pdCk7CiAJCQlXTENOVElOQ1Iod2xjX2h3LT53bGMtPnB1Yi0+X2NudC0+dHh1ZmxvKTsKIAkJCWZhdGFsID0gdHJ1ZTsKIAkJfQpAQCAtMjk2Miw5ICsyOTgyLDkgQEAKIAl9CiB9CiAKLXZvaWQgd2xjX2ludHJzb24od2xjX2luZm9fdCAqd2xjKQordm9pZCB3bGNfaW50cnNvbihzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKLQl3bGNfaHdfaW5mb190ICp3bGNfaHcgPSB3bGMtPmh3OworCXN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3ID0gd2xjLT5odzsKIAlBU1NFUlQod2xjLT5kZWZtYWNpbnRtYXNrKTsKIAl3bGMtPm1hY2ludG1hc2sgPSB3bGMtPmRlZm1hY2ludG1hc2s7CiAJV19SRUcod2xjX2h3LT5vc2gsICZ3bGNfaHctPnJlZ3MtPm1hY2ludG1hc2ssIHdsYy0+bWFjaW50bWFzayk7CkBAIC0yOTc1LDcgKzI5OTUsNyBAQAogICogIGJ1dCBhbHNvIGJlY2F1c2UgcGVyLXBvcnQgY29kZSBtYXkgcmVxdWlyZSBzeW5jIHdpdGggdmFsaWQgaW50ZXJydXB0LgogICovCiAKLXN0YXRpYyB1MzIgd2xjX3dsaW50cnNvZmYod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIHUzMiB3bGNfd2xpbnRyc29mZihzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAlpZiAoIXdsYy0+aHctPnVwKQogCQlyZXR1cm4gMDsKQEAgLTI5ODMsNyArMzAwMyw3IEBACiAJcmV0dXJuIHdsX2ludHJzb2ZmKHdsYy0+d2wpOwogfQogCi1zdGF0aWMgdm9pZCB3bGNfd2xpbnRyc3Jlc3RvcmUod2xjX2luZm9fdCAqd2xjLCB1MzIgbWFjaW50bWFzaykKK3N0YXRpYyB2b2lkIHdsY193bGludHJzcmVzdG9yZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTMyIG1hY2ludG1hc2spCiB7CiAJaWYgKCF3bGMtPmh3LT51cCkKIAkJcmV0dXJuOwpAQCAtMjk5MSw5ICszMDExLDkgQEAKIAl3bF9pbnRyc3Jlc3RvcmUod2xjLT53bCwgbWFjaW50bWFzayk7CiB9CiAKLXUzMiB3bGNfaW50cnNvZmYod2xjX2luZm9fdCAqd2xjKQordTMyIHdsY19pbnRyc29mZihzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKLQl3bGNfaHdfaW5mb190ICp3bGNfaHcgPSB3bGMtPmh3OworCXN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3ID0gd2xjLT5odzsKIAl1MzIgbWFjaW50bWFzazsKIAogCWlmICghd2xjX2h3LT5jbGspCkBAIC0zMDEwLDkgKzMwMzAsOSBAQAogCXJldHVybiB3bGMtPm1hY2ludHN0YXR1cyA/IDAgOiBtYWNpbnRtYXNrOwogfQogCi12b2lkIHdsY19pbnRyc3Jlc3RvcmUod2xjX2luZm9fdCAqd2xjLCB1MzIgbWFjaW50bWFzaykKK3ZvaWQgd2xjX2ludHJzcmVzdG9yZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTMyIG1hY2ludG1hc2spCiB7Ci0Jd2xjX2h3X2luZm9fdCAqd2xjX2h3ID0gd2xjLT5odzsKKwlzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odyA9IHdsYy0+aHc7CiAJaWYgKCF3bGNfaHctPmNsaykKIAkJcmV0dXJuOwogCkBAIC0zMDIwLDcgKzMwNDAsNyBAQAogCVdfUkVHKHdsY19ody0+b3NoLCAmd2xjX2h3LT5yZWdzLT5tYWNpbnRtYXNrLCB3bGMtPm1hY2ludG1hc2spOwogfQogCi12b2lkIHdsY19ibWFjX211dGUod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBib29sIG9uLCBtYm9vbCBmbGFncykKK3ZvaWQgd2xjX2JtYWNfbXV0ZShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgYm9vbCBvbiwgbWJvb2wgZmxhZ3MpCiB7CiAJc3RydWN0IGV0aGVyX2FkZHIgbnVsbF9ldGhlcl9hZGRyID0geyB7MCwgMCwgMCwgMCwgMCwgMH0gfTsKIApAQCAtMzA1NiwxMiArMzA3NiwxMiBAQAogCQl3bGNfdWNvZGVfbXV0ZV9vdmVycmlkZV9jbGVhcih3bGNfaHcpOwogfQogCi12b2lkIHdsY19ibWFjX3NldF9kZWFmKHdsY19od19pbmZvX3QgKndsY19odywgYm9vbCB1c2VyX2ZsYWcpCit2b2lkIHdsY19ibWFjX3NldF9kZWFmKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBib29sIHVzZXJfZmxhZykKIHsKIAl3bGNfcGh5X3NldF9kZWFmKHdsY19ody0+YmFuZC0+cGksIHVzZXJfZmxhZyk7CiB9CiAKLWludCB3bGNfYm1hY194bXRmaWZvX3N6X2dldCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHVpbnQgZmlmbywgdWludCAqYmxvY2tzKQoraW50IHdsY19ibWFjX3htdGZpZm9fc3pfZ2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1aW50IGZpZm8sIHVpbnQgKmJsb2NrcykKIHsKIAlpZiAoZmlmbyA+PSBORklGTykKIAkJcmV0dXJuIEJDTUVfUkFOR0U7CkBAIC0zMDcxLDcgKzMwOTEsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgd2xjX2JtYWNfeG10Zmlmb19zel9zZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1aW50IGZpZm8sIHVpbnQgYmxvY2tzKQoraW50IHdsY19ibWFjX3htdGZpZm9fc3pfc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1aW50IGZpZm8sIHVpbnQgYmxvY2tzKQogewogCWlmIChmaWZvID49IE5GSUZPIHx8IGJsb2NrcyA+IDI5OSkKIAkJcmV0dXJuIEJDTUVfUkFOR0U7CkBAIC0zMDkxLDcgKzMxMTEsNyBAQAogICogYmUgcHVsbGluZyBkYXRhIGludG8gYSB0eCBmaWZvLCBieSB0aGUgdGltZSB0aGUgTUFDIGFja3MgdGhlIHN1c3BlbmQKICAqIHJlcXVlc3QuCiAgKi8KLWJvb2wgd2xjX2JtYWNfdHhfZmlmb19zdXNwZW5kZWQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1aW50IHR4X2ZpZm8pCitib29sIHdsY19ibWFjX3R4X2ZpZm9fc3VzcGVuZGVkKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1aW50IHR4X2ZpZm8pCiB7CiAJLyogY2hlY2sgdGhhdCBhIHN1c3BlbmQgaGFzIGJlZW4gcmVxdWVzdGVkIGFuZCBpcyBubyBsb25nZXIgcGVuZGluZyAqLwogCkBAIC0zMTEwLDcgKzMxMzAsNyBAQAogCXJldHVybiBmYWxzZTsKIH0KIAotdm9pZCB3bGNfYm1hY190eF9maWZvX3N1c3BlbmQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1aW50IHR4X2ZpZm8pCit2b2lkIHdsY19ibWFjX3R4X2ZpZm9fc3VzcGVuZChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdWludCB0eF9maWZvKQogewogCXU4IGZpZm8gPSAxIDw8IHR4X2ZpZm87CiAKQEAgLTMxNDEsNyArMzE2MSw3IEBACiAJfQogfQogCi12b2lkIHdsY19ibWFjX3R4X2ZpZm9fcmVzdW1lKHdsY19od19pbmZvX3QgKndsY19odywgdWludCB0eF9maWZvKQordm9pZCB3bGNfYm1hY190eF9maWZvX3Jlc3VtZShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdWludCB0eF9maWZvKQogewogCS8qIEJNQUNfTk9URTogV0xDX1RYX0ZJRk9fRU5BQiBpcyBkb25lIGluIHdsY19kcGMoKSBmb3IgRE1BIGNhc2UgYnV0IG5lZWQgdG8gYmUgZG9uZQogCSAqIGhlcmUgZm9yIFBJTyBvdGhlcndpc2UgdGhlIHdhdGNoZG9nIHdpbGwgY2F0Y2ggdGhlIGluY29uc2lzdGVuY3kgYW5kIGZpcmUKQEAgLTMxNjksMjAgKzMxODksMjAgQEAKICAqICAgMCBpZiB0aGUgaW50ZXJydXB0IGlzIG5vdCBmb3IgdXMsIG9yIHdlIGFyZSBpbiBzb21lIHNwZWNpYWwgY2FzZXM7CiAgKiAgIGRldmljZSBpbnRlcnJ1cHQgc3RhdHVzIGJpdHMgb3RoZXJ3aXNlLgogICovCi1zdGF0aWMgaW5saW5lIHUzMiB3bGNfaW50c3RhdHVzKHdsY19pbmZvX3QgKndsYywgYm9vbCBpbl9pc3IpCitzdGF0aWMgaW5saW5lIHUzMiB3bGNfaW50c3RhdHVzKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBib29sIGluX2lzcikKIHsKLQl3bGNfaHdfaW5mb190ICp3bGNfaHcgPSB3bGMtPmh3OworCXN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3ID0gd2xjLT5odzsKIAlkMTFyZWdzX3QgKnJlZ3MgPSB3bGNfaHctPnJlZ3M7CiAJdTMyIG1hY2ludHN0YXR1czsKIAl1MzIgaW50c3RhdHVzX3J4ZmlmbywgaW50c3RhdHVzX3R4c2ZpZm87Ci0Jb3NsX3QgKm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsKIAogCW9zaCA9IHdsY19ody0+b3NoOwogCiAJLyogbWFjaW50c3RhdHVzIGluY2x1ZGVzIGEgRE1BIGludGVycnVwdCBzdW1tYXJ5IGJpdCAqLwogCW1hY2ludHN0YXR1cyA9IFJfUkVHKG9zaCwgJnJlZ3MtPm1hY2ludHN0YXR1cyk7CiAKLQlXTF9UUkFDRSgoIndsJWQ6IG1hY2ludHN0YXR1czogMHgleFxuIiwgd2xjX2h3LT51bml0LCBtYWNpbnRzdGF0dXMpKTsKKwlXTF9UUkFDRSgid2wlZDogbWFjaW50c3RhdHVzOiAweCV4XG4iLCB3bGNfaHctPnVuaXQsIG1hY2ludHN0YXR1cyk7CiAKIAkvKiBkZXRlY3QgY2FyZGJ1cyByZW1vdmVkLCBpbiBwb3dlciBkb3duKHN1c3BlbmQpIGFuZCBpbiByZXNldCAqLwogCWlmIChERVZJQ0VSRU1PVkVEKHdsYykpCkBAIC0zMjA3LDkgKzMyMjcsNyBAQAogCSAqLwogCS8qIHR1cm4gb2ZmIHRoZSBpbnRlcnJ1cHRzICovCiAJV19SRUcob3NoLCAmcmVncy0+bWFjaW50bWFzaywgMCk7Ci0jaWZuZGVmIEJDTVNESU8KIAkodm9pZClSX1JFRyhvc2gsICZyZWdzLT5tYWNpbnRtYXNrKTsJLyogc3luYyByZWFkYmFjayAqLwotI2VuZGlmCiAJd2xjLT5tYWNpbnRtYXNrID0gMDsKIAogCS8qIGNsZWFyIGRldmljZSBpbnRlcnJ1cHRzICovCkBAIC0zMjI0LDcgKzMyNDIsOSBAQAogCQkJICAgIFJfUkVHKG9zaCwKIAkJCQkgICZyZWdzLT5pbnRjdHJscmVnc1tSWF9UWFNUQVRVU19GSUZPXS4KIAkJCQkgIGludHN0YXR1cyk7Ci0JCQlXTF9UUkFDRSgoIndsJWQ6IGludHN0YXR1c19yeGZpZm8gMHgleCwgaW50c3RhdHVzX3R4c2ZpZm8gMHgleFxuIiwgd2xjX2h3LT51bml0LCBpbnRzdGF0dXNfcnhmaWZvLCBpbnRzdGF0dXNfdHhzZmlmbykpOworCQkJV0xfVFJBQ0UoIndsJWQ6IGludHN0YXR1c19yeGZpZm8gMHgleCwgaW50c3RhdHVzX3R4c2ZpZm8gMHgleFxuIiwKKwkJCQkgd2xjX2h3LT51bml0LAorCQkJCSBpbnRzdGF0dXNfcnhmaWZvLCBpbnRzdGF0dXNfdHhzZmlmbyk7CiAKIAkJCS8qIGRlZmVyIHVuc29saWNpdGVkIGludGVycnVwdCBoaW50cyAqLwogCQkJaW50c3RhdHVzX3J4ZmlmbyAmPSBERUZfUlhJTlRNQVNLOwpAQCAtMzI2MSw3ICszMjgxLDcgQEAKIAogLyogVXBkYXRlIHdsYy0+bWFjaW50c3RhdHVzIGFuZCB3bGMtPmludHN0YXR1c1tdLiAqLwogLyogUmV0dXJuIHRydWUgaWYgdGhleSBhcmUgdXBkYXRlZCBzdWNjZXNzZnVsbHkuIGZhbHNlIG90aGVyd2lzZSAqLwotYm9vbCB3bGNfaW50cnN1cGQod2xjX2luZm9fdCAqd2xjKQorYm9vbCB3bGNfaW50cnN1cGQoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJdTMyIG1hY2ludHN0YXR1czsKIApAQCAtMzI4Niw5ICszMzA2LDkgQEAKICAqICp3YW50ZHBjIHdpbGwgYmUgc2V0IHRvIHRydWUgaWYgZnVydGhlciB3bGNfZHBjKCkgcHJvY2Vzc2luZyBpcyByZXF1aXJlZCwKICAqIGZhbHNlIG90aGVyd2lzZS4KICAqLwotYm9vbCBCQ01GQVNUUEFUSCB3bGNfaXNyKHdsY19pbmZvX3QgKndsYywgYm9vbCAqd2FudGRwYykKK2Jvb2wgQkNNRkFTVFBBVEggd2xjX2lzcihzdHJ1Y3Qgd2xjX2luZm8gKndsYywgYm9vbCAqd2FudGRwYykKIHsKLQl3bGNfaHdfaW5mb190ICp3bGNfaHcgPSB3bGMtPmh3OworCXN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3ID0gd2xjLT5odzsKIAl1MzIgbWFjaW50c3RhdHVzOwogCiAJKndhbnRkcGMgPSBmYWxzZTsKQEAgLTMzMDAsNyArMzMyMCw3IEBACiAJbWFjaW50c3RhdHVzID0gd2xjX2ludHN0YXR1cyh3bGMsIHRydWUpOwogCiAJaWYgKG1hY2ludHN0YXR1cyA9PSAweGZmZmZmZmZmKQotCQlXTF9FUlJPUigoIkRFVklDRVJFTU9WRUQgZGV0ZWN0ZWQgaW4gdGhlIElTUiBjb2RlIHBhdGguXG4iKSk7CisJCVdMX0VSUk9SKCJERVZJQ0VSRU1PVkVEIGRldGVjdGVkIGluIHRoZSBJU1IgY29kZSBwYXRoXG4iKTsKIAogCS8qIGl0IGlzIG5vdCBmb3IgdXMgKi8KIAlpZiAobWFjaW50c3RhdHVzID09IDApCkBAIC0zMzE3LDIwICszMzM3LDIwIEBACiB9CiAKIC8qIHByb2Nlc3MgdHggY29tcGxldGlvbiBldmVudHMgZm9yIGNvcmVyZXYgPCA1ICovCi1zdGF0aWMgYm9vbCB3bGNfYm1hY190eHN0YXR1c19jb3JlcmV2NCh3bGNfaHdfaW5mb190ICp3bGNfaHcpCitzdGF0aWMgYm9vbCB3bGNfYm1hY190eHN0YXR1c19jb3JlcmV2NChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odykKIHsKLQl2b2lkICpzdGF0dXNfcDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc3RhdHVzX3A7CiAJdHhfc3RhdHVzX3QgKnR4czsKLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCWJvb2wgZmF0YWwgPSBmYWxzZTsKIAotCVdMX1RSQUNFKCgid2wlZDogd2xjX3R4c3RhdHVzcmVjdlxuIiwgd2xjX2h3LT51bml0KSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY190eHN0YXR1c3JlY3ZcbiIsIHdsY19ody0+dW5pdCk7CiAKIAlvc2ggPSB3bGNfaHctPm9zaDsKIAogCXdoaWxlICghZmF0YWwgJiYgKHN0YXR1c19wID0gZG1hX3J4KHdsY19ody0+ZGlbUlhfVFhTVEFUVVNfRklGT10pKSkgewogCi0JCXR4cyA9ICh0eF9zdGF0dXNfdCAqKSBQS1REQVRBKHN0YXR1c19wKTsKKwkJdHhzID0gKHR4X3N0YXR1c190ICopIHN0YXR1c19wLT5kYXRhOwogCQkvKiBNQUMgdXNlcyBsaXR0bGUgZW5kaWFuIG9ubHkgKi8KIAkJbHRvaDE2X2J1Zigodm9pZCAqKXR4cywgc2l6ZW9mKHR4X3N0YXR1c190KSk7CiAKQEAgLTMzNDAsNyArMzM2MCw3IEBACiAKIAkJZmF0YWwgPSB3bGNfYm1hY19kb3R4c3RhdHVzKHdsY19odywgdHhzLCAwKTsKIAotCQlQS1RGUkVFKG9zaCwgc3RhdHVzX3AsIGZhbHNlKTsKKwkJcGt0X2J1Zl9mcmVlX3NrYihvc2gsIHN0YXR1c19wLCBmYWxzZSk7CiAJfQogCiAJaWYgKGZhdGFsKQpAQCAtMzM1Myw3ICszMzczLDcgQEAKIH0KIAogc3RhdGljIGJvb2wgQkNNRkFTVFBBVEgKLXdsY19ibWFjX2RvdHhzdGF0dXMod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB0eF9zdGF0dXNfdCAqdHhzLCB1MzIgczIpCit3bGNfYm1hY19kb3R4c3RhdHVzKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB0eF9zdGF0dXNfdCAqdHhzLCB1MzIgczIpCiB7CiAJLyogZGlzY2FyZCBpbnRlcm1lZGlhdGUgaW5kaWNhdGlvbnMgZm9yIHVjb2RlIHdpdGggb25lIGxlZ2l0aW1hdGUgY2FzZToKIAkgKiAgIGUuZy4gaWYgInVzZVJUUyIgaXMgc2V0LiB1Y29kZSBkaWQgYSBzdWNjZXNzZnVsIHJ0cy9jdHMgZXhjaGFuZ2UsIGJ1dCB0aGUgc3Vic2VxdWVudApAQCAtMzM3MiwxMiArMzM5MiwxMiBAQAogICogUmV0dXJuIHRydWUgaWYgbW9yZSB0eCBzdGF0dXMgbmVlZCB0byBiZSBwcm9jZXNzZWQuIGZhbHNlIG90aGVyd2lzZS4KICAqLwogc3RhdGljIGJvb2wgQkNNRkFTVFBBVEgKLXdsY19ibWFjX3R4c3RhdHVzKHdsY19od19pbmZvX3QgKndsY19odywgYm9vbCBib3VuZCwgYm9vbCAqZmF0YWwpCit3bGNfYm1hY190eHN0YXR1cyhzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgYm9vbCBib3VuZCwgYm9vbCAqZmF0YWwpCiB7CiAJYm9vbCBtb3JlcGVuZGluZyA9IGZhbHNlOwotCXdsY19pbmZvX3QgKndsYyA9IHdsY19ody0+d2xjOworCXN0cnVjdCB3bGNfaW5mbyAqd2xjID0gd2xjX2h3LT53bGM7CiAKLQlXTF9UUkFDRSgoIndsJWQ6IHdsY19ibWFjX3R4c3RhdHVzXG4iLCB3bGNfaHctPnVuaXQpKTsKKwlXTF9UUkFDRSgid2wlZDogd2xjX2JtYWNfdHhzdGF0dXNcbiIsIHdsY19ody0+dW5pdCk7CiAKIAlpZiAoRDExUkVWX0lTKHdsY19ody0+Y29yZXJldiwgNCkpIHsKIAkJLyogdG8gcmV0aXJlIHNvb24gKi8KQEAgLTMzODgsNyArMzQwOCw3IEBACiAJfSBlbHNlIHsKIAkJLyogY29yZXJldiA+PSA1ICovCiAJCWQxMXJlZ3NfdCAqcmVnczsKLQkJb3NsX3QgKm9zaDsKKwkJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAJCXR4X3N0YXR1c190IHR4c3RhdHVzLCAqdHhzOwogCQl1MzIgczEsIHMyOwogCQl1aW50IG4gPSAwOwpAQCAtMzQwMiw4ICszNDIyLDggQEAKIAkJICAgICAgICYmIChzMSA9IFJfUkVHKG9zaCwgJnJlZ3MtPmZybXR4c3RhdHVzKSkgJiBUWFNfVikgewogCiAJCQlpZiAoczEgPT0gMHhmZmZmZmZmZikgewotCQkJCVdMX0VSUk9SKCgid2wlZDogJXM6IGRlYWQgY2hpcFxuIiwKLQkJCQkJICB3bGNfaHctPnVuaXQsIF9fZnVuY19fKSk7CisJCQkJV0xfRVJST1IoIndsJWQ6ICVzOiBkZWFkIGNoaXBcbiIsCisJCQkJCSB3bGNfaHctPnVuaXQsIF9fZnVuY19fKTsKIAkJCQlBU1NFUlQoczEgIT0gMHhmZmZmZmZmZik7CiAJCQkJcmV0dXJuIG1vcmVwZW5kaW5nOwogCQkJfQpAQCAtMzQzNiwxNSArMzQ1NiwxNSBAQAogCXJldHVybiBtb3JlcGVuZGluZzsKIH0KIAotdm9pZCB3bGNfc3VzcGVuZF9tYWNfYW5kX3dhaXQod2xjX2luZm9fdCAqd2xjKQordm9pZCB3bGNfc3VzcGVuZF9tYWNfYW5kX3dhaXQoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7Ci0Jd2xjX2h3X2luZm9fdCAqd2xjX2h3ID0gd2xjLT5odzsKKwlzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odyA9IHdsYy0+aHc7CiAJZDExcmVnc190ICpyZWdzID0gd2xjX2h3LT5yZWdzOwogCXUzMiBtYywgbWk7Ci0Jb3NsX3QgKm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsKIAotCVdMX1RSQUNFKCgid2wlZDogd2xjX3N1c3BlbmRfbWFjX2FuZF93YWl0OiBiYW5kdW5pdCAlZFxuIiwgd2xjX2h3LT51bml0LAotCQkgIHdsY19ody0+YmFuZC0+YmFuZHVuaXQpKTsKKwlXTF9UUkFDRSgid2wlZDogd2xjX3N1c3BlbmRfbWFjX2FuZF93YWl0OiBiYW5kdW5pdCAlZFxuIiwKKwkJIHdsY19ody0+dW5pdCwgd2xjX2h3LT5iYW5kLT5iYW5kdW5pdCk7CiAKIAkvKgogCSAqIFRyYWNrIG92ZXJsYXBwaW5nIHN1c3BlbmQgcmVxdWVzdHMKQEAgLTM0NjEsNyArMzQ4MSw3IEBACiAJbWMgPSBSX1JFRyhvc2gsICZyZWdzLT5tYWNjb250cm9sKTsKIAogCWlmIChtYyA9PSAweGZmZmZmZmZmKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogJXM6IGRlYWQgY2hpcFxuIiwgd2xjX2h3LT51bml0LCBfX2Z1bmNfXykpOworCQlXTF9FUlJPUigid2wlZDogJXM6IGRlYWQgY2hpcFxuIiwgd2xjX2h3LT51bml0LCBfX2Z1bmNfXyk7CiAJCXdsX2Rvd24od2xjLT53bCk7CiAJCXJldHVybjsKIAl9CkBAIC0zNDcxLDcgKzM0OTEsNyBAQAogCiAJbWkgPSBSX1JFRyhvc2gsICZyZWdzLT5tYWNpbnRzdGF0dXMpOwogCWlmIChtaSA9PSAweGZmZmZmZmZmKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogJXM6IGRlYWQgY2hpcFxuIiwgd2xjX2h3LT51bml0LCBfX2Z1bmNfXykpOworCQlXTF9FUlJPUigid2wlZDogJXM6IGRlYWQgY2hpcFxuIiwgd2xjX2h3LT51bml0LCBfX2Z1bmNfXyk7CiAJCXdsX2Rvd24od2xjLT53bCk7CiAJCXJldHVybjsKIAl9CkBAIC0zNDgzLDE1ICszNTAzLDE4IEBACiAJCSBXTENfTUFYX01BQ19TVVNQRU5EKTsKIAogCWlmICghKFJfUkVHKG9zaCwgJnJlZ3MtPm1hY2ludHN0YXR1cykgJiBNSV9NQUNTU1BOREQpKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogd2xjX3N1c3BlbmRfbWFjX2FuZF93YWl0OiB3YWl0ZWQgJWQgdVMgYW5kICIKLQkJCSAgIk1JX01BQ1NTUE5ERCBpcyBzdGlsbCBub3Qgb24uXG4iLAotCQkJICB3bGNfaHctPnVuaXQsIFdMQ19NQVhfTUFDX1NVU1BFTkQpKTsKLQkJV0xfRVJST1IoKCJ3bCVkOiBwc21kZWJ1ZyAweCUwOHgsIHBoeWRlYnVnIDB4JTA4eCwgcHNtX2JyYyAweCUwNHhcbiIsIHdsY19ody0+dW5pdCwgUl9SRUcob3NoLCAmcmVncy0+cHNtZGVidWcpLCBSX1JFRyhvc2gsICZyZWdzLT5waHlkZWJ1ZyksIFJfUkVHKG9zaCwgJnJlZ3MtPnBzbV9icmMpKSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfc3VzcGVuZF9tYWNfYW5kX3dhaXQ6IHdhaXRlZCAlZCB1UyBhbmQgTUlfTUFDU1NQTkREIGlzIHN0aWxsIG5vdCBvbi5cbiIsCisJCQkgd2xjX2h3LT51bml0LCBXTENfTUFYX01BQ19TVVNQRU5EKTsKKwkJV0xfRVJST1IoIndsJWQ6IHBzbWRlYnVnIDB4JTA4eCwgcGh5ZGVidWcgMHglMDh4LCBwc21fYnJjIDB4JTA0eFxuIiwKKwkJCSB3bGNfaHctPnVuaXQsCisJCQkgUl9SRUcob3NoLCAmcmVncy0+cHNtZGVidWcpLAorCQkJIFJfUkVHKG9zaCwgJnJlZ3MtPnBoeWRlYnVnKSwKKwkJCSBSX1JFRyhvc2gsICZyZWdzLT5wc21fYnJjKSk7CiAJfQogCiAJbWMgPSBSX1JFRyhvc2gsICZyZWdzLT5tYWNjb250cm9sKTsKIAlpZiAobWMgPT0gMHhmZmZmZmZmZikgewotCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBkZWFkIGNoaXBcbiIsIHdsY19ody0+dW5pdCwgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIndsJWQ6ICVzOiBkZWFkIGNoaXBcbiIsIHdsY19ody0+dW5pdCwgX19mdW5jX18pOwogCQl3bF9kb3duKHdsYy0+d2wpOwogCQlyZXR1cm47CiAJfQpAQCAtMzUwMCwxNSArMzUyMywxNSBAQAogCUFTU0VSVCghKG1jICYgTUNUTF9FTl9NQUMpKTsKIH0KIAotdm9pZCB3bGNfZW5hYmxlX21hYyh3bGNfaW5mb190ICp3bGMpCit2b2lkIHdsY19lbmFibGVfbWFjKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewotCXdsY19od19pbmZvX3QgKndsY19odyA9IHdsYy0+aHc7CisJc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcgPSB3bGMtPmh3OwogCWQxMXJlZ3NfdCAqcmVncyA9IHdsY19ody0+cmVnczsKIAl1MzIgbWMsIG1pOwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAKLQlXTF9UUkFDRSgoIndsJWQ6IHdsY19lbmFibGVfbWFjOiBiYW5kdW5pdCAlZFxuIiwgd2xjX2h3LT51bml0LAotCQkgIHdsYy0+YmFuZC0+YmFuZHVuaXQpKTsKKwlXTF9UUkFDRSgid2wlZDogd2xjX2VuYWJsZV9tYWM6IGJhbmR1bml0ICVkXG4iLAorCQkgd2xjX2h3LT51bml0LCB3bGMtPmJhbmQtPmJhbmR1bml0KTsKIAogCS8qCiAJICogVHJhY2sgb3ZlcmxhcHBpbmcgc3VzcGVuZCByZXF1ZXN0cwpAQCAtMzUzOSw3ICszNTYyLDcgQEAKIAl3bGNfdWNvZGVfd2FrZV9vdmVycmlkZV9jbGVhcih3bGNfaHcsIFdMQ19XQUtFX09WRVJSSURFX01BQ1NVU1BFTkQpOwogfQogCi12b2lkIHdsY19ibWFjX2lmc2N0bF9lZGNyc19zZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBib29sIGFiaWUsIGJvb2wgaXNodCkKK3ZvaWQgd2xjX2JtYWNfaWZzY3RsX2VkY3JzX3NldChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgYm9vbCBhYmllLCBib29sIGlzaHQpCiB7CiAJaWYgKCEoV0xDSVNOUEhZKHdsY19ody0+YmFuZCkgJiYgKEQxMVJFVl9HRSh3bGNfaHctPmNvcmVyZXYsIDE2KSkpKQogCQlyZXR1cm47CkBAIC0zNTc1LDcgKzM1OTgsNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgd2xjX3VwZF9vZmRtX3BjdGwxX3RhYmxlKHdsY19od19pbmZvX3QgKndsY19odykKK3N0YXRpYyB2b2lkIHdsY191cGRfb2ZkbV9wY3RsMV90YWJsZShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odykKIHsKIAl1OCByYXRlOwogCXU4IHJhdGVzWzhdID0gewpAQCAtMzYwOSw3ICszNjMyLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB1MTYgd2xjX2JtYWNfb2ZkbV9yYXRldGFibGVfb2Zmc2V0KHdsY19od19pbmZvX3QgKndsY19odywgdTggcmF0ZSkKK3N0YXRpYyB1MTYgd2xjX2JtYWNfb2ZkbV9yYXRldGFibGVfb2Zmc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1OCByYXRlKQogewogCXVpbnQgaTsKIAl1OCBwbGNwX3JhdGUgPSAwOwpAQCAtMzY0Miw3ICszNjY1LDcgQEAKIAlyZXR1cm4gMiAqIHdsY19ibWFjX3JlYWRfc2htKHdsY19odywgTV9SVF9ESVJNQVBfQSArIChwbGNwX3JhdGUgKiAyKSk7CiB9CiAKLXZvaWQgd2xjX2JtYWNfYmFuZF9zdGZfc3Nfc2V0KHdsY19od19pbmZvX3QgKndsY19odywgdTggc3RmX21vZGUpCit2b2lkIHdsY19ibWFjX2JhbmRfc3RmX3NzX3NldChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdTggc3RmX21vZGUpCiB7CiAJd2xjX2h3LT5od19zdGZfc3Nfb3Btb2RlID0gc3RmX21vZGU7CiAKQEAgLTM2NTEsNyArMzY3NCw3IEBACiB9CiAKIHZvaWQgQkNNRkFTVFBBVEgKLXdsY19ibWFjX3JlYWRfdHNmKHdsY19od19pbmZvX3QgKndsY19odywgdTMyICp0c2ZfbF9wdHIsCit3bGNfYm1hY19yZWFkX3RzZihzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdTMyICp0c2ZfbF9wdHIsCiAJCSAgdTMyICp0c2ZfaF9wdHIpCiB7CiAJZDExcmVnc190ICpyZWdzID0gd2xjX2h3LT5yZWdzOwpAQCAtMzY2MywxNCArMzY4NiwxNCBAQAogCXJldHVybjsKIH0KIAotYm9vbCB3bGNfYm1hY192YWxpZGF0ZV9jaGlwX2FjY2Vzcyh3bGNfaHdfaW5mb190ICp3bGNfaHcpCitib29sIHdsY19ibWFjX3ZhbGlkYXRlX2NoaXBfYWNjZXNzKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KQogewogCWQxMXJlZ3NfdCAqcmVnczsKIAl1MzIgdywgdmFsOwogCXZvbGF0aWxlIHUxNiAqcmVnMTY7Ci0Jb3NsX3QgKm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsKIAotCVdMX1RSQUNFKCgid2wlZDogdmFsaWRhdGVfY2hpcF9hY2Nlc3NcbiIsIHdsY19ody0+dW5pdCkpOworCVdMX1RSQUNFKCJ3bCVkOiB2YWxpZGF0ZV9jaGlwX2FjY2Vzc1xuIiwgd2xjX2h3LT51bml0KTsKIAogCXJlZ3MgPSB3bGNfaHctPnJlZ3M7CiAJb3NoID0gd2xjX2h3LT5vc2g7CkBAIC0zNjkwLDcgKzM3MTMsOCBAQAogCSh2b2lkKVJfUkVHKG9zaCwgJnJlZ3MtPm9iamFkZHIpOwogCXZhbCA9IFJfUkVHKG9zaCwgJnJlZ3MtPm9iamRhdGEpOwogCWlmICh2YWwgIT0gKHUzMikgMHhhYTU1NTVhYSkgewotCQlXTF9FUlJPUigoIndsJWQ6IHZhbGlkYXRlX2NoaXBfYWNjZXNzOiBTSE0gPSAweCV4LCBleHBlY3RlZCAweGFhNTU1NWFhXG4iLCB3bGNfaHctPnVuaXQsIHZhbCkpOworCQlXTF9FUlJPUigid2wlZDogdmFsaWRhdGVfY2hpcF9hY2Nlc3M6IFNITSA9IDB4JXgsIGV4cGVjdGVkIDB4YWE1NTU1YWFcbiIsCisJCQkgd2xjX2h3LT51bml0LCB2YWwpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCkBAIC0zNzAyLDcgKzM3MjYsOCBAQAogCSh2b2lkKVJfUkVHKG9zaCwgJnJlZ3MtPm9iamFkZHIpOwogCXZhbCA9IFJfUkVHKG9zaCwgJnJlZ3MtPm9iamRhdGEpOwogCWlmICh2YWwgIT0gKHUzMikgMHg1NWFhYWE1NSkgewotCQlXTF9FUlJPUigoIndsJWQ6IHZhbGlkYXRlX2NoaXBfYWNjZXNzOiBTSE0gPSAweCV4LCBleHBlY3RlZCAweDU1YWFhYTU1XG4iLCB3bGNfaHctPnVuaXQsIHZhbCkpOworCQlXTF9FUlJPUigid2wlZDogdmFsaWRhdGVfY2hpcF9hY2Nlc3M6IFNITSA9IDB4JXgsIGV4cGVjdGVkIDB4NTVhYWFhNTVcbiIsCisJCQkgd2xjX2h3LT51bml0LCB2YWwpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCkBAIC0zNzMyLDEyICszNzU3LDE0IEBACiAJCS8qIHZlcmlmeSB3aXRoIHRoZSAxNiBiaXQgcmVnaXN0ZXJzIHRoYXQgaGF2ZSBubyBzaWRlIGVmZmVjdHMgKi8KIAkJdmFsID0gUl9SRUcob3NoLCAmcmVncy0+dHNmX2NmcHN0cnRfbCk7CiAJCWlmICh2YWwgIT0gKHVpbnQpIDB4QkJCQikgewotCQkJV0xfRVJST1IoKCJ3bCVkOiB2YWxpZGF0ZV9jaGlwX2FjY2VzczogdHNmX2NmcHN0cnRfbCA9IDB4JXgsIGV4cGVjdGVkIiAiIDB4JXhcbiIsIHdsY19ody0+dW5pdCwgdmFsLCAweEJCQkIpKTsKKwkJCVdMX0VSUk9SKCJ3bCVkOiB2YWxpZGF0ZV9jaGlwX2FjY2VzczogdHNmX2NmcHN0cnRfbCA9IDB4JXgsIGV4cGVjdGVkIDB4JXhcbiIsCisJCQkJIHdsY19ody0+dW5pdCwgdmFsLCAweEJCQkIpOwogCQkJcmV0dXJuIGZhbHNlOwogCQl9CiAJCXZhbCA9IFJfUkVHKG9zaCwgJnJlZ3MtPnRzZl9jZnBzdHJ0X2gpOwogCQlpZiAodmFsICE9ICh1aW50KSAweENDQ0MpIHsKLQkJCVdMX0VSUk9SKCgid2wlZDogdmFsaWRhdGVfY2hpcF9hY2Nlc3M6IHRzZl9jZnBzdHJ0X2ggPSAweCV4LCBleHBlY3RlZCIgIiAweCV4XG4iLCB3bGNfaHctPnVuaXQsIHZhbCwgMHhDQ0NDKSk7CisJCQlXTF9FUlJPUigid2wlZDogdmFsaWRhdGVfY2hpcF9hY2Nlc3M6IHRzZl9jZnBzdHJ0X2ggPSAweCV4LCBleHBlY3RlZCAweCV4XG4iLAorCQkJCSB3bGNfaHctPnVuaXQsIHZhbCwgMHhDQ0NDKTsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQogCkBAIC0zNzQ5LDcgKzM3NzYsMTAgQEAKIAl3ID0gUl9SRUcob3NoLCAmcmVncy0+bWFjY29udHJvbCk7CiAJaWYgKCh3ICE9IChNQ1RMX0lIUl9FTiB8IE1DVExfV0FLRSkpICYmCiAJICAgICh3ICE9IChNQ1RMX0lIUl9FTiB8IE1DVExfR01PREUgfCBNQ1RMX1dBS0UpKSkgewotCQlXTF9FUlJPUigoIndsJWQ6IHZhbGlkYXRlX2NoaXBfYWNjZXNzOiBtYWNjb250cm9sID0gMHgleCwgZXhwZWN0ZWQgMHgleCBvciAweCV4XG4iLCB3bGNfaHctPnVuaXQsIHcsIChNQ1RMX0lIUl9FTiB8IE1DVExfV0FLRSksIChNQ1RMX0lIUl9FTiB8IE1DVExfR01PREUgfCBNQ1RMX1dBS0UpKSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB2YWxpZGF0ZV9jaGlwX2FjY2VzczogbWFjY29udHJvbCA9IDB4JXgsIGV4cGVjdGVkIDB4JXggb3IgMHgleFxuIiwKKwkJCSB3bGNfaHctPnVuaXQsIHcsCisJCQkgKE1DVExfSUhSX0VOIHwgTUNUTF9XQUtFKSwKKwkJCSAoTUNUTF9JSFJfRU4gfCBNQ1RMX0dNT0RFIHwgTUNUTF9XQUtFKSk7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKQEAgLTM3NTgsMTMgKzM3ODgsMTMgQEAKIAogI2RlZmluZSBQSFlQTExfV0FJVF9VUwkxMDAwMDAKIAotdm9pZCB3bGNfYm1hY19jb3JlX3BoeXBsbF9jdGwod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBib29sIG9uKQordm9pZCB3bGNfYm1hY19jb3JlX3BoeXBsbF9jdGwoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIGJvb2wgb24pCiB7CiAJZDExcmVnc190ICpyZWdzOwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAJdTMyIHRtcDsKIAotCVdMX1RSQUNFKCgid2wlZDogd2xjX2JtYWNfY29yZV9waHlwbGxfY3RsXG4iLCB3bGNfaHctPnVuaXQpKTsKKwlXTF9UUkFDRSgid2wlZDogd2xjX2JtYWNfY29yZV9waHlwbGxfY3RsXG4iLCB3bGNfaHctPnVuaXQpOwogCiAJdG1wID0gMDsKIAlyZWdzID0gd2xjX2h3LT5yZWdzOwpAQCAtMzc4NSw4ICszODE1LDggQEAKIAkJCXRtcCA9IFJfUkVHKG9zaCwgJnJlZ3MtPmNsa19jdGxfc3QpOwogCQkJaWYgKCh0bXAgJiAoQ0NTX0VSU1JDX0FWQUlMX0hUKSkgIT0KIAkJCSAgICAoQ0NTX0VSU1JDX0FWQUlMX0hUKSkgewotCQkJCVdMX0VSUk9SKCgiJXM6IHR1cm4gb24gUEhZIFBMTCBmYWlsZWRcbiIsCi0JCQkJCSAgX19mdW5jX18pKTsKKwkJCQlXTF9FUlJPUigiJXM6IHR1cm4gb24gUEhZIFBMTCBmYWlsZWRcbiIsCisJCQkJCSBfX2Z1bmNfXyk7CiAJCQkJQVNTRVJUKDApOwogCQkJfQogCQl9IGVsc2UgewpAQCAtMzgwMyw4ICszODMzLDggQEAKIAkJCSAgICAgKENDU19FUlNSQ19BVkFJTF9EMTFQTEwgfCBDQ1NfRVJTUkNfQVZBSUxfUEhZUExMKSkKIAkJCSAgICAhPQogCQkJICAgIChDQ1NfRVJTUkNfQVZBSUxfRDExUExMIHwgQ0NTX0VSU1JDX0FWQUlMX1BIWVBMTCkpIHsKLQkJCQlXTF9FUlJPUigoIiVzOiB0dXJuIG9uIFBIWSBQTEwgZmFpbGVkXG4iLAotCQkJCQkgIF9fZnVuY19fKSk7CisJCQkJV0xfRVJST1IoIiVzOiB0dXJuIG9uIFBIWSBQTEwgZmFpbGVkXG4iLAorCQkJCQkgX19mdW5jX18pOwogCQkJCUFTU0VSVCgwKTsKIAkJCX0KIAkJfQpAQCAtMzgxNywxMSArMzg0NywxMSBAQAogCX0KIH0KIAotdm9pZCB3bGNfY29yZWRpc2FibGUod2xjX2h3X2luZm9fdCAqd2xjX2h3KQordm9pZCB3bGNfY29yZWRpc2FibGUoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpCiB7CiAJYm9vbCBkZXZfZ29uZTsKIAotCVdMX1RSQUNFKCgid2wlZDogJXNcbiIsIHdsY19ody0+dW5pdCwgX19mdW5jX18pKTsKKwlXTF9UUkFDRSgid2wlZDogJXNcbiIsIHdsY19ody0+dW5pdCwgX19mdW5jX18pOwogCiAJQVNTRVJUKCF3bGNfaHctPnVwKTsKIApAQCAtMzg1Nyw5ICszODg3LDkgQEAKIH0KIAogLyogcG93ZXIgYm90aCB0aGUgcGxsIGFuZCBleHRlcm5hbCBvc2NpbGxhdG9yIG9uL29mZiAqLwotdm9pZCB3bGNfYm1hY194dGFsKHdsY19od19pbmZvX3QgKndsY19odywgYm9vbCB3YW50KQordm9pZCB3bGNfYm1hY194dGFsKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBib29sIHdhbnQpCiB7Ci0JV0xfVFJBQ0UoKCJ3bCVkOiB3bGNfYm1hY194dGFsOiB3YW50ICVkXG4iLCB3bGNfaHctPnVuaXQsIHdhbnQpKTsKKwlXTF9UUkFDRSgid2wlZDogd2xjX2JtYWNfeHRhbDogd2FudCAlZFxuIiwgd2xjX2h3LT51bml0LCB3YW50KTsKIAogCS8qIGRvbnQgcG93ZXIgZG93biBpZiBwbGxkb3duIGlzIGZhbHNlIG9yIHdlIG11c3QgcG9sbCBodyByYWRpbyBkaXNhYmxlICovCiAJaWYgKCF3YW50ICYmIHdsY19ody0+cGxscmVxKQpAQCAtMzg3Niw5ICszOTA2LDkgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHdsY19mbHVzaHF1ZXVlcyh3bGNfaW5mb190ICp3bGMpCitzdGF0aWMgdm9pZCB3bGNfZmx1c2hxdWV1ZXMoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7Ci0Jd2xjX2h3X2luZm9fdCAqd2xjX2h3ID0gd2xjLT5odzsKKwlzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odyA9IHdsYy0+aHc7CiAJdWludCBpOwogCiAJd2xjLT50eHBlbmQxNjE2NXdhciA9IDA7CkBAIC0zODg4LDggKzM5MTgsOCBAQAogCQlpZiAod2xjX2h3LT5kaVtpXSkgewogCQkJZG1hX3R4cmVjbGFpbSh3bGNfaHctPmRpW2ldLCBITkRETUFfUkFOR0VfQUxMKTsKIAkJCVRYUEtUUEVORENMUih3bGMsIGkpOwotCQkJV0xfVFJBQ0UoKCJ3bGNfZmx1c2hxdWV1ZXM6IHBrdHBlbmQgZmlmbyAlZCBjbGVhcmVkXG4iLAotCQkJCSAgaSkpOworCQkJV0xfVFJBQ0UoIndsY19mbHVzaHF1ZXVlczogcGt0cGVuZCBmaWZvICVkIGNsZWFyZWRcbiIsCisJCQkJIGkpOwogCQl9CiAKIAkvKiBmcmVlIGFueSBwb3N0ZWQgcnggcGFja2V0cyAqLwpAQCAtMzg5OCwxMiArMzkyOCwxMiBAQAogCQlkbWFfcnhyZWNsYWltKHdsY19ody0+ZGlbUlhfVFhTVEFUVVNfRklGT10pOwogfQogCi11MTYgd2xjX2JtYWNfcmVhZF9zaG0od2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1aW50IG9mZnNldCkKK3UxNiB3bGNfYm1hY19yZWFkX3NobShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdWludCBvZmZzZXQpCiB7CiAJcmV0dXJuIHdsY19ibWFjX3JlYWRfb2JqbWVtKHdsY19odywgb2Zmc2V0LCBPQkpBRERSX1NITV9TRUwpOwogfQogCi12b2lkIHdsY19ibWFjX3dyaXRlX3NobSh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHVpbnQgb2Zmc2V0LCB1MTYgdikKK3ZvaWQgd2xjX2JtYWNfd3JpdGVfc2htKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1aW50IG9mZnNldCwgdTE2IHYpCiB7CiAJd2xjX2JtYWNfd3JpdGVfb2JqbWVtKHdsY19odywgb2Zmc2V0LCB2LCBPQkpBRERSX1NITV9TRUwpOwogfQpAQCAtMzkxMiw3ICszOTQyLDcgQEAKICAqIFNITSAnb2Zmc2V0JyBuZWVkcyB0byBiZSBhbiBldmVuIGFkZHJlc3MgYW5kCiAgKiBCdWZmZXIgbGVuZ3RoICdsZW4nIG11c3QgYmUgYW4gZXZlbiBudW1iZXIgb2YgYnl0ZXMKICAqLwotdm9pZCB3bGNfYm1hY19zZXRfc2htKHdsY19od19pbmZvX3QgKndsY19odywgdWludCBvZmZzZXQsIHUxNiB2LCBpbnQgbGVuKQordm9pZCB3bGNfYm1hY19zZXRfc2htKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1aW50IG9mZnNldCwgdTE2IHYsIGludCBsZW4pCiB7CiAJaW50IGk7CiAKQEAgLTM5MjksNyArMzk1OSw3IEBACiB9CiAKIHN0YXRpYyB1MTYKLXdsY19ibWFjX3JlYWRfb2JqbWVtKHdsY19od19pbmZvX3QgKndsY19odywgdWludCBvZmZzZXQsIHUzMiBzZWwpCit3bGNfYm1hY19yZWFkX29iam1lbShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdWludCBvZmZzZXQsIHUzMiBzZWwpCiB7CiAJZDExcmVnc190ICpyZWdzID0gd2xjX2h3LT5yZWdzOwogCXZvbGF0aWxlIHUxNiAqb2JqZGF0YV9sbyA9ICh2b2xhdGlsZSB1MTYgKikmcmVncy0+b2JqZGF0YTsKQEAgLTM5NTAsNyArMzk4MCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi13bGNfYm1hY193cml0ZV9vYmptZW0od2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1aW50IG9mZnNldCwgdTE2IHYsIHUzMiBzZWwpCit3bGNfYm1hY193cml0ZV9vYmptZW0oc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHVpbnQgb2Zmc2V0LCB1MTYgdiwgdTMyIHNlbCkKIHsKIAlkMTFyZWdzX3QgKnJlZ3MgPSB3bGNfaHctPnJlZ3M7CiAJdm9sYXRpbGUgdTE2ICpvYmpkYXRhX2xvID0gKHZvbGF0aWxlIHUxNiAqKSZyZWdzLT5vYmpkYXRhOwpAQCAtMzk3Myw3ICs0MDAzLDcgQEAKICAqICdzZWwnIHNlbGVjdHMgdGhlIHR5cGUgb2YgbWVtb3J5CiAgKi8KIHZvaWQKLXdsY19ibWFjX2NvcHl0b19vYmptZW0od2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1aW50IG9mZnNldCwgY29uc3Qgdm9pZCAqYnVmLAord2xjX2JtYWNfY29weXRvX29iam1lbShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdWludCBvZmZzZXQsIGNvbnN0IHZvaWQgKmJ1ZiwKIAkJICAgICAgIGludCBsZW4sIHUzMiBzZWwpCiB7CiAJdTE2IHY7CkBAIC0zOTk5LDcgKzQwMjksNyBAQAogICogJ3NlbCcgc2VsZWN0cyB0aGUgdHlwZSBvZiBtZW1vcnkKICAqLwogdm9pZAotd2xjX2JtYWNfY29weWZyb21fb2JqbWVtKHdsY19od19pbmZvX3QgKndsY19odywgdWludCBvZmZzZXQsIHZvaWQgKmJ1ZiwKK3dsY19ibWFjX2NvcHlmcm9tX29iam1lbShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdWludCBvZmZzZXQsIHZvaWQgKmJ1ZiwKIAkJCSBpbnQgbGVuLCB1MzIgc2VsKQogewogCXUxNiB2OwpAQCAtNDAyMCwxNiArNDA1MCwxNiBAQAogCX0KIH0KIAotdm9pZCB3bGNfYm1hY19jb3B5ZnJvbV92YXJzKHdsY19od19pbmZvX3QgKndsY19odywgY2hhciAqKmJ1ZiwgdWludCAqbGVuKQordm9pZCB3bGNfYm1hY19jb3B5ZnJvbV92YXJzKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBjaGFyICoqYnVmLCB1aW50ICpsZW4pCiB7Ci0JV0xfVFJBQ0UoKCJ3bGNfYm1hY19jb3B5ZnJvbV92YXJzLCBudnJhbSB2YXJzIHRvdGxlbj0lZFxuIiwKLQkJICB3bGNfaHctPnZhcnNfc2l6ZSkpOworCVdMX1RSQUNFKCJ3bGNfYm1hY19jb3B5ZnJvbV92YXJzLCBudnJhbSB2YXJzIHRvdGxlbj0lZFxuIiwKKwkJIHdsY19ody0+dmFyc19zaXplKTsKIAogCSpidWYgPSB3bGNfaHctPnZhcnM7CiAJKmxlbiA9IHdsY19ody0+dmFyc19zaXplOwogfQogCi12b2lkIHdsY19ibWFjX3JldHJ5bGltaXRfdXBkKHdsY19od19pbmZvX3QgKndsY19odywgdTE2IFNSTCwgdTE2IExSTCkKK3ZvaWQgd2xjX2JtYWNfcmV0cnlsaW1pdF91cGQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHUxNiBTUkwsIHUxNiBMUkwpCiB7CiAJd2xjX2h3LT5TUkwgPSBTUkw7CiAJd2xjX2h3LT5MUkwgPSBMUkw7CkBAIC00MDQ3LDE3ICs0MDc3LDE3IEBACiAJfQogfQogCi12b2lkIHdsY19ibWFjX3NldF9ub3Jlc2V0KHdsY19od19pbmZvX3QgKndsY19odywgYm9vbCBub3Jlc2V0X2ZsYWcpCit2b2lkIHdsY19ibWFjX3NldF9ub3Jlc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBib29sIG5vcmVzZXRfZmxhZykKIHsKIAl3bGNfaHctPm5vcmVzZXQgPSBub3Jlc2V0X2ZsYWc7CiB9CiAKLXZvaWQgd2xjX2JtYWNfc2V0X3Vjb2RlX2xvYWRlZCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIGJvb2wgdWNvZGVfbG9hZGVkKQordm9pZCB3bGNfYm1hY19zZXRfdWNvZGVfbG9hZGVkKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBib29sIHVjb2RlX2xvYWRlZCkKIHsKIAl3bGNfaHctPnVjb2RlX2xvYWRlZCA9IHVjb2RlX2xvYWRlZDsKIH0KIAotdm9pZCB3bGNfYm1hY19wbGxyZXEod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBib29sIHNldCwgbWJvb2wgcmVxX2JpdCkKK3ZvaWQgd2xjX2JtYWNfcGxscmVxKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBib29sIHNldCwgbWJvb2wgcmVxX2JpdCkKIHsKIAlBU1NFUlQocmVxX2JpdCk7CiAKQEAgLTQwODgsNyArNDExOCw3IEBACiAJcmV0dXJuOwogfQogCi12b2lkIHdsY19ibWFjX3NldF9jbGsod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBib29sIG9uKQordm9pZCB3bGNfYm1hY19zZXRfY2xrKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBib29sIG9uKQogewogCWlmIChvbikgewogCQkvKiBwb3dlciB1cCBwbGwgYW5kIG9zY2lsbGF0b3IgKi8KQEAgLTQxMTAsNyArNDE0MCw3IEBACiB9CiAKIC8qIHRoaXMgd2lsbCBiZSB0cnVlIGZvciBhbGwgYWkgY2hpcHMgKi8KLWJvb2wgd2xjX2JtYWNfdGFjbGVhcih3bGNfaHdfaW5mb190ICp3bGNfaHcsIGJvb2wgdGFfb2spCitib29sIHdsY19ibWFjX3RhY2xlYXIoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIGJvb2wgdGFfb2spCiB7CiAJcmV0dXJuIHRydWU7CiB9CkBAIC00MTE4LDcgKzQxNDgsNyBAQAogLyogTG93ZXIgZG93biByZWxldmFudCBHUElPcyBsaWtlIExFRCB3aGVuIGdvaW5nIGRvd24gdy9vCiAgKiBkb2luZyBQQ0kgY29uZmlnIGN5Y2xlcyBvciB0b3VjaGluZyBpbnRlcnJ1cHRzCiAgKi8KLXZvaWQgd2xjX2dwaW9fZmFzdF9kZWluaXQod2xjX2h3X2luZm9fdCAqd2xjX2h3KQordm9pZCB3bGNfZ3Bpb19mYXN0X2RlaW5pdChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odykKIHsKIAlpZiAoKHdsY19odyA9PSBOVUxMKSB8fCAod2xjX2h3LT5zaWggPT0gTlVMTCkpCiAJCXJldHVybjsKQEAgLTQxMjYsMTcgKzQxNTYsMTcgQEAKIAkvKiBPbmx5IGNoaXBzIHdpdGggaW50ZXJuYWwgYnVzIG9yIFBDSUUgY29yZXMgb3IgY2VydGFpbiBQQ0kgY29yZXMKIAkgKiBhcmUgYWJsZSB0byBzd2l0Y2ggY29yZXMgdy9vIGRpc2FibGluZyBpbnRlcnJ1cHRzCiAJICovCi0JaWYgKCEoKEJVU1RZUEUod2xjX2h3LT5zaWgtPmJ1c3R5cGUpID09IFNJX0JVUykgfHwKLQkgICAgICAoKEJVU1RZUEUod2xjX2h3LT5zaWgtPmJ1c3R5cGUpID09IFBDSV9CVVMpICYmCisJaWYgKCEoKHdsY19ody0+c2loLT5idXN0eXBlID09IFNJX0JVUykgfHwKKwkgICAgICAoKHdsY19ody0+c2loLT5idXN0eXBlID09IFBDSV9CVVMpICYmCiAJICAgICAgICgod2xjX2h3LT5zaWgtPmJ1c2NvcmV0eXBlID09IFBDSUVfQ09SRV9JRCkgfHwKIAkJKHdsY19ody0+c2loLT5idXNjb3JlcmV2ID49IDEzKSkpKSkKIAkJcmV0dXJuOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiAlc1xuIiwgd2xjX2h3LT51bml0LCBfX2Z1bmNfXykpOworCVdMX1RSQUNFKCJ3bCVkOiAlc1xuIiwgd2xjX2h3LT51bml0LCBfX2Z1bmNfXyk7CiAJcmV0dXJuOwogfQogCi1ib29sIHdsY19ibWFjX3JhZGlvX2h3KHdsY19od19pbmZvX3QgKndsY19odywgYm9vbCBlbmFibGUpCitib29sIHdsY19ibWFjX3JhZGlvX2h3KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBib29sIGVuYWJsZSkKIHsKIAkvKiBEbyBub3QgYWNjZXNzIFBoeSByZWdpc3RlcnMgaWYgY29yZSBpcyBub3QgdXAgKi8KIAlpZiAoc2lfaXNjb3JldXAod2xjX2h3LT5zaWgpID09IGZhbHNlKQpAQCAtNDE3MSw3ICs0MjAxLDcgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotdTE2IHdsY19ibWFjX3JhdGVfc2htX29mZnNldCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHU4IHJhdGUpCit1MTYgd2xjX2JtYWNfcmF0ZV9zaG1fb2Zmc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1OCByYXRlKQogewogCXUxNiB0YWJsZV9wdHI7CiAJdTggcGh5X3JhdGUsIGluZGV4OwpAQCAtNDE5NSwxMiArNDIyNSwxMiBAQAogCXJldHVybiAyICogd2xjX2JtYWNfcmVhZF9zaG0od2xjX2h3LCB0YWJsZV9wdHIgKyAoaW5kZXggKiAyKSk7CiB9CiAKLXZvaWQgd2xjX2JtYWNfc2V0X3R4cHdyX3BlcmNlbnQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1OCB2YWwpCit2b2lkIHdsY19ibWFjX3NldF90eHB3cl9wZXJjZW50KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1OCB2YWwpCiB7CiAJd2xjX3BoeV90eHB3cl9wZXJjZW50X3NldCh3bGNfaHctPmJhbmQtPnBpLCB2YWwpOwogfQogCi12b2lkIHdsY19ibWFjX2FudHNlbF9zZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1MzIgYW50c2VsX2F2YWlsKQordm9pZCB3bGNfYm1hY19hbnRzZWxfc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1MzIgYW50c2VsX2F2YWlsKQogewogCXdsY19ody0+YW50c2VsX2F2YWlsID0gYW50c2VsX2F2YWlsOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2JtYWMuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19ibWFjLmgKaW5kZXggODcyYmM4ZC4uOTgxNTBhYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19ibWFjLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2JtYWMuaApAQCAtNTcsNyArNTcsOCBAQAogCX0gYmFuZFtNQVhCQU5EU107CiB9IHdsY19ibWFjX3JldmluZm9fdDsKIAotLyogZHVwIHN0YXRlIGJldHdlZW4gQk1BQyh3bGNfaHdfaW5mb190KSBhbmQgSElHSCh3bGNfaW5mb190KSBkcml2ZXIgKi8KKy8qIGR1cCBzdGF0ZSBiZXR3ZWVuIEJNQUMoc3RydWN0IHdsY19od19pbmZvKSBhbmQgSElHSChzdHJ1Y3Qgd2xjX2luZm8pCisgICBkcml2ZXIgKi8KIHR5cGVkZWYgc3RydWN0IHdsY19ibWFjX3N0YXRlIHsKIAl1MzIgbWFjaHdjYXA7CS8qIG1hYyBodyBjYXBpYmlsaXR5ICovCiAJdTMyIHByZWFtYmxlX292cjsJLyogcHJlYW1ibGUgb3ZlcnJpZGUgKi8KQEAgLTEzMCwxNDggKzEzMSwxNDMgQEAKIAlXTENIV19TVEFURV9MQVNUCiB9IHdsY19ibWFjX3N0YXRlX2lkX3Q7CiAKLWV4dGVybiBpbnQgd2xjX2JtYWNfYXR0YWNoKHdsY19pbmZvX3QgKndsYywgdTE2IHZlbmRvciwgdTE2IGRldmljZSwKLQkJCSAgIHVpbnQgdW5pdCwgYm9vbCBwaW9tb2RlLCBvc2xfdCAqb3NoLCB2b2lkICpyZWdzdmEsCi0JCQkgICB1aW50IGJ1c3R5cGUsIHZvaWQgKmJ0cGFyYW0pOwotZXh0ZXJuIGludCB3bGNfYm1hY19kZXRhY2god2xjX2luZm9fdCAqd2xjKTsKK2V4dGVybiBpbnQgd2xjX2JtYWNfYXR0YWNoKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1MTYgdmVuZG9yLCB1MTYgZGV2aWNlLAorCQkJICAgdWludCB1bml0LCBib29sIHBpb21vZGUsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLAorCQkJICAgdm9pZCAqcmVnc3ZhLCB1aW50IGJ1c3R5cGUsIHZvaWQgKmJ0cGFyYW0pOworZXh0ZXJuIGludCB3bGNfYm1hY19kZXRhY2goc3RydWN0IHdsY19pbmZvICp3bGMpOwogZXh0ZXJuIHZvaWQgd2xjX2JtYWNfd2F0Y2hkb2codm9pZCAqYXJnKTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX2luZm9faW5pdCh3bGNfaHdfaW5mb190ICp3bGNfaHcpOworZXh0ZXJuIHZvaWQgd2xjX2JtYWNfaW5mb19pbml0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KTsKIAogLyogdXAvZG93biwgcmVzZXQsIGNsayAqLwotI2lmZGVmIFdMQ19MT1cKLWV4dGVybiB2b2lkIHdsY19ibWFjX3h0YWwod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBib29sIHdhbnQpOwotI2VuZGlmCitleHRlcm4gdm9pZCB3bGNfYm1hY194dGFsKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBib29sIHdhbnQpOwogCi1leHRlcm4gdm9pZCB3bGNfYm1hY19jb3B5dG9fb2JqbWVtKHdsY19od19pbmZvX3QgKndsY19odywKK2V4dGVybiB2b2lkIHdsY19ibWFjX2NvcHl0b19vYmptZW0oc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsCiAJCQkJICAgdWludCBvZmZzZXQsIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IGxlbiwKIAkJCQkgICB1MzIgc2VsKTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX2NvcHlmcm9tX29iam1lbSh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHVpbnQgb2Zmc2V0LAorZXh0ZXJuIHZvaWQgd2xjX2JtYWNfY29weWZyb21fb2JqbWVtKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1aW50IG9mZnNldCwKIAkJCQkgICAgIHZvaWQgKmJ1ZiwgaW50IGxlbiwgdTMyIHNlbCk7CiAjZGVmaW5lIHdsY19ibWFjX2NvcHlmcm9tX3NobSh3bGNfaHcsIG9mZnNldCwgYnVmLCBsZW4pICAgICAgICAgICAgICAgICBcCiAJd2xjX2JtYWNfY29weWZyb21fb2JqbWVtKHdsY19odywgb2Zmc2V0LCBidWYsIGxlbiwgT0JKQUREUl9TSE1fU0VMKQogI2RlZmluZSB3bGNfYm1hY19jb3B5dG9fc2htKHdsY19odywgb2Zmc2V0LCBidWYsIGxlbikgICAgICAgICAgICAgICAgICAgXAogCXdsY19ibWFjX2NvcHl0b19vYmptZW0od2xjX2h3LCBvZmZzZXQsIGJ1ZiwgbGVuLCBPQkpBRERSX1NITV9TRUwpCiAKLWV4dGVybiB2b2lkIHdsY19ibWFjX2NvcmVfcGh5X2Nsayh3bGNfaHdfaW5mb190ICp3bGNfaHcsIGJvb2wgY2xrKTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX2NvcmVfcGh5cGxsX3Jlc2V0KHdsY19od19pbmZvX3QgKndsY19odyk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19jb3JlX3BoeXBsbF9jdGwod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBib29sIG9uKTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX3BoeWNsa19mZ2Mod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBib29sIGNsayk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19tYWNwaHljbGtfc2V0KHdsY19od19pbmZvX3QgKndsY19odywgYm9vbCBjbGspOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfcGh5X3Jlc2V0KHdsY19od19pbmZvX3QgKndsY19odyk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19jb3JlcmVzZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1MzIgZmxhZ3MpOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfcmVzZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3KTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX2luaXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBjaGFuc3BlY190IGNoYW5zcGVjLAorZXh0ZXJuIHZvaWQgd2xjX2JtYWNfY29yZV9waHlfY2xrKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBib29sIGNsayk7CitleHRlcm4gdm9pZCB3bGNfYm1hY19jb3JlX3BoeXBsbF9yZXNldChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odyk7CitleHRlcm4gdm9pZCB3bGNfYm1hY19jb3JlX3BoeXBsbF9jdGwoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIGJvb2wgb24pOworZXh0ZXJuIHZvaWQgd2xjX2JtYWNfcGh5Y2xrX2ZnYyhzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgYm9vbCBjbGspOworZXh0ZXJuIHZvaWQgd2xjX2JtYWNfbWFjcGh5Y2xrX3NldChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgYm9vbCBjbGspOworZXh0ZXJuIHZvaWQgd2xjX2JtYWNfcGh5X3Jlc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KTsKK2V4dGVybiB2b2lkIHdsY19ibWFjX2NvcmVyZXNldChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdTMyIGZsYWdzKTsKK2V4dGVybiB2b2lkIHdsY19ibWFjX3Jlc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KTsKK2V4dGVybiB2b2lkIHdsY19ibWFjX2luaXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIGNoYW5zcGVjX3QgY2hhbnNwZWMsCiAJCQkgIGJvb2wgbXV0ZSk7Ci1leHRlcm4gaW50IHdsY19ibWFjX3VwX3ByZXAod2xjX2h3X2luZm9fdCAqd2xjX2h3KTsKLWV4dGVybiBpbnQgd2xjX2JtYWNfdXBfZmluaXNoKHdsY19od19pbmZvX3QgKndsY19odyk7Ci1leHRlcm4gaW50IHdsY19ibWFjX2Rvd25fcHJlcCh3bGNfaHdfaW5mb190ICp3bGNfaHcpOwotZXh0ZXJuIGludCB3bGNfYm1hY19kb3duX2ZpbmlzaCh3bGNfaHdfaW5mb190ICp3bGNfaHcpOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfY29yZXJlc2V0KHdsY19od19pbmZvX3QgKndsY19odywgdTMyIGZsYWdzKTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX3N3aXRjaF9tYWNmcmVxKHdsY19od19pbmZvX3QgKndsY19odywgdTggc3B1cm1vZGUpOworZXh0ZXJuIGludCB3bGNfYm1hY191cF9wcmVwKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KTsKK2V4dGVybiBpbnQgd2xjX2JtYWNfdXBfZmluaXNoKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KTsKK2V4dGVybiBpbnQgd2xjX2JtYWNfZG93bl9wcmVwKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KTsKK2V4dGVybiBpbnQgd2xjX2JtYWNfZG93bl9maW5pc2goc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpOworZXh0ZXJuIHZvaWQgd2xjX2JtYWNfY29yZXJlc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1MzIgZmxhZ3MpOworZXh0ZXJuIHZvaWQgd2xjX2JtYWNfc3dpdGNoX21hY2ZyZXEoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHU4IHNwdXJtb2RlKTsKIAogLyogY2hhbnNwZWMsIHVjb2RlIGludGVyZmFjZSAqLwotZXh0ZXJuIGludCB3bGNfYm1hY19iYW5kdHlwZSh3bGNfaHdfaW5mb190ICp3bGNfaHcpOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfc2V0X2NoYW5zcGVjKHdsY19od19pbmZvX3QgKndsY19odywgY2hhbnNwZWNfdCBjaGFuc3BlYywKK2V4dGVybiBpbnQgd2xjX2JtYWNfYmFuZHR5cGUoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpOworZXh0ZXJuIHZvaWQgd2xjX2JtYWNfc2V0X2NoYW5zcGVjKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LAorCQkJCSAgY2hhbnNwZWNfdCBjaGFuc3BlYywKIAkJCQkgIGJvb2wgbXV0ZSwgc3RydWN0IHR4cHdyX2xpbWl0cyAqdHhwd3IpOwogCi1leHRlcm4gdm9pZCB3bGNfYm1hY190eGZpZm8od2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1aW50IGZpZm8sIHZvaWQgKnAsCitleHRlcm4gdm9pZCB3bGNfYm1hY190eGZpZm8oc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHVpbnQgZmlmbywgdm9pZCAqcCwKIAkJCSAgICBib29sIGNvbW1pdCwgdTE2IGZyYW1laWQsIHU4IHR4cGt0cGVuZCk7Ci1leHRlcm4gaW50IHdsY19ibWFjX3htdGZpZm9fc3pfZ2V0KHdsY19od19pbmZvX3QgKndsY19odywgdWludCBmaWZvLAorZXh0ZXJuIGludCB3bGNfYm1hY194bXRmaWZvX3N6X2dldChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdWludCBmaWZvLAogCQkJCSAgIHVpbnQgKmJsb2Nrcyk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19taGYod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1OCBpZHgsIHUxNiBtYXNrLAorZXh0ZXJuIHZvaWQgd2xjX2JtYWNfbWhmKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1OCBpZHgsIHUxNiBtYXNrLAogCQkJIHUxNiB2YWwsIGludCBiYW5kcyk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19tY3RybCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHUzMiBtYXNrLCB1MzIgdmFsKTsKLWV4dGVybiB1MTYgd2xjX2JtYWNfbWhmX2dldCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHU4IGlkeCwgaW50IGJhbmRzKTsKLWV4dGVybiBpbnQgd2xjX2JtYWNfeG10Zmlmb19zel9zZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1aW50IGZpZm8sCitleHRlcm4gdm9pZCB3bGNfYm1hY19tY3RybChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdTMyIG1hc2ssIHUzMiB2YWwpOworZXh0ZXJuIHUxNiB3bGNfYm1hY19taGZfZ2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1OCBpZHgsIGludCBiYW5kcyk7CitleHRlcm4gaW50IHdsY19ibWFjX3htdGZpZm9fc3pfc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1aW50IGZpZm8sCiAJCQkJICAgdWludCBibG9ja3MpOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfdHhhbnRfc2V0KHdsY19od19pbmZvX3QgKndsY19odywgdTE2IHBoeXR4YW50KTsKLWV4dGVybiB1MTYgd2xjX2JtYWNfZ2V0X3R4YW50KHdsY19od19pbmZvX3QgKndsY19odyk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19hbnRzZWxfdHlwZV9zZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1OCBhbnRzZWxfdHlwZSk7Ci1leHRlcm4gaW50IHdsY19ibWFjX3JldmluZm9fZ2V0KHdsY19od19pbmZvX3QgKndsY19odywKK2V4dGVybiB2b2lkIHdsY19ibWFjX3R4YW50X3NldChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdTE2IHBoeXR4YW50KTsKK2V4dGVybiB1MTYgd2xjX2JtYWNfZ2V0X3R4YW50KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KTsKK2V4dGVybiB2b2lkIHdsY19ibWFjX2FudHNlbF90eXBlX3NldChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywKKwkJCQkgICAgIHU4IGFudHNlbF90eXBlKTsKK2V4dGVybiBpbnQgd2xjX2JtYWNfcmV2aW5mb19nZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsCiAJCQkJd2xjX2JtYWNfcmV2aW5mb190ICpyZXZpbmZvKTsKLWV4dGVybiBpbnQgd2xjX2JtYWNfc3RhdGVfZ2V0KHdsY19od19pbmZvX3QgKndsY19odywgd2xjX2JtYWNfc3RhdGVfdCAqc3RhdGUpOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfd3JpdGVfc2htKHdsY19od19pbmZvX3QgKndsY19odywgdWludCBvZmZzZXQsIHUxNiB2KTsKLWV4dGVybiB1MTYgd2xjX2JtYWNfcmVhZF9zaG0od2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1aW50IG9mZnNldCk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19zZXRfc2htKHdsY19od19pbmZvX3QgKndsY19odywgdWludCBvZmZzZXQsIHUxNiB2LAorZXh0ZXJuIGludCB3bGNfYm1hY19zdGF0ZV9nZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsCisJCQkgICAgICB3bGNfYm1hY19zdGF0ZV90ICpzdGF0ZSk7CitleHRlcm4gdm9pZCB3bGNfYm1hY193cml0ZV9zaG0oc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHVpbnQgb2Zmc2V0LCB1MTYgdik7CitleHRlcm4gdTE2IHdsY19ibWFjX3JlYWRfc2htKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1aW50IG9mZnNldCk7CitleHRlcm4gdm9pZCB3bGNfYm1hY19zZXRfc2htKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1aW50IG9mZnNldCwgdTE2IHYsCiAJCQkgICAgIGludCBsZW4pOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfd3JpdGVfdGVtcGxhdGVfcmFtKHdsY19od19pbmZvX3QgKndsY19odywgaW50IG9mZnNldCwKK2V4dGVybiB2b2lkIHdsY19ibWFjX3dyaXRlX3RlbXBsYXRlX3JhbShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgaW50IG9mZnNldCwKIAkJCQkJaW50IGxlbiwgdm9pZCAqYnVmKTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX2NvcHlmcm9tX3ZhcnMod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBjaGFyICoqYnVmLAorZXh0ZXJuIHZvaWQgd2xjX2JtYWNfY29weWZyb21fdmFycyhzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgY2hhciAqKmJ1ZiwKIAkJCQkgICB1aW50ICpsZW4pOwogCi1leHRlcm4gdm9pZCB3bGNfYm1hY19wcm9jZXNzX3BzX3N3aXRjaCh3bGNfaHdfaW5mb190ICp3bGMsCitleHRlcm4gdm9pZCB3bGNfYm1hY19wcm9jZXNzX3BzX3N3aXRjaChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsYywKIAkJCQkgICAgICAgc3RydWN0IGV0aGVyX2FkZHIgKmVhLCBzOCBwc19vbik7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19od19ldGhlcmFkZHIod2xjX2h3X2luZm9fdCAqd2xjX2h3LAorZXh0ZXJuIHZvaWQgd2xjX2JtYWNfaHdfZXRoZXJhZGRyKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LAogCQkJCSAgc3RydWN0IGV0aGVyX2FkZHIgKmVhKTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX3NldF9od19ldGhlcmFkZHIod2xjX2h3X2luZm9fdCAqd2xjX2h3LAorZXh0ZXJuIHZvaWQgd2xjX2JtYWNfc2V0X2h3X2V0aGVyYWRkcihzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywKIAkJCQkgICAgICBzdHJ1Y3QgZXRoZXJfYWRkciAqZWEpOwotZXh0ZXJuIGJvb2wgd2xjX2JtYWNfdmFsaWRhdGVfY2hpcF9hY2Nlc3Mod2xjX2h3X2luZm9fdCAqd2xjX2h3KTsKK2V4dGVybiBib29sIHdsY19ibWFjX3ZhbGlkYXRlX2NoaXBfYWNjZXNzKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KTsKIAotZXh0ZXJuIGJvb2wgd2xjX2JtYWNfcmFkaW9fcmVhZF9od2Rpc2FibGVkKHdsY19od19pbmZvX3QgKndsY19odyk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19zZXRfc2hvcnRzbG90KHdsY19od19pbmZvX3QgKndsY19odywgYm9vbCBzaG9ydHNsb3QpOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfbXV0ZSh3bGNfaHdfaW5mb190ICp3bGNfaHcsIGJvb2wgd2FudCwgbWJvb2wgZmxhZ3MpOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfc2V0X2RlYWYod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBib29sIHVzZXJfZmxhZyk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19iYW5kX3N0Zl9zc19zZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1OCBzdGZfbW9kZSk7CitleHRlcm4gYm9vbCB3bGNfYm1hY19yYWRpb19yZWFkX2h3ZGlzYWJsZWQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpOworZXh0ZXJuIHZvaWQgd2xjX2JtYWNfc2V0X3Nob3J0c2xvdChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgYm9vbCBzaG9ydHNsb3QpOworZXh0ZXJuIHZvaWQgd2xjX2JtYWNfbXV0ZShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgYm9vbCB3YW50LCBtYm9vbCBmbGFncyk7CitleHRlcm4gdm9pZCB3bGNfYm1hY19zZXRfZGVhZihzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgYm9vbCB1c2VyX2ZsYWcpOworZXh0ZXJuIHZvaWQgd2xjX2JtYWNfYmFuZF9zdGZfc3Nfc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1OCBzdGZfbW9kZSk7CiAKLWV4dGVybiB2b2lkIHdsY19ibWFjX3dhaXRfZm9yX3dha2Uod2xjX2h3X2luZm9fdCAqd2xjX2h3KTsKLWV4dGVybiBib29sIHdsY19ibWFjX3R4X2ZpZm9fc3VzcGVuZGVkKHdsY19od19pbmZvX3QgKndsY19odywgdWludCB0eF9maWZvKTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX3R4X2ZpZm9fc3VzcGVuZCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHVpbnQgdHhfZmlmbyk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY190eF9maWZvX3Jlc3VtZSh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHVpbnQgdHhfZmlmbyk7CitleHRlcm4gdm9pZCB3bGNfYm1hY193YWl0X2Zvcl93YWtlKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KTsKK2V4dGVybiBib29sIHdsY19ibWFjX3R4X2ZpZm9fc3VzcGVuZGVkKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LAorCQkJCSAgICAgICB1aW50IHR4X2ZpZm8pOworZXh0ZXJuIHZvaWQgd2xjX2JtYWNfdHhfZmlmb19zdXNwZW5kKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1aW50IHR4X2ZpZm8pOworZXh0ZXJuIHZvaWQgd2xjX2JtYWNfdHhfZmlmb19yZXN1bWUoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHVpbnQgdHhfZmlmbyk7CiAKLWV4dGVybiB2b2lkIHdsY191Y29kZV93YWtlX292ZXJyaWRlX3NldCh3bGNfaHdfaW5mb190ICp3bGNfaHcsCitleHRlcm4gdm9pZCB3bGNfdWNvZGVfd2FrZV9vdmVycmlkZV9zZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsCiAJCQkJCXUzMiBvdmVycmlkZV9iaXQpOwotZXh0ZXJuIHZvaWQgd2xjX3Vjb2RlX3dha2Vfb3ZlcnJpZGVfY2xlYXIod2xjX2h3X2luZm9fdCAqd2xjX2h3LAorZXh0ZXJuIHZvaWQgd2xjX3Vjb2RlX3dha2Vfb3ZlcnJpZGVfY2xlYXIoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsCiAJCQkJCSAgdTMyIG92ZXJyaWRlX2JpdCk7CiAKLWV4dGVybiB2b2lkIHdsY19ibWFjX3NldF9yY210YSh3bGNfaHdfaW5mb190ICp3bGNfaHcsIGludCBpZHgsCitleHRlcm4gdm9pZCB3bGNfYm1hY19zZXRfcmNtdGEoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIGludCBpZHgsCiAJCQkgICAgICAgY29uc3Qgc3RydWN0IGV0aGVyX2FkZHIgKmFkZHIpOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfc2V0X2FkZHJtYXRjaCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIGludCBtYXRjaF9yZWdfb2Zmc2V0LAorZXh0ZXJuIHZvaWQgd2xjX2JtYWNfc2V0X2FkZHJtYXRjaChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywKKwkJCQkgICBpbnQgbWF0Y2hfcmVnX29mZnNldCwKIAkJCQkgICBjb25zdCBzdHJ1Y3QgZXRoZXJfYWRkciAqYWRkcik7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY193cml0ZV9od19iY250ZW1wbGF0ZXMod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB2b2lkICpiY24sCi0JCQkJCSAgIGludCBsZW4sIGJvb2wgYm90aCk7CitleHRlcm4gdm9pZCB3bGNfYm1hY193cml0ZV9od19iY250ZW1wbGF0ZXMoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsCisJCQkJCSAgIHZvaWQgKmJjbiwgaW50IGxlbiwgYm9vbCBib3RoKTsKIAotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfcmVhZF90c2Yod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1MzIgKnRzZl9sX3B0ciwKK2V4dGVybiB2b2lkIHdsY19ibWFjX3JlYWRfdHNmKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1MzIgKnRzZl9sX3B0ciwKIAkJCSAgICAgIHUzMiAqdHNmX2hfcHRyKTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX3NldF9jd21pbih3bGNfaHdfaW5mb190ICp3bGNfaHcsIHUxNiBuZXdtaW4pOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfc2V0X2N3bWF4KHdsY19od19pbmZvX3QgKndsY19odywgdTE2IG5ld21heCk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19zZXRfbm9yZXNldCh3bGNfaHdfaW5mb190ICp3bGMsIGJvb2wgbm9yZXNldF9mbGFnKTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX3NldF91Y29kZV9sb2FkZWQod2xjX2h3X2luZm9fdCAqd2xjLCBib29sIHVjb2RlX2xvYWRlZCk7CitleHRlcm4gdm9pZCB3bGNfYm1hY19zZXRfY3dtaW4oc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHUxNiBuZXdtaW4pOworZXh0ZXJuIHZvaWQgd2xjX2JtYWNfc2V0X2N3bWF4KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1MTYgbmV3bWF4KTsKK2V4dGVybiB2b2lkIHdsY19ibWFjX3NldF9ub3Jlc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjLCBib29sIG5vcmVzZXRfZmxhZyk7CitleHRlcm4gdm9pZCB3bGNfYm1hY19zZXRfdWNvZGVfbG9hZGVkKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjLAorCQkJCSAgICAgIGJvb2wgdWNvZGVfbG9hZGVkKTsKIAotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfcmV0cnlsaW1pdF91cGQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1MTYgU1JMLAorZXh0ZXJuIHZvaWQgd2xjX2JtYWNfcmV0cnlsaW1pdF91cGQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHUxNiBTUkwsCiAJCQkJICAgIHUxNiBMUkwpOwogCi1leHRlcm4gdm9pZCB3bGNfYm1hY19maWZvZXJyb3JzKHdsY19od19pbmZvX3QgKndsY19odyk7CitleHRlcm4gdm9pZCB3bGNfYm1hY19maWZvZXJyb3JzKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KTsKIAotI2lmZGVmIFdMQ19ISUdIX09OTFkKLWV4dGVybiB2b2lkIHdsY19ibWFjX2RuZ2xfcmVib290KHJwY19pbmZvX3QgKik7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19kbmdsX3JwY19hZ2cocnBjX2luZm9fdCAqLCB1MTYgYWdnKTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX2RuZ2xfcnBjX21zZ2xldmVsKHJwY19pbmZvX3QgKiwgdTE2IGxldmVsKTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX2RuZ2xfcnBjX3R4cV93bV9zZXQocnBjX2luZm9fdCAqcnBjLCB1MzIgd20pOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfZG5nbF9ycGNfdHhxX3dtX2dldChycGNfaW5mb190ICpycGMsIHUzMiAqd20pOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfZG5nbF9ycGNfYWdnX2xpbWl0X3NldChycGNfaW5mb190ICpycGMsIHUzMiB2YWwpOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfZG5nbF9ycGNfYWdnX2xpbWl0X2dldChycGNfaW5mb190ICpycGMsIHUzMiAqcHZhbCk7Ci1leHRlcm4gaW50IHdsY19ibWFjX2RlYnVnX3RlbXBsYXRlKHdsY19od19pbmZvX3QgKndsY19odyk7Ci0jZW5kaWYKIAogLyogQVBJIGZvciBCTUFDIGRyaXZlciAoZS5nLiB3bGNfcGh5LmMgZXRjKSAqLwogCi1leHRlcm4gdm9pZCB3bGNfYm1hY19id19zZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1MTYgYncpOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfcGxscmVxKHdsY19od19pbmZvX3QgKndsY19odywgYm9vbCBzZXQsIG1ib29sIHJlcV9iaXQpOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfc2V0X2Nsayh3bGNfaHdfaW5mb190ICp3bGNfaHcsIGJvb2wgb24pOwotZXh0ZXJuIGJvb2wgd2xjX2JtYWNfdGFjbGVhcih3bGNfaHdfaW5mb190ICp3bGNfaHcsIGJvb2wgdGFfb2spOworZXh0ZXJuIHZvaWQgd2xjX2JtYWNfYndfc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1MTYgYncpOworZXh0ZXJuIHZvaWQgd2xjX2JtYWNfcGxscmVxKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBib29sIHNldCwKKwkJCSAgICBtYm9vbCByZXFfYml0KTsKK2V4dGVybiB2b2lkIHdsY19ibWFjX3NldF9jbGsoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIGJvb2wgb24pOworZXh0ZXJuIGJvb2wgd2xjX2JtYWNfdGFjbGVhcihzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgYm9vbCB0YV9vayk7CiBleHRlcm4gdm9pZCB3bGNfYm1hY19od191cChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odyk7CiAKLWV4dGVybiB2b2lkIHdsY19ibWFjX2R1bXAod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBzdHJ1Y3QgYmNtc3RyYnVmICpiLAorZXh0ZXJuIHZvaWQgd2xjX2JtYWNfZHVtcChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgc3RydWN0IGJjbXN0cmJ1ZiAqYiwKIAkJCSAgd2xjX2JtYWNfZHVtcF9pZF90IGR1bXBfaWQpOwotZXh0ZXJuIHZvaWQgd2xjX2dwaW9fZmFzdF9kZWluaXQod2xjX2h3X2luZm9fdCAqd2xjX2h3KTsKK2V4dGVybiB2b2lkIHdsY19ncGlvX2Zhc3RfZGVpbml0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KTsKIAotZXh0ZXJuIGJvb2wgd2xjX2JtYWNfcmFkaW9faHcod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBib29sIGVuYWJsZSk7Ci1leHRlcm4gdTE2IHdsY19ibWFjX3JhdGVfc2htX29mZnNldCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHU4IHJhdGUpOworZXh0ZXJuIGJvb2wgd2xjX2JtYWNfcmFkaW9faHcoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIGJvb2wgZW5hYmxlKTsKK2V4dGVybiB1MTYgd2xjX2JtYWNfcmF0ZV9zaG1fb2Zmc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1OCByYXRlKTsKIAotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfYXNzZXJ0X3R5cGVfc2V0KHdsY19od19pbmZvX3QgKndsY19odywgdTMyIHR5cGUpOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfc2V0X3R4cHdyX3BlcmNlbnQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1OCB2YWwpOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfYmxpbmtfc3luYyh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHUzMiBsZWRfcGlucyk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19pZnNjdGxfZWRjcnNfc2V0KHdsY19od19pbmZvX3QgKndsY19odywgYm9vbCBhYmllLAorZXh0ZXJuIHZvaWQgd2xjX2JtYWNfYXNzZXJ0X3R5cGVfc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1MzIgdHlwZSk7CitleHRlcm4gdm9pZCB3bGNfYm1hY19zZXRfdHhwd3JfcGVyY2VudChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdTggdmFsKTsKK2V4dGVybiB2b2lkIHdsY19ibWFjX2JsaW5rX3N5bmMoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHUzMiBsZWRfcGlucyk7CitleHRlcm4gdm9pZCB3bGNfYm1hY19pZnNjdGxfZWRjcnNfc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBib29sIGFiaWUsCiAJCQkJICAgICAgYm9vbCBpc2h0KTsKIAotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfYW50c2VsX3NldCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHUzMiBhbnRzZWxfYXZhaWwpOworZXh0ZXJuIHZvaWQgd2xjX2JtYWNfYW50c2VsX3NldChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdTMyIGFudHNlbF9hdmFpbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfYnNzY2ZnLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfYnNzY2ZnLmgKaW5kZXggYWU1NTQyYWIwLi5kNmExOTcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfYnNzY2ZnLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2Jzc2NmZy5oCkBAIC0zNCw3ICszNCw4IEBACiAjZGVmaW5lIE1BWE1BQ0xJU1QJCTY0CS8qIG1heCAjIHNvdXJjZSBNQUMgbWF0Y2hlcyAqLwogI2RlZmluZSBCQ05fVEVNUExBVEVfQ09VTlQgCTIKIAotLyogSXRlcmF0b3IgZm9yICJhc3NvY2lhdGVkIiBTVEEgYnNzIGNvbmZpZ3M6ICAod2xjX2luZm9fdCAqd2xjLCBpbnQgaWR4LCB3bGNfYnNzY2ZnX3QgKmNmZykgKi8KKy8qIEl0ZXJhdG9yIGZvciAiYXNzb2NpYXRlZCIgU1RBIGJzcyBjb25maWdzOgorICAgKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBpbnQgaWR4LCB3bGNfYnNzY2ZnX3QgKmNmZykgKi8KICNkZWZpbmUgRk9SRUFDSF9BU19TVEEod2xjLCBpZHgsIGNmZykgXAogCWZvciAoaWR4ID0gMDsgKGludCkgaWR4IDwgV0xDX01BWEJTU0NGRzsgaWR4KyspIFwKIAkJaWYgKChjZmcgPSAod2xjKS0+YnNzY2ZnW2lkeF0pICYmIEJTU0NGR19TVEEoY2ZnKSAmJiBjZmctPmFzc29jaWF0ZWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfY2ZnLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfY2ZnLmgKaW5kZXggYTQxNWUxZi4uM2RlY2I3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2NmZy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19jZmcuaApAQCAtMjMsMTQgKzIzLDYgQEAKIAogI2RlZmluZSBJU19TSU5HTEVCQU5EXzVHKGRldmljZSkJMAogCi0vKiBLZWVwIFdMQ19ISUdIX09OTFksIFdMQ19TUExJVCBmb3IgVVNCIGV4dGVuc2lvbiBsYXRlciBvbiAqLwotI2lmICFkZWZpbmVkKFdMQ19MT1cpCi0jZGVmaW5lIFdMQ19ISUdIX09OTFkKLSNlbmRpZgotI2lmICFkZWZpbmVkKFdMQ19MT1cpCi0jZGVmaW5lIFdMQ19TUExJVAotI2VuZGlmCi0KIC8qICoqKiogQ29yZSB0eXBlL3JldiBkZWZhdWx0cyAqKioqICovCiAjZGVmaW5lIEQxMV9ERUZBVUxUCTB4MGZmZmZmYjAJLyogU3VwcG9ydGVkICBEMTEgcmV2czogNCwgNSwgNy0yNwogCQkJCQkgKiBhbHNvIG5lZWQgdG8gdXBkYXRlIHdsYy5oIE1BWENPUkVSRVYKQEAgLTYxLDIyICs1Myw2IEBACiAJCQkJCSAqICAgICAgMyAgICAgICA1MzU2YTAKIAkJCQkJICovCiAKLSNpZmRlZiBCQ01TRElPCi0jZGVmaW5lIEQxMUNPTkYgMHgxMDAwMDAKLSNkZWZpbmUgU1NMUE5DT05GIDIKLSNkZWZpbmUgR0NDT05GCTAKLSNkZWZpbmUgQUNDT05GCTAKLSNkZWZpbmUgTkNPTkYJMAotI2RlZmluZSBMUENPTkYJMAotI2RlZmluZSBMQ05DT05GCTAKLSNkZWZpbmUgTlRYRCAzMgotI2RlZmluZSBOUlhEIDE2Ci0jZGVmaW5lIE5SWEJVRlBPU1QgOAotI2RlZmluZSBXTENfREFUQUhJV0FUIDMyCi0jZGVmaW5lIFJYQk5EIDgKLSNkZWZpbmUgTUFYUEtUQ0IgNjQKLSNkZWZpbmUgQU1QRFVfTlVNX01QRFUgOAotI2VuZGlmCiAKIC8qIEZvciB1bmRlZmluZWQgdmFsdWVzLCB1c2UgZGVmYXVsdHMgKi8KICNpZm5kZWYgRDExQ09ORgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2NoYW5uZWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19jaGFubmVsLmMKaW5kZXggNTA5MjgwMy4uYTM1YzE1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2NoYW5uZWwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfY2hhbm5lbC5jCkBAIC0xOSwxNiArMTksMjEgQEAKICNpbmNsdWRlIDxiY21kZWZzLmg+CiAjaW5jbHVkZSA8d2xjX2NmZy5oPgogI2luY2x1ZGUgPG9zbC5oPgotI2luY2x1ZGUgPGxpbnV4dmVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8YmNtdXRpbHMuaD4KICNpbmNsdWRlIDxzaXV0aWxzLmg+CisjaW5jbHVkZSA8c2JobmRwaW8uaD4KKyNpbmNsdWRlIDxzYmhuZGRtYS5oPgogI2luY2x1ZGUgPHdsaW9jdGwuaD4KICNpbmNsdWRlIDx3bGNfcHViLmg+CiAjaW5jbHVkZSA8d2xjX2tleS5oPgorI2luY2x1ZGUgPHdsY19ldmVudC5oPgogI2luY2x1ZGUgPHdsY19tYWM4MDIxMS5oPgogI2luY2x1ZGUgPHdsY19ibWFjLmg+CiAjaW5jbHVkZSA8d2xjX3N0Zi5oPgogI2luY2x1ZGUgPHdsY19jaGFubmVsLmg+CisjaW5jbHVkZSA8d2xfZGJnLmg+CiAKIHR5cGVkZWYgc3RydWN0IHdsY19jbV9iYW5kIHsKIAl1OCBsb2NhbGVfZmxhZ3M7CS8qIGxvY2FsZV9pbmZvX3QgZmxhZ3MgKi8KQEAgLTM5LDggKzQ0LDggQEAKIH0gd2xjX2NtX2JhbmRfdDsKIAogc3RydWN0IHdsY19jbV9pbmZvIHsKLQl3bGNfcHViX3QgKnB1YjsKLQl3bGNfaW5mb190ICp3bGM7CisJc3RydWN0IHdsY19wdWIgKnB1YjsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYzsKIAljaGFyIHNyb21fY2NvZGVbV0xDX0NOVFJZX0JVRl9TWl07CS8qIENvdW50cnkgQ29kZSBpbiBTUk9NICovCiAJdWludCBzcm9tX3JlZ3JldjsJLyogUmVndWxhdG9yeSBSZXYgZm9yIHRoZSBTUk9NIGNjb2RlICovCiAJY29uc3QgY291bnRyeV9pbmZvX3QgKmNvdW50cnk7CS8qIGN1cnJlbnQgY291bnRyeSBkZWYgKi8KQEAgLTM3Nyw3ICszODIsNyBAQAogewogCXU4IGk7CiAKLQliemVybyhjaGFubmVscywgc2l6ZW9mKGNoYW52ZWNfdCkpOworCW1lbXNldChjaGFubmVscywgMCwgc2l6ZW9mKGNoYW52ZWNfdCkpOwogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZ190YWJsZV9sb2NhbGVfYmFzZSk7IGkrKykgewogCQlpZiAobG9jYWxlLT52YWxpZF9jaGFubmVscyAmICgxIDw8IGkpKSB7CkBAIC01NjIsOCArNTY3LDggQEAKIGNvbnN0IGxvY2FsZV9pbmZvX3QgKndsY19nZXRfbG9jYWxlXzJnKHU4IGxvY2FsZV9pZHgpCiB7CiAJaWYgKGxvY2FsZV9pZHggPj0gQVJSQVlfU0laRShnX2xvY2FsZV8yZ190YWJsZSkpIHsKLQkJV0xfRVJST1IoKCIlczogbG9jYWxlIDJnIGluZGV4IHNpemUgb3V0IG9mIHJhbmdlICVkXG4iLAotCQkJICBfX2Z1bmNfXywgbG9jYWxlX2lkeCkpOworCQlXTF9FUlJPUigiJXM6IGxvY2FsZSAyZyBpbmRleCBzaXplIG91dCBvZiByYW5nZSAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgbG9jYWxlX2lkeCk7CiAJCUFTU0VSVChsb2NhbGVfaWR4IDwgQVJSQVlfU0laRShnX2xvY2FsZV8yZ190YWJsZSkpOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC01NzMsOCArNTc4LDggQEAKIGNvbnN0IGxvY2FsZV9pbmZvX3QgKndsY19nZXRfbG9jYWxlXzVnKHU4IGxvY2FsZV9pZHgpCiB7CiAJaWYgKGxvY2FsZV9pZHggPj0gQVJSQVlfU0laRShnX2xvY2FsZV81Z190YWJsZSkpIHsKLQkJV0xfRVJST1IoKCIlczogbG9jYWxlIDVnIGluZGV4IHNpemUgb3V0IG9mIHJhbmdlICVkXG4iLAotCQkJICBfX2Z1bmNfXywgbG9jYWxlX2lkeCkpOworCQlXTF9FUlJPUigiJXM6IGxvY2FsZSA1ZyBpbmRleCBzaXplIG91dCBvZiByYW5nZSAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgbG9jYWxlX2lkeCk7CiAJCUFTU0VSVChsb2NhbGVfaWR4IDwgQVJSQVlfU0laRShnX2xvY2FsZV81Z190YWJsZSkpOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC01ODQsOCArNTg5LDggQEAKIGNvbnN0IGxvY2FsZV9taW1vX2luZm9fdCAqd2xjX2dldF9taW1vXzJnKHU4IGxvY2FsZV9pZHgpCiB7CiAJaWYgKGxvY2FsZV9pZHggPj0gQVJSQVlfU0laRShnX21pbW9fMmdfdGFibGUpKSB7Ci0JCVdMX0VSUk9SKCgiJXM6IG1pbW8gMmcgaW5kZXggc2l6ZSBvdXQgb2YgcmFuZ2UgJWRcbiIsIF9fZnVuY19fLAotCQkJICBsb2NhbGVfaWR4KSk7CisJCVdMX0VSUk9SKCIlczogbWltbyAyZyBpbmRleCBzaXplIG91dCBvZiByYW5nZSAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgbG9jYWxlX2lkeCk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlyZXR1cm4gZ19taW1vXzJnX3RhYmxlW2xvY2FsZV9pZHhdOwpAQCAtNTk0LDI2ICs1OTksMjYgQEAKIGNvbnN0IGxvY2FsZV9taW1vX2luZm9fdCAqd2xjX2dldF9taW1vXzVnKHU4IGxvY2FsZV9pZHgpCiB7CiAJaWYgKGxvY2FsZV9pZHggPj0gQVJSQVlfU0laRShnX21pbW9fNWdfdGFibGUpKSB7Ci0JCVdMX0VSUk9SKCgiJXM6IG1pbW8gNWcgaW5kZXggc2l6ZSBvdXQgb2YgcmFuZ2UgJWRcbiIsIF9fZnVuY19fLAotCQkJICBsb2NhbGVfaWR4KSk7CisJCVdMX0VSUk9SKCIlczogbWltbyA1ZyBpbmRleCBzaXplIG91dCBvZiByYW5nZSAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgbG9jYWxlX2lkeCk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlyZXR1cm4gZ19taW1vXzVnX3RhYmxlW2xvY2FsZV9pZHhdOwogfQogCi13bGNfY21faW5mb190ICp3bGNfY2hhbm5lbF9tZ3JfYXR0YWNoKHdsY19pbmZvX3QgKndsYykKK3dsY19jbV9pbmZvX3QgKndsY19jaGFubmVsX21ncl9hdHRhY2goc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJd2xjX2NtX2luZm9fdCAqd2xjX2NtOwogCWNoYXIgY291bnRyeV9hYmJyZXZbV0xDX0NOVFJZX0JVRl9TWl07CiAJY29uc3QgY291bnRyeV9pbmZvX3QgKmNvdW50cnk7Ci0Jd2xjX3B1Yl90ICpwdWIgPSB3bGMtPnB1YjsKKwlzdHJ1Y3Qgd2xjX3B1YiAqcHViID0gd2xjLT5wdWI7CiAJY2hhciAqY2NvZGU7CiAKLQlXTF9UUkFDRSgoIndsJWQ6IHdsY19jaGFubmVsX21ncl9hdHRhY2hcbiIsIHdsYy0+cHViLT51bml0KSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY19jaGFubmVsX21ncl9hdHRhY2hcbiIsIHdsYy0+cHViLT51bml0KTsKIAogCXdsY19jbSA9IGt6YWxsb2Moc2l6ZW9mKHdsY19jbV9pbmZvX3QpLCBHRlBfQVRPTUlDKTsKIAlpZiAod2xjX2NtID09IE5VTEwpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiAlczogb3V0IG9mIG1lbW9yeSIsIHB1Yi0+dW5pdCwgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIndsJWQ6ICVzOiBvdXQgb2YgbWVtb3J5IiwgcHViLT51bml0LCBfX2Z1bmNfXyk7CiAJCXJldHVybiBOVUxMOwogCX0KIAl3bGNfY20tPnB1YiA9IHB1YjsKQEAgLTYyNCwxMiArNjI5LDEzIEBACiAJY2NvZGUgPSBnZXR2YXIod2xjLT5wdWItPnZhcnMsICJjY29kZSIpOwogCWlmIChjY29kZSkgewogCQlzdHJuY3B5KHdsYy0+cHViLT5zcm9tX2Njb2RlLCBjY29kZSwgV0xDX0NOVFJZX0JVRl9TWiAtIDEpOwotCQlXTF9OT05FKCgiJXM6IFNST00gY291bnRyeSBjb2RlIGlzICVjJWNcbiIsIF9fZnVuY19fLAotCQkJIHdsYy0+cHViLT5zcm9tX2Njb2RlWzBdLCB3bGMtPnB1Yi0+c3JvbV9jY29kZVsxXSkpOworCQlXTF9OT05FKCIlczogU1JPTSBjb3VudHJ5IGNvZGUgaXMgJWMlY1xuIiwKKwkJCV9fZnVuY19fLAorCQkJd2xjLT5wdWItPnNyb21fY2NvZGVbMF0sIHdsYy0+cHViLT5zcm9tX2Njb2RlWzFdKTsKIAl9CiAKIAkvKiBpbnRlcm5hbCBjb3VudHJ5IGluZm9ybWF0aW9uIHdoaWNoIG11c3QgbWF0Y2ggcmVndWxhdG9yeSBjb25zdHJhaW50cyBpbiBmaXJtd2FyZSAqLwotCWJ6ZXJvKGNvdW50cnlfYWJicmV2LCBXTENfQ05UUllfQlVGX1NaKTsKKwltZW1zZXQoY291bnRyeV9hYmJyZXYsIDAsIFdMQ19DTlRSWV9CVUZfU1opOwogCXN0cm5jcHkoY291bnRyeV9hYmJyZXYsICJYMiIsIHNpemVvZihjb3VudHJ5X2FiYnJldikgLSAxKTsKIAljb3VudHJ5ID0gd2xjX2NvdW50cnlfbG9va3VwKHdsYywgY291bnRyeV9hYmJyZXYpOwogCkBAIC02NTksNyArNjY1LDcgQEAKIAogdTggd2xjX2NoYW5uZWxfbG9jYWxlX2ZsYWdzKHdsY19jbV9pbmZvX3QgKndsY19jbSkKIHsKLQl3bGNfaW5mb190ICp3bGMgPSB3bGNfY20tPndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IHdsY19jbS0+d2xjOwogCiAJcmV0dXJuIHdsY19jbS0+YmFuZHN0YXRlW3dsYy0+YmFuZC0+YmFuZHVuaXRdLmxvY2FsZV9mbGFnczsKIH0KQEAgLTcxMSw3ICs3MTcsOSBAQAogCWNoYXIgbWFwcGVkX2Njb2RlW1dMQ19DTlRSWV9CVUZfU1pdOwogCXVpbnQgbWFwcGVkX3JlZ3JldjsKIAotCVdMX05PTkUoKCIlczogKGNvdW50cnlfYWJicmV2IFwiJXNcIiwgY2NvZGUgXCIlc1wiLCByZWdyZXYgJWQpIFNQUk9NIFwiJXNcIi8ldVxuIiwgX19mdW5jX18sIGNvdW50cnlfYWJicmV2LCBjY29kZSwgcmVncmV2LCB3bGNfY20tPnNyb21fY2NvZGUsIHdsY19jbS0+c3JvbV9yZWdyZXYpKTsKKwlXTF9OT05FKCIlczogKGNvdW50cnlfYWJicmV2IFwiJXNcIiwgY2NvZGUgXCIlc1wiLCByZWdyZXYgJWQpIFNQUk9NIFwiJXNcIi8ldVxuIiwKKwkJX19mdW5jX18sIGNvdW50cnlfYWJicmV2LCBjY29kZSwgcmVncmV2LAorCQl3bGNfY20tPnNyb21fY2NvZGUsIHdsY19jbS0+c3JvbV9yZWdyZXYpOwogCiAJLyogaWYgcmVncmV2IGlzIC0xLCBsb29rdXAgdGhlIG1hcHBlZCBjb3VudHJ5IGNvZGUsCiAJICogb3RoZXJ3aXNlIHVzZSB0aGUgY2NvZGUgYW5kIHJlZ3JldiBkaXJlY3RseQpAQCAtNzUwLDcgKzc1OCw3IEBACiB7CiAJY29uc3QgbG9jYWxlX21pbW9faW5mb190ICpsaV9taW1vOwogCWNvbnN0IGxvY2FsZV9pbmZvX3QgKmxvY2FsZTsKLQl3bGNfaW5mb190ICp3bGMgPSB3bGNfY20tPndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IHdsY19jbS0+d2xjOwogCWNoYXIgcHJldl9jb3VudHJ5X2FiYnJldltXTENfQ05UUllfQlVGX1NaXTsKIAogCUFTU0VSVChjb3VudHJ5ICE9IE5VTEwpOwpAQCAtNzU4LDcgKzc2Niw3IEBACiAJLyogc2F2ZSBjdXJyZW50IGNvdW50cnkgc3RhdGUgKi8KIAl3bGNfY20tPmNvdW50cnkgPSBjb3VudHJ5OwogCi0JYnplcm8oJnByZXZfY291bnRyeV9hYmJyZXYsIFdMQ19DTlRSWV9CVUZfU1opOworCW1lbXNldCgmcHJldl9jb3VudHJ5X2FiYnJldiwgMCwgV0xDX0NOVFJZX0JVRl9TWik7CiAJc3RybmNweShwcmV2X2NvdW50cnlfYWJicmV2LCB3bGNfY20tPmNvdW50cnlfYWJicmV2LAogCQlXTENfQ05UUllfQlVGX1NaIC0gMSk7CiAKQEAgLTgxNCw3ICs4MjIsNyBAQAogCQkJCQkJIGNoYXIgKm1hcHBlZF9jY29kZSwKIAkJCQkJCSB1aW50ICptYXBwZWRfcmVncmV2KQogewotCXdsY19pbmZvX3QgKndsYyA9IHdsY19jbS0+d2xjOworCXN0cnVjdCB3bGNfaW5mbyAqd2xjID0gd2xjX2NtLT53bGM7CiAJY29uc3QgY291bnRyeV9pbmZvX3QgKmNvdW50cnk7CiAJdWludCBzcm9tX3JlZ3JldiA9IHdsY19jbS0+c3JvbV9yZWdyZXY7CiAJY29uc3QgY2hhciAqc3JvbV9jY29kZSA9IHdsY19jbS0+c3JvbV9jY29kZTsKQEAgLTgyMiw4ICs4MzAsOCBAQAogCiAJLyogY2hlY2sgZm9yIGN1cnJlbnRseSBzdXBwb3J0ZWQgY2NvZGUgc2l6ZSAqLwogCWlmIChzdHJsZW4oY2NvZGUpID4gKFdMQ19DTlRSWV9CVUZfU1ogLSAxKSkgewotCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBjY29kZSBcIiVzXCIgdG9vIGxvbmcgZm9yIG1hdGNoXG4iLAotCQkJICB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18sIGNjb2RlKSk7CisJCVdMX0VSUk9SKCJ3bCVkOiAlczogY2NvZGUgXCIlc1wiIHRvbyBsb25nIGZvciBtYXRjaFxuIiwKKwkJCSB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18sIGNjb2RlKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC04MzgsNyArODQ2LDcgQEAKIAlpZiAoIXN0cmNtcChzcm9tX2Njb2RlLCBjY29kZSkpIHsKIAkJKm1hcHBlZF9yZWdyZXYgPSBzcm9tX3JlZ3JldjsKIAkJbWFwcGVkID0gMDsKLQkJV0xfRVJST1IoKCJzcm9tX2NvZGUgPT0gY2NvZGUgJXNcbiIsIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCJzcm9tX2NvZGUgPT0gY2NvZGUgJXNcbiIsIF9fZnVuY19fKTsKIAkJQVNTRVJUKDApOwogCX0gZWxzZSB7CiAJCW1hcHBlZCA9CkBAIC04OTAsNyArODk4LDcgQEAKIAkJfQogCX0KIAotCVdMX0VSUk9SKCgiJXM6IFJldHVybmluZyBOVUxMXG4iLCBfX2Z1bmNfXykpOworCVdMX0VSUk9SKCIlczogUmV0dXJuaW5nIE5VTExcbiIsIF9fZnVuY19fKTsKIAlBU1NFUlQoMCk7CiAJcmV0dXJuIE5VTEw7CiB9CkBAIC04OTgsOSArOTA2LDkgQEAKIHN0YXRpYyBpbnQKIHdsY19jaGFubmVsc19pbml0KHdsY19jbV9pbmZvX3QgKndsY19jbSwgY29uc3QgY291bnRyeV9pbmZvX3QgKmNvdW50cnkpCiB7Ci0Jd2xjX2luZm9fdCAqd2xjID0gd2xjX2NtLT53bGM7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSB3bGNfY20tPndsYzsKIAl1aW50IGksIGo7Ci0Jd2xjYmFuZF90ICpiYW5kOworCXN0cnVjdCB3bGNiYW5kICpiYW5kOwogCWNvbnN0IGxvY2FsZV9pbmZvX3QgKmxpOwogCWNoYW52ZWNfdCBzdXBfY2hhbjsKIAljb25zdCBsb2NhbGVfbWltb19pbmZvX3QgKmxpX21pbW87CkBAIC05NTIsNyArOTYwLDcgQEAKICAqLwogc3RhdGljIHZvaWQgd2xjX2NoYW5uZWxzX2NvbW1pdCh3bGNfY21faW5mb190ICp3bGNfY20pCiB7Ci0Jd2xjX2luZm9fdCAqd2xjID0gd2xjX2NtLT53bGM7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSB3bGNfY20tPndsYzsKIAl1aW50IGNoYW47CiAJc3RydWN0IHR4cHdyX2xpbWl0cyB0eHB3cjsKIApAQCAtOTY5LDcgKzk3Nyw5IEBACiAJaWYgKGNoYW4gPT0gSU5WQ0hBTk5FTCkgewogCQkvKiBjb3VudHJ5L2xvY2FsZSB3aXRoIG5vIHZhbGlkIGNoYW5uZWxzLCBzZXQgdGhlIHJhZGlvIGRpc2FibGUgYml0ICovCiAJCW1ib29sc2V0KHdsYy0+cHViLT5yYWRpb19kaXNhYmxlZCwgV0xfUkFESU9fQ09VTlRSWV9ESVNBQkxFKTsKLQkJV0xfRVJST1IoKCJ3bCVkOiAlczogbm8gdmFsaWQgY2hhbm5lbCBmb3IgXCIlc1wiIG5iYW5kcyAlZCBiYW5kbG9ja2VkICVkXG4iLCB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18sIHdsY19jbS0+Y291bnRyeV9hYmJyZXYsIE5CQU5EUyh3bGMpLCB3bGMtPmJhbmRsb2NrZWQpKTsKKwkJV0xfRVJST1IoIndsJWQ6ICVzOiBubyB2YWxpZCBjaGFubmVsIGZvciBcIiVzXCIgbmJhbmRzICVkIGJhbmRsb2NrZWQgJWRcbiIsCisJCQkgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fLAorCQkJIHdsY19jbS0+Y291bnRyeV9hYmJyZXYsIE5CQU5EUyh3bGMpLCB3bGMtPmJhbmRsb2NrZWQpOwogCX0gZWxzZQogCSAgICBpZiAobWJvb2xpc3NldCh3bGMtPnB1Yi0+cmFkaW9fZGlzYWJsZWQsCiAJCVdMX1JBRElPX0NPVU5UUllfRElTQUJMRSkpIHsKQEAgLTk5OCwxMiArMTAwOCwxMiBAQAogLyogcmVzZXQgdGhlIHF1aWV0IGNoYW5uZWxzIHZlY3RvciB0byB0aGUgdW5pb24gb2YgdGhlIHJlc3RyaWN0ZWQgYW5kIHJhZGFyIGNoYW5uZWwgc2V0cyAqLwogdm9pZCB3bGNfcXVpZXRfY2hhbm5lbHNfcmVzZXQod2xjX2NtX2luZm9fdCAqd2xjX2NtKQogewotCXdsY19pbmZvX3QgKndsYyA9IHdsY19jbS0+d2xjOworCXN0cnVjdCB3bGNfaW5mbyAqd2xjID0gd2xjX2NtLT53bGM7CiAJdWludCBpLCBqOwotCXdsY2JhbmRfdCAqYmFuZDsKKwlzdHJ1Y3Qgd2xjYmFuZCAqYmFuZDsKIAljb25zdCBjaGFudmVjX3QgKmNoYW52ZWM7CiAKLQliemVybygmd2xjX2NtLT5xdWlldF9jaGFubmVscywgc2l6ZW9mKGNoYW52ZWNfdCkpOworCW1lbXNldCgmd2xjX2NtLT5xdWlldF9jaGFubmVscywgMCwgc2l6ZW9mKGNoYW52ZWNfdCkpOwogCiAJYmFuZCA9IHdsYy0+YmFuZDsKIAlmb3IgKGkgPSAwOyBpIDwgTkJBTkRTKHdsYyk7CkBAIC0xMDM2LDcgKzEwNDYsNyBAQAogICovCiBib29sIHdsY192YWxpZF9jaGFubmVsMjBfZGIod2xjX2NtX2luZm9fdCAqd2xjX2NtLCB1aW50IHZhbCkKIHsKLQl3bGNfaW5mb190ICp3bGMgPSB3bGNfY20tPndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IHdsY19jbS0+d2xjOwogCiAJcmV0dXJuIFZBTElEX0NIQU5ORUwyMCh3bGMsIHZhbCkgfHwKIAkJKCF3bGMtPmJhbmRsb2NrZWQKQEAgLTEwNTQsNyArMTA2NCw3IEBACiAvKiBJcyB0aGUgY2hhbm5lbCB2YWxpZCBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlIGFuZCBjdXJyZW50IGJhbmQ/ICovCiBib29sIHdsY192YWxpZF9jaGFubmVsMjAod2xjX2NtX2luZm9fdCAqd2xjX2NtLCB1aW50IHZhbCkKIHsKLQl3bGNfaW5mb190ICp3bGMgPSB3bGNfY20tPndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IHdsY19jbS0+d2xjOwogCiAJcmV0dXJuICgodmFsIDwgTUFYQ0hBTk5FTCkgJiYKIAkJaXNzZXQod2xjX2NtLT5iYW5kc3RhdGVbd2xjLT5iYW5kLT5iYW5kdW5pdF0udmFsaWRfY2hhbm5lbHMudmVjLApAQCAtMTA2NCw3ICsxMDc0LDcgQEAKIC8qIElzIHRoZSA0MCBNSHogYWxsb3dlZCBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlIGFuZCBzcGVjaWZpZWQgYmFuZD8gKi8KIGJvb2wgd2xjX3ZhbGlkXzQwY2hhbnNwZWNfaW5fYmFuZCh3bGNfY21faW5mb190ICp3bGNfY20sIHVpbnQgYmFuZHVuaXQpCiB7Ci0Jd2xjX2luZm9fdCAqd2xjID0gd2xjX2NtLT53bGM7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSB3bGNfY20tPndsYzsKIAogCXJldHVybiAoKCh3bGNfY20tPmJhbmRzdGF0ZVtiYW5kdW5pdF0uCiAJCSAgbG9jYWxlX2ZsYWdzICYgKFdMQ19OT19NSU1PIHwgV0xDX05PXzQwTUhaKSkgPT0gMCkKQEAgLTExNjIsNyArMTE3Miw3IEBACiB3bGNfY2hhbm5lbF9zZXRfY2hhbnNwZWMod2xjX2NtX2luZm9fdCAqd2xjX2NtLCBjaGFuc3BlY190IGNoYW5zcGVjLAogCQkJIHU4IGxvY2FsX2NvbnN0cmFpbnRfcWRibSkKIHsKLQl3bGNfaW5mb190ICp3bGMgPSB3bGNfY20tPndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IHdsY19jbS0+d2xjOwogCXN0cnVjdCB0eHB3cl9saW1pdHMgdHhwd3I7CiAKIAl3bGNfY2hhbm5lbF9yZWdfbGltaXRzKHdsY19jbSwgY2hhbnNwZWMsICZ0eHB3cik7CkBAIC0xMTc5LDcgKzExODksNyBAQAogd2xjX2NoYW5uZWxfc2V0X3R4cG93ZXJfbGltaXQod2xjX2NtX2luZm9fdCAqd2xjX2NtLAogCQkJICAgICAgdTggbG9jYWxfY29uc3RyYWludF9xZGJtKQogewotCXdsY19pbmZvX3QgKndsYyA9IHdsY19jbS0+d2xjOworCXN0cnVjdCB3bGNfaW5mbyAqd2xjID0gd2xjX2NtLT53bGM7CiAJc3RydWN0IHR4cHdyX2xpbWl0cyB0eHB3cjsKIAogCXdsY19jaGFubmVsX3JlZ19saW1pdHMod2xjX2NtLCB3bGMtPmNoYW5zcGVjLCAmdHhwd3IpOwpAQCAtMTI5OSwxMyArMTMwOSwxMyBAQAogd2xjX2NoYW5uZWxfcmVnX2xpbWl0cyh3bGNfY21faW5mb190ICp3bGNfY20sIGNoYW5zcGVjX3QgY2hhbnNwZWMsCiAJCSAgICAgICB0eHB3cl9saW1pdHNfdCAqdHhwd3IpCiB7Ci0Jd2xjX2luZm9fdCAqd2xjID0gd2xjX2NtLT53bGM7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSB3bGNfY20tPndsYzsKIAl1aW50IGk7CiAJdWludCBjaGFuOwogCWludCBtYXhwd3I7CiAJaW50IGRlbHRhOwogCWNvbnN0IGNvdW50cnlfaW5mb190ICpjb3VudHJ5OwotCXdsY2JhbmRfdCAqYmFuZDsKKwlzdHJ1Y3Qgd2xjYmFuZCAqYmFuZDsKIAljb25zdCBsb2NhbGVfaW5mb190ICpsaTsKIAlpbnQgY29uZHVjdGVkX21heDsKIAlpbnQgY29uZHVjdGVkX29mZG1fbWF4OwpAQCAtMTMxNCw3ICsxMzI0LDcgQEAKIAlpbnQgbWF4cHdyX2lkeDsKIAl1aW50IGo7CiAKLQliemVybyh0eHB3ciwgc2l6ZW9mKHR4cHdyX2xpbWl0c190KSk7CisJbWVtc2V0KHR4cHdyLCAwLCBzaXplb2YodHhwd3JfbGltaXRzX3QpKTsKIAogCWlmICghd2xjX3ZhbGlkX2NoYW5zcGVjX2RiKHdsY19jbSwgY2hhbnNwZWMpKSB7CiAJCWNvdW50cnkgPSB3bGNfY291bnRyeV9sb29rdXAod2xjLCB3bGMtPmF1dG9jb3VudHJ5X2RlZmF1bHQpOwpAQCAtMTUyOCwxMyArMTUzOCwxMyBAQAogc3RhdGljIGJvb2wKIHdsY192YWxpZF9jaGFuc3BlY19leHQod2xjX2NtX2luZm9fdCAqd2xjX2NtLCBjaGFuc3BlY190IGNoc3BlYywgYm9vbCBkdWFsYmFuZCkKIHsKLQl3bGNfaW5mb190ICp3bGMgPSB3bGNfY20tPndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IHdsY19jbS0+d2xjOwogCXU4IGNoYW5uZWwgPSBDSFNQRUNfQ0hBTk5FTChjaHNwZWMpOwogCiAJLyogY2hlY2sgdGhlIGNoYW5zcGVjICovCiAJaWYgKHdmX2Noc3BlY19tYWxmb3JtZWQoY2hzcGVjKSkgewotCQlXTF9FUlJPUigoIndsJWQ6IG1hbGZvcm1lZCBjaGFuc3BlYyAweCV4XG4iLCB3bGMtPnB1Yi0+dW5pdCwKLQkJCSAgY2hzcGVjKSk7CisJCVdMX0VSUk9SKCJ3bCVkOiBtYWxmb3JtZWQgY2hhbnNwZWMgMHgleFxuIiwKKwkJCSB3bGMtPnB1Yi0+dW5pdCwgY2hzcGVjKTsKIAkJQVNTRVJUKDApOwogCQlyZXR1cm4gZmFsc2U7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2V2ZW50LmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfZXZlbnQuYwppbmRleCA3ZTFiZjBlLi5kYWJkNzA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfZXZlbnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfZXZlbnQuYwpAQCAtMTYsOSArMTYsMTMgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KLSNpbmNsdWRlIDxsaW51eHZlci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPG9zbC5oPgogI2luY2x1ZGUgPGJjbXV0aWxzLmg+CiAjaW5jbHVkZSA8c2l1dGlscy5oPgorI2luY2x1ZGUgPHNiaG5kcGlvLmg+CisjaW5jbHVkZSA8c2JobmRkbWEuaD4KICNpbmNsdWRlIDx3bGlvY3RsLmg+CiAjaW5jbHVkZSA8d2xjX2NmZy5oPgogI2luY2x1ZGUgPHdsY19wdWIuaD4KQEAgLTMyLDYgKzM2LDcgQEAKICNpZmRlZiBNU0dUUkFDRQogI2luY2x1ZGUgPG1zZ3RyYWNlLmg+CiAjZW5kaWYKKyNpbmNsdWRlIDx3bF9kYmcuaD4KIAogLyogTG9jYWwgcHJvdG90eXBlcyAqLwogc3RhdGljIHZvaWQgd2xjX3RpbWVyX2NiKHZvaWQgKmFyZyk7CkBAIC00Miw3ICs0Nyw3IEBACiAJd2xjX2V2ZW50X3QgKnRhaWw7CiAJc3RydWN0IHdsY19pbmZvICp3bGM7CiAJdm9pZCAqd2w7Ci0Jd2xjX3B1Yl90ICpwdWI7CisJc3RydWN0IHdsY19wdWIgKnB1YjsKIAlib29sIHRwZW5kaW5nOwogCWJvb2wgd29ya3BlbmRpbmc7CiAJc3RydWN0IHdsX3RpbWVyICp0aW1lcjsKQEAgLTUzLDcgKzU4LDggQEAKIC8qCiAgKiBFeHBvcnQgZnVuY3Rpb25zCiAgKi8KLXdsY19ldmVudHFfdCAqd2xjX2V2ZW50cV9hdHRhY2god2xjX3B1Yl90ICpwdWIsIHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB2b2lkICp3bCwKK3dsY19ldmVudHFfdCAqd2xjX2V2ZW50cV9hdHRhY2goc3RydWN0IHdsY19wdWIgKnB1Yiwgc3RydWN0IHdsY19pbmZvICp3bGMsCisJCQkJdm9pZCAqd2wsCiAJCQkJd2xjX2V2ZW50cV9jYl90IGNiKQogewogCXdsY19ldmVudHFfdCAqZXE7CkBAIC02OSw4ICs3NSw4IEBACiAKIAllcS0+dGltZXIgPSB3bF9pbml0X3RpbWVyKGVxLT53bCwgd2xjX3RpbWVyX2NiLCBlcSwgImV2ZW50cSIpOwogCWlmICghZXEtPnRpbWVyKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogd2xjX2V2ZW50cV9hdHRhY2g6IHRpbWVyIGZhaWxlZFxuIiwKLQkJCSAgcHViLT51bml0KSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfZXZlbnRxX2F0dGFjaDogdGltZXIgZmFpbGVkXG4iLAorCQkJIHB1Yi0+dW5pdCk7CiAJCWtmcmVlKGVxKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2V2ZW50LmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfZXZlbnQuaAppbmRleCBlNDQzZGFlLi5lNzU1ODJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfZXZlbnQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfZXZlbnQuaApAQCAtMjEsNyArMjEsOCBAQAogCiB0eXBlZGVmIHZvaWQgKCp3bGNfZXZlbnRxX2NiX3QpICh2b2lkICphcmcpOwogCi1leHRlcm4gd2xjX2V2ZW50cV90ICp3bGNfZXZlbnRxX2F0dGFjaCh3bGNfcHViX3QgKnB1Yiwgc3RydWN0IHdsY19pbmZvICp3bGMsCitleHRlcm4gd2xjX2V2ZW50cV90ICp3bGNfZXZlbnRxX2F0dGFjaChzdHJ1Y3Qgd2xjX3B1YiAqcHViLAorCQkJCSAgICAgICBzdHJ1Y3Qgd2xjX2luZm8gKndsYywKIAkJCQkgICAgICAgdm9pZCAqd2wsIHdsY19ldmVudHFfY2JfdCBjYik7CiBleHRlcm4gaW50IHdsY19ldmVudHFfZGV0YWNoKHdsY19ldmVudHFfdCAqZXEpOwogZXh0ZXJuIGludCB3bGNfZXZlbnRxX2Rvd24od2xjX2V2ZW50cV90ICplcSk7CkBAIC0zOCw3ICszOSw3IEBACiBleHRlcm4gaW50IHdsY19ldmVudHFfdGVzdF9pbmQod2xjX2V2ZW50cV90ICplcSwgaW50IGV0KTsKIGV4dGVybiBpbnQgd2xjX2V2ZW50cV9zZXRfaW5kKHdsY19ldmVudHFfdCAqZXEsIHVpbnQgZXQsIGJvb2wgb24pOwogZXh0ZXJuIHZvaWQgd2xjX2V2ZW50cV9mbHVzaCh3bGNfZXZlbnRxX3QgKmVxKTsKLWV4dGVybiB2b2lkIHdsY19hc3NpZ25fZXZlbnRfbXNnKHdsY19pbmZvX3QgKndsYywgd2xfZXZlbnRfbXNnX3QgKm1zZywKK2V4dGVybiB2b2lkIHdsY19hc3NpZ25fZXZlbnRfbXNnKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB3bF9ldmVudF9tc2dfdCAqbXNnLAogCQkJCSBjb25zdCB3bGNfZXZlbnRfdCAqZSwgdTggKmRhdGEsCiAJCQkJIHUzMiBsZW4pOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfbWFjODAyMTEuYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19tYWM4MDIxMS5jCmluZGV4IGZlYWZmY2MuLjFkNWQwMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19tYWM4MDIxMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19tYWM4MDIxMS5jCkBAIC0xNSw5ICsxNSwxMCBAQAogICovCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KKyNpbmNsdWRlIDxiY21kZXZzLmg+CiAjaW5jbHVkZSA8d2xjX2NmZy5oPgotI2luY2x1ZGUgPGxpbnV4dmVyLmg+CiAjaW5jbHVkZSA8b3NsLmg+CiAjaW5jbHVkZSA8YmNtdXRpbHMuaD4KICNpbmNsdWRlIDxiY213aWZpLmg+CkBAIC0yNyw3ICsyOCw3IEBACiAjaW5jbHVkZSA8cGNpY2ZnLmg+CiAjaW5jbHVkZSA8YmNtc3JvbS5oPgogI2luY2x1ZGUgPHdsaW9jdGwuaD4KLSNpbmNsdWRlIDxlcGl2ZXJzLmg+CisjaW5jbHVkZSA8c2JobmRwaW8uaD4KICNpbmNsdWRlIDxzYmhuZGRtYS5oPgogI2luY2x1ZGUgPGhuZGRtYS5oPgogI2luY2x1ZGUgPGhuZHBtdS5oPgpAQCAtMzcsNiArMzgsNyBAQAogI2luY2x1ZGUgPHdsY19rZXkuaD4KICNpbmNsdWRlIDx3bGNfYnNzY2ZnLmg+CiAjaW5jbHVkZSA8d2xjX2NoYW5uZWwuaD4KKyNpbmNsdWRlIDx3bGNfZXZlbnQuaD4KICNpbmNsdWRlIDx3bGNfbWFjODAyMTEuaD4KICNpbmNsdWRlIDx3bGNfYm1hYy5oPgogI2luY2x1ZGUgPHdsY19zY2IuaD4KQEAgLTQ3LDI3ICs0OSwxMSBAQAogI2luY2x1ZGUgPHdsY19hbXBkdS5oPgogI2luY2x1ZGUgPHdsY19ldmVudC5oPgogI2luY2x1ZGUgPHdsX2V4cG9ydC5oPgotI2lmZGVmIEJDTVNESU8KLSNpbmNsdWRlIDxiY21zZGguaD4KLSNlbHNlCiAjaW5jbHVkZSAiZDExdWNvZGVfZXh0LmgiCi0jZW5kaWYKLSNpZmRlZiBXTENfSElHSF9PTkxZCi0jaW5jbHVkZSA8YmNtX3JwY190cC5oPgotI2luY2x1ZGUgPGJjbV9ycGMuaD4KLSNpbmNsdWRlIDxiY21feGRyLmg+Ci0jaW5jbHVkZSA8d2xjX3JwYy5oPgotI2luY2x1ZGUgPHdsY19ycGN0eC5oPgotI2VuZGlmCQkJCS8qIFdMQ19ISUdIX09OTFkgKi8KICNpbmNsdWRlIDx3bGNfYWxsb2MuaD4KICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KKyNpbmNsdWRlIDx3bF9kYmcuaD4KIAotI2lmZGVmIFdMQ19ISUdIX09OTFkKLSN1bmRlZiBSX1JFRwotI3VuZGVmIFdfUkVHCi0jZGVmaW5lIFJfUkVHKG9zaCwgcikgUlBDX1JFQURfUkVHKG9zaCwgcikKLSNkZWZpbmUgV19SRUcob3NoLCByLCB2KSBSUENfV1JJVEVfUkVHKG9zaCwgciwgdikKLSNlbmRpZgogCiAvKgogICogYnVmZmVyIGxlbmd0aCBuZWVkZWQgZm9yIHdsY19mb3JtYXRfc3NpZApAQCAtMTA3LDEyICs5Myw4IEBACiAvKiBUbyBpbmZvcm0gdGhlIHVjb2RlIG9mIHRoZSBsYXN0IG1jYXN0IGZyYW1lIHBvc3RlZCBzbyB0aGF0IGl0IGNhbiBjbGVhciBtb3JlZGF0YSBiaXQgKi8KICNkZWZpbmUgQkNNQ0ZJRCh3bGMsIGZpZCkgd2xjX2JtYWNfd3JpdGVfc2htKCh3bGMpLT5odywgTV9CQ01DX0ZJRCwgKGZpZCkpCiAKLSNpZm5kZWYgV0xDX0hJR0hfT05MWQotI2RlZmluZSBXTENfV0FSMTYxNjUod2xjKSAoQlVTVFlQRSh3bGMtPnB1Yi0+c2loLT5idXN0eXBlKSA9PSBQQ0lfQlVTICYmIFwKKyNkZWZpbmUgV0xDX1dBUjE2MTY1KHdsYykgKHdsYy0+cHViLT5zaWgtPmJ1c3R5cGUgPT0gUENJX0JVUyAmJiBcCiAJCQkJKCFBUF9FTkFCKHdsYy0+cHViKSkgJiYgKHdsYy0+d2FyMTYxNjUpKQotI2Vsc2UKLSNkZWZpbmUgV0xDX1dBUjE2MTY1KHdsYykgKGZhbHNlKQotI2VuZGlmCQkJCS8qIFdMQ19ISUdIX09OTFkgKi8KIAogLyogZGVidWcvdHJhY2UgKi8KIHVpbnQgd2xfbXNnX2xldmVsID0KQEAgLTEzNSw5ICsxMTcsMTEgQEAKIAogI2RlZmluZSBTQ0FOX0lOX1BST0dSRVNTKHgpCTAKIAorI2RlZmluZSBFUElfVkVSU0lPTl9OVU0JCTB4MDU0YjBiMDAKKwogI2lmZGVmIEJDTURCRwogLyogcG9pbnRlciB0byBtb3N0IHJlY2VudGx5IGFsbG9jYXRlZCB3bC93bGMgKi8KLXN0YXRpYyB3bGNfaW5mb190ICp3bGNfaW5mb19kYmcgPSAod2xjX2luZm9fdCAqKSAoTlVMTCk7CitzdGF0aWMgc3RydWN0IHdsY19pbmZvICp3bGNfaW5mb19kYmcgPSAoc3RydWN0IHdsY19pbmZvICopIChOVUxMKTsKICNlbmRpZgogCiAvKiBJT1ZhciB0YWJsZSAqLwpAQCAtMjM4LDkxICsyMjIsOTEgQEAKICNkZWZpbmUgV0xDX1JFUExBWV9DTlRSU19WQUxVRQlXUEFfQ0FQXzE2X1JFUExBWV9DTlRSUwogCiAvKiBsb2NhbCBwcm90b3R5cGVzICovCi1leHRlcm4gdm9pZCB3bGNfdHhxX2VucSh2b2lkICpjdHgsIHN0cnVjdCBzY2IgKnNjYiwgdm9pZCAqc2R1LCB1aW50IHByZWMpOwotc3RhdGljIHUxNiBCQ01GQVNUUEFUSCB3bGNfZDExaGRyc19tYWM4MDIxMSh3bGNfaW5mb190ICp3bGMsCi0JCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdm9pZCAqcCwKK3N0YXRpYyB1MTYgQkNNRkFTVFBBVEggd2xjX2QxMWhkcnNfbWFjODAyMTEoc3RydWN0IHdsY19pbmZvICp3bGMsCisJCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpwLAogCQkJCQkgICAgICAgc3RydWN0IHNjYiAqc2NiLCB1aW50IGZyYWcsCiAJCQkJCSAgICAgICB1aW50IG5mcmFncywgdWludCBxdWV1ZSwKIAkJCQkJICAgICAgIHVpbnQgbmV4dF9mcmFnX2xlbiwKIAkJCQkJICAgICAgIHdzZWNfa2V5X3QgKmtleSwKIAkJCQkJICAgICAgIHJhdGVzcGVjX3QgcnNwZWNfb3ZlcnJpZGUpOwotYm9vbCB3bGNfc2VuZHBrdF9tYWM4MDIxMSh3bGNfaW5mb190ICp3bGMsIHZvaWQgKnNkdSwgc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwotdm9pZCB3bGNfd21lX3NldHBhcmFtcyh3bGNfaW5mb190ICp3bGMsIHUxNiBhY2ksIHZvaWQgKmFyZywgYm9vbCBzdXNwZW5kKTsKLXN0YXRpYyB2b2lkIHdsY19ic3NfZGVmYXVsdF9pbml0KHdsY19pbmZvX3QgKndsYyk7Ci1zdGF0aWMgdm9pZCB3bGNfdWNvZGVfbWFjX3VwZCh3bGNfaW5mb190ICp3bGMpOwotc3RhdGljIHJhdGVzcGVjX3QgbWFjODAyMTFfd2xjX3NldF9ucmF0ZSh3bGNfaW5mb190ICp3bGMsIHdsY2JhbmRfdCAqY3VyX2JhbmQsCi0JCQkJCSB1MzIgaW50X3ZhbCk7Ci1zdGF0aWMgdm9pZCB3bGNfdHhfcHJlY19tYXBfaW5pdCh3bGNfaW5mb190ICp3bGMpOworCitzdGF0aWMgdm9pZCB3bGNfYnNzX2RlZmF1bHRfaW5pdChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CitzdGF0aWMgdm9pZCB3bGNfdWNvZGVfbWFjX3VwZChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CitzdGF0aWMgcmF0ZXNwZWNfdCBtYWM4MDIxMV93bGNfc2V0X25yYXRlKHN0cnVjdCB3bGNfaW5mbyAqd2xjLAorCQkJCQkgc3RydWN0IHdsY2JhbmQgKmN1cl9iYW5kLCB1MzIgaW50X3ZhbCk7CitzdGF0aWMgdm9pZCB3bGNfdHhfcHJlY19tYXBfaW5pdChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CiBzdGF0aWMgdm9pZCB3bGNfd2F0Y2hkb2codm9pZCAqYXJnKTsKIHN0YXRpYyB2b2lkIHdsY193YXRjaGRvZ19ieV90aW1lcih2b2lkICphcmcpOwotc3RhdGljIGludCB3bGNfc2V0X3JhdGVzZXQod2xjX2luZm9fdCAqd2xjLCB3bGNfcmF0ZXNldF90ICpyc19hcmcpOwotc3RhdGljIGludCB3bGNfaW92YXJfcmFuZ2VjaGVjayh3bGNfaW5mb190ICp3bGMsIHUzMiB2YWwsCitzdGF0aWMgaW50IHdsY19zZXRfcmF0ZXNldChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgd2xjX3JhdGVzZXRfdCAqcnNfYXJnKTsKK3N0YXRpYyBpbnQgd2xjX2lvdmFyX3JhbmdlY2hlY2soc3RydWN0IHdsY19pbmZvICp3bGMsIHUzMiB2YWwsCiAJCQkJY29uc3QgYmNtX2lvdmFyX3QgKnZpKTsKLXN0YXRpYyB1OCB3bGNfbG9jYWxfY29uc3RyYWludF9xZGJtKHdsY19pbmZvX3QgKndsYyk7CitzdGF0aWMgdTggd2xjX2xvY2FsX2NvbnN0cmFpbnRfcWRibShzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CiAKIC8qIHNlbmQgYW5kIHJlY2VpdmUgKi8KLXN0YXRpYyB3bGNfdHhxX2luZm9fdCAqd2xjX3R4cV9hbGxvYyh3bGNfaW5mb190ICp3bGMsIG9zbF90ICpvc2gpOwotc3RhdGljIHZvaWQgd2xjX3R4cV9mcmVlKHdsY19pbmZvX3QgKndsYywgb3NsX3QgKm9zaCwgd2xjX3R4cV9pbmZvX3QgKnFpKTsKLXN0YXRpYyB2b2lkIHdsY190eGZsb3djb250cm9sX3NpZ25hbCh3bGNfaW5mb190ICp3bGMsIHdsY190eHFfaW5mb190ICpxaSwKK3N0YXRpYyB3bGNfdHhxX2luZm9fdCAqd2xjX3R4cV9hbGxvYyhzdHJ1Y3Qgd2xjX2luZm8gKndsYywKKwkJCQkgICAgIHN0cnVjdCBvc2xfaW5mbyAqb3NoKTsKK3N0YXRpYyB2b2lkIHdsY190eHFfZnJlZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgc3RydWN0IG9zbF9pbmZvICpvc2gsCisJCQkgd2xjX3R4cV9pbmZvX3QgKnFpKTsKK3N0YXRpYyB2b2lkIHdsY190eGZsb3djb250cm9sX3NpZ25hbChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgd2xjX3R4cV9pbmZvX3QgKnFpLAogCQkJCSAgICAgYm9vbCBvbiwgaW50IHByaW8pOwotc3RhdGljIHZvaWQgd2xjX3R4Zmxvd2NvbnRyb2xfcmVzZXQod2xjX2luZm9fdCAqd2xjKTsKLXN0YXRpYyB1MTYgd2xjX2NvbXB1dGVfYWlydGltZSh3bGNfaW5mb190ICp3bGMsIHJhdGVzcGVjX3QgcnNwZWMsCitzdGF0aWMgdm9pZCB3bGNfdHhmbG93Y29udHJvbF9yZXNldChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CitzdGF0aWMgdTE2IHdsY19jb21wdXRlX2FpcnRpbWUoc3RydWN0IHdsY19pbmZvICp3bGMsIHJhdGVzcGVjX3QgcnNwZWMsCiAJCQkJICB1aW50IGxlbmd0aCk7CiBzdGF0aWMgdm9pZCB3bGNfY29tcHV0ZV9jY2tfcGxjcChyYXRlc3BlY190IHJhdGUsIHVpbnQgbGVuZ3RoLCB1OCAqcGxjcCk7CiBzdGF0aWMgdm9pZCB3bGNfY29tcHV0ZV9vZmRtX3BsY3AocmF0ZXNwZWNfdCByYXRlLCB1aW50IGxlbmd0aCwgdTggKnBsY3ApOwogc3RhdGljIHZvaWQgd2xjX2NvbXB1dGVfbWltb19wbGNwKHJhdGVzcGVjX3QgcmF0ZSwgdWludCBsZW5ndGgsIHU4ICpwbGNwKTsKLXN0YXRpYyB1MTYgd2xjX2NvbXB1dGVfZnJhbWVfZHVyKHdsY19pbmZvX3QgKndsYywgcmF0ZXNwZWNfdCByYXRlLAorc3RhdGljIHUxNiB3bGNfY29tcHV0ZV9mcmFtZV9kdXIoc3RydWN0IHdsY19pbmZvICp3bGMsIHJhdGVzcGVjX3QgcmF0ZSwKIAkJCQkgICAgdTggcHJlYW1ibGVfdHlwZSwgdWludCBuZXh0X2ZyYWdfbGVuKTsKLXN0YXRpYyB2b2lkIHdsY19yZWN2Y3RsKHdsY19pbmZvX3QgKndsYywgb3NsX3QgKm9zaCwgZDExcnhoZHJfdCAqcnhoLAotCQkJdm9pZCAqcCk7Ci1zdGF0aWMgdWludCB3bGNfY2FsY19mcmFtZV9sZW4od2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJhdGUsCitzdGF0aWMgdm9pZCB3bGNfcmVjdmN0bChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgc3RydWN0IG9zbF9pbmZvICpvc2gsCisJCQlkMTFyeGhkcl90ICpyeGgsIHN0cnVjdCBza19idWZmICpwKTsKK3N0YXRpYyB1aW50IHdsY19jYWxjX2ZyYW1lX2xlbihzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByYXRlLAogCQkJICAgICAgIHU4IHByZWFtYmxlX3R5cGUsIHVpbnQgZHVyKTsKLXN0YXRpYyB1aW50IHdsY19jYWxjX2Fja190aW1lKHdsY19pbmZvX3QgKndsYywgcmF0ZXNwZWNfdCByYXRlLAorc3RhdGljIHVpbnQgd2xjX2NhbGNfYWNrX3RpbWUoc3RydWN0IHdsY19pbmZvICp3bGMsIHJhdGVzcGVjX3QgcmF0ZSwKIAkJCSAgICAgIHU4IHByZWFtYmxlX3R5cGUpOwotc3RhdGljIHVpbnQgd2xjX2NhbGNfY3RzX3RpbWUod2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJhdGUsCitzdGF0aWMgdWludCB3bGNfY2FsY19jdHNfdGltZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByYXRlLAogCQkJICAgICAgdTggcHJlYW1ibGVfdHlwZSk7CiAvKiBpbnRlcnJ1cHQsIHVwL2Rvd24sIGJhbmQgKi8KLXN0YXRpYyB2b2lkIHdsY19zZXRiYW5kKHdsY19pbmZvX3QgKndsYywgdWludCBiYW5kdW5pdCk7Ci1zdGF0aWMgY2hhbnNwZWNfdCB3bGNfaW5pdF9jaGFuc3BlYyh3bGNfaW5mb190ICp3bGMpOwotc3RhdGljIHZvaWQgd2xjX2JhbmRpbml0X29yZGVyZWQod2xjX2luZm9fdCAqd2xjLCBjaGFuc3BlY190IGNoYW5zcGVjKTsKLXN0YXRpYyB2b2lkIHdsY19ic2luaXQod2xjX2luZm9fdCAqd2xjKTsKLXN0YXRpYyBpbnQgd2xjX2R1dHlfY3ljbGVfc2V0KHdsY19pbmZvX3QgKndsYywgaW50IGR1dHlfY3ljbGUsIGJvb2wgaXNPRkRNLAorc3RhdGljIHZvaWQgd2xjX3NldGJhbmQoc3RydWN0IHdsY19pbmZvICp3bGMsIHVpbnQgYmFuZHVuaXQpOworc3RhdGljIGNoYW5zcGVjX3Qgd2xjX2luaXRfY2hhbnNwZWMoc3RydWN0IHdsY19pbmZvICp3bGMpOworc3RhdGljIHZvaWQgd2xjX2JhbmRpbml0X29yZGVyZWQoc3RydWN0IHdsY19pbmZvICp3bGMsIGNoYW5zcGVjX3QgY2hhbnNwZWMpOworc3RhdGljIHZvaWQgd2xjX2JzaW5pdChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CitzdGF0aWMgaW50IHdsY19kdXR5X2N5Y2xlX3NldChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgaW50IGR1dHlfY3ljbGUsIGJvb2wgaXNPRkRNLAogCQkJICAgICAgYm9vbCB3cml0ZVRvU2htKTsKLXN0YXRpYyB2b2lkIHdsY19yYWRpb19od2Rpc2FibGVfdXBkKHdsY19pbmZvX3QgKndsYyk7Ci1zdGF0aWMgYm9vbCB3bGNfcmFkaW9fbW9uaXRvcl9zdGFydCh3bGNfaW5mb190ICp3bGMpOworc3RhdGljIHZvaWQgd2xjX3JhZGlvX2h3ZGlzYWJsZV91cGQoc3RydWN0IHdsY19pbmZvICp3bGMpOworc3RhdGljIGJvb2wgd2xjX3JhZGlvX21vbml0b3Jfc3RhcnQoc3RydWN0IHdsY19pbmZvICp3bGMpOwogc3RhdGljIHZvaWQgd2xjX3JhZGlvX3RpbWVyKHZvaWQgKmFyZyk7Ci1zdGF0aWMgdm9pZCB3bGNfcmFkaW9fZW5hYmxlKHdsY19pbmZvX3QgKndsYyk7Ci1zdGF0aWMgdm9pZCB3bGNfcmFkaW9fdXBkKHdsY19pbmZvX3QgKndsYyk7CitzdGF0aWMgdm9pZCB3bGNfcmFkaW9fZW5hYmxlKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK3N0YXRpYyB2b2lkIHdsY19yYWRpb191cGQoc3RydWN0IHdsY19pbmZvICp3bGMpOwogCiAvKiBzY2FuLCBhc3NvY2lhdGlvbiwgQlNTICovCi1zdGF0aWMgdWludCB3bGNfY2FsY19iYV90aW1lKHdsY19pbmZvX3QgKndsYywgcmF0ZXNwZWNfdCByYXRlLAorc3RhdGljIHVpbnQgd2xjX2NhbGNfYmFfdGltZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByYXRlLAogCQkJICAgICB1OCBwcmVhbWJsZV90eXBlKTsKLXN0YXRpYyB2b2lkIHdsY191cGRhdGVfbWltb19iYW5kX2J3Y2FwKHdsY19pbmZvX3QgKndsYywgdTggYndjYXApOwotc3RhdGljIHZvaWQgd2xjX2h0X3VwZGF0ZV9zZ2lfcngod2xjX2luZm9fdCAqd2xjLCBpbnQgdmFsKTsKLXZvaWQgd2xjX2h0X21pbW9wc19jYXBfdXBkYXRlKHdsY19pbmZvX3QgKndsYywgdTggbWltb3BzX21vZGUpOwotc3RhdGljIHZvaWQgd2xjX2h0X3VwZGF0ZV9sZHBjKHdsY19pbmZvX3QgKndsYywgczggdmFsKTsKLXN0YXRpYyB2b2lkIHdsY193YXIxNjE2NSh3bGNfaW5mb190ICp3bGMsIGJvb2wgdHgpOworc3RhdGljIHZvaWQgd2xjX3VwZGF0ZV9taW1vX2JhbmRfYndjYXAoc3RydWN0IHdsY19pbmZvICp3bGMsIHU4IGJ3Y2FwKTsKK3N0YXRpYyB2b2lkIHdsY19odF91cGRhdGVfc2dpX3J4KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBpbnQgdmFsKTsKK3N0YXRpYyB2b2lkIHdsY19odF91cGRhdGVfbGRwYyhzdHJ1Y3Qgd2xjX2luZm8gKndsYywgczggdmFsKTsKK3N0YXRpYyB2b2lkIHdsY193YXIxNjE2NShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgYm9vbCB0eCk7CiAKIHN0YXRpYyB2b2lkIHdsY19wcm9jZXNzX2V2ZW50cSh2b2lkICphcmcpOwotc3RhdGljIHZvaWQgd2xjX3dtZV9yZXRyaWVzX3dyaXRlKHdsY19pbmZvX3QgKndsYyk7Ci1zdGF0aWMgYm9vbCB3bGNfYXR0YWNoX3N0Zl9hbnRfaW5pdCh3bGNfaW5mb190ICp3bGMpOwotc3RhdGljIHVpbnQgd2xjX2F0dGFjaF9tb2R1bGUod2xjX2luZm9fdCAqd2xjKTsKLXN0YXRpYyB2b2lkIHdsY19kZXRhY2hfbW9kdWxlKHdsY19pbmZvX3QgKndsYyk7Ci1zdGF0aWMgdm9pZCB3bGNfdGltZXJzX2RlaW5pdCh3bGNfaW5mb190ICp3bGMpOwotc3RhdGljIHZvaWQgd2xjX2Rvd25fbGVkX3VwZCh3bGNfaW5mb190ICp3bGMpOwotc3RhdGljIHVpbnQgd2xjX2Rvd25fZGVsX3RpbWVyKHdsY19pbmZvX3QgKndsYyk7Ci1zdGF0aWMgdm9pZCB3bGNfb2ZkbV9yYXRlc2V0X3dhcih3bGNfaW5mb190ICp3bGMpOwotc3RhdGljIGludCBfd2xjX2lvY3RsKHdsY19pbmZvX3QgKndsYywgaW50IGNtZCwgdm9pZCAqYXJnLCBpbnQgbGVuLAorc3RhdGljIHZvaWQgd2xjX3dtZV9yZXRyaWVzX3dyaXRlKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK3N0YXRpYyBib29sIHdsY19hdHRhY2hfc3RmX2FudF9pbml0KHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK3N0YXRpYyB1aW50IHdsY19hdHRhY2hfbW9kdWxlKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK3N0YXRpYyB2b2lkIHdsY19kZXRhY2hfbW9kdWxlKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK3N0YXRpYyB2b2lkIHdsY190aW1lcnNfZGVpbml0KHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK3N0YXRpYyB2b2lkIHdsY19kb3duX2xlZF91cGQoc3RydWN0IHdsY19pbmZvICp3bGMpOworc3RhdGljIHVpbnQgd2xjX2Rvd25fZGVsX3RpbWVyKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK3N0YXRpYyB2b2lkIHdsY19vZmRtX3JhdGVzZXRfd2FyKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK3N0YXRpYyBpbnQgX3dsY19pb2N0bChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgaW50IGNtZCwgdm9pZCAqYXJnLCBpbnQgbGVuLAogCQkgICAgICBzdHJ1Y3Qgd2xjX2lmICp3bGNpZik7CiAKICNpZiBkZWZpbmVkKEJDTURCRykKLXZvaWQgd2xjX2dldF9yY210YSh3bGNfaW5mb190ICp3bGMsIGludCBpZHgsIHN0cnVjdCBldGhlcl9hZGRyICphZGRyKQordm9pZCB3bGNfZ2V0X3JjbXRhKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBpbnQgaWR4LCBzdHJ1Y3QgZXRoZXJfYWRkciAqYWRkcikKIHsKIAlkMTFyZWdzX3QgKnJlZ3MgPSB3bGMtPnJlZ3M7CiAJdTMyIHYzMjsKLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiAlc1xuIiwgV0xDV0xVTklUKHdsYyksIF9fZnVuY19fKSk7CisJV0xfVFJBQ0UoIndsJWQ6ICVzXG4iLCBXTENXTFVOSVQod2xjKSwgX19mdW5jX18pOwogCiAJQVNTRVJUKHdsYy0+cHViLT5jb3JlcmV2ID4gNCk7CiAKQEAgLTM0NCwxNCArMzI4LDE0IEBACiAjZW5kaWYJCQkJLyogZGVmaW5lZChCQ01EQkcpICovCiAKIC8qIGtlZXAgdGhlIGNoaXAgYXdha2UgaWYgbmVlZGVkICovCi1ib29sIHdsY19zdGF5X2F3YWtlKHdsY19pbmZvX3QgKndsYykKK2Jvb2wgd2xjX3N0YXlfYXdha2Uoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJcmV0dXJuIHRydWU7CiB9CiAKIC8qIGNvbmRpdGlvbnMgdW5kZXIgd2hpY2ggdGhlIFBNIGJpdCBzaG91bGQgYmUgc2V0IGluIG91dGdvaW5nIGZyYW1lcyBhbmQgU1RBWV9BV0FLRSBpcyBtZWFuaW5nZnVsCiAgKi8KLWJvb2wgd2xjX3BzX2FsbG93ZWQod2xjX2luZm9fdCAqd2xjKQorYm9vbCB3bGNfcHNfYWxsb3dlZChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAlpbnQgaWR4OwogCXdsY19ic3NjZmdfdCAqY2ZnOwpAQCAtMzc4LDkgKzM2Miw5IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgd2xjX3Jlc2V0KHdsY19pbmZvX3QgKndsYykKK3ZvaWQgd2xjX3Jlc2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewotCVdMX1RSQUNFKCgid2wlZDogd2xjX3Jlc2V0XG4iLCB3bGMtPnB1Yi0+dW5pdCkpOworCVdMX1RSQUNFKCJ3bCVkOiB3bGNfcmVzZXRcbiIsIHdsYy0+cHViLT51bml0KTsKIAogCXdsYy0+Y2hlY2tfZm9yX3VuYWxpZ25lZF90YnR0ID0gZmFsc2U7CiAKQEAgLTM4OSwzNCArMzczLDE5IEBACiAJCXdsY19zdGF0c3VwZCh3bGMpOwogCiAJCS8qIHJlc2V0IG91ciBzbmFwc2hvdCBvZiBtYWNzdGF0IGNvdW50ZXJzICovCi0JCWJ6ZXJvKChjaGFyICopd2xjLT5jb3JlLT5tYWNzdGF0X3NuYXBzaG90LCBzaXplb2YobWFjc3RhdF90KSk7CisJCW1lbXNldCgoY2hhciAqKXdsYy0+Y29yZS0+bWFjc3RhdF9zbmFwc2hvdCwgMCwKKwkJCXNpemVvZihtYWNzdGF0X3QpKTsKIAl9CiAKIAl3bGNfYm1hY19yZXNldCh3bGMtPmh3KTsKIAl3bGNfYW1wZHVfcmVzZXQod2xjLT5hbXBkdSk7CiAJd2xjLT50eHJldHJpZWQgPSAwOwogCi0jaWZkZWYgV0xDX0hJR0hfT05MWQotCS8qIE5lZWQgdG8gc2V0IGEgZmxhZyh0byBiZSBjbGVhcmVkIGFzeW5jaHJvbm91c2x5IGJ5IEJNQUMgZHJpdmVyIHdpdGggaGlnaCBjYWxsKQotCSAqICBpbiBvcmRlciB0byBwcmV2ZW50IHdsY19ycGN0eF90eHJlY2xhaW0oKSBmcm9tIHNjcmV3aW5nIHdsY19ycGN0eF9nZXRuZXh0dHhwKCksCi0JICogIHdoaWNoIGNvdWxkIGJlIGludm9rZWQgYnkgYWxyZWFkeSBRVUVVRUQgaGlnaCBjYWxsKHMpIGZyb20gQk1BQyBkcml2ZXIgYmVmb3JlCi0JICogIHdsY19ibWFjX3Jlc2V0KCkgZmluaXNoZXMuCi0JICogSXQncyBub3QgbmVlZGVkIGJlZm9yZSBpbiBtb25vbGl0aGljIGRyaXZlciBtb2RlbCBiZWNhdXNlIGQxMWNvcmUgaW50ZXJydXB0cyB3b3VsZAotCSAqICBoYXZlIGJlZW4gY2xlYXJlZCBpbnN0YW50bHkgaW4gd2xjX2JtYWNfcmVzZXQoKSBhbmQgbm8gdHhzdGF0dXMgaW50ZXJydXB0Ci0JICogIHdpbGwgY29tZSB0byBkcml2ZXIgdG8gZmV0Y2ggdGhvc2UgZmx1c2hlZCBkbWEgcGt0IHBvaW50ZXJzLgotCSAqLwotCXdsYy0+cmVzZXRfYm1hY19wZW5kaW5nID0gdHJ1ZTsKLQotCXdsY19ycGN0eF90eHJlY2xhaW0od2xjLT5ycGN0eCk7Ci0KLQl3bGNfc3RmX3BoeV90eGFudF91cGQod2xjKTsKLQl3bGNfcGh5X2FudF9yeGRpdl9zZXQod2xjLT5iYW5kLT5waSwgd2xjLT5zdGYtPmFudF9yeF9vdnIpOwotI2VuZGlmCiB9CiAKLXZvaWQgd2xjX2ZhdGFsX2Vycm9yKHdsY19pbmZvX3QgKndsYykKK3ZvaWQgd2xjX2ZhdGFsX2Vycm9yKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewotCVdMX0VSUk9SKCgid2wlZDogZmF0YWwgZXJyb3IsIHJlaW5pdGlhbGl6aW5nXG4iLCB3bGMtPnB1Yi0+dW5pdCkpOworCVdMX0VSUk9SKCJ3bCVkOiBmYXRhbCBlcnJvciwgcmVpbml0aWFsaXppbmdcbiIsIHdsYy0+cHViLT51bml0KTsKIAl3bF9pbml0KHdsYy0+d2wpOwogfQogCkBAIC00MjUsNyArMzk0LDcgQEAKICAqIGlmIG90aGVyIGNvbmZpZ3VyYXRpb25zIGFyZSBpbiBjb25mbGljdCAoYmFuZGxvY2tlZCwgMTFuIG1vZGUgZGlzYWJsZWQsCiAgKiBpbnZhbGlkIGNoYW5uZWwgZm9yIGN1cnJlbnQgY291bnRyeSwgZXRjLikKICAqLwotc3RhdGljIGNoYW5zcGVjX3Qgd2xjX2luaXRfY2hhbnNwZWMod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIGNoYW5zcGVjX3Qgd2xjX2luaXRfY2hhbnNwZWMoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJY2hhbnNwZWNfdCBjaGFuc3BlYyA9CiAJICAgIDEgfCBXTF9DSEFOU1BFQ19CV18yMCB8IFdMX0NIQU5TUEVDX0NUTF9TQl9OT05FIHwKQEAgLTQ0MSw3ICs0MTAsNyBAQAogCiBzdHJ1Y3Qgc2NiIGdsb2JhbF9zY2I7CiAKLXN0YXRpYyB2b2lkIHdsY19pbml0X3NjYih3bGNfaW5mb190ICp3bGMsIHN0cnVjdCBzY2IgKnNjYikKK3N0YXRpYyB2b2lkIHdsY19pbml0X3NjYihzdHJ1Y3Qgd2xjX2luZm8gKndsYywgc3RydWN0IHNjYiAqc2NiKQogewogCWludCBpOwogCXNjYi0+ZmxhZ3MgPSBTQ0JfV01FQ0FQIHwgU0NCX0hUQ0FQOwpAQCAtNDQ5LDcgKzQxOCw3IEBACiAJCXNjYi0+c2VxbnVtW2ldID0gMDsKIH0KIAotdm9pZCB3bGNfaW5pdCh3bGNfaW5mb190ICp3bGMpCit2b2lkIHdsY19pbml0KHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCWQxMXJlZ3NfdCAqcmVnczsKIAljaGFuc3BlY190IGNoYW5zcGVjOwpAQCAtNDU3LDcgKzQyNiw3IEBACiAJd2xjX2Jzc2NmZ190ICpic3NjZmc7CiAJYm9vbCBtdXRlID0gZmFsc2U7CiAKLQlXTF9UUkFDRSgoIndsJWQ6IHdsY19pbml0XG4iLCB3bGMtPnB1Yi0+dW5pdCkpOworCVdMX1RSQUNFKCJ3bCVkOiB3bGNfaW5pdFxuIiwgd2xjLT5wdWItPnVuaXQpOwogCiAJcmVncyA9IHdsYy0+cmVnczsKIApAQCAtNTgzLDEzICs1NTIsMTMgQEAKIAl9CiB9CiAKLXZvaWQgd2xjX21hY19iY25fcHJvbWlzY19jaGFuZ2Uod2xjX2luZm9fdCAqd2xjLCBib29sIHByb21pc2MpCit2b2lkIHdsY19tYWNfYmNuX3Byb21pc2NfY2hhbmdlKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBib29sIHByb21pc2MpCiB7CiAJd2xjLT5iY25taXNjX21vbml0b3IgPSBwcm9taXNjOwogCXdsY19tYWNfYmNuX3Byb21pc2Mod2xjKTsKIH0KIAotdm9pZCB3bGNfbWFjX2Jjbl9wcm9taXNjKHdsY19pbmZvX3QgKndsYykKK3ZvaWQgd2xjX21hY19iY25fcHJvbWlzYyhzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAlpZiAoKEFQX0VOQUIod2xjLT5wdWIpICYmIChOX0VOQUIod2xjLT5wdWIpIHx8IHdsYy0+YmFuZC0+Z21vZGUpKSB8fAogCSAgICB3bGMtPmJjbm1pc2NfaWJzcyB8fCB3bGMtPmJjbm1pc2Nfc2NhbiB8fCB3bGMtPmJjbm1pc2NfbW9uaXRvcikKQEAgLTU5OSw3ICs1NjgsNyBAQAogfQogCiAvKiBzZXQgb3IgY2xlYXIgbWFjY29udHJvbCBiaXRzIE1DVExfUFJPTUlTQyBhbmQgTUNUTF9LRUVQQ09OVFJPTCAqLwotdm9pZCB3bGNfbWFjX3Byb21pc2Mod2xjX2luZm9fdCAqd2xjKQordm9pZCB3bGNfbWFjX3Byb21pc2Moc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJdTMyIHByb21pc2NfYml0cyA9IDA7CiAKQEAgLTYyMSw3ICs1OTAsNyBAQAogfQogCiAvKiBjaGVjayBpZiBocHMgYW5kIHdha2Ugc3RhdGVzIG9mIHN3IGFuZCBodyBhcmUgaW4gc3luYyAqLwotYm9vbCB3bGNfcHNfY2hlY2sod2xjX2luZm9fdCAqd2xjKQorYm9vbCB3bGNfcHNfY2hlY2soc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJYm9vbCByZXMgPSB0cnVlOwogCWJvb2wgaHBzLCB3YWtlOwpAQCAtNjM2LDggKzYwNSw4IEBACiAJCSAqIHRvIGF2b2lkIGFzc2VydAogCQkgKi8KIAkJaWYgKHRtcCA9PSAweGZmZmZmZmZmKSB7Ci0JCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBkZWFkIGNoaXBcbiIsIHdsYy0+cHViLT51bml0LAotCQkJCSAgX19mdW5jX18pKTsKKwkJCVdMX0VSUk9SKCJ3bCVkOiAlczogZGVhZCBjaGlwXG4iLAorCQkJCSB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18pOwogCQkJcmV0dXJuIERFVklDRVJFTU9WRUQod2xjKTsKIAkJfQogCkBAIC02NDYsNyArNjE1LDggQEAKIAkJaWYgKGhwcyAhPSAoKHRtcCAmIE1DVExfSFBTKSAhPSAwKSkgewogCQkJaW50IGlkeDsKIAkJCXdsY19ic3NjZmdfdCAqY2ZnOwotCQkJV0xfRVJST1IoKCJ3bCVkOiBocHMgbm90IHN5bmMsIHN3ICVkLCBtYWNjb250cm9sIDB4JXhcbiIsIHdsYy0+cHViLT51bml0LCBocHMsIHRtcCkpOworCQkJV0xfRVJST1IoIndsJWQ6IGhwcyBub3Qgc3luYywgc3cgJWQsIG1hY2NvbnRyb2wgMHgleFxuIiwKKwkJCQkgd2xjLT5wdWItPnVuaXQsIGhwcywgdG1wKTsKIAkJCUZPUkVBQ0hfQlNTKHdsYywgaWR4LCBjZmcpIHsKIAkJCQlpZiAoIUJTU0NGR19TVEEoY2ZnKSkKIAkJCQkJY29udGludWU7CkBAIC02NTQsMjMgKzYyNCwxNCBAQAogCiAJCQlyZXMgPSBmYWxzZTsKIAkJfQotI2lmZGVmIFdMQ19MT1cKIAkJLyogRm9yIGEgbW9ub2xpdGhpYyBidWlsZCB0aGUgd2FrZSBjaGVjayBjYW4gYmUgZXhhY3Qgc2luY2UgaXQgbG9va3MgYXQgd2FrZQogCQkgKiBvdmVycmlkZSBiaXRzLiBUaGUgTUNUTF9XQUtFIGJpdCBzaG91bGQgbWF0Y2ggdGhlICd3YWtlJyB2YWx1ZS4KIAkJICovCiAJCXdha2UgPSBTVEFZX0FXQUtFKHdsYykgfHwgd2xjLT5ody0+d2FrZV9vdmVycmlkZTsKIAkJd2FrZV9vayA9ICh3YWtlID09ICgodG1wICYgTUNUTF9XQUtFKSAhPSAwKSk7Ci0jZWxzZQotCQkvKiBGb3IgYSBzcGxpdCBidWlsZCB3ZSB3aWxsIG5vdCBoYXZlIGFjY2VzcyB0byBhbnkgd2FrZSBvdmVycmlkZXMgZnJvbSB0aGUgbG93Ci0JCSAqIGxldmVsLiBUaGUgY2hlY2sgY2FuIG9ubHkgbWFrZSBzdXJlIHRoZSBNQ1RMX1dBS0UgYml0IGlzIG9uIGlmIHRoZSBoaWdoCi0JCSAqIGxldmVsICd3YWtlJyB2YWx1ZSBpcyB0cnVlLiBJZiB0aGUgaGlnaCBsZXZlbCAnd2FrZScgaXMgZmFsc2UsIHRoZSBNQ1RMX1dBS0UKLQkJICogbWF5IGJlIGVpdGhlciB0cnVlIG9yIGZhbHNlIGR1ZSB0byB0aGUgbG93IGxldmVsIG92ZXJyaWRlLgotCQkgKi8KLQkJd2FrZSA9IFNUQVlfQVdBS0Uod2xjKTsKLQkJd2FrZV9vayA9ICh3YWtlICYmICgodG1wICYgTUNUTF9XQUtFKSAhPSAwKSkgfHwgIXdha2U7Ci0jZW5kaWYKIAkJaWYgKGhwcyAmJiAhd2FrZV9vaykgewotCQkJV0xfRVJST1IoKCJ3bCVkOiB3YWtlIG5vdCBzeW5jLCBzdyAlZCBtYWNjb250cm9sIDB4JXhcbiIsIHdsYy0+cHViLT51bml0LCB3YWtlLCB0bXApKTsKKwkJCVdMX0VSUk9SKCJ3bCVkOiB3YWtlIG5vdCBzeW5jLCBzdyAlZCBtYWNjb250cm9sIDB4JXhcbiIsCisJCQkJIHdsYy0+cHViLT51bml0LCB3YWtlLCB0bXApOwogCQkJcmVzID0gZmFsc2U7CiAJCX0KIAl9CkBAIC02NzksNyArNjQwLDcgQEAKIH0KIAogLyogcHVzaCBzdyBocHMgYW5kIHdha2Ugc3RhdGUgdGhyb3VnaCBoYXJkd2FyZSAqLwotdm9pZCB3bGNfc2V0X3BzX2N0cmwod2xjX2luZm9fdCAqd2xjKQordm9pZCB3bGNfc2V0X3BzX2N0cmwoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJdTMyIHYxLCB2MjsKIAlib29sIGhwcywgd2FrZTsKQEAgLTY4OCw4ICs2NDksOCBAQAogCWhwcyA9IFBTX0FMTE9XRUQod2xjKTsKIAl3YWtlID0gaHBzID8gKFNUQVlfQVdBS0Uod2xjKSkgOiB0cnVlOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiB3bGNfc2V0X3BzX2N0cmw6IGhwcyAlZCB3YWtlICVkXG4iLCB3bGMtPnB1Yi0+dW5pdCwKLQkJICBocHMsIHdha2UpKTsKKwlXTF9UUkFDRSgid2wlZDogd2xjX3NldF9wc19jdHJsOiBocHMgJWQgd2FrZSAlZFxuIiwKKwkJIHdsYy0+cHViLT51bml0LCBocHMsIHdha2UpOwogCiAJdjEgPSBSX1JFRyh3bGMtPm9zaCwgJndsYy0+cmVncy0+bWFjY29udHJvbCk7CiAJdjIgPSAwOwpAQCAtNzE0LDcgKzY3NSw3IEBACiBpbnQgd2xjX3NldF9tYWMod2xjX2Jzc2NmZ190ICpjZmcpCiB7CiAJaW50IGVyciA9IDA7Ci0Jd2xjX2luZm9fdCAqd2xjID0gY2ZnLT53bGM7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSBjZmctPndsYzsKIAogCWlmIChjZmcgPT0gd2xjLT5jZmcpIHsKIAkJLyogZW50ZXIgdGhlIE1BQyBhZGRyIGludG8gdGhlIFJYRSBtYXRjaCByZWdpc3RlcnMgKi8KQEAgLTczMSw3ICs2OTIsNyBAQAogICovCiB2b2lkIHdsY19zZXRfYnNzaWQod2xjX2Jzc2NmZ190ICpjZmcpCiB7Ci0Jd2xjX2luZm9fdCAqd2xjID0gY2ZnLT53bGM7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSBjZmctPndsYzsKIAogCS8qIGlmIHByaW1hcnkgY29uZmlnLCB3ZSBuZWVkIHRvIHVwZGF0ZSBCU1NJRCBpbiBSWEUgbWF0Y2ggcmVnaXN0ZXJzICovCiAJaWYgKGNmZyA9PSB3bGMtPmNmZykgewpAQCAtNzQ4LDcgKzcwOSw3IEBACiAgKiBTdXNwZW5kIHRoZSB0aGUgTUFDIGFuZCB1cGRhdGUgdGhlIHNsb3QgdGltaW5nCiAgKiBmb3Igc3RhbmRhcmQgMTFiL2cgKDIwdXMgc2xvdHMpIG9yIHNob3J0c2xvdCAxMWcgKDl1cyBzbG90cykuCiAgKi8KLXZvaWQgd2xjX3N3aXRjaF9zaG9ydHNsb3Qod2xjX2luZm9fdCAqd2xjLCBib29sIHNob3J0c2xvdCkKK3ZvaWQgd2xjX3N3aXRjaF9zaG9ydHNsb3Qoc3RydWN0IHdsY19pbmZvICp3bGMsIGJvb2wgc2hvcnRzbG90KQogewogCWludCBpZHg7CiAJd2xjX2Jzc2NmZ190ICpjZmc7CkBAIC03NzYsNyArNzM3LDcgQEAKIAl3bGNfYm1hY19zZXRfc2hvcnRzbG90KHdsYy0+aHcsIHNob3J0c2xvdCk7CiB9CiAKLXN0YXRpYyB1OCB3bGNfbG9jYWxfY29uc3RyYWludF9xZGJtKHdsY19pbmZvX3QgKndsYykKK3N0YXRpYyB1OCB3bGNfbG9jYWxfY29uc3RyYWludF9xZGJtKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCXU4IGxvY2FsOwogCXMxNiBsb2NhbF9tYXg7CkBAIC04MDMsNyArNzY0LDcgQEAKIH0KIAogLyogcHJvcGFnYXRlIGhvbWUgY2hhbnNwZWMgdG8gYWxsIGJzc2NmZ3MgaW4gY2FzZSBic3NjZmctPmN1cnJlbnRfYnNzLT5jaGFuc3BlYyBpcyByZWZlcmVuY2VkICovCi12b2lkIHdsY19zZXRfaG9tZV9jaGFuc3BlYyh3bGNfaW5mb190ICp3bGMsIGNoYW5zcGVjX3QgY2hhbnNwZWMpCit2b2lkIHdsY19zZXRfaG9tZV9jaGFuc3BlYyhzdHJ1Y3Qgd2xjX2luZm8gKndsYywgY2hhbnNwZWNfdCBjaGFuc3BlYykKIHsKIAlpZiAod2xjLT5ob21lX2NoYW5zcGVjICE9IGNoYW5zcGVjKSB7CiAJCWludCBpZHg7CkBAIC04MjEsNyArNzgyLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHdsY19zZXRfcGh5X2NoYW5zcGVjKHdsY19pbmZvX3QgKndsYywgY2hhbnNwZWNfdCBjaGFuc3BlYykKK3N0YXRpYyB2b2lkIHdsY19zZXRfcGh5X2NoYW5zcGVjKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBjaGFuc3BlY190IGNoYW5zcGVjKQogewogCS8qIFNhdmUgb3VyIGNvcHkgb2YgdGhlIGNoYW5zcGVjICovCiAJd2xjLT5jaGFuc3BlYyA9IGNoYW5zcGVjOwpAQCAtODQwLDE1ICs4MDEsMTUgQEAKIAogfQogCi12b2lkIHdsY19zZXRfY2hhbnNwZWMod2xjX2luZm9fdCAqd2xjLCBjaGFuc3BlY190IGNoYW5zcGVjKQordm9pZCB3bGNfc2V0X2NoYW5zcGVjKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBjaGFuc3BlY190IGNoYW5zcGVjKQogewogCXVpbnQgYmFuZHVuaXQ7CiAJYm9vbCBzd2l0Y2hiYW5kID0gZmFsc2U7CiAJY2hhbnNwZWNfdCBvbGRfY2hhbnNwZWMgPSB3bGMtPmNoYW5zcGVjOwogCiAJaWYgKCF3bGNfdmFsaWRfY2hhbnNwZWNfZGIod2xjLT5jbWksIGNoYW5zcGVjKSkgewotCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBCYWQgY2hhbm5lbCAlZFxuIiwKLQkJCSAgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fLCBDSFNQRUNfQ0hBTk5FTChjaGFuc3BlYykpKTsKKwkJV0xfRVJST1IoIndsJWQ6ICVzOiBCYWQgY2hhbm5lbCAlZFxuIiwKKwkJCSB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18sIENIU1BFQ19DSEFOTkVMKGNoYW5zcGVjKSk7CiAJCUFTU0VSVCh3bGNfdmFsaWRfY2hhbnNwZWNfZGIod2xjLT5jbWksIGNoYW5zcGVjKSk7CiAJCXJldHVybjsKIAl9CkBAIC04NTksNyArODIwLDkgQEAKIAkJaWYgKHdsYy0+YmFuZC0+YmFuZHVuaXQgIT0gYmFuZHVuaXQgfHwgd2xjLT5iYW5kaW5pdF9wZW5kaW5nKSB7CiAJCQlzd2l0Y2hiYW5kID0gdHJ1ZTsKIAkJCWlmICh3bGMtPmJhbmRsb2NrZWQpIHsKLQkJCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBjaHNwZWMgJWQgYmFuZCBpcyBsb2NrZWQhXG4iLCB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18sIENIU1BFQ19DSEFOTkVMKGNoYW5zcGVjKSkpOworCQkJCVdMX0VSUk9SKCJ3bCVkOiAlczogY2hzcGVjICVkIGJhbmQgaXMgbG9ja2VkIVxuIiwKKwkJCQkJIHdsYy0+cHViLT51bml0LCBfX2Z1bmNfXywKKwkJCQkJIENIU1BFQ19DSEFOTkVMKGNoYW5zcGVjKSk7CiAJCQkJcmV0dXJuOwogCQkJfQogCQkJLyogQk1BQ19OT1RFOiBzaG91bGQgdGhlIHNldGJhbmQgY2FsbCBjb21lIGFmdGVyIHRoZSB3bGNfYm1hY19jaGFuc3BlYygpID8KQEAgLTg5NSw3ICs4NTgsNyBAQAogfQogCiAjaWYgZGVmaW5lZChCQ01EQkcpCi1zdGF0aWMgaW50IHdsY19nZXRfY3VycmVudF90eHB3cih3bGNfaW5mb190ICp3bGMsIHZvaWQgKnB3ciwgdWludCBsZW4pCitzdGF0aWMgaW50IHdsY19nZXRfY3VycmVudF90eHB3cihzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdm9pZCAqcHdyLCB1aW50IGxlbikKIHsKIAl0eHB3cl9saW1pdHNfdCB0eHB3cjsKIAl0eF9wb3dlcl90IHBvd2VyOwpAQCAtOTA5LDcgKzg3Miw3IEBACiAJZWxzZSBpZiAobGVuIDwgc2l6ZW9mKHR4X3Bvd2VyX3QpKQogCQlyZXR1cm4gQkNNRV9CVUZUT09TSE9SVDsKIAotCWJ6ZXJvKCZwb3dlciwgc2l6ZW9mKHR4X3Bvd2VyX3QpKTsKKwltZW1zZXQoJnBvd2VyLCAwLCBzaXplb2YodHhfcG93ZXJfdCkpOwogCiAJcG93ZXIuY2hhbnNwZWMgPSBXTENfQkFORF9QSV9SQURJT19DSEFOU1BFQzsKIAlpZiAod2xjLT5wdWItPmFzc29jaWF0ZWQpCkBAIC0xMDMxLDcgKzk5NCw3IEBACiAJfSBlbHNlIHsKIAkJaW50IGJhbmRfaWR4ID0gQ0hTUEVDX0lTMkcocG93ZXIuY2hhbnNwZWMpID8gMCA6IDE7CiAKLQkJYnplcm8ob2xkX3Bvd2VyLCBzaXplb2YodHhfcG93ZXJfbGVnYWN5X3QpKTsKKwkJbWVtc2V0KG9sZF9wb3dlciwgMCwgc2l6ZW9mKHR4X3Bvd2VyX2xlZ2FjeV90KSk7CiAKIAkJb2xkX3Bvd2VyLT50eHB3cl9sb2NhbF9tYXggPSBwb3dlci5sb2NhbF9tYXg7CiAJCW9sZF9wb3dlci0+dHhwd3JfbG9jYWxfY29uc3RyYWludCA9IHBvd2VyLmxvY2FsX2NvbnN0cmFpbnQ7CkBAIC0xMDY0LDcgKzEwMjcsNyBAQAogfQogI2VuZGlmCQkJCS8qIGRlZmluZWQoQkNNREJHKSAqLwogCi1zdGF0aWMgdTMyIHdsY193YXRjaGRvZ19iYWNrdXBfYmkod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIHUzMiB3bGNfd2F0Y2hkb2dfYmFja3VwX2JpKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCXUzMiBiaTsKIAliaSA9IDIgKiB3bGMtPmNmZy0+Y3VycmVudF9ic3MtPmR0aW1fcGVyaW9kICoKQEAgLTEwODMsNyArMTA0Niw3IEBACiAvKiBDaGFuZ2UgdG8gcnVuIHRoZSB3YXRjaGRvZyBlaXRoZXIgZnJvbSBhIHBlcmlvZGljIHRpbWVyIG9yIGZyb20gdGJ0dCBoYW5kbGVyLgogICogQ2FsbCB3YXRjaGRvZyBmcm9tIHRidHQgaGFuZGxlciBpZiB0YnR0IGlzIHRydWUsIHdhdGNoZG9nIHRpbWVyIG90aGVyd2lzZS4KICAqLwotdm9pZCB3bGNfd2F0Y2hkb2dfdXBkKHdsY19pbmZvX3QgKndsYywgYm9vbCB0YnR0KQordm9pZCB3bGNfd2F0Y2hkb2dfdXBkKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBib29sIHRidHQpCiB7CiAJLyogbWFrZSBzdXJlIGNoYW5naW5nIHdhdGNoZG9nIGRyaXZlciBpcyBhbGxvd2VkICovCiAJaWYgKCF3bGMtPnB1Yi0+dXAgfHwgIXdsYy0+cHViLT5hbGlnbl93ZF90YnR0KQpAQCAtMTExMiw3ICsxMDc1LDcgQEAKIAl9CiB9CiAKLXJhdGVzcGVjX3Qgd2xjX2xvd2VzdF9iYXNpY19yc3BlYyh3bGNfaW5mb190ICp3bGMsIHdsY19yYXRlc2V0X3QgKnJzKQorcmF0ZXNwZWNfdCB3bGNfbG93ZXN0X2Jhc2ljX3JzcGVjKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB3bGNfcmF0ZXNldF90ICpycykKIHsKIAlyYXRlc3BlY190IGxvd2VzdF9iYXNpY19yc3BlYzsKIAl1aW50IGk7CkBAIC0xMTQwLDcgKzExMDMsNyBAQAogICogIHJhdGVzcGVjICAgICBDQ0sJCWFudCA9IHdsYy0+c3RmLT50eGFudAogICogIAkJT0ZETQkJYW50ID0gMwogICovCi12b2lkIHdsY19iZWFjb25fcGh5dHhjdGxfdHhhbnRfdXBkKHdsY19pbmZvX3QgKndsYywgcmF0ZXNwZWNfdCBiY25fcnNwZWMpCit2b2lkIHdsY19iZWFjb25fcGh5dHhjdGxfdHhhbnRfdXBkKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCByYXRlc3BlY190IGJjbl9yc3BlYykKIHsKIAl1MTYgcGh5Y3RsOwogCXUxNiBwaHl0eGFudCA9IHdsYy0+c3RmLT5waHl0eGFudDsKQEAgLTExNTksOSArMTEyMiw5IEBACiAvKiBjZW50cmFsaXplZCBwcm90ZWN0aW9uIGNvbmZpZyBjaGFuZ2UgZnVuY3Rpb24gdG8gc2ltcGxpZnkgZGVidWdnaW5nLCBubyBjb25zaXN0ZW5jeSBjaGVja2luZwogICogdGhpcyBzaG91bGQgYmUgY2FsbGVkIG9ubHkgb24gY2hhbmdlcyB0byBhdm9pZCBvdmVyaGVhZCBpbiBwZXJpb2RpYyBmdW5jdGlvbgogKi8KLXZvaWQgd2xjX3Byb3RlY3Rpb25fdXBkKHdsY19pbmZvX3QgKndsYywgdWludCBpZHgsIGludCB2YWwpCit2b2lkIHdsY19wcm90ZWN0aW9uX3VwZChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdWludCBpZHgsIGludCB2YWwpCiB7Ci0JV0xfVFJBQ0UoKCJ3bGNfcHJvdGVjdGlvbl91cGQ6IGlkeCAlZCwgdmFsICVkXG4iLCBpZHgsIHZhbCkpOworCVdMX1RSQUNFKCJ3bGNfcHJvdGVjdGlvbl91cGQ6IGlkeCAlZCwgdmFsICVkXG4iLCBpZHgsIHZhbCk7CiAKIAlzd2l0Y2ggKGlkeCkgewogCWNhc2UgV0xDX1BST1RfR19TUEVDOgpAQCAtMTIwNSw3ICsxMTY4LDcgQEAKIAogfQogCi1zdGF0aWMgdm9pZCB3bGNfaHRfdXBkYXRlX3NnaV9yeCh3bGNfaW5mb190ICp3bGMsIGludCB2YWwpCitzdGF0aWMgdm9pZCB3bGNfaHRfdXBkYXRlX3NnaV9yeChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgaW50IHZhbCkKIHsKIAl3bGMtPmh0X2NhcC5jYXAgJj0gfihIVF9DQVBfU0hPUlRfR0lfMjAgfCBIVF9DQVBfU0hPUlRfR0lfNDApOwogCXdsYy0+aHRfY2FwLmNhcCB8PSAodmFsICYgV0xDX05fU0dJXzIwKSA/IEhUX0NBUF9TSE9SVF9HSV8yMCA6IDA7CkBAIC0xMjE3LDcgKzExODAsNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgd2xjX2h0X3VwZGF0ZV9sZHBjKHdsY19pbmZvX3QgKndsYywgczggdmFsKQorc3RhdGljIHZvaWQgd2xjX2h0X3VwZGF0ZV9sZHBjKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBzOCB2YWwpCiB7CiAJd2xjLT5zdGYtPmxkcGMgPSB2YWw7CiAKQEAgLTEyMzYsNyArMTE5OSw3IEBACiAgKiB1Y29kZSwgaHdtYWMgdXBkYXRlCiAgKiAgICBDaGFubmVsIGRlcGVuZGVudCB1cGRhdGVzIGZvciB1Y29kZSBhbmQgaHcKICAqLwotc3RhdGljIHZvaWQgd2xjX3Vjb2RlX21hY191cGQod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIHZvaWQgd2xjX3Vjb2RlX21hY191cGQoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJLyogZW5hYmxlIG9yIGRpc2FibGUgYW55IGFjdGl2ZSBJQlNTcyBkZXBlbmRpbmcgb24gd2hldGhlciBvciBub3QKIAkgKiB3ZSBhcmUgb24gdGhlIGhvbWUgY2hhbm5lbApAQCAtMTI2MywxMyArMTIyNiwxMyBAQAogCXdsY19tYWNfcHJvbWlzYyh3bGMpOwogfQogCi1zdGF0aWMgdm9pZCB3bGNfYmFuZGluaXRfb3JkZXJlZCh3bGNfaW5mb190ICp3bGMsIGNoYW5zcGVjX3QgY2hhbnNwZWMpCitzdGF0aWMgdm9pZCB3bGNfYmFuZGluaXRfb3JkZXJlZChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgY2hhbnNwZWNfdCBjaGFuc3BlYykKIHsKIAl3bGNfcmF0ZXNldF90IGRlZmF1bHRfcmF0ZXNldDsKIAl1aW50IHBhcmtiYW5kOwogCXVpbnQgaSwgYmFuZF9vcmRlclsyXTsKIAotCVdMX1RSQUNFKCgid2wlZDogd2xjX2JhbmRpbml0X29yZGVyZWRcbiIsIHdsYy0+cHViLT51bml0KSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY19iYW5kaW5pdF9vcmRlcmVkXG4iLCB3bGMtPnB1Yi0+dW5pdCk7CiAJLyoKIAkgKiBXZSBtaWdodCBoYXZlIGJlZW4gYmFuZGxvY2tlZCBkdXJpbmcgZG93biBhbmQgdGhlIGNoaXAgcG93ZXItY3ljbGVkIChoaWJlcm5hdGUpLgogCSAqIGZpZ3VyZSBvdXQgdGhlIHJpZ2h0IGJhbmQgdG8gcGFyayBvbgpAQCAtMTMxMCwxMCArMTI3MywxMCBAQAogfQogCiAvKiBiYW5kLXNwZWNpZmljIGluaXQgKi8KLXN0YXRpYyB2b2lkIFdMQkFORElOSVRGTih3bGNfYnNpbml0KSAod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIHZvaWQgV0xCQU5ESU5JVEZOKHdsY19ic2luaXQpIChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKLQlXTF9UUkFDRSgoIndsJWQ6IHdsY19ic2luaXQ6IGJhbmR1bml0ICVkXG4iLCB3bGMtPnB1Yi0+dW5pdCwKLQkJICB3bGMtPmJhbmQtPmJhbmR1bml0KSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY19ic2luaXQ6IGJhbmR1bml0ICVkXG4iLAorCQkgd2xjLT5wdWItPnVuaXQsIHdsYy0+YmFuZC0+YmFuZHVuaXQpOwogCiAJLyogd3JpdGUgdWNvZGUgQUNLL0NUUyByYXRlIHRhYmxlICovCiAJd2xjX3NldF9yYXRldGFibGUod2xjKTsKQEAgLTEzMjgsNyArMTI5MSw3IEBACiB9CiAKIC8qIHN3aXRjaCB0byBhbmQgaW5pdGlhbGl6ZSBuZXcgYmFuZCAqLwotc3RhdGljIHZvaWQgV0xCQU5ESU5JVEZOKHdsY19zZXRiYW5kKSAod2xjX2luZm9fdCAqd2xjLCB1aW50IGJhbmR1bml0KQorc3RhdGljIHZvaWQgV0xCQU5ESU5JVEZOKHdsY19zZXRiYW5kKSAoc3RydWN0IHdsY19pbmZvICp3bGMsIHVpbnQgYmFuZHVuaXQpCiB7CiAJaW50IGlkeDsKIAl3bGNfYnNzY2ZnX3QgKmNmZzsKQEAgLTEzNTMsNyArMTMxNiw3IEBACiB9CiAKIC8qIEluaXRpYWxpemUgYSBXTUUgUGFyYW1ldGVyIEluZm8gRWxlbWVudCB3aXRoIGRlZmF1bHQgU1RBIHBhcmFtZXRlcnMgZnJvbSBXTU0gU3BlYywgVGFibGUgMTIgKi8KLXZvaWQgd2xjX3dtZV9pbml0cGFyYW1zX3N0YSh3bGNfaW5mb190ICp3bGMsIHdtZV9wYXJhbV9pZV90ICpwZSkKK3ZvaWQgd2xjX3dtZV9pbml0cGFyYW1zX3N0YShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgd21lX3BhcmFtX2llX3QgKnBlKQogewogCXN0YXRpYyBjb25zdCB3bWVfcGFyYW1faWVfdCBzdGFkZWYgPSB7CiAJCVdNRV9PVUksCkBAIC0xMzc4LDcgKzEzNDEsNyBAQAogCW1lbWNweShwZSwgJnN0YWRlZiwgc2l6ZW9mKCpwZSkpOwogfQogCi12b2lkIHdsY193bWVfc2V0cGFyYW1zKHdsY19pbmZvX3QgKndsYywgdTE2IGFjaSwgdm9pZCAqYXJnLCBib29sIHN1c3BlbmQpCit2b2lkIHdsY193bWVfc2V0cGFyYW1zKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1MTYgYWNpLCB2b2lkICphcmcsIGJvb2wgc3VzcGVuZCkKIHsKIAlpbnQgaTsKIAlzaG1fYWNwYXJhbXNfdCBhY3Bfc2htOwpAQCAtMTM4OSw3ICsxMzUyLDcgQEAKIAogCS8qIE9ubHkgYXBwbHkgcGFyYW1zIGlmIHRoZSBjb3JlIGlzIG91dCBvZiByZXNldCBhbmQgaGFzIGNsb2NrcyAqLwogCWlmICghd2xjLT5jbGspIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiAlcyA6IG5vLWNsb2NrXG4iLCB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIndsJWQ6ICVzIDogbm8tY2xvY2tcbiIsIHdsYy0+cHViLT51bml0LCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTE0MDIsNyArMTM2NSw3IEBACiAJd2xjLT53bWVfYWRtY3RsID0gMDsKIAogCWRvIHsKLQkJYnplcm8oKGNoYXIgKikmYWNwX3NobSwgc2l6ZW9mKHNobV9hY3BhcmFtc190KSk7CisJCW1lbXNldCgoY2hhciAqKSZhY3Bfc2htLCAwLCBzaXplb2Yoc2htX2FjcGFyYW1zX3QpKTsKIAkJLyogZmluZCBvdXQgd2hpY2ggYWMgdGhpcyBzZXQgb2YgcGFyYW1zIGFwcGxpZXMgdG8gKi8KIAkJQVNTRVJUKGFjaSA8IEFDX0NPVU5UKTsKIAkJLyogc2V0IHRoZSBhZG1pc3Npb24gY29udHJvbCBwb2xpY3kgZm9yIHRoaXMgQUMgKi8KQEAgLTE0MjEsOCArMTM4NCw4IEBACiAKIAkJaWYgKGFjcF9zaG0uYWlmcyA8IEVEQ0ZfQUlGU05fTUlOCiAJCSAgICB8fCBhY3Bfc2htLmFpZnMgPiBFRENGX0FJRlNOX01BWCkgewotCQkJV0xfRVJST1IoKCJ3bCVkOiB3bGNfZWRjZl9zZXRwYXJhbXM6IGJhZCBhaWZzICVkXG4iLAotCQkJCSAgd2xjLT5wdWItPnVuaXQsIGFjcF9zaG0uYWlmcykpOworCQkJV0xfRVJST1IoIndsJWQ6IHdsY19lZGNmX3NldHBhcmFtczogYmFkIGFpZnMgJWRcbiIsCisJCQkJIHdsYy0+cHViLT51bml0LCBhY3Bfc2htLmFpZnMpOwogCQkJY29udGludWU7CiAJCX0KIApAQCAtMTQ1OSw3ICsxNDIyLDcgQEAKIAogdm9pZCB3bGNfZWRjZl9zZXRwYXJhbXMod2xjX2Jzc2NmZ190ICpjZmcsIGJvb2wgc3VzcGVuZCkKIHsKLQl3bGNfaW5mb190ICp3bGMgPSBjZmctPndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IGNmZy0+d2xjOwogCXVpbnQgYWNpLCBpLCBqOwogCWVkY2ZfYWNwYXJhbV90ICplZGNmX2FjcDsKIAlzaG1fYWNwYXJhbXNfdCBhY3Bfc2htOwpAQCAtMTQ4Myw3ICsxNDQ2LDcgQEAKIAl3bGMtPndtZV9hZG1jdGwgPSAwOwogCiAJZm9yIChpID0gMDsgaSA8IEFDX0NPVU5UOyBpKyssIGVkY2ZfYWNwKyspIHsKLQkJYnplcm8oKGNoYXIgKikmYWNwX3NobSwgc2l6ZW9mKHNobV9hY3BhcmFtc190KSk7CisJCW1lbXNldCgoY2hhciAqKSZhY3Bfc2htLCAwLCBzaXplb2Yoc2htX2FjcGFyYW1zX3QpKTsKIAkJLyogZmluZCBvdXQgd2hpY2ggYWMgdGhpcyBzZXQgb2YgcGFyYW1zIGFwcGxpZXMgdG8gKi8KIAkJYWNpID0gKGVkY2ZfYWNwLT5BQ0kgJiBFRENGX0FDSV9NQVNLKSA+PiBFRENGX0FDSV9TSElGVDsKIAkJQVNTRVJUKGFjaSA8IEFDX0NPVU5UKTsKQEAgLTE1MDUsOCArMTQ2OCw4IEBACiAKIAkJaWYgKGFjcF9zaG0uYWlmcyA8IEVEQ0ZfQUlGU05fTUlOCiAJCSAgICB8fCBhY3Bfc2htLmFpZnMgPiBFRENGX0FJRlNOX01BWCkgewotCQkJV0xfRVJST1IoKCJ3bCVkOiB3bGNfZWRjZl9zZXRwYXJhbXM6IGJhZCBhaWZzICVkXG4iLAotCQkJCSAgd2xjLT5wdWItPnVuaXQsIGFjcF9zaG0uYWlmcykpOworCQkJV0xfRVJST1IoIndsJWQ6IHdsY19lZGNmX3NldHBhcmFtczogYmFkIGFpZnMgJWRcbiIsCisJCQkJIHdsYy0+cHViLT51bml0LCBhY3Bfc2htLmFpZnMpOwogCQkJY29udGludWU7CiAJCX0KIApAQCAtMTU0OCwyMCArMTUxMSwxOSBAQAogCiB9CiAKLWJvb2wgd2xjX3RpbWVyc19pbml0KHdsY19pbmZvX3QgKndsYywgaW50IHVuaXQpCitib29sIHdsY190aW1lcnNfaW5pdChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgaW50IHVuaXQpCiB7CiAJd2xjLT53ZHRpbWVyID0gd2xfaW5pdF90aW1lcih3bGMtPndsLCB3bGNfd2F0Y2hkb2dfYnlfdGltZXIsCiAJCXdsYywgIndhdGNoZG9nIik7CiAJaWYgKCF3bGMtPndkdGltZXIpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiAgd2xfaW5pdF90aW1lciBmb3Igd2R0aW1lciBmYWlsZWRcbiIsIHVuaXQpKTsKKwkJV0xfRVJST1IoIndsJWQ6ICB3bF9pbml0X3RpbWVyIGZvciB3ZHRpbWVyIGZhaWxlZFxuIiwgdW5pdCk7CiAJCWdvdG8gZmFpbDsKIAl9CiAKIAl3bGMtPnJhZGlvX3RpbWVyID0gd2xfaW5pdF90aW1lcih3bGMtPndsLCB3bGNfcmFkaW9fdGltZXIsCiAJCXdsYywgInJhZGlvIik7CiAJaWYgKCF3bGMtPnJhZGlvX3RpbWVyKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogIHdsX2luaXRfdGltZXIgZm9yIHJhZGlvX3RpbWVyIGZhaWxlZFxuIiwKLQkJCSAgdW5pdCkpOworCQlXTF9FUlJPUigid2wlZDogIHdsX2luaXRfdGltZXIgZm9yIHJhZGlvX3RpbWVyIGZhaWxlZFxuIiwgdW5pdCk7CiAJCWdvdG8gZmFpbDsKIAl9CiAKQEAgLTE1NzUsNyArMTUzNyw3IEBACiAgKiBJbml0aWFsaXplIHdsY19pbmZvIGRlZmF1bHQgdmFsdWVzIC4uLgogICogbWF5IGdldCBvdmVycmlkZXMgbGF0ZXIgaW4gdGhpcyBmdW5jdGlvbgogICovCi12b2lkIHdsY19pbmZvX2luaXQod2xjX2luZm9fdCAqd2xjLCBpbnQgdW5pdCkKK3ZvaWQgd2xjX2luZm9faW5pdChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgaW50IHVuaXQpCiB7CiAJaW50IGk7CiAJLyogQXNzdW1lIHRoZSBkZXZpY2UgaXMgdGhlcmUgdW50aWwgcHJvdmVuIG90aGVyd2lzZSAqLwpAQCAtMTY4Niw3ICsxNjQ4LDcgQEAKIAl3bGMtPnByODA4Mzhfd2FyID0gdHJ1ZTsKIH0KIAotc3RhdGljIGJvb2wgd2xjX3N0YXRlX2JtYWNfc3luYyh3bGNfaW5mb190ICp3bGMpCitzdGF0aWMgYm9vbCB3bGNfc3RhdGVfYm1hY19zeW5jKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCXdsY19ibWFjX3N0YXRlX3Qgc3RhdGVfYm1hYzsKIApAQCAtMTcwMCw3ICsxNjYyLDcgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIHVpbnQgd2xjX2F0dGFjaF9tb2R1bGUod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIHVpbnQgd2xjX2F0dGFjaF9tb2R1bGUoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJdWludCBlcnIgPSAwOwogCXVpbnQgdW5pdDsKQEAgLTE3MDgsMTUgKzE2NzAsMTQgQEAKIAogCXdsYy0+YXNpID0gd2xjX2FudHNlbF9hdHRhY2god2xjLCB3bGMtPm9zaCwgd2xjLT5wdWIsIHdsYy0+aHcpOwogCWlmICh3bGMtPmFzaSA9PSBOVUxMKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogd2xjX2F0dGFjaDogd2xjX2FudHNlbF9hdHRhY2ggZmFpbGVkXG4iLAotCQkJICB1bml0KSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfYXR0YWNoOiB3bGNfYW50c2VsX2F0dGFjaCBmYWlsZWRcbiIsIHVuaXQpOwogCQllcnIgPSA0NDsKIAkJZ290byBmYWlsOwogCX0KIAogCXdsYy0+YW1wZHUgPSB3bGNfYW1wZHVfYXR0YWNoKHdsYyk7CiAJaWYgKHdsYy0+YW1wZHUgPT0gTlVMTCkgewotCQlXTF9FUlJPUigoIndsJWQ6IHdsY19hdHRhY2g6IHdsY19hbXBkdV9hdHRhY2ggZmFpbGVkXG4iLCB1bml0KSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfYXR0YWNoOiB3bGNfYW1wZHVfYXR0YWNoIGZhaWxlZFxuIiwgdW5pdCk7CiAJCWVyciA9IDUwOwogCQlnb3RvIGZhaWw7CiAJfQpAQCAtMTcyNSwxMyArMTY4NiwxMyBAQAogCXdsYy0+ZXZlbnRxID0KIAkgICAgd2xjX2V2ZW50cV9hdHRhY2god2xjLT5wdWIsIHdsYywgd2xjLT53bCwgd2xjX3Byb2Nlc3NfZXZlbnRxKTsKIAlpZiAod2xjLT5ldmVudHEgPT0gTlVMTCkgewotCQlXTF9FUlJPUigoIndsJWQ6IHdsY19hdHRhY2g6IHdsY19ldmVudHFfYXR0YWNoZmFpbGVkXG4iLCB1bml0KSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfYXR0YWNoOiB3bGNfZXZlbnRxX2F0dGFjaGZhaWxlZFxuIiwgdW5pdCk7CiAJCWVyciA9IDU3OwogCQlnb3RvIGZhaWw7CiAJfQogCiAJaWYgKCh3bGNfc3RmX2F0dGFjaCh3bGMpICE9IDApKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogd2xjX2F0dGFjaDogd2xjX3N0Zl9hdHRhY2ggZmFpbGVkXG4iLCB1bml0KSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfYXR0YWNoOiB3bGNfc3RmX2F0dGFjaCBmYWlsZWRcbiIsIHVuaXQpOwogCQllcnIgPSA2ODsKIAkJZ290byBmYWlsOwogCX0KQEAgLTE3MzksOSArMTcwMCw5IEBACiAJcmV0dXJuIGVycjsKIH0KIAotd2xjX3B1Yl90ICp3bGNfcHViKHZvaWQgKndsYykKK3N0cnVjdCB3bGNfcHViICp3bGNfcHViKHZvaWQgKndsYykKIHsKLQlyZXR1cm4gKCh3bGNfaW5mb190ICopIHdsYyktPnB1YjsKKwlyZXR1cm4gKChzdHJ1Y3Qgd2xjX2luZm8gKikgd2xjKS0+cHViOwogfQogCiAjZGVmaW5lIENISVBfU1VQUE9SVFNfMTFOKHdsYykgCTEKQEAgLTE3NTAsMjUgKzE3MTEsMjUgQEAKICAqIFRoZSBjb21tb24gZHJpdmVyIGVudHJ5IHJvdXRpbmUuIEVycm9yIGNvZGVzIHNob3VsZCBiZSB1bmlxdWUKICAqLwogdm9pZCAqd2xjX2F0dGFjaCh2b2lkICp3bCwgdTE2IHZlbmRvciwgdTE2IGRldmljZSwgdWludCB1bml0LCBib29sIHBpb21vZGUsCi0JCSBvc2xfdCAqb3NoLCB2b2lkICpyZWdzdmEsIHVpbnQgYnVzdHlwZSwgdm9pZCAqYnRwYXJhbSwKLQkJIHVpbnQgKnBlcnIpCisJCSBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqcmVnc3ZhLCB1aW50IGJ1c3R5cGUsCisJCSB2b2lkICpidHBhcmFtLCB1aW50ICpwZXJyKQogewotCXdsY19pbmZvX3QgKndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYzsKIAl1aW50IGVyciA9IDA7CiAJdWludCBqOwotCXdsY19wdWJfdCAqcHViOworCXN0cnVjdCB3bGNfcHViICpwdWI7CiAJd2xjX3R4cV9pbmZvX3QgKnFpOwogCXVpbnQgbl9kaXNhYmxlZDsKIAotCVdMX05PTkUoKCJ3bCVkOiAlczogdmVuZG9yIDB4JXggZGV2aWNlIDB4JXhcbiIsIHVuaXQsIF9fZnVuY19fLCB2ZW5kb3IsCi0JCSBkZXZpY2UpKTsKKwlXTF9OT05FKCJ3bCVkOiAlczogdmVuZG9yIDB4JXggZGV2aWNlIDB4JXhcbiIsCisJCXVuaXQsIF9fZnVuY19fLCB2ZW5kb3IsIGRldmljZSk7CiAKIAlBU1NFUlQoV1NFQ19NQVhfUkNNVEFfS0VZUyA8PSBXU0VDX01BWF9LRVlTKTsKIAlBU1NFUlQoV1NFQ19NQVhfREVGQVVMVF9LRVlTID09IFdMQ19ERUZBVUxUX0tFWVMpOwogCiAJLyogc29tZSBjb2RlIGRlcGVuZHMgb24gcGFja2VkIHN0cnVjdHVyZXMgKi8KLQlBU1NFUlQoc2l6ZW9mKHN0cnVjdCBldGhlcl9hZGRyKSA9PSBFVEhFUl9BRERSX0xFTik7Ci0JQVNTRVJUKHNpemVvZihzdHJ1Y3QgZXRoZXJfaGVhZGVyKSA9PSBFVEhFUl9IRFJfTEVOKTsKKwlBU1NFUlQoc2l6ZW9mKHN0cnVjdCBldGhlcl9hZGRyKSA9PSBFVEhfQUxFTik7CisJQVNTRVJUKHNpemVvZihzdHJ1Y3QgZXRoZXJfaGVhZGVyKSA9PSBFVEhfSExFTik7CiAJQVNTRVJUKHNpemVvZihkMTFyZWdzX3QpID09IFNJX0NPUkVfU0laRSk7CiAJQVNTRVJUKHNpemVvZihvZmRtX3BoeV9oZHJfdCkgPT0gRDExX1BIWV9IRFJfTEVOKTsKIAlBU1NFUlQoc2l6ZW9mKGNja19waHlfaGRyX3QpID09IEQxMV9QSFlfSERSX0xFTik7CkBAIC0xNzgwLDggKzE3NDEsMTAgQEAKIAlBU1NFUlQoc2l6ZW9mKHN0cnVjdCBkb3QxMV9iY25fcHJiKSA9PSBET1QxMV9CQ05fUFJCX0xFTik7CiAJQVNTRVJUKHNpemVvZih0eF9zdGF0dXNfdCkgPT0gVFhTVEFUVVNfTEVOKTsKIAlBU1NFUlQoc2l6ZW9mKGh0X2NhcF9pZV90KSA9PSBIVF9DQVBfSUVfTEVOKTsKKyNpZmRlZiBCUkNNX0ZVTExNQUMKIAlBU1NFUlQob2Zmc2V0b2Yod2xfc2Nhbl9wYXJhbXNfdCwgY2hhbm5lbF9saXN0KSA9PQogCSAgICAgICBXTF9TQ0FOX1BBUkFNU19GSVhFRF9TSVpFKTsKKyNlbmRpZgogCUFTU0VSVChJU19BTElHTkVEKG9mZnNldG9mKHdzZWNfa2V5X3QsIGRhdGEpLCBzaXplb2YodTMyKSkpOwogCUFTU0VSVChJU1BPV0VST0YyKE1BX1dJTkRPV19TWikpOwogCkBAIC0xNzk3LDggKzE3NjAsOCBAQAogCSAgICAgICB8fCAoV1BBX0NBUF80X1JFUExBWV9DTlRSUyA9PSBXTENfUkVQTEFZX0NOVFJTX1ZBTFVFCiAJCSAgICYmIDQgPT0gV0xDX05VTVJYSVZTKSk7CiAKLQkvKiBhbGxvY2F0ZSB3bGNfaW5mb190IHN0YXRlIGFuZCBpdHMgc3Vic3RydWN0dXJlcyAqLwotCXdsYyA9ICh3bGNfaW5mb190ICopIHdsY19hdHRhY2hfbWFsbG9jKG9zaCwgdW5pdCwgJmVyciwgZGV2aWNlKTsKKwkvKiBhbGxvY2F0ZSBzdHJ1Y3Qgd2xjX2luZm8gc3RhdGUgYW5kIGl0cyBzdWJzdHJ1Y3R1cmVzICovCisJd2xjID0gKHN0cnVjdCB3bGNfaW5mbyAqKSB3bGNfYXR0YWNoX21hbGxvYyhvc2gsIHVuaXQsICZlcnIsIGRldmljZSk7CiAJaWYgKHdsYyA9PSBOVUxMKQogCQlnb3RvIGZhaWw7CiAJd2xjLT5vc2ggPSBvc2g7CkBAIC0xODE5LDcgKzE3ODIsNyBAQAogCS8qIEJ5IGRlZmF1bHQgcmVzdHJpY3QgVEtJUCBhc3NvY2lhdGlvbnMgZnJvbSAxMW4gU1RBJ3MgKi8KIAl3bGMtPmh0X3dzZWNfcmVzdHJpY3Rpb24gPSBXTENfSFRfVEtJUF9SRVNUUklDVDsKIAotCS8qIHBvcHVsYXRlIHdsY19pbmZvX3Qgd2l0aCBkZWZhdWx0IHZhbHVlcyAgKi8KKwkvKiBwb3B1bGF0ZSBzdHJ1Y3Qgd2xjX2luZm8gd2l0aCBkZWZhdWx0IHZhbHVlcyAgKi8KIAl3bGNfaW5mb19pbml0KHdsYywgdW5pdCk7CiAKIAkvKiB1cGRhdGUgc3RhL2FwIHJlbGF0ZWQgcGFyYW1ldGVycyAqLwpAQCAtMTg1MSwxMCArMTgxNCw2IEBACiAJLyogcHJvcGFnYXRlICp2YXJzKiBmcm9tIEJNQUMgZHJpdmVyIHRvIGhpZ2ggZHJpdmVyICovCiAJd2xjX2JtYWNfY29weWZyb21fdmFycyh3bGMtPmh3LCAmcHViLT52YXJzLCAmd2xjLT52YXJzX3NpemUpOwogCi0jaWZkZWYgV0xDX0hJR0hfT05MWQotCVdMX1RSQUNFKCgibnZyYW0gOiB2YXJzICVwICwgdmFyc19zaXplICVkXG4iLCBwdWItPnZhcnMsCi0JCSAgd2xjLT52YXJzX3NpemUpKTsKLSNlbmRpZgogCiAJLyogc2V0IG1heGltdW0gYWxsb3dlZCBkdXR5IGN5Y2xlICovCiAJd2xjLT50eF9kdXR5X2N5Y2xlX29mZG0gPQpAQCAtMTg3MiwxOSArMTgzMSwxNyBAQAogCXdsY19waHlfc3RmX2NoYWluX2luaXQod2xjLT5iYW5kLT5waSwgd2xjLT5zdGYtPmh3X3R4Y2hhaW4sCiAJCQkgICAgICAgd2xjLT5zdGYtPmh3X3J4Y2hhaW4pOwogCi0jaWZkZWYgV0xDX0xPVwogCS8qIHB1bGwgdXAgc29tZSBpbmZvIHJlc3VsdGluZyBmcm9tIHRoZSBsb3cgYXR0YWNoICovCiAJewogCQlpbnQgaTsKIAkJZm9yIChpID0gMDsgaSA8IE5GSUZPOyBpKyspCiAJCQl3bGMtPmNvcmUtPnR4YXZhaWxbaV0gPSB3bGMtPmh3LT50eGF2YWlsW2ldOwogCX0KLSNlbmRpZgkJCQkvKiBXTENfTE9XICovCiAKIAl3bGNfYm1hY19od19ldGhlcmFkZHIod2xjLT5odywgJndsYy0+cGVybV9ldGhlcmFkZHIpOwogCiAJYmNvcHkoKGNoYXIgKikmd2xjLT5wZXJtX2V0aGVyYWRkciwgKGNoYXIgKikmcHViLT5jdXJfZXRoZXJhZGRyLAotCSAgICAgIEVUSEVSX0FERFJfTEVOKTsKKwkgICAgICBFVEhfQUxFTik7CiAKIAlmb3IgKGogPSAwOyBqIDwgTkJBTkRTKHdsYyk7IGorKykgewogCQkvKiBVc2UgYmFuZCAxIGZvciBzaW5nbGUgYmFuZCAxMWEgKi8KQEAgLTE5NDIsNyArMTg5OSw3IEBACiAJCWdvdG8gZmFpbDsKIAogCWlmICghd2xjX3RpbWVyc19pbml0KHdsYywgdW5pdCkpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiAlczogd2xjX2luaXRfdGltZXIgZmFpbGVkXG4iLCB1bml0LCBfX2Z1bmNfXykpOworCQlXTF9FUlJPUigid2wlZDogJXM6IHdsY19pbml0X3RpbWVyIGZhaWxlZFxuIiwgdW5pdCwgX19mdW5jX18pOwogCQllcnIgPSAzMjsKIAkJZ290byBmYWlsOwogCX0KQEAgLTE5NTAsOCArMTkwNyw4IEBACiAJLyogZGVwZW5kIG9uIHJhdGVzZXQsIGdtb2RlICovCiAJd2xjLT5jbWkgPSB3bGNfY2hhbm5lbF9tZ3JfYXR0YWNoKHdsYyk7CiAJaWYgKCF3bGMtPmNtaSkgewotCQlXTF9FUlJPUigoIndsJWQ6ICVzOiB3bGNfY2hhbm5lbF9tZ3JfYXR0YWNoIGZhaWxlZFxuIiwgdW5pdCwKLQkJCSAgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIndsJWQ6ICVzOiB3bGNfY2hhbm5lbF9tZ3JfYXR0YWNoIGZhaWxlZFxuIiwKKwkJCSB1bml0LCBfX2Z1bmNfXyk7CiAJCWVyciA9IDMzOwogCQlnb3RvIGZhaWw7CiAJfQpAQCAtMTk2Niw4ICsxOTIzLDggQEAKIAkvKiBhbGxvY2F0ZSBvdXIgaW5pdGlhbCBxdWV1ZSAqLwogCXFpID0gd2xjX3R4cV9hbGxvYyh3bGMsIG9zaCk7CiAJaWYgKHFpID09IE5VTEwpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiAlczogZmFpbGVkIHRvIG1hbGxvYyB0eCBxdWV1ZVxuIiwgdW5pdCwKLQkJCSAgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIndsJWQ6ICVzOiBmYWlsZWQgdG8gbWFsbG9jIHR4IHF1ZXVlXG4iLAorCQkJIHVuaXQsIF9fZnVuY19fKTsKIAkJZXJyID0gMTAwOwogCQlnb3RvIGZhaWw7CiAJfQpAQCAtMjAzNyw3ICsxOTk0LDcgQEAKIAl3bGNfcmFkaW9fbXBjX3VwZCh3bGMpOwogCiAJaWYgKFdMQU5UU0VMX0VOQUIod2xjKSkgewotCQlpZiAoKENISVBJRCh3bGMtPnB1Yi0+c2loLT5jaGlwKSkgPT0gQkNNNDMyMzVfQ0hJUF9JRCkgeworCQlpZiAoKHdsYy0+cHViLT5zaWgtPmNoaXApID09IEJDTTQzMjM1X0NISVBfSUQpIHsKIAkJCWlmICgoZ2V0aW50dmFyKHdsYy0+cHViLT52YXJzLCAiYWEyZyIpID09IDcpIHx8CiAJCQkgICAgKGdldGludHZhcih3bGMtPnB1Yi0+dmFycywgImFhNWciKSA9PSA3KSkgewogCQkJCXdsY19ibWFjX2FudHNlbF9zZXQod2xjLT5odywgMSk7CkBAIC0yMDUzLDcgKzIwMTAsNyBAQAogCXJldHVybiAodm9pZCAqKXdsYzsKIAogIGZhaWw6Ci0JV0xfRVJST1IoKCJ3bCVkOiAlczogZmFpbGVkIHdpdGggZXJyICVkXG4iLCB1bml0LCBfX2Z1bmNfXywgZXJyKSk7CisJV0xfRVJST1IoIndsJWQ6ICVzOiBmYWlsZWQgd2l0aCBlcnIgJWRcbiIsIHVuaXQsIF9fZnVuY19fLCBlcnIpOwogCWlmICh3bGMpCiAJCXdsY19kZXRhY2god2xjKTsKIApAQCAtMjA2Miw3ICsyMDE5LDcgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQgd2xjX2F0dGFjaF9hbnRnYWluX2luaXQod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIHZvaWQgd2xjX2F0dGFjaF9hbnRnYWluX2luaXQoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJdWludCB1bml0OwogCXVuaXQgPSB3bGMtPnB1Yi0+dW5pdDsKQEAgLTIwNzEsNyArMjAyOCw4IEBACiAJCS8qIGRlZmF1bHQgYW50ZW5uYSBnYWluIGZvciBzcm9tIHJldiAxIGlzIDIgZEJtICg4IHFkYm0pICovCiAJCXdsYy0+YmFuZC0+YW50Z2FpbiA9IDg7CiAJfSBlbHNlIGlmICh3bGMtPmJhbmQtPmFudGdhaW4gPT0gLTEpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiAlczogSW52YWxpZCBhbnRlbm5hcyBhdmFpbGFibGUgaW4gc3JvbSwgdXNpbmcgMmRCXG4iLCB1bml0LCBfX2Z1bmNfXykpOworCQlXTF9FUlJPUigid2wlZDogJXM6IEludmFsaWQgYW50ZW5uYXMgYXZhaWxhYmxlIGluIHNyb20sIHVzaW5nIDJkQlxuIiwKKwkJCSB1bml0LCBfX2Z1bmNfXyk7CiAJCXdsYy0+YmFuZC0+YW50Z2FpbiA9IDg7CiAJfSBlbHNlIHsKIAkJczggZ2FpbiwgZnJhY3Q7CkBAIC0yMDkzLDcgKzIwNTEsNyBAQAogCX0KIH0KIAotc3RhdGljIGJvb2wgd2xjX2F0dGFjaF9zdGZfYW50X2luaXQod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIGJvb2wgd2xjX2F0dGFjaF9zdGZfYW50X2luaXQoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJaW50IGFhOwogCXVpbnQgdW5pdDsKQEAgLTIxMTAsNyArMjA2OCw4IEBACiAJCWFhID0gKHM4KSBnZXRpbnR2YXIodmFycywKIAkJCQkgICAgICAoQkFORF81RyhiYW5kdHlwZSkgPyAiYWExIiA6ICJhYTAiKSk7CiAJaWYgKChhYSA8IDEpIHx8IChhYSA+IDE1KSkgewotCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBJbnZhbGlkIGFudGVubmFzIGF2YWlsYWJsZSBpbiBzcm9tICgweCV4KSwgdXNpbmcgMy5cbiIsIHVuaXQsIF9fZnVuY19fLCBhYSkpOworCQlXTF9FUlJPUigid2wlZDogJXM6IEludmFsaWQgYW50ZW5uYXMgYXZhaWxhYmxlIGluIHNyb20gKDB4JXgpLCB1c2luZyAzXG4iLAorCQkJIHVuaXQsIF9fZnVuY19fLCBhYSk7CiAJCWFhID0gMzsKIAl9CiAKQEAgLTIxMzIsMTM2ICsyMDkxLDggQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotI2lmZGVmIFdMQ19ISUdIX09OTFkKLS8qIEhJR0hfT05MWSBibWFjX2F0dGFjaCwgd2hpY2ggc3luYyBvdmVyIExPV19PTkxZIGJtYWNfYXR0YWNoIHN0YXRlcyAqLwotaW50IHdsY19ibWFjX2F0dGFjaCh3bGNfaW5mb190ICp3bGMsIHUxNiB2ZW5kb3IsIHUxNiBkZXZpY2UsIHVpbnQgdW5pdCwKLQkJICAgIGJvb2wgcGlvbW9kZSwgb3NsX3QgKm9zaCwgdm9pZCAqcmVnc3ZhLCB1aW50IGJ1c3R5cGUsCi0JCSAgICB2b2lkICpidHBhcmFtKQotewotCXdsY19ibWFjX3JldmluZm9fdCByZXZpbmZvOwotCXVpbnQgaWR4ID0gMDsKLQlycGNfaW5mb190ICpycGMgPSAocnBjX2luZm9fdCAqKSBidHBhcmFtOwogCi0JQVNTRVJUKGJ1c3R5cGUgPT0gUlBDX0JVUyk7Ci0KLQkvKiBpbnN0YWxsIHRoZSBycGMgaGFuZGxlIGluIHRoZSB2YXJpb3VzIHN0YXRlIHN0cnVjdHVyZXMgdXNlZCBieSBzdHViIFJQQyBmdW5jdGlvbnMgKi8KLQl3bGMtPnJwYyA9IHJwYzsKLQl3bGMtPmh3LT5ycGMgPSBycGM7Ci0Jd2xjLT5ody0+b3NoID0gb3NoOwotCi0Jd2xjLT5yZWdzID0gMDsKLQotCXdsYy0+cnBjdHggPSB3bGNfcnBjdHhfYXR0YWNoKHdsYy0+cHViLCB3bGMpOwotCWlmICh3bGMtPnJwY3R4ID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQotCS8qCi0JICogRklGTyAwCi0JICogVFg6IFRYX0FDX0JLX0ZJRk8gKFRYIEFDIEJhY2tncm91bmQgZGF0YSBwYWNrZXRzKQotCSAqLwotCS8qIEFsd2F5cyBpbml0aWFsaXplZCAqLwotCUFTU0VSVChOUlBDVFhCVUZQT1NUIDw9IE5UWEQpOwotCXdsY19ycGN0eF9maWZvaW5pdCh3bGMtPnJwY3R4LCBUWF9EQVRBX0ZJRk8sIE5SUENUWEJVRlBPU1QpOwotCXdsY19ycGN0eF9maWZvaW5pdCh3bGMtPnJwY3R4LCBUWF9DVExfRklGTywgTlJQQ1RYQlVGUE9TVCk7Ci0Jd2xjX3JwY3R4X2ZpZm9pbml0KHdsYy0+cnBjdHgsIFRYX0JDTUNfRklGTywgTlJQQ1RYQlVGUE9TVCk7Ci0KLQkvKiBWSSBhbmQgQksgaW5pdGVkIG9ubHkgaWYgV01FICovCi0JaWYgKFdNRV9FTkFCKHdsYy0+cHViKSkgewotCQl3bGNfcnBjdHhfZmlmb2luaXQod2xjLT5ycGN0eCwgVFhfQUNfQktfRklGTywgTlJQQ1RYQlVGUE9TVCk7Ci0JCXdsY19ycGN0eF9maWZvaW5pdCh3bGMtPnJwY3R4LCBUWF9BQ19WSV9GSUZPLCBOUlBDVFhCVUZQT1NUKTsKLQl9Ci0KLQkvKiBBbGxvY2F0ZSBTQiBoYW5kbGUgKi8KLQl3bGMtPnB1Yi0+c2loID0gb3NsX21hbGxvYyh3bGMtPm9zaCwgc2l6ZW9mKHNpX3QpKTsKLQlpZiAoIXdsYy0+cHViLT5zaWgpCi0JCXJldHVybiAtMTsKLQliemVybyh3bGMtPnB1Yi0+c2loLCBzaXplb2Yoc2lfdCkpOwotCi0JLyogc3luYyB1cCByZXZpbmZvIHdpdGggQk1BQyAqLwotCWJ6ZXJvKCZyZXZpbmZvLCBzaXplb2Yod2xjX2JtYWNfcmV2aW5mb190KSk7Ci0JaWYgKHdsY19ibWFjX3JldmluZm9fZ2V0KHdsYy0+aHcsICZyZXZpbmZvKSAhPSAwKQotCQlyZXR1cm4gLTE7Ci0Jd2xjLT52ZW5kb3JpZCA9ICh1MTYpIHJldmluZm8udmVuZG9yaWQ7Ci0Jd2xjLT5kZXZpY2VpZCA9ICh1MTYpIHJldmluZm8uZGV2aWNlaWQ7Ci0KLQl3bGMtPnB1Yi0+Ym9hcmRyZXYgPSAodTE2KSByZXZpbmZvLmJvYXJkcmV2OwotCXdsYy0+cHViLT5jb3JlcmV2ID0gcmV2aW5mby5jb3JlcmV2OwotCXdsYy0+cHViLT5zcm9tcmV2ID0gKHU4KSByZXZpbmZvLnNyb21yZXY7Ci0Jd2xjLT5wdWItPnNpaC0+Y2hpcHJldiA9IHJldmluZm8uY2hpcHJldjsKLQl3bGMtPnB1Yi0+c2loLT5jaGlwID0gcmV2aW5mby5jaGlwOwotCXdsYy0+cHViLT5zaWgtPmNoaXBwa2cgPSByZXZpbmZvLmNoaXBwa2c7Ci0Jd2xjLT5wdWItPnNpaC0+Ym9hcmR0eXBlID0gcmV2aW5mby5ib2FyZHR5cGU7Ci0Jd2xjLT5wdWItPnNpaC0+Ym9hcmR2ZW5kb3IgPSByZXZpbmZvLmJvYXJkdmVuZG9yOwotCXdsYy0+cHViLT5zaWgtPmJ1c3R5cGUgPSByZXZpbmZvLmJ1c3R5cGU7Ci0Jd2xjLT5wdWItPnNpaC0+YnVzY29yZXR5cGUgPSByZXZpbmZvLmJ1c2NvcmV0eXBlOwotCXdsYy0+cHViLT5zaWgtPmJ1c2NvcmVyZXYgPSByZXZpbmZvLmJ1c2NvcmVyZXY7Ci0Jd2xjLT5wdWItPnNpaC0+aXNzaW0gPSAoYm9vbCkgcmV2aW5mby5pc3NpbTsKLQl3bGMtPnB1Yi0+c2loLT5ycGMgPSBycGM7Ci0KLQlpZiAocmV2aW5mby5uYmFuZHMgPT0gMCB8fCByZXZpbmZvLm5iYW5kcyA+IDIpCi0JCXJldHVybiAtMTsKLQl3bGMtPnB1Yi0+X25iYW5kcyA9IHJldmluZm8ubmJhbmRzOwotCi0JZm9yIChpZHggPSAwOyBpZHggPCB3bGMtPnB1Yi0+X25iYW5kczsgaWR4KyspIHsKLQkJdWludCBiYW5kdW5pdCwgYmFuZHR5cGU7CS8qIFRvIGFjY2VzcyBiYW5kc3RhdGUgKi8KLQkJd2xjX3BoeV90ICpwaSA9IG9zbF9tYWxsb2Mod2xjLT5vc2gsIHNpemVvZih3bGNfcGh5X3QpKTsKLQotCQlpZiAoIXBpKQotCQkJcmV0dXJuIC0xOwotCQliemVybyhwaSwgc2l6ZW9mKHdsY19waHlfdCkpOwotCQlwaS0+cnBjID0gcnBjOwotCi0JCWJhbmR1bml0ID0gcmV2aW5mby5iYW5kW2lkeF0uYmFuZHVuaXQ7Ci0JCWJhbmR0eXBlID0gcmV2aW5mby5iYW5kW2lkeF0uYmFuZHR5cGU7Ci0JCXdsYy0+YmFuZHN0YXRlW2JhbmR1bml0XS0+cmFkaW9yZXYgPQotCQkgICAgKHU4KSByZXZpbmZvLmJhbmRbaWR4XS5yYWRpb3JldjsKLQkJd2xjLT5iYW5kc3RhdGVbYmFuZHVuaXRdLT5waHl0eXBlID0KLQkJICAgICh1MTYpIHJldmluZm8uYmFuZFtpZHhdLnBoeXR5cGU7Ci0JCXdsYy0+YmFuZHN0YXRlW2JhbmR1bml0XS0+cGh5cmV2ID0KLQkJICAgICh1MTYpIHJldmluZm8uYmFuZFtpZHhdLnBoeXJldjsKLQkJd2xjLT5iYW5kc3RhdGVbYmFuZHVuaXRdLT5yYWRpb2lkID0KLQkJICAgICh1MTYpIHJldmluZm8uYmFuZFtpZHhdLnJhZGlvaWQ7Ci0JCXdsYy0+YmFuZHN0YXRlW2JhbmR1bml0XS0+YWJncGh5X2VuY29yZSA9Ci0JCSAgICByZXZpbmZvLmJhbmRbaWR4XS5hYmdwaHlfZW5jb3JlOwotCi0JCXdsYy0+YmFuZHN0YXRlW2JhbmR1bml0XS0+cGkgPSBwaTsKLQkJd2xjLT5iYW5kc3RhdGVbYmFuZHVuaXRdLT5iYW5kdW5pdCA9IGJhbmR1bml0OwotCQl3bGMtPmJhbmRzdGF0ZVtiYW5kdW5pdF0tPmJhbmR0eXBlID0gYmFuZHR5cGU7Ci0JfQotCi0JLyogbWlzYyBzdHVmZiAqLwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIEZyZWUgdGhlIGNvbnZlbmllbmNlIGhhbmRsZXMgKi8KLWludCB3bGNfYm1hY19kZXRhY2god2xjX2luZm9fdCAqd2xjKQotewotCXVpbnQgaWR4OwotCi0JaWYgKHdsYy0+cHViLT5zaWgpIHsKLQkJb3NsX21mcmVlKHdsYy0+b3NoLCAodm9pZCAqKXdsYy0+cHViLT5zaWgsIHNpemVvZihzaV90KSk7Ci0JCXdsYy0+cHViLT5zaWggPSBOVUxMOwotCX0KLQotCWZvciAoaWR4ID0gMDsgaWR4IDwgTUFYQkFORFM7IGlkeCsrKQotCQlpZiAod2xjLT5iYW5kc3RhdGVbaWR4XS0+cGkpIHsKLQkJCWtmcmVlKHdsYy0+YmFuZHN0YXRlW2lkeF0tPnBpKTsKLQkJCXdsYy0+YmFuZHN0YXRlW2lkeF0tPnBpID0gTlVMTDsKLQkJfQotCi0JaWYgKHdsYy0+cnBjdHgpIHsKLQkJd2xjX3JwY3R4X2RldGFjaCh3bGMtPnJwY3R4KTsKLQkJd2xjLT5ycGN0eCA9IE5VTEw7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLX0KLQotI2VuZGlmCQkJCS8qIFdMQ19ISUdIX09OTFkgKi8KLQotc3RhdGljIHZvaWQgd2xjX3RpbWVyc19kZWluaXQod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIHZvaWQgd2xjX3RpbWVyc19kZWluaXQoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJLyogZnJlZSB0aW1lciBzdGF0ZSAqLwogCWlmICh3bGMtPndkdGltZXIpIHsKQEAgLTIyNzQsNyArMjEwNSw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCB3bGNfZGV0YWNoX21vZHVsZSh3bGNfaW5mb190ICp3bGMpCitzdGF0aWMgdm9pZCB3bGNfZGV0YWNoX21vZHVsZShzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAlpZiAod2xjLT5hc2kpIHsKIAkJd2xjX2FudHNlbF9kZXRhY2god2xjLT5hc2kpOwpAQCAtMjI5Nyw3ICsyMTI4LDcgQEAKICAqICAgIE9uZSBleGNlcHRpb24gaXMgc2IgcmVnaXN0ZXIgYWNjZXNzLCB3aGljaCBpcyBwb3NzaWJsZSBpZiBjcnlzdGFsIGlzIHR1cm5lZCBvbgogICogQWZ0ZXIgImRvd24iIHN0YXRlLCBkcml2ZXIgc2hvdWxkIGF2b2lkIHNvZnR3YXJlIHRpbWVyIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiByYWRpb19tb25pdG9yLgogICovCi11aW50IHdsY19kZXRhY2god2xjX2luZm9fdCAqd2xjKQordWludCB3bGNfZGV0YWNoKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCXVpbnQgaTsKIAl1aW50IGNhbGxiYWNrcyA9IDA7CkBAIC0yMzA1LDcgKzIxMzYsNyBAQAogCWlmICh3bGMgPT0gTlVMTCkKIAkJcmV0dXJuIDA7CiAKLQlXTF9UUkFDRSgoIndsJWQ6ICVzXG4iLCB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18pKTsKKwlXTF9UUkFDRSgid2wlZDogJXNcbiIsIHdsYy0+cHViLT51bml0LCBfX2Z1bmNfXyk7CiAKIAlBU1NFUlQoIXdsYy0+cHViLT51cCk7CiAKQEAgLTIzMjgsMTUgKzIxNTksNiBAQAogCiAJLyogZnJlZSBvdGhlciBzdGF0ZSAqLwogCi0jaWZkZWYgV0xDX0hJR0hfT05MWQotCS8qIEhpZ2gtT25seSBkcml2ZXIgaGFzIGFuIGFsbG9jYXRlZCBjb3B5IG9mIHZhcnMsIG1vbm9saXRoaWMganVzdAotCSAqIHJlZmVyZW5jZXMgdGhlIHdsYy0+aHctPnZhcnMgd2hpY2ggaXMgZnJlZWQgaW4gd2xjX2JtYWNfZGV0YWNoKCkKLQkgKi8KLQlpZiAod2xjLT5wdWItPnZhcnMpIHsKLQkJa2ZyZWUod2xjLT5wdWItPnZhcnMpOwotCQl3bGMtPnB1Yi0+dmFycyA9IE5VTEw7Ci0JfQotI2VuZGlmCiAKICNpZmRlZiBCQ01EQkcKIAlpZiAod2xjLT5jb3VudHJ5X2llX292ZXJyaWRlKSB7CkBAIC0yMzYwLDEzICsyMTgyLDYgQEAKIAkvKiBEZXRhY2ggZnJvbSBpb3ZhciBtYW5hZ2VyICovCiAJd2xjX21vZHVsZV91bnJlZ2lzdGVyKHdsYy0+cHViLCAid2xjX2lvdmFycyIsIHdsYyk7CiAKLQkvKgotCSAgIGlmICh3bGMtPmFwKSB7Ci0JICAgd2xjX2FwX2RldGFjaCh3bGMtPmFwKTsKLQkgICB3bGMtPmFwID0gTlVMTDsKLQkgICB9Ci0JICovCi0KIAl3aGlsZSAod2xjLT50eF9xdWV1ZXMgIT0gTlVMTCkgewogCQl3bGNfdHhxX2ZyZWUod2xjLCB3bGMtPm9zaCwgd2xjLT50eF9xdWV1ZXMpOwogCX0KQEAgLTIzODMsNyArMjE5OCw3IEBACiB9CiAKIC8qIHVwZGF0ZSBzdGF0ZSB0aGF0IGRlcGVuZHMgb24gdGhlIGN1cnJlbnQgdmFsdWUgb2YgImFwIiAqLwotdm9pZCB3bGNfYXBfdXBkKHdsY19pbmZvX3QgKndsYykKK3ZvaWQgd2xjX2FwX3VwZChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAlpZiAoQVBfRU5BQih3bGMtPnB1YikpCiAJCXdsYy0+UExDUEhkcl9vdmVycmlkZSA9IFdMQ19QTENQX0FVVE87CS8qIEFQOiBzaG9ydCBub3QgYWxsb3dlZCwgYnV0IG5vdCBlbmZvcmNlZCAqLwpAQCAtMjM5OCw3ICsyMjEzLDcgQEAKIH0KIAogLyogcmVhZCBod2Rpc2FibGUgc3RhdGUgYW5kIHByb3BhZ2F0ZSB0byB3bGMgZmxhZyAqLwotc3RhdGljIHZvaWQgd2xjX3JhZGlvX2h3ZGlzYWJsZV91cGQod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIHZvaWQgd2xjX3JhZGlvX2h3ZGlzYWJsZV91cGQoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJaWYgKHdsYy0+cHViLT53bGZlYXR1cmVmbGFnICYgV0xfU1dGTF9OT0hXUkFESU8gfHwgd2xjLT5wdWItPmh3X29mZikKIAkJcmV0dXJuOwpAQCAtMjQxMSwxNyArMjIyNiwxNyBAQAogfQogCiAvKiByZXR1cm4gdHJ1ZSBpZiBNaW5pbXVtIFBvd2VyIENvbnN1bXB0aW9uIHNob3VsZCBiZSBlbnRlcmVkLCBmYWxzZSBvdGhlcndpc2UgKi8KLWJvb2wgd2xjX2lzX25vbl9kZWxheV9tcGMod2xjX2luZm9fdCAqd2xjKQorYm9vbCB3bGNfaXNfbm9uX2RlbGF5X21wYyhzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAlyZXR1cm4gZmFsc2U7CiB9CiAKLWJvb2wgd2xjX2lzbXBjKHdsY19pbmZvX3QgKndsYykKK2Jvb2wgd2xjX2lzbXBjKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCXJldHVybiAod2xjLT5tcGNfZGVsYXlfb2ZmID09IDApICYmICh3bGNfaXNfbm9uX2RlbGF5X21wYyh3bGMpKTsKIH0KIAotdm9pZCB3bGNfcmFkaW9fbXBjX3VwZCh3bGNfaW5mb190ICp3bGMpCit2b2lkIHdsY19yYWRpb19tcGNfdXBkKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCWJvb2wgbXBjX3JhZGlvLCByYWRpb19zdGF0ZTsKIApAQCAtMjQ3Nyw3ICsyMjkyLDcgQEAKICAqIGNlbnRyYWxpemVkIHJhZGlvIGRpc2FibGUvZW5hYmxlIGZ1bmN0aW9uLAogICogaW52b2tlIHJhZGlvIGVuYWJsZS9kaXNhYmxlIGFmdGVyIHVwZGF0aW5nIGh3cmFkaW8gc3RhdHVzCiAgKi8KLXN0YXRpYyB2b2lkIHdsY19yYWRpb191cGQod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIHZvaWQgd2xjX3JhZGlvX3VwZChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAlpZiAod2xjLT5wdWItPnJhZGlvX2Rpc2FibGVkKQogCQl3bGNfcmFkaW9fZGlzYWJsZSh3bGMpOwpAQCAtMjQ4Niw3ICsyMzAxLDcgQEAKIH0KIAogLyogbWFpbnRhaW4gTEVEIGJlaGF2aW9yIGluIGRvd24gc3RhdGUgKi8KLXN0YXRpYyB2b2lkIHdsY19kb3duX2xlZF91cGQod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIHZvaWQgd2xjX2Rvd25fbGVkX3VwZChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAlBU1NFUlQoIXdsYy0+cHViLT51cCk7CiAKQEAgLTI0OTksNyArMjMxNCw3IEBACiAJfQogfQogCi12b2lkIHdsY19yYWRpb19kaXNhYmxlKHdsY19pbmZvX3QgKndsYykKK3ZvaWQgd2xjX3JhZGlvX2Rpc2FibGUoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJaWYgKCF3bGMtPnB1Yi0+dXApIHsKIAkJd2xjX2Rvd25fbGVkX3VwZCh3bGMpOwpAQCAtMjUxMCw3ICsyMzI1LDcgQEAKIAl3bF9kb3duKHdsYy0+d2wpOwogfQogCi1zdGF0aWMgdm9pZCB3bGNfcmFkaW9fZW5hYmxlKHdsY19pbmZvX3QgKndsYykKK3N0YXRpYyB2b2lkIHdsY19yYWRpb19lbmFibGUoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJaWYgKHdsYy0+cHViLT51cCkKIAkJcmV0dXJuOwpAQCAtMjUyNiwxMCArMjM0MSwxMCBAQAogLyogcGVyaW9kaWNhbCBxdWVyeSBodyByYWRpbyBidXR0b24gd2hpbGUgZHJpdmVyIGlzICJkb3duIiAqLwogc3RhdGljIHZvaWQgd2xjX3JhZGlvX3RpbWVyKHZvaWQgKmFyZykKIHsKLQl3bGNfaW5mb190ICp3bGMgPSAod2xjX2luZm9fdCAqKSBhcmc7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSAoc3RydWN0IHdsY19pbmZvICopIGFyZzsKIAogCWlmIChERVZJQ0VSRU1PVkVEKHdsYykpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiAlczogZGVhZCBjaGlwXG4iLCB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIndsJWQ6ICVzOiBkZWFkIGNoaXBcbiIsIHdsYy0+cHViLT51bml0LCBfX2Z1bmNfXyk7CiAJCXdsX2Rvd24od2xjLT53bCk7CiAJCXJldHVybjsKIAl9CkBAIC0yNTQ0LDcgKzIzNTksNyBAQAogCXdsY19yYWRpb191cGQod2xjKTsKIH0KIAotc3RhdGljIGJvb2wgd2xjX3JhZGlvX21vbml0b3Jfc3RhcnQod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIGJvb2wgd2xjX3JhZGlvX21vbml0b3Jfc3RhcnQoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJLyogRG9uJ3Qgc3RhcnQgdGhlIHRpbWVyIGlmIEhXUkFESU8gZmVhdHVyZSBpcyBkaXNhYmxlZCAqLwogCWlmICh3bGMtPnJhZGlvX21vbml0b3IgfHwgKHdsYy0+cHViLT53bGZlYXR1cmVmbGFnICYgV0xfU1dGTF9OT0hXUkFESU8pKQpAQCAtMjU1Niw3ICsyMzcxLDcgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCB3bGNfcmFkaW9fbW9uaXRvcl9zdG9wKHdsY19pbmZvX3QgKndsYykKK2Jvb2wgd2xjX3JhZGlvX21vbml0b3Jfc3RvcChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAlpZiAoIXdsYy0+cmFkaW9fbW9uaXRvcikKIAkJcmV0dXJuIHRydWU7CkBAIC0yNTcwLDcgKzIzODUsNyBAQAogfQogCiAvKiBicmluZyB0aGUgZHJpdmVyIGRvd24sIGJ1dCBkb24ndCByZXNldCBoYXJkd2FyZSAqLwotdm9pZCB3bGNfb3V0KHdsY19pbmZvX3QgKndsYykKK3ZvaWQgd2xjX291dChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAl3bGNfYm1hY19zZXRfbm9yZXNldCh3bGMtPmh3LCB0cnVlKTsKIAl3bGNfcmFkaW9fdXBkKHdsYyk7CkBAIC0yNTkxLDcgKzI0MDYsNyBAQAogICogaWYgdGhlcmUgaXMgbm8gcGFja2V0IHBlbmRpbmcgZm9yIHRoZSBGSUZPLCB0aGVuIHRoZSBjb3JyZXNwb25kaW5nIHByZWMgYml0cyBzaG91bGQgYmUgc2V0CiAgKiBpbiBwcmVjX21hcC4gT2YgY291cnNlLCBpZ25vcmUgdGhpcyBydWxlIHdoZW4gYmxvY2tfZGF0YWZpZm8gaXMgc2V0CiAgKi8KLXN0YXRpYyBib29sIHdsY190eF9wcmVjX21hcF92ZXJpZnkod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIGJvb2wgd2xjX3R4X3ByZWNfbWFwX3ZlcmlmeShzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAkvKiBGb3Igbm9uLVdNRSwgYm90aCBmaWZvcyBoYXZlIG92ZXJsYXBwaW5nIHByZWNfbWFwLiBTbyBpdCdzIGFuIGVycm9yIG9ubHkgaWYgYm90aAogCSAqIGZhaWwgdGhlIGNoZWNrLgpAQCAtMjYxMyw3ICsyNDI4LDcgQEAKIAogc3RhdGljIHZvaWQgd2xjX3dhdGNoZG9nX2J5X3RpbWVyKHZvaWQgKmFyZykKIHsKLQl3bGNfaW5mb190ICp3bGMgPSAod2xjX2luZm9fdCAqKSBhcmc7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSAoc3RydWN0IHdsY19pbmZvICopIGFyZzsKIAl3bGNfd2F0Y2hkb2coYXJnKTsKIAlpZiAoV0xDX1dBVENIRE9HX1RCVFQod2xjKSkgewogCQkvKiBzZXQgdG8gbm9ybWFsIG9zbCB3YXRjaGRvZyBwZXJpb2QgKi8KQEAgLTI2MjYsMTcgKzI0NDEsMTcgQEAKIC8qIGNvbW1vbiB3YXRjaGRvZyBjb2RlICovCiBzdGF0aWMgdm9pZCB3bGNfd2F0Y2hkb2codm9pZCAqYXJnKQogewotCXdsY19pbmZvX3QgKndsYyA9ICh3bGNfaW5mb190ICopIGFyZzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IChzdHJ1Y3Qgd2xjX2luZm8gKikgYXJnOwogCWludCBpOwogCXdsY19ic3NjZmdfdCAqY2ZnOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiB3bGNfd2F0Y2hkb2dcbiIsIHdsYy0+cHViLT51bml0KSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY193YXRjaGRvZ1xuIiwgd2xjLT5wdWItPnVuaXQpOwogCiAJaWYgKCF3bGMtPnB1Yi0+dXApCiAJCXJldHVybjsKIAogCWlmIChERVZJQ0VSRU1PVkVEKHdsYykpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiAlczogZGVhZCBjaGlwXG4iLCB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIndsJWQ6ICVzOiBkZWFkIGNoaXBcbiIsIHdsYy0+cHViLT51bml0LCBfX2Z1bmNfXyk7CiAJCXdsX2Rvd24od2xjLT53bCk7CiAJCXJldHVybjsKIAl9CkBAIC0yNjY3LDEzICsyNDgyLDcgQEAKIAlpZiAod2xjLT5wdWItPnJhZGlvX2Rpc2FibGVkKQogCQlyZXR1cm47CiAKLSNpZmRlZiBXTENfTE9XCiAJd2xjX2JtYWNfd2F0Y2hkb2cod2xjKTsKLSNlbmRpZgotI2lmZGVmIFdMQ19ISUdIX09OTFkKLQkvKiBtYWludGVuYW5jZSAqLwotCXdsY19ibWFjX3JwY193YXRjaGRvZyh3bGMpOwotI2VuZGlmCiAKIAkvKiBvY2Nhc2lvbmFsbHkgc2FtcGxlIG1hYyBzdGF0IGNvdW50ZXJzIHRvIGRldGVjdCAxNi1iaXQgY291bnRlciB3cmFwICovCiAJaWYgKChXTENfVVBEQVRFX1NUQVRTKHdsYykpCkBAIC0yNzAyLDEwICsyNTExLDggQEAKIAkJd2xjLT50ZW1wc2Vuc2VfbGFzdHRpbWUgPSB3bGMtPnB1Yi0+bm93OwogCQl3bGNfdGVtcHNlbnNlX3VwZCh3bGMpOwogCX0KLSNpZmRlZiBXTENfTE9XCiAJLyogQk1BQ19OT1RFOiBmb3IgSElHSF9PTkxZIGRyaXZlciwgdGhpcyBzZWVtcyBiZWluZyBjYWxsZWQgYWZ0ZXIgUlBDIGJ1cyBmYWlsZWQgKi8KIAlBU1NFUlQod2xjX2JtYWNfdGFjbGVhcih3bGMtPmh3LCB0cnVlKSk7Ci0jZW5kaWYKIAogCS8qIFZlcmlmeSB0aGF0IHR4X3ByZWNfbWFwIGFuZCBmaWZvcyBhcmUgaW4gc3luYyB0byBhdm9pZCBsb2NrIHVwcyAqLwogCUFTU0VSVCh3bGNfdHhfcHJlY19tYXBfdmVyaWZ5KHdsYykpOwpAQCAtMjcxNCw5ICsyNTIxLDkgQEAKIH0KIAogLyogbWFrZSBpbnRlcmZhY2Ugb3BlcmF0aW9uYWwgKi8KLWludCB3bGNfdXAod2xjX2luZm9fdCAqd2xjKQoraW50IHdsY191cChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKLQlXTF9UUkFDRSgoIndsJWQ6ICVzOlxuIiwgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fKSk7CisJV0xfVFJBQ0UoIndsJWQ6ICVzOlxuIiwgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fKTsKIAogCS8qIEhXIGlzIHR1cm5lZCBvZmYgc28gZG9uJ3QgdHJ5IHRvIGFjY2VzcyBpdCAqLwogCWlmICh3bGMtPnB1Yi0+aHdfb2ZmIHx8IERFVklDRVJFTU9WRUQod2xjKSkKQEAgLTI3MjgsNyArMjUzNSw3IEBACiAJfQogCiAJaWYgKCh3bGMtPnB1Yi0+Ym9hcmRmbGFncyAmIEJGTF9GRU0pCi0JICAgICYmIChDSElQSUQod2xjLT5wdWItPnNpaC0+Y2hpcCkgPT0gQkNNNDMxM19DSElQX0lEKSkgeworCSAgICAmJiAod2xjLT5wdWItPnNpaC0+Y2hpcCA9PSBCQ000MzEzX0NISVBfSUQpKSB7CiAJCWlmICh3bGMtPnB1Yi0+Ym9hcmRyZXYgPj0gMHgxMjUwCiAJCSAgICAmJiAod2xjLT5wdWItPmJvYXJkZmxhZ3MgJiBCRkxfRkVNX0JUKSkgewogCQkJd2xjX21oZih3bGMsIE1IRjUsIE1IRjVfNDMxM19HUElPQ1RSTCwKQEAgLTI3NjEsNyArMjU2OCw4IEBACiAJCQkJCWlmICghQlNTQ0ZHX1NUQShic3NjZmcpCiAJCQkJCSAgICB8fCAhYnNzY2ZnLT5lbmFibGUgfHwgIWJzc2NmZy0+QlNTKQogCQkJCQkJY29udGludWU7Ci0JCQkJCVdMX0VSUk9SKCgid2wlZC4lZDogd2xjX3VwOiByZmRpc2FibGUgLT4gIiAid2xjX2Jzc2NmZ19kaXNhYmxlKClcbiIsIHdsYy0+cHViLT51bml0LCBpZHgpKTsKKwkJCQkJV0xfRVJST1IoIndsJWQuJWQ6IHdsY191cDogcmZkaXNhYmxlIC0+ICIgIndsY19ic3NjZmdfZGlzYWJsZSgpXG4iLAorCQkJCQkJIHdsYy0+cHViLT51bml0LCBpZHgpOwogCQkJCX0KIAkJCX0KIAkJfSBlbHNlCkBAIC0yODIyLDEwICsyNjMwLDEwIEBACiB9CiAKIC8qIEluaXRpYWxpemUgdGhlIGJhc2UgcHJlY2VkZW5jZSBtYXAgZm9yIGRlcXVldWVpbmcgZnJvbSB0eHEgYmFzZWQgb24gV01FIHNldHRpbmdzICovCi1zdGF0aWMgdm9pZCB3bGNfdHhfcHJlY19tYXBfaW5pdCh3bGNfaW5mb190ICp3bGMpCitzdGF0aWMgdm9pZCB3bGNfdHhfcHJlY19tYXBfaW5pdChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAl3bGMtPnR4X3ByZWNfbWFwID0gV0xDX1BSRUNfQk1QX0FMTDsKLQliemVybyh3bGMtPmZpZm8ycHJlY19tYXAsIHNpemVvZih1MTYpICogTkZJRk8pOworCW1lbXNldCh3bGMtPmZpZm8ycHJlY19tYXAsIDAsIE5GSUZPICogc2l6ZW9mKHUxNikpOwogCiAJLyogRm9yIG5vbi1XTUUsIGJvdGggZmlmb3MgaGF2ZSBvdmVybGFwcGluZyBNQVhQUklPLiBTbyBqdXN0IGRpc2FibGUgYWxsIHByZWNlZGVuY2VzCiAJICogaWYgZWl0aGVyIGlzIGZ1bGwuCkBAIC0yODQxLDcgKzI2NDksNyBAQAogCX0KIH0KIAotc3RhdGljIHVpbnQgd2xjX2Rvd25fZGVsX3RpbWVyKHdsY19pbmZvX3QgKndsYykKK3N0YXRpYyB1aW50IHdsY19kb3duX2RlbF90aW1lcihzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAl1aW50IGNhbGxiYWNrcyA9IDA7CiAKQEAgLTI4NTMsNyArMjY2MSw3IEBACiAgKiBkaXNhYmxlIHRoZSBoYXJkd2FyZSwgZnJlZSBhbnkgdHJhbnNpZW50IGJ1ZmZlciBzdGF0ZS4KICAqIFJldHVybiBhIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgZHJpdmVyIGNhbGxiYWNrcyBzdGlsbCBwZW5kaW5nLgogICovCi11aW50IHdsY19kb3duKHdsY19pbmZvX3QgKndsYykKK3VpbnQgd2xjX2Rvd24oc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAKIAl1aW50IGNhbGxiYWNrcyA9IDA7CkBAIC0yODYxLDEyICsyNjY5LDEyIEBACiAJYm9vbCBkZXZfZ29uZSA9IGZhbHNlOwogCXdsY190eHFfaW5mb190ICpxaTsKIAotCVdMX1RSQUNFKCgid2wlZDogJXM6XG4iLCB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18pKTsKKwlXTF9UUkFDRSgid2wlZDogJXM6XG4iLCB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18pOwogCiAJLyogY2hlY2sgaWYgd2UgYXJlIGFscmVhZHkgaW4gdGhlIGdvaW5nIGRvd24gcGF0aCAqLwogCWlmICh3bGMtPmdvaW5nX2Rvd24pIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiAlczogRHJpdmVyIGdvaW5nIGRvd24gc28gcmV0dXJuXG4iLAotCQkJICB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIndsJWQ6ICVzOiBEcml2ZXIgZ29pbmcgZG93biBzbyByZXR1cm5cbiIsCisJCQkgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fKTsKIAkJcmV0dXJuIDA7CiAJfQogCWlmICghd2xjLT5wdWItPnVwKQpAQCAtMjkyMiwxNCArMjczMCwxMSBAQAogCS8qIHdsY19ibWFjX2Rvd25fZmluaXNoIGhhcyBkb25lIHdsY19jb3JlZGlzYWJsZSgpLiBzbyBjbGsgaXMgb2ZmICovCiAJd2xjLT5jbGsgPSBmYWxzZTsKIAotI2lmZGVmIFdMQ19ISUdIX09OTFkKLQl3bGNfcnBjdHhfdHhyZWNsYWltKHdsYy0+cnBjdHgpOwotI2VuZGlmCiAKIAkvKiBWZXJpZnkgYWxsIHBhY2tldHMgYXJlIGZsdXNoZWQgZnJvbSB0aGUgZHJpdmVyICovCi0JaWYgKFBLVEFMTE9DRUQod2xjLT5vc2gpICE9IDApIHsKLQkJV0xfRVJST1IoKCIlZCBwYWNrZXRzIG5vdCBmcmVlZCBhdCB3bGNfZG93biEhISEhIVxuIiwKLQkJCSAgUEtUQUxMT0NFRCh3bGMtPm9zaCkpKTsKKwlpZiAod2xjLT5vc2gtPnBrdGFsbG9jZWQgIT0gMCkgeworCQlXTF9FUlJPUigiJWQgcGFja2V0cyBub3QgZnJlZWQgYXQgd2xjX2Rvd24hISEhISFcbiIsCisJCQkgd2xjLT5vc2gtPnBrdGFsbG9jZWQpOwogCX0KICNpZmRlZiBCQ01EQkcKIAkvKiBTaW5jZSBhbGwgdGhlIHBhY2tldHMgc2hvdWxkIGhhdmUgYmVlbiBmcmVlZCwKQEAgLTI5NDMsNyArMjc0OCw3IEBACiB9CiAKIC8qIFNldCB0aGUgY3VycmVudCBnbW9kZSBjb25maWd1cmF0aW9uICovCi1pbnQgd2xjX3NldF9nbW9kZSh3bGNfaW5mb190ICp3bGMsIHU4IGdtb2RlLCBib29sIGNvbmZpZykKK2ludCB3bGNfc2V0X2dtb2RlKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1OCBnbW9kZSwgYm9vbCBjb25maWcpCiB7CiAJaW50IHJldCA9IDA7CiAJdWludCBpOwpAQCAtMjk1OCw3ICsyNzYzLDcgQEAKIAlib29sIHByZWFtYmxlX3Jlc3RyaWN0ID0gZmFsc2U7CS8qIFJlc3RyaWN0IGFzc29jaWF0aW9uIHRvIHN0YXRpb25zIHRoYXQgc3VwcG9ydCBzaG9ydAogCQkJCQkgKiBwcmVhbWJsZXMKIAkJCQkJICovCi0Jd2xjYmFuZF90ICpiYW5kOworCXN0cnVjdCB3bGNiYW5kICpiYW5kOwogCiAJLyogaWYgTi1zdXBwb3J0IGlzIGVuYWJsZWQsIGFsbG93IEdtb2RlIHNldCBhcyBsb25nIGFzIHJlcXVlc3RlZAogCSAqIEdtb2RlIGlzIG5vdCBHTU9ERV9MRUdBQ1lfQgpAQCAtMjk4NSwxMCArMjc5MCwxMCBAQAogCQl3bGNfcHJvdGVjdGlvbl91cGQod2xjLCBXTENfUFJPVF9HX1VTRVIsIGdtb2RlKTsKIAogCS8qIENsZWFyIHN1cHBvcnRlZCByYXRlcyBmaWx0ZXIgKi8KLQliemVybygmd2xjLT5zdXBfcmF0ZXNfb3ZlcnJpZGUsIHNpemVvZih3bGNfcmF0ZXNldF90KSk7CisJbWVtc2V0KCZ3bGMtPnN1cF9yYXRlc19vdmVycmlkZSwgMCwgc2l6ZW9mKHdsY19yYXRlc2V0X3QpKTsKIAogCS8qIENsZWFyIHJhdGVzZXQgb3ZlcnJpZGUgKi8KLQliemVybygmcnMsIHNpemVvZih3bGNfcmF0ZXNldF90KSk7CisJbWVtc2V0KCZycywgMCwgc2l6ZW9mKHdsY19yYXRlc2V0X3QpKTsKIAogCXN3aXRjaCAoZ21vZGUpIHsKIAljYXNlIEdNT0RFX0xFR0FDWV9COgpAQCAtMzAyNiw4ICsyODMxLDggQEAKIAogCWRlZmF1bHQ6CiAJCS8qIEVycm9yICovCi0JCVdMX0VSUk9SKCgid2wlZDogJXM6IGludmFsaWQgZ21vZGUgJWRcbiIsIHdsYy0+cHViLT51bml0LAotCQkJICBfX2Z1bmNfXywgZ21vZGUpKTsKKwkJV0xfRVJST1IoIndsJWQ6ICVzOiBpbnZhbGlkIGdtb2RlICVkXG4iLAorCQkJIHdsYy0+cHViLT51bml0LCBfX2Z1bmNfXywgZ21vZGUpOwogCQlyZXR1cm4gQkNNRV9VTlNVUFBPUlRFRDsKIAl9CiAKQEAgLTMwOTMsNyArMjg5OCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCB3bGNfbm1vZGVfdmFsaWRhdGUod2xjX2luZm9fdCAqd2xjLCBzMzIgbm1vZGUpCitzdGF0aWMgaW50IHdsY19ubW9kZV92YWxpZGF0ZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgczMyIG5tb2RlKQogewogCWludCBlcnIgPSAwOwogCkBAIC0zMTE3LDcgKzI5MjIsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLWludCB3bGNfc2V0X25tb2RlKHdsY19pbmZvX3QgKndsYywgczMyIG5tb2RlKQoraW50IHdsY19zZXRfbm1vZGUoc3RydWN0IHdsY19pbmZvICp3bGMsIHMzMiBubW9kZSkKIHsKIAl1aW50IGk7CiAJaW50IGVycjsKQEAgLTMxNzYsNyArMjk4MSw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCB3bGNfc2V0X3JhdGVzZXQod2xjX2luZm9fdCAqd2xjLCB3bGNfcmF0ZXNldF90ICpyc19hcmcpCitzdGF0aWMgaW50IHdsY19zZXRfcmF0ZXNldChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgd2xjX3JhdGVzZXRfdCAqcnNfYXJnKQogewogCXdsY19yYXRlc2V0X3QgcnMsIG5ldzsKIAl1aW50IGJhbmR1bml0OwpAQCAtMzIxOSwxOCArMzAyNCwxOCBAQAogfQogCiAvKiBzaW1wbGlmaWVkIGludGVnZXIgc2V0IGludGVyZmFjZSBmb3IgY29tbW9uIGlvY3RsIGhhbmRsZXIgKi8KLWludCB3bGNfc2V0KHdsY19pbmZvX3QgKndsYywgaW50IGNtZCwgaW50IGFyZykKK2ludCB3bGNfc2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBpbnQgY21kLCBpbnQgYXJnKQogewogCXJldHVybiB3bGNfaW9jdGwod2xjLCBjbWQsICh2b2lkICopJmFyZywgc2l6ZW9mKGFyZyksIE5VTEwpOwogfQogCiAvKiBzaW1wbGlmaWVkIGludGVnZXIgZ2V0IGludGVyZmFjZSBmb3IgY29tbW9uIGlvY3RsIGhhbmRsZXIgKi8KLWludCB3bGNfZ2V0KHdsY19pbmZvX3QgKndsYywgaW50IGNtZCwgaW50ICphcmcpCitpbnQgd2xjX2dldChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgaW50IGNtZCwgaW50ICphcmcpCiB7CiAJcmV0dXJuIHdsY19pb2N0bCh3bGMsIGNtZCwgYXJnLCBzaXplb2YoaW50KSwgTlVMTCk7CiB9CiAKLXN0YXRpYyB2b2lkIHdsY19vZmRtX3JhdGVzZXRfd2FyKHdsY19pbmZvX3QgKndsYykKK3N0YXRpYyB2b2lkIHdsY19vZmRtX3JhdGVzZXRfd2FyKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCXU4IHI7CiAJYm9vbCB3YXIgPSBmYWxzZTsKQEAgLTMyNDYsMTQgKzMwNTEsMTYgQEAKIH0KIAogaW50Ci13bGNfaW9jdGwod2xjX2luZm9fdCAqd2xjLCBpbnQgY21kLCB2b2lkICphcmcsIGludCBsZW4sIHN0cnVjdCB3bGNfaWYgKndsY2lmKQord2xjX2lvY3RsKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBpbnQgY21kLCB2b2lkICphcmcsIGludCBsZW4sCisJICBzdHJ1Y3Qgd2xjX2lmICp3bGNpZikKIHsKIAlyZXR1cm4gX3dsY19pb2N0bCh3bGMsIGNtZCwgYXJnLCBsZW4sIHdsY2lmKTsKIH0KIAogLyogY29tbW9uIGlvY3RsIGhhbmRsZXIuIHJldHVybjogMD1vaywgLTE9ZXJyb3IsIHBvc2l0aXZlPXBhcnRpY3VsYXIgZXJyb3IgKi8KIHN0YXRpYyBpbnQKLV93bGNfaW9jdGwod2xjX2luZm9fdCAqd2xjLCBpbnQgY21kLCB2b2lkICphcmcsIGludCBsZW4sIHN0cnVjdCB3bGNfaWYgKndsY2lmKQorX3dsY19pb2N0bChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgaW50IGNtZCwgdm9pZCAqYXJnLCBpbnQgbGVuLAorCSAgIHN0cnVjdCB3bGNfaWYgKndsY2lmKQogewogCWludCB2YWwsICpwdmFsOwogCWJvb2wgYm9vbF92YWw7CkBAIC0zMjY1LDcgKzMwNzIsNyBAQAogCXVpbnQgYmFuZDsKIAlyd19yZWdfdCAqcjsKIAl3bGNfYnNzY2ZnX3QgKmJzc2NmZzsKLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCXdsY19ic3NfaW5mb190ICpjdXJyZW50X2JzczsKIAogCS8qIHVwZGF0ZSBic3NjZmcgcG9pbnRlciAqLwpAQCAtMzI4MCw3ICszMDg3LDcgQEAKIAogCS8qIElmIHRoZSBkZXZpY2UgaXMgdHVybmVkIG9mZiwgdGhlbiBpdCdzIG5vdCAicmVtb3ZlZCIgKi8KIAlpZiAoIXdsYy0+cHViLT5od19vZmYgJiYgREVWSUNFUkVNT1ZFRCh3bGMpKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogJXM6IGRlYWQgY2hpcFxuIiwgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCJ3bCVkOiAlczogZGVhZCBjaGlwXG4iLCB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18pOwogCQl3bF9kb3duKHdsYy0+d2wpOwogCQlyZXR1cm4gQkNNRV9FUlJPUjsKIAl9CkBAIC0zMzAwLDggKzMxMDcsOCBAQAogCWJvb2xfdmFsID0gdmFsICE9IDA7CiAKIAlpZiAoY21kICE9IFdMQ19TRVRfQ0hBTk5FTCkKLQkJV0xfTk9ORSgoIldMQ19JT0NUTDogY21kICVkIHZhbCAweCV4ICglZCkgbGVuICVkXG4iLCBjbWQsCi0JCQkgKHVpbnQpIHZhbCwgdmFsLCBsZW4pKTsKKwkJV0xfTk9ORSgiV0xDX0lPQ1RMOiBjbWQgJWQgdmFsIDB4JXggKCVkKSBsZW4gJWRcbiIsCisJCQljbWQsICh1aW50KXZhbCwgdmFsLCBsZW4pOwogCiAJYmNtZXJyb3IgPSAwOwogCXJlZ3MgPSB3bGMtPnJlZ3M7CkBAIC0zMzIxLDggKzMxMjgsOCBAQAogCiAJZGVmYXVsdDoKIAkJaWYgKChhcmcgPT0gTlVMTCkgfHwgKGxlbiA8PSAwKSkgewotCQkJV0xfRVJST1IoKCJ3bCVkOiAlczogQ29tbWFuZCAlZCBuZWVkcyBhcmd1bWVudHNcbiIsCi0JCQkJICB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18sIGNtZCkpOworCQkJV0xfRVJST1IoIndsJWQ6ICVzOiBDb21tYW5kICVkIG5lZWRzIGFyZ3VtZW50c1xuIiwKKwkJCQkgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fLCBjbWQpOwogCQkJYmNtZXJyb3IgPSBCQ01FX0JBREFSRzsKIAkJCWdvdG8gZG9uZTsKIAkJfQpAQCAtMzM4OCwxMCArMzE5NSw2IEBACiAJCQkJd2xjX3NldF9jaGFuc3BlYyh3bGMsIGNoc3BlYyk7CiAJCQkJd2xjX2VuYWJsZV9tYWMod2xjKTsKIAkJCX0KLSNpZmRlZiBXTENfSElHSF9PTkxZCi0JCQkvKiBkZWxheSBmb3IgY2hhbm5lbCBjaGFuZ2UgKi8KLQkJCW1zbGVlcCg1MCk7Ci0jZW5kaWYKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTM2NTksOCArMzQ2Miw4IEBACiAJCQkvKiA0MzIyIHN1cHBvcnRzIGFudGRpdiBpbiBwaHksIG5vIG5lZWQgdG8gc2V0IGl0IHRvIHVjb2RlICovCiAJCQlpZiAoV0xDSVNOUEhZKHdsYy0+YmFuZCkKIAkJCSAgICAmJiBEMTFSRVZfSVMod2xjLT5wdWItPmNvcmVyZXYsIDE2KSkgewotCQkJCVdMX0VSUk9SKCgid2wlZDogY2FuJ3Qgc2V0IHVjYW50ZGl2IGZvciA0MzIyXG4iLAotCQkJCQkgIHdsYy0+cHViLT51bml0KSk7CisJCQkJV0xfRVJST1IoIndsJWQ6IGNhbid0IHNldCB1Y2FudGRpdiBmb3IgNDMyMlxuIiwKKwkJCQkJIHdsYy0+cHViLT51bml0KTsKIAkJCQliY21lcnJvciA9IEJDTUVfVU5TVVBQT1JURUQ7CiAJCQl9IGVsc2UKIAkJCQl3bGNfbWhmKHdsYywgTUhGMSwgTUhGMV9BTlRESVYsCkBAIC0zNzU3LDggKzM1NjAsOCBAQAogCQkJaWYgKChyYWRpb21hc2sgPT0gMCkgfHwgKHJhZGlvbWFzayAmIH52YWxpZGJpdHMpCiAJCQkgICAgfHwgKHJhZGlvdmFsICYgfnZhbGlkYml0cykKIAkJCSAgICB8fCAoKHJhZGlvdmFsICYgfnJhZGlvbWFzaykgIT0gMCkpIHsKLQkJCQlXTF9FUlJPUigoIlNFVF9SQURJTyB3aXRoIHdyb25nIGJpdHMgMHgleFxuIiwKLQkJCQkJICB2YWwpKTsKKwkJCQlXTF9FUlJPUigiU0VUX1JBRElPIHdpdGggd3JvbmcgYml0cyAweCV4XG4iLAorCQkJCQkgdmFsKTsKIAkJCQliY21lcnJvciA9IEJDTUVfUkFOR0U7CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC0zNzg4LDcgKzM1OTEsNyBAQAogCQkJCWJyZWFrOwogCQkJfQogCi0JCQliemVybygoY2hhciAqKSZrZXksIHNpemVvZihrZXkpKTsKKwkJCW1lbXNldCgoY2hhciAqKSZrZXksIDAsIHNpemVvZihrZXkpKTsKIAkJCWlmIChzcmNfa2V5KSB7CiAJCQkJa2V5LmluZGV4ID0gc3JjX2tleS0+aWQ7CiAJCQkJa2V5LmxlbiA9IHNyY19rZXktPmxlbjsKQEAgLTM4MDAsNyArMzYwMyw3IEBACiAJCQkJCWtleS5mbGFncyB8PSBXTF9QUklNQVJZX0tFWTsKIAogCQkJCWJjb3B5KHNyY19rZXktPmVhLm9jdGV0LCBrZXkuZWEub2N0ZXQsCi0JCQkJICAgICAgRVRIRVJfQUREUl9MRU4pOworCQkJCSAgICAgIEVUSF9BTEVOKTsKIAkJCX0KIAogCQkJYmNvcHkoKGNoYXIgKikma2V5LCBhcmcsIHNpemVvZihrZXkpKTsKQEAgLTM4MzUsOCArMzYzOCw4IEBACiAJCQkJdTE2IGxvOwogCQkJCXUzMiBoaTsKIAkJCQkvKiBncm91cCBrZXlzIGluIFdQQS1OT05FIChJQlNTIG9ubHksIEFFUyBhbmQgVEtJUCkgdXNlIGEgZ2xvYmFsIFRYSVYgKi8KLQkJCQlpZiAoKGJzc2NmZy0+V1BBX2F1dGggJiBXUEFfQVVUSF9OT05FKQotCQkJCSAgICAmJiBFVEhFUl9JU05VTExBRERSKCZrZXktPmVhKSkgeworCQkJCWlmICgoYnNzY2ZnLT5XUEFfYXV0aCAmIFdQQV9BVVRIX05PTkUpICYmCisJCQkJICAgIGlzX3plcm9fZXRoZXJfYWRkcihrZXktPmVhLm9jdGV0KSkgewogCQkJCQlsbyA9IGJzc2NmZy0+d3BhX25vbmVfdHhpdi5sbzsKIAkJCQkJaGkgPSBic3NjZmctPndwYV9ub25lX3R4aXYuaGk7CiAJCQkJfSBlbHNlIHsKQEAgLTM4ODUsNyArMzY4OCw3IEBACiAJCQl3bGNfcmF0ZXNldF90IHJzOwogCQkJd2xfcmF0ZXNldF90ICpyZXRfcnMgPSAod2xfcmF0ZXNldF90ICopIGFyZzsKIAotCQkJYnplcm8oJnJzLCBzaXplb2Yod2xjX3JhdGVzZXRfdCkpOworCQkJbWVtc2V0KCZycywgMCwgc2l6ZW9mKHdsY19yYXRlc2V0X3QpKTsKIAkJCXdsY19kZWZhdWx0X3JhdGVzZXQod2xjLCAod2xjX3JhdGVzZXRfdCAqKSAmcnMpOwogCiAJCQlpZiAobGVuIDwgKGludCkocnMuY291bnQgKyBzaXplb2YocnMuY291bnQpKSkgewpAQCAtMzkxMyw3ICszNzE2LDcgQEAKIAkJCQlicmVhazsKIAkJCX0KIAotCQkJYnplcm8oJnJzLCBzaXplb2Yod2xjX3JhdGVzZXRfdCkpOworCQkJbWVtc2V0KCZycywgMCwgc2l6ZW9mKHdsY19yYXRlc2V0X3QpKTsKIAogCQkJLyogQ29weSBvbmx5IGxlZ2FjeSByYXRlc2V0IHNlY3Rpb24gKi8KIAkJCXJzLmNvdW50ID0gaW5fcnMtPmNvdW50OwpAQCAtNDI0Nyw3ICs0MDUwLDcgQEAKIAogCQkJLyogY2hlY2sgZm9yIGFuIGVtcHR5IHJhdGVzZXQgdG8gY2xlYXIgdGhlIG92ZXJyaWRlICovCiAJCQlpZiAocnMuY291bnQgPT0gMCkgewotCQkJCWJ6ZXJvKCZ3bGMtPnN1cF9yYXRlc19vdmVycmlkZSwKKwkJCQltZW1zZXQoJndsYy0+c3VwX3JhdGVzX292ZXJyaWRlLCAwLAogCQkJCSAgICAgIHNpemVvZih3bGNfcmF0ZXNldF90KSk7CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC00Mzk0LDcgKzQxOTcsNyBAQAogI2VuZGlmCiAKIAljYXNlIFdMQ19MQVNUOgotCQlXTF9FUlJPUigoIiVzOiBXTENfTEFTVFxuIiwgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIiVzOiBXTENfTEFTVFxuIiwgX19mdW5jX18pOwogCX0KICBkb25lOgogCkBAIC00NDA2LDIxICs0MjA5LDE5IEBACiAJCX0KIAogCX0KLSNpZmRlZiBXTENfTE9XCiAJLyogQk1BQ19OT1RFOiBmb3IgSElHSF9PTkxZIGRyaXZlciwgdGhpcyBzZWVtcyBiZWluZyBjYWxsZWQgYWZ0ZXIgUlBDIGJ1cyBmYWlsZWQgKi8KIAkvKiBJbiBod19vZmYgY29uZGl0aW9uLCBJT0NUTHMgdGhhdCByZWFjaCBoZXJlIGFyZSBkZWVtZWQgc2FmZSBidXQgdGFjbGVhciB3b3VsZAogCSAqIGNlcnRhaW5seSByZXN1bHQgaW4gZ2V0dGluZyAtMSBmb3IgcmVnaXN0ZXIgcmVhZHMuIFNvIHNraXAgdGFfY2xlYXIgYWx0b2dldGhlcgogCSAqLwogCWlmICghKHdsYy0+cHViLT5od19vZmYpKQogCQlBU1NFUlQod2xjX2JtYWNfdGFjbGVhcih3bGMtPmh3LCB0YV9vaykgfHwgIXRhX29rKTsKLSNlbmRpZgogCiAJcmV0dXJuIGJjbWVycm9yOwogfQogCiAjaWYgZGVmaW5lZChCQ01EQkcpCiAvKiBjb25zb2xpZGF0ZWQgcmVnaXN0ZXIgYWNjZXNzIGlvY3RsIGVycm9yIGNoZWNraW5nICovCi1pbnQgd2xjX2lvY3JlZ2Noayh3bGNfaW5mb190ICp3bGMsIHVpbnQgYmFuZCkKK2ludCB3bGNfaW9jcmVnY2hrKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1aW50IGJhbmQpCiB7CiAJLyogaWYgYmFuZCBpcyBzcGVjaWZpZWQsIGl0IG11c3QgYmUgdGhlIGN1cnJlbnQgYmFuZCAqLwogCWlmICgoYmFuZCAhPSBXTENfQkFORF9BVVRPKSAmJiAoYmFuZCAhPSAodWludCkgd2xjLT5iYW5kLT5iYW5kdHlwZSkpCkBAIC00NDQwLDcgKzQyNDEsNyBAQAogCiAjaWYgZGVmaW5lZChCQ01EQkcpCiAvKiBGb3Igc29tZSBpb2N0bHMsIG1ha2Ugc3VyZSB0aGF0IHRoZSBwaSBwb2ludGVyIG1hdGNoZXMgdGhlIGN1cnJlbnQgcGh5ICovCi1pbnQgd2xjX2lvY3BpY2hrKHdsY19pbmZvX3QgKndsYywgdWludCBwaHl0eXBlKQoraW50IHdsY19pb2NwaWNoayhzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdWludCBwaHl0eXBlKQogewogCWlmICh3bGMtPmJhbmQtPnBoeXR5cGUgIT0gcGh5dHlwZSkKIAkJcmV0dXJuIEJDTUVfQkFEQkFORDsKQEAgLTQ0NzQsMjEgKzQyNzUsMjEgQEAKIH0KIAogLyogc2ltcGxpZmllZCBpbnRlZ2VyIGdldCBpbnRlcmZhY2UgZm9yIGNvbW1vbiBXTENfR0VUX1ZBUiBpb2N0bCBoYW5kbGVyICovCi1pbnQgd2xjX2lvdmFyX2dldGludCh3bGNfaW5mb190ICp3bGMsIGNvbnN0IGNoYXIgKm5hbWUsIGludCAqYXJnKQoraW50IHdsY19pb3Zhcl9nZXRpbnQoc3RydWN0IHdsY19pbmZvICp3bGMsIGNvbnN0IGNoYXIgKm5hbWUsIGludCAqYXJnKQogewogCXJldHVybiB3bGNfaW92YXJfb3Aod2xjLCBuYW1lLCBOVUxMLCAwLCBhcmcsIHNpemVvZihzMzIpLCBJT1ZfR0VULAogCQkJICAgIE5VTEwpOwogfQogCiAvKiBzaW1wbGlmaWVkIGludGVnZXIgc2V0IGludGVyZmFjZSBmb3IgY29tbW9uIFdMQ19TRVRfVkFSIGlvY3RsIGhhbmRsZXIgKi8KLWludCB3bGNfaW92YXJfc2V0aW50KHdsY19pbmZvX3QgKndsYywgY29uc3QgY2hhciAqbmFtZSwgaW50IGFyZykKK2ludCB3bGNfaW92YXJfc2V0aW50KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgYXJnKQogewogCXJldHVybiB3bGNfaW92YXJfb3Aod2xjLCBuYW1lLCBOVUxMLCAwLCAodm9pZCAqKSZhcmcsIHNpemVvZihhcmcpLAogCQkJICAgIElPVl9TRVQsIE5VTEwpOwogfQogCiAvKiBzaW1wbGlmaWVkIHM4IGdldCBpbnRlcmZhY2UgZm9yIGNvbW1vbiBXTENfR0VUX1ZBUiBpb2N0bCBoYW5kbGVyICovCi1pbnQgd2xjX2lvdmFyX2dldHM4KHdsY19pbmZvX3QgKndsYywgY29uc3QgY2hhciAqbmFtZSwgczggKmFyZykKK2ludCB3bGNfaW92YXJfZ2V0czgoc3RydWN0IHdsY19pbmZvICp3bGMsIGNvbnN0IGNoYXIgKm5hbWUsIHM4ICphcmcpCiB7CiAJaW50IGlvdmFyX2ludDsKIAlpbnQgZXJyOwpAQCAtNDUwNywxMSArNDMwOCwxMSBAQAogICogY2FsbGluZyBmdW5jdGlvbiBtdXN0IGtlZXAgJ2lvdmFycycgdW50aWwgd2xjX21vZHVsZV91bnJlZ2lzdGVyIGlzIGNhbGxlZC4KICAqICdpb3ZhcicgbXVzdCBoYXZlIHRoZSBsYXN0IGVudHJ5J3MgbmFtZSBmaWVsZCBiZWluZyBOVUxMIGFzIHRlcm1pbmF0b3IuCiAgKi8KLWludCB3bGNfbW9kdWxlX3JlZ2lzdGVyKHdsY19wdWJfdCAqcHViLCBjb25zdCBiY21faW92YXJfdCAqaW92YXJzLAoraW50IHdsY19tb2R1bGVfcmVnaXN0ZXIoc3RydWN0IHdsY19wdWIgKnB1YiwgY29uc3QgYmNtX2lvdmFyX3QgKmlvdmFycywKIAkJCWNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmhkbCwgaW92YXJfZm5fdCBpX2ZuLAogCQkJd2F0Y2hkb2dfZm5fdCB3X2ZuLCBkb3duX2ZuX3QgZF9mbikKIHsKLQl3bGNfaW5mb190ICp3bGMgPSAod2xjX2luZm9fdCAqKSBwdWItPndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IChzdHJ1Y3Qgd2xjX2luZm8gKikgcHViLT53bGM7CiAJaW50IGk7CiAKIAlBU1NFUlQobmFtZSAhPSBOVUxMKTsKQEAgLTQ1MzcsOSArNDMzOCw5IEBACiB9CiAKIC8qIHVucmVnaXN0ZXIgbW9kdWxlIGNhbGxiYWNrcyAqLwotaW50IHdsY19tb2R1bGVfdW5yZWdpc3Rlcih3bGNfcHViX3QgKnB1YiwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqaGRsKQoraW50IHdsY19tb2R1bGVfdW5yZWdpc3RlcihzdHJ1Y3Qgd2xjX3B1YiAqcHViLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpoZGwpCiB7Ci0Jd2xjX2luZm9fdCAqd2xjID0gKHdsY19pbmZvX3QgKikgcHViLT53bGM7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSAoc3RydWN0IHdsY19pbmZvICopIHB1Yi0+d2xjOwogCWludCBpOwogCiAJaWYgKHdsYyA9PSBOVUxMKQpAQCAtNDU1MCw3ICs0MzUxLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgV0xDX01BWE1PRFVMRVM7IGkrKykgewogCQlpZiAoIXN0cmNtcCh3bGMtPm1vZHVsZWNiW2ldLm5hbWUsIG5hbWUpICYmCiAJCSAgICAod2xjLT5tb2R1bGVjYltpXS5oZGwgPT0gaGRsKSkgewotCQkJYnplcm8oJndsYy0+bW9kdWxlY2JbaV0sIHNpemVvZihtb2R1bGVjYl90KSk7CisJCQltZW1zZXQoJndsYy0+bW9kdWxlY2JbaV0sIDAsIHNpemVvZihtb2R1bGVjYl90KSk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KQEAgLTQ1NjAsNyArNDM2MSw3IEBACiB9CiAKIC8qIFdyaXRlIFdNRSB0dW5hYmxlIHBhcmFtZXRlcnMgZm9yIHJldHJhbnNtaXQvbWF4IHJhdGUgZnJvbSB3bGMgc3RydWN0IHRvIHVjb2RlICovCi1zdGF0aWMgdm9pZCB3bGNfd21lX3JldHJpZXNfd3JpdGUod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIHZvaWQgd2xjX3dtZV9yZXRyaWVzX3dyaXRlKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCWludCBhYzsKIApAQCAtNDU4Miw3ICs0MzgzLDcgQEAKICAqIEFsbCBwb2ludGVycyBtYXkgcG9pbnQgaW50byB0aGUgc2FtZSBidWZmZXIuCiAgKi8KIGludAotd2xjX2lvdmFyX29wKHdsY19pbmZvX3QgKndsYywgY29uc3QgY2hhciAqbmFtZSwKK3dsY19pb3Zhcl9vcChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgY29uc3QgY2hhciAqbmFtZSwKIAkgICAgIHZvaWQgKnBhcmFtcywgaW50IHBfbGVuLCB2b2lkICphcmcsIGludCBsZW4sCiAJICAgICBib29sIHNldCwgc3RydWN0IHdsY19pZiAqd2xjaWYpCiB7CkBAIC00NjA2LDggKzQ0MDcsOCBAQAogCiAJaWYgKCFzZXQgJiYgKGxlbiA9PSBzaXplb2YoaW50KSkgJiYKIAkgICAgIShJU19BTElHTkVEKCh1bnNpZ25lZCBsb25nKShhcmcpLCAodWludCkgc2l6ZW9mKGludCkpKSkgewotCQlXTF9FUlJPUigoIndsJWQ6ICVzIHVuYWxpZ25lZCBnZXQgcHRyIGZvciAlc1xuIiwKLQkJCSAgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fLCBuYW1lKSk7CisJCVdMX0VSUk9SKCJ3bCVkOiAlcyB1bmFsaWduZWQgZ2V0IHB0ciBmb3IgJXNcbiIsCisJCQkgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fLCBuYW1lKTsKIAkJQVNTRVJUKDApOwogCX0KIApAQCAtNDYyMiwxMSArNDQyMyw2IEBACiAJLyogaW92YXIgbmFtZSBub3QgZm91bmQgKi8KIAlpZiAoaSA+PSBXTENfTUFYTU9EVUxFUykgewogCQllcnIgPSBCQ01FX1VOU1VQUE9SVEVEOwotI2lmZGVmIFdMQ19ISUdIX09OTFkKLQkJZXJyID0KLQkJICAgIGJjbXNkaF9pb3Zhcl9vcCh3bGMtPmJ0cGFyYW0sIG5hbWUsIHBhcmFtcywgcF9sZW4sIGFyZywgbGVuLAotCQkJCSAgICBzZXQpOwotI2VuZGlmCiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTQ2NTgsMTAgKzQ0NTQsMTAgQEAKIH0KIAogaW50Ci13bGNfaW92YXJfY2hlY2sod2xjX3B1Yl90ICpwdWIsIGNvbnN0IGJjbV9pb3Zhcl90ICp2aSwgdm9pZCAqYXJnLCBpbnQgbGVuLAord2xjX2lvdmFyX2NoZWNrKHN0cnVjdCB3bGNfcHViICpwdWIsIGNvbnN0IGJjbV9pb3Zhcl90ICp2aSwgdm9pZCAqYXJnLCBpbnQgbGVuLAogCQlib29sIHNldCkKIHsKLQl3bGNfaW5mb190ICp3bGMgPSAod2xjX2luZm9fdCAqKSBwdWItPndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IChzdHJ1Y3Qgd2xjX2luZm8gKikgcHViLT53bGM7CiAJaW50IGVyciA9IDA7CiAJczMyIGludF92YWwgPSAwOwogCkBAIC00NzI5LDcgKzQ1MjUsNyBAQAogCSAgICBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpwYXJhbXMsIHVpbnQgcF9sZW4sIHZvaWQgKmFyZywgaW50IGxlbiwKIAkgICAgaW50IHZhbF9zaXplLCBzdHJ1Y3Qgd2xjX2lmICp3bGNpZikKIHsKLQl3bGNfaW5mb190ICp3bGMgPSBoZGw7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSBoZGw7CiAJd2xjX2Jzc2NmZ190ICpic3NjZmc7CiAJaW50IGVyciA9IDA7CiAJczMyIGludF92YWwgPSAwOwpAQCAtNDczOSw3ICs0NTM1LDcgQEAKIAlib29sIGJvb2xfdmFsMjsKIAl3bGNfYnNzX2luZm9fdCAqY3VycmVudF9ic3M7CiAKLQlXTF9UUkFDRSgoIndsJWQ6ICVzXG4iLCB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18pKTsKKwlXTF9UUkFDRSgid2wlZDogJXNcbiIsIHdsYy0+cHViLT51bml0LCBfX2Z1bmNfXyk7CiAKIAlic3NjZmcgPSBOVUxMOwogCWN1cnJlbnRfYnNzID0gTlVMTDsKQEAgLTQ3NjIsOCArNDU1OCw4IEBACiAJYm9vbF92YWwgPSAoaW50X3ZhbCAhPSAwKSA/IHRydWUgOiBmYWxzZTsKIAlib29sX3ZhbDIgPSAoaW50X3ZhbDIgIT0gMCkgPyB0cnVlIDogZmFsc2U7CiAKLQlXTF9UUkFDRSgoIndsJWQ6ICVzOiBpZCAlZFxuIiwgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fLAotCQkgIElPVl9JRChhY3Rpb25pZCkpKTsKKwlXTF9UUkFDRSgid2wlZDogJXM6IGlkICVkXG4iLAorCQkgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fLCBJT1ZfSUQoYWN0aW9uaWQpKTsKIAkvKiBEbyB0aGUgYWN0dWFsIHBhcmFtZXRlciBpbXBsZW1lbnRhdGlvbiAqLwogCXN3aXRjaCAoYWN0aW9uaWQpIHsKIApAQCAtNDgyMSw3ICs0NjE3LDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlXTF9FUlJPUigoIndsJWQ6ICVzOiB1bnN1cHBvcnRlZFxuIiwgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCJ3bCVkOiAlczogdW5zdXBwb3J0ZWRcbiIsIHdsYy0+cHViLT51bml0LCBfX2Z1bmNfXyk7CiAJCWVyciA9IEJDTUVfVU5TVVBQT1JURUQ7CiAJCWJyZWFrOwogCX0KQEAgLTQ4MzMsNyArNDYyOSw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLXdsY19pb3Zhcl9yYW5nZWNoZWNrKHdsY19pbmZvX3QgKndsYywgdTMyIHZhbCwgY29uc3QgYmNtX2lvdmFyX3QgKnZpKQord2xjX2lvdmFyX3JhbmdlY2hlY2soc3RydWN0IHdsY19pbmZvICp3bGMsIHUzMiB2YWwsIGNvbnN0IGJjbV9pb3Zhcl90ICp2aSkKIHsKIAlpbnQgZXJyID0gMDsKIAl1MzIgbWluX3ZhbCA9IDA7CkBAIC00OTMwLDcgKzQ3MjYsNyBAQAogI2RlZmluZSBNQUNTVEFUVVBEKG5hbWUpIFwKIAl3bGNfY3RydXBkX2NhY2hlKG1hY3N0YXRzLm5hbWUsICZ3bGMtPmNvcmUtPm1hY3N0YXRfc25hcHNob3QtPm5hbWUsICZ3bGMtPnB1Yi0+X2NudC0+bmFtZSkKIAotdm9pZCB3bGNfc3RhdHN1cGQod2xjX2luZm9fdCAqd2xjKQordm9pZCB3bGNfc3RhdHN1cGQoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJaW50IGk7CiAjaWZkZWYgQkNNREJHCkBAIC00OTU2LDggKzQ3NTIsOCBAQAogCS8qIGNoZWNrIGZvciByeCBmaWZvIDAgb3ZlcmZsb3cgKi8KIAlkZWx0YSA9ICh1MTYpICh3bGMtPmNvcmUtPm1hY3N0YXRfc25hcHNob3QtPnJ4ZjBvdmZsIC0gcnhmMG92ZmwpOwogCWlmIChkZWx0YSkKLQkJV0xfRVJST1IoKCJ3bCVkOiAldSByeCBmaWZvIDAgb3ZlcmZsb3dzIVxuIiwgd2xjLT5wdWItPnVuaXQsCi0JCQkgIGRlbHRhKSk7CisJCVdMX0VSUk9SKCJ3bCVkOiAldSByeCBmaWZvIDAgb3ZlcmZsb3dzIVxuIiwKKwkJCSB3bGMtPnB1Yi0+dW5pdCwgZGVsdGEpOwogCiAJLyogY2hlY2sgZm9yIHR4IGZpZm8gdW5kZXJmbG93cyAqLwogCWZvciAoaSA9IDA7IGkgPCBORklGTzsgaSsrKSB7CkBAIC00OTY1LDggKzQ3NjEsOCBAQAogCQkgICAgKHUxNikgKHdsYy0+Y29yZS0+bWFjc3RhdF9zbmFwc2hvdC0+dHhmdW5mbFtpXSAtCiAJCQkgICAgICB0eGZ1bmZsW2ldKTsKIAkJaWYgKGRlbHRhKQotCQkJV0xfRVJST1IoKCJ3bCVkOiAldSB0eCBmaWZvICVkIHVuZGVyZmxvd3MhXG4iLAotCQkJCSAgd2xjLT5wdWItPnVuaXQsIGRlbHRhLCBpKSk7CisJCQlXTF9FUlJPUigid2wlZDogJXUgdHggZmlmbyAlZCB1bmRlcmZsb3dzIVxuIiwKKwkJCQkgd2xjLT5wdWItPnVuaXQsIGRlbHRhLCBpKTsKIAl9CiAjZW5kaWYJCQkJLyogQkNNREJHICovCiAKQEAgLTUwMTUsNyArNDgxMSw3IEBACiBib29sIHdsY19jaGlwbWF0Y2godTE2IHZlbmRvciwgdTE2IGRldmljZSkKIHsKIAlpZiAodmVuZG9yICE9IFZFTkRPUl9CUk9BRENPTSkgewotCQlXTF9FUlJPUigoIndsY19jaGlwbWF0Y2g6IHVua25vd24gdmVuZG9yIGlkICUwNHhcbiIsIHZlbmRvcikpOworCQlXTF9FUlJPUigid2xjX2NoaXBtYXRjaDogdW5rbm93biB2ZW5kb3IgaWQgJTA0eFxuIiwgdmVuZG9yKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIApAQCAtNTAyNyw3ICs0ODIzLDcgQEAKIAlpZiAoKGRldmljZSA9PSBCQ000MzIzNl9EMTFOX0lEKSB8fCAoZGV2aWNlID09IEJDTTQzMjM2X0QxMU4yR19JRCkpCiAJCXJldHVybiB0cnVlOwogCi0JV0xfRVJST1IoKCJ3bGNfY2hpcG1hdGNoOiB1bmtub3duIGRldmljZSBpZCAlMDR4XG4iLCBkZXZpY2UpKTsKKwlXTF9FUlJPUigid2xjX2NoaXBtYXRjaDogdW5rbm93biBkZXZpY2UgaWQgJTA0eFxuIiwgZGV2aWNlKTsKIAlyZXR1cm4gZmFsc2U7CiB9CiAKQEAgLTUxODIsMjAgKzQ5NzgsMTIgQEAKIH0KICNlbmRpZgkJCQkvKiBkZWZpbmVkKEJDTURCRykgKi8KIAotdTE2IHdsY19yYXRlX3NobV9vZmZzZXQod2xjX2luZm9fdCAqd2xjLCB1OCByYXRlKQordTE2IHdsY19yYXRlX3NobV9vZmZzZXQoc3RydWN0IHdsY19pbmZvICp3bGMsIHU4IHJhdGUpCiB7CiAJcmV0dXJuIHdsY19ibWFjX3JhdGVfc2htX29mZnNldCh3bGMtPmh3LCByYXRlKTsKIH0KIAogLyogQ2FsbGJhY2sgZm9yIGRldmljZSByZW1vdmVkICovCi0jaWYgZGVmaW5lZChXTENfSElHSF9PTkxZKQotdm9pZCB3bGNfZGV2aWNlX3JlbW92ZWQodm9pZCAqYXJnKQotewotCXdsY19pbmZvX3QgKndsYyA9ICh3bGNfaW5mb190ICopIGFyZzsKLQotCXdsYy0+ZGV2aWNlX3ByZXNlbnQgPSBmYWxzZTsKLX0KLSNlbmRpZgkJCQkvKiBXTENfSElHSF9PTkxZICovCiAKIC8qCiAgKiBBdHRlbXB0cyB0byBxdWV1ZSBhIHBhY2tldCBvbnRvIGEgbXVsdGlwbGUtcHJlY2VkZW5jZSBxdWV1ZSwKQEAgLTUyMDcsMTYgKzQ5OTUsMTYgQEAKICAqIFJldHVybnMgdHJ1ZSBpZiBwYWNrZXQgY29uc3VtZWQgKHF1ZXVlZCksIGZhbHNlIGlmIG5vdC4KICAqLwogYm9vbCBCQ01GQVNUUEFUSAotd2xjX3ByZWNfZW5xKHdsY19pbmZvX3QgKndsYywgc3RydWN0IHBrdHEgKnEsIHZvaWQgKnBrdCwgaW50IHByZWMpCit3bGNfcHJlY19lbnEoc3RydWN0IHdsY19pbmZvICp3bGMsIHN0cnVjdCBwa3RxICpxLCB2b2lkICpwa3QsIGludCBwcmVjKQogewogCXJldHVybiB3bGNfcHJlY19lbnFfaGVhZCh3bGMsIHEsIHBrdCwgcHJlYywgZmFsc2UpOwogfQogCiBib29sIEJDTUZBU1RQQVRICi13bGNfcHJlY19lbnFfaGVhZCh3bGNfaW5mb190ICp3bGMsIHN0cnVjdCBwa3RxICpxLCB2b2lkICpwa3QsIGludCBwcmVjLAotCQkgIGJvb2wgaGVhZCkKK3dsY19wcmVjX2VucV9oZWFkKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBzdHJ1Y3QgcGt0cSAqcSwgc3RydWN0IHNrX2J1ZmYgKnBrdCwKKwkJICBpbnQgcHJlYywgYm9vbCBoZWFkKQogewotCXZvaWQgKnA7CisJc3RydWN0IHNrX2J1ZmYgKnA7CiAJaW50IGVwcmVjID0gLTE7CQkvKiBwcmVjZWRlbmNlIHRvIGV2aWN0IGZyb20gKi8KIAogCS8qIERldGVybWluZSBwcmVjZWRlbmNlIGZyb20gd2hpY2ggdG8gZXZpY3QgcGFja2V0LCBpZiBhbnkgKi8KQEAgLTUyMjYsOCArNTAxNCw4IEBACiAJCXAgPSBwa3RxX3BlZWtfdGFpbChxLCAmZXByZWMpOwogCQlBU1NFUlQocCAhPSBOVUxMKTsKIAkJaWYgKGVwcmVjID4gcHJlYykgewotCQkJV0xfRVJST1IoKCIlczogRmFpbGluZzogZXByZWMgJWQgPiBwcmVjICVkXG4iLCBfX2Z1bmNfXywKLQkJCQkgIGVwcmVjLCBwcmVjKSk7CisJCQlXTF9FUlJPUigiJXM6IEZhaWxpbmc6IGVwcmVjICVkID4gcHJlYyAlZFxuIiwKKwkJCQkgX19mdW5jX18sIGVwcmVjLCBwcmVjKTsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQogCX0KQEAgLTUyNDMsOCArNTAzMSw4IEBACiAKIAkJLyogUmVmdXNlIG5ld2VyIHBhY2tldCB1bmxlc3MgY29uZmlndXJlZCB0byBkaXNjYXJkIG9sZGVzdCAqLwogCQlpZiAoZXByZWMgPT0gcHJlYyAmJiAhZGlzY2FyZF9vbGRlc3QpIHsKLQkJCVdMX0VSUk9SKCgiJXM6IE5vIHdoZXJlIHRvIGdvLCBwcmVjID09ICVkXG4iLCBfX2Z1bmNfXywKLQkJCQkgIHByZWMpKTsKKwkJCVdMX0VSUk9SKCIlczogTm8gd2hlcmUgdG8gZ28sIHByZWMgPT0gJWRcbiIsCisJCQkJIF9fZnVuY19fLCBwcmVjKTsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQogCkBAIC01MjU2LDE0ICs1MDQ0LDE0IEBACiAJCS8qIEluY3JlbWVudCB3bWUgc3RhdHMgKi8KIAkJaWYgKFdNRV9FTkFCKHdsYy0+cHViKSkgewogCQkJV0xDTlRJTkNSKHdsYy0+cHViLT5fd21lX2NudC0+Ci0JCQkJICB0eF9mYWlsZWRbV01FX1BSSU8yQUMoUEtUUFJJTyhwKSldLnBhY2tldHMpOworCQkJCSAgdHhfZmFpbGVkW1dNRV9QUklPMkFDKHAtPnByaW9yaXR5KV0ucGFja2V0cyk7CiAJCQlXTENOVEFERCh3bGMtPnB1Yi0+X3dtZV9jbnQtPgotCQkJCSB0eF9mYWlsZWRbV01FX1BSSU8yQUMoUEtUUFJJTyhwKSldLmJ5dGVzLAorCQkJCSB0eF9mYWlsZWRbV01FX1BSSU8yQUMocC0+cHJpb3JpdHkpXS5ieXRlcywKIAkJCQkgcGt0dG90bGVuKHdsYy0+b3NoLCBwKSk7CiAJCX0KIAogCQlBU1NFUlQoMCk7Ci0JCVBLVEZSRUUod2xjLT5vc2gsIHAsIHRydWUpOworCQlwa3RfYnVmX2ZyZWVfc2tiKHdsYy0+b3NoLCBwLCB0cnVlKTsKIAkJV0xDTlRJTkNSKHdsYy0+cHViLT5fY250LT50eG5vYnVmKTsKIAl9CiAKQEAgLTUyNzcsMjUgKzUwNjUsMjYgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCBCQ01GQVNUUEFUSCB3bGNfdHhxX2VucSh2b2lkICpjdHgsIHN0cnVjdCBzY2IgKnNjYiwgdm9pZCAqc2R1LCB1aW50IHByZWMpCit2b2lkIEJDTUZBU1RQQVRIIHdsY190eHFfZW5xKHZvaWQgKmN0eCwgc3RydWN0IHNjYiAqc2NiLCBzdHJ1Y3Qgc2tfYnVmZiAqc2R1LAorCQkJICAgICB1aW50IHByZWMpCiB7Ci0Jd2xjX2luZm9fdCAqd2xjID0gKHdsY19pbmZvX3QgKikgY3R4OworCXN0cnVjdCB3bGNfaW5mbyAqd2xjID0gKHN0cnVjdCB3bGNfaW5mbyAqKSBjdHg7CiAJd2xjX3R4cV9pbmZvX3QgKnFpID0gd2xjLT5hY3RpdmVfcXVldWU7CS8qIENoZWNrIG1lICovCiAJc3RydWN0IHBrdHEgKnEgPSAmcWktPnE7CiAJaW50IHByaW87CiAKLQlwcmlvID0gUEtUUFJJTyhzZHUpOworCXByaW8gPSBzZHUtPnByaW9yaXR5OwogCiAJQVNTRVJUKHBrdHFfbWF4KHEpID49IHdsYy0+cHViLT50dW5hYmxlcy0+ZGF0YWhpd2F0KTsKIAogCWlmICghd2xjX3ByZWNfZW5xKHdsYywgcSwgc2R1LCBwcmVjKSkgewogCQlpZiAoIUVEQ0ZfRU5BQih3bGMtPnB1YikKIAkJICAgIHx8ICh3bGMtPnB1Yi0+d2xmZWF0dXJlZmxhZyAmIFdMX1NXRkxfRkxPV0NPTlRST0wpKQotCQkJV0xfRVJST1IoKCJ3bCVkOiB3bGNfdHhxX2VucTogdHhxIG92ZXJmbG93XG4iLAotCQkJCSAgd2xjLT5wdWItPnVuaXQpKTsKKwkJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfdHhxX2VucTogdHhxIG92ZXJmbG93XG4iLAorCQkJCSB3bGMtPnB1Yi0+dW5pdCk7CiAKIAkJLyogQVNTRVJUKDkgPT0gOCk7ICovLyogWFhYIHdlIG1pZ2h0IGhpdCB0aGlzIGNvbmR0aW9uIGluIGNhc2UgcGFja2V0IGZsb29kaW5nIGZyb20gbWFjODAyMTEgc3RhY2sgKi8KLQkJUEtURlJFRSh3bGMtPm9zaCwgc2R1LCB0cnVlKTsKKwkJcGt0X2J1Zl9mcmVlX3NrYih3bGMtPm9zaCwgc2R1LCB0cnVlKTsKIAkJV0xDTlRJTkNSKHdsYy0+cHViLT5fY250LT50eG5vYnVmKTsKIAl9CiAKQEAgLTUzMTcsMTMgKzUxMDYsMTQgQEAKIH0KIAogYm9vbCBCQ01GQVNUUEFUSAotd2xjX3NlbmRwa3RfbWFjODAyMTEod2xjX2luZm9fdCAqd2xjLCB2b2lkICpzZHUsIHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQord2xjX3NlbmRwa3RfbWFjODAyMTEoc3RydWN0IHdsY19pbmZvICp3bGMsIHN0cnVjdCBza19idWZmICpzZHUsCisJCSAgICAgc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCiB7CiAJdTggcHJpbzsKIAl1aW50IGZpZm87CiAJdm9pZCAqcGt0OwogCXN0cnVjdCBzY2IgKnNjYiA9ICZnbG9iYWxfc2NiOwotCXN0cnVjdCBkb3QxMV9oZWFkZXIgKmQxMV9oZWFkZXIgPSAoc3RydWN0IGRvdDExX2hlYWRlciAqKVBLVERBVEEoc2R1KTsKKwlzdHJ1Y3QgZG90MTFfaGVhZGVyICpkMTFfaGVhZGVyID0gKHN0cnVjdCBkb3QxMV9oZWFkZXIgKikoc2R1LT5kYXRhKTsKIAl1MTYgdHlwZSwgZmM7CiAKIAlBU1NFUlQoc2R1KTsKQEAgLTUzMzIsMTMgKzUxMjIsMTMgQEAKIAl0eXBlID0gRkNfVFlQRShmYyk7CiAKIAkvKiA4MDIuMTEgc3RhbmRhcmQgcmVxdWlyZXMgbWFuYWdlbWVudCB0cmFmZmljIHRvIGdvIGF0IGhpZ2hlc3QgcHJpb3JpdHkgKi8KLQlwcmlvID0gKHR5cGUgPT0gRkNfVFlQRV9EQVRBID8gUEtUUFJJTyhzZHUpIDogTUFYUFJJTyk7CisJcHJpbyA9ICh0eXBlID09IEZDX1RZUEVfREFUQSA/IHNkdS0+cHJpb3JpdHkgOiBNQVhQUklPKTsKIAlmaWZvID0gcHJpbzJmaWZvW3ByaW9dOwogCi0JQVNTRVJUKCh1aW50KSBQS1RIRUFEUk9PTShzZHUpID49IFRYT0ZGKTsKLQlBU1NFUlQoIVBLVFNIQVJFRChzZHUpKTsKLQlBU1NFUlQoIVBLVE5FWFQoc2R1KSk7Ci0JQVNTRVJUKCFQS1RMSU5LKHNkdSkpOworCUFTU0VSVCgodWludCkgc2tiX2hlYWRyb29tKHNkdSkgPj0gVFhPRkYpOworCUFTU0VSVCghKHNkdS0+Y2xvbmVkKSk7CisJQVNTRVJUKCEoc2R1LT5uZXh0KSk7CisJQVNTRVJUKCEoc2R1LT5wcmV2KSk7CiAJQVNTRVJUKGZpZm8gPCBORklGTyk7CiAKIAlwa3QgPSBzZHU7CkBAIC01MzUyLDkgKzUxNDIsOSBAQAogCXJldHVybiAwOwogfQogCi12b2lkIEJDTUZBU1RQQVRIIHdsY19zZW5kX3Eod2xjX2luZm9fdCAqd2xjLCB3bGNfdHhxX2luZm9fdCAqcWkpCit2b2lkIEJDTUZBU1RQQVRIIHdsY19zZW5kX3Eoc3RydWN0IHdsY19pbmZvICp3bGMsIHdsY190eHFfaW5mb190ICpxaSkKIHsKLQl2b2lkICpwa3RbRE9UMTFfTUFYTlVNRlJBR1NdOworCXN0cnVjdCBza19idWZmICpwa3RbRE9UMTFfTUFYTlVNRlJBR1NdOwogCWludCBwcmVjOwogCXUxNiBwcmVjX21hcDsKIAlpbnQgZXJyID0gMCwgaSwgY291bnQ7CkBAIC01NDI3LDcgKzUyMTcsNyBAQAogICogZm9yIE1DIGZyYW1lcyBzbyBpcyB1c2VkIGFzIHBhcnQgb2YgdGhlIHNlcXVlbmNlIG51bWJlci4KICAqLwogc3RhdGljIGlubGluZSB1MTYKLWJjbWNfZmlkX2dlbmVyYXRlKHdsY19pbmZvX3QgKndsYywgd2xjX2Jzc2NmZ190ICpic3NjZmcsIGQxMXR4aF90ICp0eGgpCitiY21jX2ZpZF9nZW5lcmF0ZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgd2xjX2Jzc2NmZ190ICpic3NjZmcsIGQxMXR4aF90ICp0eGgpCiB7CiAJdTE2IGZyYW1laWQ7CiAKQEAgLTU0NDEsMTMgKzUyMzEsMTQgQEAKIH0KIAogdm9pZCBCQ01GQVNUUEFUSAotd2xjX3R4Zmlmbyh3bGNfaW5mb190ICp3bGMsIHVpbnQgZmlmbywgdm9pZCAqcCwgYm9vbCBjb21taXQsIHM4IHR4cGt0cGVuZCkKK3dsY190eGZpZm8oc3RydWN0IHdsY19pbmZvICp3bGMsIHVpbnQgZmlmbywgc3RydWN0IHNrX2J1ZmYgKnAsIGJvb2wgY29tbWl0LAorCSAgIHM4IHR4cGt0cGVuZCkKIHsKIAl1MTYgZnJhbWVpZCA9IElOVkFMSURGSUQ7CiAJZDExdHhoX3QgKnR4aDsKIAogCUFTU0VSVChmaWZvIDwgTkZJRk8pOwotCXR4aCA9IChkMTF0eGhfdCAqKSBQS1REQVRBKHApOworCXR4aCA9IChkMTF0eGhfdCAqKSAocC0+ZGF0YSk7CiAKIAkvKiBXaGVuIGEgQkMvTUMgZnJhbWUgaXMgYmVpbmcgY29tbWl0dGVkIHRvIHRoZSBCQ01DIGZpZm8gdmlhIERNQSAoTk9UIFBJTyksIHVwZGF0ZQogCSAqIHVjb2RlIG9yIEJTUyBpbmZvIGFzIGFwcHJvcHJpYXRlLgpAQCAtNTQ2MCwyMSArNTI1MSwxNCBAQAogCWlmIChXTENfV0FSMTYxNjUod2xjKSkKIAkJd2xjX3dhcjE2MTY1KHdsYywgdHJ1ZSk7CiAKLSNpZmRlZiBXTENfSElHSF9PTkxZCi0JaWYgKFJQQ1RYX0VOQUIod2xjLT5wdWIpKSB7Ci0JCSh2b2lkKXdsY19ycGN0eF90eCh3bGMtPnJwY3R4LCBmaWZvLCBwLCBjb21taXQsIGZyYW1laWQsCi0JCQkJICAgdHhwa3RwZW5kKTsKLQkJcmV0dXJuOwotCX0KLSNlbHNlCiAKIAkvKiBCdW1wIHVwIHBlbmRpbmcgY291bnQgZm9yIGlmIG5vdCB1c2luZyBycGMuIElmIHJwYyBpcyB1c2VkLCB0aGlzIHdpbGwgYmUgaGFuZGxlZAogCSAqIGluIHdsY19ibWFjX3R4ZmlmbygpCiAJICovCiAJaWYgKGNvbW1pdCkgewogCQlUWFBLVFBFTkRJTkMod2xjLCBmaWZvLCB0eHBrdHBlbmQpOwotCQlXTF9UUkFDRSgoIndsY190eGZpZm8sIHBrdHBlbmQgaW5jICVkIHRvICVkXG4iLCB0eHBrdHBlbmQsCi0JCQkgIFRYUEtUUEVOREdFVCh3bGMsIGZpZm8pKSk7CisJCVdMX1RSQUNFKCJ3bGNfdHhmaWZvLCBwa3RwZW5kIGluYyAlZCB0byAlZFxuIiwKKwkJCSB0eHBrdHBlbmQsIFRYUEtUUEVOREdFVCh3bGMsIGZpZm8pKTsKIAl9CiAKIAkvKiBDb21taXQgQkNNQyBzZXF1ZW5jZSBudW1iZXIgaW4gdGhlIFNITSBmcmFtZSBJRCBsb2NhdGlvbiAqLwpAQCAtNTQ4MiwxMyArNTI2NiwxMiBAQAogCQlCQ01DRklEKHdsYywgZnJhbWVpZCk7CiAKIAlpZiAoZG1hX3R4ZmFzdCh3bGMtPmh3LT5kaVtmaWZvXSwgcCwgY29tbWl0KSA8IDApIHsKLQkJV0xfRVJST1IoKCJ3bGNfdHhmaWZvOiBmYXRhbCwgdG9zcyBmcmFtZXMgISEhXG4iKSk7CisJCVdMX0VSUk9SKCJ3bGNfdHhmaWZvOiBmYXRhbCwgdG9zcyBmcmFtZXMgISEhXG4iKTsKIAl9Ci0jZW5kaWYJCQkJLyogV0xDX0hJR0hfT05MWSAqLwogfQogCiBzdGF0aWMgdTE2Ci13bGNfY29tcHV0ZV9haXJ0aW1lKHdsY19pbmZvX3QgKndsYywgcmF0ZXNwZWNfdCByc3BlYywgdWludCBsZW5ndGgpCit3bGNfY29tcHV0ZV9haXJ0aW1lKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCByYXRlc3BlY190IHJzcGVjLCB1aW50IGxlbmd0aCkKIHsKIAl1MTYgdXNlYyA9IDA7CiAJdWludCBtYWNfcmF0ZSA9IFJTUEVDMlJBVEUocnNwZWMpOwpAQCAtNTUyMyw3ICs1MzA2LDggQEAKIAkJCXVzZWMgPSAobGVuZ3RoIDw8IDMpIC8gMTE7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCVdMX0VSUk9SKCgid2wlZDogd2xjX2NvbXB1dGVfYWlydGltZTogdW5zdXBwb3J0ZWQgcnNwZWMgMHgleFxuIiwgd2xjLT5wdWItPnVuaXQsIHJzcGVjKSk7CisJCQlXTF9FUlJPUigid2wlZDogd2xjX2NvbXB1dGVfYWlydGltZTogdW5zdXBwb3J0ZWQgcnNwZWMgMHgleFxuIiwKKwkJCQkgd2xjLT5wdWItPnVuaXQsIHJzcGVjKTsKIAkJCUFTU0VSVCgoY29uc3QgY2hhciAqKSJCYWQgcGh5X3JhdGUiID09IE5VTEwpOwogCQkJYnJlYWs7CiAJCX0KQEAgLTU1MzMsNyArNTMxNyw3IEBACiB9CiAKIHZvaWQgQkNNRkFTVFBBVEgKLXdsY19jb21wdXRlX3BsY3Aod2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJzcGVjLCB1aW50IGxlbmd0aCwgdTggKnBsY3ApCit3bGNfY29tcHV0ZV9wbGNwKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCByYXRlc3BlY190IHJzcGVjLCB1aW50IGxlbmd0aCwgdTggKnBsY3ApCiB7CiAJaWYgKElTX01DUyhyc3BlYykpIHsKIAkJd2xjX2NvbXB1dGVfbWltb19wbGNwKHJzcGVjLCBsZW5ndGgsIHBsY3ApOwpAQCAtNTU3NCw3ICs1MzU4LDcgQEAKIAlyYXRlX3NpZ25hbCA9IHJhdGVfaW5mb1tyYXRlXSAmIFJBVEVfTUFTSzsKIAlBU1NFUlQocmF0ZV9zaWduYWwgIT0gMCk7CiAKLQliemVybyhwbGNwLCBEMTFfUEhZX0hEUl9MRU4pOworCW1lbXNldChwbGNwLCAwLCBEMTFfUEhZX0hEUl9MRU4pOwogCUQxMUFfUEhZX0hEUl9TUkFURSgob2ZkbV9waHlfaGRyX3QgKikgcGxjcCwgcmF0ZV9zaWduYWwpOwogCiAJdG1wID0gKGxlbmd0aCAmIDB4ZmZmKSA8PCA1OwpAQCAtNTYxOSw3ICs1NDAzLDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlXTF9FUlJPUigoIndsY19jY2tfcGxjcF9zZXQ6IHVuc3VwcG9ydGVkIHJhdGUgJWRcbiIsIHJhdGVfNTAwKSk7CisJCVdMX0VSUk9SKCJ3bGNfY2NrX3BsY3Bfc2V0OiB1bnN1cHBvcnRlZCByYXRlICVkXG4iLCByYXRlXzUwMCk7CiAJCXJhdGVfNTAwID0gV0xDX1JBVEVfMU07CiAJCXVzZWMgPSBsZW5ndGggPDwgMzsKIAkJYnJlYWs7CkBAIC01NjU3LDcgKzU0NDEsNyBAQAogICogcHJlYW1ibGVfdHlwZQl1c2Ugc2hvcnQvR0Ygb3IgbG9uZy9NTSBQTENQIGhlYWRlcgogICovCiBzdGF0aWMgdTE2IEJDTUZBU1RQQVRICi13bGNfY29tcHV0ZV9mcmFtZV9kdXIod2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJhdGUsIHU4IHByZWFtYmxlX3R5cGUsCit3bGNfY29tcHV0ZV9mcmFtZV9kdXIoc3RydWN0IHdsY19pbmZvICp3bGMsIHJhdGVzcGVjX3QgcmF0ZSwgdTggcHJlYW1ibGVfdHlwZSwKIAkJICAgICAgdWludCBuZXh0X2ZyYWdfbGVuKQogewogCXUxNiBkdXIsIHNpZnM7CkBAIC01NjkxLDcgKzU0NzUsNyBAQAogICogZnJhbWVfbGVuCQluZXh0IE1QRFUgZnJhbWUgbGVuZ3RoIGluIGJ5dGVzCiAgKi8KIHUxNiBCQ01GQVNUUEFUSAotd2xjX2NvbXB1dGVfcnRzY3RzX2R1cih3bGNfaW5mb190ICp3bGMsIGJvb2wgY3RzX29ubHksIHJhdGVzcGVjX3QgcnRzX3JhdGUsCit3bGNfY29tcHV0ZV9ydHNjdHNfZHVyKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBib29sIGN0c19vbmx5LCByYXRlc3BlY190IHJ0c19yYXRlLAogCQkgICAgICAgcmF0ZXNwZWNfdCBmcmFtZV9yYXRlLCB1OCBydHNfcHJlYW1ibGVfdHlwZSwKIAkJICAgICAgIHU4IGZyYW1lX3ByZWFtYmxlX3R5cGUsIHVpbnQgZnJhbWVfbGVuLCBib29sIGJhKQogewpAQCAtNTcyMiw3ICs1NTA2LDcgQEAKIAlyZXR1cm4gZHVyOwogfQogCi1zdGF0aWMgYm9vbCB3bGNfcGh5X3JzcGVjX2NoZWNrKHdsY19pbmZvX3QgKndsYywgdTE2IGJ3LCByYXRlc3BlY190IHJzcGVjKQorc3RhdGljIGJvb2wgd2xjX3BoeV9yc3BlY19jaGVjayhzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTE2IGJ3LCByYXRlc3BlY190IHJzcGVjKQogewogCWlmIChJU19NQ1MocnNwZWMpKSB7CiAJCXVpbnQgbWNzID0gcnNwZWMgJiBSU1BFQ19SQVRFX01BU0s7CkBAIC01NzQ4LDcgKzU1MzIsNyBAQAogCXJldHVybiB0cnVlOwogfQogCi11MTYgQkNNRkFTVFBBVEggd2xjX3BoeXR4Y3RsMV9jYWxjKHdsY19pbmZvX3QgKndsYywgcmF0ZXNwZWNfdCByc3BlYykKK3UxNiBCQ01GQVNUUEFUSCB3bGNfcGh5dHhjdGwxX2NhbGMoc3RydWN0IHdsY19pbmZvICp3bGMsIHJhdGVzcGVjX3QgcnNwZWMpCiB7CiAJdTE2IHBoeWN0bDEgPSAwOwogCXUxNiBidzsKQEAgLTU3NTksNyArNTU0Myw4IEBACiAJCWJ3ID0gUlNQRUNfR0VUX0JXKHJzcGVjKTsKIAkJLyogMTBNaHogaXMgbm90IHN1cHBvcnRlZCB5ZXQgKi8KIAkJaWYgKGJ3IDwgUEhZX1RYQzFfQldfMjBNSFopIHsKLQkJCVdMX0VSUk9SKCgid2xjX3BoeXR4Y3RsMV9jYWxjOiBidyAlZCBpcyBub3Qgc3VwcG9ydGVkIHlldCwgc2V0IHRvIDIwTFxuIiwgYncpKTsKKwkJCVdMX0VSUk9SKCJ3bGNfcGh5dHhjdGwxX2NhbGM6IGJ3ICVkIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LCBzZXQgdG8gMjBMXG4iLAorCQkJCSBidyk7CiAJCQlidyA9IFBIWV9UWEMxX0JXXzIwTUhaOwogCQl9CiAKQEAgLTU3ODQsNyArNTU2OSw3IEBACiAJCS8qIGdldCB0aGUgcGh5Y3RsIGJ5dGUgZnJvbSByYXRlIHBoeWNmZyB0YWJsZSAqLwogCQlwaHljZmcgPSB3bGNfcmF0ZV9sZWdhY3lfcGh5Y3RsKFJTUEVDMlJBVEUocnNwZWMpKTsKIAkJaWYgKHBoeWNmZyA9PSAtMSkgewotCQkJV0xfRVJST1IoKCJ3bGNfcGh5dHhjdGwxX2NhbGM6IHdyb25nIGxlZ2FjeSBPRkRNL0NDSyByYXRlXG4iKSk7CisJCQlXTF9FUlJPUigid2xjX3BoeXR4Y3RsMV9jYWxjOiB3cm9uZyBsZWdhY3kgT0ZETS9DQ0sgcmF0ZVxuIik7CiAJCQlBU1NFUlQoMCk7CiAJCQlwaHljZmcgPSAwOwogCQl9CkBAIC01Nzk4LDE2ICs1NTgzLDE0IEBACiAJLyogcGh5IGNsb2NrIG11c3Qgc3VwcG9ydCA0ME1oeiBpZiB0eCBkZXNjcmlwdG9yIHVzZXMgaXQgKi8KIAlpZiAoKHBoeWN0bDEgJiBQSFlfVFhDMV9CV19NQVNLKSA+PSBQSFlfVFhDMV9CV180ME1IWikgewogCQlBU1NFUlQoQ0hTUEVDX1dMQ19CVyh3bGMtPmNoYW5zcGVjKSA9PSBXTENfNDBfTUhaKTsKLSNpZm5kZWYgV0xDX0hJR0hfT05MWQogCQlBU1NFUlQod2xjLT5jaGFuc3BlYyA9PSB3bGNfcGh5X2NoYW5zcGVjX2dldCh3bGMtPmJhbmQtPnBpKSk7Ci0jZW5kaWYKIAl9CiAjZW5kaWYJCQkJLyogQkNNREJHICovCiAJcmV0dXJuIHBoeWN0bDE7CiB9CiAKIHJhdGVzcGVjX3QgQkNNRkFTVFBBVEgKLXdsY19yc3BlY190b19ydHNfcnNwZWMod2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJzcGVjLCBib29sIHVzZV9yc3BlYywKK3dsY19yc3BlY190b19ydHNfcnNwZWMoc3RydWN0IHdsY19pbmZvICp3bGMsIHJhdGVzcGVjX3QgcnNwZWMsIGJvb2wgdXNlX3JzcGVjLAogCQkgICAgICAgdTE2IG1pbW9fY3RsY2hidykKIHsKIAlyYXRlc3BlY190IHJ0c19yc3BlYyA9IDA7CkBAIC01ODYzLDE1ICs1NjQ2LDE1IEBACiAgKgogICovCiBzdGF0aWMgdTE2IEJDTUZBU1RQQVRICi13bGNfZDExaGRyc19tYWM4MDIxMSh3bGNfaW5mb190ICp3bGMsIHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkgICAgIHZvaWQgKnAsIHN0cnVjdCBzY2IgKnNjYiwgdWludCBmcmFnLAord2xjX2QxMWhkcnNfbWFjODAyMTEoc3RydWN0IHdsY19pbmZvICp3bGMsIHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkgICAgIHN0cnVjdCBza19idWZmICpwLCBzdHJ1Y3Qgc2NiICpzY2IsIHVpbnQgZnJhZywKIAkJICAgICB1aW50IG5mcmFncywgdWludCBxdWV1ZSwgdWludCBuZXh0X2ZyYWdfbGVuLAogCQkgICAgIHdzZWNfa2V5X3QgKmtleSwgcmF0ZXNwZWNfdCByc3BlY19vdmVycmlkZSkKIHsKIAlzdHJ1Y3QgZG90MTFfaGVhZGVyICpoOwogCWQxMXR4aF90ICp0eGg7CiAJdTggKnBsY3AsIHBsY3BfZmFsbGJhY2tbRDExX1BIWV9IRFJfTEVOXTsKLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCWludCBsZW4sIHBoeWxlbiwgcnRzX3BoeWxlbjsKIAl1MTYgZmMsIHR5cGUsIGZyYW1laWQsIG1jaCwgcGh5Y3RsLCB4ZnRzLCBtYWlucmF0ZXM7CiAJdTE2IHNlcSA9IDAsIG1jbCA9IDAsIHN0YXR1cyA9IDA7CkBAIC01OTExLDcgKzU2OTQsNyBAQAogCW9zaCA9IHdsYy0+b3NoOwogCiAJLyogbG9jYXRlIDgwMi4xMSBNQUMgaGVhZGVyICovCi0JaCA9IChzdHJ1Y3QgZG90MTFfaGVhZGVyICopUEtUREFUQShwKTsKKwloID0gKHN0cnVjdCBkb3QxMV9oZWFkZXIgKikocC0+ZGF0YSk7CiAJZmMgPSBsdG9oMTYoaC0+ZmMpOwogCXR5cGUgPSBGQ19UWVBFKGZjKTsKIApAQCAtNTkzNSwyOSArNTcxOCwyOSBAQAogCUFTU0VSVCh0eF9pbmZvKTsKIAogCS8qIGFkZCBQTENQICovCi0JcGxjcCA9IFBLVFBVU0gocCwgRDExX1BIWV9IRFJfTEVOKTsKKwlwbGNwID0gc2tiX3B1c2gocCwgRDExX1BIWV9IRFJfTEVOKTsKIAogCS8qIGFkZCBCcm9hZGNvbSB0eCBkZXNjcmlwdG9yIGhlYWRlciAqLwotCXR4aCA9IChkMTF0eGhfdCAqKSBQS1RQVVNIKHAsIEQxMV9UWEhfTEVOKTsKLQliemVybygoY2hhciAqKXR4aCwgRDExX1RYSF9MRU4pOworCXR4aCA9IChkMTF0eGhfdCAqKSBza2JfcHVzaChwLCBEMTFfVFhIX0xFTik7CisJbWVtc2V0KChjaGFyICopdHhoLCAwLCBEMTFfVFhIX0xFTik7CiAKIAkvKiBzZXR1cCBmcmFtZWlkICovCiAJaWYgKHR4X2luZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BU1NJR05fU0VRKSB7CiAJCS8qIG5vbi1BUCBTVEEgc2hvdWxkIG5ldmVyIHVzZSBCQ01DIHF1ZXVlICovCiAJCUFTU0VSVChxdWV1ZSAhPSBUWF9CQ01DX0ZJRk8pOwogCQlpZiAocXVldWUgPT0gVFhfQkNNQ19GSUZPKSB7Ci0JCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBBU1NFUlQgcXVldWUgPT0gVFhfQkNNQyFcbiIsCi0JCQkJICBXTENXTFVOSVQod2xjKSwgX19mdW5jX18pKTsKKwkJCVdMX0VSUk9SKCJ3bCVkOiAlczogQVNTRVJUIHF1ZXVlID09IFRYX0JDTUMhXG4iLAorCQkJCSBXTENXTFVOSVQod2xjKSwgX19mdW5jX18pOwogCQkJZnJhbWVpZCA9IGJjbWNfZmlkX2dlbmVyYXRlKHdsYywgTlVMTCwgdHhoKTsKIAkJfSBlbHNlIHsKIAkJCS8qIEluY3JlbWVudCB0aGUgY291bnRlciBmb3IgZmlyc3QgZnJhZ21lbnQgKi8KIAkJCWlmICh0eF9pbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfRklSU1RfRlJBR01FTlQpIHsKLQkJCQlTQ0JfU0VRTlVNKHNjYiwgUEtUUFJJTyhwKSkrKzsKKwkJCQlTQ0JfU0VRTlVNKHNjYiwgcC0+cHJpb3JpdHkpKys7CiAJCQl9CiAKIAkJCS8qIGV4dHJhY3QgZnJhZ21lbnQgbnVtYmVyIGZyb20gZnJhbWUgZmlyc3QgKi8KIAkJCXNlcSA9IGx0b2gxNihzZXEpICYgRlJBR05VTV9NQVNLOwotCQkJc2VxIHw9IChTQ0JfU0VRTlVNKHNjYiwgUEtUUFJJTyhwKSkgPDwgU0VRTlVNX1NISUZUKTsKKwkJCXNlcSB8PSAoU0NCX1NFUU5VTShzY2IsIHAtPnByaW9yaXR5KSA8PCBTRVFOVU1fU0hJRlQpOwogCQkJaC0+c2VxID0gaHRvbDE2KHNlcSk7CiAKIAkJCWZyYW1laWQgPSAoKHNlcSA8PCBUWEZJRF9TRVFfU0hJRlQpICYgVFhGSURfU0VRX01BU0spIHwKQEAgLTU5ODEsMTMgKzU3NjQsNiBAQAogCWlmICh0eHJhdGVbMV0tPmlkeCA8IDApIHsKIAkJdHhyYXRlWzFdID0gdHhyYXRlWzBdOwogCX0KLSNpZmRlZiBXTENfSElHSF9PTkxZCi0JLyogRG91YmxlIHByb3RlY3Rpb24gLCBqdXN0IGluIGNhc2UgKi8KLQlpZiAodHhyYXRlWzBdLT5pZHggPiBISUdIRVNUX1NJTkdMRV9TVFJFQU1fTUNTKQotCQl0eHJhdGVbMF0tPmlkeCA9IEhJR0hFU1RfU0lOR0xFX1NUUkVBTV9NQ1M7Ci0JaWYgKHR4cmF0ZVsxXS0+aWR4ID4gSElHSEVTVF9TSU5HTEVfU1RSRUFNX01DUykKLQkJdHhyYXRlWzFdLT5pZHggPSBISUdIRVNUX1NJTkdMRV9TVFJFQU1fTUNTOwotI2VuZGlmCiAKIAlmb3IgKGsgPSAwOyBrIDwgaHctPm1heF9yYXRlczsgaysrKSB7CiAJCWlzX21jc1trXSA9CkBAIC02MDM0LDcgKzU4MTAsOCBAQAogCQkJQVNTRVJUKFJTUEVDX0FDVElWRShyc3BlY1trXSkpOwogCQkJcnNwZWNba10gPSBXTENfUkFURV8xTTsKIAkJfSBlbHNlIHsKLQkJCWlmIChXTEFOVFNFTF9FTkFCKHdsYykgJiYgIUVUSEVSX0lTTVVMVEkoJmgtPmExKSkgeworCQkJaWYgKFdMQU5UU0VMX0VOQUIod2xjKSAmJgorCQkJICAgICFpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoLT5hMS5vY3RldCkpIHsKIAkJCQkvKiBzZXQgdHggYW50ZW5uYSBjb25maWcgKi8KIAkJCQl3bGNfYW50c2VsX2FudGNmZ19nZXQod2xjLT5hc2ksIGZhbHNlLCBmYWxzZSwgMCwKIAkJCQkJCSAgICAgIDAsICZhbnRjZmcsICZmYmFudGNmZyk7CkBAIC02MTMxLDcgKzU5MDgsOCBAQAogCiAJCQlpZiAoKHR4cmF0ZVtrXS0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfTUNTKQogCQkJICAgICYmICghSVNfTUNTKHJzcGVjW2tdKSkpIHsKLQkJCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBJRUVFODAyMTFfVFhfUkNfTUNTICE9IElTX01DUyhyc3BlYylcbiIsIFdMQ1dMVU5JVCh3bGMpLCBfX2Z1bmNfXykpOworCQkJCVdMX0VSUk9SKCJ3bCVkOiAlczogSUVFRTgwMjExX1RYX1JDX01DUyAhPSBJU19NQ1MocnNwZWMpXG4iLAorCQkJCQkgV0xDV0xVTklUKHdsYyksIF9fZnVuY19fKTsKIAkJCQlBU1NFUlQoMCAmJiAiUmF0ZSBtaXNtYXRjaCIpOwogCQkJfQogCkBAIC02MTk1LDcgKzU5NzMsOCBAQAogCSAgICBwbGNwWzBdOwogCiAJLyogRFVSIGZpZWxkIGZvciBtYWluIHJhdGUgKi8KLQlpZiAoKGZjICE9IEZDX1BTX1BPTEwpICYmICFFVEhFUl9JU01VTFRJKCZoLT5hMSkgJiYgIXVzZV9yaWZzKSB7CisJaWYgKChmYyAhPSBGQ19QU19QT0xMKSAmJgorCSAgICAhaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaC0+YTEub2N0ZXQpICYmICF1c2VfcmlmcykgewogCQlkdXJpZCA9CiAJCSAgICB3bGNfY29tcHV0ZV9mcmFtZV9kdXIod2xjLCByc3BlY1swXSwgcHJlYW1ibGVfdHlwZVswXSwKIAkJCQkJICBuZXh0X2ZyYWdfbGVuKTsKQEAgLTYyMTMsNyArNTk5Miw3IEBACiAJLyogRFVSIGZpZWxkIGZvciBmYWxsYmFjayByYXRlICovCiAJaWYgKGZjID09IEZDX1BTX1BPTEwpCiAJCXR4aC0+RnJhZ0R1ckZhbGxiYWNrID0gaC0+ZHVyaWQ7Ci0JZWxzZSBpZiAoRVRIRVJfSVNNVUxUSSgmaC0+YTEpIHx8IHVzZV9yaWZzKQorCWVsc2UgaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGgtPmExLm9jdGV0KSB8fCB1c2VfcmlmcykKIAkJdHhoLT5GcmFnRHVyRmFsbGJhY2sgPSAwOwogCWVsc2UgewogCQlkdXJpZCA9IHdsY19jb21wdXRlX2ZyYW1lX2R1cih3bGMsIHJzcGVjWzFdLApAQCAtNjIyNSw3ICs2MDA0LDcgQEAKIAlpZiAoZnJhZyA9PSAwKQogCQltY2wgfD0gVFhDX1NUQVJUTVNEVTsKIAotCWlmICghRVRIRVJfSVNNVUxUSSgmaC0+YTEpKQorCWlmICghaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaC0+YTEub2N0ZXQpKQogCQltY2wgfD0gVFhDX0lNTUVEQUNLOwogCiAJaWYgKEJBTkRfNUcod2xjLT5iYW5kLT5iYW5kdHlwZSkpCkBAIC02MjYwLDcgKzYwMzksNyBAQAogCXR4aC0+VHhGZXNUaW1lRmFsbGJhY2sgPSBodG9sMTYoMCk7CiAKIAkvKiBUeEZyYW1lUkEgKi8KLQliY29weSgoY2hhciAqKSZoLT5hMSwgKGNoYXIgKikmdHhoLT5UeEZyYW1lUkEsIEVUSEVSX0FERFJfTEVOKTsKKwliY29weSgoY2hhciAqKSZoLT5hMSwgKGNoYXIgKikmdHhoLT5UeEZyYW1lUkEsIEVUSF9BTEVOKTsKIAogCS8qIFR4RnJhbWVJRCAqLwogCXR4aC0+VHhGcmFtZUlEID0gaHRvbDE2KGZyYW1laWQpOwpAQCAtNjM0NywxMSArNjEyNiwxMSBAQAogCiAJCWlmICh1c2VfY3RzKSB7CiAJCQlydHMtPmZjID0gaHRvbDE2KEZDX0NUUyk7Ci0JCQliY29weSgoY2hhciAqKSZoLT5hMiwgKGNoYXIgKikmcnRzLT5yYSwgRVRIRVJfQUREUl9MRU4pOworCQkJYmNvcHkoKGNoYXIgKikmaC0+YTIsIChjaGFyICopJnJ0cy0+cmEsIEVUSF9BTEVOKTsKIAkJfSBlbHNlIHsKIAkJCXJ0cy0+ZmMgPSBodG9sMTYoKHUxNikgRkNfUlRTKTsKIAkJCWJjb3B5KChjaGFyICopJmgtPmExLCAoY2hhciAqKSZydHMtPnJhLAotCQkJICAgICAgMiAqIEVUSEVSX0FERFJfTEVOKTsKKwkJCSAgICAgIDIgKiBFVEhfQUxFTik7CiAJCX0KIAogCQkvKiBtYWlucmF0ZQpAQCAtNjM2Miw5ICs2MTQxLDEwIEBACiAJCQkgICAgICBEMTFBX1BIWV9IRFJfR1JBVEUoKG9mZG1fcGh5X2hkcl90ICopIHJ0c19wbGNwKSA6CiAJCQkgICAgICBydHNfcGxjcFswXSkgPDwgODsKIAl9IGVsc2UgewotCQliemVybygoY2hhciAqKXR4aC0+UlRTUGh5SGVhZGVyLCBEMTFfUEhZX0hEUl9MRU4pOwotCQliemVybygoY2hhciAqKSZ0eGgtPnJ0c19mcmFtZSwgc2l6ZW9mKHN0cnVjdCBkb3QxMV9ydHNfZnJhbWUpKTsKLQkJYnplcm8oKGNoYXIgKil0eGgtPlJUU1BMQ1BGYWxsYmFjaywKKwkJbWVtc2V0KChjaGFyICopdHhoLT5SVFNQaHlIZWFkZXIsIDAsIEQxMV9QSFlfSERSX0xFTik7CisJCW1lbXNldCgoY2hhciAqKSZ0eGgtPnJ0c19mcmFtZSwgMCwKKwkJCXNpemVvZihzdHJ1Y3QgZG90MTFfcnRzX2ZyYW1lKSk7CisJCW1lbXNldCgoY2hhciAqKXR4aC0+UlRTUExDUEZhbGxiYWNrLCAwLAogCQkgICAgICBzaXplb2YodHhoLT5SVFNQTENQRmFsbGJhY2spKTsKIAkJdHhoLT5SVFNEdXJGYWxsYmFjayA9IDA7CiAJfQpAQCAtNjQ1Myw3ICs2MjMzLDcgQEAKIAlpZiAoU0NCX1dNRShzY2IpICYmIHFvcyAmJiB3bGMtPmVkY2ZfdHhvcFthY10pIHsKIAkJdWludCBmcmFnX2R1ciwgZHVyLCBkdXJfZmFsbGJhY2s7CiAKLQkJQVNTRVJUKCFFVEhFUl9JU01VTFRJKCZoLT5hMSkpOworCQlBU1NFUlQoIWlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGgtPmExLm9jdGV0KSk7CiAKIAkJLyogV01FOiBVcGRhdGUgVFhPUCB0aHJlc2hvbGQgKi8KIAkJaWYgKCghKHR4X2luZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BTVBEVSkpICYmIChmcmFnID09IDApKSB7CkBAIC02NTIzLDE5ICs2MzAzLDIzIEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9IGVsc2UKLQkJCQlXTF9FUlJPUigoIndsJWQ6ICVzIHR4b3AgaW52YWxpZCBmb3IgcmF0ZSAlZFxuIiwKLQkJCQkJICB3bGMtPnB1Yi0+dW5pdCwgZmlmb19uYW1lc1txdWV1ZV0sCi0JCQkJCSAgUlNQRUMyUkFURShyc3BlY1swXSkpKTsKKwkJCQlXTF9FUlJPUigid2wlZDogJXMgdHhvcCBpbnZhbGlkIGZvciByYXRlICVkXG4iLAorCQkJCQkgd2xjLT5wdWItPnVuaXQsIGZpZm9fbmFtZXNbcXVldWVdLAorCQkJCQkgUlNQRUMyUkFURShyc3BlY1swXSkpOwogCiAJCQlpZiAoZHVyID4gd2xjLT5lZGNmX3R4b3BbYWNdKQotCQkJCVdMX0VSUk9SKCgid2wlZDogJXM6ICVzIHR4b3AgZXhjZWVkZWQgcGh5bGVuICVkLyVkIGR1ciAlZC8lZFxuIiwgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fLCBmaWZvX25hbWVzW3F1ZXVlXSwgcGh5bGVuLCB3bGMtPmZyYWd0aHJlc2hbcXVldWVdLCBkdXIsIHdsYy0+ZWRjZl90eG9wW2FjXSkpOworCQkJCVdMX0VSUk9SKCJ3bCVkOiAlczogJXMgdHhvcCBleGNlZWRlZCBwaHlsZW4gJWQvJWQgZHVyICVkLyVkXG4iLAorCQkJCQkgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fLAorCQkJCQkgZmlmb19uYW1lc1txdWV1ZV0sCisJCQkJCSBwaHlsZW4sIHdsYy0+ZnJhZ3RocmVzaFtxdWV1ZV0sCisJCQkJCSBkdXIsIHdsYy0+ZWRjZl90eG9wW2FjXSk7CiAJCX0KIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCB3bGNfdGJ0dCh3bGNfaW5mb190ICp3bGMsIGQxMXJlZ3NfdCAqcmVncykKK3ZvaWQgd2xjX3RidHQoc3RydWN0IHdsY19pbmZvICp3bGMsIGQxMXJlZ3NfdCAqcmVncykKIHsKIAl3bGNfYnNzY2ZnX3QgKmNmZyA9IHdsYy0+Y2ZnOwogCkBAIC02NTcxLDE5ICs2MzU1LDE5IEBACiB9CiAKIC8qIEdQIHRpbWVyIGlzIGEgZnJlZXJ1bm5pbmcgMzIgYml0IGNvdW50ZXIsIGRlY3JlbWVudHMgYXQgMSB1cyByYXRlICovCi12b2lkIHdsY19od3RpbWVyX2dwdGltZXJfc2V0KHdsY19pbmZvX3QgKndsYywgdWludCB1cykKK3ZvaWQgd2xjX2h3dGltZXJfZ3B0aW1lcl9zZXQoc3RydWN0IHdsY19pbmZvICp3bGMsIHVpbnQgdXMpCiB7CiAJQVNTRVJUKHdsYy0+cHViLT5jb3JlcmV2ID49IDMpOwkvKiBubyBncHRpbWVyIGluIGVhcmxpZXIgcmV2cyAqLwogCVdfUkVHKHdsYy0+b3NoLCAmd2xjLT5yZWdzLT5ncHRpbWVyLCB1cyk7CiB9CiAKLXZvaWQgd2xjX2h3dGltZXJfZ3B0aW1lcl9hYm9ydCh3bGNfaW5mb190ICp3bGMpCit2b2lkIHdsY19od3RpbWVyX2dwdGltZXJfYWJvcnQoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJQVNTRVJUKHdsYy0+cHViLT5jb3JlcmV2ID49IDMpOwogCVdfUkVHKHdsYy0+b3NoLCAmd2xjLT5yZWdzLT5ncHRpbWVyLCAwKTsKIH0KIAotc3RhdGljIHZvaWQgd2xjX2h3dGltZXJfZ3B0aW1lcl9jYih3bGNfaW5mb190ICp3bGMpCitzdGF0aWMgdm9pZCB3bGNfaHd0aW1lcl9ncHRpbWVyX2NiKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCS8qIHdoZW4gaW50ZXJydXB0IGlzIGdlbmVyYXRlZCwgdGhlIGNvdW50ZXIgaXMgbG9hZGVkIHdpdGggbGFzdCB2YWx1ZQogCSAqIHdyaXR0ZW4gYW5kIGNvbnRpbnVlIHRvIGRlY3JlbWVudC4gU28gaXQgaGFzIHRvIGJlIGNsZWFuZWQgZmlyc3QKQEAgLTY1OTYsNyArNjM4MCw3IEBACiAgKiBQT0xJQ1k6IG5vIG1hY2luc3RhdHVzIGNoYW5nZSwgbm8gYm91bmRpbmcgbG9vcC4KICAqICAgICAgICAgQWxsIGRwYyBib3VuZGluZyBzaG91bGQgYmUgaGFuZGxlZCBpbiBCTUFDIGRwYywgbGlrZSB0eHN0YXR1cyBhbmQgcnhpbnQKICAqLwotdm9pZCB3bGNfaGlnaF9kcGMod2xjX2luZm9fdCAqd2xjLCB1MzIgbWFjaW50c3RhdHVzKQordm9pZCB3bGNfaGlnaF9kcGMoc3RydWN0IHdsY19pbmZvICp3bGMsIHUzMiBtYWNpbnRzdGF0dXMpCiB7CiAJZDExcmVnc190ICpyZWdzID0gd2xjLT5yZWdzOwogI2lmZGVmIEJDTURCRwpAQCAtNjYzNCw4ICs2NDE4LDggQEAKIAlpZiAobWFjaW50c3RhdHVzICYgfihNSV9UQlRUIHwgTUlfVFhTVE9QKSkgewogCQliY21fZm9ybWF0X2ZsYWdzKGludF9mbGFncywgbWFjaW50c3RhdHVzLCBmbGFnc3RyLAogCQkJCSBzaXplb2YoZmxhZ3N0cikpOwotCQlXTF9UUkFDRSgoIndsJWQ6IG1hY2ludHN0YXR1cyAweCV4ICVzXG4iLCB3bGMtPnB1Yi0+dW5pdCwKLQkJCSAgbWFjaW50c3RhdHVzLCBmbGFnc3RyKSk7CisJCVdMX1RSQUNFKCJ3bCVkOiBtYWNpbnRzdGF0dXMgMHgleCAlc1xuIiwKKwkJCSB3bGMtPnB1Yi0+dW5pdCwgbWFjaW50c3RhdHVzLCBmbGFnc3RyKTsKIAl9CiAjZW5kaWYJCQkJLyogQkNNREJHICovCiAKQEAgLTY2NTAsMTEgKzY0MzQsMTIgQEAKIAkJd2xjX3RidHQod2xjLCByZWdzKTsKIAogCWlmIChtYWNpbnRzdGF0dXMgJiBNSV9HUDApIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiBQU00gbWljcm9jb2RlIHdhdGNoZG9nIGZpcmVkIGF0ICVkIChzZWNvbmRzKS4gUmVzZXR0aW5nLlxuIiwgd2xjLT5wdWItPnVuaXQsIHdsYy0+cHViLT5ub3cpKTsKKwkJV0xfRVJST1IoIndsJWQ6IFBTTSBtaWNyb2NvZGUgd2F0Y2hkb2cgZmlyZWQgYXQgJWQgKHNlY29uZHMpLiBSZXNldHRpbmcuXG4iLAorCQkJIHdsYy0+cHViLT51bml0LCB3bGMtPnB1Yi0+bm93KTsKIAogCQlwcmludGtfb25jZSgiJXMgOiBQU00gV2F0Y2hkb2csIGNoaXBpZCAweCV4LCBjaGlwcmV2IDB4JXhcbiIsCi0JCQkgICAgX19mdW5jX18sIENISVBJRCh3bGMtPnB1Yi0+c2loLT5jaGlwKSwKLQkJCSAgICBDSElQUkVWKHdsYy0+cHViLT5zaWgtPmNoaXByZXYpKTsKKwkJCQkJX19mdW5jX18sIHdsYy0+cHViLT5zaWgtPmNoaXAsCisJCQkJCXdsYy0+cHViLT5zaWgtPmNoaXByZXYpOwogCiAJCVdMQ05USU5DUih3bGMtPnB1Yi0+X2NudC0+cHNtd2RzKTsKIApAQCAtNjY2OCw3ICs2NDUzLDkgQEAKIAl9CiAKIAlpZiAobWFjaW50c3RhdHVzICYgTUlfUkZESVNBQkxFKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogTUFDIERldGVjdGVkIGEgY2hhbmdlIG9uIHRoZSBSRiBEaXNhYmxlIElucHV0IDB4JXhcbiIsIHdsYy0+cHViLT51bml0LCBSX1JFRyh3bGMtPm9zaCwgJnJlZ3MtPnBoeWRlYnVnKSAmIFBEQkdfUkZEKSk7CisJCVdMX0VSUk9SKCJ3bCVkOiBNQUMgRGV0ZWN0ZWQgYSBjaGFuZ2Ugb24gdGhlIFJGIERpc2FibGUgSW5wdXQgMHgleFxuIiwKKwkJCSB3bGMtPnB1Yi0+dW5pdCwKKwkJCSBSX1JFRyh3bGMtPm9zaCwgJnJlZ3MtPnBoeWRlYnVnKSAmIFBEQkdfUkZEKTsKIAkJLyogZGVsYXkgdGhlIGNsZWFudXAgdG8gd2xfZG93biBpbiBJQlNTIGNhc2UgKi8KIAkJaWYgKChSX1JFRyh3bGMtPm9zaCwgJnJlZ3MtPnBoeWRlYnVnKSAmIFBEQkdfUkZEKSkgewogCQkJaW50IGlkeDsKQEAgLTY2NzcsNyArNjQ2NCw4IEBACiAJCQkJaWYgKCFCU1NDRkdfU1RBKGJzc2NmZykgfHwgIWJzc2NmZy0+ZW5hYmxlCiAJCQkJICAgIHx8ICFic3NjZmctPkJTUykKIAkJCQkJY29udGludWU7Ci0JCQkJV0xfRVJST1IoKCJ3bCVkOiB3bGNfZHBjOiByZmRpc2FibGUgLT4gd2xjX2Jzc2NmZ19kaXNhYmxlKClcbiIsIHdsYy0+cHViLT51bml0KSk7CisJCQkJV0xfRVJST1IoIndsJWQ6IHdsY19kcGM6IHJmZGlzYWJsZSAtPiB3bGNfYnNzY2ZnX2Rpc2FibGUoKVxuIiwKKwkJCQkJIHdsYy0+cHViLT51bml0KTsKIAkJCX0KIAkJfQogCX0KQEAgLTY2ODYsMTQgKzY0NzQsMTIgQEAKIAlpZiAoIXBrdHFfZW1wdHkoJndsYy0+YWN0aXZlX3F1ZXVlLT5xKSkKIAkJd2xjX3NlbmRfcSh3bGMsIHdsYy0+YWN0aXZlX3F1ZXVlKTsKIAotI2lmbmRlZiBXTENfSElHSF9PTkxZCiAJQVNTRVJUKHdsY19wc19jaGVjayh3bGMpKTsKLSNlbmRpZgogfQogCi1zdGF0aWMgdm9pZCAqd2xjXzE1NDIwd2FyKHdsY19pbmZvX3QgKndsYywgdWludCBxdWV1ZSkKK3N0YXRpYyB2b2lkICp3bGNfMTU0MjB3YXIoc3RydWN0IHdsY19pbmZvICp3bGMsIHVpbnQgcXVldWUpCiB7Ci0JaG5kZG1hX3QgKmRpOworCXN0cnVjdCBobmRkbWFfcHViICpkaTsKIAl2b2lkICpwOwogCiAJQVNTRVJUKHF1ZXVlIDwgTkZJRk8pOwpAQCAtNjcxNSwxMyArNjUwMSwxNCBAQAogCWlmIChkbWFfdHhhY3RpdmUod2xjLT5ody0+ZGlbcXVldWVdKSA9PSAwKSB7CiAJCVdMQ05USU5DUih3bGMtPnB1Yi0+X2NudC0+dHhkbWF3YXIpOwogCQlpZiAoIWRtYV90eHJlc2V0KGRpKSkKLQkJCVdMX0VSUk9SKCgid2wlZDogJXM6IGRtYV90eHJlc2V0WyVkXTogY2Fubm90IHN0b3AgZG1hXG4iLCB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18sIHF1ZXVlKSk7CisJCQlXTF9FUlJPUigid2wlZDogJXM6IGRtYV90eHJlc2V0WyVkXTogY2Fubm90IHN0b3AgZG1hXG4iLAorCQkJCSB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18sIHF1ZXVlKTsKIAkJZG1hX3R4aW5pdChkaSk7CiAJfQogCXJldHVybiBwOwogfQogCi1zdGF0aWMgdm9pZCB3bGNfd2FyMTYxNjUod2xjX2luZm9fdCAqd2xjLCBib29sIHR4KQorc3RhdGljIHZvaWQgd2xjX3dhcjE2MTY1KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBib29sIHR4KQogewogCWlmICh0eCkgewogCQkvKiB0aGUgcG9zdC1pbmNyZW1lbnQgaXMgdXNlZCBpbiBTVEFZX0FXQUtFIG1hY3JvICovCkBAIC02NzM3LDE0ICs2NTI0LDE0IEBACiAvKiBwcm9jZXNzIGFuIGluZGl2aWR1YWwgdHhfc3RhdHVzX3QgKi8KIC8qIFdMQ19ISUdIX0FQSSAqLwogYm9vbCBCQ01GQVNUUEFUSAotd2xjX2RvdHhzdGF0dXMod2xjX2luZm9fdCAqd2xjLCB0eF9zdGF0dXNfdCAqdHhzLCB1MzIgZnJtX3R4MikKK3dsY19kb3R4c3RhdHVzKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB0eF9zdGF0dXNfdCAqdHhzLCB1MzIgZnJtX3R4MikKIHsKLQl2b2lkICpwOworCXN0cnVjdCBza19idWZmICpwOwogCXVpbnQgcXVldWU7CiAJZDExdHhoX3QgKnR4aDsKIAlzdHJ1Y3Qgc2NiICpzY2IgPSBOVUxMOwogCWJvb2wgZnJlZV9wZHU7Ci0Jb3NsX3QgKm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsKIAlpbnQgdHhfcnRzLCB0eF9mcmFtZV9jb3VudCwgdHhfcnRzX2NvdW50OwogCXVpbnQgdG90bGVuLCBzdXByX3N0YXR1czsKIAlib29sIGxhc3RmcmFtZTsKQEAgLTY3NjgsNyArNjU1NSw3IEBACiAJCQkgKCh0eHMtPgogCQkJICAgc3RhdHVzICYgVFhfU1RBVFVTX0ZSTV9SVFhfTUFTSykgPj4KIAkJCSAgVFhfU1RBVFVTX0ZSTV9SVFhfU0hJRlQpKTsKLQkJV0xfRVJST1IoKCIlczogSU5URVJNRURJQVRFIGJ1dCBub3QgQU1QRFVcbiIsIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCIlczogSU5URVJNRURJQVRFIGJ1dCBub3QgQU1QRFVcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIApAQCAtNjc4OSwxMiArNjU3NiwxMiBAQAogCWlmIChwID09IE5VTEwpCiAJCWdvdG8gZmF0YWw7CiAKLQl0eGggPSAoZDExdHhoX3QgKikgUEtUREFUQShwKTsKKwl0eGggPSAoZDExdHhoX3QgKikgKHAtPmRhdGEpOwogCW1jbCA9IGx0b2gxNih0eGgtPk1hY1R4Q29udHJvbExvdyk7CiAKIAlpZiAodHhzLT5waHllcnIpIHsKLQkJV0xfRVJST1IoKCJwaHllcnIgMHgleCwgcmF0ZSAweCV4XG4iLCB0eHMtPnBoeWVyciwKLQkJCSAgdHhoLT5NYWluUmF0ZXMpKTsKKwkJV0xfRVJST1IoInBoeWVyciAweCV4LCByYXRlIDB4JXhcbiIsCisJCQkgdHhzLT5waHllcnIsIHR4aC0+TWFpblJhdGVzKTsKIAkJd2xjX3ByaW50X3R4ZGVzYyh0eGgpOwogCQl3bGNfcHJpbnRfdHhzdGF0dXModHhzKTsKIAl9CkBAIC02ODI1LDggKzY2MTIsOCBAQAogCiAJc3Vwcl9zdGF0dXMgPSB0eHMtPnN0YXR1cyAmIFRYX1NUQVRVU19TVVBSX01BU0s7CiAJaWYgKHN1cHJfc3RhdHVzID09IFRYX1NUQVRVU19TVVBSX0JBRENIKQotCQlXTF9OT05FKCgiJXM6IFBrdCB0eCBzdXBwcmVzc2VkLCBwb3NzaWJseSBjaGFubmVsICVkXG4iLAotCQkJIF9fZnVuY19fLCBDSFNQRUNfQ0hBTk5FTCh3bGMtPmRlZmF1bHRfYnNzLT5jaGFuc3BlYykpKTsKKwkJV0xfTk9ORSgiJXM6IFBrdCB0eCBzdXBwcmVzc2VkLCBwb3NzaWJseSBjaGFubmVsICVkXG4iLAorCQkJX19mdW5jX18sIENIU1BFQ19DSEFOTkVMKHdsYy0+ZGVmYXVsdF9ic3MtPmNoYW5zcGVjKSk7CiAKIAl0eF9ydHMgPSBodG9sMTYodHhoLT5NYWNUeENvbnRyb2xMb3cpICYgVFhDX1NFTkRSVFM7CiAJdHhfZnJhbWVfY291bnQgPQpAQCAtNjgzNyw3ICs2NjI0LDcgQEAKIAlsYXN0ZnJhbWUgPSAoZmMgJiBGQ19NT1JFRlJBRykgPT0gMDsKIAogCWlmICghbGFzdGZyYW1lKSB7Ci0JCVdMX0VSUk9SKCgiTm90IGxhc3QgZnJhbWUhXG4iKSk7CisJCVdMX0VSUk9SKCJOb3QgbGFzdCBmcmFtZSFcbiIpOwogCX0gZWxzZSB7CiAJCXUxNiBzZmJsLCBsZmJsOwogCQlpZWVlODAyMTFfdHhfaW5mb19jbGVhcl9zdGF0dXModHhfaW5mbyk7CkBAIC02ODc5LDE3ICs2NjY2LDE3IEBACiAJd2xjX3R4Zmlmb19jb21wbGV0ZSh3bGMsIHF1ZXVlLCAxKTsKIAogCWlmIChsYXN0ZnJhbWUpIHsKLQkJUEtUU0VUTkVYVChwLCBOVUxMKTsKLQkJUEtUU0VUTElOSyhwLCBOVUxMKTsKKwkJcC0+bmV4dCA9IE5VTEw7CisJCXAtPnByZXYgPSBOVUxMOwogCQl3bGMtPnR4cmV0cmllZCA9IDA7CiAJCS8qIHJlbW92ZSBQTENQICYgQnJvYWRjb20gdHggZGVzY3JpcHRvciBoZWFkZXIgKi8KLQkJUEtUUFVMTChwLCBEMTFfUEhZX0hEUl9MRU4pOwotCQlQS1RQVUxMKHAsIEQxMV9UWEhfTEVOKTsKKwkJc2tiX3B1bGwocCwgRDExX1BIWV9IRFJfTEVOKTsKKwkJc2tiX3B1bGwocCwgRDExX1RYSF9MRU4pOwogCQlpZWVlODAyMTFfdHhfc3RhdHVzX2lycXNhZmUod2xjLT5wdWItPmllZWVfaHcsIHApOwogCQlXTENOVElOQ1Iod2xjLT5wdWItPl9jbnQtPmllZWVfdHhfc3RhdHVzKTsKIAl9IGVsc2UgewotCQlXTF9FUlJPUigoIiVzOiBOb3QgbGFzdCBmcmFtZSA9PiBub3QgY2FsbGluZyB0eF9zdGF0dXNcbiIsCi0JCQkgIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCIlczogTm90IGxhc3QgZnJhbWUgPT4gbm90IGNhbGxpbmcgdHhfc3RhdHVzXG4iLAorCQkJIF9fZnVuY19fKTsKIAl9CiAKIAlyZXR1cm4gZmFsc2U7CkBAIC02ODk3LDI0ICs2Njg0LDE4IEBACiAgZmF0YWw6CiAJQVNTRVJUKDApOwogCWlmIChwKQotCQlQS1RGUkVFKG9zaCwgcCwgdHJ1ZSk7CisJCXBrdF9idWZfZnJlZV9za2Iob3NoLCBwLCB0cnVlKTsKIAotI2lmZGVmIFdMQ19ISUdIX09OTFkKLQkvKiBJZiB0aGlzIGlzIGEgc3BsaXQgZHJpdmVyLCBkbyB0aGUgYmlnLWhhbW1lciBoZXJlLgotCSAqIElmIHRoaXMgaXMgYSBtb25vbGl0aGljIGRyaXZlciwgd2xjX2JtYWMuYzp3bGNfZHBjKCkgd2lsbCBkbyB0aGUgYmlnLWhhbW1lci4KLQkgKi8KLQl3bF9pbml0KHdsYy0+d2wpOwotI2VuZGlmCiAJcmV0dXJuIHRydWU7CiAKIH0KIAogdm9pZCBCQ01GQVNUUEFUSAotd2xjX3R4Zmlmb19jb21wbGV0ZSh3bGNfaW5mb190ICp3bGMsIHVpbnQgZmlmbywgczggdHhwa3RwZW5kKQord2xjX3R4Zmlmb19jb21wbGV0ZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdWludCBmaWZvLCBzOCB0eHBrdHBlbmQpCiB7CiAJVFhQS1RQRU5EREVDKHdsYywgZmlmbywgdHhwa3RwZW5kKTsKLQlXTF9UUkFDRSgoIndsY190eGZpZm9fY29tcGxldGUsIHBrdHBlbmQgZGVjICVkIHRvICVkXG4iLCB0eHBrdHBlbmQsCi0JCSAgVFhQS1RQRU5ER0VUKHdsYywgZmlmbykpKTsKKwlXTF9UUkFDRSgid2xjX3R4Zmlmb19jb21wbGV0ZSwgcGt0cGVuZCBkZWMgJWQgdG8gJWRcbiIsCisJCSB0eHBrdHBlbmQsIFRYUEtUUEVOREdFVCh3bGMsIGZpZm8pKTsKIAogCS8qIFRoZXJlIGlzIG1vcmUgcm9vbTsgbWFyayBwcmVjZWRlbmNlcyByZWxhdGVkIHRvIHRoaXMgRklGTyBzZW5kYWJsZSAqLwogCVdMQ19UWF9GSUZPX0VOQUIod2xjLCBmaWZvKTsKQEAgLTcwMTQsNyArNjc5NSw3IEBACiB9CiAKIC8qIFVwZGF0ZSBiZWFjb24gbGlzdGVuIGludGVydmFsIGluIHNoYXJlZCBtZW1vcnkgKi8KLXZvaWQgd2xjX2Jjbl9saV91cGQod2xjX2luZm9fdCAqd2xjKQordm9pZCB3bGNfYmNuX2xpX3VwZChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAlpZiAoQVBfRU5BQih3bGMtPnB1YikpCiAJCXJldHVybjsKQEAgLTcwMjgsNyArNjgwOSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1wcmVwX21hYzgwMjExX3N0YXR1cyh3bGNfaW5mb190ICp3bGMsIGQxMXJ4aGRyX3QgKnJ4aCwgdm9pZCAqcCwKK3ByZXBfbWFjODAyMTFfc3RhdHVzKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBkMTFyeGhkcl90ICpyeGgsIHN0cnVjdCBza19idWZmICpwLAogCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpyeF9zdGF0dXMpCiB7CiAJdTMyIHRzZl9sLCB0c2ZfaDsKQEAgLTcwNjEsNyArNjg0Miw3IEBACiAJLyogcXVhbCAqLwogCXJ4X3N0YXR1cy0+YW50ZW5uYSA9IChyeGgtPlBoeVJ4U3RhdHVzXzAgJiBQUlhTMF9SWEFOVF9VUFNVQkJBTkQpID8gMSA6IDA7CS8qIGFudCAqLwogCi0JcGxjcCA9IFBLVERBVEEocCk7CisJcGxjcCA9IHAtPmRhdGE7CiAKIAlyc3BlYyA9IHdsY19jb21wdXRlX3JzcGVjKHJ4aCwgcGxjcCk7CiAJaWYgKElTX01DUyhyc3BlYykpIHsKQEAgLTcxMDgsMTkgKzY4ODksMTkgQEAKIAkJCXJ4X3N0YXR1cy0+cmF0ZV9pZHggPSAxMTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJV0xfRVJST1IoKCIlczogVW5rbm93biByYXRlXG4iLCBfX2Z1bmNfXykpOworCQkJV0xfRVJST1IoIiVzOiBVbmtub3duIHJhdGVcbiIsIF9fZnVuY19fKTsKIAkJfQogCiAJCS8qIERldGVybWluZSBzaG9ydCBwcmVhbWJsZSBhbmQgcmF0ZV9pZHggKi8KIAkJcHJlYW1ibGUgPSAwOwogCQlpZiAoSVNfQ0NLKHJzcGVjKSkgewogCQkJaWYgKHJ4aC0+UGh5UnhTdGF0dXNfMCAmIFBSWFMwX1NIT1JUSCkKLQkJCQlXTF9FUlJPUigoIlNob3J0IENDS1xuIikpOworCQkJCVdMX0VSUk9SKCJTaG9ydCBDQ0tcbiIpOwogCQkJcnhfc3RhdHVzLT5mbGFnIHw9IFJYX0ZMQUdfU0hPUlRQUkU7CiAJCX0gZWxzZSBpZiAoSVNfT0ZETShyc3BlYykpIHsKIAkJCXJ4X3N0YXR1cy0+ZmxhZyB8PSBSWF9GTEFHX1NIT1JUUFJFOwogCQl9IGVsc2UgewotCQkJV0xfRVJST1IoKCIlczogVW5rbm93biBtb2R1bGF0aW9uXG4iLCBfX2Z1bmNfXykpOworCQkJV0xfRVJST1IoIiVzOiBVbmtub3duIG1vZHVsYXRpb25cbiIsIF9fZnVuY19fKTsKIAkJfQogCX0KIApAQCAtNzEyOSwxNiArNjkxMCwxNyBAQAogCiAJaWYgKHJ4aC0+UnhTdGF0dXMxICYgUlhTX0RFQ0VSUikgewogCQlyeF9zdGF0dXMtPmZsYWcgfD0gUlhfRkxBR19GQUlMRURfUExDUF9DUkM7Ci0JCVdMX0VSUk9SKCgiJXM6ICBSWF9GTEFHX0ZBSUxFRF9QTENQX0NSQ1xuIiwgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIiVzOiAgUlhfRkxBR19GQUlMRURfUExDUF9DUkNcbiIsIF9fZnVuY19fKTsKIAl9CiAJaWYgKHJ4aC0+UnhTdGF0dXMxICYgUlhTX0ZDU0VSUikgewogCQlyeF9zdGF0dXMtPmZsYWcgfD0gUlhfRkxBR19GQUlMRURfRkNTX0NSQzsKLQkJV0xfRVJST1IoKCIlczogIFJYX0ZMQUdfRkFJTEVEX0ZDU19DUkNcbiIsIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCIlczogIFJYX0ZMQUdfRkFJTEVEX0ZDU19DUkNcbiIsIF9fZnVuY19fKTsKIAl9CiB9CiAKIHN0YXRpYyB2b2lkCi13bGNfcmVjdmN0bCh3bGNfaW5mb190ICp3bGMsIG9zbF90ICpvc2gsIGQxMXJ4aGRyX3QgKnJ4aCwgdm9pZCAqcCkKK3dsY19yZWN2Y3RsKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgZDExcnhoZHJfdCAqcnhoLAorCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqcCkKIHsKIAlpbnQgbGVuX21wZHU7CiAJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgcnhfc3RhdHVzOwpAQCAtNzE1NSwxMiArNjkzNywxMiBAQAogCXByZXBfbWFjODAyMTFfc3RhdHVzKHdsYywgcnhoLCBwLCAmcnhfc3RhdHVzKTsKIAogCS8qIG1hYyBoZWFkZXIrYm9keSBsZW5ndGgsIGV4Y2x1ZGUgQ1JDIGFuZCBwbGNwIGhlYWRlciAqLwotCWxlbl9tcGR1ID0gUEtUTEVOKHApIC0gRDExX1BIWV9IRFJfTEVOIC0gRE9UMTFfRkNTX0xFTjsKLQlQS1RQVUxMKHAsIEQxMV9QSFlfSERSX0xFTik7Ci0JUEtUU0VUTEVOKHAsIGxlbl9tcGR1KTsKKwlsZW5fbXBkdSA9IHAtPmxlbiAtIEQxMV9QSFlfSERSX0xFTiAtIERPVDExX0ZDU19MRU47CisJc2tiX3B1bGwocCwgRDExX1BIWV9IRFJfTEVOKTsKKwlfX3NrYl90cmltKHAsIGxlbl9tcGR1KTsKIAotCUFTU0VSVCghUEtUTkVYVChwKSk7Ci0JQVNTRVJUKCFQS1RMSU5LKHApKTsKKwlBU1NFUlQoIShwLT5uZXh0KSk7CisJQVNTRVJUKCEocC0+cHJldikpOwogCiAJQVNTRVJUKElTX0FMSUdORUQoKHVuc2lnbmVkIGxvbmcpc2tiLT5kYXRhLCAyKSk7CiAKQEAgLTcxNjgsMTcgKzY5NTAsMTcgQEAKIAlpZWVlODAyMTFfcnhfaXJxc2FmZSh3bGMtPnB1Yi0+aWVlZV9odywgcCk7CiAKIAlXTENOVElOQ1Iod2xjLT5wdWItPl9jbnQtPmllZWVfcngpOwotCVBLVFVOQUxMT0Mob3NoKTsKKwlvc2gtPnBrdGFsbG9jZWQtLTsKIAlyZXR1cm47CiB9CiAKLXZvaWQgd2xjX2Jzc19saXN0X2ZyZWUod2xjX2luZm9fdCAqd2xjLCB3bGNfYnNzX2xpc3RfdCAqYnNzX2xpc3QpCit2b2lkIHdsY19ic3NfbGlzdF9mcmVlKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB3bGNfYnNzX2xpc3RfdCAqYnNzX2xpc3QpCiB7CiAJdWludCBpbmRleDsKIAl3bGNfYnNzX2luZm9fdCAqYmk7CiAKIAlpZiAoIWJzc19saXN0KSB7Ci0JCVdMX0VSUk9SKCgiJXM6IEF0dGVtcHRpbmcgdG8gZnJlZSBOVUxMIGxpc3RcbiIsIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCIlczogQXR0ZW1wdGluZyB0byBmcmVlIE5VTEwgbGlzdFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCS8qIGluc3BlY3QgYWxsIEJTUyBkZXNjcmlwdG9yICovCkBAIC03MjAxLDQ4ICs2OTgzLDQ4IEBACiAgKiBQYXJhbSAnYm91bmQnIGluZGljYXRlcyBtYXguICMgZnJhbWVzIHRvIHByb2Nlc3MgYmVmb3JlIGJyZWFrIG91dC4KICAqLwogLyogV0xDX0hJR0hfQVBJICovCi12b2lkIEJDTUZBU1RQQVRIIHdsY19yZWN2KHdsY19pbmZvX3QgKndsYywgdm9pZCAqcCkKK3ZvaWQgQkNNRkFTVFBBVEggd2xjX3JlY3Yoc3RydWN0IHdsY19pbmZvICp3bGMsIHN0cnVjdCBza19idWZmICpwKQogewogCWQxMXJ4aGRyX3QgKnJ4aDsKIAlzdHJ1Y3QgZG90MTFfaGVhZGVyICpoOwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAJdTE2IGZjOwogCXVpbnQgbGVuOwogCWJvb2wgaXNfYW1zZHU7CiAKLQlXTF9UUkFDRSgoIndsJWQ6IHdsY19yZWN2XG4iLCB3bGMtPnB1Yi0+dW5pdCkpOworCVdMX1RSQUNFKCJ3bCVkOiB3bGNfcmVjdlxuIiwgd2xjLT5wdWItPnVuaXQpOwogCiAJb3NoID0gd2xjLT5vc2g7CiAKIAkvKiBmcmFtZSBzdGFydHMgd2l0aCByeGhkciAqLwotCXJ4aCA9IChkMTFyeGhkcl90ICopIFBLVERBVEEocCk7CisJcnhoID0gKGQxMXJ4aGRyX3QgKikgKHAtPmRhdGEpOwogCiAJLyogc3RyaXAgb2ZmIHJ4aGRyICovCi0JUEtUUFVMTChwLCB3bGMtPmh3cnhvZmYpOworCXNrYl9wdWxsKHAsIHdsYy0+aHdyeG9mZik7CiAKIAkvKiBmaXh1cCByeCBoZWFkZXIgZW5kaWFubmVzcyAqLwogCWx0b2gxNl9idWYoKHZvaWQgKilyeGgsIHNpemVvZihkMTFyeGhkcl90KSk7CiAKIAkvKiBNQUMgaW5zZXJ0cyAyIHBhZCBieXRlcyBmb3IgYTQgaGVhZGVycyBvciBRb1Mgb3IgQS1NU0RVIHN1YmZyYW1lcyAqLwogCWlmIChyeGgtPlJ4U3RhdHVzMSAmIFJYU19QQlBSRVMpIHsKLQkJaWYgKFBLVExFTihwKSA8IDIpIHsKKwkJaWYgKHAtPmxlbiA8IDIpIHsKIAkJCVdMQ05USU5DUih3bGMtPnB1Yi0+X2NudC0+cnhydW50KTsKLQkJCVdMX0VSUk9SKCgid2wlZDogd2xjX3JlY3Y6IHJjdmQgcnVudCBvZiBsZW4gJWRcbiIsCi0JCQkJICB3bGMtPnB1Yi0+dW5pdCwgUEtUTEVOKHApKSk7CisJCQlXTF9FUlJPUigid2wlZDogd2xjX3JlY3Y6IHJjdmQgcnVudCBvZiBsZW4gJWRcbiIsCisJCQkJIHdsYy0+cHViLT51bml0LCBwLT5sZW4pOwogCQkJZ290byB0b3NzOwogCQl9Ci0JCVBLVFBVTEwocCwgMik7CisJCXNrYl9wdWxsKHAsIDIpOwogCX0KIAotCWggPSAoc3RydWN0IGRvdDExX2hlYWRlciAqKShQS1REQVRBKHApICsgRDExX1BIWV9IRFJfTEVOKTsKLQlsZW4gPSBQS1RMRU4ocCk7CisJaCA9IChzdHJ1Y3QgZG90MTFfaGVhZGVyICopKHAtPmRhdGEgKyBEMTFfUEhZX0hEUl9MRU4pOworCWxlbiA9IHAtPmxlbjsKIAogCWlmIChyeGgtPlJ4U3RhdHVzMSAmIFJYU19GQ1NFUlIpIHsKIAkJaWYgKHdsYy0+cHViLT5tYWM4MDIxMV9zdGF0ZSAmIE1BQzgwMjExX1BST01JU0NfQkNOUykgewotCQkJV0xfRVJST1IoKCJGQ1NFUlIgd2hpbGUgc2Nhbm5pbmcqKioqKioqIC0gdG9zc2luZ1xuIikpOworCQkJV0xfRVJST1IoIkZDU0VSUiB3aGlsZSBzY2FubmluZyoqKioqKiogLSB0b3NzaW5nXG4iKTsKIAkJCWdvdG8gdG9zczsKIAkJfSBlbHNlIHsKLQkJCVdMX0VSUk9SKCgiUkNTRVJSISEhXG4iKSk7CisJCQlXTF9FUlJPUigiUkNTRVJSISEhXG4iKTsKIAkJCWdvdG8gdG9zczsKIAkJfQogCX0KQEAgLTcyNjEsMTAgKzcwNDMsMTAgQEAKIAlpZiAoIWlzX2Ftc2R1KSB7CiAJCS8qIENUUyBhbmQgQUNLIENUTCBmcmFtZXMgYXJlIHcvbyBhMiAqLwogCQlpZiAoRkNfVFlQRShmYykgPT0gRkNfVFlQRV9EQVRBIHx8IEZDX1RZUEUoZmMpID09IEZDX1RZUEVfTU5HKSB7Ci0JCQlpZiAoKEVUSEVSX0lTTlVMTEFERFIoJmgtPmEyKSB8fCBFVEhFUl9JU01VTFRJKCZoLT5hMikpKSB7Ci0JCQkJV0xfRVJST1IoKCJ3bCVkOiAlczogZHJvcHBpbmcgYSBmcmFtZSB3aXRoICIKLQkJCQkJImludmFsaWQgc3JjIG1hYyBhZGRyZXNzLCBhMjogJXBNXG4iLAotCQkJCQl3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18sICZoLT5hMikpOworCQkJaWYgKChpc196ZXJvX2V0aGVyX2FkZHIoaC0+YTIub2N0ZXQpIHx8CisJCQkgICAgIGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGgtPmEyLm9jdGV0KSkpIHsKKwkJCQlXTF9FUlJPUigid2wlZDogJXM6IGRyb3BwaW5nIGEgZnJhbWUgd2l0aCBpbnZhbGlkIHNyYyBtYWMgYWRkcmVzcywgYTI6ICVwTVxuIiwKKwkJCQkJIHdsYy0+cHViLT51bml0LCBfX2Z1bmNfXywgJmgtPmEyKTsKIAkJCQlXTENOVElOQ1Iod2xjLT5wdWItPl9jbnQtPnJ4YmFkc3JjbWFjKTsKIAkJCQlnb3RvIHRvc3M7CiAJCQl9CkBAIC03Mjc5LDcgKzcwNjEsNyBAQAogCX0KIAogCWlmIChpc19hbXNkdSkgewotCQlXTF9FUlJPUigoIiVzOiBpc19hbXNkdSBjYXVzaW5nIHRvc3NcbiIsIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCIlczogaXNfYW1zZHUgY2F1c2luZyB0b3NzXG4iLCBfX2Z1bmNfXyk7CiAJCWdvdG8gdG9zczsKIAl9CiAKQEAgLTcyODcsNyArNzA2OSw3IEBACiAJcmV0dXJuOwogCiAgdG9zczoKLQlQS1RGUkVFKG9zaCwgcCwgZmFsc2UpOworCXBrdF9idWZfZnJlZV9za2Iob3NoLCBwLCBmYWxzZSk7CiB9CiAKIC8qIGNhbGN1bGF0ZSBmcmFtZSBkdXJhdGlvbiBmb3IgTWl4ZWQtbW9kZSBMLVNJRyBzcG9vZmluZywgcmV0dXJuCkBAIC03Mjk3LDEyICs3MDc5LDEyIEBACiAgKiAgIGxlbiA9IDMobnN5bXMgKyBuc3RyZWFtICsgMykgLSAzCiAgKi8KIHUxNiBCQ01GQVNUUEFUSAotd2xjX2NhbGNfbHNpZ19sZW4od2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJhdGVzcGVjLCB1aW50IG1hY19sZW4pCit3bGNfY2FsY19sc2lnX2xlbihzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByYXRlc3BlYywgdWludCBtYWNfbGVuKQogewogCXVpbnQgbnN5bXMsIGxlbiA9IDAsIGtOZHBzOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiB3bGNfY2FsY19sc2lnX2xlbjogcmF0ZSAlZCwgbGVuJWRcbiIsIHdsYy0+cHViLT51bml0LAotCQkgIFJTUEVDMlJBVEUocmF0ZXNwZWMpLCBtYWNfbGVuKSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY19jYWxjX2xzaWdfbGVuOiByYXRlICVkLCBsZW4lZFxuIiwKKwkJIHdsYy0+cHViLT51bml0LCBSU1BFQzJSQVRFKHJhdGVzcGVjKSwgbWFjX2xlbik7CiAKIAlpZiAoSVNfTUNTKHJhdGVzcGVjKSkgewogCQl1aW50IG1jcyA9IHJhdGVzcGVjICYgUlNQRUNfUkFURV9NQVNLOwpAQCAtNzMzOCw3ICs3MTIwLDcgQEAKIAogLyogY2FsY3VsYXRlIGZyYW1lIGR1cmF0aW9uIG9mIGEgZ2l2ZW4gcmF0ZSBhbmQgbGVuZ3RoLCByZXR1cm4gdGltZSBpbiB1c2VjIHVuaXQgKi8KIHVpbnQgQkNNRkFTVFBBVEgKLXdsY19jYWxjX2ZyYW1lX3RpbWUod2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJhdGVzcGVjLCB1OCBwcmVhbWJsZV90eXBlLAord2xjX2NhbGNfZnJhbWVfdGltZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByYXRlc3BlYywgdTggcHJlYW1ibGVfdHlwZSwKIAkJICAgIHVpbnQgbWFjX2xlbikKIHsKIAl1aW50IG5zeW1zLCBkdXIgPSAwLCBOZHBzLCBrTmRwczsKQEAgLTczNDYsMTEgKzcxMjgsMTIgQEAKIAogCWlmIChyYXRlID09IDApIHsKIAkJQVNTRVJUKDApOwotCQlXTF9FUlJPUigoIndsJWQ6IFdBUjogdXNpbmcgcmF0ZSBvZiAxIG1icHNcbiIsIHdsYy0+cHViLT51bml0KSk7CisJCVdMX0VSUk9SKCJ3bCVkOiBXQVI6IHVzaW5nIHJhdGUgb2YgMSBtYnBzXG4iLCB3bGMtPnB1Yi0+dW5pdCk7CiAJCXJhdGUgPSBXTENfUkFURV8xTTsKIAl9CiAKLQlXTF9UUkFDRSgoIndsJWQ6IHdsY19jYWxjX2ZyYW1lX3RpbWU6IHJzcGVjIDB4JXgsIHByZWFtYmxlX3R5cGUgJWQsIGxlbiVkXG4iLCB3bGMtPnB1Yi0+dW5pdCwgcmF0ZXNwZWMsIHByZWFtYmxlX3R5cGUsIG1hY19sZW4pKTsKKwlXTF9UUkFDRSgid2wlZDogd2xjX2NhbGNfZnJhbWVfdGltZTogcnNwZWMgMHgleCwgcHJlYW1ibGVfdHlwZSAlZCwgbGVuJWRcbiIsCisJCSB3bGMtPnB1Yi0+dW5pdCwgcmF0ZXNwZWMsIHByZWFtYmxlX3R5cGUsIG1hY19sZW4pOwogCiAJaWYgKElTX01DUyhyYXRlc3BlYykpIHsKIAkJdWludCBtY3MgPSByYXRlc3BlYyAmIFJTUEVDX1JBVEVfTUFTSzsKQEAgLTc0MDgsMTMgKzcxOTEsMTQgQEAKIAogLyogVGhlIG9wcG9zaXRlIG9mIHdsY19jYWxjX2ZyYW1lX3RpbWUgKi8KIHN0YXRpYyB1aW50Ci13bGNfY2FsY19mcmFtZV9sZW4od2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJhdGVzcGVjLCB1OCBwcmVhbWJsZV90eXBlLAord2xjX2NhbGNfZnJhbWVfbGVuKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCByYXRlc3BlY190IHJhdGVzcGVjLCB1OCBwcmVhbWJsZV90eXBlLAogCQkgICB1aW50IGR1cikKIHsKIAl1aW50IG5zeW1zLCBtYWNfbGVuLCBOZHBzLCBrTmRwczsKIAl1aW50IHJhdGUgPSBSU1BFQzJSQVRFKHJhdGVzcGVjKTsKIAotCVdMX1RSQUNFKCgid2wlZDogd2xjX2NhbGNfZnJhbWVfbGVuOiByc3BlYyAweCV4LCBwcmVhbWJsZV90eXBlICVkLCBkdXIgJWRcbiIsIHdsYy0+cHViLT51bml0LCByYXRlc3BlYywgcHJlYW1ibGVfdHlwZSwgZHVyKSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY19jYWxjX2ZyYW1lX2xlbjogcnNwZWMgMHgleCwgcHJlYW1ibGVfdHlwZSAlZCwgZHVyICVkXG4iLAorCQkgd2xjLT5wdWItPnVuaXQsIHJhdGVzcGVjLCBwcmVhbWJsZV90eXBlLCBkdXIpOwogCiAJaWYgKElTX01DUyhyYXRlc3BlYykpIHsKIAkJdWludCBtY3MgPSByYXRlc3BlYyAmIFJTUEVDX1JBVEVfTUFTSzsKQEAgLTc0NTQsMTAgKzcyMzgsMTAgQEAKIH0KIAogc3RhdGljIHVpbnQKLXdsY19jYWxjX2JhX3RpbWUod2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJzcGVjLCB1OCBwcmVhbWJsZV90eXBlKQord2xjX2NhbGNfYmFfdGltZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByc3BlYywgdTggcHJlYW1ibGVfdHlwZSkKIHsKLQlXTF9UUkFDRSgoIndsJWQ6IHdsY19jYWxjX2JhX3RpbWU6IHJzcGVjIDB4JXgsIHByZWFtYmxlX3R5cGUgJWRcbiIsCi0JCSAgd2xjLT5wdWItPnVuaXQsIHJzcGVjLCBwcmVhbWJsZV90eXBlKSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY19jYWxjX2JhX3RpbWU6IHJzcGVjIDB4JXgsIHByZWFtYmxlX3R5cGUgJWRcbiIsCisJCSB3bGMtPnB1Yi0+dW5pdCwgcnNwZWMsIHByZWFtYmxlX3R5cGUpOwogCS8qIFNwZWMgOS42OiBhY2sgcmF0ZSBpcyB0aGUgaGlnaGVzdCByYXRlIGluIEJTU0Jhc2ljUmF0ZVNldCB0aGF0IGlzIGxlc3MgdGhhbgogCSAqIG9yIGVxdWFsIHRvIHRoZSByYXRlIG9mIHRoZSBpbW1lZGlhdGVseSBwcmV2aW91cyBmcmFtZSBpbiB0aGUgRkVTCiAJICovCkBAIC03NDcxLDEyICs3MjU1LDEyIEBACiB9CiAKIHN0YXRpYyB1aW50IEJDTUZBU1RQQVRICi13bGNfY2FsY19hY2tfdGltZSh3bGNfaW5mb190ICp3bGMsIHJhdGVzcGVjX3QgcnNwZWMsIHU4IHByZWFtYmxlX3R5cGUpCit3bGNfY2FsY19hY2tfdGltZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByc3BlYywgdTggcHJlYW1ibGVfdHlwZSkKIHsKIAl1aW50IGR1ciA9IDA7CiAKLQlXTF9UUkFDRSgoIndsJWQ6IHdsY19jYWxjX2Fja190aW1lOiByc3BlYyAweCV4LCBwcmVhbWJsZV90eXBlICVkXG4iLAotCQkgIHdsYy0+cHViLT51bml0LCByc3BlYywgcHJlYW1ibGVfdHlwZSkpOworCVdMX1RSQUNFKCJ3bCVkOiB3bGNfY2FsY19hY2tfdGltZTogcnNwZWMgMHgleCwgcHJlYW1ibGVfdHlwZSAlZFxuIiwKKwkJIHdsYy0+cHViLT51bml0LCByc3BlYywgcHJlYW1ibGVfdHlwZSk7CiAJLyogU3BlYyA5LjY6IGFjayByYXRlIGlzIHRoZSBoaWdoZXN0IHJhdGUgaW4gQlNTQmFzaWNSYXRlU2V0IHRoYXQgaXMgbGVzcyB0aGFuCiAJICogb3IgZXF1YWwgdG8gdGhlIHJhdGUgb2YgdGhlIGltbWVkaWF0ZWx5IHByZXZpb3VzIGZyYW1lIGluIHRoZSBGRVMKIAkgKi8KQEAgLTc0OTEsMTUgKzcyNzUsMTUgQEAKIH0KIAogc3RhdGljIHVpbnQKLXdsY19jYWxjX2N0c190aW1lKHdsY19pbmZvX3QgKndsYywgcmF0ZXNwZWNfdCByc3BlYywgdTggcHJlYW1ibGVfdHlwZSkKK3dsY19jYWxjX2N0c190aW1lKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCByYXRlc3BlY190IHJzcGVjLCB1OCBwcmVhbWJsZV90eXBlKQogewotCVdMX1RSQUNFKCgid2wlZDogd2xjX2NhbGNfY3RzX3RpbWU6IHJhdGVzcGVjIDB4JXgsIHByZWFtYmxlX3R5cGUgJWRcbiIsCi0JCSAgd2xjLT5wdWItPnVuaXQsIHJzcGVjLCBwcmVhbWJsZV90eXBlKSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY19jYWxjX2N0c190aW1lOiByYXRlc3BlYyAweCV4LCBwcmVhbWJsZV90eXBlICVkXG4iLAorCQkgd2xjLT5wdWItPnVuaXQsIHJzcGVjLCBwcmVhbWJsZV90eXBlKTsKIAlyZXR1cm4gd2xjX2NhbGNfYWNrX3RpbWUod2xjLCByc3BlYywgcHJlYW1ibGVfdHlwZSk7CiB9CiAKIC8qIGRlcml2ZSB3bGMtPmJhbmQtPmJhc2ljX3JhdGVbXSB0YWJsZSBmcm9tICdyYXRlc2V0JyAqLwotdm9pZCB3bGNfcmF0ZV9sb29rdXBfaW5pdCh3bGNfaW5mb190ICp3bGMsIHdsY19yYXRlc2V0X3QgKnJhdGVzZXQpCit2b2lkIHdsY19yYXRlX2xvb2t1cF9pbml0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB3bGNfcmF0ZXNldF90ICpyYXRlc2V0KQogewogCXU4IHJhdGU7CiAJdTggbWFuZGF0b3J5OwpAQCAtNzUwOSw3ICs3MjkzLDcgQEAKIAl1aW50IGk7CiAKIAkvKiBpbmNvbWluZyByYXRlcyBhcmUgaW4gNTAwa2JwcyB1bml0cyBhcyBpbiA4MDIuMTEgU3VwcG9ydGVkIFJhdGVzICovCi0JYnplcm8oYnIsIFdMQ19NQVhSQVRFICsgMSk7CisJbWVtc2V0KGJyLCAwLCBXTENfTUFYUkFURSArIDEpOwogCiAJLyogRm9yIGVhY2ggYmFzaWMgcmF0ZSBpbiB0aGUgcmF0ZXMgbGlzdCwgbWFrZSBhbiBlbnRyeSBpbiB0aGUKIAkgKiBiZXN0IGJhc2ljIGxvb2t1cC4KQEAgLTc1MjMsNyArNzMwNyw4IEBACiAJCXJhdGUgPSAocmF0ZXNldC0+cmF0ZXNbaV0gJiBSQVRFX01BU0spOwogCiAJCWlmIChyYXRlID4gV0xDX01BWFJBVEUpIHsKLQkJCVdMX0VSUk9SKCgid2xjX3JhdGVfbG9va3VwX2luaXQ6IGludmFsaWQgcmF0ZSAweCVYIGluIHJhdGUgc2V0XG4iLCByYXRlc2V0LT5yYXRlc1tpXSkpOworCQkJV0xfRVJST1IoIndsY19yYXRlX2xvb2t1cF9pbml0OiBpbnZhbGlkIHJhdGUgMHglWCBpbiByYXRlIHNldFxuIiwKKwkJCQkgcmF0ZXNldC0+cmF0ZXNbaV0pOwogCQkJY29udGludWU7CiAJCX0KIApAQCAtNzU4OCw3ICs3MzczLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHdsY193cml0ZV9yYXRlX3NobSh3bGNfaW5mb190ICp3bGMsIHU4IHJhdGUsIHU4IGJhc2ljX3JhdGUpCitzdGF0aWMgdm9pZCB3bGNfd3JpdGVfcmF0ZV9zaG0oc3RydWN0IHdsY19pbmZvICp3bGMsIHU4IHJhdGUsIHU4IGJhc2ljX3JhdGUpCiB7CiAJdTggcGh5X3JhdGUsIGluZGV4OwogCXU4IGJhc2ljX3BoeV9yYXRlLCBiYXNpY19pbmRleDsKQEAgLTc2MjEsNyArNzQwNiw3IEBACiAJd2xjX3dyaXRlX3NobSh3bGMsIChiYXNpY190YWJsZSArIGluZGV4ICogMiksIGJhc2ljX3B0cik7CiB9CiAKLXN0YXRpYyBjb25zdCB3bGNfcmF0ZXNldF90ICp3bGNfcmF0ZXNldF9nZXRfaHdycyh3bGNfaW5mb190ICp3bGMpCitzdGF0aWMgY29uc3Qgd2xjX3JhdGVzZXRfdCAqd2xjX3JhdGVzZXRfZ2V0X2h3cnMoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJY29uc3Qgd2xjX3JhdGVzZXRfdCAqcnNfZGZsdDsKIApAQCAtNzYzOCw3ICs3NDIzLDcgQEAKIAlyZXR1cm4gcnNfZGZsdDsKIH0KIAotdm9pZCB3bGNfc2V0X3JhdGV0YWJsZSh3bGNfaW5mb190ICp3bGMpCit2b2lkIHdsY19zZXRfcmF0ZXRhYmxlKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCWNvbnN0IHdsY19yYXRlc2V0X3QgKnJzX2RmbHQ7CiAJd2xjX3JhdGVzZXRfdCByczsKQEAgLTc2NzQsNyArNzQ1OSw4IEBACiAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHJhdGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBzcGVjaWZpZWQgYmFuZC4KICAqIFdMQ19CQU5EX0FVVE8gaW5kaWNhdGVzIHRoZSBjdXJyZW50IGJhbmQuCiAgKi8KLWJvb2wgd2xjX3ZhbGlkX3JhdGUod2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJzcGVjLCBpbnQgYmFuZCwgYm9vbCB2ZXJib3NlKQorYm9vbCB3bGNfdmFsaWRfcmF0ZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByc3BlYywgaW50IGJhbmQsCisJCSAgICBib29sIHZlcmJvc2UpCiB7CiAJd2xjX3JhdGVzZXRfdCAqaHdfcmF0ZXNldDsKIAl1aW50IGk7CkBAIC03NzAxLDE2ICs3NDg3LDE3IEBACiAJCQlyZXR1cm4gdHJ1ZTsKICBlcnJvcjoKIAlpZiAodmVyYm9zZSkgewotCQlXTF9FUlJPUigoIndsJWQ6IHdsY192YWxpZF9yYXRlOiByYXRlIHNwZWMgMHgleCBub3QgaW4gaHdfcmF0ZXNldFxuIiwgd2xjLT5wdWItPnVuaXQsIHJzcGVjKSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfdmFsaWRfcmF0ZTogcmF0ZSBzcGVjIDB4JXggbm90IGluIGh3X3JhdGVzZXRcbiIsCisJCQkgd2xjLT5wdWItPnVuaXQsIHJzcGVjKTsKIAl9CiAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyB2b2lkIHdsY191cGRhdGVfbWltb19iYW5kX2J3Y2FwKHdsY19pbmZvX3QgKndsYywgdTggYndjYXApCitzdGF0aWMgdm9pZCB3bGNfdXBkYXRlX21pbW9fYmFuZF9id2NhcChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTggYndjYXApCiB7CiAJdWludCBpOwotCXdsY2JhbmRfdCAqYmFuZDsKKwlzdHJ1Y3Qgd2xjYmFuZCAqYmFuZDsKIAogCWZvciAoaSA9IDA7IGkgPCBOQkFORFMod2xjKTsgaSsrKSB7CiAJCWlmIChJU19TSU5HTEVCQU5EXzVHKHdsYy0+ZGV2aWNlaWQpKQpAQCAtNzczNCw3ICs3NTIxLDcgQEAKIAl3bGMtPm1pbW9fYmFuZF9id2NhcCA9IGJ3Y2FwOwogfQogCi12b2lkIHdsY19tb2RfcHJiX3JzcF9yYXRlX3RhYmxlKHdsY19pbmZvX3QgKndsYywgdWludCBmcmFtZV9sZW4pCit2b2lkIHdsY19tb2RfcHJiX3JzcF9yYXRlX3RhYmxlKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1aW50IGZyYW1lX2xlbikKIHsKIAljb25zdCB3bGNfcmF0ZXNldF90ICpyc19kZmx0OwogCXdsY19yYXRlc2V0X3QgcnM7CkBAIC03Nzc3LDE0ICs3NTY0LDE0IEBACiB9CiAKIHUxNgotd2xjX2NvbXB1dGVfYmNudHNmb2ZmKHdsY19pbmZvX3QgKndsYywgcmF0ZXNwZWNfdCByc3BlYywgYm9vbCBzaG9ydF9wcmVhbWJsZSwKLQkJICAgICAgYm9vbCBwaHlkZWxheSkKK3dsY19jb21wdXRlX2JjbnRzZm9mZihzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByc3BlYywKKwkJICAgICAgYm9vbCBzaG9ydF9wcmVhbWJsZSwgYm9vbCBwaHlkZWxheSkKIHsKIAl1aW50IGJjbnRzZm9mZiA9IDA7CiAKIAlpZiAoSVNfTUNTKHJzcGVjKSkgewotCQlXTF9FUlJPUigoIndsJWQ6IHJlY2QgYmVhY29uIHdpdGggbWNzIHJhdGU7IHJzcGVjIDB4JXhcbiIsCi0JCQkgIHdsYy0+cHViLT51bml0LCByc3BlYykpOworCQlXTF9FUlJPUigid2wlZDogcmVjZCBiZWFjb24gd2l0aCBtY3MgcmF0ZTsgcnNwZWMgMHgleFxuIiwKKwkJCSB3bGMtPnB1Yi0+dW5pdCwgcnNwZWMpOwogCX0gZWxzZSBpZiAoSVNfT0ZETShyc3BlYykpIHsKIAkJLyogdHggZGVsYXkgZnJvbSBNQUMgdGhyb3VnaCBwaHkgdG8gYWlyICgyLjEgdXNlYykgKwogCQkgKiBwaHkgaGVhZGVyIHRpbWUgKHByZWFtYmxlICsgUExDUCBTSUdOQUwgPT0gMjAgdXNlYykgKwpAQCAtNzgyNCw3ICs3NjExLDcgQEAKICAqCWFuZCBpbmNsdWRlZCB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIHRoZSA0IGJ5dGUgRkNTLgogICovCiBzdGF0aWMgdm9pZAotd2xjX2Jjbl9wcmJfdGVtcGxhdGUod2xjX2luZm9fdCAqd2xjLCB1aW50IHR5cGUsIHJhdGVzcGVjX3QgYmNuX3JzcGVjLAord2xjX2Jjbl9wcmJfdGVtcGxhdGUoc3RydWN0IHdsY19pbmZvICp3bGMsIHVpbnQgdHlwZSwgcmF0ZXNwZWNfdCBiY25fcnNwZWMsCiAJCSAgICAgd2xjX2Jzc2NmZ190ICpjZmcsIHUxNiAqYnVmLCBpbnQgKmxlbikKIHsKIAljY2tfcGh5X2hkcl90ICpwbGNwOwpAQCAtNzg0Myw3ICs3NjMwLDcgQEAKIAkqbGVuID0gaGRyX2xlbiArIGJvZHlfbGVuOwkvKiByZXR1cm4gYWN0dWFsIHNpemUgKi8KIAogCS8qIGZvcm1hdCBQSFkgYW5kIE1BQyBoZWFkZXJzICovCi0JYnplcm8oKGNoYXIgKilidWYsIGhkcl9sZW4pOworCW1lbXNldCgoY2hhciAqKWJ1ZiwgMCwgaGRyX2xlbik7CiAKIAlwbGNwID0gKGNja19waHlfaGRyX3QgKikgYnVmOwogCkBAIC03ODcyLDkgKzc2NTksOSBAQAogCS8qIEExIGZpbGxlZCBpbiBieSBNQUMgZm9yIHByYiByZXNwLCBicm9hZGNhc3QgZm9yIGJjbiAqLwogCWlmICh0eXBlID09IEZDX0JFQUNPTikKIAkJYmNvcHkoKGNvbnN0IGNoYXIgKikmZXRoZXJfYmNhc3QsIChjaGFyICopJmgtPmRhLAotCQkgICAgICBFVEhFUl9BRERSX0xFTik7Ci0JYmNvcHkoKGNoYXIgKikmY2ZnLT5jdXJfZXRoZXJhZGRyLCAoY2hhciAqKSZoLT5zYSwgRVRIRVJfQUREUl9MRU4pOwotCWJjb3B5KChjaGFyICopJmNmZy0+QlNTSUQsIChjaGFyICopJmgtPmJzc2lkLCBFVEhFUl9BRERSX0xFTik7CisJCSAgICAgIEVUSF9BTEVOKTsKKwliY29weSgoY2hhciAqKSZjZmctPmN1cl9ldGhlcmFkZHIsIChjaGFyICopJmgtPnNhLCBFVEhfQUxFTik7CisJYmNvcHkoKGNoYXIgKikmY2ZnLT5CU1NJRCwgKGNoYXIgKikmaC0+YnNzaWQsIEVUSF9BTEVOKTsKIAogCS8qIFNFUSBmaWxsZWQgaW4gYnkgTUFDICovCiAKQEAgLTc4OTEsNyArNzY3OCw3IEBACiAgKiB0ZW1wbGF0ZSB1cGRhdGVkLgogICogT3RoZXJ3aXNlLCBpdCB1cGRhdGVzIHRoZSBoYXJkd2FyZSB0ZW1wbGF0ZS4KICAqLwotdm9pZCB3bGNfYnNzX3VwZGF0ZV9iZWFjb24od2xjX2luZm9fdCAqd2xjLCB3bGNfYnNzY2ZnX3QgKmNmZykKK3ZvaWQgd2xjX2Jzc191cGRhdGVfYmVhY29uKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB3bGNfYnNzY2ZnX3QgKmNmZykKIHsKIAlpbnQgbGVuID0gQkNOX1RNUExfTEVOOwogCkBAIC03OTA3LDcgKzc2OTQsNyBAQAogCQl1MTYgYmNuW0JDTl9UTVBMX0xFTiAvIDJdOwogCQl1MzIgYm90aF92YWxpZCA9IE1DTURfQkNOMFZMRCB8IE1DTURfQkNOMVZMRDsKIAkJZDExcmVnc190ICpyZWdzID0gd2xjLT5yZWdzOwotCQlvc2xfdCAqb3NoID0gTlVMTDsKKwkJc3RydWN0IG9zbF9pbmZvICpvc2ggPSBOVUxMOwogCiAJCW9zaCA9IHdsYy0+b3NoOwogCkBAIC03OTQ0LDcgKzc3MzEsNyBAQAogLyoKICAqIFVwZGF0ZSBhbGwgYmVhY29ucyBmb3IgdGhlIHN5c3RlbS4KICAqLwotdm9pZCB3bGNfdXBkYXRlX2JlYWNvbih3bGNfaW5mb190ICp3bGMpCit2b2lkIHdsY191cGRhdGVfYmVhY29uKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCWludCBpZHg7CiAJd2xjX2Jzc2NmZ190ICpic3NjZmc7CkBAIC03OTU3LDE0ICs3NzQ0LDE0IEBACiB9CiAKIC8qIFdyaXRlIHNzaWQgaW50byBzaGFyZWQgbWVtb3J5ICovCi12b2lkIHdsY19zaG1fc3NpZF91cGQod2xjX2luZm9fdCAqd2xjLCB3bGNfYnNzY2ZnX3QgKmNmZykKK3ZvaWQgd2xjX3NobV9zc2lkX3VwZChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgd2xjX2Jzc2NmZ190ICpjZmcpCiB7CiAJdTggKnNzaWRwdHIgPSBjZmctPlNTSUQ7CiAJdTE2IGJhc2UgPSBNX1NTSUQ7CiAJdTggc3NpZGJ1ZltET1QxMV9NQVhfU1NJRF9MRU5dOwogCiAJLyogcGFkZGluZyB0aGUgc3NpZCB3aXRoIHplcm8gYW5kIGNvcHkgaXQgaW50byBzaG0gKi8KLQliemVybyhzc2lkYnVmLCBET1QxMV9NQVhfU1NJRF9MRU4pOworCW1lbXNldChzc2lkYnVmLCAwLCBET1QxMV9NQVhfU1NJRF9MRU4pOwogCWJjb3B5KHNzaWRwdHIsIHNzaWRidWYsIGNmZy0+U1NJRF9sZW4pOwogCiAJd2xjX2NvcHl0b19zaG0od2xjLCBiYXNlLCBzc2lkYnVmLCBET1QxMV9NQVhfU1NJRF9MRU4pOwpAQCAtNzk3Myw3ICs3NzYwLDcgQEAKIAkJd2xjX3dyaXRlX3NobSh3bGMsIE1fU1NJRExFTiwgKHUxNikgY2ZnLT5TU0lEX2xlbik7CiB9CiAKLXZvaWQgd2xjX3VwZGF0ZV9wcm9iZV9yZXNwKHdsY19pbmZvX3QgKndsYywgYm9vbCBzdXNwZW5kKQordm9pZCB3bGNfdXBkYXRlX3Byb2JlX3Jlc3Aoc3RydWN0IHdsY19pbmZvICp3bGMsIGJvb2wgc3VzcGVuZCkKIHsKIAlpbnQgaWR4OwogCXdsY19ic3NjZmdfdCAqYnNzY2ZnOwpAQCAtNzk4Niw3ICs3NzczLDcgQEAKIH0KIAogdm9pZAotd2xjX2Jzc191cGRhdGVfcHJvYmVfcmVzcCh3bGNfaW5mb190ICp3bGMsIHdsY19ic3NjZmdfdCAqY2ZnLCBib29sIHN1c3BlbmQpCit3bGNfYnNzX3VwZGF0ZV9wcm9iZV9yZXNwKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB3bGNfYnNzY2ZnX3QgKmNmZywgYm9vbCBzdXNwZW5kKQogewogCXUxNiBwcmJfcmVzcFtCQ05fVE1QTF9MRU4gLyAyXTsKIAlpbnQgbGVuID0gQkNOX1RNUExfTEVOOwpAQCAtODAyNyw5ICs3ODE0LDkgQEAKIH0KIAogLyogcHJlcGFyZXMgcGR1IGZvciB0cmFuc21pc3Npb24uIHJldHVybnMgQkNNIGVycm9yIGNvZGVzICovCi1pbnQgd2xjX3ByZXBfcGR1KHdsY19pbmZvX3QgKndsYywgdm9pZCAqcGR1LCB1aW50ICpmaWZvcCkKK2ludCB3bGNfcHJlcF9wZHUoc3RydWN0IHdsY19pbmZvICp3bGMsIHN0cnVjdCBza19idWZmICpwZHUsIHVpbnQgKmZpZm9wKQogewotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAJdWludCBmaWZvOwogCWQxMXR4aF90ICp0eGg7CiAJc3RydWN0IGRvdDExX2hlYWRlciAqaDsKQEAgLTgwMzksNyArNzgyNiw3IEBACiAJb3NoID0gd2xjLT5vc2g7CiAKIAlBU1NFUlQocGR1KTsKLQl0eGggPSAoZDExdHhoX3QgKikgUEtUREFUQShwZHUpOworCXR4aCA9IChkMTF0eGhfdCAqKSAocGR1LT5kYXRhKTsKIAlBU1NFUlQodHhoKTsKIAloID0gKHN0cnVjdCBkb3QxMV9oZWFkZXIgKikoKHU4ICopICh0eGggKyAxKSArIEQxMV9QSFlfSERSX0xFTik7CiAJQVNTRVJUKGgpOwpAQCAtODA2Niw3ICs3ODUzLDcgQEAKIH0KIAogLyogaW5pdCB0eCByZXBvcnRlZCByYXRlIG1lY2hhbmlzbSAqLwotdm9pZCB3bGNfcmVwcmF0ZV9pbml0KHdsY19pbmZvX3QgKndsYykKK3ZvaWQgd2xjX3JlcHJhdGVfaW5pdChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAlpbnQgaTsKIAl3bGNfYnNzY2ZnX3QgKmJzc2NmZzsKQEAgLTgwODAsMTMgKzc4NjcsMTMgQEAKIHZvaWQgd2xjX2Jzc2NmZ19yZXByYXRlX2luaXQod2xjX2Jzc2NmZ190ICpic3NjZmcpCiB7CiAJYnNzY2ZnLT50eHJzcGVjaWR4ID0gMDsKLQliemVybygoY2hhciAqKWJzc2NmZy0+dHhyc3BlYywgc2l6ZW9mKGJzc2NmZy0+dHhyc3BlYykpOworCW1lbXNldCgoY2hhciAqKWJzc2NmZy0+dHhyc3BlYywgMCwgc2l6ZW9mKGJzc2NmZy0+dHhyc3BlYykpOwogfQogCiAvKiBSZXRyaWV2ZSBhIGNvbnNvbGlkYXRlZCBzZXQgb2YgcmV2aXNpb24gaW5mb3JtYXRpb24sCiAgKiB0eXBpY2FsbHkgZm9yIHRoZSBXTENfR0VUX1JFVklORk8gaW9jdGwKICAqLwotaW50IHdsY19nZXRfcmV2aXNpb25faW5mbyh3bGNfaW5mb190ICp3bGMsIHZvaWQgKmJ1ZiwgdWludCBsZW4pCitpbnQgd2xjX2dldF9yZXZpc2lvbl9pbmZvKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB2b2lkICpidWYsIHVpbnQgbGVuKQogewogCXdsY19yZXZfaW5mb190ICpyaW5mbyA9ICh3bGNfcmV2X2luZm9fdCAqKSBidWY7CiAKQEAgLTgxMjAsNyArNzkwNyw3IEBACiAJcmV0dXJuIEJDTUVfT0s7CiB9CiAKLXZvaWQgd2xjX2RlZmF1bHRfcmF0ZXNldCh3bGNfaW5mb190ICp3bGMsIHdsY19yYXRlc2V0X3QgKnJzKQordm9pZCB3bGNfZGVmYXVsdF9yYXRlc2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB3bGNfcmF0ZXNldF90ICpycykKIHsKIAl3bGNfcmF0ZXNldF9kZWZhdWx0KHJzLCBOVUxMLCB3bGMtPmJhbmQtPnBoeXR5cGUsIHdsYy0+YmFuZC0+YmFuZHR5cGUsCiAJCQkgICAgZmFsc2UsIFJBVEVfTUFTS19GVUxMLCAoYm9vbCkgTl9FTkFCKHdsYy0+cHViKSwKQEAgLTgxMjgsMTQgKzc5MTUsMTQgQEAKIAkJCSAgICB3bGMtPnN0Zi0+dHhzdHJlYW1zKTsKIH0KIAotc3RhdGljIHZvaWQgd2xjX2Jzc19kZWZhdWx0X2luaXQod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIHZvaWQgd2xjX2Jzc19kZWZhdWx0X2luaXQoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJY2hhbnNwZWNfdCBjaGFuc3BlYzsKLQl3bGNiYW5kX3QgKmJhbmQ7CisJc3RydWN0IHdsY2JhbmQgKmJhbmQ7CiAJd2xjX2Jzc19pbmZvX3QgKmJpID0gd2xjLT5kZWZhdWx0X2JzczsKIAogCS8qIGluaXQgZGVmYXVsdCBhbmQgdGFyZ2V0IEJTUyB3aXRoIHNvbWUgc2FuZSBpbml0aWFsIHZhbHVlcyAqLwotCWJ6ZXJvKChjaGFyICopKGJpKSwgc2l6ZW9mKHdsY19ic3NfaW5mb190KSk7CisJbWVtc2V0KChjaGFyICopKGJpKSwgMCwgc2l6ZW9mKHdsY19ic3NfaW5mb190KSk7CiAJYmktPmJlYWNvbl9wZXJpb2QgPSBJU1NJTV9FTkFCKHdsYy0+cHViLT5zaWgpID8gQkVBQ09OX0lOVEVSVkFMX0RFRl9RVCA6CiAJICAgIEJFQUNPTl9JTlRFUlZBTF9ERUZBVUxUOwogCWJpLT5kdGltX3BlcmlvZCA9IElTU0lNX0VOQUIod2xjLT5wdWItPnNpaCkgPyBEVElNX0lOVEVSVkFMX0RFRl9RVCA6CkBAIC04MTY2LDcgKzc5NTMsNyBAQAogLyogRGVmZXJyZWQgZXZlbnQgcHJvY2Vzc2luZyAqLwogc3RhdGljIHZvaWQgd2xjX3Byb2Nlc3NfZXZlbnRxKHZvaWQgKmFyZykKIHsKLQl3bGNfaW5mb190ICp3bGMgPSAod2xjX2luZm9fdCAqKSBhcmc7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSAoc3RydWN0IHdsY19pbmZvICopIGFyZzsKIAl3bGNfZXZlbnRfdCAqZXRtcDsKIAogCXdoaWxlICgoZXRtcCA9IHdsY19ldmVudHFfZGVxKHdsYy0+ZXZlbnRxKSkpIHsKQEAgLTgxOTIsNyArNzk3OSw4IEBACiB9CiAKIHN0YXRpYyByYXRlc3BlY190Ci1tYWM4MDIxMV93bGNfc2V0X25yYXRlKHdsY19pbmZvX3QgKndsYywgd2xjYmFuZF90ICpjdXJfYmFuZCwgdTMyIGludF92YWwpCittYWM4MDIxMV93bGNfc2V0X25yYXRlKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBzdHJ1Y3Qgd2xjYmFuZCAqY3VyX2JhbmQsCisJCSAgICAgICB1MzIgaW50X3ZhbCkKIHsKIAl1OCBzdGYgPSAoaW50X3ZhbCAmIE5SQVRFX1NURl9NQVNLKSA+PiBOUkFURV9TVEZfU0hJRlQ7CiAJdTggcmF0ZSA9IGludF92YWwgJiBOUkFURV9SQVRFX01BU0s7CkBAIC04MjExLDggKzc5OTksOCBAQAogCWlmIChOX0VOQUIod2xjLT5wdWIpICYmIGlzbWNzKSB7CiAJCS8qIG1jcyBvbmx5IGFsbG93ZWQgd2hlbiBubW9kZSAqLwogCQlpZiAoc3RmID4gUEhZX1RYQzFfTU9ERV9TRE0pIHsKLQkJCVdMX0VSUk9SKCgid2wlZDogJXM6IEludmFsaWQgc3RmXG4iLCBXTENXTFVOSVQod2xjKSwKLQkJCQkgIF9fZnVuY19fKSk7CisJCQlXTF9FUlJPUigid2wlZDogJXM6IEludmFsaWQgc3RmXG4iLAorCQkJCSBXTENXTFVOSVQod2xjKSwgX19mdW5jX18pOwogCQkJYmNtZXJyb3IgPSBCQ01FX1JBTkdFOwogCQkJZ290byBkb25lOwogCQl9CkBAIC04MjIyLDggKzgwMTAsOCBAQAogCQkJaWYgKCFDSFNQRUNfSVM0MCh3bGMtPmhvbWVfY2hhbnNwZWMpIHx8CiAJCQkgICAgKChzdGYgIT0gUEhZX1RYQzFfTU9ERV9TSVNPKQogCQkJICAgICAmJiAoc3RmICE9IFBIWV9UWEMxX01PREVfQ0REKSkpIHsKLQkJCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBJbnZhbGlkIG1jcyAzMlxuIiwKLQkJCQkJICBXTENXTFVOSVQod2xjKSwgX19mdW5jX18pKTsKKwkJCQlXTF9FUlJPUigid2wlZDogJXM6IEludmFsaWQgbWNzIDMyXG4iLAorCQkJCQkgV0xDV0xVTklUKHdsYyksIF9fZnVuY19fKTsKIAkJCQliY21lcnJvciA9IEJDTUVfUkFOR0U7CiAJCQkJZ290byBkb25lOwogCQkJfQpAQCAtODIzMSw3ICs4MDE5LDggQEAKIAkJfSBlbHNlIGlmIChyYXRlID4gSElHSEVTVF9TSU5HTEVfU1RSRUFNX01DUykgewogCQkJLyogbWNzID4gNyBtdXN0IHVzZSBzdGYgU0RNICovCiAJCQlpZiAoc3RmICE9IFBIWV9UWEMxX01PREVfU0RNKSB7Ci0JCQkJV0xfVFJBQ0UoKCJ3bCVkOiAlczogZW5hYmxpbmcgU0RNIG1vZGUgZm9yIG1jcyAlZFxuIiwgV0xDV0xVTklUKHdsYyksIF9fZnVuY19fLCByYXRlKSk7CisJCQkJV0xfVFJBQ0UoIndsJWQ6ICVzOiBlbmFibGluZyBTRE0gbW9kZSBmb3IgbWNzICVkXG4iLAorCQkJCQkgV0xDV0xVTklUKHdsYyksIF9fZnVuY19fLCByYXRlKTsKIAkJCQlzdGYgPSBQSFlfVFhDMV9NT0RFX1NETTsKIAkJCX0KIAkJfSBlbHNlIHsKQEAgLTgyMzksMzcgKzgwMjgsMzcgQEAKIAkJCWlmICgoc3RmID4gUEhZX1RYQzFfTU9ERV9TVEJDKSB8fAogCQkJICAgICghV0xDX1NUQkNfQ0FQX1BIWSh3bGMpCiAJCQkgICAgICYmIChzdGYgPT0gUEhZX1RYQzFfTU9ERV9TVEJDKSkpIHsKLQkJCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBJbnZhbGlkIFNUQkNcbiIsCi0JCQkJCSAgV0xDV0xVTklUKHdsYyksIF9fZnVuY19fKSk7CisJCQkJV0xfRVJST1IoIndsJWQ6ICVzOiBJbnZhbGlkIFNUQkNcbiIsCisJCQkJCSBXTENXTFVOSVQod2xjKSwgX19mdW5jX18pOwogCQkJCWJjbWVycm9yID0gQkNNRV9SQU5HRTsKIAkJCQlnb3RvIGRvbmU7CiAJCQl9CiAJCX0KIAl9IGVsc2UgaWYgKElTX09GRE0ocmF0ZSkpIHsKIAkJaWYgKChzdGYgIT0gUEhZX1RYQzFfTU9ERV9DREQpICYmIChzdGYgIT0gUEhZX1RYQzFfTU9ERV9TSVNPKSkgewotCQkJV0xfRVJST1IoKCJ3bCVkOiAlczogSW52YWxpZCBPRkRNXG4iLCBXTENXTFVOSVQod2xjKSwKLQkJCQkgIF9fZnVuY19fKSk7CisJCQlXTF9FUlJPUigid2wlZDogJXM6IEludmFsaWQgT0ZETVxuIiwKKwkJCQkgV0xDV0xVTklUKHdsYyksIF9fZnVuY19fKTsKIAkJCWJjbWVycm9yID0gQkNNRV9SQU5HRTsKIAkJCWdvdG8gZG9uZTsKIAkJfQogCX0gZWxzZSBpZiAoSVNfQ0NLKHJhdGUpKSB7CiAJCWlmICgoY3VyX2JhbmQtPmJhbmR0eXBlICE9IFdMQ19CQU5EXzJHKQogCQkgICAgfHwgKHN0ZiAhPSBQSFlfVFhDMV9NT0RFX1NJU08pKSB7Ci0JCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBJbnZhbGlkIENDS1xuIiwgV0xDV0xVTklUKHdsYyksCi0JCQkJICBfX2Z1bmNfXykpOworCQkJV0xfRVJST1IoIndsJWQ6ICVzOiBJbnZhbGlkIENDS1xuIiwKKwkJCQkgV0xDV0xVTklUKHdsYyksIF9fZnVuY19fKTsKIAkJCWJjbWVycm9yID0gQkNNRV9SQU5HRTsKIAkJCWdvdG8gZG9uZTsKIAkJfQogCX0gZWxzZSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogJXM6IFVua25vd24gcmF0ZSB0eXBlXG4iLCBXTENXTFVOSVQod2xjKSwKLQkJCSAgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIndsJWQ6ICVzOiBVbmtub3duIHJhdGUgdHlwZVxuIiwKKwkJCSBXTENXTFVOSVQod2xjKSwgX19mdW5jX18pOwogCQliY21lcnJvciA9IEJDTUVfUkFOR0U7CiAJCWdvdG8gZG9uZTsKIAl9CiAJLyogbWFrZSBzdXJlIG11bHRpcGxlIGFudGVubmFlIGFyZSBhdmFpbGFibGUgZm9yIG5vbi1zaXNvIHJhdGVzICovCiAJaWYgKChzdGYgIT0gUEhZX1RYQzFfTU9ERV9TSVNPKSAmJiAod2xjLT5zdGYtPnR4c3RyZWFtcyA9PSAxKSkgewotCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBTSVNPIGFudGVubmEgYnV0ICFTSVNPIHJlcXVlc3RcbiIsCi0JCQkgIFdMQ1dMVU5JVCh3bGMpLCBfX2Z1bmNfXykpOworCQlXTF9FUlJPUigid2wlZDogJXM6IFNJU08gYW50ZW5uYSBidXQgIVNJU08gcmVxdWVzdFxuIiwKKwkJCSBXTENXTFVOSVQod2xjKSwgX19mdW5jX18pOwogCQliY21lcnJvciA9IEJDTUVfUkFOR0U7CiAJCWdvdG8gZG9uZTsKIAl9CkBAIC04MzAwLDEzICs4MDg5LDEzIEBACiAKIAlyZXR1cm4gcnNwZWM7CiAgZG9uZToKLQlXTF9FUlJPUigoIkhvYXJrXG4iKSk7CisJV0xfRVJST1IoIkhvYXJrXG4iKTsKIAlyZXR1cm4gcmF0ZTsKIH0KIAogLyogZm9ybXVsYTogIElETEVfQlVTWV9SQVRJT19YXzE2ID0gKDEwMC1kdXR5X2N5Y2xlKS9kdXR5X2N5Y2xlKjE2ICovCiBzdGF0aWMgaW50Ci13bGNfZHV0eV9jeWNsZV9zZXQod2xjX2luZm9fdCAqd2xjLCBpbnQgZHV0eV9jeWNsZSwgYm9vbCBpc09GRE0sCit3bGNfZHV0eV9jeWNsZV9zZXQoc3RydWN0IHdsY19pbmZvICp3bGMsIGludCBkdXR5X2N5Y2xlLCBib29sIGlzT0ZETSwKIAkJICAgYm9vbCB3cml0ZVRvU2htKQogewogCWludCBpZGxlX2J1c3lfcmF0aW9feF8xNiA9IDA7CkBAIC04MzE0LDggKzgxMDMsNyBAQAogCSAgICBpc09GRE0gPyBNX1RYX0lETEVfQlVTWV9SQVRJT19YXzE2X09GRE0gOgogCSAgICBNX1RYX0lETEVfQlVTWV9SQVRJT19YXzE2X0NDSzsKIAlpZiAoZHV0eV9jeWNsZSA+IDEwMCB8fCBkdXR5X2N5Y2xlIDwgMCkgewotCQlXTF9FUlJPUigoIndsJWQ6ICBkdXR5IGN5Y2xlIHZhbHVlIG9mZiBsaW1pdFxuIiwKLQkJCSAgd2xjLT5wdWItPnVuaXQpKTsKKwkJV0xfRVJST1IoIndsJWQ6ICBkdXR5IGN5Y2xlIHZhbHVlIG9mZiBsaW1pdFxuIiwgd2xjLT5wdWItPnVuaXQpOwogCQlyZXR1cm4gQkNNRV9SQU5HRTsKIAl9CiAJaWYgKGR1dHlfY3ljbGUpCkBAIC04MzM1LDcgKzgxMjMsNyBAQAogLyogUmVhZCBhIHNpbmdsZSB1MTYgZnJvbSBzaGFyZWQgbWVtb3J5LgogICogU0hNICdvZmZzZXQnIG5lZWRzIHRvIGJlIGFuIGV2ZW4gYWRkcmVzcwogICovCi11MTYgd2xjX3JlYWRfc2htKHdsY19pbmZvX3QgKndsYywgdWludCBvZmZzZXQpCit1MTYgd2xjX3JlYWRfc2htKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1aW50IG9mZnNldCkKIHsKIAlyZXR1cm4gd2xjX2JtYWNfcmVhZF9zaG0od2xjLT5odywgb2Zmc2V0KTsKIH0KQEAgLTgzNDMsNyArODEzMSw3IEBACiAvKiBXcml0ZSBhIHNpbmdsZSB1MTYgdG8gc2hhcmVkIG1lbW9yeS4KICAqIFNITSAnb2Zmc2V0JyBuZWVkcyB0byBiZSBhbiBldmVuIGFkZHJlc3MKICAqLwotdm9pZCB3bGNfd3JpdGVfc2htKHdsY19pbmZvX3QgKndsYywgdWludCBvZmZzZXQsIHUxNiB2KQordm9pZCB3bGNfd3JpdGVfc2htKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1aW50IG9mZnNldCwgdTE2IHYpCiB7CiAJd2xjX2JtYWNfd3JpdGVfc2htKHdsYy0+aHcsIG9mZnNldCwgdik7CiB9CkBAIC04MzUyLDcgKzgxNDAsNyBAQAogICogU0hNICdvZmZzZXQnIG5lZWRzIHRvIGJlIGFuIGV2ZW4gYWRkcmVzcyBhbmQKICAqIFJhbmdlIGxlbmd0aCAnbGVuJyBtdXN0IGJlIGFuIGV2ZW4gbnVtYmVyIG9mIGJ5dGVzCiAgKi8KLXZvaWQgd2xjX3NldF9zaG0od2xjX2luZm9fdCAqd2xjLCB1aW50IG9mZnNldCwgdTE2IHYsIGludCBsZW4pCit2b2lkIHdsY19zZXRfc2htKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1aW50IG9mZnNldCwgdTE2IHYsIGludCBsZW4pCiB7CiAJLyogb2Zmc2V0IGFuZCBsZW4gbmVlZCB0byBiZSBldmVuICovCiAJQVNTRVJUKChvZmZzZXQgJiAxKSA9PSAwKTsKQEAgLTgzNjgsNyArODE1Niw3IEBACiAgKiBTSE0gJ29mZnNldCcgbmVlZHMgdG8gYmUgYW4gZXZlbiBhZGRyZXNzIGFuZAogICogQnVmZmVyIGxlbmd0aCAnbGVuJyBtdXN0IGJlIGFuIGV2ZW4gbnVtYmVyIG9mIGJ5dGVzCiAgKi8KLXZvaWQgd2xjX2NvcHl0b19zaG0od2xjX2luZm9fdCAqd2xjLCB1aW50IG9mZnNldCwgY29uc3Qgdm9pZCAqYnVmLCBpbnQgbGVuKQordm9pZCB3bGNfY29weXRvX3NobShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdWludCBvZmZzZXQsIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IGxlbikKIHsKIAkvKiBvZmZzZXQgYW5kIGxlbiBuZWVkIHRvIGJlIGV2ZW4gKi8KIAlBU1NFUlQoKG9mZnNldCAmIDEpID09IDApOwpAQCAtODM4NCw3ICs4MTcyLDcgQEAKICAqIFNITSAnb2Zmc2V0JyBuZWVkcyB0byBiZSBhbiBldmVuIGFkZHJlc3MgYW5kCiAgKiBCdWZmZXIgbGVuZ3RoICdsZW4nIG11c3QgYmUgYW4gZXZlbiBudW1iZXIgb2YgYnl0ZXMKICAqLwotdm9pZCB3bGNfY29weWZyb21fc2htKHdsY19pbmZvX3QgKndsYywgdWludCBvZmZzZXQsIHZvaWQgKmJ1ZiwgaW50IGxlbikKK3ZvaWQgd2xjX2NvcHlmcm9tX3NobShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdWludCBvZmZzZXQsIHZvaWQgKmJ1ZiwgaW50IGxlbikKIHsKIAkvKiBvZmZzZXQgYW5kIGxlbiBuZWVkIHRvIGJlIGV2ZW4gKi8KIAlBU1NFUlQoKG9mZnNldCAmIDEpID09IDApOwpAQCAtODM5Nyw3MSArODE4NSw3MyBAQAogfQogCiAvKiB3cmFwcGVyIEJNQUMgZnVuY3Rpb25zIHRvIGZvciBISUdIIGRyaXZlciBhY2Nlc3MgKi8KLXZvaWQgd2xjX21jdHJsKHdsY19pbmZvX3QgKndsYywgdTMyIG1hc2ssIHUzMiB2YWwpCit2b2lkIHdsY19tY3RybChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTMyIG1hc2ssIHUzMiB2YWwpCiB7CiAJd2xjX2JtYWNfbWN0cmwod2xjLT5odywgbWFzaywgdmFsKTsKIH0KIAotdm9pZCB3bGNfY29yZXJlc2V0KHdsY19pbmZvX3QgKndsYywgdTMyIGZsYWdzKQordm9pZCB3bGNfY29yZXJlc2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1MzIgZmxhZ3MpCiB7CiAJd2xjX2JtYWNfY29yZXJlc2V0KHdsYy0+aHcsIGZsYWdzKTsKIH0KIAotdm9pZCB3bGNfbWhmKHdsY19pbmZvX3QgKndsYywgdTggaWR4LCB1MTYgbWFzaywgdTE2IHZhbCwgaW50IGJhbmRzKQordm9pZCB3bGNfbWhmKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1OCBpZHgsIHUxNiBtYXNrLCB1MTYgdmFsLCBpbnQgYmFuZHMpCiB7CiAJd2xjX2JtYWNfbWhmKHdsYy0+aHcsIGlkeCwgbWFzaywgdmFsLCBiYW5kcyk7CiB9CiAKLXUxNiB3bGNfbWhmX2dldCh3bGNfaW5mb190ICp3bGMsIHU4IGlkeCwgaW50IGJhbmRzKQordTE2IHdsY19taGZfZ2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1OCBpZHgsIGludCBiYW5kcykKIHsKIAlyZXR1cm4gd2xjX2JtYWNfbWhmX2dldCh3bGMtPmh3LCBpZHgsIGJhbmRzKTsKIH0KIAotaW50IHdsY194bXRmaWZvX3N6X2dldCh3bGNfaW5mb190ICp3bGMsIHVpbnQgZmlmbywgdWludCAqYmxvY2tzKQoraW50IHdsY194bXRmaWZvX3N6X2dldChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdWludCBmaWZvLCB1aW50ICpibG9ja3MpCiB7CiAJcmV0dXJuIHdsY19ibWFjX3htdGZpZm9fc3pfZ2V0KHdsYy0+aHcsIGZpZm8sIGJsb2Nrcyk7CiB9CiAKLXZvaWQgd2xjX3dyaXRlX3RlbXBsYXRlX3JhbSh3bGNfaW5mb190ICp3bGMsIGludCBvZmZzZXQsIGludCBsZW4sIHZvaWQgKmJ1ZikKK3ZvaWQgd2xjX3dyaXRlX3RlbXBsYXRlX3JhbShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgaW50IG9mZnNldCwgaW50IGxlbiwKKwkJCSAgICB2b2lkICpidWYpCiB7CiAJd2xjX2JtYWNfd3JpdGVfdGVtcGxhdGVfcmFtKHdsYy0+aHcsIG9mZnNldCwgbGVuLCBidWYpOwogfQogCi12b2lkIHdsY193cml0ZV9od19iY250ZW1wbGF0ZXMod2xjX2luZm9fdCAqd2xjLCB2b2lkICpiY24sIGludCBsZW4sIGJvb2wgYm90aCkKK3ZvaWQgd2xjX3dyaXRlX2h3X2JjbnRlbXBsYXRlcyhzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdm9pZCAqYmNuLCBpbnQgbGVuLAorCQkJICAgICAgIGJvb2wgYm90aCkKIHsKIAl3bGNfYm1hY193cml0ZV9od19iY250ZW1wbGF0ZXMod2xjLT5odywgYmNuLCBsZW4sIGJvdGgpOwogfQogCiB2b2lkCi13bGNfc2V0X2FkZHJtYXRjaCh3bGNfaW5mb190ICp3bGMsIGludCBtYXRjaF9yZWdfb2Zmc2V0LAord2xjX3NldF9hZGRybWF0Y2goc3RydWN0IHdsY19pbmZvICp3bGMsIGludCBtYXRjaF9yZWdfb2Zmc2V0LAogCQkgIGNvbnN0IHN0cnVjdCBldGhlcl9hZGRyICphZGRyKQogewogCXdsY19ibWFjX3NldF9hZGRybWF0Y2god2xjLT5odywgbWF0Y2hfcmVnX29mZnNldCwgYWRkcik7CiB9CiAKLXZvaWQgd2xjX3NldF9yY210YSh3bGNfaW5mb190ICp3bGMsIGludCBpZHgsIGNvbnN0IHN0cnVjdCBldGhlcl9hZGRyICphZGRyKQordm9pZCB3bGNfc2V0X3JjbXRhKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBpbnQgaWR4LCBjb25zdCBzdHJ1Y3QgZXRoZXJfYWRkciAqYWRkcikKIHsKIAl3bGNfYm1hY19zZXRfcmNtdGEod2xjLT5odywgaWR4LCBhZGRyKTsKIH0KIAotdm9pZCB3bGNfcmVhZF90c2Yod2xjX2luZm9fdCAqd2xjLCB1MzIgKnRzZl9sX3B0ciwgdTMyICp0c2ZfaF9wdHIpCit2b2lkIHdsY19yZWFkX3RzZihzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTMyICp0c2ZfbF9wdHIsIHUzMiAqdHNmX2hfcHRyKQogewogCXdsY19ibWFjX3JlYWRfdHNmKHdsYy0+aHcsIHRzZl9sX3B0ciwgdHNmX2hfcHRyKTsKIH0KIAotdm9pZCB3bGNfc2V0X2N3bWluKHdsY19pbmZvX3QgKndsYywgdTE2IG5ld21pbikKK3ZvaWQgd2xjX3NldF9jd21pbihzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTE2IG5ld21pbikKIHsKIAl3bGMtPmJhbmQtPkNXbWluID0gbmV3bWluOwogCXdsY19ibWFjX3NldF9jd21pbih3bGMtPmh3LCBuZXdtaW4pOwogfQogCi12b2lkIHdsY19zZXRfY3dtYXgod2xjX2luZm9fdCAqd2xjLCB1MTYgbmV3bWF4KQordm9pZCB3bGNfc2V0X2N3bWF4KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1MTYgbmV3bWF4KQogewogCXdsYy0+YmFuZC0+Q1dtYXggPSBuZXdtYXg7CiAJd2xjX2JtYWNfc2V0X2N3bWF4KHdsYy0+aHcsIG5ld21heCk7CiB9CiAKLXZvaWQgd2xjX2ZpZm9lcnJvcnMod2xjX2luZm9fdCAqd2xjKQordm9pZCB3bGNfZmlmb2Vycm9ycyhzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAogCXdsY19ibWFjX2ZpZm9lcnJvcnMod2xjLT5odyk7CkBAIC04NDY5LDE5ICs4MjU5LDE2IEBACiAKIC8qIFNlYXJjaCBtZW0gcncgdXRpbGl0aWVzICovCiAKLXZvaWQgd2xjX3BsbHJlcSh3bGNfaW5mb190ICp3bGMsIGJvb2wgc2V0LCBtYm9vbCByZXFfYml0KQordm9pZCB3bGNfcGxscmVxKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBib29sIHNldCwgbWJvb2wgcmVxX2JpdCkKIHsKIAl3bGNfYm1hY19wbGxyZXEod2xjLT5odywgc2V0LCByZXFfYml0KTsKIH0KIAotdm9pZCB3bGNfcmVzZXRfYm1hY19kb25lKHdsY19pbmZvX3QgKndsYykKK3ZvaWQgd2xjX3Jlc2V0X2JtYWNfZG9uZShzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKLSNpZmRlZiBXTENfSElHSF9PTkxZCi0Jd2xjLT5yZXNldF9ibWFjX3BlbmRpbmcgPSBmYWxzZTsKLSNlbmRpZgogfQogCi12b2lkIHdsY19odF9taW1vcHNfY2FwX3VwZGF0ZSh3bGNfaW5mb190ICp3bGMsIHU4IG1pbW9wc19tb2RlKQordm9pZCB3bGNfaHRfbWltb3BzX2NhcF91cGRhdGUoc3RydWN0IHdsY19pbmZvICp3bGMsIHU4IG1pbW9wc19tb2RlKQogewogCXdsYy0+aHRfY2FwLmNhcCAmPSB+SFRfQ0FQX01JTU9fUFNfTUFTSzsKIAl3bGMtPmh0X2NhcC5jYXAgfD0gKG1pbW9wc19tb2RlIDw8IEhUX0NBUF9NSU1PX1BTX1NISUZUKTsKQEAgLTg0OTQsNyArODI4MSw3IEBACiAKIC8qIGNoZWNrIGZvciB0aGUgcGFydGljdWxhciBwcmlvcml0eSBmbG93IGNvbnRyb2wgYml0IGJlaW5nIHNldCAqLwogYm9vbAotd2xjX3R4Zmxvd2NvbnRyb2xfcHJpb19pc3NldCh3bGNfaW5mb190ICp3bGMsIHdsY190eHFfaW5mb190ICpxLCBpbnQgcHJpbykKK3dsY190eGZsb3djb250cm9sX3ByaW9faXNzZXQoc3RydWN0IHdsY19pbmZvICp3bGMsIHdsY190eHFfaW5mb190ICpxLCBpbnQgcHJpbykKIHsKIAl1aW50IHByaW9fbWFzazsKIApAQCAtODUwOSwxMiArODI5NiwxMyBAQAogfQogCiAvKiBwcm9wb2dhdGUgdGhlIGZsb3cgY29udHJvbCB0byBhbGwgaW50ZXJmYWNlcyB1c2luZyB0aGUgZ2l2ZW4gdHggcXVldWUgKi8KLXZvaWQgd2xjX3R4Zmxvd2NvbnRyb2wod2xjX2luZm9fdCAqd2xjLCB3bGNfdHhxX2luZm9fdCAqcWksIGJvb2wgb24sIGludCBwcmlvKQordm9pZCB3bGNfdHhmbG93Y29udHJvbChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgd2xjX3R4cV9pbmZvX3QgKnFpLAorCQkgICAgICAgYm9vbCBvbiwgaW50IHByaW8pCiB7CiAJdWludCBwcmlvX2JpdHM7CiAJdWludCBjdXJfYml0czsKIAotCVdMX0VSUk9SKCgiJXM6IGZsb3cgY29udHJvIGtpY2tzIGluXG4iLCBfX2Z1bmNfXykpOworCVdMX0VSUk9SKCIlczogZmxvdyBjb250cm9sIGtpY2tzIGluXG4iLCBfX2Z1bmNfXyk7CiAKIAlpZiAocHJpbyA9PSBBTExQUklPKSB7CiAJCXByaW9fYml0cyA9IFRYUV9TVE9QX0ZPUl9QUklPRkNfTUFTSzsKQEAgLTg1NTEsNyArODMzOSw3IEBACiB9CiAKIHZvaWQKLXdsY190eGZsb3djb250cm9sX292ZXJyaWRlKHdsY19pbmZvX3QgKndsYywgd2xjX3R4cV9pbmZvX3QgKnFpLCBib29sIG9uLAord2xjX3R4Zmxvd2NvbnRyb2xfb3ZlcnJpZGUoc3RydWN0IHdsY19pbmZvICp3bGMsIHdsY190eHFfaW5mb190ICpxaSwgYm9vbCBvbiwKIAkJCSAgIHVpbnQgb3ZlcnJpZGUpCiB7CiAJdWludCBwcmV2X292ZXJyaWRlOwpAQCAtODU5OCw3ICs4Mzg2LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHdsY190eGZsb3djb250cm9sX3Jlc2V0KHdsY19pbmZvX3QgKndsYykKK3N0YXRpYyB2b2lkIHdsY190eGZsb3djb250cm9sX3Jlc2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCXdsY190eHFfaW5mb190ICpxaTsKIApAQCAtODYxMSwxMCArODM5OSwxMCBAQAogfQogCiBzdGF0aWMgdm9pZAotd2xjX3R4Zmxvd2NvbnRyb2xfc2lnbmFsKHdsY19pbmZvX3QgKndsYywgd2xjX3R4cV9pbmZvX3QgKnFpLCBib29sIG9uLAord2xjX3R4Zmxvd2NvbnRyb2xfc2lnbmFsKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB3bGNfdHhxX2luZm9fdCAqcWksIGJvb2wgb24sCiAJCQkgaW50IHByaW8pCiB7Ci0Jd2xjX2lmX3QgKndsY2lmOworCXN0cnVjdCB3bGNfaWYgKndsY2lmOwogCiAJZm9yICh3bGNpZiA9IHdsYy0+d2xjaWZfbGlzdDsgd2xjaWYgIT0gTlVMTDsgd2xjaWYgPSB3bGNpZi0+bmV4dCkgewogCQlpZiAod2xjaWYtPnFpID09IHFpICYmIHdsY2lmLT5mbGFncyAmIFdMQ19JRl9MSU5LRUQpCkBAIC04NjIyLDcgKzg0MTAsNyBAQAogCX0KIH0KIAotc3RhdGljIHdsY190eHFfaW5mb190ICp3bGNfdHhxX2FsbG9jKHdsY19pbmZvX3QgKndsYywgb3NsX3QgKm9zaCkKK3N0YXRpYyB3bGNfdHhxX2luZm9fdCAqd2xjX3R4cV9hbGxvYyhzdHJ1Y3Qgd2xjX2luZm8gKndsYywgc3RydWN0IG9zbF9pbmZvICpvc2gpCiB7CiAJd2xjX3R4cV9pbmZvX3QgKnFpLCAqcDsKIApAQCAtODY1Miw3ICs4NDQwLDggQEAKIAlyZXR1cm4gcWk7CiB9CiAKLXN0YXRpYyB2b2lkIHdsY190eHFfZnJlZSh3bGNfaW5mb190ICp3bGMsIG9zbF90ICpvc2gsIHdsY190eHFfaW5mb190ICpxaSkKK3N0YXRpYyB2b2lkIHdsY190eHFfZnJlZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgc3RydWN0IG9zbF9pbmZvICpvc2gsCisJCQkgd2xjX3R4cV9pbmZvX3QgKnFpKQogewogCXdsY190eHFfaW5mb190ICpwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfbWFjODAyMTEuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19tYWM4MDIxMS5oCmluZGV4IDZhNzc1OTEuLjVkZjk5NmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19tYWM4MDIxMS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19tYWM4MDIxMS5oCkBAIC0xNywxOSArMTcsMTAgQEAKICNpZm5kZWYgX3dsY19oXwogI2RlZmluZSBfd2xjX2hfCiAKLSNpbmNsdWRlIDx3bGNfdHlwZXMuaD4KLQotI2luY2x1ZGUgPHdsX2RiZy5oPgogI2luY2x1ZGUgPHdsaW9jdGwuaD4KLSNpbmNsdWRlIDx3bGNfZXZlbnQuaD4KICNpbmNsdWRlIDx3bGNfcGh5X2hhbC5oPgogI2luY2x1ZGUgPHdsY19jaGFubmVsLmg+Ci0jaWZkZWYgV0xDX1NQTElUCi0jaW5jbHVkZSA8YmNtX3JwYy5oPgotI2VuZGlmCi0KICNpbmNsdWRlIDx3bGNfYnNzY2ZnLmg+Ci0KICNpbmNsdWRlIDx3bGNfc2NiLmg+CiAKICNkZWZpbmUgTUFfV0lORE9XX1NaCQk4CS8qIG1vdmluZyBhdmVyYWdlIHdpbmRvdyBzaXplICovCkBAIC0yMjAsMTUgKzIxMSwxMSBAQAogICogKHNvbWUgcGxhdGZvcm1zIHJldHVybiBhbGwgMCkuCiAgKiBJZiBjbG9ja3MgYXJlIHByZXNlbnQsIGNhbGwgdGhlIHNiIHJvdXRpbmUgd2hpY2ggd2lsbCBmaWd1cmUgb3V0IGlmIHRoZSBkZXZpY2UgaXMgcmVtb3ZlZC4KICAqLwotI2lmZGVmIFdMQ19ISUdIX09OTFkKLSNkZWZpbmUgREVWSUNFUkVNT1ZFRCh3bGMpCSghd2xjLT5kZXZpY2VfcHJlc2VudCkKLSNlbHNlCiAjZGVmaW5lIERFVklDRVJFTU9WRUQod2xjKSAgICAgIFwKIAkoKHdsYy0+aHctPmNsaykgPyAgIFwKIAkoKFJfUkVHKHdsYy0+aHctPm9zaCwgJndsYy0+aHctPnJlZ3MtPm1hY2NvbnRyb2wpICYgXAogCShNQ1RMX1BTTV9KTVBfMCB8IE1DVExfSUhSX0VOKSkgIT0gTUNUTF9JSFJfRU4pIDogXAogCShzaV9kZXZpY2VyZW1vdmVkKHdsYy0+aHctPnNpaCkpKQotI2VuZGlmCQkJCS8qIFdMQ19ISUdIX09OTFkgKi8KIAogI2RlZmluZSBXTENXTFVOSVQod2xjKQkJKCh3bGMpLT5wdWItPnVuaXQpCiAKQEAgLTMxNSwyMiArMzAyLDIwIEBACiAvKgogICogY29yZSBzdGF0ZSAobWFjKQogICovCi10eXBlZGVmIHN0cnVjdCB3bGNjb3JlIHsKLSNpZmRlZiBXTENfTE9XCitzdHJ1Y3Qgd2xjY29yZSB7CiAJdWludCBjb3JlaWR4OwkJLyogIyBzYiBlbnVtZXJhdGVkIGNvcmUgKi8KIAogCS8qIGZpZm8gKi8KIAl1aW50ICp0eGF2YWlsW05GSUZPXTsJLyogIyB0eCBkZXNjcmlwdG9ycyBhdmFpbGFibGUgKi8KIAlzMTYgdHhwa3RwZW5kW05GSUZPXTsJLyogdHggYWRtaXNzaW9uIGNvbnRyb2wgKi8KLSNlbmRpZgkJCQkvKiBXTENfTE9XICovCiAKIAltYWNzdGF0X3QgKm1hY3N0YXRfc25hcHNob3Q7CS8qIG1hYyBodyBwcmV2IHJlYWQgdmFsdWVzICovCi19IHdsY2NvcmVfdDsKK307CiAKIC8qCiAgKiBiYW5kIHN0YXRlIChwaHkrYW5hK3JhZGlvKQogICovCi10eXBlZGVmIHN0cnVjdCB3bGNiYW5kIHsKK3N0cnVjdCB3bGNiYW5kIHsKIAlpbnQgYmFuZHR5cGU7CQkvKiBXTENfQkFORF8yRywgV0xDX0JBTkRfNUcgKi8KIAl1aW50IGJhbmR1bml0OwkJLyogYmFuZHN0YXRlW10gaW5kZXggKi8KIApAQCAtMzU5LDEzICszNDQsMTMgQEAKIAl1MTYgQ1dtaW47CQkvKiBUaGUgbWluaW11bSBzaXplIG9mIGNvbnRlbnRpb24gd2luZG93LCBpbiB1bml0IG9mIGFTbG90VGltZSAqLwogCXUxNiBDV21heDsJCS8qIFRoZSBtYXhpbXVtIHNpemUgb2YgY29udGVudGlvbiB3aW5kb3csIGluIHVuaXQgb2YgYVNsb3RUaW1lICovCiAJdTE2IGJjbnRzZm9mZjsJLyogYmVhY29uIHRzZiBvZmZzZXQgKi8KLX0gd2xjYmFuZF90OworfTsKIAogLyogZ2VuZXJpYyBmdW5jdGlvbiBjYWxsYmFjayB0YWtlcyBqdXN0IG9uZSBhcmcgKi8KIHR5cGVkZWYgdm9pZCAoKmNiX2ZuX3QpICh2b2lkICopOwogCiAvKiB0eCBjb21wbGV0aW9uIGNhbGxiYWNrIHRha2VzIDMgYXJncyAqLwotdHlwZWRlZiB2b2lkICgqcGtjYl9mbl90KSAod2xjX2luZm9fdCAqd2xjLCB1aW50IHR4c3RhdHVzLCB2b2lkICphcmcpOwordHlwZWRlZiB2b2lkICgqcGtjYl9mbl90KSAoc3RydWN0IHdsY19pbmZvICp3bGMsIHVpbnQgdHhzdGF0dXMsIHZvaWQgKmFyZyk7CiAKIHR5cGVkZWYgc3RydWN0IHBrdF9jYiB7CiAJcGtjYl9mbl90IGZuOwkJLyogZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHR4IGZyYW1lIGNvbXBsZXRlcyAqLwpAQCAtMzk4LDE0ICszODMsMTQgQEAKIAogLyogdmlydHVhbCBpbnRlcmZhY2UgKi8KIHN0cnVjdCB3bGNfaWYgewotCXdsY19pZl90ICpuZXh0OworCXN0cnVjdCB3bGNfaWYgKm5leHQ7CiAJdTggdHlwZTsJCS8qIFdMQ19JRlRZUEVfQlNTIG9yIFdMQ19JRlRZUEVfV0RTICovCiAJdTggaW5kZXg7CQkvKiBhc3NpZ25lZCBpbiB3bF9hZGRfaWYoKSwgaW5kZXggb2YgdGhlIHdsaWYgaWYgYW55LAogCQkJCSAqIG5vdCBuZWNlc3NhcmlseSBjb3JyZXNwb25kaW5nIHRvIGJzc2NmZy5faWR4IG9yCiAJCQkJICogQUlEMlBWQk1BUChzY2IpLgogCQkJCSAqLwogCXU4IGZsYWdzOwkJLyogZmxhZ3MgZm9yIHRoZSBpbnRlcmZhY2UgKi8KLQl3bF9pZl90ICp3bGlmOwkJLyogcG9pbnRlciB0byB3bGlmICovCisJc3RydWN0IHdsX2lmICp3bGlmOwkJLyogcG9pbnRlciB0byB3bGlmICovCiAJc3RydWN0IHdsY190eHFfaW5mbyAqcWk7CS8qIHBvaW50ZXIgdG8gYXNzb2NpYXRlZCB0eCBxdWV1ZSAqLwogCXVuaW9uIHsKIAkJc3RydWN0IHNjYiAqc2NiOwkvKiBwb2ludGVyIHRvIHNjYiBpZiBXTENfSUZUWVBFX1dEUyAqLwpAQCAtNDE2LDcgKzQwMSw2IEBACiAvKiBmbGFncyBmb3IgdGhlIGludGVyZmFjZSAqLwogI2RlZmluZSBXTENfSUZfTElOS0VECQkweDAyCS8qIHRoaXMgaW50ZXJmYWNlIGlzIGxpbmtlZCB0byBhIHdsX2lmICovCiAKLSNpZmRlZiBXTENfTE9XCiB0eXBlZGVmIHN0cnVjdCB3bGNfaHdiYW5kIHsKIAlpbnQgYmFuZHR5cGU7CQkvKiBXTENfQkFORF8yRywgV0xDX0JBTkRfNUcgKi8KIAl1aW50IGJhbmR1bml0OwkJLyogYmFuZHN0YXRlW10gaW5kZXggKi8KQEAgLTQzMywyMCArNDE3LDE1IEBACiAJd2xjX3BoeV90ICpwaTsJCS8qIHBvaW50ZXIgdG8gcGh5IHNwZWNpZmljIGluZm9ybWF0aW9uICovCiAJYm9vbCBhYmdwaHlfZW5jb3JlOwogfSB3bGNfaHdiYW5kX3Q7Ci0jZW5kaWYJCQkJLyogV0xDX0xPVyAqLwogCiBzdHJ1Y3Qgd2xjX2h3X2luZm8gewotI2lmZGVmIFdMQ19TUExJVAotCXJwY19pbmZvX3QgKnJwYzsJLyogSGFuZGxlIHRvIFJQQyBtb2R1bGUgKi8KLSNlbmRpZgotCW9zbF90ICpvc2g7CQkvKiBwb2ludGVyIHRvIG9zIGhhbmRsZSAqLworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwkJLyogcG9pbnRlciB0byBvcyBoYW5kbGUgKi8KIAlib29sIF9waW9tb2RlOwkJLyogdHJ1ZSBpZiBwaW8gbW9kZSAqLwotCXdsY19pbmZvX3QgKndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYzsKIAogCS8qIGZpZm8gKi8KLQlobmRkbWFfdCAqZGlbTkZJRk9dOwkvKiBobmRkbWEgaGFuZGxlcywgcGVyIGZpZm8gKi8KKwlzdHJ1Y3QgaG5kZG1hX3B1YiAqZGlbTkZJRk9dOwkvKiBobmRkbWEgaGFuZGxlcywgcGVyIGZpZm8gKi8KIAotI2lmZGVmIFdMQ19MT1cKIAl1aW50IHVuaXQ7CQkvKiBkZXZpY2UgaW5zdGFuY2UgbnVtYmVyICovCiAKIAkvKiB2ZXJzaW9uIGluZm8gKi8KQEAgLTQ5NywzMSArNDc2LDIxIEBACiAJYm9vbCBmb3JjZWZhc3RjbGs7CS8qIHRydWUgaWYgdGhlIGgvdyBpcyBmb3JjaW5nIHRoZSB1c2Ugb2YgZmFzdCBjbGsgKi8KIAlib29sIGNsazsJCS8qIGNvcmUgaXMgb3V0IG9mIHJlc2V0IGFuZCBoYXMgY2xvY2sgKi8KIAlib29sIHNiY2xrOwkJLyogc2IgaGFzIGNsb2NrICovCi0JYm1hY19wbXFfdCAqYm1hY19wbXE7CS8qICBibWFjIFBNIHN0YXRlcyBkZXJpdmVkIGZyb20gdWNvZGUgUE1RICovCisJc3RydWN0IGJtYWNfcG1xICpibWFjX3BtcTsgLyogIGJtYWMgUE0gc3RhdGVzIGRlcml2ZWQgZnJvbSB1Y29kZSBQTVEgKi8KIAlib29sIHBoeWNsazsJCS8qIHBoeSBpcyBvdXQgb2YgcmVzZXQgYW5kIGhhcyBjbG9jayAqLwogCWJvb2wgZG1hX2xwYms7CQkvKiBjb3JlIGlzIGluIERNQSBsb29wYmFjayAqLwogCi0jaWZkZWYgQkNNU0RJTwotCXZvaWQgKnNkaDsKLSNlbmRpZgogCWJvb2wgdWNvZGVfbG9hZGVkOwkvKiB0cnVlIGFmdGVyIHVjb2RlIGRvd25sb2FkZWQgKi8KIAotI2lmZGVmIFdMQ19MT1dfT05MWQotCXN0cnVjdCB3bF90aW1lciAqd2R0aW1lcjsJLyogdGltZXIgZm9yIHdhdGNoZG9nIHJvdXRpbmUgKi8KLQlzdHJ1Y3QgZXRoZXJfYWRkciBvcmlnX2V0aGVyYWRkcjsJLyogb3JpZ2luYWwgaHcgZXRoZXJuZXQgYWRkcmVzcyAqLwotCXUxNiBycGNfZG5nbF9hZ2c7CS8qIHJwYyBhZ2cgY29udHJvbCBmb3IgZG9uZ2xlICovCi0JdTMyIG1lbV9yZXF1aXJlZF9kZWY7CS8qIG1lbW9yeSByZXF1aXJlZCB0byByZXBsZW5pc2ggUlggRE1BIHJpbmcgKi8KLQl1MzIgbWVtX3JlcXVpcmVkX2xvd2VyOwkvKiBtZW1vcnkgcmVxdWlyZWQgd2l0aCBsb3dlciBSWCBib3VuZCAqLwotCXUzMiBtZW1fcmVxdWlyZWRfbGVhc3Q7CS8qIG1pbmltdW0gbWVtb3J5IHJlcXVpcmVtZW50IHRvIGhhbmRsZSBSWCAqLwotCi0jZW5kaWYJCQkJLyogV0xDX0xPV19PTkxZICovCiAKIAl1OCBod19zdGZfc3Nfb3Btb2RlOwkvKiBTVEYgc2luZ2xlIHN0cmVhbSBvcGVyYXRpb24gbW9kZSAqLwogCXU4IGFudHNlbF90eXBlOwkvKiBUeXBlIG9mIGJvYXJkbGV2ZWwgbWltbyBhbnRlbm5hIHN3aXRjaC1sb2dpYwogCQkJCSAqIDAgPSBOL0EsIDEgPSAyeDQgYm9hcmQsIDIgPSAyeDMgQ0IyIGJvYXJkCiAJCQkJICovCi0JdTMyIGFudHNlbF9hdmFpbDsJLyogcHV0IGFudHNlbF9pbmZvX3QgaGVyZSBpZiBtb3JlIGluZm8gaXMgbmVlZGVkICovCi0jZW5kaWYJCQkJLyogV0xDX0xPVyAqLworCXUzMiBhbnRzZWxfYXZhaWw7CS8qCisJCQkJICogcHV0IHN0cnVjdCBhbnRzZWxfaW5mbyBoZXJlIGlmIG1vcmUgaW5mbyBpcworCQkJCSAqIG5lZWRlZAorCQkJCSAqLwogfTsKIAogLyogVFggUXVldWUgaW5mb3JtYXRpb24KQEAgLTU0MSwxNSArNTEwLDEyIEBACiAgKiBQcmluY2lwYWwgY29tbW9uIChvcy1pbmRlcGVuZGVudCkgc29mdHdhcmUgZGF0YSBzdHJ1Y3R1cmUuCiAgKi8KIHN0cnVjdCB3bGNfaW5mbyB7Ci0Jd2xjX3B1Yl90ICpwdWI7CQkvKiBwb2ludGVyIHRvIHdsYyBwdWJsaWMgc3RhdGUgKi8KLQlvc2xfdCAqb3NoOwkJLyogcG9pbnRlciB0byBvcyBoYW5kbGUgKi8KKwlzdHJ1Y3Qgd2xjX3B1YiAqcHViOwkJLyogcG9pbnRlciB0byB3bGMgcHVibGljIHN0YXRlICovCisJc3RydWN0IG9zbF9pbmZvICpvc2g7CQkvKiBwb2ludGVyIHRvIG9zIGhhbmRsZSAqLwogCXN0cnVjdCB3bF9pbmZvICp3bDsJLyogcG9pbnRlciB0byBvcy1zcGVjaWZpYyBwcml2YXRlIHN0YXRlICovCiAJZDExcmVnc190ICpyZWdzOwkvKiBwb2ludGVyIHRvIGRldmljZSByZWdpc3RlcnMgKi8KIAotCXdsY19od19pbmZvX3QgKmh3OwkvKiBIVyByZWxhdGVkIHN0YXRlIHVzZWQgcHJpbWFyaWx5IGJ5IEJNQUMgKi8KLSNpZmRlZiBXTENfU1BMSVQKLQlycGNfaW5mb190ICpycGM7CS8qIEhhbmRsZSB0byBSUEMgbW9kdWxlICovCi0jZW5kaWYKKwlzdHJ1Y3Qgd2xjX2h3X2luZm8gKmh3OwkvKiBIVyByZWxhdGVkIHN0YXRlIHVzZWQgcHJpbWFyaWx5IGJ5IEJNQUMgKi8KIAogCS8qIGNsb2NrICovCiAJaW50IGNsa3JlcV9vdmVycmlkZTsJLyogc2V0dGluZyBmb3IgY2xrcmVxIGZvciBQQ0lFIDogQXV0bywgMCwgMSAqLwpAQCAtNTY2LDEwICs1MzIsMTEgQEAKIAlib29sIGNsazsJCS8qIGNvcmUgaXMgb3V0IG9mIHJlc2V0IGFuZCBoYXMgY2xvY2sgKi8KIAogCS8qIG11bHRpYmFuZCAqLwotCXdsY2NvcmVfdCAqY29yZTsJLyogcG9pbnRlciB0byBhY3RpdmUgaW8gY29yZSAqLwotCXdsY2JhbmRfdCAqYmFuZDsJLyogcG9pbnRlciB0byBhY3RpdmUgcGVyLWJhbmQgc3RhdGUgKi8KLQl3bGNjb3JlX3QgKmNvcmVzdGF0ZTsJLyogcGVyLWNvcmUgc3RhdGUgKG9uZSBwZXIgaHcgY29yZSkgKi8KLQl3bGNiYW5kX3QgKmJhbmRzdGF0ZVtNQVhCQU5EU107CS8qIHBlci1iYW5kIHN0YXRlIChvbmUgcGVyIHBoeS9yYWRpbykgKi8KKwlzdHJ1Y3Qgd2xjY29yZSAqY29yZTsJLyogcG9pbnRlciB0byBhY3RpdmUgaW8gY29yZSAqLworCXN0cnVjdCB3bGNiYW5kICpiYW5kOwkvKiBwb2ludGVyIHRvIGFjdGl2ZSBwZXItYmFuZCBzdGF0ZSAqLworCXN0cnVjdCB3bGNjb3JlICpjb3Jlc3RhdGU7CS8qIHBlci1jb3JlIHN0YXRlIChvbmUgcGVyIGh3IGNvcmUpICovCisJLyogcGVyLWJhbmQgc3RhdGUgKG9uZSBwZXIgcGh5L3JhZGlvKTogKi8KKwlzdHJ1Y3Qgd2xjYmFuZCAqYmFuZHN0YXRlW01BWEJBTkRTXTsKIAogCWJvb2wgd2FyMTYxNjU7CQkvKiBQQ0kgc2xvdyBjbG9jayAxNjE2NSB3YXIgZmxhZyAqLwogCkBAIC01ODQsMTUgKzU1MSw5IEBACiAJczggdHhwd3JfbG9jYWxfbWF4OwkvKiByZWd1bGF0b3J5IGxvY2FsIHR4cHdyIG1heCAqLwogCXU4IHR4cHdyX2xvY2FsX2NvbnN0cmFpbnQ7CS8qIGxvY2FsIHBvd2VyIGNvbnRyYWludCBpbiBkQiAqLwogCi0jaWZkZWYgV0xDX0hJR0hfT05MWQotCXJwY3R4X2luZm9fdCAqcnBjdHg7CS8qIFJQQyBUWCBtb2R1bGUgKi8KLQlib29sIHJlc2V0X2JtYWNfcGVuZGluZzsJLyogYm1hYyByZXNldCBpcyBpbiBwcm9ncmVzc2luZyAqLwotCXUzMiBycGNfYWdnOwkJLyogaG9zdCBhZ2c6IGJpdCAxNi0zMSwgYm1hYyBhZ2c6IGJpdCAwLTE1ICovCi0JdTMyIHJwY19tc2dsZXZlbDsJLyogaG9zdCBycGM6IGJpdCAxNi0zMSwgYm1hYyBycGM6IGJpdCAwLTE1ICovCi0jZW5kaWYKIAotCWFtcGR1X2luZm9fdCAqYW1wZHU7CS8qIGFtcGR1IG1vZHVsZSBoYW5kbGVyICovCi0JYW50c2VsX2luZm9fdCAqYXNpOwkvKiBhbnRzZWwgbW9kdWxlIGhhbmRsZXIgKi8KKwlzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHU7CS8qIGFtcGR1IG1vZHVsZSBoYW5kbGVyICovCisJc3RydWN0IGFudHNlbF9pbmZvICphc2k7CS8qIGFudHNlbCBtb2R1bGUgaGFuZGxlciAqLwogCXdsY19jbV9pbmZvX3QgKmNtaTsJLyogY2hhbm5lbCBtYW5hZ2VyIG1vZHVsZSBoYW5kbGVyICovCiAKIAl2b2lkICpidHBhcmFtOwkJLyogYnVzIHR5cGUgc3BlY2lmaWMgY29va2llICovCkBAIC03OTIsOCArNzUzLDYgQEAKIAlhY19iaXRtYXBfdCBhcHNkX3RyaWdnZXJfYWM7CS8qIFBlcm1pc3NpYmxlIEFjZXNzIENhdGVnb3J5IGluIHdoaWNoIEFQU0QgTnVsbAogCQkJCQkgKiBUcmlnZ2VyIGZyYW1lcyBjYW4gYmUgc2VuZAogCQkJCQkgKi8KLQl3bGNfYXBfaW5mb190ICphcDsKLQogCXU4IGh0cGh5X21lbWJlcnNoaXA7CS8qIEhUIFBIWSBtZW1iZXJzaGlwICovCiAKIAlib29sIF9yZWd1bGF0b3J5X2RvbWFpbjsJLyogODAyLjExZCBlbmFibGVkPyAqLwpAQCAtODExLDcgKzc3MCw3IEBACiAKIAl1MTYgbmV4dF9ic3NjZmdfSUQ7CiAKLQl3bGNfaWZfdCAqd2xjaWZfbGlzdDsJLyogbGlua2VkIGxpc3Qgb2Ygd2xjX2lmIHN0cnVjdHMgKi8KKwlzdHJ1Y3Qgd2xjX2lmICp3bGNpZl9saXN0OwkvKiBsaW5rZWQgbGlzdCBvZiB3bGNfaWYgc3RydWN0cyAqLwogCXdsY190eHFfaW5mb190ICphY3RpdmVfcXVldWU7CS8qIHR4cSBmb3IgdGhlIGN1cnJlbnRseSBhY3RpdmUgdHJhbnNtaXQgY29udGV4dCAqLwogCXUzMiBtcGNfZHVyOwkJLyogdG90YWwgdGltZSAobXMpIGluIG1wYyBtb2RlIGV4Y2VwdCBmb3IgdGhlCiAJCQkJICogcG9ydGlvbiBzaW5jZSByYWRpbyBpcyB0dXJuZWQgb2ZmIGxhc3QgdGltZQpAQCAtODI1LDggKzc4NCw4IEBACiAKIC8qIGFudHNlbCBtb2R1bGUgc3BlY2lmaWMgc3RhdGUgKi8KIHN0cnVjdCBhbnRzZWxfaW5mbyB7Ci0Jd2xjX2luZm9fdCAqd2xjOwkvKiBwb2ludGVyIHRvIG1haW4gd2xjIHN0cnVjdHVyZSAqLwotCXdsY19wdWJfdCAqcHViOwkJLyogcG9pbnRlciB0byBwdWJsaWMgZm4gKi8KKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYzsJLyogcG9pbnRlciB0byBtYWluIHdsYyBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3Qgd2xjX3B1YiAqcHViOwkJLyogcG9pbnRlciB0byBwdWJsaWMgZm4gKi8KIAl1OCBhbnRzZWxfdHlwZTsJLyogVHlwZSBvZiBib2FyZGxldmVsIG1pbW8gYW50ZW5uYSBzd2l0Y2gtbG9naWMKIAkJCQkgKiAwID0gTi9BLCAxID0gMng0IGJvYXJkLCAyID0gMngzIENCMiBib2FyZAogCQkJCSAqLwpAQCAtODQyLDIzICs4MDEsOSBAQAogI2RlZmluZSBJU19NQkFORF9VTkxPQ0tFRCh3bGMpIFwKIAkoKE5CQU5EUyh3bGMpID4gMSkgJiYgISh3bGMpLT5iYW5kbG9ja2VkKQogCi0jaWZkZWYgV0xDX0xPVwogI2RlZmluZSBXTENfQkFORF9QSV9SQURJT19DSEFOU1BFQyB3bGNfcGh5X2NoYW5zcGVjX2dldCh3bGMtPmJhbmQtPnBpKQotI2Vsc2UKLSNkZWZpbmUgV0xDX0JBTkRfUElfUkFESU9fQ0hBTlNQRUMgKHdsYy0+Y2hhbnNwZWMpCi0jZW5kaWYKIAogLyogc3VtIHRoZSBpbmRpdmlkdWFsIGZpZm8gdHggcGVuZGluZyBwYWNrZXQgY291bnRzICovCi0jaWYgZGVmaW5lZChXTENfSElHSF9PTkxZKQotI2RlZmluZSBUWFBLVFBFTkRUT1Qod2xjKQkJKHdsY19ycGN0eF90eHBrdHBlbmQoKHdsYyktPnJwY3R4LCAwLCB0cnVlKSkKLSNkZWZpbmUgVFhQS1RQRU5ER0VUKHdsYywgZmlmbykJCSh3bGNfcnBjdHhfdHhwa3RwZW5kKCh3bGMpLT5ycGN0eCwgKGZpZm8pLCBmYWxzZSkpCi0jZGVmaW5lIFRYUEtUUEVORElOQyh3bGMsIGZpZm8sIHZhbCkJKHdsY19ycGN0eF90eHBrdHBlbmRpbmMoKHdsYyktPnJwY3R4LCAoZmlmbyksICh2YWwpKSkKLSNkZWZpbmUgVFhQS1RQRU5EREVDKHdsYywgZmlmbywgdmFsKQkod2xjX3JwY3R4X3R4cGt0cGVuZGRlYygod2xjKS0+cnBjdHgsIChmaWZvKSwgKHZhbCkpKQotI2RlZmluZSBUWFBLVFBFTkRDTFIod2xjLCBmaWZvKQkJKHdsY19ycGN0eF90eHBrdHBlbmRjbHIoKHdsYyktPnJwY3R4LCAoZmlmbykpKQotI2RlZmluZSBUWEFWQUlMKHdsYywgZmlmbykJCSh3bGNfcnBjdHhfdHhhdmFpbCgod2xjKS0+cnBjdHgsIChmaWZvKSkpCi0jZGVmaW5lIEdFVE5FWFRUWFAod2xjLCBfcXVldWUpCQkod2xjX3JwY3R4X2dldG5leHR0eHAoKHdsYyktPnJwY3R4LCAoX3F1ZXVlKSkpCi0KLSNlbHNlCiAjZGVmaW5lCVRYUEtUUEVORFRPVCh3bGMpICgod2xjKS0+Y29yZS0+dHhwa3RwZW5kWzBdICsgKHdsYyktPmNvcmUtPnR4cGt0cGVuZFsxXSArIFwKIAkod2xjKS0+Y29yZS0+dHhwa3RwZW5kWzJdICsgKHdsYyktPmNvcmUtPnR4cGt0cGVuZFszXSkKICNkZWZpbmUgVFhQS1RQRU5ER0VUKHdsYywgZmlmbykJCSgod2xjKS0+Y29yZS0+dHhwa3RwZW5kWyhmaWZvKV0pCkBAIC04NjgsNDggKzgxMyw0OSBAQAogI2RlZmluZSBUWEFWQUlMKHdsYywgZmlmbykJCSgqKHdsYyktPmNvcmUtPnR4YXZhaWxbKGZpZm8pXSkKICNkZWZpbmUgR0VUTkVYVFRYUCh3bGMsIF9xdWV1ZSkJCQkJCQkJCVwKIAkJZG1hX2dldG5leHR0eHAoKHdsYyktPmh3LT5kaVsoX3F1ZXVlKV0sIEhORERNQV9SQU5HRV9UUkFOU01JVFRFRCkKLSNlbmRpZgkJCQkvKiBXTENfSElHSF9PTkxZICovCiAKICNkZWZpbmUgV0xDX0lTX01BVENIX1NTSUQod2xjLCBzc2lkMSwgc3NpZDIsIGxlbjEsIGxlbjIpIFwKLQkoKGxlbjEgPT0gbGVuMikgJiYgIWJjbXAoc3NpZDEsIHNzaWQyLCBsZW4xKSkKKwkoKGxlbjEgPT0gbGVuMikgJiYgIW1lbWNtcChzc2lkMSwgc3NpZDIsIGxlbjEpKQogCi0vKiBBUEkgc2hhcmVkIGJ5IGJvdGggV0xDX0hJR0ggYW5kIFdMQ19MT1cgZHJpdmVyICovCi1leHRlcm4gdm9pZCB3bGNfaGlnaF9kcGMod2xjX2luZm9fdCAqd2xjLCB1MzIgbWFjaW50c3RhdHVzKTsKLWV4dGVybiB2b2lkIHdsY19mYXRhbF9lcnJvcih3bGNfaW5mb190ICp3bGMpOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfcnBjX3dhdGNoZG9nKHdsY19pbmZvX3QgKndsYyk7Ci1leHRlcm4gdm9pZCB3bGNfcmVjdih3bGNfaW5mb190ICp3bGMsIHZvaWQgKnApOwotZXh0ZXJuIGJvb2wgd2xjX2RvdHhzdGF0dXMod2xjX2luZm9fdCAqd2xjLCB0eF9zdGF0dXNfdCAqdHhzLCB1MzIgZnJtX3R4Mik7Ci1leHRlcm4gdm9pZCB3bGNfdHhmaWZvKHdsY19pbmZvX3QgKndsYywgdWludCBmaWZvLCB2b2lkICpwLCBib29sIGNvbW1pdCwKLQkJICAgICAgIHM4IHR4cGt0cGVuZCk7Ci1leHRlcm4gdm9pZCB3bGNfdHhmaWZvX2NvbXBsZXRlKHdsY19pbmZvX3QgKndsYywgdWludCBmaWZvLCBzOCB0eHBrdHBlbmQpOwotZXh0ZXJuIHZvaWQgd2xjX2luZm9faW5pdCh3bGNfaW5mb190ICp3bGMsIGludCB1bml0KTsKK2V4dGVybiB2b2lkIHdsY19oaWdoX2RwYyhzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTMyIG1hY2ludHN0YXR1cyk7CitleHRlcm4gdm9pZCB3bGNfZmF0YWxfZXJyb3Ioc3RydWN0IHdsY19pbmZvICp3bGMpOworZXh0ZXJuIHZvaWQgd2xjX2JtYWNfcnBjX3dhdGNoZG9nKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK2V4dGVybiB2b2lkIHdsY19yZWN2KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBzdHJ1Y3Qgc2tfYnVmZiAqcCk7CitleHRlcm4gYm9vbCB3bGNfZG90eHN0YXR1cyhzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdHhfc3RhdHVzX3QgKnR4cywgdTMyIGZybV90eDIpOworZXh0ZXJuIHZvaWQgd2xjX3R4ZmlmbyhzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdWludCBmaWZvLCBzdHJ1Y3Qgc2tfYnVmZiAqcCwKKwkJICAgICAgIGJvb2wgY29tbWl0LCBzOCB0eHBrdHBlbmQpOworZXh0ZXJuIHZvaWQgd2xjX3R4Zmlmb19jb21wbGV0ZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdWludCBmaWZvLCBzOCB0eHBrdHBlbmQpOworZXh0ZXJuIHZvaWQgd2xjX3R4cV9lbnEodm9pZCAqY3R4LCBzdHJ1Y3Qgc2NiICpzY2IsIHN0cnVjdCBza19idWZmICpzZHUsCisJCQl1aW50IHByZWMpOworZXh0ZXJuIHZvaWQgd2xjX2luZm9faW5pdChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgaW50IHVuaXQpOwogZXh0ZXJuIHZvaWQgd2xjX3ByaW50X3R4c3RhdHVzKHR4X3N0YXR1c190ICp0eHMpOwotZXh0ZXJuIGludCB3bGNfeG10Zmlmb19zel9nZXQod2xjX2luZm9fdCAqd2xjLCB1aW50IGZpZm8sIHVpbnQgKmJsb2Nrcyk7Ci1leHRlcm4gdm9pZCB3bGNfd3JpdGVfdGVtcGxhdGVfcmFtKHdsY19pbmZvX3QgKndsYywgaW50IG9mZnNldCwgaW50IGxlbiwKK2V4dGVybiBpbnQgd2xjX3htdGZpZm9fc3pfZ2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1aW50IGZpZm8sIHVpbnQgKmJsb2Nrcyk7CitleHRlcm4gdm9pZCB3bGNfd3JpdGVfdGVtcGxhdGVfcmFtKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBpbnQgb2Zmc2V0LCBpbnQgbGVuLAogCQkJCSAgIHZvaWQgKmJ1Zik7Ci1leHRlcm4gdm9pZCB3bGNfd3JpdGVfaHdfYmNudGVtcGxhdGVzKHdsY19pbmZvX3QgKndsYywgdm9pZCAqYmNuLCBpbnQgbGVuLAorZXh0ZXJuIHZvaWQgd2xjX3dyaXRlX2h3X2JjbnRlbXBsYXRlcyhzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdm9pZCAqYmNuLCBpbnQgbGVuLAogCQkJCSAgICAgIGJvb2wgYm90aCk7CiAjaWYgZGVmaW5lZChCQ01EQkcpCi1leHRlcm4gdm9pZCB3bGNfZ2V0X3JjbXRhKHdsY19pbmZvX3QgKndsYywgaW50IGlkeCwgc3RydWN0IGV0aGVyX2FkZHIgKmFkZHIpOworZXh0ZXJuIHZvaWQgd2xjX2dldF9yY210YShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgaW50IGlkeCwKKwkJCSAgc3RydWN0IGV0aGVyX2FkZHIgKmFkZHIpOwogI2VuZGlmCi1leHRlcm4gdm9pZCB3bGNfc2V0X3JjbXRhKHdsY19pbmZvX3QgKndsYywgaW50IGlkeCwKK2V4dGVybiB2b2lkIHdsY19zZXRfcmNtdGEoc3RydWN0IHdsY19pbmZvICp3bGMsIGludCBpZHgsCiAJCQkgIGNvbnN0IHN0cnVjdCBldGhlcl9hZGRyICphZGRyKTsKLWV4dGVybiB2b2lkIHdsY19zZXRfYWRkcm1hdGNoKHdsY19pbmZvX3QgKndsYywgaW50IG1hdGNoX3JlZ19vZmZzZXQsCitleHRlcm4gdm9pZCB3bGNfc2V0X2FkZHJtYXRjaChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgaW50IG1hdGNoX3JlZ19vZmZzZXQsCiAJCQkgICAgICBjb25zdCBzdHJ1Y3QgZXRoZXJfYWRkciAqYWRkcik7Ci1leHRlcm4gdm9pZCB3bGNfcmVhZF90c2Yod2xjX2luZm9fdCAqd2xjLCB1MzIgKnRzZl9sX3B0ciwKK2V4dGVybiB2b2lkIHdsY19yZWFkX3RzZihzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTMyICp0c2ZfbF9wdHIsCiAJCQkgdTMyICp0c2ZfaF9wdHIpOwotZXh0ZXJuIHZvaWQgd2xjX3NldF9jd21pbih3bGNfaW5mb190ICp3bGMsIHUxNiBuZXdtaW4pOwotZXh0ZXJuIHZvaWQgd2xjX3NldF9jd21heCh3bGNfaW5mb190ICp3bGMsIHUxNiBuZXdtYXgpOwotZXh0ZXJuIHZvaWQgd2xjX2ZpZm9lcnJvcnMod2xjX2luZm9fdCAqd2xjKTsKLWV4dGVybiB2b2lkIHdsY19wbGxyZXEod2xjX2luZm9fdCAqd2xjLCBib29sIHNldCwgbWJvb2wgcmVxX2JpdCk7Ci1leHRlcm4gdm9pZCB3bGNfcmVzZXRfYm1hY19kb25lKHdsY19pbmZvX3QgKndsYyk7Ci1leHRlcm4gdm9pZCB3bGNfcHJvdGVjdGlvbl91cGQod2xjX2luZm9fdCAqd2xjLCB1aW50IGlkeCwgaW50IHZhbCk7Ci1leHRlcm4gdm9pZCB3bGNfaHd0aW1lcl9ncHRpbWVyX3NldCh3bGNfaW5mb190ICp3bGMsIHVpbnQgdXMpOwotZXh0ZXJuIHZvaWQgd2xjX2h3dGltZXJfZ3B0aW1lcl9hYm9ydCh3bGNfaW5mb190ICp3bGMpOworZXh0ZXJuIHZvaWQgd2xjX3NldF9jd21pbihzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTE2IG5ld21pbik7CitleHRlcm4gdm9pZCB3bGNfc2V0X2N3bWF4KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1MTYgbmV3bWF4KTsKK2V4dGVybiB2b2lkIHdsY19maWZvZXJyb3JzKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK2V4dGVybiB2b2lkIHdsY19wbGxyZXEoc3RydWN0IHdsY19pbmZvICp3bGMsIGJvb2wgc2V0LCBtYm9vbCByZXFfYml0KTsKK2V4dGVybiB2b2lkIHdsY19yZXNldF9ibWFjX2RvbmUoc3RydWN0IHdsY19pbmZvICp3bGMpOworZXh0ZXJuIHZvaWQgd2xjX3Byb3RlY3Rpb25fdXBkKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1aW50IGlkeCwgaW50IHZhbCk7CitleHRlcm4gdm9pZCB3bGNfaHd0aW1lcl9ncHRpbWVyX3NldChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdWludCB1cyk7CitleHRlcm4gdm9pZCB3bGNfaHd0aW1lcl9ncHRpbWVyX2Fib3J0KHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKIAogI2lmIGRlZmluZWQoQkNNREJHKQogZXh0ZXJuIHZvaWQgd2xjX3ByaW50X3J4aChkMTFyeGhkcl90ICpyeGgpOwotZXh0ZXJuIHZvaWQgd2xjX3ByaW50X2hkcnMod2xjX2luZm9fdCAqd2xjLCBjb25zdCBjaGFyICpwcmVmaXgsIHU4ICpmcmFtZSwKK2V4dGVybiB2b2lkIHdsY19wcmludF9oZHJzKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBjb25zdCBjaGFyICpwcmVmaXgsIHU4ICpmcmFtZSwKIAkJCSAgIGQxMXR4aF90ICp0eGgsIGQxMXJ4aGRyX3QgKnJ4aCwgdWludCBsZW4pOwogZXh0ZXJuIHZvaWQgd2xjX3ByaW50X3R4ZGVzYyhkMTF0eGhfdCAqdHhoKTsKICNlbmRpZgpAQCAtOTE3LDEyNCArODYzLDEyNiBAQAogZXh0ZXJuIHZvaWQgd2xjX3ByaW50X2RvdDExX21hY19oZHIodTggKmJ1ZiwgaW50IGxlbik7CiAjZW5kaWYKIAotI2lmZGVmIFdMQ19MT1cKLWV4dGVybiB2b2lkIHdsY19zZXR4YmFuZCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHVpbnQgYmFuZHVuaXQpOwotZXh0ZXJuIHZvaWQgd2xjX2NvcmVkaXNhYmxlKHdsY19od19pbmZvX3QgKndsY19odyk7Ci0jZW5kaWYKK2V4dGVybiB2b2lkIHdsY19zZXR4YmFuZChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdWludCBiYW5kdW5pdCk7CitleHRlcm4gdm9pZCB3bGNfY29yZWRpc2FibGUoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpOwogCi1leHRlcm4gYm9vbCB3bGNfdmFsaWRfcmF0ZSh3bGNfaW5mb190ICp3bGMsIHJhdGVzcGVjX3QgcmF0ZSwgaW50IGJhbmQsCitleHRlcm4gYm9vbCB3bGNfdmFsaWRfcmF0ZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByYXRlLCBpbnQgYmFuZCwKIAkJCSAgIGJvb2wgdmVyYm9zZSk7Ci1leHRlcm4gdm9pZCB3bGNfYXBfdXBkKHdsY19pbmZvX3QgKndsYyk7CitleHRlcm4gdm9pZCB3bGNfYXBfdXBkKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKIAogLyogaGVscGVyIGZ1bmN0aW9ucyAqLwotZXh0ZXJuIHZvaWQgd2xjX3NobV9zc2lkX3VwZCh3bGNfaW5mb190ICp3bGMsIHdsY19ic3NjZmdfdCAqY2ZnKTsKLWV4dGVybiBpbnQgd2xjX3NldF9nbW9kZSh3bGNfaW5mb190ICp3bGMsIHU4IGdtb2RlLCBib29sIGNvbmZpZyk7CitleHRlcm4gdm9pZCB3bGNfc2htX3NzaWRfdXBkKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB3bGNfYnNzY2ZnX3QgKmNmZyk7CitleHRlcm4gaW50IHdsY19zZXRfZ21vZGUoc3RydWN0IHdsY19pbmZvICp3bGMsIHU4IGdtb2RlLCBib29sIGNvbmZpZyk7CiAKLWV4dGVybiB2b2lkIHdsY19tYWNfYmNuX3Byb21pc2NfY2hhbmdlKHdsY19pbmZvX3QgKndsYywgYm9vbCBwcm9taXNjKTsKLWV4dGVybiB2b2lkIHdsY19tYWNfYmNuX3Byb21pc2Mod2xjX2luZm9fdCAqd2xjKTsKLWV4dGVybiB2b2lkIHdsY19tYWNfcHJvbWlzYyh3bGNfaW5mb190ICp3bGMpOwotZXh0ZXJuIHZvaWQgd2xjX3R4Zmxvd2NvbnRyb2wod2xjX2luZm9fdCAqd2xjLCB3bGNfdHhxX2luZm9fdCAqcWksIGJvb2wgb24sCitleHRlcm4gdm9pZCB3bGNfbWFjX2Jjbl9wcm9taXNjX2NoYW5nZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgYm9vbCBwcm9taXNjKTsKK2V4dGVybiB2b2lkIHdsY19tYWNfYmNuX3Byb21pc2Moc3RydWN0IHdsY19pbmZvICp3bGMpOworZXh0ZXJuIHZvaWQgd2xjX21hY19wcm9taXNjKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK2V4dGVybiB2b2lkIHdsY190eGZsb3djb250cm9sKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB3bGNfdHhxX2luZm9fdCAqcWksIGJvb2wgb24sCiAJCQkgICAgICBpbnQgcHJpbyk7Ci1leHRlcm4gdm9pZCB3bGNfdHhmbG93Y29udHJvbF9vdmVycmlkZSh3bGNfaW5mb190ICp3bGMsIHdsY190eHFfaW5mb190ICpxaSwKK2V4dGVybiB2b2lkIHdsY190eGZsb3djb250cm9sX292ZXJyaWRlKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB3bGNfdHhxX2luZm9fdCAqcWksCiAJCQkJICAgICAgIGJvb2wgb24sIHVpbnQgb3ZlcnJpZGUpOwotZXh0ZXJuIGJvb2wgd2xjX3R4Zmxvd2NvbnRyb2xfcHJpb19pc3NldCh3bGNfaW5mb190ICp3bGMsIHdsY190eHFfaW5mb190ICpxaSwKLQkJCQkJIGludCBwcmlvKTsKLWV4dGVybiB2b2lkIHdsY19zZW5kX3Eod2xjX2luZm9fdCAqd2xjLCB3bGNfdHhxX2luZm9fdCAqcWkpOwotZXh0ZXJuIGludCB3bGNfcHJlcF9wZHUod2xjX2luZm9fdCAqd2xjLCB2b2lkICpwZHUsIHVpbnQgKmZpZm8pOworZXh0ZXJuIGJvb2wgd2xjX3R4Zmxvd2NvbnRyb2xfcHJpb19pc3NldChzdHJ1Y3Qgd2xjX2luZm8gKndsYywKKwkJCQkJIHdsY190eHFfaW5mb190ICpxaSwgaW50IHByaW8pOworZXh0ZXJuIHZvaWQgd2xjX3NlbmRfcShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgd2xjX3R4cV9pbmZvX3QgKnFpKTsKK2V4dGVybiBpbnQgd2xjX3ByZXBfcGR1KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBzdHJ1Y3Qgc2tfYnVmZiAqcGR1LCB1aW50ICpmaWZvKTsKIAotZXh0ZXJuIHUxNiB3bGNfY2FsY19sc2lnX2xlbih3bGNfaW5mb190ICp3bGMsIHJhdGVzcGVjX3QgcmF0ZXNwZWMsCitleHRlcm4gdTE2IHdsY19jYWxjX2xzaWdfbGVuKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCByYXRlc3BlY190IHJhdGVzcGVjLAogCQkJCXVpbnQgbWFjX2xlbik7Ci1leHRlcm4gcmF0ZXNwZWNfdCB3bGNfcnNwZWNfdG9fcnRzX3JzcGVjKHdsY19pbmZvX3QgKndsYywgcmF0ZXNwZWNfdCByc3BlYywKK2V4dGVybiByYXRlc3BlY190IHdsY19yc3BlY190b19ydHNfcnNwZWMoc3RydWN0IHdsY19pbmZvICp3bGMsIHJhdGVzcGVjX3QgcnNwZWMsCiAJCQkJCSBib29sIHVzZV9yc3BlYywgdTE2IG1pbW9fY3RsY2hidyk7Ci1leHRlcm4gdTE2IHdsY19jb21wdXRlX3J0c2N0c19kdXIod2xjX2luZm9fdCAqd2xjLCBib29sIGN0c19vbmx5LAorZXh0ZXJuIHUxNiB3bGNfY29tcHV0ZV9ydHNjdHNfZHVyKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBib29sIGN0c19vbmx5LAogCQkJCSAgICAgcmF0ZXNwZWNfdCBydHNfcmF0ZSwgcmF0ZXNwZWNfdCBmcmFtZV9yYXRlLAogCQkJCSAgICAgdTggcnRzX3ByZWFtYmxlX3R5cGUsCiAJCQkJICAgICB1OCBmcmFtZV9wcmVhbWJsZV90eXBlLCB1aW50IGZyYW1lX2xlbiwKIAkJCQkgICAgIGJvb2wgYmEpOwogCi1leHRlcm4gdm9pZCB3bGNfdGJ0dCh3bGNfaW5mb190ICp3bGMsIGQxMXJlZ3NfdCAqcmVncyk7CitleHRlcm4gdm9pZCB3bGNfdGJ0dChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgZDExcmVnc190ICpyZWdzKTsKIAogI2lmIGRlZmluZWQoQkNNREJHKQotZXh0ZXJuIHZvaWQgd2xjX2R1bXBfaWUod2xjX2luZm9fdCAqd2xjLCBiY21fdGx2X3QgKmllLCBzdHJ1Y3QgYmNtc3RyYnVmICpiKTsKK2V4dGVybiB2b2lkIHdsY19kdW1wX2llKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBiY21fdGx2X3QgKmllLAorCQkJc3RydWN0IGJjbXN0cmJ1ZiAqYik7CiAjZW5kaWYKIAotZXh0ZXJuIGJvb2wgd2xjX3BzX2NoZWNrKHdsY19pbmZvX3QgKndsYyk7Ci1leHRlcm4gdm9pZCB3bGNfcmVwcmF0ZV9pbml0KHdsY19pbmZvX3QgKndsYyk7CitleHRlcm4gYm9vbCB3bGNfcHNfY2hlY2soc3RydWN0IHdsY19pbmZvICp3bGMpOworZXh0ZXJuIHZvaWQgd2xjX3JlcHJhdGVfaW5pdChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CiBleHRlcm4gdm9pZCB3bGNfYnNzY2ZnX3JlcHJhdGVfaW5pdCh3bGNfYnNzY2ZnX3QgKmJzc2NmZyk7CiBleHRlcm4gdm9pZCB3bGNfdWludDY0X3N1Yih1MzIgKmFfaGlnaCwgdTMyICphX2xvdywgdTMyIGJfaGlnaCwKIAkJCSAgIHUzMiBiX2xvdyk7CiBleHRlcm4gdTMyIHdsY19jYWxjX3RidHRfb2Zmc2V0KHUzMiBiaSwgdTMyIHRzZl9oLCB1MzIgdHNmX2wpOwogCiAvKiBTaGFyZWQgbWVtb3J5IGFjY2VzcyAqLwotZXh0ZXJuIHZvaWQgd2xjX3dyaXRlX3NobSh3bGNfaW5mb190ICp3bGMsIHVpbnQgb2Zmc2V0LCB1MTYgdik7Ci1leHRlcm4gdTE2IHdsY19yZWFkX3NobSh3bGNfaW5mb190ICp3bGMsIHVpbnQgb2Zmc2V0KTsKLWV4dGVybiB2b2lkIHdsY19zZXRfc2htKHdsY19pbmZvX3QgKndsYywgdWludCBvZmZzZXQsIHUxNiB2LCBpbnQgbGVuKTsKLWV4dGVybiB2b2lkIHdsY19jb3B5dG9fc2htKHdsY19pbmZvX3QgKndsYywgdWludCBvZmZzZXQsIGNvbnN0IHZvaWQgKmJ1ZiwKK2V4dGVybiB2b2lkIHdsY193cml0ZV9zaG0oc3RydWN0IHdsY19pbmZvICp3bGMsIHVpbnQgb2Zmc2V0LCB1MTYgdik7CitleHRlcm4gdTE2IHdsY19yZWFkX3NobShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdWludCBvZmZzZXQpOworZXh0ZXJuIHZvaWQgd2xjX3NldF9zaG0oc3RydWN0IHdsY19pbmZvICp3bGMsIHVpbnQgb2Zmc2V0LCB1MTYgdiwgaW50IGxlbik7CitleHRlcm4gdm9pZCB3bGNfY29weXRvX3NobShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdWludCBvZmZzZXQsIGNvbnN0IHZvaWQgKmJ1ZiwKIAkJCSAgIGludCBsZW4pOwotZXh0ZXJuIHZvaWQgd2xjX2NvcHlmcm9tX3NobSh3bGNfaW5mb190ICp3bGMsIHVpbnQgb2Zmc2V0LCB2b2lkICpidWYsIGludCBsZW4pOworZXh0ZXJuIHZvaWQgd2xjX2NvcHlmcm9tX3NobShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdWludCBvZmZzZXQsIHZvaWQgKmJ1ZiwKKwkJCSAgICAgaW50IGxlbik7CiAKLWV4dGVybiB2b2lkIHdsY191cGRhdGVfYmVhY29uKHdsY19pbmZvX3QgKndsYyk7Ci1leHRlcm4gdm9pZCB3bGNfYnNzX3VwZGF0ZV9iZWFjb24od2xjX2luZm9fdCAqd2xjLCBzdHJ1Y3Qgd2xjX2Jzc2NmZyAqYnNzY2ZnKTsKK2V4dGVybiB2b2lkIHdsY191cGRhdGVfYmVhY29uKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK2V4dGVybiB2b2lkIHdsY19ic3NfdXBkYXRlX2JlYWNvbihzdHJ1Y3Qgd2xjX2luZm8gKndsYywKKwkJCQkgIHN0cnVjdCB3bGNfYnNzY2ZnICpic3NjZmcpOwogCi1leHRlcm4gdm9pZCB3bGNfdXBkYXRlX3Byb2JlX3Jlc3Aod2xjX2luZm9fdCAqd2xjLCBib29sIHN1c3BlbmQpOwotZXh0ZXJuIHZvaWQgd2xjX2Jzc191cGRhdGVfcHJvYmVfcmVzcCh3bGNfaW5mb190ICp3bGMsIHdsY19ic3NjZmdfdCAqY2ZnLAorZXh0ZXJuIHZvaWQgd2xjX3VwZGF0ZV9wcm9iZV9yZXNwKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBib29sIHN1c3BlbmQpOworZXh0ZXJuIHZvaWQgd2xjX2Jzc191cGRhdGVfcHJvYmVfcmVzcChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgd2xjX2Jzc2NmZ190ICpjZmcsCiAJCQkJICAgICAgYm9vbCBzdXNwZW5kKTsKIAotZXh0ZXJuIGJvb2wgd2xjX2lzbXBjKHdsY19pbmZvX3QgKndsYyk7Ci1leHRlcm4gYm9vbCB3bGNfaXNfbm9uX2RlbGF5X21wYyh3bGNfaW5mb190ICp3bGMpOwotZXh0ZXJuIHZvaWQgd2xjX3JhZGlvX21wY191cGQod2xjX2luZm9fdCAqd2xjKTsKLWV4dGVybiBib29sIHdsY19wcmVjX2VucSh3bGNfaW5mb190ICp3bGMsIHN0cnVjdCBwa3RxICpxLCB2b2lkICpwa3QsIGludCBwcmVjKTsKLWV4dGVybiBib29sIHdsY19wcmVjX2VucV9oZWFkKHdsY19pbmZvX3QgKndsYywgc3RydWN0IHBrdHEgKnEsIHZvaWQgKnBrdCwKLQkJCSAgICAgIGludCBwcmVjLCBib29sIGhlYWQpOwotZXh0ZXJuIHUxNiB3bGNfcGh5dHhjdGwxX2NhbGMod2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJzcGVjKTsKLWV4dGVybiB2b2lkIHdsY19jb21wdXRlX3BsY3Aod2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJhdGUsIHVpbnQgbGVuZ3RoLAorZXh0ZXJuIGJvb2wgd2xjX2lzbXBjKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK2V4dGVybiBib29sIHdsY19pc19ub25fZGVsYXlfbXBjKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK2V4dGVybiB2b2lkIHdsY19yYWRpb19tcGNfdXBkKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK2V4dGVybiBib29sIHdsY19wcmVjX2VucShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgc3RydWN0IHBrdHEgKnEsIHZvaWQgKnBrdCwKKwkJCSBpbnQgcHJlYyk7CitleHRlcm4gYm9vbCB3bGNfcHJlY19lbnFfaGVhZChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgc3RydWN0IHBrdHEgKnEsCisJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqcGt0LCBpbnQgcHJlYywgYm9vbCBoZWFkKTsKK2V4dGVybiB1MTYgd2xjX3BoeXR4Y3RsMV9jYWxjKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCByYXRlc3BlY190IHJzcGVjKTsKK2V4dGVybiB2b2lkIHdsY19jb21wdXRlX3BsY3Aoc3RydWN0IHdsY19pbmZvICp3bGMsIHJhdGVzcGVjX3QgcmF0ZSwgdWludCBsZW5ndGgsCiAJCQkgICAgIHU4ICpwbGNwKTsKLWV4dGVybiB1aW50IHdsY19jYWxjX2ZyYW1lX3RpbWUod2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJhdGVzcGVjLAorZXh0ZXJuIHVpbnQgd2xjX2NhbGNfZnJhbWVfdGltZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByYXRlc3BlYywKIAkJCQl1OCBwcmVhbWJsZV90eXBlLCB1aW50IG1hY19sZW4pOwogCi1leHRlcm4gdm9pZCB3bGNfc2V0X2NoYW5zcGVjKHdsY19pbmZvX3QgKndsYywgY2hhbnNwZWNfdCBjaGFuc3BlYyk7CitleHRlcm4gdm9pZCB3bGNfc2V0X2NoYW5zcGVjKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBjaGFuc3BlY190IGNoYW5zcGVjKTsKIAotZXh0ZXJuIGJvb2wgd2xjX3RpbWVyc19pbml0KHdsY19pbmZvX3QgKndsYywgaW50IHVuaXQpOworZXh0ZXJuIGJvb2wgd2xjX3RpbWVyc19pbml0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBpbnQgdW5pdCk7CiAKIGV4dGVybiBjb25zdCBiY21faW92YXJfdCB3bGNfaW92YXJzW107CiAKIGV4dGVybiBpbnQgd2xjX2RvaW92YXIodm9pZCAqaGRsLCBjb25zdCBiY21faW92YXJfdCAqdmksIHUzMiBhY3Rpb25pZCwKIAkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKnBhcmFtcywgdWludCBwX2xlbiwgdm9pZCAqYXJnLAotCQkgICAgICAgaW50IGxlbiwgaW50IHZhbF9zaXplLCB3bGNfaWZfdCAqd2xjaWYpOworCQkgICAgICAgaW50IGxlbiwgaW50IHZhbF9zaXplLCBzdHJ1Y3Qgd2xjX2lmICp3bGNpZik7CiAKICNpZiBkZWZpbmVkKEJDTURCRykKLWV4dGVybiB2b2lkIHdsY19wcmludF9pZXMod2xjX2luZm9fdCAqd2xjLCB1OCAqaWVzLCB1aW50IGllc19sZW4pOworZXh0ZXJuIHZvaWQgd2xjX3ByaW50X2llcyhzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTggKmllcywgdWludCBpZXNfbGVuKTsKICNlbmRpZgogCi1leHRlcm4gaW50IHdsY19zZXRfbm1vZGUod2xjX2luZm9fdCAqd2xjLCBzMzIgbm1vZGUpOwotZXh0ZXJuIHZvaWQgd2xjX2h0X21pbW9wc19jYXBfdXBkYXRlKHdsY19pbmZvX3QgKndsYywgdTggbWltb3BzX21vZGUpOwotZXh0ZXJuIHZvaWQgd2xjX21pbW9wc19hY3Rpb25faHRfc2VuZCh3bGNfaW5mb190ICp3bGMsIHdsY19ic3NjZmdfdCAqYnNzY2ZnLAotCQkJCSAgICAgIHU4IG1pbW9wc19tb2RlKTsKK2V4dGVybiBpbnQgd2xjX3NldF9ubW9kZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgczMyIG5tb2RlKTsKK2V4dGVybiB2b2lkIHdsY19odF9taW1vcHNfY2FwX3VwZGF0ZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTggbWltb3BzX21vZGUpOworZXh0ZXJuIHZvaWQgd2xjX21pbW9wc19hY3Rpb25faHRfc2VuZChzdHJ1Y3Qgd2xjX2luZm8gKndsYywKKwkJCQkgICAgICB3bGNfYnNzY2ZnX3QgKmJzc2NmZywgdTggbWltb3BzX21vZGUpOwogCi1leHRlcm4gdm9pZCB3bGNfc3dpdGNoX3Nob3J0c2xvdCh3bGNfaW5mb190ICp3bGMsIGJvb2wgc2hvcnRzbG90KTsKK2V4dGVybiB2b2lkIHdsY19zd2l0Y2hfc2hvcnRzbG90KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBib29sIHNob3J0c2xvdCk7CiBleHRlcm4gdm9pZCB3bGNfc2V0X2Jzc2lkKHdsY19ic3NjZmdfdCAqY2ZnKTsKIGV4dGVybiB2b2lkIHdsY19lZGNmX3NldHBhcmFtcyh3bGNfYnNzY2ZnX3QgKmNmZywgYm9vbCBzdXNwZW5kKTsKLWV4dGVybiB2b2lkIHdsY193bWVfc2V0cGFyYW1zKHdsY19pbmZvX3QgKndsYywgdTE2IGFjaSwgdm9pZCAqYXJnLAotCQkJICAgICAgYm9vbCBzdXNwZW5kKTsKIAotZXh0ZXJuIHZvaWQgd2xjX3NldF9yYXRldGFibGUod2xjX2luZm9fdCAqd2xjKTsKK2V4dGVybiB2b2lkIHdsY19zZXRfcmF0ZXRhYmxlKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKIGV4dGVybiBpbnQgd2xjX3NldF9tYWMod2xjX2Jzc2NmZ190ICpjZmcpOwotZXh0ZXJuIHZvaWQgd2xjX2JlYWNvbl9waHl0eGN0bF90eGFudF91cGQod2xjX2luZm9fdCAqd2xjLAorZXh0ZXJuIHZvaWQgd2xjX2JlYWNvbl9waHl0eGN0bF90eGFudF91cGQoc3RydWN0IHdsY19pbmZvICp3bGMsCiAJCQkJCSAgcmF0ZXNwZWNfdCBiY25fcmF0ZSk7Ci1leHRlcm4gdm9pZCB3bGNfbW9kX3ByYl9yc3BfcmF0ZV90YWJsZSh3bGNfaW5mb190ICp3bGMsIHVpbnQgZnJhbWVfbGVuKTsKLWV4dGVybiByYXRlc3BlY190IHdsY19sb3dlc3RfYmFzaWNfcnNwZWMod2xjX2luZm9fdCAqd2xjLCB3bGNfcmF0ZXNldF90ICpycyk7Ci1leHRlcm4gdTE2IHdsY19jb21wdXRlX2JjbnRzZm9mZih3bGNfaW5mb190ICp3bGMsIHJhdGVzcGVjX3QgcnNwZWMsCitleHRlcm4gdm9pZCB3bGNfbW9kX3ByYl9yc3BfcmF0ZV90YWJsZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdWludCBmcmFtZV9sZW4pOworZXh0ZXJuIHJhdGVzcGVjX3Qgd2xjX2xvd2VzdF9iYXNpY19yc3BlYyhzdHJ1Y3Qgd2xjX2luZm8gKndsYywKKwkJCQkJIHdsY19yYXRlc2V0X3QgKnJzKTsKK2V4dGVybiB1MTYgd2xjX2NvbXB1dGVfYmNudHNmb2ZmKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCByYXRlc3BlY190IHJzcGVjLAogCQkJCSAgICBib29sIHNob3J0X3ByZWFtYmxlLCBib29sIHBoeWRlbGF5KTsKLWV4dGVybiB2b2lkIHdsY19yYWRpb19kaXNhYmxlKHdsY19pbmZvX3QgKndsYyk7Ci1leHRlcm4gdm9pZCB3bGNfYmNuX2xpX3VwZCh3bGNfaW5mb190ICp3bGMpOworZXh0ZXJuIHZvaWQgd2xjX3JhZGlvX2Rpc2FibGUoc3RydWN0IHdsY19pbmZvICp3bGMpOworZXh0ZXJuIHZvaWQgd2xjX2Jjbl9saV91cGQoc3RydWN0IHdsY19pbmZvICp3bGMpOwogCi1leHRlcm4gaW50IHdsY19nZXRfcmV2aXNpb25faW5mbyh3bGNfaW5mb190ICp3bGMsIHZvaWQgKmJ1ZiwgdWludCBsZW4pOwotZXh0ZXJuIHZvaWQgd2xjX291dCh3bGNfaW5mb190ICp3bGMpOwotZXh0ZXJuIHZvaWQgd2xjX3NldF9ob21lX2NoYW5zcGVjKHdsY19pbmZvX3QgKndsYywgY2hhbnNwZWNfdCBjaGFuc3BlYyk7Ci1leHRlcm4gdm9pZCB3bGNfd2F0Y2hkb2dfdXBkKHdsY19pbmZvX3QgKndsYywgYm9vbCB0YnR0KTsKLWV4dGVybiBib29sIHdsY19wc19hbGxvd2VkKHdsY19pbmZvX3QgKndsYyk7Ci1leHRlcm4gYm9vbCB3bGNfc3RheV9hd2FrZSh3bGNfaW5mb190ICp3bGMpOwotZXh0ZXJuIHZvaWQgd2xjX3dtZV9pbml0cGFyYW1zX3N0YSh3bGNfaW5mb190ICp3bGMsIHdtZV9wYXJhbV9pZV90ICpwZSk7CitleHRlcm4gaW50IHdsY19nZXRfcmV2aXNpb25faW5mbyhzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdm9pZCAqYnVmLCB1aW50IGxlbik7CitleHRlcm4gdm9pZCB3bGNfb3V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK2V4dGVybiB2b2lkIHdsY19zZXRfaG9tZV9jaGFuc3BlYyhzdHJ1Y3Qgd2xjX2luZm8gKndsYywgY2hhbnNwZWNfdCBjaGFuc3BlYyk7CitleHRlcm4gdm9pZCB3bGNfd2F0Y2hkb2dfdXBkKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBib29sIHRidHQpOworZXh0ZXJuIGJvb2wgd2xjX3BzX2FsbG93ZWQoc3RydWN0IHdsY19pbmZvICp3bGMpOworZXh0ZXJuIGJvb2wgd2xjX3N0YXlfYXdha2Uoc3RydWN0IHdsY19pbmZvICp3bGMpOworZXh0ZXJuIHZvaWQgd2xjX3dtZV9pbml0cGFyYW1zX3N0YShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgd21lX3BhcmFtX2llX3QgKnBlKTsKIAotZXh0ZXJuIHZvaWQgd2xjX2Jzc19saXN0X2ZyZWUod2xjX2luZm9fdCAqd2xjLCB3bGNfYnNzX2xpc3RfdCAqYnNzX2xpc3QpOworZXh0ZXJuIHZvaWQgd2xjX2Jzc19saXN0X2ZyZWUoc3RydWN0IHdsY19pbmZvICp3bGMsIHdsY19ic3NfbGlzdF90ICpic3NfbGlzdCk7CitleHRlcm4gdm9pZCB3bGNfaHRfbWltb3BzX2NhcF91cGRhdGUoc3RydWN0IHdsY19pbmZvICp3bGMsIHU4IG1pbW9wc19tb2RlKTsKICNlbmRpZgkJCQkvKiBfd2xjX2hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfcGh5X3NoaW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19waHlfc2hpbS5jCmluZGV4IGJmOGUyZTEuLjhiZDRlZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19waHlfc2hpbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19waHlfc2hpbS5jCkBAIC0yNCw5ICsyNCwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KICNpbmNsdWRlIDx3bGNfY2ZnLmg+Ci0jaW5jbHVkZSA8bGludXh2ZXIuaD4KLSNpbmNsdWRlIDxiY211dGlscy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPG9zbC5oPgorI2luY2x1ZGUgPGJjbXV0aWxzLmg+CiAKICNpbmNsdWRlIDxwcm90by84MDIuMTEuaD4KICNpbmNsdWRlIDxiY213aWZpLmg+CkBAIC00Niw2ICs0Nyw3IEBACiAjaW5jbHVkZSA8d2xjX2NoYW5uZWwuaD4KICNpbmNsdWRlIDxiY21zcm9tLmg+CiAjaW5jbHVkZSA8d2xjX2tleS5oPgorI2luY2x1ZGUgPHdsY19ldmVudC5oPgogCiAjaW5jbHVkZSA8d2xjX21hYzgwMjExLmg+CiAKQEAgLTUzLDIxICs1NSwyMyBAQAogI2luY2x1ZGUgPHdsY19waHlfc2hpbS5oPgogI2luY2x1ZGUgPHdsY19waHlfaGFsLmg+CiAjaW5jbHVkZSA8d2xfZXhwb3J0Lmg+CisjaW5jbHVkZSA8d2xfZGJnLmg+CiAKIC8qIFBIWSBTSElNIG1vZHVsZSBzcGVjaWZpYyBzdGF0ZSAqLwogc3RydWN0IHdsY19waHlfc2hpbV9pbmZvIHsKLQl3bGNfaHdfaW5mb190ICp3bGNfaHc7CS8qIHBvaW50ZXIgdG8gbWFpbiB3bGNfaHcgc3RydWN0dXJlICovCisJc3RydWN0IHdsY19od19pbmZvICp3bGNfaHc7CS8qIHBvaW50ZXIgdG8gbWFpbiB3bGNfaHcgc3RydWN0dXJlICovCiAJdm9pZCAqd2xjOwkJLyogcG9pbnRlciB0byBtYWluIHdsYyBzdHJ1Y3R1cmUgKi8KIAl2b2lkICp3bDsJCS8qIHBvaW50ZXIgdG8gb3Mtc3BlY2lmaWMgcHJpdmF0ZSBzdGF0ZSAqLwogfTsKIAotd2xjX3BoeV9zaGltX2luZm9fdCAqd2xjX3BoeV9zaGltX2F0dGFjaCh3bGNfaHdfaW5mb190ICp3bGNfaHcsCit3bGNfcGh5X3NoaW1faW5mb190ICp3bGNfcGh5X3NoaW1fYXR0YWNoKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LAogCQkJCQkJICAgICAgIHZvaWQgKndsLCB2b2lkICp3bGMpIHsKIAl3bGNfcGh5X3NoaW1faW5mb190ICpwaHlzaGltID0gTlVMTDsKIAogCXBoeXNoaW0gPSBremFsbG9jKHNpemVvZih3bGNfcGh5X3NoaW1faW5mb190KSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFwaHlzaGltKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogd2xjX3BoeV9zaGltX2F0dGFjaDogb3V0IG9mIG1lbVxuIiwgd2xjX2h3LT51bml0KSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfcGh5X3NoaW1fYXR0YWNoOiBvdXQgb2YgbWVtXG4iLAorCQkJIHdsY19ody0+dW5pdCk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlwaHlzaGltLT53bGNfaHcgPSB3bGNfaHc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfcHViLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfcHViLmgKaW5kZXggYTZhOGMzMy4uMTQ2YTY5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX3B1Yi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19wdWIuaApAQCAtMjUxLDcgKzI1MSw3IEBACiAgKiBQdWJsaWMgcG9ydGlvbiBvZiAiY29tbW9uIiBvcy1pbmRlcGVuZGVudCBzdGF0ZSBzdHJ1Y3R1cmUuCiAgKiBUaGUgd2xjIGhhbmRsZSBwb2ludHMgYXQgdGhpcy4KICAqLwotdHlwZWRlZiBzdHJ1Y3Qgd2xjX3B1YiB7CitzdHJ1Y3Qgd2xjX3B1YiB7CiAJdm9pZCAqd2xjOwogCiAJc3RydWN0IGllZWU4MDIxMV9odyAqaWVlZV9odzsKQEAgLTI2MCw3ICsyNjAsNyBAQAogCXVpbnQgbWFjODAyMTFfc3RhdGU7CiAJdWludCB1bml0OwkJLyogZGV2aWNlIGluc3RhbmNlIG51bWJlciAqLwogCXVpbnQgY29yZXJldjsJCS8qIGNvcmUgcmV2aXNpb24gKi8KLQlvc2xfdCAqb3NoOwkJLyogcG9pbnRlciB0byBvcyBoYW5kbGUgKi8KKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsJCS8qIHBvaW50ZXIgdG8gb3MgaGFuZGxlICovCiAJc2lfdCAqc2loOwkJLyogU0IgaGFuZGxlIChjb29raWUgZm9yIHNpdXRpbHMgY2FsbHMpICovCiAJY2hhciAqdmFyczsJCS8qICJlbnZpcm9ubWVudCIgbmFtZT12YWx1ZSAqLwogCWJvb2wgdXA7CQkvKiBpbnRlcmZhY2UgdXAgYW5kIHJ1bm5pbmcgKi8KQEAgLTMxOCw5ICszMTgsNiBAQAogCQkJCSAqIGlzIGltcGxlbWVudGVkIHByb3Blcmx5IGluIG9zbCBvZiB0aGF0IHBvcnQKIAkJCQkgKiB3aGVuIGl0IGVuYWJsZXMgdGhpcyBQb3dlciBTYXZlIGZlYXR1cmUuCiAJCQkJICovCi0jaWZkZWYgQkNNU0RJTwotCXVpbnQgc2Rpb2RfZHJpdmVfc3RyZW5ndGg7CS8qIFNESU8gZHJpdmUgc3RyZW5ndGggKi8KLSNlbmRpZgkJCQkvKiBCQ01TRElPICovCiAKIAl1MTYgYm9hcmRyZXY7CS8qIHZlcnNpb24gIyBvZiBwYXJ0aWN1bGFyIGJvYXJkICovCiAJdTggc3JvbXJldjsJCS8qIHZlcnNpb24gIyBvZiB0aGUgc3JvbSAqLwpAQCAtMzMzLDcgKzMzMCw3IEBACiAJYm9vbCBfbG1hY3Byb3RvOwkvKiBsbWFjIHByb3RvY29sIG1vZHVsZSBpbmNsdWRlZCBhbmQgZW5hYmxlZCAqLwogCWJvb2wgcGh5XzExbmNhcGFibGU7CS8qIHRoZSBQSFkvSFcgaXMgY2FwYWJsZSBvZiA4MDIuMTFOICovCiAJYm9vbCBfYW1wZHVtYWM7CQkvKiBtYWMgYXNzaXN0IGFtcGR1IGVuYWJsZWQgb3Igbm90ICovCi19IHdsY19wdWJfdDsKK307CiAKIC8qIHdsX21vbml0b3Igcnggc3RhdHVzIHBlciBwYWNrZXQgKi8KIHR5cGVkZWYgc3RydWN0IHdsX3J4c3RzIHsKQEAgLTQzNywxNyArNDM0LDEzIEBACiAjZGVmaW5lIEVEQ0ZfRU5BQihwdWIpIChXTUVfRU5BQihwdWIpKQogI2RlZmluZSBRT1NfRU5BQihwdWIpIChXTUVfRU5BQihwdWIpIHx8IE5fRU5BQihwdWIpKQogCi0jZGVmaW5lIE1PTklUT1JfRU5BQih3bGMpCShiY21zcGFjZSAmJiAod2xjKS0+bW9uaXRvcikKKyNkZWZpbmUgTU9OSVRPUl9FTkFCKHdsYykJKCh3bGMpLT5tb25pdG9yKQogCi0jZGVmaW5lIFBST01JU0NfRU5BQih3bGMpCShiY21zcGFjZSAmJiAod2xjKS0+cHJvbWlzYykKLQotZXh0ZXJuIHZvaWQgd2xjX3BrdHRhZ19pbmZvX21vdmUod2xjX3B1Yl90ICpwdWIsIHZvaWQgKnBrdF9mcm9tLCB2b2lkICpwa3RfdG8pOwotCi0jZGVmaW5lIFdMUEtUVEFHU0NCKHApIChXTFBLVFRBRyhwKS0+X3NjYikKKyNkZWZpbmUgUFJPTUlTQ19FTkFCKHdsYykJKCh3bGMpLT5wcm9taXNjKQogCiAjZGVmaW5lCVdMQ19QUkVDX0NPVU5UCQkxNgkvKiBNYXggcHJlY2VkZW5jZSBsZXZlbCBpbXBsZW1lbnRlZCAqLwogCi0vKiBwcmkgaXMgUEtUUFJJTyBlbmNvZGVkIGluIHRoZSBwYWNrZXQuIFRoaXMgbWFwcyB0aGUgUGFja2V0IHByaW9yaXR5IHRvCisvKiBwcmkgaXMgcHJpb3JpdHkgZW5jb2RlZCBpbiB0aGUgcGFja2V0LiBUaGlzIG1hcHMgdGhlIFBhY2tldCBwcmlvcml0eSB0bwogICogZW5xdWV1ZSBwcmVjZWRlbmNlIGFzIGRlZmluZWQgaW4gd2xjX3ByZWNfbWFwCiAgKi8KIGV4dGVybiBjb25zdCB1OCB3bGNfcHJpbzJwcmVjX21hcFtdOwpAQCAtNDk3LDggKzQ5MCw4IEBACiAKIC8qIGNvbW1vbiBmdW5jdGlvbnMgZm9yIGV2ZXJ5IHBvcnQgKi8KIGV4dGVybiB2b2lkICp3bGNfYXR0YWNoKHZvaWQgKndsLCB1MTYgdmVuZG9yLCB1MTYgZGV2aWNlLCB1aW50IHVuaXQsCi0JCQlib29sIHBpb21vZGUsIG9zbF90ICpvc2gsIHZvaWQgKnJlZ3N2YSwgdWludCBidXN0eXBlLAotCQkJdm9pZCAqYnRwYXJhbSwgdWludCAqcGVycik7CisJCQlib29sIHBpb21vZGUsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB2b2lkICpyZWdzdmEsCisJCQl1aW50IGJ1c3R5cGUsIHZvaWQgKmJ0cGFyYW0sIHVpbnQgKnBlcnIpOwogZXh0ZXJuIHVpbnQgd2xjX2RldGFjaChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CiBleHRlcm4gaW50IHdsY191cChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CiBleHRlcm4gdWludCB3bGNfZG93bihzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CkBAIC01MTcsOCArNTEwLDEwIEBACiBleHRlcm4gYm9vbCB3bGNfaW50cnN1cGQoc3RydWN0IHdsY19pbmZvICp3bGMpOwogZXh0ZXJuIGJvb2wgd2xjX2lzcihzdHJ1Y3Qgd2xjX2luZm8gKndsYywgYm9vbCAqd2FudGRwYyk7CiBleHRlcm4gYm9vbCB3bGNfZHBjKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBib29sIGJvdW5kZWQpOwotZXh0ZXJuIGJvb2wgd2xjX3NlbmQ4MDIxMV9yYXcoc3RydWN0IHdsY19pbmZvICp3bGMsIHdsY19pZl90ICp3bGNpZiwgdm9pZCAqcCwKLQkJCSAgICAgIHVpbnQgYWMpOworZXh0ZXJuIGJvb2wgd2xjX3NlbmQ4MDIxMV9yYXcoc3RydWN0IHdsY19pbmZvICp3bGMsIHN0cnVjdCB3bGNfaWYgKndsY2lmLAorCQkJICAgICAgdm9pZCAqcCwgdWludCBhYyk7CitleHRlcm4gYm9vbCB3bGNfc2VuZHBrdF9tYWM4MDIxMShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgc3RydWN0IHNrX2J1ZmYgKnNkdSwKKwkJCQkgc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwogZXh0ZXJuIGludCB3bGNfaW92YXJfb3Aoc3RydWN0IHdsY19pbmZvICp3bGMsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKnBhcmFtcywKIAkJCWludCBwX2xlbiwgdm9pZCAqYXJnLCBpbnQgbGVuLCBib29sIHNldCwKIAkJCXN0cnVjdCB3bGNfaWYgKndsY2lmKTsKQEAgLTUyNyw4ICs1MjIsMTMgQEAKIC8qIGhlbHBlciBmdW5jdGlvbnMgKi8KIGV4dGVybiB2b2lkIHdsY19zdGF0c3VwZChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CiBleHRlcm4gaW50IHdsY19nZXRfaGVhZGVyX2xlbih2b2lkKTsKK2V4dGVybiB2b2lkIHdsY19tYWNfYmNuX3Byb21pc2NfY2hhbmdlKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBib29sIHByb21pc2MpOworZXh0ZXJuIHZvaWQgd2xjX3NldF9hZGRybWF0Y2goc3RydWN0IHdsY19pbmZvICp3bGMsIGludCBtYXRjaF9yZWdfb2Zmc2V0LAorCQkJICAgICAgY29uc3Qgc3RydWN0IGV0aGVyX2FkZHIgKmFkZHIpOworZXh0ZXJuIHZvaWQgd2xjX3dtZV9zZXRwYXJhbXMoc3RydWN0IHdsY19pbmZvICp3bGMsIHUxNiBhY2ksIHZvaWQgKmFyZywKKwkJCSAgICAgIGJvb2wgc3VzcGVuZCk7CiAKLWV4dGVybiB3bGNfcHViX3QgKndsY19wdWIodm9pZCAqd2xjKTsKK2V4dGVybiBzdHJ1Y3Qgd2xjX3B1YiAqd2xjX3B1Yih2b2lkICp3bGMpOwogCiAvKiBjb21tb24gZnVuY3Rpb25zIGZvciBldmVyeSBwb3J0ICovCiBleHRlcm4gaW50IHdsY19ibWFjX3VwX3ByZXAoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpOwpAQCAtNTU0LDEzICs1NTQsMTUgQEAKIC8qIGlvY3RsICovCiBleHRlcm4gaW50IHdsY19pb3Zhcl9nZXRzOChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgY29uc3QgY2hhciAqbmFtZSwKIAkJCSAgICAgczggKmFyZyk7Ci1leHRlcm4gaW50IHdsY19pb3Zhcl9jaGVjayh3bGNfcHViX3QgKnB1YiwgY29uc3QgYmNtX2lvdmFyX3QgKnZpLCB2b2lkICphcmcsCitleHRlcm4gaW50IHdsY19pb3Zhcl9jaGVjayhzdHJ1Y3Qgd2xjX3B1YiAqcHViLCBjb25zdCBiY21faW92YXJfdCAqdmksCisJCQkgICB2b2lkICphcmcsCiAJCQkgICBpbnQgbGVuLCBib29sIHNldCk7CiAKLWV4dGVybiBpbnQgd2xjX21vZHVsZV9yZWdpc3Rlcih3bGNfcHViX3QgKnB1YiwgY29uc3QgYmNtX2lvdmFyX3QgKmlvdmFycywKK2V4dGVybiBpbnQgd2xjX21vZHVsZV9yZWdpc3RlcihzdHJ1Y3Qgd2xjX3B1YiAqcHViLCBjb25zdCBiY21faW92YXJfdCAqaW92YXJzLAogCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmhkbCwgaW92YXJfZm5fdCBpb3Zhcl9mbiwKIAkJCSAgICAgICB3YXRjaGRvZ19mbl90IHdhdGNoZG9nX2ZuLCBkb3duX2ZuX3QgZG93bl9mbik7Ci1leHRlcm4gaW50IHdsY19tb2R1bGVfdW5yZWdpc3Rlcih3bGNfcHViX3QgKnB1YiwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqaGRsKTsKK2V4dGVybiBpbnQgd2xjX21vZHVsZV91bnJlZ2lzdGVyKHN0cnVjdCB3bGNfcHViICpwdWIsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJIHZvaWQgKmhkbCk7CiBleHRlcm4gdm9pZCB3bGNfZXZlbnRfaWYoc3RydWN0IHdsY19pbmZvICp3bGMsIHN0cnVjdCB3bGNfYnNzY2ZnICpjZmcsCiAJCQkgd2xjX2V2ZW50X3QgKmUsIGNvbnN0IHN0cnVjdCBldGhlcl9hZGRyICphZGRyKTsKIGV4dGVybiB2b2lkIHdsY19zdXNwZW5kX21hY19hbmRfd2FpdChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CkBAIC02MTcsMTAgKzYxOSw2IEBACiAjZGVmaW5lIEJBTkRfMkdfTkFNRQkJIjIuNEciCiAjZGVmaW5lIEJBTkRfNUdfTkFNRQkJIjVHIgogCi0jaWYgZGVmaW5lZChCQ01TRElPKSB8fCBkZWZpbmVkKFdMQ19ISUdIX09OTFkpCi12b2lkIHdsY19kZXZpY2VfcmVtb3ZlZCh2b2lkICphcmcpOwotI2VuZGlmCi0KIC8qIEJNQUMgUlBDOiA3IHUzMiBwYXJhbXM6IHBrdHRvdGxlbiwgZmlmbywgY29tbWl0LCBmaWQsIHR4cGt0cGVuZCwgcGt0ZmxhZywgcnBjX2lkICovCiAjZGVmaW5lIFdMQ19SUENUWF9QQVJBTVMJCTMyCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19yYXRlLmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfcmF0ZS5jCmluZGV4IGQyZDcyNTYuLmFiN2QwYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19yYXRlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX3JhdGUuYwpAQCAtMTcsMTIgKzE3LDE0IEBACiAjaW5jbHVkZSA8YmNtZGVmcy5oPgogI2luY2x1ZGUgPHdsY19jZmcuaD4KICNpbmNsdWRlIDxvc2wuaD4KLSNpbmNsdWRlIDxsaW51eHZlci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGJjbXV0aWxzLmg+CiAjaW5jbHVkZSA8c2l1dGlscy5oPgogI2luY2x1ZGUgPGJjbWVuZGlhbi5oPgogI2luY2x1ZGUgPHdsaW9jdGwuaD4KIAorI2luY2x1ZGUgPHNiaG5kcGlvLmg+CisjaW5jbHVkZSA8c2JobmRkbWEuaD4KICNpbmNsdWRlIDxwcm90by84MDIuMTEuaD4KICNpbmNsdWRlIDxkMTEuaD4KICNpbmNsdWRlIDx3bGNfcmF0ZS5oPgpAQCAtMjk3LDcgKzI5OSw3IEBACiAJdWludCBjb3VudDsKIAl1aW50IGk7CiAKLQliemVybyhyYXRlc2V0LCBzaXplb2YocmF0ZXNldCkpOworCW1lbXNldChyYXRlc2V0LCAwLCBzaXplb2YocmF0ZXNldCkpOwogCWNvdW50ID0gcnMtPmNvdW50OwogCiAJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19ycGMuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19ycGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIzOTY0NS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfcnBjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCi0gKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpZm5kZWYgX1dMQ19SUENfSF8KLSNkZWZpbmUgX1dMQ19SUENfSF8KLQotI2luY2x1ZGUgPHdsY190eXBlcy5oPgotCi0vKiBSUEMgSURzLCByZW9yZGVyaW5nIGlzIE9LLiBUaGlzIG5lZWRzIHRvIGJlIGluIHN5bmMgd2l0aCBSUENfSURfVEFCTEUgYmVsb3cgKi8KLXR5cGVkZWYgZW51bSB7Ci0JV0xSUENfTlVMTF9JRCA9IDAsCi0JV0xSUENfV0xDX1JFR19SRUFEX0lELAotCVdMUlBDX1dMQ19SRUdfV1JJVEVfSUQsCi0JV0xSUENfV0xDX01IRl9TRVRfSUQsCi0JV0xSUENfV0xDX01IRl9HRVRfSUQsCi0JV0xSUENfV0xDX0JNQUNfVVBfUFJFUF9JRCwKLQlXTFJQQ19XTENfQk1BQ19VUF9GSU5JU0hfSUQsCi0JV0xSUENfV0xDX0JNQUNfRE9XTl9QUkVQX0lELAotCVdMUlBDX1dMQ19CTUFDX0RPV05fRklOSVNIX0lELAotCVdMUlBDX1dMQ19CTUFDX1dSSVRFX0hXX0JDTlRFTVBMQVRFU19JRCwKLQlXTFJQQ19XTENfQk1BQ19SRVNFVF9JRCwKLQlXTFJQQ19XTENfRE5HTF9SRUJPT1RfSUQsCi0JV0xSUENfV0xDX0JNQUNfUlBDX1RYUV9XTV9TRVRfSUQsCi0JV0xSUENfV0xDX0JNQUNfUlBDX1RYUV9XTV9HRVRfSUQsCi0JV0xSUENfV0xDX0JNQUNfUlBDX0FHR19TRVRfSUQsCi0JV0xSUENfV0xDX0JNQUNfUlBDX01TR0xFVkVMX1NFVF9JRCwKLQlXTFJQQ19XTENfQk1BQ19SUENfQUdHX0xJTUlUX1NFVF9JRCwKLQlXTFJQQ19XTENfQk1BQ19SUENfQUdHX0xJTUlUX0dFVF9JRCwKLQlXTFJQQ19XTENfQk1BQ19JTklUX0lELAotCVdMUlBDX1dMQ19CTUFDX1NFVF9DV01JTl9JRCwKLQlXTFJQQ19XTENfQk1BQ19NVVRFX0lELAotCVdMUlBDX1dMQ19QSFlfRE9JT1ZBUl9JRCwKLQlXTFJQQ19XTENfUEhZX0hPTERfVVBEX0lELAotCVdMUlBDX1dMQ19QSFlfTVVURV9VUERfSUQsCi0JV0xSUENfV0xDX1BIWV9DTEVBUl9UU1NJX0lELAotCVdMUlBDX1dMQ19QSFlfQU5UX1JYRElWX0dFVF9JRCwKLQlXTFJQQ19XTENfUEhZX0FOVF9SWERJVl9TRVRfSUQsCi0JV0xSUENfV0xDX1BIWV9QUkVBTUJMRV9TRVRfSUQsCi0JV0xSUENfV0xDX1BIWV9GUkVRVFJBQ0tfRU5EX0lELAotCVdMUlBDX1dMQ19QSFlfRlJFUVRSQUNLX1NUQVJUX0lELAotCVdMUlBDX1dMQ19QSFlfSU9DVExfSUQsCi0JV0xSUENfV0xDX1BIWV9OT0lTRV9TQU1QTEVfUkVRVUVTVF9JRCwKLQlXTFJQQ19XTENfUEhZX0NBTF9QRVJJQ0FMX0lELAotCVdMUlBDX1dMQ19QSFlfVFhQT1dFUl9HRVRfSUQsCi0JV0xSUENfV0xDX1BIWV9UWFBPV0VSX1NFVF9JRCwKLQlXTFJQQ19XTENfUEhZX1RYUE9XRVJfU1JPTUxJTUlUX0lELAotCVdMUlBDX1dMQ19QSFlfUkFEQVJfREVURUNUX0VOQUJMRV9JRCwKLQlXTFJQQ19XTENfUEhZX1JBREFSX0RFVEVDVF9SVU5fSUQsCi0JV0xSUENfV0xDX1BIWV9URVNUX0lTT05fSUQsCi0JV0xSUENfV0xDX0JNQUNfQ09QWUZST01fT0JKTUVNX0lELAotCVdMUlBDX1dMQ19CTUFDX0NPUFlUT19PQkpNRU1fSUQsCi0JV0xSUENfV0xDX0VOQUJMRV9NQUNfSUQsCi0JV0xSUENfV0xDX01DVFJMX0lELAotCVdMUlBDX1dMQ19DT1JFUkVTRVRfSUQsCi0JV0xSUENfV0xDX0JNQUNfUkVBRF9TSE1fSUQsCi0JV0xSUENfV0xDX0JNQUNfUkVBRF9UU0ZfSUQsCi0JV0xSUENfV0xDX0JNQUNfU0VUX0FERFJNQVRDSF9JRCwKLQlXTFJQQ19XTENfQk1BQ19TRVRfQ1dNQVhfSUQsCi0JV0xSUENfV0xDX0JNQUNfU0VUX1JDTVRBX0lELAotCVdMUlBDX1dMQ19CTUFDX1NFVF9TSE1fSUQsCi0JV0xSUENfV0xDX1NVU1BFTkRfTUFDX0FORF9XQUlUX0lELAotCVdMUlBDX1dMQ19CTUFDX1dSSVRFX1NITV9JRCwKLQlXTFJQQ19XTENfQk1BQ19XUklURV9URU1QTEFURV9SQU1fSUQsCi0JV0xSUENfV0xDX1RYX0ZJRk9fU1VTUEVORF9JRCwKLQlXTFJQQ19XTENfVFhfRklGT19SRVNVTUVfSUQsCi0JV0xSUENfV0xDX1RYX0ZJRk9fU1VTUEVOREVEX0lELAotCVdMUlBDX1dMQ19IV19FVEhFUkFERFJfSUQsCi0JV0xSUENfV0xDX1NFVF9IV19FVEhFUkFERFJfSUQsCi0JV0xSUENfV0xDX0JNQUNfQ0hBTlNQRUNfU0VUX0lELAotCVdMUlBDX1dMQ19CTUFDX1RYQU5UX1NFVF9JRCwKLQlXTFJQQ19XTENfQk1BQ19BTlRTRUxfVFlQRV9TRVRfSUQsCi0JV0xSUENfV0xDX0JNQUNfVFhGSUZPX0lELAotCVdMUlBDX1dMQ19SQURJT19SRUFEX0hXRElTQUJMRURfSUQsCi0JV0xSUENfV0xDX1JNX0NDQV9NRUFTVVJFX0lELAotCVdMUlBDX1dMQ19TRVRfU0hPUlRTTE9UX0lELAotCVdMUlBDX1dMQ19XQUlUX0ZPUl9XQUtFX0lELAotCVdMUlBDX1dMQ19QSFlfVFhQT1dFUl9HRVRfQ1VSUkVOVF9JRCwKLQlXTFJQQ19XTENfUEhZX1RYUE9XRVJfSFdfQ1RSTF9HRVRfSUQsCi0JV0xSUENfV0xDX1BIWV9UWFBPV0VSX0hXX0NUUkxfU0VUX0lELAotCVdMUlBDX1dMQ19QSFlfQlNTSU5JVF9JRCwKLQlXTFJQQ19XTENfQkFORF9TVEZfU1NfU0VUX0lELAotCVdMUlBDX1dMQ19QSFlfQkFORF9GSVJTVF9DSEFOU1BFQ19JRCwKLQlXTFJQQ19XTENfUEhZX1RYUE9XRVJfTElNSVRfU0VUX0lELAotCVdMUlBDX1dMQ19QSFlfQkFORF9DSEFOTkVMU19JRCwKLQlXTFJQQ19XTENfQk1BQ19SRVZJTkZPX0dFVF9JRCwKLQlXTFJQQ19XTENfQk1BQ19TVEFURV9HRVRfSUQsCi0JV0xSUENfV0xDX0JNQUNfWE1URklGT19TWl9HRVRfSUQsCi0JV0xSUENfV0xDX0JNQUNfWE1URklGT19TWl9TRVRfSUQsCi0JV0xSUENfV0xDX0JNQUNfVkFMSURBVEVfQ0hJUF9BQ0NFU1NfSUQsCi0JV0xSUENfV0xDX1JNX0NDQV9DT01QTEVURV9JRCwKLQlXTFJQQ19XTENfUkVDVl9JRCwKLQlXTFJQQ19XTENfRE9UWFNUQVRVU19JRCwKLQlXTFJQQ19XTENfSElHSF9EUENfSUQsCi0JV0xSUENfV0xDX0ZBVEFMX0VSUk9SX0lELAotCVdMUlBDX1dMQ19QSFlfU0VUX0NIQU5ORUxfMTRfV0lERV9GSUxURVJfSUQsCi0JV0xSUENfV0xDX1BIWV9OT0lTRV9BVkdfSUQsCi0JV0xSUENfV0xDX1BIWUNIQUlOX0lOSVRfSUQsCi0JV0xSUENfV0xDX1BIWUNIQUlOX1NFVF9JRCwKLQlXTFJQQ19XTENfUEhZQ0hBSU5fR0VUX0lELAotCVdMUlBDX1dMQ19QSFlfVEtJUF9SSUZTX1dBUl9JRCwKLQlXTFJQQ19XTENfQk1BQ19DT1BZRlJPTV9WQVJTX0lELAotCVdMUlBDX1dMQ19CTUFDX1JFVFJZTElNSVRfVVBEX0lELAotCVdMUlBDX1dMQ19CTUFDX0JUQ19NT0RFX1NFVF9JRCwKLQlXTFJQQ19XTENfQk1BQ19CVENfTU9ERV9HRVRfSUQsCi0JV0xSUENfV0xDX0JNQUNfQlRDX1dJUkVfU0VUX0lELAotCVdMUlBDX1dMQ19CTUFDX0JUQ19XSVJFX0dFVF9JRCwKLQlXTFJQQ19XTENfQk1BQ19TRVRfTk9SRVNFVF9JRCwKLQlXTFJQQ19XTENfQU1QRFVfVFhTVEFUVVNfQ09NUExFVEVfSUQsCi0JV0xSUENfV0xDX0JNQUNfRklGT0VSUk9SU19JRCwKLQlXTFJQQ19XTENfUEhZX1RYUE9XRVJfR0VUX1RBUkdFVF9NSU5fSUQsCi0JV0xSUENfV0xDX1BIWV9UWFBPV0VSX0dFVF9UQVJHRVRfTUFYX0lELAotCVdMUlBDX1dMQ19OT0lTRV9DQl9JRCwKLQlXTFJQQ19XTENfQk1BQ19MRURfSFdfREVJTklUX0lELAotCVdMUlBDX1dMQ19CTUFDX0xFRF9IV19NQVNLX0lOSVRfSUQsCi0JV0xSUENfV0xDX1BMTFJFUV9JRCwKLQlXTFJQQ19XTENfQk1BQ19UQUNMRUFSX0lELAotCVdMUlBDX1dMQ19CTUFDX1NFVF9DTEtfSUQsCi0JV0xSUENfV0xDX1BIWV9PRkRNX1JBVEVTRVRfV0FSX0lELAotCVdMUlBDX1dMQ19QSFlfQkZfUFJFRU1QVF9FTkFCTEVfSUQsCi0JV0xSUENfV0xDX0JNQUNfRE9JT1ZBUlNfSUQsCi0JV0xSUENfV0xDX0JNQUNfRFVNUF9JRCwKLQlXTFJQQ19XTENfQ0lTV1JJVEVfSUQsCi0JV0xSUENfV0xDX0NJU0RVTVBfSUQsCi0JV0xSUENfV0xDX1VQREFURV9QSFlfTU9ERV9JRCwKLQlXTFJQQ19XTENfUkVTRVRfQk1BQ19ET05FX0lELAotCVdMUlBDX1dMQ19CTUFDX0xFRF9CTElOS19FVkVOVF9JRCwKLQlXTFJQQ19XTENfQk1BQ19MRURfU0VUX0lELAotCVdMUlBDX1dMQ19CTUFDX0xFRF9CTElOS19JRCwKLQlXTFJQQ19XTENfQk1BQ19MRURfSUQsCi0JV0xSUENfV0xDX0JNQUNfUkFURV9TSE1fT0ZGU0VUX0lELAotCVdMUlBDX1NJX0lTQ09SRV9VUF9JRCwKLQlXTFJQQ19XTENfQk1BQ19QU19TV0lUQ0hfSUQsCi0JV0xSUENfV0xDX1BIWV9TVEZfU1NNT0RFX0dFVF9JRCwKLQlXTFJQQ19XTENfQk1BQ19ERUJVR19JRCwKLQlXTFJQQ19XTENfRVhUTE9HX01TR19JRCwKLQlXTFJQQ19XTENfRVhUTE9HX0NGR19JRCwKLQlXTFJQQ19CQ01fQVNTRVJUX0xPR19JRCwKLQlXTFJQQ19CQ01fQVNTRVJUX1RZUEVfSUQsCi0JV0xSUENfV0xDX0JNQUNfU0VUX1BIWUNBTF9DQUNIRV9GTEFHX0lELAotCVdMUlBDX1dMQ19CTUFDX0dFVF9QSFlDQUxfQ0FDSEVfRkxBR19JRCwKLQlXTFJQQ19XTENfUEhZX0NBTF9DQUNIRV9JTklUX0lELAotCVdMUlBDX1dMQ19QSFlfQ0FMX0NBQ0hFX0RFSU5JVF9JRCwKLQlXTFJQQ19XTENfQk1BQ19IV19VUF9JRCwKLQlXTFJQQ19XTENfQk1BQ19TRVRfVFhQV1JfUEVSQ0VOVF9JRCwKLQlXTFJQQ19XTENfUEhZQ0hBSU5fQUNUSVZFX0dFVF9JRCwKLQlXTFJQQ19XTENfQk1BQ19CTElOS19TWU5DX0lELAotCVdMUlBDX1dMQ19CTUFDX1VDT0RFX0RCR1NFTF9TRVRfSUQsCi0JV0xSUENfV0xDX0JNQUNfVUNPREVfREJHU0VMX0dFVF9JRCwKLQlXTFJQQ19XTENfUEhZX1JBREFSX0RFVEVDVF9NT0RFX1NFVF9JRCwKLQlXTFJQQ19XTENfUEhZX0FDSU1fTk9JU0VNX1JFU0VUX05QSFlfSUQsCi0JV0xSUENfV0xDX1BIWV9JTlRFUkZFUl9TRVRfTlBIWV9JRCwKLQlXTFJQQ19XTENfQk1BQ19JRlNDVExfRURDUlNfU0VUX0lELAotCVdMUlBDX1dMQ19QS1RFTkdUWCwKLQlXTFJQQ19XTENfQk1BQ19TRVRfREVBRiwKLQlXTFJQQ19XTENfQk1BQ19DTEVBUl9ERUFGLAotCVdMUlBDX1dMQ19CTUFDX0JUQ19GTEFHU19TRVRfSUQsCi0JV0xSUENfV0xDX0JNQUNfQlRDX0ZMQUdTX0dFVF9JRCwKLQlXTFJQQ19XTENfQk1BQ19TRVRfUkNNVEFfVFlQRV9JRCwKLQlXTFJQQ19XTENfQk1BQ19CVENfRkxBR1NfVVBEX0lELAotCVdMUlBDX1dMQ19CTUFDX0JUQ19TVFVDS1dBUl9JRCwKLQlXTFJQQ19XTENfQk1BQ19DQ0FfU1RBVFNfUkVBRF9JRCwKLQlXTFJQQ19XTENfQk1BQ19BTlRTRUxfU0VUX0lELAotCVdMUlBDX1dMQ19CTUFDX1NFVF9VQ09ERV9MT0FERUQsCi0JV0xSUENfV0xDX1BIWV9MRFBDX1NFVF9JRCwKLQotCVdMUlBDX0xBU1QKLX0gd2xjX3JwY19pZF90OwotCi0jaWYgZGVmaW5lZChCQ01EQkcpIHwgMAotc3RydWN0IG5hbWVfZW50cnkgewotCWludCBpZDsKLQljaGFyICpuYW1lOwotfTsKLQotI2RlZmluZSBOQU1FX0VOVFJZKHgpIHt4LCAjeH0KLQotI2RlZmluZSBSUENfSURfVEFCTEUgeyBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUkVHX1JFQURfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUkVHX1dSSVRFX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX01IRl9TRVRfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfTUhGX0dFVF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1VQX1BSRVBfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19VUF9GSU5JU0hfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19ET1dOX1BSRVBfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19ET1dOX0ZJTklTSF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1dSSVRFX0hXX0JDTlRFTVBMQVRFU19JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1JFU0VUX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0ROR0xfUkVCT09UX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfUlBDX1RYUV9XTV9TRVRfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19SUENfVFhRX1dNX0dFVF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1JQQ19BR0dfU0VUX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfUlBDX01TR0xFVkVMX1NFVF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1JQQ19BR0dfTElNSVRfU0VUX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfUlBDX0FHR19MSU1JVF9HRVRfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19JTklUX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfU0VUX0NXTUlOX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfTVVURV9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfRE9JT1ZBUl9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfSE9MRF9VUERfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX01VVEVfVVBEX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1BIWV9DTEVBUl9UU1NJX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1BIWV9BTlRfUlhESVZfR0VUX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1BIWV9BTlRfUlhESVZfU0VUX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1BIWV9QUkVBTUJMRV9TRVRfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX0ZSRVFUUkFDS19FTkRfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX0ZSRVFUUkFDS19TVEFSVF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfSU9DVExfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX05PSVNFX1NBTVBMRV9SRVFVRVNUX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1BIWV9DQUxfUEVSSUNBTF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfVFhQT1dFUl9HRVRfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX1RYUE9XRVJfU0VUX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1BIWV9UWFBPV0VSX1NST01MSU1JVF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfUkFEQVJfREVURUNUX0VOQUJMRV9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfUkFEQVJfREVURUNUX1JVTl9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfVEVTVF9JU09OX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfQ09QWUZST01fT0JKTUVNX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfQ09QWVRPX09CSk1FTV9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19FTkFCTEVfTUFDX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX01DVFJMX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0NPUkVSRVNFVF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1JFQURfU0hNX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfUkVBRF9UU0ZfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19TRVRfQUREUk1BVENIX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfU0VUX0NXTUFYX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfU0VUX1JDTVRBX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfU0VUX1NITV9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19TVVNQRU5EX01BQ19BTkRfV0FJVF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1dSSVRFX1NITV9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1dSSVRFX1RFTVBMQVRFX1JBTV9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19UWF9GSUZPX1NVU1BFTkRfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfVFhfRklGT19SRVNVTUVfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfVFhfRklGT19TVVNQRU5ERURfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfSFdfRVRIRVJBRERSX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1NFVF9IV19FVEhFUkFERFJfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19DSEFOU1BFQ19TRVRfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19UWEFOVF9TRVRfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19BTlRTRUxfVFlQRV9TRVRfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19UWEZJRk9fSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUkFESU9fUkVBRF9IV0RJU0FCTEVEX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1JNX0NDQV9NRUFTVVJFX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1NFVF9TSE9SVFNMT1RfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfV0FJVF9GT1JfV0FLRV9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfVFhQT1dFUl9HRVRfQ1VSUkVOVF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfVFhQT1dFUl9IV19DVFJMX0dFVF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfVFhQT1dFUl9IV19DVFJMX1NFVF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfQlNTSU5JVF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CQU5EX1NURl9TU19TRVRfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX0JBTkRfRklSU1RfQ0hBTlNQRUNfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX1RYUE9XRVJfTElNSVRfU0VUX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1BIWV9CQU5EX0NIQU5ORUxTX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfUkVWSU5GT19HRVRfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19TVEFURV9HRVRfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19YTVRGSUZPX1NaX0dFVF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1hNVEZJRk9fU1pfU0VUX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfVkFMSURBVEVfQ0hJUF9BQ0NFU1NfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUk1fQ0NBX0NPTVBMRVRFX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1JFQ1ZfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfRE9UWFNUQVRVU19JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19ISUdIX0RQQ19JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19GQVRBTF9FUlJPUl9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfU0VUX0NIQU5ORUxfMTRfV0lERV9GSUxURVJfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX05PSVNFX0FWR19JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlDSEFJTl9JTklUX0lEKSwgXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1BIWUNIQUlOX1NFVF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlDSEFJTl9HRVRfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX1RLSVBfUklGU19XQVJfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19DT1BZRlJPTV9WQVJTX0lEKSwgXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfUkVUUllMSU1JVF9VUERfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19CVENfTU9ERV9TRVRfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19CVENfTU9ERV9HRVRfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19CVENfV0lSRV9TRVRfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19CVENfV0lSRV9HRVRfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19TRVRfTk9SRVNFVF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19BTVBEVV9UWFNUQVRVU19DT01QTEVURV9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX0ZJRk9FUlJPUlNfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX1RYUE9XRVJfR0VUX1RBUkdFVF9NSU5fSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX1RYUE9XRVJfR0VUX1RBUkdFVF9NQVhfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfTk9JU0VfQ0JfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19MRURfSFdfREVJTklUX0lEKSwgXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfTEVEX0hXX01BU0tfSU5JVF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QTExSRVFfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19UQUNMRUFSX0lEKSwgXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfU0VUX0NMS19JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfT0ZETV9SQVRFU0VUX1dBUl9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfQkZfUFJFRU1QVF9FTkFCTEVfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19ET0lPVkFSU19JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX0RVTVBfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQ0lTV1JJVEVfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQ0lTRFVNUF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19VUERBVEVfUEhZX01PREVfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUkVTRVRfQk1BQ19ET05FX0lEKSwgXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfTEVEX0JMSU5LX0VWRU5UX0lEKSwgXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfTEVEX1NFVF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX0xFRF9CTElOS19JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX0xFRF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1JBVEVfU0hNX09GRlNFVF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1NJX0lTQ09SRV9VUF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1BTX1NXSVRDSF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfU1RGX1NTTU9ERV9HRVRfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19ERUJVR19JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19FWFRMT0dfTVNHX0lEKSwgXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0VYVExPR19DRkdfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19CQ01fQVNTRVJUX0xPR19JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX0JDTV9BU1NFUlRfVFlQRV9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1NFVF9QSFlDQUxfQ0FDSEVfRkxBR19JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX0dFVF9QSFlDQUxfQ0FDSEVfRkxBR19JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfQ0FMX0NBQ0hFX0lOSVRfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX0NBTF9DQUNIRV9ERUlOSVRfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19IV19VUF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1NFVF9UWFBXUl9QRVJDRU5UX0lEKSwgXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1BIWUNIQUlOX0FDVElWRV9HRVRfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19CTElOS19TWU5DX0lEKSwgXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfVUNPREVfREJHU0VMX1NFVF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1VDT0RFX0RCR1NFTF9HRVRfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX1JBREFSX0RFVEVDVF9NT0RFX1NFVF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfQUNJTV9OT0lTRU1fUkVTRVRfTlBIWV9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfSU5URVJGRVJfU0VUX05QSFlfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19JRlNDVExfRURDUlNfU0VUX0lEKSwgXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1BLVEVOR1RYKSwgXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfU0VUX0RFQUYpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19DTEVBUl9ERUFGKSwgXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfQlRDX0ZMQUdTX1NFVF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX0JUQ19GTEFHU19HRVRfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19TRVRfUkNNVEFfVFlQRV9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX0NDQV9TVEFUU19SRUFEX0lEKSwgXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfQU5UU0VMX1NFVF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1NFVF9VQ09ERV9MT0FERUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX0xEUENfU0VUX0lEKSwJXAotCXswLCBOVUxMfSBcCi0JfQotCi1zdGF0aWMgX19pbmxpbmUgY2hhciAqX3dsY19ycGNfaWRfbG9va3VwKGNvbnN0IHN0cnVjdCBuYW1lX2VudHJ5ICp0YmwsIGludCBfaWQpCi17Ci0JY29uc3Qgc3RydWN0IG5hbWVfZW50cnkgKmVsdCA9IHRibDsKLQlzdGF0aWMgY2hhciBfX3Vua25vd25bNjRdOwotCWZvciAoOyBlbHQtPm5hbWUgIT0gTlVMTDsgZWx0KyspIHsKLQkJaWYgKF9pZCA9PSBlbHQtPmlkKQotCQkJYnJlYWs7Ci0JfQotCWlmIChfaWQgPT0gZWx0LT5pZCkKLQkJc3RybmNweShfX3Vua25vd24sIGVsdC0+bmFtZSwgc2l6ZW9mKF9fdW5rbm93bikpOwotCWVsc2UKLQkJc25wcmludGYoX191bmtub3duLCBzaXplb2YoX191bmtub3duKSwgIklEOiVkIiwgX2lkKTsKLQlyZXR1cm4gX191bmtub3duOwotfQotCi0jZGVmaW5lIFdMQ19SUENfSURfTE9PS1VQKHRibCwgX2lkKSAoX3dsY19ycGNfaWRfbG9va3VwKHRibCwgX2lkKSkKLQotI2VuZGlmCQkJCS8qIEJDTURCRyAqLwotCi0vKiByZWZlciB0byB0eHB3cl9saW1pdHNfdCBmb3IgZWFjaCBlbGVtZW50cywgbWNzMzIgaXMgdGhlIGF0IHRoZSBlbmQgZm9yIDEgYnl0ZSAqLwotI2RlZmluZSBUWFBPV0VSX1hEUl9TWgkocm91bmR1cChXTENfTlVNX1JBVEVTX0NDSywgNCkgKyByb3VuZHVwKFdMQ19OVU1fUkFURVNfT0ZETSwgNCkgKiA0ICsgXAotCXJvdW5kdXAoV0xDX05VTV9SQVRFU19NQ1NfMV9TVFJFQU0sIDQpICogNiArIHJvdW5kdXAoV0xDX05VTV9SQVRFU19NQ1NfMl9TVFJFQU0sIDQpICogMiArIFwKLQlyb3VuZHVwKDEsIDQpKQotCi0jZGVmaW5lIHdsY19ycGNfdHhwd3JfbGltaXRzKGIsIHR4cHdyLCBvcCwgZXJyKQlcCi0JZG8gewkJCQkJCQkJCQkJXAotCQkoZXJyKSA9IGJjbV94ZHJfIyNvcCMjX3U4X3ZlYygoYiksICh0eHB3ciktPmNjaywgV0xDX05VTV9SQVRFU19DQ0spOwkJXAotCQlBU1NFUlQoIShlcnIpKTsJCQkJCQkJCQlcCi0JCQkJCQkJCQkJCQlcCi0JCS8qIDIwIE1IeiBMZWdhY3kgT0ZETSByYXRlcyB3aXRoIFNJU08gdHJhbnNtaXNzaW9uICovCQkJCVwKLQkJKGVycikgPSBiY21feGRyXyMjb3AjI191OF92ZWMoKGIpLCAodHhwd3IpLT5vZmRtLCBXTENfTlVNX1JBVEVTX09GRE0pOwlcCi0JCUFTU0VSVCghKGVycikpOwkJCQkJCQkJCVwKLQkJCQkJCQkJCQkJCVwKLQkJLyogMjAgTUh6IExlZ2FjeSBPRkRNIHJhdGVzIHdpdGggQ0REIHRyYW5zbWlzc2lvbiAqLwkJCQlcCi0JCShlcnIpID0gYmNtX3hkcl8jI29wIyNfdThfdmVjKChiKSwgKHR4cHdyKS0+b2ZkbV9jZGQsIFdMQ19OVU1fUkFURVNfT0ZETSk7ICAgXAotCQlBU1NFUlQoIShlcnIpKTsJCQkJCQkJCQlcCi0JCQkJCQkJCQkJCQlcCi0JCS8qIDQwIE1IeiBMZWdhY3kgT0ZETSByYXRlcyB3aXRoIFNJU08gdHJhbnNtaXNzaW9uICovCQkJCVwKLQkJKGVycikgPSBiY21feGRyXyMjb3AjI191OF92ZWMoKGIpLCAodHhwd3IpLT5vZmRtXzQwX3Npc28sIFdMQ19OVU1fUkFURVNfT0ZETSk7IFwKLQkJQVNTRVJUKCEoZXJyKSk7CQkJCQkJCQkJXAotCQkJCQkJCQkJCQkJXAotCQkvKiA0MCBNSHogTGVnYWN5IE9GRE0gcmF0ZXMgd2l0aCBDREQgdHJhbnNtaXNzaW9uICovCQkJCVwKLQkJKGVycikgPSBiY21feGRyXyMjb3AjI191OF92ZWMoKGIpLCAodHhwd3IpLT5vZmRtXzQwX2NkZCwgV0xDX05VTV9SQVRFU19PRkRNKTsgXAotCQlBU1NFUlQoIShlcnIpKTsJCQkJCQkJCQlcCi0JCQkJCQkJCQkJCQlcCi0JCS8qIDIwTUh6IE1DUyByYXRlcyBTSVNPL0NERC9TVEJDL1NETSAqLwkJCQkJCQkgXAotCQkoZXJyKSA9IGJjbV94ZHJfIyNvcCMjX3U4X3ZlYygoYiksICh0eHB3ciktPm1jc18yMF9zaXNvLCBXTENfTlVNX1JBVEVTX01DU18xX1NUUkVBTSk7IFwKLQkJQVNTRVJUKCEoZXJyKSk7CQkJCQkJCQkJXAotCQkJCQkJCQkJCQkJXAotCQkoZXJyKSA9IGJjbV94ZHJfIyNvcCMjX3U4X3ZlYygoYiksICh0eHB3ciktPm1jc18yMF9jZGQsIFdMQ19OVU1fUkFURVNfTUNTXzFfU1RSRUFNKTsgXAotCQlBU1NFUlQoIShlcnIpKTsJCQkJCQkJCQlcCi0JCQkJCQkJCQkJCQlcCi0JCShlcnIpID0gYmNtX3hkcl8jI29wIyNfdThfdmVjKChiKSwgKHR4cHdyKS0+bWNzXzIwX3N0YmMsIFdMQ19OVU1fUkFURVNfTUNTXzFfU1RSRUFNKTsgXAotCQlBU1NFUlQoIShlcnIpKTsJCQkJCQkJCQlcCi0JCQkJCQkJCQkJCQlcCi0JCShlcnIpID0gYmNtX3hkcl8jI29wIyNfdThfdmVjKChiKSwgKHR4cHdyKS0+bWNzXzIwX21pbW8sIFdMQ19OVU1fUkFURVNfTUNTXzJfU1RSRUFNKTsgXAotCQlBU1NFUlQoIShlcnIpKTsJCQkJCQkJCQlcCi0JCQkJCQkJCQkJCQlcCi0JCS8qIDQwTUh6IE1DUyByYXRlcyBTSVNPL0NERC9TVEJDL1NETSAqLwkJCQkJCQkgXAotCQkoZXJyKSA9IGJjbV94ZHJfIyNvcCMjX3U4X3ZlYygoYiksICh0eHB3ciktPm1jc180MF9zaXNvLCBXTENfTlVNX1JBVEVTX01DU18xX1NUUkVBTSk7IFwKLQkJQVNTRVJUKCEoZXJyKSk7CQkJCQkJCQkJXAotCQkJCQkJCQkJCQkJXAotCQkoZXJyKSA9IGJjbV94ZHJfIyNvcCMjX3U4X3ZlYygoYiksICh0eHB3ciktPm1jc180MF9jZGQsIFdMQ19OVU1fUkFURVNfTUNTXzFfU1RSRUFNKTsgXAotCQlBU1NFUlQoIShlcnIpKTsJCQkJCQkJCQlcCi0JCQkJCQkJCQkJCQlcCi0JCShlcnIpID0gYmNtX3hkcl8jI29wIyNfdThfdmVjKChiKSwgKHR4cHdyKS0+bWNzXzQwX3N0YmMsIFdMQ19OVU1fUkFURVNfTUNTXzFfU1RSRUFNKTsgXAotCQlBU1NFUlQoIShlcnIpKTsJCQkJCQkJCQlcCi0JCQkJCQkJCQkJCQlcCi0JCShlcnIpID0gYmNtX3hkcl8jI29wIyNfdThfdmVjKChiKSwgKHR4cHdyKS0+bWNzXzQwX21pbW8sIFdMQ19OVU1fUkFURVNfTUNTXzJfU1RSRUFNKTsgXAotCQlBU1NFUlQoIShlcnIpKTsJCQkJCQkJCQlcCi0JfSB3aGlsZSAoMCkKLQotdHlwZWRlZiBzdHJ1Y3Qgd2xjX3JwY19jdHggewotCXJwY19pbmZvX3QgKnJwYzsKLQl3bGNfaW5mb190ICp3bGM7Ci0Jd2xjX2h3X2luZm9fdCAqd2xjX2h3OwotfSB3bGNfcnBjX2N0eF90OwotCi1zdGF0aWMgaW5saW5lIHJwY19idWZfdCAqd2xjX3JwY19idWZfYWxsb2MocnBjX2luZm9fdCAqcnBjLCBiY21feGRyX2J1Zl90ICpiLAotCQkJCQkgICB1aW50IGxlbiwgd2xjX3JwY19pZF90IHJwY19pZCkKLXsKLQlycGNfYnVmX3QgKnJwY19idWY7Ci0KLQlycGNfYnVmID0gYmNtX3JwY19idWZfYWxsb2MocnBjLCBsZW4gKyBzaXplb2YodTMyKSk7Ci0KLQlpZiAoIXJwY19idWYpCi0JCXJldHVybiBOVUxMOwotCi0JYmNtX3hkcl9idWZfaW5pdChiLCBiY21fcnBjX2J1Zl9kYXRhKGJjbV9ycGNfdHBfZ2V0KHJwYyksIHJwY19idWYpLAotCQkJIGxlbiArIHNpemVvZih1MzIpKTsKLQotCWJjbV94ZHJfcGFja191MzIoYiwgcnBjX2lkKTsKLQotCXJldHVybiBycGNfYnVmOwotfQotCi0jaWYgZGVmaW5lZChCQ01EQkcpCi1zdGF0aWMgX19pbmxpbmUgd2xjX3JwY19pZF90Ci13bGNfcnBjX2lkX2dldChzdHJ1Y3QgcnBjX2luZm8gKnJwYywgcnBjX2J1Zl90ICpidWYpCi17Ci0Jd2xjX3JwY19pZF90IHJwY19pZDsKLQliY21feGRyX2J1Zl90IGI7Ci0KLQliY21feGRyX2J1Zl9pbml0KCZiLCBiY21fcnBjX2J1Zl9kYXRhKGJjbV9ycGNfdHBfZ2V0KHJwYyksIGJ1ZiksCi0JCQkgc2l6ZW9mKHUzMikpOwotCi0JYmNtX3hkcl91bnBhY2tfdTMyKCZiLCAodTMyICopKCh1bnNpZ25lZCBsb25nKSAmIHJwY19pZCkpOwotCXJldHVybiBycGNfaWQ7Ci19Ci0jZW5kaWYKLQotc3RhdGljIF9faW5saW5lIGludCBfd2xjX3JwY19jYWxsKHN0cnVjdCBycGNfaW5mbyAqcnBjLCBycGNfYnVmX3QgKnNlbmQpCi17Ci0JaW50IF9lcnIgPSAwOwotI2lmIGRlZmluZWQoQkNNREJHKQotCXdsY19ycGNfaWRfdCBycGNfaWQgPSB3bGNfcnBjX2lkX2dldChycGMsIHNlbmQpOwotCS8qIGNvbnN0IHN0cnVjdCBuYW1lX2VudHJ5IHJwY19uYW1lX3RibFtdID0gUlBDX0lEX1RBQkxFOyAqLwotCXN0YXRpYyBzdHJ1Y3QgbmFtZV9lbnRyeSBycGNfbmFtZV90YmxbXSA9IFJQQ19JRF9UQUJMRTsKLQlXTF9UUkFDRSgoIiVzOiBDYWxsZWQgaWQgJXNcbiIsIF9fZnVuY19fLAotCQkgIFdMQ19SUENfSURfTE9PS1VQKHJwY19uYW1lX3RibCwgcnBjX2lkKSkpOwotI2VuZGlmCi0JX2VyciA9IGJjbV9ycGNfY2FsbChycGMsIHNlbmQpOwotCWlmIChfZXJyKSB7Ci0jaWYgZGVmaW5lZChCQ01EQkcpCi0JCVdMX0VSUk9SKCgiJXM6IENhbGwgaWQgJXMgRkFJTEVEXG4iLCBfX2Z1bmNfXywKLQkJCSAgV0xDX1JQQ19JRF9MT09LVVAocnBjX25hbWVfdGJsLCBycGNfaWQpKSk7Ci0jZW5kaWYKLQkJX2VyciA9IDA7Ci0JfQotCXJldHVybiBfZXJyOwotfQotCi0jZGVmaW5lIHdsY19ycGNfY2FsbChycGMsIHNlbmQpIChfd2xjX3JwY19jYWxsKHJwYywgc2VuZCkpCi0KLSNpbmNsdWRlIDxzYmhuZGRtYS5oPgotI2luY2x1ZGUgPHNiaG5kcGlvLmg+Ci0jaW5jbHVkZSA8ZDExLmg+Ci0KLSNpZmRlZiBXTENfTE9XCi1leHRlcm4gdm9pZCB3bGNfcnBjX2JtYWNfZGlzcGF0Y2god2xjX3JwY19jdHhfdCAqcnBjX2N0eCwgc3RydWN0IHJwY19idWYgKmJ1Zik7Ci1leHRlcm4gdm9pZCB3bGNfcnBjX2JtYWNfZHVtcF90eGZpZm9oaXN0KHdsY19od19pbmZvX3QgKndsY19odywKLQkJCQkJIGJvb2wgZHVtcF9jbGVhcik7Ci0jZWxzZQotZXh0ZXJuIHZvaWQgd2xjX3JwY19oaWdoX2Rpc3BhdGNoKHdsY19ycGNfY3R4X3QgKmN0eCwgc3RydWN0IHJwY19idWYgKmJ1Zik7Ci0jZW5kaWYKLQotLyogUGFja2VkIHN0cnVjdHVyZSBmb3IgZWFzZSBvZiB0cmFuc3BvcnQgYWNyb3NzIFJQQyBidXMgYWxvbmcgdTMyIGJvdW5kYXJ5ICovCi10eXBlZGVmIHN0cnVjdCB3bGNfcnBjX3R4c3RhdHVzIHsKLQl1MzIgUEFEX2ZyYW1lbGVuOwotCXUzMiBzdGF0dXNfZnJhbWVpZDsKLQl1MzIgc2VxdWVuY2VfbGFzdHR4dGltZTsKLQl1MzIgYWNrcGh5cnhzaF9waHllcnI7Ci19IHdsY19ycGNfdHhzdGF0dXNfdDsKLQotc3RhdGljIGlubGluZQotICAgIHZvaWQgdHhzdGF0dXMycnBjX3R4c3RhdHVzKHR4X3N0YXR1c190ICp0eHN0YXR1cywKLQkJCSAgICAgICB3bGNfcnBjX3R4c3RhdHVzX3QgKnJwY190eHN0YXR1cykKLXsKLQlycGNfdHhzdGF0dXMtPlBBRF9mcmFtZWxlbiA9IHR4c3RhdHVzLT5mcmFtZWxlbjsKLQlycGNfdHhzdGF0dXMtPnN0YXR1c19mcmFtZWlkID0KLQkgICAgKHR4c3RhdHVzLT5zdGF0dXMgPDwgMTYpIHwgdHhzdGF0dXMtPmZyYW1laWQ7Ci0JcnBjX3R4c3RhdHVzLT5zZXF1ZW5jZV9sYXN0dHh0aW1lID0KLQkgICAgKHR4c3RhdHVzLT5zZXF1ZW5jZSA8PCAxNikgfCB0eHN0YXR1cy0+bGFzdHR4dGltZTsKLQlycGNfdHhzdGF0dXMtPmFja3BoeXJ4c2hfcGh5ZXJyID0KLQkgICAgKHR4c3RhdHVzLT5hY2twaHlyeHNoIDw8IDE2KSB8IHR4c3RhdHVzLT5waHllcnI7Ci19Ci0KLXN0YXRpYyBpbmxpbmUKLSAgICB2b2lkIHJwY190eHN0YXR1czJ0eHN0YXR1cyh3bGNfcnBjX3R4c3RhdHVzX3QgKnJwY190eHN0YXR1cywKLQkJCSAgICAgICB0eF9zdGF0dXNfdCAqdHhzdGF0dXMpCi17Ci0JdHhzdGF0dXMtPmZyYW1lbGVuID0gcnBjX3R4c3RhdHVzLT5QQURfZnJhbWVsZW4gJiAweGZmZmY7Ci0JdHhzdGF0dXMtPnN0YXR1cyA9IChycGNfdHhzdGF0dXMtPnN0YXR1c19mcmFtZWlkID4+IDE2KSAmIDB4ZmZmZjsKLQl0eHN0YXR1cy0+ZnJhbWVpZCA9IHJwY190eHN0YXR1cy0+c3RhdHVzX2ZyYW1laWQgJiAweGZmZmY7Ci0JdHhzdGF0dXMtPnNlcXVlbmNlID0gKHJwY190eHN0YXR1cy0+c2VxdWVuY2VfbGFzdHR4dGltZSA+PiAxNikgJiAweGZmZmY7Ci0JdHhzdGF0dXMtPmxhc3R0eHRpbWUgPSBycGNfdHhzdGF0dXMtPnNlcXVlbmNlX2xhc3R0eHRpbWUgJiAweGZmZmY7Ci0JdHhzdGF0dXMtPmFja3BoeXJ4c2ggPSAocnBjX3R4c3RhdHVzLT5hY2twaHlyeHNoX3BoeWVyciA+PiAxNikgJiAweGZmZmY7Ci0JdHhzdGF0dXMtPnBoeWVyciA9IHJwY190eHN0YXR1cy0+YWNrcGh5cnhzaF9waHllcnIgJiAweGZmZmY7Ci19Ci0KLWV4dGVybiB2b2lkIHdsY19ibWFjX2RuZ2xfcmVib290KHJwY19pbmZvX3QgKnJwYyk7Ci0KLSNlbmRpZgkJCQkvKiBXTENfUlBDX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19ycGN0eC5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX3JwY3R4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MjcxNTQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX3JwY3R4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2lmbmRlZiBfd2xjX3JwY3R4X2hfCi0jZGVmaW5lIF93bGNfcnBjdHhfaF8KLQotLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLwotc3RydWN0IHdsY19pbmZvOwotCi0vKiBUaGlzIGNvbnRyb2xzIGhvdyBtYW55IHBhY2tldHMgYXJlIGdpdmVuIHRvIHRoZSBkb25nbGUuIFRoaXMgaXMgcmVxdWlyZWQgYXMKLSAqIE5UWEQgbmVlZHMgdG8gYmUgcG93ZXIgb2YgMiBidXQgd2UgbWF5IG5vdCBoYXZlIGVub3VnaCBtZW1vcnkgdG8gYWJzb3JiIHRoYXQKLSAqIGxhcmdlIG51bWJlciBvZiBmcmFtZXMKLSAqLwotI2lmbmRlZiBOUlBDVFhCVUZQT1NUCi0jZGVmaW5lIE5SUENUWEJVRlBPU1QgTlRYRAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFdMQ19ISUdIX09OTFkpCi0KLXN0cnVjdCB3bGNfcnBjX3BoeSB7Ci0Jc3RydWN0IHJwY19pbmZvICpycGM7Ci19OwotCi0jZGVmaW5lIFJQQ1RYX0VOQUIocHViKQkJKHRydWUpCi1leHRlcm4gcnBjdHhfaW5mb190ICp3bGNfcnBjdHhfYXR0YWNoKHdsY19wdWJfdCAqcHViLCBzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7Ci1leHRlcm4gaW50IHdsY19ycGN0eF9maWZvaW5pdChycGN0eF9pbmZvX3QgKnJwY3R4LCB1aW50IGZpZm8sIHVpbnQgbnR4ZCk7Ci1leHRlcm4gdm9pZCB3bGNfcnBjdHhfZGV0YWNoKHJwY3R4X2luZm9fdCAqcnBjdHgpOwotZXh0ZXJuIGludCB3bGNfcnBjdHhfZHVtcChycGN0eF9pbmZvX3QgKnJwY3R4LCBzdHJ1Y3QgYmNtc3RyYnVmICpiKTsKLWV4dGVybiB2b2lkICp3bGNfcnBjdHhfZ2V0bmV4dHR4cChycGN0eF9pbmZvX3QgKnJwY3R4LCB1aW50IGZpZm8pOwotZXh0ZXJuIHZvaWQgd2xjX3JwY3R4X3R4cmVjbGFpbShycGN0eF9pbmZvX3QgKnJwY3R4KTsKLWV4dGVybiB1aW50IHdsY19ycGN0eF90eGF2YWlsKHJwY3R4X2luZm9fdCAqcnBjdHgsIHVpbnQgZmlmbyk7Ci1leHRlcm4gaW50IHdsY19ycGN0eF9wa3RlbmcocnBjdHhfaW5mb190ICpycGN0eCwgdWludCBmaWZvLCB2b2lkICpwKTsKLWV4dGVybiBpbnQgd2xjX3JwY3R4X3R4KHJwY3R4X2luZm9fdCAqcnBjdHgsIHVpbnQgZmlmbywgdm9pZCAqcCwgYm9vbCBjb21taXQsCi0JCQl1MTYgZnJhbWVpZCwgdTggdHhwa3RwZW5kKTsKLWV4dGVybiB2b2lkIHdsY19ycGN0eF90eHBrdHBlbmRpbmMocnBjdHhfaW5mb190ICpycGN0eCwgdWludCBmaWZvLCB1OCB2YWwpOwotZXh0ZXJuIHZvaWQgd2xjX3JwY3R4X3R4cGt0cGVuZGRlYyhycGN0eF9pbmZvX3QgKnJwY3R4LCB1aW50IGZpZm8sIHU4IHZhbCk7Ci1leHRlcm4gdm9pZCB3bGNfcnBjdHhfdHhwa3RwZW5kY2xyKHJwY3R4X2luZm9fdCAqcnBjdHgsIHVpbnQgZmlmbyk7Ci1leHRlcm4gaW50IHdsY19ycGN0eF90eHBrdHBlbmQocnBjdHhfaW5mb190ICpycGN0eCwgdWludCBmaWZvLCBib29sIGFsbCk7Ci0KLSNlbHNlCi0jZGVmaW5lCVJQQ1RYX0VOQUIocHViKQkJCShmYWxzZSkKLSNkZWZpbmUJd2xjX3JwY3R4X2F0dGFjaChwdWIsIHdsYykJKE5VTEwpCi0jZGVmaW5lCXdsY19ycGN0eF9maWZvaW5pdChycGN0eCwgZmlmbywgbnR4ZCkgKDApCi0jZGVmaW5lCXdsY19ycGN0eF9kZXRhY2gocnBjdHgpCQlBU1NFUlQoMCkKLSNkZWZpbmUJd2xjX3JwY3R4X3R4YXZhaWwocnBjdHgsIGYpCShmYWxzZSkKLSNkZWZpbmUJd2xjX3JwY3R4X2R1bXAocnBjdHgsIGIpCQkoMCkKLSNkZWZpbmUJd2xjX3JwY3R4X2dldG5leHR0eHAocnBjdHgsIGYpCQkoTlVMTCkKLSNkZWZpbmUJd2xjX3JwY3R4X3R4cmVjbGFpbShycGN0eCkJCUFTU0VSVCgwKQotI2RlZmluZQl3bGNfcnBjdHhfcGt0ZW5nKHJwY3R4LCBmaWZvLCBwKQlkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lCXdsY19ycGN0eF90eChycGN0eCwgZiwgcCwgYywgZmlkLCB0KQkoMCkKLSNkZWZpbmUJd2xjX3JwY3R4X3R4cGt0cGVuZGluYyhycGN0eCwgZiwgdmFsKQlkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lCXdsY19ycGN0eF90eHBrdHBlbmRkZWMocnBjdHgsIGYsIHZhbCkJZG8geyB9IHdoaWxlICgwKQotI2RlZmluZQl3bGNfcnBjdHhfdHhwa3RwZW5kY2xyKHJwY3R4LCBmKQlkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lCXdsY19ycGN0eF90eHBrdHBlbmQocnBjdHgsIGYsIGFsbCkJKDApCi0KLSNlbmRpZgkJCQkvKiBXTENfSElHSCAqLwotCi0jZW5kaWYJCQkJLyogX3dsY19ycGN0eF9oXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX3NjYi5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX3NjYi5oCmluZGV4IGNlMjZjNzQuLmZlODRlOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19zY2IuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfc2NiLmgKQEAgLTE5LDcgKzE5LDcgQEAKIAogI2luY2x1ZGUgPHByb3RvLzgwMi4xZC5oPgogCi1leHRlcm4gYm9vbCB3bGNfYWdncmVnYXRhYmxlKHdsY19pbmZvX3QgKndsYywgdTggdGlkKTsKK2V4dGVybiBib29sIHdsY19hZ2dyZWdhdGFibGUoc3RydWN0IHdsY19pbmZvICp3bGMsIHU4IHRpZCk7CiAKICNkZWZpbmUgQU1QRFVfVFhfQkFfTUFYX1dTSVpFCTY0CS8qIG1heCBUeCBiYSB3aW5kb3cgc2l6ZSAoaW4gcGR1KSAqLwogLyogc3RydWN0dXJlIHRvIHN0b3JlIHBlci10aWQgc3RhdGUgZm9yIHRoZSBhbXBkdSBpbml0aWF0b3IgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19zdGYuYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19zdGYuYwppbmRleCA0NzI4YWQ5Li44OTc1YjA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfc3RmLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX3N0Zi5jCkBAIC0xNSw4ICsxNSw4IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHdsY19jZmcuaD4KLSNpbmNsdWRlIDxsaW51eHZlci5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KICNpbmNsdWRlIDxvc2wuaD4KICNpbmNsdWRlIDxiY211dGlscy5oPgpAQCAtMjUsMjkgKzI1LDMzIEBACiAjaW5jbHVkZSA8cHJvdG8vODAyLjExLmg+CiAjaW5jbHVkZSA8d2xpb2N0bC5oPgogI2luY2x1ZGUgPGJjbXdpZmkuaD4KKyNpbmNsdWRlIDxzYmhuZHBpby5oPgorI2luY2x1ZGUgPHNiaG5kZG1hLmg+CiAjaW5jbHVkZSA8ZDExLmg+CiAjaW5jbHVkZSA8d2xjX3JhdGUuaD4KICNpbmNsdWRlIDx3bGNfcHViLmg+CiAjaW5jbHVkZSA8d2xjX2tleS5oPgogI2luY2x1ZGUgPHdsY19jaGFubmVsLmg+CiAjaW5jbHVkZSA8d2xjX2Jzc2NmZy5oPgorI2luY2x1ZGUgPHdsY19ldmVudC5oPgogI2luY2x1ZGUgPHdsY19tYWM4MDIxMS5oPgogI2luY2x1ZGUgPHdsY19zY2IuaD4KICNpbmNsdWRlIDx3bF9leHBvcnQuaD4KICNpbmNsdWRlIDx3bGNfYm1hYy5oPgogI2luY2x1ZGUgPHdsY19zdGYuaD4KKyNpbmNsdWRlIDx3bF9kYmcuaD4KIAogI2RlZmluZSBXTENfU1RGX1NTX1NUQkNfUlgod2xjKSAoV0xDSVNOUEhZKHdsYy0+YmFuZCkgJiYgXAogCU5SRVZfR1Qod2xjLT5iYW5kLT5waHlyZXYsIDMpICYmIE5SRVZfTEUod2xjLT5iYW5kLT5waHlyZXYsIDYpKQogCi1zdGF0aWMgczggd2xjX3N0Zl9zdGJjX3J4X2dldCh3bGNfaW5mb190ICp3bGMpOwotc3RhdGljIGJvb2wgd2xjX3N0Zl9zdGJjX3R4X3NldCh3bGNfaW5mb190ICp3bGMsIHMzMiBpbnRfdmFsKTsKLXN0YXRpYyBpbnQgd2xjX3N0Zl90eGNvcmVfc2V0KHdsY19pbmZvX3QgKndsYywgdTggTnN0cywgdTggdmFsKTsKLXN0YXRpYyBpbnQgd2xjX3N0Zl9zcGF0aWFsX3BvbGljeV9zZXQod2xjX2luZm9fdCAqd2xjLCBpbnQgdmFsKTsKLXN0YXRpYyB2b2lkIHdsY19zdGZfc3RiY19yeF9odF91cGRhdGUod2xjX2luZm9fdCAqd2xjLCBpbnQgdmFsKTsKK3N0YXRpYyBzOCB3bGNfc3RmX3N0YmNfcnhfZ2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK3N0YXRpYyBib29sIHdsY19zdGZfc3RiY190eF9zZXQoc3RydWN0IHdsY19pbmZvICp3bGMsIHMzMiBpbnRfdmFsKTsKK3N0YXRpYyBpbnQgd2xjX3N0Zl90eGNvcmVfc2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1OCBOc3RzLCB1OCB2YWwpOworc3RhdGljIGludCB3bGNfc3RmX3NwYXRpYWxfcG9saWN5X3NldChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgaW50IHZhbCk7CitzdGF0aWMgdm9pZCB3bGNfc3RmX3N0YmNfcnhfaHRfdXBkYXRlKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBpbnQgdmFsKTsKIAotc3RhdGljIHZvaWQgX3dsY19zdGZfcGh5X3R4YW50X3VwZCh3bGNfaW5mb190ICp3bGMpOwotc3RhdGljIHUxNiBfd2xjX3N0Zl9waHl0eGNoYWluX3NlbCh3bGNfaW5mb190ICp3bGMsIHJhdGVzcGVjX3QgcnNwZWMpOworc3RhdGljIHZvaWQgX3dsY19zdGZfcGh5X3R4YW50X3VwZChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CitzdGF0aWMgdTE2IF93bGNfc3RmX3BoeXR4Y2hhaW5fc2VsKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCByYXRlc3BlY190IHJzcGVjKTsKIAogI2RlZmluZSBOU1RTXzEJMQogI2RlZmluZSBOU1RTXzIJMgpAQCAtNjEsNyArNjUsNyBAQAogCSgweDBmKQkJCS8qIEZvciBOc3RzID0gNCwgZW5hYmxlIGFsbCBjb3JlcyAqLwogfTsKIAotc3RhdGljIHZvaWQgd2xjX3N0Zl9zdGJjX3J4X2h0X3VwZGF0ZSh3bGNfaW5mb190ICp3bGMsIGludCB2YWwpCitzdGF0aWMgdm9pZCB3bGNfc3RmX3N0YmNfcnhfaHRfdXBkYXRlKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBpbnQgdmFsKQogewogCUFTU0VSVCgodmFsID09IEhUX0NBUF9SWF9TVEJDX05PKQogCSAgICAgICB8fCAodmFsID09IEhUX0NBUF9SWF9TVEJDX09ORV9TVFJFQU0pKTsKQEAgLTgyLDcgKzg2LDcgQEAKIH0KIAogLyogZXZlcnkgV0xDX1RFTVBTRU5TRV9QRVJJT0Qgc2Vjb25kcyB0ZW1wZXJhdHVyZSBjaGVjayB0byBkZWNpZGUgd2hldGhlciB0byB0dXJuIG9uL29mZiB0eGNoYWluICovCi12b2lkIHdsY190ZW1wc2Vuc2VfdXBkKHdsY19pbmZvX3QgKndsYykKK3ZvaWQgd2xjX3RlbXBzZW5zZV91cGQoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJd2xjX3BoeV90ICpwaSA9IHdsYy0+YmFuZC0+cGk7CiAJdWludCBhY3RpdmVfY2hhaW5zLCB0eGNoYWluOwpAQCAtMTA2LDcgKzExMCw3IEBACiB9CiAKIHZvaWQKLXdsY19zdGZfc3NfYWxnb19jaGFubmVsX2dldCh3bGNfaW5mb190ICp3bGMsIHUxNiAqc3NfYWxnb19jaGFubmVsLAord2xjX3N0Zl9zc19hbGdvX2NoYW5uZWxfZ2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1MTYgKnNzX2FsZ29fY2hhbm5lbCwKIAkJCSAgICBjaGFuc3BlY190IGNoYW5zcGVjKQogewogCXR4X3Bvd2VyX3QgcG93ZXI7CkBAIC0xNDcsMTIgKzE1MSwxMiBAQAogCQlzZXRiaXQoc3NfYWxnb19jaGFubmVsLCBQSFlfVFhDMV9NT0RFX1NUQkMpOwogfQogCi1zdGF0aWMgczggd2xjX3N0Zl9zdGJjX3J4X2dldCh3bGNfaW5mb190ICp3bGMpCitzdGF0aWMgczggd2xjX3N0Zl9zdGJjX3J4X2dldChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAlyZXR1cm4gKHdsYy0+aHRfY2FwLmNhcCAmIEhUX0NBUF9SWF9TVEJDX01BU0spID4+IEhUX0NBUF9SWF9TVEJDX1NISUZUOwogfQogCi1zdGF0aWMgYm9vbCB3bGNfc3RmX3N0YmNfdHhfc2V0KHdsY19pbmZvX3QgKndsYywgczMyIGludF92YWwpCitzdGF0aWMgYm9vbCB3bGNfc3RmX3N0YmNfdHhfc2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBzMzIgaW50X3ZhbCkKIHsKIAlpZiAoKGludF92YWwgIT0gQVVUTykgJiYgKGludF92YWwgIT0gT0ZGKSAmJiAoaW50X3ZhbCAhPSBPTikpIHsKIAkJcmV0dXJuIGZhbHNlOwpAQCAtMTczLDcgKzE3Nyw3IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgd2xjX3N0Zl9zdGJjX3J4X3NldCh3bGNfaW5mb190ICp3bGMsIHMzMiBpbnRfdmFsKQorYm9vbCB3bGNfc3RmX3N0YmNfcnhfc2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBzMzIgaW50X3ZhbCkKIHsKIAlpZiAoKGludF92YWwgIT0gSFRfQ0FQX1JYX1NUQkNfTk8pCiAJICAgICYmIChpbnRfdmFsICE9IEhUX0NBUF9SWF9TVEJDX09ORV9TVFJFQU0pKSB7CkBAIC0xOTAsMTAgKzE5NCwxMCBAQAogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgaW50IHdsY19zdGZfdHhjb3JlX3NldCh3bGNfaW5mb190ICp3bGMsIHU4IE5zdHMsIHU4IGNvcmVfbWFzaykKK3N0YXRpYyBpbnQgd2xjX3N0Zl90eGNvcmVfc2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1OCBOc3RzLCB1OCBjb3JlX21hc2spCiB7Ci0JV0xfVFJBQ0UoKCJ3bCVkOiAlczogTnN0cyAlZCBjb3JlX21hc2sgJXhcbiIsCi0JCSAgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fLCBOc3RzLCBjb3JlX21hc2spKTsKKwlXTF9UUkFDRSgid2wlZDogJXM6IE5zdHMgJWQgY29yZV9tYXNrICV4XG4iLAorCQkgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fLCBOc3RzLCBjb3JlX21hc2spOwogCiAJQVNTRVJUKChOc3RzID4gMCkgJiYgKE5zdHMgPD0gTUFYX1NUUkVBTVNfU1VQUE9SVEVEKSk7CiAKQEAgLTIyNywxMiArMjMxLDEyIEBACiAJcmV0dXJuIEJDTUVfT0s7CiB9CiAKLXN0YXRpYyBpbnQgd2xjX3N0Zl9zcGF0aWFsX3BvbGljeV9zZXQod2xjX2luZm9fdCAqd2xjLCBpbnQgdmFsKQorc3RhdGljIGludCB3bGNfc3RmX3NwYXRpYWxfcG9saWN5X3NldChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgaW50IHZhbCkKIHsKIAlpbnQgaTsKIAl1OCBjb3JlX21hc2sgPSAwOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiAlczogdmFsICV4XG4iLCB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18sIHZhbCkpOworCVdMX1RSQUNFKCJ3bCVkOiAlczogdmFsICV4XG4iLCB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18sIHZhbCk7CiAKIAl3bGMtPnN0Zi0+c3BhdGlhbF9wb2xpY3kgPSAoczgpIHZhbDsKIAlmb3IgKGkgPSAxOyBpIDw9IE1BWF9TVFJFQU1TX1NVUFBPUlRFRDsgaSsrKSB7CkBAIC0yNDMsNyArMjQ3LDcgQEAKIAlyZXR1cm4gQkNNRV9PSzsKIH0KIAotaW50IHdsY19zdGZfdHhjaGFpbl9zZXQod2xjX2luZm9fdCAqd2xjLCBzMzIgaW50X3ZhbCwgYm9vbCBmb3JjZSkKK2ludCB3bGNfc3RmX3R4Y2hhaW5fc2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBzMzIgaW50X3ZhbCwgYm9vbCBmb3JjZSkKIHsKIAl1OCB0eGNoYWluID0gKHU4KSBpbnRfdmFsOwogCXU4IHR4c3RyZWFtczsKQEAgLTI3NCwxMyArMjc4LDE1IEBACiAJCQkJaWYgKFJTUEVDX1NURih3bGMtPmJhbmRzdGF0ZVtpXS0+cnNwZWNfb3ZlcnJpZGUpCiAJCQkJICAgICE9IFBIWV9UWEMxX01PREVfU0lTTykgewogCQkJCQl3bGMtPmJhbmRzdGF0ZVtpXS0+cnNwZWNfb3ZlcnJpZGUgPSAwOwotCQkJCQlXTF9FUlJPUigoIiVzKCk6IHRlbXAgc2Vuc2Ugb3ZlcnJpZGUgbm9uLVNJU08iICIgcnNwZWNfb3ZlcnJpZGUuXG4iLCBfX2Z1bmNfXykpOworCQkJCQlXTF9FUlJPUigiJXMoKTogdGVtcCBzZW5zZSBvdmVycmlkZSBub24tU0lTTyByc3BlY19vdmVycmlkZVxuIiwKKwkJCQkJCSBfX2Z1bmNfXyk7CiAJCQkJfQogCQkJCWlmIChSU1BFQ19TVEYKIAkJCQkgICAgKHdsYy0+YmFuZHN0YXRlW2ldLT5tcnNwZWNfb3ZlcnJpZGUpICE9CiAJCQkJICAgIFBIWV9UWEMxX01PREVfU0lTTykgewogCQkJCQl3bGMtPmJhbmRzdGF0ZVtpXS0+bXJzcGVjX292ZXJyaWRlID0gMDsKLQkJCQkJV0xfRVJST1IoKCIlcygpOiB0ZW1wIHNlbnNlIG92ZXJyaWRlIG5vbi1TSVNPIiAiIG1yc3BlY19vdmVycmlkZS5cbiIsIF9fZnVuY19fKSk7CisJCQkJCVdMX0VSUk9SKCIlcygpOiB0ZW1wIHNlbnNlIG92ZXJyaWRlIG5vbi1TSVNPIG1yc3BlY19vdmVycmlkZVxuIiwKKwkJCQkJCSBfX2Z1bmNfXyk7CiAJCQkJfQogCQkJfQogCX0KQEAgLTMwMyw3ICszMDksNyBAQAogCXJldHVybiBCQ01FX09LOwogfQogCi1pbnQgd2xjX3N0Zl9yeGNoYWluX3NldCh3bGNfaW5mb190ICp3bGMsIHMzMiBpbnRfdmFsKQoraW50IHdsY19zdGZfcnhjaGFpbl9zZXQoc3RydWN0IHdsY19pbmZvICp3bGMsIHMzMiBpbnRfdmFsKQogewogCXU4IHJ4Y2hhaW5fY250OwogCXU4IHJ4Y2hhaW4gPSAodTgpIGludF92YWw7CkBAIC0zNjcsNyArMzczLDcgQEAKIH0KIAogLyogdXBkYXRlIHdsYy0+c3RmLT5zc19vcG1vZGUgd2hpY2ggcmVwcmVzZW50cyB0aGUgb3BlcmF0aW9uYWwgc3RmX3NzIG1vZGUgd2UncmUgdXNpbmcgKi8KLWludCB3bGNfc3RmX3NzX3VwZGF0ZSh3bGNfaW5mb190ICp3bGMsIHdsY2JhbmRfdCAqYmFuZCkKK2ludCB3bGNfc3RmX3NzX3VwZGF0ZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgc3RydWN0IHdsY2JhbmQgKmJhbmQpCiB7CiAJaW50IHJldF9jb2RlID0gMDsKIAl1OCBwcmV2X3N0Zl9zczsKQEAgLTQwMiw3ICs0MDgsNyBAQAogCXJldHVybiByZXRfY29kZTsKIH0KIAotaW50IHdsY19zdGZfYXR0YWNoKHdsY19pbmZvX3QgKndsYykKK2ludCB3bGNfc3RmX2F0dGFjaChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAl3bGMtPmJhbmRzdGF0ZVtCQU5EXzJHX0lOREVYXS0+YmFuZF9zdGZfc3NfbW9kZSA9IFBIWV9UWEMxX01PREVfU0lTTzsKIAl3bGMtPmJhbmRzdGF0ZVtCQU5EXzVHX0lOREVYXS0+YmFuZF9zdGZfc3NfbW9kZSA9IFBIWV9UWEMxX01PREVfQ0REOwpAQCAtNDI1LDExICs0MzEsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCB3bGNfc3RmX2RldGFjaCh3bGNfaW5mb190ICp3bGMpCit2b2lkIHdsY19zdGZfZGV0YWNoKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogfQogCi1pbnQgd2xjX3N0Zl9hbnRfdHhhbnRfdmFsaWRhdGUod2xjX2luZm9fdCAqd2xjLCBzOCB2YWwpCitpbnQgd2xjX3N0Zl9hbnRfdHhhbnRfdmFsaWRhdGUoc3RydWN0IHdsY19pbmZvICp3bGMsIHM4IHZhbCkKIHsKIAlpbnQgYmNtZXJyb3IgPSBCQ01FX09LOwogCkBAIC00NzYsNyArNDgyLDcgQEAKICAqICAgIGRvIHR4LWFudGVubmEgc2VsZWN0aW9uIGZvciBTSVNPIHRyYW5zbWlzc2lvbnMKICAqIGZvciBOUkVWPj03LCBiaXQgNiBhbmQgYml0IDcgbWVhbiBhbnRlbm5hIDAgYW5kIDEgcmVzcGVjdGl2ZWx5LCBuaXQ2K2JpdDcgbWVhbnMgYm90aCBjb3JlcyBhY3RpdmUKICovCi1zdGF0aWMgdm9pZCBfd2xjX3N0Zl9waHlfdHhhbnRfdXBkKHdsY19pbmZvX3QgKndsYykKK3N0YXRpYyB2b2lkIF93bGNfc3RmX3BoeV90eGFudF91cGQoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJczggdHhhbnQ7CiAKQEAgLTUxNywxMiArNTIzLDEyIEBACiAJd2xjX2JtYWNfdHhhbnRfc2V0KHdsYy0+aHcsIHdsYy0+c3RmLT5waHl0eGFudCk7CiB9CiAKLXZvaWQgd2xjX3N0Zl9waHlfdHhhbnRfdXBkKHdsY19pbmZvX3QgKndsYykKK3ZvaWQgd2xjX3N0Zl9waHlfdHhhbnRfdXBkKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCV93bGNfc3RmX3BoeV90eGFudF91cGQod2xjKTsKIH0KIAotdm9pZCB3bGNfc3RmX3BoeV9jaGFpbl9jYWxjKHdsY19pbmZvX3QgKndsYykKK3ZvaWQgd2xjX3N0Zl9waHlfY2hhaW5fY2FsYyhzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAkvKiBnZXQgYXZhaWxhYmxlIHJ4L3R4IGNoYWlucyAqLwogCXdsYy0+c3RmLT5od190eGNoYWluID0gKHU4KSBnZXRpbnR2YXIod2xjLT5wdWItPnZhcnMsICJ0eGNoYWluIik7CkBAIC01NTksNyArNTY1LDcgQEAKIAl3bGNfc3RmX3NwYXRpYWxfcG9saWN5X3NldCh3bGMsIE1JTl9TUEFUSUFMX0VYUEFOU0lPTik7CiB9CiAKLXN0YXRpYyB1MTYgX3dsY19zdGZfcGh5dHhjaGFpbl9zZWwod2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJzcGVjKQorc3RhdGljIHUxNiBfd2xjX3N0Zl9waHl0eGNoYWluX3NlbChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByc3BlYykKIHsKIAl1MTYgcGh5dHhhbnQgPSB3bGMtPnN0Zi0+cGh5dHhhbnQ7CiAKQEAgLTU3MiwxMiArNTc4LDEyIEBACiAJcmV0dXJuIHBoeXR4YW50OwogfQogCi11MTYgd2xjX3N0Zl9waHl0eGNoYWluX3NlbCh3bGNfaW5mb190ICp3bGMsIHJhdGVzcGVjX3QgcnNwZWMpCit1MTYgd2xjX3N0Zl9waHl0eGNoYWluX3NlbChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByc3BlYykKIHsKIAlyZXR1cm4gX3dsY19zdGZfcGh5dHhjaGFpbl9zZWwod2xjLCByc3BlYyk7CiB9CiAKLXUxNiB3bGNfc3RmX2QxMWhkcnNfcGh5Y3RsX3R4YW50KHdsY19pbmZvX3QgKndsYywgcmF0ZXNwZWNfdCByc3BlYykKK3UxNiB3bGNfc3RmX2QxMWhkcnNfcGh5Y3RsX3R4YW50KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCByYXRlc3BlY190IHJzcGVjKQogewogCXUxNiBwaHl0eGFudCA9IHdsYy0+c3RmLT5waHl0eGFudDsKIAl1MTYgbWFzayA9IFBIWV9UWENfQU5UX01BU0s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfc3RmLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfc3RmLmgKaW5kZXggZWU5YjAyYS4uOGRlNjM4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX3N0Zi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19zdGYuaApAQCAtMjAsMjMgKzIwLDI0IEBACiAjZGVmaW5lIE1JTl9TUEFUSUFMX0VYUEFOU0lPTgkwCiAjZGVmaW5lIE1BWF9TUEFUSUFMX0VYUEFOU0lPTgkxCiAKLWV4dGVybiBpbnQgd2xjX3N0Zl9hdHRhY2god2xjX2luZm9fdCAqd2xjKTsKLWV4dGVybiB2b2lkIHdsY19zdGZfZGV0YWNoKHdsY19pbmZvX3QgKndsYyk7CitleHRlcm4gaW50IHdsY19zdGZfYXR0YWNoKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK2V4dGVybiB2b2lkIHdsY19zdGZfZGV0YWNoKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKIAotZXh0ZXJuIHZvaWQgd2xjX3RlbXBzZW5zZV91cGQod2xjX2luZm9fdCAqd2xjKTsKLWV4dGVybiB2b2lkIHdsY19zdGZfc3NfYWxnb19jaGFubmVsX2dldCh3bGNfaW5mb190ICp3bGMsCitleHRlcm4gdm9pZCB3bGNfdGVtcHNlbnNlX3VwZChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CitleHRlcm4gdm9pZCB3bGNfc3RmX3NzX2FsZ29fY2hhbm5lbF9nZXQoc3RydWN0IHdsY19pbmZvICp3bGMsCiAJCQkJCXUxNiAqc3NfYWxnb19jaGFubmVsLAogCQkJCQljaGFuc3BlY190IGNoYW5zcGVjKTsKLWV4dGVybiBpbnQgd2xjX3N0Zl9zc191cGRhdGUod2xjX2luZm9fdCAqd2xjLCBzdHJ1Y3Qgd2xjYmFuZCAqYmFuZCk7Ci1leHRlcm4gdm9pZCB3bGNfc3RmX3BoeV90eGFudF91cGQod2xjX2luZm9fdCAqd2xjKTsKLWV4dGVybiBpbnQgd2xjX3N0Zl90eGNoYWluX3NldCh3bGNfaW5mb190ICp3bGMsIHMzMiBpbnRfdmFsLCBib29sIGZvcmNlKTsKLWV4dGVybiBpbnQgd2xjX3N0Zl9yeGNoYWluX3NldCh3bGNfaW5mb190ICp3bGMsIHMzMiBpbnRfdmFsKTsKLWV4dGVybiBib29sIHdsY19zdGZfc3RiY19yeF9zZXQod2xjX2luZm9fdCAqd2xjLCBzMzIgaW50X3ZhbCk7CitleHRlcm4gaW50IHdsY19zdGZfc3NfdXBkYXRlKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBzdHJ1Y3Qgd2xjYmFuZCAqYmFuZCk7CitleHRlcm4gdm9pZCB3bGNfc3RmX3BoeV90eGFudF91cGQoc3RydWN0IHdsY19pbmZvICp3bGMpOworZXh0ZXJuIGludCB3bGNfc3RmX3R4Y2hhaW5fc2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBzMzIgaW50X3ZhbCwgYm9vbCBmb3JjZSk7CitleHRlcm4gaW50IHdsY19zdGZfcnhjaGFpbl9zZXQoc3RydWN0IHdsY19pbmZvICp3bGMsIHMzMiBpbnRfdmFsKTsKK2V4dGVybiBib29sIHdsY19zdGZfc3RiY19yeF9zZXQoc3RydWN0IHdsY19pbmZvICp3bGMsIHMzMiBpbnRfdmFsKTsKIAotZXh0ZXJuIGludCB3bGNfc3RmX2FudF90eGFudF92YWxpZGF0ZSh3bGNfaW5mb190ICp3bGMsIHM4IHZhbCk7Ci1leHRlcm4gdm9pZCB3bGNfc3RmX3BoeV90eGFudF91cGQod2xjX2luZm9fdCAqd2xjKTsKLWV4dGVybiB2b2lkIHdsY19zdGZfcGh5X2NoYWluX2NhbGMod2xjX2luZm9fdCAqd2xjKTsKLWV4dGVybiB1MTYgd2xjX3N0Zl9waHl0eGNoYWluX3NlbCh3bGNfaW5mb190ICp3bGMsIHJhdGVzcGVjX3QgcnNwZWMpOwotZXh0ZXJuIHUxNiB3bGNfc3RmX2QxMWhkcnNfcGh5Y3RsX3R4YW50KHdsY19pbmZvX3QgKndsYywgcmF0ZXNwZWNfdCByc3BlYyk7Ci1leHRlcm4gdTE2IHdsY19zdGZfc3BhdGlhbF9leHBhbnNpb25fZ2V0KHdsY19pbmZvX3QgKndsYywgcmF0ZXNwZWNfdCByc3BlYyk7CitleHRlcm4gaW50IHdsY19zdGZfYW50X3R4YW50X3ZhbGlkYXRlKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBzOCB2YWwpOworZXh0ZXJuIHZvaWQgd2xjX3N0Zl9waHlfdHhhbnRfdXBkKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK2V4dGVybiB2b2lkIHdsY19zdGZfcGh5X2NoYWluX2NhbGMoc3RydWN0IHdsY19pbmZvICp3bGMpOworZXh0ZXJuIHUxNiB3bGNfc3RmX3BoeXR4Y2hhaW5fc2VsKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCByYXRlc3BlY190IHJzcGVjKTsKK2V4dGVybiB1MTYgd2xjX3N0Zl9kMTFoZHJzX3BoeWN0bF90eGFudChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByc3BlYyk7CitleHRlcm4gdTE2IHdsY19zdGZfc3BhdGlhbF9leHBhbnNpb25fZ2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLAorCQkJCQkgcmF0ZXNwZWNfdCByc3BlYyk7CiAjZW5kaWYJCQkJLyogX3dsY19zdGZfaF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY190eXBlcy5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX3R5cGVzLmgKaW5kZXggMzMwNDdlYi4uZGY2ZTA0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX3R5cGVzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX3R5cGVzLmgKQEAgLTE5LDM0ICsxOSwxOSBAQAogCiAvKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwogCi10eXBlZGVmIHN0cnVjdCB3bGNfaW5mbyB3bGNfaW5mb190OwotdHlwZWRlZiBzdHJ1Y3Qgd2xjX2h3X2luZm8gd2xjX2h3X2luZm9fdDsKLXR5cGVkZWYgc3RydWN0IHdsY19pZiB3bGNfaWZfdDsKLXR5cGVkZWYgc3RydWN0IHdsX2lmIHdsX2lmX3Q7Ci10eXBlZGVmIHN0cnVjdCBsZWRfaW5mbyBsZWRfaW5mb190OwotdHlwZWRlZiBzdHJ1Y3QgYm1hY19sZWQgYm1hY19sZWRfdDsKLXR5cGVkZWYgc3RydWN0IGJtYWNfbGVkX2luZm8gYm1hY19sZWRfaW5mb190OwotdHlwZWRlZiBzdHJ1Y3Qgc2NiX21vZHVsZSBzY2JfbW9kdWxlX3Q7Ci10eXBlZGVmIHN0cnVjdCBiYV9pbmZvIGJhX2luZm9fdDsKLXR5cGVkZWYgc3RydWN0IGFtcGR1X2luZm8gYW1wZHVfaW5mb190OwotdHlwZWRlZiBzdHJ1Y3QgcmF0ZXNlbF9pbmZvIHJhdGVzZWxfaW5mb190OwotdHlwZWRlZiBzdHJ1Y3Qgd2xjX2FwX2luZm8gd2xjX2FwX2luZm9fdDsKLXR5cGVkZWYgc3RydWN0IHdsY19hdXRoX2luZm8gd2xjX2F1dGhfaW5mb190OwotdHlwZWRlZiBzdHJ1Y3Qgc3VwcGxpY2FudCBzdXBwbGljYW50X3Q7Ci10eXBlZGVmIHN0cnVjdCBhdXRoZW50aWNhdG9yIGF1dGhlbnRpY2F0b3JfdDsKLXR5cGVkZWYgc3RydWN0IGFudHNlbF9pbmZvIGFudHNlbF9pbmZvX3Q7Ci0jaWYgIWRlZmluZWQoV0xDX0xPVykKLXR5cGVkZWYgc3RydWN0IHJwY3R4X2luZm8gcnBjdHhfaW5mb190OwotI2VuZGlmCi0jaWZkZWYgV0xDX0xPVwotdHlwZWRlZiBzdHJ1Y3QgYm1hY19wbXEgYm1hY19wbXFfdDsKLSNlbmRpZgorc3RydWN0IHdsY19pbmZvOworc3RydWN0IHdsY19od19pbmZvOworc3RydWN0IHdsY19pZjsKK3N0cnVjdCB3bF9pZjsKK3N0cnVjdCBhbXBkdV9pbmZvOworc3RydWN0IGFudHNlbF9pbmZvOworc3RydWN0IGJtYWNfcG1xOwogCiBzdHJ1Y3QgZDExaW5pdDsKIAogI2lmbmRlZiBfaG5kZG1hX3B1Yl8KICNkZWZpbmUgX2huZGRtYV9wdWJfCi10eXBlZGVmIGNvbnN0IHN0cnVjdCBobmRkbWFfcHViIGhuZGRtYV90Oworc3RydWN0IGhuZGRtYV9wdWI7CiAjZW5kaWYJCQkJLyogX2huZGRtYV9wdWJfICovCiAKICNlbmRpZgkJCQkvKiBfd2xjX3R5cGVzX2hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvYWl1dGlscy5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL2FpdXRpbHMuYwppbmRleCA3NWE3ZTNhLi5kZGQyZjlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvYWl1dGlscy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9haXV0aWxzLmMKQEAgLTE0LDExICsxNCwxNiBAQAogICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxiY21kZWZzLmg+CisjaWZkZWYgQlJDTV9GVUxMTUFDCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjZW5kaWYKICNpbmNsdWRlIDxvc2wuaD4KLSNpbmNsdWRlIDxsaW51eHZlci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGJjbXV0aWxzLmg+CiAjaW5jbHVkZSA8c2l1dGlscy5oPgogI2luY2x1ZGUgPGhuZHNvYy5oPgpAQCAtMjYsOCArMzEsOCBAQAogI2luY2x1ZGUgPHBjaWNmZy5oPgogI2luY2x1ZGUgPGJjbWRldnMuaD4KIAotI2RlZmluZSBCQ000NzE2Ml9ETVAoKSAoKENISVBJRChzaWgtPmNoaXApID09IEJDTTQ3MTYyX0NISVBfSUQpICYmIFwKLQkJKENISVBSRVYoc2loLT5jaGlwcmV2KSA9PSAwKSAmJiBcCisjZGVmaW5lIEJDTTQ3MTYyX0RNUCgpICgoc2loLT5jaGlwID09IEJDTTQ3MTYyX0NISVBfSUQpICYmIFwKKwkJKHNpaC0+Y2hpcHJldiA9PSAwKSAmJiBcCiAJCShzaWktPmNvcmVpZFtzaWktPmN1cmlkeF0gPT0gTUlQUzc0S19DT1JFX0lEKSkKIAogLyogRVJPTSBwYXJzaW5nICovCkBAIC0xMTUsNyArMTIwLDcgQEAKIAogCWVyb21iYXNlID0gUl9SRUcoc2lpLT5vc2gsICZjYy0+ZXJvbXB0cik7CiAKLQlzd2l0Y2ggKEJVU1RZUEUoc2loLT5idXN0eXBlKSkgeworCXN3aXRjaCAoc2loLT5idXN0eXBlKSB7CiAJY2FzZSBTSV9CVVM6CiAJCWVyb21wdHIgPSAodTMyICopIFJFR19NQVAoZXJvbWJhc2UsIFNJX0NPUkVfU0laRSk7CiAJCWJyZWFrOwpAQCAtMTI1LDcgKzEzMCw3IEBACiAJCXNpaS0+Y3Vyd3JhcCA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKXJlZ3MgKyBTSV9DT1JFX1NJWkUpOwogCiAJCS8qIE5vdyBwb2ludCB0aGUgd2luZG93IGF0IHRoZSBlcm9tICovCi0JCU9TTF9QQ0lfV1JJVEVfQ09ORklHKHNpaS0+b3NoLCBQQ0lfQkFSMF9XSU4sIDQsIGVyb21iYXNlKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzaWktPm9zaC0+cGRldiwgUENJX0JBUjBfV0lOLCBlcm9tYmFzZSk7CiAJCWVyb21wdHIgPSByZWdzOwogCQlicmVhazsKIApAQCAtMzMwLDcgKzMzNSw3IEBACiAJQVNTRVJUKChzaWktPmludHJzZW5hYmxlZF9mbiA9PSBOVUxMKQogCSAgICAgICB8fCAhKCooc2lpKS0+aW50cnNlbmFibGVkX2ZuKSAoKHNpaSktPmludHJfYXJnKSk7CiAKLQlzd2l0Y2ggKEJVU1RZUEUoc2loLT5idXN0eXBlKSkgeworCXN3aXRjaCAoc2loLT5idXN0eXBlKSB7CiAJY2FzZSBTSV9CVVM6CiAJCS8qIG1hcCBuZXcgb25lICovCiAJCWlmICghc2lpLT5yZWdzW2NvcmVpZHhdKSB7CkBAIC0zNDcsMTAgKzM1MiwxMCBAQAogCiAJY2FzZSBQQ0lfQlVTOgogCQkvKiBwb2ludCBiYXIwIHdpbmRvdyAqLwotCQlPU0xfUENJX1dSSVRFX0NPTkZJRyhzaWktPm9zaCwgUENJX0JBUjBfV0lOLCA0LCBhZGRyKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzaWktPm9zaC0+cGRldiwgUENJX0JBUjBfV0lOLCBhZGRyKTsKIAkJcmVncyA9IHNpaS0+Y3VybWFwOwogCQkvKiBwb2ludCBiYXIwIDJuZCA0S0Igd2luZG93ICovCi0JCU9TTF9QQ0lfV1JJVEVfQ09ORklHKHNpaS0+b3NoLCBQQ0lfQkFSMF9XSU4yLCA0LCB3cmFwKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzaWktPm9zaC0+cGRldiwgUENJX0JBUjBfV0lOMiwgd3JhcCk7CiAJCWJyZWFrOwogCiAjaWZkZWYgQkNNU0RJTwpAQCAtNTA0LDcgKzUwOSw3IEBACiAJaWYgKGNvcmVpZHggPj0gU0lfTUFYQ09SRVMpCiAJCXJldHVybiAwOwogCi0JaWYgKEJVU1RZUEUoc2loLT5idXN0eXBlKSA9PSBTSV9CVVMpIHsKKwlpZiAoc2loLT5idXN0eXBlID09IFNJX0JVUykgewogCQkvKiBJZiBpbnRlcm5hbCBidXMsIHdlIGNhbiBhbHdheXMgZ2V0IGF0IGV2ZXJ5dGhpbmcgKi8KIAkJZmFzdCA9IHRydWU7CiAJCS8qIG1hcCBpZiBkb2VzIG5vdCBleGlzdCAqLwpAQCAtNTE0LDcgKzUxOSw3IEBACiAJCQlBU1NFUlQoR09PRFJFR1Moc2lpLT5yZWdzW2NvcmVpZHhdKSk7CiAJCX0KIAkJciA9ICh1MzIgKikgKCh1bnNpZ25lZCBjaGFyICopIHNpaS0+cmVnc1tjb3JlaWR4XSArIHJlZ29mZik7Ci0JfSBlbHNlIGlmIChCVVNUWVBFKHNpaC0+YnVzdHlwZSkgPT0gUENJX0JVUykgeworCX0gZWxzZSBpZiAoc2loLT5idXN0eXBlID09IFBDSV9CVVMpIHsKIAkJLyogSWYgcGNpL3BjaWUsIHdlIGNhbiBnZXQgYXQgcGNpL3BjaWUgcmVncyBhbmQgb24gbmV3ZXIgY29yZXMgdG8gY2hpcGMgKi8KIAogCQlpZiAoKHNpaS0+Y29yZWlkW2NvcmVpZHhdID09IENDX0NPUkVfSUQpICYmIFNJX0ZBU1Qoc2lpKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL2JjbW90cC5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL2JjbW90cC5jCmluZGV4IGM5MDk4MzIuLmQ4MjBlN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9iY21vdHAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvYmNtb3RwLmMKQEAgLTE0LDExICsxNCwxMyBAQAogICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxiY21kZWZzLmg+CiAjaW5jbHVkZSA8b3NsLmg+Ci0jaW5jbHVkZSA8bGludXh2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxiY21kZXZzLmg+CiAjaW5jbHVkZSA8YmNtdXRpbHMuaD4KICNpbmNsdWRlIDxzaXV0aWxzLmg+CkBAIC03Nyw3ICs3OSw3IEBACiAJdWludCBjY3JldjsJCS8qIGNoaXBjIHJldmlzaW9uICovCiAJb3RwX2ZuX3QgKmZuOwkJLyogT1RQIGZ1bmN0aW9ucyAqLwogCXNpX3QgKnNpaDsJCS8qIFNhdmVkIHNiIGhhbmRsZSAqLwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAKICNpZmRlZiBCQ01JUFhPVFAKIAkvKiBJUFggT1RQIHNlY3Rpb24gKi8KQEAgLTIyMSw3ICsyMjMsNyBAQAogewogCWludCByZXQgPSAwOwogCi0Jc3dpdGNoIChDSElQSUQoc2loLT5jaGlwKSkgeworCXN3aXRjaCAoc2loLT5jaGlwKSB7CiAJY2FzZSBCQ000MzIyNF9DSElQX0lEOgogCWNhc2UgQkNNNDMyMjVfQ0hJUF9JRDoKIAkJcmV0ID0gb3NpemV3ICogMiAtIE9UUF9TWl9GVV83MiAtIE9UUF9TWl9DSEVDS1NVTTsKQEAgLTI3MSw4ICsyNzMsOCBAQAogCS8qIFJlYWQgT1RQIGxvY2sgYml0cyBhbmQgc3VicmVnaW9uIHByb2dyYW1tZWQgaW5kaWNhdGlvbiBiaXRzICovCiAJb2ktPnN0YXR1cyA9IFJfUkVHKG9pLT5vc2gsICZjYy0+b3Rwc3RhdHVzKTsKIAotCWlmICgoQ0hJUElEKG9pLT5zaWgtPmNoaXApID09IEJDTTQzMjI0X0NISVBfSUQpCi0JICAgIHx8IChDSElQSUQob2ktPnNpaC0+Y2hpcCkgPT0gQkNNNDMyMjVfQ0hJUF9JRCkpIHsKKwlpZiAoKG9pLT5zaWgtPmNoaXAgPT0gQkNNNDMyMjRfQ0hJUF9JRCkKKwkgICAgfHwgKG9pLT5zaWgtPmNoaXAgPT0gQkNNNDMyMjVfQ0hJUF9JRCkpIHsKIAkJdTMyIHBfYml0czsKIAkJcF9iaXRzID0KIAkJICAgIChpcHhvdHBfb3RwcihvaSwgY2MsIG9pLT5vdHBndV9iYXNlICsgT1RQR1VfUF9PRkYpICYKQEAgLTU2OSw3ICs1NzEsNyBAQAogc3RhdGljIHUxNiBobmRvdHBfb3Rwcih2b2lkICpvaCwgY2hpcGNyZWdzX3QgKmNjLCB1aW50IHduKQogewogCW90cGluZm9fdCAqb2kgPSAob3RwaW5mb190ICopIG9oOwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAJdm9sYXRpbGUgdTE2ICpwdHI7CiAKIAlBU1NFUlQod24gPCAoKG9pLT5zaXplIC8gMikgKyBPVFBfUkNfTElNX09GRikpOwpAQCAtNTg0LDcgKzU4Niw3IEBACiBzdGF0aWMgdTE2IGhuZG90cF9vdHByb2ZmKHZvaWQgKm9oLCBjaGlwY3JlZ3NfdCAqY2MsIGludCB3b2ZmKQogewogCW90cGluZm9fdCAqb2kgPSAob3RwaW5mb190ICopIG9oOwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAJdm9sYXRpbGUgdTE2ICpwdHI7CiAKIAlBU1NFUlQod29mZiA+PSAoLSgoaW50KW9pLT5zaXplIC8gMikpKTsKQEAgLTYwMyw3ICs2MDUsNyBAQAogCW90cGluZm9fdCAqb2kgPSAob3RwaW5mb190ICopIG9oOwogCXVpbnQgaywgcm93LCBjb2w7CiAJdTMyIG90cHAsIHN0OwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAKIAlvc2ggPSBzaV9vc2gob2ktPnNpaCk7CiAJcm93ID0gaWR4IC8gNjU7CkBAIC02MzYsNyArNjM4LDcgQEAKIAlvdHBpbmZvX3QgKm9pOwogCXUzMiBjYXAgPSAwLCBjbGtkaXYsIG90cGRpdiA9IDA7CiAJdm9pZCAqcmV0ID0gTlVMTDsKLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCiAJb2kgPSAmb3RwaW5mbzsKIApAQCAtOTAwLDcgKzkwMiw3IEBACiAJdm9pZCAqcmV0ID0gTlVMTDsKIAogCW9pID0gJm90cGluZm87Ci0JYnplcm8ob2ksIHNpemVvZihvdHBpbmZvX3QpKTsKKwltZW1zZXQob2ksIDAsIHNpemVvZihvdHBpbmZvX3QpKTsKIAogCW9pLT5jY3JldiA9IHNpaC0+Y2NyZXY7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9iY21zcm9tLmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvYmNtc3JvbS5jCmluZGV4IDEyODJlZjcuLjE5ZDQ1MDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9iY21zcm9tLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL2JjbXNyb20uYwpAQCAtMTUsOSArMTUsMTEgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8YmNtZGVmcy5oPgogI2luY2x1ZGUgPG9zbC5oPgotI2luY2x1ZGUgPGxpbnV4dmVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8c3RkYXJnLmg+CiAjaW5jbHVkZSA8YmNtdXRpbHMuaD4KICNpbmNsdWRlIDxobmRzb2MuaD4KQEAgLTY2LDI5ICs2OCwzMCBAQAogCiAjZGVmaW5lIFNST01fQ0lTX1NJTkdMRQkxCiAKLXN0YXRpYyBpbnQgaW5pdHZhcnNfc3JvbV9zaShzaV90ICpzaWgsIG9zbF90ICpvc2gsIHZvaWQgKmN1cm1hcCwgY2hhciAqKnZhcnMsCi0JCQkgICAgdWludCAqY291bnQpOworc3RhdGljIGludCBpbml0dmFyc19zcm9tX3NpKHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gsIHZvaWQgKmN1cm1hcCwKKwkJCSAgICBjaGFyICoqdmFycywgdWludCAqY291bnQpOwogc3RhdGljIHZvaWQgX2luaXR2YXJzX3Nyb21fcGNpKHU4IHNyb21yZXYsIHUxNiAqc3JvbSwgdWludCBvZmYsCiAJCQkgICAgICAgdmFyYnVmX3QgKmIpOwogc3RhdGljIGludCBpbml0dmFyc19zcm9tX3BjaShzaV90ICpzaWgsIHZvaWQgKmN1cm1hcCwgY2hhciAqKnZhcnMsCiAJCQkgICAgIHVpbnQgKmNvdW50KTsKIHN0YXRpYyBpbnQgaW5pdHZhcnNfZmxhc2hfc2koc2lfdCAqc2loLCBjaGFyICoqdmFycywgdWludCAqY291bnQpOwogI2lmZGVmIEJDTVNESU8KLXN0YXRpYyBpbnQgaW5pdHZhcnNfY2lzX3NkaW8ob3NsX3QgKm9zaCwgY2hhciAqKnZhcnMsIHVpbnQgKmNvdW50KTsKLXN0YXRpYyBpbnQgc3Byb21fY21kX3NkaW8ob3NsX3QgKm9zaCwgdTggY21kKTsKLXN0YXRpYyBpbnQgc3Byb21fcmVhZF9zZGlvKG9zbF90ICpvc2gsIHUxNiBhZGRyLCB1MTYgKmRhdGEpOworc3RhdGljIGludCBpbml0dmFyc19jaXNfc2RpbyhzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgY2hhciAqKnZhcnMsIHVpbnQgKmNvdW50KTsKK3N0YXRpYyBpbnQgc3Byb21fY21kX3NkaW8oc3RydWN0IG9zbF9pbmZvICpvc2gsIHU4IGNtZCk7CitzdGF0aWMgaW50IHNwcm9tX3JlYWRfc2RpbyhzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdTE2IGFkZHIsIHUxNiAqZGF0YSk7CiAjZW5kaWYJCQkJLyogQkNNU0RJTyAqLwotc3RhdGljIGludCBzcHJvbV9yZWFkX3BjaShvc2xfdCAqb3NoLCBzaV90ICpzaWgsIHUxNiAqc3Byb20sIHVpbnQgd29yZG9mZiwKLQkJCSAgdTE2ICpidWYsIHVpbnQgbndvcmRzLCBib29sIGNoZWNrX2NyYyk7CitzdGF0aWMgaW50IHNwcm9tX3JlYWRfcGNpKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBzaV90ICpzaWgsIHUxNiAqc3Byb20sCisJCQkgIHVpbnQgd29yZG9mZiwgdTE2ICpidWYsIHVpbnQgbndvcmRzLCBib29sIGNoZWNrX2NyYyk7CiAjaWYgZGVmaW5lZChCQ01OVlJBTVIpCi1zdGF0aWMgaW50IG90cF9yZWFkX3BjaShvc2xfdCAqb3NoLCBzaV90ICpzaWgsIHUxNiAqYnVmLCB1aW50IGJ1ZnN6KTsKK3N0YXRpYyBpbnQgb3RwX3JlYWRfcGNpKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBzaV90ICpzaWgsIHUxNiAqYnVmLCB1aW50IGJ1ZnN6KTsKICNlbmRpZgotc3RhdGljIHUxNiBzcm9tX2NjX2NtZChzaV90ICpzaWgsIG9zbF90ICpvc2gsIHZvaWQgKmNjcmVncywgdTMyIGNtZCwKK3N0YXRpYyB1MTYgc3JvbV9jY19jbWQoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqY2NyZWdzLCB1MzIgY21kLAogCQkJICB1aW50IHdvcmRvZmYsIHUxNiBkYXRhKTsKIAotc3RhdGljIGludCBpbml0dmFyc190YWJsZShvc2xfdCAqb3NoLCBjaGFyICpzdGFydCwgY2hhciAqZW5kLCBjaGFyICoqdmFycywKLQkJCSAgdWludCAqY291bnQpOwotc3RhdGljIGludCBpbml0dmFyc19mbGFzaChzaV90ICpzaWgsIG9zbF90ICpvc2gsIGNoYXIgKip2cCwgdWludCBsZW4pOworc3RhdGljIGludCBpbml0dmFyc190YWJsZShzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgY2hhciAqc3RhcnQsIGNoYXIgKmVuZCwKKwkJCSAgY2hhciAqKnZhcnMsIHVpbnQgKmNvdW50KTsKK3N0YXRpYyBpbnQgaW5pdHZhcnNfZmxhc2goc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgY2hhciAqKnZwLAorCQkJICB1aW50IGxlbik7CiAKIC8qIEluaXRpYWxpemF0aW9uIG9mIHZhcmJ1ZiBzdHJ1Y3R1cmUgKi8KIHN0YXRpYyB2b2lkIHZhcmJ1Zl9pbml0KHZhcmJ1Zl90ICpiLCBjaGFyICpidWYsIHVpbnQgc2l6ZSkKQEAgLTEyOSw3ICsxMzIsNyBAQAogCWlmIChzICE9IE5VTEwpIHsKIAkJbGVuID0gKHNpemVfdCkgKHMgLSBiLT5idWYpOwogCQlmb3IgKHMgPSBiLT5iYXNlOyBzIDwgYi0+YnVmOykgewotCQkJaWYgKChiY21wKHMsIGItPmJ1ZiwgbGVuKSA9PSAwKSAmJiBzW2xlbl0gPT0gJz0nKSB7CisJCQlpZiAoKG1lbWNtcChzLCBiLT5idWYsIGxlbikgPT0gMCkgJiYgc1tsZW5dID09ICc9JykgewogCQkJCWxlbiA9IHN0cmxlbihzKSArIDE7CiAJCQkJbWVtbW92ZShzLCAocyArIGxlbiksCiAJCQkJCSgoYi0+YnVmICsgciArIDEpIC0gKHMgKyBsZW4pKSk7CkBAIC0xNTUsMjEgKzE1OCwyMSBAQAogICogSW5pdGlhbGl6ZSBsb2NhbCB2YXJzIGZyb20gdGhlIHJpZ2h0IHNvdXJjZSBmb3IgdGhpcyBwbGF0Zm9ybS4KICAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIG5vbnplcm8gb24gZXJyb3IuCiAgKi8KLWludCBzcm9tX3Zhcl9pbml0KHNpX3QgKnNpaCwgdWludCBidXN0eXBlLCB2b2lkICpjdXJtYXAsIG9zbF90ICpvc2gsCitpbnQgc3JvbV92YXJfaW5pdChzaV90ICpzaWgsIHVpbnQgYnVzdHlwZSwgdm9pZCAqY3VybWFwLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwKIAkJICBjaGFyICoqdmFycywgdWludCAqY291bnQpCiB7CiAJdWludCBsZW47CiAKIAlsZW4gPSAwOwogCi0JQVNTRVJUKGJ1c3R5cGUgPT0gQlVTVFlQRShidXN0eXBlKSk7CisJQVNTRVJUKGJ1c3R5cGUgPT0gYnVzdHlwZSk7CiAJaWYgKHZhcnMgPT0gTlVMTCB8fCBjb3VudCA9PSBOVUxMKQogCQlyZXR1cm4gMDsKIAogCSp2YXJzID0gTlVMTDsKIAkqY291bnQgPSAwOwogCi0Jc3dpdGNoIChCVVNUWVBFKGJ1c3R5cGUpKSB7CisJc3dpdGNoIChidXN0eXBlKSB7CiAJY2FzZSBTSV9CVVM6CiAJY2FzZSBKVEFHX0JVUzoKIAkJcmV0dXJuIGluaXR2YXJzX3Nyb21fc2koc2loLCBvc2gsIGN1cm1hcCwgdmFycywgY291bnQpOwpAQCAtMTk0LDcgKzE5Nyw3IEBACiAKIC8qIHN1cHBvcnQgb25seSAxNi1iaXQgd29yZCByZWFkIGZyb20gc3JvbSAqLwogaW50Ci1zcm9tX3JlYWQoc2lfdCAqc2loLCB1aW50IGJ1c3R5cGUsIHZvaWQgKmN1cm1hcCwgb3NsX3QgKm9zaCwKK3Nyb21fcmVhZChzaV90ICpzaWgsIHVpbnQgYnVzdHlwZSwgdm9pZCAqY3VybWFwLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwKIAkgIHVpbnQgYnl0ZW9mZiwgdWludCBuYnl0ZXMsIHUxNiAqYnVmLCBib29sIGNoZWNrX2NyYykKIHsKIAl1aW50IG9mZiwgbnc7CkBAIC0yMDIsNyArMjA1LDcgQEAKIAl1aW50IGk7CiAjZW5kaWYJCQkJLyogQkNNU0RJTyAqLwogCi0JQVNTRVJUKGJ1c3R5cGUgPT0gQlVTVFlQRShidXN0eXBlKSk7CisJQVNTRVJUKGJ1c3R5cGUgPT0gYnVzdHlwZSk7CiAKIAkvKiBjaGVjayBpbnB1dCAtIDE2LWJpdCBhY2Nlc3Mgb25seSAqLwogCWlmIChieXRlb2ZmICYgMSB8fCBuYnl0ZXMgJiAxIHx8IChieXRlb2ZmICsgbmJ5dGVzKSA+IFNST01fTUFYKQpAQCAtMjExLDcgKzIxNCw3IEBACiAJb2ZmID0gYnl0ZW9mZiAvIDI7CiAJbncgPSBuYnl0ZXMgLyAyOwogCi0JaWYgKEJVU1RZUEUoYnVzdHlwZSkgPT0gUENJX0JVUykgeworCWlmIChidXN0eXBlID09IFBDSV9CVVMpIHsKIAkJaWYgKCFjdXJtYXApCiAJCQlyZXR1cm4gMTsKIApAQCAtMjMzLDcgKzIzNiw3IEBACiAJCX0KICNlbmRpZgogI2lmZGVmIEJDTVNESU8KLQl9IGVsc2UgaWYgKEJVU1RZUEUoYnVzdHlwZSkgPT0gU0RJT19CVVMpIHsKKwl9IGVsc2UgaWYgKGJ1c3R5cGUgPT0gU0RJT19CVVMpIHsKIAkJb2ZmID0gYnl0ZW9mZiAvIDI7CiAJCW53ID0gbmJ5dGVzIC8gMjsKIAkJZm9yIChpID0gMDsgaSA8IG53OyBpKyspIHsKQEAgLTI0Miw3ICsyNDUsNyBAQAogCQkJCXJldHVybiAxOwogCQl9CiAjZW5kaWYJCQkJLyogQkNNU0RJTyAqLwotCX0gZWxzZSBpZiAoQlVTVFlQRShidXN0eXBlKSA9PSBTSV9CVVMpIHsKKwl9IGVsc2UgaWYgKGJ1c3R5cGUgPT0gU0lfQlVTKSB7CiAJCXJldHVybiAxOwogCX0gZWxzZSB7CiAJCXJldHVybiAxOwpAQCAtMzc2LDcgKzM3OSw4IEBACiAvKiBGb3IgZG9uZ2xlIEhXLCBhY2NlcHQgcGFydGlhbCBjYWxpYnJhdGlvbiBwYXJhbWV0ZXJzICovCiAjZGVmaW5lIEJDTURPTkdMRUNBU0UobikKIAotaW50IHNyb21fcGFyc2VjaXMob3NsX3QgKm9zaCwgdTggKnBjaXNbXSwgdWludCBjaXNjbnQsIGNoYXIgKip2YXJzLCB1aW50ICpjb3VudCkKK2ludCBzcm9tX3BhcnNlY2lzKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB1OCAqcGNpc1tdLCB1aW50IGNpc2NudCwgY2hhciAqKnZhcnMsCisJCSAgdWludCAqY291bnQpCiB7CiAJY2hhciBlYWJ1ZlszMl07CiAJY2hhciAqYmFzZTsKQEAgLTQwMiw3ICs0MDYsNyBAQAogCQlyZXR1cm4gLTI7CiAKIAl2YXJidWZfaW5pdCgmYiwgYmFzZSwgTUFYU1pfTlZSQU1fVkFSUyk7Ci0JYnplcm8oYmFzZSwgTUFYU1pfTlZSQU1fVkFSUyk7CisJbWVtc2V0KGJhc2UsIDAsIE1BWFNaX05WUkFNX1ZBUlMpOwogCWVhYnVmWzBdID0gJ1wwJzsKIAlmb3IgKGNpc251bSA9IDA7IGNpc251bSA8IGNpc2NudDsgY2lzbnVtKyspIHsKIAkJY2lzID0gKnBjaXMrKzsKQEAgLTQ5NiwxMiArNTAwLDEyIEBACiAJCQkJCWJyZWFrOwogCQkJCWRlZmF1bHQ6CiAJCQkJCS8qIHNldCBtYWNhZGRyIGlmIEhOQlVfTUFDQUREUiBub3Qgc2VlbiB5ZXQgKi8KLQkJCQkJaWYgKGVhYnVmWzBdID09ICdcMCcKLQkJCQkJICAgICYmIGNpc1tpXSA9PSBMQU5fTklECi0JCQkJCSAgICAmJiAhKEVUSEVSX0lTTlVMTEFERFIoJmNpc1tpICsgMl0pKQotCQkJCQkgICAgJiYgIShFVEhFUl9JU01VTFRJKCZjaXNbaSArIDJdKSkpIHsKKwkJCQkJaWYgKGVhYnVmWzBdID09ICdcMCcgJiYKKwkJCQkJICAgIGNpc1tpXSA9PSBMQU5fTklEICYmCisJCQkJCSAgICAhaXNfemVyb19ldGhlcl9hZGRyKCZjaXNbaSArIDJdKSAmJgorCQkJCQkgICAgIWlzX211bHRpY2FzdF9ldGhlcl9hZGRyKCZjaXNbaSArIDJdKSkgewogCQkJCQkJQVNTRVJUKGNpc1tpICsgMV0gPT0KLQkJCQkJCSAgICAgICBFVEhFUl9BRERSX0xFTik7CisJCQkJCQkgICAgICAgRVRIX0FMRU4pOwogCQkJCQkJc25wcmludGYoZWFidWYsIHNpemVvZihlYWJ1ZiksCiAJCQkJCQkJIiVwTSIsICZjaXNbaSArIDJdKTsKIApAQCAtOTcwLDggKzk3NCw4IEBACiAJCQkJCWJyZWFrOwogCiAJCQkJY2FzZSBITkJVX01BQ0FERFI6Ci0JCQkJCWlmICghKEVUSEVSX0lTTlVMTEFERFIoJmNpc1tpICsgMV0pKSAmJgotCQkJCQkgICAgIShFVEhFUl9JU01VTFRJKCZjaXNbaSArIDFdKSkpIHsKKwkJCQkJaWYgKCFpc196ZXJvX2V0aGVyX2FkZHIoJmNpc1tpICsgMV0pICYmCisJCQkJCSAgICAhaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoJmNpc1tpICsgMV0pKSB7CiAJCQkJCQlzbnByaW50ZihlYWJ1Ziwgc2l6ZW9mKGVhYnVmKSwKIAkJCQkJCQkiJXBNIiwgJmNpc1tpICsgMV0pOwogCkBAIC0xNDA1LDggKzE0MDksOCBAQAogICogbm90IGluIHRoZSBidXMgY29yZXMuCiAgKi8KIHN0YXRpYyB1MTYKLXNyb21fY2NfY21kKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCwgdm9pZCAqY2NyZWdzLCB1MzIgY21kLCB1aW50IHdvcmRvZmYsCi0JICAgIHUxNiBkYXRhKQorc3JvbV9jY19jbWQoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqY2NyZWdzLCB1MzIgY21kLAorCSAgICB1aW50IHdvcmRvZmYsIHUxNiBkYXRhKQogewogCWNoaXBjcmVnc190ICpjYyA9IChjaGlwY3JlZ3NfdCAqKSBjY3JlZ3M7CiAJdWludCB3YWl0X2NudCA9IDEwMDA7CkBAIC0xNDM5LDcgKzE0NDMsNyBAQAogICogUmV0dXJuIDAgb24gc3VjY2Vzcywgbm9uemVybyBvbiBlcnJvci4KICAqLwogc3RhdGljIGludAotc3Byb21fcmVhZF9wY2kob3NsX3QgKm9zaCwgc2lfdCAqc2loLCB1MTYgKnNwcm9tLCB1aW50IHdvcmRvZmYsCitzcHJvbV9yZWFkX3BjaShzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc2lfdCAqc2loLCB1MTYgKnNwcm9tLCB1aW50IHdvcmRvZmYsCiAJICAgICAgIHUxNiAqYnVmLCB1aW50IG53b3JkcywgYm9vbCBjaGVja19jcmMpCiB7CiAJaW50IGVyciA9IDA7CkBAIC0xNDk5LDcgKzE1MDMsNyBAQAogfQogCiAjaWYgZGVmaW5lZChCQ01OVlJBTVIpCi1zdGF0aWMgaW50IG90cF9yZWFkX3BjaShvc2xfdCAqb3NoLCBzaV90ICpzaWgsIHUxNiAqYnVmLCB1aW50IGJ1ZnN6KQorc3RhdGljIGludCBvdHBfcmVhZF9wY2koc3RydWN0IG9zbF9pbmZvICpvc2gsIHNpX3QgKnNpaCwgdTE2ICpidWYsIHVpbnQgYnVmc3opCiB7CiAJdTggKm90cDsKIAl1aW50IHN6ID0gT1RQX1NaX01BWCAvIDI7CS8qIHNpemUgaW4gd29yZHMgKi8KQEAgLTE1NDcsOCArMTU1MSw4IEBACiAqIENyZWF0ZSB2YXJpYWJsZSB0YWJsZSBmcm9tIG1lbW9yeS4KICogUmV0dXJuIDAgb24gc3VjY2Vzcywgbm9uemVybyBvbiBlcnJvci4KICovCi1zdGF0aWMgaW50IGluaXR2YXJzX3RhYmxlKG9zbF90ICpvc2gsIGNoYXIgKnN0YXJ0LCBjaGFyICplbmQsIGNoYXIgKip2YXJzLAotCQkJICB1aW50ICpjb3VudCkKK3N0YXRpYyBpbnQgaW5pdHZhcnNfdGFibGUoc3RydWN0IG9zbF9pbmZvICpvc2gsIGNoYXIgKnN0YXJ0LCBjaGFyICplbmQsCisJCQkgIGNoYXIgKip2YXJzLCB1aW50ICpjb3VudCkKIHsKIAlpbnQgYyA9IChpbnQpKGVuZCAtIHN0YXJ0KTsKIApAQCAtMTU3NCw3ICsxNTc4LDggQEAKICAqIG9mIHRoZSB0YWJsZSB1cG9uIGVudGVyIGFuZCB0byB0aGUgZW5kIG9mIHRoZSB0YWJsZSB1cG9uIGV4aXQgd2hlbiBzdWNjZXNzLgogICogUmV0dXJuIDAgb24gc3VjY2Vzcywgbm9uemVybyBvbiBlcnJvci4KICAqLwotc3RhdGljIGludCBpbml0dmFyc19mbGFzaChzaV90ICpzaWgsIG9zbF90ICpvc2gsIGNoYXIgKipiYXNlLCB1aW50IGxlbikKK3N0YXRpYyBpbnQgaW5pdHZhcnNfZmxhc2goc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgY2hhciAqKmJhc2UsCisJCQkgIHVpbnQgbGVuKQogewogCWNoYXIgKnZwID0gKmJhc2U7CiAJY2hhciAqZmxhc2g7CkBAIC0xNjM0LDcgKzE2MzksNyBAQAogICovCiBzdGF0aWMgaW50IGluaXR2YXJzX2ZsYXNoX3NpKHNpX3QgKnNpaCwgY2hhciAqKnZhcnMsIHVpbnQgKmNvdW50KQogewotCW9zbF90ICpvc2ggPSBzaV9vc2goc2loKTsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaCA9IHNpX29zaChzaWgpOwogCWNoYXIgKnZwLCAqYmFzZTsKIAlpbnQgZXJyOwogCkBAIC0xODQ1LDcgKzE4NTAsNyBAQAogCXUzMiBzcjsKIAl2YXJidWZfdCBiOwogCWNoYXIgKnZwLCAqYmFzZSA9IE5VTEw7Ci0Jb3NsX3QgKm9zaCA9IHNpX29zaChzaWgpOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoID0gc2lfb3NoKHNpaCk7CiAJYm9vbCBmbGFzaCA9IGZhbHNlOwogCWludCBlcnIgPSAwOwogCkBAIC0xOTg2LDcgKzE5OTEsNyBAQAogICogUmVhZCB0aGUgU0RJTyBjaXMgYW5kIGNhbGwgcGFyc2VjaXMgdG8gaW5pdGlhbGl6ZSB0aGUgdmFycy4KICAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIG5vbnplcm8gb24gZXJyb3IuCiAgKi8KLXN0YXRpYyBpbnQgaW5pdHZhcnNfY2lzX3NkaW8ob3NsX3QgKm9zaCwgY2hhciAqKnZhcnMsIHVpbnQgKmNvdW50KQorc3RhdGljIGludCBpbml0dmFyc19jaXNfc2RpbyhzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgY2hhciAqKnZhcnMsIHVpbnQgKmNvdW50KQogewogCXU4ICpjaXNbU0JTRElPX05VTV9GVU5DVElPTiArIDFdOwogCXVpbnQgZm4sIG51bWZuOwpAQCAtMjAyMCw3ICsyMDI1LDcgQEAKIH0KIAogLyogc2V0IFNESU8gc3Byb20gY29tbWFuZCByZWdpc3RlciAqLwotc3RhdGljIGludCBzcHJvbV9jbWRfc2Rpbyhvc2xfdCAqb3NoLCB1OCBjbWQpCitzdGF0aWMgaW50IHNwcm9tX2NtZF9zZGlvKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB1OCBjbWQpCiB7CiAJdTggc3RhdHVzID0gMDsKIAl1aW50IHdhaXRfY250ID0gMTAwMDsKQEAgLTIwNDAsNyArMjA0NSw3IEBACiB9CiAKIC8qIHJlYWQgYSB3b3JkIGZyb20gdGhlIFNESU8gc3JvbSAqLwotc3RhdGljIGludCBzcHJvbV9yZWFkX3NkaW8ob3NsX3QgKm9zaCwgdTE2IGFkZHIsIHUxNiAqZGF0YSkKK3N0YXRpYyBpbnQgc3Byb21fcmVhZF9zZGlvKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB1MTYgYWRkciwgdTE2ICpkYXRhKQogewogCXU4IGFkZHJfbCwgYWRkcl9oLCBkYXRhX2wsIGRhdGFfaDsKIApAQCAtMjA2OCw4ICsyMDczLDggQEAKIH0KICNlbmRpZgkJCQkvKiBCQ01TRElPICovCiAKLXN0YXRpYyBpbnQgaW5pdHZhcnNfc3JvbV9zaShzaV90ICpzaWgsIG9zbF90ICpvc2gsIHZvaWQgKmN1cm1hcCwgY2hhciAqKnZhcnMsCi0JCQkgICAgdWludCAqdmFyc3opCitzdGF0aWMgaW50IGluaXR2YXJzX3Nyb21fc2koc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqY3VybWFwLAorCQkJICAgIGNoYXIgKip2YXJzLCB1aW50ICp2YXJzeikKIHsKIAkvKiBTZWFyY2ggZmxhc2ggbnZyYW0gc2VjdGlvbiBmb3Igc3JvbSB2YXJpYWJsZXMgKi8KIAlyZXR1cm4gaW5pdHZhcnNfZmxhc2hfc2koc2loLCB2YXJzLCB2YXJzeik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvYmNtdXRpbHMuYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9iY211dGlscy5jCmluZGV4IDk3ODllYTQuLmZkMzBjYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9iY211dGlscy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9iY211dGlscy5jCkBAIC0xOSw4ICsxOSwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KICNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxvc2wuaD4KLSNpbmNsdWRlIDxsaW51eHZlci5oPgogI2luY2x1ZGUgPGJjbXV0aWxzLmg+CiAjaW5jbHVkZSA8c2l1dGlscy5oPgogI2luY2x1ZGUgPGJjbW52cmFtLmg+CkBAIC0zMCwyNiArMzIsMjYgQEAKICNpbmNsdWRlIDxwcm90by84MDIuMWQuaD4KICNpbmNsdWRlIDxwcm90by84MDIuMTEuaD4KIAotCiAvKiBjb3B5IGEgYnVmZmVyIGludG8gYSBwa3QgYnVmZmVyIGNoYWluICovCi11aW50IHBrdGZyb21idWYob3NsX3QgKm9zaCwgdm9pZCAqcCwgdWludCBvZmZzZXQsIGludCBsZW4sIHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3VpbnQgcGt0ZnJvbWJ1ZihzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc3RydWN0IHNrX2J1ZmYgKnAsIHVpbnQgb2Zmc2V0LCBpbnQgbGVuLAorCQl1bnNpZ25lZCBjaGFyICpidWYpCiB7CiAJdWludCBuLCByZXQgPSAwOwogCiAJLyogc2tpcCAnb2Zmc2V0JyBieXRlcyAqLwotCWZvciAoOyBwICYmIG9mZnNldDsgcCA9IFBLVE5FWFQocCkpIHsKLQkJaWYgKG9mZnNldCA8ICh1aW50KSBQS1RMRU4ocCkpCisJZm9yICg7IHAgJiYgb2Zmc2V0OyBwID0gcC0+bmV4dCkgeworCQlpZiAob2Zmc2V0IDwgKHVpbnQpIChwLT5sZW4pKQogCQkJYnJlYWs7Ci0JCW9mZnNldCAtPSBQS1RMRU4ocCk7CisJCW9mZnNldCAtPSBwLT5sZW47CiAJfQogCiAJaWYgKCFwKQogCQlyZXR1cm4gMDsKIAogCS8qIGNvcHkgdGhlIGRhdGEgKi8KLQlmb3IgKDsgcCAmJiBsZW47IHAgPSBQS1RORVhUKHApKSB7Ci0JCW4gPSBtaW4oKHVpbnQpIFBLVExFTihwKSAtIG9mZnNldCwgKHVpbnQpIGxlbik7Ci0JCWJjb3B5KGJ1ZiwgUEtUREFUQShwKSArIG9mZnNldCwgbik7CisJZm9yICg7IHAgJiYgbGVuOyBwID0gcC0+bmV4dCkgeworCQluID0gbWluKCh1aW50KSAocC0+bGVuKSAtIG9mZnNldCwgKHVpbnQpIGxlbik7CisJCWJjb3B5KGJ1ZiwgcC0+ZGF0YSArIG9mZnNldCwgbik7CiAJCWJ1ZiArPSBuOwogCQlsZW4gLT0gbjsKIAkJcmV0ICs9IG47CkBAIC01OSwxMyArNjEsMTMgQEAKIAlyZXR1cm4gcmV0OwogfQogLyogcmV0dXJuIHRvdGFsIGxlbmd0aCBvZiBidWZmZXIgY2hhaW4gKi8KLXVpbnQgQkNNRkFTVFBBVEggcGt0dG90bGVuKG9zbF90ICpvc2gsIHZvaWQgKnApCit1aW50IEJDTUZBU1RQQVRIIHBrdHRvdGxlbihzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc3RydWN0IHNrX2J1ZmYgKnApCiB7CiAJdWludCB0b3RhbDsKIAogCXRvdGFsID0gMDsKLQlmb3IgKDsgcDsgcCA9IFBLVE5FWFQocCkpCi0JCXRvdGFsICs9IFBLVExFTihwKTsKKwlmb3IgKDsgcDsgcCA9IHAtPm5leHQpCisJCXRvdGFsICs9IHAtPmxlbjsKIAlyZXR1cm4gdG90YWw7CiB9CiAKQEAgLTczLDEyICs3NSwxMyBAQAogICogb3NsIG11bHRpcGxlLXByZWNlZGVuY2UgcGFja2V0IHF1ZXVlCiAgKiBoaV9wcmVjIGlzIGFsd2F5cyA+PSB0aGUgbnVtYmVyIG9mIHRoZSBoaWdoZXN0IG5vbi1lbXB0eSBwcmVjZWRlbmNlCiAgKi8KLXZvaWQgKkJDTUZBU1RQQVRIIHBrdHFfcGVucShzdHJ1Y3QgcGt0cSAqcHEsIGludCBwcmVjLCB2b2lkICpwKQorc3RydWN0IHNrX2J1ZmYgKkJDTUZBU1RQQVRIIHBrdHFfcGVucShzdHJ1Y3QgcGt0cSAqcHEsIGludCBwcmVjLAorCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpwKQogewogCXN0cnVjdCBwa3RxX3ByZWMgKnE7CiAKIAlBU1NFUlQocHJlYyA+PSAwICYmIHByZWMgPCBwcS0+bnVtX3ByZWMpOwotCUFTU0VSVChQS1RMSU5LKHApID09IE5VTEwpOwkvKiBxdWV1ZWluZyBjaGFpbnMgbm90IGFsbG93ZWQgKi8KKwlBU1NFUlQocC0+cHJldiA9PSBOVUxMKTsJLyogcXVldWVpbmcgY2hhaW5zIG5vdCBhbGxvd2VkICovCiAKIAlBU1NFUlQoIXBrdHFfZnVsbChwcSkpOwogCUFTU0VSVCghcGt0cV9wZnVsbChwcSwgcHJlYykpOwpAQCAtODYsNyArODksNyBAQAogCXEgPSAmcHEtPnFbcHJlY107CiAKIAlpZiAocS0+aGVhZCkKLQkJUEtUU0VUTElOSyhxLT50YWlsLCBwKTsKKwkJcS0+dGFpbC0+cHJldiA9IHA7CiAJZWxzZQogCQlxLT5oZWFkID0gcDsKIApAQCAtMTAxLDEyICsxMDQsMTMgQEAKIAlyZXR1cm4gcDsKIH0KIAotdm9pZCAqQkNNRkFTVFBBVEggcGt0cV9wZW5xX2hlYWQoc3RydWN0IHBrdHEgKnBxLCBpbnQgcHJlYywgdm9pZCAqcCkKK3N0cnVjdCBza19idWZmICpCQ01GQVNUUEFUSCBwa3RxX3BlbnFfaGVhZChzdHJ1Y3QgcGt0cSAqcHEsIGludCBwcmVjLAorCQkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqcCkKIHsKIAlzdHJ1Y3QgcGt0cV9wcmVjICpxOwogCiAJQVNTRVJUKHByZWMgPj0gMCAmJiBwcmVjIDwgcHEtPm51bV9wcmVjKTsKLQlBU1NFUlQoUEtUTElOSyhwKSA9PSBOVUxMKTsJLyogcXVldWVpbmcgY2hhaW5zIG5vdCBhbGxvd2VkICovCisJQVNTRVJUKHAtPnByZXYgPT0gTlVMTCk7CS8qIHF1ZXVlaW5nIGNoYWlucyBub3QgYWxsb3dlZCAqLwogCiAJQVNTRVJUKCFwa3RxX2Z1bGwocHEpKTsKIAlBU1NFUlQoIXBrdHFfcGZ1bGwocHEsIHByZWMpKTsKQEAgLTExNiw3ICsxMjAsNyBAQAogCWlmIChxLT5oZWFkID09IE5VTEwpCiAJCXEtPnRhaWwgPSBwOwogCi0JUEtUU0VUTElOSyhwLCBxLT5oZWFkKTsKKwlwLT5wcmV2ID0gcS0+aGVhZDsKIAlxLT5oZWFkID0gcDsKIAlxLT5sZW4rKzsKIApAQCAtMTI4LDEwICsxMzIsMTAgQEAKIAlyZXR1cm4gcDsKIH0KIAotdm9pZCAqQkNNRkFTVFBBVEggcGt0cV9wZGVxKHN0cnVjdCBwa3RxICpwcSwgaW50IHByZWMpCitzdHJ1Y3Qgc2tfYnVmZiAqQkNNRkFTVFBBVEggcGt0cV9wZGVxKHN0cnVjdCBwa3RxICpwcSwgaW50IHByZWMpCiB7CiAJc3RydWN0IHBrdHFfcHJlYyAqcTsKLQl2b2lkICpwOworCXN0cnVjdCBza19idWZmICpwOwogCiAJQVNTRVJUKHByZWMgPj0gMCAmJiBwcmVjIDwgcHEtPm51bV9wcmVjKTsKIApAQCAtMTQxLDcgKzE0NSw3IEBACiAJaWYgKHAgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlxLT5oZWFkID0gUEtUTElOSyhwKTsKKwlxLT5oZWFkID0gcC0+cHJldjsKIAlpZiAocS0+aGVhZCA9PSBOVUxMKQogCQlxLT50YWlsID0gTlVMTDsKIApAQCAtMTQ5LDE1ICsxNTMsMTUgQEAKIAogCXBxLT5sZW4tLTsKIAotCVBLVFNFVExJTksocCwgTlVMTCk7CisJcC0+cHJldiA9IE5VTEw7CiAKIAlyZXR1cm4gcDsKIH0KIAotdm9pZCAqQkNNRkFTVFBBVEggcGt0cV9wZGVxX3RhaWwoc3RydWN0IHBrdHEgKnBxLCBpbnQgcHJlYykKK3N0cnVjdCBza19idWZmICpCQ01GQVNUUEFUSCBwa3RxX3BkZXFfdGFpbChzdHJ1Y3QgcGt0cSAqcHEsIGludCBwcmVjKQogewogCXN0cnVjdCBwa3RxX3ByZWMgKnE7Ci0Jdm9pZCAqcCwgKnByZXY7CisJc3RydWN0IHNrX2J1ZmYgKnAsICpwcmV2OwogCiAJQVNTRVJUKHByZWMgPj0gMCAmJiBwcmVjIDwgcHEtPm51bV9wcmVjKTsKIApAQCAtMTY3LDExICsxNzEsMTEgQEAKIAlpZiAocCA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAotCWZvciAocHJldiA9IE5VTEw7IHAgIT0gcS0+dGFpbDsgcCA9IFBLVExJTksocCkpCisJZm9yIChwcmV2ID0gTlVMTDsgcCAhPSBxLT50YWlsOyBwID0gcC0+cHJldikKIAkJcHJldiA9IHA7CiAKIAlpZiAocHJldikKLQkJUEtUU0VUTElOSyhwcmV2LCBOVUxMKTsKKwkJcHJldi0+cHJldiA9IE5VTEw7CiAJZWxzZQogCQlxLT5oZWFkID0gTlVMTDsKIApAQCAtMTg0LDE3ICsxODgsMTcgQEAKIH0KIAogI2lmZGVmIEJSQ01fRlVMTE1BQwotdm9pZCBwa3RxX3BmbHVzaChvc2xfdCAqb3NoLCBzdHJ1Y3QgcGt0cSAqcHEsIGludCBwcmVjLCBib29sIGRpcikKK3ZvaWQgcGt0cV9wZmx1c2goc3RydWN0IG9zbF9pbmZvICpvc2gsIHN0cnVjdCBwa3RxICpwcSwgaW50IHByZWMsIGJvb2wgZGlyKQogewogCXN0cnVjdCBwa3RxX3ByZWMgKnE7Ci0Jdm9pZCAqcDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcDsKIAogCXEgPSAmcHEtPnFbcHJlY107CiAJcCA9IHEtPmhlYWQ7CiAJd2hpbGUgKHApIHsKLQkJcS0+aGVhZCA9IFBLVExJTksocCk7Ci0JCVBLVFNFVExJTksocCwgTlVMTCk7Ci0JCVBLVEZSRUUob3NoLCBwLCBkaXIpOworCQlxLT5oZWFkID0gcC0+cHJldjsKKwkJcC0+cHJldiA9IE5VTEw7CisJCXBrdF9idWZfZnJlZV9za2Iob3NoLCBwLCBkaXIpOwogCQlxLT5sZW4tLTsKIAkJcHEtPmxlbi0tOwogCQlwID0gcS0+aGVhZDsKQEAgLTIwMyw3ICsyMDcsNyBAQAogCXEtPnRhaWwgPSBOVUxMOwogfQogCi12b2lkIHBrdHFfZmx1c2gob3NsX3QgKm9zaCwgc3RydWN0IHBrdHEgKnBxLCBib29sIGRpcikKK3ZvaWQgcGt0cV9mbHVzaChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc3RydWN0IHBrdHEgKnBxLCBib29sIGRpcikKIHsKIAlpbnQgcHJlYzsKIAlmb3IgKHByZWMgPSAwOyBwcmVjIDwgcHEtPm51bV9wcmVjOyBwcmVjKyspCkBAIC0yMTIsMTEgKzIxNiwxMSBAQAogfQogI2Vsc2UgLyogIUJSQ01fRlVMTE1BQyAqLwogdm9pZAotcGt0cV9wZmx1c2gob3NsX3QgKm9zaCwgc3RydWN0IHBrdHEgKnBxLCBpbnQgcHJlYywgYm9vbCBkaXIsIGlmcGt0X2NiX3QgZm4sCi0JICAgIGludCBhcmcpCitwa3RxX3BmbHVzaChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc3RydWN0IHBrdHEgKnBxLCBpbnQgcHJlYywgYm9vbCBkaXIsCisJICAgIGlmcGt0X2NiX3QgZm4sIGludCBhcmcpCiB7CiAJc3RydWN0IHBrdHFfcHJlYyAqcTsKLQl2b2lkICpwLCAqcHJldiA9IE5VTEw7CisJc3RydWN0IHNrX2J1ZmYgKnAsICpwcmV2ID0gTlVMTDsKIAogCXEgPSAmcHEtPnFbcHJlY107CiAJcCA9IHEtPmhlYWQ7CkBAIC0yMjQsMTcgKzIyOCwxNyBAQAogCQlpZiAoZm4gPT0gTlVMTCB8fCAoKmZuKSAocCwgYXJnKSkgewogCQkJYm9vbCBoZWFkID0gKHAgPT0gcS0+aGVhZCk7CiAJCQlpZiAoaGVhZCkKLQkJCQlxLT5oZWFkID0gUEtUTElOSyhwKTsKKwkJCQlxLT5oZWFkID0gcC0+cHJldjsKIAkJCWVsc2UKLQkJCQlQS1RTRVRMSU5LKHByZXYsIFBLVExJTksocCkpOwotCQkJUEtUU0VUTElOSyhwLCBOVUxMKTsKLQkJCVBLVEZSRUUob3NoLCBwLCBkaXIpOworCQkJCXByZXYtPnByZXYgPSBwLT5wcmV2OworCQkJcC0+cHJldiA9IE5VTEw7CisJCQlwa3RfYnVmX2ZyZWVfc2tiKG9zaCwgcCwgZGlyKTsKIAkJCXEtPmxlbi0tOwogCQkJcHEtPmxlbi0tOwotCQkJcCA9IChoZWFkID8gcS0+aGVhZCA6IFBLVExJTksocHJldikpOworCQkJcCA9IChoZWFkID8gcS0+aGVhZCA6IHByZXYtPnByZXYpOwogCQl9IGVsc2UgewogCQkJcHJldiA9IHA7Ci0JCQlwID0gUEtUTElOSyhwKTsKKwkJCXAgPSBwLT5wcmV2OwogCQl9CiAJfQogCkBAIC0yNDQsNyArMjQ4LDggQEAKIAl9CiB9CiAKLXZvaWQgcGt0cV9mbHVzaChvc2xfdCAqb3NoLCBzdHJ1Y3QgcGt0cSAqcHEsIGJvb2wgZGlyLCBpZnBrdF9jYl90IGZuLCBpbnQgYXJnKQordm9pZCBwa3RxX2ZsdXNoKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBzdHJ1Y3QgcGt0cSAqcHEsIGJvb2wgZGlyLAorCQlpZnBrdF9jYl90IGZuLCBpbnQgYXJnKQogewogCWludCBwcmVjOwogCWZvciAocHJlYyA9IDA7IHByZWMgPCBwcS0+bnVtX3ByZWM7IHByZWMrKykKQEAgLTI2MSw3ICsyNjYsNyBAQAogCUFTU0VSVChudW1fcHJlYyA+IDAgJiYgbnVtX3ByZWMgPD0gUEtUUV9NQVhfUFJFQyk7CiAKIAkvKiBwcSBpcyB2YXJpYWJsZSBzaXplOyBvbmx5IHplcm8gb3V0IHdoYXQncyByZXF1ZXN0ZWQgKi8KLQliemVybyhwcSwKKwltZW1zZXQocHEsIDAsCiAJICAgICAgb2Zmc2V0b2Yoc3RydWN0IHBrdHEsIHEpICsgKHNpemVvZihzdHJ1Y3QgcGt0cV9wcmVjKSAqIG51bV9wcmVjKSk7CiAKIAlwcS0+bnVtX3ByZWMgPSAodTE2KSBudW1fcHJlYzsKQEAgLTI3Miw3ICsyNzcsNyBAQAogCQlwcS0+cVtwcmVjXS5tYXggPSBwcS0+bWF4OwogfQogCi12b2lkICpwa3RxX3BlZWtfdGFpbChzdHJ1Y3QgcGt0cSAqcHEsIGludCAqcHJlY19vdXQpCitzdHJ1Y3Qgc2tfYnVmZiAqcGt0cV9wZWVrX3RhaWwoc3RydWN0IHBrdHEgKnBxLCBpbnQgKnByZWNfb3V0KQogewogCWludCBwcmVjOwogCkBAIC0zMDMsMTAgKzMwOCwxMSBAQAogCXJldHVybiBsZW47CiB9CiAvKiBQcmlvcml0eSBkZXF1ZXVlIGZyb20gYSBzcGVjaWZpYyBzZXQgb2YgcHJlY2VkZW5jZXMgKi8KLXZvaWQgKkJDTUZBU1RQQVRIIHBrdHFfbWRlcShzdHJ1Y3QgcGt0cSAqcHEsIHVpbnQgcHJlY19ibXAsIGludCAqcHJlY19vdXQpCitzdHJ1Y3Qgc2tfYnVmZiAqQkNNRkFTVFBBVEggcGt0cV9tZGVxKHN0cnVjdCBwa3RxICpwcSwgdWludCBwcmVjX2JtcCwKKwkJCQkgICAgICBpbnQgKnByZWNfb3V0KQogewogCXN0cnVjdCBwa3RxX3ByZWMgKnE7Ci0Jdm9pZCAqcDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcDsKIAlpbnQgcHJlYzsKIAogCWlmIChwcS0+bGVuID09IDApCkBAIC0zMjUsNyArMzMxLDcgQEAKIAlpZiAocCA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAotCXEtPmhlYWQgPSBQS1RMSU5LKHApOworCXEtPmhlYWQgPSBwLT5wcmV2OwogCWlmIChxLT5oZWFkID09IE5VTEwpCiAJCXEtPnRhaWwgPSBOVUxMOwogCkBAIC0zMzYsNyArMzQyLDcgQEAKIAogCXBxLT5sZW4tLTsKIAotCVBLVFNFVExJTksocCwgTlVMTCk7CisJcC0+cHJldiA9IE5VTEw7CiAKIAlyZXR1cm4gcDsKIH0KQEAgLTM3Myw3ICszNzksNyBAQAogCiAJLyogZmlyc3QgbG9vayBpbiB2YXJzW10gKi8KIAlmb3IgKHMgPSB2YXJzOyBzICYmICpzOykgewotCQlpZiAoKGJjbXAocywgbmFtZSwgbGVuKSA9PSAwKSAmJiAoc1tsZW5dID09ICc9JykpCisJCWlmICgobWVtY21wKHMsIG5hbWUsIGxlbikgPT0gMCkgJiYgKHNbbGVuXSA9PSAnPScpKQogCQkJcmV0dXJuICZzW2xlbiArIDFdOwogCiAJCXdoaWxlICgqcysrKQpAQCAtNDA0LDE1ICs0MTAsMTUgQEAKIAogI2lmIGRlZmluZWQoQkNNREJHKQogLyogcHJldHR5IGhleCBwcmludCBhIHBrdCBidWZmZXIgY2hhaW4gKi8KLXZvaWQgcHJwa3QoY29uc3QgY2hhciAqbXNnLCBvc2xfdCAqb3NoLCB2b2lkICpwMCkKK3ZvaWQgcHJwa3QoY29uc3QgY2hhciAqbXNnLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc3RydWN0IHNrX2J1ZmYgKnAwKQogewotCXZvaWQgKnA7CisJc3RydWN0IHNrX2J1ZmYgKnA7CiAKIAlpZiAobXNnICYmIChtc2dbMF0gIT0gJ1wwJykpCiAJCXByaW50ZigiJXM6XG4iLCBtc2cpOwogCi0JZm9yIChwID0gcDA7IHA7IHAgPSBQS1RORVhUKHApKQotCQlwcmhleChOVUxMLCBQS1REQVRBKHApLCBQS1RMRU4ocCkpOworCWZvciAocCA9IHAwOyBwOyBwID0gcC0+bmV4dCkKKwkJcHJoZXgoTlVMTCwgcC0+ZGF0YSwgcC0+bGVuKTsKIH0KICNlbmRpZgkJCQkvKiBkZWZpbmVkKEJDTURCRykgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL2JjbXdpZmkuYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9iY213aWZpLmMKaW5kZXggMWJiNmM3OC4uODFlNTRiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL2JjbXdpZmkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvYmNtd2lmaS5jCkBAIC0xNSw2ICsxNSwxMCBAQAogICovCiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpZmRlZiBCUkNNX0ZVTExNQUMKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNlbmRpZgorI2luY2x1ZGUgPG9zbC5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KICNpbmNsdWRlIDxiY211dGlscy5oPgogI2luY2x1ZGUgPGJjbXdpZmkuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9obmRkbWEuYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9obmRkbWEuYwppbmRleCBmZTUwM2U3Li5kMDg4NjkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvaG5kZG1hLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL2huZGRtYS5jCkBAIC0xNiw3ICsxNiw4IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eHZlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KICNpbmNsdWRlIDxiY21kZXZzLmg+CiAjaW5jbHVkZSA8b3NsLmg+CkBAIC0yOCw2ICsyOSwxMCBAQAogI2luY2x1ZGUgPHNiaG5kZG1hLmg+CiAjaW5jbHVkZSA8aG5kZG1hLmg+CiAKKyNpZiBkZWZpbmVkKF9fbWlwc19fKQorI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KKyNlbmRpZgorCiAvKiBkZWJ1Zy90cmFjZSAqLwogI2lmZGVmIEJDTURCRwogI2RlZmluZQlETUFfRVJST1IoYXJncykgXApAQCAtNjgsMTEgKzczLDEyIEBACiAKICNkZWZpbmUJRElfSU5GTyhkbWFoKQkoKGRtYV9pbmZvX3QgKilkbWFoKQogCisjZGVmaW5lIFJfU00ocikJCSgqKHIpKQorI2RlZmluZSBXX1NNKHIsIHYpCSgqKHIpID0gKHYpKQorCiAvKiBkbWEgZW5naW5lIHNvZnR3YXJlIHN0YXRlICovCiB0eXBlZGVmIHN0cnVjdCBkbWFfaW5mbyB7Ci0Jc3RydWN0IGhuZGRtYV9wdWIgaG5kZG1hOwkvKiBleHBvcnRlZCBzdHJ1Y3R1cmUsIGRvbid0IHVzZSBobmRkbWFfdCwKLQkJCQkJICogd2hpY2ggY291bGQgYmUgY29uc3QKLQkJCQkJICovCisJc3RydWN0IGhuZGRtYV9wdWIgaG5kZG1hOyAvKiBleHBvcnRlZCBzdHJ1Y3R1cmUgKi8KIAl1aW50ICptc2dfbGV2ZWw7CS8qIG1lc3NhZ2UgbGV2ZWwgcG9pbnRlciAqLwogCWNoYXIgbmFtZVtNQVhOQU1FTF07CS8qIGNhbGxlcnMgbmFtZSBmb3IgZGlhZyBtc2dzICovCiAKQEAgLTIyMiw3ICsyMjgsNyBAQAogc3RhdGljIHZvaWQgX2RtYV9maWZvbG9vcGJhY2tlbmFibGUoZG1hX2luZm9fdCAqZGkpOwogc3RhdGljIHVpbnQgX2RtYV9jdHJsZmxhZ3MoZG1hX2luZm9fdCAqZGksIHVpbnQgbWFzaywgdWludCBmbGFncyk7CiBzdGF0aWMgdTggZG1hX2FsaWduX3NpemV0b2JpdHModWludCBzaXplKTsKLXN0YXRpYyB2b2lkICpkbWFfcmluZ2FsbG9jKG9zbF90ICpvc2gsIHUzMiBib3VuZGFyeSwgdWludCBzaXplLAorc3RhdGljIHZvaWQgKmRtYV9yaW5nYWxsb2Moc3RydWN0IG9zbF9pbmZvICpvc2gsIHUzMiBib3VuZGFyeSwgdWludCBzaXplLAogCQkJICAgdTE2ICphbGlnbmJpdHMsIHVpbnQgKmFsbG9jZWQsCiAJCQkgICBkbWFhZGRyX3QgKmRlc2NwYSwgb3NsZG1hX3QgKipkbWFoKTsKIApAQCAtMjMxLDcgKzIzNyw3IEBACiBzdGF0aWMgYm9vbCBkbWEzMl90eHJlc2V0KGRtYV9pbmZvX3QgKmRpKTsKIHN0YXRpYyBib29sIGRtYTMyX3J4cmVzZXQoZG1hX2luZm9fdCAqZGkpOwogc3RhdGljIGJvb2wgZG1hMzJfdHhzdXNwZW5kZWRpZGxlKGRtYV9pbmZvX3QgKmRpKTsKLXN0YXRpYyBpbnQgZG1hMzJfdHhmYXN0KGRtYV9pbmZvX3QgKmRpLCB2b2lkICpwMCwgYm9vbCBjb21taXQpOworc3RhdGljIGludCBkbWEzMl90eGZhc3QoZG1hX2luZm9fdCAqZGksIHN0cnVjdCBza19idWZmICpwMCwgYm9vbCBjb21taXQpOwogc3RhdGljIHZvaWQgKmRtYTMyX2dldG5leHR0eHAoZG1hX2luZm9fdCAqZGksIHR4ZF9yYW5nZV90IHJhbmdlKTsKIHN0YXRpYyB2b2lkICpkbWEzMl9nZXRuZXh0cnhwKGRtYV9pbmZvX3QgKmRpLCBib29sIGZvcmNlYWxsKTsKIHN0YXRpYyB2b2lkIGRtYTMyX3R4cm90YXRlKGRtYV9pbmZvX3QgKmRpKTsKQEAgLTI0NiwxNCArMjUyLDE0IEBACiBzdGF0aWMgYm9vbCBkbWEzMl9yeHN0b3BwZWQoZG1hX2luZm9fdCAqZGkpOwogc3RhdGljIGJvb2wgZG1hMzJfcnhlbmFibGVkKGRtYV9pbmZvX3QgKmRpKTsKIAotc3RhdGljIGJvb2wgX2RtYTMyX2FkZHJleHQob3NsX3QgKm9zaCwgZG1hMzJyZWdzX3QgKmRtYTMycmVncyk7CitzdGF0aWMgYm9vbCBfZG1hMzJfYWRkcmV4dChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgZG1hMzJyZWdzX3QgKmRtYTMycmVncyk7CiAKIC8qIFByb3RvdHlwZXMgZm9yIDY0LWJpdCByb3V0aW5lcyAqLwogc3RhdGljIGJvb2wgZG1hNjRfYWxsb2MoZG1hX2luZm9fdCAqZGksIHVpbnQgZGlyZWN0aW9uKTsKIHN0YXRpYyBib29sIGRtYTY0X3R4cmVzZXQoZG1hX2luZm9fdCAqZGkpOwogc3RhdGljIGJvb2wgZG1hNjRfcnhyZXNldChkbWFfaW5mb190ICpkaSk7CiBzdGF0aWMgYm9vbCBkbWE2NF90eHN1c3BlbmRlZGlkbGUoZG1hX2luZm9fdCAqZGkpOwotc3RhdGljIGludCBkbWE2NF90eGZhc3QoZG1hX2luZm9fdCAqZGksIHZvaWQgKnAwLCBib29sIGNvbW1pdCk7CitzdGF0aWMgaW50IGRtYTY0X3R4ZmFzdChkbWFfaW5mb190ICpkaSwgc3RydWN0IHNrX2J1ZmYgKnAwLCBib29sIGNvbW1pdCk7CiBzdGF0aWMgaW50IGRtYTY0X3R4dW5mcmFtZWQoZG1hX2luZm9fdCAqZGksIHZvaWQgKnAwLCB1aW50IGxlbiwgYm9vbCBjb21taXQpOwogc3RhdGljIHZvaWQgKmRtYTY0X2dldHBvcyhkbWFfaW5mb190ICpkaSwgYm9vbCBkaXJlY3Rpb24pOwogc3RhdGljIHZvaWQgKmRtYTY0X2dldG5leHR0eHAoZG1hX2luZm9fdCAqZGksIHR4ZF9yYW5nZV90IHJhbmdlKTsKQEAgLTI3MCw3ICsyNzYsNyBAQAogc3RhdGljIGJvb2wgZG1hNjRfdHhzdG9wcGVkKGRtYV9pbmZvX3QgKmRpKTsKIHN0YXRpYyBib29sIGRtYTY0X3J4c3RvcHBlZChkbWFfaW5mb190ICpkaSk7CiBzdGF0aWMgYm9vbCBkbWE2NF9yeGVuYWJsZWQoZG1hX2luZm9fdCAqZGkpOwotc3RhdGljIGJvb2wgX2RtYTY0X2FkZHJleHQob3NsX3QgKm9zaCwgZG1hNjRyZWdzX3QgKmRtYTY0cmVncyk7CitzdGF0aWMgYm9vbCBfZG1hNjRfYWRkcmV4dChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgZG1hNjRyZWdzX3QgKmRtYTY0cmVncyk7CiAKIHN0YXRpYyBpbmxpbmUgdTMyIHBhcml0eTMyKHUzMiBkYXRhKTsKIApAQCAtMzY4LDEwICszNzQsMTAgQEAKIAkzOQogfTsKIAotaG5kZG1hX3QgKmRtYV9hdHRhY2gob3NsX3QgKm9zaCwgY2hhciAqbmFtZSwgc2lfdCAqc2loLCB2b2lkICpkbWFyZWdzdHgsCi0JCSAgICAgdm9pZCAqZG1hcmVnc3J4LCB1aW50IG50eGQsIHVpbnQgbnJ4ZCwgdWludCByeGJ1ZnNpemUsCi0JCSAgICAgaW50IHJ4ZXh0aGVhZHJvb20sIHVpbnQgbnJ4cG9zdCwgdWludCByeG9mZnNldCwKLQkJICAgICB1aW50ICptc2dfbGV2ZWwpCitzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1hX2F0dGFjaChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgY2hhciAqbmFtZSwgc2lfdCAqc2loLAorCQkgICAgIHZvaWQgKmRtYXJlZ3N0eCwgdm9pZCAqZG1hcmVnc3J4LCB1aW50IG50eGQsCisJCSAgICAgdWludCBucnhkLCB1aW50IHJ4YnVmc2l6ZSwgaW50IHJ4ZXh0aGVhZHJvb20sCisJCSAgICAgdWludCBucnhwb3N0LCB1aW50IHJ4b2Zmc2V0LCB1aW50ICptc2dfbGV2ZWwpCiB7CiAJZG1hX2luZm9fdCAqZGk7CiAJdWludCBzaXplOwpAQCAtNTcwLDcgKzU3Niw3IEBACiAJCX0KIAl9CiAKLQlyZXR1cm4gKGhuZGRtYV90ICopIGRpOworCXJldHVybiAoc3RydWN0IGhuZGRtYV9wdWIgKikgZGk7CiAKICBmYWlsOgogCV9kbWFfZGV0YWNoKGRpKTsKQEAgLTY2Myw3ICs2NjksNyBAQAogCX0KIH0KIAotc3RhdGljIGJvb2wgX2RtYTMyX2FkZHJleHQob3NsX3QgKm9zaCwgZG1hMzJyZWdzX3QgKmRtYTMycmVncykKK3N0YXRpYyBib29sIF9kbWEzMl9hZGRyZXh0KHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBkbWEzMnJlZ3NfdCAqZG1hMzJyZWdzKQogewogCXUzMiB3OwogCkBAIC05MDIsNyArOTA4LDcgQEAKIAogCS8qIGNsZWFyIHJ4IGRlc2NyaXB0b3IgcmluZyAqLwogCWlmIChETUE2NF9FTkFCKGRpKSAmJiBETUE2NF9NT0RFKGRpKSkgewotCQlCWkVST19TTSgodm9pZCAqKWRpLT5yeGQ2NCwKKwkJbWVtc2V0KCh2b2lkICopZGktPnJ4ZDY0LCAnXDAnLAogCQkJIChkaS0+bnJ4ZCAqIHNpemVvZihkbWE2NGRkX3QpKSk7CiAKIAkJLyogRE1BIGVuZ2luZSB3aXRoIG91dCBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgcmVxdWlyZXMgdGFibGUgdG8gYmUgaW5pdGVkCkBAIC05MTYsNyArOTIyLDcgQEAKIAkJaWYgKGRpLT5hbGlnbmRlc2NfNGspCiAJCQlfZG1hX2RkdGFibGVfaW5pdChkaSwgRE1BX1JYLCBkaS0+cnhkcGEpOwogCX0gZWxzZSBpZiAoRE1BMzJfRU5BQihkaSkpIHsKLQkJQlpFUk9fU00oKHZvaWQgKilkaS0+cnhkMzIsCisJCW1lbXNldCgodm9pZCAqKWRpLT5yeGQzMiwgJ1wwJywKIAkJCSAoZGktPm5yeGQgKiBzaXplb2YoZG1hMzJkZF90KSkpOwogCQlfZG1hX3J4ZW5hYmxlKGRpKTsKIAkJX2RtYV9kZHRhYmxlX2luaXQoZGksIERNQV9SWCwgZGktPnJ4ZHBhKTsKQEAgLTk3OCw3ICs5ODQsNyBAQAogICovCiBzdGF0aWMgdm9pZCAqQkNNRkFTVFBBVEggX2RtYV9yeChkbWFfaW5mb190ICpkaSkKIHsKLQl2b2lkICpwLCAqaGVhZCwgKnRhaWw7CisJc3RydWN0IHNrX2J1ZmYgKnAsICpoZWFkLCAqdGFpbDsKIAl1aW50IGxlbjsKIAl1aW50IHBrdF9sZW47CiAJaW50IHJlc2lkID0gMDsKQEAgLTk4OCwzMCArOTk0LDMxIEBACiAJaWYgKGhlYWQgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlsZW4gPSBsdG9oMTYoKih1MTYgKikgKFBLVERBVEEoaGVhZCkpKTsKKwlsZW4gPSBsdG9oMTYoKih1MTYgKikgKGhlYWQtPmRhdGEpKTsKIAlETUFfVFJBQ0UoKCIlczogZG1hX3J4IGxlbiAlZFxuIiwgZGktPm5hbWUsIGxlbikpOwogCiAjaWYgZGVmaW5lZChfX21pcHNfXykKKyNkZWZpbmUgT1NMX1VOQ0FDSEVEKHZhKSAgICAgICAgKCh2b2lkICopS1NFRzFBRERSKCh2YSkpKQogCWlmICghbGVuKSB7Ci0JCXdoaWxlICghKGxlbiA9ICoodTE2ICopIE9TTF9VTkNBQ0hFRChQS1REQVRBKGhlYWQpKSkpCisJCXdoaWxlICghKGxlbiA9ICoodTE2ICopIE9TTF9VTkNBQ0hFRChoZWFkLT5kYXRhKSkpCiAJCQl1ZGVsYXkoMSk7CiAKLQkJKih1MTYgKikgUEtUREFUQShoZWFkKSA9IGh0b2wxNigodTE2KSBsZW4pOworCQkqKHUxNiAqKSAoaGVhZC0+ZGF0YSkgPSBodG9sMTYoKHUxNikgbGVuKTsKIAl9CiAjZW5kaWYJCQkJLyogZGVmaW5lZChfX21pcHNfXykgKi8KIAogCS8qIHNldCBhY3R1YWwgbGVuZ3RoICovCiAJcGt0X2xlbiA9IG1pbigoZGktPnJ4b2Zmc2V0ICsgbGVuKSwgZGktPnJ4YnVmc2l6ZSk7Ci0JUEtUU0VUTEVOKGhlYWQsIHBrdF9sZW4pOworCV9fc2tiX3RyaW0oaGVhZCwgcGt0X2xlbik7CiAJcmVzaWQgPSBsZW4gLSAoZGktPnJ4YnVmc2l6ZSAtIGRpLT5yeG9mZnNldCk7CiAKIAkvKiBjaGVjayBmb3Igc2luZ2xlIG9yIG11bHRpLWJ1ZmZlciByeCAqLwogCWlmIChyZXNpZCA+IDApIHsKIAkJdGFpbCA9IGhlYWQ7CiAJCXdoaWxlICgocmVzaWQgPiAwKSAmJiAocCA9IF9kbWFfZ2V0bmV4dHJ4cChkaSwgZmFsc2UpKSkgewotCQkJUEtUU0VUTkVYVCh0YWlsLCBwKTsKKwkJCXRhaWwtPm5leHQgPSBwOwogCQkJcGt0X2xlbiA9IG1pbihyZXNpZCwgKGludClkaS0+cnhidWZzaXplKTsKLQkJCVBLVFNFVExFTihwLCBwa3RfbGVuKTsKKwkJCV9fc2tiX3RyaW0ocCwgcGt0X2xlbik7CiAKIAkJCXRhaWwgPSBwOwogCQkJcmVzaWQgLT0gZGktPnJ4YnVmc2l6ZTsKQEAgLTEwMzcsNyArMTA0NCw3IEBACiAJCWlmICgoZGktPmhuZGRtYS5kbWFjdHJsZmxhZ3MgJiBETUFfQ1RSTF9SWE1VTFRJKSA9PSAwKSB7CiAJCQlETUFfRVJST1IoKCIlczogZG1hX3J4OiBiYWQgZnJhbWUgbGVuZ3RoICglZClcbiIsCiAJCQkJICAgZGktPm5hbWUsIGxlbikpOwotCQkJUEtURlJFRShkaS0+b3NoLCBoZWFkLCBmYWxzZSk7CisJCQlwa3RfYnVmX2ZyZWVfc2tiKGRpLT5vc2gsIGhlYWQsIGZhbHNlKTsKIAkJCWRpLT5obmRkbWEucnhnaWFudHMrKzsKIAkJCWdvdG8gbmV4dF9mcmFtZTsKIAkJfQpAQCAtMTA1Myw3ICsxMDYwLDcgQEAKICAqLwogc3RhdGljIGJvb2wgQkNNRkFTVFBBVEggX2RtYV9yeGZpbGwoZG1hX2luZm9fdCAqZGkpCiB7Ci0Jdm9pZCAqcDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcDsKIAl1MTYgcnhpbiwgcnhvdXQ7CiAJdTMyIGZsYWdzID0gMDsKIAl1aW50IG47CkBAIC0xMDg1LDcgKzEwOTIsNyBAQAogCQkgICBzaXplIHRvIGJlIGFsbG9jYXRlZAogCQkgKi8KIAotCQlwID0gb3NsX3BrdGdldChkaS0+b3NoLCBkaS0+cnhidWZzaXplICsgZXh0cmFfb2Zmc2V0KTsKKwkJcCA9IHBrdF9idWZfZ2V0X3NrYihkaS0+b3NoLCBkaS0+cnhidWZzaXplICsgZXh0cmFfb2Zmc2V0KTsKIAogCQlpZiAocCA9PSBOVUxMKSB7CiAJCQlETUFfRVJST1IoKCIlczogZG1hX3J4ZmlsbDogb3V0IG9mIHJ4YnVmc1xuIiwKQEAgLTExMDksMTcgKzExMTYsMTggQEAKIAkJfQogCQkvKiByZXNlcnZlIGFuIGV4dHJhIGhlYWRyb29tLCBpZiBhcHBsaWNhYmxlICovCiAJCWlmIChleHRyYV9vZmZzZXQpCi0JCQlQS1RQVUxMKHAsIGV4dHJhX29mZnNldCk7CisJCQlza2JfcHVsbChwLCBleHRyYV9vZmZzZXQpOwogCiAJCS8qIERvIGEgY2FjaGVkIHdyaXRlIGluc3RlYWQgb2YgdW5jYWNoZWQgd3JpdGUgc2luY2UgRE1BX01BUAogCQkgKiB3aWxsIGZsdXNoIHRoZSBjYWNoZS4KIAkJICovCi0JCSoodTMyICopIChQS1REQVRBKHApKSA9IDA7CisJCSoodTMyICopIChwLT5kYXRhKSA9IDA7CiAKIAkJaWYgKERNQVNHTElTVF9FTkFCKQotCQkJYnplcm8oJmRpLT5yeHBfZG1haFtyeG91dF0sIHNpemVvZihobmRkbWFfc2VnX21hcF90KSk7CisJCQltZW1zZXQoJmRpLT5yeHBfZG1haFtyeG91dF0sIDAsCisJCQkJc2l6ZW9mKGhuZGRtYV9zZWdfbWFwX3QpKTsKIAotCQlwYSA9IERNQV9NQVAoZGktPm9zaCwgUEtUREFUQShwKSwKKwkJcGEgPSBETUFfTUFQKGRpLT5vc2gsIHAtPmRhdGEsCiAJCQkgICAgIGRpLT5yeGJ1ZnNpemUsIERNQV9SWCwgcCwgJmRpLT5yeHBfZG1haFtyeG91dF0pOwogCiAJCUFTU0VSVChJU19BTElHTkVEKFBIWVNBRERSTE8ocGEpLCA0KSk7CkBAIC0xMjIwLDE1ICsxMjI4LDEwIEBACiB7CiAJdm9pZCAqcDsKIAotCS8qICJ1bnVzZWQgbG9jYWwiIHdhcm5pbmcgc3VwcHJlc3Npb24gZm9yIE9TTHMgdGhhdAotCSAqIGRlZmluZSBQS1RGUkVFKCkgd2l0aG91dCB1c2luZyB0aGUgZGktPm9zaCBhcmcKLQkgKi8KLQlkaSA9IGRpOwotCiAJRE1BX1RSQUNFKCgiJXM6IGRtYV9yeHJlY2xhaW1cbiIsIGRpLT5uYW1lKSk7CiAKIAl3aGlsZSAoKHAgPSBfZG1hX2dldG5leHRyeHAoZGksIHRydWUpKSkKLQkJUEtURlJFRShkaS0+b3NoLCBwLCBmYWxzZSk7CisJCXBrdF9idWZfZnJlZV9za2IoZGktPm9zaCwgcCwgZmFsc2UpOwogfQogCiBzdGF0aWMgdm9pZCAqQkNNRkFTVFBBVEggX2RtYV9nZXRuZXh0cnhwKGRtYV9pbmZvX3QgKmRpLCBib29sIGZvcmNlYWxsKQpAQCAtMTM3Miw3ICsxMzc1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBkbWFfdHhwaW9sb29wYmFjayhvc2xfdCAqb3NoLCBkbWEzMnJlZ3NfdCAqcmVncykKK3ZvaWQgZG1hX3R4cGlvbG9vcGJhY2soc3RydWN0IG9zbF9pbmZvICpvc2gsIGRtYTMycmVnc190ICpyZWdzKQogewogCU9SX1JFRyhvc2gsICZyZWdzLT5jb250cm9sLCBYQ19MRSk7CiB9CkBAIC0xMzk1LDcgKzEzOTgsNyBAQAogICogZGVzY3JpcHRvciByaW5nIHNpemUgYWxpZ25lZCBsb2NhdGlvbi4gVGhpcyB3aWxsIGVuc3VyZSB0aGF0IHRoZSByaW5nIHdpbGwKICAqIG5vdCBjcm9zcyBwYWdlIGJvdW5kYXJ5CiAgKi8KLXN0YXRpYyB2b2lkICpkbWFfcmluZ2FsbG9jKG9zbF90ICpvc2gsIHUzMiBib3VuZGFyeSwgdWludCBzaXplLAorc3RhdGljIHZvaWQgKmRtYV9yaW5nYWxsb2Moc3RydWN0IG9zbF9pbmZvICpvc2gsIHUzMiBib3VuZGFyeSwgdWludCBzaXplLAogCQkJICAgdTE2ICphbGlnbmJpdHMsIHVpbnQgKmFsbG9jZWQsCiAJCQkgICBkbWFhZGRyX3QgKmRlc2NwYSwgb3NsZG1hX3QgKipkbWFoKQogewpAQCAtMTQzNCw3ICsxNDM3LDcgQEAKIAlkaS0+aG5kZG1hLnR4YXZhaWwgPSBkaS0+bnR4ZCAtIDE7CiAKIAkvKiBjbGVhciB0eCBkZXNjcmlwdG9yIHJpbmcgKi8KLQlCWkVST19TTSgodm9pZCAqKWRpLT50eGQzMiwgKGRpLT5udHhkICogc2l6ZW9mKGRtYTMyZGRfdCkpKTsKKwltZW1zZXQoKHZvaWQgKilkaS0+dHhkMzIsICdcMCcsIChkaS0+bnR4ZCAqIHNpemVvZihkbWEzMmRkX3QpKSk7CiAKIAlpZiAoKGRpLT5obmRkbWEuZG1hY3RybGZsYWdzICYgRE1BX0NUUkxfUEVOKSA9PSAwKQogCQljb250cm9sIHw9IFhDX1BEOwpAQCAtMTQ5MSw3ICsxNDk0LDcgQEAKIAkJcmV0dXJuOwogCiAJd2hpbGUgKChwID0gZG1hMzJfZ2V0bmV4dHR4cChkaSwgcmFuZ2UpKSkKLQkJUEtURlJFRShkaS0+b3NoLCBwLCB0cnVlKTsKKwkJcGt0X2J1Zl9mcmVlX3NrYihkaS0+b3NoLCBwLCB0cnVlKTsKIH0KIAogc3RhdGljIGJvb2wgZG1hMzJfdHhzdG9wcGVkKGRtYV9pbmZvX3QgKmRpKQpAQCAtMTY1MSw5ICsxNjU0LDkgQEAKICAqIFdBUk5JTkc6IGNhbGwgbXVzdCBjaGVjayB0aGUgcmV0dXJuIHZhbHVlIGZvciBlcnJvci4KICAqICAgdGhlIGVycm9yKHRvc3MgZnJhbWVzKSBjb3VsZCBiZSBmYXRhbCBhbmQgY2F1c2UgbWFueSBzdWJzZXF1ZW50IGhhcmQgdG8gZGVidWcgcHJvYmxlbXMKICAqLwotc3RhdGljIGludCBkbWEzMl90eGZhc3QoZG1hX2luZm9fdCAqZGksIHZvaWQgKnAwLCBib29sIGNvbW1pdCkKK3N0YXRpYyBpbnQgZG1hMzJfdHhmYXN0KGRtYV9pbmZvX3QgKmRpLCBzdHJ1Y3Qgc2tfYnVmZiAqcDAsIGJvb2wgY29tbWl0KQogewotCXZvaWQgKnAsICpuZXh0OworCXN0cnVjdCBza19idWZmICpwLCAqbmV4dDsKIAl1bnNpZ25lZCBjaGFyICpkYXRhOwogCXVpbnQgbGVuOwogCXUxNiB0eG91dDsKQEAgLTE2NzIsMTIgKzE2NzUsMTIgQEAKIAkJdWludCBuc2VncywgajsKIAkJaG5kZG1hX3NlZ19tYXBfdCAqbWFwOwogCi0JCWRhdGEgPSBQS1REQVRBKHApOwotCQlsZW4gPSBQS1RMRU4ocCk7CisJCWRhdGEgPSBwLT5kYXRhOworCQlsZW4gPSBwLT5sZW47CiAjaWZkZWYgQkNNX0RNQVBBRAogCQlsZW4gKz0gUEtURE1BUEFEKGRpLT5vc2gsIHApOwogI2VuZGlmCi0JCW5leHQgPSBQS1RORVhUKHApOworCQluZXh0ID0gcC0+bmV4dDsKIAogCQkvKiByZXR1cm4gbm9uemVybyBpZiBvdXQgb2YgdHggZGVzY3JpcHRvcnMgKi8KIAkJaWYgKE5FWFRUWEQodHhvdXQpID09IGRpLT50eGluKQpAQCAtMTY4Nyw3ICsxNjkwLDggQEAKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChETUFTR0xJU1RfRU5BQikKLQkJCWJ6ZXJvKCZkaS0+dHhwX2RtYWhbdHhvdXRdLCBzaXplb2YoaG5kZG1hX3NlZ19tYXBfdCkpOworCQkJbWVtc2V0KCZkaS0+dHhwX2RtYWhbdHhvdXRdLCAwLAorCQkJCXNpemVvZihobmRkbWFfc2VnX21hcF90KSk7CiAKIAkJLyogZ2V0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgYnVmZmVyIHN0YXJ0ICovCiAJCXBhID0gRE1BX01BUChkaS0+b3NoLCBkYXRhLCBsZW4sIERNQV9UWCwgcCwKQEAgLTE3NjEsNyArMTc2NSw3IEBACiAKICBvdXRvZnR4ZDoKIAlETUFfRVJST1IoKCIlczogZG1hX3R4ZmFzdDogb3V0IG9mIHR4ZHNcbiIsIGRpLT5uYW1lKSk7Ci0JUEtURlJFRShkaS0+b3NoLCBwMCwgdHJ1ZSk7CisJcGt0X2J1Zl9mcmVlX3NrYihkaS0+b3NoLCBwMCwgdHJ1ZSk7CiAJZGktPmhuZGRtYS50eGF2YWlsID0gMDsKIAlkaS0+aG5kZG1hLnR4bm9idWYrKzsKIAlyZXR1cm4gLTE7CkBAIC0xOTU5LDcgKzE5NjMsNyBAQAogCQlpZiAoRE1BU0dMSVNUX0VOQUIpIHsKIAkJCWJjb3B5KCZkaS0+dHhwX2RtYWhbb2xkXSwgJmRpLT50eHBfZG1haFtuZXddLAogCQkJICAgICAgc2l6ZW9mKGhuZGRtYV9zZWdfbWFwX3QpKTsKLQkJCWJ6ZXJvKCZkaS0+dHhwX2RtYWhbb2xkXSwgc2l6ZW9mKGhuZGRtYV9zZWdfbWFwX3QpKTsKKwkJCW1lbXNldCgmZGktPnR4cF9kbWFoW29sZF0sIDAsIHNpemVvZihobmRkbWFfc2VnX21hcF90KSk7CiAJCX0KIAogCQlkaS0+dHhwW29sZF0gPSBOVUxMOwpAQCAtMTk4OSw3ICsxOTkzLDcgQEAKIAlkaS0+aG5kZG1hLnR4YXZhaWwgPSBkaS0+bnR4ZCAtIDE7CiAKIAkvKiBjbGVhciB0eCBkZXNjcmlwdG9yIHJpbmcgKi8KLQlCWkVST19TTSgodm9pZCAqKWRpLT50eGQ2NCwgKGRpLT5udHhkICogc2l6ZW9mKGRtYTY0ZGRfdCkpKTsKKwltZW1zZXQoKHZvaWQgKilkaS0+dHhkNjQsICdcMCcsIChkaS0+bnR4ZCAqIHNpemVvZihkbWE2NGRkX3QpKSk7CiAKIAkvKiBETUEgZW5naW5lIHdpdGggb3V0IGFsaWdubWVudCByZXF1aXJlbWVudCByZXF1aXJlcyB0YWJsZSB0byBiZSBpbml0ZWQKIAkgKiBiZWZvcmUgZW5hYmxpbmcgdGhlIGVuZ2luZQpAQCAtMjA2MCw3ICsyMDY0LDcgQEAKIAl3aGlsZSAoKHAgPSBkbWE2NF9nZXRuZXh0dHhwKGRpLCByYW5nZSkpKSB7CiAJCS8qIEZvciB1bmZyYW1lZCBkYXRhLCB3ZSBkb24ndCBoYXZlIGFueSBwYWNrZXRzIHRvIGZyZWUgKi8KIAkJaWYgKCEoZGktPmhuZGRtYS5kbWFjdHJsZmxhZ3MgJiBETUFfQ1RSTF9VTkZSQU1FRCkpCi0JCQlQS1RGUkVFKGRpLT5vc2gsIHAsIHRydWUpOworCQkJcGt0X2J1Zl9mcmVlX3NrYihkaS0+b3NoLCBwLCB0cnVlKTsKIAl9CiB9CiAKQEAgLTIzMDAsOSArMjMwNCwxMCBAQAogICogV0FSTklORzogY2FsbCBtdXN0IGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgZm9yIGVycm9yLgogICogICB0aGUgZXJyb3IodG9zcyBmcmFtZXMpIGNvdWxkIGJlIGZhdGFsIGFuZCBjYXVzZSBtYW55IHN1YnNlcXVlbnQgaGFyZCB0byBkZWJ1ZyBwcm9ibGVtcwogICovCi1zdGF0aWMgaW50IEJDTUZBU1RQQVRIIGRtYTY0X3R4ZmFzdChkbWFfaW5mb190ICpkaSwgdm9pZCAqcDAsIGJvb2wgY29tbWl0KQorc3RhdGljIGludCBCQ01GQVNUUEFUSCBkbWE2NF90eGZhc3QoZG1hX2luZm9fdCAqZGksIHN0cnVjdCBza19idWZmICpwMCwKKwkJCQkgICAgYm9vbCBjb21taXQpCiB7Ci0Jdm9pZCAqcCwgKm5leHQ7CisJc3RydWN0IHNrX2J1ZmYgKnAsICpuZXh0OwogCXVuc2lnbmVkIGNoYXIgKmRhdGE7CiAJdWludCBsZW47CiAJdTE2IHR4b3V0OwpAQCAtMjMyMSwxMiArMjMyNiwxMiBAQAogCQl1aW50IG5zZWdzLCBqOwogCQlobmRkbWFfc2VnX21hcF90ICptYXA7CiAKLQkJZGF0YSA9IFBLVERBVEEocCk7Ci0JCWxlbiA9IFBLVExFTihwKTsKKwkJZGF0YSA9IHAtPmRhdGE7CisJCWxlbiA9IHAtPmxlbjsKICNpZmRlZiBCQ01fRE1BUEFECiAJCWxlbiArPSBQS1RETUFQQUQoZGktPm9zaCwgcCk7CiAjZW5kaWYJCQkJLyogQkNNX0RNQVBBRCAqLwotCQluZXh0ID0gUEtUTkVYVChwKTsKKwkJbmV4dCA9IHAtPm5leHQ7CiAKIAkJLyogcmV0dXJuIG5vbnplcm8gaWYgb3V0IG9mIHR4IGRlc2NyaXB0b3JzICovCiAJCWlmIChORVhUVFhEKHR4b3V0KSA9PSBkaS0+dHhpbikKQEAgLTIzMzcsNyArMjM0Miw4IEBACiAKIAkJLyogZ2V0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgYnVmZmVyIHN0YXJ0ICovCiAJCWlmIChETUFTR0xJU1RfRU5BQikKLQkJCWJ6ZXJvKCZkaS0+dHhwX2RtYWhbdHhvdXRdLCBzaXplb2YoaG5kZG1hX3NlZ19tYXBfdCkpOworCQkJbWVtc2V0KCZkaS0+dHhwX2RtYWhbdHhvdXRdLCAwLAorCQkJCXNpemVvZihobmRkbWFfc2VnX21hcF90KSk7CiAKIAkJcGEgPSBETUFfTUFQKGRpLT5vc2gsIGRhdGEsIGxlbiwgRE1BX1RYLCBwLAogCQkJICAgICAmZGktPnR4cF9kbWFoW3R4b3V0XSk7CkBAIC0yNDA5LDcgKzI0MTUsNyBAQAogCiAgb3V0b2Z0eGQ6CiAJRE1BX0VSUk9SKCgiJXM6IGRtYV90eGZhc3Q6IG91dCBvZiB0eGRzICEhIVxuIiwgZGktPm5hbWUpKTsKLQlQS1RGUkVFKGRpLT5vc2gsIHAwLCB0cnVlKTsKKwlwa3RfYnVmX2ZyZWVfc2tiKGRpLT5vc2gsIHAwLCB0cnVlKTsKIAlkaS0+aG5kZG1hLnR4YXZhaWwgPSAwOwogCWRpLT5obmRkbWEudHhub2J1ZisrOwogCXJldHVybiAtMTsKQEAgLTI1NjMsNyArMjU2OSw3IEBACiAJcmV0dXJuIHJ4cDsKIH0KIAotc3RhdGljIGJvb2wgX2RtYTY0X2FkZHJleHQob3NsX3QgKm9zaCwgZG1hNjRyZWdzX3QgKiBkbWE2NHJlZ3MpCitzdGF0aWMgYm9vbCBfZG1hNjRfYWRkcmV4dChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgZG1hNjRyZWdzX3QgKiBkbWE2NHJlZ3MpCiB7CiAJdTMyIHc7CiAJT1JfUkVHKG9zaCwgJmRtYTY0cmVncy0+Y29udHJvbCwgRDY0X1hDX0FFKTsKQEAgLTI2MzUsNyArMjY0MSw3IEBACiAJCWlmIChETUFTR0xJU1RfRU5BQikgewogCQkJYmNvcHkoJmRpLT50eHBfZG1haFtvbGRdLCAmZGktPnR4cF9kbWFoW25ld10sCiAJCQkgICAgICBzaXplb2YoaG5kZG1hX3NlZ19tYXBfdCkpOwotCQkJYnplcm8oJmRpLT50eHBfZG1haFtvbGRdLCBzaXplb2YoaG5kZG1hX3NlZ19tYXBfdCkpOworCQkJbWVtc2V0KCZkaS0+dHhwX2RtYWhbb2xkXSwgMCwgc2l6ZW9mKGhuZGRtYV9zZWdfbWFwX3QpKTsKIAkJfQogCiAJCWRpLT50eHBbb2xkXSA9IE5VTEw7CkBAIC0yNjU0LDcgKzI2NjAsNyBAQAogdWludCBkbWFfYWRkcndpZHRoKHNpX3QgKnNpaCwgdm9pZCAqZG1hcmVncykKIHsKIAlkbWEzMnJlZ3NfdCAqZG1hMzJyZWdzOwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAKIAlvc2ggPSBzaV9vc2goc2loKTsKIApAQCAtMjY2NCw4ICsyNjcwLDggQEAKIAkJLyogYmFja3BsYW5lIGFyZSA2NC1iaXQgY2FwYWJsZSAqLwogCQlpZiAoc2lfYmFja3BsYW5lNjQoc2loKSkKIAkJCS8qIElmIGJ1cyBpcyBTeXN0ZW0gQmFja3BsYW5lIG9yIFBDSUUgdGhlbiB3ZSBjYW4gYWNjZXNzIDY0LWJpdHMgKi8KLQkJCWlmICgoQlVTVFlQRShzaWgtPmJ1c3R5cGUpID09IFNJX0JVUykgfHwKLQkJCSAgICAoKEJVU1RZUEUoc2loLT5idXN0eXBlKSA9PSBQQ0lfQlVTKSAmJgorCQkJaWYgKChzaWgtPmJ1c3R5cGUgPT0gU0lfQlVTKSB8fAorCQkJICAgICgoc2loLT5idXN0eXBlID09IFBDSV9CVVMpICYmCiAJCQkgICAgIChzaWgtPmJ1c2NvcmV0eXBlID09IFBDSUVfQ09SRV9JRCkpKQogCQkJCXJldHVybiBETUFERFJXSURUSF82NDsKIApAQCAtMjY3OSw4ICsyNjg1LDggQEAKIAlkbWEzMnJlZ3MgPSAoZG1hMzJyZWdzX3QgKikgZG1hcmVnczsKIAogCS8qIEZvciBTeXN0ZW0gQmFja3BsYW5lLCBQQ0lFIGJ1cyBvciBhZGRyZXh0IGZlYXR1cmUsIDMyLWJpdHMgb2sgKi8KLQlpZiAoKEJVU1RZUEUoc2loLT5idXN0eXBlKSA9PSBTSV9CVVMpIHx8Ci0JICAgICgoQlVTVFlQRShzaWgtPmJ1c3R5cGUpID09IFBDSV9CVVMpCisJaWYgKChzaWgtPmJ1c3R5cGUgPT0gU0lfQlVTKSB8fAorCSAgICAoKHNpaC0+YnVzdHlwZSA9PSBQQ0lfQlVTKQogCSAgICAgJiYgc2loLT5idXNjb3JldHlwZSA9PSBQQ0lFX0NPUkVfSUQpCiAJICAgIHx8IChfZG1hMzJfYWRkcmV4dChvc2gsIGRtYTMycmVncykpKQogCQlyZXR1cm4gRE1BRERSV0lEVEhfMzI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvaG5kcG11LmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvaG5kcG11LmMKaW5kZXggYThmMzMwNi4uNmNjNTlhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL2huZHBtdS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9obmRwbXUuYwpAQCAtMTMsOSArMTMsMTQgQEAKICAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KICAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4dmVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaWZkZWYgQlJDTV9GVUxMTUFDCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjZW5kaWYKICNpbmNsdWRlIDxiY21kZWZzLmg+CiAjaW5jbHVkZSA8b3NsLmg+CiAjaW5jbHVkZSA8YmNtdXRpbHMuaD4KQEAgLTQwLDIzICs0NSwyMyBAQAogI2RlZmluZQlQTVVfTk9ORShhcmdzKQogCiAvKiBQTEwgY29udHJvbHMvY2xvY2tzICovCi1zdGF0aWMgdm9pZCBzaV9wbXUxX3BsbGluaXQwKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCwgY2hpcGNyZWdzX3QgKmNjLAorc3RhdGljIHZvaWQgc2lfcG11MV9wbGxpbml0MChzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBjaGlwY3JlZ3NfdCAqY2MsCiAJCQkgICAgIHUzMiB4dGFsKTsKLXN0YXRpYyB1MzIgc2lfcG11MV9jcHVjbGswKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCwgY2hpcGNyZWdzX3QgKmNjKTsKLXN0YXRpYyB1MzIgc2lfcG11MV9hbHBjbGswKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCwgY2hpcGNyZWdzX3QgKmNjKTsKK3N0YXRpYyB1MzIgc2lfcG11MV9jcHVjbGswKHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gsIGNoaXBjcmVnc190ICpjYyk7CitzdGF0aWMgdTMyIHNpX3BtdTFfYWxwY2xrMChzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBjaGlwY3JlZ3NfdCAqY2MpOwogCiAvKiBQTVUgcmVzb3VyY2VzICovCiBzdGF0aWMgYm9vbCBzaV9wbXVfcmVzX2RlcGZsdHJfYmIoc2lfdCAqc2loKTsKIHN0YXRpYyBib29sIHNpX3BtdV9yZXNfZGVwZmx0cl9uY2Ioc2lfdCAqc2loKTsKIHN0YXRpYyBib29sIHNpX3BtdV9yZXNfZGVwZmx0cl9wYWxkbyhzaV90ICpzaWgpOwogc3RhdGljIGJvb2wgc2lfcG11X3Jlc19kZXBmbHRyX25wYWxkbyhzaV90ICpzaWgpOwotc3RhdGljIHUzMiBzaV9wbXVfcmVzX2RlcHMoc2lfdCAqc2loLCBvc2xfdCAqb3NoLCBjaGlwY3JlZ3NfdCAqY2MsCitzdGF0aWMgdTMyIHNpX3BtdV9yZXNfZGVwcyhzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBjaGlwY3JlZ3NfdCAqY2MsCiAJCQkgICAgICB1MzIgcnNyY3MsIGJvb2wgYWxsKTsKLXN0YXRpYyB1aW50IHNpX3BtdV9yZXNfdXB0aW1lKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCwgY2hpcGNyZWdzX3QgKmNjLAorc3RhdGljIHVpbnQgc2lfcG11X3Jlc191cHRpbWUoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgY2hpcGNyZWdzX3QgKmNjLAogCQkJICAgICAgdTggcnNyYyk7CiBzdGF0aWMgdm9pZCBzaV9wbXVfcmVzX21hc2tzKHNpX3QgKnNpaCwgdTMyICogcG1pbiwgdTMyICogcG1heCk7CiBzdGF0aWMgdm9pZCBzaV9wbXVfc3B1cmF2b2lkX3BsbHVwZGF0ZShzaV90ICpzaWgsIGNoaXBjcmVnc190ICpjYywKLQkJCQkgICAgICAgb3NsX3QgKm9zaCwgdTggc3B1cmF2b2lkKTsKKwkJCQkgICAgICAgc3RydWN0IG9zbF9pbmZvICpvc2gsIHU4IHNwdXJhdm9pZCk7CiAKIHN0YXRpYyB2b2lkIHNpX3BtdV9zZXRfNDMzMF9wbGxkaXZzKHNpX3QgKnNpaCk7CiAKQEAgLTEwMSw3ICsxMDYsNyBAQAogfQogCiAvKiBTZXR1cCBzd2l0Y2hlciB2b2x0YWdlICovCi12b2lkIHNpX3BtdV9zZXRfc3dpdGNoZXJfdm9sdGFnZShzaV90ICpzaWgsIG9zbF90ICpvc2gsIHU4IGJiX3ZvbHRhZ2UsCit2b2lkIHNpX3BtdV9zZXRfc3dpdGNoZXJfdm9sdGFnZShzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB1OCBiYl92b2x0YWdlLAogCQkJCSB1OCByZl92b2x0YWdlKQogewogCWNoaXBjcmVnc190ICpjYzsKQEAgLTEyNCwxNCArMTI5LDE0IEBACiAJc2lfc2V0Y29yZWlkeChzaWgsIG9yaWdpZHgpOwogfQogCi12b2lkIHNpX3BtdV9zZXRfbGRvX3ZvbHRhZ2Uoc2lfdCAqc2loLCBvc2xfdCAqb3NoLCB1OCBsZG8sIHU4IHZvbHRhZ2UpCit2b2lkIHNpX3BtdV9zZXRfbGRvX3ZvbHRhZ2Uoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdTggbGRvLCB1OCB2b2x0YWdlKQogewogCXU4IHNyX2NudGxfc2hpZnQgPSAwLCByY19zaGlmdCA9IDAsIHNoaWZ0ID0gMCwgbWFzayA9IDA7CiAJdTggYWRkciA9IDA7CiAKIAlBU1NFUlQoc2loLT5jY2NhcHMgJiBDQ19DQVBfUE1VKTsKIAotCXN3aXRjaCAoQ0hJUElEKHNpaC0+Y2hpcCkpIHsKKwlzd2l0Y2ggKHNpaC0+Y2hpcCkgewogCWNhc2UgQkNNNDMzNl9DSElQX0lEOgogCQlzd2l0Y2ggKGxkbykgewogCQljYXNlIFNFVF9MRE9fVk9MVEFHRV9DTERPX1BXTToKQEAgLTE4Miw3ICsxODcsNyBAQAogLyogZDExIHNsb3cgdG8gZmFzdCBjbG9jayB0cmFuc2l0aW9uIHRpbWUgaW4gc2xvdyBjbG9jayBjeWNsZXMgKi8KICNkZWZpbmUgRDExU0NDX1NMT1cyRkFTVF9UUkFOU0lUSU9OCTIKIAotdTE2IHNpX3BtdV9mYXN0X3B3cnVwX2RlbGF5KHNpX3QgKnNpaCwgb3NsX3QgKm9zaCkKK3UxNiBzaV9wbXVfZmFzdF9wd3J1cF9kZWxheShzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoKQogewogCXVpbnQgZGVsYXkgPSBQTVVfTUFYX1RSQU5TSVRJT05fRExZOwogCWNoaXBjcmVnc190ICpjYzsKQEAgLTE5OSw3ICsyMDQsNyBAQAogCWNjID0gc2lfc2V0Y29yZWlkeChzaWgsIFNJX0NDX0lEWCk7CiAJQVNTRVJUKGNjICE9IE5VTEwpOwogCi0Jc3dpdGNoIChDSElQSUQoc2loLT5jaGlwKSkgeworCXN3aXRjaCAoc2loLT5jaGlwKSB7CiAJY2FzZSBCQ000MzIyNF9DSElQX0lEOgogCWNhc2UgQkNNNDMyMjVfQ0hJUF9JRDoKIAljYXNlIEJDTTQzNDIxX0NISVBfSUQ6CkBAIC0yNTksNyArMjY0LDcgQEAKIAlyZXR1cm4gKHUxNikgZGVsYXk7CiB9CiAKLXUzMiBzaV9wbXVfZm9yY2VfaWxwKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCwgYm9vbCBmb3JjZSkKK3UzMiBzaV9wbXVfZm9yY2VfaWxwKHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gsIGJvb2wgZm9yY2UpCiB7CiAJY2hpcGNyZWdzX3QgKmNjOwogCXVpbnQgb3JpZ2lkeDsKQEAgLTU5OSw3ICs2MDQsNyBAQAogCXJzcmNzID0gKHNpaC0+cG11Y2FwcyAmIFBDQVBfUkNfTUFTSykgPj4gUENBUF9SQ19TSElGVDsKIAogCS8qIGRldGVybWluZSBtaW4vbWF4IHJzcmMgbWFza3MgKi8KLQlzd2l0Y2ggKENISVBJRChzaWgtPmNoaXApKSB7CisJc3dpdGNoIChzaWgtPmNoaXApIHsKIAljYXNlIEJDTTQzMjI0X0NISVBfSUQ6CiAJY2FzZSBCQ000MzIyNV9DSElQX0lEOgogCWNhc2UgQkNNNDM0MjFfQ0hJUF9JRDoKQEAgLTY3Nyw3ICs2ODIsNyBAQAogfQogCiAvKiBpbml0aWFsaXplIFBNVSByZXNvdXJjZXMgKi8KLXZvaWQgc2lfcG11X3Jlc19pbml0KHNpX3QgKnNpaCwgb3NsX3QgKm9zaCkKK3ZvaWQgc2lfcG11X3Jlc19pbml0KHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gpCiB7CiAJY2hpcGNyZWdzX3QgKmNjOwogCXVpbnQgb3JpZ2lkeDsKQEAgLTY5Niw3ICs3MDEsNyBAQAogCWNjID0gc2lfc2V0Y29yZWlkeChzaWgsIFNJX0NDX0lEWCk7CiAJQVNTRVJUKGNjICE9IE5VTEwpOwogCi0Jc3dpdGNoIChDSElQSUQoc2loLT5jaGlwKSkgeworCXN3aXRjaCAoc2loLT5jaGlwKSB7CiAJY2FzZSBCQ000MzI5X0NISVBfSUQ6CiAJCS8qIE9wdGltaXplIHJlc291cmNlcyB1cC9kb3duIHRpbWVycyAqLwogCQlpZiAoSVNTSU1fRU5BQihzaWgpKSB7CkBAIC0xMDk1LDcgKzExMDAsNyBAQAogI2lmZGVmIEJDTURCRwogCWNoYXIgY2huWzhdOwogI2VuZGlmCi0Jc3dpdGNoIChDSElQSUQoc2loLT5jaGlwKSkgeworCXN3aXRjaCAoc2loLT5jaGlwKSB7CiAJY2FzZSBCQ000MzI5X0NISVBfSUQ6CiAJCXJldHVybiBwbXUxX3h0YWx0YWIwXzg4MF80MzI5OwogCWNhc2UgQkNNNDMxOV9DSElQX0lEOgpAQCAtMTEyMyw3ICsxMTI4LDcgQEAKIAljaGFyIGNobls4XTsKICNlbmRpZgogCi0Jc3dpdGNoIChDSElQSUQoc2loLT5jaGlwKSkgeworCXN3aXRjaCAoc2loLT5jaGlwKSB7CiAJY2FzZSBCQ000MzI5X0NISVBfSUQ6CiAJCS8qIERlZmF1bHQgdG8gMzg0MDBLaHogKi8KIAkJcmV0dXJuICZwbXUxX3h0YWx0YWIwXzg4MF80MzI5W1BNVTFfWFRBTFRBQjBfODgwXzM4NDAwS107CkBAIC0xMTU1LDcgKzExNjAsNyBAQAogCWNoYXIgY2huWzhdOwogI2VuZGlmCiAKLQlzd2l0Y2ggKENISVBJRChzaWgtPmNoaXApKSB7CisJc3dpdGNoIChzaWgtPmNoaXApIHsKIAljYXNlIEJDTTQzMjlfQ0hJUF9JRDoKIAkJcmV0dXJuIEZWQ09fODgwOwogCWNhc2UgQkNNNDMxOV9DSElQX0lEOgpAQCAtMTE3OCw3ICsxMTgzLDcgQEAKIAogLyogcXVlcnkgYWxwL3h0YWwgY2xvY2sgZnJlcXVlbmN5ICovCiBzdGF0aWMgdTMyCi1zaV9wbXUxX2FscGNsazAoc2lfdCAqc2loLCBvc2xfdCAqb3NoLCBjaGlwY3JlZ3NfdCAqY2MpCitzaV9wbXUxX2FscGNsazAoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgY2hpcGNyZWdzX3QgKmNjKQogewogCWNvbnN0IHBtdTFfeHRhbHRhYjBfdCAqeHQ7CiAJdTMyIHhmOwpAQCAtMTIwMyw3ICsxMjA4LDggQEAKICAqIGNhc2UgdGhlIHh0YWwgZnJlcXVlbmN5IGlzIHVua25vd24gdG8gdGhlIHMvdyBzbyB3ZSBuZWVkIHRvIGNhbGwKICAqIHNpX3BtdTFfeHRhbGRlZjAoKSB3aGVyZXZlciBpdCBpcyBuZWVkZWQgdG8gcmV0dXJuIGEgZGVmYXVsdCB2YWx1ZS4KICAqLwotc3RhdGljIHZvaWQgc2lfcG11MV9wbGxpbml0MChzaV90ICpzaWgsIG9zbF90ICpvc2gsIGNoaXBjcmVnc190ICpjYywgdTMyIHh0YWwpCitzdGF0aWMgdm9pZCBzaV9wbXUxX3BsbGluaXQwKHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gsIGNoaXBjcmVnc190ICpjYywKKwkJCSAgICAgdTMyIHh0YWwpCiB7CiAJY29uc3QgcG11MV94dGFsdGFiMF90ICp4dDsKIAl1MzIgdG1wOwpAQCAtMTIzMyw4ICsxMjM5LDggQEAKIAkgKi8KIAlpZiAoKCgoUl9SRUcob3NoLCAmY2MtPnBtdWNvbnRyb2wpICYgUENUTF9YVEFMRlJFUV9NQVNLKSA+PgogCSAgICAgIFBDVExfWFRBTEZSRVFfU0hJRlQpID09IHh0LT54ZikgJiYKLQkgICAgISgoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMxOV9DSElQX0lEKQotCSAgICAgIHx8IChDSElQSUQoc2loLT5jaGlwKSA9PSBCQ000MzMwX0NISVBfSUQpKSkgeworCSAgICAhKChzaWgtPmNoaXAgPT0gQkNNNDMxOV9DSElQX0lEKQorCSAgICAgIHx8IChzaWgtPmNoaXAgPT0gQkNNNDMzMF9DSElQX0lEKSkpIHsKIAkJUE1VX01TRygoIlBMTCBhbHJlYWR5IHByb2dyYW1tZWQgZm9yICVkLiVkIE1IelxuIiwKIAkJCSB4dC0+ZnJlZiAvIDEwMDAsIHh0LT5mcmVmICUgMTAwMCkpOwogCQlyZXR1cm47CkBAIC0xMjQ0LDcgKzEyNTAsNyBAQAogCVBNVV9NU0coKCJQcm9ncmFtbWluZyBQTEwgZm9yICVkLiVkIE1IelxuIiwgeHQtPmZyZWYgLyAxMDAwLAogCQkgeHQtPmZyZWYgJSAxMDAwKSk7CiAKLQlzd2l0Y2ggKENISVBJRChzaWgtPmNoaXApKSB7CisJc3dpdGNoIChzaWgtPmNoaXApIHsKIAljYXNlIEJDTTQzMjlfQ0hJUF9JRDoKIAkJLyogQ2hhbmdlIHRoZSBCQlBMTCBkcml2ZSBzdHJlbmd0aCB0byA4IGZvciBhbGwgY2hhbm5lbHMgKi8KIAkJYnVmX3N0cmVuZ3RoID0gMHg4ODg4ODg7CkBAIC0xMzUxLDExICsxMzU3LDExIEBACiAJICAgICAgcDJkaXYgPDwgUE1VMV9QTEwwX1BDMF9QMkRJVl9TSElGVCkgJiBQTVUxX1BMTDBfUEMwX1AyRElWX01BU0spOwogCVdfUkVHKG9zaCwgJmNjLT5wbGxjb250cm9sX2RhdGEsIHRtcCk7CiAKLQlpZiAoKENISVBJRChzaWgtPmNoaXApID09IEJDTTQzMzBfQ0hJUF9JRCkpCisJaWYgKChzaWgtPmNoaXAgPT0gQkNNNDMzMF9DSElQX0lEKSkKIAkJc2lfcG11X3NldF80MzMwX3BsbGRpdnMoc2loKTsKIAotCWlmICgoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMyOV9DSElQX0lEKQotCSAgICAmJiAoQ0hJUFJFVihzaWgtPmNoaXByZXYpID09IDApKSB7CisJaWYgKChzaWgtPmNoaXAgPT0gQkNNNDMyOV9DSElQX0lEKQorCSAgICAmJiAoc2loLT5jaGlwcmV2ID09IDApKSB7CiAKIAkJV19SRUcob3NoLCAmY2MtPnBsbGNvbnRyb2xfYWRkciwgUE1VMV9QTEwwX1BMTENUTDEpOwogCQl0bXAgPSBSX1JFRyhvc2gsICZjYy0+cGxsY29udHJvbF9kYXRhKTsKQEAgLTEzNjMsOSArMTM2OSw5IEBACiAJCXRtcCA9IHRtcCB8IERPVDExTUFDXzg4ME1IWl9DTEtfRElWSVNPUl9WQUw7CiAJCVdfUkVHKG9zaCwgJmNjLT5wbGxjb250cm9sX2RhdGEsIHRtcCk7CiAJfQotCWlmICgoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMxOV9DSElQX0lEKSB8fAotCSAgICAoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMzNl9DSElQX0lEKSB8fAotCSAgICAoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMzMF9DSElQX0lEKSkKKwlpZiAoKHNpaC0+Y2hpcCA9PSBCQ000MzE5X0NISVBfSUQpIHx8CisJICAgIChzaWgtPmNoaXAgPT0gQkNNNDMzNl9DSElQX0lEKSB8fAorCSAgICAoc2loLT5jaGlwID09IEJDTTQzMzBfQ0hJUF9JRCkpCiAJCW5kaXZfbW9kZSA9IFBNVTFfUExMMF9QQzJfTkRJVl9NT0RFX01GQjsKIAllbHNlCiAJCW5kaXZfbW9kZSA9IFBNVTFfUExMMF9QQzJfTkRJVl9NT0RFX01BU0g7CkBAIC0xNDA3LDcgKzE0MTMsNyBAQAogCS8qIHRvIG9wZXJhdGUgdGhlIDQzMTkgdXNiIGluIDI0TUh6LzQ4TUh6OyBjaGlwY29udHJvbFsyXVs4NDo4M10gbmVlZHMKIAkgKiB0byBiZSB1cGRhdGVkLgogCSAqLwotCWlmICgoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMxOV9DSElQX0lEKQorCWlmICgoc2loLT5jaGlwID09IEJDTTQzMTlfQ0hJUF9JRCkKIAkgICAgJiYgKHh0LT5mcmVmICE9IFhUQUxfRlJFUV8zMDAwME1IWikpIHsKIAkJV19SRUcob3NoLCAmY2MtPmNoaXBjb250cm9sX2FkZHIsIFBNVTFfUExMMF9DSElQQ1RMMik7CiAJCXRtcCA9CkBAIC0xNDM2LDggKzE0NDIsOCBAQAogCQlQQ1RMX0lMUF9ESVZfTUFTSykgfAogCSAgICAoKHh0LT54ZiA8PCBQQ1RMX1hUQUxGUkVRX1NISUZUKSAmIFBDVExfWFRBTEZSRVFfTUFTSyk7CiAKLQlpZiAoKENISVBJRChzaWgtPmNoaXApID09IEJDTTQzMjlfQ0hJUF9JRCkKLQkgICAgJiYgQ0hJUFJFVihzaWgtPmNoaXByZXYpID09IDApIHsKKwlpZiAoKHNpaC0+Y2hpcCA9PSBCQ000MzI5X0NISVBfSUQpCisJICAgICYmIHNpaC0+Y2hpcHJldiA9PSAwKSB7CiAJCS8qIGNsZWFyIHRoZSBodHN0cmV0Y2ggYmVmb3JlIGNsZWFyaW5nIEhUUmVxRW4gKi8KIAkJQU5EX1JFRyhvc2gsICZjYy0+Y2xrc3RyZXRjaCwgfkNTVFJFVENIX0hUKTsKIAkJdG1wICY9IH5QQ1RMX0hUX1JFUV9FTjsKQEAgLTE0NDgsNyArMTQ1NCw3IEBACiAKIC8qIHF1ZXJ5IHRoZSBDUFUgY2xvY2sgZnJlcXVlbmN5ICovCiBzdGF0aWMgdTMyCi1zaV9wbXUxX2NwdWNsazAoc2lfdCAqc2loLCBvc2xfdCAqb3NoLCBjaGlwY3JlZ3NfdCAqY2MpCitzaV9wbXUxX2NwdWNsazAoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgY2hpcGNyZWdzX3QgKmNjKQogewogCXUzMiB0bXAsIG0xZGl2OwogI2lmZGVmIEJDTURCRwpAQCAtMTUwMiw3ICsxNTA4LDcgQEAKIH0KIAogLyogaW5pdGlhbGl6ZSBQTEwgKi8KLXZvaWQgc2lfcG11X3BsbF9pbml0KHNpX3QgKnNpaCwgb3NsX3QgKm9zaCwgdWludCB4dGFsZnJlcSkKK3ZvaWQgc2lfcG11X3BsbF9pbml0KHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gsIHVpbnQgeHRhbGZyZXEpCiB7CiAJY2hpcGNyZWdzX3QgKmNjOwogCXVpbnQgb3JpZ2lkeDsKQEAgLTE1MTcsNyArMTUyMyw3IEBACiAJY2MgPSBzaV9zZXRjb3JlaWR4KHNpaCwgU0lfQ0NfSURYKTsKIAlBU1NFUlQoY2MgIT0gTlVMTCk7CiAKLQlzd2l0Y2ggKENISVBJRChzaWgtPmNoaXApKSB7CisJc3dpdGNoIChzaWgtPmNoaXApIHsKIAljYXNlIEJDTTQzMjlfQ0hJUF9JRDoKIAkJaWYgKHh0YWxmcmVxID09IDApCiAJCQl4dGFsZnJlcSA9IDM4NDAwOwpAQCAtMTU1NSw3ICsxNTYxLDcgQEAKIH0KIAogLyogcXVlcnkgYWxwL3h0YWwgY2xvY2sgZnJlcXVlbmN5ICovCi11MzIgc2lfcG11X2FscF9jbG9jayhzaV90ICpzaWgsIG9zbF90ICpvc2gpCit1MzIgc2lfcG11X2FscF9jbG9jayhzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoKQogewogCWNoaXBjcmVnc190ICpjYzsKIAl1aW50IG9yaWdpZHg7CkBAIC0xNTcxLDcgKzE1NzcsNyBAQAogCWNjID0gc2lfc2V0Y29yZWlkeChzaWgsIFNJX0NDX0lEWCk7CiAJQVNTRVJUKGNjICE9IE5VTEwpOwogCi0Jc3dpdGNoIChDSElQSUQoc2loLT5jaGlwKSkgeworCXN3aXRjaCAoc2loLT5jaGlwKSB7CiAJY2FzZSBCQ000MzIyNF9DSElQX0lEOgogCWNhc2UgQkNNNDMyMjVfQ0hJUF9JRDoKIAljYXNlIEJDTTQzNDIxX0NISVBfSUQ6CkBAIC0xNjE2LDcgKzE2MjIsNyBAQAogICogcGxscmVnICJwbGwwIiBpLmUuIDEyIGZvciBtYWluIDYgZm9yIHBoeSwgMCBmb3IgbWlzYy4KICAqLwogc3RhdGljIHUzMgotc2lfcG11NV9jbG9jayhzaV90ICpzaWgsIG9zbF90ICpvc2gsIGNoaXBjcmVnc190ICpjYywgdWludCBwbGwwLAorc2lfcG11NV9jbG9jayhzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBjaGlwY3JlZ3NfdCAqY2MsIHVpbnQgcGxsMCwKIAkJCSAgdWludCBtKSB7CiAJdTMyIHRtcCwgZGl2LCBuZGl2LCBwMSwgcDIsIGZjOwogCkBAIC0xNjMxLDcgKzE2MzcsNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNTM1N19DSElQX0lEKSB7CisJaWYgKHNpaC0+Y2hpcCA9PSBCQ001MzU3X0NISVBfSUQpIHsKIAkJLyogRGV0ZWN0IGZhaWx1cmUgaW4gY2xvY2sgc2V0dGluZyAqLwogCQlpZiAoKFJfUkVHKG9zaCwgJmNjLT5jaGlwc3RhdHVzKSAmIDB4NDAwMDApICE9IDApIHsKIAkJCXJldHVybiAxMzMgKiAxMDAwMDAwOwpAQCAtMTY2OSw3ICsxNjc1LDcgQEAKIC8qIEZvciBkZXNpZ25zIHRoYXQgZmVlZCB0aGUgc2FtZSBjbG9jayB0byBib3RoIGJhY2twbGFuZQogICogYW5kIENQVSBqdXN0IHJldHVybiB0aGUgQ1BVIGNsb2NrIHNwZWVkLgogICovCi11MzIgc2lfcG11X3NpX2Nsb2NrKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCkKK3UzMiBzaV9wbXVfc2lfY2xvY2soc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCkKIHsKIAljaGlwY3JlZ3NfdCAqY2M7CiAJdWludCBvcmlnaWR4OwpAQCAtMTY4NSw3ICsxNjkxLDcgQEAKIAljYyA9IHNpX3NldGNvcmVpZHgoc2loLCBTSV9DQ19JRFgpOwogCUFTU0VSVChjYyAhPSBOVUxMKTsKIAotCXN3aXRjaCAoQ0hJUElEKHNpaC0+Y2hpcCkpIHsKKwlzd2l0Y2ggKHNpaC0+Y2hpcCkgewogCWNhc2UgQkNNNDMyMjRfQ0hJUF9JRDoKIAljYXNlIEJDTTQzMjI1X0NISVBfSUQ6CiAJY2FzZSBCQ000MzQyMV9DSElQX0lEOgpAQCAtMTcwMiw3ICsxNzA4LDcgQEAKIAkJCQkgIFBNVTVfTUFJTlBMTF9TSSk7CiAJCWJyZWFrOwogCWNhc2UgQkNNNDMyOV9DSElQX0lEOgotCQlpZiAoQ0hJUFJFVihzaWgtPmNoaXByZXYpID09IDApCisJCWlmIChzaWgtPmNoaXByZXYgPT0gMCkKIAkJCWNsb2NrID0gMzg0MDAgKiAxMDAwOwogCQllbHNlCiAJCQljbG9jayA9IHNpX3BtdTFfY3B1Y2xrMChzaWgsIG9zaCwgY2MpOwpAQCAtMTc0OCw3ICsxNzU0LDcgQEAKIH0KIAogLyogcXVlcnkgQ1BVIGNsb2NrIGZyZXF1ZW5jeSAqLwotdTMyIHNpX3BtdV9jcHVfY2xvY2soc2lfdCAqc2loLCBvc2xfdCAqb3NoKQordTMyIHNpX3BtdV9jcHVfY2xvY2soc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCkKIHsKIAljaGlwY3JlZ3NfdCAqY2M7CiAJdWludCBvcmlnaWR4OwpAQCAtMTc1NywxNCArMTc2MywxNCBAQAogCUFTU0VSVChzaWgtPmNjY2FwcyAmIENDX0NBUF9QTVUpOwogCiAJaWYgKChzaWgtPnBtdXJldiA+PSA1KSAmJgotCSAgICAhKChDSElQSUQoc2loLT5jaGlwKSA9PSBCQ000MzI5X0NISVBfSUQpIHx8Ci0JICAgICAgKENISVBJRChzaWgtPmNoaXApID09IEJDTTQzMTlfQ0hJUF9JRCkgfHwKLQkgICAgICAoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMyMzZfQ0hJUF9JRCkgfHwKLQkgICAgICAoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMzNl9DSElQX0lEKSB8fAotCSAgICAgIChDSElQSUQoc2loLT5jaGlwKSA9PSBCQ000MzMwX0NISVBfSUQpKSkgeworCSAgICAhKChzaWgtPmNoaXAgPT0gQkNNNDMyOV9DSElQX0lEKSB8fAorCSAgICAgIChzaWgtPmNoaXAgPT0gQkNNNDMxOV9DSElQX0lEKSB8fAorCSAgICAgIChzaWgtPmNoaXAgPT0gQkNNNDMyMzZfQ0hJUF9JRCkgfHwKKwkgICAgICAoc2loLT5jaGlwID09IEJDTTQzMzZfQ0hJUF9JRCkgfHwKKwkgICAgICAoc2loLT5jaGlwID09IEJDTTQzMzBfQ0hJUF9JRCkpKSB7CiAJCXVpbnQgcGxsOwogCi0JCXN3aXRjaCAoQ0hJUElEKHNpaC0+Y2hpcCkpIHsKKwkJc3dpdGNoIChzaWgtPmNoaXApIHsKIAkJY2FzZSBCQ001MzU2X0NISVBfSUQ6CiAJCQlwbGwgPSBQTVU1MzU2X01BSU5QTExfUExMMDsKIAkJCWJyZWFrOwpAQCAtMTc5Miw3ICsxNzk4LDcgQEAKIH0KIAogLyogcXVlcnkgbWVtb3J5IGNsb2NrIGZyZXF1ZW5jeSAqLwotdTMyIHNpX3BtdV9tZW1fY2xvY2soc2lfdCAqc2loLCBvc2xfdCAqb3NoKQordTMyIHNpX3BtdV9tZW1fY2xvY2soc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCkKIHsKIAljaGlwY3JlZ3NfdCAqY2M7CiAJdWludCBvcmlnaWR4OwpAQCAtMTgwMSwxNCArMTgwNywxNCBAQAogCUFTU0VSVChzaWgtPmNjY2FwcyAmIENDX0NBUF9QTVUpOwogCiAJaWYgKChzaWgtPnBtdXJldiA+PSA1KSAmJgotCSAgICAhKChDSElQSUQoc2loLT5jaGlwKSA9PSBCQ000MzI5X0NISVBfSUQpIHx8Ci0JICAgICAgKENISVBJRChzaWgtPmNoaXApID09IEJDTTQzMTlfQ0hJUF9JRCkgfHwKLQkgICAgICAoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMzMF9DSElQX0lEKSB8fAotCSAgICAgIChDSElQSUQoc2loLT5jaGlwKSA9PSBCQ000MzM2X0NISVBfSUQpIHx8Ci0JICAgICAgKENISVBJRChzaWgtPmNoaXApID09IEJDTTQzMjM2X0NISVBfSUQpKSkgeworCSAgICAhKChzaWgtPmNoaXAgPT0gQkNNNDMyOV9DSElQX0lEKSB8fAorCSAgICAgIChzaWgtPmNoaXAgPT0gQkNNNDMxOV9DSElQX0lEKSB8fAorCSAgICAgIChzaWgtPmNoaXAgPT0gQkNNNDMzMF9DSElQX0lEKSB8fAorCSAgICAgIChzaWgtPmNoaXAgPT0gQkNNNDMzNl9DSElQX0lEKSB8fAorCSAgICAgIChzaWgtPmNoaXAgPT0gQkNNNDMyMzZfQ0hJUF9JRCkpKSB7CiAJCXVpbnQgcGxsOwogCi0JCXN3aXRjaCAoQ0hJUElEKHNpaC0+Y2hpcCkpIHsKKwkJc3dpdGNoIChzaWgtPmNoaXApIHsKIAkJY2FzZSBCQ001MzU2X0NISVBfSUQ6CiAJCQlwbGwgPSBQTVU1MzU2X01BSU5QTExfUExMMDsKIAkJCWJyZWFrOwpAQCAtMTg0MSw3ICsxODQ3LDcgQEAKIAogc3RhdGljIHUzMiBpbHBjeWNsZXNfcGVyX3NlYzsKIAotdTMyIHNpX3BtdV9pbHBfY2xvY2soc2lfdCAqc2loLCBvc2xfdCAqb3NoKQordTMyIHNpX3BtdV9pbHBfY2xvY2soc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCkKIHsKIAlpZiAoSVNTSU1fRU5BQihzaWgpKQogCQlyZXR1cm4gSUxQX0NMT0NLOwpAQCAtMTkwNSw3ICsxOTExLDcgQEAKICNkZWZpbmUgU0RJT0RfRFJWU1RSX0tFWShjaGlwLCBwbXUpCSgoKGNoaXApIDw8IDE2KSB8IChwbXUpKQogCiB2b2lkCi1zaV9zZGlvZF9kcml2ZV9zdHJlbmd0aF9pbml0KHNpX3QgKnNpaCwgb3NsX3QgKm9zaCwKK3NpX3NkaW9kX2RyaXZlX3N0cmVuZ3RoX2luaXQoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwKIAkJCQkJIHUzMiBkcml2ZXN0cmVuZ3RoKSB7CiAJY2hpcGNyZWdzX3QgKmNjOwogCXVpbnQgb3JpZ2lkeCwgaW50cl92YWwgPSAwOwpAQCAtMTk3Niw3ICsxOTgyLDcgQEAKIH0KIAogLyogaW5pdGlhbGl6ZSBQTVUgKi8KLXZvaWQgc2lfcG11X2luaXQoc2lfdCAqc2loLCBvc2xfdCAqb3NoKQordm9pZCBzaV9wbXVfaW5pdChzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoKQogewogCWNoaXBjcmVnc190ICpjYzsKIAl1aW50IG9yaWdpZHg7CkBAIC0xOTkzLDcgKzE5OTksNyBAQAogCWVsc2UgaWYgKHNpaC0+cG11cmV2ID49IDIpCiAJCU9SX1JFRyhvc2gsICZjYy0+cG11Y29udHJvbCwgUENUTF9OT0lMUF9PTl9XQUlUKTsKIAotCWlmICgoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMyOV9DSElQX0lEKSAmJiAoc2loLT5jaGlwcmV2ID09IDIpKSB7CisJaWYgKChzaWgtPmNoaXAgPT0gQkNNNDMyOV9DSElQX0lEKSAmJiAoc2loLT5jaGlwcmV2ID09IDIpKSB7CiAJCS8qIEZpeCBmb3IgNDMyOWIwIGJhZCBMUE9NIHN0YXRlLiAqLwogCQlXX1JFRyhvc2gsICZjYy0+cmVnY29udHJvbF9hZGRyLCAyKTsKIAkJT1JfUkVHKG9zaCwgJmNjLT5yZWdjb250cm9sX2RhdGEsIDB4MTAwKTsKQEAgLTIwMDgsNyArMjAxNCw3IEBACiAKIC8qIFJldHVybiB1cCB0aW1lIGluIElMUCBjeWNsZXMgZm9yIHRoZSBnaXZlbiByZXNvdXJjZS4gKi8KIHN0YXRpYyB1aW50Ci1zaV9wbXVfcmVzX3VwdGltZShzaV90ICpzaWgsIG9zbF90ICpvc2gsIGNoaXBjcmVnc190ICpjYywKK3NpX3BtdV9yZXNfdXB0aW1lKHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gsIGNoaXBjcmVnc190ICpjYywKIAkJCSAgICAgIHU4IHJzcmMpIHsKIAl1MzIgZGVwczsKIAl1aW50IHVwLCBpLCBkdXAsIGRtYXg7CkBAIC0yMDQ1LDcgKzIwNTEsNyBAQAogCiAvKiBSZXR1cm4gZGVwZW5kYW5jaWVzIChkaXJlY3Qgb3IgYWxsL2luZGlyZWN0KSBmb3IgdGhlIGdpdmVuIHJlc291cmNlcyAqLwogc3RhdGljIHUzMgotc2lfcG11X3Jlc19kZXBzKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCwgY2hpcGNyZWdzX3QgKmNjLCB1MzIgcnNyY3MsCitzaV9wbXVfcmVzX2RlcHMoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgY2hpcGNyZWdzX3QgKmNjLCB1MzIgcnNyY3MsCiAJCWJvb2wgYWxsKQogewogCXUzMiBkZXBzID0gMDsKQEAgLTIwNjUsNyArMjA3MSw3IEBACiB9CiAKIC8qIHBvd2VyIHVwL2Rvd24gT1RQIHRocm91Z2ggUE1VIHJlc291cmNlcyAqLwotdm9pZCBzaV9wbXVfb3RwX3Bvd2VyKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCwgYm9vbCBvbikKK3ZvaWQgc2lfcG11X290cF9wb3dlcihzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBib29sIG9uKQogewogCWNoaXBjcmVnc190ICpjYzsKIAl1aW50IG9yaWdpZHg7CkBAIC0yMDg0LDcgKzIwOTAsNyBAQAogCWNjID0gc2lfc2V0Y29yZWlkeChzaWgsIFNJX0NDX0lEWCk7CiAJQVNTRVJUKGNjICE9IE5VTEwpOwogCi0Jc3dpdGNoIChDSElQSUQoc2loLT5jaGlwKSkgeworCXN3aXRjaCAoc2loLT5jaGlwKSB7CiAJY2FzZSBCQ000MzI5X0NISVBfSUQ6CiAJCXJzcmNzID0gUE1VUkVTX0JJVChSRVM0MzI5X09UUF9QVSk7CiAJCWJyZWFrOwpAQCAtMjEzNSw3ICsyMTQxLDcgQEAKIAlzaV9zZXRjb3JlaWR4KHNpaCwgb3JpZ2lkeCk7CiB9CiAKLXZvaWQgc2lfcG11X3JjYWwoc2lfdCAqc2loLCBvc2xfdCAqb3NoKQordm9pZCBzaV9wbXVfcmNhbChzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoKQogewogCWNoaXBjcmVnc190ICpjYzsKIAl1aW50IG9yaWdpZHg7CkBAIC0yMTQ3LDcgKzIxNTMsNyBAQAogCWNjID0gc2lfc2V0Y29yZWlkeChzaWgsIFNJX0NDX0lEWCk7CiAJQVNTRVJUKGNjICE9IE5VTEwpOwogCi0Jc3dpdGNoIChDSElQSUQoc2loLT5jaGlwKSkgeworCXN3aXRjaCAoc2loLT5jaGlwKSB7CiAJY2FzZSBCQ000MzI5X0NISVBfSUQ6ewogCQkJdTggcmNhbF9jb2RlOwogCQkJdTMyIHZhbDsKQEAgLTIyMTgsNyArMjIyNCw3IEBACiAJc2lfc2V0Y29yZWlkeChzaWgsIG9yaWdpZHgpOwogfQogCi12b2lkIHNpX3BtdV9zcHVyYXZvaWQoc2lfdCAqc2loLCBvc2xfdCAqb3NoLCB1OCBzcHVyYXZvaWQpCit2b2lkIHNpX3BtdV9zcHVyYXZvaWQoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdTggc3B1cmF2b2lkKQogewogCWNoaXBjcmVnc190ICpjYzsKIAl1aW50IG9yaWdpZHgsIGludHJfdmFsOwpAQCAtMjIzMCw3ICsyMjM2LDcgQEAKIAlBU1NFUlQoY2MgIT0gTlVMTCk7CiAKIAkvKiBmb3JjZSB0aGUgSFQgb2ZmICAqLwotCWlmIChDSElQSUQoc2loLT5jaGlwKSA9PSBCQ000MzM2X0NISVBfSUQpIHsKKwlpZiAoc2loLT5jaGlwID09IEJDTTQzMzZfQ0hJUF9JRCkgewogCQl0bXAgPSBSX1JFRyhvc2gsICZjYy0+bWF4X3Jlc19tYXNrKTsKIAkJdG1wICY9IH5SRVM0MzM2X0hUX0FWQUlMOwogCQlXX1JFRyhvc2gsICZjYy0+bWF4X3Jlc19tYXNrLCB0bXApOwpAQCAtMjI0NCw3ICsyMjUwLDcgQEAKIAlzaV9wbXVfc3B1cmF2b2lkX3BsbHVwZGF0ZShzaWgsIGNjLCBvc2gsIHNwdXJhdm9pZCk7CiAKIAkvKiBlbmFibGUgSFQgYmFjayBvbiAgKi8KLQlpZiAoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMzNl9DSElQX0lEKSB7CisJaWYgKHNpaC0+Y2hpcCA9PSBCQ000MzM2X0NISVBfSUQpIHsKIAkJdG1wID0gUl9SRUcob3NoLCAmY2MtPm1heF9yZXNfbWFzayk7CiAJCXRtcCB8PSBSRVM0MzM2X0hUX0FWQUlMOwogCQlXX1JFRyhvc2gsICZjYy0+bWF4X3Jlc19tYXNrLCB0bXApOwpAQCAtMjI1NSw3ICsyMjYxLDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLXNpX3BtdV9zcHVyYXZvaWRfcGxsdXBkYXRlKHNpX3QgKnNpaCwgY2hpcGNyZWdzX3QgKmNjLCBvc2xfdCAqb3NoLAorc2lfcG11X3NwdXJhdm9pZF9wbGx1cGRhdGUoc2lfdCAqc2loLCBjaGlwY3JlZ3NfdCAqY2MsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLAogCQkJICAgdTggc3B1cmF2b2lkKQogewogCXUzMiB0bXAgPSAwOwpAQCAtMjI2MywxNCArMjI2OSwxNCBAQAogCXU4IGJjbTUzNTdfYmNtNDMyMzZfcDFkaXZbXSA9IHsgMHgxLCAweDUsIDB4NSB9OwogCXU4IGJjbTUzNTdfYmNtNDMyMzZfbmRpdltdID0geyAweDMwLCAweGY2LCAweGZjIH07CiAKLQlzd2l0Y2ggKENISVBJRChzaWgtPmNoaXApKSB7CisJc3dpdGNoIChzaWgtPmNoaXApIHsKIAljYXNlIEJDTTUzNTdfQ0hJUF9JRDoKIAljYXNlIEJDTTQzMjM1X0NISVBfSUQ6CiAJY2FzZSBCQ000MzIzNl9DSElQX0lEOgogCWNhc2UgQkNNNDMyMzhfQ0hJUF9JRDoKIAogCQkvKiBCQ001MzU3IG5lZWRzIHRvIHRvdWNoIFBMTDFfUExMQ1RMWzAyXSwgc28gb2Zmc2V0IFBMTDBfUExMQ1RMWzAyXSBieSA2ICovCi0JCXBoeXBsbF9vZmZzZXQgPSAoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNTM1N19DSElQX0lEKSA/IDYgOiAwOworCQlwaHlwbGxfb2Zmc2V0ID0gKHNpaC0+Y2hpcCA9PSBCQ001MzU3X0NISVBfSUQpID8gNiA6IDA7CiAKIAkJLyogUk1XIG9ubHkgdGhlIFAxIGRpdmlkZXIgKi8KIAkJV19SRUcob3NoLCAmY2MtPnBsbGNvbnRyb2xfYWRkciwKQEAgLTI0NTEsNyArMjQ1Nyw3IEBACiAJV19SRUcob3NoLCAmY2MtPnBtdWNvbnRyb2wsIHRtcCk7CiB9CiAKLWJvb2wgc2lfcG11X2lzX290cF9wb3dlcmVkKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCkKK2Jvb2wgc2lfcG11X2lzX290cF9wb3dlcmVkKHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gpCiB7CiAJdWludCBpZHg7CiAJY2hpcGNyZWdzX3QgKmNjOwpAQCAtMjQ2Miw3ICsyNDY4LDcgQEAKIAljYyA9IHNpX3NldGNvcmVpZHgoc2loLCBTSV9DQ19JRFgpOwogCUFTU0VSVChjYyAhPSBOVUxMKTsKIAotCXN3aXRjaCAoQ0hJUElEKHNpaC0+Y2hpcCkpIHsKKwlzd2l0Y2ggKHNpaC0+Y2hpcCkgewogCWNhc2UgQkNNNDMyOV9DSElQX0lEOgogCQlzdCA9IChSX1JFRyhvc2gsICZjYy0+cmVzX3N0YXRlKSAmIFBNVVJFU19CSVQoUkVTNDMyOV9PVFBfUFUpKQogCQkgICAgIT0gMDsKQEAgLTI1MDMsOSArMjUwOSw5IEBACiAKIHZvaWQKICNpZiBkZWZpbmVkKEJDTURCRykKLXNpX3BtdV9zcHJvbV9lbmFibGUoc2lfdCAqc2loLCBvc2xfdCAqb3NoLCBib29sIGVuYWJsZSkKK3NpX3BtdV9zcHJvbV9lbmFibGUoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgYm9vbCBlbmFibGUpCiAjZWxzZQotc2lfcG11X3Nwcm9tX2VuYWJsZShzaV90ICpzaWgsIG9zbF90ICpvc2gsIGJvb2wgZW5hYmxlKQorc2lfcG11X3Nwcm9tX2VuYWJsZShzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBib29sIGVuYWJsZSkKICNlbmRpZgogewogCWNoaXBjcmVnc190ICpjYzsKQEAgLTI1MjEsNyArMjUyNyw3IEBACiB9CiAKIC8qIGluaXRpYWxpemUgUE1VIGNoaXAgY29udHJvbHMgYW5kIG90aGVyIGNoaXAgbGV2ZWwgc3R1ZmYgKi8KLXZvaWQgc2lfcG11X2NoaXBfaW5pdChzaV90ICpzaWgsIG9zbF90ICpvc2gpCit2b2lkIHNpX3BtdV9jaGlwX2luaXQoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCkKIHsKIAl1aW50IG9yaWdpZHg7CiAKQEAgLTI1NDMsMTEgKzI1NDksMTEgQEAKIH0KIAogLyogaW5pdGlhbGl6ZSBQTVUgc3dpdGNoL3JlZ3VsYXRvcnMgKi8KLXZvaWQgc2lfcG11X3N3cmVnX2luaXQoc2lfdCAqc2loLCBvc2xfdCAqb3NoKQordm9pZCBzaV9wbXVfc3dyZWdfaW5pdChzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoKQogewogCUFTU0VSVChzaWgtPmNjY2FwcyAmIENDX0NBUF9QTVUpOwogCi0Jc3dpdGNoIChDSElQSUQoc2loLT5jaGlwKSkgeworCXN3aXRjaCAoc2loLT5jaGlwKSB7CiAJY2FzZSBCQ000MzM2X0NISVBfSUQ6CiAJCS8qIFJlZHVjZSBDTERPIFBXTSBvdXRwdXQgdm9sdGFnZSB0byAxLjJWICovCiAJCXNpX3BtdV9zZXRfbGRvX3ZvbHRhZ2Uoc2loLCBvc2gsIFNFVF9MRE9fVk9MVEFHRV9DTERPX1BXTSwgMHhlKTsKQEAgLTI1NTYsNyArMjU2Miw3IEBACiAJCQkJICAgICAgIDB4ZSk7CiAJCS8qIFJlZHVjZSBMTkxETzEgb3V0cHV0IHZvbHRhZ2UgdG8gMS4yViAqLwogCQlzaV9wbXVfc2V0X2xkb192b2x0YWdlKHNpaCwgb3NoLCBTRVRfTERPX1ZPTFRBR0VfTE5MRE8xLCAweGUpOwotCQlpZiAoQ0hJUFJFVihzaWgtPmNoaXByZXYpID09IDApCisJCWlmIChzaWgtPmNoaXByZXYgPT0gMCkKIAkJCXNpX3BtdV9yZWdjb250cm9sKHNpaCwgMiwgMHg0MDAwMDAsIDB4NDAwMDAwKTsKIAkJYnJlYWs7CiAKQEAgLTI1NzMsNyArMjU3OSw3IEBACiB7CiAJQVNTRVJUKHNpaC0+Y2NjYXBzICYgQ0NfQ0FQX1BNVSk7CiAKLQlzd2l0Y2ggKENISVBJRChzaWgtPmNoaXApKSB7CisJc3dpdGNoIChzaWgtPmNoaXApIHsKIAljYXNlIEJDTTQzMTlfQ0hJUF9JRDoKIAkJaWYgKGVuYWJsZSkKIAkJCXNpX3dyaXRlX3dyYXBwZXJyZWcoc2loLCBBSV9PT0JTRUxPVVRCNzQsCkBAIC0yNTg3LDcgKzI1OTMsNyBAQAogCiAvKiBXYWl0IGZvciBhIHBhcnRpY3VsYXIgY2xvY2sgbGV2ZWwgdG8gYmUgb24gdGhlIGJhY2twbGFuZSAqLwogdTMyCi1zaV9wbXVfd2FpdGZvcmNsa19vbl9iYWNrcGxhbmUoc2lfdCAqc2loLCBvc2xfdCAqb3NoLCB1MzIgY2xrLAorc2lfcG11X3dhaXRmb3JjbGtfb25fYmFja3BsYW5lKHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gsIHUzMiBjbGssCiAJCQkgICAgICAgdTMyIGRlbGF5KQogewogCWNoaXBjcmVnc190ICpjYzsKQEAgLTI2MTYsNyArMjYyMiw3IEBACiAKICNkZWZpbmUgRVhUX0lMUF9IWiAzMjc2OAogCi11MzIgc2lfcG11X21lYXN1cmVfYWxwY2xrKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCkKK3UzMiBzaV9wbXVfbWVhc3VyZV9hbHBjbGsoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCkKIHsKIAljaGlwY3JlZ3NfdCAqY2M7CiAJdWludCBvcmlnaWR4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL2xpbnV4X29zbC5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL2xpbnV4X29zbC5jCmluZGV4IDJiYjViODcuLmU2NzE2ZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9saW51eF9vc2wuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvbGludXhfb3NsLmMKQEAgLTIwLDE0NSArMjAsNTcgQEAKICNpbmNsdWRlIDxhc20vcGFjY2Vzcy5oPgogI2VuZGlmCQkJCS8qIG1pcHMgKi8KICNpbmNsdWRlIDxiY21lbmRpYW4uaD4KLSNpbmNsdWRlIDxsaW51eHZlci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8YmNtZGVmcy5oPgogI2luY2x1ZGUgPG9zbC5oPgogI2luY2x1ZGUgPGJjbXV0aWxzLmg+CiAjaW5jbHVkZSA8cGNpY2ZnLmg+CiAKIAotI2RlZmluZSBQQ0lfQ0ZHX1JFVFJZIAkJMTAKLQogI2RlZmluZSBPU19IQU5ETEVfTUFHSUMJCTB4MTIzNGFiY2QJLyogTWFnaWMgIyB0byByZWNvZ25pc2Ugb3NoICovCiAjZGVmaW5lIEJDTV9NRU1fRklMRU5BTUVfTEVOIAkyNAkvKiBNZW0uIGZpbGVuYW1lIGxlbmd0aCAqLwogCi1zdHJ1Y3Qgb3NsX2luZm8gewotCW9zbF9wdWJpbmZvX3QgcHViOwotCXVpbnQgbWFnaWM7Ci0Jdm9pZCAqcGRldjsKLQl1aW50IGZhaWxlZDsKLQl1aW50IGJ1c3R5cGU7Ci19OwotCiAvKiBHbG9iYWwgQVNTRVJUIHR5cGUgZmxhZyAqLwogdTMyIGdfYXNzZXJ0X3R5cGU7CiAKLSNpZmRlZiBCUkNNX0ZVTExNQUMKLXN0YXRpYyBzMTYgbGludXhiY21lcnJvcm1hcFtdID0geyAwLAkvKiAwICovCi0JLUVJTlZBTCwJCS8qIEJDTUVfRVJST1IgKi8KLQktRUlOVkFMLAkJLyogQkNNRV9CQURBUkcgKi8KLQktRUlOVkFMLAkJLyogQkNNRV9CQURPUFRJT04gKi8KLQktRUlOVkFMLAkJLyogQkNNRV9OT1RVUCAqLwotCS1FSU5WQUwsCQkvKiBCQ01FX05PVERPV04gKi8KLQktRUlOVkFMLAkJLyogQkNNRV9OT1RBUCAqLwotCS1FSU5WQUwsCQkvKiBCQ01FX05PVFNUQSAqLwotCS1FSU5WQUwsCQkvKiBCQ01FX0JBREtFWUlEWCAqLwotCS1FSU5WQUwsCQkvKiBCQ01FX1JBRElPT0ZGICovCi0JLUVJTlZBTCwJCS8qIEJDTUVfTk9UQkFORExPQ0tFRCAqLwotCS1FSU5WQUwsCQkvKiBCQ01FX05PQ0xLICovCi0JLUVJTlZBTCwJCS8qIEJDTUVfQkFEUkFURVNFVCAqLwotCS1FSU5WQUwsCQkvKiBCQ01FX0JBREJBTkQgKi8KLQktRTJCSUcsCQkJLyogQkNNRV9CVUZUT09TSE9SVCAqLwotCS1FMkJJRywJCQkvKiBCQ01FX0JVRlRPT0xPTkcgKi8KLQktRUJVU1ksCQkJLyogQkNNRV9CVVNZICovCi0JLUVJTlZBTCwJCS8qIEJDTUVfTk9UQVNTT0NJQVRFRCAqLwotCS1FSU5WQUwsCQkvKiBCQ01FX0JBRFNTSURMRU4gKi8KLQktRUlOVkFMLAkJLyogQkNNRV9PVVRPRlJBTkdFQ0hBTiAqLwotCS1FSU5WQUwsCQkvKiBCQ01FX0JBRENIQU4gKi8KLQktRUZBVUxULAkJLyogQkNNRV9CQURBRERSICovCi0JLUVOT01FTSwJCS8qIEJDTUVfTk9SRVNPVVJDRSAqLwotCS1FT1BOT1RTVVBQLAkJLyogQkNNRV9VTlNVUFBPUlRFRCAqLwotCS1FTVNHU0laRSwJCS8qIEJDTUVfQkFETEVOR1RIICovCi0JLUVJTlZBTCwJCS8qIEJDTUVfTk9UUkVBRFkgKi8KLQktRVBFUk0sCQkJLyogQkNNRV9OT1RQRVJNSVRURUQgKi8KLQktRU5PTUVNLAkJLyogQkNNRV9OT01FTSAqLwotCS1FSU5WQUwsCQkvKiBCQ01FX0FTU09DSUFURUQgKi8KLQktRVJBTkdFLAkJLyogQkNNRV9SQU5HRSAqLwotCS1FSU5WQUwsCQkvKiBCQ01FX05PVEZPVU5EICovCi0JLUVJTlZBTCwJCS8qIEJDTUVfV01FX05PVF9FTkFCTEVEICovCi0JLUVJTlZBTCwJCS8qIEJDTUVfVFNQRUNfTk9URk9VTkQgKi8KLQktRUlOVkFMLAkJLyogQkNNRV9BQ01fTk9UU1VQUE9SVEVEICovCi0JLUVJTlZBTCwJCS8qIEJDTUVfTk9UX1dNRV9BU1NPQ0lBVElPTiAqLwotCS1FSU8sCQkJLyogQkNNRV9TRElPX0VSUk9SICovCi0JLUVOT0RFViwJCS8qIEJDTUVfRE9OR0xFX0RPV04gKi8KLQktRUlOVkFMLAkJLyogQkNNRV9WRVJTSU9OICovCi0JLUVJTywJCQkvKiBCQ01FX1RYRkFJTCAqLwotCS1FSU8sCQkJLyogQkNNRV9SWEZBSUwgKi8KLQktRUlOVkFMLAkJLyogQkNNRV9OT0RFVklDRSAqLwotCS1FSU5WQUwsCQkvKiBCQ01FX05NT0RFX0RJU0FCTEVEICovCi0JLUVOT0RBVEEsCQkvKiBCQ01FX05PTlJFU0lERU5UICovCi0KLS8qIFdoZW4gYW4gbmV3IGVycm9yIGNvZGUgaXMgYWRkZWQgdG8gYmNtdXRpbHMuaCwgYWRkIG9zCi0gKiBzcGNlY2lmaWMgZXJyb3IgdHJhbnNsYXRpb24gaGVyZSBhcyB3ZWxsCi0gKi8KLS8qIGNoZWNrIGlmIEJDTUVfTEFTVCBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhpcyBmdW5jdGlvbiB3YXMgdXBkYXRlZCAqLwotI2lmIEJDTUVfTEFTVCAhPSAtNDIKLSNlcnJvciAiWW91IG5lZWQgdG8gYWRkIGEgT1MgZXJyb3IgdHJhbnNsYXRpb24gaW4gdGhlIGxpbnV4YmNtZXJyb3JtYXAgXAotCWZvciBuZXcgZXJyb3IgY29kZSBkZWZpbmVkIGluIGJjbXV0aWxzLmgiCi0jZW5kaWYKLX07Ci0KLS8qIHRyYW5zbGF0ZSBiY21lcnJvcnMgaW50byBsaW51eCBlcnJvcnMgKi8KLWludCBvc2xfZXJyb3IoaW50IGJjbWVycm9yKQorc3RydWN0IG9zbF9pbmZvICpvc2xfYXR0YWNoKHZvaWQgKnBkZXYsIHVpbnQgYnVzdHlwZSkKIHsKLQlpZiAoYmNtZXJyb3IgPiAwKQotCQliY21lcnJvciA9IDA7Ci0JZWxzZSBpZiAoYmNtZXJyb3IgPCBCQ01FX0xBU1QpCi0JCWJjbWVycm9yID0gQkNNRV9FUlJPUjsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsKIAotCS8qIEFycmF5IGJvdW5kcyBjb3ZlcmVkIGJ5IEFTU0VSVCBpbiBvc2xfYXR0YWNoICovCi0JcmV0dXJuIGxpbnV4YmNtZXJyb3JtYXBbLWJjbWVycm9yXTsKLX0KLSNlbmRpZiAvKiBCUkNNX0ZVTExNQUMgKi8KLQotb3NsX3QgKm9zbF9hdHRhY2godm9pZCAqcGRldiwgdWludCBidXN0eXBlLCBib29sIHBrdHRhZykKLXsKLQlvc2xfdCAqb3NoOwotCi0Jb3NoID0ga21hbGxvYyhzaXplb2Yob3NsX3QpLCBHRlBfQVRPTUlDKTsKKwlvc2ggPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgb3NsX2luZm8pLCBHRlBfQVRPTUlDKTsKIAlBU1NFUlQob3NoKTsKIAotCWJ6ZXJvKG9zaCwgc2l6ZW9mKG9zbF90KSk7Ci0KLSNpZmRlZiBCUkNNX0ZVTExNQUMKLQkvKiBDaGVjayB0aGF0IGVycm9yIG1hcCBoYXMgdGhlIHJpZ2h0IG51bWJlciBvZiBlbnRyaWVzIGluIGl0ICovCi0JQVNTRVJUKEFCUyhCQ01FX0xBU1QpID09IChBUlJBWV9TSVpFKGxpbnV4YmNtZXJyb3JtYXApIC0gMSkpOwotI2VuZGlmIC8qIEJSQ01fRlVMTE1BQyAqLworCW1lbXNldChvc2gsIDAsIHNpemVvZihzdHJ1Y3Qgb3NsX2luZm8pKTsKIAogCW9zaC0+bWFnaWMgPSBPU19IQU5ETEVfTUFHSUM7Ci0Jb3NoLT5mYWlsZWQgPSAwOwogCW9zaC0+cGRldiA9IHBkZXY7Ci0Jb3NoLT5wdWIucGt0dGFnID0gcGt0dGFnOwogCW9zaC0+YnVzdHlwZSA9IGJ1c3R5cGU7CiAKIAlzd2l0Y2ggKGJ1c3R5cGUpIHsKIAljYXNlIFBDSV9CVVM6CiAJY2FzZSBTSV9CVVM6CiAJY2FzZSBQQ01DSUFfQlVTOgotCQlvc2gtPnB1Yi5tbWJ1cyA9IHRydWU7CisJCW9zaC0+bW1idXMgPSB0cnVlOwogCQlicmVhazsKIAljYXNlIEpUQUdfQlVTOgogCWNhc2UgU0RJT19CVVM6CiAJY2FzZSBVU0JfQlVTOgogCWNhc2UgU1BJX0JVUzoKIAljYXNlIFJQQ19CVVM6Ci0JCW9zaC0+cHViLm1tYnVzID0gZmFsc2U7CisJCW9zaC0+bW1idXMgPSBmYWxzZTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJQVNTRVJUKGZhbHNlKTsKIAkJYnJlYWs7CiAJfQogCi0jaWYgZGVmaW5lZChCQ01EQkcpICYmICFkZWZpbmVkKEJSQ01fRlVMTE1BQykKLQlpZiAocGt0dGFnKSB7Ci0JCXN0cnVjdCBza19idWZmICpza2I7Ci0JCUFTU0VSVChPU0xfUEtUVEFHX1NaIDw9IHNpemVvZihza2ItPmNiKSk7Ci0JfQotI2VuZGlmCiAJcmV0dXJuIG9zaDsKIH0KIAotdm9pZCBvc2xfZGV0YWNoKG9zbF90ICpvc2gpCit2b2lkIG9zbF9kZXRhY2goc3RydWN0IG9zbF9pbmZvICpvc2gpCiB7CiAJaWYgKG9zaCA9PSBOVUxMKQogCQlyZXR1cm47CkBAIC0xNjcsOCArNzksNyBAQAogCWtmcmVlKG9zaCk7CiB9CiAKLS8qIFJldHVybiBhIG5ldyBwYWNrZXQuIHplcm8gb3V0IHBrdHRhZyAqLwotdm9pZCAqQkNNRkFTVFBBVEggb3NsX3BrdGdldChvc2xfdCAqb3NoLCB1aW50IGxlbikKK3N0cnVjdCBza19idWZmICpCQ01GQVNUUEFUSCBwa3RfYnVmX2dldF9za2Ioc3RydWN0IG9zbF9pbmZvICpvc2gsIHVpbnQgbGVuKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAKQEAgLTE3NywyNCArODgsMjAgQEAKIAkJc2tiX3B1dChza2IsIGxlbik7CiAJCXNrYi0+cHJpb3JpdHkgPSAwOwogCi0JCW9zaC0+cHViLnBrdGFsbG9jZWQrKzsKKwkJb3NoLT5wa3RhbGxvY2VkKys7CiAJfQogCi0JcmV0dXJuICh2b2lkICopc2tiOworCXJldHVybiBza2I7CiB9CiAKIC8qIEZyZWUgdGhlIGRyaXZlciBwYWNrZXQuIEZyZWUgdGhlIHRhZyBpZiBwcmVzZW50ICovCi12b2lkIEJDTUZBU1RQQVRIIG9zbF9wa3RmcmVlKG9zbF90ICpvc2gsIHZvaWQgKnAsIGJvb2wgc2VuZCkKK3ZvaWQgQkNNRkFTVFBBVEggcGt0X2J1Zl9mcmVlX3NrYihzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgYm9vbCBzZW5kKQogewotCXN0cnVjdCBza19idWZmICpza2IsICpuc2tiOworCXN0cnVjdCBza19idWZmICpuc2tiOwogCWludCBuZXN0ID0gMDsKIAotCXNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKXA7CiAJQVNTRVJUKHNrYik7CiAKLQlpZiAoc2VuZCAmJiBvc2gtPnB1Yi50eF9mbikKLQkJb3NoLT5wdWIudHhfZm4ob3NoLT5wdWIudHhfY3R4LCBwLCAwKTsKLQogCS8qIHBlcnZlcnNpb246IHdlIHVzZSBza2ItPm5leHQgdG8gY2hhaW4gbXVsdGktc2tiIHBhY2tldHMgKi8KIAl3aGlsZSAoc2tiKSB7CiAJCW5za2IgPSBza2ItPm5leHQ7CkBAIC0yMTEsNjMgKzExOCwxNCBAQAogCQkJICovCiAJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAKLQkJb3NoLT5wdWIucGt0YWxsb2NlZC0tOworCQlvc2gtPnBrdGFsbG9jZWQtLTsKIAkJbmVzdCsrOwogCQlza2IgPSBuc2tiOwogCX0KIH0KIAotdTMyIG9zbF9wY2lfcmVhZF9jb25maWcob3NsX3QgKm9zaCwgdWludCBvZmZzZXQsIHVpbnQgc2l6ZSkKLXsKLQl1aW50IHZhbCA9IDA7Ci0JdWludCByZXRyeSA9IFBDSV9DRkdfUkVUUlk7Ci0KLQlBU1NFUlQoKG9zaCAmJiAob3NoLT5tYWdpYyA9PSBPU19IQU5ETEVfTUFHSUMpKSk7Ci0KLQkvKiBvbmx5IDRieXRlIGFjY2VzcyBzdXBwb3J0ZWQgKi8KLQlBU1NFUlQoc2l6ZSA9PSA0KTsKLQotCWRvIHsKLQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKG9zaC0+cGRldiwgb2Zmc2V0LCAmdmFsKTsKLQkJaWYgKHZhbCAhPSAweGZmZmZmZmZmKQotCQkJYnJlYWs7Ci0JfSB3aGlsZSAocmV0cnktLSk7Ci0KLSNpZmRlZiBCQ01EQkcKLQlpZiAocmV0cnkgPCBQQ0lfQ0ZHX1JFVFJZKQotCQlwcmludGsoIlBDSSBDT05GSUcgUkVBRCBhY2Nlc3MgdG8gJWQgcmVxdWlyZWQgJWQgcmV0cmllc1xuIiwKLQkJICAgICAgIG9mZnNldCwgKFBDSV9DRkdfUkVUUlkgLSByZXRyeSkpOwotI2VuZGlmCQkJCS8qIEJDTURCRyAqLwotCi0JcmV0dXJuIHZhbDsKLX0KLQotdm9pZCBvc2xfcGNpX3dyaXRlX2NvbmZpZyhvc2xfdCAqb3NoLCB1aW50IG9mZnNldCwgdWludCBzaXplLCB1aW50IHZhbCkKLXsKLQl1aW50IHJldHJ5ID0gUENJX0NGR19SRVRSWTsKLQotCUFTU0VSVCgob3NoICYmIChvc2gtPm1hZ2ljID09IE9TX0hBTkRMRV9NQUdJQykpKTsKLQotCS8qIG9ubHkgNGJ5dGUgYWNjZXNzIHN1cHBvcnRlZCAqLwotCUFTU0VSVChzaXplID09IDQpOwotCi0JZG8gewotCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKG9zaC0+cGRldiwgb2Zmc2V0LCB2YWwpOwotCQlpZiAob2Zmc2V0ICE9IFBDSV9CQVIwX1dJTikKLQkJCWJyZWFrOwotCQlpZiAob3NsX3BjaV9yZWFkX2NvbmZpZyhvc2gsIG9mZnNldCwgc2l6ZSkgPT0gdmFsKQotCQkJYnJlYWs7Ci0JfSB3aGlsZSAocmV0cnktLSk7Ci0KLSNpZiBkZWZpbmVkKEJDTURCRykgJiYgIWRlZmluZWQoQlJDTV9GVUxMTUFDKQotCWlmIChyZXRyeSA8IFBDSV9DRkdfUkVUUlkpCi0JCXByaW50aygiUENJIENPTkZJRyBXUklURSBhY2Nlc3MgdG8gJWQgcmVxdWlyZWQgJWQgcmV0cmllc1xuIiwKLQkJICAgICAgIG9mZnNldCwgKFBDSV9DRkdfUkVUUlkgLSByZXRyeSkpOwotI2VuZGlmCQkJCS8qIEJDTURCRyAqLwotfQotCiAvKiByZXR1cm4gYnVzICMgZm9yIHRoZSBwY2kgZGV2aWNlIHBvaW50ZWQgYnkgb3NoLT5wZGV2ICovCi11aW50IG9zbF9wY2lfYnVzKG9zbF90ICpvc2gpCit1aW50IG9zbF9wY2lfYnVzKHN0cnVjdCBvc2xfaW5mbyAqb3NoKQogewogCUFTU0VSVChvc2ggJiYgKG9zaC0+bWFnaWMgPT0gT1NfSEFORExFX01BR0lDKSAmJiBvc2gtPnBkZXYpOwogCkBAIC0yNzUsNDAgKzEzMywzNyBAQAogfQogCiAvKiByZXR1cm4gc2xvdCAjIGZvciB0aGUgcGNpIGRldmljZSBwb2ludGVkIGJ5IG9zaC0+cGRldiAqLwotdWludCBvc2xfcGNpX3Nsb3Qob3NsX3QgKm9zaCkKK3VpbnQgb3NsX3BjaV9zbG90KHN0cnVjdCBvc2xfaW5mbyAqb3NoKQogewogCUFTU0VSVChvc2ggJiYgKG9zaC0+bWFnaWMgPT0gT1NfSEFORExFX01BR0lDKSAmJiBvc2gtPnBkZXYpOwogCiAJcmV0dXJuIFBDSV9TTE9UKCgoc3RydWN0IHBjaV9kZXYgKilvc2gtPnBkZXYpLT5kZXZmbik7CiB9CiAKLXVpbnQgb3NsX2RtYV9jb25zaXN0ZW50X2FsaWduKHZvaWQpCi17Ci0JcmV0dXJuIFBBR0VfU0laRTsKLX0KLQotdm9pZCAqb3NsX2RtYV9hbGxvY19jb25zaXN0ZW50KG9zbF90ICpvc2gsIHVpbnQgc2l6ZSwgdTE2IGFsaWduX2JpdHMsCit2b2lkICpvc2xfZG1hX2FsbG9jX2NvbnNpc3RlbnQoc3RydWN0IG9zbF9pbmZvICpvc2gsIHVpbnQgc2l6ZSwgdTE2IGFsaWduX2JpdHMsCiAJCQkgICAgICAgdWludCAqYWxsb2NlZCwgdW5zaWduZWQgbG9uZyAqcGFwKQogewogCUFTU0VSVCgob3NoICYmIChvc2gtPm1hZ2ljID09IE9TX0hBTkRMRV9NQUdJQykpKTsKIAogCWlmIChhbGlnbl9iaXRzKSB7CiAJCXUxNiBhbGlnbiA9ICgxIDw8IGFsaWduX2JpdHMpOwotCQlpZiAoIUlTX0FMSUdORUQoRE1BX0NPTlNJU1RFTlRfQUxJR04sIGFsaWduKSkKKwkJaWYgKCFJU19BTElHTkVEKFBBR0VfU0laRSwgYWxpZ24pKQogCQkJc2l6ZSArPSBhbGlnbjsKIAkJKmFsbG9jZWQgPSBzaXplOwogCX0KIAlyZXR1cm4gcGNpX2FsbG9jX2NvbnNpc3RlbnQob3NoLT5wZGV2LCBzaXplLCAoZG1hX2FkZHJfdCAqKSBwYXApOwogfQogCi12b2lkIG9zbF9kbWFfZnJlZV9jb25zaXN0ZW50KG9zbF90ICpvc2gsIHZvaWQgKnZhLCB1aW50IHNpemUsIHVuc2lnbmVkIGxvbmcgcGEpCit2b2lkIG9zbF9kbWFfZnJlZV9jb25zaXN0ZW50KHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB2b2lkICp2YSwgdWludCBzaXplLAorCQkJICAgICB1bnNpZ25lZCBsb25nIHBhKQogewogCUFTU0VSVCgob3NoICYmIChvc2gtPm1hZ2ljID09IE9TX0hBTkRMRV9NQUdJQykpKTsKIAogCXBjaV9mcmVlX2NvbnNpc3RlbnQob3NoLT5wZGV2LCBzaXplLCB2YSwgKGRtYV9hZGRyX3QpIHBhKTsKIH0KIAotdWludCBCQ01GQVNUUEFUSCBvc2xfZG1hX21hcChvc2xfdCAqb3NoLCB2b2lkICp2YSwgdWludCBzaXplLCBpbnQgZGlyZWN0aW9uKQordWludCBCQ01GQVNUUEFUSCBvc2xfZG1hX21hcChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqdmEsIHVpbnQgc2l6ZSwKKwkJCSAgICAgaW50IGRpcmVjdGlvbikKIHsKIAlpbnQgZGlyOwogCkBAIC0zMTcsNyArMTcyLDggQEAKIAlyZXR1cm4gcGNpX21hcF9zaW5nbGUob3NoLT5wZGV2LCB2YSwgc2l6ZSwgZGlyKTsKIH0KIAotdm9pZCBCQ01GQVNUUEFUSCBvc2xfZG1hX3VubWFwKG9zbF90ICpvc2gsIHVpbnQgcGEsIHVpbnQgc2l6ZSwgaW50IGRpcmVjdGlvbikKK3ZvaWQgQkNNRkFTVFBBVEggb3NsX2RtYV91bm1hcChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdWludCBwYSwgdWludCBzaXplLAorCQkJICAgICAgIGludCBkaXJlY3Rpb24pCiB7CiAJaW50IGRpcjsKIApAQCAtMzczLDUyICsyMjksMyBAQAogfQogI2VuZGlmCQkJCS8qIGRlZmluZWQoQkNNREJHX0FTU0VSVCkgKi8KIAotI2lmIGRlZmluZWQoQkNNU0RJTykgJiYgIWRlZmluZWQoQlJDTV9GVUxMTUFDKQotdTggb3NsX3JlYWRiKG9zbF90ICpvc2gsIHZvbGF0aWxlIHU4ICpyKQotewotCW9zbF9ycmVnX2ZuX3QgcnJlZyA9ICgob3NsX3B1YmluZm9fdCAqKSBvc2gpLT5ycmVnX2ZuOwotCXZvaWQgKmN0eCA9ICgob3NsX3B1YmluZm9fdCAqKSBvc2gpLT5yZWdfY3R4OwotCi0JcmV0dXJuICh1OCkgKChycmVnKSAoY3R4LCAodm9pZCAqKXIsIHNpemVvZih1OCkpKTsKLX0KLQotdTE2IG9zbF9yZWFkdyhvc2xfdCAqb3NoLCB2b2xhdGlsZSB1MTYgKnIpCi17Ci0Jb3NsX3JyZWdfZm5fdCBycmVnID0gKChvc2xfcHViaW5mb190ICopIG9zaCktPnJyZWdfZm47Ci0Jdm9pZCAqY3R4ID0gKChvc2xfcHViaW5mb190ICopIG9zaCktPnJlZ19jdHg7Ci0KLQlyZXR1cm4gKHUxNikgKChycmVnKSAoY3R4LCAodm9pZCAqKXIsIHNpemVvZih1MTYpKSk7Ci19Ci0KLXUzMiBvc2xfcmVhZGwob3NsX3QgKm9zaCwgdm9sYXRpbGUgdTMyICpyKQotewotCW9zbF9ycmVnX2ZuX3QgcnJlZyA9ICgob3NsX3B1YmluZm9fdCAqKSBvc2gpLT5ycmVnX2ZuOwotCXZvaWQgKmN0eCA9ICgob3NsX3B1YmluZm9fdCAqKSBvc2gpLT5yZWdfY3R4OwotCi0JcmV0dXJuICh1MzIpICgocnJlZykgKGN0eCwgKHZvaWQgKilyLCBzaXplb2YodTMyKSkpOwotfQotCi12b2lkIG9zbF93cml0ZWIob3NsX3QgKm9zaCwgdm9sYXRpbGUgdTggKnIsIHU4IHYpCi17Ci0Jb3NsX3dyZWdfZm5fdCB3cmVnID0gKChvc2xfcHViaW5mb190ICopIG9zaCktPndyZWdfZm47Ci0Jdm9pZCAqY3R4ID0gKChvc2xfcHViaW5mb190ICopIG9zaCktPnJlZ19jdHg7Ci0KLQkoKHdyZWcpIChjdHgsICh2b2lkICopciwgdiwgc2l6ZW9mKHU4KSkpOwotfQotCi12b2lkIG9zbF93cml0ZXcob3NsX3QgKm9zaCwgdm9sYXRpbGUgdTE2ICpyLCB1MTYgdikKLXsKLQlvc2xfd3JlZ19mbl90IHdyZWcgPSAoKG9zbF9wdWJpbmZvX3QgKikgb3NoKS0+d3JlZ19mbjsKLQl2b2lkICpjdHggPSAoKG9zbF9wdWJpbmZvX3QgKikgb3NoKS0+cmVnX2N0eDsKLQotCSgod3JlZykgKGN0eCwgKHZvaWQgKilyLCB2LCBzaXplb2YodTE2KSkpOwotfQotCi12b2lkIG9zbF93cml0ZWwob3NsX3QgKm9zaCwgdm9sYXRpbGUgdTMyICpyLCB1MzIgdikKLXsKLQlvc2xfd3JlZ19mbl90IHdyZWcgPSAoKG9zbF9wdWJpbmZvX3QgKikgb3NoKS0+d3JlZ19mbjsKLQl2b2lkICpjdHggPSAoKG9zbF9wdWJpbmZvX3QgKikgb3NoKS0+cmVnX2N0eDsKLQotCSgod3JlZykgKGN0eCwgKHZvaWQgKilyLCB2LCBzaXplb2YodTMyKSkpOwotfQotI2VuZGlmCS8qIEJDTVNESU8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9uaWNwY2kuYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9uaWNwY2kuYwppbmRleCAyM2Y4NmRkLi41NmU2NThjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvbmljcGNpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL25pY3BjaS5jCkBAIC0xNCw4ICsxNCw5IEBACiAgKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4dmVyLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8YmNtZGVmcy5oPgogI2luY2x1ZGUgPG9zbC5oPgogI2luY2x1ZGUgPGJjbXV0aWxzLmg+CkBAIC0zNSw3ICszNiw3IEBACiAJfSByZWdzOwkJCS8qIE1lbW9yeSBtYXBwZWQgcmVnaXN0ZXIgdG8gdGhlIGNvcmUgKi8KIAogCXNpX3QgKnNpaDsJCS8qIFN5c3RlbSBpbnRlcmNvbm5lY3QgaGFuZGxlICovCi0Jb3NsX3QgKm9zaDsJCS8qIE9TTCBoYW5kbGUgKi8KKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsJCS8qIE9TTCBoYW5kbGUgKi8KIAl1OCBwY2llY2FwX2xjcmVnX29mZnNldDsJLyogUENJRSBjYXBhYmlsaXR5IExDcmVnIG9mZnNldCBpbiB0aGUgY29uZmlnIHNwYWNlICovCiAJYm9vbCBwY2llX3ByNDI3Njc7CiAJdTggcGNpZV9wb2xhcml0eTsKQEAgLTQ3LDcgKzQ4LDggQEAKIAogLyogZGVidWcvdHJhY2UgKi8KICNkZWZpbmUJUENJX0VSUk9SKGFyZ3MpCi0jZGVmaW5lIFBDSUVfUFVCKHNpaCkgKChCVVNUWVBFKChzaWgpLT5idXN0eXBlKSA9PSBQQ0lfQlVTKSAmJiAoKHNpaCktPmJ1c2NvcmV0eXBlID09IFBDSUVfQ09SRV9JRCkpCisjZGVmaW5lIFBDSUVfUFVCKHNpaCkgXAorCSgoKHNpaCktPmJ1c3R5cGUgPT0gUENJX0JVUykgJiYgKChzaWgpLT5idXNjb3JldHlwZSA9PSBQQ0lFX0NPUkVfSUQpKQogCiAvKiByb3V0aW5lcyB0byBhY2Nlc3MgbWRpbyBzbGF2ZSBkZXZpY2UgcmVnaXN0ZXJzICovCiBzdGF0aWMgYm9vbCBwY2llX21kaW9zZXRibG9jayhwY2ljb3JlX2luZm9fdCAqcGksIHVpbnQgYmxrKTsKQEAgLTcxLDM1ICs3Myw2IEBACiAKICNkZWZpbmUgUENJRV9BU1BNKHNpaCkJKChQQ0lFX1BVQihzaWgpKSAmJiAoKChzaWgpLT5idXNjb3JlcmV2ID49IDMpICYmICgoc2loKS0+YnVzY29yZXJldiA8PSA1KSkpCiAKLSNkZWZpbmUgRFdPUkRfQUxJR04oeCkgICh4ICYgfigweDAzKSkKLSNkZWZpbmUgQllURV9QT1MoeCkgKHggJiAweDMpCi0jZGVmaW5lIFdPUkRfUE9TKHgpICh4ICYgMHgxKQotCi0jZGVmaW5lIEJZVEVfU0hJRlQoeCkgICg4ICogQllURV9QT1MoeCkpCi0jZGVmaW5lIFdPUkRfU0hJRlQoeCkgICgxNiAqIFdPUkRfUE9TKHgpKQotCi0jZGVmaW5lIEJZVEVfVkFMKGEsIHgpICgoYSA+PiBCWVRFX1NISUZUKHgpKSAmIDB4RkYpCi0jZGVmaW5lIFdPUkRfVkFMKGEsIHgpICgoYSA+PiBXT1JEX1NISUZUKHgpKSAmIDB4RkZGRikKLQotI2RlZmluZSByZWFkX3BjaV9jZmdfYnl0ZShhKSBcCi0JKEJZVEVfVkFMKE9TTF9QQ0lfUkVBRF9DT05GSUcob3NoLCBEV09SRF9BTElHTihhKSwgNCksIGEpICYgMHhmZikKLQotI2RlZmluZSByZWFkX3BjaV9jZmdfd29yZChhKSBcCi0JKFdPUkRfVkFMKE9TTF9QQ0lfUkVBRF9DT05GSUcob3NoLCBEV09SRF9BTElHTihhKSwgNCksIGEpICYgMHhmZmZmKQotCi0jZGVmaW5lIHdyaXRlX3BjaV9jZmdfYnl0ZShhLCB2YWwpIGRvIHsgXAotCXUzMiB0bXB2YWw7IFwKLQl0bXB2YWwgPSAoT1NMX1BDSV9SRUFEX0NPTkZJRyhvc2gsIERXT1JEX0FMSUdOKGEpLCA0KSAmIH4weEZGIDw8IEJZVEVfUE9TKGEpKSB8IFwKLQkJdmFsIDw8IEJZVEVfUE9TKGEpOyBcCi0JT1NMX1BDSV9XUklURV9DT05GSUcob3NoLCBEV09SRF9BTElHTihhKSwgNCwgdG1wdmFsKTsgXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgd3JpdGVfcGNpX2NmZ193b3JkKGEsIHZhbCkgZG8geyBcCi0JdTMyIHRtcHZhbDsgXAotCXRtcHZhbCA9IChPU0xfUENJX1JFQURfQ09ORklHKG9zaCwgRFdPUkRfQUxJR04oYSksIDQpICYgfjB4RkZGRiA8PCBXT1JEX1BPUyhhKSkgfCBcCi0JCXZhbCA8PCBXT1JEX1BPUyhhKTsgXAotCU9TTF9QQ0lfV1JJVEVfQ09ORklHKG9zaCwgRFdPUkRfQUxJR04oYSksIDQsIHRtcHZhbCk7IFwKLQl9IHdoaWxlICgwKQogCiAvKiBkZWxheSBuZWVkZWQgYmV0d2VlbiB0aGUgbWRpbyBjb250cm9sLyBtZGlvZGF0YSByZWdpc3RlciBkYXRhIGFjY2VzcyAqLwogI2RlZmluZSBQUjI4ODI5X0RFTEFZKCkgdWRlbGF5KDEwKQpAQCAtMTA3LDcgKzgwLDcgQEAKIC8qIEluaXRpYWxpemUgdGhlIFBDSSBjb3JlLiBJdCdzIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIG1ha2Ugc3VyZSB0aGF0IHRoaXMgaXMgZG9uZQogICogb25seSBvbmNlCiAgKi8KLXZvaWQgKnBjaWNvcmVfaW5pdChzaV90ICpzaWgsIG9zbF90ICpvc2gsIHZvaWQgKnJlZ3MpCit2b2lkICpwY2ljb3JlX2luaXQoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqcmVncykKIHsKIAlwY2ljb3JlX2luZm9fdCAqcGk7CiAKQEAgLTE0OSw4ICsxMjIsOCBAQAogLyogcmV0dXJuIGNhcF9vZmZzZXQgaWYgcmVxdWVzdGVkIGNhcGFiaWxpdHkgZXhpc3RzIGluIHRoZSBQQ0kgY29uZmlnIHNwYWNlICovCiAvKiBOb3RlIHRoYXQgaXQncyBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBtYWtlIHN1cmUgaXQncyBhIHBjaSBidXMgKi8KIHU4Ci1wY2ljb3JlX2ZpbmRfcGNpX2NhcGFiaWxpdHkob3NsX3QgKm9zaCwgdTggcmVxX2NhcF9pZCwgdW5zaWduZWQgY2hhciAqYnVmLAotCQkJICAgIHUzMiAqYnVmbGVuKQorcGNpY29yZV9maW5kX3BjaV9jYXBhYmlsaXR5KHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB1OCByZXFfY2FwX2lkLAorCQkJICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdTMyICpidWZsZW4pCiB7CiAJdTggY2FwX2lkOwogCXU4IGNhcF9wdHIgPSAwOwpAQCAtMTU4LDI5ICsxMzEsMjkgQEAKIAl1OCBieXRlX3ZhbDsKIAogCS8qIGNoZWNrIGZvciBIZWFkZXIgdHlwZSAwICovCi0JYnl0ZV92YWwgPSByZWFkX3BjaV9jZmdfYnl0ZShQQ0lfQ0ZHX0hEUik7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUob3NoLT5wZGV2LCBQQ0lfQ0ZHX0hEUiwgJmJ5dGVfdmFsKTsKIAlpZiAoKGJ5dGVfdmFsICYgMHg3ZikgIT0gUENJX0hFQURFUl9OT1JNQUwpCiAJCWdvdG8gZW5kOwogCiAJLyogY2hlY2sgaWYgdGhlIGNhcGFiaWxpdHkgcG9pbnRlciBmaWVsZCBleGlzdHMgKi8KLQlieXRlX3ZhbCA9IHJlYWRfcGNpX2NmZ19ieXRlKFBDSV9DRkdfU1RBVCk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUob3NoLT5wZGV2LCBQQ0lfQ0ZHX1NUQVQsICZieXRlX3ZhbCk7CiAJaWYgKCEoYnl0ZV92YWwgJiBQQ0lfQ0FQUFRSX1BSRVNFTlQpKQogCQlnb3RvIGVuZDsKIAotCWNhcF9wdHIgPSByZWFkX3BjaV9jZmdfYnl0ZShQQ0lfQ0ZHX0NBUFBUUik7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUob3NoLT5wZGV2LCBQQ0lfQ0ZHX0NBUFBUUiwgJmNhcF9wdHIpOwogCS8qIGNoZWNrIGlmIHRoZSBjYXBhYmlsaXR5IHBvaW50ZXIgaXMgMHgwMCAqLwogCWlmIChjYXBfcHRyID09IDB4MDApCiAJCWdvdG8gZW5kOwogCiAJLyogbG9vcCB0aHIndSB0aGUgY2FwYWJpbGl0eSBsaXN0IGFuZCBzZWUgaWYgdGhlIHBjaWUgY2FwYWJpbHR5IGV4aXN0cyAqLwogCi0JY2FwX2lkID0gcmVhZF9wY2lfY2ZnX2J5dGUoY2FwX3B0cik7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUob3NoLT5wZGV2LCBjYXBfcHRyLCAmY2FwX2lkKTsKIAogCXdoaWxlIChjYXBfaWQgIT0gcmVxX2NhcF9pZCkgewotCQljYXBfcHRyID0gcmVhZF9wY2lfY2ZnX2J5dGUoKGNhcF9wdHIgKyAxKSk7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKG9zaC0+cGRldiwgY2FwX3B0ciArIDEsICZjYXBfcHRyKTsKIAkJaWYgKGNhcF9wdHIgPT0gMHgwMCkKIAkJCWJyZWFrOwotCQljYXBfaWQgPSByZWFkX3BjaV9jZmdfYnl0ZShjYXBfcHRyKTsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUob3NoLT5wZGV2LCBjYXBfcHRyLCAmY2FwX2lkKTsKIAl9CiAJaWYgKGNhcF9pZCAhPSByZXFfY2FwX2lkKSB7CiAJCWdvdG8gZW5kOwpAQCAtMTk5LDcgKzE3Miw3IEBACiAJCQlidWZzaXplID0gU1pQQ1IgLSBjYXBfZGF0YTsKIAkJKmJ1ZmxlbiA9IGJ1ZnNpemU7CiAJCXdoaWxlIChidWZzaXplLS0pIHsKLQkJCSpidWYgPSByZWFkX3BjaV9jZmdfYnl0ZShjYXBfZGF0YSk7CisJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShvc2gtPnBkZXYsIGNhcF9kYXRhLCBidWYpOwogCQkJY2FwX2RhdGErKzsKIAkJCWJ1ZisrOwogCQl9CkBAIC0yMTAsNyArMTgzLDggQEAKIAogLyogKioqKiogUmVnaXN0ZXIgQWNjZXNzIEFQSSAqLwogdWludAotcGNpZV9yZWFkcmVnKG9zbF90ICpvc2gsIHNicGNpZXJlZ3NfdCAqcGNpZXJlZ3MsIHVpbnQgYWRkcnR5cGUsIHVpbnQgb2Zmc2V0KQorcGNpZV9yZWFkcmVnKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBzYnBjaWVyZWdzX3QgKnBjaWVyZWdzLCB1aW50IGFkZHJ0eXBlLAorCSAgICAgdWludCBvZmZzZXQpCiB7CiAJdWludCByZXR2YWwgPSAweEZGRkZGRkZGOwogCkBAIC0yMzYsOCArMjEwLDggQEAKIH0KIAogdWludAotcGNpZV93cml0ZXJlZyhvc2xfdCAqb3NoLCBzYnBjaWVyZWdzX3QgKnBjaWVyZWdzLCB1aW50IGFkZHJ0eXBlLCB1aW50IG9mZnNldCwKLQkgICAgICB1aW50IHZhbCkKK3BjaWVfd3JpdGVyZWcoc3RydWN0IG9zbF9pbmZvICpvc2gsIHNicGNpZXJlZ3NfdCAqcGNpZXJlZ3MsIHVpbnQgYWRkcnR5cGUsCisJICAgICAgdWludCBvZmZzZXQsIHVpbnQgdmFsKQogewogCUFTU0VSVChwY2llcmVncyAhPSBOVUxMKTsKIApAQCAtMzczLDE1ICszNDcsMTUgQEAKIAlpZiAoIW9mZnNldCkKIAkJcmV0dXJuIDA7CiAKLQlyZWdfdmFsID0gT1NMX1BDSV9SRUFEX0NPTkZJRyhwaS0+b3NoLCBvZmZzZXQsIHNpemVvZih1MzIpKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGktPm9zaC0+cGRldiwgb2Zmc2V0LCAmcmVnX3ZhbCk7CiAJLyogc2V0IG9wZXJhdGlvbiAqLwogCWlmIChtYXNrKSB7CiAJCWlmICh2YWwpCiAJCQlyZWdfdmFsIHw9IFBDSUVfQ0xLUkVRX0VOQUI7CiAJCWVsc2UKIAkJCXJlZ192YWwgJj0gflBDSUVfQ0xLUkVRX0VOQUI7Ci0JCU9TTF9QQ0lfV1JJVEVfQ09ORklHKHBpLT5vc2gsIG9mZnNldCwgc2l6ZW9mKHUzMiksIHJlZ192YWwpOwotCQlyZWdfdmFsID0gT1NMX1BDSV9SRUFEX0NPTkZJRyhwaS0+b3NoLCBvZmZzZXQsIHNpemVvZih1MzIpKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwaS0+b3NoLT5wZGV2LCBvZmZzZXQsIHJlZ192YWwpOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGktPm9zaC0+cGRldiwgb2Zmc2V0LCAmcmVnX3ZhbCk7CiAJfQogCWlmIChyZWdfdmFsICYgUENJRV9DTEtSRVFfRU5BQikKIAkJcmV0dXJuIDE7CkBAIC0zOTMsNyArMzY3LDcgQEAKIHsKIAl1MzIgdzsKIAlzaV90ICpzaWggPSBwaS0+c2loOwotCW9zbF90ICpvc2ggPSBwaS0+b3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoID0gcGktPm9zaDsKIAlzYnBjaWVyZWdzX3QgKnBjaWVyZWdzID0gcGktPnJlZ3MucGNpZXJlZ3M7CiAKIAlpZiAoIVBDSUVfUFVCKHNpaCkgfHwgc2loLT5idXNjb3JlcmV2IDwgNykKQEAgLTUwMiwxMiArNDc2LDEyIEBACiAKIAkJV19SRUcocGktPm9zaCwgcmVnMTYsIHZhbDE2KTsKIAotCQl3ID0gT1NMX1BDSV9SRUFEX0NPTkZJRyhwaS0+b3NoLCBwaS0+cGNpZWNhcF9sY3JlZ19vZmZzZXQsCi0JCQkJCXNpemVvZih1MzIpKTsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBpLT5vc2gtPnBkZXYsIHBpLT5wY2llY2FwX2xjcmVnX29mZnNldCwKKwkJCQkJJncpOwogCQl3ICY9IH5QQ0lFX0FTUE1fRU5BQjsKIAkJdyB8PSBwaS0+cGNpZV93YXJfYXNwbV9vdnI7Ci0JCU9TTF9QQ0lfV1JJVEVfQ09ORklHKHBpLT5vc2gsIHBpLT5wY2llY2FwX2xjcmVnX29mZnNldCwKLQkJCQkgICAgIHNpemVvZih1MzIpLCB3KTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwaS0+b3NoLT5wZGV2LAorCQkJCQlwaS0+cGNpZWNhcF9sY3JlZ19vZmZzZXQsIHcpOwogCX0KIAogCXJlZzE2ID0gJnBjaWVyZWdzLT5zcHJvbVtTUlNIX0NMS1JFUV9PRkZTRVRfUkVWNV07CkBAIC01NzcsNyArNTUxLDcgQEAKIHN0YXRpYyB2b2lkIHBjaWVfd2FyX3BjaV9zZXR1cChwY2ljb3JlX2luZm9fdCAqcGkpCiB7CiAJc2lfdCAqc2loID0gcGktPnNpaDsKLQlvc2xfdCAqb3NoID0gcGktPm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaCA9IHBpLT5vc2g7CiAJc2JwY2llcmVnc190ICpwY2llcmVncyA9IHBpLT5yZWdzLnBjaWVyZWdzOwogCXUzMiB3OwogCkBAIC02OTQsMTEgKzY2OCw5IEBACiAJaWYgKCFwaSB8fCAhUENJRV9BU1BNKHBpLT5zaWgpKQogCQlyZXR1cm47CiAKLQl3ID0gT1NMX1BDSV9SRUFEX0NPTkZJRyhwaS0+b3NoLCBwaS0+cGNpZWNhcF9sY3JlZ19vZmZzZXQsCi0JCQkJc2l6ZW9mKHUzMikpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwaS0+b3NoLT5wZGV2LCBwaS0+cGNpZWNhcF9sY3JlZ19vZmZzZXQsICZ3KTsKIAl3ICY9IH5QQ0lFX0NBUF9MQ1JFR19BU1BNTDE7Ci0JT1NMX1BDSV9XUklURV9DT05GSUcocGktPm9zaCwgcGktPnBjaWVjYXBfbGNyZWdfb2Zmc2V0LCBzaXplb2YodTMyKSwKLQkJCSAgICAgdyk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwaS0+b3NoLT5wZGV2LCBwaS0+cGNpZWNhcF9sY3JlZ19vZmZzZXQsIHcpOwogCiAJcGktPnBjaWVfcHI0Mjc2NyA9IGZhbHNlOwogfQpAQCAtNzE4LDcgKzY5MCw3IEBACiAKIC8qICoqKioqIFdha2Utb24td2lyZWxlc3MtTEFOIChXT1dMKSBzdXBwb3J0IGZ1bmN0aW9ucyAqKioqKiAqLwogLyogSnVzdCB1c2VzIFBDSSBjb25maWcgYWNjZXNzZXMgdG8gZmluZCBvdXQsIHdoZW4gbmVlZGVkIGJlZm9yZSBzYl9hdHRhY2ggaXMgZG9uZSAqLwotYm9vbCBwY2ljb3JlX3BtZWNhcF9mYXN0KG9zbF90ICpvc2gpCitib29sIHBjaWNvcmVfcG1lY2FwX2Zhc3Qoc3RydWN0IG9zbF9pbmZvICpvc2gpCiB7CiAJdTggY2FwX3B0cjsKIAl1MzIgcG1lY2FwOwpAQCAtNzMwLDcgKzcwMiw3IEBACiAJaWYgKCFjYXBfcHRyKQogCQlyZXR1cm4gZmFsc2U7CiAKLQlwbWVjYXAgPSBPU0xfUENJX1JFQURfQ09ORklHKG9zaCwgY2FwX3B0ciwgc2l6ZW9mKHUzMikpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChvc2gtPnBkZXYsIGNhcF9wdHIsICZwbWVjYXApOwogCiAJcmV0dXJuIChwbWVjYXAgJiBQTUVfQ0FQX1BNX1NUQVRFUykgIT0gMDsKIH0KQEAgLTc1Myw5ICs3MjUsOCBAQAogCiAJCXBpLT5wbWVjYXBfb2Zmc2V0ID0gY2FwX3B0cjsKIAotCQlwbWVjYXAgPQotCQkgICAgT1NMX1BDSV9SRUFEX0NPTkZJRyhwaS0+b3NoLCBwaS0+cG1lY2FwX29mZnNldCwKLQkJCQkJc2l6ZW9mKHUzMikpOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGktPm9zaC0+cGRldiwgcGktPnBtZWNhcF9vZmZzZXQsCisJCQkJCSZwbWVjYXApOwogCiAJCS8qIEF0IGxlYXN0IG9uZSBzdGF0ZSBjYW4gZ2VuZXJhdGUgUE1FICovCiAJCXBpLT5wbWVjYXAgPSAocG1lY2FwICYgUE1FX0NBUF9QTV9TVEFURVMpICE9IDA7CkBAIC03NzQsMTEgKzc0NSwxMSBAQAogCWlmICghcGNpY29yZV9wbWVjYXAocGkpKQogCQlyZXR1cm47CiAKLQl3ID0gT1NMX1BDSV9SRUFEX0NPTkZJRyhwaS0+b3NoLCBwaS0+cG1lY2FwX29mZnNldCArIFBNRV9DU1JfT0ZGU0VULAotCQkJCXNpemVvZih1MzIpKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGktPm9zaC0+cGRldiwgcGktPnBtZWNhcF9vZmZzZXQgKyBQTUVfQ1NSX09GRlNFVCwKKwkJCQkmdyk7CiAJdyB8PSAoUE1FX0NTUl9QTUVfRU4pOwotCU9TTF9QQ0lfV1JJVEVfQ09ORklHKHBpLT5vc2gsIHBpLT5wbWVjYXBfb2Zmc2V0ICsgUE1FX0NTUl9PRkZTRVQsCi0JCQkgICAgIHNpemVvZih1MzIpLCB3KTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBpLT5vc2gtPnBkZXYsCisJCQkJcGktPnBtZWNhcF9vZmZzZXQgKyBQTUVfQ1NSX09GRlNFVCwgdyk7CiB9CiAKIC8qCkBAIC03OTIsOCArNzYzLDggQEAKIAlpZiAoIXBjaWNvcmVfcG1lY2FwKHBpKSkKIAkJcmV0dXJuIGZhbHNlOwogCi0JdyA9IE9TTF9QQ0lfUkVBRF9DT05GSUcocGktPm9zaCwgcGktPnBtZWNhcF9vZmZzZXQgKyBQTUVfQ1NSX09GRlNFVCwKLQkJCQlzaXplb2YodTMyKSk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBpLT5vc2gtPnBkZXYsIHBpLT5wbWVjYXBfb2Zmc2V0ICsgUE1FX0NTUl9PRkZTRVQsCisJCQkJJncpOwogCiAJcmV0dXJuICh3ICYgUE1FX0NTUl9QTUVfU1RBVCkgPT0gUE1FX0NTUl9QTUVfU1RBVDsKIH0KQEAgLTgwOCwyMiArNzc5LDIzIEBACiAJaWYgKCFwY2ljb3JlX3BtZWNhcChwaSkpCiAJCXJldHVybjsKIAotCXcgPSBPU0xfUENJX1JFQURfQ09ORklHKHBpLT5vc2gsIHBpLT5wbWVjYXBfb2Zmc2V0ICsgUE1FX0NTUl9PRkZTRVQsCi0JCQkJc2l6ZW9mKHUzMikpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwaS0+b3NoLT5wZGV2LCBwaS0+cG1lY2FwX29mZnNldCArIFBNRV9DU1JfT0ZGU0VULAorCQkJCSZ3KTsKIAogCVBDSV9FUlJPUigoInBjaWNvcmVfcGNpX3BtZWNsciBQTUVDU1IgOiAweCV4XG4iLCB3KSk7CiAKIAkvKiBQTUVTVEFUIGlzIGNsZWFyZWQgYnkgd3JpdGluZyAxIHRvIGl0ICovCiAJdyAmPSB+KFBNRV9DU1JfUE1FX0VOKTsKIAotCU9TTF9QQ0lfV1JJVEVfQ09ORklHKHBpLT5vc2gsIHBpLT5wbWVjYXBfb2Zmc2V0ICsgUE1FX0NTUl9PRkZTRVQsCi0JCQkgICAgIHNpemVvZih1MzIpLCB3KTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBpLT5vc2gtPnBkZXYsCisJCQkJcGktPnBtZWNhcF9vZmZzZXQgKyBQTUVfQ1NSX09GRlNFVCwgdyk7CiB9CiAKIHUzMiBwY2llX2xjcmVnKHZvaWQgKnBjaCwgdTMyIG1hc2ssIHUzMiB2YWwpCiB7CiAJcGNpY29yZV9pbmZvX3QgKnBpID0gKHBjaWNvcmVfaW5mb190ICopIHBjaDsKIAl1OCBvZmZzZXQ7CisJdTMyIHRtcHZhbDsKIAogCW9mZnNldCA9IHBpLT5wY2llY2FwX2xjcmVnX29mZnNldDsKIAlpZiAoIW9mZnNldCkKQEAgLTgzMSw5ICs4MDMsMTAgQEAKIAogCS8qIHNldCBvcGVyYXRpb24gKi8KIAlpZiAobWFzaykKLQkJT1NMX1BDSV9XUklURV9DT05GSUcocGktPm9zaCwgb2Zmc2V0LCBzaXplb2YodTMyKSwgdmFsKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwaS0+b3NoLT5wZGV2LCBvZmZzZXQsIHZhbCk7CiAKLQlyZXR1cm4gT1NMX1BDSV9SRUFEX0NPTkZJRyhwaS0+b3NoLCBvZmZzZXQsIHNpemVvZih1MzIpKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGktPm9zaC0+cGRldiwgb2Zmc2V0LCAmdG1wdmFsKTsKKwlyZXR1cm4gdG1wdmFsOwogfQogCiB1MzIKQEAgLTg0Miw3ICs4MTUsNyBAQAogCXUzMiByZWdfdmFsID0gMDsKIAlwY2ljb3JlX2luZm9fdCAqcGkgPSAocGNpY29yZV9pbmZvX3QgKikgcGNoOwogCXNicGNpZXJlZ3NfdCAqcGNpZXJlZ3MgPSBwaS0+cmVncy5wY2llcmVnczsKLQlvc2xfdCAqb3NoID0gcGktPm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaCA9IHBpLT5vc2g7CiAKIAlpZiAobWFzaykgewogCQlQQ0lfRVJST1IoKCJQQ0lFUkVHOiAweCV4IHdyaXRldmFsICAweCV4XG4iLCBvZmZzZXQsIHZhbCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL252cmFtL252cmFtX3JvLmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvbnZyYW0vbnZyYW1fcm8uYwppbmRleCBmODAzNzVjLi5lNGQ0MWVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvbnZyYW0vbnZyYW1fcm8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvbnZyYW0vbnZyYW1fcm8uYwpAQCAtNDksNyArNDksNyBAQAogLyogY29weSBmbGFzaCB0byByYW0gKi8KIHN0YXRpYyB2b2lkIGdldF9mbGFzaF9udnJhbShzaV90ICpzaWgsIHN0cnVjdCBudnJhbV9oZWFkZXIgKm52aCkKIHsKLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCXVpbnQgbnZzLCBidWZzejsKIAl2YXJzX3QgKm5ldzsKIApAQCAtMTMzLDcgKzEzMyw3IEBACiAJbGVuID0gc3RybGVuKG5hbWUpOwogCiAJZm9yIChzID0gdmFyczsgKHMgPCBsaW0pICYmICpzOykgewotCQlpZiAoKGJjbXAocywgbmFtZSwgbGVuKSA9PSAwKSAmJiAoc1tsZW5dID09ICc9JykpCisJCWlmICgobWVtY21wKHMsIG5hbWUsIGxlbikgPT0gMCkgJiYgKHNbbGVuXSA9PSAnPScpKQogCQkJcmV0dXJuICZzW2xlbiArIDFdOwogCiAJCXdoaWxlICgqcysrKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL3NidXRpbHMuYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9zYnV0aWxzLmMKaW5kZXggZTRjMGJhYi4uNjNjM2FiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL3NidXRpbHMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvc2J1dGlscy5jCkBAIC0xNiw2ICsxNiw5IEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KKyNpZmRlZiBCUkNNX0ZVTExNQUMKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNlbmRpZgogI2luY2x1ZGUgPG9zbC5oPgogI2luY2x1ZGUgPGJjbXV0aWxzLmg+CiAjaW5jbHVkZSA8c2l1dGlscy5oPgpAQCAtODcsNyArOTAsNyBAQAogewogCXUzMiBzYmFkZHIgPSAwOwogCi0Jc3dpdGNoIChCVVNUWVBFKHNpaS0+cHViLmJ1c3R5cGUpKSB7CisJc3dpdGNoIChzaWktPnB1Yi5idXN0eXBlKSB7CiAJY2FzZSBTUElfQlVTOgogCWNhc2UgU0RJT19CVVM6CiAJCXNiYWRkciA9ICh1MzIpKHVuc2lnbmVkIGxvbmcpc2lpLT5jdXJtYXA7CkBAIC0yNDgsNyArMjUxLDcgQEAKIAkJCWVsc2UgewogCQkJCS8qIE9sZGVyIGNoaXBzICovCiAJCQkJU0lfRVJST1IoKCJzYl9jaGlwMm51bWNvcmVzOiB1bnN1cHBvcnRlZCBjaGlwICIKLQkJCQkJIjB4JXhcbiIsIENISVBJRChzaWktPnB1Yi5jaGlwKSkpOworCQkJCQkJICAiMHgleFxuIiwgc2lpLT5wdWIuY2hpcCkpOwogCQkJCUFTU0VSVCgwKTsKIAkJCQludW1jb3JlcyA9IDE7CiAJCQl9CkBAIC0zNDQsNyArMzQ3LDcgQEAKIAl1MzIgc2JhZGRyID0gc2lpLT5jb3Jlc2JhW2NvcmVpZHhdOwogCXZvaWQgKnJlZ3M7CiAKLQlzd2l0Y2ggKEJVU1RZUEUoc2lpLT5wdWIuYnVzdHlwZSkpIHsKKwlzd2l0Y2ggKHNpaS0+cHViLmJ1c3R5cGUpIHsKICNpZmRlZiBCQ01TRElPCiAJY2FzZSBTUElfQlVTOgogCWNhc2UgU0RJT19CVVM6CkBAIC00MDksOCArNDEyLDggQEAKIAogCXNpaSA9IFNJX0lORk8oc2loKTsKIAotCWlmICgoQlVTVFlQRShzaWktPnB1Yi5idXN0eXBlKSA9PSBTRElPX0JVUykgfHwKLQkgICAgKEJVU1RZUEUoc2lpLT5wdWIuYnVzdHlwZSkgPT0gU1BJX0JVUykpIHsKKwlpZiAoKHNpaS0+cHViLmJ1c3R5cGUgPT0gU0RJT19CVVMpIHx8CisJICAgIChzaWktPnB1Yi5idXN0eXBlID09IFNQSV9CVVMpKSB7CiAKIAkJSU5UUl9PRkYoc2lpLCBpbnRyX3ZhbCk7CiAJCW9yaWdpZHggPSBzaV9jb3JlaWR4KHNpaCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvc2l1dGlscy5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL3NpdXRpbHMuYwppbmRleCBmM2VhN2UxLi5iNjZkZTliIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvc2l1dGlscy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9zaXV0aWxzLmMKQEAgLTE0LDExICsxNCwxNiBAQAogICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxiY21kZWZzLmg+CisjaWZkZWYgQlJDTV9GVUxMTUFDCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjZW5kaWYKICNpbmNsdWRlIDxvc2wuaD4KLSNpbmNsdWRlIDxsaW51eHZlci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGJjbXV0aWxzLmg+CiAjaW5jbHVkZSA8c2l1dGlscy5oPgogI2luY2x1ZGUgPGJjbWRldnMuaD4KQEAgLTUzLDcgKzU4LDcgQEAKICNlbmRpZgogCiAvKiBsb2NhbCBwcm90b3R5cGVzICovCi1zdGF0aWMgc2lfaW5mb190ICpzaV9kb2F0dGFjaChzaV9pbmZvX3QgKnNpaSwgdWludCBkZXZpZCwgb3NsX3QgKm9zaCwKK3N0YXRpYyBzaV9pbmZvX3QgKnNpX2RvYXR0YWNoKHNpX2luZm9fdCAqc2lpLCB1aW50IGRldmlkLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwKIAkJCSAgICAgIHZvaWQgKnJlZ3MsIHVpbnQgYnVzdHlwZSwgdm9pZCAqc2RoLCBjaGFyICoqdmFycywKIAkJCSAgICAgIHVpbnQgKnZhcnN6KTsKIHN0YXRpYyBib29sIHNpX2J1c2NvcmVfcHJlcChzaV9pbmZvX3QgKnNpaSwgdWludCBidXN0eXBlLCB1aW50IGRldmlkLApAQCAtODEsOCArODYsOCBAQAogICogdmFycyAtIHBvaW50ZXIgdG8gYSBwb2ludGVyIGFyZWEgZm9yICJlbnZpcm9ubWVudCIgdmFyaWFibGVzCiAgKiB2YXJzeiAtIHBvaW50ZXIgdG8gaW50IHRvIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgdmFycwogICovCi1zaV90ICpzaV9hdHRhY2godWludCBkZXZpZCwgb3NsX3QgKm9zaCwgdm9pZCAqcmVncywgdWludCBidXN0eXBlLCB2b2lkICpzZGgsCi0JCWNoYXIgKip2YXJzLCB1aW50ICp2YXJzeikKK3NpX3QgKnNpX2F0dGFjaCh1aW50IGRldmlkLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqcmVncywgdWludCBidXN0eXBlLAorCQl2b2lkICpzZGgsIGNoYXIgKip2YXJzLCB1aW50ICp2YXJzeikKIHsKIAlzaV9pbmZvX3QgKnNpaTsKIApAQCAtMTEzLDEyICsxMTgsMTIgQEAKIAogI2lmbmRlZiBCUkNNX0ZVTExNQUMKIAkvKiBrbHVkZ2UgdG8gZW5hYmxlIHRoZSBjbG9jayBvbiB0aGUgNDMwNiB3aGljaCBsYWNrcyBhIHNsb3djbG9jayAqLwotCWlmIChCVVNUWVBFKGJ1c3R5cGUpID09IFBDSV9CVVMgJiYgIXNpX2lzcGNpZShzaWkpKQorCWlmIChidXN0eXBlID09IFBDSV9CVVMgJiYgIXNpX2lzcGNpZShzaWkpKQogCQlzaV9jbGtjdGxfeHRhbCgmc2lpLT5wdWIsIFhUQUwgfCBQTEwsIE9OKTsKICNlbmRpZgogCiAjaWYgZGVmaW5lZChCQ01TRElPKQotCWlmIChCVVNUWVBFKGJ1c3R5cGUpID09IFNESU9fQlVTKSB7CisJaWYgKGJ1c3R5cGUgPT0gU0RJT19CVVMpIHsKIAkJaW50IGVycjsKIAkJdTggY2xrc2V0OwogCkBAIC0yMjAsNyArMjI1LDcgQEAKIAkJU0lfVk1TRygoIkNPUkVbJWRdOiBpZCAweCV4IHJldiAlZCBiYXNlIDB4JXggcmVncyAweCVwXG4iLAogCQkJIGksIGNpZCwgY3Jldiwgc2lpLT5jb3Jlc2JhW2ldLCBzaWktPnJlZ3NbaV0pKTsKIAotCQlpZiAoQlVTVFlQRShidXN0eXBlKSA9PSBQQ0lfQlVTKSB7CisJCWlmIChidXN0eXBlID09IFBDSV9CVVMpIHsKIAkJCWlmIChjaWQgPT0gUENJX0NPUkVfSUQpIHsKIAkJCQlwY2lpZHggPSBpOwogCQkJCXBjaXJldiA9IGNyZXY7CkBAIC0yMzIsOCArMjM3LDggQEAKIAkJCX0KIAkJfQogI2lmZGVmIEJDTVNESU8KLQkJZWxzZSBpZiAoKChCVVNUWVBFKGJ1c3R5cGUpID09IFNESU9fQlVTKSB8fAotCQkJICAoQlVTVFlQRShidXN0eXBlKSA9PSBTUElfQlVTKSkgJiYKKwkJZWxzZSBpZiAoKChidXN0eXBlID09IFNESU9fQlVTKSB8fAorCQkJICAoYnVzdHlwZSA9PSBTUElfQlVTKSkgJiYKIAkJCSAoKGNpZCA9PSBQQ01DSUFfQ09SRV9JRCkgfHwgKGNpZCA9PSBTRElPRF9DT1JFX0lEKSkpIHsKIAkJCXNpaS0+cHViLmJ1c2NvcmVyZXYgPSBjcmV2OwogCQkJc2lpLT5wdWIuYnVzY29yZXR5cGUgPSBjaWQ7CkBAIC0yNTUsNyArMjYwLDcgQEAKIAkqIG9yIGRvd25sb2FkZWQgY29kZSB3YXMKIAkqIGFscmVhZHkgcnVubmluZy4KIAkqLwotCWlmICgoQlVTVFlQRShidXN0eXBlKSA9PSBTRElPX0JVUykgfHwgKEJVU1RZUEUoYnVzdHlwZSkgPT0gU1BJX0JVUykpIHsKKwlpZiAoKGJ1c3R5cGUgPT0gU0RJT19CVVMpIHx8IChidXN0eXBlID09IFNQSV9CVVMpKSB7CiAJCWlmIChzaV9zZXRjb3JlKCZzaWktPnB1YiwgQVJNN1NfQ09SRV9JRCwgMCkgfHwKIAkJCXNpX3NldGNvcmUoJnNpaS0+cHViLCBBUk1DTTNfQ09SRV9JRCwgMCkpCiAJCQlzaV9jb3JlX2Rpc2FibGUoJnNpaS0+cHViLCAwKTsKQEAgLTI4MSw3ICsyODYsNyBAQAogCQkgc2lpLT5wdWIuYnVzY29yZXR5cGUsIHNpaS0+cHViLmJ1c2NvcmVyZXYpKTsKIAogCS8qIGZpeHVwIG5lY2Vzc2FyeSBjaGlwL2NvcmUgY29uZmlndXJhdGlvbnMgKi8KLQlpZiAoQlVTVFlQRShzaWktPnB1Yi5idXN0eXBlKSA9PSBQQ0lfQlVTKSB7CisJaWYgKHNpaS0+cHViLmJ1c3R5cGUgPT0gUENJX0JVUykgewogCQlpZiAoU0lfRkFTVChzaWkpKSB7CiAJCQlpZiAoIXNpaS0+cGNoKSB7CiAJCQkJc2lpLT5wY2ggPSAodm9pZCAqKXBjaWNvcmVfaW5pdCgKQEAgLTMwOCwxMCArMzEzLDEwIEBACiAJdWludCB3ID0gMDsKIAogCS8qIGdldCBib2FyZHR5cGUgYW5kIGJvYXJkcmV2ICovCi0Jc3dpdGNoIChCVVNUWVBFKHNpaS0+cHViLmJ1c3R5cGUpKSB7CisJc3dpdGNoIChzaWktPnB1Yi5idXN0eXBlKSB7CiAJY2FzZSBQQ0lfQlVTOgogCQkvKiBkbyBhIHBjaSBjb25maWcgcmVhZCB0byBnZXQgc3Vic3lzdGVtIGlkIGFuZCBzdWJ2ZW5kb3IgaWQgKi8KLQkJdyA9IE9TTF9QQ0lfUkVBRF9DT05GSUcoc2lpLT5vc2gsIFBDSV9DRkdfU1ZJRCwgc2l6ZW9mKHUzMikpOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoc2lpLT5vc2gtPnBkZXYsIFBDSV9DRkdfU1ZJRCwgJncpOwogCQkvKiBMZXQgbnZyYW0gdmFyaWFibGVzIG92ZXJyaWRlIHN1YnN5c3RlbSBWZW5kL0lEICovCiAJCXNpaS0+cHViLmJvYXJkdmVuZG9yID0gKHUxNilzaV9nZXRkZXZwYXRoaW50dmFyKCZzaWktPnB1YiwKIAkJCSJib2FyZHZlbmRvciIpOwpAQCAtMzY0LDcgKzM2OSw3IEBACiAvKiB0aGlzIGlzIHdpbGwgbWFrZSBTb25pY3MgY2FsbHMgZGlyZWN0bHksIHNpbmNlIFNvbmljcyBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGluIHRoZSBTaSBhYnN0cmFjdGlvbiAqLwogLyogdGhpcyBoYXMgYmVlbiBjdXN0b21pemVkIGZvciB0aGUgYmNtIDQzMjkgT05MWSAqLwogI2lmZGVmIEJDTVNESU8KLXN0YXRpYyBzaV9pbmZvX3QgKnNpX2RvYXR0YWNoKHNpX2luZm9fdCAqc2lpLCB1aW50IGRldmlkLCBvc2xfdCAqb3NoLAorc3RhdGljIHNpX2luZm9fdCAqc2lfZG9hdHRhY2goc2lfaW5mb190ICpzaWksIHVpbnQgZGV2aWQsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLAogCQkJICAgICAgdm9pZCAqcmVncywgdWludCBidXN0eXBlLCB2b2lkICpzZGgsCiAJCQkgICAgICBjaGFyICoqdmFycywgdWludCAqdmFyc3opCiB7CkBAIC0zNzYsNyArMzgxLDcgQEAKIAogCUFTU0VSVChHT09EUkVHUyhyZWdzKSk7CiAKLQliemVybygodW5zaWduZWQgY2hhciAqKSBzaWksIHNpemVvZihzaV9pbmZvX3QpKTsKKwltZW1zZXQoKHVuc2lnbmVkIGNoYXIgKikgc2lpLCAwLCBzaXplb2Yoc2lfaW5mb190KSk7CiAKIAlzYXZld2luID0gMDsKIApAQCAtMzkwLDExICszOTUsNiBAQAogCWNjID0gKGNoaXBjcmVnc190ICopIHNpaS0+Y3VybWFwOwogCXNpaC0+YnVzdHlwZSA9IGJ1c3R5cGU7CiAKLQlpZiAoYnVzdHlwZSAhPSBCVVNUWVBFKGJ1c3R5cGUpKSB7Ci0JCVNJX0VSUk9SKCgic2lfZG9hdHRhY2g6IGJ1cyB0eXBlICVkIGRvZXMgbm90IG1hdGNoIGNvbmZpZ3VyZWQgYnVzIHR5cGUgJWRcbiIsIGJ1c3R5cGUsIEJVU1RZUEUoYnVzdHlwZSkpKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCiAJLyogYnVzL2NvcmUvY2xrIHNldHVwIGZvciByZWdpc3RlciBhY2Nlc3MgKi8KIAlpZiAoIXNpX2J1c2NvcmVfcHJlcChzaWksIGJ1c3R5cGUsIGRldmlkLCBzZGgpKSB7CiAJCVNJX0VSUk9SKCgic2lfZG9hdHRhY2g6IHNpX2NvcmVfY2xrX3ByZXAgZmFpbGVkICVkXG4iLApAQCAtNDE0LDcgKzQxNCw3IEBACiAJc2loLT5jaGlwcmV2ID0gKHcgJiBDSURfUkVWX01BU0spID4+IENJRF9SRVZfU0hJRlQ7CiAJc2loLT5jaGlwcGtnID0gKHcgJiBDSURfUEtHX01BU0spID4+IENJRF9QS0dfU0hJRlQ7CiAKLQlpZiAoKENISVBJRChzaWgtPmNoaXApID09IEJDTTQzMjlfQ0hJUF9JRCkgJiYKKwlpZiAoKHNpaC0+Y2hpcCA9PSBCQ000MzI5X0NISVBfSUQpICYmCiAJCShzaWgtPmNoaXBwa2cgIT0gQkNNNDMyOV8yODlQSU5fUEtHX0lEKSkKIAkJCXNpaC0+Y2hpcHBrZyA9IEJDTTQzMjlfMTgyUElOX1BLR19JRDsKIApAQCAtNDQ0LDcgKzQ0NCw3IEBACiAKIAkvKiBJbml0IG52cmFtIGZyb20gc3Byb20vb3RwIGlmIHRoZXkgZXhpc3QgKi8KIAlpZiAoc3JvbV92YXJfaW5pdAotCSAgICAoJnNpaS0+cHViLCBCVVNUWVBFKGJ1c3R5cGUpLCByZWdzLCBzaWktPm9zaCwgdmFycywgdmFyc3opKSB7CisJICAgICgmc2lpLT5wdWIsIGJ1c3R5cGUsIHJlZ3MsIHNpaS0+b3NoLCB2YXJzLCB2YXJzeikpIHsKIAkJU0lfRVJST1IoKCJzaV9kb2F0dGFjaDogc3JvbV92YXJfaW5pdCBmYWlsZWQ6IGJhZCBzcm9tXG4iKSk7CiAJCWdvdG8gZXhpdDsKIAl9CkBAIC00OTksNyArNDk5LDcgQEAKIH0KIAogI2Vsc2UJCQkJLyogQkNNU0RJTyAqLwotc3RhdGljIHNpX2luZm9fdCAqc2lfZG9hdHRhY2goc2lfaW5mb190ICpzaWksIHVpbnQgZGV2aWQsIG9zbF90ICpvc2gsCitzdGF0aWMgc2lfaW5mb190ICpzaV9kb2F0dGFjaChzaV9pbmZvX3QgKnNpaSwgdWludCBkZXZpZCwgc3RydWN0IG9zbF9pbmZvICpvc2gsCiAJCQkgICAgICB2b2lkICpyZWdzLCB1aW50IGJ1c3R5cGUsIHZvaWQgKnNkaCwKIAkJCSAgICAgIGNoYXIgKip2YXJzLCB1aW50ICp2YXJzeikKIHsKQEAgLTUxMSw3ICs1MTEsNyBAQAogCiAJQVNTRVJUKEdPT0RSRUdTKHJlZ3MpKTsKIAotCWJ6ZXJvKCh1bnNpZ25lZCBjaGFyICopIHNpaSwgc2l6ZW9mKHNpX2luZm9fdCkpOworCW1lbXNldCgodW5zaWduZWQgY2hhciAqKSBzaWksIDAsIHNpemVvZihzaV9pbmZvX3QpKTsKIAogCXNhdmV3aW4gPSAwOwogCkBAIC01MjIsMzAgKzUyMiwyOSBAQAogCXNpaS0+b3NoID0gb3NoOwogCiAJLyogY2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBhIHNpIGNvcmUgbWltaWMnaW5nIGEgcGNpIGNvcmUgKi8KLQlpZiAoKGJ1c3R5cGUgPT0gUENJX0JVUykgJiYKLQkgICAgKE9TTF9QQ0lfUkVBRF9DT05GSUcoc2lpLT5vc2gsIFBDSV9TUFJPTV9DT05UUk9MLCBzaXplb2YodTMyKSkgPT0KLQkgICAgIDB4ZmZmZmZmZmYpKSB7Ci0JCVNJX0VSUk9SKCgiJXM6IGluY29taW5nIGJ1cyBpcyBQQ0kgYnV0IGl0J3MgYSBsaWUsIHN3aXRjaGluZyB0byBTSSAiICJkZXZpZDoweCV4XG4iLCBfX2Z1bmNfXywgZGV2aWQpKTsKLQkJYnVzdHlwZSA9IFNJX0JVUzsKKwlpZiAoYnVzdHlwZSA9PSBQQ0lfQlVTKSB7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChzaWktPm9zaC0+cGRldiwgUENJX1NQUk9NX0NPTlRST0wsICAmdyk7CisJCWlmICh3ID09IDB4ZmZmZmZmZmYpIHsKKwkJCVNJX0VSUk9SKCgiJXM6IGluY29taW5nIGJ1cyBpcyBQQ0kgYnV0IGl0J3MgYSBsaWUsICIKKwkJCQkiIHN3aXRjaGluZyB0byBTSSBkZXZpZDoweCV4XG4iLAorCQkJCV9fZnVuY19fLCBkZXZpZCkpOworCQkJYnVzdHlwZSA9IFNJX0JVUzsKKwkJfQogCX0KIAogCS8qIGZpbmQgQ2hpcGNvbW1vbiBhZGRyZXNzICovCiAJaWYgKGJ1c3R5cGUgPT0gUENJX0JVUykgewotCQlzYXZld2luID0KLQkJICAgIE9TTF9QQ0lfUkVBRF9DT05GSUcoc2lpLT5vc2gsIFBDSV9CQVIwX1dJTiwgc2l6ZW9mKHUzMikpOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoc2lpLT5vc2gtPnBkZXYsIFBDSV9CQVIwX1dJTiwgJnNhdmV3aW4pOwogCQlpZiAoIUdPT0RDT1JFQUREUihzYXZld2luLCBTSV9FTlVNX0JBU0UpKQogCQkJc2F2ZXdpbiA9IFNJX0VOVU1fQkFTRTsKLQkJT1NMX1BDSV9XUklURV9DT05GSUcoc2lpLT5vc2gsIFBDSV9CQVIwX1dJTiwgNCwgU0lfRU5VTV9CQVNFKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzaWktPm9zaC0+cGRldiwgUENJX0JBUjBfV0lOLAorCQkJCSAgICAgICBTSV9FTlVNX0JBU0UpOwogCQljYyA9IChjaGlwY3JlZ3NfdCAqKSByZWdzOwogCX0gZWxzZSB7CiAJCWNjID0gKGNoaXBjcmVnc190ICopIFJFR19NQVAoU0lfRU5VTV9CQVNFLCBTSV9DT1JFX1NJWkUpOwogCX0KIAogCXNpaC0+YnVzdHlwZSA9IGJ1c3R5cGU7Ci0JaWYgKGJ1c3R5cGUgIT0gQlVTVFlQRShidXN0eXBlKSkgewotCQlTSV9FUlJPUigoInNpX2RvYXR0YWNoOiBidXMgdHlwZSAlZCBkb2VzIG5vdCBtYXRjaCBjb25maWd1cmVkIGJ1cyB0eXBlICVkXG4iLCBidXN0eXBlLCBCVVNUWVBFKGJ1c3R5cGUpKSk7Ci0JCXJldHVybiBOVUxMOwotCX0KIAogCS8qIGJ1cy9jb3JlL2NsayBzZXR1cCBmb3IgcmVnaXN0ZXIgYWNjZXNzICovCiAJaWYgKCFzaV9idXNjb3JlX3ByZXAoc2lpLCBidXN0eXBlLCBkZXZpZCwgc2RoKSkgewpAQCAtNTY5LDcgKzU2OCw3IEBACiAJc2loLT5pc3NpbSA9IElTX1NJTShzaWgtPmNoaXBwa2cpOwogCiAJLyogc2NhbiBmb3IgY29yZXMgKi8KLQlpZiAoQ0hJUFRZUEUoc2lpLT5wdWIuc29jaXR5cGUpID09IFNPQ0lfQUkpIHsKKwlpZiAoc2lpLT5wdWIuc29jaXR5cGUgPT0gU09DSV9BSSkgewogCQlTSV9NU0coKCJGb3VuZCBjaGlwIHR5cGUgQUkgKDB4JTA4eClcbiIsIHcpKTsKIAkJLyogcGFzcyBjaGlwYyBhZGRyZXNzIGluc3RlYWQgb2Ygb3JpZ2luYWwgY29yZSBiYXNlICovCiAJCWFpX3NjYW4oJnNpaS0+cHViLCAodm9pZCAqKWNjLCBkZXZpZCk7CkBAIC01OTIsMTAgKzU5MSwxMCBAQAogCS8qIGFzc3VtZSBjdXJyZW50IGNvcmUgaXMgQ0MgKi8KIAlpZiAoKHNpaS0+cHViLmNjcmV2ID09IDB4MjUpCiAJICAgICYmCi0JICAgICgoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMyMzZfQ0hJUF9JRAotCSAgICAgIHx8IENISVBJRChzaWgtPmNoaXApID09IEJDTTQzMjM1X0NISVBfSUQKLQkgICAgICB8fCBDSElQSUQoc2loLT5jaGlwKSA9PSBCQ000MzIzOF9DSElQX0lEKQotCSAgICAgJiYgKENISVBSRVYoc2lpLT5wdWIuY2hpcHJldikgPD0gMikpKSB7CisJICAgICgoc2loLT5jaGlwID09IEJDTTQzMjM2X0NISVBfSUQKKwkgICAgICB8fCBzaWgtPmNoaXAgPT0gQkNNNDMyMzVfQ0hJUF9JRAorCSAgICAgIHx8IHNpaC0+Y2hpcCA9PSBCQ000MzIzOF9DSElQX0lEKQorCSAgICAgJiYgKHNpaS0+cHViLmNoaXByZXYgPD0gMikpKSB7CiAKIAkJaWYgKChjYy0+Y2hpcHN0YXR1cyAmIENTVDQzMjM2X0JQX0NMSykgIT0gMCkgewogCQkJdWludCBjbGtkaXY7CkBAIC02MTMsNyArNjEyLDcgQEAKIAogCS8qIEluaXQgbnZyYW0gZnJvbSBzcHJvbS9vdHAgaWYgdGhleSBleGlzdCAqLwogCWlmIChzcm9tX3Zhcl9pbml0Ci0JICAgICgmc2lpLT5wdWIsIEJVU1RZUEUoYnVzdHlwZSksIHJlZ3MsIHNpaS0+b3NoLCB2YXJzLCB2YXJzeikpIHsKKwkgICAgKCZzaWktPnB1YiwgYnVzdHlwZSwgcmVncywgc2lpLT5vc2gsIHZhcnMsIHZhcnN6KSkgewogCQlTSV9FUlJPUigoInNpX2RvYXR0YWNoOiBzcm9tX3Zhcl9pbml0IGZhaWxlZDogYmFkIHNyb21cbiIpKTsKIAkJZ290byBleGl0OwogCX0KQEAgLTY1MSwxMCArNjUwLDEwIEBACiAJCXBjaWNvcmVfYXR0YWNoKHNpaS0+cGNoLCBwdmFycywgU0lfRE9BVFRBQ0gpOwogCX0KIAotCWlmICgoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMyMjRfQ0hJUF9JRCkgfHwKLQkgICAgKENISVBJRChzaWgtPmNoaXApID09IEJDTTQzNDIxX0NISVBfSUQpKSB7CisJaWYgKChzaWgtPmNoaXAgPT0gQkNNNDMyMjRfQ0hJUF9JRCkgfHwKKwkgICAgKHNpaC0+Y2hpcCA9PSBCQ000MzQyMV9DSElQX0lEKSkgewogCQkvKiBlbmFibGUgMTIgbUEgZHJpdmUgc3RyZW50aCBmb3IgNDMyMjQgYW5kIHNldCBjaGlwQ29udHJvbCByZWdpc3RlciBiaXQgMTUgKi8KLQkJaWYgKENISVBSRVYoc2loLT5jaGlwcmV2KSA9PSAwKSB7CisJCWlmIChzaWgtPmNoaXByZXYgPT0gMCkgewogCQkJU0lfTVNHKCgiQXBwbHlpbmcgNDMyMjRBMCBXQVJzXG4iKSk7CiAJCQlzaV9jb3JlcmVnKHNpaCwgU0lfQ0NfSURYLAogCQkJCSAgIG9mZnNldG9mKGNoaXBjcmVnc190LCBjaGlwY29udHJvbCksCkBAIC02NjMsMjggKzY2MiwyOCBAQAogCQkJc2lfcG11X2NoaXBjb250cm9sKHNpaCwgMCwgQ0NUUkxfNDMyMjRBMF8xMk1BX0xFRF9EUklWRSwKIAkJCQkJICAgQ0NUUkxfNDMyMjRBMF8xMk1BX0xFRF9EUklWRSk7CiAJCX0KLQkJaWYgKENISVBSRVYoc2loLT5jaGlwcmV2KSA+PSAxKSB7CisJCWlmIChzaWgtPmNoaXByZXYgPj0gMSkgewogCQkJU0lfTVNHKCgiQXBwbHlpbmcgNDMyMjRCMCsgV0FSc1xuIikpOwogCQkJc2lfcG11X2NoaXBjb250cm9sKHNpaCwgMCwgQ0NUUkxfNDMyMjRCMF8xMk1BX0xFRF9EUklWRSwKIAkJCQkJICAgQ0NUUkxfNDMyMjRCMF8xMk1BX0xFRF9EUklWRSk7CiAJCX0KIAl9CiAKLQlpZiAoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMxM19DSElQX0lEKSB7CisJaWYgKHNpaC0+Y2hpcCA9PSBCQ000MzEzX0NISVBfSUQpIHsKIAkJLyogZW5hYmxlIDEyIG1BIGRyaXZlIHN0cmVudGggZm9yIDQzMTMgYW5kIHNldCBjaGlwQ29udHJvbCByZWdpc3RlciBiaXQgMSAqLwogCQlTSV9NU0coKCJBcHBseWluZyA0MzEzIFdBUnNcbiIpKTsKIAkJc2lfcG11X2NoaXBjb250cm9sKHNpaCwgMCwgQ0NUUkxfNDMxM18xMk1BX0xFRF9EUklWRSwKIAkJCQkgICBDQ1RSTF80MzEzXzEyTUFfTEVEX0RSSVZFKTsKIAl9CiAKLQlpZiAoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMzMV9DSElQX0lEKSB7CisJaWYgKHNpaC0+Y2hpcCA9PSBCQ000MzMxX0NISVBfSUQpIHsKIAkJLyogRW5hYmxlIEV4dCBQQSBsaW5lcyBkZXBlbmRpbmcgb24gY2hpcCBwYWNrYWdlIG9wdGlvbiAqLwogCQlzaV9jaGlwY29udHJsX2VwYTQzMzEoc2loLCB0cnVlKTsKIAl9CiAKIAlyZXR1cm4gc2lpOwogIGV4aXQ6Ci0JaWYgKEJVU1RZUEUoc2loLT5idXN0eXBlKSA9PSBQQ0lfQlVTKSB7CisJaWYgKHNpaC0+YnVzdHlwZSA9PSBQQ0lfQlVTKSB7CiAJCWlmIChzaWktPnBjaCkKIAkJCXBjaWNvcmVfZGVpbml0KHNpaS0+cGNoKTsKIAkJc2lpLT5wY2ggPSBOVUxMOwpAQCAtNzA4LDE3ICs3MDcsMTcgQEAKIAlpZiAoc2lpID09IE5VTEwpCiAJCXJldHVybjsKIAotCWlmIChCVVNUWVBFKHNpaC0+YnVzdHlwZSkgPT0gU0lfQlVTKQorCWlmIChzaWgtPmJ1c3R5cGUgPT0gU0lfQlVTKQogCQlmb3IgKGlkeCA9IDA7IGlkeCA8IFNJX01BWENPUkVTOyBpZHgrKykKIAkJCWlmIChzaWktPnJlZ3NbaWR4XSkgewotCQkJCVJFR19VTk1BUChzaWktPnJlZ3NbaWR4XSk7CisJCQkJaW91bm1hcChzaWktPnJlZ3NbaWR4XSk7CiAJCQkJc2lpLT5yZWdzW2lkeF0gPSBOVUxMOwogCQkJfQogCiAjaWZuZGVmIEJSQ01fRlVMTE1BQwogCW52cmFtX2V4aXQoKHZvaWQgKilzaV9sb2NhbCk7CS8qIGZyZWUgdXAgbnZyYW0gYnVmZmVycyAqLwogCi0JaWYgKEJVU1RZUEUoc2loLT5idXN0eXBlKSA9PSBQQ0lfQlVTKSB7CisJaWYgKHNpaC0+YnVzdHlwZSA9PSBQQ0lfQlVTKSB7CiAJCWlmIChzaWktPnBjaCkKIAkJCXBjaWNvcmVfZGVpbml0KHNpaS0+cGNoKTsKIAkJc2lpLT5wY2ggPSBOVUxMOwpAQCAtNzMwLDcgKzcyOSw3IEBACiAJCWtmcmVlKHNpaSk7CiB9CiAKLXZvaWQgKnNpX29zaChzaV90ICpzaWgpCitzdHJ1Y3Qgb3NsX2luZm8gKnNpX29zaChzaV90ICpzaWgpCiB7CiAJc2lfaW5mb190ICpzaWk7CiAKQEAgLTc2Niw3ICs3NjUsNyBAQAogCiB1aW50IHNpX2ZsYWcoc2lfdCAqc2loKQogewotCWlmIChDSElQVFlQRShzaWgtPnNvY2l0eXBlKSA9PSBTT0NJX0FJKQorCWlmIChzaWgtPnNvY2l0eXBlID09IFNPQ0lfQUkpCiAJCXJldHVybiBhaV9mbGFnKHNpaCk7CiAJZWxzZSB7CiAJCUFTU0VSVCgwKTsKQEAgLTc3Niw3ICs3NzUsNyBAQAogCiB2b2lkIHNpX3NldGludChzaV90ICpzaWgsIGludCBzaWZsYWcpCiB7Ci0JaWYgKENISVBUWVBFKHNpaC0+c29jaXR5cGUpID09IFNPQ0lfQUkpCisJaWYgKHNpaC0+c29jaXR5cGUgPT0gU09DSV9BSSkKIAkJYWlfc2V0aW50KHNpaCwgc2lmbGFnKTsKIAllbHNlCiAJCUFTU0VSVCgwKTsKQEAgLTgwOCw3ICs4MDcsNyBAQAogI2lmbmRlZiBCQ01TRElPCiB1aW50IHNpX2NvcmVyZXYoc2lfdCAqc2loKQogewotCWlmIChDSElQVFlQRShzaWgtPnNvY2l0eXBlKSA9PSBTT0NJX0FJKQorCWlmIChzaWgtPnNvY2l0eXBlID09IFNPQ0lfQUkpCiAJCXJldHVybiBhaV9jb3JlcmV2KHNpaCk7CiAJZWxzZSB7CiAJCUFTU0VSVCgwKTsKQEAgLTg1MSw3ICs4NTAsNyBAQAogCWlmICghR09PRElEWChpZHgpKQogCQlyZXR1cm4gTlVMTDsKIAotCWlmIChDSElQVFlQRShzaWgtPnNvY2l0eXBlKSA9PSBTT0NJX0FJKQorCWlmIChzaWgtPnNvY2l0eXBlID09IFNPQ0lfQUkpCiAJCXJldHVybiBhaV9zZXRjb3JlaWR4KHNpaCwgaWR4KTsKIAllbHNlIHsKICNpZmRlZiBCQ01TRElPCkBAIC04NjYsNyArODY1LDcgQEAKICNpZm5kZWYgQkNNU0RJTwogdm9pZCAqc2lfc2V0Y29yZWlkeChzaV90ICpzaWgsIHVpbnQgY29yZWlkeCkKIHsKLQlpZiAoQ0hJUFRZUEUoc2loLT5zb2NpdHlwZSkgPT0gU09DSV9BSSkKKwlpZiAoc2loLT5zb2NpdHlwZSA9PSBTT0NJX0FJKQogCQlyZXR1cm4gYWlfc2V0Y29yZWlkeChzaWgsIGNvcmVpZHgpOwogCWVsc2UgewogCQlBU1NFUlQoMCk7CkBAIC05MTgsNyArOTE3LDcgQEAKIAogdTMyIHNpX2NvcmVfY2ZsYWdzKHNpX3QgKnNpaCwgdTMyIG1hc2ssIHUzMiB2YWwpCiB7Ci0JaWYgKENISVBUWVBFKHNpaC0+c29jaXR5cGUpID09IFNPQ0lfQUkpCisJaWYgKHNpaC0+c29jaXR5cGUgPT0gU09DSV9BSSkKIAkJcmV0dXJuIGFpX2NvcmVfY2ZsYWdzKHNpaCwgbWFzaywgdmFsKTsKIAllbHNlIHsKIAkJQVNTRVJUKDApOwpAQCAtOTI4LDcgKzkyNyw3IEBACiAKIHUzMiBzaV9jb3JlX3NmbGFncyhzaV90ICpzaWgsIHUzMiBtYXNrLCB1MzIgdmFsKQogewotCWlmIChDSElQVFlQRShzaWgtPnNvY2l0eXBlKSA9PSBTT0NJX0FJKQorCWlmIChzaWgtPnNvY2l0eXBlID09IFNPQ0lfQUkpCiAJCXJldHVybiBhaV9jb3JlX3NmbGFncyhzaWgsIG1hc2ssIHZhbCk7CiAJZWxzZSB7CiAJCUFTU0VSVCgwKTsKQEAgLTkzOCw3ICs5MzcsNyBAQAogCiBib29sIHNpX2lzY29yZXVwKHNpX3QgKnNpaCkKIHsKLQlpZiAoQ0hJUFRZUEUoc2loLT5zb2NpdHlwZSkgPT0gU09DSV9BSSkKKwlpZiAoc2loLT5zb2NpdHlwZSA9PSBTT0NJX0FJKQogCQlyZXR1cm4gYWlfaXNjb3JldXAoc2loKTsKIAllbHNlIHsKICNpZmRlZiBCQ01TRElPCkBAIC05NTMsNyArOTUyLDcgQEAKIHZvaWQgc2lfd3JpdGVfd3JhcHBlcnJlZyhzaV90ICpzaWgsIHUzMiBvZmZzZXQsIHUzMiB2YWwpCiB7CiAJLyogb25seSBmb3IgNDMxOSwgbm8gcmVxdWlyZW1lbnQgZm9yIFNPQ0lfU0IgKi8KLQlpZiAoQ0hJUFRZUEUoc2loLT5zb2NpdHlwZSkgPT0gU09DSV9BSSkgeworCWlmIChzaWgtPnNvY2l0eXBlID09IFNPQ0lfQUkpIHsKIAkJYWlfd3JpdGVfd3JhcF9yZWcoc2loLCBvZmZzZXQsIHZhbCk7CiAJfQogfQpAQCAtOTYxLDcgKzk2MCw3IEBACiB1aW50IHNpX2NvcmVyZWcoc2lfdCAqc2loLCB1aW50IGNvcmVpZHgsIHVpbnQgcmVnb2ZmLCB1aW50IG1hc2ssIHVpbnQgdmFsKQogewogCi0JaWYgKENISVBUWVBFKHNpaC0+c29jaXR5cGUpID09IFNPQ0lfQUkpCisJaWYgKHNpaC0+c29jaXR5cGUgPT0gU09DSV9BSSkKIAkJcmV0dXJuIGFpX2NvcmVyZWcoc2loLCBjb3JlaWR4LCByZWdvZmYsIG1hc2ssIHZhbCk7CiAJZWxzZSB7CiAjaWZkZWYgQkNNU0RJTwpAQCAtOTc2LDcgKzk3NSw3IEBACiB2b2lkIHNpX2NvcmVfZGlzYWJsZShzaV90ICpzaWgsIHUzMiBiaXRzKQogewogCi0JaWYgKENISVBUWVBFKHNpaC0+c29jaXR5cGUpID09IFNPQ0lfQUkpCisJaWYgKHNpaC0+c29jaXR5cGUgPT0gU09DSV9BSSkKIAkJYWlfY29yZV9kaXNhYmxlKHNpaCwgYml0cyk7CiAjaWZkZWYgQkNNU0RJTwogCWVsc2UKQEAgLTk4Niw3ICs5ODUsNyBAQAogCiB2b2lkIHNpX2NvcmVfcmVzZXQoc2lfdCAqc2loLCB1MzIgYml0cywgdTMyIHJlc2V0Yml0cykKIHsKLQlpZiAoQ0hJUFRZUEUoc2loLT5zb2NpdHlwZSkgPT0gU09DSV9BSSkKKwlpZiAoc2loLT5zb2NpdHlwZSA9PSBTT0NJX0FJKQogCQlhaV9jb3JlX3Jlc2V0KHNpaCwgYml0cywgcmVzZXRiaXRzKTsKICNpZmRlZiBCQ01TRElPCiAJZWxzZQpAQCAtMTA0Myw4ICsxMDQyLDggQEAKIAogCWlmIChQTVVDVExfRU5BQihzaWgpKSB7CiAKLQkJaWYgKChDSElQSUQoc2loLT5jaGlwKSA9PSBCQ000MzE5X0NISVBfSUQpICYmCi0JCSAgICAoQ0hJUFJFVihzaWgtPmNoaXByZXYpID09IDApICYmICh0aWNrcyAhPSAwKSkgeworCQlpZiAoKHNpaC0+Y2hpcCA9PSBCQ000MzE5X0NISVBfSUQpICYmCisJCSAgICAoc2loLT5jaGlwcmV2ID09IDApICYmICh0aWNrcyAhPSAwKSkgewogCQkJc2lfY29yZXJlZyhzaWgsIFNJX0NDX0lEWCwKIAkJCQkgICBvZmZzZXRvZihjaGlwY3JlZ3NfdCwgY2xrX2N0bF9zdCksIH4wLCAweDIpOwogCQkJc2lfc2V0Y29yZShzaWgsIFVTQjIwRF9DT1JFX0lELCAwKTsKQEAgLTEwODUsMTYgKzEwODQsMTggQEAKIHN0YXRpYyB1aW50IHNpX3Nsb3djbGtfc3JjKHNpX2luZm9fdCAqc2lpKQogewogCWNoaXBjcmVnc190ICpjYzsKKwl1MzIgdmFsOwogCiAJQVNTRVJUKFNJX0ZBU1Qoc2lpKSB8fCBzaV9jb3JlaWQoJnNpaS0+cHViKSA9PSBDQ19DT1JFX0lEKTsKIAogCWlmIChzaWktPnB1Yi5jY3JldiA8IDYpIHsKLQkJaWYgKChCVVNUWVBFKHNpaS0+cHViLmJ1c3R5cGUpID09IFBDSV9CVVMpICYmCi0JCSAgICAoT1NMX1BDSV9SRUFEX0NPTkZJRyhzaWktPm9zaCwgUENJX0dQSU9fT1VULCBzaXplb2YodTMyKSkKLQkJICAgICAmIFBDSV9DRkdfR1BJT19TQ1MpKQotCQkJcmV0dXJuIFNDQ19TU19QQ0k7Ci0JCWVsc2UKLQkJCXJldHVybiBTQ0NfU1NfWFRBTDsKKwkJaWYgKHNpaS0+cHViLmJ1c3R5cGUgPT0gUENJX0JVUykgeworCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHNpaS0+b3NoLT5wZGV2LCBQQ0lfR1BJT19PVVQsCisJCQkJCSAgICAgICZ2YWwpOworCQkJaWYgKHZhbCAmIFBDSV9DRkdfR1BJT19TQ1MpCisJCQkJcmV0dXJuIFNDQ19TU19QQ0k7CisJCX0KKwkJcmV0dXJuIFNDQ19TU19YVEFMOwogCX0gZWxzZSBpZiAoc2lpLT5wdWIuY2NyZXYgPCAxMCkgewogCQljYyA9IChjaGlwY3JlZ3NfdCAqKSBzaV9zZXRjb3JlaWR4KCZzaWktPnB1Yiwgc2lpLT5jdXJpZHgpOwogCQlyZXR1cm4gUl9SRUcoc2lpLT5vc2gsICZjYy0+c2xvd19jbGtfY3RsKSAmIFNDQ19TU19NQVNLOwpAQCAtMTI2NCw3ICsxMjY1LDcgQEAKIAogCXNpaSA9IFNJX0lORk8oc2loKTsKIAotCXN3aXRjaCAoQlVTVFlQRShzaWgtPmJ1c3R5cGUpKSB7CisJc3dpdGNoIChzaWgtPmJ1c3R5cGUpIHsKIAogI2lmZGVmIEJDTVNESU8KIAljYXNlIFNESU9fQlVTOgpAQCAtMTI3NiwxMiArMTI3Nyw5IEBACiAJCWlmIChQQ0lFKHNpaSkpCiAJCQlyZXR1cm4gLTE7CiAKLQkJaW4gPSBPU0xfUENJX1JFQURfQ09ORklHKHNpaS0+b3NoLCBQQ0lfR1BJT19JTiwgc2l6ZW9mKHUzMikpOwotCQlvdXQgPQotCQkgICAgT1NMX1BDSV9SRUFEX0NPTkZJRyhzaWktPm9zaCwgUENJX0dQSU9fT1VULCBzaXplb2YodTMyKSk7Ci0JCW91dGVuID0KLQkJICAgIE9TTF9QQ0lfUkVBRF9DT05GSUcoc2lpLT5vc2gsIFBDSV9HUElPX09VVEVOLAotCQkJCQlzaXplb2YodTMyKSk7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChzaWktPm9zaC0+cGRldiwgUENJX0dQSU9fSU4sICZpbik7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChzaWktPm9zaC0+cGRldiwgUENJX0dQSU9fT1VULCAmb3V0KTsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHNpaS0+b3NoLT5wZGV2LCBQQ0lfR1BJT19PVVRFTiwgJm91dGVuKTsKIAogCQkvKgogCQkgKiBBdm9pZCBnbGl0Y2hpbmcgdGhlIGNsb2NrIGlmIEdQUlMgaXMgYWxyZWFkeSB1c2luZyBpdC4KQEAgLTEzMDIsMTggKzEzMDAsMTggQEAKIAkJCQlvdXQgfD0gUENJX0NGR19HUElPX1hUQUw7CiAJCQkJaWYgKHdoYXQgJiBQTEwpCiAJCQkJCW91dCB8PSBQQ0lfQ0ZHX0dQSU9fUExMOwotCQkJCU9TTF9QQ0lfV1JJVEVfQ09ORklHKHNpaS0+b3NoLCBQQ0lfR1BJT19PVVQsCi0JCQkJCQkgICAgIHNpemVvZih1MzIpLCBvdXQpOwotCQkJCU9TTF9QQ0lfV1JJVEVfQ09ORklHKHNpaS0+b3NoLCBQQ0lfR1BJT19PVVRFTiwKLQkJCQkJCSAgICAgc2l6ZW9mKHUzMiksIG91dGVuKTsKKwkJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHNpaS0+b3NoLT5wZGV2LAorCQkJCQkJICAgICAgIFBDSV9HUElPX09VVCwgb3V0KTsKKwkJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHNpaS0+b3NoLT5wZGV2LAorCQkJCQkJICAgICAgIFBDSV9HUElPX09VVEVOLCBvdXRlbik7CiAJCQkJdWRlbGF5KFhUQUxfT05fREVMQVkpOwogCQkJfQogCiAJCQkvKiB0dXJuIHBsbCBvbiAqLwogCQkJaWYgKHdoYXQgJiBQTEwpIHsKIAkJCQlvdXQgJj0gflBDSV9DRkdfR1BJT19QTEw7Ci0JCQkJT1NMX1BDSV9XUklURV9DT05GSUcoc2lpLT5vc2gsIFBDSV9HUElPX09VVCwKLQkJCQkJCSAgICAgc2l6ZW9mKHUzMiksIG91dCk7CisJCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzaWktPm9zaC0+cGRldiwKKwkJCQkJCSAgICAgICBQQ0lfR1BJT19PVVQsIG91dCk7CiAJCQkJbWRlbGF5KDIpOwogCQkJfQogCQl9IGVsc2UgewpAQCAtMTMyMSwxMCArMTMxOSwxMCBAQAogCQkJCW91dCAmPSB+UENJX0NGR19HUElPX1hUQUw7CiAJCQlpZiAod2hhdCAmIFBMTCkKIAkJCQlvdXQgfD0gUENJX0NGR19HUElPX1BMTDsKLQkJCU9TTF9QQ0lfV1JJVEVfQ09ORklHKHNpaS0+b3NoLCBQQ0lfR1BJT19PVVQsCi0JCQkJCSAgICAgc2l6ZW9mKHUzMiksIG91dCk7Ci0JCQlPU0xfUENJX1dSSVRFX0NPTkZJRyhzaWktPm9zaCwgUENJX0dQSU9fT1VURU4sCi0JCQkJCSAgICAgc2l6ZW9mKHUzMiksIG91dGVuKTsKKwkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoc2lpLT5vc2gtPnBkZXYsCisJCQkJCSAgICAgICBQQ0lfR1BJT19PVVQsIG91dCk7CisJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHNpaS0+b3NoLT5wZGV2LAorCQkJCQkgICAgICAgUENJX0dQSU9fT1VURU4sIG91dGVuKTsKIAkJfQogCiAJZGVmYXVsdDoKQEAgLTEzNzgsNyArMTM3Niw3IEBACiAJCUlOVFJfT0ZGKHNpaSwgaW50cl92YWwpOwogCQlvcmlnaWR4ID0gc2lpLT5jdXJpZHg7CiAKLQkJaWYgKChCVVNUWVBFKHNpaS0+cHViLmJ1c3R5cGUpID09IFNJX0JVUykgJiYKKwkJaWYgKChzaWktPnB1Yi5idXN0eXBlID09IFNJX0JVUykgJiYKIAkJICAgIHNpX3NldGNvcmUoJnNpaS0+cHViLCBNSVBTMzNfQ09SRV9JRCwgMCkgJiYKIAkJICAgIChzaV9jb3JlcmV2KCZzaWktPnB1YikgPD0gNykgJiYgKHNpaS0+cHViLmNjcmV2ID49IDEwKSkKIAkJCWdvdG8gZG9uZTsKQEAgLTE0NjAsNyArMTQ1OCw3IEBACiAJaWYgKCFwYXRoIHx8IHNpemUgPD0gMCkKIAkJcmV0dXJuIC0xOwogCi0Jc3dpdGNoIChCVVNUWVBFKHNpaC0+YnVzdHlwZSkpIHsKKwlzd2l0Y2ggKHNpaC0+YnVzdHlwZSkgewogCWNhc2UgU0lfQlVTOgogCWNhc2UgSlRBR19CVVM6CiAJCXNsZW4gPSBzbnByaW50ZihwYXRoLCAoc2l6ZV90KSBzaXplLCAic2IvJXUvIiwgc2lfY29yZWlkeChzaWgpKTsKQEAgLTE1NTAsNyArMTU0OCw3IEBACiB7CiAJdTggY2FwX3B0cjsKIAotCWlmIChCVVNUWVBFKHNpaS0+cHViLmJ1c3R5cGUpICE9IFBDSV9CVVMpCisJaWYgKHNpaS0+cHViLmJ1c3R5cGUgIT0gUENJX0JVUykKIAkJcmV0dXJuIGZhbHNlOwogCiAJY2FwX3B0ciA9CkBAIC0xNjE3LDcgKzE2MTUsNyBAQAogCXNpaSA9IFNJX0lORk8oc2loKTsKIAogCS8qIGlmIG5vdCBwY2kgYnVzLCB3ZSdyZSBkb25lICovCi0JaWYgKEJVU1RZUEUoc2loLT5idXN0eXBlKSAhPSBQQ0lfQlVTKQorCWlmIChzaWgtPmJ1c3R5cGUgIT0gUENJX0JVUykKIAkJcmV0dXJuOwogCiAJaWYgKFBDSV9GT1JDRUhUKHNpaSkpCkBAIC0xNjQ2LDcgKzE2NDQsNyBAQAogCXNpaSA9IFNJX0lORk8oc2loKTsKIAogCS8qIGlmIG5vdCBwY2kgYnVzLCB3ZSdyZSBkb25lICovCi0JaWYgKEJVU1RZUEUoc2loLT5idXN0eXBlKSAhPSBQQ0lfQlVTKQorCWlmIChzaWgtPmJ1c3R5cGUgIT0gUENJX0JVUykKIAkJcmV0dXJuOwogCiAJLyogcmVsZWFzZSBGT1JDRUhUIHNpbmNlIGNoaXAgaXMgZ29pbmcgdG8gImRvd24iIHN0YXRlICovCkBAIC0xNjY5LDcgKzE2NjcsNyBAQAogCiAJc2lpID0gU0lfSU5GTyhzaWgpOwogCi0JaWYgKEJVU1RZUEUoc2lpLT5wdWIuYnVzdHlwZSkgIT0gUENJX0JVUykKKwlpZiAoc2lpLT5wdWIuYnVzdHlwZSAhPSBQQ0lfQlVTKQogCQlyZXR1cm47CiAKIAlBU1NFUlQoUENJKHNpaSkgfHwgUENJRShzaWkpKTsKQEAgLTE2OTIsOSArMTY5MCw5IEBACiAJICovCiAJaWYgKFBDSUUoc2lpKSB8fCAoUENJKHNpaSkgJiYgKChzaWktPnB1Yi5idXNjb3JlcmV2KSA+PSA2KSkpIHsKIAkJLyogcGNpIGNvbmZpZyB3cml0ZSB0byBzZXQgdGhpcyBjb3JlIGJpdCBpbiBQQ0lJbnRNYXNrICovCi0JCXcgPSBPU0xfUENJX1JFQURfQ09ORklHKHNpaS0+b3NoLCBQQ0lfSU5UX01BU0ssIHNpemVvZih1MzIpKTsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHNpaS0+b3NoLT5wZGV2LCBQQ0lfSU5UX01BU0ssICZ3KTsKIAkJdyB8PSAoY29yZW1hc2sgPDwgUENJX1NCSU1fU0hJRlQpOwotCQlPU0xfUENJX1dSSVRFX0NPTkZJRyhzaWktPm9zaCwgUENJX0lOVF9NQVNLLCBzaXplb2YodTMyKSwgdyk7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoc2lpLT5vc2gtPnBkZXYsIFBDSV9JTlRfTUFTSywgdyk7CiAJfSBlbHNlIHsKIAkJLyogc2V0IHNiaW50dmVjIGJpdCBmb3Igb3VyIGZsYWcgbnVtYmVyICovCiAJCXNpX3NldGludChzaWgsIHNpZmxhZyk7CkBAIC0xNzMxLDcgKzE3MjksNyBAQAogCiAJc2lfaW5mb190ICpzaWkgPSBTSV9JTkZPKHNpaCk7CiAKLQlBU1NFUlQoQlVTVFlQRShzaWktPnB1Yi5idXN0eXBlKSA9PSBQQ0lfQlVTKTsKKwlBU1NFUlQoc2lpLT5wdWIuYnVzdHlwZSA9PSBQQ0lfQlVTKTsKIAogCS8qIEZpeHVwIFBJIGluIFNST00gc2hhZG93IGFyZWEgdG8gZW5hYmxlIHRoZSBjb3JyZWN0IFBDSSBjb3JlIGFjY2VzcyAqLwogCS8qIHNhdmUgdGhlIGN1cnJlbnQgaW5kZXggKi8KQEAgLTE3NzcsNyArMTc3NSw3IEBACiAJICogaWdub3JlIHJlc2VydmF0aW9uIGlmIGl0J3MgaGlnaCBwcmlvcml0eSAoZS5nLiwgdGVzdCBhcHBzKQogCSAqLwogCWlmICgocHJpb3JpdHkgIT0gR1BJT19ISV9QUklPUklUWSkgJiYKLQkgICAgKEJVU1RZUEUoc2loLT5idXN0eXBlKSA9PSBTSV9CVVMpICYmICh2YWwgfHwgbWFzaykpIHsKKwkgICAgKHNpaC0+YnVzdHlwZSA9PSBTSV9CVVMpICYmICh2YWwgfHwgbWFzaykpIHsKIAkJbWFzayA9IHByaW9yaXR5ID8gKHNpX2dwaW9yZXNlcnZhdGlvbiAmIG1hc2spIDoKIAkJICAgICgoc2lfZ3Bpb3Jlc2VydmF0aW9uIHwgbWFzaykgJiB+KHNpX2dwaW9yZXNlcnZhdGlvbikpOwogCQl2YWwgJj0gbWFzazsKQEAgLTE5MjksMTAgKzE5MjcsMTAgQEAKIAogCXNpaSA9IFNJX0lORk8oc2loKTsKIAotCXN3aXRjaCAoQlVTVFlQRShzaWgtPmJ1c3R5cGUpKSB7CisJc3dpdGNoIChzaWgtPmJ1c3R5cGUpIHsKIAljYXNlIFBDSV9CVVM6CiAJCUFTU0VSVChzaWktPm9zaCAhPSBOVUxMKTsKLQkJdyA9IE9TTF9QQ0lfUkVBRF9DT05GSUcoc2lpLT5vc2gsIFBDSV9DRkdfVklELCBzaXplb2YodTMyKSk7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChzaWktPm9zaC0+cGRldiwgUENJX0NGR19WSUQsICZ3KTsKIAkJaWYgKCh3ICYgMHhGRkZGKSAhPSBWRU5ET1JfQlJPQURDT00pCiAJCQlyZXR1cm4gdHJ1ZTsKIAkJYnJlYWs7CkBAIC0xOTU5LDcgKzE5NTcsNyBAQAogCQlyZXR1cm4gc3JvbWN0cmwgJiBTUkNfUFJFU0VOVDsKIAl9CiAKLQlzd2l0Y2ggKENISVBJRChzaWgtPmNoaXApKSB7CisJc3dpdGNoIChzaWgtPmNoaXApIHsKIAljYXNlIEJDTTQzMjlfQ0hJUF9JRDoKIAkJcmV0dXJuIChzaWgtPmNoaXBzdCAmIENTVDQzMjlfU1BST01fU0VMKSAhPSAwOwogCWNhc2UgQkNNNDMxOV9DSElQX0lEOgpAQCAtMTk3OSw3ICsxOTc3LDcgQEAKIAogYm9vbCBzaV9pc19vdHBfZGlzYWJsZWQoc2lfdCAqc2loKQogewotCXN3aXRjaCAoQ0hJUElEKHNpaC0+Y2hpcCkpIHsKKwlzd2l0Y2ggKHNpaC0+Y2hpcCkgewogCWNhc2UgQkNNNDMyOV9DSElQX0lEOgogCQlyZXR1cm4gKHNpaC0+Y2hpcHN0ICYgQ1NUNDMyOV9TUFJPTV9PVFBfU0VMX01BU0spID09CiAJCSAgICBDU1Q0MzI5X09UUF9QV1JETjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLmMKaW5kZXggNGEyOWVkNy4uZGNhODYxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLmMKQEAgLTExNyw4ICsxMTcsNyBAQAogCiAJZm9yIChkcml2ID0gY29tZWRpX2RyaXZlcnM7IGRyaXY7IGRyaXYgPSBkcml2LT5uZXh0KSB7CiAJCWlmICghdHJ5X21vZHVsZV9nZXQoZHJpdi0+bW9kdWxlKSkgewotCQkJcHJpbnRrCi0JCQkgICAgKEtFUk5fSU5GTyAiY29tZWRpOiBmYWlsZWQgdG8gaW5jcmVtZW50IG1vZHVsZSBjb3VudCwgc2tpcHBpbmdcbiIpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpOiBmYWlsZWQgdG8gaW5jcmVtZW50IG1vZHVsZSBjb3VudCwgc2tpcHBpbmdcbiIpOwogCQkJY29udGludWU7CiAJCX0KIAkJaWYgKGRyaXYtPm51bV9uYW1lcykgewpAQCAtMjA1LDkgKzIwNCw4IEBACiAJCW11dGV4X2xvY2soJmRldi0+bXV0ZXgpOwogCQlpZiAoZGV2LT5hdHRhY2hlZCAmJiBkZXYtPmRyaXZlciA9PSBkcml2ZXIpIHsKIAkJCWlmIChkZXYtPnVzZV9jb3VudCkKLQkJCQlwcmludGsKLQkJCQkgICAgKEtFUk5fV0FSTklORyAiQlVHISBkZXRhY2hpbmcgZGV2aWNlIHdpdGggdXNlX2NvdW50PSVkXG4iLAotCQkJCSAgICAgZGV2LT51c2VfY291bnQpOworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkJVRyEgZGV0YWNoaW5nIGRldmljZSB3aXRoIHVzZV9jb3VudD0lZFxuIiwKKwkJCQkJCWRldi0+dXNlX2NvdW50KTsKIAkJCWNvbWVkaV9kZXZpY2VfZGV0YWNoKGRldik7CiAJCX0KIAkJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKQEAgLTQ0Miw3ICs0NDAsOSBAQAogCQl1bnNpZ25lZCBpOwogCQlmb3IgKGkgPSAwOyBpIDwgYXN5bmMtPm5fYnVmX3BhZ2VzOyArK2kpIHsKIAkJCWlmIChhc3luYy0+YnVmX3BhZ2VfbGlzdFtpXS52aXJ0X2FkZHIpIHsKLQkJCQljbGVhcl9iaXQoUEdfcmVzZXJ2ZWQsICYodmlydF90b19wYWdlKGFzeW5jLT5idWZfcGFnZV9saXN0W2ldLnZpcnRfYWRkciktPmZsYWdzKSk7CisJCQkJY2xlYXJfYml0KFBHX3Jlc2VydmVkLAorCQkJCQkmKHZpcnRfdG9fcGFnZShhc3luYy0+YnVmX3BhZ2VfbGlzdFtpXS4KKwkJCQkJCQl2aXJ0X2FkZHIpLT5mbGFncykpOwogCQkJCWlmIChzLT5hc3luY19kbWFfZGlyICE9IERNQV9OT05FKSB7CiAJCQkJCWRtYV9mcmVlX2NvaGVyZW50KGRldi0+aHdfZGV2LAogCQkJCQkJCSAgUEFHRV9TSVpFLApAQCAtNDcwLDEwICs0NzAsOCBAQAogCQlzdHJ1Y3QgcGFnZSAqKnBhZ2VzID0gTlVMTDsKIAogCQlhc3luYy0+YnVmX3BhZ2VfbGlzdCA9Ci0JCSAgICB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgY29tZWRpX2J1Zl9wYWdlKSAqIG5fcGFnZXMpOworCQkgICAgdnphbGxvYyhzaXplb2Yoc3RydWN0IGNvbWVkaV9idWZfcGFnZSkgKiBuX3BhZ2VzKTsKIAkJaWYgKGFzeW5jLT5idWZfcGFnZV9saXN0KSB7Ci0JCQltZW1zZXQoYXN5bmMtPmJ1Zl9wYWdlX2xpc3QsIDAsCi0JCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjb21lZGlfYnVmX3BhZ2UpICogbl9wYWdlcyk7CiAJCQlwYWdlcyA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBwYWdlICopICogbl9wYWdlcyk7CiAJCX0KIAkJaWYgKHBhZ2VzKSB7CkBAIC00OTYsOCArNDk0LDEwIEBACiAJCQkJCWJyZWFrOwogCiAJCQkJc2V0X2JpdChQR19yZXNlcnZlZCwKLQkJCQkJJih2aXJ0X3RvX3BhZ2UoYXN5bmMtPmJ1Zl9wYWdlX2xpc3RbaV0udmlydF9hZGRyKS0+ZmxhZ3MpKTsKLQkJCQlwYWdlc1tpXSA9IHZpcnRfdG9fcGFnZShhc3luYy0+YnVmX3BhZ2VfbGlzdFtpXS52aXJ0X2FkZHIpOworCQkJCQkmKHZpcnRfdG9fcGFnZShhc3luYy0+YnVmX3BhZ2VfbGlzdFtpXS4KKwkJCQkJCQl2aXJ0X2FkZHIpLT5mbGFncykpOworCQkJCXBhZ2VzW2ldID0gdmlydF90b19wYWdlKGFzeW5jLT5idWZfcGFnZV9saXN0W2ldLgorCQkJCQkJCQl2aXJ0X2FkZHIpOwogCQkJfQogCQl9CiAJCWlmIChpID09IG5fcGFnZXMpIHsKQEAgLTUxNCw3ICs1MTQsMTAgQEAKIAkJCQkJICAgIE5VTEwpIHsKIAkJCQkJCWJyZWFrOwogCQkJCQl9Ci0JCQkJCWNsZWFyX2JpdChQR19yZXNlcnZlZCwgJih2aXJ0X3RvX3BhZ2UoYXN5bmMtPmJ1Zl9wYWdlX2xpc3RbaV0udmlydF9hZGRyKS0+ZmxhZ3MpKTsKKwkJCQkJY2xlYXJfYml0KFBHX3Jlc2VydmVkLAorCQkJCQkJJih2aXJ0X3RvX3BhZ2UoYXN5bmMtPgorCQkJCQkJCWJ1Zl9wYWdlX2xpc3RbaV0uCisJCQkJCQkJdmlydF9hZGRyKS0+ZmxhZ3MpKTsKIAkJCQkJaWYgKHMtPmFzeW5jX2RtYV9kaXIgIT0gRE1BX05PTkUpIHsKIAkJCQkJCWRtYV9mcmVlX2NvaGVyZW50KGRldi0+aHdfZGV2LAogCQkJCQkJCQkgIFBBR0VfU0laRSwKQEAgLTY0Niw4ICs2NDksNyBAQAogewogCWlmICgoaW50KShhc3luYy0+YnVmX3dyaXRlX2NvdW50ICsgbmJ5dGVzIC0KIAkJICBhc3luYy0+YnVmX3dyaXRlX2FsbG9jX2NvdW50KSA+IDApIHsKLQkJcHJpbnRrCi0JCSAgICAoS0VSTl9JTkZPICJjb21lZGk6IGF0dGVtcHRlZCB0byB3cml0ZS1mcmVlIG1vcmUgYnl0ZXMgdGhhbiBoYXZlIGJlZW4gd3JpdGUtYWxsb2NhdGVkLlxuIik7CisJCXByaW50ayhLRVJOX0lORk8gImNvbWVkaTogYXR0ZW1wdGVkIHRvIHdyaXRlLWZyZWUgbW9yZSBieXRlcyB0aGFuIGhhdmUgYmVlbiB3cml0ZS1hbGxvY2F0ZWQuXG4iKTsKIAkJbmJ5dGVzID0gYXN5bmMtPmJ1Zl93cml0ZV9hbGxvY19jb3VudCAtIGFzeW5jLT5idWZfd3JpdGVfY291bnQ7CiAJfQogCWFzeW5jLT5idWZfd3JpdGVfY291bnQgKz0gbmJ5dGVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9BUENJMTcxMF9Ub3IuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvQVBDSTE3MTBfVG9yLmMKaW5kZXggNzM2MWQ1MC4uMGU2YWZmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9BUENJMTcxMF9Ub3IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL0FQQ0kxNzEwX1Rvci5jCkBAIC0xMDA4LDcgKzEwMDgsNyBAQAogCWJfRXh0ZXJuR2F0ZSA9ICh1bnNpZ25lZCBjaGFyKSBkYXRhWzNdOwogCWJfQ3ljbGVNb2RlID0gKHVuc2lnbmVkIGNoYXIpIGRhdGFbNF07CiAJYl9JbnRlcnJ1cHRFbmFibGUgPSAodW5zaWduZWQgY2hhcikgZGF0YVs1XTsKLQlpX1JldHVyblZhbHVlID0gaW5zbi0+bjs7CisJaV9SZXR1cm5WYWx1ZSA9IGluc24tPm47CiAJZGV2cHJpdi0+dHNrX0N1cnJlbnQgPSBjdXJyZW50OwkvKiAgU2F2ZSB0aGUgY3VycmVudCBwcm9jZXNzIHRhc2sgc3RydWN0dXJlICovCiAJLyoqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIFRlc3QgdGhlIG1vZHVsZSBudW1iZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvYWRkaV9jb21tb24uYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvYWRkaV9jb21tb24uYwppbmRleCA5M2Q3YzA1Li43NmYyNDgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2FkZGlfY29tbW9uLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9hZGRpX2NvbW1vbi5jCkBAIC0yNzEwLDEwICsyNzEwLDEwIEBACiAJCQl9IGVsc2UgewogCQkJCW91dGwoMHg4MzgzODM4MywgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgMHg2MCk7CiAJCQl9Ci0JCQkvKiAgRW5hYmxlIHRoZSBpbnRlcnJ1cHQgZm9yIHRoZSBjb250cm9sZXIgKi8KKwkJCS8qICBFbmFibGUgdGhlIGludGVycnVwdCBmb3IgdGhlIGNvbnRyb2xsZXIgKi8KIAkJCWR3X0R1bW15ID0gaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIDB4MzgpOwogCQkJb3V0bChkd19EdW1teSB8IDB4MjAwMCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgMHgzOCk7Ci0JCQlwcmludGsoIlxuRW5hYmxlIHRoZSBpbnRlcnJ1cHQgZm9yIHRoZSBjb250cm9sZXIiKTsKKwkJCXByaW50aygiXG5FbmFibGUgdGhlIGludGVycnVwdCBmb3IgdGhlIGNvbnRyb2xsZXIiKTsKIAkJfQogCQlwcmludGsoIlxuUmVhZCBFZXByb20iKTsKIAkJaV9FZXByb21SZWFkTWFpbkhlYWRlcihpb19hZGRyWzBdLCB0aGlzX2JvYXJkLT5wY19FZXByb21DaGlwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9BUENJMTcxMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9BUENJMTcxMC5jCmluZGV4IDkxMmJjMGYuLmE3NmVkMjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfQVBDSTE3MTAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X0FQQ0kxNzEwLmMKQEAgLTIyNSw3ICsyMjUsNyBAQAogCiAJZGV2cHJpdi0+c19Cb2FyZEluZm9zLmJfQm9hcmRWZXJzaW9uID0gMTsKIAotCS8qICBFbmFibGUgdGhlIGludGVycnVwdCBmb3IgdGhlIGNvbnRyb2xlciAqLworCS8qICBFbmFibGUgdGhlIGludGVycnVwdCBmb3IgdGhlIGNvbnRyb2xsZXIgKi8KIAlkd19EdW1teSA9IGlubChkZXZwcml2LT5zX0JvYXJkSW5mb3MudWlfQWRkcmVzcyArIDB4MzgpOwogCW91dGwoZHdfRHVtbXkgfCAweDIwMDAsIGRldnByaXYtPnNfQm9hcmRJbmZvcy51aV9BZGRyZXNzICsgMHgzOCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTE1MDAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTE1MDAuYwppbmRleCAyYThhNmM3Li42MmY0MjFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kxNTAwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMTUwMC5jCkBAIC0yODUwLDcgKzI4NTAsNyBAQAogCWlfTG9naWMgPSAwOwogCWlfQ291bnRlckxvZ2ljID0gMDsKIAlpX0ludGVycnVwdE1hc2sgPSAwOwotCWlfSW5wdXRDaGFubmVsID0gMDs7CisJaV9JbnB1dENoYW5uZWwgPSAwOwogCWlfVGltZXJDb3VudGVyMUVuYWJsZWQgPSAwOwogCWlfVGltZXJDb3VudGVyMkVuYWJsZWQgPSAwOwogCWlfV2F0Y2hkb2dDb3VudGVyM0VuYWJsZWQgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMTUxNi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMTUxNi5jCmluZGV4IDEyZmNjMzUuLjhhNTg0YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTE1MTYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kxNTE2LmMKQEAgLTMzNSw3ICszMzUsNyBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0JCS8qIGlmIGVsc2UgZGF0YVszXT09MSkgKi8KIAl9CQkJLyogaWYgZWxzZSBkYXRhWzNdPT0wKSAqLwotCXJldHVybiAoaW5zbi0+bik7OworCXJldHVybiAoaW5zbi0+bik7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kzMjAwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kzMjAwLmMKaW5kZXggYjk0M2EwNi4uYTkzZTIzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMzIwMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTMyMDAuYwpAQCAtMzAxMSw3ICszMDExLDcgQEAKIAogCW91dGwoMHg4MzgzODM4MywgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgMHg2MCk7CiAKLQkvKiAgRW5hYmxlIHRoZSBpbnRlcnJ1cHQgZm9yIHRoZSBjb250cm9sZXIgKi8KKwkvKiAgRW5hYmxlIHRoZSBpbnRlcnJ1cHQgZm9yIHRoZSBjb250cm9sbGVyICovCiAJZHdfRHVtbXkgPSBpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgMHgzOCk7CiAJb3V0bChkd19EdW1teSB8IDB4MjAwMCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgMHgzOCk7CiAJb3V0bCgwLCBkZXZwcml2LT5pX0lvYmFzZUFkZG9uKTsJLyogUmVzZXRzIHRoZSBvdXRwdXQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTM1MDEuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTM1MDEuYwppbmRleCAzNTZhMTg5Li5hY2FjZWIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kzNTAxLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMzUwMS5jCkBAIC0zMzksNyArMzM5LDcgQEAKIGludCBpX0FQQ0kzNTAxX1dyaXRlQW5hbG9nT3V0cHV0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQogewotCXVuc2lnbmVkIGludCB1bF9Db21tYW5kMSA9IDAsIHVsX0NoYW5uZWxfbm8sIHVsX1BvbGFyaXR5LCB1bF9EQUNfUmVhZHkgPSAwOzsKKwl1bnNpZ25lZCBpbnQgdWxfQ29tbWFuZDEgPSAwLCB1bF9DaGFubmVsX25vLCB1bF9Qb2xhcml0eSwgdWxfREFDX1JlYWR5ID0gMDsKIAogCXVsX0NoYW5uZWxfbm8gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjaTIzMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjaTIzMC5jCmluZGV4IDVkMDY0NTcuLjdlZGViMTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wY2kyMzAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGNpMjMwLmMKQEAgLTk3MSw3ICs5NzEsNyBAQAogCWlmICh0aGlzYm9hcmQtPmFvX2NoYW5zID4gMCkgewogCQlzLT50eXBlID0gQ09NRURJX1NVQkRfQU87CiAJCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklUQUJMRSB8IFNERl9HUk9VTkQ7Ci0JCXMtPm5fY2hhbiA9IHRoaXNib2FyZC0+YW9fY2hhbnM7OworCQlzLT5uX2NoYW4gPSB0aGlzYm9hcmQtPmFvX2NoYW5zOwogCQlzLT5tYXhkYXRhID0gKDEgPDwgdGhpc2JvYXJkLT5hb19iaXRzKSAtIDE7CiAJCXMtPnJhbmdlX3RhYmxlID0gJnBjaTIzMF9hb19yYW5nZTsKIAkJcy0+aW5zbl93cml0ZSA9ICZwY2kyMzBfYW9fd2luc247CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfZGFzMTZfY3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9kYXMxNl9jcy5jCmluZGV4IDAzNDViNGMuLmJiOTM2ODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9kYXMxNl9jcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9kYXMxNl9jcy5jCkBAIC0xNjksNyArMTY5LDcgQEAKIAlpZiAoIWxpbmspCiAJCXJldHVybiAtRUlPOwogCi0JZGV2LT5pb2Jhc2UgPSBsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQ7OworCWRldi0+aW9iYXNlID0gbGluay0+cmVzb3VyY2VbMF0tPnN0YXJ0OwogCXByaW50aygiSS9PIGJhc2U9MHglMDRseCAiLCBkZXYtPmlvYmFzZSk7CiAKIAlwcmludGsoImZpbmdlcnByaW50OlxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2JvbmQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfYm9uZC5jCmluZGV4IGNmY2JkOWIuLmQ4YWVmYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfYm9uZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfYm9uZC5jCkBAIC0zNzAsNyArMzcwLDcgQEAKIAlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2c19vcGVuZWRbQ09NRURJX05VTV9CT0FSRF9NSU5PUlNdOwogCiAJbWVtc2V0KGRldnNfb3BlbmVkLCAwLCBzaXplb2YoZGV2c19vcGVuZWQpKTsKLQlkZXZwcml2LT5uYW1lWzBdID0gMDs7CisJZGV2cHJpdi0+bmFtZVswXSA9IDA7CiAJLyogTG9vcCB0aHJvdWdoIGFsbCBjb21lZGkgZGV2aWNlcyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQtbGluZSwKIAkgICBidWlsZGluZyBvdXIgZGV2aWNlIGxpc3QgKi8KIAlmb3IgKGkgPSAwOyBpIDwgQ09NRURJX05ERVZDT05GT1BUUyAmJiAoIWkgfHwgaXQtPm9wdGlvbnNbaV0pOyArK2kpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9paV9wY2kyMGtjLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvaWlfcGNpMjBrYy5jCmluZGV4IDM5YTZhODUuLmU0NzExZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9paV9wY2kyMGtjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2lpX3BjaTIwa2MuYwpAQCAtMTksNyArMTksNyBAQAogICoJCQkJLSAxNiBiaXQKICAqCiAgKglvbmx5IE9ORSBQQ0ktMjAzNDEgbW9kdWxlIHBvc3NpYmxlCi0gKiAJb25seSBPTkUgUENJLTIwMDA2IG1vZHVsZSBwb3NzaWJsZQorICoJb25seSBPTkUgUENJLTIwMDA2IG1vZHVsZSBwb3NzaWJsZQogICoJbm8gZXh0ZXJuIHRyaWdnZXIgaW1wbGVtZW50ZWQKICAqCiAgKglOT1QgV09SS0lORyAoYnV0IHNvb24pIG9ubHkgNCBvbi1ib2FyZCBkaWZmZXJlbnRpYWwgY2hhbm5lbHMgc3VwcG9ydGVkCkBAIC04MywxMSArODMsMTEgQEAKICNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKIAogI2RlZmluZSBQQ0kyMDAwMF9JRAkJCTB4MWQKLSNkZWZpbmUgUENJMjAzNDFfSUQgICAgCQkJMHg3NwotI2RlZmluZSBQQ0kyMDAwNl9JRCAgICAgIAkJMHhlMworI2RlZmluZSBQQ0kyMDM0MV9JRAkJCTB4NzcKKyNkZWZpbmUgUENJMjAwMDZfSUQJCQkweGUzCiAjZGVmaW5lIFBDSTIweHh4X0VNUFRZX0lECQkweGZmCiAKLSNkZWZpbmUgUENJMjAwMDBfT0ZGU0VUIAkJMHgxMDAKKyNkZWZpbmUgUENJMjAwMDBfT0ZGU0VUCQkJMHgxMDAKICNkZWZpbmUgUENJMjAwMDBfTU9EVUxFUwkJMwogCiAjZGVmaW5lIFBDSTIwMDAwX0RJT18wCQkJMHg4MApAQCAtMjQ2LDcgKzI0Niw3IEBACiAJCQlwY2kyMDAwNl9pbml0KGRldiwgcywgaXQtPm9wdGlvbnNbMiAqIGkgKyAyXSwKIAkJCQkgICAgICBpdC0+b3B0aW9uc1syICogaSArIDNdKTsKIAkJCXByaW50ayhLRVJOX0lORk8gImNvbWVkaSVkOiAiCi0JCQkgICAgICAgImlpX3BjaTIwa2MgUENJLTIwMDA2IG1vZHVsZSBpbiBzbG90ICVkIFxuIiwKKwkJCSAgICAgICAiaWlfcGNpMjBrYyBQQ0ktMjAwMDYgbW9kdWxlIGluIHNsb3QgJWRcbiIsCiAJCQkgICAgICAgZGV2LT5taW5vciwgaSArIDEpOwogCQkJYnJlYWs7CiAJCWNhc2UgUENJMjAzNDFfSUQ6CkBAIC0yNTUsNyArMjU1LDcgQEAKIAkJCXBjaTIwMzQxX2luaXQoZGV2LCBzLCBpdC0+b3B0aW9uc1syICogaSArIDJdLAogCQkJCSAgICAgIGl0LT5vcHRpb25zWzIgKiBpICsgM10pOwogCQkJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpJWQ6ICIKLQkJCSAgICAgICAiaWlfcGNpMjBrYyBQQ0ktMjAzNDEgbW9kdWxlIGluIHNsb3QgJWQgXG4iLAorCQkJICAgICAgICJpaV9wY2kyMGtjIFBDSS0yMDM0MSBtb2R1bGUgaW4gc2xvdCAlZFxuIiwKIAkJCSAgICAgICBkZXYtPm1pbm9yLCBpICsgMSk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKQEAgLTM3Niw5ICszNzYsMjAgQEAKIHN0YXRpYyBjb25zdCBpbnQgcGNpMjAzNDFfdGltZWJhc2VbXSA9IHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCB9Owogc3RhdGljIGNvbnN0IGludCBwY2kyMDM0MV9zZXR0bGluZ190aW1lW10gPSB7IDB4NTgsIDB4NTgsIDB4OTMsIDB4OTkgfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlIHJhbmdlX2JpcG9sYXIwXzUgPSB7IDEsIHtCSVBfUkFOR0UoMC41KX0gfTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSByYW5nZV9iaXBvbGFyMF8wNSA9IHsgMSwge0JJUF9SQU5HRSgwLjA1KX0gfTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSByYW5nZV9iaXBvbGFyMF8wMjUgPSB7IDEsIHtCSVBfUkFOR0UoMC4wMjUpfSB9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlIHJhbmdlX2JpcG9sYXIwXzUgPSB7CisJMSwKKwl7QklQX1JBTkdFKDAuNSl9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgcmFuZ2VfYmlwb2xhcjBfMDUgPSB7CisJMSwKKwl7QklQX1JBTkdFKDAuMDUpfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlIHJhbmdlX2JpcG9sYXIwXzAyNSA9IHsKKwkxLAorCXtCSVBfUkFOR0UoMC4wMjUpfQorfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlICpjb25zdCBwY2kyMDM0MV9yYW5nZXNbXSA9IHsKIAkmcmFuZ2VfYmlwb2xhcjUsCkBAIC00MDgsMTIgKzQxOSwxOCBAQAogCXMtPm1heGRhdGEgPSAweGZmZmY7CiAJcy0+cmFuZ2VfdGFibGUgPSBwY2kyMDM0MV9yYW5nZXNbb3B0MF07CiAKLQlvcHRpb24gPSBzZHAtPnBjaTIwMzQxLnRpbWViYXNlIHwgUENJMjAzNDFfUkVQTU9ERTsJLyogZGVwZW5kcyBvbiBnYWluLCB0cmlnZ2VyLCByZXBldGl0aW9uIG1vZGUgKi8KKwkvKiBkZXBlbmRzIG9uIGdhaW4sIHRyaWdnZXIsIHJlcGV0aXRpb24gbW9kZSAqLworCW9wdGlvbiA9IHNkcC0+cGNpMjAzNDEudGltZWJhc2UgfCBQQ0kyMDM0MV9SRVBNT0RFOwogCi0Jd3JpdGViKFBDSTIwMzQxX0lOSVQsIHNkcC0+aW9iYXNlICsgUENJMjAzNDFfQ09ORklHX1JFRyk7CS8qIGluaXRpYWxpemUgTW9kdWxlICovCi0Jd3JpdGViKFBDSTIwMzQxX1BBQ0VSLCBzZHAtPmlvYmFzZSArIFBDSTIwMzQxX01PRF9TVEFUVVMpOwkvKiBzZXQgUGFjZXIgKi8KLQl3cml0ZWIob3B0aW9uLCBzZHAtPmlvYmFzZSArIFBDSTIwMzQxX09QVF9SRUcpOwkvKiBvcHRpb24gcmVnaXN0ZXIgKi8KLQl3cml0ZWIoc2RwLT5wY2kyMDM0MS5zZXR0bGluZ190aW1lLCBzZHAtPmlvYmFzZSArIFBDSTIwMzQxX1NFVF9USU1FX1JFRyk7CS8qIHNldHRsaW5nIHRpbWUgY291bnRlciAqLworCS8qIGluaXRpYWxpemUgTW9kdWxlICovCisJd3JpdGViKFBDSTIwMzQxX0lOSVQsIHNkcC0+aW9iYXNlICsgUENJMjAzNDFfQ09ORklHX1JFRyk7CisJLyogc2V0IFBhY2VyICovCisJd3JpdGViKFBDSTIwMzQxX1BBQ0VSLCBzZHAtPmlvYmFzZSArIFBDSTIwMzQxX01PRF9TVEFUVVMpOworCS8qIG9wdGlvbiByZWdpc3RlciAqLworCXdyaXRlYihvcHRpb24sIHNkcC0+aW9iYXNlICsgUENJMjAzNDFfT1BUX1JFRyk7CisJLyogc2V0dGxpbmcgdGltZSBjb3VudGVyICovCisJd3JpdGViKHNkcC0+cGNpMjAzNDEuc2V0dGxpbmdfdGltZSwKKwkJc2RwLT5pb2Jhc2UgKyBQQ0kyMDM0MV9TRVRfVElNRV9SRUcpOwogCS8qIHRyaWdnZXIgbm90IGltcGxlbWVudGVkICovCiAJcmV0dXJuIDA7CiB9CkBAIC00MjksMTEgKzQ0NiwxNSBAQAogCXVuc2lnbmVkIGludCBjbGI7CS8qIGNoYW5uZWwgbGlzdCBieXRlICovCiAJdW5zaWduZWQgaW50IGJvYXJkZGF0YTsKIAotCXdyaXRlYigxLCBzZHAtPmlvYmFzZSArIFBDSTIwMzQxX0xDSEFOX0FERFJfUkVHKTsJLyogd3JpdGUgbnVtYmVyIG9mIGlucHV0IGNoYW5uZWxzICovCisJLyogd3JpdGUgbnVtYmVyIG9mIGlucHV0IGNoYW5uZWxzICovCisJd3JpdGViKDEsIHNkcC0+aW9iYXNlICsgUENJMjAzNDFfTENIQU5fQUREUl9SRUcpOwogCWNsYiA9IFBDSTIwMzQxX0RBSVNZX0NIQUlOIHwgUENJMjAzNDFfTVVYIHwgKHNkcC0+cGNpMjAzNDEuYWlfZ2FpbiA8PCAzKQogCSAgICB8IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwogCXdyaXRlYihjbGIsIHNkcC0+aW9iYXNlICsgUENJMjAzNDFfQ0hBTl9MSVNUKTsKLQl3cml0ZWIoMHgwMCwgc2RwLT5pb2Jhc2UgKyBQQ0kyMDM0MV9DQ19SRVNFVCk7CS8qIHJlc2V0IHNldHRsaW5nIHRpbWUgY291bnRlciBhbmQgdHJpZ2dlciBkZWxheSBjb3VudGVyICovCisKKwkvKiByZXNldCBzZXR0bGluZyB0aW1lIGNvdW50ZXIgYW5kIHRyaWdnZXIgZGVsYXkgY291bnRlciAqLworCXdyaXRlYigweDAwLCBzZHAtPmlvYmFzZSArIFBDSTIwMzQxX0NDX1JFU0VUKTsKKwogCXdyaXRlYigweDAwLCBzZHAtPmlvYmFzZSArIFBDSTIwMzQxX0NIQU5fUkVTRVQpOwogCiAJLyogZ2VuZXJhdGUgUGFjZXIgKi8KQEAgLTQ0NCw5ICs0NjUsMTIgQEAKIAkJICogdGhlIHdob2xlIGludGVycnVwdCBzdHVmZgogCQkgKi8KIAkJaiA9IDA7Ci0JCXJlYWRiKHNkcC0+aW9iYXNlICsgUENJMjAzNDFfU09GVF9QQUNFUik7CS8qIGdlbmVyYXRlIFBhY2VyICovCisJCS8qIGdlbmVyYXRlIFBhY2VyICovCisJCXJlYWRiKHNkcC0+aW9iYXNlICsgUENJMjAzNDFfU09GVF9QQUNFUik7CisKIAkJZW9jID0gcmVhZGIoc2RwLT5pb2Jhc2UgKyBQQ0kyMDM0MV9TVEFUVVNfUkVHKTsKLQkJd2hpbGUgKChlb2MgPCAweDgwKSAmJiBqIDwgMTAwKSB7CS8qIHBvbGwgSW50ZXJydXB0IEZsYWcgKi8KKwkJLyogcG9sbCBJbnRlcnJ1cHQgRmxhZyAqLworCQl3aGlsZSAoKGVvYyA8IDB4ODApICYmIGogPCAxMDApIHsKIAkJCWorKzsKIAkJCWVvYyA9IHJlYWRiKHNkcC0+aW9iYXNlICsgUENJMjAzNDFfU1RBVFVTX1JFRyk7CiAJCX0KQEAgLTQ2MCw3ICs0ODQsOSBAQAogCQlsbyA9IHJlYWRiKHNkcC0+aW9iYXNlICsgUENJMjAzNDFfTERBVEEpOwogCQloaSA9IHJlYWRiKHNkcC0+aW9iYXNlICsgUENJMjAzNDFfTERBVEEgKyAxKTsKIAkJYm9hcmRkYXRhID0gbG8gKyAweDEwMCAqIGhpOwotCQlkYXRhW2ldID0gKHNob3J0KSgoYm9hcmRkYXRhICsgMHg4MDAwKSAmIDB4ZmZmZik7CS8qIGJvYXJkLWRhdGEgLT4gY29tZWRpLWRhdGEgKi8KKworCQkvKiBib2FyZC1kYXRhIC0+IGNvbWVkaS1kYXRhICovCisJCWRhdGFbaV0gPSAoc2hvcnQpKChib2FyZGRhdGEgKyAweDgwMDApICYgMHhmZmZmKTsKIAl9CiAKIAlyZXR1cm4gaTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9qcjNfcGNpLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvanIzX3BjaS5jCmluZGV4IDhiMzgzZWUuLjVjNmM3MjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9qcjNfcGNpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2pyM19wY2kuYwpAQCAtNTQsNiArNTQsNyBAQAogCiAjZGVmaW5lIFBDSV9WRU5ET1JfSURfSlIzIDB4MTc2MgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0pSM18xX0NIQU5ORUwgMHgzMTExCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSlIzXzFfQ0hBTk5FTF9ORVcgMHgxMTExCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSlIzXzJfQ0hBTk5FTCAweDMxMTIKICNkZWZpbmUgUENJX0RFVklDRV9JRF9KUjNfM19DSEFOTkVMIDB4MzExMwogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0pSM180X0NIQU5ORUwgMHgzMTE0CkBAIC03Myw2ICs3NCw4IEBACiAJewogCVBDSV9WRU5ET1JfSURfSlIzLCBQQ0lfREVWSUNFX0lEX0pSM18xX0NIQU5ORUwsCiAJCSAgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgeworCVBDSV9WRU5ET1JfSURfSlIzLCBQQ0lfREVWSUNFX0lEX0pSM18xX0NIQU5ORUxfTkVXLAorCQkgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIHsKIAlQQ0lfVkVORE9SX0lEX0pSMywgUENJX0RFVklDRV9JRF9KUjNfMl9DSEFOTkVMLAogCQkgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIHsKIAlQQ0lfVkVORE9SX0lEX0pSMywgUENJX0RFVklDRV9JRF9KUjNfM19DSEFOTkVMLApAQCAtODA3LDYgKzgxMCwxMCBAQAogCQkJCQlkZXZwcml2LT5uX2NoYW5uZWxzID0gMTsKIAkJCQl9CiAJCQkJYnJlYWs7CisJCQljYXNlIFBDSV9ERVZJQ0VfSURfSlIzXzFfQ0hBTk5FTF9ORVc6eworCQkJCQlkZXZwcml2LT5uX2NoYW5uZWxzID0gMTsKKwkJCQl9CisJCQkJYnJlYWs7CiAJCQljYXNlIFBDSV9ERVZJQ0VfSURfSlIzXzJfQ0hBTk5FTDp7CiAJCQkJCWRldnByaXYtPm5fY2hhbm5lbHMgPSAyOwogCQkJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV90aW9jbWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV90aW9jbWQuYwppbmRleCBiMGQ0NGI1Li5hOTYxMTU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfdGlvY21kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX3Rpb2NtZC5jCkBAIC02MiwxMSArNjIsMTAgQEAKIAl1bnNpZ25lZCBpbnB1dF9zZWxlY3RfYml0cyA9IDA7CiAKIAlpZiAoZW5hYmxlKSB7Ci0JCWlmIChyZWFkX25vdF93cml0ZSkgeworCQlpZiAocmVhZF9ub3Rfd3JpdGUpCiAJCQlpbnB1dF9zZWxlY3RfYml0cyB8PSBHaV9SZWFkX0Fja25vd2xlZGdlc19JcnE7Ci0JCX0gZWxzZSB7CisJCWVsc2UKIAkJCWlucHV0X3NlbGVjdF9iaXRzIHw9IEdpX1dyaXRlX0Fja25vd2xlZGdlc19JcnE7Ci0JCX0KIAl9CiAJbmlfdGlvX3NldF9iaXRzKGNvdW50ZXIsCiAJCQlOSVRJT19HaV9JbnB1dF9TZWxlY3RfUmVnKGNvdW50ZXItPmNvdW50ZXJfaW5kZXgpLApAQCAtODQsOSArODMsOCBAQAogCQkJCWdpX2RtYV9jb25maWdfYml0cyB8PSBHaV9ETUFfRW5hYmxlX0JpdDsKIAkJCQlnaV9kbWFfY29uZmlnX2JpdHMgfD0gR2lfRE1BX0ludF9CaXQ7CiAJCQl9Ci0JCQlpZiAocmVhZF9ub3Rfd3JpdGUgPT0gMCkgeworCQkJaWYgKHJlYWRfbm90X3dyaXRlID09IDApCiAJCQkJZ2lfZG1hX2NvbmZpZ19iaXRzIHw9IEdpX0RNQV9Xcml0ZV9CaXQ7Ci0JCQl9CiAJCQluaV90aW9fc2V0X2JpdHMoY291bnRlciwKIAkJCQkJTklUSU9fR2lfRE1BX0NvbmZpZ19SZWcoY291bnRlci0+CiAJCQkJCQkJCWNvdW50ZXJfaW5kZXgpLApAQCAtMTc0LDcgKzE3Miw3IEBACiBzdGF0aWMgaW50IG5pX3Rpb19vdXRwdXRfY21kKHN0cnVjdCBuaV9ncGN0ICpjb3VudGVyLAogCQkJICAgICBzdHJ1Y3QgY29tZWRpX2FzeW5jICphc3luYykKIHsKLQlwcmludGsoIm5pX3Rpbzogb3V0cHV0IGNvbW1hbmRzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuXG4iKTsKKwlwcmludGsoS0VSTl9FUlIgIm5pX3Rpbzogb3V0cHV0IGNvbW1hbmRzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuXG4iKTsKIAlyZXR1cm4gLUVOT1RTVVBQOwogCiAJY291bnRlci0+bWl0ZV9jaGFuLT5kaXIgPSBDT01FRElfT1VUUFVUOwpAQCAtMTk4LDkgKzE5Niw4IEBACiAJCXNldF9nYXRlX3NvdXJjZSA9IDE7CiAJCWdhdGVfc291cmNlID0gY21kLT5jb252ZXJ0X2FyZzsKIAl9Ci0JaWYgKHNldF9nYXRlX3NvdXJjZSkgeworCWlmIChzZXRfZ2F0ZV9zb3VyY2UpCiAJCXJldHZhbCA9IG5pX3Rpb19zZXRfZ2F0ZV9zcmMoY291bnRlciwgMCwgZ2F0ZV9zb3VyY2UpOwotCX0KIAlpZiAoY21kLT5mbGFncyAmIFRSSUdfV0FLRV9FT1MpIHsKIAkJbmlfdGlvX3NldF9iaXRzKGNvdW50ZXIsCiAJCQkJTklUSU9fR2lfSW50ZXJydXB0X0VuYWJsZV9SZWcoY291bnRlci0+CkBAIC0yMjEsMjIgKzIxOCwyMSBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNvdW50ZXItPmxvY2ssIGZsYWdzKTsKIAlpZiAoY291bnRlci0+bWl0ZV9jaGFuID09IE5VTEwpIHsKLQkJcHJpbnRrCi0JCSAgICAoIm5pX3RpbzogY29tbWFuZHMgb25seSBzdXBwb3J0ZWQgd2l0aCBETUEuICBJbnRlcnJ1cHQtZHJpdmVuIGNvbW1hbmRzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJuaV90aW86IGNvbW1hbmRzIG9ubHkgc3VwcG9ydGVkIHdpdGggRE1BLiAgSW50ZXJydXB0LWRyaXZlbiBjb21tYW5kcyBub3QgeWV0IGltcGxlbWVudGVkLlxuIik7CiAJCXJldHZhbCA9IC1FSU87CiAJfSBlbHNlIHsKIAkJcmV0dmFsID0gbmlfdGlvX2NtZF9zZXR1cChjb3VudGVyLCBhc3luYyk7CiAJCWlmIChyZXR2YWwgPT0gMCkgewotCQkJaWYgKGNtZC0+ZmxhZ3MgJiBDTURGX1dSSVRFKSB7CisJCQlpZiAoY21kLT5mbGFncyAmIENNREZfV1JJVEUpCiAJCQkJcmV0dmFsID0gbmlfdGlvX291dHB1dF9jbWQoY291bnRlciwgYXN5bmMpOwotCQkJfSBlbHNlIHsKKwkJCWVsc2UKIAkJCQlyZXR2YWwgPSBuaV90aW9faW5wdXRfY21kKGNvdW50ZXIsIGFzeW5jKTsKLQkJCX0KIAkJfQogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb3VudGVyLT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIHJldHZhbDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKG5pX3Rpb19jbWQpOwogCiBpbnQgbmlfdGlvX2NtZHRlc3Qoc3RydWN0IG5pX2dwY3QgKmNvdW50ZXIsIHN0cnVjdCBjb21lZGlfY21kICpjbWQpCiB7CkBAIC0zNDIsNiArMzM4LDcgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTF9HUEwobmlfdGlvX2NtZHRlc3QpOwogCiBpbnQgbmlfdGlvX2NhbmNlbChzdHJ1Y3QgbmlfZ3BjdCAqY291bnRlcikKIHsKQEAgLTM0OSw5ICszNDYsOCBAQAogCiAJbmlfdGlvX2FybShjb3VudGVyLCAwLCAwKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY291bnRlci0+bG9jaywgZmxhZ3MpOwotCWlmIChjb3VudGVyLT5taXRlX2NoYW4pIHsKKwlpZiAoY291bnRlci0+bWl0ZV9jaGFuKQogCQltaXRlX2RtYV9kaXNhcm0oY291bnRlci0+bWl0ZV9jaGFuKTsKLQl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY291bnRlci0+bG9jaywgZmxhZ3MpOwogCW5pX3Rpb19jb25maWd1cmVfZG1hKGNvdW50ZXIsIDAsIDApOwogCkBAIC0zNjEsMTAgKzM1NywxMSBAQAogCQkJMHgwKTsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKG5pX3Rpb19jYW5jZWwpOwogCi0JLyogRHVyaW5nIGJ1ZmZlcmVkIGlucHV0IGNvdW50ZXIgb3BlcmF0aW9uIGZvciBlLXNlcmllcywgdGhlIGdhdGUgaW50ZXJydXB0IGlzIGFja2VkCi0JICAgYXV0b21hdGljYWxseSBieSB0aGUgZG1hIGNvbnRyb2xsZXIsIGR1ZSB0byB0aGUgR2lfUmVhZC9Xcml0ZV9BY2tub3dsZWRnZXNfSVJRIGJpdHMKLQkgICBpbiB0aGUgaW5wdXQgc2VsZWN0IHJlZ2lzdGVyLiAgKi8KKwkvKiBEdXJpbmcgYnVmZmVyZWQgaW5wdXQgY291bnRlciBvcGVyYXRpb24gZm9yIGUtc2VyaWVzLCB0aGUgZ2F0ZQorCSAgIGludGVycnVwdCBpcyBhY2tlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBkbWEgY29udHJvbGxlciwgZHVlIHRvIHRoZQorCSAgIEdpX1JlYWQvV3JpdGVfQWNrbm93bGVkZ2VzX0lSUSBiaXRzIGluIHRoZSBpbnB1dCBzZWxlY3QgcmVnaXN0ZXIuICAqLwogc3RhdGljIGludCBzaG91bGRfYWNrX2dhdGUoc3RydWN0IG5pX2dwY3QgKmNvdW50ZXIpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTM3Miw3ICszNjksMTAgQEAKIAogCXN3aXRjaCAoY291bnRlci0+Y291bnRlcl9kZXYtPnZhcmlhbnQpIHsKIAljYXNlIG5pX2dwY3RfdmFyaWFudF9tX3NlcmllczoKLQljYXNlIG5pX2dwY3RfdmFyaWFudF82NjB4OgkvKiAgbm90IHN1cmUgaWYgNjYweCByZWFsbHkgc3VwcG9ydHMgZ2F0ZSBpbnRlcnJ1cHRzICh0aGUgYml0cyBhcmUgbm90IGxpc3RlZCBpbiByZWdpc3Rlci1sZXZlbCBtYW51YWwpICovCisJLyogIG5vdCBzdXJlIGlmIDY2MHggcmVhbGx5IHN1cHBvcnRzIGdhdGUKKwkgICAgaW50ZXJydXB0cyAodGhlIGJpdHMgYXJlIG5vdCBsaXN0ZWQKKwkgICAgaW4gcmVnaXN0ZXItbGV2ZWwgbWFudWFsKSAqLworCWNhc2UgbmlfZ3BjdF92YXJpYW50XzY2MHg6CiAJCXJldHVybiAxOwogCQlicmVhazsKIAljYXNlIG5pX2dwY3RfdmFyaWFudF9lX3NlcmllczoKQEAgLTQxNiw3ICs0MTYsOCBAQAogCWlmIChneHhfc3RhdHVzICYgR2lfR2F0ZV9FcnJvcl9CaXQoY291bnRlci0+Y291bnRlcl9pbmRleCkpIHsKIAkJYWNrIHw9IEdpX0dhdGVfRXJyb3JfQ29uZmlybV9CaXQoY291bnRlci0+Y291bnRlcl9pbmRleCk7CiAJCWlmIChnYXRlX2Vycm9yKSB7Ci0JCQkvKjY2MHggZG9uJ3Qgc3VwcG9ydCBhdXRvbWF0aWMgYWNrbm93bGVkZ2VtZW50IG9mIGdhdGUgaW50ZXJydXB0IHZpYSBkbWEgcmVhZC93cml0ZQorCQkJLyo2NjB4IGRvbid0IHN1cHBvcnQgYXV0b21hdGljIGFja25vd2xlZGdlbWVudAorCQkJICBvZiBnYXRlIGludGVycnVwdCB2aWEgZG1hIHJlYWQvd3JpdGUKIAkJCSAgIGFuZCByZXBvcnQgYm9ndXMgZ2F0ZSBlcnJvcnMgKi8KIAkJCWlmIChjb3VudGVyLT5jb3VudGVyX2Rldi0+dmFyaWFudCAhPQogCQkJICAgIG5pX2dwY3RfdmFyaWFudF82NjB4KSB7CkBAIC00MjksOSArNDMwLDggQEAKIAkJaWYgKHRjX2Vycm9yKQogCQkJKnRjX2Vycm9yID0gMTsKIAl9Ci0JaWYgKGdpX3N0YXR1cyAmIEdpX1RDX0JpdCkgeworCWlmIChnaV9zdGF0dXMgJiBHaV9UQ19CaXQpCiAJCWFjayB8PSBHaV9UQ19JbnRlcnJ1cHRfQWNrX0JpdDsKLQl9CiAJaWYgKGdpX3N0YXR1cyAmIEdpX0dhdGVfSW50ZXJydXB0X0JpdCkgewogCQlpZiAoc2hvdWxkX2Fja19nYXRlKGNvdW50ZXIpKQogCQkJYWNrIHw9IEdpX0dhdGVfSW50ZXJydXB0X0Fja19CaXQ7CkBAIC00NTIsMTMgKzQ1MiwxNCBAQAogCQkJCSAgTklUSU9fR3h4X0pvaW50X1N0YXR1czJfUmVnCiAJCQkJICAoY291bnRlci0+Y291bnRlcl9pbmRleCkpICYKIAkJICAgIEdpX1Blcm1hbmVudF9TdGFsZV9CaXQoY291bnRlci0+Y291bnRlcl9pbmRleCkpIHsKLQkJCXByaW50aygiJXM6IEdpX1Blcm1hbmVudF9TdGFsZV9EYXRhIGRldGVjdGVkLlxuIiwKLQkJCSAgICAgICBfX0ZVTkNUSU9OX18pOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEdpX1Blcm1hbmVudF9TdGFsZV9EYXRhIGRldGVjdGVkLlxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXyk7CiAJCQlpZiAocGVybV9zdGFsZV9kYXRhKQogCQkJCSpwZXJtX3N0YWxlX2RhdGEgPSAxOwogCQl9CiAJfQogfQorRVhQT1JUX1NZTUJPTF9HUEwobmlfdGlvX2Fja25vd2xlZGdlX2FuZF9jb25maXJtKTsKIAogdm9pZCBuaV90aW9faGFuZGxlX2ludGVycnVwdChzdHJ1Y3QgbmlfZ3BjdCAqY291bnRlciwKIAkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCkBAIC00NzIsMjAgKzQ3MywxOSBAQAogCW5pX3Rpb19hY2tub3dsZWRnZV9hbmRfY29uZmlybShjb3VudGVyLCAmZ2F0ZV9lcnJvciwgJnRjX2Vycm9yLAogCQkJCSAgICAgICAmcGVybV9zdGFsZV9kYXRhLCBOVUxMKTsKIAlpZiAoZ2F0ZV9lcnJvcikgewotCQlwcmludGsoIiVzOiBHaV9HYXRlX0Vycm9yIGRldGVjdGVkLlxuIiwgX19GVU5DVElPTl9fKTsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogR2lfR2F0ZV9FcnJvciBkZXRlY3RlZC5cbiIsIF9fZnVuY19fKTsKIAkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfT1ZFUkZMT1c7CiAJfQotCWlmIChwZXJtX3N0YWxlX2RhdGEpIHsKKwlpZiAocGVybV9zdGFsZV9kYXRhKQogCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FUlJPUjsKLQl9CiAJc3dpdGNoIChjb3VudGVyLT5jb3VudGVyX2Rldi0+dmFyaWFudCkgewogCWNhc2UgbmlfZ3BjdF92YXJpYW50X21fc2VyaWVzOgogCWNhc2UgbmlfZ3BjdF92YXJpYW50XzY2MHg6CiAJCWlmIChyZWFkX3JlZ2lzdGVyKGNvdW50ZXIsCi0JCQkJICBOSVRJT19HaV9ETUFfU3RhdHVzX1JlZwotCQkJCSAgKGNvdW50ZXItPmNvdW50ZXJfaW5kZXgpKSAmIEdpX0RSUV9FcnJvcl9CaXQpCi0JCXsKLQkJCXByaW50aygiJXM6IEdpX0RSUV9FcnJvciBkZXRlY3RlZC5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCQkJTklUSU9fR2lfRE1BX1N0YXR1c19SZWcKKwkJCQkoY291bnRlci0+Y291bnRlcl9pbmRleCkpICYgR2lfRFJRX0Vycm9yX0JpdCkgeworCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogR2lfRFJRX0Vycm9yIGRldGVjdGVkLlxuIiwKKwkJCQkJCQlfX2Z1bmNfXyk7CiAJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9PVkVSRkxPVzsKIAkJfQogCQlicmVhazsKQEAgLTUwNiw2ICs1MDYsNyBAQAogCW1pdGVfc3luY19pbnB1dF9kbWEoY291bnRlci0+bWl0ZV9jaGFuLCBzLT5hc3luYyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY291bnRlci0+bG9jaywgZmxhZ3MpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwobmlfdGlvX2hhbmRsZV9pbnRlcnJ1cHQpOwogCiB2b2lkIG5pX3Rpb19zZXRfbWl0ZV9jaGFubmVsKHN0cnVjdCBuaV9ncGN0ICpjb3VudGVyLAogCQkJICAgICBzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pCkBAIC01MTYsNiArNTE3LDcgQEAKIAljb3VudGVyLT5taXRlX2NoYW4gPSBtaXRlX2NoYW47CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY291bnRlci0+bG9jaywgZmxhZ3MpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwobmlfdGlvX3NldF9taXRlX2NoYW5uZWwpOwogCiBzdGF0aWMgaW50IF9faW5pdCBuaV90aW9jbWRfaW5pdF9tb2R1bGUodm9pZCkKIHsKQEAgLTUyOSwxMCArNTMxLDMgQEAKIH0KIAogbW9kdWxlX2V4aXQobmlfdGlvY21kX2NsZWFudXBfbW9kdWxlKTsKLQotRVhQT1JUX1NZTUJPTF9HUEwobmlfdGlvX2NtZCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChuaV90aW9fY21kdGVzdCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChuaV90aW9fY2FuY2VsKTsKLUVYUE9SVF9TWU1CT0xfR1BMKG5pX3Rpb19oYW5kbGVfaW50ZXJydXB0KTsKLUVYUE9SVF9TWU1CT0xfR1BMKG5pX3Rpb19zZXRfbWl0ZV9jaGFubmVsKTsKLUVYUE9SVF9TWU1CT0xfR1BMKG5pX3Rpb19hY2tub3dsZWRnZV9hbmRfY29uZmlybSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcnRkNTIwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcnRkNTIwLmMKaW5kZXggNjBlYmZjMy4uYWE4YWVlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3J0ZDUyMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9ydGQ1MjAuYwpAQCAtNzUzLDcgKzc1Myw3IEBACiAJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7CiAJc3RydWN0IHBjaV9kZXYgKnBjaWRldjsKIAlpbnQgcmV0OwotCXJlc291cmNlX3NpemVfdCBwaHlzTGFzMDsJLyogY29uZmlndWF0aW9uICovCisJcmVzb3VyY2Vfc2l6ZV90IHBoeXNMYXMwOwkvKiBjb25maWd1cmF0aW9uICovCiAJcmVzb3VyY2Vfc2l6ZV90IHBoeXNMYXMxOwkvKiBkYXRhIGFyZWEgKi8KIAlyZXNvdXJjZV9zaXplX3QgcGh5c0xjZmc7CS8qIFBMWDkwODAgKi8KICNpZmRlZiBVU0VfRE1BCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczUyNi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3M1MjYuYwppbmRleCAzNjA3YWFlLi4yYjM0ZGFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczUyNi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zNTI2LmMKQEAgLTExNCw3ICsxMTQsNyBAQAogfTsKIAogc3RydWN0IGNvdW50ZXJfbW9kZV9yZWdpc3Rlcl90IHsKLSNpZiBkZWZpbmVkIChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCiAJdW5zaWduZWQgc2hvcnQgY291dFNvdXJjZToxOwogCXVuc2lnbmVkIHNob3J0IGNvdXRQb2xhcml0eToxOwogCXVuc2lnbmVkIHNob3J0IGF1dG9Mb2FkUmVzZXRSY2FwOjM7CkBAIC0yMDcsNyArMjA3LDkgQEAKIAogLyogdGhpcyBzdHJ1Y3R1cmUgaXMgZm9yIGRhdGEgdW5pcXVlIHRvIHRoaXMgaGFyZHdhcmUgZHJpdmVyLiAgSWYKICAgIHNldmVyYWwgaGFyZHdhcmUgZHJpdmVycyBrZWVwIHNpbWlsYXIgaW5mb3JtYXRpb24gaW4gdGhpcyBzdHJ1Y3R1cmUsCi0gICBmZWVsIGZyZWUgdG8gc3VnZ2VzdCBtb3ZpbmcgdGhlIHZhcmlhYmxlIHRvIHRoZSBzdHJ1Y3QgY29tZWRpX2RldmljZSBzdHJ1Y3QuICAqLworICAgZmVlbCBmcmVlIHRvIHN1Z2dlc3QgbW92aW5nIHRoZSB2YXJpYWJsZSB0byB0aGUgc3RydWN0IGNvbWVkaV9kZXZpY2UKKyAgIHN0cnVjdC4KKyovCiBzdHJ1Y3QgczUyNl9wcml2YXRlIHsKIAogCWludCBkYXRhOwpAQCAtMzA0LDcgKzMwNiw3IEBACiAvKiBpbnQgc3ViZGV2X2NoYW5uZWwgPSAwOyAqLwogCXVuaW9uIGNtUmVnIGNtUmVnOwogCi0JcHJpbnRrKCJjb21lZGklZDogczUyNjogIiwgZGV2LT5taW5vcik7CisJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpJWQ6IHM1MjY6ICIsIGRldi0+bWlub3IpOwogCiAJaW9iYXNlID0gaXQtPm9wdGlvbnNbMF07CiAJaWYgKCFpb2Jhc2UgfHwgIXJlcXVlc3RfcmVnaW9uKGlvYmFzZSwgUzUyNl9JT1NJWkUsIHRoaXNib2FyZC0+bmFtZSkpIHsKQEAgLTMxNyw3ICszMTksOCBAQAogCiAJLyoqKiBtYWtlIGl0IGEgbGl0dGxlIHF1aWV0ZXIsIGV4dywgOC8yOS8wNgogCWZvciAoaSA9IDA7IGkgPCBTNTI2X05VTV9QT1JUUzsgaSsrKSB7Ci0JCXByaW50aygiMHglMDJ4OiAweCUwNHhcbiIsIEFERFJfUkVHKHM1MjZfcG9ydHNbaV0pLCBpbncoQUREUl9SRUcoczUyNl9wb3J0c1tpXSkpKTsKKwkJcHJpbnRrKCIweCUwMng6IDB4JTA0eFxuIiwgQUREUl9SRUcoczUyNl9wb3J0c1tpXSksCisJCQkJaW53KEFERFJfUkVHKHM1MjZfcG9ydHNbaV0pKSk7CiAJfQogCSoqKi8KIApAQCAtNDAyLDcgKzQwNSw3IEBACiAJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9VTlVTRUQ7CiAJfQogCi0JcHJpbnRrKCJhdHRhY2hlZFxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiYXR0YWNoZWRcbiIpOwogCiAJcmV0dXJuIDE7CiAKQEAgLTQxMSw3ICs0MTQsNyBAQAogCS8qIE9uZS1zaG90IChzb2Z0d2FyZSB0cmlnZ2VyKSAqLwogCWNtUmVnLnJlZy5jb3V0U291cmNlID0gMDsJLyogIG91dCBSQ0FQICovCiAJY21SZWcucmVnLmNvdXRQb2xhcml0eSA9IDE7CS8qICBQb2xhcml0eSBpbnZlcnRlZCAqLwotCWNtUmVnLnJlZy5hdXRvTG9hZFJlc2V0UmNhcCA9IDE7CS8qICBBdXRvIGxvYWQgMDpkaXNhYmxlZCwgMTplbmFibGVkICovCisJY21SZWcucmVnLmF1dG9Mb2FkUmVzZXRSY2FwID0gMTsvKiAgQXV0byBsb2FkIDA6ZGlzYWJsZWQsIDE6ZW5hYmxlZCAqLwogCWNtUmVnLnJlZy5od0N0RW5hYmxlU291cmNlID0gMzsJLyogIE5PVCBSQ0FQICovCiAJY21SZWcucmVnLmN0RW5hYmxlQ3RybCA9IDI7CS8qICBIYXJkd2FyZSAqLwogCWNtUmVnLnJlZy5jbG9ja1NvdXJjZSA9IDI7CS8qICBJbnRlcm5hbCAqLwpAQCAtNDI2LDEwICs0MjksMTIgQEAKIAlvdXR3KDB4MDAwMSwgQUREUl9DSEFOX1JFRyhSRUdfQzBILCBzdWJkZXZfY2hhbm5lbCkpOwogCW91dHcoMHgzQzY4LCBBRERSX0NIQU5fUkVHKFJFR19DMEwsIHN1YmRldl9jaGFubmVsKSk7CiAKLQlvdXR3KDB4ODAwMCwgQUREUl9DSEFOX1JFRyhSRUdfQzBDLCBzdWJkZXZfY2hhbm5lbCkpOwkvKiAgUmVzZXQgdGhlIGNvdW50ZXIgKi8KLQlvdXR3KDB4NDAwMCwgQUREUl9DSEFOX1JFRyhSRUdfQzBDLCBzdWJkZXZfY2hhbm5lbCkpOwkvKiAgTG9hZCB0aGUgY291bnRlciBmcm9tIFBSMCAqLwotCi0Jb3V0dygweDAwMDgsIEFERFJfQ0hBTl9SRUcoUkVHX0MwQywgc3ViZGV2X2NoYW5uZWwpKTsJLyogIFJlc2V0IFJDQVAgKGZpcmVzIG9uZS1zaG90KSAqLworCS8qICBSZXNldCB0aGUgY291bnRlciAqLworCW91dHcoMHg4MDAwLCBBRERSX0NIQU5fUkVHKFJFR19DMEMsIHN1YmRldl9jaGFubmVsKSk7CisJLyogIExvYWQgdGhlIGNvdW50ZXIgZnJvbSBQUjAgKi8KKwlvdXR3KDB4NDAwMCwgQUREUl9DSEFOX1JFRyhSRUdfQzBDLCBzdWJkZXZfY2hhbm5lbCkpOworCS8qICBSZXNldCBSQ0FQIChmaXJlcyBvbmUtc2hvdCkgKi8KKwlvdXR3KDB4MDAwOCwgQUREUl9DSEFOX1JFRyhSRUdfQzBDLCBzdWJkZXZfY2hhbm5lbCkpOwogCiAjZWxzZQogCkBAIC00NDcsMTEgKzQ1MiwxMiBAQAogCWNtUmVnLnJlZy5yZXNlcnZlZCA9IDA7CiAKIAluID0gMDsKLQlwcmludGsoIk1vZGUgcmVnPTB4JTA0eCwgMHglMDRseFxuIiwgY21SZWcudmFsdWUsIEFERFJfQ0hBTl9SRUcoUkVHX0MwTSwKLQkJCQkJCQkJCW4pKTsKKwlwcmludGsoS0VSTl9JTkZPICJNb2RlIHJlZz0weCUwNHgsIDB4JTA0bHhcbiIsCisJCWNtUmVnLnZhbHVlLCBBRERSX0NIQU5fUkVHKFJFR19DME0sIG4pKTsKIAlvdXR3KGNtUmVnLnZhbHVlLCBBRERSX0NIQU5fUkVHKFJFR19DME0sIG4pKTsKIAl1ZGVsYXkoMTAwMCk7Ci0JcHJpbnRrKCJSZWFkIGJhY2sgbW9kZSByZWc9MHglMDR4XG4iLCBpbncoQUREUl9DSEFOX1JFRyhSRUdfQzBNLCBuKSkpOworCXByaW50ayhLRVJOX0lORk8gIlJlYWQgYmFjayBtb2RlIHJlZz0weCUwNHhcbiIsCisJCWludyhBRERSX0NIQU5fUkVHKFJFR19DME0sIG4pKSk7CiAKIAkvKiAgTG9hZCB0aGUgcHJlLWxvYWQgcmVnaXN0ZXIgaGlnaCB3b3JkICovCiAvKiB2YWx1ZSA9IChzaG9ydCkgKDB4NTUpOyAqLwpAQCAtNDY2LDIwICs0NzIsMjMgQEAKIAogCS8qICBSZXNldCB0aGUgY291bnRlciBpZiBpdCBpcyBzb2Z0d2FyZSBwcmVsb2FkICovCiAJaWYgKGNtUmVnLnJlZy5hdXRvTG9hZFJlc2V0UmNhcCA9PSAwKSB7Ci0JCW91dHcoMHg4MDAwLCBBRERSX0NIQU5fUkVHKFJFR19DMEMsIG4pKTsJLyogIFJlc2V0IHRoZSBjb3VudGVyICovCi0JCW91dHcoMHg0MDAwLCBBRERSX0NIQU5fUkVHKFJFR19DMEMsIG4pKTsJLyogIExvYWQgdGhlIGNvdW50ZXIgZnJvbSBQUjAgKi8KKwkJLyogIFJlc2V0IHRoZSBjb3VudGVyICovCisJCW91dHcoMHg4MDAwLCBBRERSX0NIQU5fUkVHKFJFR19DMEMsIG4pKTsKKwkJLyogIExvYWQgdGhlIGNvdW50ZXIgZnJvbSBQUjAgKi8KKwkJb3V0dygweDQwMDAsIEFERFJfQ0hBTl9SRUcoUkVHX0MwQywgbikpOwogCX0KIAogCW91dHcoY21SZWcudmFsdWUsIEFERFJfQ0hBTl9SRUcoUkVHX0MwTSwgbikpOwogCXVkZWxheSgxMDAwKTsKLQlwcmludGsoIlJlYWQgYmFjayBtb2RlIHJlZz0weCUwNHhcbiIsIGludyhBRERSX0NIQU5fUkVHKFJFR19DME0sIG4pKSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiUmVhZCBiYWNrIG1vZGUgcmVnPTB4JTA0eFxuIiwKKwkJCWludyhBRERSX0NIQU5fUkVHKFJFR19DME0sIG4pKSk7CiAKICNlbmRpZgotCXByaW50aygiQ3VycmVudCByZWdpc3RyZXM6XG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJDdXJyZW50IHJlZ2lzdHJlczpcbiIpOwogCiAJZm9yIChpID0gMDsgaSA8IFM1MjZfTlVNX1BPUlRTOyBpKyspIHsKLQkJcHJpbnRrKCIweCUwMmx4OiAweCUwNHhcbiIsIEFERFJfUkVHKHM1MjZfcG9ydHNbaV0pLAotCQkgICAgICAgaW53KEFERFJfUkVHKHM1MjZfcG9ydHNbaV0pKSk7CisJCXByaW50ayhLRVJOX0lORk8gIjB4JTAybHg6IDB4JTA0eFxuIiwKKwkJCUFERFJfUkVHKHM1MjZfcG9ydHNbaV0pLCBpbncoQUREUl9SRUcoczUyNl9wb3J0c1tpXSkpKTsKIAl9CiAJcmV0dXJuIDE7CiB9CkBAIC00OTQsNyArNTAzLDcgQEAKICAqLwogc3RhdGljIGludCBzNTI2X2RldGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewotCXByaW50aygiY29tZWRpJWQ6IHM1MjY6IHJlbW92ZVxuIiwgZGV2LT5taW5vcik7CisJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpJWQ6IHM1MjY6IHJlbW92ZVxuIiwgZGV2LT5taW5vcik7CiAKIAlpZiAoZGV2LT5pb2Jhc2UgPiAwKQogCQlyZWxlYXNlX3JlZ2lvbihkZXYtPmlvYmFzZSwgUzUyNl9JT1NJWkUpOwpAQCAtNTEzLDcgKzUyMiw3IEBACiAKIAkvKiAgQ2hlY2sgaWYgKG4gPiAwKSAqLwogCWlmIChpbnNuLT5uIDw9IDApIHsKLQkJcHJpbnRrKCJzNTI2OiBJTlNOX1JFQUQ6IG4gc2hvdWxkIGJlID4gMFxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiczUyNjogSU5TTl9SRUFEOiBuIHNob3VsZCBiZSA+IDBcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJLyogIFJlYWQgdGhlIGxvdyB3b3JkIGZpcnN0ICovCkBAIC01MjIsNyArNTMxLDggQEAKIAkJZGF0YWhpZ2ggPSBpbncoQUREUl9DSEFOX1JFRyhSRUdfQzBILCBjb3VudGVyX2NoYW5uZWwpKTsKIAkJZGF0YVtpXSA9IChpbnQpKGRhdGFoaWdoICYgMHgwMEZGKTsKIAkJZGF0YVtpXSA9IChkYXRhW2ldIDw8IDE2KSB8IChkYXRhbG93ICYgMHhGRkZGKTsKLS8qIHByaW50aygiczUyNiBHUENUWyVkXTogJXgoMHglMDR4LCAweCUwNHgpXG4iLCBjb3VudGVyX2NoYW5uZWwsIGRhdGFbaV0sIGRhdGFoaWdoLCBkYXRhbG93KTsgKi8KKwkJLyogcHJpbnRrKCJzNTI2IEdQQ1RbJWRdOiAleCgweCUwNHgsIDB4JTA0eClcbiIsCisJCSAgIGNvdW50ZXJfY2hhbm5lbCwgZGF0YVtpXSwgZGF0YWhpZ2gsIGRhdGFsb3cpOyAqLwogCX0KIAlyZXR1cm4gaTsKIH0KQEAgLTUzNiw3ICs1NDYsOCBAQAogCXNob3J0IHZhbHVlOwogCXVuaW9uIGNtUmVnIGNtUmVnOwogCi0vKiBwcmludGsoInM1MjY6IEdQQ1RfSU5TTl9DT05GSUc6IENvbmZpZ3VyaW5nIENoYW5uZWwgJWRcbiIsIHN1YmRldl9jaGFubmVsKTsgKi8KKwkvKiBwcmludGsoInM1MjY6IEdQQ1RfSU5TTl9DT05GSUc6IENvbmZpZ3VyaW5nIENoYW5uZWwgJWRcbiIsCisJCQkJCQlzdWJkZXZfY2hhbm5lbCk7ICovCiAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0dQQ1RfQ09ORklHX0RBVEE7IGkrKykgewogCQlkZXZwcml2LT5zNTI2X2dwY3RfY29uZmlnW3N1YmRldl9jaGFubmVsXS5kYXRhW2ldID0KQEAgLTU1NCw3ICs1NjUsNyBAQAogCQkgICBkYXRhWzJdOiBQcmUtbG9hZCBSZWdpc3RlciBWYWx1ZQogCQkgICBkYXRhWzNdOiBDb250ZXIgQ29udHJvbCBSZWdpc3RlcgogCQkgKi8KLQkJcHJpbnRrKCJzNTI2OiBHUENUX0lOU05fQ09ORklHOiBDb25maWd1cmluZyBFbmNvZGVyXG4iKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiczUyNjogR1BDVF9JTlNOX0NPTkZJRzogQ29uZmlndXJpbmcgRW5jb2RlclxuIik7CiAJCWRldnByaXYtPnM1MjZfZ3BjdF9jb25maWdbc3ViZGV2X2NoYW5uZWxdLmFwcCA9CiAJCSAgICBQb3NpdGlvbk1lYXN1cmVtZW50OwogCkBAIC01NjMsNyArNTc0LDcgQEAKIAkJLyogT25lLXNob3QgKHNvZnR3YXJlIHRyaWdnZXIpICovCiAJCWNtUmVnLnJlZy5jb3V0U291cmNlID0gMDsJLyogIG91dCBSQ0FQICovCiAJCWNtUmVnLnJlZy5jb3V0UG9sYXJpdHkgPSAxOwkvKiAgUG9sYXJpdHkgaW52ZXJ0ZWQgKi8KLQkJY21SZWcucmVnLmF1dG9Mb2FkUmVzZXRSY2FwID0gMDsJLyogIEF1dG8gbG9hZCBkaXNhYmxlZCAqLworCQljbVJlZy5yZWcuYXV0b0xvYWRSZXNldFJjYXAgPSAwOy8qICBBdXRvIGxvYWQgZGlzYWJsZWQgKi8KIAkJY21SZWcucmVnLmh3Q3RFbmFibGVTb3VyY2UgPSAzOwkvKiAgTk9UIFJDQVAgKi8KIAkJY21SZWcucmVnLmN0RW5hYmxlQ3RybCA9IDI7CS8qICBIYXJkd2FyZSAqLwogCQljbVJlZy5yZWcuY2xvY2tTb3VyY2UgPSAyOwkvKiAgSW50ZXJuYWwgKi8KQEAgLTU3OCwxMCArNTg5LDEzIEBACiAJCW91dHcoMHgwMDAxLCBBRERSX0NIQU5fUkVHKFJFR19DMEgsIHN1YmRldl9jaGFubmVsKSk7CiAJCW91dHcoMHgzQzY4LCBBRERSX0NIQU5fUkVHKFJFR19DMEwsIHN1YmRldl9jaGFubmVsKSk7CiAKLQkJb3V0dygweDgwMDAsIEFERFJfQ0hBTl9SRUcoUkVHX0MwQywgc3ViZGV2X2NoYW5uZWwpKTsJLyogIFJlc2V0IHRoZSBjb3VudGVyICovCi0JCW91dHcoMHg0MDAwLCBBRERSX0NIQU5fUkVHKFJFR19DMEMsIHN1YmRldl9jaGFubmVsKSk7CS8qICBMb2FkIHRoZSBjb3VudGVyIGZyb20gUFIwICovCisJCS8qICBSZXNldCB0aGUgY291bnRlciAqLworCQlvdXR3KDB4ODAwMCwgQUREUl9DSEFOX1JFRyhSRUdfQzBDLCBzdWJkZXZfY2hhbm5lbCkpOworCQkvKiAgTG9hZCB0aGUgY291bnRlciBmcm9tIFBSMCAqLworCQlvdXR3KDB4NDAwMCwgQUREUl9DSEFOX1JFRyhSRUdfQzBDLCBzdWJkZXZfY2hhbm5lbCkpOwogCi0JCW91dHcoMHgwMDA4LCBBRERSX0NIQU5fUkVHKFJFR19DMEMsIHN1YmRldl9jaGFubmVsKSk7CS8qICBSZXNldCBSQ0FQIChmaXJlcyBvbmUtc2hvdCkgKi8KKwkJLyogIFJlc2V0IFJDQVAgKGZpcmVzIG9uZS1zaG90KSAqLworCQlvdXR3KDB4MDAwOCwgQUREUl9DSEFOX1JFRyhSRUdfQzBDLCBzdWJkZXZfY2hhbm5lbCkpOwogCiAjZW5kaWYKIApAQCAtNTk0LDMwICs2MDgsMzQgQEAKIAogCQkvKiAgUmVzZXQgdGhlIGNvdW50ZXIgaWYgaXQgaXMgc29mdHdhcmUgcHJlbG9hZCAqLwogCQlpZiAoY21SZWcucmVnLmF1dG9Mb2FkUmVzZXRSY2FwID09IDApIHsKLQkJCW91dHcoMHg4MDAwLCBBRERSX0NIQU5fUkVHKFJFR19DMEMsIHN1YmRldl9jaGFubmVsKSk7CS8qICBSZXNldCB0aGUgY291bnRlciAqLwotLyogb3V0dygweDQwMDAsIEFERFJfQ0hBTl9SRUcoUkVHX0MwQywgc3ViZGV2X2NoYW5uZWwpKTsgICAgTG9hZCB0aGUgY291bnRlciBmcm9tIFBSMCAqLworCQkJLyogIFJlc2V0IHRoZSBjb3VudGVyICovCisJCQlvdXR3KDB4ODAwMCwgQUREUl9DSEFOX1JFRyhSRUdfQzBDLCBzdWJkZXZfY2hhbm5lbCkpOworCQkJLyogTG9hZCB0aGUgY291bnRlciBmcm9tIFBSMAorCQkJICogb3V0dygweDQwMDAsIEFERFJfQ0hBTl9SRUcoUkVHX0MwQywgc3ViZGV2X2NoYW5uZWwpKTsKKwkJCSAqLwogCQl9CiAjZWxzZQotCQljbVJlZy5yZWcuY291bnREaXJDdHJsID0gMDsJLyogIDAgcXVhZHJhdHVyZSwgMSBzb2Z0d2FyZSBjb250cm9sICovCisJCS8qICAwIHF1YWRyYXR1cmUsIDEgc29mdHdhcmUgY29udHJvbCAqLworCQljbVJlZy5yZWcuY291bnREaXJDdHJsID0gMDsKIAogCQkvKiAgZGF0YVsxXSBjb250YWlucyBHUENUX1gxLCBHUENUX1gyIG9yIEdQQ1RfWDQgKi8KLQkJaWYgKGluc24tPmRhdGFbMV0gPT0gR1BDVF9YMikgeworCQlpZiAoaW5zbi0+ZGF0YVsxXSA9PSBHUENUX1gyKQogCQkJY21SZWcucmVnLmNsb2NrU291cmNlID0gMTsKLQkJfSBlbHNlIGlmIChpbnNuLT5kYXRhWzFdID09IEdQQ1RfWDQpIHsKKwkJZWxzZSBpZiAoaW5zbi0+ZGF0YVsxXSA9PSBHUENUX1g0KQogCQkJY21SZWcucmVnLmNsb2NrU291cmNlID0gMjsKLQkJfSBlbHNlIHsKKwkJZWxzZQogCQkJY21SZWcucmVnLmNsb2NrU291cmNlID0gMDsKLQkJfQogCiAJCS8qICBXaGVuIHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBpbmRleHB1bHNlOiAqLwotCQlpZiAoaW5zbi0+ZGF0YVsyXSA9PSBHUENUX0luZGV4UGhhc2VMb3dMb3cpIHsKKwkJLyppZiAoaW5zbi0+ZGF0YVsyXSA9PSBHUENUX0luZGV4UGhhc2VMb3dMb3cpIHsKIAkJfSBlbHNlIGlmIChpbnNuLT5kYXRhWzJdID09IEdQQ1RfSW5kZXhQaGFzZUxvd0hpZ2gpIHsKIAkJfSBlbHNlIGlmIChpbnNuLT5kYXRhWzJdID09IEdQQ1RfSW5kZXhQaGFzZUhpZ2hMb3cpIHsKIAkJfSBlbHNlIGlmIChpbnNuLT5kYXRhWzJdID09IEdQQ1RfSW5kZXhQaGFzZUhpZ2hIaWdoKSB7Ci0JCX0KKwkJfSovCiAJCS8qICBUYWtlIGludG8gYWNjb3VudCB0aGUgaW5kZXggcHVsc2U/ICovCiAJCWlmIChpbnNuLT5kYXRhWzNdID09IEdQQ1RfUkVTRVRfQ09VTlRFUl9PTl9JTkRFWCkKLQkJCWNtUmVnLnJlZy5hdXRvTG9hZFJlc2V0UmNhcCA9IDQ7CS8qICBBdXRvIGxvYWQgd2l0aCBJTkRFWF4gKi8KKwkJCS8qICBBdXRvIGxvYWQgd2l0aCBJTkRFWF4gKi8KKwkJCWNtUmVnLnJlZy5hdXRvTG9hZFJlc2V0UmNhcCA9IDQ7CiAKIAkJLyogIFNldCBDb3VudGVyIE1vZGUgUmVnaXN0ZXIgKi8KIAkJY21SZWcudmFsdWUgPSAoc2hvcnQpKGluc24tPmRhdGFbMV0gJiAweEZGRkYpOwpAQCAtNjM4LDggKzY1NiwxMCBAQAogCQl9CiAJCS8qICBSZXNldCB0aGUgY291bnRlciBpZiBpdCBpcyBzb2Z0d2FyZSBwcmVsb2FkICovCiAJCWlmIChjbVJlZy5yZWcuYXV0b0xvYWRSZXNldFJjYXAgPT0gMCkgewotCQkJb3V0dygweDgwMDAsIEFERFJfQ0hBTl9SRUcoUkVHX0MwQywgc3ViZGV2X2NoYW5uZWwpKTsJLyogIFJlc2V0IHRoZSBjb3VudGVyICovCi0JCQlvdXR3KDB4NDAwMCwgQUREUl9DSEFOX1JFRyhSRUdfQzBDLCBzdWJkZXZfY2hhbm5lbCkpOwkvKiAgTG9hZCB0aGUgY291bnRlciBmcm9tIFBSMCAqLworCQkJLyogIFJlc2V0IHRoZSBjb3VudGVyICovCisJCQlvdXR3KDB4ODAwMCwgQUREUl9DSEFOX1JFRyhSRUdfQzBDLCBzdWJkZXZfY2hhbm5lbCkpOworCQkJLyogIExvYWQgdGhlIGNvdW50ZXIgZnJvbSBQUjAgKi8KKwkJCW91dHcoMHg0MDAwLCBBRERSX0NIQU5fUkVHKFJFR19DMEMsIHN1YmRldl9jaGFubmVsKSk7CiAJCX0KICNlbmRpZgogCQlicmVhazsKQEAgLTY1Miw3ICs2NzIsNyBAQAogCQkgICBkYXRhWzNdOiBQcmUtbG9hZCBSZWdpc3RlciAxIFZhbHVlCiAJCSAgIGRhdGFbNF06IENvbnRlciBDb250cm9sIFJlZ2lzdGVyCiAJCSAqLwotCQlwcmludGsoInM1MjY6IEdQQ1RfSU5TTl9DT05GSUc6IENvbmZpZ3VyaW5nIFNQR1xuIik7CisJCXByaW50ayhLRVJOX0lORk8gInM1MjY6IEdQQ1RfSU5TTl9DT05GSUc6IENvbmZpZ3VyaW5nIFNQR1xuIik7CiAJCWRldnByaXYtPnM1MjZfZ3BjdF9jb25maWdbc3ViZGV2X2NoYW5uZWxdLmFwcCA9CiAJCSAgICBTaW5nbGVQdWxzZUdlbmVyYXRpb247CiAKQEAgLTY5Nyw3ICs3MTcsNyBAQAogCQkgICBkYXRhWzNdOiBQcmUtbG9hZCBSZWdpc3RlciAxIFZhbHVlCiAJCSAgIGRhdGFbNF06IENvbnRlciBDb250cm9sIFJlZ2lzdGVyCiAJCSAqLwotCQlwcmludGsoInM1MjY6IEdQQ1RfSU5TTl9DT05GSUc6IENvbmZpZ3VyaW5nIFBUR1xuIik7CisJCXByaW50ayhLRVJOX0lORk8gInM1MjY6IEdQQ1RfSU5TTl9DT05GSUc6IENvbmZpZ3VyaW5nIFBUR1xuIik7CiAJCWRldnByaXYtPnM1MjZfZ3BjdF9jb25maWdbc3ViZGV2X2NoYW5uZWxdLmFwcCA9CiAJCSAgICBQdWxzZVRyYWluR2VuZXJhdGlvbjsKIApAQCAtNzM1LDcgKzc1NSw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJcHJpbnRrKCJzNTI2OiB1bnN1cHBvcnRlZCBHUENUX2luc25fY29uZmlnXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJzNTI2OiB1bnN1cHBvcnRlZCBHUENUX2luc25fY29uZmlnXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJCWJyZWFrOwogCX0KQEAgLTc1MSwyMCArNzcxLDIxIEBACiAJc2hvcnQgdmFsdWU7CiAJdW5pb24gY21SZWcgY21SZWc7CiAKLQlwcmludGsoInM1MjY6IEdQQ1RfSU5TTl9XUklURSBvbiBjaGFubmVsICVkXG4iLCBzdWJkZXZfY2hhbm5lbCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiczUyNjogR1BDVF9JTlNOX1dSSVRFIG9uIGNoYW5uZWwgJWRcbiIsCisJCQkJCXN1YmRldl9jaGFubmVsKTsKIAljbVJlZy52YWx1ZSA9IGludyhBRERSX0NIQU5fUkVHKFJFR19DME0sIHN1YmRldl9jaGFubmVsKSk7Ci0JcHJpbnRrKCJzNTI2OiBDb3VudGVyIE1vZGUgUmVnaXN0ZXI6ICV4XG4iLCBjbVJlZy52YWx1ZSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiczUyNjogQ291bnRlciBNb2RlIFJlZ2lzdGVyOiAleFxuIiwgY21SZWcudmFsdWUpOwogCS8qICBDaGVjayB3aGF0IEFwcGxpY2F0aW9uIG9mIENvdW50ZXIgdGhpcyBjaGFubmVsIGlzIGNvbmZpZ3VyZWQgZm9yICovCiAJc3dpdGNoIChkZXZwcml2LT5zNTI2X2dwY3RfY29uZmlnW3N1YmRldl9jaGFubmVsXS5hcHApIHsKIAljYXNlIFBvc2l0aW9uTWVhc3VyZW1lbnQ6Ci0JCXByaW50aygiUzUyNjogSU5TTl9XUklURTogUE1cbiIpOworCQlwcmludGsoS0VSTl9JTkZPICJTNTI2OiBJTlNOX1dSSVRFOiBQTVxuIik7CiAJCW91dHcoMHhGRkZGICYgKCgqZGF0YSkgPj4gMTYpLCBBRERSX0NIQU5fUkVHKFJFR19DMEgsCiAJCQkJCQkJICAgICBzdWJkZXZfY2hhbm5lbCkpOwogCQlvdXR3KDB4RkZGRiAmICgqZGF0YSksIEFERFJfQ0hBTl9SRUcoUkVHX0MwTCwgc3ViZGV2X2NoYW5uZWwpKTsKIAkJYnJlYWs7CiAKIAljYXNlIFNpbmdsZVB1bHNlR2VuZXJhdGlvbjoKLQkJcHJpbnRrKCJTNTI2OiBJTlNOX1dSSVRFOiBTUEdcbiIpOworCQlwcmludGsoS0VSTl9JTkZPICJTNTI2OiBJTlNOX1dSSVRFOiBTUEdcbiIpOwogCQlvdXR3KDB4RkZGRiAmICgoKmRhdGEpID4+IDE2KSwgQUREUl9DSEFOX1JFRyhSRUdfQzBILAogCQkJCQkJCSAgICAgc3ViZGV2X2NoYW5uZWwpKTsKIAkJb3V0dygweEZGRkYgJiAoKmRhdGEpLCBBRERSX0NIQU5fUkVHKFJFR19DMEwsIHN1YmRldl9jaGFubmVsKSk7CkBAIC03NzcsMTQgKzc5OCwxNCBAQAogCQkgICBUaGUgYWJvdmUgcGVyaW9kcyBtdXN0IGJlIGV4cHJlc3NlZCBhcyBhIG11bHRpcGxlIG9mIHRoZQogCQkgICBwdWxzZSBmcmVxdWVuY3kgb24gdGhlIHNlbGVjdGVkIHNvdXJjZQogCQkgKi8KLQkJcHJpbnRrKCJTNTI2OiBJTlNOX1dSSVRFOiBQVEdcbiIpOworCQlwcmludGsoS0VSTl9JTkZPICJTNTI2OiBJTlNOX1dSSVRFOiBQVEdcbiIpOwogCQlpZiAoKGluc24tPmRhdGFbMV0gPiBpbnNuLT5kYXRhWzBdKSAmJiAoaW5zbi0+ZGF0YVswXSA+IDApKSB7CiAJCQkoZGV2cHJpdi0+czUyNl9ncGN0X2NvbmZpZ1tzdWJkZXZfY2hhbm5lbF0pLmRhdGFbMF0gPQogCQkJICAgIGluc24tPmRhdGFbMF07CiAJCQkoZGV2cHJpdi0+czUyNl9ncGN0X2NvbmZpZ1tzdWJkZXZfY2hhbm5lbF0pLmRhdGFbMV0gPQogCQkJICAgIGluc24tPmRhdGFbMV07CiAJCX0gZWxzZSB7Ci0JCQlwcmludGsoInM1MjY6IElOU05fV1JJVEU6IFBURzogUHJvYmxlbSB3aXRoIFB1bHNlIHBhcmFtcyAtPiAlZCAlZFxuIiwKKwkJCXByaW50ayhLRVJOX0VSUiAiczUyNjogSU5TTl9XUklURTogUFRHOiBQcm9ibGVtIHdpdGggUHVsc2UgcGFyYW1zIC0+ICVkICVkXG4iLAogCQkJCWluc24tPmRhdGFbMF0sIGluc24tPmRhdGFbMV0pOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTg3Myw3ICs4OTQsNyBAQAogCQlpZiAoaSA9PSBUSU1FT1VUKSB7CiAJCQkvKiBwcmludGsoKSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIHByaW50aygpCiAJCQkgKiB3aGVuZXZlciB0aGUgY29kZSBjYW4gYmUgY2FsbGVkIGZyb20gcmVhbC10aW1lLiAqLwotCQkJcHJpbnRrKCJzNTI2OiBBREMoMHglMDR4KSB0aW1lb3V0XG4iLAorCQkJcHJpbnRrKEtFUk5fRVJSICJzNTI2OiBBREMoMHglMDR4KSB0aW1lb3V0XG4iLAogCQkJICAgICAgIGludyhBRERSX1JFRyhSRUdfSVNSKSkpOwogCQkJcmV0dXJuIC1FVElNRURPVVQ7CiAJCX0KQEAgLTkwNiwxMSArOTI3LDE0IEBACiAJICogdmVyeSB1c2VmdWwsIGJ1dCB0aGF0J3MgaG93IHRoZSBpbnRlcmZhY2UgaXMgZGVmaW5lZC4gKi8KIAlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CiAJCS8qIGEgdHlwaWNhbCBwcm9ncmFtbWluZyBzZXF1ZW5jZSAqLwotLyogb3V0dyhkYXRhW2ldLCBkZXYtPmlvYmFzZSArIFJFR19BREQpOyAgICB3cml0ZSB0aGUgZGF0YSB0byBwcmVsb2FkIHJlZ2lzdGVyICovCi0JCW91dHcoZGF0YVtpXSwgQUREUl9SRUcoUkVHX0FERCkpOwkvKiAgd3JpdGUgdGhlIGRhdGEgdG8gcHJlbG9hZCByZWdpc3RlciAqLworCQkvKiB3cml0ZSB0aGUgZGF0YSB0byBwcmVsb2FkIHJlZ2lzdGVyCisJCSAqIG91dHcoZGF0YVtpXSwgZGV2LT5pb2Jhc2UgKyBSRUdfQUREKTsKKwkJICovCisJCS8qIHdyaXRlIHRoZSBkYXRhIHRvIHByZWxvYWQgcmVnaXN0ZXIgKi8KKwkJb3V0dyhkYXRhW2ldLCBBRERSX1JFRyhSRUdfQUREKSk7CiAJCWRldnByaXYtPmFvX3JlYWRiYWNrW2NoYW5dID0gZGF0YVtpXTsKIC8qIG91dHcodmFsICsgMSwgZGV2LT5pb2Jhc2UgKyBSRUdfREFDKTsgIHN0YXJ0cyB0aGUgRC9BIGNvbnZlcnNpb24uICovCi0JCW91dHcodmFsICsgMSwgQUREUl9SRUcoUkVHX0RBQykpOwkvKiAgc3RhcnRzIHRoZSBEL0EgY29udmVyc2lvbi4gKi8KKwkJb3V0dyh2YWwgKyAxLCBBRERSX1JFRyhSRUdfREFDKSk7IC8qc3RhcnRzIHRoZSBEL0EgY29udmVyc2lvbi4qLwogCX0KIAogCS8qIHJldHVybiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgcmVhZC93cml0dGVuICovCkBAIC05NTQsNyArOTc4LDcgQEAKIAogCS8qIG9uIHJldHVybiwgZGF0YVsxXSBjb250YWlucyB0aGUgdmFsdWUgb2YgdGhlIGRpZ2l0YWwKIAkgKiBpbnB1dCBhbmQgb3V0cHV0IGxpbmVzLiAqLwotCWRhdGFbMV0gPSBpbncoQUREUl9SRUcoUkVHX0RJTykpICYgMHhGRjsJLyogIGxvdyA4IGJpdHMgYXJlIHRoZSBkYXRhICovCisJZGF0YVsxXSA9IGludyhBRERSX1JFRyhSRUdfRElPKSkgJiAweEZGOyAvKiBsb3cgOCBiaXRzIGFyZSB0aGUgZGF0YSAqLwogCS8qIG9yIHdlIGNvdWxkIGp1c3QgcmV0dXJuIHRoZSBzb2Z0d2FyZSBjb3B5IG9mIHRoZSBvdXRwdXQgdmFsdWVzIGlmCiAJICogaXQgd2FzIGEgcHVyZWx5IGRpZ2l0YWwgb3V0cHV0IHN1YmRldmljZSAqLwogCS8qIGRhdGFbMV09cy0+c3RhdGUgJiAweEZGOyAqLwpAQCAtOTY5LDcgKzk5Myw3IEBACiAJaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKIAlpbnQgZ3JvdXAsIG1hc2s7CiAKLQlwcmludGsoIlM1MjYgRElPIGluc25fY29uZmlnXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJTNTI2IERJTyBpbnNuX2NvbmZpZ1xuIik7CiAKIAkvKiBUaGUgaW5wdXQgb3Igb3V0cHV0IGNvbmZpZ3VyYXRpb24gb2YgZWFjaCBkaWdpdGFsIGxpbmUgaXMKIAkgKiBjb25maWd1cmVkIGJ5IGEgc3BlY2lhbCBpbnNuX2NvbmZpZyBpbnN0cnVjdGlvbi4gIGNoYW5zcGVjCkBAIC05ODAsMTEgKzEwMDQsMTIgQEAKIAltYXNrID0gMHhGIDw8IChncm91cCA8PCAyKTsKIAlzd2l0Y2ggKGRhdGFbMF0pIHsKIAljYXNlIElOU05fQ09ORklHX0RJT19PVVRQVVQ6Ci0JCXMtPnN0YXRlIHw9IDEgPDwgKGdyb3VwICsgMTApOyAgLy8gYml0IDEwLzExIHNldCB0aGUgZ3JvdXAgMS8yJ3MgbW9kZQorCQkvKiBiaXQgMTAvMTEgc2V0IHRoZSBncm91cCAxLzIncyBtb2RlICovCisJCXMtPnN0YXRlIHw9IDEgPDwgKGdyb3VwICsgMTApOwogCQlzLT5pb19iaXRzIHw9IG1hc2s7CiAJCWJyZWFrOwogCWNhc2UgSU5TTl9DT05GSUdfRElPX0lOUFVUOgotCQlzLT5zdGF0ZSAmPSB+KDEgPDwgKGdyb3VwICsgMTApKTsvLyAxIGlzIG91dHB1dCwgMCBpcyBpbnB1dC4KKwkJcy0+c3RhdGUgJj0gfigxIDw8IChncm91cCArIDEwKSk7IC8qIDEgaXMgb3V0cHV0LCAwIGlzIGlucHV0LiAqLwogCQlzLT5pb19iaXRzICY9IH5tYXNrOwogCQlicmVhazsKIAljYXNlIElOU05fQ09ORklHX0RJT19RVUVSWToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXguYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXguYwppbmRleCBkZTc4NGZmLi42OTZlZTA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdXNiZHV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3VzYmR1eC5jCkBAIC0yMzk4LDcgKzIzOTgsNyBAQAogCXVzYmR1eHN1YltpbmRleF0uZHV4X2NvbW1hbmRzID0ga3phbGxvYyhTSVpFT0ZEVVhCVUZGRVIsIEdGUF9LRVJORUwpOwogCWlmICghdXNiZHV4c3ViW2luZGV4XS5kdXhfY29tbWFuZHMpIHsKIAkJZGV2X2VycihkZXYsICJjb21lZGlfOiB1c2JkdXg6ICIKLQkJCSJlcnJvciBhbGxvYyBzcGFjZSBmb3IgZGFjIGNvbW1hbmRzXG4iKTsKKwkJCSJlcnJvciBhbGxvYyBzcGFjZSBmb3IgZHV4IGNvbW1hbmRzXG4iKTsKIAkJdGlkeV91cCgmKHVzYmR1eHN1YltpbmRleF0pKTsKIAkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKIAkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3B0bTEyMTcvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9jcHRtMTIxNy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYjFjYzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY3B0bTEyMTcvS2NvbmZpZwpAQCAtMCwwICsxLDEyIEBACitjb25maWcgVE9VQ0hTQ1JFRU5fQ0xFQVJQQURfVE0xMjE3CisJdHJpc3RhdGUgIlN5bmFwdGljcyBDbGVhcnBhZCBUTTEyMTciCisJZGVwZW5kcyBvbiBJMkMKKwlkZXBlbmRzIG9uIEdQSU9MSUIKKwlkZXBlbmRzIG9uIElOUFVUCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIFN5bmFwdGljcyBDbGVhcnBhZCBUTTEyMTcgQ29udHJvbGxlcgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBjbGVhcnBhZF90bTEyMTcuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3B0bTEyMTcvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvY3B0bTEyMTcvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk2MWZhZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jcHRtMTIxNy9NYWtlZmlsZQpAQCAtMCwwICsxLDIgQEAKK29iai0kKENPTkZJR19UT1VDSFNDUkVFTl9DTEVBUlBBRF9UTTEyMTcpCSs9IGNsZWFycGFkX3RtMTIxNy5vCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jcHRtMTIxNy9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL2NwdG0xMjE3L1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAzOTIyNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jcHRtMTIxNy9UT0RPCkBAIC0wLDAgKzEsNSBAQAorLSBXYWl0IGZvciB0aGUgb2ZmaWNpYWwgdXBzdHJlYW0gZ2VuZXJhbCBjbGVhcnBhZCBkcml2ZXJzIGFzIHByb21pc2VkIG92ZXIKKyAgdGhlIHBhc3QgZmV3IG1vbnRocworLSBNZXJnZSBhbnkgZGV2aWNlIHN1cHBvcnQgbmVlZGVkIGZyb20gdGhpcyBkcml2ZXIgaW50byBpdAorLSBEZWxldGUgdGhpcyBkcml2ZXIKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NwdG0xMjE3L2NsZWFycGFkX3RtMTIxNy5jIGIvZHJpdmVycy9zdGFnaW5nL2NwdG0xMjE3L2NsZWFycGFkX3RtMTIxNy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZTRiNzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY3B0bTEyMTcvY2xlYXJwYWRfdG0xMjE3LmMKQEAgLTAsMCArMSw2NzUgQEAKKy8qCisgKiBjbGVhcnBhZF90bTEyMTcuYyAtIFRvdWNoIFNjcmVlbiBkcml2ZXIgZm9yIFN5bmFwdGljcyBDbGVhcnBhZAorICogVE0xMjE3IGNvbnRyb2xsZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggSW50ZWwgQ29ycAorICoKKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLglTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWZub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQS4KKyAqCisgKiBRdWVzdGlvbnMvQ29tbWVudHMvQnVnIGZpeGVzIHRvIFJhbWVzaCBBZ2Fyd2FsIChyYW1lc2guYWdhcndhbEBpbnRlbC5jb20pCisgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaHJ0aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlICJjcF90bTEyMTcuaCIKKworI2RlZmluZSBDUFRNMTIxN19ERVZJQ0VfTkFNRQkJImNwdG0xMjE3IgorI2RlZmluZSBDUFRNMTIxN19EUklWRVJfTkFNRQkJQ1BUTTEyMTdfREVWSUNFX05BTUUKKworI2RlZmluZSBNQVhfVE9VQ0hfU1VQUE9SVEVECQkyCisjZGVmaW5lIFRPVUNIX1NVUFBPUlRFRAkJCTEKKyNkZWZpbmUgU0FNUExJTkdfRlJFUQkJCTgwCS8qIEZyZXF1ZW5jeSBpbiBIWiAqLworI2RlZmluZSBERUxBWV9CVFdJTl9TQU1QTEUJCSgxMDAwIC8gU0FNUExJTkdfRlJFUSkKKyNkZWZpbmUgV0FJVF9GT1JfUkVTUE9OU0UJCTUJLyogNW1zZWMganVzdCB3b3JrcyAqLworI2RlZmluZSBNQVhfUkVUUklFUwkJCTUJLyogQXMgYWJvdmUgKi8KKyNkZWZpbmUgSU5DUkVNRU5UQUxfREVMQVkJCTUJLyogQXMgYWJvdmUgKi8KKworLyogUmVnc3RlciBEZWZpbml0aW9ucyAqLworI2RlZmluZSBUTUExMjE3X0RFVl9TVEFUVVMJCTB4MTMJLyogRGV2aWNlIFN0YXR1cyAqLworI2RlZmluZSBUTUExMjE3X0lOVF9TVEFUVVMJCTB4MTQJLyogSW50ZXJydXB0IFN0YXR1cyAqLworCisvKiBDb250cm9sbGVyIGNhbiBkZXRlY3QgdXB0byAyIHBvc3NpYmxlIGZpbmdlciB0b3VjaGVzLgorICogRWFjaCBmaW5nZXIgdG91Y2ggcHJvdmlkZXMgIDEyIGJpdCBYIFkgY28tb3JkaW5hdGVzLCB0aGUgdmFsdWVzIGFyZSBzcGxpdAorICogYWNyb3NzIDIgcmVnaXN0ZXJzLCBhbmQgYW4gOCBiaXQgIFogdmFsdWUgKi8KKyNkZWZpbmUgVE1BMTIxN19GSU5HRVJfU1RBVEUJCTB4MTggLyogRmluZ2VyIFN0YXRlICovCisjZGVmaW5lIFRNQTEyMTdfRklOR0VSMV9YX0hJR0hFUjgJMHgxOSAvKiBIaWdoZXIgOCBiaXQgb2YgWCBjb29yZGluYXRlICovCisjZGVmaW5lIFRNQTEyMTdfRklOR0VSMV9ZX0hJR0hFUjgJMHgxQSAvKiBIaWdoZXIgOCBiaXQgb2YgWSBjb29yZGluYXRlICovCisjZGVmaW5lIFRNQTEyMTdfRklOR0VSMV9YWV9MT1dFUjQJMHgxQiAvKiBMb3dlciA0IGJpdHMgb2YgWCBhbmQgWSAqLworI2RlZmluZSBUTUExMjE3X0ZJTkdFUjFfWl9WQUxVRQkJMHgxRCAvKiA4IGJpdCBaIHZhbHVlIGZvciBmaW5nZXIgMSAqLworI2RlZmluZSBUTUExMjE3X0ZJTkdFUjJfWF9ISUdIRVI4CTB4MUUgLyogSGlnaGVyIDggYml0IG9mIFggY29vcmRpbmF0ZSAqLworI2RlZmluZSBUTUExMjE3X0ZJTkdFUjJfWV9ISUdIRVI4CTB4MUYgLyogSGlnaGVyIDggYml0IG9mIFkgY29vcmRpbmF0ZSAqLworI2RlZmluZSBUTUExMjE3X0ZJTkdFUjJfWFlfTE9XRVI0CTB4MjAgLyogTG93ZXIgNCBiaXRzIG9mIFggYW5kIFkgKi8KKyNkZWZpbmUgVE1BMTIxN19GSU5HRVIyX1pfVkFMVUUJCTB4MjIgLyogOCBiaXQgWiB2YWx1ZSBmb3IgZmluZ2VyIDIgKi8KKyNkZWZpbmUgVE1BMTIxN19ERVZJQ0VfQ1RSTAkJMHgyMyAvKiBEZXZpY2UgQ29udHJvbCAqLworI2RlZmluZSBUTUExMjE3X0lOVEVSUlVQVF9FTkFCTEUJMHgyNCAvKiBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIFRNQTEyMTdfUkVQT1JUX01PREUJCTB4MkIgLyogUmVwb3J0aW5nIE1vZGUgKi8KKyNkZWZpbmUgVE1BMTIxN19NQVhfWF9MT1dFUjgJCTB4MzEgLyogQml0IDAtNyBmb3IgTWF4IFggKi8KKyNkZWZpbmUgVE1BMTIxN19NQVhfWF9ISUdIRVI0CQkweDMyIC8qIEJpdCA4LTExIGZvciBNYXggWCAqLworI2RlZmluZSBUTUExMjE3X01BWF9ZX0xPV0VSOAkJMHgzMyAvKiBCaXQgMC03IGZvciBNYXggWSAqLworI2RlZmluZSBUTUExMjE3X01BWF9ZX0hJR0hFUjQJCTB4MzQgLyogQml0IDgtMTEgZm9yIE1heCBZICovCisjZGVmaW5lIFRNQTEyMTdfREVWSUNFX0NNRF9SRVNFVAkweDY3IC8qIERldmljZSBDTUQgcmVnIGZvciByZXNldCAqLworI2RlZmluZSBUTUExMjE3X0RFVklDRV9DTURfUkVaRVJPCTB4NjkgLyogRGV2aWNlIENNRCByZWcgZm9yIHJlemVybyAqLworCisjZGVmaW5lIFRNQTEyMTdfTUFOVUZBQ1RVUkVSX0lECQkweDczIC8qIE1hbnVmYWN0dXJlciBJZCAqLworI2RlZmluZSBUTUExMjE3X1BST0RVQ1RfRkFNSUxZCQkweDc1IC8qIFByb2R1Y3QgRmFtaWx5ICovCisjZGVmaW5lIFRNQTEyMTdfRklSTVdBUkVfUkVWSVNJT04JMHg3NiAvKiBGaXJtd2FyZSBSZXZpc2lvbiAqLworI2RlZmluZSBUTUExMjE3X1NFUklBTF9OT19ISUdICQkweDdDIC8qIEJpdCA4LTE1IG9mIGRldmljZSBzZXJpYWwgbm8uICovCisjZGVmaW5lIFRNQTEyMTdfU0VSSUFMX05PX0xPVwkJMHg3RCAvKiBCaXQgMC03IG9mIGRldmljZSBzZXJpYWwgbm8uICovCisjZGVmaW5lIFRNQTEyMTdfUFJPRFVDVF9JRF9TVEFSVAkweDdFIC8qIFN0YXJ0IGFkZHJlc3MgZm9yIDEwIGJ5dGUgSUQgKi8KKyNkZWZpbmUgVE1BMTIxN19ERVZJQ0VfQ0FQQUJJTElUWQkweDhCIC8qIFJlcG9ydGluZyBjYXBhYmlsaXR5ICovCisKKworLyoKKyAqIFRoZSB0b3VjaCBwb3NpdGlvbiBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCB0b3VjaF9zdGF0ZSB7CisJaW50CXg7CisJaW50CXk7CisJYm9vbCBidXR0b247Cit9OworCisvKiBEZXZpY2UgU3BlY2lmaWMgaW5mbyBnaXZlbiBieSB0aGUgY29udHJvbGxlciAqLworc3RydWN0IGNwX2Rldl9pbmZvIHsKKwl1MTYJbWF4WDsKKwl1MTYJbWF4WTsKK307CisKKy8qIFZlbmRvciByZWxhdGVkIGluZm8gZ2l2ZW4gYnkgdGhlIGNvbnRyb2xsZXIgKi8KK3N0cnVjdCBjcF92ZW5kb3JfaW5mbyB7CisJdTgJdmVuZG9yX2lkOworCXU4CXByb2R1Y3RfZmFtaWx5OworCXU4CWZpcm13YXJlX3JldjsKKwl1MTYJc2VyaWFsX25vOworfTsKKworLyoKKyAqIFByaXZhdGUgc3RydWN0dXJlIHRvIHN0b3JlIHRoZSBkZXZpY2UgZGV0YWlscworICovCitzdHJ1Y3QgY3BfdG0xMjE3X2RldmljZSB7CisJc3RydWN0IGkyY19jbGllbnQJKmNsaWVudDsKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2OworCXN0cnVjdCBjcF92ZW5kb3JfaW5mbwl2aW5mbzsKKwlzdHJ1Y3QgY3BfZGV2X2luZm8JZGluZm87CisJc3RydWN0IGlucHV0X2Rldl9pbmZvIHsKKwkJY2hhcgkJCXBoeXNbMzJdOworCQljaGFyCQkJbmFtZVsxMjhdOworCQlzdHJ1Y3QgaW5wdXRfZGV2CSppbnB1dDsKKwkJc3RydWN0IHRvdWNoX3N0YXRlCXRvdWNoOworCX0gY3BfaW5wdXRfaW5mb1tNQVhfVE9VQ0hfU1VQUE9SVEVEXTsKKworCWludAl0aHJlYWRfcnVubmluZzsKKwlzdHJ1Y3QgbXV0ZXgJdGhyZWFkX211dGV4OworCisJaW50IGdwaW87Cit9OworCisKKy8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSB1c2VkIHRvIHJlYWQvd3JpdGUgcmVnaXN0ZXJzIG9uIHRoZSBkZXZpY2UKKyAqIGFzIHBlciB0aGUgUk1JIHByb3JvY29sLiBUZWNobmljYWxseSwgYSBwYWdlIHNlbGVjdCBzaG91bGQgYmUgd3JpdHRlbgorICogYmVmb3JlIGRvaW5nIHJlYWQvd3JpdGUgYnV0IHNpbmNlIHRoZSByZWdpc3RlciBvZmZzZXRzIGFyZSBiZWxvdyAweEZGCisgKiB3ZSBjYW4gdXNlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHBhZ2Ugd2hpY2ggaXMgMHgwMAorICovCitzdGF0aWMgaW50IGNwX3RtMTIxN19yZWFkKHN0cnVjdCBjcF90bTEyMTdfZGV2aWNlICp0cywKKwkJCQl1OCAqcmVxLCBpbnQgc2l6ZSkKK3sKKwlpbnQgaSwgcmV0dmFsOworCisJLyogU2VuZCB0aGUgYWRkcmVzcyAqLworCXJldHZhbCA9IGkyY19tYXN0ZXJfc2VuZCh0cy0+Y2xpZW50LCAmcmVxWzBdLCAxKTsKKwlpZiAocmV0dmFsICE9IDEpIHsKKwkJZGV2X2Vycih0cy0+ZGV2LCAiY3BfdG0xMjE3OiBJMkMgc2VuZCBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwltc2xlZXAoV0FJVF9GT1JfUkVTUE9OU0UpOworCWZvciAoaSA9IDA7IGkgPCBNQVhfUkVUUklFUzsgaSsrKSB7CisJCXJldHZhbCA9IGkyY19tYXN0ZXJfcmVjdih0cy0+Y2xpZW50LCAmcmVxWzFdLCBzaXplKTsKKwkJaWYgKHJldHZhbCA9PSBzaXplKSB7CisJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCW1zbGVlcChJTkNSRU1FTlRBTF9ERUxBWSk7CisJCQlkZXZfZGJnKHRzLT5kZXYsICJjcF90bTEyMTc6IFJldHJ5IGNvdW50IGlzICVkXG4iLCBpKTsKKwkJfQorCX0KKwlpZiAocmV0dmFsICE9IHNpemUpCisJCWRldl9lcnIodHMtPmRldiwgImNwX3RtMTIxNzogUmVhZCBmcm9tIGRldmljZSBmYWlsZWRcbiIpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBjcF90bTEyMTdfd3JpdGUoc3RydWN0IGNwX3RtMTIxN19kZXZpY2UgKnRzLAorCQkJCXU4ICpyZXEsIGludCBzaXplKQoreworCWludCByZXR2YWw7CisKKwkvKiBTZW5kIHRoZSBhZGRyZXNzIGFuZCB0aGUgZGF0YSB0byBiZSB3cml0dGVuICovCisJcmV0dmFsID0gaTJjX21hc3Rlcl9zZW5kKHRzLT5jbGllbnQsICZyZXFbMF0sIHNpemUgKyAxKTsKKwlpZiAocmV0dmFsICE9IHNpemUgKyAxKSB7CisJCWRldl9lcnIodHMtPmRldiwgImNwX3RtMTIxNzogSTJDIHdyaXRlICBmYWlsZWQ6ICVkXG4iLCByZXR2YWwpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwkvKiBXYWl0IGZvciB0aGUgd3JpdGUgdG8gY29tcGxldGUuIFRCRCB3aHkgdGhpcyBpcyByZXF1aXJlZCAqLworCW1zbGVlcChXQUlUX0ZPUl9SRVNQT05TRSk7CisKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIGludCBjcF90bTEyMTdfbWFza19pbnRlcnJ1cHQoc3RydWN0IGNwX3RtMTIxN19kZXZpY2UgKnRzKQoreworCXU4IHJlcVsyXTsKKwlpbnQgcmV0dmFsOworCisJcmVxWzBdID0gVE1BMTIxN19JTlRFUlJVUFRfRU5BQkxFOworCXJlcVsxXSA9IDB4MDsKKwlyZXR2YWwgPSBjcF90bTEyMTdfd3JpdGUodHMsIHJlcSwgMSk7CisJaWYgKHJldHZhbCAhPSAxKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNwX3RtMTIxN191bm1hc2tfaW50ZXJydXB0KHN0cnVjdCBjcF90bTEyMTdfZGV2aWNlICp0cykKK3sKKwl1OCByZXFbMl07CisJaW50IHJldHZhbDsKKworCXJlcVswXSA9IFRNQTEyMTdfSU5URVJSVVBUX0VOQUJMRTsKKwlyZXFbMV0gPSAweGE7CisJcmV0dmFsID0gY3BfdG0xMjE3X3dyaXRlKHRzLCByZXEsIDEpOworCWlmIChyZXR2YWwgIT0gMSkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc190b3VjaChzdHJ1Y3QgY3BfdG0xMjE3X2RldmljZSAqdHMsIGludCBpbmRleCkKK3sKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBpbnB1dF9kZXZfaW5mbyAqaW5wdXRfaW5mbyA9CisJCShzdHJ1Y3QgaW5wdXRfZGV2X2luZm8gKikmdHMtPmNwX2lucHV0X2luZm9baW5kZXhdOworCXU4IHh5X2RhdGFbNl07CisKKwlpZiAoaW5kZXggPT0gMCkKKwkJeHlfZGF0YVswXSA9IFRNQTEyMTdfRklOR0VSMV9YX0hJR0hFUjg7CisJZWxzZQorCQl4eV9kYXRhWzBdID0gVE1BMTIxN19GSU5HRVIyX1hfSElHSEVSODsKKworCXJldHZhbCA9IGNwX3RtMTIxN19yZWFkKHRzLCB4eV9kYXRhLCA1KTsKKwlpZiAocmV0dmFsIDwgNSkgeworCQlkZXZfZXJyKHRzLT5kZXYsICJjcF90bTEyMTc6IFhZIHJlYWQgZnJvbSBkZXZpY2UgZmFpbGVkXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIE5vdGU6IEN1cnJlbnRseSBub3QgdXNpbmcgdGhlIFogdmFsdWVzIGJ1dCBtYXkgYmUgcmVxdXJpZWQgaW4KKwkgICB0aGUgZnV0dXJlLiAqLworCWlucHV0X2luZm8tPnRvdWNoLnggPSAoeHlfZGF0YVsxXSA8PCA0KQorCQkJCQl8ICh4eV9kYXRhWzNdICYgMHgwRik7CisJaW5wdXRfaW5mby0+dG91Y2gueSA9ICh4eV9kYXRhWzJdIDw8IDQpCisJCQkJCXwgKCh4eV9kYXRhWzNdICYgMHhGMCkgPj4gNCk7CisJaW5wdXRfcmVwb3J0X2FicyhpbnB1dF9pbmZvLT5pbnB1dCwgQUJTX1gsIGlucHV0X2luZm8tPnRvdWNoLngpOworCWlucHV0X3JlcG9ydF9hYnMoaW5wdXRfaW5mby0+aW5wdXQsIEFCU19ZLCBpbnB1dF9pbmZvLT50b3VjaC55KTsKKwlpbnB1dF9zeW5jKGlucHV0X2luZm8tPmlucHV0KTsKK30KKworc3RhdGljIHZvaWQgY3BfdG0xMjE3X2dldF9kYXRhKHN0cnVjdCBjcF90bTEyMTdfZGV2aWNlICp0cykKK3sKKwl1OCByZXFbMl07CisJaW50IHJldHZhbCwgaSwgZmluZ2VyX3RvdWNoZWQgPSAwOworCisJZG8geworCQlyZXFbMF0gPSBUTUExMjE3X0ZJTkdFUl9TVEFURTsKKwkJcmV0dmFsID0gY3BfdG0xMjE3X3JlYWQodHMsIHJlcSwgMSk7CisJCWlmIChyZXR2YWwgIT0gMSkgeworCQkJZGV2X2Vycih0cy0+ZGV2LAorCQkJCSJjcF90bTEyMTc6IFJlYWQgZnJvbSBkZXZpY2UgZmFpbGVkXG4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWZpbmdlcl90b3VjaGVkID0gMDsKKwkJLyogU3RhcnQgc2FtcGxpbmcgdW50aWwgdGhlIHByZXNzdXJlIGlzIGJlbG93CisJCSAgdGhyZXNob2xkICovCisJCWZvciAoaSA9IDA7IGkgPCBUT1VDSF9TVVBQT1JURUQ7IGkrKykgeworCQkJaWYgKHJlcVsxXSAmIDB4MykgeworCQkJCWZpbmdlcl90b3VjaGVkKys7CisJCQkJaWYgKHRzLT5jcF9pbnB1dF9pbmZvW2ldLnRvdWNoLmJ1dHRvbiA9PSAwKSB7CisJCQkJCS8qIHNlbmQgdGhlIGJ1dHRvbiB0b3VjaCBldmVudCAqLworCQkJCQlpbnB1dF9yZXBvcnRfa2V5KAorCQkJCQkJdHMtPmNwX2lucHV0X2luZm9baV0uaW5wdXQsCisJCQkJCQlCVE5fVE9VQ0gsIDEpOworCQkJCQl0cy0+Y3BfaW5wdXRfaW5mb1tpXS50b3VjaC5idXR0b24gPSAxOworCQkJCX0KKwkJCQlwcm9jZXNzX3RvdWNoKHRzLCBpKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHRzLT5jcF9pbnB1dF9pbmZvW2ldLnRvdWNoLmJ1dHRvbiA9PSAxKSB7CisJCQkJCS8qIHNlbmQgdGhlIGJ1dHRvbiByZWxlYXNlIGV2ZW50ICovCisJCQkJCWlucHV0X3JlcG9ydF9rZXkoCisJCQkJCQl0cy0+Y3BfaW5wdXRfaW5mb1tpXS5pbnB1dCwKKwkJCQkJCUJUTl9UT1VDSCwgMCk7CisJCQkJCWlucHV0X3N5bmModHMtPmNwX2lucHV0X2luZm9baV0uaW5wdXQpOworCQkJCQl0cy0+Y3BfaW5wdXRfaW5mb1tpXS50b3VjaC5idXR0b24gPSAwOworCQkJCX0KKwkJCX0KKwkJCXJlcVsxXSA9IHJlcVsxXSA+PiAyOworCQl9CisJCW1zbGVlcChERUxBWV9CVFdJTl9TQU1QTEUpOworCX0gd2hpbGUgKGZpbmdlcl90b3VjaGVkID4gMCk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBjcF90bTEyMTdfc2FtcGxlX3RocmVhZChpbnQgaXJxLCB2b2lkICpoYW5kbGUpCit7CisJc3RydWN0IGNwX3RtMTIxN19kZXZpY2UgKnRzID0gKHN0cnVjdCBjcF90bTEyMTdfZGV2aWNlICopIGhhbmRsZTsKKwl1OCByZXFbMl07CisJaW50IHJldHZhbDsKKworCS8qIENoZWRrIGlmIGFub3RoZXIgdGhyZWFkIGlzIGFscmVhZHkgcnVubmluZyAqLworCW11dGV4X2xvY2soJnRzLT50aHJlYWRfbXV0ZXgpOworCWlmICh0cy0+dGhyZWFkX3J1bm5pbmcgPT0gMSkgeworCQltdXRleF91bmxvY2soJnRzLT50aHJlYWRfbXV0ZXgpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfSBlbHNlIHsKKwkJdHMtPnRocmVhZF9ydW5uaW5nID0gMTsKKwkJbXV0ZXhfdW5sb2NrKCZ0cy0+dGhyZWFkX211dGV4KTsKKwl9CisKKwkvKiBNYXNrIHRoZSBpbnRlcnJ1cHRzICovCisJcmV0dmFsID0gY3BfdG0xMjE3X21hc2tfaW50ZXJydXB0KHRzKTsKKworCS8qIFJlYWQgdGhlIEludGVycnVwdCBTdGF0dXMgcmVnaXN0ZXIgdG8gZmluZCB0aGUgY2F1c2Ugb2YgdGhlCisJICAgSW50ZXJydXB0ICovCisJcmVxWzBdID0gVE1BMTIxN19JTlRfU1RBVFVTOworCXJldHZhbCA9IGNwX3RtMTIxN19yZWFkKHRzLCByZXEsIDEpOworCWlmIChyZXR2YWwgIT0gMSkKKwkJZ290byBleGl0X3RocmVhZDsKKworCWlmICghKHJlcVsxXSAmIDB4OCkpCisJCWdvdG8gZXhpdF90aHJlYWQ7CisKKwljcF90bTEyMTdfZ2V0X2RhdGEodHMpOworCitleGl0X3RocmVhZDoKKwkvKiBVbm1hc2sgdGhlIGludGVycnVwdHMgYmVmb3JlIGdvaW5nIHRvIHNsZWVwICovCisJcmV0dmFsID0gY3BfdG0xMjE3X3VubWFza19pbnRlcnJ1cHQodHMpOworCisJbXV0ZXhfbG9jaygmdHMtPnRocmVhZF9tdXRleCk7CisJdHMtPnRocmVhZF9ydW5uaW5nID0gMDsKKwltdXRleF91bmxvY2soJnRzLT50aHJlYWRfbXV0ZXgpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IGNwX3RtMTIxN19pbml0X2RhdGEoc3RydWN0IGNwX3RtMTIxN19kZXZpY2UgKnRzKQoreworCWludCByZXR2YWw7CisJdTgJcmVxWzJdOworCisJLyogUmVhZCB0aGUgdmVuZG9yIGlkLyBmdyByZXZpc2lvbiBldGMuIElnbm9yaW5nIHJldHVybiBjaGVjayBhcyB0aGlzCisJICAgaXMgbm9uIGNyaXRpY2FsIGluZm8gICovCisJcmVxWzBdID0gVE1BMTIxN19NQU5VRkFDVFVSRVJfSUQ7CisJcmV0dmFsID0gY3BfdG0xMjE3X3JlYWQodHMsIHJlcSwgMSk7CisJdHMtPnZpbmZvLnZlbmRvcl9pZCA9IHJlcVsxXTsKKworCXJlcVswXSA9IFRNQTEyMTdfUFJPRFVDVF9GQU1JTFk7CisJcmV0dmFsID0gY3BfdG0xMjE3X3JlYWQodHMsIHJlcSwgMSk7CisJdHMtPnZpbmZvLnByb2R1Y3RfZmFtaWx5ID0gcmVxWzFdOworCisJcmVxWzBdID0gVE1BMTIxN19GSVJNV0FSRV9SRVZJU0lPTjsKKwlyZXR2YWwgPSBjcF90bTEyMTdfcmVhZCh0cywgcmVxLCAxKTsKKwl0cy0+dmluZm8uZmlybXdhcmVfcmV2ID0gcmVxWzFdOworCisJcmVxWzBdID0gVE1BMTIxN19TRVJJQUxfTk9fSElHSDsKKwlyZXR2YWwgPSBjcF90bTEyMTdfcmVhZCh0cywgcmVxLCAxKTsKKwl0cy0+dmluZm8uc2VyaWFsX25vID0gKHJlcVsxXSA8PCA4KTsKKworCXJlcVswXSA9IFRNQTEyMTdfU0VSSUFMX05PX0xPVzsKKwlyZXR2YWwgPSBjcF90bTEyMTdfcmVhZCh0cywgcmVxLCAxKTsKKwl0cy0+dmluZm8uc2VyaWFsX25vID0gdHMtPnZpbmZvLnNlcmlhbF9ubyB8IHJlcVsxXTsKKworCXJlcVswXSA9IFRNQTEyMTdfTUFYX1hfSElHSEVSNDsKKwlyZXR2YWwgPSBjcF90bTEyMTdfcmVhZCh0cywgcmVxLCAxKTsKKwl0cy0+ZGluZm8ubWF4WCA9IChyZXFbMV0gJiAweEYpIDw8IDg7CisKKwlyZXFbMF0gPSBUTUExMjE3X01BWF9YX0xPV0VSODsKKwlyZXR2YWwgPSBjcF90bTEyMTdfcmVhZCh0cywgcmVxLCAxKTsKKwl0cy0+ZGluZm8ubWF4WCA9IHRzLT5kaW5mby5tYXhYIHwgcmVxWzFdOworCisJcmVxWzBdID0gVE1BMTIxN19NQVhfWV9ISUdIRVI0OworCXJldHZhbCA9IGNwX3RtMTIxN19yZWFkKHRzLCByZXEsIDEpOworCXRzLT5kaW5mby5tYXhZID0gKHJlcVsxXSAmIDB4RikgPDwgODsKKworCXJlcVswXSA9IFRNQTEyMTdfTUFYX1lfTE9XRVI4OworCXJldHZhbCA9IGNwX3RtMTIxN19yZWFkKHRzLCByZXEsIDEpOworCXRzLT5kaW5mby5tYXhZID0gdHMtPmRpbmZvLm1heFkgfCByZXFbMV07CisKKwlyZXR1cm4gMDsKKworfQorCisvKgorICoJU2V0IHVwIGEgR1BJTyBmb3IgdXNlIGFzIHRoZSBpbnRlcnJ1cHQuIFdlIGNhbid0IHNpbXBseSBkbyB0aGlzIGF0CisgKglib290IHRpbWUgYmVjYXVzZSB0aGUgR1BJTyBkcml2ZXJzIHRoZW1zZWx2ZXMgbWF5IG5vdCBiZSBhcm91bmQgYXQKKyAqCWJvb3QvZmlybXdhcmUgc2V0IHVwIHRpbWUgdG8gZG8gdGhlIHdvcmsuIEluc3RlYWQgZGVmZXIgaXQgdG8gZHJpdmVyCisgKglkZXRlY3Rpb24uCisgKi8KKworc3RhdGljIGludCBjcF90bTEyMTdfc2V0dXBfZ3Bpb19pcnEoc3RydWN0IGNwX3RtMTIxN19kZXZpY2UgKnRzKQoreworCWludCByZXR2YWw7CisKKwkvKiBIb29rIHVwIHRoZSBpcnEgaGFuZGxlciAqLworCXJldHZhbCA9IGdwaW9fcmVxdWVzdCh0cy0+Z3BpbywgImNwX3RtMTIxN190b3VjaCIpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCWRldl9lcnIodHMtPmRldiwgImNwX3RtMTIxNzogR1BJTyByZXF1ZXN0IGZhaWxlZCBlcnJvciAlZFxuIiwKKwkJCQkJCQkJcmV0dmFsKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlyZXR2YWwgPSBncGlvX2RpcmVjdGlvbl9pbnB1dCh0cy0+Z3Bpbyk7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJZGV2X2Vycih0cy0+ZGV2LAorCQkiY3BfdG0xMjE3OiBHUElPIGRpcmVjdGlvbiBjb25maWd1cmF0aW9uIGZhaWxlZCwgZXJyb3IgJWRcbiIsCisJCQkJCQkJCXJldHZhbCk7CisJCWdwaW9fZnJlZSh0cy0+Z3Bpbyk7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJcmV0dmFsID0gZ3Bpb190b19pcnEodHMtPmdwaW8pOworCWlmIChyZXR2YWwgPCAwKSB7CisJCWRldl9lcnIodHMtPmRldiwgImNwX3RtMTIxNzogR1BJTyB0byBJUlEgZmFpbGVkaSwiCisJCSIgZXJyb3IgJWRcbiIsIHJldHZhbCk7CisJCWdwaW9fZnJlZSh0cy0+Z3Bpbyk7CisJfQorCWRldl9kYmcodHMtPmRldiwKKwkJImNwX3RtMTIxNzogR290IElSUSBudW1iZXIgaXMgJWQgZm9yIEdQSU8gJWRcbiIsCisJCXJldHZhbCwgdHMtPmdwaW8pOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgY3BfdG0xMjE3X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGNwX3RtMTIxN19kZXZpY2UgKnRzOworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKKwlzdHJ1Y3QgaW5wdXRfZGV2X2luZm8JKmlucHV0X2luZm87CisJc3RydWN0IGNwX3RtMTIxN19wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwl1OCByZXFbMl07CisJaW50IGksIHJldHZhbDsKKworCS8qIE5vIHBkYXRhIGlzIGZpbmUgLSB3ZSB0aGVuIHVzZSAibm9ybWFsIiBJUlEgbW9kZSAqLworCisJcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJdHMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY3BfdG0xMjE3X2RldmljZSksIEdGUF9LRVJORUwpOworCWlmICghdHMpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCQkiY3BfdG0xMjE3OiBQcml2YXRlIERldmljZSBTdHJ1Y3QgYWxsb2MgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJdHMtPmNsaWVudCA9IGNsaWVudDsKKwl0cy0+ZGV2ID0gJmNsaWVudC0+ZGV2OworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHRzKTsKKworCXRzLT50aHJlYWRfcnVubmluZyA9IDA7CisJbXV0ZXhfaW5pdCgmdHMtPnRocmVhZF9tdXRleCk7CisKKwkvKiBSZXNldCB0aGUgQ29udHJvbGxlciAqLworCXJlcVswXSA9IFRNQTEyMTdfREVWSUNFX0NNRF9SRVNFVDsKKwlyZXFbMV0gPSAweDE7CisJcmV0dmFsID0gY3BfdG0xMjE3X3dyaXRlKHRzLCByZXEsIDEpOworCWlmIChyZXR2YWwgIT0gMSkgeworCQlkZXZfZXJyKHRzLT5kZXYsICJjcF90bTEyMTc6IENvbnRyb2xsZXIgcmVzZXQgZmFpbGVkXG4iKTsKKwkJa2ZyZWUodHMpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBDbGVhciB1cCB0aGUgaW50ZXJydXB0IHN0YXR1cyBmcm9tIHJlc2V0LiAqLworCXJlcVswXSA9IFRNQTEyMTdfSU5UX1NUQVRVUzsKKwlyZXR2YWwgPSBjcF90bTEyMTdfcmVhZCh0cywgcmVxLCAxKTsKKworCS8qIE1hc2sgYWxsIHRoZSBpbnRlcnJ1cHRzICovCisJcmV0dmFsID0gY3BfdG0xMjE3X21hc2tfaW50ZXJydXB0KHRzKTsKKworCS8qIFJlYWQgdGhlIGNvbnRyb2xsZXIgaW5mb3JtYXRpb24gKi8KKwljcF90bTEyMTdfaW5pdF9kYXRhKHRzKTsKKworCS8qIFRoZSBmb2xsb3dpbmcgY29kZSB3aWxsIHJlZ2lzdGVyIG11bHRpcGxlIGV2ZW50IGRldmljZXMgd2hlbgorCSAgIG11bHRpLXBvaW50ZXIgaXMgZW5hYmxlZCwgdGhlIGNvZGUgaGFzIG5vdCBiZWVuIHRlc3RlZAorCSAgIHdpdGggTVBYICovCisJZm9yIChpID0gMDsgaSA8IFRPVUNIX1NVUFBPUlRFRDsgaSsrKSB7CisJCWlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCQlpZiAoaW5wdXRfZGV2ID09IE5VTEwpIHsKKwkJCWRldl9lcnIodHMtPmRldiwKKwkJCQkiY3BfdG0xMjE3OklucHV0IERldmljZSBTdHJ1Y3QgYWxsb2MgZmFpbGVkXG4iKTsKKwkJCWtmcmVlKHRzKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCWlucHV0X2luZm8gPSAmdHMtPmNwX2lucHV0X2luZm9baV07CisJCXNucHJpbnRmKGlucHV0X2luZm8tPm5hbWUsIHNpemVvZihpbnB1dF9pbmZvLT5uYW1lKSwKKwkJCSJjcF90bTEyMTdfdG91Y2hzY3JlZW5fJWQiLCBpKTsKKwkJaW5wdXRfZGV2LT5uYW1lID0gaW5wdXRfaW5mby0+bmFtZTsKKwkJc25wcmludGYoaW5wdXRfaW5mby0+cGh5cywgc2l6ZW9mKGlucHV0X2luZm8tPnBoeXMpLAorCQkJIiVzL2lucHV0JWQiLCBkZXZfbmFtZSgmY2xpZW50LT5kZXYpLCBpKTsKKworCQlpbnB1dF9kZXYtPnBoeXMgPSBpbnB1dF9pbmZvLT5waHlzOworCQlpbnB1dF9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfSTJDOworCisJCWlucHV0X2Rldi0+ZXZiaXRbMF0gPSBCSVRfTUFTSyhFVl9LRVkpIHwgQklUX01BU0soRVZfQUJTKTsKKwkJaW5wdXRfZGV2LT5rZXliaXRbQklUX1dPUkQoQlROX1RPVUNIKV0gPSBCSVRfTUFTSyhCVE5fVE9VQ0gpOworCisJCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX1gsIDAsIHRzLT5kaW5mby5tYXhYLCAwLCAwKTsKKwkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfWSwgMCwgdHMtPmRpbmZvLm1heFksIDAsIDApOworCisJCXJldHZhbCA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpbnB1dF9kZXYpOworCQlpZiAocmV0dmFsKSB7CisJCQlkZXZfZXJyKHRzLT5kZXYsCisJCQkJIklucHV0IGRldiByZWdpc3RyYXRpb24gZmFpbGVkIGZvciAlc1xuIiwKKwkJCQkJaW5wdXRfZGV2LT5uYW1lKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlpbnB1dF9pbmZvLT5pbnB1dCA9IGlucHV0X2RldjsKKwl9CisKKwkvKiBTZXR1cCB0aGUgcmVwb3J0aW5nIG1vZGUgdG8gc2VuZCBhbiBpbnRlcnJ1cHQgb25seSB3aGVuCisJICAgZmluZ2VyIGFycml2ZXMgb3IgZGVwYXJ0cy4gKi8KKwlyZXFbMF0gPSBUTUExMjE3X1JFUE9SVF9NT0RFOworCXJlcVsxXSA9IDB4MDI7CisJcmV0dmFsID0gY3BfdG0xMjE3X3dyaXRlKHRzLCByZXEsIDEpOworCisJLyogU2V0dXAgdGhlIGRldmljZSB0byBubyBzbGVlcCBtb2RlIGZvciBub3cgYW5kIG1ha2UgaXQgY29uZmlndXJlZCAqLworCXJlcVswXSA9IFRNQTEyMTdfREVWSUNFX0NUUkw7CisJcmVxWzFdID0gMHg4NDsKKwlyZXR2YWwgPSBjcF90bTEyMTdfd3JpdGUodHMsIHJlcSwgMSk7CisKKwkvKiBDaGVjayBmb3IgdGhlIHN0YXR1cyBvZiB0aGUgZGV2aWNlICovCisJcmVxWzBdID0gVE1BMTIxN19ERVZfU1RBVFVTOworCXJldHZhbCA9IGNwX3RtMTIxN19yZWFkKHRzLCByZXEsIDEpOworCWlmIChyZXFbMV0gIT0gMCkgeworCQlkZXZfZXJyKHRzLT5kZXYsCisJCQkiY3BfdG0xMjE3OiBEZXZpY2UgU3RhdHVzIDB4JXggIT0gMDogY29uZmlnIGZhaWxlZFxuIiwKKwkJCXJlcVsxXSk7CisKKwkJcmV0dmFsID0gLUVJTzsKKwkJZ290byBmYWlsOworCX0KKworCWlmIChwZGF0YSAmJiBwZGF0YS0+Z3BpbykgeworCQl0cy0+Z3BpbyA9IHBkYXRhLT5ncGlvOworCQlyZXR2YWwgPSBjcF90bTEyMTdfc2V0dXBfZ3Bpb19pcnEodHMpOworCX0gZWxzZQorCQlyZXR2YWwgPSBjbGllbnQtPmlycTsKKworCWlmIChyZXR2YWwgPCAwKSB7CisJCWRldl9lcnIodHMtPmRldiwgImNwX3RtMTIxNzogR1BJTyByZXF1ZXN0IGZhaWxlZCBlcnJvciAlZFxuIiwKKwkJCQkJCQkJcmV0dmFsKTsKKwkJZ290byBmYWlsOworCX0KKworCWNsaWVudC0+aXJxID0gcmV0dmFsOworCisKKwlyZXR2YWwgPSByZXF1ZXN0X3RocmVhZGVkX2lycShjbGllbnQtPmlycSwKKwkJTlVMTCwgY3BfdG0xMjE3X3NhbXBsZV90aHJlYWQsCisJCUlSUUZfVFJJR0dFUl9GQUxMSU5HLCAiY3BfdG0xMjE3X3RvdWNoIiwgdHMpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCWRldl9lcnIodHMtPmRldiwgImNwX3RtMTIxNzogUmVxdWVzdCBJUlEgZXJyb3IgJWRcbiIsIHJldHZhbCk7CisJCWdvdG8gZmFpbF9ncGlvOworCX0KKworCS8qIFVubWFzayB0aGUgaW50ZXJydXB0cyAqLworCXJldHZhbCA9IGNwX3RtMTIxN191bm1hc2tfaW50ZXJydXB0KHRzKTsKKwlpZiAocmV0dmFsID09IDApCisJCXJldHVybiAwOworCisJZnJlZV9pcnEoY2xpZW50LT5pcnEsIHRzKTsKK2ZhaWxfZ3BpbzoKKwlpZiAodHMtPmdwaW8pCisJCWdwaW9fZnJlZSh0cy0+Z3Bpbyk7CitmYWlsOgorCS8qIENsZWFuIHVwIGJlZm9yZSByZXR1cm5pbmcgZmFpbHVyZSAqLworCWZvciAoaSA9IDA7IGkgPCBUT1VDSF9TVVBQT1JURUQ7IGkrKykgeworCQlpZiAodHMtPmNwX2lucHV0X2luZm9baV0uaW5wdXQpIHsKKwkJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHRzLT5jcF9pbnB1dF9pbmZvW2ldLmlucHV0KTsKKwkJCWlucHV0X2ZyZWVfZGV2aWNlKHRzLT5jcF9pbnB1dF9pbmZvW2ldLmlucHV0KTsKKwkJfQorCX0KKwlrZnJlZSh0cyk7CisJcmV0dXJuIHJldHZhbDsKKworfQorCisvKgorICogY3BfdG0xMjE3IHN1c3BlbmQKKyAqCisgKi8KK3N0YXRpYyBpbnQgY3BfdG0xMjE3X3N1c3BlbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgcG1fbWVzc2FnZV90IG1lc2cpCit7CisJc3RydWN0IGNwX3RtMTIxN19kZXZpY2UgKnRzID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdTggcmVxWzJdOworCWludCByZXR2YWw7CisKKwkvKiBQdXQgdGhlIGNvbnRyb2xsZXIgdG8gc2xlZXAgKi8KKwlyZXFbMF0gPSBUTUExMjE3X0RFVklDRV9DVFJMOworCXJldHZhbCA9IGNwX3RtMTIxN19yZWFkKHRzLCByZXEsIDEpOworCXJlcVsxXSA9IChyZXFbMV0gJiAweEY4KSB8IDB4MTsKKwlyZXR2YWwgPSBjcF90bTEyMTdfd3JpdGUodHMsIHJlcSwgMSk7CisKKwlpZiAoZGV2aWNlX21heV93YWtldXAoJmNsaWVudC0+ZGV2KSkKKwkJZW5hYmxlX2lycV93YWtlKGNsaWVudC0+aXJxKTsKKworCXJldHVybiAwOworfQorCisvKgorICogY3BfdG0xMjE3X3Jlc3VtZQorICoKKyAqLworc3RhdGljIGludCBjcF90bTEyMTdfcmVzdW1lKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGNwX3RtMTIxN19kZXZpY2UgKnRzID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdTggcmVxWzJdOworCWludCByZXR2YWw7CisKKwkvKiBUYWtlIHRoZSBjb250cm9sbGVyIG91dCBvZiBzbGVlcCAqLworCXJlcVswXSA9IFRNQTEyMTdfREVWSUNFX0NUUkw7CisJcmV0dmFsID0gY3BfdG0xMjE3X3JlYWQodHMsIHJlcSwgMSk7CisJcmVxWzFdID0gKHJlcVsxXSAmIDB4RjgpIHwgMHg0OworCXJldHZhbCA9IGNwX3RtMTIxN193cml0ZSh0cywgcmVxLCAxKTsKKworCS8qIFJlc3RvcmUgdGhlIHJlZ2lzdGVyIHNldHRpbmdzIHNpbmMgdGhlIHBvd2VyIHRvIHRoZQorCSAgIGNvdWxkIGhhdmUgYmVlbiBjdXQgb2ZmICovCisKKwkvKiBTZXR1cCB0aGUgcmVwb3J0aW5nIG1vZGUgdG8gc2VuZCBhbiBpbnRlcnJ1cHQgb25seSB3aGVuCisJICAgZmluZ2VyIGFycml2ZXMgb3IgZGVwYXJ0cy4gKi8KKwlyZXFbMF0gPSBUTUExMjE3X1JFUE9SVF9NT0RFOworCXJlcVsxXSA9IDB4MDI7CisJcmV0dmFsID0gY3BfdG0xMjE3X3dyaXRlKHRzLCByZXEsIDEpOworCisJLyogU2V0dXAgdGhlIGRldmljZSB0byBubyBzbGVlcCBtb2RlIGZvciBub3cgYW5kIG1ha2UgaXQgY29uZmlndXJlZCAqLworCXJlcVswXSA9IFRNQTEyMTdfREVWSUNFX0NUUkw7CisJcmVxWzFdID0gMHg4NDsKKwlyZXR2YWwgPSBjcF90bTEyMTdfd3JpdGUodHMsIHJlcSwgMSk7CisKKwkvKiBTZXR1cCB0aGUgaW50ZXJydXB0IG1hc2sgKi8KKwlyZXR2YWwgPSBjcF90bTEyMTdfdW5tYXNrX2ludGVycnVwdCh0cyk7CisKKwlpZiAoZGV2aWNlX21heV93YWtldXAoJmNsaWVudC0+ZGV2KSkKKwkJZGlzYWJsZV9pcnFfd2FrZShjbGllbnQtPmlycSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGNwX3RtMTIxN19yZW1vdmUKKyAqCisgKi8KK3N0YXRpYyBpbnQgY3BfdG0xMjE3X3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBjcF90bTEyMTdfZGV2aWNlICp0cyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBpOworCisJZnJlZV9pcnEoY2xpZW50LT5pcnEsIHRzKTsKKwlpZiAodHMtPmdwaW8pCisJCWdwaW9fZnJlZSh0cy0+Z3Bpbyk7CisJZm9yIChpID0gMDsgaSA8IFRPVUNIX1NVUFBPUlRFRDsgaSsrKQorCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSh0cy0+Y3BfaW5wdXRfaW5mb1tpXS5pbnB1dCk7CisJa2ZyZWUodHMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGkyY19kZXZpY2VfaWQgY3BfdG0xMjE3X2lkdGFibGVbXSA9IHsKKwl7IENQVE0xMjE3X0RFVklDRV9OQU1FLCAwIH0sCisJeyB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgY3BfdG0xMjE3X2lkdGFibGUpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgY3BfdG0xMjE3X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLm5hbWUJPSBDUFRNMTIxN19EUklWRVJfTkFNRSwKKwl9LAorCS5pZF90YWJsZQk9IGNwX3RtMTIxN19pZHRhYmxlLAorCS5wcm9iZQkJPSBjcF90bTEyMTdfcHJvYmUsCisJLnJlbW92ZQkJPSBjcF90bTEyMTdfcmVtb3ZlLAorCS5zdXNwZW5kICAgID0gY3BfdG0xMjE3X3N1c3BlbmQsCisJLnJlc3VtZSAgICAgPSBjcF90bTEyMTdfcmVzdW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgY2xlYXJwYWRfdG0xMjE3X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmNwX3RtMTIxN19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYXJwYWRfdG0xMjE3X2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmY3BfdG0xMjE3X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGNsZWFycGFkX3RtMTIxN19pbml0KTsKK21vZHVsZV9leGl0KGNsZWFycGFkX3RtMTIxN19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiUmFtZXNoIEFnYXJ3YWwgPHJhbWVzaC5hZ2Fyd2FsQGludGVsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU3luYXB0aWNzIFRNMTIxNyBUb3VjaFNjcmVlbiBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jcHRtMTIxNy9jcF90bTEyMTcuaCBiL2RyaXZlcnMvc3RhZ2luZy9jcHRtMTIxNy9jcF90bTEyMTcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGNlMzFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NwdG0xMjE3L2NwX3RtMTIxNy5oCkBAIC0wLDAgKzEsOSBAQAorI2lmbmRlZiBfX0xJTlVYX0kyQ19DUF9UTTEyMTdfSAorI2RlZmluZSBfX0xJTlVYX0kyQ19DUF9UTTEyMTdfSAorCitzdHJ1Y3QgY3BfdG0xMjE3X3BsYXRmb3JtX2RhdGEKK3sKKwlpbnQgZ3BpbzsJCS8qIElmIG5vdCBzZXQgdXNlcyB0aGUgSVJRIHJlc291cmNlIDAgKi8KK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9jcnlzdGFsaGRfaHcuYyBiL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvY3J5c3RhbGhkX2h3LmMKaW5kZXggZjYzMTg1Ny4uMTUzZGRiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9jcnlzdGFsaGRfaHcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY3J5c3RhbGhkL2NyeXN0YWxoZF9ody5jCkBAIC0xNzExLDcgKzE3MTEsNyBAQAogCX0KIAogCUJDTUxPRyhCQ01MT0dfSU5GTywgIkZpcm13YXJlIERvd25sb2FkZWQgU3VjY2Vzc2Z1bGx5XG4iKTsKLQlyZXR1cm4gQkNfU1RTX1NVQ0NFU1M7OworCXJldHVybiBCQ19TVFNfU1VDQ0VTUzsKIH0KIAogZW51bSBCQ19TVEFUVVMgY3J5c3RhbGhkX2RvX2Z3X2NtZChzdHJ1Y3QgY3J5c3RhbGhkX2h3ICpodywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvY3J5c3RhbGhkX2xueC5jIGIvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9jcnlzdGFsaGRfbG54LmMKaW5kZXggMjhjNmI4Yy4uNzE5ZTcwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9jcnlzdGFsaGRfbG54LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9jcnlzdGFsaGRfbG54LmMKQEAgLTUxNiw3ICs1MTYsNyBAQAogCiAJQkNNTE9HX0VOVEVSOwogCi0JcGluZm8gPSAoc3RydWN0IGNyeXN0YWxoZF9hZHAgKikgcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXBpbmZvID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCWlmICghcGluZm8pIHsKIAkJQkNNTE9HX0VSUigiY291bGQgbm90IGdldCBhZHBcbiIpOwogCQlyZXR1cm47CkBAIC02MjYsNyArNjI2LDcgQEAKIAlzdHJ1Y3QgY3J5c3RhbGhkX2lvY3RsX2RhdGEgKnRlbXA7CiAJZW51bSBCQ19TVEFUVVMgc3RzID0gQkNfU1RTX1NVQ0NFU1M7CiAKLQlhZHAgPSAoc3RydWN0IGNyeXN0YWxoZF9hZHAgKilwY2lfZ2V0X2RydmRhdGEocGRldik7CisJYWRwID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCWlmICghYWRwKSB7CiAJCUJDTUxPR19FUlIoImNvdWxkIG5vdCBnZXQgYWRwXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC02NjAsNyArNjYwLDcgQEAKIAllbnVtIEJDX1NUQVRVUyBzdHMgPSBCQ19TVFNfU1VDQ0VTUzsKIAlpbnQgcmM7CiAKLQlhZHAgPSAoc3RydWN0IGNyeXN0YWxoZF9hZHAgKilwY2lfZ2V0X2RydmRhdGEocGRldik7CisJYWRwID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCWlmICghYWRwKSB7CiAJCUJDTUxPR19FUlIoImNvdWxkIG5vdCBnZXQgYWRwXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLWFsc2EuYyBiL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtYWxzYS5jCmluZGV4IDlhMjA1YTMuLjE2MGY2NjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtYWxzYS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtYWxzYS5jCkBAIC02MzAsNyArNjMwLDcgQEAKICAqIE9ubHkgYm9hcmRzIHdpdGggZWVwcm9tIGFuZCBieXRlIDEgYXQgZWVwcm9tPTEgaGF2ZSBpdAogICovCiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBjeDI1ODIxX2F1ZGlvX3BjaV90YmxbXSBfX2RldmluaXRkYXRhID0geworc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGN4MjU4MjFfYXVkaW9fcGNpX3RibCkgPSB7CiAJezB4MTRmMSwgMHgwOTIwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKIAl7MCx9CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9jb21ldC5jIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9jb21ldC5jCmluZGV4IGRjYmU2YjYuLjUyMjI0Y2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvY29tZXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL2NvbWV0LmMKQEAgLTI5LDcgKzI5LDcgQEAKICNlbmRpZgogCiAKLWV4dGVybiBpbnQgIGxvZ19sZXZlbDsKK2V4dGVybiBpbnQgIGN4dDFlMV9sb2dfbGV2ZWw7CiAKICNkZWZpbmUgQ09NRVRfTlVNX1NBTVBMRVMgICAyNCAgLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHdhdmVmb3JtIHRhYmxlICovCiAjZGVmaW5lIENPTUVUX05VTV9VTklUUyAgICAgNSAgIC8qIE51bWJlciBvZiBwb2ludHMgcGVyIGVudHJ5IGluIHRhYmxlICovCkBAIC0yOTIsMTIgKzI5MiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGkuZS5GUE1PREU9MCAoQDB4MjApICovCiAgICAgICAgIGlmICgobW9yZVBhcmFtcyAmIENGR19DTEtfUE9SVF9NQVNLKSA9PSBDRkdfQ0xLX1BPUlRfSU5URVJOQUwpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChsb2dfbGV2ZWwgPj0gTE9HX1NCRUJVRzEyKQorICAgICAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX1NCRUJVRzEyKQogICAgICAgICAgICAgICAgIHByX2luZm8oIj4+ICVzOiBjbG9ja21hc3RlciBpbnRlcm5hbCBjbG9ja1xuIiwgX19mdW5jX18pOwogICAgICAgICAgICAgcGNpX3dyaXRlXzMyICgodV9pbnQzMl90ICopICZjb21ldC0+dHhfdGltZSwgMHgwZCk7IC8qIGludGVybmFsIG9zY2lsbGF0b3IgKi8KICAgICAgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgICAgIC8qIGV4dGVybmFsIGNsb2NrIHNvdXJjZSAqLwogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobG9nX2xldmVsID49IExPR19TQkVCVUcxMikKKyAgICAgICAgICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19TQkVCVUcxMikKICAgICAgICAgICAgICAgICBwcl9pbmZvKCI+PiAlczogY2xvY2ttYXN0ZXIgZXh0ZXJuYWwgY2xvY2tcbiIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIHBjaV93cml0ZV8zMiAoKHVfaW50MzJfdCAqKSAmY29tZXQtPnR4X3RpbWUsIDB4MDkpOyAvKiBsb29wIHRpbWluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChleHRlcm5hbCkgKi8KQEAgLTMxMiw3ICszMTIsNyBAQAogICAgICAgICAgICAgcGNpX3dyaXRlXzMyICgodV9pbnQzMl90ICopICZjb21ldC0+YnJpZl9jZmcsIDB4MjEpOyAgICAgICAgLyogU2xhdmUgTW9kZSAoQ01PREU9MSkgKi8KICAgICAgICAgcGNpX3dyaXRlXzMyICgodV9pbnQzMl90ICopICZjb21ldC0+YnJpZl9mcGNmZywgMHgyMCk7ICAvKiBTbGF2ZSBNb2RlIGkuZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBGUE1PREU9MSAoQDB4MjApICovCi0gICAgICAgIGlmIChsb2dfbGV2ZWwgPj0gTE9HX1NCRUJVRzEyKQorICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfU0JFQlVHMTIpCiAgICAgICAgICAgICBwcl9pbmZvKCI+PiAlczogY2xvY2tzbGF2ZSBpbnRlcm5hbCBjbG9ja1xuIiwgX19mdW5jX18pOwogICAgICAgICBwY2lfd3JpdGVfMzIgKCh1X2ludDMyX3QgKikgJmNvbWV0LT50eF90aW1lLCAweDBkKTsgICAgIC8qIG9zY2lsbGF0b3IgdGltaW5nICovCiAgICAgfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9mdW5jdGlvbnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvZnVuY3Rpb25zLmMKaW5kZXggYWIzOTljMi4uZDlhOWFhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9mdW5jdGlvbnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL2Z1bmN0aW9ucy5jCkBAIC01NCw3ICs1NCw3IEBACiAKICNlbmRpZgogCi1leHRlcm4gaW50ICBsb2dfbGV2ZWw7CitleHRlcm4gaW50ICBjeHQxZTFfbG9nX2xldmVsOwogZXh0ZXJuIGludCAgZHJ2cl9zdGF0ZTsKIAogCkBAIC02Nyw3ICs2Nyw3IEBACiAKICAgICBGTFVTSF9QQ0lfUkVBRCAoKTsKICAgICB2ID0gbGUzMl90b19jcHUgKCpwKTsKLSAgICBpZiAobG9nX2xldmVsID49IExPR19ERUJVRykKKyAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfREVCVUcpCiAgICAgICAgIHByX2luZm8oInBjaV9yZWFkIDogJXggPSAleFxuIiwgKHVfaW50MzJfdCkgcCwgdik7CiAgICAgcmV0dXJuIHY7CiAjZWxzZQpAQCAtODAsNyArODAsNyBAQAogcGNpX3dyaXRlXzMyICh1X2ludDMyX3QgKnAsIHVfaW50MzJfdCB2KQogewogI2lmZGVmIEZMT1dfREVCVUcKLSAgICBpZiAobG9nX2xldmVsID49IExPR19ERUJVRykKKyAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfREVCVUcpCiAgICAgICAgIHByX2luZm8oInBjaV93cml0ZTogJXggPSAleFxuIiwgKHVfaW50MzJfdCkgcCwgdik7CiAjZW5kaWYKICAgICAqcCA9IGNwdV90b19sZTMyICh2KTsKQEAgLTExOCw3ICsxMTgsNyBAQAogCiAgICAgaWYgKGRydnJfc3RhdGUgIT0gU0JFX0RSVlJfQVZBSUxBQkxFKQogICAgIHsKLSAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKKyAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IpCiAgICAgICAgICAgICBwcl93YXJuaW5nKCIlczogZHJ2ciBub3QgYXZhaWxhYmxlICgleClcbiIsIF9fZnVuY19fLCBkcnZyX3N0YXRlKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvaHdwcm9iZS5jIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9od3Byb2JlLmMKaW5kZXggODkyMDBlNy4uYzUxN2NjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9od3Byb2JlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9od3Byb2JlLmMKQEAgLTM3LDcgKzM3LDcgQEAKICNkZWZpbmUgU1RBVElDICBzdGF0aWMKICNlbmRpZgogCi1leHRlcm4gaW50ICBsb2dfbGV2ZWw7CitleHRlcm4gaW50ICBjeHQxZTFfbG9nX2xldmVsOwogZXh0ZXJuIGludCAgZXJyb3JfZmxhZzsKIGV4dGVybiBpbnQgIGRydnJfc3RhdGU7CiAKQEAgLTE0Myw3ICsxNDMsNyBAQAogICAgIGlmICgoaGktPnByb21mbXQgPSBwbWNfdmVyaWZ5X2Nrc3VtICgmaGktPm1mZ19pbmZvLmRhdGEpKSA9PSBQUk9NX0ZPUk1BVF9VbmspCiAgICAgewogICAgICAgICAvKiBiYWQgY3JjLCBkYXRhIGlzIHN1c3BlY3QgKi8KLSAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfV0FSTikKKyAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX1dBUk4pCiAgICAgICAgICAgICBwcl9pbmZvKCIlczogRUVQUk9NIGNrc3VtIGVycm9yXG4iLCBoaS0+ZGV2bmFtZSk7CiAgICAgICAgIGhpLT5tZmdfaW5mb19zdHMgPSBFRVBST01fQ1JDRVJSOwogICAgIH0gZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9saW51eC5jCmluZGV4IGM3OTMwMjguLjBmNzhmODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvbGludXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL2xpbnV4LmMKQEAgLTEwOCw5ICsxMDgsOSBAQAogI2VuZGlmCiAKIGludCAgICAgICAgIGVycm9yX2ZsYWc7ICAgICAgICAgLyogbW9kdWxlIGxvYWQgZXJyb3IgcmVwb3J0aW5nICovCi1pbnQgICAgICAgICBsb2dfbGV2ZWwgPSBMT0dfRVJST1I7CitpbnQgICAgICAgICBjeHQxZTFfbG9nX2xldmVsID0gTE9HX0VSUk9SOwogaW50ICAgICAgICAgbG9nX2xldmVsX2RlZmF1bHQgPSBMT0dfRVJST1I7Ci1tb2R1bGVfcGFyYW0obG9nX2xldmVsLCBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKGN4dDFlMV9sb2dfbGV2ZWwsIGludCwgMDQ0NCk7CiAKIGludCAgICAgICAgIGN4dDFlMV9tYXhfbXJ1ID0gTVVTWUNDX01SVTsKIGludCAgICAgICAgIG1heF9tcnVfZGVmYXVsdCA9IE1VU1lDQ19NUlU7CkBAIC00OTcsNyArNDk3LDcgQEAKICAgICBydG5sX2xvY2sgKCk7ICAgICAgICAgICAgICAgICAgIC8qIG5lZWRlZCBkdWUgdG8gSW9jdGwgY2FsbGluZyBzZXF1ZW5jZSAqLwogICAgIGlmIChyZXQpCiAgICAgewotICAgICAgICBpZiAobG9nX2xldmVsID49IExPR19XQVJOKQorICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfV0FSTikKICAgICAgICAgICAgIHByX2luZm8oIiVzOiBjcmVhdGVfY2hhblslZF0gcmVnaXN0cmF0aW9uIGVycm9yID0gJWQuXG4iLAogICAgICAgICAgICAgICAgICAgICBjaS0+ZGV2bmFtZSwgY3AtPmNoYW5udW0sIHJldCk7CiAgICAgICAgIGZyZWVfbmV0ZGV2IChkZXYpOyAgICAgICAgICAvKiBjbGVhbnVwICovCkBAIC03MjIsMTEgKzcyMiwxMSBAQAogU1RBVElDICAgICAgc3RhdHVzX3QKIGRvX3NldF9sb2dsZXZlbCAoc3RydWN0IG5ldF9kZXZpY2UgKiBuZGV2LCB2b2lkICpkYXRhKQogewotICAgIHVuc2lnbmVkIGludCBsb2dfbGV2ZWw7CisgICAgdW5zaWduZWQgaW50IGN4dDFlMV9sb2dfbGV2ZWw7CiAKLSAgICBpZiAoY29weV9mcm9tX3VzZXIgKCZsb2dfbGV2ZWwsIGRhdGEsIHNpemVvZiAoaW50KSkpCisgICAgaWYgKGNvcHlfZnJvbV91c2VyICgmY3h0MWUxX2xvZ19sZXZlbCwgZGF0YSwgc2l6ZW9mIChpbnQpKSkKICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7Ci0gICAgc2JlY29tX3NldF9sb2dsZXZlbCAobG9nX2xldmVsKTsKKyAgICBzYmVjb21fc2V0X2xvZ2xldmVsIChjeHQxZTFfbG9nX2xldmVsKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMTExNSw5ICsxMTE1LDkgQEAKICAgICAgICAgcmV0dXJuIC1ydG47ICAgICAgICAgICAgICAgIC8qIGluc3RhbGxhdGlvbiBmYWlsdXJlIC0gc2VlIHN5c3RlbSBsb2cgKi8KIAogICAgIC8qIGhvdXNla2VlcGluZyBub3RpZmljYXRpb25zICovCi0gICAgaWYgKGxvZ19sZXZlbCAhPSBsb2dfbGV2ZWxfZGVmYXVsdCkKLSAgICAgICAgcHJfaW5mbygiTk9URTogZHJpdmVyIHBhcmFtZXRlciA8bG9nX2xldmVsPiBjaGFuZ2VkIGZyb20gZGVmYXVsdCAlZCB0byAlZC5cbiIsCi0gICAgICAgICAgICAgICAgbG9nX2xldmVsX2RlZmF1bHQsIGxvZ19sZXZlbCk7CisgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgIT0gbG9nX2xldmVsX2RlZmF1bHQpCisgICAgICAgIHByX2luZm8oIk5PVEU6IGRyaXZlciBwYXJhbWV0ZXIgPGN4dDFlMV9sb2dfbGV2ZWw+IGNoYW5nZWQgZnJvbSBkZWZhdWx0ICVkIHRvICVkLlxuIiwKKyAgICAgICAgICAgICAgICBsb2dfbGV2ZWxfZGVmYXVsdCwgY3h0MWUxX2xvZ19sZXZlbCk7CiAgICAgICAgaWYgKGN4dDFlMV9tYXhfbXJ1ICE9IG1heF9tcnVfZGVmYXVsdCkKICAgICAgICAgICAgICAgIHByX2luZm8oIk5PVEU6IGRyaXZlciBwYXJhbWV0ZXIgPGN4dDFlMV9tYXhfbXJ1PiBjaGFuZ2VkIGZyb20gZGVmYXVsdCAlZCB0byAlZC5cbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X21ydV9kZWZhdWx0LCBjeHQxZTFfbWF4X21ydSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL211c3ljYy5jIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9tdXN5Y2MuYwppbmRleCBmYzE1NjEwLi5mMjc0Yzc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL211c3ljYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvbXVzeWNjLmMKQEAgLTk3LDcgKzk3LDcgQEAKIC8qIGdsb2JhbCBkcml2ZXIgdmFyaWFibGVzICovCiBleHRlcm4gY2lfdCAqYzRfbGlzdDsKIGV4dGVybiBpbnQgIGRydnJfc3RhdGU7Ci1leHRlcm4gaW50ICBsb2dfbGV2ZWw7CitleHRlcm4gaW50ICBjeHQxZTFfbG9nX2xldmVsOwogCiBleHRlcm4gaW50ICBjeHQxZTFfbWF4X21ydTsKIGV4dGVybiBpbnQgIGN4dDFlMV9tYXhfbXR1OwpAQCAtNjI3LDcgKzYyNyw3IEBACiAKICAgICBpZiAoKHIgIT0gcmVxKSAmJiAocmVxICE9IFNSX0NISVBfUkVTRVQpICYmICgrK3JjbnQgPD0gTVVTWUNDX1NSX1JFVFJZX0NOVCkpCiAgICAgewotICAgICAgICBpZiAobG9nX2xldmVsID49IExPR19NT05JVE9SKQorICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKICAgICAgICAgICAgIHByX2luZm8oIiVzOiAlZCAtIHJlaXNzdWUgc3J2IHJlcS9sYXN0ICV4LyV4IChoZHcgcmVhZHMgJXgpLCBDaGFuICVkLlxuIiwKICAgICAgICAgICAgICAgICAgICAgcGktPnVwLT5kZXZuYW1lLCByY250LCByZXEsIHBpLT5zcl9sYXN0LCByLAogICAgICAgICAgICAgICAgICAgICAocGktPnBvcnRudW0gKiBNVVNZQ0NfTkNIQU5TKSArIChyZXEgJiAweDFmKSk7CkBAIC05NTEsNyArOTUxLDcgQEAKICAgICBjaCA9IHBpLT5jaGFuW2djaGFuXTsKICAgICBpZiAoY2ggPT0gMCB8fCBjaC0+c3RhdGUgIT0gVVApCiAgICAgewotICAgICAgICBpZiAobG9nX2xldmVsID49IExPR19FUlJPUikKKyAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX0VSUk9SKQogICAgICAgICAgICAgcHJfaW5mbygiJXM6IGludHI6IHhtaXQgRU9NIG9uIHVuaW5pdGlhbGl6ZWQgY2hhbm5lbCAlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgcGktPnVwLT5kZXZuYW1lLCBnY2hhbik7CiAgICAgfQpAQCAtMTAwMiw3ICsxMDAyLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzdGF0dXMgJiBNVVNZQ0NfVFhfT1dORUQpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKKyAgICAgICAgICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHByX2luZm8oIiVzOiBQb3J0ICVkIENoYW4gJTJkIC0gdW5leHBlY3RlZCBUWCBtc2cgb3duZXJzaGlwIGludHIgKG1kICVwIHN0cyAleClcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGktPnVwLT5kZXZuYW1lLCBwaS0+cG9ydG51bSwgY2gtPmNoYW5udW0sCkBAIC0xMDE2LDcgKzEwMTYsNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgLyogTm90IG91ciBtZGVzYywgZG9uZSAqLwogICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKKyAgICAgICAgICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKICAgICAgICAgICAgICAgICAgICAgcHJfaW5mbygiJXM6IFBvcnQgJWQgQ2hhbiAlMmQgLSByZWNvdmVyZWQgVFggbXNnIG93bmVyc2hpcCBbJWRdIChtZCAlcCBzdHMgJXgpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpLT51cC0+ZGV2bmFtZSwgcGktPnBvcnRudW0sIGNoLT5jaGFubnVtLCByZWFkQ291bnQsIG1kLCBzdGF0dXMpOwogICAgICAgICAgICAgfQpAQCAtMTA1NCw3ICsxMDU0LDcgQEAKICAgICAgICAgfQogICAgICAgICBtZC0+c3RhdHVzID0gMDsKICNpZmRlZiBSTERfVFhGVUxMX0RFQlVHCi0gICAgICAgIGlmIChsb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IyKQorICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUjIpCiAgICAgICAgICAgICBwcl9pbmZvKCJ+fiB0eF9lb206IHR4X2Z1bGwgJXggIHR4ZF9mcmVlICVkIC0+ICVkXG4iLAogICAgICAgICAgICAgICAgICAgICBjaC0+dHhfZnVsbCwgY2gtPnR4ZF9mcmVlLCBjaC0+dHhkX2ZyZWUgKyAxKTsKICNlbmRpZgpAQCAtMTA2Myw3ICsxMDYzLDcgQEAKIAogICAgICAgICBpZiAoKGNoLT5wLmNoYW5fbW9kZSAhPSBDRkdfQ0hfUFJPVE9fVFJBTlMpICYmIChzdGF0dXMgJiBFT0JJUlFfRU5BQkxFKSkKICAgICAgICAgewotICAgICAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKKyAgICAgICAgICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19NT05JVE9SKQogICAgICAgICAgICAgICAgIHByX2luZm8oIiVzOiBNb2RlICgleCkgaW5jb3JyZWN0IEVPQiBzdGF0dXMgKCV4KVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHBpLT51cC0+ZGV2bmFtZSwgY2gtPnAuY2hhbl9tb2RlLCBzdGF0dXMpOwogICAgICAgICAgICAgaWYgKChzdGF0dXMgJiBFT01JUlFfRU5BQkxFKSA9PSAwKQpAQCAtMTA5NCw3ICsxMDk0LDcgQEAKICAgICAgICAgewogCiAjaWZkZWYgUkxEX1RYRlVMTF9ERUJVRwotICAgICAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUjIpCisgICAgICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUjIpCiAgICAgICAgICAgICAgICAgcHJfaW5mbygidHhfZW9tWyVkXTogZW5hYmxlIHhtaXQgdHhfZnVsbCBubyBtb3JlLCB0eGRfZnJlZSAlZCB0eGRfbnVtLzIgJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBjaC0+Y2hhbm51bSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNoLT50eGRfZnJlZSwgY2gtPnR4ZF9udW0gLyAyKTsKQEAgLTExMDgsNyArMTEwOCw3IEBACiAjaWZkZWYgUkxEX1RYRlVMTF9ERUJVRwogICAgIGVsc2UgaWYgKGNoLT50eF9mdWxsKQogICAgIHsKLSAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUjIpCisgICAgICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19NT05JVE9SMikKICAgICAgICAgICAgIHByX2luZm8oInR4X2VvbVslZF06IGJ5cGFzcyBUWCBlbmFibGUgdGhvdWdoIHJvb20gYXZhaWxhYmxlPyAodHhkX2ZyZWUgJWQgdHhkX251bS8yICVkKVxuIiwKICAgICAgICAgICAgICAgICAgICAgY2gtPmNoYW5udW0sCiAgICAgICAgICAgICAgICAgICAgIGNoLT50eGRfZnJlZSwgY2gtPnR4ZF9udW0gLyAyKTsKQEAgLTExMzgsNyArMTEzOCw3IEBACiAgICAgY2ggPSBwaS0+Y2hhbltnY2hhbl07CiAgICAgaWYgKGNoID09IDAgfHwgY2gtPnN0YXRlICE9IFVQKQogICAgIHsKLSAgICAgICAgaWYgKGxvZ19sZXZlbCA+IExPR19FUlJPUikKKyAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPiBMT0dfRVJST1IpCiAgICAgICAgICAgICBwcl9pbmZvKCIlczogaW50cjogcmVjZWl2ZSBFT00gb24gdW5pbml0aWFsaXplZCBjaGFubmVsICVkXG4iLAogICAgICAgICAgICAgICAgICAgICBwaS0+dXAtPmRldm5hbWUsIGdjaGFuKTsKICAgICAgICAgcmV0dXJuOwpAQCAtMTI2OSw3ICsxMjY5LDcgQEAKIAogICAgIGlmIChuZXh0SW50ICE9IElOVFJQVFNfTkVYVElOVCAoY2ktPmludGxvZy50aGlzX3N0YXR1c19uZXcpKQogICAgIHsKLSAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKKyAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IpCiAgICAgICAgIHsKICAgICAgICAgICAgIHByX2luZm8oIiVzOiBub3RlIC0gdXBkYXRlZCBJU0QgZnJvbSAlMDh4IHRvICUwOHhcbiIsCiAgICAgICAgICAgICAgICAgICAgIGNpLT5kZXZuYW1lLCBzdGF0dXMsCkBAIC0xMzM3LDExICsxMzM3LDExIEBACiAgICAgY2ktPmludGxvZy5sYXN0X3N0YXR1c19uZXcgPSBjaS0+aW50bG9nLnRoaXNfc3RhdHVzX25ldzsKICAgICBjaS0+aW50bG9nLnRoaXNfc3RhdHVzX25ldyA9IGN1cnJJbnQ7CiAKLSAgICBpZiAoKGxvZ19sZXZlbCA+PSBMT0dfV0FSTikgJiYgKHN0YXR1cyAmIElOVFJQVFNfSU5URlVMTF9NKSkKKyAgICBpZiAoKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX1dBUk4pICYmIChzdGF0dXMgJiBJTlRSUFRTX0lOVEZVTExfTSkpCiAgICAgewogICAgICAgICBwcl9pbmZvKCIlczogSW50ZXJydXB0IHF1ZXVlIGZ1bGwgY29uZGl0aW9uIG9jY3VycmVkXG4iLCBjaS0+ZGV2bmFtZSk7CiAgICAgfQotICAgIGlmIChsb2dfbGV2ZWwgPj0gTE9HX0RFQlVHKQorICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19ERUJVRykKICAgICAgICAgcHJfaW5mbygiJXM6IGludGVycnVwdHMgcGVuZGluZywgaXNkIEAgMHglcDogJXggY3VyciAlZCBjbnQgJWQgTkVYVCAlZFxuIiwKICAgICAgICAgICAgICAgICBjaS0+ZGV2bmFtZSwgJmNpLT5yZWctPmlzZCwKICAgICAgICAgc3RhdHVzLCBuZXh0SW50LCBpbnRDbnQsIChpbnRDbnQgKyBuZXh0SW50KSAmIChJTlRfUVVFVUVfU0laRSAtIDEpKTsKQEAgLTE0NDgsNyArMTQ0OCw3IEBACiAgICAgICAgIGlmICgoY3VyckludCA9PSBiYWRJbnQpIHx8IChjdXJySW50ID09IGJhZEludDIpKSAgICAgICAgLyogY2F0Y2ggZmFpbHVyZSBvZiBCdWcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBGaXggY2hlY2tpbmcgKi8KICAgICAgICAgewotICAgICAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfV0FSTikKKyAgICAgICAgICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19XQVJOKQogICAgICAgICAgICAgICAgIHByX2luZm8oIiVzOiBJbGxlZ2FsIEludGVycnVwdCBEZXRlY3RlZCBAIDB4JXAsIG1vZCAlZC4pXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgY2ktPmRldm5hbWUsICZjaS0+aXFkX3BbaGVhZHhdLCBoZWFkeCk7CiAKQEAgLTE0ODMsNyArMTQ4Myw3IEBACiAgICAgICAgIGNpLT5pcWRfcFtoZWFkeF0gPSBfX2NvbnN0YW50X2NwdV90b19sZTMyIChJTlRfRU1QVFlfRU5UUlkpOwogICAgICAgICBGTFVTSF9NRU1fV1JJVEUgKCk7CiAKLSAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfREVCVUcpCisgICAgICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19ERUJVRykKICAgICAgICAgewogICAgICAgICAgICAgaWYgKGVyciAhPSAwKQogICAgICAgICAgICAgICAgIHByX2luZm8oIiAlMDh4IC0+IGVycjogJTJkLCIsIGN1cnJJbnQsIGVycik7CkBAIC0xNDk3LDcgKzE0OTcsNyBAQAogICAgICAgICBzd2l0Y2ggKGV2ZW50KQogICAgICAgICB7CiAgICAgICAgIGNhc2UgRVZFX1NBQ0s6ICAgICAgICAgICAgICAvKiBTZXJ2aWNlIFJlcXVlc3QgQWNrbm93bGVkZ2UgKi8KLSAgICAgICAgICAgIGlmIChsb2dfbGV2ZWwgPj0gTE9HX0RFQlVHKQorICAgICAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX0RFQlVHKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHZvbGF0aWxlIHVfaW50MzJfdCByOwogCkBAIC0xNTM0LDcgKzE1MzQsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpZiAobG9nX2xldmVsID49IExPR19XQVJOKQorICAgICAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX1dBUk4pCiAgICAgICAgICAgICAgICAgcHJfaW5mbygiJXM6IHVuZXhwZWN0ZWQgaW50ZXJydXB0IGV2ZW50OiAlZCwgaXFkWyVkXTogJTA4eCwgcG9ydDogJWRcbiIsIGNpLT5kZXZuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsIGhlYWR4LCBjdXJySW50LCBncm91cCk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTE1NzMsOSArMTU3Myw5IEBACiAKICAgICAgICAgICAgICAgICB7CiAjaWZkZWYgUkxEX1RSQU5TX0RFQlVHCi0gICAgICAgICAgICAgICAgICAgIGlmICgxIHx8IGxvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKKyAgICAgICAgICAgICAgICAgICAgaWYgKDEgfHwgY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKICNlbHNlCi0gICAgICAgICAgICAgICAgICAgIGlmIChsb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IpCisgICAgICAgICAgICAgICAgICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19NT05JVE9SKQogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHByX2luZm8oIiVzOiBUWCBidWZmZXIgdW5kZXJmbG93IFtPTlJdIG9uIGNoYW5uZWwgJWQsIG1vZGUgJXggUVN0b3BwZWQgJXggZnJlZSAlZFxuIiwKQEAgLTE2MDUsNyArMTYwNSw3IEBACiAgICAgICAgICAgICAgICAgY2gtPnMucnhfb3Zlcl9lcnJvcnMrKzsKICAgICAgICAgICAgICAgICBjaC0+Y2hfc3RhcnRfcnggPSBDSF9TVEFSVF9SWF9PTlI7CiAKLSAgICAgICAgICAgICAgICBpZiAobG9nX2xldmVsID49IExPR19XQVJOKQorICAgICAgICAgICAgICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19XQVJOKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHJfaW5mbygiJXM6IFJYIGJ1ZmZlciBvdmVyZmxvdyBbT05SXSBvbiBjaGFubmVsICVkLCBtb2RlICV4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpLT5kZXZuYW1lLCBjaC0+Y2hhbm51bSwgY2gtPnAuY2hhbl9tb2RlKTsKQEAgLTE2MjMsNyArMTYyMyw3IEBACiAgICAgICAgICAgICAgICAgICogUGVyIE1VU1lDQyBtYW51YWwsIFNlY3Rpb24gIDYuNC44LjMgW1RyYW5zbWl0IEVycm9yc10sCiAgICAgICAgICAgICAgICAgICogdGhpcyBCVUZGIGVycm9yIHJlcXVpcmVzIFRyYW5zbWl0IGNoYW5uZWwgcmVhY3RpdmF0aW9uLgogICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmIChsb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IpCisgICAgICAgICAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IpCiAgICAgICAgICAgICAgICAgICAgIHByX2luZm8oIiVzOiBUWCBidWZmZXIgdW5kZXJydW4gW0JVRkZdIG9uIGNoYW5uZWwgJWQsIG1vZGUgJXhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ktPmRldm5hbWUsIGNoLT5jaGFubnVtLCBjaC0+cC5jaGFuX21vZGUpOwogICAgICAgICAgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgLyogUlggYnVmZmVyIG92ZXJydW4gKi8KQEAgLTE2MzYsNyArMTYzNiw3IEBACiAgICAgICAgICAgICAgICAgICogc3BhY2UgZm9yIHRoaXMgY2hhbm5lbC4gIFJlY2VpdmUgY2hhbm5lbCByZWFjdGl2YXRpb24gaXMKICAgICAgICAgICAgICAgICAgKiBub3QgcmVxdWlyZWQsIGJ1dCBkYXRhIGhhcyBiZWVuIGxvc3QuCiAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfV0FSTikKKyAgICAgICAgICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfV0FSTikKICAgICAgICAgICAgICAgICAgICAgcHJfaW5mbygiJXM6IFJYIGJ1ZmZlciBvdmVycnVuIFtCVUZGXSBvbiBjaGFubmVsICVkLCBtb2RlICV4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpLT5kZXZuYW1lLCBjaC0+Y2hhbm51bSwgY2gtPnAuY2hhbl9tb2RlKTsKICAgICAgICAgICAgICAgICAvKgpAQCAtMTY1OCw3ICsxNjU4LDcgQEAKICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN3aXRjaCBvbiBlcnIgKi8KIAogICAgICAgICAvKiBDaGVjayBmb3IgaW50ZXJydXB0IGxvc3QgY29uZGl0aW9uICovCi0gICAgICAgIGlmICgoY3VyckludCAmIElOVFJQVF9JTE9TVF9NKSAmJiAobG9nX2xldmVsID49IExPR19FUlJPUikpCisgICAgICAgIGlmICgoY3VyckludCAmIElOVFJQVF9JTE9TVF9NKSAmJiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfRVJST1IpKQogICAgICAgICB7CiAgICAgICAgICAgICBwcl9pbmZvKCIlczogSW50ZXJydXB0IHF1ZXVlIG92ZXJmbG93IC0gSUxPU1QgYXNzZXJ0ZWRcbiIsCiAgICAgICAgICAgICAgICAgICAgIGNpLT5kZXZuYW1lKTsKQEAgLTE2NjcsNyArMTY2Nyw3IEBACiAgICAgICAgIEZMVVNIX01FTV9XUklURSAoKTsKICAgICAgICAgRkxVU0hfTUVNX1JFQUQgKCk7CiAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3aGlsZSAqLwotICAgIGlmICgobG9nX2xldmVsID49IExPR19NT05JVE9SMikgJiYgKGNpLT5pcXBfaGVhZHggIT0gY2ktPmlxcF90YWlseCkpCisgICAgaWYgKChjeHQxZTFfbG9nX2xldmVsID49IExPR19NT05JVE9SMikgJiYgKGNpLT5pcXBfaGVhZHggIT0gY2ktPmlxcF90YWlseCkpCiAgICAgewogICAgICAgICBpbnQgICAgICAgICBiaDsKIApAQCAtMTgyMSw5ICsxODIxLDkgQEAKICAgICAgICAgcmV0dXJuIEVST0ZTOyAgICAgICAgICAgICAgIC8qIGhvdyBlbHNlIHRvIGZsYWcgdW53cml0YWJsZSBzdGF0ZSA/ICovCiAKICNpZmRlZiBSTERfVFJBTlNfREVCVUd4Ci0gICAgaWYgKDEgfHwgbG9nX2xldmVsID49IExPR19NT05JVE9SMikKKyAgICBpZiAoMSB8fCBjeHQxZTFfbG9nX2xldmVsID49IExPR19NT05JVE9SMikKICNlbHNlCi0gICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUjIpCisgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IyKQogI2VuZGlmCiAgICAgewogICAgICAgICBwcl9pbmZvKCIrKyBzdGFydF94bXRbJWRdOiBzdGF0ZSAleCBzdGFydCAleCBmdWxsICVkIGZyZWUgJWQgcmVxdWlyZWQgJWQgc3RvcHBlZCAleFxuIiwKQEAgLTE4NDYsNyArMTg0Niw3IEBACiAKICAgICBpZiAodHhkX25lZWRfY250ID09IDApCiAgICAgewotICAgICAgICBpZiAobG9nX2xldmVsID49IExPR19NT05JVE9SMikKKyAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IyKQogICAgICAgICAgICAgcHJfaW5mbygiJXMgY2hhbm5lbCAlZDogbm8gVFggZGF0YSBpbiBVc2VyIGJ1ZmZlclxuIiwgY2ktPmRldm5hbWUsIGNoYW5udW0pOwogICAgICAgICBPU19tZW1fdG9rZW5fZnJlZSAobWVtX3Rva2VuKTsKICAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgIC8qIG5vIGRhdGEgdG8gc2VuZCAqLwpAQCAtMTg1Nyw3ICsxODU3LDcgQEAKICAgICBpZiAodHhkX25lZWRfY250ID4gY2gtPnR4ZF9udW0pIC8qIG5ldmVyIGVub3VnaCBkZXNjcmlwdG9ycyBmb3IgdGhpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbGFyZ2UgYSBidWZmZXIgKi8KICAgICB7Ci0gICAgICAgIGlmIChsb2dfbGV2ZWwgPj0gTE9HX0RFQlVHKQorICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfREVCVUcpCiAgICAgICAgIHsKICAgICAgICAgICAgIHByX2luZm8oInN0YXJ0X3htaXQ6IGRpc2NhcmRpbmcgYnVmZmVyLCBpbnN1ZmZpY2llbnQgZGVzY3JpcHRvciBjbnQgJWQsIG5lZWQgJWQuXG4iLAogICAgICAgICAgICAgICAgICAgICBjaC0+dHhkX251bSwgdHhkX25lZWRfY250ICsgMSk7CkBAIC0xODc0LDcgKzE4NzQsNyBAQAogICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAgaWYgKHR4ZF9uZWVkX2NudCA+IGNoLT50eGRfZnJlZSkKICAgICB7Ci0gICAgICAgIGlmIChsb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IyKQorICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUjIpCiAgICAgICAgIHsKICAgICAgICAgICAgIHByX2luZm8oInN0YXJ0X3htaXRbJWRdOiBFQlVTWSAtIG5lZWQgbW9yZSBkZXNjcmlwdG9ycywgaGF2ZSAlZCBvZiAlZCBuZWVkICVkXG4iLAogICAgICAgICAgICAgICAgICAgICBjaGFubnVtLCBjaC0+dHhkX2ZyZWUsIGNoLT50eGRfbnVtLCB0eGRfbmVlZF9jbnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9wbWNjNF9kcnYuYyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvcG1jYzRfZHJ2LmMKaW5kZXggNWM4YTNlYi4uMzQxZTdhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9wbWNjNF9kcnYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL3BtY2M0X2Rydi5jCkBAIC0xMzUsNyArMTM1LDcgQEAKIHZvaWQgICAgICAgIG11c3ljY191cGRhdGVfdGltZXNsb3RzIChtcGlfdCAqKTsKIAogZXh0ZXJuIHZvaWQgbXVzeWNjX3VwZGF0ZV90eF90aHAgKG1jaF90ICopOwotZXh0ZXJuIGludCAgbG9nX2xldmVsOworZXh0ZXJuIGludCAgY3h0MWUxX2xvZ19sZXZlbDsKIGV4dGVybiBpbnQgIGN4dDFlMV9tYXhfbXJ1OwogZXh0ZXJuIGludCAgY3h0MWUxX21heF9tdHU7CiBleHRlcm4gaW50ICBtYXhfcnhkZXNjX3VzZWQsIG1heF9yeGRlc2NfZGVmYXVsdDsKQEAgLTE2OCwxMiArMTY4LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZvciBjYXJkIDAgb25seSAqLwogICAgIH0gZWxzZQogICAgIHsKLSAgICAgICAgaWYgKGxvZ19sZXZlbCAhPSBkKQorICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCAhPSBkKQogICAgICAgICB7Ci0gICAgICAgICAgICBwcl9pbmZvKCJsb2cgbGV2ZWwgY2hhbmdlZCBmcm9tICVkIHRvICVkXG4iLCBsb2dfbGV2ZWwsIGQpOwotICAgICAgICAgICAgbG9nX2xldmVsID0gZDsgICAgICAgICAgLyogc2V0IG5ldyAqLworICAgICAgICAgICAgcHJfaW5mbygibG9nIGxldmVsIGNoYW5nZWQgZnJvbSAlZCB0byAlZFxuIiwgY3h0MWUxX2xvZ19sZXZlbCwgZCk7CisgICAgICAgICAgICBjeHQxZTFfbG9nX2xldmVsID0gZDsgICAgICAgICAgLyogc2V0IG5ldyAqLwogICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHByX2luZm8oImxvZyBsZXZlbCBpcyAlZFxuIiwgbG9nX2xldmVsKTsKKyAgICAgICAgICAgIHByX2luZm8oImxvZyBsZXZlbCBpcyAlZFxuIiwgY3h0MWUxX2xvZ19sZXZlbCk7CiAgICAgfQogfQogCkBAIC01MTMsNyArNTEzLDcgQEAKICAgICAgICAgICAgIGlmICgodmFsdWUgPT0gMHgxYykgfHwgKHZhbHVlID09IDB4MTkpIHx8ICh2YWx1ZSA9PSAweDEyKSkKICAgICAgICAgICAgICAgICBjNF9sb29wX3BvcnQgKGNpLCBwb3J0bnVtLCBDT01FVF9NRElBR19MQk9GRik7ICAvKiB0YWtlIHBvcnQgb3V0IG9mIGFueQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGxvb3BiayBtb2RlICovCi0gICAgICAgICAgICBpZiAobG9nX2xldmVsID49IExPR19ERUJVRykKKyAgICAgICAgICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19ERUJVRykKICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gMHgzZikKICAgICAgICAgICAgICAgICAgICAgcHJfd2FybmluZygiJXM6IEJPQyB2YWx1ZSA9ICV4IG9uIFBvcnQgJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ktPmRldm5hbWUsIHZhbHVlLCBwb3J0bnVtKTsKQEAgLTUzMyw3ICs1MzMsNyBAQAogewogICAgIGlmIChkcnZyX3N0YXRlICE9IFNCRV9EUlZSX0FWQUlMQUJMRSkKICAgICB7Ci0gICAgICAgIGlmIChsb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IpCisgICAgICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19NT05JVE9SKQogICAgICAgICAgICAgcHJfaW5mbygiZHJ2ciBub3QgYXZhaWxhYmxlICgleClcbiIsIGRydnJfc3RhdGUpOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNzk0LDE5ICs3OTQsMTkgQEAKICAgICAgICAgfQogCiAgICAgICAgIHBjaV93cml0ZV8zMiAoKHVfaW50MzJfdCAqKSAmY29tZXQtPm1kaWFnLCBjbWQpOwotICAgICAgICBpZiAobG9nX2xldmVsID49IExPR19XQVJOKQorICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfV0FSTikKICAgICAgICAgICAgIHByX2luZm8oIiVzOiBsb29wYmFjayBtb2RlIGNoYW5nZWQgdG8gJTJ4IGZyb20gJTJ4IG9uIFBvcnQgJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgIGNpLT5kZXZuYW1lLCBjbWQsIGxvb3BWYWx1ZSwgcG9ydG51bSk7CiAgICAgICAgIGxvb3BWYWx1ZSA9IHBjaV9yZWFkXzMyICgodV9pbnQzMl90ICopICZjb21ldC0+bWRpYWcpICYgQ09NRVRfTURJQUdfTEJNQVNLOwogICAgICAgICBpZiAobG9vcFZhbHVlICE9IGNtZCkKICAgICAgICAgewotICAgICAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfRVJST1IpCisgICAgICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfRVJST1IpCiAgICAgICAgICAgICAgICAgcHJfaW5mbygiJXM6IHdyaXRlIHRvIGxvb3AgcmVnaXN0ZXIgZmFpbGVkLCB1bmtub3duIHN0YXRlIGZvciBQb3J0ICVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgY2ktPmRldm5hbWUsIHBvcnRudW0pOwogICAgICAgICB9CiAgICAgfSBlbHNlCiAgICAgewotICAgICAgICBpZiAobG9nX2xldmVsID49IExPR19XQVJOKQorICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfV0FSTikKICAgICAgICAgICAgIHByX2luZm8oIiVzOiBsb29wYmFjayBhbHJlYWR5IGluIHRoYXQgbW9kZSAoJTJ4KVxuIiwKICAgICAgICAgICAgICAgICAgICAgY2ktPmRldm5hbWUsIGxvb3BWYWx1ZSk7CiAgICAgfQpAQCAtOTk3LDcgKzk5Nyw3IEBACiAgICAgcGkgPSAmY2ktPnBvcnRbcG9ydG51bV07CiAgICAgcHAgPSAmY2ktPnBvcnRbcG9ydG51bV0ucDsKICAgICBlMW1vZGUgPSBJU19GUkFNRV9BTllfRTEgKHBwLT5wb3J0X21vZGUpOwotICAgIGlmIChsb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IyKQorICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19NT05JVE9SMikKICAgICB7CiAgICAgICAgIHByX2luZm8oIiVzOiBjNF9zZXRfcG9ydFslZF06ICBlbnRlcmVkLCBlMW1vZGUgPSAleCwgb3BlbmNoYW5zICVkLlxuIiwKICAgICAgICAgICAgICAgICBjaS0+ZGV2bmFtZSwKQEAgLTEyNzgsMTIgKzEyNzgsMTIgQEAKICAgICB9CiAgICAgaWYgKG1heCAhPSAqbGVuKQogICAgIHsKLSAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfV0FSTikKKyAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX1dBUk4pCiAgICAgICAgICAgICBwcl9pbmZvKCIlczogd2FudGVkIHRvIGFsbG9jYXRlICVkIGZpZm8gc3BhY2UsIGJ1dCBnb3Qgb25seSAlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgcGktPnVwLT5kZXZuYW1lLCAqbGVuLCBtYXgpOwogICAgICAgICAqbGVuID0gbWF4OwogICAgIH0KLSAgICBpZiAobG9nX2xldmVsID49IExPR19ERUJVRykKKyAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfREVCVUcpCiAgICAgICAgIHByX2luZm8oIiVzOiBhbGxvY2F0ZWQgJWQgZmlmbyBhdCAlZCBmb3IgY2hhbm5lbCAlZC8lZFxuIiwKICAgICAgICAgICAgICAgICBwaS0+dXAtPmRldm5hbWUsIG1heCwgc3RhcnQsIGNoYW4sIHBpLT5wLnBvcnRudW0pOwogICAgIGZvciAoaSA9IG1heHN0YXJ0OyBpIDwgKG1heHN0YXJ0ICsgbWF4KTsgaSsrKQpAQCAtMTI5Niw3ICsxMjk2LDcgQEAKIHsKICAgICBpbnQgICAgICAgICBpOwogCi0gICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfREVCVUcpCisgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX0RFQlVHKQogICAgICAgICBwcl9pbmZvKCIlczogZGVhbGxvY2F0ZWQgZmlmbyBmb3IgY2hhbm5lbCAlZC8lZFxuIiwKICAgICAgICAgICAgICAgICBwaS0+dXAtPmRldm5hbWUsIGNoYW4sIHBpLT5wLnBvcnRudW0pOwogICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQpAQCAtMTMyMSw3ICsxMzIxLDcgQEAKICAgICAgICAgcmV0dXJuIEVOT0VOVDsKICAgICBpZiAoY2gtPnN0YXRlID09IFVQKQogICAgIHsKLSAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKKyAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IpCiAgICAgICAgICAgICBwcl9pbmZvKCIlczogY2hhbm5lbCBhbHJlYWR5IFVQLCBncmFjZWZ1bCBlYXJseSBleGl0XG4iLAogICAgICAgICAgICAgICAgICAgICBjaS0+ZGV2bmFtZSk7CiAgICAgICAgIHJldHVybiAwOwpAQCAtMTMzNCw3ICsxMzM0LDcgQEAKICAgICB7CiAgICAgICAgIGlmIChjaC0+cC5iaXRtYXNrW2ldICYgcGktPnRzbVtpXSkKICAgICAgICAgewotICAgICAgICAgICAgaWYgKDEgfHwgbG9nX2xldmVsID49IExPR19XQVJOKQorICAgICAgICAgICAgaWYgKDEgfHwgY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfV0FSTikKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBwcl9pbmZvKCIlczogYzRfY2hhbl91cFslZF0gRUlOVkFMIChhdHRlbXB0IHRvIGNmZyBpbi11c2Ugb3IgdW5hdmFpbGFibGUgVGltZVNsb3RbJWRdKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGNpLT5kZXZuYW1lLCBjaGFubnVtLCBpKTsKQEAgLTEzNTEsNyArMTM1MSw3IEBACiAgICAgbmJ1ZiA9IG50cyAvIDggPyBudHMgLyA4IDogMTsKICAgICBpZiAoIW5idWYpCiAgICAgewotICAgICAgICAvKiBpZiggbG9nX2xldmVsID49IExPR19XQVJOKSAgKi8KKyAgICAgICAgLyogaWYoIGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX1dBUk4pICAqLwogICAgICAgICBwcl9pbmZvKCIlczogYzRfY2hhbl91cFslZF0gRU5PQlVGUyAobm8gVGltZVNsb3RzIGFzc2lnbmVkKVxuIiwKICAgICAgICAgICAgICAgICBjaS0+ZGV2bmFtZSwgY2hhbm51bSk7CiAgICAgICAgIHJldHVybiBFTk9CVUZTOyAgICAgICAgICAgICAvKiB0aGlzIHNob3VsZCBub3QgaGFwcGVuICovCkBAIC0xNDIwLDcgKzE0MjAsNyBAQAogCiAjaWYgMAogICAgIC8qIERFQlVHIElORk8gKi8KLSAgICBpZiAobG9nX2xldmVsID49IExPR19NT05JVE9SKQorICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19NT05JVE9SKQogICAgICAgICBwcl9pbmZvKCIlczogbW9kZSAleCByeG51bSAlZCAocnh1c2VkICVkIGRlZiAlZCkgdHhudW0gJWQgKHR4dXNlZCAlZCBkZWYgJWQpXG4iLAogICAgICAgICAgICAgICAgIGNpLT5kZXZuYW1lLCBjaC0+cC5jaGFuX21vZGUsCiAgICAgICAgICAgICAgICAgcnhudW0sIG1heF9yeGRlc2NfdXNlZCwgbWF4X3J4ZGVzY19kZWZhdWx0LApAQCAtMTQ1MSw3ICsxNDUxLDcgQEAKIAogICAgICAgICAgICAgICAgaWYgKCEobSA9IE9TX21lbV90b2tlbl9hbGxvYyAoY3h0MWUxX21heF9tcnUpKSkKICAgICAgICAgewotICAgICAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKKyAgICAgICAgICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19NT05JVE9SKQogICAgICAgICAgICAgICAgIHByX2luZm8oIiVzOiBjNF9jaGFuX3VwWyVkXSAtIHRva2VuIGFsbG9jIGZhaWx1cmUsIHNpemUgPSAlZC5cbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpLT5kZXZuYW1lLCBjaGFubnVtLCBjeHQxZTFfbWF4X21ydSk7CiAgICAgICAgICAgICBnb3RvIGVycmZyZWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL3NiZWNvbV9pbmxpbmVfbGludXguaCBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvc2JlY29tX2lubGluZV9saW51eC5oCmluZGV4IDVhNzJjYjUuLjUwMWEzMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvc2JlY29tX2lubGluZV9saW51eC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvc2JlY29tX2lubGluZV9saW51eC5oCkBAIC04Niw3ICs4Niw3IEBACiAKICAgICBGTFVTSF9QQ0lfUkVBRCAoKTsKICAgICB2ID0gbGUzMl90b19jcHUgKCpwKTsKLSAgICBpZiAobG9nX2xldmVsID49IExPR19ERUJVRykKKyAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfREVCVUcpCiAgICAgICAgIHByX2luZm8oInBjaV9yZWFkIDogJXggPSAleFxuIiwgKHVfaW50MzJfdCkgcCwgdik7CiAgICAgcmV0dXJuIHY7CiAjZWxzZQpAQCAtOTksNyArOTksNyBAQAogcGNpX3dyaXRlXzMyICh1X2ludDMyX3QgKnAsIHVfaW50MzJfdCB2KQogewogI2lmZGVmIEZMT1dfREVCVUcKLSAgICBpZiAobG9nX2xldmVsID49IExPR19ERUJVRykKKyAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfREVCVUcpCiAgICAgICAgIHByX2luZm8oInBjaV93cml0ZTogJXggPSAleFxuIiwgKHVfaW50MzJfdCkgcCwgdik7CiAjZW5kaWYKICAgICAqcCA9IGNwdV90b19sZTMyICh2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9LY29uZmlnCmluZGV4IDlkNWZlNGQuLmJkOTZmMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvS2NvbmZpZwpAQCAtMSw3ICsxLDYgQEAKIGNvbmZpZyBFQVNZQ0FQCiAJdHJpc3RhdGUgIkVhc3lDQVAgVVNCIElEIDA1ZTE6MDQwOCBzdXBwb3J0IgogCWRlcGVuZHMgb24gVVNCICYmIFZJREVPX0RFVgotCWRlcGVuZHMgb24gQktMICMgcGxlYXNlIGZpeAogCiAJLS0taGVscC0tLQogCSAgVGhpcyBpcyBhbiBpbnRlZ3JhdGVkIGF1ZGlvL3ZpZGVvIGRyaXZlciBmb3IgRWFzeUNBUCBjYXJkcyB3aXRoCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL01ha2VmaWxlCmluZGV4IDhhM2Q5MTEuLmYxZjJmYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL01ha2VmaWxlCkBAIC0xMCw0ICsxMCw1IEBACiBjY2ZsYWdzLXkgKz0gLURFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVAogY2NmbGFncy15ICs9IC1ERUFTWUNBUF9ORUVEU19WNEwyX0RFVklDRV9ICiBjY2ZsYWdzLXkgKz0gLURFQVNZQ0FQX05FRURTX1Y0TDJfRk9QUworY2NmbGFncy15ICs9IC1ERUFTWUNBUF9ORUVEU19VTkxPQ0tFRF9JT0NUTAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9SRUFETUUgYi9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9SRUFETUUKaW5kZXggMzc3NTQ4MS4uNmI1YWMwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvUkVBRE1FCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL1JFQURNRQpAQCAtMjQsNiArMjQsOSBAQAogQlVJTEQgT1BUSU9OUyBBTkQgREVQRU5ERU5DSUVTCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorVW5sZXNzIEVBU1lDQVBfREVCVUcgaXMgZGVmaW5lZCBkdXJpbmcgY29tcGlsYXRpb24gaXQgd2lsbCBub3QgYmUgcG9zc2libGUKK3RvIHNlbGVjdCBhIGRlYnVnIGxldmVsIGF0IHRoZSB0aW1lIG9mIG1vZHVsZSBpbnN0YWxsYXRpb24uCisKIElmIHRoZSBwYXJhbWV0ZXIgRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQgaXMgdW5kZWZpbmVkIGR1cmluZyBjb21waWxhdGlvbgogdGhlIGJ1aWx0IG1vZHVsZSBpcyBlbnRpcmVseSBpbmRlcGVuZGVudCBvZiB0aGUgdmlkZW9kZXYgbW9kdWxlLCBhbmQgd2hlbgogdGhlIEVhc3lDQVAgaXMgcGh5c2ljYWxseSBwbHVnZ2VkIGludG8gYSBVU0IgcG9ydCB0aGUgc3BlY2lhbCBmaWxlcwpAQCAtMzMsNDEgKzM2LDU0IEBACiBJZiB0aGUgcGFyYW1ldGVyIEVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UIGlzIGRlZmluZWQgZHVyaW5nIGNvbXBpbGF0aW9uCiB0aGUgYnVpbHQgZWFzeWNhcCBtb2R1bGUgaXMgY29uZmlndXJlZCB0byByZWdpc3RlciB3aXRoIHRoZSB2aWRlb2RldiBtb2R1bGUsCiBpbiB3aGljaCBjYXNlIHRoZSBzcGVjaWFsIGZpbGVzIGNyZWF0ZWQgd2hlbiB0aGUgRWFzeUNBUCBpcyBwbHVnZ2VkIGluIGFyZQotL2Rldi92aWRlbzAgYW5kIC9kZXYvZWFzeXNuZDAuICBVc2Ugb2YgdGhlIGVhc3ljYXAgbW9kdWxlIGFzIGEgY2xpZW50IG9mCi10aGUgdmlkZW9kZXYgbW9kdWxlIGhhcyByZWNlaXZlZCB2ZXJ5IGxpdHRsZSB0ZXN0aW5nIGFzIG9mIEp1bmUgMjAxMC4KKy9kZXYvdmlkZW8wIGFuZCAvZGV2L2Vhc3lzbmQwLgogCitEdXJpbmcgaW4tdHJlZSBidWlsZHMgdGhlIGZvbGxvd2luZyBzaG91bGQgc2hvdWxkIGJlIGRlZmluZWQgd2hlbmV2ZXIgdGhlCitwYXJhbWV0ZXIgRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQgaXMgZGVmaW5lZDoKIAotS05PV04gQlVJTEQgUFJPQkxFTVMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFQVNZQ0FQX05FRURTX1Y0TDJfREVWSUNFX0gKK0VBU1lDQVBfTkVFRFNfVjRMMl9GT1BTCitFQVNZQ0FQX05FRURTX1VOTE9DS0VEX0lPQ1RMCiAKLSgxKSBSZWNlbnQgZ2NjIHZlcnNpb25zIG1heSBnZW5lcmF0ZSB0aGUgbWVzc2FnZToKLQotICAgICB3YXJuaW5nOiB0aGUgZnJhbWUgc2l6ZSBvZiAuLi4uIGJ5dGVzIGlzIGxhcmdlciB0aGFuIDEwMjQgYnl0ZXMKLQotVGhpcyB3YXJuaW5nIGNhbiBiZSBzdXBwcmVzc2VkIGJ5IHNwZWNpZnlpbmcgaW4gdGhlIE1ha2VmaWxlOgotCi0gICAgIEVYVFJBX0NGTEFHUyArPSAtV2ZyYW1lLWxhcmdlci10aGFuPTgxOTIKLQotYnV0IGl0IHdvdWxkIGJlIHByZWZlcmFibGUgdG8gcmVtb3ZlIHRoZSBjYXVzZSBvZiB0aGUgd2FybmluZy4KK0lmIHRoZSBidWlsZCBpcyBwZXJmb3JtZWQgb3V0LW9mLXRyZWUgYWdhaW5zdCBvbGRlciBrZXJuZWxzIHRoZSBwYXJhbWV0ZXJzCit0byBiZSBkZWZpbmVkIGRlcGVuZCBvbiB0aGUga2VybmVsIHZlcnNpb24gaW4gYSB3YXkgd2hpY2ggd2lsbCBub3QgYmUKK2Rpc2N1c3NlZCBoZXJlLgogCiAKIEtOT1dOIFJVTlRJTUUgSVNTVUVTCiAtLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0oMSkgUmFuZG9tbHkgKG1heWJlIDUgdG8gMTAlIG9mIG9jY2FzaW9ucykgdGhlIGRyaXZlciBmYWlscyB0byBwcm9kdWNlIGFueQotb3V0cHV0IGF0IHN0YXJ0LXVwLiAgQ2xvc2luZyBtcGxheWVyIChvciB3aGF0ZXZlciB0aGUgdXNlciBwcm9ncmFtIGlzKSBhbmQKLXJlc3RhcnRpbmcgaXQgcmVzdG9yZXMgbm9ybWFsIHBlcmZvcm1hbmNlIHdpdGhvdXQgYW55IG90aGVyIHJlbWVkaWFsIGFjdGlvbgotYmVpbmcgbmVjZXNzYXJ5LiAgVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyBub3Qga25vd24uCisoMSkgSW50ZW50aW9uYWxseSwgdGhpcyBkcml2ZXIgd2lsbCBub3Qgc3RyZWFtIG1hdGVyaWFsIHdoaWNoIGlzIHVuYW1iaWd1b3VzbHkKK2lkZW50aWZpZWQgYnkgdGhlIGhhcmR3YXJlIGFzIGNvcHktcHJvdGVjdGVkLiAgTm9ybWFsIHZpZGVvIG91dHB1dCB3aWxsIGJlCitwcmVzZW50IGZvciBhYm91dCBhIG1pbnV0ZSBidXQgd2lsbCB0aGVuIGZyZWV6ZSB3aGVuIHRoaXMgc2l0dWF0aW9uIGFyaXNlcy4KIAotKDIpIEludGVudGlvbmFsbHksIHRoaXMgZHJpdmVyIHdpbGwgbm90IHN0cmVhbSBtYXRlcmlhbCB3aGljaCBpcyB1bmFtYmlndW91c2x5Ci1pZGVudGlmaWVkIGJ5IHRoZSBoYXJkd2FyZSBhcyBjb3B5LXByb3RlY3RlZC4gIFRoZSB2aWRlbyBvdXRwdXQgd2lsbCBmcmVlemUKLXdpdGhpbiBhYm91dCBhIG1pbnV0ZSB3aGVuIHRoaXMgc2l0dWF0aW9uIGFyaXNlcy4KLQotKDMpIFRoZSBjb250cm9scyBmb3IgbHVtaW5hbmNlLCBjb250cmFzdCwgc2F0dXJhdGlvbiwgaHVlIGFuZCB2b2x1bWUgbWF5IG5vdAorKDIpIFRoZSBjb250cm9scyBmb3IgbHVtaW5hbmNlLCBjb250cmFzdCwgc2F0dXJhdGlvbiwgaHVlIGFuZCB2b2x1bWUgbWF5IG5vdAogYWx3YXlzIHdvcmsgcHJvcGVybHkuCiAKLSg0KSBSZWR1Y2VkLXJlc29sdXRpb24gUy1WaWRlbyBzZWVtcyB0byBzdWZmZXIgZnJvbSBtb2lyZSBhcnRlZmFjdHMuICBObwotYXR0ZW1wdCBoYXMgeWV0IGJlZW4gbWFkZSB0byByZW1lbWR5IHRoaXMuCisoMykgUmVkdWNlZC1yZXNvbHV0aW9uIFMtVmlkZW8gc2VlbXMgdG8gc3VmZmVyIGZyb20gbW9pcmUgYXJ0ZWZhY3RzLgorCisKK0lOUFVUIE5VTUJFUklORworLS0tLS0tLS0tLS0tLS0tCisKK0ZvciB0aGUgRWFzeUNBUCB3aXRoIFMtVklERU8gaW5wdXQgY2FibGUgdGhlIGRyaXZlciByZWdhcmRzIGEgcmVxdWVzdCBmb3IKK2lucHV0cyBudW1iZXJlZCAwIG9yIDEgYXMgcmVmZXJyaW5nIHRvIENWQlMgYW5kIGEgcmVxdWVzdCBmb3IgaW5wdXQKK251bWJlcmVkIDUgYXMgcmVmZXJyaW5nIHRvIFMtVklERU8uCisKK0ZvciB0aGUgRWFzeUNBUCB3aXRoIGZvdXIgQ1ZCUyBpbnB1dHMgdGhlIGRyaXZlciBleHBlY3RzIHRvIGJlIGFza2VkIGZvcgorYW55IG9uZSBvZiBpbnB1dHMgbnVtYmVyZWQgMSwyLDMsNC4gIElmIGlucHV0IDAgaXMgYXNrZWQgZm9yLCBpdCBpcworaW50ZXJwcmV0ZWQgYXMgaW5wdXQgMS4KKworCitNT0RVTEUgUEFSQU1FVEVSUworLS0tLS0tLS0tLS0tLS0tLS0KKworVGhyZWUgbW9kdWxlIHBhcmFtZXRlcnMgYXJlIGRlZmluZWQ6CisKK2RlYnVnICAgICAgdGhlIGVhc3ljYXAgbW9kdWxlIGlzIGNvbmZpZ3VyZWQgYXQgZGlhZ25vc3RpYyBsZXZlbCBuICgwIHRvIDkpCitnYWluICAgICAgIGF1ZGlvIGdhaW4gbGV2ZWwgbiAoMCB0byAzMSwgZGVmYXVsdCBpcyAxNikKK2JhcnMgICAgICAgMCA9PiAgdGVzdGNhcmQgYmFycyB3aGVuIGluY29taW5nIHZpZGVvIHNpZ25hbCBpcyBsb3N0CisgICAgICAgICAgIDEgPT4gIHRlc3RjYXJkIGJhcnMgd2hlbiBpbmNvbWluZyB2aWRlbyBzaWduYWwgaXMgbG9zdCAoZGVmYXVsdCkKIAogCiBTVVBQT1JURUQgVFYgU1RBTkRBUkRTIEFORCBSRVNPTFVUSU9OUwpAQCAtODIsMTggKzk4LDI5IEBACiAgICAgUEFMXzYwLCAgICAgICBOVFNDXzQ0MywKICAgICBQQUxfTS4KIAorSW4gYWRkaXRpb24sIHRoZSBkcml2ZXIgb2ZmZXJzICJjdXN0b20iIHBzZXVkby1zdGFuZGFyZHMgd2l0aCBhIGZyYW1lcmF0ZQord2hpY2ggaXMgMjAlIG9mIHRoZSB1c3VhbCBmcmFtZXJhdGUuICBUaGVzZSBwc2V1ZG8tc3RhbmRhcmRzIGFyZSBuYW1lZDoKKworICAgIFBBTF9CR0hJTl9TTE9XLCAgICBOVFNDX05fNDQzX1NMT1csCisgICAgUEFMX05jX1NMT1csICAgICAgIE5UU0NfTl9TTE9XLAorICAgIFNFQ0FNX1NMT1csICAgICAgICBOVFNDX01fU0xPVywgICAgICAgIE5UU0NfTV9KUF9TTE9XLAorICAgIFBBTF82MF9TTE9XLCAgICAgICBOVFNDXzQ0M19TTE9XLAorICAgIFBBTF9NX1NMT1cuCisKKwogVGhlIGF2YWlsYWJsZSBwaWN0dXJlIHNpemVzIGFyZToKIAogICAgICBhdCAyNSBmcmFtZXMgcGVyIHNlY29uZDogICA3MjB4NTc2LCA3MDR4NTc2LCA2NDB4NDgwLCAzNjB4Mjg4LCAzMjB4MjQwOwotICAgICBhdCAzMCBmcmFtZXMgcGVyIHNlY29uZDogICA3MjB4NDgwLCA2NDB4NDgwLCAzNjB4MjQwLCAzMjB4MjQwOworICAgICBhdCAzMCBmcmFtZXMgcGVyIHNlY29uZDogICA3MjB4NDgwLCA2NDB4NDgwLCAzNjB4MjQwLCAzMjB4MjQwLgogCiAKIFdIQVQnUyBURVNURUQgQU5EIFdIQVQnUyBOT1QKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotVGhpcyBkcml2ZXIgaXMga25vd24gdG8gd29yayB3aXRoIG1wbGF5ZXIsIG1lbmNvZGVyLCB0dnRpbWUgYW5kIHN1ZmZpY2llbnRseQotcmVjZW50IHZlcnNpb25zIG9mIHZsYy4gIEFuIGludGVyZmFjZSB0byBmZm1wZWcgaXMgaW1wbGVtZW50ZWQsIGJ1dCBzZXJpb3VzCi1hdWRpby12aWRlbyBzeW5jaHJvbml6YXRpb24gcHJvYmxlbXMgcmVtYWluLgorVGhpcyBkcml2ZXIgaXMga25vd24gdG8gd29yayB3aXRoIG1wbGF5ZXIsIG1lbmNvZGVyLCB0dnRpbWUsIHpvbmVtaW5kZXIsCit4YXd0diwgZ3N0cmVhbWVyIGFuZCBzdWZmaWNpZW50bHkgcmVjZW50IHZlcnNpb25zIG9mIHZsYy4gIEFuIGludGVyZmFjZQordG8gZmZtcGVnIGlzIGltcGxlbWVudGVkLCBidXQgc2VyaW91cyBhdWRpby12aWRlbyBzeW5jaHJvbml6YXRpb24gcHJvYmxlbXMKK3JlbWFpbi4KIAogVGhlIGRyaXZlciBpcyBkZXNpZ25lZCB0byBzdXBwb3J0IGFsbCB0aGUgVFYgc3RhbmRhcmRzIGFjY2VwdGVkIGJ5IHRoZQogaGFyZHdhcmUsIGJ1dCBhcyB5ZXQgaXQgaGFzIGFjdHVhbGx5IGJlZW4gdGVzdGVkIG9uIG9ubHkgYSBmZXcgb2YgdGhlc2UuCkBAIC0xMDEsMTAgKzEyOCw3IEBACiBJIGhhdmUgYmVlbiB1bmFibGUgdG8gdGVzdCBhbmQgY2FsaWJyYXRlIHRoZSBTLXZpZGVvIGlucHV0IG15c2VsZiBiZWNhdXNlIEkKIGRvIG5vdCBwb3NzZXNzIGFueSBlcXVpcG1lbnQgd2l0aCBTLXZpZGVvIG91dHB1dC4KIAotVGhpcyBkcml2ZXIgZG9lcyBub3QgdW5kZXJzdGFuZCB0aGUgVjRMMSBJT0NUTCBjb21tYW5kcywgc28gcHJvZ3JhbXMgc3VjaAotYXMgY2Ftb3JhbWEgYXJlIG5vdCBjb21wYXRpYmxlLiAgVGhlcmUgYXJlIHJlcG9ydHMgdGhhdCB0aGUgZHJpdmVyIGRvZXMKLXdvcmsgd2l0aCBzdWZmaWNpZW50bHkgcmVjZW50IChWNEwyKSB2ZXJzaW9ucyBvZiB6b25lbWluZGVyLCBidXQgSSBoYXZlIG5vdAotYXR0ZW1wdGVkIHRvIGNvbmZpcm0gdGhpcyBteXNlbGYuCitUaGlzIGRyaXZlciBkb2VzIG5vdCB1bmRlcnN0YW5kIHRoZSBWNEwxIElPQ1RMIGNvbW1hbmRzLgogCiAKIFVERVYgUlVMRVMKQEAgLTEyMCw2ICsxNDQsMTcgQEAKIExBQkVMPSJlYXN5Y2FwX3J1bGVzX2VuZCIKIAogCitNT0RQUk9CRSBDT05GSUdVUkFUSU9OCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBlYXN5Y2FwIG1vZHVsZSBpcyBpbiBjb21wZXRpdGlvbiB3aXRoIHRoZSBtb2R1bGUgc25kLXVzYi1hdWRpbyBmb3IgdGhlCitFYXN5Q0FQJ3MgYXVkaW8gY2hhbm5lbCwgYW5kIGl0cyBpbnN0YWxsYXRpb24gY2FuIGJlIGFpZGVkIGJ5IHByb3ZpZGluZyBhCitmaWxlIGluIGRpcmVjdG9yeSAvZXRjL21vZHByb2JlLmQgd2l0aCBjb250ZW50OgorCitvcHRpb25zIGVhc3ljYXAgIGdhaW49MTYgYmFycz0xCitpbnN0YWxsIGVhc3ljYXAgL3NiaW4vcm1tb2Qgc25kLXVzYi1hdWRpbzsgL3NiaW4vbW9kcHJvYmUgLS1pZ25vcmUtaW5zdGFsbCBlYXN5Y2FwCisKKwogQUNLTk9XTEVHRU1FTlRTIEFORCBSRUZFUkVOQ0VTCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFRoaXMgZHJpdmVyIG1ha2VzIHVzZSBvZiBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gdGhlIFN5bnRlayBTZW1pY29uIERDLTExMjUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXAuaAppbmRleCA4ODQyNjNiLi44ZWJmOTZmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXAuaApAQCAtMzMsNiArMzMsNyBAQAogICogICAgICAgICAgICAgICAgRUFTWUNBUF9ORUVEU19VU0JWSURFT19ICiAgKiAgICAgICAgICAgICAgICBFQVNZQ0FQX05FRURTX1Y0TDJfREVWSUNFX0gKICAqICAgICAgICAgICAgICAgIEVBU1lDQVBfTkVFRFNfVjRMMl9GT1BTCisgKiAgICAgICAgICAgICAgICBFQVNZQ0FQX05FRURTX1VOTE9DS0VEX0lPQ1RMCiAgKgogICogIElGIFJFUVVJUkVEIFRIRVkgTVVTVCBCRSBFWFRFUk5BTExZIERFRklORUQsIEZPUiBFWEFNUExFIEFTIENPTVBJTEVSCiAgKiAgT1BUSU9OUy4KQEAgLTQyLDM1ICs0MywyNCBAQAogI2lmICghZGVmaW5lZChFQVNZQ0FQX0gpKQogI2RlZmluZSBFQVNZQ0FQX0gKIAotI2lmIGRlZmluZWQoRUFTWUNBUF9ERUJVRykKLSNpZiAoOSA8IEVBU1lDQVBfREVCVUcpCi0jZXJyb3IgRGVidWcgbGV2ZWxzIDAgdG8gOSBhcmUgb2theS5cCi0gIFRvIGFjaGlldmUgaGlnaGVyIGxldmVscywgcmVtb3ZlIHRoaXMgdHJhcCBtYW51YWxseSBmcm9tIGVhc3ljYXAuaAotI2VuZGlmCi0jZW5kaWYgLypFQVNZQ0FQX0RFQlVHKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgVEhFU0UgQVJFIE5PUk1BTExZIERFRklORUQKKyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSAgUEFUSUVOQ0UgIDUwMAorI3VuZGVmICAgUFJFRkVSX05UU0MKKyNkZWZpbmUgIFBFUlNFVkVSRQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKICAqICBUSEVTRSBBUkUgRk9SIE1BSU5URU5BTkNFIE9OTFkgLSBOT1JNQUxMWSBVTkRFRklORUQ6CiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSN1bmRlZiAgUFJFRkVSX05UU0MKICN1bmRlZiAgRUFTWUNBUF9URVNUQ0FSRAogI3VuZGVmICBFQVNZQ0FQX1RFU1RUT05FCi0jdW5kZWYgIExPQ0tGUkFNRQogI3VuZGVmICBOT1JFQURCQUNLCiAjdW5kZWYgIEFVRElPVElNRQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoKLSAqCi0gKiAgREVGSU5FICAgQlJJREdFUiAgIFRPIEFDVElWQVRFIFRIRSBST1VUSU5FIEZPUiBCUklER0lORyBWSURFT1RBUEUgRFJPUE9VVFMuCi0gKgotICogICAgICAgICAgICAgKioqIFVOREVSIERFVkVMT1BNRU5UL1RFU1RJTkcgLSBOT1QgUkVBRFkgWUVUISoqKgotICoKLSAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI3VuZGVmICBCUklER0VSCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTkyLDI1ICs4MiwxNCBAQAogCiAvKnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2Ki8KICNpZiBkZWZpbmVkKEVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKQotI2lmICghZGVmaW5lZChfX09MRF9WSURJT0NfKSkKLSNkZWZpbmUgX19PTERfVklESU9DXwotI2VuZGlmIC8qICFkZWZpbmVkKF9fT0xEX1ZJRElPQ18pICovCi0KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldi5oPgotCiAjaWYgZGVmaW5lZChFQVNZQ0FQX05FRURTX1Y0TDJfREVWSUNFX0gpCiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KICNlbmRpZiAvKkVBU1lDQVBfTkVFRFNfVjRMMl9ERVZJQ0VfSCovCiAjZW5kaWYgLypFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVCovCiAvKl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eKi8KLQotI2lmICghZGVmaW5lZChfX09MRF9WSURJT0NfKSkKLSNkZWZpbmUgX19PTERfVklESU9DXwotI2VuZGlmIC8qICFkZWZpbmVkKF9fT0xEX1ZJRElPQ18pICovCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+Ci0KICNpbmNsdWRlIDxsaW51eC9zb3VuZGNhcmQuaD4KLQogI2lmIGRlZmluZWQoRUFTWUNBUF9ORUVEU19VU0JWSURFT19IKQogI2luY2x1ZGUgPGNvbmZpZy92aWRlby91c2J2aWRlby5oPgogI2VuZGlmIC8qRUFTWUNBUF9ORUVEU19VU0JWSURFT19IKi8KQEAgLTEyMSw3ICsxMDAsNiBAQAogCiAjZGVmaW5lIFNUUklOR0laRV9BR0FJTih4KSAjeAogI2RlZmluZSBTVFJJTkdJWkUoeCkgU1RSSU5HSVpFX0FHQUlOKHgpCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qICBWRU5ET1IsIFBST0RVQ1Q6ICBTeW50ZWsgU2VtaWNvbmR1Y3RvciBDby4sIEx0ZAogICoKQEAgLTEzNSwxMiArMTEzLDEyIEBACiAjZGVmaW5lIFVTQl9FQVNZQ0FQX1ZFTkRPUl9JRAkweDA1ZTEKICNkZWZpbmUgVVNCX0VBU1lDQVBfUFJPRFVDVF9JRAkweDA0MDgKIAotI2RlZmluZSBFQVNZQ0FQX0RSSVZFUl9WRVJTSU9OICIwLjguMjEiCisjZGVmaW5lIEVBU1lDQVBfRFJJVkVSX1ZFUlNJT04gIjAuOC40MSIKICNkZWZpbmUgRUFTWUNBUF9EUklWRVJfREVTQ1JJUFRJT04gImVhc3ljYXBkYzYwIgogCiAjZGVmaW5lIFVTQl9TS0VMX01JTk9SX0JBU0UgICAgIDE5MgotI2RlZmluZSBWSURFT19ERVZJQ0VfTUFOWSA4Ci0KKyNkZWZpbmUgRE9OR0xFX01BTlkgOAorI2RlZmluZSBJTlBVVF9NQU5ZIDYKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qCiAgKiAgREVGQVVMVCBMVU1JTkFOQ0UsIENPTlRSQVNULCBTQVRVUkFUSU9OIEFORCBIVUUKQEAgLTE2NCw2ICsxNDIsOCBAQAogI2lmIChVU0JfMl8wX01BWFBBQ0tFVFNJWkUgPiBQQUdFX1NJWkUpCiAjZXJyb3IgdmlkZW9faXNvY19idWZmZXJbLl0gd2lsbCBub3QgYmUgYmlnIGVub3VnaAogI2VuZGlmCisjZGVmaW5lIFZJREVPX0pVTktfVE9MRVJBVEUgVklERU9fSVNPQ19CVUZGRVJfTUFOWQorI2RlZmluZSBWSURFT19MT1NUX1RPTEVSQVRFIDUwCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgogICogIFZJREVPIEJVRkZFUlMKQEAgLTIxMCw3ICsxOTAsMTcgQEAKICNkZWZpbmUgIE5UU0NfTV9KUCAgICAgIDUKICNkZWZpbmUgIFBBTF82MCAgICAgICAgIDcKICNkZWZpbmUgIFBBTF9NICAgICAgICAgIDkKLSNkZWZpbmUgIFNUQU5EQVJEX01BTlkgMTAKKyNkZWZpbmUgIFBBTF9CR0hJTl9TTE9XICAgIDEwCisjZGVmaW5lICBQQUxfTmNfU0xPVyAgICAgICAxMgorI2RlZmluZSAgU0VDQU1fU0xPVyAgICAgICAgMTQKKyNkZWZpbmUgIE5UU0NfTl9TTE9XICAgICAgIDE2CisjZGVmaW5lICBOVFNDX05fNDQzX1NMT1cgICAxOAorI2RlZmluZSAgTlRTQ19NX1NMT1cgICAgICAgMTEKKyNkZWZpbmUgIE5UU0NfNDQzX1NMT1cgICAgIDEzCisjZGVmaW5lICBOVFNDX01fSlBfU0xPVyAgICAxNQorI2RlZmluZSAgUEFMXzYwX1NMT1cgICAgICAgMTcKKyNkZWZpbmUgIFBBTF9NX1NMT1cgICAgICAgIDE5CisjZGVmaW5lICBTVEFOREFSRF9NQU5ZIDIwCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgogICogIEVOVU1TCkBAIC0yMzgsNyArMjI4LDYgQEAKIGVudW0gewogRklFTERfTk9ORSwKIEZJRUxEX0lOVEVSTEFDRUQsCi1GSUVMRF9BTFRFUk5BVEUsCiBJTlRFUkxBQ0VfTUFOWQogfTsKICNkZWZpbmUgU0VUVElOR1NfTUFOWQkoU1RBTkRBUkRfTUFOWSAqIFwKQEAgLTI1MSwxMSArMjQwLDE4IEBACiAgKiAgU1RSVUNUVVJFIERFRklOSVRJT05TCiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0cnVjdCBlYXN5Y2FwX2RvbmdsZSB7CitzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXA7CitzdHJ1Y3QgbXV0ZXggbXV0ZXhfdmlkZW87CitzdHJ1Y3QgbXV0ZXggbXV0ZXhfYXVkaW87Cit9OworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RydWN0IGRhdGFfYnVmZmVyIHsKIHN0cnVjdCBsaXN0X2hlYWQgbGlzdF9oZWFkOwogdm9pZCAqcGdvOwogdm9pZCAqcHRvOwogX191MTYga291bnQ7CitfX3UxNiBpbnB1dDsKIH07CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBzdHJ1Y3QgZGF0YV91cmIgewpAQCAtMjc0LDYgKzI3MCwyMiBAQAogY2hhciBuYW1lWzEyOF07CiBzdHJ1Y3QgdjRsMl9mb3JtYXQgdjRsMl9mb3JtYXQ7CiB9Oworc3RydWN0IGlucHV0c2V0IHsKK2ludCBpbnB1dDsKK2ludCBpbnB1dF9vazsKK2ludCBzdGFuZGFyZF9vZmZzZXQ7CitpbnQgc3RhbmRhcmRfb2Zmc2V0X29rOworaW50IGZvcm1hdF9vZmZzZXQ7CitpbnQgZm9ybWF0X29mZnNldF9vazsKK2ludCBicmlnaHRuZXNzOworaW50IGJyaWdodG5lc3Nfb2s7CitpbnQgY29udHJhc3Q7CitpbnQgY29udHJhc3Rfb2s7CitpbnQgc2F0dXJhdGlvbjsKK2ludCBzYXR1cmF0aW9uX29rOworaW50IGh1ZTsKK2ludCBodWVfb2s7Cit9OwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKICAqICAgZWFzeWNhcC5pbGsgPT0gMCAgID0+ICBDVkJTK1MtVklERU8gSEFSRFdBUkUsIEFVRElPIHdNYXhQYWNrZXRTaXplPTI1NgpAQCAtMjgyLDYgKzI5NCwxOSBAQAogICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBzdHJ1Y3QgZWFzeWNhcCB7CisjZGVmaW5lIFRFTExUQUxFICJleHBlY3RlZHN0cmluZyIKK2NoYXIgdGVsbHRhbGVbMTZdOworaW50IGlzZG9uZ2xlOworCisvKnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2diovCisjaWYgZGVmaW5lZChFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVCkKK3N0cnVjdCB2aWRlb19kZXZpY2UgdmlkZW9fZGV2aWNlOworI2lmIGRlZmluZWQoRUFTWUNBUF9ORUVEU19WNEwyX0RFVklDRV9IKQorc3RydWN0IHY0bDJfZGV2aWNlIHY0bDJfZGV2aWNlOworI2VuZGlmIC8qRUFTWUNBUF9ORUVEU19WNEwyX0RFVklDRV9IKi8KKyNlbmRpZiAvKkVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKi8KKy8qXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eKi8KK2ludCBzdGF0dXM7CiB1bnNpZ25lZCBpbnQgYXVkaW9fcGFnZXNfcGVyX2ZyYWdtZW50OwogdW5zaWduZWQgaW50IGF1ZGlvX2J5dGVzX3Blcl9mcmFnbWVudDsKIHVuc2lnbmVkIGludCBhdWRpb19idWZmZXJfcGFnZV9tYW55OwpAQCAtMjkxLDI2ICszMTYsMTQgQEAKIF9fczE2IG9sZGF1ZGlvOwogI2VuZGlmIC8qVVBTQU1QTEUqLwogCi1zdHJ1Y3QgZWFzeWNhcF9mb3JtYXQgZWFzeWNhcF9mb3JtYXRbMSArIFNFVFRJTkdTX01BTlldOwotCiBpbnQgaWxrOwogYm9vbCBtaWNyb3Bob25lOwogCi0vKnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2Ki8KLSNpZiBkZWZpbmVkKEVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKQotc3RydWN0IHZpZGVvX2RldmljZSAqcHZpZGVvX2RldmljZTsKLSNlbmRpZiAvKkVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKi8KLS8qXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4qLwotCiBzdHJ1Y3QgdXNiX2RldmljZSAqcHVzYl9kZXZpY2U7CiBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqcHVzYl9pbnRlcmZhY2U7CiAKIHN0cnVjdCBrcmVmIGtyZWY7CiAKLXN0cnVjdCBtdXRleCBtdXRleF9tbWFwX3ZpZGVvW0ZSQU1FX0JVRkZFUl9NQU5ZXTsKLXN0cnVjdCBtdXRleCBtdXRleF90aW1ldmFsMDsKLXN0cnVjdCBtdXRleCBtdXRleF90aW1ldmFsMTsKLQogaW50IHF1ZXVlZFtGUkFNRV9CVUZGRVJfTUFOWV07CiBpbnQgZG9uZVtGUkFNRV9CVUZGRVJfTUFOWV07CiAKQEAgLTMyMSwxNiArMzM0LDI0IEBACiBpbnQgcG9sbGVkOwogaW50IHN0YW5kYXJkX29mZnNldDsKIGludCBmb3JtYXRfb2Zmc2V0Oworc3RydWN0IGlucHV0c2V0IGlucHV0c2V0W0lOUFVUX01BTlldOwogCitib29sIG50c2M7CiBpbnQgZnBzOwogaW50IHVzZWM7CiBpbnQgdG9sZXJhdGU7CitpbnQgc2tpcDsKK2ludCBza2lwcGVkOworaW50IGxvc3RbSU5QVVRfTUFOWV07CiBpbnQgbWVyaXRbMTgwXTsKIAogc3RydWN0IHRpbWV2YWwgdGltZXZhbDA7CiBzdHJ1Y3QgdGltZXZhbCB0aW1ldmFsMTsKIHN0cnVjdCB0aW1ldmFsIHRpbWV2YWwyOworc3RydWN0IHRpbWV2YWwgdGltZXZhbDM7CitzdHJ1Y3QgdGltZXZhbCB0aW1ldmFsNjsKIHN0cnVjdCB0aW1ldmFsIHRpbWV2YWw3Oworc3RydWN0IHRpbWV2YWwgdGltZXZhbDg7CiBsb25nIGxvbmcgaW50IGRuYnlkdDsKIAogaW50ICAgIHZpZGVvX2ludGVyZmFjZTsKQEAgLTM0Nyw4ICszNjgsNiBAQAogaW50ICAgIHZpZGVvX2VvZjsKIGludCAgICB2aWRlb19qdW5rOwogCi1pbnQgICAgZnVkZ2U7Ci0KIHN0cnVjdCBkYXRhX2J1ZmZlciB2aWRlb19pc29jX2J1ZmZlcltWSURFT19JU09DX0JVRkZFUl9NQU5ZXTsKIHN0cnVjdCBkYXRhX2J1ZmZlciBcCiAJICAgICBmaWVsZF9idWZmZXJbRklFTERfQlVGRkVSX01BTlldWyhGSUVMRF9CVUZGRVJfU0laRS9QQUdFX1NJWkUpXTsKQEAgLTM1OCw2ICszNzcsMTMgQEAKIHN0cnVjdCBsaXN0X2hlYWQgdXJiX3ZpZGVvX2hlYWQ7CiBzdHJ1Y3QgbGlzdF9oZWFkICpwdXJiX3ZpZGVvX2hlYWQ7CiAKK19fdTggY2FjaGVbOF07CitfX3U4ICpwY2FjaGU7CitpbnQgdmlkZW9fbXQ7CitpbnQgYXVkaW9fbXQ7Citsb25nIGxvbmcgYXVkaW9fYnl0ZXM7CitfX3UzMiBpc2VxdWVuY2U7CisKIGludCB2bWFfbWFueTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMzgzLDcgKzQwOSw2IEBACiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIF9fdTMyICAgICAgICAgICAgICAgICAgIHBpeGVsZm9ybWF0OwotX191MzIgICAgICAgICAgICAgICAgICAgZmllbGQ7CiBpbnQgICAgICAgICAgICAgICAgICAgICB3aWR0aDsKIGludCAgICAgICAgICAgICAgICAgICAgIGhlaWdodDsKIGludCAgICAgICAgICAgICAgICAgICAgIGJ5dGVzcGVycGl4ZWw7CkBAIC00NjMsOCArNDg4LDEwIEBACiB2b2lkICAgICAgICAgICAgIGVhc3ljYXBfY29tcGxldGUoc3RydWN0IHVyYiAqKTsKIGludCAgICAgICAgICAgICAgZWFzeWNhcF9vcGVuKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKIGludCAgICAgICAgICAgICAgZWFzeWNhcF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKLWxvbmcgICAgICAgICAgICAgZWFzeWNhcF9pb2N0bChzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsICB1bnNpZ25lZCBsb25nKTsKLQorbG9uZyAgICAgICAgICAgICBlYXN5Y2FwX2lvY3RsX25vaW5vZGUoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LCBcCisJCQkJCQkJCXVuc2lnbmVkIGxvbmcpOworaW50ICAgICAgICAgICAgICBlYXN5Y2FwX2lvY3RsKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIFwKKwkJCQkJCQkJdW5zaWduZWQgbG9uZyk7CiAvKnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2Ki8KICNpZiBkZWZpbmVkKEVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKQogaW50ICAgICAgICAgICAgICBlYXN5Y2FwX29wZW5fbm9pbm9kZShzdHJ1Y3QgZmlsZSAqKTsKQEAgLTQ4OSwxMiArNTE2LDEwIEBACiBpbnQgICAgICAgICAgICAgIGZpZWxkMmZyYW1lKHN0cnVjdCBlYXN5Y2FwICopOwogaW50ICAgICAgICAgICAgICByZWRhdWIoc3RydWN0IGVhc3ljYXAgKiwgdm9pZCAqLCB2b2lkICosIFwKIAkJCQkJCWludCwgaW50LCBfX3U4LCBfX3U4LCBib29sKTsKLXZvaWQgICAgICAgICAgICAgZGVicmllZihzdHJ1Y3QgZWFzeWNhcCAqKTsKLXZvaWQgICAgICAgICAgICAgc2F5cmVhZG9ubHkoc3RydWN0IGVhc3ljYXAgKik7CiB2b2lkICAgICAgICAgICAgIGVhc3ljYXBfdGVzdGNhcmQoc3RydWN0IGVhc3ljYXAgKiwgaW50KTsKLWludCAgICAgICAgICAgICAgZXhwbGFpbl9pb2N0bChfX3UzMik7Ci1pbnQgICAgICAgICAgICAgIGV4cGxhaW5fY2lkKF9fdTMyKTsKIGludCAgICAgICAgICAgICAgZmlsbGluX2Zvcm1hdHModm9pZCk7CitpbnQgICAgICAgICAgICAgIHJlc2V0KHN0cnVjdCBlYXN5Y2FwICopOworaW50ICAgICAgICAgICAgICBuZXdpbnB1dChzdHJ1Y3QgZWFzeWNhcCAqLCBpbnQpOwogaW50ICAgICAgICAgICAgICBhZGp1c3Rfc3RhbmRhcmQoc3RydWN0IGVhc3ljYXAgKiwgdjRsMl9zdGRfaWQpOwogaW50ICAgICAgICAgICAgICBhZGp1c3RfZm9ybWF0KHN0cnVjdCBlYXN5Y2FwICosIF9fdTMyLCBfX3UzMiwgX191MzIsIFwKIAkJCQkJCQkJaW50LCBib29sKTsKQEAgLTUxMiw3ICs1MzcsMTAgQEAKIHNzaXplX3QgICAgICAgICAgZWFzeXNuZF9yZWFkKHN0cnVjdCBmaWxlICosIGNoYXIgX191c2VyICosIHNpemVfdCwgbG9mZl90ICopOwogaW50ICAgICAgICAgICAgICBlYXN5c25kX29wZW4oc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOwogaW50ICAgICAgICAgICAgICBlYXN5c25kX3JlbGVhc2Uoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOwotbG9uZyAgICAgICAgICAgICBlYXN5c25kX2lvY3RsKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgIHVuc2lnbmVkIGxvbmcpOworbG9uZyAgICAgICAgICAgICBlYXN5c25kX2lvY3RsX25vaW5vZGUoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LCBcCisJCQkJCQkJCXVuc2lnbmVkIGxvbmcpOworaW50ICAgICAgICAgICAgICBlYXN5c25kX2lvY3RsKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIFwKKwkJCQkJCQkJdW5zaWduZWQgbG9uZyk7CiB1bnNpZ25lZCBpbnQgICAgIGVhc3lzbmRfcG9sbChzdHJ1Y3QgZmlsZSAqLCBwb2xsX3RhYmxlICopOwogdm9pZCAgICAgICAgICAgICBlYXN5c25kX2RlbGV0ZShzdHJ1Y3Qga3JlZiAqKTsKIGludCAgICAgICAgICAgICAgc3VibWl0X2F1ZGlvX3VyYnMoc3RydWN0IGVhc3ljYXAgKik7CkBAIC01MzIsMTEgKzU2MCwxMSBAQAogaW50ICAgICAgICAgICAgICBjb25maXJtX3Jlc29sdXRpb24oc3RydWN0IHVzYl9kZXZpY2UgKik7CiBpbnQgICAgICAgICAgICAgIGNvbmZpcm1fc3RyZWFtKHN0cnVjdCB1c2JfZGV2aWNlICopOwogCi1pbnQgICAgICAgICAgICAgIHNldHVwX3N0ayhzdHJ1Y3QgdXNiX2RldmljZSAqKTsKLWludCAgICAgICAgICAgICAgc2V0dXBfc2FhKHN0cnVjdCB1c2JfZGV2aWNlICopOworaW50ICAgICAgICAgICAgICBzZXR1cF9zdGsoc3RydWN0IHVzYl9kZXZpY2UgKiwgYm9vbCk7CitpbnQgICAgICAgICAgICAgIHNldHVwX3NhYShzdHJ1Y3QgdXNiX2RldmljZSAqLCBib29sKTsKIGludCAgICAgICAgICAgICAgc2V0dXBfdnQoc3RydWN0IHVzYl9kZXZpY2UgKik7Ci1pbnQgICAgICAgICAgICAgIGNoZWNrX3N0ayhzdHJ1Y3QgdXNiX2RldmljZSAqKTsKLWludCAgICAgICAgICAgICAgY2hlY2tfc2FhKHN0cnVjdCB1c2JfZGV2aWNlICopOworaW50ICAgICAgICAgICAgICBjaGVja19zdGsoc3RydWN0IHVzYl9kZXZpY2UgKiwgYm9vbCk7CitpbnQgICAgICAgICAgICAgIGNoZWNrX3NhYShzdHJ1Y3QgdXNiX2RldmljZSAqLCBib29sKTsKIGludCAgICAgICAgICAgICAgcmVhZHlfc2FhKHN0cnVjdCB1c2JfZGV2aWNlICopOwogaW50ICAgICAgICAgICAgICBtZXJpdF9zYWEoc3RydWN0IHVzYl9kZXZpY2UgKik7CiBpbnQgICAgICAgICAgICAgIGNoZWNrX3Z0KHN0cnVjdCB1c2JfZGV2aWNlICopOwpAQCAtNTU0LDEyICs1ODIsOSBAQAogaW50ICAgICAgICAgICAgICB3cml0ZV8zMDAoc3RydWN0IHVzYl9kZXZpY2UgKik7CiBpbnQgICAgICAgICAgICAgIHJlYWRfdnQoc3RydWN0IHVzYl9kZXZpY2UgKiwgX191MTYpOwogaW50ICAgICAgICAgICAgICB3cml0ZV92dChzdHJ1Y3QgdXNiX2RldmljZSAqLCBfX3UxNiwgX191MTYpOwotCi1pbnQgICAgICAgICAgICAgIHNldDJ0bzc4KHN0cnVjdCB1c2JfZGV2aWNlICopOwotaW50ICAgICAgICAgICAgICBzZXQydG85MyhzdHJ1Y3QgdXNiX2RldmljZSAqKTsKLQogaW50ICAgICAgICAgICAgICByZWdzZXQoc3RydWN0IHVzYl9kZXZpY2UgKiwgX191MTYsIF9fdTE2KTsKIGludCAgICAgICAgICAgICAgcmVnZ2V0KHN0cnVjdCB1c2JfZGV2aWNlICosIF9fdTE2LCB2b2lkICopOworaW50CQlpc2RvbmdsZShzdHJ1Y3QgZWFzeWNhcCAqKTsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHN0cnVjdCBzaWduZWRfZGl2X3Jlc3VsdCB7CiBsb25nIGxvbmcgaW50IHF1b3RpZW50OwpAQCAtNTg3LDI0ICs2MTIsNDEgQEAKIAl9IFwKIH0gd2hpbGUgKDApCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KKy8qCisgKiAgTUFDUk9TIFNBTSguLi4pIEFORCBKT00oLi4uKSBBTExPVyBESUFHTk9TVElDIE9VVFBVVCBUTyBCRSBUQUdHRUQgV0lUSAorICogIFRIRSBJREVOVElUWSBPRiBUSEUgRE9OR0xFIFRPIFdISUNIIElUIEFQUExJRVMsIEJVVCBJRiBJTlZPS0VEIFdIRU4gVEhFCisgKiAgUE9JTlRFUiBwZWFzeWNhcCBJUyBJTlZBTElEIEFOIE9vcHMgSVMgTElLRUxZLCBBTkQgSVRTIENBVVNFIE1BWSBOT1QgQkUKKyAqICBJTU1FRElBVEVMWSBPQlZJT1VTIEZST00gQSBDQVNVQUwgUkVBRElORyBPRiBUSEUgU09VUkNFIENPREUuICBCRVdBUkUuCisqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI2RlZmluZSBTQVkoZm9ybWF0LCBhcmdzLi4uKSBkbyB7IFwKLQlwcmludGsoS0VSTl9ERUJVRyAiZWFzeWNhcDogJXM6ICIgZm9ybWF0LCBfX2Z1bmNfXywgIyNhcmdzKTsgXAorCXByaW50ayhLRVJOX0RFQlVHICJlYXN5Y2FwOjogJXM6ICIgXAorCQkJZm9ybWF0LCBfX2Z1bmNfXywgIyNhcmdzKTsgXAogfSB3aGlsZSAoMCkKLQorI2RlZmluZSBTQU0oZm9ybWF0LCBhcmdzLi4uKSBkbyB7IFwKKwlwcmludGsoS0VSTl9ERUJVRyAiZWFzeWNhcDo6JWklczogIiBcCisJCQlmb3JtYXQsIHBlYXN5Y2FwLT5pc2RvbmdsZSwgX19mdW5jX18sICMjYXJncyk7XAorfSB3aGlsZSAoMCkKIAogI2lmIGRlZmluZWQoRUFTWUNBUF9ERUJVRykKICNkZWZpbmUgSk9UKG4sIGZvcm1hdCwgYXJncy4uLikgZG8geyBcCiAJaWYgKG4gPD0gZWFzeWNhcF9kZWJ1ZykgeyBcCi0JCXByaW50ayhLRVJOX0RFQlVHICJlYXN5Y2FwOiAlczogIiBmb3JtYXQsIF9fZnVuY19fLCAjI2FyZ3MpOyBcCisJCXByaW50ayhLRVJOX0RFQlVHICJlYXN5Y2FwOjogJXM6ICIgXAorCQkJZm9ybWF0LCBfX2Z1bmNfXywgIyNhcmdzKTtcCiAJfSBcCiB9IHdoaWxlICgwKQorI2RlZmluZSBKT00obiwgZm9ybWF0LCBhcmdzLi4uKSBkbyB7IFwKKwlpZiAobiA8PSBlYXN5Y2FwX2RlYnVnKSB7IFwKKwkJcHJpbnRrKEtFUk5fREVCVUcgImVhc3ljYXA6OiVpJXM6ICIgXAorCQkJZm9ybWF0LCBwZWFzeWNhcC0+aXNkb25nbGUsIF9fZnVuY19fLCAjI2FyZ3MpO1wKKwl9IFwKK30gd2hpbGUgKDApCisKICNlbHNlCiAjZGVmaW5lIEpPVChuLCBmb3JtYXQsIGFyZ3MuLi4pIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBKT00obiwgZm9ybWF0LCBhcmdzLi4uKSBkbyB7fSB3aGlsZSAoMCkKICNlbmRpZiAvKkVBU1lDQVBfREVCVUcqLwogCi0jZGVmaW5lIFBPVVQgSk9UKDgsICI6LShpbiBmaWxlICVzIGxpbmUgJTRpXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pCi0KICNkZWZpbmUgTUlDUk9TRUNPTkRTKFgsIFkpIFwKIAkJCSgoMTAwMDAwMCooKGxvbmcgbG9uZyBpbnQpKFgudHZfc2VjIC0gWS50dl9zZWMpKSkgKyBcCiAJCQkJCShsb25nIGxvbmcgaW50KShYLnR2X3VzZWMgLSBZLnR2X3VzZWMpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF9kZWJ1Zy5oIGIvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF9kZWJ1Zy5oCmluZGV4IDFkMTBkN2UuLmI2YjU3MTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfZGVidWcuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX2RlYnVnLmgKQEAgLTI1LDMgKzI1LDUgQEAKICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBleHRlcm4gaW50IGVhc3ljYXBfZGVidWc7CitleHRlcm4gaW50IGVhc3ljYXBfZ2FpbjsKK2V4dGVybiBzdHJ1Y3QgZWFzeWNhcF9kb25nbGUgZWFzeWNhcF9kb25nbGVbXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfaW9jdGwuYyBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfaW9jdGwuYwppbmRleCA5YTQyYWUwLi40NDc5NTNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX2lvY3RsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF9pb2N0bC5jCkBAIC0zNiw1MyArMzYsMTAxIEBACiAgKiAgVU5MRVNTIFRIRVJFIElTIEEgUFJFTUFUVVJFIEVSUk9SIFJFVFVSTiBUSElTIFJPVVRJTkUgVVBEQVRFUyBUSEUKICAqICBGT0xMT1dJTkc6CiAgKiAgICAgICAgICBwZWFzeWNhcC0+c3RhbmRhcmRfb2Zmc2V0CisgKiAgICAgICAgICBwZWFzeWNhcC0+aW5wdXRzZXRbcGVhc3ljYXAtPmlucHV0XS5zdGFuZGFyZF9vZmZzZXQKICAqICAgICAgICAgIHBlYXN5Y2FwLT5mcHMKICAqICAgICAgICAgIHBlYXN5Y2FwLT51c2VjCiAgKiAgICAgICAgICBwZWFzeWNhcC0+dG9sZXJhdGUKKyAqICAgICAgICAgIHBlYXN5Y2FwLT5za2lwCiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIGludCBhZGp1c3Rfc3RhbmRhcmQoc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwLCB2NGwyX3N0ZF9pZCBzdGRfaWQpCiB7CiBzdHJ1Y3QgZWFzeWNhcF9zdGFuZGFyZCBjb25zdCAqcGVhc3ljYXBfc3RhbmRhcmQ7CiBfX3UxNiByZWcsIHNldDsKLWludCBpciwgcmMsIG5lZWQ7CitpbnQgaXIsIHJjLCBuZWVkLCBrOwogdW5zaWduZWQgaW50IGl0d2FzLCBpc25vdzsKK2Jvb2wgcmVzdWJtaXQ7CiAKK2lmIChOVUxMID09IHBlYXN5Y2FwKSB7CisJU0FZKCJFUlJPUjogcGVhc3ljYXAgaXMgTlVMTFxuIik7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CiBpZiAoKHN0cnVjdCB1c2JfZGV2aWNlICopTlVMTCA9PSBwZWFzeWNhcC0+cHVzYl9kZXZpY2UpIHsKLQlTQVkoIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CisJU0FNKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGlzIE5VTExcbiIpOwogCXJldHVybiAtRUZBVUxUOwogfQogcGVhc3ljYXBfc3RhbmRhcmQgPSAmZWFzeWNhcF9zdGFuZGFyZFswXTsKIHdoaWxlICgweEZGRkYgIT0gcGVhc3ljYXBfc3RhbmRhcmQtPm1hc2spIHsKLQlpZiAoc3RkX2lkICYgcGVhc3ljYXBfc3RhbmRhcmQtPnY0bDJfc3RhbmRhcmQuaWQpCisJaWYgKHN0ZF9pZCA9PSBwZWFzeWNhcF9zdGFuZGFyZC0+djRsMl9zdGFuZGFyZC5pZCkKIAkJYnJlYWs7CiAJcGVhc3ljYXBfc3RhbmRhcmQrKzsKIH0KIGlmICgweEZGRkYgPT0gcGVhc3ljYXBfc3RhbmRhcmQtPm1hc2spIHsKLQlTQVkoIkVSUk9SOiAweCUwOFg9c3RkX2lkOiBzdGFuZGFyZCBub3QgZm91bmRcbiIsIFwKKwlwZWFzeWNhcF9zdGFuZGFyZCA9ICZlYXN5Y2FwX3N0YW5kYXJkWzBdOworCXdoaWxlICgweEZGRkYgIT0gcGVhc3ljYXBfc3RhbmRhcmQtPm1hc2spIHsKKwkJaWYgKHN0ZF9pZCAmIHBlYXN5Y2FwX3N0YW5kYXJkLT52NGwyX3N0YW5kYXJkLmlkKQorCQkJYnJlYWs7CisJCXBlYXN5Y2FwX3N0YW5kYXJkKys7CisJfQorfQoraWYgKDB4RkZGRiA9PSBwZWFzeWNhcF9zdGFuZGFyZC0+bWFzaykgeworCVNBTSgiRVJST1I6IDB4JTA4WD1zdGRfaWQ6IHN0YW5kYXJkIG5vdCBmb3VuZFxuIiwgXAogCQkJCQkJCSh1bnNpZ25lZCBpbnQpc3RkX2lkKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KLVNBWSgidXNlciByZXF1ZXN0cyBzdGFuZGFyZDogJXNcbiIsIFwKK1NBTSgic2VsZWN0ZWQgc3RhbmRhcmQ6ICVzXG4iLCBcCiAJCQkmKHBlYXN5Y2FwX3N0YW5kYXJkLT52NGwyX3N0YW5kYXJkLm5hbWVbMF0pKTsKIGlmIChwZWFzeWNhcC0+c3RhbmRhcmRfb2Zmc2V0ID09IFwKIAkJCShpbnQpKHBlYXN5Y2FwX3N0YW5kYXJkIC0gJmVhc3ljYXBfc3RhbmRhcmRbMF0pKSB7Ci0JU0FZKCJyZXF1ZXN0ZWQgc3RhbmRhcmQgYWxyZWFkeSBpbiBlZmZlY3RcbiIpOworCVNBTSgicmVxdWVzdGVkIHN0YW5kYXJkIGFscmVhZHkgaW4gZWZmZWN0XG4iKTsKIAlyZXR1cm4gMDsKIH0KIHBlYXN5Y2FwLT5zdGFuZGFyZF9vZmZzZXQgPSAoaW50KShwZWFzeWNhcF9zdGFuZGFyZCAtICZlYXN5Y2FwX3N0YW5kYXJkWzBdKTsKK2ZvciAoayA9IDA7IGsgPCBJTlBVVF9NQU5ZOyAgaysrKSB7CisJaWYgKCFwZWFzeWNhcC0+aW5wdXRzZXRba10uc3RhbmRhcmRfb2Zmc2V0X29rKSB7CisJCQlwZWFzeWNhcC0+aW5wdXRzZXRba10uc3RhbmRhcmRfb2Zmc2V0ID0gXAorCQkJCQkJcGVhc3ljYXAtPnN0YW5kYXJkX29mZnNldDsKKwl9Cit9CitpZiAoKDAgPD0gcGVhc3ljYXAtPmlucHV0KSAmJiAoSU5QVVRfTUFOWSA+IHBlYXN5Y2FwLT5pbnB1dCkpIHsKKwlwZWFzeWNhcC0+aW5wdXRzZXRbcGVhc3ljYXAtPmlucHV0XS5zdGFuZGFyZF9vZmZzZXQgPSBcCisJCQkJCQlwZWFzeWNhcC0+c3RhbmRhcmRfb2Zmc2V0OworCXBlYXN5Y2FwLT5pbnB1dHNldFtwZWFzeWNhcC0+aW5wdXRdLnN0YW5kYXJkX29mZnNldF9vayA9IDE7Cit9IGVsc2UKKwlKT00oOCwgIiVpPXBlYXN5Y2FwLT5pbnB1dFxuIiwgcGVhc3ljYXAtPmlucHV0KTsKIHBlYXN5Y2FwLT5mcHMgPSBwZWFzeWNhcF9zdGFuZGFyZC0+djRsMl9zdGFuZGFyZC5mcmFtZXBlcmlvZC5kZW5vbWluYXRvciAvIFwKIAkJcGVhc3ljYXBfc3RhbmRhcmQtPnY0bDJfc3RhbmRhcmQuZnJhbWVwZXJpb2QubnVtZXJhdG9yOwotaWYgKCFwZWFzeWNhcC0+ZnBzKSB7Ci0JU0FZKCJNSVNUQUtFOiBmcmFtZXMtcGVyLXNlY29uZCBpcyB6ZXJvXG4iKTsKLQlyZXR1cm4gLUVGQVVMVDsKK3N3aXRjaCAocGVhc3ljYXAtPmZwcykgeworY2FzZSA2OgorY2FzZSAzMDogeworCXBlYXN5Y2FwLT5udHNjID0gdHJ1ZTsKKwlicmVhazsKIH0KLUpPVCg4LCAiJWkgZnJhbWVzLXBlci1zZWNvbmRcbiIsIHBlYXN5Y2FwLT5mcHMpOwotcGVhc3ljYXAtPnVzZWMgPSAxMDAwMDAwIC8gKDIgKiBwZWFzeWNhcC0+ZnBzKTsKLXBlYXN5Y2FwLT50b2xlcmF0ZSA9IDEwMDAgKiAoMjUgLyBwZWFzeWNhcC0+ZnBzKTsKLQota2lsbF92aWRlb191cmJzKHBlYXN5Y2FwKTsKLQorY2FzZSA1OgorY2FzZSAyNTogeworCXBlYXN5Y2FwLT5udHNjID0gZmFsc2U7CisJYnJlYWs7Cit9CitkZWZhdWx0OiB7CisJU0FNKCJNSVNUQUtFOiAlaT1mcmFtZXMtcGVyLXNlY29uZFxuIiwgcGVhc3ljYXAtPmZwcyk7CisJcmV0dXJuIC1FTk9FTlQ7Cit9Cit9CitKT00oOCwgIiVpIGZyYW1lcy1wZXItc2Vjb25kXG4iLCBwZWFzeWNhcC0+ZnBzKTsKK2lmICgweDgwMDAgJiBwZWFzeWNhcF9zdGFuZGFyZC0+bWFzaykgeworCXBlYXN5Y2FwLT5za2lwID0gNTsKKwlwZWFzeWNhcC0+dXNlYyA9IDEwMDAwMDAgLyAoMiAqICg1ICogcGVhc3ljYXAtPmZwcykpOworCXBlYXN5Y2FwLT50b2xlcmF0ZSA9IDEwMDAgKiAoMjUgLyAoNSAqIHBlYXN5Y2FwLT5mcHMpKTsKK30gZWxzZSB7CisJcGVhc3ljYXAtPnNraXAgPSAwOworCXBlYXN5Y2FwLT51c2VjID0gMTAwMDAwMCAvICgyICogcGVhc3ljYXAtPmZwcyk7CisJcGVhc3ljYXAtPnRvbGVyYXRlID0gMTAwMCAqICgyNSAvIHBlYXN5Y2FwLT5mcHMpOworfQoraWYgKHBlYXN5Y2FwLT52aWRlb19pc29jX3N0cmVhbWluZykgeworCXJlc3VibWl0ID0gdHJ1ZTsKKwlraWxsX3ZpZGVvX3VyYnMocGVhc3ljYXApOworfSBlbHNlCisJcmVzdWJtaXQgPSBmYWxzZTsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKICAqICBTQUE3MTEzSCBEQVRBU0hFRVQgUEFHRSA0NCwgVEFCTEUgNDIKQEAgLTk0LDU1ICsxNDIsNDEgQEAKIAlyZWcgPSAweDBBOyAgc2V0ID0gMHg5NTsKIAlpciA9IHJlYWRfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgcmVnKTsKIAlpZiAoMCA+IGlyKQotCQlTQVkoIkVSUk9SOiBjYW5ub3QgcmVhZCBTQUEgcmVnaXN0ZXIgMHglMDJYXG4iLCByZWcpOworCQlTQU0oIkVSUk9SOiBjYW5ub3QgcmVhZCBTQUEgcmVnaXN0ZXIgMHglMDJYXG4iLCByZWcpOwogCWVsc2UKIAkJaXR3YXMgPSAodW5zaWduZWQgaW50KWlyOwotCi0KLQlzZXQydG83OChwZWFzeWNhcC0+cHVzYl9kZXZpY2UpOwotCi0KIAlyYyA9IHdyaXRlX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIHJlZywgc2V0KTsKIAlpZiAoMCAhPSByYykKLQkJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHNldCBTQUEgcmVnaXN0ZXIgIiBcCisJCVNBTSgiRVJST1I6IGZhaWxlZCB0byBzZXQgU0FBIHJlZ2lzdGVyICIgXAogCQkJIjB4JTAyWCB0byAweCUwMlggZm9yIEpQIHN0YW5kYXJkXG4iLCByZWcsIHNldCk7CiAJZWxzZSB7CiAJCWlzbm93ID0gKHVuc2lnbmVkIGludClyZWFkX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIHJlZyk7CiAJCWlmICgwID4gaXIpCi0JCQlKT1QoOCwgIlNBQSByZWdpc3RlciAweCUwMlggY2hhbmdlZCAiIFwKKwkJCUpPTSg4LCAiU0FBIHJlZ2lzdGVyIDB4JTAyWCBjaGFuZ2VkICIgXAogCQkJCSJ0byAweCUwMlhcbiIsIHJlZywgaXNub3cpOwogCQllbHNlCi0JCQlKT1QoOCwgIlNBQSByZWdpc3RlciAweCUwMlggY2hhbmdlZCAiIFwKKwkJCUpPTSg4LCAiU0FBIHJlZ2lzdGVyIDB4JTAyWCBjaGFuZ2VkICIgXAogCQkJCSJmcm9tIDB4JTAyWCB0byAweCUwMlhcbiIsIHJlZywgaXR3YXMsIGlzbm93KTsKLQotCQlzZXQydG83OChwZWFzeWNhcC0+cHVzYl9kZXZpY2UpOwotCiAJfQogCiAJcmVnID0gMHgwQjsgIHNldCA9IDB4NDg7CiAJaXIgPSByZWFkX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIHJlZyk7CiAJaWYgKDAgPiBpcikKLQkJU0FZKCJFUlJPUjogY2Fubm90IHJlYWQgU0FBIHJlZ2lzdGVyIDB4JTAyWFxuIiwgcmVnKTsKKwkJU0FNKCJFUlJPUjogY2Fubm90IHJlYWQgU0FBIHJlZ2lzdGVyIDB4JTAyWFxuIiwgcmVnKTsKIAllbHNlCiAJCWl0d2FzID0gKHVuc2lnbmVkIGludClpcjsKLQotCXNldDJ0bzc4KHBlYXN5Y2FwLT5wdXNiX2RldmljZSk7Ci0KIAlyYyA9IHdyaXRlX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIHJlZywgc2V0KTsKIAlpZiAoMCAhPSByYykKLQkJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHNldCBTQUEgcmVnaXN0ZXIgMHglMDJYIHRvIDB4JTAyWCAiIFwKKwkJU0FNKCJFUlJPUjogZmFpbGVkIHRvIHNldCBTQUEgcmVnaXN0ZXIgMHglMDJYIHRvIDB4JTAyWCAiIFwKIAkJCQkJCSJmb3IgSlAgc3RhbmRhcmRcbiIsIHJlZywgc2V0KTsKIAllbHNlIHsKIAkJaXNub3cgPSAodW5zaWduZWQgaW50KXJlYWRfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgcmVnKTsKIAkJaWYgKDAgPiBpcikKLQkJCUpPVCg4LCAiU0FBIHJlZ2lzdGVyIDB4JTAyWCBjaGFuZ2VkICIgXAorCQkJSk9NKDgsICJTQUEgcmVnaXN0ZXIgMHglMDJYIGNoYW5nZWQgIiBcCiAJCQkJInRvIDB4JTAyWFxuIiwgcmVnLCBpc25vdyk7CiAJCWVsc2UKLQkJCUpPVCg4LCAiU0FBIHJlZ2lzdGVyIDB4JTAyWCBjaGFuZ2VkICIgXAorCQkJSk9NKDgsICJTQUEgcmVnaXN0ZXIgMHglMDJYIGNoYW5nZWQgIiBcCiAJCQkJImZyb20gMHglMDJYIHRvIDB4JTAyWFxuIiwgcmVnLCBpdHdhcywgaXNub3cpOwotCi0JCXNldDJ0bzc4KHBlYXN5Y2FwLT5wdXNiX2RldmljZSk7Ci0KIAl9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qCkBAIC0xNzYsMjMgKzIxMCwyMCBAQAogaWYgKG5lZWQpIHsKIAlpciA9IHJlYWRfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgcmVnKTsKIAlpZiAoMCA+IGlyKQotCQlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gcmVhZCBTQUEgcmVnaXN0ZXIgMHglMDJYXG4iLCByZWcpOworCQlTQU0oIkVSUk9SOiBmYWlsZWQgdG8gcmVhZCBTQUEgcmVnaXN0ZXIgMHglMDJYXG4iLCByZWcpOwogCWVsc2UKIAkJaXR3YXMgPSAodW5zaWduZWQgaW50KWlyOwotCi0Jc2V0MnRvNzgocGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKLQogCXJjID0gd3JpdGVfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgcmVnLCBzZXQpOwogCWlmICgwICE9IHdyaXRlX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIHJlZywgc2V0KSkgewotCQlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gc2V0IFNBQSByZWdpc3RlciAiIFwKKwkJU0FNKCJFUlJPUjogZmFpbGVkIHRvIHNldCBTQUEgcmVnaXN0ZXIgIiBcCiAJCQkiMHglMDJYIHRvIDB4JTAyWCBmb3IgdGFibGUgNDJcbiIsIHJlZywgc2V0KTsKIAl9IGVsc2UgewogCQlpc25vdyA9ICh1bnNpZ25lZCBpbnQpcmVhZF9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCByZWcpOwogCQlpZiAoMCA+IGlyKQotCQkJSk9UKDgsICJTQUEgcmVnaXN0ZXIgMHglMDJYIGNoYW5nZWQgIiBcCisJCQlKT00oOCwgIlNBQSByZWdpc3RlciAweCUwMlggY2hhbmdlZCAiIFwKIAkJCQkidG8gMHglMDJYXG4iLCByZWcsIGlzbm93KTsKIAkJZWxzZQotCQkJSk9UKDgsICJTQUEgcmVnaXN0ZXIgMHglMDJYIGNoYW5nZWQgIiBcCisJCQlKT00oOCwgIlNBQSByZWdpc3RlciAweCUwMlggY2hhbmdlZCAiIFwKIAkJCQkiZnJvbSAweCUwMlggdG8gMHglMDJYXG4iLCByZWcsIGl0d2FzLCBpc25vdyk7CiAJfQogfQpAQCAtMjA0LDcgKzIzNSw3IEBACiByZWcgPSAweDA4OwogaXIgPSByZWFkX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIHJlZyk7CiBpZiAoMCA+IGlyKQotCVNBWSgiRVJST1I6IGZhaWxlZCB0byByZWFkIFNBQSByZWdpc3RlciAweCUwMlggIiBcCisJU0FNKCJFUlJPUjogZmFpbGVkIHRvIHJlYWQgU0FBIHJlZ2lzdGVyIDB4JTAyWCAiIFwKIAkJCQkJCSJzbyBjYW5ub3QgcmVzZXRcbiIsIHJlZyk7CiBlbHNlIHsKIAlpdHdhcyA9ICh1bnNpZ25lZCBpbnQpaXI7CkBAIC0yMTIsMTkgKzI0MywxOCBAQAogCQlzZXQgPSBpdHdhcyB8IDB4NDAgOwogCWVsc2UKIAkJc2V0ID0gaXR3YXMgJiB+MHg0MCA7Ci0KLXNldDJ0bzc4KHBlYXN5Y2FwLT5wdXNiX2RldmljZSk7Ci0KLXJjICA9IHdyaXRlX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIHJlZywgc2V0KTsKLWlmICgwICE9IHJjKQotCVNBWSgiRVJST1I6IGZhaWxlZCB0byBzZXQgU0FBIHJlZ2lzdGVyIDB4JTAyWCB0byAweCUwMlhcbiIsIHJlZywgc2V0KTsKLWVsc2UgewotCWlzbm93ID0gKHVuc2lnbmVkIGludClyZWFkX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIHJlZyk7Ci0JaWYgKDAgPiBpcikKLQkJSk9UKDgsICJTQUEgcmVnaXN0ZXIgMHglMDJYIGNoYW5nZWQgdG8gMHglMDJYXG4iLCByZWcsIGlzbm93KTsKLQllbHNlCi0JCUpPVCg4LCAiU0FBIHJlZ2lzdGVyIDB4JTAyWCBjaGFuZ2VkICIgXAotCQkJImZyb20gMHglMDJYIHRvIDB4JTAyWFxuIiwgcmVnLCBpdHdhcywgaXNub3cpOworCXJjICA9IHdyaXRlX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIHJlZywgc2V0KTsKKwlpZiAoMCAhPSByYykKKwkJU0FNKCJFUlJPUjogZmFpbGVkIHRvIHNldCBTQUEgcmVnaXN0ZXIgMHglMDJYIHRvIDB4JTAyWFxuIiwgXAorCQkJCQkJCQlyZWcsIHNldCk7CisJZWxzZSB7CisJCWlzbm93ID0gKHVuc2lnbmVkIGludClyZWFkX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIHJlZyk7CisJCWlmICgwID4gaXIpCisJCQlKT00oOCwgIlNBQSByZWdpc3RlciAweCUwMlggY2hhbmdlZCB0byAweCUwMlhcbiIsIFwKKwkJCQkJCQkJcmVnLCBpc25vdyk7CisJCWVsc2UKKwkJCUpPTSg4LCAiU0FBIHJlZ2lzdGVyIDB4JTAyWCBjaGFuZ2VkICIgXAorCQkJCSJmcm9tIDB4JTAyWCB0byAweCUwMlhcbiIsIHJlZywgaXR3YXMsIGlzbm93KTsKIAl9CiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTIzNSw3ICsyNjUsNyBAQAogcmVnID0gMHg0MDsKIGlyID0gcmVhZF9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCByZWcpOwogaWYgKDAgPiBpcikKLQlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gcmVhZCBTQUEgcmVnaXN0ZXIgMHglMDJYICIgXAorCVNBTSgiRVJST1I6IGZhaWxlZCB0byByZWFkIFNBQSByZWdpc3RlciAweCUwMlggIiBcCiAJCQkJCQkic28gY2Fubm90IHJlc2V0XG4iLCByZWcpOwogZWxzZSB7CiAJaXR3YXMgPSAodW5zaWduZWQgaW50KWlyOwpAQCAtMjQzLDE5ICsyNzMsMTggQEAKIAkJc2V0ID0gaXR3YXMgfCAweDgwIDsKIAllbHNlCiAJCXNldCA9IGl0d2FzICYgfjB4ODAgOwotCi1zZXQydG83OChwZWFzeWNhcC0+cHVzYl9kZXZpY2UpOwotCi1yYyA9IHdyaXRlX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIHJlZywgc2V0KTsKLWlmICgwICE9IHJjKQotCVNBWSgiRVJST1I6IGZhaWxlZCB0byBzZXQgU0FBIHJlZ2lzdGVyIDB4JTAyWCB0byAweCUwMlhcbiIsIHJlZywgc2V0KTsKLWVsc2UgewotCWlzbm93ID0gKHVuc2lnbmVkIGludClyZWFkX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIHJlZyk7Ci0JaWYgKDAgPiBpcikKLQkJSk9UKDgsICJTQUEgcmVnaXN0ZXIgMHglMDJYIGNoYW5nZWQgdG8gMHglMDJYXG4iLCByZWcsIGlzbm93KTsKLQllbHNlCi0JCUpPVCg4LCAiU0FBIHJlZ2lzdGVyIDB4JTAyWCBjaGFuZ2VkICIgXAotCQkJImZyb20gMHglMDJYIHRvIDB4JTAyWFxuIiwgcmVnLCBpdHdhcywgaXNub3cpOworCXJjID0gd3JpdGVfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgcmVnLCBzZXQpOworCWlmICgwICE9IHJjKQorCQlTQU0oIkVSUk9SOiBmYWlsZWQgdG8gc2V0IFNBQSByZWdpc3RlciAweCUwMlggdG8gMHglMDJYXG4iLCBcCisJCQkJCQkJCXJlZywgc2V0KTsKKwllbHNlIHsKKwkJaXNub3cgPSAodW5zaWduZWQgaW50KXJlYWRfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgcmVnKTsKKwkJaWYgKDAgPiBpcikKKwkJCUpPTSg4LCAiU0FBIHJlZ2lzdGVyIDB4JTAyWCBjaGFuZ2VkIHRvIDB4JTAyWFxuIiwgXAorCQkJCQkJCQlyZWcsIGlzbm93KTsKKwkJZWxzZQorCQkJSk9NKDgsICJTQUEgcmVnaXN0ZXIgMHglMDJYIGNoYW5nZWQgIiBcCisJCQkJImZyb20gMHglMDJYIHRvIDB4JTAyWFxuIiwgcmVnLCBpdHdhcywgaXNub3cpOwogCX0KIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMjY2LDQxICsyOTUsMzkgQEAKIHJlZyA9IDB4NUE7CiBpciA9IHJlYWRfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgcmVnKTsKIGlmICgwID4gaXIpCi0JU0FZKCJFUlJPUjogZmFpbGVkIHRvIHJlYWQgU0FBIHJlZ2lzdGVyIDB4JTAyWCBidXQgY29udGludWluZ1xuIiwgcmVnKTsKKwlTQU0oIkVSUk9SOiBmYWlsZWQgdG8gcmVhZCBTQUEgcmVnaXN0ZXIgMHglMDJYIGJ1dCBjb250aW51aW5nXG4iLCByZWcpOwogCWl0d2FzID0gKHVuc2lnbmVkIGludClpcjsKIAlpZiAocGVhc3ljYXBfc3RhbmRhcmQtPm1hc2sgJiAweDAwMDEpCiAJCXNldCA9IDB4MEEgOwogCWVsc2UKIAkJc2V0ID0gMHgwNyA7Ci0KLQlzZXQydG83OChwZWFzeWNhcC0+cHVzYl9kZXZpY2UpOwotCiAJaWYgKDAgIT0gd3JpdGVfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgcmVnLCBzZXQpKQotCQlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gc2V0IFNBQSByZWdpc3RlciAweCUwMlggdG8gMHglMDJYXG4iLCBcCisJCVNBTSgiRVJST1I6IGZhaWxlZCB0byBzZXQgU0FBIHJlZ2lzdGVyIDB4JTAyWCB0byAweCUwMlhcbiIsIFwKIAkJCQkJCQkJcmVnLCBzZXQpOwogCWVsc2UgewogCQlpc25vdyA9ICh1bnNpZ25lZCBpbnQpcmVhZF9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCByZWcpOwogCQlpZiAoMCA+IGlyKQotCQkJSk9UKDgsICJTQUEgcmVnaXN0ZXIgMHglMDJYIGNoYW5nZWQgIgorCQkJSk9NKDgsICJTQUEgcmVnaXN0ZXIgMHglMDJYIGNoYW5nZWQgIgogCQkJCSJ0byAweCUwMlhcbiIsIHJlZywgaXNub3cpOwogCQllbHNlCi0JCQlKT1QoOCwgIlNBQSByZWdpc3RlciAweCUwMlggY2hhbmdlZCAiCisJCQlKT00oOCwgIlNBQSByZWdpc3RlciAweCUwMlggY2hhbmdlZCAiCiAJCQkJImZyb20gMHglMDJYIHRvIDB4JTAyWFxuIiwgcmVnLCBpdHdhcywgaXNub3cpOwogCX0KLQlpZiAoMCAhPSBjaGVja19zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlKSkKLQkJU0FZKCJFUlJPUjogY2hlY2tfc2FhKCkgZmFpbGVkXG4iKTsKK2lmICh0cnVlID09IHJlc3VibWl0KQorCXN1Ym1pdF92aWRlb191cmJzKHBlYXN5Y2FwKTsKIHJldHVybiAwOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgotICogIFRIRSBBTEdPUklUSE0gRk9SIFJFU1BPTkRJTkcgVE8gVEhFIFZJRElPX1NfRk1UIElPQ1RMIERFUEVORFMgT04gVEhFCi0gKiAgQ1VSUkVOVCBWQUxVRSBPRiBwZWFzeWNhcC0+c3RhbmRhcmRfb2Zmc2V0LgorICogIFRIRSBBTEdPUklUSE0gRk9SIFJFU1BPTkRJTkcgVE8gVEhFIFZJRElPX1NfRk1UIElPQ1RMIFJFUVVJUkVTCisgKiAgQSBWQUxJRCBWQUxVRSBPRiBwZWFzeWNhcC0+c3RhbmRhcmRfb2Zmc2V0LCBPVEhFUldJU0UgLUVCVVNZIElTIFJFVFVSTkVELgorICoKICAqICBQUk9WSURFRCBUSEUgQVJHVU1FTlQgdHJ5IElTIGZhbHNlIEFORCBUSEVSRSBJUyBOTyBQUkVNQVRVUkUgRVJST1IgUkVUVVJOCiAgKiAgVEhJUyBST1VUSU5FIFVQREFURVMgVEhFIEZPTExPV0lORzoKICAqICAgICAgICAgIHBlYXN5Y2FwLT5mb3JtYXRfb2Zmc2V0CisgKiAgICAgICAgICBwZWFzeWNhcC0+aW5wdXRzZXRbcGVhc3ljYXAtPmlucHV0XS5mb3JtYXRfb2Zmc2V0CiAgKiAgICAgICAgICBwZWFzeWNhcC0+cGl4ZWxmb3JtYXQKLSAqICAgICAgICAgIHBlYXN5Y2FwLT5maWVsZAogICogICAgICAgICAgcGVhc3ljYXAtPmhlaWdodAogICogICAgICAgICAgcGVhc3ljYXAtPndpZHRoCiAgKiAgICAgICAgICBwZWFzeWNhcC0+Ynl0ZXNwZXJwaXhlbApAQCAtMzIxLDM5ICszNDgsOTMgQEAKIHN0cnVjdCBlYXN5Y2FwX2Zvcm1hdCAqcGVhc3ljYXBfZm9ybWF0LCAqcGVhc3ljYXBfYmVzdF9mb3JtYXQ7CiBfX3UxNiBtYXNrOwogc3RydWN0IHVzYl9kZXZpY2UgKnA7Ci1pbnQgbWlzcywgbXVsdGlwbGllciwgYmVzdDsKLWNoYXIgYmZbNV0sICpwYzsKK2ludCBtaXNzLCBtdWx0aXBsaWVyLCBiZXN0LCBrOworY2hhciBiZls1XSwgZm9bMzJdLCAqcGM7CiBfX3UzMiB1YzsKK2Jvb2wgcmVzdWJtaXQ7CiAKLWlmICgoc3RydWN0IGVhc3ljYXAgKilOVUxMID09IHBlYXN5Y2FwKSB7CitpZiAoTlVMTCA9PSBwZWFzeWNhcCkgewogCVNBWSgiRVJST1I6IHBlYXN5Y2FwIGlzIE5VTExcbiIpOwogCXJldHVybiAtRUZBVUxUOwogfQoraWYgKDAgPiBwZWFzeWNhcC0+c3RhbmRhcmRfb2Zmc2V0KSB7CisJSk9NKDgsICIlaT1wZWFzeWNhcC0+c3RhbmRhcmRfb2Zmc2V0XG4iLCBwZWFzeWNhcC0+c3RhbmRhcmRfb2Zmc2V0KTsKKwlyZXR1cm4gLUVCVVNZOworfQogcCA9IHBlYXN5Y2FwLT5wdXNiX2RldmljZTsKIGlmICgoc3RydWN0IHVzYl9kZXZpY2UgKilOVUxMID09IHApIHsKLQlTQVkoIkVSUk9SOiBwZWF5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKKwlTQU0oIkVSUk9SOiBwZWF5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKIAlyZXR1cm4gLUVGQVVMVDsKIH0KIHBjID0gJmJmWzBdOwotdWMgPSBwaXhlbGZvcm1hdDsgIG1lbWNweSgodm9pZCAqKXBjLCAodm9pZCAqKSgmdWMpLCA0KTsgIGJmWzRdID0gMDsKLW1hc2sgPSBlYXN5Y2FwX3N0YW5kYXJkW3BlYXN5Y2FwLT5zdGFuZGFyZF9vZmZzZXRdLm1hc2s7Ci1TQVkoInNvdWdodDogICAgJWl4JWksJXMoMHglMDhYKSwlaT1maWVsZCwweCUwMlg9c3RkIG1hc2tcbiIsIFwKK3VjID0gcGl4ZWxmb3JtYXQ7CittZW1jcHkoKHZvaWQgKilwYywgKHZvaWQgKikoJnVjKSwgNCk7CitiZls0XSA9IDA7CittYXNrID0gMHhGRiAmIGVhc3ljYXBfc3RhbmRhcmRbcGVhc3ljYXAtPnN0YW5kYXJkX29mZnNldF0ubWFzazsKK1NBTSgic291Z2h0OiAgICAlaXglaSwlcygweCUwOFgpLCVpPWZpZWxkLDB4JTAyWD1zdGQgbWFza1xuIiwgXAogCQkJCXdpZHRoLCBoZWlnaHQsIHBjLCBwaXhlbGZvcm1hdCwgZmllbGQsIG1hc2spOworc3dpdGNoIChmaWVsZCkgeworY2FzZSBWNEwyX0ZJRUxEX0FOWTogeworCXN0cmNweSgmZm9bMF0sICJWNEwyX0ZJRUxEX0FOWSAiKTsKKwlicmVhazsKK30KK2Nhc2UgVjRMMl9GSUVMRF9OT05FOiB7CisJc3RyY3B5KCZmb1swXSwgIlY0TDJfRklFTERfTk9ORSIpOworCWJyZWFrOworfQorY2FzZSBWNEwyX0ZJRUxEX1RPUDogeworCXN0cmNweSgmZm9bMF0sICJWNEwyX0ZJRUxEX1RPUCIpOworCWJyZWFrOworfQorY2FzZSBWNEwyX0ZJRUxEX0JPVFRPTTogeworCXN0cmNweSgmZm9bMF0sICJWNEwyX0ZJRUxEX0JPVFRPTSIpOworCWJyZWFrOworfQorY2FzZSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQ6IHsKKwlzdHJjcHkoJmZvWzBdLCAiVjRMMl9GSUVMRF9JTlRFUkxBQ0VEIik7CisJYnJlYWs7Cit9CitjYXNlIFY0TDJfRklFTERfU0VRX1RCOiB7CisJc3RyY3B5KCZmb1swXSwgIlY0TDJfRklFTERfU0VRX1RCIik7CisJYnJlYWs7Cit9CitjYXNlIFY0TDJfRklFTERfU0VRX0JUOiB7CisJc3RyY3B5KCZmb1swXSwgIlY0TDJfRklFTERfU0VRX0JUIik7CisJYnJlYWs7Cit9CitjYXNlIFY0TDJfRklFTERfQUxURVJOQVRFOiB7CisJc3RyY3B5KCZmb1swXSwgIlY0TDJfRklFTERfQUxURVJOQVRFIik7CisJYnJlYWs7Cit9CitjYXNlIFY0TDJfRklFTERfSU5URVJMQUNFRF9UQjogeworCXN0cmNweSgmZm9bMF0sICJWNEwyX0ZJRUxEX0lOVEVSTEFDRURfVEIiKTsKKwlicmVhazsKK30KK2Nhc2UgVjRMMl9GSUVMRF9JTlRFUkxBQ0VEX0JUOiB7CisJc3RyY3B5KCZmb1swXSwgIlY0TDJfRklFTERfSU5URVJMQUNFRF9CVCIpOworCWJyZWFrOworfQorZGVmYXVsdDogeworCXN0cmNweSgmZm9bMF0sICJWNEwyX0ZJRUxEXy4uLiBVTktOT1dOICAiKTsKKwlicmVhazsKK30KK30KK1NBTSgic291Z2h0OiAgICAlc1xuIiwgJmZvWzBdKTsKIGlmIChWNEwyX0ZJRUxEX0FOWSA9PSBmaWVsZCkgewotCWZpZWxkID0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEOwotCVNBWSgicHJlZmVyOiAgICBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQ9ZmllbGQsIHdhcyBWNEwyX0ZJRUxEX0FOWVxuIik7CisJZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisJU0FNKCJwcmVmZXI6ICAgIFY0TDJfRklFTERfTk9ORT1maWVsZCwgd2FzIFY0TDJfRklFTERfQU5ZXG4iKTsKIH0KIHBlYXN5Y2FwX2Jlc3RfZm9ybWF0ID0gKHN0cnVjdCBlYXN5Y2FwX2Zvcm1hdCAqKU5VTEw7CiBwZWFzeWNhcF9mb3JtYXQgPSAmZWFzeWNhcF9mb3JtYXRbMF07CiB3aGlsZSAoMCAhPSBwZWFzeWNhcF9mb3JtYXQtPnY0bDJfZm9ybWF0LmZtdC5waXgud2lkdGgpIHsKLQlKT1QoMTYsICIuPiAlaSAlaSAweCUwOFggJWl4JWlcbiIsIFwKKwlKT00oMTYsICIuPiAlaSAlaSAweCUwOFggJWl4JWlcbiIsIFwKIAkJcGVhc3ljYXBfZm9ybWF0LT5tYXNrICYgMHgwMSwKIAkJcGVhc3ljYXBfZm9ybWF0LT52NGwyX2Zvcm1hdC5mbXQucGl4LmZpZWxkLAogCQlwZWFzeWNhcF9mb3JtYXQtPnY0bDJfZm9ybWF0LmZtdC5waXgucGl4ZWxmb3JtYXQsCiAJCXBlYXN5Y2FwX2Zvcm1hdC0+djRsMl9mb3JtYXQuZm10LnBpeC53aWR0aCwKIAkJcGVhc3ljYXBfZm9ybWF0LT52NGwyX2Zvcm1hdC5mbXQucGl4LmhlaWdodCk7CiAKLQlpZiAoKChwZWFzeWNhcF9mb3JtYXQtPm1hc2sgJiAweDBGKSA9PSAobWFzayAmIDB4MEYpKSAmJiBcCisJaWYgKCgocGVhc3ljYXBfZm9ybWF0LT5tYXNrICYgMHgxRikgPT0gKG1hc2sgJiAweDFGKSkgJiYgXAogCQkocGVhc3ljYXBfZm9ybWF0LT52NGwyX2Zvcm1hdC5mbXQucGl4LmZpZWxkID09IGZpZWxkKSAmJiBcCiAJCShwZWFzeWNhcF9mb3JtYXQtPnY0bDJfZm9ybWF0LmZtdC5waXgucGl4ZWxmb3JtYXQgPT0gXAogCQkJCQkJCXBpeGVsZm9ybWF0KSAmJiBcCkBAIC0zNjUsMTEgKzQ0NiwxMSBAQAogCXBlYXN5Y2FwX2Zvcm1hdCsrOwogfQogaWYgKDAgPT0gcGVhc3ljYXBfZm9ybWF0LT52NGwyX2Zvcm1hdC5mbXQucGl4LndpZHRoKSB7Ci0JU0FZKCJjYW5ub3QgZG86ICVpeCVpIHdpdGggc3RhbmRhcmQgbWFzayAweCUwMlhcbiIsIFwKKwlTQU0oImNhbm5vdCBkbzogJWl4JWkgd2l0aCBzdGFuZGFyZCBtYXNrIDB4JTAyWFxuIiwgXAogCQkJCQkJCXdpZHRoLCBoZWlnaHQsIG1hc2spOwogCXBlYXN5Y2FwX2Zvcm1hdCA9ICZlYXN5Y2FwX2Zvcm1hdFswXTsgIGJlc3QgPSAtMTsKIAl3aGlsZSAoMCAhPSBwZWFzeWNhcF9mb3JtYXQtPnY0bDJfZm9ybWF0LmZtdC5waXgud2lkdGgpIHsKLQkJaWYgKCgocGVhc3ljYXBfZm9ybWF0LT5tYXNrICYgMHgwRikgPT0gKG1hc2sgJiAweDBGKSkgJiYgXAorCQlpZiAoKChwZWFzeWNhcF9mb3JtYXQtPm1hc2sgJiAweDFGKSA9PSAobWFzayAmIDB4MUYpKSAmJiBcCiAJCQkJIChwZWFzeWNhcF9mb3JtYXQtPnY0bDJfZm9ybWF0LmZtdC5waXhcCiAJCQkJCQkuZmllbGQgPT0gZmllbGQpICYmIFwKIAkJCQkgKHBlYXN5Y2FwX2Zvcm1hdC0+djRsMl9mb3JtYXQuZm10LnBpeFwKQEAgLTM4NiwxNiArNDY3LDE2IEBACiAJCXBlYXN5Y2FwX2Zvcm1hdCsrOwogCX0KIAlpZiAoLTEgPT0gYmVzdCkgewotCQlTQVkoImNhbm5vdCBkbyAlaXguLi4gd2l0aCBzdGFuZGFyZCBtYXNrIDB4JTAyWFxuIiwgXAorCQlTQU0oImNhbm5vdCBkbyAlaXguLi4gd2l0aCBzdGFuZGFyZCBtYXNrIDB4JTAyWFxuIiwgXAogCQkJCQkJCQl3aWR0aCwgbWFzayk7Ci0JCVNBWSgiY2Fubm90IGRvIC4uLnglaSB3aXRoIHN0YW5kYXJkIG1hc2sgMHglMDJYXG4iLCBcCisJCVNBTSgiY2Fubm90IGRvIC4uLnglaSB3aXRoIHN0YW5kYXJkIG1hc2sgMHglMDJYXG4iLCBcCiAJCQkJCQkJCWhlaWdodCwgbWFzayk7Ci0JCVNBWSgiICAgICAgICAgICAlaXglaSB1bm1hdGNoZWRcbiIsIHdpZHRoLCBoZWlnaHQpOworCQlTQU0oIiAgICAgICAgICAgJWl4JWkgdW5tYXRjaGVkXG4iLCB3aWR0aCwgaGVpZ2h0KTsKIAkJcmV0dXJuIHBlYXN5Y2FwLT5mb3JtYXRfb2Zmc2V0OwogCX0KIH0KIGlmICgoc3RydWN0IGVhc3ljYXBfZm9ybWF0ICopTlVMTCA9PSBwZWFzeWNhcF9iZXN0X2Zvcm1hdCkgewotCVNBWSgiTUlTVEFLRTogcGVhc3ljYXBfYmVzdF9mb3JtYXQgaXMgTlVMTCIpOworCVNBTSgiTUlTVEFLRTogcGVhc3ljYXBfYmVzdF9mb3JtYXQgaXMgTlVMTCIpOwogCXJldHVybiAtRUlOVkFMOwogfQogcGVhc3ljYXBfZm9ybWF0ID0gcGVhc3ljYXBfYmVzdF9mb3JtYXQ7CkBAIC00MDYsMjMgKzQ4Nyw0MyBAQAogLyouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qLwogCiBpZiAoZmFsc2UgIT0gdHJ5KSB7Ci0JU0FZKCJNSVNUQUtFOiB0cnVlPT10cnkgd2hlcmUgaXMgc2hvdWxkIGJlIGZhbHNlXG4iKTsKKwlTQU0oIk1JU1RBS0U6IHRydWU9PXRyeSB3aGVyZSBpcyBzaG91bGQgYmUgZmFsc2VcbiIpOwogCXJldHVybiAtRUlOVkFMOwogfQotU0FZKCJhY3Rpb25pbmc6ICVpeCVpICVzXG4iLCBcCitTQU0oImFjdGlvbmluZzogJWl4JWkgJXNcbiIsIFwKIAkJCXBlYXN5Y2FwX2Zvcm1hdC0+djRsMl9mb3JtYXQuZm10LnBpeC53aWR0aCwgXAogCQkJcGVhc3ljYXBfZm9ybWF0LT52NGwyX2Zvcm1hdC5mbXQucGl4LmhlaWdodCwKIAkJCSZwZWFzeWNhcF9mb3JtYXQtPm5hbWVbMF0pOwogcGVhc3ljYXAtPmhlaWdodCAgICAgICAgPSBwZWFzeWNhcF9mb3JtYXQtPnY0bDJfZm9ybWF0LmZtdC5waXguaGVpZ2h0OwogcGVhc3ljYXAtPndpZHRoICAgICAgICAgPSBwZWFzeWNhcF9mb3JtYXQtPnY0bDJfZm9ybWF0LmZtdC5waXgud2lkdGg7CiBwZWFzeWNhcC0+cGl4ZWxmb3JtYXQgICA9IHBlYXN5Y2FwX2Zvcm1hdC0+djRsMl9mb3JtYXQuZm10LnBpeC5waXhlbGZvcm1hdDsKLXBlYXN5Y2FwLT5maWVsZCAgICAgICAgID0gcGVhc3ljYXBfZm9ybWF0LT52NGwyX2Zvcm1hdC5mbXQucGl4LmZpZWxkOwogcGVhc3ljYXAtPmZvcm1hdF9vZmZzZXQgPSAoaW50KShwZWFzeWNhcF9mb3JtYXQgLSAmZWFzeWNhcF9mb3JtYXRbMF0pOwotcGVhc3ljYXAtPmJ5dGVzcGVycGl4ZWwgPSAoMHgwMEYwICYgcGVhc3ljYXBfZm9ybWF0LT5tYXNrKSA+PiA0IDsKKworCitmb3IgKGsgPSAwOyBrIDwgSU5QVVRfTUFOWTsgaysrKSB7CisJaWYgKCFwZWFzeWNhcC0+aW5wdXRzZXRba10uZm9ybWF0X29mZnNldF9vaykgeworCQlwZWFzeWNhcC0+aW5wdXRzZXRba10uZm9ybWF0X29mZnNldCA9IFwKKwkJCQkJCXBlYXN5Y2FwLT5mb3JtYXRfb2Zmc2V0OworCX0KK30KK2lmICgoMCA8PSBwZWFzeWNhcC0+aW5wdXQpICYmIChJTlBVVF9NQU5ZID4gcGVhc3ljYXAtPmlucHV0KSkgeworCXBlYXN5Y2FwLT5pbnB1dHNldFtwZWFzeWNhcC0+aW5wdXRdLmZvcm1hdF9vZmZzZXQgPSBcCisJCQkJCQlwZWFzeWNhcC0+Zm9ybWF0X29mZnNldDsKKwlwZWFzeWNhcC0+aW5wdXRzZXRbcGVhc3ljYXAtPmlucHV0XS5mb3JtYXRfb2Zmc2V0X29rID0gMTsKK30gZWxzZQorCUpPTSg4LCAiJWk9cGVhc3ljYXAtPmlucHV0XG4iLCBwZWFzeWNhcC0+aW5wdXQpOworCisKKworcGVhc3ljYXAtPmJ5dGVzcGVycGl4ZWwgPSAoMHgwMEUwICYgcGVhc3ljYXBfZm9ybWF0LT5tYXNrKSA+PiA1IDsKIGlmICgweDAxMDAgJiBwZWFzeWNhcF9mb3JtYXQtPm1hc2spCiAJcGVhc3ljYXAtPmJ5dGVzd2Fwb3JkZXIgPSB0cnVlOwogZWxzZQogCXBlYXN5Y2FwLT5ieXRlc3dhcG9yZGVyID0gZmFsc2U7CitpZiAoMHgwMjAwICYgcGVhc3ljYXBfZm9ybWF0LT5tYXNrKQorCXBlYXN5Y2FwLT5za2lwID0gNTsKK2Vsc2UKKwlwZWFzeWNhcC0+c2tpcCA9IDA7CiBpZiAoMHgwODAwICYgcGVhc3ljYXBfZm9ybWF0LT5tYXNrKQogCXBlYXN5Y2FwLT5kZWNpbWF0ZXBpeGVsID0gdHJ1ZTsKIGVsc2UKQEAgLTQzOSwyNyArNTQwLDExIEBACiAJCQkJCW11bHRpcGxpZXIgKiBwZWFzeWNhcC0+aGVpZ2h0OwogcGVhc3ljYXAtPmZyYW1lX2J1ZmZlcl91c2VkID0gcGVhc3ljYXAtPmJ5dGVzcGVycGl4ZWwgKiBcCiAJCQkJCXBlYXN5Y2FwLT53aWR0aCAqIHBlYXN5Y2FwLT5oZWlnaHQ7Ci0KLWlmICh0cnVlID09IHBlYXN5Y2FwLT5vZmZlcmZpZWxkcykgewotCVNBWSgiV0FSTklORzogJWk9cGVhc3ljYXAtPmZpZWxkIGlzIHVudGVzdGVkOiAiIFwKLQkJCQkicGxlYXNlIHJlcG9ydCBwcm9ibGVtc1xuIiwgcGVhc3ljYXAtPmZpZWxkKTsKLQotCi0vKgotICogICAgRklYTUUgLS0tLSBUSElTIElTIFVOVEVTVEVELCBNQVkgQkUgKEFORCBQUk9CQUJMWSBJUykgSU5DT1JSRUNUOgotICoKLSAqICAgIHBlYXN5Y2FwLT5mcmFtZV9idWZmZXJfdXNlZCA9IHBlYXN5Y2FwLT5mcmFtZV9idWZmZXJfdXNlZCAvIDI7Ci0gKgotICogICAgU08gRE8gTk9UIFJJU0sgSVQgWUVULgotICoKLSAqLwotCi0KLQotfQotCi1raWxsX3ZpZGVvX3VyYnMocGVhc3ljYXApOwotCitpZiAocGVhc3ljYXAtPnZpZGVvX2lzb2Nfc3RyZWFtaW5nKSB7CisJcmVzdWJtaXQgPSB0cnVlOworCWtpbGxfdmlkZW9fdXJicyhwZWFzeWNhcCk7Cit9IGVsc2UKKwlyZXN1Ym1pdCA9IGZhbHNlOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKICAqICBQQUwKQEAgLTQ3NCwxMyArNTU5LDEzIEBACiAJCQkoMjg4ID09IFwKIAkJCXBlYXN5Y2FwX2Zvcm1hdC0+djRsMl9mb3JtYXQuZm10LnBpeC5oZWlnaHQpKSkgewogCQlpZiAoMCAhPSBzZXRfcmVzb2x1dGlvbihwLCAweDAwMDAsIDB4MDAwMSwgMHgwNUEwLCAweDAxMjEpKSB7Ci0JCQlTQVkoIkVSUk9SOiBzZXRfcmVzb2x1dGlvbigpIGZhaWxlZFxuIik7CisJCQlTQU0oIkVSUk9SOiBzZXRfcmVzb2x1dGlvbigpIGZhaWxlZFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0gZWxzZSBpZiAoKDcwNCA9PSBwZWFzeWNhcF9mb3JtYXQtPnY0bDJfZm9ybWF0LmZtdC5waXgud2lkdGgpICYmIFwKIAkJCSg1NzYgPT0gcGVhc3ljYXBfZm9ybWF0LT52NGwyX2Zvcm1hdC5mbXQucGl4LmhlaWdodCkpIHsKIAkJaWYgKDAgIT0gc2V0X3Jlc29sdXRpb24ocCwgMHgwMDA0LCAweDAwMDEsIDB4MDU4NCwgMHgwMTIxKSkgewotCQkJU0FZKCJFUlJPUjogc2V0X3Jlc29sdXRpb24oKSBmYWlsZWRcbiIpOworCQkJU0FNKCJFUlJPUjogc2V0X3Jlc29sdXRpb24oKSBmYWlsZWRcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9IGVsc2UgaWYgKCgoNjQwID09IHBlYXN5Y2FwX2Zvcm1hdC0+djRsMl9mb3JtYXQuZm10LnBpeC53aWR0aCkgJiYgXApAQCAtNDkxLDExICs1NzYsMTEgQEAKIAkJCSgyNDAgPT0gXAogCQkJcGVhc3ljYXBfZm9ybWF0LT52NGwyX2Zvcm1hdC5mbXQucGl4LmhlaWdodCkpKSB7CiAJCWlmICgwICE9IHNldF9yZXNvbHV0aW9uKHAsIDB4MDAxNCwgMHgwMDIwLCAweDA1MTQsIDB4MDExMCkpIHsKLQkJCVNBWSgiRVJST1I6IHNldF9yZXNvbHV0aW9uKCkgZmFpbGVkXG4iKTsKKwkJCVNBTSgiRVJST1I6IHNldF9yZXNvbHV0aW9uKCkgZmFpbGVkXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfSBlbHNlIHsKLQkJU0FZKCJNSVNUQUtFOiBiYWQgZm9ybWF0LCBjYW5ub3Qgc2V0IHJlc29sdXRpb25cbiIpOworCQlTQU0oIk1JU1RBS0U6IGJhZCBmb3JtYXQsIGNhbm5vdCBzZXQgcmVzb2x1dGlvblxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTUxMiw3ICs1OTcsNyBAQAogCQkJKDI0MCA9PSBcCiAJCQlwZWFzeWNhcF9mb3JtYXQtPnY0bDJfZm9ybWF0LmZtdC5waXguaGVpZ2h0KSkpIHsKIAkJaWYgKDAgIT0gc2V0X3Jlc29sdXRpb24ocCwgMHgwMDAwLCAweDAwMDMsIDB4MDVBMCwgMHgwMEYzKSkgewotCQkJU0FZKCJFUlJPUjogc2V0X3Jlc29sdXRpb24oKSBmYWlsZWRcbiIpOworCQkJU0FNKCJFUlJPUjogc2V0X3Jlc29sdXRpb24oKSBmYWlsZWRcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9IGVsc2UgaWYgKCgoNjQwID09IHBlYXN5Y2FwX2Zvcm1hdC0+djRsMl9mb3JtYXQuZm10LnBpeC53aWR0aCkgJiYgXApAQCAtNTIzLDI4ICs2MDgsMzEgQEAKIAkJCSgyNDAgPT0gXAogCQkJcGVhc3ljYXBfZm9ybWF0LT52NGwyX2Zvcm1hdC5mbXQucGl4LmhlaWdodCkpKSB7CiAJCWlmICgwICE9IHNldF9yZXNvbHV0aW9uKHAsIDB4MDAxNCwgMHgwMDAzLCAweDA1MTQsIDB4MDBGMykpIHsKLQkJCVNBWSgiRVJST1I6IHNldF9yZXNvbHV0aW9uKCkgZmFpbGVkXG4iKTsKKwkJCVNBTSgiRVJST1I6IHNldF9yZXNvbHV0aW9uKCkgZmFpbGVkXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfSBlbHNlIHsKLQkJU0FZKCJNSVNUQUtFOiBiYWQgZm9ybWF0LCBjYW5ub3Qgc2V0IHJlc29sdXRpb25cbiIpOworCQlTQU0oIk1JU1RBS0U6IGJhZCBmb3JtYXQsIGNhbm5vdCBzZXQgcmVzb2x1dGlvblxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotY2hlY2tfc3RrKHBlYXN5Y2FwLT5wdXNiX2RldmljZSk7Ci0KK2lmICh0cnVlID09IHJlc3VibWl0KQorCXN1Ym1pdF92aWRlb191cmJzKHBlYXN5Y2FwKTsKIHJldHVybiAoaW50KShwZWFzeWNhcF9iZXN0X2Zvcm1hdCAtICZlYXN5Y2FwX2Zvcm1hdFswXSk7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBpbnQgYWRqdXN0X2JyaWdodG5lc3Moc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwLCBpbnQgdmFsdWUpCiB7CiB1bnNpZ25lZCBpbnQgbW9vZDsKLWludCBpMTsKK2ludCBpMSwgazsKIAoraWYgKE5VTEwgPT0gcGVhc3ljYXApIHsKKwlTQVkoIkVSUk9SOiBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KIGlmICgoc3RydWN0IHVzYl9kZXZpY2UgKilOVUxMID09IHBlYXN5Y2FwLT5wdXNiX2RldmljZSkgewotCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKKwlTQU0oIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CiAJcmV0dXJuIC1FRkFVTFQ7CiB9CiBpMSA9IDA7CkBAIC01NTMsMzcgKzY0MSw1NiBAQAogCQlpZiAoKGVhc3ljYXBfY29udHJvbFtpMV0ubWluaW11bSA+IHZhbHVlKSB8fCBcCiAJCQkJCShlYXN5Y2FwX2NvbnRyb2xbaTFdLm1heGltdW0gPCB2YWx1ZSkpCiAJCQl2YWx1ZSA9IGVhc3ljYXBfY29udHJvbFtpMV0uZGVmYXVsdF92YWx1ZTsKKworCQlpZiAoKGVhc3ljYXBfY29udHJvbFtpMV0ubWluaW11bSA8PSBwZWFzeWNhcC0+YnJpZ2h0bmVzcykgJiYgXAorCQkJCQkoZWFzeWNhcF9jb250cm9sW2kxXS5tYXhpbXVtID49IFwKKwkJCQkJCXBlYXN5Y2FwLT5icmlnaHRuZXNzKSkgeworCQkJaWYgKHBlYXN5Y2FwLT5icmlnaHRuZXNzID09IHZhbHVlKSB7CisJCQkJU0FNKCJ1bmNoYW5nZWQgYnJpZ2h0bmVzcyBhdCAgMHglMDJYXG4iLCBcCisJCQkJCQkJCXZhbHVlKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQogCQlwZWFzeWNhcC0+YnJpZ2h0bmVzcyA9IHZhbHVlOworCQlmb3IgKGsgPSAwOyBrIDwgSU5QVVRfTUFOWTsgaysrKSB7CisJCQlpZiAoIXBlYXN5Y2FwLT5pbnB1dHNldFtrXS5icmlnaHRuZXNzX29rKQorCQkJCXBlYXN5Y2FwLT5pbnB1dHNldFtrXS5icmlnaHRuZXNzID0gXAorCQkJCQkJCXBlYXN5Y2FwLT5icmlnaHRuZXNzOworCQl9CisJCWlmICgoMCA8PSBwZWFzeWNhcC0+aW5wdXQpICYmIChJTlBVVF9NQU5ZID4gcGVhc3ljYXAtPmlucHV0KSkgeworCQkJcGVhc3ljYXAtPmlucHV0c2V0W3BlYXN5Y2FwLT5pbnB1dF0uYnJpZ2h0bmVzcyA9IFwKKwkJCQkJCQlwZWFzeWNhcC0+YnJpZ2h0bmVzczsKKwkJCXBlYXN5Y2FwLT5pbnB1dHNldFtwZWFzeWNhcC0+aW5wdXRdLmJyaWdodG5lc3Nfb2sgPSAxOworCQl9IGVsc2UKKwkJCUpPTSg4LCAiJWk9cGVhc3ljYXAtPmlucHV0XG4iLCBwZWFzeWNhcC0+aW5wdXQpOwogCQltb29kID0gMHgwMEZGICYgKHVuc2lnbmVkIGludClwZWFzeWNhcC0+YnJpZ2h0bmVzczsKLQotCQlzZXQydG83OChwZWFzeWNhcC0+cHVzYl9kZXZpY2UpOwotCiAJCWlmICghd3JpdGVfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgMHgwQSwgbW9vZCkpIHsKLQkJCVNBWSgiYWRqdXN0aW5nIGJyaWdodG5lc3MgdG8gIDB4JTAyWFxuIiwgbW9vZCk7CisJCQlTQU0oImFkanVzdGluZyBicmlnaHRuZXNzIHRvICAweCUwMlhcbiIsIG1vb2QpOwogCQkJcmV0dXJuIDA7CiAJCX0gZWxzZSB7Ci0JCQlTQVkoIldBUk5JTkc6IGZhaWxlZCB0byBhZGp1c3QgYnJpZ2h0bmVzcyAiIFwKKwkJCVNBTSgiV0FSTklORzogZmFpbGVkIHRvIGFkanVzdCBicmlnaHRuZXNzICIgXAogCQkJCQkJCSJ0byAweCUwMlhcbiIsIG1vb2QpOwogCQkJcmV0dXJuIC1FTk9FTlQ7CiAJCX0KLQotCQlzZXQydG83OChwZWFzeWNhcC0+cHVzYl9kZXZpY2UpOwotCiAJCWJyZWFrOwogCX0KIAlpMSsrOwogfQotU0FZKCJXQVJOSU5HOiBmYWlsZWQgdG8gYWRqdXN0IGJyaWdodG5lc3M6IGNvbnRyb2wgbm90IGZvdW5kXG4iKTsKK1NBTSgiV0FSTklORzogZmFpbGVkIHRvIGFkanVzdCBicmlnaHRuZXNzOiBjb250cm9sIG5vdCBmb3VuZFxuIik7CiByZXR1cm4gLUVOT0VOVDsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGludCBhZGp1c3RfY29udHJhc3Qoc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwLCBpbnQgdmFsdWUpCiB7CiB1bnNpZ25lZCBpbnQgbW9vZDsKLWludCBpMTsKK2ludCBpMSwgazsKIAoraWYgKE5VTEwgPT0gcGVhc3ljYXApIHsKKwlTQVkoIkVSUk9SOiBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KIGlmICgoc3RydWN0IHVzYl9kZXZpY2UgKilOVUxMID09IHBlYXN5Y2FwLT5wdXNiX2RldmljZSkgewotCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKKwlTQU0oIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CiAJcmV0dXJuIC1FRkFVTFQ7CiB9CiBpMSA9IDA7CkBAIC01OTIsMzcgKzY5OSw1OCBAQAogCQlpZiAoKGVhc3ljYXBfY29udHJvbFtpMV0ubWluaW11bSA+IHZhbHVlKSB8fCBcCiAJCQkJCShlYXN5Y2FwX2NvbnRyb2xbaTFdLm1heGltdW0gPCB2YWx1ZSkpCiAJCQl2YWx1ZSA9IGVhc3ljYXBfY29udHJvbFtpMV0uZGVmYXVsdF92YWx1ZTsKKworCisKKwkJaWYgKChlYXN5Y2FwX2NvbnRyb2xbaTFdLm1pbmltdW0gPD0gcGVhc3ljYXAtPmNvbnRyYXN0KSAmJiBcCisJCQkJKGVhc3ljYXBfY29udHJvbFtpMV0ubWF4aW11bSA+PSBcCisJCQkJCQkJcGVhc3ljYXAtPmNvbnRyYXN0KSkgeworCQkJaWYgKHBlYXN5Y2FwLT5jb250cmFzdCA9PSB2YWx1ZSkgeworCQkJCVNBTSgidW5jaGFuZ2VkIGNvbnRyYXN0IGF0ICAweCUwMlhcbiIsIHZhbHVlKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQogCQlwZWFzeWNhcC0+Y29udHJhc3QgPSB2YWx1ZTsKKwkJZm9yIChrID0gMDsgayA8IElOUFVUX01BTlk7IGsrKykgeworCQkJaWYgKCFwZWFzeWNhcC0+aW5wdXRzZXRba10uY29udHJhc3Rfb2spIHsKKwkJCQlwZWFzeWNhcC0+aW5wdXRzZXRba10uY29udHJhc3QgPSBcCisJCQkJCQkJcGVhc3ljYXAtPmNvbnRyYXN0OworCQkJfQorCQl9CisJCWlmICgoMCA8PSBwZWFzeWNhcC0+aW5wdXQpICYmIChJTlBVVF9NQU5ZID4gcGVhc3ljYXAtPmlucHV0KSkgeworCQkJcGVhc3ljYXAtPmlucHV0c2V0W3BlYXN5Y2FwLT5pbnB1dF0uY29udHJhc3QgPSBcCisJCQkJCQkJcGVhc3ljYXAtPmNvbnRyYXN0OworCQkJcGVhc3ljYXAtPmlucHV0c2V0W3BlYXN5Y2FwLT5pbnB1dF0uY29udHJhc3Rfb2sgPSAxOworCQl9IGVsc2UKKwkJCUpPTSg4LCAiJWk9cGVhc3ljYXAtPmlucHV0XG4iLCBwZWFzeWNhcC0+aW5wdXQpOwogCQltb29kID0gMHgwMEZGICYgKHVuc2lnbmVkIGludCkgKHBlYXN5Y2FwLT5jb250cmFzdCAtIDEyOCk7Ci0KLQkJc2V0MnRvNzgocGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKLQogCQlpZiAoIXdyaXRlX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIDB4MEIsIG1vb2QpKSB7Ci0JCQlTQVkoImFkanVzdGluZyBjb250cmFzdCB0byAgMHglMDJYXG4iLCBtb29kKTsKKwkJCVNBTSgiYWRqdXN0aW5nIGNvbnRyYXN0IHRvICAweCUwMlhcbiIsIG1vb2QpOwogCQkJcmV0dXJuIDA7CiAJCX0gZWxzZSB7Ci0JCQlTQVkoIldBUk5JTkc6IGZhaWxlZCB0byBhZGp1c3QgY29udHJhc3QgdG8gIiBcCisJCQlTQU0oIldBUk5JTkc6IGZhaWxlZCB0byBhZGp1c3QgY29udHJhc3QgdG8gIiBcCiAJCQkJCQkJIjB4JTAyWFxuIiwgbW9vZCk7CiAJCQlyZXR1cm4gLUVOT0VOVDsKIAkJfQotCi0JCXNldDJ0bzc4KHBlYXN5Y2FwLT5wdXNiX2RldmljZSk7Ci0KIAkJYnJlYWs7CiAJfQogCWkxKys7CiB9Ci1TQVkoIldBUk5JTkc6IGZhaWxlZCB0byBhZGp1c3QgY29udHJhc3Q6IGNvbnRyb2wgbm90IGZvdW5kXG4iKTsKK1NBTSgiV0FSTklORzogZmFpbGVkIHRvIGFkanVzdCBjb250cmFzdDogY29udHJvbCBub3QgZm91bmRcbiIpOwogcmV0dXJuIC1FTk9FTlQ7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBpbnQgYWRqdXN0X3NhdHVyYXRpb24oc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwLCBpbnQgdmFsdWUpCiB7CiB1bnNpZ25lZCBpbnQgbW9vZDsKLWludCBpMTsKK2ludCBpMSwgazsKIAoraWYgKE5VTEwgPT0gcGVhc3ljYXApIHsKKwlTQVkoIkVSUk9SOiBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KIGlmICgoc3RydWN0IHVzYl9kZXZpY2UgKilOVUxMID09IHBlYXN5Y2FwLT5wdXNiX2RldmljZSkgewotCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKKwlTQU0oIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CiAJcmV0dXJuIC1FRkFVTFQ7CiB9CiBpMSA9IDA7CkBAIC02MzEsMzcgKzc1OSw1OCBAQAogCQlpZiAoKGVhc3ljYXBfY29udHJvbFtpMV0ubWluaW11bSA+IHZhbHVlKSB8fCBcCiAJCQkJCShlYXN5Y2FwX2NvbnRyb2xbaTFdLm1heGltdW0gPCB2YWx1ZSkpCiAJCQl2YWx1ZSA9IGVhc3ljYXBfY29udHJvbFtpMV0uZGVmYXVsdF92YWx1ZTsKKworCisJCWlmICgoZWFzeWNhcF9jb250cm9sW2kxXS5taW5pbXVtIDw9IHBlYXN5Y2FwLT5zYXR1cmF0aW9uKSAmJiBcCisJCQkJCShlYXN5Y2FwX2NvbnRyb2xbaTFdLm1heGltdW0gPj0gXAorCQkJCQkJcGVhc3ljYXAtPnNhdHVyYXRpb24pKSB7CisJCQlpZiAocGVhc3ljYXAtPnNhdHVyYXRpb24gPT0gdmFsdWUpIHsKKwkJCQlTQU0oInVuY2hhbmdlZCBzYXR1cmF0aW9uIGF0ICAweCUwMlhcbiIsIFwKKwkJCQkJCQkJdmFsdWUpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CiAJCXBlYXN5Y2FwLT5zYXR1cmF0aW9uID0gdmFsdWU7CisJCWZvciAoayA9IDA7IGsgPCBJTlBVVF9NQU5ZOyBrKyspIHsKKwkJCWlmICghcGVhc3ljYXAtPmlucHV0c2V0W2tdLnNhdHVyYXRpb25fb2spIHsKKwkJCQlwZWFzeWNhcC0+aW5wdXRzZXRba10uc2F0dXJhdGlvbiA9IFwKKwkJCQkJCQlwZWFzeWNhcC0+c2F0dXJhdGlvbjsKKwkJCX0KKwkJfQorCQlpZiAoKDAgPD0gcGVhc3ljYXAtPmlucHV0KSAmJiAoSU5QVVRfTUFOWSA+IHBlYXN5Y2FwLT5pbnB1dCkpIHsKKwkJCXBlYXN5Y2FwLT5pbnB1dHNldFtwZWFzeWNhcC0+aW5wdXRdLnNhdHVyYXRpb24gPSBcCisJCQkJCQkJcGVhc3ljYXAtPnNhdHVyYXRpb247CisJCQlwZWFzeWNhcC0+aW5wdXRzZXRbcGVhc3ljYXAtPmlucHV0XS5zYXR1cmF0aW9uX29rID0gMTsKKwkJfSBlbHNlCisJCQlKT00oOCwgIiVpPXBlYXN5Y2FwLT5pbnB1dFxuIiwgcGVhc3ljYXAtPmlucHV0KTsKIAkJbW9vZCA9IDB4MDBGRiAmICh1bnNpZ25lZCBpbnQpIChwZWFzeWNhcC0+c2F0dXJhdGlvbiAtIDEyOCk7Ci0KLQkJc2V0MnRvNzgocGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKLQogCQlpZiAoIXdyaXRlX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIDB4MEMsIG1vb2QpKSB7Ci0JCQlTQVkoImFkanVzdGluZyBzYXR1cmF0aW9uIHRvICAweCUwMlhcbiIsIG1vb2QpOworCQkJU0FNKCJhZGp1c3Rpbmcgc2F0dXJhdGlvbiB0byAgMHglMDJYXG4iLCBtb29kKTsKIAkJCXJldHVybiAwOwogCQl9IGVsc2UgewotCQkJU0FZKCJXQVJOSU5HOiBmYWlsZWQgdG8gYWRqdXN0IHNhdHVyYXRpb24gdG8gIiBcCisJCQlTQU0oIldBUk5JTkc6IGZhaWxlZCB0byBhZGp1c3Qgc2F0dXJhdGlvbiB0byAiIFwKIAkJCQkJCQkiMHglMDJYXG4iLCBtb29kKTsKIAkJCXJldHVybiAtRU5PRU5UOwogCQl9CiAJCWJyZWFrOwotCi0JCXNldDJ0bzc4KHBlYXN5Y2FwLT5wdXNiX2RldmljZSk7Ci0KIAl9CiAJaTErKzsKIH0KLVNBWSgiV0FSTklORzogZmFpbGVkIHRvIGFkanVzdCBzYXR1cmF0aW9uOiBjb250cm9sIG5vdCBmb3VuZFxuIik7CitTQU0oIldBUk5JTkc6IGZhaWxlZCB0byBhZGp1c3Qgc2F0dXJhdGlvbjogY29udHJvbCBub3QgZm91bmRcbiIpOwogcmV0dXJuIC1FTk9FTlQ7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBpbnQgYWRqdXN0X2h1ZShzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXAsIGludCB2YWx1ZSkKIHsKIHVuc2lnbmVkIGludCBtb29kOwotaW50IGkxLCBpMjsKK2ludCBpMSwgaTIsIGs7CiAKK2lmIChOVUxMID09IHBlYXN5Y2FwKSB7CisJU0FZKCJFUlJPUjogcGVhc3ljYXAgaXMgTlVMTFxuIik7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CiBpZiAoKHN0cnVjdCB1c2JfZGV2aWNlICopTlVMTCA9PSBwZWFzeWNhcC0+cHVzYl9kZXZpY2UpIHsKLQlTQVkoIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CisJU0FNKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGlzIE5VTExcbiIpOwogCXJldHVybiAtRUZBVUxUOwogfQogaTEgPSAwOwpAQCAtNjcwLDI3ICs4MTksNDAgQEAKIAkJaWYgKChlYXN5Y2FwX2NvbnRyb2xbaTFdLm1pbmltdW0gPiB2YWx1ZSkgfHwgXAogCQkJCQkoZWFzeWNhcF9jb250cm9sW2kxXS5tYXhpbXVtIDwgdmFsdWUpKQogCQkJdmFsdWUgPSBlYXN5Y2FwX2NvbnRyb2xbaTFdLmRlZmF1bHRfdmFsdWU7CisKKwkJaWYgKChlYXN5Y2FwX2NvbnRyb2xbaTFdLm1pbmltdW0gPD0gcGVhc3ljYXAtPmh1ZSkgJiYgXAorCQkJCQkoZWFzeWNhcF9jb250cm9sW2kxXS5tYXhpbXVtID49IFwKKwkJCQkJCQlwZWFzeWNhcC0+aHVlKSkgeworCQkJaWYgKHBlYXN5Y2FwLT5odWUgPT0gdmFsdWUpIHsKKwkJCQlTQU0oInVuY2hhbmdlZCBodWUgYXQgIDB4JTAyWFxuIiwgdmFsdWUpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CiAJCXBlYXN5Y2FwLT5odWUgPSB2YWx1ZTsKKwkJZm9yIChrID0gMDsgayA8IElOUFVUX01BTlk7IGsrKykgeworCQkJaWYgKCFwZWFzeWNhcC0+aW5wdXRzZXRba10uaHVlX29rKQorCQkJCXBlYXN5Y2FwLT5pbnB1dHNldFtrXS5odWUgPSBwZWFzeWNhcC0+aHVlOworCQl9CisJCWlmICgoMCA8PSBwZWFzeWNhcC0+aW5wdXQpICYmIChJTlBVVF9NQU5ZID4gcGVhc3ljYXAtPmlucHV0KSkgeworCQkJcGVhc3ljYXAtPmlucHV0c2V0W3BlYXN5Y2FwLT5pbnB1dF0uaHVlID0gXAorCQkJCQkJCXBlYXN5Y2FwLT5odWU7CisJCQlwZWFzeWNhcC0+aW5wdXRzZXRbcGVhc3ljYXAtPmlucHV0XS5odWVfb2sgPSAxOworCQl9IGVsc2UKKwkJCUpPTSg4LCAiJWk9cGVhc3ljYXAtPmlucHV0XG4iLCBwZWFzeWNhcC0+aW5wdXQpOwogCQlpMiA9IHBlYXN5Y2FwLT5odWUgLSAxMjg7CiAJCW1vb2QgPSAweDAwRkYgJiAoKGludCkgaTIpOwotCi0JCXNldDJ0bzc4KHBlYXN5Y2FwLT5wdXNiX2RldmljZSk7Ci0KIAkJaWYgKCF3cml0ZV9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCAweDBELCBtb29kKSkgewotCQkJU0FZKCJhZGp1c3RpbmcgaHVlIHRvICAweCUwMlhcbiIsIG1vb2QpOworCQkJU0FNKCJhZGp1c3RpbmcgaHVlIHRvICAweCUwMlhcbiIsIG1vb2QpOwogCQkJcmV0dXJuIDA7CiAJCX0gZWxzZSB7Ci0JCQlTQVkoIldBUk5JTkc6IGZhaWxlZCB0byBhZGp1c3QgaHVlIHRvIDB4JTAyWFxuIiwgbW9vZCk7CisJCQlTQU0oIldBUk5JTkc6IGZhaWxlZCB0byBhZGp1c3QgaHVlIHRvIDB4JTAyWFxuIiwgbW9vZCk7CiAJCQlyZXR1cm4gLUVOT0VOVDsKIAkJfQotCi0JCXNldDJ0bzc4KHBlYXN5Y2FwLT5wdXNiX2RldmljZSk7Ci0KIAkJYnJlYWs7CiAJfQogCWkxKys7CiB9Ci1TQVkoIldBUk5JTkc6IGZhaWxlZCB0byBhZGp1c3QgaHVlOiBjb250cm9sIG5vdCBmb3VuZFxuIik7CitTQU0oIldBUk5JTkc6IGZhaWxlZCB0byBhZGp1c3QgaHVlOiBjb250cm9sIG5vdCBmb3VuZFxuIik7CiByZXR1cm4gLUVOT0VOVDsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTY5OSwzMyArODYxLDQ1IEBACiBfX3M4IG1vb2Q7CiBpbnQgaTE7CiAKK2lmIChOVUxMID09IHBlYXN5Y2FwKSB7CisJU0FZKCJFUlJPUjogcGVhc3ljYXAgaXMgTlVMTFxuIik7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CiBpZiAoKHN0cnVjdCB1c2JfZGV2aWNlICopTlVMTCA9PSBwZWFzeWNhcC0+cHVzYl9kZXZpY2UpIHsKLQlTQVkoIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CisJU0FNKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGlzIE5VTExcbiIpOwogCXJldHVybiAtRUZBVUxUOwogfQogaTEgPSAwOwogd2hpbGUgKDB4RkZGRkZGRkYgIT0gZWFzeWNhcF9jb250cm9sW2kxXS5pZCkgewogCWlmIChWNEwyX0NJRF9BVURJT19WT0xVTUUgPT0gZWFzeWNhcF9jb250cm9sW2kxXS5pZCkgewogCQlpZiAoKGVhc3ljYXBfY29udHJvbFtpMV0ubWluaW11bSA+IHZhbHVlKSB8fCBcCi0JCQkoZWFzeWNhcF9jb250cm9sW2kxXS5tYXhpbXVtIDwgdmFsdWUpKQorCQkJCShlYXN5Y2FwX2NvbnRyb2xbaTFdLm1heGltdW0gPCB2YWx1ZSkpCiAJCQl2YWx1ZSA9IGVhc3ljYXBfY29udHJvbFtpMV0uZGVmYXVsdF92YWx1ZTsKKwkJaWYgKChlYXN5Y2FwX2NvbnRyb2xbaTFdLm1pbmltdW0gPD0gcGVhc3ljYXAtPnZvbHVtZSkgJiYgXAorCQkJCQkoZWFzeWNhcF9jb250cm9sW2kxXS5tYXhpbXVtID49IFwKKwkJCQkJCQlwZWFzeWNhcC0+dm9sdW1lKSkgeworCQkJaWYgKHBlYXN5Y2FwLT52b2x1bWUgPT0gdmFsdWUpIHsKKwkJCQlTQU0oInVuY2hhbmdlZCB2b2x1bWUgYXQgIDB4JTAyWFxuIiwgdmFsdWUpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CiAJCXBlYXN5Y2FwLT52b2x1bWUgPSB2YWx1ZTsKIAkJbW9vZCA9ICgxNiA+IHBlYXN5Y2FwLT52b2x1bWUpID8gMTYgOiBcCiAJCQkoKDMxIDwgcGVhc3ljYXAtPnZvbHVtZSkgPyAzMSA6IFwKIAkJCShfX3M4KSBwZWFzeWNhcC0+dm9sdW1lKTsKIAkJaWYgKCFhdWRpb19nYWluc2V0KHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgbW9vZCkpIHsKLQkJCVNBWSgiYWRqdXN0aW5nIHZvbHVtZSB0byAweCUwMVhcbiIsIG1vb2QpOworCQkJU0FNKCJhZGp1c3Rpbmcgdm9sdW1lIHRvIDB4JTAyWFxuIiwgbW9vZCk7CiAJCQlyZXR1cm4gMDsKIAkJfSBlbHNlIHsKLQkJCVNBWSgiV0FSTklORzogZmFpbGVkIHRvIGFkanVzdCB2b2x1bWUgdG8gIiBcCi0JCQkJCQkJIjB4JTFYXG4iLCBtb29kKTsKKwkJCVNBTSgiV0FSTklORzogZmFpbGVkIHRvIGFkanVzdCB2b2x1bWUgdG8gIiBcCisJCQkJCQkJIjB4JTJYXG4iLCBtb29kKTsKIAkJCXJldHVybiAtRU5PRU5UOwogCQl9CiAJCWJyZWFrOwogCX0KIGkxKys7CiB9Ci1TQVkoIldBUk5JTkc6IGZhaWxlZCB0byBhZGp1c3Qgdm9sdW1lOiBjb250cm9sIG5vdCBmb3VuZFxuIik7CitTQU0oIldBUk5JTkc6IGZhaWxlZCB0byBhZGp1c3Qgdm9sdW1lOiBjb250cm9sIG5vdCBmb3VuZFxuIik7CiByZXR1cm4gLUVOT0VOVDsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTc0NCw4ICs5MTgsMTIgQEAKIHsKIGludCBpMTsKIAoraWYgKE5VTEwgPT0gcGVhc3ljYXApIHsKKwlTQVkoIkVSUk9SOiBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KIGlmICgoc3RydWN0IHVzYl9kZXZpY2UgKilOVUxMID09IHBlYXN5Y2FwLT5wdXNiX2RldmljZSkgewotCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKKwlTQU0oIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CiAJcmV0dXJuIC1FRkFVTFQ7CiB9CiBpMSA9IDA7CkBAIC03NTYsMTMgKzkzNCwxMyBAQAogCQljYXNlIDE6IHsKIAkJCXBlYXN5Y2FwLT5hdWRpb19pZGxlID0gMTsKIAkJCXBlYXN5Y2FwLT50aW1ldmFsMC50dl9zZWMgPSAwOwotCQkJU0FZKCJhZGp1c3RpbmcgbXV0ZTogJWk9cGVhc3ljYXAtPmF1ZGlvX2lkbGVcbiIsIFwKKwkJCVNBTSgiYWRqdXN0aW5nIG11dGU6ICVpPXBlYXN5Y2FwLT5hdWRpb19pZGxlXG4iLCBcCiAJCQkJCQkJcGVhc3ljYXAtPmF1ZGlvX2lkbGUpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAkJZGVmYXVsdDogewogCQkJcGVhc3ljYXAtPmF1ZGlvX2lkbGUgPSAwOwotCQkJU0FZKCJhZGp1c3RpbmcgbXV0ZTogJWk9cGVhc3ljYXAtPmF1ZGlvX2lkbGVcbiIsIFwKKwkJCVNBTSgiYWRqdXN0aW5nIG11dGU6ICVpPXBlYXN5Y2FwLT5hdWRpb19pZGxlXG4iLCBcCiAJCQkJCQkJcGVhc3ljYXAtPmF1ZGlvX2lkbGUpOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTc3MSw0NyArOTQ5LDEwNyBAQAogCX0KIAlpMSsrOwogfQotU0FZKCJXQVJOSU5HOiBmYWlsZWQgdG8gYWRqdXN0IG11dGU6IGNvbnRyb2wgbm90IGZvdW5kXG4iKTsKK1NBTSgiV0FSTklORzogZmFpbGVkIHRvIGFkanVzdCBtdXRlOiBjb250cm9sIG5vdCBmb3VuZFxuIik7CiByZXR1cm4gLUVOT0VOVDsKIH0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW50IGVhc3ljYXBfaW9jdGxfYmtsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2diovCisjaWYgKChkZWZpbmVkKEVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKSkgfHwgXAorCShkZWZpbmVkKEVBU1lDQVBfTkVFRFNfVU5MT0NLRURfSU9DVEwpKSkKK2xvbmcKK2Vhc3ljYXBfaW9jdGxfbm9pbm9kZShzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpIHsKKwlyZXR1cm4gKGxvbmcpZWFzeWNhcF9pb2N0bCgoc3RydWN0IGlub2RlICopTlVMTCwgZmlsZSwgY21kLCBhcmcpOworfQorI2VuZGlmIC8qRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlR8fEVBU1lDQVBfTkVFRFNfVU5MT0NLRURfSU9DVEwqLworLypeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludAorZWFzeWNhcF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci1zdGF0aWMgc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwOwotc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlICpwOwotc3RhdGljIF9fdTMyIGlzZXF1ZW5jZTsKK3N0cnVjdCBlYXN5Y2FwICpwZWFzeWNhcDsKK3N0cnVjdCB1c2JfZGV2aWNlICpwOworaW50IGtkOwogCitpZiAoTlVMTCA9PSBmaWxlKSB7CisJU0FZKCJFUlJPUjogIGZpbGUgaXMgTlVMTFxuIik7CisJcmV0dXJuIC1FUkVTVEFSVFNZUzsKK30KIHBlYXN5Y2FwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogaWYgKE5VTEwgPT0gcGVhc3ljYXApIHsKIAlTQVkoIkVSUk9SOiAgcGVhc3ljYXAgaXMgTlVMTFxuIik7CiAJcmV0dXJuIC0xOwogfQotcCA9IHBlYXN5Y2FwLT5wdXNiX2RldmljZTsKLWlmICgoc3RydWN0IHVzYl9kZXZpY2UgKilOVUxMID09IHApIHsKLQlTQVkoIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CitpZiAobWVtY21wKCZwZWFzeWNhcC0+dGVsbHRhbGVbMF0sIFRFTExUQUxFLCBzdHJsZW4oVEVMTFRBTEUpKSkgeworCVNBWSgiRVJST1I6IGJhZCBwZWFzeWNhcFxuIik7CiAJcmV0dXJuIC1FRkFVTFQ7CiB9CitwID0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlOworaWYgKE5VTEwgPT0gcCkgeworCVNBTSgiRVJST1I6IHBlYXN5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK2tkID0gaXNkb25nbGUocGVhc3ljYXApOworaWYgKDAgPD0ga2QgJiYgRE9OR0xFX01BTlkgPiBrZCkgeworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbykpIHsKKwkJU0FZKCJFUlJPUjogY2Fubm90IGxvY2sgZWFzeWNhcF9kb25nbGVbJWldLm11dGV4X3ZpZGVvXG4iLCBrZCk7CisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorCUpPTSg0LCAibG9ja2VkIGVhc3ljYXBfZG9uZ2xlWyVpXS5tdXRleF92aWRlb1xuIiwga2QpOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKLSAqICBNT1NUIE9GIFRIRSBWQVJJQUJMRVMgREVDTEFSRUQgc3RhdGljIElOIFRIRSBjYXNle30gQkxPQ0tTIEJFTE9XIEFSRSBTTwotICogIERFQ0xBUkVEIFNJTVBMWSBUTyBBVk9JRCBBIENPTVBJTEVSIFdBUk5JTkcgT0YgVEhFIEtJTkQ6Ci0gKiAgZWFzeWNhcF9pb2N0bC5jOiB3YXJuaW5nOgotICogICAgICAgICAgICAgICAgICAgICAgIHRoZSBmcmFtZSBzaXplIG9mIC4uLiBieXRlcyBpcyBsYXJnZXIgdGhhbiAxMDI0IGJ5dGVzCi0gKi8KKyAqICBNRUFOV0hJTEUsIGVhc3ljYXBfdXNiX2Rpc2Nvbm5lY3QoKSBNQVkgSEFWRSBGUkVFRCBQT0lOVEVSIHBlYXN5Y2FwLAorICogIElOIFdISUNIIENBU0UgQSBSRVBFQVQgQ0FMTCBUTyBpc2RvbmdsZSgpIFdJTEwgRkFJTC4KKyAqICBJRiBORUNFU1NBUlksIEJBSUwgT1VULgorKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlpZiAoa2QgIT0gaXNkb25nbGUocGVhc3ljYXApKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCWlmIChOVUxMID09IGZpbGUpIHsKKwkJU0FZKCJFUlJPUjogIGZpbGUgaXMgTlVMTFxuIik7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwl9CisJcGVhc3ljYXAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaWYgKE5VTEwgPT0gcGVhc3ljYXApIHsKKwkJU0FZKCJFUlJPUjogIHBlYXN5Y2FwIGlzIE5VTExcbiIpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorCWlmIChtZW1jbXAoJnBlYXN5Y2FwLT50ZWxsdGFsZVswXSwgVEVMTFRBTEUsIHN0cmxlbihURUxMVEFMRSkpKSB7CisJCVNBWSgiRVJST1I6IGJhZCBwZWFzeWNhcFxuIik7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCXAgPSBwZWFzeWNhcC0+cHVzYl9kZXZpY2U7CisJaWYgKE5VTEwgPT0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlKSB7CisJCVNBTSgiRVJST1I6IHBlYXN5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOworCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCX0KK30gZWxzZSB7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIElGIGVhc3ljYXBfdXNiX2Rpc2Nvbm5lY3QoKSBIQVMgQUxSRUFEWSBGUkVFRCBQT0lOVEVSIHBlYXN5Y2FwIEJFRk9SRSBUSEUKKyAqICBBVFRFTVBUIFRPIEFDUVVJUkUgVEhFIFNFTUFQSE9SRSwgaXNkb25nbGUoKSBXSUxMIEhBVkUgRkFJTEVELiAgQkFJTCBPVVQuCisqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCXJldHVybiAtRVJFU1RBUlRTWVM7Cit9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBzd2l0Y2ggKGNtZCkgewogY2FzZSBWSURJT0NfUVVFUllDQVA6IHsKLQlzdGF0aWMgc3RydWN0IHY0bDJfY2FwYWJpbGl0eSB2NGwyX2NhcGFiaWxpdHk7Ci0Jc3RhdGljIGNoYXIgdmVyc2lvblsxNl0sICpwMSwgKnAyOwotCXN0YXRpYyBpbnQgaSwgcmMsIGtbM107Ci0Jc3RhdGljIGxvbmcgbG5nOworCXN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgdjRsMl9jYXBhYmlsaXR5OworCWNoYXIgdmVyc2lvblsxNl0sICpwMSwgKnAyOworCWludCBpLCByYywga1szXTsKKwlsb25nIGxuZzsKIAotCUpPVCg4LCAiVklESU9DX1FVRVJZQ0FQXG4iKTsKKwlKT00oOCwgIlZJRElPQ19RVUVSWUNBUFxuIik7CiAKIAlpZiAoMTYgPD0gc3RybGVuKEVBU1lDQVBfRFJJVkVSX1ZFUlNJT04pKSB7Ci0JCVNBWSgiRVJST1I6IGJhZCBkcml2ZXIgdmVyc2lvbiBzdHJpbmdcbiIpOyByZXR1cm4gLUVJTlZBTDsKKwkJU0FNKCJFUlJPUjogYmFkIGRyaXZlciB2ZXJzaW9uIHN0cmluZ1xuIik7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXN0cmNweSgmdmVyc2lvblswXSwgRUFTWUNBUF9EUklWRVJfVkVSU0lPTik7CiAJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKQEAgLTgyNiw4ICsxMDY0LDkgQEAKIAkJaWYgKDMgPiBpKSB7CiAJCQlyYyA9IChpbnQpIHN0cmljdF9zdHJ0b2wocDEsIDEwLCAmbG5nKTsKIAkJCWlmICgwICE9IHJjKSB7Ci0JCQkJU0FZKCJFUlJPUjogJWk9c3RyaWN0X3N0cnRvbCglcywuLCwpXG4iLCBcCisJCQkJU0FNKCJFUlJPUjogJWk9c3RyaWN0X3N0cnRvbCglcywuLCwpXG4iLCBcCiAJCQkJCQkJCXJjLCBwMSk7CisJCQkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCQkJa1tpXSA9IChpbnQpbG5nOwpAQCAtODQ0LDcgKzEwODMsNyBAQAogCQkJCVY0TDJfQ0FQX0FVRElPICAgICAgICAgfCBWNEwyX0NBUF9SRUFEV1JJVEU7CiAKIAl2NGwyX2NhcGFiaWxpdHkudmVyc2lvbiA9IEtFUk5FTF9WRVJTSU9OKGtbMF0sIGtbMV0sIGtbMl0pOwotCUpPVCg4LCAidjRsMl9jYXBhYmlsaXR5LnZlcnNpb249KCVpLCVpLCVpKVxuIiwga1swXSwga1sxXSwga1syXSk7CisJSk9NKDgsICJ2NGwyX2NhcGFiaWxpdHkudmVyc2lvbj0oJWksJWksJWkpXG4iLCBrWzBdLCBrWzFdLCBrWzJdKTsKIAogCXN0cmxjcHkoJnY0bDJfY2FwYWJpbGl0eS5jYXJkWzBdLCAiRWFzeUNBUCBEQzYwIiwgXAogCQlzaXplb2YodjRsMl9jYXBhYmlsaXR5LmNhcmQpKTsKQEAgLTg1MywyNiArMTA5MiwyNiBAQAogCQkJCXNpemVvZih2NGwyX2NhcGFiaWxpdHkuYnVzX2luZm8pKSA8IDApIHsKIAkJc3RybGNweSgmdjRsMl9jYXBhYmlsaXR5LmJ1c19pbmZvWzBdLCAiRWFzeUNBUCBidXNfaW5mbyIsIFwKIAkJCQkJc2l6ZW9mKHY0bDJfY2FwYWJpbGl0eS5idXNfaW5mbykpOwotCQlKT1QoOCwgIiVzPXY0bDJfY2FwYWJpbGl0eS5idXNfaW5mb1xuIiwgXAorCQlKT00oOCwgIiVzPXY0bDJfY2FwYWJpbGl0eS5idXNfaW5mb1xuIiwgXAogCQkJCQkmdjRsMl9jYXBhYmlsaXR5LmJ1c19pbmZvWzBdKTsKIAl9CiAJaWYgKDAgIT0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnY0bDJfY2FwYWJpbGl0eSwgXAogCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfY2FwYWJpbGl0eSkpKSB7Ci0JCVBPVVQ7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCWJyZWFrOwogfQogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogY2FzZSBWSURJT0NfRU5VTUlOUFVUOiB7Ci0Jc3RhdGljIHN0cnVjdCB2NGwyX2lucHV0IHY0bDJfaW5wdXQ7Ci0Jc3RhdGljIF9fdTMyIGluZGV4OworCXN0cnVjdCB2NGwyX2lucHV0IHY0bDJfaW5wdXQ7CisJX191MzIgaW5kZXg7CiAKLQlKT1QoOCwgIlZJRElPQ19FTlVNSU5QVVRcbiIpOworCUpPTSg4LCAiVklESU9DX0VOVU1JTlBVVFxuIik7CiAKIAlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmdjRsMl9pbnB1dCwgKHZvaWQgX191c2VyICopYXJnLCBcCiAJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9pbnB1dCkpKSB7Ci0JCVBPVVQ7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCkBAIC04ODksNyArMTEyOCw3IEBACiAJCXY0bDJfaW5wdXQuc3RkID0gVjRMMl9TVERfUEFMIHwgVjRMMl9TVERfU0VDQU0gfCBcCiAJCQkJVjRMMl9TVERfTlRTQyA7CiAJCXY0bDJfaW5wdXQuc3RhdHVzID0gMDsKLQkJSk9UKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9pbnB1dC5uYW1lWzBdKTsKKwkJSk9NKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9pbnB1dC5uYW1lWzBdKTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgMTogewpAQCAtOTAxLDcgKzExNDAsNyBAQAogCQl2NGwyX2lucHV0LnN0ZCA9IFY0TDJfU1REX1BBTCB8IFY0TDJfU1REX1NFQ0FNIHwgXAogCQkJCVY0TDJfU1REX05UU0MgOwogCQl2NGwyX2lucHV0LnN0YXR1cyA9IDA7Ci0JCUpPVCg4LCAiJWk9aW5kZXg6ICVzXG4iLCBpbmRleCwgJnY0bDJfaW5wdXQubmFtZVswXSk7CisJCUpPTSg4LCAiJWk9aW5kZXg6ICVzXG4iLCBpbmRleCwgJnY0bDJfaW5wdXQubmFtZVswXSk7CiAJCWJyZWFrOwogCX0KIAljYXNlIDI6IHsKQEAgLTkxMyw3ICsxMTUyLDcgQEAKIAkJdjRsMl9pbnB1dC5zdGQgPSBWNEwyX1NURF9QQUwgfCBWNEwyX1NURF9TRUNBTSB8IFwKIAkJCQlWNEwyX1NURF9OVFNDIDsKIAkJdjRsMl9pbnB1dC5zdGF0dXMgPSAwOwotCQlKT1QoOCwgIiVpPWluZGV4OiAlc1xuIiwgaW5kZXgsICZ2NGwyX2lucHV0Lm5hbWVbMF0pOworCQlKT00oOCwgIiVpPWluZGV4OiAlc1xuIiwgaW5kZXgsICZ2NGwyX2lucHV0Lm5hbWVbMF0pOwogCQlicmVhazsKIAl9CiAJY2FzZSAzOiB7CkBAIC05MjUsNyArMTE2NCw3IEBACiAJCXY0bDJfaW5wdXQuc3RkID0gVjRMMl9TVERfUEFMIHwgVjRMMl9TVERfU0VDQU0gfCBcCiAJCQkJVjRMMl9TVERfTlRTQyA7CiAJCXY0bDJfaW5wdXQuc3RhdHVzID0gMDsKLQkJSk9UKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9pbnB1dC5uYW1lWzBdKTsKKwkJSk9NKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9pbnB1dC5uYW1lWzBdKTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgNDogewpAQCAtOTM3LDcgKzExNzYsNyBAQAogCQl2NGwyX2lucHV0LnN0ZCA9IFY0TDJfU1REX1BBTCB8IFY0TDJfU1REX1NFQ0FNIHwgXAogCQkJCVY0TDJfU1REX05UU0MgOwogCQl2NGwyX2lucHV0LnN0YXR1cyA9IDA7Ci0JCUpPVCg4LCAiJWk9aW5kZXg6ICVzXG4iLCBpbmRleCwgJnY0bDJfaW5wdXQubmFtZVswXSk7CisJCUpPTSg4LCAiJWk9aW5kZXg6ICVzXG4iLCBpbmRleCwgJnY0bDJfaW5wdXQubmFtZVswXSk7CiAJCWJyZWFrOwogCX0KIAljYXNlIDU6IHsKQEAgLTk0OSwzMSArMTE4OCwzMiBAQAogCQl2NGwyX2lucHV0LnN0ZCA9IFY0TDJfU1REX1BBTCB8IFY0TDJfU1REX1NFQ0FNIHwgXAogCQkJCVY0TDJfU1REX05UU0MgOwogCQl2NGwyX2lucHV0LnN0YXR1cyA9IDA7Ci0JCUpPVCg4LCAiJWk9aW5kZXg6ICVzXG4iLCBpbmRleCwgJnY0bDJfaW5wdXQubmFtZVswXSk7CisJCUpPTSg4LCAiJWk9aW5kZXg6ICVzXG4iLCBpbmRleCwgJnY0bDJfaW5wdXQubmFtZVswXSk7CiAJCWJyZWFrOwogCX0KIAlkZWZhdWx0OiB7Ci0JCUpPVCg4LCAiJWk9aW5kZXg6IGV4aGF1c3RzIGlucHV0c1xuIiwgaW5kZXgpOworCQlKT00oOCwgIiVpPWluZGV4OiBleGhhdXN0cyBpbnB1dHNcbiIsIGluZGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJfQogCiAJaWYgKDAgIT0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnY0bDJfaW5wdXQsIFwKIAkJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9pbnB1dCkpKSB7Ci0JCVBPVVQ7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCWJyZWFrOwogfQogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogY2FzZSBWSURJT0NfR19JTlBVVDogewotCXN0YXRpYyBfX3UzMiBpbmRleDsKKwlfX3UzMiBpbmRleDsKIAotCUpPVCg4LCAiVklESU9DX0dfSU5QVVRcbiIpOworCUpPTSg4LCAiVklESU9DX0dfSU5QVVRcbiIpOwogCWluZGV4ID0gKF9fdTMyKXBlYXN5Y2FwLT5pbnB1dDsKLQlKT1QoOCwgInVzZXIgaXMgdG9sZDogJWlcbiIsIGluZGV4KTsKKwlKT00oOCwgInVzZXIgaXMgdG9sZDogJWlcbiIsIGluZGV4KTsKIAlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmaW5kZXgsIHNpemVvZihfX3UzMikpKSB7Ci0JCVBPVVQ7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCWJyZWFrOwpAQCAtOTgxLDc5ICsxMjIxLDg5IEBACiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiBjYXNlIFZJRElPQ19TX0lOUFVUOgogCXsKLQlzdGF0aWMgX191MzIgaW5kZXg7CisJX191MzIgaW5kZXg7CisJaW50IHJjOwogCi0JSk9UKDgsICJWSURJT0NfU19JTlBVVFxuIik7CisJSk9NKDgsICJWSURJT0NfU19JTlBVVFxuIik7CiAKIAlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmaW5kZXgsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKF9fdTMyKSkpIHsKLQkJUE9VVDsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKLQlKT1QoOCwgInVzZXIgcmVxdWVzdHMgaW5wdXQgJWlcbiIsIGluZGV4KTsKKwlKT00oOCwgInVzZXIgcmVxdWVzdHMgaW5wdXQgJWlcbiIsIGluZGV4KTsKIAogCWlmICgoaW50KWluZGV4ID09IHBlYXN5Y2FwLT5pbnB1dCkgewotCQlTQVkoInJlcXVlc3RlZCBpbnB1dCBhbHJlYWR5IGluIGVmZmVjdFxuIik7CisJCVNBTSgicmVxdWVzdGVkIGlucHV0IGFscmVhZHkgaW4gZWZmZWN0XG4iKTsKIAkJYnJlYWs7CiAJfQogCi0JaWYgKCgwID4gaW5kZXgpIHx8ICg1IDwgaW5kZXgpKSB7Ci0JCUpPVCg4LCAiRVJST1I6ICBiYWQgcmVxdWVzdGVkIGlucHV0OiAlaVxuIiwgaW5kZXgpOworCWlmICgoMCA+IGluZGV4KSB8fCAoSU5QVVRfTUFOWSA8PSBpbmRleCkpIHsKKwkJSk9NKDgsICJFUlJPUjogIGJhZCByZXF1ZXN0ZWQgaW5wdXQ6ICVpXG4iLCBpbmRleCk7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCXBlYXN5Y2FwLT5pbnB1dCA9IChpbnQpaW5kZXg7CiAKLQlzZWxlY3RfaW5wdXQocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCBwZWFzeWNhcC0+aW5wdXQsIDkpOwotCisJcmMgPSBuZXdpbnB1dChwZWFzeWNhcCwgKGludClpbmRleCk7CisJaWYgKDAgPT0gcmMpIHsKKwkJSk9NKDgsICJuZXdpbnB1dCguLCVpKSBPS1xuIiwgKGludClpbmRleCk7CisJfSBlbHNlIHsKKwkJU0FNKCJFUlJPUjogbmV3aW5wdXQoLiwlaSkgcmV0dXJuZWQgJWlcbiIsIChpbnQpaW5kZXgsIHJjKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CiAJYnJlYWs7CiB9CiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiBjYXNlIFZJRElPQ19FTlVNQVVESU86IHsKLQlKT1QoOCwgIlZJRElPQ19FTlVNQVVESU9cbiIpOworCUpPTSg4LCAiVklESU9DX0VOVU1BVURJT1xuIik7CisJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCXJldHVybiAtRUlOVkFMOwogfQogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogY2FzZSBWSURJT0NfRU5VTUFVRE9VVDogewotCXN0YXRpYyBzdHJ1Y3QgdjRsMl9hdWRpb291dCB2NGwyX2F1ZGlvb3V0OworCXN0cnVjdCB2NGwyX2F1ZGlvb3V0IHY0bDJfYXVkaW9vdXQ7CiAKLQlKT1QoOCwgIlZJRElPQ19FTlVNQVVET1VUXG4iKTsKKwlKT00oOCwgIlZJRElPQ19FTlVNQVVET1VUXG4iKTsKIAogCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZ2NGwyX2F1ZGlvb3V0LCAodm9pZCBfX3VzZXIgKilhcmcsIFwKIAkJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX2F1ZGlvb3V0KSkpIHsKLQkJUE9VVDsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKLQlpZiAoMCAhPSB2NGwyX2F1ZGlvb3V0LmluZGV4KQorCWlmICgwICE9IHY0bDJfYXVkaW9vdXQuaW5kZXgpIHsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAJbWVtc2V0KCZ2NGwyX2F1ZGlvb3V0LCAwLCBzaXplb2Yoc3RydWN0IHY0bDJfYXVkaW9vdXQpKTsKIAl2NGwyX2F1ZGlvb3V0LmluZGV4ID0gMDsKIAlzdHJjcHkoJnY0bDJfYXVkaW9vdXQubmFtZVswXSwgIlNvdW5kdHJhY2siKTsKIAogCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZ2NGwyX2F1ZGlvb3V0LCBcCiAJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9hdWRpb291dCkpKSB7Ci0JCVBPVVQ7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCWJyZWFrOwogfQogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogY2FzZSBWSURJT0NfUVVFUllDVFJMOiB7Ci0Jc3RhdGljIGludCBpMTsKLQlzdGF0aWMgc3RydWN0IHY0bDJfcXVlcnljdHJsIHY0bDJfcXVlcnljdHJsOworCWludCBpMTsKKwlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgdjRsMl9xdWVyeWN0cmw7CiAKLQlKT1QoOCwgIlZJRElPQ19RVUVSWUNUUkxcbiIpOworCUpPTSg4LCAiVklESU9DX1FVRVJZQ1RSTFxuIik7CiAKIAlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmdjRsMl9xdWVyeWN0cmwsICh2b2lkIF9fdXNlciAqKWFyZywgXAogCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfcXVlcnljdHJsKSkpIHsKLQkJUE9VVDsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKIAlpMSA9IDA7CiAJd2hpbGUgKDB4RkZGRkZGRkYgIT0gZWFzeWNhcF9jb250cm9sW2kxXS5pZCkgewogCQlpZiAoZWFzeWNhcF9jb250cm9sW2kxXS5pZCA9PSB2NGwyX3F1ZXJ5Y3RybC5pZCkgewotCQkJSk9UKDgsICJWSURJT0NfUVVFUllDVFJMICAlcz1lYXN5Y2FwX2NvbnRyb2xbJWldIiBcCisJCQlKT00oOCwgIlZJRElPQ19RVUVSWUNUUkwgICVzPWVhc3ljYXBfY29udHJvbFslaV0iIFwKIAkJCQkiLm5hbWVcbiIsICZlYXN5Y2FwX2NvbnRyb2xbaTFdLm5hbWVbMF0sIGkxKTsKIAkJCW1lbWNweSgmdjRsMl9xdWVyeWN0cmwsICZlYXN5Y2FwX2NvbnRyb2xbaTFdLCBcCiAJCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfcXVlcnljdHJsKSk7CkBAIC0xMDYyLDEyNyArMTMxMiwxMzcgQEAKIAkJaTErKzsKIAl9CiAJaWYgKDB4RkZGRkZGRkYgPT0gZWFzeWNhcF9jb250cm9sW2kxXS5pZCkgewotCQlKT1QoOCwgIiVpPWluZGV4OiBleGhhdXN0cyBjb250cm9sc1xuIiwgaTEpOworCQlKT00oOCwgIiVpPWluZGV4OiBleGhhdXN0cyBjb250cm9sc1xuIiwgaTEpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmdjRsMl9xdWVyeWN0cmwsIFwKIAkJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCkpKSB7Ci0JCVBPVVQ7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCWJyZWFrOwogfQogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogY2FzZSBWSURJT0NfUVVFUllNRU5VOiB7Ci0JSk9UKDgsICJWSURJT0NfUVVFUllNRU5VIHVuc3VwcG9ydGVkXG4iKTsKKwlKT00oOCwgIlZJRElPQ19RVUVSWU1FTlUgdW5zdXBwb3J0ZWRcbiIpOworCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAlyZXR1cm4gLUVJTlZBTDsKLQlicmVhazsKIH0KIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIGNhc2UgVklESU9DX0dfQ1RSTDogewotCXN0YXRpYyBzdHJ1Y3QgdjRsMl9jb250cm9sIHY0bDJfY29udHJvbDsKKwlzdHJ1Y3QgdjRsMl9jb250cm9sICpwdjRsMl9jb250cm9sOwogCi0JSk9UKDgsICJWSURJT0NfR19DVFJMXG4iKTsKLQotCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZ2NGwyX2NvbnRyb2wsICh2b2lkIF9fdXNlciAqKWFyZywgXAorCUpPTSg4LCAiVklESU9DX0dfQ1RSTFxuIik7CisJcHY0bDJfY29udHJvbCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2NGwyX2NvbnRyb2wpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXB2NGwyX2NvbnRyb2wpIHsKKwkJU0FNKCJFUlJPUjogb3V0IG9mIG1lbW9yeVxuIik7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKHB2NGwyX2NvbnRyb2wsICh2b2lkIF9fdXNlciAqKWFyZywgXAogCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfY29udHJvbCkpKSB7Ci0JCVBPVVQ7CisJCWtmcmVlKHB2NGwyX2NvbnRyb2wpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAotCXN3aXRjaCAodjRsMl9jb250cm9sLmlkKSB7CisJc3dpdGNoIChwdjRsMl9jb250cm9sLT5pZCkgewogCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzogewotCQl2NGwyX2NvbnRyb2wudmFsdWUgPSBwZWFzeWNhcC0+YnJpZ2h0bmVzczsKLQkJSk9UKDgsICJ1c2VyIGVucXVpcmVzIGJyaWdodG5lc3M6ICVpXG4iLCB2NGwyX2NvbnRyb2wudmFsdWUpOworCQlwdjRsMl9jb250cm9sLT52YWx1ZSA9IHBlYXN5Y2FwLT5icmlnaHRuZXNzOworCQlKT00oOCwgInVzZXIgZW5xdWlyZXMgYnJpZ2h0bmVzczogJWlcbiIsIHB2NGwyX2NvbnRyb2wtPnZhbHVlKTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6IHsKLQkJdjRsMl9jb250cm9sLnZhbHVlID0gcGVhc3ljYXAtPmNvbnRyYXN0OwotCQlKT1QoOCwgInVzZXIgZW5xdWlyZXMgY29udHJhc3Q6ICVpXG4iLCB2NGwyX2NvbnRyb2wudmFsdWUpOworCQlwdjRsMl9jb250cm9sLT52YWx1ZSA9IHBlYXN5Y2FwLT5jb250cmFzdDsKKwkJSk9NKDgsICJ1c2VyIGVucXVpcmVzIGNvbnRyYXN0OiAlaVxuIiwgcHY0bDJfY29udHJvbC0+dmFsdWUpOwogCQlicmVhazsKIAl9CiAJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOiB7Ci0JCXY0bDJfY29udHJvbC52YWx1ZSA9IHBlYXN5Y2FwLT5zYXR1cmF0aW9uOwotCQlKT1QoOCwgInVzZXIgZW5xdWlyZXMgc2F0dXJhdGlvbjogJWlcbiIsIHY0bDJfY29udHJvbC52YWx1ZSk7CisJCXB2NGwyX2NvbnRyb2wtPnZhbHVlID0gcGVhc3ljYXAtPnNhdHVyYXRpb247CisJCUpPTSg4LCAidXNlciBlbnF1aXJlcyBzYXR1cmF0aW9uOiAlaVxuIiwgcHY0bDJfY29udHJvbC0+dmFsdWUpOwogCQlicmVhazsKIAl9CiAJY2FzZSBWNEwyX0NJRF9IVUU6IHsKLQkJdjRsMl9jb250cm9sLnZhbHVlID0gcGVhc3ljYXAtPmh1ZTsKLQkJSk9UKDgsICJ1c2VyIGVucXVpcmVzIGh1ZTogJWlcbiIsIHY0bDJfY29udHJvbC52YWx1ZSk7CisJCXB2NGwyX2NvbnRyb2wtPnZhbHVlID0gcGVhc3ljYXAtPmh1ZTsKKwkJSk9NKDgsICJ1c2VyIGVucXVpcmVzIGh1ZTogJWlcbiIsIHB2NGwyX2NvbnRyb2wtPnZhbHVlKTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOiB7Ci0JCXY0bDJfY29udHJvbC52YWx1ZSA9IHBlYXN5Y2FwLT52b2x1bWU7Ci0JCUpPVCg4LCAidXNlciBlbnF1aXJlcyB2b2x1bWU6ICVpXG4iLCB2NGwyX2NvbnRyb2wudmFsdWUpOworCQlwdjRsMl9jb250cm9sLT52YWx1ZSA9IHBlYXN5Y2FwLT52b2x1bWU7CisJCUpPTSg4LCAidXNlciBlbnF1aXJlcyB2b2x1bWU6ICVpXG4iLCBwdjRsMl9jb250cm9sLT52YWx1ZSk7CiAJCWJyZWFrOwogCX0KIAljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6IHsKIAkJaWYgKDEgPT0gcGVhc3ljYXAtPm11dGUpCi0JCQl2NGwyX2NvbnRyb2wudmFsdWUgPSB0cnVlOworCQkJcHY0bDJfY29udHJvbC0+dmFsdWUgPSB0cnVlOwogCQllbHNlCi0JCQl2NGwyX2NvbnRyb2wudmFsdWUgPSBmYWxzZTsKLQkJSk9UKDgsICJ1c2VyIGVucXVpcmVzIG11dGU6ICVpXG4iLCB2NGwyX2NvbnRyb2wudmFsdWUpOworCQkJcHY0bDJfY29udHJvbC0+dmFsdWUgPSBmYWxzZTsKKwkJSk9NKDgsICJ1c2VyIGVucXVpcmVzIG11dGU6ICVpXG4iLCBwdjRsMl9jb250cm9sLT52YWx1ZSk7CiAJCWJyZWFrOwogCX0KIAlkZWZhdWx0OiB7Ci0JCVNBWSgiRVJST1I6IHVua25vd24gVjRMMiBjb250cm9sOiAweCUwOFg9aWRcbiIsIFwKLQkJCQkJCQl2NGwyX2NvbnRyb2wuaWQpOwotCQlleHBsYWluX2NpZCh2NGwyX2NvbnRyb2wuaWQpOworCQlTQU0oIkVSUk9SOiB1bmtub3duIFY0TDIgY29udHJvbDogMHglMDhYPWlkXG4iLCBcCisJCQkJCQkJcHY0bDJfY29udHJvbC0+aWQpOworCQlrZnJlZShwdjRsMl9jb250cm9sKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJfQotCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZ2NGwyX2NvbnRyb2wsIFwKKwlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCBwdjRsMl9jb250cm9sLCBcCiAJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9jb250cm9sKSkpIHsKLQkJUE9VVDsKKwkJa2ZyZWUocHY0bDJfY29udHJvbCk7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQorCWtmcmVlKHB2NGwyX2NvbnRyb2wpOwogCWJyZWFrOwogfQogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogI2lmIGRlZmluZWQoVklESU9DX1NfQ1RSTF9PTEQpCiBjYXNlIFZJRElPQ19TX0NUUkxfT0xEOiB7Ci0JSk9UKDgsICJWSURJT0NfU19DVFJMX09MRCByZXF1aXJlZCBhdCBsZWFzdCBmb3IgeGF3dHZcbiIpOworCUpPTSg4LCAiVklESU9DX1NfQ1RSTF9PTEQgcmVxdWlyZWQgYXQgbGVhc3QgZm9yIHhhd3R2XG4iKTsKIH0KICNlbmRpZiAvKlZJRElPQ19TX0NUUkxfT0xEKi8KIGNhc2UgVklESU9DX1NfQ1RSTDoKIAl7Ci0Jc3RhdGljIHN0cnVjdCB2NGwyX2NvbnRyb2wgdjRsMl9jb250cm9sOworCXN0cnVjdCB2NGwyX2NvbnRyb2wgdjRsMl9jb250cm9sOwogCi0JSk9UKDgsICJWSURJT0NfU19DVFJMXG4iKTsKKwlKT00oOCwgIlZJRElPQ19TX0NUUkxcbiIpOwogCiAJaWYgKDAgIT0gY29weV9mcm9tX3VzZXIoJnY0bDJfY29udHJvbCwgKHZvaWQgX191c2VyICopYXJnLCBcCiAJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9jb250cm9sKSkpIHsKLQkJUE9VVDsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKIAlzd2l0Y2ggKHY0bDJfY29udHJvbC5pZCkgewogCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzogewotCQlKT1QoOCwgInVzZXIgcmVxdWVzdHMgYnJpZ2h0bmVzcyAlaVxuIiwgdjRsMl9jb250cm9sLnZhbHVlKTsKKwkJSk9NKDgsICJ1c2VyIHJlcXVlc3RzIGJyaWdodG5lc3MgJWlcbiIsIHY0bDJfY29udHJvbC52YWx1ZSk7CiAJCWlmICgwICE9IGFkanVzdF9icmlnaHRuZXNzKHBlYXN5Y2FwLCB2NGwyX2NvbnRyb2wudmFsdWUpKQogCQkJOwogCQlicmVhazsKIAl9CiAJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDogewotCQlKT1QoOCwgInVzZXIgcmVxdWVzdHMgY29udHJhc3QgJWlcbiIsIHY0bDJfY29udHJvbC52YWx1ZSk7CisJCUpPTSg4LCAidXNlciByZXF1ZXN0cyBjb250cmFzdCAlaVxuIiwgdjRsMl9jb250cm9sLnZhbHVlKTsKIAkJaWYgKDAgIT0gYWRqdXN0X2NvbnRyYXN0KHBlYXN5Y2FwLCB2NGwyX2NvbnRyb2wudmFsdWUpKQogCQkJOwogCQlicmVhazsKIAl9CiAJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOiB7Ci0JCUpPVCg4LCAidXNlciByZXF1ZXN0cyBzYXR1cmF0aW9uICVpXG4iLCB2NGwyX2NvbnRyb2wudmFsdWUpOworCQlKT00oOCwgInVzZXIgcmVxdWVzdHMgc2F0dXJhdGlvbiAlaVxuIiwgdjRsMl9jb250cm9sLnZhbHVlKTsKIAkJaWYgKDAgIT0gYWRqdXN0X3NhdHVyYXRpb24ocGVhc3ljYXAsIHY0bDJfY29udHJvbC52YWx1ZSkpCiAJCQk7CiAJCWJyZWFrOwogCX0KIAljYXNlIFY0TDJfQ0lEX0hVRTogewotCQlKT1QoOCwgInVzZXIgcmVxdWVzdHMgaHVlICVpXG4iLCB2NGwyX2NvbnRyb2wudmFsdWUpOworCQlKT00oOCwgInVzZXIgcmVxdWVzdHMgaHVlICVpXG4iLCB2NGwyX2NvbnRyb2wudmFsdWUpOwogCQlpZiAoMCAhPSBhZGp1c3RfaHVlKHBlYXN5Y2FwLCB2NGwyX2NvbnRyb2wudmFsdWUpKQogCQkJOwogCQlicmVhazsKIAl9CiAJY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6IHsKLQkJSk9UKDgsICJ1c2VyIHJlcXVlc3RzIHZvbHVtZSAlaVxuIiwgdjRsMl9jb250cm9sLnZhbHVlKTsKKwkJSk9NKDgsICJ1c2VyIHJlcXVlc3RzIHZvbHVtZSAlaVxuIiwgdjRsMl9jb250cm9sLnZhbHVlKTsKIAkJaWYgKDAgIT0gYWRqdXN0X3ZvbHVtZShwZWFzeWNhcCwgdjRsMl9jb250cm9sLnZhbHVlKSkKIAkJCTsKIAkJYnJlYWs7CkBAIC0xMTkwLDQwICsxNDUwLDQxIEBACiAJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOiB7CiAJCWludCBtdXRlOwogCi0JCUpPVCg4LCAidXNlciByZXF1ZXN0cyBtdXRlICVpXG4iLCB2NGwyX2NvbnRyb2wudmFsdWUpOworCQlKT00oOCwgInVzZXIgcmVxdWVzdHMgbXV0ZSAlaVxuIiwgdjRsMl9jb250cm9sLnZhbHVlKTsKIAkJaWYgKHRydWUgPT0gdjRsMl9jb250cm9sLnZhbHVlKQogCQkJbXV0ZSA9IDE7CiAJCWVsc2UKIAkJCW11dGUgPSAwOwogCiAJCWlmICgwICE9IGFkanVzdF9tdXRlKHBlYXN5Y2FwLCBtdXRlKSkKLQkJCVNBWSgiV0FSTklORzogZmFpbGVkIHRvIGFkanVzdCBtdXRlIHRvICVpXG4iLCBtdXRlKTsKKwkJCVNBTSgiV0FSTklORzogZmFpbGVkIHRvIGFkanVzdCBtdXRlIHRvICVpXG4iLCBtdXRlKTsKIAkJYnJlYWs7CiAJfQogCWRlZmF1bHQ6IHsKLQkJU0FZKCJFUlJPUjogdW5rbm93biBWNEwyIGNvbnRyb2w6IDB4JTA4WD1pZFxuIiwgXAorCQlTQU0oIkVSUk9SOiB1bmtub3duIFY0TDIgY29udHJvbDogMHglMDhYPWlkXG4iLCBcCiAJCQkJCQkJdjRsMl9jb250cm9sLmlkKTsKLQkJZXhwbGFpbl9jaWQodjRsMl9jb250cm9sLmlkKTsKLQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJfQorCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwl9CiAJYnJlYWs7CiB9CiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiBjYXNlIFZJRElPQ19TX0VYVF9DVFJMUzogewotCUpPVCg4LCAiVklESU9DX1NfRVhUX0NUUkxTIHVuc3VwcG9ydGVkXG4iKTsKKwlKT00oOCwgIlZJRElPQ19TX0VYVF9DVFJMUyB1bnN1cHBvcnRlZFxuIik7CisJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCXJldHVybiAtRUlOVkFMOwogfQogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogY2FzZSBWSURJT0NfRU5VTV9GTVQ6IHsKLQlzdGF0aWMgX191MzIgaW5kZXg7Ci0Jc3RhdGljIHN0cnVjdCB2NGwyX2ZtdGRlc2MgdjRsMl9mbXRkZXNjOworCV9fdTMyIGluZGV4OworCXN0cnVjdCB2NGwyX2ZtdGRlc2MgdjRsMl9mbXRkZXNjOwogCi0JSk9UKDgsICJWSURJT0NfRU5VTV9GTVRcbiIpOworCUpPTSg4LCAiVklESU9DX0VOVU1fRk1UXG4iKTsKIAogCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZ2NGwyX2ZtdGRlc2MsICh2b2lkIF9fdXNlciAqKWFyZywgXAogCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfZm10ZGVzYykpKSB7Ci0JCVBPVVQ7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCkBAIC0xMjM4LDExNyArMTQ5OSwzMjcgQEAKIAkJdjRsMl9mbXRkZXNjLmZsYWdzID0gMDsKIAkJc3RyY3B5KCZ2NGwyX2ZtdGRlc2MuZGVzY3JpcHRpb25bMF0sICJ1eXZ5Iik7CiAJCXY0bDJfZm10ZGVzYy5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9VWVZZOwotCQlKT1QoOCwgIiVpPWluZGV4OiAlc1xuIiwgaW5kZXgsICZ2NGwyX2ZtdGRlc2MuZGVzY3JpcHRpb25bMF0pOworCQlKT00oOCwgIiVpPWluZGV4OiAlc1xuIiwgaW5kZXgsICZ2NGwyX2ZtdGRlc2MuZGVzY3JpcHRpb25bMF0pOwogCQlicmVhazsKIAl9CiAJY2FzZSAxOiB7CiAJCXY0bDJfZm10ZGVzYy5mbGFncyA9IDA7CiAJCXN0cmNweSgmdjRsMl9mbXRkZXNjLmRlc2NyaXB0aW9uWzBdLCAieXV5MiIpOwogCQl2NGwyX2ZtdGRlc2MucGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfWVVZVjsKLQkJSk9UKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9mbXRkZXNjLmRlc2NyaXB0aW9uWzBdKTsKKwkJSk9NKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9mbXRkZXNjLmRlc2NyaXB0aW9uWzBdKTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgMjogewogCQl2NGwyX2ZtdGRlc2MuZmxhZ3MgPSAwOwogCQlzdHJjcHkoJnY0bDJfZm10ZGVzYy5kZXNjcmlwdGlvblswXSwgInJnYjI0Iik7CiAJCXY0bDJfZm10ZGVzYy5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9SR0IyNDsKLQkJSk9UKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9mbXRkZXNjLmRlc2NyaXB0aW9uWzBdKTsKKwkJSk9NKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9mbXRkZXNjLmRlc2NyaXB0aW9uWzBdKTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgMzogewogCQl2NGwyX2ZtdGRlc2MuZmxhZ3MgPSAwOwogCQlzdHJjcHkoJnY0bDJfZm10ZGVzYy5kZXNjcmlwdGlvblswXSwgInJnYjMyIik7CiAJCXY0bDJfZm10ZGVzYy5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9SR0IzMjsKLQkJSk9UKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9mbXRkZXNjLmRlc2NyaXB0aW9uWzBdKTsKKwkJSk9NKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9mbXRkZXNjLmRlc2NyaXB0aW9uWzBdKTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgNDogewogCQl2NGwyX2ZtdGRlc2MuZmxhZ3MgPSAwOwogCQlzdHJjcHkoJnY0bDJfZm10ZGVzYy5kZXNjcmlwdGlvblswXSwgImJncjI0Iik7CiAJCXY0bDJfZm10ZGVzYy5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9CR1IyNDsKLQkJSk9UKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9mbXRkZXNjLmRlc2NyaXB0aW9uWzBdKTsKKwkJSk9NKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9mbXRkZXNjLmRlc2NyaXB0aW9uWzBdKTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgNTogewogCQl2NGwyX2ZtdGRlc2MuZmxhZ3MgPSAwOwogCQlzdHJjcHkoJnY0bDJfZm10ZGVzYy5kZXNjcmlwdGlvblswXSwgImJncjMyIik7CiAJCXY0bDJfZm10ZGVzYy5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9CR1IzMjsKLQkJSk9UKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9mbXRkZXNjLmRlc2NyaXB0aW9uWzBdKTsKKwkJSk9NKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9mbXRkZXNjLmRlc2NyaXB0aW9uWzBdKTsKIAkJYnJlYWs7CiAJfQogCWRlZmF1bHQ6IHsKLQkJSk9UKDgsICIlaT1pbmRleDogZXhoYXVzdHMgZm9ybWF0c1xuIiwgaW5kZXgpOworCQlKT00oOCwgIiVpPWluZGV4OiBleGhhdXN0cyBmb3JtYXRzXG4iLCBpbmRleCk7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCX0KIAlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmdjRsMl9mbXRkZXNjLCBcCiAJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9mbXRkZXNjKSkpIHsKLQkJUE9VVDsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJYnJlYWs7CiB9CiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisvKgorICogIFRIRSBSRVNQT05TRSBUTyBWSURJT0NfRU5VTV9GUkFNRVNJWkVTIE1VU1QgQkUgQ09ORElUSU9ORUQgT04gVEhFCisgKiAgVEhFIENVUlJFTlQgU1RBTkRBUkQsIEJFQ0FVU0UgVEhBVCBJUyBXSEFUIGdzdHJlYW1lciBFWFBFQ1RTLiAgQkVXQVJFLgorKi8KKy8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIGNhc2UgVklESU9DX0VOVU1fRlJBTUVTSVpFUzogewotCUpPVCg4LCAiVklESU9DX0VOVU1fRlJBTUVTSVpFUyB1bnN1cHBvcnRlZFxuIik7Ci0JcmV0dXJuIC1FSU5WQUw7CisJX191MzIgaW5kZXg7CisJc3RydWN0IHY0bDJfZnJtc2l6ZWVudW0gdjRsMl9mcm1zaXplZW51bTsKKworCUpPTSg4LCAiVklESU9DX0VOVU1fRlJBTUVTSVpFU1xuIik7CisKKwlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmdjRsMl9mcm1zaXplZW51bSwgKHZvaWQgX191c2VyICopYXJnLCBcCisJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9mcm1zaXplZW51bSkpKSB7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaW5kZXggPSB2NGwyX2ZybXNpemVlbnVtLmluZGV4OworCisJdjRsMl9mcm1zaXplZW51bS50eXBlID0gKF9fdTMyKSBWNEwyX0ZSTVNJWkVfVFlQRV9ESVNDUkVURTsKKworCWlmICh0cnVlID09IHBlYXN5Y2FwLT5udHNjKSB7CisJCXN3aXRjaCAoaW5kZXgpIHsKKwkJY2FzZSAwOiB7CisJCQl2NGwyX2ZybXNpemVlbnVtLmRpc2NyZXRlLndpZHRoID0gNjQwOworCQkJdjRsMl9mcm1zaXplZW51bS5kaXNjcmV0ZS5oZWlnaHQgPSA0ODA7CisJCQlKT00oOCwgIiVpPWluZGV4OiAlaXglaVxuIiwgaW5kZXgsIFwKKwkJCQkJKGludCkodjRsMl9mcm1zaXplZW51bS5cCisJCQkJCQkgZGlzY3JldGUud2lkdGgpLCBcCisJCQkJCShpbnQpKHY0bDJfZnJtc2l6ZWVudW0uXAorCQkJCQkJZGlzY3JldGUuaGVpZ2h0KSk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIDE6IHsKKwkJCXY0bDJfZnJtc2l6ZWVudW0uZGlzY3JldGUud2lkdGggPSAzMjA7CisJCQl2NGwyX2ZybXNpemVlbnVtLmRpc2NyZXRlLmhlaWdodCA9IDI0MDsKKwkJCUpPTSg4LCAiJWk9aW5kZXg6ICVpeCVpXG4iLCBpbmRleCwgXAorCQkJCQkoaW50KSh2NGwyX2ZybXNpemVlbnVtLlwKKwkJCQkJCWRpc2NyZXRlLndpZHRoKSwgXAorCQkJCQkoaW50KSh2NGwyX2ZybXNpemVlbnVtLlwKKwkJCQkJCWRpc2NyZXRlLmhlaWdodCkpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSAyOiB7CisJCQl2NGwyX2ZybXNpemVlbnVtLmRpc2NyZXRlLndpZHRoID0gNzIwOworCQkJdjRsMl9mcm1zaXplZW51bS5kaXNjcmV0ZS5oZWlnaHQgPSA0ODA7CisJCQlKT00oOCwgIiVpPWluZGV4OiAlaXglaVxuIiwgaW5kZXgsIFwKKwkJCQkJKGludCkodjRsMl9mcm1zaXplZW51bS5cCisJCQkJCQlkaXNjcmV0ZS53aWR0aCksIFwKKwkJCQkJKGludCkodjRsMl9mcm1zaXplZW51bS5cCisJCQkJCQlkaXNjcmV0ZS5oZWlnaHQpKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgMzogeworCQkJdjRsMl9mcm1zaXplZW51bS5kaXNjcmV0ZS53aWR0aCA9IDM2MDsKKwkJCXY0bDJfZnJtc2l6ZWVudW0uZGlzY3JldGUuaGVpZ2h0ID0gMjQwOworCQkJSk9NKDgsICIlaT1pbmRleDogJWl4JWlcbiIsIGluZGV4LCBcCisJCQkJCShpbnQpKHY0bDJfZnJtc2l6ZWVudW0uXAorCQkJCQkJZGlzY3JldGUud2lkdGgpLCBcCisJCQkJCShpbnQpKHY0bDJfZnJtc2l6ZWVudW0uXAorCQkJCQkJZGlzY3JldGUuaGVpZ2h0KSk7CisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OiB7CisJCQlKT00oOCwgIiVpPWluZGV4OiBleGhhdXN0cyBmcmFtZXNpemVzXG4iLCBpbmRleCk7CisJCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQl9CisJfSBlbHNlIHsKKwkJc3dpdGNoIChpbmRleCkgeworCQljYXNlIDA6IHsKKwkJCXY0bDJfZnJtc2l6ZWVudW0uZGlzY3JldGUud2lkdGggPSA2NDA7CisJCQl2NGwyX2ZybXNpemVlbnVtLmRpc2NyZXRlLmhlaWdodCA9IDQ4MDsKKwkJCUpPTSg4LCAiJWk9aW5kZXg6ICVpeCVpXG4iLCBpbmRleCwgXAorCQkJCQkoaW50KSh2NGwyX2ZybXNpemVlbnVtLlwKKwkJCQkJCWRpc2NyZXRlLndpZHRoKSwgXAorCQkJCQkoaW50KSh2NGwyX2ZybXNpemVlbnVtLlwKKwkJCQkJCWRpc2NyZXRlLmhlaWdodCkpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSAxOiB7CisJCQl2NGwyX2ZybXNpemVlbnVtLmRpc2NyZXRlLndpZHRoID0gMzIwOworCQkJdjRsMl9mcm1zaXplZW51bS5kaXNjcmV0ZS5oZWlnaHQgPSAyNDA7CisJCQlKT00oOCwgIiVpPWluZGV4OiAlaXglaVxuIiwgaW5kZXgsIFwKKwkJCQkJKGludCkodjRsMl9mcm1zaXplZW51bS5cCisJCQkJCQlkaXNjcmV0ZS53aWR0aCksIFwKKwkJCQkJKGludCkodjRsMl9mcm1zaXplZW51bS5cCisJCQkJCQlkaXNjcmV0ZS5oZWlnaHQpKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgMjogeworCQkJdjRsMl9mcm1zaXplZW51bS5kaXNjcmV0ZS53aWR0aCA9IDcwNDsKKwkJCXY0bDJfZnJtc2l6ZWVudW0uZGlzY3JldGUuaGVpZ2h0ID0gNTc2OworCQkJSk9NKDgsICIlaT1pbmRleDogJWl4JWlcbiIsIGluZGV4LCBcCisJCQkJCShpbnQpKHY0bDJfZnJtc2l6ZWVudW0uXAorCQkJCQkJZGlzY3JldGUud2lkdGgpLCBcCisJCQkJCShpbnQpKHY0bDJfZnJtc2l6ZWVudW0uXAorCQkJCQkJZGlzY3JldGUuaGVpZ2h0KSk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIDM6IHsKKwkJCXY0bDJfZnJtc2l6ZWVudW0uZGlzY3JldGUud2lkdGggPSA3MjA7CisJCQl2NGwyX2ZybXNpemVlbnVtLmRpc2NyZXRlLmhlaWdodCA9IDU3NjsKKwkJCUpPTSg4LCAiJWk9aW5kZXg6ICVpeCVpXG4iLCBpbmRleCwgXAorCQkJCQkoaW50KSh2NGwyX2ZybXNpemVlbnVtLlwKKwkJCQkJCWRpc2NyZXRlLndpZHRoKSwgXAorCQkJCQkoaW50KSh2NGwyX2ZybXNpemVlbnVtLlwKKwkJCQkJCWRpc2NyZXRlLmhlaWdodCkpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSA0OiB7CisJCQl2NGwyX2ZybXNpemVlbnVtLmRpc2NyZXRlLndpZHRoID0gMzYwOworCQkJdjRsMl9mcm1zaXplZW51bS5kaXNjcmV0ZS5oZWlnaHQgPSAyODg7CisJCQlKT00oOCwgIiVpPWluZGV4OiAlaXglaVxuIiwgaW5kZXgsIFwKKwkJCQkJKGludCkodjRsMl9mcm1zaXplZW51bS5cCisJCQkJCQlkaXNjcmV0ZS53aWR0aCksIFwKKwkJCQkJKGludCkodjRsMl9mcm1zaXplZW51bS5cCisJCQkJCQlkaXNjcmV0ZS5oZWlnaHQpKTsKKwkJCWJyZWFrOworCQl9CisJCWRlZmF1bHQ6IHsKKwkJCUpPTSg4LCAiJWk9aW5kZXg6IGV4aGF1c3RzIGZyYW1lc2l6ZXNcbiIsIGluZGV4KTsKKwkJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCX0KKwl9CisJaWYgKDAgIT0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnY0bDJfZnJtc2l6ZWVudW0sIFwKKwkJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX2ZybXNpemVlbnVtKSkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJYnJlYWs7CiB9CisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisvKgorICogIFRIRSBSRVNQT05TRSBUTyBWSURJT0NfRU5VTV9GUkFNRUlOVEVSVkFMUyBNVVNUIEJFIENPTkRJVElPTkVEIE9OIFRIRQorICogIFRIRSBDVVJSRU5UIFNUQU5EQVJELCBCRUNBVVNFIFRIQVQgSVMgV0hBVCBnc3RyZWFtZXIgRVhQRUNUUy4gIEJFV0FSRS4KKyovCisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiBjYXNlIFZJRElPQ19FTlVNX0ZSQU1FSU5URVJWQUxTOiB7Ci0JSk9UKDgsICJWSURJT0NfRU5VTV9GUkFNRV9JTlRFUlZBTFMgdW5zdXBwb3J0ZWRcbiIpOwotCXJldHVybiAtRUlOVkFMOworCV9fdTMyIGluZGV4OworCWludCBkZW5vbWluYXRvcjsKKwlzdHJ1Y3QgdjRsMl9mcm1pdmFsZW51bSB2NGwyX2ZybWl2YWxlbnVtOworCisJSk9NKDgsICJWSURJT0NfRU5VTV9GUkFNRUlOVEVSVkFMU1xuIik7CisKKwlpZiAocGVhc3ljYXAtPmZwcykKKwkJZGVub21pbmF0b3IgPSBwZWFzeWNhcC0+ZnBzOworCWVsc2UgeworCQlpZiAodHJ1ZSA9PSBwZWFzeWNhcC0+bnRzYykKKwkJCWRlbm9taW5hdG9yID0gMzA7CisJCWVsc2UKKwkJCWRlbm9taW5hdG9yID0gMjU7CisJfQorCisJaWYgKDAgIT0gY29weV9mcm9tX3VzZXIoJnY0bDJfZnJtaXZhbGVudW0sICh2b2lkIF9fdXNlciAqKWFyZywgXAorCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfZnJtaXZhbGVudW0pKSkgeworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWluZGV4ID0gdjRsMl9mcm1pdmFsZW51bS5pbmRleDsKKworCXY0bDJfZnJtaXZhbGVudW0udHlwZSA9IChfX3UzMikgVjRMMl9GUk1JVkFMX1RZUEVfRElTQ1JFVEU7CisKKwlzd2l0Y2ggKGluZGV4KSB7CisJY2FzZSAwOiB7CisJCXY0bDJfZnJtaXZhbGVudW0uZGlzY3JldGUubnVtZXJhdG9yID0gMTsKKwkJdjRsMl9mcm1pdmFsZW51bS5kaXNjcmV0ZS5kZW5vbWluYXRvciA9IGRlbm9taW5hdG9yOworCQlKT00oOCwgIiVpPWluZGV4OiAlaS8laVxuIiwgaW5kZXgsIFwKKwkJCShpbnQpKHY0bDJfZnJtaXZhbGVudW0uZGlzY3JldGUubnVtZXJhdG9yKSwgXAorCQkJKGludCkodjRsMl9mcm1pdmFsZW51bS5kaXNjcmV0ZS5kZW5vbWluYXRvcikpOworCQlicmVhazsKKwl9CisJY2FzZSAxOiB7CisJCXY0bDJfZnJtaXZhbGVudW0uZGlzY3JldGUubnVtZXJhdG9yID0gMTsKKwkJdjRsMl9mcm1pdmFsZW51bS5kaXNjcmV0ZS5kZW5vbWluYXRvciA9IGRlbm9taW5hdG9yLzU7CisJCUpPTSg4LCAiJWk9aW5kZXg6ICVpLyVpXG4iLCBpbmRleCwgXAorCQkJKGludCkodjRsMl9mcm1pdmFsZW51bS5kaXNjcmV0ZS5udW1lcmF0b3IpLCBcCisJCQkoaW50KSh2NGwyX2ZybWl2YWxlbnVtLmRpc2NyZXRlLmRlbm9taW5hdG9yKSk7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OiB7CisJCUpPTSg4LCAiJWk9aW5kZXg6IGV4aGF1c3RzIGZyYW1laW50ZXJ2YWxzXG4iLCBpbmRleCk7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCX0KKwlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmdjRsMl9mcm1pdmFsZW51bSwgXAorCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfZnJtaXZhbGVudW0pKSkgeworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlicmVhazsKIH0KIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIGNhc2UgVklESU9DX0dfRk1UOiB7Ci0Jc3RhdGljIHN0cnVjdCB2NGwyX2Zvcm1hdCB2NGwyX2Zvcm1hdDsKLQlzdGF0aWMgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCB2NGwyX3BpeF9mb3JtYXQ7CisJc3RydWN0IHY0bDJfZm9ybWF0ICpwdjRsMl9mb3JtYXQ7CisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcHY0bDJfcGl4X2Zvcm1hdDsKIAotCUpPVCg4LCAiVklESU9DX0dfRk1UXG4iKTsKLQotCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZ2NGwyX2Zvcm1hdCwgKHZvaWQgX191c2VyICopYXJnLCBcCisJSk9NKDgsICJWSURJT0NfR19GTVRcbiIpOworCXB2NGwyX2Zvcm1hdCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2NGwyX2Zvcm1hdCksIEdGUF9LRVJORUwpOworCWlmICghcHY0bDJfZm9ybWF0KSB7CisJCVNBTSgiRVJST1I6IG91dCBvZiBtZW1vcnlcbiIpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlwdjRsMl9waXhfZm9ybWF0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCksIEdGUF9LRVJORUwpOworCWlmICghcHY0bDJfcGl4X2Zvcm1hdCkgeworCQlTQU0oIkVSUk9SOiBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJa2ZyZWUocHY0bDJfZm9ybWF0KTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJaWYgKDAgIT0gY29weV9mcm9tX3VzZXIocHY0bDJfZm9ybWF0LCAodm9pZCBfX3VzZXIgKilhcmcsIFwKIAkJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX2Zvcm1hdCkpKSB7Ci0JCVBPVVQ7CisJCWtmcmVlKHB2NGwyX2Zvcm1hdCk7CisJCWtmcmVlKHB2NGwyX3BpeF9mb3JtYXQpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAotCWlmICh2NGwyX2Zvcm1hdC50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkgewotCQlQT1VUOworCWlmIChwdjRsMl9mb3JtYXQtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKSB7CisJCWtmcmVlKHB2NGwyX2Zvcm1hdCk7CisJCWtmcmVlKHB2NGwyX3BpeF9mb3JtYXQpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCW1lbXNldCgmdjRsMl9waXhfZm9ybWF0LCAwLCBzaXplb2Yoc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCkpOwotCXY0bDJfZm9ybWF0LnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7Ci0JbWVtY3B5KCYodjRsMl9mb3JtYXQuZm10LnBpeCksIFwKLQkJCSAmKGVhc3ljYXBfZm9ybWF0W3BlYXN5Y2FwLT5mb3JtYXRfb2Zmc2V0XVwKLQkJCS52NGwyX2Zvcm1hdC5mbXQucGl4KSwgc2l6ZW9mKHY0bDJfcGl4X2Zvcm1hdCkpOwotCUpPVCg4LCAidXNlciBpcyB0b2xkOiAlc1xuIiwgXAorCW1lbXNldChwdjRsMl9waXhfZm9ybWF0LCAwLCBzaXplb2Yoc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCkpOworCXB2NGwyX2Zvcm1hdC0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKwltZW1jcHkoJnB2NGwyX2Zvcm1hdC0+Zm10LnBpeCwgXAorCQkJICZlYXN5Y2FwX2Zvcm1hdFtwZWFzeWNhcC0+Zm9ybWF0X29mZnNldF1cCisJCQkudjRsMl9mb3JtYXQuZm10LnBpeCwgc2l6ZW9mKHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQpKTsKKwlKT00oOCwgInVzZXIgaXMgdG9sZDogJXNcbiIsIFwKIAkJCSZlYXN5Y2FwX2Zvcm1hdFtwZWFzeWNhcC0+Zm9ybWF0X29mZnNldF0ubmFtZVswXSk7CiAKLQlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmdjRsMl9mb3JtYXQsIFwKKwlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCBwdjRsMl9mb3JtYXQsIFwKIAkJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX2Zvcm1hdCkpKSB7Ci0JCVBPVVQ7CisJCWtmcmVlKHB2NGwyX2Zvcm1hdCk7CisJCWtmcmVlKHB2NGwyX3BpeF9mb3JtYXQpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KKwlrZnJlZShwdjRsMl9mb3JtYXQpOworCWtmcmVlKHB2NGwyX3BpeF9mb3JtYXQpOwogCWJyZWFrOwogfQogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogY2FzZSBWSURJT0NfVFJZX0ZNVDoKIGNhc2UgVklESU9DX1NfRk1UOiB7Ci0Jc3RhdGljIHN0cnVjdCB2NGwyX2Zvcm1hdCB2NGwyX2Zvcm1hdDsKLQlzdGF0aWMgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCB2NGwyX3BpeF9mb3JtYXQ7Ci0Jc3RhdGljIGJvb2wgdHJ5OwotCXN0YXRpYyBpbnQgYmVzdF9mb3JtYXQ7CisJc3RydWN0IHY0bDJfZm9ybWF0IHY0bDJfZm9ybWF0OworCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgdjRsMl9waXhfZm9ybWF0OworCWJvb2wgdHJ5OworCWludCBiZXN0X2Zvcm1hdDsKIAogCWlmIChWSURJT0NfVFJZX0ZNVCA9PSBjbWQpIHsKLQkJSk9UKDgsICJWSURJT0NfVFJZX0ZNVFxuIik7CisJCUpPTSg4LCAiVklESU9DX1RSWV9GTVRcbiIpOwogCQl0cnkgPSB0cnVlOwogCX0gZWxzZSB7Ci0JCUpPVCg4LCAiVklESU9DX1NfRk1UXG4iKTsKKwkJSk9NKDgsICJWSURJT0NfU19GTVRcbiIpOwogCQl0cnkgPSBmYWxzZTsKIAl9CiAKIAlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmdjRsMl9mb3JtYXQsICh2b2lkIF9fdXNlciAqKWFyZywgXAogCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfZm9ybWF0KSkpIHsKLQkJUE9VVDsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKQEAgLTEzNTksNyArMTgzMCwxMiBAQAogCQkJCQl2NGwyX2Zvcm1hdC5mbXQucGl4LmZpZWxkLCBcCiAJCQkJCXRyeSk7CiAJaWYgKDAgPiBiZXN0X2Zvcm1hdCkgewotCQlKT1QoOCwgIldBUk5JTkc6IGFkanVzdF9mb3JtYXQoKSByZXR1cm5lZCAlaVxuIiwgYmVzdF9mb3JtYXQpOworCQlpZiAoLUVCVVNZID09IGJlc3RfZm9ybWF0KSB7CisJCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCUpPTSg4LCAiV0FSTklORzogYWRqdXN0X2Zvcm1hdCgpIHJldHVybmVkICVpXG4iLCBiZXN0X2Zvcm1hdCk7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogLyouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qLwpAQCAtMTM2OCwyOSArMTg0NCwyOSBAQAogCiAJbWVtY3B5KCYodjRsMl9mb3JtYXQuZm10LnBpeCksICYoZWFzeWNhcF9mb3JtYXRbYmVzdF9mb3JtYXRdXAogCQkJLnY0bDJfZm9ybWF0LmZtdC5waXgpLCBzaXplb2YodjRsMl9waXhfZm9ybWF0KSk7Ci0JSk9UKDgsICJ1c2VyIGlzIHRvbGQ6ICVzXG4iLCAmZWFzeWNhcF9mb3JtYXRbYmVzdF9mb3JtYXRdLm5hbWVbMF0pOworCUpPTSg4LCAidXNlciBpcyB0b2xkOiAlc1xuIiwgJmVhc3ljYXBfZm9ybWF0W2Jlc3RfZm9ybWF0XS5uYW1lWzBdKTsKIAogCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZ2NGwyX2Zvcm1hdCwgXAogCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfZm9ybWF0KSkpIHsKLQkJUE9VVDsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJYnJlYWs7CiB9CiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiBjYXNlIFZJRElPQ19DUk9QQ0FQOiB7Ci0Jc3RhdGljIHN0cnVjdCB2NGwyX2Nyb3BjYXAgdjRsMl9jcm9wY2FwOworCXN0cnVjdCB2NGwyX2Nyb3BjYXAgdjRsMl9jcm9wY2FwOwogCi0JSk9UKDgsICJWSURJT0NfQ1JPUENBUFxuIik7CisJSk9NKDgsICJWSURJT0NfQ1JPUENBUFxuIik7CiAKIAlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmdjRsMl9jcm9wY2FwLCAodm9pZCBfX3VzZXIgKilhcmcsIFwKIAkJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX2Nyb3BjYXApKSkgewotCQlQT1VUOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAogCWlmICh2NGwyX2Nyb3BjYXAudHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCUpPVCg4LCAidjRsMl9jcm9wY2FwLnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFXG4iKTsKKwkJSk9NKDgsICJ2NGwyX2Nyb3BjYXAudHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVcbiIpOwogCiAJbWVtc2V0KCZ2NGwyX2Nyb3BjYXAsIDAsIHNpemVvZihzdHJ1Y3QgdjRsMl9jcm9wY2FwKSk7CiAJdjRsMl9jcm9wY2FwLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CkBAIC0xNDA1LDExICsxODgxLDExIEBACiAJdjRsMl9jcm9wY2FwLnBpeGVsYXNwZWN0Lm51bWVyYXRvciA9IDE7CiAJdjRsMl9jcm9wY2FwLnBpeGVsYXNwZWN0LmRlbm9taW5hdG9yID0gMTsKIAotCUpPVCg4LCAidXNlciBpcyB0b2xkOiAlaXglaVxuIiwgcGVhc3ljYXAtPndpZHRoLCBwZWFzeWNhcC0+aGVpZ2h0KTsKKwlKT00oOCwgInVzZXIgaXMgdG9sZDogJWl4JWlcbiIsIHBlYXN5Y2FwLT53aWR0aCwgcGVhc3ljYXAtPmhlaWdodCk7CiAKIAlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmdjRsMl9jcm9wY2FwLCBcCiAJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9jcm9wY2FwKSkpIHsKLQkJUE9VVDsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJYnJlYWs7CkBAIC0xNDE3LDEzICsxODkzLDE1IEBACiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiBjYXNlIFZJRElPQ19HX0NST1A6CiBjYXNlIFZJRElPQ19TX0NST1A6IHsKLQlKT1QoOCwgIlZJRElPQ19HX0NST1B8VklESU9DX1NfQ1JPUCAgdW5zdXBwb3J0ZWRcbiIpOworCUpPTSg4LCAiVklESU9DX0dfQ1JPUHxWSURJT0NfU19DUk9QICB1bnN1cHBvcnRlZFxuIik7CisJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCXJldHVybiAtRUlOVkFMOwogfQogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogY2FzZSBWSURJT0NfUVVFUllTVEQ6IHsKLQlKT1QoOCwgIlZJRElPQ19RVUVSWVNURDogIiBcCisJSk9NKDgsICJWSURJT0NfUVVFUllTVEQ6ICIgXAogCQkJIkVhc3lDQVAgaXMgaW5jYXBhYmxlIG9mIGRldGVjdGluZyBzdGFuZGFyZFxuIik7CisJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCXJldHVybiAtRUlOVkFMOwogCWJyZWFrOwogfQpAQCAtMTQzNiwxNiArMTkxNCwxNiBAQAogICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBjYXNlIFZJRElPQ19FTlVNU1REOiB7Ci0Jc3RhdGljIGludCBsYXN0MCA9IC0xLCBsYXN0MSA9IC0xLCBsYXN0MiA9IC0xLCBsYXN0MyA9IC0xOwotCXN0YXRpYyBzdHJ1Y3QgdjRsMl9zdGFuZGFyZCB2NGwyX3N0YW5kYXJkOwotCXN0YXRpYyBfX3UzMiBpbmRleDsKLQlzdGF0aWMgc3RydWN0IGVhc3ljYXBfc3RhbmRhcmQgY29uc3QgKnBlYXN5Y2FwX3N0YW5kYXJkOworCWludCBsYXN0MCA9IC0xLCBsYXN0MSA9IC0xLCBsYXN0MiA9IC0xLCBsYXN0MyA9IC0xOworCXN0cnVjdCB2NGwyX3N0YW5kYXJkIHY0bDJfc3RhbmRhcmQ7CisJX191MzIgaW5kZXg7CisJc3RydWN0IGVhc3ljYXBfc3RhbmRhcmQgY29uc3QgKnBlYXN5Y2FwX3N0YW5kYXJkOwogCi0JSk9UKDgsICJWSURJT0NfRU5VTVNURFxuIik7CisJSk9NKDgsICJWSURJT0NfRU5VTVNURFxuIik7CiAKIAlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmdjRsMl9zdGFuZGFyZCwgKHZvaWQgX191c2VyICopYXJnLCBcCiAJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9zdGFuZGFyZCkpKSB7Ci0JCVBPVVQ7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCWluZGV4ID0gdjRsMl9zdGFuZGFyZC5pbmRleDsKQEAgLTE0NjYsMTAgKzE5NDQsMTEgQEAKIAkJcGVhc3ljYXBfc3RhbmRhcmQrKzsKIAl9CiAJaWYgKDB4RkZGRiA9PSBwZWFzeWNhcF9zdGFuZGFyZC0+bWFzaykgewotCQlKT1QoOCwgIiVpPWluZGV4OiBleGhhdXN0cyBzdGFuZGFyZHNcbiIsIGluZGV4KTsKKwkJSk9NKDgsICIlaT1pbmRleDogZXhoYXVzdHMgc3RhbmRhcmRzXG4iLCBpbmRleCk7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCUpPVCg4LCAiJWk9aW5kZXg6ICVzXG4iLCBpbmRleCwgXAorCUpPTSg4LCAiJWk9aW5kZXg6ICVzXG4iLCBpbmRleCwgXAogCQkJCSYocGVhc3ljYXBfc3RhbmRhcmQtPnY0bDJfc3RhbmRhcmQubmFtZVswXSkpOwogCW1lbWNweSgmdjRsMl9zdGFuZGFyZCwgJihwZWFzeWNhcF9zdGFuZGFyZC0+djRsMl9zdGFuZGFyZCksIFwKIAkJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX3N0YW5kYXJkKSk7CkBAIC0xNDc4LDg3ICsxOTU3LDEwMSBAQAogCiAJaWYgKDAgIT0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnY0bDJfc3RhbmRhcmQsIFwKIAkJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX3N0YW5kYXJkKSkpIHsKLQkJUE9VVDsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJYnJlYWs7CiB9CiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiBjYXNlIFZJRElPQ19HX1NURDogewotCXN0YXRpYyB2NGwyX3N0ZF9pZCBzdGRfaWQ7Ci0Jc3RhdGljIHN0cnVjdCBlYXN5Y2FwX3N0YW5kYXJkIGNvbnN0ICpwZWFzeWNhcF9zdGFuZGFyZDsKKwl2NGwyX3N0ZF9pZCBzdGRfaWQ7CisJc3RydWN0IGVhc3ljYXBfc3RhbmRhcmQgY29uc3QgKnBlYXN5Y2FwX3N0YW5kYXJkOwogCi0JSk9UKDgsICJWSURJT0NfR19TVERcbiIpOworCUpPTSg4LCAiVklESU9DX0dfU1REXG4iKTsKKworCWlmICgwID4gcGVhc3ljYXAtPnN0YW5kYXJkX29mZnNldCkgeworCQlKT00oOCwgIiVpPXBlYXN5Y2FwLT5zdGFuZGFyZF9vZmZzZXRcbiIsIFwKKwkJCQkJcGVhc3ljYXAtPnN0YW5kYXJkX29mZnNldCk7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CiAKIAlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmc3RkX2lkLCAodm9pZCBfX3VzZXIgKilhcmcsIFwKIAkJCQkJCXNpemVvZih2NGwyX3N0ZF9pZCkpKSB7Ci0JCVBPVVQ7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCiAJcGVhc3ljYXBfc3RhbmRhcmQgPSAmZWFzeWNhcF9zdGFuZGFyZFtwZWFzeWNhcC0+c3RhbmRhcmRfb2Zmc2V0XTsKIAlzdGRfaWQgPSBwZWFzeWNhcF9zdGFuZGFyZC0+djRsMl9zdGFuZGFyZC5pZDsKIAotCUpPVCg4LCAidXNlciBpcyB0b2xkOiAlc1xuIiwgXAorCUpPTSg4LCAidXNlciBpcyB0b2xkOiAlc1xuIiwgXAogCQkJCSZwZWFzeWNhcF9zdGFuZGFyZC0+djRsMl9zdGFuZGFyZC5uYW1lWzBdKTsKIAogCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZzdGRfaWQsIFwKIAkJCQkJCXNpemVvZih2NGwyX3N0ZF9pZCkpKSB7Ci0JCVBPVVQ7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCWJyZWFrOwogfQogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogY2FzZSBWSURJT0NfU19TVEQ6IHsKLQlzdGF0aWMgdjRsMl9zdGRfaWQgc3RkX2lkOwotCXN0YXRpYyBpbnQgcmM7CisJdjRsMl9zdGRfaWQgc3RkX2lkOworCWludCByYzsKIAotCUpPVCg4LCAiVklESU9DX1NfU1REXG4iKTsKKwlKT00oOCwgIlZJRElPQ19TX1NURFxuIik7CiAKIAlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmc3RkX2lkLCAodm9pZCBfX3VzZXIgKilhcmcsIFwKIAkJCQkJCXNpemVvZih2NGwyX3N0ZF9pZCkpKSB7Ci0JCVBPVVQ7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCisJSk9NKDgsICJVc2VyIHJlcXVlc3RzIHN0YW5kYXJkOiAweCUwOFglMDhYXG4iLCBcCisJCShpbnQpKChzdGRfaWQgJiAoKCh2NGwyX3N0ZF9pZCkweEZGRkZGRkZGKSA8PCAzMikpID4+IDMyKSwgXAorCQkoaW50KShzdGRfaWQgJiAoKHY0bDJfc3RkX2lkKTB4RkZGRkZGRkYpKSk7CisKIAlyYyA9IGFkanVzdF9zdGFuZGFyZChwZWFzeWNhcCwgc3RkX2lkKTsKIAlpZiAoMCA+IHJjKSB7Ci0JCUpPVCg4LCAiV0FSTklORzogYWRqdXN0X3N0YW5kYXJkKCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKKwkJSk9NKDgsICJXQVJOSU5HOiBhZGp1c3Rfc3RhbmRhcmQoKSByZXR1cm5lZCAlaVxuIiwgcmMpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAlicmVhazsKIH0KIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIGNhc2UgVklESU9DX1JFUUJVRlM6IHsKLQlzdGF0aWMgaW50IG5idWZmZXJzOwotCXN0YXRpYyBzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyB2NGwyX3JlcXVlc3RidWZmZXJzOworCWludCBuYnVmZmVyczsKKwlzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyB2NGwyX3JlcXVlc3RidWZmZXJzOwogCi0JSk9UKDgsICJWSURJT0NfUkVRQlVGU1xuIik7CisJSk9NKDgsICJWSURJT0NfUkVRQlVGU1xuIik7CiAKIAlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmdjRsMl9yZXF1ZXN0YnVmZmVycywgKHZvaWQgX191c2VyICopYXJnLCBcCiAJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzKSkpIHsKLQkJUE9VVDsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKLQlpZiAodjRsMl9yZXF1ZXN0YnVmZmVycy50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwlpZiAodjRsMl9yZXF1ZXN0YnVmZmVycy50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkgeworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUlOVkFMOworCX0KIAlpZiAodjRsMl9yZXF1ZXN0YnVmZmVycy5tZW1vcnkgIT0gVjRMMl9NRU1PUllfTU1BUCkgewotCQlQT1VUOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAluYnVmZmVycyA9IHY0bDJfcmVxdWVzdGJ1ZmZlcnMuY291bnQ7Ci0JSk9UKDgsICIgICAgICAgICAgICAgICAgICAgVXNlciByZXF1ZXN0cyAlaSBidWZmZXJzIC4uLlxuIiwgbmJ1ZmZlcnMpOworCUpPTSg4LCAiICAgICAgICAgICAgICAgICAgIFVzZXIgcmVxdWVzdHMgJWkgYnVmZmVycyAuLi5cbiIsIG5idWZmZXJzKTsKIAlpZiAobmJ1ZmZlcnMgPCAyKQogCQluYnVmZmVycyA9IDI7CiAJaWYgKG5idWZmZXJzID4gRlJBTUVfQlVGRkVSX01BTlkpCiAJCW5idWZmZXJzID0gRlJBTUVfQlVGRkVSX01BTlk7CiAJaWYgKHY0bDJfcmVxdWVzdGJ1ZmZlcnMuY291bnQgPT0gbmJ1ZmZlcnMpIHsKLQkJSk9UKDgsICIgICAgICAgICAgICAgICAgICAgLi4uIGFncmVlIHRvICAlaSBidWZmZXJzXG4iLCBcCisJCUpPTSg4LCAiICAgICAgICAgICAgICAgICAgIC4uLiBhZ3JlZSB0byAgJWkgYnVmZmVyc1xuIiwgXAogCQkJCQkJCQluYnVmZmVycyk7CiAJfSBlbHNlIHsKLQkJSk9UKDgsICIgICAgICAgICAgICAgICAgICAuLi4gaW5zaXN0IG9uICAlaSBidWZmZXJzXG4iLCBcCisJCUpPTSg4LCAiICAgICAgICAgICAgICAgICAgLi4uIGluc2lzdCBvbiAgJWkgYnVmZmVyc1xuIiwgXAogCQkJCQkJCQluYnVmZmVycyk7CiAJCXY0bDJfcmVxdWVzdGJ1ZmZlcnMuY291bnQgPSBuYnVmZmVyczsKIAl9CkBAIC0xNTY2LDMyICsyMDU5LDM1IEBACiAKIAlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmdjRsMl9yZXF1ZXN0YnVmZmVycywgXAogCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycykpKSB7Ci0JCVBPVVQ7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCWJyZWFrOwogfQogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogY2FzZSBWSURJT0NfUVVFUllCVUY6IHsKLQlzdGF0aWMgX191MzIgaW5kZXg7Ci0Jc3RhdGljIHN0cnVjdCB2NGwyX2J1ZmZlciB2NGwyX2J1ZmZlcjsKKwlfX3UzMiBpbmRleDsKKwlzdHJ1Y3QgdjRsMl9idWZmZXIgdjRsMl9idWZmZXI7CiAKLQlKT1QoOCwgIlZJRElPQ19RVUVSWUJVRlxuIik7CisJSk9NKDgsICJWSURJT0NfUVVFUllCVUZcbiIpOwogCiAJaWYgKHBlYXN5Y2FwLT52aWRlb19lb2YpIHsKLQkJSk9UKDgsICJyZXR1cm5pbmcgLTEgYmVjYXVzZSAgJWk9dmlkZW9fZW9mXG4iLCBcCisJCUpPTSg4LCAicmV0dXJuaW5nIC1FSU8gYmVjYXVzZSAgJWk9dmlkZW9fZW9mXG4iLCBcCiAJCQkJCQkJcGVhc3ljYXAtPnZpZGVvX2VvZik7Ci0JCXJldHVybiAtMTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOworCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmdjRsMl9idWZmZXIsICh2b2lkIF9fdXNlciAqKWFyZywgXAogCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfYnVmZmVyKSkpIHsKLQkJUE9VVDsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKLQlpZiAodjRsMl9idWZmZXIudHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJaWYgKHY0bDJfYnVmZmVyLnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKSB7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FSU5WQUw7CisJfQogCWluZGV4ID0gdjRsMl9idWZmZXIuaW5kZXg7CiAJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBwZWFzeWNhcC0+ZnJhbWVfYnVmZmVyX21hbnkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTYwMiw0OSArMjA5OCw1NSBAQAogCXY0bDJfYnVmZmVyLmZsYWdzID0gVjRMMl9CVUZfRkxBR19NQVBQRUQgfCBcCiAJCQkJCQlwZWFzeWNhcC0+ZG9uZVtpbmRleF0gfCBcCiAJCQkJCQlwZWFzeWNhcC0+cXVldWVkW2luZGV4XTsKLQl2NGwyX2J1ZmZlci5maWVsZCA9IHBlYXN5Y2FwLT5maWVsZDsKKwl2NGwyX2J1ZmZlci5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKIAl2NGwyX2J1ZmZlci5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOwogCXY0bDJfYnVmZmVyLm0ub2Zmc2V0ID0gaW5kZXggKiBGUkFNRV9CVUZGRVJfU0laRTsKIAl2NGwyX2J1ZmZlci5sZW5ndGggPSBGUkFNRV9CVUZGRVJfU0laRTsKIAotCUpPVCgxNiwgIiAgJTEwaT1pbmRleFxuIiwgdjRsMl9idWZmZXIuaW5kZXgpOwotCUpPVCgxNiwgIiAgMHglMDhYPXR5cGVcbiIsIHY0bDJfYnVmZmVyLnR5cGUpOwotCUpPVCgxNiwgIiAgJTEwaT1ieXRlc3VzZWRcbiIsIHY0bDJfYnVmZmVyLmJ5dGVzdXNlZCk7Ci0JSk9UKDE2LCAiICAweCUwOFg9ZmxhZ3NcbiIsIHY0bDJfYnVmZmVyLmZsYWdzKTsKLQlKT1QoMTYsICIgICUxMGk9ZmllbGRcbiIsIHY0bDJfYnVmZmVyLmZpZWxkKTsKLQlKT1QoMTYsICIgICUxMGxpPXRpbWVzdGFtcC50dl91c2VjXG4iLCBcCisJSk9NKDE2LCAiICAlMTBpPWluZGV4XG4iLCB2NGwyX2J1ZmZlci5pbmRleCk7CisJSk9NKDE2LCAiICAweCUwOFg9dHlwZVxuIiwgdjRsMl9idWZmZXIudHlwZSk7CisJSk9NKDE2LCAiICAlMTBpPWJ5dGVzdXNlZFxuIiwgdjRsMl9idWZmZXIuYnl0ZXN1c2VkKTsKKwlKT00oMTYsICIgIDB4JTA4WD1mbGFnc1xuIiwgdjRsMl9idWZmZXIuZmxhZ3MpOworCUpPTSgxNiwgIiAgJTEwaT1maWVsZFxuIiwgdjRsMl9idWZmZXIuZmllbGQpOworCUpPTSgxNiwgIiAgJTEwbGk9dGltZXN0YW1wLnR2X3VzZWNcbiIsIFwKIAkJCQkJIChsb25nKXY0bDJfYnVmZmVyLnRpbWVzdGFtcC50dl91c2VjKTsKLQlKT1QoMTYsICIgICUxMGk9c2VxdWVuY2VcbiIsIHY0bDJfYnVmZmVyLnNlcXVlbmNlKTsKLQlKT1QoMTYsICIgIDB4JTA4WD1tZW1vcnlcbiIsIHY0bDJfYnVmZmVyLm1lbW9yeSk7Ci0JSk9UKDE2LCAiICAlMTBpPW0ub2Zmc2V0XG4iLCB2NGwyX2J1ZmZlci5tLm9mZnNldCk7Ci0JSk9UKDE2LCAiICAlMTBpPWxlbmd0aFxuIiwgdjRsMl9idWZmZXIubGVuZ3RoKTsKKwlKT00oMTYsICIgICUxMGk9c2VxdWVuY2VcbiIsIHY0bDJfYnVmZmVyLnNlcXVlbmNlKTsKKwlKT00oMTYsICIgIDB4JTA4WD1tZW1vcnlcbiIsIHY0bDJfYnVmZmVyLm1lbW9yeSk7CisJSk9NKDE2LCAiICAlMTBpPW0ub2Zmc2V0XG4iLCB2NGwyX2J1ZmZlci5tLm9mZnNldCk7CisJSk9NKDE2LCAiICAlMTBpPWxlbmd0aFxuIiwgdjRsMl9idWZmZXIubGVuZ3RoKTsKIAogCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZ2NGwyX2J1ZmZlciwgXAogCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfYnVmZmVyKSkpIHsKLQkJUE9VVDsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJYnJlYWs7CiB9CiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiBjYXNlIFZJRElPQ19RQlVGOiB7Ci0Jc3RhdGljIHN0cnVjdCB2NGwyX2J1ZmZlciB2NGwyX2J1ZmZlcjsKKwlzdHJ1Y3QgdjRsMl9idWZmZXIgdjRsMl9idWZmZXI7CiAKLQlKT1QoOCwgIlZJRElPQ19RQlVGXG4iKTsKKwlKT00oOCwgIlZJRElPQ19RQlVGXG4iKTsKIAogCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZ2NGwyX2J1ZmZlciwgKHZvaWQgX191c2VyICopYXJnLCBcCiAJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9idWZmZXIpKSkgewotCQlQT1VUOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAotCWlmICh2NGwyX2J1ZmZlci50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwlpZiAodjRsMl9idWZmZXIudHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpIHsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAodjRsMl9idWZmZXIubWVtb3J5ICE9IFY0TDJfTUVNT1JZX01NQVApCisJfQorCWlmICh2NGwyX2J1ZmZlci5tZW1vcnkgIT0gVjRMMl9NRU1PUllfTU1BUCkgeworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUlOVkFMOworCX0KIAlpZiAodjRsMl9idWZmZXIuaW5kZXggPCAwIHx8IFwKLQkJICh2NGwyX2J1ZmZlci5pbmRleCA+PSBwZWFzeWNhcC0+ZnJhbWVfYnVmZmVyX21hbnkpKQorCQkgKHY0bDJfYnVmZmVyLmluZGV4ID49IHBlYXN5Y2FwLT5mcmFtZV9idWZmZXJfbWFueSkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAJdjRsMl9idWZmZXIuZmxhZ3MgPSBWNEwyX0JVRl9GTEFHX01BUFBFRCB8IFY0TDJfQlVGX0ZMQUdfUVVFVUVEOwogCiAJcGVhc3ljYXAtPmRvbmVbdjRsMl9idWZmZXIuaW5kZXhdICAgPSAwOwpAQCAtMTY1MiwxMSArMjE1NCwxMSBAQAogCiAJaWYgKDAgIT0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnY0bDJfYnVmZmVyLCBcCiAJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9idWZmZXIpKSkgewotCQlQT1VUOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAotCUpPVCg4LCAiLi4uLi4gICB1c2VyIHF1ZXVlaW5nIGZyYW1lIGJ1ZmZlciAlaVxuIiwgXAorCUpPTSg4LCAiLi4uLi4gICB1c2VyIHF1ZXVlaW5nIGZyYW1lIGJ1ZmZlciAlaVxuIiwgXAogCQkJCQkJKGludCl2NGwyX2J1ZmZlci5pbmRleCk7CiAKIAlwZWFzeWNhcC0+ZnJhbWVfbG9jayA9IDA7CkBAIC0xNjY3LDM2ICsyMTY5LDYwIEBACiBjYXNlIFZJRElPQ19EUUJVRjoKIAl7CiAjaWYgZGVmaW5lZChBVURJT1RJTUUpCi0Jc3RhdGljIHN0cnVjdCBzaWduZWRfZGl2X3Jlc3VsdCBzZHI7Ci0Jc3RhdGljIGxvbmcgbG9uZyBpbnQgYWJvdmUsIGJlbG93LCBkbmJ5ZHQsIGZ1ZGdlLCBzbGw7Ci0Jc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgdWxsOwotCXN0YXRpYyBzdHJ1Y3QgdGltZXZhbCB0aW1ldmFsMDsKKwlzdHJ1Y3Qgc2lnbmVkX2Rpdl9yZXN1bHQgc2RyOworCWxvbmcgbG9uZyBpbnQgYWJvdmUsIGJlbG93LCBkbmJ5ZHQsIGZ1ZGdlLCBzbGw7CisJdW5zaWduZWQgbG9uZyBsb25nIGludCB1bGw7CisJc3RydWN0IHRpbWV2YWwgdGltZXZhbDg7CiAJc3RydWN0IHRpbWV2YWwgdGltZXZhbDE7CiAjZW5kaWYgLypBVURJT1RJTUUqLwotCXN0YXRpYyBzdHJ1Y3QgdGltZXZhbCB0aW1ldmFsLCB0aW1ldmFsMjsKLQlzdGF0aWMgaW50IGksIGo7Ci0Jc3RhdGljIHN0cnVjdCB2NGwyX2J1ZmZlciB2NGwyX2J1ZmZlcjsKKwlzdHJ1Y3QgdGltZXZhbCB0aW1ldmFsLCB0aW1ldmFsMjsKKwlpbnQgaSwgajsKKwlzdHJ1Y3QgdjRsMl9idWZmZXIgdjRsMl9idWZmZXI7CisJaW50IHJjZHE7CisJX191MTYgaW5wdXQ7CiAKLQlKT1QoOCwgIlZJRElPQ19EUUJVRlxuIik7CisJSk9NKDgsICJWSURJT0NfRFFCVUZcbiIpOwogCiAJaWYgKChwZWFzeWNhcC0+dmlkZW9faWRsZSkgfHwgKHBlYXN5Y2FwLT52aWRlb19lb2YpKSB7Ci0JCUpPVCg4LCAicmV0dXJuaW5nIC1FSU8gYmVjYXVzZSAgIiBcCisJCUpPTSg4LCAicmV0dXJuaW5nIC1FSU8gYmVjYXVzZSAgIiBcCiAJCQkJIiVpPXZpZGVvX2lkbGUgICVpPXZpZGVvX2VvZlxuIiwgXAogCQkJCXBlYXN5Y2FwLT52aWRlb19pZGxlLCBwZWFzeWNhcC0+dmlkZW9fZW9mKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmdjRsMl9idWZmZXIsICh2b2lkIF9fdXNlciAqKWFyZywgXAogCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfYnVmZmVyKSkpIHsKLQkJUE9VVDsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKLQlpZiAodjRsMl9idWZmZXIudHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJaWYgKHY0bDJfYnVmZmVyLnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKSB7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHRydWUgPT0gcGVhc3ljYXAtPm9mZmVyZmllbGRzKSB7CisJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCQkvKgorCQkgKiAgSU4gSVRTIDUwICJmcHMiIE1PREUgdHZ0aW1lIFNFRU1TIEFMV0FZUyBUTyBSRVFVRVNUCisJCSAqICBWNEwyX0ZJRUxEX0JPVFRPTQorCQkqLworCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkJaWYgKFY0TDJfRklFTERfVE9QID09IHY0bDJfYnVmZmVyLmZpZWxkKQorCQkJSk9NKDgsICJ1c2VyIHdhbnRzIFY0TDJfRklFTERfVE9QXG4iKTsKKwkJZWxzZSBpZiAoVjRMMl9GSUVMRF9CT1RUT00gPT0gdjRsMl9idWZmZXIuZmllbGQpCisJCQlKT00oOCwgInVzZXIgd2FudHMgVjRMMl9GSUVMRF9CT1RUT01cbiIpOworCQllbHNlIGlmIChWNEwyX0ZJRUxEX0FOWSA9PSB2NGwyX2J1ZmZlci5maWVsZCkKKwkJCUpPTSg4LCAidXNlciB3YW50cyBWNEwyX0ZJRUxEX0FOWVxuIik7CisJCWVsc2UKKwkJCUpPTSg4LCAidXNlciB3YW50cyBWNEwyX0ZJRUxEXy4uLlVOS05PV046ICVpXG4iLCBcCisJCQkJCQkJdjRsMl9idWZmZXIuZmllbGQpOworCX0KIAogCWlmICghcGVhc3ljYXAtPnZpZGVvX2lzb2Nfc3RyZWFtaW5nKSB7Ci0JCUpPVCgxNiwgInJldHVybmluZyAtRUlPIGJlY2F1c2UgdmlkZW8gdXJicyBub3Qgc3RyZWFtaW5nXG4iKTsKKwkJSk9NKDE2LCAicmV0dXJuaW5nIC1FSU8gYmVjYXVzZSB2aWRlbyB1cmJzIG5vdCBzdHJlYW1pbmdcbiIpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUlPOwogCX0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTE3MDgsMTkgKzIyMzQsMjggQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogCWlmICghcGVhc3ljYXAtPnBvbGxlZCkgewotCQlpZiAoLUVJTyA9PSBlYXN5Y2FwX2RxYnVmKHBlYXN5Y2FwLCAwKSkKLQkJCXJldHVybiAtRUlPOworCQlkbyB7CisJCQlyY2RxID0gZWFzeWNhcF9kcWJ1ZihwZWFzeWNhcCwgMCk7CisJCQlpZiAoLUVJTyA9PSByY2RxKSB7CisJCQkJSk9NKDgsICJyZXR1cm5pbmcgLUVJTyBiZWNhdXNlICIgXAorCQkJCQkJImRxYnVmKCkgcmV0dXJuZWQgLUVJT1xuIik7CisJCQkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQl9IHdoaWxlICgwICE9IHJjZHEpOwogCX0gZWxzZSB7Ci0JCWlmIChwZWFzeWNhcC0+dmlkZW9fZW9mKQorCQlpZiAocGVhc3ljYXAtPnZpZGVvX2VvZikgeworCQkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQkJcmV0dXJuIC1FSU87CisJCX0KIAl9CiAJaWYgKFY0TDJfQlVGX0ZMQUdfRE9ORSAhPSBwZWFzeWNhcC0+ZG9uZVtwZWFzeWNhcC0+ZnJhbWVfcmVhZF0pIHsKLQkJU0FZKCJFUlJPUjogVjRMMl9CVUZfRkxBR19ET05FICE9IDB4JTA4WFxuIiwgXAorCQlTQU0oIkVSUk9SOiBWNEwyX0JVRl9GTEFHX0RPTkUgIT0gMHglMDhYXG4iLCBcCiAJCQkJCXBlYXN5Y2FwLT5kb25lW3BlYXN5Y2FwLT5mcmFtZV9yZWFkXSk7CiAJfQogCXBlYXN5Y2FwLT5wb2xsZWQgPSAwOwogCi0JaWYgKCEoaXNlcXVlbmNlICUgMTApKSB7CisJaWYgKCEocGVhc3ljYXAtPmlzZXF1ZW5jZSAlIDEwKSkgewogCQlmb3IgKGkgPSAwOyBpIDwgMTc5OyBpKyspCiAJCQlwZWFzeWNhcC0+bWVyaXRbaV0gPSBwZWFzeWNhcC0+bWVyaXRbaSsxXTsKIAkJcGVhc3ljYXAtPm1lcml0WzE3OV0gPSBtZXJpdF9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKQEAgLTE3MjgsNyArMjI2Myw3IEBACiAJCWZvciAoaSA9IDA7IGkgPCAxODA7IGkrKykKIAkJCWogKz0gcGVhc3ljYXAtPm1lcml0W2ldOwogCQlpZiAoOTAgPCBqKSB7Ci0JCQlTQVkoImVhc3ljYXAgZHJpdmVyIHNodXR0aW5nIGRvd24gIiBcCisJCQlTQU0oImVhc3ljYXAgZHJpdmVyIHNodXR0aW5nIGRvd24gIiBcCiAJCQkJCQkJIm9uIGNvbmRpdGlvbiBibHVlXG4iKTsKIAkJCXBlYXN5Y2FwLT52aWRlb19lb2YgPSAxOyBwZWFzeWNhcC0+YXVkaW9fZW9mID0gMTsKIAkJfQpAQCAtMTczOCwzMSArMjI3MywyMyBAQAogCXY0bDJfYnVmZmVyLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CiAJdjRsMl9idWZmZXIuYnl0ZXN1c2VkID0gcGVhc3ljYXAtPmZyYW1lX2J1ZmZlcl91c2VkOwogCXY0bDJfYnVmZmVyLmZsYWdzID0gVjRMMl9CVUZfRkxBR19NQVBQRUQgfCBWNEwyX0JVRl9GTEFHX0RPTkU7Ci0JdjRsMl9idWZmZXIuZmllbGQgPSAgcGVhc3ljYXAtPmZpZWxkOwotCWlmIChWNEwyX0ZJRUxEX0FMVEVSTkFURSA9PSB2NGwyX2J1ZmZlci5maWVsZCkKLQkJdjRsMl9idWZmZXIuZmllbGQgPSBcCi0JCQkJMHgwMDBGICYgKHBlYXN5Y2FwLT5cCi0JCQkJZnJhbWVfYnVmZmVyW3BlYXN5Y2FwLT5mcmFtZV9yZWFkXVswXS5rb3VudCk7CisJaWYgKHRydWUgPT0gcGVhc3ljYXAtPm9mZmVyZmllbGRzKQorCQl2NGwyX2J1ZmZlci5maWVsZCA9IFY0TDJfRklFTERfQk9UVE9NOworCWVsc2UKKwkJdjRsMl9idWZmZXIuZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CiAJZG9fZ2V0dGltZW9mZGF5KCZ0aW1ldmFsKTsKIAl0aW1ldmFsMiA9IHRpbWV2YWw7CiAKICNpZiBkZWZpbmVkKEFVRElPVElNRSkKIAlpZiAoIXBlYXN5Y2FwLT50aW1ldmFsMC50dl9zZWMpIHsKLQkJdGltZXZhbDAgPSB0aW1ldmFsOworCQl0aW1ldmFsOCA9IHRpbWV2YWw7CiAJCXRpbWV2YWwxID0gdGltZXZhbDsKIAkJdGltZXZhbDIgPSB0aW1ldmFsOwogCQlkbmJ5ZHQgPSAxOTIwMDA7Ci0KLQkJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmKHBlYXN5Y2FwLT5tdXRleF90aW1ldmFsMCkpKQotCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQkJcGVhc3ljYXAtPnRpbWV2YWwwID0gdGltZXZhbDA7Ci0JCW11dGV4X3VubG9jaygmKHBlYXN5Y2FwLT5tdXRleF90aW1ldmFsMCkpOworCQlwZWFzeWNhcC0+dGltZXZhbDAgPSB0aW1ldmFsODsKIAl9IGVsc2UgewotCQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCYocGVhc3ljYXAtPm11dGV4X3RpbWV2YWwxKSkpCi0JCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCQlkbmJ5ZHQgPSBwZWFzeWNhcC0+ZG5ieWR0OwogCQl0aW1ldmFsMSA9IHBlYXN5Y2FwLT50aW1ldmFsMTsKLQkJbXV0ZXhfdW5sb2NrKCYocGVhc3ljYXAtPm11dGV4X3RpbWV2YWwxKSk7CiAJCWFib3ZlID0gZG5ieWR0ICogTUlDUk9TRUNPTkRTKHRpbWV2YWwsIHRpbWV2YWwxKTsKIAkJYmVsb3cgPSAxOTIwMDA7CiAJCXNkciA9IHNpZ25lZF9kaXYoYWJvdmUsIGJlbG93KTsKQEAgLTE3NzQsNzIgKzIzMDEsNzYgQEAKIAkJdGltZXZhbDIudHZfdXNlYyA9IHNkci5yZW1haW5kZXI7CiAJCXRpbWV2YWwyLnR2X3NlYyA9IHRpbWV2YWwxLnR2X3NlYyArIHNkci5xdW90aWVudDsKIAl9Ci0JaWYgKCEoaXNlcXVlbmNlICUgNTAwKSkgeworCWlmICghKHBlYXN5Y2FwLT5pc2VxdWVuY2UgJSA1MDApKSB7CiAJCWZ1ZGdlID0gKChsb25nIGxvbmcgaW50KSgxMDAwMDAwKSkgKiBcCiAJCQkJKChsb25nIGxvbmcgaW50KSh0aW1ldmFsLnR2X3NlYyAtIFwKIAkJCQkJCXRpbWV2YWwyLnR2X3NlYykpICsgXAogCQkJCShsb25nIGxvbmcgaW50KSh0aW1ldmFsLnR2X3VzZWMgLSBcCi0JCQkJdGltZXZhbDIudHZfdXNlYyk7CisJCQkJCQl0aW1ldmFsMi50dl91c2VjKTsKIAkJc2RyID0gc2lnbmVkX2RpdihmdWRnZSwgMTAwMCk7CiAJCXNsbCA9IHNkci5xdW90aWVudDsKIAkJdWxsID0gc2RyLnJlbWFpbmRlcjsKIAotCQlTQVkoIiU1bGxpLiUtM2xsaT1tcyB0aW1lc3RhbXAgZnVkZ2VcbiIsIHNsbCwgdWxsKTsKKwkJU0FNKCIlNWxsaS4lLTNsbGk9bXMgdGltZXN0YW1wIGZ1ZGdlXG4iLCBzbGwsIHVsbCk7CiAJfQogI2VuZGlmIC8qQVVESU9USU1FKi8KIAogCXY0bDJfYnVmZmVyLnRpbWVzdGFtcCA9IHRpbWV2YWwyOwotCXY0bDJfYnVmZmVyLnNlcXVlbmNlID0gaXNlcXVlbmNlKys7CisJdjRsMl9idWZmZXIuc2VxdWVuY2UgPSBwZWFzeWNhcC0+aXNlcXVlbmNlKys7CiAJdjRsMl9idWZmZXIubWVtb3J5ID0gVjRMMl9NRU1PUllfTU1BUDsKIAl2NGwyX2J1ZmZlci5tLm9mZnNldCA9IHY0bDJfYnVmZmVyLmluZGV4ICogRlJBTUVfQlVGRkVSX1NJWkU7CiAJdjRsMl9idWZmZXIubGVuZ3RoID0gRlJBTUVfQlVGRkVSX1NJWkU7CiAKLQlKT1QoMTYsICIgICUxMGk9aW5kZXhcbiIsIHY0bDJfYnVmZmVyLmluZGV4KTsKLQlKT1QoMTYsICIgIDB4JTA4WD10eXBlXG4iLCB2NGwyX2J1ZmZlci50eXBlKTsKLQlKT1QoMTYsICIgICUxMGk9Ynl0ZXN1c2VkXG4iLCB2NGwyX2J1ZmZlci5ieXRlc3VzZWQpOwotCUpPVCgxNiwgIiAgMHglMDhYPWZsYWdzXG4iLCB2NGwyX2J1ZmZlci5mbGFncyk7Ci0JSk9UKDE2LCAiICAlMTBpPWZpZWxkXG4iLCB2NGwyX2J1ZmZlci5maWVsZCk7Ci0JSk9UKDE2LCAiICAlMTBsaT10aW1lc3RhbXAudHZfdXNlY1xuIiwgXAorCUpPTSgxNiwgIiAgJTEwaT1pbmRleFxuIiwgdjRsMl9idWZmZXIuaW5kZXgpOworCUpPTSgxNiwgIiAgMHglMDhYPXR5cGVcbiIsIHY0bDJfYnVmZmVyLnR5cGUpOworCUpPTSgxNiwgIiAgJTEwaT1ieXRlc3VzZWRcbiIsIHY0bDJfYnVmZmVyLmJ5dGVzdXNlZCk7CisJSk9NKDE2LCAiICAweCUwOFg9ZmxhZ3NcbiIsIHY0bDJfYnVmZmVyLmZsYWdzKTsKKwlKT00oMTYsICIgICUxMGk9ZmllbGRcbiIsIHY0bDJfYnVmZmVyLmZpZWxkKTsKKwlKT00oMTYsICIgICUxMGxpPXRpbWVzdGFtcC50dl9zZWNcbiIsIFwKKwkJCQkJKGxvbmcpdjRsMl9idWZmZXIudGltZXN0YW1wLnR2X3NlYyk7CisJSk9NKDE2LCAiICAlMTBsaT10aW1lc3RhbXAudHZfdXNlY1xuIiwgXAogCQkJCQkobG9uZyl2NGwyX2J1ZmZlci50aW1lc3RhbXAudHZfdXNlYyk7Ci0JSk9UKDE2LCAiICAlMTBpPXNlcXVlbmNlXG4iLCB2NGwyX2J1ZmZlci5zZXF1ZW5jZSk7Ci0JSk9UKDE2LCAiICAweCUwOFg9bWVtb3J5XG4iLCB2NGwyX2J1ZmZlci5tZW1vcnkpOwotCUpPVCgxNiwgIiAgJTEwaT1tLm9mZnNldFxuIiwgdjRsMl9idWZmZXIubS5vZmZzZXQpOwotCUpPVCgxNiwgIiAgJTEwaT1sZW5ndGhcbiIsIHY0bDJfYnVmZmVyLmxlbmd0aCk7CisJSk9NKDE2LCAiICAlMTBpPXNlcXVlbmNlXG4iLCB2NGwyX2J1ZmZlci5zZXF1ZW5jZSk7CisJSk9NKDE2LCAiICAweCUwOFg9bWVtb3J5XG4iLCB2NGwyX2J1ZmZlci5tZW1vcnkpOworCUpPTSgxNiwgIiAgJTEwaT1tLm9mZnNldFxuIiwgdjRsMl9idWZmZXIubS5vZmZzZXQpOworCUpPTSgxNiwgIiAgJTEwaT1sZW5ndGhcbiIsIHY0bDJfYnVmZmVyLmxlbmd0aCk7CiAKIAlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmdjRsMl9idWZmZXIsIFwKIAkJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9idWZmZXIpKSkgewotCQlQT1VUOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAotCUpPVCg4LCAiLi4uLi4gdXNlciBpcyBvZmZlcmVkIGZyYW1lIGJ1ZmZlciAlaVxuIiwgXAorCWlucHV0ID0gcGVhc3ljYXAtPmZyYW1lX2J1ZmZlcltwZWFzeWNhcC0+ZnJhbWVfcmVhZF1bMF0uaW5wdXQ7CisJaWYgKDB4MDggJiBpbnB1dCkgeworCQlKT00oOCwgInVzZXIgaXMgb2ZmZXJlZCBmcmFtZSBidWZmZXIgJWksIGlucHV0ICVpXG4iLCBcCisJCQkJCXBlYXN5Y2FwLT5mcmFtZV9yZWFkLCAoMHgwNyAmIGlucHV0KSk7CisJfSBlbHNlIHsKKwkJSk9NKDgsICJ1c2VyIGlzIG9mZmVyZWQgZnJhbWUgYnVmZmVyICVpXG4iLCBcCiAJCQkJCQkJcGVhc3ljYXAtPmZyYW1lX3JlYWQpOworCX0KIAlwZWFzeWNhcC0+ZnJhbWVfbG9jayA9IDE7CisJSk9NKDgsICIlaT1wZWFzeWNhcC0+ZnJhbWVfZmlsbFxuIiwgcGVhc3ljYXAtPmZyYW1lX2ZpbGwpOwogCWlmIChwZWFzeWNhcC0+ZnJhbWVfcmVhZCA9PSBwZWFzeWNhcC0+ZnJhbWVfZmlsbCkgewogCQlpZiAocGVhc3ljYXAtPmZyYW1lX2xvY2spIHsKLQkJCUpPVCg4LCAiRVJST1I6ICBmaWxsaW5nIGZyYW1lIGJ1ZmZlciAiIFwKKwkJCUpPTSg4LCAiV09SUlk6ICBmaWxsaW5nIGZyYW1lIGJ1ZmZlciAiIFwKIAkJCQkJCSJ3aGlsZSBvZmZlcmVkIHRvIHVzZXJcbiIpOwogCQl9CiAJfQogCWJyZWFrOwogfQogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoKLSAqICBBVURJTyBVUkJTIEhBVkUgQUxSRUFEWSBCRUVOIFNVQk1JVFRFRCBXSEVOIFRISVMgQ09NTUFORCBJUyBSRUNFSVZFRDsKLSAqICBWSURFTyBVUkJTIEhBVkUgTk9ULgotICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBjYXNlIFZJRElPQ19TVFJFQU1PTjogewotCXN0YXRpYyBpbnQgaTsKKwlpbnQgaTsKIAotCUpPVCg4LCAiVklESU9DX1NUUkVBTU9OXG4iKTsKKwlKT00oOCwgIlZJRElPQ19TVFJFQU1PTlxuIik7CiAKLQlpc2VxdWVuY2UgPSAwOworCXBlYXN5Y2FwLT5pc2VxdWVuY2UgPSAwOwogCWZvciAoaSA9IDA7IGkgPCAxODA7IGkrKykKIAkJcGVhc3ljYXAtPm1lcml0W2ldID0gMDsKIAlpZiAoKHN0cnVjdCB1c2JfZGV2aWNlICopTlVMTCA9PSBwZWFzeWNhcC0+cHVzYl9kZXZpY2UpIHsKLQkJU0FZKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGlzIE5VTExcbiIpOworCQlTQU0oIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCXN1Ym1pdF92aWRlb191cmJzKHBlYXN5Y2FwKTsKQEAgLTE4NTEsMTAgKzIzODIsMTEgQEAKIH0KIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIGNhc2UgVklESU9DX1NUUkVBTU9GRjogewotCUpPVCg4LCAiVklESU9DX1NUUkVBTU9GRlxuIik7CisJSk9NKDgsICJWSURJT0NfU1RSRUFNT0ZGXG4iKTsKIAogCWlmICgoc3RydWN0IHVzYl9kZXZpY2UgKilOVUxMID09IHBlYXN5Y2FwLT5wdXNiX2RldmljZSkgewotCQlTQVkoIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CisJCVNBTSgiRVJST1I6IHBlYXN5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKQEAgLTE4NjYsNyArMjM5OCw3IEBACiAgKiAgVEhFIFVTRVJTUEFDRSBQUk9HUkFNLCBFLkcuIG1wbGF5ZXIsIE1BWSBIQU5HIE9OIEVYSVQuICAgQkVXQVJFLgogICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JSk9UKDgsICJjYWxsaW5nIHdha2VfdXAgb24gd3FfdmlkZW8gYW5kIHdxX2F1ZGlvXG4iKTsKKwlKT00oOCwgImNhbGxpbmcgd2FrZV91cCBvbiB3cV92aWRlbyBhbmQgd3FfYXVkaW9cbiIpOwogCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmKHBlYXN5Y2FwLT53cV92aWRlbykpOwogCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmKHBlYXN5Y2FwLT53cV9hdWRpbykpOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMTg3NCwxMTEgKzI0MDYsMjAwIEBACiB9CiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiBjYXNlIFZJRElPQ19HX1BBUk06IHsKLQlzdGF0aWMgc3RydWN0IHY0bDJfc3RyZWFtcGFybSB2NGwyX3N0cmVhbXBhcm07CisJc3RydWN0IHY0bDJfc3RyZWFtcGFybSAqcHY0bDJfc3RyZWFtcGFybTsKIAotCUpPVCg4LCAiVklESU9DX0dfUEFSTVxuIik7Ci0KLQlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmdjRsMl9zdHJlYW1wYXJtLCAodm9pZCBfX3VzZXIgKilhcmcsIFwKKwlKT00oOCwgIlZJRElPQ19HX1BBUk1cbiIpOworCXB2NGwyX3N0cmVhbXBhcm0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwdjRsMl9zdHJlYW1wYXJtKSB7CisJCVNBTSgiRVJST1I6IG91dCBvZiBtZW1vcnlcbiIpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcihwdjRsMl9zdHJlYW1wYXJtLCAodm9pZCBfX3VzZXIgKilhcmcsIFwKIAkJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX3N0cmVhbXBhcm0pKSkgewotCQlQT1VUOworCQlrZnJlZShwdjRsMl9zdHJlYW1wYXJtKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKLQlpZiAodjRsMl9zdHJlYW1wYXJtLnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKSB7Ci0JCVBPVVQ7CisJaWYgKHB2NGwyX3N0cmVhbXBhcm0tPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKSB7CisJCWtmcmVlKHB2NGwyX3N0cmVhbXBhcm0pOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQl2NGwyX3N0cmVhbXBhcm0ucGFybS5jYXB0dXJlLmNhcGFiaWxpdHkgPSAwOwotCXY0bDJfc3RyZWFtcGFybS5wYXJtLmNhcHR1cmUuY2FwdHVyZW1vZGUgPSAwOwotCXY0bDJfc3RyZWFtcGFybS5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lLm51bWVyYXRvciA9IDE7Ci0JdjRsMl9zdHJlYW1wYXJtLnBhcm0uY2FwdHVyZS50aW1lcGVyZnJhbWUuZGVub21pbmF0b3IgPSAzMDsKLQl2NGwyX3N0cmVhbXBhcm0ucGFybS5jYXB0dXJlLnJlYWRidWZmZXJzID0gcGVhc3ljYXAtPmZyYW1lX2J1ZmZlcl9tYW55OwotCXY0bDJfc3RyZWFtcGFybS5wYXJtLmNhcHR1cmUuZXh0ZW5kZWRtb2RlID0gMDsKLQlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmdjRsMl9zdHJlYW1wYXJtLCBcCisJcHY0bDJfc3RyZWFtcGFybS0+cGFybS5jYXB0dXJlLmNhcGFiaWxpdHkgPSAwOworCXB2NGwyX3N0cmVhbXBhcm0tPnBhcm0uY2FwdHVyZS5jYXB0dXJlbW9kZSA9IDA7CisJcHY0bDJfc3RyZWFtcGFybS0+cGFybS5jYXB0dXJlLnRpbWVwZXJmcmFtZS5udW1lcmF0b3IgPSAxOworCisJaWYgKHBlYXN5Y2FwLT5mcHMpIHsKKwkJcHY0bDJfc3RyZWFtcGFybS0+cGFybS5jYXB0dXJlLnRpbWVwZXJmcmFtZS5cCisJCQkJCQlkZW5vbWluYXRvciA9IHBlYXN5Y2FwLT5mcHM7CisJfSBlbHNlIHsKKwkJaWYgKHRydWUgPT0gcGVhc3ljYXAtPm50c2MpIHsKKwkJCXB2NGwyX3N0cmVhbXBhcm0tPnBhcm0uY2FwdHVyZS50aW1lcGVyZnJhbWUuXAorCQkJCQkJZGVub21pbmF0b3IgPSAzMDsKKwkJfSBlbHNlIHsKKwkJCXB2NGwyX3N0cmVhbXBhcm0tPnBhcm0uY2FwdHVyZS50aW1lcGVyZnJhbWUuXAorCQkJCQkJZGVub21pbmF0b3IgPSAyNTsKKwkJfQorCX0KKworCXB2NGwyX3N0cmVhbXBhcm0tPnBhcm0uY2FwdHVyZS5yZWFkYnVmZmVycyA9IFwKKwkJCQkJCXBlYXN5Y2FwLT5mcmFtZV9idWZmZXJfbWFueTsKKwlwdjRsMl9zdHJlYW1wYXJtLT5wYXJtLmNhcHR1cmUuZXh0ZW5kZWRtb2RlID0gMDsKKwlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCBwdjRsMl9zdHJlYW1wYXJtLCBcCiAJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtKSkpIHsKLQkJUE9VVDsKKwkJa2ZyZWUocHY0bDJfc3RyZWFtcGFybSk7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQorCWtmcmVlKHB2NGwyX3N0cmVhbXBhcm0pOwogCWJyZWFrOwogfQogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogY2FzZSBWSURJT0NfU19QQVJNOiB7Ci0JSk9UKDgsICJWSURJT0NfU19QQVJNIHVuc3VwcG9ydGVkXG4iKTsKKwlKT00oOCwgIlZJRElPQ19TX1BBUk0gdW5zdXBwb3J0ZWRcbiIpOworCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIGNhc2UgVklESU9DX0dfQVVESU86IHsKLQlKT1QoOCwgIlZJRElPQ19HX0FVRElPIHVuc3VwcG9ydGVkXG4iKTsKKwlKT00oOCwgIlZJRElPQ19HX0FVRElPIHVuc3VwcG9ydGVkXG4iKTsKKwltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiBjYXNlIFZJRElPQ19TX0FVRElPOiB7Ci0JSk9UKDgsICJWSURJT0NfU19BVURJTyB1bnN1cHBvcnRlZFxuIik7CisJSk9NKDgsICJWSURJT0NfU19BVURJTyB1bnN1cHBvcnRlZFxuIik7CisJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCXJldHVybiAtRUlOVkFMOwogfQogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogY2FzZSBWSURJT0NfU19UVU5FUjogewotCUpPVCg4LCAiVklESU9DX1NfVFVORVIgdW5zdXBwb3J0ZWRcbiIpOworCUpPTSg4LCAiVklESU9DX1NfVFVORVIgdW5zdXBwb3J0ZWRcbiIpOworCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIGNhc2UgVklESU9DX0dfRkJVRjoKIGNhc2UgVklESU9DX1NfRkJVRjoKIGNhc2UgVklESU9DX09WRVJMQVk6IHsKLQlKT1QoOCwgIlZJRElPQ19HX0ZCVUZ8VklESU9DX1NfRkJVRnxWSURJT0NfT1ZFUkxBWSB1bnN1cHBvcnRlZFxuIik7CisJSk9NKDgsICJWSURJT0NfR19GQlVGfFZJRElPQ19TX0ZCVUZ8VklESU9DX09WRVJMQVkgdW5zdXBwb3J0ZWRcbiIpOworCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIGNhc2UgVklESU9DX0dfVFVORVI6IHsKLQlKT1QoOCwgIlZJRElPQ19HX1RVTkVSIHVuc3VwcG9ydGVkXG4iKTsKKwlKT00oOCwgIlZJRElPQ19HX1RVTkVSIHVuc3VwcG9ydGVkXG4iKTsKKwltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CiBjYXNlIFZJRElPQ19HX0ZSRVFVRU5DWToKIGNhc2UgVklESU9DX1NfRlJFUVVFTkNZOiB7Ci0JSk9UKDgsICJWSURJT0NfR19GUkVRVUVOQ1l8VklESU9DX1NfRlJFUVVFTkNZIHVuc3VwcG9ydGVkXG4iKTsKKwlKT00oOCwgIlZJRElPQ19HX0ZSRVFVRU5DWXxWSURJT0NfU19GUkVRVUVOQ1kgdW5zdXBwb3J0ZWRcbiIpOworCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIGRlZmF1bHQ6IHsKLQlKT1QoOCwgIkVSUk9SOiB1bnJlY29nbml6ZWQgVjRMMiBJT0NUTCBjb21tYW5kOiAweCUwOFhcbiIsIGNtZCk7Ci0JZXhwbGFpbl9pb2N0bChjbWQpOwotCVBPVVQ7CisJSk9NKDgsICJFUlJPUjogdW5yZWNvZ25pemVkIFY0TDIgSU9DVEwgY29tbWFuZDogMHglMDhYXG4iLCBjbWQpOworCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAlyZXR1cm4gLUVOT0lPQ1RMQ01EOwogfQogfQorbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOworSk9NKDQsICJ1bmxvY2tlZCBlYXN5Y2FwX2RvbmdsZVslaV0ubXV0ZXhfdmlkZW9cbiIsIGtkKTsKIHJldHVybiAwOwogfQotCi1sb25nIGVhc3ljYXBfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKLQlsb25nIHJldDsKLQotCWxvY2tfa2VybmVsKCk7Ci0JcmV0ID0gZWFzeWNhcF9pb2N0bF9ia2woaW5vZGUsIGZpbGUsIGNtZCwgYXJnKTsKLQl1bmxvY2tfa2VybmVsKCk7Ci0KLQlyZXR1cm4gcmV0OworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyp2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2Ki8KKyNpZiAoKGRlZmluZWQoRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQpKSB8fCBcCisJKGRlZmluZWQoRUFTWUNBUF9ORUVEU19VTkxPQ0tFRF9JT0NUTCkpKQorbG9uZworZWFzeXNuZF9pb2N0bF9ub2lub2RlKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykgeworCXJldHVybiAobG9uZyllYXN5c25kX2lvY3RsKChzdHJ1Y3QgaW5vZGUgKilOVUxMLCBmaWxlLCBjbWQsIGFyZyk7CiB9Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGludCBlYXN5c25kX2lvY3RsX2JrbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCisjZW5kaWYgLypFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVHx8RUFTWUNBUF9ORUVEU19VTkxPQ0tFRF9JT0NUTCovCisvKl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50CitlYXN5c25kX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIHN0cnVjdCBlYXN5Y2FwICpwZWFzeWNhcDsKIHN0cnVjdCB1c2JfZGV2aWNlICpwOworaW50IGtkOwogCitpZiAoTlVMTCA9PSBmaWxlKSB7CisJU0FZKCJFUlJPUjogIGZpbGUgaXMgTlVMTFxuIik7CisJcmV0dXJuIC1FUkVTVEFSVFNZUzsKK30KIHBlYXN5Y2FwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogaWYgKE5VTEwgPT0gcGVhc3ljYXApIHsKIAlTQVkoIkVSUk9SOiAgcGVhc3ljYXAgaXMgTlVMTC5cbiIpOwotCXJldHVybiAtMTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK2lmIChtZW1jbXAoJnBlYXN5Y2FwLT50ZWxsdGFsZVswXSwgVEVMTFRBTEUsIHN0cmxlbihURUxMVEFMRSkpKSB7CisJU0FZKCJFUlJPUjogYmFkIHBlYXN5Y2FwXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKIH0KIHAgPSBwZWFzeWNhcC0+cHVzYl9kZXZpY2U7CitpZiAoTlVMTCA9PSBwKSB7CisJU0FNKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGlzIE5VTExcbiIpOworCXJldHVybiAtRUZBVUxUOworfQora2QgPSBpc2RvbmdsZShwZWFzeWNhcCk7CitpZiAoMCA8PSBrZCAmJiBET05HTEVfTUFOWSA+IGtkKSB7CisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKSkgeworCQlTQVkoIkVSUk9SOiBjYW5ub3QgbG9jayBlYXN5Y2FwX2RvbmdsZVslaV0ubXV0ZXhfYXVkaW9cbiIsIGtkKTsKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwl9CisJSk9NKDQsICJsb2NrZWQgZWFzeWNhcF9kb25nbGVbJWldLm11dGV4X2F1ZGlvXG4iLCBrZCk7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIE1FQU5XSElMRSwgZWFzeWNhcF91c2JfZGlzY29ubmVjdCgpIE1BWSBIQVZFIEZSRUVEIFBPSU5URVIgcGVhc3ljYXAsCisgKiAgSU4gV0hJQ0ggQ0FTRSBBIFJFUEVBVCBDQUxMIFRPIGlzZG9uZ2xlKCkgV0lMTCBGQUlMLgorICogIElGIE5FQ0VTU0FSWSwgQkFJTCBPVVQuCisqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWlmIChrZCAhPSBpc2RvbmdsZShwZWFzeWNhcCkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJaWYgKE5VTEwgPT0gZmlsZSkgeworCQlTQVkoIkVSUk9SOiAgZmlsZSBpcyBOVUxMXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOworCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCX0KKwlwZWFzeWNhcCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpZiAoTlVMTCA9PSBwZWFzeWNhcCkgeworCQlTQVkoIkVSUk9SOiAgcGVhc3ljYXAgaXMgTlVMTFxuIik7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKTsKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwl9CisJaWYgKG1lbWNtcCgmcGVhc3ljYXAtPnRlbGx0YWxlWzBdLCBURUxMVEFMRSwgc3RybGVuKFRFTExUQUxFKSkpIHsKKwkJU0FZKCJFUlJPUjogYmFkIHBlYXN5Y2FwXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJcCA9IHBlYXN5Y2FwLT5wdXNiX2RldmljZTsKKwlpZiAoTlVMTCA9PSBwZWFzeWNhcC0+cHVzYl9kZXZpY2UpIHsKKwkJU0FNKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGlzIE5VTExcbiIpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorfSBlbHNlIHsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgSUYgZWFzeWNhcF91c2JfZGlzY29ubmVjdCgpIEhBUyBBTFJFQURZIEZSRUVEIFBPSU5URVIgcGVhc3ljYXAgQkVGT1JFIFRIRQorICogIEFUVEVNUFQgVE8gQUNRVUlSRSBUSEUgU0VNQVBIT1JFLCBpc2RvbmdsZSgpIFdJTEwgSEFWRSBGQUlMRUQuICBCQUlMIE9VVC4KKyovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJcmV0dXJuIC1FUkVTVEFSVFNZUzsKK30KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHN3aXRjaCAoY21kKSB7CiBjYXNlIFNORENUTF9EU1BfR0VUQ0FQUzogewogCWludCBjYXBzOwotCUpPVCg4LCAiU05EQ1RMX0RTUF9HRVRDQVBTXG4iKTsKKwlKT00oOCwgIlNORENUTF9EU1BfR0VUQ0FQU1xuIik7CiAKICNpZiBkZWZpbmVkKFVQU0FNUExFKQogCWlmICh0cnVlID09IHBlYXN5Y2FwLT5taWNyb3Bob25lKQpAQCAtMTk5MiwxMyArMjYxMywxNSBAQAogCQljYXBzID0gMHgwNDQwMDAwMDsKICNlbmRpZiAvKlVQU0FNUExFKi8KIAotCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZjYXBzLCBzaXplb2YoaW50KSkpCisJaWYgKDAgIT0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmNhcHMsIHNpemVvZihpbnQpKSkgeworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CiAJCXJldHVybiAtRUZBVUxUOworCX0KIAlicmVhazsKIH0KIGNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOiB7CiAJaW50IGluY29taW5nOwotCUpPVCg4LCAiU05EQ1RMX0RTUF9HRVRGTVRTXG4iKTsKKwlKT00oOCwgIlNORENUTF9EU1BfR0VURk1UU1xuIik7CiAKICNpZiBkZWZpbmVkKFVQU0FNUExFKQogCWlmICh0cnVlID09IHBlYXN5Y2FwLT5taWNyb3Bob25lKQpAQCAtMjAxMiwxNiArMjYzNSwyMCBAQAogCQlpbmNvbWluZyA9IEFGTVRfUzE2X0xFOwogI2VuZGlmIC8qVVBTQU1QTEUqLwogCi0JaWYgKDAgIT0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmluY29taW5nLCBzaXplb2YoaW50KSkpCisJaWYgKDAgIT0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmluY29taW5nLCBzaXplb2YoaW50KSkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKKwl9CiAJYnJlYWs7CiB9CiBjYXNlIFNORENUTF9EU1BfU0VURk1UOiB7CiAJaW50IGluY29taW5nLCBvdXRnb2luZzsKLQlKT1QoOCwgIlNORENUTF9EU1BfU0VURk1UXG4iKTsKLQlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmaW5jb21pbmcsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKGludCkpKQorCUpPTSg4LCAiU05EQ1RMX0RTUF9TRVRGTVRcbiIpOworCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZpbmNvbWluZywgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoaW50KSkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKLQlKT1QoOCwgIi4uLi4uLi4uLi4uICVpPWluY29taW5nXG4iLCBpbmNvbWluZyk7CisJfQorCUpPTSg4LCAiLi4uLi4uLi4uLi4gJWk9aW5jb21pbmdcbiIsIGluY29taW5nKTsKIAogI2lmIGRlZmluZWQoVVBTQU1QTEUpCiAJaWYgKHRydWUgPT0gcGVhc3ljYXAtPm1pY3JvcGhvbmUpCkBAIC0yMDM2LDIyICsyNjYzLDI3IEBACiAjZW5kaWYgLypVUFNBTVBMRSovCiAKIAlpZiAoaW5jb21pbmcgIT0gb3V0Z29pbmcpIHsKLQkJSk9UKDgsICIuLi4uLi4uLi4uLiAlaT1vdXRnb2luZ1xuIiwgb3V0Z29pbmcpOwotCQlKT1QoOCwgIiAgICAgICAgY2YuICVpPUFGTVRfUzE2X0xFXG4iLCBBRk1UX1MxNl9MRSk7Ci0JCUpPVCg4LCAiICAgICAgICBjZi4gJWk9QUZNVF9VOFxuIiwgQUZNVF9VOCk7CisJCUpPTSg4LCAiLi4uLi4uLi4uLi4gJWk9b3V0Z29pbmdcbiIsIG91dGdvaW5nKTsKKwkJSk9NKDgsICIgICAgICAgIGNmLiAlaT1BRk1UX1MxNl9MRVxuIiwgQUZNVF9TMTZfTEUpOworCQlKT00oOCwgIiAgICAgICAgY2YuICVpPUFGTVRfVThcbiIsIEFGTVRfVTgpOwogCQlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmb3V0Z29pbmcsIFwKLQkJCQkJCQkJc2l6ZW9mKGludCkpKQorCQkJCQkJCQlzaXplb2YoaW50KSkpIHsKKwkJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKTsKIAkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKTsKIAkJcmV0dXJuIC1FSU5WQUwgOwogCX0KIAlicmVhazsKIH0KIGNhc2UgU05EQ1RMX0RTUF9TVEVSRU86IHsKIAlpbnQgaW5jb21pbmc7Ci0JSk9UKDgsICJTTkRDVExfRFNQX1NURVJFT1xuIik7Ci0JaWYgKDAgIT0gY29weV9mcm9tX3VzZXIoJmluY29taW5nLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihpbnQpKSkKKwlKT00oOCwgIlNORENUTF9EU1BfU1RFUkVPXG4iKTsKKwlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmaW5jb21pbmcsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKGludCkpKSB7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7Ci0JSk9UKDgsICIuLi4uLi4uLi4uLiAlaT1pbmNvbWluZ1xuIiwgaW5jb21pbmcpOworCX0KKwlKT00oOCwgIi4uLi4uLi4uLi4uICVpPWluY29taW5nXG4iLCBpbmNvbWluZyk7CiAKICNpZiBkZWZpbmVkKFVQU0FNUExFKQogCWlmICh0cnVlID09IHBlYXN5Y2FwLT5taWNyb3Bob25lKQpAQCAtMjA2NSwxNiArMjY5NywyMCBAQAogCQlpbmNvbWluZyA9IDE7CiAjZW5kaWYgLypVUFNBTVBMRSovCiAKLQlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmaW5jb21pbmcsIHNpemVvZihpbnQpKSkKKwlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmaW5jb21pbmcsIHNpemVvZihpbnQpKSkgeworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CiAJCXJldHVybiAtRUZBVUxUOworCX0KIAlicmVhazsKIH0KIGNhc2UgU05EQ1RMX0RTUF9TUEVFRDogewogCWludCBpbmNvbWluZzsKLQlKT1QoOCwgIlNORENUTF9EU1BfU1BFRURcbiIpOwotCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZpbmNvbWluZywgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoaW50KSkpCisJSk9NKDgsICJTTkRDVExfRFNQX1NQRUVEXG4iKTsKKwlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmaW5jb21pbmcsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKGludCkpKSB7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7Ci0JSk9UKDgsICIuLi4uLi4uLi4uLiAlaT1pbmNvbWluZ1xuIiwgaW5jb21pbmcpOworCX0KKwlKT00oOCwgIi4uLi4uLi4uLi4uICVpPWluY29taW5nXG4iLCBpbmNvbWluZyk7CiAKICNpZiBkZWZpbmVkKFVQU0FNUExFKQogCWlmICh0cnVlID09IHBlYXN5Y2FwLT5taWNyb3Bob25lKQpAQCAtMjA4OCwyOSArMjcyNCwzNyBAQAogCQlpbmNvbWluZyA9IDQ4MDAwOwogI2VuZGlmIC8qVVBTQU1QTEUqLwogCi0JaWYgKDAgIT0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmluY29taW5nLCBzaXplb2YoaW50KSkpCisJaWYgKDAgIT0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmluY29taW5nLCBzaXplb2YoaW50KSkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKKwl9CiAJYnJlYWs7CiB9CiBjYXNlIFNORENUTF9EU1BfR0VUVFJJR0dFUjogewogCWludCBpbmNvbWluZzsKLQlKT1QoOCwgIlNORENUTF9EU1BfR0VUVFJJR0dFUlxuIik7Ci0JaWYgKDAgIT0gY29weV9mcm9tX3VzZXIoJmluY29taW5nLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihpbnQpKSkKKwlKT00oOCwgIlNORENUTF9EU1BfR0VUVFJJR0dFUlxuIik7CisJaWYgKDAgIT0gY29weV9mcm9tX3VzZXIoJmluY29taW5nLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihpbnQpKSkgeworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CiAJCXJldHVybiAtRUZBVUxUOwotCUpPVCg4LCAiLi4uLi4uLi4uLi4gJWk9aW5jb21pbmdcbiIsIGluY29taW5nKTsKKwl9CisJSk9NKDgsICIuLi4uLi4uLi4uLiAlaT1pbmNvbWluZ1xuIiwgaW5jb21pbmcpOwogCiAJaW5jb21pbmcgPSBQQ01fRU5BQkxFX0lOUFVUOwotCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZpbmNvbWluZywgc2l6ZW9mKGludCkpKQorCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZpbmNvbWluZywgc2l6ZW9mKGludCkpKSB7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CisJfQogCWJyZWFrOwogfQogY2FzZSBTTkRDVExfRFNQX1NFVFRSSUdHRVI6IHsKIAlpbnQgaW5jb21pbmc7Ci0JSk9UKDgsICJTTkRDVExfRFNQX1NFVFRSSUdHRVJcbiIpOwotCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZpbmNvbWluZywgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoaW50KSkpCisJSk9NKDgsICJTTkRDVExfRFNQX1NFVFRSSUdHRVJcbiIpOworCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZpbmNvbWluZywgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoaW50KSkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKLQlKT1QoOCwgIi4uLi4uLi4uLi4uICVpPWluY29taW5nXG4iLCBpbmNvbWluZyk7Ci0JSk9UKDgsICIuLi4uLi4uLi4uLiBjZiAweCV4PVBDTV9FTkFCTEVfSU5QVVQgIiBcCisJfQorCUpPTSg4LCAiLi4uLi4uLi4uLi4gJWk9aW5jb21pbmdcbiIsIGluY29taW5nKTsKKwlKT00oOCwgIi4uLi4uLi4uLi4uIGNmIDB4JXg9UENNX0VOQUJMRV9JTlBVVCAiIFwKIAkJCQkiMHgleD1QQ01fRU5BQkxFX09VVFBVVFxuIiwgXAogCQkJCQlQQ01fRU5BQkxFX0lOUFVULCBQQ01fRU5BQkxFX09VVFBVVCk7CiAJOwpAQCAtMjEyMSwxOSArMjc2NSwyMyBAQAogfQogY2FzZSBTTkRDVExfRFNQX0dFVEJMS1NJWkU6IHsKIAlpbnQgaW5jb21pbmc7Ci0JSk9UKDgsICJTTkRDVExfRFNQX0dFVEJMS1NJWkVcbiIpOwotCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZpbmNvbWluZywgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoaW50KSkpCisJSk9NKDgsICJTTkRDVExfRFNQX0dFVEJMS1NJWkVcbiIpOworCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZpbmNvbWluZywgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoaW50KSkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKLQlKT1QoOCwgIi4uLi4uLi4uLi4uICVpPWluY29taW5nXG4iLCBpbmNvbWluZyk7CisJfQorCUpPTSg4LCAiLi4uLi4uLi4uLi4gJWk9aW5jb21pbmdcbiIsIGluY29taW5nKTsKIAlpbmNvbWluZyA9IHBlYXN5Y2FwLT5hdWRpb19ieXRlc19wZXJfZnJhZ21lbnQ7Ci0JaWYgKDAgIT0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmluY29taW5nLCBzaXplb2YoaW50KSkpCisJaWYgKDAgIT0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmluY29taW5nLCBzaXplb2YoaW50KSkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKKwl9CiAJYnJlYWs7CiB9CiBjYXNlIFNORENUTF9EU1BfR0VUSVNQQUNFOiB7CiAJc3RydWN0IGF1ZGlvX2J1Zl9pbmZvIGF1ZGlvX2J1Zl9pbmZvOwogCi0JSk9UKDgsICJTTkRDVExfRFNQX0dFVElTUEFDRVxuIik7CisJSk9NKDgsICJTTkRDVExfRFNQX0dFVElTUEFDRVxuIik7CiAKIAlhdWRpb19idWZfaW5mby5ieXRlcyAgICAgID0gcGVhc3ljYXAtPmF1ZGlvX2J5dGVzX3Blcl9mcmFnbWVudDsKIAlhdWRpb19idWZfaW5mby5mcmFnbWVudHMgID0gMTsKQEAgLTIxNDEsNTU1ICsyNzg5LDMxIEBACiAJYXVkaW9fYnVmX2luZm8uZnJhZ3N0b3RhbCA9IDA7CiAKIAlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmYXVkaW9fYnVmX2luZm8sIFwKLQkJCQkJCQkJc2l6ZW9mKGludCkpKQorCQkJCQkJCQlzaXplb2YoaW50KSkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKKwl9CiAJYnJlYWs7CiB9CitjYXNlIDB4MDAwMDU0MDE6CitjYXNlIDB4MDAwMDU0MDI6CitjYXNlIDB4MDAwMDU0MDM6CitjYXNlIDB4MDAwMDU0MDQ6CitjYXNlIDB4MDAwMDU0MDU6CitjYXNlIDB4MDAwMDU0MDY6IHsKKwlKT00oOCwgIlNORENUTF9UTVJfLi4uOiAweCUwOFggdW5zdXBwb3J0ZWRcbiIsIGNtZCk7CisJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOworCXJldHVybiAtRU5PSU9DVExDTUQ7Cit9CiBkZWZhdWx0OiB7Ci0JSk9UKDgsICJFUlJPUjogdW5yZWNvZ25pemVkIERTUCBJT0NUTCBjb21tYW5kOiAweCUwOFhcbiIsIGNtZCk7Ci0JUE9VVDsKKwlKT00oOCwgIkVSUk9SOiB1bnJlY29nbml6ZWQgRFNQIElPQ1RMIGNvbW1hbmQ6IDB4JTA4WFxuIiwgY21kKTsKKwltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CiAJcmV0dXJuIC1FTk9JT0NUTENNRDsKIH0KIH0KK211dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKTsKIHJldHVybiAwOwogfQotCi1sb25nIGVhc3lzbmRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKLQlsb25nIHJldDsKLQotCWxvY2tfa2VybmVsKCk7Ci0JcmV0ID0gZWFzeXNuZF9pb2N0bF9ia2woaW5vZGUsIGZpbGUsIGNtZCwgYXJnKTsKLQl1bmxvY2tfa2VybmVsKCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgZXhwbGFpbl9pb2N0bChfX3UzMiB3b3QpCi17Ci1pbnQgazsKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qCi0gKiAgVEhFIERBVEEgRk9SIFRIRSBBUlJBWSBtZXNzIEJFTE9XIFdFUkUgQ09OU1RSVUNURUQgQlkgUlVOTklORyBUSEUgRk9MTE9XSU5HCi0gKiAgU0hFTEwgU0NSSVBUOgotICogICMKLSAqICBjYXQgL3Vzci9zcmMvbGludXgtaGVhZGVycy1gdW5hbWUgLXJgL2luY2x1ZGUvbGludXgvdmlkZW9kZXYyLmggfCBcCi0gKiAgICAgZ3JlcCAiXiNkZWZpbmUgVklESU9DXyIgLSB8IGdyZXAgLXYgIl9PTEQiIC0gfCBcCi0gKiAgICAgc2VkIC1lICJzLF9JTy4qJCwsO3AiIHwgc2VkIC1lICJOO3MsXG4sLCAiIHwgXAotICogICAgIHNlZCAtZSAicy9eI2RlZmluZSAvICB7LztzLyNkZWZpbmUgLywgXCIvO3MvJC9cIn0sLyIgfCBcCi0gKiAgICAgc2VkIC1lICJzLAksLGc7cywgLCxnIiA+aW9jdGwudG1wCi0gKiAgZWNobyAiezB4RkZGRkZGRkYsXCJcIn0iID4+aW9jdGwudG1wCi0gKiAgZXhpdCAwCi0gKiAgIwotICogQU5EIFJFSU5TVEFUSU5HIFRIRSBFWENJU0VEICJfT0xEIiBDQVNFUyBXRVJFIExBVEVSIE1BTlVBTExZLgotICoKLSAqIFRIRSBEQVRBIEZPUiBUSEUgQVJSQVkgbWVzczEgQkVMT1cgV0VSRSBDT05TVFJVQ1RFRCBCWSBSVU5OSU5HIFRIRSBGT0xMT1dJTkcKLSAqIFNIRUxMIFNDUklQVDoKLSAqICBjYXQgL3Vzci9zcmMvbGludXgtaGVhZGVycy1gdW5hbWUgLXJgL2luY2x1ZGUvbGludXgvdmlkZW9kZXYuaCB8IFwKLSAqICAgICBncmVwICJeI2RlZmluZSBWSURJT0MiIC0gfCBncmVwIC12ICJfT0xEIiAtIHwgXAotICogICAgIHNlZCAtZSAicyxfSU8uKiQsLDtwIiB8IHNlZCAtZSAiTjtzLFxuLCwgIiB8IFwKLSAqICAgICBzZWQgLWUgInMvXiNkZWZpbmUgLyAgey87cy8jZGVmaW5lIC8sIFwiLztzLyQvXCJ9LC8iIHwgXAotICogICAgIHNlZCAtZSAicywgICAsLGc7cywgLCxnIiA+aW9jdGwudG1wCi0gKiAgZWNobyAiezB4RkZGRkZGRkYsXCJcIn0iID4+aW9jdGwudG1wCi0gKiAgZXhpdCAwCi0gKiAgIwotICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgc3RydWN0IG1lc3MgewotCV9fdTMyIGNvbW1hbmQ7Ci0JY2hhciAgbmFtZVs2NF07Ci19IG1lc3NbXSA9IHsKLSNpZiBkZWZpbmVkKFZJRElPQ19RVUVSWUNBUCkKLXtWSURJT0NfUVVFUllDQVAsICJWSURJT0NfUVVFUllDQVAifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX1JFU0VSVkVEKQote1ZJRElPQ19SRVNFUlZFRCwgIlZJRElPQ19SRVNFUlZFRCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfRU5VTV9GTVQpCi17VklESU9DX0VOVU1fRk1ULCAiVklESU9DX0VOVU1fRk1UIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19HX0ZNVCkKLXtWSURJT0NfR19GTVQsICJWSURJT0NfR19GTVQifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX1NfRk1UKQote1ZJRElPQ19TX0ZNVCwgIlZJRElPQ19TX0ZNVCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfUkVRQlVGUykKLXtWSURJT0NfUkVRQlVGUywgIlZJRElPQ19SRVFCVUZTIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19RVUVSWUJVRikKLXtWSURJT0NfUVVFUllCVUYsICJWSURJT0NfUVVFUllCVUYifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX0dfRkJVRikKLXtWSURJT0NfR19GQlVGLCAiVklESU9DX0dfRkJVRiJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfU19GQlVGKQote1ZJRElPQ19TX0ZCVUYsICJWSURJT0NfU19GQlVGIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19PVkVSTEFZKQote1ZJRElPQ19PVkVSTEFZLCAiVklESU9DX09WRVJMQVkifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX1FCVUYpCi17VklESU9DX1FCVUYsICJWSURJT0NfUUJVRiJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfRFFCVUYpCi17VklESU9DX0RRQlVGLCAiVklESU9DX0RRQlVGIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19TVFJFQU1PTikKLXtWSURJT0NfU1RSRUFNT04sICJWSURJT0NfU1RSRUFNT04ifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX1NUUkVBTU9GRikKLXtWSURJT0NfU1RSRUFNT0ZGLCAiVklESU9DX1NUUkVBTU9GRiJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfR19QQVJNKQote1ZJRElPQ19HX1BBUk0sICJWSURJT0NfR19QQVJNIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19TX1BBUk0pCi17VklESU9DX1NfUEFSTSwgIlZJRElPQ19TX1BBUk0ifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX0dfU1REKQote1ZJRElPQ19HX1NURCwgIlZJRElPQ19HX1NURCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfU19TVEQpCi17VklESU9DX1NfU1RELCAiVklESU9DX1NfU1REIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19FTlVNU1REKQote1ZJRElPQ19FTlVNU1RELCAiVklESU9DX0VOVU1TVEQifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX0VOVU1JTlBVVCkKLXtWSURJT0NfRU5VTUlOUFVULCAiVklESU9DX0VOVU1JTlBVVCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfR19DVFJMKQote1ZJRElPQ19HX0NUUkwsICJWSURJT0NfR19DVFJMIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19TX0NUUkwpCi17VklESU9DX1NfQ1RSTCwgIlZJRElPQ19TX0NUUkwifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX0dfVFVORVIpCi17VklESU9DX0dfVFVORVIsICJWSURJT0NfR19UVU5FUiJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfU19UVU5FUikKLXtWSURJT0NfU19UVU5FUiwgIlZJRElPQ19TX1RVTkVSIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19HX0FVRElPKQote1ZJRElPQ19HX0FVRElPLCAiVklESU9DX0dfQVVESU8ifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX1NfQVVESU8pCi17VklESU9DX1NfQVVESU8sICJWSURJT0NfU19BVURJTyJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfUVVFUllDVFJMKQote1ZJRElPQ19RVUVSWUNUUkwsICJWSURJT0NfUVVFUllDVFJMIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19RVUVSWU1FTlUpCi17VklESU9DX1FVRVJZTUVOVSwgIlZJRElPQ19RVUVSWU1FTlUifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX0dfSU5QVVQpCi17VklESU9DX0dfSU5QVVQsICJWSURJT0NfR19JTlBVVCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfU19JTlBVVCkKLXtWSURJT0NfU19JTlBVVCwgIlZJRElPQ19TX0lOUFVUIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19HX09VVFBVVCkKLXtWSURJT0NfR19PVVRQVVQsICJWSURJT0NfR19PVVRQVVQifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX1NfT1VUUFVUKQote1ZJRElPQ19TX09VVFBVVCwgIlZJRElPQ19TX09VVFBVVCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfRU5VTU9VVFBVVCkKLXtWSURJT0NfRU5VTU9VVFBVVCwgIlZJRElPQ19FTlVNT1VUUFVUIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19HX0FVRE9VVCkKLXtWSURJT0NfR19BVURPVVQsICJWSURJT0NfR19BVURPVVQifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX1NfQVVET1VUKQote1ZJRElPQ19TX0FVRE9VVCwgIlZJRElPQ19TX0FVRE9VVCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfR19NT0RVTEFUT1IpCi17VklESU9DX0dfTU9EVUxBVE9SLCAiVklESU9DX0dfTU9EVUxBVE9SIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19TX01PRFVMQVRPUikKLXtWSURJT0NfU19NT0RVTEFUT1IsICJWSURJT0NfU19NT0RVTEFUT1IifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX0dfRlJFUVVFTkNZKQote1ZJRElPQ19HX0ZSRVFVRU5DWSwgIlZJRElPQ19HX0ZSRVFVRU5DWSJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfU19GUkVRVUVOQ1kpCi17VklESU9DX1NfRlJFUVVFTkNZLCAiVklESU9DX1NfRlJFUVVFTkNZIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19DUk9QQ0FQKQote1ZJRElPQ19DUk9QQ0FQLCAiVklESU9DX0NST1BDQVAifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX0dfQ1JPUCkKLXtWSURJT0NfR19DUk9QLCAiVklESU9DX0dfQ1JPUCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfU19DUk9QKQote1ZJRElPQ19TX0NST1AsICJWSURJT0NfU19DUk9QIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19HX0pQRUdDT01QKQote1ZJRElPQ19HX0pQRUdDT01QLCAiVklESU9DX0dfSlBFR0NPTVAifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX1NfSlBFR0NPTVApCi17VklESU9DX1NfSlBFR0NPTVAsICJWSURJT0NfU19KUEVHQ09NUCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfUVVFUllTVEQpCi17VklESU9DX1FVRVJZU1RELCAiVklESU9DX1FVRVJZU1REIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19UUllfRk1UKQote1ZJRElPQ19UUllfRk1ULCAiVklESU9DX1RSWV9GTVQifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX0VOVU1BVURJTykKLXtWSURJT0NfRU5VTUFVRElPLCAiVklESU9DX0VOVU1BVURJTyJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfRU5VTUFVRE9VVCkKLXtWSURJT0NfRU5VTUFVRE9VVCwgIlZJRElPQ19FTlVNQVVET1VUIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19HX1BSSU9SSVRZKQote1ZJRElPQ19HX1BSSU9SSVRZLCAiVklESU9DX0dfUFJJT1JJVFkifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX1NfUFJJT1JJVFkpCi17VklESU9DX1NfUFJJT1JJVFksICJWSURJT0NfU19QUklPUklUWSJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfR19TTElDRURfVkJJX0NBUCkKLXtWSURJT0NfR19TTElDRURfVkJJX0NBUCwgIlZJRElPQ19HX1NMSUNFRF9WQklfQ0FQIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19MT0dfU1RBVFVTKQote1ZJRElPQ19MT0dfU1RBVFVTLCAiVklESU9DX0xPR19TVEFUVVMifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX0dfRVhUX0NUUkxTKQote1ZJRElPQ19HX0VYVF9DVFJMUywgIlZJRElPQ19HX0VYVF9DVFJMUyJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfU19FWFRfQ1RSTFMpCi17VklESU9DX1NfRVhUX0NUUkxTLCAiVklESU9DX1NfRVhUX0NUUkxTIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19UUllfRVhUX0NUUkxTKQote1ZJRElPQ19UUllfRVhUX0NUUkxTLCAiVklESU9DX1RSWV9FWFRfQ1RSTFMifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX0VOVU1fRlJBTUVTSVpFUykKLXtWSURJT0NfRU5VTV9GUkFNRVNJWkVTLCAiVklESU9DX0VOVU1fRlJBTUVTSVpFUyJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfRU5VTV9GUkFNRUlOVEVSVkFMUykKLXtWSURJT0NfRU5VTV9GUkFNRUlOVEVSVkFMUywgIlZJRElPQ19FTlVNX0ZSQU1FSU5URVJWQUxTIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19HX0VOQ19JTkRFWCkKLXtWSURJT0NfR19FTkNfSU5ERVgsICJWSURJT0NfR19FTkNfSU5ERVgifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX0VOQ09ERVJfQ01EKQote1ZJRElPQ19FTkNPREVSX0NNRCwgIlZJRElPQ19FTkNPREVSX0NNRCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfVFJZX0VOQ09ERVJfQ01EKQote1ZJRElPQ19UUllfRU5DT0RFUl9DTUQsICJWSURJT0NfVFJZX0VOQ09ERVJfQ01EIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19HX0NISVBfSURFTlQpCi17VklESU9DX0dfQ0hJUF9JREVOVCwgIlZJRElPQ19HX0NISVBfSURFTlQifSwKLSNlbmRpZgogCi0jaWYgZGVmaW5lZChWSURJT0NfT1ZFUkxBWV9PTEQpCi17VklESU9DX09WRVJMQVlfT0xELCAiVklESU9DX09WRVJMQVlfT0xEIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19TX1BBUk1fT0xEKQote1ZJRElPQ19TX1BBUk1fT0xELCAiVklESU9DX1NfUEFSTV9PTEQifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX1NfQ1RSTF9PTEQpCi17VklESU9DX1NfQ1RSTF9PTEQsICJWSURJT0NfU19DVFJMX09MRCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfR19BVURJT19PTEQpCi17VklESU9DX0dfQVVESU9fT0xELCAiVklESU9DX0dfQVVESU9fT0xEIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19HX0FVRE9VVF9PTEQpCi17VklESU9DX0dfQVVET1VUX09MRCwgIlZJRElPQ19HX0FVRE9VVF9PTEQifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX0NST1BDQVBfT0xEKQote1ZJRElPQ19DUk9QQ0FQX09MRCwgIlZJRElPQ19DUk9QQ0FQX09MRCJ9LAotI2VuZGlmCi17MHhGRkZGRkZGRiwgIiJ9Ci19OwogCi1zdGF0aWMgc3RydWN0IG1lc3MgbWVzczFbXSA9IFwKLXsKLSNpZiBkZWZpbmVkKFZJRElPQ0dDQVApCi17VklESU9DR0NBUCwgIlZJRElPQ0dDQVAifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DR0NIQU4pCi17VklESU9DR0NIQU4sICJWSURJT0NHQ0hBTiJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NTQ0hBTikKLXtWSURJT0NTQ0hBTiwgIlZJRElPQ1NDSEFOIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ0dUVU5FUikKLXtWSURJT0NHVFVORVIsICJWSURJT0NHVFVORVIifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DU1RVTkVSKQote1ZJRElPQ1NUVU5FUiwgIlZJRElPQ1NUVU5FUiJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NHUElDVCkKLXtWSURJT0NHUElDVCwgIlZJRElPQ0dQSUNUIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ1NQSUNUKQote1ZJRElPQ1NQSUNULCAiVklESU9DU1BJQ1QifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DQ0FQVFVSRSkKLXtWSURJT0NDQVBUVVJFLCAiVklESU9DQ0FQVFVSRSJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NHV0lOKQote1ZJRElPQ0dXSU4sICJWSURJT0NHV0lOIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ1NXSU4pCi17VklESU9DU1dJTiwgIlZJRElPQ1NXSU4ifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DR0ZCVUYpCi17VklESU9DR0ZCVUYsICJWSURJT0NHRkJVRiJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NTRkJVRikKLXtWSURJT0NTRkJVRiwgIlZJRElPQ1NGQlVGIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ0tFWSkKLXtWSURJT0NLRVksICJWSURJT0NLRVkifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DR0ZSRVEpCi17VklESU9DR0ZSRVEsICJWSURJT0NHRlJFUSJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NTRlJFUSkKLXtWSURJT0NTRlJFUSwgIlZJRElPQ1NGUkVRIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ0dBVURJTykKLXtWSURJT0NHQVVESU8sICJWSURJT0NHQVVESU8ifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DU0FVRElPKQote1ZJRElPQ1NBVURJTywgIlZJRElPQ1NBVURJTyJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NTWU5DKQote1ZJRElPQ1NZTkMsICJWSURJT0NTWU5DIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ01DQVBUVVJFKQote1ZJRElPQ01DQVBUVVJFLCAiVklESU9DTUNBUFRVUkUifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DR01CVUYpCi17VklESU9DR01CVUYsICJWSURJT0NHTUJVRiJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NHVU5JVCkKLXtWSURJT0NHVU5JVCwgIlZJRElPQ0dVTklUIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ0dDQVBUVVJFKQote1ZJRElPQ0dDQVBUVVJFLCAiVklESU9DR0NBUFRVUkUifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DU0NBUFRVUkUpCi17VklESU9DU0NBUFRVUkUsICJWSURJT0NTQ0FQVFVSRSJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NTUExBWU1PREUpCi17VklESU9DU1BMQVlNT0RFLCAiVklESU9DU1BMQVlNT0RFIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ1NXUklURU1PREUpCi17VklESU9DU1dSSVRFTU9ERSwgIlZJRElPQ1NXUklURU1PREUifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DR1BMQVlJTkZPKQote1ZJRElPQ0dQTEFZSU5GTywgIlZJRElPQ0dQTEFZSU5GTyJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NTTUlDUk9DT0RFKQote1ZJRElPQ1NNSUNST0NPREUsICJWSURJT0NTTUlDUk9DT0RFIn0sCi0jZW5kaWYKLXsweEZGRkZGRkZGLCAiIn0KLX07Ci0KLWsgPSAwOwotd2hpbGUgKG1lc3Nba10ubmFtZVswXSkgewotCWlmICh3b3QgPT0gbWVzc1trXS5jb21tYW5kKSB7Ci0JCUpPVCg4LCAiaW9jdGwgMHglMDhYIGlzICVzXG4iLCBcCi0JCQkJCW1lc3Nba10uY29tbWFuZCwgJm1lc3Nba10ubmFtZVswXSk7Ci0JCXJldHVybiAwOwotCX0KLQlrKys7Ci19Ci1KT1QoOCwgImlvY3RsIDB4JTA4WCBpcyBub3QgaW4gdmlkZW9kZXYyLmhcbiIsIHdvdCk7Ci0KLWsgPSAwOwotd2hpbGUgKG1lc3MxW2tdLm5hbWVbMF0pIHsKLQlpZiAod290ID09IG1lc3MxW2tdLmNvbW1hbmQpIHsKLQkJSk9UKDgsICJpb2N0bCAweCUwOFggaXMgJXMgKFY0TDEpXG4iLCBcCi0JCQkJCW1lc3MxW2tdLmNvbW1hbmQsICZtZXNzMVtrXS5uYW1lWzBdKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWsrKzsKLX0KLUpPVCg4LCAiaW9jdGwgMHglMDhYIGlzIG5vdCBpbiB2aWRlb2Rldi5oXG4iLCB3b3QpOwotcmV0dXJuIC0xOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGV4cGxhaW5fY2lkKF9fdTMyIHdvdCkKLXsKLWludCBrOwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoKLSAqICBUSEUgREFUQSBGT1IgVEhFIEFSUkFZIG1lc3MgQkVMT1cgV0VSRSBDT05TVFJVQ1RFRCBCWSBSVU5OSU5HIFRIRSBGT0xMT1dJTkcKLSAqICBTSEVMTCBTQ1JJUFQ6Ci0gKiAgIwotICogIGNhdCAvdXNyL3NyYy9saW51eC1oZWFkZXJzLWB1bmFtZSAtcmAvaW5jbHVkZS9saW51eC92aWRlb2RldjIuaCB8IFwKLSAqICAgICBncmVwICJeI2RlZmluZSBWNEwyX0NJRF8iIHwgIFwKLSAqICAgICBzZWQgLWUgInMsKC4qJCwsO3AiIHwgc2VkIC1lICJOO3MsXG4sLCAiIHwgXAotICogICAgIHNlZCAtZSAicy9eI2RlZmluZSAvICB7LztzLyNkZWZpbmUgLywgXCIvO3MvJC9cIn0sLyIgfCBcCi0gKiAgICAgc2VkIC1lICJzLAksLGc7cywgLCxnIiB8IGdyZXAgLXYgIl9CQVNFIiB8IGdyZXAgLXYgIk1QRUciID5jaWQudG1wCi0gKiAgZWNobyAiezB4RkZGRkZGRkYsXCJcIn0iID4+Y2lkLnRtcAotICogIGV4aXQgMAotICogICMKLSAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHN0cnVjdCBtZXNzCi17Ci1fX3UzMiBjb21tYW5kOwotY2hhciAgbmFtZVs2NF07Ci19IG1lc3NbXSA9IHsKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX1VTRVJfQ0xBU1MpCi17VjRMMl9DSURfVVNFUl9DTEFTUywgIlY0TDJfQ0lEX1VTRVJfQ0xBU1MifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfQlJJR0hUTkVTUykKLXtWNEwyX0NJRF9CUklHSFRORVNTLCAiVjRMMl9DSURfQlJJR0hUTkVTUyJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9DT05UUkFTVCkKLXtWNEwyX0NJRF9DT05UUkFTVCwgIlY0TDJfQ0lEX0NPTlRSQVNUIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX1NBVFVSQVRJT04pCi17VjRMMl9DSURfU0FUVVJBVElPTiwgIlY0TDJfQ0lEX1NBVFVSQVRJT04ifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfSFVFKQote1Y0TDJfQ0lEX0hVRSwgIlY0TDJfQ0lEX0hVRSJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9BVURJT19WT0xVTUUpCi17VjRMMl9DSURfQVVESU9fVk9MVU1FLCAiVjRMMl9DSURfQVVESU9fVk9MVU1FIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX0FVRElPX0JBTEFOQ0UpCi17VjRMMl9DSURfQVVESU9fQkFMQU5DRSwgIlY0TDJfQ0lEX0FVRElPX0JBTEFOQ0UifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfQVVESU9fQkFTUykKLXtWNEwyX0NJRF9BVURJT19CQVNTLCAiVjRMMl9DSURfQVVESU9fQkFTUyJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9BVURJT19UUkVCTEUpCi17VjRMMl9DSURfQVVESU9fVFJFQkxFLCAiVjRMMl9DSURfQVVESU9fVFJFQkxFIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX0FVRElPX01VVEUpCi17VjRMMl9DSURfQVVESU9fTVVURSwgIlY0TDJfQ0lEX0FVRElPX01VVEUifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfQVVESU9fTE9VRE5FU1MpCi17VjRMMl9DSURfQVVESU9fTE9VRE5FU1MsICJWNEwyX0NJRF9BVURJT19MT1VETkVTUyJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9CTEFDS19MRVZFTCkKLXtWNEwyX0NJRF9CTEFDS19MRVZFTCwgIlY0TDJfQ0lEX0JMQUNLX0xFVkVMIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX0FVVE9fV0hJVEVfQkFMQU5DRSkKLXtWNEwyX0NJRF9BVVRPX1dISVRFX0JBTEFOQ0UsICJWNEwyX0NJRF9BVVRPX1dISVRFX0JBTEFOQ0UifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfRE9fV0hJVEVfQkFMQU5DRSkKLXtWNEwyX0NJRF9ET19XSElURV9CQUxBTkNFLCAiVjRMMl9DSURfRE9fV0hJVEVfQkFMQU5DRSJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9SRURfQkFMQU5DRSkKLXtWNEwyX0NJRF9SRURfQkFMQU5DRSwgIlY0TDJfQ0lEX1JFRF9CQUxBTkNFIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX0JMVUVfQkFMQU5DRSkKLXtWNEwyX0NJRF9CTFVFX0JBTEFOQ0UsICJWNEwyX0NJRF9CTFVFX0JBTEFOQ0UifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfR0FNTUEpCi17VjRMMl9DSURfR0FNTUEsICJWNEwyX0NJRF9HQU1NQSJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9XSElURU5FU1MpCi17VjRMMl9DSURfV0hJVEVORVNTLCAiVjRMMl9DSURfV0hJVEVORVNTIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX0VYUE9TVVJFKQote1Y0TDJfQ0lEX0VYUE9TVVJFLCAiVjRMMl9DSURfRVhQT1NVUkUifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfQVVUT0dBSU4pCi17VjRMMl9DSURfQVVUT0dBSU4sICJWNEwyX0NJRF9BVVRPR0FJTiJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9HQUlOKQote1Y0TDJfQ0lEX0dBSU4sICJWNEwyX0NJRF9HQUlOIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX0hGTElQKQote1Y0TDJfQ0lEX0hGTElQLCAiVjRMMl9DSURfSEZMSVAifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfVkZMSVApCi17VjRMMl9DSURfVkZMSVAsICJWNEwyX0NJRF9WRkxJUCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9IQ0VOVEVSKQote1Y0TDJfQ0lEX0hDRU5URVIsICJWNEwyX0NJRF9IQ0VOVEVSIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX1ZDRU5URVIpCi17VjRMMl9DSURfVkNFTlRFUiwgIlY0TDJfQ0lEX1ZDRU5URVIifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfUE9XRVJfTElORV9GUkVRVUVOQ1kpCi17VjRMMl9DSURfUE9XRVJfTElORV9GUkVRVUVOQ1ksICJWNEwyX0NJRF9QT1dFUl9MSU5FX0ZSRVFVRU5DWSJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9IVUVfQVVUTykKLXtWNEwyX0NJRF9IVUVfQVVUTywgIlY0TDJfQ0lEX0hVRV9BVVRPIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX1dISVRFX0JBTEFOQ0VfVEVNUEVSQVRVUkUpCi17VjRMMl9DSURfV0hJVEVfQkFMQU5DRV9URU1QRVJBVFVSRSwgIlY0TDJfQ0lEX1dISVRFX0JBTEFOQ0VfVEVNUEVSQVRVUkUifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfU0hBUlBORVNTKQote1Y0TDJfQ0lEX1NIQVJQTkVTUywgIlY0TDJfQ0lEX1NIQVJQTkVTUyJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9CQUNLTElHSFRfQ09NUEVOU0FUSU9OKQote1Y0TDJfQ0lEX0JBQ0tMSUdIVF9DT01QRU5TQVRJT04sICJWNEwyX0NJRF9CQUNLTElHSFRfQ09NUEVOU0FUSU9OIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX0NIUk9NQV9BR0MpCi17VjRMMl9DSURfQ0hST01BX0FHQywgIlY0TDJfQ0lEX0NIUk9NQV9BR0MifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfQ09MT1JfS0lMTEVSKQote1Y0TDJfQ0lEX0NPTE9SX0tJTExFUiwgIlY0TDJfQ0lEX0NPTE9SX0tJTExFUiJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9MQVNUUDEpCi17VjRMMl9DSURfTEFTVFAxLCAiVjRMMl9DSURfTEFTVFAxIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX0NBTUVSQV9DTEFTUykKLXtWNEwyX0NJRF9DQU1FUkFfQ0xBU1MsICJWNEwyX0NJRF9DQU1FUkFfQ0xBU1MifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfRVhQT1NVUkVfQVVUTykKLXtWNEwyX0NJRF9FWFBPU1VSRV9BVVRPLCAiVjRMMl9DSURfRVhQT1NVUkVfQVVUTyJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9FWFBPU1VSRV9BQlNPTFVURSkKLXtWNEwyX0NJRF9FWFBPU1VSRV9BQlNPTFVURSwgIlY0TDJfQ0lEX0VYUE9TVVJFX0FCU09MVVRFIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX0VYUE9TVVJFX0FVVE9fUFJJT1JJVFkpCi17VjRMMl9DSURfRVhQT1NVUkVfQVVUT19QUklPUklUWSwgIlY0TDJfQ0lEX0VYUE9TVVJFX0FVVE9fUFJJT1JJVFkifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfUEFOX1JFTEFUSVZFKQote1Y0TDJfQ0lEX1BBTl9SRUxBVElWRSwgIlY0TDJfQ0lEX1BBTl9SRUxBVElWRSJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9USUxUX1JFTEFUSVZFKQote1Y0TDJfQ0lEX1RJTFRfUkVMQVRJVkUsICJWNEwyX0NJRF9USUxUX1JFTEFUSVZFIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX1BBTl9SRVNFVCkKLXtWNEwyX0NJRF9QQU5fUkVTRVQsICJWNEwyX0NJRF9QQU5fUkVTRVQifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfVElMVF9SRVNFVCkKLXtWNEwyX0NJRF9USUxUX1JFU0VULCAiVjRMMl9DSURfVElMVF9SRVNFVCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9QQU5fQUJTT0xVVEUpCi17VjRMMl9DSURfUEFOX0FCU09MVVRFLCAiVjRMMl9DSURfUEFOX0FCU09MVVRFIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX1RJTFRfQUJTT0xVVEUpCi17VjRMMl9DSURfVElMVF9BQlNPTFVURSwgIlY0TDJfQ0lEX1RJTFRfQUJTT0xVVEUifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfRk9DVVNfQUJTT0xVVEUpCi17VjRMMl9DSURfRk9DVVNfQUJTT0xVVEUsICJWNEwyX0NJRF9GT0NVU19BQlNPTFVURSJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9GT0NVU19SRUxBVElWRSkKLXtWNEwyX0NJRF9GT0NVU19SRUxBVElWRSwgIlY0TDJfQ0lEX0ZPQ1VTX1JFTEFUSVZFIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX0ZPQ1VTX0FVVE8pCi17VjRMMl9DSURfRk9DVVNfQVVUTywgIlY0TDJfQ0lEX0ZPQ1VTX0FVVE8ifSwKLSNlbmRpZgotezB4RkZGRkZGRkYsICIifQotfTsKLQotayA9IDA7Ci13aGlsZSAobWVzc1trXS5uYW1lWzBdKSB7Ci0JaWYgKHdvdCA9PSBtZXNzW2tdLmNvbW1hbmQpIHsKLQkJSk9UKDgsICJpb2N0bCAweCUwOFggaXMgJXNcbiIsIFwKLQkJCQkJbWVzc1trXS5jb21tYW5kLCAmbWVzc1trXS5uYW1lWzBdKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWsrKzsKLX0KLUpPVCg4LCAiY2lkIDB4JTA4WCBpcyBub3QgaW4gdmlkZW9kZXYyLmhcbiIsIHdvdCk7Ci1yZXR1cm4gLTE7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX2xvdy5jIGIvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF9sb3cuYwppbmRleCBhZDFmYzRjLi4yOGM0ZDFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX2xvdy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfbG93LmMKQEAgLTM4LDE0OCArMzgsMjA5IEBACiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpbmNsdWRlICJlYXN5Y2FwX2RlYnVnLmgiCiAjaW5jbHVkZSAiZWFzeWNhcC5oIgorI2luY2x1ZGUgImVhc3ljYXBfZGVidWcuaCIKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1jb25zdCBzdHJ1Y3Qgc3RrMTE2MGNvbmZpZyB7IGludCByZWc7IGludCBzZXQ7IH0gc3RrMTE2MGNvbmZpZ1syNTZdID0gewotCXsweDAwMCwgMHgwMDk4fSwKLQl7MHgwMDIsIDB4MDA5M30sCitjb25zdCBzdHJ1Y3Qgc3RrMTE2MGNvbmZpZyB7IGludCByZWc7IGludCBzZXQ7IH0gc3RrMTE2MGNvbmZpZ1BBTFsyNTZdID0geworCQl7MHgwMDAsIDB4MDA5OH0sCisJCXsweDAwMiwgMHgwMDkzfSwKIAotCXsweDAwMSwgMHgwMDAzfSwKLQl7MHgwMDMsIDB4MDA4MH0sCi0JezB4MDBELCAweDAwMDB9LAotCXsweDAwRiwgMHgwMDAyfSwKLQl7MHgwMTgsIDB4MDAxMH0sCi0JezB4MDE5LCAweDAwMDB9LAotCXsweDAxQSwgMHgwMDE0fSwKLQl7MHgwMUIsIDB4MDAwRX0sCi0JezB4MDFDLCAweDAwNDZ9LAorCQl7MHgwMDEsIDB4MDAwM30sCisJCXsweDAwMywgMHgwMDgwfSwKKwkJezB4MDBELCAweDAwMDB9LAorCQl7MHgwMEYsIDB4MDAwMn0sCisJCXsweDAxOCwgMHgwMDEwfSwKKwkJezB4MDE5LCAweDAwMDB9LAorCQl7MHgwMUEsIDB4MDAxNH0sCisJCXsweDAxQiwgMHgwMDBFfSwKKwkJezB4MDFDLCAweDAwNDZ9LAogCi0JezB4MTAwLCAweDAwMzN9LAotCXsweDEwMywgMHgwMDAwfSwKLQl7MHgxMDQsIDB4MDAwMH0sCi0JezB4MTA1LCAweDAwMDB9LAotCXsweDEwNiwgMHgwMDAwfSwKKwkJezB4MTAwLCAweDAwMzN9LAorCQl7MHgxMDMsIDB4MDAwMH0sCisJCXsweDEwNCwgMHgwMDAwfSwKKwkJezB4MTA1LCAweDAwMDB9LAorCQl7MHgxMDYsIDB4MDAwMH0sCiAKLSNpZiBkZWZpbmVkKFBSRUZFUl9OVFNDKQorLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworLyoKKyAqICBSRVNPTFVUSU9OIDY0MHg0ODAKKyovCisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisJCXsweDExMCwgMHgwMDA4fSwKKwkJezB4MTExLCAweDAwMDB9LAorCQl7MHgxMTIsIDB4MDAyMH0sCisJCXsweDExMywgMHgwMDAwfSwKKwkJezB4MTE0LCAweDA1MDh9LAorCQl7MHgxMTUsIDB4MDAwNX0sCisJCXsweDExNiwgMHgwMTEwfSwKKwkJezB4MTE3LCAweDAwMDF9LAorLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogCi0jdW5kZWYgIE9MRE1BUkdJTgotI2lmIGRlZmluZWQoT0xETUFSR0lOKQotCXsweDExMCwgMHgwMDA4fSwKLSNlbHNlCi0JezB4MTEwLCAweDAwMTR9LAotI2VuZGlmIC8qT0xETUFSR0lOKi8KKwkJezB4MjAyLCAweDAwMEZ9LAorCQl7MHgyMDMsIDB4MDA0QX0sCisJCXsweDJGRiwgMHgwMDAwfSwKIAotCXsweDExMSwgMHgwMDAwfSwKLQl7MHgxMTIsIDB4MDAwM30sCi0JezB4MTEzLCAweDAwMDB9LAotCi0jaWYgZGVmaW5lZChPTERNQVJHSU4pCi0JezB4MTE0LCAweDA1MDh9LAotI2Vsc2UKLQl7MHgxMTQsIDB4MDUxNH0sCi0jZW5kaWYgLypPTERNQVJHSU4qLwotCi0JezB4MTE1LCAweDAwMDV9LAotCXsweDExNiwgMHgwMEYzfSwKLQl7MHgxMTcsIDB4MDAwMH0sCi0KLSNlbHNlIC8qICEgUFJFRkVSX05UU0MqLwotCi0jaWYgZGVmaW5lZChPTERNQVJHSU4pCi0JezB4MTEwLCAweDAwMDh9LAotI2Vsc2UKLQl7MHgxMTAsIDB4MDAxNH0sCi0jZW5kaWYgLypPTERNQVJHSU4qLwotCi0JezB4MTExLCAweDAwMDB9LAotCXsweDExMiwgMHgwMDIwfSwKLQl7MHgxMTMsIDB4MDAwMH0sCi0KLSNpZiBkZWZpbmVkKE9MRE1BUkdJTikKLQl7MHgxMTQsIDB4MDUwOH0sCi0jZWxzZQotCXsweDExNCwgMHgwNTE0fSwKLSNlbmRpZiAvKk9MRE1BUkdJTiovCi0KLQl7MHgxMTUsIDB4MDAwNX0sCi0JezB4MTE2LCAweDAxMTB9LAotCXsweDExNywgMHgwMDAxfSwKLQotI2VuZGlmIC8qICEgUFJFRkVSX05UU0MqLwotCi0JezB4MjAyLCAweDAwMEZ9LAotCXsweDIwMywgMHgwMDRBfSwKLQl7MHgyRkYsIDB4MDAwMH0sCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JezB4RkZGLCAweEZGRkZ9Ci0JfTsKKwkJezB4RkZGLCAweEZGRkZ9Cit9OwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1jb25zdCBzdHJ1Y3Qgc2FhNzExM2NvbmZpZyB7IGludCByZWc7IGludCBzZXQ7IH0gc2FhNzExM2NvbmZpZ1syNTZdID0gewotCXsweDAxLCAweDA4fSwKLQl7MHgwMiwgMHg4MH0sCi0JezB4MDMsIDB4MzN9LAotCXsweDA0LCAweDAwfSwKLQl7MHgwNSwgMHgwMH0sCi0JezB4MDYsIDB4RTl9LAotCXsweDA3LCAweDBEfSwKLSNpZiBkZWZpbmVkKFBSRUZFUl9OVFNDKQotCXsweDA4LCAweDc4fSwKK2NvbnN0IHN0cnVjdCBzdGsxMTYwY29uZmlnIHN0azExNjBjb25maWdOVFNDWzI1Nl0gPSB7CisJCXsweDAwMCwgMHgwMDk4fSwKKwkJezB4MDAyLCAweDAwOTN9LAorCisJCXsweDAwMSwgMHgwMDAzfSwKKwkJezB4MDAzLCAweDAwODB9LAorCQl7MHgwMEQsIDB4MDAwMH0sCisJCXsweDAwRiwgMHgwMDAyfSwKKwkJezB4MDE4LCAweDAwMTB9LAorCQl7MHgwMTksIDB4MDAwMH0sCisJCXsweDAxQSwgMHgwMDE0fSwKKwkJezB4MDFCLCAweDAwMEV9LAorCQl7MHgwMUMsIDB4MDA0Nn0sCisKKwkJezB4MTAwLCAweDAwMzN9LAorCQl7MHgxMDMsIDB4MDAwMH0sCisJCXsweDEwNCwgMHgwMDAwfSwKKwkJezB4MTA1LCAweDAwMDB9LAorCQl7MHgxMDYsIDB4MDAwMH0sCisKKy8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKy8qCisgKiAgUkVTT0xVVElPTiA2NDB4NDgwCisqLworLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCQl7MHgxMTAsIDB4MDAwOH0sCisJCXsweDExMSwgMHgwMDAwfSwKKwkJezB4MTEyLCAweDAwMDN9LAorCQl7MHgxMTMsIDB4MDAwMH0sCisJCXsweDExNCwgMHgwNTA4fSwKKwkJezB4MTE1LCAweDAwMDV9LAorCQl7MHgxMTYsIDB4MDBGM30sCisJCXsweDExNywgMHgwMDAwfSwKKy8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworCQl7MHgyMDIsIDB4MDAwRn0sCisJCXsweDIwMywgMHgwMDRBfSwKKwkJezB4MkZGLCAweDAwMDB9LAorCisJCXsweEZGRiwgMHhGRkZGfQorfTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworY29uc3Qgc3RydWN0IHNhYTcxMTNjb25maWcgeyBpbnQgcmVnOyBpbnQgc2V0OyB9IHNhYTcxMTNjb25maWdQQUxbMjU2XSA9IHsKKwkJezB4MDEsIDB4MDh9LAorI2lmIGRlZmluZWQoQU5USUFMSUFTKQorCQl7MHgwMiwgMHhDMH0sCiAjZWxzZQotCXsweDA4LCAweDM4fSwKLSNlbmRpZiAvKiAhIFBSRUZFUl9OVFNDKi8KLQl7MHgwOSwgMHgwMH0sCi0JezB4MEEsIFNBQV8wQV9ERUZBVUxUfSwKLQl7MHgwQiwgU0FBXzBCX0RFRkFVTFR9LAotCXsweDBDLCBTQUFfMENfREVGQVVMVH0sCi0JezB4MEQsIFNBQV8wRF9ERUZBVUxUfSwKLQl7MHgwRSwgMHgwMX0sCi0JezB4MEYsIDB4MzZ9LAotCXsweDEwLCAweDAwfSwKLQl7MHgxMSwgMHgwQ30sCi0JezB4MTIsIDB4RTd9LAotCXsweDEzLCAweDAwfSwKLQl7MHgxNSwgMHgwMH0sCi0JezB4MTYsIDB4MDB9LAotI2lmIGRlZmluZWQoUFJFRkVSX05UU0MpCi0JezB4NDAsIDB4ODJ9LAorCQl7MHgwMiwgMHg4MH0sCisjZW5kaWYgLypBTlRJQUxJQVMqLworCQl7MHgwMywgMHgzM30sCisJCXsweDA0LCAweDAwfSwKKwkJezB4MDUsIDB4MDB9LAorCQl7MHgwNiwgMHhFOX0sCisJCXsweDA3LCAweDBEfSwKKwkJezB4MDgsIDB4Mzh9LAorCQl7MHgwOSwgMHgwMH0sCisJCXsweDBBLCBTQUFfMEFfREVGQVVMVH0sCisJCXsweDBCLCBTQUFfMEJfREVGQVVMVH0sCisJCXsweDBDLCBTQUFfMENfREVGQVVMVH0sCisJCXsweDBELCBTQUFfMERfREVGQVVMVH0sCisJCXsweDBFLCAweDAxfSwKKwkJezB4MEYsIDB4MzZ9LAorCQl7MHgxMCwgMHgwMH0sCisJCXsweDExLCAweDBDfSwKKwkJezB4MTIsIDB4RTd9LAorCQl7MHgxMywgMHgwMH0sCisJCXsweDE1LCAweDAwfSwKKwkJezB4MTYsIDB4MDB9LAorCQl7MHg0MCwgMHgwMn0sCisJCXsweDQxLCAweEZGfSwKKwkJezB4NDIsIDB4RkZ9LAorCQl7MHg0MywgMHhGRn0sCisJCXsweDQ0LCAweEZGfSwKKwkJezB4NDUsIDB4RkZ9LAorCQl7MHg0NiwgMHhGRn0sCisJCXsweDQ3LCAweEZGfSwKKwkJezB4NDgsIDB4RkZ9LAorCQl7MHg0OSwgMHhGRn0sCisJCXsweDRBLCAweEZGfSwKKwkJezB4NEIsIDB4RkZ9LAorCQl7MHg0QywgMHhGRn0sCisJCXsweDRELCAweEZGfSwKKwkJezB4NEUsIDB4RkZ9LAorCQl7MHg0RiwgMHhGRn0sCisJCXsweDUwLCAweEZGfSwKKwkJezB4NTEsIDB4RkZ9LAorCQl7MHg1MiwgMHhGRn0sCisJCXsweDUzLCAweEZGfSwKKwkJezB4NTQsIDB4RkZ9LAorCQl7MHg1NSwgMHhGRn0sCisJCXsweDU2LCAweEZGfSwKKwkJezB4NTcsIDB4RkZ9LAorCQl7MHg1OCwgMHg0MH0sCisJCXsweDU5LCAweDU0fSwKKwkJezB4NUEsIDB4MDd9LAorCQl7MHg1QiwgMHg4M30sCisKKwkJezB4RkYsIDB4RkZ9Cit9OworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitjb25zdCBzdHJ1Y3Qgc2FhNzExM2NvbmZpZyBzYWE3MTEzY29uZmlnTlRTQ1syNTZdID0geworCQl7MHgwMSwgMHgwOH0sCisjaWYgZGVmaW5lZChBTlRJQUxJQVMpCisJCXsweDAyLCAweEMwfSwKICNlbHNlCi0JezB4NDAsIDB4MDJ9LAotI2VuZGlmIC8qICEgUFJFRkVSX05UU0MqLwotCXsweDQxLCAweEZGfSwKLQl7MHg0MiwgMHhGRn0sCi0JezB4NDMsIDB4RkZ9LAotCXsweDQ0LCAweEZGfSwKLQl7MHg0NSwgMHhGRn0sCi0JezB4NDYsIDB4RkZ9LAotCXsweDQ3LCAweEZGfSwKLQl7MHg0OCwgMHhGRn0sCi0JezB4NDksIDB4RkZ9LAotCXsweDRBLCAweEZGfSwKLQl7MHg0QiwgMHhGRn0sCi0JezB4NEMsIDB4RkZ9LAotCXsweDRELCAweEZGfSwKLQl7MHg0RSwgMHhGRn0sCi0JezB4NEYsIDB4RkZ9LAotCXsweDUwLCAweEZGfSwKLQl7MHg1MSwgMHhGRn0sCi0JezB4NTIsIDB4RkZ9LAotCXsweDUzLCAweEZGfSwKLQl7MHg1NCwgMHhGRn0sCi0JezB4NTUsIDB4RkZ9LAotCXsweDU2LCAweEZGfSwKLQl7MHg1NywgMHhGRn0sCi0JezB4NTgsIDB4NDB9LAotCXsweDU5LCAweDU0fSwKLSNpZiBkZWZpbmVkKFBSRUZFUl9OVFNDKQotCXsweDVBLCAweDBBfSwKLSNlbHNlCi0JezB4NUEsIDB4MDd9LAotI2VuZGlmIC8qICEgUFJFRkVSX05UU0MqLwotCXsweDVCLCAweDgzfSwKLQl7MHhGRiwgMHhGRn0KLQl9OworCQl7MHgwMiwgMHg4MH0sCisjZW5kaWYgLypBTlRJQUxJQVMqLworCQl7MHgwMywgMHgzM30sCisJCXsweDA0LCAweDAwfSwKKwkJezB4MDUsIDB4MDB9LAorCQl7MHgwNiwgMHhFOX0sCisJCXsweDA3LCAweDBEfSwKKwkJezB4MDgsIDB4Nzh9LAorCQl7MHgwOSwgMHgwMH0sCisJCXsweDBBLCBTQUFfMEFfREVGQVVMVH0sCisJCXsweDBCLCBTQUFfMEJfREVGQVVMVH0sCisJCXsweDBDLCBTQUFfMENfREVGQVVMVH0sCisJCXsweDBELCBTQUFfMERfREVGQVVMVH0sCisJCXsweDBFLCAweDAxfSwKKwkJezB4MEYsIDB4MzZ9LAorCQl7MHgxMCwgMHgwMH0sCisJCXsweDExLCAweDBDfSwKKwkJezB4MTIsIDB4RTd9LAorCQl7MHgxMywgMHgwMH0sCisJCXsweDE1LCAweDAwfSwKKwkJezB4MTYsIDB4MDB9LAorCQl7MHg0MCwgMHg4Mn0sCisJCXsweDQxLCAweEZGfSwKKwkJezB4NDIsIDB4RkZ9LAorCQl7MHg0MywgMHhGRn0sCisJCXsweDQ0LCAweEZGfSwKKwkJezB4NDUsIDB4RkZ9LAorCQl7MHg0NiwgMHhGRn0sCisJCXsweDQ3LCAweEZGfSwKKwkJezB4NDgsIDB4RkZ9LAorCQl7MHg0OSwgMHhGRn0sCisJCXsweDRBLCAweEZGfSwKKwkJezB4NEIsIDB4RkZ9LAorCQl7MHg0QywgMHhGRn0sCisJCXsweDRELCAweEZGfSwKKwkJezB4NEUsIDB4RkZ9LAorCQl7MHg0RiwgMHhGRn0sCisJCXsweDUwLCAweEZGfSwKKwkJezB4NTEsIDB4RkZ9LAorCQl7MHg1MiwgMHhGRn0sCisJCXsweDUzLCAweEZGfSwKKwkJezB4NTQsIDB4RkZ9LAorCQl7MHg1NSwgMHhGRn0sCisJCXsweDU2LCAweEZGfSwKKwkJezB4NTcsIDB4RkZ9LAorCQl7MHg1OCwgMHg0MH0sCisJCXsweDU5LCAweDU0fSwKKwkJezB4NUEsIDB4MEF9LAorCQl7MHg1QiwgMHg4M30sCisKKwkJezB4RkYsIDB4RkZ9Cit9OwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTg3LDYgKzI0OCw5IEBACiBjb25maXJtX3Jlc29sdXRpb24oc3RydWN0IHVzYl9kZXZpY2UgKnApCiB7CiBfX3U4IGdldDAsIGdldDEsIGdldDIsIGdldDMsIGdldDQsIGdldDUsIGdldDYsIGdldDc7CisKK2lmIChOVUxMID09IHApCisJcmV0dXJuIC1FTk9ERVY7CiBHRVQocCwgMHgwMTEwLCAmZ2V0MCk7CiBHRVQocCwgMHgwMTExLCAmZ2V0MSk7CiBHRVQocCwgMHgwMTEyLCAmZ2V0Mik7CkBAIC0yMjcsNiArMjkxLDggQEAKIF9fdTE2IGdldDI7CiBfX3U4IGlnb3Q7CiAKK2lmIChOVUxMID09IHApCisJcmV0dXJuIC1FTk9ERVY7CiBHRVQocCwgMHgwMTAwLCAmaWdvdCk7ICBnZXQyID0gMHg4MCAmIGlnb3Q7CiBpZiAoMHg4MCA9PSBnZXQyKQogCUpPVCg4LCAiY29uZmlybV9zdHJlYW06ICBPS1xuIik7CkBAIC0yMzYsMTUgKzMwMiwyNCBAQAogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBpbnQKLXNldHVwX3N0ayhzdHJ1Y3QgdXNiX2RldmljZSAqcCkKK3NldHVwX3N0ayhzdHJ1Y3QgdXNiX2RldmljZSAqcCwgYm9vbCBudHNjKQogewogaW50IGkwOwogCitpZiAoTlVMTCA9PSBwKQorCXJldHVybiAtRU5PREVWOwogaTAgPSAwOwotd2hpbGUgKDB4RkZGICE9IHN0azExNjBjb25maWdbaTBdLnJlZykgewotCVNFVChwLCBzdGsxMTYwY29uZmlnW2kwXS5yZWcsIHN0azExNjBjb25maWdbaTBdLnNldCk7Ci0JaTArKzsKK2lmICh0cnVlID09IG50c2MpIHsKKwl3aGlsZSAoMHhGRkYgIT0gc3RrMTE2MGNvbmZpZ05UU0NbaTBdLnJlZykgeworCQlTRVQocCwgc3RrMTE2MGNvbmZpZ05UU0NbaTBdLnJlZywgc3RrMTE2MGNvbmZpZ05UU0NbaTBdLnNldCk7CisJCWkwKys7CiAJfQorfSBlbHNlIHsKKwl3aGlsZSAoMHhGRkYgIT0gc3RrMTE2MGNvbmZpZ1BBTFtpMF0ucmVnKSB7CisJCVNFVChwLCBzdGsxMTYwY29uZmlnUEFMW2kwXS5yZWcsIHN0azExNjBjb25maWdQQUxbaTBdLnNldCk7CisJCWkwKys7CisJfQorfQogCiB3cml0ZV8zMDAocCk7CiAKQEAgLTI1MiwxOSArMzI3LDI2IEBACiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGludAotc2V0dXBfc2FhKHN0cnVjdCB1c2JfZGV2aWNlICpwKQorc2V0dXBfc2FhKHN0cnVjdCB1c2JfZGV2aWNlICpwLCBib29sIG50c2MpCiB7CiBpbnQgaTAsIGlyOwogCi0KLXNldDJ0bzc4KHApOwotCi0KK2lmIChOVUxMID09IHApCisJcmV0dXJuIC1FTk9ERVY7CiBpMCA9IDA7Ci13aGlsZSAoMHhGRiAhPSBzYWE3MTEzY29uZmlnW2kwXS5yZWcpIHsKLQlpciA9IHdyaXRlX3NhYShwLCBzYWE3MTEzY29uZmlnW2kwXS5yZWcsIHNhYTcxMTNjb25maWdbaTBdLnNldCk7Ci0JaTArKzsKK2lmICh0cnVlID09IG50c2MpIHsKKwl3aGlsZSAoMHhGRiAhPSBzYWE3MTEzY29uZmlnTlRTQ1tpMF0ucmVnKSB7CisJCWlyID0gd3JpdGVfc2FhKHAsIHNhYTcxMTNjb25maWdOVFNDW2kwXS5yZWcsIFwKKwkJCQkJc2FhNzExM2NvbmZpZ05UU0NbaTBdLnNldCk7CisJCWkwKys7CiAJfQorfSBlbHNlIHsKKwl3aGlsZSAoMHhGRiAhPSBzYWE3MTEzY29uZmlnUEFMW2kwXS5yZWcpIHsKKwkJaXIgPSB3cml0ZV9zYWEocCwgc2FhNzExM2NvbmZpZ1BBTFtpMF0ucmVnLCBcCisJCQkJCXNhYTcxMTNjb25maWdQQUxbaTBdLnNldCk7CisJCWkwKys7CisJfQorfQogcmV0dXJuIDA7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTI3Myw2ICszNTUsOCBAQAogewogX191OCBpZ290MCwgaWdvdDI7CiAKK2lmIChOVUxMID09IHApCisJcmV0dXJuIC1FTk9ERVY7CiBHRVQocCwgMHgwMDAyLCAmaWdvdDIpOwogR0VUKHAsIDB4MDAwMCwgJmlnb3QwKTsKIFNFVChwLCAweDAwMDIsIHNldDIpOwpAQCAtMjgzLDYgKzM2Nyw4IEBACiBpbnQKIHdyaXRlX3NhYShzdHJ1Y3QgdXNiX2RldmljZSAqcCwgX191MTYgcmVnMCwgX191MTYgc2V0MCkKIHsKK2lmIChOVUxMID09IHApCisJcmV0dXJuIC1FTk9ERVY7CiBTRVQocCwgMHgyMDAsIDB4MDApOwogU0VUKHAsIDB4MjA0LCByZWcwKTsKIFNFVChwLCAweDIwNSwgc2V0MCk7CkBAIC0zMDYsNiArMzkyLDggQEAKIF9fdTE2IGdvdDUwMiwgZ290NTAzOwogX191MTYgc2V0NTAyLCBzZXQ1MDM7CiAKK2lmIChOVUxMID09IHApCisJcmV0dXJuIC1FTk9ERVY7CiBTRVQocCwgMHgwNTA0LCByZWcwKTsKIFNFVChwLCAweDA1MDAsIDB4MDA4Qik7CiAKQEAgLTM0MSw2ICs0MjksOCBAQAogX191OCBpZ290OwogX191MTYgZ290NTAyLCBnb3Q1MDM7CiAKK2lmIChOVUxMID09IHApCisJcmV0dXJuIC1FTk9ERVY7CiBTRVQocCwgMHgwNTA0LCByZWcwKTsKIFNFVChwLCAweDA1MDAsIDB4MDA4Qik7CiAKQEAgLTM2MCw2ICs0NTAsOCBAQAogaW50CiB3cml0ZV8zMDAoc3RydWN0IHVzYl9kZXZpY2UgKnApCiB7CitpZiAoTlVMTCA9PSBwKQorCXJldHVybiAtRU5PREVWOwogU0VUKHAsIDB4MzAwLCAweDAwMTIpOwogU0VUKHAsIDB4MzUwLCAweDAwMkQpOwogU0VUKHAsIDB4MzUxLCAweDAwMDEpOwpAQCAtMzc2LDI0ICs0NjgsNDggQEAKICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBpbnQKLWNoZWNrX3NhYShzdHJ1Y3QgdXNiX2RldmljZSAqcCkKK2NoZWNrX3NhYShzdHJ1Y3QgdXNiX2RldmljZSAqcCwgYm9vbCBudHNjKQogewogaW50IGkwLCBpciwgcmM7CisKK2lmIChOVUxMID09IHApCisJcmV0dXJuIC1FTk9ERVY7CiBpMCA9IDA7Ci0KIHJjID0gMDsKLXdoaWxlICgweEZGICE9IHNhYTcxMTNjb25maWdbaTBdLnJlZykgewotCWlmICgweDBGID09IHNhYTcxMTNjb25maWdbaTBdLnJlZykgewotCQlpMCsrOyBjb250aW51ZTsKLQl9CitpZiAodHJ1ZSA9PSBudHNjKSB7CisJd2hpbGUgKDB4RkYgIT0gc2FhNzExM2NvbmZpZ05UU0NbaTBdLnJlZykgeworCQlpZiAoMHgwRiA9PSBzYWE3MTEzY29uZmlnTlRTQ1tpMF0ucmVnKSB7CisJCQlpMCsrOworCQkJY29udGludWU7CisJCX0KIAotCWlyID0gcmVhZF9zYWEocCwgc2FhNzExM2NvbmZpZ1tpMF0ucmVnKTsKLQlpZiAoaXIgIT0gc2FhNzExM2NvbmZpZ1tpMF0uc2V0KSB7Ci0JCVNBWSgiU0FBIHJlZ2lzdGVyIDB4JTAyWCBoYXMgMHglMDJYLCBleHBlY3RlZCAweCUwMlhcbiIsIFwKLQkJCXNhYTcxMTNjb25maWdbaTBdLnJlZywgaXIsIHNhYTcxMTNjb25maWdbaTBdLnNldCk7Ci0JCXJjLS07CisJCWlyID0gcmVhZF9zYWEocCwgc2FhNzExM2NvbmZpZ05UU0NbaTBdLnJlZyk7CisJCWlmIChpciAhPSBzYWE3MTEzY29uZmlnTlRTQ1tpMF0uc2V0KSB7CisJCQlTQVkoIlNBQSByZWdpc3RlciAweCUwMlggaGFzIDB4JTAyWCwgIiBcCisJCQkJCQkiZXhwZWN0ZWQgMHglMDJYXG4iLCBcCisJCQkJCQlzYWE3MTEzY29uZmlnTlRTQ1tpMF0ucmVnLCBcCisJCQkJCQlpciwgc2FhNzExM2NvbmZpZ05UU0NbaTBdLnNldCk7CisJCQlyYy0tOworCQl9CisJCWkwKys7CiAJfQotCWkwKys7Cit9IGVsc2UgeworCXdoaWxlICgweEZGICE9IHNhYTcxMTNjb25maWdQQUxbaTBdLnJlZykgeworCQlpZiAoMHgwRiA9PSBzYWE3MTEzY29uZmlnUEFMW2kwXS5yZWcpIHsKKwkJCWkwKys7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlyID0gcmVhZF9zYWEocCwgc2FhNzExM2NvbmZpZ1BBTFtpMF0ucmVnKTsKKwkJaWYgKGlyICE9IHNhYTcxMTNjb25maWdQQUxbaTBdLnNldCkgeworCQkJU0FZKCJTQUEgcmVnaXN0ZXIgMHglMDJYIGhhcyAweCUwMlgsICIgXAorCQkJCQkJImV4cGVjdGVkIDB4JTAyWFxuIiwgXAorCQkJCQkJc2FhNzExM2NvbmZpZ1BBTFtpMF0ucmVnLCBcCisJCQkJCQlpciwgc2FhNzExM2NvbmZpZ1BBTFtpMF0uc2V0KTsKKwkJCXJjLS07CisJCX0KKwkJaTArKzsKKwl9CiB9CiBpZiAoLTggPiByYykKIAlyZXR1cm4gcmM7CkBAIC00MDYsNiArNTIyLDggQEAKIHsKIGludCByYzsKIAoraWYgKE5VTEwgPT0gcCkKKwlyZXR1cm4gLUVOT0RFVjsKIHJjID0gcmVhZF9zYWEocCwgMHgxRik7CiBpZiAoKDAgPiByYykgfHwgKDB4MDIgJiByYykpCiAJcmV0dXJuIDEgOwpAQCAtNDE2LDI5ICs1MzQsNDYgQEAKIGludAogcmVhZHlfc2FhKHN0cnVjdCB1c2JfZGV2aWNlICpwKQogewotaW50IGosIHJjOwotc3RhdGljIGludCBtYXggPSAxMDsKLQoraW50IGosIHJjLCByYXRlOworY29uc3QgaW50IG1heCA9IDUsIG1hcmt0aW1lID0gUEFUSUVOQ0UvNTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICAgUkVUVVJOUyAgICAwICAgICBGT1IgSU5URVJMQUNFRCAgICAgICA1MCBIegorICogICAgICAgICAgICAgIDEgICAgIEZPUiBOT04tSU5URVJMQUNFRCAgIDUwIEh6CisgKiAgICAgICAgICAgICAgMiAgICAgRk9SIElOVEVSTEFDRUQgICAgICAgNjAgSHoKKyAqICAgICAgICAgICAgICAzICAgICBGT1IgTk9OLUlOVEVSTEFDRUQgICA2MCBIegorKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaWYgKE5VTEwgPT0gcCkKKwlyZXR1cm4gLUVOT0RFVjsKIGogPSAwOwogd2hpbGUgKG1heCA+IGopIHsKIAlyYyA9IHJlYWRfc2FhKHAsIDB4MUYpOwogCWlmICgwIDw9IHJjKSB7Ci0JCWlmICgoMSA9PSAoMHgwMSAmIHJjKSkmJigwID09ICgweDQwICYgcmMpKSkKKwkJaWYgKDAgPT0gKDB4NDAgJiByYykpCisJCQlicmVhazsKKwkJaWYgKDEgPT0gKDB4MDEgJiByYykpCiAJCQlicmVhazsKIAl9Ci0JbXNsZWVwKDEwMCk7ICBqKys7CisJbXNsZWVwKG1hcmt0aW1lKTsKKwlqKys7CiB9CiBpZiAobWF4ID09IGopCiAJcmV0dXJuIC0xOwogZWxzZSB7Ci0JaWYgKDB4MjAgJiByYykKKwlpZiAoMHgyMCAmIHJjKSB7CisJCXJhdGUgPSAyOwogCQlKT1QoOCwgImhhcmR3YXJlIGRldGVjdHMgNjAgSHpcbiIpOwotCWVsc2UKKwl9IGVsc2UgeworCQlyYXRlID0gMDsKIAkJSk9UKDgsICJoYXJkd2FyZSBkZXRlY3RzIDUwIEh6XG4iKTsKKwl9CiAJaWYgKDB4ODAgJiByYykKIAkJSk9UKDgsICJoYXJkd2FyZSBkZXRlY3RzIGludGVybGFjaW5nXG4iKTsKLQllbHNlCisJZWxzZSB7CisJCXJhdGUrKzsKIAkJSk9UKDgsICJoYXJkd2FyZSBkZXRlY3RzIG5vIGludGVybGFjaW5nXG4iKTsKKwl9CiB9CiByZXR1cm4gMDsKIH0KQEAgLTQ0Nyw0NSArNTgyLDgwIEBACiAvKgogICogIE5PVEU6IFRIRSBGT0xMT1dJTkcgQVJFIE5PVCBDSEVDS0VEOgogICogIFJFR0lTVEVSUyAweDAwMCwgMHgwMDI6ICBGVU5DVElPTkFMSVRZIElTIE5PVCBLTk9XTgotICogIFJFR0lTVEVSICAweDEwMDogIEFDQ0VQVCBBTFNPICgweDgwIHwgc3RrMTE2MGNvbmZpZ1suXS5zZXQpCisgKiAgUkVHSVNURVIgIDB4MTAwOiAgQUNDRVBUIEFMU08gKDB4ODAgfCBzdGsxMTYwY29uZmlnLi4uLlsuXS5zZXQpCiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogaW50Ci1jaGVja19zdGsoc3RydWN0IHVzYl9kZXZpY2UgKnApCitjaGVja19zdGsoc3RydWN0IHVzYl9kZXZpY2UgKnAsIGJvb2wgbnRzYykKIHsKIGludCBpMCwgaXI7CisKK2lmIChOVUxMID09IHApCisJcmV0dXJuIC1FTk9ERVY7CiBpMCA9IDA7Ci13aGlsZSAoMHhGRkYgIT0gc3RrMTE2MGNvbmZpZ1tpMF0ucmVnKSB7Ci0JaWYgKDB4MDAwID09IHN0azExNjBjb25maWdbaTBdLnJlZykgewotCQlpMCsrOyBjb250aW51ZTsKLQl9Ci0JaWYgKDB4MDAyID09IHN0azExNjBjb25maWdbaTBdLnJlZykgewotCQlpMCsrOyBjb250aW51ZTsKLQl9Ci0KLQlpciA9IHJlYWRfc3RrKHAsIHN0azExNjBjb25maWdbaTBdLnJlZyk7Ci0KLQlpZiAoMHgxMDAgPT0gc3RrMTE2MGNvbmZpZ1tpMF0ucmVnKSB7Ci0JCWlmICgoaXIgIT0gKDB4RkYgJiBzdGsxMTYwY29uZmlnW2kwXS5zZXQpKSAmJiBcCi0JCQkoaXIgIT0gKDB4ODAgfCAoMHhGRiAmIHN0azExNjBjb25maWdbaTBdLnNldCkpKSAmJiBcCi0JCQkJKDB4RkZGRiAhPSBzdGsxMTYwY29uZmlnW2kwXS5zZXQpKSB7Ci0JCQlTQVkoIlNUSyByZWdpc3RlciAweCUwM1ggaGFzIDB4JTAyWCwgIiBcCi0JCQkJCSJleHBlY3RlZCAweCUwMlhcbiIsIFwKLQkJCQkJc3RrMTE2MGNvbmZpZ1tpMF0ucmVnLCBpciwgXAotCQkJCQlzdGsxMTYwY29uZmlnW2kwXS5zZXQpOworaWYgKHRydWUgPT0gbnRzYykgeworCXdoaWxlICgweEZGRiAhPSBzdGsxMTYwY29uZmlnTlRTQ1tpMF0ucmVnKSB7CisJCWlmICgweDAwMCA9PSBzdGsxMTYwY29uZmlnTlRTQ1tpMF0ucmVnKSB7CisJCQlpMCsrOyBjb250aW51ZTsKKwkJfQorCQlpZiAoMHgwMDIgPT0gc3RrMTE2MGNvbmZpZ05UU0NbaTBdLnJlZykgeworCQkJaTArKzsgY29udGludWU7CisJCX0KKwkJaXIgPSByZWFkX3N0ayhwLCBzdGsxMTYwY29uZmlnTlRTQ1tpMF0ucmVnKTsKKwkJaWYgKDB4MTAwID09IHN0azExNjBjb25maWdOVFNDW2kwXS5yZWcpIHsKKwkJCWlmICgoaXIgIT0gKDB4RkYgJiBzdGsxMTYwY29uZmlnTlRTQ1tpMF0uc2V0KSkgJiYgXAorCQkJCQkoaXIgIT0gKDB4ODAgfCAoMHhGRiAmIFwKKwkJCQkJc3RrMTE2MGNvbmZpZ05UU0NbaTBdLnNldCkpKSAmJiBcCisJCQkJCSgweEZGRkYgIT0gXAorCQkJCQlzdGsxMTYwY29uZmlnTlRTQ1tpMF0uc2V0KSkgeworCQkJCVNBWSgiU1RLIHJlZ2lzdGVyIDB4JTAzWCBoYXMgMHglMDJYLCAiIFwKKwkJCQkJCSJleHBlY3RlZCAweCUwMlhcbiIsIFwKKwkJCQkJCXN0azExNjBjb25maWdOVFNDW2kwXS5yZWcsIFwKKwkJCQkJCWlyLCBzdGsxMTYwY29uZmlnTlRTQ1tpMF0uc2V0KTsKKwkJCQl9CisJCQlpMCsrOyBjb250aW51ZTsKIAkJCX0KLQkJaTArKzsgY29udGludWU7CisJCWlmICgoaXIgIT0gKDB4RkYgJiBzdGsxMTYwY29uZmlnTlRTQ1tpMF0uc2V0KSkgJiYgXAorCQkJCSgweEZGRkYgIT0gc3RrMTE2MGNvbmZpZ05UU0NbaTBdLnNldCkpIHsKKwkJCVNBWSgiU1RLIHJlZ2lzdGVyIDB4JTAzWCBoYXMgMHglMDJYLCAiIFwKKwkJCQkJCSJleHBlY3RlZCAweCUwMlhcbiIsIFwKKwkJCQkJCXN0azExNjBjb25maWdOVFNDW2kwXS5yZWcsIFwKKwkJCQkJCWlyLCBzdGsxMTYwY29uZmlnTlRTQ1tpMF0uc2V0KTsKIAkJfQotCi0JaWYgKChpciAhPSAoMHhGRiAmIHN0azExNjBjb25maWdbaTBdLnNldCkpICYmIFwKLQkJCSgweEZGRkYgIT0gc3RrMTE2MGNvbmZpZ1tpMF0uc2V0KSkgewotCQlTQVkoIlNUSyByZWdpc3RlciAweCUwM1ggaGFzIDB4JTAyWCwgIiBcCi0JCQkJCSJleHBlY3RlZCAweCUwMlhcbiIsIFwKLQkJCQkJc3RrMTE2MGNvbmZpZ1tpMF0ucmVnLCBpciwgXAotCQkJCQlzdGsxMTYwY29uZmlnW2kwXS5zZXQpOwotCQl9Ci0JaTArKzsKKwkJaTArKzsKIAl9Cit9IGVsc2UgeworCXdoaWxlICgweEZGRiAhPSBzdGsxMTYwY29uZmlnUEFMW2kwXS5yZWcpIHsKKwkJaWYgKDB4MDAwID09IHN0azExNjBjb25maWdQQUxbaTBdLnJlZykgeworCQkJaTArKzsgY29udGludWU7CisJCX0KKwkJaWYgKDB4MDAyID09IHN0azExNjBjb25maWdQQUxbaTBdLnJlZykgeworCQkJaTArKzsgY29udGludWU7CisJCX0KKwkJaXIgPSByZWFkX3N0ayhwLCBzdGsxMTYwY29uZmlnUEFMW2kwXS5yZWcpOworCQlpZiAoMHgxMDAgPT0gc3RrMTE2MGNvbmZpZ1BBTFtpMF0ucmVnKSB7CisJCQlpZiAoKGlyICE9ICgweEZGICYgc3RrMTE2MGNvbmZpZ1BBTFtpMF0uc2V0KSkgJiYgXAorCQkJCQkoaXIgIT0gKDB4ODAgfCAoMHhGRiAmIFwKKwkJCQkJc3RrMTE2MGNvbmZpZ1BBTFtpMF0uc2V0KSkpICYmIFwKKwkJCQkJKDB4RkZGRiAhPSBcCisJCQkJCXN0azExNjBjb25maWdQQUxbaTBdLnNldCkpIHsKKwkJCQlTQVkoIlNUSyByZWdpc3RlciAweCUwM1ggaGFzIDB4JTAyWCwgIiBcCisJCQkJCQkiZXhwZWN0ZWQgMHglMDJYXG4iLCBcCisJCQkJCQlzdGsxMTYwY29uZmlnUEFMW2kwXS5yZWcsIFwKKwkJCQkJCWlyLCBzdGsxMTYwY29uZmlnUEFMW2kwXS5zZXQpOworCQkJCX0KKwkJCWkwKys7IGNvbnRpbnVlOworCQkJfQorCQlpZiAoKGlyICE9ICgweEZGICYgc3RrMTE2MGNvbmZpZ1BBTFtpMF0uc2V0KSkgJiYgXAorCQkJCSgweEZGRkYgIT0gc3RrMTE2MGNvbmZpZ1BBTFtpMF0uc2V0KSkgeworCQkJU0FZKCJTVEsgcmVnaXN0ZXIgMHglMDNYIGhhcyAweCUwMlgsICIgXAorCQkJCQkJImV4cGVjdGVkIDB4JTAyWFxuIiwgXAorCQkJCQkJc3RrMTE2MGNvbmZpZ1BBTFtpMF0ucmVnLCBcCisJCQkJCQlpciwgc3RrMTE2MGNvbmZpZ1BBTFtpMF0uc2V0KTsKKwkJfQorCQlpMCsrOworCX0KK30KIHJldHVybiAwOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00OTQsNiArNjY0LDggQEAKIHsKIF9fdTggaWdvdDsKIAoraWYgKE5VTEwgPT0gcCkKKwlyZXR1cm4gLUVOT0RFVjsKIFNFVChwLCAweDIwOCwgcmVnMCk7CiBTRVQocCwgMHgyMDAsIDB4MjApOwogaWYgKDAgIT0gd2FpdF9pMmMocCkpCkBAIC01MDgsMTIgKzY4MCwxNCBAQAogewogX191OCBpZ290OwogCitpZiAoTlVMTCA9PSBwKQorCXJldHVybiAtRU5PREVWOwogaWdvdCA9IDA7CiBHRVQocCwgcmVnMCwgJmlnb3QpOwogcmV0dXJuIGlnb3Q7CiB9Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKICAqICAgIEhBUkRXQVJFICAgIFVTRVJTUEFDRSBJTlBVVCBOVU1CRVIgICBQSFlTSUNBTCBJTlBVVCAgIERSSVZFUiBpbnB1dCBWQUxVRQogICoKQEAgLTUzNCw4MSArNzA4LDEwMCBAQAogaW50CiBzZWxlY3RfaW5wdXQoc3RydWN0IHVzYl9kZXZpY2UgKnAsIGludCBpbnB1dCwgaW50IG1vZGUpCiB7CitpbnQgaXI7CiAKK2lmIChOVUxMID09IHApCisJcmV0dXJuIC1FTk9ERVY7CiBzdG9wXzEwMChwKTsKLQotbXNsZWVwKDIwKTsKIHN3aXRjaCAoaW5wdXQpIHsKIGNhc2UgMDoKIGNhc2UgMTogewotCVNFVChwLCAweDAwMDAsIDB4MDA5OCk7IGJyZWFrOworCWlmICgwICE9IHdyaXRlX3NhYShwLCAweDAyLCAweDgwKSkgeworCQlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gc2V0IFNBQSByZWdpc3RlciAweDAyIGZvciBpbnB1dCAlaVxuIiwgXAorCQkJCQkJCQkJaW5wdXQpOworCX0KKwlTRVQocCwgMHgwMDAwLCAweDAwOTgpOworCVNFVChwLCAweDAwMDIsIDB4MDA3OCk7CisJYnJlYWs7CiB9CiBjYXNlIDI6IHsKLQlTRVQocCwgMHgwMDAwLCAweDAwOTApOyBicmVhazsKKwlpZiAoMCAhPSB3cml0ZV9zYWEocCwgMHgwMiwgMHg4MCkpIHsKKwkJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHNldCBTQUEgcmVnaXN0ZXIgMHgwMiBmb3IgaW5wdXQgJWlcbiIsIFwKKwkJCQkJCQkJCWlucHV0KTsKKwl9CisJU0VUKHAsIDB4MDAwMCwgMHgwMDkwKTsKKwlTRVQocCwgMHgwMDAyLCAweDAwNzgpOworCWJyZWFrOwogfQogY2FzZSAzOiB7Ci0JU0VUKHAsIDB4MDAwMCwgMHgwMDg4KTsgYnJlYWs7CisJaWYgKDAgIT0gd3JpdGVfc2FhKHAsIDB4MDIsIDB4ODApKSB7CisJCVNBWSgiRVJST1I6IGZhaWxlZCB0byBzZXQgU0FBIHJlZ2lzdGVyIDB4MDIgZm9yIGlucHV0ICVpXG4iLCBcCisJCQkJCQkJCQlpbnB1dCk7CisJfQorCVNFVChwLCAweDAwMDAsIDB4MDA4OCk7CisJU0VUKHAsIDB4MDAwMiwgMHgwMDc4KTsKKwlicmVhazsKIH0KIGNhc2UgNDogewotCVNFVChwLCAweDAwMDAsIDB4MDA4MCk7IGJyZWFrOworCWlmICgwICE9IHdyaXRlX3NhYShwLCAweDAyLCAweDgwKSkgeworCQlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gc2V0IFNBQSByZWdpc3RlciAweDAyIGZvciBpbnB1dCAlaVxuIiwgXAorCQkJCQkJCQkJaW5wdXQpOworCX0KKwlTRVQocCwgMHgwMDAwLCAweDAwODApOworCVNFVChwLCAweDAwMDIsIDB4MDA3OCk7CisJYnJlYWs7CiB9CiBjYXNlIDU6IHsKIAlpZiAoOSAhPSBtb2RlKQogCQltb2RlID0gNzsKIAlzd2l0Y2ggKG1vZGUpIHsKLQljYXNlIDc6Ci0JCXsKKwljYXNlIDc6IHsKIAkJaWYgKDAgIT0gd3JpdGVfc2FhKHAsIDB4MDIsIDB4ODcpKSB7Ci0JCQlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gc2V0IFNBQSAiIFwKLQkJCQkicmVnaXN0ZXIgMHgwMiBmb3IgaW5wdXQgIiBcCi0JCQkJIiVpXG4iLCBpbnB1dCk7CisJCQlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gc2V0IFNBQSByZWdpc3RlciAweDAyICIgXAorCQkJCQkJImZvciBpbnB1dCAlaVxuIiwgaW5wdXQpOwogCQl9CiAJCWlmICgwICE9IHdyaXRlX3NhYShwLCAweDA1LCAweEZGKSkgewotCQkJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHNldCBTQUEgIiBcCi0JCQkJInJlZ2lzdGVyIDB4MDUgZm9yIGlucHV0ICIgXAotCQkJCSIlaVxuIiwgaW5wdXQpOworCQkJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHNldCBTQUEgcmVnaXN0ZXIgMHgwNSAiIFwKKwkJCQkJCSJmb3IgaW5wdXQgJWlcbiIsIGlucHV0KTsKIAkJfQogCQlicmVhazsKIAl9Ci0JY2FzZSA5OgotCQl7CisJY2FzZSA5OiB7CiAJCWlmICgwICE9IHdyaXRlX3NhYShwLCAweDAyLCAweDg5KSkgewotCQkJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHNldCBTQUEgIiBcCi0JCQkJInJlZ2lzdGVyIDB4MDIgZm9yIGlucHV0ICIgXAotCQkJCSIlaVxuIiwgaW5wdXQpOworCQkJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHNldCBTQUEgcmVnaXN0ZXIgMHgwMiAiIFwKKwkJCQkJCSJmb3IgaW5wdXQgJWlcbiIsIGlucHV0KTsKIAkJfQogCQlpZiAoMCAhPSB3cml0ZV9zYWEocCwgMHgwNSwgMHgwMCkpIHsKLQkJCVNBWSgiRVJST1I6IGZhaWxlZCB0byBzZXQgU0FBICIgXAotCQkJCSJyZWdpc3RlciAweDA1IGZvciBpbnB1dCAiIFwKLQkJCQkiJWlcbiIsIGlucHV0KTsKKwkJCVNBWSgiRVJST1I6IGZhaWxlZCB0byBzZXQgU0FBIHJlZ2lzdGVyIDB4MDUgIiBcCisJCQkJCQkiZm9yIGlucHV0ICVpXG4iLCBpbnB1dCk7CiAJCX0KLQkJYnJlYWs7CisJYnJlYWs7CiAJfQotCWRlZmF1bHQ6Ci0JCXsKKwlkZWZhdWx0OiB7CiAJCVNBWSgiTUlTVEFLRTogIGJhZCBtb2RlOiAlaVxuIiwgbW9kZSk7CiAJCXJldHVybiAtMTsKLQkJfQorCX0KIAl9CiAJaWYgKDAgIT0gd3JpdGVfc2FhKHAsIDB4MDQsIDB4MDApKSB7Ci0JCVNBWSgiRVJST1I6IGZhaWxlZCB0byBzZXQgU0FBIHJlZ2lzdGVyIDB4MDQgIiBcCi0JCQkJCSJmb3IgaW5wdXQgJWlcbiIsIGlucHV0KTsKKwkJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHNldCBTQUEgcmVnaXN0ZXIgMHgwNCBmb3IgaW5wdXQgJWlcbiIsIFwKKwkJCQkJCQkJCWlucHV0KTsKIAl9CiAJaWYgKDAgIT0gd3JpdGVfc2FhKHAsIDB4MDksIDB4ODApKSB7Ci0JCVNBWSgiRVJST1I6IGZhaWxlZCB0byBzZXQgU0FBIHJlZ2lzdGVyIDB4MDkgIiBcCi0JCQkJCSJmb3IgaW5wdXQgJWlcbiIsIGlucHV0KTsKKwkJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHNldCBTQUEgcmVnaXN0ZXIgMHgwOSBmb3IgaW5wdXQgJWlcbiIsIFwKKwkJCQkJCQkJCWlucHV0KTsKIAl9CisJU0VUKHAsIDB4MDAwMiwgMHgwMDkzKTsKIAlicmVhazsKIH0KLWRlZmF1bHQ6Ci0JeworZGVmYXVsdDogewogCVNBWSgiRVJST1I6ICBiYWQgaW5wdXQ6ICVpXG4iLCBpbnB1dCk7CiAJcmV0dXJuIC0xOwogfQogfQotbXNsZWVwKDIwKTsKLVNFVChwLCAweDAwMDIsIDB4MDA5Myk7Ci1tc2xlZXAoMjApOworaXIgPSByZWFkX3N0ayhwLCAweDAwKTsKK0pPVCg4LCAiU1RLIHJlZ2lzdGVyIDB4MDAgaGFzIDB4JTAyWFxuIiwgaXIpOworaXIgPSByZWFkX3NhYShwLCAweDAyKTsKK0pPVCg4LCAiU0FBIHJlZ2lzdGVyIDB4MDIgaGFzIDB4JTAyWFxuIiwgaXIpOwogCiBzdGFydF8xMDAocCk7CiAKQEAgLTYyMSw2ICs4MTQsOCBAQAogewogX191MTYgdTB4MDExMSwgdTB4MDExMywgdTB4MDExNSwgdTB4MDExNzsKIAoraWYgKE5VTEwgPT0gcCkKKwlyZXR1cm4gLUVOT0RFVjsKIHUweDAxMTEgPSAoKDB4RkYwMCAmIHNldDApID4+IDgpOwogdTB4MDExMyA9ICgoMHhGRjAwICYgc2V0MSkgPj4gOCk7CiB1MHgwMTE1ID0gKCgweEZGMDAgJiBzZXQyKSA+PiA4KTsKQEAgLTY0MSwxMyArODM2LDI1IEBACiBpbnQKIHN0YXJ0XzEwMChzdHJ1Y3QgdXNiX2RldmljZSAqcCkKIHsKLV9fdTE2IGdldDA7Ci1fX3U4IGlnb3Q7CitfX3UxNiBnZXQxMTYsIGdldDExNywgZ2V0MDsKK19fdTggaWdvdDExNiwgaWdvdDExNywgaWdvdDsKIAotR0VUKHAsIDB4MDEwMCwgJmlnb3QpOyAgZ2V0MCA9IGlnb3Q7Ci1tc2xlZXAoMHgxZjQpOworaWYgKE5VTEwgPT0gcCkKKwlyZXR1cm4gLUVOT0RFVjsKK0dFVChwLCAweDAxMTYsICZpZ290MTE2KTsKK2dldDExNiA9IGlnb3QxMTY7CitHRVQocCwgMHgwMTE3LCAmaWdvdDExNyk7CitnZXQxMTcgPSBpZ290MTE3OworU0VUKHAsIDB4MDExNiwgMHgwMDAwKTsKK1NFVChwLCAweDAxMTcsIDB4MDAwMCk7CisKK0dFVChwLCAweDAxMDAsICZpZ290KTsKK2dldDAgPSBpZ290OwogU0VUKHAsIDB4MDEwMCwgKDB4ODAgfCBnZXQwKSk7Ci1tc2xlZXAoMHgxZjQpOworCitTRVQocCwgMHgwMTE2LCBnZXQxMTYpOworU0VUKHAsIDB4MDExNywgZ2V0MTE3KTsKKwogcmV0dXJuIDA7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTY1NywxMCArODY0LDExIEBACiBfX3UxNiBnZXQwOwogX191OCBpZ290OwogCi1HRVQocCwgMHgwMTAwLCAmaWdvdCk7ICBnZXQwID0gaWdvdDsKLW1zbGVlcCgweDFmNCk7CitpZiAoTlVMTCA9PSBwKQorCXJldHVybiAtRU5PREVWOworR0VUKHAsIDB4MDEwMCwgJmlnb3QpOworZ2V0MCA9IGlnb3Q7CiBTRVQocCwgMHgwMTAwLCAoMHg3RiAmIGdldDApKTsKLW1zbGVlcCgweDFmNCk7CiByZXR1cm4gMDsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNjc0LDkgKzg4MiwxMSBAQAogewogX191MTYgZ2V0MDsKIF9fdTggaWdvdDsKLWNvbnN0IGludCBtYXggPSA0OworY29uc3QgaW50IG1heCA9IDI7CiBpbnQgazsKIAoraWYgKE5VTEwgPT0gcCkKKwlyZXR1cm4gLUVOT0RFVjsKIGZvciAoayA9IDA7ICBrIDwgbWF4OyAgaysrKSB7CiAJR0VUKHAsIDB4MDIwMSwgJmlnb3QpOyAgZ2V0MCA9IGlnb3Q7CiAJc3dpdGNoIChnZXQwKSB7CkBAIC02ODUsNyArODk1LDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCWNhc2UgMHgwMDogewotCQltc2xlZXAoMTApOworCQltc2xlZXAoMjApOwogCQljb250aW51ZTsKIAl9CiAJZGVmYXVsdDogewpAQCAtNzAzLDggKzkxMyw3IEBACiBpbnQgcmMwLCByYzE7CiAKIGlmICghcHVzYl9kZXZpY2UpCi0JcmV0dXJuIC1FRkFVTFQ7Ci0KKwlyZXR1cm4gLUVOT0RFVjsKIHJjMSA9IDA7ICBpZ290ID0gMDsKIHJjMCA9IHVzYl9jb250cm9sX21zZyhwdXNiX2RldmljZSwgdXNiX3NuZGN0cmxwaXBlKHB1c2JfZGV2aWNlLCAwKSwgXAogCQkoX191OCkweDAxLCBcCkBAIC03NDEsMjcgKzk1MCwxNCBAQAogY2FzZSAweDIwNToKIGNhc2UgMHgzNTA6CiBjYXNlIDB4MzUxOiB7Ci0JaWYgKDAgIT0gaWdvdCkgeworCWlmICgwICE9ICgweEZGICYgaWdvdCkpIHsKIAkJSk9UKDgsICJ1bmV4cGVjdGVkIDB4JTAyWCBmb3IgU1RLIHJlZ2lzdGVyIDB4JTAzWFxuIiwgXAogCQkJCQkJCQlpZ290LCBpbmRleCk7CiAJfQogYnJlYWs7CiB9Ci1jYXNlIDB4MTE0OgotY2FzZSAweDExNjogewotCWlmICgoMHhGRiAmIHZhbHVlKSAhPSBpZ290KSB7Ci0JCUpPVCg4LCAidW5leHBlY3RlZCAweCUwMlggIT0gMHglMDJYICIgXAotCQkJCQkJImZvciBTVEsgcmVnaXN0ZXIgMHglMDNYXG4iLCBcCi0JCQkJCQlpZ290LCB2YWx1ZSwgaW5kZXgpOwotCX0KLWJyZWFrOwotfQotY2FzZSAweDIwMDogewotCWlmICgwID09IGlnb3QpCi0JCWJyZWFrOwotfQogZGVmYXVsdDogewotCWlmICh2YWx1ZSAhPSBpZ290KSB7CisJaWYgKCgweEZGICYgdmFsdWUpICE9ICgweEZGICYgaWdvdCkpIHsKIAkJSk9UKDgsICJ1bmV4cGVjdGVkIDB4JTAyWCAhPSAweCUwMlggIiBcCiAJCQkJCSJmb3IgU1RLIHJlZ2lzdGVyIDB4JTAzWFxuIiwgXAogCQkJCQlpZ290LCB2YWx1ZSwgaW5kZXgpOwpAQCAtNzgwLDggKzk3Niw3IEBACiBpbnQgaXI7CiAKIGlmICghcHVzYl9kZXZpY2UpCi0JcmV0dXJuIC1FRkFVTFQ7Ci0KKwlyZXR1cm4gLUVOT0RFVjsKIGlyID0gdXNiX2NvbnRyb2xfbXNnKHB1c2JfZGV2aWNlLCB1c2JfcmN2Y3RybHBpcGUocHVzYl9kZXZpY2UsIDApLCBcCiAJCShfX3U4KTB4MDAsIFwKIAkJKF9fdTgpKFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFKSwgXApAQCAtNzk2LDYgKzk5MSw4IEBACiBpbnQKIHdha2V1cF9kZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UgKnB1c2JfZGV2aWNlKQogeworaWYgKCFwdXNiX2RldmljZSkKKwlyZXR1cm4gLUVOT0RFVjsKIHJldHVybiB1c2JfY29udHJvbF9tc2cocHVzYl9kZXZpY2UsIHVzYl9zbmRjdHJscGlwZShwdXNiX2RldmljZSwgMCksIFwKIAkJKF9fdTgpVVNCX1JFUV9TRVRfRkVBVFVSRSwgXAogCQkoX191OCkoVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9TVEFOREFSRCB8IFVTQl9SRUNJUF9ERVZJQ0UpLCBcCkBAIC04MDYsNiArMTAwMywxMiBAQAogCQkoaW50KTUwMDAwKTsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludAorYXVkaW9fc2V0dXAoc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwKQoreworc3RydWN0IHVzYl9kZXZpY2UgKnB1c2JfZGV2aWNlOwordW5zaWduZWQgY2hhciBidWZmZXJbMV07CitpbnQgcmMsIGlkMSwgaWQyOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTVBPUlRBTlQ6CkBAIC04MTQsMjkgKzEwMTcsMjEgQEAKICAqICBUTyBFTkFCTEUgQVVESU8gIFRIRSBWQUxVRSAweDAyMDAgTVVTVCBCRSBTRU5ULgogICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQKLWF1ZGlvX3NldHVwKHN0cnVjdCBlYXN5Y2FwICpwZWFzeWNhcCkKLXsKLXN0cnVjdCB1c2JfZGV2aWNlICpwdXNiX2RldmljZTsKLXN0YXRpYyBfX3U4IHJlcXVlc3QgPSAweDAxOwotc3RhdGljIF9fdTggcmVxdWVzdHR5cGUgPSBcCitjb25zdCBfX3U4IHJlcXVlc3QgPSAweDAxOworY29uc3QgX191OCByZXF1ZXN0dHlwZSA9IFwKIAkJKF9fdTgpKFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfQ0xBU1MgfCBVU0JfUkVDSVBfSU5URVJGQUNFKTsKLQotc3RhdGljIF9fdTE2IHZhbHVlX3VubXV0ZSA9IDB4MDIwMDsKLXN0YXRpYyBfX3UxNiBpbmRleCA9IDB4MDMwMTsKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgYnVmZmVyWzFdOwotc3RhdGljIF9fdTE2IGxlbmd0aCA9IDE7Ci1pbnQgcmMsIGlkMSwgaWQyOworY29uc3QgX191MTYgdmFsdWVfdW5tdXRlID0gMHgwMjAwOworY29uc3QgX191MTYgaW5kZXggPSAweDAzMDE7Citjb25zdCBfX3UxNiBsZW5ndGggPSAxOwogCiBpZiAoTlVMTCA9PSBwZWFzeWNhcCkKIAlyZXR1cm4gLUVGQVVMVDsKIAogcHVzYl9kZXZpY2UgPSBwZWFzeWNhcC0+cHVzYl9kZXZpY2U7CiBpZiAoTlVMTCA9PSBwdXNiX2RldmljZSkKLQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gLUVOT0RFVjsKIAotSk9UKDgsICIlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlhcbiIsCVwKK0pPTSg4LCAiJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYXG4iLAlcCiAJCQlyZXF1ZXN0dHlwZSwgcmVxdWVzdCwJCVwKIAkJCSgweDAwRkYgJiB2YWx1ZV91bm11dGUpLAlcCiAJCQkoMHhGRjAwICYgdmFsdWVfdW5tdXRlKSA+PiA4LAlcCkBAIC04NzUsNDEgKzEwNzAsMjUgQEAKICAqICAgICAgICAgICAgICAgICAgICBUSEUgVVBQRVIgQllURSBTRUVNUyBUTyBIQVZFIE5PIEVGRkVDVC4KICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KIFNFVChwdXNiX2RldmljZSwgMHgwNTAwLCAweDAwOTQpOwotCiBTRVQocHVzYl9kZXZpY2UsIDB4MDUwMCwgMHgwMDhDKTsKLQogU0VUKHB1c2JfZGV2aWNlLCAweDA1MDYsIDB4MDAwMSk7CiBTRVQocHVzYl9kZXZpY2UsIDB4MDUwNywgMHgwMDAwKTsKLQogaWQxID0gcmVhZF92dChwdXNiX2RldmljZSwgMHgwMDdDKTsKIGlkMiA9IHJlYWRfdnQocHVzYl9kZXZpY2UsIDB4MDA3RSk7Ci1TQVkoIjB4JTA0WDoweCUwNFggaXMgYXVkaW8gdmVuZG9yIGlkXG4iLCBpZDEsIGlkMik7Ci0KK1NBTSgiMHglMDRYOjB4JTA0WCBpcyBhdWRpbyB2ZW5kb3IgaWRcbiIsIGlkMSwgaWQyKTsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qCi0qICAgU0VMRUNUIEFVRElPIFNPVVJDRSAiTElORSBJTiIgQU5EIFNFVCBERUZBVUxUIEdBSU4gVE8gMCBkQi4KLSoKLSogICBUSEVTRSBDT01NQU5EUyBTRUVNIFRPIEJFIEFDQ0VQVEVEIChUSE9VR0ggUE9TU0lCTFkgSUdOT1JFRCkgRVZFTiBXSEVOCi0qICAgVEhFUkUgSVMgTk8gU0VQQVJBVEUgQVVESU8gQ0hJUCBQUkVTRU5ULgorICogIFNFTEVDVCBBVURJTyBTT1VSQ0UgIkxJTkUgSU4iIEFORCBTRVQgVEhFIEFVRElPIEdBSU4uCiAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi13cml0ZV92dChwdXNiX2RldmljZSwgMHgwMDAyLCAweDgwMDApOwotd3JpdGVfdnQocHVzYl9kZXZpY2UsIDB4MDAxQywgMHg4MDAwKTsKLQotd3JpdGVfdnQocHVzYl9kZXZpY2UsIDB4MDAwRSwgMHgwMDAwKTsKLXdyaXRlX3Z0KHB1c2JfZGV2aWNlLCAweDAwMTAsIDB4MDAwMCk7Ci13cml0ZV92dChwdXNiX2RldmljZSwgMHgwMDEyLCAweDgwMDApOwotd3JpdGVfdnQocHVzYl9kZXZpY2UsIDB4MDAxNiwgMHgwMDAwKTsKLQotd3JpdGVfdnQocHVzYl9kZXZpY2UsIDB4MDAxQSwgMHgwNDA0KTsKLXdyaXRlX3Z0KHB1c2JfZGV2aWNlLCAweDAwMDIsIDB4MDAwMCk7Ci13cml0ZV92dChwdXNiX2RldmljZSwgMHgwMDFDLCAweDAwMDApOwotCitpZiAoMzEgPCBlYXN5Y2FwX2dhaW4pCisJZWFzeWNhcF9nYWluID0gMzE7CitpZiAoMCA+IGVhc3ljYXBfZ2FpbikKKwllYXN5Y2FwX2dhaW4gPSAwOworaWYgKDAgIT0gYXVkaW9fZ2FpbnNldChwdXNiX2RldmljZSwgKF9fczgpZWFzeWNhcF9nYWluKSkKKwlTQVkoIkVSUk9SOiBhdWRpb19nYWluc2V0KCkgZmFpbGVkXG4iKTsKIGNoZWNrX3Z0KHB1c2JfZGV2aWNlKTsKLQogcmV0dXJuIDA7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC05MTgsNiArMTA5Nyw4IEBACiB7CiBpbnQgaWdvdDsKIAoraWYgKCFwdXNiX2RldmljZSkKKwlyZXR1cm4gLUVOT0RFVjsKIGlnb3QgPSByZWFkX3Z0KHB1c2JfZGV2aWNlLCAweDAwMDIpOwogaWYgKDAgPiBpZ290KQogCVNBWSgiRVJST1I6IGZhaWxlZCB0byByZWFkIFZUMTYxMkEgcmVnaXN0ZXIgMHgwMlxuIik7CkBAIC05NDIsMTcgKzExMjMsMjMgQEAKIGlmICgweDgwMDAgJiBpZ290KQogCVNBWSgicmVnaXN0ZXIgMHglMDJYIG11dGVkXG4iLCAweDEyKTsKIAoraWdvdCA9IHJlYWRfdnQocHVzYl9kZXZpY2UsIDB4MDAxNCk7CitpZiAoMCA+IGlnb3QpCisJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHJlYWQgVlQxNjEyQSByZWdpc3RlciAweDE0XG4iKTsKK2lmICgweDgwMDAgJiBpZ290KQorCVNBWSgicmVnaXN0ZXIgMHglMDJYIG11dGVkXG4iLCAweDE0KTsKKwogaWdvdCA9IHJlYWRfdnQocHVzYl9kZXZpY2UsIDB4MDAxNik7CiBpZiAoMCA+IGlnb3QpCiAJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHJlYWQgVlQxNjEyQSByZWdpc3RlciAweDE2XG4iKTsKIGlmICgweDgwMDAgJiBpZ290KQogCVNBWSgicmVnaXN0ZXIgMHglMDJYIG11dGVkXG4iLCAweDE2KTsKIAotaWdvdCA9IHJlYWRfdnQocHVzYl9kZXZpY2UsIDB4MDAxQSk7CitpZ290ID0gcmVhZF92dChwdXNiX2RldmljZSwgMHgwMDE4KTsKIGlmICgwID4gaWdvdCkKLQlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gcmVhZCBWVDE2MTJBIHJlZ2lzdGVyIDB4MUFcbiIpOworCVNBWSgiRVJST1I6IGZhaWxlZCB0byByZWFkIFZUMTYxMkEgcmVnaXN0ZXIgMHgxOFxuIik7CiBpZiAoMHg4MDAwICYgaWdvdCkKLQlTQVkoInJlZ2lzdGVyIDB4JTAyWCBtdXRlZFxuIiwgMHgxQSk7CisJU0FZKCJyZWdpc3RlciAweCUwMlggbXV0ZWRcbiIsIDB4MTgpOwogCiBpZ290ID0gcmVhZF92dChwdXNiX2RldmljZSwgMHgwMDFDKTsKIGlmICgwID4gaWdvdCkKQEAgLTk2NCwxNCArMTE1MSwxOCBAQAogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoKLSAqICBOT1RFOiAgVEhJUyBET0VTIElOQ1JFQVNFIFRIRSBWT0xVTUUgRFJBTUFUSUNBTExZOgotICogICAgICAgICBhdWRpb19nYWluc2V0KHB1c2JfZGV2aWNlLCAweDAwMEYpOworLyogIE5PVEU6ICBUSElTIERPRVMgSU5DUkVBU0UgVEhFIFZPTFVNRSBEUkFNQVRJQ0FMTFk6CisgKiAgICAgICAgICAgICAgICAgICAgICBhdWRpb19nYWluc2V0KHB1c2JfZGV2aWNlLCAweDAwMEYpOwogICoKLSAqICBJRiAxNjxsb3VkPDMxIFZUMTYyMUEgUkVHSVNURVIgMHgxQyBJUyBTRVQgRk9SIFBPU0lUSVZFIEdBSU4uCi0gKiAgSUYgbG91ZDw9MTYgVlQxNjIxQSBSRUdJU1RFUiAweDFDIElTIFNFVCBGT1IgWkVSTyBHQUlOLgotICogIFRIRVJFIElTIE5FVkVSIEFOWSAoQURESVRJT05BTCkgQVRURU5VQVRJT04uCi0gKi8KKyAqICAgICAgIGxvdWQgICAgICAgIGRCICByZWdpc3RlciAweDEwICAgICAgZEIgcmVnaXN0ZXIgMHgxQyAgICBkQiB0b3RhbAorICogICAgICAgICAwICAgICAgICAgICAgICAgLTM0LjUgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAtMzQuNQorICogICAgICAgIC4uICAgICAgICAgICAgICAgIC4uLi4gICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgLi4uLgorICogICAgICAgIDE1ICAgICAgICAgICAgICAgIDEwLjUgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgMTAuNQorICogICAgICAgIDE2ICAgICAgICAgICAgICAgIDEyLjAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgMTIuMAorICogICAgICAgIDE3ICAgICAgICAgICAgICAgIDEyLjAgICAgICAgICAgICAgICAgICAgMS41ICAgICAgICAgICAgMTMuNQorICogICAgICAgIC4uICAgICAgICAgICAgICAgIC4uLi4gICAgICAgICAgICAgICAgICAuLi4uICAgICAgICAgICAgLi4uLgorICogICAgICAgIDMxICAgICAgICAgICAgICAgIDEyLjAgICAgICAgICAgICAgICAgICAyMi41ICAgICAgICAgICAgMzQuNQorKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIGludAogYXVkaW9fZ2FpbnNldChzdHJ1Y3QgdXNiX2RldmljZSAqcHVzYl9kZXZpY2UsIF9fczggbG91ZCkKQEAgLTk4MCwyNSArMTE3MSw2NSBAQAogX191OCB1ODsKIF9fdTE2IG11dGU7CiAKLWlmICgxNiA+IGxvdWQpCi0JbG91ZCA9IDE2OwotdTggPSAweDAwMEYgJiAoX191OCkobG91ZCAtIDE2KTsKK2lmIChOVUxMID09IHB1c2JfZGV2aWNlKQorCXJldHVybiAtRU5PREVWOworaWYgKDAgPiBsb3VkKQorCWxvdWQgPSAwOworaWYgKDMxIDwgbG91ZCkKKwlsb3VkID0gMzE7CiAKIHdyaXRlX3Z0KHB1c2JfZGV2aWNlLCAweDAwMDIsIDB4ODAwMCk7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpZ290ID0gcmVhZF92dChwdXNiX2RldmljZSwgMHgwMDBFKTsKK2lmICgwID4gaWdvdCkgeworCVNBWSgiRVJST1I6IGZhaWxlZCB0byByZWFkIFZUMTYxMkEgcmVnaXN0ZXIgMHgwRVxuIik7CisJbXV0ZSA9IDB4MDAwMDsKK30gZWxzZQorCW11dGUgPSAweDgwMDAgJiAoKHVuc2lnbmVkIGludClpZ290KTsKK211dGUgPSAwOwogCitpZiAoMTYgPiBsb3VkKQorCXU4ID0gMHgwMSB8ICgweDAwMUYgJiAoKChfX3U4KSgxNSAtIGxvdWQpKSA8PCAxKSk7CitlbHNlCisJdTggPSAwOworCitKT1QoOCwgIjB4JTA0WD0obXV0ZXx1OCkgZm9yIFZUMTYxMkEgcmVnaXN0ZXIgMHgwRVxuIiwgbXV0ZSB8IHU4KTsKK3dyaXRlX3Z0KHB1c2JfZGV2aWNlLCAweDAwMEUsIChtdXRlIHwgdTgpKTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2lnb3QgPSByZWFkX3Z0KHB1c2JfZGV2aWNlLCAweDAwMTApOworaWYgKDAgPiBpZ290KSB7CisJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHJlYWQgVlQxNjEyQSByZWdpc3RlciAweDEwXG4iKTsKKwltdXRlID0gMHgwMDAwOworfSBlbHNlCisJbXV0ZSA9IDB4ODAwMCAmICgodW5zaWduZWQgaW50KWlnb3QpOworbXV0ZSA9IDA7CisKK0pPVCg4LCAiMHglMDRYPShtdXRlfHU4fCh1ODw8OCkpIGZvciBWVDE2MTJBIHJlZ2lzdGVyIDB4MTAsLi4uMHgxOFxuIiwgXAorCQkJCQkJCW11dGUgfCB1OCB8ICh1OCA8PCA4KSk7Cit3cml0ZV92dChwdXNiX2RldmljZSwgMHgwMDEwLCAobXV0ZSB8IHU4IHwgKHU4IDw8IDgpKSk7Cit3cml0ZV92dChwdXNiX2RldmljZSwgMHgwMDEyLCAobXV0ZSB8IHU4IHwgKHU4IDw8IDgpKSk7Cit3cml0ZV92dChwdXNiX2RldmljZSwgMHgwMDE0LCAobXV0ZSB8IHU4IHwgKHU4IDw8IDgpKSk7Cit3cml0ZV92dChwdXNiX2RldmljZSwgMHgwMDE2LCAobXV0ZSB8IHU4IHwgKHU4IDw8IDgpKSk7Cit3cml0ZV92dChwdXNiX2RldmljZSwgMHgwMDE4LCAobXV0ZSB8IHU4IHwgKHU4IDw8IDgpKSk7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBpZ290ID0gcmVhZF92dChwdXNiX2RldmljZSwgMHgwMDFDKTsKIGlmICgwID4gaWdvdCkgewogCVNBWSgiRVJST1I6IGZhaWxlZCB0byByZWFkIFZUMTYxMkEgcmVnaXN0ZXIgMHgxQ1xuIik7CiAJbXV0ZSA9IDB4MDAwMDsKIH0gZWxzZQogCW11dGUgPSAweDgwMDAgJiAoKHVuc2lnbmVkIGludClpZ290KTsKK211dGUgPSAwOwogCi1KT1QoOCwgIjB4JTA0WD0obXV0ZXx1OHwodTg8PDgpKVxuIiwgbXV0ZSB8IHU4IHwgKHU4IDw8IDgpKTsKK2lmICgxNiA8PSBsb3VkKQorCXU4ID0gMHgwMDBGICYgKF9fdTgpKGxvdWQgLSAxNik7CitlbHNlCisJdTggPSAwOwogCi13cml0ZV92dChwdXNiX2RldmljZSwgMHgwMDFDLCAweDgwMDApOworSk9UKDgsICIweCUwNFg9KG11dGV8dTh8KHU4PDw4KSkgZm9yIFZUMTYxMkEgcmVnaXN0ZXIgMHgxQ1xuIiwgXAorCQkJCQkJCW11dGUgfCB1OCB8ICh1OCA8PCA4KSk7CiB3cml0ZV92dChwdXNiX2RldmljZSwgMHgwMDFDLCAobXV0ZSB8IHU4IHwgKHU4IDw8IDgpKSk7Cit3cml0ZV92dChwdXNiX2RldmljZSwgMHgwMDFBLCAweDA0MDQpOwogd3JpdGVfdnQocHVzYl9kZXZpY2UsIDB4MDAwMiwgMHgwMDAwKTsKLQogcmV0dXJuIDA7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMDA3LDM1ICsxMjM4LDExIEBACiB7CiBpbnQgaWdvdDsKIAoraWYgKE5VTEwgPT0gcHVzYl9kZXZpY2UpCisJcmV0dXJuIC1FTk9ERVY7CiBpZ290ID0gcmVhZF92dChwdXNiX2RldmljZSwgMHgwMDFDKTsKIGlmICgwID4gaWdvdCkKIAlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gcmVhZCBWVDE2MTJBIHJlZ2lzdGVyIDB4MUNcbiIpOwogcmV0dXJuIGlnb3Q7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQKLXNldDJ0bzc4KHN0cnVjdCB1c2JfZGV2aWNlICpwKQotewotaW50IGlyOwotCi1tc2xlZXAoMjApOwotaXIgPSByZWdzZXQocCwgMHgwMDAyLCAweDAwNzgpOwotaWYgKDAgPiBpcikKLQlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gc2V0IHJlZ2lzdGVyIDB4MDAwMiB0byAweDAwNzhcbiIpOwotbXNsZWVwKDIwKTsKLXJldHVybiBpcjsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludAotc2V0MnRvOTMoc3RydWN0IHVzYl9kZXZpY2UgKnApCi17Ci1pbnQgaXI7Ci0KLW1zbGVlcCgyMCk7Ci1pciA9IHJlZ3NldChwLCAweDAwMDIsIDB4MDA5Myk7Ci1pZiAoMCA+IGlyKQotCVNBWSgiRVJST1I6IGZhaWxlZCB0byBzZXQgcmVnaXN0ZXIgMHgwMDAyIHRvIDB4MDA3OFxuIik7Ci1tc2xlZXAoMjApOwotcmV0dXJuIGlyOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF9tYWluLmMgYi9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX21haW4uYwppbmRleCA1YTRiYmQ5Li5hY2MxZjU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX21haW4uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX21haW4uYwpAQCAtMzAsOSArMzAsMjkgQEAKIAogI2luY2x1ZGUgImVhc3ljYXAuaCIKICNpbmNsdWRlICJlYXN5Y2FwX3N0YW5kYXJkLmgiCisjaW5jbHVkZSAiZWFzeWNhcF9pb2N0bC5oIgogCi1pbnQgZWFzeWNhcF9kZWJ1ZzsKLW1vZHVsZV9wYXJhbShlYXN5Y2FwX2RlYnVnLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK3N0YXRpYyBpbnQgZWFzeWNhcF9kZWJ1ZzsKK3N0YXRpYyBpbnQgZWFzeWNhcF9iYXJzOworaW50IGVhc3ljYXBfZ2FpbiA9IDE2OworbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLCBlYXN5Y2FwX2RlYnVnLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK21vZHVsZV9wYXJhbV9uYW1lZChiYXJzLCBlYXN5Y2FwX2JhcnMsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworbW9kdWxlX3BhcmFtX25hbWVkKGdhaW4sIGVhc3ljYXBfZ2FpbiwgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgZG9uZ2xlX3RoaXMgSVMgSU5ESVNQRU5TSUJMWSBzdGF0aWMgQkVDQVVTRSBGVU5DVElPTiBlYXN5Y2FwX3VzYl9wcm9iZSgpCisgKiAgSVMgQ0FMTEVEIFNVQ0NFU1NJVkVMWSBGT1IgSU5URVJGQUNFUyAwLCAxLCAyIEFORCBUSEUgUE9JTlRFUiBwZWFzeWNhcAorICogIEFMTE9DQVRFRCBEVVJJTkcgVEhFIFBST0JJTkcgT0YgSU5URVJGQUNFIDAgTVVTVCBCRSBSRU1FTUJFUkVEIFdIRU4KKyAqICBQUk9CSU5HIElOVEVSRkFDRVMgMSBBTkQgMi4KKyAqCisgKiAgSU9DVEwgTE9DS0lORyBJUyBET05FIEFUIE1PRFVMRSBMRVZFTCwgTk9UIERFVklDRSBMRVZFTC4KKyovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0cnVjdCBlYXN5Y2FwX2RvbmdsZSBlYXN5Y2FwX2RvbmdsZVtET05HTEVfTUFOWV07CitzdGF0aWMgaW50IGRvbmdsZV90aGlzOworc3RhdGljIGludCBkb25nbGVfZG9uZTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKQEAgLTYzLDIyICs4MywyNSBAQAogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkub3BlbgkJPSBlYXN5Y2FwX29wZW4sCiAJLnJlbGVhc2UJPSBlYXN5Y2FwX3JlbGVhc2UsCi0JLnVubG9ja2VkX2lvY3RsCT0gZWFzeWNhcF9pb2N0bCwKKyNpZiBkZWZpbmVkKEVBU1lDQVBfTkVFRFNfVU5MT0NLRURfSU9DVEwpCisJLnVubG9ja2VkX2lvY3RsCT0gZWFzeWNhcF9pb2N0bF9ub2lub2RlLAorI2Vsc2UKKwkuaW9jdGwJCT0gZWFzeWNhcF9pb2N0bCwKKyNlbmRpZiAvKkVBU1lDQVBfTkVFRFNfVU5MT0NLRURfSU9DVEwqLwogCS5wb2xsCQk9IGVhc3ljYXBfcG9sbCwKIAkubW1hcAkJPSBlYXN5Y2FwX21tYXAsCiAJLmxsc2VlawkJPSBub19sbHNlZWssCiB9Owogc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGVhc3ljYXBfdm1fb3BzID0gewotLm9wZW4gID0gZWFzeWNhcF92bWFfb3BlbiwKLS5jbG9zZSA9IGVhc3ljYXBfdm1hX2Nsb3NlLAotLmZhdWx0ID0gZWFzeWNhcF92bWFfZmF1bHQsCisJLm9wZW4gID0gZWFzeWNhcF92bWFfb3BlbiwKKwkuY2xvc2UgPSBlYXN5Y2FwX3ZtYV9jbG9zZSwKKwkuZmF1bHQgPSBlYXN5Y2FwX3ZtYV9mYXVsdCwKIH07CiBzdHJ1Y3QgdXNiX2NsYXNzX2RyaXZlciBlYXN5Y2FwX2NsYXNzID0gewotLm5hbWUgPSAidXNiL2Vhc3ljYXAlZCIsCi0uZm9wcyA9ICZlYXN5Y2FwX2ZvcHMsCi0ubWlub3JfYmFzZSA9IFVTQl9TS0VMX01JTk9SX0JBU0UsCisJLm5hbWUgPSAidXNiL2Vhc3ljYXAlZCIsCisJLmZvcHMgPSAmZWFzeWNhcF9mb3BzLAorCS5taW5vcl9iYXNlID0gVVNCX1NLRUxfTUlOT1JfQkFTRSwKIH07Ci0KIC8qdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYqLwogI2lmIGRlZmluZWQoRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQpCiAjaWYgZGVmaW5lZChFQVNZQ0FQX05FRURTX1Y0TDJfRk9QUykKQEAgLTg2LDE2ICsxMDksMTcgQEAKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLm9wZW4JCT0gZWFzeWNhcF9vcGVuX25vaW5vZGUsCiAJLnJlbGVhc2UJPSBlYXN5Y2FwX3JlbGVhc2Vfbm9pbm9kZSwKLQkudW5sb2NrZWRfaW9jdGwJPSBlYXN5Y2FwX2lvY3RsLAorI2lmIGRlZmluZWQoRUFTWUNBUF9ORUVEU19VTkxPQ0tFRF9JT0NUTCkKKwkudW5sb2NrZWRfaW9jdGwJPSBlYXN5Y2FwX2lvY3RsX25vaW5vZGUsCisjZWxzZQorCS5pb2N0bAkJPSBlYXN5Y2FwX2lvY3RsLAorI2VuZGlmIC8qRUFTWUNBUF9ORUVEU19VTkxPQ0tFRF9JT0NUTCovCiAJLnBvbGwJCT0gZWFzeWNhcF9wb2xsLAogCS5tbWFwCQk9IGVhc3ljYXBfbW1hcCwKIH07CiAjZW5kaWYgLypFQVNZQ0FQX05FRURTX1Y0TDJfRk9QUyovCi1pbnQgdmlkZW9fZGV2aWNlX21hbnkgLyo9MCovOwotc3RydWN0IHZpZGVvX2RldmljZSAqcHZpZGVvX2FycmF5W1ZJREVPX0RFVklDRV9NQU5ZXSwgKnB2aWRlb19kZXZpY2U7CiAjZW5kaWYgLypFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVCovCiAvKl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eKi8KLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgogICogIFBBUkFNRVRFUlMgVVNFRCBXSEVOIFJFR0lTVEVSSU5HIFRIRSBBVURJTyBJTlRFUkZBQ0UKQEAgLTEwNSw3ICsxMjksMTEgQEAKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLm9wZW4JCT0gZWFzeXNuZF9vcGVuLAogCS5yZWxlYXNlCT0gZWFzeXNuZF9yZWxlYXNlLAotCS51bmxvY2tlZF9pb2N0bAk9IGVhc3lzbmRfaW9jdGwsCisjaWYgZGVmaW5lZChFQVNZQ0FQX05FRURTX1VOTE9DS0VEX0lPQ1RMKQorCS51bmxvY2tlZF9pb2N0bAk9IGVhc3lzbmRfaW9jdGxfbm9pbm9kZSwKKyNlbHNlCisJLmlvY3RsCQk9IGVhc3lzbmRfaW9jdGwsCisjZW5kaWYgLypFQVNZQ0FQX05FRURTX1VOTE9DS0VEX0lPQ1RMKi8KIAkucmVhZAkJPSBlYXN5c25kX3JlYWQsCiAJLmxsc2VlawkJPSBub19sbHNlZWssCiB9OwpAQCAtMTE1LDE3ICsxNDMsMjYgQEAKIC5taW5vcl9iYXNlID0gVVNCX1NLRUxfTUlOT1JfQkFTRSwKIH07CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKLSAqICBJVCBJUyBOT1QgQVBQUk9QUklBVEUgRk9SIGVhc3ljYXBfb3BlbigpIFRPIFNVQk1JVCBUSEUgVklERU8gVVJCUyBIRVJFLAotICogIEJFQ0FVU0UgVEhFUkUgV0lMTCBBTFdBWVMgQkUgU1VCU0VRVUVOVCBORUdPVElBVElPTiBPRiBUViBTVEFOREFSRCBBTkQKLSAqICBGT1JNQVQgQlkgSU9DVEwgQU5EIElUIElTIElOQURWSVNBQkxFIFRPIEhBVkUgVEhFIFVSQlMgUlVOTklORyBXSElMRQotICogIFJFR0lTVEVSUyBPRiBUSEUgU0E3MTEzSCBBUkUgQkVJTkcgTUFOSVBVTEFURUQuCi0gKgotICogIFRIRSBTVUJNSVNTSU9OIE9GIFZJREVPIFVSQlMgSVMgVEhFUkVGT1JFIERFTEFZRUQgVU5USUwgVEhFIElPQ1RMIENPTU1BTkQKLSAqICBTVFJFQU1PTiBJUyBSRUNFSVZFRC4KLSAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgKiAgVEhJUyBST1VUSU5FIERPRVMgTk9UIERFVEVDVCBEVVBMSUNBVEUgT0NDVVJSRU5DRVMgT0YgUE9JTlRFUiBwZWFzeWNhcAorKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludAoraXNkb25nbGUoc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwKQoreworaW50IGs7CitpZiAoTlVMTCA9PSBwZWFzeWNhcCkKKwlyZXR1cm4gLTI7Citmb3IgKGsgPSAwOyBrIDwgRE9OR0xFX01BTlk7IGsrKykgeworCWlmIChlYXN5Y2FwX2RvbmdsZVtrXS5wZWFzeWNhcCA9PSBwZWFzeWNhcCkgeworCQlwZWFzeWNhcC0+aXNkb25nbGUgPSBrOworCQlyZXR1cm4gazsKKwl9Cit9CityZXR1cm4gLTE7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2Ki8KICNpZiBkZWZpbmVkKEVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKQogaW50CkBAIC0xNDAsMTUgKzE3NywxNyBAQAogewogI2lmICghZGVmaW5lZChFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVCkpCiBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqcHVzYl9pbnRlcmZhY2U7CisjZWxzZQorc3RydWN0IHZpZGVvX2RldmljZSAqcHZpZGVvX2RldmljZTsKICNlbmRpZiAvKkVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKi8KLXN0cnVjdCB1c2JfZGV2aWNlICpwOwogc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwOwotaW50IGksIGssIG0sIHJjOworaW50IHJjOwogCiBKT1QoNCwgIlxuIik7CiBTQVkoIj09PT09PT09PT1PUEVOPT09PT09PT09XG4iKTsKIAogcGVhc3ljYXAgPSAoc3RydWN0IGVhc3ljYXAgKilOVUxMOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI2lmICghZGVmaW5lZChFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVCkpCiBpZiAoKHN0cnVjdCBpbm9kZSAqKU5VTEwgPT0gaW5vZGUpIHsKIAlTQVkoIkVSUk9SOiBpbm9kZSBpcyBOVUxMLlxuIik7CkBAIC0xNjIsMTYxICsyMDEsNDI3IEBACiBwZWFzeWNhcCA9IHVzYl9nZXRfaW50ZmRhdGEocHVzYl9pbnRlcmZhY2UpOwogLyp2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2diovCiAjZWxzZQotZm9yIChpID0gMDsgIGkgPCB2aWRlb19kZXZpY2VfbWFueTsgIGkrKykgewotCXB2aWRlb19kZXZpY2UgPSBwdmlkZW9fYXJyYXlbaV07Ci0JaWYgKChzdHJ1Y3QgdmlkZW9fZGV2aWNlICopTlVMTCAhPSBwdmlkZW9fZGV2aWNlKSB7Ci0JCXBlYXN5Y2FwID0gKHN0cnVjdCBlYXN5Y2FwICopdmlkZW9fZ2V0X2RydmRhdGEocHZpZGVvX2RldmljZSk7Ci0JCWJyZWFrOwotCX0KLX0KLS8qXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4qLwotI2VuZGlmIC8qRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQqLwotaWYgKChzdHJ1Y3QgZWFzeWNhcCAqKU5VTEwgPT0gcGVhc3ljYXApIHsKLQlTQVkoIk1JU1RBS0U6IHBlYXN5Y2FwIGlzIE5VTExcbiIpOworcHZpZGVvX2RldmljZSA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CitpZiAoKHN0cnVjdCB2aWRlb19kZXZpY2UgKilOVUxMID09IHB2aWRlb19kZXZpY2UpIHsKKwlTQVkoIkVSUk9SOiBwdmlkZW9fZGV2aWNlIGlzIE5VTEwuXG4iKTsKIAlyZXR1cm4gLUVGQVVMVDsKIH0KLWZpbGUtPnByaXZhdGVfZGF0YSA9IHBlYXN5Y2FwOwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoKLSAqICBJTklUSUFMSVpBVElPTgotICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1KT1QoNCwgInN0YXJ0aW5nIGluaXRpYWxpemF0aW9uXG4iKTsKLQotZm9yIChrID0gMDsgIGsgPCBGUkFNRV9CVUZGRVJfTUFOWTsgIGsrKykgewotCWZvciAobSA9IDA7ICBtIDwgRlJBTUVfQlVGRkVSX1NJWkUvUEFHRV9TSVpFOyAgbSsrKQotCQltZW1zZXQocGVhc3ljYXAtPmZyYW1lX2J1ZmZlcltrXVttXS5wZ28sIDAsIFBBR0VfU0laRSk7CitwZWFzeWNhcCA9IChzdHJ1Y3QgZWFzeWNhcCAqKXZpZGVvX2dldF9kcnZkYXRhKHB2aWRlb19kZXZpY2UpOworI2VuZGlmIC8qRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQqLworLypeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXiovCitpZiAoTlVMTCA9PSBwZWFzeWNhcCkgeworCVNBWSgiRVJST1I6IHBlYXN5Y2FwIGlzIE5VTExcbiIpOworCXJldHVybiAtRUZBVUxUOwogfQotcCA9IHBlYXN5Y2FwLT5wdXNiX2RldmljZTsKLWlmICgoc3RydWN0IHVzYl9kZXZpY2UgKilOVUxMID09IHApIHsKLQlTQVkoIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CitpZiAobWVtY21wKCZwZWFzeWNhcC0+dGVsbHRhbGVbMF0sIFRFTExUQUxFLCBzdHJsZW4oVEVMTFRBTEUpKSkgeworCVNBWSgiRVJST1I6IGJhZCBwZWFzeWNhcDogMHglMDhsWFxuIiwgKHVuc2lnbmVkIGxvbmcgaW50KSBwZWFzeWNhcCk7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CitpZiAoTlVMTCA9PSBwZWFzeWNhcC0+cHVzYl9kZXZpY2UpIHsKKwlTQU0oIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CiAJcmV0dXJuIC1FRkFVTFQ7CiB9IGVsc2UgewotCUpPVCgxNiwgIjB4JTA4bFg9cGVhc3ljYXAtPnB1c2JfZGV2aWNlXG4iLCBcCisJSk9NKDE2LCAiMHglMDhsWD1wZWFzeWNhcC0+cHVzYl9kZXZpY2VcbiIsIFwKIAkJCQkJKGxvbmcgaW50KXBlYXN5Y2FwLT5wdXNiX2RldmljZSk7CiB9CitmaWxlLT5wcml2YXRlX2RhdGEgPSBwZWFzeWNhcDsKIHJjID0gd2FrZXVwX2RldmljZShwZWFzeWNhcC0+cHVzYl9kZXZpY2UpOwogaWYgKDAgPT0gcmMpCi0JSk9UKDgsICJ3YWtldXBfZGV2aWNlKCkgT0tcbiIpOworCUpPTSg4LCAid2FrZXVwX2RldmljZSgpIE9LXG4iKTsKIGVsc2UgewotCVNBWSgiRVJST1I6IHdha2V1cF9kZXZpY2UoKSByZXR1cm5lZCAlaVxuIiwgcmMpOworCVNBTSgiRVJST1I6IHdha2V1cF9kZXZpY2UoKSByZXR1cm5lZCAlaVxuIiwgcmMpOworCWlmICgtRU5PREVWID09IHJjKQorCQlTQU0oIkVSUk9SOiB3YWtldXBfZGV2aWNlKCkgcmV0dXJuZWQgLUVOT0RFVlxuIik7CisJZWxzZQorCQlTQU0oIkVSUk9SOiB3YWtldXBfZGV2aWNlKCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CitwZWFzeWNhcC0+aW5wdXQgPSAwOworcmMgPSByZXNldChwZWFzeWNhcCk7CitpZiAoMCAhPSByYykgeworCVNBTSgiRVJST1I6IHJlc2V0KCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKIAlyZXR1cm4gLUVGQVVMVDsKIH0KLXJjID0gc2V0dXBfc3RrKHApOyAgcGVhc3ljYXAtPmlucHV0ID0gMDsKLWlmICgwID09IHJjKQotCUpPVCg4LCAic2V0dXBfc3RrKCkgT0tcbiIpOwotZWxzZSB7Ci0JU0FZKCJFUlJPUjogc2V0dXBfc3RrKCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKLQlyZXR1cm4gLUVGQVVMVDsKK3JldHVybiAwOwogfQotcmMgPSBzZXR1cF9zYWEocCk7Ci1pZiAoMCA9PSByYykKLQlKT1QoOCwgInNldHVwX3NhYSgpIE9LXG4iKTsKLWVsc2UgewotCVNBWSgiRVJST1I6IHNldHVwX3NhYSgpIHJldHVybmVkICVpXG4iLCByYyk7Ci0JcmV0dXJuIC1FRkFVTFQ7Ci19Ci1yYyA9IGNoZWNrX3NhYShwKTsKLWlmICgwID09IHJjKQotCUpPVCg4LCAiY2hlY2tfc2FhKCkgT0tcbiIpOwotZWxzZSBpZiAoLTggPCByYykKLQlTQVkoImNoZWNrX3NhYSgpIHJldHVybmVkICVpXG4iLCByYyk7Ci1lbHNlIHsKLQlTQVkoIkVSUk9SOiBjaGVja19zYWEoKSByZXR1cm5lZCAlaVxuIiwgcmMpOwotCXJldHVybiAtRUZBVUxUOwotfQotcGVhc3ljYXAtPnN0YW5kYXJkX29mZnNldCA9IC0xOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmIGRlZmluZWQoUFJFRkVSX05UU0MpCi0KLXJjID0gYWRqdXN0X3N0YW5kYXJkKHBlYXN5Y2FwLCBWNEwyX1NURF9OVFNDX00pOwotaWYgKDAgPT0gcmMpCi0JSk9UKDgsICJhZGp1c3Rfc3RhbmRhcmQoLixOVFNDX00pIE9LXG4iKTsKLWVsc2UgewotCVNBWSgiRVJST1I6IGFkanVzdF9zdGFuZGFyZCguLE5UU0NfTSkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKLQlyZXR1cm4gLUVGQVVMVDsKLX0KLXJjID0gYWRqdXN0X2Zvcm1hdChwZWFzeWNhcCwgNjQwLCA0ODAsIFY0TDJfUElYX0ZNVF9VWVZZLCBWNEwyX0ZJRUxEX05PTkUsIFwKLQkJCQkJCQkJCWZhbHNlKTsKLWlmICgwIDw9IHJjKQotCUpPVCg4LCAiYWRqdXN0X2Zvcm1hdCguLDY0MCw0ODAsVVlWWSkgT0tcbiIpOwotZWxzZSB7Ci0JU0FZKCJFUlJPUjogYWRqdXN0X2Zvcm1hdCguLDY0MCw0ODAsVVlWWSkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKLQlyZXR1cm4gLUVGQVVMVDsKLX0KLQotI2Vsc2UKLQotcmMgPSBhZGp1c3Rfc3RhbmRhcmQocGVhc3ljYXAsIFwKLQkJKFY0TDJfU1REX1BBTF9CIHwgVjRMMl9TVERfUEFMX0cgfCBWNEwyX1NURF9QQUxfSCB8IFwKLQkJVjRMMl9TVERfUEFMX0kgfCBWNEwyX1NURF9QQUxfTikpOwotaWYgKDAgPT0gcmMpCi0JSk9UKDgsICJhZGp1c3Rfc3RhbmRhcmQoLixQQUxfQkdISU4pIE9LXG4iKTsKLWVsc2UgewotCVNBWSgiRVJST1I6IGFkanVzdF9zdGFuZGFyZCguLFBBTF9CR0hJTikgcmV0dXJuZWQgJWlcbiIsIHJjKTsKLQlyZXR1cm4gLUVGQVVMVDsKLX0KLXJjID0gYWRqdXN0X2Zvcm1hdChwZWFzeWNhcCwgNjQwLCA0ODAsIFY0TDJfUElYX0ZNVF9VWVZZLCBWNEwyX0ZJRUxEX05PTkUsIFwKLQkJCQkJCQkJCWZhbHNlKTsKLWlmICgwIDw9IHJjKQotCUpPVCg4LCAiYWRqdXN0X2Zvcm1hdCguLDY0MCw0ODAsdXl2eSxmYWxzZSkgT0tcbiIpOwotZWxzZSB7Ci0JU0FZKCJFUlJPUjogYWRqdXN0X2Zvcm1hdCguLDY0MCw0ODAsdXl2eSxmYWxzZSkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKLQlyZXR1cm4gLUVGQVVMVDsKLX0KLQotI2VuZGlmIC8qICFQUkVGRVJfTlRTQyovCisvKgorICogIFJFU0VUIFRIRSBIQVJEV0FSRSBUTyBJVFMgUkVGRVJFTkNFIFNUQVRFLgorICoKKyAqICBUSElTIFJPVVRJTkUgTUFZIEJFIENBTExFRCBSRVBFQVRFRExZIElGIGVhc3ljYXBfY29tcGxldGUoKSBERVRFQ1RTCisgKiAgQSBCQUQgVklERU8gRlJBTUUgU0laRS4KKyovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1yYyA9IGFkanVzdF9icmlnaHRuZXNzKHBlYXN5Y2FwLCAtODE5Mik7Ci1pZiAoMCAhPSByYykgewotCVNBWSgiRVJST1I6IGFkanVzdF9icmlnaHRuZXNzKGRlZmF1bHQpIHJldHVybmVkICVpXG4iLCByYyk7CitpbnQKK3Jlc2V0KHN0cnVjdCBlYXN5Y2FwICpwZWFzeWNhcCkKK3sKK3N0cnVjdCBlYXN5Y2FwX3N0YW5kYXJkIGNvbnN0ICpwZWFzeWNhcF9zdGFuZGFyZDsKK2ludCBpLCByYywgaW5wdXQsIHJhdGU7Citib29sIG50c2MsIG90aGVyOworCitpZiAoTlVMTCA9PSBwZWFzeWNhcCkgeworCVNBWSgiRVJST1I6IHBlYXN5Y2FwIGlzIE5VTExcbiIpOwogCXJldHVybiAtRUZBVUxUOwogfQotcmMgPSBhZGp1c3RfY29udHJhc3QocGVhc3ljYXAsIC04MTkyKTsKLWlmICgwICE9IHJjKSB7Ci0JU0FZKCJFUlJPUjogYWRqdXN0X2NvbnRyYXN0KGRlZmF1bHQpIHJldHVybmVkICVpXG4iLCByYyk7Ci0JcmV0dXJuIC1FRkFVTFQ7Ci19Ci1yYyA9IGFkanVzdF9zYXR1cmF0aW9uKHBlYXN5Y2FwLCAtODE5Mik7Ci1pZiAoMCAhPSByYykgewotCVNBWSgiRVJST1I6IGFkanVzdF9zYXR1cmF0aW9uKGRlZmF1bHQpIHJldHVybmVkICVpXG4iLCByYyk7Ci0JcmV0dXJuIC1FRkFVTFQ7Ci19Ci1yYyA9IGFkanVzdF9odWUocGVhc3ljYXAsIC04MTkyKTsKLWlmICgwICE9IHJjKSB7Ci0JU0FZKCJFUlJPUjogYWRqdXN0X2h1ZShkZWZhdWx0KSByZXR1cm5lZCAlaVxuIiwgcmMpOwotCXJldHVybiAtRUZBVUxUOwotfQoraW5wdXQgPSBwZWFzeWNhcC0+aW5wdXQ7CisKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXJjID0gdXNiX3NldF9pbnRlcmZhY2UocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCBwZWFzeWNhcC0+dmlkZW9faW50ZXJmYWNlLCBcCi0JCQkJCQlwZWFzeWNhcC0+dmlkZW9fYWx0c2V0dGluZ19vbik7CisvKgorICogIElGIFRIRSBTQUE3MTEzSCBIQVMgQUxSRUFEWSBBQ1FVSVJFRCBTWU5DLCBVU0UgSVRTIEhBUkRXQVJFLURFVEVDVEVECisgKiAgRklFTEQgRlJFUVVFTkNZIFRPIERJU1RJTkdVSVNIIE5UU0MgRlJPTSBQQUwuICBUSElTIElTIEVTU0VOVElBTCBGT1IKKyAqICBnc3RyZWFtZXIgQU5EIE9USEVSIFVTRVJTUEFDRSBQUk9HUkFNUyBXSElDSCBNQVkgTk9UIEFUVEVNUFQgVE8gSU5JVElBVEUKKyAqICBBIFNXSVRDSCBCRVRXRUVOIFBBTCBBTkQgTlRTQy4KKyAqCisgKiAgRlVOQ1RJT04gcmVhZHlfc2FhKCkgTUFZIFJFUVVJUkUgQSBTVUJTVEFOVElBTCBGUkFDVElPTiBPRiBBIFNFQ09ORCBUTworICogIENPTVBMRVRFLCBTTyBTSE9VTEQgTk9UIEJFIElOVk9LRUQgV0lUSE9VVCBHT09EIFJFQVNPTi4KKyovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitvdGhlciA9IGZhbHNlOworaWYgKHRydWUgPT0gcGVhc3ljYXAtPm50c2MpCisJSk9NKDgsICJ0cnVlPXBlYXN5Y2FwLT5udHNjXG4iKTsKK2Vsc2UKKwlKT00oOCwgImZhbHNlPXBlYXN5Y2FwLT5udHNjXG4iKTsKK3JhdGUgPSByZWFkeV9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKK2lmICgwID4gcmF0ZSkgeworCUpPTSg4LCAibm90IHJlYWR5IHRvIGNhcHR1cmUgYWZ0ZXIgJWkgbXMgLi4uXG4iLCBQQVRJRU5DRSk7CisJaWYgKHRydWUgPT0gcGVhc3ljYXAtPm50c2MpIHsKKwkJSk9NKDgsICIuLi4gdHJ5aW5nIFBBTCAuLi5cbiIpOyAgbnRzYyA9IGZhbHNlOworCX0gZWxzZSB7CisJCUpPTSg4LCAiLi4uIHRyeWluZyBOVFNDIC4uLlxuIik7IG50c2MgPSB0cnVlOworfQorcmMgPSBzZXR1cF9zdGsocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCBudHNjKTsKIGlmICgwID09IHJjKQotCUpPVCg4LCAidXNiX3NldF9pbnRlcmZhY2UoLiwlaSwlaSkgT0tcbiIsIHBlYXN5Y2FwLT52aWRlb19pbnRlcmZhY2UsIFwKLQkJCQkJCXBlYXN5Y2FwLT52aWRlb19hbHRzZXR0aW5nX29uKTsKKwlKT00oNCwgInNldHVwX3N0aygpIE9LXG4iKTsKIGVsc2UgewotCVNBWSgiRVJST1I6IHVzYl9zZXRfaW50ZXJmYWNlKCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKKwlTQU0oIkVSUk9SOiBzZXR1cF9zdGsoKSByZXR1cm5lZCAlaVxuIiwgcmMpOwogCXJldHVybiAtRUZBVUxUOwogfQotcmMgPSBzdGFydF8xMDAocCk7CityYyA9IHNldHVwX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIG50c2MpOwogaWYgKDAgPT0gcmMpCi0JSk9UKDgsICJzdGFydF8xMDAoKSBPS1xuIik7CisJSk9NKDQsICJzZXR1cF9zYWEoKSBPS1xuIik7CiBlbHNlIHsKLQlTQVkoIkVSUk9SOiBzdGFydF8xMDAoKSByZXR1cm5lZCAlaVxuIiwgcmMpOworCVNBTSgiRVJST1I6IHNldHVwX3NhYSgpIHJldHVybmVkICVpXG4iLCByYyk7CiAJcmV0dXJuIC1FRkFVTFQ7CiB9Ci1wZWFzeWNhcC0+dmlkZW9faXNvY19zZXF1ZW5jZSA9IFZJREVPX0lTT0NfQlVGRkVSX01BTlkgLSAxOwotcGVhc3ljYXAtPnZpZGVvX2lkbGUgPSAwOwotcGVhc3ljYXAtPnZpZGVvX2p1bmsgPSAwOworcmF0ZSA9IHJlYWR5X3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UpOworaWYgKDAgPiByYXRlKSB7CisJSk9NKDgsICJub3QgcmVhZHkgdG8gY2FwdHVyZSBhZnRlciAlaSBtcyAuLi5cbiIsIFBBVElFTkNFKTsKKwlKT00oOCwgIi4uLiBzYWEgcmVnaXN0ZXIgMHgxRiBoYXMgMHglMDJYXG4iLCBcCisJCQkJcmVhZF9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCAweDFGKSk7CisJbnRzYyA9IHBlYXN5Y2FwLT5udHNjOworCX0gZWxzZSB7CisJCUpPTSg4LCAiLi4uIHN1Y2Nlc3MgYXQgc2Vjb25kIHRyeTogICVpPXJhdGVcbiIsIHJhdGUpOworCQludHNjID0gKDAgPCAocmF0ZS8yKSkgPyB0cnVlIDogZmFsc2UgOworCQlvdGhlciA9IHRydWU7CisJfQorfSBlbHNlIHsKKwlKT00oOCwgIi4uLiBzdWNjZXNzIGF0IGZpcnN0IHRyeTogICVpPXJhdGVcbiIsIHJhdGUpOworCW50c2MgPSAoMCA8IHJhdGUvMikgPyB0cnVlIDogZmFsc2UgOworfQoraWYgKHRydWUgPT0gbnRzYykKKwlKT00oOCwgInRydWU9bnRzY1xuIik7CitlbHNlCisJSk9NKDgsICJmYWxzZT1udHNjXG4iKTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworcmMgPSBzZXR1cF9zdGsocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCBudHNjKTsKK2lmICgwID09IHJjKQorCUpPTSg0LCAic2V0dXBfc3RrKCkgT0tcbiIpOworZWxzZSB7CisJU0FNKCJFUlJPUjogc2V0dXBfc3RrKCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK3JjID0gc2V0dXBfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgbnRzYyk7CitpZiAoMCA9PSByYykKKwlKT00oNCwgInNldHVwX3NhYSgpIE9LXG4iKTsKK2Vsc2UgeworCVNBTSgiRVJST1I6IHNldHVwX3NhYSgpIHJldHVybmVkICVpXG4iLCByYyk7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CisKIGZvciAoaSA9IDA7IGkgPCAxODA7IGkrKykKIAlwZWFzeWNhcC0+bWVyaXRbaV0gPSAwOwogcGVhc3ljYXAtPnZpZGVvX2VvZiA9IDA7CiBwZWFzeWNhcC0+YXVkaW9fZW9mID0gMDsKLQogZG9fZ2V0dGltZW9mZGF5KCZwZWFzeWNhcC0+dGltZXZhbDcpOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFJFU1RPUkUgSU5QVVQgQU5EIEZPUkNFIFJFRlJFU0ggT0YgU1RBTkRBUkQsIEZPUk1BVCwgRVRDLgorICoKKyAqIFdISUxFIFRISVMgUFJPQ0VEVVJFIElTIElOIFBST0dSRVNTLCBTT01FIElPQ1RMIENPTU1BTkRTIFdJTEwgUkVUVVJOIC1FQlVTWS4KKyovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitwZWFzeWNhcC0+aW5wdXQgPSAtODE5MjsKK3BlYXN5Y2FwLT5zdGFuZGFyZF9vZmZzZXQgPSAtODE5MjsKK2lmICh0cnVlID09IG90aGVyKSB7CisJcGVhc3ljYXBfc3RhbmRhcmQgPSAmZWFzeWNhcF9zdGFuZGFyZFswXTsKKwl3aGlsZSAoMHhGRkZGICE9IHBlYXN5Y2FwX3N0YW5kYXJkLT5tYXNrKSB7CisJCWlmICh0cnVlID09IG50c2MpIHsKKwkJCWlmIChOVFNDX00gPT0gXAorCQkJCXBlYXN5Y2FwX3N0YW5kYXJkLT52NGwyX3N0YW5kYXJkLmluZGV4KSB7CisJCQkJcGVhc3ljYXAtPmlucHV0c2V0W2lucHV0XS5zdGFuZGFyZF9vZmZzZXQgPSBcCisJCQkJCQlwZWFzeWNhcF9zdGFuZGFyZCAtIFwKKwkJCQkJCQkmZWFzeWNhcF9zdGFuZGFyZFswXTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChQQUxfQkdISU4gPT0gXAorCQkJCXBlYXN5Y2FwX3N0YW5kYXJkLT52NGwyX3N0YW5kYXJkLmluZGV4KSB7CisJCQkJcGVhc3ljYXAtPmlucHV0c2V0W2lucHV0XS5zdGFuZGFyZF9vZmZzZXQgPSBcCisJCQkJCQlwZWFzeWNhcF9zdGFuZGFyZCAtCisJCQkJCQkJJmVhc3ljYXBfc3RhbmRhcmRbMF07CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcGVhc3ljYXBfc3RhbmRhcmQrKzsKKwl9CisJaWYgKDB4RkZGRiA9PSBwZWFzeWNhcF9zdGFuZGFyZC0+bWFzaykgeworCQlTQU0oIkVSUk9SOiBzdGFuZGFyZCBub3QgZm91bmRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CitKT00oOCwgIiVpPXBlYXN5Y2FwLT5pbnB1dHNldFslaV0uc3RhbmRhcmRfb2Zmc2V0XG4iLCBcCisJCXBlYXN5Y2FwLT5pbnB1dHNldFtpbnB1dF0uc3RhbmRhcmRfb2Zmc2V0LCBpbnB1dCk7Cit9CitwZWFzeWNhcC0+Zm9ybWF0X29mZnNldCA9IC04MTkyOworcGVhc3ljYXAtPmJyaWdodG5lc3MgPSAtODE5MjsKK3BlYXN5Y2FwLT5jb250cmFzdCA9IC04MTkyOworcGVhc3ljYXAtPnNhdHVyYXRpb24gPSAtODE5MjsKK3BlYXN5Y2FwLT5odWUgPSAtODE5MjsKIAotcGVhc3ljYXAtPmZ1ZGdlID0gMDsKK3JjID0gbmV3aW5wdXQocGVhc3ljYXAsIGlucHV0KTsKIAotSk9UKDQsICJmaW5pc2hlZCBpbml0aWFsaXphdGlvblxuIik7CitpZiAoMCA9PSByYykKKwlKT00oNCwgInJlc3RvcmVkIGlucHV0LCBzdGFuZGFyZCBhbmQgZm9ybWF0XG4iKTsKK2Vsc2UgeworCVNBTSgiRVJST1I6IG5ld2lucHV0KC4sJWkpIHJldHVybmVkICVpXG4iLCByYywgaW5wdXQpOworCXJldHVybiAtRUZBVUxUOworfQoraWYgKHRydWUgPT0gcGVhc3ljYXAtPm50c2MpCisJSk9NKDgsICJ0cnVlPXBlYXN5Y2FwLT5udHNjXG4iKTsKK2Vsc2UKKwlKT00oOCwgImZhbHNlPXBlYXN5Y2FwLT5udHNjXG4iKTsKKworaWYgKDAgPiBwZWFzeWNhcC0+aW5wdXQpIHsKKwlTQU0oIk1JU1RBS0U6ICAlaT1wZWFzeWNhcC0+aW5wdXRcbiIsIHBlYXN5Y2FwLT5pbnB1dCk7CisJcmV0dXJuIC1FTk9FTlQ7Cit9CitpZiAoMCA+IHBlYXN5Y2FwLT5zdGFuZGFyZF9vZmZzZXQpIHsKKwlTQU0oIk1JU1RBS0U6ICAlaT1wZWFzeWNhcC0+c3RhbmRhcmRfb2Zmc2V0XG4iLCBcCisJCQkJCQlwZWFzeWNhcC0+c3RhbmRhcmRfb2Zmc2V0KTsKKwlyZXR1cm4gLUVOT0VOVDsKK30KK2lmICgwID4gcGVhc3ljYXAtPmZvcm1hdF9vZmZzZXQpIHsKKwlTQU0oIk1JU1RBS0U6ICAlaT1wZWFzeWNhcC0+Zm9ybWF0X29mZnNldFxuIiwgXAorCQkJCQkJcGVhc3ljYXAtPmZvcm1hdF9vZmZzZXQpOworCXJldHVybiAtRU5PRU5UOworfQoraWYgKDAgPiBwZWFzeWNhcC0+YnJpZ2h0bmVzcykgeworCVNBTSgiTUlTVEFLRTogICVpPXBlYXN5Y2FwLT5icmlnaHRuZXNzXG4iLCBwZWFzeWNhcC0+YnJpZ2h0bmVzcyk7CisJcmV0dXJuIC1FTk9FTlQ7Cit9CitpZiAoMCA+IHBlYXN5Y2FwLT5jb250cmFzdCkgeworCVNBTSgiTUlTVEFLRTogICVpPXBlYXN5Y2FwLT5jb250cmFzdFxuIiwgcGVhc3ljYXAtPmNvbnRyYXN0KTsKKwlyZXR1cm4gLUVOT0VOVDsKK30KK2lmICgwID4gcGVhc3ljYXAtPnNhdHVyYXRpb24pIHsKKwlTQU0oIk1JU1RBS0U6ICAlaT1wZWFzeWNhcC0+c2F0dXJhdGlvblxuIiwgcGVhc3ljYXAtPnNhdHVyYXRpb24pOworCXJldHVybiAtRU5PRU5UOworfQoraWYgKDAgPiBwZWFzeWNhcC0+aHVlKSB7CisJU0FNKCJNSVNUQUtFOiAgJWk9cGVhc3ljYXAtPmh1ZVxuIiwgcGVhc3ljYXAtPmh1ZSk7CisJcmV0dXJuIC1FTk9FTlQ7Cit9CityZXR1cm4gMDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgSUYgVEhFIFJFUVVFU1RFRCBJTlBVVCBJUyBUSEUgU0FNRSBBUyBUSEUgRVhJU1RJTkcgSU5QVVQsIERPIE5PVEhJTkcuCisgKiAgT1RIRVJXSVNFOgorICogICAgICBLSUxMIFVSQlMsIENMRUFSIEZJRUxEIEFORCBGUkFNRSBCVUZGRVJTIEFORCBSRVNFVCBUSEVJUgorICogICAgICAgICAgIF9yZWFkIEFORCBfZmlsbCBQT0lOVEVSUy4KKyAqICAgICAgU0VMRUNUIFRIRSBORVcgSU5QVVQuCisgKiAgICAgIEFESlVTVCBUSEUgU1RBTkRBUkQsIEZPUk1BVCwgQlJJR0hUTkVTUywgQ09OVFJBU1QsIFNBVFVSQVRJT04gQU5EIEhVRQorICogICAgICAgICAgT04gVEhFIEJBU0lTIE9GIElORk9STUFUSU9OIElOIFNUUlVDVFVSRSBlYXN5Y2FwLmlucHV0c2V0W2lucHV0XS4KKyAqICAgICAgUkVTVUJNSVQgVEhFIFVSQlMgSUYgU1RSRUFNSU5HIFdBUyBBTFJFQURZIElOIFBST0dSRVNTLgorICoKKyAqICBOT1RFOgorICogICAgICBUSElTIFJPVVRJTkUgTUFZIEJFIENBTExFRCBGUkVRVUVOVExZIEJZIFpPTkVNSU5ERVIgVklBIElPQ1RMLAorICogICAgICBTTyBJVCBTSE9VTEQgV1JJVEUgT05MWSBTUEFSSU5HTFkgVE8gVEhFIExPR0ZJTEUuCisqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50CituZXdpbnB1dChzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXAsIGludCBpbnB1dCkKK3sKK2ludCByYywgaywgbSwgbW9vZCwgb2ZmOworaW50IGlucHV0bm93LCB2aWRlb19pZGxlbm93LCBhdWRpb19pZGxlbm93OworYm9vbCByZXN1Ym1pdDsKKworaWYgKE5VTEwgPT0gcGVhc3ljYXApIHsKKwlTQVkoIkVSUk9SOiBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK0pPTSg4LCAiJWk9aW5wdXQgc291Z2h0XG4iLCBpbnB1dCk7CisKK2lmICgwID4gaW5wdXQgJiYgSU5QVVRfTUFOWSA8PSBpbnB1dCkKKwlyZXR1cm4gLUVOT0VOVDsKK2lucHV0bm93ID0gcGVhc3ljYXAtPmlucHV0OworaWYgKGlucHV0ID09IGlucHV0bm93KQorCXJldHVybiAwOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBJRiBTVFJFQU1JTkcgSVMgSU4gUFJPR1JFU1MgVEhFIFVSQlMgQVJFIEtJTExFRCBBVCBUSElTCisgKiAgU1RBR0UgQU5EIFdJTEwgQkUgUkVTVUJNSVRURUQgUFJJT1IgVE8gRVhJVCBGUk9NIFRIRSBST1VUSU5FLgorICogIElGIE5PIFNUUkVBTUlORyBJUyBJTiBQUk9HUkVTUyBOTyBVUkJTIFdJTEwgQkUgU1VCTUlUVEVEIEJZIFRIRQorICogIFJPVVRJTkUuCisqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordmlkZW9faWRsZW5vdyA9IHBlYXN5Y2FwLT52aWRlb19pZGxlOworYXVkaW9faWRsZW5vdyA9IHBlYXN5Y2FwLT5hdWRpb19pZGxlOworCitwZWFzeWNhcC0+dmlkZW9faWRsZSA9IDE7CitwZWFzeWNhcC0+YXVkaW9faWRsZSA9IDE7CitpZiAocGVhc3ljYXAtPnZpZGVvX2lzb2Nfc3RyZWFtaW5nKSB7CisJcmVzdWJtaXQgPSB0cnVlOworCWtpbGxfdmlkZW9fdXJicyhwZWFzeWNhcCk7Cit9IGVsc2UKKwlyZXN1Ym1pdCA9IGZhbHNlOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaWYgKE5VTEwgPT0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlKSB7CisJU0FNKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGlzIE5VTExcbiIpOworCXJldHVybiAtRU5PREVWOworfQorcmMgPSB1c2Jfc2V0X2ludGVyZmFjZShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsCisJCQlwZWFzeWNhcC0+dmlkZW9faW50ZXJmYWNlLCBcCisJCQlwZWFzeWNhcC0+dmlkZW9fYWx0c2V0dGluZ19vZmYpOworaWYgKDAgIT0gcmMpIHsKKwlTQU0oIkVSUk9SOiB1c2Jfc2V0X2ludGVyZmFjZSgpIHJldHVybmVkICVpXG4iLCByYyk7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CityYyA9IHN0b3BfMTAwKHBlYXN5Y2FwLT5wdXNiX2RldmljZSk7CitpZiAoMCAhPSByYykgeworCVNBTSgiRVJST1I6IHN0b3BfMTAwKCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK2ZvciAoayA9IDA7IGsgPCBGSUVMRF9CVUZGRVJfTUFOWTsgaysrKSB7CisJZm9yIChtID0gMDsgbSA8IEZJRUxEX0JVRkZFUl9TSVpFL1BBR0VfU0laRTsgbSsrKQorCQltZW1zZXQocGVhc3ljYXAtPmZpZWxkX2J1ZmZlcltrXVttXS5wZ28sIDAsIFBBR0VfU0laRSk7Cit9Citmb3IgKGsgPSAwOyBrIDwgRlJBTUVfQlVGRkVSX01BTlk7IGsrKykgeworCWZvciAobSA9IDA7IG0gPCBGUkFNRV9CVUZGRVJfU0laRS9QQUdFX1NJWkU7IG0rKykKKwkJbWVtc2V0KHBlYXN5Y2FwLT5mcmFtZV9idWZmZXJba11bbV0ucGdvLCAwLCBQQUdFX1NJWkUpOworfQorcGVhc3ljYXAtPmZpZWxkX3BhZ2UgPSAwOworcGVhc3ljYXAtPmZpZWxkX3JlYWQgPSAwOworcGVhc3ljYXAtPmZpZWxkX2ZpbGwgPSAwOworCitwZWFzeWNhcC0+ZnJhbWVfcmVhZCA9IDA7CitwZWFzeWNhcC0+ZnJhbWVfZmlsbCA9IDA7Citmb3IgKGsgPSAwOyBrIDwgcGVhc3ljYXAtPmlucHV0OyBrKyspIHsKKwkocGVhc3ljYXAtPmZyYW1lX2ZpbGwpKys7CisJaWYgKHBlYXN5Y2FwLT5mcmFtZV9idWZmZXJfbWFueSA8PSBwZWFzeWNhcC0+ZnJhbWVfZmlsbCkKKwkJcGVhc3ljYXAtPmZyYW1lX2ZpbGwgPSAwOworfQorcGVhc3ljYXAtPmlucHV0ID0gaW5wdXQ7CitzZWxlY3RfaW5wdXQocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCBwZWFzeWNhcC0+aW5wdXQsIDkpOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaWYgKGlucHV0ID09IHBlYXN5Y2FwLT5pbnB1dHNldFtpbnB1dF0uaW5wdXQpIHsKKwlvZmYgPSBwZWFzeWNhcC0+aW5wdXRzZXRbaW5wdXRdLnN0YW5kYXJkX29mZnNldDsKKwlpZiAob2ZmICE9IHBlYXN5Y2FwLT5zdGFuZGFyZF9vZmZzZXQpIHsKKwkJcmMgPSBhZGp1c3Rfc3RhbmRhcmQocGVhc3ljYXAsIFwKKwkJCQllYXN5Y2FwX3N0YW5kYXJkW29mZl0udjRsMl9zdGFuZGFyZC5pZCk7CisJCWlmICgwICE9IHJjKSB7CisJCQlTQU0oIkVSUk9SOiBhZGp1c3Rfc3RhbmRhcmQoKSByZXR1cm5lZCAlaVxuIiwgcmMpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJSk9NKDgsICIlaT1wZWFzeWNhcC0+c3RhbmRhcmRfb2Zmc2V0XG4iLCBcCisJCQkJCQlwZWFzeWNhcC0+c3RhbmRhcmRfb2Zmc2V0KTsKKwl9IGVsc2UgeworCQlKT00oOCwgIiVpPXBlYXN5Y2FwLT5zdGFuZGFyZF9vZmZzZXQgdW5jaGFuZ2VkXG4iLCBcCisJCQkJCQlwZWFzeWNhcC0+c3RhbmRhcmRfb2Zmc2V0KTsKKwl9CisJb2ZmID0gcGVhc3ljYXAtPmlucHV0c2V0W2lucHV0XS5mb3JtYXRfb2Zmc2V0OworCWlmIChvZmYgIT0gcGVhc3ljYXAtPmZvcm1hdF9vZmZzZXQpIHsKKwkJcmMgPSBhZGp1c3RfZm9ybWF0KHBlYXN5Y2FwLCBcCisJCQllYXN5Y2FwX2Zvcm1hdFtvZmZdLnY0bDJfZm9ybWF0LmZtdC5waXgud2lkdGgsIFwKKwkJCWVhc3ljYXBfZm9ybWF0W29mZl0udjRsMl9mb3JtYXQuZm10LnBpeC5oZWlnaHQsIFwKKwkJCWVhc3ljYXBfZm9ybWF0W29mZl0udjRsMl9mb3JtYXQuZm10LnBpeC5waXhlbGZvcm1hdCwgXAorCQkJZWFzeWNhcF9mb3JtYXRbb2ZmXS52NGwyX2Zvcm1hdC5mbXQucGl4LmZpZWxkLCBmYWxzZSk7CisJCWlmICgwID4gcmMpIHsKKwkJCVNBTSgiRVJST1I6IGFkanVzdF9mb3JtYXQoKSByZXR1cm5lZCAlaVxuIiwgcmMpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJSk9NKDgsICIlaT1wZWFzeWNhcC0+Zm9ybWF0X29mZnNldFxuIiwgcGVhc3ljYXAtPmZvcm1hdF9vZmZzZXQpOworCX0gZWxzZSB7CisJCUpPTSg4LCAiJWk9cGVhc3ljYXAtPmZvcm1hdF9vZmZzZXQgdW5jaGFuZ2VkXG4iLCBcCisJCQkJCQlwZWFzeWNhcC0+Zm9ybWF0X29mZnNldCk7CisJfQorCW1vb2QgPSBwZWFzeWNhcC0+aW5wdXRzZXRbaW5wdXRdLmJyaWdodG5lc3M7CisJaWYgKG1vb2QgIT0gcGVhc3ljYXAtPmJyaWdodG5lc3MpIHsKKwkJcmMgPSBhZGp1c3RfYnJpZ2h0bmVzcyhwZWFzeWNhcCwgbW9vZCk7CisJCWlmICgwICE9IHJjKSB7CisJCQlTQU0oIkVSUk9SOiBhZGp1c3RfYnJpZ2h0bmVzcyByZXR1cm5lZCAlaVxuIiwgcmMpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJSk9NKDgsICIlaT1wZWFzeWNhcC0+YnJpZ2h0bmVzc1xuIiwgcGVhc3ljYXAtPmJyaWdodG5lc3MpOworCX0KKwltb29kID0gcGVhc3ljYXAtPmlucHV0c2V0W2lucHV0XS5jb250cmFzdDsKKwlpZiAobW9vZCAhPSBwZWFzeWNhcC0+Y29udHJhc3QpIHsKKwkJcmMgPSBhZGp1c3RfY29udHJhc3QocGVhc3ljYXAsIG1vb2QpOworCQlpZiAoMCAhPSByYykgeworCQkJU0FNKCJFUlJPUjogYWRqdXN0X2NvbnRyYXN0IHJldHVybmVkICVpXG4iLCByYyk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlKT00oOCwgIiVpPXBlYXN5Y2FwLT5jb250cmFzdFxuIiwgcGVhc3ljYXAtPmNvbnRyYXN0KTsKKwl9CisJbW9vZCA9IHBlYXN5Y2FwLT5pbnB1dHNldFtpbnB1dF0uc2F0dXJhdGlvbjsKKwlpZiAobW9vZCAhPSBwZWFzeWNhcC0+c2F0dXJhdGlvbikgeworCQlyYyA9IGFkanVzdF9zYXR1cmF0aW9uKHBlYXN5Y2FwLCBtb29kKTsKKwkJaWYgKDAgIT0gcmMpIHsKKwkJCVNBTSgiRVJST1I6IGFkanVzdF9zYXR1cmF0aW9uIHJldHVybmVkICVpXG4iLCByYyk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlKT00oOCwgIiVpPXBlYXN5Y2FwLT5zYXR1cmF0aW9uXG4iLCBwZWFzeWNhcC0+c2F0dXJhdGlvbik7CisJfQorCW1vb2QgPSBwZWFzeWNhcC0+aW5wdXRzZXRbaW5wdXRdLmh1ZTsKKwlpZiAobW9vZCAhPSBwZWFzeWNhcC0+aHVlKSB7CisJCXJjID0gYWRqdXN0X2h1ZShwZWFzeWNhcCwgbW9vZCk7CisJCWlmICgwICE9IHJjKSB7CisJCQlTQU0oIkVSUk9SOiBhZGp1c3RfaHVlIHJldHVybmVkICVpXG4iLCByYyk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlKT00oOCwgIiVpPXBlYXN5Y2FwLT5odWVcbiIsIHBlYXN5Y2FwLT5odWUpOworCX0KK30gZWxzZSB7CisJU0FNKCJNSVNUQUtFOiBlYXN5Y2FwLmlucHV0c2V0WyVpXSB1bnBvcHVsYXRlZFxuIiwgaW5wdXQpOworCXJldHVybiAtRU5PRU5UOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaWYgKE5VTEwgPT0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlKSB7CisJU0FNKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGlzIE5VTExcbiIpOworCXJldHVybiAtRU5PREVWOworfQorcmMgPSB1c2Jfc2V0X2ludGVyZmFjZShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsCisJCQlwZWFzeWNhcC0+dmlkZW9faW50ZXJmYWNlLCBcCisJCQlwZWFzeWNhcC0+dmlkZW9fYWx0c2V0dGluZ19vbik7CitpZiAoMCAhPSByYykgeworCVNBTSgiRVJST1I6IHVzYl9zZXRfaW50ZXJmYWNlKCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK3JjID0gc3RhcnRfMTAwKHBlYXN5Y2FwLT5wdXNiX2RldmljZSk7CitpZiAoMCAhPSByYykgeworCVNBTSgiRVJST1I6IHN0YXJ0XzEwMCgpIHJldHVybmVkICVpXG4iLCByYyk7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CitpZiAodHJ1ZSA9PSByZXN1Ym1pdCkKKwlzdWJtaXRfdmlkZW9fdXJicyhwZWFzeWNhcCk7CisKK3BlYXN5Y2FwLT52aWRlb19pc29jX3NlcXVlbmNlID0gVklERU9fSVNPQ19CVUZGRVJfTUFOWSAtIDE7CitwZWFzeWNhcC0+dmlkZW9faWRsZSA9IHZpZGVvX2lkbGVub3c7CitwZWFzeWNhcC0+YXVkaW9faWRsZSA9IGF1ZGlvX2lkbGVub3c7CitwZWFzeWNhcC0+dmlkZW9fanVuayA9IDA7CisKIHJldHVybiAwOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzI2LDMzICs2MzEsMjUgQEAKIHN0cnVjdCBkYXRhX3VyYiAqcGRhdGFfdXJiOwogc3RydWN0IHVyYiAqcHVyYjsKIHN0cnVjdCBsaXN0X2hlYWQgKnBsaXN0X2hlYWQ7Ci1pbnQgaiwgaXNiYWQsIG0sIHJjOworaW50IGosIGlzYmFkLCBub3NwYywgbSwgcmM7CiBpbnQgaXNidWY7CiAKLWlmICgoc3RydWN0IGxpc3RfaGVhZCAqKU5VTEwgPT0gcGVhc3ljYXAtPnB1cmJfdmlkZW9faGVhZCkgeworaWYgKE5VTEwgPT0gcGVhc3ljYXApIHsKKwlTQVkoIkVSUk9SOiBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KKworaWYgKE5VTEwgPT0gcGVhc3ljYXAtPnB1cmJfdmlkZW9faGVhZCkgewogCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT51cmJfdmlkZW9faGVhZCB1bmluaXRpYWxpemVkXG4iKTsKIAlyZXR1cm4gLUVGQVVMVDsKIH0KLWlmICgoc3RydWN0IHVzYl9kZXZpY2UgKilOVUxMID09IHBlYXN5Y2FwLT5wdXNiX2RldmljZSkgeworaWYgKE5VTEwgPT0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlKSB7CiAJU0FZKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGlzIE5VTExcbiIpOwotCXJldHVybiAtRUZBVUxUOworCXJldHVybiAtRU5PREVWOwogfQogaWYgKCFwZWFzeWNhcC0+dmlkZW9faXNvY19zdHJlYW1pbmcpIHsKLQotCi0KLQotCi0KLQotCi0JSk9UKDQsICJzdWJtaXNzaW9uIG9mIGFsbCB2aWRlbyB1cmJzXG4iKTsKLQlpZiAoMCAhPSByZWFkeV9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlKSkgewotCQlTQVkoIkVSUk9SOiBub3QgcmVhZHkgdG8gY2FwdHVyZSBhZnRlciB3YWl0aW5nICIgXAotCQkJCQkJCSJvbmUgc2Vjb25kXG4iKTsKLQkJU0FZKCIuLi4uLiAgY29udGludWluZyBhbnl3YXlcbiIpOwotCX0KLQlpc2JhZCA9IDA7ICBtID0gMDsKKwlKT00oNCwgInN1Ym1pc3Npb24gb2YgYWxsIHZpZGVvIHVyYnNcbiIpOworCWlzYmFkID0gMDsgIG5vc3BjID0gMDsgIG0gPSAwOwogCWxpc3RfZm9yX2VhY2gocGxpc3RfaGVhZCwgKHBlYXN5Y2FwLT5wdXJiX3ZpZGVvX2hlYWQpKSB7CiAJCXBkYXRhX3VyYiA9IGxpc3RfZW50cnkocGxpc3RfaGVhZCwgc3RydWN0IGRhdGFfdXJiLCBsaXN0X2hlYWQpOwogCQlpZiAoTlVMTCAhPSBwZGF0YV91cmIpIHsKQEAgLTM4OSw0NCArNjg2LDU3IEBACiAJCQkJcmMgPSB1c2Jfc3VibWl0X3VyYihwdXJiLCBHRlBfS0VSTkVMKTsKIAkJCQlpZiAoMCAhPSByYykgewogCQkJCQlpc2JhZCsrOwotCQkJCQlTQVkoIkVSUk9SOiB1c2Jfc3VibWl0X3VyYigpIGZhaWxlZCAiIFwKKwkJCQkJU0FNKCJFUlJPUjogdXNiX3N1Ym1pdF91cmIoKSBmYWlsZWQgIiBcCiAJCQkJCQkJImZvciB1cmIgd2l0aCByYzpcbiIpOwogCQkJCQlzd2l0Y2ggKHJjKSB7CiAJCQkJCWNhc2UgLUVOT01FTTogewotCQkJCQkJU0FZKCJFTk9NRU1cbiIpOworCQkJCQkJU0FNKCJFUlJPUjogLUVOT01FTT0iIFwKKwkJCQkJCQkidXNiX3N1Ym1pdF91cmIoKVxuIik7CiAJCQkJCQlicmVhazsKIAkJCQkJfQogCQkJCQljYXNlIC1FTk9ERVY6IHsKLQkJCQkJCVNBWSgiRU5PREVWXG4iKTsKKwkJCQkJCVNBTSgiRVJST1I6IC1FTk9ERVY9IiBcCisJCQkJCQkJInVzYl9zdWJtaXRfdXJiKClcbiIpOwogCQkJCQkJYnJlYWs7CiAJCQkJCX0KIAkJCQkJY2FzZSAtRU5YSU86IHsKLQkJCQkJCVNBWSgiRU5YSU9cbiIpOworCQkJCQkJU0FNKCJFUlJPUjogLUVOWElPPSIgXAorCQkJCQkJCSJ1c2Jfc3VibWl0X3VyYigpXG4iKTsKIAkJCQkJCWJyZWFrOwogCQkJCQl9CiAJCQkJCWNhc2UgLUVJTlZBTDogewotCQkJCQkJU0FZKCJFSU5WQUxcbiIpOworCQkJCQkJU0FNKCJFUlJPUjogLUVJTlZBTD0iIFwKKwkJCQkJCQkidXNiX3N1Ym1pdF91cmIoKVxuIik7CiAJCQkJCQlicmVhazsKIAkJCQkJfQogCQkJCQljYXNlIC1FQUdBSU46IHsKLQkJCQkJCVNBWSgiRUFHQUlOXG4iKTsKKwkJCQkJCVNBTSgiRVJST1I6IC1FQUdBSU49IiBcCisJCQkJCQkJInVzYl9zdWJtaXRfdXJiKClcbiIpOwogCQkJCQkJYnJlYWs7CiAJCQkJCX0KIAkJCQkJY2FzZSAtRUZCSUc6IHsKLQkJCQkJCVNBWSgiRUZCSUdcbiIpOworCQkJCQkJU0FNKCJFUlJPUjogLUVGQklHPSIgXAorCQkJCQkJCSJ1c2Jfc3VibWl0X3VyYigpXG4iKTsKIAkJCQkJCWJyZWFrOwogCQkJCQl9CiAJCQkJCWNhc2UgLUVQSVBFOiB7Ci0JCQkJCQlTQVkoIkVQSVBFXG4iKTsKKwkJCQkJCVNBTSgiRVJST1I6IC1FUElQRT0iIFwKKwkJCQkJCQkidXNiX3N1Ym1pdF91cmIoKVxuIik7CiAJCQkJCQlicmVhazsKIAkJCQkJfQogCQkJCQljYXNlIC1FTVNHU0laRTogewotCQkJCQkJU0FZKCJFTVNHU0laRVxuIik7CisJCQkJCQlTQU0oIkVSUk9SOiAtRU1TR1NJWkU9IiBcCisJCQkJCQkJInVzYl9zdWJtaXRfdXJiKClcbiIpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJY2FzZSAtRU5PU1BDOiB7CisJCQkJCQlub3NwYysrOwogCQkJCQkJYnJlYWs7CiAJCQkJCX0KIAkJCQkJZGVmYXVsdDogewotCQkJCQkJU0FZKCJ1bmtub3duIGVycm9yIGNvZGUgJWlcbiIsXAotCQkJCQkJCQkJIHJjKTsKKwkJCQkJCVNBTSgiRVJST1I6ICVpPSIgXAorCQkJCQkJCSJ1c2Jfc3VibWl0X3VyYigpXG4iLFwKKwkJCQkJCQlyYyk7CiAJCQkJCQlicmVhazsKIAkJCQkJfQogCQkJCQl9CkBAIC00MzQsMTQgKzc0NCwyMCBAQAogCQkJCQltKys7CiAJCQkJfQogCQkJCX0gZWxzZSB7Ci0JCQkJCWlzYmFkKys7CisJCQkJCSBpc2JhZCsrOwogCQkJCX0KIAkJCX0gZWxzZSB7CiAJCQkJIGlzYmFkKys7CiAJCQl9CiAJCX0KKwlpZiAobm9zcGMpIHsKKwkJU0FNKCItRU5PU1BDPXVzYl9zdWJtaXRfdXJiKCkgZm9yICVpIHVyYnNcbiIsIG5vc3BjKTsKKwkJU0FNKCIuLi4uLiAgcG9zc2libHkgaW5hZGVxdWF0ZSBVU0IgYmFuZHdpZHRoXG4iKTsKKwkJcGVhc3ljYXAtPnZpZGVvX2VvZiA9IDE7CisJfQorCiAJaWYgKGlzYmFkKSB7Ci0JCUpPVCg0LCAiYXR0ZW1wdGluZyBjbGVhbnVwIGluc3RlYWQgb2Ygc3VibWl0dGluZ1xuIik7CisJCUpPTSg0LCAiYXR0ZW1wdGluZyBjbGVhbnVwIGluc3RlYWQgb2Ygc3VibWl0dGluZ1xuIik7CiAJCWxpc3RfZm9yX2VhY2gocGxpc3RfaGVhZCwgKHBlYXN5Y2FwLT5wdXJiX3ZpZGVvX2hlYWQpKSB7CiAJCQlwZGF0YV91cmIgPSBsaXN0X2VudHJ5KHBsaXN0X2hlYWQsIHN0cnVjdCBkYXRhX3VyYiwgXAogCQkJCQkJCQlsaXN0X2hlYWQpOwpAQCAtNDU0LDE2ICs3NzAsMTAgQEAKIAkJcGVhc3ljYXAtPnZpZGVvX2lzb2Nfc3RyZWFtaW5nID0gMDsKIAl9IGVsc2UgewogCQlwZWFzeWNhcC0+dmlkZW9faXNvY19zdHJlYW1pbmcgPSAxOwotCQlKT1QoNCwgInN1Ym1pdHRlZCAlaSB2aWRlbyB1cmJzXG4iLCBtKTsKKwkJSk9NKDQsICJzdWJtaXR0ZWQgJWkgdmlkZW8gdXJic1xuIiwgbSk7CiAJfQotCi0KLQotCi0KLQogfSBlbHNlIHsKLQlKT1QoNCwgImFscmVhZHkgc3RyZWFtaW5nIHZpZGVvIHVyYnNcbiIpOworCUpPTSg0LCAiYWxyZWFkeSBzdHJlYW1pbmcgdmlkZW8gdXJic1xuIik7CiB9CiByZXR1cm4gMDsKIH0KQEAgLTQ3NSwzNSArNzg1LDMyIEBACiBzdHJ1Y3QgbGlzdF9oZWFkICpwbGlzdF9oZWFkOwogc3RydWN0IGRhdGFfdXJiICpwZGF0YV91cmI7CiAKLWlmICgoc3RydWN0IGVhc3ljYXAgKilOVUxMID09IHBlYXN5Y2FwKSB7CitpZiAoTlVMTCA9PSBwZWFzeWNhcCkgewogCVNBWSgiRVJST1I6IHBlYXN5Y2FwIGlzIE5VTExcbiIpOwogCXJldHVybiAtRUZBVUxUOwogfQogaWYgKHBlYXN5Y2FwLT52aWRlb19pc29jX3N0cmVhbWluZykgewotCi0KLQogCWlmICgoc3RydWN0IGxpc3RfaGVhZCAqKU5VTEwgIT0gcGVhc3ljYXAtPnB1cmJfdmlkZW9faGVhZCkgewogCQlwZWFzeWNhcC0+dmlkZW9faXNvY19zdHJlYW1pbmcgPSAwOwotCQlKT1QoNCwgImtpbGxpbmcgdmlkZW8gdXJic1xuIik7CisJCUpPTSg0LCAia2lsbGluZyB2aWRlbyB1cmJzXG4iKTsKIAkJbSA9IDA7CiAJCWxpc3RfZm9yX2VhY2gocGxpc3RfaGVhZCwgKHBlYXN5Y2FwLT5wdXJiX3ZpZGVvX2hlYWQpKSB7CiAJCQlwZGF0YV91cmIgPSBsaXN0X2VudHJ5KHBsaXN0X2hlYWQsIHN0cnVjdCBkYXRhX3VyYiwgXAogCQkJCQkJCQlsaXN0X2hlYWQpOwotCQkJaWYgKChzdHJ1Y3QgZGF0YV91cmIgKilOVUxMICE9IHBkYXRhX3VyYikgewotCQkJCWlmICgoc3RydWN0IHVyYiAqKU5VTEwgIT0gcGRhdGFfdXJiLT5wdXJiKSB7CisJCQlpZiAoTlVMTCAhPSBwZGF0YV91cmIpIHsKKwkJCQlpZiAoTlVMTCAhPSBwZGF0YV91cmItPnB1cmIpIHsKIAkJCQkJdXNiX2tpbGxfdXJiKHBkYXRhX3VyYi0+cHVyYik7CiAJCQkJCW0rKzsKIAkJCQl9CiAJCQl9CiAJCX0KLQkJSk9UKDQsICIlaSB2aWRlbyB1cmJzIGtpbGxlZFxuIiwgbSk7CisJCUpPTSg0LCAiJWkgdmlkZW8gdXJicyBraWxsZWRcbiIsIG0pOwogCX0gZWxzZSB7Ci0JCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT5wdXJiX3ZpZGVvX2hlYWQgaXMgTlVMTFxuIik7CisJCVNBTSgiRVJST1I6IHBlYXN5Y2FwLT5wdXJiX3ZpZGVvX2hlYWQgaXMgTlVMTFxuIik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIH0gZWxzZSB7Ci0JSk9UKDgsICIlaT12aWRlb19pc29jX3N0cmVhbWluZywgbm8gdmlkZW8gdXJicyBraWxsZWRcbiIsIFwKKwlKT00oOCwgIiVpPXZpZGVvX2lzb2Nfc3RyZWFtaW5nLCBubyB2aWRlbyB1cmJzIGtpbGxlZFxuIiwgXAogCQkJCQlwZWFzeWNhcC0+dmlkZW9faXNvY19zdHJlYW1pbmcpOwogfQogcmV0dXJuIDA7CkBAIC01MzMsMTEgKzg0MCwxNSBAQAogCVNBWSgiZW5kaW5nIHVuc3VjY2Vzc2Z1bGx5XG4iKTsKIAlyZXR1cm4gLUVGQVVMVDsKIH0KLWlmICgwICE9IGtpbGxfdmlkZW9fdXJicyhwZWFzeWNhcCkpIHsKLQlTQVkoIkVSUk9SOiBraWxsX3ZpZGVvX3VyYnMoKSBmYWlsZWRcbiIpOworaWYgKG1lbWNtcCgmcGVhc3ljYXAtPnRlbGx0YWxlWzBdLCBURUxMVEFMRSwgc3RybGVuKFRFTExUQUxFKSkpIHsKKwlTQVkoIkVSUk9SOiBiYWQgcGVhc3ljYXA6IDB4JTA4bFhcbiIsICh1bnNpZ25lZCBsb25nIGludCkgcGVhc3ljYXApOwogCXJldHVybiAtRUZBVUxUOwogfQotSk9UKDQsICJlbmRpbmcgc3VjY2Vzc2Z1bGx5XG4iKTsKK2lmICgwICE9IGtpbGxfdmlkZW9fdXJicyhwZWFzeWNhcCkpIHsKKwlTQU0oIkVSUk9SOiBraWxsX3ZpZGVvX3VyYnMoKSBmYWlsZWRcbiIpOworCXJldHVybiAtRUZBVUxUOworfQorSk9NKDQsICJlbmRpbmcgc3VjY2Vzc2Z1bGx5XG4iKTsKIC8qdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYqLwogI2Vsc2UKICMKQEAgLTU1MCw2MyArODYxLDQ1IEBACiAvKnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2Ki8KICNpZiBkZWZpbmVkKEVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKQogaW50Ci12aWRlb2Rldl9yZWxlYXNlKHN0cnVjdCB2aWRlb19kZXZpY2UgKnB2ZCkKK3ZpZGVvZGV2X3JlbGVhc2Uoc3RydWN0IHZpZGVvX2RldmljZSAqcHZpZGVvX2RldmljZSkKIHsKIHN0cnVjdCBlYXN5Y2FwICpwZWFzeWNhcDsKLWludCBpLCBqLCBrOwogCiBKT1QoNCwgIlxuIik7CiAKLWsgPSAwOwotZm9yIChpID0gMDsgIGkgPCB2aWRlb19kZXZpY2VfbWFueTsgIGkrKykgewotCXB2aWRlb19kZXZpY2UgPSBwdmlkZW9fYXJyYXlbaV07Ci0JaWYgKChzdHJ1Y3QgdmlkZW9fZGV2aWNlICopTlVMTCAhPSBwdmlkZW9fZGV2aWNlKSB7Ci0JCWlmIChwdmQtPm1pbm9yID09IHB2aWRlb19kZXZpY2UtPm1pbm9yKSB7Ci0JCQlwZWFzeWNhcCA9IChzdHJ1Y3QgZWFzeWNhcCAqKVwKLQkJCQkJdmlkZW9fZ2V0X2RydmRhdGEocHZpZGVvX2RldmljZSk7Ci0JCQlpZiAoKHN0cnVjdCBlYXN5Y2FwICopTlVMTCA9PSBwZWFzeWNhcCkgewotCQkJCVNBWSgiRVJST1I6ICBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKLQkJCQlTQVkoImVuZGluZyB1bnN1Y2Nlc3NmdWxseVxuIik7Ci0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQl9Ci0JCQlpZiAoMCAhPSBraWxsX3ZpZGVvX3VyYnMocGVhc3ljYXApKSB7Ci0JCQkJU0FZKCJFUlJPUjoga2lsbF92aWRlb191cmJzKCkgZmFpbGVkXG4iKTsKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCX0KLQkJCUpPVCg0LCAiZnJlZWluZyB2aWRlb19kZXZpY2Ugc3RydWN0dXJlOiAiIFwKLQkJCQkJCQkiL2Rldi92aWRlbyVpXG4iLCBpKTsKLQkJCWtmcmVlKCh2b2lkICopcHZpZGVvX2RldmljZSk7Ci0JCQlmb3IgKGogPSBpOyAgaiA8IChWSURFT19ERVZJQ0VfTUFOWSAtIDEpOyAgaisrKQotCQkJCXB2aWRlb19hcnJheVtqXSA9IHB2aWRlb19hcnJheVtqICsgMV07Ci0JCQl2aWRlb19kZXZpY2VfbWFueS0tOyAgaysrOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci1pZiAoIWspIHsKLQlTQVkoIkVSUk9SOiBsb3N0IHZpZGVvX2RldmljZSBzdHJ1Y3R1cmUgZm9yICVpPW1pbm9yXG4iLCBwdmQtPm1pbm9yKTsKLQlTQVkoImNhbm5vdCBmcmVlOiBtYXkgY2F1c2UgbWVtb3J5IGxlYWtcbiIpOworcGVhc3ljYXAgPSB2aWRlb19nZXRfZHJ2ZGF0YShwdmlkZW9fZGV2aWNlKTsKK2lmIChOVUxMID09IHBlYXN5Y2FwKSB7CisJU0FZKCJFUlJPUjogIHBlYXN5Y2FwIGlzIE5VTExcbiIpOwogCVNBWSgiZW5kaW5nIHVuc3VjY2Vzc2Z1bGx5XG4iKTsKIAlyZXR1cm4gLUVGQVVMVDsKIH0KLQotSk9UKDQsICJlbmRpbmcgc3VjY2Vzc2Z1bGx5XG4iKTsKK2lmIChtZW1jbXAoJnBlYXN5Y2FwLT50ZWxsdGFsZVswXSwgVEVMTFRBTEUsIHN0cmxlbihURUxMVEFMRSkpKSB7CisJU0FZKCJFUlJPUjogYmFkIHBlYXN5Y2FwOiAweCUwOGxYXG4iLCAodW5zaWduZWQgbG9uZyBpbnQpIHBlYXN5Y2FwKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK2lmICgwICE9IGtpbGxfdmlkZW9fdXJicyhwZWFzeWNhcCkpIHsKKwlTQU0oIkVSUk9SOiBraWxsX3ZpZGVvX3VyYnMoKSBmYWlsZWRcbiIpOworCXJldHVybiAtRUZBVUxUOworfQorSk9NKDQsICJlbmRpbmcgc3VjY2Vzc2Z1bGx5XG4iKTsKIHJldHVybiAwOwogfQogI2VuZGlmIC8qRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQqLwotLypeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKLSAqICBUSElTIEZVTkNUSU9OIElTIENBTExFRCBGUk9NIFdJVEhJTiBlYXN5Y2FwX3VzYl9kaXNjb25uZWN0KCkuCi0gKiAgQlkgVEhJUyBTVEFHRSBUSEUgREVWSUNFIEhBUyBBTFJFQURZIEJFRU4gUEhZU0lDQUxMWSBVTlBMVUdHRUQuCi0gKiAgcGVhc3ljYXAtPnB1c2JfZGV2aWNlIElTIE5PIExPTkdFUiBWQUxJRCBBTkQgU0hPVUxEIEhBVkUgQkVFTiBTRVQgVE8gTlVMTC4KKyAqICBUSElTIEZVTkNUSU9OIElTIENBTExFRCBGUk9NIFdJVEhJTiBlYXN5Y2FwX3VzYl9kaXNjb25uZWN0KCkgQU5EIElTCisgKiAgUFJPVEVDVEVEIEJZIFNFTUFQSE9SRVMgU0VUIEFORCBDTEVBUkVEIEJZIGVhc3ljYXBfdXNiX2Rpc2Nvbm5lY3QoKS4KKyAqCisgKiAgQlkgVEhJUyBTVEFHRSBUSEUgREVWSUNFIEhBUyBBTFJFQURZIEJFRU4gUEhZU0lDQUxMWSBVTlBMVUdHRUQsIFNPCisgKiAgcGVhc3ljYXAtPnB1c2JfZGV2aWNlIElTIE5PIExPTkdFUiBWQUxJRC4KICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogdm9pZAogZWFzeWNhcF9kZWxldGUoc3RydWN0IGtyZWYgKnBrcmVmKQogewotaW50IGssIG0sIGxvc3Q7CitpbnQgaywgbSwgZ29uZSwga2Q7CiBpbnQgYWxsb2NhdGlvbl92aWRlb191cmIsIGFsbG9jYXRpb25fdmlkZW9fcGFnZSwgYWxsb2NhdGlvbl92aWRlb19zdHJ1Y3Q7CiBpbnQgYWxsb2NhdGlvbl9hdWRpb191cmIsIGFsbG9jYXRpb25fYXVkaW9fcGFnZSwgYWxsb2NhdGlvbl9hdWRpb19zdHJ1Y3Q7CiBpbnQgcmVnaXN0ZXJlZF92aWRlbywgcmVnaXN0ZXJlZF9hdWRpbzsKQEAgLTYxNywyMiArOTEwLDI3IEBACiBKT1QoNCwgIlxuIik7CiAKIHBlYXN5Y2FwID0gY29udGFpbmVyX29mKHBrcmVmLCBzdHJ1Y3QgZWFzeWNhcCwga3JlZik7Ci1pZiAoKHN0cnVjdCBlYXN5Y2FwICopTlVMTCA9PSBwZWFzeWNhcCkgewotCVNBWSgiRVJST1I6IHBlYXN5Y2FwIGlzIE5VTEw6IGNhbm5vdCBwZXJmb3JtIGRlbGV0aW9uc1xuIik7CitpZiAoTlVMTCA9PSBwZWFzeWNhcCkgeworCVNBTSgiRVJST1I6IHBlYXN5Y2FwIGlzIE5VTEw6IGNhbm5vdCBwZXJmb3JtIGRlbGV0aW9uc1xuIik7CiAJcmV0dXJuOwogfQoraWYgKG1lbWNtcCgmcGVhc3ljYXAtPnRlbGx0YWxlWzBdLCBURUxMVEFMRSwgc3RybGVuKFRFTExUQUxFKSkpIHsKKwlTQVkoIkVSUk9SOiBiYWQgcGVhc3ljYXA6IDB4JTA4bFhcbiIsICh1bnNpZ25lZCBsb25nIGludCkgcGVhc3ljYXApOworCXJldHVybjsKK30KK2tkID0gaXNkb25nbGUocGVhc3ljYXApOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKICAqICBGUkVFIFZJREVPLgogICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBpZiAoKHN0cnVjdCBsaXN0X2hlYWQgKilOVUxMICE9IHBlYXN5Y2FwLT5wdXJiX3ZpZGVvX2hlYWQpIHsKLQlKT1QoNCwgImZyZWVpbmcgdmlkZW8gdXJic1xuIik7CisJSk9NKDQsICJmcmVlaW5nIHZpZGVvIHVyYnNcbiIpOwogCW0gPSAwOwogCWxpc3RfZm9yX2VhY2gocGxpc3RfaGVhZCwgKHBlYXN5Y2FwLT5wdXJiX3ZpZGVvX2hlYWQpKSB7CiAJCXBkYXRhX3VyYiA9IGxpc3RfZW50cnkocGxpc3RfaGVhZCwgc3RydWN0IGRhdGFfdXJiLCBsaXN0X2hlYWQpOwogCQlpZiAoTlVMTCA9PSBwZGF0YV91cmIpCi0JCQlKT1QoNCwgIkVSUk9SOiBwZGF0YV91cmIgaXMgTlVMTFxuIik7CisJCQlKT00oNCwgIkVSUk9SOiBwZGF0YV91cmIgaXMgTlVMTFxuIik7CiAJCWVsc2UgewogCQkJaWYgKChzdHJ1Y3QgdXJiICopTlVMTCAhPSBwZGF0YV91cmItPnB1cmIpIHsKIAkJCQl1c2JfZnJlZV91cmIocGRhdGFfdXJiLT5wdXJiKTsKQEAgLTY0Myw5ICs5NDEsOSBAQAogCQl9CiAJfQogCi0JSk9UKDQsICIlaSB2aWRlbyB1cmJzIGZyZWVkXG4iLCBtKTsKKwlKT00oNCwgIiVpIHZpZGVvIHVyYnMgZnJlZWRcbiIsIG0pOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCUpPVCg0LCAiZnJlZWluZyB2aWRlbyBkYXRhX3VyYiBzdHJ1Y3R1cmVzLlxuIik7CisJSk9NKDQsICJmcmVlaW5nIHZpZGVvIGRhdGFfdXJiIHN0cnVjdHVyZXMuXG4iKTsKIAltID0gMDsKIAlsaXN0X2Zvcl9lYWNoX3NhZmUocGxpc3RfaGVhZCwgcGxpc3RfbmV4dCwgcGVhc3ljYXAtPnB1cmJfdmlkZW9faGVhZCkgewogCQlwZGF0YV91cmIgPSBsaXN0X2VudHJ5KHBsaXN0X2hlYWQsIHN0cnVjdCBkYXRhX3VyYiwgbGlzdF9oZWFkKTsKQEAgLTY1NiwxNCArOTU0LDEyIEBACiAJCQltKys7CiAJCX0KIAl9Ci0JSk9UKDQsICIlaSB2aWRlbyBkYXRhX3VyYiBzdHJ1Y3R1cmVzIGZyZWVkXG4iLCBtKTsKLQlKT1QoNCwgInNldHRpbmcgcGVhc3ljYXAtPnB1cmJfdmlkZW9faGVhZD1OVUxMXG4iKTsKKwlKT00oNCwgIiVpIHZpZGVvIGRhdGFfdXJiIHN0cnVjdHVyZXMgZnJlZWRcbiIsIG0pOworCUpPTSg0LCAic2V0dGluZyBwZWFzeWNhcC0+cHVyYl92aWRlb19oZWFkPU5VTExcbiIpOwogCXBlYXN5Y2FwLT5wdXJiX3ZpZGVvX2hlYWQgPSAoc3RydWN0IGxpc3RfaGVhZCAqKU5VTEw7Ci0JfSBlbHNlIHsKLUpPVCg0LCAicGVhc3ljYXAtPnB1cmJfdmlkZW9faGVhZCBpcyBOVUxMXG4iKTsKIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLUpPVCg0LCAiZnJlZWluZyB2aWRlbyBpc29jIGJ1ZmZlcnMuXG4iKTsKK0pPTSg0LCAiZnJlZWluZyB2aWRlbyBpc29jIGJ1ZmZlcnMuXG4iKTsKIG0gPSAwOwogZm9yIChrID0gMDsgIGsgPCBWSURFT19JU09DX0JVRkZFUl9NQU5ZOyAgaysrKSB7CiAJaWYgKCh2b2lkICopTlVMTCAhPSBwZWFzeWNhcC0+dmlkZW9faXNvY19idWZmZXJba10ucGdvKSB7CkBAIC02NzYsMTAgKzk3MiwxMCBAQAogCQltKys7CiAJfQogfQotSk9UKDQsICJpc29jIHZpZGVvIGJ1ZmZlcnMgZnJlZWQ6ICVpIHBhZ2VzXG4iLCBtICogKDB4MDEgPDwgVklERU9fSVNPQ19PUkRFUikpOworSk9NKDQsICJpc29jIHZpZGVvIGJ1ZmZlcnMgZnJlZWQ6ICVpIHBhZ2VzXG4iLCBtICogKDB4MDEgPDwgVklERU9fSVNPQ19PUkRFUikpOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotSk9UKDQsICJmcmVlaW5nIHZpZGVvIGZpZWxkIGJ1ZmZlcnMuXG4iKTsKLWxvc3QgPSAwOworSk9NKDQsICJmcmVlaW5nIHZpZGVvIGZpZWxkIGJ1ZmZlcnMuXG4iKTsKK2dvbmUgPSAwOwogZm9yIChrID0gMDsgIGsgPCBGSUVMRF9CVUZGRVJfTUFOWTsgIGsrKykgewogCWZvciAobSA9IDA7ICBtIDwgRklFTERfQlVGRkVSX1NJWkUvUEFHRV9TSVpFOyAgbSsrKSB7CiAJCWlmICgodm9pZCAqKU5VTEwgIT0gcGVhc3ljYXAtPmZpZWxkX2J1ZmZlcltrXVttXS5wZ28pIHsKQEAgLTY4NywxNCArOTgzLDE0IEBACiAJCQkJCShwZWFzeWNhcC0+ZmllbGRfYnVmZmVyW2tdW21dLnBnbykpOwogCQkJcGVhc3ljYXAtPmZpZWxkX2J1ZmZlcltrXVttXS5wZ28gPSAodm9pZCAqKU5VTEw7CiAJCQlwZWFzeWNhcC0+YWxsb2NhdGlvbl92aWRlb19wYWdlIC09IDE7Ci0JCQlsb3N0Kys7CisJCQlnb25lKys7CiAJCX0KIAl9CiB9Ci1KT1QoNCwgInZpZGVvIGZpZWxkIGJ1ZmZlcnMgZnJlZWQ6ICVpIHBhZ2VzXG4iLCBsb3N0KTsKK0pPTSg0LCAidmlkZW8gZmllbGQgYnVmZmVycyBmcmVlZDogJWkgcGFnZXNcbiIsIGdvbmUpOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotSk9UKDQsICJmcmVlaW5nIHZpZGVvIGZyYW1lIGJ1ZmZlcnMuXG4iKTsKLWxvc3QgPSAwOworSk9NKDQsICJmcmVlaW5nIHZpZGVvIGZyYW1lIGJ1ZmZlcnMuXG4iKTsKK2dvbmUgPSAwOwogZm9yIChrID0gMDsgIGsgPCBGUkFNRV9CVUZGRVJfTUFOWTsgIGsrKykgewogCWZvciAobSA9IDA7ICBtIDwgRlJBTUVfQlVGRkVSX1NJWkUvUEFHRV9TSVpFOyAgbSsrKSB7CiAJCWlmICgodm9pZCAqKU5VTEwgIT0gcGVhc3ljYXAtPmZyYW1lX2J1ZmZlcltrXVttXS5wZ28pIHsKQEAgLTcwMiwyMyArOTk4LDIzIEBACiAJCQkJCShwZWFzeWNhcC0+ZnJhbWVfYnVmZmVyW2tdW21dLnBnbykpOwogCQkJcGVhc3ljYXAtPmZyYW1lX2J1ZmZlcltrXVttXS5wZ28gPSAodm9pZCAqKU5VTEw7CiAJCQlwZWFzeWNhcC0+YWxsb2NhdGlvbl92aWRlb19wYWdlIC09IDE7Ci0JCQlsb3N0Kys7CisJCQlnb25lKys7CiAJCX0KIAl9CiB9Ci1KT1QoNCwgInZpZGVvIGZyYW1lIGJ1ZmZlcnMgZnJlZWQ6ICVpIHBhZ2VzXG4iLCBsb3N0KTsKK0pPTSg0LCAidmlkZW8gZnJhbWUgYnVmZmVycyBmcmVlZDogJWkgcGFnZXNcbiIsIGdvbmUpOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKICAqICBGUkVFIEFVRElPLgogICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBpZiAoKHN0cnVjdCBsaXN0X2hlYWQgKilOVUxMICE9IHBlYXN5Y2FwLT5wdXJiX2F1ZGlvX2hlYWQpIHsKLQlKT1QoNCwgImZyZWVpbmcgYXVkaW8gdXJic1xuIik7CisJSk9NKDQsICJmcmVlaW5nIGF1ZGlvIHVyYnNcbiIpOwogCW0gPSAwOwogCWxpc3RfZm9yX2VhY2gocGxpc3RfaGVhZCwgKHBlYXN5Y2FwLT5wdXJiX2F1ZGlvX2hlYWQpKSB7CiAJCXBkYXRhX3VyYiA9IGxpc3RfZW50cnkocGxpc3RfaGVhZCwgc3RydWN0IGRhdGFfdXJiLCBsaXN0X2hlYWQpOwogCQlpZiAoTlVMTCA9PSBwZGF0YV91cmIpCi0JCQlKT1QoNCwgIkVSUk9SOiBwZGF0YV91cmIgaXMgTlVMTFxuIik7CisJCQlKT00oNCwgIkVSUk9SOiBwZGF0YV91cmIgaXMgTlVMTFxuIik7CiAJCWVsc2UgewogCQkJaWYgKChzdHJ1Y3QgdXJiICopTlVMTCAhPSBwZGF0YV91cmItPnB1cmIpIHsKIAkJCQl1c2JfZnJlZV91cmIocGRhdGFfdXJiLT5wdXJiKTsKQEAgLTcyOCw5ICsxMDI0LDkgQEAKIAkJCX0KIAkJfQogCX0KLQlKT1QoNCwgIiVpIGF1ZGlvIHVyYnMgZnJlZWRcbiIsIG0pOworCUpPTSg0LCAiJWkgYXVkaW8gdXJicyBmcmVlZFxuIiwgbSk7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JSk9UKDQsICJmcmVlaW5nIGF1ZGlvIGRhdGFfdXJiIHN0cnVjdHVyZXMuXG4iKTsKKwlKT00oNCwgImZyZWVpbmcgYXVkaW8gZGF0YV91cmIgc3RydWN0dXJlcy5cbiIpOwogCW0gPSAwOwogCWxpc3RfZm9yX2VhY2hfc2FmZShwbGlzdF9oZWFkLCBwbGlzdF9uZXh0LCBwZWFzeWNhcC0+cHVyYl9hdWRpb19oZWFkKSB7CiAJCXBkYXRhX3VyYiA9IGxpc3RfZW50cnkocGxpc3RfaGVhZCwgc3RydWN0IGRhdGFfdXJiLCBsaXN0X2hlYWQpOwpAQCAtNzQxLDE0ICsxMDM3LDEyIEBACiAJCQltKys7CiAJCX0KIAl9Ci1KT1QoNCwgIiVpIGF1ZGlvIGRhdGFfdXJiIHN0cnVjdHVyZXMgZnJlZWRcbiIsIG0pOwotSk9UKDQsICJzZXR0aW5nIHBlYXN5Y2FwLT5wdXJiX2F1ZGlvX2hlYWQ9TlVMTFxuIik7CitKT00oNCwgIiVpIGF1ZGlvIGRhdGFfdXJiIHN0cnVjdHVyZXMgZnJlZWRcbiIsIG0pOworSk9NKDQsICJzZXR0aW5nIHBlYXN5Y2FwLT5wdXJiX2F1ZGlvX2hlYWQ9TlVMTFxuIik7CiBwZWFzeWNhcC0+cHVyYl9hdWRpb19oZWFkID0gKHN0cnVjdCBsaXN0X2hlYWQgKilOVUxMOwotfSBlbHNlIHsKLUpPVCg0LCAicGVhc3ljYXAtPnB1cmJfYXVkaW9faGVhZCBpcyBOVUxMXG4iKTsKIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLUpPVCg0LCAiZnJlZWluZyBhdWRpbyBpc29jIGJ1ZmZlcnMuXG4iKTsKK0pPTSg0LCAiZnJlZWluZyBhdWRpbyBpc29jIGJ1ZmZlcnMuXG4iKTsKIG0gPSAwOwogZm9yIChrID0gMDsgIGsgPCBBVURJT19JU09DX0JVRkZFUl9NQU5ZOyAgaysrKSB7CiAJaWYgKCh2b2lkICopTlVMTCAhPSBwZWFzeWNhcC0+YXVkaW9faXNvY19idWZmZXJba10ucGdvKSB7CkBAIC03NjEsMjIgKzEwNTUsMjIgQEAKIAkJbSsrOwogCX0KIH0KLUpPVCg0LCAiZWFzeXNuZF9kZWxldGUoKTogaXNvYyBhdWRpbyBidWZmZXJzIGZyZWVkOiAlaSBwYWdlc1xuIiwgXAorSk9NKDQsICJlYXN5c25kX2RlbGV0ZSgpOiBpc29jIGF1ZGlvIGJ1ZmZlcnMgZnJlZWQ6ICVpIHBhZ2VzXG4iLCBcCiAJCQkJCW0gKiAoMHgwMSA8PCBBVURJT19JU09DX09SREVSKSk7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1KT1QoNCwgImZyZWVpbmcgYXVkaW8gYnVmZmVycy5cbiIpOwotbG9zdCA9IDA7CitKT00oNCwgImZyZWVpbmcgYXVkaW8gYnVmZmVycy5cbiIpOworZ29uZSA9IDA7CiBmb3IgKGsgPSAwOyAgayA8IHBlYXN5Y2FwLT5hdWRpb19idWZmZXJfcGFnZV9tYW55OyAgaysrKSB7CiAJaWYgKCh2b2lkICopTlVMTCAhPSBwZWFzeWNhcC0+YXVkaW9fYnVmZmVyW2tdLnBnbykgewogCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpKHBlYXN5Y2FwLT5hdWRpb19idWZmZXJba10ucGdvKSk7CiAJCXBlYXN5Y2FwLT5hdWRpb19idWZmZXJba10ucGdvID0gKHZvaWQgKilOVUxMOwogCQlwZWFzeWNhcC0+YWxsb2NhdGlvbl9hdWRpb19wYWdlIC09IDE7Ci0JCWxvc3QrKzsKKwkJZ29uZSsrOwogCX0KIH0KLUpPVCg0LCAiZWFzeXNuZF9kZWxldGUoKTogYXVkaW8gYnVmZmVycyBmcmVlZDogJWkgcGFnZXNcbiIsIGxvc3QpOworSk9NKDQsICJlYXN5c25kX2RlbGV0ZSgpOiBhdWRpbyBidWZmZXJzIGZyZWVkOiAlaSBwYWdlc1xuIiwgZ29uZSk7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1KT1QoNCwgImZyZWVpbmcgZWFzeWNhcCBzdHJ1Y3R1cmUuXG4iKTsKK0pPTSg0LCAiZnJlZWluZyBlYXN5Y2FwIHN0cnVjdHVyZS5cbiIpOwogYWxsb2NhdGlvbl92aWRlb191cmIgICAgPSBwZWFzeWNhcC0+YWxsb2NhdGlvbl92aWRlb191cmI7CiBhbGxvY2F0aW9uX3ZpZGVvX3BhZ2UgICA9IHBlYXN5Y2FwLT5hbGxvY2F0aW9uX3ZpZGVvX3BhZ2U7CiBhbGxvY2F0aW9uX3ZpZGVvX3N0cnVjdCA9IHBlYXN5Y2FwLT5hbGxvY2F0aW9uX3ZpZGVvX3N0cnVjdDsKQEAgLTc4NSwxNSArMTA3OSwxNiBAQAogYWxsb2NhdGlvbl9hdWRpb19wYWdlICAgPSBwZWFzeWNhcC0+YWxsb2NhdGlvbl9hdWRpb19wYWdlOwogYWxsb2NhdGlvbl9hdWRpb19zdHJ1Y3QgPSBwZWFzeWNhcC0+YWxsb2NhdGlvbl9hdWRpb19zdHJ1Y3Q7CiByZWdpc3RlcmVkX2F1ZGlvICAgICAgICA9IHBlYXN5Y2FwLT5yZWdpc3RlcmVkX2F1ZGlvOwotbSA9IDA7Ci1pZiAoKHN0cnVjdCBlYXN5Y2FwICopTlVMTCAhPSBwZWFzeWNhcCkgewotCWtmcmVlKHBlYXN5Y2FwKTsgIHBlYXN5Y2FwID0gKHN0cnVjdCBlYXN5Y2FwICopTlVMTDsKLQlhbGxvY2F0aW9uX3ZpZGVvX3N0cnVjdCAtPSBzaXplb2Yoc3RydWN0IGVhc3ljYXApOwotCW0rKzsKLX0KLUpPVCg0LCAiJWkgZWFzeWNhcCBzdHJ1Y3R1cmUgZnJlZWRcbiIsIG0pOwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCitrZnJlZShwZWFzeWNhcCk7CitpZiAoMCA8PSBrZCAmJiBET05HTEVfTUFOWSA+IGtkKSB7CisJZWFzeWNhcF9kb25nbGVba2RdLnBlYXN5Y2FwID0gKHN0cnVjdCBlYXN5Y2FwICopTlVMTDsKKwlKT1QoNCwgIiAgIG51bGwtLT5lYXN5Y2FwX2RvbmdsZVslaV0ucGVhc3ljYXBcbiIsIGtkKTsKKwlhbGxvY2F0aW9uX3ZpZGVvX3N0cnVjdCAtPSBzaXplb2Yoc3RydWN0IGVhc3ljYXApOworfSBlbHNlIHsKKwlTQVkoIkVSUk9SOiBjYW5ub3QgcHVyZ2UgZWFzeWNhcF9kb25nbGVbXS5wZWFzeWNhcCIpOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogU0FZKCIlOGk9IHZpZGVvIHVyYnMgICAgIGFmdGVyIGFsbCBkZWxldGlvbnNcbiIsIGFsbG9jYXRpb25fdmlkZW9fdXJiKTsKIFNBWSgiJThpPSB2aWRlbyBwYWdlcyAgICBhZnRlciBhbGwgZGVsZXRpb25zXG4iLCBhbGxvY2F0aW9uX3ZpZGVvX3BhZ2UpOwogU0FZKCIlOGk9IHZpZGVvIHN0cnVjdHMgIGFmdGVyIGFsbCBkZWxldGlvbnNcbiIsIGFsbG9jYXRpb25fdmlkZW9fc3RydWN0KTsKQEAgLTgxMCwyNyArMTEwNSw4NSBAQAogdW5zaWduZWQgaW50IGVhc3ljYXBfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKIHsKIHN0cnVjdCBlYXN5Y2FwICpwZWFzeWNhcDsKK2ludCByYywga2Q7CiAKIEpPVCg4LCAiXG4iKTsKIAogaWYgKE5VTEwgPT0gKChwb2xsX3RhYmxlICopd2FpdCkpCiAJSk9UKDgsICJXQVJOSU5HOiAgcG9sbCB0YWJsZSBwb2ludGVyIGlzIE5VTEwgLi4uIGNvbnRpbnVpbmdcbiIpOwotaWYgKE5VTEwgPT0gKChzdHJ1Y3QgZmlsZSAqKWZpbGUpKSB7CitpZiAoKHN0cnVjdCBmaWxlICopTlVMTCA9PSBmaWxlKSB7CiAJU0FZKCJFUlJPUjogIGZpbGUgcG9pbnRlciBpcyBOVUxMXG4iKTsKLQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gLUVSRVNUQVJUU1lTOwogfQogcGVhc3ljYXAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiBpZiAoTlVMTCA9PSBwZWFzeWNhcCkgewogCVNBWSgiRVJST1I6ICBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKIAlyZXR1cm4gLUVGQVVMVDsKIH0KK2lmIChtZW1jbXAoJnBlYXN5Y2FwLT50ZWxsdGFsZVswXSwgVEVMTFRBTEUsIHN0cmxlbihURUxMVEFMRSkpKSB7CisJU0FZKCJFUlJPUjogYmFkIHBlYXN5Y2FwOiAweCUwOGxYXG4iLCAodW5zaWduZWQgbG9uZyBpbnQpIHBlYXN5Y2FwKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK2lmIChOVUxMID09IHBlYXN5Y2FwLT5wdXNiX2RldmljZSkgeworCVNBWSgiRVJST1I6ICBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitrZCA9IGlzZG9uZ2xlKHBlYXN5Y2FwKTsKK2lmICgwIDw9IGtkICYmIERPTkdMRV9NQU5ZID4ga2QpIHsKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pKSB7CisJCVNBWSgiRVJST1I6IGNhbm5vdCBkb3duIGVhc3ljYXBfZG9uZ2xlWyVpXS5tdXRleF92aWRlb1xuIiwga2QpOworCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCX0KKwlKT00oNCwgImxvY2tlZCBlYXN5Y2FwX2RvbmdsZVslaV0ubXV0ZXhfdmlkZW9cbiIsIGtkKTsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCS8qCisJICogIE1FQU5XSElMRSwgZWFzeWNhcF91c2JfZGlzY29ubmVjdCgpIE1BWSBIQVZFIEZSRUVEIFBPSU5URVIKKwkgKiAgcGVhc3ljYXAsIElOIFdISUNIIENBU0UgQSBSRVBFQVQgQ0FMTCBUTyBpc2RvbmdsZSgpIFdJTEwgRkFJTC4KKwkgKiAgSUYgTkVDRVNTQVJZLCBCQUlMIE9VVC4KKwkqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJaWYgKGtkICE9IGlzZG9uZ2xlKHBlYXN5Y2FwKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwlpZiAoTlVMTCA9PSBmaWxlKSB7CisJCVNBWSgiRVJST1I6ICBmaWxlIGlzIE5VTExcbiIpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorCXBlYXN5Y2FwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWlmIChOVUxMID09IHBlYXN5Y2FwKSB7CisJCVNBWSgiRVJST1I6ICBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOworCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCX0KKwlpZiAobWVtY21wKCZwZWFzeWNhcC0+dGVsbHRhbGVbMF0sIFRFTExUQUxFLCBzdHJsZW4oVEVMTFRBTEUpKSkgeworCQlTQVkoIkVSUk9SOiBiYWQgcGVhc3ljYXA6IDB4JTA4bFhcbiIsIFwKKwkJCQkJCSh1bnNpZ25lZCBsb25nIGludCkgcGVhc3ljYXApOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorCWlmIChOVUxMID09IHBlYXN5Y2FwLT5wdXNiX2RldmljZSkgeworCQlTQU0oIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwl9Cit9IGVsc2UKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCS8qCisJICogIElGIGVhc3ljYXBfdXNiX2Rpc2Nvbm5lY3QoKSBIQVMgQUxSRUFEWSBGUkVFRCBQT0lOVEVSIHBlYXN5Y2FwCisJICogIEJFRk9SRSBUSEUgQVRURU1QVCBUTyBBQ1FVSVJFIFRIRSBTRU1BUEhPUkUsIGlzZG9uZ2xlKCkgV0lMTAorCSAqICBIQVZFIEZBSUxFRC4gIEJBSUwgT1VULgorCSovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlyZXR1cm4gLUVSRVNUQVJUU1lTOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworcmMgPSBlYXN5Y2FwX2RxYnVmKHBlYXN5Y2FwLCAwKTsKIHBlYXN5Y2FwLT5wb2xsZWQgPSAxOwotCi1pZiAoMCA9PSBlYXN5Y2FwX2RxYnVmKHBlYXN5Y2FwLCAwKSkKK211dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKK2lmICgwID09IHJjKQogCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOwogZWxzZQogCXJldHVybiBQT0xMRVJSOwotCiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC04NDEsNyArMTE5NCw3IEBACiBpbnQKIGVhc3ljYXBfZHFidWYoc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwLCBpbnQgbW9kZSkKIHsKLWludCBtaXNzLCByYzsKK2ludCBpbnB1dCwgaWZpZWxkLCBtaXNzLCByYzsKIAogSk9UKDgsICJcbiIpOwogCkBAIC04NDksMTI5ICsxMjAyLDE4OCBAQAogCVNBWSgiRVJST1I6ICBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKIAlyZXR1cm4gLUVGQVVMVDsKIH0KK2lmIChOVUxMID09IHBlYXN5Y2FwLT5wdXNiX2RldmljZSkgeworCVNBWSgiRVJST1I6ICBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CitpZmllbGQgPSAwOworSk9NKDgsICIlaT1pZmllbGRcbiIsIGlmaWVsZCk7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgotICogIFdBSVQgRk9SIEZJRUxEIDAKKyAqICBDSEVDSyBGT1IgTE9TVCBJTlBVVCBTSUdOQUwuCisgKgorICogIEZPUiBUSEUgRk9VUi1DVkJTIEVhc3lDQVAsIFRISVMgRE9FUyBOT1QgV09SSyBBUyBFWFBFQ1RFRC4KKyAqICBJRiBJTlBVVCAwIElTIFBSRVNFTlQgQU5EIFNZTkMgQUNRVUlSRUQsIFVOUExVR0dJTkcgSU5QVVQgNCBET0VTIE5PVAorICogIFJFU1VMVCBJTiBTRVRUSU5HIEJJVCAweDQwIE9OIFJFR0lTVEVSIDB4MUYsIFBSRVNVTUFCTFkgQkVDQVVTRSBUSEVSRQorICogIElTIEZMWVdIRUVMSU5HIE9OIElOUFVUIDAuICBUSEUgVVBTSE9UIElTOgorICoKKyAqICAgIElOUFVUIDAgICBQTFVHR0VELCBJTlBVVCA0ICAgUExVR0dFRCA9PiBTQ1JFRU4gMCBPSywgICBTQ1JFRU4gNCBPSworICogICAgSU5QVVQgMCAgIFBMVUdHRUQsIElOUFVUIDQgVU5QTFVHR0VEID0+IFNDUkVFTiAwIE9LLCAgIFNDUkVFTiA0IEJMQUNLCisgKiAgICBJTlBVVCAwIFVOUExVR0dFRCwgSU5QVVQgNCAgIFBMVUdHRUQgPT4gU0NSRUVOIDAgQkFSUywgU0NSRUVOIDQgT0sKKyAqICAgIElOUFVUIDAgVU5QTFVHR0VELCBJTlBVVCA0IFVOUExVR0dFRCA9PiBTQ1JFRU4gMCBCQVJTLCBTQ1JFRU4gNCBCQVJTCisqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW5wdXQgPSBwZWFzeWNhcC0+aW5wdXQ7CitpZiAoMCA8PSBpbnB1dCAmJiBJTlBVVF9NQU5ZID4gaW5wdXQpIHsKKwlyYyA9IHJlYWRfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgMHgxRik7CisJaWYgKDAgPD0gcmMpIHsKKwkJaWYgKHJjICYgMHg0MCkKKwkJCXBlYXN5Y2FwLT5sb3N0W2lucHV0XSArPSAxOworCQllbHNlCisJCQlwZWFzeWNhcC0+bG9zdFtpbnB1dF0gLT0gMjsKKworCWlmICgwID4gcGVhc3ljYXAtPmxvc3RbaW5wdXRdKQorCQlwZWFzeWNhcC0+bG9zdFtpbnB1dF0gPSAwOworCWVsc2UgaWYgKCgyICogVklERU9fTE9TVF9UT0xFUkFURSkgPCBwZWFzeWNhcC0+bG9zdFtpbnB1dF0pCisJCXBlYXN5Y2FwLT5sb3N0W2lucHV0XSA9ICgyICogVklERU9fTE9TVF9UT0xFUkFURSk7CisJfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBXQUlUIEZPUiBGSUVMRCBpZmllbGQgICgwID0+IFRPUCwgMSA9PiBCT1RUT00pCiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIG1pc3MgPSAwOwotaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmKHBlYXN5Y2FwLT5tdXRleF9tbWFwX3ZpZGVvWzBdKSkpCi0JcmV0dXJuIC1FUkVTVEFSVFNZUzsKIHdoaWxlICgocGVhc3ljYXAtPmZpZWxkX3JlYWQgPT0gcGVhc3ljYXAtPmZpZWxkX2ZpbGwpIHx8IFwKIAkJCQkoMCAhPSAoMHhGRjAwICYgcGVhc3ljYXAtPmZpZWxkX2J1ZmZlclwKIAkJCQkJW3BlYXN5Y2FwLT5maWVsZF9yZWFkXVswXS5rb3VudCkpIHx8IFwKLQkJCQkoMCAhPSAoMHgwMEZGICYgcGVhc3ljYXAtPmZpZWxkX2J1ZmZlclwKKwkJCQkoaWZpZWxkICE9ICgweDAwRkYgJiBwZWFzeWNhcC0+ZmllbGRfYnVmZmVyXAogCQkJCQlbcGVhc3ljYXAtPmZpZWxkX3JlYWRdWzBdLmtvdW50KSkpIHsKLQltdXRleF91bmxvY2soJihwZWFzeWNhcC0+bXV0ZXhfbW1hcF92aWRlb1swXSkpOwotCiAJaWYgKG1vZGUpCiAJCXJldHVybiAtRUFHQUlOOwogCi0JSk9UKDgsICJmaXJzdCB3YWl0ICBvbiB3cV92aWRlbywgIiBcCisJSk9NKDgsICJmaXJzdCB3YWl0ICBvbiB3cV92aWRlbywgIiBcCiAJCQkJIiVpPWZpZWxkX3JlYWQgICVpPWZpZWxkX2ZpbGxcbiIsIFwKIAkJCQlwZWFzeWNhcC0+ZmllbGRfcmVhZCwgcGVhc3ljYXAtPmZpZWxkX2ZpbGwpOwogCi0JbXNsZWVwKDEpOwogCWlmICgwICE9ICh3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocGVhc3ljYXAtPndxX3ZpZGVvLCBcCiAJCQkocGVhc3ljYXAtPnZpZGVvX2lkbGUgfHwgcGVhc3ljYXAtPnZpZGVvX2VvZiAgfHwgXAogCQkJKChwZWFzeWNhcC0+ZmllbGRfcmVhZCAhPSBwZWFzeWNhcC0+ZmllbGRfZmlsbCkgJiYgXAogCQkJCSgwID09ICgweEZGMDAgJiBwZWFzeWNhcC0+ZmllbGRfYnVmZmVyXAogCQkJCQlbcGVhc3ljYXAtPmZpZWxkX3JlYWRdWzBdLmtvdW50KSkgJiYgXAotCQkJCSgwID09ICgweDAwRkYgJiBwZWFzeWNhcC0+ZmllbGRfYnVmZmVyXAotCQkJCQlbcGVhc3ljYXAtPmZpZWxkX3JlYWRdWzBdLmtvdW50KSkpKSkpKXsKLQkJU0FZKCJhYm9ydGVkIGJ5IHNpZ25hbFxuIik7CisJCQkJKGlmaWVsZCA9PSAoMHgwMEZGICYgcGVhc3ljYXAtPmZpZWxkX2J1ZmZlclwKKwkJCQkJW3BlYXN5Y2FwLT5maWVsZF9yZWFkXVswXS5rb3VudCkpKSkpKSkgeworCQlTQU0oImFib3J0ZWQgYnkgc2lnbmFsXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJCX0KIAlpZiAocGVhc3ljYXAtPnZpZGVvX2lkbGUpIHsKLQkJSk9UKDgsICIlaT1wZWFzeWNhcC0+dmlkZW9faWRsZVxuIiwgcGVhc3ljYXAtPnZpZGVvX2lkbGUpOwotCQlyZXR1cm4gLUVJTzsKKwkJSk9NKDgsICIlaT1wZWFzeWNhcC0+dmlkZW9faWRsZSAuLi4gcmV0dXJuaW5nIC1FQUdBSU5cbiIsIFwKKwkJCQkJCQlwZWFzeWNhcC0+dmlkZW9faWRsZSk7CisJCXJldHVybiAtRUFHQUlOOwogCX0KIAlpZiAocGVhc3ljYXAtPnZpZGVvX2VvZikgewotCQlKT1QoOCwgIiVpPXBlYXN5Y2FwLT52aWRlb19lb2ZcbiIsIHBlYXN5Y2FwLT52aWRlb19lb2YpOwotCQlkZWJyaWVmKHBlYXN5Y2FwKTsKKwkJSk9NKDgsICIlaT1wZWFzeWNhcC0+dmlkZW9fZW9mXG4iLCBwZWFzeWNhcC0+dmlkZW9fZW9mKTsKKwkJI2lmIGRlZmluZWQoUEVSU0VWRVJFKQorCQlpZiAoMSA9PSBwZWFzeWNhcC0+c3RhdHVzKSB7CisJCQlKT00oOCwgInBlcnNldmVyaW5nIC4uLlxuIik7CisJCQlwZWFzeWNhcC0+dmlkZW9fZW9mID0gMDsKKwkJCXBlYXN5Y2FwLT5hdWRpb19lb2YgPSAwOworCQkJaWYgKDAgIT0gcmVzZXQocGVhc3ljYXApKSB7CisJCQkJSk9NKDgsICIgLi4uIGZhaWxlZCAuLi4gcmV0dXJuaW5nIC1FSU9cbiIpOworCQkJCXBlYXN5Y2FwLT52aWRlb19lb2YgPSAxOworCQkJCXBlYXN5Y2FwLT5hdWRpb19lb2YgPSAxOworCQkJCWtpbGxfdmlkZW9fdXJicyhwZWFzeWNhcCk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCQlwZWFzeWNhcC0+c3RhdHVzID0gMDsKKwkJCUpPTSg4LCAiIC4uLiBPSyAuLi4gcmV0dXJuaW5nIC1FQUdBSU5cbiIpOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwkJI2VuZGlmIC8qUEVSU0VWRVJFKi8KKwkJcGVhc3ljYXAtPnZpZGVvX2VvZiA9IDE7CisJCXBlYXN5Y2FwLT5hdWRpb19lb2YgPSAxOwogCQlraWxsX3ZpZGVvX3VyYnMocGVhc3ljYXApOworCQlKT00oOCwgInJldHVybmluZyAtRUlPXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogbWlzcysrOwotaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmKHBlYXN5Y2FwLT5tdXRleF9tbWFwX3ZpZGVvWzBdKSkpCi0JcmV0dXJuIC1FUkVTVEFSVFNZUzsKIH0KLW11dGV4X3VubG9jaygmKHBlYXN5Y2FwLT5tdXRleF9tbWFwX3ZpZGVvWzBdKSk7Ci1KT1QoOCwgImZpcnN0IGF3YWtlbmluZyBvbiB3cV92aWRlbyBhZnRlciAlaSB3YWl0c1xuIiwgbWlzcyk7CitKT00oOCwgImZpcnN0IGF3YWtlbmluZyBvbiB3cV92aWRlbyBhZnRlciAlaSB3YWl0c1xuIiwgbWlzcyk7CiAKIHJjID0gZmllbGQyZnJhbWUocGVhc3ljYXApOwogaWYgKDAgIT0gcmMpCi0JU0FZKCJFUlJPUjogZmllbGQyZnJhbWUoKSByZXR1cm5lZCAlaVxuIiwgcmMpOwotCi1pZiAodHJ1ZSA9PSBwZWFzeWNhcC0+b2ZmZXJmaWVsZHMpIHsKLQlwZWFzeWNhcC0+ZnJhbWVfcmVhZCA9IHBlYXN5Y2FwLT5mcmFtZV9maWxsOwotCShwZWFzeWNhcC0+ZnJhbWVfZmlsbCkrKzsKLQlpZiAocGVhc3ljYXAtPmZyYW1lX2J1ZmZlcl9tYW55IDw9IHBlYXN5Y2FwLT5mcmFtZV9maWxsKQotCQlwZWFzeWNhcC0+ZnJhbWVfZmlsbCA9IDA7Ci0KLQlpZiAoMHgwMSAmIGVhc3ljYXBfc3RhbmRhcmRbcGVhc3ljYXAtPnN0YW5kYXJkX29mZnNldF0ubWFzaykgewotCQlwZWFzeWNhcC0+ZnJhbWVfYnVmZmVyW3BlYXN5Y2FwLT5mcmFtZV9yZWFkXVswXS5rb3VudCA9IFwKLQkJCQkJCQlWNEwyX0ZJRUxEX0JPVFRPTTsKLQl9IGVsc2UgewotCQlwZWFzeWNhcC0+ZnJhbWVfYnVmZmVyW3BlYXN5Y2FwLT5mcmFtZV9yZWFkXVswXS5rb3VudCA9IFwKLQkJCQkJCQlWNEwyX0ZJRUxEX1RPUDsKLQl9Ci1KT1QoOCwgInNldHRpbmc6ICAgICVpPXBlYXN5Y2FwLT5mcmFtZV9yZWFkXG4iLCBwZWFzeWNhcC0+ZnJhbWVfcmVhZCk7Ci1KT1QoOCwgImJ1bXBlZCB0bzogICVpPXBlYXN5Y2FwLT5mcmFtZV9maWxsXG4iLCBwZWFzeWNhcC0+ZnJhbWVfZmlsbCk7Ci19CisJU0FNKCJFUlJPUjogZmllbGQyZnJhbWUoKSByZXR1cm5lZCAlaVxuIiwgcmMpOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKLSAqICBXQUlUIEZPUiBGSUVMRCAxCisgKiAgV0FJVCBGT1IgVEhFIE9USEVSIEZJRUxECiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2lmIChpZmllbGQpCisJaWZpZWxkID0gMDsKK2Vsc2UKKwlpZmllbGQgPSAxOwogbWlzcyA9IDA7Ci1pZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCYocGVhc3ljYXAtPm11dGV4X21tYXBfdmlkZW9bMF0pKSkKLQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogd2hpbGUgKChwZWFzeWNhcC0+ZmllbGRfcmVhZCA9PSBwZWFzeWNhcC0+ZmllbGRfZmlsbCkgfHwgXAogCQkJCSgwICE9ICgweEZGMDAgJiBwZWFzeWNhcC0+ZmllbGRfYnVmZmVyXAogCQkJCQlbcGVhc3ljYXAtPmZpZWxkX3JlYWRdWzBdLmtvdW50KSkgfHwgXAotCQkJCSgwID09ICgweDAwRkYgJiBwZWFzeWNhcC0+ZmllbGRfYnVmZmVyXAorCQkJCShpZmllbGQgIT0gKDB4MDBGRiAmIHBlYXN5Y2FwLT5maWVsZF9idWZmZXJcCiAJCQkJCVtwZWFzeWNhcC0+ZmllbGRfcmVhZF1bMF0ua291bnQpKSkgewotCW11dGV4X3VubG9jaygmKHBlYXN5Y2FwLT5tdXRleF9tbWFwX3ZpZGVvWzBdKSk7Ci0KIAlpZiAobW9kZSkKIAkJcmV0dXJuIC1FQUdBSU47CiAKLQlKT1QoOCwgInNlY29uZCB3YWl0IG9uIHdxX3ZpZGVvLCAiIFwKKwlKT00oOCwgInNlY29uZCB3YWl0IG9uIHdxX3ZpZGVvLCAiIFwKIAkJCQkiJWk9ZmllbGRfcmVhZCAgJWk9ZmllbGRfZmlsbFxuIiwgXAogCQkJCXBlYXN5Y2FwLT5maWVsZF9yZWFkLCBwZWFzeWNhcC0+ZmllbGRfZmlsbCk7Ci0JbXNsZWVwKDEpOwogCWlmICgwICE9ICh3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocGVhc3ljYXAtPndxX3ZpZGVvLCBcCiAJCQkocGVhc3ljYXAtPnZpZGVvX2lkbGUgfHwgcGVhc3ljYXAtPnZpZGVvX2VvZiAgfHwgXAogCQkJKChwZWFzeWNhcC0+ZmllbGRfcmVhZCAhPSBwZWFzeWNhcC0+ZmllbGRfZmlsbCkgJiYgXAogCQkJCSgwID09ICgweEZGMDAgJiBwZWFzeWNhcC0+ZmllbGRfYnVmZmVyXAogCQkJCQlbcGVhc3ljYXAtPmZpZWxkX3JlYWRdWzBdLmtvdW50KSkgJiYgXAotCQkJCSgwICE9ICgweDAwRkYgJiBwZWFzeWNhcC0+ZmllbGRfYnVmZmVyXAotCQkJCQlbcGVhc3ljYXAtPmZpZWxkX3JlYWRdWzBdLmtvdW50KSkpKSkpKXsKLQkJU0FZKCJhYm9ydGVkIGJ5IHNpZ25hbFxuIik7CisJCQkJKGlmaWVsZCA9PSAoMHgwMEZGICYgcGVhc3ljYXAtPmZpZWxkX2J1ZmZlclwKKwkJCQkJW3BlYXN5Y2FwLT5maWVsZF9yZWFkXVswXS5cCisJCQkJCQkJCWtvdW50KSkpKSkpKSB7CisJCVNBTSgiYWJvcnRlZCBieSBzaWduYWxcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAJaWYgKHBlYXN5Y2FwLT52aWRlb19pZGxlKSB7Ci0JCUpPVCg4LCAiJWk9cGVhc3ljYXAtPnZpZGVvX2lkbGVcbiIsIHBlYXN5Y2FwLT52aWRlb19pZGxlKTsKLQkJcmV0dXJuIC1FSU87CisJCUpPTSg4LCAiJWk9cGVhc3ljYXAtPnZpZGVvX2lkbGUgLi4uIHJldHVybmluZyAtRUFHQUlOXG4iLCBcCisJCQkJCQkJcGVhc3ljYXAtPnZpZGVvX2lkbGUpOworCQlyZXR1cm4gLUVBR0FJTjsKIAl9CiAJaWYgKHBlYXN5Y2FwLT52aWRlb19lb2YpIHsKLQkJSk9UKDgsICIlaT1wZWFzeWNhcC0+dmlkZW9fZW9mXG4iLCBwZWFzeWNhcC0+dmlkZW9fZW9mKTsKLQkJZGVicmllZihwZWFzeWNhcCk7CisJCUpPTSg4LCAiJWk9cGVhc3ljYXAtPnZpZGVvX2VvZlxuIiwgcGVhc3ljYXAtPnZpZGVvX2VvZik7CisJCSNpZiBkZWZpbmVkKFBFUlNFVkVSRSkKKwkJaWYgKDEgPT0gcGVhc3ljYXAtPnN0YXR1cykgeworCQkJSk9NKDgsICJwZXJzZXZlcmluZyAuLi5cbiIpOworCQkJcGVhc3ljYXAtPnZpZGVvX2VvZiA9IDA7CisJCQlwZWFzeWNhcC0+YXVkaW9fZW9mID0gMDsKKwkJCWlmICgwICE9IHJlc2V0KHBlYXN5Y2FwKSkgeworCQkJCUpPTSg4LCAiIC4uLiBmYWlsZWQgLi4uIHJldHVybmluZyAtRUlPXG4iKTsKKwkJCQlwZWFzeWNhcC0+dmlkZW9fZW9mID0gMTsKKwkJCQlwZWFzeWNhcC0+YXVkaW9fZW9mID0gMTsKKwkJCQlraWxsX3ZpZGVvX3VyYnMocGVhc3ljYXApOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQkJcGVhc3ljYXAtPnN0YXR1cyA9IDA7CisJCQlKT00oOCwgIiAuLi4gT0sgLi4uIHJldHVybmluZyAtRUFHQUlOXG4iKTsKKwkJCXJldHVybiAtRUFHQUlOOworCQl9CisJCSNlbmRpZiAvKlBFUlNFVkVSRSovCisJCXBlYXN5Y2FwLT52aWRlb19lb2YgPSAxOworCQlwZWFzeWNhcC0+YXVkaW9fZW9mID0gMTsKIAkJa2lsbF92aWRlb191cmJzKHBlYXN5Y2FwKTsKKwkJSk9NKDgsICJyZXR1cm5pbmcgLUVJT1xuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIG1pc3MrKzsKLWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJihwZWFzeWNhcC0+bXV0ZXhfbW1hcF92aWRlb1swXSkpKQotCXJldHVybiAtRVJFU1RBUlRTWVM7CiB9Ci1tdXRleF91bmxvY2soJihwZWFzeWNhcC0+bXV0ZXhfbW1hcF92aWRlb1swXSkpOwotSk9UKDgsICJzZWNvbmQgYXdha2VuaW5nIG9uIHdxX3ZpZGVvIGFmdGVyICVpIHdhaXRzXG4iLCBtaXNzKTsKK0pPTSg4LCAic2Vjb25kIGF3YWtlbmluZyBvbiB3cV92aWRlbyBhZnRlciAlaSB3YWl0c1xuIiwgbWlzcyk7CiAKIHJjID0gZmllbGQyZnJhbWUocGVhc3ljYXApOwogaWYgKDAgIT0gcmMpCi0JU0FZKCJFUlJPUjogZmllbGQyZnJhbWUoKSByZXR1cm5lZCAlaVxuIiwgcmMpOwotCisJU0FNKCJFUlJPUjogZmllbGQyZnJhbWUoKSByZXR1cm5lZCAlaVxuIiwgcmMpOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBXQVNURSBUSElTIEZSQU1FCisqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaWYgKDAgIT0gcGVhc3ljYXAtPnNraXApIHsKKwlwZWFzeWNhcC0+c2tpcHBlZCsrOworCWlmIChwZWFzeWNhcC0+c2tpcCAhPSBwZWFzeWNhcC0+c2tpcHBlZCkKKwkJcmV0dXJuIHBlYXN5Y2FwLT5za2lwIC0gcGVhc3ljYXAtPnNraXBwZWQ7CisJcGVhc3ljYXAtPnNraXBwZWQgPSAwOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogcGVhc3ljYXAtPmZyYW1lX3JlYWQgPSBwZWFzeWNhcC0+ZnJhbWVfZmlsbDsKIHBlYXN5Y2FwLT5xdWV1ZWRbcGVhc3ljYXAtPmZyYW1lX3JlYWRdID0gMDsKIHBlYXN5Y2FwLT5kb25lW3BlYXN5Y2FwLT5mcmFtZV9yZWFkXSAgID0gVjRMMl9CVUZfRkxBR19ET05FOwpAQCAtOTg4LDggKzE0MDAsOCBAQAogCQkJCQkJCVY0TDJfRklFTERfQk9UVE9NOwogfQogCi1KT1QoOCwgInNldHRpbmc6ICAgICVpPXBlYXN5Y2FwLT5mcmFtZV9yZWFkXG4iLCBwZWFzeWNhcC0+ZnJhbWVfcmVhZCk7Ci1KT1QoOCwgImJ1bXBlZCB0bzogICVpPXBlYXN5Y2FwLT5mcmFtZV9maWxsXG4iLCBwZWFzeWNhcC0+ZnJhbWVfZmlsbCk7CitKT00oOCwgInNldHRpbmc6ICAgICVpPXBlYXN5Y2FwLT5mcmFtZV9yZWFkXG4iLCBwZWFzeWNhcC0+ZnJhbWVfcmVhZCk7CitKT00oOCwgImJ1bXBlZCB0bzogICVpPXBlYXN5Y2FwLT5mcmFtZV9maWxsXG4iLCBwZWFzeWNhcC0+ZnJhbWVfZmlsbCk7CiAKIHJldHVybiAwOwogfQpAQCAtMTAwMywxNCArMTQxNSwxMiBAQAogICogIG9kZD09ZmFsc2UgSVMgVFJBTlNGRVJSRUQgVE8gVEhFIEZSQU1FIEJVRkZFUi4KICAqCiAgKiAgVEhFIEJPT0xFQU4gUEFSQU1FVEVSIG9mZmVyZmllbGRzIElTIHRydWUgT05MWSBXSEVOIFRIRSBVU0VSIFBST0dSQU0KLSAqICBDSE9PU0VTIFRIRSBPUFRJT04gVjRMMl9GSUVMRF9BTFRFUk5BVEUuICBOTyBVU0VSU1BBQ0UgUFJPR1JBTSBURVNURUQKLSAqICBUTyBEQVRFIEhBUyBET05FIFRISVMuICBCVUdTIEFSRSBMSUtFTFkuCisgKiAgQ0hPT1NFUyBUSEUgT1BUSU9OIFY0TDJfRklFTERfSU5URVJMQUNFRC4KICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogaW50CiBmaWVsZDJmcmFtZShzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXApCiB7Ci1zdGF0aWMgc3RydWN0IHRpbWV2YWwgdGltZXZhbDA7CiBzdHJ1Y3QgdGltZXZhbCB0aW1ldmFsOwogbG9uZyBsb25nIGludCBhYm92ZSwgYmVsb3c7CiBfX3UzMiByZW1haW5kZXI7CkBAIC0xMDE5LDE2ICsxNDI5LDI2IEBACiB2b2lkICpwZXgsICpwYWQ7CiBpbnQga2V4LCBrYWQsIG1leCwgbWFkLCByZXgsIHJhZCwgcmFkMjsKIGludCBjMiwgYzMsIHcyLCB3MywgY3osIHd6OwotaW50IHJjLCBieXRlc3BlcnBpeGVsLCBtdWx0aXBsaWVyLCBtdWNoLCBtb3JlLCBvdmVyLCBydW1wLCBjYWNoZXM7CitpbnQgcmMsIGJ5dGVzcGVycGl4ZWwsIG11bHRpcGxpZXIsIG11Y2gsIG1vcmUsIG92ZXIsIHJ1bXAsIGNhY2hlcywgaW5wdXQ7CiBfX3U4IG1hc2ssIG1hcmdpbjsKLWJvb2wgb2RkLCBpc3V5LCBkZWNpbWF0ZXBpeGVsLCBvZmZlcmZpZWxkczsKK2Jvb2wgb2RkLCBpc3V5LCBkZWNpbWF0ZXBpeGVsLCBvZmZlcmZpZWxkcywgYmFkaW5wdXQ7CiAKLUpPVCg4LCAiPT09PT0gIHBhcml0eSAlaSwgZmllbGQgYnVmZmVyICVpIC0tPiBmcmFtZSBidWZmZXIgJWlcbiIsIFwKK2lmIChOVUxMID09IHBlYXN5Y2FwKSB7CisJU0FZKCJFUlJPUjogcGVhc3ljYXAgaXMgTlVMTFxuIik7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CisKK2JhZGlucHV0ID0gZmFsc2U7CitpbnB1dCA9IDB4MDcgJiBwZWFzeWNhcC0+ZmllbGRfYnVmZmVyW3BlYXN5Y2FwLT5maWVsZF9yZWFkXVswXS5pbnB1dDsKKworSk9NKDgsICI9PT09PSAgcGFyaXR5ICVpLCBpbnB1dCAweCUwMlgsIGZpZWxkIGJ1ZmZlciAlaSAtLT4gIiBcCisJCQkJCQkiZnJhbWUgYnVmZmVyICVpXG4iLCBcCiAJCQlwZWFzeWNhcC0+ZmllbGRfYnVmZmVyW3BlYXN5Y2FwLT5maWVsZF9yZWFkXVswXS5rb3VudCxcCisJCQlwZWFzeWNhcC0+ZmllbGRfYnVmZmVyW3BlYXN5Y2FwLT5maWVsZF9yZWFkXVswXS5pbnB1dCxcCiAJCQlwZWFzeWNhcC0+ZmllbGRfcmVhZCwgcGVhc3ljYXAtPmZyYW1lX2ZpbGwpOwotSk9UKDgsICI9PT09PSAgJWk9Ynl0ZXNwZXJwaXhlbFxuIiwgcGVhc3ljYXAtPmJ5dGVzcGVycGl4ZWwpOworSk9NKDgsICI9PT09PSAgJWk9Ynl0ZXNwZXJwaXhlbFxuIiwgcGVhc3ljYXAtPmJ5dGVzcGVycGl4ZWwpOwogaWYgKHRydWUgPT0gcGVhc3ljYXAtPm9mZmVyZmllbGRzKQotCUpPVCg4LCAiPT09PT0gb2ZmZXJmaWVsZHNcbiIpOworCUpPTSg4LCAiPT09PT0gb2ZmZXJmaWVsZHNcbiIpOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgpAQCAtMTAzNiwxNSArMTQ1NiwxNyBAQAogICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBpZiAocGVhc3ljYXAtPmZpZWxkX3JlYWQgPT0gcGVhc3ljYXAtPmZpZWxkX2ZpbGwpIHsKLQlTQVkoIkVSUk9SOiBvbiBlbnRyeSwgc3RpbGwgZmlsbGluZyBmaWVsZCBidWZmZXIgJWlcbiIsIFwKKwlTQU0oIkVSUk9SOiBvbiBlbnRyeSwgc3RpbGwgZmlsbGluZyBmaWVsZCBidWZmZXIgJWlcbiIsIFwKIAkJCQkJCQlwZWFzeWNhcC0+ZmllbGRfcmVhZCk7CiAJcmV0dXJuIDA7CiB9CiAjaWYgZGVmaW5lZChFQVNZQ0FQX1RFU1RDQVJEKQogZWFzeWNhcF90ZXN0Y2FyZChwZWFzeWNhcCwgcGVhc3ljYXAtPmZpZWxkX3JlYWQpOwogI2Vsc2UKLWlmICgwICE9ICgweDA0MDAgJiBwZWFzeWNhcC0+ZmllbGRfYnVmZmVyW3BlYXN5Y2FwLT5maWVsZF9yZWFkXVswXS5rb3VudCkpCi0JZWFzeWNhcF90ZXN0Y2FyZChwZWFzeWNhcCwgcGVhc3ljYXAtPmZpZWxkX3JlYWQpOworaWYgKDAgPD0gaW5wdXQgJiYgSU5QVVRfTUFOWSA+IGlucHV0KSB7CisJaWYgKGVhc3ljYXBfYmFycyAmJiBWSURFT19MT1NUX1RPTEVSQVRFIDw9IHBlYXN5Y2FwLT5sb3N0W2lucHV0XSkKKwkJZWFzeWNhcF90ZXN0Y2FyZChwZWFzeWNhcCwgcGVhc3ljYXAtPmZpZWxkX3JlYWQpOworfQogI2VuZGlmIC8qRUFTWUNBUF9URVNUQ0FSRCovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKQEAgLTEwNTUsNyArMTQ3Nyw3IEBACiBpZiAoKDIgIT0gYnl0ZXNwZXJwaXhlbCkgJiYgXAogCQkJKDMgIT0gYnl0ZXNwZXJwaXhlbCkgJiYgXAogCQkJKDQgIT0gYnl0ZXNwZXJwaXhlbCkpIHsKLQlTQVkoIk1JU1RBS0U6ICVpPWJ5dGVzcGVycGl4ZWxcbiIsIGJ5dGVzcGVycGl4ZWwpOworCVNBTSgiTUlTVEFLRTogJWk9Ynl0ZXNwZXJwaXhlbFxuIiwgYnl0ZXNwZXJwaXhlbCk7CiAJcmV0dXJuIC1FRkFVTFQ7CiB9CiBpZiAodHJ1ZSA9PSBkZWNpbWF0ZXBpeGVsKQpAQCAtMTA4Miw4ICsxNTA0LDggQEAKIGVsc2UKIAlvZGQgPSBmYWxzZTsKIAotaWYgKCh0cnVlID09IG9kZCkgJiYgKGZhbHNlID09IG9mZmVyZmllbGRzKSAmJihmYWxzZSA9PSBkZWNpbWF0ZXBpeGVsKSkgewotCUpPVCg4LCAiICBpbml0aWFsIHNraXBwaW5nICAgICU0aSAgICAgICAgICBieXRlcyBwLiU0aVxuIiwgXAoraWYgKCh0cnVlID09IG9kZCkgJiYgKGZhbHNlID09IGRlY2ltYXRlcGl4ZWwpKSB7CisJSk9NKDgsICIgIGluaXRpYWwgc2tpcHBpbmcgICAgJTRpICAgICAgICAgIGJ5dGVzIHAuJTRpXG4iLCBcCiAJCQkJCQkJdzMvbXVsdGlwbGllciwgbWFkKTsKIAlwYWQgKz0gKHczIC8gbXVsdGlwbGllcik7ICByYWQgLT0gKHczIC8gbXVsdGlwbGllcik7CiB9CkBAIC0xMTA4LDcgKzE1MzAsNyBAQAogCQkJcnVtcCA9IDA7CiAKIAkJCWlmIChtdWNoICUgMikgewotCQkJCVNBWSgiTUlTVEFLRTogbXVjaCBpcyBvZGRcbiIpOworCQkJCVNBTSgiTUlTVEFLRTogbXVjaCBpcyBvZGRcbiIpOwogCQkJCXJldHVybiAtRUZBVUxUOwogCQkJfQogCkBAIC0xMTE2LDEzICsxNTM4LDExIEBACiAJCQkJCW11Y2gpIC8gMjsKIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIAkJCWlmICgxIDwgYnl0ZXNwZXJwaXhlbCkgewotCQkJCWlmICgocmFkICogXAotCQkJCQkyKSA8IChtdWNoICogXAotCQkJCQkJYnl0ZXNwZXJwaXhlbCkpIHsKKwkJCQlpZiAocmFkICogMiA8IG11Y2ggKiBieXRlc3BlcnBpeGVsKSB7CiAJCQkJCS8qCiAJCQkJCSoqICAgSU5KVURJQ0lPVVMgQUxURVJBVElPTiBPRiBUSElTCi0JCQkJCSoqICAgQkxPQ0sgV0lMTCBDQVVTRSBCUkVBS0FHRS4KLQkJCQkJKiogICBCRVdBUkUuCisJCQkJCSoqICAgU1RBVEVNRU5UIEJMT0NLIFdJTEwgQ0FVU0UKKwkJCQkJKiogICBCUkVBS0FHRS4gIEJFV0FSRS4KIAkJCQkJKiovCiAJCQkJCXJhZDIgPSByYWQgKyBieXRlc3BlcnBpeGVsIC0gMTsKIAkJCQkJbXVjaCA9ICgoKCgyICogXApAQCAtMTE0NSwxOCArMTU2NSwyNSBAQAogCQkJCX0KIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIAkJCX0gZWxzZSB7Ci0JCQkJU0FZKCJNSVNUQUtFOiAlaT1ieXRlc3BlcnBpeGVsXG4iLCBcCisJCQkJU0FNKCJNSVNUQUtFOiAlaT1ieXRlc3BlcnBpeGVsXG4iLCBcCiAJCQkJCQlieXRlc3BlcnBpeGVsKTsKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCX0KIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIAkJCWlmIChydW1wKQogCQkJCWNhY2hlcysrOwotCisJCQkJaWYgKHRydWUgPT0gYmFkaW5wdXQpIHsKKwkJCQkJSk9NKDgsICJFUlJPUjogMHglMDJYPS0+ZmllbGRfYnVmZmVyIiBcCisJCQkJCQkiWyVpXVslaV0uaW5wdXQsICIgXAorCQkJCQkJIjB4JTAyWD0oMHgwOHwtPmlucHV0KVxuIiwgXAorCQkJCQkJcGVhc3ljYXAtPmZpZWxkX2J1ZmZlclwKKwkJCQkJCVtrZXhdW21leF0uaW5wdXQsIGtleCwgbWV4LCBcCisJCQkJCQkoMHgwOHxwZWFzeWNhcC0+aW5wdXQpKTsKKwkJCQl9CiAJCQlyYyA9IHJlZGF1YihwZWFzeWNhcCwgcGFkLCBwZXgsIG11Y2gsIG1vcmUsIFwKIAkJCQkJCQltYXNrLCBtYXJnaW4sIGlzdXkpOwogCQkJaWYgKDAgPiByYykgewotCQkJCVNBWSgiRVJST1I6IHJlZGF1YigpIGZhaWxlZFxuIik7CisJCQkJU0FNKCJFUlJPUjogcmVkYXViKCkgZmFpbGVkXG4iKTsKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCX0KIAkJCWlmIChtdWNoICUgNCkgewpAQCAtMTE3MSw2ICsxNTk4LDkgQEAKIAkJCQltZXgrKzsKIAkJCQlwZXggPSBwZWFzeWNhcC0+ZmllbGRfYnVmZmVyW2tleF1bbWV4XS5wZ287CiAJCQkJcmV4ID0gUEFHRV9TSVpFOworCQkJCWlmIChwZWFzeWNhcC0+ZmllbGRfYnVmZmVyW2tleF1bbWV4XS5pbnB1dCAhPSBcCisJCQkJCQkoMHgwOHxwZWFzeWNhcC0+aW5wdXQpKQorCQkJCQliYWRpbnB1dCA9IHRydWU7CiAJCQl9CiAJCQlwYWQgICs9IG1vcmU7CiAJCQlyYWQgLT0gbW9yZTsKQEAgLTExOTAsNyArMTYyMCw3IEBACiAgKiAgVU5MRVNTIElUIElTIFRIRSBMQVNUIExJTkUgT0YgQU4gT0REIEZSQU1FCiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQkJaWYgKCgoZmFsc2UgPT0gb2RkKSB8fCAoY3ogIT0gd3opKSYmKGZhbHNlID09IG9mZmVyZmllbGRzKSkgeworCQlpZiAoKGZhbHNlID09IG9kZCkgfHwgKGN6ICE9IHd6KSkgewogCQkJb3ZlciA9IHczOwogCQkJZG8gewogCQkJCWlmICghcmFkKSB7CkBAIC0xMjI0LDcgKzE2NTQsNyBAQAogCQkJcnVtcCA9IDA7CiAKIAkJCWlmIChtdWNoICUgMikgewotCQkJCVNBWSgiTUlTVEFLRTogbXVjaCBpcyBvZGRcbiIpOworCQkJCVNBTSgiTUlTVEFLRTogbXVjaCBpcyBvZGRcbiIpOwogCQkJCXJldHVybiAtRUZBVUxUOwogCQkJfQogCkBAIC0xMjMyLDEyICsxNjYyLDExIEBACiAJCQkJCW11Y2gpIC8gNDsKIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIAkJCWlmICgxIDwgYnl0ZXNwZXJwaXhlbCkgewotCQkJCWlmICgocmFkICogNCkgPCAobXVjaCAqIFwKLQkJCQkJCWJ5dGVzcGVycGl4ZWwpKSB7CisJCQkJaWYgKHJhZCAqIDQgPCBtdWNoICogYnl0ZXNwZXJwaXhlbCkgewogCQkJCQkvKgogCQkJCQkqKiAgIElOSlVESUNJT1VTIEFMVEVSQVRJT04gT0YgVEhJUwotCQkJCQkqKiAgIEJMT0NLIFdJTEwgQ0FVU0UgQlJFQUtBR0UuCi0JCQkJCSoqICAgQkVXQVJFLgorCQkJCQkqKiAgIFNUQVRFTUVOVCBCTE9DSyBXSUxMIENBVVNFCisJCQkJCSoqICAgQlJFQUtBR0UuICBCRVdBUkUuCiAJCQkJCSoqLwogCQkJCQlyYWQyID0gcmFkICsgYnl0ZXNwZXJwaXhlbCAtIDE7CiAJCQkJCW11Y2ggPSAoKCgoMiAqIHJhZDIpL2J5dGVzcGVycGl4ZWwpLzIpXApAQCAtMTI2MSw3ICsxNjkwLDcgQEAKIAkJCQkJfQogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogCQkJCX0gZWxzZSB7Ci0JCQkJCVNBWSgiTUlTVEFLRTogJWk9Ynl0ZXNwZXJwaXhlbFxuIiwgXAorCQkJCQlTQU0oIk1JU1RBS0U6ICVpPWJ5dGVzcGVycGl4ZWxcbiIsIFwKIAkJCQkJCWJ5dGVzcGVycGl4ZWwpOwogCQkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCQl9CkBAIC0xMjY5LDEwICsxNjk4LDE4IEBACiAJCQlpZiAocnVtcCkKIAkJCQljYWNoZXMrKzsKIAorCQkJCWlmICh0cnVlID09IGJhZGlucHV0KSB7CisJCQkJCUpPTSg4LCAiRVJST1I6IDB4JTAyWD0tPmZpZWxkX2J1ZmZlciIgXAorCQkJCQkJIlslaV1bJWldLmlucHV0LCAiIFwKKwkJCQkJCSIweCUwMlg9KDB4MDh8LT5pbnB1dClcbiIsIFwKKwkJCQkJCXBlYXN5Y2FwLT5maWVsZF9idWZmZXJcCisJCQkJCQlba2V4XVttZXhdLmlucHV0LCBrZXgsIG1leCwgXAorCQkJCQkJKDB4MDh8cGVhc3ljYXAtPmlucHV0KSk7CisJCQkJfQogCQkJcmMgPSByZWRhdWIocGVhc3ljYXAsIHBhZCwgcGV4LCBtdWNoLCBtb3JlLCBcCiAJCQkJCQkJbWFzaywgbWFyZ2luLCBpc3V5KTsKIAkJCWlmICgwID4gcmMpIHsKLQkJCQlTQVkoIkVSUk9SOiByZWRhdWIoKSBmYWlsZWRcbiIpOworCQkJCVNBTSgiRVJST1I6IHJlZGF1YigpIGZhaWxlZFxuIik7CiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQl9CiAJCQlvdmVyIC09IG11Y2g7ICAgY3ogKz0gbXVjaDsKQEAgLTEyODEsNiArMTcxOCw5IEBACiAJCQkJbWV4Kys7CiAJCQkJcGV4ID0gcGVhc3ljYXAtPmZpZWxkX2J1ZmZlcltrZXhdW21leF0ucGdvOwogCQkJCXJleCA9IFBBR0VfU0laRTsKKwkJCQlpZiAocGVhc3ljYXAtPmZpZWxkX2J1ZmZlcltrZXhdW21leF0uaW5wdXQgIT0gXAorCQkJCQkJKDB4MDh8cGVhc3ljYXAtPmlucHV0KSkKKwkJCQkJYmFkaW5wdXQgPSB0cnVlOwogCQkJfQogCQkJcGFkICArPSBtb3JlOwogCQkJcmFkIC09IG1vcmU7CkBAIC0xMzA3LDYgKzE3NDcsMTYgQEAKIAkJCQltZXgrKzsKIAkJCQlwZXggPSBwZWFzeWNhcC0+ZmllbGRfYnVmZmVyW2tleF1bbWV4XS5wZ287CiAJCQkJcmV4ID0gUEFHRV9TSVpFOworCQkJCWlmIChwZWFzeWNhcC0+ZmllbGRfYnVmZmVyW2tleF1bbWV4XS5pbnB1dCAhPSBcCisJCQkJCQkoMHgwOHxwZWFzeWNhcC0+aW5wdXQpKSB7CisJCQkJCUpPTSg4LCAiRVJST1I6IDB4JTAyWD0tPmZpZWxkX2J1ZmZlciJcCisJCQkJCQkiWyVpXVslaV0uaW5wdXQsICIgXAorCQkJCQkJIjB4JTAyWD0oMHgwOHwtPmlucHV0KVxuIiwgXAorCQkJCQkJcGVhc3ljYXAtPmZpZWxkX2J1ZmZlclwKKwkJCQkJCVtrZXhdW21leF0uaW5wdXQsIGtleCwgbWV4LCBcCisJCQkJCQkoMHgwOHxwZWFzeWNhcC0+aW5wdXQpKTsKKwkJCQkJYmFkaW5wdXQgPSB0cnVlOworCQkJCX0KIAkJCX0KIAkJCW11Y2ggPSBvdmVyOwogCQkJaWYgKHJleCA8IG11Y2gpCkBAIC0xMzI1LDM5ICsxNzc1LDM5IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBjMiA9IChtZXggKyAxKSpQQUdFX1NJWkUgLSByZXg7CiBpZiAoY3ogIT0gYzIpCi0JU0FZKCJFUlJPUjogZGlzY3JlcGFuY3kgJWkgaW4gYnl0ZXMgcmVhZFxuIiwgYzIgLSBjeik7CisJU0FNKCJFUlJPUjogZGlzY3JlcGFuY3kgJWkgaW4gYnl0ZXMgcmVhZFxuIiwgYzIgLSBjeik7CiBjMyA9IChtYWQgKyAxKSpQQUdFX1NJWkUgLSByYWQ7CiAKIGlmIChmYWxzZSA9PSBkZWNpbWF0ZXBpeGVsKSB7CiAJaWYgKGJ5dGVzcGVycGl4ZWwgKiBcCiAJCWN6ICE9IGMzKSBcCi0JCVNBWSgiRVJST1I6IGRpc2NyZXBhbmN5ICVpIGluIGJ5dGVzIHdyaXR0ZW5cbiIsIFwKKwkJU0FNKCJFUlJPUjogZGlzY3JlcGFuY3kgJWkgaW4gYnl0ZXMgd3JpdHRlblxuIiwgXAogCQkJCQkJYzMgLSAoYnl0ZXNwZXJwaXhlbCAqIFwKIAkJCQkJCQkJCWN6KSk7CiB9IGVsc2UgewogCWlmIChmYWxzZSA9PSBvZGQpIHsKIAkJaWYgKGJ5dGVzcGVycGl4ZWwgKiBcCiAJCQljeiAhPSAoNCAqIGMzKSkKLQkJCVNBWSgiRVJST1I6IGRpc2NyZXBhbmN5ICVpIGluIGJ5dGVzIHdyaXR0ZW5cbiIsIFwKKwkJCVNBTSgiRVJST1I6IGRpc2NyZXBhbmN5ICVpIGluIGJ5dGVzIHdyaXR0ZW5cbiIsIFwKIAkJCQkJCSgyKmMzKS0oYnl0ZXNwZXJwaXhlbCAqIFwKIAkJCQkJCQkJCWN6KSk7CiAJCX0gZWxzZSB7CiAJCQlpZiAoMCAhPSBjMykKLQkJCQlTQVkoIkVSUk9SOiBkaXNjcmVwYW5jeSAlaSAiIFwKKwkJCQlTQU0oIkVSUk9SOiBkaXNjcmVwYW5jeSAlaSAiIFwKIAkJCQkJCSJpbiBieXRlcyB3cml0dGVuXG4iLCBjMyk7CiAJCX0KIH0KIGlmIChydW1wKQotCVNBWSgiRVJST1I6IHVuZGlzY2hhcmdlZCBjYWNoZSBhdCBlbmQgb2YgbGluZSBpbiBmcmFtZSBidWZmZXJcbiIpOworCVNBTSgiV09SUlk6IHVuZGlzY2hhcmdlZCBjYWNoZSBhdCBlbmQgb2YgbGluZSBpbiBmcmFtZSBidWZmZXJcbiIpOwogCi1KT1QoOCwgIj09PT09IGZpZWxkMmZyYW1lKCk6ICVpIGJ5dGVzIC0tPiAlaSBieXRlcyAoaW5jbCBza2lwKVxuIiwgYzIsIGMzKTsKLUpPVCg4LCAiPT09PT0gZmllbGQyZnJhbWUoKTogJWk9bWFkICAlaT1yYWRcbiIsIG1hZCwgcmFkKTsKK0pPTSg4LCAiPT09PT0gZmllbGQyZnJhbWUoKTogJWkgYnl0ZXMgLS0+ICVpIGJ5dGVzIChpbmNsIHNraXApXG4iLCBjMiwgYzMpOworSk9NKDgsICI9PT09PSBmaWVsZDJmcmFtZSgpOiAlaT1tYWQgICVpPXJhZFxuIiwgbWFkLCByYWQpOwogCiBpZiAodHJ1ZSA9PSBvZGQpCi0JSk9UKDgsICIrKysrKyBmaWVsZDJmcmFtZSgpOiAgZnJhbWUgYnVmZmVyICVpIGlzIGZ1bGxcbiIsIGthZCk7CisJSk9NKDgsICIrKysrKyBmaWVsZDJmcmFtZSgpOiAgZnJhbWUgYnVmZmVyICVpIGlzIGZ1bGxcbiIsIGthZCk7CiAKIGlmIChwZWFzeWNhcC0+ZmllbGRfcmVhZCA9PSBwZWFzeWNhcC0+ZmllbGRfZmlsbCkKLQlTQVkoIldBUk5JTkc6IG9uIGV4aXQsIGZpbGxpbmcgZmllbGQgYnVmZmVyICVpXG4iLCBcCisJU0FNKCJXQVJOSU5HOiBvbiBleGl0LCBmaWxsaW5nIGZpZWxkIGJ1ZmZlciAlaVxuIiwgXAogCQkJCQkJCXBlYXN5Y2FwLT5maWVsZF9yZWFkKTsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qCkBAIC0xMzY1LDIzICsxODE1LDI0IEBACiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIGRvX2dldHRpbWVvZmRheSgmdGltZXZhbCk7Ci1pZiAodGltZXZhbDAudHZfc2VjKSB7CitpZiAocGVhc3ljYXAtPnRpbWV2YWw2LnR2X3NlYykgewogCWJlbG93ID0gKChsb25nIGxvbmcgaW50KSgxMDAwMDAwKSkgKiBcCi0JCSgobG9uZyBsb25nIGludCkodGltZXZhbC50dl9zZWMgIC0gdGltZXZhbDAudHZfc2VjKSkgKyBcCi0JCQkgKGxvbmcgbG9uZyBpbnQpKHRpbWV2YWwudHZfdXNlYyAtIHRpbWV2YWwwLnR2X3VzZWMpOworCQkoKGxvbmcgbG9uZyBpbnQpKHRpbWV2YWwudHZfc2VjIC0gXAorCQkJCQlwZWFzeWNhcC0+dGltZXZhbDYudHZfc2VjKSkgKyBcCisJCSAobG9uZyBsb25nIGludCkodGltZXZhbC50dl91c2VjIC0gcGVhc3ljYXAtPnRpbWV2YWw2LnR2X3VzZWMpOwogCWFib3ZlID0gKGxvbmcgbG9uZyBpbnQpMTAwMDAwMDsKIAogCXNkciA9IHNpZ25lZF9kaXYoYWJvdmUsIGJlbG93KTsKIAlhYm92ZSA9IHNkci5xdW90aWVudDsKIAlyZW1haW5kZXIgPSAoX191MzIpc2RyLnJlbWFpbmRlcjsKIAotCUpPVCg4LCAidmlkZW8gc3RyZWFtaW5nIGF0ICUzbGxpLiUwM2kgZmllbGRzIHBlciBzZWNvbmRcbiIsIGFib3ZlLCBcCisJSk9NKDgsICJ2aWRlbyBzdHJlYW1pbmcgYXQgJTNsbGkuJTAzaSBmaWVsZHMgcGVyIHNlY29uZFxuIiwgYWJvdmUsIFwKIAkJCQkJCQkocmVtYWluZGVyLzEwMDApKTsKIH0KLXRpbWV2YWwwID0gdGltZXZhbDsKK3BlYXN5Y2FwLT50aW1ldmFsNiA9IHRpbWV2YWw7CiAKIGlmIChjYWNoZXMpCi0JSk9UKDgsICIlaT1jYWNoZXNcbiIsIGNhY2hlcyk7CisJSk9NKDgsICIlaT1jYWNoZXNcbiIsIGNhY2hlcyk7CiByZXR1cm4gMDsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE0MzQsNyArMTg4NSw3IEBACiAJCQkJCV9fdTggbWFzaywgX191OCBtYXJnaW4sIGJvb2wgaXN1eSkKIHsKIHN0YXRpYyBfX3MzMiBheVsyNTZdLCBidVsyNTZdLCBydlsyNTZdLCBndVsyNTZdLCBndlsyNTZdOwotc3RhdGljIF9fdTggY2FjaGVbOF0sICpwY2FjaGU7CitfX3U4ICpwY2FjaGU7CiBfX3U4IHIsIGcsIGIsIHksIHUsIHYsIGMsICpwMiwgKnAzLCAqcHosICpwcjsKIGludCAgYnl0ZXNwZXJwaXhlbDsKIGJvb2wgYnl0ZXN3YXBvcmRlciwgZGVjaW1hdGVwaXhlbCwgbGFzdDsKQEAgLTE0NDIsNyArMTg5Myw3IEBACiBfX3MzMiBzMzI7CiAKIGlmIChtdWNoICUgMikgewotCVNBWSgiTUlTVEFLRTogbXVjaCBpcyBvZGRcbiIpOworCVNBTSgiTUlTVEFLRTogbXVjaCBpcyBvZGRcbiIpOwogCXJldHVybiAtRUZBVUxUOwogfQogYnl0ZXNwZXJwaXhlbCA9IHBlYXN5Y2FwLT5ieXRlc3BlcnBpeGVsOwpAQCAtMTQ3NSwzMCArMTkyNiwzMSBAQAogCQlheVtqXSA9IGF5WzE2XTsKIAlmb3IgKGogPSAyMzY7IGogPCAyNTY7IGorKykKIAkJYXlbal0gPSBheVsyMzVdOwotCUpPVCg4LCAibG9va3VwIHRhYmxlcyBhcmUgcHJlcGFyZWRcbiIpOworCUpPTSg4LCAibG9va3VwIHRhYmxlcyBhcmUgcHJlcGFyZWRcbiIpOwogfQotaWYgKChfX3U4ICopTlVMTCA9PSBwY2FjaGUpCi0JcGNhY2hlID0gJmNhY2hlWzBdOworcGNhY2hlID0gcGVhc3ljYXAtPnBjYWNoZTsKK2lmIChOVUxMID09IHBjYWNoZSkKKwlwY2FjaGUgPSAmcGVhc3ljYXAtPmNhY2hlWzBdOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKICAqICBUUkFOU0ZFUiBDT05URU5UUyBPRiBDQUNIRSBUTyBUSEUgRlJBTUUgQlVGRkVSCiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIGlmICghcGNhY2hlKSB7Ci0JU0FZKCJNSVNUQUtFOiBwY2FjaGUgaXMgTlVMTFxuIik7CisJU0FNKCJNSVNUQUtFOiBwY2FjaGUgaXMgTlVMTFxuIik7CiAJcmV0dXJuIC1FRkFVTFQ7CiB9CiAKLWlmIChwY2FjaGUgIT0gJmNhY2hlWzBdKQotCUpPVCgxNiwgImNhY2hlIGhhcyAlaSBieXRlc1xuIiwgKGludCkocGNhY2hlIC0gJmNhY2hlWzBdKSk7Ci1wMiA9ICZjYWNoZVswXTsKLXAzID0gKF9fdTggKilwYWQgLSAoaW50KShwY2FjaGUgLSAmY2FjaGVbMF0pOworaWYgKHBjYWNoZSAhPSAmcGVhc3ljYXAtPmNhY2hlWzBdKQorCUpPTSgxNiwgImNhY2hlIGhhcyAlaSBieXRlc1xuIiwgKGludCkocGNhY2hlIC0gJnBlYXN5Y2FwLT5jYWNoZVswXSkpOworcDIgPSAmcGVhc3ljYXAtPmNhY2hlWzBdOworcDMgPSAoX191OCAqKXBhZCAtIChpbnQpKHBjYWNoZSAtICZwZWFzeWNhcC0+Y2FjaGVbMF0pOwogd2hpbGUgKHAyIDwgcGNhY2hlKSB7CiAJKnAzKysgPSAqcDI7ICBwMisrOwogfQotcGNhY2hlID0gJmNhY2hlWzBdOworcGNhY2hlID0gJnBlYXN5Y2FwLT5jYWNoZVswXTsKIGlmIChwMyAhPSBwYWQpIHsKLQlTQVkoIk1JU1RBS0U6IHBvaW50ZXIgbWlzYWxpZ25tZW50XG4iKTsKKwlTQU0oIk1JU1RBS0U6IHBvaW50ZXIgbWlzYWxpZ25tZW50XG4iKTsKIAlyZXR1cm4gLUVGQVVMVDsKIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTE1MTMsNyArMTk2NSw3IEBACiAJdiA9ICoocDIgLSAxKTsKIAogaWYgKHJ1bXApCi0JSk9UKDE2LCAiJTRpPW11Y2ggICU0aT1tb3JlICAlaT1ydW1wXG4iLCBtdWNoLCBtb3JlLCBydW1wKTsKKwlKT00oMTYsICIlNGk9bXVjaCAgJTRpPW1vcmUgICVpPXJ1bXBcbiIsIG11Y2gsIG1vcmUsIHJ1bXApOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBzd2l0Y2ggKGJ5dGVzcGVycGl4ZWwpIHsKQEAgLTE2MTksNyArMjA3MSw3IEBACiAJCQkJCQkJMCA6IChfX3U4KXMzMik7CiAKIAkJCQlpZiAoKHRydWUgPT0gbGFzdCkgJiYgcnVtcCkgewotCQkJCQlwY2FjaGUgPSAmY2FjaGVbMF07CisJCQkJCXBjYWNoZSA9ICZwZWFzeWNhcC0+Y2FjaGVbMF07CiAJCQkJCXN3aXRjaCAoYnl0ZXNwZXJwaXhlbCAtIHJ1bXApIHsKIAkJCQkJY2FzZSAxOiB7CiAJCQkJCQkqcDMgPSByOwpAQCAtMTYzNCw3ICsyMDg2LDcgQEAKIAkJCQkJCWJyZWFrOwogCQkJCQl9CiAJCQkJCWRlZmF1bHQ6IHsKLQkJCQkJCVNBWSgiTUlTVEFLRTogJWk9cnVtcFxuIiwgXAorCQkJCQkJU0FNKCJNSVNUQUtFOiAlaT1ydW1wXG4iLCBcCiAJCQkJCQkJYnl0ZXNwZXJwaXhlbCAtIHJ1bXApOwogCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQkJCX0KQEAgLTE2OTIsNyArMjE0NCw3IEBACiAJCQkJCQkJCTAgOiAoX191OClzMzIpOwogCiAJCQkJaWYgKCh0cnVlID09IGxhc3QpICYmIHJ1bXApIHsKLQkJCQkJcGNhY2hlID0gJmNhY2hlWzBdOworCQkJCQlwY2FjaGUgPSAmcGVhc3ljYXAtPmNhY2hlWzBdOwogCQkJCQlzd2l0Y2ggKGJ5dGVzcGVycGl4ZWwgLSBydW1wKSB7CiAJCQkJCWNhc2UgMTogewogCQkJCQkJKnAzID0gYjsKQEAgLTE3MDcsNyArMjE1OSw3IEBACiAJCQkJCQlicmVhazsKIAkJCQkJfQogCQkJCQlkZWZhdWx0OiB7Ci0JCQkJCQlTQVkoIk1JU1RBS0U6ICVpPXJ1bXBcbiIsIFwKKwkJCQkJCVNBTSgiTUlTVEFLRTogJWk9cnVtcFxuIiwgXAogCQkJCQkJCWJ5dGVzcGVycGl4ZWwgLSBydW1wKTsKIAkJCQkJCXJldHVybiAtRUZBVUxUOwogCQkJCQl9CkBAIC0xNzY4LDcgKzIyMjAsNyBAQAogCQkJCQkJCQkwIDogKF9fdTgpczMyKTsKIAogCQkJCQlpZiAoKHRydWUgPT0gbGFzdCkgJiYgcnVtcCkgewotCQkJCQkJcGNhY2hlID0gJmNhY2hlWzBdOworCQkJCQkJcGNhY2hlID0gJnBlYXN5Y2FwLT5jYWNoZVswXTsKIAkJCQkJCXN3aXRjaCAoYnl0ZXNwZXJwaXhlbCAtIHJ1bXApIHsKIAkJCQkJCWNhc2UgMTogewogCQkJCQkJCSpwMyA9IHI7CkBAIC0xNzgzLDcgKzIyMzUsNyBAQAogCQkJCQkJCWJyZWFrOwogCQkJCQkJfQogCQkJCQkJZGVmYXVsdDogewotCQkJCQkJCVNBWSgiTUlTVEFLRTogIiBcCisJCQkJCQkJU0FNKCJNSVNUQUtFOiAiIFwKIAkJCQkJCQkiJWk9cnVtcFxuIiwgXAogCQkJCQkJCWJ5dGVzcGVycGl4ZWwgLSBydW1wKTsKIAkJCQkJCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTE4NDQsNyArMjI5Niw3IEBACiAJCQkJCQkJCTAgOiAoX191OClzMzIpOwogCiAJCQkJCWlmICgodHJ1ZSA9PSBsYXN0KSAmJiBydW1wKSB7Ci0JCQkJCQlwY2FjaGUgPSAmY2FjaGVbMF07CisJCQkJCQlwY2FjaGUgPSAmcGVhc3ljYXAtPmNhY2hlWzBdOwogCQkJCQkJc3dpdGNoIChieXRlc3BlcnBpeGVsIC0gcnVtcCkgewogCQkJCQkJY2FzZSAxOiB7CiAJCQkJCQkJKnAzID0gYjsKQEAgLTE4NTksNyArMjMxMSw3IEBACiAJCQkJCQkJYnJlYWs7CiAJCQkJCQl9CiAJCQkJCQlkZWZhdWx0OiB7Ci0JCQkJCQkJU0FZKCJNSVNUQUtFOiAiIFwKKwkJCQkJCQlTQU0oIk1JU1RBS0U6ICIgXAogCQkJCQkJCSIlaT1ydW1wXG4iLCBcCiAJCQkJCQkJYnl0ZXNwZXJwaXhlbCAtIHJ1bXApOwogCQkJCQkJCXJldHVybiAtRUZBVUxUOwpAQCAtMTkyNCw3ICsyMzc2LDcgQEAKIAkJCQkJCQkJMCA6IChfX3U4KXMzMik7CiAKIAkJCQlpZiAoKHRydWUgPT0gbGFzdCkgJiYgcnVtcCkgewotCQkJCQlwY2FjaGUgPSAmY2FjaGVbMF07CisJCQkJCXBjYWNoZSA9ICZwZWFzeWNhcC0+Y2FjaGVbMF07CiAJCQkJCXN3aXRjaCAoYnl0ZXNwZXJwaXhlbCAtIHJ1bXApIHsKIAkJCQkJY2FzZSAxOiB7CiAJCQkJCQkqcDMgPSByOwpAQCAtMTk0OCw3ICsyNDAwLDcgQEAKIAkJCQkJCWJyZWFrOwogCQkJCQl9CiAJCQkJCWRlZmF1bHQ6IHsKLQkJCQkJCVNBWSgiTUlTVEFLRTogJWk9cnVtcFxuIiwgXAorCQkJCQkJU0FNKCJNSVNUQUtFOiAlaT1ydW1wXG4iLCBcCiAJCQkJCQkJYnl0ZXNwZXJwaXhlbCAtIHJ1bXApOwogCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQkJCX0KQEAgLTIwMDYsNyArMjQ1OCw3IEBACiAJCQkJCQkJCTAgOiAoX191OClzMzIpOwogCiAJCQkJaWYgKCh0cnVlID09IGxhc3QpICYmIHJ1bXApIHsKLQkJCQkJcGNhY2hlID0gJmNhY2hlWzBdOworCQkJCQlwY2FjaGUgPSAmcGVhc3ljYXAtPmNhY2hlWzBdOwogCQkJCQlzd2l0Y2ggKGJ5dGVzcGVycGl4ZWwgLSBydW1wKSB7CiAJCQkJCWNhc2UgMTogewogCQkJCQkJKnAzID0gYjsKQEAgLTIwMzAsNyArMjQ4Miw3IEBACiAJCQkJCQlicmVhazsKIAkJCQkJfQogCQkJCQlkZWZhdWx0OiB7Ci0JCQkJCQlTQVkoIk1JU1RBS0U6ICVpPXJ1bXBcbiIsIFwKKwkJCQkJCVNBTSgiTUlTVEFLRTogJWk9cnVtcFxuIiwgXAogCQkJCQkJCWJ5dGVzcGVycGl4ZWwgLSBydW1wKTsKIAkJCQkJCXJldHVybiAtRUZBVUxUOwogCQkJCQl9CkBAIC0yMDkzLDcgKzI1NDUsNyBAQAogCQkJCQkJCQkwIDogKF9fdTgpczMyKTsKIAogCQkJCQlpZiAoKHRydWUgPT0gbGFzdCkgJiYgcnVtcCkgewotCQkJCQkJcGNhY2hlID0gJmNhY2hlWzBdOworCQkJCQkJcGNhY2hlID0gJnBlYXN5Y2FwLT5jYWNoZVswXTsKIAkJCQkJCXN3aXRjaCAoYnl0ZXNwZXJwaXhlbCAtIHJ1bXApIHsKIAkJCQkJCWNhc2UgMTogewogCQkJCQkJCSpwMyA9IHI7CkBAIC0yMTE3LDcgKzI1NjksNyBAQAogCQkJCQkJCWJyZWFrOwogCQkJCQkJfQogCQkJCQkJZGVmYXVsdDogewotCQkJCQkJCVNBWSgiTUlTVEFLRTogIiBcCisJCQkJCQkJU0FNKCJNSVNUQUtFOiAiIFwKIAkJCQkJCQkiJWk9cnVtcFxuIiwgXAogCQkJCQkJCWJ5dGVzcGVycGl4ZWwgLSBcCiAJCQkJCQkJcnVtcCk7CkBAIC0yMTc4LDcgKzI2MzAsNyBAQAogCQkJCQkJCQkwIDogKF9fdTgpczMyKTsKIAogCQkJCQlpZiAoKHRydWUgPT0gbGFzdCkgJiYgcnVtcCkgewotCQkJCQkJcGNhY2hlID0gJmNhY2hlWzBdOworCQkJCQkJcGNhY2hlID0gJnBlYXN5Y2FwLT5jYWNoZVswXTsKIAkJCQkJCXN3aXRjaCAoYnl0ZXNwZXJwaXhlbCAtIHJ1bXApIHsKIAkJCQkJCWNhc2UgMTogewogCQkJCQkJCSpwMyA9IGI7CkBAIC0yMjAyLDcgKzI2NTQsNyBAQAogCQkJCQkJCWJyZWFrOwogCQkJCQkJfQogCQkJCQkJZGVmYXVsdDogewotCQkJCQkJCVNBWSgiTUlTVEFLRTogIiBcCisJCQkJCQkJU0FNKCJNSVNUQUtFOiAiIFwKIAkJCQkJCQkiJWk9cnVtcFxuIiwgXAogCQkJCQkJCWJ5dGVzcGVycGl4ZWwgLSBydW1wKTsKIAkJCQkJCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTIyMjYsNDggKzI2NzgsMTMgQEAKIAlicmVhazsKIAl9CiBkZWZhdWx0OiB7Ci0JU0FZKCJNSVNUQUtFOiAlaT1ieXRlc3BlcnBpeGVsXG4iLCBieXRlc3BlcnBpeGVsKTsKKwlTQU0oIk1JU1RBS0U6ICVpPWJ5dGVzcGVycGl4ZWxcbiIsIGJ5dGVzcGVycGl4ZWwpOwogCXJldHVybiAtRUZBVUxUOwogCX0KIH0KIHJldHVybiAwOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAotZGVicmllZihzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXApCi17Ci1pZiAoKHN0cnVjdCB1c2JfZGV2aWNlICopTlVMTCAhPSBwZWFzeWNhcC0+cHVzYl9kZXZpY2UpIHsKLQljaGVja19zdGsocGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKLQljaGVja19zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKLQlzYXlyZWFkb25seShwZWFzeWNhcCk7Ci0JU0FZKCIlaT1wZWFzeWNhcC0+ZmllbGRfZmlsbFxuIiwgcGVhc3ljYXAtPmZpZWxkX2ZpbGwpOwotCVNBWSgiJWk9cGVhc3ljYXAtPmZpZWxkX3JlYWRcbiIsIHBlYXN5Y2FwLT5maWVsZF9yZWFkKTsKLQlTQVkoIiVpPXBlYXN5Y2FwLT5mcmFtZV9maWxsXG4iLCBwZWFzeWNhcC0+ZnJhbWVfZmlsbCk7Ci0JU0FZKCIlaT1wZWFzeWNhcC0+ZnJhbWVfcmVhZFxuIiwgcGVhc3ljYXAtPmZyYW1lX3JlYWQpOwotfQotcmV0dXJuOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAotc2F5cmVhZG9ubHkoc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwKQotewotc3RhdGljIGludCBkb25lOwotaW50IGdvdDAwLCBnb3QxRiwgZ290NjAsIGdvdDYxLCBnb3Q2MjsKLQotaWYgKCghZG9uZSkgJiYgKChzdHJ1Y3QgdXNiX2RldmljZSAqKU5VTEwgIT0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlKSkgewotCWRvbmUgPSAxOwotCWdvdDAwID0gcmVhZF9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCAweDAwKTsKLQlnb3QxRiA9IHJlYWRfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgMHgxRik7Ci0JZ290NjAgPSByZWFkX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIDB4NjApOwotCWdvdDYxID0gcmVhZF9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCAweDYxKTsKLQlnb3Q2MiA9IHJlYWRfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgMHg2Mik7Ci0JU0FZKCIweCUwMlg9cmVnMHgwMCAgMHglMDJYPXJlZzB4MUZcbiIsIGdvdDAwLCBnb3QxRik7Ci0JU0FZKCIweCUwMlg9cmVnMHg2MCAgMHglMDJYPXJlZzB4NjEgIDB4JTAyWD1yZWcweDYyXG4iLCBcCi0JCQkJCQkJZ290NjAsIGdvdDYxLCBnb3Q2Mik7Ci19Ci1yZXR1cm47Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgogICogIFNFRSBDT1JCRVQgRVQgQUwuICJMSU5VWCBERVZJQ0UgRFJJVkVSUyIsIDNyZCBFRElUSU9OLCBQQUdFUyA0MzAtNDM0CkBAIC0yMjkyLDExICsyNzA5LDE2IEBACiBzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXA7CiAKIHBlYXN5Y2FwID0gcHZtYS0+dm1fcHJpdmF0ZV9kYXRhOwotaWYgKE5VTEwgIT0gcGVhc3ljYXApCi0JcGVhc3ljYXAtPnZtYV9tYW55Kys7Ci0KK2lmIChOVUxMID09IHBlYXN5Y2FwKSB7CisJU0FZKCJFUlJPUjogcGVhc3ljYXAgaXMgTlVMTFxuIik7CisJcmV0dXJuOworfQoraWYgKG1lbWNtcCgmcGVhc3ljYXAtPnRlbGx0YWxlWzBdLCBURUxMVEFMRSwgc3RybGVuKFRFTExUQUxFKSkpIHsKKwlTQVkoIkVSUk9SOiBiYWQgcGVhc3ljYXA6IDB4JTA4bFhcbiIsICh1bnNpZ25lZCBsb25nIGludCkgcGVhc3ljYXApOworCXJldHVybjsKK30KK3BlYXN5Y2FwLT52bWFfbWFueSsrOwogSk9UKDgsICIlaT1wZWFzeWNhcC0+dm1hX21hbnlcbiIsIHBlYXN5Y2FwLT52bWFfbWFueSk7Ci0KIHJldHVybjsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTIzMDYsMTAgKzI3MjgsMTYgQEAKIHN0cnVjdCBlYXN5Y2FwICpwZWFzeWNhcDsKIAogcGVhc3ljYXAgPSBwdm1hLT52bV9wcml2YXRlX2RhdGE7Ci1pZiAoTlVMTCAhPSBwZWFzeWNhcCkgewotCXBlYXN5Y2FwLT52bWFfbWFueS0tOwotCUpPVCg4LCAiJWk9cGVhc3ljYXAtPnZtYV9tYW55XG4iLCBwZWFzeWNhcC0+dm1hX21hbnkpOworaWYgKE5VTEwgPT0gcGVhc3ljYXApIHsKKwlTQVkoIkVSUk9SOiBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKKwlyZXR1cm47CiB9CitpZiAobWVtY21wKCZwZWFzeWNhcC0+dGVsbHRhbGVbMF0sIFRFTExUQUxFLCBzdHJsZW4oVEVMTFRBTEUpKSkgeworCVNBWSgiRVJST1I6IGJhZCBwZWFzeWNhcDogMHglMDhsWFxuIiwgKHVuc2lnbmVkIGxvbmcgaW50KSBwZWFzeWNhcCk7CisJcmV0dXJuOworfQorcGVhc3ljYXAtPnZtYV9tYW55LS07CitKT1QoOCwgIiVpPXBlYXN5Y2FwLT52bWFfbWFueVxuIiwgcGVhc3ljYXAtPnZtYV9tYW55KTsKIHJldHVybjsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTIzNTUsMjQgKzI3ODMsMjIgQEAKIAlTQVkoIkVSUk9SOiBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKIAlyZXR1cm4gcmV0Y29kZTsKIH0KLW11dGV4X2xvY2soJihwZWFzeWNhcC0+bXV0ZXhfbW1hcF92aWRlb1swXSkpOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogcGJ1ZiA9IHBlYXN5Y2FwLT5mcmFtZV9idWZmZXJba11bbV0ucGdvOwogaWYgKE5VTEwgPT0gcGJ1ZikgewotCVNBWSgiRVJST1I6ICBwYnVmIGlzIE5VTExcbiIpOworCVNBTSgiRVJST1I6ICBwYnVmIGlzIE5VTExcbiIpOwogCWdvdG8gZmluaXNoOwogfQogcGFnZSA9IHZpcnRfdG9fcGFnZShwYnVmKTsKIGlmIChOVUxMID09IHBhZ2UpIHsKLQlTQVkoIkVSUk9SOiAgcGFnZSBpcyBOVUxMXG4iKTsKKwlTQU0oIkVSUk9SOiAgcGFnZSBpcyBOVUxMXG4iKTsKIAlnb3RvIGZpbmlzaDsKIH0KIGdldF9wYWdlKHBhZ2UpOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogZmluaXNoOgotbXV0ZXhfdW5sb2NrKCYocGVhc3ljYXAtPm11dGV4X21tYXBfdmlkZW9bMF0pKTsKIGlmIChOVUxMID09IHBhZ2UpIHsKLQlTQVkoIkVSUk9SOiAgcGFnZSBpcyBOVUxMIGFmdGVyIGdldF9wYWdlKHBhZ2UpXG4iKTsKKwlTQU0oIkVSUk9SOiAgcGFnZSBpcyBOVUxMIGFmdGVyIGdldF9wYWdlKHBhZ2UpXG4iKTsKIH0gZWxzZSB7CiAJcHZtZi0+cGFnZSA9IHBhZ2U7CiAJcmV0Y29kZSA9IFZNX0ZBVUxUX01JTk9SOwpAQCAtMjM4Myw3ICsyODA5LDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qCiAgKiAgT04gQ09NUExFVElPTiBPRiBBIFZJREVPIFVSQiBJVFMgREFUQSBJUyBDT1BJRUQgVE8gVEhFIEZJRUxEIEJVRkZFUlMKLSAqICBQUk9WSURFRCBwZWFzeWNhcC0+dmlkZW9faWRsZSBJUyBaRVIwLiAgUkVHQVJETEVTUyBPRiBUSElTIEJFSU5HIFRSVUUsCisgKiAgUFJPVklERUQgcGVhc3ljYXAtPnZpZGVvX2lkbGUgSVMgWkVSTy4gIFJFR0FSRExFU1MgT0YgVEhJUyBCRUlORyBUUlVFLAogICogIElUIElTIFJFU1VCTUlUVEVEIFBST1ZJREVEIHBlYXN5Y2FwLT52aWRlb19pc29jX3N0cmVhbWluZyBJUyBOT1QgWkVSTy4KICAqCiAgKiAgVEhJUyBGVU5DVElPTiBJUyBBTiBJTlRFUlJVUFQgU0VSVklDRSBST1VUSU5FIEFORCBNVVNUIE5PVCBTTEVFUC4KQEAgLTI0MDAsNyArMjgyNiw4IEBACiAgKiAgICAgIDAgIT0gKGtvdW50ICYgMHg4MDAwKSAgID0+IEFUIExFQVNUIE9ORSBVUkIgQ09NUExFVEVEIFdJVEggRVJST1JTCiAgKiAgICAgIDAgIT0gKGtvdW50ICYgMHg0MDAwKSAgID0+IEJVRkZFUiBIQVMgVE9PIE1VQ0ggREFUQQogICogICAgICAwICE9IChrb3VudCAmIDB4MjAwMCkgICA9PiBCVUZGRVIgSEFTIE5PVCBFTk9VR0ggREFUQQotICogICAgICAwICE9IChrb3VudCAmIDB4MDQwMCkgICA9PiBGSUVMRCBXQVMgU1VCTUlUVEVEIEJZIEJSSURHRVIgUk9VVElORQorICogICAgICAwICE9IChrb3VudCAmIDB4MTAwMCkgICA9PiBCVUZGRVIgSEFTIERBVEEgRlJPTSBESVNQQVJBVEUgSU5QVVRTCisgKiAgICAgIDAgIT0gKGtvdW50ICYgMHgwNDAwKSAgID0+IFJFU0VSVkVECiAgKiAgICAgIDAgIT0gKGtvdW50ICYgMHgwMjAwKSAgID0+IEZJRUxEIEJVRkZFUiBOT1QgWUVUIENIRUNLRUQKICAqICAgICAgMCAhPSAoa291bnQgJiAweDAxMDApICAgPT4gQlVGRkVSIEhBUyBUV08gRVhUUkEgQllURVMgLSBXSFk/CiAgKi8KQEAgLTI0MDgsMTkgKzI4MzUsMTQgQEAKIHZvaWQKIGVhc3ljYXBfY29tcGxldGUoc3RydWN0IHVyYiAqcHVyYikKIHsKLXN0YXRpYyBpbnQgbXQ7CiBzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXA7CiBzdHJ1Y3QgZGF0YV9idWZmZXIgKnBmaWVsZF9idWZmZXI7CiBjaGFyIGVycmJ1ZlsxNl07CiBpbnQgaSwgbW9yZSwgbXVjaCwgbGVhcCwgcmMsIGxhc3Q7CiBpbnQgdmlkZW9maWVsZGFtb3VudDsKLXVuc2lnbmVkIGludCBvdmVycmlkZTsKK3Vuc2lnbmVkIGludCBvdmVycmlkZSwgYmFkOwogaW50IGZyYW1lc3RhdHVzLCBmcmFtZWxlbmd0aCwgZnJhbWVhY3R1YWwsIGZyYW1lb2Zmc2V0OwogX191OCAqcHU7Ci0jaWYgZGVmaW5lZChCUklER0VSKQotc3RydWN0IHRpbWV2YWwgdGltZXZhbDsKLWxvbmcgbG9uZyB1c2VjOwotI2VuZGlmIC8qQlJJREdFUiovCiAKIGlmIChOVUxMID09IHB1cmIpIHsKIAlTQVkoIkVSUk9SOiBlYXN5Y2FwX2NvbXBsZXRlKCk6IHB1cmIgaXMgTlVMTFxuIik7CkBAIC0yNDMxLDc0ICsyODUzLDc4IEBACiAJU0FZKCJFUlJPUjogZWFzeWNhcF9jb21wbGV0ZSgpOiBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKIAlyZXR1cm47CiB9Ci0KK2lmIChtZW1jbXAoJnBlYXN5Y2FwLT50ZWxsdGFsZVswXSwgVEVMTFRBTEUsIHN0cmxlbihURUxMVEFMRSkpKSB7CisJU0FZKCJFUlJPUjogYmFkIHBlYXN5Y2FwOiAweCUwOGxYXG4iLCAodW5zaWduZWQgbG9uZyBpbnQpIHBlYXN5Y2FwKTsKKwlyZXR1cm47Cit9CiBpZiAocGVhc3ljYXAtPnZpZGVvX2VvZikKIAlyZXR1cm47Ci0KIGZvciAoaSA9IDA7IGkgPCBWSURFT19JU09DX0JVRkZFUl9NQU5ZOyBpKyspCiAJaWYgKHB1cmItPnRyYW5zZmVyX2J1ZmZlciA9PSBwZWFzeWNhcC0+dmlkZW9faXNvY19idWZmZXJbaV0ucGdvKQogCQlicmVhazsKLUpPVCgxNiwgIiUyaT11cmJcbiIsIGkpOworSk9NKDE2LCAiJTJpPXVyYlxuIiwgaSk7CiBsYXN0ID0gcGVhc3ljYXAtPnZpZGVvX2lzb2Nfc2VxdWVuY2U7CiBpZiAoKCgoVklERU9fSVNPQ19CVUZGRVJfTUFOWSAtIDEpID09IGxhc3QpICYmIFwKIAkJCQkJCSgwICE9IGkpKSB8fCBcCiAJKCgoVklERU9fSVNPQ19CVUZGRVJfTUFOWSAtIDEpICE9IGxhc3QpICYmIFwKIAkJCQkJCSgobGFzdCArIDEpICE9IGkpKSkgewotCVNBWSgiRVJST1I6IG91dC1vZi1vcmRlciB1cmJzICVpLCVpIC4uLiBjb250aW51aW5nXG4iLCBsYXN0LCBpKTsKKwlKT00oMTYsICJFUlJPUjogb3V0LW9mLW9yZGVyIHVyYnMgJWksJWkgLi4uIGNvbnRpbnVpbmdcbiIsIGxhc3QsIGkpOwogfQogcGVhc3ljYXAtPnZpZGVvX2lzb2Nfc2VxdWVuY2UgPSBpOwogCiBpZiAocGVhc3ljYXAtPnZpZGVvX2lkbGUpIHsKLQlKT1QoMTYsICIlaT12aWRlb19pZGxlICAlaT12aWRlb19pc29jX3N0cmVhbWluZ1xuIiwgXAorCUpPTSgxNiwgIiVpPXZpZGVvX2lkbGUgICVpPXZpZGVvX2lzb2Nfc3RyZWFtaW5nXG4iLCBcCiAJCQlwZWFzeWNhcC0+dmlkZW9faWRsZSwgcGVhc3ljYXAtPnZpZGVvX2lzb2Nfc3RyZWFtaW5nKTsKIAlpZiAocGVhc3ljYXAtPnZpZGVvX2lzb2Nfc3RyZWFtaW5nKSB7CiAJCXJjID0gdXNiX3N1Ym1pdF91cmIocHVyYiwgR0ZQX0FUT01JQyk7CiAJCWlmICgwICE9IHJjKSB7Ci0JCQlTQVkoIkVSUk9SOiB3aGlsZSAlaT12aWRlb19pZGxlLCAiIFwKLQkJCQkJInVzYl9zdWJtaXRfdXJiKCkgZmFpbGVkIHdpdGggcmM6XG4iLCBcCi0JCQkJCQkJcGVhc3ljYXAtPnZpZGVvX2lkbGUpOwogCQkJc3dpdGNoIChyYykgewogCQkJY2FzZSAtRU5PTUVNOiB7Ci0JCQkJU0FZKCJFTk9NRU1cbiIpOworCQkJCVNBTSgiRU5PTUVNXG4iKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJCWNhc2UgLUVOT0RFVjogewotCQkJCVNBWSgiRU5PREVWXG4iKTsKKwkJCQlTQU0oIkVOT0RFVlxuIik7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQljYXNlIC1FTlhJTzogewotCQkJCVNBWSgiRU5YSU9cbiIpOworCQkJCVNBTSgiRU5YSU9cbiIpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJY2FzZSAtRUlOVkFMOiB7Ci0JCQkJU0FZKCJFSU5WQUxcbiIpOworCQkJCVNBTSgiRUlOVkFMXG4iKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJCWNhc2UgLUVBR0FJTjogewotCQkJCVNBWSgiRUFHQUlOXG4iKTsKKwkJCQlTQU0oIkVBR0FJTlxuIik7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQljYXNlIC1FRkJJRzogewotCQkJCVNBWSgiRUZCSUdcbiIpOworCQkJCVNBTSgiRUZCSUdcbiIpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJY2FzZSAtRVBJUEU6IHsKLQkJCQlTQVkoIkVQSVBFXG4iKTsKKwkJCQlTQU0oIkVQSVBFXG4iKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJCWNhc2UgLUVNU0dTSVpFOiB7Ci0JCQkJU0FZKCJFTVNHU0laRVxuIik7CisJCQkJU0FNKCJFTVNHU0laRVxuIik7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQljYXNlIC1FTk9TUEM6IHsKLQkJCQlTQVkoIkVOT1NQQ1xuIik7CisJCQkJU0FNKCJFTk9TUENcbiIpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJZGVmYXVsdDogewotCQkJCVNBWSgiMHglMDhYXG4iLCByYyk7CisJCQkJU0FNKCIweCUwOFhcbiIsIHJjKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJCX0KKwkJCWlmICgtRU5PREVWICE9IHJjKSBcCisJCQkJU0FNKCJFUlJPUjogd2hpbGUgJWk9dmlkZW9faWRsZSwgIiBcCisJCQkJCQkJInVzYl9zdWJtaXRfdXJiKCkgIiBcCisJCQkJCQkJImZhaWxlZCB3aXRoIHJjOlxuIiwgXAorCQkJCQkJCXBlYXN5Y2FwLT52aWRlb19pZGxlKTsKIAkJfQogCX0KIHJldHVybjsKQEAgLTI1MDYsODAgKzI5MzIsODAgQEAKIG92ZXJyaWRlID0gMDsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIGlmIChGSUVMRF9CVUZGRVJfTUFOWSA8PSBwZWFzeWNhcC0+ZmllbGRfZmlsbCkgewotCVNBWSgiRVJST1I6IGJhZCBwZWFzeWNhcC0+ZmllbGRfZmlsbFxuIik7CisJU0FNKCJFUlJPUjogYmFkIHBlYXN5Y2FwLT5maWVsZF9maWxsXG4iKTsKIAlyZXR1cm47CiB9CiBpZiAocHVyYi0+c3RhdHVzKSB7CiAJaWYgKCgtRVNIVVRET1dOID09IHB1cmItPnN0YXR1cykgfHwgKC1FTk9FTlQgPT0gcHVyYi0+c3RhdHVzKSkgewotCQlKT1QoOCwgInVyYiBzdGF0dXMgLUVTSFVURE9XTiBvciAtRU5PRU5UXG4iKTsKKwkJSk9NKDgsICJ1cmIgc3RhdHVzIC1FU0hVVERPV04gb3IgLUVOT0VOVFxuIik7CiAJCXJldHVybjsKIAl9CiAKIAkocGVhc3ljYXAtPmZpZWxkX2J1ZmZlcltwZWFzeWNhcC0+ZmllbGRfZmlsbF1bMF0ua291bnQpIHw9IDB4ODAwMCA7Ci0JU0FZKCJFUlJPUjogYmFkIHVyYiBzdGF0dXM6XG4iKTsKKwlTQU0oIkVSUk9SOiBiYWQgdXJiIHN0YXR1czpcbiIpOwogCXN3aXRjaCAocHVyYi0+c3RhdHVzKSB7CiAJY2FzZSAtRUlOUFJPR1JFU1M6IHsKLQkJU0FZKCItRUlOUFJPR1JFU1NcbiIpOyBicmVhazsKKwkJU0FNKCItRUlOUFJPR1JFU1NcbiIpOyBicmVhazsKIAl9CiAJY2FzZSAtRU5PU1I6IHsKLQkJU0FZKCItRU5PU1JcbiIpOyBicmVhazsKKwkJU0FNKCItRU5PU1JcbiIpOyBicmVhazsKIAl9CiAJY2FzZSAtRVBJUEU6IHsKLQkJU0FZKCItRVBJUEVcbiIpOyBicmVhazsKKwkJU0FNKCItRVBJUEVcbiIpOyBicmVhazsKIAl9CiAJY2FzZSAtRU9WRVJGTE9XOiB7Ci0JCVNBWSgiLUVPVkVSRkxPV1xuIik7IGJyZWFrOworCQlTQU0oIi1FT1ZFUkZMT1dcbiIpOyBicmVhazsKIAl9CiAJY2FzZSAtRVBST1RPOiB7Ci0JCVNBWSgiLUVQUk9UT1xuIik7IGJyZWFrOworCQlTQU0oIi1FUFJPVE9cbiIpOyBicmVhazsKIAl9CiAJY2FzZSAtRUlMU0VROiB7Ci0JCVNBWSgiLUVJTFNFUVxuIik7IGJyZWFrOworCQlTQU0oIi1FSUxTRVFcbiIpOyBicmVhazsKIAl9CiAJY2FzZSAtRVRJTUVET1VUOiB7Ci0JCVNBWSgiLUVUSU1FRE9VVFxuIik7IGJyZWFrOworCQlTQU0oIi1FVElNRURPVVRcbiIpOyBicmVhazsKIAl9CiAJY2FzZSAtRU1TR1NJWkU6IHsKLQkJU0FZKCItRU1TR1NJWkVcbiIpOyBicmVhazsKKwkJU0FNKCItRU1TR1NJWkVcbiIpOyBicmVhazsKIAl9CiAJY2FzZSAtRU9QTk9UU1VQUDogewotCQlTQVkoIi1FT1BOT1RTVVBQXG4iKTsgYnJlYWs7CisJCVNBTSgiLUVPUE5PVFNVUFBcbiIpOyBicmVhazsKIAl9CiAJY2FzZSAtRVBGTk9TVVBQT1JUOiB7Ci0JCVNBWSgiLUVQRk5PU1VQUE9SVFxuIik7IGJyZWFrOworCQlTQU0oIi1FUEZOT1NVUFBPUlRcbiIpOyBicmVhazsKIAl9CiAJY2FzZSAtRUFGTk9TVVBQT1JUOiB7Ci0JCVNBWSgiLUVBRk5PU1VQUE9SVFxuIik7IGJyZWFrOworCQlTQU0oIi1FQUZOT1NVUFBPUlRcbiIpOyBicmVhazsKIAl9CiAJY2FzZSAtRUFERFJJTlVTRTogewotCQlTQVkoIi1FQUREUklOVVNFXG4iKTsgYnJlYWs7CisJCVNBTSgiLUVBRERSSU5VU0VcbiIpOyBicmVhazsKIAl9CiAJY2FzZSAtRUFERFJOT1RBVkFJTDogewotCQlTQVkoIi1FQUREUk5PVEFWQUlMXG4iKTsgYnJlYWs7CisJCVNBTSgiLUVBRERSTk9UQVZBSUxcbiIpOyBicmVhazsKIAl9CiAJY2FzZSAtRU5PQlVGUzogewotCQlTQVkoIi1FTk9CVUZTXG4iKTsgYnJlYWs7CisJCVNBTSgiLUVOT0JVRlNcbiIpOyBicmVhazsKIAl9CiAJY2FzZSAtRUlTQ09OTjogewotCQlTQVkoIi1FSVNDT05OXG4iKTsgYnJlYWs7CisJCVNBTSgiLUVJU0NPTk5cbiIpOyBicmVhazsKIAl9CiAJY2FzZSAtRU5PVENPTk46IHsKLQkJU0FZKCItRU5PVENPTk5cbiIpOyBicmVhazsKKwkJU0FNKCItRU5PVENPTk5cbiIpOyBicmVhazsKIAl9CiAJY2FzZSAtRVNIVVRET1dOOiB7Ci0JCVNBWSgiLUVTSFVURE9XTlxuIik7IGJyZWFrOworCQlTQU0oIi1FU0hVVERPV05cbiIpOyBicmVhazsKIAl9CiAJY2FzZSAtRU5PRU5UOiB7Ci0JCVNBWSgiLUVOT0VOVFxuIik7IGJyZWFrOworCQlTQU0oIi1FTk9FTlRcbiIpOyBicmVhazsKIAl9CiAJY2FzZSAtRUNPTk5SRVNFVDogewotCQlTQVkoIi1FQ09OTlJFU0VUXG4iKTsgYnJlYWs7CisJCVNBTSgiLUVDT05OUkVTRVRcbiIpOyBicmVhazsKIAl9CiAJY2FzZSAtRU5PU1BDOiB7Ci0JCVNBWSgiRU5PU1BDXG4iKTsgYnJlYWs7CisJCVNBTSgiRU5PU1BDXG4iKTsgYnJlYWs7CiAJfQogCWRlZmF1bHQ6IHsKLQkJU0FZKCJ1bmtub3duIGVycm9yIGNvZGUgMHglMDhYXG4iLCBwdXJiLT5zdGF0dXMpOyBicmVhazsKKwkJU0FNKCJ1bmtub3duIGVycm9yIGNvZGUgMHglMDhYXG4iLCBwdXJiLT5zdGF0dXMpOyBicmVhazsKIAl9CiAJfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMjYzOCw3ICszMDY0LDcgQEAKIAkJCQlzdHJjcHkoJmVycmJ1ZlswXSwgIi1FQ09OTlJFU0VUIik7IGJyZWFrOwogCQkJfQogCQkJY2FzZSAtRU5PU1BDOiB7Ci0JCQkJU0FZKCJFTk9TUENcbiIpOyBicmVhazsKKwkJCQlTQU0oIkVOT1NQQ1xuIik7IGJyZWFrOwogCQkJfQogCQkJY2FzZSAtRVNIVVRET1dOOiB7CiAJCQkJc3RyY3B5KCZlcnJidWZbMF0sICItRVNIVVRET1dOIik7IGJyZWFrOwpAQCAtMjY1Myw3ICszMDc5LDcgQEAKIAkJZnJhbWVhY3R1YWwgPSBwdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5hY3R1YWxfbGVuZ3RoOwogCQlmcmFtZW9mZnNldCA9IHB1cmItPmlzb19mcmFtZV9kZXNjW2ldLm9mZnNldDsKIAotCQlKT1QoMTYsICJmcmFtZVslMmldOiIgXAorCQlKT00oMTYsICJmcmFtZVslMmldOiIgXAogCQkJCSIlNGk9c3RhdHVzICIgIFwKIAkJCQkiJTRpPWFjdHVhbCAiICBcCiAJCQkJIiU0aT1sZW5ndGggIiAgXApAQCAtMjY2NywxOSArMzA5MywyMCBAQAogCQkJCVBBR0VfU0laRSkgKyBcCiAJCQkJKGludCkocGZpZWxkX2J1ZmZlci0+cHRvIC0gcGZpZWxkX2J1ZmZlci0+cGdvKTsKIAkJaWYgKDQgPT0gbW9yZSkKLQkJCW10Kys7CisJCQlwZWFzeWNhcC0+dmlkZW9fbXQrKzsKIAkJaWYgKDQgPCBtb3JlKSB7Ci0JCQlpZiAobXQpIHsKLQkJCQlKT1QoOCwgIiU0aSBlbXB0eSB2aWRlbyB1cmIgZnJhbWVzXG4iLCBtdCk7Ci0JCQkJbXQgPSAwOworCQkJaWYgKHBlYXN5Y2FwLT52aWRlb19tdCkgeworCQkJCUpPTSg4LCAiJTRpIGVtcHR5IHZpZGVvIHVyYiBmcmFtZXNcbiIsIFwKKwkJCQkJCQlwZWFzeWNhcC0+dmlkZW9fbXQpOworCQkJCXBlYXN5Y2FwLT52aWRlb19tdCA9IDA7CiAJCQl9CiAJCQlpZiAoRklFTERfQlVGRkVSX01BTlkgPD0gcGVhc3ljYXAtPmZpZWxkX2ZpbGwpIHsKLQkJCQlTQVkoIkVSUk9SOiBiYWQgcGVhc3ljYXAtPmZpZWxkX2ZpbGxcbiIpOworCQkJCVNBTSgiRVJST1I6IGJhZCBwZWFzeWNhcC0+ZmllbGRfZmlsbFxuIik7CiAJCQkJcmV0dXJuOwogCQkJfQogCQkJaWYgKEZJRUxEX0JVRkZFUl9TSVpFL1BBR0VfU0laRSA8PSBcCiAJCQkJCQkJcGVhc3ljYXAtPmZpZWxkX3BhZ2UpIHsKLQkJCQlTQVkoIkVSUk9SOiBiYWQgcGVhc3ljYXAtPmZpZWxkX3BhZ2VcbiIpOworCQkJCVNBTSgiRVJST1I6IGJhZCBwZWFzeWNhcC0+ZmllbGRfcGFnZVxuIik7CiAJCQkJcmV0dXJuOwogCQkJfQogCQkJcGZpZWxkX2J1ZmZlciA9ICZwZWFzeWNhcC0+ZmllbGRfYnVmZmVyXApAQCAtMjcxMiwxMSArMzEzOSwxMyBAQAogCQkJCQkJcGVhc3ljYXAtPnZpZGVvZmllbGRhbW91bnQpIHsKIAkJCQkJaWYgKDIgPT0gdmlkZW9maWVsZGFtb3VudCAtIFwKIAkJCQkJCQlwZWFzeWNhcC0+XAotCQkJCQkJCXZpZGVvZmllbGRhbW91bnQpCisJCQkJCQkJdmlkZW9maWVsZGFtb3VudCkgewogCQkJCQkJKHBlYXN5Y2FwLT5maWVsZF9idWZmZXJcCiAJCQkJCQlbcGVhc3ljYXAtPmZpZWxkX2ZpbGxdXAogCQkJCQkJCVswXS5rb3VudCkgfD0gMHgwMTAwOwotCQkJCQllbHNlCisJCQkJCQlwZWFzeWNhcC0+dmlkZW9fanVuayArPSAoMSArIFwKKwkJCQkJCQlWSURFT19KVU5LX1RPTEVSQVRFKTsKKwkJCQkJfSBlbHNlCiAJCQkJCQkocGVhc3ljYXAtPmZpZWxkX2J1ZmZlclwKIAkJCQkJCVtwZWFzeWNhcC0+ZmllbGRfZmlsbF1cCiAJCQkJCQkJWzBdLmtvdW50KSB8PSAweDQwMDA7CkBAIC0yNzI3LDUzICszMTU2LDc0IEBACiAJCQkJCQlbcGVhc3ljYXAtPmZpZWxkX2ZpbGxdXAogCQkJCQkJCVswXS5rb3VudCkgfD0gMHgyMDAwOwogCQkJCQl9Ci0JCQkJaWYgKCEoMHhGRjAwICYgcGVhc3ljYXAtPmZpZWxkX2J1ZmZlclwKKwkJCQkJYmFkID0gMHhGRjAwICYgcGVhc3ljYXAtPmZpZWxkX2J1ZmZlclwKIAkJCQkJCVtwZWFzeWNhcC0+ZmllbGRfZmlsbF1cCi0JCQkJCQlbMF0ua291bnQpKSB7Ci0JCQkJCShwZWFzeWNhcC0+dmlkZW9fanVuayktLTsKLQkJCQkJaWYgKC0xNiA+IHBlYXN5Y2FwLT52aWRlb19qdW5rKQotCQkJCQkJcGVhc3ljYXAtPnZpZGVvX2p1bmsgPSAtMTY7Ci0JCQkJCXBlYXN5Y2FwLT5maWVsZF9yZWFkID0gXAorCQkJCQkJWzBdLmtvdW50OworCQkJCQlpZiAoIWJhZCkgeworCQkJCQkJKHBlYXN5Y2FwLT52aWRlb19qdW5rKS0tOworCQkJCQkJaWYgKC1WSURFT19KVU5LX1RPTEVSQVRFID4gXAorCQkJCQkJCXBlYXN5Y2FwLT52aWRlb19qdW5rKSBcCisJCQkJCQkJcGVhc3ljYXAtPnZpZGVvX2p1bmsgPVwKKwkJCQkJCQktVklERU9fSlVOS19UT0xFUkFURTsKKwkJCQkJCXBlYXN5Y2FwLT5maWVsZF9yZWFkID0gXAogCQkJCQkJCShwZWFzeWNhcC0+XAogCQkJCQkJCQlmaWVsZF9maWxsKSsrOwotCi0JCQkJCWlmIChGSUVMRF9CVUZGRVJfTUFOWSA8PSBcCi0JCQkJCQlwZWFzeWNhcC0+ZmllbGRfZmlsbCkKLQkJCQkJCXBlYXN5Y2FwLT5maWVsZF9maWxsID0gMDsKLQkJCQkJcGVhc3ljYXAtPmZpZWxkX3BhZ2UgPSAwOwotCQkJCQlwZmllbGRfYnVmZmVyID0gJnBlYXN5Y2FwLT5cCi0JCQkJCQlmaWVsZF9idWZmZXJcCi0JCQkJCQlbcGVhc3ljYXAtPmZpZWxkX2ZpbGxdXAotCQkJCQkJW3BlYXN5Y2FwLT5maWVsZF9wYWdlXTsKLQkJCQkJcGZpZWxkX2J1ZmZlci0+cHRvID0gXAorCQkJCQkJaWYgKEZJRUxEX0JVRkZFUl9NQU5ZIDw9IFwKKwkJCQkJCQkJcGVhc3ljYXAtPlwKKwkJCQkJCQkJZmllbGRfZmlsbCkKKwkJCQkJCQlwZWFzeWNhcC0+XAorCQkJCQkJCQlmaWVsZF9maWxsID0gMDsKKwkJCQkJCXBlYXN5Y2FwLT5maWVsZF9wYWdlID0gMDsKKwkJCQkJCXBmaWVsZF9idWZmZXIgPSAmcGVhc3ljYXAtPlwKKwkJCQkJCQlmaWVsZF9idWZmZXJcCisJCQkJCQkJW3BlYXN5Y2FwLT5cCisJCQkJCQkJZmllbGRfZmlsbF1cCisJCQkJCQkJW3BlYXN5Y2FwLT5cCisJCQkJCQkJZmllbGRfcGFnZV07CisJCQkJCQlwZmllbGRfYnVmZmVyLT5wdG8gPSBcCiAJCQkJCQkJcGZpZWxkX2J1ZmZlci0+cGdvOwotCi0JCQkJCUpPVCg4LCAiYnVtcGVkIHRvOiAlaT1wZWFzeWNhcC0+IiBcCi0JCQkJCQkiZmllbGRfZmlsbCAgJWk9cGFyaXR5XG4iLCBcCi0JCQkJCQlwZWFzeWNhcC0+ZmllbGRfZmlsbCwgXAotCQkJCQkJMHgwMEZGICYgcGZpZWxkX2J1ZmZlci0+a291bnQpOwotCQkJCQlKT1QoOCwgImZpZWxkIGJ1ZmZlciAlaSBoYXMgJWkgIiBcCi0JCQkJCQkiYnl0ZXMgZml0IHRvIGJlIHJlYWRcbiIsIFwKLQkJCQkJCXBlYXN5Y2FwLT5maWVsZF9yZWFkLCBcCi0JCQkJCQl2aWRlb2ZpZWxkYW1vdW50KTsKLQkJCQkJSk9UKDgsICJ3YWtldXAgY2FsbCB0byB3cV92aWRlbywgIiBcCi0JCQkJCQkiJWk9ZmllbGRfcmVhZCAlaT1maWVsZF9maWxsICJcCi0JCQkJCQkiJWk9cGFyaXR5XG4iLCBcCi0JCQkJCQlwZWFzeWNhcC0+ZmllbGRfcmVhZCwgXAotCQkJCQkJcGVhc3ljYXAtPmZpZWxkX2ZpbGwsIFwKLQkJCQkJCTB4MDBGRiAmIHBlYXN5Y2FwLT5cCi0JCQkJCQlmaWVsZF9idWZmZXJbcGVhc3ljYXAtPlwKLQkJCQkJCWZpZWxkX3JlYWRdWzBdLmtvdW50KTsKLQkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCYocGVhc3ljYXAtPlwKLQkJCQkJCQkJd3FfdmlkZW8pKTsKLQkJCQkJZG9fZ2V0dGltZW9mZGF5KCZwZWFzeWNhcC0+dGltZXZhbDcpOworCQkJCQkJSk9NKDgsICJidW1wZWQgdG86ICVpPSJcCisJCQkJCQkJInBlYXN5Y2FwLT4iIFwKKwkJCQkJCQkiZmllbGRfZmlsbCAgJWk9IlwKKwkJCQkJCQkicGFyaXR5XG4iLCBcCisJCQkJCQkJcGVhc3ljYXAtPmZpZWxkX2ZpbGwsIFwKKwkJCQkJCQkweDAwRkYgJiBcCisJCQkJCQkJcGZpZWxkX2J1ZmZlci0+a291bnQpOworCQkJCQkJSk9NKDgsICJmaWVsZCBidWZmZXIgJWkgaGFzICJcCisJCQkJCQkJIiVpIGJ5dGVzIGZpdCB0byBiZSAiXAorCQkJCQkJCSJyZWFkXG4iLCBcCisJCQkJCQkJcGVhc3ljYXAtPmZpZWxkX3JlYWQsIFwKKwkJCQkJCQl2aWRlb2ZpZWxkYW1vdW50KTsKKwkJCQkJCUpPTSg4LCAid2FrZXVwIGNhbGwgdG8gIlwKKwkJCQkJCQkid3FfdmlkZW8sICIgXAorCQkJCQkJCSIlaT1maWVsZF9yZWFkICJcCisJCQkJCQkJIiVpPWZpZWxkX2ZpbGwgIlwKKwkJCQkJCQkiJWk9cGFyaXR5XG4iLCBcCisJCQkJCQkJcGVhc3ljYXAtPmZpZWxkX3JlYWQsIFwKKwkJCQkJCQlwZWFzeWNhcC0+ZmllbGRfZmlsbCwgXAorCQkJCQkJCTB4MDBGRiAmIHBlYXN5Y2FwLT5cCisJCQkJCQkJZmllbGRfYnVmZmVyXAorCQkJCQkJCVtwZWFzeWNhcC0+XAorCQkJCQkJCWZpZWxkX3JlYWRdWzBdLmtvdW50KTsKKwkJCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZVwKKwkJCQkJCQkoJihwZWFzeWNhcC0+XAorCQkJCQkJCQkgd3FfdmlkZW8pKTsKKwkJCQkJCWRvX2dldHRpbWVvZmRheVwKKwkJCQkJCQkoJnBlYXN5Y2FwLT50aW1ldmFsNyk7CiAJCQkJCX0gZWxzZSB7CiAJCQkJCXBlYXN5Y2FwLT52aWRlb19qdW5rKys7Ci0JCQkJCUpPVCg4LCAiZmllbGQgYnVmZmVyICVpIGhhZCAlaSAiIFwKLQkJCQkJCSJieXRlcywgbm93IGRpc2NhcmRlZFxuIiwgXAorCQkJCQlpZiAoYmFkICYgMHgwMDEwKSBcCisJCQkJCQlwZWFzeWNhcC0+dmlkZW9fanVuayArPSBcCisJCQkJCQkoMSArIFZJREVPX0pVTktfVE9MRVJBVEUvMik7CisJCQkJCUpPTSg4LCAiZmllbGQgYnVmZmVyICVpIGhhZCAlaSAiIFwKKwkJCQkJCSJieXRlcywgbm93IGRpc2NhcmRlZDogIlwKKwkJCQkJCSIweCUwNFhcbiIsIFwKIAkJCQkJCXBlYXN5Y2FwLT5maWVsZF9maWxsLCBcCi0JCQkJCQl2aWRlb2ZpZWxkYW1vdW50KTsKLQorCQkJCQkJdmlkZW9maWVsZGFtb3VudCxcCisJCQkJCQkoMHhGRjAwICYgXAorCQkJCQkJcGVhc3ljYXAtPmZpZWxkX2J1ZmZlclwKKwkJCQkJCVtwZWFzeWNhcC0+ZmllbGRfZmlsbF1bMF0uXAorCQkJCQkJa291bnQpKTsKIAkJCQkJKHBlYXN5Y2FwLT5maWVsZF9maWxsKSsrOwogCiAJCQkJCWlmIChGSUVMRF9CVUZGRVJfTUFOWSA8PSBcCkBAIC0yNzg3LDIwICszMjM3LDIyIEBACiAJCQkJCXBmaWVsZF9idWZmZXItPnB0byA9IFwKIAkJCQkJCQlwZmllbGRfYnVmZmVyLT5wZ287CiAKLQkJCQkJSk9UKDgsICJidW1wZWQgdG86ICVpPXBlYXN5Y2FwLT4iIFwKKwkJCQkJSk9NKDgsICJidW1wZWQgdG86ICVpPXBlYXN5Y2FwLT4iIFwKIAkJCQkJCSJmaWVsZF9maWxsICAlaT1wYXJpdHlcbiIsIFwKIAkJCQkJCXBlYXN5Y2FwLT5maWVsZF9maWxsLCBcCiAJCQkJCQkweDAwRkYgJiBwZmllbGRfYnVmZmVyLT5rb3VudCk7CiAJCQkJfQogCQkJCWlmICg4ID09IG1vcmUpIHsKLQkJCQkJSk9UKDgsICJlbmQtb2YtZmllbGQ6IHJlY2VpdmVkICIgXAorCQkJCQlKT00oOCwgImVuZC1vZi1maWVsZDogcmVjZWl2ZWQgIiBcCiAJCQkJCQkicGFyaXR5IGJ5dGUgMHglMDJYXG4iLCBcCiAJCQkJCQkoMHhGRiAmICpwdSkpOwogCQkJCQlpZiAoMHg0MCAmICpwdSkKIAkJCQkJCXBmaWVsZF9idWZmZXItPmtvdW50ID0gMHgwMDAwOwogCQkJCQllbHNlCiAJCQkJCQlwZmllbGRfYnVmZmVyLT5rb3VudCA9IDB4MDAwMTsKLQkJCQkJSk9UKDgsICJlbmQtb2YtZmllbGQ6IDB4JTAyWD1rb3VudFxuIixcCisJCQkJCXBmaWVsZF9idWZmZXItPmlucHV0ID0gMHgwOCB8IFwKKwkJCQkJCSgweDA3ICYgcGVhc3ljYXAtPmlucHV0KTsKKwkJCQkJSk9NKDgsICJlbmQtb2YtZmllbGQ6IDB4JTAyWD1rb3VudFxuIixcCiAJCQkJCQkweEZGICYgcGZpZWxkX2J1ZmZlci0+a291bnQpOwogCQkJCX0KIAkJCX0KQEAgLTI4MTMsMTIgKzMyNjUsMTIgQEAKIAkJCW1vcmUgLT0gbGVhcDsKIAogCQkJaWYgKEZJRUxEX0JVRkZFUl9NQU5ZIDw9IHBlYXN5Y2FwLT5maWVsZF9maWxsKSB7Ci0JCQkJU0FZKCJFUlJPUjogYmFkIHBlYXN5Y2FwLT5maWVsZF9maWxsXG4iKTsKKwkJCQlTQU0oIkVSUk9SOiBiYWQgcGVhc3ljYXAtPmZpZWxkX2ZpbGxcbiIpOwogCQkJCXJldHVybjsKIAkJCX0KIAkJCWlmIChGSUVMRF9CVUZGRVJfU0laRS9QQUdFX1NJWkUgPD0gXAogCQkJCQkJCXBlYXN5Y2FwLT5maWVsZF9wYWdlKSB7Ci0JCQkJU0FZKCJFUlJPUjogYmFkIHBlYXN5Y2FwLT5maWVsZF9wYWdlXG4iKTsKKwkJCQlTQU0oIkVSUk9SOiBiYWQgcGVhc3ljYXAtPmZpZWxkX3BhZ2VcbiIpOwogCQkJCXJldHVybjsKIAkJCX0KIAkJCXBmaWVsZF9idWZmZXIgPSAmcGVhc3ljYXAtPmZpZWxkX2J1ZmZlclwKQEAgLTI4MjksNyArMzI4MSw3IEBACiAJCQkJCQlbcGVhc3ljYXAtPmZpZWxkX3BhZ2VdOwogCQkJCWlmIChQQUdFX1NJWkUgPCAocGZpZWxkX2J1ZmZlci0+cHRvIC0gXAogCQkJCQkJCXBmaWVsZF9idWZmZXItPnBnbykpIHsKLQkJCQkJU0FZKCJFUlJPUjogYmFkIHBmaWVsZF9idWZmZXItPnB0b1xuIik7CisJCQkJCVNBTSgiRVJST1I6IGJhZCBwZmllbGRfYnVmZmVyLT5wdG9cbiIpOwogCQkJCQlyZXR1cm47CiAJCQkJfQogCQkJCWlmIChQQUdFX1NJWkUgPT0gKHBmaWVsZF9idWZmZXItPnB0byAtIFwKQEAgLTI4MzcsNyArMzI4OSw3IEBACiAJCQkJCShwZWFzeWNhcC0+ZmllbGRfcGFnZSkrKzsKIAkJCQkJaWYgKEZJRUxEX0JVRkZFUl9TSVpFL1BBR0VfU0laRSA8PSBcCiAJCQkJCQkJcGVhc3ljYXAtPmZpZWxkX3BhZ2UpIHsKLQkJCQkJCUpPVCgxNiwgIndyYXBwaW5nIHBlYXN5Y2FwLT4iIFwKKwkJCQkJCUpPTSgxNiwgIndyYXBwaW5nIHBlYXN5Y2FwLT4iIFwKIAkJCQkJCQkiZmllbGRfcGFnZVxuIik7CiAJCQkJCQlwZWFzeWNhcC0+ZmllbGRfcGFnZSA9IDA7CiAJCQkJCX0KQEAgLTI4NDcsNiArMzI5OSwxNSBAQAogCQkJCQkJCVtwZWFzeWNhcC0+ZmllbGRfcGFnZV07CiAJCQkJCXBmaWVsZF9idWZmZXItPnB0byA9IFwKIAkJCQkJCQlwZmllbGRfYnVmZmVyLT5wZ287CisJCQkJCXBmaWVsZF9idWZmZXItPmlucHV0ID0gMHgwOCB8IFwKKwkJCQkJCSgweDA3ICYgcGVhc3ljYXAtPmlucHV0KTsKKwkJCQkJaWYgKChwZWFzeWNhcC0+ZmllbGRfYnVmZmVyW3BlYXN5Y2FwLT5cCisJCQkJCQkJZmllbGRfZmlsbF1bMF0pLlwKKwkJCQkJCQkJaW5wdXQgIT0gXAorCQkJCQkJCXBmaWVsZF9idWZmZXItPmlucHV0KQorCQkJCQkJKHBlYXN5Y2FwLT5maWVsZF9idWZmZXJcCisJCQkJCQkJW3BlYXN5Y2FwLT5maWVsZF9maWxsXVwKKwkJCQkJCQlbMF0pLmtvdW50IHw9IDB4MTAwMDsKIAkJCQl9CiAKIAkJCQltdWNoID0gUEFHRV9TSVpFIC0gKGludCkocGZpZWxkX2J1ZmZlci0+cHRvIC0gXApAQCAtMjg2NSw1NSArMzMyNiw2IEBACiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgotICoKLSAqCi0gKiAgICAgICAgICAgICAqKiogVU5ERVIgREVWRUxPUE1FTlQvVEVTVElORyAtIE5PVCBSRUFEWSBZRVQhICoqKgotICoKLSAqCi0gKgotICogIFZJREVPVEFQRVMgTUFZIEhBVkUgQkVFTiBNQU5VQUxMWSBQQVVTRUQgQU5EIFJFU1RBUlRFRCBEVVJJTkcgUkVDT1JESU5HLgotICogIFRISVMgQ0FVU0VTIExPU1MgT0YgU1lOQywgQ09ORlVTSU5HIERPV05TVFJFQU0gVVNFUlNQQUNFIFBST0dSQU1TIFdISUNICi0gKiAgTUFZIElOVEVSUFJFVCBUSEUgSU5URVJSVVBUSU9OIEFTIEEgU1lNUFRPTSBPRiBMQVRFTkNZLiAgVE8gT1ZFUkNPTUUgVEhJUwotICogIFRIRSBEUklWRVIgQlJJREdFUyBUSEUgSElBVFVTIEJZIFNFTkRJTkcgRFVNTVkgVklERU8gRlJBTUVTIEFUIFJPVUdITFkKLSAqICBUSEUgUklHSFQgVElNRSBJTlRFUlZBTFMgSU4gVEhFIEhPUEUgT0YgUEVSU1VBRElORyBUSEUgRE9XTlNUUkVBTSBVU0VSU1BBQ0UKLSAqICBQUk9HUkFNIFRPIFJFU1VNRSBOT1JNQUwgU0VSVklDRSBXSEVOIFRIRSBJTlRFUlJVUFRJT04gSVMgT1ZFUi4KLSAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmIGRlZmluZWQoQlJJREdFUikKLWRvX2dldHRpbWVvZmRheSgmdGltZXZhbCk7Ci1pZiAocGVhc3ljYXAtPnRpbWV2YWw3LnR2X3NlYykgewotCXVzZWMgPSAxMDAwMDAwKih0aW1ldmFsLnR2X3NlYyAgLSBwZWFzeWNhcC0+dGltZXZhbDcudHZfc2VjKSArIFwKLQkJCSh0aW1ldmFsLnR2X3VzZWMgLSBwZWFzeWNhcC0+dGltZXZhbDcudHZfdXNlYyk7Ci0JaWYgKHVzZWMgPiAocGVhc3ljYXAtPnVzZWMgKyBwZWFzeWNhcC0+dG9sZXJhdGUpKSB7Ci0JCUpPVCg4LCAiYnJpZGdpbmcgaGlhdHVzXG4iKTsKLQkJcGVhc3ljYXAtPnZpZGVvX2p1bmsgPSAwOwotCQlwZWFzeWNhcC0+ZmllbGRfYnVmZmVyW3BlYXN5Y2FwLT5maWVsZF9maWxsXVswXS5rb3VudCB8PSAweDA0MDA7Ci0KLQkJcGVhc3ljYXAtPmZpZWxkX3JlYWQgPSAocGVhc3ljYXAtPmZpZWxkX2ZpbGwpKys7Ci0KLQkJaWYgKEZJRUxEX0JVRkZFUl9NQU5ZIDw9IHBlYXN5Y2FwLT5maWVsZF9maWxsKSBcCi0JCQkJCQlwZWFzeWNhcC0+ZmllbGRfZmlsbCA9IDA7Ci0JCXBlYXN5Y2FwLT5maWVsZF9wYWdlID0gMDsKLQkJcGZpZWxkX2J1ZmZlciA9ICZwZWFzeWNhcC0+ZmllbGRfYnVmZmVyXAotCQkJCVtwZWFzeWNhcC0+ZmllbGRfZmlsbF1bcGVhc3ljYXAtPmZpZWxkX3BhZ2VdOwotCQlwZmllbGRfYnVmZmVyLT5wdG8gPSBwZmllbGRfYnVmZmVyLT5wZ287Ci0KLQkJSk9UKDgsICJidW1wZWQgdG86ICVpPXBlYXN5Y2FwLT5maWVsZF9maWxsICAlaT1wYXJpdHlcbiIsIFwKLQkJCXBlYXN5Y2FwLT5maWVsZF9maWxsLCAweDAwRkYgJiBwZmllbGRfYnVmZmVyLT5rb3VudCk7Ci0JCUpPVCg4LCAiZmllbGQgYnVmZmVyICVpIGhhcyAlaSBieXRlcyB0byBiZSBvdmVyd3JpdHRlblxuIiwgXAotCQkJcGVhc3ljYXAtPmZpZWxkX3JlYWQsIHZpZGVvZmllbGRhbW91bnQpOwotCQlKT1QoOCwgIndha2V1cCBjYWxsIHRvIHdxX3ZpZGVvLCAiIFwKLQkJCSIlaT1maWVsZF9yZWFkICVpPWZpZWxkX2ZpbGwgJWk9cGFyaXR5XG4iLCBcCi0JCQlwZWFzeWNhcC0+ZmllbGRfcmVhZCwgcGVhc3ljYXAtPmZpZWxkX2ZpbGwsIFwKLQkJCTB4MDBGRiAmIFwKLQkJCXBlYXN5Y2FwLT5maWVsZF9idWZmZXJbcGVhc3ljYXAtPmZpZWxkX3JlYWRdWzBdLmtvdW50KTsKLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCYocGVhc3ljYXAtPndxX3ZpZGVvKSk7Ci0JCWRvX2dldHRpbWVvZmRheSgmcGVhc3ljYXAtPnRpbWV2YWw3KTsKLQl9Ci19Ci0jZW5kaWYgLypCUklER0VSKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qCiAgKiAgUkVTVUJNSVQgVEhJUyBVUkIsIFVOTEVTUyBBIFNFVkVSRSBQRVJTSVNURU5UIEVSUk9SIENPTkRJVElPTiBFWElTVFMuCiAgKgogICogIElGIFRIRSBXQUlUIFFVRVVFUyBBUkUgTk9UIENMRUFSRUQgSU4gUkVTUE9OU0UgVE8gQU4gRVJST1IgQ09ORElUSU9OCkBAIC0yOTIxLDUxICszMzMzLDU3IEBACiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIGlmIChWSURFT19JU09DX0JVRkZFUl9NQU5ZIDw9IHBlYXN5Y2FwLT52aWRlb19qdW5rKSB7Ci0JU0FZKCJlYXN5Y2FwIGRyaXZlciBzaHV0dGluZyBkb3duIG9uIGNvbmRpdGlvbiBncmVlblxuIik7CisJU0FNKCJlYXN5Y2FwIGRyaXZlciBzaHV0dGluZyBkb3duIG9uIGNvbmRpdGlvbiBncmVlblxuIik7CisJcGVhc3ljYXAtPnN0YXR1cyA9IDE7CiAJcGVhc3ljYXAtPnZpZGVvX2VvZiA9IDE7CisJcGVhc3ljYXAtPnZpZGVvX2p1bmsgPSAwOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcGVhc3ljYXAtPndxX3ZpZGVvKTsKKyNpZiAhZGVmaW5lZChQRVJTRVZFUkUpCiAJcGVhc3ljYXAtPmF1ZGlvX2VvZiA9IDE7Ci0JcGVhc3ljYXAtPnZpZGVvX2p1bmsgPSAtVklERU9fSVNPQ19CVUZGRVJfTUFOWTsKLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJihwZWFzeWNhcC0+d3FfdmlkZW8pKTsKLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJihwZWFzeWNhcC0+d3FfYXVkaW8pKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBlYXN5Y2FwLT53cV9hdWRpbyk7CisjZW5kaWYgLypQRVJTRVZFUkUqLwogCXJldHVybjsKIH0KIGlmIChwZWFzeWNhcC0+dmlkZW9faXNvY19zdHJlYW1pbmcpIHsKIAlyYyA9IHVzYl9zdWJtaXRfdXJiKHB1cmIsIEdGUF9BVE9NSUMpOwogCWlmICgwICE9IHJjKSB7Ci0JCVNBWSgiRVJST1I6IHdoaWxlICVpPXZpZGVvX2lkbGUsIHVzYl9zdWJtaXRfdXJiKCkgZmFpbGVkICIgXAotCQkJCQkid2l0aCByYzpcbiIsIHBlYXN5Y2FwLT52aWRlb19pZGxlKTsKIAkJc3dpdGNoIChyYykgewogCQljYXNlIC1FTk9NRU06IHsKLQkJCVNBWSgiRU5PTUVNXG4iKTsgYnJlYWs7CisJCQlTQU0oIkVOT01FTVxuIik7IGJyZWFrOwogCQl9CiAJCWNhc2UgLUVOT0RFVjogewotCQkJU0FZKCJFTk9ERVZcbiIpOyBicmVhazsKKwkJCVNBTSgiRU5PREVWXG4iKTsgYnJlYWs7CiAJCX0KIAkJY2FzZSAtRU5YSU86IHsKLQkJCVNBWSgiRU5YSU9cbiIpOyBicmVhazsKKwkJCVNBTSgiRU5YSU9cbiIpOyBicmVhazsKIAkJfQogCQljYXNlIC1FSU5WQUw6IHsKLQkJCVNBWSgiRUlOVkFMXG4iKTsgYnJlYWs7CisJCQlTQU0oIkVJTlZBTFxuIik7IGJyZWFrOwogCQl9CiAJCWNhc2UgLUVBR0FJTjogewotCQkJU0FZKCJFQUdBSU5cbiIpOyBicmVhazsKKwkJCVNBTSgiRUFHQUlOXG4iKTsgYnJlYWs7CiAJCX0KIAkJY2FzZSAtRUZCSUc6IHsKLQkJCVNBWSgiRUZCSUdcbiIpOyBicmVhazsKKwkJCVNBTSgiRUZCSUdcbiIpOyBicmVhazsKIAkJfQogCQljYXNlIC1FUElQRTogewotCQkJU0FZKCJFUElQRVxuIik7IGJyZWFrOworCQkJU0FNKCJFUElQRVxuIik7IGJyZWFrOwogCQl9CiAJCWNhc2UgLUVNU0dTSVpFOiB7Ci0JCQlTQVkoIkVNU0dTSVpFXG4iKTsgIGJyZWFrOworCQkJU0FNKCJFTVNHU0laRVxuIik7ICBicmVhazsKIAkJfQogCQljYXNlIC1FTk9TUEM6IHsKLQkJCVNBWSgiRU5PU1BDXG4iKTsgYnJlYWs7CisJCQlTQU0oIkVOT1NQQ1xuIik7IGJyZWFrOwogCQl9CiAJCWRlZmF1bHQ6IHsKLQkJCVNBWSgiMHglMDhYXG4iLCByYyk7IGJyZWFrOworCQkJU0FNKCIweCUwOFhcbiIsIHJjKTsgYnJlYWs7CiAJCX0KIAkJfQorCQlpZiAoLUVOT0RFViAhPSByYykgXAorCQkJU0FNKCJFUlJPUjogd2hpbGUgJWk9dmlkZW9faWRsZSwgIiBcCisJCQkJCQkidXNiX3N1Ym1pdF91cmIoKSAiIFwKKwkJCQkJCSJmYWlsZWQgd2l0aCByYzpcbiIsIFwKKwkJCQkJCXBlYXN5Y2FwLT52aWRlb19pZGxlKTsKIAl9CiB9CiByZXR1cm47CkBAIC0yOTc3LDggKzMzOTUsOCBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYTUUKICAqCiAgKgotICogIFRISVMgRlVOQ1RJT04gQVNTVU1FUyBUSEFULCBPTiBFQUNIIEFORCBFVkVSWSBPQ0NBU0lPTiBUSEFUIFRIRSBERVZJQ0UgSVMKLSAqICBQSFlTSUNBTExZIFBMVUdHRUQgSU4sIElOVEVSRkFDRSAwIElTIFBST0JFRCBGSVJTVC4KKyAqICBUSElTIEZVTkNUSU9OIEFTU1VNRVMgVEhBVCwgT04gRUFDSCBBTkQgRVZFUlkgT0NDQVNJT04gVEhBVCBUSEUgRWFzeUNBUAorICogIElTIFBIWVNJQ0FMTFkgUExVR0dFRCBJTiwgSU5URVJGQUNFIDAgSVMgUFJPQkVEIEZJUlNULgogICogIElGIFRISVMgSVMgTk9UIFRSVUUsIFRIRVJFIElTIFRIRSBQT1NTSUJJTElUWSBPRiBBTiBPb3BzLgogICoKICAqICBUSElTIEhBUyBORVZFUiBCRUVOIEEgUFJPQkxFTSBJTiBQUkFDVElDRSwgQlVUIFNPTUVUSElORyBTRUVNUyBXUk9ORyBIRVJFLgpAQCAtMjk5NCw3ICszNDEyLDcgQEAKIHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgKnB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3I7CiBzdHJ1Y3QgdXNiX2ludGVyZmFjZV9hc3NvY19kZXNjcmlwdG9yICpwdXNiX2ludGVyZmFjZV9hc3NvY19kZXNjcmlwdG9yOwogc3RydWN0IHVyYiAqcHVyYjsKLXN0YXRpYyBzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXAgLyo9TlVMTCovOworc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwOwogc3RydWN0IGRhdGFfdXJiICpwZGF0YV91cmI7CiBzaXplX3Qgd01heFBhY2tldFNpemU7CiBpbnQgSVNPQ3dNYXhQYWNrZXRTaXplOwpAQCAtMzAwNCwxOSArMzQyMiwzMiBAQAogX191OCBiRW5kcG9pbnRBZGRyZXNzOwogX191OCBJU09DYkVuZHBvaW50QWRkcmVzczsKIF9fdTggSU5UYkVuZHBvaW50QWRkcmVzczsKLWludCBpc2luLCBpLCBqLCBrLCBtOworaW50IGlzaW4sIGksIGosIGssIG0sIHJjOwogX191OCBiSW50ZXJmYWNlTnVtYmVyOwogX191OCBiSW50ZXJmYWNlQ2xhc3M7CiBfX3U4IGJJbnRlcmZhY2VTdWJDbGFzczsKIHZvaWQgKnBidWY7CiBpbnQgb2thbHRbOF0sIGlzb2thbHQ7Ci1pbnQgb2tlcG5bOF0sIGlzb2tlcG47Ci1pbnQgb2ttcHNbOF0sIGlzb2ttcHM7CitpbnQgb2tlcG5bOF07CitpbnQgb2ttcHNbOF07CiBpbnQgbWF4cGFja2V0c2l6ZTsKLWludCByYzsKK19fdTE2IG1hc2s7CitfX3MzMiB2YWx1ZTsKK3N0cnVjdCBlYXN5Y2FwX2Zvcm1hdCAqcGVhc3ljYXBfZm9ybWF0OwogCiBKT1QoNCwgIlxuIik7CiAKK2lmICghZG9uZ2xlX2RvbmUpIHsKKwlkb25nbGVfZG9uZSA9IDE7CisJZm9yIChrID0gMDsgayA8IERPTkdMRV9NQU5ZOyBrKyspIHsKKwkJZWFzeWNhcF9kb25nbGVba10ucGVhc3ljYXAgPSAoc3RydWN0IGVhc3ljYXAgKilOVUxMOworCQltdXRleF9pbml0KCZlYXN5Y2FwX2RvbmdsZVtrXS5tdXRleF92aWRlbyk7CisJCW11dGV4X2luaXQoJmVhc3ljYXBfZG9uZ2xlW2tdLm11dGV4X2F1ZGlvKTsKKwl9Cit9CisKK3BlYXN5Y2FwID0gKHN0cnVjdCBlYXN5Y2FwICopTlVMTDsKKwogaWYgKChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqKU5VTEwgPT0gcHVzYl9pbnRlcmZhY2UpIHsKIAlTQVkoIkVSUk9SOiBwdXNiX2ludGVyZmFjZSBpcyBOVUxMXG4iKTsKIAlyZXR1cm4gLUVGQVVMVDsKQEAgLTMxMTcsNDYgKzM1NDgsODMgQEAKIC8qCiAgKiAgQSBORVcgc3RydWN0IGVhc3ljYXAgSVMgQUxXQVlTIEFMTE9DQVRFRCBXSEVOIElOVEVSRkFDRSAwIElTIFBST0JFRC4KICAqICBJVCBJUyBOT1QgUE9TU0lCTEUgSEVSRSBUTyBGUkVFIEFOWSBFWElTVElORyBzdHJ1Y3QgZWFzeWNhcC4gIFRISVMKLSAqICBTSE9VTEQgSEFWRSBCRUVOIERPTkUgQlkgZWFzeWNhcF9kZWxldGUoKSBXSEVOIFRIRSBERVZJQ0UgV0FTIFBIWVNJQ0FMTFkKLSAqICBVTlBMVUdHRUQuCi0gKi8KKyAqICBTSE9VTEQgSEFWRSBCRUVOIERPTkUgQlkgZWFzeWNhcF9kZWxldGUoKSBXSEVOIFRIRSBFYXN5Q0FQIFdBUworICogIFBIWVNJQ0FMTFkgVU5QTFVHR0VELgorICoKKyAqICBUSEUgUE9JTlRFUiBwZWFzeWNhcCBUTyBUSEUgc3RydWN0IGVhc3ljYXAgSVMgUkVNRU1CRVJFRCBXSEVOCisgKiAgSU5URVJGQUNFUyAxIEFORCAyIEFSRSBQUk9CRUQuCisgKgorICogIElGIFRXTyBFYXN5Q0FQcyBBUkUgUExVR0dFRCBJTiBORUFSTFkgU0lNVUxUQU5FT1VTTFkgVEhFUkUgV0lMTAorICogIEJFIFRST1VCTEUuICBCRVdBUkUuCisqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogaWYgKDAgPT0gYkludGVyZmFjZU51bWJlcikgewogCXBlYXN5Y2FwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGVhc3ljYXApLCBHRlBfS0VSTkVMKTsKIAlpZiAoTlVMTCA9PSBwZWFzeWNhcCkgewogCQlTQVkoIkVSUk9SOiBDb3VsZCBub3QgYWxsb2NhdGUgcGVhc3ljYXBcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKLQl9IGVsc2UgewotCQlwZWFzeWNhcC0+YWxsb2NhdGlvbl92aWRlb19zdHJ1Y3QgPSBzaXplb2Yoc3RydWN0IGVhc3ljYXApOwotCQlwZWFzeWNhcC0+YWxsb2NhdGlvbl92aWRlb19wYWdlID0gMDsKLQkJcGVhc3ljYXAtPmFsbG9jYXRpb25fdmlkZW9fdXJiID0gMDsKLQkJcGVhc3ljYXAtPmFsbG9jYXRpb25fYXVkaW9fc3RydWN0ID0gMDsKLQkJcGVhc3ljYXAtPmFsbG9jYXRpb25fYXVkaW9fcGFnZSA9IDA7Ci0JCXBlYXN5Y2FwLT5hbGxvY2F0aW9uX2F1ZGlvX3VyYiA9IDA7CiAJfQorCVNBTSgiYWxsb2NhdGVkIDB4JTA4bFg9cGVhc3ljYXBcbiIsICh1bnNpZ25lZCBsb25nIGludCkgcGVhc3ljYXApOworLyp2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYqLworI2lmIGRlZmluZWQoRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQpCisJU0FNKCJ3aGVyZSAgICAgMHglMDhsWD0mcGVhc3ljYXAtPnZpZGVvX2RldmljZVxuIiwgXAorCQkJCSh1bnNpZ25lZCBsb25nIGludCkgJnBlYXN5Y2FwLT52aWRlb19kZXZpY2UpOworI2lmIGRlZmluZWQoRUFTWUNBUF9ORUVEU19WNEwyX0RFVklDRV9IKQorCVNBTSgiYW5kICAgICAgIDB4JTA4bFg9JnBlYXN5Y2FwLT52NGwyX2RldmljZVxuIiwgXAorCQkJCSh1bnNpZ25lZCBsb25nIGludCkgJnBlYXN5Y2FwLT52NGwyX2RldmljZSk7CisjZW5kaWYgLypFQVNZQ0FQX05FRURTX1Y0TDJfREVWSUNFX0gqLworI2VuZGlmIC8qRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQqLworLypeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4qLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKLSAqICBJTklUSUFMSVpFIFRIRSBORVcgZWFzeWNhcCBTVFJVQ1RVUkUuCi0gKiAgTk8gUEFSQU1FVEVSUyBBUkUgU1BFQ0lGSUVEIEhFUkUgUkVRVUlSSU5HIFRIRSBTRVRUSU5HIE9GIFJFR0lTVEVSUy4KLSAqICBUSEFUIElTIERPTkUgRklSU1QgQlkgZWFzeWNhcF9vcGVuKCkgQU5EIExBVEVSIEJZIGVhc3ljYXBfaW9jdGwoKS4KLSAqLworICogIFBFUkZPUk0gVVJHRU5UIElOVElBTElaQVRJT05TIC4uLgorKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQlwZWFzeWNhcC0+cHVzYl9kZXZpY2UgPSBwdXNiX2RldmljZTsKLQlwZWFzeWNhcC0+cHVzYl9pbnRlcmZhY2UgPSBwdXNiX2ludGVyZmFjZTsKLQorCXN0cmNweSgmcGVhc3ljYXAtPnRlbGx0YWxlWzBdLCBURUxMVEFMRSk7CiAJa3JlZl9pbml0KCZwZWFzeWNhcC0+a3JlZik7Ci0JSk9UKDgsICJpbnRmWyVpXTogYWZ0ZXIga3JlZl9pbml0KC4uLl92aWRlbykgIiBcCisJSk9NKDgsICJpbnRmWyVpXTogYWZ0ZXIga3JlZl9pbml0KC4uLl92aWRlbykgIiBcCiAJCQkiJWk9cGVhc3ljYXAtPmtyZWYucmVmY291bnQuY291bnRlclxuIiwgXAogCQkJYkludGVyZmFjZU51bWJlciwgcGVhc3ljYXAtPmtyZWYucmVmY291bnQuY291bnRlcik7CiAKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCYocGVhc3ljYXAtPndxX3ZpZGVvKSk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmKHBlYXN5Y2FwLT53cV9hdWRpbykpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBlYXN5Y2FwLT53cV92aWRlbyk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcGVhc3ljYXAtPndxX2F1ZGlvKTsKIAotCW11dGV4X2luaXQoJihwZWFzeWNhcC0+bXV0ZXhfdGltZXZhbDApKTsKLQltdXRleF9pbml0KCYocGVhc3ljYXAtPm11dGV4X3RpbWV2YWwxKSk7CisJZm9yIChkb25nbGVfdGhpcyA9IDA7IGRvbmdsZV90aGlzIDwgRE9OR0xFX01BTlk7IGRvbmdsZV90aGlzKyspIHsKKwkJaWYgKE5VTEwgPT0gZWFzeWNhcF9kb25nbGVbZG9uZ2xlX3RoaXNdLnBlYXN5Y2FwKSB7CisJCQlpZiAoMCA9PSBtdXRleF9pc19sb2NrZWQoJmVhc3ljYXBfZG9uZ2xlXAorCQkJCQkJW2RvbmdsZV90aGlzXS5tdXRleF92aWRlbykpIHsKKwkJCQlpZiAoMCA9PSBtdXRleF9pc19sb2NrZWQoJmVhc3ljYXBfZG9uZ2xlXAorCQkJCQkJW2RvbmdsZV90aGlzXS5tdXRleF9hdWRpbykpIHsKKwkJCQkJZWFzeWNhcF9kb25nbGVcCisJCQkJCQlbZG9uZ2xlX3RoaXNdLnBlYXN5Y2FwID0gXAorCQkJCQkJCQlwZWFzeWNhcDsKKwkJCQkJSk9NKDgsICJpbnRmWyVpXTogcGVhc3ljYXAtLT5lYXN5Y2FwIiBcCisJCQkJCQkiX2RvbmdsZVslaV0ucGVhc3ljYXBcbiIsIFwKKwkJCQkJCWJJbnRlcmZhY2VOdW1iZXIsIGRvbmdsZV90aGlzKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWlmIChET05HTEVfTUFOWSA8PSBkb25nbGVfdGhpcykgeworCQlTQU0oIkVSUk9SOiB0b28gbWFueSBkb25nbGVzXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQogCi0JZm9yIChrID0gMDsgayA8IEZSQU1FX0JVRkZFUl9NQU5ZOyBrKyspCi0JCW11dGV4X2luaXQoJihwZWFzeWNhcC0+bXV0ZXhfbW1hcF92aWRlb1trXSkpOworCXBlYXN5Y2FwLT5hbGxvY2F0aW9uX3ZpZGVvX3N0cnVjdCA9IHNpemVvZihzdHJ1Y3QgZWFzeWNhcCk7CisJcGVhc3ljYXAtPmFsbG9jYXRpb25fdmlkZW9fcGFnZSA9IDA7CisJcGVhc3ljYXAtPmFsbG9jYXRpb25fdmlkZW9fdXJiID0gMDsKKwlwZWFzeWNhcC0+YWxsb2NhdGlvbl9hdWRpb19zdHJ1Y3QgPSAwOworCXBlYXN5Y2FwLT5hbGxvY2F0aW9uX2F1ZGlvX3BhZ2UgPSAwOworCXBlYXN5Y2FwLT5hbGxvY2F0aW9uX2F1ZGlvX3VyYiA9IDA7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgLi4uIEFORCBGVVJUSEVSIElOSVRJQUxJWkUgVEhFIFNUUlVDVFVSRQorKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlwZWFzeWNhcC0+cHVzYl9kZXZpY2UgPSBwdXNiX2RldmljZTsKKwlwZWFzeWNhcC0+cHVzYl9pbnRlcmZhY2UgPSBwdXNiX2ludGVyZmFjZTsKIAogCXBlYXN5Y2FwLT5pbGsgPSAwOwogCXBlYXN5Y2FwLT5taWNyb3Bob25lID0gZmFsc2U7CkBAIC0zMTc3LDQ2ICszNjQ1LDE3MiBAQAogCiAJcGVhc3ljYXAtPmZyYW1lX2J1ZmZlcl9tYW55ID0gRlJBTUVfQlVGRkVSX01BTlk7CiAKLQlpZiAoKHN0cnVjdCBtdXRleCAqKU5VTEwgPT0gJihwZWFzeWNhcC0+bXV0ZXhfbW1hcF92aWRlb1swXSkpIHsKLQkJU0FZKCJFUlJPUjogJihwZWFzeWNhcC0+bXV0ZXhfbW1hcF92aWRlb1slaV0pIGlzIE5VTExcbiIsIDApOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9CisJZm9yIChrID0gMDsgayA8IElOUFVUX01BTlk7IGsrKykKKwkJcGVhc3ljYXAtPmxvc3Rba10gPSAwOworCXBlYXN5Y2FwLT5za2lwID0gMDsKKwlwZWFzeWNhcC0+c2tpcHBlZCA9IDA7CisJcGVhc3ljYXAtPm9mZmVyZmllbGRzID0gMDsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qCi0gKiAgRFlOQU1JQ0FMTFkgRklMTCBJTiBUSEUgQVZBSUxBQkxFIEZPUk1BVFMuCisgKiAgRFlOQU1JQ0FMTFkgRklMTCBJTiBUSEUgQVZBSUxBQkxFIEZPUk1BVFMgLi4uCiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAlyYyA9IGZpbGxpbl9mb3JtYXRzKCk7CiAJaWYgKDAgPiByYykgewotCQlTQVkoIkVSUk9SOiBmaWxsaW5fZm9ybWF0cygpIHJldHVybmVkICVpXG4iLCByYyk7CisJCVNBTSgiRVJST1I6IGZpbGxpbl9mb3JtYXRzKCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQotCUpPVCg0LCAiJWkgZm9ybWF0cyBhdmFpbGFibGVcbiIsIHJjKTsKLQl9IGVsc2UgeworCUpPTSg0LCAiJWkgZm9ybWF0cyBhdmFpbGFibGVcbiIsIHJjKTsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQkJaWYgKChzdHJ1Y3QgZWFzeWNhcCAqKU5VTEwgPT0gcGVhc3ljYXApIHsKLQkJCVNBWSgiRVJST1I6IHBlYXN5Y2FwIGlzIE5VTEwgIiBcCi0JCQkJCSJ3aGVuIHByb2JpbmcgaW50ZXJmYWNlICVpXG4iLCBcCi0JCQkJCQkJYkludGVyZmFjZU51bWJlcik7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKKy8qCisgKiAgLi4uIEFORCBQT1BVTEFURSBlYXN5Y2FwLmlucHV0c2V0W10KKyovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJZm9yIChrID0gMDsgayA8IElOUFVUX01BTlk7IGsrKykgeworCQlwZWFzeWNhcC0+aW5wdXRzZXRba10uaW5wdXRfb2sgPSAwOworCQlwZWFzeWNhcC0+aW5wdXRzZXRba10uc3RhbmRhcmRfb2Zmc2V0X29rID0gMDsKKwkJcGVhc3ljYXAtPmlucHV0c2V0W2tdLmZvcm1hdF9vZmZzZXRfb2sgPSAwOworCQlwZWFzeWNhcC0+aW5wdXRzZXRba10uYnJpZ2h0bmVzc19vayA9IDA7CisJCXBlYXN5Y2FwLT5pbnB1dHNldFtrXS5jb250cmFzdF9vayA9IDA7CisJCXBlYXN5Y2FwLT5pbnB1dHNldFtrXS5zYXR1cmF0aW9uX29rID0gMDsKKwkJcGVhc3ljYXAtPmlucHV0c2V0W2tdLmh1ZV9vayA9IDA7CisJfQorCWlmICh0cnVlID09IHBlYXN5Y2FwLT5udHNjKSB7CisJCWkgPSAwOworCQltID0gMDsKKwkJbWFzayA9IDA7CisJCXdoaWxlICgweEZGRkYgIT0gZWFzeWNhcF9zdGFuZGFyZFtpXS5tYXNrKSB7CisJCQlpZiAoTlRTQ19NID09IGVhc3ljYXBfc3RhbmRhcmRbaV0uXAorCQkJCQkJCXY0bDJfc3RhbmRhcmQuaW5kZXgpIHsKKwkJCQltKys7CisJCQkJZm9yIChrID0gMDsgayA8IElOUFVUX01BTlk7IGsrKykgeworCQkJCQlwZWFzeWNhcC0+aW5wdXRzZXRba10uXAorCQkJCQkJCXN0YW5kYXJkX29mZnNldCA9IGk7CisJCQkJfQorCQkJbWFzayA9IGVhc3ljYXBfc3RhbmRhcmRbaV0ubWFzazsKKwkJCX0KKwkJCWkrKzsKIAkJfQorCX0gZWxzZSB7CisJCWkgPSAwOworCQltID0gMDsKKwkJbWFzayA9IDA7CisJCXdoaWxlICgweEZGRkYgIT0gZWFzeWNhcF9zdGFuZGFyZFtpXS5tYXNrKSB7CisJCQlpZiAoUEFMX0JHSElOID09IGVhc3ljYXBfc3RhbmRhcmRbaV0uXAorCQkJCQkJCXY0bDJfc3RhbmRhcmQuaW5kZXgpIHsKKwkJCQltKys7CisJCQkJZm9yIChrID0gMDsgayA8IElOUFVUX01BTlk7IGsrKykgeworCQkJCQlwZWFzeWNhcC0+aW5wdXRzZXRba10uXAorCQkJCQkJCXN0YW5kYXJkX29mZnNldCA9IGk7CisJCQkJfQorCQkJbWFzayA9IGVhc3ljYXBfc3RhbmRhcmRbaV0ubWFzazsKKwkJCX0KKwkJCWkrKzsKKwkJfQorCX0KIAotCUpPVCg4LCAia3JlZl9nZXQoKSB3aXRoICVpPXBlYXN5Y2FwLT5rcmVmLnJlZmNvdW50LmNvdW50ZXJcbiIsIFwKLQkJCQkJKGludClwZWFzeWNhcC0+a3JlZi5yZWZjb3VudC5jb3VudGVyKTsKLQlrcmVmX2dldCgmcGVhc3ljYXAtPmtyZWYpOworCWlmICgxICE9IG0pIHsKKwkJU0FNKCJNSVNUQUtFOiBlYXN5Y2FwLmlucHV0c2V0W10uc3RhbmRhcmRfb2Zmc2V0ICIgXAorCQkJCQkJInVucG9wdWxhdGVkLCAlaT1tXG4iLCBtKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJcGVhc3ljYXBfZm9ybWF0ID0gJmVhc3ljYXBfZm9ybWF0WzBdOworCWkgPSAwOworCW0gPSAwOworCXdoaWxlICgwICE9IHBlYXN5Y2FwX2Zvcm1hdC0+djRsMl9mb3JtYXQuZm10LnBpeC53aWR0aCkgeworCQlpZiAoKChwZWFzeWNhcF9mb3JtYXQtPm1hc2sgJiAweDBGKSA9PSAobWFzayAmIDB4MEYpKSAmJiBcCisJCQkJKHBlYXN5Y2FwX2Zvcm1hdC0+XAorCQkJCQl2NGwyX2Zvcm1hdC5mbXQucGl4LmZpZWxkID09IFwKKwkJCQkJCQlWNEwyX0ZJRUxEX05PTkUpICYmIFwKKwkJCQkocGVhc3ljYXBfZm9ybWF0LT5cCisJCQkJCXY0bDJfZm9ybWF0LmZtdC5waXgucGl4ZWxmb3JtYXQgPT0gXAorCQkJCQkJCVY0TDJfUElYX0ZNVF9VWVZZKSAmJiBcCisJCQkJKHBlYXN5Y2FwX2Zvcm1hdC0+XAorCQkJCQl2NGwyX2Zvcm1hdC5mbXQucGl4LndpZHRoICA9PSBcCisJCQkJCQkJNjQwKSAmJiBcCisJCQkJKHBlYXN5Y2FwX2Zvcm1hdC0+XAorCQkJCQl2NGwyX2Zvcm1hdC5mbXQucGl4LmhlaWdodCA9PSA0ODApKSB7CisJCQltKys7CisJCQlmb3IgKGsgPSAwOyBrIDwgSU5QVVRfTUFOWTsgaysrKQorCQkJCXBlYXN5Y2FwLT5pbnB1dHNldFtrXS5mb3JtYXRfb2Zmc2V0ID0gaTsKKwkJCWJyZWFrOworCQl9CisJcGVhc3ljYXBfZm9ybWF0Kys7CisJaSsrOworCX0KKwlpZiAoMSAhPSBtKSB7CisJCVNBTSgiTUlTVEFLRTogZWFzeWNhcC5pbnB1dHNldFtdLmZvcm1hdF9vZmZzZXQgdW5wb3B1bGF0ZWRcbiIpOworCXJldHVybiAtRU5PRU5UOworCX0KKworCWkgPSAwOworCW0gPSAwOworCXdoaWxlICgweEZGRkZGRkZGICE9IGVhc3ljYXBfY29udHJvbFtpXS5pZCkgeworCQl2YWx1ZSA9IGVhc3ljYXBfY29udHJvbFtpXS5kZWZhdWx0X3ZhbHVlOworCQlpZiAoVjRMMl9DSURfQlJJR0hUTkVTUyA9PSBlYXN5Y2FwX2NvbnRyb2xbaV0uaWQpIHsKKwkJCW0rKzsKKwkJCWZvciAoayA9IDA7IGsgPCBJTlBVVF9NQU5ZOyBrKyspCisJCQkJcGVhc3ljYXAtPmlucHV0c2V0W2tdLmJyaWdodG5lc3MgPSB2YWx1ZTsKKwkJfSBlbHNlIGlmIChWNEwyX0NJRF9DT05UUkFTVCA9PSBlYXN5Y2FwX2NvbnRyb2xbaV0uaWQpIHsKKwkJCW0rKzsKKwkJCWZvciAoayA9IDA7IGsgPCBJTlBVVF9NQU5ZOyBrKyspCisJCQkJcGVhc3ljYXAtPmlucHV0c2V0W2tdLmNvbnRyYXN0ID0gdmFsdWU7CisJCX0gZWxzZSBpZiAoVjRMMl9DSURfU0FUVVJBVElPTiA9PSBlYXN5Y2FwX2NvbnRyb2xbaV0uaWQpIHsKKwkJCW0rKzsKKwkJCWZvciAoayA9IDA7IGsgPCBJTlBVVF9NQU5ZOyBrKyspCisJCQkJcGVhc3ljYXAtPmlucHV0c2V0W2tdLnNhdHVyYXRpb24gPSB2YWx1ZTsKKwkJfSBlbHNlIGlmIChWNEwyX0NJRF9IVUUgPT0gZWFzeWNhcF9jb250cm9sW2ldLmlkKSB7CisJCQltKys7CisJCQlmb3IgKGsgPSAwOyBrIDwgSU5QVVRfTUFOWTsgaysrKQorCQkJCXBlYXN5Y2FwLT5pbnB1dHNldFtrXS5odWUgPSB2YWx1ZTsKKwkJfQorCQlpKys7CisJfQorCWlmICg0ICE9IG0pIHsKKwkJU0FNKCJNSVNUQUtFOiBlYXN5Y2FwLmlucHV0c2V0W10uYnJpZ2h0bmVzcywuLi4gIiBcCisJCQkJCQkidW5kZXJwb3B1bGF0ZWRcbiIpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisJZm9yIChrID0gMDsgayA8IElOUFVUX01BTlk7IGsrKykKKwkJcGVhc3ljYXAtPmlucHV0c2V0W2tdLmlucHV0ID0gazsKKwlKT00oNCwgInBvcHVsYXRlZCBlYXN5Y2FwLmlucHV0c2V0W11cbiIpOworCUpPTSg0LCAiZmluaXNoZWQgaW5pdGlhbGl6YXRpb25cbiIpOworfSBlbHNlIHsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkvKgorCSAqICBGT1IgSU5URVJGQUNFUyAxIEFORCAyIFRIRSBQT0lOVEVSIHBlYXN5Y2FwIElTIE9CVEFJTkVEIEJZIEFTU1VNSU5HCisJICogIFRIQVQgZG9uZ2xlX3RoaXMgSEFTIE5PVCBDSEFOR0VEIFNJTkNFIElOVEVSRkFDRSAwIFdBUyBQUk9CRUQuICBJRgorCSAqICBUSElTIElTIE5PVCBUSEUgQ0FTRSwgRk9SIEVYQU1QTEUgV0hFTiBUV08gRUFTWUNBUHMgQVJFIFBMVUdHRUQgSU4KKwkgKiAgU0lNVUxUQU5FT1VTTFksIFRIRVJFIFdJTEwgQkUgU0VSSU9VUyBUUk9VQkxFLgorCSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJaWYgKCgwID4gZG9uZ2xlX3RoaXMpIHx8IChET05HTEVfTUFOWSA8PSBkb25nbGVfdGhpcykpIHsKKwkJU0FZKCJFUlJPUjogYmFkIGRvbmdsZSBjb3VudFxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlwZWFzeWNhcCA9IGVhc3ljYXBfZG9uZ2xlW2RvbmdsZV90aGlzXS5wZWFzeWNhcDsKKwlKT1QoOCwgImludGZbJWldOiBlYXN5Y2FwX2RvbmdsZVslaV0ucGVhc3ljYXAtLT5wZWFzeWNhcFxuIiwgXAorCQkJCQkJYkludGVyZmFjZU51bWJlciwgZG9uZ2xlX3RoaXMpOworCisJaWYgKChzdHJ1Y3QgZWFzeWNhcCAqKU5VTEwgPT0gcGVhc3ljYXApIHsKKwkJU0FZKCJFUlJPUjogcGVhc3ljYXAgaXMgTlVMTCB3aGVuIHByb2JpbmcgaW50ZXJmYWNlICVpXG4iLCBcCisJCQkJCQkJYkludGVyZmFjZU51bWJlcik7CisJCXJldHVybiAtRUZBVUxUOworCX0KIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIGlmICgoVVNCX0NMQVNTX1ZJREVPID09IGJJbnRlcmZhY2VDbGFzcykgfHwgXAotCShVU0JfQ0xBU1NfVkVORE9SX1NQRUMgPT0gYkludGVyZmFjZUNsYXNzKSkgeworCQkoVVNCX0NMQVNTX1ZFTkRPUl9TUEVDID09IGJJbnRlcmZhY2VDbGFzcykpIHsKIAlpZiAoLTEgPT0gcGVhc3ljYXAtPnZpZGVvX2ludGVyZmFjZSkgewogCQlwZWFzeWNhcC0+dmlkZW9faW50ZXJmYWNlID0gYkludGVyZmFjZU51bWJlcjsKLQkJSk9UKDQsICJzZXR0aW5nIHBlYXN5Y2FwLT52aWRlb19pbnRlcmZhY2U9JWlcbiIsIFwKKwkJSk9NKDQsICJzZXR0aW5nIHBlYXN5Y2FwLT52aWRlb19pbnRlcmZhY2U9JWlcbiIsIFwKIAkJCQkJCXBlYXN5Y2FwLT52aWRlb19pbnRlcmZhY2UpOwogCX0gZWxzZSB7CiAJCWlmIChwZWFzeWNhcC0+dmlkZW9faW50ZXJmYWNlICE9IGJJbnRlcmZhY2VOdW1iZXIpIHsKLQkJCVNBWSgiRVJST1I6IGF0dGVtcHRpbmcgdG8gcmVzZXQgIiBcCisJCQlTQU0oIkVSUk9SOiBhdHRlbXB0aW5nIHRvIHJlc2V0ICIgXAogCQkJCQkicGVhc3ljYXAtPnZpZGVvX2ludGVyZmFjZVxuIik7Ci0JCQlTQVkoIi4uLi4uLiBjb250aW51aW5nIHdpdGggIiBcCisJCQlTQU0oIi4uLi4uLiBjb250aW51aW5nIHdpdGggIiBcCiAJCQkJCSIlaT1wZWFzeWNhcC0+dmlkZW9faW50ZXJmYWNlXG4iLCBcCiAJCQkJCXBlYXN5Y2FwLT52aWRlb19pbnRlcmZhY2UpOwogCQl9CkBAIC0zMjI1LDEzICszODE5LDEzIEBACiAJCQkJCQkoMHgwMiA9PSBiSW50ZXJmYWNlU3ViQ2xhc3MpKSB7CiAJaWYgKC0xID09IHBlYXN5Y2FwLT5hdWRpb19pbnRlcmZhY2UpIHsKIAkJcGVhc3ljYXAtPmF1ZGlvX2ludGVyZmFjZSA9IGJJbnRlcmZhY2VOdW1iZXI7Ci0JCUpPVCg0LCAic2V0dGluZyBwZWFzeWNhcC0+YXVkaW9faW50ZXJmYWNlPSVpXG4iLCBcCisJCUpPTSg0LCAic2V0dGluZyBwZWFzeWNhcC0+YXVkaW9faW50ZXJmYWNlPSVpXG4iLCBcCiAJCQkJCQkgcGVhc3ljYXAtPmF1ZGlvX2ludGVyZmFjZSk7CiAJfSBlbHNlIHsKIAkJaWYgKHBlYXN5Y2FwLT5hdWRpb19pbnRlcmZhY2UgIT0gYkludGVyZmFjZU51bWJlcikgewotCQkJU0FZKCJFUlJPUjogYXR0ZW1wdGluZyB0byByZXNldCAiIFwKKwkJCVNBTSgiRVJST1I6IGF0dGVtcHRpbmcgdG8gcmVzZXQgIiBcCiAJCQkJCSJwZWFzeWNhcC0+YXVkaW9faW50ZXJmYWNlXG4iKTsKLQkJCVNBWSgiLi4uLi4uIGNvbnRpbnVpbmcgd2l0aCAiIFwKKwkJCVNBTSgiLi4uLi4uIGNvbnRpbnVpbmcgd2l0aCAiIFwKIAkJCQkJIiVpPXBlYXN5Y2FwLT5hdWRpb19pbnRlcmZhY2VcbiIsIFwKIAkJCQkJcGVhc3ljYXAtPmF1ZGlvX2ludGVyZmFjZSk7CiAJCX0KQEAgLTMyNDQsMzcgKzM4MzgsMzUgQEAKICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogaXNva2FsdCA9IDA7Ci1pc29rZXBuID0gMDsKLWlzb2ttcHMgPSAwOwogCiBmb3IgKGkgPSAwOyBpIDwgcHVzYl9pbnRlcmZhY2UtPm51bV9hbHRzZXR0aW5nOyBpKyspIHsKIAlwdXNiX2hvc3RfaW50ZXJmYWNlID0gJihwdXNiX2ludGVyZmFjZS0+YWx0c2V0dGluZ1tpXSk7CiAJaWYgKChzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICopTlVMTCA9PSBwdXNiX2hvc3RfaW50ZXJmYWNlKSB7Ci0JCVNBWSgiRVJST1I6IHB1c2JfaG9zdF9pbnRlcmZhY2UgaXMgTlVMTFxuIik7CisJCVNBTSgiRVJST1I6IHB1c2JfaG9zdF9pbnRlcmZhY2UgaXMgTlVMTFxuIik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAlwdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yID0gJihwdXNiX2hvc3RfaW50ZXJmYWNlLT5kZXNjKTsKIAlpZiAoKHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgKilOVUxMID09IFwKIAkJCQkJCXB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IpIHsKLQkJU0FZKCJFUlJPUjogcHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciBpcyBOVUxMXG4iKTsKKwkJU0FNKCJFUlJPUjogcHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciBpcyBOVUxMXG4iKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCi0JSk9UKDQsICJpbnRmWyVpXWFsdFslaV06IGRlc2MuYkRlc2NyaXB0b3JUeXBlPTB4JTAyWFxuIiwgXAorCUpPTSg0LCAiaW50ZlslaV1hbHRbJWldOiBkZXNjLmJEZXNjcmlwdG9yVHlwZT0weCUwMlhcbiIsIFwKIAliSW50ZXJmYWNlTnVtYmVyLCBpLCBwdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yLT5iRGVzY3JpcHRvclR5cGUpOwotCUpPVCg0LCAiaW50ZlslaV1hbHRbJWldOiBkZXNjLmJJbnRlcmZhY2VOdW1iZXI9MHglMDJYXG4iLCBcCisJSk9NKDQsICJpbnRmWyVpXWFsdFslaV06IGRlc2MuYkludGVyZmFjZU51bWJlcj0weCUwMlhcbiIsIFwKIAliSW50ZXJmYWNlTnVtYmVyLCBpLCBwdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yLT5iSW50ZXJmYWNlTnVtYmVyKTsKLQlKT1QoNCwgImludGZbJWldYWx0WyVpXTogZGVzYy5iQWx0ZXJuYXRlU2V0dGluZz0weCUwMlhcbiIsIFwKKwlKT00oNCwgImludGZbJWldYWx0WyVpXTogZGVzYy5iQWx0ZXJuYXRlU2V0dGluZz0weCUwMlhcbiIsIFwKIAliSW50ZXJmYWNlTnVtYmVyLCBpLCBwdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yLT5iQWx0ZXJuYXRlU2V0dGluZyk7Ci0JSk9UKDQsICJpbnRmWyVpXWFsdFslaV06IGRlc2MuYk51bUVuZHBvaW50cz0weCUwMlhcbiIsIFwKKwlKT00oNCwgImludGZbJWldYWx0WyVpXTogZGVzYy5iTnVtRW5kcG9pbnRzPTB4JTAyWFxuIiwgXAogCWJJbnRlcmZhY2VOdW1iZXIsIGksIHB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3ItPmJOdW1FbmRwb2ludHMpOwotCUpPVCg0LCAiaW50ZlslaV1hbHRbJWldOiBkZXNjLmJJbnRlcmZhY2VDbGFzcz0weCUwMlhcbiIsIFwKKwlKT00oNCwgImludGZbJWldYWx0WyVpXTogZGVzYy5iSW50ZXJmYWNlQ2xhc3M9MHglMDJYXG4iLCBcCiAJYkludGVyZmFjZU51bWJlciwgaSwgcHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvci0+YkludGVyZmFjZUNsYXNzKTsKLQlKT1QoNCwgImludGZbJWldYWx0WyVpXTogZGVzYy5iSW50ZXJmYWNlU3ViQ2xhc3M9MHglMDJYXG4iLCBcCisJSk9NKDQsICJpbnRmWyVpXWFsdFslaV06IGRlc2MuYkludGVyZmFjZVN1YkNsYXNzPTB4JTAyWFxuIiwgXAogCWJJbnRlcmZhY2VOdW1iZXIsIGksIHB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3ItPmJJbnRlcmZhY2VTdWJDbGFzcyk7Ci0JSk9UKDQsICJpbnRmWyVpXWFsdFslaV06IGRlc2MuYkludGVyZmFjZVByb3RvY29sPTB4JTAyWFxuIiwgXAorCUpPTSg0LCAiaW50ZlslaV1hbHRbJWldOiBkZXNjLmJJbnRlcmZhY2VQcm90b2NvbD0weCUwMlhcbiIsIFwKIAliSW50ZXJmYWNlTnVtYmVyLCBpLCBwdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yLT5iSW50ZXJmYWNlUHJvdG9jb2wpOwotCUpPVCg0LCAiaW50ZlslaV1hbHRbJWldOiBkZXNjLmlJbnRlcmZhY2U9MHglMDJYXG4iLCBcCisJSk9NKDQsICJpbnRmWyVpXWFsdFslaV06IGRlc2MuaUludGVyZmFjZT0weCUwMlhcbiIsIFwKIAliSW50ZXJmYWNlTnVtYmVyLCBpLCBwdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yLT5pSW50ZXJmYWNlKTsKIAogCUlTT0N3TWF4UGFja2V0U2l6ZSA9IC0xOwpAQCAtMzI4NSw4NiArMzg3Nyw4MCBAQAogCUlOVGJFbmRwb2ludEFkZHJlc3MgPSAwOwogCiAJaWYgKDAgPT0gcHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvci0+Yk51bUVuZHBvaW50cykKLQkJCQlKT1QoNCwgImludGZbJWldYWx0WyVpXSBoYXMgbm8gZW5kcG9pbnRzXG4iLCBcCisJCQkJSk9NKDQsICJpbnRmWyVpXWFsdFslaV0gaGFzIG5vIGVuZHBvaW50c1xuIiwgXAogCQkJCQkJCWJJbnRlcmZhY2VOdW1iZXIsIGkpOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCWZvciAoaiA9IDA7IGogPCBwdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yLT5iTnVtRW5kcG9pbnRzOyBqKyspIHsKIAkJcGVwZCA9ICYocHVzYl9ob3N0X2ludGVyZmFjZS0+ZW5kcG9pbnRbal0uZGVzYyk7CiAJCWlmICgoc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICopTlVMTCA9PSBwZXBkKSB7Ci0JCQlTQVkoIkVSUk9SOiAgcGVwZCBpcyBOVUxMLlxuIik7Ci0JCQlTQVkoIi4uLi4uLiBza2lwcGluZ1xuIik7CisJCQlTQU0oIkVSUk9SOiAgcGVwZCBpcyBOVUxMLlxuIik7CisJCQlTQU0oIi4uLi4uLiBza2lwcGluZ1xuIik7CiAJCQljb250aW51ZTsKIAkJfQogCQl3TWF4UGFja2V0U2l6ZSA9IGxlMTZfdG9fY3B1KHBlcGQtPndNYXhQYWNrZXRTaXplKTsKIAkJYkVuZHBvaW50QWRkcmVzcyA9IHBlcGQtPmJFbmRwb2ludEFkZHJlc3M7CiAKLQkJSk9UKDQsICJpbnRmWyVpXWFsdFslaV1lbmRbJWldOiBiRW5kcG9pbnRBZGRyZXNzPTB4JVhcbiIsIFwKKwkJSk9NKDQsICJpbnRmWyVpXWFsdFslaV1lbmRbJWldOiBiRW5kcG9pbnRBZGRyZXNzPTB4JVhcbiIsIFwKIAkJCQliSW50ZXJmYWNlTnVtYmVyLCBpLCBqLCBcCiAJCQkJcGVwZC0+YkVuZHBvaW50QWRkcmVzcyk7Ci0JCUpPVCg0LCAiaW50ZlslaV1hbHRbJWldZW5kWyVpXTogYm1BdHRyaWJ1dGVzPTB4JVhcbiIsIFwKKwkJSk9NKDQsICJpbnRmWyVpXWFsdFslaV1lbmRbJWldOiBibUF0dHJpYnV0ZXM9MHglWFxuIiwgXAogCQkJCWJJbnRlcmZhY2VOdW1iZXIsIGksIGosIFwKIAkJCQlwZXBkLT5ibUF0dHJpYnV0ZXMpOwotCQlKT1QoNCwgImludGZbJWldYWx0WyVpXWVuZFslaV06IHdNYXhQYWNrZXRTaXplPSVpXG4iLCBcCisJCUpPTSg0LCAiaW50ZlslaV1hbHRbJWldZW5kWyVpXTogd01heFBhY2tldFNpemU9JWlcbiIsIFwKIAkJCQliSW50ZXJmYWNlTnVtYmVyLCBpLCBqLCBcCiAJCQkJcGVwZC0+d01heFBhY2tldFNpemUpOwotCQlKT1QoNCwgImludGZbJWldYWx0WyVpXWVuZFslaV06IGJJbnRlcnZhbD0laVxuIiwKKwkJSk9NKDQsICJpbnRmWyVpXWFsdFslaV1lbmRbJWldOiBiSW50ZXJ2YWw9JWlcbiIsCiAJCQkJYkludGVyZmFjZU51bWJlciwgaSwgaiwgXAogCQkJCXBlcGQtPmJJbnRlcnZhbCk7CiAKIAkJaWYgKHBlcGQtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRElSX0lOKSB7Ci0JCQlKT1QoNCwgImludGZbJWldYWx0WyVpXWVuZFslaV0gaXMgYW4gIElOICBlbmRwb2ludFxuIixcCisJCQlKT00oNCwgImludGZbJWldYWx0WyVpXWVuZFslaV0gaXMgYW4gIElOICBlbmRwb2ludFxuIixcCiAJCQkJCQliSW50ZXJmYWNlTnVtYmVyLCBpLCBqKTsKIAkJCWlzaW4gPSAxOwogCQl9IGVsc2UgewotCQkJSk9UKDQsICJpbnRmWyVpXWFsdFslaV1lbmRbJWldIGlzIGFuICBPVVQgZW5kcG9pbnRcbiIsXAorCQkJSk9NKDQsICJpbnRmWyVpXWFsdFslaV1lbmRbJWldIGlzIGFuICBPVVQgZW5kcG9pbnRcbiIsXAogCQkJCQkJYkludGVyZmFjZU51bWJlciwgaSwgaik7Ci0JCQlTQVkoIkVSUk9SOiBPVVQgZW5kcG9pbnQgdW5leHBlY3RlZFxuIik7Ci0JCQlTQVkoIi4uLi4uLiBjb250aW51aW5nXG4iKTsKKwkJCVNBTSgiRVJST1I6IE9VVCBlbmRwb2ludCB1bmV4cGVjdGVkXG4iKTsKKwkJCVNBTSgiLi4uLi4uIGNvbnRpbnVpbmdcbiIpOwogCQkJaXNpbiA9IDA7CiAJCX0KIAkJaWYgKChwZXBkLT5ibUF0dHJpYnV0ZXMgJiBcCiAJCQkJVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spID09IFwKIAkJCQlVU0JfRU5EUE9JTlRfWEZFUl9JU09DKSB7Ci0JCQlKT1QoNCwgImludGZbJWldYWx0WyVpXWVuZFslaV0gaXMgYW4gSVNPQyBlbmRwb2ludFxuIixcCisJCQlKT00oNCwgImludGZbJWldYWx0WyVpXWVuZFslaV0gaXMgYW4gSVNPQyBlbmRwb2ludFxuIixcCiAJCQkJCQliSW50ZXJmYWNlTnVtYmVyLCBpLCBqKTsKIAkJCWlmIChpc2luKSB7CiAJCQkJc3dpdGNoIChiSW50ZXJmYWNlQ2xhc3MpIHsKIAkJCQljYXNlIFVTQl9DTEFTU19WSURFTzoKIAkJCQljYXNlIFVTQl9DTEFTU19WRU5ET1JfU1BFQzogewogCQkJCQlpZiAoIXBlYXN5Y2FwKSB7Ci0JCQkJCQlTQVkoIk1JU1RBS0U6ICIgXAorCQkJCQkJU0FNKCJNSVNUQUtFOiAiIFwKIAkJCQkJCQkicGVhc3ljYXAgaXMgTlVMTFxuIik7CiAJCQkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCQkJfQogCQkJCQlpZiAocGVwZC0+d01heFBhY2tldFNpemUpIHsKIAkJCQkJCWlmICg4ID4gaXNva2FsdCkgewogCQkJCQkJCW9rYWx0W2lzb2thbHRdID0gaTsKLQkJCQkJCQlKT1QoNCxcCisJCQkJCQkJSk9NKDQsXAogCQkJCQkJCSIlaT1va2FsdFslaV1cbiIsIFwKIAkJCQkJCQlva2FsdFtpc29rYWx0XSwgXAogCQkJCQkJCWlzb2thbHQpOwotCQkJCQkJCWlzb2thbHQrKzsKLQkJCQkJCX0KLQkJCQkJCWlmICg4ID4gaXNva2VwbikgewotCQkJCQkJCW9rZXBuW2lzb2tlcG5dID0gXAorCQkJCQkJCW9rZXBuW2lzb2thbHRdID0gXAogCQkJCQkJCXBlcGQtPlwKIAkJCQkJCQliRW5kcG9pbnRBZGRyZXNzICYgXAogCQkJCQkJCTB4MEY7Ci0JCQkJCQkJSk9UKDQsXAorCQkJCQkJCUpPTSg0LFwKIAkJCQkJCQkiJWk9b2tlcG5bJWldXG4iLCBcCi0JCQkJCQkJb2tlcG5baXNva2Vwbl0sIFwKLQkJCQkJCQlpc29rZXBuKTsKLQkJCQkJCQlpc29rZXBuKys7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoOCA+IGlzb2ttcHMpIHsKLQkJCQkJCQlva21wc1tpc29rbXBzXSA9IFwKKwkJCQkJCQlva2Vwbltpc29rYWx0XSwgXAorCQkJCQkJCWlzb2thbHQpOworCQkJCQkJCW9rbXBzW2lzb2thbHRdID0gXAogCQkJCQkJCWxlMTZfdG9fY3B1KHBlcGQtPlwKIAkJCQkJCQl3TWF4UGFja2V0U2l6ZSk7Ci0JCQkJCQkJSk9UKDQsXAorCQkJCQkJCUpPTSg0LFwKIAkJCQkJCQkiJWk9b2ttcHNbJWldXG4iLCBcCi0JCQkJCQkJb2ttcHNbaXNva21wc10sIFwKLQkJCQkJCQlpc29rbXBzKTsKLQkJCQkJCQlpc29rbXBzKys7CisJCQkJCQkJb2ttcHNbaXNva2FsdF0sIFwKKwkJCQkJCQlpc29rYWx0KTsKKwkJCQkJCQlpc29rYWx0Kys7CiAJCQkJCQl9CiAJCQkJCX0gZWxzZSB7CiAJCQkJCQlpZiAoLTEgPT0gcGVhc3ljYXAtPlwKQEAgLTMzNzIsMTYgKzM5NTgsMTYgQEAKIAkJCQkJCQlwZWFzeWNhcC0+XAogCQkJCQkJCXZpZGVvX2FsdHNldHRpbmdfb2ZmID1cCiAJCQkJCQkJCQkgaTsKLQkJCQkJCQlKT1QoNCwgIiVpPXZpZGVvXyIgXAorCQkJCQkJCUpPTSg0LCAiJWk9dmlkZW9fIiBcCiAJCQkJCQkJImFsdHNldHRpbmdfb2ZmICIgXAogCQkJCQkJCQkiPD09PT1cbiIsIFwKIAkJCQkJCQlwZWFzeWNhcC0+XAogCQkJCQkJCXZpZGVvX2FsdHNldHRpbmdfb2ZmKTsKIAkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJU0FZKCJFUlJPUjogcGVhc3ljYXAiIFwKKwkJCQkJCQlTQU0oIkVSUk9SOiBwZWFzeWNhcCIgXAogCQkJCQkJCSItPnZpZGVvX2FsdHNldHRpbmdfIiBcCiAJCQkJCQkJIm9mZiBhbHJlYWR5IHNldFxuIik7Ci0JCQkJCQkJU0FZKCIuLi4uLi4gIiBcCisJCQkJCQkJU0FNKCIuLi4uLi4gIiBcCiAJCQkJCQkJImNvbnRpbnVpbmcgd2l0aCAiIFwKIAkJCQkJCQkiJWk9cGVhc3ljYXAtPnZpZGVvXyIgXAogCQkJCQkJCSJhbHRzZXR0aW5nX29mZlxuIiwgXApAQCAtMzM5NSwzOSArMzk4MSwzMyBAQAogCQkJCQlpZiAoMHgwMiAhPSBiSW50ZXJmYWNlU3ViQ2xhc3MpCiAJCQkJCQlicmVhazsKIAkJCQkJaWYgKCFwZWFzeWNhcCkgewotCQkJCQkJU0FZKCJNSVNUQUtFOiAiIFwKKwkJCQkJCVNBTSgiTUlTVEFLRTogIiBcCiAJCQkJCQkicGVhc3ljYXAgaXMgTlVMTFxuIik7CiAJCQkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCQkJfQogCQkJCQlpZiAocGVwZC0+d01heFBhY2tldFNpemUpIHsKIAkJCQkJCWlmICg4ID4gaXNva2FsdCkgewogCQkJCQkJCW9rYWx0W2lzb2thbHRdID0gaSA7Ci0JCQkJCQkJSk9UKDQsXAorCQkJCQkJCUpPTSg0LFwKIAkJCQkJCQkiJWk9b2thbHRbJWldXG4iLCBcCiAJCQkJCQkJb2thbHRbaXNva2FsdF0sIFwKIAkJCQkJCQlpc29rYWx0KTsKLQkJCQkJCQlpc29rYWx0Kys7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoOCA+IGlzb2tlcG4pIHsKLQkJCQkJCQlva2Vwbltpc29rZXBuXSA9IFwKKwkJCQkJCQlva2Vwbltpc29rYWx0XSA9IFwKIAkJCQkJCQlwZXBkLT5cCiAJCQkJCQkJYkVuZHBvaW50QWRkcmVzcyAmIFwKIAkJCQkJCQkweDBGOwotCQkJCQkJCUpPVCg0LFwKKwkJCQkJCQlKT00oNCxcCiAJCQkJCQkJIiVpPW9rZXBuWyVpXVxuIiwgXAotCQkJCQkJCW9rZXBuW2lzb2tlcG5dLCBcCi0JCQkJCQkJaXNva2Vwbik7Ci0JCQkJCQkJaXNva2VwbisrOwotCQkJCQkJfQotCQkJCQkJaWYgKDggPiBpc29rbXBzKSB7Ci0JCQkJCQkJb2ttcHNbaXNva21wc10gPSBcCisJCQkJCQkJb2tlcG5baXNva2FsdF0sIFwKKwkJCQkJCQlpc29rYWx0KTsKKwkJCQkJCQlva21wc1tpc29rYWx0XSA9IFwKIAkJCQkJCQlsZTE2X3RvX2NwdShwZXBkLT5cCiAJCQkJCQkJd01heFBhY2tldFNpemUpOwotCQkJCQkJCUpPVCg0LFwKKwkJCQkJCQlKT00oNCxcCiAJCQkJCQkJIiVpPW9rbXBzWyVpXVxuIixcCi0JCQkJCQkJb2ttcHNbaXNva21wc10sIFwKLQkJCQkJCQlpc29rbXBzKTsKLQkJCQkJCQlpc29rbXBzKys7CisJCQkJCQkJb2ttcHNbaXNva2FsdF0sIFwKKwkJCQkJCQlpc29rYWx0KTsKKwkJCQkJCQlpc29rYWx0Kys7CiAJCQkJCQl9CiAJCQkJCX0gZWxzZSB7CiAJCQkJCQlpZiAoLTEgPT0gcGVhc3ljYXAtPlwKQEAgLTM0MzUsMTYgKzQwMTUsMTYgQEAKIAkJCQkJCQlwZWFzeWNhcC0+XAogCQkJCQkJCWF1ZGlvX2FsdHNldHRpbmdfb2ZmID1cCiAJCQkJCQkJCQkgaTsKLQkJCQkJCQlKT1QoNCwgIiVpPWF1ZGlvXyIgXAorCQkJCQkJCUpPTSg0LCAiJWk9YXVkaW9fIiBcCiAJCQkJCQkJImFsdHNldHRpbmdfb2ZmICIgXAogCQkJCQkJCSI8PT09PVxuIiwgXAogCQkJCQkJCXBlYXN5Y2FwLT5cCiAJCQkJCQkJYXVkaW9fYWx0c2V0dGluZ19vZmYpOwogCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlTQVkoIkVSUk9SOiBwZWFzeWNhcCIgXAorCQkJCQkJCVNBTSgiRVJST1I6IHBlYXN5Y2FwIiBcCiAJCQkJCQkJIi0+YXVkaW9fYWx0c2V0dGluZ18iIFwKIAkJCQkJCQkib2ZmIGFscmVhZHkgc2V0XG4iKTsKLQkJCQkJCQlTQVkoIi4uLi4uLiAiIFwKKwkJCQkJCQlTQU0oIi4uLi4uLiAiIFwKIAkJCQkJCQkiY29udGludWluZyB3aXRoICIgXAogCQkJCQkJCSIlaT1wZWFzeWNhcC0+XAogCQkJCQkJCWF1ZGlvX2FsdHNldHRpbmdfIiBcCkBAIC0zNDYyLDE5ICs0MDQyLDE5IEBACiAJCX0gZWxzZSBpZiAoKHBlcGQtPmJtQXR0cmlidXRlcyAmIFwKIAkJCQkJCVVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PVwKIAkJCQkJCVVTQl9FTkRQT0lOVF9YRkVSX0JVTEspIHsKLQkJCUpPVCg0LCAiaW50ZlslaV1hbHRbJWldZW5kWyVpXSBpcyBhICBCVUxLIGVuZHBvaW50XG4iLFwKKwkJCUpPTSg0LCAiaW50ZlslaV1hbHRbJWldZW5kWyVpXSBpcyBhICBCVUxLIGVuZHBvaW50XG4iLFwKIAkJCQkJCWJJbnRlcmZhY2VOdW1iZXIsIGksIGopOwogCQl9IGVsc2UgaWYgKChwZXBkLT5ibUF0dHJpYnV0ZXMgJiBcCiAJCQkJCQlVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgPT1cCiAJCQkJCQlVU0JfRU5EUE9JTlRfWEZFUl9JTlQpIHsKLQkJCUpPVCg0LCAiaW50ZlslaV1hbHRbJWldZW5kWyVpXSBpcyBhbiAgSU5UIGVuZHBvaW50XG4iLFwKKwkJCUpPTSg0LCAiaW50ZlslaV1hbHRbJWldZW5kWyVpXSBpcyBhbiAgSU5UIGVuZHBvaW50XG4iLFwKIAkJCQkJCWJJbnRlcmZhY2VOdW1iZXIsIGksIGopOwogCQl9IGVsc2UgewotCQkJSk9UKDQsICJpbnRmWyVpXWFsdFslaV1lbmRbJWldIGlzIGEgIENUUkwgZW5kcG9pbnRcbiIsXAorCQkJSk9NKDQsICJpbnRmWyVpXWFsdFslaV1lbmRbJWldIGlzIGEgIENUUkwgZW5kcG9pbnRcbiIsXAogCQkJCQkJYkludGVyZmFjZU51bWJlciwgaSwgaik7CiAJCX0KIAkJaWYgKDAgPT0gcGVwZC0+d01heFBhY2tldFNpemUpIHsKLQkJCUpPVCg0LCAiaW50ZlslaV1hbHRbJWldZW5kWyVpXSAiIFwKKwkJCUpPTSg0LCAiaW50ZlslaV1hbHRbJWldZW5kWyVpXSAiIFwKIAkJCQkJCSJoYXMgemVybyBwYWNrZXQgc2l6ZVxuIiwgXAogCQkJCQkJYkludGVyZmFjZU51bWJlciwgaSwgaik7CiAJCX0KQEAgLTM0ODUsNyArNDA2NSw3IEBACiAgKiAgUEVSRk9STSBJTklUSUFMSVpBVElPTiBPRiBUSEUgUFJPQkVEIElOVEVSRkFDRQogICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1KT1QoNCwgImluaXRpYWxpemF0aW9uIGJlZ2lucyBmb3IgaW50ZXJmYWNlICVpXG4iLCBcCitKT00oNCwgImluaXRpYWxpemF0aW9uIGJlZ2lucyBmb3IgaW50ZXJmYWNlICVpXG4iLCBcCiAJCQkJcHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvci0+YkludGVyZmFjZU51bWJlcik7CiBzd2l0Y2ggKGJJbnRlcmZhY2VOdW1iZXIpIHsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTM0OTUsODkgKzQwNzUsNzggQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIGNhc2UgMDogewogCWlmICghcGVhc3ljYXApIHsKLQkJU0FZKCJNSVNUQUtFOiBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKKwkJU0FNKCJNSVNUQUtFOiBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCWlmICghaXNva2FsdCkgewotCQlTQVkoIkVSUk9SOiAgbm8gdmlhYmxlIHZpZGVvX2FsdHNldHRpbmdfb25cbiIpOworCQlTQU0oIkVSUk9SOiAgbm8gdmlhYmxlIHZpZGVvX2FsdHNldHRpbmdfb25cbiIpOwogCQlyZXR1cm4gLUVOT0VOVDsKIAl9IGVsc2UgewogCQlwZWFzeWNhcC0+dmlkZW9fYWx0c2V0dGluZ19vbiA9IG9rYWx0W2lzb2thbHQgLSAxXTsKLQkJSk9UKDQsICIlaT12aWRlb19hbHRzZXR0aW5nX29uIDw9PT09XG4iLCBcCisJCUpPTSg0LCAiJWk9dmlkZW9fYWx0c2V0dGluZ19vbiA8PT09PVxuIiwgXAogCQkJCQlwZWFzeWNhcC0+dmlkZW9fYWx0c2V0dGluZ19vbik7CiAJfQotCWlmICghaXNva2VwbikgewotCQlTQVkoIkVSUk9SOiAgbm8gdmlhYmxlIHZpZGVvX2VuZHBvaW50bnVtYmVyXG4iKTsKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0JfSBlbHNlIHsKLQkJcGVhc3ljYXAtPnZpZGVvX2VuZHBvaW50bnVtYmVyID0gb2tlcG5baXNva2VwbiAtIDFdOwotCQlKT1QoNCwgIiVpPXZpZGVvX2VuZHBvaW50bnVtYmVyXG4iLCBcCi0JCQkJCXBlYXN5Y2FwLT52aWRlb19lbmRwb2ludG51bWJlcik7Ci0JCX0KLQlpZiAoIWlzb2ttcHMpIHsKLQkJU0FZKCJFUlJPUjogIG5vIHZpYWJsZSB2aWRlb19tYXhwYWNrZXRzaXplXG4iKTsKLQkJcmV0dXJuIC1FTk9FTlQ7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgogICogIERFQ0lERSBUSEUgVklERU8gU1RSRUFNSU5HIFBBUkFNRVRFUlMKICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCXBlYXN5Y2FwLT52aWRlb19lbmRwb2ludG51bWJlciA9IG9rZXBuW2lzb2thbHQgLSAxXTsKKwlKT00oNCwgIiVpPXZpZGVvX2VuZHBvaW50bnVtYmVyXG4iLCBwZWFzeWNhcC0+dmlkZW9fZW5kcG9pbnRudW1iZXIpOworCW1heHBhY2tldHNpemUgPSBva21wc1tpc29rYWx0IC0gMV07CisJaWYgKFVTQl8yXzBfTUFYUEFDS0VUU0laRSA+IG1heHBhY2tldHNpemUpIHsKKwkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfbWF4ZnJhbWVzaXplID0gbWF4cGFja2V0c2l6ZTsKIAl9IGVsc2UgewotCQltYXhwYWNrZXRzaXplID0gb2ttcHNbaXNva21wcyAtIDFdIC0gMTAyNDsKLQkJaWYgKFVTQl8yXzBfTUFYUEFDS0VUU0laRSA+IG1heHBhY2tldHNpemUpIHsKLQkJCXBlYXN5Y2FwLT52aWRlb19pc29jX21heGZyYW1lc2l6ZSA9IG1heHBhY2tldHNpemU7Ci0JCX0gZWxzZSB7Ci0JCQlwZWFzeWNhcC0+dmlkZW9faXNvY19tYXhmcmFtZXNpemUgPSBcCi0JCQkJCQkJVVNCXzJfMF9NQVhQQUNLRVRTSVpFOwotCQl9Ci0JCUpPVCg0LCAiJWk9dmlkZW9faXNvY19tYXhmcmFtZXNpemVcbiIsIFwKLQkJCQkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfbWF4ZnJhbWVzaXplKTsKLQkJaWYgKDAgPj0gcGVhc3ljYXAtPnZpZGVvX2lzb2NfbWF4ZnJhbWVzaXplKSB7Ci0JCQlTQVkoIkVSUk9SOiAgYmFkIHZpZGVvX2lzb2NfbWF4ZnJhbWVzaXplXG4iKTsKLQkJCXJldHVybiAtRU5PRU5UOwotCQl9Ci0JCXBlYXN5Y2FwLT52aWRlb19pc29jX2ZyYW1lc3BlcmRlc2MgPSBWSURFT19JU09DX0ZSQU1FU1BFUkRFU0M7Ci0JCUpPVCg0LCAiJWk9dmlkZW9faXNvY19mcmFtZXNwZXJkZXNjXG4iLCBcCi0JCQkJCXBlYXN5Y2FwLT52aWRlb19pc29jX2ZyYW1lc3BlcmRlc2MpOwotCQlpZiAoMCA+PSBwZWFzeWNhcC0+dmlkZW9faXNvY19mcmFtZXNwZXJkZXNjKSB7Ci0JCQlTQVkoIkVSUk9SOiAgYmFkIHZpZGVvX2lzb2NfZnJhbWVzcGVyZGVzY1xuIik7Ci0JCQlyZXR1cm4gLUVOT0VOVDsKLQkJfQotCQlwZWFzeWNhcC0+dmlkZW9faXNvY19idWZmZXJfc2l6ZSA9IFwKLQkJCQkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfbWF4ZnJhbWVzaXplICogXAotCQkJCQlwZWFzeWNhcC0+dmlkZW9faXNvY19mcmFtZXNwZXJkZXNjOwotCQlKT1QoNCwgIiVpPXZpZGVvX2lzb2NfYnVmZmVyX3NpemVcbiIsIFwKLQkJCQkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfYnVmZmVyX3NpemUpOwotCQlpZiAoKFBBR0VfU0laRSA8PCBWSURFT19JU09DX09SREVSKSA8IFwKLQkJCQkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfYnVmZmVyX3NpemUpIHsKLQkJCVNBWSgiTUlTVEFLRTogIiBcCi0JCQkJInBlYXN5Y2FwLT52aWRlb19pc29jX2J1ZmZlcl9zaXplIHRvbyBiaWdcbiIpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KKwkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfbWF4ZnJhbWVzaXplID0gXAorCQkJCQkJVVNCXzJfMF9NQVhQQUNLRVRTSVpFOworCX0KKwlKT00oNCwgIiVpPXZpZGVvX2lzb2NfbWF4ZnJhbWVzaXplXG4iLCBcCisJCQkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfbWF4ZnJhbWVzaXplKTsKKwlpZiAoMCA+PSBwZWFzeWNhcC0+dmlkZW9faXNvY19tYXhmcmFtZXNpemUpIHsKKwkJU0FNKCJFUlJPUjogIGJhZCB2aWRlb19pc29jX21heGZyYW1lc2l6ZVxuIik7CisJCVNBTSgiICAgICAgICBwb3NzaWJseSBiZWNhdXNlIHBvcnQgaXMgVVNCIDEuMVxuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKwlwZWFzeWNhcC0+dmlkZW9faXNvY19mcmFtZXNwZXJkZXNjID0gVklERU9fSVNPQ19GUkFNRVNQRVJERVNDOworCUpPTSg0LCAiJWk9dmlkZW9faXNvY19mcmFtZXNwZXJkZXNjXG4iLCBcCisJCQkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfZnJhbWVzcGVyZGVzYyk7CisJaWYgKDAgPj0gcGVhc3ljYXAtPnZpZGVvX2lzb2NfZnJhbWVzcGVyZGVzYykgeworCQlTQU0oIkVSUk9SOiAgYmFkIHZpZGVvX2lzb2NfZnJhbWVzcGVyZGVzY1xuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKwlwZWFzeWNhcC0+dmlkZW9faXNvY19idWZmZXJfc2l6ZSA9IFwKKwkJCQlwZWFzeWNhcC0+dmlkZW9faXNvY19tYXhmcmFtZXNpemUgKiBcCisJCQkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfZnJhbWVzcGVyZGVzYzsKKwlKT00oNCwgIiVpPXZpZGVvX2lzb2NfYnVmZmVyX3NpemVcbiIsIFwKKwkJCQlwZWFzeWNhcC0+dmlkZW9faXNvY19idWZmZXJfc2l6ZSk7CisJaWYgKChQQUdFX1NJWkUgPDwgVklERU9fSVNPQ19PUkRFUikgPCBcCisJCQkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfYnVmZmVyX3NpemUpIHsKKwkJU0FNKCJNSVNUQUtFOiBwZWFzeWNhcC0+dmlkZW9faXNvY19idWZmZXJfc2l6ZSB0b28gYmlnXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCWlmICgtMSA9PSBwZWFzeWNhcC0+dmlkZW9faW50ZXJmYWNlKSB7Ci0JCVNBWSgiTUlTVEFLRTogIHZpZGVvX2ludGVyZmFjZSBpcyB1bnNldFxuIik7CisJCVNBTSgiTUlTVEFLRTogIHZpZGVvX2ludGVyZmFjZSBpcyB1bnNldFxuIik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAlpZiAoLTEgPT0gcGVhc3ljYXAtPnZpZGVvX2FsdHNldHRpbmdfb24pIHsKLQkJU0FZKCJNSVNUQUtFOiAgdmlkZW9fYWx0c2V0dGluZ19vbiBpcyB1bnNldFxuIik7CisJCVNBTSgiTUlTVEFLRTogIHZpZGVvX2FsdHNldHRpbmdfb24gaXMgdW5zZXRcbiIpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJaWYgKC0xID09IHBlYXN5Y2FwLT52aWRlb19hbHRzZXR0aW5nX29mZikgewotCQlTQVkoIk1JU1RBS0U6ICB2aWRlb19pbnRlcmZhY2Vfb2ZmIGlzIHVuc2V0XG4iKTsKKwkJU0FNKCJNSVNUQUtFOiAgdmlkZW9faW50ZXJmYWNlX29mZiBpcyB1bnNldFxuIik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAlpZiAoLTEgPT0gcGVhc3ljYXAtPnZpZGVvX2VuZHBvaW50bnVtYmVyKSB7Ci0JCVNBWSgiTUlTVEFLRTogIHZpZGVvX2VuZHBvaW50bnVtYmVyIGlzIHVuc2V0XG4iKTsKKwkJU0FNKCJNSVNUQUtFOiAgdmlkZW9fZW5kcG9pbnRudW1iZXIgaXMgdW5zZXRcbiIpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJaWYgKC0xID09IHBlYXN5Y2FwLT52aWRlb19pc29jX21heGZyYW1lc2l6ZSkgewotCQlTQVkoIk1JU1RBS0U6ICB2aWRlb19pc29jX21heGZyYW1lc2l6ZSBpcyB1bnNldFxuIik7CisJCVNBTSgiTUlTVEFLRTogIHZpZGVvX2lzb2NfbWF4ZnJhbWVzaXplIGlzIHVuc2V0XG4iKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCWlmICgtMSA9PSBwZWFzeWNhcC0+dmlkZW9faXNvY19idWZmZXJfc2l6ZSkgewotCQlTQVkoIk1JU1RBS0U6ICB2aWRlb19pc29jX2J1ZmZlcl9zaXplIGlzIHVuc2V0XG4iKTsKKwkJU0FNKCJNSVNUQUtFOiAgdmlkZW9faXNvY19idWZmZXJfc2l6ZSBpcyB1bnNldFxuIik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTM1ODgsMjAgKzQxNTcsMjAgQEAKIAlJTklUX0xJU1RfSEVBRCgmKHBlYXN5Y2FwLT51cmJfdmlkZW9faGVhZCkpOwogCXBlYXN5Y2FwLT5wdXJiX3ZpZGVvX2hlYWQgPSAmKHBlYXN5Y2FwLT51cmJfdmlkZW9faGVhZCk7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JSk9UKDQsICJhbGxvY2F0aW5nICVpIGZyYW1lIGJ1ZmZlcnMgb2Ygc2l6ZSAlbGlcbiIsICBcCisJSk9NKDQsICJhbGxvY2F0aW5nICVpIGZyYW1lIGJ1ZmZlcnMgb2Ygc2l6ZSAlbGlcbiIsICBcCiAJCQlGUkFNRV9CVUZGRVJfTUFOWSwgKGxvbmcgaW50KUZSQU1FX0JVRkZFUl9TSVpFKTsKLQlKT1QoNCwgIi4uLi4gZWFjaCBzY2F0dGVyZWQgb3ZlciAlbGkgcGFnZXNcbiIsIFwKKwlKT00oNCwgIi4uLi4gZWFjaCBzY2F0dGVyZWQgb3ZlciAlbGkgcGFnZXNcbiIsIFwKIAkJCQkJCUZSQU1FX0JVRkZFUl9TSVpFL1BBR0VfU0laRSk7CiAKIAlmb3IgKGsgPSAwOyAgayA8IEZSQU1FX0JVRkZFUl9NQU5ZOyAgaysrKSB7CiAJCWZvciAobSA9IDA7ICBtIDwgRlJBTUVfQlVGRkVSX1NJWkUvUEFHRV9TSVpFOyAgbSsrKSB7CiAJCQlpZiAoKHZvaWQgKilOVUxMICE9IHBlYXN5Y2FwLT5mcmFtZV9idWZmZXJba11bbV0ucGdvKQotCQkJCVNBWSgiYXR0ZW1wdGluZyB0byByZWFsbG9jYXRlIGZyYW1lICIgXAorCQkJCVNBTSgiYXR0ZW1wdGluZyB0byByZWFsbG9jYXRlIGZyYW1lICIgXAogCQkJCQkJCQkiIGJ1ZmZlcnNcbiIpOwogCQkJZWxzZSB7CiAJCQkJcGJ1ZiA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOwogCQkJCWlmICgodm9pZCAqKU5VTEwgPT0gcGJ1ZikgewotCQkJCQlTQVkoIkVSUk9SOiBDb3VsZCBub3QgYWxsb2NhdGUgZnJhbWUgIlwKKwkJCQkJU0FNKCJFUlJPUjogQ291bGQgbm90IGFsbG9jYXRlIGZyYW1lICJcCiAJCQkJCQkiYnVmZmVyICVpIHBhZ2UgJWlcbiIsIGssIG0pOwogCQkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCQl9IGVsc2UKQEAgLTM2MTUsMjMgKzQxODQsMjMgQEAKIAogCXBlYXN5Y2FwLT5mcmFtZV9maWxsID0gMDsKIAlwZWFzeWNhcC0+ZnJhbWVfcmVhZCA9IDA7Ci0JSk9UKDQsICJhbGxvY2F0aW9uIG9mIGZyYW1lIGJ1ZmZlcnMgZG9uZTogICVpIHBhZ2VzXG4iLCBrICogXAorCUpPTSg0LCAiYWxsb2NhdGlvbiBvZiBmcmFtZSBidWZmZXJzIGRvbmU6ICAlaSBwYWdlc1xuIiwgayAqIFwKIAkJCQkJCQkJbSk7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JSk9UKDQsICJhbGxvY2F0aW5nICVpIGZpZWxkIGJ1ZmZlcnMgb2Ygc2l6ZSAlbGlcbiIsICBcCisJSk9NKDQsICJhbGxvY2F0aW5nICVpIGZpZWxkIGJ1ZmZlcnMgb2Ygc2l6ZSAlbGlcbiIsICBcCiAJCQlGSUVMRF9CVUZGRVJfTUFOWSwgKGxvbmcgaW50KUZJRUxEX0JVRkZFUl9TSVpFKTsKLQlKT1QoNCwgIi4uLi4gZWFjaCBzY2F0dGVyZWQgb3ZlciAlbGkgcGFnZXNcbiIsIFwKKwlKT00oNCwgIi4uLi4gZWFjaCBzY2F0dGVyZWQgb3ZlciAlbGkgcGFnZXNcbiIsIFwKIAkJCQkJRklFTERfQlVGRkVSX1NJWkUvUEFHRV9TSVpFKTsKIAogCWZvciAoayA9IDA7ICBrIDwgRklFTERfQlVGRkVSX01BTlk7ICBrKyspIHsKIAkJZm9yIChtID0gMDsgIG0gPCBGSUVMRF9CVUZGRVJfU0laRS9QQUdFX1NJWkU7ICBtKyspIHsKIAkJCWlmICgodm9pZCAqKU5VTEwgIT0gcGVhc3ljYXAtPmZpZWxkX2J1ZmZlcltrXVttXS5wZ28pIHsKLQkJCQlTQVkoIkVSUk9SOiBhdHRlbXB0aW5nIHRvIHJlYWxsb2NhdGUgIiBcCisJCQkJU0FNKCJFUlJPUjogYXR0ZW1wdGluZyB0byByZWFsbG9jYXRlICIgXAogCQkJCQkJCSJmaWVsZCBidWZmZXJzXG4iKTsKIAkJCX0gZWxzZSB7CiAJCQkJcGJ1ZiA9ICh2b2lkICopIF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKIAkJCQlpZiAoKHZvaWQgKilOVUxMID09IHBidWYpIHsKLQkJCQkJU0FZKCJFUlJPUjogQ291bGQgbm90IGFsbG9jYXRlIGZpZWxkIiBcCisJCQkJCVNBTSgiRVJST1I6IENvdWxkIG5vdCBhbGxvY2F0ZSBmaWVsZCIgXAogCQkJCQkJIiBidWZmZXIgJWkgcGFnZSAlaVxuIiwgaywgbSk7CiAJCQkJCXJldHVybiAtRU5PTUVNOwogCQkJCQl9CkBAIC0zNjQ3LDE4ICs0MjE2LDE4IEBACiAJcGVhc3ljYXAtPmZpZWxkX2ZpbGwgPSAwOwogCXBlYXN5Y2FwLT5maWVsZF9wYWdlID0gMDsKIAlwZWFzeWNhcC0+ZmllbGRfcmVhZCA9IDA7Ci0JSk9UKDQsICJhbGxvY2F0aW9uIG9mIGZpZWxkIGJ1ZmZlcnMgZG9uZTogICVpIHBhZ2VzXG4iLCBrICogXAorCUpPTSg0LCAiYWxsb2NhdGlvbiBvZiBmaWVsZCBidWZmZXJzIGRvbmU6ICAlaSBwYWdlc1xuIiwgayAqIFwKIAkJCQkJCQkJbSk7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JSk9UKDQsICJhbGxvY2F0aW5nICVpIGlzb2MgdmlkZW8gYnVmZmVycyBvZiBzaXplICVpXG4iLCAgXAorCUpPTSg0LCAiYWxsb2NhdGluZyAlaSBpc29jIHZpZGVvIGJ1ZmZlcnMgb2Ygc2l6ZSAlaVxuIiwgIFwKIAkJCQkJVklERU9fSVNPQ19CVUZGRVJfTUFOWSwgXAogCQkJCQlwZWFzeWNhcC0+dmlkZW9faXNvY19idWZmZXJfc2l6ZSk7Ci0JSk9UKDQsICIuLi4uIGVhY2ggb2NjdXB5aW5nIGNvbnRpZ3VvdXMgbWVtb3J5IHBhZ2VzXG4iKTsKKwlKT00oNCwgIi4uLi4gZWFjaCBvY2N1cHlpbmcgY29udGlndW91cyBtZW1vcnkgcGFnZXNcbiIpOwogCiAJZm9yIChrID0gMDsgIGsgPCBWSURFT19JU09DX0JVRkZFUl9NQU5ZOyBrKyspIHsKIAkJcGJ1ZiA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBWSURFT19JU09DX09SREVSKTsKIAkJaWYgKE5VTEwgPT0gcGJ1ZikgewotCQkJU0FZKCJFUlJPUjogQ291bGQgbm90IGFsbG9jYXRlIGlzb2MgdmlkZW8gYnVmZmVyICIgXAorCQkJU0FNKCJFUlJPUjogQ291bGQgbm90IGFsbG9jYXRlIGlzb2MgdmlkZW8gYnVmZmVyICIgXAogCQkJCQkJCQkiJWlcbiIsIGspOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0gZWxzZQpAQCAtMzY3MCwyNiArNDIzOSwyNiBAQAogCQkJCQlwZWFzeWNhcC0+dmlkZW9faXNvY19idWZmZXJfc2l6ZTsKIAkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfYnVmZmVyW2tdLmtvdW50ID0gazsKIAl9Ci0JSk9UKDQsICJhbGxvY2F0aW9uIG9mIGlzb2MgdmlkZW8gYnVmZmVycyBkb25lOiAlaSBwYWdlc1xuIiwgXAorCUpPTSg0LCAiYWxsb2NhdGlvbiBvZiBpc29jIHZpZGVvIGJ1ZmZlcnMgZG9uZTogJWkgcGFnZXNcbiIsIFwKIAkJCQkJayAqICgweDAxIDw8IFZJREVPX0lTT0NfT1JERVIpKTsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qCiAgKiAgQUxMT0NBVEUgQU5EIElOSVRJQUxJWkUgTVVMVElQTEUgc3RydWN0IHVyYiAuLi4KICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCUpPVCg0LCAiYWxsb2NhdGluZyAlaSBzdHJ1Y3QgdXJiLlxuIiwgVklERU9fSVNPQ19CVUZGRVJfTUFOWSk7Ci0JSk9UKDQsICJ1c2luZyAlaT1wZWFzeWNhcC0+dmlkZW9faXNvY19mcmFtZXNwZXJkZXNjXG4iLCBcCisJSk9NKDQsICJhbGxvY2F0aW5nICVpIHN0cnVjdCB1cmIuXG4iLCBWSURFT19JU09DX0JVRkZFUl9NQU5ZKTsKKwlKT00oNCwgInVzaW5nICVpPXBlYXN5Y2FwLT52aWRlb19pc29jX2ZyYW1lc3BlcmRlc2NcbiIsIFwKIAkJCQkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfZnJhbWVzcGVyZGVzYyk7Ci0JSk9UKDQsICJ1c2luZyAlaT1wZWFzeWNhcC0+dmlkZW9faXNvY19tYXhmcmFtZXNpemVcbiIsIFwKKwlKT00oNCwgInVzaW5nICVpPXBlYXN5Y2FwLT52aWRlb19pc29jX21heGZyYW1lc2l6ZVxuIiwgXAogCQkJCQlwZWFzeWNhcC0+dmlkZW9faXNvY19tYXhmcmFtZXNpemUpOwotCUpPVCg0LCAidXNpbmcgJWk9cGVhc3ljYXAtPnZpZGVvX2lzb2NfYnVmZmVyX3NpemVuIiwgXAorCUpPTSg0LCAidXNpbmcgJWk9cGVhc3ljYXAtPnZpZGVvX2lzb2NfYnVmZmVyX3NpemVuIiwgXAogCQkJCQlwZWFzeWNhcC0+dmlkZW9faXNvY19idWZmZXJfc2l6ZSk7CiAKIAlmb3IgKGsgPSAwOyAgayA8IFZJREVPX0lTT0NfQlVGRkVSX01BTlk7IGsrKykgewogCQlwdXJiID0gdXNiX2FsbG9jX3VyYihwZWFzeWNhcC0+dmlkZW9faXNvY19mcmFtZXNwZXJkZXNjLCBcCiAJCQkJCQkJCUdGUF9LRVJORUwpOwogCQlpZiAoTlVMTCA9PSBwdXJiKSB7Ci0JCQlTQVkoIkVSUk9SOiB1c2JfYWxsb2NfdXJiIHJldHVybmVkIE5VTEwgZm9yIGJ1ZmZlciAiIFwKKwkJCVNBTSgiRVJST1I6IHVzYl9hbGxvY191cmIgcmV0dXJuZWQgTlVMTCBmb3IgYnVmZmVyICIgXAogCQkJCQkJCQkiJWlcbiIsIGspOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0gZWxzZQpAQCAtMzY5Nyw3ICs0MjY2LDcgQEAKIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIAkJcGRhdGFfdXJiID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRhdGFfdXJiKSwgR0ZQX0tFUk5FTCk7CiAJCWlmIChOVUxMID09IHBkYXRhX3VyYikgewotCQkJU0FZKCJFUlJPUjogQ291bGQgbm90IGFsbG9jYXRlIHN0cnVjdCBkYXRhX3VyYi5cbiIpOworCQkJU0FNKCJFUlJPUjogQ291bGQgbm90IGFsbG9jYXRlIHN0cnVjdCBkYXRhX3VyYi5cbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0gZWxzZQogCQkJcGVhc3ljYXAtPmFsbG9jYXRpb25fdmlkZW9fc3RydWN0ICs9IFwKQEAgLTM3MTQsMzAgKzQyODMsMzAgQEAKICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCQlpZiAoIWspIHsKLQkJCUpPVCg0LCAiaW5pdGlhbGl6aW5nIHZpZGVvIHVyYnMgdGh1czpcbiIpOwotCQkJSk9UKDQsICIgIHB1cmItPmludGVydmFsID0gMTtcbiIpOwotCQkJSk9UKDQsICIgIHB1cmItPmRldiA9IHBlYXN5Y2FwLT5wdXNiX2RldmljZTtcbiIpOwotCQkJSk9UKDQsICIgIHB1cmItPnBpcGUgPSB1c2JfcmN2aXNvY3BpcGUiIFwKKwkJCUpPTSg0LCAiaW5pdGlhbGl6aW5nIHZpZGVvIHVyYnMgdGh1czpcbiIpOworCQkJSk9NKDQsICIgIHB1cmItPmludGVydmFsID0gMTtcbiIpOworCQkJSk9NKDQsICIgIHB1cmItPmRldiA9IHBlYXN5Y2FwLT5wdXNiX2RldmljZTtcbiIpOworCQkJSk9NKDQsICIgIHB1cmItPnBpcGUgPSB1c2JfcmN2aXNvY3BpcGUiIFwKIAkJCQkJIihwZWFzeWNhcC0+cHVzYl9kZXZpY2UsJWkpO1xuIiwgXAogCQkJCQlwZWFzeWNhcC0+dmlkZW9fZW5kcG9pbnRudW1iZXIpOwotCQkJSk9UKDQsICIgIHB1cmItPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQO1xuIik7Ci0JCQlKT1QoNCwgIiAgcHVyYi0+dHJhbnNmZXJfYnVmZmVyID0gcGVhc3ljYXAtPiIgXAorCQkJSk9NKDQsICIgIHB1cmItPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQO1xuIik7CisJCQlKT00oNCwgIiAgcHVyYi0+dHJhbnNmZXJfYnVmZmVyID0gcGVhc3ljYXAtPiIgXAogCQkJCQkidmlkZW9faXNvY19idWZmZXJbLl0ucGdvO1xuIik7Ci0JCQlKT1QoNCwgIiAgcHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9ICVpO1xuIiwgXAorCQkJSk9NKDQsICIgIHB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSAlaTtcbiIsIFwKIAkJCQkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfYnVmZmVyX3NpemUpOwotCQkJSk9UKDQsICIgIHB1cmItPmNvbXBsZXRlID0gZWFzeWNhcF9jb21wbGV0ZTtcbiIpOwotCQkJSk9UKDQsICIgIHB1cmItPmNvbnRleHQgPSBwZWFzeWNhcDtcbiIpOwotCQkJSk9UKDQsICIgIHB1cmItPnN0YXJ0X2ZyYW1lID0gMDtcbiIpOwotCQkJSk9UKDQsICIgIHB1cmItPm51bWJlcl9vZl9wYWNrZXRzID0gJWk7XG4iLCBcCisJCQlKT00oNCwgIiAgcHVyYi0+Y29tcGxldGUgPSBlYXN5Y2FwX2NvbXBsZXRlO1xuIik7CisJCQlKT00oNCwgIiAgcHVyYi0+Y29udGV4dCA9IHBlYXN5Y2FwO1xuIik7CisJCQlKT00oNCwgIiAgcHVyYi0+c3RhcnRfZnJhbWUgPSAwO1xuIik7CisJCQlKT00oNCwgIiAgcHVyYi0+bnVtYmVyX29mX3BhY2tldHMgPSAlaTtcbiIsIFwKIAkJCQkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfZnJhbWVzcGVyZGVzYyk7Ci0JCQlKT1QoNCwgIiAgZm9yIChqID0gMDsgaiA8ICVpOyBqKyspXG4iLCBcCisJCQlKT00oNCwgIiAgZm9yIChqID0gMDsgaiA8ICVpOyBqKyspXG4iLCBcCiAJCQkJCXBlYXN5Y2FwLT52aWRlb19pc29jX2ZyYW1lc3BlcmRlc2MpOwotCQkJSk9UKDQsICIgICAge1xuIik7Ci0JCQlKT1QoNCwgIiAgICBwdXJiLT5pc29fZnJhbWVfZGVzY1tqXS5vZmZzZXQgPSBqKiVpO1xuIixcCisJCQlKT00oNCwgIiAgICB7XG4iKTsKKwkJCUpPTSg0LCAiICAgIHB1cmItPmlzb19mcmFtZV9kZXNjW2pdLm9mZnNldCA9IGoqJWk7XG4iLFwKIAkJCQkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfbWF4ZnJhbWVzaXplKTsKLQkJCUpPVCg0LCAiICAgIHB1cmItPmlzb19mcmFtZV9kZXNjW2pdLmxlbmd0aCA9ICVpO1xuIiwgXAorCQkJSk9NKDQsICIgICAgcHVyYi0+aXNvX2ZyYW1lX2Rlc2Nbal0ubGVuZ3RoID0gJWk7XG4iLCBcCiAJCQkJCXBlYXN5Y2FwLT52aWRlb19pc29jX21heGZyYW1lc2l6ZSk7Ci0JCQlKT1QoNCwgIiAgICB9XG4iKTsKKwkJCUpPTSg0LCAiICAgIH1cbiIpOwogCQl9CiAKIAkJcHVyYi0+aW50ZXJ2YWwgPSAxOwpAQCAtMzc1OSwxMyArNDMyOCwzMyBAQAogCQkJCQlwZWFzeWNhcC0+dmlkZW9faXNvY19tYXhmcmFtZXNpemU7CiAJCX0KIAl9Ci0JSk9UKDQsICJhbGxvY2F0aW9uIG9mICVpIHN0cnVjdCB1cmIgZG9uZS5cbiIsIGspOworCUpPTSg0LCAiYWxsb2NhdGlvbiBvZiAlaSBzdHJ1Y3QgdXJiIGRvbmUuXG4iLCBrKTsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKICAqICBTQVZFIFBPSU5URVIgcGVhc3ljYXAgSU4gVEhJUyBJTlRFUkZBQ0UuCiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCXVzYl9zZXRfaW50ZmRhdGEocHVzYl9pbnRlcmZhY2UsIHBlYXN5Y2FwKTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgSVQgSVMgRVNTRU5USUFMIFRPIElOSVRJQUxJWkUgVEhFIEhBUkRXQVJFIEJFRk9SRSwgUkFUSEVSIFRIQU4gQUZURVIsCisgKiAgVEhFIERFVklDRSBJUyBSRUdJU1RFUkVELCBCRUNBVVNFIFNPTUUgVkVSU0lPTlMgT0YgVEhFIHZpZGVvZGV2IE1PRFVMRQorICogIENBTEwgZWFzeWNhcF9vcGVuKCkgSU1NRURJQVRFTFkgQUZURVIgUkVHSVNUUkFUSU9OLCBDQVVTSU5HIEEgQ0xBU0guCisgKiAgQkVXQVJFLgorKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFBSRUZFUl9OVFNDKQorCXBlYXN5Y2FwLT5udHNjID0gdHJ1ZTsKKwlKT00oOCwgImRlZmF1bHRpbmcgaW5pdGlhbGx5IHRvIE5UU0NcbiIpOworI2Vsc2UKKwlwZWFzeWNhcC0+bnRzYyA9IGZhbHNlOworCUpPTSg4LCAiZGVmYXVsdGluZyBpbml0aWFsbHkgdG8gUEFMXG4iKTsKKyNlbmRpZiAvKlBSRUZFUl9OVFNDKi8KKwlyYyA9IHJlc2V0KHBlYXN5Y2FwKTsKKwlpZiAoMCAhPSByYykgeworCQlTQU0oIkVSUk9SOiByZXNldCgpIHJldHVybmVkICVpXG4iLCByYyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKICAqICBUSEUgVklERU8gREVWSUNFIENBTiBCRSBSRUdJU1RFUkVEIE5PVywgQVMgSVQgSVMgUkVBRFkuCkBAIC0zNzc2LDQ4ICs0MzY1LDU4IEBACiAJCWVycigiTm90IGFibGUgdG8gZ2V0IGEgbWlub3IgZm9yIHRoaXMgZGV2aWNlIik7CiAJCXVzYl9zZXRfaW50ZmRhdGEocHVzYl9pbnRlcmZhY2UsIE5VTEwpOwogCQlyZXR1cm4gLUVOT0RFVjsKLQl9IGVsc2UKKwl9IGVsc2UgewogCQkocGVhc3ljYXAtPnJlZ2lzdGVyZWRfdmlkZW8pKys7Ci0JU0FZKCJlYXN5Y2FwIGF0dGFjaGVkIHRvIG1pbm9yICMlZFxuIiwgcHVzYl9pbnRlcmZhY2UtPm1pbm9yKTsKLQlicmVhazsKLS8qdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYqLwotI2Vsc2UKLQlwdmlkZW9fZGV2aWNlID0gKHN0cnVjdCB2aWRlb19kZXZpY2UgKilcCi0JCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgdmlkZW9fZGV2aWNlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKChzdHJ1Y3QgdmlkZW9fZGV2aWNlICopTlVMTCA9PSBwdmlkZW9fZGV2aWNlKSB7Ci0JCVNBWSgiRVJST1I6IENvdWxkIG5vdCBhbGxvY2F0ZSBzdHJ1Y3R1cmUgdmlkZW9fZGV2aWNlXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCVNBTSgiZWFzeWNhcCBhdHRhY2hlZCB0byBtaW5vciAjJWRcbiIsIHB1c2JfaW50ZXJmYWNlLT5taW5vcik7CisJCWJyZWFrOwogCX0KLQlpZiAoVklERU9fREVWSUNFX01BTlkgPD0gdmlkZW9fZGV2aWNlX21hbnkpIHsKLQkJU0FZKCJFUlJPUjogVG9vIG1hbnkgL2Rldi92aWRlb3NcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JcHZpZGVvX2FycmF5W3ZpZGVvX2RldmljZV9tYW55XSA9IHB2aWRlb19kZXZpY2U7ICB2aWRlb19kZXZpY2VfbWFueSsrOwotCi0Jc3RyY3B5KCZwdmlkZW9fZGV2aWNlLT5uYW1lWzBdLCAiZWFzeWNhcGRjNjAiKTsKLSNpZiBkZWZpbmVkKEVBU1lDQVBfTkVFRFNfVjRMMl9GT1BTKQotCXB2aWRlb19kZXZpY2UtPmZvcHMgPSAmdjRsMl9mb3BzOworLyp2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYqLwogI2Vsc2UKLQlwdmlkZW9fZGV2aWNlLT5mb3BzID0gJmVhc3ljYXBfZm9wczsKLSNlbmRpZiAvKkVBU1lDQVBfTkVFRFNfVjRMMl9GT1BTKi8KLQlwdmlkZW9fZGV2aWNlLT5taW5vciA9IC0xOwotCXB2aWRlb19kZXZpY2UtPnJlbGVhc2UgPSAodm9pZCAqKSgmdmlkZW9kZXZfcmVsZWFzZSk7Ci0KLQl2aWRlb19zZXRfZHJ2ZGF0YShwdmlkZW9fZGV2aWNlLCAodm9pZCAqKXBlYXN5Y2FwKTsKLQotCXJjID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKHB2aWRlb19kZXZpY2UsIFZGTF9UWVBFX0dSQUJCRVIsIC0xKTsKLQlpZiAoMCAhPSByYykgewotCQllcnIoIk5vdCBhYmxlIHRvIHJlZ2lzdGVyIHdpdGggdmlkZW9kZXYiKTsKLQkJdmlkZW9kZXZfcmVsZWFzZShwdmlkZW9fZGV2aWNlKTsKKyNpZiBkZWZpbmVkKEVBU1lDQVBfTkVFRFNfVjRMMl9ERVZJQ0VfSCkKKwlpZiAoMCAhPSAodjRsMl9kZXZpY2VfcmVnaXN0ZXIoJihwdXNiX2ludGVyZmFjZS0+ZGV2KSwgXAorCQkJCQkJJihwZWFzeWNhcC0+djRsMl9kZXZpY2UpKSkpIHsKKwkJU0FNKCJ2NGwyX2RldmljZV9yZWdpc3RlcigpIGZhaWxlZFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0gZWxzZSB7Ci0JCXBlYXN5Y2FwLT5wdmlkZW9fZGV2aWNlID0gcHZpZGVvX2RldmljZTsKLQkJKHBlYXN5Y2FwLT5yZWdpc3RlcmVkX3ZpZGVvKSsrOwotCQlKT1QoNCwgInJlZ2lzdGVyZWQgd2l0aCB2aWRlb2RldjogJWk9bWlub3JcbiIsIFwKLQkJCQkJCQlwdmlkZW9fZGV2aWNlLT5taW5vcik7CisJCUpPTSg0LCAicmVnaXN0ZXJlZCBkZXZpY2UgaW5zdGFuY2U6ICVzXG4iLCBcCisJCQkJCSYocGVhc3ljYXAtPnY0bDJfZGV2aWNlLm5hbWVbMF0pKTsKIAl9Ci0vKl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYTUUKKyAqCisgKgorICogIFRISVMgSVMgQkVMSUVWRUQgVE8gQkUgSEFSTUxFU1MsIEJVVCBNQVkgV0VMTCBCRSBVTk5FQ0VTU0FSWSBPUiBXUk9ORzoKKyovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJcGVhc3ljYXAtPnZpZGVvX2RldmljZS52NGwyX2RldiA9IChzdHJ1Y3QgdjRsMl9kZXZpY2UgKilOVUxMOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZW5kaWYgLypFQVNZQ0FQX05FRURTX1Y0TDJfREVWSUNFX0gqLworCisJc3RyY3B5KCZwZWFzeWNhcC0+dmlkZW9fZGV2aWNlLm5hbWVbMF0sICJlYXN5Y2FwZGM2MCIpOworI2lmIGRlZmluZWQoRUFTWUNBUF9ORUVEU19WNEwyX0ZPUFMpCisJcGVhc3ljYXAtPnZpZGVvX2RldmljZS5mb3BzID0gJnY0bDJfZm9wczsKKyNlbHNlCisJcGVhc3ljYXAtPnZpZGVvX2RldmljZS5mb3BzID0gJmVhc3ljYXBfZm9wczsKKyNlbmRpZiAvKkVBU1lDQVBfTkVFRFNfVjRMMl9GT1BTKi8KKwlwZWFzeWNhcC0+dmlkZW9fZGV2aWNlLm1pbm9yID0gLTE7CisJcGVhc3ljYXAtPnZpZGVvX2RldmljZS5yZWxlYXNlID0gKHZvaWQgKikoJnZpZGVvZGV2X3JlbGVhc2UpOworCisJdmlkZW9fc2V0X2RydmRhdGEoJihwZWFzeWNhcC0+dmlkZW9fZGV2aWNlKSwgKHZvaWQgKilwZWFzeWNhcCk7CisKKwlpZiAoMCAhPSAodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCYocGVhc3ljYXAtPnZpZGVvX2RldmljZSksIFwKKwkJCQkJCVZGTF9UWVBFX0dSQUJCRVIsIC0xKSkpIHsKKwkJZXJyKCJOb3QgYWJsZSB0byByZWdpc3RlciB3aXRoIHZpZGVvZGV2Iik7CisJCXZpZGVvZGV2X3JlbGVhc2UoJihwZWFzeWNhcC0+dmlkZW9fZGV2aWNlKSk7CisJCXJldHVybiAtRU5PREVWOworCX0gZWxzZSB7CisJCShwZWFzeWNhcC0+cmVnaXN0ZXJlZF92aWRlbykrKzsKKwkJU0FNKCJyZWdpc3RlcmVkIHdpdGggdmlkZW9kZXY6ICVpPW1pbm9yXG4iLCBcCisJCQkJCQlwZWFzeWNhcC0+dmlkZW9fZGV2aWNlLm1pbm9yKTsKKwl9CiAjZW5kaWYgLypFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVCovCisvKl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXiovCiAJYnJlYWs7CiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTM4MjcsMTI1ICs0NDI2LDExOCBAQAogICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIGNhc2UgMTogeworCWlmICghcGVhc3ljYXApIHsKKwkJU0FNKCJFUlJPUjogcGVhc3ljYXAgaXMgTlVMTFxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKICAqICBTQVZFIFBPSU5URVIgcGVhc3ljYXAgSU4gSU5URVJGQUNFIDEKICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAJdXNiX3NldF9pbnRmZGF0YShwdXNiX2ludGVyZmFjZSwgcGVhc3ljYXApOwotCUpPVCg0LCAibm8gaW5pdGlhbGl6YXRpb24gcmVxdWlyZWQgZm9yIGludGVyZmFjZSAlaVxuIiwgXAorCUpPTSg0LCAibm8gaW5pdGlhbGl6YXRpb24gcmVxdWlyZWQgZm9yIGludGVyZmFjZSAlaVxuIiwgXAogCQkJCXB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3ItPmJJbnRlcmZhY2VOdW1iZXIpOwogCWJyZWFrOwogfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBjYXNlIDI6IHsKIAlpZiAoIXBlYXN5Y2FwKSB7Ci0JCVNBWSgiTUlTVEFLRTogcGVhc3ljYXAgaXMgTlVMTFxuIik7CisJCVNBTSgiTUlTVEFLRTogcGVhc3ljYXAgaXMgTlVMTFxuIik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAlpZiAoIWlzb2thbHQpIHsKLQkJU0FZKCJFUlJPUjogIG5vIHZpYWJsZSBhdWRpb19hbHRzZXR0aW5nX29uXG4iKTsKKwkJU0FNKCJFUlJPUjogIG5vIHZpYWJsZSBhdWRpb19hbHRzZXR0aW5nX29uXG4iKTsKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfSBlbHNlIHsKIAkJcGVhc3ljYXAtPmF1ZGlvX2FsdHNldHRpbmdfb24gPSBva2FsdFtpc29rYWx0IC0gMV07Ci0JCUpPVCg0LCAiJWk9YXVkaW9fYWx0c2V0dGluZ19vbiA8PT09PVxuIiwgXAorCQlKT00oNCwgIiVpPWF1ZGlvX2FsdHNldHRpbmdfb24gPD09PT1cbiIsIFwKIAkJCQkJCXBlYXN5Y2FwLT5hdWRpb19hbHRzZXR0aW5nX29uKTsKIAl9Ci0JaWYgKCFpc29rZXBuKSB7Ci0JCVNBWSgiRVJST1I6ICBubyB2aWFibGUgYXVkaW9fZW5kcG9pbnRudW1iZXJcbiIpOwotCQlyZXR1cm4gLUVOT0VOVDsKLQl9IGVsc2UgewotCQlwZWFzeWNhcC0+YXVkaW9fZW5kcG9pbnRudW1iZXIgPSBva2Vwbltpc29rZXBuIC0gMV07Ci0JCUpPVCg0LCAiJWk9YXVkaW9fZW5kcG9pbnRudW1iZXJcbiIsIFwKLQkJCQkJcGVhc3ljYXAtPmF1ZGlvX2VuZHBvaW50bnVtYmVyKTsKLQl9Ci0JaWYgKCFpc29rbXBzKSB7Ci0JCVNBWSgiRVJST1I6ICBubyB2aWFibGUgYXVkaW9fbWF4cGFja2V0c2l6ZVxuIik7Ci0JCXJldHVybiAtRU5PRU5UOwotCX0gZWxzZSB7Ci0JCXBlYXN5Y2FwLT5hdWRpb19pc29jX21heGZyYW1lc2l6ZSA9IG9rbXBzW2lzb2ttcHMgLSAxXTsKLQkJSk9UKDQsICIlaT1hdWRpb19pc29jX21heGZyYW1lc2l6ZVxuIiwgXAotCQkJCQlwZWFzeWNhcC0+YXVkaW9faXNvY19tYXhmcmFtZXNpemUpOwotCQlpZiAoMCA+PSBwZWFzeWNhcC0+YXVkaW9faXNvY19tYXhmcmFtZXNpemUpIHsKLQkJCVNBWSgiRVJST1I6ICBiYWQgYXVkaW9faXNvY19tYXhmcmFtZXNpemVcbiIpOwotCQkJcmV0dXJuIC1FTk9FTlQ7Ci0JCX0KLQkJaWYgKDkgPT0gcGVhc3ljYXAtPmF1ZGlvX2lzb2NfbWF4ZnJhbWVzaXplKSB7Ci0JCQlwZWFzeWNhcC0+aWxrIHw9IDB4MDI7Ci0JCQlTQVkoImhhcmR3YXJlIGlzIEZPVVItQ1ZCU1xuIik7Ci0JCQlwZWFzeWNhcC0+bWljcm9waG9uZSA9IHRydWU7Ci0JCQlwZWFzeWNhcC0+YXVkaW9fcGFnZXNfcGVyX2ZyYWdtZW50ID0gNDsKLQkJfSBlbHNlIGlmICgyNTYgPT0gcGVhc3ljYXAtPmF1ZGlvX2lzb2NfbWF4ZnJhbWVzaXplKSB7Ci0JCQlwZWFzeWNhcC0+aWxrICY9IH4weDAyOwotCQkJU0FZKCJoYXJkd2FyZSBpcyBDVkJTK1MtVklERU9cbiIpOwotCQkJcGVhc3ljYXAtPm1pY3JvcGhvbmUgPSBmYWxzZTsKLQkJCXBlYXN5Y2FwLT5hdWRpb19wYWdlc19wZXJfZnJhZ21lbnQgPSA0OwotCQl9IGVsc2UgewotCQkJU0FZKCJoYXJkd2FyZSBpcyB1bmlkZW50aWZpZWQ6XG4iKTsKLQkJCVNBWSgiJWk9YXVkaW9faXNvY19tYXhmcmFtZXNpemVcbiIsIFwKLQkJCQkJcGVhc3ljYXAtPmF1ZGlvX2lzb2NfbWF4ZnJhbWVzaXplKTsKLQkJCXJldHVybiAtRU5PRU5UOwotCQl9CiAKLQkJcGVhc3ljYXAtPmF1ZGlvX2J5dGVzX3Blcl9mcmFnbWVudCA9IFwKKwlwZWFzeWNhcC0+YXVkaW9fZW5kcG9pbnRudW1iZXIgPSBva2Vwbltpc29rYWx0IC0gMV07CisJSk9NKDQsICIlaT1hdWRpb19lbmRwb2ludG51bWJlclxuIiwgcGVhc3ljYXAtPmF1ZGlvX2VuZHBvaW50bnVtYmVyKTsKKworCXBlYXN5Y2FwLT5hdWRpb19pc29jX21heGZyYW1lc2l6ZSA9IG9rbXBzW2lzb2thbHQgLSAxXTsKKwlKT00oNCwgIiVpPWF1ZGlvX2lzb2NfbWF4ZnJhbWVzaXplXG4iLCBcCisJCQkJCXBlYXN5Y2FwLT5hdWRpb19pc29jX21heGZyYW1lc2l6ZSk7CisJaWYgKDAgPj0gcGVhc3ljYXAtPmF1ZGlvX2lzb2NfbWF4ZnJhbWVzaXplKSB7CisJCVNBTSgiRVJST1I6ICBiYWQgYXVkaW9faXNvY19tYXhmcmFtZXNpemVcbiIpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisJaWYgKDkgPT0gcGVhc3ljYXAtPmF1ZGlvX2lzb2NfbWF4ZnJhbWVzaXplKSB7CisJCXBlYXN5Y2FwLT5pbGsgfD0gMHgwMjsKKwkJU0FNKCJoYXJkd2FyZSBpcyBGT1VSLUNWQlNcbiIpOworCQlwZWFzeWNhcC0+bWljcm9waG9uZSA9IHRydWU7CisJCXBlYXN5Y2FwLT5hdWRpb19wYWdlc19wZXJfZnJhZ21lbnQgPSA0OworCX0gZWxzZSBpZiAoMjU2ID09IHBlYXN5Y2FwLT5hdWRpb19pc29jX21heGZyYW1lc2l6ZSkgeworCQlwZWFzeWNhcC0+aWxrICY9IH4weDAyOworCQlTQU0oImhhcmR3YXJlIGlzIENWQlMrUy1WSURFT1xuIik7CisJCXBlYXN5Y2FwLT5taWNyb3Bob25lID0gZmFsc2U7CisJCXBlYXN5Y2FwLT5hdWRpb19wYWdlc19wZXJfZnJhZ21lbnQgPSA0OworCX0gZWxzZSB7CisJCVNBTSgiaGFyZHdhcmUgaXMgdW5pZGVudGlmaWVkOlxuIik7CisJCVNBTSgiJWk9YXVkaW9faXNvY19tYXhmcmFtZXNpemVcbiIsIFwKKwkJCQkJcGVhc3ljYXAtPmF1ZGlvX2lzb2NfbWF4ZnJhbWVzaXplKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJcGVhc3ljYXAtPmF1ZGlvX2J5dGVzX3Blcl9mcmFnbWVudCA9IFwKIAkJCQkJcGVhc3ljYXAtPmF1ZGlvX3BhZ2VzX3Blcl9mcmFnbWVudCAqIFwKIAkJCQkJCQkJUEFHRV9TSVpFIDsKLQkJcGVhc3ljYXAtPmF1ZGlvX2J1ZmZlcl9wYWdlX21hbnkgPSAoQVVESU9fRlJBR01FTlRfTUFOWSAqIFwKKwlwZWFzeWNhcC0+YXVkaW9fYnVmZmVyX3BhZ2VfbWFueSA9IChBVURJT19GUkFHTUVOVF9NQU5ZICogXAogCQkJCQlwZWFzeWNhcC0+YXVkaW9fcGFnZXNfcGVyX2ZyYWdtZW50KTsKIAotCQlKT1QoNCwgIiU2aT1BVURJT19GUkFHTUVOVF9NQU5ZXG4iLCBBVURJT19GUkFHTUVOVF9NQU5ZKTsKLQkJSk9UKDQsICIlNmk9YXVkaW9fcGFnZXNfcGVyX2ZyYWdtZW50XG4iLCBcCisJSk9NKDQsICIlNmk9QVVESU9fRlJBR01FTlRfTUFOWVxuIiwgQVVESU9fRlJBR01FTlRfTUFOWSk7CisJSk9NKDQsICIlNmk9YXVkaW9fcGFnZXNfcGVyX2ZyYWdtZW50XG4iLCBcCiAJCQkJCXBlYXN5Y2FwLT5hdWRpb19wYWdlc19wZXJfZnJhZ21lbnQpOwotCQlKT1QoNCwgIiU2aT1hdWRpb19ieXRlc19wZXJfZnJhZ21lbnRcbiIsIFwKKwlKT00oNCwgIiU2aT1hdWRpb19ieXRlc19wZXJfZnJhZ21lbnRcbiIsIFwKIAkJCQkJcGVhc3ljYXAtPmF1ZGlvX2J5dGVzX3Blcl9mcmFnbWVudCk7Ci0JCUpPVCg0LCAiJTZpPWF1ZGlvX2J1ZmZlcl9wYWdlX21hbnlcbiIsIFwKKwlKT00oNCwgIiU2aT1hdWRpb19idWZmZXJfcGFnZV9tYW55XG4iLCBcCiAJCQkJCXBlYXN5Y2FwLT5hdWRpb19idWZmZXJfcGFnZV9tYW55KTsKIAotCQlwZWFzeWNhcC0+YXVkaW9faXNvY19mcmFtZXNwZXJkZXNjID0gMTI4OworCXBlYXN5Y2FwLT5hdWRpb19pc29jX2ZyYW1lc3BlcmRlc2MgPSAxMjg7CiAKLQkJSk9UKDQsICIlaT1hdWRpb19pc29jX2ZyYW1lc3BlcmRlc2NcbiIsIFwKKwlKT00oNCwgIiVpPWF1ZGlvX2lzb2NfZnJhbWVzcGVyZGVzY1xuIiwgXAogCQkJCQlwZWFzeWNhcC0+YXVkaW9faXNvY19mcmFtZXNwZXJkZXNjKTsKLQkJaWYgKDAgPj0gcGVhc3ljYXAtPmF1ZGlvX2lzb2NfZnJhbWVzcGVyZGVzYykgewotCQkJU0FZKCJFUlJPUjogIGJhZCBhdWRpb19pc29jX2ZyYW1lc3BlcmRlc2NcbiIpOwotCQkJcmV0dXJuIC1FTk9FTlQ7Ci0JCX0KLQotCQlwZWFzeWNhcC0+YXVkaW9faXNvY19idWZmZXJfc2l6ZSA9IFwKLQkJCQlwZWFzeWNhcC0+YXVkaW9faXNvY19tYXhmcmFtZXNpemUgKiBcCi0JCQkJcGVhc3ljYXAtPmF1ZGlvX2lzb2NfZnJhbWVzcGVyZGVzYzsKLQkJSk9UKDQsICIlaT1hdWRpb19pc29jX2J1ZmZlcl9zaXplXG4iLCBcCi0JCQkJCXBlYXN5Y2FwLT5hdWRpb19pc29jX2J1ZmZlcl9zaXplKTsKLQkJaWYgKEFVRElPX0lTT0NfQlVGRkVSX1NJWkUgPCBcCi0JCQkJCXBlYXN5Y2FwLT5hdWRpb19pc29jX2J1ZmZlcl9zaXplKSB7Ci0JCQlTQVkoIk1JU1RBS0U6ICBhdWRpb19pc29jX2J1ZmZlcl9zaXplIGJpZ2dlciAiCi0JCQkidGhhbiAlbGk9QVVESU9fSVNPQ19CVUZGRVJfU0laRVxuIiwgXAotCQkJCQkJQVVESU9fSVNPQ19CVUZGRVJfU0laRSk7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQorCWlmICgwID49IHBlYXN5Y2FwLT5hdWRpb19pc29jX2ZyYW1lc3BlcmRlc2MpIHsKKwkJU0FNKCJFUlJPUjogIGJhZCBhdWRpb19pc29jX2ZyYW1lc3BlcmRlc2NcbiIpOworCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKKwlwZWFzeWNhcC0+YXVkaW9faXNvY19idWZmZXJfc2l6ZSA9IFwKKwkJCQlwZWFzeWNhcC0+YXVkaW9faXNvY19tYXhmcmFtZXNpemUgKiBcCisJCQkJcGVhc3ljYXAtPmF1ZGlvX2lzb2NfZnJhbWVzcGVyZGVzYzsKKwlKT00oNCwgIiVpPWF1ZGlvX2lzb2NfYnVmZmVyX3NpemVcbiIsIFwKKwkJCQkJcGVhc3ljYXAtPmF1ZGlvX2lzb2NfYnVmZmVyX3NpemUpOworCWlmIChBVURJT19JU09DX0JVRkZFUl9TSVpFIDwgcGVhc3ljYXAtPmF1ZGlvX2lzb2NfYnVmZmVyX3NpemUpIHsKKwkJCVNBTSgiTUlTVEFLRTogIGF1ZGlvX2lzb2NfYnVmZmVyX3NpemUgYmlnZ2VyICIKKwkJCSJ0aGFuICVsaT1BVURJT19JU09DX0JVRkZFUl9TSVpFXG4iLCBcCisJCQkJCQlBVURJT19JU09DX0JVRkZFUl9TSVpFKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQogCWlmICgtMSA9PSBwZWFzeWNhcC0+YXVkaW9faW50ZXJmYWNlKSB7Ci0JCVNBWSgiTUlTVEFLRTogIGF1ZGlvX2ludGVyZmFjZSBpcyB1bnNldFxuIik7CisJCVNBTSgiTUlTVEFLRTogIGF1ZGlvX2ludGVyZmFjZSBpcyB1bnNldFxuIik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAlpZiAoLTEgPT0gcGVhc3ljYXAtPmF1ZGlvX2FsdHNldHRpbmdfb24pIHsKLQkJU0FZKCJNSVNUQUtFOiAgYXVkaW9fYWx0c2V0dGluZ19vbiBpcyB1bnNldFxuIik7CisJCVNBTSgiTUlTVEFLRTogIGF1ZGlvX2FsdHNldHRpbmdfb24gaXMgdW5zZXRcbiIpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJaWYgKC0xID09IHBlYXN5Y2FwLT5hdWRpb19hbHRzZXR0aW5nX29mZikgewotCQlTQVkoIk1JU1RBS0U6ICBhdWRpb19pbnRlcmZhY2Vfb2ZmIGlzIHVuc2V0XG4iKTsKKwkJU0FNKCJNSVNUQUtFOiAgYXVkaW9faW50ZXJmYWNlX29mZiBpcyB1bnNldFxuIik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAlpZiAoLTEgPT0gcGVhc3ljYXAtPmF1ZGlvX2VuZHBvaW50bnVtYmVyKSB7Ci0JCVNBWSgiTUlTVEFLRTogIGF1ZGlvX2VuZHBvaW50bnVtYmVyIGlzIHVuc2V0XG4iKTsKKwkJU0FNKCJNSVNUQUtFOiAgYXVkaW9fZW5kcG9pbnRudW1iZXIgaXMgdW5zZXRcbiIpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJaWYgKC0xID09IHBlYXN5Y2FwLT5hdWRpb19pc29jX21heGZyYW1lc2l6ZSkgewotCQlTQVkoIk1JU1RBS0U6ICBhdWRpb19pc29jX21heGZyYW1lc2l6ZSBpcyB1bnNldFxuIik7CisJCVNBTSgiTUlTVEFLRTogIGF1ZGlvX2lzb2NfbWF4ZnJhbWVzaXplIGlzIHVuc2V0XG4iKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCWlmICgtMSA9PSBwZWFzeWNhcC0+YXVkaW9faXNvY19idWZmZXJfc2l6ZSkgewotCQlTQVkoIk1JU1RBS0U6ICBhdWRpb19pc29jX2J1ZmZlcl9zaXplIGlzIHVuc2V0XG4iKTsKKwkJU0FNKCJNSVNUQUtFOiAgYXVkaW9faXNvY19idWZmZXJfc2l6ZSBpcyB1bnNldFxuIik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTM5NTYsMTcgKzQ1NDgsMTcgQEAKIAlJTklUX0xJU1RfSEVBRCgmKHBlYXN5Y2FwLT51cmJfYXVkaW9faGVhZCkpOwogCXBlYXN5Y2FwLT5wdXJiX2F1ZGlvX2hlYWQgPSAmKHBlYXN5Y2FwLT51cmJfYXVkaW9faGVhZCk7CiAKLQlKT1QoNCwgImFsbG9jYXRpbmcgYW4gYXVkaW8gYnVmZmVyXG4iKTsKLQlKT1QoNCwgIi4uLi4gc2NhdHRlcmVkIG92ZXIgJWkgcGFnZXNcbiIsIFwKKwlKT00oNCwgImFsbG9jYXRpbmcgYW4gYXVkaW8gYnVmZmVyXG4iKTsKKwlKT00oNCwgIi4uLi4gc2NhdHRlcmVkIG92ZXIgJWkgcGFnZXNcbiIsIFwKIAkJCQkJcGVhc3ljYXAtPmF1ZGlvX2J1ZmZlcl9wYWdlX21hbnkpOwogCiAJZm9yIChrID0gMDsgIGsgPCBwZWFzeWNhcC0+YXVkaW9fYnVmZmVyX3BhZ2VfbWFueTsgIGsrKykgewogCQlpZiAoKHZvaWQgKilOVUxMICE9IHBlYXN5Y2FwLT5hdWRpb19idWZmZXJba10ucGdvKSB7Ci0JCQlTQVkoIkVSUk9SOiBhdHRlbXB0aW5nIHRvIHJlYWxsb2NhdGUgYXVkaW8gYnVmZmVyc1xuIik7CisJCQlTQU0oIkVSUk9SOiBhdHRlbXB0aW5nIHRvIHJlYWxsb2NhdGUgYXVkaW8gYnVmZmVyc1xuIik7CiAJCX0gZWxzZSB7CiAJCQlwYnVmID0gKHZvaWQgKikgX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOwogCQkJaWYgKCh2b2lkICopTlVMTCA9PSBwYnVmKSB7Ci0JCQkJU0FZKCJFUlJPUjogQ291bGQgbm90IGFsbG9jYXRlIGF1ZGlvICIgXAorCQkJCVNBTSgiRVJST1I6IENvdWxkIG5vdCBhbGxvY2F0ZSBhdWRpbyAiIFwKIAkJCQkJCQkiYnVmZmVyIHBhZ2UgJWlcbiIsIGspOwogCQkJCXJldHVybiAtRU5PTUVNOwogCQkJfSBlbHNlCkBAIC0zOTc5LDE2ICs0NTcxLDE2IEBACiAKIAlwZWFzeWNhcC0+YXVkaW9fZmlsbCA9IDA7CiAJcGVhc3ljYXAtPmF1ZGlvX3JlYWQgPSAwOwotCUpPVCg0LCAiYWxsb2NhdGlvbiBvZiBhdWRpbyBidWZmZXIgZG9uZTogICVpIHBhZ2VzXG4iLCBrKTsKKwlKT00oNCwgImFsbG9jYXRpb24gb2YgYXVkaW8gYnVmZmVyIGRvbmU6ICAlaSBwYWdlc1xuIiwgayk7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JSk9UKDQsICJhbGxvY2F0aW5nICVpIGlzb2MgYXVkaW8gYnVmZmVycyBvZiBzaXplICVpXG4iLCAgXAorCUpPTSg0LCAiYWxsb2NhdGluZyAlaSBpc29jIGF1ZGlvIGJ1ZmZlcnMgb2Ygc2l6ZSAlaVxuIiwgIFwKIAkJQVVESU9fSVNPQ19CVUZGRVJfTUFOWSwgcGVhc3ljYXAtPmF1ZGlvX2lzb2NfYnVmZmVyX3NpemUpOwotCUpPVCg0LCAiLi4uLiBlYWNoIG9jY3VweWluZyBjb250aWd1b3VzIG1lbW9yeSBwYWdlc1xuIik7CisJSk9NKDQsICIuLi4uIGVhY2ggb2NjdXB5aW5nIGNvbnRpZ3VvdXMgbWVtb3J5IHBhZ2VzXG4iKTsKIAogCWZvciAoayA9IDA7ICBrIDwgQVVESU9fSVNPQ19CVUZGRVJfTUFOWTsgIGsrKykgewogCQlwYnVmID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIEFVRElPX0lTT0NfT1JERVIpOwogCQlpZiAoTlVMTCA9PSBwYnVmKSB7Ci0JCQlTQVkoIkVSUk9SOiBDb3VsZCBub3QgYWxsb2NhdGUgaXNvYyBhdWRpbyBidWZmZXIgIiBcCisJCQlTQU0oIkVSUk9SOiBDb3VsZCBub3QgYWxsb2NhdGUgaXNvYyBhdWRpbyBidWZmZXIgIiBcCiAJCQkJCQkJIiVpXG4iLCBrKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9IGVsc2UKQEAgLTQwMDAsMjUgKzQ1OTIsMjUgQEAKIAkJcGVhc3ljYXAtPmF1ZGlvX2lzb2NfYnVmZmVyX3NpemU7CiAJCXBlYXN5Y2FwLT5hdWRpb19pc29jX2J1ZmZlcltrXS5rb3VudCA9IGs7CiAJfQotCUpPVCg0LCAiYWxsb2NhdGlvbiBvZiBpc29jIGF1ZGlvIGJ1ZmZlcnMgZG9uZS5cbiIpOworCUpPTSg0LCAiYWxsb2NhdGlvbiBvZiBpc29jIGF1ZGlvIGJ1ZmZlcnMgZG9uZS5cbiIpOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKICAqICBBTExPQ0FURSBBTkQgSU5JVElBTElaRSBNVUxUSVBMRSBzdHJ1Y3QgdXJiIC4uLgogICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JSk9UKDQsICJhbGxvY2F0aW5nICVpIHN0cnVjdCB1cmIuXG4iLCBBVURJT19JU09DX0JVRkZFUl9NQU5ZKTsKLQlKT1QoNCwgInVzaW5nICVpPXBlYXN5Y2FwLT5hdWRpb19pc29jX2ZyYW1lc3BlcmRlc2NcbiIsIFwKKwlKT00oNCwgImFsbG9jYXRpbmcgJWkgc3RydWN0IHVyYi5cbiIsIEFVRElPX0lTT0NfQlVGRkVSX01BTlkpOworCUpPTSg0LCAidXNpbmcgJWk9cGVhc3ljYXAtPmF1ZGlvX2lzb2NfZnJhbWVzcGVyZGVzY1xuIiwgXAogCQkJCQlwZWFzeWNhcC0+YXVkaW9faXNvY19mcmFtZXNwZXJkZXNjKTsKLQlKT1QoNCwgInVzaW5nICVpPXBlYXN5Y2FwLT5hdWRpb19pc29jX21heGZyYW1lc2l6ZVxuIiwgXAorCUpPTSg0LCAidXNpbmcgJWk9cGVhc3ljYXAtPmF1ZGlvX2lzb2NfbWF4ZnJhbWVzaXplXG4iLCBcCiAJCQkJCXBlYXN5Y2FwLT5hdWRpb19pc29jX21heGZyYW1lc2l6ZSk7Ci0JSk9UKDQsICJ1c2luZyAlaT1wZWFzeWNhcC0+YXVkaW9faXNvY19idWZmZXJfc2l6ZVxuIiwgXAorCUpPTSg0LCAidXNpbmcgJWk9cGVhc3ljYXAtPmF1ZGlvX2lzb2NfYnVmZmVyX3NpemVcbiIsIFwKIAkJCQkJcGVhc3ljYXAtPmF1ZGlvX2lzb2NfYnVmZmVyX3NpemUpOwogCiAJZm9yIChrID0gMDsgIGsgPCBBVURJT19JU09DX0JVRkZFUl9NQU5ZOyBrKyspIHsKIAkJcHVyYiA9IHVzYl9hbGxvY191cmIocGVhc3ljYXAtPmF1ZGlvX2lzb2NfZnJhbWVzcGVyZGVzYywgXAogCQkJCQkJCQlHRlBfS0VSTkVMKTsKIAkJaWYgKE5VTEwgPT0gcHVyYikgewotCQkJU0FZKCJFUlJPUjogdXNiX2FsbG9jX3VyYiByZXR1cm5lZCBOVUxMIGZvciBidWZmZXIgIiBcCisJCQlTQU0oIkVSUk9SOiB1c2JfYWxsb2NfdXJiIHJldHVybmVkIE5VTEwgZm9yIGJ1ZmZlciAiIFwKIAkJCQkJCQkiJWlcbiIsIGspOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0gZWxzZQpAQCAtNDAyNiw3ICs0NjE4LDcgQEAKIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIAkJcGRhdGFfdXJiID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRhdGFfdXJiKSwgR0ZQX0tFUk5FTCk7CiAJCWlmIChOVUxMID09IHBkYXRhX3VyYikgewotCQkJU0FZKCJFUlJPUjogQ291bGQgbm90IGFsbG9jYXRlIHN0cnVjdCBkYXRhX3VyYi5cbiIpOworCQkJU0FNKCJFUlJPUjogQ291bGQgbm90IGFsbG9jYXRlIHN0cnVjdCBkYXRhX3VyYi5cbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0gZWxzZQogCQkJcGVhc3ljYXAtPmFsbG9jYXRpb25fYXVkaW9fc3RydWN0ICs9IFwKQEAgLTQwNDMsMzAgKzQ2MzUsMzAgQEAKICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCQlpZiAoIWspIHsKLQkJCUpPVCg0LCAiaW5pdGlhbGl6aW5nIGF1ZGlvIHVyYnMgdGh1czpcbiIpOwotCQkJSk9UKDQsICIgIHB1cmItPmludGVydmFsID0gMTtcbiIpOwotCQkJSk9UKDQsICIgIHB1cmItPmRldiA9IHBlYXN5Y2FwLT5wdXNiX2RldmljZTtcbiIpOwotCQkJSk9UKDQsICIgIHB1cmItPnBpcGUgPSB1c2JfcmN2aXNvY3BpcGUocGVhc3ljYXAtPiIgXAorCQkJSk9NKDQsICJpbml0aWFsaXppbmcgYXVkaW8gdXJicyB0aHVzOlxuIik7CisJCQlKT00oNCwgIiAgcHVyYi0+aW50ZXJ2YWwgPSAxO1xuIik7CisJCQlKT00oNCwgIiAgcHVyYi0+ZGV2ID0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlO1xuIik7CisJCQlKT00oNCwgIiAgcHVyYi0+cGlwZSA9IHVzYl9yY3Zpc29jcGlwZShwZWFzeWNhcC0+IiBcCiAJCQkJCSJwdXNiX2RldmljZSwlaSk7XG4iLCBcCiAJCQkJCXBlYXN5Y2FwLT5hdWRpb19lbmRwb2ludG51bWJlcik7Ci0JCQlKT1QoNCwgIiAgcHVyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfSVNPX0FTQVA7XG4iKTsKLQkJCUpPVCg0LCAiICBwdXJiLT50cmFuc2Zlcl9idWZmZXIgPSAiIFwKKwkJCUpPTSg0LCAiICBwdXJiLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9JU09fQVNBUDtcbiIpOworCQkJSk9NKDQsICIgIHB1cmItPnRyYW5zZmVyX2J1ZmZlciA9ICIgXAogCQkJCSJwZWFzeWNhcC0+YXVkaW9faXNvY19idWZmZXJbLl0ucGdvO1xuIik7Ci0JCQlKT1QoNCwgIiAgcHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9ICVpO1xuIiwgXAorCQkJSk9NKDQsICIgIHB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSAlaTtcbiIsIFwKIAkJCQkJcGVhc3ljYXAtPmF1ZGlvX2lzb2NfYnVmZmVyX3NpemUpOwotCQkJSk9UKDQsICIgIHB1cmItPmNvbXBsZXRlID0gZWFzeXNuZF9jb21wbGV0ZTtcbiIpOwotCQkJSk9UKDQsICIgIHB1cmItPmNvbnRleHQgPSBwZWFzeWNhcDtcbiIpOwotCQkJSk9UKDQsICIgIHB1cmItPnN0YXJ0X2ZyYW1lID0gMDtcbiIpOwotCQkJSk9UKDQsICIgIHB1cmItPm51bWJlcl9vZl9wYWNrZXRzID0gJWk7XG4iLCBcCisJCQlKT00oNCwgIiAgcHVyYi0+Y29tcGxldGUgPSBlYXN5c25kX2NvbXBsZXRlO1xuIik7CisJCQlKT00oNCwgIiAgcHVyYi0+Y29udGV4dCA9IHBlYXN5Y2FwO1xuIik7CisJCQlKT00oNCwgIiAgcHVyYi0+c3RhcnRfZnJhbWUgPSAwO1xuIik7CisJCQlKT00oNCwgIiAgcHVyYi0+bnVtYmVyX29mX3BhY2tldHMgPSAlaTtcbiIsIFwKIAkJCQkJcGVhc3ljYXAtPmF1ZGlvX2lzb2NfZnJhbWVzcGVyZGVzYyk7Ci0JCQlKT1QoNCwgIiAgZm9yIChqID0gMDsgaiA8ICVpOyBqKyspXG4iLCBcCisJCQlKT00oNCwgIiAgZm9yIChqID0gMDsgaiA8ICVpOyBqKyspXG4iLCBcCiAJCQkJCXBlYXN5Y2FwLT5hdWRpb19pc29jX2ZyYW1lc3BlcmRlc2MpOwotCQkJSk9UKDQsICIgICAge1xuIik7Ci0JCQlKT1QoNCwgIiAgICBwdXJiLT5pc29fZnJhbWVfZGVzY1tqXS5vZmZzZXQgPSBqKiVpO1xuIixcCisJCQlKT00oNCwgIiAgICB7XG4iKTsKKwkJCUpPTSg0LCAiICAgIHB1cmItPmlzb19mcmFtZV9kZXNjW2pdLm9mZnNldCA9IGoqJWk7XG4iLFwKIAkJCQkJcGVhc3ljYXAtPmF1ZGlvX2lzb2NfbWF4ZnJhbWVzaXplKTsKLQkJCUpPVCg0LCAiICAgIHB1cmItPmlzb19mcmFtZV9kZXNjW2pdLmxlbmd0aCA9ICVpO1xuIiwgXAorCQkJSk9NKDQsICIgICAgcHVyYi0+aXNvX2ZyYW1lX2Rlc2Nbal0ubGVuZ3RoID0gJWk7XG4iLCBcCiAJCQkJCXBlYXN5Y2FwLT5hdWRpb19pc29jX21heGZyYW1lc2l6ZSk7Ci0JCQlKT1QoNCwgIiAgICB9XG4iKTsKKwkJCUpPTSg0LCAiICAgIH1cbiIpOwogCQkJfQogCiAJCXB1cmItPmludGVydmFsID0gMTsKQEAgLTQwODgsNyArNDY4MCw3IEBACiAJCQkJCXBlYXN5Y2FwLT5hdWRpb19pc29jX21heGZyYW1lc2l6ZTsKIAkJfQogCX0KLQlKT1QoNCwgImFsbG9jYXRpb24gb2YgJWkgc3RydWN0IHVyYiBkb25lLlxuIiwgayk7CisJSk9NKDQsICJhbGxvY2F0aW9uIG9mICVpIHN0cnVjdCB1cmIgZG9uZS5cbiIsIGspOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKICAqICBTQVZFIFBPSU5URVIgcGVhc3ljYXAgSU4gVEhJUyBJTlRFUkZBQ0UuCkBAIC00MTA1LDE0ICs0Njk3LDE4IEBACiAJCWVycigiTm90IGFibGUgdG8gZ2V0IGEgbWlub3IgZm9yIHRoaXMgZGV2aWNlLiIpOwogCQl1c2Jfc2V0X2ludGZkYXRhKHB1c2JfaW50ZXJmYWNlLCBOVUxMKTsKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JfSBlbHNlCisJfSBlbHNlIHsKKwkJSk9NKDgsICJrcmVmX2dldCgpIHdpdGggJWk9cGVhc3ljYXAtPmtyZWYucmVmY291bnQuY291bnRlclxuIixcCisJCQkJCShpbnQpcGVhc3ljYXAtPmtyZWYucmVmY291bnQuY291bnRlcik7CisJCWtyZWZfZ2V0KCZwZWFzeWNhcC0+a3JlZik7CiAJCShwZWFzeWNhcC0+cmVnaXN0ZXJlZF9hdWRpbykrKzsKKwl9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgogICogIExFVCBUSEUgVVNFUiBLTk9XIFdIQVQgTk9ERSBUSEUgQVVESU8gREVWSUNFIElTIEFUVEFDSEVEIFRPLgogICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JU0FZKCJlYXN5c25kIGF0dGFjaGVkIHRvIG1pbm9yICMlZFxuIiwgcHVzYl9pbnRlcmZhY2UtPm1pbm9yKTsKKwlTQU0oImVhc3lzbmQgYXR0YWNoZWQgdG8gbWlub3IgIyVkXG4iLCBwdXNiX2ludGVyZmFjZS0+bWlub3IpOwogCWJyZWFrOwogfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtNDEyMSwyMCArNDcxNywxOSBAQAogICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBkZWZhdWx0OiB7Ci0JSk9UKDQsICJFUlJPUjogdW5leHBlY3RlZCBpbnRlcmZhY2UgJWlcbiIsIGJJbnRlcmZhY2VOdW1iZXIpOworCUpPTSg0LCAiRVJST1I6IHVuZXhwZWN0ZWQgaW50ZXJmYWNlICVpXG4iLCBiSW50ZXJmYWNlTnVtYmVyKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIH0KLUpPVCg0LCAiZW5kcyBzdWNjZXNzZnVsbHkgZm9yIGludGVyZmFjZSAlaVxuIiwgXAorSk9NKDQsICJlbmRzIHN1Y2Nlc3NmdWxseSBmb3IgaW50ZXJmYWNlICVpXG4iLCBcCiAJCQkJcHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvci0+YkludGVyZmFjZU51bWJlcik7CiByZXR1cm4gMDsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qCi0gKiAgV0hFTiBUSElTIEZVTkNUSU9OIElTIENBTExFRCBUSEUgREVWSUNFIEhBUyBBTFJFQURZIEJFRU4gUEhZU0lDQUxMWQotICogIFVOUExVR0dFRC4KLSAqICBIRU5DRSBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgSVMgTk8gTE9OR0VSIFZBTElEIEFORCBNVVNUIEJFIFNFVCBUTyBOVUxMLgorICogIFdIRU4gVEhJUyBGVU5DVElPTiBJUyBDQUxMRUQgVEhFIEVhc3lDQVAgSEFTIEFMUkVBRFkgQkVFTiBQSFlTSUNBTExZCisgKiAgVU5QTFVHR0VELiAgSEVOQ0UgcGVhc3ljYXAtPnB1c2JfZGV2aWNlIElTIE5PIExPTkdFUiBWQUxJRC4KICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogdm9pZApAQCAtNDE0Nyw3ICs0NzQyLDE0IEBACiAKIHN0cnVjdCBsaXN0X2hlYWQgKnBsaXN0X2hlYWQ7CiBzdHJ1Y3QgZGF0YV91cmIgKnBkYXRhX3VyYjsKLWludCBtaW5vciwgbTsKK2ludCBtaW5vciwgbSwga2Q7CisvKnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2diovCisjaWYgZGVmaW5lZChFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVCkKKyNpZiBkZWZpbmVkKEVBU1lDQVBfTkVFRFNfVjRMMl9ERVZJQ0VfSCkKK3N0cnVjdCB2NGwyX2RldmljZSAqcHY0bDJfZGV2aWNlOworI2VuZGlmIC8qRUFTWUNBUF9ORUVEU19WNEwyX0RFVklDRV9IKi8KKyNlbmRpZiAvKkVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKi8KKy8qXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eKi8KIAogSk9UKDQsICJcbiIpOwogCkBAIC00MTY5LDEwNyArNDc3MSwxODggQEAKIG1pbm9yID0gcHVzYl9pbnRlcmZhY2UtPm1pbm9yOwogSk9UKDQsICJpbnRmWyVpXTogbWlub3I9JWlcbiIsIGJJbnRlcmZhY2VOdW1iZXIsIG1pbm9yKTsKIAoraWYgKDEgPT0gYkludGVyZmFjZU51bWJlcikKKwlyZXR1cm47CisKIHBlYXN5Y2FwID0gdXNiX2dldF9pbnRmZGF0YShwdXNiX2ludGVyZmFjZSk7Ci1pZiAoKHN0cnVjdCBlYXN5Y2FwICopTlVMTCA9PSBwZWFzeWNhcCkKK2lmIChOVUxMID09IHBlYXN5Y2FwKSB7CiAJU0FZKCJFUlJPUjogcGVhc3ljYXAgaXMgTlVMTFxuIik7Ci1lbHNlIHsKLQlwZWFzeWNhcC0+cHVzYl9kZXZpY2UgPSAoc3RydWN0IHVzYl9kZXZpY2UgKilOVUxMOwotCXN3aXRjaCAoYkludGVyZmFjZU51bWJlcikgeworCXJldHVybjsKK30KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQljYXNlIDA6IHsKLQkJaWYgKChzdHJ1Y3QgbGlzdF9oZWFkICopTlVMTCAhPSBwZWFzeWNhcC0+cHVyYl92aWRlb19oZWFkKSB7Ci0JCQlKT1QoNCwgImtpbGxpbmcgdmlkZW8gdXJic1xuIik7Ci0JCQltID0gMDsKLQkJCWxpc3RfZm9yX2VhY2gocGxpc3RfaGVhZCwgKHBlYXN5Y2FwLT5wdXJiX3ZpZGVvX2hlYWQpKQotCQkJCXsKLQkJCQlwZGF0YV91cmIgPSBsaXN0X2VudHJ5KHBsaXN0X2hlYWQsIFwKLQkJCQkJCXN0cnVjdCBkYXRhX3VyYiwgbGlzdF9oZWFkKTsKLQkJCQlpZiAoKHN0cnVjdCBkYXRhX3VyYiAqKU5VTEwgIT0gcGRhdGFfdXJiKSB7Ci0JCQkJCWlmICgoc3RydWN0IHVyYiAqKU5VTEwgIT0gXAotCQkJCQkJCXBkYXRhX3VyYi0+cHVyYikgewotCQkJCQkJdXNiX2tpbGxfdXJiKHBkYXRhX3VyYi0+cHVyYik7Ci0JCQkJCQltKys7Ci0JCQkJCX0KKyNpZiAoIWRlZmluZWQoRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQpKQorIworLyp2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYqLworI2Vsc2UKKyNpZiBkZWZpbmVkKEVBU1lDQVBfTkVFRFNfVjRMMl9ERVZJQ0VfSCkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgU09NRSBWRVJTSU9OUyBPRiBUSEUgdmlkZW9kZXYgTU9EVUxFIE9WRVJXUklURSBUSEUgREFUQSBXSElDSCBIQVMKKyAqICBCRUVOIFdSSVRURU4gQlkgVEhFIENBTEwgVE8gdXNiX3NldF9pbnRmZGF0YSgpIElOIGVhc3ljYXBfdXNiX3Byb2JlKCksCisgKiAgUkVQTEFDSU5HIElUIFdJVEggQSBQT0lOVEVSIFRPIFRIRSBFTUJFRERFRCB2NGwyX2RldmljZSBTVFJVQ1RVUkUuCisgKiAgVE8gREVURUNUIFRISVMsIFRIRSBTVFJJTkcgSU4gVEhFIGVhc3ljYXAudGVsbHRhbGVbXSBCVUZGRVIgSVMgQ0hFQ0tFRC4KKyovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpZiAobWVtY21wKCZwZWFzeWNhcC0+dGVsbHRhbGVbMF0sIFRFTExUQUxFLCBzdHJsZW4oVEVMTFRBTEUpKSkgeworCXB2NGwyX2RldmljZSA9IHVzYl9nZXRfaW50ZmRhdGEocHVzYl9pbnRlcmZhY2UpOworCWlmICgoc3RydWN0IHY0bDJfZGV2aWNlICopTlVMTCA9PSBwdjRsMl9kZXZpY2UpIHsKKwkJU0FZKCJFUlJPUjogcHY0bDJfZGV2aWNlIGlzIE5VTExcbiIpOworCQlyZXR1cm47CisJfQorCXBlYXN5Y2FwID0gKHN0cnVjdCBlYXN5Y2FwICopIFwKKwkJY29udGFpbmVyX29mKHB2NGwyX2RldmljZSwgc3RydWN0IGVhc3ljYXAsIHY0bDJfZGV2aWNlKTsKK30KKyNlbmRpZiAvKkVBU1lDQVBfTkVFRFNfVjRMMl9ERVZJQ0VfSCovCisjCisjZW5kaWYgLypFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVCovCisvKl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXiovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpZiAobWVtY21wKCZwZWFzeWNhcC0+dGVsbHRhbGVbMF0sIFRFTExUQUxFLCBzdHJsZW4oVEVMTFRBTEUpKSkgeworCVNBWSgiRVJST1I6IGJhZCBwZWFzeWNhcDogMHglMDhsWFxuIiwgKHVuc2lnbmVkIGxvbmcgaW50KSBwZWFzeWNhcCk7CisJcmV0dXJuOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBJRiBUSEUgV0FJVCBRVUVVRVMgQVJFIE5PVCBDTEVBUkVEIEEgREVBRExPQ0sgSVMgUE9TU0lCTEUuICBCRVdBUkUuCisqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworcGVhc3ljYXAtPnZpZGVvX2VvZiA9IDE7CitwZWFzeWNhcC0+YXVkaW9fZW9mID0gMTsKK3dha2VfdXBfaW50ZXJydXB0aWJsZSgmKHBlYXN5Y2FwLT53cV92aWRlbykpOword2FrZV91cF9pbnRlcnJ1cHRpYmxlKCYocGVhc3ljYXAtPndxX2F1ZGlvKSk7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzd2l0Y2ggKGJJbnRlcmZhY2VOdW1iZXIpIHsKK2Nhc2UgMDogeworCWlmICgoc3RydWN0IGxpc3RfaGVhZCAqKU5VTEwgIT0gcGVhc3ljYXAtPnB1cmJfdmlkZW9faGVhZCkgeworCQlKT00oNCwgImtpbGxpbmcgdmlkZW8gdXJic1xuIik7CisJCW0gPSAwOworCQlsaXN0X2Zvcl9lYWNoKHBsaXN0X2hlYWQsIChwZWFzeWNhcC0+cHVyYl92aWRlb19oZWFkKSkKKwkJCXsKKwkJCXBkYXRhX3VyYiA9IGxpc3RfZW50cnkocGxpc3RfaGVhZCwgXAorCQkJCQlzdHJ1Y3QgZGF0YV91cmIsIGxpc3RfaGVhZCk7CisJCQlpZiAoKHN0cnVjdCBkYXRhX3VyYiAqKU5VTEwgIT0gcGRhdGFfdXJiKSB7CisJCQkJaWYgKChzdHJ1Y3QgdXJiICopTlVMTCAhPSBcCisJCQkJCQlwZGF0YV91cmItPnB1cmIpIHsKKwkJCQkJdXNiX2tpbGxfdXJiKHBkYXRhX3VyYi0+cHVyYik7CisJCQkJCW0rKzsKIAkJCQl9CiAJCQl9Ci0JCQlKT1QoNCwgIiVpIHZpZGVvIHVyYnMga2lsbGVkXG4iLCBtKTsKLQkJfSBlbHNlCi0JCQlTQVkoIkVSUk9SOiBwZWFzeWNhcC0+cHVyYl92aWRlb19oZWFkIGlzIE5VTExcbiIpOwotCQlicmVhazsKKwkJfQorCQlKT00oNCwgIiVpIHZpZGVvIHVyYnMga2lsbGVkXG4iLCBtKTsKIAl9CisJYnJlYWs7Cit9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JY2FzZSAyOiB7Ci0JCWlmICgoc3RydWN0IGxpc3RfaGVhZCAqKU5VTEwgIT0gcGVhc3ljYXAtPnB1cmJfYXVkaW9faGVhZCkgewotCQkJSk9UKDQsICJraWxsaW5nIGF1ZGlvIHVyYnNcbiIpOwotCQkJbSA9IDA7Ci0JCQlsaXN0X2Zvcl9lYWNoKHBsaXN0X2hlYWQsIFwKLQkJCQkJCShwZWFzeWNhcC0+cHVyYl9hdWRpb19oZWFkKSkgewotCQkJCXBkYXRhX3VyYiA9IGxpc3RfZW50cnkocGxpc3RfaGVhZCwgXAotCQkJCQkJc3RydWN0IGRhdGFfdXJiLCBsaXN0X2hlYWQpOwotCQkJCWlmICgoc3RydWN0IGRhdGFfdXJiICopTlVMTCAhPSBwZGF0YV91cmIpIHsKLQkJCQkJaWYgKChzdHJ1Y3QgdXJiICopTlVMTCAhPSBcCi0JCQkJCQkJcGRhdGFfdXJiLT5wdXJiKSB7Ci0JCQkJCQl1c2Jfa2lsbF91cmIocGRhdGFfdXJiLT5wdXJiKTsKLQkJCQkJCW0rKzsKLQkJCQkJfQorY2FzZSAyOiB7CisJaWYgKChzdHJ1Y3QgbGlzdF9oZWFkICopTlVMTCAhPSBwZWFzeWNhcC0+cHVyYl9hdWRpb19oZWFkKSB7CisJCUpPTSg0LCAia2lsbGluZyBhdWRpbyB1cmJzXG4iKTsKKwkJbSA9IDA7CisJCWxpc3RfZm9yX2VhY2gocGxpc3RfaGVhZCwgXAorCQkJCQkocGVhc3ljYXAtPnB1cmJfYXVkaW9faGVhZCkpIHsKKwkJCXBkYXRhX3VyYiA9IGxpc3RfZW50cnkocGxpc3RfaGVhZCwgXAorCQkJCQlzdHJ1Y3QgZGF0YV91cmIsIGxpc3RfaGVhZCk7CisJCQlpZiAoKHN0cnVjdCBkYXRhX3VyYiAqKU5VTEwgIT0gcGRhdGFfdXJiKSB7CisJCQkJaWYgKChzdHJ1Y3QgdXJiICopTlVMTCAhPSBcCisJCQkJCQlwZGF0YV91cmItPnB1cmIpIHsKKwkJCQkJdXNiX2tpbGxfdXJiKHBkYXRhX3VyYi0+cHVyYik7CisJCQkJCW0rKzsKIAkJCQl9CiAJCQl9Ci0JCQlKT1QoNCwgIiVpIGF1ZGlvIHVyYnMga2lsbGVkXG4iLCBtKTsKLQkJfSBlbHNlCi0JCQlTQVkoIkVSUk9SOiBwZWFzeWNhcC0+cHVyYl9hdWRpb19oZWFkIGlzIE5VTExcbiIpOwotCQlicmVhazsKKwkJfQorCQlKT00oNCwgIiVpIGF1ZGlvIHVyYnMga2lsbGVkXG4iLCBtKTsKIAl9CisJYnJlYWs7Cit9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQorZGVmYXVsdDoKKwlicmVhazsKIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKICAqICBERVJFR0lTVEVSCisgKgorICogIFRISVMgUFJPQ0VEVVJFIFdJTEwgQkxPQ0sgVU5USUwgZWFzeWNhcF9wb2xsKCksIFZJREVPIElPQ1RMIEFORCBBVURJTworICogIElPQ1RMIEFSRSBBTEwgVU5MT0NLRUQuICBJRiBUSElTIElTIE5PVCBET05FIEFOIE9vcHMgQ0FOIE9DQ1VSIFdIRU4KKyAqICBBTiBFYXN5Q0FQIElTIFVOUExVR0dFRCBXSElMRSBUSEUgVVJCUyBBUkUgUlVOTklORy4gIEJFV0FSRS4KICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitrZCA9IGlzZG9uZ2xlKHBlYXN5Y2FwKTsKIHN3aXRjaCAoYkludGVyZmFjZU51bWJlcikgewogY2FzZSAwOiB7CisJaWYgKDAgPD0ga2QgJiYgRE9OR0xFX01BTlkgPiBrZCkgeworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBlYXN5Y2FwLT53cV92aWRlbyk7CisJCUpPTSg0LCAiYWJvdXQgdG8gbG9jayBlYXN5Y2FwX2RvbmdsZVslaV0ubXV0ZXhfdmlkZW9cbiIsIGtkKTsKKwkJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZWFzeWNhcF9kb25nbGVba2RdLlwKKwkJCQkJCQkJbXV0ZXhfdmlkZW8pKSB7CisJCQlTQVkoIkVSUk9SOiBjYW5ub3QgbG9jayBlYXN5Y2FwX2RvbmdsZVslaV0uIiBcCisJCQkJCQkJIm11dGV4X3ZpZGVvXG4iLCBrZCk7CisJCQlyZXR1cm47CisJCX0KKwkJSk9NKDQsICJsb2NrZWQgZWFzeWNhcF9kb25nbGVbJWldLm11dGV4X3ZpZGVvXG4iLCBrZCk7CisJfSBlbHNlCisJCVNBWSgiRVJST1I6ICVpPWtkIGlzIGJhZDogY2Fubm90IGxvY2sgZG9uZ2xlXG4iLCBrZCk7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjaWYgKCFkZWZpbmVkKEVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKSkKIAlpZiAoKHN0cnVjdCBlYXN5Y2FwICopTlVMTCA9PSBwZWFzeWNhcCkgewotCQlTQVkoIkVSUk9SOiBwZWFzeWNhcCBoYXMgYmVjb21lIE5VTExcbiIpOworCQlTQU0oIkVSUk9SOiBwZWFzeWNhcCBoYXMgYmVjb21lIE5VTExcbiIpOwogCX0gZWxzZSB7Ci0JCWxvY2tfa2VybmVsKCk7CiAJCXVzYl9kZXJlZ2lzdGVyX2RldihwdXNiX2ludGVyZmFjZSwgJmVhc3ljYXBfY2xhc3MpOwogCQkocGVhc3ljYXAtPnJlZ2lzdGVyZWRfdmlkZW8pLS07Ci0KLQkJSk9UKDQsICJpbnRmWyVpXTogdXNiX2RlcmVnaXN0ZXJfZGV2KClcbiIsIGJJbnRlcmZhY2VOdW1iZXIpOwotCQl1bmxvY2tfa2VybmVsKCk7Ci0JCVNBWSgiZWFzeWNhcCBkZXRhY2hlZCBmcm9tIG1pbm9yICMlZFxuIiwgbWlub3IpOworCQlKT00oNCwgImludGZbJWldOiB1c2JfZGVyZWdpc3Rlcl9kZXYoKVxuIiwgYkludGVyZmFjZU51bWJlcik7CisJCVNBTSgiZWFzeWNhcCBkZXRhY2hlZCBmcm9tIG1pbm9yICMlZFxuIiwgbWlub3IpOwogCX0KLS8qdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYqLworLyp2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYqLwogI2Vsc2UKLQlpZiAoKHN0cnVjdCBlYXN5Y2FwICopTlVMTCA9PSBwZWFzeWNhcCkKLQkJU0FZKCJFUlJPUjogcGVhc3ljYXAgaGFzIGJlY29tZSBOVUxMXG4iKTsKLQllbHNlIHsKLQkJbG9ja19rZXJuZWwoKTsKLQkJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UocGVhc3ljYXAtPnB2aWRlb19kZXZpY2UpOwotCQkocGVhc3ljYXAtPnJlZ2lzdGVyZWRfdmlkZW8pLS07Ci0JCXVubG9ja19rZXJuZWwoKTsKLQkJSk9UKDQsICJ1bnJlZ2lzdGVyZWQgd2l0aCB2aWRlb2RldjogJWk9bWlub3JcbiIsIFwKLQkJCQkJCQlwdmlkZW9fZGV2aWNlLT5taW5vcik7CisjaWYgZGVmaW5lZChFQVNZQ0FQX05FRURTX1Y0TDJfREVWSUNFX0gpCisJaWYgKCFwZWFzeWNhcC0+djRsMl9kZXZpY2UubmFtZVswXSkgeworCQlTQU0oIkVSUk9SOiBwZWFzeWNhcC0+djRsMl9kZXZpY2UubmFtZSBpcyBlbXB0eVxuIik7CisJCWlmICgwIDw9IGtkICYmIERPTkdMRV9NQU5ZID4ga2QpCisJCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CisJCXJldHVybjsKIAl9Ci0vKl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eKi8KKwl2NGwyX2RldmljZV9kaXNjb25uZWN0KCZwZWFzeWNhcC0+djRsMl9kZXZpY2UpOworCUpPTSg0LCAidjRsMl9kZXZpY2VfZGlzY29ubmVjdCgpIE9LXG4iKTsKKwl2NGwyX2RldmljZV91bnJlZ2lzdGVyKCZwZWFzeWNhcC0+djRsMl9kZXZpY2UpOworCUpPTSg0LCAidjRsMl9kZXZpY2VfdW5yZWdpc3RlcigpIE9LXG4iKTsKKyNlbmRpZiAvKkVBU1lDQVBfTkVFRFNfVjRMMl9ERVZJQ0VfSCovCisKKwl2aWRlb191bnJlZ2lzdGVyX2RldmljZSgmcGVhc3ljYXAtPnZpZGVvX2RldmljZSk7CisJSk9NKDQsICJpbnRmWyVpXTogdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoKSBPS1xuIiwgYkludGVyZmFjZU51bWJlcik7CisJKHBlYXN5Y2FwLT5yZWdpc3RlcmVkX3ZpZGVvKS0tOworCUpPTSg0LCAidW5yZWdpc3RlcmVkIHdpdGggdmlkZW9kZXY6ICVpPW1pbm9yXG4iLCBtaW5vcik7CiAjZW5kaWYgLypFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVCovCisvKl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXiovCisKKwlpZiAoMCA8PSBrZCAmJiBET05HTEVfTUFOWSA+IGtkKSB7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKKwkJSk9NKDQsICJ1bmxvY2tlZCBlYXN5Y2FwX2RvbmdsZVslaV0ubXV0ZXhfdmlkZW9cbiIsIGtkKTsKKwl9CiAJYnJlYWs7CiB9CiBjYXNlIDI6IHsKLQlsb2NrX2tlcm5lbCgpOworCWlmICgwIDw9IGtkICYmIERPTkdMRV9NQU5ZID4ga2QpIHsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwZWFzeWNhcC0+d3FfYXVkaW8pOworCQlKT00oNCwgImFib3V0IHRvIGxvY2sgZWFzeWNhcF9kb25nbGVbJWldLm11dGV4X2F1ZGlvXG4iLCBrZCk7CisJCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmVhc3ljYXBfZG9uZ2xlW2tkXS5cCisJCQkJCQkJCW11dGV4X2F1ZGlvKSkgeworCQkJU0FZKCJFUlJPUjogY2Fubm90IGxvY2sgZWFzeWNhcF9kb25nbGVbJWldLiIgXAorCQkJCQkJCSJtdXRleF9hdWRpb1xuIiwga2QpOworCQkJcmV0dXJuOworCQl9CisJCUpPTSg0LCAibG9ja2VkIGVhc3ljYXBfZG9uZ2xlWyVpXS5tdXRleF9hdWRpb1xuIiwga2QpOworCX0gZWxzZQorCQlTQVkoIkVSUk9SOiAlaT1rZCBpcyBiYWQ6IGNhbm5vdCBsb2NrIGRvbmdsZVxuIiwga2QpOwogCiAJdXNiX2RlcmVnaXN0ZXJfZGV2KHB1c2JfaW50ZXJmYWNlLCAmZWFzeXNuZF9jbGFzcyk7Ci0JaWYgKChzdHJ1Y3QgZWFzeWNhcCAqKU5VTEwgIT0gcGVhc3ljYXApCi0JCShwZWFzeWNhcC0+cmVnaXN0ZXJlZF9hdWRpbyktLTsKKwkocGVhc3ljYXAtPnJlZ2lzdGVyZWRfYXVkaW8pLS07CiAKLQlKT1QoNCwgImludGZbJWldOiB1c2JfZGVyZWdpc3Rlcl9kZXYoKVxuIiwgYkludGVyZmFjZU51bWJlcik7Ci0JdW5sb2NrX2tlcm5lbCgpOworCUpPTSg0LCAiaW50ZlslaV06IHVzYl9kZXJlZ2lzdGVyX2RldigpXG4iLCBiSW50ZXJmYWNlTnVtYmVyKTsKKwlTQU0oImVhc3lzbmQgZGV0YWNoZWQgZnJvbSBtaW5vciAjJWRcbiIsIG1pbm9yKTsKIAotCVNBWSgiZWFzeXNuZCBkZXRhY2hlZCBmcm9tIG1pbm9yICMlZFxuIiwgbWlub3IpOworCWlmICgwIDw9IGtkICYmIERPTkdMRV9NQU5ZID4ga2QpIHsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOworCQlKT00oNCwgInVubG9ja2VkIGVhc3ljYXBfZG9uZ2xlWyVpXS5tdXRleF9hdWRpb1xuIiwga2QpOworCX0KIAlicmVhazsKIH0KIGRlZmF1bHQ6CkBAIC00MjgwLDI1ICs0OTYzLDQyIEBACiAgKiAgQ0FMTCBlYXN5Y2FwX2RlbGV0ZSgpIElGIE5PIFJFTUFJTklORyBSRUZFUkVOQ0VTIFRPIHBlYXN5Y2FwCiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWlmICgoc3RydWN0IGVhc3ljYXAgKilOVUxMID09IHBlYXN5Y2FwKSB7Ci0JU0FZKCJFUlJPUjogcGVhc3ljYXAgaGFzIGJlY29tZSBOVUxMXG4iKTsKLQlTQVkoImNhbm5vdCBjYWxsIGtyZWZfcHV0KClcbiIpOwotCVNBWSgiZW5kaW5nIHVuc3VjY2Vzc2Z1bGx5OiBtYXkgY2F1c2UgbWVtb3J5IGxlYWtcbiIpOwotCXJldHVybjsKLX0KIGlmICghcGVhc3ljYXAtPmtyZWYucmVmY291bnQuY291bnRlcikgewotCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT5rcmVmLnJlZmNvdW50LmNvdW50ZXIgaXMgemVybyAiIFwKKwlTQU0oIkVSUk9SOiBwZWFzeWNhcC0+a3JlZi5yZWZjb3VudC5jb3VudGVyIGlzIHplcm8gIgogCQkJCQkJInNvIGNhbm5vdCBjYWxsIGtyZWZfcHV0KClcbiIpOwotCVNBWSgiZW5kaW5nIHVuc3VjY2Vzc2Z1bGx5OiBtYXkgY2F1c2UgbWVtb3J5IGxlYWtcbiIpOworCVNBTSgiZW5kaW5nIHVuc3VjY2Vzc2Z1bGx5OiBtYXkgY2F1c2UgbWVtb3J5IGxlYWtcbiIpOwogCXJldHVybjsKIH0KLUpPVCg0LCAiaW50ZlslaV06IGtyZWZfcHV0KCkgd2l0aCAlaT1wZWFzeWNhcC0+a3JlZi5yZWZjb3VudC5jb3VudGVyXG4iLCBcCitpZiAoMCA8PSBrZCAmJiBET05HTEVfTUFOWSA+IGtkKSB7CisJSk9NKDQsICJhYm91dCB0byBsb2NrIGVhc3ljYXBfZG9uZ2xlWyVpXS5tdXRleF92aWRlb1xuIiwga2QpOworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbykpIHsKKwkJU0FZKCJFUlJPUjogY2Fubm90IGRvd24gZWFzeWNhcF9kb25nbGVbJWldLm11dGV4X3ZpZGVvXG4iLCBrZCk7CisJCVNBTSgiZW5kaW5nIHVuc3VjY2Vzc2Z1bGx5OiBtYXkgY2F1c2UgbWVtb3J5IGxlYWtcbiIpOworCXJldHVybjsKKwl9CisJSk9NKDQsICJsb2NrZWQgZWFzeWNhcF9kb25nbGVbJWldLm11dGV4X3ZpZGVvXG4iLCBrZCk7CisJSk9NKDQsICJhYm91dCB0byBsb2NrIGVhc3ljYXBfZG9uZ2xlWyVpXS5tdXRleF9hdWRpb1xuIiwga2QpOworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbykpIHsKKwkJU0FZKCJFUlJPUjogY2Fubm90IGRvd24gZWFzeWNhcF9kb25nbGVbJWldLm11dGV4X2F1ZGlvXG4iLCBrZCk7CisJCW11dGV4X3VubG9jaygmKGVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbykpOworCQlKT00oNCwgInVubG9ja2VkIGVhc3ljYXBfZG9uZ2xlWyVpXS5tdXRleF92aWRlb1xuIiwga2QpOworCQlTQU0oImVuZGluZyB1bnN1Y2Nlc3NmdWxseTogbWF5IGNhdXNlIG1lbW9yeSBsZWFrXG4iKTsKKwkJcmV0dXJuOworCX0KKwlKT00oNCwgImxvY2tlZCBlYXN5Y2FwX2RvbmdsZVslaV0ubXV0ZXhfYXVkaW9cbiIsIGtkKTsKK30KK0pPTSg0LCAiaW50ZlslaV06ICVpPXBlYXN5Y2FwLT5rcmVmLnJlZmNvdW50LmNvdW50ZXJcbiIsIFwKIAkJYkludGVyZmFjZU51bWJlciwgKGludClwZWFzeWNhcC0+a3JlZi5yZWZjb3VudC5jb3VudGVyKTsKIGtyZWZfcHV0KCZwZWFzeWNhcC0+a3JlZiwgZWFzeWNhcF9kZWxldGUpOwogSk9UKDQsICJpbnRmWyVpXToga3JlZl9wdXQoKSBkb25lLlxuIiwgYkludGVyZmFjZU51bWJlcik7CitpZiAoMCA8PSBrZCAmJiBET05HTEVfTUFOWSA+IGtkKSB7CisJbXV0ZXhfdW5sb2NrKCYoZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKSk7CisJSk9UKDQsICJ1bmxvY2tlZCBlYXN5Y2FwX2RvbmdsZVslaV0ubXV0ZXhfYXVkaW9cbiIsIGtkKTsKKwltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CisJSk9UKDQsICJ1bmxvY2tlZCBlYXN5Y2FwX2RvbmdsZVslaV0ubXV0ZXhfdmlkZW9cbiIsIGtkKTsKK30KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotSk9UKDQsICJlbmRzXG4iKTsKK0pPTSg0LCAiZW5kc1xuIik7CiByZXR1cm47CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00MzA4LDcgKzUwMDgsOCBAQAogaW50IHJlc3VsdDsKIAogU0FZKCI9PT09PT09PWVhc3ljYXA9PT09PT09XG4iKTsKLUpPVCg0LCAiYmVnaW5zLiAgJWk9ZGVidWdcbiIsIGVhc3ljYXBfZGVidWcpOworSk9UKDQsICJiZWdpbnMuICAlaT1kZWJ1ZyAlaT1iYXJzICVpPWdhaW5cbiIsIGVhc3ljYXBfZGVidWcsIGVhc3ljYXBfYmFycywgXAorCQkJCQkJZWFzeWNhcF9nYWluKTsKIFNBWSgidmVyc2lvbjogIiBFQVNZQ0FQX0RSSVZFUl9WRVJTSU9OICJcbiIpOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKQEAgLTQzNDksNiArNTA1MCw5IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oRUFTWUNBUF9EUklWRVJfREVTQ1JJUFRJT04pOwogTU9EVUxFX1ZFUlNJT04oRUFTWUNBUF9EUklWRVJfVkVSU0lPTik7CiAjaWYgZGVmaW5lZChFQVNZQ0FQX0RFQlVHKQotTU9EVUxFX1BBUk1fREVTQyhlYXN5Y2FwX2RlYnVnLCAiZGVidWc6IDAgKGRlZmF1bHQpLCAxLCAyLC4uLiIpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGxldmVsOiAwKGRlZmF1bHQpLDEsMiwuLi4sOSIpOwogI2VuZGlmIC8qRUFTWUNBUF9ERUJVRyovCitNT0RVTEVfUEFSTV9ERVNDKGJhcnMsIFwKKwkiVGVzdGNhcmQgYmFycyBvbiBpbnB1dCBzaWduYWwgZmFpbHVyZTogMD0+bm8sIDE9PnllcyhkZWZhdWx0KSIpOworTU9EVUxFX1BBUk1fREVTQyhnYWluLCAiQXVkaW8gZ2FpbjogMCwuLi4sMTYoZGVmYXVsdCksLi4uMzEiKTsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfc2V0dGluZ3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfc2V0dGluZ3MuYwppbmRleCAzOGQ5NDA1Li5kZjNmMTdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX3NldHRpbmdzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF9zZXR0aW5ncy5jCkBAIC0zMywxMSArMzMsMTUgQEAKICAqICBUSEUgTEVBU1QgU0lHTklGSUNBTlQgQklUIE9GIGVhc3ljYXBfc3RhbmRhcmQubWFzayBIQVMgTUVBTklORzoKICAqICAgICAgICAgICAgICAgICAgICAgICAgIDAgPT4gMjUgZnBzCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAxID0+IDMwIGZwcworICoKKyAqICBUSEUgTU9TVCAgU0lHTklGSUNBTlQgQklUIE9GIGVhc3ljYXBfc3RhbmRhcmQubWFzayBIQVMgTUVBTklORzoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIDAgPT4gZnVsbCBmcmFtZXJhdGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIDEgPT4gMjAlICBmcmFtZXJhdGUKICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogY29uc3Qgc3RydWN0IGVhc3ljYXBfc3RhbmRhcmQgZWFzeWNhcF9zdGFuZGFyZFtdID0gewogewotLm1hc2sgPSAweDAwMEYgJiBQQUxfQkdISU4gLAorLm1hc2sgPSAweDAwRkYgJiBQQUxfQkdISU4gLAogLnY0bDJfc3RhbmRhcmQgPSB7CiAJLmluZGV4ID0gUEFMX0JHSElOLAogCS5pZCA9IChWNEwyX1NURF9QQUxfQiB8IFY0TDJfU1REX1BBTF9HIHwgVjRMMl9TVERfUEFMX0ggfCBcCkBAIC01MCw3ICs1NCw3IEBACiB9LAogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogewotLm1hc2sgPSAweDAwMEYgJiBOVFNDX05fNDQzICwKKy5tYXNrID0gMHgwMEZGICYgTlRTQ19OXzQ0MyAsCiAudjRsMl9zdGFuZGFyZCA9IHsKIAkuaW5kZXggPSBOVFNDX05fNDQzLAogCS5pZCA9IFY0TDJfU1REX1VOS05PV04sCkBAIC02Miw3ICs2Niw3IEBACiB9LAogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogewotLm1hc2sgPSAweDAwMEYgJiBQQUxfTmMgLAorLm1hc2sgPSAweDAwRkYgJiBQQUxfTmMgLAogLnY0bDJfc3RhbmRhcmQgPSB7CiAJLmluZGV4ID0gUEFMX05jLAogCS5pZCA9IFY0TDJfU1REX1BBTF9OYywKQEAgLTc0LDcgKzc4LDcgQEAKIH0sCiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiB7Ci0ubWFzayA9IDB4MDAwRiAmIE5UU0NfTiAsCisubWFzayA9IDB4MDBGRiAmIE5UU0NfTiAsCiAudjRsMl9zdGFuZGFyZCA9IHsKIAkuaW5kZXggPSBOVFNDX04sCiAJLmlkID0gVjRMMl9TVERfVU5LTk9XTiwKQEAgLTg2LDcgKzkwLDcgQEAKIH0sCiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiB7Ci0ubWFzayA9IDB4MDAwRiAmIFNFQ0FNICwKKy5tYXNrID0gMHgwMEZGICYgU0VDQU0gLAogLnY0bDJfc3RhbmRhcmQgPSB7CiAJLmluZGV4ID0gU0VDQU0sCiAJLmlkID0gVjRMMl9TVERfU0VDQU0sCkBAIC05OCw3ICsxMDIsNyBAQAogfSwKIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIHsKLS5tYXNrID0gMHgwMDBGICYgTlRTQ19NICwKKy5tYXNrID0gMHgwMEZGICYgTlRTQ19NICwKIC52NGwyX3N0YW5kYXJkID0gewogCS5pbmRleCA9IE5UU0NfTSwKIAkuaWQgPSBWNEwyX1NURF9OVFNDX00sCkBAIC0xMTAsNyArMTE0LDcgQEAKIH0sCiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiB7Ci0ubWFzayA9IDB4MDAwRiAmIE5UU0NfTV9KUCAsCisubWFzayA9IDB4MDBGRiAmIE5UU0NfTV9KUCAsCiAudjRsMl9zdGFuZGFyZCA9IHsKIAkuaW5kZXggPSBOVFNDX01fSlAsCiAJLmlkID0gVjRMMl9TVERfTlRTQ19NX0pQLApAQCAtMTIyLDcgKzEyNiw3IEBACiB9LAogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogewotLm1hc2sgPSAweDAwMEYgJiBQQUxfNjAgLAorLm1hc2sgPSAweDAwRkYgJiBQQUxfNjAgLAogLnY0bDJfc3RhbmRhcmQgPSB7CiAJLmluZGV4ID0gUEFMXzYwLAogCS5pZCA9IFY0TDJfU1REX1BBTF82MCwKQEAgLTEzNCw3ICsxMzgsNyBAQAogfSwKIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIHsKLS5tYXNrID0gMHgwMDBGICYgTlRTQ180NDMgLAorLm1hc2sgPSAweDAwRkYgJiBOVFNDXzQ0MyAsCiAudjRsMl9zdGFuZGFyZCA9IHsKIAkuaW5kZXggPSBOVFNDXzQ0MywKIAkuaWQgPSBWNEwyX1NURF9OVFNDXzQ0MywKQEAgLTE0Niw3ICsxNTAsNyBAQAogfSwKIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIHsKLS5tYXNrID0gMHgwMDBGICYgUEFMX00gLAorLm1hc2sgPSAweDAwRkYgJiBQQUxfTSAsCiAudjRsMl9zdGFuZGFyZCA9IHsKIAkuaW5kZXggPSBQQUxfTSwKIAkuaWQgPSBWNEwyX1NURF9QQUxfTSwKQEAgLTE1OCw2ICsxNjIsMTI4IEBACiB9LAogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogeworLm1hc2sgPSAweDgwMDAgfCAoMHgwMEZGICYgUEFMX0JHSElOX1NMT1cpLAorLnY0bDJfc3RhbmRhcmQgPSB7CisJLmluZGV4ID0gUEFMX0JHSElOX1NMT1csCisJLmlkID0gKFY0TDJfU1REX1BBTF9CIHwgVjRMMl9TVERfUEFMX0cgfCBWNEwyX1NURF9QQUxfSCB8IFwKKwkJCQlWNEwyX1NURF9QQUxfSSB8IFY0TDJfU1REX1BBTF9OIHwgXAorCQkJCQkoKCh2NGwyX3N0ZF9pZCkweDAxKSA8PCAzMikpLAorCS5uYW1lID0gIlBBTF9CR0hJTl9TTE9XIiwKKwkuZnJhbWVwZXJpb2QgPSB7MSwgNX0sCisJLmZyYW1lbGluZXMgPSA2MjUsCisJLnJlc2VydmVkID0gezAsIDAsIDAsIDB9Cit9Cit9LAorLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworeworLm1hc2sgPSAweDgwMDAgfCAoMHgwMEZGICYgTlRTQ19OXzQ0M19TTE9XKSwKKy52NGwyX3N0YW5kYXJkID0geworCS5pbmRleCA9IE5UU0NfTl80NDNfU0xPVywKKwkuaWQgPSAoVjRMMl9TVERfVU5LTk9XTiB8ICgoKHY0bDJfc3RkX2lkKTB4MTEpIDw8IDMyKSksCisJLm5hbWUgPSAiTlRTQ19OXzQ0M19TTE9XIiwKKwkuZnJhbWVwZXJpb2QgPSB7MSwgNX0sCisJLmZyYW1lbGluZXMgPSA0ODAsCisJLnJlc2VydmVkID0gezAsIDAsIDAsIDB9Cit9Cit9LAorLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworeworLm1hc2sgPSAweDgwMDAgfCAoMHgwMEZGICYgUEFMX05jX1NMT1cpLAorLnY0bDJfc3RhbmRhcmQgPSB7CisJLmluZGV4ID0gUEFMX05jX1NMT1csCisJLmlkID0gKFY0TDJfU1REX1BBTF9OYyB8ICgoKHY0bDJfc3RkX2lkKTB4MDEpIDw8IDMyKSksCisJLm5hbWUgPSAiUEFMX05jX1NMT1ciLAorCS5mcmFtZXBlcmlvZCA9IHsxLCA1fSwKKwkuZnJhbWVsaW5lcyA9IDYyNSwKKwkucmVzZXJ2ZWQgPSB7MCwgMCwgMCwgMH0KK30KK30sCisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCit7CisubWFzayA9IDB4ODAwMCB8ICgweDAwRkYgJiBOVFNDX05fU0xPVyksCisudjRsMl9zdGFuZGFyZCA9IHsKKwkuaW5kZXggPSBOVFNDX05fU0xPVywKKwkuaWQgPSAoVjRMMl9TVERfVU5LTk9XTiB8ICgoKHY0bDJfc3RkX2lkKTB4MjEpIDw8IDMyKSksCisJLm5hbWUgPSAiTlRTQ19OX1NMT1ciLAorCS5mcmFtZXBlcmlvZCA9IHsxLCA1fSwKKwkuZnJhbWVsaW5lcyA9IDUyNSwKKwkucmVzZXJ2ZWQgPSB7MCwgMCwgMCwgMH0KK30KK30sCisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCit7CisubWFzayA9IDB4ODAwMCB8ICgweDAwRkYgJiBTRUNBTV9TTE9XKSwKKy52NGwyX3N0YW5kYXJkID0geworCS5pbmRleCA9IFNFQ0FNX1NMT1csCisJLmlkID0gKFY0TDJfU1REX1NFQ0FNIHwgKCgodjRsMl9zdGRfaWQpMHgwMSkgPDwgMzIpKSwKKwkubmFtZSA9ICJTRUNBTV9TTE9XIiwKKwkuZnJhbWVwZXJpb2QgPSB7MSwgNX0sCisJLmZyYW1lbGluZXMgPSA2MjUsCisJLnJlc2VydmVkID0gezAsIDAsIDAsIDB9Cit9Cit9LAorLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworeworLm1hc2sgPSAweDgwMDAgfCAoMHgwMEZGICYgTlRTQ19NX1NMT1cpLAorLnY0bDJfc3RhbmRhcmQgPSB7CisJLmluZGV4ID0gTlRTQ19NX1NMT1csCisJLmlkID0gKFY0TDJfU1REX05UU0NfTSB8ICgoKHY0bDJfc3RkX2lkKTB4MDEpIDw8IDMyKSksCisJLm5hbWUgPSAiTlRTQ19NX1NMT1ciLAorCS5mcmFtZXBlcmlvZCA9IHsxLCA2fSwKKwkuZnJhbWVsaW5lcyA9IDUyNSwKKwkucmVzZXJ2ZWQgPSB7MCwgMCwgMCwgMH0KK30KK30sCisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCit7CisubWFzayA9IDB4ODAwMCB8ICgweDAwRkYgJiBOVFNDX01fSlBfU0xPVyksCisudjRsMl9zdGFuZGFyZCA9IHsKKwkuaW5kZXggPSBOVFNDX01fSlBfU0xPVywKKwkuaWQgPSAoVjRMMl9TVERfTlRTQ19NX0pQIHwgKCgodjRsMl9zdGRfaWQpMHgwMSkgPDwgMzIpKSwKKwkubmFtZSA9ICJOVFNDX01fSlBfU0xPVyIsCisJLmZyYW1lcGVyaW9kID0gezEsIDZ9LAorCS5mcmFtZWxpbmVzID0gNTI1LAorCS5yZXNlcnZlZCA9IHswLCAwLCAwLCAwfQorfQorfSwKKy8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KK3sKKy5tYXNrID0gMHg4MDAwIHwgKDB4MDBGRiAmIFBBTF82MF9TTE9XKSwKKy52NGwyX3N0YW5kYXJkID0geworCS5pbmRleCA9IFBBTF82MF9TTE9XLAorCS5pZCA9IChWNEwyX1NURF9QQUxfNjAgfCAoKCh2NGwyX3N0ZF9pZCkweDAxKSA8PCAzMikpLAorCS5uYW1lID0gIlBBTF82MF9TTE9XIiwKKwkuZnJhbWVwZXJpb2QgPSB7MSwgNn0sCisJLmZyYW1lbGluZXMgPSA1MjUsCisJLnJlc2VydmVkID0gezAsIDAsIDAsIDB9Cit9Cit9LAorLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworeworLm1hc2sgPSAweDgwMDAgfCAoMHgwMEZGICYgTlRTQ180NDNfU0xPVyksCisudjRsMl9zdGFuZGFyZCA9IHsKKwkuaW5kZXggPSBOVFNDXzQ0M19TTE9XLAorCS5pZCA9IChWNEwyX1NURF9OVFNDXzQ0MyB8ICgoKHY0bDJfc3RkX2lkKTB4MDEpIDw8IDMyKSksCisJLm5hbWUgPSAiTlRTQ180NDNfU0xPVyIsCisJLmZyYW1lcGVyaW9kID0gezEsIDZ9LAorCS5mcmFtZWxpbmVzID0gNTI1LAorCS5yZXNlcnZlZCA9IHswLCAwLCAwLCAwfQorfQorfSwKKy8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KK3sKKy5tYXNrID0gMHg4MDAwIHwgKDB4MDBGRiAmIFBBTF9NX1NMT1cpLAorLnY0bDJfc3RhbmRhcmQgPSB7CisJLmluZGV4ID0gUEFMX01fU0xPVywKKwkuaWQgPSAoVjRMMl9TVERfUEFMX00gfCAoKCh2NGwyX3N0ZF9pZCkweDAxKSA8PCAzMikpLAorCS5uYW1lID0gIlBBTF9NX1NMT1ciLAorCS5mcmFtZXBlcmlvZCA9IHsxLCA2fSwKKwkuZnJhbWVsaW5lcyA9IDUyNSwKKwkucmVzZXJ2ZWQgPSB7MCwgMCwgMCwgMH0KK30KK30sCisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCit7CiAubWFzayA9IDB4RkZGRgogfQogfTsKQEAgLTE2NSwxNSArMjkxLDE2IEBACiAvKgogICogIFRIRSAxNi1CSVQgZWFzeWNhcF9mb3JtYXQubWFzayBIQVMgTUVBTklORzoKICAqICAgIChsZWFzdCBzaWduaWZpY2FudCkgQklUICAwOiAgICAgMCA9PiBQQUwsIDI1IEZQUzsgICAxID0+IE5UU0MsIDMwIEZQUwotICogICAgICAgICAgICAgICAgICAgICAgICBCSVRTIDEtMzogICBSRVNFUlZFRCBGT1IgRElGRkVSRU5USUFUSU5HIFNUQU5EQVJEUwotICogICAgICAgICAgICAgICAgICAgICAgICBCSVRTIDQtNzogICBOVU1CRVIgT0YgQllURVMgUEVSIFBJWEVMCisgKiAgICAgICAgICAgICAgICAgICAgICAgIEJJVFMgMi00OiAgIFJFU0VSVkVEIEZPUiBESUZGRVJFTlRJQVRJTkcgU1RBTkRBUkRTCisgKiAgICAgICAgICAgICAgICAgICAgICAgIEJJVFMgNS03OiAgIE5VTUJFUiBPRiBCWVRFUyBQRVIgUElYRUwKICAqICAgICAgICAgICAgICAgICAgICAgICAgQklUICA4OiAgICAgMCA9PiBOQVRJVkUgQllURSBPUkRFUjsgIDEgPT4gU1dBUFBFRAogICogICAgICAgICAgICAgICAgICAgICAgICBCSVRTIDktMTA6ICBSRVNFUlZFRCBGT1IgT1RIRVIgQllURSBQRVJNVVRBVElPTlMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgQklUIDExOiAgICAgMCA9PiBVTkRFQ0lNQVRFRDsgIDEgPT4gREVDSU1BVEVECi0gKiAgICAgICAgICAgICAgICAgICAgICAgIEJJVCAxMjogICAgIDAgPT4gT0ZGRVIgRlJBTUVTOyAxID0+IE9GRkVSIEZJRUxEUwotICogICAgIChtb3N0IHNpZ25pZmljYW50KSBCSVRTIDEzLTE1OiBSRVNFUlZFRCBGT1IgT1RIRVIgRklFTEQgT1JERVIgT1BUSU9OUworICogICAgICAgICAgICAgICAgICAgICAgICBCSVQgMTE6ICAgICAwID0+IFVOREVDSU1BVEVEOyAgICAxID0+IERFQ0lNQVRFRAorICogICAgICAgICAgICAgICAgICAgICAgICBCSVQgMTI6ICAgICAwID0+IE9GRkVSIEZSQU1FUzsgICAxID0+IE9GRkVSIEZJRUxEUworICogICAgICAgICAgICAgICAgICAgICAgICBCSVQgMTM6ICAgICAwID0+IEZVTEwgRlJBTUVSQVRFOyAxID0+IFJFRFVDRUQKKyAqICAgICAobW9zdCBzaWduaWZpY2FudCkgQklUUyAxNC0xNTogUkVTRVJWRUQgRk9SIE9USEVSIEZJRUxEL0ZSQU1FIE9QVElPTlMKICAqICBJVCBGT0xMT1dTIFRIQVQ6Ci0gKiAgICAgYnl0ZXNwZXJwaXhlbCBJUyAgICAgICAgICgoMHgwMEYwICYgZWFzeWNhcF9mb3JtYXQubWFzaykgPj4gNCkKKyAqICAgICBieXRlc3BlcnBpeGVsIElTICAgICAgICAgKCgweDAwRTAgJiBlYXN5Y2FwX2Zvcm1hdC5tYXNrKSA+PiA1KQogICogICAgIGJ5dGVzd2Fwb3JkZXIgSVMgdHJ1ZSBJRiAoMCAhPSAoMHgwMTAwICYgZWFzeWNhcF9mb3JtYXQubWFzaykpCiAgKgogICogICAgIGRlY2ltYXRlcGl4ZWwgSVMgdHJ1ZSBJRiAoMCAhPSAoMHgwODAwICYgZWFzeWNhcF9mb3JtYXQubWFzaykpCkBAIC0xOTcsNjUgKzMyNCwxMzUgQEAKIAltYXNrMSA9IDB4MDAwMDsKIAlzd2l0Y2ggKGkpIHsKIAljYXNlIFBBTF9CR0hJTjogewotCQltYXNrMSA9IFBBTF9CR0hJTjsKKwkJbWFzazEgPSAweDFGICYgUEFMX0JHSElOOwogCQlzdHJjcHkoJm5hbWUxWzBdLCAiUEFMX0JHSElOIik7CiAJCWNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfNDcwX1NZU1RFTV9CRzsKIAkJYnJlYWs7CiAJfQogCWNhc2UgU0VDQU06IHsKLQkJbWFzazEgPSBTRUNBTTsKKwkJbWFzazEgPSAweDFGICYgU0VDQU07CiAJCXN0cmNweSgmbmFtZTFbMF0sICJTRUNBTSIpOwogCQljb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFXzQ3MF9TWVNURU1fQkc7CiAJCWJyZWFrOwogCX0KIAljYXNlIFBBTF9OYzogewotCQltYXNrMSA9IFBBTF9OYzsKKwkJbWFzazEgPSAweDFGICYgUEFMX05jOwogCQlzdHJjcHkoJm5hbWUxWzBdLCAiUEFMX05jIik7CiAJCWNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfNDcwX1NZU1RFTV9CRzsKIAkJYnJlYWs7CiAJfQogCWNhc2UgUEFMXzYwOiB7Ci0JCW1hc2sxID0gUEFMXzYwOworCQltYXNrMSA9IDB4MUYgJiBQQUxfNjA7CiAJCXN0cmNweSgmbmFtZTFbMF0sICJQQUxfNjAiKTsKIAkJY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV80NzBfU1lTVEVNX0JHOwogCQlicmVhazsKIAl9CiAJY2FzZSBQQUxfTTogewotCQltYXNrMSA9IFBBTF9NOworCQltYXNrMSA9IDB4MUYgJiBQQUxfTTsKIAkJc3RyY3B5KCZuYW1lMVswXSwgIlBBTF9NIik7CiAJCWNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfNDcwX1NZU1RFTV9CRzsKIAkJYnJlYWs7CiAJfQogCWNhc2UgTlRTQ19NOiB7Ci0JCW1hc2sxID0gTlRTQ19NOworCQltYXNrMSA9IDB4MUYgJiBOVFNDX007CiAJCXN0cmNweSgmbmFtZTFbMF0sICJOVFNDX00iKTsKIAkJY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV80NzBfU1lTVEVNX007CiAJCWJyZWFrOwogCX0KIAljYXNlIE5UU0NfNDQzOiB7Ci0JCW1hc2sxID0gTlRTQ180NDM7CisJCW1hc2sxID0gMHgxRiAmIE5UU0NfNDQzOwogCQlzdHJjcHkoJm5hbWUxWzBdLCAiTlRTQ180NDMiKTsKIAkJY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV80NzBfU1lTVEVNX007CiAJCWJyZWFrOwogCX0KIAljYXNlIE5UU0NfTV9KUDogewotCQltYXNrMSA9IE5UU0NfTV9KUDsKKwkJbWFzazEgPSAweDFGICYgTlRTQ19NX0pQOwogCQlzdHJjcHkoJm5hbWUxWzBdLCAiTlRTQ19NX0pQIik7CiAJCWNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfNDcwX1NZU1RFTV9NOwogCQlicmVhazsKIAl9CiAJY2FzZSBOVFNDX046IHsKLQkJbWFzazEgPSBOVFNDX007CisJCW1hc2sxID0gMHgxRiAmIE5UU0NfTTsKIAkJc3RyY3B5KCZuYW1lMVswXSwgIk5UU0NfTiIpOwogCQljb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFXzQ3MF9TWVNURU1fTTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgTlRTQ19OXzQ0MzogewotCQltYXNrMSA9IE5UU0NfTl80NDM7CisJCW1hc2sxID0gMHgxRiAmIE5UU0NfTl80NDM7CiAJCXN0cmNweSgmbmFtZTFbMF0sICJOVFNDX05fNDQzIik7CiAJCWNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfNDcwX1NZU1RFTV9NOwogCQlicmVhazsKIAl9CisJY2FzZSBQQUxfQkdISU5fU0xPVzogeworCQltYXNrMSA9IDB4MDAxRiAmIFBBTF9CR0hJTl9TTE9XOworCQltYXNrMSB8PSAweDAyMDA7CisJCXN0cmNweSgmbmFtZTFbMF0sICJQQUxfQkdISU5fU0xPVyIpOworCQljb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFXzQ3MF9TWVNURU1fQkc7CisJCWJyZWFrOworCX0KKwljYXNlIFNFQ0FNX1NMT1c6IHsKKwkJbWFzazEgPSAweDAwMUYgJiBTRUNBTV9TTE9XOworCQltYXNrMSB8PSAweDAyMDA7CisJCXN0cmNweSgmbmFtZTFbMF0sICJTRUNBTV9TTE9XIik7CisJCWNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfNDcwX1NZU1RFTV9CRzsKKwkJYnJlYWs7CisJfQorCWNhc2UgUEFMX05jX1NMT1c6IHsKKwkJbWFzazEgPSAweDAwMUYgJiBQQUxfTmNfU0xPVzsKKwkJbWFzazEgfD0gMHgwMjAwOworCQlzdHJjcHkoJm5hbWUxWzBdLCAiUEFMX05jX1NMT1ciKTsKKwkJY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV80NzBfU1lTVEVNX0JHOworCQlicmVhazsKKwl9CisJY2FzZSBQQUxfNjBfU0xPVzogeworCQltYXNrMSA9IDB4MDAxRiAmIFBBTF82MF9TTE9XOworCQltYXNrMSB8PSAweDAyMDA7CisJCXN0cmNweSgmbmFtZTFbMF0sICJQQUxfNjBfU0xPVyIpOworCQljb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFXzQ3MF9TWVNURU1fQkc7CisJCWJyZWFrOworCX0KKwljYXNlIFBBTF9NX1NMT1c6IHsKKwkJbWFzazEgPSAweDAwMUYgJiBQQUxfTV9TTE9XOworCQltYXNrMSB8PSAweDAyMDA7CisJCXN0cmNweSgmbmFtZTFbMF0sICJQQUxfTV9TTE9XIik7CisJCWNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfNDcwX1NZU1RFTV9CRzsKKwkJYnJlYWs7CisJfQorCWNhc2UgTlRTQ19NX1NMT1c6IHsKKwkJbWFzazEgPSAweDAwMUYgJiBOVFNDX01fU0xPVzsKKwkJbWFzazEgfD0gMHgwMjAwOworCQlzdHJjcHkoJm5hbWUxWzBdLCAiTlRTQ19NX1NMT1ciKTsKKwkJY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV80NzBfU1lTVEVNX007CisJCWJyZWFrOworCX0KKwljYXNlIE5UU0NfNDQzX1NMT1c6IHsKKwkJbWFzazEgPSAweDAwMUYgJiBOVFNDXzQ0M19TTE9XOworCQltYXNrMSB8PSAweDAyMDA7CisJCXN0cmNweSgmbmFtZTFbMF0sICJOVFNDXzQ0M19TTE9XIik7CisJCWNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfNDcwX1NZU1RFTV9NOworCQlicmVhazsKKwl9CisJY2FzZSBOVFNDX01fSlBfU0xPVzogeworCQltYXNrMSA9IDB4MDAxRiAmIE5UU0NfTV9KUF9TTE9XOworCQltYXNrMSB8PSAweDAyMDA7CisJCXN0cmNweSgmbmFtZTFbMF0sICJOVFNDX01fSlBfU0xPVyIpOworCQljb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFXzQ3MF9TWVNURU1fTTsKKwkJYnJlYWs7CisJfQorCWNhc2UgTlRTQ19OX1NMT1c6IHsKKwkJbWFzazEgPSAweDAwMUYgJiBOVFNDX05fU0xPVzsKKwkJbWFzazEgfD0gMHgwMjAwOworCQlzdHJjcHkoJm5hbWUxWzBdLCAiTlRTQ19OX1NMT1ciKTsKKwkJY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV80NzBfU1lTVEVNX007CisJCWJyZWFrOworCX0KKwljYXNlIE5UU0NfTl80NDNfU0xPVzogeworCQltYXNrMSA9IDB4MDAxRiAmIE5UU0NfTl80NDNfU0xPVzsKKwkJbWFzazEgfD0gMHgwMjAwOworCQlzdHJjcHkoJm5hbWUxWzBdLCAiTlRTQ19OXzQ0M19TTE9XIik7CisJCWNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfNDcwX1NZU1RFTV9NOworCQlicmVhazsKKwl9CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTMxMSwzOSArNTA4LDM5IEBACiAJCQljYXNlIEZNVF9VWVZZOiB7CiAJCQkJc3RyY3B5KCZuYW1lM1swXSwgIl8iIFNUUklOR0laRShGTVRfVVlWWSkpOwogCQkJCXBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1VZVlk7Ci0JCQkJbWFzazMgfD0gKDB4MDIgPDwgNCk7CisJCQkJbWFzazMgfD0gKDB4MDIgPDwgNSk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQljYXNlIEZNVF9ZVVkyOiB7CiAJCQkJc3RyY3B5KCZuYW1lM1swXSwgIl8iIFNUUklOR0laRShGTVRfWVVZMikpOwogCQkJCXBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1lVWVY7Ci0JCQkJbWFzazMgfD0gKDB4MDIgPDwgNCk7CisJCQkJbWFzazMgfD0gKDB4MDIgPDwgNSk7CiAJCQkJbWFzazMgfD0gMHgwMTAwOwogCQkJCWJyZWFrOwogCQkJfQogCQkJY2FzZSBGTVRfUkdCMjQ6IHsKIAkJCQlzdHJjcHkoJm5hbWUzWzBdLCAiXyIgU1RSSU5HSVpFKEZNVF9SR0IyNCkpOwogCQkJCXBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1JHQjI0OwotCQkJCW1hc2szIHw9ICgweDAzIDw8IDQpOworCQkJCW1hc2szIHw9ICgweDAzIDw8IDUpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJY2FzZSBGTVRfUkdCMzI6IHsKIAkJCQlzdHJjcHkoJm5hbWUzWzBdLCAiXyIgU1RSSU5HSVpFKEZNVF9SR0IzMikpOwogCQkJCXBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1JHQjMyOwotCQkJCW1hc2szIHw9ICgweDA0IDw8IDQpOworCQkJCW1hc2szIHw9ICgweDA0IDw8IDUpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJY2FzZSBGTVRfQkdSMjQ6IHsKIAkJCQlzdHJjcHkoJm5hbWUzWzBdLCAiXyIgU1RSSU5HSVpFKEZNVF9CR1IyNCkpOwogCQkJCXBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX0JHUjI0OwotCQkJCW1hc2szIHw9ICgweDAzIDw8IDQpOworCQkJCW1hc2szIHw9ICgweDAzIDw8IDUpOwogCQkJCW1hc2szIHw9IDB4MDEwMDsKIAkJCQlicmVhazsKIAkJCX0KIAkJCWNhc2UgRk1UX0JHUjMyOiB7CiAJCQkJc3RyY3B5KCZuYW1lM1swXSwgIl8iIFNUUklOR0laRShGTVRfQkdSMzIpKTsKIAkJCQlwaXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9CR1IzMjsKLQkJCQltYXNrMyB8PSAoMHgwNCA8PCA0KTsKKwkJCQltYXNrMyB8PSAoMHgwNCA8PCA1KTsKIAkJCQltYXNrMyB8PSAweDAxMDA7CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC0zNjMsMTMgKzU2MCw4IEBACiAJCQkJfQogCQkJCWNhc2UgRklFTERfSU5URVJMQUNFRDogewogCQkJCQlzdHJjcHkoJm5hbWU0WzBdLCAiLWkiKTsKLQkJCQkJZmllbGQgPSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIEZJRUxEX0FMVEVSTkFURTogewotCQkJCQlzdHJjcHkoJm5hbWU0WzBdLCAiLWEiKTsKIAkJCQkJbWFzazQgfD0gMHgxMDAwOwotCQkJCQlmaWVsZCA9IFY0TDJfRklFTERfQUxURVJOQVRFOworCQkJCQlmaWVsZCA9IFY0TDJfRklFTERfSU5URVJMQUNFRDsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJCWRlZmF1bHQ6CkBAIC00MTMsNyArNjA1LDcgQEAKIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBlYXN5Y2FwX2NvbnRyb2xbXSA9IFwKLSB7ewore3sKIC5pZCAgICAgICA9IFY0TDJfQ0lEX0JSSUdIVE5FU1MsCiAudHlwZSAgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAogLm5hbWUgICAgID0gIkJyaWdodG5lc3MiLApAQCAtNDg1LDUgKzY3Nyw1IEBACiB7CiAuaWQgPSAweEZGRkZGRkZGCiB9Ci0gfTsKK307CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX3NvdW5kLmMgYi9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX3NvdW5kLmMKaW5kZXggNjM1NjJiZC4uMjRkOGJiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF9zb3VuZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfc291bmQuYwpAQCAtMzYsMTcgKzM2LDE1IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgogICogIE9OIENPTVBMRVRJT04gT0YgQU4gQVVESU8gVVJCIElUUyBEQVRBIElTIENPUElFRCBUTyBUSEUgQVVESU8gQlVGRkVSUwotICogIFBST1ZJREVEIHBlYXN5Y2FwLT5hdWRpb19pZGxlIElTIFpFUjAuICBSRUdBUkRMRVNTIE9GIFRISVMgQkVJTkcgVFJVRSwKKyAqICBQUk9WSURFRCBwZWFzeWNhcC0+YXVkaW9faWRsZSBJUyBaRVJPLiAgUkVHQVJETEVTUyBPRiBUSElTIEJFSU5HIFRSVUUsCiAgKiAgSVQgSVMgUkVTVUJNSVRURUQgUFJPVklERUQgcGVhc3ljYXAtPmF1ZGlvX2lzb2Nfc3RyZWFtaW5nIElTIE5PVCBaRVJPLgogICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiB2b2lkCiBlYXN5c25kX2NvbXBsZXRlKHN0cnVjdCB1cmIgKnB1cmIpCiB7Ci1zdGF0aWMgaW50IG10Owogc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwOwogc3RydWN0IGRhdGFfYnVmZmVyICpwYXVkaW9fYnVmZmVyOwotY2hhciBlcnJidWZbMTZdOwogX191OCAqcDEsICpwMjsKIF9fczE2IHMxNjsKIGludCBpLCBqLCBtb3JlLCBtdWNoLCBsZWFwLCByYzsKQEAgLTY2LDQ4ICs2NCw2MiBAQAogCVNBWSgiRVJST1I6IHBlYXN5Y2FwIGlzIE5VTExcbiIpOwogCXJldHVybjsKIH0KK2lmIChtZW1jbXAoJnBlYXN5Y2FwLT50ZWxsdGFsZVswXSwgVEVMTFRBTEUsIHN0cmxlbihURUxMVEFMRSkpKSB7CisJU0FZKCJFUlJPUjogYmFkIHBlYXN5Y2FwXG4iKTsKKwlyZXR1cm47Cit9CisKIG11Y2ggPSAwOwogCi0KIGlmIChwZWFzeWNhcC0+YXVkaW9faWRsZSkgewotCUpPVCgxNiwgIiVpPWF1ZGlvX2lkbGUgICVpPWF1ZGlvX2lzb2Nfc3RyZWFtaW5nXG4iLCBcCisJSk9NKDE2LCAiJWk9YXVkaW9faWRsZSAgJWk9YXVkaW9faXNvY19zdHJlYW1pbmdcbiIsIFwKIAkJCXBlYXN5Y2FwLT5hdWRpb19pZGxlLCBwZWFzeWNhcC0+YXVkaW9faXNvY19zdHJlYW1pbmcpOwogCWlmIChwZWFzeWNhcC0+YXVkaW9faXNvY19zdHJlYW1pbmcpIHsKIAkJcmMgPSB1c2Jfc3VibWl0X3VyYihwdXJiLCBHRlBfQVRPTUlDKTsKIAkJaWYgKDAgIT0gcmMpIHsKLQkJCVNBWSgiRVJST1I6IHdoaWxlICVpPWF1ZGlvX2lkbGUsICIgXAorCQkJaWYgKC1FTk9ERVYgIT0gcmMpCisJCQkJU0FNKCJFUlJPUjogd2hpbGUgJWk9YXVkaW9faWRsZSwgIiBcCiAJCQkJCSJ1c2Jfc3VibWl0X3VyYigpIGZhaWxlZCB3aXRoIHJjOlxuIiwgXAogCQkJCQkJCXBlYXN5Y2FwLT5hdWRpb19pZGxlKTsKIAkJCXN3aXRjaCAocmMpIHsKIAkJCWNhc2UgLUVOT01FTTogewotCQkJCVNBWSgiRU5PTUVNXG4iKTsgICAgYnJlYWs7CisJCQkJU0FNKCItRU5PTUVNXG4iKTsKKwkJCQlicmVhazsKIAkJCX0KIAkJCWNhc2UgLUVOT0RFVjogewotCQkJCVNBWSgiRU5PREVWXG4iKTsgICAgYnJlYWs7CisJCQkJYnJlYWs7CiAJCQl9CiAJCQljYXNlIC1FTlhJTzogewotCQkJCVNBWSgiRU5YSU9cbiIpOyAgICAgYnJlYWs7CisJCQkJU0FNKCItRU5YSU9cbiIpOworCQkJCWJyZWFrOwogCQkJfQogCQkJY2FzZSAtRUlOVkFMOiB7Ci0JCQkJU0FZKCJFSU5WQUxcbiIpOyAgICBicmVhazsKKwkJCQlTQU0oIi1FSU5WQUxcbiIpOworCQkJCWJyZWFrOwogCQkJfQogCQkJY2FzZSAtRUFHQUlOOiB7Ci0JCQkJU0FZKCJFQUdBSU5cbiIpOyAgICBicmVhazsKKwkJCQlTQU0oIi1FQUdBSU5cbiIpOworCQkJCWJyZWFrOwogCQkJfQogCQkJY2FzZSAtRUZCSUc6IHsKLQkJCQlTQVkoIkVGQklHXG4iKTsgICAgIGJyZWFrOworCQkJCVNBTSgiLUVGQklHXG4iKTsKKwkJCQlicmVhazsKIAkJCX0KIAkJCWNhc2UgLUVQSVBFOiB7Ci0JCQkJU0FZKCJFUElQRVxuIik7ICAgICBicmVhazsKKwkJCQlTQU0oIi1FUElQRVxuIik7CisJCQkJYnJlYWs7CiAJCQl9CiAJCQljYXNlIC1FTVNHU0laRTogewotCQkJCVNBWSgiRU1TR1NJWkVcbiIpOyAgYnJlYWs7CisJCQkJU0FNKCItRU1TR1NJWkVcbiIpOworCQkJCWJyZWFrOwogCQkJfQogCQkJY2FzZSAtRU5PU1BDOiB7Ci0JCQkJU0FZKCJFTk9TUENcbiIpOyAgYnJlYWs7CisJCQkJU0FNKCItRU5PU1BDXG4iKTsKKwkJCQlicmVhazsKIAkJCX0KIAkJCWRlZmF1bHQ6IHsKLQkJCQlTQVkoIjB4JTA4WFxuIiwgcmMpOyBicmVhazsKKwkJCQlTQU0oInVua25vd24gZXJyb3I6IDB4JTA4WFxuIiwgcmMpOworCQkJCWJyZWFrOwogCQkJfQogCQkJfQogCQl9CkBAIC0xMTYsNzQgKzEyOCw5NSBAQAogfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogaWYgKHB1cmItPnN0YXR1cykgewotCWlmICgtRVNIVVRET1dOID09IHB1cmItPnN0YXR1cykgewotCQlKT1QoMTYsICJpbW1lZGlhdGUgcmV0dXJuIGJlY2F1c2UgLUVTSFVURE9XTj1wdXJiLT5zdGF0dXNcbiIpOworCWlmICgoLUVTSFVURE9XTiA9PSBwdXJiLT5zdGF0dXMpIHx8ICgtRU5PRU5UID09IHB1cmItPnN0YXR1cykpIHsKKwkJSk9NKDE2LCAidXJiIHN0YXR1cyAtRVNIVVRET1dOIG9yIC1FTk9FTlRcbiIpOwogCQlyZXR1cm47CiAJfQotCVNBWSgiRVJST1I6IG5vbi16ZXJvIHVyYiBzdGF0dXM6XG4iKTsKKwlTQU0oIkVSUk9SOiBub24temVybyB1cmIgc3RhdHVzOlxuIik7CiAJc3dpdGNoIChwdXJiLT5zdGF0dXMpIHsKIAljYXNlIC1FSU5QUk9HUkVTUzogewotCQlTQVkoIi1FSU5QUk9HUkVTU1xuIik7IGJyZWFrOworCQlTQU0oIi1FSU5QUk9HUkVTU1xuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FTk9TUjogewotCQlTQVkoIi1FTk9TUlxuIik7IGJyZWFrOworCQlTQU0oIi1FTk9TUlxuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FUElQRTogewotCQlTQVkoIi1FUElQRVxuIik7IGJyZWFrOworCQlTQU0oIi1FUElQRVxuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FT1ZFUkZMT1c6IHsKLQkJU0FZKCItRU9WRVJGTE9XXG4iKTsgYnJlYWs7CisJCVNBTSgiLUVPVkVSRkxPV1xuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FUFJPVE86IHsKLQkJU0FZKCItRVBST1RPXG4iKTsgYnJlYWs7CisJCVNBTSgiLUVQUk9UT1xuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FSUxTRVE6IHsKLQkJU0FZKCItRUlMU0VRXG4iKTsgYnJlYWs7CisJCVNBTSgiLUVJTFNFUVxuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FVElNRURPVVQ6IHsKLQkJU0FZKCItRVRJTUVET1VUXG4iKTsgYnJlYWs7CisJCVNBTSgiLUVUSU1FRE9VVFxuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FTVNHU0laRTogewotCQlTQVkoIi1FTVNHU0laRVxuIik7IGJyZWFrOworCQlTQU0oIi1FTVNHU0laRVxuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FT1BOT1RTVVBQOiB7Ci0JCVNBWSgiLUVPUE5PVFNVUFBcbiIpOyBicmVhazsKKwkJU0FNKCItRU9QTk9UU1VQUFxuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FUEZOT1NVUFBPUlQ6IHsKLQkJU0FZKCItRVBGTk9TVVBQT1JUXG4iKTsgYnJlYWs7CisJCVNBTSgiLUVQRk5PU1VQUE9SVFxuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FQUZOT1NVUFBPUlQ6IHsKLQkJU0FZKCItRUFGTk9TVVBQT1JUXG4iKTsgYnJlYWs7CisJCVNBTSgiLUVBRk5PU1VQUE9SVFxuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FQUREUklOVVNFOiB7Ci0JCVNBWSgiLUVBRERSSU5VU0VcbiIpOyBicmVhazsKKwkJU0FNKCItRUFERFJJTlVTRVxuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FQUREUk5PVEFWQUlMOiB7Ci0JCVNBWSgiLUVBRERSTk9UQVZBSUxcbiIpOyBicmVhazsKKwkJU0FNKCItRUFERFJOT1RBVkFJTFxuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FTk9CVUZTOiB7Ci0JCVNBWSgiLUVOT0JVRlNcbiIpOyBicmVhazsKKwkJU0FNKCItRU5PQlVGU1xuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FSVNDT05OOiB7Ci0JCVNBWSgiLUVJU0NPTk5cbiIpOyBicmVhazsKKwkJU0FNKCItRUlTQ09OTlxuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FTk9UQ09OTjogewotCQlTQVkoIi1FTk9UQ09OTlxuIik7IGJyZWFrOworCQlTQU0oIi1FTk9UQ09OTlxuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FU0hVVERPV046IHsKLQkJU0FZKCItRVNIVVRET1dOXG4iKTsgYnJlYWs7CisJCVNBTSgiLUVTSFVURE9XTlxuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FTk9FTlQ6IHsKLQkJU0FZKCItRU5PRU5UXG4iKTsgYnJlYWs7CisJCVNBTSgiLUVOT0VOVFxuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FQ09OTlJFU0VUOiB7Ci0JCVNBWSgiLUVDT05OUkVTRVRcbiIpOyBicmVhazsKKwkJU0FNKCItRUNPTk5SRVNFVFxuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FTk9TUEM6IHsKLQkJU0FZKCJFTk9TUENcbiIpOyAgYnJlYWs7CisJCVNBTSgiRU5PU1BDXG4iKTsKKwkJYnJlYWs7CiAJfQogCWRlZmF1bHQ6IHsKLQkJU0FZKCJ1bmtub3duIGVycm9yIGNvZGUgMHglMDhYXG4iLCBwdXJiLT5zdGF0dXMpOyBicmVhazsKKwkJU0FNKCJ1bmtub3duIGVycm9yIGNvZGUgMHglMDhYXG4iLCBwdXJiLT5zdGF0dXMpOworCQlicmVhazsKIAl9CiAJfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMTk2LDM1ICsyMjksNDMgQEAKIAlpZiAocGVhc3ljYXAtPmF1ZGlvX2lzb2Nfc3RyZWFtaW5nKSB7CiAJCXJjID0gdXNiX3N1Ym1pdF91cmIocHVyYiwgR0ZQX0FUT01JQyk7CiAJCWlmICgwICE9IHJjKSB7Ci0JCQlTQVkoIkVSUk9SOiB3aGlsZSAlaT1hdWRpb19pZGxlLCB1c2Jfc3VibWl0X3VyYigpICIKKwkJCVNBTSgiRVJST1I6IHdoaWxlICVpPWF1ZGlvX2lkbGUsIHVzYl9zdWJtaXRfdXJiKCkgIgogCQkJCSJmYWlsZWQgd2l0aCByYzpcbiIsIHBlYXN5Y2FwLT5hdWRpb19pZGxlKTsKIAkJCXN3aXRjaCAocmMpIHsKIAkJCWNhc2UgLUVOT01FTTogewotCQkJCVNBWSgiRU5PTUVNXG4iKTsgICAgYnJlYWs7CisJCQkJU0FNKCItRU5PTUVNXG4iKTsKKwkJCQlicmVhazsKIAkJCX0KIAkJCWNhc2UgLUVOT0RFVjogewotCQkJCVNBWSgiRU5PREVWXG4iKTsgICAgYnJlYWs7CisJCQkJU0FNKCItRU5PREVWXG4iKTsKKwkJCQlicmVhazsKIAkJCX0KIAkJCWNhc2UgLUVOWElPOiB7Ci0JCQkJU0FZKCJFTlhJT1xuIik7ICAgICBicmVhazsKKwkJCQlTQU0oIi1FTlhJT1xuIik7CisJCQkJYnJlYWs7CiAJCQl9CiAJCQljYXNlIC1FSU5WQUw6IHsKLQkJCQlTQVkoIkVJTlZBTFxuIik7ICAgIGJyZWFrOworCQkJCVNBTSgiLUVJTlZBTFxuIik7CisJCQkJYnJlYWs7CiAJCQl9CiAJCQljYXNlIC1FQUdBSU46IHsKLQkJCQlTQVkoIkVBR0FJTlxuIik7ICAgIGJyZWFrOworCQkJCVNBTSgiLUVBR0FJTlxuIik7CisJCQkJYnJlYWs7CiAJCQl9CiAJCQljYXNlIC1FRkJJRzogewotCQkJCVNBWSgiRUZCSUdcbiIpOyAgICAgYnJlYWs7CisJCQkJU0FNKCItRUZCSUdcbiIpOworCQkJCWJyZWFrOwogCQkJfQogCQkJY2FzZSAtRVBJUEU6IHsKLQkJCQlTQVkoIkVQSVBFXG4iKTsgICAgIGJyZWFrOworCQkJCVNBTSgiLUVQSVBFXG4iKTsKKwkJCQlicmVhazsKIAkJCX0KIAkJCWNhc2UgLUVNU0dTSVpFOiB7Ci0JCQkJU0FZKCJFTVNHU0laRVxuIik7ICBicmVhazsKKwkJCQlTQU0oIi1FTVNHU0laRVxuIik7CisJCQkJYnJlYWs7CiAJCQl9CiAJCQlkZWZhdWx0OiB7Ci0JCQkJU0FZKCIweCUwOFhcbiIsIHJjKTsgYnJlYWs7CisJCQkJU0FNKCIweCUwOFhcbiIsIHJjKTsgYnJlYWs7CiAJCQl9CiAJCQl9CiAJCX0KQEAgLTI0Myw3MyArMjg0LDgxIEBACiBmb3IgKGkgPSAwOyAgaSA8IHB1cmItPm51bWJlcl9vZl9wYWNrZXRzOyBpKyspIHsKIAlzd2l0Y2ggKHB1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1cykgewogCWNhc2UgIDA6IHsKLQkJc3RyY3B5KCZlcnJidWZbMF0sICJPSyIpOyBicmVhazsKKwkJYnJlYWs7CiAJfQogCWNhc2UgLUVOT0VOVDogewotCQlzdHJjcHkoJmVycmJ1ZlswXSwgIi1FTk9FTlQiKTsgYnJlYWs7CisJCVNBTSgiLUVOT0VOVFxuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FSU5QUk9HUkVTUzogewotCQlzdHJjcHkoJmVycmJ1ZlswXSwgIi1FSU5QUk9HUkVTUyIpOyBicmVhazsKKwkJU0FNKCItRUlOUFJPR1JFU1NcbiIpOworCQlicmVhazsKIAl9CiAJY2FzZSAtRVBST1RPOiB7Ci0JCXN0cmNweSgmZXJyYnVmWzBdLCAiLUVQUk9UTyIpOyBicmVhazsKKwkJU0FNKCItRVBST1RPXG4iKTsKKwkJYnJlYWs7CiAJfQogCWNhc2UgLUVJTFNFUTogewotCQlzdHJjcHkoJmVycmJ1ZlswXSwgIi1FSUxTRVEiKTsgYnJlYWs7CisJCVNBTSgiLUVJTFNFUVxuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FVElNRTogewotCQlzdHJjcHkoJmVycmJ1ZlswXSwgIi1FVElNRSIpOyBicmVhazsKKwkJU0FNKCItRVRJTUVcbiIpOworCQlicmVhazsKIAl9CiAJY2FzZSAtRVRJTUVET1VUOiB7Ci0JCXN0cmNweSgmZXJyYnVmWzBdLCAiLUVUSU1FRE9VVCIpOyBicmVhazsKKwkJU0FNKCItRVRJTUVET1VUXG4iKTsKKwkJYnJlYWs7CiAJfQogCWNhc2UgLUVQSVBFOiB7Ci0JCXN0cmNweSgmZXJyYnVmWzBdLCAiLUVQSVBFIik7IGJyZWFrOworCQlTQU0oIi1FUElQRVxuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FQ09NTTogewotCQlzdHJjcHkoJmVycmJ1ZlswXSwgIi1FQ09NTSIpOyBicmVhazsKKwkJU0FNKCItRUNPTU1cbiIpOworCQlicmVhazsKIAl9CiAJY2FzZSAtRU5PU1I6IHsKLQkJc3RyY3B5KCZlcnJidWZbMF0sICItRU5PU1IiKTsgYnJlYWs7CisJCVNBTSgiLUVOT1NSXG4iKTsKKwkJYnJlYWs7CiAJfQogCWNhc2UgLUVPVkVSRkxPVzogewotCQlzdHJjcHkoJmVycmJ1ZlswXSwgIi1FT1ZFUkZMT1ciKTsgYnJlYWs7CisJCVNBTSgiLUVPVkVSRkxPV1xuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FUkVNT1RFSU86IHsKLQkJc3RyY3B5KCZlcnJidWZbMF0sICItRVJFTU9URUlPIik7IGJyZWFrOworCQlTQU0oIi1FUkVNT1RFSU9cbiIpOworCQlicmVhazsKIAl9CiAJY2FzZSAtRU5PREVWOiB7Ci0JCXN0cmNweSgmZXJyYnVmWzBdLCAiLUVOT0RFViIpOyBicmVhazsKKwkJU0FNKCItRU5PREVWXG4iKTsKKwkJYnJlYWs7CiAJfQogCWNhc2UgLUVYREVWOiB7Ci0JCXN0cmNweSgmZXJyYnVmWzBdLCAiLUVYREVWIik7IGJyZWFrOworCQlTQU0oIi1FWERFVlxuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FSU5WQUw6IHsKLQkJc3RyY3B5KCZlcnJidWZbMF0sICItRUlOVkFMIik7IGJyZWFrOworCQlTQU0oIi1FSU5WQUxcbiIpOworCQlicmVhazsKIAl9CiAJY2FzZSAtRUNPTk5SRVNFVDogewotCQlzdHJjcHkoJmVycmJ1ZlswXSwgIi1FQ09OTlJFU0VUIik7IGJyZWFrOworCQlTQU0oIi1FQ09OTlJFU0VUXG4iKTsKKwkJYnJlYWs7CiAJfQogCWNhc2UgLUVOT1NQQzogewotCQlzdHJjcHkoJmVycmJ1ZlswXSwgIi1FTk9TUEMiKTsgYnJlYWs7CisJCVNBTSgiLUVOT1NQQ1xuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FU0hVVERPV046IHsKLQkJc3RyY3B5KCZlcnJidWZbMF0sICItRVNIVVRET1dOIik7IGJyZWFrOworCQlTQU0oIi1FU0hVVERPV05cbiIpOworCQlicmVhazsKIAl9CiAJZGVmYXVsdDogewotCQlzdHJjcHkoJmVycmJ1ZlswXSwgIlVOS05PV04iKTsgYnJlYWs7CisJCVNBTSgidW5rbm93biBlcnJvcjoweCUwOFhcbiIsIHB1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1cyk7CisJCWJyZWFrOwogCX0KIAl9Ci0JaWYgKCghcHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uc3RhdHVzKSAmJiAwKSB7Ci0JCUpPVCgxNiwgImZyYW1lWyUyaV06ICVpPXN0YXR1c3s9JTE2c30gICIgIFwKLQkJCQkJCSIlNWk9YWN0dWFsICAiICBcCi0JCQkJCQkiJTVpPWxlbmd0aCAgIiAgXAotCQkJCQkJIiUzaT1vZmZzZXRcbiIsIFwKLQkJCQlpLCBwdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5zdGF0dXMsICZlcnJidWZbMF0sCi0JCQkJcHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uYWN0dWFsX2xlbmd0aCwKLQkJCQlwdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5sZW5ndGgsCi0JCQkJcHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ub2Zmc2V0KTsKLQl9CiAJaWYgKCFwdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5zdGF0dXMpIHsKIAkJbW9yZSA9IHB1cmItPmlzb19mcmFtZV9kZXNjW2ldLmFjdHVhbF9sZW5ndGg7CiAKQEAgLTMxOSwxMSArMzY4LDEyIEBACiAjZW5kaWYKIAogCQlpZiAoIW1vcmUpCi0JCQltdCsrOworCQkJcGVhc3ljYXAtPmF1ZGlvX210Kys7CiAJCWVsc2UgewotCQkJaWYgKG10KSB7Ci0JCQkJSk9UKDE2LCAiJTRpIGVtcHR5IGF1ZGlvIHVyYiBmcmFtZXNcbiIsIG10KTsKLQkJCQltdCA9IDA7CisJCQlpZiAocGVhc3ljYXAtPmF1ZGlvX210KSB7CisJCQkJSk9NKDE2LCAiJTRpIGVtcHR5IGF1ZGlvIHVyYiBmcmFtZXNcbiIsIFwKKwkJCQkJCQlwZWFzeWNhcC0+YXVkaW9fbXQpOworCQkJCXBlYXN5Y2FwLT5hdWRpb19tdCA9IDA7CiAJCQl9CiAKIAkJCXAxID0gKF9fdTggKikocHVyYi0+dHJhbnNmZXJfYnVmZmVyICsgXApAQCAtMzQwLDEzICszOTAsMTMgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAkJCXdoaWxlIChtb3JlKSB7CiAJCQkJaWYgKDAgPiBtb3JlKSB7Ci0JCQkJCVNBWSgiZWFzeXNuZF9jb21wbGV0ZTogTUlTVEFLRTogIiBcCisJCQkJCVNBTSgiZWFzeXNuZF9jb21wbGV0ZTogTUlTVEFLRTogIiBcCiAJCQkJCQkJIm1vcmUgaXMgbmVnYXRpdmVcbiIpOwogCQkJCQlyZXR1cm47CiAJCQkJfQogCQkJCWlmIChwZWFzeWNhcC0+YXVkaW9fYnVmZmVyX3BhZ2VfbWFueSA8PSBcCiAJCQkJCQkJcGVhc3ljYXAtPmF1ZGlvX2ZpbGwpIHsKLQkJCQkJU0FZKCJFUlJPUjogYmFkICIgXAorCQkJCQlTQU0oIkVSUk9SOiBiYWQgIiBcCiAJCQkJCQkicGVhc3ljYXAtPmF1ZGlvX2ZpbGxcbiIpOwogCQkJCQlyZXR1cm47CiAJCQkJfQpAQCAtMzU1LDcgKzQwNSw3IEBACiAJCQkJCQkJW3BlYXN5Y2FwLT5hdWRpb19maWxsXTsKIAkJCQlpZiAoUEFHRV9TSVpFIDwgKHBhdWRpb19idWZmZXItPnB0byAtIFwKIAkJCQkJCXBhdWRpb19idWZmZXItPnBnbykpIHsKLQkJCQkJU0FZKCJFUlJPUjogYmFkIHBhdWRpb19idWZmZXItPnB0b1xuIik7CisJCQkJCVNBTSgiRVJST1I6IGJhZCBwYXVkaW9fYnVmZmVyLT5wdG9cbiIpOwogCQkJCQlyZXR1cm47CiAJCQkJfQogCQkJCWlmIChQQUdFX1NJWkUgPT0gKHBhdWRpb19idWZmZXItPnB0byAtIFwKQEAgLTM3NCw3ICs0MjQsNyBAQAogCQkJCQkJCXBlYXN5Y2FwLT5hdWRpb19maWxsKQogCQkJCQkJcGVhc3ljYXAtPmF1ZGlvX2ZpbGwgPSAwOwogCi0JCQkJCUpPVCgxMiwgImJ1bXBlZCBwZWFzeWNhcC0+IiBcCisJCQkJCUpPTSgxMiwgImJ1bXBlZCBwZWFzeWNhcC0+IiBcCiAJCQkJCQkJImF1ZGlvX2ZpbGwgdG8gJWlcbiIsIFwKIAkJCQkJCQlwZWFzeWNhcC0+YXVkaW9fZmlsbCk7CiAKQEAgLTM4Nyw3ICs0MzcsNyBAQAogCQkJCQlpZiAoIShwZWFzeWNhcC0+YXVkaW9fZmlsbCAlIFwKIAkJCQkJCXBlYXN5Y2FwLT5cCiAJCQkJCQlhdWRpb19wYWdlc19wZXJfZnJhZ21lbnQpKSB7Ci0JCQkJCQlKT1QoMTIsICJ3YWtldXAgY2FsbCBvbiB3cV8iIFwKKwkJCQkJCUpPTSgxMiwgIndha2V1cCBjYWxsIG9uIHdxXyIgXAogCQkJCQkJImF1ZGlvLCAlaT1mcmFnIHJlYWRpbmcgICVpIiBcCiAJCQkJCQkiPWZyYWdtZW50IGZpbGxcbiIsIFwKIAkJCQkJCShwZWFzeWNhcC0+YXVkaW9fcmVhZCAvIFwKQEAgLTQxNCw3ICs0NjQsNyBAQAogCQkJCX0gZWxzZSB7CiAjaWYgZGVmaW5lZChVUFNBTVBMRSkKIAkJCQkJaWYgKG11Y2ggJSAxNikKLQkJCQkJCUpPVCg4LCAiTUlTVEFLRT8gbXVjaCIgXAorCQkJCQkJSk9NKDgsICJNSVNUQUtFPyBtdWNoIiBcCiAJCQkJCQkiIGlzIG5vdCBkaXZpc2libGUgYnkgMTZcbiIpOwogCQkJCQlpZiAobXVjaCA+ICgxNiAqIFwKIAkJCQkJCQltb3JlKSkKQEAgLTQ2OCw3ICs1MTgsNyBAQAogCQkJfQogCQl9CiAJfSBlbHNlIHsKLQkJSk9UKDEyLCAiZGlzY2FyZGluZyBhdWRpbyBzYW1wbGVzIGJlY2F1c2UgIiBcCisJCUpPTSgxMiwgImRpc2NhcmRpbmcgYXVkaW8gc2FtcGxlcyBiZWNhdXNlICIgXAogCQkJIiVpPXB1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1c1xuIiwgXAogCQkJCXB1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1cyk7CiAJfQpAQCAtNDg2LDM4ICs1MzYsNTAgQEAKIGlmIChwZWFzeWNhcC0+YXVkaW9faXNvY19zdHJlYW1pbmcpIHsKIAlyYyA9IHVzYl9zdWJtaXRfdXJiKHB1cmIsIEdGUF9BVE9NSUMpOwogCWlmICgwICE9IHJjKSB7Ci0JCVNBWSgiRVJST1I6IHdoaWxlICVpPWF1ZGlvX2lkbGUsIHVzYl9zdWJtaXRfdXJiKCkgZmFpbGVkICIgXAorCQlpZiAoLUVOT0RFViAhPSByYykgeworCQkJU0FNKCJFUlJPUjogd2hpbGUgJWk9YXVkaW9faWRsZSwgIiBcCisJCQkJCSJ1c2Jfc3VibWl0X3VyYigpIGZhaWxlZCAiIFwKIAkJCQkJIndpdGggcmM6XG4iLCBwZWFzeWNhcC0+YXVkaW9faWRsZSk7CisJCX0KIAkJc3dpdGNoIChyYykgewogCQljYXNlIC1FTk9NRU06IHsKLQkJCVNBWSgiRU5PTUVNXG4iKTsgICAgYnJlYWs7CisJCQlTQU0oIi1FTk9NRU1cbiIpOworCQkJYnJlYWs7CiAJCX0KIAkJY2FzZSAtRU5PREVWOiB7Ci0JCQlTQVkoIkVOT0RFVlxuIik7ICAgIGJyZWFrOworCQkJYnJlYWs7CiAJCX0KIAkJY2FzZSAtRU5YSU86IHsKLQkJCVNBWSgiRU5YSU9cbiIpOyAgICAgYnJlYWs7CisJCQlTQU0oIi1FTlhJT1xuIik7CisJCQlicmVhazsKIAkJfQogCQljYXNlIC1FSU5WQUw6IHsKLQkJCVNBWSgiRUlOVkFMXG4iKTsgICAgYnJlYWs7CisJCQlTQU0oIi1FSU5WQUxcbiIpOworCQkJYnJlYWs7CiAJCX0KIAkJY2FzZSAtRUFHQUlOOiB7Ci0JCQlTQVkoIkVBR0FJTlxuIik7ICAgIGJyZWFrOworCQkJU0FNKCItRUFHQUlOXG4iKTsKKwkJCWJyZWFrOwogCQl9CiAJCWNhc2UgLUVGQklHOiB7Ci0JCQlTQVkoIkVGQklHXG4iKTsgICAgIGJyZWFrOworCQkJU0FNKCItRUZCSUdcbiIpOworCQkJYnJlYWs7CiAJCX0KIAkJY2FzZSAtRVBJUEU6IHsKLQkJCVNBWSgiRVBJUEVcbiIpOyAgICAgYnJlYWs7CisJCQlTQU0oIi1FUElQRVxuIik7CisJCQlicmVhazsKIAkJfQogCQljYXNlIC1FTVNHU0laRTogewotCQkJU0FZKCJFTVNHU0laRVxuIik7ICBicmVhazsKKwkJCVNBTSgiLUVNU0dTSVpFXG4iKTsKKwkJCWJyZWFrOwogCQl9CiAJCWNhc2UgLUVOT1NQQzogewotCQkJU0FZKCJFTk9TUENcbiIpOyAgYnJlYWs7CisJCQlTQU0oIi1FTk9TUENcbiIpOworCQkJYnJlYWs7CiAJCX0KIAkJZGVmYXVsdDogewotCQkJU0FZKCIweCUwOFhcbiIsIHJjKTsgYnJlYWs7CisJCQlTQU0oInVua25vd24gZXJyb3I6IDB4JTA4WFxuIiwgcmMpOworCQkJYnJlYWs7CiAJCX0KIAkJfQogCX0KQEAgLTUyOSw4ICs1OTEsNyBAQAogLyoKICAqICBUSEUgQVVESU8gVVJCUyBBUkUgU1VCTUlUVEVEIEFUIFRISVMgRUFSTFkgU1RBR0UgU08gVEhBVCBJVCBJUyBQT1NTSUJMRSBUTwogICogIFNUUkVBTSBGUk9NIC9kZXYvZWFzeXNuZDEgV0lUSCBTSU1QTEUgUFJPR1JBTVMgU1VDSCBBUyBjYXQgV0hJQ0ggRE8gTk9UCi0gKiAgSEFWRSBBTiBJT0NUTCBJTlRFUkZBQ0UuICBUSEUgVklERU8gVVJCUywgQlkgQ09OVFJBU1QsIE1VU1QgQkUgU1VCTUlUVEVECi0gKiAgTVVDSCBMQVRFUjogU0VFIENPTU1FTlRTIElOIEZJTEUgZWFzeWNhcF9tYWluLmMuCisgKiAgSEFWRSBBTiBJT0NUTCBJTlRFUkZBQ0UuCiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIGludApAQCAtNTM5LDggKzYwMCwxNSBAQAogc3RydWN0IHVzYl9pbnRlcmZhY2UgKnB1c2JfaW50ZXJmYWNlOwogc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwOwogaW50IHN1Ym1pbm9yLCByYzsKKy8qdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2Ki8KKyNpZiBkZWZpbmVkKEVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKQorI2lmIGRlZmluZWQoRUFTWUNBUF9ORUVEU19WNEwyX0RFVklDRV9IKQorc3RydWN0IHY0bDJfZGV2aWNlICpwdjRsMl9kZXZpY2U7CisjZW5kaWYgLypFQVNZQ0FQX05FRURTX1Y0TDJfREVWSUNFX0gqLworI2VuZGlmIC8qRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQqLworLypeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4qLwogCi1KT1QoNCwgImJlZ2lucy5cbiIpOworSk9UKDQsICJiZWdpbnNcbiIpOwogCiBzdWJtaW5vciA9IGltaW5vcihpbm9kZSk7CiAKQEAgLTU1Niw3MCArNjI0LDkwIEBACiAJU0FZKCJlbmRpbmcgdW5zdWNjZXNzZnVsbHlcbiIpOwogCXJldHVybiAtMTsKIH0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiAoIWRlZmluZWQoRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQpKQorIworLyp2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYqLworI2Vsc2UKKyNpZiBkZWZpbmVkKEVBU1lDQVBfTkVFRFNfVjRMMl9ERVZJQ0VfSCkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgU09NRSBWRVJTSU9OUyBPRiBUSEUgdmlkZW9kZXYgTU9EVUxFIE9WRVJXUklURSBUSEUgREFUQSBXSElDSCBIQVMKKyAqICBCRUVOIFdSSVRURU4gQlkgVEhFIENBTEwgVE8gdXNiX3NldF9pbnRmZGF0YSgpIElOIGVhc3ljYXBfdXNiX3Byb2JlKCksCisgKiAgUkVQTEFDSU5HIElUIFdJVEggQSBQT0lOVEVSIFRPIFRIRSBFTUJFRERFRCB2NGwyX2RldmljZSBTVFJVQ1RVUkUuCisgKiAgVE8gREVURUNUIFRISVMsIFRIRSBTVFJJTkcgSU4gVEhFIGVhc3ljYXAudGVsbHRhbGVbXSBCVUZGRVIgSVMgQ0hFQ0tFRC4KKyovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpZiAobWVtY21wKCZwZWFzeWNhcC0+dGVsbHRhbGVbMF0sIFRFTExUQUxFLCBzdHJsZW4oVEVMTFRBTEUpKSkgeworCXB2NGwyX2RldmljZSA9IHVzYl9nZXRfaW50ZmRhdGEocHVzYl9pbnRlcmZhY2UpOworCWlmICgoc3RydWN0IHY0bDJfZGV2aWNlICopTlVMTCA9PSBwdjRsMl9kZXZpY2UpIHsKKwkJU0FZKCJFUlJPUjogcHY0bDJfZGV2aWNlIGlzIE5VTExcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJcGVhc3ljYXAgPSAoc3RydWN0IGVhc3ljYXAgKikgXAorCQljb250YWluZXJfb2YocHY0bDJfZGV2aWNlLCBzdHJ1Y3QgZWFzeWNhcCwgdjRsMl9kZXZpY2UpOworfQorI2VuZGlmIC8qRUFTWUNBUF9ORUVEU19WNEwyX0RFVklDRV9IKi8KKyMKKyNlbmRpZiAvKkVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKi8KKy8qXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2lmIChtZW1jbXAoJnBlYXN5Y2FwLT50ZWxsdGFsZVswXSwgVEVMTFRBTEUsIHN0cmxlbihURUxMVEFMRSkpKSB7CisJU0FZKCJFUlJPUjogYmFkIHBlYXN5Y2FwOiAweCUwOGxYXG4iLCAodW5zaWduZWQgbG9uZyBpbnQpIHBlYXN5Y2FwKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogZmlsZS0+cHJpdmF0ZV9kYXRhID0gcGVhc3ljYXA7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qCi0gKiAgSU5JVElBTElaQVRJT04uCisgKiAgSU5JVElBTElaQVRJT04KICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotSk9UKDQsICJzdGFydGluZyBpbml0aWFsaXphdGlvblxuIik7CitKT00oNCwgInN0YXJ0aW5nIGluaXRpYWxpemF0aW9uXG4iKTsKIAogaWYgKChzdHJ1Y3QgdXNiX2RldmljZSAqKU5VTEwgPT0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlKSB7Ci0JU0FZKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGlzIE5VTExcbiIpOwotCXJldHVybiAtRUZBVUxUOwotfSBlbHNlIHsKLQlKT1QoMTYsICIweCUwOGxYPXBlYXN5Y2FwLT5wdXNiX2RldmljZVxuIiwgXAotCQkJCQkobG9uZyBpbnQpcGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKKwlTQU0oIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CisJcmV0dXJuIC1FTk9ERVY7CiB9CitKT00oMTYsICIweCUwOGxYPXBlYXN5Y2FwLT5wdXNiX2RldmljZVxuIiwgKGxvbmcgaW50KXBlYXN5Y2FwLT5wdXNiX2RldmljZSk7CiAKIHJjID0gYXVkaW9fc2V0dXAocGVhc3ljYXApOwogaWYgKDAgPD0gcmMpCi0JSk9UKDgsICJhdWRpb19zZXR1cCgpIHJldHVybmVkICVpXG4iLCByYyk7CisJSk9NKDgsICJhdWRpb19zZXR1cCgpIHJldHVybmVkICVpXG4iLCByYyk7CiBlbHNlCi0JSk9UKDgsICJlYXN5c25kIG9wZW4oKTogRVJST1I6IGF1ZGlvX3NldHVwKCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKKwlKT00oOCwgImVhc3lzbmQgb3BlbigpOiBFUlJPUjogYXVkaW9fc2V0dXAoKSByZXR1cm5lZCAlaVxuIiwgcmMpOwogCiBpZiAoKHN0cnVjdCB1c2JfZGV2aWNlICopTlVMTCA9PSBwZWFzeWNhcC0+cHVzYl9kZXZpY2UpIHsKLQlTQVkoIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaGFzIGJlY29tZSBOVUxMXG4iKTsKLQlyZXR1cm4gLUVGQVVMVDsKLX0KLXJjID0gYWRqdXN0X3ZvbHVtZShwZWFzeWNhcCwgLTgxOTIpOwotaWYgKDAgIT0gcmMpIHsKLQlTQVkoIkVSUk9SOiBhZGp1c3Rfdm9sdW1lKGRlZmF1bHQpIHJldHVybmVkICVpXG4iLCByYyk7Ci0JcmV0dXJuIC1FRkFVTFQ7CisJU0FNKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGhhcyBiZWNvbWUgTlVMTFxuIik7CisJcmV0dXJuIC1FTk9ERVY7CiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBpZiAoKHN0cnVjdCB1c2JfZGV2aWNlICopTlVMTCA9PSBwZWFzeWNhcC0+cHVzYl9kZXZpY2UpIHsKLQlTQVkoIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaGFzIGJlY29tZSBOVUxMXG4iKTsKLQlyZXR1cm4gLUVGQVVMVDsKKwlTQU0oIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaGFzIGJlY29tZSBOVUxMXG4iKTsKKwlyZXR1cm4gLUVOT0RFVjsKIH0KIHJjID0gdXNiX3NldF9pbnRlcmZhY2UocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCBwZWFzeWNhcC0+YXVkaW9faW50ZXJmYWNlLCBcCiAJCQkJCXBlYXN5Y2FwLT5hdWRpb19hbHRzZXR0aW5nX29uKTsKLUpPVCg4LCAidXNiX3NldF9pbnRlcmZhY2UoLiwlaSwlaSkgcmV0dXJuZWQgJWlcbiIsIHBlYXN5Y2FwLT5hdWRpb19pbnRlcmZhY2UsIFwKK0pPTSg4LCAidXNiX3NldF9pbnRlcmZhY2UoLiwlaSwlaSkgcmV0dXJuZWQgJWlcbiIsIHBlYXN5Y2FwLT5hdWRpb19pbnRlcmZhY2UsIFwKIAkJCQkJcGVhc3ljYXAtPmF1ZGlvX2FsdHNldHRpbmdfb24sIHJjKTsKIAotaWYgKChzdHJ1Y3QgdXNiX2RldmljZSAqKU5VTEwgPT0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlKSB7Ci0JU0FZKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGhhcyBiZWNvbWUgTlVMTFxuIik7Ci0JcmV0dXJuIC1FRkFVTFQ7Ci19CiByYyA9IHdha2V1cF9kZXZpY2UocGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKIGlmICgwID09IHJjKQotCUpPVCg4LCAid2FrZXVwX2RldmljZSgpIHJldHVybmVkICVpXG4iLCByYyk7CisJSk9NKDgsICJ3YWtldXBfZGV2aWNlKCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKIGVsc2UKLQlKT1QoOCwgImVhc3lzbmQgb3BlbigpOiBFUlJPUjogd2FrZXVwX2RldmljZSgpIHJldHVybmVkICVpXG4iLCByYyk7CisJSk9NKDgsICJFUlJPUjogd2FrZXVwX2RldmljZSgpIHJldHVybmVkICVpXG4iLCByYyk7CiAKLWlmICgoc3RydWN0IHVzYl9kZXZpY2UgKilOVUxMID09IHBlYXN5Y2FwLT5wdXNiX2RldmljZSkgewotCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT5wdXNiX2RldmljZSBoYXMgYmVjb21lIE5VTExcbiIpOwotCXJldHVybiAtRUZBVUxUOwotfQotc3VibWl0X2F1ZGlvX3VyYnMocGVhc3ljYXApOworcGVhc3ljYXAtPmF1ZGlvX2VvZiA9IDA7CiBwZWFzeWNhcC0+YXVkaW9faWRsZSA9IDA7CiAKIHBlYXN5Y2FwLT50aW1ldmFsMS50dl9zZWMgID0gMDsKIHBlYXN5Y2FwLT50aW1ldmFsMS50dl91c2VjID0gMDsKIAotSk9UKDQsICJmaW5pc2hlZCBpbml0aWFsaXphdGlvblxuIik7CitzdWJtaXRfYXVkaW9fdXJicyhwZWFzeWNhcCk7CisKK0pPTSg0LCAiZmluaXNoZWQgaW5pdGlhbGl6YXRpb25cbiIpOwogcmV0dXJuIDA7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC02MzUsMTEgKzcyMywxNSBAQAogCVNBWSgiRVJST1I6ICBwZWFzeWNhcCBpcyBOVUxMLlxuIik7CiAJcmV0dXJuIC1FRkFVTFQ7CiB9Ci1pZiAoMCAhPSBraWxsX2F1ZGlvX3VyYnMocGVhc3ljYXApKSB7Ci0JU0FZKCJFUlJPUjoga2lsbF9hdWRpb191cmJzKCkgZmFpbGVkXG4iKTsKK2lmIChtZW1jbXAoJnBlYXN5Y2FwLT50ZWxsdGFsZVswXSwgVEVMTFRBTEUsIHN0cmxlbihURUxMVEFMRSkpKSB7CisJU0FZKCJFUlJPUjogYmFkIHBlYXN5Y2FwOiAweCUwOGxYXG4iLCAodW5zaWduZWQgbG9uZyBpbnQpIHBlYXN5Y2FwKTsKIAlyZXR1cm4gLUVGQVVMVDsKIH0KLUpPVCg0LCAiZW5kaW5nIHN1Y2Nlc3NmdWxseVxuIik7CitpZiAoMCAhPSBraWxsX2F1ZGlvX3VyYnMocGVhc3ljYXApKSB7CisJU0FNKCJFUlJPUjoga2lsbF9hdWRpb191cmJzKCkgZmFpbGVkXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK0pPTSg0LCAiZW5kaW5nIHN1Y2Nlc3NmdWxseVxuIik7CiByZXR1cm4gMDsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTY0OCwxMiArNzQwLDExIEBACiAJCQkJCQlzaXplX3Qga291bnQsIGxvZmZfdCAqcG9mZikKIHsKIHN0cnVjdCB0aW1ldmFsIHRpbWV2YWw7Ci1zdGF0aWMgc3RydWN0IHRpbWV2YWwgdGltZXZhbDE7Ci1zdGF0aWMgbG9uZyBsb25nIGludCBhdWRpb19ieXRlcywgYWJvdmUsIGJlbG93LCBtZWFuOworbG9uZyBsb25nIGludCBhYm92ZSwgYmVsb3csIG1lYW47CiBzdHJ1Y3Qgc2lnbmVkX2Rpdl9yZXN1bHQgc2RyOwogdW5zaWduZWQgY2hhciAqcDA7CiBsb25nIGludCBrb3VudDEsIG1vcmUsIHJjLCBsMCwgbG07Ci1pbnQgZnJhZ21lbnQ7CitpbnQgZnJhZ21lbnQsIGtkOwogc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwOwogc3RydWN0IGRhdGFfYnVmZmVyICpwZGF0YV9idWZmZXI7CiBzaXplX3Qgc3pyZXQ7CkBAIC02NzEsMjMgKzc2Miw4OSBAQAogCiBKT1QoOCwgIj09PT09IGVhc3lzbmRfcmVhZCgpOiBrb3VudD0laSwgKnBvZmY9JWlcbiIsIChpbnQpa291bnQsIChpbnQpKCpwb2ZmKSk7CiAKLXBlYXN5Y2FwID0gKHN0cnVjdCBlYXN5Y2FwICopKGZpbGUtPnByaXZhdGVfZGF0YSk7CitpZiAoTlVMTCA9PSBmaWxlKSB7CisJU0FZKCJFUlJPUjogIGZpbGUgaXMgTlVMTFxuIik7CisJcmV0dXJuIC1FUkVTVEFSVFNZUzsKK30KK3BlYXN5Y2FwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogaWYgKE5VTEwgPT0gcGVhc3ljYXApIHsKIAlTQVkoIkVSUk9SIGluIGVhc3lzbmRfcmVhZCgpOiBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKIAlyZXR1cm4gLUVGQVVMVDsKIH0KK2lmIChtZW1jbXAoJnBlYXN5Y2FwLT50ZWxsdGFsZVswXSwgVEVMTFRBTEUsIHN0cmxlbihURUxMVEFMRSkpKSB7CisJU0FZKCJFUlJPUjogYmFkIHBlYXN5Y2FwOiAweCUwOGxYXG4iLCAodW5zaWduZWQgbG9uZyBpbnQpIHBlYXN5Y2FwKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK2lmIChOVUxMID09IHBlYXN5Y2FwLT5wdXNiX2RldmljZSkgeworCVNBWSgiRVJST1IgaW4gZWFzeXNuZF9yZWFkKCk6IHBlYXN5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK2tkID0gaXNkb25nbGUocGVhc3ljYXApOworaWYgKDAgPD0ga2QgJiYgRE9OR0xFX01BTlkgPiBrZCkgeworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJihlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pKSkgeworCQlTQVkoIkVSUk9SOiBjYW5ub3QgbG9jayBlYXN5Y2FwX2RvbmdsZVslaV0ubXV0ZXhfYXVkaW9cbiIsIGtkKTsKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwl9CisJSk9NKDQsICJsb2NrZWQgZWFzeWNhcF9kb25nbGVbJWldLm11dGV4X2F1ZGlvXG4iLCBrZCk7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIE1FQU5XSElMRSwgZWFzeWNhcF91c2JfZGlzY29ubmVjdCgpIE1BWSBIQVZFIEZSRUVEIFBPSU5URVIgcGVhc3ljYXAsCisgKiAgSU4gV0hJQ0ggQ0FTRSBBIFJFUEVBVCBDQUxMIFRPIGlzZG9uZ2xlKCkgV0lMTCBGQUlMLgorICogIElGIE5FQ0VTU0FSWSwgQkFJTCBPVVQuCisqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWlmIChrZCAhPSBpc2RvbmdsZShwZWFzeWNhcCkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJaWYgKE5VTEwgPT0gZmlsZSkgeworCQlTQVkoIkVSUk9SOiAgZmlsZSBpcyBOVUxMXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOworCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCX0KKwlwZWFzeWNhcCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpZiAoTlVMTCA9PSBwZWFzeWNhcCkgeworCQlTQVkoIkVSUk9SOiAgcGVhc3ljYXAgaXMgTlVMTFxuIik7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKTsKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwl9CisJaWYgKG1lbWNtcCgmcGVhc3ljYXAtPnRlbGx0YWxlWzBdLCBURUxMVEFMRSwgc3RybGVuKFRFTExUQUxFKSkpIHsKKwkJU0FZKCJFUlJPUjogYmFkIHBlYXN5Y2FwOiAweCUwOGxYXG4iLCBcCisJCQkJCQkodW5zaWduZWQgbG9uZyBpbnQpIHBlYXN5Y2FwKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOworCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCX0KKwlpZiAoTlVMTCA9PSBwZWFzeWNhcC0+cHVzYl9kZXZpY2UpIHsKKwkJU0FNKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGlzIE5VTExcbiIpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorfSBlbHNlIHsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgSUYgZWFzeWNhcF91c2JfZGlzY29ubmVjdCgpIEhBUyBBTFJFQURZIEZSRUVEIFBPSU5URVIgcGVhc3ljYXAgQkVGT1JFIFRIRQorICogIEFUVEVNUFQgVE8gQUNRVUlSRSBUSEUgU0VNQVBIT1JFLCBpc2RvbmdsZSgpIFdJTEwgSEFWRSBGQUlMRUQuICBCQUlMIE9VVC4KKyovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJcmV0dXJuIC1FUkVTVEFSVFNZUzsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2lmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKKwlKT1QoMTYsICJOT05CTE9DSyAga291bnQ9JWksICpwb2ZmPSVpXG4iLCAoaW50KWtvdW50LCAoaW50KSgqcG9mZikpOworZWxzZQorCUpPVCg4LCAiQkxPQ0tJTkcgIGtvdW50PSVpLCAqcG9mZj0laVxuIiwgKGludClrb3VudCwgKGludCkoKnBvZmYpKTsKKwogaWYgKCgwID4gcGVhc3ljYXAtPmF1ZGlvX3JlYWQpIHx8IFwKIAkJKHBlYXN5Y2FwLT5hdWRpb19idWZmZXJfcGFnZV9tYW55IDw9IHBlYXN5Y2FwLT5hdWRpb19yZWFkKSkgewotCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT5hdWRpb19yZWFkIG91dCBvZiByYW5nZVxuIik7CisJU0FNKCJFUlJPUjogcGVhc3ljYXAtPmF1ZGlvX3JlYWQgb3V0IG9mIHJhbmdlXG4iKTsKKwltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CiAJcmV0dXJuIC1FRkFVTFQ7CiB9CiBwZGF0YV9idWZmZXIgPSAmcGVhc3ljYXAtPmF1ZGlvX2J1ZmZlcltwZWFzeWNhcC0+YXVkaW9fcmVhZF07CiBpZiAoKHN0cnVjdCBkYXRhX2J1ZmZlciAqKU5VTEwgPT0gcGRhdGFfYnVmZmVyKSB7Ci0JU0FZKCJFUlJPUjogcGRhdGFfYnVmZmVyIGlzIE5VTExcbiIpOworCVNBTSgiRVJST1I6IHBkYXRhX2J1ZmZlciBpcyBOVUxMXG4iKTsKKwltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CiAJcmV0dXJuIC1FRkFVTFQ7CiB9Ci1KT1QoMTIsICJiZWZvcmUgd2FpdCwgJWk9ZnJhZyByZWFkICAlaT1mcmFnIGZpbGxcbiIsIFwKK0pPTSgxMiwgImJlZm9yZSB3YWl0LCAlaT1mcmFnIHJlYWQgICVpPWZyYWcgZmlsbFxuIiwgXAogCQkocGVhc3ljYXAtPmF1ZGlvX3JlYWQgLyBwZWFzeWNhcC0+YXVkaW9fcGFnZXNfcGVyX2ZyYWdtZW50KSwgXAogCQkocGVhc3ljYXAtPmF1ZGlvX2ZpbGwgLyBwZWFzeWNhcC0+YXVkaW9fcGFnZXNfcGVyX2ZyYWdtZW50KSk7CiBmcmFnbWVudCA9IChwZWFzeWNhcC0+YXVkaW9fcmVhZCAvIHBlYXN5Y2FwLT5hdWRpb19wYWdlc19wZXJfZnJhZ21lbnQpOwpAQCAtNjk1LDcgKzg1Miw4IEBACiAJCQkJcGVhc3ljYXAtPmF1ZGlvX3BhZ2VzX3Blcl9mcmFnbWVudCkpIHx8IFwKIAkJKDAgPT0gKFBBR0VfU0laRSAtIChwZGF0YV9idWZmZXItPnB0byAtIHBkYXRhX2J1ZmZlci0+cGdvKSkpKSB7CiAJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7Ci0JCUpPVCgxNiwgInJldHVybmluZyAtRUFHQUlOIGFzIGluc3RydWN0ZWRcbiIpOworCQlKT00oMTYsICJyZXR1cm5pbmcgLUVBR0FJTiBhcyBpbnN0cnVjdGVkXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOwogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CiAJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocGVhc3ljYXAtPndxX2F1ZGlvLCBcCkBAIC03MDQsNTAgKzg2Miw1NiBAQAogCQkJCXBlYXN5Y2FwLT5hdWRpb19wYWdlc19wZXJfZnJhZ21lbnQpKSAmJiBcCiAJCSgwIDwgKFBBR0VfU0laRSAtIChwZGF0YV9idWZmZXItPnB0byAtIHBkYXRhX2J1ZmZlci0+cGdvKSkpKSkpOwogCWlmICgwICE9IHJjKSB7Ci0JCVNBWSgiYWJvcnRlZCBieSBzaWduYWxcbiIpOworCQlTQU0oImFib3J0ZWQgYnkgc2lnbmFsXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOwogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCX0KIAlpZiAocGVhc3ljYXAtPmF1ZGlvX2VvZikgewotCQlKT1QoOCwgInJldHVybmluZyAwIGJlY2F1c2UgICVpPWF1ZGlvX2VvZlxuIiwgXAorCQlKT00oOCwgInJldHVybmluZyAwIGJlY2F1c2UgICVpPWF1ZGlvX2VvZlxuIiwgXAogCQkJCQkJCXBlYXN5Y2FwLT5hdWRpb19lb2YpOwogCQlraWxsX2F1ZGlvX3VyYnMocGVhc3ljYXApOwotCQltc2xlZXAoNTAwKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOwogCQlyZXR1cm4gMDsKIAl9CiAJaWYgKHBlYXN5Y2FwLT5hdWRpb19pZGxlKSB7Ci0JCUpPVCgxNiwgInJldHVybmluZyAwIGJlY2F1c2UgICVpPWF1ZGlvX2lkbGVcbiIsIFwKKwkJSk9NKDE2LCAicmV0dXJuaW5nIDAgYmVjYXVzZSAgJWk9YXVkaW9faWRsZVxuIiwgXAogCQkJCQkJCXBlYXN5Y2FwLT5hdWRpb19pZGxlKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOwogCQlyZXR1cm4gMDsKIAl9CiAJaWYgKCFwZWFzeWNhcC0+YXVkaW9faXNvY19zdHJlYW1pbmcpIHsKLQkJSk9UKDE2LCAicmV0dXJuaW5nIDAgYmVjYXVzZSBhdWRpbyB1cmJzIG5vdCBzdHJlYW1pbmdcbiIpOworCQlKT00oMTYsICJyZXR1cm5pbmcgMCBiZWNhdXNlIGF1ZGlvIHVyYnMgbm90IHN0cmVhbWluZ1xuIik7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKTsKIAkJcmV0dXJuIDA7CiAJfQogfQotSk9UKDEyLCAiYWZ0ZXIgIHdhaXQsICVpPWZyYWcgcmVhZCAgJWk9ZnJhZyBmaWxsXG4iLCBcCitKT00oMTIsICJhZnRlciAgd2FpdCwgJWk9ZnJhZyByZWFkICAlaT1mcmFnIGZpbGxcbiIsIFwKIAkJKHBlYXN5Y2FwLT5hdWRpb19yZWFkIC8gcGVhc3ljYXAtPmF1ZGlvX3BhZ2VzX3Blcl9mcmFnbWVudCksIFwKIAkJKHBlYXN5Y2FwLT5hdWRpb19maWxsIC8gcGVhc3ljYXAtPmF1ZGlvX3BhZ2VzX3Blcl9mcmFnbWVudCkpOwogc3pyZXQgPSAoc2l6ZV90KTA7CiB3aGlsZSAoZnJhZ21lbnQgPT0gKHBlYXN5Y2FwLT5hdWRpb19yZWFkIC8gXAogCQkJCXBlYXN5Y2FwLT5hdWRpb19wYWdlc19wZXJfZnJhZ21lbnQpKSB7CiAJaWYgKE5VTEwgPT0gcGRhdGFfYnVmZmVyLT5wZ28pIHsKLQkJU0FZKCJFUlJPUjogcGRhdGFfYnVmZmVyLT5wZ28gaXMgTlVMTFxuIik7CisJCVNBTSgiRVJST1I6IHBkYXRhX2J1ZmZlci0+cGdvIGlzIE5VTExcbiIpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAlpZiAoTlVMTCA9PSBwZGF0YV9idWZmZXItPnB0bykgewotCQlTQVkoIkVSUk9SOiBwZGF0YV9idWZmZXItPnB0byBpcyBOVUxMXG4iKTsKKwkJU0FNKCJFUlJPUjogcGRhdGFfYnVmZmVyLT5wdG8gaXMgTlVMTFxuIik7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCWtvdW50MSA9IFBBR0VfU0laRSAtIChwZGF0YV9idWZmZXItPnB0byAtIHBkYXRhX2J1ZmZlci0+cGdvKTsKIAlpZiAoMCA+IGtvdW50MSkgewotCQlTQVkoImVhc3lzbmRfcmVhZDogTUlTVEFLRToga291bnQxIGlzIG5lZ2F0aXZlXG4iKTsKKwkJU0FNKCJlYXN5c25kX3JlYWQ6IE1JU1RBS0U6IGtvdW50MSBpcyBuZWdhdGl2ZVxuIik7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKTsKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAl9CiAJaWYgKCFrb3VudDEpIHsKIAkJKHBlYXN5Y2FwLT5hdWRpb19yZWFkKSsrOwogCQlpZiAocGVhc3ljYXAtPmF1ZGlvX2J1ZmZlcl9wYWdlX21hbnkgPD0gcGVhc3ljYXAtPmF1ZGlvX3JlYWQpCiAJCQlwZWFzeWNhcC0+YXVkaW9fcmVhZCA9IDA7Ci0JCUpPVCgxMiwgImJ1bXBlZCBwZWFzeWNhcC0+YXVkaW9fcmVhZCB0byAlaVxuIiwgXAorCQlKT00oMTIsICJidW1wZWQgcGVhc3ljYXAtPmF1ZGlvX3JlYWQgdG8gJWlcbiIsIFwKIAkJCQkJCXBlYXN5Y2FwLT5hdWRpb19yZWFkKTsKIAogCQlpZiAoZnJhZ21lbnQgIT0gKHBlYXN5Y2FwLT5hdWRpb19yZWFkIC8gXApAQCAtNzU3LDMwICs5MjEsMzQgQEAKIAkJaWYgKCgwID4gcGVhc3ljYXAtPmF1ZGlvX3JlYWQpIHx8IFwKIAkJCShwZWFzeWNhcC0+YXVkaW9fYnVmZmVyX3BhZ2VfbWFueSA8PSBcCiAJCQkJCXBlYXN5Y2FwLT5hdWRpb19yZWFkKSkgewotCQkJU0FZKCJFUlJPUjogcGVhc3ljYXAtPmF1ZGlvX3JlYWQgb3V0IG9mIHJhbmdlXG4iKTsKKwkJCVNBTSgiRVJST1I6IHBlYXN5Y2FwLT5hdWRpb19yZWFkIG91dCBvZiByYW5nZVxuIik7CisJCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJfQogCQlwZGF0YV9idWZmZXIgPSAmcGVhc3ljYXAtPmF1ZGlvX2J1ZmZlcltwZWFzeWNhcC0+YXVkaW9fcmVhZF07CiAJCWlmICgoc3RydWN0IGRhdGFfYnVmZmVyICopTlVMTCA9PSBwZGF0YV9idWZmZXIpIHsKLQkJCVNBWSgiRVJST1I6IHBkYXRhX2J1ZmZlciBpcyBOVUxMXG4iKTsKKwkJCVNBTSgiRVJST1I6IHBkYXRhX2J1ZmZlciBpcyBOVUxMXG4iKTsKKwkJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKTsKIAkJCXJldHVybiAtRUZBVUxUOwogCQl9CiAJCWlmIChOVUxMID09IHBkYXRhX2J1ZmZlci0+cGdvKSB7Ci0JCQlTQVkoIkVSUk9SOiBwZGF0YV9idWZmZXItPnBnbyBpcyBOVUxMXG4iKTsKKwkJCVNBTSgiRVJST1I6IHBkYXRhX2J1ZmZlci0+cGdvIGlzIE5VTExcbiIpOworCQkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOwogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCX0KIAkJaWYgKE5VTEwgPT0gcGRhdGFfYnVmZmVyLT5wdG8pIHsKLQkJCVNBWSgiRVJST1I6IHBkYXRhX2J1ZmZlci0+cHRvIGlzIE5VTExcbiIpOworCQkJU0FNKCJFUlJPUjogcGRhdGFfYnVmZmVyLT5wdG8gaXMgTlVMTFxuIik7CisJCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJfQogCQlrb3VudDEgPSBQQUdFX1NJWkUgLSAocGRhdGFfYnVmZmVyLT5wdG8gLSBwZGF0YV9idWZmZXItPnBnbyk7CiAJfQotCUpPVCgxMiwgInJlYWR5ICB0byBzZW5kICVsaSBieXRlc1xuIiwgKGxvbmcgaW50KSBrb3VudDEpOwotCUpPVCgxMiwgInN0aWxsICB0byBzZW5kICVsaSBieXRlc1xuIiwgKGxvbmcgaW50KSBrb3VudCk7CisJSk9NKDEyLCAicmVhZHkgIHRvIHNlbmQgJWxpIGJ5dGVzXG4iLCAobG9uZyBpbnQpIGtvdW50MSk7CisJSk9NKDEyLCAic3RpbGwgIHRvIHNlbmQgJWxpIGJ5dGVzXG4iLCAobG9uZyBpbnQpIGtvdW50KTsKIAltb3JlID0ga291bnQxOwogCWlmIChtb3JlID4ga291bnQpCiAJCW1vcmUgPSBrb3VudDsKLQlKT1QoMTIsICJhZ3JlZWQgdG8gc2VuZCAlbGkgYnl0ZXMgZnJvbSBwYWdlICVpXG4iLCBcCisJSk9NKDEyLCAiYWdyZWVkIHRvIHNlbmQgJWxpIGJ5dGVzIGZyb20gcGFnZSAlaVxuIiwgXAogCQkJCQkJbW9yZSwgcGVhc3ljYXAtPmF1ZGlvX3JlYWQpOwogCWlmICghbW9yZSkKIAkJYnJlYWs7CkBAIC03OTgsNyArOTY2LDggQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAlyYyA9IGNvcHlfdG9fdXNlcihwdXNlcnNwYWNlYnVmZmVyLCBwZGF0YV9idWZmZXItPnB0bywgbW9yZSk7CiAJaWYgKDAgIT0gcmMpIHsKLQkJU0FZKCJFUlJPUjogY29weV90b191c2VyKCkgcmV0dXJuZWQgJWxpXG4iLCByYyk7CisJCVNBTSgiRVJST1I6IGNvcHlfdG9fdXNlcigpIHJldHVybmVkICVsaVxuIiwgcmMpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAkqcG9mZiArPSAobG9mZl90KW1vcmU7CkBAIC04MDcsMTEgKzk3NiwxMSBAQAogCXB1c2Vyc3BhY2VidWZmZXIgKz0gbW9yZTsKIAlrb3VudCAtPSAoc2l6ZV90KW1vcmU7CiB9Ci1KT1QoMTIsICJhZnRlciAgcmVhZCwgJWk9ZnJhZyByZWFkICAlaT1mcmFnIGZpbGxcbiIsIFwKK0pPTSgxMiwgImFmdGVyICByZWFkLCAlaT1mcmFnIHJlYWQgICVpPWZyYWcgZmlsbFxuIiwgXAogCQkocGVhc3ljYXAtPmF1ZGlvX3JlYWQgLyBwZWFzeWNhcC0+YXVkaW9fcGFnZXNfcGVyX2ZyYWdtZW50KSwgXAogCQkocGVhc3ljYXAtPmF1ZGlvX2ZpbGwgLyBwZWFzeWNhcC0+YXVkaW9fcGFnZXNfcGVyX2ZyYWdtZW50KSk7CiBpZiAoa291bnQgPCAwKSB7Ci0JU0FZKCJNSVNUQUtFOiAgJWxpPWtvdW50ICAlbGk9c3pyZXRcbiIsIFwKKwlTQU0oIk1JU1RBS0U6ICAlbGk9a291bnQgICVsaT1zenJldFxuIiwgXAogCQkJCQkobG9uZyBpbnQpa291bnQsIChsb25nIGludClzenJldCk7CiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC04MjcsMTEgKzk5NiwxMSBAQAogCW1lYW4gPSBwZWFzeWNhcC0+YXVkaW9fbml2ZWF1OwogCXNkciA9IHNpZ25lZF9kaXYobWVhbiwgcGVhc3ljYXAtPmF1ZGlvX3NhbXBsZSk7CiAKLQlKT1QoOCwgIiU4bGxpPW1lYW4gICU4bGxpPW1lYW5zcXVhcmUgYWZ0ZXIgJWxsaSBzYW1wbGVzLCA9PlxuIiwgXAorCUpPTSg4LCAiJThsbGk9bWVhbiAgJThsbGk9bWVhbnNxdWFyZSBhZnRlciAlbGxpIHNhbXBsZXMsID0+XG4iLCBcCiAJCQkJc2RyLnF1b3RpZW50LCBhYm92ZSwgcGVhc3ljYXAtPmF1ZGlvX3NhbXBsZSk7CiAKIAlzZHIgPSBzaWduZWRfZGl2KGFib3ZlLCAzMjc2OCk7Ci0JSk9UKDgsICJhdWRpbyBkeW5hbWljIHJhbmdlIGlzIHJvdWdobHkgJWxsaVxuIiwgc2RyLnF1b3RpZW50KTsKKwlKT00oOCwgImF1ZGlvIGR5bmFtaWMgcmFuZ2UgaXMgcm91Z2hseSAlbGxpXG4iLCBzZHIucXVvdGllbnQpOwogfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKQEAgLTg0MCwzMyArMTAwOSwyOCBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogZG9fZ2V0dGltZW9mZGF5KCZ0aW1ldmFsKTsKIGlmICghcGVhc3ljYXAtPnRpbWV2YWwxLnR2X3NlYykgewotCWF1ZGlvX2J5dGVzID0gMDsKLQl0aW1ldmFsMSA9IHRpbWV2YWw7Ci0KLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCYocGVhc3ljYXAtPm11dGV4X3RpbWV2YWwxKSkpCi0JCXJldHVybiAtRVJFU1RBUlRTWVM7Ci0JcGVhc3ljYXAtPnRpbWV2YWwxID0gdGltZXZhbDE7Ci0JbXV0ZXhfdW5sb2NrKCYocGVhc3ljYXAtPm11dGV4X3RpbWV2YWwxKSk7CisJcGVhc3ljYXAtPmF1ZGlvX2J5dGVzID0gMDsKKwlwZWFzeWNhcC0+dGltZXZhbDMgPSB0aW1ldmFsOworCXBlYXN5Y2FwLT50aW1ldmFsMSA9IHBlYXN5Y2FwLT50aW1ldmFsMzsKIAlzZHIucXVvdGllbnQgPSAxOTIwMDA7CiB9IGVsc2UgewotCWF1ZGlvX2J5dGVzICs9IChsb25nIGxvbmcgaW50KSBzenJldDsKKwlwZWFzeWNhcC0+YXVkaW9fYnl0ZXMgKz0gKGxvbmcgbG9uZyBpbnQpIHN6cmV0OwogCWJlbG93ID0gKChsb25nIGxvbmcgaW50KSgxMDAwMDAwKSkgKiBcCi0JCSgobG9uZyBsb25nIGludCkodGltZXZhbC50dl9zZWMgIC0gdGltZXZhbDEudHZfc2VjKSkgKyBcCi0JCShsb25nIGxvbmcgaW50KSh0aW1ldmFsLnR2X3VzZWMgLSB0aW1ldmFsMS50dl91c2VjKTsKLQlhYm92ZSA9IDEwMDAwMDAgKiAoKGxvbmcgbG9uZyBpbnQpIGF1ZGlvX2J5dGVzKTsKKwkJKChsb25nIGxvbmcgaW50KSh0aW1ldmFsLnR2X3NlYyAgLSBcCisJCQkJCQlwZWFzeWNhcC0+dGltZXZhbDMudHZfc2VjKSkgKyBcCisJCShsb25nIGxvbmcgaW50KSh0aW1ldmFsLnR2X3VzZWMgLSBwZWFzeWNhcC0+dGltZXZhbDMudHZfdXNlYyk7CisJYWJvdmUgPSAxMDAwMDAwICogKChsb25nIGxvbmcgaW50KSBwZWFzeWNhcC0+YXVkaW9fYnl0ZXMpOwogCiAJaWYgKGJlbG93KQogCQlzZHIgPSBzaWduZWRfZGl2KGFib3ZlLCBiZWxvdyk7CiAJZWxzZQogCQlzZHIucXVvdGllbnQgPSAxOTIwMDA7CiB9Ci1KT1QoOCwgImF1ZGlvIHN0cmVhbWluZyBhdCAlbGxpIGJ5dGVzL3NlY29uZFxuIiwgc2RyLnF1b3RpZW50KTsKLWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJihwZWFzeWNhcC0+bXV0ZXhfdGltZXZhbDEpKSkKLQlyZXR1cm4gLUVSRVNUQVJUU1lTOworSk9NKDgsICJhdWRpbyBzdHJlYW1pbmcgYXQgJWxsaSBieXRlcy9zZWNvbmRcbiIsIHNkci5xdW90aWVudCk7CiBwZWFzeWNhcC0+ZG5ieWR0ID0gc2RyLnF1b3RpZW50OwotbXV0ZXhfdW5sb2NrKCYocGVhc3ljYXAtPm11dGV4X3RpbWV2YWwxKSk7CiAKLUpPVCg4LCAicmV0dXJuaW5nICVsaVxuIiwgKGxvbmcgaW50KXN6cmV0KTsKK0pPTSg4LCAicmV0dXJuaW5nICVsaVxuIiwgKGxvbmcgaW50KXN6cmV0KTsKK211dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKTsKIHJldHVybiBzenJldDsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTg4MSwyNyArMTA0NSwzMSBAQAogc3RydWN0IGRhdGFfdXJiICpwZGF0YV91cmI7CiBzdHJ1Y3QgdXJiICpwdXJiOwogc3RydWN0IGxpc3RfaGVhZCAqcGxpc3RfaGVhZDsKLWludCBqLCBpc2JhZCwgbSwgcmM7CitpbnQgaiwgaXNiYWQsIG5vc3BjLCBtLCByYzsKIGludCBpc2J1ZjsKIAoraWYgKE5VTEwgPT0gcGVhc3ljYXApIHsKKwlTQVkoIkVSUk9SOiBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KIGlmICgoc3RydWN0IGxpc3RfaGVhZCAqKU5VTEwgPT0gcGVhc3ljYXAtPnB1cmJfYXVkaW9faGVhZCkgewotCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT51cmJfYXVkaW9faGVhZCB1bmluaXRpYWxpemVkXG4iKTsKKwlTQU0oIkVSUk9SOiBwZWFzeWNhcC0+dXJiX2F1ZGlvX2hlYWQgdW5pbml0aWFsaXplZFxuIik7CiAJcmV0dXJuIC1FRkFVTFQ7CiB9CiBpZiAoKHN0cnVjdCB1c2JfZGV2aWNlICopTlVMTCA9PSBwZWFzeWNhcC0+cHVzYl9kZXZpY2UpIHsKLQlTQVkoIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CisJU0FNKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGlzIE5VTExcbiIpOwogCXJldHVybiAtRUZBVUxUOwogfQogaWYgKCFwZWFzeWNhcC0+YXVkaW9faXNvY19zdHJlYW1pbmcpIHsKLQlKT1QoNCwgImluaXRpYWwgc3VibWlzc2lvbiBvZiBhbGwgYXVkaW8gdXJic1xuIik7CisJSk9NKDQsICJpbml0aWFsIHN1Ym1pc3Npb24gb2YgYWxsIGF1ZGlvIHVyYnNcbiIpOwogCXJjID0gdXNiX3NldF9pbnRlcmZhY2UocGVhc3ljYXAtPnB1c2JfZGV2aWNlLAogCQkJCQlwZWFzeWNhcC0+YXVkaW9faW50ZXJmYWNlLCBcCiAJCQkJCXBlYXN5Y2FwLT5hdWRpb19hbHRzZXR0aW5nX29uKTsKLQlKT1QoOCwgInVzYl9zZXRfaW50ZXJmYWNlKC4sJWksJWkpIHJldHVybmVkICVpXG4iLCBcCisJSk9NKDgsICJ1c2Jfc2V0X2ludGVyZmFjZSguLCVpLCVpKSByZXR1cm5lZCAlaVxuIiwgXAogCQkJCQlwZWFzeWNhcC0+YXVkaW9faW50ZXJmYWNlLCBcCiAJCQkJCXBlYXN5Y2FwLT5hdWRpb19hbHRzZXR0aW5nX29uLCByYyk7CiAKLQlpc2JhZCA9IDA7ICBtID0gMDsKKwlpc2JhZCA9IDA7ICBub3NwYyA9IDA7ICBtID0gMDsKIAlsaXN0X2Zvcl9lYWNoKHBsaXN0X2hlYWQsIChwZWFzeWNhcC0+cHVyYl9hdWRpb19oZWFkKSkgewogCQlwZGF0YV91cmIgPSBsaXN0X2VudHJ5KHBsaXN0X2hlYWQsIHN0cnVjdCBkYXRhX3VyYiwgbGlzdF9oZWFkKTsKIAkJaWYgKE5VTEwgIT0gcGRhdGFfdXJiKSB7CkBAIC05MzgsMzkgKzExMDYsNDkgQEAKIAkJCQlyYyA9IHVzYl9zdWJtaXRfdXJiKHB1cmIsIEdGUF9LRVJORUwpOwogCQkJCWlmICgwICE9IHJjKSB7CiAJCQkJCWlzYmFkKys7Ci0JCQkJCVNBWSgiRVJST1I6IHVzYl9zdWJtaXRfdXJiKCkgZmFpbGVkIiBcCisJCQkJCVNBTSgiRVJST1I6IHVzYl9zdWJtaXRfdXJiKCkgZmFpbGVkIiBcCiAJCQkJCQkJIiBmb3IgdXJiIHdpdGggcmM6XG4iKTsKIAkJCQkJc3dpdGNoIChyYykgewogCQkJCQljYXNlIC1FTk9NRU06IHsKLQkJCQkJCVNBWSgiRU5PTUVNXG4iKTsgYnJlYWs7CisJCQkJCQlTQU0oIi1FTk9NRU1cbiIpOworCQkJCQkJYnJlYWs7CiAJCQkJCX0KIAkJCQkJY2FzZSAtRU5PREVWOiB7Ci0JCQkJCQlTQVkoIkVOT0RFVlxuIik7IGJyZWFrOworCQkJCQkJU0FNKCItRU5PREVWXG4iKTsKKwkJCQkJCWJyZWFrOwogCQkJCQl9CiAJCQkJCWNhc2UgLUVOWElPOiB7Ci0JCQkJCQlTQVkoIkVOWElPXG4iKTsgYnJlYWs7CisJCQkJCQlTQU0oIi1FTlhJT1xuIik7CisJCQkJCQlicmVhazsKIAkJCQkJfQogCQkJCQljYXNlIC1FSU5WQUw6IHsKLQkJCQkJCVNBWSgiRUlOVkFMXG4iKTsgYnJlYWs7CisJCQkJCQlTQU0oIi1FSU5WQUxcbiIpOworCQkJCQkJYnJlYWs7CiAJCQkJCX0KIAkJCQkJY2FzZSAtRUFHQUlOOiB7Ci0JCQkJCQlTQVkoIkVBR0FJTlxuIik7IGJyZWFrOworCQkJCQkJU0FNKCItRUFHQUlOXG4iKTsKKwkJCQkJCWJyZWFrOwogCQkJCQl9CiAJCQkJCWNhc2UgLUVGQklHOiB7Ci0JCQkJCQlTQVkoIkVGQklHXG4iKTsgYnJlYWs7CisJCQkJCQlTQU0oIi1FRkJJR1xuIik7CisJCQkJCQlicmVhazsKIAkJCQkJfQogCQkJCQljYXNlIC1FUElQRTogewotCQkJCQkJU0FZKCJFUElQRVxuIik7IGJyZWFrOworCQkJCQkJU0FNKCItRVBJUEVcbiIpOworCQkJCQkJYnJlYWs7CiAJCQkJCX0KIAkJCQkJY2FzZSAtRU1TR1NJWkU6IHsKLQkJCQkJCVNBWSgiRU1TR1NJWkVcbiIpOyBicmVhazsKKwkJCQkJCVNBTSgiLUVNU0dTSVpFXG4iKTsKKwkJCQkJCWJyZWFrOwogCQkJCQl9CiAJCQkJCWNhc2UgLUVOT1NQQzogewotCQkJCQkJU0FZKCJFTk9TUENcbiIpOyBicmVhazsKKwkJCQkJCW5vc3BjKys7CisJCQkJCQlicmVhazsKIAkJCQkJfQogCQkJCQlkZWZhdWx0OiB7Ci0JCQkJCQlTQVkoInVua25vd24gZXJyb3IgY29kZSAlaVxuIixcCi0JCQkJCQkJCSByYyk7IGJyZWFrOworCQkJCQkJU0FNKCJ1bmtub3duIGVycm9yIGNvZGUgJWlcbiIsXAorCQkJCQkJCQkgcmMpOworCQkJCQkJYnJlYWs7CiAJCQkJCX0KIAkJCQkJfQogCQkJCX0gZWxzZSB7CkBAIC05ODMsOCArMTE2MSwxMyBAQAogCQkJaXNiYWQrKzsKIAkJfQogCX0KKwlpZiAobm9zcGMpIHsKKwkJU0FNKCItRU5PU1BDPXVzYl9zdWJtaXRfdXJiKCkgZm9yICVpIHVyYnNcbiIsIG5vc3BjKTsKKwkJU0FNKCIuLi4uLiAgcG9zc2libHkgaW5hZGVxdWF0ZSBVU0IgYmFuZHdpZHRoXG4iKTsKKwkJcGVhc3ljYXAtPmF1ZGlvX2VvZiA9IDE7CisJfQogCWlmIChpc2JhZCkgewotCQlKT1QoNCwgImF0dGVtcHRpbmcgY2xlYW51cCBpbnN0ZWFkIG9mIHN1Ym1pdHRpbmdcbiIpOworCQlKT00oNCwgImF0dGVtcHRpbmcgY2xlYW51cCBpbnN0ZWFkIG9mIHN1Ym1pdHRpbmdcbiIpOwogCQlsaXN0X2Zvcl9lYWNoKHBsaXN0X2hlYWQsIChwZWFzeWNhcC0+cHVyYl9hdWRpb19oZWFkKSkgewogCQkJcGRhdGFfdXJiID0gbGlzdF9lbnRyeShwbGlzdF9oZWFkLCBzdHJ1Y3QgZGF0YV91cmIsIFwKIAkJCQkJCQkJbGlzdF9oZWFkKTsKQEAgLTk5NywxMCArMTE4MCwxMCBAQAogCQlwZWFzeWNhcC0+YXVkaW9faXNvY19zdHJlYW1pbmcgPSAwOwogCX0gZWxzZSB7CiAJCXBlYXN5Y2FwLT5hdWRpb19pc29jX3N0cmVhbWluZyA9IDE7Ci0JCUpPVCg0LCAic3VibWl0dGVkICVpIGF1ZGlvIHVyYnNcbiIsIG0pOworCQlKT00oNCwgInN1Ym1pdHRlZCAlaSBhdWRpbyB1cmJzXG4iLCBtKTsKIAl9CiB9IGVsc2UKLQlKT1QoNCwgImFscmVhZHkgc3RyZWFtaW5nIGF1ZGlvIHVyYnNcbiIpOworCUpPTSg0LCAiYWxyZWFkeSBzdHJlYW1pbmcgYXVkaW8gdXJic1xuIik7CiAKIHJldHVybiAwOwogfQpAQCAtMTAxNywxMCArMTIwMCwxNCBAQAogc3RydWN0IGxpc3RfaGVhZCAqcGxpc3RfaGVhZDsKIHN0cnVjdCBkYXRhX3VyYiAqcGRhdGFfdXJiOwogCitpZiAoTlVMTCA9PSBwZWFzeWNhcCkgeworCVNBWSgiRVJST1I6IHBlYXN5Y2FwIGlzIE5VTExcbiIpOworCXJldHVybiAtRUZBVUxUOworfQogaWYgKHBlYXN5Y2FwLT5hdWRpb19pc29jX3N0cmVhbWluZykgewogCWlmICgoc3RydWN0IGxpc3RfaGVhZCAqKU5VTEwgIT0gcGVhc3ljYXAtPnB1cmJfYXVkaW9faGVhZCkgewogCQlwZWFzeWNhcC0+YXVkaW9faXNvY19zdHJlYW1pbmcgPSAwOwotCQlKT1QoNCwgImtpbGxpbmcgYXVkaW8gdXJic1xuIik7CisJCUpPTSg0LCAia2lsbGluZyBhdWRpbyB1cmJzXG4iKTsKIAkJbSA9IDA7CiAJCWxpc3RfZm9yX2VhY2gocGxpc3RfaGVhZCwgKHBlYXN5Y2FwLT5wdXJiX2F1ZGlvX2hlYWQpKSB7CiAJCQlwZGF0YV91cmIgPSBsaXN0X2VudHJ5KHBsaXN0X2hlYWQsIHN0cnVjdCBkYXRhX3VyYiwKQEAgLTEwMzIsMTMgKzEyMTksMTMgQEAKIAkJCQl9CiAJCQl9CiAJCX0KLQkJSk9UKDQsICIlaSBhdWRpbyB1cmJzIGtpbGxlZFxuIiwgbSk7CisJCUpPTSg0LCAiJWkgYXVkaW8gdXJicyBraWxsZWRcbiIsIG0pOwogCX0gZWxzZSB7Ci0JCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT5wdXJiX2F1ZGlvX2hlYWQgaXMgTlVMTFxuIik7CisJCVNBTSgiRVJST1I6IHBlYXN5Y2FwLT5wdXJiX2F1ZGlvX2hlYWQgaXMgTlVMTFxuIik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIH0gZWxzZSB7Ci0JSk9UKDgsICIlaT1hdWRpb19pc29jX3N0cmVhbWluZywgbm8gYXVkaW8gdXJicyBraWxsZWRcbiIsIFwKKwlKT00oOCwgIiVpPWF1ZGlvX2lzb2Nfc3RyZWFtaW5nLCBubyBhdWRpbyB1cmJzIGtpbGxlZFxuIiwgXAogCQkJCQlwZWFzeWNhcC0+YXVkaW9faXNvY19zdHJlYW1pbmcpOwogfQogcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX3Rlc3RjYXJkLmMgYi9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX3Rlc3RjYXJkLmMKaW5kZXggM2MyY2UyOC4uZTI3ZGZlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF90ZXN0Y2FyZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfdGVzdGNhcmQuYwpAQCAtMjksMzcgKzI5LDY5IEBACiAjaW5jbHVkZSAiZWFzeWNhcF9kZWJ1Zy5oIgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFRFU1RDQVJEX0JZVEVTUEVSTElORSAoMiAqIDE0NDApCisjZGVmaW5lIFRFU1RDQVJEX0JZVEVTUEVSTElORSAoMiAqIDcyMCkKIHZvaWQKLWVhc3ljYXBfdGVzdGNhcmQoc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwLCBpbnQgZmllbGRfZmlsbCkKK2Vhc3ljYXBfdGVzdGNhcmQoc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwLCBpbnQgZmllbGQpCiB7CiBpbnQgdG90YWw7CiBpbnQgeSwgdSwgdiwgciwgZywgYjsKIHVuc2lnbmVkIGNoYXIgdXl2eVs0XTsKLQotaW50IGkxLCBsaW5lLCBrLCBtLCBuLCBtb3JlLCBtdWNoLCBiYXJ3aWR0aDsKK2ludCBpMSwgbGluZSwgaywgbSwgbiwgbW9yZSwgbXVjaCwgYmFyd2lkdGgsIGJhcmhlaWdodDsKIHVuc2lnbmVkIGNoYXIgYmZiYXJbVEVTVENBUkRfQllURVNQRVJMSU5FIC8gOF0sICpwMSwgKnAyOwogc3RydWN0IGRhdGFfYnVmZmVyICpwZmllbGRfYnVmZmVyOwogCi1KT1QoOCwgIiVpPWZpZWxkX2ZpbGxcbiIsIGZpZWxkX2ZpbGwpOwotCi1pZiAoKFRFU1RDQVJEX0JZVEVTUEVSTElORSAvIDIpIDwgcGVhc3ljYXAtPndpZHRoKSB7Ci0JU0FZKCJFUlJPUjogaW1hZ2UgaXMgdG9vIHdpZGVcbiIpOworaWYgKE5VTEwgPT0gcGVhc3ljYXApIHsKKwlTQVkoIkVSUk9SOiBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKIAlyZXR1cm47CiB9Ci1pZiAocGVhc3ljYXAtPndpZHRoICUgMTYpIHsKLQlTQVkoIkVSUk9SOiBpbmRpdmlzaWJsZSBpbWFnZSB3aWR0aFxuIik7CitKT00oOCwgIiVpPWZpZWxkXG4iLCBmaWVsZCk7Citzd2l0Y2ggKHBlYXN5Y2FwLT53aWR0aCkgeworY2FzZSA3MjA6CitjYXNlIDM2MDogeworCWJhcndpZHRoID0gKDIgKiA3MjApIC8gODsKKwlicmVhazsKK30KK2Nhc2UgNzA0OgorY2FzZSAzNTI6IHsKKwliYXJ3aWR0aCA9ICgyICogNzA0KSAvIDg7CisJYnJlYWs7Cit9CitjYXNlIDY0MDoKK2Nhc2UgMzIwOiB7CisJYmFyd2lkdGggPSAoMiAqIDY0MCkgLyA4OworCWJyZWFrOworfQorZGVmYXVsdDogeworCVNBTSgiRVJST1I6ICBjYW5ub3Qgc2V0IGJhcndpZHRoXG4iKTsKIAlyZXR1cm47CiB9Ci0KK30KK2lmIChURVNUQ0FSRF9CWVRFU1BFUkxJTkUgPCBiYXJ3aWR0aCkgeworCVNBTSgiRVJST1I6IGJhcndpZHRoIGlzIHRvbyBsYXJnZVxuIik7CisJcmV0dXJuOworfQorc3dpdGNoIChwZWFzeWNhcC0+aGVpZ2h0KSB7CitjYXNlIDU3NjoKK2Nhc2UgMjg4OiB7CisJYmFyaGVpZ2h0ID0gNTc2OworCWJyZWFrOworfQorY2FzZSA0ODA6CitjYXNlIDI0MDogeworCWJhcmhlaWdodCA9IDQ4MDsKKwlicmVhazsKK30KK2RlZmF1bHQ6IHsKKwlTQU0oIkVSUk9SOiBjYW5ub3Qgc2V0IGJhcmhlaWdodFxuIik7CisJcmV0dXJuOworfQorfQogdG90YWwgPSAwOwotYmFyd2lkdGggPSAoMiAqIHBlYXN5Y2FwLT53aWR0aCkgLyA4OwotCi1rID0gZmllbGRfZmlsbDsKK2sgPSBmaWVsZDsKIG0gPSAwOwogbiA9IDA7CiAKLWZvciAobGluZSA9IDA7ICBsaW5lIDwgKHBlYXN5Y2FwLT5oZWlnaHQgLyAyKTsgIGxpbmUrKykgeworZm9yIChsaW5lID0gMDsgIGxpbmUgPCAoYmFyaGVpZ2h0IC8gMik7ICBsaW5lKyspIHsKIAlmb3IgKGkxID0gMDsgIGkxIDwgODsgIGkxKyspIHsKIAkJciA9IChpMSAqIDI1NikvODsKIAkJZyA9IChpMSAqIDI1NikvODsKQEAgLTg4LDE1ICsxMjAsMTUgQEAKIAogCQl3aGlsZSAobW9yZSkgewogCQkJaWYgKChGSUVMRF9CVUZGRVJfU0laRS9QQUdFX1NJWkUpIDw9IG0pIHsKLQkJCQlTQVkoIkVSUk9SOiAgYmFkIG0gcmVhY2hlZFxuIik7CisJCQkJU0FNKCJFUlJPUjogIGJhZCBtIHJlYWNoZWRcbiIpOwogCQkJCXJldHVybjsKIAkJCX0KIAkJaWYgKFBBR0VfU0laRSA8IG4pIHsKLQkJCVNBWSgiRVJST1I6ICBiYWQgbiByZWFjaGVkXG4iKTsgcmV0dXJuOworCQkJU0FNKCJFUlJPUjogIGJhZCBuIHJlYWNoZWRcbiIpOyByZXR1cm47CiAJCX0KIAogCQlpZiAoMCA+IG1vcmUpIHsKLQkJCVNBWSgiRVJST1I6ICBpbnRlcm5hbCBmYXVsdFxuIik7CisJCQlTQU0oIkVSUk9SOiAgaW50ZXJuYWwgZmF1bHRcbiIpOwogCQkJcmV0dXJuOwogCQl9CiAKQEAgLTExNywxMCArMTQ5LDYgQEAKIAkJfQogCX0KIH0KLQotSk9UKDgsICIlaT10b3RhbFxuIiwgdG90YWwpOwotaWYgKHRvdGFsICE9IHBlYXN5Y2FwLT53aWR0aCAqIHBlYXN5Y2FwLT5oZWlnaHQpCi0JU0FZKCJFUlJPUjogd3JvbmcgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW46ICAlaVxuIiwgdG90YWwpOwogcmV0dXJuOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTU3LDM1ICsxODUsMzUgQEAKIAkJcHJpbnRmKCIlNmksICIsIGkyKTsgIHByaW50ZigiJTZpXG59O1xuIiwgaTIpOwogCQl9CiAJfQotcmV0dXJuKDApOworcmV0dXJuIDA7CiB9CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBpbnQgdG9uZXNbMjA0OF0gPSB7Ci0gICAgIDAsICAgICAwLCAgIDUwMiwgICA1MDIsICAxMDA0LCAgMTAwNCwgIDE1MDUsICAxNTA1LCAgMjAwNSwgIDIwMDUsCi0gIDI1MDMsICAyNTAzLCAgMjk5OCwgIDI5OTgsICAzNDkxLCAgMzQ5MSwgIDM5ODAsICAzOTgwLCAgNDQ2NiwgIDQ0NjYsCi0gIDQ5NDgsICA0OTQ4LCAgNTQyNCwgIDU0MjQsICA1ODk2LCAgNTg5NiwgIDYzNjIsICA2MzYyLCAgNjgyMiwgIDY4MjIsCi0gIDcyNzYsICA3Mjc2LCAgNzcyMywgIDc3MjMsICA4MTYyLCAgODE2MiwgIDg1OTQsICA4NTk0LCAgOTAxOCwgIDkwMTgsCi0gIDk0MzQsICA5NDM0LCAgOTg0MCwgIDk4NDAsIDEwMjM3LCAxMDIzNywgMTA2MjUsIDEwNjI1LCAxMTAwMiwgMTEwMDIsCi0gMTEzNzAsIDExMzcwLCAxMTcyNiwgMTE3MjYsIDEyMDcyLCAxMjA3MiwgMTI0MDYsIDEyNDA2LCAxMjcyOCwgMTI3MjgsCi0gMTMwMzgsIDEzMDM4LCAxMzMzNywgMTMzMzcsIDEzNjIyLCAxMzYyMiwgMTM4OTUsIDEzODk1LCAxNDE1NSwgMTQxNTUsCi0gMTQ0MDEsIDE0NDAxLCAxNDYzNCwgMTQ2MzQsIDE0ODUzLCAxNDg1MywgMTUwNTgsIDE1MDU4LCAxNTI0OSwgMTUyNDksCi0gMTU0MjYsIDE1NDI2LCAxNTU4OCwgMTU1ODgsIDE1NzM1LCAxNTczNSwgMTU4NjgsIDE1ODY4LCAxNTk4NSwgMTU5ODUsCi0gMTYwODgsIDE2MDg4LCAxNjE3NSwgMTYxNzUsIDE2MjQ4LCAxNjI0OCwgMTYzMDUsIDE2MzA1LCAxNjM0NiwgMTYzNDYsCi0gMTYzNzIsIDE2MzcyLCAxNjM4MywgMTYzODMsIDE2Mzc5LCAxNjM3OSwgMTYzNTksIDE2MzU5LCAxNjMyMywgMTYzMjMsCi0gMTYyNzIsIDE2MjcyLCAxNjIwNiwgMTYyMDYsIDE2MTI1LCAxNjEyNSwgMTYwMjgsIDE2MDI4LCAxNTkxNywgMTU5MTcsCi0gMTU3OTAsIDE1NzkwLCAxNTY0OSwgMTU2NDksIDE1NDkyLCAxNTQ5MiwgMTUzMjIsIDE1MzIyLCAxNTEzNiwgMTUxMzYsCi0gMTQ5MzcsIDE0OTM3LCAxNDcyMywgMTQ3MjMsIDE0NDk2LCAxNDQ5NiwgMTQyNTUsIDE0MjU1LCAxNDAwMSwgMTQwMDEsCi0gMTM3MzMsIDEzNzMzLCAxMzQ1MiwgMTM0NTIsIDEzMTU5LCAxMzE1OSwgMTI4NTQsIDEyODU0LCAxMjUzNiwgMTI1MzYsCi0gMTIyMDcsIDEyMjA3LCAxMTg2NiwgMTE4NjYsIDExNTEzLCAxMTUxMywgMTExNTAsIDExMTUwLCAxMDc3NywgMTA3NzcsCi0gMTAzOTMsIDEwMzkzLCAxMDAwMCwgMTAwMDAsICA5NTk3LCAgOTU5NywgIDkxODUsICA5MTg1LCAgODc2NSwgIDg3NjUsCi0gIDgzMzYsICA4MzM2LCAgNzkwMCwgIDc5MDAsICA3NDU2LCAgNzQ1NiwgIDcwMDUsICA3MDA1LCAgNjU0NywgIDY1NDcsCi0gIDYwODMsICA2MDgzLCAgNTYxNCwgIDU2MTQsICA1MTM5LCAgNTEzOSwgIDQ2NTksICA0NjU5LCAgNDE3NSwgIDQxNzUsCi0gIDM2ODcsICAzNjg3LCAgMzE5NiwgIDMxOTYsICAyNzAxLCAgMjcwMSwgIDIyMDQsICAyMjA0LCAgMTcwNSwgIDE3MDUsCi0gIDEyMDUsICAxMjA1LCAgIDcwMywgICA3MDMsICAgMjAxLCAgIDIwMSwgIC0zMDEsICAtMzAxLCAgLTgwMywgIC04MDMsCi0gLTEzMDUsIC0xMzA1LCAtMTgwNSwgLTE4MDUsIC0yMzA0LCAtMjMwNCwgLTI4MDEsIC0yODAxLCAtMzI5NCwgLTMyOTQsCi0gLTM3ODUsIC0zNzg1LCAtNDI3MiwgLTQyNzIsIC00NzU2LCAtNDc1NiwgLTUyMzQsIC01MjM0LCAtNTcwOCwgLTU3MDgsCi0gLTYxNzYsIC02MTc2LCAtNjYzOSwgLTY2MzksIC03MDk1LCAtNzA5NSwgLTc1NDUsIC03NTQ1LCAtNzk4OCwgLTc5ODgsCi0gLTg0MjMsIC04NDIzLCAtODg1MCwgLTg4NTAsIC05MjY4LCAtOTI2OCwgLTk2NzksIC05Njc5LCAtMTAwNzksIC0xMDA3OSwKKzAsICAgICAwLCAgIDUwMiwgICA1MDIsICAxMDA0LCAgMTAwNCwgIDE1MDUsICAxNTA1LCAgMjAwNSwgIDIwMDUsCisyNTAzLCAgMjUwMywgIDI5OTgsICAyOTk4LCAgMzQ5MSwgIDM0OTEsICAzOTgwLCAgMzk4MCwgIDQ0NjYsICA0NDY2LAorNDk0OCwgIDQ5NDgsICA1NDI0LCAgNTQyNCwgIDU4OTYsICA1ODk2LCAgNjM2MiwgIDYzNjIsICA2ODIyLCAgNjgyMiwKKzcyNzYsICA3Mjc2LCAgNzcyMywgIDc3MjMsICA4MTYyLCAgODE2MiwgIDg1OTQsICA4NTk0LCAgOTAxOCwgIDkwMTgsCis5NDM0LCAgOTQzNCwgIDk4NDAsICA5ODQwLCAxMDIzNywgMTAyMzcsIDEwNjI1LCAxMDYyNSwgMTEwMDIsIDExMDAyLAorMTEzNzAsIDExMzcwLCAxMTcyNiwgMTE3MjYsIDEyMDcyLCAxMjA3MiwgMTI0MDYsIDEyNDA2LCAxMjcyOCwgMTI3MjgsCisxMzAzOCwgMTMwMzgsIDEzMzM3LCAxMzMzNywgMTM2MjIsIDEzNjIyLCAxMzg5NSwgMTM4OTUsIDE0MTU1LCAxNDE1NSwKKzE0NDAxLCAxNDQwMSwgMTQ2MzQsIDE0NjM0LCAxNDg1MywgMTQ4NTMsIDE1MDU4LCAxNTA1OCwgMTUyNDksIDE1MjQ5LAorMTU0MjYsIDE1NDI2LCAxNTU4OCwgMTU1ODgsIDE1NzM1LCAxNTczNSwgMTU4NjgsIDE1ODY4LCAxNTk4NSwgMTU5ODUsCisxNjA4OCwgMTYwODgsIDE2MTc1LCAxNjE3NSwgMTYyNDgsIDE2MjQ4LCAxNjMwNSwgMTYzMDUsIDE2MzQ2LCAxNjM0NiwKKzE2MzcyLCAxNjM3MiwgMTYzODMsIDE2MzgzLCAxNjM3OSwgMTYzNzksIDE2MzU5LCAxNjM1OSwgMTYzMjMsIDE2MzIzLAorMTYyNzIsIDE2MjcyLCAxNjIwNiwgMTYyMDYsIDE2MTI1LCAxNjEyNSwgMTYwMjgsIDE2MDI4LCAxNTkxNywgMTU5MTcsCisxNTc5MCwgMTU3OTAsIDE1NjQ5LCAxNTY0OSwgMTU0OTIsIDE1NDkyLCAxNTMyMiwgMTUzMjIsIDE1MTM2LCAxNTEzNiwKKzE0OTM3LCAxNDkzNywgMTQ3MjMsIDE0NzIzLCAxNDQ5NiwgMTQ0OTYsIDE0MjU1LCAxNDI1NSwgMTQwMDEsIDE0MDAxLAorMTM3MzMsIDEzNzMzLCAxMzQ1MiwgMTM0NTIsIDEzMTU5LCAxMzE1OSwgMTI4NTQsIDEyODU0LCAxMjUzNiwgMTI1MzYsCisxMjIwNywgMTIyMDcsIDExODY2LCAxMTg2NiwgMTE1MTMsIDExNTEzLCAxMTE1MCwgMTExNTAsIDEwNzc3LCAxMDc3NywKKzEwMzkzLCAxMDM5MywgMTAwMDAsIDEwMDAwLCAgOTU5NywgIDk1OTcsICA5MTg1LCAgOTE4NSwgIDg3NjUsICA4NzY1LAorODMzNiwgIDgzMzYsICA3OTAwLCAgNzkwMCwgIDc0NTYsICA3NDU2LCAgNzAwNSwgIDcwMDUsICA2NTQ3LCAgNjU0NywKKzYwODMsICA2MDgzLCAgNTYxNCwgIDU2MTQsICA1MTM5LCAgNTEzOSwgIDQ2NTksICA0NjU5LCAgNDE3NSwgIDQxNzUsCiszNjg3LCAgMzY4NywgIDMxOTYsICAzMTk2LCAgMjcwMSwgIDI3MDEsICAyMjA0LCAgMjIwNCwgIDE3MDUsICAxNzA1LAorMTIwNSwgIDEyMDUsICAgNzAzLCAgIDcwMywgICAyMDEsICAgMjAxLCAgLTMwMSwgIC0zMDEsICAtODAzLCAgLTgwMywKKy0xMzA1LCAtMTMwNSwgLTE4MDUsIC0xODA1LCAtMjMwNCwgLTIzMDQsIC0yODAxLCAtMjgwMSwgLTMyOTQsIC0zMjk0LAorLTM3ODUsIC0zNzg1LCAtNDI3MiwgLTQyNzIsIC00NzU2LCAtNDc1NiwgLTUyMzQsIC01MjM0LCAtNTcwOCwgLTU3MDgsCistNjE3NiwgLTYxNzYsIC02NjM5LCAtNjYzOSwgLTcwOTUsIC03MDk1LCAtNzU0NSwgLTc1NDUsIC03OTg4LCAtNzk4OCwKKy04NDIzLCAtODQyMywgLTg4NTAsIC04ODUwLCAtOTI2OCwgLTkyNjgsIC05Njc5LCAtOTY3OSwgLTEwMDc5LCAtMTAwNzksCiAtMTA0NzEsIC0xMDQ3MSwgLTEwODUzLCAtMTA4NTMsIC0xMTIyNCwgLTExMjI0LCAtMTE1ODUsIC0xMTU4NSwgLTExOTM1LCAtMTE5MzUsCiAtMTIyNzMsIC0xMjI3MywgLTEyNjAwLCAtMTI2MDAsIC0xMjkxNiwgLTEyOTE2LCAtMTMyMTksIC0xMzIxOSwgLTEzNTEwLCAtMTM1MTAsCiAtMTM3ODgsIC0xMzc4OCwgLTE0MDUzLCAtMTQwNTMsIC0xNDMwNCwgLTE0MzA0LCAtMTQ1NDMsIC0xNDU0MywgLTE0NzY3LCAtMTQ3NjcsCkBAIC0xOTgsMzUgKzIyNiwzNSBAQAogLTE0MzUzLCAtMTQzNTMsIC0xNDEwNCwgLTE0MTA0LCAtMTM4NDIsIC0xMzg0MiwgLTEzNTY2LCAtMTM1NjYsIC0xMzI3OCwgLTEzMjc4LAogLTEyOTc3LCAtMTI5NzcsIC0xMjY2NSwgLTEyNjY1LCAtMTIzNDAsIC0xMjM0MCwgLTEyMDAzLCAtMTIwMDMsIC0xMTY1NiwgLTExNjU2LAogLTExMjk3LCAtMTEyOTcsIC0xMDkyOCwgLTEwOTI4LCAtMTA1NDgsIC0xMDU0OCwgLTEwMTU5LCAtMTAxNTksIC05NzU5LCAtOTc1OSwKLSAtOTM1MSwgLTkzNTEsIC04OTM0LCAtODkzNCwgLTg1MDksIC04NTA5LCAtODA3NSwgLTgwNzUsIC03NjM0LCAtNzYzNCwKLSAtNzE4NiwgLTcxODYsIC02NzMxLCAtNjczMSwgLTYyNjksIC02MjY5LCAtNTgwMiwgLTU4MDIsIC01MzI5LCAtNTMyOSwKLSAtNDg1MiwgLTQ4NTIsIC00MzY5LCAtNDM2OSwgLTM4ODMsIC0zODgzLCAtMzM5MywgLTMzOTMsIC0yOTAwLCAtMjkwMCwKLSAtMjQwNCwgLTI0MDQsIC0xOTA1LCAtMTkwNSwgLTE0MDUsIC0xNDA1LCAgLTkwNCwgIC05MDQsICAtNDAyLCAgLTQwMiwKLSAgIDEwMCwgICAxMDAsICAgNjAzLCAgIDYwMywgIDExMDUsICAxMTA1LCAgMTYwNSwgIDE2MDUsICAyMTA1LCAgMjEwNSwKLSAgMjYwMiwgIDI2MDIsICAzMDk3LCAgMzA5NywgIDM1ODksICAzNTg5LCAgNDA3OCwgIDQwNzgsICA0NTYzLCAgNDU2MywKLSAgNTA0MywgIDUwNDMsICA1NTE5LCAgNTUxOSwgIDU5OTAsICA1OTkwLCAgNjQ1NSwgIDY0NTUsICA2OTE0LCAgNjkxNCwKLSAgNzM2NiwgIDczNjYsICA3ODExLCAgNzgxMSwgIDgyNDksICA4MjQ5LCAgODY4MCwgIDg2ODAsICA5MTAyLCAgOTEwMiwKLSAgOTUxNiwgIDk1MTYsICA5OTIwLCAgOTkyMCwgMTAzMTUsIDEwMzE1LCAxMDcwMSwgMTA3MDEsIDExMDc3LCAxMTA3NywKLSAxMTQ0MiwgMTE0NDIsIDExNzk2LCAxMTc5NiwgMTIxMzksIDEyMTM5LCAxMjQ3MSwgMTI0NzEsIDEyNzkxLCAxMjc5MSwKLSAxMzA5OSwgMTMwOTksIDEzMzk1LCAxMzM5NSwgMTM2NzgsIDEzNjc4LCAxMzk0OCwgMTM5NDgsIDE0MjA1LCAxNDIwNSwKLSAxNDQ0OSwgMTQ0NDksIDE0Njc5LCAxNDY3OSwgMTQ4OTUsIDE0ODk1LCAxNTA5OCwgMTUwOTgsIDE1Mjg2LCAxNTI4NiwKLSAxNTQ1OSwgMTU0NTksIDE1NjE4LCAxNTYxOCwgMTU3NjMsIDE1NzYzLCAxNTg5MiwgMTU4OTIsIDE2MDA3LCAxNjAwNywKLSAxNjEwNywgMTYxMDcsIDE2MTkxLCAxNjE5MSwgMTYyNjAsIDE2MjYwLCAxNjMxNCwgMTYzMTQsIDE2MzUzLCAxNjM1MywKLSAxNjM3NiwgMTYzNzYsIDE2Mzg0LCAxNjM4NCwgMTYzNzYsIDE2Mzc2LCAxNjM1MywgMTYzNTMsIDE2MzE0LCAxNjMxNCwKLSAxNjI2MCwgMTYyNjAsIDE2MTkxLCAxNjE5MSwgMTYxMDcsIDE2MTA3LCAxNjAwNywgMTYwMDcsIDE1ODkyLCAxNTg5MiwKLSAxNTc2MywgMTU3NjMsIDE1NjE4LCAxNTYxOCwgMTU0NTksIDE1NDU5LCAxNTI4NiwgMTUyODYsIDE1MDk4LCAxNTA5OCwKLSAxNDg5NSwgMTQ4OTUsIDE0Njc5LCAxNDY3OSwgMTQ0NDksIDE0NDQ5LCAxNDIwNSwgMTQyMDUsIDEzOTQ4LCAxMzk0OCwKLSAxMzY3OCwgMTM2NzgsIDEzMzk1LCAxMzM5NSwgMTMwOTksIDEzMDk5LCAxMjc5MSwgMTI3OTEsIDEyNDcxLCAxMjQ3MSwKLSAxMjEzOSwgMTIxMzksIDExNzk2LCAxMTc5NiwgMTE0NDIsIDExNDQyLCAxMTA3NywgMTEwNzcsIDEwNzAxLCAxMDcwMSwKLSAxMDMxNSwgMTAzMTUsICA5OTIwLCAgOTkyMCwgIDk1MTYsICA5NTE2LCAgOTEwMiwgIDkxMDIsICA4NjgwLCAgODY4MCwKLSAgODI0OSwgIDgyNDksICA3ODExLCAgNzgxMSwgIDczNjYsICA3MzY2LCAgNjkxNCwgIDY5MTQsICA2NDU1LCAgNjQ1NSwKLSAgNTk5MCwgIDU5OTAsICA1NTE5LCAgNTUxOSwgIDUwNDMsICA1MDQzLCAgNDU2MywgIDQ1NjMsICA0MDc4LCAgNDA3OCwKLSAgMzU4OSwgIDM1ODksICAzMDk3LCAgMzA5NywgIDI2MDIsICAyNjAyLCAgMjEwNSwgIDIxMDUsICAxNjA1LCAgMTYwNSwKLSAgMTEwNSwgIDExMDUsICAgNjAzLCAgIDYwMywgICAxMDAsICAgMTAwLCAgLTQwMiwgIC00MDIsICAtOTA0LCAgLTkwNCwKLSAtMTQwNSwgLTE0MDUsIC0xOTA1LCAtMTkwNSwgLTI0MDQsIC0yNDA0LCAtMjkwMCwgLTI5MDAsIC0zMzkzLCAtMzM5MywKLSAtMzg4MywgLTM4ODMsIC00MzY5LCAtNDM2OSwgLTQ4NTIsIC00ODUyLCAtNTMyOSwgLTUzMjksIC01ODAyLCAtNTgwMiwKLSAtNjI2OSwgLTYyNjksIC02NzMxLCAtNjczMSwgLTcxODYsIC03MTg2LCAtNzYzNCwgLTc2MzQsIC04MDc1LCAtODA3NSwKLSAtODUwOSwgLTg1MDksIC04OTM0LCAtODkzNCwgLTkzNTEsIC05MzUxLCAtOTc1OSwgLTk3NTksIC0xMDE1OSwgLTEwMTU5LAorLTkzNTEsIC05MzUxLCAtODkzNCwgLTg5MzQsIC04NTA5LCAtODUwOSwgLTgwNzUsIC04MDc1LCAtNzYzNCwgLTc2MzQsCistNzE4NiwgLTcxODYsIC02NzMxLCAtNjczMSwgLTYyNjksIC02MjY5LCAtNTgwMiwgLTU4MDIsIC01MzI5LCAtNTMyOSwKKy00ODUyLCAtNDg1MiwgLTQzNjksIC00MzY5LCAtMzg4MywgLTM4ODMsIC0zMzkzLCAtMzM5MywgLTI5MDAsIC0yOTAwLAorLTI0MDQsIC0yNDA0LCAtMTkwNSwgLTE5MDUsIC0xNDA1LCAtMTQwNSwgIC05MDQsICAtOTA0LCAgLTQwMiwgIC00MDIsCisxMDAsICAgMTAwLCAgIDYwMywgICA2MDMsICAxMTA1LCAgMTEwNSwgIDE2MDUsICAxNjA1LCAgMjEwNSwgIDIxMDUsCisyNjAyLCAgMjYwMiwgIDMwOTcsICAzMDk3LCAgMzU4OSwgIDM1ODksICA0MDc4LCAgNDA3OCwgIDQ1NjMsICA0NTYzLAorNTA0MywgIDUwNDMsICA1NTE5LCAgNTUxOSwgIDU5OTAsICA1OTkwLCAgNjQ1NSwgIDY0NTUsICA2OTE0LCAgNjkxNCwKKzczNjYsICA3MzY2LCAgNzgxMSwgIDc4MTEsICA4MjQ5LCAgODI0OSwgIDg2ODAsICA4NjgwLCAgOTEwMiwgIDkxMDIsCis5NTE2LCAgOTUxNiwgIDk5MjAsICA5OTIwLCAxMDMxNSwgMTAzMTUsIDEwNzAxLCAxMDcwMSwgMTEwNzcsIDExMDc3LAorMTE0NDIsIDExNDQyLCAxMTc5NiwgMTE3OTYsIDEyMTM5LCAxMjEzOSwgMTI0NzEsIDEyNDcxLCAxMjc5MSwgMTI3OTEsCisxMzA5OSwgMTMwOTksIDEzMzk1LCAxMzM5NSwgMTM2NzgsIDEzNjc4LCAxMzk0OCwgMTM5NDgsIDE0MjA1LCAxNDIwNSwKKzE0NDQ5LCAxNDQ0OSwgMTQ2NzksIDE0Njc5LCAxNDg5NSwgMTQ4OTUsIDE1MDk4LCAxNTA5OCwgMTUyODYsIDE1Mjg2LAorMTU0NTksIDE1NDU5LCAxNTYxOCwgMTU2MTgsIDE1NzYzLCAxNTc2MywgMTU4OTIsIDE1ODkyLCAxNjAwNywgMTYwMDcsCisxNjEwNywgMTYxMDcsIDE2MTkxLCAxNjE5MSwgMTYyNjAsIDE2MjYwLCAxNjMxNCwgMTYzMTQsIDE2MzUzLCAxNjM1MywKKzE2Mzc2LCAxNjM3NiwgMTYzODQsIDE2Mzg0LCAxNjM3NiwgMTYzNzYsIDE2MzUzLCAxNjM1MywgMTYzMTQsIDE2MzE0LAorMTYyNjAsIDE2MjYwLCAxNjE5MSwgMTYxOTEsIDE2MTA3LCAxNjEwNywgMTYwMDcsIDE2MDA3LCAxNTg5MiwgMTU4OTIsCisxNTc2MywgMTU3NjMsIDE1NjE4LCAxNTYxOCwgMTU0NTksIDE1NDU5LCAxNTI4NiwgMTUyODYsIDE1MDk4LCAxNTA5OCwKKzE0ODk1LCAxNDg5NSwgMTQ2NzksIDE0Njc5LCAxNDQ0OSwgMTQ0NDksIDE0MjA1LCAxNDIwNSwgMTM5NDgsIDEzOTQ4LAorMTM2NzgsIDEzNjc4LCAxMzM5NSwgMTMzOTUsIDEzMDk5LCAxMzA5OSwgMTI3OTEsIDEyNzkxLCAxMjQ3MSwgMTI0NzEsCisxMjEzOSwgMTIxMzksIDExNzk2LCAxMTc5NiwgMTE0NDIsIDExNDQyLCAxMTA3NywgMTEwNzcsIDEwNzAxLCAxMDcwMSwKKzEwMzE1LCAxMDMxNSwgIDk5MjAsICA5OTIwLCAgOTUxNiwgIDk1MTYsICA5MTAyLCAgOTEwMiwgIDg2ODAsICA4NjgwLAorODI0OSwgIDgyNDksICA3ODExLCAgNzgxMSwgIDczNjYsICA3MzY2LCAgNjkxNCwgIDY5MTQsICA2NDU1LCAgNjQ1NSwKKzU5OTAsICA1OTkwLCAgNTUxOSwgIDU1MTksICA1MDQzLCAgNTA0MywgIDQ1NjMsICA0NTYzLCAgNDA3OCwgIDQwNzgsCiszNTg5LCAgMzU4OSwgIDMwOTcsICAzMDk3LCAgMjYwMiwgIDI2MDIsICAyMTA1LCAgMjEwNSwgIDE2MDUsICAxNjA1LAorMTEwNSwgIDExMDUsICAgNjAzLCAgIDYwMywgICAxMDAsICAgMTAwLCAgLTQwMiwgIC00MDIsICAtOTA0LCAgLTkwNCwKKy0xNDA1LCAtMTQwNSwgLTE5MDUsIC0xOTA1LCAtMjQwNCwgLTI0MDQsIC0yOTAwLCAtMjkwMCwgLTMzOTMsIC0zMzkzLAorLTM4ODMsIC0zODgzLCAtNDM2OSwgLTQzNjksIC00ODUyLCAtNDg1MiwgLTUzMjksIC01MzI5LCAtNTgwMiwgLTU4MDIsCistNjI2OSwgLTYyNjksIC02NzMxLCAtNjczMSwgLTcxODYsIC03MTg2LCAtNzYzNCwgLTc2MzQsIC04MDc1LCAtODA3NSwKKy04NTA5LCAtODUwOSwgLTg5MzQsIC04OTM0LCAtOTM1MSwgLTkzNTEsIC05NzU5LCAtOTc1OSwgLTEwMTU5LCAtMTAxNTksCiAtMTA1NDgsIC0xMDU0OCwgLTEwOTI4LCAtMTA5MjgsIC0xMTI5NywgLTExMjk3LCAtMTE2NTYsIC0xMTY1NiwgLTEyMDAzLCAtMTIwMDMsCiAtMTIzNDAsIC0xMjM0MCwgLTEyNjY1LCAtMTI2NjUsIC0xMjk3NywgLTEyOTc3LCAtMTMyNzgsIC0xMzI3OCwgLTEzNTY2LCAtMTM1NjYsCiAtMTM4NDIsIC0xMzg0MiwgLTE0MTA0LCAtMTQxMDQsIC0xNDM1MywgLTE0MzUzLCAtMTQ1ODksIC0xNDU4OSwgLTE0ODEwLCAtMTQ4MTAsCkBAIC0yMzksMzUgKzI2NywzNSBAQAogLTE0MzA0LCAtMTQzMDQsIC0xNDA1MywgLTE0MDUzLCAtMTM3ODgsIC0xMzc4OCwgLTEzNTEwLCAtMTM1MTAsIC0xMzIxOSwgLTEzMjE5LAogLTEyOTE2LCAtMTI5MTYsIC0xMjYwMCwgLTEyNjAwLCAtMTIyNzMsIC0xMjI3MywgLTExOTM1LCAtMTE5MzUsIC0xMTU4NSwgLTExNTg1LAogLTExMjI0LCAtMTEyMjQsIC0xMDg1MywgLTEwODUzLCAtMTA0NzEsIC0xMDQ3MSwgLTEwMDc5LCAtMTAwNzksIC05Njc5LCAtOTY3OSwKLSAtOTI2OCwgLTkyNjgsIC04ODUwLCAtODg1MCwgLTg0MjMsIC04NDIzLCAtNzk4OCwgLTc5ODgsIC03NTQ1LCAtNzU0NSwKLSAtNzA5NSwgLTcwOTUsIC02NjM5LCAtNjYzOSwgLTYxNzYsIC02MTc2LCAtNTcwOCwgLTU3MDgsIC01MjM0LCAtNTIzNCwKLSAtNDc1NiwgLTQ3NTYsIC00MjcyLCAtNDI3MiwgLTM3ODUsIC0zNzg1LCAtMzI5NCwgLTMyOTQsIC0yODAxLCAtMjgwMSwKLSAtMjMwNCwgLTIzMDQsIC0xODA1LCAtMTgwNSwgLTEzMDUsIC0xMzA1LCAgLTgwMywgIC04MDMsICAtMzAxLCAgLTMwMSwKLSAgIDIwMSwgICAyMDEsICAgNzAzLCAgIDcwMywgIDEyMDUsICAxMjA1LCAgMTcwNSwgIDE3MDUsICAyMjA0LCAgMjIwNCwKLSAgMjcwMSwgIDI3MDEsICAzMTk2LCAgMzE5NiwgIDM2ODcsICAzNjg3LCAgNDE3NSwgIDQxNzUsICA0NjU5LCAgNDY1OSwKLSAgNTEzOSwgIDUxMzksICA1NjE0LCAgNTYxNCwgIDYwODMsICA2MDgzLCAgNjU0NywgIDY1NDcsICA3MDA1LCAgNzAwNSwKLSAgNzQ1NiwgIDc0NTYsICA3OTAwLCAgNzkwMCwgIDgzMzYsICA4MzM2LCAgODc2NSwgIDg3NjUsICA5MTg1LCAgOTE4NSwKLSAgOTU5NywgIDk1OTcsIDEwMDAwLCAxMDAwMCwgMTAzOTMsIDEwMzkzLCAxMDc3NywgMTA3NzcsIDExMTUwLCAxMTE1MCwKLSAxMTUxMywgMTE1MTMsIDExODY2LCAxMTg2NiwgMTIyMDcsIDEyMjA3LCAxMjUzNiwgMTI1MzYsIDEyODU0LCAxMjg1NCwKLSAxMzE1OSwgMTMxNTksIDEzNDUyLCAxMzQ1MiwgMTM3MzMsIDEzNzMzLCAxNDAwMSwgMTQwMDEsIDE0MjU1LCAxNDI1NSwKLSAxNDQ5NiwgMTQ0OTYsIDE0NzIzLCAxNDcyMywgMTQ5MzcsIDE0OTM3LCAxNTEzNiwgMTUxMzYsIDE1MzIyLCAxNTMyMiwKLSAxNTQ5MiwgMTU0OTIsIDE1NjQ5LCAxNTY0OSwgMTU3OTAsIDE1NzkwLCAxNTkxNywgMTU5MTcsIDE2MDI4LCAxNjAyOCwKLSAxNjEyNSwgMTYxMjUsIDE2MjA2LCAxNjIwNiwgMTYyNzIsIDE2MjcyLCAxNjMyMywgMTYzMjMsIDE2MzU5LCAxNjM1OSwKLSAxNjM3OSwgMTYzNzksIDE2MzgzLCAxNjM4MywgMTYzNzIsIDE2MzcyLCAxNjM0NiwgMTYzNDYsIDE2MzA1LCAxNjMwNSwKLSAxNjI0OCwgMTYyNDgsIDE2MTc1LCAxNjE3NSwgMTYwODgsIDE2MDg4LCAxNTk4NSwgMTU5ODUsIDE1ODY4LCAxNTg2OCwKLSAxNTczNSwgMTU3MzUsIDE1NTg4LCAxNTU4OCwgMTU0MjYsIDE1NDI2LCAxNTI0OSwgMTUyNDksIDE1MDU4LCAxNTA1OCwKLSAxNDg1MywgMTQ4NTMsIDE0NjM0LCAxNDYzNCwgMTQ0MDEsIDE0NDAxLCAxNDE1NSwgMTQxNTUsIDEzODk1LCAxMzg5NSwKLSAxMzYyMiwgMTM2MjIsIDEzMzM3LCAxMzMzNywgMTMwMzgsIDEzMDM4LCAxMjcyOCwgMTI3MjgsIDEyNDA2LCAxMjQwNiwKLSAxMjA3MiwgMTIwNzIsIDExNzI2LCAxMTcyNiwgMTEzNzAsIDExMzcwLCAxMTAwMiwgMTEwMDIsIDEwNjI1LCAxMDYyNSwKLSAxMDIzNywgMTAyMzcsICA5ODQwLCAgOTg0MCwgIDk0MzQsICA5NDM0LCAgOTAxOCwgIDkwMTgsICA4NTk0LCAgODU5NCwKLSAgODE2MiwgIDgxNjIsICA3NzIzLCAgNzcyMywgIDcyNzYsICA3Mjc2LCAgNjgyMiwgIDY4MjIsICA2MzYyLCAgNjM2MiwKLSAgNTg5NiwgIDU4OTYsICA1NDI0LCAgNTQyNCwgIDQ5NDgsICA0OTQ4LCAgNDQ2NiwgIDQ0NjYsICAzOTgwLCAgMzk4MCwKLSAgMzQ5MSwgIDM0OTEsICAyOTk4LCAgMjk5OCwgIDI1MDMsICAyNTAzLCAgMjAwNSwgIDIwMDUsICAxNTA1LCAgMTUwNSwKLSAgMTAwNCwgIDEwMDQsICAgNTAyLCAgIDUwMiwgICAgIDAsICAgICAwLCAgLTUwMiwgIC01MDIsIC0xMDA0LCAtMTAwNCwKLSAtMTUwNSwgLTE1MDUsIC0yMDA1LCAtMjAwNSwgLTI1MDMsIC0yNTAzLCAtMjk5OCwgLTI5OTgsIC0zNDkxLCAtMzQ5MSwKLSAtMzk4MCwgLTM5ODAsIC00NDY2LCAtNDQ2NiwgLTQ5NDgsIC00OTQ4LCAtNTQyNCwgLTU0MjQsIC01ODk2LCAtNTg5NiwKLSAtNjM2MiwgLTYzNjIsIC02ODIyLCAtNjgyMiwgLTcyNzYsIC03Mjc2LCAtNzcyMywgLTc3MjMsIC04MTYyLCAtODE2MiwKLSAtODU5NCwgLTg1OTQsIC05MDE4LCAtOTAxOCwgLTk0MzQsIC05NDM0LCAtOTg0MCwgLTk4NDAsIC0xMDIzNywgLTEwMjM3LAorLTkyNjgsIC05MjY4LCAtODg1MCwgLTg4NTAsIC04NDIzLCAtODQyMywgLTc5ODgsIC03OTg4LCAtNzU0NSwgLTc1NDUsCistNzA5NSwgLTcwOTUsIC02NjM5LCAtNjYzOSwgLTYxNzYsIC02MTc2LCAtNTcwOCwgLTU3MDgsIC01MjM0LCAtNTIzNCwKKy00NzU2LCAtNDc1NiwgLTQyNzIsIC00MjcyLCAtMzc4NSwgLTM3ODUsIC0zMjk0LCAtMzI5NCwgLTI4MDEsIC0yODAxLAorLTIzMDQsIC0yMzA0LCAtMTgwNSwgLTE4MDUsIC0xMzA1LCAtMTMwNSwgIC04MDMsICAtODAzLCAgLTMwMSwgIC0zMDEsCisyMDEsICAgMjAxLCAgIDcwMywgICA3MDMsICAxMjA1LCAgMTIwNSwgIDE3MDUsICAxNzA1LCAgMjIwNCwgIDIyMDQsCisyNzAxLCAgMjcwMSwgIDMxOTYsICAzMTk2LCAgMzY4NywgIDM2ODcsICA0MTc1LCAgNDE3NSwgIDQ2NTksICA0NjU5LAorNTEzOSwgIDUxMzksICA1NjE0LCAgNTYxNCwgIDYwODMsICA2MDgzLCAgNjU0NywgIDY1NDcsICA3MDA1LCAgNzAwNSwKKzc0NTYsICA3NDU2LCAgNzkwMCwgIDc5MDAsICA4MzM2LCAgODMzNiwgIDg3NjUsICA4NzY1LCAgOTE4NSwgIDkxODUsCis5NTk3LCAgOTU5NywgMTAwMDAsIDEwMDAwLCAxMDM5MywgMTAzOTMsIDEwNzc3LCAxMDc3NywgMTExNTAsIDExMTUwLAorMTE1MTMsIDExNTEzLCAxMTg2NiwgMTE4NjYsIDEyMjA3LCAxMjIwNywgMTI1MzYsIDEyNTM2LCAxMjg1NCwgMTI4NTQsCisxMzE1OSwgMTMxNTksIDEzNDUyLCAxMzQ1MiwgMTM3MzMsIDEzNzMzLCAxNDAwMSwgMTQwMDEsIDE0MjU1LCAxNDI1NSwKKzE0NDk2LCAxNDQ5NiwgMTQ3MjMsIDE0NzIzLCAxNDkzNywgMTQ5MzcsIDE1MTM2LCAxNTEzNiwgMTUzMjIsIDE1MzIyLAorMTU0OTIsIDE1NDkyLCAxNTY0OSwgMTU2NDksIDE1NzkwLCAxNTc5MCwgMTU5MTcsIDE1OTE3LCAxNjAyOCwgMTYwMjgsCisxNjEyNSwgMTYxMjUsIDE2MjA2LCAxNjIwNiwgMTYyNzIsIDE2MjcyLCAxNjMyMywgMTYzMjMsIDE2MzU5LCAxNjM1OSwKKzE2Mzc5LCAxNjM3OSwgMTYzODMsIDE2MzgzLCAxNjM3MiwgMTYzNzIsIDE2MzQ2LCAxNjM0NiwgMTYzMDUsIDE2MzA1LAorMTYyNDgsIDE2MjQ4LCAxNjE3NSwgMTYxNzUsIDE2MDg4LCAxNjA4OCwgMTU5ODUsIDE1OTg1LCAxNTg2OCwgMTU4NjgsCisxNTczNSwgMTU3MzUsIDE1NTg4LCAxNTU4OCwgMTU0MjYsIDE1NDI2LCAxNTI0OSwgMTUyNDksIDE1MDU4LCAxNTA1OCwKKzE0ODUzLCAxNDg1MywgMTQ2MzQsIDE0NjM0LCAxNDQwMSwgMTQ0MDEsIDE0MTU1LCAxNDE1NSwgMTM4OTUsIDEzODk1LAorMTM2MjIsIDEzNjIyLCAxMzMzNywgMTMzMzcsIDEzMDM4LCAxMzAzOCwgMTI3MjgsIDEyNzI4LCAxMjQwNiwgMTI0MDYsCisxMjA3MiwgMTIwNzIsIDExNzI2LCAxMTcyNiwgMTEzNzAsIDExMzcwLCAxMTAwMiwgMTEwMDIsIDEwNjI1LCAxMDYyNSwKKzEwMjM3LCAxMDIzNywgIDk4NDAsICA5ODQwLCAgOTQzNCwgIDk0MzQsICA5MDE4LCAgOTAxOCwgIDg1OTQsICA4NTk0LAorODE2MiwgIDgxNjIsICA3NzIzLCAgNzcyMywgIDcyNzYsICA3Mjc2LCAgNjgyMiwgIDY4MjIsICA2MzYyLCAgNjM2MiwKKzU4OTYsICA1ODk2LCAgNTQyNCwgIDU0MjQsICA0OTQ4LCAgNDk0OCwgIDQ0NjYsICA0NDY2LCAgMzk4MCwgIDM5ODAsCiszNDkxLCAgMzQ5MSwgIDI5OTgsICAyOTk4LCAgMjUwMywgIDI1MDMsICAyMDA1LCAgMjAwNSwgIDE1MDUsICAxNTA1LAorMTAwNCwgIDEwMDQsICAgNTAyLCAgIDUwMiwgICAgIDAsICAgICAwLCAgLTUwMiwgIC01MDIsIC0xMDA0LCAtMTAwNCwKKy0xNTA1LCAtMTUwNSwgLTIwMDUsIC0yMDA1LCAtMjUwMywgLTI1MDMsIC0yOTk4LCAtMjk5OCwgLTM0OTEsIC0zNDkxLAorLTM5ODAsIC0zOTgwLCAtNDQ2NiwgLTQ0NjYsIC00OTQ4LCAtNDk0OCwgLTU0MjQsIC01NDI0LCAtNTg5NiwgLTU4OTYsCistNjM2MiwgLTYzNjIsIC02ODIyLCAtNjgyMiwgLTcyNzYsIC03Mjc2LCAtNzcyMywgLTc3MjMsIC04MTYyLCAtODE2MiwKKy04NTk0LCAtODU5NCwgLTkwMTgsIC05MDE4LCAtOTQzNCwgLTk0MzQsIC05ODQwLCAtOTg0MCwgLTEwMjM3LCAtMTAyMzcsCiAtMTA2MjUsIC0xMDYyNSwgLTExMDAyLCAtMTEwMDIsIC0xMTM3MCwgLTExMzcwLCAtMTE3MjYsIC0xMTcyNiwgLTEyMDcyLCAtMTIwNzIsCiAtMTI0MDYsIC0xMjQwNiwgLTEyNzI4LCAtMTI3MjgsIC0xMzAzOCwgLTEzMDM4LCAtMTMzMzcsIC0xMzMzNywgLTEzNjIyLCAtMTM2MjIsCiAtMTM4OTUsIC0xMzg5NSwgLTE0MTU1LCAtMTQxNTUsIC0xNDQwMSwgLTE0NDAxLCAtMTQ2MzQsIC0xNDYzNCwgLTE0ODUzLCAtMTQ4NTMsCkBAIC0yODAsMzUgKzMwOCwzNSBAQAogLTE0MjU1LCAtMTQyNTUsIC0xNDAwMSwgLTE0MDAxLCAtMTM3MzMsIC0xMzczMywgLTEzNDUyLCAtMTM0NTIsIC0xMzE1OSwgLTEzMTU5LAogLTEyODU0LCAtMTI4NTQsIC0xMjUzNiwgLTEyNTM2LCAtMTIyMDcsIC0xMjIwNywgLTExODY2LCAtMTE4NjYsIC0xMTUxMywgLTExNTEzLAogLTExMTUwLCAtMTExNTAsIC0xMDc3NywgLTEwNzc3LCAtMTAzOTMsIC0xMDM5MywgLTEwMDAwLCAtMTAwMDAsIC05NTk3LCAtOTU5NywKLSAtOTE4NSwgLTkxODUsIC04NzY1LCAtODc2NSwgLTgzMzYsIC04MzM2LCAtNzkwMCwgLTc5MDAsIC03NDU2LCAtNzQ1NiwKLSAtNzAwNSwgLTcwMDUsIC02NTQ3LCAtNjU0NywgLTYwODMsIC02MDgzLCAtNTYxNCwgLTU2MTQsIC01MTM5LCAtNTEzOSwKLSAtNDY1OSwgLTQ2NTksIC00MTc1LCAtNDE3NSwgLTM2ODcsIC0zNjg3LCAtMzE5NiwgLTMxOTYsIC0yNzAxLCAtMjcwMSwKLSAtMjIwNCwgLTIyMDQsIC0xNzA1LCAtMTcwNSwgLTEyMDUsIC0xMjA1LCAgLTcwMywgIC03MDMsICAtMjAxLCAgLTIwMSwKLSAgIDMwMSwgICAzMDEsICAgODAzLCAgIDgwMywgIDEzMDUsICAxMzA1LCAgMTgwNSwgIDE4MDUsICAyMzA0LCAgMjMwNCwKLSAgMjgwMSwgIDI4MDEsICAzMjk0LCAgMzI5NCwgIDM3ODUsICAzNzg1LCAgNDI3MiwgIDQyNzIsICA0NzU2LCAgNDc1NiwKLSAgNTIzNCwgIDUyMzQsICA1NzA4LCAgNTcwOCwgIDYxNzYsICA2MTc2LCAgNjYzOSwgIDY2MzksICA3MDk1LCAgNzA5NSwKLSAgNzU0NSwgIDc1NDUsICA3OTg4LCAgNzk4OCwgIDg0MjMsICA4NDIzLCAgODg1MCwgIDg4NTAsICA5MjY4LCAgOTI2OCwKLSAgOTY3OSwgIDk2NzksIDEwMDc5LCAxMDA3OSwgMTA0NzEsIDEwNDcxLCAxMDg1MywgMTA4NTMsIDExMjI0LCAxMTIyNCwKLSAxMTU4NSwgMTE1ODUsIDExOTM1LCAxMTkzNSwgMTIyNzMsIDEyMjczLCAxMjYwMCwgMTI2MDAsIDEyOTE2LCAxMjkxNiwKLSAxMzIxOSwgMTMyMTksIDEzNTEwLCAxMzUxMCwgMTM3ODgsIDEzNzg4LCAxNDA1MywgMTQwNTMsIDE0MzA0LCAxNDMwNCwKLSAxNDU0MywgMTQ1NDMsIDE0NzY3LCAxNDc2NywgMTQ5NzgsIDE0OTc4LCAxNTE3NSwgMTUxNzUsIDE1MzU3LCAxNTM1NywKLSAxNTUyNSwgMTU1MjUsIDE1Njc4LCAxNTY3OCwgMTU4MTcsIDE1ODE3LCAxNTk0MCwgMTU5NDAsIDE2MDQ5LCAxNjA0OSwKLSAxNjE0MiwgMTYxNDIsIDE2MjIxLCAxNjIyMSwgMTYyODQsIDE2Mjg0LCAxNjMzMSwgMTYzMzEsIDE2MzY0LCAxNjM2NCwKLSAxNjM4MSwgMTYzODEsIDE2MzgyLCAxNjM4MiwgMTYzNjgsIDE2MzY4LCAxNjMzOSwgMTYzMzksIDE2Mjk0LCAxNjI5NCwKLSAxNjIzNCwgMTYyMzQsIDE2MTU5LCAxNjE1OSwgMTYwNjksIDE2MDY5LCAxNTk2MywgMTU5NjMsIDE1ODQyLCAxNTg0MiwKLSAxNTcwNywgMTU3MDcsIDE1NTU3LCAxNTU1NywgMTUzOTIsIDE1MzkyLCAxNTIxMiwgMTUyMTIsIDE1MDE4LCAxNTAxOCwKLSAxNDgxMCwgMTQ4MTAsIDE0NTg5LCAxNDU4OSwgMTQzNTMsIDE0MzUzLCAxNDEwNCwgMTQxMDQsIDEzODQyLCAxMzg0MiwKLSAxMzU2NiwgMTM1NjYsIDEzMjc4LCAxMzI3OCwgMTI5NzcsIDEyOTc3LCAxMjY2NSwgMTI2NjUsIDEyMzQwLCAxMjM0MCwKLSAxMjAwMywgMTIwMDMsIDExNjU2LCAxMTY1NiwgMTEyOTcsIDExMjk3LCAxMDkyOCwgMTA5MjgsIDEwNTQ4LCAxMDU0OCwKLSAxMDE1OSwgMTAxNTksICA5NzU5LCAgOTc1OSwgIDkzNTEsICA5MzUxLCAgODkzNCwgIDg5MzQsICA4NTA5LCAgODUwOSwKLSAgODA3NSwgIDgwNzUsICA3NjM0LCAgNzYzNCwgIDcxODYsICA3MTg2LCAgNjczMSwgIDY3MzEsICA2MjY5LCAgNjI2OSwKLSAgNTgwMiwgIDU4MDIsICA1MzI5LCAgNTMyOSwgIDQ4NTIsICA0ODUyLCAgNDM2OSwgIDQzNjksICAzODgzLCAgMzg4MywKLSAgMzM5MywgIDMzOTMsICAyOTAwLCAgMjkwMCwgIDI0MDQsICAyNDA0LCAgMTkwNSwgIDE5MDUsICAxNDA1LCAgMTQwNSwKLSAgIDkwNCwgICA5MDQsICAgNDAyLCAgIDQwMiwgIC0xMDAsICAtMTAwLCAgLTYwMywgIC02MDMsIC0xMTA1LCAtMTEwNSwKLSAtMTYwNSwgLTE2MDUsIC0yMTA1LCAtMjEwNSwgLTI2MDIsIC0yNjAyLCAtMzA5NywgLTMwOTcsIC0zNTg5LCAtMzU4OSwKLSAtNDA3OCwgLTQwNzgsIC00NTYzLCAtNDU2MywgLTUwNDMsIC01MDQzLCAtNTUxOSwgLTU1MTksIC01OTkwLCAtNTk5MCwKLSAtNjQ1NSwgLTY0NTUsIC02OTE0LCAtNjkxNCwgLTczNjYsIC03MzY2LCAtNzgxMSwgLTc4MTEsIC04MjQ5LCAtODI0OSwKLSAtODY4MCwgLTg2ODAsIC05MTAyLCAtOTEwMiwgLTk1MTYsIC05NTE2LCAtOTkyMCwgLTk5MjAsIC0xMDMxNSwgLTEwMzE1LAorLTkxODUsIC05MTg1LCAtODc2NSwgLTg3NjUsIC04MzM2LCAtODMzNiwgLTc5MDAsIC03OTAwLCAtNzQ1NiwgLTc0NTYsCistNzAwNSwgLTcwMDUsIC02NTQ3LCAtNjU0NywgLTYwODMsIC02MDgzLCAtNTYxNCwgLTU2MTQsIC01MTM5LCAtNTEzOSwKKy00NjU5LCAtNDY1OSwgLTQxNzUsIC00MTc1LCAtMzY4NywgLTM2ODcsIC0zMTk2LCAtMzE5NiwgLTI3MDEsIC0yNzAxLAorLTIyMDQsIC0yMjA0LCAtMTcwNSwgLTE3MDUsIC0xMjA1LCAtMTIwNSwgIC03MDMsICAtNzAzLCAgLTIwMSwgIC0yMDEsCiszMDEsICAgMzAxLCAgIDgwMywgICA4MDMsICAxMzA1LCAgMTMwNSwgIDE4MDUsICAxODA1LCAgMjMwNCwgIDIzMDQsCisyODAxLCAgMjgwMSwgIDMyOTQsICAzMjk0LCAgMzc4NSwgIDM3ODUsICA0MjcyLCAgNDI3MiwgIDQ3NTYsICA0NzU2LAorNTIzNCwgIDUyMzQsICA1NzA4LCAgNTcwOCwgIDYxNzYsICA2MTc2LCAgNjYzOSwgIDY2MzksICA3MDk1LCAgNzA5NSwKKzc1NDUsICA3NTQ1LCAgNzk4OCwgIDc5ODgsICA4NDIzLCAgODQyMywgIDg4NTAsICA4ODUwLCAgOTI2OCwgIDkyNjgsCis5Njc5LCAgOTY3OSwgMTAwNzksIDEwMDc5LCAxMDQ3MSwgMTA0NzEsIDEwODUzLCAxMDg1MywgMTEyMjQsIDExMjI0LAorMTE1ODUsIDExNTg1LCAxMTkzNSwgMTE5MzUsIDEyMjczLCAxMjI3MywgMTI2MDAsIDEyNjAwLCAxMjkxNiwgMTI5MTYsCisxMzIxOSwgMTMyMTksIDEzNTEwLCAxMzUxMCwgMTM3ODgsIDEzNzg4LCAxNDA1MywgMTQwNTMsIDE0MzA0LCAxNDMwNCwKKzE0NTQzLCAxNDU0MywgMTQ3NjcsIDE0NzY3LCAxNDk3OCwgMTQ5NzgsIDE1MTc1LCAxNTE3NSwgMTUzNTcsIDE1MzU3LAorMTU1MjUsIDE1NTI1LCAxNTY3OCwgMTU2NzgsIDE1ODE3LCAxNTgxNywgMTU5NDAsIDE1OTQwLCAxNjA0OSwgMTYwNDksCisxNjE0MiwgMTYxNDIsIDE2MjIxLCAxNjIyMSwgMTYyODQsIDE2Mjg0LCAxNjMzMSwgMTYzMzEsIDE2MzY0LCAxNjM2NCwKKzE2MzgxLCAxNjM4MSwgMTYzODIsIDE2MzgyLCAxNjM2OCwgMTYzNjgsIDE2MzM5LCAxNjMzOSwgMTYyOTQsIDE2Mjk0LAorMTYyMzQsIDE2MjM0LCAxNjE1OSwgMTYxNTksIDE2MDY5LCAxNjA2OSwgMTU5NjMsIDE1OTYzLCAxNTg0MiwgMTU4NDIsCisxNTcwNywgMTU3MDcsIDE1NTU3LCAxNTU1NywgMTUzOTIsIDE1MzkyLCAxNTIxMiwgMTUyMTIsIDE1MDE4LCAxNTAxOCwKKzE0ODEwLCAxNDgxMCwgMTQ1ODksIDE0NTg5LCAxNDM1MywgMTQzNTMsIDE0MTA0LCAxNDEwNCwgMTM4NDIsIDEzODQyLAorMTM1NjYsIDEzNTY2LCAxMzI3OCwgMTMyNzgsIDEyOTc3LCAxMjk3NywgMTI2NjUsIDEyNjY1LCAxMjM0MCwgMTIzNDAsCisxMjAwMywgMTIwMDMsIDExNjU2LCAxMTY1NiwgMTEyOTcsIDExMjk3LCAxMDkyOCwgMTA5MjgsIDEwNTQ4LCAxMDU0OCwKKzEwMTU5LCAxMDE1OSwgIDk3NTksICA5NzU5LCAgOTM1MSwgIDkzNTEsICA4OTM0LCAgODkzNCwgIDg1MDksICA4NTA5LAorODA3NSwgIDgwNzUsICA3NjM0LCAgNzYzNCwgIDcxODYsICA3MTg2LCAgNjczMSwgIDY3MzEsICA2MjY5LCAgNjI2OSwKKzU4MDIsICA1ODAyLCAgNTMyOSwgIDUzMjksICA0ODUyLCAgNDg1MiwgIDQzNjksICA0MzY5LCAgMzg4MywgIDM4ODMsCiszMzkzLCAgMzM5MywgIDI5MDAsICAyOTAwLCAgMjQwNCwgIDI0MDQsICAxOTA1LCAgMTkwNSwgIDE0MDUsICAxNDA1LAorOTA0LCAgIDkwNCwgICA0MDIsICAgNDAyLCAgLTEwMCwgIC0xMDAsICAtNjAzLCAgLTYwMywgLTExMDUsIC0xMTA1LAorLTE2MDUsIC0xNjA1LCAtMjEwNSwgLTIxMDUsIC0yNjAyLCAtMjYwMiwgLTMwOTcsIC0zMDk3LCAtMzU4OSwgLTM1ODksCistNDA3OCwgLTQwNzgsIC00NTYzLCAtNDU2MywgLTUwNDMsIC01MDQzLCAtNTUxOSwgLTU1MTksIC01OTkwLCAtNTk5MCwKKy02NDU1LCAtNjQ1NSwgLTY5MTQsIC02OTE0LCAtNzM2NiwgLTczNjYsIC03ODExLCAtNzgxMSwgLTgyNDksIC04MjQ5LAorLTg2ODAsIC04NjgwLCAtOTEwMiwgLTkxMDIsIC05NTE2LCAtOTUxNiwgLTk5MjAsIC05OTIwLCAtMTAzMTUsIC0xMDMxNSwKIC0xMDcwMSwgLTEwNzAxLCAtMTEwNzcsIC0xMTA3NywgLTExNDQyLCAtMTE0NDIsIC0xMTc5NiwgLTExNzk2LCAtMTIxMzksIC0xMjEzOSwKIC0xMjQ3MSwgLTEyNDcxLCAtMTI3OTEsIC0xMjc5MSwgLTEzMDk5LCAtMTMwOTksIC0xMzM5NSwgLTEzMzk1LCAtMTM2NzgsIC0xMzY3OCwKIC0xMzk0OCwgLTEzOTQ4LCAtMTQyMDUsIC0xNDIwNSwgLTE0NDQ5LCAtMTQ0NDksIC0xNDY3OSwgLTE0Njc5LCAtMTQ4OTUsIC0xNDg5NSwKQEAgLTMyMSwzNSArMzQ5LDM1IEBACiAtMTQyMDUsIC0xNDIwNSwgLTEzOTQ4LCAtMTM5NDgsIC0xMzY3OCwgLTEzNjc4LCAtMTMzOTUsIC0xMzM5NSwgLTEzMDk5LCAtMTMwOTksCiAtMTI3OTEsIC0xMjc5MSwgLTEyNDcxLCAtMTI0NzEsIC0xMjEzOSwgLTEyMTM5LCAtMTE3OTYsIC0xMTc5NiwgLTExNDQyLCAtMTE0NDIsCiAtMTEwNzcsIC0xMTA3NywgLTEwNzAxLCAtMTA3MDEsIC0xMDMxNSwgLTEwMzE1LCAtOTkyMCwgLTk5MjAsIC05NTE2LCAtOTUxNiwKLSAtOTEwMiwgLTkxMDIsIC04NjgwLCAtODY4MCwgLTgyNDksIC04MjQ5LCAtNzgxMSwgLTc4MTEsIC03MzY2LCAtNzM2NiwKLSAtNjkxNCwgLTY5MTQsIC02NDU1LCAtNjQ1NSwgLTU5OTAsIC01OTkwLCAtNTUxOSwgLTU1MTksIC01MDQzLCAtNTA0MywKLSAtNDU2MywgLTQ1NjMsIC00MDc4LCAtNDA3OCwgLTM1ODksIC0zNTg5LCAtMzA5NywgLTMwOTcsIC0yNjAyLCAtMjYwMiwKLSAtMjEwNSwgLTIxMDUsIC0xNjA1LCAtMTYwNSwgLTExMDUsIC0xMTA1LCAgLTYwMywgIC02MDMsICAtMTAwLCAgLTEwMCwKLSAgIDQwMiwgICA0MDIsICAgOTA0LCAgIDkwNCwgIDE0MDUsICAxNDA1LCAgMTkwNSwgIDE5MDUsICAyNDA0LCAgMjQwNCwKLSAgMjkwMCwgIDI5MDAsICAzMzkzLCAgMzM5MywgIDM4ODMsICAzODgzLCAgNDM2OSwgIDQzNjksICA0ODUyLCAgNDg1MiwKLSAgNTMyOSwgIDUzMjksICA1ODAyLCAgNTgwMiwgIDYyNjksICA2MjY5LCAgNjczMSwgIDY3MzEsICA3MTg2LCAgNzE4NiwKLSAgNzYzNCwgIDc2MzQsICA4MDc1LCAgODA3NSwgIDg1MDksICA4NTA5LCAgODkzNCwgIDg5MzQsICA5MzUxLCAgOTM1MSwKLSAgOTc1OSwgIDk3NTksIDEwMTU5LCAxMDE1OSwgMTA1NDgsIDEwNTQ4LCAxMDkyOCwgMTA5MjgsIDExMjk3LCAxMTI5NywKLSAxMTY1NiwgMTE2NTYsIDEyMDAzLCAxMjAwMywgMTIzNDAsIDEyMzQwLCAxMjY2NSwgMTI2NjUsIDEyOTc3LCAxMjk3NywKLSAxMzI3OCwgMTMyNzgsIDEzNTY2LCAxMzU2NiwgMTM4NDIsIDEzODQyLCAxNDEwNCwgMTQxMDQsIDE0MzUzLCAxNDM1MywKLSAxNDU4OSwgMTQ1ODksIDE0ODEwLCAxNDgxMCwgMTUwMTgsIDE1MDE4LCAxNTIxMiwgMTUyMTIsIDE1MzkyLCAxNTM5MiwKLSAxNTU1NywgMTU1NTcsIDE1NzA3LCAxNTcwNywgMTU4NDIsIDE1ODQyLCAxNTk2MywgMTU5NjMsIDE2MDY5LCAxNjA2OSwKLSAxNjE1OSwgMTYxNTksIDE2MjM0LCAxNjIzNCwgMTYyOTQsIDE2Mjk0LCAxNjMzOSwgMTYzMzksIDE2MzY4LCAxNjM2OCwKLSAxNjM4MiwgMTYzODIsIDE2MzgxLCAxNjM4MSwgMTYzNjQsIDE2MzY0LCAxNjMzMSwgMTYzMzEsIDE2Mjg0LCAxNjI4NCwKLSAxNjIyMSwgMTYyMjEsIDE2MTQyLCAxNjE0MiwgMTYwNDksIDE2MDQ5LCAxNTk0MCwgMTU5NDAsIDE1ODE3LCAxNTgxNywKLSAxNTY3OCwgMTU2NzgsIDE1NTI1LCAxNTUyNSwgMTUzNTcsIDE1MzU3LCAxNTE3NSwgMTUxNzUsIDE0OTc4LCAxNDk3OCwKLSAxNDc2NywgMTQ3NjcsIDE0NTQzLCAxNDU0MywgMTQzMDQsIDE0MzA0LCAxNDA1MywgMTQwNTMsIDEzNzg4LCAxMzc4OCwKLSAxMzUxMCwgMTM1MTAsIDEzMjE5LCAxMzIxOSwgMTI5MTYsIDEyOTE2LCAxMjYwMCwgMTI2MDAsIDEyMjczLCAxMjI3MywKLSAxMTkzNSwgMTE5MzUsIDExNTg1LCAxMTU4NSwgMTEyMjQsIDExMjI0LCAxMDg1MywgMTA4NTMsIDEwNDcxLCAxMDQ3MSwKLSAxMDA3OSwgMTAwNzksICA5Njc5LCAgOTY3OSwgIDkyNjgsICA5MjY4LCAgODg1MCwgIDg4NTAsICA4NDIzLCAgODQyMywKLSAgNzk4OCwgIDc5ODgsICA3NTQ1LCAgNzU0NSwgIDcwOTUsICA3MDk1LCAgNjYzOSwgIDY2MzksICA2MTc2LCAgNjE3NiwKLSAgNTcwOCwgIDU3MDgsICA1MjM0LCAgNTIzNCwgIDQ3NTYsICA0NzU2LCAgNDI3MiwgIDQyNzIsICAzNzg1LCAgMzc4NSwKLSAgMzI5NCwgIDMyOTQsICAyODAxLCAgMjgwMSwgIDIzMDQsICAyMzA0LCAgMTgwNSwgIDE4MDUsICAxMzA1LCAgMTMwNSwKLSAgIDgwMywgICA4MDMsICAgMzAxLCAgIDMwMSwgIC0yMDEsICAtMjAxLCAgLTcwMywgIC03MDMsIC0xMjA1LCAtMTIwNSwKLSAtMTcwNSwgLTE3MDUsIC0yMjA0LCAtMjIwNCwgLTI3MDEsIC0yNzAxLCAtMzE5NiwgLTMxOTYsIC0zNjg3LCAtMzY4NywKLSAtNDE3NSwgLTQxNzUsIC00NjU5LCAtNDY1OSwgLTUxMzksIC01MTM5LCAtNTYxNCwgLTU2MTQsIC02MDgzLCAtNjA4MywKLSAtNjU0NywgLTY1NDcsIC03MDA1LCAtNzAwNSwgLTc0NTYsIC03NDU2LCAtNzkwMCwgLTc5MDAsIC04MzM2LCAtODMzNiwKLSAtODc2NSwgLTg3NjUsIC05MTg1LCAtOTE4NSwgLTk1OTcsIC05NTk3LCAtMTAwMDAsIC0xMDAwMCwgLTEwMzkzLCAtMTAzOTMsCistOTEwMiwgLTkxMDIsIC04NjgwLCAtODY4MCwgLTgyNDksIC04MjQ5LCAtNzgxMSwgLTc4MTEsIC03MzY2LCAtNzM2NiwKKy02OTE0LCAtNjkxNCwgLTY0NTUsIC02NDU1LCAtNTk5MCwgLTU5OTAsIC01NTE5LCAtNTUxOSwgLTUwNDMsIC01MDQzLAorLTQ1NjMsIC00NTYzLCAtNDA3OCwgLTQwNzgsIC0zNTg5LCAtMzU4OSwgLTMwOTcsIC0zMDk3LCAtMjYwMiwgLTI2MDIsCistMjEwNSwgLTIxMDUsIC0xNjA1LCAtMTYwNSwgLTExMDUsIC0xMTA1LCAgLTYwMywgIC02MDMsICAtMTAwLCAgLTEwMCwKKzQwMiwgICA0MDIsICAgOTA0LCAgIDkwNCwgIDE0MDUsICAxNDA1LCAgMTkwNSwgIDE5MDUsICAyNDA0LCAgMjQwNCwKKzI5MDAsICAyOTAwLCAgMzM5MywgIDMzOTMsICAzODgzLCAgMzg4MywgIDQzNjksICA0MzY5LCAgNDg1MiwgIDQ4NTIsCis1MzI5LCAgNTMyOSwgIDU4MDIsICA1ODAyLCAgNjI2OSwgIDYyNjksICA2NzMxLCAgNjczMSwgIDcxODYsICA3MTg2LAorNzYzNCwgIDc2MzQsICA4MDc1LCAgODA3NSwgIDg1MDksICA4NTA5LCAgODkzNCwgIDg5MzQsICA5MzUxLCAgOTM1MSwKKzk3NTksICA5NzU5LCAxMDE1OSwgMTAxNTksIDEwNTQ4LCAxMDU0OCwgMTA5MjgsIDEwOTI4LCAxMTI5NywgMTEyOTcsCisxMTY1NiwgMTE2NTYsIDEyMDAzLCAxMjAwMywgMTIzNDAsIDEyMzQwLCAxMjY2NSwgMTI2NjUsIDEyOTc3LCAxMjk3NywKKzEzMjc4LCAxMzI3OCwgMTM1NjYsIDEzNTY2LCAxMzg0MiwgMTM4NDIsIDE0MTA0LCAxNDEwNCwgMTQzNTMsIDE0MzUzLAorMTQ1ODksIDE0NTg5LCAxNDgxMCwgMTQ4MTAsIDE1MDE4LCAxNTAxOCwgMTUyMTIsIDE1MjEyLCAxNTM5MiwgMTUzOTIsCisxNTU1NywgMTU1NTcsIDE1NzA3LCAxNTcwNywgMTU4NDIsIDE1ODQyLCAxNTk2MywgMTU5NjMsIDE2MDY5LCAxNjA2OSwKKzE2MTU5LCAxNjE1OSwgMTYyMzQsIDE2MjM0LCAxNjI5NCwgMTYyOTQsIDE2MzM5LCAxNjMzOSwgMTYzNjgsIDE2MzY4LAorMTYzODIsIDE2MzgyLCAxNjM4MSwgMTYzODEsIDE2MzY0LCAxNjM2NCwgMTYzMzEsIDE2MzMxLCAxNjI4NCwgMTYyODQsCisxNjIyMSwgMTYyMjEsIDE2MTQyLCAxNjE0MiwgMTYwNDksIDE2MDQ5LCAxNTk0MCwgMTU5NDAsIDE1ODE3LCAxNTgxNywKKzE1Njc4LCAxNTY3OCwgMTU1MjUsIDE1NTI1LCAxNTM1NywgMTUzNTcsIDE1MTc1LCAxNTE3NSwgMTQ5NzgsIDE0OTc4LAorMTQ3NjcsIDE0NzY3LCAxNDU0MywgMTQ1NDMsIDE0MzA0LCAxNDMwNCwgMTQwNTMsIDE0MDUzLCAxMzc4OCwgMTM3ODgsCisxMzUxMCwgMTM1MTAsIDEzMjE5LCAxMzIxOSwgMTI5MTYsIDEyOTE2LCAxMjYwMCwgMTI2MDAsIDEyMjczLCAxMjI3MywKKzExOTM1LCAxMTkzNSwgMTE1ODUsIDExNTg1LCAxMTIyNCwgMTEyMjQsIDEwODUzLCAxMDg1MywgMTA0NzEsIDEwNDcxLAorMTAwNzksIDEwMDc5LCAgOTY3OSwgIDk2NzksICA5MjY4LCAgOTI2OCwgIDg4NTAsICA4ODUwLCAgODQyMywgIDg0MjMsCis3OTg4LCAgNzk4OCwgIDc1NDUsICA3NTQ1LCAgNzA5NSwgIDcwOTUsICA2NjM5LCAgNjYzOSwgIDYxNzYsICA2MTc2LAorNTcwOCwgIDU3MDgsICA1MjM0LCAgNTIzNCwgIDQ3NTYsICA0NzU2LCAgNDI3MiwgIDQyNzIsICAzNzg1LCAgMzc4NSwKKzMyOTQsICAzMjk0LCAgMjgwMSwgIDI4MDEsICAyMzA0LCAgMjMwNCwgIDE4MDUsICAxODA1LCAgMTMwNSwgIDEzMDUsCis4MDMsICAgODAzLCAgIDMwMSwgICAzMDEsICAtMjAxLCAgLTIwMSwgIC03MDMsICAtNzAzLCAtMTIwNSwgLTEyMDUsCistMTcwNSwgLTE3MDUsIC0yMjA0LCAtMjIwNCwgLTI3MDEsIC0yNzAxLCAtMzE5NiwgLTMxOTYsIC0zNjg3LCAtMzY4NywKKy00MTc1LCAtNDE3NSwgLTQ2NTksIC00NjU5LCAtNTEzOSwgLTUxMzksIC01NjE0LCAtNTYxNCwgLTYwODMsIC02MDgzLAorLTY1NDcsIC02NTQ3LCAtNzAwNSwgLTcwMDUsIC03NDU2LCAtNzQ1NiwgLTc5MDAsIC03OTAwLCAtODMzNiwgLTgzMzYsCistODc2NSwgLTg3NjUsIC05MTg1LCAtOTE4NSwgLTk1OTcsIC05NTk3LCAtMTAwMDAsIC0xMDAwMCwgLTEwMzkzLCAtMTAzOTMsCiAtMTA3NzcsIC0xMDc3NywgLTExMTUwLCAtMTExNTAsIC0xMTUxMywgLTExNTEzLCAtMTE4NjYsIC0xMTg2NiwgLTEyMjA3LCAtMTIyMDcsCiAtMTI1MzYsIC0xMjUzNiwgLTEyODU0LCAtMTI4NTQsIC0xMzE1OSwgLTEzMTU5LCAtMTM0NTIsIC0xMzQ1MiwgLTEzNzMzLCAtMTM3MzMsCiAtMTQwMDEsIC0xNDAwMSwgLTE0MjU1LCAtMTQyNTUsIC0xNDQ5NiwgLTE0NDk2LCAtMTQ3MjMsIC0xNDcyMywgLTE0OTM3LCAtMTQ5MzcsCkBAIC0zNjIsMTAgKzM5MCwxMCBAQAogLTE0MTU1LCAtMTQxNTUsIC0xMzg5NSwgLTEzODk1LCAtMTM2MjIsIC0xMzYyMiwgLTEzMzM3LCAtMTMzMzcsIC0xMzAzOCwgLTEzMDM4LAogLTEyNzI4LCAtMTI3MjgsIC0xMjQwNiwgLTEyNDA2LCAtMTIwNzIsIC0xMjA3MiwgLTExNzI2LCAtMTE3MjYsIC0xMTM3MCwgLTExMzcwLAogLTExMDAyLCAtMTEwMDIsIC0xMDYyNSwgLTEwNjI1LCAtMTAyMzcsIC0xMDIzNywgLTk4NDAsIC05ODQwLCAtOTQzNCwgLTk0MzQsCi0gLTkwMTgsIC05MDE4LCAtODU5NCwgLTg1OTQsIC04MTYyLCAtODE2MiwgLTc3MjMsIC03NzIzLCAtNzI3NiwgLTcyNzYsCi0gLTY4MjIsIC02ODIyLCAtNjM2MiwgLTYzNjIsIC01ODk2LCAtNTg5NiwgLTU0MjQsIC01NDI0LCAtNDk0OCwgLTQ5NDgsCi0gLTQ0NjYsIC00NDY2LCAtMzk4MCwgLTM5ODAsIC0zNDkxLCAtMzQ5MSwgLTI5OTgsIC0yOTk4LCAtMjUwMywgLTI1MDMsCi0gLTIwMDUsIC0yMDA1LCAtMTUwNSwgLTE1MDUsIC0xMDA0LCAtMTAwNCwgIC01MDIsICAtNTAyCistOTAxOCwgLTkwMTgsIC04NTk0LCAtODU5NCwgLTgxNjIsIC04MTYyLCAtNzcyMywgLTc3MjMsIC03Mjc2LCAtNzI3NiwKKy02ODIyLCAtNjgyMiwgLTYzNjIsIC02MzYyLCAtNTg5NiwgLTU4OTYsIC01NDI0LCAtNTQyNCwgLTQ5NDgsIC00OTQ4LAorLTQ0NjYsIC00NDY2LCAtMzk4MCwgLTM5ODAsIC0zNDkxLCAtMzQ5MSwgLTI5OTgsIC0yOTk4LCAtMjUwMywgLTI1MDMsCistMjAwNSwgLTIwMDUsIC0xNTA1LCAtMTUwNSwgLTEwMDQsIC0xMDA0LCAgLTUwMiwgIC01MDIKIH07CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkCkBAIC0zNzUsMTAgKzQwMywxMiBAQAogdW5zaWduZWQgY2hhciAqcDI7CiBzdHJ1Y3QgZGF0YV9idWZmZXIgKnBhdWRpb19idWZmZXI7CiAKLUpPVCg4LCAiJWk9YXVkaW9fZmlsbFxuIiwgYXVkaW9fZmlsbCk7Ci0KK2lmIChOVUxMID09IHBlYXN5Y2FwKSB7CisJU0FZKCJFUlJPUjogcGVhc3ljYXAgaXMgTlVMTFxuIik7CisJcmV0dXJuOworfQorSk9NKDgsICIlaT1hdWRpb19maWxsXG4iLCBhdWRpb19maWxsKTsKIHBhdWRpb19idWZmZXIgPSAmcGVhc3ljYXAtPmF1ZGlvX2J1ZmZlclthdWRpb19maWxsXTsKLQogcDIgPSAodW5zaWduZWQgY2hhciAqKShwYXVkaW9fYnVmZmVyLT5wZ28pOwogZm9yIChpMSA9IDA7ICBpMSA8IFBBR0VfU0laRTsgIGkxICs9IDQsIHAyICs9IDQpIHsKIAkqcDIgICAgICAgPSAodW5zaWduZWQgY2hhcikgKDB4MDBGRiAmIHRvbmVzW2kxLzJdKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X2luaXRwY2kuYyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X2luaXRwY2kuYwppbmRleCAxMGJjYjQ1Li5mNjJiYTdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeF9pbml0cGNpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXhfaW5pdHBjaS5jCkBAIC03ODMsNyArNzgzLDcgQEAKIAkvKiBSZXRyaWV2ZSB0aGUgbmV0X2RldmljZSBwb2ludGVyIGZyb20gdGhlIHBjaV9kZXYgc3RydWN0LCBhcyB3ZWxsCiAJICogYXMgdGhlIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3QKIAkgKi8KLQluZXRkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCW5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlhZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAogCS8qIFBlcmZvcm0gZGV2aWNlIGNsZWFudXAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9hbHBoYXRyYWNrLmMgYi9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvYWxwaGF0cmFjay5jCmluZGV4IGVmN2ZiZjguLjJiYWJiMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9hbHBoYXRyYWNrLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL2FscGhhdHJhY2suYwpAQCAtODksNyArODksNyBAQAogCiAvKiBVc2Ugb3VyIG93biBkYmcgbWFjcm8gKi8KICNkZWZpbmUgZGJnX2luZm8oZGV2LCBmb3JtYXQsIGFyZy4uLikgZG8gXAotICAgIHsgaWYgKGRlYnVnKSBkZXZfaW5mbyhkZXYgLCBmb3JtYXQgLCAjIyBhcmcpOyB9IHdoaWxlICgwKQorCXsgaWYgKGRlYnVnKSBkZXZfaW5mbyhkZXYgLCBmb3JtYXQgLCAjIyBhcmcpOyB9IHdoaWxlICgwKQogCiAjZGVmaW5lIGFscGhhdHJhY2tfb2NtZF9pbmZvKGRldiwgY21kLCBmb3JtYXQsIGFyZy4uLikKIApAQCAtNzY5LDcgKzc2OSw3IEBACiAJfQogCiAJZGV2LT53cml0ZV9idWZmZXIgPQotCSAgICBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWxwaGF0cmFja19vY21kKSAqIHRydWVfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJICAgIGttYWxsb2ModHJ1ZV9zaXplICogc2l6ZW9mKHN0cnVjdCBhbHBoYXRyYWNrX29jbWQpLCBHRlBfS0VSTkVMKTsKIAogCWlmICghZGV2LT53cml0ZV9idWZmZXIpIHsKIAkJZGV2X2VycigmaW50Zi0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgd3JpdGVfYnVmZmVyXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXBjbWNpYS9mdDEwMDBfaHcuYyBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXBjbWNpYS9mdDEwMDBfaHcuYwppbmRleCBlZWQ3ZTk0Li41ODhhZmQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC1wY21jaWEvZnQxMDAwX2h3LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtcGNtY2lhL2Z0MTAwMF9ody5jCkBAIC0xMzIsNyArMTMyLDcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBzdGF0aWMgaW5saW5lIHUxNiBmdDEwMDBfcmVhZF9maWZvX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCUZUMTAwMF9JTkZPICppbmZvID0gKEZUMTAwMF9JTkZPICopIG5ldGRldl9wcml2KGRldik7CisJRlQxMDAwX0lORk8gKmluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJaWYgKGluZm8tPkFzaWNJRCA9PSBFTEVDVFJBQlVaWl9JRCkgewogCQlyZXR1cm4gKGZ0MTAwMF9yZWFkX3JlZyhkZXYsIEZUMTAwMF9SRUdfVUZJRk9fU1RBVCkgLSAxNik7CkBAIC0xNTUsNyArMTU1LDcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiB1MTYgZnQxMDAwX3JlYWRfZHByYW0oc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIGludCBvZmZzZXQpCiB7Ci0JRlQxMDAwX0lORk8gKmluZm8gPSAoRlQxMDAwX0lORk8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlGVDEwMDBfSU5GTyAqaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MTYgZGF0YTsKIApAQCAtMTg0LDcgKzE4NCw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgZnQxMDAwX3dyaXRlX2RwcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJCSAgaW50IG9mZnNldCwgdTE2IHZhbHVlKQogewotCUZUMTAwMF9JTkZPICppbmZvID0gKEZUMTAwMF9JTkZPICopIG5ldGRldl9wcml2KGRldik7CisJRlQxMDAwX0lORk8gKmluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkvLyBQcm92aWRlIG11dHVhbCBleGNsdXNpdmUgYWNjZXNzIHdoaWxlIHJlYWRpbmcgQVNJQyByZWdpc3RlcnMuCkBAIC0yMDgsNyArMjA4LDcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiB1MTYgZnQxMDAwX3JlYWRfZHByYW1fbWFnXzE2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBvZmZzZXQsIGludCBJbmRleCkKIHsKLQlGVDEwMDBfSU5GTyAqaW5mbyA9IChGVDEwMDBfSU5GTyAqKSBuZXRkZXZfcHJpdihkZXYpOworCUZUMTAwMF9JTkZPICppbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUxNiBkYXRhOwogCkBAIC0yNDIsNyArMjQyLDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmdDEwMDBfd3JpdGVfZHByYW1fbWFnXzE2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJCQkgaW50IG9mZnNldCwgdTE2IHZhbHVlLCBpbnQgSW5kZXgpCiB7Ci0JRlQxMDAwX0lORk8gKmluZm8gPSAoRlQxMDAwX0lORk8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlGVDEwMDBfSU5GTyAqaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8vIFByb3ZpZGUgbXV0dWFsIGV4Y2x1c2l2ZSBhY2Nlc3Mgd2hpbGUgcmVhZGluZyBBU0lDIHJlZ2lzdGVycy4KQEAgLTI3MCw3ICsyNzAsNyBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHUzMiBmdDEwMDBfcmVhZF9kcHJhbV9tYWdfMzIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG9mZnNldCkKIHsKLQlGVDEwMDBfSU5GTyAqaW5mbyA9IChGVDEwMDBfSU5GTyAqKSBuZXRkZXZfcHJpdihkZXYpOworCUZUMTAwMF9JTkZPICppbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUzMiBkYXRhOwogCkBAIC0yOTgsNyArMjk4LDcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiB2b2lkIGZ0MTAwMF93cml0ZV9kcHJhbV9tYWdfMzIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG9mZnNldCwgdTMyIHZhbHVlKQogewotCUZUMTAwMF9JTkZPICppbmZvID0gKEZUMTAwMF9JTkZPICopIG5ldGRldl9wcml2KGRldik7CisJRlQxMDAwX0lORk8gKmluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkvLyBQcm92aWRlIG11dHVhbCBleGNsdXNpdmUgYWNjZXNzIHdoaWxlIHJlYWRpbmcgQVNJQyByZWdpc3RlcnMuCkBAIC0zMjAsNyArMzIwLDcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBzdGF0aWMgdm9pZCBmdDEwMDBfZW5hYmxlX2ludGVycnVwdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlGVDEwMDBfSU5GTyAqaW5mbyA9IChGVDEwMDBfSU5GTyAqKSBuZXRkZXZfcHJpdihkZXYpOworCUZUMTAwMF9JTkZPICppbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1MTYgdGVtcHdvcmQ7CiAKIAlERUJVRygxLCAiZnQxMDAwX2h3OmZ0MTAwMF9lbmFibGVfaW50ZXJydXB0cygpXG4iKTsKQEAgLTM0NSw3ICszNDUsNyBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHN0YXRpYyB2b2lkIGZ0MTAwMF9kaXNhYmxlX2ludGVycnVwdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlGVDEwMDBfSU5GTyAqaW5mbyA9IChGVDEwMDBfSU5GTyAqKSBuZXRkZXZfcHJpdihkZXYpOworCUZUMTAwMF9JTkZPICppbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1MTYgdGVtcHdvcmQ7CiAKIAlERUJVRygxLCAiZnQxMDAwX2h3OiBmdDEwMDBfZGlzYWJsZV9pbnRlcnJ1cHRzKClcbiIpOwpAQCAtMzcwLDcgKzM3MCw3IEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogc3RhdGljIHZvaWQgZnQxMDAwX3Jlc2V0X2FzaWMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlGVDEwMDBfSU5GTyAqaW5mbyA9IChGVDEwMDBfSU5GTyAqKSBuZXRkZXZfcHJpdihkZXYpOworCUZUMTAwMF9JTkZPICppbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1MTYgdGVtcHdvcmQ7CiAKIAlERUJVRygxLCAiZnQxMDAwX2h3OmZ0MTAwMF9yZXNldF9hc2ljIGNhbGxlZFxuIik7CkBAIC00MTQsNyArNDE0LDcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBzdGF0aWMgaW50IGZ0MTAwMF9yZXNldF9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JRlQxMDAwX0lORk8gKmluZm8gPSAoRlQxMDAwX0lORk8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlGVDEwMDBfSU5GTyAqaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAJdTE2IHRlbXB3b3JkOwogCWludCBpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC02MTgsNyArNjE4LDcgQEAKIAlGVDEwMDBfSU5GTyAqaW5mbzsKIAlVU0hPUlQgdGVtcHdvcmQ7CiAKLQlpbmZvID0gKEZUMTAwMF9JTkZPICopIG5ldGRldl9wcml2KGRldik7CisJaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAKIAlpZiAoaW5mby0+Q2FyZFJlYWR5ID09IDEpIHsKIAkJLy8gUGVyZm9ybSBkc3AgaGVhcnRiZWF0IGNoZWNrCkBAIC04MzEsNyArODMxLDcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiB2b2lkIGZ0MTAwMF9zZW5kX2NtZCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2ICpwdGVtcGJ1ZmZlciwgaW50IHNpemUsIHUxNiBxdHlwZSkKIHsKLQlGVDEwMDBfSU5GTyAqaW5mbyA9IChGVDEwMDBfSU5GTyAqKSBuZXRkZXZfcHJpdihkZXYpOworCUZUMTAwMF9JTkZPICppbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgaTsKIAl1MTYgdGVtcHdvcmQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTkxNiw3ICs5MTYsNyBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIEJPT0xFQU4gZnQxMDAwX3JlY2VpdmVfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiAqIHBidWZmZXIsIGludCBtYXhzeiwgdTE2ICpwbnh0cGgpCiB7Ci0JRlQxMDAwX0lORk8gKmluZm8gPSAoRlQxMDAwX0lORk8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlGVDEwMDBfSU5GTyAqaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAJdTE2IHNpemU7CiAJdTE2ICpwcHNldWRvaGRyOwogCWludCBpOwpAQCAtMTAwOSw3ICsxMDA5LDcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiB2b2lkIGZ0MTAwMF9wcm9jX2Rydm1zZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCUZUMTAwMF9JTkZPICppbmZvID0gKEZUMTAwMF9JTkZPICopIG5ldGRldl9wcml2KGRldik7CisJRlQxMDAwX0lORk8gKmluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCXUxNiBtc2d0eXBlOwogCXUxNiB0ZW1wd29yZDsKIAlQTUVESUFNU0cgcG1lZGlhbXNnOwpAQCAtMTI5Miw3ICsxMjkyLDcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBpbnQgZnQxMDAwX3BhcnNlX2RwcmFtX21zZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCUZUMTAwMF9JTkZPICppbmZvID0gKEZUMTAwMF9JTkZPICopIG5ldGRldl9wcml2KGRldik7CisJRlQxMDAwX0lORk8gKmluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCXUxNiBkb29yYmVsbDsKIAl1MTYgcG9ydGlkOwogCXUxNiBueHRwaDsKQEAgLTE0NDksNyArMTQ0OSw3IEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogc3RhdGljIHZvaWQgZnQxMDAwX2ZsdXNoX2ZpZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IERydkVyck51bSkKIHsKLQlGVDEwMDBfSU5GTyAqaW5mbyA9IChGVDEwMDBfSU5GTyAqKSBuZXRkZXZfcHJpdihkZXYpOworCUZUMTAwMF9JTkZPICppbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1MTYgaTsKIAl1MzIgdGVtcGxvbmc7CiAJdTE2IHRlbXB3b3JkOwpAQCAtMTU5Niw3ICsxNTk2LDcgQEAKIGludCBmdDEwMDBfY29weV91cF9wa3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAl1MTYgdGVtcHdvcmQ7Ci0JRlQxMDAwX0lORk8gKmluZm8gPSAoRlQxMDAwX0lORk8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlGVDEwMDBfSU5GTyAqaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAJdTE2IGxlbjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXUxNiBpOwpAQCAtMTc4Myw3ICsxNzgzLDcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBpbnQgZnQxMDAwX2NvcHlfZG93bl9wa3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2ICogcGFja2V0LCB1MTYgbGVuKQogewotCUZUMTAwMF9JTkZPICppbmZvID0gKEZUMTAwMF9JTkZPICopIG5ldGRldl9wcml2KGRldik7CisJRlQxMDAwX0lORk8gKmluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCXVuaW9uIHsKIAkJUFNFVURPX0hEUiBibGs7CiAJCXUxNiBidWZmW3NpemVvZihQU0VVRE9fSERSKSA+PiAxXTsKQEAgLTE5NDMsNyArMTk0Myw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZnQxMDAwX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JRlQxMDAwX0lORk8gKmluZm8gPSAoRlQxMDAwX0lORk8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlGVDEwMDBfSU5GTyAqaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAJcmV0dXJuICgmaW5mby0+c3RhdHMpOwogfQogCkBAIC0xOTY3LDcgKzE5NjcsNyBAQAogCiBzdGF0aWMgaW50IGZ0MTAwMF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCUZUMTAwMF9JTkZPICppbmZvID0gKEZUMTAwMF9JTkZPICopIG5ldGRldl9wcml2KGRldik7CisJRlQxMDAwX0lORk8gKmluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJREVCVUcoMCwgImZ0MTAwMF9odzogZnQxMDAwX2Nsb3NlKClcbiIpOwogCkBAIC0xOTg5LDcgKzE5ODksNyBAQAogCiBzdGF0aWMgaW50IGZ0MTAwMF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JRlQxMDAwX0lORk8gKmluZm8gPSAoRlQxMDAwX0lORk8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlGVDEwMDBfSU5GTyAqaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAJdTggKnBkYXRhOwogCiAJREVCVUcoMSwgImZ0MTAwMF9odzogZnQxMDAwX3N0YXJ0X3htaXQoKVxuIik7CkBAIC0yMDI2LDcgKzIwMjYsNyBAQAogc3RhdGljIGlycXJldHVybl90IGZ0MTAwMF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXZfaWQ7Ci0JRlQxMDAwX0lORk8gKmluZm8gPSAoRlQxMDAwX0lORk8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlGVDEwMDBfSU5GTyAqaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAJdTE2IHRlbXB3b3JkOwogCXUxNiBpbnR0eXBlOwogCWludCBjbnQ7CkBAIC0yMDkxLDcgKzIwOTEsNyBAQAogCiB2b2lkIHN0b3BfZnQxMDAwX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlGVDEwMDBfSU5GTyAqaW5mbyA9IChGVDEwMDBfSU5GTyAqKSBuZXRkZXZfcHJpdihkZXYpOworCUZUMTAwMF9JTkZPICppbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlQUFJPVl9SRUNPUkQgcHRyOwogLy8JaW50IGNudDsKIApAQCAtMjEyNyw3ICsyMTI3LDcgQEAKIAkJCQkgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQogewogCUZUMTAwMF9JTkZPICpmdF9pbmZvOwotCWZ0X2luZm8gPSAoRlQxMDAwX0lORk8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlmdF9pbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCXNucHJpbnRmKGluZm8tPmRyaXZlciwgMzIsICJmdDEwMDAiKTsKIAlzbnByaW50ZihpbmZvLT5idXNfaW5mbywgRVRIVE9PTF9CVVNJTkZPX0xFTiwgIlBDTUNJQSAweCVseCIsCkBAIC0yMTM5LDcgKzIxMzksNyBAQAogc3RhdGljIHUzMiBmdDEwMDBfZ2V0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlGVDEwMDBfSU5GTyAqaW5mbzsKLQlpbmZvID0gKEZUMTAwMF9JTkZPICopIG5ldGRldl9wcml2KGRldik7CisJaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAJcmV0dXJuIGluZm8tPm1lZGlhc3RhdGU7CiB9CiAKQEAgLTIxODUsNyArMjE4NSw3IEBACiAJfQogCiAJU0VUX05FVERFVl9ERVYoZGV2LCBmZGV2KTsKLQlpbmZvID0gKEZUMTAwMF9JTkZPICopIG5ldGRldl9wcml2KGRldik7CisJaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAKIAltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKEZUMTAwMF9JTkZPKSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXBjbWNpYS9mdDEwMDBfcHJvYy5jIGIvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtcGNtY2lhL2Z0MTAwMF9wcm9jLmMKaW5kZXggYjQ1ZGU5Yi4uOTM1NjA4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtcGNtY2lhL2Z0MTAwMF9wcm9jLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtcGNtY2lhL2Z0MTAwMF9wcm9jLmMKQEAgLTY1LDcgKzY1LDcgQEAKIAl0aW1lX3QgZGVsdGE7CiAKIAlkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOwotCWluZm8gPSAoRlQxMDAwX0lORk8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCWlmIChvZmYgPiAwKSB7CiAJCSplb2YgPSAxOwpAQCAtMTc0LDcgKzE3NCw3IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHB0cjsKIAlGVDEwMDBfSU5GTyAqaW5mbzsKIAotCWluZm8gPSAoRlQxMDAwX0lORk8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCXN3aXRjaCAoZXZlbnQpIHsKIAljYXNlIE5FVERFVl9DSEFOR0VOQU1FOgpAQCAtMTk1LDcgKzE5NSw3IEBACiB7CiAJRlQxMDAwX0lORk8gKmluZm87CiAKLQlpbmZvID0gKEZUMTAwMF9JTkZPICopIG5ldGRldl9wcml2KGRldik7CisJaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAKIAlpbmZvLT5wcm9jX2Z0MTAwMCA9IHByb2NfbWtkaXIoRlQxMDAwX1BST0MsIGluaXRfbmV0LnByb2NfbmV0KTsKIAljcmVhdGVfcHJvY19yZWFkX2VudHJ5KGRldi0+bmFtZSwgMDY0NCwgaW5mby0+cHJvY19mdDEwMDAsCkBAIC0yMDgsNyArMjA4LDcgQEAKIHsKIAlGVDEwMDBfSU5GTyAqaW5mbzsKIAotCWluZm8gPSAoRlQxMDAwX0lORk8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCXJlbW92ZV9wcm9jX2VudHJ5KGRldi0+bmFtZSwgaW5mby0+cHJvY19mdDEwMDApOwogCXJlbW92ZV9wcm9jX2VudHJ5KEZUMTAwMF9QUk9DLCBpbml0X25ldC5wcm9jX25ldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvTWFrZWZpbGUKaW5kZXggZGQ4N2VjZC4uZjBmNTI0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9NYWtlZmlsZQpAQCAtMSwzICsxLDMgQEAKIG9iai0kKENPTkZJR19GVDEwMDBfVVNCKSArPSBmdDEwMDAubwogCi1mdDEwMDAteSA6PSBmdDEwMDBfY2hkZXYubyBmdDEwMDBfZG93bmxvYWQubyBmdDEwMDBfaHcubyBmdDEwMDBfcHJvYy5vIGZ0MTAwMF91c2IubworZnQxMDAwLXkgOj0gZnQxMDAwX2RlYnVnLm8gZnQxMDAwX2Rvd25sb2FkLm8gZnQxMDAwX2h3Lm8gZnQxMDAwX3Byb2MubyBmdDEwMDBfdXNiLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfY2hkZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfZGVidWcuYwpzaW1pbGFyaXR5IGluZGV4IDYxJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX2NoZGV2LmMKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfZGVidWcuYwppbmRleCAyMGQ1MDk4Li4xNDliYTU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX2NoZGV2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF9kZWJ1Zy5jCkBAIC0yNywzMyArMjcsMjIgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KICNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgotI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgotCisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgImZ0MTAwMF91c2IuaCIKLS8vI2luY2x1ZGUgImZ0MTAwMF9pb2N0bC5oIgogCiBzdGF0aWMgaW50IGZ0MTAwMF9mbGFyaW9uX2NudCA9IDA7CiAKLS8vbmVlZCB0byBsb29raW5nIHVzYWdlIG9mIGZ0MTAwMEhhbmRsZQotCi1zdGF0aWMgaW50IGZ0MTAwMF9DaE9wZW4gKHN0cnVjdCBpbm9kZSAqSW5vZGUsIHN0cnVjdCBmaWxlICpGaWxlKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZnQxMDAwX0NoUG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCk7Ci1zdGF0aWMgbG9uZyBmdDEwMDBfQ2hJb2N0bChzdHJ1Y3QgZmlsZSAqRmlsZSwgdW5zaWduZWQgaW50IENvbW1hbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIEFyZ3VtZW50KTsKLXN0YXRpYyBpbnQgZnQxMDAwX0NoUmVsZWFzZSAoc3RydWN0IGlub2RlICpJbm9kZSwgc3RydWN0IGZpbGUgKkZpbGUpOwotCi0vLyBHbG9iYWwgcG9pbnRlciB0byBkZXZpY2Ugb2JqZWN0Ci1zdGF0aWMgc3RydWN0IGZ0MTAwMF9kZXZpY2UgKnBkZXZvYmpbTUFYX05VTV9DQVJEUyArIDJdOwotLy9zdGF0aWMgZGV2ZnNfaGFuZGxlX3QgZnQxMDAwSGFuZGxlW01BWF9OVU1fQ0FSRFNdOworc3RhdGljIGludCBmdDEwMDBfb3BlbiAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIHVuc2lnbmVkIGludCBmdDEwMDBfcG9sbF9kZXYoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpOworc3RhdGljIGxvbmcgZnQxMDAwX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYXJndW1lbnQpOworc3RhdGljIGludCBmdDEwMDBfcmVsZWFzZSAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwogCiAvLyBMaXN0IHRvIGZyZWUgcmVjZWl2ZSBjb21tYW5kIGJ1ZmZlciBwb29sCiBzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVyY3Zwb29sOwpAQCAtNjMsMTAzICs1MiwxOCBAQAogCiBpbnQgbnVtb2Ztc2didWYgPSAwOwogCi0vLyBHbG9iYWwgdmFyaWFibGUgdG8gaW5kaWNhdGUgdGhhdCBhbGwgcHJvdmlzaW9uaW5nIGRhdGEgaXMgc2VudCB0byBEU1AKLS8vQk9PTEVBTiBmUHJvdkNvbXBsZXRlOwotCiAvLwogLy8gVGFibGUgb2YgZW50cnktcG9pbnQgcm91dGluZXMgZm9yIGNoYXIgZGV2aWNlCiAvLwogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZnQxMDAwZm9wcyA9CiB7Ci0JLnVubG9ja2VkX2lvY3RsCT0gZnQxMDAwX0NoSW9jdGwsCi0JLnBvbGwJCT0gZnQxMDAwX0NoUG9sbCwKLQkub3BlbgkJPSBmdDEwMDBfQ2hPcGVuLAotCS5yZWxlYXNlCT0gZnQxMDAwX0NoUmVsZWFzZSwKKwkudW5sb2NrZWRfaW9jdGwJPSBmdDEwMDBfaW9jdGwsCisJLnBvbGwJCT0gZnQxMDAwX3BvbGxfZGV2LAorCS5vcGVuCQk9IGZ0MTAwMF9vcGVuLAorCS5yZWxlYXNlCT0gZnQxMDAwX3JlbGVhc2UsCiAJLmxsc2VlawkJPSBub19sbHNlZWssCiB9OwogCi0KLQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRnVuY3Rpb246ICAgIGV4ZWNfbWtub2QKLS8vCi0vLyBQYXJhbWV0ZXJzOgotLy8KLS8vIFJldHVybnM6Ci0vLwotLy8gRGVzY3JpcHRpb246Ci0vLwotLy8gTm90ZXM6Ci0vLwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXN0YXRpYyBpbnQgZXhlY19ta25vZCAodm9pZCAqcGRhdGEpCi17Ci0Jc3RydWN0IGZ0MTAwMF9pbmZvICppbmZvOwotICAgIGNoYXIgbWpudW1bNF07Ci0gICAgY2hhciBtaW5vcm51bVs0XTsKLSAgICBjaGFyIHRlbXBbMzJdOwotICAgIGludCByZXRjb2RlOwotLy8gICAgaW50IGk7CQkJCQkvL2FlbGlhcyBbLV0gcmVhc29uIDogdW51c2VkIHZhcmlhYmxlCi0gICAgY2hhciAqZW52cFtdID0geyAiSE9NRT0vIiwgIlBBVEg9L3Vzci9iaW46L2JpbiIsIE5VTEwgfTsKLSAgICBjaGFyICphcmd2W109eyItbSA2NjYiLHRlbXAsImMiLG1qbnVtLG1pbm9ybnVtLE5VTEx9OwotCi0gICAgaW5mbyA9IHBkYXRhOwotICAgIERFQlVHKCJmdDEwMDBfY2hkZXY6ZXhlY19ta25vZCBpcyBjYWxsZWQgd2l0aCBtYWpvciBudW1iZXIgPSAlZFxuIiwgaW5mby0+RGV2aWNlTWFqb3IpOwotICAgIHNwcmludGYodGVtcCwgIiVzJXMiLCAiL2Rldi8iLCBpbmZvLT5EZXZpY2VOYW1lKSA7Ci0gICAgc3ByaW50Zihtam51bSwgIiVkIiwgaW5mby0+RGV2aWNlTWFqb3IpOwotICAgIHNwcmludGYobWlub3JudW0sICIlZCIsIGluZm8tPkNhcmROdW1iZXIpOwotCi0gICAgLy9jaGFyICphcmd2W109eyJta25vZCIsIi1tIDY2NiIsdGVtcCwiYyIsbWpudW0sbWlub3JudW0sTlVMTH07Ci0vLyAgICBjaGFyICphcmd2W109eyItbSA2NjYiLHRlbXAsImMiLG1qbnVtLG1pbm9ybnVtLE5VTEx9OwotCi0gICAgLy9mb3IgKGk9MDsgaTw3O2krKykKLSAgICAvLyAgICBERUJVRygiYXJndlslZF09JXNcbiIsIGksIGFyZ3ZbaV0pOwotCi0KLSAgICByZXRjb2RlID0gY2FsbF91c2VybW9kZWhlbHBlciAoIi9iaW4vbWtub2QiLCBhcmd2LCBlbnZwLCAxKTsKLSAgICBpZiAocmV0Y29kZSkgewotICAgICAgICBERUJVRygiZnQxMDAwX2NoZGV2OmV4ZWNfbWtub2QgZmFpbGVkIHRvIG1ha2UgdGhlIG5vZGU6IHJldGNvZGUgPSAlZFxuIiwgcmV0Y29kZSk7Ci0gICAgfQotCi0KLQotICAgIHJldHVybiByZXRjb2RlOwotCi19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBGdW5jdGlvbjogICAgcm1fbWtub2QKLS8vCi0vLyBEZXNjcmlwdGlvbjogVGhpcyBtb2R1bGUgcmVtb3ZlcyB0aGUgRlQxMDAwIGRldmljZSBmaWxlCi0vLwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXN0YXRpYyBpbnQgcm1fbWtub2QgKHZvaWQgKnBkYXRhKQotewotCi0Jc3RydWN0IGZ0MTAwMF9pbmZvICppbmZvOwotICAgIC8vY2hhciAqYXJndls0XT17InJtIiwgIi1mIiwgIi9kZXYvRlQxMDAwIiwgTlVMTH07Ci0gICAgaW50IHJldGNvZGU7Ci0gICAgY2hhciB0ZW1wWzMyXTsKLSAgICBjaGFyICphcmd2W109eyJybSIsICItZiIsIHRlbXAsIE5VTEx9OwotCi0JaW5mbyA9IChzdHJ1Y3QgZnQxMDAwX2luZm8gKilwZGF0YTsKLSAgICBERUJVRygiZnQxMDAwX2NoZGV2OnJtX21rbm9kIGlzIGNhbGxlZCBmb3IgZGV2aWNlICVzXG4iLCBpbmZvLT5EZXZpY2VOYW1lKTsKLSAgICBzcHJpbnRmKHRlbXAsICIlcyVzIiwgIi9kZXYvIiwgaW5mby0+RGV2aWNlTmFtZSkgOwotCi0vLyAgICBjaGFyICphcmd2W109eyJybSIsICItZiIsIHRlbXAsIE5VTEx9OwotCi0gICAgcmV0Y29kZSA9IGNhbGxfdXNlcm1vZGVoZWxwZXIgKCIvYmluL3JtIiwgYXJndiwgTlVMTCwgMSk7Ci0gICAgaWYgKHJldGNvZGUpIHsKLSAgICAgICAgREVCVUcoImZ0MTAwMF9jaGRldjpybV9ta25vZCBmYWlsZWQgdG8gcmVtb3ZlIHRoZSBub2RlOiByZXRjb2RlID0gJWRcbiIsIHJldGNvZGUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIERFQlVHKCJmdDEwMDBfY2hkZXY6cm1fbWtub2QgZG9uZSFcbiIpOwotCi0KLSAgICByZXR1cm4gcmV0Y29kZTsKLQotfQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEZ1bmN0aW9uOiAgICBmdDEwMDBfZ2V0X2J1ZmZlcgogLy8KQEAgLTIzMyw4MCArMTM3LDU1IEBACiAvLyBOb3RlczogICAgICAgT25seSBjYWxsZWQgYnkgaW5pdF9tb2R1bGUoKS4KIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaW50IGZ0MTAwMF9DcmVhdGVEZXZpY2Uoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmRldikKK2ludCBmdDEwMDBfY3JlYXRlX2RldihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbyA9IG5ldGRldl9wcml2KGRldi0+bmV0KTsKICAgICBpbnQgcmVzdWx0OwogICAgIGludCBpOwotICAgIHBpZF90IHBpZDsKKwlzdHJ1Y3QgZGVudHJ5ICpkaXIsICpmaWxlOworCXN0cnVjdCBmdDEwMDBfZGVidWdfZGlycyAqdG1wOwogCiAgICAgLy8gbWFrZSBhIG5ldyBkZXZpY2UgbmFtZQotICAgIHNwcmludGYoaW5mby0+RGV2aWNlTmFtZSwgIiVzJWQiLCAiRlQxMDAiLCBpbmZvLT5DYXJkTnVtYmVyKTsKKyAgICBzcHJpbnRmKGluZm8tPkRldmljZU5hbWUsICIlcyVkIiwgIkZUMTAwMF8iLCBpbmZvLT5DYXJkTnVtYmVyKTsKIAotICAgIC8vIERlbGV0ZSBhbnkgZXhpc3RpbmcgRlQxMDAwIG5vZGUKLSAgICBwaWQgPSBrZXJuZWxfdGhyZWFkIChybV9ta25vZCwodm9pZCAqKWluZm8sIDApOwotICAgIG1zbGVlcCgxMDAwKTsKLQotICAgIERFQlVHKCJmdDEwMDBfQ3JlYXRlRGV2aWNlOiBudW1iZXIgb2YgaW5zdGFuY2UgPSAlZFxuIiwgZnQxMDAwX2ZsYXJpb25fY250KTsKKyAgICBERUJVRygiJXM6IG51bWJlciBvZiBpbnN0YW5jZSA9ICVkXG4iLCBfX2Z1bmNfXywgZnQxMDAwX2ZsYXJpb25fY250KTsKICAgICBERUJVRygiRGV2aWNlQ3JlYXRlZCA9ICV4XG4iLCBpbmZvLT5EZXZpY2VDcmVhdGVkKTsKIAotICAgIC8vc2F2ZSB0aGUgZGV2aWNlIGluZm8gdG8gZ2xvYmFsIGFycmF5Ci0gICAgcGRldm9ialtpbmZvLT5DYXJkTnVtYmVyXSA9IGRldjsKLQotICAgIERFQlVHKCJmdDEwMDBfQ3JlYXRlRGV2aWNlOiAqKioqKipTQVZFRCBwZGV2b2JqWyVkXT0lcFxuIiwgaW5mby0+Q2FyZE51bWJlciwgcGRldm9ialtpbmZvLT5DYXJkTnVtYmVyXSk7CS8vYWVsaWFzIFsrXSByZWFzb246dXAKLQogICAgIGlmIChpbmZvLT5EZXZpY2VDcmVhdGVkKQogICAgIHsKLQlERUJVRygiZnQxMDAwX0NyZWF0ZURldmljZTogXCIlc1wiIGFscmVhZHkgcmVnaXN0ZXJlZFxuIiwgaW5mby0+RGV2aWNlTmFtZSk7CisJREVCVUcoIiVzOiBcIiVzXCIgYWxyZWFkeSByZWdpc3RlcmVkXG4iLCBfX2Z1bmNfXywgaW5mby0+RGV2aWNlTmFtZSk7CiAJcmV0dXJuIC1FSU87CiAgICAgfQogCiAKICAgICAvLyByZWdpc3RlciB0aGUgZGV2aWNlCi0gICAgREVCVUcoImZ0MTAwMF9DcmVhdGVEZXZpY2U6IFwiJXNcIiBkZXZpY2UgcmVnaXN0cmF0aW9uXG4iLCBpbmZvLT5EZXZpY2VOYW1lKTsKLSAgICBpbmZvLT5EZXZpY2VNYWpvciA9IDA7CisgICAgREVCVUcoIiVzOiBcIiVzXCIgZGVidWdmcyBkZXZpY2UgcmVnaXN0cmF0aW9uXG4iLCBfX2Z1bmNfXywgaW5mby0+RGV2aWNlTmFtZSk7CiAKLSAgICByZXN1bHQgPSByZWdpc3Rlcl9jaHJkZXYoaW5mby0+RGV2aWNlTWFqb3IsIGluZm8tPkRldmljZU5hbWUsICZmdDEwMDBmb3BzKTsKLSAgICBpZiAocmVzdWx0IDwgMCkKLSAgICB7Ci0JREVCVUcoImZ0MTAwMF9DcmVhdGVEZXZpY2U6IHVuYWJsZSB0byBnZXQgbWFqb3IgJWRcbiIsIGluZm8tPkRldmljZU1ham9yKTsKLQlyZXR1cm4gcmVzdWx0OwotICAgIH0KKwl0bXAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZnQxMDAwX2RlYnVnX2RpcnMpLCBHRlBfS0VSTkVMKTsKKwlpZiAodG1wID09IE5VTEwpIHsKKwkJcmVzdWx0ID0gLTE7CisJCWdvdG8gZmFpbDsKKwl9CiAKLSAgICBERUJVRygiZnQxMDAwX0NyZWF0ZURldmljZTogcmVnaXN0ZXJlZCBjaGFyIGRldmljZSBcIiVzXCJcbiIsIGluZm8tPkRldmljZU5hbWUpOworCWRpciA9IGRlYnVnZnNfY3JlYXRlX2RpcihpbmZvLT5EZXZpY2VOYW1lLCAwKTsKKwlpZiAoSVNfRVJSKGRpcikpIHsKKwkJcmVzdWx0ID0gUFRSX0VSUihkaXIpOworCQlnb3RvIGRlYnVnX2Rpcl9mYWlsOworCX0KIAotICAgIC8vIHNhdmUgYSBkeW5hbWljIGRldmljZSBtYWpvciBudW1iZXIKLSAgICBpZiAoaW5mby0+RGV2aWNlTWFqb3IgPT0gMCkKLSAgICB7Ci0JaW5mby0+RGV2aWNlTWFqb3IgPSByZXN1bHQ7Ci0JREVCVUcoImZ0MTAwMF9QY2RDcmVhdGVEZXZpY2U6IGRldmljZSBtYWpvciA9ICVkXG4iLCBpbmZvLT5EZXZpY2VNYWpvcik7Ci0gICAgfQorCWZpbGUgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJkZXZpY2UiLCBTX0lSVUdPIHwgU19JV1VTUiwgZGlyLAorCQkJCQlkZXYsICZmdDEwMDBmb3BzKTsKKwlpZiAoSVNfRVJSKGZpbGUpKSB7CisJCXJlc3VsdCA9IFBUUl9FUlIoZmlsZSk7CisJCWdvdG8gZGVidWdfZmlsZV9mYWlsOworCX0KIAotICAgIC8vIENyZWF0ZSBhIHRocmVhZCB0byBjYWxsIHVzZXIgbW9kZSBhcHAgdG8gbWtub2QKLSAgICBwaWQgPSBrZXJuZWxfdGhyZWFkIChleGVjX21rbm9kLCAodm9pZCAqKWluZm8sIDApOworCXRtcC0+ZGVudCA9IGRpcjsKKwl0bXAtPmZpbGUgPSBmaWxlOworCXRtcC0+aW50X251bWJlciA9IGluZm8tPkNhcmROdW1iZXI7CisJbGlzdF9hZGQoJih0bXAtPmxpc3QpLCAmKGluZm8tPm5vZGVzLmxpc3QpKTsKIAotICAgIC8vIGluaXRpYWxpemUgYXBwbGljYXRpb24gaW5mb3JtYXRpb24KLQotLy8gICAgaWYgKGZ0MTAwMF9mbGFyaW9uX2NudCA9PSAwKSB7Ci0vLwotLy8gICAgCSAgREVCVUcoIkluaXRpYWxpemUgZnJlZV9idWZmX2xvY2sgYW5kIGZyZWVyY3Zwb29sXG4iKTsKLS8vICAgICAgICBzcGluX2xvY2tfaW5pdCgmZnJlZV9idWZmX2xvY2spOwotLy8KLS8vICAgICAgICAvLyBpbml0aWFsaXplIGEgbGlzdCBvZiBidWZmZXJzIHRvIGJlIHVzZSBmb3IgcXVldWluZyB1cCByZWNlaXZlIGNvbW1hbmQgZGF0YQotLy8gICAgICAgIElOSVRfTElTVF9IRUFEICgmZnJlZXJjdnBvb2wpOwotLy8KLS8vICAgICAgICAvLyBjcmVhdGUgbGlzdCBvZiBmcmVlIGJ1ZmZlcnMKLS8vICAgICAgICBmb3IgKGk9MDsgaTxOVU1fT0ZfRlJFRV9CVUZGRVJTOyBpKyspIHsKLS8vICAgICAgICAgICAgLy8gR2V0IG1lbW9yeSBmb3IgRFBSQU1fREFUQSBsaW5rIGxpc3QKLS8vICAgICAgICAgICAgcGRwcmFtX2JsayA9IGttYWxsb2MgKCBzaXplb2Yoc3RydWN0IGRwcmFtX2JsayksIEdGUF9LRVJORUwgKTsKLS8vICAgICAgICAgICAgLy8gR2V0IGEgYmxvY2sgb2YgbWVtb3J5IHRvIHN0b3JlIGNvbW1hbmQgZGF0YQotLy8gICAgICAgICAgICBwZHByYW1fYmxrLT5wYnVmZmVyID0ga21hbGxvYyAoIE1BWF9DTURfU1FTSVpFLCBHRlBfS0VSTkVMICk7Ci0vLyAgICAgICAgICAgIC8vIGxpbmsgcHJvdmlzaW9uaW5nIGRhdGEKLS8vICAgICAgICAgICAgbGlzdF9hZGRfdGFpbCAoJnBkcHJhbV9ibGstPmxpc3QsICZmcmVlcmN2cG9vbCk7Ci0vLyAgICAgICAgfQotLy8gICAgICAgIG51bW9mbXNnYnVmID0gTlVNX09GX0ZSRUVfQlVGRkVSUzsKLS8vICAgIH0KLQorICAgIERFQlVHKCIlczogcmVnaXN0ZXJlZCBkZWJ1Z2ZzIGRpcmVjdG9yeSBcIiVzXCJcbiIsIF9fZnVuY19fLCBpbmZvLT5EZXZpY2VOYW1lKTsKIAogICAgIC8vIGluaXRpYWxpemUgYXBwbGljYXRpb24gaW5mb3JtYXRpb24KICAgICBpbmZvLT5hcHBjbnQgPSAwOwpAQCAtMzIzLDE3ICsyMDIsMTcgQEAKICAgICAgICAgSU5JVF9MSVNUX0hFQUQgKCZpbmZvLT5hcHBfaW5mb1tpXS5hcHBfc3FsaXN0KTsKICAgICB9CiAKLQotCi0KLS8vICAgIGZ0MTAwMEhhbmRsZVtpbmZvLT5DYXJkTnVtYmVyXSA9IGRldmZzX3JlZ2lzdGVyKE5VTEwsIGluZm8tPkRldmljZU5hbWUsIERFVkZTX0ZMX0FVVE9fREVWTlVNLCAwLCAwLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU19JRkNIUiB8IFNfSVJVR08gfCBTX0lXVUdPLCAmZnQxMDAwZm9wcywgTlVMTCk7Ci0KLQogICAgIGluZm8tPkRldmljZUNyZWF0ZWQgPSBUUlVFOwogICAgIGZ0MTAwMF9mbGFyaW9uX2NudCsrOwogCi0gICAgcmV0dXJuIHJlc3VsdDsKKwlyZXR1cm4gMDsKKworZGVidWdfZmlsZV9mYWlsOgorCWRlYnVnZnNfcmVtb3ZlKGRpcik7CitkZWJ1Z19kaXJfZmFpbDoKKwlrZnJlZSh0bXApOworZmFpbDoKKwlyZXR1cm4gcmVzdWx0OwogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMzQ2LDI3ICsyMjUsMzMgQEAKIC8vIE5vdGVzOiAgICAgICBPbmx5IGNhbGxlZCBieSBjbGVhbnVwX21vZHVsZSgpLgogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi12b2lkIGZ0MTAwMF9EZXN0cm95RGV2aWNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit2b2lkIGZ0MTAwMF9kZXN0cm95X2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbyA9IG5ldGRldl9wcml2KGRldik7Ci0gICAgaW50IHJlc3VsdCA9IDA7Ci0gICAgcGlkX3QgcGlkOwogCQlpbnQgaTsKIAlzdHJ1Y3QgZHByYW1fYmxrICpwZHByYW1fYmxrOwogCXN0cnVjdCBkcHJhbV9ibGsgKnB0cjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MsICpxOworCXN0cnVjdCBmdDEwMDBfZGVidWdfZGlycyAqZGlyOwogCi0gICAgREVCVUcoImZ0MTAwMF9jaGRldjpmdDEwMDBfRGVzdHJveURldmljZSBjYWxsZWRcbiIpOworICAgIERFQlVHKCIlcyBjYWxsZWRcbiIsIF9fZnVuY19fKTsKIAogCiAKICAgICBpZiAoaW5mby0+RGV2aWNlQ3JlYXRlZCkKIAl7CiAgICAgICAgIGZ0MTAwMF9mbGFyaW9uX2NudC0tOwotCQl1bnJlZ2lzdGVyX2NocmRldihpbmZvLT5EZXZpY2VNYWpvciwgaW5mby0+RGV2aWNlTmFtZSk7Ci0JCURFQlVHKCJmdDEwMDBfRGVzdHJveURldmljZTogdW5yZWdpc3RlcmVkIGRldmljZSBcIiVzXCIsIHJlc3VsdCA9ICVkXG4iLAotCQkJCQkgICBpbmZvLT5EZXZpY2VOYW1lLCByZXN1bHQpOwotCi0gICAgICAgcGlkID0ga2VybmVsX3RocmVhZCAocm1fbWtub2QsICh2b2lkICopaW5mbywgMCk7CisJCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHEsICZpbmZvLT5ub2Rlcy5saXN0KSB7CisJCQlkaXIgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IGZ0MTAwMF9kZWJ1Z19kaXJzLCBsaXN0KTsKKwkJCWlmIChkaXItPmludF9udW1iZXIgPT0gaW5mby0+Q2FyZE51bWJlcikgeworCQkJCWRlYnVnZnNfcmVtb3ZlKGRpci0+ZmlsZSk7CisJCQkJZGVidWdmc19yZW1vdmUoZGlyLT5kZW50KTsKKwkJCQlsaXN0X2RlbChwb3MpOworCQkJCWtmcmVlKGRpcik7CisJCQl9CisJCX0KKwkJREVCVUcoIiVzOiB1bnJlZ2lzdGVyZWQgZGV2aWNlIFwiJXNcIlxuIiwgX19mdW5jX18sCisJCQkJCSAgIGluZm8tPkRldmljZU5hbWUpOwogCiAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBmcmVlIGFueSBtZW1vcnkgcmVzZXJ2ZSBmb3Igc2xvdyBRdWV1ZQogICAgICAgICBmb3IgKGk9MDsgaTxNQVhfTlVNX0FQUDsgaSsrKSB7CkBAIC0zODgsMTkgKzI3MywxNCBAQAogICAgICAgICAgICAgICAgIGtmcmVlKHB0cik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQotLy8gICAgICAgIGRldmZzX3VucmVnaXN0ZXIoZnQxMDAwSGFuZGxlW2luZm8tPkNhcmROdW1iZXJdKTsKLQogCQlpbmZvLT5EZXZpY2VDcmVhdGVkID0gRkFMU0U7Ci0KLQkJcGRldm9ialtpbmZvLT5DYXJkTnVtYmVyXSA9IE5VTEw7CiAJfQogCiAKIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEZ1bmN0aW9uOiAgICBmdDEwMDBfQ2hPcGVuCisvLyBGdW5jdGlvbjogICAgZnQxMDAwX29wZW4KIC8vCiAvLyBQYXJhbWV0ZXJzOgogLy8KQEAgLTQwOSwyOCArMjg5LDE5IEBACiAvLyBOb3RlczoKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotc3RhdGljIGludCBmdDEwMDBfQ2hPcGVuIChzdHJ1Y3QgaW5vZGUgKklub2RlLCBzdHJ1Y3QgZmlsZSAqRmlsZSkKK3N0YXRpYyBpbnQgZnQxMDAwX29wZW4gKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZGV2ID0gKHN0cnVjdCBmdDEwMDBfZGV2aWNlICopaW5vZGUtPmlfcHJpdmF0ZTsKICAgICBpbnQgaSxudW07CiAKLSAgICBERUJVRygiZnQxMDAwX0NoT3BlbiBjYWxsZWRcbiIpOwotICAgIG51bSA9IChNSU5PUihJbm9kZS0+aV9yZGV2KSAmIDB4Zik7Ci0gICAgREVCVUcoImZ0MTAwMF9DaE9wZW46IG1pbm9yIG51bWJlcj0lZFxuIiwgbnVtKTsKKyAgICBERUJVRygiJXMgY2FsbGVkXG4iLCBfX2Z1bmNfXyk7CisgICAgbnVtID0gKE1JTk9SKGlub2RlLT5pX3JkZXYpICYgMHhmKTsKKyAgICBERUJVRygiZnQxMDAwX29wZW46IG1pbm9yIG51bWJlcj0lZFxuIiwgbnVtKTsKIAotICAgIGZvciAoaT0wOyBpPDU7IGkrKykKLSAgICAgICAgREVCVUcoInBkZXZvYmpbJWRdPSVwXG4iLCBpLCBwZGV2b2JqW2ldKTsgLy9hZWxpYXMgWytdIHJlYXNvbjogZG93bgorCWluZm8gPSBmaWxlLT5wcml2YXRlX2RhdGEgPSBuZXRkZXZfcHJpdihkZXYtPm5ldCk7CiAKLSAgICBpZiAoIHBkZXZvYmpbbnVtXSAhPSBOVUxMICkKLSAgICAgICAgLy9pbmZvID0gKHN0cnVjdCBmdDEwMDBfaW5mbyAqKShwZGV2b2JqW251bV0tPm5ldC0+cHJpdik7Ci0JCWluZm8gPSAoc3RydWN0IGZ0MTAwMF9pbmZvICopbmV0ZGV2X3ByaXYocGRldm9ialtudW1dLT5uZXQpOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIERFQlVHKCJmdDEwMDBfQ2hPcGVuOiBjYW4gbm90IGZpbmQgZGV2aWNlIG9iamVjdCAlZFxuIiwgbnVtKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIERFQlVHKCJmX293bmVyID0gJXAgbnVtYmVyIG9mIGFwcGxpY2F0aW9uID0gJWRcbiIsICgmRmlsZS0+Zl9vd25lciksIGluZm8tPmFwcGNudCApOworICAgIERFQlVHKCJmX293bmVyID0gJXAgbnVtYmVyIG9mIGFwcGxpY2F0aW9uID0gJWRcbiIsICgmZmlsZS0+Zl9vd25lciksIGluZm8tPmFwcGNudCApOwogCiAgICAgLy8gQ2hlY2sgaWYgbWF4aW11bSBudW1iZXIgb2YgYXBwbGljYXRpb24gZXhjZWVkZWQKICAgICBpZiAoaW5mby0+YXBwY250ID4gTUFYX05VTV9BUFApIHsKQEAgLTQ1MiwyMSArMzIzLDE5IEBACiAgICAgfQogCiAgICAgaW5mby0+YXBwY250Kys7Ci0gICAgaW5mby0+YXBwX2luZm9baV0uZmlsZW9iamVjdCA9ICZGaWxlLT5mX293bmVyOworICAgIGluZm8tPmFwcF9pbmZvW2ldLmZpbGVvYmplY3QgPSAmZmlsZS0+Zl9vd25lcjsKICAgICBpbmZvLT5hcHBfaW5mb1tpXS5uVHhNc2cgPSAwOwogICAgIGluZm8tPmFwcF9pbmZvW2ldLm5SeE1zZyA9IDA7CiAgICAgaW5mby0+YXBwX2luZm9baV0ublR4TXNnUmVqZWN0ID0gMDsKICAgICBpbmZvLT5hcHBfaW5mb1tpXS5uUnhNc2dNaXNzID0gMDsKIAotICAgIEZpbGUtPnByaXZhdGVfZGF0YSA9IHBkZXZvYmpbbnVtXS0+bmV0OwotCi0Jbm9uc2Vla2FibGVfb3BlbihJbm9kZSwgRmlsZSk7CisJbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7CiAgICAgcmV0dXJuIDA7CiB9CiAKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEZ1bmN0aW9uOiAgICBmdDEwMDBfQ2hQb2xsCisvLyBGdW5jdGlvbjogICAgZnQxMDAwX3BvbGxfZGV2CiAvLwogLy8gUGFyYW1ldGVyczoKIC8vCkBAIC00NzYsNDcgKzM0NSw0NyBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZnQxMDAwX0NoUG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZnQxMDAwX3BvbGxfZGV2KHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQogewogICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGZ0MTAwMF9pbmZvICppbmZvOwogICAgIGludCBpOwogCi0gICAgLy9ERUJVRygiZnQxMDAwX0NoUG9sbCBjYWxsZWRcbiIpOworICAgIC8vREVCVUcoImZ0MTAwMF9wb2xsX2RldiBjYWxsZWRcbiIpOwogICAgIGlmIChmdDEwMDBfZmxhcmlvbl9jbnQgPT0gMCkgewotICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9DaFBvbGwgY2FsbGVkIHdoZW4gZnQxMDAwX2ZsYXJpb25fY250IGlzIHplcm9cbiIpOworICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9wb2xsX2RldiBjYWxsZWQgd2hlbiBmdDEwMDBfZmxhcmlvbl9jbnQgaXMgemVyb1xuIik7CiAgICAgICAgIHJldHVybiAoLUVCQURGKTsKICAgICB9CiAKLQlpbmZvID0gKHN0cnVjdCBmdDEwMDBfaW5mbyAqKSBuZXRkZXZfcHJpdihkZXYpOworCWluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCiAgICAgLy8gU2VhcmNoIGZvciBtYXRjaGluZyBmaWxlIG9iamVjdAogICAgIGZvciAoaT0wOyBpPE1BWF9OVU1fQVBQOyBpKyspIHsKICAgICAgICAgaWYgKCBpbmZvLT5hcHBfaW5mb1tpXS5maWxlb2JqZWN0ID09ICZmaWxlLT5mX293bmVyKSB7Ci0gICAgICAgICAgICAvL0RFQlVHKCJGVDEwMDA6ZnQxMDAwX0NoSW9jdGw6IE1lc3NhZ2UgaXMgZm9yIEFwcElkID0gJWRcbiIsIGluZm8tPmFwcF9pbmZvW2ldLmFwcF9pZCk7CisgICAgICAgICAgICAvL0RFQlVHKCJGVDEwMDA6ZnQxMDAwX2lvY3RsOiBNZXNzYWdlIGlzIGZvciBBcHBJZCA9ICVkXG4iLCBpbmZvLT5hcHBfaW5mb1tpXS5hcHBfaWQpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvLyBDb3VsZCBub3QgZmluZCBhcHBsaWNhdGlvbiBpbmZvIGJsb2NrCiAgICAgaWYgKGkgPT0gTUFYX05VTV9BUFApIHsKLSAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfQ2hJb2N0bDpDb3VsZCBub3QgZmluZCBhcHBsaWNhdGlvbiBpbmZvIGJsb2NrXG4iKTsKKyAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfaW9jdGw6Q291bGQgbm90IGZpbmQgYXBwbGljYXRpb24gaW5mbyBibG9ja1xuIik7CiAgICAgICAgIHJldHVybiAoIC1FQUNDRVMgKTsKICAgICB9CiAKICAgICBpZiAobGlzdF9lbXB0eSgmaW5mby0+YXBwX2luZm9baV0uYXBwX3NxbGlzdCkgPT0gMCkgewotICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9DaFBvbGw6TWVzc2FnZSBkZXRlY3RlZCBpbiBzbG93IHF1ZXVlXG4iKTsKKyAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfcG9sbF9kZXY6TWVzc2FnZSBkZXRlY3RlZCBpbiBzbG93IHF1ZXVlXG4iKTsKICAgICAgICAgcmV0dXJuKFBPTExJTiB8IFBPTExSRE5PUk0gfCBQT0xMUFJJKTsKICAgICB9CiAKICAgICBwb2xsX3dhaXQgKGZpbGUsICZpbmZvLT5hcHBfaW5mb1tpXS53YWl0X2RwcmFtX21zZywgd2FpdCk7Ci0gICAgLy9ERUJVRygiRlQxMDAwOmZ0MTAwMF9DaFBvbGw6UG9sbGluZyBmb3IgZGF0YSBmcm9tIERTUFxuIik7CisgICAgLy9ERUJVRygiRlQxMDAwOmZ0MTAwMF9wb2xsX2RldjpQb2xsaW5nIGZvciBkYXRhIGZyb20gRFNQXG4iKTsKIAogICAgIHJldHVybiAoMCk7CiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBGdW5jdGlvbjogICAgZnQxMDAwX0NoSW9jdGwKKy8vIEZ1bmN0aW9uOiAgICBmdDEwMDBfaW9jdGwKIC8vCiAvLyBQYXJhbWV0ZXJzOgogLy8KQEAgLTUyNSwxMSArMzk0LDEwIEBACiAvLyBOb3RlczoKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotc3RhdGljIGxvbmcgZnQxMDAwX0NoSW9jdGwgKHN0cnVjdCBmaWxlICpGaWxlLCB1bnNpZ25lZCBpbnQgQ29tbWFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgQXJndW1lbnQpCitzdGF0aWMgbG9uZyBmdDEwMDBfaW9jdGwgKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYXJndW1lbnQpCiB7Ci0gICAgdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilBcmd1bWVudDsKLSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworICAgIHZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJndW1lbnQ7CiAJc3RydWN0IGZ0MTAwMF9pbmZvICppbmZvOwogICAgIHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXY7CiAgICAgaW50IHJlc3VsdD0wOwpAQCAtNTUwLDI1ICs0MTgsMjQgQEAKICAgICB1bnNpZ25lZCBzaG9ydCBsZWRTdGF0PTA7CiAgICAgdW5zaWduZWQgc2hvcnQgY29uU3RhdD0wOwogCi0gICAgLy9ERUJVRygiZnQxMDAwX0NoSW9jdGwgY2FsbGVkXG4iKTsKKyAgICAvL0RFQlVHKCJmdDEwMDBfaW9jdGwgY2FsbGVkXG4iKTsKIAogICAgIGlmIChmdDEwMDBfZmxhcmlvbl9jbnQgPT0gMCkgewotICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9DaElvY3RsIGNhbGxlZCB3aGVuIGZ0MTAwMF9mbGFyaW9uX2NudCBpcyB6ZXJvXG4iKTsKKyAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfaW9jdGwgY2FsbGVkIHdoZW4gZnQxMDAwX2ZsYXJpb25fY250IGlzIHplcm9cbiIpOwogICAgICAgICByZXR1cm4gKC1FQkFERik7CiAgICAgfQogCi0gICAgLy9ERUJVRygiRlQxMDAwOmZ0MTAwMF9DaElvY3RsOkNvbW1hbmQgPSAweCV4IEFyZ3VtZW50ID0gMHglOHhcbiIsIENvbW1hbmQsICh1MzIpQXJndW1lbnQpOworICAgIC8vREVCVUcoIkZUMTAwMDpmdDEwMDBfaW9jdGw6Y29tbWFuZCA9IDB4JXggYXJndW1lbnQgPSAweCU4eFxuIiwgY29tbWFuZCwgKHUzMilhcmd1bWVudCk7CiAKLSAgICBkZXYgPSBGaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW5mbyA9IChzdHJ1Y3QgZnQxMDAwX2luZm8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKLSAgICBmdDEwMDBkZXYgPSBpbmZvLT5wRnQxMDAwRGV2OwotICAgIGNtZCA9IF9JT0NfTlIoQ29tbWFuZCk7Ci0gICAgLy9ERUJVRygiRlQxMDAwOmZ0MTAwMF9DaElvY3RsOmNtZCA9IDB4JXhcbiIsIGNtZCk7CisJaW5mbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlmdDEwMDBkZXYgPSBpbmZvLT5wRnQxMDAwRGV2OworICAgIGNtZCA9IF9JT0NfTlIoY29tbWFuZCk7CisgICAgLy9ERUJVRygiRlQxMDAwOmZ0MTAwMF9pb2N0bDpjbWQgPSAweCV4XG4iLCBjbWQpOwogCiAgICAgLy8gcHJvY2VzcyB0aGUgY29tbWFuZAogICAgIHN3aXRjaCAoY21kKSB7CiAgICAgY2FzZSBJT0NUTF9SRUdJU1RFUl9DTUQ6Ci0gICAgICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9DaElvY3RsOiBJT0NUTF9GVDEwMDBfUkVHSVNURVIgY2FsbGVkXG4iKTsKKyAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZnQxMDAwX2lvY3RsOiBJT0NUTF9GVDEwMDBfUkVHSVNURVIgY2FsbGVkXG4iKTsKICAgICAgICAgICAgIHJlc3VsdCA9IGdldF91c2VyKHRlbXB3b3JkLCAoX191MTYgX191c2VyKilhcmdwKTsKICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICBERUJVRygicmVzdWx0ID0gJWQgZmFpbGVkIHRvIGdldF91c2VyXG4iLCByZXN1bHQpOwpAQCAtNTc3LDkgKzQ0NCw5IEBACiAgICAgICAgICAgICBpZiAodGVtcHdvcmQgPT0gRFNQQkNNU0dJRCkgewogICAgICAgICAgICAgICAgIC8vIFNlYXJjaCBmb3IgbWF0Y2hpbmcgZmlsZSBvYmplY3QKICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxNQVhfTlVNX0FQUDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggaW5mby0+YXBwX2luZm9baV0uZmlsZW9iamVjdCA9PSAmRmlsZS0+Zl9vd25lcikgeworICAgICAgICAgICAgICAgICAgICBpZiAoIGluZm8tPmFwcF9pbmZvW2ldLmZpbGVvYmplY3QgPT0gJmZpbGUtPmZfb3duZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmFwcF9pbmZvW2ldLkRzcEJDTXNnRmxhZyA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9DaElvY3RsOlJlZ2lzdGVyZWQgZm9yIGJyb2FkY2FzdCBtZXNzYWdlc1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9pb2N0bDpSZWdpc3RlcmVkIGZvciBicm9hZGNhc3QgbWVzc2FnZXNcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC01ODcsMzQgKzQ1NCwzNCBAQAogICAgICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIElPQ1RMX0dFVF9WRVJfQ01EOgotICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9DaElvY3RsOiBJT0NUTF9GVDEwMDBfR0VUX1ZFUiBjYWxsZWRcbiIpOworICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9pb2N0bDogSU9DVExfRlQxMDAwX0dFVF9WRVIgY2FsbGVkXG4iKTsKIAogICAgICAgICBnZXRfdmVyX2RhdGEuZHJ2X3ZlciA9IEZUMTAwMF9EUlZfVkVSOwogCiAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmdldF92ZXJfZGF0YSwgc2l6ZW9mKGdldF92ZXJfZGF0YSkpICkgewotICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfQ2hJb2N0bDogY29weSBmYXVsdCBvY2N1cnJlZFxuIik7CisgICAgICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9pb2N0bDogY29weSBmYXVsdCBvY2N1cnJlZFxuIik7CiAgICAgICAgICAgICByZXN1bHQgPSAtRUZBVUxUOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9DaElvY3RsOmRyaXZlciB2ZXJzaW9uID0gMHgleFxuIiwodW5zaWduZWQgaW50KWdldF92ZXJfZGF0YS5kcnZfdmVyKTsKKyAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfaW9jdGw6ZHJpdmVyIHZlcnNpb24gPSAweCV4XG4iLCh1bnNpZ25lZCBpbnQpZ2V0X3Zlcl9kYXRhLmRydl92ZXIpOwogCiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgSU9DVExfQ09OTkVDVDoKICAgICAgICAgLy8gQ29ubmVjdCBNZXNzYWdlCi0gICAgICAgIERFQlVHKCJGVDEwMDA6ZnQxMDAwX0NoSW9jdGw6IElPQ1RMX0ZUMTAwMF9DT05ORUNUXG4iKTsKKyAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfaW9jdGw6IElPQ1RMX0ZUMTAwMF9DT05ORUNUXG4iKTsKICAgICAgICAgQ29ubmVjdGlvbk1zZ1s3OV0gPSAweGZjOwogCQkJICAgQ2FyZFNlbmRDb21tYW5kKGZ0MTAwMGRldiwgKHVuc2lnbmVkIHNob3J0ICopQ29ubmVjdGlvbk1zZywgMHg0Yyk7CiAKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBJT0NUTF9ESVNDT05ORUNUOgogICAgICAgICAvLyBEaXNjb25uZWN0IE1lc3NhZ2UKLSAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfQ2hJb2N0bDogSU9DVExfRlQxMDAwX0RJU0NPTk5FQ1RcbiIpOworICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9pb2N0bDogSU9DVExfRlQxMDAwX0RJU0NPTk5FQ1RcbiIpOwogICAgICAgICBDb25uZWN0aW9uTXNnWzc5XSA9IDB4ZmQ7CiAJCQkgICBDYXJkU2VuZENvbW1hbmQoZnQxMDAwZGV2LCAodW5zaWduZWQgc2hvcnQgKilDb25uZWN0aW9uTXNnLCAweDRjKTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBJT0NUTF9HRVRfRFNQX1NUQVRfQ01EOgotICAgICAgICAvL0RFQlVHKCJGVDEwMDA6ZnQxMDAwX0NoSW9jdGw6IElPQ1RMX0ZUMTAwMF9HRVRfRFNQX1NUQVQgY2FsbGVkXG4iKTsKKyAgICAgICAgLy9ERUJVRygiRlQxMDAwOmZ0MTAwMF9pb2N0bDogSU9DVExfRlQxMDAwX0dFVF9EU1BfU1RBVCBjYWxsZWRcbiIpOwogCW1lbXNldCgmZ2V0X3N0YXRfZGF0YSwgMCwgc2l6ZW9mKGdldF9zdGF0X2RhdGEpKTsKICAgICAgICAgbWVtY3B5KGdldF9zdGF0X2RhdGEuRHNwVmVyLCBpbmZvLT5Ec3BWZXIsIERTUFZFUlNaKTsKICAgICAgICAgbWVtY3B5KGdldF9zdGF0X2RhdGEuSHdTZXJOdW0sIGluZm8tPkh3U2VyTnVtLCBIV1NFUk5VTVNaKTsKQEAgLTYyMiwxMiArNDg5LDEyIEBACiAgICAgICAgIG1lbWNweShnZXRfc3RhdF9kYXRhLmV1aTY0LCBpbmZvLT5ldWk2NCwgRVVJU1opOwogCiAgICAgICAgICAgICBpZiAoaW5mby0+UHJvZ0NvblN0YXQgIT0gMHhGRikgewotICAgICAgICAgICAgICAgIGZ0MTAwMF9yZWFkX2RwcmFtMTYoZnQxMDAwZGV2LCBGVDEwMDBfTUFHX0RTUF9MRUQsIChQVUNIQVIpJmxlZFN0YXQsIEZUMTAwMF9NQUdfRFNQX0xFRF9JTkRYKTsKKyAgICAgICAgICAgICAgICBmdDEwMDBfcmVhZF9kcHJhbTE2KGZ0MTAwMGRldiwgRlQxMDAwX01BR19EU1BfTEVELCAodTggKikmbGVkU3RhdCwgRlQxMDAwX01BR19EU1BfTEVEX0lORFgpOwogICAgICAgICAgICAgICAgIGdldF9zdGF0X2RhdGEuTGVkU3RhdCA9IG50b2hzKGxlZFN0YXQpOwotICAgICAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZnQxMDAwX0NoSW9jdGw6IExlZFN0YXQgPSAweCV4XG4iLCBnZXRfc3RhdF9kYXRhLkxlZFN0YXQpOwotICAgICAgICAgICAgICAgIGZ0MTAwMF9yZWFkX2RwcmFtMTYoZnQxMDAwZGV2LCBGVDEwMDBfTUFHX0RTUF9DT05fU1RBVEUsIChQVUNIQVIpJmNvblN0YXQsIEZUMTAwMF9NQUdfRFNQX0NPTl9TVEFURV9JTkRYKTsKKyAgICAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9pb2N0bDogTGVkU3RhdCA9IDB4JXhcbiIsIGdldF9zdGF0X2RhdGEuTGVkU3RhdCk7CisgICAgICAgICAgICAgICAgZnQxMDAwX3JlYWRfZHByYW0xNihmdDEwMDBkZXYsIEZUMTAwMF9NQUdfRFNQX0NPTl9TVEFURSwgKHU4ICopJmNvblN0YXQsIEZUMTAwMF9NQUdfRFNQX0NPTl9TVEFURV9JTkRYKTsKICAgICAgICAgICAgICAgICBnZXRfc3RhdF9kYXRhLkNvblN0YXQgPSBudG9ocyhjb25TdGF0KTsKLSAgICAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9DaElvY3RsOiBDb25TdGF0ID0gMHgleFxuIiwgZ2V0X3N0YXRfZGF0YS5Db25TdGF0KTsKKyAgICAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9pb2N0bDogQ29uU3RhdCA9IDB4JXhcbiIsIGdldF9zdGF0X2RhdGEuQ29uU3RhdCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICBnZXRfc3RhdF9kYXRhLkNvblN0YXQgPSAweDBmOwpAQCAtNjQyLDcgKzUwOSw3IEBACiAgICAgICAgIGdldF9zdGF0X2RhdGEuQ29uVG0gPSAodTMyKSh0di50dl9zZWMgLSBpbmZvLT5Db25UbSk7CiAgICAgICAgIERFQlVHKCJDb25uZWN0aW9uIFRpbWUgPSAlZFxuIiwgKGludClnZXRfc3RhdF9kYXRhLkNvblRtKTsKICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmZ2V0X3N0YXRfZGF0YSwgc2l6ZW9mKGdldF9zdGF0X2RhdGEpKSApIHsKLSAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZnQxMDAwX0NoSW9jdGw6IGNvcHkgZmF1bHQgb2NjdXJyZWRcbiIpOworICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfaW9jdGw6IGNvcHkgZmF1bHQgb2NjdXJyZWRcbiIpOwogICAgICAgICAgICAgcmVzdWx0ID0gLUVGQVVMVDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC02NTAsMTcgKzUxNywxNyBAQAogICAgICAgICBicmVhazsKICAgICBjYXNlIElPQ1RMX1NFVF9EUFJBTV9DTUQ6CiAgICAgICAgIHsKLSAgICAgICAgICAgIElPQ1RMX0RQUkFNX0JMSyAqZHByYW1fZGF0YTsKKyAgICAgICAgICAgIElPQ1RMX0RQUkFNX0JMSyAqZHByYW1fZGF0YSA9IE5VTEw7CiAgICAgICAgICAgICAvL0lPQ1RMX0RQUkFNX0NPTU1BTkQgZHByYW1fY29tbWFuZDsKLSAgICAgICAgICAgIFVTSE9SVCBxdHlwZTsKLSAgICAgICAgICAgIFVTSE9SVCBtc2dzejsKKyAgICAgICAgICAgIHUxNiBxdHlwZTsKKyAgICAgICAgICAgIHUxNiBtc2dzejsKIAkJc3RydWN0IHBzZXVkb19oZHIgKnBwc2V1ZG9faGRyOwotICAgICAgICAgICAgUFVTSE9SVCBwbXNnOwotICAgICAgICAgICAgVVNIT1JUIHRvdGFsX2xlbjsKLSAgICAgICAgICAgIFVTSE9SVCBhcHBfaW5kZXg7CisgICAgICAgICAgICB1MTYgKnBtc2c7CisgICAgICAgICAgICB1MTYgdG90YWxfbGVuOworICAgICAgICAgICAgdTE2IGFwcF9pbmRleDsKICAgICAgICAgICAgIHUxNiBzdGF0dXM7CiAKLSAgICAgICAgICAgIC8vREVCVUcoIkZUMTAwMDpmdDEwMDBfQ2hJb2N0bDogSU9DVExfRlQxMDAwX1NFVF9EUFJBTSBjYWxsZWRcbiIpOworICAgICAgICAgICAgLy9ERUJVRygiRlQxMDAwOmZ0MTAwMF9pb2N0bDogSU9DVExfRlQxMDAwX1NFVF9EUFJBTSBjYWxsZWRcbiIpOwogCiAKICAgICAgICAgICAgIGlmIChmdDEwMDBfZmxhcmlvbl9jbnQgPT0gMCkgewpAQCAtNjc5LDE1ICs1NDYsMTUgQEAKIAogICAgICAgICAgICAgaWYgKGluZm8tPkNhcmRSZWFkeSkgewogCi0gICAgICAgICAgICAgICAvL0RFQlVHKCJGVDEwMDA6ZnQxMDAwX0NoSW9jdGw6IHRyeSB0byBTRVRfRFBSQU0gXG4iKTsKKyAgICAgICAgICAgICAgIC8vREVCVUcoIkZUMTAwMDpmdDEwMDBfaW9jdGw6IHRyeSB0byBTRVRfRFBSQU0gXG4iKTsKIAogICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbGVuZ3RoIGZpZWxkIHRvIHNlZSBob3cgbWFueSBieXRlcyB0byBjb3B5CiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZ2V0X3VzZXIobXNnc3osIChfX3UxNiBfX3VzZXIgKilhcmdwKTsKICAgICAgICAgICAgICAgICBtc2dzeiA9IG50b2hzIChtc2dzeik7Ci0gICAgICAgICAgICAgICAgLy9ERUJVRygiRlQxMDAwOmZ0MTAwMF9DaElvY3RsOiBsZW5ndGggb2YgbWVzc2FnZSA9ICVkXG4iLCBtc2dzeik7CisgICAgICAgICAgICAgICAgLy9ERUJVRygiRlQxMDAwOmZ0MTAwMF9pb2N0bDogbGVuZ3RoIG9mIG1lc3NhZ2UgPSAlZFxuIiwgbXNnc3opOwogCiAgICAgICAgICAgICAgICAgaWYgKG1zZ3N6ID4gTUFYX0NNRF9TUVNJWkUpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfQ2hJb2N0bDogYmFkIG1lc3NhZ2UgbGVuZ3RoID0gJWRcbiIsIG1zZ3N6KTsKKyAgICAgICAgICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfaW9jdGw6IGJhZCBtZXNzYWdlIGxlbmd0aCA9ICVkXG4iLCBtc2dzeik7CiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IC1FSU5WQUw7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KQEAgLTY5NywyMiArNTY0LDE0IEBACiAJCWlmICghZHByYW1fZGF0YSkKIAkJCWJyZWFrOwogCi0gICAgICAgICAgICAgICAgLy9pZiAoIGNvcHlfZnJvbV91c2VyKCYoZHByYW1fY29tbWFuZC5kcHJhbV9ibGspLCAoUElPQ1RMX0RQUkFNX0JMSylBcmd1bWVudCwgbXNnc3orMikgKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCBjb3B5X2Zyb21fdXNlcigmZHByYW1fZGF0YSwgYXJncCwgbXNnc3orMikgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBjb3B5X2Zyb21fdXNlcihkcHJhbV9kYXRhLCBhcmdwLCBtc2dzeisyKSApIHsKICAgICAgICAgICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfQ2hJb2N0bDogY29weSBmYXVsdCBvY2N1cnJlZFxuIik7CiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IC1FRkFVTFQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewotI2lmIDAKLSAgICAgICAgICAgICAgICAgICAgLy8gd2hjIC0gZm9yIGRlYnVnZ2luZyBvbmx5Ci0gICAgICAgICAgICAgICAgICAgIHB0ciA9IChjaGFyICopJmRwcmFtX2RhdGE7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPG1zZ3N6OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHKDEsIkZUMTAwMDpmdDEwMDBfQ2hJb2N0bDogZGF0YSAlZCA9IDB4JXhcbiIsIGksICpwdHIrKyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSNlbmRpZgogICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIG1lc3NhZ2UgY2FtZSBmcm9tIGEgcmVnaXN0ZXJlZCBhcHBsaWNhdGlvbgogICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxNQVhfTlVNX0FQUDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGluZm8tPmFwcF9pbmZvW2ldLmZpbGVvYmplY3QgPT0gJkZpbGUtPmZfb3duZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaW5mby0+YXBwX2luZm9baV0uZmlsZW9iamVjdCA9PSAmZmlsZS0+Zl9vd25lcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CkBAIC03MjUsMTYgKzU4NCwxNSBAQAogICAgICAgICAgICAgICAgICAgICBhcHBfaW5kZXggPSBpOwogCiAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIG1lc3NhZ2UgcXR5cGUgdHlwZSB3aGljaCBpcyB0aGUgbG93ZXIgYnl0ZSB3aXRoaW4gcW9zX2NsYXNzCi0gICAgICAgICAgICAgICAgICAgIC8vcXR5cGUgPSBudG9ocyhkcHJhbV9jb21tYW5kLmRwcmFtX2Jsay5wc2V1ZG9oZHIucW9zX2NsYXNzKSAmIDB4ZmY7CiAgICAgICAgICAgICAgICAgICAgIHF0eXBlID0gbnRvaHMoZHByYW1fZGF0YS0+cHNldWRvaGRyLnFvc19jbGFzcykgJiAweGZmOwotICAgICAgICAgICAgICAgICAgICAvL0RFQlVHKCJGVDEwMDBfZnQxMDAwX0NoSW9jdGw6IHF0eXBlID0gJWRcbiIsIHF0eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgLy9ERUJVRygiRlQxMDAwX2Z0MTAwMF9pb2N0bDogcXR5cGUgPSAlZFxuIiwgcXR5cGUpOwogICAgICAgICAgICAgICAgICAgICBpZiAocXR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFB1dCBtZXNzYWdlIGludG8gU2xvdyBRdWV1ZQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBwdXQgYSBtZXNzYWdlIGludG8gdGhlIERQUkFNIGlmIG1zZyBkb29yYmVsbCBpcyBhdmFpbGFibGUKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGZ0MTAwMF9yZWFkX3JlZ2lzdGVyKGZ0MTAwMGRldiwgJnRlbXB3b3JkLCBGVDEwMDBfUkVHX0RPT1JCRUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vREVCVUcoIkZUMTAwMF9mdDEwMDBfQ2hJb2N0bDogUkVBRCBSRUdJU1RFUiB0ZW1wd29yZD0leFxuIiwgdGVtcHdvcmQpOworICAgICAgICAgICAgICAgICAgICAgICAgLy9ERUJVRygiRlQxMDAwX2Z0MTAwMF9pb2N0bDogUkVBRCBSRUdJU1RFUiB0ZW1wd29yZD0leFxuIiwgdGVtcHdvcmQpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXB3b3JkICYgRlQxMDAwX0RCX0RQUkFNX1RYKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3VzcGVuZCBmb3IgMm1zIGFuZCB0cnkgYWdhaW4gZHVlIHRvIERTUCBkb29yYmVsbCBidXN5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWRlbGF5KDIpOwpAQCAtNzUwLDcgKzYwOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWRlbGF5KDMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGZ0MTAwMF9yZWFkX3JlZ2lzdGVyKGZ0MTAwMGRldiwgJnRlbXB3b3JkLCBGVDEwMDBfUkVHX0RPT1JCRUxMKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVtcHdvcmQgJiBGVDEwMDBfREJfRFBSQU1fVFgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfQ2hJb2N0bDpEb29yYmVsbCBub3QgYXZhaWxhYmxlXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfaW9jdGw6RG9vcmJlbGwgbm90IGF2YWlsYWJsZVxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IC1FTk9UVFk7CiAJCQkJCQlrZnJlZShkcHJhbV9kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC03NjAsMTMgKzYxOCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgLy9ERUJVRygiRlQxMDAwX2Z0MTAwMF9DaElvY3RsOiBmaW5pc2hlZCByZWFkaW5nIHJlZ2lzdGVyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vREVCVUcoIkZUMTAwMF9mdDEwMDBfaW9jdGw6IGZpbmlzaGVkIHJlYWRpbmcgcmVnaXN0ZXJcbiIpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgYXJlIHdpdGhpbiB0aGUgbGltaXRzIG9mIHRoZSBzbG93IHF1ZXVlIG1lbW9yeSBsaW1pdGF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChtc2dzeiA8IE1BWF9DTURfU1FTSVpFKSAmJiAobXNnc3ogPiBQU0VVRE9TWikgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBwdXQgc2VxdWVuY2UgbnVtYmVyIHBsdXMgbmV3IGNoZWNrc3VtIGZvciBtZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wbXNnID0gKFBVU0hPUlQpJmRwcmFtX2NvbW1hbmQuZHByYW1fYmxrLnBzZXVkb2hkcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbXNnID0gKFBVU0hPUlQpJmRwcmFtX2RhdGEtPnBzZXVkb2hkcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbXNnID0gKHUxNiAqKSZkcHJhbV9kYXRhLT5wc2V1ZG9oZHI7CiAJCQkJcHBzZXVkb19oZHIgPSAoc3RydWN0IHBzZXVkb19oZHIgKilwbXNnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX2xlbiA9IG1zZ3N6KzI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvdGFsX2xlbiAmIDB4MSkgewpAQCAtNzg1LDE3ICs2NDIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbXNnKys7CiAJCQkJcHBzZXVkb19oZHIgPSAoc3RydWN0IHBzZXVkb19oZHIgKilwbXNnOwotI2lmIDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIgPSBkcHJhbV9kYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZnQxMDAwX0NoSW9jdGw6IENvbW1hbmQgU2VuZFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8dG90YWxfbGVuOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfQ2hJb2N0bDogZGF0YSAlZCA9IDB4JXhcbiIsIGksICpwdHIrKyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kcHJhbV9jb21tYW5kLmV4dHJhID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vQ2FyZFNlbmRDb21tYW5kKGZ0MTAwMGRldiwodW5zaWduZWQgY2hhciopJmRwcmFtX2NvbW1hbmQsdG90YWxfbGVuKzIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcmRTZW5kQ29tbWFuZChmdDEwMDBkZXYsKHVuc2lnbmVkIHNob3J0KilkcHJhbV9kYXRhLHRvdGFsX2xlbisyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcmRTZW5kQ29tbWFuZChmdDEwMDBkZXYsKHVuc2lnbmVkIHNob3J0KilkcHJhbV9kYXRhLHRvdGFsX2xlbisyKTsKIAogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+YXBwX2luZm9bYXBwX2luZGV4XS5uVHhNc2crKzsKQEAgLTgwNyw3ICs2NTQsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZnQxMDAwX0NoSW9jdGw6IENhcmQgbm90IHJlYWR5IHRha2UgbWVzc2FnZXNcbiIpOworICAgICAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZnQxMDAwX2lvY3RsOiBDYXJkIG5vdCByZWFkeSB0YWtlIG1lc3NhZ2VzXG4iKTsKICAgICAgICAgICAgICAgICByZXN1bHQgPSAtRUFDQ0VTOwogICAgICAgICAgICAgfQogCSAgICBrZnJlZShkcHJhbV9kYXRhKTsKQEAgLTgyMCw3ICs2NjcsNyBAQAogICAgICAgICAgICAgSU9DVExfRFBSQU1fQkxLIF9fdXNlciAqcGlvY3RsX2RwcmFtOwogICAgICAgICAgICAgaW50IG1zZ2xlbjsKIAotICAgICAgICAgICAgLy9ERUJVRygiRlQxMDAwOmZ0MTAwMF9DaElvY3RsOiBJT0NUTF9GVDEwMDBfR0VUX0RQUkFNIGNhbGxlZFxuIik7CisgICAgICAgICAgICAvL0RFQlVHKCJGVDEwMDA6ZnQxMDAwX2lvY3RsOiBJT0NUTF9GVDEwMDBfR0VUX0RQUkFNIGNhbGxlZFxuIik7CiAKICAgICAgICAgICAgIGlmIChmdDEwMDBfZmxhcmlvbl9jbnQgPT0gMCkgewogICAgICAgICAgICAgICAgIHJldHVybiAoLUVCQURGKTsKQEAgLTgyOCwxNSArNjc1LDE1IEBACiAKICAgICAgICAgICAgIC8vIFNlYXJjaCBmb3IgbWF0Y2hpbmcgZmlsZSBvYmplY3QKICAgICAgICAgICAgIGZvciAoaT0wOyBpPE1BWF9OVU1fQVBQOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoIGluZm8tPmFwcF9pbmZvW2ldLmZpbGVvYmplY3QgPT0gJkZpbGUtPmZfb3duZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgLy9ERUJVRygiRlQxMDAwOmZ0MTAwMF9DaElvY3RsOiBNZXNzYWdlIGlzIGZvciBBcHBJZCA9ICVkXG4iLCBpbmZvLT5hcHBfaW5mb1tpXS5hcHBfaWQpOworICAgICAgICAgICAgICAgIGlmICggaW5mby0+YXBwX2luZm9baV0uZmlsZW9iamVjdCA9PSAmZmlsZS0+Zl9vd25lcikgeworICAgICAgICAgICAgICAgICAgICAvL0RFQlVHKCJGVDEwMDA6ZnQxMDAwX2lvY3RsOiBNZXNzYWdlIGlzIGZvciBBcHBJZCA9ICVkXG4iLCBpbmZvLT5hcHBfaW5mb1tpXS5hcHBfaWQpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIENvdWxkIG5vdCBmaW5kIGFwcGxpY2F0aW9uIGluZm8gYmxvY2sKICAgICAgICAgICAgIGlmIChpID09IE1BWF9OVU1fQVBQKSB7Ci0gICAgICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfQ2hJb2N0bDpDb3VsZCBub3QgZmluZCBhcHBsaWNhdGlvbiBpbmZvIGJsb2NrXG4iKTsKKyAgICAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9pb2N0bDpDb3VsZCBub3QgZmluZCBhcHBsaWNhdGlvbiBpbmZvIGJsb2NrXG4iKTsKICAgICAgICAgICAgICAgICByZXN1bHQgPSAtRUJBREY7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC04NDQsMjIgKzY5MSwyMiBAQAogICAgICAgICAgICAgcmVzdWx0ID0gMDsKICAgICAgICAgICAgIHBpb2N0bF9kcHJhbSA9IGFyZ3A7CiAgICAgICAgICAgICBpZiAobGlzdF9lbXB0eSgmaW5mby0+YXBwX2luZm9baV0uYXBwX3NxbGlzdCkgPT0gMCkgewotICAgICAgICAgICAgICAgIC8vREVCVUcoIkZUMTAwMDpmdDEwMDBfQ2hJb2N0bDpNZXNzYWdlIGRldGVjdGVkIGluIHNsb3cgcXVldWVcbiIpOworICAgICAgICAgICAgICAgIC8vREVCVUcoIkZUMTAwMDpmdDEwMDBfaW9jdGw6TWVzc2FnZSBkZXRlY3RlZCBpbiBzbG93IHF1ZXVlXG4iKTsKICAgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmZnJlZV9idWZmX2xvY2ssIGZsYWdzKTsKICAgICAgICAgICAgICAgICBwZHByYW1fYmxrID0gbGlzdF9lbnRyeShpbmZvLT5hcHBfaW5mb1tpXS5hcHBfc3FsaXN0Lm5leHQsIHN0cnVjdCBkcHJhbV9ibGssIGxpc3QpOwogICAgICAgICAgICAgICAgIGxpc3RfZGVsKCZwZHByYW1fYmxrLT5saXN0KTsKICAgICAgICAgICAgICAgICBpbmZvLT5hcHBfaW5mb1tpXS5OdW1PZk1zZy0tOwotICAgICAgICAgICAgICAgIC8vREVCVUcoIkZUMTAwMDpmdDEwMDBfQ2hJb2N0bDpOdW1PZk1zZyBmb3IgYXBwICVkID0gJWRcbiIsIGksIGluZm8tPmFwcF9pbmZvW2ldLk51bU9mTXNnKTsKKyAgICAgICAgICAgICAgICAvL0RFQlVHKCJGVDEwMDA6ZnQxMDAwX2lvY3RsOk51bU9mTXNnIGZvciBhcHAgJWQgPSAlZFxuIiwgaSwgaW5mby0+YXBwX2luZm9baV0uTnVtT2ZNc2cpOwogICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZyZWVfYnVmZl9sb2NrLCBmbGFncyk7CiAgICAgICAgICAgICAgICAgbXNnbGVuID0gbnRvaHMoKih1MTYgKilwZHByYW1fYmxrLT5wYnVmZmVyKSArIFBTRVVET1NaOwogICAgICAgICAgICAgICAgIHJlc3VsdCA9IGdldF91c2VyKG1zZ2xlbiwgJnBpb2N0bF9kcHJhbS0+dG90YWxfbGVuKTsKIAkJaWYgKHJlc3VsdCkKIAkJCWJyZWFrOwogCQltc2dsZW4gPSBodG9ucyhtc2dsZW4pOwotICAgICAgICAgICAgICAgIC8vREVCVUcoIkZUMTAwMDpmdDEwMDBfQ2hJb2N0bDptc2cgbGVuZ3RoID0gJXhcbiIsIG1zZ2xlbik7CisgICAgICAgICAgICAgICAgLy9ERUJVRygiRlQxMDAwOmZ0MTAwMF9pb2N0bDptc2cgbGVuZ3RoID0gJXhcbiIsIG1zZ2xlbik7CiAgICAgICAgICAgICAgICAgaWYoY29weV90b191c2VyICgmcGlvY3RsX2RwcmFtLT5wc2V1ZG9oZHIsIHBkcHJhbV9ibGstPnBidWZmZXIsIG1zZ2xlbikpCiAJCQkJewotCQkJCQlERUJVRygiRlQxMDAwOmZ0MTAwMF9DaElvY3RsOiBjb3B5IGZhdWx0IG9jY3VycmVkXG4iKTsKKwkJCQkJREVCVUcoIkZUMTAwMDpmdDEwMDBfaW9jdGw6IGNvcHkgZmF1bHQgb2NjdXJyZWRcbiIpOwogCSAgICAgICAgICAgICAJcmVzdWx0ID0gLUVGQVVMVDsKIAkgICAgICAgICAgICAgCWJyZWFrOwogCQkJCX0KQEAgLTg2NywxMiArNzE0LDEyIEBACiAgICAgICAgICAgICAgICAgZnQxMDAwX2ZyZWVfYnVmZmVyKHBkcHJhbV9ibGssICZmcmVlcmN2cG9vbCk7CiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbXNnbGVuOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9ERUJVRygiRlQxMDAwOmZ0MTAwMF9DaElvY3RsOiBJT0NUTF9GVDEwMDBfR0VUX0RQUkFNIG5vIG1lc3NhZ2VcbiIpOworICAgICAgICAgICAgLy9ERUJVRygiRlQxMDAwOmZ0MTAwMF9pb2N0bDogSU9DVExfRlQxMDAwX0dFVF9EUFJBTSBubyBtZXNzYWdlXG4iKTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKIAogICAgIGRlZmF1bHQ6Ci0gICAgICAgIERFQlVHKCJGVDEwMDA6ZnQxMDAwX0NoSW9jdGw6dW5rbm93biBjb21tYW5kOiAweCV4XG4iLCBDb21tYW5kKTsKKyAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfaW9jdGw6dW5rbm93biBjb21tYW5kOiAweCV4XG4iLCBjb21tYW5kKTsKICAgICAgICAgcmVzdWx0ID0gLUVOT1RUWTsKICAgICAgICAgYnJlYWs7CiAgICAgfQpAQCAtODgxLDcgKzcyOCw3IEBACiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBGdW5jdGlvbjogICAgZnQxMDAwX0NoUmVsZWFzZQorLy8gRnVuY3Rpb246ICAgIGZ0MTAwMF9yZWxlYXNlCiAvLwogLy8gUGFyYW1ldGVyczoKIC8vCkBAIC04OTAsMTcgKzczNywxNyBAQAogLy8gTm90ZXM6CiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXN0YXRpYyBpbnQgZnQxMDAwX0NoUmVsZWFzZSAoc3RydWN0IGlub2RlICpJbm9kZSwgc3RydWN0IGZpbGUgKkZpbGUpCitzdGF0aWMgaW50IGZ0MTAwMF9yZWxlYXNlIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3QgZnQxMDAwX2luZm8gKmluZm87CiAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKICAgICBpbnQgaTsKIAlzdHJ1Y3QgZHByYW1fYmxrICpwZHByYW1fYmxrOwogCi0gICAgREVCVUcoImZ0MTAwMF9DaFJlbGVhc2UgY2FsbGVkXG4iKTsKKyAgICBERUJVRygiZnQxMDAwX3JlbGVhc2UgY2FsbGVkXG4iKTsKIAotICAgIGRldiA9IEZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbmZvID0gKHN0cnVjdCBmdDEwMDBfaW5mbyAqKSBuZXRkZXZfcHJpdihkZXYpOworICAgIGRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogICAgIGlmIChmdDEwMDBfZmxhcmlvbl9jbnQgPT0gMCkgewogICAgICAgICBpbmZvLT5hcHBjbnQtLTsKQEAgLTkwOSw4ICs3NTYsOCBAQAogCiAgICAgLy8gU2VhcmNoIGZvciBtYXRjaGluZyBmaWxlIG9iamVjdAogICAgIGZvciAoaT0wOyBpPE1BWF9OVU1fQVBQOyBpKyspIHsKLSAgICAgICAgaWYgKCBpbmZvLT5hcHBfaW5mb1tpXS5maWxlb2JqZWN0ID09ICZGaWxlLT5mX293bmVyKSB7Ci0gICAgICAgICAgICAvL0RFQlVHKCJGVDEwMDA6ZnQxMDAwX0NoSW9jdGw6IE1lc3NhZ2UgaXMgZm9yIEFwcElkID0gJWRcbiIsIGluZm8tPmFwcF9pbmZvW2ldLmFwcF9pZCk7CisgICAgICAgIGlmICggaW5mby0+YXBwX2luZm9baV0uZmlsZW9iamVjdCA9PSAmZmlsZS0+Zl9vd25lcikgeworICAgICAgICAgICAgLy9ERUJVRygiRlQxMDAwOmZ0MTAwMF9pb2N0bDogTWVzc2FnZSBpcyBmb3IgQXBwSWQgPSAlZFxuIiwgaW5mby0+YXBwX2luZm9baV0uYXBwX2lkKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF9kb3dubG9hZC5jIGIvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF9kb3dubG9hZC5jCmluZGV4IDRkZDQ1NmYuLjE3NTQ2ZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfZG93bmxvYWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX2Rvd25sb2FkLmMKQEAgLTEyMywxMSArMTIzLDExIEBACiAvLyBOb3RlczoKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotc3RhdGljIFVMT05HIGNoZWNrX3VzYl9kYiAoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldikKK3N0YXRpYyB1MzIgY2hlY2tfdXNiX2RiIChzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2KQogewogICAgaW50ICAgICAgICAgICAgICAgbG9vcGNudDsKLSAgIFVTSE9SVCAgICAgICAgICAgIHRlbXA7Ci0gICBVTE9ORyAgICAgICAgICAgICBzdGF0dXM7CisgICB1MTYgICAgICAgICAgICB0ZW1wOworICAgdTMyICAgICAgICAgICAgIHN0YXR1czsKIAogICAgbG9vcGNudCA9IDA7CiAgICB3aGlsZSAobG9vcGNudCA8IDEwKQpAQCAtMTkwLDcgKzE5MCw3IEBACiAvLyBGdW5jdGlvbjogICAgZ2V0X2hhbmRzaGFrZQogLy8KIC8vIFBhcmFtZXRlcnM6ICBzdHJ1Y3QgZnQxMDAwX2RldmljZSAgLSBkZXZpY2Ugc3RydWN0dXJlCi0vLyAgICAgICAgICAgICAgVVNIT1JUIGV4cGVjdGVkX3ZhbHVlIC0gdGhlIGhhbmRzaGFrZSB2YWx1ZSBleHBlY3RlZAorLy8gICAgICAgICAgICAgIHUxNiBleHBlY3RlZF92YWx1ZSAtIHRoZSBoYW5kc2hha2UgdmFsdWUgZXhwZWN0ZWQKIC8vCiAvLyBSZXR1cm5zOiAgICAgaGFuZHNoYWtldmFsdWUgLSBzdWNjZXNzCiAvLyAgICAgICAgICAgICAgSEFORFNIQUtFX1RJTUVPVVRfVkFMVUUgLSBmYWlsdXJlCkBAIC0yMDAsMTEgKzIwMCwxMSBAQAogLy8gTm90ZXM6CiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXN0YXRpYyBVU0hPUlQgZ2V0X2hhbmRzaGFrZShzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCBVU0hPUlQgZXhwZWN0ZWRfdmFsdWUpCitzdGF0aWMgdTE2IGdldF9oYW5kc2hha2Uoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgdTE2IGV4cGVjdGVkX3ZhbHVlKQogewotICAgVVNIT1JUICAgICAgICAgICAgaGFuZHNoYWtlOworICAgdTE2ICAgICAgICAgICAgaGFuZHNoYWtlOwogICAgaW50ICAgICAgICAgICAgICAgbG9vcGNudDsKLSAgIFVMT05HICAgICAgICAgICAgIHN0YXR1cz0wOworICAgdTMyICAgICAgICAgICAgIHN0YXR1cz0wOwogCXN0cnVjdCBmdDEwMDBfaW5mbyAqcGZ0MTAwMGluZm8gPSBuZXRkZXZfcHJpdihmdDEwMDBkZXYtPm5ldCk7CiAKICAgIGxvb3BjbnQgPSAwOwpAQCAtMjI4LDcgKzIyOCw3IEBACiAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gZnQxMDAwX3dyaXRlX3JlZ2lzdGVyIChmdDEwMDBkZXYsICBGVDEwMDBfREJfRE5MRF9SWCwgRlQxMDAwX1JFR19ET09SQkVMTCk7CiAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTE2IChmdDEwMDBkZXYsIERXTkxEX01BRzFfSEFORFNIQUtFX0xPQywgKFBVQ0hBUikmaGFuZHNoYWtlLCAxKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTE2IChmdDEwMDBkZXYsIERXTkxEX01BRzFfSEFORFNIQUtFX0xPQywgKHU4ICopJmhhbmRzaGFrZSwgMSk7CiAgICAgICAgICAgICAgICAgLy9ERUJVRygiZ2V0X2hhbmRzaGFrZTogaGFuZHNoYWtlIGlzICV4XG4iLCB0ZW1weCk7CiAgICAgICAgICAgICAgICAgaGFuZHNoYWtlID0gbnRvaHMoaGFuZHNoYWtlKTsKICAgICAgICAgICAgICAgICAvL0RFQlVHKCJnZXRfaGFuZHNoYWtlOiBhZnRlciBzd2FwLCBoYW5kc2hha2UgaXMgJXhcbiIsIGhhbmRzaGFrZSk7CkBAIC0yNTksNyArMjU5LDcgQEAKIC8vIEZ1bmN0aW9uOiAgICBwdXRfaGFuZHNoYWtlCiAvLwogLy8gUGFyYW1ldGVyczogIHN0cnVjdCBmdDEwMDBfZGV2aWNlICAtIGRldmljZSBzdHJ1Y3R1cmUKLS8vICAgICAgICAgICAgICBVU0hPUlQgaGFuZHNoYWtlX3ZhbHVlIC0gaGFuZHNoYWtlIHRvIGJlIHdyaXR0ZW4KKy8vICAgICAgICAgICAgICB1MTYgaGFuZHNoYWtlX3ZhbHVlIC0gaGFuZHNoYWtlIHRvIGJlIHdyaXR0ZW4KIC8vCiAvLyBSZXR1cm5zOiAgICAgbm9uZQogLy8KQEAgLTI2OSwzMCArMjY5LDMwIEBACiAvLyBOb3RlczoKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotc3RhdGljIHZvaWQgcHV0X2hhbmRzaGFrZShzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LFVTSE9SVCBoYW5kc2hha2VfdmFsdWUpCitzdGF0aWMgdm9pZCBwdXRfaGFuZHNoYWtlKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsdTE2IGhhbmRzaGFrZV92YWx1ZSkKIHsKLSAgICBVTE9ORyB0ZW1weDsKLSAgICBVU0hPUlQgdGVtcHdvcmQ7Ci0gICAgVUxPTkcgc3RhdHVzOworICAgIHUzMiB0ZW1weDsKKyAgICB1MTYgdGVtcHdvcmQ7CisgICAgdTMyIHN0YXR1czsKIAogCiAKLSAgICAgICAgdGVtcHggPSAoVUxPTkcpaGFuZHNoYWtlX3ZhbHVlOworICAgICAgICB0ZW1weCA9ICh1MzIpaGFuZHNoYWtlX3ZhbHVlOwogICAgICAgICB0ZW1weCA9IG50b2hsKHRlbXB4KTsKIAotICAgICAgICB0ZW1wd29yZCA9IChVU0hPUlQpKHRlbXB4ICYgMHhmZmZmKTsKKyAgICAgICAgdGVtcHdvcmQgPSAodTE2KSh0ZW1weCAmIDB4ZmZmZik7CiAgICAgICAgIHN0YXR1cyA9IGZ0MTAwMF93cml0ZV9kcHJhbTE2IChmdDEwMDBkZXYsIERXTkxEX01BRzFfSEFORFNIQUtFX0xPQywgdGVtcHdvcmQsIDApOwotICAgICAgICB0ZW1wd29yZCA9IChVU0hPUlQpKHRlbXB4ID4+IDE2KTsKKyAgICAgICAgdGVtcHdvcmQgPSAodTE2KSh0ZW1weCA+PiAxNik7CiAgICAgICAgIHN0YXR1cyA9IGZ0MTAwMF93cml0ZV9kcHJhbTE2IChmdDEwMDBkZXYsIERXTkxEX01BRzFfSEFORFNIQUtFX0xPQywgdGVtcHdvcmQsIDEpOwogICAgICAgICBzdGF0dXMgPSBmdDEwMDBfd3JpdGVfcmVnaXN0ZXIoZnQxMDAwZGV2LCBGVDEwMDBfREJfRE5MRF9UWCwgRlQxMDAwX1JFR19ET09SQkVMTCk7CiB9CiAKLXN0YXRpYyBVU0hPUlQgZ2V0X2hhbmRzaGFrZV91c2Ioc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgVVNIT1JUIGV4cGVjdGVkX3ZhbHVlKQorc3RhdGljIHUxNiBnZXRfaGFuZHNoYWtlX3VzYihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCB1MTYgZXhwZWN0ZWRfdmFsdWUpCiB7Ci0gICBVU0hPUlQgICAgICAgICAgICBoYW5kc2hha2U7CisgICB1MTYgICAgICAgICAgICBoYW5kc2hha2U7CiAgICBpbnQgICAgICAgICAgICAgICBsb29wY250OwotICAgVVNIT1JUICAgICAgICAgICAgdGVtcDsKLSAgIFVMT05HICAgICAgICAgICAgIHN0YXR1cz0wOworICAgdTE2ICAgICAgICAgICAgdGVtcDsKKyAgIHUzMiAgICAgICAgICAgICBzdGF0dXM9MDsKIAogCXN0cnVjdCBmdDEwMDBfaW5mbyAqcGZ0MTAwMGluZm8gPSBuZXRkZXZfcHJpdihmdDEwMDBkZXYtPm5ldCk7CiAgICBsb29wY250ID0gMDsKQEAgLTMwMCwxMCArMzAwLDEwIEBACiAgICB3aGlsZSAobG9vcGNudCA8IDEwMCkKICAgIHsKICAgICAgICBpZiAocGZ0MTAwMGluZm8tPnVzYmJvb3QgPT0gMikgewotICAgICAgICAgICBzdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTMyIChmdDEwMDBkZXYsIDAsIChQVUNIQVIpJihwZnQxMDAwaW5mby0+dGVtcGJ1ZlswXSksIDY0KTsKKyAgICAgICAgICAgc3RhdHVzID0gZnQxMDAwX3JlYWRfZHByYW0zMiAoZnQxMDAwZGV2LCAwLCAodTggKikmKHBmdDEwMDBpbmZvLT50ZW1wYnVmWzBdKSwgNjQpOwogICAgICAgICAgICBmb3IgKHRlbXA9MDsgdGVtcDwxNjsgdGVtcCsrKQogICAgICAgICAgICAgICAgREVCVUcoInRlbXBidWYgJWQgPSAweCV4XG4iLCB0ZW1wLCBwZnQxMDAwaW5mby0+dGVtcGJ1Zlt0ZW1wXSk7Ci0gICAgICAgICAgIHN0YXR1cyA9IGZ0MTAwMF9yZWFkX2RwcmFtMTYgKGZ0MTAwMGRldiwgRFdOTERfTUFHMV9IQU5EU0hBS0VfTE9DLCAoUFVDSEFSKSZoYW5kc2hha2UsIDEpOworICAgICAgICAgICBzdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTE2IChmdDEwMDBkZXYsIERXTkxEX01BRzFfSEFORFNIQUtFX0xPQywgKHU4ICopJmhhbmRzaGFrZSwgMSk7CiAgICAgICAgICAgIERFQlVHKCJoYW5kc2hha2UgZnJvbSByZWFkX2RwcmFtMTYgPSAweCV4XG4iLCBoYW5kc2hha2UpOwogICAgICAgICAgICBpZiAocGZ0MTAwMGluZm8tPmRzcGFsaXZlID09IHBmdDEwMDBpbmZvLT50ZW1wYnVmWzZdKQogICAgICAgICAgICAgICAgaGFuZHNoYWtlID0gMDsKQEAgLTMxMyw3ICszMTMsNyBAQAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewotICAgICAgICAgICBzdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTE2IChmdDEwMDBkZXYsIERXTkxEX01BRzFfSEFORFNIQUtFX0xPQywgKFBVQ0hBUikmaGFuZHNoYWtlLCAxKTsKKyAgICAgICAgICAgc3RhdHVzID0gZnQxMDAwX3JlYWRfZHByYW0xNiAoZnQxMDAwZGV2LCBEV05MRF9NQUcxX0hBTkRTSEFLRV9MT0MsICh1OCAqKSZoYW5kc2hha2UsIDEpOwogICAgICAgIH0KICAgICAgICBsb29wY250Kys7CiAgICAgICAgbXNsZWVwKDEwKTsKQEAgLTMyNyw3ICszMjcsNyBAQAogICAgcmV0dXJuIEhBTkRTSEFLRV9USU1FT1VUX1ZBTFVFOwogfQogCi1zdGF0aWMgdm9pZCBwdXRfaGFuZHNoYWtlX3VzYihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LFVTSE9SVCBoYW5kc2hha2VfdmFsdWUpCitzdGF0aWMgdm9pZCBwdXRfaGFuZHNoYWtlX3VzYihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LHUxNiBoYW5kc2hha2VfdmFsdWUpCiB7CiAgICBpbnQgaTsKIApAQCAtMzQ2LDQ0ICszNDYsNDQgQEAKIC8vIE5vdGVzOgogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1zdGF0aWMgVVNIT1JUIGdldF9yZXF1ZXN0X3R5cGUoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldikKK3N0YXRpYyB1MTYgZ2V0X3JlcXVlc3RfdHlwZShzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2KQogewotICAgVVNIT1JUICAgcmVxdWVzdF90eXBlOwotICAgVUxPTkcgICAgc3RhdHVzOwotICAgVVNIT1JUICAgdGVtcHdvcmQ7Ci0gICBVTE9ORyAgICB0ZW1weDsKKyAgIHUxNiAgIHJlcXVlc3RfdHlwZTsKKyAgIHUzMiAgICBzdGF0dXM7CisgICB1MTYgICB0ZW1wd29yZDsKKyAgIHUzMiAgICB0ZW1weDsKIAlzdHJ1Y3QgZnQxMDAwX2luZm8gKnBmdDEwMDBpbmZvID0gbmV0ZGV2X3ByaXYoZnQxMDAwZGV2LT5uZXQpOwogCiAgICBpZiAoIHBmdDEwMDBpbmZvLT5ib290bW9kZSA9PSAxKQogICAgewotICAgICAgIHN0YXR1cyA9IGZpeF9mdDEwMDBfcmVhZF9kcHJhbTMyIChmdDEwMDBkZXYsIERXTkxEX01BRzFfVFlQRV9MT0MsIChQVUNIQVIpJnRlbXB4KTsKKyAgICAgICBzdGF0dXMgPSBmaXhfZnQxMDAwX3JlYWRfZHByYW0zMiAoZnQxMDAwZGV2LCBEV05MRF9NQUcxX1RZUEVfTE9DLCAodTggKikmdGVtcHgpOwogICAgICAgIHRlbXB4ID0gbnRvaGwodGVtcHgpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHRlbXB4ID0gMDsKIAotICAgICAgIHN0YXR1cyA9IGZ0MTAwMF9yZWFkX2RwcmFtMTYgKGZ0MTAwMGRldiwgRFdOTERfTUFHMV9UWVBFX0xPQywgKFBVQ0hBUikmdGVtcHdvcmQsIDEpOworICAgICAgIHN0YXR1cyA9IGZ0MTAwMF9yZWFkX2RwcmFtMTYgKGZ0MTAwMGRldiwgRFdOTERfTUFHMV9UWVBFX0xPQywgKHU4ICopJnRlbXB3b3JkLCAxKTsKICAgICAgICB0ZW1weCB8PSAodGVtcHdvcmQgPDwgMTYpOwogICAgICAgIHRlbXB4ID0gbnRvaGwodGVtcHgpOwogICAgfQotICAgcmVxdWVzdF90eXBlID0gKFVTSE9SVCl0ZW1weDsKKyAgIHJlcXVlc3RfdHlwZSA9ICh1MTYpdGVtcHg7CiAKICAgIC8vREVCVUcoImdldF9yZXF1ZXN0X3R5cGU6IHJlcXVlc3RfdHlwZSBpcyAleFxuIiwgcmVxdWVzdF90eXBlKTsKICAgIHJldHVybiByZXF1ZXN0X3R5cGU7CiAKIH0KIAotc3RhdGljIFVTSE9SVCBnZXRfcmVxdWVzdF90eXBlX3VzYihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2KQorc3RhdGljIHUxNiBnZXRfcmVxdWVzdF90eXBlX3VzYihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2KQogewotICAgVVNIT1JUICAgcmVxdWVzdF90eXBlOwotICAgVUxPTkcgICAgc3RhdHVzOwotICAgVVNIT1JUICAgdGVtcHdvcmQ7Ci0gICBVTE9ORyAgICB0ZW1weDsKKyAgIHUxNiAgIHJlcXVlc3RfdHlwZTsKKyAgIHUzMiAgICBzdGF0dXM7CisgICB1MTYgICB0ZW1wd29yZDsKKyAgIHUzMiAgICB0ZW1weDsKIAlzdHJ1Y3QgZnQxMDAwX2luZm8gKnBmdDEwMDBpbmZvID0gbmV0ZGV2X3ByaXYoZnQxMDAwZGV2LT5uZXQpOwogICAgaWYgKCBwZnQxMDAwaW5mby0+Ym9vdG1vZGUgPT0gMSkKICAgIHsKLSAgICAgICBzdGF0dXMgPSBmaXhfZnQxMDAwX3JlYWRfZHByYW0zMiAoZnQxMDAwZGV2LCBEV05MRF9NQUcxX1RZUEVfTE9DLCAoUFVDSEFSKSZ0ZW1weCk7CisgICAgICAgc3RhdHVzID0gZml4X2Z0MTAwMF9yZWFkX2RwcmFtMzIgKGZ0MTAwMGRldiwgRFdOTERfTUFHMV9UWVBFX0xPQywgKHU4ICopJnRlbXB4KTsKICAgICAgICB0ZW1weCA9IG50b2hsKHRlbXB4KTsKICAgIH0KICAgIGVsc2UKQEAgLTM5NCwxMiArMzk0LDEyIEBACiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgIHRlbXB4ID0gMDsKLSAgICAgICAgICBzdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTE2IChmdDEwMDBkZXYsIERXTkxEX01BRzFfVFlQRV9MT0MsIChQVUNIQVIpJnRlbXB3b3JkLCAxKTsKKyAgICAgICAgICBzdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTE2IChmdDEwMDBkZXYsIERXTkxEX01BRzFfVFlQRV9MT0MsICh1OCAqKSZ0ZW1wd29yZCwgMSk7CiAgICAgICAgfQogICAgICAgIHRlbXB4IHw9ICh0ZW1wd29yZCA8PCAxNik7CiAgICAgICAgdGVtcHggPSBudG9obCh0ZW1weCk7CiAgICB9Ci0gICByZXF1ZXN0X3R5cGUgPSAoVVNIT1JUKXRlbXB4OworICAgcmVxdWVzdF90eXBlID0gKHUxNil0ZW1weDsKIAogICAgLy9ERUJVRygiZ2V0X3JlcXVlc3RfdHlwZTogcmVxdWVzdF90eXBlIGlzICV4XG4iLCByZXF1ZXN0X3R5cGUpOwogICAgcmV0dXJuIHJlcXVlc3RfdHlwZTsKQEAgLTQyMCwyMiArNDIwLDIyIEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogc3RhdGljIGxvbmcgZ2V0X3JlcXVlc3RfdmFsdWUoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldikKIHsKLSAgIFVMT05HICAgICB2YWx1ZTsKLSAgIFVTSE9SVCAgIHRlbXB3b3JkOwotICAgVUxPTkcgICAgc3RhdHVzOworICAgdTMyICAgICB2YWx1ZTsKKyAgIHUxNiAgIHRlbXB3b3JkOworICAgdTMyICAgIHN0YXR1czsKIAlzdHJ1Y3QgZnQxMDAwX2luZm8gKnBmdDEwMDBpbmZvID0gbmV0ZGV2X3ByaXYoZnQxMDAwZGV2LT5uZXQpOwogCiAKICAgICAgICBpZiAoIHBmdDEwMDBpbmZvLT5ib290bW9kZSA9PSAxKQogICAgICAgIHsKLQkgICBzdGF0dXMgPSBmaXhfZnQxMDAwX3JlYWRfZHByYW0zMihmdDEwMDBkZXYsIERXTkxEX01BRzFfU0laRV9MT0MsIChQVUNIQVIpJnZhbHVlKTsKKwkgICBzdGF0dXMgPSBmaXhfZnQxMDAwX3JlYWRfZHByYW0zMihmdDEwMDBkZXYsIERXTkxEX01BRzFfU0laRV9MT0MsICh1OCAqKSZ2YWx1ZSk7CiAJICAgdmFsdWUgPSBudG9obCh2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7Ci0JICAgc3RhdHVzID0gZnQxMDAwX3JlYWRfZHByYW0xNihmdDEwMDBkZXYsIERXTkxEX01BRzFfU0laRV9MT0MsIChQVUNIQVIpJnRlbXB3b3JkLCAwKTsKKwkgICBzdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTE2KGZ0MTAwMGRldiwgRFdOTERfTUFHMV9TSVpFX0xPQywgKHU4ICopJnRlbXB3b3JkLCAwKTsKIAkgICB2YWx1ZSA9IHRlbXB3b3JkOwotICAgICAgICAgICBzdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTE2KGZ0MTAwMGRldiwgRFdOTERfTUFHMV9TSVpFX0xPQywgKFBVQ0hBUikmdGVtcHdvcmQsIDEpOworICAgICAgICAgICBzdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTE2KGZ0MTAwMGRldiwgRFdOTERfTUFHMV9TSVpFX0xPQywgKHU4ICopJnRlbXB3b3JkLCAxKTsKIAkgICB2YWx1ZSB8PSAodGVtcHdvcmQgPDwgMTYpOwogCSAgIHZhbHVlID0gbnRvaGwodmFsdWUpOwogICAgICAgIH0KQEAgLTQ0OSw5ICs0NDksOSBAQAogI2lmIDAKIHN0YXRpYyBsb25nIGdldF9yZXF1ZXN0X3ZhbHVlX3VzYihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2KQogewotICAgVUxPTkcgICAgIHZhbHVlOwotICAgVVNIT1JUICAgdGVtcHdvcmQ7Ci0gICBVTE9ORyAgICBzdGF0dXM7CisgICB1MzIgICAgIHZhbHVlOworICAgdTE2ICAgdGVtcHdvcmQ7CisgICB1MzIgICAgc3RhdHVzOwogICAgc3RydWN0IGZ0MTAwMF9pbmZvICogcGZ0MTAwMGluZm8gPSBuZXRkZXZfcHJpdihmdDEwMDBkZXYtPm5ldCk7CiAKICAgICAgICBpZiAocGZ0MTAwMGluZm8tPnVzYmJvb3QgPT0gMikgewpAQCAtNDYwLDcgKzQ2MCw3IEBACiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgIHZhbHVlID0gMDsKLSAgICAgICAgICBzdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTE2KGZ0MTAwMGRldiwgRFdOTERfTUFHMV9TSVpFX0xPQywgKFBVQ0hBUikmdGVtcHdvcmQsIDEpOworICAgICAgICAgIHN0YXR1cyA9IGZ0MTAwMF9yZWFkX2RwcmFtMTYoZnQxMDAwZGV2LCBEV05MRF9NQUcxX1NJWkVfTE9DLCAodTggKikmdGVtcHdvcmQsIDEpOwogICAgICAgIH0KIAogICAgICAgIHZhbHVlIHw9ICh0ZW1wd29yZCA8PCAxNik7CkBAIC00OTAsMTEgKzQ5MCwxMSBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHN0YXRpYyB2b2lkIHB1dF9yZXF1ZXN0X3ZhbHVlKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsIGxvbmcgbHZhbHVlKQogewotICAgVUxPTkcgICAgdGVtcHg7Ci0gICBVTE9ORyAgICBzdGF0dXM7CisgICB1MzIgICAgdGVtcHg7CisgICB1MzIgICAgc3RhdHVzOwogCiAgICAgICAgdGVtcHggPSBudG9obChsdmFsdWUpOwotICAgICAgIHN0YXR1cyA9IGZpeF9mdDEwMDBfd3JpdGVfZHByYW0zMihmdDEwMDBkZXYsIERXTkxEX01BRzFfU0laRV9MT0MsIChQVUNIQVIpJnRlbXB4KTsKKyAgICAgICBzdGF0dXMgPSBmaXhfZnQxMDAwX3dyaXRlX2RwcmFtMzIoZnQxMDAwZGV2LCBEV05MRF9NQUcxX1NJWkVfTE9DLCAodTggKikmdGVtcHgpOwogCiAKIApAQCAtNTE2LDEwICs1MTYsMTAgQEAKIC8vIE5vdGVzOgogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1zdGF0aWMgVVNIT1JUIGhkcl9jaGVja3N1bShzdHJ1Y3QgcHNldWRvX2hkciAqcEhkcikKK3N0YXRpYyB1MTYgaGRyX2NoZWNrc3VtKHN0cnVjdCBwc2V1ZG9faGRyICpwSGRyKQogewotICAgVVNIT1JUICAgKnVzUHRyID0gKFVTSE9SVCAqKXBIZHI7Ci0gICBVU0hPUlQgICBjaGtzdW07CisgICB1MTYgICAqdXNQdHIgPSAodTE2ICopcEhkcjsKKyAgIHUxNiAgIGNoa3N1bTsKIAogCiAgIGNoa3N1bSA9ICgoKCgoKHVzUHRyWzBdIF4gdXNQdHJbMV0pIF4gdXNQdHJbMl0pIF4gdXNQdHJbM10pIF4KQEAgLTUzMyw4ICs1MzMsOCBAQAogLy8gRnVuY3Rpb246ICAgIHdyaXRlX2JsawogLy8KIC8vIFBhcmFtZXRlcnM6ICBzdHJ1Y3QgZnQxMDAwX2RldmljZSAgLSBkZXZpY2Ugc3RydWN0dXJlCi0vLyAgICAgICAgICAgICAgVVNIT1JUICoqcFVzRmlsZSAtIERTUCBpbWFnZSBmaWxlIHBvaW50ZXIgaW4gVVNIT1JUCi0vLyAgICAgICAgICAgICAgVUNIQVIgICoqcFVjRmlsZSAtIERTUCBpbWFnZSBmaWxlIHBvaW50ZXIgaW4gVUNIQVIKKy8vICAgICAgICAgICAgICB1MTYgKipwVXNGaWxlIC0gRFNQIGltYWdlIGZpbGUgcG9pbnRlciBpbiB1MTYKKy8vICAgICAgICAgICAgICB1OCAgKipwVWNGaWxlIC0gRFNQIGltYWdlIGZpbGUgcG9pbnRlciBpbiB1OAogLy8gICAgICAgICAgICAgIGxvbmcgICB3b3JkX2xlbmd0aCAtIGxlbmdodCBvZiB0aGUgYnVmZmVyIHRvIGJlIHdyaXR0ZW4KIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBEUFJBTQogLy8KQEAgLTU0NiwyMCArNTQ2LDIwIEBACiAvLyBOb3RlczoKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotc3RhdGljIFVMT05HIHdyaXRlX2JsayAoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgVVNIT1JUICoqcFVzRmlsZSwgVUNIQVIgKipwVWNGaWxlLCBsb25nIHdvcmRfbGVuZ3RoKQorc3RhdGljIHUzMiB3cml0ZV9ibGsgKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsIHUxNiAqKnBVc0ZpbGUsIHU4ICoqcFVjRmlsZSwgbG9uZyB3b3JkX2xlbmd0aCkKIHsKLSAgIFVMT05HIFN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwotICAgVVNIT1JUIGRwcmFtOworICAgdTMyIFN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOworICAgdTE2IGRwcmFtOwogICAgbG9uZyB0ZW1wX3dvcmRfbGVuZ3RoOwogICAgaW50IGxvb3BjbnQsIGksIGo7Ci0gICBVU0hPUlQgKnBUZW1wRmlsZTsKLSAgIFVTSE9SVCB0ZW1wd29yZDsKLSAgIFVTSE9SVCB0ZW1wYnVmZmVyWzY0XTsKLSAgIFVTSE9SVCByZXN1bHRidWZmZXJbNjRdOworICAgdTE2ICpwVGVtcEZpbGU7CisgICB1MTYgdGVtcHdvcmQ7CisgICB1MTYgdGVtcGJ1ZmZlcls2NF07CisgICB1MTYgcmVzdWx0YnVmZmVyWzY0XTsKIAlzdHJ1Y3QgZnQxMDAwX2luZm8gKnBmdDEwMDBpbmZvID0gbmV0ZGV2X3ByaXYoZnQxMDAwZGV2LT5uZXQpOwogCiAgICAvL0RFQlVHKCJGVDEwMDA6ZG93bmxvYWQ6c3RhcnQgd29yZF9sZW5ndGggPSAlZFxuIiwoaW50KXdvcmRfbGVuZ3RoKTsKLSAgIGRwcmFtID0gKFVTSE9SVClEV05MRF9NQUcxX1BTX0hEUl9MT0M7CisgICBkcHJhbSA9ICh1MTYpRFdOTERfTUFHMV9QU19IRFJfTE9DOwogICAgdGVtcHdvcmQgPSAqKCpwVXNGaWxlKTsKICAgICgqcFVzRmlsZSkrKzsKICAgIFN0YXR1cyA9IGZ0MTAwMF93cml0ZV9kcHJhbTE2KGZ0MTAwMGRldiwgZHByYW0sIHRlbXB3b3JkLCAwKTsKQEAgLTU2OSw3ICs1NjksNyBAQAogCiAgICAqcFVjRmlsZSA9ICpwVWNGaWxlICsgNDsKICAgIHdvcmRfbGVuZ3RoLS07Ci0gICB0ZW1wd29yZCA9IChVU0hPUlQpd29yZF9sZW5ndGg7CisgICB0ZW1wd29yZCA9ICh1MTYpd29yZF9sZW5ndGg7CiAgICB3b3JkX2xlbmd0aCA9ICh3b3JkX2xlbmd0aCAvIDE2KSArIDE7CiAgICBwVGVtcEZpbGUgPSAqcFVzRmlsZTsKICAgIHRlbXBfd29yZF9sZW5ndGggPSB3b3JkX2xlbmd0aDsKQEAgLTYwMiwyNCArNjAyLDI0IEBACiAJICAgICAgaWYgKHBmdDEwMDBpbmZvLT5ib290bW9kZSA9PSAwKQogCSAgICAgIHsKIAkJIGlmIChkcHJhbSA+PSAweDNGNCkKLSAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IGZ0MTAwMF93cml0ZV9kcHJhbTMyIChmdDEwMDBkZXYsIGRwcmFtLCAoUFVDSEFSKSZ0ZW1wYnVmZmVyWzBdLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IGZ0MTAwMF93cml0ZV9kcHJhbTMyIChmdDEwMDBkZXYsIGRwcmFtLCAodTggKikmdGVtcGJ1ZmZlclswXSwgOCk7CiAJICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSBmdDEwMDBfd3JpdGVfZHByYW0zMiAoZnQxMDAwZGV2LCBkcHJhbSwgKFBVQ0hBUikmdGVtcGJ1ZmZlclswXSwgNjQpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSBmdDEwMDBfd3JpdGVfZHByYW0zMiAoZnQxMDAwZGV2LCBkcHJhbSwgKHU4ICopJnRlbXBidWZmZXJbMF0sIDY0KTsKIAkgICAgICB9CiAJICAgICAgZWxzZQogCSAgICAgIHsKICAgICAgICAgICAgICAgICAgZm9yIChqPTA7IGo8MTA7IGorKykKICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IGZ0MTAwMF93cml0ZV9kcHJhbTMyIChmdDEwMDBkZXYsIGRwcmFtLCAoUFVDSEFSKSZ0ZW1wYnVmZmVyWzBdLCA2NCk7CisgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gZnQxMDAwX3dyaXRlX2RwcmFtMzIgKGZ0MTAwMGRldiwgZHByYW0sICh1OCAqKSZ0ZW1wYnVmZmVyWzBdLCA2NCk7CiAJCSAgIGlmIChTdGF0dXMgPT0gU1RBVFVTX1NVQ0NFU1MpCiAJCSAgIHsKIAkJICAgICAgIC8vIFdvcmsgYXJvdW5kIGZvciBBU0lDIGJpdCBzdHVmZmluZyBwcm9ibGVtLgogCQkgICAgICAgaWYgKCAodGVtcGJ1ZmZlclszMV0gJiAweGZlMDApID09IDB4ZmUwMCkKIAkJICAgICAgIHsKLSAgICAgIAkJICAgICAgICAgICBTdGF0dXMgPSBmdDEwMDBfd3JpdGVfZHByYW0zMihmdDEwMDBkZXYsIGRwcmFtKzEyLCAoUFVDSEFSKSZ0ZW1wYnVmZmVyWzI0XSwgNjQpOworICAgICAgCQkgICAgICAgICAgIFN0YXR1cyA9IGZ0MTAwMF93cml0ZV9kcHJhbTMyKGZ0MTAwMGRldiwgZHByYW0rMTIsICh1OCAqKSZ0ZW1wYnVmZmVyWzI0XSwgNjQpOwogCQkgICAgICAgfQogICAgIAkJICAgICAgIC8vIExldCdzIGNoZWNrIHRoZSBkYXRhIHdyaXR0ZW4KLQkgICAgCSAgICAgICBTdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTMyIChmdDEwMDBkZXYsIGRwcmFtLCAoUFVDSEFSKSZyZXN1bHRidWZmZXJbMF0sIDY0KTsKKwkgICAgCSAgICAgICBTdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTMyIChmdDEwMDBkZXYsIGRwcmFtLCAodTggKikmcmVzdWx0YnVmZmVyWzBdLCA2NCk7CiAJCSAgICAgICBpZiAoICh0ZW1wYnVmZmVyWzMxXSAmIDB4ZmUwMCkgPT0gMHhmZTAwKQogCQkgICAgICAgewogCQkgICAgICAgICAgIGZvciAoaT0wOyBpPDI4OyBpKyspCkBAIC02MzMsNyArNjMzLDcgQEAKIAkJCQkgICBicmVhazsKIAkJCQl9CiAJCQkgICB9Ci0gICAJCQkgICBTdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTMyIChmdDEwMDBkZXYsIGRwcmFtKzEyLCAoUFVDSEFSKSZyZXN1bHRidWZmZXJbMF0sIDY0KTsKKyAgIAkJCSAgIFN0YXR1cyA9IGZ0MTAwMF9yZWFkX2RwcmFtMzIgKGZ0MTAwMGRldiwgZHByYW0rMTIsICh1OCAqKSZyZXN1bHRidWZmZXJbMF0sIDY0KTsKIAkJICAgICAgICAgICBmb3IgKGk9MDsgaTwxNjsgaSsrKQogCQkgICAgICAgICAgIHsKICAgICAJCQkgICAgICAgaWYgKHJlc3VsdGJ1ZmZlcltpXSAhPSB0ZW1wYnVmZmVyW2krMjRdKQpAQCAtNjg5LDggKzY4OSw4IEBACiAvLyBGdW5jdGlvbjogICAgd3JpdGVfYmxrX2ZpZm8KIC8vCiAvLyBQYXJhbWV0ZXJzOiAgc3RydWN0IGZ0MTAwMF9kZXZpY2UgIC0gZGV2aWNlIHN0cnVjdHVyZQotLy8gICAgICAgICAgICAgIFVTSE9SVCAqKnBVc0ZpbGUgLSBEU1AgaW1hZ2UgZmlsZSBwb2ludGVyIGluIFVTSE9SVAotLy8gICAgICAgICAgICAgIFVDSEFSICAqKnBVY0ZpbGUgLSBEU1AgaW1hZ2UgZmlsZSBwb2ludGVyIGluIFVDSEFSCisvLyAgICAgICAgICAgICAgdTE2ICoqcFVzRmlsZSAtIERTUCBpbWFnZSBmaWxlIHBvaW50ZXIgaW4gdTE2CisvLyAgICAgICAgICAgICAgdTggICoqcFVjRmlsZSAtIERTUCBpbWFnZSBmaWxlIHBvaW50ZXIgaW4gdTgKIC8vICAgICAgICAgICAgICBsb25nICAgd29yZF9sZW5ndGggLSBsZW5naHQgb2YgdGhlIGJ1ZmZlciB0byBiZSB3cml0dGVuCiAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gRFBSQU0KIC8vCkBAIC03MDIsOSArNzAyLDkgQEAKIC8vIE5vdGVzOgogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1zdGF0aWMgVUxPTkcgd3JpdGVfYmxrX2ZpZm8gKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsIFVTSE9SVCAqKnBVc0ZpbGUsIFVDSEFSICoqcFVjRmlsZSwgbG9uZyB3b3JkX2xlbmd0aCkKK3N0YXRpYyB1MzIgd3JpdGVfYmxrX2ZpZm8gKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsIHUxNiAqKnBVc0ZpbGUsIHU4ICoqcFVjRmlsZSwgbG9uZyB3b3JkX2xlbmd0aCkKIHsKLSAgIFVMT05HIFN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOworICAgdTMyIFN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwogICAgaW50IGJ5dGVfbGVuZ3RoOwogICAgbG9uZyBhbGlnbmNudDsKIApAQCAtNzcwLDM2ICs3NzAsMzYgQEAKIC8vICBSZXR1cm5zOiAgICBzdGF0dXMgICAgICAgICAgICAgICAgICAtIHJldHVybiBjb2RlCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi11MTYgc2NyYW1fZG5sZHIoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgdm9pZCAqcEZpbGVTdGFydCwgVUxPTkcgIEZpbGVMZW5ndGgpCit1MTYgc2NyYW1fZG5sZHIoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgdm9pZCAqcEZpbGVTdGFydCwgdTMyICBGaWxlTGVuZ3RoKQogewotICAgdTE2ICAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7Ci0gICBVSU5UICAgICAgICAgICAgICAgICAgICB1aVN0YXRlOwotICAgVVNIT1JUICAgICAgICAgICAgICAgICAgaGFuZHNoYWtlOwotCXN0cnVjdCBwc2V1ZG9faGRyICpwSGRyOwotICAgVVNIT1JUICAgICAgICAgICAgICAgICAgdXNIZHJMZW5ndGg7CisgICB1MTYgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKKyAgIHUzMiAgICAgICAgICAgICAgICAgICAgc3RhdGU7CisgICB1MTYgICAgICAgICAgICAgICAgICBoYW5kc2hha2U7CisJc3RydWN0IHBzZXVkb19oZHIgKnBzZXVkb19oZWFkZXI7CisgICB1MTYgICAgICAgICAgICAgICAgICBwc2V1ZG9faGVhZGVyX2xlbjsKICAgIGxvbmcgICAgICAgICAgICAgICAgICAgIHdvcmRfbGVuZ3RoOwotICAgVVNIT1JUICAgICAgICAgICAgICAgICAgcmVxdWVzdDsKLSAgIFVTSE9SVCAgICAgICAgICAgICAgICAgIHRlbXA7Ci0gICBVU0hPUlQgICAgICAgICAgICAgICAgICB0ZW1wd29yZDsKKyAgIHUxNiAgICAgICAgICAgICAgICAgIHJlcXVlc3Q7CisgICB1MTYgICAgICAgICAgICAgICAgICB0ZW1wOworICAgdTE2ICAgICAgICAgICAgICAgICAgdGVtcHdvcmQ7CiAKLQlzdHJ1Y3QgZHNwX2ZpbGVfaGRyICpwRmlsZUhkcjU7Ci0Jc3RydWN0IGRzcF9pbWFnZV9pbmZvICpwRHNwSW1hZ2VJbmZvVjYgPSBOVUxMOworCXN0cnVjdCBkc3BfZmlsZV9oZHIgKmZpbGVfaGRyOworCXN0cnVjdCBkc3BfaW1hZ2VfaW5mbyAqZHNwX2ltZ19pbmZvID0gTlVMTDsKICAgIGxvbmcgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF92ZXJzaW9uOwotICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgYkdvb2RWZXJzaW9uOwotCXN0cnVjdCBkcnZfbXNnICpwTWFpbEJveERhdGE7Ci0gICBVU0hPUlQgICAgICAgICAgICAgICAgICAqcFVzRGF0YSA9IE5VTEw7Ci0gICBVU0hPUlQgICAgICAgICAgICAgICAgICAqcFVzRmlsZSA9IE5VTEw7Ci0gICBVQ0hBUiAgICAgICAgICAgICAgICAgICAqcFVjRmlsZSA9IE5VTEw7Ci0gICBVQ0hBUiAgICAgICAgICAgICAgICAgICAqcEJvb3RFbmQgPSBOVUxMLCAqcENvZGVFbmQ9IE5VTEw7Ci0gICBpbnQgICAgICAgICAgICAgICAgICAgICBpbWFnZU47CisgICBib29sICAgICAgICAgICAgICAgICBjb3JyZWN0X3ZlcnNpb247CisJc3RydWN0IGRydl9tc2cgKm1haWxib3hfZGF0YTsKKyAgIHUxNiAgICAgICAgICAgICAgICAgICpkYXRhID0gTlVMTDsKKyAgIHUxNiAgICAgICAgICAgICAgICAgICpzX2ZpbGUgPSBOVUxMOworICAgdTggICAgICAgICAgICAgICAgICAgKmNfZmlsZSA9IE5VTEw7CisgICB1OCAgICAgICAgICAgICAgICAgICAqYm9vdF9lbmQgPSBOVUxMLCAqY29kZV9lbmQ9IE5VTEw7CisgICBpbnQgICAgICAgICAgICAgICAgICAgICBpbWFnZTsKICAgIGxvbmcgICAgICAgICAgICAgICAgICAgIGxvYWRlcl9jb2RlX2FkZHJlc3MsIGxvYWRlcl9jb2RlX3NpemUgPSAwOwogICAgbG9uZyAgICAgICAgICAgICAgICAgICAgcnVuX2FkZHJlc3MgPSAwLCBydW5fc2l6ZSA9IDA7CiAKLSAgIFVMT05HICAgICAgICAgICAgICAgICAgIHRlbXBsb25nOwotICAgVUxPTkcgICAgICAgICAgICAgICAgICAgaW1hZ2VfY2hrc3VtID0gMDsKKyAgIHUzMiAgICAgICAgICAgICAgICAgICB0ZW1wbG9uZzsKKyAgIHUzMiAgICAgICAgICAgICAgICAgICBpbWFnZV9jaGtzdW0gPSAwOwogCi0gICBVU0hPUlQgICAgICAgICAgICAgICAgICBkcHJhbSA9IDA7Ci0gICBQVUNIQVIgICAgICAgICAgICAgICAgICBwYnVmZmVyOworICAgdTE2ICAgICAgICAgICAgICAgICAgZHByYW0gPSAwOworICAgdTggKnBidWZmZXI7CiAJc3RydWN0IHByb3ZfcmVjb3JkICpwcHJvdl9yZWNvcmQ7CiAJc3RydWN0IGZ0MTAwMF9pbmZvICpwZnQxMDAwaW5mbyA9IG5ldGRldl9wcml2KGZ0MTAwMGRldi0+bmV0KTsKIApAQCAtODE0LDI0ICs4MTQsMjQgQEAKICAgIC8vIEdldCB2ZXJzaW9uIGlkIG9mIGZpbGUsIGF0IGZpcnN0IDQgYnl0ZXMgb2YgZmlsZSwgZm9yIG5ld2VyIGZpbGVzLgogICAgLy8KIAotICAgdWlTdGF0ZSA9IFNUQVRFX1NUQVJUX0RXTkxEOworICAgc3RhdGUgPSBTVEFURV9TVEFSVF9EV05MRDsKIAotICAgcEZpbGVIZHI1ID0gKHN0cnVjdCBkc3BfZmlsZV9oZHIgKilwRmlsZVN0YXJ0OworICAgZmlsZV9oZHIgPSAoc3RydWN0IGRzcF9maWxlX2hkciAqKXBGaWxlU3RhcnQ7CiAKICAgIGZ0MTAwMF93cml0ZV9yZWdpc3RlciAoZnQxMDAwZGV2LCAweDgwMCwgRlQxMDAwX1JFR19NQUdfV0FURVJNQVJLKTsKIAotICAgICAgcFVzRmlsZSA9IChVU0hPUlQgKikocEZpbGVTdGFydCArIHBGaWxlSGRyNS0+bG9hZGVyX29mZnNldCk7Ci0gICAgICBwVWNGaWxlID0gKFVDSEFSICopKHBGaWxlU3RhcnQgKyBwRmlsZUhkcjUtPmxvYWRlcl9vZmZzZXQpOworICAgICAgc19maWxlID0gKHUxNiAqKShwRmlsZVN0YXJ0ICsgZmlsZV9oZHItPmxvYWRlcl9vZmZzZXQpOworICAgICAgY19maWxlID0gKHU4ICopKHBGaWxlU3RhcnQgKyBmaWxlX2hkci0+bG9hZGVyX29mZnNldCk7CiAKLSAgICAgIHBCb290RW5kID0gKFVDSEFSICopKHBGaWxlU3RhcnQgKyBwRmlsZUhkcjUtPmxvYWRlcl9jb2RlX2VuZCk7CisgICAgICBib290X2VuZCA9ICh1OCAqKShwRmlsZVN0YXJ0ICsgZmlsZV9oZHItPmxvYWRlcl9jb2RlX2VuZCk7CiAKLSAgICAgIGxvYWRlcl9jb2RlX2FkZHJlc3MgPSBwRmlsZUhkcjUtPmxvYWRlcl9jb2RlX2FkZHJlc3M7Ci0gICAgICBsb2FkZXJfY29kZV9zaXplID0gcEZpbGVIZHI1LT5sb2FkZXJfY29kZV9zaXplOwotICAgICAgYkdvb2RWZXJzaW9uID0gRkFMU0U7CisgICAgICBsb2FkZXJfY29kZV9hZGRyZXNzID0gZmlsZV9oZHItPmxvYWRlcl9jb2RlX2FkZHJlc3M7CisgICAgICBsb2FkZXJfY29kZV9zaXplID0gZmlsZV9oZHItPmxvYWRlcl9jb2RlX3NpemU7CisgICAgICBjb3JyZWN0X3ZlcnNpb24gPSBGQUxTRTsKIAotICAgd2hpbGUgKChTdGF0dXMgPT0gU1RBVFVTX1NVQ0NFU1MpICYmICh1aVN0YXRlICE9IFNUQVRFX0RPTkVfRklMRSkpCisgICB3aGlsZSAoKHN0YXR1cyA9PSBTVEFUVVNfU1VDQ0VTUykgJiYgKHN0YXRlICE9IFNUQVRFX0RPTkVfRklMRSkpCiAgICB7Ci0gICAgICBzd2l0Y2ggKHVpU3RhdGUpCisgICAgICBzd2l0Y2ggKHN0YXRlKQogICAgICAgewogICAgICAgY2FzZSAgU1RBVEVfU1RBUlRfRFdOTEQ6CiAgICAgICAgICBERUJVRygiRlQxMDAwOlNUQVRFX1NUQVJUX0RXTkxEXG4iKTsKQEAgLTg0OCwxMCArODQ4LDEwIEBACiAgICAgICAgICBlbHNlCiAgICAgICAgICB7CiAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmRvd25sb2FkOkRvd25sb2FkIGVycm9yOiBIYW5kc2hha2UgZmFpbGVkXG4iKTsKLSAgICAgICAgICAgIFN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgc3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CiAgICAgICAgICB9CiAKLSAgICAgICAgIHVpU3RhdGUgPSBTVEFURV9CT09UX0RXTkxEOworICAgICAgICAgc3RhdGUgPSBTVEFURV9CT09UX0RXTkxEOwogCiAgICAgICAgICBicmVhazsKIApAQCAtODc4LDExICs4NzgsMTEgQEAKICAgICAgICAgICAgIGNhc2UgIFJFUVVFU1RfRE9ORV9CTDoKICAgICAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6UkVRVUVTVF9ET05FX0JMXG4iKTsKICAgICAgICAgICAgICAgIC8qIFJlcG9zaXRpb24gcHRycyB0byBiZWdpbm5pbmcgb2YgY29kZSBzZWN0aW9uICovCi0gICAgICAgICAgICAgICBwVXNGaWxlID0gKFVTSE9SVCAqKShwQm9vdEVuZCk7Ci0gICAgICAgICAgICAgICBwVWNGaWxlID0gKFVDSEFSICopKHBCb290RW5kKTsKLSAgICAgICAgICAgICAgIC8vREVCVUcoIkZUMTAwMDpkb3dubG9hZDpwVXNGaWxlID0gMHglOHhcbiIsIChpbnQpcFVzRmlsZSk7Ci0gICAgICAgICAgICAgICAvL0RFQlVHKCJGVDEwMDA6ZG93bmxvYWQ6cFVjRmlsZSA9IDB4JTh4XG4iLCAoaW50KXBVY0ZpbGUpOwotICAgICAgICAgICAgICAgdWlTdGF0ZSA9IFNUQVRFX0NPREVfRFdOTEQ7CisgICAgICAgICAgICAgICBzX2ZpbGUgPSAodTE2ICopKGJvb3RfZW5kKTsKKyAgICAgICAgICAgICAgIGNfZmlsZSA9ICh1OCAqKShib290X2VuZCk7CisgICAgICAgICAgICAgICAvL0RFQlVHKCJGVDEwMDA6ZG93bmxvYWQ6c19maWxlID0gMHglOHhcbiIsIChpbnQpc19maWxlKTsKKyAgICAgICAgICAgICAgIC8vREVCVUcoIkZUMTAwMDpkb3dubG9hZDpjX2ZpbGUgPSAweCU4eFxuIiwgKGludCljX2ZpbGUpOworICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9DT0RFX0RXTkxEOwogICAgICAgICAgICAgICAgcGZ0MTAwMGluZm8tPmZjb2RlbGRyID0gMTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAgUkVRVUVTVF9DT0RFX1NFR01FTlQ6CkBAIC04OTMsMzMgKzg5MywzMyBAQAogICAgICAgICAgICAgICAgaWYgKHdvcmRfbGVuZ3RoID4gTUFYX0xFTkdUSCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZG93bmxvYWQ6RG93bmxvYWQgZXJyb3I6IE1heCBsZW5ndGggZXhjZWVkZWRcbiIpOwotICAgICAgICAgICAgICAgICAgU3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgaWYgKCAod29yZF9sZW5ndGgqMiArIHBVY0ZpbGUpID4gcEJvb3RFbmQpCisgICAgICAgICAgICAgICBpZiAoICh3b3JkX2xlbmd0aCoyICsgY19maWxlKSA+IGJvb3RfZW5kKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAqIEVycm9yLCBiZXlvbmQgYm9vdCBjb2RlIHJhbmdlLgogICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmRvd25sb2FkOkRvd25sb2FkIGVycm9yOiBSZXF1ZXN0ZWQgbGVuPSVkIGV4Y2VlZHMgQk9PVCBjb2RlIGJvdW5kcnkuXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCl3b3JkX2xlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICBTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOwogICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogUG9zaXRpb24gQVNJQyBEUFJBTSBhdXRvLWluY3JlbWVudCBwb2ludGVyLgogICAgICAgICAgICAgICAgICovCi0JCQkJICAgIGRwcmFtID0gKFVTSE9SVClEV05MRF9NQUcxX1BTX0hEUl9MT0M7CisJCQkJICAgIGRwcmFtID0gKHUxNilEV05MRF9NQUcxX1BTX0hEUl9MT0M7CiAJCQkJCWlmICh3b3JkX2xlbmd0aCAmIDB4MSkKIAkJCQkJCXdvcmRfbGVuZ3RoKys7CiAJCQkJCXdvcmRfbGVuZ3RoID0gd29yZF9sZW5ndGggLyAyOwogCi0JCQlTdGF0dXMgPSAgIHdyaXRlX2JsayhmdDEwMDBkZXYsICZwVXNGaWxlLCAmcFVjRmlsZSwgd29yZF9sZW5ndGgpOwotCQkJLy9ERUJVRygid3JpdGVfYmxrIHJldHVybmVkICVkXG4iLCBTdGF0dXMpOworCQkJc3RhdHVzID0gICB3cml0ZV9ibGsoZnQxMDAwZGV2LCAmc19maWxlLCAmY19maWxlLCB3b3JkX2xlbmd0aCk7CisJCQkvL0RFQlVHKCJ3cml0ZV9ibGsgcmV0dXJuZWQgJWRcbiIsIHN0YXR1cyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmRvd25sb2FkOkRvd25sb2FkIGVycm9yOiBCYWQgcmVxdWVzdCB0eXBlPSVkIGluIEJPT1QgZG93bmxvYWQgc3RhdGUuXG4iLHJlcXVlc3QpOwotICAgICAgICAgICAgICAgU3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICAgICBzdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHBmdDEwMDBpbmZvLT51c2Jib290KQpAQCAtOTMwLDcgKzkzMCw3IEBACiAgICAgICAgICBlbHNlCiAgICAgICAgICB7CiAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmRvd25sb2FkOkRvd25sb2FkIGVycm9yOiBIYW5kc2hha2UgZmFpbGVkXG4iKTsKLSAgICAgICAgICAgIFN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgc3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CiAgICAgICAgICB9CiAKICAgICAgICAgIGJyZWFrOwpAQCAtOTU5LDcgKzk1OSw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICBSRVFVRVNUX1JVTl9BRERSRVNTOgogICAgICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpkb3dubG9hZDogIFJFUVVFU1RfUlVOX0FERFJFU1NcbiIpOwotICAgICAgICAgICAgICAgaWYgKGJHb29kVmVyc2lvbikKKyAgICAgICAgICAgICAgIGlmIChjb3JyZWN0X3ZlcnNpb24pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmRvd25sb2FkOnJ1bl9hZGRyZXNzID0gMHglOHhcbiIsIChpbnQpcnVuX2FkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgcHV0X3JlcXVlc3RfdmFsdWUoZnQxMDAwZGV2LCBydW5fYWRkcmVzcyk7CkBAIC05NjcsMTMgKzk2NywxMyBAQAogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpkb3dubG9hZDpEb3dubG9hZCBlcnJvcjogR290IFJ1biBhZGRyZXNzIHJlcXVlc3QgYmVmb3JlIGltYWdlIG9mZnNldCByZXF1ZXN0LlxuIik7Ci0gICAgICAgICAgICAgICAgICBTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOwogICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgIFJFUVVFU1RfQ09ERV9MRU5HVEg6CiAgICAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmRvd25sb2FkOlJFUVVFU1RfQ09ERV9MRU5HVEhcbiIpOwotICAgICAgICAgICAgICAgaWYgKGJHb29kVmVyc2lvbikKKyAgICAgICAgICAgICAgIGlmIChjb3JyZWN0X3ZlcnNpb24pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmRvd25sb2FkOnJ1bl9zaXplID0gMHglOHhcbiIsIChpbnQpcnVuX3NpemUpOwogICAgICAgICAgICAgICAgICAgcHV0X3JlcXVlc3RfdmFsdWUoZnQxMDAwZGV2LCBydW5fc2l6ZSk7CkBAIC05ODEsMjMgKzk4MSwyMyBAQAogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpkb3dubG9hZDpEb3dubG9hZCBlcnJvcjogR290IFNpemUgcmVxdWVzdCBiZWZvcmUgaW1hZ2Ugb2Zmc2V0IHJlcXVlc3QuXG4iKTsKLSAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgICAgICAgc3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CiAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAgUkVRVUVTVF9ET05FX0NMOgogICAgICAgICAgICAgICAgcGZ0MTAwMGluZm8tPnVzYmJvb3QgPSAzOwogICAgICAgICAgICAgICAgLyogUmVwb3NpdGlvbiBwdHJzIHRvIGJlZ2lubmluZyBvZiBwcm92aXNpb25pbmcgc2VjdGlvbiAqLwotICAgICAgICAgICAgICAgICAgcFVzRmlsZSA9IChVU0hPUlQgKikocEZpbGVTdGFydCArIHBGaWxlSGRyNS0+Y29tbWFuZHNfb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgIHBVY0ZpbGUgPSAoVUNIQVIgKikocEZpbGVTdGFydCArIHBGaWxlSGRyNS0+Y29tbWFuZHNfb2Zmc2V0KTsKLSAgICAgICAgICAgICAgIHVpU3RhdGUgPSBTVEFURV9ET05FX0RXTkxEOworICAgICAgICAgICAgICAgICAgc19maWxlID0gKHUxNiAqKShwRmlsZVN0YXJ0ICsgZmlsZV9oZHItPmNvbW1hbmRzX29mZnNldCk7CisgICAgICAgICAgICAgICAgICBjX2ZpbGUgPSAodTggKikocEZpbGVTdGFydCArIGZpbGVfaGRyLT5jb21tYW5kc19vZmZzZXQpOworICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9ET05FX0RXTkxEOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICBSRVFVRVNUX0NPREVfU0VHTUVOVDoKICAgICAgICAgICAgICAgIC8vREVCVUcoIkZUMTAwMDpkb3dubG9hZDogUkVRVUVTVF9DT0RFX1NFR01FTlQgLSBDT0RFTE9BREVSXG4iKTsKLSAgICAgICAgICAgICAgIGlmICghYkdvb2RWZXJzaW9uKQorICAgICAgICAgICAgICAgaWYgKCFjb3JyZWN0X3ZlcnNpb24pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmRvd25sb2FkOkRvd25sb2FkIGVycm9yOiBHb3QgQ29kZSBTZWdtZW50IHJlcXVlc3QgYmVmb3JlIGltYWdlIG9mZnNldCByZXF1ZXN0LlxuIik7Ci0gICAgICAgICAgICAgICAgICBTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOwogICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAjaWYgMApAQCAtMTAxMSwyOCArMTAxMSwyOCBAQAogI2VuZGlmCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmRvd25sb2FkOkRvd25sb2FkIGVycm9yOiBNYXggbGVuZ3RoIGV4Y2VlZGVkXG4iKTsKLSAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgICAgICAgc3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CiAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGlmICggKHdvcmRfbGVuZ3RoKjIgKyBwVWNGaWxlKSA+IHBDb2RlRW5kKQorICAgICAgICAgICAgICAgaWYgKCAod29yZF9sZW5ndGgqMiArIGNfZmlsZSkgPiBjb2RlX2VuZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgKiBFcnJvciwgYmV5b25kIGJvb3QgY29kZSByYW5nZS4KICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpkb3dubG9hZDpEb3dubG9hZCBlcnJvcjogUmVxdWVzdGVkIGxlbj0lZCBleGNlZWRzIERTUCBjb2RlIGJvdW5kcnkuXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpd29yZF9sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgU3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIFBvc2l0aW9uIEFTSUMgRFBSQU0gYXV0by1pbmNyZW1lbnQgcG9pbnRlci4KICAgICAgICAgICAgICAgICAqLwotCQkgICBkcHJhbSA9IChVU0hPUlQpRFdOTERfTUFHMV9QU19IRFJfTE9DOworCQkgICBkcHJhbSA9ICh1MTYpRFdOTERfTUFHMV9QU19IRFJfTE9DOwogCQkgICBpZiAod29yZF9sZW5ndGggJiAweDEpCiAJCQl3b3JkX2xlbmd0aCsrOwogCQkgICB3b3JkX2xlbmd0aCA9IHdvcmRfbGVuZ3RoIC8gMjsKIAotICAgCSAgICAgICB3cml0ZV9ibGtfZmlmbyAoZnQxMDAwZGV2LCAmcFVzRmlsZSwgJnBVY0ZpbGUsIHdvcmRfbGVuZ3RoKTsKKyAgIAkgICAgICAgd3JpdGVfYmxrX2ZpZm8gKGZ0MTAwMGRldiwgJnNfZmlsZSwgJmNfZmlsZSwgd29yZF9sZW5ndGgpOwogICAgICAgICAgICAgICAgaWYgKHBmdDEwMDBpbmZvLT51c2Jib290ID09IDApCiAgICAgICAgICAgICAgICAgICAgcGZ0MTAwMGluZm8tPnVzYmJvb3QrKzsKICAgICAgICAgICAgICAgIGlmIChwZnQxMDAwaW5mby0+dXNiYm9vdCA9PSAxKSB7CkBAIC0xMDQ3LDE0ICsxMDQ3LDE0IEBACiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IGxlbmd0aCBmcm9tIGJ5dGUgY291bnQgdG8gd29yZCBjb3VudC4gTWFrZSBzdXJlIHdlIHJvdW5kIHVwLgogICAgICAgICAgICAgICAgd29yZF9sZW5ndGggPSAobG9uZykocGZ0MTAwMGluZm8tPkRTUEluZm9CbGtsZW4gKyAxKS8yOwogICAgICAgICAgICAgICAgcHV0X3JlcXVlc3RfdmFsdWUoZnQxMDAwZGV2LCB3b3JkX2xlbmd0aCk7Ci0JCXBNYWlsQm94RGF0YSA9IChzdHJ1Y3QgZHJ2X21zZyAqKSYocGZ0MTAwMGluZm8tPkRTUEluZm9CbGtbMF0pOworCQltYWlsYm94X2RhdGEgPSAoc3RydWN0IGRydl9tc2cgKikmKHBmdDEwMDBpbmZvLT5EU1BJbmZvQmxrWzBdKTsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBQb3NpdGlvbiBBU0lDIERQUkFNIGF1dG8taW5jcmVtZW50IHBvaW50ZXIuCiAgICAgICAgICAgICAgICAgKi8KIAogCi0gICAgICAgICAgICAgICAgICAgcFVzRGF0YSA9IChVU0hPUlQgKikmcE1haWxCb3hEYXRhLT5kYXRhWzBdOwotICAgICAgICAgICAgICAgICAgIGRwcmFtID0gKFVTSE9SVClEV05MRF9NQUcxX1BTX0hEUl9MT0M7CisgICAgICAgICAgICAgICAgICAgZGF0YSA9ICh1MTYgKikmbWFpbGJveF9kYXRhLT5kYXRhWzBdOworICAgICAgICAgICAgICAgICAgIGRwcmFtID0gKHUxNilEV05MRF9NQUcxX1BTX0hEUl9MT0M7CiAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmRfbGVuZ3RoICYgMHgxKQogICAgICAgICAgICAgICAgICAgICAgICB3b3JkX2xlbmd0aCsrOwogCkBAIC0xMDY0LDI1ICsxMDY0LDI1IEBACiAgICAgICAgICAgICAgICBmb3IgKDsgd29yZF9sZW5ndGggPiAwOyB3b3JkX2xlbmd0aC0tKSAvKiBJbiB3b3JkcyAqLwogICAgICAgICAgICAgICAgewogCi0gICAgICAgICAgICAgICAgICAgICAgdGVtcGxvbmcgPSAqcFVzRGF0YSsrOwotCQkJCQkgIHRlbXBsb25nIHw9ICgqcFVzRGF0YSsrIDw8IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSBmaXhfZnQxMDAwX3dyaXRlX2RwcmFtMzIgKGZ0MTAwMGRldiwgZHByYW0rKywgKFBVQ0hBUikmdGVtcGxvbmcpOworICAgICAgICAgICAgICAgICAgICAgIHRlbXBsb25nID0gKmRhdGErKzsKKwkJCQkJICB0ZW1wbG9uZyB8PSAoKmRhdGErKyA8PCAxNik7CisgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gZml4X2Z0MTAwMF93cml0ZV9kcHJhbTMyIChmdDEwMDBkZXYsIGRwcmFtKyssICh1OCAqKSZ0ZW1wbG9uZyk7CiAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICBjYXNlICBSRVFVRVNUX1ZFUlNJT05fSU5GTzoKICAgICAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZG93bmxvYWQ6UkVRVUVTVF9WRVJTSU9OX0lORk9cbiIpOwotICAgICAgICAgICAgICAgd29yZF9sZW5ndGggPSBwRmlsZUhkcjUtPnZlcnNpb25fZGF0YV9zaXplOworICAgICAgICAgICAgICAgd29yZF9sZW5ndGggPSBmaWxlX2hkci0+dmVyc2lvbl9kYXRhX3NpemU7CiAgICAgICAgICAgICAgICBwdXRfcmVxdWVzdF92YWx1ZShmdDEwMDBkZXYsIHdvcmRfbGVuZ3RoKTsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBQb3NpdGlvbiBBU0lDIERQUkFNIGF1dG8taW5jcmVtZW50IHBvaW50ZXIuCiAgICAgICAgICAgICAgICAgKi8KIAotICAgICAgICAgICAgICAgcFVzRmlsZSA9IChVU0hPUlQgKikocEZpbGVTdGFydCArIHBGaWxlSGRyNS0+dmVyc2lvbl9kYXRhX29mZnNldCk7CisgICAgICAgICAgICAgICBzX2ZpbGUgPSAodTE2ICopKHBGaWxlU3RhcnQgKyBmaWxlX2hkci0+dmVyc2lvbl9kYXRhX29mZnNldCk7CiAKIAotICAgICAgICAgICAgICAgICAgIGRwcmFtID0gKFVTSE9SVClEV05MRF9NQUcxX1BTX0hEUl9MT0M7CisgICAgICAgICAgICAgICAgICAgZHByYW0gPSAodTE2KURXTkxEX01BRzFfUFNfSERSX0xPQzsKICAgICAgICAgICAgICAgICAgICBpZiAod29yZF9sZW5ndGggJiAweDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRfbGVuZ3RoKys7CiAKQEAgLTEwOTIsNTkgKzEwOTIsNTkgQEAKICAgICAgICAgICAgICAgIGZvciAoOyB3b3JkX2xlbmd0aCA+IDA7IHdvcmRfbGVuZ3RoLS0pIC8qIEluIHdvcmRzICovCiAgICAgICAgICAgICAgICB7CiAKLSAgICAgICAgICAgICAgICAgICAgICB0ZW1wbG9uZyA9IG50b2hzKCpwVXNGaWxlKyspOwotCQkJCQkgIHRlbXAgPSBudG9ocygqcFVzRmlsZSsrKTsKKyAgICAgICAgICAgICAgICAgICAgICB0ZW1wbG9uZyA9IG50b2hzKCpzX2ZpbGUrKyk7CisJCQkJCSAgdGVtcCA9IG50b2hzKCpzX2ZpbGUrKyk7CiAJCQkJCSAgdGVtcGxvbmcgfD0gKHRlbXAgPDwgMTYpOwotICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IGZpeF9mdDEwMDBfd3JpdGVfZHByYW0zMiAoZnQxMDAwZGV2LCBkcHJhbSsrLCAoUFVDSEFSKSZ0ZW1wbG9uZyk7CisgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gZml4X2Z0MTAwMF93cml0ZV9kcHJhbTMyIChmdDEwMDBkZXYsIGRwcmFtKyssICh1OCAqKSZ0ZW1wbG9uZyk7CiAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICBjYXNlICBSRVFVRVNUX0NPREVfQllfVkVSU0lPTjoKICAgICAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZG93bmxvYWQ6UkVRVUVTVF9DT0RFX0JZX1ZFUlNJT05cbiIpOwotICAgICAgICAgICAgICAgYkdvb2RWZXJzaW9uID0gRkFMU0U7CisgICAgICAgICAgICAgICBjb3JyZWN0X3ZlcnNpb24gPSBGQUxTRTsKICAgICAgICAgICAgICAgIHJlcXVlc3RlZF92ZXJzaW9uID0gZ2V0X3JlcXVlc3RfdmFsdWUoZnQxMDAwZGV2KTsKIAotICAgICAgICAgICAgICAgICAgIHBEc3BJbWFnZUluZm9WNiA9IChzdHJ1Y3QgZHNwX2ltYWdlX2luZm8gKikocEZpbGVTdGFydCArIHNpemVvZihzdHJ1Y3QgZHNwX2ZpbGVfaGRyICkpOworICAgICAgICAgICAgICAgICAgIGRzcF9pbWdfaW5mbyA9IChzdHJ1Y3QgZHNwX2ltYWdlX2luZm8gKikocEZpbGVTdGFydCArIHNpemVvZihzdHJ1Y3QgZHNwX2ZpbGVfaGRyICkpOwogCi0gICAgICAgICAgICAgICBmb3IgKGltYWdlTiA9IDA7IGltYWdlTiA8IHBGaWxlSGRyNS0+bkRzcEltYWdlczsgaW1hZ2VOKyspCisgICAgICAgICAgICAgICBmb3IgKGltYWdlID0gMDsgaW1hZ2UgPCBmaWxlX2hkci0+bkRzcEltYWdlczsgaW1hZ2UrKykKICAgICAgICAgICAgICAgIHsKIAotICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gKFVTSE9SVCkocERzcEltYWdlSW5mb1Y2LT52ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9ICh1MTYpKGRzcF9pbWdfaW5mby0+dmVyc2lvbik7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsb25nID0gdGVtcDsKLSAgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9IChVU0hPUlQpKHBEc3BJbWFnZUluZm9WNi0+dmVyc2lvbiA+PiAxNik7CisgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSAodTE2KShkc3BfaW1nX2luZm8tPnZlcnNpb24gPj4gMTYpOwogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbG9uZyB8PSAodGVtcCA8PCAxNik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKHRlbXBsb25nID09IChVTE9ORylyZXF1ZXN0ZWRfdmVyc2lvbikKKyAgICAgICAgICAgICAgICAgICBpZiAodGVtcGxvbmcgPT0gKHUzMilyZXF1ZXN0ZWRfdmVyc2lvbikKICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgYkdvb2RWZXJzaW9uID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZG93bmxvYWQ6IGJHb29kVmVyc2lvbiBpcyBUUlVFXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBVc0ZpbGUgPSAoVVNIT1JUICopKHBGaWxlU3RhcnQgKyBwRHNwSW1hZ2VJbmZvVjYtPmJlZ2luX29mZnNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBwVWNGaWxlID0gKFVDSEFSICopKHBGaWxlU3RhcnQgKyBwRHNwSW1hZ2VJbmZvVjYtPmJlZ2luX29mZnNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29kZUVuZCA9IChVQ0hBUiAqKShwRmlsZVN0YXJ0ICsgcERzcEltYWdlSW5mb1Y2LT5lbmRfb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9hZGRyZXNzID0gcERzcEltYWdlSW5mb1Y2LT5ydW5fYWRkcmVzczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9zaXplID0gcERzcEltYWdlSW5mb1Y2LT5pbWFnZV9zaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VfY2hrc3VtID0gKFVMT05HKXBEc3BJbWFnZUluZm9WNi0+Y2hlY2tzdW07CisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWN0X3ZlcnNpb24gPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpkb3dubG9hZDogY29ycmVjdF92ZXJzaW9uIGlzIFRSVUVcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgc19maWxlID0gKHUxNiAqKShwRmlsZVN0YXJ0ICsgZHNwX2ltZ19pbmZvLT5iZWdpbl9vZmZzZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgY19maWxlID0gKHU4ICopKHBGaWxlU3RhcnQgKyBkc3BfaW1nX2luZm8tPmJlZ2luX29mZnNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlX2VuZCA9ICh1OCAqKShwRmlsZVN0YXJ0ICsgZHNwX2ltZ19pbmZvLT5lbmRfb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9hZGRyZXNzID0gZHNwX2ltZ19pbmZvLT5ydW5fYWRkcmVzczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9zaXplID0gZHNwX2ltZ19pbmZvLT5pbWFnZV9zaXplOworICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VfY2hrc3VtID0gKHUzMilkc3BfaW1nX2luZm8tPmNoZWNrc3VtOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRHNwSW1hZ2VJbmZvVjYrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzcF9pbWdfaW5mbysrOwogCiAKICAgICAgICAgICAgICAgIH0gLy9lbmQgb2YgZm9yCiAKLSAgICAgICAgICAgICAgIGlmICghYkdvb2RWZXJzaW9uKQorICAgICAgICAgICAgICAgaWYgKCFjb3JyZWN0X3ZlcnNpb24pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICogRXJyb3IsIGJleW9uZCBib290IGNvZGUgcmFuZ2UuCiAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZG93bmxvYWQ6RG93bmxvYWQgZXJyb3I6IEJhZCBWZXJzaW9uIFJlcXVlc3QgPSAweCV4LlxuIiwoaW50KXJlcXVlc3RlZF92ZXJzaW9uKTsKLSAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgICAgICAgc3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CiAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpkb3dubG9hZDpEb3dubG9hZCBlcnJvcjogQmFkIHJlcXVlc3QgdHlwZT0lZCBpbiBDT0RFIGRvd25sb2FkIHN0YXRlLlxuIixyZXF1ZXN0KTsKLSAgICAgICAgICAgICAgIFN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgICAgc3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChwZnQxMDAwaW5mby0+dXNiYm9vdCkKQEAgLTExNTUsOTQgKzExNTUsOTQgQEAKICAgICAgICAgIGVsc2UKICAgICAgICAgIHsKICAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZG93bmxvYWQ6RG93bmxvYWQgZXJyb3I6IEhhbmRzaGFrZSBmYWlsZWRcbiIpOwotICAgICAgICAgICAgU3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICBzdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKICAgICAgICAgIH0KIAogICAgICAgICAgYnJlYWs7CiAKICAgICAgIGNhc2UgU1RBVEVfRE9ORV9EV05MRDoKICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZG93bmxvYWQ6Q29kZSBsb2FkZXIgaXMgZG9uZS4uLlxuIik7Ci0gICAgICAgICB1aVN0YXRlID0gU1RBVEVfU0VDVElPTl9QUk9WOworICAgICAgICAgc3RhdGUgPSBTVEFURV9TRUNUSU9OX1BST1Y7CiAgICAgICAgICBicmVhazsKIAogICAgICAgY2FzZSAgU1RBVEVfU0VDVElPTl9QUk9WOgogICAgICAgICAgREVCVUcoIkZUMTAwMDpkb3dubG9hZDpTVEFURV9TRUNUSU9OX1BST1ZcbiIpOwotCQlwSGRyID0gKHN0cnVjdCBwc2V1ZG9faGRyICopcFVjRmlsZTsKKwkJcHNldWRvX2hlYWRlciA9IChzdHJ1Y3QgcHNldWRvX2hkciAqKWNfZmlsZTsKIAotICAgICAgICAgaWYgKHBIZHItPmNoZWNrc3VtID09IGhkcl9jaGVja3N1bShwSGRyKSkKKyAgICAgICAgIGlmIChwc2V1ZG9faGVhZGVyLT5jaGVja3N1bSA9PSBoZHJfY2hlY2tzdW0ocHNldWRvX2hlYWRlcikpCiAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocEhkci0+cG9ydGRlc3QgIT0gMHg4MCAvKiBEc3AgT0FNICovKQorICAgICAgICAgICAgaWYgKHBzZXVkb19oZWFkZXItPnBvcnRkZXN0ICE9IDB4ODAgLyogRHNwIE9BTSAqLykKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHVpU3RhdGUgPSBTVEFURV9ET05FX1BST1Y7CisgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX0RPTkVfUFJPVjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgdXNIZHJMZW5ndGggPSBudG9ocyhwSGRyLT5sZW5ndGgpOyAgICAvKiBCeXRlIGxlbmd0aCBmb3IgUFJPViByZWNvcmRzICovCisgICAgICAgICAgICBwc2V1ZG9faGVhZGVyX2xlbiA9IG50b2hzKHBzZXVkb19oZWFkZXItPmxlbmd0aCk7ICAgIC8qIEJ5dGUgbGVuZ3RoIGZvciBQUk9WIHJlY29yZHMgKi8KIAogICAgICAgICAgICAgLy8gR2V0IGJ1ZmZlciBmb3IgcHJvdmlzaW9uaW5nIGRhdGEKLQkJcGJ1ZmZlciA9IGttYWxsb2MoKHVzSGRyTGVuZ3RoICsgc2l6ZW9mKHN0cnVjdCBwc2V1ZG9faGRyKSksIEdGUF9BVE9NSUMpOworCQlwYnVmZmVyID0ga21hbGxvYygocHNldWRvX2hlYWRlcl9sZW4gKyBzaXplb2Yoc3RydWN0IHBzZXVkb19oZHIpKSwgR0ZQX0FUT01JQyk7CiAgICAgICAgICAgICBpZiAocGJ1ZmZlcikgewotCQltZW1jcHkocGJ1ZmZlciwgKHZvaWQgKilwVWNGaWxlLCAoVUlOVCkodXNIZHJMZW5ndGggKyBzaXplb2Yoc3RydWN0IHBzZXVkb19oZHIpKSk7CisJCW1lbWNweShwYnVmZmVyLCAodm9pZCAqKWNfZmlsZSwgKHUzMikocHNldWRvX2hlYWRlcl9sZW4gKyBzaXplb2Yoc3RydWN0IHBzZXVkb19oZHIpKSk7CiAgICAgICAgICAgICAgICAgLy8gbGluayBwcm92aXNpb25pbmcgZGF0YQogCQlwcHJvdl9yZWNvcmQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcHJvdl9yZWNvcmQpLCBHRlBfQVRPTUlDKTsKICAgICAgICAgICAgICAgICBpZiAocHByb3ZfcmVjb3JkKSB7CiAgICAgICAgICAgICAgICAgICAgIHBwcm92X3JlY29yZC0+cHByb3ZfZGF0YSA9IHBidWZmZXI7CiAgICAgICAgICAgICAgICAgICAgIGxpc3RfYWRkX3RhaWwgKCZwcHJvdl9yZWNvcmQtPmxpc3QsICZwZnQxMDAwaW5mby0+cHJvdl9saXN0KTsKICAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSB0byBuZXh0IGVudHJ5IGlmIGF2YWlsYWJsZQotCQkJcFVjRmlsZSA9IChVQ0hBUiAqKSgodW5zaWduZWQgbG9uZylwVWNGaWxlICsgKFVJTlQpKCh1c0hkckxlbmd0aCArIDEpICYgMHhGRkZGRkZGRSkgKyBzaXplb2Yoc3RydWN0IHBzZXVkb19oZHIpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCAodW5zaWduZWQgbG9uZykocFVjRmlsZSkgLSAodW5zaWduZWQgbG9uZykocEZpbGVTdGFydCkgPj0gKHVuc2lnbmVkIGxvbmcpRmlsZUxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICAgICB1aVN0YXRlID0gU1RBVEVfRE9ORV9GSUxFOworCQkJY19maWxlID0gKHU4ICopKCh1bnNpZ25lZCBsb25nKWNfZmlsZSArICh1MzIpKChwc2V1ZG9faGVhZGVyX2xlbiArIDEpICYgMHhGRkZGRkZGRSkgKyBzaXplb2Yoc3RydWN0IHBzZXVkb19oZHIpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAodW5zaWduZWQgbG9uZykoY19maWxlKSAtICh1bnNpZ25lZCBsb25nKShwRmlsZVN0YXJ0KSA+PSAodW5zaWduZWQgbG9uZylGaWxlTGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU1RBVEVfRE9ORV9GSUxFOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICBrZnJlZShwYnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIFN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOwogICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgZWxzZQogICAgICAgICAgewogICAgICAgICAgICAgLyogQ2hlY2tzdW0gZGlkIG5vdCBjb21wdXRlICovCi0gICAgICAgICAgICBTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgICAgIHN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOwogICAgICAgICAgfQotICAgICAgICAgREVCVUcoImZ0MTAwMDpkb3dubG9hZDogYWZ0ZXIgU1RBVEVfU0VDVElPTl9QUk9WLCB1aVN0YXRlID0gJWQsIFN0YXR1cz0gJWRcbiIsIHVpU3RhdGUsIFN0YXR1cyk7CisgICAgICAgICBERUJVRygiZnQxMDAwOmRvd25sb2FkOiBhZnRlciBTVEFURV9TRUNUSU9OX1BST1YsIHN0YXRlID0gJWQsIHN0YXR1cz0gJWRcbiIsIHN0YXRlLCBzdGF0dXMpOwogICAgICAgICAgYnJlYWs7CiAKICAgICAgIGNhc2UgIFNUQVRFX0RPTkVfUFJPVjoKICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZG93bmxvYWQ6U1RBVEVfRE9ORV9QUk9WXG4iKTsKLSAgICAgICAgIHVpU3RhdGUgPSBTVEFURV9ET05FX0ZJTEU7CisgICAgICAgICBzdGF0ZSA9IFNUQVRFX0RPTkVfRklMRTsKICAgICAgICAgIGJyZWFrOwogCiAKICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICBTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgIHN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOwogICAgICAgICAgYnJlYWs7CiAgICAgICB9IC8qIEVuZCBTd2l0Y2ggKi8KIAotICAgICAgaWYgKFN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykgeworICAgICAgaWYgKHN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykgewogICAgICAgICAgIGJyZWFrOwogICAgICAgfQogCiAvKioqKgogICAgICAgLy8gQ2hlY2sgaWYgQ2FyZCBpcyBwcmVzZW50Ci0gICAgICBTdGF0dXMgPSBIYXJsZXlfUmVhZF9SZWdpc3RlcigmdGVtcCwgRlQxMDAwX1JFR19TVVBfSU1BU0spOwotICAgICAgaWYgKCAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHx8ICh0ZW1wID09IDB4MDAwMCkgKSB7CisgICAgICBzdGF0dXMgPSBIYXJsZXlfUmVhZF9SZWdpc3RlcigmdGVtcCwgRlQxMDAwX1JFR19TVVBfSU1BU0spOworICAgICAgaWYgKCAoc3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHx8ICh0ZW1wID09IDB4MDAwMCkgKSB7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAKLSAgICAgIFN0YXR1cyA9IEhhcmxleV9SZWFkX1JlZ2lzdGVyKCZ0ZW1wLCBGVDEwMDBfUkVHX0FTSUNfSUQpOwotICAgICAgaWYgKCAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHx8ICh0ZW1wID09IDB4ZmZmZikgKSB7CisgICAgICBzdGF0dXMgPSBIYXJsZXlfUmVhZF9SZWdpc3RlcigmdGVtcCwgRlQxMDAwX1JFR19BU0lDX0lEKTsKKyAgICAgIGlmICggKHN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSB8fCAodGVtcCA9PSAweGZmZmYpICkgewogICAgICAgICAgIGJyZWFrOwogICAgICAgfQogKioqKi8KIAogICAgfSAvKiBFbmQgd2hpbGUgKi8KIAotICAgREVCVUcoIkRvd25sb2FkIGV4aXRpbmcgd2l0aCBzdGF0dXMgPSAweCU4eFxuIiwgU3RhdHVzKTsKKyAgIERFQlVHKCJEb3dubG9hZCBleGl0aW5nIHdpdGggc3RhdHVzID0gMHglOHhcbiIsIHN0YXR1cyk7CiAgICBmdDEwMDBfd3JpdGVfcmVnaXN0ZXIoZnQxMDAwZGV2LCBGVDEwMDBfREJfRE5MRF9UWCwgRlQxMDAwX1JFR19ET09SQkVMTCk7CiAKLSAgIHJldHVybiBTdGF0dXM7CisgICByZXR1cm4gc3RhdHVzOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX2h3LmMgYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX2h3LmMKaW5kZXggNWI4OWVlMi4uNjQzYTYzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF9ody5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfaHcuYwpAQCAtNDEsMzcgKzQxLDkgQEAKIC8vSmltCiAKIHN0YXRpYyB1OCB0ZW1wYnVmZmVyWzE2MDBdOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZ0NhcmRJbmRleDsKIAogI2RlZmluZSBNQVhfUkNWX0xPT1AgICAxMDAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICBmdDEwMDBfY29udHJvbF9jb21wbGV0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBmdDEwMDBfY29udHJvbF9jb21wbGV0ZShzdHJ1Y3QgdXJiICp1cmIpCi17Ci0gICAgc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiA9IChzdHJ1Y3QgZnQxMDAwX2RldmljZSAqKXVyYi0+Y29udGV4dDsKLQotICAgIC8vREVCVUcoIkZUMTAwMF9DT05UUk9MX0NPTVBMRVRFIEVOVEVSRURcbiIpOwotICAgIGlmIChmdDEwMDBkZXYgPT0gTlVMTCApCi0gICAgewotICAgICAgICBERUJVRygiTlVMTCBmdDEwMDBkZXYsIGZhaWx1cmVcbiIpOwotICAgICAgICByZXR1cm4gOwotICAgIH0KLSAgICBlbHNlIGlmICggZnQxMDAwZGV2LT5kZXYgPT0gTlVMTCApCi0gICAgewotICAgICAgICBERUJVRygiTlVMTCBmdDEwMDBkZXYtPmRldiwgZmFpbHVyZVxuIik7Ci0gICAgICAgIHJldHVybiA7Ci0gICAgfQotCi0gICAgaWYod2FpdHF1ZXVlX2FjdGl2ZSgmZnQxMDAwZGV2LT5jb250cm9sX3dhaXQpKQotICAgIHsKLSAgICAgICAgd2FrZV91cCgmZnQxMDAwZGV2LT5jb250cm9sX3dhaXQpOwotICAgIH0KLQotICAgIC8vREVCVUcoIkZUMTAwMF9DT05UUk9MX0NPTVBMRVRFIFJFVFVSTkVEXG4iKTsKLX0KLQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEZ1bmN0aW9uOiAgICBmdDEwMDBfY29udHJvbAogLy8KQEAgLTE4Nyw3ICsxNTksNyBAQAogLy8gTm90ZXM6CiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXUxNiBmdDEwMDBfd3JpdGVfcmVnaXN0ZXIoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgVVNIT1JUIHZhbHVlLCB1MTYgblJlZ0luZHgpCit1MTYgZnQxMDAwX3dyaXRlX3JlZ2lzdGVyKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsIHUxNiB2YWx1ZSwgdTE2IG5SZWdJbmR4KQogewogICAgICB1MTYgcmV0ID0gU1RBVFVTX1NVQ0NFU1M7CiAKQEAgLTIyMyw3ICsxOTUsNyBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXUxNiBmdDEwMDBfcmVhZF9kcHJhbTMyKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsIFVTSE9SVCBpbmR4LCBQVUNIQVIgYnVmZmVyLCBVU0hPUlQgY250KQordTE2IGZ0MTAwMF9yZWFkX2RwcmFtMzIoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgdTE2IGluZHgsIHU4ICpidWZmZXIsIHUxNiBjbnQpCiB7CiAgICAgdTE2IHJldCA9IFNUQVRVU19TVUNDRVNTOwogCkBAIC0yNjIsNyArMjM0LDcgQEAKIC8vIE5vdGVzOgogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi11MTYgZnQxMDAwX3dyaXRlX2RwcmFtMzIoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgVVNIT1JUIGluZHgsIFBVQ0hBUiBidWZmZXIsIFVTSE9SVCBjbnQpCit1MTYgZnQxMDAwX3dyaXRlX2RwcmFtMzIoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgdTE2IGluZHgsIHU4ICpidWZmZXIsIHUxNiBjbnQpCiB7CiAgICAgIHUxNiByZXQgPSBTVEFUVVNfU1VDQ0VTUzsKIApAQCAtMjk5LDcgKzI3MSw3IEBACiAvLyBOb3RlczoKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdTE2IGZ0MTAwMF9yZWFkX2RwcmFtMTYoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgVVNIT1JUIGluZHgsIFBVQ0hBUiBidWZmZXIsIHU4IGhpZ2hsb3cpCit1MTYgZnQxMDAwX3JlYWRfZHByYW0xNihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCB1MTYgaW5keCwgdTggKmJ1ZmZlciwgdTggaGlnaGxvdykKIHsKICAgICB1MTYgcmV0ID0gU1RBVFVTX1NVQ0NFU1M7CiAKQEAgLTM0Nyw3ICszMTksNyBAQAogLy8gTm90ZXM6CiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXUxNiBmdDEwMDBfd3JpdGVfZHByYW0xNihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCBVU0hPUlQgaW5keCwgVVNIT1JUIHZhbHVlLCB1OCBoaWdobG93KQordTE2IGZ0MTAwMF93cml0ZV9kcHJhbTE2KHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsIHUxNiBpbmR4LCB1MTYgdmFsdWUsIHU4IGhpZ2hsb3cpCiB7CiAgICAgIHUxNiByZXQgPSBTVEFUVVNfU1VDQ0VTUzsKIApAQCAtMzkyLDEwICszNjQsMTAgQEAKIC8vIE5vdGVzOgogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi11MTYgZml4X2Z0MTAwMF9yZWFkX2RwcmFtMzIoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgVVNIT1JUIGluZHgsIFBVQ0hBUiBidWZmZXIpCit1MTYgZml4X2Z0MTAwMF9yZWFkX2RwcmFtMzIoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgdTE2IGluZHgsIHU4ICpidWZmZXIpCiB7Ci0gICAgVUNIQVIgYnVmWzE2XTsKLSAgICBVU0hPUlQgcG9zOworICAgIHU4IGJ1ZlsxNl07CisgICAgdTE2IHBvczsKICAgICB1MTYgcmV0ID0gU1RBVFVTX1NVQ0NFU1M7CiAKICAgICAvL0RFQlVHKCJmaXhfZnQxMDAwX3JlYWRfZHByYW0zMjogaW5keDogJWQgIFxuIiwgaW5keCk7CkBAIC00NDEsMTQgKzQxMywxNCBAQAogLy8gTm90ZXM6CiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXUxNiBmaXhfZnQxMDAwX3dyaXRlX2RwcmFtMzIoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgVVNIT1JUIGluZHgsIFBVQ0hBUiBidWZmZXIpCit1MTYgZml4X2Z0MTAwMF93cml0ZV9kcHJhbTMyKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsIHUxNiBpbmR4LCB1OCAqYnVmZmVyKQogewotICAgIFVTSE9SVCBwb3MxOwotICAgIFVTSE9SVCBwb3MyOwotICAgIFVTSE9SVCBpOwotICAgIFVDSEFSIGJ1ZlszMl07Ci0gICAgVUNIQVIgcmVzdWx0YnVmZmVyWzMyXTsKLSAgICBQVUNIQVIgcGRhdGE7CisgICAgdTE2IHBvczE7CisgICAgdTE2IHBvczI7CisgICAgdTE2IGk7CisgICAgdTggYnVmWzMyXTsKKyAgICB1OCByZXN1bHRidWZmZXJbMzJdOworICAgIHU4ICpwZGF0YTsKICAgICB1MTYgcmV0ICA9IFNUQVRVU19TVUNDRVNTOwogCiAgICAgLy9ERUJVRygiZml4X2Z0MTAwMF93cml0ZV9kcHJhbTMyOiBFbnRlcmVkOlxuIik7CkBAIC00NzIsNyArNDQ0LDcgQEAKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKLSAgICByZXQgPSBmdDEwMDBfcmVhZF9kcHJhbTMyKGZ0MTAwMGRldiwgcG9zMSwgKFBVQ0hBUikmcmVzdWx0YnVmZmVyWzBdLCAxNik7CisgICAgcmV0ID0gZnQxMDAwX3JlYWRfZHByYW0zMihmdDEwMDBkZXYsIHBvczEsICh1OCAqKSZyZXN1bHRidWZmZXJbMF0sIDE2KTsKICAgICBpZiAocmV0ID09IFNUQVRVU19TVUNDRVNTKQogICAgIHsKICAgICAgICAgYnVmZmVyID0gcGRhdGE7CkBAIC00ODcsOCArNDU5LDggQEAKIAogICAgIGlmIChyZXQgPT0gU1RBVFVTX0ZBSUxVUkUpCiAgICAgewotICAgICAgICByZXQgPSBmdDEwMDBfd3JpdGVfZHByYW0zMihmdDEwMDBkZXYsIHBvczEsIChQVUNIQVIpJnRlbXBidWZmZXJbMF0sIDE2KTsKLSAgICAgICAgcmV0ID0gZnQxMDAwX3JlYWRfZHByYW0zMihmdDEwMDBkZXYsIHBvczEsIChQVUNIQVIpJnJlc3VsdGJ1ZmZlclswXSwgMTYpOworICAgICAgICByZXQgPSBmdDEwMDBfd3JpdGVfZHByYW0zMihmdDEwMDBkZXYsIHBvczEsICh1OCAqKSZ0ZW1wYnVmZmVyWzBdLCAxNik7CisgICAgICAgIHJldCA9IGZ0MTAwMF9yZWFkX2RwcmFtMzIoZnQxMDAwZGV2LCBwb3MxLCAodTggKikmcmVzdWx0YnVmZmVyWzBdLCAxNik7CiAgICAgICAgIGlmIChyZXQgPT0gU1RBVFVTX1NVQ0NFU1MpCiAgICAgICAgIHsKICAgICAgICAgICAgIGJ1ZmZlciA9IHBkYXRhOwpAQCAtNTE4LDEwICs0OTAsMTAgQEAKIC8vCiAvLyAgUmV0dXJuczogICAgTm9uZQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotc3RhdGljIHZvaWQgY2FyZF9yZXNldF9kc3AgKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsIEJPT0xFQU4gdmFsdWUpCitzdGF0aWMgdm9pZCBjYXJkX3Jlc2V0X2RzcCAoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgYm9vbCB2YWx1ZSkKIHsKICAgICB1MTYgc3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7Ci0gICAgVVNIT1JUIHRlbXB3b3JkOworICAgIHUxNiB0ZW1wd29yZDsKIAogICAgIHN0YXR1cyA9IGZ0MTAwMF93cml0ZV9yZWdpc3RlciAoZnQxMDAwZGV2LCBIT1NUX0lOVEZfQkUsIEZUMTAwMF9SRUdfU1VQX0NUUkwpOwogICAgIHN0YXR1cyA9IGZ0MTAwMF9yZWFkX3JlZ2lzdGVyKGZ0MTAwMGRldiwgJnRlbXB3b3JkLCBGVDEwMDBfUkVHX1NVUF9DVFJMKTsKQEAgLTYyMCw4ICs1OTIsOCBAQAogaW50IGRzcF9yZWxvYWQoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldikKIHsKICAgICB1MTYgc3RhdHVzOwotICAgIFVTSE9SVCB0ZW1wd29yZDsKLSAgICBVTE9ORyB0ZW1wbG9uZzsKKyAgICB1MTYgdGVtcHdvcmQ7CisgICAgdTMyIHRlbXBsb25nOwogCiAJc3RydWN0IGZ0MTAwMF9pbmZvICpwZnQxMDAwaW5mbzsKIApAQCAtNjQ4LDcgKzYyMCw3IEBACiAgICAgc3RhdHVzID0gZnQxMDAwX3dyaXRlX3JlZ2lzdGVyIChmdDEwMDBkZXYsIEhPU1RfSU5URl9CRSwgRlQxMDAwX1JFR19TVVBfQ1RSTCk7CiAKICAgICAvLyBMZXQncyBjaGVjayBmb3IgRkVGRQotICAgIHN0YXR1cyA9IGZ0MTAwMF9yZWFkX2RwcmFtMzIgKGZ0MTAwMGRldiwgRlQxMDAwX01BR19EUFJBTV9GRUZFX0lORFgsIChQVUNIQVIpJnRlbXBsb25nLCA0KTsKKyAgICBzdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTMyIChmdDEwMDBkZXYsIEZUMTAwMF9NQUdfRFBSQU1fRkVGRV9JTkRYLCAodTggKikmdGVtcGxvbmcsIDQpOwogICAgIERFQlVHKCJ0ZW1wbG9uZyAoZmVmZSkgPSAweCU4eFxuIiwgdGVtcGxvbmcpOwogCiAgICAgLy8gY2FsbCBjb2RlbG9hZGVyCkBAIC03NTMsNyArNzI1LDcgQEAKIAogICAgIC8vIEluaXRpYWxpemUgRFNQIGhlYXJ0YmVhdCBhcmVhIHRvIGhvCiAgICAgZnQxMDAwX3dyaXRlX2RwcmFtMTYoZnQxMDAwZGV2LCBGVDEwMDBfTUFHX0hJX0hPLCBob19tYWcsIEZUMTAwMF9NQUdfSElfSE9fSU5EWCk7Ci0gICAgZnQxMDAwX3JlYWRfZHByYW0xNihmdDEwMDBkZXYsIEZUMTAwMF9NQUdfSElfSE8sIChQQ0hBUikmdGVtcHdvcmQsIEZUMTAwMF9NQUdfSElfSE9fSU5EWCk7CisgICAgZnQxMDAwX3JlYWRfZHByYW0xNihmdDEwMDBkZXYsIEZUMTAwMF9NQUdfSElfSE8sICh1OCAqKSZ0ZW1wd29yZCwgRlQxMDAwX01BR19ISV9IT19JTkRYKTsKICAgICBERUJVRygiZnQxMDAwX2h3OmZ0MTAwMF9yZXNldF9jYXJkOmhpX2hvIHZhbHVlID0gMHgleFxuIiwgdGVtcHdvcmQpOwogCiAKQEAgLTgwMCw4ICs3NzIsNyBAQAogCWludCBpLCByZXRfdmFsOwogCXN0cnVjdCBsaXN0X2hlYWQgKmN1ciwgKnRtcDsKIAljaGFyIGNhcmRfbnJbMl07Ci0KLQlnQ2FyZEluZGV4PTA7IC8vbWJlbGlhbgorCXVuc2lnbmVkIGxvbmcgZ0NhcmRJbmRleCA9IDA7CiAKICAgICBERUJVRygiRW50ZXIgaW5pdF9mdDEwMDBfbmV0ZGV2Li4uXG4iKTsKIApAQCAtODEzLDcgKzc4NCw3IEBACiAJcmV0dXJuIC1FTk9NRU07CiAgICAgfQogCi0JcEluZm8gPSAoc3RydWN0IGZ0MTAwMF9pbmZvICopIG5ldGRldl9wcml2KG5ldGRldik7CisJcEluZm8gPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCiAgICAgLy9ERUJVRygiaW5pdF9mdDEwMDBfbmV0ZGV2OiBnRnQxMDAwSW5mbz0leCwgbmV0ZGV2PSV4LCBmdDEwMDBkZXY9JXhcbiIsIGdGdDEwMDBJbmZvLCBuZXRkZXYsIGZ0MTAwMGRldik7CiAKQEAgLTgyMSw5ICs3OTIsNiBAQAogCiAgICAgZGV2X2FsbG9jX25hbWUobmV0ZGV2LCBuZXRkZXYtPm5hbWUpOwogCi0gICAgLy9mb3IgdGhlIGZpcnN0IGluc2VydGVkIGNhcmQsIGRlY2lkZSB0aGUgY2FyZCBpbmRleCBiZWdpbm5pbmcgbnVtYmVyLCBpbiBjYXNlIHRoZXJlIGFyZSBleGlzdGluZyBuZXR3b3JrIGludGVyZmFjZXMKLSAgICBpZiAoIGdDYXJkSW5kZXggPT0gMCApCi0gICAgewogICAgICAgICBERUJVRygiaW5pdF9mdDEwMDBfbmV0ZGV2OiBuZXR3b3JrIGRldmljZSBuYW1lIGlzICVzXG4iLCBuZXRkZXYtPm5hbWUpOwogCiAJaWYgKCBzdHJuY21wKG5ldGRldi0+bmFtZSwiZXRoIiwgMykgPT0gMCkgewpAQCAtODQzLDEzICs4MTEsNiBAQAogCQlyZXRfdmFsID0gLUVOWElPOwogCQlnb3RvIGVycl9uZXQ7CiAgICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLy9ub3QgdGhlIGZpcnN0IGluc2VydGVkIGNhcmQsIGluY3JlYXNlIGNhcmQgbnVtYmVyIGJ5IDEKLSAgICAgICAgcEluZm8tPkNhcmROdW1iZXIgPSBnQ2FyZEluZGV4OwotICAgICAgICAvKkRFQlVHKCJjYXJkIG51bWJlciA9ICVkXG4iLCBwSW5mby0+Q2FyZE51bWJlcik7Ki8gLy9tYmVsaWFuCi0gICAgfQogCiAgICAgbWVtc2V0KCZwSW5mby0+c3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cykgKTsKIApAQCAtODYyLDcgKzgyMyw2IEBACiAgICAgcEluZm8tPm1lZGlhc3RhdGUgPSAwOwogICAgIHBJbmZvLT5maWZvX2NudCA9IDA7CiAgICAgcEluZm8tPkRldmljZUNyZWF0ZWQgPSBGQUxTRTsKLSAgICBwSW5mby0+RGV2aWNlTWFqb3IgPSAwOwogICAgIHBJbmZvLT5DdXJyZW50SW50ZXJydXB0RW5hYmxlTWFzayA9IElTUl9ERUZBVUxUX01BU0s7CiAgICAgcEluZm8tPkludGVycnVwdHNFbmFibGVkID0gRkFMU0U7CiAgICAgcEluZm8tPkNhcmRSZWFkeSA9IDA7CkBAIC04NzQsMTMgKzgzNCwxMSBAQAogICAgIHBJbmZvLT5mQ29uZFJlc2V0UGVuZCA9IDA7CiAJcEluZm8tPnVzYmJvb3QgPSAwOwogCXBJbmZvLT5kc3BhbGl2ZSA9IDA7Ci0JZm9yIChpPTA7aTwzMiA7aSsrICkKLQl7Ci0JCXBJbmZvLT50ZW1wYnVmW2ldID0gMDsKLQl9CisJbWVtc2V0KCZwSW5mby0+dGVtcGJ1ZlswXSwgMCwgc2l6ZW9mKHBJbmZvLT50ZW1wYnVmKSk7CiAKICAgICBJTklUX0xJU1RfSEVBRCgmcEluZm8tPnByb3ZfbGlzdCk7CiAKKwlJTklUX0xJU1RfSEVBRCgmcEluZm8tPm5vZGVzLmxpc3QpOwogLy9tYmVsaWFuCiAjaWZkZWYgSEFWRV9ORVRfREVWSUNFX09QUwogCW5ldGRldi0+bmV0ZGV2X29wcyA9ICZmdG5ldF9vcHM7CkBAIC05ODIsNyArOTQwLDcgQEAKIAogCiAgICAgLy9DcmVhdGUgY2hhcmFjdGVyIGRldmljZSwgaW1wbGVtZW50ZWQgYnkgSmltCi0gICAgZnQxMDAwX0NyZWF0ZURldmljZShmdDEwMDBkZXYpOworICAgIGZ0MTAwMF9jcmVhdGVfZGV2KGZ0MTAwMGRldik7CiAKICAgICBERUJVRyAoInJlZ19mdDEwMDBfbmV0ZGV2IHJldHVybmVkXG4iKTsKIApAQCAtMTAyNiwxNzggKzk4NCw2IEBACiAgICAgLy9ERUJVRygiUmV0dXJuIGZyb20gZnQxMDAwX3VzYl90cmFuc21pdF9jb21wbGV0ZVxuIik7CiB9CiAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICBmdDEwMDBfY29udHJvbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IGZ0MTAwMF9yZWFkX2ZpZm9fcmVnKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsdW5zaWduZWQgaW50IHBpcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHU4IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHU4IHJlcXVlc3R0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aW1lb3V0KQotewotICAgIHUxNiByZXQ7Ci0KLSAgICBERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKLSAgICBzdHJ1Y3QgdXJiICp1cmI7Ci0gICAgc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqZHI7Ci0gICAgaW50IHN0YXR1czsKLQotICAgIGlmIChmdDEwMDBkZXYgPT0gTlVMTCApCi0gICAgewotICAgICAgICBERUJVRygiTlVMTCBmdDEwMDBkZXYsIGZhaWx1cmVcbiIpOwotICAgICAgICByZXR1cm4gU1RBVFVTX0ZBSUxVUkU7Ci0gICAgfQotICAgIGVsc2UgaWYgKCBmdDEwMDBkZXYtPmRldiA9PSBOVUxMICkKLSAgICB7Ci0gICAgICAgIERFQlVHKCJOVUxMIGZ0MTAwMGRldi0+ZGV2LCBmYWlsdXJlXG4iKTsKLSAgICAgICAgcmV0dXJuIFNUQVRVU19GQUlMVVJFOwotICAgIH0KLQotICAgIHNwaW5fbG9jaygmZnQxMDAwZGV2LT5kZXZpY2VfbG9jayk7Ci0KLSAgICBpZihpbl9pbnRlcnJ1cHQoKSkKLSAgICB7Ci0gICAgICAgIHNwaW5fdW5sb2NrKCZmdDEwMDBkZXYtPmRldmljZV9sb2NrKTsKLSAgICAgICAgcmV0dXJuIC1FQlVTWTsKLSAgICB9Ci0KLSAgICB1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotICAgIGRyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHVzYl9jdHJscmVxdWVzdCksIGluX2ludGVycnVwdCgpID8gR0ZQX0FUT01JQyA6IEdGUF9LRVJORUwpOwotCi0gICAgaWYoIXVyYiB8fCAhZHIpCi0gICAgewotCWtmcmVlKGRyKTsKLQl1c2JfZnJlZV91cmIodXJiKTsKLSAgICAgICAgc3Bpbl91bmxvY2soJmZ0MTAwMGRldi0+ZGV2aWNlX2xvY2spOwotICAgICAgICByZXR1cm4gLUVOT01FTTsKLSAgICB9Ci0KLQotCi0gICAgZHItPmJSZXF1ZXN0VHlwZSA9IHJlcXVlc3R0eXBlOwotICAgIGRyLT5iUmVxdWVzdCA9IHJlcXVlc3Q7Ci0gICAgZHItPndWYWx1ZSA9IHZhbHVlOwotICAgIGRyLT53SW5kZXggPSBpbmRleDsKLSAgICBkci0+d0xlbmd0aCA9IHNpemU7Ci0KLSAgICB1c2JfZmlsbF9jb250cm9sX3VyYih1cmIsIGZ0MTAwMGRldi0+ZGV2LCBwaXBlLCAoY2hhciopZHIsICh2b2lkKilkYXRhLCBzaXplLCAodm9pZCAqKWZ0MTAwMF9jb250cm9sX2NvbXBsZXRlLCAodm9pZCopZnQxMDAwZGV2KTsKLQotCi0gICAgaW5pdF93YWl0cXVldWVfaGVhZCgmZnQxMDAwZGV2LT5jb250cm9sX3dhaXQpOwotCi0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQotICAgIGFkZF93YWl0X3F1ZXVlKCZmdDEwMDBkZXYtPmNvbnRyb2xfd2FpdCwgJndhaXQpOwotCi0KLQotCi0gICAgc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfS0VSTkVMKTsKLQotICAgIGlmKHN0YXR1cykKLSAgICB7Ci0gICAgICAgIHVzYl9mcmVlX3VyYih1cmIpOwotICAgICAgICBrZnJlZShkcik7Ci0gICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZmdDEwMDBkZXYtPmNvbnRyb2xfd2FpdCwgJndhaXQpOwotICAgICAgICBzcGluX3VubG9jaygmZnQxMDAwZGV2LT5kZXZpY2VfbG9jayk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgaWYodXJiLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKQotICAgIHsKLSAgICAgICAgd2hpbGUodGltZW91dCAmJiB1cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IHRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHN0YXR1cyA9IDE7Ci0gICAgfQotCi0gICAgcmVtb3ZlX3dhaXRfcXVldWUoJmZ0MTAwMGRldi0+Y29udHJvbF93YWl0LCAmd2FpdCk7Ci0KLSAgICBpZighc3RhdHVzKQotICAgIHsKLSAgICAgICAgdXNiX3VubGlua191cmIodXJiKTsKLSAgICAgICAgcHJpbnRrKCJmdDEwMDAgdGltZW91dFxuIik7Ci0gICAgICAgIHN0YXR1cyA9IC1FVElNRURPVVQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHN0YXR1cyA9IHVyYi0+c3RhdHVzOwotCi0gICAgICAgIGlmKHVyYi0+c3RhdHVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmludGsoImZ0MTAwMCBjb250cm9sIG1lc3NhZ2UgZmFpbGVkICh1cmIgYWRkcjogJXApIHdpdGggZXJyb3IgbnVtYmVyOiAlaVxuIiwgdXJiLCAoaW50KXN0YXR1cyk7Ci0KLSAgICAgICAgICAgIHVzYl9jbGVhcl9oYWx0KGZ0MTAwMGRldi0+ZGV2LCB1c2JfcmN2Y3RybHBpcGUoZnQxMDAwZGV2LT5kZXYsIDApKTsKLSAgICAgICAgICAgIHVzYl9jbGVhcl9oYWx0KGZ0MTAwMGRldi0+ZGV2LCB1c2Jfc25kY3RybHBpcGUoZnQxMDAwZGV2LT5kZXYsIDApKTsKLSAgICAgICAgICAgIHVzYl91bmxpbmtfdXJiKHVyYik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotCi0gICAgdXNiX2ZyZWVfdXJiKHVyYik7Ci0gICAga2ZyZWUoZHIpOwotICAgIHNwaW5fdW5sb2NrKCZmdDEwMDBkZXYtPmRldmljZV9sb2NrKTsKLSAgICByZXR1cm4gcmV0OwotCi0KLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEZ1bmN0aW9uOiAgICBmdDEwMDBfcmVhZF9maWZvX2xlbgotLy8KLS8vIFBhcmFtZXRlcnM6ICBmdDEwMDBkZXYgLSBkZXZpY2Ugc3RydWN0dXJlCi0vLwotLy8KLS8vIFJldHVybnM6ICAgICBub25lCi0vLwotLy8gRGVzY3JpcHRpb246IHJlYWQgdGhlIGZpZm8gbGVuZ3RoIHJlZ2lzdGVyIGNvbnRlbnQKLS8vCi0vLyBOb3RlczoKLS8vCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotc3RhdGljIGlubGluZSB1MTYgZnQxMDAwX3JlYWRfZmlmb19sZW4gKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0gICAgdTE2IHRlbXA7Ci0gICAgdTE2IHJldDsKLQotCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgZnQxMDAwX2luZm8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKLSAgICBzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2ID0gaW5mby0+cEZ0MTAwMERldjsKLS8vICAgIERFQlVHKCJmdDEwMDBfcmVhZF9maWZvX2xlbjogZW50ZXIgZnQxMDAwZGV2ICV4XG4iLCBmdDEwMDBkZXYpOwkJCS8vYWVsaWFzIFstXSByZWFzb246IHdhcm5pbmc6IGZvcm1hdCA/Pz8leD8/PyBleHBlY3RzIHR5cGUgPz8/dW5zaWduZWQgaW50Pz8/LCBidXQgYXJndW1lbnQgMiBoYXMgdHlwZSA/Pz9zdHJ1Y3QgZnQxMDAwX2RldmljZSAqPz8/Ci0gICAgREVCVUcoImZ0MTAwMF9yZWFkX2ZpZm9fbGVuOiBlbnRlciBmdDEwMDBkZXYgJXBcbiIsIGZ0MTAwMGRldik7CS8vYWVsaWFzIFsrXSByZWFzb246IHVwCi0KLSAgICByZXQgPSBTVEFUVVNfU1VDQ0VTUzsKLQotICAgIHJldCA9IGZ0MTAwMF9yZWFkX2ZpZm9fcmVnKGZ0MTAwMGRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdXNiX3JjdmN0cmxwaXBlKGZ0MTAwMGRldi0+ZGV2LDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICBIQVJMRVlfUkVBRF9SRUdJU1RFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSEFSTEVZX1JFQURfT1BFUkFUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVDEwMDBfUkVHX01BR19VRlNSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTEFSR0VfVElNRU9VVCk7Ci0KLSAgICBpZiAocmV0PjApCi0gICAgICAgIHJldCA9IFNUQVRVU19TVUNDRVNTOwotICAgIGVsc2UKLSAgICAgICAgcmV0ID0gU1RBVFVTX0ZBSUxVUkU7Ci0KLSAgICBERUJVRygiZnQxMDAwX3JlYWRfZmlmb19sZW46IHJldHVybmVkICVkXG4iLCB0ZW1wKTsKLQotICAgIHJldHVybiAodGVtcC0gMTYpOwotCi19Ci0KLQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vCiAvLyBGdW5jdGlvbjogICBmdDEwMDBfY29weV9kb3duX3BrdApAQCAtMTIxOSwxNiArMTAwNSwxNSBAQAogICAgIHN0cnVjdCBmdDEwMDBfZGV2aWNlICpwRnQxMDAwRGV2ID0gcEluZm8tPnBGdDEwMDBEZXY7CiAKIAotICAgIGludCBpLCBjb3VudCwgcmV0OwotICAgIFVTSE9SVCAqcFRlbXA7Ci0gICAgVVNIT1JUIGNoZWNrc3VtOworCWludCBjb3VudCwgcmV0OwogICAgIHU4ICp0OworCXN0cnVjdCBwc2V1ZG9faGRyIGhkcjsKIAogICAgIGlmICghcEluZm8tPkNhcmRSZWFkeSkKICAgICB7CiAKICAgICAgICAgREVCVUcoImZ0MTAwMF9jb3B5X2Rvd25fcGt0OjpDYXJkIE5vdCBSZWFkeVxuIik7Ci0gICAgCXJldHVybiBTVEFUVVNfRkFJTFVSRTsKKwlyZXR1cm4gLUVOT0RFVjsKIAogICAgIH0KIApAQCAtMTI0MCwyNyArMTAyNSwyNyBAQAogICAgIHsKICAgICAgICAgREVCVUcoIkVycm9yOmZ0MTAwMF9jb3B5X2Rvd25fcGt0Ok1lc3NhZ2UgU2l6ZSBPdmVyZmxvdyFcbiIpOwogICAgIAlERUJVRygic2l6ZSA9ICVkXG4iLCBjb3VudCk7Ci0gICAgCXJldHVybiBTVEFUVVNfRkFJTFVSRTsKKwlyZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKICAgICBpZiAoIGNvdW50ICUgNCkKICAgICAgICAgY291bnQgPSBjb3VudCArICg0LSAoY291bnQgJTQpICk7CiAKLSAgICBwVGVtcCA9IChQVVNIT1JUKSYocEZ0MTAwMERldi0+dHhfYnVmWzBdKTsKLSAgICAqcFRlbXAgKysgPSBudG9ocyhjb3VudCk7Ci0gICAgKnBUZW1wICsrID0gMHgxMDIwOwotICAgICpwVGVtcCArKyA9IDB4MjAxMDsKLSAgICAqcFRlbXAgKysgPSAweDkxMDA7Ci0gICAgKnBUZW1wICsrID0gMDsKLSAgICAqcFRlbXAgKysgPSAwOwotICAgICpwVGVtcCArKyA9IDA7Ci0gICAgcFRlbXAgPSAoUFVTSE9SVCkmKHBGdDEwMDBEZXYtPnR4X2J1ZlswXSk7Ci0gICAgY2hlY2tzdW0gPSAqcFRlbXAgKys7Ci0gICAgZm9yIChpPTE7IGk8NzsgaSsrKQotICAgIHsKLSAgICAgICAgY2hlY2tzdW0gXj0gKnBUZW1wICsrOwotICAgIH0KLSAgICAqcFRlbXArKyA9IGNoZWNrc3VtOworCW1lbXNldCgmaGRyLCAwLCBzaXplb2Yoc3RydWN0IHBzZXVkb19oZHIpKTsKKworCWhkci5sZW5ndGggPSBudG9ocyhjb3VudCk7CisJaGRyLnNvdXJjZSA9IDB4MTA7CisJaGRyLmRlc3RpbmF0aW9uID0gMHgyMDsKKwloZHIucG9ydGRlc3QgPSAweDIwOworCWhkci5wb3J0c3JjID0gMHgxMDsKKwloZHIuc2hfc3RyX2lkID0gMHg5MTsKKwloZHIuY29udHJvbCA9IDB4MDA7CisKKwloZHIuY2hlY2tzdW0gPSBoZHIubGVuZ3RoIF4gaGRyLnNvdXJjZSBeIGhkci5kZXN0aW5hdGlvbiBeCisJCQloZHIucG9ydGRlc3QgXiBoZHIucG9ydHNyYyBeIGhkci5zaF9zdHJfaWQgXgorCQkJaGRyLmNvbnRyb2w7CisKKwltZW1jcHkoJnBGdDEwMDBEZXYtPnR4X2J1ZlswXSwgJmhkciwgc2l6ZW9mKGhkcikpOwogCW1lbWNweSgmKHBGdDEwMDBEZXYtPnR4X2J1ZltzaXplb2Yoc3RydWN0IHBzZXVkb19oZHIpXSksIHBhY2tldCwgbGVuKTsKIAogICAgIG5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKQEAgLTEyODMsMjUgKzEwNjgsMTggQEAKICAgICB9Ki8KIAogCi0gICAgcmV0ID0gdXNiX3N1Ym1pdF91cmIocEZ0MTAwMERldi0+dHhfdXJiLCBHRlBfQVRPTUlDKTsKLSAgICBpZihyZXQpCi0gICAgeworCXJldCA9IHVzYl9zdWJtaXRfdXJiKHBGdDEwMDBEZXYtPnR4X3VyYiwgR0ZQX0FUT01JQyk7CisJaWYgKHJldCkgewogCQlERUJVRygiZnQxMDAwIGZhaWxlZCB0eF91cmIgJWRcbiIsIHJldCk7Ci0KLQkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOwotCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8vREVCVUcoImZ0MTAwMCBzdWNlc3MgdHhfdXJiICVkXG4iLCByZXQpOwotCi0gICAgICAgIHBJbmZvLT5zdGF0cy50eF9wYWNrZXRzKys7Ci0gICAgICAgIHBJbmZvLT5zdGF0cy50eF9ieXRlcyArPSAobGVuKzE0KTsKLSAgICB9CisJCXJldHVybiByZXQ7CisJfSBlbHNlIHsKKwkJcEluZm8tPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJcEluZm8tPnN0YXRzLnR4X2J5dGVzICs9IChsZW4rMTQpOworCX0KIAogICAgIC8vREVCVUcoImZ0MTAwMF9jb3B5X2Rvd25fcGt0KCkgZXhpdFxuIik7CiAKLSAgICByZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CisJcmV0dXJuIDA7CiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMzMxLDE0ICsxMTA5LDEzIEBACiAgICAgaWYgKCBza2IgPT0gTlVMTCApCiAgICAgewogICAgICAgICBERUJVRyAoImZ0MTAwMF9odzogZnQxMDAwX3N0YXJ0X3htaXQ6c2tiID09IE5VTEwhISFcbiIgKTsKLSAgICAgICAgcmV0dXJuIFNUQVRVU19GQUlMVVJFOworCXJldHVybiBORVRERVZfVFhfT0s7CiAgICAgfQogCiAgICAgaWYgKCBwRnQxMDAwRGV2LT5zdGF0dXMgJiBGVDEwMDBfU1RBVFVTX0NMT1NJTkcpCiAgICAgewogICAgICAgICBERUJVRygibmV0d29yayBkcml2ZXIgaXMgY2xvc2VkLCByZXR1cm5cbiIpOwotICAgICAgICBkZXZfa2ZyZWVfc2tiKHNrYik7Ci0gICAgICAgIHJldHVybiBTVEFUVVNfU1VDQ0VTUzsKKwlnb3RvIGVycjsKICAgICB9CiAKICAgICAvL0RFQlVHKCJmdDEwMDBfc3RhcnRfeG1pdCAxOmxlbmd0aCBvZiBwYWNrZXQgPSAlZFxuIiwgc2tiLT5sZW4pOwpAQCAtMTM1NywyOCArMTEzNCwyNCBAQAogICAgIHsKICAgICAgICAgLyogRHJvcCBwYWNrZXQgaXMgbWVkaWFzdGF0ZSBpcyBkb3duICovCiAgICAgICAgIERFQlVHKCJmdDEwMDBfaHc6ZnQxMDAwX3N0YXJ0X3htaXQ6bWVkaWFzdGF0ZSBpcyBkb3duXG4iKTsKLSAgICAgICAgZGV2X2tmcmVlX3NrYihza2IpOwotICAgICAgICByZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CisJZ290byBlcnI7CiAgICAgfQogCiAgICAgaWYgKCAoc2tiLT5sZW4gPCBFTkVUX0hFQURFUl9TSVpFKSB8fCAoc2tiLT5sZW4gPiBFTkVUX01BWF9TSVpFKSApCiAgICAgewogICAgICAgICAvKiBEcm9wIHBhY2tldCB3aGljaCBoYXMgaW52YWxpZCBzaXplICovCiAgICAgICAgIERFQlVHKCJmdDEwMDBfaHc6ZnQxMDAwX3N0YXJ0X3htaXQ6aW52YWxpZCBldGhlcm5ldCBsZW5ndGhcbiIpOwotICAgICAgICBkZXZfa2ZyZWVfc2tiKHNrYik7Ci0gICAgICAgIHJldHVybiBTVEFUVVNfU1VDQ0VTUzsKKwlnb3RvIGVycjsKICAgICB9CiAvL21iZWxpYW4KLSAgICBpZihmdDEwMDBfY29weV9kb3duX3BrdCAoZGV2LCAocGRhdGErRU5FVF9IRUFERVJfU0laRS0yKSwgc2tiLT5sZW4gLSBFTkVUX0hFQURFUl9TSVpFICsgMikgPT0gU1RBVFVTX0ZBSUxVUkUpCi0JewotICAgIAlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0JCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKLQl9CisJZnQxMDAwX2NvcHlfZG93bl9wa3QoZGV2LCAocGRhdGErRU5FVF9IRUFERVJfU0laRS0yKSwKKwkJCQlza2ItPmxlbiAtIEVORVRfSEVBREVSX1NJWkUgKyAyKTsKIAotICAgIGRldl9rZnJlZV9za2Ioc2tiKTsKK2VycjoKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CiAgICAgLy9ERUJVRygiIGZ0MTAwMF9zdGFydF94bWl0KCkgZXhpdFxuIik7CiAKLSAgICByZXR1cm4gMDsKKwlyZXR1cm4gTkVUREVWX1RYX09LOwogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTQyNCw3ICsxMTk3LDcgQEAKICAgICAvL0RFQlVHKCJmdDEwMDBfY29weV91cF9wa3Q6IHRyYW5zZmVyX2J1ZmZlcl9sZW5ndGg9JWQsIGFjdHVhbF9idWZmZXJfbGVuPSVkXG4iLAogICAgICAgLy8gICAgICAgdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCi0gICAgY2hrc3VtID0gKFBVU0hPUlQpZnQxMDAwZGV2LT5yeF9idWY7CisgICAgY2hrc3VtID0gKHUxNiAqKWZ0MTAwMGRldi0+cnhfYnVmOwogCiAgICAgdGVtcHdvcmQgPSAqY2hrc3VtKys7CiAgICAgZm9yIChpPTE7IGk8NzsgaSsrKQpAQCAtMTUyMSw3ICsxMjk0LDcgQEAKICAgICB7CiAgICAgICAgIERFQlVHKCJuZXR3b3JrIGRyaXZlciBpcyBjbG9zZWQsIHJldHVyblxuIik7CiAgICAgICAgIC8vdXNiX2tpbGxfdXJiKHBGdDEwMDBEZXYtPnJ4X3VyYik7IC8vbWJlbGlhbgotICAgICAgICByZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CisJcmV0dXJuIC1FTk9ERVY7CiAgICAgfQogCiAgICAgdXNiX2ZpbGxfYnVsa191cmIocEZ0MTAwMERldi0+cnhfdXJiLApAQCAtMTUzNiwxMiArMTMwOSwxMiBAQAogICAgIGlmKChyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwRnQxMDAwRGV2LT5yeF91cmIsIEdGUF9BVE9NSUMpKSkKICAgICB7CiAgICAgICAgIHByaW50aygiZnQxMDAwX3N1Ym1pdF9yeF91cmI6IHN1Ym1pdHRpbmcgcnhfdXJiICVkIGZhaWxlZFxuIiwgcmVzdWx0KTsKLSAgICAgICAgcmV0dXJuIFNUQVRVU19GQUlMVVJFOworCXJldHVybiByZXN1bHQ7CiAgICAgfQogCiAgICAgLy9ERUJVRygiZnQxMDAwX3N1Ym1pdF9yeF91cmIgZXhpdDogcmVzdWx0PSVkXG4iLCByZXN1bHQpOwogCi0gICAgcmV0dXJuIFNUQVRVU19TVUNDRVNTOworCXJldHVybiAwOwogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTU2MCw4ICsxMzMzLDkgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBzdGF0aWMgaW50IGZ0MTAwMF9vcGVuIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBmdDEwMDBfaW5mbyAqcEluZm8gPSAoc3RydWN0IGZ0MTAwMF9pbmZvICopbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZnQxMDAwX2luZm8gKnBJbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKICAgICBzdHJ1Y3QgdGltZXZhbCB0djsgLy9tYmVsaWFuCisJaW50IHJldDsKIAogICAgIERFQlVHKCJmdDEwMDBfb3BlbiBpcyBjYWxsZWQgZm9yIGNhcmQgJWRcbiIsIHBJbmZvLT5DYXJkTnVtYmVyKTsKICAgICAvL0RFQlVHKCJmdDEwMDBfb3BlbjogZGV2LT5hZGRyPSV4LCBkZXYtPmFkZHJfbGVuPSVkXG4iLCBkZXYtPmFkZHIsIGRldi0+YWRkcl9sZW4pOwpAQCAtMTU3OSw4ICsxMzUzLDkgQEAKIAogICAgIG5ldGlmX2NhcnJpZXJfb24oZGV2KTsgLy9tYmVsaWFuCiAKLSAgICBmdDEwMDBfc3VibWl0X3J4X3VyYihwSW5mbyk7Ci0gICAgcmV0dXJuIDA7CisJcmV0ID0gZnQxMDAwX3N1Ym1pdF9yeF91cmIocEluZm8pOworCisJcmV0dXJuIHJldDsKIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE1OTksNyArMTM3NCw3IEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogaW50IGZ0MTAwMF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQogewotCXN0cnVjdCBmdDEwMDBfaW5mbyAqcEluZm8gPSAoc3RydWN0IGZ0MTAwMF9pbmZvICopIG5ldGRldl9wcml2KG5ldCk7CisJc3RydWN0IGZ0MTAwMF9pbmZvICpwSW5mbyA9IG5ldGRldl9wcml2KG5ldCk7CiAgICAgc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiA9IHBJbmZvLT5wRnQxMDAwRGV2OwogCiAgICAgLy9ERUJVRyAoImZ0MTAwMF9jbG9zZTogbmV0ZGV2LT5yZWZjbnQ9JWRcbiIsIG5ldC0+cmVmY250KTsKQEAgLTE2MjIsNyArMTM5Nyw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZnQxMDAwX25ldGRldl9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgZnQxMDAwX2luZm8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZnQxMDAwX2luZm8gKmluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJcmV0dXJuICYoaW5mby0+c3RhdHMpOyAvL21iZWxpYW4KIH0KQEAgLTE2NDgsNyArMTQyMyw3IEBACiBzdGF0aWMgaW50IGZ0MTAwMF9jaGtjYXJkIChzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZGV2KSB7CiAgICAgdTE2IHRlbXB3b3JkOwogICAgIHUxNiBzdGF0dXM7Ci0Jc3RydWN0IGZ0MTAwMF9pbmZvICppbmZvID0gKHN0cnVjdCBmdDEwMDBfaW5mbyAqKSBuZXRkZXZfcHJpdihkZXYtPm5ldCk7CisJc3RydWN0IGZ0MTAwMF9pbmZvICppbmZvID0gbmV0ZGV2X3ByaXYoZGV2LT5uZXQpOwogCiAgICAgaWYgKGluZm8tPmZDb25kUmVzZXRQZW5kKQogICAgIHsKQEAgLTE2OTIsMTMgKzE0NjcsMTMgQEAKIC8vICAgICAgICAgID0gMSAoc3VjY2Vzc2Z1bCkKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotc3RhdGljIEJPT0xFQU4gZnQxMDAwX3JlY2VpdmVfY21kIChzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZGV2LCB1MTYgKnBidWZmZXIsIGludCBtYXhzeiwgdTE2ICpwbnh0cGgpIHsKK3N0YXRpYyBib29sIGZ0MTAwMF9yZWNlaXZlX2NtZCAoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmRldiwgdTE2ICpwYnVmZmVyLCBpbnQgbWF4c3osIHUxNiAqcG54dHBoKSB7CiAgICAgdTE2IHNpemUsIHJldDsKICAgICB1MTYgKnBwc2V1ZG9oZHI7CiAgICAgaW50IGk7CiAgICAgdTE2IHRlbXB3b3JkOwogCi0gICAgcmV0ID0gZnQxMDAwX3JlYWRfZHByYW0xNihkZXYsIEZUMTAwMF9NQUdfUEhfTEVOLCAoUFVDSEFSKSZzaXplLCBGVDEwMDBfTUFHX1BIX0xFTl9JTkRYKTsKKyAgICByZXQgPSBmdDEwMDBfcmVhZF9kcHJhbTE2KGRldiwgRlQxMDAwX01BR19QSF9MRU4sICh1OCAqKSZzaXplLCBGVDEwMDBfTUFHX1BIX0xFTl9JTkRYKTsKICAgICBzaXplID0gbnRvaHMoc2l6ZSkgKyBQU0VVRE9TWjsKICAgICBpZiAoc2l6ZSA+IG1heHN6KSB7CiAgICAgICAgIERFQlVHKCJGVDEwMDA6ZnQxMDAwX3JlY2VpdmVfY21kOkludmFsaWQgY29tbWFuZCBsZW5ndGggPSAlZFxuIiwgc2l6ZSk7CkBAIC0xNzQ4LDE1ICsxNTIzLDE1IEBACiBzdGF0aWMgaW50IGZ0MTAwMF9kc3BfcHJvdih2b2lkICphcmcpCiB7CiAgICAgc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgZnQxMDAwX2RldmljZSAqKWFyZzsKLQlzdHJ1Y3QgZnQxMDAwX2luZm8gKmluZm8gPSAoc3RydWN0IGZ0MTAwMF9pbmZvICopIG5ldGRldl9wcml2KGRldi0+bmV0KTsKKwlzdHJ1Y3QgZnQxMDAwX2luZm8gKmluZm8gPSBuZXRkZXZfcHJpdihkZXYtPm5ldCk7CiAgICAgdTE2IHRlbXB3b3JkOwogICAgIHUxNiBsZW47CiAgICAgdTE2IGk9MDsKIAlzdHJ1Y3QgcHJvdl9yZWNvcmQgKnB0cjsKIAlzdHJ1Y3QgcHNldWRvX2hkciAqcHBzZXVkb19oZHI7Ci0gICAgUFVTSE9SVCBwbXNnOworICAgIHUxNiAqcG1zZzsKICAgICB1MTYgc3RhdHVzOwotICAgIFVTSE9SVCBUZW1wU2hvcnRCdWYgWzI1Nl07CisgICAgdTE2IFRlbXBTaG9ydEJ1ZiBbMjU2XTsKIAogICAgIERFQlVHKCIqKiogRHNwUHJvdiBFbnRlcmVkXG4iKTsKIApAQCAtMTc5Miw3ICsxNTY3LDcgQEAKICAgICAgICAgICAgIGxlbiA9IGh0b25zKGxlbik7CiAgICAgICAgICAgICBsZW4gKz0gUFNFVURPU1o7CiAKLSAgICAgICAgICAgIHBtc2cgPSAoUFVTSE9SVClwdHItPnBwcm92X2RhdGE7CisgICAgICAgICAgICBwbXNnID0gKHUxNiAqKXB0ci0+cHByb3ZfZGF0YTsKIAkJcHBzZXVkb19oZHIgPSAoc3RydWN0IHBzZXVkb19oZHIgKilwbXNnOwogICAgICAgICAgICAgLy8gSW5zZXJ0IHNsb3cgcXVldWUgc2VxdWVuY2UgbnVtYmVyCiAgICAgICAgICAgICBwcHNldWRvX2hkci0+c2VxX251bSA9IGluZm8tPnNxdWVzZXFudW0rKzsKQEAgLTE4MDksNyArMTU4NCw3IEBACiAgICAgICAgICAgICBUZW1wU2hvcnRCdWZbMV0gPSBodG9ucyAobGVuKTsKICAgICAgICAgICAgIG1lbWNweSgmVGVtcFNob3J0QnVmWzJdLCBwcHNldWRvX2hkciwgbGVuKTsKIAotICAgICAgICAgICAgc3RhdHVzID0gZnQxMDAwX3dyaXRlX2RwcmFtMzIgKGRldiwgMCwgKFBVQ0hBUikmVGVtcFNob3J0QnVmWzBdLCAodW5zaWduZWQgc2hvcnQpKGxlbisyKSk7CisgICAgICAgICAgICBzdGF0dXMgPSBmdDEwMDBfd3JpdGVfZHByYW0zMiAoZGV2LCAwLCAodTggKikmVGVtcFNob3J0QnVmWzBdLCAodW5zaWduZWQgc2hvcnQpKGxlbisyKSk7CiAgICAgICAgICAgICBzdGF0dXMgPSBmdDEwMDBfd3JpdGVfcmVnaXN0ZXIgKGRldiwgRlQxMDAwX0RCX0RQUkFNX1RYLCBGVDEwMDBfUkVHX0RPT1JCRUxMKTsKIAogICAgICAgICAgICAgbGlzdF9kZWwoJnB0ci0+bGlzdCk7CkBAIC0xODMxLDcgKzE2MDYsNyBAQAogCiAKIHN0YXRpYyBpbnQgZnQxMDAwX3Byb2NfZHJ2bXNnIChzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZGV2LCB1MTYgc2l6ZSkgewotCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgZnQxMDAwX2luZm8gKikgbmV0ZGV2X3ByaXYoZGV2LT5uZXQpOworCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbyA9IG5ldGRldl9wcml2KGRldi0+bmV0KTsKICAgICB1MTYgbXNndHlwZTsKICAgICB1MTYgdGVtcHdvcmQ7CiAJc3RydWN0IG1lZGlhX21zZyAqcG1lZGlhbXNnOwpAQCAtMTgzOSw3ICsxNjE0LDcgQEAKIAlzdHJ1Y3QgZHJ2X21zZyAqcGRydm1zZzsKICAgICB1MTYgaTsKIAlzdHJ1Y3QgcHNldWRvX2hkciAqcHBzZXVkb19oZHI7Ci0gICAgUFVTSE9SVCBwbXNnOworICAgIHUxNiAqcG1zZzsKICAgICB1MTYgc3RhdHVzOwogICAgIHVuaW9uIHsKICAgICAgICAgdTggIGJ5dGVbMl07CkBAIC0xOTcxLDcgKzE3NDYsNyBAQAogICAgICAgICAgICAgICAgIHRlbXB3b3JkID0gbnRvaHMocGRydm1zZy0+bGVuZ3RoKTsKICAgICAgICAgICAgICAgICBpbmZvLT5EU1BJbmZvQmxrbGVuID0gdGVtcHdvcmQ7CiAgICAgICAgICAgICAgICAgaWYgKHRlbXB3b3JkIDwgKE1BWF9EU1BfU0VTU19SRUMtNCkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBtc2cgPSAoUFVTSE9SVCkmcGRydm1zZy0+ZGF0YVswXTsKKyAgICAgICAgICAgICAgICAgICAgcG1zZyA9ICh1MTYgKikmcGRydm1zZy0+ZGF0YVswXTsKICAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8KCh0ZW1wd29yZCsxKS8yKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmRyaXZlcm1zZzpkc3AgaW5mbyBkYXRhID0gMHgleFxuIiwgKnBtc2cpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+RFNQSW5mb0Jsa1tpKzEwXSA9ICpwbXNnKys7CkBAIC0yMDAzLDEwICsxNzc4LDEwIEBACiAKICAgICAgICAgICAgICAgICAvLyBQdXQgbWVzc2FnZSBpbnRvIFNsb3cgUXVldWUKICAgICAgICAgICAgICAgICAvLyBGb3JtIFBzZXVkbyBoZWFkZXIKLSAgICAgICAgICAgICAgICBwbXNnID0gKFBVU0hPUlQpaW5mby0+RFNQSW5mb0JsazsKKyAgICAgICAgICAgICAgICBwbXNnID0gKHUxNiAqKWluZm8tPkRTUEluZm9CbGs7CiAgICAgICAgICAgICAgICAgKnBtc2crKyA9IDA7CiAgICAgICAgICAgICAgICAgKnBtc2crKyA9IGh0b25zKGluZm8tPkRTUEluZm9CbGtsZW4rMjAraW5mby0+RFNQSW5mb0Jsa2xlbik7Ci0JCXBwc2V1ZG9faGRyID0gKHN0cnVjdCBwc2V1ZG9faGRyICopKFBVU0hPUlQpJmluZm8tPkRTUEluZm9CbGtbMl07CisJCXBwc2V1ZG9faGRyID0gKHN0cnVjdCBwc2V1ZG9faGRyICopKHUxNiAqKSZpbmZvLT5EU1BJbmZvQmxrWzJdOwogICAgICAgICAgICAgICAgIHBwc2V1ZG9faGRyLT5sZW5ndGggPSBodG9ucyhpbmZvLT5EU1BJbmZvQmxrbGVuKzQraW5mby0+RFNQSW5mb0Jsa2xlbik7CiAgICAgICAgICAgICAgICAgcHBzZXVkb19oZHItPnNvdXJjZSA9IDB4MTA7CiAgICAgICAgICAgICAgICAgcHBzZXVkb19oZHItPmRlc3RpbmF0aW9uID0gMHgyMDsKQEAgLTIwMjgsNyArMTgwMyw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGluZm8tPkRTUEluZm9CbGtbMTBdID0gMHg3MjAwOwogICAgICAgICAgICAgICAgIGluZm8tPkRTUEluZm9CbGtbMTFdID0gaHRvbnMoaW5mby0+RFNQSW5mb0Jsa2xlbik7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gZnQxMDAwX3dyaXRlX2RwcmFtMzIgKGRldiwgMCwgKFBVQ0hBUikmaW5mby0+RFNQSW5mb0Jsa1swXSwgKHVuc2lnbmVkIHNob3J0KShpbmZvLT5EU1BJbmZvQmxrbGVuKzIyKSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gZnQxMDAwX3dyaXRlX2RwcmFtMzIgKGRldiwgMCwgKHU4ICopJmluZm8tPkRTUEluZm9CbGtbMF0sICh1bnNpZ25lZCBzaG9ydCkoaW5mby0+RFNQSW5mb0Jsa2xlbisyMikpOwogICAgICAgICAgICAgICAgIHN0YXR1cyA9IGZ0MTAwMF93cml0ZV9yZWdpc3RlciAoZGV2LCBGVDEwMDBfREJfRFBSQU1fVFgsIEZUMTAwMF9SRUdfRE9PUkJFTEwpOwogICAgICAgICAgICAgICAgIGluZm8tPkRydk1zZ1BlbmQgPSAwOwogCkBAIC0yMDUzLDcgKzE4MjgsNyBAQAogICAgICAgICAgICAgICBpZiAoICh0ZW1wd29yZCAmIEZUMTAwMF9EQl9EUFJBTV9UWCkgPT0gMCkgewogICAgICAgICAgICAgICAgICAgLy8gUHV0IG1lc3NhZ2UgaW50byBTbG93IFF1ZXVlCiAgICAgICAgICAgICAgICAgICAvLyBGb3JtIFBzZXVkbyBoZWFkZXIKLSAgICAgICAgICAgICAgICAgIHBtc2cgPSAoUFVTSE9SVCkmdGVtcGJ1ZmZlclswXTsKKyAgICAgICAgICAgICAgICAgIHBtc2cgPSAodTE2ICopJnRlbXBidWZmZXJbMF07CiAJCQlwcHNldWRvX2hkciA9IChzdHJ1Y3QgcHNldWRvX2hkciAqKXBtc2c7CiAgICAgICAgICAgICAgICAgICBwcHNldWRvX2hkci0+bGVuZ3RoID0gaHRvbnMoMHgwMDEyKTsKICAgICAgICAgICAgICAgICAgIHBwc2V1ZG9faGRyLT5zb3VyY2UgPSAweDEwOwpAQCAtMjA3NCw3ICsxODQ5LDcgQEAKICAgICAgICAgICAgICAgICAgIGZvciAoaT0xOyBpPDc7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgIHBwc2V1ZG9faGRyLT5jaGVja3N1bSBePSAqcG1zZysrOwogICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgcG1zZyA9IChQVVNIT1JUKSZ0ZW1wYnVmZmVyWzE2XTsKKyAgICAgICAgICAgICAgICAgIHBtc2cgPSAodTE2ICopJnRlbXBidWZmZXJbMTZdOwogICAgICAgICAgICAgICAgICAgKnBtc2crKyA9IGh0b25zKFJTUF9EUlZfRVJSX1JQVF9NU0cpOwogICAgICAgICAgICAgICAgICAgKnBtc2crKyA9IGh0b25zKDB4MDAwZSk7CiAgICAgICAgICAgICAgICAgICAqcG1zZysrID0gaHRvbnMoaW5mby0+RFNQX1RJTUVbMF0pOwpAQCAtMjA4OSw3ICsxODY0LDcgQEAKICAgICAgICAgICAgICAgICAgICpwbXNnKysgPSBjb252ZXJ0LndyZDsKICAgICAgICAgICAgICAgICAgICpwbXNnKysgPSBodG9ucyhpbmZvLT5EcnZFcnJOdW0pOwogCi0gICAgICAgICAgICAgICAgICBDYXJkU2VuZENvbW1hbmQgKGRldiwgKHVuc2lnbmVkIGNoYXIqKSZ0ZW1wYnVmZmVyWzBdLCAoVVNIT1JUKSgweDAwMTIgKyBQU0VVRE9TWikpOworICAgICAgICAgICAgICAgICAgQ2FyZFNlbmRDb21tYW5kIChkZXYsICh1bnNpZ25lZCBjaGFyKikmdGVtcGJ1ZmZlclswXSwgKHUxNikoMHgwMDEyICsgUFNFVURPU1opKTsKICAgICAgICAgICAgICAgICAgIGluZm8tPkRydkVyck51bSA9IDA7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaW5mby0+RHJ2TXNnUGVuZCA9IDA7CkBAIC0yMTE0LDE1ICsxODg5LDE1IEBACiBpbnQgZnQxMDAwX3BvbGwodm9pZCogZGV2X2lkKSB7CiAKICAgICBzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZGV2ID0gKHN0cnVjdCBmdDEwMDBfZGV2aWNlICopZGV2X2lkOwotCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgZnQxMDAwX2luZm8gKikgbmV0ZGV2X3ByaXYoZGV2LT5uZXQpOworCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbyA9IG5ldGRldl9wcml2KGRldi0+bmV0KTsKIAogICAgIHUxNiB0ZW1wd29yZDsKICAgICB1MTYgc3RhdHVzOwogICAgIHUxNiBzaXplOwogICAgIGludCBpOwotICAgIFVTSE9SVCBkYXRhOwotICAgIFVTSE9SVCBtb2R1bG87Ci0gICAgVVNIT1JUIHBvcnRpZDsKKyAgICB1MTYgZGF0YTsKKyAgICB1MTYgbW9kdWxvOworICAgIHUxNiBwb3J0aWQ7CiAgICAgdTE2IG54dHBoOwogCXN0cnVjdCBkcHJhbV9ibGsgKnBkcHJhbV9ibGs7CiAJc3RydWN0IHBzZXVkb19oZHIgKnBwc2V1ZG9faGRyOwpAQCAtMjE0MywxNCArMTkxOCwxNCBAQAogICAgICAgICBpZiAodGVtcHdvcmQgJiBGVDEwMDBfREJfRFBSQU1fUlgpIHsKICAgICAgICAgICAgIC8vREVCVUcoImZ0MTAwMF9wb2xsOiBGVDEwMDBfUkVHX0RPT1JCRUxMIG1lc3NhZ2UgdHlwZTogIEZUMTAwMF9EQl9EUFJBTV9SWFxuIik7CiAKLSAgICAgICAgICAgIHN0YXR1cyA9IGZ0MTAwMF9yZWFkX2RwcmFtMTYoZGV2LCAweDIwMCwgKFBVQ0hBUikmZGF0YSwgMCk7CisgICAgICAgICAgICBzdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTE2KGRldiwgMHgyMDAsICh1OCAqKSZkYXRhLCAwKTsKICAgICAgICAgICAgIC8vREVCVUcoImZ0MTAwMF9wb2xsOkZUMTAwMF9EQl9EUFJBTV9SWDpmdDEwMDBfcmVhZF9kcHJhbTE2OnNpemUgPSAweCV4XG4iLCBkYXRhKTsKICAgICAgICAgICAgIHNpemUgPSBudG9ocyhkYXRhKSArIDE2ICsgMjsgLy93YWkKICAgICAgICAgICAgIGlmIChzaXplICUgNCkgewogICAgICAgICAgICAgICAgIG1vZHVsbyA9IDQgLSAoc2l6ZSAlIDQpOwogICAgICAgICAgICAgICAgIHNpemUgPSBzaXplICsgbW9kdWxvOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdHVzID0gZnQxMDAwX3JlYWRfZHByYW0xNihkZXYsIDB4MjAxLCAoUFVDSEFSKSZwb3J0aWQsIDEpOworICAgICAgICAgICAgc3RhdHVzID0gZnQxMDAwX3JlYWRfZHByYW0xNihkZXYsIDB4MjAxLCAodTggKikmcG9ydGlkLCAxKTsKICAgICAgICAgICAgIHBvcnRpZCAmPSAweGZmOwogICAgICAgICAgICAgLy9ERUJVRygiZnQxMDAwX3BvbGw6IEZUMTAwMF9SRUdfRE9PUkJFTEwgbWVzc2FnZSB0eXBlOiBGVDEwMDBfREJfRFBSQU1fUlggOiBwb3J0aWQgMHgleFxuIiwgcG9ydGlkKTsKIApAQCAtMjI4NSw3ICsyMDYwLDcgQEAKICAgICAgICAgICAgIHN0YXR1cyA9IGZ0MTAwMF93cml0ZV9yZWdpc3RlciAoZGV2LCBGVDEwMDBfQVNJQ19SRVNFVF9SRVEsIEZUMTAwMF9SRUdfRE9PUkJFTEwpOwogICAgICAgICAgICAgc3RhdHVzID0gZnQxMDAwX3dyaXRlX3JlZ2lzdGVyIChkZXYsIEhPU1RfSU5URl9CRSwgRlQxMDAwX1JFR19TVVBfQ1RSTCk7CiAgICAgICAgICAgICAvLyBjb3B5IGRzcCBzZXNzaW9uIHJlY29yZCBmcm9tIEFkYXB0ZXIgYmxvY2sKLSAgICAgICAgICAgIHN0YXR1cyA9IGZ0MTAwMF93cml0ZV9kcHJhbTMyIChkZXYsIDAsIChQVUNIQVIpJmluZm8tPkRTUFNlc3MuUmVjWzBdLCAxMDI0KTsKKyAgICAgICAgICAgIHN0YXR1cyA9IGZ0MTAwMF93cml0ZV9kcHJhbTMyIChkZXYsIDAsICh1OCAqKSZpbmZvLT5EU1BTZXNzLlJlY1swXSwgMTAyNCk7CiAgICAgICAgICAgICAvLyBQcm9ncmFtIFdNQVJLIHJlZ2lzdGVyCiAgICAgICAgICAgICBzdGF0dXMgPSBmdDEwMDBfd3JpdGVfcmVnaXN0ZXIgKGRldiwgMHg2MDAsIEZUMTAwMF9SRUdfTUFHX1dBVEVSTUFSSyk7CiAgICAgICAgICAgICAvLyByaW5nIGRvb3JiZWxsIHRvIHRlbGwgRFNQIHRoYXQgQVNJQyBpcyBvdXQgb2YgcmVzZXQKQEAgLTIyOTksMTAgKzIwNzQsMTAgQEAKICAgICAgICAgICAgIGlmIChpbmZvLT5mQXBwTXNnUGVuZCA9PSAwKSB7CiAgICAgICAgICAgICAgICAvLyBSZXNldCBBU0lDIGFuZCBEU1AKIAotICAgICAgICAgICAgICAgIHN0YXR1cyAgICA9IGZ0MTAwMF9yZWFkX2RwcmFtMTYoZGV2LCBGVDEwMDBfTUFHX0RTUF9USU1FUjAsIChQVUNIQVIpJihpbmZvLT5EU1BfVElNRVswXSksIEZUMTAwMF9NQUdfRFNQX1RJTUVSMF9JTkRYKTsKLSAgICAgICAgICAgICAgICBzdGF0dXMgICAgPSBmdDEwMDBfcmVhZF9kcHJhbTE2KGRldiwgRlQxMDAwX01BR19EU1BfVElNRVIxLCAoUFVDSEFSKSYoaW5mby0+RFNQX1RJTUVbMV0pLCBGVDEwMDBfTUFHX0RTUF9USU1FUjFfSU5EWCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzICAgID0gZnQxMDAwX3JlYWRfZHByYW0xNihkZXYsIEZUMTAwMF9NQUdfRFNQX1RJTUVSMiwgKFBVQ0hBUikmKGluZm8tPkRTUF9USU1FWzJdKSwgRlQxMDAwX01BR19EU1BfVElNRVIyX0lORFgpOwotICAgICAgICAgICAgICAgIHN0YXR1cyAgICA9IGZ0MTAwMF9yZWFkX2RwcmFtMTYoZGV2LCBGVDEwMDBfTUFHX0RTUF9USU1FUjMsIChQVUNIQVIpJihpbmZvLT5EU1BfVElNRVszXSksIEZUMTAwMF9NQUdfRFNQX1RJTUVSM19JTkRYKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgICAgPSBmdDEwMDBfcmVhZF9kcHJhbTE2KGRldiwgRlQxMDAwX01BR19EU1BfVElNRVIwLCAodTggKikmKGluZm8tPkRTUF9USU1FWzBdKSwgRlQxMDAwX01BR19EU1BfVElNRVIwX0lORFgpOworICAgICAgICAgICAgICAgIHN0YXR1cyAgICA9IGZ0MTAwMF9yZWFkX2RwcmFtMTYoZGV2LCBGVDEwMDBfTUFHX0RTUF9USU1FUjEsICh1OCAqKSYoaW5mby0+RFNQX1RJTUVbMV0pLCBGVDEwMDBfTUFHX0RTUF9USU1FUjFfSU5EWCk7CisgICAgICAgICAgICAgICAgc3RhdHVzICAgID0gZnQxMDAwX3JlYWRfZHByYW0xNihkZXYsIEZUMTAwMF9NQUdfRFNQX1RJTUVSMiwgKHU4ICopJihpbmZvLT5EU1BfVElNRVsyXSksIEZUMTAwMF9NQUdfRFNQX1RJTUVSMl9JTkRYKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgICAgPSBmdDEwMDBfcmVhZF9kcHJhbTE2KGRldiwgRlQxMDAwX01BR19EU1BfVElNRVIzLCAodTggKikmKGluZm8tPkRTUF9USU1FWzNdKSwgRlQxMDAwX01BR19EU1BfVElNRVIzX0lORFgpOwogICAgICAgICAgICAgICAgIGluZm8tPkNhcmRSZWFkeSA9IDA7CiAgICAgICAgICAgICAgICAgaW5mby0+RHJ2RXJyTnVtID0gRFNQX0NPTkRSRVNFVF9JTkZPOwogICAgICAgICAgICAgICAgIERFQlVHKCJmdDEwMDBfaHc6RFNQIGNvbmRpdGlvbmFsIHJlc2V0IHJlcXVlc3RlZFxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX2h3LmggYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX2h3LmgKaW5kZXggYzU4MDc0MS4uYWI5MzEyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF9ody5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfaHcuaApAQCAtNCw3ICs0LDcgQEAKIAogI2luY2x1ZGUgImZ0MTAwMF91c2IuaCIKIAotZXh0ZXJuIHUxNiBmdDEwMDBfcmVhZF9yZWdpc3RlcihzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBQVVNIT1JUIERhdGEsIHU4IG5SZWdJbmR4KTsKLWV4dGVybiB1MTYgZnQxMDAwX3dyaXRlX3JlZ2lzdGVyKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIFVTSE9SVCB2YWx1ZSwgdTggblJlZ0luZHgpOworZXh0ZXJuIHUxNiBmdDEwMDBfcmVhZF9yZWdpc3RlcihzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1MTYgKkRhdGEsIHU4IG5SZWdJbmR4KTsKK2V4dGVybiB1MTYgZnQxMDAwX3dyaXRlX3JlZ2lzdGVyKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHUxNiB2YWx1ZSwgdTggblJlZ0luZHgpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfcHJvYy5jIGIvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF9wcm9jLmMKaW5kZXggMzZjZGQ1OC4uYjg3NTQyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF9wcm9jLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF9wcm9jLmMKQEAgLTEsMyArMSwyNCBAQAorLyoKKyAqIGZ0MTAwMF9wcm9jLmMgLSBmdDEwMDAgcHJvYyBpbnRlcmZhY2UKKyAqCisgKiBDb3B5cmlnaHQJKEMpIDIwMDktMjAxMCBRdWludGVjCisgKgkJKEMpIDIwMTAgT3Blbi1uYW5kcmEKKyAqICAgICAgPG1hcmVrLmJlbGlza29Ab3Blbi1uYW5kcmEuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlLiBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzCisgKiBhcmNoaXZlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgpAQCAtMTQsMjE5ICszNSwyMTcgQEAKIAogI2RlZmluZSBQVVRYX1RPX1BBR0UobGVuLHBhZ2UsbWVzc2FnZSxzaXplLHZhcikgXAogCWxlbiArPSBzbnByaW50ZihwYWdlK2xlbiwgUEFHRV9TSVpFIC0gbGVuLCBtZXNzYWdlKTsgXAotCWZvcihpID0gMDsgaSA8IChzaXplIC0gMSk7IGkrKykgXAotCXsgXAorCWZvciAoaSA9IDA7IGkgPCAoc2l6ZSAtIDEpOyBpKyspIHtcCiAJCWxlbiArPSBzbnByaW50ZihwYWdlK2xlbiwgUEFHRV9TSVpFIC0gbGVuLCAiJTAyeDoiLCB2YXJbaV0pOyBcCiAJfSBcCiAJbGVuICs9IHNucHJpbnRmKHBhZ2UrbGVuLCBQQUdFX1NJWkUgLSBsZW4sICIlMDJ4XG4iLCB2YXJbaV0pCiAKICNkZWZpbmUgUFVURF9UT19QQUdFKGxlbixwYWdlLG1lc3NhZ2Usc2l6ZSx2YXIpIFwKIAlsZW4gKz0gc25wcmludGYocGFnZStsZW4sIFBBR0VfU0laRSAtIGxlbiwgbWVzc2FnZSk7IFwKLQlmb3IoaSA9IDA7IGkgPCAoc2l6ZSAtIDEpOyBpKyspIFwKLQl7IFwKKwlmb3IgKGkgPSAwOyBpIDwgKHNpemUgLSAxKTsgaSsrKSB7XAogCQlsZW4gKz0gc25wcmludGYocGFnZStsZW4sIFBBR0VfU0laRSAtIGxlbiwgIiVkLiIsIHZhcltpXSk7IFwKIAl9IFwKIAlsZW4gKz0gc25wcmludGYocGFnZStsZW4sIFBBR0VfU0laRSAtIGxlbiwgIiVkXG4iLCB2YXJbaV0pCiAKIAotCi0KLS8vI2lmZGVmIElOSVRfTkVUX05TCiAjZGVmaW5lIEZUTkVUX1BST0MgaW5pdF9uZXQucHJvY19uZXQKLS8vI2Vsc2UKLS8vI2RlZmluZSBGVE5FVF9QUk9DIHByb2NfbmV0Ci0vLyNlbmRpZgogCiAKLXUxNiBmdDEwMDBfcmVhZF9kcHJhbTE2IChzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCBVU0hPUlQgaW5keCwKLQkJCSBQVUNIQVIgYnVmZmVyLCB1OCBoaWdobG93KTsKK3UxNiBmdDEwMDBfcmVhZF9kcHJhbTE2IChzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCB1MTYgaW5keCwKKwkJCSB1OCAqYnVmZmVyLCB1OCBoaWdobG93KTsKIAogCiBzdGF0aWMgaW50Ci1mdDEwMDBSZWFkUHJvYyAoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwgaW50ICplb2YsCitmdDEwMDBSZWFkUHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwKIAkJdm9pZCAqZGF0YSkKIHsKLSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLSAgaW50IGxlbjsKLSAgaW50IGk7Ci0gIHVuc2lnbmVkIHNob3J0IGxlZFN0YXQ7Ci0gIHVuc2lnbmVkIHNob3J0IGNvblN0YXQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgbGVuOworCWludCBpOworCXVuc2lnbmVkIHNob3J0IGxlZFN0YXQ7CisJdW5zaWduZWQgc2hvcnQgY29uU3RhdDsKIAogCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbzsKIAotICBjaGFyICpzdGF0dXNbXSA9IHsgIklkbGUgKERpc2Nvbm5lY3QpIiwgIlNlYXJjaGluZyIsICJBY3RpdmUgKENvbm5lY3RlZCkiLAotICAgICJXYWl0aW5nIGZvciBMMiIsICJTbGVlcCIsICJObyBDb3ZlcmFnZSIsICIiLCAiIgotICB9OworCWNoYXIgKnN0YXR1c1tdID0geyAKKwkJIklkbGUgKERpc2Nvbm5lY3QpIiwgCisJCSJTZWFyY2hpbmciLAorCQkiQWN0aXZlIChDb25uZWN0ZWQpIiwKKwkJIldhaXRpbmcgZm9yIEwyIiwKKwkJIlNsZWVwIiwKKwkJIk5vIENvdmVyYWdlIiwKKwkJIiIsCisJCSIiLAorCX07CiAKLSAgY2hhciAqc2lnbmFsW10gPSB7ICIiLCAiKiIsICIqKiIsICIqKioiLCAiKioqKiIgfTsKLSAgaW50IHN0cmVuZ3RoOwotICBpbnQgcXVhbGl0eTsKLSAgc3RydWN0IHRpbWV2YWwgdHY7Ci0gIHRpbWVfdCBkZWx0YTsKKwljaGFyICpzaWduYWxbXSA9IHsgIiIsICIqIiwgIioqIiwgIioqKiIsICIqKioqIiB9OworCWludCBzdHJlbmd0aDsKKwlpbnQgcXVhbGl0eTsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwl0aW1lX3QgZGVsdGE7CiAKLSAgZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRhdGE7Ci0JaW5mbyA9IChzdHJ1Y3QgZnQxMDAwX2luZm8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGF0YTsKKwlpbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotICBpZiAob2ZmID4gMCkKLSAgICB7Ci0gICAgICAqZW9mID0gMTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KKwlpZiAob2ZmID4gMCkgeworCQkqZW9mID0gMTsKKwkJcmV0dXJuIDA7CisJfQogCiAKLSAgaWYgKGluZm8tPlByb2dDb25TdGF0ICE9IDB4RkYpCi0gICAgewotICAgICAgZnQxMDAwX3JlYWRfZHByYW0xNiAoaW5mby0+cEZ0MTAwMERldiwgRlQxMDAwX01BR19EU1BfTEVELAotCQkJICAgKFBVQ0hBUikgJiBsZWRTdGF0LCBGVDEwMDBfTUFHX0RTUF9MRURfSU5EWCk7Ci0gICAgICBpbmZvLT5MZWRTdGF0ID0gbnRvaHMgKGxlZFN0YXQpOworCWlmIChpbmZvLT5Qcm9nQ29uU3RhdCAhPSAweEZGKSB7CisJCWZ0MTAwMF9yZWFkX2RwcmFtMTYoaW5mby0+cEZ0MTAwMERldiwgRlQxMDAwX01BR19EU1BfTEVELAorCQkJICAgKHU4ICopJmxlZFN0YXQsIEZUMTAwMF9NQUdfRFNQX0xFRF9JTkRYKTsKKwkJaW5mby0+TGVkU3RhdCA9IG50b2hzKGxlZFN0YXQpOwogCi0gICAgICBmdDEwMDBfcmVhZF9kcHJhbTE2IChpbmZvLT5wRnQxMDAwRGV2LCBGVDEwMDBfTUFHX0RTUF9DT05fU1RBVEUsCi0JCQkgICAoUFVDSEFSKSAmIGNvblN0YXQsIEZUMTAwMF9NQUdfRFNQX0NPTl9TVEFURV9JTkRYKTsKLSAgICAgIGluZm8tPkNvblN0YXQgPSBudG9ocyAoY29uU3RhdCk7Ci0gICAgICBkb19nZXR0aW1lb2ZkYXkgKCZ0dik7Ci0gICAgICBkZWx0YSA9ICh0di50dl9zZWMgLSBpbmZvLT5Db25UbSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW5mby0+Q29uU3RhdCA9IDB4ZjsKLSAgICAgIGRlbHRhID0gMDsKLSAgICB9CisJCWZ0MTAwMF9yZWFkX2RwcmFtMTYoaW5mby0+cEZ0MTAwMERldiwgRlQxMDAwX01BR19EU1BfQ09OX1NUQVRFLAorCQkJKHU4ICopJmNvblN0YXQsIEZUMTAwMF9NQUdfRFNQX0NPTl9TVEFURV9JTkRYKTsKKwkJaW5mby0+Q29uU3RhdCA9IG50b2hzKGNvblN0YXQpOworCQlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKwkJZGVsdGEgPSAodHYudHZfc2VjIC0gaW5mby0+Q29uVG0pOworCX0gZWxzZSB7CisJCWluZm8tPkNvblN0YXQgPSAweGY7CisJCWRlbHRhID0gMDsKKwl9CiAKKwlpID0gKGluZm8tPkxlZFN0YXQpICYgMHhmOworCXN3aXRjaCAoaSkgeworCWNhc2UgMHgxOgorCQlzdHJlbmd0aCA9IDE7CisJCWJyZWFrOworCWNhc2UgMHgzOgorCQlzdHJlbmd0aCA9IDI7CisJCWJyZWFrOworCWNhc2UgMHg3OgorCQlzdHJlbmd0aCA9IDM7CisJCWJyZWFrOworCWNhc2UgMHhmOgorCQlzdHJlbmd0aCA9IDQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXN0cmVuZ3RoID0gMDsKKwl9CiAKKwlpID0gKGluZm8tPkxlZFN0YXQgPj4gOCkgJiAweGY7CisJc3dpdGNoIChpKSB7CisJY2FzZSAweDE6CisJCXF1YWxpdHkgPSAxOworCQlicmVhazsKKwljYXNlIDB4MzoKKwkJcXVhbGl0eSA9IDI7CisJCWJyZWFrOworCWNhc2UgMHg3OgorCQlxdWFsaXR5ID0gMzsKKwkJYnJlYWs7CisJY2FzZSAweGY6CisJCXF1YWxpdHkgPSA0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlxdWFsaXR5ID0gMDsKKwl9CiAKLSAgaSA9IChpbmZvLT5MZWRTdGF0KSAmIDB4ZjsKLSAgc3dpdGNoIChpKQotICAgIHsKLSAgICBjYXNlIDB4MToKLSAgICAgIHN0cmVuZ3RoID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHgzOgotICAgICAgc3RyZW5ndGggPSAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDc6Ci0gICAgICBzdHJlbmd0aCA9IDM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4ZjoKLSAgICAgIHN0cmVuZ3RoID0gNDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBzdHJlbmd0aCA9IDA7Ci0gICAgfQorCWxlbiA9IDA7CisJUFVUTV9UT19QQUdFKGxlbiwgcGFnZSwgIkNvbm5lY3Rpb24gVGltZTogJTAybGQ6JTAybGQ6JTAybGRcbiIsCisgICAgICAJCSgoZGVsdGEgLyAzNjAwKSAlIDI0KSwgKChkZWx0YSAvIDYwKSAlIDYwKSwgKGRlbHRhICUgNjApKTsKKwlQVVRNX1RPX1BBR0UobGVuLCBwYWdlLCAiQ29ubmVjdGlvbiBUaW1lW3NdOiAlbGRcbiIsIGRlbHRhKTsKKwlQVVRNX1RPX1BBR0UobGVuLCBwYWdlLCAiQXNpYyBJRDogJXNcbiIsCisgICAgICAJKGluZm8tPkFzaWNJRCkgPT0KKyAgICAgIAlFTEVDVFJBQlVaWl9JRCA/ICJFTEVDVFJBQlVaWiBBU0lDIiA6ICJNQUdORU1JVEUgQVNJQyIpOworCVBVVFhfVE9fUEFHRShsZW4sIHBhZ2UsICJTS1U6ICIsIFNLVVNaLCBpbmZvLT5Ta3UpOworCVBVVFhfVE9fUEFHRShsZW4sIHBhZ2UsICJFVUk2NDogIiwgRVVJU1osIGluZm8tPmV1aTY0KTsKKwlQVVREX1RPX1BBR0UobGVuLCBwYWdlLCAiRFNQIHZlcnNpb24gbnVtYmVyOiAiLCBEU1BWRVJTWiwgaW5mby0+RHNwVmVyKTsKKwlQVVRYX1RPX1BBR0UobGVuLCBwYWdlLCAiSGFyZHdhcmUgU2VyaWFsIE51bWJlcjogIiwgSFdTRVJOVU1TWiwKKyAgICAgIAkJaW5mby0+SHdTZXJOdW0pOworCVBVVFhfVE9fUEFHRShsZW4sIHBhZ2UsICJDYWxpYmVyYXRpb24gVmVyc2lvbjogIiwgQ0FMVkVSU1osCisgICAgICAJCWluZm8tPlJmQ2FsVmVyKTsKKwlQVVREX1RPX1BBR0UobGVuLCBwYWdlLCAiQ2FsaWJlcmF0aW9uIERhdGU6ICIsIENBTERBVEVTWiwKKwkJaW5mby0+UmZDYWxEYXRlKTsKKwlQVVRNX1RPX1BBR0UobGVuLCBwYWdlLCAiTWVkaWEgU3RhdGU6ICVzXG4iLAorICAgICAgCQkoaW5mby0+bWVkaWFzdGF0ZSkgPyAibGluayIgOiAibm8gbGluayIpOworCVBVVE1fVE9fUEFHRShsZW4sIHBhZ2UsICJDb25uZWN0aW9uIFN0YXR1czogJXNcbiIsCisgICAgICAJCXN0YXR1c1soKGluZm8tPkNvblN0YXQpICYgMHg3KV0pOworCVBVVE1fVE9fUEFHRShsZW4sIHBhZ2UsICJSWCBwYWNrZXRzOiAlbGRcbiIsIGluZm8tPnN0YXRzLnJ4X3BhY2tldHMpOworCVBVVE1fVE9fUEFHRShsZW4sIHBhZ2UsICJUWCBwYWNrZXRzOiAlbGRcbiIsIGluZm8tPnN0YXRzLnR4X3BhY2tldHMpOworCVBVVE1fVE9fUEFHRShsZW4sIHBhZ2UsICJSWCBieXRlczogJWxkXG4iLCBpbmZvLT5zdGF0cy5yeF9ieXRlcyk7CisJUFVUTV9UT19QQUdFKGxlbiwgcGFnZSwgIlRYIGJ5dGVzOiAlbGRcbiIsIGluZm8tPnN0YXRzLnR4X2J5dGVzKTsKKwlQVVRNX1RPX1BBR0UobGVuLCBwYWdlLCAiU2lnbmFsIFN0cmVuZ3RoOiAlc1xuIiwgc2lnbmFsW3N0cmVuZ3RoXSk7CisJUFVUTV9UT19QQUdFKGxlbiwgcGFnZSwgIlNpZ25hbCBRdWFsaXR5OiAlc1xuIiwgc2lnbmFsW3F1YWxpdHldKTsKIAotICBpID0gKGluZm8tPkxlZFN0YXQgPj4gOCkgJiAweGY7Ci0gIHN3aXRjaCAoaSkKLSAgICB7Ci0gICAgY2FzZSAweDE6Ci0gICAgICBxdWFsaXR5ID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHgzOgotICAgICAgcXVhbGl0eSA9IDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4NzoKLSAgICAgIHF1YWxpdHkgPSAzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweGY6Ci0gICAgICBxdWFsaXR5ID0gNDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBxdWFsaXR5ID0gMDsKLSAgICB9Ci0KLQotICBsZW4gPSAwOwotICBQVVRNX1RPX1BBR0UgKGxlbiwgcGFnZSwgIkNvbm5lY3Rpb24gVGltZTogJTAybGQ6JTAybGQ6JTAybGRcbiIsCi0JCSgoZGVsdGEgLyAzNjAwKSAlIDI0KSwgKChkZWx0YSAvIDYwKSAlIDYwKSwgKGRlbHRhICUgNjApKTsKLSAgUFVUTV9UT19QQUdFIChsZW4sIHBhZ2UsICJDb25uZWN0aW9uIFRpbWVbc106ICVsZFxuIiwgZGVsdGEpOwotICBQVVRNX1RPX1BBR0UgKGxlbiwgcGFnZSwgIkFzaWMgSUQ6ICVzXG4iLAotCQkoaW5mby0+QXNpY0lEKSA9PQotCQlFTEVDVFJBQlVaWl9JRCA/ICJFTEVDVFJBQlVaWiBBU0lDIiA6ICJNQUdORU1JVEUgQVNJQyIpOwotICBQVVRYX1RPX1BBR0UgKGxlbiwgcGFnZSwgIlNLVTogIiwgU0tVU1osIGluZm8tPlNrdSk7Ci0gIFBVVFhfVE9fUEFHRSAobGVuLCBwYWdlLCAiRVVJNjQ6ICIsIEVVSVNaLCBpbmZvLT5ldWk2NCk7Ci0gIFBVVERfVE9fUEFHRSAobGVuLCBwYWdlLCAiRFNQIHZlcnNpb24gbnVtYmVyOiAiLCBEU1BWRVJTWiwgaW5mby0+RHNwVmVyKTsKLSAgUFVUWF9UT19QQUdFIChsZW4sIHBhZ2UsICJIYXJkd2FyZSBTZXJpYWwgTnVtYmVyOiAiLCBIV1NFUk5VTVNaLAotCQlpbmZvLT5Id1Nlck51bSk7Ci0gIFBVVFhfVE9fUEFHRSAobGVuLCBwYWdlLCAiQ2FsaWJlcmF0aW9uIFZlcnNpb246ICIsIENBTFZFUlNaLAotCQlpbmZvLT5SZkNhbFZlcik7Ci0gIFBVVERfVE9fUEFHRSAobGVuLCBwYWdlLCAiQ2FsaWJlcmF0aW9uIERhdGU6ICIsIENBTERBVEVTWiwgaW5mby0+UmZDYWxEYXRlKTsKLSAgUFVUTV9UT19QQUdFIChsZW4sIHBhZ2UsICJNZWRpYSBTdGF0ZTogJXNcbiIsCi0JCShpbmZvLT5tZWRpYXN0YXRlKSA/ICJsaW5rIiA6ICJubyBsaW5rIik7Ci0gIFBVVE1fVE9fUEFHRSAobGVuLCBwYWdlLCAiQ29ubmVjdGlvbiBTdGF0dXM6ICVzXG4iLAotCQlzdGF0dXNbKChpbmZvLT5Db25TdGF0KSAmIDB4NyldKTsKLSAgUFVUTV9UT19QQUdFIChsZW4sIHBhZ2UsICJSWCBwYWNrZXRzOiAlbGRcbiIsIGluZm8tPnN0YXRzLnJ4X3BhY2tldHMpOwotICBQVVRNX1RPX1BBR0UgKGxlbiwgcGFnZSwgIlRYIHBhY2tldHM6ICVsZFxuIiwgaW5mby0+c3RhdHMudHhfcGFja2V0cyk7Ci0gIFBVVE1fVE9fUEFHRSAobGVuLCBwYWdlLCAiUlggYnl0ZXM6ICVsZFxuIiwgaW5mby0+c3RhdHMucnhfYnl0ZXMpOwotICBQVVRNX1RPX1BBR0UgKGxlbiwgcGFnZSwgIlRYIGJ5dGVzOiAlbGRcbiIsIGluZm8tPnN0YXRzLnR4X2J5dGVzKTsKLSAgUFVUTV9UT19QQUdFIChsZW4sIHBhZ2UsICJTaWduYWwgU3RyZW5ndGg6ICVzXG4iLCBzaWduYWxbc3RyZW5ndGhdKTsKLSAgUFVUTV9UT19QQUdFIChsZW4sIHBhZ2UsICJTaWduYWwgUXVhbGl0eTogJXNcbiIsIHNpZ25hbFtxdWFsaXR5XSk7Ci0KLQotCi0KLSAgcmV0dXJuIGxlbjsKKwlyZXR1cm4gbGVuOwogfQogCiBzdGF0aWMgaW50Ci1mdDEwMDBOb3RpZnlQcm9jIChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKK2Z0MTAwME5vdGlmeVByb2Moc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwdHIpCiB7Ci0gIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwdHI7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHB0cjsKIAlzdHJ1Y3QgZnQxMDAwX2luZm8gKmluZm87Ci0gIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZnQxMDAwX3Byb2NfZmlsZTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmZ0MTAwMF9wcm9jX2ZpbGU7CiAKLWluZm8gPSAoc3RydWN0IGZ0MTAwMF9pbmZvICopIG5ldGRldl9wcml2KGRldik7CisJaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBORVRERVZfQ0hBTkdFTkFNRToKKwkJcmVtb3ZlX3Byb2NfZW50cnkoaW5mby0+bmV0ZGV2bmFtZSwgaW5mby0+ZnQxMDAwX3Byb2NfZGlyKTsKKwkJZnQxMDAwX3Byb2NfZmlsZSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoZGV2LT5uYW1lLCAwNjQ0LAorCQkJCQlpbmZvLT5mdDEwMDBfcHJvY19kaXIsCisJCQkJCWZ0MTAwMFJlYWRQcm9jLCBkZXYpOworCQlzbnByaW50ZihpbmZvLT5uZXRkZXZuYW1lLCBJRk5BTVNJWiwgIiVzIiwgZGV2LT5uYW1lKTsKKwkJYnJlYWs7CisJfQogCi0gIHN3aXRjaCAoZXZlbnQpCi0gICAgewotICAgIGNhc2UgTkVUREVWX0NIQU5HRU5BTUU6Ci0gICAgICByZW1vdmVfcHJvY19lbnRyeSAoaW5mby0+bmV0ZGV2bmFtZSwgaW5mby0+ZnQxMDAwX3Byb2NfZGlyKTsKLSAgICAgIGZ0MTAwMF9wcm9jX2ZpbGUgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IChkZXYtPm5hbWUsIDA2NDQsCi0JCQkJCQkgaW5mby0+ZnQxMDAwX3Byb2NfZGlyLAotCQkJCQkJIGZ0MTAwMFJlYWRQcm9jLCBkZXYpOwotICAgICAgc25wcmludGYgKGluZm8tPm5ldGRldm5hbWUsIElGTkFNU0laLCAiJXMiLCBkZXYtPm5hbWUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gTk9USUZZX0RPTkU7CisJcmV0dXJuIE5PVElGWV9ET05FOwogfQogCiBzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGZ0MTAwMF9uZXRkZXZfbm90aWZpZXIgPSB7Ci0gIC5ub3RpZmllcl9jYWxsID0gZnQxMDAwTm90aWZ5UHJvYworCS5ub3RpZmllcl9jYWxsID0gZnQxMDAwTm90aWZ5UHJvYywKIH07CiAKIAotdm9pZAotZnQxMDAwSW5pdFByb2MgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitpbnQgZnQxMDAwX2luaXRfcHJvYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbzsKLSAgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpmdDEwMDBfcHJvY19maWxlOwotCWluZm8gPSAoc3RydWN0IGZ0MTAwMF9pbmZvICopIG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpmdDEwMDBfcHJvY19maWxlOworCWludCByZXQgPSAwOwogCisJaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAKLSAgaW5mby0+ZnQxMDAwX3Byb2NfZGlyID0gcHJvY19ta2RpciAoRlQxMDAwX1BST0NfRElSLCBGVE5FVF9QUk9DKTsKLSAgaWYgKGluZm8tPmZ0MTAwMF9wcm9jX2RpciA9PSBOVUxMKQotICAgIHsKLSAgICAgIHJlbW92ZV9wcm9jX2VudHJ5IChGVDEwMDBfUFJPQ19ESVIsIEZUTkVUX1BST0MpOwotICAgIH0KKwlpbmZvLT5mdDEwMDBfcHJvY19kaXIgPSBwcm9jX21rZGlyKEZUMTAwMF9QUk9DX0RJUiwgRlRORVRfUFJPQyk7CisJaWYgKGluZm8tPmZ0MTAwMF9wcm9jX2RpciA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVuYWJsZSB0byBjcmVhdGUgJXMgZGlyLlxuIiwKKwkJCUZUMTAwMF9QUk9DX0RJUik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbDsKKwl9CiAKKwlmdDEwMDBfcHJvY19maWxlID0KKwkJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeShkZXYtPm5hbWUsIDA2NDQsCisJCQlpbmZvLT5mdDEwMDBfcHJvY19kaXIsIGZ0MTAwMFJlYWRQcm9jLCBkZXYpOwogCi0gIGZ0MTAwMF9wcm9jX2ZpbGUgPQotICAgIGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkgKGRldi0+bmFtZSwgMDY0NCwgaW5mby0+ZnQxMDAwX3Byb2NfZGlyLAotCQkJICAgIGZ0MTAwMFJlYWRQcm9jLCBkZXYpOwotICBpZiAoZnQxMDAwX3Byb2NfZmlsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHJlbW92ZV9wcm9jX2VudHJ5IChpbmZvLT5uZXRkZXZuYW1lLCBpbmZvLT5mdDEwMDBfcHJvY19kaXIpOwotICAgIH0KKwlpZiAoZnQxMDAwX3Byb2NfZmlsZSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVuYWJsZSB0byBjcmVhdGUgL3Byb2MgZW50cnkuXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2VudHJ5OworCX0KIAotICBzbnByaW50ZiAoaW5mby0+bmV0ZGV2bmFtZSwgSUZOQU1TSVosICIlcyIsIGRldi0+bmFtZSk7Ci0gIHJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllciAoJmZ0MTAwMF9uZXRkZXZfbm90aWZpZXIpOwotICByZXR1cm47CisJc25wcmludGYoaW5mby0+bmV0ZGV2bmFtZSwgSUZOQU1TSVosICIlcyIsIGRldi0+bmFtZSk7CisKKwlyZXQgPSByZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmZ0MTAwMF9uZXRkZXZfbm90aWZpZXIpOworCWlmIChyZXQpCisJCWdvdG8gZmFpbF9ub3RpZjsKKworCXJldHVybiAwOworCitmYWlsX25vdGlmOgorCXJlbW92ZV9wcm9jX2VudHJ5KGluZm8tPm5ldGRldm5hbWUsIGluZm8tPmZ0MTAwMF9wcm9jX2Rpcik7CitmYWlsX2VudHJ5OgorCXJlbW92ZV9wcm9jX2VudHJ5KEZUMTAwMF9QUk9DX0RJUiwgRlRORVRfUFJPQyk7CitmYWlsOgorCXJldHVybiByZXQ7CiB9CiAKLXZvaWQKLWZ0MTAwMENsZWFudXBQcm9jKHN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbykKK3ZvaWQgZnQxMDAwX2NsZWFudXBfcHJvYyhzdHJ1Y3QgZnQxMDAwX2luZm8gKmluZm8pCiB7Ci0gIHJlbW92ZV9wcm9jX2VudHJ5IChpbmZvLT5uZXRkZXZuYW1lLCBpbmZvLT5mdDEwMDBfcHJvY19kaXIpOwotICByZW1vdmVfcHJvY19lbnRyeSAoRlQxMDAwX1BST0NfRElSLCBGVE5FVF9QUk9DKTsKLSAgdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIgKCZmdDEwMDBfbmV0ZGV2X25vdGlmaWVyKTsKLQotICByZXR1cm47CisJcmVtb3ZlX3Byb2NfZW50cnkoaW5mby0+bmV0ZGV2bmFtZSwgaW5mby0+ZnQxMDAwX3Byb2NfZGlyKTsKKwlyZW1vdmVfcHJvY19lbnRyeShGVDEwMDBfUFJPQ19ESVIsIEZUTkVUX1BST0MpOworCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZmdDEwMDBfbmV0ZGV2X25vdGlmaWVyKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfdXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX3VzYi5jCmluZGV4IDI4ZjU1YjIuLjc5NDgyYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfdXNiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF91c2IuYwpAQCAtMzYsNyArMzYsNyBAQAogCiBNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgaWRfdGFibGUpOwogCi1zdGF0aWMgQk9PTEVBTiBnUG9sbGluZ2ZhaWxlZCA9IEZBTFNFOworc3RhdGljIGJvb2wgZ1BvbGxpbmdmYWlsZWQgPSBGQUxTRTsKIGludCBmdDEwMDBfcG9sbF90aHJlYWQodm9pZCAqYXJnKQogewogCWludCByZXQgPSBTVEFUVVNfU1VDQ0VTUzsKQEAgLTY0LDcgKzY0LDcgQEAKIAlpbnQgaSwgcmV0ID0gMCwgc2l6ZTsKIAogCXN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXY7Ci0Jc3RydWN0IGZ0MTAwMF9pbmZvICpwZnQxMDAwaW5mbzsKKwlzdHJ1Y3QgZnQxMDAwX2luZm8gKnBmdDEwMDBpbmZvID0gTlVMTDsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmRzcF9mdzsKIAogCWZ0MTAwMGRldiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmdDEwMDBfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CkBAIC04NCw3ICs4NCw2IEBACiAJZnQxMDAwZGV2LT5kZXYgPSBkZXY7CiAJZnQxMDAwZGV2LT5zdGF0dXMgPSAwOwogCWZ0MTAwMGRldi0+bmV0ID0gTlVMTDsKLQlzcGluX2xvY2tfaW5pdCgmZnQxMDAwZGV2LT5kZXZpY2VfbG9jayk7CiAJZnQxMDAwZGV2LT50eF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOwogCWZ0MTAwMGRldi0+cnhfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfQVRPTUlDKTsKIApAQCAtMTY0LDcgKzE2Myw3IEBACiAJaWYgKHJldCkKIAkJZ290byBlcnJfbG9hZDsKIAotCXBmdDEwMDBpbmZvID0gKHN0cnVjdCBmdDEwMDBfaW5mbyAqKSBuZXRkZXZfcHJpdihmdDEwMDBkZXYtPm5ldCk7CisJcGZ0MTAwMGluZm8gPSBuZXRkZXZfcHJpdihmdDEwMDBkZXYtPm5ldCk7CiAKIAlERUJVRygiSW4gcHJvYmU6IHBmdDEwMDBpbmZvPSVwXG4iLCBwZnQxMDAwaW5mbyk7CiAJcmV0ID0gZHNwX3JlbG9hZChmdDEwMDBkZXYpOwpAQCAtMTc2LDE0ICsxNzUsMTggQEAKIAlnUG9sbGluZ2ZhaWxlZCA9IEZBTFNFOwogCXBmdDEwMDBpbmZvLT5wUG9sbFRocmVhZCA9CiAJICAgIGt0aHJlYWRfcnVuKGZ0MTAwMF9wb2xsX3RocmVhZCwgZnQxMDAwZGV2LCAiZnQxMDAwX3BvbGwiKTsKKworCWlmIChJU19FUlIocGZ0MTAwMGluZm8tPnBQb2xsVGhyZWFkKSkgeworCQlyZXQgPSBQVFJfRVJSKHBmdDEwMDBpbmZvLT5wUG9sbFRocmVhZCk7CisJCWdvdG8gZXJyX2xvYWQ7CisJfQorCiAJbXNsZWVwKDUwMCk7CiAKIAl3aGlsZSAoIXBmdDEwMDBpbmZvLT5DYXJkUmVhZHkpIHsKIAkJaWYgKGdQb2xsaW5nZmFpbGVkKSB7Ci0JCQlpZiAocGZ0MTAwMGluZm8tPnBQb2xsVGhyZWFkKQotCQkJCWt0aHJlYWRfc3RvcChwZnQxMDAwaW5mby0+cFBvbGxUaHJlYWQpOwogCQkJcmV0ID0gLUVJTzsKLQkJCWdvdG8gZXJyX2xvYWQ7CisJCQlnb3RvIGVycl90aHJlYWQ7CiAJCX0KIAkJbXNsZWVwKDEwMCk7CiAJCURFQlVHKCJmdDEwMDBfcHJvYmU6OldhaXRpbmcgZm9yIENhcmQgUmVhZHlcbiIpOwpAQCAtMTkzLDE0ICsxOTYsMjEgQEAKIAogCXJldCA9IHJlZ19mdDEwMDBfbmV0ZGV2KGZ0MTAwMGRldiwgaW50ZXJmYWNlKTsKIAlpZiAocmV0KQotCQlnb3RvIGVycl9sb2FkOworCQlnb3RvIGVycl90aHJlYWQ7CisKKwlyZXQgPSBmdDEwMDBfaW5pdF9wcm9jKGZ0MTAwMGRldi0+bmV0KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9wcm9jOwogCiAJcGZ0MTAwMGluZm8tPk5ldERldlJlZ0RvbmUgPSAxOwogCi0JZnQxMDAwSW5pdFByb2MoZnQxMDAwZGV2LT5uZXQpOwotCiAJcmV0dXJuIDA7CiAKK2Vycl9wcm9jOgorCXVucmVnaXN0ZXJfbmV0ZGV2KGZ0MTAwMGRldi0+bmV0KTsKKwlmcmVlX25ldGRldihmdDEwMDBkZXYtPm5ldCk7CitlcnJfdGhyZWFkOgorCWt0aHJlYWRfc3RvcChwZnQxMDAwaW5mby0+cFBvbGxUaHJlYWQpOwogZXJyX2xvYWQ6CiAJa2ZyZWUocEZpbGVTdGFydCk7CiBlcnJfZnc6CkBAIC0yMTgsNyArMjI4LDcgQEAKIAlERUJVRygiSW4gZGlzY29ubmVjdCBwZnQxMDAwaW5mbz0lcFxuIiwgcGZ0MTAwMGluZm8pOwogCiAJaWYgKHBmdDEwMDBpbmZvKSB7Ci0JCWZ0MTAwMENsZWFudXBQcm9jKHBmdDEwMDBpbmZvKTsKKwkJZnQxMDAwX2NsZWFudXBfcHJvYyhwZnQxMDAwaW5mbyk7CiAJCWlmIChwZnQxMDAwaW5mby0+cFBvbGxUaHJlYWQpCiAJCQlrdGhyZWFkX3N0b3AocGZ0MTAwMGluZm8tPnBQb2xsVGhyZWFkKTsKIApAQCAtMjI2LDcgKzIzNiw3IEBACiAKIAkJaWYgKHBmdDEwMDBpbmZvLT5wRnQxMDAwRGV2LT5uZXQpIHsKIAkJCURFQlVHKCJmdDEwMDBfZGlzY29ubmVjdDogZGVzdHJveSBjaGFyIGRyaXZlclxuIik7Ci0JCQlmdDEwMDBfRGVzdHJveURldmljZShwZnQxMDAwaW5mby0+cEZ0MTAwMERldi0+bmV0KTsKKwkJCWZ0MTAwMF9kZXN0cm95X2RldihwZnQxMDAwaW5mby0+cEZ0MTAwMERldi0+bmV0KTsKIAkJCXVucmVnaXN0ZXJfbmV0ZGV2KHBmdDEwMDBpbmZvLT5wRnQxMDAwRGV2LT5uZXQpOwogCQkJREVCVUcKIAkJCSAgICAoImZ0MTAwMF9kaXNjb25uZWN0OiBuZXR3b3JrIGRldmljZSB1bnJlZ2lzdGVyZFxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX3VzYi5oIGIvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF91c2IuaAppbmRleCBhOWQ0MTlhLi5hMTQzZTljIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX3VzYi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfdXNiLmgKQEAgLTk4LDE2ICs5OCw2IEBACiAvKmVuZCBvZiBKaW0qLwogI2RlZmluZSBERUJVRyhhcmdzLi4uKSBwcmludGsoS0VSTl9JTkZPIGFyZ3MpCiAKLSNkZWZpbmUgVUNIQVIgICAgICAgICAgICAgICB1OAotI2RlZmluZSBVU0hPUlQgICAgICAgICAgICAgIHUxNgotI2RlZmluZSBVTE9ORyAgICAgICAgICAgICAgIHUzMiAvKiBXVEYgPz8/ICovCi0jZGVmaW5lIEJPT0xFQU4gICAgICAgICAgICAgdTgKLSNkZWZpbmUgUFVMT05HICAgICAgICAgICAgICB1MzIgKgotI2RlZmluZSBQVVNIT1JUICAgICAgICAgICAgIHUxNiAqCi0jZGVmaW5lIFBVQ0hBUiAgICAgICAgICAgICAgdTggKgotI2RlZmluZSBQQ0hBUiAgICAgICAgICAgICAgIHU4ICoKLSNkZWZpbmUgVUlOVCAgICAgICAgICAgICAgICB1MzIKLQogI2RlZmluZSBGQUxTRSAgICAgICAgICAgMAogI2RlZmluZSBUUlVFICAgICAgICAgICAgMQogCkBAIC0zNzIsMTUgKzM2MiwxNSBAQAogCiAKIAotI2RlZmluZSBJU1JfRU1QVFkJCQkoVUNIQVIpMHgwMCAJIC8vIG5vIGJpdHMgc2V0IGluIElTUgorI2RlZmluZSBJU1JfRU1QVFkJCQkodTgpMHgwMCAJIC8vIG5vIGJpdHMgc2V0IGluIElTUgogCi0jZGVmaW5lIElTUl9ET09SQkVMTF9BQ0sJKFVDSEFSKTB4MDEJCSAvLyAgdGhlIGRvb3JiZWxsIGkgc2VudCBoYXMgYmVlbiByZWNpZXZlZC4KKyNkZWZpbmUgSVNSX0RPT1JCRUxMX0FDSwkodTgpMHgwMQkJIC8vICB0aGUgZG9vcmJlbGwgaSBzZW50IGhhcyBiZWVuIHJlY2lldmVkLgogCi0jZGVmaW5lIElTUl9ET09SQkVMTF9QRU5ECShVQ0hBUikweDAyIAkgLy8gIGRvb3JiZWxsIGZvciBtZQorI2RlZmluZSBJU1JfRE9PUkJFTExfUEVORAkodTgpMHgwMiAJIC8vICBkb29yYmVsbCBmb3IgbWUKIAotI2RlZmluZSBJU1JfUkNWCQkJCShVQ0hBUikweDA0IAkgLy8gcGFja2V0IHJlY2VpdmVkIHdpdGggbm8gZXJyb3JzCisjZGVmaW5lIElTUl9SQ1YJCQkJKHU4KTB4MDQgCSAvLyBwYWNrZXQgcmVjZWl2ZWQgd2l0aCBubyBlcnJvcnMKIAotI2RlZmluZSBJU1JfV0FURVJNQVJLCQkoVUNIQVIpMHgwOCAJIC8vCisjZGVmaW5lIElTUl9XQVRFUk1BUksJCSh1OCkweDA4IAkgLy8KIAogCiAKQEAgLTQ2NiwxMiArNDU2LDkgQEAKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2OwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXQ7Ci0Jc3BpbmxvY2tfdCBkZXZpY2VfbG9jazsKIAogCXUzMiBzdGF0dXM7CiAKLQl3YWl0X3F1ZXVlX2hlYWRfdCBjb250cm9sX3dhaXQ7Ci0KIAlzdHJ1Y3QgdXJiICpyeF91cmI7CiAJc3RydWN0IHVyYiAqdHhfdXJiOwogCkBAIC00ODYsNiArNDczLDEzIEBACiAvLwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsgLy9tYmVsaWFuCiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAorc3RydWN0IGZ0MTAwMF9kZWJ1Z19kaXJzIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IGRlbnRyeSAqZGVudDsKKwlzdHJ1Y3QgZGVudHJ5ICpmaWxlOworCWludCBpbnRfbnVtYmVyOworfTsKKwogc3RydWN0IGZ0MTAwMF9pbmZvIHsKICAgICBzdHJ1Y3QgZnQxMDAwX2RldmljZSAqcEZ0MTAwMERldjsKICAgICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKQEAgLTQ5Nyw5ICs0OTEsOSBAQAogCXVuc2lnbmVkIGNoYXIgdXNiYm9vdDsKICAgICB1bnNpZ25lZCBzaG9ydCBkc3BhbGl2ZTsKICAgICB1MTYgQVNJQ19JRDsKLSAgICBCT09MRUFOIGZQcm92Q29tcGxldGU7Ci0gICAgQk9PTEVBTiBmQ29uZFJlc2V0UGVuZDsKLSAgICBCT09MRUFOIGZBcHBNc2dQZW5kOworICAgIGJvb2wgZlByb3ZDb21wbGV0ZTsKKyAgICBib29sIGZDb25kUmVzZXRQZW5kOworICAgIGJvb2wgZkFwcE1zZ1BlbmQ7CiAgICAgY2hhciAqcGZ3aW1nOwogICAgIGludCBmd2ltZ3N6OwogICAgIHUxNiBEcnZFcnJOdW07CkBAIC01MjAsNyArNTE0LDcgQEAKICAgICBpbnQgTmV0RGV2UmVnRG9uZTsKICAgICB1OCBDYXJkTnVtYmVyOwogICAgIHU4IERldmljZU5hbWVbMTVdOwotICAgIGludCBEZXZpY2VNYWpvcjsKKyAgICBzdHJ1Y3QgZnQxMDAwX2RlYnVnX2RpcnMgbm9kZXM7CiAgICAgaW50IHJlZ2lzdGVyZWQ7CiAgICAgaW50IG1lZGlhc3RhdGU7CiAgICAgaW50IGRoY3BmbGc7CkBAIC01NjcsMjYgKzU2MSwyNiBAQAogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKIHUxNiBmdDEwMDBfcmVhZF9yZWdpc3RlcihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCB1MTYqIERhdGEsIHUxNiBuUmVnSW5keCk7Ci11MTYgZnQxMDAwX3dyaXRlX3JlZ2lzdGVyKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsIFVTSE9SVCB2YWx1ZSwgdTE2IG5SZWdJbmR4KTsKLXUxNiBmdDEwMDBfcmVhZF9kcHJhbTMyKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsIFVTSE9SVCBpbmR4LCBQVUNIQVIgYnVmZmVyLCBVU0hPUlQgY250KTsKLXUxNiBmdDEwMDBfd3JpdGVfZHByYW0zMihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCBVU0hPUlQgaW5keCwgUFVDSEFSIGJ1ZmZlciwgVVNIT1JUIGNudCk7Ci11MTYgZnQxMDAwX3JlYWRfZHByYW0xNihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCBVU0hPUlQgaW5keCwgUFVDSEFSIGJ1ZmZlciwgdTggaGlnaGxvdyk7Ci11MTYgZnQxMDAwX3dyaXRlX2RwcmFtMTYoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgVVNIT1JUIGluZHgsIFVTSE9SVCB2YWx1ZSwgdTggaGlnaGxvdyk7Ci11MTYgZml4X2Z0MTAwMF9yZWFkX2RwcmFtMzIoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgVVNIT1JUIGluZHgsIFBVQ0hBUiBidWZmZXIpOwotdTE2IGZpeF9mdDEwMDBfd3JpdGVfZHByYW0zMihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCBVU0hPUlQgaW5keCwgUFVDSEFSIGJ1ZmZlcik7Cit1MTYgZnQxMDAwX3dyaXRlX3JlZ2lzdGVyKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsIHUxNiB2YWx1ZSwgdTE2IG5SZWdJbmR4KTsKK3UxNiBmdDEwMDBfcmVhZF9kcHJhbTMyKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsIHUxNiBpbmR4LCB1OCAqYnVmZmVyLCB1MTYgY250KTsKK3UxNiBmdDEwMDBfd3JpdGVfZHByYW0zMihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCB1MTYgaW5keCwgdTggKmJ1ZmZlciwgdTE2IGNudCk7Cit1MTYgZnQxMDAwX3JlYWRfZHByYW0xNihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCB1MTYgaW5keCwgdTggKmJ1ZmZlciwgdTggaGlnaGxvdyk7Cit1MTYgZnQxMDAwX3dyaXRlX2RwcmFtMTYoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgdTE2IGluZHgsIHUxNiB2YWx1ZSwgdTggaGlnaGxvdyk7Cit1MTYgZml4X2Z0MTAwMF9yZWFkX2RwcmFtMzIoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgdTE2IGluZHgsIHU4ICpidWZmZXIpOwordTE2IGZpeF9mdDEwMDBfd3JpdGVfZHByYW0zMihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCB1MTYgaW5keCwgdTggKmJ1ZmZlcik7CiAKIGV4dGVybiB2b2lkICpwRmlsZVN0YXJ0OwogZXh0ZXJuIHNpemVfdCBGaWxlTGVuZ3RoOwogZXh0ZXJuIGludCBudW1vZm1zZ2J1ZjsKIAogaW50IGZ0MTAwMF9jbG9zZSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci11MTYgc2NyYW1fZG5sZHIoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgdm9pZCAqcEZpbGVTdGFydCwgVUxPTkcgIEZpbGVMZW5ndGgpOwordTE2IHNjcmFtX2RubGRyKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsIHZvaWQgKnBGaWxlU3RhcnQsIHUzMiAgRmlsZUxlbmd0aCk7CiAKIGV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVyY3Zwb29sOwogZXh0ZXJuIHNwaW5sb2NrX3QgZnJlZV9idWZmX2xvY2s7ICAgLy8gbG9jayB0byBhcmJpdHJhdGUgZnJlZSBidWZmZXIgbGlzdCBmb3IgcmVjZWl2ZSBjb21tYW5kIGRhdGEKIAotaW50IGZ0MTAwMF9DcmVhdGVEZXZpY2Uoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmRldik7Ci12b2lkIGZ0MTAwMF9EZXN0cm95RGV2aWNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworaW50IGZ0MTAwMF9jcmVhdGVfZGV2KHN0cnVjdCBmdDEwMDBfZGV2aWNlICpkZXYpOwordm9pZCBmdDEwMDBfZGVzdHJveV9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCBDYXJkU2VuZENvbW1hbmQoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgdm9pZCAqcHRlbXBidWZmZXIsIGludCBzaXplKTsKIAogc3RydWN0IGRwcmFtX2JsayAqZnQxMDAwX2dldF9idWZmZXIoc3RydWN0IGxpc3RfaGVhZCAqYnVmZmxpc3QpOwpAQCAtNjAwLDggKzU5NCw4IEBACiBpbnQgcmVnX2Z0MTAwMF9uZXRkZXYoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOwogaW50IGZ0MTAwMF9wb2xsKHZvaWQqIGRldl9pZCk7CiAKLXZvaWQgZnQxMDAwSW5pdFByb2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci12b2lkIGZ0MTAwMENsZWFudXBQcm9jKHN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbyk7CitpbnQgZnQxMDAwX2luaXRfcHJvYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgZnQxMDAwX2NsZWFudXBfcHJvYyhzdHJ1Y3QgZnQxMDAwX2luZm8gKmluZm8pOwogCiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctZHJpdmVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy1kcml2ZXIuYwppbmRleCA0OGQ0ZTQ4Li42YzkyNzlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy1kcml2ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy1kcml2ZXIuYwpAQCAtNjI0LDcgKzYyNCw3IEBACiAJZ28tPmR2ZF9tb2RlID0gMDsKIAlnby0+aW50ZXJsYWNlX2NvZGluZyA9IDA7CiAJZm9yIChpID0gMDsgaSA8IDQ7ICsraSkKLQkJZ28tPm1vZGV0W2ldLmVuYWJsZSA9IDA7OworCQlnby0+bW9kZXRbaV0uZW5hYmxlID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgMTYyNDsgKytpKQogCQlnby0+bW9kZXRfbWFwW2ldID0gMDsKIAlnby0+YXVkaW9fZGVsaXZlciA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvaHYvTWFrZWZpbGUKaW5kZXggYjQ2MzQ5Yi4uYWNkMzliZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi9NYWtlZmlsZQpAQCAtNSw3ICs1LDcgQEAKIG9iai0kKENPTkZJR19IWVBFUlZfVVRJTFMpCSs9IGh2X3V0aWxzLm8KIAogaHZfdm1idXMteSA6PSB2bWJ1c19kcnYubyBvc2QubyBcCi0JCSB2bWJ1cy5vIGh2Lm8gY29ubmVjdGlvbi5vIGNoYW5uZWwubyBcCisJCSBodi5vIGNvbm5lY3Rpb24ubyBjaGFubmVsLm8gXAogCQkgY2hhbm5lbF9tZ210Lm8gcmluZ19idWZmZXIubwogaHZfc3RvcnZzYy15IDo9IHN0b3J2c2NfZHJ2Lm8gc3RvcnZzYy5vCiBodl9ibGt2c2MteSA6PSBibGt2c2NfZHJ2Lm8gYmxrdnNjLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9ibGt2c2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9odi9ibGt2c2MuYwppbmRleCBkNWIwYWJkLi5iYzE2ZDkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvYmxrdnNjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L2Jsa3ZzYy5jCkBAIC0yNSwyNCArMjUsMjQgQEAKICNpbmNsdWRlICJvc2QuaCIKICNpbmNsdWRlICJzdG9ydnNjLmMiCiAKLXN0YXRpYyBjb25zdCBjaGFyICpnQmxrRHJpdmVyTmFtZSA9ICJibGt2c2MiOworc3RhdGljIGNvbnN0IGNoYXIgKmdfYmxrX2RyaXZlcl9uYW1lID0gImJsa3ZzYyI7CiAKIC8qIHszMjQxMjYzMi04NmNiLTQ0YTItOWI1Yy01MGQxNDE3MzU0ZjV9ICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGh2X2d1aWQgZ0Jsa1ZzY0RldmljZVR5cGUgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGh2X2d1aWQgZ19ibGtfZGV2aWNlX3R5cGUgPSB7CiAJLmRhdGEgPSB7CiAJCTB4MzIsIDB4MjYsIDB4NDEsIDB4MzIsIDB4Y2IsIDB4ODYsIDB4YTIsIDB4NDQsCiAJCTB4OWIsIDB4NWMsIDB4NTAsIDB4ZDEsIDB4NDEsIDB4NzMsIDB4NTQsIDB4ZjUKIAl9CiB9OwogCi1zdGF0aWMgaW50IEJsa1ZzY09uRGV2aWNlQWRkKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSwgdm9pZCAqQWRkaXRpb25hbEluZm8pCitzdGF0aWMgaW50IGJsa192c2Nfb25fZGV2aWNlX2FkZChzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UsIHZvaWQgKmFkZGl0aW9uYWxfaW5mbykKIHsKLQlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2VfaW5mbyAqZGV2aWNlSW5mbzsKKwlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2VfaW5mbyAqZGV2aWNlX2luZm87CiAJaW50IHJldCA9IDA7CiAKLQlkZXZpY2VJbmZvID0gKHN0cnVjdCBzdG9ydnNjX2RldmljZV9pbmZvICopQWRkaXRpb25hbEluZm87CisJZGV2aWNlX2luZm8gPSAoc3RydWN0IHN0b3J2c2NfZGV2aWNlX2luZm8gKilhZGRpdGlvbmFsX2luZm87CiAKLQlyZXQgPSBTdG9yVnNjT25EZXZpY2VBZGQoRGV2aWNlLCBBZGRpdGlvbmFsSW5mbyk7CisJcmV0ID0gc3Rvcl92c2Nfb25fZGV2aWNlX2FkZChkZXZpY2UsIGFkZGl0aW9uYWxfaW5mbyk7CiAJaWYgKHJldCAhPSAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC01MSwzMSArNTEsMzEgQEAKIAkgKiBpZC4gRm9yIElERSBkZXZpY2VzLCB0aGUgZGV2aWNlIGluc3RhbmNlIGlkIGlzIGZvcm1hdHRlZCBhcwogCSAqIDxidXMgaWQ+ICogLSA8ZGV2aWNlIGlkPiAtIDg4OTkgLSAwMDAwMDAwMDAwMDAuCiAJICovCi0JZGV2aWNlSW5mby0+UGF0aElkID0gRGV2aWNlLT5kZXZpY2VJbnN0YW5jZS5kYXRhWzNdIDw8IDI0IHwKLQkJCSAgICAgRGV2aWNlLT5kZXZpY2VJbnN0YW5jZS5kYXRhWzJdIDw8IDE2IHwKLQkJCSAgICAgRGV2aWNlLT5kZXZpY2VJbnN0YW5jZS5kYXRhWzFdIDw8IDggIHwKLQkJCSAgICAgRGV2aWNlLT5kZXZpY2VJbnN0YW5jZS5kYXRhWzBdOworCWRldmljZV9pbmZvLT5wYXRoX2lkID0gZGV2aWNlLT5kZXZpY2VJbnN0YW5jZS5kYXRhWzNdIDw8IDI0IHwKKwkJCSAgICAgZGV2aWNlLT5kZXZpY2VJbnN0YW5jZS5kYXRhWzJdIDw8IDE2IHwKKwkJCSAgICAgZGV2aWNlLT5kZXZpY2VJbnN0YW5jZS5kYXRhWzFdIDw8IDggIHwKKwkJCSAgICAgZGV2aWNlLT5kZXZpY2VJbnN0YW5jZS5kYXRhWzBdOwogCi0JZGV2aWNlSW5mby0+VGFyZ2V0SWQgPSBEZXZpY2UtPmRldmljZUluc3RhbmNlLmRhdGFbNV0gPDwgOCB8Ci0JCQkgICAgICAgRGV2aWNlLT5kZXZpY2VJbnN0YW5jZS5kYXRhWzRdOworCWRldmljZV9pbmZvLT50YXJnZXRfaWQgPSBkZXZpY2UtPmRldmljZUluc3RhbmNlLmRhdGFbNV0gPDwgOCB8CisJCQkgICAgICAgZGV2aWNlLT5kZXZpY2VJbnN0YW5jZS5kYXRhWzRdOwogCiAJcmV0dXJuIHJldDsKIH0KIAotaW50IEJsa1ZzY0luaXRpYWxpemUoc3RydWN0IGh2X2RyaXZlciAqRHJpdmVyKQoraW50IGJsa192c2NfaW5pdGlhbGl6ZShzdHJ1Y3QgaHZfZHJpdmVyICpkcml2ZXIpCiB7Ci0Jc3RydWN0IHN0b3J2c2NfZHJpdmVyX29iamVjdCAqc3RvckRyaXZlcjsKKwlzdHJ1Y3Qgc3RvcnZzY19kcml2ZXJfb2JqZWN0ICpzdG9yX2RyaXZlcjsKIAlpbnQgcmV0ID0gMDsKIAotCXN0b3JEcml2ZXIgPSAoc3RydWN0IHN0b3J2c2NfZHJpdmVyX29iamVjdCAqKURyaXZlcjsKKwlzdG9yX2RyaXZlciA9IChzdHJ1Y3Qgc3RvcnZzY19kcml2ZXJfb2JqZWN0ICopZHJpdmVyOwogCiAJLyogTWFrZSBzdXJlIHdlIGFyZSBhdCBsZWFzdCAyIHBhZ2VzIHNpbmNlIDEgcGFnZSBpcyB1c2VkIGZvciBjb250cm9sICovCi0JLyogQVNTRVJUKHN0b3JEcml2ZXItPlJpbmdCdWZmZXJTaXplID49IChQQUdFX1NJWkUgPDwgMSkpOyAqLworCS8qIEFTU0VSVChzdG9yX2RyaXZlci0+UmluZ0J1ZmZlclNpemUgPj0gKFBBR0VfU0laRSA8PCAxKSk7ICovCiAKLQlEcml2ZXItPm5hbWUgPSBnQmxrRHJpdmVyTmFtZTsKLQltZW1jcHkoJkRyaXZlci0+ZGV2aWNlVHlwZSwgJmdCbGtWc2NEZXZpY2VUeXBlLCBzaXplb2Yoc3RydWN0IGh2X2d1aWQpKTsKKwlkcml2ZXItPm5hbWUgPSBnX2Jsa19kcml2ZXJfbmFtZTsKKwltZW1jcHkoJmRyaXZlci0+ZGV2aWNlVHlwZSwgJmdfYmxrX2RldmljZV90eXBlLCBzaXplb2Yoc3RydWN0IGh2X2d1aWQpKTsKIAotCXN0b3JEcml2ZXItPlJlcXVlc3RFeHRTaXplID0gc2l6ZW9mKHN0cnVjdCBzdG9ydnNjX3JlcXVlc3RfZXh0ZW5zaW9uKTsKKwlzdG9yX2RyaXZlci0+cmVxdWVzdF9leHRfc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc3RvcnZzY19yZXF1ZXN0X2V4dGVuc2lvbik7CiAKIAkvKgogCSAqIERpdmlkZSB0aGUgcmluZyBidWZmZXIgZGF0YSBzaXplICh3aGljaCBpcyAxIHBhZ2UgbGVzcyB0aGFuIHRoZSByaW5nCkBAIC04MywyMCArODMsMjAgQEAKIAkgKiBieSB0aGUgbWF4IHJlcXVlc3Qgc2l6ZSAod2hpY2ggaXMKIAkgKiB2bWJ1c19jaGFubmVsX3BhY2tldF9tdWx0aXBhZ2VfYnVmZmVyICsgc3RydWN0IHZzdG9yX3BhY2tldCArIHU2NCkKIAkgKi8KLQlzdG9yRHJpdmVyLT5NYXhPdXRzdGFuZGluZ1JlcXVlc3RzUGVyQ2hhbm5lbCA9Ci0JCSgoc3RvckRyaXZlci0+UmluZ0J1ZmZlclNpemUgLSBQQUdFX1NJWkUpIC8KKwlzdG9yX2RyaXZlci0+bWF4X291dHN0YW5kaW5nX3JlcV9wZXJfY2hhbm5lbCA9CisJCSgoc3Rvcl9kcml2ZXItPnJpbmdfYnVmZmVyX3NpemUgLSBQQUdFX1NJWkUpIC8KIAkJICBBTElHTl9VUChNQVhfTVVMVElQQUdFX0JVRkZFUl9QQUNLRVQgKwogCQkJICAgc2l6ZW9mKHN0cnVjdCB2c3Rvcl9wYWNrZXQpICsgc2l6ZW9mKHU2NCksCiAJCQkgICBzaXplb2YodTY0KSkpOwogCiAJRFBSSU5UX0lORk8oQkxLVlNDLCAibWF4IGlvIG91dHN0ZCAldSIsCi0JCSAgICBzdG9yRHJpdmVyLT5NYXhPdXRzdGFuZGluZ1JlcXVlc3RzUGVyQ2hhbm5lbCk7CisJCSAgICBzdG9yX2RyaXZlci0+bWF4X291dHN0YW5kaW5nX3JlcV9wZXJfY2hhbm5lbCk7CiAKIAkvKiBTZXR1cCB0aGUgZGlzcGF0Y2ggdGFibGUgKi8KLQlzdG9yRHJpdmVyLT5CYXNlLk9uRGV2aWNlQWRkID0gQmxrVnNjT25EZXZpY2VBZGQ7Ci0Jc3RvckRyaXZlci0+QmFzZS5PbkRldmljZVJlbW92ZSA9IFN0b3JWc2NPbkRldmljZVJlbW92ZTsKLQlzdG9yRHJpdmVyLT5CYXNlLk9uQ2xlYW51cCA9IFN0b3JWc2NPbkNsZWFudXA7Ci0Jc3RvckRyaXZlci0+T25JT1JlcXVlc3QJPSBTdG9yVnNjT25JT1JlcXVlc3Q7CisJc3Rvcl9kcml2ZXItPmJhc2UuT25EZXZpY2VBZGQgPSBibGtfdnNjX29uX2RldmljZV9hZGQ7CisJc3Rvcl9kcml2ZXItPmJhc2UuT25EZXZpY2VSZW1vdmUgPSBzdG9yX3ZzY19vbl9kZXZpY2VfcmVtb3ZlOworCXN0b3JfZHJpdmVyLT5iYXNlLk9uQ2xlYW51cCA9IHN0b3JfdnNjX29uX2NsZWFudXA7CisJc3Rvcl9kcml2ZXItPm9uX2lvX3JlcXVlc3QgPSBzdG9yX3ZzY19vbl9pb19yZXF1ZXN0OwogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9ibGt2c2NfZHJ2LmMgYi9kcml2ZXJzL3N0YWdpbmcvaHYvYmxrdnNjX2Rydi5jCmluZGV4IDNmODFjYTUuLmIzZDA1ZmNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvYmxrdnNjX2Rydi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi9ibGt2c2NfZHJ2LmMKQEAgLTE3NywxMyArMTc3LDEzIEBACiAJc3RydWN0IGRyaXZlcl9jb250ZXh0ICpkcnZfY3R4ID0gJmdfYmxrdnNjX2Rydi5kcnZfY3R4OwogCWludCByZXQ7CiAKLQlzdG9ydnNjX2Rydl9vYmotPlJpbmdCdWZmZXJTaXplID0gYmxrdnNjX3JpbmdidWZmZXJfc2l6ZTsKKwlzdG9ydnNjX2Rydl9vYmotPnJpbmdfYnVmZmVyX3NpemUgPSBibGt2c2NfcmluZ2J1ZmZlcl9zaXplOwogCiAJLyogQ2FsbGJhY2sgdG8gY2xpZW50IGRyaXZlciB0byBjb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gKi8KLQlkcnZfaW5pdCgmc3RvcnZzY19kcnZfb2JqLT5CYXNlKTsKKwlkcnZfaW5pdCgmc3RvcnZzY19kcnZfb2JqLT5iYXNlKTsKIAotCWRydl9jdHgtPmRyaXZlci5uYW1lID0gc3RvcnZzY19kcnZfb2JqLT5CYXNlLm5hbWU7Ci0JbWVtY3B5KCZkcnZfY3R4LT5jbGFzc19pZCwgJnN0b3J2c2NfZHJ2X29iai0+QmFzZS5kZXZpY2VUeXBlLAorCWRydl9jdHgtPmRyaXZlci5uYW1lID0gc3RvcnZzY19kcnZfb2JqLT5iYXNlLm5hbWU7CisJbWVtY3B5KCZkcnZfY3R4LT5jbGFzc19pZCwgJnN0b3J2c2NfZHJ2X29iai0+YmFzZS5kZXZpY2VUeXBlLAogCSAgICAgICBzaXplb2Yoc3RydWN0IGh2X2d1aWQpKTsKIAogCWRydl9jdHgtPnByb2JlID0gYmxrdnNjX3Byb2JlOwpAQCAtMjMwLDggKzIzMCw4IEBACiAJCWRldmljZV91bnJlZ2lzdGVyKGN1cnJlbnRfZGV2KTsKIAl9CiAKLQlpZiAoc3RvcnZzY19kcnZfb2JqLT5CYXNlLk9uQ2xlYW51cCkKLQkJc3RvcnZzY19kcnZfb2JqLT5CYXNlLk9uQ2xlYW51cCgmc3RvcnZzY19kcnZfb2JqLT5CYXNlKTsKKwlpZiAoc3RvcnZzY19kcnZfb2JqLT5iYXNlLk9uQ2xlYW51cCkKKwkJc3RvcnZzY19kcnZfb2JqLT5iYXNlLk9uQ2xlYW51cCgmc3RvcnZzY19kcnZfb2JqLT5iYXNlKTsKIAogCXZtYnVzX2NoaWxkX2RyaXZlcl91bnJlZ2lzdGVyKGRydl9jdHgpOwogCkBAIC0yNjIsNyArMjYyLDcgQEAKIAogCURQUklOVF9EQkcoQkxLVlNDX0RSViwgImJsa3ZzY19wcm9iZSAtIGVudGVyIik7CiAKLQlpZiAoIXN0b3J2c2NfZHJ2X29iai0+QmFzZS5PbkRldmljZUFkZCkgeworCWlmICghc3RvcnZzY19kcnZfb2JqLT5iYXNlLk9uRGV2aWNlQWRkKSB7CiAJCURQUklOVF9FUlIoQkxLVlNDX0RSViwgIk9uRGV2aWNlQWRkKCkgbm90IHNldCIpOwogCQlyZXQgPSAtMTsKIAkJZ290byBDbGVhbnVwOwpAQCAtMjg0LDcgKzI4NCw3IEBACiAKIAlibGtkZXYtPnJlcXVlc3RfcG9vbCA9IGttZW1fY2FjaGVfY3JlYXRlKGRldl9uYW1lKCZkZXZpY2VfY3R4LT5kZXZpY2UpLAogCQkJCQlzaXplb2Yoc3RydWN0IGJsa3ZzY19yZXF1ZXN0KSArCi0JCQkJCXN0b3J2c2NfZHJ2X29iai0+UmVxdWVzdEV4dFNpemUsIDAsCisJCQkJCXN0b3J2c2NfZHJ2X29iai0+cmVxdWVzdF9leHRfc2l6ZSwgMCwKIAkJCQkJU0xBQl9IV0NBQ0hFX0FMSUdOLCBOVUxMKTsKIAlpZiAoIWJsa2Rldi0+cmVxdWVzdF9wb29sKSB7CiAJCXJldCA9IC1FTk9NRU07CkBAIC0yOTMsNyArMjkzLDcgQEAKIAogCiAJLyogQ2FsbCB0byB0aGUgdnNjIGRyaXZlciB0byBhZGQgdGhlIGRldmljZSAqLwotCXJldCA9IHN0b3J2c2NfZHJ2X29iai0+QmFzZS5PbkRldmljZUFkZChkZXZpY2Vfb2JqLCAmZGV2aWNlX2luZm8pOworCXJldCA9IHN0b3J2c2NfZHJ2X29iai0+YmFzZS5PbkRldmljZUFkZChkZXZpY2Vfb2JqLCAmZGV2aWNlX2luZm8pOwogCWlmIChyZXQgIT0gMCkgewogCQlEUFJJTlRfRVJSKEJMS1ZTQ19EUlYsICJ1bmFibGUgdG8gYWRkIGJsa3ZzYyBkZXZpY2UiKTsKIAkJZ290byBDbGVhbnVwOwpAQCAtMzAxLDkgKzMwMSw5IEBACiAKIAlibGtkZXYtPmRldmljZV9jdHggPSBkZXZpY2VfY3R4OwogCS8qIHRoaXMgaWRlbnRpZmllZCB0aGUgZGV2aWNlIDAgb3IgMSAqLwotCWJsa2Rldi0+dGFyZ2V0ID0gZGV2aWNlX2luZm8uVGFyZ2V0SWQ7CisJYmxrZGV2LT50YXJnZXQgPSBkZXZpY2VfaW5mby50YXJnZXRfaWQ7CiAJLyogdGhpcyBpZGVudGlmaWVkIHRoZSBpZGUgY3RybCAwIG9yIDEgKi8KLQlibGtkZXYtPnBhdGggPSBkZXZpY2VfaW5mby5QYXRoSWQ7CisJYmxrZGV2LT5wYXRoID0gZGV2aWNlX2luZm8ucGF0aF9pZDsKIAogCWRldl9zZXRfZHJ2ZGF0YShkZXZpY2UsIGJsa2Rldik7CiAKQEAgLTM5MSw3ICszOTEsNyBAQAogCXJldHVybiByZXQ7CiAKIFJlbW92ZToKLQlzdG9ydnNjX2Rydl9vYmotPkJhc2UuT25EZXZpY2VSZW1vdmUoZGV2aWNlX29iaik7CisJc3RvcnZzY19kcnZfb2JqLT5iYXNlLk9uRGV2aWNlUmVtb3ZlKGRldmljZV9vYmopOwogCiBDbGVhbnVwOgogCWlmIChibGtkZXYpIHsKQEAgLTQ1OSw5ICs0NTksOSBAQAogCWJsa3ZzY19yZXEtPnJlcSA9IE5VTEw7CiAJYmxrdnNjX3JlcS0+d3JpdGUgPSAwOwogCi0JYmxrdnNjX3JlcS0+cmVxdWVzdC5EYXRhQnVmZmVyLlBmbkFycmF5WzBdID0gMDsKLQlibGt2c2NfcmVxLT5yZXF1ZXN0LkRhdGFCdWZmZXIuT2Zmc2V0ID0gMDsKLQlibGt2c2NfcmVxLT5yZXF1ZXN0LkRhdGFCdWZmZXIuTGVuZ3RoID0gMDsKKwlibGt2c2NfcmVxLT5yZXF1ZXN0LmRhdGFfYnVmZmVyLlBmbkFycmF5WzBdID0gMDsKKwlibGt2c2NfcmVxLT5yZXF1ZXN0LmRhdGFfYnVmZmVyLk9mZnNldCA9IDA7CisJYmxrdnNjX3JlcS0+cmVxdWVzdC5kYXRhX2J1ZmZlci5MZW5ndGggPSAwOwogCiAJYmxrdnNjX3JlcS0+Y21uZFswXSA9IFNZTkNIUk9OSVpFX0NBQ0hFOwogCWJsa3ZzY19yZXEtPmNtZF9sZW4gPSAxMDsKQEAgLTUwNiw5ICs1MDYsOSBAQAogCWJsa3ZzY19yZXEtPnJlcSA9IE5VTEw7CiAJYmxrdnNjX3JlcS0+d3JpdGUgPSAwOwogCi0JYmxrdnNjX3JlcS0+cmVxdWVzdC5EYXRhQnVmZmVyLlBmbkFycmF5WzBdID0gcGFnZV90b19wZm4ocGFnZV9idWYpOwotCWJsa3ZzY19yZXEtPnJlcXVlc3QuRGF0YUJ1ZmZlci5PZmZzZXQgPSAwOwotCWJsa3ZzY19yZXEtPnJlcXVlc3QuRGF0YUJ1ZmZlci5MZW5ndGggPSA2NDsKKwlibGt2c2NfcmVxLT5yZXF1ZXN0LmRhdGFfYnVmZmVyLlBmbkFycmF5WzBdID0gcGFnZV90b19wZm4ocGFnZV9idWYpOworCWJsa3ZzY19yZXEtPnJlcXVlc3QuZGF0YV9idWZmZXIuT2Zmc2V0ID0gMDsKKwlibGt2c2NfcmVxLT5yZXF1ZXN0LmRhdGFfYnVmZmVyLkxlbmd0aCA9IDY0OwogCiAJYmxrdnNjX3JlcS0+Y21uZFswXSA9IElOUVVJUlk7CiAJYmxrdnNjX3JlcS0+Y21uZFsxXSA9IDB4MTsJCS8qIEdldCBwcm9kdWN0IGRhdGEgKi8KQEAgLTU5Myw5ICs1OTMsOSBAQAogCWJsa3ZzY19yZXEtPnJlcSA9IE5VTEw7CiAJYmxrdnNjX3JlcS0+d3JpdGUgPSAwOwogCi0JYmxrdnNjX3JlcS0+cmVxdWVzdC5EYXRhQnVmZmVyLlBmbkFycmF5WzBdID0gcGFnZV90b19wZm4ocGFnZV9idWYpOwotCWJsa3ZzY19yZXEtPnJlcXVlc3QuRGF0YUJ1ZmZlci5PZmZzZXQgPSAwOwotCWJsa3ZzY19yZXEtPnJlcXVlc3QuRGF0YUJ1ZmZlci5MZW5ndGggPSA4OworCWJsa3ZzY19yZXEtPnJlcXVlc3QuZGF0YV9idWZmZXIuUGZuQXJyYXlbMF0gPSBwYWdlX3RvX3BmbihwYWdlX2J1Zik7CisJYmxrdnNjX3JlcS0+cmVxdWVzdC5kYXRhX2J1ZmZlci5PZmZzZXQgPSAwOworCWJsa3ZzY19yZXEtPnJlcXVlc3QuZGF0YV9idWZmZXIuTGVuZ3RoID0gODsKIAogCWJsa3ZzY19yZXEtPmNtbmRbMF0gPSBSRUFEX0NBUEFDSVRZOwogCWJsa3ZzY19yZXEtPmNtZF9sZW4gPSAxNjsKQEAgLTYxNCw3ICs2MTQsNyBAQAogCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShibGt2c2NfcmVxLT53ZXZlbnQsIGJsa3ZzY19yZXEtPmNvbmQpOwogCiAJLyogY2hlY2sgZXJyb3IgKi8KLQlpZiAoYmxrdnNjX3JlcS0+cmVxdWVzdC5TdGF0dXMpIHsKKwlpZiAoYmxrdnNjX3JlcS0+cmVxdWVzdC5zdGF0dXMpIHsKIAkJc2NzaV9ub3JtYWxpemVfc2Vuc2UoYmxrdnNjX3JlcS0+c2Vuc2VfYnVmZmVyLAogCQkJCSAgICAgU0NTSV9TRU5TRV9CVUZGRVJTSVpFLCAmc2Vuc2VfaGRyKTsKIApAQCAtNjcwLDkgKzY3MCw5IEBACiAJYmxrdnNjX3JlcS0+cmVxID0gTlVMTDsKIAlibGt2c2NfcmVxLT53cml0ZSA9IDA7CiAKLQlibGt2c2NfcmVxLT5yZXF1ZXN0LkRhdGFCdWZmZXIuUGZuQXJyYXlbMF0gPSBwYWdlX3RvX3BmbihwYWdlX2J1Zik7Ci0JYmxrdnNjX3JlcS0+cmVxdWVzdC5EYXRhQnVmZmVyLk9mZnNldCA9IDA7Ci0JYmxrdnNjX3JlcS0+cmVxdWVzdC5EYXRhQnVmZmVyLkxlbmd0aCA9IDEyOworCWJsa3ZzY19yZXEtPnJlcXVlc3QuZGF0YV9idWZmZXIuUGZuQXJyYXlbMF0gPSBwYWdlX3RvX3BmbihwYWdlX2J1Zik7CisJYmxrdnNjX3JlcS0+cmVxdWVzdC5kYXRhX2J1ZmZlci5PZmZzZXQgPSAwOworCWJsa3ZzY19yZXEtPnJlcXVlc3QuZGF0YV9idWZmZXIuTGVuZ3RoID0gMTI7CiAKIAlibGt2c2NfcmVxLT5jbW5kWzBdID0gMHg5RTsgLyogUkVBRF9DQVBBQ0lUWTE2OyAqLwogCWJsa3ZzY19yZXEtPmNtZF9sZW4gPSAxNjsKQEAgLTY5MSw3ICs2OTEsNyBAQAogCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShibGt2c2NfcmVxLT53ZXZlbnQsIGJsa3ZzY19yZXEtPmNvbmQpOwogCiAJLyogY2hlY2sgZXJyb3IgKi8KLQlpZiAoYmxrdnNjX3JlcS0+cmVxdWVzdC5TdGF0dXMpIHsKKwlpZiAoYmxrdnNjX3JlcS0+cmVxdWVzdC5zdGF0dXMpIHsKIAkJc2NzaV9ub3JtYWxpemVfc2Vuc2UoYmxrdnNjX3JlcS0+c2Vuc2VfYnVmZmVyLAogCQkJCSAgICAgU0NTSV9TRU5TRV9CVUZGRVJTSVpFLCAmc2Vuc2VfaGRyKTsKIAkJaWYgKHNlbnNlX2hkci5hc2MgPT0gMHgzQSkgewpAQCAtNzQxLDE0ICs3NDEsMTQgQEAKIAogCURQUklOVF9EQkcoQkxLVlNDX0RSViwgImJsa3ZzY19yZW1vdmUoKVxuIik7CiAKLQlpZiAoIXN0b3J2c2NfZHJ2X29iai0+QmFzZS5PbkRldmljZVJlbW92ZSkKKwlpZiAoIXN0b3J2c2NfZHJ2X29iai0+YmFzZS5PbkRldmljZVJlbW92ZSkKIAkJcmV0dXJuIC0xOwogCiAJLyoKIAkgKiBDYWxsIHRvIHRoZSB2c2MgZHJpdmVyIHRvIGxldCBpdCBrbm93IHRoYXQgdGhlIGRldmljZSBpcyBiZWluZwogCSAqIHJlbW92ZWQKIAkgKi8KLQlyZXQgPSBzdG9ydnNjX2Rydl9vYmotPkJhc2UuT25EZXZpY2VSZW1vdmUoZGV2aWNlX29iaik7CisJcmV0ID0gc3RvcnZzY19kcnZfb2JqLT5iYXNlLk9uRGV2aWNlUmVtb3ZlKGRldmljZV9vYmopOwogCWlmIChyZXQgIT0gMCkgewogCQkvKiBUT0RPOiAqLwogCQlEUFJJTlRfRVJSKEJMS1ZTQ19EUlYsCkBAIC04NjUsMzggKzg2NSwzOCBAQAogCQkgICAoYmxrdnNjX3JlcS0+d3JpdGUpID8gIldSSVRFIiA6ICJSRUFEIiwKIAkJICAgKHVuc2lnbmVkIGxvbmcpIGJsa3ZzY19yZXEtPnNlY3Rvcl9zdGFydCwKIAkJICAgYmxrdnNjX3JlcS0+c2VjdG9yX2NvdW50LAotCQkgICBibGt2c2NfcmVxLT5yZXF1ZXN0LkRhdGFCdWZmZXIuT2Zmc2V0LAotCQkgICBibGt2c2NfcmVxLT5yZXF1ZXN0LkRhdGFCdWZmZXIuTGVuZ3RoKTsKKwkJICAgYmxrdnNjX3JlcS0+cmVxdWVzdC5kYXRhX2J1ZmZlci5PZmZzZXQsCisJCSAgIGJsa3ZzY19yZXEtPnJlcXVlc3QuZGF0YV9idWZmZXIuTGVuZ3RoKTsKICNpZiAwCi0JZm9yIChpID0gMDsgaSA8IChibGt2c2NfcmVxLT5yZXF1ZXN0LkRhdGFCdWZmZXIuTGVuZ3RoID4+IDEyKTsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IChibGt2c2NfcmVxLT5yZXF1ZXN0LmRhdGFfYnVmZmVyLkxlbmd0aCA+PiAxMik7IGkrKykgewogCQlEUFJJTlRfREJHKEJMS1ZTQ19EUlYsICJibGt2c2Nfc3VibWl0X3JlcXVlc3QoKSAtICIKIAkJCSAgICJyZXEgJXAgcGZuWyVkXSAlbGx4XG4iLAogCQkJICAgYmxrdnNjX3JlcSwgaSwKLQkJCSAgIGJsa3ZzY19yZXEtPnJlcXVlc3QuRGF0YUJ1ZmZlci5QZm5BcnJheVtpXSk7CisJCQkgICBibGt2c2NfcmVxLT5yZXF1ZXN0LmRhdGFfYnVmZmVyLlBmbkFycmF5W2ldKTsKIAl9CiAjZW5kaWYKIAogCXN0b3J2c2NfcmVxID0gJmJsa3ZzY19yZXEtPnJlcXVlc3Q7Ci0Jc3RvcnZzY19yZXEtPkV4dGVuc2lvbiA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKWJsa3ZzY19yZXEgKworCXN0b3J2c2NfcmVxLT5leHRlbnNpb24gPSAodm9pZCAqKSgodW5zaWduZWQgbG9uZylibGt2c2NfcmVxICsKIAkJCQkJICBzaXplb2Yoc3RydWN0IGJsa3ZzY19yZXF1ZXN0KSk7CiAKLQlzdG9ydnNjX3JlcS0+VHlwZSA9IGJsa3ZzY19yZXEtPndyaXRlID8gV1JJVEVfVFlQRSA6IFJFQURfVFlQRTsKKwlzdG9ydnNjX3JlcS0+dHlwZSA9IGJsa3ZzY19yZXEtPndyaXRlID8gV1JJVEVfVFlQRSA6IFJFQURfVFlQRTsKIAotCXN0b3J2c2NfcmVxLT5PbklPQ29tcGxldGlvbiA9IHJlcXVlc3RfY29tcGxldGlvbjsKLQlzdG9ydnNjX3JlcS0+Q29udGV4dCA9IGJsa3ZzY19yZXE7CisJc3RvcnZzY19yZXEtPm9uX2lvX2NvbXBsZXRpb24gPSByZXF1ZXN0X2NvbXBsZXRpb247CisJc3RvcnZzY19yZXEtPmNvbnRleHQgPSBibGt2c2NfcmVxOwogCi0Jc3RvcnZzY19yZXEtPkhvc3QgPSBibGtkZXYtPnBvcnQ7Ci0Jc3RvcnZzY19yZXEtPkJ1cyA9IGJsa2Rldi0+cGF0aDsKLQlzdG9ydnNjX3JlcS0+VGFyZ2V0SWQgPSBibGtkZXYtPnRhcmdldDsKLQlzdG9ydnNjX3JlcS0+THVuSWQgPSAwOwkgLyogdGhpcyBpcyBub3QgcmVhbGx5IHVzZWQgYXQgYWxsICovCisJc3RvcnZzY19yZXEtPmhvc3QgPSBibGtkZXYtPnBvcnQ7CisJc3RvcnZzY19yZXEtPmJ1cyA9IGJsa2Rldi0+cGF0aDsKKwlzdG9ydnNjX3JlcS0+dGFyZ2V0X2lkID0gYmxrZGV2LT50YXJnZXQ7CisJc3RvcnZzY19yZXEtPmx1bl9pZCA9IDA7CSAvKiB0aGlzIGlzIG5vdCByZWFsbHkgdXNlZCBhdCBhbGwgKi8KIAotCXN0b3J2c2NfcmVxLT5DZGJMZW4gPSBibGt2c2NfcmVxLT5jbWRfbGVuOwotCXN0b3J2c2NfcmVxLT5DZGIgPSBibGt2c2NfcmVxLT5jbW5kOworCXN0b3J2c2NfcmVxLT5jZGJfbGVuID0gYmxrdnNjX3JlcS0+Y21kX2xlbjsKKwlzdG9ydnNjX3JlcS0+Y2RiID0gYmxrdnNjX3JlcS0+Y21uZDsKIAotCXN0b3J2c2NfcmVxLT5TZW5zZUJ1ZmZlciA9IGJsa3ZzY19yZXEtPnNlbnNlX2J1ZmZlcjsKLQlzdG9ydnNjX3JlcS0+U2Vuc2VCdWZmZXJTaXplID0gU0NTSV9TRU5TRV9CVUZGRVJTSVpFOworCXN0b3J2c2NfcmVxLT5zZW5zZV9idWZmZXIgPSBibGt2c2NfcmVxLT5zZW5zZV9idWZmZXI7CisJc3RvcnZzY19yZXEtPnNlbnNlX2J1ZmZlcl9zaXplID0gU0NTSV9TRU5TRV9CVUZGRVJTSVpFOwogCi0JcmV0ID0gc3RvcnZzY19kcnZfb2JqLT5PbklPUmVxdWVzdCgmYmxrZGV2LT5kZXZpY2VfY3R4LT5kZXZpY2Vfb2JqLAorCXJldCA9IHN0b3J2c2NfZHJ2X29iai0+b25faW9fcmVxdWVzdCgmYmxrZGV2LT5kZXZpY2VfY3R4LT5kZXZpY2Vfb2JqLAogCQkJCQkgICAmYmxrdnNjX3JlcS0+cmVxdWVzdCk7CiAJaWYgKHJldCA9PSAwKQogCQlibGtkZXYtPm51bV9vdXRzdGFuZGluZ19yZXFzKys7CkBAIC05OTIsOCArOTkyLDEwIEBACiAKIAkJCQkJYmxrdnNjX3JlcS0+ZGV2ID0gYmxrZGV2OwogCQkJCQlibGt2c2NfcmVxLT5yZXEgPSByZXE7Ci0JCQkJCWJsa3ZzY19yZXEtPnJlcXVlc3QuRGF0YUJ1ZmZlci5PZmZzZXQgPSBidmVjLT5idl9vZmZzZXQ7Ci0JCQkJCWJsa3ZzY19yZXEtPnJlcXVlc3QuRGF0YUJ1ZmZlci5MZW5ndGggPSAwOworCQkJCQlibGt2c2NfcmVxLT5yZXF1ZXN0LmRhdGFfYnVmZmVyLk9mZnNldAorCQkJCQkJPSBidmVjLT5idl9vZmZzZXQ7CisJCQkJCWJsa3ZzY19yZXEtPnJlcXVlc3QuZGF0YV9idWZmZXIuTGVuZ3RoCisJCQkJCQk9IDA7CiAKIAkJCQkJLyogQWRkIHRvIHRoZSBncm91cCAqLwogCQkJCQlibGt2c2NfcmVxLT5ncm91cCA9IGdyb3VwOwpAQCAtMTAwNyw4ICsxMDA5LDExIEBACiAJCQkJfQogCiAJCQkJLyogQWRkIHRoZSBjdXJyIGJ2ZWMvc2VnbWVudCB0byB0aGUgY3VyciBibGt2c2NfcmVxICovCi0JCQkJYmxrdnNjX3JlcS0+cmVxdWVzdC5EYXRhQnVmZmVyLlBmbkFycmF5W2RhdGFidWZfaWR4XSA9IHBhZ2VfdG9fcGZuKGJ2ZWMtPmJ2X3BhZ2UpOwotCQkJCWJsa3ZzY19yZXEtPnJlcXVlc3QuRGF0YUJ1ZmZlci5MZW5ndGggKz0gYnZlYy0+YnZfbGVuOworCQkJCWJsa3ZzY19yZXEtPnJlcXVlc3QuZGF0YV9idWZmZXIuCisJCQkJCVBmbkFycmF5W2RhdGFidWZfaWR4XQorCQkJCQkJPSBwYWdlX3RvX3BmbihidmVjLT5idl9wYWdlKTsKKwkJCQlibGt2c2NfcmVxLT5yZXF1ZXN0LmRhdGFfYnVmZmVyLkxlbmd0aAorCQkJCQkrPSBidmVjLT5idl9sZW47CiAKIAkJCQlwcmV2X2J2ZWMgPSBidmVjOwogCkBAIC0xMDczLDcgKzEwNzgsNyBAQAogc3RhdGljIHZvaWQgYmxrdnNjX2NtZF9jb21wbGV0aW9uKHN0cnVjdCBodl9zdG9ydnNjX3JlcXVlc3QgKnJlcXVlc3QpCiB7CiAJc3RydWN0IGJsa3ZzY19yZXF1ZXN0ICpibGt2c2NfcmVxID0KLQkJCShzdHJ1Y3QgYmxrdnNjX3JlcXVlc3QgKilyZXF1ZXN0LT5Db250ZXh0OworCQkJKHN0cnVjdCBibGt2c2NfcmVxdWVzdCAqKXJlcXVlc3QtPmNvbnRleHQ7CiAJc3RydWN0IGJsb2NrX2RldmljZV9jb250ZXh0ICpibGtkZXYgPQogCQkJKHN0cnVjdCBibG9ja19kZXZpY2VfY29udGV4dCAqKWJsa3ZzY19yZXEtPmRldjsKIAlzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgc2Vuc2VfaGRyOwpAQCAtMTA4Myw3ICsxMDg4LDcgQEAKIAogCWJsa2Rldi0+bnVtX291dHN0YW5kaW5nX3JlcXMtLTsKIAotCWlmIChibGt2c2NfcmVxLT5yZXF1ZXN0LlN0YXR1cykKKwlpZiAoYmxrdnNjX3JlcS0+cmVxdWVzdC5zdGF0dXMpCiAJCWlmIChzY3NpX25vcm1hbGl6ZV9zZW5zZShibGt2c2NfcmVxLT5zZW5zZV9idWZmZXIsCiAJCQkJCSBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUsICZzZW5zZV9oZHIpKQogCQkJc2NzaV9wcmludF9zZW5zZV9oZHIoImJsa3ZzYyIsICZzZW5zZV9oZHIpOwpAQCAtMTA5NSw3ICsxMTAwLDcgQEAKIHN0YXRpYyB2b2lkIGJsa3ZzY19yZXF1ZXN0X2NvbXBsZXRpb24oc3RydWN0IGh2X3N0b3J2c2NfcmVxdWVzdCAqcmVxdWVzdCkKIHsKIAlzdHJ1Y3QgYmxrdnNjX3JlcXVlc3QgKmJsa3ZzY19yZXEgPQotCQkJKHN0cnVjdCBibGt2c2NfcmVxdWVzdCAqKXJlcXVlc3QtPkNvbnRleHQ7CisJCQkoc3RydWN0IGJsa3ZzY19yZXF1ZXN0ICopcmVxdWVzdC0+Y29udGV4dDsKIAlzdHJ1Y3QgYmxvY2tfZGV2aWNlX2NvbnRleHQgKmJsa2RldiA9CiAJCQkoc3RydWN0IGJsb2NrX2RldmljZV9jb250ZXh0ICopYmxrdnNjX3JlcS0+ZGV2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0xMTEwLDcgKzExMTUsNyBAQAogCQkgICAoYmxrdnNjX3JlcS0+d3JpdGUpID8gIldSSVRFIiA6ICJSRUFEIiwKIAkJICAgKHVuc2lnbmVkIGxvbmcpYmxrdnNjX3JlcS0+c2VjdG9yX3N0YXJ0LAogCQkgICBibGt2c2NfcmVxLT5zZWN0b3JfY291bnQsCi0JCSAgIGJsa3ZzY19yZXEtPnJlcXVlc3QuRGF0YUJ1ZmZlci5MZW5ndGgsCisJCSAgIGJsa3ZzY19yZXEtPnJlcXVlc3QuZGF0YV9idWZmZXIuTGVuZ3RoLAogCQkgICBibGt2c2NfcmVxLT5ncm91cC0+b3V0c3RhbmRpbmcsCiAJCSAgIGJsa2Rldi0+bnVtX291dHN0YW5kaW5nX3JlcXMpOwogCkBAIC0xMTM3LDcgKzExNDIsNyBAQAogCQkJbGlzdF9kZWwoJmNvbXBfcmVxLT5yZXFfZW50cnkpOwogCiAJCQlpZiAoIV9fYmxrX2VuZF9yZXF1ZXN0KGNvbXBfcmVxLT5yZXEsCi0JCQkJKCFjb21wX3JlcS0+cmVxdWVzdC5TdGF0dXMgPyAwIDogLUVJTyksCisJCQkJKCFjb21wX3JlcS0+cmVxdWVzdC5zdGF0dXMgPyAwIDogLUVJTyksCiAJCQkJY29tcF9yZXEtPnNlY3Rvcl9jb3VudCAqIGJsa2Rldi0+c2VjdG9yX3NpemUpKSB7CiAJCQkJLyoKIAkJCQkgKiBBbGwgdGhlIHNlY3RvcnMgaGF2ZSBiZWVuIHhmZXJyZWQgaWUgdGhlCkBAIC0xMTk1LDcgKzEyMDAsNyBAQAogCiAJCQlpZiAoY29tcF9yZXEtPnJlcSkgewogCQkJCXJldCA9IF9fYmxrX2VuZF9yZXF1ZXN0KGNvbXBfcmVxLT5yZXEsCi0JCQkJCSghY29tcF9yZXEtPnJlcXVlc3QuU3RhdHVzID8gMCA6IC1FSU8pLAorCQkJCQkoIWNvbXBfcmVxLT5yZXF1ZXN0LnN0YXR1cyA/IDAgOiAtRUlPKSwKIAkJCQkJY29tcF9yZXEtPnNlY3Rvcl9jb3VudCAqCiAJCQkJCWJsa2Rldi0+c2VjdG9yX3NpemUpOwogCkBAIC0xNDgyLDcgKzE0ODcsNyBAQAogCiAJRFBSSU5UX0lORk8oQkxLVlNDX0RSViwgIkJsa3ZzYyBpbml0aWFsaXppbmcuLi4uIik7CiAKLQlyZXQgPSBibGt2c2NfZHJ2X2luaXQoQmxrVnNjSW5pdGlhbGl6ZSk7CisJcmV0ID0gYmxrdnNjX2Rydl9pbml0KGJsa192c2NfaW5pdGlhbGl6ZSk7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L2NoYW5uZWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9odi9jaGFubmVsLmMKaW5kZXggMjZlYmM3Ny4uNDVhNjI3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L2NoYW5uZWwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaHYvY2hhbm5lbC5jCkBAIC00MywyNCArNDMsMjQgQEAKIAlpbnQgaiA9IDA7CiAKIAlEUFJJTlRfREJHKFZNQlVTLCAibW9uaXRvclBhZ2UgLSAlcCwgdHJpZ2dlciBzdGF0ZSAtICVkIiwKLQkJICAgTW9uaXRvclBhZ2UsIE1vbml0b3JQYWdlLT5UcmlnZ2VyU3RhdGUpOworCQkgICBNb25pdG9yUGFnZSwgTW9uaXRvclBhZ2UtPnRyaWdnZXJfc3RhdGUpOwogCiAJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKIAkJRFBSSU5UX0RCRyhWTUJVUywgInRyaWdnZXIgZ3JvdXAgKCVkKSAtICVsbHgiLCBpLAotCQkJICAgTW9uaXRvclBhZ2UtPlRyaWdnZXJHcm91cFtpXS5Bc1VJTlQ2NCk7CisJCQkgICBNb25pdG9yUGFnZS0+dHJpZ2dlcl9ncm91cFtpXS5hc191aW50NjQpOwogCiAJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogCQlmb3IgKGogPSAwOyBqIDwgMzI7IGorKykgewogCQkJRFBSSU5UX0RCRyhWTUJVUywgImxhdGVuY3kgKCVkKSglZCkgLSAlbGx4IiwgaSwgaiwKLQkJCQkgICBNb25pdG9yUGFnZS0+TGF0ZW5jeVtpXVtqXSk7CisJCQkJICAgTW9uaXRvclBhZ2UtPmxhdGVuY3lbaV1bal0pOwogCQl9CiAJfQogCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKIAkJZm9yIChqID0gMDsgaiA8IDMyOyBqKyspIHsKIAkJCURQUklOVF9EQkcoVk1CVVMsICJwYXJhbS1jb25uIGlkICglZCkoJWQpIC0gJWQiLCBpLCBqLAotCQkJICAgICAgIE1vbml0b3JQYWdlLT5QYXJhbWV0ZXJbaV1bal0uQ29ubmVjdGlvbklkLkFzdTMyKTsKKwkJCSAgICAgICBNb25pdG9yUGFnZS0+cGFyYW1ldGVyW2ldW2pdLmNvbm5lY3Rpb25pZC5hc3UzMik7CiAJCQlEUFJJTlRfREJHKFZNQlVTLCAicGFyYW0tZmxhZyAoJWQpKCVkKSAtICVkIiwgaSwgaiwKLQkJCQlNb25pdG9yUGFnZS0+UGFyYW1ldGVyW2ldW2pdLkZsYWdOdW1iZXIpOworCQkJCU1vbml0b3JQYWdlLT5wYXJhbWV0ZXJbaV1bal0uZmxhZ19udW1iZXIpOwogCQl9CiAJfQogfQpAQCAtNzQsMjEgKzc0LDIxIEBACiB7CiAJc3RydWN0IGh2X21vbml0b3JfcGFnZSAqbW9uaXRvcnBhZ2U7CiAKLQlpZiAoY2hhbm5lbC0+T2ZmZXJNc2cuTW9uaXRvckFsbG9jYXRlZCkgeworCWlmIChjaGFubmVsLT5vZmZlcm1zZy5tb25pdG9yX2FsbG9jYXRlZCkgewogCQkvKiBFYWNoIHUzMiByZXByZXNlbnRzIDMyIGNoYW5uZWxzICovCi0JCXNldF9iaXQoY2hhbm5lbC0+T2ZmZXJNc2cuQ2hpbGRSZWxJZCAmIDMxLAorCQlzZXRfYml0KGNoYW5uZWwtPm9mZmVybXNnLmNoaWxkX3JlbGlkICYgMzEsCiAJCQkodW5zaWduZWQgbG9uZyAqKSBnVm1idXNDb25uZWN0aW9uLlNlbmRJbnRlcnJ1cHRQYWdlICsKLQkJCShjaGFubmVsLT5PZmZlck1zZy5DaGlsZFJlbElkID4+IDUpKTsKKwkJCShjaGFubmVsLT5vZmZlcm1zZy5jaGlsZF9yZWxpZCA+PiA1KSk7CiAKIAkJbW9uaXRvcnBhZ2UgPSBnVm1idXNDb25uZWN0aW9uLk1vbml0b3JQYWdlczsKIAkJbW9uaXRvcnBhZ2UrKzsgLyogR2V0IHRoZSBjaGlsZCB0byBwYXJlbnQgbW9uaXRvciBwYWdlICovCiAKLQkJc2V0X2JpdChjaGFubmVsLT5Nb25pdG9yQml0LAotCQkJKHVuc2lnbmVkIGxvbmcgKikmbW9uaXRvcnBhZ2UtPlRyaWdnZXJHcm91cAotCQkJCQlbY2hhbm5lbC0+TW9uaXRvckdyb3VwXS5QZW5kaW5nKTsKKwkJc2V0X2JpdChjaGFubmVsLT5tb25pdG9yX2JpdCwKKwkJCSh1bnNpZ25lZCBsb25nICopJm1vbml0b3JwYWdlLT50cmlnZ2VyX2dyb3VwCisJCQkJCVtjaGFubmVsLT5tb25pdG9yX2dycF0ucGVuZGluZyk7CiAKIAl9IGVsc2UgewotCQlWbWJ1c1NldEV2ZW50KGNoYW5uZWwtPk9mZmVyTXNnLkNoaWxkUmVsSWQpOworCQlWbWJ1c1NldEV2ZW50KGNoYW5uZWwtPm9mZmVybXNnLmNoaWxkX3JlbGlkKTsKIAl9CiB9CiAKQEAgLTk3LDE5ICs5NywxOSBAQAogewogCXN0cnVjdCBodl9tb25pdG9yX3BhZ2UgKm1vbml0b3JQYWdlOwogCi0JaWYgKENoYW5uZWwtPk9mZmVyTXNnLk1vbml0b3JBbGxvY2F0ZWQpIHsKKwlpZiAoQ2hhbm5lbC0+b2ZmZXJtc2cubW9uaXRvcl9hbGxvY2F0ZWQpIHsKIAkJLyogRWFjaCB1MzIgcmVwcmVzZW50cyAzMiBjaGFubmVscyAqLwotCQljbGVhcl9iaXQoQ2hhbm5lbC0+T2ZmZXJNc2cuQ2hpbGRSZWxJZCAmIDMxLAorCQljbGVhcl9iaXQoQ2hhbm5lbC0+b2ZmZXJtc2cuY2hpbGRfcmVsaWQgJiAzMSwKIAkJCSAgKHVuc2lnbmVkIGxvbmcgKilnVm1idXNDb25uZWN0aW9uLlNlbmRJbnRlcnJ1cHRQYWdlICsKLQkJCSAgKENoYW5uZWwtPk9mZmVyTXNnLkNoaWxkUmVsSWQgPj4gNSkpOworCQkJICAoQ2hhbm5lbC0+b2ZmZXJtc2cuY2hpbGRfcmVsaWQgPj4gNSkpOwogCiAJCW1vbml0b3JQYWdlID0KIAkJCShzdHJ1Y3QgaHZfbW9uaXRvcl9wYWdlICopZ1ZtYnVzQ29ubmVjdGlvbi5Nb25pdG9yUGFnZXM7CiAJCW1vbml0b3JQYWdlKys7IC8qIEdldCB0aGUgY2hpbGQgdG8gcGFyZW50IG1vbml0b3IgcGFnZSAqLwogCi0JCWNsZWFyX2JpdChDaGFubmVsLT5Nb25pdG9yQml0LAotCQkJICAodW5zaWduZWQgbG9uZyAqKSZtb25pdG9yUGFnZS0+VHJpZ2dlckdyb3VwCi0JCQkJCVtDaGFubmVsLT5Nb25pdG9yR3JvdXBdLlBlbmRpbmcpOworCQljbGVhcl9iaXQoQ2hhbm5lbC0+bW9uaXRvcl9iaXQsCisJCQkgICh1bnNpZ25lZCBsb25nICopJm1vbml0b3JQYWdlLT50cmlnZ2VyX2dyb3VwCisJCQkJCVtDaGFubmVsLT5tb25pdG9yX2dycF0uUGVuZGluZyk7CiAJfQogfQogCkBAIC0xMjEsNDIgKzEyMSw0MiBAQAogCQkJICAgICAgc3RydWN0IHZtYnVzX2NoYW5uZWxfZGVidWdfaW5mbyAqZGVidWdpbmZvKQogewogCXN0cnVjdCBodl9tb25pdG9yX3BhZ2UgKm1vbml0b3JwYWdlOwotCXU4IG1vbml0b3JfZ3JvdXAgPSAodTgpY2hhbm5lbC0+T2ZmZXJNc2cuTW9uaXRvcklkIC8gMzI7Ci0JdTggbW9uaXRvcl9vZmZzZXQgPSAodTgpY2hhbm5lbC0+T2ZmZXJNc2cuTW9uaXRvcklkICUgMzI7CisJdTggbW9uaXRvcl9ncm91cCA9ICh1OCljaGFubmVsLT5vZmZlcm1zZy5tb25pdG9yaWQgLyAzMjsKKwl1OCBtb25pdG9yX29mZnNldCA9ICh1OCljaGFubmVsLT5vZmZlcm1zZy5tb25pdG9yaWQgJSAzMjsKIAkvKiB1MzIgbW9uaXRvckJpdAk9IDEgPDwgbW9uaXRvck9mZnNldDsgKi8KIAotCWRlYnVnaW5mby0+UmVsSWQgPSBjaGFubmVsLT5PZmZlck1zZy5DaGlsZFJlbElkOwotCWRlYnVnaW5mby0+U3RhdGUgPSBjaGFubmVsLT5TdGF0ZTsKLQltZW1jcHkoJmRlYnVnaW5mby0+SW50ZXJmYWNlVHlwZSwKLQkgICAgICAgJmNoYW5uZWwtPk9mZmVyTXNnLk9mZmVyLkludGVyZmFjZVR5cGUsIHNpemVvZihzdHJ1Y3QgaHZfZ3VpZCkpOwotCW1lbWNweSgmZGVidWdpbmZvLT5JbnRlcmZhY2VJbnN0YW5jZSwKLQkgICAgICAgJmNoYW5uZWwtPk9mZmVyTXNnLk9mZmVyLkludGVyZmFjZUluc3RhbmNlLAorCWRlYnVnaW5mby0+cmVsaWQgPSBjaGFubmVsLT5vZmZlcm1zZy5jaGlsZF9yZWxpZDsKKwlkZWJ1Z2luZm8tPnN0YXRlID0gY2hhbm5lbC0+c3RhdGU7CisJbWVtY3B5KCZkZWJ1Z2luZm8tPmludGVyZmFjZXR5cGUsCisJICAgICAgICZjaGFubmVsLT5vZmZlcm1zZy5vZmZlci5JbnRlcmZhY2VUeXBlLCBzaXplb2Yoc3RydWN0IGh2X2d1aWQpKTsKKwltZW1jcHkoJmRlYnVnaW5mby0+aW50ZXJmYWNlX2luc3RhbmNlLAorCSAgICAgICAmY2hhbm5lbC0+b2ZmZXJtc2cub2ZmZXIuSW50ZXJmYWNlSW5zdGFuY2UsCiAJICAgICAgIHNpemVvZihzdHJ1Y3QgaHZfZ3VpZCkpOwogCiAJbW9uaXRvcnBhZ2UgPSAoc3RydWN0IGh2X21vbml0b3JfcGFnZSAqKWdWbWJ1c0Nvbm5lY3Rpb24uTW9uaXRvclBhZ2VzOwogCi0JZGVidWdpbmZvLT5Nb25pdG9ySWQgPSBjaGFubmVsLT5PZmZlck1zZy5Nb25pdG9ySWQ7CisJZGVidWdpbmZvLT5tb25pdG9yaWQgPSBjaGFubmVsLT5vZmZlcm1zZy5tb25pdG9yaWQ7CiAKLQlkZWJ1Z2luZm8tPlNlcnZlck1vbml0b3JQZW5kaW5nID0KLQkJCW1vbml0b3JwYWdlLT5UcmlnZ2VyR3JvdXBbbW9uaXRvcl9ncm91cF0uUGVuZGluZzsKLQlkZWJ1Z2luZm8tPlNlcnZlck1vbml0b3JMYXRlbmN5ID0KLQkJCW1vbml0b3JwYWdlLT5MYXRlbmN5W21vbml0b3JfZ3JvdXBdW21vbml0b3Jfb2Zmc2V0XTsKLQlkZWJ1Z2luZm8tPlNlcnZlck1vbml0b3JDb25uZWN0aW9uSWQgPQotCQkJbW9uaXRvcnBhZ2UtPlBhcmFtZXRlclttb25pdG9yX2dyb3VwXQotCQkJCQlbbW9uaXRvcl9vZmZzZXRdLkNvbm5lY3Rpb25JZC51LklkOworCWRlYnVnaW5mby0+c2VydmVybW9uaXRvcl9wZW5kaW5nID0KKwkJCW1vbml0b3JwYWdlLT50cmlnZ2VyX2dyb3VwW21vbml0b3JfZ3JvdXBdLnBlbmRpbmc7CisJZGVidWdpbmZvLT5zZXJ2ZXJtb25pdG9yX2xhdGVuY3kgPQorCQkJbW9uaXRvcnBhZ2UtPmxhdGVuY3lbbW9uaXRvcl9ncm91cF1bbW9uaXRvcl9vZmZzZXRdOworCWRlYnVnaW5mby0+c2VydmVybW9uaXRvcl9jb25uZWN0aW9uaWQgPQorCQkJbW9uaXRvcnBhZ2UtPnBhcmFtZXRlclttb25pdG9yX2dyb3VwXQorCQkJCQlbbW9uaXRvcl9vZmZzZXRdLmNvbm5lY3Rpb25pZC51LmlkOwogCiAJbW9uaXRvcnBhZ2UrKzsKIAotCWRlYnVnaW5mby0+Q2xpZW50TW9uaXRvclBlbmRpbmcgPQotCQkJbW9uaXRvcnBhZ2UtPlRyaWdnZXJHcm91cFttb25pdG9yX2dyb3VwXS5QZW5kaW5nOwotCWRlYnVnaW5mby0+Q2xpZW50TW9uaXRvckxhdGVuY3kgPQotCQkJbW9uaXRvcnBhZ2UtPkxhdGVuY3lbbW9uaXRvcl9ncm91cF1bbW9uaXRvcl9vZmZzZXRdOwotCWRlYnVnaW5mby0+Q2xpZW50TW9uaXRvckNvbm5lY3Rpb25JZCA9Ci0JCQltb25pdG9ycGFnZS0+UGFyYW1ldGVyW21vbml0b3JfZ3JvdXBdCi0JCQkJCVttb25pdG9yX29mZnNldF0uQ29ubmVjdGlvbklkLnUuSWQ7CisJZGVidWdpbmZvLT5jbGllbnRtb25pdG9yX3BlbmRpbmcgPQorCQkJbW9uaXRvcnBhZ2UtPnRyaWdnZXJfZ3JvdXBbbW9uaXRvcl9ncm91cF0ucGVuZGluZzsKKwlkZWJ1Z2luZm8tPmNsaWVudG1vbml0b3JfbGF0ZW5jeSA9CisJCQltb25pdG9ycGFnZS0+bGF0ZW5jeVttb25pdG9yX2dyb3VwXVttb25pdG9yX29mZnNldF07CisJZGVidWdpbmZvLT5jbGllbnRtb25pdG9yX2Nvbm5lY3Rpb25pZCA9CisJCQltb25pdG9ycGFnZS0+cGFyYW1ldGVyW21vbml0b3JfZ3JvdXBdCisJCQkJCVttb25pdG9yX29mZnNldF0uY29ubmVjdGlvbmlkLnUuaWQ7CiAKLQlSaW5nQnVmZmVyR2V0RGVidWdJbmZvKCZjaGFubmVsLT5JbmJvdW5kLCAmZGVidWdpbmZvLT5JbmJvdW5kKTsKLQlSaW5nQnVmZmVyR2V0RGVidWdJbmZvKCZjaGFubmVsLT5PdXRib3VuZCwgJmRlYnVnaW5mby0+T3V0Ym91bmQpOworCXJpbmdidWZmZXJfZ2V0X2RlYnVnaW5mbygmY2hhbm5lbC0+aW5ib3VuZCwgJmRlYnVnaW5mby0+aW5ib3VuZCk7CisJcmluZ2J1ZmZlcl9nZXRfZGVidWdpbmZvKCZjaGFubmVsLT5vdXRib3VuZCwgJmRlYnVnaW5mby0+b3V0Ym91bmQpOwogfQogCiAvKgpAQCAtMTc2LDExICsxNzYsMTEgQEAKIAkvKiBBU1NFUlQoIShTZW5kUmluZ0J1ZmZlclNpemUgJiAoUEFHRV9TSVpFIC0gMSkpKTsgKi8KIAkvKiBBU1NFUlQoIShSZWN2UmluZ0J1ZmZlclNpemUgJiAoUEFHRV9TSVpFIC0gMSkpKTsgKi8KIAotCW5ld2NoYW5uZWwtPk9uQ2hhbm5lbENhbGxiYWNrID0gb25jaGFubmVsY2FsbGJhY2s7Ci0JbmV3Y2hhbm5lbC0+Q2hhbm5lbENhbGxiYWNrQ29udGV4dCA9IGNvbnRleHQ7CisJbmV3Y2hhbm5lbC0+b25jaGFubmVsX2NhbGxiYWNrID0gb25jaGFubmVsY2FsbGJhY2s7CisJbmV3Y2hhbm5lbC0+Y2hhbm5lbF9jYWxsYmFja19jb250ZXh0ID0gY29udGV4dDsKIAogCS8qIEFsbG9jYXRlIHRoZSByaW5nIGJ1ZmZlciAqLwotCW91dCA9IG9zZF9QYWdlQWxsb2MoKHNlbmRfcmluZ2J1ZmZlcl9zaXplICsgcmVjdl9yaW5nYnVmZmVyX3NpemUpCisJb3V0ID0gb3NkX3BhZ2VfYWxsb2MoKHNlbmRfcmluZ2J1ZmZlcl9zaXplICsgcmVjdl9yaW5nYnVmZmVyX3NpemUpCiAJCQkgICAgID4+IFBBR0VfU0hJRlQpOwogCWlmICghb3V0KQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTE4OSwxNyArMTg5LDE3IEBACiAKIAlpbiA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKW91dCArIHNlbmRfcmluZ2J1ZmZlcl9zaXplKTsKIAotCW5ld2NoYW5uZWwtPlJpbmdCdWZmZXJQYWdlcyA9IG91dDsKLQluZXdjaGFubmVsLT5SaW5nQnVmZmVyUGFnZUNvdW50ID0gKHNlbmRfcmluZ2J1ZmZlcl9zaXplICsKKwluZXdjaGFubmVsLT5yaW5nYnVmZmVyX3BhZ2VzID0gb3V0OworCW5ld2NoYW5uZWwtPnJpbmdidWZmZXJfcGFnZWNvdW50ID0gKHNlbmRfcmluZ2J1ZmZlcl9zaXplICsKIAkJCQkJICAgcmVjdl9yaW5nYnVmZmVyX3NpemUpID4+IFBBR0VfU0hJRlQ7CiAKLQlyZXQgPSBSaW5nQnVmZmVySW5pdCgmbmV3Y2hhbm5lbC0+T3V0Ym91bmQsIG91dCwgc2VuZF9yaW5nYnVmZmVyX3NpemUpOworCXJldCA9IHJpbmdidWZmZXJfaW5pdCgmbmV3Y2hhbm5lbC0+b3V0Ym91bmQsIG91dCwgc2VuZF9yaW5nYnVmZmVyX3NpemUpOwogCWlmIChyZXQgIT0gMCkgewogCQllcnIgPSByZXQ7CiAJCWdvdG8gZXJyb3JvdXQ7CiAJfQogCi0JcmV0ID0gUmluZ0J1ZmZlckluaXQoJm5ld2NoYW5uZWwtPkluYm91bmQsIGluLCByZWN2X3JpbmdidWZmZXJfc2l6ZSk7CisJcmV0ID0gcmluZ2J1ZmZlcl9pbml0KCZuZXdjaGFubmVsLT5pbmJvdW5kLCBpbiwgcmVjdl9yaW5nYnVmZmVyX3NpemUpOwogCWlmIChyZXQgIT0gMCkgewogCQllcnIgPSByZXQ7CiAJCWdvdG8gZXJyb3JvdXQ7CkBAIC0yMTAsMTMgKzIxMCwxMyBAQAogCURQUklOVF9EQkcoVk1CVVMsICJFc3RhYmxpc2hpbmcgcmluZyBidWZmZXIncyBncGFkbCBmb3IgY2hhbm5lbCAlcC4uLiIsCiAJCSAgIG5ld2NoYW5uZWwpOwogCi0JbmV3Y2hhbm5lbC0+UmluZ0J1ZmZlckdwYWRsSGFuZGxlID0gMDsKKwluZXdjaGFubmVsLT5yaW5nYnVmZmVyX2dwYWRsaGFuZGxlID0gMDsKIAogCXJldCA9IHZtYnVzX2VzdGFibGlzaF9ncGFkbChuZXdjaGFubmVsLAotCQkJCQkgbmV3Y2hhbm5lbC0+T3V0Ym91bmQuUmluZ0J1ZmZlciwKKwkJCQkJIG5ld2NoYW5uZWwtPm91dGJvdW5kLnJpbmdfYnVmZmVyLAogCQkJCQkgc2VuZF9yaW5nYnVmZmVyX3NpemUgKwogCQkJCQkgcmVjdl9yaW5nYnVmZmVyX3NpemUsCi0JCQkJCSAmbmV3Y2hhbm5lbC0+UmluZ0J1ZmZlckdwYWRsSGFuZGxlKTsKKwkJCQkJICZuZXdjaGFubmVsLT5yaW5nYnVmZmVyX2dwYWRsaGFuZGxlKTsKIAogCWlmIChyZXQgIT0gMCkgewogCQllcnIgPSByZXQ7CkBAIC0yMjUsMTIgKzIyNSwxMiBAQAogCiAJRFBSSU5UX0RCRyhWTUJVUywgImNoYW5uZWwgJXAgPHJlbGlkICVkIGdwYWRsIDB4JXggc2VuZCByaW5nICVwICIKIAkJICAgInNpemUgJWQgcmVjdiByaW5nICVwIHNpemUgJWQsIGRvd25zdHJlYW1vZmZzZXQgJWQ+IiwKLQkJICAgbmV3Y2hhbm5lbCwgbmV3Y2hhbm5lbC0+T2ZmZXJNc2cuQ2hpbGRSZWxJZCwKLQkJICAgbmV3Y2hhbm5lbC0+UmluZ0J1ZmZlckdwYWRsSGFuZGxlLAotCQkgICBuZXdjaGFubmVsLT5PdXRib3VuZC5SaW5nQnVmZmVyLAotCQkgICBuZXdjaGFubmVsLT5PdXRib3VuZC5SaW5nU2l6ZSwKLQkJICAgbmV3Y2hhbm5lbC0+SW5ib3VuZC5SaW5nQnVmZmVyLAotCQkgICBuZXdjaGFubmVsLT5JbmJvdW5kLlJpbmdTaXplLAorCQkgICBuZXdjaGFubmVsLCBuZXdjaGFubmVsLT5vZmZlcm1zZy5jaGlsZF9yZWxpZCwKKwkJICAgbmV3Y2hhbm5lbC0+cmluZ2J1ZmZlcl9ncGFkbGhhbmRsZSwKKwkJICAgbmV3Y2hhbm5lbC0+b3V0Ym91bmQucmluZ19idWZmZXIsCisJCSAgIG5ld2NoYW5uZWwtPm91dGJvdW5kLnJpbmdfc2l6ZSwKKwkJICAgbmV3Y2hhbm5lbC0+aW5ib3VuZC5yaW5nX2J1ZmZlciwKKwkJICAgbmV3Y2hhbm5lbC0+aW5ib3VuZC5yaW5nX3NpemUsCiAJCSAgIHNlbmRfcmluZ2J1ZmZlcl9zaXplKTsKIAogCS8qIENyZWF0ZSBhbmQgaW5pdCB0aGUgY2hhbm5lbCBvcGVuIG1lc3NhZ2UgKi8KQEAgLTI0MiwyMCArMjQyLDIwIEBACiAJCWdvdG8gZXJyb3JvdXQ7CiAJfQogCi0Jb3BlbkluZm8tPldhaXRFdmVudCA9IG9zZF9XYWl0RXZlbnRDcmVhdGUoKTsKLQlpZiAoIW9wZW5JbmZvLT5XYWl0RXZlbnQpIHsKKwlvcGVuSW5mby0+d2FpdGV2ZW50ID0gb3NkX3dhaXRldmVudF9jcmVhdGUoKTsKKwlpZiAoIW9wZW5JbmZvLT53YWl0ZXZlbnQpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBlcnJvcm91dDsKIAl9CiAKLQlvcGVuTXNnID0gKHN0cnVjdCB2bWJ1c19jaGFubmVsX29wZW5fY2hhbm5lbCAqKW9wZW5JbmZvLT5Nc2c7Ci0Jb3Blbk1zZy0+SGVhZGVyLk1lc3NhZ2VUeXBlID0gQ2hhbm5lbE1lc3NhZ2VPcGVuQ2hhbm5lbDsKLQlvcGVuTXNnLT5PcGVuSWQgPSBuZXdjaGFubmVsLT5PZmZlck1zZy5DaGlsZFJlbElkOyAvKiBGSVhNRSAqLwotCW9wZW5Nc2ctPkNoaWxkUmVsSWQgPSBuZXdjaGFubmVsLT5PZmZlck1zZy5DaGlsZFJlbElkOwotCW9wZW5Nc2ctPlJpbmdCdWZmZXJHcGFkbEhhbmRsZSA9IG5ld2NoYW5uZWwtPlJpbmdCdWZmZXJHcGFkbEhhbmRsZTsKLQlvcGVuTXNnLT5Eb3duc3RyZWFtUmluZ0J1ZmZlclBhZ2VPZmZzZXQgPSBzZW5kX3JpbmdidWZmZXJfc2l6ZSA+PgorCW9wZW5Nc2cgPSAoc3RydWN0IHZtYnVzX2NoYW5uZWxfb3Blbl9jaGFubmVsICopb3BlbkluZm8tPm1zZzsKKwlvcGVuTXNnLT5oZWFkZXIubXNndHlwZSA9IENIQU5ORUxNU0dfT1BFTkNIQU5ORUw7CisJb3Blbk1zZy0+b3BlbmlkID0gbmV3Y2hhbm5lbC0+b2ZmZXJtc2cuY2hpbGRfcmVsaWQ7IC8qIEZJWE1FICovCisJb3Blbk1zZy0+Y2hpbGRfcmVsaWQgPSBuZXdjaGFubmVsLT5vZmZlcm1zZy5jaGlsZF9yZWxpZDsKKwlvcGVuTXNnLT5yaW5nYnVmZmVyX2dwYWRsaGFuZGxlID0gbmV3Y2hhbm5lbC0+cmluZ2J1ZmZlcl9ncGFkbGhhbmRsZTsKKwlvcGVuTXNnLT5kb3duc3RyZWFtX3JpbmdidWZmZXJfcGFnZW9mZnNldCA9IHNlbmRfcmluZ2J1ZmZlcl9zaXplID4+CiAJCQkJCQkgIFBBR0VfU0hJRlQ7Ci0Jb3Blbk1zZy0+U2VydmVyQ29udGV4dEFyZWFHcGFkbEhhbmRsZSA9IDA7IC8qIFRPRE8gKi8KKwlvcGVuTXNnLT5zZXJ2ZXJfY29udGV4dGFyZWFfZ3BhZGxoYW5kbGUgPSAwOyAvKiBUT0RPICovCiAKIAlpZiAodXNlcmRhdGFsZW4gPiBNQVhfVVNFUl9ERUZJTkVEX0JZVEVTKSB7CiAJCWVyciA9IC1FSU5WQUw7CkBAIC0yNjMsMTAgKzI2MywxMCBAQAogCX0KIAogCWlmICh1c2VyZGF0YWxlbikKLQkJbWVtY3B5KG9wZW5Nc2ctPlVzZXJEYXRhLCB1c2VyZGF0YSwgdXNlcmRhdGFsZW4pOworCQltZW1jcHkob3Blbk1zZy0+dXNlcmRhdGEsIHVzZXJkYXRhLCB1c2VyZGF0YWxlbik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZ1ZtYnVzQ29ubmVjdGlvbi5jaGFubmVsbXNnX2xvY2ssIGZsYWdzKTsKLQlsaXN0X2FkZF90YWlsKCZvcGVuSW5mby0+TXNnTGlzdEVudHJ5LAorCWxpc3RfYWRkX3RhaWwoJm9wZW5JbmZvLT5tc2dsaXN0ZW50cnksCiAJCSAgICAgICZnVm1idXNDb25uZWN0aW9uLkNoYW5uZWxNc2dMaXN0KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnVm1idXNDb25uZWN0aW9uLmNoYW5uZWxtc2dfbG9jaywgZmxhZ3MpOwogCkBAIC0yODAsMjcgKzI4MCwyNyBAQAogCX0KIAogCS8qIEZJWE1FOiBOZWVkIHRvIHRpbWUtb3V0IGhlcmUgKi8KLQlvc2RfV2FpdEV2ZW50V2FpdChvcGVuSW5mby0+V2FpdEV2ZW50KTsKKwlvc2Rfd2FpdGV2ZW50X3dhaXQob3BlbkluZm8tPndhaXRldmVudCk7CiAKLQlpZiAob3BlbkluZm8tPlJlc3BvbnNlLk9wZW5SZXN1bHQuU3RhdHVzID09IDApCisJaWYgKG9wZW5JbmZvLT5yZXNwb25zZS5vcGVuX3Jlc3VsdC5zdGF0dXMgPT0gMCkKIAkJRFBSSU5UX0lORk8oVk1CVVMsICJjaGFubmVsIDwlcD4gb3BlbiBzdWNjZXNzISEiLCBuZXdjaGFubmVsKTsKIAllbHNlCiAJCURQUklOVF9JTkZPKFZNQlVTLCAiY2hhbm5lbCA8JXA+IG9wZW4gZmFpbGVkIC0gJWQhISIsCi0JCQkgICAgbmV3Y2hhbm5lbCwgb3BlbkluZm8tPlJlc3BvbnNlLk9wZW5SZXN1bHQuU3RhdHVzKTsKKwkJCSAgICBuZXdjaGFubmVsLCBvcGVuSW5mby0+cmVzcG9uc2Uub3Blbl9yZXN1bHQuc3RhdHVzKTsKIAogQ2xlYW51cDoKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZ1ZtYnVzQ29ubmVjdGlvbi5jaGFubmVsbXNnX2xvY2ssIGZsYWdzKTsKLQlsaXN0X2RlbCgmb3BlbkluZm8tPk1zZ0xpc3RFbnRyeSk7CisJbGlzdF9kZWwoJm9wZW5JbmZvLT5tc2dsaXN0ZW50cnkpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdWbWJ1c0Nvbm5lY3Rpb24uY2hhbm5lbG1zZ19sb2NrLCBmbGFncyk7CiAKLQlrZnJlZShvcGVuSW5mby0+V2FpdEV2ZW50KTsKKwlrZnJlZShvcGVuSW5mby0+d2FpdGV2ZW50KTsKIAlrZnJlZShvcGVuSW5mbyk7CiAJcmV0dXJuIDA7CiAKIGVycm9yb3V0OgotCVJpbmdCdWZmZXJDbGVhbnVwKCZuZXdjaGFubmVsLT5PdXRib3VuZCk7Ci0JUmluZ0J1ZmZlckNsZWFudXAoJm5ld2NoYW5uZWwtPkluYm91bmQpOwotCW9zZF9QYWdlRnJlZShvdXQsIChzZW5kX3JpbmdidWZmZXJfc2l6ZSArIHJlY3ZfcmluZ2J1ZmZlcl9zaXplKQorCXJpbmdidWZmZXJfY2xlYW51cCgmbmV3Y2hhbm5lbC0+b3V0Ym91bmQpOworCXJpbmdidWZmZXJfY2xlYW51cCgmbmV3Y2hhbm5lbC0+aW5ib3VuZCk7CisJb3NkX3BhZ2VfZnJlZShvdXQsIChzZW5kX3JpbmdidWZmZXJfc2l6ZSArIHJlY3ZfcmluZ2J1ZmZlcl9zaXplKQogCQkgICAgID4+IFBBR0VfU0hJRlQpOwogCWtmcmVlKG9wZW5JbmZvKTsKIAlyZXR1cm4gZXJyOwpAQCAtMzIyLDcgKzMyMiw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgcGZuY291bnQ7IGkrKykKIAkJRFBSSU5UX0RCRyhWTUJVUywgImdwYWRsIGJvZHkgIC0gJWQpIHBmbiAlbGx1IiwKLQkJCSAgIGksIGdwYWRsLT5QZm5baV0pOworCQkJICAgaSwgZ3BhZGwtPnBmbltpXSk7CiB9CiAKIC8qCkBAIC0zMzYsMTggKzMzNiwxOCBAQAogCiAJRFBSSU5UX0RCRyhWTUJVUywKIAkJICAgImdwYWRsIGhlYWRlciAtIHJlbGlkICVkLCByYW5nZSBjb3VudCAlZCwgcmFuZ2UgYnVmbGVuICVkIiwKLQkJICAgZ3BhZGwtPkNoaWxkUmVsSWQsIGdwYWRsLT5SYW5nZUNvdW50LCBncGFkbC0+UmFuZ2VCdWZMZW4pOwotCWZvciAoaSA9IDA7IGkgPCBncGFkbC0+UmFuZ2VDb3VudDsgaSsrKSB7Ci0JCXBhZ2Vjb3VudCA9IGdwYWRsLT5SYW5nZVtpXS5CeXRlQ291bnQgPj4gUEFHRV9TSElGVDsKKwkJICAgZ3BhZGwtPmNoaWxkX3JlbGlkLCBncGFkbC0+cmFuZ2Vjb3VudCwgZ3BhZGwtPnJhbmdlX2J1Zmxlbik7CisJZm9yIChpID0gMDsgaSA8IGdwYWRsLT5yYW5nZWNvdW50OyBpKyspIHsKKwkJcGFnZWNvdW50ID0gZ3BhZGwtPnJhbmdlW2ldLkJ5dGVDb3VudCA+PiBQQUdFX1NISUZUOwogCQlwYWdlY291bnQgPSAocGFnZWNvdW50ID4gMjYpID8gMjYgOiBwYWdlY291bnQ7CiAKIAkJRFBSSU5UX0RCRyhWTUJVUywgImdwYWRsIHJhbmdlICVkIC0gbGVuICVkIG9mZnNldCAlZCAiCi0JCQkgICAicGFnZSBjb3VudCAlZCIsIGksIGdwYWRsLT5SYW5nZVtpXS5CeXRlQ291bnQsCi0JCQkgICBncGFkbC0+UmFuZ2VbaV0uQnl0ZU9mZnNldCwgcGFnZWNvdW50KTsKKwkJCSAgICJwYWdlIGNvdW50ICVkIiwgaSwgZ3BhZGwtPnJhbmdlW2ldLkJ5dGVDb3VudCwKKwkJCSAgIGdwYWRsLT5yYW5nZVtpXS5CeXRlT2Zmc2V0LCBwYWdlY291bnQpOwogCiAJCWZvciAoaiA9IDA7IGogPCBwYWdlY291bnQ7IGorKykKIAkJCURQUklOVF9EQkcoVk1CVVMsICIlZCkgcGZuICVsbHUiLCBqLAotCQkJCSAgIGdwYWRsLT5SYW5nZVtpXS5QZm5BcnJheVtqXSk7CisJCQkJICAgZ3BhZGwtPnJhbmdlW2ldLlBmbkFycmF5W2pdKTsKIAl9CiB9CiAKQEAgLTM5MSwxOCArMzkxLDE4IEBACiAJCWlmICghbXNnaGVhZGVyKQogCQkJZ290byBub21lbTsKIAotCQlJTklUX0xJU1RfSEVBRCgmbXNnaGVhZGVyLT5TdWJNc2dMaXN0KTsKLQkJbXNnaGVhZGVyLT5NZXNzYWdlU2l6ZSA9IG1zZ3NpemU7CisJCUlOSVRfTElTVF9IRUFEKCZtc2doZWFkZXItPnN1Ym1zZ2xpc3QpOworCQltc2doZWFkZXItPm1zZ3NpemUgPSBtc2dzaXplOwogCiAJCWdwYWRsX2hlYWRlciA9IChzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9ncGFkbF9oZWFkZXIgKikKLQkJCW1zZ2hlYWRlci0+TXNnOwotCQlncGFkbF9oZWFkZXItPlJhbmdlQ291bnQgPSAxOwotCQlncGFkbF9oZWFkZXItPlJhbmdlQnVmTGVuID0gc2l6ZW9mKHN0cnVjdCBncGFfcmFuZ2UpICsKKwkJCW1zZ2hlYWRlci0+bXNnOworCQlncGFkbF9oZWFkZXItPnJhbmdlY291bnQgPSAxOworCQlncGFkbF9oZWFkZXItPnJhbmdlX2J1ZmxlbiA9IHNpemVvZihzdHJ1Y3QgZ3BhX3JhbmdlKSArCiAJCQkJCSBwYWdlY291bnQgKiBzaXplb2YodTY0KTsKLQkJZ3BhZGxfaGVhZGVyLT5SYW5nZVswXS5CeXRlT2Zmc2V0ID0gMDsKLQkJZ3BhZGxfaGVhZGVyLT5SYW5nZVswXS5CeXRlQ291bnQgPSBzaXplOworCQlncGFkbF9oZWFkZXItPnJhbmdlWzBdLkJ5dGVPZmZzZXQgPSAwOworCQlncGFkbF9oZWFkZXItPnJhbmdlWzBdLkJ5dGVDb3VudCA9IHNpemU7CiAJCWZvciAoaSA9IDA7IGkgPCBwZm5jb3VudDsgaSsrKQotCQkJZ3BhZGxfaGVhZGVyLT5SYW5nZVswXS5QZm5BcnJheVtpXSA9IHBmbitpOworCQkJZ3BhZGxfaGVhZGVyLT5yYW5nZVswXS5QZm5BcnJheVtpXSA9IHBmbitpOwogCQkqbXNnaW5mbyA9IG1zZ2hlYWRlcjsKIAkJKm1lc3NhZ2Vjb3VudCA9IDE7CiAKQEAgLTQyOCwxMCArNDI4LDEwIEBACiAJCQkvKiBGSVhNRTogd2UgcHJvYmFibHkgbmVlZCB0byBtb3JlIGlmIHRoaXMgZmFpbHMgKi8KIAkJCWlmICghbXNnYm9keSkKIAkJCQlnb3RvIG5vbWVtOwotCQkJbXNnYm9keS0+TWVzc2FnZVNpemUgPSBtc2dzaXplOworCQkJbXNnYm9keS0+bXNnc2l6ZSA9IG1zZ3NpemU7CiAJCQkoKm1lc3NhZ2Vjb3VudCkrKzsKIAkJCWdwYWRsX2JvZHkgPQotCQkJCShzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9ncGFkbF9ib2R5ICopbXNnYm9keS0+TXNnOworCQkJCShzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9ncGFkbF9ib2R5ICopbXNnYm9keS0+bXNnOwogCiAJCQkvKgogCQkJICogRklYTUU6CkBAIC00NDAsMTEgKzQ0MCwxMSBAQAogCQkJICovCiAJCQkvKiBncGFkbF9ib2R5LT5HcGFkbCA9IGtidWZmZXI7ICovCiAJCQlmb3IgKGkgPSAwOyBpIDwgcGZuY3VycjsgaSsrKQotCQkJCWdwYWRsX2JvZHktPlBmbltpXSA9IHBmbiArIHBmbnN1bSArIGk7CisJCQkJZ3BhZGxfYm9keS0+cGZuW2ldID0gcGZuICsgcGZuc3VtICsgaTsKIAogCQkJLyogYWRkIHRvIG1zZyBoZWFkZXIgKi8KLQkJCWxpc3RfYWRkX3RhaWwoJm1zZ2JvZHktPk1zZ0xpc3RFbnRyeSwKLQkJCQkgICAgICAmbXNnaGVhZGVyLT5TdWJNc2dMaXN0KTsKKwkJCWxpc3RfYWRkX3RhaWwoJm1zZ2JvZHktPm1zZ2xpc3RlbnRyeSwKKwkJCQkgICAgICAmbXNnaGVhZGVyLT5zdWJtc2dsaXN0KTsKIAkJCXBmbnN1bSArPSBwZm5jdXJyOwogCQkJcGZubGVmdCAtPSBwZm5jdXJyOwogCQl9CkBAIC00NTYsMTcgKzQ1NiwxNyBAQAogCQltc2doZWFkZXIgPSBremFsbG9jKG1zZ3NpemUsIEdGUF9LRVJORUwpOwogCQlpZiAobXNnaGVhZGVyID09IE5VTEwpCiAJCQlnb3RvIG5vbWVtOwotCQltc2doZWFkZXItPk1lc3NhZ2VTaXplID0gbXNnc2l6ZTsKKwkJbXNnaGVhZGVyLT5tc2dzaXplID0gbXNnc2l6ZTsKIAogCQlncGFkbF9oZWFkZXIgPSAoc3RydWN0IHZtYnVzX2NoYW5uZWxfZ3BhZGxfaGVhZGVyICopCi0JCQltc2doZWFkZXItPk1zZzsKLQkJZ3BhZGxfaGVhZGVyLT5SYW5nZUNvdW50ID0gMTsKLQkJZ3BhZGxfaGVhZGVyLT5SYW5nZUJ1ZkxlbiA9IHNpemVvZihzdHJ1Y3QgZ3BhX3JhbmdlKSArCisJCQltc2doZWFkZXItPm1zZzsKKwkJZ3BhZGxfaGVhZGVyLT5yYW5nZWNvdW50ID0gMTsKKwkJZ3BhZGxfaGVhZGVyLT5yYW5nZV9idWZsZW4gPSBzaXplb2Yoc3RydWN0IGdwYV9yYW5nZSkgKwogCQkJCQkgcGFnZWNvdW50ICogc2l6ZW9mKHU2NCk7Ci0JCWdwYWRsX2hlYWRlci0+UmFuZ2VbMF0uQnl0ZU9mZnNldCA9IDA7Ci0JCWdwYWRsX2hlYWRlci0+UmFuZ2VbMF0uQnl0ZUNvdW50ID0gc2l6ZTsKKwkJZ3BhZGxfaGVhZGVyLT5yYW5nZVswXS5CeXRlT2Zmc2V0ID0gMDsKKwkJZ3BhZGxfaGVhZGVyLT5yYW5nZVswXS5CeXRlQ291bnQgPSBzaXplOwogCQlmb3IgKGkgPSAwOyBpIDwgcGFnZWNvdW50OyBpKyspCi0JCQlncGFkbF9oZWFkZXItPlJhbmdlWzBdLlBmbkFycmF5W2ldID0gcGZuK2k7CisJCQlncGFkbF9oZWFkZXItPnJhbmdlWzBdLlBmbkFycmF5W2ldID0gcGZuK2k7CiAKIAkJKm1zZ2luZm8gPSBtc2doZWFkZXI7CiAJCSptZXNzYWdlY291bnQgPSAxOwpAQCAtNTA4LDIxICs1MDgsMjEgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JbXNnaW5mby0+V2FpdEV2ZW50ID0gb3NkX1dhaXRFdmVudENyZWF0ZSgpOwotCWlmICghbXNnaW5mby0+V2FpdEV2ZW50KSB7CisJbXNnaW5mby0+d2FpdGV2ZW50ID0gb3NkX3dhaXRldmVudF9jcmVhdGUoKTsKKwlpZiAoIW1zZ2luZm8tPndhaXRldmVudCkgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIENsZWFudXA7CiAJfQogCi0JZ3BhZGxtc2cgPSAoc3RydWN0IHZtYnVzX2NoYW5uZWxfZ3BhZGxfaGVhZGVyICopbXNnaW5mby0+TXNnOwotCWdwYWRsbXNnLT5IZWFkZXIuTWVzc2FnZVR5cGUgPSBDaGFubmVsTWVzc2FnZUdwYWRsSGVhZGVyOwotCWdwYWRsbXNnLT5DaGlsZFJlbElkID0gY2hhbm5lbC0+T2ZmZXJNc2cuQ2hpbGRSZWxJZDsKLQlncGFkbG1zZy0+R3BhZGwgPSBuZXh0X2dwYWRsX2hhbmRsZTsKKwlncGFkbG1zZyA9IChzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9ncGFkbF9oZWFkZXIgKiltc2dpbmZvLT5tc2c7CisJZ3BhZGxtc2ctPmhlYWRlci5tc2d0eXBlID0gQ0hBTk5FTE1TR19HUEFETF9IRUFERVI7CisJZ3BhZGxtc2ctPmNoaWxkX3JlbGlkID0gY2hhbm5lbC0+b2ZmZXJtc2cuY2hpbGRfcmVsaWQ7CisJZ3BhZGxtc2ctPmdwYWRsID0gbmV4dF9ncGFkbF9oYW5kbGU7CiAKIAlkdW1wX2dwYWRsX2hlYWRlcihncGFkbG1zZyk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZ1ZtYnVzQ29ubmVjdGlvbi5jaGFubmVsbXNnX2xvY2ssIGZsYWdzKTsKLQlsaXN0X2FkZF90YWlsKCZtc2dpbmZvLT5Nc2dMaXN0RW50cnksCisJbGlzdF9hZGRfdGFpbCgmbXNnaW5mby0+bXNnbGlzdGVudHJ5LAogCQkgICAgICAmZ1ZtYnVzQ29ubmVjdGlvbi5DaGFubmVsTXNnTGlzdCk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnVm1idXNDb25uZWN0aW9uLmNoYW5uZWxtc2dfbG9jaywgZmxhZ3MpOwpAQCAtNTMwLDkgKzUzMCw5IEBACiAJCSAgIGtidWZmZXIsIHNpemUsIG1zZ2NvdW50KTsKIAogCURQUklOVF9EQkcoVk1CVVMsICJTZW5kaW5nIEdQQURMIEhlYWRlciAtIGxlbiAlemQiLAotCQkgICBtc2dpbmZvLT5NZXNzYWdlU2l6ZSAtIHNpemVvZigqbXNnaW5mbykpOworCQkgICBtc2dpbmZvLT5tc2dzaXplIC0gc2l6ZW9mKCptc2dpbmZvKSk7CiAKLQlyZXQgPSBWbWJ1c1Bvc3RNZXNzYWdlKGdwYWRsbXNnLCBtc2dpbmZvLT5NZXNzYWdlU2l6ZSAtCisJcmV0ID0gVm1idXNQb3N0TWVzc2FnZShncGFkbG1zZywgbXNnaW5mby0+bXNnc2l6ZSAtCiAJCQkgICAgICAgc2l6ZW9mKCptc2dpbmZvKSk7CiAJaWYgKHJldCAhPSAwKSB7CiAJCURQUklOVF9FUlIoVk1CVVMsICJVbmFibGUgdG8gb3BlbiBjaGFubmVsIC0gJWQiLCByZXQpOwpAQCAtNTQwLDQ4ICs1NDAsNDggQEAKIAl9CiAKIAlpZiAobXNnY291bnQgPiAxKSB7Ci0JCWxpc3RfZm9yX2VhY2goY3VyciwgJm1zZ2luZm8tPlN1Yk1zZ0xpc3QpIHsKKwkJbGlzdF9mb3JfZWFjaChjdXJyLCAmbXNnaW5mby0+c3VibXNnbGlzdCkgewogCiAJCQkvKiBGSVhNRTogc2hvdWxkIHRoaXMgdXNlIGxpc3RfZW50cnkoKSBpbnN0ZWFkID8gKi8KIAkJCXN1Ym1zZ2luZm8gPSAoc3RydWN0IHZtYnVzX2NoYW5uZWxfbXNnaW5mbyAqKWN1cnI7CiAJCQlncGFkbF9ib2R5ID0KLQkJCSAgICAgKHN0cnVjdCB2bWJ1c19jaGFubmVsX2dwYWRsX2JvZHkgKilzdWJtc2dpbmZvLT5Nc2c7CisJCQkgICAgIChzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9ncGFkbF9ib2R5ICopc3VibXNnaW5mby0+bXNnOwogCi0JCQlncGFkbF9ib2R5LT5IZWFkZXIuTWVzc2FnZVR5cGUgPQotCQkJCUNoYW5uZWxNZXNzYWdlR3BhZGxCb2R5OwotCQkJZ3BhZGxfYm9keS0+R3BhZGwgPSBuZXh0X2dwYWRsX2hhbmRsZTsKKwkJCWdwYWRsX2JvZHktPmhlYWRlci5tc2d0eXBlID0KKwkJCQlDSEFOTkVMTVNHX0dQQURMX0JPRFk7CisJCQlncGFkbF9ib2R5LT5ncGFkbCA9IG5leHRfZ3BhZGxfaGFuZGxlOwogCiAJCQlEUFJJTlRfREJHKFZNQlVTLCAiU2VuZGluZyBHUEFETCBCb2R5IC0gbGVuICV6ZCIsCi0JCQkJICAgc3VibXNnaW5mby0+TWVzc2FnZVNpemUgLQorCQkJCSAgIHN1Ym1zZ2luZm8tPm1zZ3NpemUgLQogCQkJCSAgIHNpemVvZigqc3VibXNnaW5mbykpOwogCi0JCQlkdW1wX2dwYWRsX2JvZHkoZ3BhZGxfYm9keSwgc3VibXNnaW5mby0+TWVzc2FnZVNpemUgLQorCQkJZHVtcF9ncGFkbF9ib2R5KGdwYWRsX2JvZHksIHN1Ym1zZ2luZm8tPm1zZ3NpemUgLQogCQkJCSAgICAgIHNpemVvZigqc3VibXNnaW5mbykpOwogCQkJcmV0ID0gVm1idXNQb3N0TWVzc2FnZShncGFkbF9ib2R5LAotCQkJCQkgICAgICAgc3VibXNnaW5mby0+TWVzc2FnZVNpemUgLQorCQkJCQkgICAgICAgc3VibXNnaW5mby0+bXNnc2l6ZSAtCiAJCQkJCSAgICAgICBzaXplb2YoKnN1Ym1zZ2luZm8pKTsKIAkJCWlmIChyZXQgIT0gMCkKIAkJCQlnb3RvIENsZWFudXA7CiAKIAkJfQogCX0KLQlvc2RfV2FpdEV2ZW50V2FpdChtc2dpbmZvLT5XYWl0RXZlbnQpOworCW9zZF93YWl0ZXZlbnRfd2FpdChtc2dpbmZvLT53YWl0ZXZlbnQpOwogCiAJLyogQXQgdGhpcyBwb2ludCwgd2UgcmVjZWl2ZWQgdGhlIGdwYWRsIGNyZWF0ZWQgbXNnICovCiAJRFBSSU5UX0RCRyhWTUJVUywgIlJlY2VpdmVkIEdQQURMIGNyZWF0ZWQgIgogCQkgICAiKHJlbGlkICVkLCBzdGF0dXMgJWQgaGFuZGxlICV4KSIsCi0JCSAgIGNoYW5uZWwtPk9mZmVyTXNnLkNoaWxkUmVsSWQsCi0JCSAgIG1zZ2luZm8tPlJlc3BvbnNlLkdwYWRsQ3JlYXRlZC5DcmVhdGlvblN0YXR1cywKLQkJICAgZ3BhZGxtc2ctPkdwYWRsKTsKKwkJICAgY2hhbm5lbC0+b2ZmZXJtc2cuY2hpbGRfcmVsaWQsCisJCSAgIG1zZ2luZm8tPnJlc3BvbnNlLmdwYWRsX2NyZWF0ZWQuY3JlYXRpb25fc3RhdHVzLAorCQkgICBncGFkbG1zZy0+Z3BhZGwpOwogCi0JKmdwYWRsX2hhbmRsZSA9IGdwYWRsbXNnLT5HcGFkbDsKKwkqZ3BhZGxfaGFuZGxlID0gZ3BhZGxtc2ctPmdwYWRsOwogCiBDbGVhbnVwOgogCXNwaW5fbG9ja19pcnFzYXZlKCZnVm1idXNDb25uZWN0aW9uLmNoYW5uZWxtc2dfbG9jaywgZmxhZ3MpOwotCWxpc3RfZGVsKCZtc2dpbmZvLT5Nc2dMaXN0RW50cnkpOworCWxpc3RfZGVsKCZtc2dpbmZvLT5tc2dsaXN0ZW50cnkpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdWbWJ1c0Nvbm5lY3Rpb24uY2hhbm5lbG1zZ19sb2NrLCBmbGFncyk7CiAKLQlrZnJlZShtc2dpbmZvLT5XYWl0RXZlbnQpOworCWtmcmVlKG1zZ2luZm8tPndhaXRldmVudCk7CiAJa2ZyZWUobXNnaW5mbyk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTYwNCwyMCArNjA0LDIwIEBACiAJaWYgKCFpbmZvKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWluZm8tPldhaXRFdmVudCA9IG9zZF9XYWl0RXZlbnRDcmVhdGUoKTsKLQlpZiAoIWluZm8tPldhaXRFdmVudCkgeworCWluZm8tPndhaXRldmVudCA9IG9zZF93YWl0ZXZlbnRfY3JlYXRlKCk7CisJaWYgKCFpbmZvLT53YWl0ZXZlbnQpIHsKIAkJa2ZyZWUoaW5mbyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCW1zZyA9IChzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9ncGFkbF90ZWFyZG93biAqKWluZm8tPk1zZzsKKwltc2cgPSAoc3RydWN0IHZtYnVzX2NoYW5uZWxfZ3BhZGxfdGVhcmRvd24gKilpbmZvLT5tc2c7CiAKLQltc2ctPkhlYWRlci5NZXNzYWdlVHlwZSA9IENoYW5uZWxNZXNzYWdlR3BhZGxUZWFyZG93bjsKLQltc2ctPkNoaWxkUmVsSWQgPSBjaGFubmVsLT5PZmZlck1zZy5DaGlsZFJlbElkOwotCW1zZy0+R3BhZGwgPSBncGFkbF9oYW5kbGU7CisJbXNnLT5oZWFkZXIubXNndHlwZSA9IENIQU5ORUxNU0dfR1BBRExfVEVBUkRPV047CisJbXNnLT5jaGlsZF9yZWxpZCA9IGNoYW5uZWwtPm9mZmVybXNnLmNoaWxkX3JlbGlkOworCW1zZy0+Z3BhZGwgPSBncGFkbF9oYW5kbGU7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZ1ZtYnVzQ29ubmVjdGlvbi5jaGFubmVsbXNnX2xvY2ssIGZsYWdzKTsKLQlsaXN0X2FkZF90YWlsKCZpbmZvLT5Nc2dMaXN0RW50cnksCisJbGlzdF9hZGRfdGFpbCgmaW5mby0+bXNnbGlzdGVudHJ5LAogCQkgICAgICAmZ1ZtYnVzQ29ubmVjdGlvbi5DaGFubmVsTXNnTGlzdCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ1ZtYnVzQ29ubmVjdGlvbi5jaGFubmVsbXNnX2xvY2ssIGZsYWdzKTsKIApAQCAtNjI4LDE0ICs2MjgsMTQgQEAKIAkJLyogc29tZXRoaW5nLi4uICovCiAJfQogCi0Jb3NkX1dhaXRFdmVudFdhaXQoaW5mby0+V2FpdEV2ZW50KTsKKwlvc2Rfd2FpdGV2ZW50X3dhaXQoaW5mby0+d2FpdGV2ZW50KTsKIAogCS8qIFJlY2VpdmVkIGEgdG9ybmRvd24gcmVzcG9uc2UgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZ1ZtYnVzQ29ubmVjdGlvbi5jaGFubmVsbXNnX2xvY2ssIGZsYWdzKTsKLQlsaXN0X2RlbCgmaW5mby0+TXNnTGlzdEVudHJ5KTsKKwlsaXN0X2RlbCgmaW5mby0+bXNnbGlzdGVudHJ5KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnVm1idXNDb25uZWN0aW9uLmNoYW5uZWxtc2dfbG9jaywgZmxhZ3MpOwogCi0Ja2ZyZWUoaW5mby0+V2FpdEV2ZW50KTsKKwlrZnJlZShpbmZvLT53YWl0ZXZlbnQpOwogCWtmcmVlKGluZm8pOwogCXJldHVybiByZXQ7CiB9CkBAIC02NTIsNyArNjUyLDcgQEAKIAlpbnQgcmV0OwogCiAJLyogU3RvcCBjYWxsYmFjayBhbmQgY2FuY2VsIHRoZSB0aW1lciBhc2FwICovCi0JY2hhbm5lbC0+T25DaGFubmVsQ2FsbGJhY2sgPSBOVUxMOworCWNoYW5uZWwtPm9uY2hhbm5lbF9jYWxsYmFjayA9IE5VTEw7CiAJZGVsX3RpbWVyX3N5bmMoJmNoYW5uZWwtPnBvbGxfdGltZXIpOwogCiAJLyogU2VuZCBhIGNsb3NpbmcgbWVzc2FnZSAqLwpAQCAtNjYzLDExICs2NjMsMTEgQEAKIAlpZiAoIWluZm8pCiAJCXJldHVybjsKIAotCS8qIGluZm8tPndhaXRFdmVudCA9IG9zZF9XYWl0RXZlbnRDcmVhdGUoKTsgKi8KKwkvKiBpbmZvLT53YWl0RXZlbnQgPSBvc2Rfd2FpdGV2ZW50X2NyZWF0ZSgpOyAqLwogCi0JbXNnID0gKHN0cnVjdCB2bWJ1c19jaGFubmVsX2Nsb3NlX2NoYW5uZWwgKilpbmZvLT5Nc2c7Ci0JbXNnLT5IZWFkZXIuTWVzc2FnZVR5cGUgPSBDaGFubmVsTWVzc2FnZUNsb3NlQ2hhbm5lbDsKLQltc2ctPkNoaWxkUmVsSWQgPSBjaGFubmVsLT5PZmZlck1zZy5DaGlsZFJlbElkOworCW1zZyA9IChzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9jbG9zZV9jaGFubmVsICopaW5mby0+bXNnOworCW1zZy0+aGVhZGVyLm1zZ3R5cGUgPSBDSEFOTkVMTVNHX0NMT1NFQ0hBTk5FTDsKKwltc2ctPmNoaWxkX3JlbGlkID0gY2hhbm5lbC0+b2ZmZXJtc2cuY2hpbGRfcmVsaWQ7CiAKIAlyZXQgPSBWbWJ1c1Bvc3RNZXNzYWdlKG1zZywgc2l6ZW9mKHN0cnVjdCB2bWJ1c19jaGFubmVsX2Nsb3NlX2NoYW5uZWwpKTsKIAlpZiAocmV0ICE9IDApIHsKQEAgLTY3NiwxNyArNjc2LDE3IEBACiAJfQogCiAJLyogVGVhciBkb3duIHRoZSBncGFkbCBmb3IgdGhlIGNoYW5uZWwncyByaW5nIGJ1ZmZlciAqLwotCWlmIChjaGFubmVsLT5SaW5nQnVmZmVyR3BhZGxIYW5kbGUpCisJaWYgKGNoYW5uZWwtPnJpbmdidWZmZXJfZ3BhZGxoYW5kbGUpCiAJCXZtYnVzX3RlYXJkb3duX2dwYWRsKGNoYW5uZWwsCi0JCQkJCSAgY2hhbm5lbC0+UmluZ0J1ZmZlckdwYWRsSGFuZGxlKTsKKwkJCQkJICBjaGFubmVsLT5yaW5nYnVmZmVyX2dwYWRsaGFuZGxlKTsKIAogCS8qIFRPRE86IFNlbmQgYSBtc2cgdG8gcmVsZWFzZSB0aGUgY2hpbGRSZWxJZCAqLwogCiAJLyogQ2xlYW51cCB0aGUgcmluZyBidWZmZXJzIGZvciB0aGlzIGNoYW5uZWwgKi8KLQlSaW5nQnVmZmVyQ2xlYW51cCgmY2hhbm5lbC0+T3V0Ym91bmQpOwotCVJpbmdCdWZmZXJDbGVhbnVwKCZjaGFubmVsLT5JbmJvdW5kKTsKKwlyaW5nYnVmZmVyX2NsZWFudXAoJmNoYW5uZWwtPm91dGJvdW5kKTsKKwlyaW5nYnVmZmVyX2NsZWFudXAoJmNoYW5uZWwtPmluYm91bmQpOwogCi0Jb3NkX1BhZ2VGcmVlKGNoYW5uZWwtPlJpbmdCdWZmZXJQYWdlcywgY2hhbm5lbC0+UmluZ0J1ZmZlclBhZ2VDb3VudCk7CisJb3NkX3BhZ2VfZnJlZShjaGFubmVsLT5yaW5nYnVmZmVyX3BhZ2VzLCBjaGFubmVsLT5yaW5nYnVmZmVyX3BhZ2Vjb3VudCk7CiAKIAlrZnJlZShpbmZvKTsKIApAQCAtNjk2LDkgKzY5Niw5IEBACiAJICogY2FsbGVyIHdpbGwgZnJlZSB0aGUgY2hhbm5lbAogCSAqLwogCi0JaWYgKGNoYW5uZWwtPlN0YXRlID09IENIQU5ORUxfT1BFTl9TVEFURSkgeworCWlmIChjaGFubmVsLT5zdGF0ZSA9PSBDSEFOTkVMX09QRU5fU1RBVEUpIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmdWbWJ1c0Nvbm5lY3Rpb24uY2hhbm5lbF9sb2NrLCBmbGFncyk7Ci0JCWxpc3RfZGVsKCZjaGFubmVsLT5MaXN0RW50cnkpOworCQlsaXN0X2RlbCgmY2hhbm5lbC0+bGlzdGVudHJ5KTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ1ZtYnVzQ29ubmVjdGlvbi5jaGFubmVsX2xvY2ssIGZsYWdzKTsKIAogCQlmcmVlX2NoYW5uZWwoY2hhbm5lbCk7CkBAIC03NTIsMTAgKzc1MiwxMCBAQAogCXNnX3NldF9idWYoJmJ1ZmZlcmxpc3RbMl0sICZhbGlnbmVkX2RhdGEsCiAJCSAgIHBhY2tldGxlbl9hbGlnbmVkIC0gcGFja2V0bGVuKTsKIAotCXJldCA9IFJpbmdCdWZmZXJXcml0ZSgmY2hhbm5lbC0+T3V0Ym91bmQsIGJ1ZmZlcmxpc3QsIDMpOworCXJldCA9IHJpbmdidWZmZXJfd3JpdGUoJmNoYW5uZWwtPm91dGJvdW5kLCBidWZmZXJsaXN0LCAzKTsKIAogCS8qIFRPRE86IFdlIHNob3VsZCBkZXRlcm1pbmUgaWYgdGhpcyBpcyBvcHRpb25hbCAqLwotCWlmIChyZXQgPT0gMCAmJiAhR2V0UmluZ0J1ZmZlckludGVycnVwdE1hc2soJmNoYW5uZWwtPk91dGJvdW5kKSkKKwlpZiAocmV0ID09IDAgJiYgIWdldF9yaW5nYnVmZmVyX2ludGVycnVwdF9tYXNrKCZjaGFubmVsLT5vdXRib3VuZCkpCiAJCXZtYnVzX3NldGV2ZW50KGNoYW5uZWwpOwogCiAJcmV0dXJuIHJldDsKQEAgLTgxNywxMCArODE3LDEwIEBACiAJc2dfc2V0X2J1ZigmYnVmZmVybGlzdFsyXSwgJmFsaWduZWRfZGF0YSwKIAkJcGFja2V0bGVuX2FsaWduZWQgLSBwYWNrZXRsZW4pOwogCi0JcmV0ID0gUmluZ0J1ZmZlcldyaXRlKCZjaGFubmVsLT5PdXRib3VuZCwgYnVmZmVybGlzdCwgMyk7CisJcmV0ID0gcmluZ2J1ZmZlcl93cml0ZSgmY2hhbm5lbC0+b3V0Ym91bmQsIGJ1ZmZlcmxpc3QsIDMpOwogCiAJLyogVE9ETzogV2Ugc2hvdWxkIGRldGVybWluZSBpZiB0aGlzIGlzIG9wdGlvbmFsICovCi0JaWYgKHJldCA9PSAwICYmICFHZXRSaW5nQnVmZmVySW50ZXJydXB0TWFzaygmY2hhbm5lbC0+T3V0Ym91bmQpKQorCWlmIChyZXQgPT0gMCAmJiAhZ2V0X3JpbmdidWZmZXJfaW50ZXJydXB0X21hc2soJmNoYW5uZWwtPm91dGJvdW5kKSkKIAkJdm1idXNfc2V0ZXZlbnQoY2hhbm5lbCk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtODg2LDEwICs4ODYsMTAgQEAKIAlzZ19zZXRfYnVmKCZidWZmZXJsaXN0WzJdLCAmYWxpZ25lZF9kYXRhLAogCQlwYWNrZXRsZW5fYWxpZ25lZCAtIHBhY2tldGxlbik7CiAKLQlyZXQgPSBSaW5nQnVmZmVyV3JpdGUoJmNoYW5uZWwtPk91dGJvdW5kLCBidWZmZXJsaXN0LCAzKTsKKwlyZXQgPSByaW5nYnVmZmVyX3dyaXRlKCZjaGFubmVsLT5vdXRib3VuZCwgYnVmZmVybGlzdCwgMyk7CiAKIAkvKiBUT0RPOiBXZSBzaG91bGQgZGV0ZXJtaW5lIGlmIHRoaXMgaXMgb3B0aW9uYWwgKi8KLQlpZiAocmV0ID09IDAgJiYgIUdldFJpbmdCdWZmZXJJbnRlcnJ1cHRNYXNrKCZjaGFubmVsLT5PdXRib3VuZCkpCisJaWYgKHJldCA9PSAwICYmICFnZXRfcmluZ2J1ZmZlcl9pbnRlcnJ1cHRfbWFzaygmY2hhbm5lbC0+b3V0Ym91bmQpKQogCQl2bWJ1c19zZXRldmVudChjaGFubmVsKTsKIAogCXJldHVybiByZXQ7CkBAIC05MjMsNyArOTIzLDcgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjaGFubmVsLT5pbmJvdW5kX2xvY2ssIGZsYWdzKTsKIAotCXJldCA9IFJpbmdCdWZmZXJQZWVrKCZjaGFubmVsLT5JbmJvdW5kLCAmZGVzYywKKwlyZXQgPSByaW5nYnVmZmVyX3BlZWsoJmNoYW5uZWwtPmluYm91bmQsICZkZXNjLAogCQkJICAgICBzaXplb2Yoc3RydWN0IHZtcGFja2V0X2Rlc2NyaXB0b3IpKTsKIAlpZiAocmV0ICE9IDApIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hhbm5lbC0+aW5ib3VuZF9sb2NrLCBmbGFncyk7CkBAIC05NDAsNyArOTQwLDcgQEAKIAogCURQUklOVF9EQkcoVk1CVVMsICJwYWNrZXQgcmVjZWl2ZWQgb24gY2hhbm5lbCAlcCByZWxpZCAlZCA8dHlwZSAlZCAiCiAJCSAgICJmbGFnICVkIHRpZCAlbGx4IHBrdGxlbiAlZCBkYXRhbGVuICVkPiAiLAotCQkgICBjaGFubmVsLCBjaGFubmVsLT5PZmZlck1zZy5DaGlsZFJlbElkLCBkZXNjLlR5cGUsCisJCSAgIGNoYW5uZWwsIGNoYW5uZWwtPm9mZmVybXNnLmNoaWxkX3JlbGlkLCBkZXNjLlR5cGUsCiAJCSAgIGRlc2MuRmxhZ3MsIGRlc2MuVHJhbnNhY3Rpb25JZCwgcGFja2V0bGVuLCB1c2VybGVuKTsKIAogCSpidWZmZXJfYWN0dWFsX2xlbiA9IHVzZXJsZW47CkBAIC05NTYsNyArOTU2LDcgQEAKIAkqcmVxdWVzdGlkID0gZGVzYy5UcmFuc2FjdGlvbklkOwogCiAJLyogQ29weSBvdmVyIHRoZSBwYWNrZXQgdG8gdGhlIHVzZXIgYnVmZmVyICovCi0JcmV0ID0gUmluZ0J1ZmZlclJlYWQoJmNoYW5uZWwtPkluYm91bmQsIGJ1ZmZlciwgdXNlcmxlbiwKKwlyZXQgPSByaW5nYnVmZmVyX3JlYWQoJmNoYW5uZWwtPmluYm91bmQsIGJ1ZmZlciwgdXNlcmxlbiwKIAkJCSAgICAgKGRlc2MuRGF0YU9mZnNldDggPDwgMykpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hhbm5lbC0+aW5ib3VuZF9sb2NrLCBmbGFncyk7CkBAIC05ODMsNyArOTgzLDcgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjaGFubmVsLT5pbmJvdW5kX2xvY2ssIGZsYWdzKTsKIAotCXJldCA9IFJpbmdCdWZmZXJQZWVrKCZjaGFubmVsLT5JbmJvdW5kLCAmZGVzYywKKwlyZXQgPSByaW5nYnVmZmVyX3BlZWsoJmNoYW5uZWwtPmluYm91bmQsICZkZXNjLAogCQkJICAgICBzaXplb2Yoc3RydWN0IHZtcGFja2V0X2Rlc2NyaXB0b3IpKTsKIAlpZiAocmV0ICE9IDApIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hhbm5lbC0+aW5ib3VuZF9sb2NrLCBmbGFncyk7CkBAIC05OTksNyArOTk5LDcgQEAKIAogCURQUklOVF9EQkcoVk1CVVMsICJwYWNrZXQgcmVjZWl2ZWQgb24gY2hhbm5lbCAlcCByZWxpZCAlZCA8dHlwZSAlZCAiCiAJCSAgICJmbGFnICVkIHRpZCAlbGx4IHBrdGxlbiAlZCBkYXRhbGVuICVkPiAiLAotCQkgICBjaGFubmVsLCBjaGFubmVsLT5PZmZlck1zZy5DaGlsZFJlbElkLCBkZXNjLlR5cGUsCisJCSAgIGNoYW5uZWwsIGNoYW5uZWwtPm9mZmVybXNnLmNoaWxkX3JlbGlkLCBkZXNjLlR5cGUsCiAJCSAgIGRlc2MuRmxhZ3MsIGRlc2MuVHJhbnNhY3Rpb25JZCwgcGFja2V0bGVuLCB1c2VybGVuKTsKIAogCSpidWZmZXJfYWN0dWFsX2xlbiA9IHBhY2tldGxlbjsKQEAgLTEwMTUsNyArMTAxNSw3IEBACiAJKnJlcXVlc3RpZCA9IGRlc2MuVHJhbnNhY3Rpb25JZDsKIAogCS8qIENvcHkgb3ZlciB0aGUgZW50aXJlIHBhY2tldCB0byB0aGUgdXNlciBidWZmZXIgKi8KLQlyZXQgPSBSaW5nQnVmZmVyUmVhZCgmY2hhbm5lbC0+SW5ib3VuZCwgYnVmZmVyLCBwYWNrZXRsZW4sIDApOworCXJldCA9IHJpbmdidWZmZXJfcmVhZCgmY2hhbm5lbC0+aW5ib3VuZCwgYnVmZmVyLCBwYWNrZXRsZW4sIDApOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hhbm5lbC0+aW5ib3VuZF9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIDA7CkBAIC0xMDMwLDcgKzEwMzAsNyBAQAogCWR1bXBfdm1idXNfY2hhbm5lbChjaGFubmVsKTsKIAkvKiBBU1NFUlQoQ2hhbm5lbC0+T25DaGFubmVsQ2FsbGJhY2spOyAqLwogCi0JY2hhbm5lbC0+T25DaGFubmVsQ2FsbGJhY2soY2hhbm5lbC0+Q2hhbm5lbENhbGxiYWNrQ29udGV4dCk7CisJY2hhbm5lbC0+b25jaGFubmVsX2NhbGxiYWNrKGNoYW5uZWwtPmNoYW5uZWxfY2FsbGJhY2tfY29udGV4dCk7CiAKIAltb2RfdGltZXIoJmNoYW5uZWwtPnBvbGxfdGltZXIsIGppZmZpZXMgKyB1c2Vjc190b19qaWZmaWVzKDEwMCkpOwogfQpAQCAtMTA0Miw4ICsxMDQyLDggQEAKIHsKIAlzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbCA9IChzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqKWRhdGE7CiAKLQlpZiAoY2hhbm5lbC0+T25DaGFubmVsQ2FsbGJhY2spCi0JCWNoYW5uZWwtPk9uQ2hhbm5lbENhbGxiYWNrKGNoYW5uZWwtPkNoYW5uZWxDYWxsYmFja0NvbnRleHQpOworCWlmIChjaGFubmVsLT5vbmNoYW5uZWxfY2FsbGJhY2spCisJCWNoYW5uZWwtPm9uY2hhbm5lbF9jYWxsYmFjayhjaGFubmVsLT5jaGFubmVsX2NhbGxiYWNrX2NvbnRleHQpOwogfQogCiAvKgpAQCAtMTA1MSw3ICsxMDUxLDcgQEAKICAqLwogc3RhdGljIHZvaWQgZHVtcF92bWJ1c19jaGFubmVsKHN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsKQogewotCURQUklOVF9EQkcoVk1CVVMsICJDaGFubmVsICglZCkiLCBjaGFubmVsLT5PZmZlck1zZy5DaGlsZFJlbElkKTsKLQlEdW1wUmluZ0luZm8oJmNoYW5uZWwtPk91dGJvdW5kLCAiT3V0Ym91bmQgIik7Ci0JRHVtcFJpbmdJbmZvKCZjaGFubmVsLT5JbmJvdW5kLCAiSW5ib3VuZCAiKTsKKwlEUFJJTlRfREJHKFZNQlVTLCAiQ2hhbm5lbCAoJWQpIiwgY2hhbm5lbC0+b2ZmZXJtc2cuY2hpbGRfcmVsaWQpOworCWR1bXBfcmluZ19pbmZvKCZjaGFubmVsLT5vdXRib3VuZCwgIk91dGJvdW5kICIpOworCWR1bXBfcmluZ19pbmZvKCZjaGFubmVsLT5pbmJvdW5kLCAiSW5ib3VuZCAiKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9jaGFubmVsX21nbXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9odi9jaGFubmVsX21nbXQuYwppbmRleCA0NWRiZTMwLi5kNDRkNWMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvY2hhbm5lbF9tZ210LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L2NoYW5uZWxfbWdtdC5jCkBAIC0yNTEsOCArMjUxLDggQEAKIAljaGFubmVsLT5wb2xsX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyljaGFubmVsOwogCWNoYW5uZWwtPnBvbGxfdGltZXIuZnVuY3Rpb24gPSB2bWJ1c19vbnRpbWVyOwogCi0JY2hhbm5lbC0+Q29udHJvbFdRID0gY3JlYXRlX3dvcmtxdWV1ZSgiaHZfdm1idXNfY3RsIik7Ci0JaWYgKCFjaGFubmVsLT5Db250cm9sV1EpIHsKKwljaGFubmVsLT5jb250cm9sd3EgPSBjcmVhdGVfd29ya3F1ZXVlKCJodl92bWJ1c19jdGwiKTsKKwlpZiAoIWNoYW5uZWwtPmNvbnRyb2x3cSkgewogCQlrZnJlZShjaGFubmVsKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpAQCAtMjYzLDEyICsyNjMsMTQgQEAKIC8qCiAgKiByZWxlYXNlX2hhbm5lbCAtIFJlbGVhc2UgdGhlIHZtYnVzIGNoYW5uZWwgb2JqZWN0IGl0c2VsZgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcmVsZWFzZV9jaGFubmVsKHZvaWQgKmNvbnRleHQpCitzdGF0aWMgdm9pZCByZWxlYXNlX2NoYW5uZWwoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsID0gY29udGV4dDsKKwlzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbCA9IGNvbnRhaW5lcl9vZih3b3JrLAorCQkJCQkJICAgICBzdHJ1Y3Qgdm1idXNfY2hhbm5lbCwKKwkJCQkJCSAgICAgd29yayk7CiAKIAlEUFJJTlRfREJHKFZNQlVTLCAicmVsZWFzaW5nIGNoYW5uZWwgKCVwKSIsIGNoYW5uZWwpOwotCWRlc3Ryb3lfd29ya3F1ZXVlKGNoYW5uZWwtPkNvbnRyb2xXUSk7CisJZGVzdHJveV93b3JrcXVldWUoY2hhbm5lbC0+Y29udHJvbHdxKTsKIAlEUFJJTlRfREJHKFZNQlVTLCAiY2hhbm5lbCByZWxlYXNlZCAoJXApIiwgY2hhbm5lbCk7CiAKIAlrZnJlZShjaGFubmVsKTsKQEAgLTI4Niw4ICsyODgsOCBAQAogCSAqIHdvcmtxdWV1ZS90aHJlYWQgY29udGV4dAogCSAqIGllIHdlIGNhbid0IGRlc3Ryb3kgb3Vyc2VsdmVzLgogCSAqLwotCW9zZF9zY2hlZHVsZV9jYWxsYmFjayhnVm1idXNDb25uZWN0aW9uLldvcmtRdWV1ZSwgcmVsZWFzZV9jaGFubmVsLAotCQkJICAgICAgY2hhbm5lbCk7CisJSU5JVF9XT1JLKCZjaGFubmVsLT53b3JrLCByZWxlYXNlX2NoYW5uZWwpOworCXF1ZXVlX3dvcmsoZ1ZtYnVzQ29ubmVjdGlvbi5Xb3JrUXVldWUsICZjaGFubmVsLT53b3JrKTsKIH0KIAogCkBAIC0zMDgsMjkgKzMxMCw0NiBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdWbWJ1c0Nvbm5lY3Rpb24uY2hhbm5lbF9sb2NrLCBmbGFncyk7CiB9CiAKKy8qCisgKiB2bWJ1c19wcm9jZXNzX3Jlc2NpbmRfb2ZmZXIgLQorICogUmVzY2luZCB0aGUgb2ZmZXIgYnkgaW5pdGlhdGluZyBhIGRldmljZSByZW1vdmFsCisgKi8KK3N0YXRpYyB2b2lkIHZtYnVzX3Byb2Nlc3NfcmVzY2luZF9vZmZlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWwgPSBjb250YWluZXJfb2Yod29yaywKKwkJCQkJCSAgICAgc3RydWN0IHZtYnVzX2NoYW5uZWwsCisJCQkJCQkgICAgIHdvcmspOworCisJdm1idXNfY2hpbGRfZGV2aWNlX3VucmVnaXN0ZXIoY2hhbm5lbC0+ZGV2aWNlX29iaik7Cit9CiAKIC8qCiAgKiB2bWJ1c19wcm9jZXNzX29mZmVyIC0gUHJvY2VzcyB0aGUgb2ZmZXIgYnkgY3JlYXRpbmcgYSBjaGFubmVsL2RldmljZQogICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgb2ZmZXIKICAqLwotc3RhdGljIHZvaWQgdm1idXNfcHJvY2Vzc19vZmZlcih2b2lkICpjb250ZXh0KQorc3RhdGljIHZvaWQgdm1idXNfcHJvY2Vzc19vZmZlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IHZtYnVzX2NoYW5uZWwgKm5ld2NoYW5uZWwgPSBjb250ZXh0OworCXN0cnVjdCB2bWJ1c19jaGFubmVsICpuZXdjaGFubmVsID0gY29udGFpbmVyX29mKHdvcmssCisJCQkJCQkJc3RydWN0IHZtYnVzX2NoYW5uZWwsCisJCQkJCQkJd29yayk7CiAJc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWw7CiAJYm9vbCBmbmV3ID0gdHJ1ZTsKIAlpbnQgcmV0OwogCWludCBjbnQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCS8qIFRoZSBuZXh0IHBvc3NpYmxlIHdvcmsgaXMgcmVzY2luZCBoYW5kbGluZyAqLworCUlOSVRfV09SSygmbmV3Y2hhbm5lbC0+d29yaywgdm1idXNfcHJvY2Vzc19yZXNjaW5kX29mZmVyKTsKKwogCS8qIE1ha2Ugc3VyZSB0aGlzIGlzIGEgbmV3IG9mZmVyICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmdWbWJ1c0Nvbm5lY3Rpb24uY2hhbm5lbF9sb2NrLCBmbGFncyk7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoYW5uZWwsICZnVm1idXNDb25uZWN0aW9uLkNoYW5uZWxMaXN0LCBMaXN0RW50cnkpIHsKLQkJaWYgKCFtZW1jbXAoJmNoYW5uZWwtPk9mZmVyTXNnLk9mZmVyLkludGVyZmFjZVR5cGUsCi0JCQkgICAgJm5ld2NoYW5uZWwtPk9mZmVyTXNnLk9mZmVyLkludGVyZmFjZVR5cGUsCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjaGFubmVsLCAmZ1ZtYnVzQ29ubmVjdGlvbi5DaGFubmVsTGlzdCwgbGlzdGVudHJ5KSB7CisJCWlmICghbWVtY21wKCZjaGFubmVsLT5vZmZlcm1zZy5vZmZlci5JbnRlcmZhY2VUeXBlLAorCQkJICAgICZuZXdjaGFubmVsLT5vZmZlcm1zZy5vZmZlci5JbnRlcmZhY2VUeXBlLAogCQkJICAgIHNpemVvZihzdHJ1Y3QgaHZfZ3VpZCkpICYmCi0JCSAgICAhbWVtY21wKCZjaGFubmVsLT5PZmZlck1zZy5PZmZlci5JbnRlcmZhY2VJbnN0YW5jZSwKLQkJCSAgICAmbmV3Y2hhbm5lbC0+T2ZmZXJNc2cuT2ZmZXIuSW50ZXJmYWNlSW5zdGFuY2UsCisJCSAgICAhbWVtY21wKCZjaGFubmVsLT5vZmZlcm1zZy5vZmZlci5JbnRlcmZhY2VJbnN0YW5jZSwKKwkJCSAgICAmbmV3Y2hhbm5lbC0+b2ZmZXJtc2cub2ZmZXIuSW50ZXJmYWNlSW5zdGFuY2UsCiAJCQkgICAgc2l6ZW9mKHN0cnVjdCBodl9ndWlkKSkpIHsKIAkJCWZuZXcgPSBmYWxzZTsKIAkJCWJyZWFrOwpAQCAtMzM4LDE0ICszNTcsMTQgQEAKIAl9CiAKIAlpZiAoZm5ldykKLQkJbGlzdF9hZGRfdGFpbCgmbmV3Y2hhbm5lbC0+TGlzdEVudHJ5LAorCQlsaXN0X2FkZF90YWlsKCZuZXdjaGFubmVsLT5saXN0ZW50cnksCiAJCQkgICAgICAmZ1ZtYnVzQ29ubmVjdGlvbi5DaGFubmVsTGlzdCk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnVm1idXNDb25uZWN0aW9uLmNoYW5uZWxfbG9jaywgZmxhZ3MpOwogCiAJaWYgKCFmbmV3KSB7CiAJCURQUklOVF9EQkcoVk1CVVMsICJJZ25vcmluZyBkdXBsaWNhdGUgb2ZmZXIgZm9yIHJlbGlkICglZCkiLAotCQkJICAgbmV3Y2hhbm5lbC0+T2ZmZXJNc2cuQ2hpbGRSZWxJZCk7CisJCQkgICBuZXdjaGFubmVsLT5vZmZlcm1zZy5jaGlsZF9yZWxpZCk7CiAJCWZyZWVfY2hhbm5lbChuZXdjaGFubmVsKTsKIAkJcmV0dXJuOwogCX0KQEAgLTM1NSwyNyArMzc0LDI3IEBACiAJICogV2UgbmVlZCB0byBzZXQgdGhlIERldmljZU9iamVjdCBmaWVsZCBiZWZvcmUgY2FsbGluZwogCSAqIFZtYnVzQ2hpbGREZXZpY2VBZGQoKQogCSAqLwotCW5ld2NoYW5uZWwtPkRldmljZU9iamVjdCA9IFZtYnVzQ2hpbGREZXZpY2VDcmVhdGUoCi0JCSZuZXdjaGFubmVsLT5PZmZlck1zZy5PZmZlci5JbnRlcmZhY2VUeXBlLAotCQkmbmV3Y2hhbm5lbC0+T2ZmZXJNc2cuT2ZmZXIuSW50ZXJmYWNlSW5zdGFuY2UsCisJbmV3Y2hhbm5lbC0+ZGV2aWNlX29iaiA9IHZtYnVzX2NoaWxkX2RldmljZV9jcmVhdGUoCisJCSZuZXdjaGFubmVsLT5vZmZlcm1zZy5vZmZlci5JbnRlcmZhY2VUeXBlLAorCQkmbmV3Y2hhbm5lbC0+b2ZmZXJtc2cub2ZmZXIuSW50ZXJmYWNlSW5zdGFuY2UsCiAJCW5ld2NoYW5uZWwpOwogCiAJRFBSSU5UX0RCRyhWTUJVUywgImNoaWxkIGRldmljZSBvYmplY3QgYWxsb2NhdGVkIC0gJXAiLAotCQkgICBuZXdjaGFubmVsLT5EZXZpY2VPYmplY3QpOworCQkgICBuZXdjaGFubmVsLT5kZXZpY2Vfb2JqKTsKIAogCS8qCiAJICogQWRkIHRoZSBuZXcgZGV2aWNlIHRvIHRoZSBidXMuIFRoaXMgd2lsbCBraWNrIG9mZiBkZXZpY2UtZHJpdmVyCiAJICogYmluZGluZyB3aGljaCBldmVudHVhbGx5IGludm9rZXMgdGhlIGRldmljZSBkcml2ZXIncyBBZGREZXZpY2UoKQogCSAqIG1ldGhvZC4KIAkgKi8KLQlyZXQgPSBWbWJ1c0NoaWxkRGV2aWNlQWRkKG5ld2NoYW5uZWwtPkRldmljZU9iamVjdCk7CisJcmV0ID0gVm1idXNDaGlsZERldmljZUFkZChuZXdjaGFubmVsLT5kZXZpY2Vfb2JqKTsKIAlpZiAocmV0ICE9IDApIHsKIAkJRFBSSU5UX0VSUihWTUJVUywKIAkJCSAgICJ1bmFibGUgdG8gYWRkIGNoaWxkIGRldmljZSBvYmplY3QgKHJlbGlkICVkKSIsCi0JCQkgICBuZXdjaGFubmVsLT5PZmZlck1zZy5DaGlsZFJlbElkKTsKKwkJCSAgIG5ld2NoYW5uZWwtPm9mZmVybXNnLmNoaWxkX3JlbGlkKTsKIAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ1ZtYnVzQ29ubmVjdGlvbi5jaGFubmVsX2xvY2ssIGZsYWdzKTsKLQkJbGlzdF9kZWwoJm5ld2NoYW5uZWwtPkxpc3RFbnRyeSk7CisJCWxpc3RfZGVsKCZuZXdjaGFubmVsLT5saXN0ZW50cnkpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnVm1idXNDb25uZWN0aW9uLmNoYW5uZWxfbG9jaywgZmxhZ3MpOwogCiAJCWZyZWVfY2hhbm5lbChuZXdjaGFubmVsKTsKQEAgLTM4NSwxMSArNDA0LDExIEBACiAJCSAqIHNvIHRoYXQgd2hlbiB3ZSBkbyBjbG9zZSB0aGUgY2hhbm5lbCBub3JtYWxseSwgd2UKIAkJICogY2FuIGNsZWFudXAgcHJvcGVybHkKIAkJICovCi0JCW5ld2NoYW5uZWwtPlN0YXRlID0gQ0hBTk5FTF9PUEVOX1NUQVRFOworCQluZXdjaGFubmVsLT5zdGF0ZSA9IENIQU5ORUxfT1BFTl9TVEFURTsKIAogCQkvKiBPcGVuIElDIGNoYW5uZWxzICovCiAJCWZvciAoY250ID0gMDsgY250IDwgTUFYX01TR19UWVBFUzsgY250KyspIHsKLQkJCWlmIChtZW1jbXAoJm5ld2NoYW5uZWwtPk9mZmVyTXNnLk9mZmVyLkludGVyZmFjZVR5cGUsCisJCQlpZiAobWVtY21wKCZuZXdjaGFubmVsLT5vZmZlcm1zZy5vZmZlci5JbnRlcmZhY2VUeXBlLAogCQkJCSAgICZodl9jYl91dGlsc1tjbnRdLmRhdGEsCiAJCQkJICAgc2l6ZW9mKHN0cnVjdCBodl9ndWlkKSkgPT0gMCAmJgogCQkJCXZtYnVzX29wZW4obmV3Y2hhbm5lbCwgMiAqIFBBR0VfU0laRSwKQEAgLTQwNiwxNyArNDI1LDYgQEAKIH0KIAogLyoKLSAqIHZtYnVzX3Byb2Nlc3NfcmVzY2luZF9vZmZlciAtCi0gKiBSZXNjaW5kIHRoZSBvZmZlciBieSBpbml0aWF0aW5nIGEgZGV2aWNlIHJlbW92YWwKLSAqLwotc3RhdGljIHZvaWQgdm1idXNfcHJvY2Vzc19yZXNjaW5kX29mZmVyKHZvaWQgKmNvbnRleHQpCi17Ci0Jc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWwgPSBjb250ZXh0OwotCi0JVm1idXNDaGlsZERldmljZVJlbW92ZShjaGFubmVsLT5EZXZpY2VPYmplY3QpOwotfQotCi0vKgogICogdm1idXNfb25vZmZlciAtIEhhbmRsZXIgZm9yIGNoYW5uZWwgb2ZmZXJzIGZyb20gdm1idXMgaW4gcGFyZW50IHBhcnRpdGlvbi4KICAqCiAgKiBXZSBpZ25vcmUgYWxsIG9mZmVycyBleGNlcHQgbmV0d29yayBhbmQgc3RvcmFnZSBvZmZlcnMuIEZvciBlYWNoIG5ldHdvcmsgYW5kCkBAIC00MzQsNyArNDQyLDcgQEAKIAogCW9mZmVyID0gKHN0cnVjdCB2bWJ1c19jaGFubmVsX29mZmVyX2NoYW5uZWwgKiloZHI7CiAJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fREVWSUNFX0NMQVNTRVNfU1VQUE9SVEVEOyBpKyspIHsKLQkJaWYgKG1lbWNtcCgmb2ZmZXItPk9mZmVyLkludGVyZmFjZVR5cGUsCisJCWlmIChtZW1jbXAoJm9mZmVyLT5vZmZlci5JbnRlcmZhY2VUeXBlLAogCQkgICAgJmdTdXBwb3J0ZWREZXZpY2VDbGFzc2VzW2ldLCBzaXplb2Yoc3RydWN0IGh2X2d1aWQpKSA9PSAwKSB7CiAJCQlmc3VwcG9ydGVkID0gMTsKIAkJCWJyZWFrOwpAQCAtNDQzLDEyICs0NTEsMTIgQEAKIAogCWlmICghZnN1cHBvcnRlZCkgewogCQlEUFJJTlRfREJHKFZNQlVTLCAiSWdub3JpbmcgY2hhbm5lbCBvZmZlciBub3RpZmljYXRpb24gZm9yICIKLQkJCSAgICJjaGlsZCByZWxpZCAlZCIsIG9mZmVyLT5DaGlsZFJlbElkKTsKKwkJCSAgICJjaGlsZCByZWxpZCAlZCIsIG9mZmVyLT5jaGlsZF9yZWxpZCk7CiAJCXJldHVybjsKIAl9CiAKLQlndWlkdHlwZSA9ICZvZmZlci0+T2ZmZXIuSW50ZXJmYWNlVHlwZTsKLQlndWlkaW5zdGFuY2UgPSAmb2ZmZXItPk9mZmVyLkludGVyZmFjZUluc3RhbmNlOworCWd1aWR0eXBlID0gJm9mZmVyLT5vZmZlci5JbnRlcmZhY2VUeXBlOworCWd1aWRpbnN0YW5jZSA9ICZvZmZlci0+b2ZmZXIuSW50ZXJmYWNlSW5zdGFuY2U7CiAKIAlEUFJJTlRfSU5GTyhWTUJVUywgIkNoYW5uZWwgb2ZmZXIgbm90aWZpY2F0aW9uIC0gIgogCQkgICAgImNoaWxkIHJlbGlkICVkIG1vbml0b3IgaWQgJWQgYWxsb2NhdGVkICVkLCAiCkBAIC00NTYsOCArNDY0LDggQEAKIAkJICAgICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeH0gIgogCQkgICAgImluc3RhbmNlIHslMDJ4JTAyeCUwMnglMDJ4LSUwMnglMDJ4LSUwMnglMDJ4LSIKIAkJICAgICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeH0iLAotCQkgICAgb2ZmZXItPkNoaWxkUmVsSWQsIG9mZmVyLT5Nb25pdG9ySWQsCi0JCSAgICBvZmZlci0+TW9uaXRvckFsbG9jYXRlZCwKKwkJICAgIG9mZmVyLT5jaGlsZF9yZWxpZCwgb2ZmZXItPm1vbml0b3JpZCwKKwkJICAgIG9mZmVyLT5tb25pdG9yX2FsbG9jYXRlZCwKIAkJICAgIGd1aWR0eXBlLT5kYXRhWzNdLCBndWlkdHlwZS0+ZGF0YVsyXSwKIAkJICAgIGd1aWR0eXBlLT5kYXRhWzFdLCBndWlkdHlwZS0+ZGF0YVswXSwKIAkJICAgIGd1aWR0eXBlLT5kYXRhWzVdLCBndWlkdHlwZS0+ZGF0YVs0XSwKQEAgLTQ4NCwxNCArNDkyLDE0IEBACiAKIAlEUFJJTlRfREJHKFZNQlVTLCAiY2hhbm5lbCBvYmplY3QgYWxsb2NhdGVkIC0gJXAiLCBuZXdjaGFubmVsKTsKIAotCW1lbWNweSgmbmV3Y2hhbm5lbC0+T2ZmZXJNc2csIG9mZmVyLAorCW1lbWNweSgmbmV3Y2hhbm5lbC0+b2ZmZXJtc2csIG9mZmVyLAogCSAgICAgICBzaXplb2Yoc3RydWN0IHZtYnVzX2NoYW5uZWxfb2ZmZXJfY2hhbm5lbCkpOwotCW5ld2NoYW5uZWwtPk1vbml0b3JHcm91cCA9ICh1OClvZmZlci0+TW9uaXRvcklkIC8gMzI7Ci0JbmV3Y2hhbm5lbC0+TW9uaXRvckJpdCA9ICh1OClvZmZlci0+TW9uaXRvcklkICUgMzI7CisJbmV3Y2hhbm5lbC0+bW9uaXRvcl9ncnAgPSAodTgpb2ZmZXItPm1vbml0b3JpZCAvIDMyOworCW5ld2NoYW5uZWwtPm1vbml0b3JfYml0ID0gKHU4KW9mZmVyLT5tb25pdG9yaWQgJSAzMjsKIAogCS8qIFRPRE86IE1ha2Ugc3VyZSB0aGUgb2ZmZXIgY29tZXMgZnJvbSBvdXIgcGFyZW50IHBhcnRpdGlvbiAqLwotCW9zZF9zY2hlZHVsZV9jYWxsYmFjayhuZXdjaGFubmVsLT5Db250cm9sV1EsIHZtYnVzX3Byb2Nlc3Nfb2ZmZXIsCi0JCQkgICAgICBuZXdjaGFubmVsKTsKKwlJTklUX1dPUksoJm5ld2NoYW5uZWwtPndvcmssIHZtYnVzX3Byb2Nlc3Nfb2ZmZXIpOworCXF1ZXVlX3dvcmsobmV3Y2hhbm5lbC0+Y29udHJvbHdxLCAmbmV3Y2hhbm5lbC0+d29yayk7CiB9CiAKIC8qCkBAIC01MDUsMTYgKzUxMywxNiBAQAogCXN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsOwogCiAJcmVzY2luZCA9IChzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9yZXNjaW5kX29mZmVyICopaGRyOwotCWNoYW5uZWwgPSBHZXRDaGFubmVsRnJvbVJlbElkKHJlc2NpbmQtPkNoaWxkUmVsSWQpOworCWNoYW5uZWwgPSBHZXRDaGFubmVsRnJvbVJlbElkKHJlc2NpbmQtPmNoaWxkX3JlbGlkKTsKIAlpZiAoY2hhbm5lbCA9PSBOVUxMKSB7CiAJCURQUklOVF9EQkcoVk1CVVMsICJjaGFubmVsIG5vdCBmb3VuZCBmb3IgcmVsSWQgJWQiLAotCQkJICAgcmVzY2luZC0+Q2hpbGRSZWxJZCk7CisJCQkgICByZXNjaW5kLT5jaGlsZF9yZWxpZCk7CiAJCXJldHVybjsKIAl9CiAKLQlvc2Rfc2NoZWR1bGVfY2FsbGJhY2soY2hhbm5lbC0+Q29udHJvbFdRLAotCQkJICAgICAgdm1idXNfcHJvY2Vzc19yZXNjaW5kX29mZmVyLAotCQkJICAgICAgY2hhbm5lbCk7CisJLyogd29yayBpcyBpbml0aWFsaXplZCBmb3Igdm1idXNfcHJvY2Vzc19yZXNjaW5kX29mZmVyKCkgZnJvbQorCSAqIHZtYnVzX3Byb2Nlc3Nfb2ZmZXIoKSB3aGVyZSB0aGUgY2hhbm5lbCBnb3QgY3JlYXRlZCAqLworCXF1ZXVlX3dvcmsoY2hhbm5lbC0+Y29udHJvbHdxLCAmY2hhbm5lbC0+d29yayk7CiB9CiAKIC8qCkBAIC01NDUsNyArNTUzLDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJcmVzdWx0ID0gKHN0cnVjdCB2bWJ1c19jaGFubmVsX29wZW5fcmVzdWx0ICopaGRyOwotCURQUklOVF9EQkcoVk1CVVMsICJ2bWJ1cyBvcGVuIHJlc3VsdCAtICVkIiwgcmVzdWx0LT5TdGF0dXMpOworCURQUklOVF9EQkcoVk1CVVMsICJ2bWJ1cyBvcGVuIHJlc3VsdCAtICVkIiwgcmVzdWx0LT5zdGF0dXMpOwogCiAJLyoKIAkgKiBGaW5kIHRoZSBvcGVuIG1zZywgY29weSB0aGUgcmVzdWx0IGFuZCBzaWduYWwvdW5ibG9jayB0aGUgd2FpdCBldmVudApAQCAtNTU2LDE3ICs1NjQsMTcgQEAKIC8qIEZJWE1FOiB0aGlzIHNob3VsZCBwcm9iYWJseSB1c2UgbGlzdF9lbnRyeSgpIGluc3RlYWQgKi8KIAkJbXNnaW5mbyA9IChzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tc2dpbmZvICopY3VycjsKIAkJcmVxdWVzdGhlYWRlciA9Ci0JCQkoc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgKiltc2dpbmZvLT5Nc2c7CisJCQkoc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgKiltc2dpbmZvLT5tc2c7CiAKLQkJaWYgKHJlcXVlc3RoZWFkZXItPk1lc3NhZ2VUeXBlID09IENoYW5uZWxNZXNzYWdlT3BlbkNoYW5uZWwpIHsKKwkJaWYgKHJlcXVlc3RoZWFkZXItPm1zZ3R5cGUgPT0gQ0hBTk5FTE1TR19PUEVOQ0hBTk5FTCkgewogCQkJb3Blbm1zZyA9Ci0JCQkoc3RydWN0IHZtYnVzX2NoYW5uZWxfb3Blbl9jaGFubmVsICopbXNnaW5mby0+TXNnOwotCQkJaWYgKG9wZW5tc2ctPkNoaWxkUmVsSWQgPT0gcmVzdWx0LT5DaGlsZFJlbElkICYmCi0JCQkgICAgb3Blbm1zZy0+T3BlbklkID09IHJlc3VsdC0+T3BlbklkKSB7Ci0JCQkJbWVtY3B5KCZtc2dpbmZvLT5SZXNwb25zZS5PcGVuUmVzdWx0LAorCQkJKHN0cnVjdCB2bWJ1c19jaGFubmVsX29wZW5fY2hhbm5lbCAqKW1zZ2luZm8tPm1zZzsKKwkJCWlmIChvcGVubXNnLT5jaGlsZF9yZWxpZCA9PSByZXN1bHQtPmNoaWxkX3JlbGlkICYmCisJCQkgICAgb3Blbm1zZy0+b3BlbmlkID09IHJlc3VsdC0+b3BlbmlkKSB7CisJCQkJbWVtY3B5KCZtc2dpbmZvLT5yZXNwb25zZS5vcGVuX3Jlc3VsdCwKIAkJCQkgICAgICAgcmVzdWx0LAogCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHZtYnVzX2NoYW5uZWxfb3Blbl9yZXN1bHQpKTsKLQkJCQlvc2RfV2FpdEV2ZW50U2V0KG1zZ2luZm8tPldhaXRFdmVudCk7CisJCQkJb3NkX3dhaXRldmVudF9zZXQobXNnaW5mby0+d2FpdGV2ZW50KTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQpAQCAtNTkyLDcgKzYwMCw3IEBACiAKIAlncGFkbGNyZWF0ZWQgPSAoc3RydWN0IHZtYnVzX2NoYW5uZWxfZ3BhZGxfY3JlYXRlZCAqKWhkcjsKIAlEUFJJTlRfREJHKFZNQlVTLCAidm1idXMgZ3BhZGwgY3JlYXRlZCByZXN1bHQgLSAlZCIsCi0JCSAgIGdwYWRsY3JlYXRlZC0+Q3JlYXRpb25TdGF0dXMpOworCQkgICBncGFkbGNyZWF0ZWQtPmNyZWF0aW9uX3N0YXR1cyk7CiAKIAkvKgogCSAqIEZpbmQgdGhlIGVzdGFibGlzaCBtc2csIGNvcHkgdGhlIHJlc3VsdCBhbmQgc2lnbmFsL3VuYmxvY2sgdGhlIHdhaXQKQEAgLTYwNCwxOSArNjEyLDE5IEBACiAvKiBGSVhNRTogdGhpcyBzaG91bGQgcHJvYmFibHkgdXNlIGxpc3RfZW50cnkoKSBpbnN0ZWFkICovCiAJCW1zZ2luZm8gPSAoc3RydWN0IHZtYnVzX2NoYW5uZWxfbXNnaW5mbyAqKWN1cnI7CiAJCXJlcXVlc3RoZWFkZXIgPQotCQkJKHN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyICopbXNnaW5mby0+TXNnOworCQkJKHN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyICopbXNnaW5mby0+bXNnOwogCi0JCWlmIChyZXF1ZXN0aGVhZGVyLT5NZXNzYWdlVHlwZSA9PSBDaGFubmVsTWVzc2FnZUdwYWRsSGVhZGVyKSB7CisJCWlmIChyZXF1ZXN0aGVhZGVyLT5tc2d0eXBlID09IENIQU5ORUxNU0dfR1BBRExfSEVBREVSKSB7CiAJCQlncGFkbGhlYWRlciA9CiAJCQkoc3RydWN0IHZtYnVzX2NoYW5uZWxfZ3BhZGxfaGVhZGVyICopcmVxdWVzdGhlYWRlcjsKIAotCQkJaWYgKChncGFkbGNyZWF0ZWQtPkNoaWxkUmVsSWQgPT0KLQkJCSAgICAgZ3BhZGxoZWFkZXItPkNoaWxkUmVsSWQpICYmCi0JCQkgICAgKGdwYWRsY3JlYXRlZC0+R3BhZGwgPT0gZ3BhZGxoZWFkZXItPkdwYWRsKSkgewotCQkJCW1lbWNweSgmbXNnaW5mby0+UmVzcG9uc2UuR3BhZGxDcmVhdGVkLAorCQkJaWYgKChncGFkbGNyZWF0ZWQtPmNoaWxkX3JlbGlkID09CisJCQkgICAgIGdwYWRsaGVhZGVyLT5jaGlsZF9yZWxpZCkgJiYKKwkJCSAgICAoZ3BhZGxjcmVhdGVkLT5ncGFkbCA9PSBncGFkbGhlYWRlci0+Z3BhZGwpKSB7CisJCQkJbWVtY3B5KCZtc2dpbmZvLT5yZXNwb25zZS5ncGFkbF9jcmVhdGVkLAogCQkJCSAgICAgICBncGFkbGNyZWF0ZWQsCiAJCQkJICAgICAgIHNpemVvZihzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9ncGFkbF9jcmVhdGVkKSk7Ci0JCQkJb3NkX1dhaXRFdmVudFNldChtc2dpbmZvLT5XYWl0RXZlbnQpOworCQkJCW9zZF93YWl0ZXZlbnRfc2V0KG1zZ2luZm8tPndhaXRldmVudCk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KQEAgLTY1MiwxNyArNjYwLDE3IEBACiAvKiBGSVhNRTogdGhpcyBzaG91bGQgcHJvYmFibHkgdXNlIGxpc3RfZW50cnkoKSBpbnN0ZWFkICovCiAJCW1zZ2luZm8gPSAoc3RydWN0IHZtYnVzX2NoYW5uZWxfbXNnaW5mbyAqKWN1cnI7CiAJCXJlcXVlc3RoZWFkZXIgPQotCQkJKHN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyICopbXNnaW5mby0+TXNnOworCQkJKHN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyICopbXNnaW5mby0+bXNnOwogCi0JCWlmIChyZXF1ZXN0aGVhZGVyLT5NZXNzYWdlVHlwZSA9PSBDaGFubmVsTWVzc2FnZUdwYWRsVGVhcmRvd24pIHsKKwkJaWYgKHJlcXVlc3RoZWFkZXItPm1zZ3R5cGUgPT0gQ0hBTk5FTE1TR19HUEFETF9URUFSRE9XTikgewogCQkJZ3BhZGxfdGVhcmRvd24gPQogCQkJKHN0cnVjdCB2bWJ1c19jaGFubmVsX2dwYWRsX3RlYXJkb3duICopcmVxdWVzdGhlYWRlcjsKIAotCQkJaWYgKGdwYWRsX3Rvcm5kb3duLT5HcGFkbCA9PSBncGFkbF90ZWFyZG93bi0+R3BhZGwpIHsKLQkJCQltZW1jcHkoJm1zZ2luZm8tPlJlc3BvbnNlLkdwYWRsVG9ybmRvd24sCisJCQlpZiAoZ3BhZGxfdG9ybmRvd24tPmdwYWRsID09IGdwYWRsX3RlYXJkb3duLT5ncGFkbCkgeworCQkJCW1lbWNweSgmbXNnaW5mby0+cmVzcG9uc2UuZ3BhZGxfdG9ybmRvd24sCiAJCQkJICAgICAgIGdwYWRsX3Rvcm5kb3duLAogCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHZtYnVzX2NoYW5uZWxfZ3BhZGxfdG9ybmRvd24pKTsKLQkJCQlvc2RfV2FpdEV2ZW50U2V0KG1zZ2luZm8tPldhaXRFdmVudCk7CisJCQkJb3NkX3dhaXRldmVudF9zZXQobXNnaW5mby0+d2FpdGV2ZW50KTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQpAQCAtNjk0LDE2ICs3MDIsMTYgQEAKIC8qIEZJWE1FOiB0aGlzIHNob3VsZCBwcm9iYWJseSB1c2UgbGlzdF9lbnRyeSgpIGluc3RlYWQgKi8KIAkJbXNnaW5mbyA9IChzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tc2dpbmZvICopY3VycjsKIAkJcmVxdWVzdGhlYWRlciA9Ci0JCQkoc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgKiltc2dpbmZvLT5Nc2c7CisJCQkoc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgKiltc2dpbmZvLT5tc2c7CiAKLQkJaWYgKHJlcXVlc3RoZWFkZXItPk1lc3NhZ2VUeXBlID09Ci0JCSAgICBDaGFubmVsTWVzc2FnZUluaXRpYXRlQ29udGFjdCkgeworCQlpZiAocmVxdWVzdGhlYWRlci0+bXNndHlwZSA9PQorCQkgICAgQ0hBTk5FTE1TR19JTklUSUFURV9DT05UQUNUKSB7CiAJCQlpbml0aWF0ZSA9CiAJCQkoc3RydWN0IHZtYnVzX2NoYW5uZWxfaW5pdGlhdGVfY29udGFjdCAqKXJlcXVlc3RoZWFkZXI7Ci0JCQltZW1jcHkoJm1zZ2luZm8tPlJlc3BvbnNlLlZlcnNpb25SZXNwb25zZSwKKwkJCW1lbWNweSgmbXNnaW5mby0+cmVzcG9uc2UudmVyc2lvbl9yZXNwb25zZSwKIAkJCSAgICAgIHZlcnNpb25fcmVzcG9uc2UsCiAJCQkgICAgICBzaXplb2Yoc3RydWN0IHZtYnVzX2NoYW5uZWxfdmVyc2lvbl9yZXNwb25zZSkpOwotCQkJb3NkX1dhaXRFdmVudFNldChtc2dpbmZvLT5XYWl0RXZlbnQpOworCQkJb3NkX3dhaXRldmVudF9zZXQobXNnaW5mby0+d2FpdGV2ZW50KTsKIAkJfQogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnVm1idXNDb25uZWN0aW9uLmNoYW5uZWxtc2dfbG9jaywgZmxhZ3MpOwpAQCAtNzExLDI0ICs3MTksMjQgQEAKIAogLyogQ2hhbm5lbCBtZXNzYWdlIGRpc3BhdGNoIHRhYmxlICovCiBzdGF0aWMgc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV90YWJsZV9lbnRyeQotCWdDaGFubmVsTWVzc2FnZVRhYmxlW0NoYW5uZWxNZXNzYWdlQ291bnRdID0gewotCXtDaGFubmVsTWVzc2FnZUludmFsaWQsCQkJTlVMTH0sCi0Je0NoYW5uZWxNZXNzYWdlT2ZmZXJDaGFubmVsLAkJdm1idXNfb25vZmZlcn0sCi0Je0NoYW5uZWxNZXNzYWdlUmVzY2luZENoYW5uZWxPZmZlciwJdm1idXNfb25vZmZlcl9yZXNjaW5kfSwKLQl7Q2hhbm5lbE1lc3NhZ2VSZXF1ZXN0T2ZmZXJzLAkJTlVMTH0sCi0Je0NoYW5uZWxNZXNzYWdlQWxsT2ZmZXJzRGVsaXZlcmVkLAl2bWJ1c19vbm9mZmVyc19kZWxpdmVyZWR9LAotCXtDaGFubmVsTWVzc2FnZU9wZW5DaGFubmVsLAkJTlVMTH0sCi0Je0NoYW5uZWxNZXNzYWdlT3BlbkNoYW5uZWxSZXN1bHQsCXZtYnVzX29ub3Blbl9yZXN1bHR9LAotCXtDaGFubmVsTWVzc2FnZUNsb3NlQ2hhbm5lbCwJCU5VTEx9LAotCXtDaGFubmVsTWVzc2FnZUdwYWRsSGVhZGVyLAkJTlVMTH0sCi0Je0NoYW5uZWxNZXNzYWdlR3BhZGxCb2R5LAkJTlVMTH0sCi0Je0NoYW5uZWxNZXNzYWdlR3BhZGxDcmVhdGVkLAkJdm1idXNfb25ncGFkbF9jcmVhdGVkfSwKLQl7Q2hhbm5lbE1lc3NhZ2VHcGFkbFRlYXJkb3duLAkJTlVMTH0sCi0Je0NoYW5uZWxNZXNzYWdlR3BhZGxUb3JuZG93biwJCXZtYnVzX29uZ3BhZGxfdG9ybmRvd259LAotCXtDaGFubmVsTWVzc2FnZVJlbElkUmVsZWFzZWQsCQlOVUxMfSwKLQl7Q2hhbm5lbE1lc3NhZ2VJbml0aWF0ZUNvbnRhY3QsCQlOVUxMfSwKLQl7Q2hhbm5lbE1lc3NhZ2VWZXJzaW9uUmVzcG9uc2UsCQl2bWJ1c19vbnZlcnNpb25fcmVzcG9uc2V9LAotCXtDaGFubmVsTWVzc2FnZVVubG9hZCwJCQlOVUxMfSwKKwlnQ2hhbm5lbE1lc3NhZ2VUYWJsZVtDSEFOTkVMTVNHX0NPVU5UXSA9IHsKKwl7Q0hBTk5FTE1TR19JTlZBTElELAkJCU5VTEx9LAorCXtDSEFOTkVMTVNHX09GRkVSQ0hBTk5FTCwJCXZtYnVzX29ub2ZmZXJ9LAorCXtDSEFOTkVMTVNHX1JFU0NJTkRfQ0hBTk5FTE9GRkVSLAl2bWJ1c19vbm9mZmVyX3Jlc2NpbmR9LAorCXtDSEFOTkVMTVNHX1JFUVVFU1RPRkZFUlMsCQlOVUxMfSwKKwl7Q0hBTk5FTE1TR19BTExPRkZFUlNfREVMSVZFUkVELAl2bWJ1c19vbm9mZmVyc19kZWxpdmVyZWR9LAorCXtDSEFOTkVMTVNHX09QRU5DSEFOTkVMLAkJTlVMTH0sCisJe0NIQU5ORUxNU0dfT1BFTkNIQU5ORUxfUkVTVUxULAl2bWJ1c19vbm9wZW5fcmVzdWx0fSwKKwl7Q0hBTk5FTE1TR19DTE9TRUNIQU5ORUwsCQlOVUxMfSwKKwl7Q0hBTk5FTE1TR19HUEFETF9IRUFERVIsCQlOVUxMfSwKKwl7Q0hBTk5FTE1TR19HUEFETF9CT0RZLAkJTlVMTH0sCisJe0NIQU5ORUxNU0dfR1BBRExfQ1JFQVRFRCwJCXZtYnVzX29uZ3BhZGxfY3JlYXRlZH0sCisJe0NIQU5ORUxNU0dfR1BBRExfVEVBUkRPV04sCQlOVUxMfSwKKwl7Q0hBTk5FTE1TR19HUEFETF9UT1JORE9XTiwJCXZtYnVzX29uZ3BhZGxfdG9ybmRvd259LAorCXtDSEFOTkVMTVNHX1JFTElEX1JFTEVBU0VELAkJTlVMTH0sCisJe0NIQU5ORUxNU0dfSU5JVElBVEVfQ09OVEFDVCwJCU5VTEx9LAorCXtDSEFOTkVMTVNHX1ZFUlNJT05fUkVTUE9OU0UsCQl2bWJ1c19vbnZlcnNpb25fcmVzcG9uc2V9LAorCXtDSEFOTkVMTVNHX1VOTE9BRCwJCQlOVUxMfSwKIH07CiAKIC8qCkBAIC03NDIsMjkgKzc1MCwyNSBAQAogCXN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyICpoZHI7CiAJaW50IHNpemU7CiAKLQloZHIgPSAoc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgKiltc2ctPnUuUGF5bG9hZDsKLQlzaXplID0gbXNnLT5IZWFkZXIuUGF5bG9hZFNpemU7CisJaGRyID0gKHN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyICopbXNnLT51LnBheWxvYWQ7CisJc2l6ZSA9IG1zZy0+aGVhZGVyLnBheWxvYWRfc2l6ZTsKIAotCURQUklOVF9EQkcoVk1CVVMsICJtZXNzYWdlIHR5cGUgJWQgc2l6ZSAlZCIsIGhkci0+TWVzc2FnZVR5cGUsIHNpemUpOworCURQUklOVF9EQkcoVk1CVVMsICJtZXNzYWdlIHR5cGUgJWQgc2l6ZSAlZCIsIGhkci0+bXNndHlwZSwgc2l6ZSk7CiAKLQlpZiAoaGRyLT5NZXNzYWdlVHlwZSA+PSBDaGFubmVsTWVzc2FnZUNvdW50KSB7CisJaWYgKGhkci0+bXNndHlwZSA+PSBDSEFOTkVMTVNHX0NPVU5UKSB7CiAJCURQUklOVF9FUlIoVk1CVVMsCiAJCQkgICAiUmVjZWl2ZWQgaW52YWxpZCBjaGFubmVsIG1lc3NhZ2UgdHlwZSAlZCBzaXplICVkIiwKLQkJCSAgIGhkci0+TWVzc2FnZVR5cGUsIHNpemUpOworCQkJICAgaGRyLT5tc2d0eXBlLCBzaXplKTsKIAkJcHJpbnRfaGV4X2R1bXBfYnl0ZXMoIiIsIERVTVBfUFJFRklYX05PTkUsCi0JCQkJICAgICAodW5zaWduZWQgY2hhciAqKW1zZy0+dS5QYXlsb2FkLCBzaXplKTsKLQkJa2ZyZWUobXNnKTsKKwkJCQkgICAgICh1bnNpZ25lZCBjaGFyICopbXNnLT51LnBheWxvYWQsIHNpemUpOwogCQlyZXR1cm47CiAJfQogCi0JaWYgKGdDaGFubmVsTWVzc2FnZVRhYmxlW2hkci0+TWVzc2FnZVR5cGVdLm1lc3NhZ2VIYW5kbGVyKQotCQlnQ2hhbm5lbE1lc3NhZ2VUYWJsZVtoZHItPk1lc3NhZ2VUeXBlXS5tZXNzYWdlSGFuZGxlcihoZHIpOworCWlmIChnQ2hhbm5lbE1lc3NhZ2VUYWJsZVtoZHItPm1zZ3R5cGVdLm1lc3NhZ2VIYW5kbGVyKQorCQlnQ2hhbm5lbE1lc3NhZ2VUYWJsZVtoZHItPm1zZ3R5cGVdLm1lc3NhZ2VIYW5kbGVyKGhkcik7CiAJZWxzZQogCQlEUFJJTlRfRVJSKFZNQlVTLCAiVW5oYW5kbGVkIGNoYW5uZWwgbWVzc2FnZSB0eXBlICVkIiwKLQkJCSAgIGhkci0+TWVzc2FnZVR5cGUpOwotCi0JLyogRnJlZSB0aGUgbXNnIHRoYXQgd2FzIGFsbG9jYXRlZCBpbiBWbWJ1c09uTXNnRFBDKCkgKi8KLQlrZnJlZShtc2cpOworCQkJICAgaGRyLT5tc2d0eXBlKTsKIH0KIAogLyoKQEAgLTc4MiwxNSArNzg2LDE1IEBACiAJaWYgKCFtc2dpbmZvKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCW1zZ2luZm8tPldhaXRFdmVudCA9IG9zZF9XYWl0RXZlbnRDcmVhdGUoKTsKLQlpZiAoIW1zZ2luZm8tPldhaXRFdmVudCkgeworCW1zZ2luZm8tPndhaXRldmVudCA9IG9zZF93YWl0ZXZlbnRfY3JlYXRlKCk7CisJaWYgKCFtc2dpbmZvLT53YWl0ZXZlbnQpIHsKIAkJa2ZyZWUobXNnaW5mbyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCW1zZyA9IChzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciAqKW1zZ2luZm8tPk1zZzsKKwltc2cgPSAoc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgKiltc2dpbmZvLT5tc2c7CiAKLQltc2ctPk1lc3NhZ2VUeXBlID0gQ2hhbm5lbE1lc3NhZ2VSZXF1ZXN0T2ZmZXJzOworCW1zZy0+bXNndHlwZSA9IENIQU5ORUxNU0dfUkVRVUVTVE9GRkVSUzsKIAogCS8qU3BpbmxvY2tBY3F1aXJlKGdWbWJ1c0Nvbm5lY3Rpb24uY2hhbm5lbE1zZ0xvY2spOwogCUlOU0VSVF9UQUlMX0xJU1QoJmdWbWJ1c0Nvbm5lY3Rpb24uY2hhbm5lbE1zZ0xpc3QsCkBAIC04MDgsNyArODEyLDcgQEAKIAogCQlnb3RvIENsZWFudXA7CiAJfQotCS8qIG9zZF9XYWl0RXZlbnRXYWl0KG1zZ0luZm8tPndhaXRFdmVudCk7ICovCisJLyogb3NkX3dhaXRldmVudF93YWl0KG1zZ0luZm8tPndhaXRFdmVudCk7ICovCiAKIAkvKlNwaW5sb2NrQWNxdWlyZShnVm1idXNDb25uZWN0aW9uLmNoYW5uZWxNc2dMb2NrKTsKIAlSRU1PVkVfRU5UUllfTElTVCgmbXNnSW5mby0+bXNnTGlzdEVudHJ5KTsKQEAgLTgxNyw3ICs4MjEsNyBAQAogCiBDbGVhbnVwOgogCWlmIChtc2dpbmZvKSB7Ci0JCWtmcmVlKG1zZ2luZm8tPldhaXRFdmVudCk7CisJCWtmcmVlKG1zZ2luZm8tPndhaXRldmVudCk7CiAJCWtmcmVlKG1zZ2luZm8pOwogCX0KIApAQCAtODM3LDE3ICs4NDEsMTcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZ1ZtYnVzQ29ubmVjdGlvbi5jaGFubmVsX2xvY2ssIGZsYWdzKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjaGFubmVsLCBwb3MsICZnVm1idXNDb25uZWN0aW9uLkNoYW5uZWxMaXN0LAotCQkJCSBMaXN0RW50cnkpIHsKKwkJCQkgbGlzdGVudHJ5KSB7CiAJCWlmIChjaGFubmVsID09IHN0YXJ0KQogCQkJYnJlYWs7CiAKLQkJaWYgKCFjaGFubmVsLT5EZXZpY2VPYmplY3QtPkRyaXZlcikgewotCQkJbGlzdF9kZWwoJmNoYW5uZWwtPkxpc3RFbnRyeSk7CisJCWlmICghY2hhbm5lbC0+ZGV2aWNlX29iai0+RHJpdmVyKSB7CisJCQlsaXN0X2RlbCgmY2hhbm5lbC0+bGlzdGVudHJ5KTsKIAkJCURQUklOVF9JTkZPKFZNQlVTLAogCQkJCSAgICAiUmVsZWFzaW5nIHVuYXR0YWNoZWQgZGV2aWNlIG9iamVjdCAlcCIsCi0JCQkJICAgIGNoYW5uZWwtPkRldmljZU9iamVjdCk7CisJCQkJICAgIGNoYW5uZWwtPmRldmljZV9vYmopOwogCi0JCQlWbWJ1c0NoaWxkRGV2aWNlUmVtb3ZlKGNoYW5uZWwtPkRldmljZU9iamVjdCk7CisJCQl2bWJ1c19jaGlsZF9kZXZpY2VfdW5yZWdpc3RlcihjaGFubmVsLT5kZXZpY2Vfb2JqKTsKIAkJCWZyZWVfY2hhbm5lbChjaGFubmVsKTsKIAkJfSBlbHNlIHsKIAkJCWlmICghc3RhcnQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvY2hhbm5lbF9tZ210LmggYi9kcml2ZXJzL3N0YWdpbmcvaHYvY2hhbm5lbF9tZ210LmgKaW5kZXggZDE2Y2MwODEuLmRlNmIyYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi9jaGFubmVsX21nbXQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaHYvY2hhbm5lbF9tZ210LmgKQEAgLTMzLDYwICszMyw2MCBAQAogCiAvKiBWZXJzaW9uIDEgbWVzc2FnZXMgKi8KIGVudW0gdm1idXNfY2hhbm5lbF9tZXNzYWdlX3R5cGUgewotCUNoYW5uZWxNZXNzYWdlSW52YWxpZAkJCT0gIDAsCi0JQ2hhbm5lbE1lc3NhZ2VPZmZlckNoYW5uZWwJCT0gIDEsCi0JQ2hhbm5lbE1lc3NhZ2VSZXNjaW5kQ2hhbm5lbE9mZmVyCT0gIDIsCi0JQ2hhbm5lbE1lc3NhZ2VSZXF1ZXN0T2ZmZXJzCQk9ICAzLAotCUNoYW5uZWxNZXNzYWdlQWxsT2ZmZXJzRGVsaXZlcmVkCT0gIDQsCi0JQ2hhbm5lbE1lc3NhZ2VPcGVuQ2hhbm5lbAkJPSAgNSwKLQlDaGFubmVsTWVzc2FnZU9wZW5DaGFubmVsUmVzdWx0CQk9ICA2LAotCUNoYW5uZWxNZXNzYWdlQ2xvc2VDaGFubmVsCQk9ICA3LAotCUNoYW5uZWxNZXNzYWdlR3BhZGxIZWFkZXIJCT0gIDgsCi0JQ2hhbm5lbE1lc3NhZ2VHcGFkbEJvZHkJCQk9ICA5LAotCUNoYW5uZWxNZXNzYWdlR3BhZGxDcmVhdGVkCQk9IDEwLAotCUNoYW5uZWxNZXNzYWdlR3BhZGxUZWFyZG93bgkJPSAxMSwKLQlDaGFubmVsTWVzc2FnZUdwYWRsVG9ybmRvd24JCT0gMTIsCi0JQ2hhbm5lbE1lc3NhZ2VSZWxJZFJlbGVhc2VkCQk9IDEzLAotCUNoYW5uZWxNZXNzYWdlSW5pdGlhdGVDb250YWN0CQk9IDE0LAotCUNoYW5uZWxNZXNzYWdlVmVyc2lvblJlc3BvbnNlCQk9IDE1LAotCUNoYW5uZWxNZXNzYWdlVW5sb2FkCQkJPSAxNiwKKwlDSEFOTkVMTVNHX0lOVkFMSUQJCQk9ICAwLAorCUNIQU5ORUxNU0dfT0ZGRVJDSEFOTkVMCQk9ICAxLAorCUNIQU5ORUxNU0dfUkVTQ0lORF9DSEFOTkVMT0ZGRVIJPSAgMiwKKwlDSEFOTkVMTVNHX1JFUVVFU1RPRkZFUlMJCT0gIDMsCisJQ0hBTk5FTE1TR19BTExPRkZFUlNfREVMSVZFUkVECT0gIDQsCisJQ0hBTk5FTE1TR19PUEVOQ0hBTk5FTAkJPSAgNSwKKwlDSEFOTkVMTVNHX09QRU5DSEFOTkVMX1JFU1VMVAkJPSAgNiwKKwlDSEFOTkVMTVNHX0NMT1NFQ0hBTk5FTAkJPSAgNywKKwlDSEFOTkVMTVNHX0dQQURMX0hFQURFUgkJPSAgOCwKKwlDSEFOTkVMTVNHX0dQQURMX0JPRFkJCQk9ICA5LAorCUNIQU5ORUxNU0dfR1BBRExfQ1JFQVRFRAkJPSAxMCwKKwlDSEFOTkVMTVNHX0dQQURMX1RFQVJET1dOCQk9IDExLAorCUNIQU5ORUxNU0dfR1BBRExfVE9STkRPV04JCT0gMTIsCisJQ0hBTk5FTE1TR19SRUxJRF9SRUxFQVNFRAkJPSAxMywKKwlDSEFOTkVMTVNHX0lOSVRJQVRFX0NPTlRBQ1QJCT0gMTQsCisJQ0hBTk5FTE1TR19WRVJTSU9OX1JFU1BPTlNFCQk9IDE1LAorCUNIQU5ORUxNU0dfVU5MT0FECQkJPSAxNiwKICNpZmRlZiBWTUJVU19GRUFUVVJFX1BBUkVOVF9PUl9QRUVSX01FTU9SWV9NQVBQRURfSU5UT19BX0NISUxECi0JQ2hhbm5lbE1lc3NhZ2VWaWV3UmFuZ2VBZGQJCT0gMTcsCi0JQ2hhbm5lbE1lc3NhZ2VWaWV3UmFuZ2VSZW1vdmUJCT0gMTgsCisJQ0hBTk5FTE1TR19WSUVXUkFOR0VfQURECQk9IDE3LAorCUNIQU5ORUxNU0dfVklFV1JBTkdFX1JFTU9WRQkJPSAxOCwKICNlbmRpZgotCUNoYW5uZWxNZXNzYWdlQ291bnQKKwlDSEFOTkVMTVNHX0NPVU5UCiB9OwogCiBzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciB7Ci0JZW51bSB2bWJ1c19jaGFubmVsX21lc3NhZ2VfdHlwZSBNZXNzYWdlVHlwZTsKLQl1MzIgUGFkZGluZzsKKwllbnVtIHZtYnVzX2NoYW5uZWxfbWVzc2FnZV90eXBlIG1zZ3R5cGU7CisJdTMyIHBhZGRpbmc7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKiBRdWVyeSBWTUJ1cyBWZXJzaW9uIHBhcmFtZXRlcnMgKi8KIHN0cnVjdCB2bWJ1c19jaGFubmVsX3F1ZXJ5X3ZtYnVzX3ZlcnNpb24gewotCXN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyIEhlYWRlcjsKLQl1MzIgVmVyc2lvbjsKKwlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciBoZWFkZXI7CisJdTMyIHZlcnNpb247CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKiBWTUJ1cyBWZXJzaW9uIFN1cHBvcnRlZCBwYXJhbWV0ZXJzICovCiBzdHJ1Y3Qgdm1idXNfY2hhbm5lbF92ZXJzaW9uX3N1cHBvcnRlZCB7Ci0Jc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgSGVhZGVyOwotCWJvb2wgVmVyc2lvblN1cHBvcnRlZDsKKwlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciBoZWFkZXI7CisJYm9vbCB2ZXJzaW9uX3N1cHBvcnRlZDsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8qIE9mZmVyIENoYW5uZWwgcGFyYW1ldGVycyAqLwogc3RydWN0IHZtYnVzX2NoYW5uZWxfb2ZmZXJfY2hhbm5lbCB7Ci0Jc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgSGVhZGVyOwotCXN0cnVjdCB2bWJ1c19jaGFubmVsX29mZmVyIE9mZmVyOwotCXUzMiBDaGlsZFJlbElkOwotCXU4IE1vbml0b3JJZDsKLQlib29sIE1vbml0b3JBbGxvY2F0ZWQ7CisJc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgaGVhZGVyOworCXN0cnVjdCB2bWJ1c19jaGFubmVsX29mZmVyIG9mZmVyOworCXUzMiBjaGlsZF9yZWxpZDsKKwl1OCBtb25pdG9yaWQ7CisJYm9vbCBtb25pdG9yX2FsbG9jYXRlZDsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8qIFJlc2NpbmQgT2ZmZXIgcGFyYW1ldGVycyAqLwogc3RydWN0IHZtYnVzX2NoYW5uZWxfcmVzY2luZF9vZmZlciB7Ci0Jc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgSGVhZGVyOwotCXUzMiBDaGlsZFJlbElkOworCXN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyIGhlYWRlcjsKKwl1MzIgY2hpbGRfcmVsaWQ7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKgpAQCAtMTAwLDQzICsxMDAsNDMgQEAKIAogLyogT3BlbiBDaGFubmVsIHBhcmFtZXRlcnMgKi8KIHN0cnVjdCB2bWJ1c19jaGFubmVsX29wZW5fY2hhbm5lbCB7Ci0Jc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgSGVhZGVyOworCXN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyIGhlYWRlcjsKIAogCS8qIElkZW50aWZpZXMgdGhlIHNwZWNpZmljIFZNQnVzIGNoYW5uZWwgdGhhdCBpcyBiZWluZyBvcGVuZWQuICovCi0JdTMyIENoaWxkUmVsSWQ7CisJdTMyIGNoaWxkX3JlbGlkOwogCiAJLyogSUQgbWFraW5nIGEgcGFydGljdWxhciBvcGVuIHJlcXVlc3QgYXQgYSBjaGFubmVsIG9mZmVyIHVuaXF1ZS4gKi8KLQl1MzIgT3BlbklkOworCXUzMiBvcGVuaWQ7CiAKIAkvKiBHUEFETCBmb3IgdGhlIGNoYW5uZWwncyByaW5nIGJ1ZmZlci4gKi8KLQl1MzIgUmluZ0J1ZmZlckdwYWRsSGFuZGxlOworCXUzMiByaW5nYnVmZmVyX2dwYWRsaGFuZGxlOwogCiAJLyogR1BBREwgZm9yIHRoZSBjaGFubmVsJ3Mgc2VydmVyIGNvbnRleHQgc2F2ZSBhcmVhLiAqLwotCXUzMiBTZXJ2ZXJDb250ZXh0QXJlYUdwYWRsSGFuZGxlOworCXUzMiBzZXJ2ZXJfY29udGV4dGFyZWFfZ3BhZGxoYW5kbGU7CiAKIAkvKgogCSogVGhlIHVwc3RyZWFtIHJpbmcgYnVmZmVyIGJlZ2lucyBhdCBvZmZzZXQgemVybyBpbiB0aGUgbWVtb3J5CiAJKiBkZXNjcmliZWQgYnkgUmluZ0J1ZmZlckdwYWRsSGFuZGxlLiBUaGUgZG93bnN0cmVhbSByaW5nIGJ1ZmZlcgogCSogZm9sbG93cyBpdCBhdCB0aGlzIG9mZnNldCAoaW4gcGFnZXMpLgogCSovCi0JdTMyIERvd25zdHJlYW1SaW5nQnVmZmVyUGFnZU9mZnNldDsKKwl1MzIgZG93bnN0cmVhbV9yaW5nYnVmZmVyX3BhZ2VvZmZzZXQ7CiAKIAkvKiBVc2VyLXNwZWNpZmljIGRhdGEgdG8gYmUgcGFzc2VkIGFsb25nIHRvIHRoZSBzZXJ2ZXIgZW5kcG9pbnQuICovCi0JdW5zaWduZWQgY2hhciBVc2VyRGF0YVtNQVhfVVNFUl9ERUZJTkVEX0JZVEVTXTsKKwl1bnNpZ25lZCBjaGFyIHVzZXJkYXRhW01BWF9VU0VSX0RFRklORURfQllURVNdOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyogT3BlbiBDaGFubmVsIFJlc3VsdCBwYXJhbWV0ZXJzICovCiBzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9vcGVuX3Jlc3VsdCB7Ci0Jc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgSGVhZGVyOwotCXUzMiBDaGlsZFJlbElkOwotCXUzMiBPcGVuSWQ7Ci0JdTMyIFN0YXR1czsKKwlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciBoZWFkZXI7CisJdTMyIGNoaWxkX3JlbGlkOworCXUzMiBvcGVuaWQ7CisJdTMyIHN0YXR1czsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8qIENsb3NlIGNoYW5uZWwgcGFyYW1ldGVyczsgKi8KIHN0cnVjdCB2bWJ1c19jaGFubmVsX2Nsb3NlX2NoYW5uZWwgewotCXN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyIEhlYWRlcjsKLQl1MzIgQ2hpbGRSZWxJZDsKKwlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciBoZWFkZXI7CisJdTMyIGNoaWxkX3JlbGlkOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyogQ2hhbm5lbCBNZXNzYWdlIEdQQURMICovCkBAIC0xNTEsNzIgKzE1MSw3MiBAQAogICogZm9sbG93LXVwIHBhY2tldCB0aGF0IGNvbnRhaW5zIG1vcmUuCiAgKi8KIHN0cnVjdCB2bWJ1c19jaGFubmVsX2dwYWRsX2hlYWRlciB7Ci0Jc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgSGVhZGVyOwotCXUzMiBDaGlsZFJlbElkOwotCXUzMiBHcGFkbDsKLQl1MTYgUmFuZ2VCdWZMZW47Ci0JdTE2IFJhbmdlQ291bnQ7Ci0Jc3RydWN0IGdwYV9yYW5nZSBSYW5nZVswXTsKKwlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciBoZWFkZXI7CisJdTMyIGNoaWxkX3JlbGlkOworCXUzMiBncGFkbDsKKwl1MTYgcmFuZ2VfYnVmbGVuOworCXUxNiByYW5nZWNvdW50OworCXN0cnVjdCBncGFfcmFuZ2UgcmFuZ2VbMF07CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKiBUaGlzIGlzIHRoZSBmb2xsb3d1cCBwYWNrZXQgdGhhdCBjb250YWlucyBtb3JlIFBGTnMuICovCiBzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9ncGFkbF9ib2R5IHsKLQlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciBIZWFkZXI7Ci0JdTMyIE1lc3NhZ2VOdW1iZXI7Ci0JdTMyIEdwYWRsOwotCXU2NCBQZm5bMF07CisJc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgaGVhZGVyOworCXUzMiBtc2dudW1iZXI7CisJdTMyIGdwYWRsOworCXU2NCBwZm5bMF07CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9ncGFkbF9jcmVhdGVkIHsKLQlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciBIZWFkZXI7Ci0JdTMyIENoaWxkUmVsSWQ7Ci0JdTMyIEdwYWRsOwotCXUzMiBDcmVhdGlvblN0YXR1czsKKwlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciBoZWFkZXI7CisJdTMyIGNoaWxkX3JlbGlkOworCXUzMiBncGFkbDsKKwl1MzIgY3JlYXRpb25fc3RhdHVzOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogc3RydWN0IHZtYnVzX2NoYW5uZWxfZ3BhZGxfdGVhcmRvd24gewotCXN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyIEhlYWRlcjsKLQl1MzIgQ2hpbGRSZWxJZDsKLQl1MzIgR3BhZGw7CisJc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgaGVhZGVyOworCXUzMiBjaGlsZF9yZWxpZDsKKwl1MzIgZ3BhZGw7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9ncGFkbF90b3JuZG93biB7Ci0Jc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgSGVhZGVyOwotCXUzMiBHcGFkbDsKKwlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciBoZWFkZXI7CisJdTMyIGdwYWRsOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogI2lmZGVmIFZNQlVTX0ZFQVRVUkVfUEFSRU5UX09SX1BFRVJfTUVNT1JZX01BUFBFRF9JTlRPX0FfQ0hJTEQKIHN0cnVjdCB2bWJ1c19jaGFubmVsX3ZpZXdfcmFuZ2VfYWRkIHsKLQlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciBIZWFkZXI7Ci0JUEhZU0lDQUxfQUREUkVTUyBWaWV3UmFuZ2VCYXNlOwotCXU2NCBWaWV3UmFuZ2VMZW5ndGg7Ci0JdTMyIENoaWxkUmVsSWQ7CisJc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgaGVhZGVyOworCVBIWVNJQ0FMX0FERFJFU1Mgdmlld3JhbmdlX2Jhc2U7CisJdTY0IHZpZXdyYW5nZV9sZW5ndGg7CisJdTMyIGNoaWxkX3JlbGlkOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogc3RydWN0IHZtYnVzX2NoYW5uZWxfdmlld19yYW5nZV9yZW1vdmUgewotCXN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyIEhlYWRlcjsKLQlQSFlTSUNBTF9BRERSRVNTIFZpZXdSYW5nZUJhc2U7Ci0JdTMyIENoaWxkUmVsSWQ7CisJc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgaGVhZGVyOworCVBIWVNJQ0FMX0FERFJFU1Mgdmlld3JhbmdlX2Jhc2U7CisJdTMyIGNoaWxkX3JlbGlkOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKICNlbmRpZgogCiBzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9yZWxpZF9yZWxlYXNlZCB7Ci0Jc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgSGVhZGVyOwotCXUzMiBDaGlsZFJlbElkOworCXN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyIGhlYWRlcjsKKwl1MzIgY2hpbGRfcmVsaWQ7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9pbml0aWF0ZV9jb250YWN0IHsKLQlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciBIZWFkZXI7Ci0JdTMyIFZNQnVzVmVyc2lvblJlcXVlc3RlZDsKLQl1MzIgUGFkZGluZzI7Ci0JdTY0IEludGVycnVwdFBhZ2U7Ci0JdTY0IE1vbml0b3JQYWdlMTsKLQl1NjQgTW9uaXRvclBhZ2UyOworCXN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyIGhlYWRlcjsKKwl1MzIgdm1idXNfdmVyc2lvbl9yZXF1ZXN0ZWQ7CisJdTMyIHBhZGRpbmcyOworCXU2NCBpbnRlcnJ1cHRfcGFnZTsKKwl1NjQgbW9uaXRvcl9wYWdlMTsKKwl1NjQgbW9uaXRvcl9wYWdlMjsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHN0cnVjdCB2bWJ1c19jaGFubmVsX3ZlcnNpb25fcmVzcG9uc2UgewotCXN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyIEhlYWRlcjsKLQlib29sIFZlcnNpb25TdXBwb3J0ZWQ7CisJc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgaGVhZGVyOworCWJvb2wgdmVyc2lvbl9zdXBwb3J0ZWQ7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBlbnVtIHZtYnVzX2NoYW5uZWxfc3RhdGUgewpAQCAtMjI2LDU0ICsyMjYsNTUgQEAKIH07CiAKIHN0cnVjdCB2bWJ1c19jaGFubmVsIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIExpc3RFbnRyeTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3RlbnRyeTsKIAotCXN0cnVjdCBodl9kZXZpY2UgKkRldmljZU9iamVjdDsKKwlzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2Vfb2JqOwogCiAJc3RydWN0IHRpbWVyX2xpc3QgcG9sbF90aW1lcjsgLyogU0EtMTExIHdvcmthcm91bmQgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKIAotCWVudW0gdm1idXNfY2hhbm5lbF9zdGF0ZSBTdGF0ZTsKKwllbnVtIHZtYnVzX2NoYW5uZWxfc3RhdGUgc3RhdGU7CiAKLQlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9vZmZlcl9jaGFubmVsIE9mZmVyTXNnOworCXN0cnVjdCB2bWJ1c19jaGFubmVsX29mZmVyX2NoYW5uZWwgb2ZmZXJtc2c7CiAJLyoKIAkgKiBUaGVzZSBhcmUgYmFzZWQgb24gdGhlIE9mZmVyTXNnLk1vbml0b3JJZC4KIAkgKiBTYXZlIGl0IGhlcmUgZm9yIGVhc3kgYWNjZXNzLgogCSAqLwotCXU4IE1vbml0b3JHcm91cDsKLQl1OCBNb25pdG9yQml0OworCXU4IG1vbml0b3JfZ3JwOworCXU4IG1vbml0b3JfYml0OwogCi0JdTMyIFJpbmdCdWZmZXJHcGFkbEhhbmRsZTsKKwl1MzIgcmluZ2J1ZmZlcl9ncGFkbGhhbmRsZTsKIAogCS8qIEFsbG9jYXRlZCBtZW1vcnkgZm9yIHJpbmcgYnVmZmVyICovCi0Jdm9pZCAqUmluZ0J1ZmZlclBhZ2VzOwotCXUzMiBSaW5nQnVmZmVyUGFnZUNvdW50OwotCXN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvIE91dGJvdW5kOwkvKiBzZW5kIHRvIHBhcmVudCAqLwotCXN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvIEluYm91bmQ7CS8qIHJlY2VpdmUgZnJvbSBwYXJlbnQgKi8KKwl2b2lkICpyaW5nYnVmZmVyX3BhZ2VzOworCXUzMiByaW5nYnVmZmVyX3BhZ2Vjb3VudDsKKwlzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyBvdXRib3VuZDsJLyogc2VuZCB0byBwYXJlbnQgKi8KKwlzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyBpbmJvdW5kOwkvKiByZWNlaXZlIGZyb20gcGFyZW50ICovCiAJc3BpbmxvY2tfdCBpbmJvdW5kX2xvY2s7Ci0Jc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKkNvbnRyb2xXUTsKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqY29udHJvbHdxOwogCiAJLyogQ2hhbm5lbCBjYWxsYmFjayBhcmUgaW52b2tlZCBpbiB0aGlzIHdvcmtxdWV1ZSBjb250ZXh0ICovCiAJLyogSEFORExFIGRhdGFXb3JrUXVldWU7ICovCiAKLQl2b2lkICgqT25DaGFubmVsQ2FsbGJhY2spKHZvaWQgKmNvbnRleHQpOwotCXZvaWQgKkNoYW5uZWxDYWxsYmFja0NvbnRleHQ7CisJdm9pZCAoKm9uY2hhbm5lbF9jYWxsYmFjaykodm9pZCAqY29udGV4dCk7CisJdm9pZCAqY2hhbm5lbF9jYWxsYmFja19jb250ZXh0OwogfTsKIAogc3RydWN0IHZtYnVzX2NoYW5uZWxfZGVidWdfaW5mbyB7Ci0JdTMyIFJlbElkOwotCWVudW0gdm1idXNfY2hhbm5lbF9zdGF0ZSBTdGF0ZTsKLQlzdHJ1Y3QgaHZfZ3VpZCBJbnRlcmZhY2VUeXBlOwotCXN0cnVjdCBodl9ndWlkIEludGVyZmFjZUluc3RhbmNlOwotCXUzMiBNb25pdG9ySWQ7Ci0JdTMyIFNlcnZlck1vbml0b3JQZW5kaW5nOwotCXUzMiBTZXJ2ZXJNb25pdG9yTGF0ZW5jeTsKLQl1MzIgU2VydmVyTW9uaXRvckNvbm5lY3Rpb25JZDsKLQl1MzIgQ2xpZW50TW9uaXRvclBlbmRpbmc7Ci0JdTMyIENsaWVudE1vbml0b3JMYXRlbmN5OwotCXUzMiBDbGllbnRNb25pdG9yQ29ubmVjdGlvbklkOworCXUzMiByZWxpZDsKKwllbnVtIHZtYnVzX2NoYW5uZWxfc3RhdGUgc3RhdGU7CisJc3RydWN0IGh2X2d1aWQgaW50ZXJmYWNldHlwZTsKKwlzdHJ1Y3QgaHZfZ3VpZCBpbnRlcmZhY2VfaW5zdGFuY2U7CisJdTMyIG1vbml0b3JpZDsKKwl1MzIgc2VydmVybW9uaXRvcl9wZW5kaW5nOworCXUzMiBzZXJ2ZXJtb25pdG9yX2xhdGVuY3k7CisJdTMyIHNlcnZlcm1vbml0b3JfY29ubmVjdGlvbmlkOworCXUzMiBjbGllbnRtb25pdG9yX3BlbmRpbmc7CisJdTMyIGNsaWVudG1vbml0b3JfbGF0ZW5jeTsKKwl1MzIgY2xpZW50bW9uaXRvcl9jb25uZWN0aW9uaWQ7CiAKLQlzdHJ1Y3QgaHZfcmluZ19idWZmZXJfZGVidWdfaW5mbyBJbmJvdW5kOwotCXN0cnVjdCBodl9yaW5nX2J1ZmZlcl9kZWJ1Z19pbmZvIE91dGJvdW5kOworCXN0cnVjdCBodl9yaW5nX2J1ZmZlcl9kZWJ1Z19pbmZvIGluYm91bmQ7CisJc3RydWN0IGh2X3JpbmdfYnVmZmVyX2RlYnVnX2luZm8gb3V0Ym91bmQ7CiB9OwogCiAvKgpAQCAtMjgyLDI4ICsyODMsMjggQEAKICAqLwogc3RydWN0IHZtYnVzX2NoYW5uZWxfbXNnaW5mbyB7CiAJLyogQm9va2tlZXBpbmcgc3R1ZmYgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIE1zZ0xpc3RFbnRyeTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG1zZ2xpc3RlbnRyeTsKIAogCS8qIFNvIGZhciwgdGhpcyBpcyBvbmx5IHVzZWQgdG8gaGFuZGxlIGdwYWRsIGJvZHkgbWVzc2FnZSAqLwotCXN0cnVjdCBsaXN0X2hlYWQgU3ViTXNnTGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHN1Ym1zZ2xpc3Q7CiAKIAkvKiBTeW5jaHJvbml6ZSB0aGUgcmVxdWVzdC9yZXNwb25zZSBpZiBuZWVkZWQgKi8KLQlzdHJ1Y3Qgb3NkX3dhaXRldmVudCAqV2FpdEV2ZW50OworCXN0cnVjdCBvc2Rfd2FpdGV2ZW50ICp3YWl0ZXZlbnQ7CiAKIAl1bmlvbiB7Ci0JCXN0cnVjdCB2bWJ1c19jaGFubmVsX3ZlcnNpb25fc3VwcG9ydGVkIFZlcnNpb25TdXBwb3J0ZWQ7Ci0JCXN0cnVjdCB2bWJ1c19jaGFubmVsX29wZW5fcmVzdWx0IE9wZW5SZXN1bHQ7Ci0JCXN0cnVjdCB2bWJ1c19jaGFubmVsX2dwYWRsX3Rvcm5kb3duIEdwYWRsVG9ybmRvd247Ci0JCXN0cnVjdCB2bWJ1c19jaGFubmVsX2dwYWRsX2NyZWF0ZWQgR3BhZGxDcmVhdGVkOwotCQlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF92ZXJzaW9uX3Jlc3BvbnNlIFZlcnNpb25SZXNwb25zZTsKLQl9IFJlc3BvbnNlOworCQlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF92ZXJzaW9uX3N1cHBvcnRlZCB2ZXJzaW9uX3N1cHBvcnRlZDsKKwkJc3RydWN0IHZtYnVzX2NoYW5uZWxfb3Blbl9yZXN1bHQgb3Blbl9yZXN1bHQ7CisJCXN0cnVjdCB2bWJ1c19jaGFubmVsX2dwYWRsX3Rvcm5kb3duIGdwYWRsX3Rvcm5kb3duOworCQlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9ncGFkbF9jcmVhdGVkIGdwYWRsX2NyZWF0ZWQ7CisJCXN0cnVjdCB2bWJ1c19jaGFubmVsX3ZlcnNpb25fcmVzcG9uc2UgdmVyc2lvbl9yZXNwb25zZTsKKwl9IHJlc3BvbnNlOwogCi0JdTMyIE1lc3NhZ2VTaXplOworCXUzMiBtc2dzaXplOwogCS8qCiAJICogVGhlIGNoYW5uZWwgbWVzc2FnZSB0aGF0IGdvZXMgb3V0IG9uIHRoZSAid2lyZSIuCiAJICogSXQgd2lsbCBjb250YWluIGF0IG1pbmltdW0gdGhlIFZNQlVTX0NIQU5ORUxfTUVTU0FHRV9IRUFERVIgaGVhZGVyCiAJICovCi0JdW5zaWduZWQgY2hhciBNc2dbMF07CisJdW5zaWduZWQgY2hhciBtc2dbMF07CiB9OwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9jb25uZWN0aW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvaHYvY29ubmVjdGlvbi5jCmluZGV4IGY4NDc3MDcuLmMyZTI5OGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi9jb25uZWN0aW9uLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L2Nvbm5lY3Rpb24uYwpAQCAtNjYsNyArNjYsNyBAQAogCSAqIFNldHVwIHRoZSB2bWJ1cyBldmVudCBjb25uZWN0aW9uIGZvciBjaGFubmVsIGludGVycnVwdAogCSAqIGFic3RyYWN0aW9uIHN0dWZmCiAJICovCi0JZ1ZtYnVzQ29ubmVjdGlvbi5JbnRlcnJ1cHRQYWdlID0gb3NkX1BhZ2VBbGxvYygxKTsKKwlnVm1idXNDb25uZWN0aW9uLkludGVycnVwdFBhZ2UgPSBvc2RfcGFnZV9hbGxvYygxKTsKIAlpZiAoZ1ZtYnVzQ29ubmVjdGlvbi5JbnRlcnJ1cHRQYWdlID09IE5VTEwpIHsKIAkJcmV0ID0gLTE7CiAJCWdvdG8gQ2xlYW51cDsKQEAgLTgxLDcgKzgxLDcgQEAKIAkgKiBTZXR1cCB0aGUgbW9uaXRvciBub3RpZmljYXRpb24gZmFjaWxpdHkuIFRoZSAxc3QgcGFnZSBmb3IKIAkgKiBwYXJlbnQtPmNoaWxkIGFuZCB0aGUgMm5kIHBhZ2UgZm9yIGNoaWxkLT5wYXJlbnQKIAkgKi8KLQlnVm1idXNDb25uZWN0aW9uLk1vbml0b3JQYWdlcyA9IG9zZF9QYWdlQWxsb2MoMik7CisJZ1ZtYnVzQ29ubmVjdGlvbi5Nb25pdG9yUGFnZXMgPSBvc2RfcGFnZV9hbGxvYygyKTsKIAlpZiAoZ1ZtYnVzQ29ubmVjdGlvbi5Nb25pdG9yUGFnZXMgPT0gTlVMTCkgewogCQlyZXQgPSAtMTsKIAkJZ290byBDbGVhbnVwOwpAQCAtOTUsMTkgKzk1LDE5IEBACiAJCWdvdG8gQ2xlYW51cDsKIAl9CiAKLQltc2dJbmZvLT5XYWl0RXZlbnQgPSBvc2RfV2FpdEV2ZW50Q3JlYXRlKCk7Ci0JaWYgKCFtc2dJbmZvLT5XYWl0RXZlbnQpIHsKKwltc2dJbmZvLT53YWl0ZXZlbnQgPSBvc2Rfd2FpdGV2ZW50X2NyZWF0ZSgpOworCWlmICghbXNnSW5mby0+d2FpdGV2ZW50KSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gQ2xlYW51cDsKIAl9CiAKLQltc2cgPSAoc3RydWN0IHZtYnVzX2NoYW5uZWxfaW5pdGlhdGVfY29udGFjdCAqKW1zZ0luZm8tPk1zZzsKKwltc2cgPSAoc3RydWN0IHZtYnVzX2NoYW5uZWxfaW5pdGlhdGVfY29udGFjdCAqKW1zZ0luZm8tPm1zZzsKIAotCW1zZy0+SGVhZGVyLk1lc3NhZ2VUeXBlID0gQ2hhbm5lbE1lc3NhZ2VJbml0aWF0ZUNvbnRhY3Q7Ci0JbXNnLT5WTUJ1c1ZlcnNpb25SZXF1ZXN0ZWQgPSBWTUJVU19SRVZJU0lPTl9OVU1CRVI7Ci0JbXNnLT5JbnRlcnJ1cHRQYWdlID0gdmlydF90b19waHlzKGdWbWJ1c0Nvbm5lY3Rpb24uSW50ZXJydXB0UGFnZSk7Ci0JbXNnLT5Nb25pdG9yUGFnZTEgPSB2aXJ0X3RvX3BoeXMoZ1ZtYnVzQ29ubmVjdGlvbi5Nb25pdG9yUGFnZXMpOwotCW1zZy0+TW9uaXRvclBhZ2UyID0gdmlydF90b19waHlzKAorCW1zZy0+aGVhZGVyLm1zZ3R5cGUgPSBDSEFOTkVMTVNHX0lOSVRJQVRFX0NPTlRBQ1Q7CisJbXNnLT52bWJ1c192ZXJzaW9uX3JlcXVlc3RlZCA9IFZNQlVTX1JFVklTSU9OX05VTUJFUjsKKwltc2ctPmludGVycnVwdF9wYWdlID0gdmlydF90b19waHlzKGdWbWJ1c0Nvbm5lY3Rpb24uSW50ZXJydXB0UGFnZSk7CisJbXNnLT5tb25pdG9yX3BhZ2UxID0gdmlydF90b19waHlzKGdWbWJ1c0Nvbm5lY3Rpb24uTW9uaXRvclBhZ2VzKTsKKwltc2ctPm1vbml0b3JfcGFnZTIgPSB2aXJ0X3RvX3BoeXMoCiAJCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZylnVm1idXNDb25uZWN0aW9uLk1vbml0b3JQYWdlcyArCiAJCQkJIFBBR0VfU0laRSkpOwogCkBAIC0xMTYsMzAgKzExNiwzMCBAQAogCSAqIHJlY2VpdmUgdGhlIHJlc3BvbnNlIGJlZm9yZSByZXR1cm5pbmcgZnJvbSB0aGlzIHJvdXRpbmUKIAkgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZ1ZtYnVzQ29ubmVjdGlvbi5jaGFubmVsbXNnX2xvY2ssIGZsYWdzKTsKLQlsaXN0X2FkZF90YWlsKCZtc2dJbmZvLT5Nc2dMaXN0RW50cnksCisJbGlzdF9hZGRfdGFpbCgmbXNnSW5mby0+bXNnbGlzdGVudHJ5LAogCQkgICAgICAmZ1ZtYnVzQ29ubmVjdGlvbi5DaGFubmVsTXNnTGlzdCk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnVm1idXNDb25uZWN0aW9uLmNoYW5uZWxtc2dfbG9jaywgZmxhZ3MpOwogCiAJRFBSSU5UX0RCRyhWTUJVUywgIlZtYnVzIGNvbm5lY3Rpb24gLSBpbnRlcnJ1cHQgcGZuICVsbHgsICIKIAkJICAgIm1vbml0b3IxIHBmbiAlbGx4LCwgbW9uaXRvcjIgcGZuICVsbHgiLAotCQkgICBtc2ctPkludGVycnVwdFBhZ2UsIG1zZy0+TW9uaXRvclBhZ2UxLCBtc2ctPk1vbml0b3JQYWdlMik7CisJCSAgIG1zZy0+aW50ZXJydXB0X3BhZ2UsIG1zZy0+bW9uaXRvcl9wYWdlMSwgbXNnLT5tb25pdG9yX3BhZ2UyKTsKIAogCURQUklOVF9EQkcoVk1CVVMsICJTZW5kaW5nIGNoYW5uZWwgaW5pdGlhdGUgbXNnLi4uIik7CiAJcmV0ID0gVm1idXNQb3N0TWVzc2FnZShtc2csCiAJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB2bWJ1c19jaGFubmVsX2luaXRpYXRlX2NvbnRhY3QpKTsKIAlpZiAocmV0ICE9IDApIHsKLQkJbGlzdF9kZWwoJm1zZ0luZm8tPk1zZ0xpc3RFbnRyeSk7CisJCWxpc3RfZGVsKCZtc2dJbmZvLT5tc2dsaXN0ZW50cnkpOwogCQlnb3RvIENsZWFudXA7CiAJfQogCiAJLyogV2FpdCBmb3IgdGhlIGNvbm5lY3Rpb24gcmVzcG9uc2UgKi8KLQlvc2RfV2FpdEV2ZW50V2FpdChtc2dJbmZvLT5XYWl0RXZlbnQpOworCW9zZF93YWl0ZXZlbnRfd2FpdChtc2dJbmZvLT53YWl0ZXZlbnQpOwogCi0JbGlzdF9kZWwoJm1zZ0luZm8tPk1zZ0xpc3RFbnRyeSk7CisJbGlzdF9kZWwoJm1zZ0luZm8tPm1zZ2xpc3RlbnRyeSk7CiAKIAkvKiBDaGVjayBpZiBzdWNjZXNzZnVsICovCi0JaWYgKG1zZ0luZm8tPlJlc3BvbnNlLlZlcnNpb25SZXNwb25zZS5WZXJzaW9uU3VwcG9ydGVkKSB7CisJaWYgKG1zZ0luZm8tPnJlc3BvbnNlLnZlcnNpb25fcmVzcG9uc2UudmVyc2lvbl9zdXBwb3J0ZWQpIHsKIAkJRFBSSU5UX0lORk8oVk1CVVMsICJWbWJ1cyBjb25uZWN0ZWQhISIpOwogCQlnVm1idXNDb25uZWN0aW9uLkNvbm5lY3RTdGF0ZSA9IENvbm5lY3RlZDsKIApAQCAtMTUxLDcgKzE1MSw3IEBACiAJCWdvdG8gQ2xlYW51cDsKIAl9CiAKLQlrZnJlZShtc2dJbmZvLT5XYWl0RXZlbnQpOworCWtmcmVlKG1zZ0luZm8tPndhaXRldmVudCk7CiAJa2ZyZWUobXNnSW5mbyk7CiAJcmV0dXJuIDA7CiAKQEAgLTE2MiwxNyArMTYyLDE3IEBACiAJCWRlc3Ryb3lfd29ya3F1ZXVlKGdWbWJ1c0Nvbm5lY3Rpb24uV29ya1F1ZXVlKTsKIAogCWlmIChnVm1idXNDb25uZWN0aW9uLkludGVycnVwdFBhZ2UpIHsKLQkJb3NkX1BhZ2VGcmVlKGdWbWJ1c0Nvbm5lY3Rpb24uSW50ZXJydXB0UGFnZSwgMSk7CisJCW9zZF9wYWdlX2ZyZWUoZ1ZtYnVzQ29ubmVjdGlvbi5JbnRlcnJ1cHRQYWdlLCAxKTsKIAkJZ1ZtYnVzQ29ubmVjdGlvbi5JbnRlcnJ1cHRQYWdlID0gTlVMTDsKIAl9CiAKIAlpZiAoZ1ZtYnVzQ29ubmVjdGlvbi5Nb25pdG9yUGFnZXMpIHsKLQkJb3NkX1BhZ2VGcmVlKGdWbWJ1c0Nvbm5lY3Rpb24uTW9uaXRvclBhZ2VzLCAyKTsKKwkJb3NkX3BhZ2VfZnJlZShnVm1idXNDb25uZWN0aW9uLk1vbml0b3JQYWdlcywgMik7CiAJCWdWbWJ1c0Nvbm5lY3Rpb24uTW9uaXRvclBhZ2VzID0gTlVMTDsKIAl9CiAKIAlpZiAobXNnSW5mbykgewotCQlrZnJlZShtc2dJbmZvLT5XYWl0RXZlbnQpOworCQlrZnJlZShtc2dJbmZvLT53YWl0ZXZlbnQpOwogCQlrZnJlZShtc2dJbmZvKTsKIAl9CiAKQEAgLTE5NSwxNCArMTk1LDE0IEBACiAJaWYgKCFtc2cpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JbXNnLT5NZXNzYWdlVHlwZSA9IENoYW5uZWxNZXNzYWdlVW5sb2FkOworCW1zZy0+bXNndHlwZSA9IENIQU5ORUxNU0dfVU5MT0FEOwogCiAJcmV0ID0gVm1idXNQb3N0TWVzc2FnZShtc2csCiAJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyKSk7CiAJaWYgKHJldCAhPSAwKQogCQlnb3RvIENsZWFudXA7CiAKLQlvc2RfUGFnZUZyZWUoZ1ZtYnVzQ29ubmVjdGlvbi5JbnRlcnJ1cHRQYWdlLCAxKTsKKwlvc2RfcGFnZV9mcmVlKGdWbWJ1c0Nvbm5lY3Rpb24uSW50ZXJydXB0UGFnZSwgMSk7CiAKIAkvKiBUT0RPOiBpdGVyYXRlIHRocnUgdGhlIG1zZyBsaXN0IGFuZCBmcmVlIHVwICovCiAJZGVzdHJveV93b3JrcXVldWUoZ1ZtYnVzQ29ubmVjdGlvbi5Xb3JrUXVldWUpOwpAQCAtMjI2LDggKzIyNiw4IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZnVm1idXNDb25uZWN0aW9uLmNoYW5uZWxfbG9jaywgZmxhZ3MpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hhbm5lbCwgJmdWbWJ1c0Nvbm5lY3Rpb24uQ2hhbm5lbExpc3QsIExpc3RFbnRyeSkgewotCQlpZiAoY2hhbm5lbC0+T2ZmZXJNc2cuQ2hpbGRSZWxJZCA9PSByZWxJZCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hhbm5lbCwgJmdWbWJ1c0Nvbm5lY3Rpb24uQ2hhbm5lbExpc3QsIGxpc3RlbnRyeSkgeworCQlpZiAoY2hhbm5lbC0+b2ZmZXJtc2cuY2hpbGRfcmVsaWQgPT0gcmVsSWQpIHsKIAkJCWZvdW5kQ2hhbm5lbCA9IGNoYW5uZWw7CiAJCQlicmVhazsKIAkJfQpAQCAtMzA5LDkgKzMwOSw5IEBACiB7CiAJdW5pb24gaHZfY29ubmVjdGlvbl9pZCBjb25uSWQ7CiAKLQljb25uSWQuQXN1MzIgPSAwOwotCWNvbm5JZC51LklkID0gVk1CVVNfTUVTU0FHRV9DT05ORUNUSU9OX0lEOwotCXJldHVybiBIdlBvc3RNZXNzYWdlKGNvbm5JZCwgMSwgYnVmZmVyLCBidWZmZXJMZW4pOworCWNvbm5JZC5hc3UzMiA9IDA7CisJY29ubklkLnUuaWQgPSBWTUJVU19NRVNTQUdFX0NPTk5FQ1RJT05fSUQ7CisJcmV0dXJuIGh2X3Bvc3RfbWVzc2FnZShjb25uSWQsIDEsIGJ1ZmZlciwgYnVmZmVyTGVuKTsKIH0KIAogLyoKQEAgLTMyNCw1ICszMjQsNSBAQAogCQkodW5zaWduZWQgbG9uZyAqKWdWbWJ1c0Nvbm5lY3Rpb24uU2VuZEludGVycnVwdFBhZ2UgKwogCQkoY2hpbGRSZWxJZCA+PiA1KSk7CiAKLQlyZXR1cm4gSHZTaWduYWxFdmVudCgpOworCXJldHVybiBodl9zaWduYWxfZXZlbnQoKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9odi5jIGIvZHJpdmVycy9zdGFnaW5nL2h2L2h2LmMKaW5kZXggODZiMWRkZC4uYTM0ZDcxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L2h2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L2h2LmMKQEAgLTI4LDE3ICsyOCwxOCBAQAogI2luY2x1ZGUgInZtYnVzX3ByaXZhdGUuaCIKIAogLyogVGhlIG9uZSBhbmQgb25seSAqLwotc3RydWN0IGh2X2NvbnRleHQgZ0h2Q29udGV4dCA9IHsKLQkuU3luSUNJbml0aWFsaXplZAk9IGZhbHNlLAotCS5IeXBlcmNhbGxQYWdlCQk9IE5VTEwsCi0JLlNpZ25hbEV2ZW50UGFyYW0JPSBOVUxMLAotCS5TaWduYWxFdmVudEJ1ZmZlcgk9IE5VTEwsCitzdHJ1Y3QgaHZfY29udGV4dCBodl9jb250ZXh0ID0geworCS5zeW5pY19pbml0aWFsaXplZAk9IGZhbHNlLAorCS5oeXBlcmNhbGxfcGFnZQkJPSBOVUxMLAorCS5zaWduYWxfZXZlbnRfcGFyYW0JPSBOVUxMLAorCS5zaWduYWxfZXZlbnRfYnVmZmVyCT0gTlVMTCwKIH07CiAKIC8qCi0gKiBIdlF1ZXJ5SHlwZXJ2aXNvclByZXNlbmNlIC0gUXVlcnkgdGhlIGNwdWlkIGZvciBwcmVzZW5zZSBvZiB3aW5kb3dzIGh5cGVydmlzb3IKKyAqIHF1ZXJ5X2h5cGVydmlzb3JfcHJlc2VuY2UKKyAqIC0gUXVlcnkgdGhlIGNwdWlkIGZvciBwcmVzZW5zZSBvZiB3aW5kb3dzIGh5cGVydmlzb3IKICAqLwotc3RhdGljIGludCBIdlF1ZXJ5SHlwZXJ2aXNvclByZXNlbmNlKHZvaWQpCitzdGF0aWMgaW50IHF1ZXJ5X2h5cGVydmlzb3JfcHJlc2VuY2Uodm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgZWF4OwogCXVuc2lnbmVkIGludCBlYng7CkBAIC01MCwyMiArNTEsMjIgQEAKIAllYnggPSAwOwogCWVjeCA9IDA7CiAJZWR4ID0gMDsKLQlvcCA9IEh2Q3B1SWRGdW5jdGlvblZlcnNpb25BbmRGZWF0dXJlczsKKwlvcCA9IEhWQ1BVSURfVkVSU0lPTl9GRUFUVVJFUzsKIAljcHVpZChvcCwgJmVheCwgJmVieCwgJmVjeCwgJmVkeCk7CiAKIAlyZXR1cm4gZWN4ICYgSFZfUFJFU0VOVF9CSVQ7CiB9CiAKIC8qCi0gKiBIdlF1ZXJ5SHlwZXJ2aXNvckluZm8gLSBHZXQgdmVyc2lvbiBpbmZvIG9mIHRoZSB3aW5kb3dzIGh5cGVydmlzb3IKKyAqIHF1ZXJ5X2h5cGVydmlzb3JfaW5mbyAtIEdldCB2ZXJzaW9uIGluZm8gb2YgdGhlIHdpbmRvd3MgaHlwZXJ2aXNvcgogICovCi1zdGF0aWMgaW50IEh2UXVlcnlIeXBlcnZpc29ySW5mbyh2b2lkKQorc3RhdGljIGludCBxdWVyeV9oeXBlcnZpc29yX2luZm8odm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgZWF4OwogCXVuc2lnbmVkIGludCBlYng7CiAJdW5zaWduZWQgaW50IGVjeDsKIAl1bnNpZ25lZCBpbnQgZWR4OwotCXVuc2lnbmVkIGludCBtYXhMZWFmOworCXVuc2lnbmVkIGludCBtYXhfbGVhZjsKIAl1bnNpZ25lZCBpbnQgb3A7CiAKIAkvKgpAQCAtNzYsNyArNzcsNyBAQAogCWVieCA9IDA7CiAJZWN4ID0gMDsKIAllZHggPSAwOwotCW9wID0gSHZDcHVJZEZ1bmN0aW9uSHZWZW5kb3JBbmRNYXhGdW5jdGlvbjsKKwlvcCA9IEhWQ1BVSURfVkVORE9SX01BWEZVTkNUSU9OOwogCWNwdWlkKG9wLCAmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4KTsKIAogCURQUklOVF9JTkZPKFZNQlVTLCAiVmVuZG9yIElEOiAlYyVjJWMlYyVjJWMlYyVjJWMlYyVjJWMiLApAQCAtOTMsMTIgKzk0LDEyIEBACiAJCSAgICAoKGVkeCA+PiAxNikgJiAweEZGKSwKIAkJICAgICgoZWR4ID4+IDI0KSAmIDB4RkYpKTsKIAotCW1heExlYWYgPSBlYXg7CisJbWF4X2xlYWYgPSBlYXg7CiAJZWF4ID0gMDsKIAllYnggPSAwOwogCWVjeCA9IDA7CiAJZWR4ID0gMDsKLQlvcCA9IEh2Q3B1SWRGdW5jdGlvbkh2SW50ZXJmYWNlOworCW9wID0gSFZDUFVJRF9JTlRFUkZBQ0U7CiAJY3B1aWQob3AsICZlYXgsICZlYngsICZlY3gsICZlZHgpOwogCiAJRFBSSU5UX0lORk8oVk1CVVMsICJJbnRlcmZhY2UgSUQ6ICVjJWMlYyVjIiwKQEAgLTEwNywxMiArMTA4LDEyIEBACiAJCSAgICAoKGVheCA+PiAxNikgJiAweEZGKSwKIAkJICAgICgoZWF4ID4+IDI0KSAmIDB4RkYpKTsKIAotCWlmIChtYXhMZWFmID49IEh2Q3B1SWRGdW5jdGlvbk1zSHZWZXJzaW9uKSB7CisJaWYgKG1heF9sZWFmID49IEhWQ1BVSURfVkVSU0lPTikgewogCQllYXggPSAwOwogCQllYnggPSAwOwogCQllY3ggPSAwOwogCQllZHggPSAwOwotCQlvcCA9IEh2Q3B1SWRGdW5jdGlvbk1zSHZWZXJzaW9uOworCQlvcCA9IEhWQ1BVSURfVkVSU0lPTjsKIAkJY3B1aWQob3AsICZlYXgsICZlYngsICZlY3gsICZlZHgpOwogCQlEUFJJTlRfSU5GTyhWTUJVUywgIk9TIEJ1aWxkOiVkLSVkLiVkLSVkLSVkLiVkIixcCiAJCQkgICAgZWF4LApAQCAtMTIyLDgwICsxMjMsODEgQEAKIAkJCSAgICBlZHggPj4gMjQsCiAJCQkgICAgZWR4ICYgMHhGRkZGRkYpOwogCX0KLQlyZXR1cm4gbWF4TGVhZjsKKwlyZXR1cm4gbWF4X2xlYWY7CiB9CiAKIC8qCi0gKiBIdkRvSHlwZXJjYWxsIC0gSW52b2tlIHRoZSBzcGVjaWZpZWQgaHlwZXJjYWxsCisgKiBkb19oeXBlcmNhbGwtIEludm9rZSB0aGUgc3BlY2lmaWVkIGh5cGVyY2FsbAogICovCi1zdGF0aWMgdTY0IEh2RG9IeXBlcmNhbGwodTY0IENvbnRyb2wsIHZvaWQgKklucHV0LCB2b2lkICpPdXRwdXQpCitzdGF0aWMgdTY0IGRvX2h5cGVyY2FsbCh1NjQgY29udHJvbCwgdm9pZCAqaW5wdXQsIHZvaWQgKm91dHB1dCkKIHsKICNpZmRlZiBDT05GSUdfWDg2XzY0Ci0JdTY0IGh2U3RhdHVzID0gMDsKLQl1NjQgaW5wdXRBZGRyZXNzID0gKElucHV0KSA/IHZpcnRfdG9fcGh5cyhJbnB1dCkgOiAwOwotCXU2NCBvdXRwdXRBZGRyZXNzID0gKE91dHB1dCkgPyB2aXJ0X3RvX3BoeXMoT3V0cHV0KSA6IDA7Ci0Jdm9sYXRpbGUgdm9pZCAqaHlwZXJjYWxsUGFnZSA9IGdIdkNvbnRleHQuSHlwZXJjYWxsUGFnZTsKKwl1NjQgaHZfc3RhdHVzID0gMDsKKwl1NjQgaW5wdXRfYWRkcmVzcyA9IChpbnB1dCkgPyB2aXJ0X3RvX3BoeXMoaW5wdXQpIDogMDsKKwl1NjQgb3V0cHV0X2FkZHJlc3MgPSAob3V0cHV0KSA/IHZpcnRfdG9fcGh5cyhvdXRwdXQpIDogMDsKKwl2b2xhdGlsZSB2b2lkICpoeXBlcmNhbGxfcGFnZSA9IGh2X2NvbnRleHQuaHlwZXJjYWxsX3BhZ2U7CiAKIAlEUFJJTlRfREJHKFZNQlVTLCAiSHlwZXJjYWxsIDxjb250cm9sICVsbHggaW5wdXQgcGh5cyAlbGx4IHZpcnQgJXAgIgogCQkgICAib3V0cHV0IHBoeXMgJWxseCB2aXJ0ICVwIGh5cGVyY2FsbCAlcD4iLAotCQkgICBDb250cm9sLCBpbnB1dEFkZHJlc3MsIElucHV0LAotCQkgICBvdXRwdXRBZGRyZXNzLCBPdXRwdXQsIGh5cGVyY2FsbFBhZ2UpOworCQkgICBjb250cm9sLCBpbnB1dF9hZGRyZXNzLCBpbnB1dCwKKwkJICAgb3V0cHV0X2FkZHJlc3MsIG91dHB1dCwgaHlwZXJjYWxsX3BhZ2UpOwogCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdiAlMCwgJSVyOCIgOiA6ICJyIiAob3V0cHV0QWRkcmVzcykgOiAicjgiKTsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiY2FsbCAqJTMiIDogIj1hIiAoaHZTdGF0dXMpIDoKLQkJCSAgICAgImMiIChDb250cm9sKSwgImQiIChpbnB1dEFkZHJlc3MpLAotCQkJICAgICAibSIgKGh5cGVyY2FsbFBhZ2UpKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92ICUwLCAlJXI4IiA6IDogInIiIChvdXRwdXRfYWRkcmVzcykgOiAicjgiKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygiY2FsbCAqJTMiIDogIj1hIiAoaHZfc3RhdHVzKSA6CisJCQkgICAgICJjIiAoY29udHJvbCksICJkIiAoaW5wdXRfYWRkcmVzcyksCisJCQkgICAgICJtIiAoaHlwZXJjYWxsX3BhZ2UpKTsKIAotCURQUklOVF9EQkcoVk1CVVMsICJIeXBlcmNhbGwgPHJldHVybiAlbGx4PiIsICBodlN0YXR1cyk7CisJRFBSSU5UX0RCRyhWTUJVUywgIkh5cGVyY2FsbCA8cmV0dXJuICVsbHg+IiwgIGh2X3N0YXR1cyk7CiAKLQlyZXR1cm4gaHZTdGF0dXM7CisJcmV0dXJuIGh2X3N0YXR1czsKIAogI2Vsc2UKIAotCXUzMiBjb250cm9sSGkgPSBDb250cm9sID4+IDMyOwotCXUzMiBjb250cm9sTG8gPSBDb250cm9sICYgMHhGRkZGRkZGRjsKLQl1MzIgaHZTdGF0dXNIaSA9IDE7Ci0JdTMyIGh2U3RhdHVzTG8gPSAxOwotCXU2NCBpbnB1dEFkZHJlc3MgPSAoSW5wdXQpID8gdmlydF90b19waHlzKElucHV0KSA6IDA7Ci0JdTMyIGlucHV0QWRkcmVzc0hpID0gaW5wdXRBZGRyZXNzID4+IDMyOwotCXUzMiBpbnB1dEFkZHJlc3NMbyA9IGlucHV0QWRkcmVzcyAmIDB4RkZGRkZGRkY7Ci0JdTY0IG91dHB1dEFkZHJlc3MgPSAoT3V0cHV0KSA/IHZpcnRfdG9fcGh5cyhPdXRwdXQpIDogMDsKLQl1MzIgb3V0cHV0QWRkcmVzc0hpID0gb3V0cHV0QWRkcmVzcyA+PiAzMjsKLQl1MzIgb3V0cHV0QWRkcmVzc0xvID0gb3V0cHV0QWRkcmVzcyAmIDB4RkZGRkZGRkY7Ci0Jdm9sYXRpbGUgdm9pZCAqaHlwZXJjYWxsUGFnZSA9IGdIdkNvbnRleHQuSHlwZXJjYWxsUGFnZTsKKwl1MzIgY29udHJvbF9oaSA9IGNvbnRyb2wgPj4gMzI7CisJdTMyIGNvbnRyb2xfbG8gPSBjb250cm9sICYgMHhGRkZGRkZGRjsKKwl1MzIgaHZfc3RhdHVzX2hpID0gMTsKKwl1MzIgaHZfc3RhdHVzX2xvID0gMTsKKwl1NjQgaW5wdXRfYWRkcmVzcyA9IChpbnB1dCkgPyB2aXJ0X3RvX3BoeXMoaW5wdXQpIDogMDsKKwl1MzIgaW5wdXRfYWRkcmVzc19oaSA9IGlucHV0X2FkZHJlc3MgPj4gMzI7CisJdTMyIGlucHV0X2FkZHJlc3NfbG8gPSBpbnB1dF9hZGRyZXNzICYgMHhGRkZGRkZGRjsKKwl1NjQgb3V0cHV0X2FkZHJlc3MgPSAob3V0cHV0KSA/IHZpcnRfdG9fcGh5cyhvdXRwdXQpIDogMDsKKwl1MzIgb3V0cHV0X2FkZHJlc3NfaGkgPSBvdXRwdXRfYWRkcmVzcyA+PiAzMjsKKwl1MzIgb3V0cHV0X2FkZHJlc3NfbG8gPSBvdXRwdXRfYWRkcmVzcyAmIDB4RkZGRkZGRkY7CisJdm9sYXRpbGUgdm9pZCAqaHlwZXJjYWxsX3BhZ2UgPSBodl9jb250ZXh0Lmh5cGVyY2FsbF9wYWdlOwogCiAJRFBSSU5UX0RCRyhWTUJVUywgIkh5cGVyY2FsbCA8Y29udHJvbCAlbGx4IGlucHV0ICVwIG91dHB1dCAlcD4iLAotCQkgICBDb250cm9sLCBJbnB1dCwgT3V0cHV0KTsKKwkJICAgY29udHJvbCwgaW5wdXQsIG91dHB1dCk7CiAKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImNhbGwgKiU4IiA6ICI9ZCIoaHZTdGF0dXNIaSksCi0JCQkgICAgICAiPWEiKGh2U3RhdHVzTG8pIDogImQiIChjb250cm9sSGkpLAotCQkJICAgICAgImEiIChjb250cm9sTG8pLCAiYiIgKGlucHV0QWRkcmVzc0hpKSwKLQkJCSAgICAgICJjIiAoaW5wdXRBZGRyZXNzTG8pLCAiRCIob3V0cHV0QWRkcmVzc0hpKSwKLQkJCSAgICAgICJTIihvdXRwdXRBZGRyZXNzTG8pLCAibSIgKGh5cGVyY2FsbFBhZ2UpKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImNhbGwgKiU4IiA6ICI9ZCIoaHZfc3RhdHVzX2hpKSwKKwkJCSAgICAgICI9YSIoaHZfc3RhdHVzX2xvKSA6ICJkIiAoY29udHJvbF9oaSksCisJCQkgICAgICAiYSIgKGNvbnRyb2xfbG8pLCAiYiIgKGlucHV0X2FkZHJlc3NfaGkpLAorCQkJICAgICAgImMiIChpbnB1dF9hZGRyZXNzX2xvKSwgIkQiKG91dHB1dF9hZGRyZXNzX2hpKSwKKwkJCSAgICAgICJTIihvdXRwdXRfYWRkcmVzc19sbyksICJtIiAoaHlwZXJjYWxsX3BhZ2UpKTsKIAogCURQUklOVF9EQkcoVk1CVVMsICJIeXBlcmNhbGwgPHJldHVybiAlbGx4PiIsCi0JCSAgIGh2U3RhdHVzTG8gfCAoKHU2NClodlN0YXR1c0hpIDw8IDMyKSk7CisJCSAgIGh2X3N0YXR1c19sbyB8ICgodTY0KWh2X3N0YXR1c19oaSA8PCAzMikpOwogCi0JcmV0dXJuIGh2U3RhdHVzTG8gfCAoKHU2NClodlN0YXR1c0hpIDw8IDMyKTsKKwlyZXR1cm4gaHZfc3RhdHVzX2xvIHwgKCh1NjQpaHZfc3RhdHVzX2hpIDw8IDMyKTsKICNlbmRpZiAvKiAheDg2XzY0ICovCiB9CiAKIC8qCi0gKiBIdkluaXQgLSBNYWluIGluaXRpYWxpemF0aW9uIHJvdXRpbmUuCisgKiBodl9pbml0IC0gTWFpbiBpbml0aWFsaXphdGlvbiByb3V0aW5lLgogICoKICAqIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIHJvdXRpbmVzIGluIGhlcmUgYXJlIGNhbGxlZAogICovCi1pbnQgSHZJbml0KHZvaWQpCitpbnQgaHZfaW5pdCh2b2lkKQogewogCWludCByZXQgPSAwOwotCWludCBtYXhMZWFmOwotCXVuaW9uIGh2X3g2NF9tc3JfaHlwZXJjYWxsX2NvbnRlbnRzIGh5cGVyY2FsbE1zcjsKLQl2b2lkICp2aXJ0QWRkciA9IE5VTEw7CisJaW50IG1heF9sZWFmOworCXVuaW9uIGh2X3g2NF9tc3JfaHlwZXJjYWxsX2NvbnRlbnRzIGh5cGVyY2FsbF9tc3I7CisJdm9pZCAqdmlydGFkZHIgPSBOVUxMOwogCi0JbWVtc2V0KGdIdkNvbnRleHQuc3luSUNFdmVudFBhZ2UsIDAsIHNpemVvZih2b2lkICopICogTUFYX05VTV9DUFVTKTsKLQltZW1zZXQoZ0h2Q29udGV4dC5zeW5JQ01lc3NhZ2VQYWdlLCAwLCBzaXplb2Yodm9pZCAqKSAqIE1BWF9OVU1fQ1BVUyk7CisJbWVtc2V0KGh2X2NvbnRleHQuc3luaWNfZXZlbnRfcGFnZSwgMCwgc2l6ZW9mKHZvaWQgKikgKiBNQVhfTlVNX0NQVVMpOworCW1lbXNldChodl9jb250ZXh0LnN5bmljX21lc3NhZ2VfcGFnZSwgMCwKKwkgICAgICAgc2l6ZW9mKHZvaWQgKikgKiBNQVhfTlVNX0NQVVMpOwogCi0JaWYgKCFIdlF1ZXJ5SHlwZXJ2aXNvclByZXNlbmNlKCkpIHsKKwlpZiAoIXF1ZXJ5X2h5cGVydmlzb3JfcHJlc2VuY2UoKSkgewogCQlEUFJJTlRfRVJSKFZNQlVTLCAiTm8gV2luZG93cyBoeXBlcnZpc29yIGRldGVjdGVkISEiKTsKIAkJZ290byBDbGVhbnVwOwogCX0KQEAgLTIwMywxNDYgKzIwNSwxNDggQEAKIAlEUFJJTlRfSU5GTyhWTUJVUywKIAkJICAgICJXaW5kb3dzIGh5cGVydmlzb3IgZGV0ZWN0ZWQhIFJldHJpZXZpbmcgbW9yZSBpbmZvLi4uIik7CiAKLQltYXhMZWFmID0gSHZRdWVyeUh5cGVydmlzb3JJbmZvKCk7CisJbWF4X2xlYWYgPSBxdWVyeV9oeXBlcnZpc29yX2luZm8oKTsKIAkvKiBIdlF1ZXJ5SHlwZXJ2aXNvckZlYXR1cmVzKG1heExlYWYpOyAqLwogCiAJLyoKIAkgKiBXZSBvbmx5IHN1cHBvcnQgcnVubmluZyBvbiB0b3Agb2YgSHlwZXItVgogCSAqLwotCXJkbXNybChIVl9YNjRfTVNSX0dVRVNUX09TX0lELCBnSHZDb250ZXh0Lkd1ZXN0SWQpOworCXJkbXNybChIVl9YNjRfTVNSX0dVRVNUX09TX0lELCBodl9jb250ZXh0Lmd1ZXN0aWQpOwogCi0JaWYgKGdIdkNvbnRleHQuR3Vlc3RJZCAhPSAwKSB7CisJaWYgKGh2X2NvbnRleHQuZ3Vlc3RpZCAhPSAwKSB7CiAJCURQUklOVF9FUlIoVk1CVVMsICJVbmtub3duIGd1ZXN0IGlkICgweCVsbHgpISEiLAotCQkJCWdIdkNvbnRleHQuR3Vlc3RJZCk7CisJCQkJaHZfY29udGV4dC5ndWVzdGlkKTsKIAkJZ290byBDbGVhbnVwOwogCX0KIAogCS8qIFdyaXRlIG91ciBPUyBpbmZvICovCiAJd3Jtc3JsKEhWX1g2NF9NU1JfR1VFU1RfT1NfSUQsIEhWX0xJTlVYX0dVRVNUX0lEKTsKLQlnSHZDb250ZXh0Lkd1ZXN0SWQgPSBIVl9MSU5VWF9HVUVTVF9JRDsKKwlodl9jb250ZXh0Lmd1ZXN0aWQgPSBIVl9MSU5VWF9HVUVTVF9JRDsKIAogCS8qIFNlZSBpZiB0aGUgaHlwZXJjYWxsIHBhZ2UgaXMgYWxyZWFkeSBzZXQgKi8KLQlyZG1zcmwoSFZfWDY0X01TUl9IWVBFUkNBTEwsIGh5cGVyY2FsbE1zci5Bc1VJTlQ2NCk7CisJcmRtc3JsKEhWX1g2NF9NU1JfSFlQRVJDQUxMLCBoeXBlcmNhbGxfbXNyLmFzX3VpbnQ2NCk7CiAKIAkvKgogCSogQWxsb2NhdGUgdGhlIGh5cGVyY2FsbCBwYWdlIG1lbW9yeQotCSogdmlydEFkZHIgPSBvc2RfUGFnZUFsbG9jKDEpOworCSogdmlydGFkZHIgPSBvc2RfcGFnZV9hbGxvYygxKTsKIAkqLwotCXZpcnRBZGRyID0gb3NkX1ZpcnR1YWxBbGxvY0V4ZWMoUEFHRV9TSVpFKTsKKwl2aXJ0YWRkciA9IG9zZF92aXJ0dWFsX2FsbG9jX2V4ZWMoUEFHRV9TSVpFKTsKIAotCWlmICghdmlydEFkZHIpIHsKKwlpZiAoIXZpcnRhZGRyKSB7CiAJCURQUklOVF9FUlIoVk1CVVMsCiAJCQkgICAidW5hYmxlIHRvIGFsbG9jYXRlIGh5cGVyY2FsbCBwYWdlISEiKTsKIAkJZ290byBDbGVhbnVwOwogCX0KIAotCWh5cGVyY2FsbE1zci5FbmFibGUgPSAxOworCWh5cGVyY2FsbF9tc3IuZW5hYmxlID0gMTsKIAotCWh5cGVyY2FsbE1zci5HdWVzdFBoeXNpY2FsQWRkcmVzcyA9IHZtYWxsb2NfdG9fcGZuKHZpcnRBZGRyKTsKLQl3cm1zcmwoSFZfWDY0X01TUl9IWVBFUkNBTEwsIGh5cGVyY2FsbE1zci5Bc1VJTlQ2NCk7CisJaHlwZXJjYWxsX21zci5ndWVzdF9waHlzaWNhbF9hZGRyZXNzID0gdm1hbGxvY190b19wZm4odmlydGFkZHIpOworCXdybXNybChIVl9YNjRfTVNSX0hZUEVSQ0FMTCwgaHlwZXJjYWxsX21zci5hc191aW50NjQpOwogCiAJLyogQ29uZmlybSB0aGF0IGh5cGVyY2FsbCBwYWdlIGRpZCBnZXQgc2V0dXAuICovCi0JaHlwZXJjYWxsTXNyLkFzVUlOVDY0ID0gMDsKLQlyZG1zcmwoSFZfWDY0X01TUl9IWVBFUkNBTEwsIGh5cGVyY2FsbE1zci5Bc1VJTlQ2NCk7CisJaHlwZXJjYWxsX21zci5hc191aW50NjQgPSAwOworCXJkbXNybChIVl9YNjRfTVNSX0hZUEVSQ0FMTCwgaHlwZXJjYWxsX21zci5hc191aW50NjQpOwogCi0JaWYgKCFoeXBlcmNhbGxNc3IuRW5hYmxlKSB7CisJaWYgKCFoeXBlcmNhbGxfbXNyLmVuYWJsZSkgewogCQlEUFJJTlRfRVJSKFZNQlVTLCAidW5hYmxlIHRvIHNldCBoeXBlcmNhbGwgcGFnZSEhIik7CiAJCWdvdG8gQ2xlYW51cDsKIAl9CiAKLQlnSHZDb250ZXh0Lkh5cGVyY2FsbFBhZ2UgPSB2aXJ0QWRkcjsKKwlodl9jb250ZXh0Lmh5cGVyY2FsbF9wYWdlID0gdmlydGFkZHI7CiAKIAlEUFJJTlRfSU5GTyhWTUJVUywgIkh5cGVyY2FsbCBwYWdlIFZBPSVwLCBQQT0weCUwbGx4IiwKLQkJICAgIGdIdkNvbnRleHQuSHlwZXJjYWxsUGFnZSwKLQkJICAgICh1NjQpaHlwZXJjYWxsTXNyLkd1ZXN0UGh5c2ljYWxBZGRyZXNzIDw8IFBBR0VfU0hJRlQpOworCQkgICAgaHZfY29udGV4dC5oeXBlcmNhbGxfcGFnZSwKKwkJICAgICh1NjQpaHlwZXJjYWxsX21zci5ndWVzdF9waHlzaWNhbF9hZGRyZXNzIDw8IFBBR0VfU0hJRlQpOwogCiAJLyogU2V0dXAgdGhlIGdsb2JhbCBzaWduYWwgZXZlbnQgcGFyYW0gZm9yIHRoZSBzaWduYWwgZXZlbnQgaHlwZXJjYWxsICovCi0JZ0h2Q29udGV4dC5TaWduYWxFdmVudEJ1ZmZlciA9CisJaHZfY29udGV4dC5zaWduYWxfZXZlbnRfYnVmZmVyID0KIAkJCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBodl9pbnB1dF9zaWduYWxfZXZlbnRfYnVmZmVyKSwKIAkJCQlHRlBfS0VSTkVMKTsKLQlpZiAoIWdIdkNvbnRleHQuU2lnbmFsRXZlbnRCdWZmZXIpCisJaWYgKCFodl9jb250ZXh0LnNpZ25hbF9ldmVudF9idWZmZXIpCiAJCWdvdG8gQ2xlYW51cDsKIAotCWdIdkNvbnRleHQuU2lnbmFsRXZlbnRQYXJhbSA9CisJaHZfY29udGV4dC5zaWduYWxfZXZlbnRfcGFyYW0gPQogCQkoc3RydWN0IGh2X2lucHV0X3NpZ25hbF9ldmVudCAqKQotCQkJKEFMSUdOX1VQKCh1bnNpZ25lZCBsb25nKWdIdkNvbnRleHQuU2lnbmFsRXZlbnRCdWZmZXIsCisJCQkoQUxJR05fVVAoKHVuc2lnbmVkIGxvbmcpCisJCQkJICBodl9jb250ZXh0LnNpZ25hbF9ldmVudF9idWZmZXIsCiAJCQkJICBIVl9IWVBFUkNBTExfUEFSQU1fQUxJR04pKTsKLQlnSHZDb250ZXh0LlNpZ25hbEV2ZW50UGFyYW0tPkNvbm5lY3Rpb25JZC5Bc3UzMiA9IDA7Ci0JZ0h2Q29udGV4dC5TaWduYWxFdmVudFBhcmFtLT5Db25uZWN0aW9uSWQudS5JZCA9CisJaHZfY29udGV4dC5zaWduYWxfZXZlbnRfcGFyYW0tPmNvbm5lY3Rpb25pZC5hc3UzMiA9IDA7CisJaHZfY29udGV4dC5zaWduYWxfZXZlbnRfcGFyYW0tPmNvbm5lY3Rpb25pZC51LmlkID0KIAkJCQkJCVZNQlVTX0VWRU5UX0NPTk5FQ1RJT05fSUQ7Ci0JZ0h2Q29udGV4dC5TaWduYWxFdmVudFBhcmFtLT5GbGFnTnVtYmVyID0gMDsKLQlnSHZDb250ZXh0LlNpZ25hbEV2ZW50UGFyYW0tPlJzdmRaID0gMDsKKwlodl9jb250ZXh0LnNpZ25hbF9ldmVudF9wYXJhbS0+ZmxhZ19udW1iZXIgPSAwOworCWh2X2NvbnRleHQuc2lnbmFsX2V2ZW50X3BhcmFtLT5yc3ZkeiA9IDA7CiAKIAlyZXR1cm4gcmV0OwogCiBDbGVhbnVwOgotCWlmICh2aXJ0QWRkcikgewotCQlpZiAoaHlwZXJjYWxsTXNyLkVuYWJsZSkgewotCQkJaHlwZXJjYWxsTXNyLkFzVUlOVDY0ID0gMDsKLQkJCXdybXNybChIVl9YNjRfTVNSX0hZUEVSQ0FMTCwgaHlwZXJjYWxsTXNyLkFzVUlOVDY0KTsKKwlpZiAodmlydGFkZHIpIHsKKwkJaWYgKGh5cGVyY2FsbF9tc3IuZW5hYmxlKSB7CisJCQloeXBlcmNhbGxfbXNyLmFzX3VpbnQ2NCA9IDA7CisJCQl3cm1zcmwoSFZfWDY0X01TUl9IWVBFUkNBTEwsIGh5cGVyY2FsbF9tc3IuYXNfdWludDY0KTsKIAkJfQogCi0JCXZmcmVlKHZpcnRBZGRyKTsKKwkJdmZyZWUodmlydGFkZHIpOwogCX0KIAlyZXQgPSAtMTsKIAlyZXR1cm4gcmV0OwogfQogCiAvKgotICogSHZDbGVhbnVwIC0gQ2xlYW51cCByb3V0aW5lLgorICogaHZfY2xlYW51cCAtIENsZWFudXAgcm91dGluZS4KICAqCiAgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIG5vcm1hbGx5IGR1cmluZyBkcml2ZXIgdW5sb2FkaW5nIG9yIGV4aXRpbmcuCiAgKi8KLXZvaWQgSHZDbGVhbnVwKHZvaWQpCit2b2lkIGh2X2NsZWFudXAodm9pZCkKIHsKLQl1bmlvbiBodl94NjRfbXNyX2h5cGVyY2FsbF9jb250ZW50cyBoeXBlcmNhbGxNc3I7CisJdW5pb24gaHZfeDY0X21zcl9oeXBlcmNhbGxfY29udGVudHMgaHlwZXJjYWxsX21zcjsKIAotCWtmcmVlKGdIdkNvbnRleHQuU2lnbmFsRXZlbnRCdWZmZXIpOwotCWdIdkNvbnRleHQuU2lnbmFsRXZlbnRCdWZmZXIgPSBOVUxMOwotCWdIdkNvbnRleHQuU2lnbmFsRXZlbnRQYXJhbSA9IE5VTEw7CisJa2ZyZWUoaHZfY29udGV4dC5zaWduYWxfZXZlbnRfYnVmZmVyKTsKKwlodl9jb250ZXh0LnNpZ25hbF9ldmVudF9idWZmZXIgPSBOVUxMOworCWh2X2NvbnRleHQuc2lnbmFsX2V2ZW50X3BhcmFtID0gTlVMTDsKIAotCWlmIChnSHZDb250ZXh0Lkh5cGVyY2FsbFBhZ2UpIHsKLQkJaHlwZXJjYWxsTXNyLkFzVUlOVDY0ID0gMDsKLQkJd3Jtc3JsKEhWX1g2NF9NU1JfSFlQRVJDQUxMLCBoeXBlcmNhbGxNc3IuQXNVSU5UNjQpOwotCQl2ZnJlZShnSHZDb250ZXh0Lkh5cGVyY2FsbFBhZ2UpOwotCQlnSHZDb250ZXh0Lkh5cGVyY2FsbFBhZ2UgPSBOVUxMOworCWlmIChodl9jb250ZXh0Lmh5cGVyY2FsbF9wYWdlKSB7CisJCWh5cGVyY2FsbF9tc3IuYXNfdWludDY0ID0gMDsKKwkJd3Jtc3JsKEhWX1g2NF9NU1JfSFlQRVJDQUxMLCBoeXBlcmNhbGxfbXNyLmFzX3VpbnQ2NCk7CisJCXZmcmVlKGh2X2NvbnRleHQuaHlwZXJjYWxsX3BhZ2UpOworCQlodl9jb250ZXh0Lmh5cGVyY2FsbF9wYWdlID0gTlVMTDsKIAl9CiB9CiAKIC8qCi0gKiBIdlBvc3RNZXNzYWdlIC0gUG9zdCBhIG1lc3NhZ2UgdXNpbmcgdGhlIGh5cGVydmlzb3IgbWVzc2FnZSBJUEMuCisgKiBodl9wb3N0X21lc3NhZ2UgLSBQb3N0IGEgbWVzc2FnZSB1c2luZyB0aGUgaHlwZXJ2aXNvciBtZXNzYWdlIElQQy4KICAqCiAgKiBUaGlzIGludm9sdmVzIGEgaHlwZXJjYWxsLgogICovCi11MTYgSHZQb3N0TWVzc2FnZSh1bmlvbiBodl9jb25uZWN0aW9uX2lkIGNvbm5lY3Rpb25JZCwKLQkJICBlbnVtIGh2X21lc3NhZ2VfdHlwZSBtZXNzYWdlVHlwZSwKLQkJICB2b2lkICpwYXlsb2FkLCBzaXplX3QgcGF5bG9hZFNpemUpCit1MTYgaHZfcG9zdF9tZXNzYWdlKHVuaW9uIGh2X2Nvbm5lY3Rpb25faWQgY29ubmVjdGlvbl9pZCwKKwkJICBlbnVtIGh2X21lc3NhZ2VfdHlwZSBtZXNzYWdlX3R5cGUsCisJCSAgdm9pZCAqcGF5bG9hZCwgc2l6ZV90IHBheWxvYWRfc2l6ZSkKIHsKLQlzdHJ1Y3QgYWxpZ25lZElucHV0IHsKKwlzdHJ1Y3QgYWxpZ25lZF9pbnB1dCB7CiAJCXU2NCBhbGlnbm1lbnQ4OwogCQlzdHJ1Y3QgaHZfaW5wdXRfcG9zdF9tZXNzYWdlIG1zZzsKIAl9OwogCi0Jc3RydWN0IGh2X2lucHV0X3Bvc3RfbWVzc2FnZSAqYWxpZ25lZE1zZzsKKwlzdHJ1Y3QgaHZfaW5wdXRfcG9zdF9tZXNzYWdlICphbGlnbmVkX21zZzsKIAl1MTYgc3RhdHVzOwogCXVuc2lnbmVkIGxvbmcgYWRkcjsKIAotCWlmIChwYXlsb2FkU2l6ZSA+IEhWX01FU1NBR0VfUEFZTE9BRF9CWVRFX0NPVU5UKQorCWlmIChwYXlsb2FkX3NpemUgPiBIVl9NRVNTQUdFX1BBWUxPQURfQllURV9DT1VOVCkKIAkJcmV0dXJuIC0xOwogCi0JYWRkciA9ICh1bnNpZ25lZCBsb25nKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhbGlnbmVkSW5wdXQpLCBHRlBfQVRPTUlDKTsKKwlhZGRyID0gKHVuc2lnbmVkIGxvbmcpa21hbGxvYyhzaXplb2Yoc3RydWN0IGFsaWduZWRfaW5wdXQpLCBHRlBfQVRPTUlDKTsKIAlpZiAoIWFkZHIpCiAJCXJldHVybiAtMTsKIAotCWFsaWduZWRNc2cgPSAoc3RydWN0IGh2X2lucHV0X3Bvc3RfbWVzc2FnZSAqKQorCWFsaWduZWRfbXNnID0gKHN0cnVjdCBodl9pbnB1dF9wb3N0X21lc3NhZ2UgKikKIAkJCShBTElHTl9VUChhZGRyLCBIVl9IWVBFUkNBTExfUEFSQU1fQUxJR04pKTsKIAotCWFsaWduZWRNc2ctPkNvbm5lY3Rpb25JZCA9IGNvbm5lY3Rpb25JZDsKLQlhbGlnbmVkTXNnLT5NZXNzYWdlVHlwZSA9IG1lc3NhZ2VUeXBlOwotCWFsaWduZWRNc2ctPlBheWxvYWRTaXplID0gcGF5bG9hZFNpemU7Ci0JbWVtY3B5KCh2b2lkICopYWxpZ25lZE1zZy0+UGF5bG9hZCwgcGF5bG9hZCwgcGF5bG9hZFNpemUpOworCWFsaWduZWRfbXNnLT5jb25uZWN0aW9uaWQgPSBjb25uZWN0aW9uX2lkOworCWFsaWduZWRfbXNnLT5tZXNzYWdlX3R5cGUgPSBtZXNzYWdlX3R5cGU7CisJYWxpZ25lZF9tc2ctPnBheWxvYWRfc2l6ZSA9IHBheWxvYWRfc2l6ZTsKKwltZW1jcHkoKHZvaWQgKilhbGlnbmVkX21zZy0+cGF5bG9hZCwgcGF5bG9hZCwgcGF5bG9hZF9zaXplKTsKIAotCXN0YXR1cyA9IEh2RG9IeXBlcmNhbGwoSHZDYWxsUG9zdE1lc3NhZ2UsIGFsaWduZWRNc2csIE5VTEwpICYgMHhGRkZGOworCXN0YXR1cyA9IGRvX2h5cGVyY2FsbChIVkNBTExfUE9TVF9NRVNTQUdFLCBhbGlnbmVkX21zZywgTlVMTCkKKwkJJiAweEZGRkY7CiAKIAlrZnJlZSgodm9pZCAqKWFkZHIpOwogCkBAIC0zNTEsMzggKzM1NSw0MCBAQAogCiAKIC8qCi0gKiBIdlNpZ25hbEV2ZW50IC0gU2lnbmFsIGFuIGV2ZW50IG9uIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbiB1c2luZyB0aGUgaHlwZXJ2aXNvciBldmVudCBJUEMuCisgKiBodl9zaWduYWxfZXZlbnQgLQorICogU2lnbmFsIGFuIGV2ZW50IG9uIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbiB1c2luZyB0aGUgaHlwZXJ2aXNvciBldmVudCBJUEMuCiAgKgogICogVGhpcyBpbnZvbHZlcyBhIGh5cGVyY2FsbC4KICAqLwotdTE2IEh2U2lnbmFsRXZlbnQodm9pZCkKK3UxNiBodl9zaWduYWxfZXZlbnQodm9pZCkKIHsKIAl1MTYgc3RhdHVzOwogCi0Jc3RhdHVzID0gSHZEb0h5cGVyY2FsbChIdkNhbGxTaWduYWxFdmVudCwgZ0h2Q29udGV4dC5TaWduYWxFdmVudFBhcmFtLAorCXN0YXR1cyA9IGRvX2h5cGVyY2FsbChIVkNBTExfU0lHTkFMX0VWRU5ULAorCQkJICAgICAgIGh2X2NvbnRleHQuc2lnbmFsX2V2ZW50X3BhcmFtLAogCQkJICAgICAgIE5VTEwpICYgMHhGRkZGOwogCXJldHVybiBzdGF0dXM7CiB9CiAKIC8qCi0gKiBIdlN5bmljSW5pdCAtIEluaXRpYWxpemUgdGhlIFN5bnRoZXRoaWMgSW50ZXJydXB0IENvbnRyb2xsZXIuCisgKiBodl9zeW5pY19pbml0IC0gSW5pdGlhbGl6ZSB0aGUgU3ludGhldGhpYyBJbnRlcnJ1cHQgQ29udHJvbGxlci4KICAqCiAgKiBJZiBpdCBpcyBhbHJlYWR5IGluaXRpYWxpemVkIGJ5IGFub3RoZXIgZW50aXR5IChpZSB4MnYgc2hpbSksIHdlIG5lZWQgdG8KICAqIHJldHJpZXZlIHRoZSBpbml0aWFsaXplZCBtZXNzYWdlIGFuZCBldmVudCBwYWdlcy4gIE90aGVyd2lzZSwgd2UgY3JlYXRlIGFuZAogICogaW5pdGlhbGl6ZSB0aGUgbWVzc2FnZSBhbmQgZXZlbnQgcGFnZXMuCiAgKi8KLXZvaWQgSHZTeW5pY0luaXQodm9pZCAqaXJxYXJnKQordm9pZCBodl9zeW5pY19pbml0KHZvaWQgKmlycWFyZykKIHsKIAl1NjQgdmVyc2lvbjsKIAl1bmlvbiBodl9zeW5pY19zaW1wIHNpbXA7CiAJdW5pb24gaHZfc3luaWNfc2llZnAgc2llZnA7Ci0JdW5pb24gaHZfc3luaWNfc2ludCBzaGFyZWRTaW50OworCXVuaW9uIGh2X3N5bmljX3NpbnQgc2hhcmVkX3NpbnQ7CiAJdW5pb24gaHZfc3luaWNfc2NvbnRyb2wgc2N0cmw7CiAKLQl1MzIgaXJxVmVjdG9yID0gKigodTMyICopKGlycWFyZykpOworCXUzMiBpcnFfdmVjdG9yID0gKigodTMyICopKGlycWFyZykpOwogCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKLQlpZiAoIWdIdkNvbnRleHQuSHlwZXJjYWxsUGFnZSkKKwlpZiAoIWh2X2NvbnRleHQuaHlwZXJjYWxsX3BhZ2UpCiAJCXJldHVybjsKIAogCS8qIENoZWNrIHRoZSB2ZXJzaW9uICovCkBAIC0zOTAsMTEwICszOTYsMTEyIEBACiAKIAlEUFJJTlRfSU5GTyhWTUJVUywgIlN5bklDIHZlcnNpb246ICVsbHgiLCB2ZXJzaW9uKTsKIAotCWdIdkNvbnRleHQuc3luSUNNZXNzYWdlUGFnZVtjcHVdID0gKHZvaWQgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0FUT01JQyk7CisJaHZfY29udGV4dC5zeW5pY19tZXNzYWdlX3BhZ2VbY3B1XSA9CisJCSh2b2lkICopZ2V0X3plcm9lZF9wYWdlKEdGUF9BVE9NSUMpOwogCi0JaWYgKGdIdkNvbnRleHQuc3luSUNNZXNzYWdlUGFnZVtjcHVdID09IE5VTEwpIHsKKwlpZiAoaHZfY29udGV4dC5zeW5pY19tZXNzYWdlX3BhZ2VbY3B1XSA9PSBOVUxMKSB7CiAJCURQUklOVF9FUlIoVk1CVVMsCiAJCQkgICAidW5hYmxlIHRvIGFsbG9jYXRlIFNZTklDIG1lc3NhZ2UgcGFnZSEhIik7CiAJCWdvdG8gQ2xlYW51cDsKIAl9CiAKLQlnSHZDb250ZXh0LnN5bklDRXZlbnRQYWdlW2NwdV0gPSAodm9pZCAqKWdldF96ZXJvZWRfcGFnZShHRlBfQVRPTUlDKTsKKwlodl9jb250ZXh0LnN5bmljX2V2ZW50X3BhZ2VbY3B1XSA9CisJCSh2b2lkICopZ2V0X3plcm9lZF9wYWdlKEdGUF9BVE9NSUMpOwogCi0JaWYgKGdIdkNvbnRleHQuc3luSUNFdmVudFBhZ2VbY3B1XSA9PSBOVUxMKSB7CisJaWYgKGh2X2NvbnRleHQuc3luaWNfZXZlbnRfcGFnZVtjcHVdID09IE5VTEwpIHsKIAkJRFBSSU5UX0VSUihWTUJVUywKIAkJCSAgICJ1bmFibGUgdG8gYWxsb2NhdGUgU1lOSUMgZXZlbnQgcGFnZSEhIik7CiAJCWdvdG8gQ2xlYW51cDsKIAl9CiAKIAkvKiBTZXR1cCB0aGUgU3luaWMncyBtZXNzYWdlIHBhZ2UgKi8KLQlyZG1zcmwoSFZfWDY0X01TUl9TSU1QLCBzaW1wLkFzVUlOVDY0KTsKLQlzaW1wLlNpbXBFbmFibGVkID0gMTsKLQlzaW1wLkJhc2VTaW1wR3BhID0gdmlydF90b19waHlzKGdIdkNvbnRleHQuc3luSUNNZXNzYWdlUGFnZVtjcHVdKQorCXJkbXNybChIVl9YNjRfTVNSX1NJTVAsIHNpbXAuYXNfdWludDY0KTsKKwlzaW1wLnNpbXBfZW5hYmxlZCA9IDE7CisJc2ltcC5iYXNlX3NpbXBfZ3BhID0gdmlydF90b19waHlzKGh2X2NvbnRleHQuc3luaWNfbWVzc2FnZV9wYWdlW2NwdV0pCiAJCT4+IFBBR0VfU0hJRlQ7CiAKLQlEUFJJTlRfREJHKFZNQlVTLCAiSFZfWDY0X01TUl9TSU1QIG1zciBzZXQgdG86ICVsbHgiLCBzaW1wLkFzVUlOVDY0KTsKKwlEUFJJTlRfREJHKFZNQlVTLCAiSFZfWDY0X01TUl9TSU1QIG1zciBzZXQgdG86ICVsbHgiLCBzaW1wLmFzX3VpbnQ2NCk7CiAKLQl3cm1zcmwoSFZfWDY0X01TUl9TSU1QLCBzaW1wLkFzVUlOVDY0KTsKKwl3cm1zcmwoSFZfWDY0X01TUl9TSU1QLCBzaW1wLmFzX3VpbnQ2NCk7CiAKIAkvKiBTZXR1cCB0aGUgU3luaWMncyBldmVudCBwYWdlICovCi0JcmRtc3JsKEhWX1g2NF9NU1JfU0lFRlAsIHNpZWZwLkFzVUlOVDY0KTsKLQlzaWVmcC5TaWVmcEVuYWJsZWQgPSAxOwotCXNpZWZwLkJhc2VTaWVmcEdwYSA9IHZpcnRfdG9fcGh5cyhnSHZDb250ZXh0LnN5bklDRXZlbnRQYWdlW2NwdV0pCisJcmRtc3JsKEhWX1g2NF9NU1JfU0lFRlAsIHNpZWZwLmFzX3VpbnQ2NCk7CisJc2llZnAuc2llZnBfZW5hYmxlZCA9IDE7CisJc2llZnAuYmFzZV9zaWVmcF9ncGEgPSB2aXJ0X3RvX3BoeXMoaHZfY29udGV4dC5zeW5pY19ldmVudF9wYWdlW2NwdV0pCiAJCT4+IFBBR0VfU0hJRlQ7CiAKLQlEUFJJTlRfREJHKFZNQlVTLCAiSFZfWDY0X01TUl9TSUVGUCBtc3Igc2V0IHRvOiAlbGx4Iiwgc2llZnAuQXNVSU5UNjQpOworCURQUklOVF9EQkcoVk1CVVMsICJIVl9YNjRfTVNSX1NJRUZQIG1zciBzZXQgdG86ICVsbHgiLCBzaWVmcC5hc191aW50NjQpOwogCi0Jd3Jtc3JsKEhWX1g2NF9NU1JfU0lFRlAsIHNpZWZwLkFzVUlOVDY0KTsKKwl3cm1zcmwoSFZfWDY0X01TUl9TSUVGUCwgc2llZnAuYXNfdWludDY0KTsKIAogCS8qIFNldHVwIHRoZSBpbnRlcmNlcHRpb24gU0lOVC4gKi8KIAkvKiB3cm1zcmwoKEhWX1g2NF9NU1JfU0lOVDAgKyBIVl9TWU5JQ19JTlRFUkNFUFRJT05fU0lOVF9JTkRFWCksICovCi0JLyoJICBpbnRlcmNlcHRpb25TaW50LkFzVUlOVDY0KTsgKi8KKwkvKgkgIGludGVyY2VwdGlvblNpbnQuYXNfdWludDY0KTsgKi8KIAogCS8qIFNldHVwIHRoZSBzaGFyZWQgU0lOVC4gKi8KLQlyZG1zcmwoSFZfWDY0X01TUl9TSU5UMCArIFZNQlVTX01FU1NBR0VfU0lOVCwgc2hhcmVkU2ludC5Bc1VJTlQ2NCk7CisJcmRtc3JsKEhWX1g2NF9NU1JfU0lOVDAgKyBWTUJVU19NRVNTQUdFX1NJTlQsIHNoYXJlZF9zaW50LmFzX3VpbnQ2NCk7CiAKLQlzaGFyZWRTaW50LkFzVUlOVDY0ID0gMDsKLQlzaGFyZWRTaW50LlZlY3RvciA9IGlycVZlY3RvcjsgLyogSFZfU0hBUkVEX1NJTlRfSURUX1ZFQ1RPUiArIDB4MjA7ICovCi0Jc2hhcmVkU2ludC5NYXNrZWQgPSBmYWxzZTsKLQlzaGFyZWRTaW50LkF1dG9Fb2kgPSB0cnVlOworCXNoYXJlZF9zaW50LmFzX3VpbnQ2NCA9IDA7CisJc2hhcmVkX3NpbnQudmVjdG9yID0gaXJxX3ZlY3RvcjsgLyogSFZfU0hBUkVEX1NJTlRfSURUX1ZFQ1RPUiArIDB4MjA7ICovCisJc2hhcmVkX3NpbnQubWFza2VkID0gZmFsc2U7CisJc2hhcmVkX3NpbnQuYXV0b19lb2kgPSB0cnVlOwogCiAJRFBSSU5UX0RCRyhWTUJVUywgIkhWX1g2NF9NU1JfU0lOVDEgbXNyIHNldCB0bzogJWxseCIsCi0JCSAgIHNoYXJlZFNpbnQuQXNVSU5UNjQpOworCQkgICBzaGFyZWRfc2ludC5hc191aW50NjQpOwogCi0Jd3Jtc3JsKEhWX1g2NF9NU1JfU0lOVDAgKyBWTUJVU19NRVNTQUdFX1NJTlQsIHNoYXJlZFNpbnQuQXNVSU5UNjQpOworCXdybXNybChIVl9YNjRfTVNSX1NJTlQwICsgVk1CVVNfTUVTU0FHRV9TSU5ULCBzaGFyZWRfc2ludC5hc191aW50NjQpOwogCiAJLyogRW5hYmxlIHRoZSBnbG9iYWwgc3luaWMgYml0ICovCi0JcmRtc3JsKEhWX1g2NF9NU1JfU0NPTlRST0wsIHNjdHJsLkFzVUlOVDY0KTsKLQlzY3RybC5FbmFibGUgPSAxOworCXJkbXNybChIVl9YNjRfTVNSX1NDT05UUk9MLCBzY3RybC5hc191aW50NjQpOworCXNjdHJsLmVuYWJsZSA9IDE7CiAKLQl3cm1zcmwoSFZfWDY0X01TUl9TQ09OVFJPTCwgc2N0cmwuQXNVSU5UNjQpOworCXdybXNybChIVl9YNjRfTVNSX1NDT05UUk9MLCBzY3RybC5hc191aW50NjQpOwogCi0JZ0h2Q29udGV4dC5TeW5JQ0luaXRpYWxpemVkID0gdHJ1ZTsKKwlodl9jb250ZXh0LnN5bmljX2luaXRpYWxpemVkID0gdHJ1ZTsKIAlyZXR1cm47CiAKIENsZWFudXA6Ci0JaWYgKGdIdkNvbnRleHQuc3luSUNFdmVudFBhZ2VbY3B1XSkKLQkJb3NkX1BhZ2VGcmVlKGdIdkNvbnRleHQuc3luSUNFdmVudFBhZ2VbY3B1XSwgMSk7CisJaWYgKGh2X2NvbnRleHQuc3luaWNfZXZlbnRfcGFnZVtjcHVdKQorCQlvc2RfcGFnZV9mcmVlKGh2X2NvbnRleHQuc3luaWNfZXZlbnRfcGFnZVtjcHVdLCAxKTsKIAotCWlmIChnSHZDb250ZXh0LnN5bklDTWVzc2FnZVBhZ2VbY3B1XSkKLQkJb3NkX1BhZ2VGcmVlKGdIdkNvbnRleHQuc3luSUNNZXNzYWdlUGFnZVtjcHVdLCAxKTsKKwlpZiAoaHZfY29udGV4dC5zeW5pY19tZXNzYWdlX3BhZ2VbY3B1XSkKKwkJb3NkX3BhZ2VfZnJlZShodl9jb250ZXh0LnN5bmljX21lc3NhZ2VfcGFnZVtjcHVdLCAxKTsKIAlyZXR1cm47CiB9CiAKIC8qCi0gKiBIdlN5bmljQ2xlYW51cCAtIENsZWFudXAgcm91dGluZSBmb3IgSHZTeW5pY0luaXQoKS4KKyAqIGh2X3N5bmljX2NsZWFudXAgLSBDbGVhbnVwIHJvdXRpbmUgZm9yIGh2X3N5bmljX2luaXQoKS4KICAqLwotdm9pZCBIdlN5bmljQ2xlYW51cCh2b2lkICphcmcpCit2b2lkIGh2X3N5bmljX2NsZWFudXAodm9pZCAqYXJnKQogewotCXVuaW9uIGh2X3N5bmljX3NpbnQgc2hhcmVkU2ludDsKKwl1bmlvbiBodl9zeW5pY19zaW50IHNoYXJlZF9zaW50OwogCXVuaW9uIGh2X3N5bmljX3NpbXAgc2ltcDsKIAl1bmlvbiBodl9zeW5pY19zaWVmcCBzaWVmcDsKIAlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCi0JaWYgKCFnSHZDb250ZXh0LlN5bklDSW5pdGlhbGl6ZWQpCisJaWYgKCFodl9jb250ZXh0LnN5bmljX2luaXRpYWxpemVkKQogCQlyZXR1cm47CiAKLQlyZG1zcmwoSFZfWDY0X01TUl9TSU5UMCArIFZNQlVTX01FU1NBR0VfU0lOVCwgc2hhcmVkU2ludC5Bc1VJTlQ2NCk7CisJcmRtc3JsKEhWX1g2NF9NU1JfU0lOVDAgKyBWTUJVU19NRVNTQUdFX1NJTlQsIHNoYXJlZF9zaW50LmFzX3VpbnQ2NCk7CiAKLQlzaGFyZWRTaW50Lk1hc2tlZCA9IDE7CisJc2hhcmVkX3NpbnQubWFza2VkID0gMTsKIAogCS8qIE5lZWQgdG8gY29ycmVjdGx5IGNsZWFudXAgaW4gdGhlIGNhc2Ugb2YgU01QISEhICovCiAJLyogRGlzYWJsZSB0aGUgaW50ZXJydXB0ICovCi0Jd3Jtc3JsKEhWX1g2NF9NU1JfU0lOVDAgKyBWTUJVU19NRVNTQUdFX1NJTlQsIHNoYXJlZFNpbnQuQXNVSU5UNjQpOworCXdybXNybChIVl9YNjRfTVNSX1NJTlQwICsgVk1CVVNfTUVTU0FHRV9TSU5ULCBzaGFyZWRfc2ludC5hc191aW50NjQpOwogCi0JcmRtc3JsKEhWX1g2NF9NU1JfU0lNUCwgc2ltcC5Bc1VJTlQ2NCk7Ci0Jc2ltcC5TaW1wRW5hYmxlZCA9IDA7Ci0Jc2ltcC5CYXNlU2ltcEdwYSA9IDA7CisJcmRtc3JsKEhWX1g2NF9NU1JfU0lNUCwgc2ltcC5hc191aW50NjQpOworCXNpbXAuc2ltcF9lbmFibGVkID0gMDsKKwlzaW1wLmJhc2Vfc2ltcF9ncGEgPSAwOwogCi0Jd3Jtc3JsKEhWX1g2NF9NU1JfU0lNUCwgc2ltcC5Bc1VJTlQ2NCk7CisJd3Jtc3JsKEhWX1g2NF9NU1JfU0lNUCwgc2ltcC5hc191aW50NjQpOwogCi0JcmRtc3JsKEhWX1g2NF9NU1JfU0lFRlAsIHNpZWZwLkFzVUlOVDY0KTsKLQlzaWVmcC5TaWVmcEVuYWJsZWQgPSAwOwotCXNpZWZwLkJhc2VTaWVmcEdwYSA9IDA7CisJcmRtc3JsKEhWX1g2NF9NU1JfU0lFRlAsIHNpZWZwLmFzX3VpbnQ2NCk7CisJc2llZnAuc2llZnBfZW5hYmxlZCA9IDA7CisJc2llZnAuYmFzZV9zaWVmcF9ncGEgPSAwOwogCi0Jd3Jtc3JsKEhWX1g2NF9NU1JfU0lFRlAsIHNpZWZwLkFzVUlOVDY0KTsKKwl3cm1zcmwoSFZfWDY0X01TUl9TSUVGUCwgc2llZnAuYXNfdWludDY0KTsKIAotCW9zZF9QYWdlRnJlZShnSHZDb250ZXh0LnN5bklDTWVzc2FnZVBhZ2VbY3B1XSwgMSk7Ci0Jb3NkX1BhZ2VGcmVlKGdIdkNvbnRleHQuc3luSUNFdmVudFBhZ2VbY3B1XSwgMSk7CisJb3NkX3BhZ2VfZnJlZShodl9jb250ZXh0LnN5bmljX21lc3NhZ2VfcGFnZVtjcHVdLCAxKTsKKwlvc2RfcGFnZV9mcmVlKGh2X2NvbnRleHQuc3luaWNfZXZlbnRfcGFnZVtjcHVdLCAxKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9odi5oIGIvZHJpdmVycy9zdGFnaW5nL2h2L2h2LmgKaW5kZXggNDFmNWViYi4uODI5YWZmODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi9odi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi9odi5oCkBAIC05Miw0OSArOTIsNDkgQEAKIAogCiBzdHJ1Y3QgaHZfaW5wdXRfc2lnbmFsX2V2ZW50X2J1ZmZlciB7Ci0JdTY0IEFsaWduODsKLQlzdHJ1Y3QgaHZfaW5wdXRfc2lnbmFsX2V2ZW50IEV2ZW50OworCXU2NCBhbGlnbjg7CisJc3RydWN0IGh2X2lucHV0X3NpZ25hbF9ldmVudCBldmVudDsKIH07CiAKIHN0cnVjdCBodl9jb250ZXh0IHsKIAkvKiBXZSBvbmx5IHN1cHBvcnQgcnVubmluZyBvbiB0b3Agb2YgSHlwZXItVgogCSogU28gYXQgdGhpcyBwb2ludCB0aGlzIHJlYWxseSBjYW4gb25seSBjb250YWluIHRoZSBIeXBlci1WIElECiAJKi8KLQl1NjQgR3Vlc3RJZDsKKwl1NjQgZ3Vlc3RpZDsKIAotCXZvaWQgKkh5cGVyY2FsbFBhZ2U7CisJdm9pZCAqaHlwZXJjYWxsX3BhZ2U7CiAKLQlib29sIFN5bklDSW5pdGlhbGl6ZWQ7CisJYm9vbCBzeW5pY19pbml0aWFsaXplZDsKIAogCS8qCiAJICogVGhpcyBpcyB1c2VkIGFzIGFuIGlucHV0IHBhcmFtIHRvIEh2Q2FsbFNpZ25hbEV2ZW50IGh5cGVyY2FsbC4gVGhlCiAJICogaW5wdXQgcGFyYW0gaXMgaW1tdXRhYmxlIGluIG91ciB1c2FnZSBhbmQgbXVzdCBiZSBkeW5hbWljIG1lbSAodnMKIAkgKiBzdGFjayBvciBnbG9iYWwpLiAqLwotCXN0cnVjdCBodl9pbnB1dF9zaWduYWxfZXZlbnRfYnVmZmVyICpTaWduYWxFdmVudEJ1ZmZlcjsKKwlzdHJ1Y3QgaHZfaW5wdXRfc2lnbmFsX2V2ZW50X2J1ZmZlciAqc2lnbmFsX2V2ZW50X2J1ZmZlcjsKIAkvKiA4LWJ5dGVzIGFsaWduZWQgb2YgdGhlIGJ1ZmZlciBhYm92ZSAqLwotCXN0cnVjdCBodl9pbnB1dF9zaWduYWxfZXZlbnQgKlNpZ25hbEV2ZW50UGFyYW07CisJc3RydWN0IGh2X2lucHV0X3NpZ25hbF9ldmVudCAqc2lnbmFsX2V2ZW50X3BhcmFtOwogCi0Jdm9pZCAqc3luSUNNZXNzYWdlUGFnZVtNQVhfTlVNX0NQVVNdOwotCXZvaWQgKnN5bklDRXZlbnRQYWdlW01BWF9OVU1fQ1BVU107CisJdm9pZCAqc3luaWNfbWVzc2FnZV9wYWdlW01BWF9OVU1fQ1BVU107CisJdm9pZCAqc3luaWNfZXZlbnRfcGFnZVtNQVhfTlVNX0NQVVNdOwogfTsKIAotZXh0ZXJuIHN0cnVjdCBodl9jb250ZXh0IGdIdkNvbnRleHQ7CitleHRlcm4gc3RydWN0IGh2X2NvbnRleHQgaHZfY29udGV4dDsKIAogCiAvKiBIdiBJbnRlcmZhY2UgKi8KIAotZXh0ZXJuIGludCBIdkluaXQodm9pZCk7CitleHRlcm4gaW50IGh2X2luaXQodm9pZCk7CiAKLWV4dGVybiB2b2lkIEh2Q2xlYW51cCh2b2lkKTsKK2V4dGVybiB2b2lkIGh2X2NsZWFudXAodm9pZCk7CiAKLWV4dGVybiB1MTYgSHZQb3N0TWVzc2FnZSh1bmlvbiBodl9jb25uZWN0aW9uX2lkIGNvbm5lY3Rpb25JZCwKLQkJCSBlbnVtIGh2X21lc3NhZ2VfdHlwZSBtZXNzYWdlVHlwZSwKLQkJCSB2b2lkICpwYXlsb2FkLCBzaXplX3QgcGF5bG9hZFNpemUpOworZXh0ZXJuIHUxNiBodl9wb3N0X21lc3NhZ2UodW5pb24gaHZfY29ubmVjdGlvbl9pZCBjb25uZWN0aW9uX2lkLAorCQkJIGVudW0gaHZfbWVzc2FnZV90eXBlIG1lc3NhZ2VfdHlwZSwKKwkJCSB2b2lkICpwYXlsb2FkLCBzaXplX3QgcGF5bG9hZF9zaXplKTsKIAotZXh0ZXJuIHUxNiBIdlNpZ25hbEV2ZW50KHZvaWQpOworZXh0ZXJuIHUxNiBodl9zaWduYWxfZXZlbnQodm9pZCk7CiAKLWV4dGVybiB2b2lkIEh2U3luaWNJbml0KHZvaWQgKmlycWFyZyk7CitleHRlcm4gdm9pZCBodl9zeW5pY19pbml0KHZvaWQgKmlycWFyZyk7CiAKLWV4dGVybiB2b2lkIEh2U3luaWNDbGVhbnVwKHZvaWQgKmFyZyk7CitleHRlcm4gdm9pZCBodl9zeW5pY19jbGVhbnVwKHZvaWQgKmFyZyk7CiAKICNlbmRpZiAvKiBfX0hWX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L2h2X2FwaS5oIGIvZHJpdmVycy9zdGFnaW5nL2h2L2h2X2FwaS5oCmluZGV4IDllYjgxOGUuLjcwZTg2M2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi9odl9hcGkuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaHYvaHZfYXBpLmgKQEAgLTUxMCwyMSArNTEwLDIxIEBACiAKIC8qCiAgKiBUaGUgYmVsb3cgQ1BVSUQgbGVhdmVzIGFyZSBwcmVzZW50IGlmIFZlcnNpb25BbmRGZWF0dXJlcy5IeXBlcnZpc29yUHJlc2VudAotICogaXMgc2V0IGJ5IENQVUlEKEh2Q3B1SWRGdW5jdGlvblZlcnNpb25BbmRGZWF0dXJlcykuCisgKiBpcyBzZXQgYnkgQ1BVSUQoSFZDUFVJRF9WRVJTSU9OX0ZFQVRVUkVTKS4KICAqLwogZW51bSBodl9jcHVpZF9mdW5jdGlvbiB7Ci0JSHZDcHVJZEZ1bmN0aW9uVmVyc2lvbkFuZEZlYXR1cmVzCQk9IDB4MDAwMDAwMDEsCi0JSHZDcHVJZEZ1bmN0aW9uSHZWZW5kb3JBbmRNYXhGdW5jdGlvbgkJPSAweDQwMDAwMDAwLAotCUh2Q3B1SWRGdW5jdGlvbkh2SW50ZXJmYWNlCQkJPSAweDQwMDAwMDAxLAorCUhWQ1BVSURfVkVSU0lPTl9GRUFUVVJFUwkJPSAweDAwMDAwMDAxLAorCUhWQ1BVSURfVkVORE9SX01BWEZVTkNUSU9OCQk9IDB4NDAwMDAwMDAsCisJSFZDUFVJRF9JTlRFUkZBQ0UJCQk9IDB4NDAwMDAwMDEsCiAKIAkvKgogCSAqIFRoZSByZW1haW5pbmcgZnVuY3Rpb25zIGRlcGVuZCBvbiB0aGUgdmFsdWUgb2YKLQkgKiBIdkNwdUlkRnVuY3Rpb25JbnRlcmZhY2UKKwkgKiBIVkNQVUlEX0lOVEVSRkFDRQogCSAqLwotCUh2Q3B1SWRGdW5jdGlvbk1zSHZWZXJzaW9uCQkJPSAweDQwMDAwMDAyLAotCUh2Q3B1SWRGdW5jdGlvbk1zSHZGZWF0dXJlcwkJCT0gMHg0MDAwMDAwMywKLQlIdkNwdUlkRnVuY3Rpb25Nc0h2RW5saWdodGVubWVudEluZm9ybWF0aW9uCT0gMHg0MDAwMDAwNCwKLQlIdkNwdUlkRnVuY3Rpb25Nc0h2SW1wbGVtZW50YXRpb25MaW1pdHMJCT0gMHg0MDAwMDAwNSwKKwlIVkNQVUlEX1ZFUlNJT04JCQk9IDB4NDAwMDAwMDIsCisJSFZDUFVJRF9GRUFUVVJFUwkJCT0gMHg0MDAwMDAwMywKKwlIVkNQVUlEX0VOTElHSFRFTk1FTlRfSU5GTwk9IDB4NDAwMDAwMDQsCisJSFZDUFVJRF9JTVBMRU1FTlRBVElPTl9MSU1JVFMJCT0gMHg0MDAwMDAwNSwKIH07CiAKIC8qIERlZmluZSB0aGUgdmlydHVhbCBBUElDIHJlZ2lzdGVycyAqLwpAQCAtNTc1LDMwICs1NzUsMzAgQEAKIAogLyogRGVmaW5lIGh5cGVydmlzb3IgbWVzc2FnZSB0eXBlcy4gKi8KIGVudW0gaHZfbWVzc2FnZV90eXBlIHsKLQlIdk1lc3NhZ2VUeXBlTm9uZQkJCT0gMHgwMDAwMDAwMCwKKwlIVk1TR19OT05FCQkJPSAweDAwMDAwMDAwLAogCiAJLyogTWVtb3J5IGFjY2VzcyBtZXNzYWdlcy4gKi8KLQlIdk1lc3NhZ2VUeXBlVW5tYXBwZWRHcGEJCT0gMHg4MDAwMDAwMCwKLQlIdk1lc3NhZ2VUeXBlR3BhSW50ZXJjZXB0CQk9IDB4ODAwMDAwMDEsCisJSFZNU0dfVU5NQVBQRURfR1BBCQk9IDB4ODAwMDAwMDAsCisJSFZNU0dfR1BBX0lOVEVSQ0VQVAkJPSAweDgwMDAwMDAxLAogCiAJLyogVGltZXIgbm90aWZpY2F0aW9uIG1lc3NhZ2VzLiAqLwotCUh2TWVzc2FnZVRpbWVyRXhwaXJlZAkJCT0gMHg4MDAwMDAxMCwKKwlIVk1TR19USU1FUl9FWFBJUkVECQkJPSAweDgwMDAwMDEwLAogCiAJLyogRXJyb3IgbWVzc2FnZXMuICovCi0JSHZNZXNzYWdlVHlwZUludmFsaWRWcFJlZ2lzdGVyVmFsdWUJPSAweDgwMDAwMDIwLAotCUh2TWVzc2FnZVR5cGVVbnJlY292ZXJhYmxlRXhjZXB0aW9uCT0gMHg4MDAwMDAyMSwKLQlIdk1lc3NhZ2VUeXBlVW5zdXBwb3J0ZWRGZWF0dXJlCQk9IDB4ODAwMDAwMjIsCisJSFZNU0dfSU5WQUxJRF9WUF9SRUdJU1RFUl9WQUxVRQk9IDB4ODAwMDAwMjAsCisJSFZNU0dfVU5SRUNPVkVSQUJMRV9FWENFUFRJT04JPSAweDgwMDAwMDIxLAorCUhWTVNHX1VOU1VQUE9SVEVEX0ZFQVRVUkUJCT0gMHg4MDAwMDAyMiwKIAogCS8qIFRyYWNlIGJ1ZmZlciBjb21wbGV0ZSBtZXNzYWdlcy4gKi8KLQlIdk1lc3NhZ2VUeXBlRXZlbnRMb2dCdWZmZXJDb21wbGV0ZQk9IDB4ODAwMDAwNDAsCisJSFZNU0dfRVZFTlRMT0dfQlVGRkVSQ09NUExFVEUJPSAweDgwMDAwMDQwLAogCiAJLyogUGxhdGZvcm0tc3BlY2lmaWMgcHJvY2Vzc29yIGludGVyY2VwdCBtZXNzYWdlcy4gKi8KLQlIdk1lc3NhZ2VUeXBlWDY0SW9Qb3J0SW50ZXJjZXB0CQk9IDB4ODAwMTAwMDAsCi0JSHZNZXNzYWdlVHlwZVg2NE1zckludGVyY2VwdAkJPSAweDgwMDEwMDAxLAotCUh2TWVzc2FnZVR5cGVYNjRDcHVpZEludGVyY2VwdAkJPSAweDgwMDEwMDAyLAotCUh2TWVzc2FnZVR5cGVYNjRFeGNlcHRpb25JbnRlcmNlcHQJPSAweDgwMDEwMDAzLAotCUh2TWVzc2FnZVR5cGVYNjRBcGljRW9pCQkJPSAweDgwMDEwMDA0LAotCUh2TWVzc2FnZVR5cGVYNjRMZWdhY3lGcEVycm9yCQk9IDB4ODAwMTAwMDUKKwlIVk1TR19YNjRfSU9QT1JUX0lOVEVSQ0VQVAkJPSAweDgwMDEwMDAwLAorCUhWTVNHX1g2NF9NU1JfSU5URVJDRVBUCQk9IDB4ODAwMTAwMDEsCisJSFZNU0dfWDY0X0NQVUlEX0lOVEVSQ0VQVAkJPSAweDgwMDEwMDAyLAorCUhWTVNHX1g2NF9FWENFUFRJT05fSU5URVJDRVBUCT0gMHg4MDAxMDAwMywKKwlIVk1TR19YNjRfQVBJQ19FT0kJCQk9IDB4ODAwMTAwMDQsCisJSFZNU0dfWDY0X0xFR0FDWV9GUF9FUlJPUgkJPSAweDgwMDEwMDA1CiB9OwogCiAvKiBEZWZpbmUgdGhlIG51bWJlciBvZiBzeW50aGV0aWMgaW50ZXJydXB0IHNvdXJjZXMuICovCkBAIC02MTAsMTAzICs2MTAsMTAzIEBACiAKIC8qIERlZmluZSBjb25uZWN0aW9uIGlkZW50aWZpZXIgdHlwZS4gKi8KIHVuaW9uIGh2X2Nvbm5lY3Rpb25faWQgewotCXUzMiBBc3UzMjsKKwl1MzIgYXN1MzI7CiAJc3RydWN0IHsKLQkJdTMyIElkOjI0OwotCQl1MzIgUmVzZXJ2ZWQ6ODsKKwkJdTMyIGlkOjI0OworCQl1MzIgcmVzZXJ2ZWQ6ODsKIAl9IHU7CiB9OwogCiAvKiBEZWZpbmUgcG9ydCBpZGVudGlmaWVyIHR5cGUuICovCiB1bmlvbiBodl9wb3J0X2lkIHsKLQl1MzIgQXN1MzI7CisJdTMyIGFzdTMyOwogCXN0cnVjdCB7Ci0JCXUzMiBJZDoyNDsKLQkJdTMyIFJlc2VydmVkOjg7CisJCXUzMiBpZDoyNDsKKwkJdTMyIHJlc2VydmVkOjg7CiAJfSB1IDsKIH07CiAKIC8qIERlZmluZSBwb3J0IHR5cGUuICovCiBlbnVtIGh2X3BvcnRfdHlwZSB7Ci0JSHZQb3J0VHlwZU1lc3NhZ2UJPSAxLAotCUh2UG9ydFR5cGVFdmVudAkJPSAyLAotCUh2UG9ydFR5cGVNb25pdG9yCT0gMworCUhWUE9SVF9NU0cJPSAxLAorCUhWUE9SVF9FVkVOVAkJPSAyLAorCUhWUE9SVF9NT05JVE9SCT0gMwogfTsKIAogLyogRGVmaW5lIHBvcnQgaW5mb3JtYXRpb24gc3RydWN0dXJlLiAqLwogc3RydWN0IGh2X3BvcnRfaW5mbyB7Ci0JZW51bSBodl9wb3J0X3R5cGUgUG9ydFR5cGU7Ci0JdTMyIFBhZGRpbmc7CisJZW51bSBodl9wb3J0X3R5cGUgcG9ydF90eXBlOworCXUzMiBwYWRkaW5nOwogCXVuaW9uIHsKIAkJc3RydWN0IHsKLQkJCXUzMiBUYXJnZXRTaW50OwotCQkJdTMyIFRhcmdldFZwOwotCQkJdTY0IFJzdmRaOwotCQl9IE1lc3NhZ2VQb3J0SW5mbzsKKwkJCXUzMiB0YXJnZXRfc2ludDsKKwkJCXUzMiB0YXJnZXRfdnA7CisJCQl1NjQgcnN2ZHo7CisJCX0gbWVzc2FnZV9wb3J0X2luZm87CiAJCXN0cnVjdCB7Ci0JCQl1MzIgVGFyZ2V0U2ludDsKLQkJCXUzMiBUYXJnZXRWcDsKLQkJCXUxNiBCYXNlRmxhZ051bWJlcjsKLQkJCXUxNiBGbGFnQ291bnQ7Ci0JCQl1MzIgUnN2ZFo7Ci0JCX0gRXZlbnRQb3J0SW5mbzsKKwkJCXUzMiB0YXJnZXRfc2ludDsKKwkJCXUzMiB0YXJnZXRfdnA7CisJCQl1MTYgYmFzZV9mbGFnX2J1bWJlcjsKKwkJCXUxNiBmbGFnX2NvdW50OworCQkJdTMyIHJzdmR6OworCQl9IGV2ZW50X3BvcnRfaW5mbzsKIAkJc3RydWN0IHsKLQkJCXU2NCBNb25pdG9yQWRkcmVzczsKLQkJCXU2NCBSc3ZkWjsKLQkJfSBNb25pdG9yUG9ydEluZm87CisJCQl1NjQgbW9uaXRvcl9hZGRyZXNzOworCQkJdTY0IHJzdmR6OworCQl9IG1vbml0b3JfcG9ydF9pbmZvOwogCX07CiB9OwogCiBzdHJ1Y3QgaHZfY29ubmVjdGlvbl9pbmZvIHsKLQllbnVtIGh2X3BvcnRfdHlwZSBQb3J0VHlwZTsKLQl1MzIgUGFkZGluZzsKKwllbnVtIGh2X3BvcnRfdHlwZSBwb3J0X3R5cGU7CisJdTMyIHBhZGRpbmc7CiAJdW5pb24gewogCQlzdHJ1Y3QgewotCQkJdTY0IFJzdmRaOwotCQl9IE1lc3NhZ2VDb25uZWN0aW9uSW5mbzsKKwkJCXU2NCByc3ZkejsKKwkJfSBtZXNzYWdlX2Nvbm5lY3Rpb25faW5mbzsKIAkJc3RydWN0IHsKLQkJCXU2NCBSc3ZkWjsKLQkJfSBFdmVudENvbm5lY3Rpb25JbmZvOworCQkJdTY0IHJzdmR6OworCQl9IGV2ZW50X2Nvbm5lY3Rpb25faW5mbzsKIAkJc3RydWN0IHsKLQkJCXU2NCBNb25pdG9yQWRkcmVzczsKLQkJfSBNb25pdG9yQ29ubmVjdGlvbkluZm87CisJCQl1NjQgbW9uaXRvcl9hZGRyZXNzOworCQl9IG1vbml0b3JfY29ubmVjdGlvbl9pbmZvOwogCX07CiB9OwogCiAvKiBEZWZpbmUgc3ludGhldGljIGludGVycnVwdCBjb250cm9sbGVyIG1lc3NhZ2UgZmxhZ3MuICovCiB1bmlvbiBodl9tZXNzYWdlX2ZsYWdzIHsKLQl1OCBBc3U4OworCXU4IGFzdTg7CiAJc3RydWN0IHsKLQkJdTggTWVzc2FnZVBlbmRpbmc6MTsKLQkJdTggUmVzZXJ2ZWQ6NzsKKwkJdTggbXNnX3BlbmRpbmc6MTsKKwkJdTggcmVzZXJ2ZWQ6NzsKIAl9OwogfTsKIAogLyogRGVmaW5lIHN5bnRoZXRpYyBpbnRlcnJ1cHQgY29udHJvbGxlciBtZXNzYWdlIGhlYWRlci4gKi8KIHN0cnVjdCBodl9tZXNzYWdlX2hlYWRlciB7Ci0JZW51bSBodl9tZXNzYWdlX3R5cGUgTWVzc2FnZVR5cGU7Ci0JdTggUGF5bG9hZFNpemU7Ci0JdW5pb24gaHZfbWVzc2FnZV9mbGFncyBNZXNzYWdlRmxhZ3M7Ci0JdTggUmVzZXJ2ZWRbMl07CisJZW51bSBodl9tZXNzYWdlX3R5cGUgbWVzc2FnZV90eXBlOworCXU4IHBheWxvYWRfc2l6ZTsKKwl1bmlvbiBodl9tZXNzYWdlX2ZsYWdzIG1lc3NhZ2VfZmxhZ3M7CisJdTggcmVzZXJ2ZWRbMl07CiAJdW5pb24gewotCQl1NjQgU2VuZGVyOwotCQl1bmlvbiBodl9wb3J0X2lkIFBvcnQ7CisJCXU2NCBzZW5kZXI7CisJCXVuaW9uIGh2X3BvcnRfaWQgcG9ydDsKIAl9OwogfTsKIAogLyogRGVmaW5lIHRpbWVyIG1lc3NhZ2UgcGF5bG9hZCBzdHJ1Y3R1cmUuICovCiBzdHJ1Y3QgaHZfdGltZXJfbWVzc2FnZV9wYXlsb2FkIHsKLQl1MzIgVGltZXJJbmRleDsKLQl1MzIgUmVzZXJ2ZWQ7Ci0JdTY0IEV4cGlyYXRpb25UaW1lOwkvKiBXaGVuIHRoZSB0aW1lciBleHBpcmVkICovCi0JdTY0IERlbGl2ZXJ5VGltZTsJLyogV2hlbiB0aGUgbWVzc2FnZSB3YXMgZGVsaXZlcmVkICovCisJdTMyIHRpbWVyX2luZGV4OworCXUzMiByZXNlcnZlZDsKKwl1NjQgZXhwaXJhdGlvbl90aW1lOwkvKiBXaGVuIHRoZSB0aW1lciBleHBpcmVkICovCisJdTY0IGRlbGl2ZXJ5X3RpbWU7CS8qIFdoZW4gdGhlIG1lc3NhZ2Ugd2FzIGRlbGl2ZXJlZCAqLwogfTsKIAogLyogRGVmaW5lIHN5bnRoZXRpYyBpbnRlcnJ1cHQgY29udHJvbGxlciBtZXNzYWdlIGZvcm1hdC4gKi8KIHN0cnVjdCBodl9tZXNzYWdlIHsKLQlzdHJ1Y3QgaHZfbWVzc2FnZV9oZWFkZXIgSGVhZGVyOworCXN0cnVjdCBodl9tZXNzYWdlX2hlYWRlciBoZWFkZXI7CiAJdW5pb24gewotCQl1NjQgUGF5bG9hZFtIVl9NRVNTQUdFX1BBWUxPQURfUVdPUkRfQ09VTlRdOworCQl1NjQgcGF5bG9hZFtIVl9NRVNTQUdFX1BBWUxPQURfUVdPUkRfQ09VTlRdOwogCX0gdSA7CiB9OwogCkBAIC03MTUsODIgKzcxNSw4MiBAQAogCiAvKiBEZWZpbmUgdGhlIHN5bnRoZXRpYyBpbnRlcnJ1cHQgbWVzc2FnZSBwYWdlIGxheW91dC4gKi8KIHN0cnVjdCBodl9tZXNzYWdlX3BhZ2UgewotCXN0cnVjdCBodl9tZXNzYWdlIFNpbnRNZXNzYWdlW0hWX1NZTklDX1NJTlRfQ09VTlRdOworCXN0cnVjdCBodl9tZXNzYWdlIHNpbnRfbWVzc2FnZVtIVl9TWU5JQ19TSU5UX0NPVU5UXTsKIH07CiAKIC8qIERlZmluZSB0aGUgc3ludGhldGljIGludGVycnVwdCBjb250cm9sbGVyIGV2ZW50IGZsYWdzIGZvcm1hdC4gKi8KIHVuaW9uIGh2X3N5bmljX2V2ZW50X2ZsYWdzIHsKLQl1OCBGbGFnczhbSFZfRVZFTlRfRkxBR1NfQllURV9DT1VOVF07Ci0JdTMyIEZsYWdzMzJbSFZfRVZFTlRfRkxBR1NfRFdPUkRfQ09VTlRdOworCXU4IGZsYWdzOFtIVl9FVkVOVF9GTEFHU19CWVRFX0NPVU5UXTsKKwl1MzIgZmxhZ3MzMltIVl9FVkVOVF9GTEFHU19EV09SRF9DT1VOVF07CiB9OwogCiAvKiBEZWZpbmUgdGhlIHN5bnRoZXRpYyBpbnRlcnJ1cHQgZmxhZ3MgcGFnZSBsYXlvdXQuICovCiBzdHJ1Y3QgaHZfc3luaWNfZXZlbnRfZmxhZ3NfcGFnZSB7Ci0JdW5pb24gaHZfc3luaWNfZXZlbnRfZmxhZ3MgU2ludEV2ZW50RmxhZ3NbSFZfU1lOSUNfU0lOVF9DT1VOVF07CisJdW5pb24gaHZfc3luaWNfZXZlbnRfZmxhZ3Mgc2ludGV2ZW50X2ZsYWdzW0hWX1NZTklDX1NJTlRfQ09VTlRdOwogfTsKIAogLyogRGVmaW5lIFN5bklDIGNvbnRyb2wgcmVnaXN0ZXIuICovCiB1bmlvbiBodl9zeW5pY19zY29udHJvbCB7Ci0JdTY0IEFzVUlOVDY0OworCXU2NCBhc191aW50NjQ7CiAJc3RydWN0IHsKLQkJdTY0IEVuYWJsZToxOwotCQl1NjQgUmVzZXJ2ZWQ6NjM7CisJCXU2NCBlbmFibGU6MTsKKwkJdTY0IHJlc2VydmVkOjYzOwogCX07CiB9OwogCiAvKiBEZWZpbmUgc3ludGhldGljIGludGVycnVwdCBzb3VyY2UuICovCiB1bmlvbiBodl9zeW5pY19zaW50IHsKLQl1NjQgQXNVSU5UNjQ7CisJdTY0IGFzX3VpbnQ2NDsKIAlzdHJ1Y3QgewotCQl1NjQgVmVjdG9yOjg7Ci0JCXU2NCBSZXNlcnZlZDE6ODsKLQkJdTY0IE1hc2tlZDoxOwotCQl1NjQgQXV0b0VvaToxOwotCQl1NjQgUmVzZXJ2ZWQyOjQ2OworCQl1NjQgdmVjdG9yOjg7CisJCXU2NCByZXNlcnZlZDE6ODsKKwkJdTY0IG1hc2tlZDoxOworCQl1NjQgYXV0b19lb2k6MTsKKwkJdTY0IHJlc2VydmVkMjo0NjsKIAl9OwogfTsKIAogLyogRGVmaW5lIHRoZSBmb3JtYXQgb2YgdGhlIFNJTVAgcmVnaXN0ZXIgKi8KIHVuaW9uIGh2X3N5bmljX3NpbXAgewotCXU2NCBBc1VJTlQ2NDsKKwl1NjQgYXNfdWludDY0OwogCXN0cnVjdCB7Ci0JCXU2NCBTaW1wRW5hYmxlZDoxOwotCQl1NjQgUHJlc2VydmVkOjExOwotCQl1NjQgQmFzZVNpbXBHcGE6NTI7CisJCXU2NCBzaW1wX2VuYWJsZWQ6MTsKKwkJdTY0IHByZXNlcnZlZDoxMTsKKwkJdTY0IGJhc2Vfc2ltcF9ncGE6NTI7CiAJfTsKIH07CiAKIC8qIERlZmluZSB0aGUgZm9ybWF0IG9mIHRoZSBTSUVGUCByZWdpc3RlciAqLwogdW5pb24gaHZfc3luaWNfc2llZnAgewotCXU2NCBBc1VJTlQ2NDsKKwl1NjQgYXNfdWludDY0OwogCXN0cnVjdCB7Ci0JCXU2NCBTaWVmcEVuYWJsZWQ6MTsKLQkJdTY0IFByZXNlcnZlZDoxMTsKLQkJdTY0IEJhc2VTaWVmcEdwYTo1MjsKKwkJdTY0IHNpZWZwX2VuYWJsZWQ6MTsKKwkJdTY0IHByZXNlcnZlZDoxMTsKKwkJdTY0IGJhc2Vfc2llZnBfZ3BhOjUyOwogCX07CiB9OwogCiAvKiBEZWZpbml0aW9ucyBmb3IgdGhlIG1vbml0b3JlZCBub3RpZmljYXRpb24gZmFjaWxpdHkgKi8KIHVuaW9uIGh2X21vbml0b3JfdHJpZ2dlcl9ncm91cCB7Ci0JdTY0IEFzVUlOVDY0OworCXU2NCBhc191aW50NjQ7CiAJc3RydWN0IHsKLQkJdTMyIFBlbmRpbmc7Ci0JCXUzMiBBcm1lZDsKKwkJdTMyIHBlbmRpbmc7CisJCXUzMiBhcm1lZDsKIAl9OwogfTsKIAogc3RydWN0IGh2X21vbml0b3JfcGFyYW1ldGVyIHsKLQl1bmlvbiBodl9jb25uZWN0aW9uX2lkIENvbm5lY3Rpb25JZDsKLQl1MTYgRmxhZ051bWJlcjsKLQl1MTYgUnN2ZFo7CisJdW5pb24gaHZfY29ubmVjdGlvbl9pZCBjb25uZWN0aW9uaWQ7CisJdTE2IGZsYWdudW1iZXI7CisJdTE2IHJzdmR6OwogfTsKIAogdW5pb24gaHZfbW9uaXRvcl90cmlnZ2VyX3N0YXRlIHsKLQl1MzIgQXN1MzI7CisJdTMyIGFzdTMyOwogCiAJc3RydWN0IHsKLQkJdTMyIEdyb3VwRW5hYmxlOjQ7Ci0JCXUzMiBSc3ZkWjoyODsKKwkJdTMyIGdyb3VwX2VuYWJsZTo0OworCQl1MzIgcnN2ZHo6Mjg7CiAJfTsKIH07CiAKQEAgLTgxNCw0MiArODE0LDQyIEBACiAvKiB8IDg0MCB8IFJzdmQ0WzBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogc3RydWN0IGh2X21vbml0b3JfcGFnZSB7Ci0JdW5pb24gaHZfbW9uaXRvcl90cmlnZ2VyX3N0YXRlIFRyaWdnZXJTdGF0ZTsKLQl1MzIgUnN2ZFoxOworCXVuaW9uIGh2X21vbml0b3JfdHJpZ2dlcl9zdGF0ZSB0cmlnZ2VyX3N0YXRlOworCXUzMiByc3ZkejE7CiAKLQl1bmlvbiBodl9tb25pdG9yX3RyaWdnZXJfZ3JvdXAgVHJpZ2dlckdyb3VwWzRdOwotCXU2NCBSc3ZkWjJbM107CisJdW5pb24gaHZfbW9uaXRvcl90cmlnZ2VyX2dyb3VwIHRyaWdnZXJfZ3JvdXBbNF07CisJdTY0IHJzdmR6MlszXTsKIAotCXMzMiBOZXh0Q2hlY2tUaW1lWzRdWzMyXTsKKwlzMzIgbmV4dF9jaGVja3RpbWVbNF1bMzJdOwogCi0JdTE2IExhdGVuY3lbNF1bMzJdOwotCXU2NCBSc3ZkWjNbMzJdOworCXUxNiBsYXRlbmN5WzRdWzMyXTsKKwl1NjQgcnN2ZHozWzMyXTsKIAotCXN0cnVjdCBodl9tb25pdG9yX3BhcmFtZXRlciBQYXJhbWV0ZXJbNF1bMzJdOworCXN0cnVjdCBodl9tb25pdG9yX3BhcmFtZXRlciBwYXJhbWV0ZXJbNF1bMzJdOwogCi0JdTggUnN2ZFo0WzE5ODRdOworCXU4IHJzdmR6NFsxOTg0XTsKIH07CiAKIC8qIERlY2xhcmUgdGhlIHZhcmlvdXMgaHlwZXJjYWxsIG9wZXJhdGlvbnMuICovCiBlbnVtIGh2X2NhbGxfY29kZSB7Ci0JSHZDYWxsUG9zdE1lc3NhZ2UJPSAweDAwNWMsCi0JSHZDYWxsU2lnbmFsRXZlbnQJPSAweDAwNWQsCisJSFZDQUxMX1BPU1RfTUVTU0FHRQk9IDB4MDA1YywKKwlIVkNBTExfU0lHTkFMX0VWRU5UCT0gMHgwMDVkLAogfTsKIAotLyogRGVmaW5pdGlvbiBvZiB0aGUgSHZQb3N0TWVzc2FnZSBoeXBlcmNhbGwgaW5wdXQgc3RydWN0dXJlLiAqLworLyogRGVmaW5pdGlvbiBvZiB0aGUgaHZfcG9zdF9tZXNzYWdlIGh5cGVyY2FsbCBpbnB1dCBzdHJ1Y3R1cmUuICovCiBzdHJ1Y3QgaHZfaW5wdXRfcG9zdF9tZXNzYWdlIHsKLQl1bmlvbiBodl9jb25uZWN0aW9uX2lkIENvbm5lY3Rpb25JZDsKLQl1MzIgUmVzZXJ2ZWQ7Ci0JZW51bSBodl9tZXNzYWdlX3R5cGUgTWVzc2FnZVR5cGU7Ci0JdTMyIFBheWxvYWRTaXplOwotCXU2NCBQYXlsb2FkW0hWX01FU1NBR0VfUEFZTE9BRF9RV09SRF9DT1VOVF07CisJdW5pb24gaHZfY29ubmVjdGlvbl9pZCBjb25uZWN0aW9uaWQ7CisJdTMyIHJlc2VydmVkOworCWVudW0gaHZfbWVzc2FnZV90eXBlIG1lc3NhZ2VfdHlwZTsKKwl1MzIgcGF5bG9hZF9zaXplOworCXU2NCBwYXlsb2FkW0hWX01FU1NBR0VfUEFZTE9BRF9RV09SRF9DT1VOVF07CiB9OwogCi0vKiBEZWZpbml0aW9uIG9mIHRoZSBIdlNpZ25hbEV2ZW50IGh5cGVyY2FsbCBpbnB1dCBzdHJ1Y3R1cmUuICovCisvKiBEZWZpbml0aW9uIG9mIHRoZSBodl9zaWduYWxfZXZlbnQgaHlwZXJjYWxsIGlucHV0IHN0cnVjdHVyZS4gKi8KIHN0cnVjdCBodl9pbnB1dF9zaWduYWxfZXZlbnQgewotCXVuaW9uIGh2X2Nvbm5lY3Rpb25faWQgQ29ubmVjdGlvbklkOwotCXUxNiBGbGFnTnVtYmVyOwotCXUxNiBSc3ZkWjsKKwl1bmlvbiBodl9jb25uZWN0aW9uX2lkIGNvbm5lY3Rpb25pZDsKKwl1MTYgZmxhZ19udW1iZXI7CisJdTE2IHJzdmR6OwogfTsKIAogLyoKQEAgLTg1OSwxNiArODU5LDE2IEBACiAKIC8qIFZlcnNpb24gaW5mbyByZXBvcnRlZCBieSBndWVzdCBPUydzICovCiBlbnVtIGh2X2d1ZXN0X29zX3ZlbmRvciB7Ci0JSHZHdWVzdE9zVmVuZG9yTWljcm9zb2Z0CT0gMHgwMDAxCisJSFZHVUVTVE9TX1ZFTkRPUl9NSUNST1NPRlQJPSAweDAwMDEKIH07CiAKIGVudW0gaHZfZ3Vlc3Rfb3NfbWljcm9zb2Z0X2lkcyB7Ci0JSHZHdWVzdE9zTWljcm9zb2Z0VW5kZWZpbmVkCT0gMHgwMCwKLQlIdkd1ZXN0T3NNaWNyb3NvZnRNU0RPUwkJPSAweDAxLAotCUh2R3Vlc3RPc01pY3Jvc29mdFdpbmRvd3MzeAk9IDB4MDIsCi0JSHZHdWVzdE9zTWljcm9zb2Z0V2luZG93czl4CT0gMHgwMywKLQlIdkd1ZXN0T3NNaWNyb3NvZnRXaW5kb3dzTlQJPSAweDA0LAotCUh2R3Vlc3RPc01pY3Jvc29mdFdpbmRvd3NDRQk9IDB4MDUKKwlIVkdVRVNUT1NfTUlDUk9TT0ZUX1VOREVGSU5FRAk9IDB4MDAsCisJSFZHVUVTVE9TX01JQ1JPU09GVF9NU0RPUwkJPSAweDAxLAorCUhWR1VFU1RPU19NSUNST1NPRlRfV0lORE9XUzNYCT0gMHgwMiwKKwlIVkdVRVNUT1NfTUlDUk9TT0ZUX1dJTkRPV1M5WAk9IDB4MDMsCisJSFZHVUVTVE9TX01JQ1JPU09GVF9XSU5ET1dTTlQJPSAweDA0LAorCUhWR1VFU1RPU19NSUNST1NPRlRfV0lORE9XU0NFCT0gMHgwNQogfTsKIAogLyoKQEAgLTg3NywxNCArODc3LDE0IEBACiAjZGVmaW5lIEhWX1g2NF9NU1JfR1VFU1RfT1NfSUQJMHg0MDAwMDAwMAogCiB1bmlvbiBodl94NjRfbXNyX2d1ZXN0X29zX2lkX2NvbnRlbnRzIHsKLQl1NjQgQXNVSU5UNjQ7CisJdTY0IGFzX3VpbnQ2NDsKIAlzdHJ1Y3QgewotCQl1NjQgQnVpbGROdW1iZXI6MTY7Ci0JCXU2NCBTZXJ2aWNlVmVyc2lvbjo4OyAvKiBTZXJ2aWNlIFBhY2ssIGV0Yy4gKi8KLQkJdTY0IE1pbm9yVmVyc2lvbjo4OwotCQl1NjQgTWFqb3JWZXJzaW9uOjg7Ci0JCXU2NCBPc0lkOjg7IC8qIGVudW0gaHZfZ3Vlc3Rfb3NfbWljcm9zb2Z0X2lkcyAoaWYgVmVuZG9yPU1TKSAqLwotCQl1NjQgVmVuZG9ySWQ6MTY7IC8qIGVudW0gaHZfZ3Vlc3Rfb3NfdmVuZG9yICovCisJCXU2NCBidWlsZF9udW1iZXI6MTY7CisJCXU2NCBzZXJ2aWNlX3ZlcnNpb246ODsgLyogU2VydmljZSBQYWNrLCBldGMuICovCisJCXU2NCBtaW5vcl92ZXJzaW9uOjg7CisJCXU2NCBtYWpvcl92ZXJzaW9uOjg7CisJCXU2NCBvc19pZDo4OyAvKiBlbnVtIGh2X2d1ZXN0X29zX21pY3Jvc29mdF9pZHMgKGlmIFZlbmRvcj1NUykgKi8KKwkJdTY0IHZlbmRvcl9pZDoxNjsgLyogZW51bSBodl9ndWVzdF9vc192ZW5kb3IgKi8KIAl9OwogfTsKIApAQCAtODk0LDExICs4OTQsMTEgQEAKICNkZWZpbmUgSFZfWDY0X01TUl9IWVBFUkNBTEwJMHg0MDAwMDAwMQogCiB1bmlvbiBodl94NjRfbXNyX2h5cGVyY2FsbF9jb250ZW50cyB7Ci0JdTY0IEFzVUlOVDY0OworCXU2NCBhc191aW50NjQ7CiAJc3RydWN0IHsKLQkJdTY0IEVuYWJsZToxOwotCQl1NjQgUmVzZXJ2ZWQ6MTE7Ci0JCXU2NCBHdWVzdFBoeXNpY2FsQWRkcmVzczo1MjsKKwkJdTY0IGVuYWJsZToxOworCQl1NjQgcmVzZXJ2ZWQ6MTE7CisJCXU2NCBndWVzdF9waHlzaWNhbF9hZGRyZXNzOjUyOwogCX07CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvaHZfdXRpbHMuYyBiL2RyaXZlcnMvc3RhZ2luZy9odi9odl91dGlscy5jCmluZGV4IGE5OWU5MDAuLjAwNzQ1ODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi9odl91dGlscy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi9odl91dGlscy5jCkBAIC0zOCwxMiArMzgsMTQgQEAKICNpbmNsdWRlICJ2bWJ1c19hcGkuaCIKICNpbmNsdWRlICJ1dGlscy5oIgogCitzdGF0aWMgdTggKnNodXRfdHhmX2J1ZjsKK3N0YXRpYyB1OCAqdGltZV90eGZfYnVmOworc3RhdGljIHU4ICpoYmVhdF90eGZfYnVmOwogCiBzdGF0aWMgdm9pZCBzaHV0ZG93bl9vbmNoYW5uZWxjYWxsYmFjayh2b2lkICpjb250ZXh0KQogewogCXN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsID0gY29udGV4dDsKLQl1OCAqYnVmOwotCXUzMiBidWZsZW4sIHJlY3ZsZW47CisJdTMyIHJlY3ZsZW47CiAJdTY0IHJlcXVlc3RpZDsKIAl1OCAgZXhlY3V0ZV9zaHV0ZG93biA9IGZhbHNlOwogCkBAIC01MiwyNCArNTQsMjMgQEAKIAlzdHJ1Y3QgaWNtc2dfaGRyICppY21zZ2hkcnA7CiAJc3RydWN0IGljbXNnX25lZ290aWF0ZSAqbmVnb3AgPSBOVUxMOwogCi0JYnVmbGVuID0gUEFHRV9TSVpFOwotCWJ1ZiA9IGttYWxsb2MoYnVmbGVuLCBHRlBfQVRPTUlDKTsKLQotCXZtYnVzX3JlY3ZwYWNrZXQoY2hhbm5lbCwgYnVmLCBidWZsZW4sICZyZWN2bGVuLCAmcmVxdWVzdGlkKTsKKwl2bWJ1c19yZWN2cGFja2V0KGNoYW5uZWwsIHNodXRfdHhmX2J1ZiwKKwkJCSBQQUdFX1NJWkUsICZyZWN2bGVuLCAmcmVxdWVzdGlkKTsKIAogCWlmIChyZWN2bGVuID4gMCkgewogCQlEUFJJTlRfREJHKFZNQlVTLCAic2h1dGRvd24gcGFja2V0OiBsZW49JWQsIHJlcXVlc3RpZD0lbGxkIiwKIAkJCSAgIHJlY3ZsZW4sIHJlcXVlc3RpZCk7CiAKLQkJaWNtc2doZHJwID0gKHN0cnVjdCBpY21zZ19oZHIgKikmYnVmWworCQlpY21zZ2hkcnAgPSAoc3RydWN0IGljbXNnX2hkciAqKSZzaHV0X3R4Zl9idWZbCiAJCQlzaXplb2Yoc3RydWN0IHZtYnVzcGlwZV9oZHIpXTsKIAogCQlpZiAoaWNtc2doZHJwLT5pY21zZ3R5cGUgPT0gSUNNU0dUWVBFX05FR09USUFURSkgewotCQkJcHJlcF9uZWdvdGlhdGVfcmVzcChpY21zZ2hkcnAsIG5lZ29wLCBidWYpOworCQkJcHJlcF9uZWdvdGlhdGVfcmVzcChpY21zZ2hkcnAsIG5lZ29wLCBzaHV0X3R4Zl9idWYpOwogCQl9IGVsc2UgewotCQkJc2h1dGRvd25fbXNnID0gKHN0cnVjdCBzaHV0ZG93bl9tc2dfZGF0YSAqKSZidWZbCi0JCQkJc2l6ZW9mKHN0cnVjdCB2bWJ1c3BpcGVfaGRyKSArCi0JCQkJc2l6ZW9mKHN0cnVjdCBpY21zZ19oZHIpXTsKKwkJCXNodXRkb3duX21zZyA9CisJCQkJKHN0cnVjdCBzaHV0ZG93bl9tc2dfZGF0YSAqKSZzaHV0X3R4Zl9idWZbCisJCQkJCXNpemVvZihzdHJ1Y3Qgdm1idXNwaXBlX2hkcikgKworCQkJCQlzaXplb2Yoc3RydWN0IGljbXNnX2hkcildOwogCiAJCQlzd2l0Y2ggKHNodXRkb3duX21zZy0+ZmxhZ3MpIHsKIAkJCWNhc2UgMDoKQEAgLTkzLDEzICs5NCwxMSBAQAogCQlpY21zZ2hkcnAtPmljZmxhZ3MgPSBJQ01TR0hEUkZMQUdfVFJBTlNBQ1RJT04KIAkJCXwgSUNNU0dIRFJGTEFHX1JFU1BPTlNFOwogCi0JCXZtYnVzX3NlbmRwYWNrZXQoY2hhbm5lbCwgYnVmLAorCQl2bWJ1c19zZW5kcGFja2V0KGNoYW5uZWwsIHNodXRfdHhmX2J1ZiwKIAkJCQkgICAgICAgcmVjdmxlbiwgcmVxdWVzdGlkLAogCQkJCSAgICAgICBWbWJ1c1BhY2tldFR5cGVEYXRhSW5CYW5kLCAwKTsKIAl9CiAKLQlrZnJlZShidWYpOwotCiAJaWYgKGV4ZWN1dGVfc2h1dGRvd24gPT0gdHJ1ZSkKIAkJb3JkZXJseV9wb3dlcm9mZihmYWxzZSk7CiB9CkBAIC0xNTAsMjggKzE0OSwyNSBAQAogc3RhdGljIHZvaWQgdGltZXN5bmNfb25jaGFubmVsY2FsbGJhY2sodm9pZCAqY29udGV4dCkKIHsKIAlzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbCA9IGNvbnRleHQ7Ci0JdTggKmJ1ZjsKLQl1MzIgYnVmbGVuLCByZWN2bGVuOworCXUzMiByZWN2bGVuOwogCXU2NCByZXF1ZXN0aWQ7CiAJc3RydWN0IGljbXNnX2hkciAqaWNtc2doZHJwOwogCXN0cnVjdCBpY3RpbWVzeW5jX2RhdGEgKnRpbWVkYXRhcDsKIAotCWJ1ZmxlbiA9IFBBR0VfU0laRTsKLQlidWYgPSBrbWFsbG9jKGJ1ZmxlbiwgR0ZQX0FUT01JQyk7Ci0KLQl2bWJ1c19yZWN2cGFja2V0KGNoYW5uZWwsIGJ1ZiwgYnVmbGVuLCAmcmVjdmxlbiwgJnJlcXVlc3RpZCk7CisJdm1idXNfcmVjdnBhY2tldChjaGFubmVsLCB0aW1lX3R4Zl9idWYsCisJCQkgUEFHRV9TSVpFLCAmcmVjdmxlbiwgJnJlcXVlc3RpZCk7CiAKIAlpZiAocmVjdmxlbiA+IDApIHsKIAkJRFBSSU5UX0RCRyhWTUJVUywgInRpbWVzeW5jIHBhY2tldDogcmVjdmxlbj0lZCwgcmVxdWVzdGlkPSVsbGQiLAogCQkJcmVjdmxlbiwgcmVxdWVzdGlkKTsKIAotCQlpY21zZ2hkcnAgPSAoc3RydWN0IGljbXNnX2hkciAqKSZidWZbCisJCWljbXNnaGRycCA9IChzdHJ1Y3QgaWNtc2dfaGRyICopJnRpbWVfdHhmX2J1ZlsKIAkJCQlzaXplb2Yoc3RydWN0IHZtYnVzcGlwZV9oZHIpXTsKIAogCQlpZiAoaWNtc2doZHJwLT5pY21zZ3R5cGUgPT0gSUNNU0dUWVBFX05FR09USUFURSkgewotCQkJcHJlcF9uZWdvdGlhdGVfcmVzcChpY21zZ2hkcnAsIE5VTEwsIGJ1Zik7CisJCQlwcmVwX25lZ290aWF0ZV9yZXNwKGljbXNnaGRycCwgTlVMTCwgdGltZV90eGZfYnVmKTsKIAkJfSBlbHNlIHsKLQkJCXRpbWVkYXRhcCA9IChzdHJ1Y3QgaWN0aW1lc3luY19kYXRhICopJmJ1ZlsKKwkJCXRpbWVkYXRhcCA9IChzdHJ1Y3QgaWN0aW1lc3luY19kYXRhICopJnRpbWVfdHhmX2J1ZlsKIAkJCQlzaXplb2Yoc3RydWN0IHZtYnVzcGlwZV9oZHIpICsKIAkJCQlzaXplb2Yoc3RydWN0IGljbXNnX2hkcildOwogCQkJYWRqX2d1ZXN0dGltZSh0aW1lZGF0YXAtPnBhcmVudHRpbWUsIHRpbWVkYXRhcC0+ZmxhZ3MpOwpAQCAtMTgwLDEyICsxNzYsMTAgQEAKIAkJaWNtc2doZHJwLT5pY2ZsYWdzID0gSUNNU0dIRFJGTEFHX1RSQU5TQUNUSU9OCiAJCQl8IElDTVNHSERSRkxBR19SRVNQT05TRTsKIAotCQl2bWJ1c19zZW5kcGFja2V0KGNoYW5uZWwsIGJ1ZiwKKwkJdm1idXNfc2VuZHBhY2tldChjaGFubmVsLCB0aW1lX3R4Zl9idWYsCiAJCQkJcmVjdmxlbiwgcmVxdWVzdGlkLAogCQkJCVZtYnVzUGFja2V0VHlwZURhdGFJbkJhbmQsIDApOwogCX0KLQotCWtmcmVlKGJ1Zik7CiB9CiAKIC8qCkBAIC0xOTYsMzAgKzE5MCwyOCBAQAogc3RhdGljIHZvaWQgaGVhcnRiZWF0X29uY2hhbm5lbGNhbGxiYWNrKHZvaWQgKmNvbnRleHQpCiB7CiAJc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWwgPSBjb250ZXh0OwotCXU4ICpidWY7Ci0JdTMyIGJ1ZmxlbiwgcmVjdmxlbjsKKwl1MzIgcmVjdmxlbjsKIAl1NjQgcmVxdWVzdGlkOwogCXN0cnVjdCBpY21zZ19oZHIgKmljbXNnaGRycDsKIAlzdHJ1Y3QgaGVhcnRiZWF0X21zZ19kYXRhICpoZWFydGJlYXRfbXNnOwogCi0JYnVmbGVuID0gUEFHRV9TSVpFOwotCWJ1ZiA9IGttYWxsb2MoYnVmbGVuLCBHRlBfQVRPTUlDKTsKLQotCXZtYnVzX3JlY3ZwYWNrZXQoY2hhbm5lbCwgYnVmLCBidWZsZW4sICZyZWN2bGVuLCAmcmVxdWVzdGlkKTsKKwl2bWJ1c19yZWN2cGFja2V0KGNoYW5uZWwsIGhiZWF0X3R4Zl9idWYsCisJCQkgUEFHRV9TSVpFLCAmcmVjdmxlbiwgJnJlcXVlc3RpZCk7CiAKIAlpZiAocmVjdmxlbiA+IDApIHsKIAkJRFBSSU5UX0RCRyhWTUJVUywgImhlYXJ0YmVhdCBwYWNrZXQ6IGxlbj0lZCwgcmVxdWVzdGlkPSVsbGQiLAogCQkJICAgcmVjdmxlbiwgcmVxdWVzdGlkKTsKIAotCQlpY21zZ2hkcnAgPSAoc3RydWN0IGljbXNnX2hkciAqKSZidWZbCisJCWljbXNnaGRycCA9IChzdHJ1Y3QgaWNtc2dfaGRyICopJmhiZWF0X3R4Zl9idWZbCiAJCQkJc2l6ZW9mKHN0cnVjdCB2bWJ1c3BpcGVfaGRyKV07CiAKIAkJaWYgKGljbXNnaGRycC0+aWNtc2d0eXBlID09IElDTVNHVFlQRV9ORUdPVElBVEUpIHsKLQkJCXByZXBfbmVnb3RpYXRlX3Jlc3AoaWNtc2doZHJwLCBOVUxMLCBidWYpOworCQkJcHJlcF9uZWdvdGlhdGVfcmVzcChpY21zZ2hkcnAsIE5VTEwsIGhiZWF0X3R4Zl9idWYpOwogCQl9IGVsc2UgewotCQkJaGVhcnRiZWF0X21zZyA9IChzdHJ1Y3QgaGVhcnRiZWF0X21zZ19kYXRhICopJmJ1ZlsKLQkJCQlzaXplb2Yoc3RydWN0IHZtYnVzcGlwZV9oZHIpICsKLQkJCQlzaXplb2Yoc3RydWN0IGljbXNnX2hkcildOworCQkJaGVhcnRiZWF0X21zZyA9CisJCQkJKHN0cnVjdCBoZWFydGJlYXRfbXNnX2RhdGEgKikmaGJlYXRfdHhmX2J1ZlsKKwkJCQkJc2l6ZW9mKHN0cnVjdCB2bWJ1c3BpcGVfaGRyKSArCisJCQkJCXNpemVvZihzdHJ1Y3QgaWNtc2dfaGRyKV07CiAKIAkJCURQUklOVF9EQkcoVk1CVVMsICJoZWFydGJlYXQgc2VxID0gJWxsZCIsCiAJCQkJICAgaGVhcnRiZWF0X21zZy0+c2VxX251bSk7CkBAIC0yMzAsMTIgKzIyMiwxMCBAQAogCQlpY21zZ2hkcnAtPmljZmxhZ3MgPSBJQ01TR0hEUkZMQUdfVFJBTlNBQ1RJT04KIAkJCXwgSUNNU0dIRFJGTEFHX1JFU1BPTlNFOwogCi0JCXZtYnVzX3NlbmRwYWNrZXQoY2hhbm5lbCwgYnVmLAorCQl2bWJ1c19zZW5kcGFja2V0KGNoYW5uZWwsIGhiZWF0X3R4Zl9idWYsCiAJCQkJICAgICAgIHJlY3ZsZW4sIHJlcXVlc3RpZCwKIAkJCQkgICAgICAgVm1idXNQYWNrZXRUeXBlRGF0YUluQmFuZCwgMCk7CiAJfQotCi0Ja2ZyZWUoYnVmKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIF9faW5pdGNvbnN0CkBAIC0yNjgsMTUgKzI1OCwyOCBAQAogCWlmICghZG1pX2NoZWNrX3N5c3RlbShodl91dGlsc19kbWlfdGFibGUpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWh2X2NiX3V0aWxzW0hWX1NIVVRET1dOX01TR10uY2hhbm5lbC0+T25DaGFubmVsQ2FsbGJhY2sgPQorCXNodXRfdHhmX2J1ZiA9IGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwl0aW1lX3R4Zl9idWYgPSBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CisJaGJlYXRfdHhmX2J1ZiA9IGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKworCWlmICghc2h1dF90eGZfYnVmIHx8ICF0aW1lX3R4Zl9idWYgfHwgIWhiZWF0X3R4Zl9idWYpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJlY2VpdmUgYnVmZmVyXG4iKTsKKwkJa2ZyZWUoc2h1dF90eGZfYnVmKTsKKwkJa2ZyZWUodGltZV90eGZfYnVmKTsKKwkJa2ZyZWUoaGJlYXRfdHhmX2J1Zik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWh2X2NiX3V0aWxzW0hWX1NIVVRET1dOX01TR10uY2hhbm5lbC0+b25jaGFubmVsX2NhbGxiYWNrID0KIAkJJnNodXRkb3duX29uY2hhbm5lbGNhbGxiYWNrOwogCWh2X2NiX3V0aWxzW0hWX1NIVVRET1dOX01TR10uY2FsbGJhY2sgPSAmc2h1dGRvd25fb25jaGFubmVsY2FsbGJhY2s7CiAKLQlodl9jYl91dGlsc1tIVl9USU1FU1lOQ19NU0ddLmNoYW5uZWwtPk9uQ2hhbm5lbENhbGxiYWNrID0KKwlodl9jYl91dGlsc1tIVl9USU1FU1lOQ19NU0ddLmNoYW5uZWwtPm9uY2hhbm5lbF9jYWxsYmFjayA9CiAJCSZ0aW1lc3luY19vbmNoYW5uZWxjYWxsYmFjazsKIAlodl9jYl91dGlsc1tIVl9USU1FU1lOQ19NU0ddLmNhbGxiYWNrID0gJnRpbWVzeW5jX29uY2hhbm5lbGNhbGxiYWNrOwogCi0JaHZfY2JfdXRpbHNbSFZfSEVBUlRCRUFUX01TR10uY2hhbm5lbC0+T25DaGFubmVsQ2FsbGJhY2sgPQorCWh2X2NiX3V0aWxzW0hWX0hFQVJUQkVBVF9NU0ddLmNoYW5uZWwtPm9uY2hhbm5lbF9jYWxsYmFjayA9CiAJCSZoZWFydGJlYXRfb25jaGFubmVsY2FsbGJhY2s7CiAJaHZfY2JfdXRpbHNbSFZfSEVBUlRCRUFUX01TR10uY2FsbGJhY2sgPSAmaGVhcnRiZWF0X29uY2hhbm5lbGNhbGxiYWNrOwogCkBAIC0yODcsMTcgKzI5MCwyMSBAQAogewogCXByaW50ayhLRVJOX0lORk8gIkRlLVJlZ2lzdGVyZWQgSHlwZXJWIFV0aWxpdHkgRHJpdmVyXG4iKTsKIAotCWh2X2NiX3V0aWxzW0hWX1NIVVRET1dOX01TR10uY2hhbm5lbC0+T25DaGFubmVsQ2FsbGJhY2sgPQorCWh2X2NiX3V0aWxzW0hWX1NIVVRET1dOX01TR10uY2hhbm5lbC0+b25jaGFubmVsX2NhbGxiYWNrID0KIAkJJmNobl9jYl9uZWdvdGlhdGU7CiAJaHZfY2JfdXRpbHNbSFZfU0hVVERPV05fTVNHXS5jYWxsYmFjayA9ICZjaG5fY2JfbmVnb3RpYXRlOwogCi0JaHZfY2JfdXRpbHNbSFZfVElNRVNZTkNfTVNHXS5jaGFubmVsLT5PbkNoYW5uZWxDYWxsYmFjayA9CisJaHZfY2JfdXRpbHNbSFZfVElNRVNZTkNfTVNHXS5jaGFubmVsLT5vbmNoYW5uZWxfY2FsbGJhY2sgPQogCQkmY2huX2NiX25lZ290aWF0ZTsKIAlodl9jYl91dGlsc1tIVl9USU1FU1lOQ19NU0ddLmNhbGxiYWNrID0gJmNobl9jYl9uZWdvdGlhdGU7CiAKLQlodl9jYl91dGlsc1tIVl9IRUFSVEJFQVRfTVNHXS5jaGFubmVsLT5PbkNoYW5uZWxDYWxsYmFjayA9CisJaHZfY2JfdXRpbHNbSFZfSEVBUlRCRUFUX01TR10uY2hhbm5lbC0+b25jaGFubmVsX2NhbGxiYWNrID0KIAkJJmNobl9jYl9uZWdvdGlhdGU7CiAJaHZfY2JfdXRpbHNbSFZfSEVBUlRCRUFUX01TR10uY2FsbGJhY2sgPSAmY2huX2NiX25lZ290aWF0ZTsKKworCWtmcmVlKHNodXRfdHhmX2J1Zik7CisJa2ZyZWUodGltZV90eGZfYnVmKTsKKwlrZnJlZShoYmVhdF90eGZfYnVmKTsKIH0KIAogbW9kdWxlX2luaXQoaW5pdF9oeXBlcnZfdXRpbHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L25ldHZzYy5jIGIvZHJpdmVycy9zdGFnaW5nL2h2L25ldHZzYy5jCmluZGV4IDRjMjYzMmMuLmRmOWNkMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi9uZXR2c2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaHYvbmV0dnNjLmMKQEAgLTMxLDE0NyArMzEsMTQ5IEBACiAKIAogLyogR2xvYmFscyAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmdEcml2ZXJOYW1lID0gIm5ldHZzYyI7CitzdGF0aWMgY29uc3QgY2hhciAqZHJpdmVyX25hbWUgPSAibmV0dnNjIjsKIAogLyoge0Y4NjE1MTYzLURGM0UtNDZjNS05MTNGLUYyRDJGOTY1RUQwRX0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaHZfZ3VpZCBnTmV0VnNjRGV2aWNlVHlwZSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHZfZ3VpZCBuZXR2c2NfZGV2aWNlX3R5cGUgPSB7CiAJLmRhdGEgPSB7CiAJCTB4NjMsIDB4NTEsIDB4NjEsIDB4RjgsIDB4M0UsIDB4REYsIDB4YzUsIDB4NDYsCiAJCTB4OTEsIDB4M0YsIDB4RjIsIDB4RDIsIDB4RjksIDB4NjUsIDB4RUQsIDB4MEUKIAl9CiB9OwogCi1zdGF0aWMgaW50IE5ldFZzY09uRGV2aWNlQWRkKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSwgdm9pZCAqQWRkaXRpb25hbEluZm8pOworc3RhdGljIGludCBuZXR2c2NfZGV2aWNlX2FkZChzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UsIHZvaWQgKmFkZGl0aW9uYWxfaW5mbyk7CiAKLXN0YXRpYyBpbnQgTmV0VnNjT25EZXZpY2VSZW1vdmUoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlKTsKK3N0YXRpYyBpbnQgbmV0dnNjX2RldmljZV9yZW1vdmUoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKTsKIAotc3RhdGljIHZvaWQgTmV0VnNjT25DbGVhbnVwKHN0cnVjdCBodl9kcml2ZXIgKkRyaXZlcik7CitzdGF0aWMgdm9pZCBuZXR2c2NfY2xlYW51cChzdHJ1Y3QgaHZfZHJpdmVyICpkcml2ZXIpOwogCi1zdGF0aWMgdm9pZCBOZXRWc2NPbkNoYW5uZWxDYWxsYmFjayh2b2lkICpjb250ZXh0KTsKK3N0YXRpYyB2b2lkIG5ldHZzY19jaGFubmVsX2NiKHZvaWQgKmNvbnRleHQpOwogCi1zdGF0aWMgaW50IE5ldFZzY0luaXRpYWxpemVTZW5kQnVmZmVyV2l0aE5ldFZzcChzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UpOworc3RhdGljIGludCBuZXR2c2NfaW5pdF9zZW5kX2J1ZihzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpOwogCi1zdGF0aWMgaW50IE5ldFZzY0luaXRpYWxpemVSZWNlaXZlQnVmZmVyV2l0aE5ldFZzcChzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UpOworc3RhdGljIGludCBuZXR2c2NfaW5pdF9yZWN2X2J1ZihzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpOwogCi1zdGF0aWMgaW50IE5ldFZzY0Rlc3Ryb3lTZW5kQnVmZmVyKHN0cnVjdCBuZXR2c2NfZGV2aWNlICpOZXREZXZpY2UpOworc3RhdGljIGludCBuZXR2c2NfZGVzdHJveV9zZW5kX2J1ZihzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZSk7CiAKLXN0YXRpYyBpbnQgTmV0VnNjRGVzdHJveVJlY2VpdmVCdWZmZXIoc3RydWN0IG5ldHZzY19kZXZpY2UgKk5ldERldmljZSk7CitzdGF0aWMgaW50IG5ldHZzY19kZXN0cm95X3JlY3ZfYnVmKHN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXRfZGV2aWNlKTsKIAotc3RhdGljIGludCBOZXRWc2NDb25uZWN0VG9Wc3Aoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlKTsKK3N0YXRpYyBpbnQgbmV0dnNjX2Nvbm5lY3RfdnNwKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSk7CiAKLXN0YXRpYyB2b2lkIE5ldFZzY09uU2VuZENvbXBsZXRpb24oc3RydWN0IGh2X2RldmljZSAqRGV2aWNlLAotCQkJCSAgIHN0cnVjdCB2bXBhY2tldF9kZXNjcmlwdG9yICpQYWNrZXQpOworc3RhdGljIHZvaWQgbmV0dnNjX3NlbmRfY29tcGxldGlvbihzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UsCisJCQkJICAgc3RydWN0IHZtcGFja2V0X2Rlc2NyaXB0b3IgKnBhY2tldCk7CiAKLXN0YXRpYyBpbnQgTmV0VnNjT25TZW5kKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSwKLQkJCXN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpQYWNrZXQpOworc3RhdGljIGludCBuZXR2c2Nfc2VuZChzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UsCisJCQlzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqcGFja2V0KTsKIAotc3RhdGljIHZvaWQgTmV0VnNjT25SZWNlaXZlKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSwKLQkJCSAgICBzdHJ1Y3Qgdm1wYWNrZXRfZGVzY3JpcHRvciAqUGFja2V0KTsKK3N0YXRpYyB2b2lkIG5ldHZzY19yZWNlaXZlKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSwKKwkJCSAgICBzdHJ1Y3Qgdm1wYWNrZXRfZGVzY3JpcHRvciAqcGFja2V0KTsKIAotc3RhdGljIHZvaWQgTmV0VnNjT25SZWNlaXZlQ29tcGxldGlvbih2b2lkICpDb250ZXh0KTsKK3N0YXRpYyB2b2lkIG5ldHZzY19yZWNlaXZlX2NvbXBsZXRpb24odm9pZCAqY29udGV4dCk7CiAKLXN0YXRpYyB2b2lkIE5ldFZzY1NlbmRSZWNlaXZlQ29tcGxldGlvbihzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UsCi0JCQkJCXU2NCBUcmFuc2FjdGlvbklkKTsKK3N0YXRpYyB2b2lkIG5ldHZzY19zZW5kX3JlY3ZfY29tcGxldGlvbihzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UsCisJCQkJCXU2NCB0cmFuc2FjdGlvbl9pZCk7CiAKIAotc3RhdGljIHN0cnVjdCBuZXR2c2NfZGV2aWNlICpBbGxvY05ldERldmljZShzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UpCitzdGF0aWMgc3RydWN0IG5ldHZzY19kZXZpY2UgKmFsbG9jX25ldF9kZXZpY2Uoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKQogewotCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXREZXZpY2U7CisJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2U7CiAKLQluZXREZXZpY2UgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbmV0dnNjX2RldmljZSksIEdGUF9LRVJORUwpOwotCWlmICghbmV0RGV2aWNlKQorCW5ldF9kZXZpY2UgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbmV0dnNjX2RldmljZSksIEdGUF9LRVJORUwpOworCWlmICghbmV0X2RldmljZSkKIAkJcmV0dXJuIE5VTEw7CiAKIAkvKiBTZXQgdG8gMiB0byBhbGxvdyBib3RoIGluYm91bmQgYW5kIG91dGJvdW5kIHRyYWZmaWMgKi8KLQlhdG9taWNfY21weGNoZygmbmV0RGV2aWNlLT5SZWZDb3VudCwgMCwgMik7CisJYXRvbWljX2NtcHhjaGcoJm5ldF9kZXZpY2UtPnJlZmNudCwgMCwgMik7CiAKLQluZXREZXZpY2UtPkRldmljZSA9IERldmljZTsKLQlEZXZpY2UtPkV4dGVuc2lvbiA9IG5ldERldmljZTsKKwluZXRfZGV2aWNlLT5kZXYgPSBkZXZpY2U7CisJZGV2aWNlLT5FeHRlbnNpb24gPSBuZXRfZGV2aWNlOwogCi0JcmV0dXJuIG5ldERldmljZTsKKwlyZXR1cm4gbmV0X2RldmljZTsKIH0KIAotc3RhdGljIHZvaWQgRnJlZU5ldERldmljZShzdHJ1Y3QgbmV0dnNjX2RldmljZSAqRGV2aWNlKQorc3RhdGljIHZvaWQgZnJlZV9uZXRfZGV2aWNlKHN0cnVjdCBuZXR2c2NfZGV2aWNlICpkZXZpY2UpCiB7Ci0JV0FSTl9PTihhdG9taWNfcmVhZCgmRGV2aWNlLT5SZWZDb3VudCkgPT0gMCk7Ci0JRGV2aWNlLT5EZXZpY2UtPkV4dGVuc2lvbiA9IE5VTEw7Ci0Ja2ZyZWUoRGV2aWNlKTsKKwlXQVJOX09OKGF0b21pY19yZWFkKCZkZXZpY2UtPnJlZmNudCkgPT0gMCk7CisJZGV2aWNlLT5kZXYtPkV4dGVuc2lvbiA9IE5VTEw7CisJa2ZyZWUoZGV2aWNlKTsKIH0KIAogCiAvKiBHZXQgdGhlIG5ldCBkZXZpY2Ugb2JqZWN0IGlmZiBleGlzdHMgYW5kIGl0cyByZWZjb3VudCA+IDEgKi8KLXN0YXRpYyBzdHJ1Y3QgbmV0dnNjX2RldmljZSAqR2V0T3V0Ym91bmROZXREZXZpY2Uoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlKQorc3RhdGljIHN0cnVjdCBuZXR2c2NfZGV2aWNlICpnZXRfb3V0Ym91bmRfbmV0X2RldmljZShzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldERldmljZTsKKwlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZTsKIAotCW5ldERldmljZSA9IERldmljZS0+RXh0ZW5zaW9uOwotCWlmIChuZXREZXZpY2UgJiYgYXRvbWljX3JlYWQoJm5ldERldmljZS0+UmVmQ291bnQpID4gMSkKLQkJYXRvbWljX2luYygmbmV0RGV2aWNlLT5SZWZDb3VudCk7CisJbmV0X2RldmljZSA9IGRldmljZS0+RXh0ZW5zaW9uOworCWlmIChuZXRfZGV2aWNlICYmIGF0b21pY19yZWFkKCZuZXRfZGV2aWNlLT5yZWZjbnQpID4gMSkKKwkJYXRvbWljX2luYygmbmV0X2RldmljZS0+cmVmY250KTsKIAllbHNlCi0JCW5ldERldmljZSA9IE5VTEw7CisJCW5ldF9kZXZpY2UgPSBOVUxMOwogCi0JcmV0dXJuIG5ldERldmljZTsKKwlyZXR1cm4gbmV0X2RldmljZTsKIH0KIAogLyogR2V0IHRoZSBuZXQgZGV2aWNlIG9iamVjdCBpZmYgZXhpc3RzIGFuZCBpdHMgcmVmY291bnQgPiAwICovCi1zdGF0aWMgc3RydWN0IG5ldHZzY19kZXZpY2UgKkdldEluYm91bmROZXREZXZpY2Uoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlKQorc3RhdGljIHN0cnVjdCBuZXR2c2NfZGV2aWNlICpnZXRfaW5ib3VuZF9uZXRfZGV2aWNlKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0RGV2aWNlOworCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXRfZGV2aWNlOwogCi0JbmV0RGV2aWNlID0gRGV2aWNlLT5FeHRlbnNpb247Ci0JaWYgKG5ldERldmljZSAmJiBhdG9taWNfcmVhZCgmbmV0RGV2aWNlLT5SZWZDb3VudCkpCi0JCWF0b21pY19pbmMoJm5ldERldmljZS0+UmVmQ291bnQpOworCW5ldF9kZXZpY2UgPSBkZXZpY2UtPkV4dGVuc2lvbjsKKwlpZiAobmV0X2RldmljZSAmJiBhdG9taWNfcmVhZCgmbmV0X2RldmljZS0+cmVmY250KSkKKwkJYXRvbWljX2luYygmbmV0X2RldmljZS0+cmVmY250KTsKIAllbHNlCi0JCW5ldERldmljZSA9IE5VTEw7CisJCW5ldF9kZXZpY2UgPSBOVUxMOwogCi0JcmV0dXJuIG5ldERldmljZTsKKwlyZXR1cm4gbmV0X2RldmljZTsKIH0KIAotc3RhdGljIHZvaWQgUHV0TmV0RGV2aWNlKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSkKK3N0YXRpYyB2b2lkIHB1dF9uZXRfZGV2aWNlKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0RGV2aWNlOworCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXRfZGV2aWNlOwogCi0JbmV0RGV2aWNlID0gRGV2aWNlLT5FeHRlbnNpb247CisJbmV0X2RldmljZSA9IGRldmljZS0+RXh0ZW5zaW9uOwogCS8qIEFTU0VSVChuZXREZXZpY2UpOyAqLwogCi0JYXRvbWljX2RlYygmbmV0RGV2aWNlLT5SZWZDb3VudCk7CisJYXRvbWljX2RlYygmbmV0X2RldmljZS0+cmVmY250KTsKIH0KIAotc3RhdGljIHN0cnVjdCBuZXR2c2NfZGV2aWNlICpSZWxlYXNlT3V0Ym91bmROZXREZXZpY2Uoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlKQorc3RhdGljIHN0cnVjdCBuZXR2c2NfZGV2aWNlICpyZWxlYXNlX291dGJvdW5kX25ldF9kZXZpY2UoCisJCXN0cnVjdCBodl9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0RGV2aWNlOworCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXRfZGV2aWNlOwogCi0JbmV0RGV2aWNlID0gRGV2aWNlLT5FeHRlbnNpb247Ci0JaWYgKG5ldERldmljZSA9PSBOVUxMKQorCW5ldF9kZXZpY2UgPSBkZXZpY2UtPkV4dGVuc2lvbjsKKwlpZiAobmV0X2RldmljZSA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAogCS8qIEJ1c3kgd2FpdCB1bnRpbCB0aGUgcmVmIGRyb3AgdG8gMiwgdGhlbiBzZXQgaXQgdG8gMSAqLwotCXdoaWxlIChhdG9taWNfY21weGNoZygmbmV0RGV2aWNlLT5SZWZDb3VudCwgMiwgMSkgIT0gMikKKwl3aGlsZSAoYXRvbWljX2NtcHhjaGcoJm5ldF9kZXZpY2UtPnJlZmNudCwgMiwgMSkgIT0gMikKIAkJdWRlbGF5KDEwMCk7CiAKLQlyZXR1cm4gbmV0RGV2aWNlOworCXJldHVybiBuZXRfZGV2aWNlOwogfQogCi1zdGF0aWMgc3RydWN0IG5ldHZzY19kZXZpY2UgKlJlbGVhc2VJbmJvdW5kTmV0RGV2aWNlKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSkKK3N0YXRpYyBzdHJ1Y3QgbmV0dnNjX2RldmljZSAqcmVsZWFzZV9pbmJvdW5kX25ldF9kZXZpY2UoCisJCXN0cnVjdCBodl9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0RGV2aWNlOworCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXRfZGV2aWNlOwogCi0JbmV0RGV2aWNlID0gRGV2aWNlLT5FeHRlbnNpb247Ci0JaWYgKG5ldERldmljZSA9PSBOVUxMKQorCW5ldF9kZXZpY2UgPSBkZXZpY2UtPkV4dGVuc2lvbjsKKwlpZiAobmV0X2RldmljZSA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAogCS8qIEJ1c3kgd2FpdCB1bnRpbCB0aGUgcmVmIGRyb3AgdG8gMSwgdGhlbiBzZXQgaXQgdG8gMCAqLwotCXdoaWxlIChhdG9taWNfY21weGNoZygmbmV0RGV2aWNlLT5SZWZDb3VudCwgMSwgMCkgIT0gMSkKKwl3aGlsZSAoYXRvbWljX2NtcHhjaGcoJm5ldF9kZXZpY2UtPnJlZmNudCwgMSwgMCkgIT0gMSkKIAkJdWRlbGF5KDEwMCk7CiAKLQlEZXZpY2UtPkV4dGVuc2lvbiA9IE5VTEw7Ci0JcmV0dXJuIG5ldERldmljZTsKKwlkZXZpY2UtPkV4dGVuc2lvbiA9IE5VTEw7CisJcmV0dXJuIG5ldF9kZXZpY2U7CiB9CiAKIC8qCi0gKiBOZXRWc2NJbml0aWFsaXplIC0gTWFpbiBlbnRyeSBwb2ludAorICogbmV0dnNjX2luaXRpYWxpemUgLSBNYWluIGVudHJ5IHBvaW50CiAgKi8KLWludCBOZXRWc2NJbml0aWFsaXplKHN0cnVjdCBodl9kcml2ZXIgKmRydikKK2ludCBuZXR2c2NfaW5pdGlhbGl6ZShzdHJ1Y3QgaHZfZHJpdmVyICpkcnYpCiB7CiAJc3RydWN0IG5ldHZzY19kcml2ZXIgKmRyaXZlciA9IChzdHJ1Y3QgbmV0dnNjX2RyaXZlciAqKWRydjsKIApAQCAtMTg1LDggKzE4Nyw4IEBACiAJLyogTWFrZSBzdXJlIHdlIGFyZSBhdCBsZWFzdCAyIHBhZ2VzIHNpbmNlIDEgcGFnZSBpcyB1c2VkIGZvciBjb250cm9sICovCiAJLyogQVNTRVJUKGRyaXZlci0+UmluZ0J1ZmZlclNpemUgPj0gKFBBR0VfU0laRSA8PCAxKSk7ICovCiAKLQlkcnYtPm5hbWUgPSBnRHJpdmVyTmFtZTsKLQltZW1jcHkoJmRydi0+ZGV2aWNlVHlwZSwgJmdOZXRWc2NEZXZpY2VUeXBlLCBzaXplb2Yoc3RydWN0IGh2X2d1aWQpKTsKKwlkcnYtPm5hbWUgPSBkcml2ZXJfbmFtZTsKKwltZW1jcHkoJmRydi0+ZGV2aWNlVHlwZSwgJm5ldHZzY19kZXZpY2VfdHlwZSwgc2l6ZW9mKHN0cnVjdCBodl9ndWlkKSk7CiAKIAkvKiBNYWtlIHN1cmUgaXQgaXMgc2V0IGJ5IHRoZSBjYWxsZXIgKi8KIAkvKiBGSVhNRTogVGhlc2UgcHJvYmFibHkgc2hvdWxkIHN0aWxsIGJlIHRlc3RlZCBpbiBzb21lIHdheSAqLwpAQCAtMTk0LDI0ICsxOTYsMjQgQEAKIAkvKiBBU1NFUlQoZHJpdmVyLT5PbkxpbmtTdGF0dXNDaGFuZ2VkKTsgKi8KIAogCS8qIFNldHVwIHRoZSBkaXNwYXRjaCB0YWJsZSAqLwotCWRyaXZlci0+QmFzZS5PbkRldmljZUFkZAk9IE5ldFZzY09uRGV2aWNlQWRkOwotCWRyaXZlci0+QmFzZS5PbkRldmljZVJlbW92ZQk9IE5ldFZzY09uRGV2aWNlUmVtb3ZlOwotCWRyaXZlci0+QmFzZS5PbkNsZWFudXAJCT0gTmV0VnNjT25DbGVhbnVwOworCWRyaXZlci0+YmFzZS5PbkRldmljZUFkZAk9IG5ldHZzY19kZXZpY2VfYWRkOworCWRyaXZlci0+YmFzZS5PbkRldmljZVJlbW92ZQk9IG5ldHZzY19kZXZpY2VfcmVtb3ZlOworCWRyaXZlci0+YmFzZS5PbkNsZWFudXAJCT0gbmV0dnNjX2NsZWFudXA7CiAKLQlkcml2ZXItPk9uU2VuZAkJCT0gTmV0VnNjT25TZW5kOworCWRyaXZlci0+c2VuZAkJCT0gbmV0dnNjX3NlbmQ7CiAKLQlSbmRpc0ZpbHRlckluaXQoZHJpdmVyKTsKKwlybmRpc19maWx0ZXJfaW5pdChkcml2ZXIpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IE5ldFZzY0luaXRpYWxpemVSZWNlaXZlQnVmZmVyV2l0aE5ldFZzcChzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UpCitzdGF0aWMgaW50IG5ldHZzY19pbml0X3JlY3ZfYnVmKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSkKIHsKIAlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0RGV2aWNlOwotCXN0cnVjdCBudnNwX21lc3NhZ2UgKmluaXRQYWNrZXQ7CisJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2U7CisJc3RydWN0IG52c3BfbWVzc2FnZSAqaW5pdF9wYWNrZXQ7CiAKLQluZXREZXZpY2UgPSBHZXRPdXRib3VuZE5ldERldmljZShEZXZpY2UpOwotCWlmICghbmV0RGV2aWNlKSB7CisJbmV0X2RldmljZSA9IGdldF9vdXRib3VuZF9uZXRfZGV2aWNlKGRldmljZSk7CisJaWYgKCFuZXRfZGV2aWNlKSB7CiAJCURQUklOVF9FUlIoTkVUVlNDLCAidW5hYmxlIHRvIGdldCBuZXQgZGV2aWNlLi4uIgogCQkJICAgImRldmljZSBiZWluZyBkZXN0cm95ZWQ/Iik7CiAJCXJldHVybiAtMTsKQEAgLTIyMCwxMiArMjIyLDEyIEBACiAJLyogcGFnZS1zaXplIGdyYW5kdWxhcml0eSAqLwogCS8qIEFTU0VSVCgobmV0RGV2aWNlLT5SZWNlaXZlQnVmZmVyU2l6ZSAmIChQQUdFX1NJWkUgLSAxKSkgPT0gMCk7ICovCiAKLQluZXREZXZpY2UtPlJlY2VpdmVCdWZmZXIgPQotCQlvc2RfUGFnZUFsbG9jKG5ldERldmljZS0+UmVjZWl2ZUJ1ZmZlclNpemUgPj4gUEFHRV9TSElGVCk7Ci0JaWYgKCFuZXREZXZpY2UtPlJlY2VpdmVCdWZmZXIpIHsKKwluZXRfZGV2aWNlLT5yZWN2X2J1ZiA9CisJCW9zZF9wYWdlX2FsbG9jKG5ldF9kZXZpY2UtPnJlY3ZfYnVmX3NpemUgPj4gUEFHRV9TSElGVCk7CisJaWYgKCFuZXRfZGV2aWNlLT5yZWN2X2J1ZikgewogCQlEUFJJTlRfRVJSKE5FVFZTQywKIAkJCSAgICJ1bmFibGUgdG8gYWxsb2NhdGUgcmVjZWl2ZSBidWZmZXIgb2Ygc2l6ZSAlZCIsCi0JCQkgICBuZXREZXZpY2UtPlJlY2VpdmVCdWZmZXJTaXplKTsKKwkJCSAgIG5ldF9kZXZpY2UtPnJlY3ZfYnVmX3NpemUpOwogCQlyZXQgPSAtMTsKIAkJZ290byBDbGVhbnVwOwogCX0KQEAgLTI0MCwzMiArMjQyLDM0IEBACiAJICogY2hhbm5lbC4gIE5vdGU6IFRoaXMgY2FsbCB1c2VzIHRoZSB2bWJ1cyBjb25uZWN0aW9uIHJhdGhlcgogCSAqIHRoYW4gdGhlIGNoYW5uZWwgdG8gZXN0YWJsaXNoIHRoZSBncGFkbCBoYW5kbGUuCiAJICovCi0JcmV0ID0gdm1idXNfZXN0YWJsaXNoX2dwYWRsKERldmljZS0+Y2hhbm5lbCwgbmV0RGV2aWNlLT5SZWNlaXZlQnVmZmVyLAotCQkJCSAgICBuZXREZXZpY2UtPlJlY2VpdmVCdWZmZXJTaXplLAotCQkJCSAgICAmbmV0RGV2aWNlLT5SZWNlaXZlQnVmZmVyR3BhZGxIYW5kbGUpOworCXJldCA9IHZtYnVzX2VzdGFibGlzaF9ncGFkbChkZXZpY2UtPmNoYW5uZWwsIG5ldF9kZXZpY2UtPnJlY3ZfYnVmLAorCQkJCSAgICBuZXRfZGV2aWNlLT5yZWN2X2J1Zl9zaXplLAorCQkJCSAgICAmbmV0X2RldmljZS0+cmVjdl9idWZfZ3BhZGxfaGFuZGxlKTsKIAlpZiAocmV0ICE9IDApIHsKIAkJRFBSSU5UX0VSUihORVRWU0MsCiAJCQkgICAidW5hYmxlIHRvIGVzdGFibGlzaCByZWNlaXZlIGJ1ZmZlcidzIGdwYWRsIik7CiAJCWdvdG8gQ2xlYW51cDsKIAl9CiAKLQkvKiBvc2RfV2FpdEV2ZW50V2FpdChleHQtPkNoYW5uZWxJbml0RXZlbnQpOyAqLworCS8qIG9zZF93YWl0ZXZlbnRfd2FpdChleHQtPkNoYW5uZWxJbml0RXZlbnQpOyAqLwogCiAJLyogTm90aWZ5IHRoZSBOZXRWc3Agb2YgdGhlIGdwYWRsIGhhbmRsZSAqLwogCURQUklOVF9JTkZPKE5FVFZTQywgIlNlbmRpbmcgTnZzcE1lc3NhZ2UxVHlwZVNlbmRSZWNlaXZlQnVmZmVyLi4uIik7CiAKLQlpbml0UGFja2V0ID0gJm5ldERldmljZS0+Q2hhbm5lbEluaXRQYWNrZXQ7CisJaW5pdF9wYWNrZXQgPSAmbmV0X2RldmljZS0+Y2hhbm5lbF9pbml0X3BrdDsKIAotCW1lbXNldChpbml0UGFja2V0LCAwLCBzaXplb2Yoc3RydWN0IG52c3BfbWVzc2FnZSkpOworCW1lbXNldChpbml0X3BhY2tldCwgMCwgc2l6ZW9mKHN0cnVjdCBudnNwX21lc3NhZ2UpKTsKIAotCWluaXRQYWNrZXQtPkhlYWRlci5NZXNzYWdlVHlwZSA9IE52c3BNZXNzYWdlMVR5cGVTZW5kUmVjZWl2ZUJ1ZmZlcjsKLQlpbml0UGFja2V0LT5NZXNzYWdlcy5WZXJzaW9uMU1lc3NhZ2VzLlNlbmRSZWNlaXZlQnVmZmVyLkdwYWRsSGFuZGxlID0gbmV0RGV2aWNlLT5SZWNlaXZlQnVmZmVyR3BhZGxIYW5kbGU7Ci0JaW5pdFBhY2tldC0+TWVzc2FnZXMuVmVyc2lvbjFNZXNzYWdlcy5TZW5kUmVjZWl2ZUJ1ZmZlci5JZCA9IE5FVFZTQ19SRUNFSVZFX0JVRkZFUl9JRDsKKwlpbml0X3BhY2tldC0+aGRyLm1zZ190eXBlID0gTlZTUF9NU0cxX1RZUEVfU0VORF9SRUNWX0JVRjsKKwlpbml0X3BhY2tldC0+bXNnLnYxX21zZy5zZW5kX3JlY3ZfYnVmLgorCQlncGFkbF9oYW5kbGUgPSBuZXRfZGV2aWNlLT5yZWN2X2J1Zl9ncGFkbF9oYW5kbGU7CisJaW5pdF9wYWNrZXQtPm1zZy52MV9tc2cuCisJCXNlbmRfcmVjdl9idWYuaWQgPSBORVRWU0NfUkVDRUlWRV9CVUZGRVJfSUQ7CiAKIAkvKiBTZW5kIHRoZSBncGFkbCBub3RpZmljYXRpb24gcmVxdWVzdCAqLwotCXJldCA9IHZtYnVzX3NlbmRwYWNrZXQoRGV2aWNlLT5jaGFubmVsLCBpbml0UGFja2V0LAorCXJldCA9IHZtYnVzX3NlbmRwYWNrZXQoZGV2aWNlLT5jaGFubmVsLCBpbml0X3BhY2tldCwKIAkJCSAgICAgICBzaXplb2Yoc3RydWN0IG52c3BfbWVzc2FnZSksCi0JCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpaW5pdFBhY2tldCwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZylpbml0X3BhY2tldCwKIAkJCSAgICAgICBWbWJ1c1BhY2tldFR5cGVEYXRhSW5CYW5kLAogCQkJICAgICAgIFZNQlVTX0RBVEFfUEFDS0VUX0ZMQUdfQ09NUExFVElPTl9SRVFVRVNURUQpOwogCWlmIChyZXQgIT0gMCkgewpAQCAtMjc0LDEzICsyNzgsMTUgQEAKIAkJZ290byBDbGVhbnVwOwogCX0KIAotCW9zZF9XYWl0RXZlbnRXYWl0KG5ldERldmljZS0+Q2hhbm5lbEluaXRFdmVudCk7CisJb3NkX3dhaXRldmVudF93YWl0KG5ldF9kZXZpY2UtPmNoYW5uZWxfaW5pdF9ldmVudCk7CiAKIAkvKiBDaGVjayB0aGUgcmVzcG9uc2UgKi8KLQlpZiAoaW5pdFBhY2tldC0+TWVzc2FnZXMuVmVyc2lvbjFNZXNzYWdlcy5TZW5kUmVjZWl2ZUJ1ZmZlckNvbXBsZXRlLlN0YXR1cyAhPSBOdnNwU3RhdHVzU3VjY2VzcykgeworCWlmIChpbml0X3BhY2tldC0+bXNnLnYxX21zZy4KKwkgICAgc2VuZF9yZWN2X2J1Zl9jb21wbGV0ZS5zdGF0dXMgIT0gTlZTUF9TVEFUX1NVQ0NFU1MpIHsKIAkJRFBSSU5UX0VSUihORVRWU0MsICJVbmFibGUgdG8gY29tcGxldGUgcmVjZWl2ZSBidWZmZXIgIgogCQkJICAgImluaXRpYWx6YXRpb24gd2l0aCBOZXRWc3AgLSBzdGF0dXMgJWQiLAotCQkJICAgaW5pdFBhY2tldC0+TWVzc2FnZXMuVmVyc2lvbjFNZXNzYWdlcy5TZW5kUmVjZWl2ZUJ1ZmZlckNvbXBsZXRlLlN0YXR1cyk7CisJCQkgICBpbml0X3BhY2tldC0+bXNnLnYxX21zZy4KKwkJCSAgIHNlbmRfcmVjdl9idWZfY29tcGxldGUuc3RhdHVzKTsKIAkJcmV0ID0gLTE7CiAJCWdvdG8gQ2xlYW51cDsKIAl9CkBAIC0yODksMzIgKzI5NSwzNiBAQAogCS8qIEFTU0VSVChuZXREZXZpY2UtPlJlY2VpdmVTZWN0aW9uQ291bnQgPT0gMCk7ICovCiAJLyogQVNTRVJUKG5ldERldmljZS0+UmVjZWl2ZVNlY3Rpb25zID09IE5VTEwpOyAqLwogCi0JbmV0RGV2aWNlLT5SZWNlaXZlU2VjdGlvbkNvdW50ID0gaW5pdFBhY2tldC0+TWVzc2FnZXMuVmVyc2lvbjFNZXNzYWdlcy5TZW5kUmVjZWl2ZUJ1ZmZlckNvbXBsZXRlLk51bVNlY3Rpb25zOworCW5ldF9kZXZpY2UtPnJlY3Zfc2VjdGlvbl9jbnQgPSBpbml0X3BhY2tldC0+bXNnLgorCQl2MV9tc2cuc2VuZF9yZWN2X2J1Zl9jb21wbGV0ZS5udW1fc2VjdGlvbnM7CiAKLQluZXREZXZpY2UtPlJlY2VpdmVTZWN0aW9ucyA9IGttYWxsb2MobmV0RGV2aWNlLT5SZWNlaXZlU2VjdGlvbkNvdW50ICogc2l6ZW9mKHN0cnVjdCBudnNwXzFfcmVjZWl2ZV9idWZmZXJfc2VjdGlvbiksIEdGUF9LRVJORUwpOwotCWlmIChuZXREZXZpY2UtPlJlY2VpdmVTZWN0aW9ucyA9PSBOVUxMKSB7CisJbmV0X2RldmljZS0+cmVjdl9zZWN0aW9uID0ga21hbGxvYyhuZXRfZGV2aWNlLT5yZWN2X3NlY3Rpb25fY250CisJCSogc2l6ZW9mKHN0cnVjdCBudnNwXzFfcmVjZWl2ZV9idWZmZXJfc2VjdGlvbiksIEdGUF9LRVJORUwpOworCWlmIChuZXRfZGV2aWNlLT5yZWN2X3NlY3Rpb24gPT0gTlVMTCkgewogCQlyZXQgPSAtMTsKIAkJZ290byBDbGVhbnVwOwogCX0KIAotCW1lbWNweShuZXREZXZpY2UtPlJlY2VpdmVTZWN0aW9ucywKLQkJaW5pdFBhY2tldC0+TWVzc2FnZXMuVmVyc2lvbjFNZXNzYWdlcy5TZW5kUmVjZWl2ZUJ1ZmZlckNvbXBsZXRlLlNlY3Rpb25zLAotCQluZXREZXZpY2UtPlJlY2VpdmVTZWN0aW9uQ291bnQgKiBzaXplb2Yoc3RydWN0IG52c3BfMV9yZWNlaXZlX2J1ZmZlcl9zZWN0aW9uKSk7CisJbWVtY3B5KG5ldF9kZXZpY2UtPnJlY3Zfc2VjdGlvbiwKKwkJaW5pdF9wYWNrZXQtPm1zZy52MV9tc2cuCisJICAgICAgIHNlbmRfcmVjdl9idWZfY29tcGxldGUuc2VjdGlvbnMsCisJCW5ldF9kZXZpY2UtPnJlY3Zfc2VjdGlvbl9jbnQgKgorCSAgICAgICBzaXplb2Yoc3RydWN0IG52c3BfMV9yZWNlaXZlX2J1ZmZlcl9zZWN0aW9uKSk7CiAKIAlEUFJJTlRfSU5GTyhORVRWU0MsICJSZWNlaXZlIHNlY3Rpb25zIGluZm8gKGNvdW50ICVkLCBvZmZzZXQgJWQsICIKIAkJICAgICJlbmRvZmZzZXQgJWQsIHN1YmFsbG9jIHNpemUgJWQsIG51bSBzdWJhbGxvY3MgJWQpIiwKLQkJICAgIG5ldERldmljZS0+UmVjZWl2ZVNlY3Rpb25Db3VudCwKLQkJICAgIG5ldERldmljZS0+UmVjZWl2ZVNlY3Rpb25zWzBdLk9mZnNldCwKLQkJICAgIG5ldERldmljZS0+UmVjZWl2ZVNlY3Rpb25zWzBdLkVuZE9mZnNldCwKLQkJICAgIG5ldERldmljZS0+UmVjZWl2ZVNlY3Rpb25zWzBdLlN1YkFsbG9jYXRpb25TaXplLAotCQkgICAgbmV0RGV2aWNlLT5SZWNlaXZlU2VjdGlvbnNbMF0uTnVtU3ViQWxsb2NhdGlvbnMpOworCQkgICAgbmV0X2RldmljZS0+cmVjdl9zZWN0aW9uX2NudCwKKwkJICAgIG5ldF9kZXZpY2UtPnJlY3Zfc2VjdGlvblswXS5vZmZzZXQsCisJCSAgICBuZXRfZGV2aWNlLT5yZWN2X3NlY3Rpb25bMF0uZW5kX29mZnNldCwKKwkJICAgIG5ldF9kZXZpY2UtPnJlY3Zfc2VjdGlvblswXS5zdWJfYWxsb2Nfc2l6ZSwKKwkJICAgIG5ldF9kZXZpY2UtPnJlY3Zfc2VjdGlvblswXS5udW1fc3ViX2FsbG9jcyk7CiAKIAkvKgogCSAqIEZvciAxc3QgcmVsZWFzZSwgdGhlcmUgc2hvdWxkIG9ubHkgYmUgMSBzZWN0aW9uIHRoYXQgcmVwcmVzZW50cyB0aGUKIAkgKiBlbnRpcmUgcmVjZWl2ZSBidWZmZXIKIAkgKi8KLQlpZiAobmV0RGV2aWNlLT5SZWNlaXZlU2VjdGlvbkNvdW50ICE9IDEgfHwKLQkgICAgbmV0RGV2aWNlLT5SZWNlaXZlU2VjdGlvbnMtPk9mZnNldCAhPSAwKSB7CisJaWYgKG5ldF9kZXZpY2UtPnJlY3Zfc2VjdGlvbl9jbnQgIT0gMSB8fAorCSAgICBuZXRfZGV2aWNlLT5yZWN2X3NlY3Rpb24tPm9mZnNldCAhPSAwKSB7CiAJCXJldCA9IC0xOwogCQlnb3RvIENsZWFudXA7CiAJfQpAQCAtMzIyLDI2ICszMzIsMjYgQEAKIAlnb3RvIEV4aXQ7CiAKIENsZWFudXA6Ci0JTmV0VnNjRGVzdHJveVJlY2VpdmVCdWZmZXIobmV0RGV2aWNlKTsKKwluZXR2c2NfZGVzdHJveV9yZWN2X2J1ZihuZXRfZGV2aWNlKTsKIAogRXhpdDoKLQlQdXROZXREZXZpY2UoRGV2aWNlKTsKKwlwdXRfbmV0X2RldmljZShkZXZpY2UpOwogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgTmV0VnNjSW5pdGlhbGl6ZVNlbmRCdWZmZXJXaXRoTmV0VnNwKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSkKK3N0YXRpYyBpbnQgbmV0dnNjX2luaXRfc2VuZF9idWYoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKQogewogCWludCByZXQgPSAwOwotCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXREZXZpY2U7Ci0Jc3RydWN0IG52c3BfbWVzc2FnZSAqaW5pdFBhY2tldDsKKwlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZTsKKwlzdHJ1Y3QgbnZzcF9tZXNzYWdlICppbml0X3BhY2tldDsKIAotCW5ldERldmljZSA9IEdldE91dGJvdW5kTmV0RGV2aWNlKERldmljZSk7Ci0JaWYgKCFuZXREZXZpY2UpIHsKKwluZXRfZGV2aWNlID0gZ2V0X291dGJvdW5kX25ldF9kZXZpY2UoZGV2aWNlKTsKKwlpZiAoIW5ldF9kZXZpY2UpIHsKIAkJRFBSSU5UX0VSUihORVRWU0MsICJ1bmFibGUgdG8gZ2V0IG5ldCBkZXZpY2UuLi4iCiAJCQkgICAiZGV2aWNlIGJlaW5nIGRlc3Ryb3llZD8iKTsKIAkJcmV0dXJuIC0xOwogCX0KLQlpZiAobmV0RGV2aWNlLT5TZW5kQnVmZmVyU2l6ZSA8PSAwKSB7CisJaWYgKG5ldF9kZXZpY2UtPnNlbmRfYnVmX3NpemUgPD0gMCkgewogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIENsZWFudXA7CiAJfQpAQCAtMzQ5LDExICszNTksMTEgQEAKIAkvKiBwYWdlLXNpemUgZ3JhbmR1bGFyaXR5ICovCiAJLyogQVNTRVJUKChuZXREZXZpY2UtPlNlbmRCdWZmZXJTaXplICYgKFBBR0VfU0laRSAtIDEpKSA9PSAwKTsgKi8KIAotCW5ldERldmljZS0+U2VuZEJ1ZmZlciA9Ci0JCW9zZF9QYWdlQWxsb2MobmV0RGV2aWNlLT5TZW5kQnVmZmVyU2l6ZSA+PiBQQUdFX1NISUZUKTsKLQlpZiAoIW5ldERldmljZS0+U2VuZEJ1ZmZlcikgeworCW5ldF9kZXZpY2UtPnNlbmRfYnVmID0KKwkJb3NkX3BhZ2VfYWxsb2MobmV0X2RldmljZS0+c2VuZF9idWZfc2l6ZSA+PiBQQUdFX1NISUZUKTsKKwlpZiAoIW5ldF9kZXZpY2UtPnNlbmRfYnVmKSB7CiAJCURQUklOVF9FUlIoTkVUVlNDLCAidW5hYmxlIHRvIGFsbG9jYXRlIHNlbmQgYnVmZmVyIG9mIHNpemUgJWQiLAotCQkJICAgbmV0RGV2aWNlLT5TZW5kQnVmZmVyU2l6ZSk7CisJCQkgICBuZXRfZGV2aWNlLT5zZW5kX2J1Zl9zaXplKTsKIAkJcmV0ID0gLTE7CiAJCWdvdG8gQ2xlYW51cDsKIAl9CkBAIC0zNjcsMzEgKzM3NywzMyBAQAogCSAqIGNoYW5uZWwuICBOb3RlOiBUaGlzIGNhbGwgdXNlcyB0aGUgdm1idXMgY29ubmVjdGlvbiByYXRoZXIKIAkgKiB0aGFuIHRoZSBjaGFubmVsIHRvIGVzdGFibGlzaCB0aGUgZ3BhZGwgaGFuZGxlLgogCSAqLwotCXJldCA9IHZtYnVzX2VzdGFibGlzaF9ncGFkbChEZXZpY2UtPmNoYW5uZWwsIG5ldERldmljZS0+U2VuZEJ1ZmZlciwKLQkJCQkgICAgbmV0RGV2aWNlLT5TZW5kQnVmZmVyU2l6ZSwKLQkJCQkgICAgJm5ldERldmljZS0+U2VuZEJ1ZmZlckdwYWRsSGFuZGxlKTsKKwlyZXQgPSB2bWJ1c19lc3RhYmxpc2hfZ3BhZGwoZGV2aWNlLT5jaGFubmVsLCBuZXRfZGV2aWNlLT5zZW5kX2J1ZiwKKwkJCQkgICAgbmV0X2RldmljZS0+c2VuZF9idWZfc2l6ZSwKKwkJCQkgICAgJm5ldF9kZXZpY2UtPnNlbmRfYnVmX2dwYWRsX2hhbmRsZSk7CiAJaWYgKHJldCAhPSAwKSB7CiAJCURQUklOVF9FUlIoTkVUVlNDLCAidW5hYmxlIHRvIGVzdGFibGlzaCBzZW5kIGJ1ZmZlcidzIGdwYWRsIik7CiAJCWdvdG8gQ2xlYW51cDsKIAl9CiAKLQkvKiBvc2RfV2FpdEV2ZW50V2FpdChleHQtPkNoYW5uZWxJbml0RXZlbnQpOyAqLworCS8qIG9zZF93YWl0ZXZlbnRfd2FpdChleHQtPkNoYW5uZWxJbml0RXZlbnQpOyAqLwogCiAJLyogTm90aWZ5IHRoZSBOZXRWc3Agb2YgdGhlIGdwYWRsIGhhbmRsZSAqLwogCURQUklOVF9JTkZPKE5FVFZTQywgIlNlbmRpbmcgTnZzcE1lc3NhZ2UxVHlwZVNlbmRTZW5kQnVmZmVyLi4uIik7CiAKLQlpbml0UGFja2V0ID0gJm5ldERldmljZS0+Q2hhbm5lbEluaXRQYWNrZXQ7CisJaW5pdF9wYWNrZXQgPSAmbmV0X2RldmljZS0+Y2hhbm5lbF9pbml0X3BrdDsKIAotCW1lbXNldChpbml0UGFja2V0LCAwLCBzaXplb2Yoc3RydWN0IG52c3BfbWVzc2FnZSkpOworCW1lbXNldChpbml0X3BhY2tldCwgMCwgc2l6ZW9mKHN0cnVjdCBudnNwX21lc3NhZ2UpKTsKIAotCWluaXRQYWNrZXQtPkhlYWRlci5NZXNzYWdlVHlwZSA9IE52c3BNZXNzYWdlMVR5cGVTZW5kU2VuZEJ1ZmZlcjsKLQlpbml0UGFja2V0LT5NZXNzYWdlcy5WZXJzaW9uMU1lc3NhZ2VzLlNlbmRSZWNlaXZlQnVmZmVyLkdwYWRsSGFuZGxlID0gbmV0RGV2aWNlLT5TZW5kQnVmZmVyR3BhZGxIYW5kbGU7Ci0JaW5pdFBhY2tldC0+TWVzc2FnZXMuVmVyc2lvbjFNZXNzYWdlcy5TZW5kUmVjZWl2ZUJ1ZmZlci5JZCA9IE5FVFZTQ19TRU5EX0JVRkZFUl9JRDsKKwlpbml0X3BhY2tldC0+aGRyLm1zZ190eXBlID0gTlZTUF9NU0cxX1RZUEVfU0VORF9TRU5EX0JVRjsKKwlpbml0X3BhY2tldC0+bXNnLnYxX21zZy5zZW5kX3JlY3ZfYnVmLgorCQlncGFkbF9oYW5kbGUgPSBuZXRfZGV2aWNlLT5zZW5kX2J1Zl9ncGFkbF9oYW5kbGU7CisJaW5pdF9wYWNrZXQtPm1zZy52MV9tc2cuc2VuZF9yZWN2X2J1Zi5pZCA9CisJCU5FVFZTQ19TRU5EX0JVRkZFUl9JRDsKIAogCS8qIFNlbmQgdGhlIGdwYWRsIG5vdGlmaWNhdGlvbiByZXF1ZXN0ICovCi0JcmV0ID0gdm1idXNfc2VuZHBhY2tldChEZXZpY2UtPmNoYW5uZWwsIGluaXRQYWNrZXQsCisJcmV0ID0gdm1idXNfc2VuZHBhY2tldChkZXZpY2UtPmNoYW5uZWwsIGluaXRfcGFja2V0LAogCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgbnZzcF9tZXNzYWdlKSwKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZylpbml0UGFja2V0LAorCQkJICAgICAgICh1bnNpZ25lZCBsb25nKWluaXRfcGFja2V0LAogCQkJICAgICAgIFZtYnVzUGFja2V0VHlwZURhdGFJbkJhbmQsCiAJCQkgICAgICAgVk1CVVNfREFUQV9QQUNLRVRfRkxBR19DT01QTEVUSU9OX1JFUVVFU1RFRCk7CiAJaWYgKHJldCAhPSAwKSB7CkBAIC00MDAsMzIgKzQxMiwzNSBAQAogCQlnb3RvIENsZWFudXA7CiAJfQogCi0Jb3NkX1dhaXRFdmVudFdhaXQobmV0RGV2aWNlLT5DaGFubmVsSW5pdEV2ZW50KTsKKwlvc2Rfd2FpdGV2ZW50X3dhaXQobmV0X2RldmljZS0+Y2hhbm5lbF9pbml0X2V2ZW50KTsKIAogCS8qIENoZWNrIHRoZSByZXNwb25zZSAqLwotCWlmIChpbml0UGFja2V0LT5NZXNzYWdlcy5WZXJzaW9uMU1lc3NhZ2VzLlNlbmRTZW5kQnVmZmVyQ29tcGxldGUuU3RhdHVzICE9IE52c3BTdGF0dXNTdWNjZXNzKSB7CisJaWYgKGluaXRfcGFja2V0LT5tc2cudjFfbXNnLgorCSAgICBzZW5kX3NlbmRfYnVmX2NvbXBsZXRlLnN0YXR1cyAhPSBOVlNQX1NUQVRfU1VDQ0VTUykgewogCQlEUFJJTlRfRVJSKE5FVFZTQywgIlVuYWJsZSB0byBjb21wbGV0ZSBzZW5kIGJ1ZmZlciAiCiAJCQkgICAiaW5pdGlhbHphdGlvbiB3aXRoIE5ldFZzcCAtIHN0YXR1cyAlZCIsCi0JCQkgICBpbml0UGFja2V0LT5NZXNzYWdlcy5WZXJzaW9uMU1lc3NhZ2VzLlNlbmRTZW5kQnVmZmVyQ29tcGxldGUuU3RhdHVzKTsKKwkJCSAgIGluaXRfcGFja2V0LT5tc2cudjFfbXNnLgorCQkJICAgc2VuZF9zZW5kX2J1Zl9jb21wbGV0ZS5zdGF0dXMpOwogCQlyZXQgPSAtMTsKIAkJZ290byBDbGVhbnVwOwogCX0KIAotCW5ldERldmljZS0+U2VuZFNlY3Rpb25TaXplID0gaW5pdFBhY2tldC0+TWVzc2FnZXMuVmVyc2lvbjFNZXNzYWdlcy5TZW5kU2VuZEJ1ZmZlckNvbXBsZXRlLlNlY3Rpb25TaXplOworCW5ldF9kZXZpY2UtPnNlbmRfc2VjdGlvbl9zaXplID0gaW5pdF9wYWNrZXQtPgorCW1zZy52MV9tc2cuc2VuZF9zZW5kX2J1Zl9jb21wbGV0ZS5zZWN0aW9uX3NpemU7CiAKIAlnb3RvIEV4aXQ7CiAKIENsZWFudXA6Ci0JTmV0VnNjRGVzdHJveVNlbmRCdWZmZXIobmV0RGV2aWNlKTsKKwluZXR2c2NfZGVzdHJveV9zZW5kX2J1ZihuZXRfZGV2aWNlKTsKIAogRXhpdDoKLQlQdXROZXREZXZpY2UoRGV2aWNlKTsKKwlwdXRfbmV0X2RldmljZShkZXZpY2UpOwogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgTmV0VnNjRGVzdHJveVJlY2VpdmVCdWZmZXIoc3RydWN0IG5ldHZzY19kZXZpY2UgKk5ldERldmljZSkKK3N0YXRpYyBpbnQgbmV0dnNjX2Rlc3Ryb3lfcmVjdl9idWYoc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2UpCiB7Ci0Jc3RydWN0IG52c3BfbWVzc2FnZSAqcmV2b2tlUGFja2V0OworCXN0cnVjdCBudnNwX21lc3NhZ2UgKnJldm9rZV9wYWNrZXQ7CiAJaW50IHJldCA9IDA7CiAKIAkvKgpAQCAtNDM0LDIwICs0NDksMjMgQEAKIAkgKiBOdnNwTWVzc2FnZTFUeXBlU2VuZFJlY2VpdmVCdWZmZXIgbXNnKSB0aGVyZWZvcmUsIHdlIG5lZWQKIAkgKiB0byBzZW5kIGEgcmV2b2tlIG1zZyBoZXJlCiAJICovCi0JaWYgKE5ldERldmljZS0+UmVjZWl2ZVNlY3Rpb25Db3VudCkgeworCWlmIChuZXRfZGV2aWNlLT5yZWN2X3NlY3Rpb25fY250KSB7CiAJCURQUklOVF9JTkZPKE5FVFZTQywKIAkJCSAgICAiU2VuZGluZyBOdnNwTWVzc2FnZTFUeXBlUmV2b2tlUmVjZWl2ZUJ1ZmZlci4uLiIpOwogCiAJCS8qIFNlbmQgdGhlIHJldm9rZSByZWNlaXZlIGJ1ZmZlciAqLwotCQlyZXZva2VQYWNrZXQgPSAmTmV0RGV2aWNlLT5SZXZva2VQYWNrZXQ7Ci0JCW1lbXNldChyZXZva2VQYWNrZXQsIDAsIHNpemVvZihzdHJ1Y3QgbnZzcF9tZXNzYWdlKSk7CisJCXJldm9rZV9wYWNrZXQgPSAmbmV0X2RldmljZS0+cmV2b2tlX3BhY2tldDsKKwkJbWVtc2V0KHJldm9rZV9wYWNrZXQsIDAsIHNpemVvZihzdHJ1Y3QgbnZzcF9tZXNzYWdlKSk7CiAKLQkJcmV2b2tlUGFja2V0LT5IZWFkZXIuTWVzc2FnZVR5cGUgPSBOdnNwTWVzc2FnZTFUeXBlUmV2b2tlUmVjZWl2ZUJ1ZmZlcjsKLQkJcmV2b2tlUGFja2V0LT5NZXNzYWdlcy5WZXJzaW9uMU1lc3NhZ2VzLlJldm9rZVJlY2VpdmVCdWZmZXIuSWQgPSBORVRWU0NfUkVDRUlWRV9CVUZGRVJfSUQ7CisJCXJldm9rZV9wYWNrZXQtPmhkci5tc2dfdHlwZSA9CisJCQlOVlNQX01TRzFfVFlQRV9SRVZPS0VfUkVDVl9CVUY7CisJCXJldm9rZV9wYWNrZXQtPm1zZy52MV9tc2cuCisJCXJldm9rZV9yZWN2X2J1Zi5pZCA9IE5FVFZTQ19SRUNFSVZFX0JVRkZFUl9JRDsKIAotCQlyZXQgPSB2bWJ1c19zZW5kcGFja2V0KE5ldERldmljZS0+RGV2aWNlLT5jaGFubmVsLCByZXZva2VQYWNrZXQsCisJCXJldCA9IHZtYnVzX3NlbmRwYWNrZXQobmV0X2RldmljZS0+ZGV2LT5jaGFubmVsLAorCQkJCSAgICAgICByZXZva2VfcGFja2V0LAogCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IG52c3BfbWVzc2FnZSksCi0JCQkJICAgICAgICh1bnNpZ25lZCBsb25nKXJldm9rZVBhY2tldCwKKwkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcmV2b2tlX3BhY2tldCwKIAkJCQkgICAgICAgVm1idXNQYWNrZXRUeXBlRGF0YUluQmFuZCwgMCk7CiAJCS8qCiAJCSAqIElmIHdlIGZhaWxlZCBoZXJlLCB3ZSBtaWdodCBhcyB3ZWxsIHJldHVybiBhbmQKQEAgLTQ2MSwxMSArNDc5LDExIEBACiAJfQogCiAJLyogVGVhcmRvd24gdGhlIGdwYWRsIG9uIHRoZSB2c3AgZW5kICovCi0JaWYgKE5ldERldmljZS0+UmVjZWl2ZUJ1ZmZlckdwYWRsSGFuZGxlKSB7CisJaWYgKG5ldF9kZXZpY2UtPnJlY3ZfYnVmX2dwYWRsX2hhbmRsZSkgewogCQlEUFJJTlRfSU5GTyhORVRWU0MsICJUZWFyaW5nIGRvd24gcmVjZWl2ZSBidWZmZXIncyBHUEFETC4uLiIpOwogCi0JCXJldCA9IHZtYnVzX3RlYXJkb3duX2dwYWRsKE5ldERldmljZS0+RGV2aWNlLT5jaGFubmVsLAotCQkJCQkgICBOZXREZXZpY2UtPlJlY2VpdmVCdWZmZXJHcGFkbEhhbmRsZSk7CisJCXJldCA9IHZtYnVzX3RlYXJkb3duX2dwYWRsKG5ldF9kZXZpY2UtPmRldi0+Y2hhbm5lbCwKKwkJCSAgIG5ldF9kZXZpY2UtPnJlY3ZfYnVmX2dwYWRsX2hhbmRsZSk7CiAKIAkJLyogSWYgd2UgZmFpbGVkIGhlcmUsIHdlIG1pZ2h0IGFzIHdlbGwgcmV0dXJuIGFuZCBoYXZlIGEgbGVhayByYXRoZXIgdGhhbiBjb250aW51ZSBhbmQgYSBidWdjaGsgKi8KIAkJaWYgKHJldCAhPSAwKSB7CkBAIC00NzMsMzAgKzQ5MSwzMCBAQAogCQkJCSAgICJ1bmFibGUgdG8gdGVhcmRvd24gcmVjZWl2ZSBidWZmZXIncyBncGFkbCIpOwogCQkJcmV0dXJuIC0xOwogCQl9Ci0JCU5ldERldmljZS0+UmVjZWl2ZUJ1ZmZlckdwYWRsSGFuZGxlID0gMDsKKwkJbmV0X2RldmljZS0+cmVjdl9idWZfZ3BhZGxfaGFuZGxlID0gMDsKIAl9CiAKLQlpZiAoTmV0RGV2aWNlLT5SZWNlaXZlQnVmZmVyKSB7CisJaWYgKG5ldF9kZXZpY2UtPnJlY3ZfYnVmKSB7CiAJCURQUklOVF9JTkZPKE5FVFZTQywgIkZyZWVpbmcgdXAgcmVjZWl2ZSBidWZmZXIuLi4iKTsKIAogCQkvKiBGcmVlIHVwIHRoZSByZWNlaXZlIGJ1ZmZlciAqLwotCQlvc2RfUGFnZUZyZWUoTmV0RGV2aWNlLT5SZWNlaXZlQnVmZmVyLAotCQkJICAgICBOZXREZXZpY2UtPlJlY2VpdmVCdWZmZXJTaXplID4+IFBBR0VfU0hJRlQpOwotCQlOZXREZXZpY2UtPlJlY2VpdmVCdWZmZXIgPSBOVUxMOworCQlvc2RfcGFnZV9mcmVlKG5ldF9kZXZpY2UtPnJlY3ZfYnVmLAorCQkJICAgICBuZXRfZGV2aWNlLT5yZWN2X2J1Zl9zaXplID4+IFBBR0VfU0hJRlQpOworCQluZXRfZGV2aWNlLT5yZWN2X2J1ZiA9IE5VTEw7CiAJfQogCi0JaWYgKE5ldERldmljZS0+UmVjZWl2ZVNlY3Rpb25zKSB7Ci0JCU5ldERldmljZS0+UmVjZWl2ZVNlY3Rpb25Db3VudCA9IDA7Ci0JCWtmcmVlKE5ldERldmljZS0+UmVjZWl2ZVNlY3Rpb25zKTsKLQkJTmV0RGV2aWNlLT5SZWNlaXZlU2VjdGlvbnMgPSBOVUxMOworCWlmIChuZXRfZGV2aWNlLT5yZWN2X3NlY3Rpb24pIHsKKwkJbmV0X2RldmljZS0+cmVjdl9zZWN0aW9uX2NudCA9IDA7CisJCWtmcmVlKG5ldF9kZXZpY2UtPnJlY3Zfc2VjdGlvbik7CisJCW5ldF9kZXZpY2UtPnJlY3Zfc2VjdGlvbiA9IE5VTEw7CiAJfQogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBOZXRWc2NEZXN0cm95U2VuZEJ1ZmZlcihzdHJ1Y3QgbmV0dnNjX2RldmljZSAqTmV0RGV2aWNlKQorc3RhdGljIGludCBuZXR2c2NfZGVzdHJveV9zZW5kX2J1ZihzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZSkKIHsKLQlzdHJ1Y3QgbnZzcF9tZXNzYWdlICpyZXZva2VQYWNrZXQ7CisJc3RydWN0IG52c3BfbWVzc2FnZSAqcmV2b2tlX3BhY2tldDsKIAlpbnQgcmV0ID0gMDsKIAogCS8qCkBAIC01MDUsMjAgKzUyMywyMyBAQAogCSAqICBOdnNwTWVzc2FnZTFUeXBlU2VuZFJlY2VpdmVCdWZmZXIgbXNnKSB0aGVyZWZvcmUsIHdlIG5lZWQKIAkgKiAgdG8gc2VuZCBhIHJldm9rZSBtc2cgaGVyZQogCSAqLwotCWlmIChOZXREZXZpY2UtPlNlbmRTZWN0aW9uU2l6ZSkgeworCWlmIChuZXRfZGV2aWNlLT5zZW5kX3NlY3Rpb25fc2l6ZSkgewogCQlEUFJJTlRfSU5GTyhORVRWU0MsCiAJCQkgICAgIlNlbmRpbmcgTnZzcE1lc3NhZ2UxVHlwZVJldm9rZVNlbmRCdWZmZXIuLi4iKTsKIAogCQkvKiBTZW5kIHRoZSByZXZva2Ugc2VuZCBidWZmZXIgKi8KLQkJcmV2b2tlUGFja2V0ID0gJk5ldERldmljZS0+UmV2b2tlUGFja2V0OwotCQltZW1zZXQocmV2b2tlUGFja2V0LCAwLCBzaXplb2Yoc3RydWN0IG52c3BfbWVzc2FnZSkpOworCQlyZXZva2VfcGFja2V0ID0gJm5ldF9kZXZpY2UtPnJldm9rZV9wYWNrZXQ7CisJCW1lbXNldChyZXZva2VfcGFja2V0LCAwLCBzaXplb2Yoc3RydWN0IG52c3BfbWVzc2FnZSkpOwogCi0JCXJldm9rZVBhY2tldC0+SGVhZGVyLk1lc3NhZ2VUeXBlID0gTnZzcE1lc3NhZ2UxVHlwZVJldm9rZVNlbmRCdWZmZXI7Ci0JCXJldm9rZVBhY2tldC0+TWVzc2FnZXMuVmVyc2lvbjFNZXNzYWdlcy5SZXZva2VTZW5kQnVmZmVyLklkID0gTkVUVlNDX1NFTkRfQlVGRkVSX0lEOworCQlyZXZva2VfcGFja2V0LT5oZHIubXNnX3R5cGUgPQorCQkJTlZTUF9NU0cxX1RZUEVfUkVWT0tFX1NFTkRfQlVGOworCQlyZXZva2VfcGFja2V0LT5tc2cudjFfbXNnLgorCQkJcmV2b2tlX3NlbmRfYnVmLmlkID0gTkVUVlNDX1NFTkRfQlVGRkVSX0lEOwogCi0JCXJldCA9IHZtYnVzX3NlbmRwYWNrZXQoTmV0RGV2aWNlLT5EZXZpY2UtPmNoYW5uZWwsIHJldm9rZVBhY2tldCwKKwkJcmV0ID0gdm1idXNfc2VuZHBhY2tldChuZXRfZGV2aWNlLT5kZXYtPmNoYW5uZWwsCisJCQkJICAgICAgIHJldm9rZV9wYWNrZXQsCiAJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgbnZzcF9tZXNzYWdlKSwKLQkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcmV2b2tlUGFja2V0LAorCQkJCSAgICAgICAodW5zaWduZWQgbG9uZylyZXZva2VfcGFja2V0LAogCQkJCSAgICAgICBWbWJ1c1BhY2tldFR5cGVEYXRhSW5CYW5kLCAwKTsKIAkJLyoKIAkJICogSWYgd2UgZmFpbGVkIGhlcmUsIHdlIG1pZ2h0IGFzIHdlbGwgcmV0dXJuIGFuZCBoYXZlIGEgbGVhawpAQCAtNTMyLDEwICs1NTMsMTAgQEAKIAl9CiAKIAkvKiBUZWFyZG93biB0aGUgZ3BhZGwgb24gdGhlIHZzcCBlbmQgKi8KLQlpZiAoTmV0RGV2aWNlLT5TZW5kQnVmZmVyR3BhZGxIYW5kbGUpIHsKKwlpZiAobmV0X2RldmljZS0+c2VuZF9idWZfZ3BhZGxfaGFuZGxlKSB7CiAJCURQUklOVF9JTkZPKE5FVFZTQywgIlRlYXJpbmcgZG93biBzZW5kIGJ1ZmZlcidzIEdQQURMLi4uIik7Ci0JCXJldCA9IHZtYnVzX3RlYXJkb3duX2dwYWRsKE5ldERldmljZS0+RGV2aWNlLT5jaGFubmVsLAotCQkJCQkgICBOZXREZXZpY2UtPlNlbmRCdWZmZXJHcGFkbEhhbmRsZSk7CisJCXJldCA9IHZtYnVzX3RlYXJkb3duX2dwYWRsKG5ldF9kZXZpY2UtPmRldi0+Y2hhbm5lbCwKKwkJCQkJICAgbmV0X2RldmljZS0+c2VuZF9idWZfZ3BhZGxfaGFuZGxlKTsKIAogCQkvKgogCQkgKiBJZiB3ZSBmYWlsZWQgaGVyZSwgd2UgbWlnaHQgYXMgd2VsbCByZXR1cm4gYW5kIGhhdmUgYSBsZWFrCkBAIC01NDYsNDkgKzU2Nyw1MSBAQAogCQkJCSAgICJncGFkbCIpOwogCQkJcmV0dXJuIC0xOwogCQl9Ci0JCU5ldERldmljZS0+U2VuZEJ1ZmZlckdwYWRsSGFuZGxlID0gMDsKKwkJbmV0X2RldmljZS0+c2VuZF9idWZfZ3BhZGxfaGFuZGxlID0gMDsKIAl9CiAKLQlpZiAoTmV0RGV2aWNlLT5TZW5kQnVmZmVyKSB7CisJaWYgKG5ldF9kZXZpY2UtPnNlbmRfYnVmKSB7CiAJCURQUklOVF9JTkZPKE5FVFZTQywgIkZyZWVpbmcgdXAgc2VuZCBidWZmZXIuLi4iKTsKIAogCQkvKiBGcmVlIHVwIHRoZSByZWNlaXZlIGJ1ZmZlciAqLwotCQlvc2RfUGFnZUZyZWUoTmV0RGV2aWNlLT5TZW5kQnVmZmVyLAotCQkJICAgICBOZXREZXZpY2UtPlNlbmRCdWZmZXJTaXplID4+IFBBR0VfU0hJRlQpOwotCQlOZXREZXZpY2UtPlNlbmRCdWZmZXIgPSBOVUxMOworCQlvc2RfcGFnZV9mcmVlKG5ldF9kZXZpY2UtPnNlbmRfYnVmLAorCQkJICAgICBuZXRfZGV2aWNlLT5zZW5kX2J1Zl9zaXplID4+IFBBR0VfU0hJRlQpOworCQluZXRfZGV2aWNlLT5zZW5kX2J1ZiA9IE5VTEw7CiAJfQogCiAJcmV0dXJuIHJldDsKIH0KIAogCi1zdGF0aWMgaW50IE5ldFZzY0Nvbm5lY3RUb1ZzcChzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UpCitzdGF0aWMgaW50IG5ldHZzY19jb25uZWN0X3ZzcChzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpCiB7CiAJaW50IHJldDsKLQlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0RGV2aWNlOwotCXN0cnVjdCBudnNwX21lc3NhZ2UgKmluaXRQYWNrZXQ7Ci0JaW50IG5kaXNWZXJzaW9uOworCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXRfZGV2aWNlOworCXN0cnVjdCBudnNwX21lc3NhZ2UgKmluaXRfcGFja2V0OworCWludCBuZGlzX3ZlcnNpb247CiAKLQluZXREZXZpY2UgPSBHZXRPdXRib3VuZE5ldERldmljZShEZXZpY2UpOwotCWlmICghbmV0RGV2aWNlKSB7CisJbmV0X2RldmljZSA9IGdldF9vdXRib3VuZF9uZXRfZGV2aWNlKGRldmljZSk7CisJaWYgKCFuZXRfZGV2aWNlKSB7CiAJCURQUklOVF9FUlIoTkVUVlNDLCAidW5hYmxlIHRvIGdldCBuZXQgZGV2aWNlLi4uIgogCQkJICAgImRldmljZSBiZWluZyBkZXN0cm95ZWQ/Iik7CiAJCXJldHVybiAtMTsKIAl9CiAKLQlpbml0UGFja2V0ID0gJm5ldERldmljZS0+Q2hhbm5lbEluaXRQYWNrZXQ7CisJaW5pdF9wYWNrZXQgPSAmbmV0X2RldmljZS0+Y2hhbm5lbF9pbml0X3BrdDsKIAotCW1lbXNldChpbml0UGFja2V0LCAwLCBzaXplb2Yoc3RydWN0IG52c3BfbWVzc2FnZSkpOwotCWluaXRQYWNrZXQtPkhlYWRlci5NZXNzYWdlVHlwZSA9IE52c3BNZXNzYWdlVHlwZUluaXQ7Ci0JaW5pdFBhY2tldC0+TWVzc2FnZXMuSW5pdE1lc3NhZ2VzLkluaXQuTWluUHJvdG9jb2xWZXJzaW9uID0gTlZTUF9NSU5fUFJPVE9DT0xfVkVSU0lPTjsKLQlpbml0UGFja2V0LT5NZXNzYWdlcy5Jbml0TWVzc2FnZXMuSW5pdC5NYXhQcm90b2NvbFZlcnNpb24gPSBOVlNQX01BWF9QUk9UT0NPTF9WRVJTSU9OOworCW1lbXNldChpbml0X3BhY2tldCwgMCwgc2l6ZW9mKHN0cnVjdCBudnNwX21lc3NhZ2UpKTsKKwlpbml0X3BhY2tldC0+aGRyLm1zZ190eXBlID0gTlZTUF9NU0dfVFlQRV9JTklUOworCWluaXRfcGFja2V0LT5tc2cuaW5pdF9tc2cuaW5pdC5taW5fcHJvdG9jb2xfdmVyID0KKwkJTlZTUF9NSU5fUFJPVE9DT0xfVkVSU0lPTjsKKwlpbml0X3BhY2tldC0+bXNnLmluaXRfbXNnLmluaXQubWF4X3Byb3RvY29sX3ZlciA9CisJCU5WU1BfTUFYX1BST1RPQ09MX1ZFUlNJT047CiAKIAlEUFJJTlRfSU5GTyhORVRWU0MsICJTZW5kaW5nIE52c3BNZXNzYWdlVHlwZUluaXQuLi4iKTsKIAogCS8qIFNlbmQgdGhlIGluaXQgcmVxdWVzdCAqLwotCXJldCA9IHZtYnVzX3NlbmRwYWNrZXQoRGV2aWNlLT5jaGFubmVsLCBpbml0UGFja2V0LAorCXJldCA9IHZtYnVzX3NlbmRwYWNrZXQoZGV2aWNlLT5jaGFubmVsLCBpbml0X3BhY2tldCwKIAkJCSAgICAgICBzaXplb2Yoc3RydWN0IG52c3BfbWVzc2FnZSksCi0JCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpaW5pdFBhY2tldCwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZylpbml0X3BhY2tldCwKIAkJCSAgICAgICBWbWJ1c1BhY2tldFR5cGVEYXRhSW5CYW5kLAogCQkJICAgICAgIFZNQlVTX0RBVEFfUEFDS0VUX0ZMQUdfQ09NUExFVElPTl9SRVFVRVNURUQpOwogCkBAIC01OTcsNDcgKzYyMCw1MiBAQAogCQlnb3RvIENsZWFudXA7CiAJfQogCi0Jb3NkX1dhaXRFdmVudFdhaXQobmV0RGV2aWNlLT5DaGFubmVsSW5pdEV2ZW50KTsKKwlvc2Rfd2FpdGV2ZW50X3dhaXQobmV0X2RldmljZS0+Y2hhbm5lbF9pbml0X2V2ZW50KTsKIAogCS8qIE5vdywgY2hlY2sgdGhlIHJlc3BvbnNlICovCiAJLyogQVNTRVJUKGluaXRQYWNrZXQtPk1lc3NhZ2VzLkluaXRNZXNzYWdlcy5Jbml0Q29tcGxldGUuTWF4aW11bU1kbENoYWluTGVuZ3RoIDw9IE1BWF9NVUxUSVBBR0VfQlVGRkVSX0NPVU5UKTsgKi8KIAlEUFJJTlRfSU5GTyhORVRWU0MsICJOdnNwTWVzc2FnZVR5cGVJbml0IHN0YXR1cyglZCkgbWF4IG1kbCBjaGFpbiAoJWQpIiwKLQkJaW5pdFBhY2tldC0+TWVzc2FnZXMuSW5pdE1lc3NhZ2VzLkluaXRDb21wbGV0ZS5TdGF0dXMsCi0JCWluaXRQYWNrZXQtPk1lc3NhZ2VzLkluaXRNZXNzYWdlcy5Jbml0Q29tcGxldGUuTWF4aW11bU1kbENoYWluTGVuZ3RoKTsKKwkJaW5pdF9wYWNrZXQtPm1zZy5pbml0X21zZy5pbml0X2NvbXBsZXRlLnN0YXR1cywKKwkJaW5pdF9wYWNrZXQtPm1zZy5pbml0X21zZy4KKwkJICAgIGluaXRfY29tcGxldGUubWF4X21kbF9jaGFpbl9sZW4pOwogCi0JaWYgKGluaXRQYWNrZXQtPk1lc3NhZ2VzLkluaXRNZXNzYWdlcy5Jbml0Q29tcGxldGUuU3RhdHVzICE9Ci0JICAgIE52c3BTdGF0dXNTdWNjZXNzKSB7CisJaWYgKGluaXRfcGFja2V0LT5tc2cuaW5pdF9tc2cuaW5pdF9jb21wbGV0ZS5zdGF0dXMgIT0KKwkgICAgTlZTUF9TVEFUX1NVQ0NFU1MpIHsKIAkJRFBSSU5UX0VSUihORVRWU0MsCiAJCQkidW5hYmxlIHRvIGluaXRpYWxpemUgd2l0aCBuZXR2c3AgKHN0YXR1cyAweCV4KSIsCi0JCQlpbml0UGFja2V0LT5NZXNzYWdlcy5Jbml0TWVzc2FnZXMuSW5pdENvbXBsZXRlLlN0YXR1cyk7CisJCQlpbml0X3BhY2tldC0+bXNnLmluaXRfbXNnLmluaXRfY29tcGxldGUuc3RhdHVzKTsKIAkJcmV0ID0gLTE7CiAJCWdvdG8gQ2xlYW51cDsKIAl9CiAKLQlpZiAoaW5pdFBhY2tldC0+TWVzc2FnZXMuSW5pdE1lc3NhZ2VzLkluaXRDb21wbGV0ZS5OZWdvdGlhdGVkUHJvdG9jb2xWZXJzaW9uICE9IE5WU1BfUFJPVE9DT0xfVkVSU0lPTl8xKSB7CisJaWYgKGluaXRfcGFja2V0LT5tc2cuaW5pdF9tc2cuaW5pdF9jb21wbGV0ZS4KKwkgICAgbmVnb3RpYXRlZF9wcm90b2NvbF92ZXIgIT0gTlZTUF9QUk9UT0NPTF9WRVJTSU9OXzEpIHsKIAkJRFBSSU5UX0VSUihORVRWU0MsICJ1bmFibGUgdG8gaW5pdGlhbGl6ZSB3aXRoIG5ldHZzcCAiCiAJCQkgICAiKHZlcnNpb24gZXhwZWN0ZWQgMSBnb3QgJWQpIiwKLQkJCSAgIGluaXRQYWNrZXQtPk1lc3NhZ2VzLkluaXRNZXNzYWdlcy5Jbml0Q29tcGxldGUuTmVnb3RpYXRlZFByb3RvY29sVmVyc2lvbik7CisJCQkgICBpbml0X3BhY2tldC0+bXNnLmluaXRfbXNnLgorCQkJICAgaW5pdF9jb21wbGV0ZS5uZWdvdGlhdGVkX3Byb3RvY29sX3Zlcik7CiAJCXJldCA9IC0xOwogCQlnb3RvIENsZWFudXA7CiAJfQogCURQUklOVF9JTkZPKE5FVFZTQywgIlNlbmRpbmcgTnZzcE1lc3NhZ2UxVHlwZVNlbmROZGlzVmVyc2lvbi4uLiIpOwogCiAJLyogU2VuZCB0aGUgbmRpcyB2ZXJzaW9uICovCi0JbWVtc2V0KGluaXRQYWNrZXQsIDAsIHNpemVvZihzdHJ1Y3QgbnZzcF9tZXNzYWdlKSk7CisJbWVtc2V0KGluaXRfcGFja2V0LCAwLCBzaXplb2Yoc3RydWN0IG52c3BfbWVzc2FnZSkpOwogCi0JbmRpc1ZlcnNpb24gPSAweDAwMDUwMDAwOworCW5kaXNfdmVyc2lvbiA9IDB4MDAwNTAwMDA7CiAKLQlpbml0UGFja2V0LT5IZWFkZXIuTWVzc2FnZVR5cGUgPSBOdnNwTWVzc2FnZTFUeXBlU2VuZE5kaXNWZXJzaW9uOwotCWluaXRQYWNrZXQtPk1lc3NhZ2VzLlZlcnNpb24xTWVzc2FnZXMuU2VuZE5kaXNWZXJzaW9uLk5kaXNNYWpvclZlcnNpb24gPQotCQkJCShuZGlzVmVyc2lvbiAmIDB4RkZGRjAwMDApID4+IDE2OwotCWluaXRQYWNrZXQtPk1lc3NhZ2VzLlZlcnNpb24xTWVzc2FnZXMuU2VuZE5kaXNWZXJzaW9uLk5kaXNNaW5vclZlcnNpb24gPQotCQkJCW5kaXNWZXJzaW9uICYgMHhGRkZGOworCWluaXRfcGFja2V0LT5oZHIubXNnX3R5cGUgPSBOVlNQX01TRzFfVFlQRV9TRU5EX05ESVNfVkVSOworCWluaXRfcGFja2V0LT5tc2cudjFfbXNnLgorCQlzZW5kX25kaXNfdmVyLm5kaXNfbWFqb3JfdmVyID0KKwkJCQkobmRpc192ZXJzaW9uICYgMHhGRkZGMDAwMCkgPj4gMTY7CisJaW5pdF9wYWNrZXQtPm1zZy52MV9tc2cuCisJCXNlbmRfbmRpc192ZXIubmRpc19taW5vcl92ZXIgPQorCQkJCW5kaXNfdmVyc2lvbiAmIDB4RkZGRjsKIAogCS8qIFNlbmQgdGhlIGluaXQgcmVxdWVzdCAqLwotCXJldCA9IHZtYnVzX3NlbmRwYWNrZXQoRGV2aWNlLT5jaGFubmVsLCBpbml0UGFja2V0LAorCXJldCA9IHZtYnVzX3NlbmRwYWNrZXQoZGV2aWNlLT5jaGFubmVsLCBpbml0X3BhY2tldCwKIAkJCSAgICAgICBzaXplb2Yoc3RydWN0IG52c3BfbWVzc2FnZSksCi0JCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpaW5pdFBhY2tldCwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZylpbml0X3BhY2tldCwKIAkJCSAgICAgICBWbWJ1c1BhY2tldFR5cGVEYXRhSW5CYW5kLCAwKTsKIAlpZiAocmV0ICE9IDApIHsKIAkJRFBSSU5UX0VSUihORVRWU0MsCkBAIC02NTEsNTEgKzY3OSw1MiBAQAogCSAqIHBhY2tldCkgc2luY2Ugb3VyIFZtYnVzIGFsd2F5cyBzZXQgdGhlCiAJICogVk1CVVNfREFUQV9QQUNLRVRfRkxBR19DT01QTEVUSU9OX1JFUVVFU1RFRCBmbGFnCiAJICovCi0JIC8qIG9zZF9XYWl0RXZlbnRXYWl0KE5ldFZzY0NoYW5uZWwtPkNoYW5uZWxJbml0RXZlbnQpOyAqLworCSAvKiBvc2Rfd2FpdGV2ZW50X3dhaXQoTmV0VnNjQ2hhbm5lbC0+Q2hhbm5lbEluaXRFdmVudCk7ICovCiAKIAkvKiBQb3N0IHRoZSBiaWcgcmVjZWl2ZSBidWZmZXIgdG8gTmV0VlNQICovCi0JcmV0ID0gTmV0VnNjSW5pdGlhbGl6ZVJlY2VpdmVCdWZmZXJXaXRoTmV0VnNwKERldmljZSk7CisJcmV0ID0gbmV0dnNjX2luaXRfcmVjdl9idWYoZGV2aWNlKTsKIAlpZiAocmV0ID09IDApCi0JCXJldCA9IE5ldFZzY0luaXRpYWxpemVTZW5kQnVmZmVyV2l0aE5ldFZzcChEZXZpY2UpOworCQlyZXQgPSBuZXR2c2NfaW5pdF9zZW5kX2J1ZihkZXZpY2UpOwogCiBDbGVhbnVwOgotCVB1dE5ldERldmljZShEZXZpY2UpOworCXB1dF9uZXRfZGV2aWNlKGRldmljZSk7CiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgTmV0VnNjRGlzY29ubmVjdEZyb21Wc3Aoc3RydWN0IG5ldHZzY19kZXZpY2UgKk5ldERldmljZSkKK3N0YXRpYyB2b2lkIE5ldFZzY0Rpc2Nvbm5lY3RGcm9tVnNwKHN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXRfZGV2aWNlKQogewotCU5ldFZzY0Rlc3Ryb3lSZWNlaXZlQnVmZmVyKE5ldERldmljZSk7Ci0JTmV0VnNjRGVzdHJveVNlbmRCdWZmZXIoTmV0RGV2aWNlKTsKKwluZXR2c2NfZGVzdHJveV9yZWN2X2J1ZihuZXRfZGV2aWNlKTsKKwluZXR2c2NfZGVzdHJveV9zZW5kX2J1ZihuZXRfZGV2aWNlKTsKIH0KIAogLyoKLSAqIE5ldFZzY09uRGV2aWNlQWRkIC0gQ2FsbGJhY2sgd2hlbiB0aGUgZGV2aWNlIGJlbG9uZ2luZyB0byB0aGlzIGRyaXZlciBpcyBhZGRlZAorICogbmV0dnNjX2RldmljZV9hZGQgLSBDYWxsYmFjayB3aGVuIHRoZSBkZXZpY2UgYmVsb25naW5nIHRvIHRoaXMKKyAqIGRyaXZlciBpcyBhZGRlZAogICovCi1zdGF0aWMgaW50IE5ldFZzY09uRGV2aWNlQWRkKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSwgdm9pZCAqQWRkaXRpb25hbEluZm8pCitzdGF0aWMgaW50IG5ldHZzY19kZXZpY2VfYWRkKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSwgdm9pZCAqYWRkaXRpb25hbF9pbmZvKQogewogCWludCByZXQgPSAwOwogCWludCBpOwotCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXREZXZpY2U7CisJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2U7CiAJc3RydWN0IGh2X25ldHZzY19wYWNrZXQgKnBhY2tldCwgKnBvczsKLQlzdHJ1Y3QgbmV0dnNjX2RyaXZlciAqbmV0RHJpdmVyID0KLQkJCQkoc3RydWN0IG5ldHZzY19kcml2ZXIgKilEZXZpY2UtPkRyaXZlcjsKKwlzdHJ1Y3QgbmV0dnNjX2RyaXZlciAqbmV0X2RyaXZlciA9CisJCQkJKHN0cnVjdCBuZXR2c2NfZHJpdmVyICopZGV2aWNlLT5Ecml2ZXI7CiAKLQluZXREZXZpY2UgPSBBbGxvY05ldERldmljZShEZXZpY2UpOwotCWlmICghbmV0RGV2aWNlKSB7CisJbmV0X2RldmljZSA9IGFsbG9jX25ldF9kZXZpY2UoZGV2aWNlKTsKKwlpZiAoIW5ldF9kZXZpY2UpIHsKIAkJcmV0ID0gLTE7CiAJCWdvdG8gQ2xlYW51cDsKIAl9CiAKLQlEUFJJTlRfREJHKE5FVFZTQywgIm5ldHZzYyBjaGFubmVsIG9iamVjdCBhbGxvY2F0ZWQgLSAlcCIsIG5ldERldmljZSk7CisJRFBSSU5UX0RCRyhORVRWU0MsICJuZXR2c2MgY2hhbm5lbCBvYmplY3QgYWxsb2NhdGVkIC0gJXAiLCBuZXRfZGV2aWNlKTsKIAogCS8qIEluaXRpYWxpemUgdGhlIE5ldFZTQyBjaGFubmVsIGV4dGVuc2lvbiAqLwotCW5ldERldmljZS0+UmVjZWl2ZUJ1ZmZlclNpemUgPSBORVRWU0NfUkVDRUlWRV9CVUZGRVJfU0laRTsKLQlzcGluX2xvY2tfaW5pdCgmbmV0RGV2aWNlLT5yZWNlaXZlX3BhY2tldF9saXN0X2xvY2spOworCW5ldF9kZXZpY2UtPnJlY3ZfYnVmX3NpemUgPSBORVRWU0NfUkVDRUlWRV9CVUZGRVJfU0laRTsKKwlzcGluX2xvY2tfaW5pdCgmbmV0X2RldmljZS0+cmVjdl9wa3RfbGlzdF9sb2NrKTsKIAotCW5ldERldmljZS0+U2VuZEJ1ZmZlclNpemUgPSBORVRWU0NfU0VORF9CVUZGRVJfU0laRTsKKwluZXRfZGV2aWNlLT5zZW5kX2J1Zl9zaXplID0gTkVUVlNDX1NFTkRfQlVGRkVSX1NJWkU7CiAKLQlJTklUX0xJU1RfSEVBRCgmbmV0RGV2aWNlLT5SZWNlaXZlUGFja2V0TGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJm5ldF9kZXZpY2UtPnJlY3ZfcGt0X2xpc3QpOwogCiAJZm9yIChpID0gMDsgaSA8IE5FVFZTQ19SRUNFSVZFX1BBQ0tFVExJU1RfQ09VTlQ7IGkrKykgewogCQlwYWNrZXQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCkgKwpAQCAtNzA3LDE5ICs3MzYsMTkgQEAKIAkJCQkgICBORVRWU0NfUkVDRUlWRV9QQUNLRVRMSVNUX0NPVU5ULCBpKTsKIAkJCWJyZWFrOwogCQl9Ci0JCWxpc3RfYWRkX3RhaWwoJnBhY2tldC0+TGlzdEVudHJ5LAotCQkJICAgICAgJm5ldERldmljZS0+UmVjZWl2ZVBhY2tldExpc3QpOworCQlsaXN0X2FkZF90YWlsKCZwYWNrZXQtPmxpc3RfZW50LAorCQkJICAgICAgJm5ldF9kZXZpY2UtPnJlY3ZfcGt0X2xpc3QpOwogCX0KLQluZXREZXZpY2UtPkNoYW5uZWxJbml0RXZlbnQgPSBvc2RfV2FpdEV2ZW50Q3JlYXRlKCk7Ci0JaWYgKCFuZXREZXZpY2UtPkNoYW5uZWxJbml0RXZlbnQpIHsKKwluZXRfZGV2aWNlLT5jaGFubmVsX2luaXRfZXZlbnQgPSBvc2Rfd2FpdGV2ZW50X2NyZWF0ZSgpOworCWlmICghbmV0X2RldmljZS0+Y2hhbm5lbF9pbml0X2V2ZW50KSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gQ2xlYW51cDsKIAl9CiAKIAkvKiBPcGVuIHRoZSBjaGFubmVsICovCi0JcmV0ID0gdm1idXNfb3BlbihEZXZpY2UtPmNoYW5uZWwsIG5ldERyaXZlci0+UmluZ0J1ZmZlclNpemUsCi0JCQkgbmV0RHJpdmVyLT5SaW5nQnVmZmVyU2l6ZSwgTlVMTCwgMCwKLQkJCSBOZXRWc2NPbkNoYW5uZWxDYWxsYmFjaywgRGV2aWNlKTsKKwlyZXQgPSB2bWJ1c19vcGVuKGRldmljZS0+Y2hhbm5lbCwgbmV0X2RyaXZlci0+cmluZ19idWZfc2l6ZSwKKwkJCSBuZXRfZHJpdmVyLT5yaW5nX2J1Zl9zaXplLCBOVUxMLCAwLAorCQkJIG5ldHZzY19jaGFubmVsX2NiLCBkZXZpY2UpOwogCiAJaWYgKHJldCAhPSAwKSB7CiAJCURQUklOVF9FUlIoTkVUVlNDLCAidW5hYmxlIHRvIG9wZW4gY2hhbm5lbDogJWQiLCByZXQpOwpAQCAtNzMxLDcgKzc2MCw3IEBACiAJRFBSSU5UX0lORk8oTkVUVlNDLCAiKioqIE5ldFZTQyBjaGFubmVsIG9wZW5lZCBzdWNjZXNzZnVsbHkhICoqKiIpOwogCiAJLyogQ29ubmVjdCB3aXRoIHRoZSBOZXRWc3AgKi8KLQlyZXQgPSBOZXRWc2NDb25uZWN0VG9Wc3AoRGV2aWNlKTsKKwlyZXQgPSBuZXR2c2NfY29ubmVjdF92c3AoZGV2aWNlKTsKIAlpZiAocmV0ICE9IDApIHsKIAkJRFBSSU5UX0VSUihORVRWU0MsICJ1bmFibGUgdG8gY29ubmVjdCB0byBOZXRWU1AgLSAlZCIsIHJldCk7CiAJCXJldCA9IC0xOwpAQCAtNzQ1LDE3NCArNzc0LDE3OCBAQAogCiBjbG9zZToKIAkvKiBOb3csIHdlIGNhbiBjbG9zZSB0aGUgY2hhbm5lbCBzYWZlbHkgKi8KLQl2bWJ1c19jbG9zZShEZXZpY2UtPmNoYW5uZWwpOworCXZtYnVzX2Nsb3NlKGRldmljZS0+Y2hhbm5lbCk7CiAKIENsZWFudXA6CiAKLQlpZiAobmV0RGV2aWNlKSB7Ci0JCWtmcmVlKG5ldERldmljZS0+Q2hhbm5lbEluaXRFdmVudCk7CisJaWYgKG5ldF9kZXZpY2UpIHsKKwkJa2ZyZWUobmV0X2RldmljZS0+Y2hhbm5lbF9pbml0X2V2ZW50KTsKIAogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGFja2V0LCBwb3MsCi0JCQkJCSAmbmV0RGV2aWNlLT5SZWNlaXZlUGFja2V0TGlzdCwKLQkJCQkJIExpc3RFbnRyeSkgewotCQkJbGlzdF9kZWwoJnBhY2tldC0+TGlzdEVudHJ5KTsKKwkJCQkJICZuZXRfZGV2aWNlLT5yZWN2X3BrdF9saXN0LAorCQkJCQkgbGlzdF9lbnQpIHsKKwkJCWxpc3RfZGVsKCZwYWNrZXQtPmxpc3RfZW50KTsKIAkJCWtmcmVlKHBhY2tldCk7CiAJCX0KIAotCQlSZWxlYXNlT3V0Ym91bmROZXREZXZpY2UoRGV2aWNlKTsKLQkJUmVsZWFzZUluYm91bmROZXREZXZpY2UoRGV2aWNlKTsKKwkJcmVsZWFzZV9vdXRib3VuZF9uZXRfZGV2aWNlKGRldmljZSk7CisJCXJlbGVhc2VfaW5ib3VuZF9uZXRfZGV2aWNlKGRldmljZSk7CiAKLQkJRnJlZU5ldERldmljZShuZXREZXZpY2UpOworCQlmcmVlX25ldF9kZXZpY2UobmV0X2RldmljZSk7CiAJfQogCiAJcmV0dXJuIHJldDsKIH0KIAogLyoKLSAqIE5ldFZzY09uRGV2aWNlUmVtb3ZlIC0gQ2FsbGJhY2sgd2hlbiB0aGUgcm9vdCBidXMgZGV2aWNlIGlzIHJlbW92ZWQKKyAqIG5ldHZzY19kZXZpY2VfcmVtb3ZlIC0gQ2FsbGJhY2sgd2hlbiB0aGUgcm9vdCBidXMgZGV2aWNlIGlzIHJlbW92ZWQKICAqLwotc3RhdGljIGludCBOZXRWc2NPbkRldmljZVJlbW92ZShzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UpCitzdGF0aWMgaW50IG5ldHZzY19kZXZpY2VfcmVtb3ZlKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0RGV2aWNlOwotCXN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpuZXR2c2NQYWNrZXQsICpwb3M7CisJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2U7CisJc3RydWN0IGh2X25ldHZzY19wYWNrZXQgKm5ldHZzY19wYWNrZXQsICpwb3M7CiAKIAlEUFJJTlRfSU5GTyhORVRWU0MsICJEaXNhYmxpbmcgb3V0Ym91bmQgdHJhZmZpYyBvbiBuZXQgZGV2aWNlICglcCkuLi4iLAotCQkgICAgRGV2aWNlLT5FeHRlbnNpb24pOworCQkgICAgZGV2aWNlLT5FeHRlbnNpb24pOwogCiAJLyogU3RvcCBvdXRib3VuZCB0cmFmZmljIGllIHNlbmRzIGFuZCByZWNlaXZlcyBjb21wbGV0aW9ucyAqLwotCW5ldERldmljZSA9IFJlbGVhc2VPdXRib3VuZE5ldERldmljZShEZXZpY2UpOwotCWlmICghbmV0RGV2aWNlKSB7CisJbmV0X2RldmljZSA9IHJlbGVhc2Vfb3V0Ym91bmRfbmV0X2RldmljZShkZXZpY2UpOworCWlmICghbmV0X2RldmljZSkgewogCQlEUFJJTlRfRVJSKE5FVFZTQywgIk5vIG5ldCBkZXZpY2UgcHJlc2VudCEhIik7CiAJCXJldHVybiAtMTsKIAl9CiAKIAkvKiBXYWl0IGZvciBhbGwgc2VuZCBjb21wbGV0aW9ucyAqLwotCXdoaWxlIChhdG9taWNfcmVhZCgmbmV0RGV2aWNlLT5OdW1PdXRzdGFuZGluZ1NlbmRzKSkgeworCXdoaWxlIChhdG9taWNfcmVhZCgmbmV0X2RldmljZS0+bnVtX291dHN0YW5kaW5nX3NlbmRzKSkgewogCQlEUFJJTlRfSU5GTyhORVRWU0MsICJ3YWl0aW5nIGZvciAlZCByZXF1ZXN0cyB0byBjb21wbGV0ZS4uLiIsCi0JCQkgICAgYXRvbWljX3JlYWQoJm5ldERldmljZS0+TnVtT3V0c3RhbmRpbmdTZW5kcykpOworCQkJICAgIGF0b21pY19yZWFkKCZuZXRfZGV2aWNlLT5udW1fb3V0c3RhbmRpbmdfc2VuZHMpKTsKIAkJdWRlbGF5KDEwMCk7CiAJfQogCiAJRFBSSU5UX0lORk8oTkVUVlNDLCAiRGlzY29ubmVjdGluZyBmcm9tIG5ldHZzcC4uLiIpOwogCi0JTmV0VnNjRGlzY29ubmVjdEZyb21Wc3AobmV0RGV2aWNlKTsKKwlOZXRWc2NEaXNjb25uZWN0RnJvbVZzcChuZXRfZGV2aWNlKTsKIAogCURQUklOVF9JTkZPKE5FVFZTQywgIkRpc2FibGluZyBpbmJvdW5kIHRyYWZmaWMgb24gbmV0IGRldmljZSAoJXApLi4uIiwKLQkJICAgIERldmljZS0+RXh0ZW5zaW9uKTsKKwkJICAgIGRldmljZS0+RXh0ZW5zaW9uKTsKIAogCS8qIFN0b3AgaW5ib3VuZCB0cmFmZmljIGllIHJlY2VpdmVzIGFuZCBzZW5kcyBjb21wbGV0aW9ucyAqLwotCW5ldERldmljZSA9IFJlbGVhc2VJbmJvdW5kTmV0RGV2aWNlKERldmljZSk7CisJbmV0X2RldmljZSA9IHJlbGVhc2VfaW5ib3VuZF9uZXRfZGV2aWNlKGRldmljZSk7CiAKIAkvKiBBdCB0aGlzIHBvaW50LCBubyBvbmUgc2hvdWxkIGJlIGFjY2Vzc2luZyBuZXREZXZpY2UgZXhjZXB0IGluIGhlcmUgKi8KLQlEUFJJTlRfSU5GTyhORVRWU0MsICJuZXQgZGV2aWNlICglcCkgc2FmZSB0byByZW1vdmUiLCBuZXREZXZpY2UpOworCURQUklOVF9JTkZPKE5FVFZTQywgIm5ldCBkZXZpY2UgKCVwKSBzYWZlIHRvIHJlbW92ZSIsIG5ldF9kZXZpY2UpOwogCiAJLyogTm93LCB3ZSBjYW4gY2xvc2UgdGhlIGNoYW5uZWwgc2FmZWx5ICovCi0Jdm1idXNfY2xvc2UoRGV2aWNlLT5jaGFubmVsKTsKKwl2bWJ1c19jbG9zZShkZXZpY2UtPmNoYW5uZWwpOwogCiAJLyogUmVsZWFzZSBhbGwgcmVzb3VyY2VzICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG5ldHZzY1BhY2tldCwgcG9zLAotCQkJCSAmbmV0RGV2aWNlLT5SZWNlaXZlUGFja2V0TGlzdCwgTGlzdEVudHJ5KSB7Ci0JCWxpc3RfZGVsKCZuZXR2c2NQYWNrZXQtPkxpc3RFbnRyeSk7Ci0JCWtmcmVlKG5ldHZzY1BhY2tldCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG5ldHZzY19wYWNrZXQsIHBvcywKKwkJCQkgJm5ldF9kZXZpY2UtPnJlY3ZfcGt0X2xpc3QsIGxpc3RfZW50KSB7CisJCWxpc3RfZGVsKCZuZXR2c2NfcGFja2V0LT5saXN0X2VudCk7CisJCWtmcmVlKG5ldHZzY19wYWNrZXQpOwogCX0KIAotCWtmcmVlKG5ldERldmljZS0+Q2hhbm5lbEluaXRFdmVudCk7Ci0JRnJlZU5ldERldmljZShuZXREZXZpY2UpOworCWtmcmVlKG5ldF9kZXZpY2UtPmNoYW5uZWxfaW5pdF9ldmVudCk7CisJZnJlZV9uZXRfZGV2aWNlKG5ldF9kZXZpY2UpOwogCXJldHVybiAwOwogfQogCiAvKgotICogTmV0VnNjT25DbGVhbnVwIC0gUGVyZm9ybSBhbnkgY2xlYW51cCB3aGVuIHRoZSBkcml2ZXIgaXMgcmVtb3ZlZAorICogbmV0dnNjX2NsZWFudXAgLSBQZXJmb3JtIGFueSBjbGVhbnVwIHdoZW4gdGhlIGRyaXZlciBpcyByZW1vdmVkCiAgKi8KLXN0YXRpYyB2b2lkIE5ldFZzY09uQ2xlYW51cChzdHJ1Y3QgaHZfZHJpdmVyICpkcnYpCitzdGF0aWMgdm9pZCBuZXR2c2NfY2xlYW51cChzdHJ1Y3QgaHZfZHJpdmVyICpkcnYpCiB7CiB9CiAKLXN0YXRpYyB2b2lkIE5ldFZzY09uU2VuZENvbXBsZXRpb24oc3RydWN0IGh2X2RldmljZSAqRGV2aWNlLAotCQkJCSAgIHN0cnVjdCB2bXBhY2tldF9kZXNjcmlwdG9yICpQYWNrZXQpCitzdGF0aWMgdm9pZCBuZXR2c2Nfc2VuZF9jb21wbGV0aW9uKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSwKKwkJCQkgICBzdHJ1Y3Qgdm1wYWNrZXRfZGVzY3JpcHRvciAqcGFja2V0KQogewotCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXREZXZpY2U7Ci0Jc3RydWN0IG52c3BfbWVzc2FnZSAqbnZzcFBhY2tldDsKLQlzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqbnZzY1BhY2tldDsKKwlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZTsKKwlzdHJ1Y3QgbnZzcF9tZXNzYWdlICpudnNwX3BhY2tldDsKKwlzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqbnZzY19wYWNrZXQ7CiAKLQluZXREZXZpY2UgPSBHZXRJbmJvdW5kTmV0RGV2aWNlKERldmljZSk7Ci0JaWYgKCFuZXREZXZpY2UpIHsKKwluZXRfZGV2aWNlID0gZ2V0X2luYm91bmRfbmV0X2RldmljZShkZXZpY2UpOworCWlmICghbmV0X2RldmljZSkgewogCQlEUFJJTlRfRVJSKE5FVFZTQywgInVuYWJsZSB0byBnZXQgbmV0IGRldmljZS4uLiIKIAkJCSAgICJkZXZpY2UgYmVpbmcgZGVzdHJveWVkPyIpOwogCQlyZXR1cm47CiAJfQogCi0JbnZzcFBhY2tldCA9IChzdHJ1Y3QgbnZzcF9tZXNzYWdlICopKCh1bnNpZ25lZCBsb25nKVBhY2tldCArIChQYWNrZXQtPkRhdGFPZmZzZXQ4IDw8IDMpKTsKKwludnNwX3BhY2tldCA9IChzdHJ1Y3QgbnZzcF9tZXNzYWdlICopKCh1bnNpZ25lZCBsb25nKXBhY2tldCArCisJCQkocGFja2V0LT5EYXRhT2Zmc2V0OCA8PCAzKSk7CiAKIAlEUFJJTlRfREJHKE5FVFZTQywgInNlbmQgY29tcGxldGlvbiBwYWNrZXQgLSB0eXBlICVkIiwKLQkJICAgbnZzcFBhY2tldC0+SGVhZGVyLk1lc3NhZ2VUeXBlKTsKKwkJICAgbnZzcF9wYWNrZXQtPmhkci5tc2dfdHlwZSk7CiAKLQlpZiAoKG52c3BQYWNrZXQtPkhlYWRlci5NZXNzYWdlVHlwZSA9PSBOdnNwTWVzc2FnZVR5cGVJbml0Q29tcGxldGUpIHx8Ci0JICAgIChudnNwUGFja2V0LT5IZWFkZXIuTWVzc2FnZVR5cGUgPT0KLQkgICAgIE52c3BNZXNzYWdlMVR5cGVTZW5kUmVjZWl2ZUJ1ZmZlckNvbXBsZXRlKSB8fAotCSAgICAobnZzcFBhY2tldC0+SGVhZGVyLk1lc3NhZ2VUeXBlID09Ci0JICAgICBOdnNwTWVzc2FnZTFUeXBlU2VuZFNlbmRCdWZmZXJDb21wbGV0ZSkpIHsKKwlpZiAoKG52c3BfcGFja2V0LT5oZHIubXNnX3R5cGUgPT0gTlZTUF9NU0dfVFlQRV9JTklUX0NPTVBMRVRFKSB8fAorCSAgICAobnZzcF9wYWNrZXQtPmhkci5tc2dfdHlwZSA9PQorCSAgICAgTlZTUF9NU0cxX1RZUEVfU0VORF9SRUNWX0JVRl9DT01QTEVURSkgfHwKKwkgICAgKG52c3BfcGFja2V0LT5oZHIubXNnX3R5cGUgPT0KKwkgICAgIE5WU1BfTVNHMV9UWVBFX1NFTkRfU0VORF9CVUZfQ09NUExFVEUpKSB7CiAJCS8qIENvcHkgdGhlIHJlc3BvbnNlIGJhY2sgKi8KLQkJbWVtY3B5KCZuZXREZXZpY2UtPkNoYW5uZWxJbml0UGFja2V0LCBudnNwUGFja2V0LAorCQltZW1jcHkoJm5ldF9kZXZpY2UtPmNoYW5uZWxfaW5pdF9wa3QsIG52c3BfcGFja2V0LAogCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBudnNwX21lc3NhZ2UpKTsKLQkJb3NkX1dhaXRFdmVudFNldChuZXREZXZpY2UtPkNoYW5uZWxJbml0RXZlbnQpOwotCX0gZWxzZSBpZiAobnZzcFBhY2tldC0+SGVhZGVyLk1lc3NhZ2VUeXBlID09Ci0JCSAgIE52c3BNZXNzYWdlMVR5cGVTZW5kUk5ESVNQYWNrZXRDb21wbGV0ZSkgeworCQlvc2Rfd2FpdGV2ZW50X3NldChuZXRfZGV2aWNlLT5jaGFubmVsX2luaXRfZXZlbnQpOworCX0gZWxzZSBpZiAobnZzcF9wYWNrZXQtPmhkci5tc2dfdHlwZSA9PQorCQkgICBOVlNQX01TRzFfVFlQRV9TRU5EX1JORElTX1BLVF9DT01QTEVURSkgewogCQkvKiBHZXQgdGhlIHNlbmQgY29udGV4dCAqLwotCQludnNjUGFja2V0ID0gKHN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICopKHVuc2lnbmVkIGxvbmcpUGFja2V0LT5UcmFuc2FjdGlvbklkOworCQludnNjX3BhY2tldCA9IChzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqKSh1bnNpZ25lZCBsb25nKQorCQkJcGFja2V0LT5UcmFuc2FjdGlvbklkOwogCQkvKiBBU1NFUlQobnZzY1BhY2tldCk7ICovCiAKIAkJLyogTm90aWZ5IHRoZSBsYXllciBhYm92ZSB1cyAqLwotCQludnNjUGFja2V0LT5Db21wbGV0aW9uLlNlbmQuT25TZW5kQ29tcGxldGlvbihudnNjUGFja2V0LT5Db21wbGV0aW9uLlNlbmQuU2VuZENvbXBsZXRpb25Db250ZXh0KTsKKwkJbnZzY19wYWNrZXQtPmNvbXBsZXRpb24uc2VuZC5zZW5kX2NvbXBsZXRpb24oCisJCQludnNjX3BhY2tldC0+Y29tcGxldGlvbi5zZW5kLnNlbmRfY29tcGxldGlvbl9jdHgpOwogCi0JCWF0b21pY19kZWMoJm5ldERldmljZS0+TnVtT3V0c3RhbmRpbmdTZW5kcyk7CisJCWF0b21pY19kZWMoJm5ldF9kZXZpY2UtPm51bV9vdXRzdGFuZGluZ19zZW5kcyk7CiAJfSBlbHNlIHsKIAkJRFBSSU5UX0VSUihORVRWU0MsICJVbmtub3duIHNlbmQgY29tcGxldGlvbiBwYWNrZXQgdHlwZSAtICIKLQkJCSAgICIlZCByZWNlaXZlZCEhIiwgbnZzcFBhY2tldC0+SGVhZGVyLk1lc3NhZ2VUeXBlKTsKKwkJCSAgICIlZCByZWNlaXZlZCEhIiwgbnZzcF9wYWNrZXQtPmhkci5tc2dfdHlwZSk7CiAJfQogCi0JUHV0TmV0RGV2aWNlKERldmljZSk7CisJcHV0X25ldF9kZXZpY2UoZGV2aWNlKTsKIH0KIAotc3RhdGljIGludCBOZXRWc2NPblNlbmQoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlLAotCQkJc3RydWN0IGh2X25ldHZzY19wYWNrZXQgKlBhY2tldCkKK3N0YXRpYyBpbnQgbmV0dnNjX3NlbmQoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlLAorCQkJc3RydWN0IGh2X25ldHZzY19wYWNrZXQgKnBhY2tldCkKIHsKLQlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0RGV2aWNlOworCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXRfZGV2aWNlOwogCWludCByZXQgPSAwOwogCiAJc3RydWN0IG52c3BfbWVzc2FnZSBzZW5kTWVzc2FnZTsKIAotCW5ldERldmljZSA9IEdldE91dGJvdW5kTmV0RGV2aWNlKERldmljZSk7Ci0JaWYgKCFuZXREZXZpY2UpIHsKKwluZXRfZGV2aWNlID0gZ2V0X291dGJvdW5kX25ldF9kZXZpY2UoZGV2aWNlKTsKKwlpZiAoIW5ldF9kZXZpY2UpIHsKIAkJRFBSSU5UX0VSUihORVRWU0MsICJuZXQgZGV2aWNlICglcCkgc2h1dHRpbmcgZG93bi4uLiIKLQkJCSAgICJpZ25vcmluZyBvdXRib3VuZCBwYWNrZXRzIiwgbmV0RGV2aWNlKTsKKwkJCSAgICJpZ25vcmluZyBvdXRib3VuZCBwYWNrZXRzIiwgbmV0X2RldmljZSk7CiAJCXJldHVybiAtMjsKIAl9CiAKLQlzZW5kTWVzc2FnZS5IZWFkZXIuTWVzc2FnZVR5cGUgPSBOdnNwTWVzc2FnZTFUeXBlU2VuZFJORElTUGFja2V0OwotCWlmIChQYWNrZXQtPklzRGF0YVBhY2tldCkgeworCXNlbmRNZXNzYWdlLmhkci5tc2dfdHlwZSA9IE5WU1BfTVNHMV9UWVBFX1NFTkRfUk5ESVNfUEtUOworCWlmIChwYWNrZXQtPmlzX2RhdGFfcGt0KSB7CiAJCS8qIDAgaXMgUk1DX0RBVEE7ICovCi0JCXNlbmRNZXNzYWdlLk1lc3NhZ2VzLlZlcnNpb24xTWVzc2FnZXMuU2VuZFJORElTUGFja2V0LkNoYW5uZWxUeXBlID0gMDsKKwkJc2VuZE1lc3NhZ2UubXNnLnYxX21zZy5zZW5kX3JuZGlzX3BrdC5jaGFubmVsX3R5cGUgPSAwOwogCX0gZWxzZSB7CiAJCS8qIDEgaXMgUk1DX0NPTlRST0w7ICovCi0JCXNlbmRNZXNzYWdlLk1lc3NhZ2VzLlZlcnNpb24xTWVzc2FnZXMuU2VuZFJORElTUGFja2V0LkNoYW5uZWxUeXBlID0gMTsKKwkJc2VuZE1lc3NhZ2UubXNnLnYxX21zZy5zZW5kX3JuZGlzX3BrdC5jaGFubmVsX3R5cGUgPSAxOwogCX0KIAogCS8qIE5vdCB1c2luZyBzZW5kIGJ1ZmZlciBzZWN0aW9uICovCi0Jc2VuZE1lc3NhZ2UuTWVzc2FnZXMuVmVyc2lvbjFNZXNzYWdlcy5TZW5kUk5ESVNQYWNrZXQuU2VuZEJ1ZmZlclNlY3Rpb25JbmRleCA9IDB4RkZGRkZGRkY7Ci0Jc2VuZE1lc3NhZ2UuTWVzc2FnZXMuVmVyc2lvbjFNZXNzYWdlcy5TZW5kUk5ESVNQYWNrZXQuU2VuZEJ1ZmZlclNlY3Rpb25TaXplID0gMDsKKwlzZW5kTWVzc2FnZS5tc2cudjFfbXNnLnNlbmRfcm5kaXNfcGt0LnNlbmRfYnVmX3NlY3Rpb25faW5kZXggPQorCQkweEZGRkZGRkZGOworCXNlbmRNZXNzYWdlLm1zZy52MV9tc2cuc2VuZF9ybmRpc19wa3Quc2VuZF9idWZfc2VjdGlvbl9zaXplID0gMDsKIAotCWlmIChQYWNrZXQtPlBhZ2VCdWZmZXJDb3VudCkgewotCQlyZXQgPSB2bWJ1c19zZW5kcGFja2V0X3BhZ2VidWZmZXIoRGV2aWNlLT5jaGFubmVsLAotCQkJCQkJICBQYWNrZXQtPlBhZ2VCdWZmZXJzLAotCQkJCQkJICBQYWNrZXQtPlBhZ2VCdWZmZXJDb3VudCwKKwlpZiAocGFja2V0LT5wYWdlX2J1Zl9jbnQpIHsKKwkJcmV0ID0gdm1idXNfc2VuZHBhY2tldF9wYWdlYnVmZmVyKGRldmljZS0+Y2hhbm5lbCwKKwkJCQkJCSAgcGFja2V0LT5wYWdlX2J1ZiwKKwkJCQkJCSAgcGFja2V0LT5wYWdlX2J1Zl9jbnQsCiAJCQkJCQkgICZzZW5kTWVzc2FnZSwKIAkJCQkJCSAgc2l6ZW9mKHN0cnVjdCBudnNwX21lc3NhZ2UpLAotCQkJCQkJICAodW5zaWduZWQgbG9uZylQYWNrZXQpOworCQkJCQkJICAodW5zaWduZWQgbG9uZylwYWNrZXQpOwogCX0gZWxzZSB7Ci0JCXJldCA9IHZtYnVzX3NlbmRwYWNrZXQoRGV2aWNlLT5jaGFubmVsLCAmc2VuZE1lc3NhZ2UsCisJCXJldCA9IHZtYnVzX3NlbmRwYWNrZXQoZGV2aWNlLT5jaGFubmVsLCAmc2VuZE1lc3NhZ2UsCiAJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgbnZzcF9tZXNzYWdlKSwKLQkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpUGFja2V0LAorCQkJCSAgICAgICAodW5zaWduZWQgbG9uZylwYWNrZXQsCiAJCQkJICAgICAgIFZtYnVzUGFja2V0VHlwZURhdGFJbkJhbmQsCiAJCQkJICAgICAgIFZNQlVTX0RBVEFfUEFDS0VUX0ZMQUdfQ09NUExFVElPTl9SRVFVRVNURUQpOwogCkBAIC05MjAsMzEgKzk1MywzMSBAQAogCiAJaWYgKHJldCAhPSAwKQogCQlEUFJJTlRfRVJSKE5FVFZTQywgIlVuYWJsZSB0byBzZW5kIHBhY2tldCAlcCByZXQgJWQiLAotCQkJICAgUGFja2V0LCByZXQpOworCQkJICAgcGFja2V0LCByZXQpOwogCi0JYXRvbWljX2luYygmbmV0RGV2aWNlLT5OdW1PdXRzdGFuZGluZ1NlbmRzKTsKLQlQdXROZXREZXZpY2UoRGV2aWNlKTsKKwlhdG9taWNfaW5jKCZuZXRfZGV2aWNlLT5udW1fb3V0c3RhbmRpbmdfc2VuZHMpOworCXB1dF9uZXRfZGV2aWNlKGRldmljZSk7CiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgTmV0VnNjT25SZWNlaXZlKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSwKLQkJCSAgICBzdHJ1Y3Qgdm1wYWNrZXRfZGVzY3JpcHRvciAqUGFja2V0KQorc3RhdGljIHZvaWQgbmV0dnNjX3JlY2VpdmUoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlLAorCQkJICAgIHN0cnVjdCB2bXBhY2tldF9kZXNjcmlwdG9yICpwYWNrZXQpCiB7Ci0Jc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldERldmljZTsKLQlzdHJ1Y3Qgdm10cmFuc2Zlcl9wYWdlX3BhY2tldF9oZWFkZXIgKnZteGZlcnBhZ2VQYWNrZXQ7Ci0Jc3RydWN0IG52c3BfbWVzc2FnZSAqbnZzcFBhY2tldDsKLQlzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqbmV0dnNjUGFja2V0ID0gTlVMTDsKKwlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZTsKKwlzdHJ1Y3Qgdm10cmFuc2Zlcl9wYWdlX3BhY2tldF9oZWFkZXIgKnZteGZlcnBhZ2VfcGFja2V0OworCXN0cnVjdCBudnNwX21lc3NhZ2UgKm52c3BfcGFja2V0OworCXN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpuZXR2c2NfcGFja2V0ID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIHN0YXJ0OwotCXVuc2lnbmVkIGxvbmcgZW5kLCBlbmRWaXJ0dWFsOworCXVuc2lnbmVkIGxvbmcgZW5kLCBlbmRfdmlydHVhbDsKIAkvKiBzdHJ1Y3QgbmV0dnNjX2RyaXZlciAqbmV0dnNjRHJpdmVyOyAqLwotCXN0cnVjdCB4ZmVycGFnZV9wYWNrZXQgKnhmZXJwYWdlUGFja2V0ID0gTlVMTDsKKwlzdHJ1Y3QgeGZlcnBhZ2VfcGFja2V0ICp4ZmVycGFnZV9wYWNrZXQgPSBOVUxMOwogCWludCBpLCBqOwotCWludCBjb3VudCA9IDAsIGJ5dGVzUmVtYWluID0gMDsKKwlpbnQgY291bnQgPSAwLCBieXRlc19yZW1haW4gPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJTElTVF9IRUFEKGxpc3RIZWFkKTsKIAotCW5ldERldmljZSA9IEdldEluYm91bmROZXREZXZpY2UoRGV2aWNlKTsKLQlpZiAoIW5ldERldmljZSkgeworCW5ldF9kZXZpY2UgPSBnZXRfaW5ib3VuZF9uZXRfZGV2aWNlKGRldmljZSk7CisJaWYgKCFuZXRfZGV2aWNlKSB7CiAJCURQUklOVF9FUlIoTkVUVlNDLCAidW5hYmxlIHRvIGdldCBuZXQgZGV2aWNlLi4uIgogCQkJICAgImRldmljZSBiZWluZyBkZXN0cm95ZWQ/Iik7CiAJCXJldHVybjsKQEAgLTk1NCwzOSArOTg3LDQwIEBACiAJICogQWxsIGluYm91bmQgcGFja2V0cyBvdGhlciB0aGFuIHNlbmQgY29tcGxldGlvbiBzaG91bGQgYmUgeGZlciBwYWdlCiAJICogcGFja2V0CiAJICovCi0JaWYgKFBhY2tldC0+VHlwZSAhPSBWbWJ1c1BhY2tldFR5cGVEYXRhVXNpbmdUcmFuc2ZlclBhZ2VzKSB7CisJaWYgKHBhY2tldC0+VHlwZSAhPSBWbWJ1c1BhY2tldFR5cGVEYXRhVXNpbmdUcmFuc2ZlclBhZ2VzKSB7CiAJCURQUklOVF9FUlIoTkVUVlNDLCAiVW5rbm93biBwYWNrZXQgdHlwZSByZWNlaXZlZCAtICVkIiwKLQkJCSAgIFBhY2tldC0+VHlwZSk7Ci0JCVB1dE5ldERldmljZShEZXZpY2UpOworCQkJICAgcGFja2V0LT5UeXBlKTsKKwkJcHV0X25ldF9kZXZpY2UoZGV2aWNlKTsKIAkJcmV0dXJuOwogCX0KIAotCW52c3BQYWNrZXQgPSAoc3RydWN0IG52c3BfbWVzc2FnZSAqKSgodW5zaWduZWQgbG9uZylQYWNrZXQgKwotCQkJKFBhY2tldC0+RGF0YU9mZnNldDggPDwgMykpOworCW52c3BfcGFja2V0ID0gKHN0cnVjdCBudnNwX21lc3NhZ2UgKikoKHVuc2lnbmVkIGxvbmcpcGFja2V0ICsKKwkJCShwYWNrZXQtPkRhdGFPZmZzZXQ4IDw8IDMpKTsKIAogCS8qIE1ha2Ugc3VyZSB0aGlzIGlzIGEgdmFsaWQgbnZzcCBwYWNrZXQgKi8KLQlpZiAobnZzcFBhY2tldC0+SGVhZGVyLk1lc3NhZ2VUeXBlICE9IE52c3BNZXNzYWdlMVR5cGVTZW5kUk5ESVNQYWNrZXQpIHsKKwlpZiAobnZzcF9wYWNrZXQtPmhkci5tc2dfdHlwZSAhPQorCSAgICBOVlNQX01TRzFfVFlQRV9TRU5EX1JORElTX1BLVCkgewogCQlEUFJJTlRfRVJSKE5FVFZTQywgIlVua25vd24gbnZzcCBwYWNrZXQgdHlwZSByZWNlaXZlZCAtICVkIiwKLQkJCSAgIG52c3BQYWNrZXQtPkhlYWRlci5NZXNzYWdlVHlwZSk7Ci0JCVB1dE5ldERldmljZShEZXZpY2UpOworCQkJICAgbnZzcF9wYWNrZXQtPmhkci5tc2dfdHlwZSk7CisJCXB1dF9uZXRfZGV2aWNlKGRldmljZSk7CiAJCXJldHVybjsKIAl9CiAKIAlEUFJJTlRfREJHKE5FVFZTQywgIk5WU1AgcGFja2V0IHJlY2VpdmVkIC0gdHlwZSAlZCIsCi0JCSAgIG52c3BQYWNrZXQtPkhlYWRlci5NZXNzYWdlVHlwZSk7CisJCSAgIG52c3BfcGFja2V0LT5oZHIubXNnX3R5cGUpOwogCi0Jdm14ZmVycGFnZVBhY2tldCA9IChzdHJ1Y3Qgdm10cmFuc2Zlcl9wYWdlX3BhY2tldF9oZWFkZXIgKilQYWNrZXQ7CisJdm14ZmVycGFnZV9wYWNrZXQgPSAoc3RydWN0IHZtdHJhbnNmZXJfcGFnZV9wYWNrZXRfaGVhZGVyICopcGFja2V0OwogCi0JaWYgKHZteGZlcnBhZ2VQYWNrZXQtPlRyYW5zZmVyUGFnZVNldElkICE9IE5FVFZTQ19SRUNFSVZFX0JVRkZFUl9JRCkgeworCWlmICh2bXhmZXJwYWdlX3BhY2tldC0+VHJhbnNmZXJQYWdlU2V0SWQgIT0gTkVUVlNDX1JFQ0VJVkVfQlVGRkVSX0lEKSB7CiAJCURQUklOVF9FUlIoTkVUVlNDLCAiSW52YWxpZCB4ZmVyIHBhZ2Ugc2V0IGlkIC0gIgogCQkJICAgImV4cGVjdGluZyAleCBnb3QgJXgiLCBORVRWU0NfUkVDRUlWRV9CVUZGRVJfSUQsCi0JCQkgICB2bXhmZXJwYWdlUGFja2V0LT5UcmFuc2ZlclBhZ2VTZXRJZCk7Ci0JCVB1dE5ldERldmljZShEZXZpY2UpOworCQkJICAgdm14ZmVycGFnZV9wYWNrZXQtPlRyYW5zZmVyUGFnZVNldElkKTsKKwkJcHV0X25ldF9kZXZpY2UoZGV2aWNlKTsKIAkJcmV0dXJuOwogCX0KIAogCURQUklOVF9EQkcoTkVUVlNDLCAieGZlciBwYWdlIC0gcmFuZ2UgY291bnQgJWQiLAotCQkgICB2bXhmZXJwYWdlUGFja2V0LT5SYW5nZUNvdW50KTsKKwkJICAgdm14ZmVycGFnZV9wYWNrZXQtPlJhbmdlQ291bnQpOwogCiAJLyoKIAkgKiBHcmFiIGZyZWUgcGFja2V0cyAocmFuZ2UgY291bnQgKyAxKSB0byByZXByZXNlbnQgdGhpcyB4ZmVyCkBAIC05OTQsMTMgKzEwMjgsMTMgQEAKIAkgKiBXZSBncmFiIGl0IGhlcmUgc28gdGhhdCB3ZSBrbm93IGV4YWN0bHkgaG93IG1hbnkgd2UgY2FuCiAJICogZnVsZmlsCiAJICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm5ldERldmljZS0+cmVjZWl2ZV9wYWNrZXRfbGlzdF9sb2NrLCBmbGFncyk7Ci0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZuZXREZXZpY2UtPlJlY2VpdmVQYWNrZXRMaXN0KSkgewotCQlsaXN0X21vdmVfdGFpbChuZXREZXZpY2UtPlJlY2VpdmVQYWNrZXRMaXN0Lm5leHQsICZsaXN0SGVhZCk7Ci0JCWlmICgrK2NvdW50ID09IHZteGZlcnBhZ2VQYWNrZXQtPlJhbmdlQ291bnQgKyAxKQorCXNwaW5fbG9ja19pcnFzYXZlKCZuZXRfZGV2aWNlLT5yZWN2X3BrdF9saXN0X2xvY2ssIGZsYWdzKTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJm5ldF9kZXZpY2UtPnJlY3ZfcGt0X2xpc3QpKSB7CisJCWxpc3RfbW92ZV90YWlsKG5ldF9kZXZpY2UtPnJlY3ZfcGt0X2xpc3QubmV4dCwgJmxpc3RIZWFkKTsKKwkJaWYgKCsrY291bnQgPT0gdm14ZmVycGFnZV9wYWNrZXQtPlJhbmdlQ291bnQgKyAxKQogCQkJYnJlYWs7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5ldERldmljZS0+cmVjZWl2ZV9wYWNrZXRfbGlzdF9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmV0X2RldmljZS0+cmVjdl9wa3RfbGlzdF9sb2NrLCBmbGFncyk7CiAKIAkvKgogCSAqIFdlIG5lZWQgYXQgbGVhc3QgMiBuZXR2c2MgcGt0cyAoMSB0byByZXByZXNlbnQgdGhlIHhmZXIKQEAgLTEwMTAsMTQwICsxMDQ0LDE0OSBAQAogCWlmIChjb3VudCA8IDIpIHsKIAkJRFBSSU5UX0VSUihORVRWU0MsICJHb3Qgb25seSAlZCBuZXR2c2MgcGt0Li4ubmVlZGVkICVkIHBrdHMuICIKIAkJCSAgICJEcm9wcGluZyB0aGlzIHhmZXIgcGFnZSBwYWNrZXQgY29tcGxldGVseSEiLAotCQkJICAgY291bnQsIHZteGZlcnBhZ2VQYWNrZXQtPlJhbmdlQ291bnQgKyAxKTsKKwkJCSAgIGNvdW50LCB2bXhmZXJwYWdlX3BhY2tldC0+UmFuZ2VDb3VudCArIDEpOwogCiAJCS8qIFJldHVybiBpdCB0byB0aGUgZnJlZWxpc3QgKi8KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJm5ldERldmljZS0+cmVjZWl2ZV9wYWNrZXRfbGlzdF9sb2NrLCBmbGFncyk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZuZXRfZGV2aWNlLT5yZWN2X3BrdF9saXN0X2xvY2ssIGZsYWdzKTsKIAkJZm9yIChpID0gY291bnQ7IGkgIT0gMDsgaS0tKSB7CiAJCQlsaXN0X21vdmVfdGFpbChsaXN0SGVhZC5uZXh0LAotCQkJCSAgICAgICAmbmV0RGV2aWNlLT5SZWNlaXZlUGFja2V0TGlzdCk7CisJCQkJICAgICAgICZuZXRfZGV2aWNlLT5yZWN2X3BrdF9saXN0KTsKIAkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuZXREZXZpY2UtPnJlY2VpdmVfcGFja2V0X2xpc3RfbG9jaywKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmV0X2RldmljZS0+cmVjdl9wa3RfbGlzdF9sb2NrLAogCQkJCSAgICAgICBmbGFncyk7CiAKLQkJTmV0VnNjU2VuZFJlY2VpdmVDb21wbGV0aW9uKERldmljZSwKLQkJCQkJICAgIHZteGZlcnBhZ2VQYWNrZXQtPmQuVHJhbnNhY3Rpb25JZCk7CisJCW5ldHZzY19zZW5kX3JlY3ZfY29tcGxldGlvbihkZXZpY2UsCisJCQkJCSAgICB2bXhmZXJwYWdlX3BhY2tldC0+ZC5UcmFuc2FjdGlvbklkKTsKIAotCQlQdXROZXREZXZpY2UoRGV2aWNlKTsKKwkJcHV0X25ldF9kZXZpY2UoZGV2aWNlKTsKIAkJcmV0dXJuOwogCX0KIAogCS8qIFJlbW92ZSB0aGUgMXN0IHBhY2tldCB0byByZXByZXNlbnQgdGhlIHhmZXIgcGFnZSBwYWNrZXQgaXRzZWxmICovCi0JeGZlcnBhZ2VQYWNrZXQgPSAoc3RydWN0IHhmZXJwYWdlX3BhY2tldCAqKWxpc3RIZWFkLm5leHQ7Ci0JbGlzdF9kZWwoJnhmZXJwYWdlUGFja2V0LT5MaXN0RW50cnkpOworCXhmZXJwYWdlX3BhY2tldCA9IChzdHJ1Y3QgeGZlcnBhZ2VfcGFja2V0ICopbGlzdEhlYWQubmV4dDsKKwlsaXN0X2RlbCgmeGZlcnBhZ2VfcGFja2V0LT5saXN0X2VudCk7CiAKIAkvKiBUaGlzIGlzIGhvdyBtdWNoIHdlIGNhbiBzYXRpc2Z5ICovCi0JeGZlcnBhZ2VQYWNrZXQtPkNvdW50ID0gY291bnQgLSAxOworCXhmZXJwYWdlX3BhY2tldC0+Y291bnQgPSBjb3VudCAtIDE7CiAJLyogQVNTRVJUKHhmZXJwYWdlUGFja2V0LT5Db3VudCA+IDAgJiYgeGZlcnBhZ2VQYWNrZXQtPkNvdW50IDw9ICovCiAJLyogCXZteGZlcnBhZ2VQYWNrZXQtPlJhbmdlQ291bnQpOyAqLwogCi0JaWYgKHhmZXJwYWdlUGFja2V0LT5Db3VudCAhPSB2bXhmZXJwYWdlUGFja2V0LT5SYW5nZUNvdW50KSB7CisJaWYgKHhmZXJwYWdlX3BhY2tldC0+Y291bnQgIT0gdm14ZmVycGFnZV9wYWNrZXQtPlJhbmdlQ291bnQpIHsKIAkJRFBSSU5UX0lORk8oTkVUVlNDLCAiTmVlZGVkICVkIG5ldHZzYyBwa3RzIHRvIHNhdGlzeSB0aGlzIHhmZXIgIgotCQkJICAgICJwYWdlLi4uZ290ICVkIiwgdm14ZmVycGFnZVBhY2tldC0+UmFuZ2VDb3VudCwKLQkJCSAgICB4ZmVycGFnZVBhY2tldC0+Q291bnQpOworCQkJICAgICJwYWdlLi4uZ290ICVkIiwgdm14ZmVycGFnZV9wYWNrZXQtPlJhbmdlQ291bnQsCisJCQkgICAgeGZlcnBhZ2VfcGFja2V0LT5jb3VudCk7CiAJfQogCiAJLyogRWFjaCByYW5nZSByZXByZXNlbnRzIDEgUk5ESVMgcGt0IHRoYXQgY29udGFpbnMgMSBldGhlcm5ldCBmcmFtZSAqLwogCWZvciAoaSA9IDA7IGkgPCAoY291bnQgLSAxKTsgaSsrKSB7Ci0JCW5ldHZzY1BhY2tldCA9IChzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqKWxpc3RIZWFkLm5leHQ7Ci0JCWxpc3RfZGVsKCZuZXR2c2NQYWNrZXQtPkxpc3RFbnRyeSk7CisJCW5ldHZzY19wYWNrZXQgPSAoc3RydWN0IGh2X25ldHZzY19wYWNrZXQgKilsaXN0SGVhZC5uZXh0OworCQlsaXN0X2RlbCgmbmV0dnNjX3BhY2tldC0+bGlzdF9lbnQpOwogCiAJCS8qIEluaXRpYWxpemUgdGhlIG5ldHZzYyBwYWNrZXQgKi8KLQkJbmV0dnNjUGFja2V0LT5YZmVyUGFnZVBhY2tldCA9IHhmZXJwYWdlUGFja2V0OwotCQluZXR2c2NQYWNrZXQtPkNvbXBsZXRpb24uUmVjdi5PblJlY2VpdmVDb21wbGV0aW9uID0KLQkJCQkJTmV0VnNjT25SZWNlaXZlQ29tcGxldGlvbjsKLQkJbmV0dnNjUGFja2V0LT5Db21wbGV0aW9uLlJlY3YuUmVjZWl2ZUNvbXBsZXRpb25Db250ZXh0ID0KLQkJCQkJbmV0dnNjUGFja2V0OwotCQluZXR2c2NQYWNrZXQtPkRldmljZSA9IERldmljZTsKKwkJbmV0dnNjX3BhY2tldC0+eGZlcl9wYWdlX3BrdCA9IHhmZXJwYWdlX3BhY2tldDsKKwkJbmV0dnNjX3BhY2tldC0+Y29tcGxldGlvbi5yZWN2LnJlY3ZfY29tcGxldGlvbiA9CisJCQkJCW5ldHZzY19yZWNlaXZlX2NvbXBsZXRpb247CisJCW5ldHZzY19wYWNrZXQtPmNvbXBsZXRpb24ucmVjdi5yZWN2X2NvbXBsZXRpb25fY3R4ID0KKwkJCQkJbmV0dnNjX3BhY2tldDsKKwkJbmV0dnNjX3BhY2tldC0+ZGV2aWNlID0gZGV2aWNlOwogCQkvKiBTYXZlIHRoaXMgc28gdGhhdCB3ZSBjYW4gc2VuZCBpdCBiYWNrICovCi0JCW5ldHZzY1BhY2tldC0+Q29tcGxldGlvbi5SZWN2LlJlY2VpdmVDb21wbGV0aW9uVGlkID0KLQkJCQkJdm14ZmVycGFnZVBhY2tldC0+ZC5UcmFuc2FjdGlvbklkOworCQluZXR2c2NfcGFja2V0LT5jb21wbGV0aW9uLnJlY3YucmVjdl9jb21wbGV0aW9uX3RpZCA9CisJCQkJCXZteGZlcnBhZ2VfcGFja2V0LT5kLlRyYW5zYWN0aW9uSWQ7CiAKLQkJbmV0dnNjUGFja2V0LT5Ub3RhbERhdGFCdWZmZXJMZW5ndGggPQotCQkJCQl2bXhmZXJwYWdlUGFja2V0LT5SYW5nZXNbaV0uQnl0ZUNvdW50OwotCQluZXR2c2NQYWNrZXQtPlBhZ2VCdWZmZXJDb3VudCA9IDE7CisJCW5ldHZzY19wYWNrZXQtPnRvdGFsX2RhdGFfYnVmbGVuID0KKwkJCQkJdm14ZmVycGFnZV9wYWNrZXQtPlJhbmdlc1tpXS5CeXRlQ291bnQ7CisJCW5ldHZzY19wYWNrZXQtPnBhZ2VfYnVmX2NudCA9IDE7CiAKIAkJLyogQVNTRVJUKHZteGZlcnBhZ2VQYWNrZXQtPlJhbmdlc1tpXS5CeXRlT2Zmc2V0ICsgKi8KIAkJLyogCXZteGZlcnBhZ2VQYWNrZXQtPlJhbmdlc1tpXS5CeXRlQ291bnQgPCAqLwogCQkvKiAJbmV0RGV2aWNlLT5SZWNlaXZlQnVmZmVyU2l6ZSk7ICovCiAKLQkJbmV0dnNjUGFja2V0LT5QYWdlQnVmZmVyc1swXS5MZW5ndGggPQotCQkJCQl2bXhmZXJwYWdlUGFja2V0LT5SYW5nZXNbaV0uQnl0ZUNvdW50OworCQluZXR2c2NfcGFja2V0LT5wYWdlX2J1ZlswXS5MZW5ndGggPQorCQkJCQl2bXhmZXJwYWdlX3BhY2tldC0+UmFuZ2VzW2ldLkJ5dGVDb3VudDsKIAotCQlzdGFydCA9IHZpcnRfdG9fcGh5cygodm9pZCAqKSgodW5zaWduZWQgbG9uZyluZXREZXZpY2UtPlJlY2VpdmVCdWZmZXIgKyB2bXhmZXJwYWdlUGFja2V0LT5SYW5nZXNbaV0uQnl0ZU9mZnNldCkpOworCQlzdGFydCA9IHZpcnRfdG9fcGh5cygodm9pZCAqKSgodW5zaWduZWQgbG9uZyluZXRfZGV2aWNlLT4KKwkJcmVjdl9idWYgKyB2bXhmZXJwYWdlX3BhY2tldC0+UmFuZ2VzW2ldLkJ5dGVPZmZzZXQpKTsKIAotCQluZXR2c2NQYWNrZXQtPlBhZ2VCdWZmZXJzWzBdLlBmbiA9IHN0YXJ0ID4+IFBBR0VfU0hJRlQ7Ci0JCWVuZFZpcnR1YWwgPSAodW5zaWduZWQgbG9uZyluZXREZXZpY2UtPlJlY2VpdmVCdWZmZXIKLQkJICAgICsgdm14ZmVycGFnZVBhY2tldC0+UmFuZ2VzW2ldLkJ5dGVPZmZzZXQKLQkJICAgICsgdm14ZmVycGFnZVBhY2tldC0+UmFuZ2VzW2ldLkJ5dGVDb3VudCAtIDE7Ci0JCWVuZCA9IHZpcnRfdG9fcGh5cygodm9pZCAqKWVuZFZpcnR1YWwpOworCQluZXR2c2NfcGFja2V0LT5wYWdlX2J1ZlswXS5QZm4gPSBzdGFydCA+PiBQQUdFX1NISUZUOworCQllbmRfdmlydHVhbCA9ICh1bnNpZ25lZCBsb25nKW5ldF9kZXZpY2UtPnJlY3ZfYnVmCisJCSAgICArIHZteGZlcnBhZ2VfcGFja2V0LT5SYW5nZXNbaV0uQnl0ZU9mZnNldAorCQkgICAgKyB2bXhmZXJwYWdlX3BhY2tldC0+UmFuZ2VzW2ldLkJ5dGVDb3VudCAtIDE7CisJCWVuZCA9IHZpcnRfdG9fcGh5cygodm9pZCAqKWVuZF92aXJ0dWFsKTsKIAogCQkvKiBDYWxjdWxhdGUgdGhlIHBhZ2UgcmVsYXRpdmUgb2Zmc2V0ICovCi0JCW5ldHZzY1BhY2tldC0+UGFnZUJ1ZmZlcnNbMF0uT2Zmc2V0ID0KLQkJCXZteGZlcnBhZ2VQYWNrZXQtPlJhbmdlc1tpXS5CeXRlT2Zmc2V0ICYgKFBBR0VfU0laRSAtIDEpOworCQluZXR2c2NfcGFja2V0LT5wYWdlX2J1ZlswXS5PZmZzZXQgPQorCQkJdm14ZmVycGFnZV9wYWNrZXQtPlJhbmdlc1tpXS5CeXRlT2Zmc2V0ICYKKwkJCShQQUdFX1NJWkUgLSAxKTsKIAkJaWYgKChlbmQgPj4gUEFHRV9TSElGVCkgIT0gKHN0YXJ0ID4+IFBBR0VfU0hJRlQpKSB7CiAJCQkvKiBIYW5kbGUgZnJhbWUgYWNyb3NzIG11bHRpcGxlIHBhZ2VzOiAqLwotCQkJbmV0dnNjUGFja2V0LT5QYWdlQnVmZmVyc1swXS5MZW5ndGggPQotCQkJCShuZXR2c2NQYWNrZXQtPlBhZ2VCdWZmZXJzWzBdLlBmbiA8PCBQQUdFX1NISUZUKQorCQkJbmV0dnNjX3BhY2tldC0+cGFnZV9idWZbMF0uTGVuZ3RoID0KKwkJCQkobmV0dnNjX3BhY2tldC0+cGFnZV9idWZbMF0uUGZuIDw8CisJCQkJIFBBR0VfU0hJRlQpCiAJCQkJKyBQQUdFX1NJWkUgLSBzdGFydDsKLQkJCWJ5dGVzUmVtYWluID0gbmV0dnNjUGFja2V0LT5Ub3RhbERhdGFCdWZmZXJMZW5ndGggLQotCQkJCQluZXR2c2NQYWNrZXQtPlBhZ2VCdWZmZXJzWzBdLkxlbmd0aDsKKwkJCWJ5dGVzX3JlbWFpbiA9IG5ldHZzY19wYWNrZXQtPnRvdGFsX2RhdGFfYnVmbGVuIC0KKwkJCQkJbmV0dnNjX3BhY2tldC0+cGFnZV9idWZbMF0uTGVuZ3RoOwogCQkJZm9yIChqID0gMTsgaiA8IE5FVFZTQ19QQUNLRVRfTUFYUEFHRTsgaisrKSB7Ci0JCQkJbmV0dnNjUGFja2V0LT5QYWdlQnVmZmVyc1tqXS5PZmZzZXQgPSAwOwotCQkJCWlmIChieXRlc1JlbWFpbiA8PSBQQUdFX1NJWkUpIHsKLQkJCQkJbmV0dnNjUGFja2V0LT5QYWdlQnVmZmVyc1tqXS5MZW5ndGggPSBieXRlc1JlbWFpbjsKLQkJCQkJYnl0ZXNSZW1haW4gPSAwOworCQkJCW5ldHZzY19wYWNrZXQtPnBhZ2VfYnVmW2pdLk9mZnNldCA9IDA7CisJCQkJaWYgKGJ5dGVzX3JlbWFpbiA8PSBQQUdFX1NJWkUpIHsKKwkJCQkJbmV0dnNjX3BhY2tldC0+cGFnZV9idWZbal0uTGVuZ3RoID0KKwkJCQkJCWJ5dGVzX3JlbWFpbjsKKwkJCQkJYnl0ZXNfcmVtYWluID0gMDsKIAkJCQl9IGVsc2UgewotCQkJCQluZXR2c2NQYWNrZXQtPlBhZ2VCdWZmZXJzW2pdLkxlbmd0aCA9IFBBR0VfU0laRTsKLQkJCQkJYnl0ZXNSZW1haW4gLT0gUEFHRV9TSVpFOworCQkJCQluZXR2c2NfcGFja2V0LT5wYWdlX2J1ZltqXS5MZW5ndGggPQorCQkJCQkJUEFHRV9TSVpFOworCQkJCQlieXRlc19yZW1haW4gLT0gUEFHRV9TSVpFOwogCQkJCX0KLQkJCQluZXR2c2NQYWNrZXQtPlBhZ2VCdWZmZXJzW2pdLlBmbiA9Ci0JCQkJICAgIHZpcnRfdG9fcGh5cygodm9pZCAqKShlbmRWaXJ0dWFsIC0gYnl0ZXNSZW1haW4pKSA+PiBQQUdFX1NISUZUOwotCQkJCW5ldHZzY1BhY2tldC0+UGFnZUJ1ZmZlckNvdW50Kys7Ci0JCQkJaWYgKGJ5dGVzUmVtYWluID09IDApCisJCQkJbmV0dnNjX3BhY2tldC0+cGFnZV9idWZbal0uUGZuID0KKwkJCQkgICAgdmlydF90b19waHlzKCh2b2lkICopKGVuZF92aXJ0dWFsIC0KKwkJCQkJCWJ5dGVzX3JlbWFpbikpID4+IFBBR0VfU0hJRlQ7CisJCQkJbmV0dnNjX3BhY2tldC0+cGFnZV9idWZfY250Kys7CisJCQkJaWYgKGJ5dGVzX3JlbWFpbiA9PSAwKQogCQkJCQlicmVhazsKIAkJCX0KIAkJCS8qIEFTU0VSVChieXRlc1JlbWFpbiA9PSAwKTsgKi8KIAkJfQogCQlEUFJJTlRfREJHKE5FVFZTQywgIlslZF0gLSAoYWJzIG9mZnNldCAldSBsZW4gJXUpID0+ICIKIAkJCSAgICIocGZuICVsbHgsIG9mZnNldCAldSwgbGVuICV1KSIsIGksCi0JCQkgICB2bXhmZXJwYWdlUGFja2V0LT5SYW5nZXNbaV0uQnl0ZU9mZnNldCwKLQkJCSAgIHZteGZlcnBhZ2VQYWNrZXQtPlJhbmdlc1tpXS5CeXRlQ291bnQsCi0JCQkgICBuZXR2c2NQYWNrZXQtPlBhZ2VCdWZmZXJzWzBdLlBmbiwKLQkJCSAgIG5ldHZzY1BhY2tldC0+UGFnZUJ1ZmZlcnNbMF0uT2Zmc2V0LAotCQkJICAgbmV0dnNjUGFja2V0LT5QYWdlQnVmZmVyc1swXS5MZW5ndGgpOworCQkJICAgdm14ZmVycGFnZV9wYWNrZXQtPlJhbmdlc1tpXS5CeXRlT2Zmc2V0LAorCQkJICAgdm14ZmVycGFnZV9wYWNrZXQtPlJhbmdlc1tpXS5CeXRlQ291bnQsCisJCQkgICBuZXR2c2NfcGFja2V0LT5wYWdlX2J1ZlswXS5QZm4sCisJCQkgICBuZXR2c2NfcGFja2V0LT5wYWdlX2J1ZlswXS5PZmZzZXQsCisJCQkgICBuZXR2c2NfcGFja2V0LT5wYWdlX2J1ZlswXS5MZW5ndGgpOwogCiAJCS8qIFBhc3MgaXQgdG8gdGhlIHVwcGVyIGxheWVyICovCi0JCSgoc3RydWN0IG5ldHZzY19kcml2ZXIgKilEZXZpY2UtPkRyaXZlciktPk9uUmVjZWl2ZUNhbGxiYWNrKERldmljZSwgbmV0dnNjUGFja2V0KTsKKwkJKChzdHJ1Y3QgbmV0dnNjX2RyaXZlciAqKWRldmljZS0+RHJpdmVyKS0+CisJCQlyZWN2X2NiKGRldmljZSwgbmV0dnNjX3BhY2tldCk7CiAKLQkJTmV0VnNjT25SZWNlaXZlQ29tcGxldGlvbihuZXR2c2NQYWNrZXQtPkNvbXBsZXRpb24uUmVjdi5SZWNlaXZlQ29tcGxldGlvbkNvbnRleHQpOworCQluZXR2c2NfcmVjZWl2ZV9jb21wbGV0aW9uKG5ldHZzY19wYWNrZXQtPgorCQkJCWNvbXBsZXRpb24ucmVjdi5yZWN2X2NvbXBsZXRpb25fY3R4KTsKIAl9CiAKIAkvKiBBU1NFUlQobGlzdF9lbXB0eSgmbGlzdEhlYWQpKTsgKi8KIAotCVB1dE5ldERldmljZShEZXZpY2UpOworCXB1dF9uZXRfZGV2aWNlKGRldmljZSk7CiB9CiAKLXN0YXRpYyB2b2lkIE5ldFZzY1NlbmRSZWNlaXZlQ29tcGxldGlvbihzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UsCi0JCQkJCXU2NCBUcmFuc2FjdGlvbklkKQorc3RhdGljIHZvaWQgbmV0dnNjX3NlbmRfcmVjdl9jb21wbGV0aW9uKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSwKKwkJCQkJdTY0IHRyYW5zYWN0aW9uX2lkKQogewogCXN0cnVjdCBudnNwX21lc3NhZ2UgcmVjdmNvbXBNZXNzYWdlOwogCWludCByZXRyaWVzID0gMDsKIAlpbnQgcmV0OwogCiAJRFBSSU5UX0RCRyhORVRWU0MsICJTZW5kaW5nIHJlY2VpdmUgY29tcGxldGlvbiBwa3QgLSAlbGx4IiwKLQkJICAgVHJhbnNhY3Rpb25JZCk7CisJCSAgIHRyYW5zYWN0aW9uX2lkKTsKIAotCXJlY3Zjb21wTWVzc2FnZS5IZWFkZXIuTWVzc2FnZVR5cGUgPQotCQkJCU52c3BNZXNzYWdlMVR5cGVTZW5kUk5ESVNQYWNrZXRDb21wbGV0ZTsKKwlyZWN2Y29tcE1lc3NhZ2UuaGRyLm1zZ190eXBlID0KKwkJCQlOVlNQX01TRzFfVFlQRV9TRU5EX1JORElTX1BLVF9DT01QTEVURTsKIAogCS8qIEZJWE1FOiBQYXNzIGluIHRoZSBzdGF0dXMgKi8KLQlyZWN2Y29tcE1lc3NhZ2UuTWVzc2FnZXMuVmVyc2lvbjFNZXNzYWdlcy5TZW5kUk5ESVNQYWNrZXRDb21wbGV0ZS5TdGF0dXMgPSBOdnNwU3RhdHVzU3VjY2VzczsKKwlyZWN2Y29tcE1lc3NhZ2UubXNnLnYxX21zZy5zZW5kX3JuZGlzX3BrdF9jb21wbGV0ZS5zdGF0dXMgPQorCQlOVlNQX1NUQVRfU1VDQ0VTUzsKIAogcmV0cnlfc2VuZF9jbXBsdDoKIAkvKiBTZW5kIHRoZSBjb21wbGV0aW9uICovCi0JcmV0ID0gdm1idXNfc2VuZHBhY2tldChEZXZpY2UtPmNoYW5uZWwsICZyZWN2Y29tcE1lc3NhZ2UsCi0JCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBudnNwX21lc3NhZ2UpLCBUcmFuc2FjdGlvbklkLAorCXJldCA9IHZtYnVzX3NlbmRwYWNrZXQoZGV2aWNlLT5jaGFubmVsLCAmcmVjdmNvbXBNZXNzYWdlLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgbnZzcF9tZXNzYWdlKSwgdHJhbnNhY3Rpb25faWQsCiAJCQkgICAgICAgVm1idXNQYWNrZXRUeXBlQ29tcGxldGlvbiwgMCk7CiAJaWYgKHJldCA9PSAwKSB7CiAJCS8qIHN1Y2Nlc3MgKi8KQEAgLTExNTIsNyArMTE5NSw3IEBACiAJCS8qIG5vIG1vcmUgcm9vbS4uLndhaXQgYSBiaXQgYW5kIGF0dGVtcHQgdG8gcmV0cnkgMyB0aW1lcyAqLwogCQlyZXRyaWVzKys7CiAJCURQUklOVF9FUlIoTkVUVlNDLCAidW5hYmxlIHRvIHNlbmQgcmVjZWl2ZSBjb21wbGV0aW9uIHBrdCAiCi0JCQkgICAiKHRpZCAlbGx4KS4uLnJldHJ5aW5nICVkIiwgVHJhbnNhY3Rpb25JZCwgcmV0cmllcyk7CisJCQkgICAiKHRpZCAlbGx4KS4uLnJldHJ5aW5nICVkIiwgdHJhbnNhY3Rpb25faWQsIHJldHJpZXMpOwogCiAJCWlmIChyZXRyaWVzIDwgNCkgewogCQkJdWRlbGF5KDEwMCk7CkBAIC0xMTYwLDIyICsxMjAzLDIyIEBACiAJCX0gZWxzZSB7CiAJCQlEUFJJTlRfRVJSKE5FVFZTQywgInVuYWJsZSB0byBzZW5kIHJlY2VpdmUgY29tcGxldGlvbiAiCiAJCQkJICAicGt0ICh0aWQgJWxseCkuLi5naXZlIHVwIHJldHJ5aW5nIiwKLQkJCQkgIFRyYW5zYWN0aW9uSWQpOworCQkJCSAgdHJhbnNhY3Rpb25faWQpOwogCQl9CiAJfSBlbHNlIHsKIAkJRFBSSU5UX0VSUihORVRWU0MsICJ1bmFibGUgdG8gc2VuZCByZWNlaXZlIGNvbXBsZXRpb24gcGt0IC0gIgotCQkJICAgIiVsbHgiLCBUcmFuc2FjdGlvbklkKTsKKwkJCSAgICIlbGx4IiwgdHJhbnNhY3Rpb25faWQpOwogCX0KIH0KIAogLyogU2VuZCBhIHJlY2VpdmUgY29tcGxldGlvbiBwYWNrZXQgdG8gUk5ESVMgZGV2aWNlIChpZSBOZXRWc3ApICovCi1zdGF0aWMgdm9pZCBOZXRWc2NPblJlY2VpdmVDb21wbGV0aW9uKHZvaWQgKkNvbnRleHQpCitzdGF0aWMgdm9pZCBuZXR2c2NfcmVjZWl2ZV9jb21wbGV0aW9uKHZvaWQgKmNvbnRleHQpCiB7Ci0Jc3RydWN0IGh2X25ldHZzY19wYWNrZXQgKnBhY2tldCA9IENvbnRleHQ7Ci0Jc3RydWN0IGh2X2RldmljZSAqZGV2aWNlID0gKHN0cnVjdCBodl9kZXZpY2UgKilwYWNrZXQtPkRldmljZTsKLQlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0RGV2aWNlOwotCXU2NCB0cmFuc2FjdGlvbklkID0gMDsKLQlib29sIGZTZW5kUmVjZWl2ZUNvbXAgPSBmYWxzZTsKKwlzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqcGFja2V0ID0gY29udGV4dDsKKwlzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UgPSAoc3RydWN0IGh2X2RldmljZSAqKXBhY2tldC0+ZGV2aWNlOworCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXRfZGV2aWNlOworCXU2NCB0cmFuc2FjdGlvbl9pZCA9IDA7CisJYm9vbCBmc2VuZF9yZWNlaXZlX2NvbXAgPSBmYWxzZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyogQVNTRVJUKHBhY2tldC0+WGZlclBhZ2VQYWNrZXQpOyAqLwpAQCAtMTE4NSw0OSArMTIyOCw0OSBAQAogCSAqIHNlbmQgb3V0IHJlY2VpdmUgY29tcGxldGlvbiwgd2UgYXJlIHVzaW5nIEdldEluYm91bmROZXREZXZpY2UoKQogCSAqIHNpbmNlIHdlIG1heSBoYXZlIGRpc2FibGUgb3V0Ym91bmQgdHJhZmZpYyBhbHJlYWR5LgogCSAqLwotCW5ldERldmljZSA9IEdldEluYm91bmROZXREZXZpY2UoZGV2aWNlKTsKLQlpZiAoIW5ldERldmljZSkgeworCW5ldF9kZXZpY2UgPSBnZXRfaW5ib3VuZF9uZXRfZGV2aWNlKGRldmljZSk7CisJaWYgKCFuZXRfZGV2aWNlKSB7CiAJCURQUklOVF9FUlIoTkVUVlNDLCAidW5hYmxlIHRvIGdldCBuZXQgZGV2aWNlLi4uIgogCQkJICAgImRldmljZSBiZWluZyBkZXN0cm95ZWQ/Iik7CiAJCXJldHVybjsKIAl9CiAKIAkvKiBPdmVybG9hZGluZyB1c2Ugb2YgdGhlIGxvY2suICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm5ldERldmljZS0+cmVjZWl2ZV9wYWNrZXRfbGlzdF9sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJm5ldF9kZXZpY2UtPnJlY3ZfcGt0X2xpc3RfbG9jaywgZmxhZ3MpOwogCiAJLyogQVNTRVJUKHBhY2tldC0+WGZlclBhZ2VQYWNrZXQtPkNvdW50ID4gMCk7ICovCi0JcGFja2V0LT5YZmVyUGFnZVBhY2tldC0+Q291bnQtLTsKKwlwYWNrZXQtPnhmZXJfcGFnZV9wa3QtPmNvdW50LS07CiAKIAkvKgogCSAqIExhc3Qgb25lIGluIHRoZSBsaW5lIHRoYXQgcmVwcmVzZW50IDEgeGZlciBwYWdlIHBhY2tldC4KIAkgKiBSZXR1cm4gdGhlIHhmZXIgcGFnZSBwYWNrZXQgaXRzZWxmIHRvIHRoZSBmcmVlbGlzdAogCSAqLwotCWlmIChwYWNrZXQtPlhmZXJQYWdlUGFja2V0LT5Db3VudCA9PSAwKSB7Ci0JCWZTZW5kUmVjZWl2ZUNvbXAgPSB0cnVlOwotCQl0cmFuc2FjdGlvbklkID0gcGFja2V0LT5Db21wbGV0aW9uLlJlY3YuUmVjZWl2ZUNvbXBsZXRpb25UaWQ7Ci0JCWxpc3RfYWRkX3RhaWwoJnBhY2tldC0+WGZlclBhZ2VQYWNrZXQtPkxpc3RFbnRyeSwKLQkJCSAgICAgICZuZXREZXZpY2UtPlJlY2VpdmVQYWNrZXRMaXN0KTsKKwlpZiAocGFja2V0LT54ZmVyX3BhZ2VfcGt0LT5jb3VudCA9PSAwKSB7CisJCWZzZW5kX3JlY2VpdmVfY29tcCA9IHRydWU7CisJCXRyYW5zYWN0aW9uX2lkID0gcGFja2V0LT5jb21wbGV0aW9uLnJlY3YucmVjdl9jb21wbGV0aW9uX3RpZDsKKwkJbGlzdF9hZGRfdGFpbCgmcGFja2V0LT54ZmVyX3BhZ2VfcGt0LT5saXN0X2VudCwKKwkJCSAgICAgICZuZXRfZGV2aWNlLT5yZWN2X3BrdF9saXN0KTsKIAogCX0KIAogCS8qIFB1dCB0aGUgcGFja2V0IGJhY2sgKi8KLQlsaXN0X2FkZF90YWlsKCZwYWNrZXQtPkxpc3RFbnRyeSwgJm5ldERldmljZS0+UmVjZWl2ZVBhY2tldExpc3QpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5ldERldmljZS0+cmVjZWl2ZV9wYWNrZXRfbGlzdF9sb2NrLCBmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmcGFja2V0LT5saXN0X2VudCwgJm5ldF9kZXZpY2UtPnJlY3ZfcGt0X2xpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5ldF9kZXZpY2UtPnJlY3ZfcGt0X2xpc3RfbG9jaywgZmxhZ3MpOwogCiAJLyogU2VuZCBhIHJlY2VpdmUgY29tcGxldGlvbiBmb3IgdGhlIHhmZXIgcGFnZSBwYWNrZXQgKi8KLQlpZiAoZlNlbmRSZWNlaXZlQ29tcCkKLQkJTmV0VnNjU2VuZFJlY2VpdmVDb21wbGV0aW9uKGRldmljZSwgdHJhbnNhY3Rpb25JZCk7CisJaWYgKGZzZW5kX3JlY2VpdmVfY29tcCkKKwkJbmV0dnNjX3NlbmRfcmVjdl9jb21wbGV0aW9uKGRldmljZSwgdHJhbnNhY3Rpb25faWQpOwogCi0JUHV0TmV0RGV2aWNlKGRldmljZSk7CisJcHV0X25ldF9kZXZpY2UoZGV2aWNlKTsKIH0KIAotc3RhdGljIHZvaWQgTmV0VnNjT25DaGFubmVsQ2FsbGJhY2sodm9pZCAqQ29udGV4dCkKK3N0YXRpYyB2b2lkIG5ldHZzY19jaGFubmVsX2NiKHZvaWQgKmNvbnRleHQpCiB7CiAJaW50IHJldDsKLQlzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UgPSBDb250ZXh0OwotCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXREZXZpY2U7Ci0JdTMyIGJ5dGVzUmVjdmQ7Ci0JdTY0IHJlcXVlc3RJZDsKKwlzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UgPSBjb250ZXh0OworCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXRfZGV2aWNlOworCXUzMiBieXRlc19yZWN2ZDsKKwl1NjQgcmVxdWVzdF9pZDsKIAl1bnNpZ25lZCBjaGFyICpwYWNrZXQ7CiAJc3RydWN0IHZtcGFja2V0X2Rlc2NyaXB0b3IgKmRlc2M7CiAJdW5zaWduZWQgY2hhciAqYnVmZmVyOwpAQCAtMTI0MSwzNyArMTI4NCwzNyBAQAogCQlyZXR1cm47CiAJYnVmZmVyID0gcGFja2V0OwogCi0JbmV0RGV2aWNlID0gR2V0SW5ib3VuZE5ldERldmljZShkZXZpY2UpOwotCWlmICghbmV0RGV2aWNlKSB7CisJbmV0X2RldmljZSA9IGdldF9pbmJvdW5kX25ldF9kZXZpY2UoZGV2aWNlKTsKKwlpZiAoIW5ldF9kZXZpY2UpIHsKIAkJRFBSSU5UX0VSUihORVRWU0MsICJuZXQgZGV2aWNlICglcCkgc2h1dHRpbmcgZG93bi4uLiIKLQkJCSAgICJpZ25vcmluZyBpbmJvdW5kIHBhY2tldHMiLCBuZXREZXZpY2UpOworCQkJICAgImlnbm9yaW5nIGluYm91bmQgcGFja2V0cyIsIG5ldF9kZXZpY2UpOwogCQlnb3RvIG91dDsKIAl9CiAKIAlkbyB7CiAJCXJldCA9IHZtYnVzX3JlY3ZwYWNrZXRfcmF3KGRldmljZS0+Y2hhbm5lbCwgYnVmZmVyLCBidWZmZXJsZW4sCi0JCQkJCSAgICZieXRlc1JlY3ZkLCAmcmVxdWVzdElkKTsKKwkJCQkJICAgJmJ5dGVzX3JlY3ZkLCAmcmVxdWVzdF9pZCk7CiAJCWlmIChyZXQgPT0gMCkgewotCQkJaWYgKGJ5dGVzUmVjdmQgPiAwKSB7CisJCQlpZiAoYnl0ZXNfcmVjdmQgPiAwKSB7CiAJCQkJRFBSSU5UX0RCRyhORVRWU0MsICJyZWNlaXZlICVkIGJ5dGVzLCB0aWQgJWxseCIsCi0JCQkJCSAgIGJ5dGVzUmVjdmQsIHJlcXVlc3RJZCk7CisJCQkJCSAgIGJ5dGVzX3JlY3ZkLCByZXF1ZXN0X2lkKTsKIAogCQkJCWRlc2MgPSAoc3RydWN0IHZtcGFja2V0X2Rlc2NyaXB0b3IgKilidWZmZXI7CiAJCQkJc3dpdGNoIChkZXNjLT5UeXBlKSB7CiAJCQkJY2FzZSBWbWJ1c1BhY2tldFR5cGVDb21wbGV0aW9uOgotCQkJCQlOZXRWc2NPblNlbmRDb21wbGV0aW9uKGRldmljZSwgZGVzYyk7CisJCQkJCW5ldHZzY19zZW5kX2NvbXBsZXRpb24oZGV2aWNlLCBkZXNjKTsKIAkJCQkJYnJlYWs7CiAKIAkJCQljYXNlIFZtYnVzUGFja2V0VHlwZURhdGFVc2luZ1RyYW5zZmVyUGFnZXM6Ci0JCQkJCU5ldFZzY09uUmVjZWl2ZShkZXZpY2UsIGRlc2MpOworCQkJCQluZXR2c2NfcmVjZWl2ZShkZXZpY2UsIGRlc2MpOwogCQkJCQlicmVhazsKIAogCQkJCWRlZmF1bHQ6CiAJCQkJCURQUklOVF9FUlIoTkVUVlNDLAogCQkJCQkJICAgInVuaGFuZGxlZCBwYWNrZXQgdHlwZSAlZCwgIgogCQkJCQkJICAgInRpZCAlbGx4IGxlbiAlZFxuIiwKLQkJCQkJCSAgIGRlc2MtPlR5cGUsIHJlcXVlc3RJZCwKLQkJCQkJCSAgIGJ5dGVzUmVjdmQpOworCQkJCQkJICAgZGVzYy0+VHlwZSwgcmVxdWVzdF9pZCwKKwkJCQkJCSAgIGJ5dGVzX3JlY3ZkKTsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCkBAIC0xMjkzLDIwICsxMzM2LDIwIEBACiAJCQl9CiAJCX0gZWxzZSBpZiAocmV0ID09IC0yKSB7CiAJCQkvKiBIYW5kbGUgbGFyZ2UgcGFja2V0ICovCi0JCQlidWZmZXIgPSBrbWFsbG9jKGJ5dGVzUmVjdmQsIEdGUF9BVE9NSUMpOworCQkJYnVmZmVyID0ga21hbGxvYyhieXRlc19yZWN2ZCwgR0ZQX0FUT01JQyk7CiAJCQlpZiAoYnVmZmVyID09IE5VTEwpIHsKIAkJCQkvKiBUcnkgYWdhaW4gbmV4dCB0aW1lIGFyb3VuZCAqLwogCQkJCURQUklOVF9FUlIoTkVUVlNDLAogCQkJCQkgICAidW5hYmxlIHRvIGFsbG9jYXRlIGJ1ZmZlciBvZiBzaXplICIKLQkJCQkJICAgIiglZCkhISIsIGJ5dGVzUmVjdmQpOworCQkJCQkgICAiKCVkKSEhIiwgYnl0ZXNfcmVjdmQpOwogCQkJCWJyZWFrOwogCQkJfQogCi0JCQlidWZmZXJsZW4gPSBieXRlc1JlY3ZkOworCQkJYnVmZmVybGVuID0gYnl0ZXNfcmVjdmQ7CiAJCX0KIAl9IHdoaWxlICgxKTsKIAotCVB1dE5ldERldmljZShkZXZpY2UpOworCXB1dF9uZXRfZGV2aWNlKGRldmljZSk7CiBvdXQ6CiAJa2ZyZWUoYnVmZmVyKTsKIAlyZXR1cm47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvbmV0dnNjLmggYi9kcml2ZXJzL3N0YWdpbmcvaHYvbmV0dnNjLmgKaW5kZXggYzcxZGNlNS4uOTMyYTc3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L25ldHZzYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi9uZXR2c2MuaApAQCAtMzgsNDggKzM4LDQ4IEBACiAjZGVmaW5lIE5WU1BfTUFYX1BST1RPQ09MX1ZFUlNJT04JTlZTUF9QUk9UT0NPTF9WRVJTSU9OXzEKIAogZW51bSB7Ci0JTnZzcE1lc3NhZ2VUeXBlTm9uZSA9IDAsCisJTlZTUF9NU0dfVFlQRV9OT05FID0gMCwKIAogCS8qIEluaXQgTWVzc2FnZXMgKi8KLQlOdnNwTWVzc2FnZVR5cGVJbml0CQkJPSAxLAotCU52c3BNZXNzYWdlVHlwZUluaXRDb21wbGV0ZQkJPSAyLAorCU5WU1BfTVNHX1RZUEVfSU5JVAkJCT0gMSwKKwlOVlNQX01TR19UWVBFX0lOSVRfQ09NUExFVEUJCT0gMiwKIAotCU52c3BWZXJzaW9uTWVzc2FnZVN0YXJ0CQkJPSAxMDAsCisJTlZTUF9WRVJTSU9OX01TR19TVEFSVAkJCT0gMTAwLAogCiAJLyogVmVyc2lvbiAxIE1lc3NhZ2VzICovCi0JTnZzcE1lc3NhZ2UxVHlwZVNlbmROZGlzVmVyc2lvbgkJPSBOdnNwVmVyc2lvbk1lc3NhZ2VTdGFydCwKKwlOVlNQX01TRzFfVFlQRV9TRU5EX05ESVNfVkVSCQk9IE5WU1BfVkVSU0lPTl9NU0dfU1RBUlQsCiAKLQlOdnNwTWVzc2FnZTFUeXBlU2VuZFJlY2VpdmVCdWZmZXIsCi0JTnZzcE1lc3NhZ2UxVHlwZVNlbmRSZWNlaXZlQnVmZmVyQ29tcGxldGUsCi0JTnZzcE1lc3NhZ2UxVHlwZVJldm9rZVJlY2VpdmVCdWZmZXIsCisJTlZTUF9NU0cxX1RZUEVfU0VORF9SRUNWX0JVRiwKKwlOVlNQX01TRzFfVFlQRV9TRU5EX1JFQ1ZfQlVGX0NPTVBMRVRFLAorCU5WU1BfTVNHMV9UWVBFX1JFVk9LRV9SRUNWX0JVRiwKIAotCU52c3BNZXNzYWdlMVR5cGVTZW5kU2VuZEJ1ZmZlciwKLQlOdnNwTWVzc2FnZTFUeXBlU2VuZFNlbmRCdWZmZXJDb21wbGV0ZSwKLQlOdnNwTWVzc2FnZTFUeXBlUmV2b2tlU2VuZEJ1ZmZlciwKKwlOVlNQX01TRzFfVFlQRV9TRU5EX1NFTkRfQlVGLAorCU5WU1BfTVNHMV9UWVBFX1NFTkRfU0VORF9CVUZfQ09NUExFVEUsCisJTlZTUF9NU0cxX1RZUEVfUkVWT0tFX1NFTkRfQlVGLAogCi0JTnZzcE1lc3NhZ2UxVHlwZVNlbmRSTkRJU1BhY2tldCwKLQlOdnNwTWVzc2FnZTFUeXBlU2VuZFJORElTUGFja2V0Q29tcGxldGUsCisJTlZTUF9NU0cxX1RZUEVfU0VORF9STkRJU19QS1QsCisJTlZTUF9NU0cxX1RZUEVfU0VORF9STkRJU19QS1RfQ09NUExFVEUsCiAKIAkvKgogCSAqIFRoaXMgc2hvdWxkIGJlIHNldCB0byB0aGUgbnVtYmVyIG9mIG1lc3NhZ2VzIGZvciB0aGUgdmVyc2lvbiB3aXRoCiAJICogdGhlIG1heGltdW0gbnVtYmVyIG9mIG1lc3NhZ2VzLgogCSAqLwotCU52c3BOdW1NZXNzYWdlUGVyVmVyc2lvbgkJPSA5LAorCU5WU1BfTlVNX01TR19QRVJfVkVSU0lPTgkJPSA5LAogfTsKIAogZW51bSB7Ci0JTnZzcFN0YXR1c05vbmUgPSAwLAotCU52c3BTdGF0dXNTdWNjZXNzLAotCU52c3BTdGF0dXNGYWlsdXJlLAotCU52c3BTdGF0dXNQcm90b2NvbFZlcnNpb25SYW5nZVRvb05ldywKLQlOdnNwU3RhdHVzUHJvdG9jb2xWZXJzaW9uUmFuZ2VUb29PbGQsCi0JTnZzcFN0YXR1c0ludmFsaWRSbmRpc1BhY2tldCwKLQlOdnNwU3RhdHVzQnVzeSwKLQlOdnNwU3RhdHVzTWF4LAorCU5WU1BfU1RBVF9OT05FID0gMCwKKwlOVlNQX1NUQVRfU1VDQ0VTUywKKwlOVlNQX1NUQVRfRkFJTCwKKwlOVlNQX1NUQVRfUFJPVE9DT0xfVE9PX05FVywKKwlOVlNQX1NUQVRfUFJPVE9DT0xfVE9PX09MRCwKKwlOVlNQX1NUQVRfSU5WQUxJRF9STkRJU19QS1QsCisJTlZTUF9TVEFUX0JVU1ksCisJTlZTUF9TVEFUX01BWCwKIH07CiAKIHN0cnVjdCBudnNwX21lc3NhZ2VfaGVhZGVyIHsKLQl1MzIgTWVzc2FnZVR5cGU7CisJdTMyIG1zZ190eXBlOwogfTsKIAogLyogSW5pdCBNZXNzYWdlcyAqLwpAQCAtOTAsOCArOTAsOCBAQAogICogdmVyc2lvbmluZyAoaS5lLiB0aGlzIG1lc3NhZ2Ugd2lsbCBiZSB0aGUgc2FtZSBmb3IgZXZlcikuCiAgKi8KIHN0cnVjdCBudnNwX21lc3NhZ2VfaW5pdCB7Ci0JdTMyIE1pblByb3RvY29sVmVyc2lvbjsKLQl1MzIgTWF4UHJvdG9jb2xWZXJzaW9uOworCXUzMiBtaW5fcHJvdG9jb2xfdmVyOworCXUzMiBtYXhfcHJvdG9jb2xfdmVyOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyoKQEAgLTEwMCwxNCArMTAwLDE0IEBACiAgKiAoaS5lLiB0aGlzIG1lc3NhZ2Ugd2lsbCBiZSB0aGUgc2FtZSBmb3IgZXZlcikuCiAgKi8KIHN0cnVjdCBudnNwX21lc3NhZ2VfaW5pdF9jb21wbGV0ZSB7Ci0JdTMyIE5lZ290aWF0ZWRQcm90b2NvbFZlcnNpb247Ci0JdTMyIE1heGltdW1NZGxDaGFpbkxlbmd0aDsKLQl1MzIgU3RhdHVzOworCXUzMiBuZWdvdGlhdGVkX3Byb3RvY29sX3ZlcjsKKwl1MzIgbWF4X21kbF9jaGFpbl9sZW47CisJdTMyIHN0YXR1czsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHVuaW9uIG52c3BfbWVzc2FnZV9pbml0X3ViZXIgewotCXN0cnVjdCBudnNwX21lc3NhZ2VfaW5pdCBJbml0OwotCXN0cnVjdCBudnNwX21lc3NhZ2VfaW5pdF9jb21wbGV0ZSBJbml0Q29tcGxldGU7CisJc3RydWN0IG52c3BfbWVzc2FnZV9pbml0IGluaXQ7CisJc3RydWN0IG52c3BfbWVzc2FnZV9pbml0X2NvbXBsZXRlIGluaXRfY29tcGxldGU7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKiBWZXJzaW9uIDEgTWVzc2FnZXMgKi8KQEAgLTExNyw4ICsxMTcsOCBAQAogICogY2FuIHVzZSB0aGlzIGluZm9ybWF0aW9uIHdoZW4gaGFuZGxpbmcgT0lEcyBzZW50IGJ5IHRoZSBWU0MuCiAgKi8KIHN0cnVjdCBudnNwXzFfbWVzc2FnZV9zZW5kX25kaXNfdmVyc2lvbiB7Ci0JdTMyIE5kaXNNYWpvclZlcnNpb247Ci0JdTMyIE5kaXNNaW5vclZlcnNpb247CisJdTMyIG5kaXNfbWFqb3JfdmVyOworCXUzMiBuZGlzX21pbm9yX3ZlcjsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8qCkBAIC0xMjYsMTUgKzEyNiwxNSBAQAogICogY2FuIHRoZW4gdXNlIHRoZSByZWNlaXZlIGJ1ZmZlciB0byBzZW5kIGRhdGEgdG8gdGhlIFZTQy4KICAqLwogc3RydWN0IG52c3BfMV9tZXNzYWdlX3NlbmRfcmVjZWl2ZV9idWZmZXIgewotCXUzMiBHcGFkbEhhbmRsZTsKLQl1MTYgSWQ7CisJdTMyIGdwYWRsX2hhbmRsZTsKKwl1MTYgaWQ7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3QgbnZzcF8xX3JlY2VpdmVfYnVmZmVyX3NlY3Rpb24gewotCXUzMiBPZmZzZXQ7Ci0JdTMyIFN1YkFsbG9jYXRpb25TaXplOwotCXUzMiBOdW1TdWJBbGxvY2F0aW9uczsKLQl1MzIgRW5kT2Zmc2V0OworCXUzMiBvZmZzZXQ7CisJdTMyIHN1Yl9hbGxvY19zaXplOworCXUzMiBudW1fc3ViX2FsbG9jczsKKwl1MzIgZW5kX29mZnNldDsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8qCkBAIC0xNDMsOCArMTQzLDggQEAKICAqIGJ1ZmZlci4KICAqLwogc3RydWN0IG52c3BfMV9tZXNzYWdlX3NlbmRfcmVjZWl2ZV9idWZmZXJfY29tcGxldGUgewotCXUzMiBTdGF0dXM7Ci0JdTMyIE51bVNlY3Rpb25zOworCXUzMiBzdGF0dXM7CisJdTMyIG51bV9zZWN0aW9uczsKIAogCS8qCiAJICogVGhlIHJlY2VpdmUgYnVmZmVyIGlzIHNwbGl0IGludG8gdHdvIHBhcnRzLCBhIGxhcmdlIHN1YmFsbG9jYXRpb24KQEAgLTE2NSw3ICsxNjUsNyBAQAogCSAqICBMYXJnZU9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbE9mZnNldAogCSAqLwogCi0Jc3RydWN0IG52c3BfMV9yZWNlaXZlX2J1ZmZlcl9zZWN0aW9uIFNlY3Rpb25zWzFdOworCXN0cnVjdCBudnNwXzFfcmVjZWl2ZV9idWZmZXJfc2VjdGlvbiBzZWN0aW9uc1sxXTsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8qCkBAIC0xNzQsNyArMTc0LDcgQEAKICAqIGFnYWluLgogICovCiBzdHJ1Y3QgbnZzcF8xX21lc3NhZ2VfcmV2b2tlX3JlY2VpdmVfYnVmZmVyIHsKLQl1MTYgSWQ7CisJdTE2IGlkOwogfTsKIAogLyoKQEAgLTE4Miw4ICsxODIsOCBAQAogICogY2FuIHRoZW4gdXNlIHRoZSBzZW5kIGJ1ZmZlciB0byBzZW5kIGRhdGEgdG8gdGhlIFZTUC4KICAqLwogc3RydWN0IG52c3BfMV9tZXNzYWdlX3NlbmRfc2VuZF9idWZmZXIgewotCXUzMiBHcGFkbEhhbmRsZTsKLQl1MTYgSWQ7CisJdTMyIGdwYWRsX2hhbmRsZTsKKwl1MTYgaWQ7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKgpAQCAtMTkyLDcgKzE5Miw3IEBACiAgKiBidWZmZXIuCiAgKi8KIHN0cnVjdCBudnNwXzFfbWVzc2FnZV9zZW5kX3NlbmRfYnVmZmVyX2NvbXBsZXRlIHsKLQl1MzIgU3RhdHVzOworCXUzMiBzdGF0dXM7CiAKIAkvKgogCSAqIFRoZSBWU0MgZ2V0cyB0byBjaG9vc2UgdGhlIHNpemUgb2YgdGhlIHNlbmQgYnVmZmVyIGFuZCB0aGUgVlNQIGdldHMKQEAgLTIwMCw3ICsyMDAsNyBAQAogCSAqIGR5bmFtaWMgcmVjb25maWd1cmF0aW9ucyB3aGVuIHRoZSBjb3N0IG9mIEdQQS1kaXJlY3QgYnVmZmVycwogCSAqIGRlY3JlYXNlcy4KIAkgKi8KLQl1MzIgU2VjdGlvblNpemU7CisJdTMyIHNlY3Rpb25fc2l6ZTsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8qCkBAIC0yMDgsNyArMjA4LDcgQEAKICAqIGNvbXBsZXRlcyB0aGlzIHRyYW5zYWN0aW9uLCB0aGUgdnNwIHNob3VsZCBuZXZlciB1c2UgdGhlIHNlbmQgYnVmZmVyIGFnYWluLgogICovCiBzdHJ1Y3QgbnZzcF8xX21lc3NhZ2VfcmV2b2tlX3NlbmRfYnVmZmVyIHsKLQl1MTYgSWQ7CisJdTE2IGlkOwogfTsKIAogLyoKQEAgLTIyMSw3ICsyMjEsNyBAQAogCSAqIGNoYW5uZWxzIG9mIGNvbW11bmljYXRpb24uIEhvd2V2ZXIsIHRoZSBOZXR3b3JrIFZTUCBvbmx5IGhhcyBvbmUuCiAJICogVGhlcmVmb3JlLCB0aGUgY2hhbm5lbCB0cmF2ZWxzIHdpdGggdGhlIFJORElTIHBhY2tldC4KIAkgKi8KLQl1MzIgQ2hhbm5lbFR5cGU7CisJdTMyIGNoYW5uZWxfdHlwZTsKIAogCS8qCiAJICogVGhpcyBmaWVsZCBpcyB1c2VkIHRvIHNlbmQgcGFydCBvciBhbGwgb2YgdGhlIGRhdGEgdGhyb3VnaCBhIHNlbmQKQEAgLTIyOSw4ICsyMjksOCBAQAogCSAqIGluZGV4IGlzIDB4RkZGRkZGRkYsIHRoZW4gdGhlIHNlbmQgYnVmZmVyIGlzIG5vdCBiZWluZyB1c2VkIGFuZCBhbGwKIAkgKiBvZiB0aGUgZGF0YSB3YXMgc2VudCB0aHJvdWdoIG90aGVyIFZNQnVzIG1lY2hhbmlzbXMuCiAJICovCi0JdTMyIFNlbmRCdWZmZXJTZWN0aW9uSW5kZXg7Ci0JdTMyIFNlbmRCdWZmZXJTZWN0aW9uU2l6ZTsKKwl1MzIgc2VuZF9idWZfc2VjdGlvbl9pbmRleDsKKwl1MzIgc2VuZF9idWZfc2VjdGlvbl9zaXplOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyoKQEAgLTIzOSwzNSArMjM5LDM1IEBACiAgKiBtZXNzYWdlIGNhbm5vdCB1c2UgYW55IHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmFsIFJORElTIHBhY2tldC4KICAqLwogc3RydWN0IG52c3BfMV9tZXNzYWdlX3NlbmRfcm5kaXNfcGFja2V0X2NvbXBsZXRlIHsKLQl1MzIgU3RhdHVzOworCXUzMiBzdGF0dXM7CiB9OwogCiB1bmlvbiBudnNwXzFfbWVzc2FnZV91YmVyIHsKLQlzdHJ1Y3QgbnZzcF8xX21lc3NhZ2Vfc2VuZF9uZGlzX3ZlcnNpb24gU2VuZE5kaXNWZXJzaW9uOworCXN0cnVjdCBudnNwXzFfbWVzc2FnZV9zZW5kX25kaXNfdmVyc2lvbiBzZW5kX25kaXNfdmVyOwogCi0Jc3RydWN0IG52c3BfMV9tZXNzYWdlX3NlbmRfcmVjZWl2ZV9idWZmZXIgU2VuZFJlY2VpdmVCdWZmZXI7CisJc3RydWN0IG52c3BfMV9tZXNzYWdlX3NlbmRfcmVjZWl2ZV9idWZmZXIgc2VuZF9yZWN2X2J1ZjsKIAlzdHJ1Y3QgbnZzcF8xX21lc3NhZ2Vfc2VuZF9yZWNlaXZlX2J1ZmZlcl9jb21wbGV0ZQotCQkJCQkJU2VuZFJlY2VpdmVCdWZmZXJDb21wbGV0ZTsKLQlzdHJ1Y3QgbnZzcF8xX21lc3NhZ2VfcmV2b2tlX3JlY2VpdmVfYnVmZmVyIFJldm9rZVJlY2VpdmVCdWZmZXI7CisJCQkJCQlzZW5kX3JlY3ZfYnVmX2NvbXBsZXRlOworCXN0cnVjdCBudnNwXzFfbWVzc2FnZV9yZXZva2VfcmVjZWl2ZV9idWZmZXIgcmV2b2tlX3JlY3ZfYnVmOwogCi0Jc3RydWN0IG52c3BfMV9tZXNzYWdlX3NlbmRfc2VuZF9idWZmZXIgU2VuZFNlbmRCdWZmZXI7Ci0Jc3RydWN0IG52c3BfMV9tZXNzYWdlX3NlbmRfc2VuZF9idWZmZXJfY29tcGxldGUgU2VuZFNlbmRCdWZmZXJDb21wbGV0ZTsKLQlzdHJ1Y3QgbnZzcF8xX21lc3NhZ2VfcmV2b2tlX3NlbmRfYnVmZmVyIFJldm9rZVNlbmRCdWZmZXI7CisJc3RydWN0IG52c3BfMV9tZXNzYWdlX3NlbmRfc2VuZF9idWZmZXIgc2VuZF9zZW5kX2J1ZjsKKwlzdHJ1Y3QgbnZzcF8xX21lc3NhZ2Vfc2VuZF9zZW5kX2J1ZmZlcl9jb21wbGV0ZSBzZW5kX3NlbmRfYnVmX2NvbXBsZXRlOworCXN0cnVjdCBudnNwXzFfbWVzc2FnZV9yZXZva2Vfc2VuZF9idWZmZXIgcmV2b2tlX3NlbmRfYnVmOwogCi0Jc3RydWN0IG52c3BfMV9tZXNzYWdlX3NlbmRfcm5kaXNfcGFja2V0IFNlbmRSTkRJU1BhY2tldDsKKwlzdHJ1Y3QgbnZzcF8xX21lc3NhZ2Vfc2VuZF9ybmRpc19wYWNrZXQgc2VuZF9ybmRpc19wa3Q7CiAJc3RydWN0IG52c3BfMV9tZXNzYWdlX3NlbmRfcm5kaXNfcGFja2V0X2NvbXBsZXRlCi0JCQkJCQlTZW5kUk5ESVNQYWNrZXRDb21wbGV0ZTsKKwkJCQkJCXNlbmRfcm5kaXNfcGt0X2NvbXBsZXRlOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogdW5pb24gbnZzcF9hbGxfbWVzc2FnZXMgewotCXVuaW9uIG52c3BfbWVzc2FnZV9pbml0X3ViZXIgSW5pdE1lc3NhZ2VzOwotCXVuaW9uIG52c3BfMV9tZXNzYWdlX3ViZXIgVmVyc2lvbjFNZXNzYWdlczsKKwl1bmlvbiBudnNwX21lc3NhZ2VfaW5pdF91YmVyIGluaXRfbXNnOworCXVuaW9uIG52c3BfMV9tZXNzYWdlX3ViZXIgdjFfbXNnOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyogQUxMIE1lc3NhZ2VzICovCiBzdHJ1Y3QgbnZzcF9tZXNzYWdlIHsKLQlzdHJ1Y3QgbnZzcF9tZXNzYWdlX2hlYWRlciBIZWFkZXI7Ci0JdW5pb24gbnZzcF9hbGxfbWVzc2FnZXMgTWVzc2FnZXM7CisJc3RydWN0IG52c3BfbWVzc2FnZV9oZWFkZXIgaGRyOworCXVuaW9uIG52c3BfYWxsX21lc3NhZ2VzIG1zZzsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIApAQCAtMjkzLDM5ICsyOTMsMzkgQEAKIAogLyogUGVyIG5ldHZzYyBjaGFubmVsLXNwZWNpZmljICovCiBzdHJ1Y3QgbmV0dnNjX2RldmljZSB7Ci0Jc3RydWN0IGh2X2RldmljZSAqRGV2aWNlOworCXN0cnVjdCBodl9kZXZpY2UgKmRldjsKIAotCWF0b21pY190IFJlZkNvdW50OwotCWF0b21pY190IE51bU91dHN0YW5kaW5nU2VuZHM7CisJYXRvbWljX3QgcmVmY250OworCWF0b21pY190IG51bV9vdXRzdGFuZGluZ19zZW5kczsKIAkvKgogCSAqIExpc3Qgb2YgZnJlZSBwcmVhbGxvY2F0ZWQgaHZfbmV0dnNjX3BhY2tldCB0byByZXByZXNlbnQgcmVjZWl2ZQogCSAqIHBhY2tldAogCSAqLwotCXN0cnVjdCBsaXN0X2hlYWQgUmVjZWl2ZVBhY2tldExpc3Q7Ci0Jc3BpbmxvY2tfdCByZWNlaXZlX3BhY2tldF9saXN0X2xvY2s7CisJc3RydWN0IGxpc3RfaGVhZCByZWN2X3BrdF9saXN0OworCXNwaW5sb2NrX3QgcmVjdl9wa3RfbGlzdF9sb2NrOwogCiAJLyogU2VuZCBidWZmZXIgYWxsb2NhdGVkIGJ5IHVzIGJ1dCBtYW5hZ2VzIGJ5IE5ldFZTUCAqLwotCXZvaWQgKlNlbmRCdWZmZXI7Ci0JdTMyIFNlbmRCdWZmZXJTaXplOwotCXUzMiBTZW5kQnVmZmVyR3BhZGxIYW5kbGU7Ci0JdTMyIFNlbmRTZWN0aW9uU2l6ZTsKKwl2b2lkICpzZW5kX2J1ZjsKKwl1MzIgc2VuZF9idWZfc2l6ZTsKKwl1MzIgc2VuZF9idWZfZ3BhZGxfaGFuZGxlOworCXUzMiBzZW5kX3NlY3Rpb25fc2l6ZTsKIAogCS8qIFJlY2VpdmUgYnVmZmVyIGFsbG9jYXRlZCBieSB1cyBidXQgbWFuYWdlcyBieSBOZXRWU1AgKi8KLQl2b2lkICpSZWNlaXZlQnVmZmVyOwotCXUzMiBSZWNlaXZlQnVmZmVyU2l6ZTsKLQl1MzIgUmVjZWl2ZUJ1ZmZlckdwYWRsSGFuZGxlOwotCXUzMiBSZWNlaXZlU2VjdGlvbkNvdW50OwotCXN0cnVjdCBudnNwXzFfcmVjZWl2ZV9idWZmZXJfc2VjdGlvbiAqUmVjZWl2ZVNlY3Rpb25zOworCXZvaWQgKnJlY3ZfYnVmOworCXUzMiByZWN2X2J1Zl9zaXplOworCXUzMiByZWN2X2J1Zl9ncGFkbF9oYW5kbGU7CisJdTMyIHJlY3Zfc2VjdGlvbl9jbnQ7CisJc3RydWN0IG52c3BfMV9yZWNlaXZlX2J1ZmZlcl9zZWN0aW9uICpyZWN2X3NlY3Rpb247CiAKIAkvKiBVc2VkIGZvciBOZXRWU1AgaW5pdGlhbGl6YXRpb24gcHJvdG9jb2wgKi8KLQlzdHJ1Y3Qgb3NkX3dhaXRldmVudCAqQ2hhbm5lbEluaXRFdmVudDsKLQlzdHJ1Y3QgbnZzcF9tZXNzYWdlIENoYW5uZWxJbml0UGFja2V0OworCXN0cnVjdCBvc2Rfd2FpdGV2ZW50ICpjaGFubmVsX2luaXRfZXZlbnQ7CisJc3RydWN0IG52c3BfbWVzc2FnZSBjaGFubmVsX2luaXRfcGt0OwogCi0Jc3RydWN0IG52c3BfbWVzc2FnZSBSZXZva2VQYWNrZXQ7CisJc3RydWN0IG52c3BfbWVzc2FnZSByZXZva2VfcGFja2V0OwogCS8qIHVuc2lnbmVkIGNoYXIgSHdNYWNBZGRyW0hXX01BQ0FERFJfTEVOXTsgKi8KIAogCS8qIEhvbGRzIHJuZGlzIGRldmljZSBpbmZvICovCi0Jdm9pZCAqRXh0ZW5zaW9uOworCXZvaWQgKmV4dGVuc2lvbjsKIH07CiAKICNlbmRpZiAvKiBfTkVUVlNDX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvbmV0dnNjX2FwaS5oIGIvZHJpdmVycy9zdGFnaW5nL2h2L25ldHZzY19hcGkuaAppbmRleCA0YjViM2FjLi5iNGJlZDM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvbmV0dnNjX2FwaS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi9uZXR2c2NfYXBpLmgKQEAgLTMyLDEwICszMiwxMCBAQAogCiAvKiBSZXByZXNlbnQgdGhlIHhmZXIgcGFnZSBwYWNrZXQgd2hpY2ggY29udGFpbnMgMSBvciBtb3JlIG5ldHZzYyBwYWNrZXQgKi8KIHN0cnVjdCB4ZmVycGFnZV9wYWNrZXQgewotCXN0cnVjdCBsaXN0X2hlYWQgTGlzdEVudHJ5OworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdF9lbnQ7CiAKIAkvKiAjIG9mIG5ldHZzYyBwYWNrZXRzIHRoaXMgeGZlciBwYWNrZXQgY29udGFpbnMgKi8KLQl1MzIgQ291bnQ7CisJdTMyIGNvdW50OwogfTsKIAogLyogVGhlIG51bWJlciBvZiBwYWdlcyB3aGljaCBhcmUgZW5vdWdoIHRvIGNvdmVyIGp1bWJvIGZyYW1lIGJ1ZmZlci4gKi8KQEAgLTQ3LDcwICs0Nyw3MCBAQAogICovCiBzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCB7CiAJLyogQm9va2tlZXBpbmcgc3R1ZmYgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIExpc3RFbnRyeTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3RfZW50OwogCi0Jc3RydWN0IGh2X2RldmljZSAqRGV2aWNlOwotCWJvb2wgSXNEYXRhUGFja2V0OworCXN0cnVjdCBodl9kZXZpY2UgKmRldmljZTsKKwlib29sIGlzX2RhdGFfcGt0OwogCiAJLyoKIAkgKiBWYWxpZCBvbmx5IGZvciByZWNlaXZlcyB3aGVuIHdlIGJyZWFrIGEgeGZlciBwYWdlIHBhY2tldAogCSAqIGludG8gbXVsdGlwbGUgbmV0dnNjIHBhY2tldHMKIAkgKi8KLQlzdHJ1Y3QgeGZlcnBhZ2VfcGFja2V0ICpYZmVyUGFnZVBhY2tldDsKKwlzdHJ1Y3QgeGZlcnBhZ2VfcGFja2V0ICp4ZmVyX3BhZ2VfcGt0OwogCiAJdW5pb24gewogCQlzdHJ1Y3R7Ci0JCQl1NjQgUmVjZWl2ZUNvbXBsZXRpb25UaWQ7Ci0JCQl2b2lkICpSZWNlaXZlQ29tcGxldGlvbkNvbnRleHQ7Ci0JCQl2b2lkICgqT25SZWNlaXZlQ29tcGxldGlvbikodm9pZCAqY29udGV4dCk7Ci0JCX0gUmVjdjsKKwkJCXU2NCByZWN2X2NvbXBsZXRpb25fdGlkOworCQkJdm9pZCAqcmVjdl9jb21wbGV0aW9uX2N0eDsKKwkJCXZvaWQgKCpyZWN2X2NvbXBsZXRpb24pKHZvaWQgKmNvbnRleHQpOworCQl9IHJlY3Y7CiAJCXN0cnVjdHsKLQkJCXU2NCBTZW5kQ29tcGxldGlvblRpZDsKLQkJCXZvaWQgKlNlbmRDb21wbGV0aW9uQ29udGV4dDsKLQkJCXZvaWQgKCpPblNlbmRDb21wbGV0aW9uKSh2b2lkICpjb250ZXh0KTsKLQkJfSBTZW5kOwotCX0gQ29tcGxldGlvbjsKKwkJCXU2NCBzZW5kX2NvbXBsZXRpb25fdGlkOworCQkJdm9pZCAqc2VuZF9jb21wbGV0aW9uX2N0eDsKKwkJCXZvaWQgKCpzZW5kX2NvbXBsZXRpb24pKHZvaWQgKmNvbnRleHQpOworCQl9IHNlbmQ7CisJfSBjb21wbGV0aW9uOwogCi0JLyogVGhpcyBwb2ludHMgdG8gdGhlIG1lbW9yeSBhZnRlciBQYWdlQnVmZmVycyAqLwotCXZvaWQgKkV4dGVuc2lvbjsKKwkvKiBUaGlzIHBvaW50cyB0byB0aGUgbWVtb3J5IGFmdGVyIHBhZ2VfYnVmICovCisJdm9pZCAqZXh0ZW5zaW9uOwogCi0JdTMyIFRvdGFsRGF0YUJ1ZmZlckxlbmd0aDsKKwl1MzIgdG90YWxfZGF0YV9idWZsZW47CiAJLyogUG9pbnRzIHRvIHRoZSBzZW5kL3JlY2VpdmUgYnVmZmVyIHdoZXJlIHRoZSBldGhlcm5ldCBmcmFtZSBpcyAqLwotCXUzMiBQYWdlQnVmZmVyQ291bnQ7Ci0Jc3RydWN0IGh2X3BhZ2VfYnVmZmVyIFBhZ2VCdWZmZXJzW05FVFZTQ19QQUNLRVRfTUFYUEFHRV07CisJdTMyIHBhZ2VfYnVmX2NudDsKKwlzdHJ1Y3QgaHZfcGFnZV9idWZmZXIgcGFnZV9idWZbTkVUVlNDX1BBQ0tFVF9NQVhQQUdFXTsKIH07CiAKIC8qIFJlcHJlc2VudHMgdGhlIG5ldCB2c2MgZHJpdmVyICovCiBzdHJ1Y3QgbmV0dnNjX2RyaXZlciB7CiAJLyogTXVzdCBiZSB0aGUgZmlyc3QgZmllbGQgKi8KIAkvKiBXaGljaCBpcyBhIGJ1ZyBGSVhNRSEgKi8KLQlzdHJ1Y3QgaHZfZHJpdmVyIEJhc2U7CisJc3RydWN0IGh2X2RyaXZlciBiYXNlOwogCi0JdTMyIFJpbmdCdWZmZXJTaXplOwotCXUzMiBSZXF1ZXN0RXh0U2l6ZTsKKwl1MzIgcmluZ19idWZfc2l6ZTsKKwl1MzIgcmVxX2V4dF9zaXplOwogCiAJLyoKIAkgKiBUaGlzIGlzIHNldCBieSB0aGUgY2FsbGVyIHRvIGFsbG93IHVzIHRvIGNhbGxiYWNrIHdoZW4gd2UKIAkgKiByZWNlaXZlIGEgcGFja2V0IGZyb20gdGhlICJ3aXJlIgogCSAqLwotCWludCAoKk9uUmVjZWl2ZUNhbGxiYWNrKShzdHJ1Y3QgaHZfZGV2aWNlICpkZXYsCisJaW50ICgqcmVjdl9jYikoc3RydWN0IGh2X2RldmljZSAqZGV2LAogCQkJCSBzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqcGFja2V0KTsKLQl2b2lkICgqT25MaW5rU3RhdHVzQ2hhbmdlZCkoc3RydWN0IGh2X2RldmljZSAqZGV2LCB1MzIgU3RhdHVzKTsKKwl2b2lkICgqbGlua19zdGF0dXNfY2hhbmdlKShzdHJ1Y3QgaHZfZGV2aWNlICpkZXYsIHUzMiBzdGF0dXMpOwogCiAJLyogU3BlY2lmaWMgdG8gdGhpcyBkcml2ZXIgKi8KLQlpbnQgKCpPblNlbmQpKHN0cnVjdCBodl9kZXZpY2UgKmRldiwgc3RydWN0IGh2X25ldHZzY19wYWNrZXQgKnBhY2tldCk7CisJaW50ICgqc2VuZCkoc3RydWN0IGh2X2RldmljZSAqZGV2LCBzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqcGFja2V0KTsKIAotCXZvaWQgKkNvbnRleHQ7CisJdm9pZCAqY3R4OwogfTsKIAogc3RydWN0IG5ldHZzY19kZXZpY2VfaW5mbyB7Ci0gICAgdW5zaWduZWQgY2hhciBNYWNBZGRyWzZdOwotICAgIGJvb2wgTGlua1N0YXRlOwkvKiAwIC0gbGluayB1cCwgMSAtIGxpbmsgZG93biAqLworCXVuc2lnbmVkIGNoYXIgbWFjX2Fkcls2XTsKKwlib29sIGxpbmtfc3RhdGU7CS8qIDAgLSBsaW5rIHVwLCAxIC0gbGluayBkb3duICovCiB9OwogCiAvKiBJbnRlcmZhY2UgKi8KLWludCBOZXRWc2NJbml0aWFsaXplKHN0cnVjdCBodl9kcml2ZXIgKmRydik7Ci1pbnQgUm5kaXNGaWx0ZXJPbk9wZW4oc3RydWN0IGh2X2RldmljZSAqRGV2aWNlKTsKLWludCBSbmRpc0ZpbHRlck9uQ2xvc2Uoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlKTsKK2ludCBuZXR2c2NfaW5pdGlhbGl6ZShzdHJ1Y3QgaHZfZHJpdmVyICpkcnYpOworaW50IHJuZGlzX2ZpbHRlcl9vcGVuKHN0cnVjdCBodl9kZXZpY2UgKmRldik7CitpbnQgcm5kaXNfZmlsdGVyX2Nsb3NlKHN0cnVjdCBodl9kZXZpY2UgKmRldik7CiAKICNlbmRpZiAvKiBfTkVUVlNDX0FQSV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L25ldHZzY19kcnYuYyBiL2RyaXZlcnMvc3RhZ2luZy9odi9uZXR2c2NfZHJ2LmMKaW5kZXggMTQxNTM1Mi4uMDE0N2I0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L25ldHZzY19kcnYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaHYvbmV0dnNjX2Rydi5jCkBAIC02Niw2ICs2Niw5IEBACiAvKiBUaGUgb25lIGFuZCBvbmx5IG9uZSAqLwogc3RhdGljIHN0cnVjdCBuZXR2c2NfZHJpdmVyX2NvbnRleHQgZ19uZXR2c2NfZHJ2OwogCisvKiBuby1vcCBzbyB0aGUgbmV0ZGV2IGNvcmUgZG9lc24ndCByZXR1cm4gLUVJTlZBTCB3aGVuIG1vZGlmeWluZyB0aGUgdGhlCisgKiBtdWx0aWNhc3QgYWRkcmVzcyBsaXN0IGluIFNJT0NBRERNVUxUSS4gaHYgaXMgc2V0dXAgdG8gZ2V0IGFsbCBtdWx0aWNhc3QKKyAqIHdoZW4gaXQgY2FsbHMgUm5kaXNGaWx0ZXJPbk9wZW4oKSAqLwogc3RhdGljIHZvaWQgbmV0dnNjX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQogewogfQpAQCAtNzgsNyArODEsNyBAQAogCiAJaWYgKG5ldGlmX2NhcnJpZXJfb2sobmV0KSkgewogCQkvKiBPcGVuIHVwIHRoZSBkZXZpY2UgKi8KLQkJcmV0ID0gUm5kaXNGaWx0ZXJPbk9wZW4oZGV2aWNlX29iaik7CisJCXJldCA9IHJuZGlzX2ZpbHRlcl9vcGVuKGRldmljZV9vYmopOwogCQlpZiAocmV0ICE9IDApIHsKIAkJCURQUklOVF9FUlIoTkVUVlNDX0RSViwKIAkJCQkgICAidW5hYmxlIHRvIG9wZW4gZGV2aWNlIChyZXQgJWQpLiIsIHJldCk7CkBAIC0xMDEsNyArMTA0LDcgQEAKIAogCW5ldGlmX3N0b3BfcXVldWUobmV0KTsKIAotCXJldCA9IFJuZGlzRmlsdGVyT25DbG9zZShkZXZpY2Vfb2JqKTsKKwlyZXQgPSBybmRpc19maWx0ZXJfY2xvc2UoZGV2aWNlX29iaik7CiAJaWYgKHJldCAhPSAwKQogCQlEUFJJTlRfRVJSKE5FVFZTQ19EUlYsICJ1bmFibGUgdG8gY2xvc2UgZGV2aWNlIChyZXQgJWQpLiIsIHJldCk7CiAKQEAgLTExMiw3ICsxMTUsNyBAQAogewogCXN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpwYWNrZXQgPSAoc3RydWN0IGh2X25ldHZzY19wYWNrZXQgKiljb250ZXh0OwogCXN0cnVjdCBza19idWZmICpza2IgPSAoc3RydWN0IHNrX2J1ZmYgKikKLQkJKHVuc2lnbmVkIGxvbmcpcGFja2V0LT5Db21wbGV0aW9uLlNlbmQuU2VuZENvbXBsZXRpb25UaWQ7CisJCSh1bnNpZ25lZCBsb25nKXBhY2tldC0+Y29tcGxldGlvbi5zZW5kLnNlbmRfY29tcGxldGlvbl90aWQ7CiAKIAlrZnJlZShwYWNrZXQpOwogCkBAIC0xNTEsNyArMTU0LDcgQEAKIAkvKiBBbGxvY2F0ZSBhIG5ldHZzYyBwYWNrZXQgYmFzZWQgb24gIyBvZiBmcmFncy4gKi8KIAlwYWNrZXQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCkgKwogCQkJIChudW1fcGFnZXMgKiBzaXplb2Yoc3RydWN0IGh2X3BhZ2VfYnVmZmVyKSkgKwotCQkJIG5ldF9kcnZfb2JqLT5SZXF1ZXN0RXh0U2l6ZSwgR0ZQX0FUT01JQyk7CisJCQkgbmV0X2Rydl9vYmotPnJlcV9leHRfc2l6ZSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFwYWNrZXQpIHsKIAkJLyogb3V0IG9mIG1lbW9yeSwgc2lsZW50bHkgZHJvcCBwYWNrZXQgKi8KIAkJRFBSSU5UX0VSUihORVRWU0NfRFJWLCAidW5hYmxlIHRvIGFsbG9jYXRlIGh2X25ldHZzY19wYWNrZXQiKTsKQEAgLTE2MSw0MCArMTY0LDQwIEBACiAJCXJldHVybiBORVRERVZfVFhfT0s7CiAJfQogCi0JcGFja2V0LT5FeHRlbnNpb24gPSAodm9pZCAqKSh1bnNpZ25lZCBsb25nKXBhY2tldCArCisJcGFja2V0LT5leHRlbnNpb24gPSAodm9pZCAqKSh1bnNpZ25lZCBsb25nKXBhY2tldCArCiAJCQkJc2l6ZW9mKHN0cnVjdCBodl9uZXR2c2NfcGFja2V0KSArCiAJCQkJICAgIChudW1fcGFnZXMgKiBzaXplb2Yoc3RydWN0IGh2X3BhZ2VfYnVmZmVyKSk7CiAKIAkvKiBTZXR1cCB0aGUgcm5kaXMgaGVhZGVyICovCi0JcGFja2V0LT5QYWdlQnVmZmVyQ291bnQgPSBudW1fcGFnZXM7CisJcGFja2V0LT5wYWdlX2J1Zl9jbnQgPSBudW1fcGFnZXM7CiAKIAkvKiBUT0RPOiBGbHVzaCBhbGwgd3JpdGUgYnVmZmVycy8gbWVtb3J5IGZlbmNlID8/PyAqLwogCS8qIHdtYigpOyAqLwogCiAJLyogSW5pdGlhbGl6ZSBpdCBmcm9tIHRoZSBza2IgKi8KLQlwYWNrZXQtPlRvdGFsRGF0YUJ1ZmZlckxlbmd0aAk9IHNrYi0+bGVuOworCXBhY2tldC0+dG90YWxfZGF0YV9idWZsZW4JPSBza2ItPmxlbjsKIAogCS8qIFN0YXJ0IGZpbGxpbmcgaW4gdGhlIHBhZ2UgYnVmZmVycyBzdGFydGluZyBhZnRlciBSTkRJUyBidWZmZXIuICovCi0JcGFja2V0LT5QYWdlQnVmZmVyc1sxXS5QZm4gPSB2aXJ0X3RvX3BoeXMoc2tiLT5kYXRhKSA+PiBQQUdFX1NISUZUOwotCXBhY2tldC0+UGFnZUJ1ZmZlcnNbMV0uT2Zmc2V0CisJcGFja2V0LT5wYWdlX2J1ZlsxXS5QZm4gPSB2aXJ0X3RvX3BoeXMoc2tiLT5kYXRhKSA+PiBQQUdFX1NISUZUOworCXBhY2tldC0+cGFnZV9idWZbMV0uT2Zmc2V0CiAJCT0gKHVuc2lnbmVkIGxvbmcpc2tiLT5kYXRhICYgKFBBR0VfU0laRSAtIDEpOwotCXBhY2tldC0+UGFnZUJ1ZmZlcnNbMV0uTGVuZ3RoID0gc2tiX2hlYWRsZW4oc2tiKTsKKwlwYWNrZXQtPnBhZ2VfYnVmWzFdLkxlbmd0aCA9IHNrYl9oZWFkbGVuKHNrYik7CiAKIAkvKiBBZGRpdGlvbmFsIGZyYWdtZW50cyBhcmUgYWZ0ZXIgU0tCIGRhdGEgKi8KIAlmb3IgKGkgPSAwOyBpIDwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgaSsrKSB7CiAJCXNrYl9mcmFnX3QgKmYgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXTsKIAotCQlwYWNrZXQtPlBhZ2VCdWZmZXJzW2krMl0uUGZuID0gcGFnZV90b19wZm4oZi0+cGFnZSk7Ci0JCXBhY2tldC0+UGFnZUJ1ZmZlcnNbaSsyXS5PZmZzZXQgPSBmLT5wYWdlX29mZnNldDsKLQkJcGFja2V0LT5QYWdlQnVmZmVyc1tpKzJdLkxlbmd0aCA9IGYtPnNpemU7CisJCXBhY2tldC0+cGFnZV9idWZbaSsyXS5QZm4gPSBwYWdlX3RvX3BmbihmLT5wYWdlKTsKKwkJcGFja2V0LT5wYWdlX2J1ZltpKzJdLk9mZnNldCA9IGYtPnBhZ2Vfb2Zmc2V0OworCQlwYWNrZXQtPnBhZ2VfYnVmW2krMl0uTGVuZ3RoID0gZi0+c2l6ZTsKIAl9CiAKIAkvKiBTZXQgdGhlIGNvbXBsZXRpb24gcm91dGluZSAqLwotCXBhY2tldC0+Q29tcGxldGlvbi5TZW5kLk9uU2VuZENvbXBsZXRpb24gPSBuZXR2c2NfeG1pdF9jb21wbGV0aW9uOwotCXBhY2tldC0+Q29tcGxldGlvbi5TZW5kLlNlbmRDb21wbGV0aW9uQ29udGV4dCA9IHBhY2tldDsKLQlwYWNrZXQtPkNvbXBsZXRpb24uU2VuZC5TZW5kQ29tcGxldGlvblRpZCA9ICh1bnNpZ25lZCBsb25nKXNrYjsKKwlwYWNrZXQtPmNvbXBsZXRpb24uc2VuZC5zZW5kX2NvbXBsZXRpb24gPSBuZXR2c2NfeG1pdF9jb21wbGV0aW9uOworCXBhY2tldC0+Y29tcGxldGlvbi5zZW5kLnNlbmRfY29tcGxldGlvbl9jdHggPSBwYWNrZXQ7CisJcGFja2V0LT5jb21wbGV0aW9uLnNlbmQuc2VuZF9jb21wbGV0aW9uX3RpZCA9ICh1bnNpZ25lZCBsb25nKXNrYjsKIAotCXJldCA9IG5ldF9kcnZfb2JqLT5PblNlbmQoJm5ldF9kZXZpY2VfY3R4LT5kZXZpY2VfY3R4LT5kZXZpY2Vfb2JqLAorCXJldCA9IG5ldF9kcnZfb2JqLT5zZW5kKCZuZXRfZGV2aWNlX2N0eC0+ZGV2aWNlX2N0eC0+ZGV2aWNlX29iaiwKIAkJCQkgIHBhY2tldCk7CiAJaWYgKHJldCA9PSAwKSB7CiAJCW5ldC0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CkBAIC0yNjAsNyArMjYzLDcgQEAKIAl9CiAKIAkvKiBBbGxvY2F0ZSBhIHNrYiAtIFRPRE8gZGlyZWN0IEkvTyB0byBwYWdlcz8gKi8KLQlza2IgPSBuZXRkZXZfYWxsb2Nfc2tiX2lwX2FsaWduKG5ldCwgcGFja2V0LT5Ub3RhbERhdGFCdWZmZXJMZW5ndGgpOworCXNrYiA9IG5ldGRldl9hbGxvY19za2JfaXBfYWxpZ24obmV0LCBwYWNrZXQtPnRvdGFsX2RhdGFfYnVmbGVuKTsKIAlpZiAodW5saWtlbHkoIXNrYikpIHsKIAkJKytuZXQtPnN0YXRzLnJ4X2Ryb3BwZWQ7CiAJCXJldHVybiAwOwpAQCAtMjczLDE3ICsyNzYsMTcgQEAKIAkgKiBDb3B5IHRvIHNrYi4gVGhpcyBjb3B5IGlzIG5lZWRlZCBoZXJlIHNpbmNlIHRoZSBtZW1vcnkgcG9pbnRlZCBieQogCSAqIGh2X25ldHZzY19wYWNrZXQgY2Fubm90IGJlIGRlYWxsb2NhdGVkCiAJICovCi0JZm9yIChpID0gMDsgaSA8IHBhY2tldC0+UGFnZUJ1ZmZlckNvdW50OyBpKyspIHsKLQkJZGF0YSA9IGttYXBfYXRvbWljKHBmbl90b19wYWdlKHBhY2tldC0+UGFnZUJ1ZmZlcnNbaV0uUGZuKSwKKwlmb3IgKGkgPSAwOyBpIDwgcGFja2V0LT5wYWdlX2J1Zl9jbnQ7IGkrKykgeworCQlkYXRhID0ga21hcF9hdG9taWMocGZuX3RvX3BhZ2UocGFja2V0LT5wYWdlX2J1ZltpXS5QZm4pLAogCQkJCQkgICAgICAgS01fSVJRMSk7CiAJCWRhdGEgPSAodm9pZCAqKSh1bnNpZ25lZCBsb25nKWRhdGEgKwotCQkJCXBhY2tldC0+UGFnZUJ1ZmZlcnNbaV0uT2Zmc2V0OworCQkJCXBhY2tldC0+cGFnZV9idWZbaV0uT2Zmc2V0OwogCi0JCW1lbWNweShza2JfcHV0KHNrYiwgcGFja2V0LT5QYWdlQnVmZmVyc1tpXS5MZW5ndGgpLCBkYXRhLAotCQkgICAgICAgcGFja2V0LT5QYWdlQnVmZmVyc1tpXS5MZW5ndGgpOworCQltZW1jcHkoc2tiX3B1dChza2IsIHBhY2tldC0+cGFnZV9idWZbaV0uTGVuZ3RoKSwgZGF0YSwKKwkJICAgICAgIHBhY2tldC0+cGFnZV9idWZbaV0uTGVuZ3RoKTsKIAogCQlrdW5tYXBfYXRvbWljKCh2b2lkICopKCh1bnNpZ25lZCBsb25nKWRhdGEgLQotCQkJCSAgICAgICBwYWNrZXQtPlBhZ2VCdWZmZXJzW2ldLk9mZnNldCksIEtNX0lSUTEpOworCQkJCSAgICAgICBwYWNrZXQtPnBhZ2VfYnVmW2ldLk9mZnNldCksIEtNX0lSUTEpOwogCX0KIAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKQEAgLTM0Niw3ICszNDksNyBAQAogCXN0cnVjdCBuZXR2c2NfZGV2aWNlX2luZm8gZGV2aWNlX2luZm87CiAJaW50IHJldDsKIAotCWlmICghbmV0X2Rydl9vYmotPkJhc2UuT25EZXZpY2VBZGQpCisJaWYgKCFuZXRfZHJ2X29iai0+YmFzZS5PbkRldmljZUFkZCkKIAkJcmV0dXJuIC0xOwogCiAJbmV0ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlX2NvbnRleHQpKTsKQEAgLTM2Myw3ICszNjYsNyBAQAogCWRldl9zZXRfZHJ2ZGF0YShkZXZpY2UsIG5ldCk7CiAKIAkvKiBOb3RpZnkgdGhlIG5ldHZzYyBkcml2ZXIgb2YgdGhlIG5ldyBkZXZpY2UgKi8KLQlyZXQgPSBuZXRfZHJ2X29iai0+QmFzZS5PbkRldmljZUFkZChkZXZpY2Vfb2JqLCAmZGV2aWNlX2luZm8pOworCXJldCA9IG5ldF9kcnZfb2JqLT5iYXNlLk9uRGV2aWNlQWRkKGRldmljZV9vYmosICZkZXZpY2VfaW5mbyk7CiAJaWYgKHJldCAhPSAwKSB7CiAJCWZyZWVfbmV0ZGV2KG5ldCk7CiAJCWRldl9zZXRfZHJ2ZGF0YShkZXZpY2UsIE5VTEwpOwpAQCAtMzgyLDEwICszODUsMTAgQEAKIAkgKiBvdXQgb2Ygc3luYyB3aXRoIHRoZSBkZXZpY2UncyBsaW5rIHN0YXR1cwogCSAqLwogCWlmICghbmV0aWZfY2Fycmllcl9vayhuZXQpKQotCQlpZiAoIWRldmljZV9pbmZvLkxpbmtTdGF0ZSkKKwkJaWYgKCFkZXZpY2VfaW5mby5saW5rX3N0YXRlKQogCQkJbmV0aWZfY2Fycmllcl9vbihuZXQpOwogCi0JbWVtY3B5KG5ldC0+ZGV2X2FkZHIsIGRldmljZV9pbmZvLk1hY0FkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkobmV0LT5kZXZfYWRkciwgZGV2aWNlX2luZm8ubWFjX2FkciwgRVRIX0FMRU4pOwogCiAJbmV0LT5uZXRkZXZfb3BzID0gJmRldmljZV9vcHM7CiAKQEAgLTM5OCw3ICs0MDEsNyBAQAogCXJldCA9IHJlZ2lzdGVyX25ldGRldihuZXQpOwogCWlmIChyZXQgIT0gMCkgewogCQkvKiBSZW1vdmUgdGhlIGRldmljZSBhbmQgcmVsZWFzZSB0aGUgcmVzb3VyY2UgKi8KLQkJbmV0X2Rydl9vYmotPkJhc2UuT25EZXZpY2VSZW1vdmUoZGV2aWNlX29iaik7CisJCW5ldF9kcnZfb2JqLT5iYXNlLk9uRGV2aWNlUmVtb3ZlKGRldmljZV9vYmopOwogCQlmcmVlX25ldGRldihuZXQpOwogCX0KIApAQCAtNDIyLDcgKzQyNSw3IEBACiAJCXJldHVybiAwOwogCX0KIAotCWlmICghbmV0X2Rydl9vYmotPkJhc2UuT25EZXZpY2VSZW1vdmUpCisJaWYgKCFuZXRfZHJ2X29iai0+YmFzZS5PbkRldmljZVJlbW92ZSkKIAkJcmV0dXJuIC0xOwogCiAJLyogU3RvcCBvdXRib3VuZCBhc2FwICovCkBAIC00MzUsNyArNDM4LDcgQEAKIAkgKiBDYWxsIHRvIHRoZSB2c2MgZHJpdmVyIHRvIGxldCBpdCBrbm93IHRoYXQgdGhlIGRldmljZSBpcyBiZWluZwogCSAqIHJlbW92ZWQKIAkgKi8KLQlyZXQgPSBuZXRfZHJ2X29iai0+QmFzZS5PbkRldmljZVJlbW92ZShkZXZpY2Vfb2JqKTsKKwlyZXQgPSBuZXRfZHJ2X29iai0+YmFzZS5PbkRldmljZVJlbW92ZShkZXZpY2Vfb2JqKTsKIAlpZiAocmV0ICE9IDApIHsKIAkJLyogVE9ETzogKi8KIAkJRFBSSU5UX0VSUihORVRWU0MsICJ1bmFibGUgdG8gcmVtb3ZlIHZzYyBkZXZpY2UgKHJldCAlZCkiLCByZXQpOwpAQCAtNDgxLDggKzQ4NCw4IEBACiAJCWRldmljZV91bnJlZ2lzdGVyKGN1cnJlbnRfZGV2KTsKIAl9CiAKLQlpZiAobmV0dnNjX2Rydl9vYmotPkJhc2UuT25DbGVhbnVwKQotCQluZXR2c2NfZHJ2X29iai0+QmFzZS5PbkNsZWFudXAoJm5ldHZzY19kcnZfb2JqLT5CYXNlKTsKKwlpZiAobmV0dnNjX2Rydl9vYmotPmJhc2UuT25DbGVhbnVwKQorCQluZXR2c2NfZHJ2X29iai0+YmFzZS5PbkNsZWFudXAoJm5ldHZzY19kcnZfb2JqLT5iYXNlKTsKIAogCXZtYnVzX2NoaWxkX2RyaXZlcl91bnJlZ2lzdGVyKGRydl9jdHgpOwogCkBAIC00OTUsMTUgKzQ5OCwxNSBAQAogCXN0cnVjdCBkcml2ZXJfY29udGV4dCAqZHJ2X2N0eCA9ICZnX25ldHZzY19kcnYuZHJ2X2N0eDsKIAlpbnQgcmV0OwogCi0JbmV0X2Rydl9vYmotPlJpbmdCdWZmZXJTaXplID0gcmluZ19zaXplICogUEFHRV9TSVpFOwotCW5ldF9kcnZfb2JqLT5PblJlY2VpdmVDYWxsYmFjayA9IG5ldHZzY19yZWN2X2NhbGxiYWNrOwotCW5ldF9kcnZfb2JqLT5PbkxpbmtTdGF0dXNDaGFuZ2VkID0gbmV0dnNjX2xpbmtzdGF0dXNfY2FsbGJhY2s7CisJbmV0X2Rydl9vYmotPnJpbmdfYnVmX3NpemUgPSByaW5nX3NpemUgKiBQQUdFX1NJWkU7CisJbmV0X2Rydl9vYmotPnJlY3ZfY2IgPSBuZXR2c2NfcmVjdl9jYWxsYmFjazsKKwluZXRfZHJ2X29iai0+bGlua19zdGF0dXNfY2hhbmdlID0gbmV0dnNjX2xpbmtzdGF0dXNfY2FsbGJhY2s7CiAKIAkvKiBDYWxsYmFjayB0byBjbGllbnQgZHJpdmVyIHRvIGNvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiAqLwotCWRydl9pbml0KCZuZXRfZHJ2X29iai0+QmFzZSk7CisJZHJ2X2luaXQoJm5ldF9kcnZfb2JqLT5iYXNlKTsKIAotCWRydl9jdHgtPmRyaXZlci5uYW1lID0gbmV0X2Rydl9vYmotPkJhc2UubmFtZTsKLQltZW1jcHkoJmRydl9jdHgtPmNsYXNzX2lkLCAmbmV0X2Rydl9vYmotPkJhc2UuZGV2aWNlVHlwZSwKKwlkcnZfY3R4LT5kcml2ZXIubmFtZSA9IG5ldF9kcnZfb2JqLT5iYXNlLm5hbWU7CisJbWVtY3B5KCZkcnZfY3R4LT5jbGFzc19pZCwgJm5ldF9kcnZfb2JqLT5iYXNlLmRldmljZVR5cGUsCiAJICAgICAgIHNpemVvZihzdHJ1Y3QgaHZfZ3VpZCkpOwogCiAJZHJ2X2N0eC0+cHJvYmUgPSBuZXR2c2NfcHJvYmU7CkBAIC01MzYsNyArNTM5LDcgQEAKIAlpZiAoIWRtaV9jaGVja19zeXN0ZW0oaHZfbmV0dnNjX2RtaV90YWJsZSkpCiAJCXJldHVybiAtRU5PREVWOwogCi0JcmV0dXJuIG5ldHZzY19kcnZfaW5pdChOZXRWc2NJbml0aWFsaXplKTsKKwlyZXR1cm4gbmV0dnNjX2Rydl9pbml0KG5ldHZzY19pbml0aWFsaXplKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IG5ldHZzY19leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvb3NkLmMgYi9kcml2ZXJzL3N0YWdpbmcvaHYvb3NkLmMKaW5kZXggOGMzZWIyNy4uYjVhMzk0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L29zZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi9vc2QuYwpAQCAtNDMsMTMgKzQzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSAib3NkLmgiCiAKLXN0cnVjdCBvc2RfY2FsbGJhY2tfc3RydWN0IHsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKLQl2b2lkICgqY2FsbGJhY2spKHZvaWQgKik7Ci0Jdm9pZCAqZGF0YTsKLX07Ci0KLXZvaWQgKm9zZF9WaXJ0dWFsQWxsb2NFeGVjKHVuc2lnbmVkIGludCBzaXplKQordm9pZCAqb3NkX3ZpcnR1YWxfYWxsb2NfZXhlYyh1bnNpZ25lZCBpbnQgc2l6ZSkKIHsKICNpZmRlZiBfX3g4Nl82NF9fCiAJcmV0dXJuIF9fdm1hbGxvYyhzaXplLCBHRlBfS0VSTkVMLCBQQUdFX0tFUk5FTF9FWEVDKTsKQEAgLTYwLDcgKzU0LDcgQEAKIH0KIAogLyoqCi0gKiBvc2RfUGFnZUFsbG9jKCkgLSBBbGxvY2F0ZSBwYWdlcworICogb3NkX3BhZ2VfYWxsb2MoKSAtIEFsbG9jYXRlIHBhZ2VzCiAgKiBAY291bnQ6ICAgICAgVG90YWwgbnVtYmVyIG9mIEtlcm5lbCBwYWdlcyB5b3Ugd2FudCB0byBhbGxvY2F0ZQogICoKICAqIFRyaWVzIHRvIGFsbG9jYXRlIEBjb3VudCBudW1iZXIgb2YgY29uc2VjdXRpdmUgZnJlZSBrZXJuZWwgcGFnZXMuCkBAIC02OCw3ICs2Miw3IEBACiAgKiBJZiBzdWNjZXNzZnVsbCBpdCB3aWxsIHJldHVybiBwb2ludGVyIHRvIHRoZSBAY291bnQgcGFnZXMuCiAgKiBNYWlubHkgdXNlZCBieSBIeXBlci1WIGRyaXZlcnMuCiAgKi8KLXZvaWQgKm9zZF9QYWdlQWxsb2ModW5zaWduZWQgaW50IGNvdW50KQordm9pZCAqb3NkX3BhZ2VfYWxsb2ModW5zaWduZWQgaW50IGNvdW50KQogewogCXZvaWQgKnA7CiAKQEAgLTg1LDI2ICs3OSwyNiBAQAogCS8qIGlmIChwKSBtZW1zZXQocCwgMCwgUEFHRV9TSVpFKTsgKi8KIAkvKiByZXR1cm4gcDsgKi8KIH0KLUVYUE9SVF9TWU1CT0xfR1BMKG9zZF9QYWdlQWxsb2MpOworRVhQT1JUX1NZTUJPTF9HUEwob3NkX3BhZ2VfYWxsb2MpOwogCiAvKioKLSAqIG9zZF9QYWdlRnJlZSgpIC0gRnJlZSBwYWdlcworICogb3NkX3BhZ2VfZnJlZSgpIC0gRnJlZSBwYWdlcwogICogQHBhZ2U6ICAgICAgIFBvaW50ZXIgdG8gdGhlIGZpcnN0IHBhZ2UgdG8gYmUgZnJlZWQKICAqIEBjb3VudDogICAgICBUb3RhbCBudW1iZXIgb2YgS2VybmVsIHBhZ2VzIHlvdSBmcmVlCiAgKgotICogRnJlZXMgdGhlIHBhZ2VzIGFsbG9jYXRlZCBieSBvc2RfUGFnZUFsbG9jKCkKKyAqIEZyZWVzIHRoZSBwYWdlcyBhbGxvY2F0ZWQgYnkgb3NkX3BhZ2VfYWxsb2MoKQogICogTWFpbmx5IHVzZWQgYnkgSHlwZXItViBkcml2ZXJzLgogICovCi12b2lkIG9zZF9QYWdlRnJlZSh2b2lkICpwYWdlLCB1bnNpZ25lZCBpbnQgY291bnQpCit2b2lkIG9zZF9wYWdlX2ZyZWUodm9pZCAqcGFnZSwgdW5zaWduZWQgaW50IGNvdW50KQogewogCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpcGFnZSwgZ2V0X29yZGVyKGNvdW50ICogUEFHRV9TSVpFKSk7CiAJLypzdHJ1Y3QgcGFnZSogcCA9IHZpcnRfdG9fcGFnZShwYWdlKTsKIAlfX2ZyZWVfcGFnZShwKTsqLwogfQotRVhQT1JUX1NZTUJPTF9HUEwob3NkX1BhZ2VGcmVlKTsKK0VYUE9SVF9TWU1CT0xfR1BMKG9zZF9wYWdlX2ZyZWUpOwogCiAvKioKLSAqIG9zZF9XYWl0RXZlbnRDcmVhdGUoKSAtIENyZWF0ZSB0aGUgZXZlbnQgcXVldWUKKyAqIG9zZF93YWl0ZXZlbnRfY3JlYXRlKCkgLSBDcmVhdGUgdGhlIGV2ZW50IHF1ZXVlCiAgKgogICogQWxsb2NhdGVzIG1lbW9yeSBmb3IgYSAmc3RydWN0IG9zZF93YWl0ZXZlbnQuIEFuZCB0aGVuIGNhbGxzCiAgKiBpbml0X3dhaXRxdWV1ZV9oZWFkIHRvIHNldCB1cCB0aGUgd2FpdCBxdWV1ZSBmb3IgdGhlIGV2ZW50LgpAQCAtMTE0LDcgKzEwOCw3IEBACiAgKiBSZXR1cm5zIHBvaW50ZXIgdG8gJnN0cnVjdCBvc2Rfd2FpdGV2ZW50CiAgKiBNYWlubHkgdXNlZCBieSBIeXBlci1WIGRyaXZlcnMuCiAgKi8KLXN0cnVjdCBvc2Rfd2FpdGV2ZW50ICpvc2RfV2FpdEV2ZW50Q3JlYXRlKHZvaWQpCitzdHJ1Y3Qgb3NkX3dhaXRldmVudCAqb3NkX3dhaXRldmVudF9jcmVhdGUodm9pZCkKIHsKIAlzdHJ1Y3Qgb3NkX3dhaXRldmVudCAqd2FpdCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBvc2Rfd2FpdGV2ZW50KSwKIAkJCQkJICAgICBHRlBfS0VSTkVMKTsKQEAgLTEyNSwxNCArMTE5LDE0IEBACiAJaW5pdF93YWl0cXVldWVfaGVhZCgmd2FpdC0+ZXZlbnQpOwogCXJldHVybiB3YWl0OwogfQotRVhQT1JUX1NZTUJPTF9HUEwob3NkX1dhaXRFdmVudENyZWF0ZSk7CitFWFBPUlRfU1lNQk9MX0dQTChvc2Rfd2FpdGV2ZW50X2NyZWF0ZSk7CiAKIAogLyoqCi0gKiBvc2RfV2FpdEV2ZW50U2V0KCkgLSBXYWtlIHVwIHRoZSBwcm9jZXNzCi0gKiBAd2FpdEV2ZW50OiBTdHJ1Y3R1cmUgdG8gZXZlbnQgdG8gYmUgd29rZW4gdXAKKyAqIG9zZF93YWl0ZXZlbnRfc2V0KCkgLSBXYWtlIHVwIHRoZSBwcm9jZXNzCisgKiBAd2FpdF9ldmVudDogU3RydWN0dXJlIHRvIGV2ZW50IHRvIGJlIHdva2VuIHVwCiAgKgotICogQHdhaXRldmVudCBpcyBvZiB0eXBlICZzdHJ1Y3Qgb3NkX3dhaXRldmVudAorICogQHdhaXRfZXZlbnQgaXMgb2YgdHlwZSAmc3RydWN0IG9zZF93YWl0ZXZlbnQKICAqCiAgKiBXYWtlIHVwIHRoZSBzbGVlcGluZyBwcm9jZXNzIHNvIGl0IGNhbiBkbyBzb21lIHdvcmsuCiAgKiBBbmQgc2V0IGNvbmRpdGlvbiBpbmRpY2F0b3IgaW4gJnN0cnVjdCBvc2Rfd2FpdGV2ZW50IHRvIGluZGljYXRlCkBAIC0xNDAsMTggKzEzNCwxOCBAQAogICoKICAqIE9ubHkgdXNlZCBieSBOZXR3b3JrIGFuZCBTdG9yYWdlIEh5cGVyLVYgZHJpdmVycy4KICAqLwotdm9pZCBvc2RfV2FpdEV2ZW50U2V0KHN0cnVjdCBvc2Rfd2FpdGV2ZW50ICp3YWl0RXZlbnQpCit2b2lkIG9zZF93YWl0ZXZlbnRfc2V0KHN0cnVjdCBvc2Rfd2FpdGV2ZW50ICp3YWl0X2V2ZW50KQogewotCXdhaXRFdmVudC0+Y29uZGl0aW9uID0gMTsKLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJndhaXRFdmVudC0+ZXZlbnQpOworCXdhaXRfZXZlbnQtPmNvbmRpdGlvbiA9IDE7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ3YWl0X2V2ZW50LT5ldmVudCk7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChvc2RfV2FpdEV2ZW50U2V0KTsKK0VYUE9SVF9TWU1CT0xfR1BMKG9zZF93YWl0ZXZlbnRfc2V0KTsKIAogLyoqCi0gKiBvc2RfV2FpdEV2ZW50V2FpdCgpIC0gV2FpdCBmb3IgZXZlbnQgdGlsbCBjb25kaXRpb24gaXMgdHJ1ZQotICogQHdhaXRFdmVudDogU3RydWN0dXJlIHRvIGV2ZW50IHRvIGJlIHB1dCB0byBzbGVlcAorICogb3NkX3dhaXRldmVudF93YWl0KCkgLSBXYWl0IGZvciBldmVudCB0aWxsIGNvbmRpdGlvbiBpcyB0cnVlCisgKiBAd2FpdF9ldmVudDogU3RydWN0dXJlIHRvIGV2ZW50IHRvIGJlIHB1dCB0byBzbGVlcAogICoKLSAqIEB3YWl0ZXZlbnQgaXMgb2YgdHlwZSAmc3RydWN0IG9zZF93YWl0ZXZlbnQKKyAqIEB3YWl0X2V2ZW50IGlzIG9mIHR5cGUgJnN0cnVjdCBvc2Rfd2FpdGV2ZW50CiAgKgogICogU2V0IHVwIHRoZSBwcm9jZXNzIHRvIHNsZWVwIHVudGlsIHdhaXRFdmVudC0+Y29uZGl0aW9uIGdldCB0cnVlLgogICogQW5kIHNldCBjb25kaXRpb24gaW5kaWNhdG9yIGluICZzdHJ1Y3Qgb3NkX3dhaXRldmVudCB0byBpbmRpY2F0ZQpAQCAtMTYxLDI1ICsxNTUsMjUgQEAKICAqCiAgKiBNYWlubHkgdXNlZCBieSBIeXBlci1WIGRyaXZlcnMuCiAgKi8KLWludCBvc2RfV2FpdEV2ZW50V2FpdChzdHJ1Y3Qgb3NkX3dhaXRldmVudCAqd2FpdEV2ZW50KQoraW50IG9zZF93YWl0ZXZlbnRfd2FpdChzdHJ1Y3Qgb3NkX3dhaXRldmVudCAqd2FpdF9ldmVudCkKIHsKIAlpbnQgcmV0ID0gMDsKIAotCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSh3YWl0RXZlbnQtPmV2ZW50LAotCQkJCSAgICAgICB3YWl0RXZlbnQtPmNvbmRpdGlvbik7Ci0Jd2FpdEV2ZW50LT5jb25kaXRpb24gPSAwOworCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSh3YWl0X2V2ZW50LT5ldmVudCwKKwkJCQkgICAgICAgd2FpdF9ldmVudC0+Y29uZGl0aW9uKTsKKwl3YWl0X2V2ZW50LT5jb25kaXRpb24gPSAwOwogCXJldHVybiByZXQ7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChvc2RfV2FpdEV2ZW50V2FpdCk7CitFWFBPUlRfU1lNQk9MX0dQTChvc2Rfd2FpdGV2ZW50X3dhaXQpOwogCiAvKioKLSAqIG9zZF9XYWl0RXZlbnRXYWl0RXgoKSAtIFdhaXQgZm9yIGV2ZW50IG9yIHRpbWVvdXQgZm9yIHByb2Nlc3Mgd2FrZXVwCi0gKiBAd2FpdEV2ZW50OiBTdHJ1Y3R1cmUgdG8gZXZlbnQgdG8gYmUgcHV0IHRvIHNsZWVwCi0gKiBAVGltZW91dEluTXM6ICAgICAgIFRvdGFsIG51bWJlciBvZiBNaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgd2FraW5nIHVwCisgKiBvc2Rfd2FpdGV2ZW50X3dhaXRleCgpIC0gV2FpdCBmb3IgZXZlbnQgb3IgdGltZW91dCBmb3IgcHJvY2VzcyB3YWtldXAKKyAqIEB3YWl0X2V2ZW50OiBTdHJ1Y3R1cmUgdG8gZXZlbnQgdG8gYmUgcHV0IHRvIHNsZWVwCisgKiBAdGltZW91dF9pbl9tczogICAgICAgVG90YWwgbnVtYmVyIG9mIE1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSB3YWtpbmcgdXAKICAqCi0gKiBAd2FpdGV2ZW50IGlzIG9mIHR5cGUgJnN0cnVjdCBvc2Rfd2FpdGV2ZW50CisgKiBAd2FpdF9ldmVudCBpcyBvZiB0eXBlICZzdHJ1Y3Qgb3NkX3dhaXRldmVudAogICogU2V0IHVwIHRoZSBwcm9jZXNzIHRvIHNsZWVwIHVudGlsIEB3YWl0RXZlbnQtPmNvbmRpdGlvbiBnZXQgdHJ1ZSBvcgotICogQFRpbWVvdXRJbk1zIChUaW1lIG91dCBpbiBNaWxsaXNlY29uZHMpIGhhcyBiZWVuIHJlYWNoZWQuCisgKiBAdGltZW91dF9pbl9tcyAoVGltZSBvdXQgaW4gTWlsbGlzZWNvbmRzKSBoYXMgYmVlbiByZWFjaGVkLgogICogQW5kIHNldCBjb25kaXRpb24gaW5kaWNhdG9yIGluICZzdHJ1Y3Qgb3NkX3dhaXRldmVudCB0byBpbmRpY2F0ZQogICogdGhlIHByb2Nlc3MgaXMgaW4gYSBzbGVlcGluZyBzdGF0ZS4KICAqCkBAIC0xODcsNDIgKzE4MSwxNCBAQAogICoKICAqIE1haW5seSB1c2VkIGJ5IEh5cGVyLVYgZHJpdmVycy4KICAqLwotaW50IG9zZF9XYWl0RXZlbnRXYWl0RXgoc3RydWN0IG9zZF93YWl0ZXZlbnQgKndhaXRFdmVudCwgdTMyIFRpbWVvdXRJbk1zKQoraW50IG9zZF93YWl0ZXZlbnRfd2FpdGV4KHN0cnVjdCBvc2Rfd2FpdGV2ZW50ICp3YWl0X2V2ZW50LCB1MzIgdGltZW91dF9pbl9tcykKIHsKIAlpbnQgcmV0ID0gMDsKIAotCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHdhaXRFdmVudC0+ZXZlbnQsCi0JCQkJCSAgICAgICB3YWl0RXZlbnQtPmNvbmRpdGlvbiwKLQkJCQkJICAgICAgIG1zZWNzX3RvX2ppZmZpZXMoVGltZW91dEluTXMpKTsKLQl3YWl0RXZlbnQtPmNvbmRpdGlvbiA9IDA7CisJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQod2FpdF9ldmVudC0+ZXZlbnQsCisJCQkJCSAgICAgICB3YWl0X2V2ZW50LT5jb25kaXRpb24sCisJCQkJCSAgICAgICBtc2Vjc190b19qaWZmaWVzKHRpbWVvdXRfaW5fbXMpKTsKKwl3YWl0X2V2ZW50LT5jb25kaXRpb24gPSAwOwogCXJldHVybiByZXQ7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChvc2RfV2FpdEV2ZW50V2FpdEV4KTsKLQotc3RhdGljIHZvaWQgb3NkX2NhbGxiYWNrX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBvc2RfY2FsbGJhY2tfc3RydWN0ICpjYiA9IGNvbnRhaW5lcl9vZih3b3JrLAotCQkJCQkJc3RydWN0IG9zZF9jYWxsYmFja19zdHJ1Y3QsCi0JCQkJCQl3b3JrKTsKLQkoY2ItPmNhbGxiYWNrKShjYi0+ZGF0YSk7Ci0Ja2ZyZWUoY2IpOwotfQotCi1pbnQgb3NkX3NjaGVkdWxlX2NhbGxiYWNrKHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cSwKLQkJCSAgdm9pZCAoKmZ1bmMpKHZvaWQgKiksCi0JCQkgIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IG9zZF9jYWxsYmFja19zdHJ1Y3QgKmNiOwotCi0JY2IgPSBrbWFsbG9jKHNpemVvZigqY2IpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNiKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBpbiBvc2Rfc2NoZWR1bGVfY2FsbGJhY2tcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JY2ItPmNhbGxiYWNrID0gZnVuYzsKLQljYi0+ZGF0YSA9IGRhdGE7Ci0JSU5JVF9XT1JLKCZjYi0+d29yaywgb3NkX2NhbGxiYWNrX3dvcmspOwotCXJldHVybiBxdWV1ZV93b3JrKHdxLCAmY2ItPndvcmspOwotfQotCitFWFBPUlRfU1lNQk9MX0dQTChvc2Rfd2FpdGV2ZW50X3dhaXRleCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvb3NkLmggYi9kcml2ZXJzL3N0YWdpbmcvaHYvb3NkLmgKaW5kZXggY2UwNjRlOC4uODcwZWYwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L29zZC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi9vc2QuaApAQCAtNTAsMjEgKzUwLDE3IEBACiAKIC8qIE9zZCByb3V0aW5lcyAqLwogCi1leHRlcm4gdm9pZCAqb3NkX1ZpcnR1YWxBbGxvY0V4ZWModW5zaWduZWQgaW50IHNpemUpOworZXh0ZXJuIHZvaWQgKm9zZF92aXJ0dWFsX2FsbG9jX2V4ZWModW5zaWduZWQgaW50IHNpemUpOwogCi1leHRlcm4gdm9pZCAqb3NkX1BhZ2VBbGxvYyh1bnNpZ25lZCBpbnQgY291bnQpOwotZXh0ZXJuIHZvaWQgb3NkX1BhZ2VGcmVlKHZvaWQgKnBhZ2UsIHVuc2lnbmVkIGludCBjb3VudCk7CitleHRlcm4gdm9pZCAqb3NkX3BhZ2VfYWxsb2ModW5zaWduZWQgaW50IGNvdW50KTsKK2V4dGVybiB2b2lkIG9zZF9wYWdlX2ZyZWUodm9pZCAqcGFnZSwgdW5zaWduZWQgaW50IGNvdW50KTsKIAotZXh0ZXJuIHN0cnVjdCBvc2Rfd2FpdGV2ZW50ICpvc2RfV2FpdEV2ZW50Q3JlYXRlKHZvaWQpOwotZXh0ZXJuIHZvaWQgb3NkX1dhaXRFdmVudFNldChzdHJ1Y3Qgb3NkX3dhaXRldmVudCAqd2FpdEV2ZW50KTsKLWV4dGVybiBpbnQgb3NkX1dhaXRFdmVudFdhaXQoc3RydWN0IG9zZF93YWl0ZXZlbnQgKndhaXRFdmVudCk7CitleHRlcm4gc3RydWN0IG9zZF93YWl0ZXZlbnQgKm9zZF93YWl0ZXZlbnRfY3JlYXRlKHZvaWQpOworZXh0ZXJuIHZvaWQgb3NkX3dhaXRldmVudF9zZXQoc3RydWN0IG9zZF93YWl0ZXZlbnQgKndhaXRfZXZlbnQpOworZXh0ZXJuIGludCBvc2Rfd2FpdGV2ZW50X3dhaXQoc3RydWN0IG9zZF93YWl0ZXZlbnQgKndhaXRfZXZlbnQpOwogCi0vKiBJZiA+MCwgd2FpdEV2ZW50IGdvdCBzaWduYWxlZC4gSWYgPT0wLCB0aW1lb3V0LiBJZiA8IDAsIGVycm9yICovCi1leHRlcm4gaW50IG9zZF9XYWl0RXZlbnRXYWl0RXgoc3RydWN0IG9zZF93YWl0ZXZlbnQgKndhaXRFdmVudCwKLQkJCSAgICAgICB1MzIgVGltZW91dEluTXMpOwotCi1pbnQgb3NkX3NjaGVkdWxlX2NhbGxiYWNrKHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cSwKLQkJCSAgdm9pZCAoKmZ1bmMpKHZvaWQgKiksCi0JCQkgIHZvaWQgKmRhdGEpOworLyogSWYgPjAsIHdhaXRfZXZlbnQgZ290IHNpZ25hbGVkLiBJZiA9PTAsIHRpbWVvdXQuIElmIDwgMCwgZXJyb3IgKi8KK2V4dGVybiBpbnQgb3NkX3dhaXRldmVudF93YWl0ZXgoc3RydWN0IG9zZF93YWl0ZXZlbnQgKndhaXRfZXZlbnQsCisJCQkgICAgICAgdTMyIHRpbWVvdXRfaW5fbXMpOwogCiAjZW5kaWYgLyogX09TRF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L3JpbmdfYnVmZmVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvaHYvcmluZ19idWZmZXIuYwppbmRleCBkNzhjNTY5Li40ZDUzMzkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvcmluZ19idWZmZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaHYvcmluZ19idWZmZXIuYwpAQCAtMzgsNyArMzgsNyBAQAogLyorKwogCiBOYW1lOgotCUdldFJpbmdCdWZmZXJBdmFpbEJ5dGVzKCkKKwlnZXRfcmluZ2J1ZmZlcl9hdmFpbGJ5dGVzKCkKIAogRGVzY3JpcHRpb246CiAJR2V0IG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgdG8gcmVhZCBhbmQgdG8gd3JpdGUgdG8KQEAgLTQ2LDMzICs0NiwzNCBAQAogCiAtLSovCiBzdGF0aWMgaW5saW5lIHZvaWQKLUdldFJpbmdCdWZmZXJBdmFpbEJ5dGVzKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpyYmksIHUzMiAqcmVhZCwgdTMyICp3cml0ZSkKK2dldF9yaW5nYnVmZmVyX2F2YWlsYnl0ZXMoc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKnJiaSwKKwkJCSAgdTMyICpyZWFkLCB1MzIgKndyaXRlKQogewogCXUzMiByZWFkX2xvYywgd3JpdGVfbG9jOwogCiAJLyogQ2FwdHVyZSB0aGUgcmVhZC93cml0ZSBpbmRpY2VzIGJlZm9yZSB0aGV5IGNoYW5nZWQgKi8KLQlyZWFkX2xvYyA9IHJiaS0+UmluZ0J1ZmZlci0+UmVhZEluZGV4OwotCXdyaXRlX2xvYyA9IHJiaS0+UmluZ0J1ZmZlci0+V3JpdGVJbmRleDsKKwlyZWFkX2xvYyA9IHJiaS0+cmluZ19idWZmZXItPnJlYWRfaW5kZXg7CisJd3JpdGVfbG9jID0gcmJpLT5yaW5nX2J1ZmZlci0+d3JpdGVfaW5kZXg7CiAKLQkqd3JpdGUgPSBCWVRFU19BVkFJTF9UT19XUklURShyZWFkX2xvYywgd3JpdGVfbG9jLCByYmktPlJpbmdEYXRhU2l6ZSk7Ci0JKnJlYWQgPSByYmktPlJpbmdEYXRhU2l6ZSAtICp3cml0ZTsKKwkqd3JpdGUgPSBCWVRFU19BVkFJTF9UT19XUklURShyZWFkX2xvYywgd3JpdGVfbG9jLCByYmktPnJpbmdfZGF0YXNpemUpOworCSpyZWFkID0gcmJpLT5yaW5nX2RhdGFzaXplIC0gKndyaXRlOwogfQogCiAvKisrCiAKIE5hbWU6Ci0JR2V0TmV4dFdyaXRlTG9jYXRpb24oKQorCWdldF9uZXh0X3dyaXRlX2xvY2F0aW9uKCkKIAogRGVzY3JpcHRpb246CiAJR2V0IHRoZSBuZXh0IHdyaXRlIGxvY2F0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHJpbmcgYnVmZmVyCiAKIC0tKi8KIHN0YXRpYyBpbmxpbmUgdTMyCi1HZXROZXh0V3JpdGVMb2NhdGlvbihzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqUmluZ0luZm8pCitnZXRfbmV4dF93cml0ZV9sb2NhdGlvbihzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqcmluZ19pbmZvKQogewotCXUzMiBuZXh0ID0gUmluZ0luZm8tPlJpbmdCdWZmZXItPldyaXRlSW5kZXg7CisJdTMyIG5leHQgPSByaW5nX2luZm8tPnJpbmdfYnVmZmVyLT53cml0ZV9pbmRleDsKIAotCS8qIEFTU0VSVChuZXh0IDwgUmluZ0luZm8tPlJpbmdEYXRhU2l6ZSk7ICovCisJLyogQVNTRVJUKG5leHQgPCByaW5nX2luZm8tPlJpbmdEYXRhU2l6ZSk7ICovCiAKIAlyZXR1cm4gbmV4dDsKIH0KQEAgLTgwLDM0ICs4MSwzNCBAQAogLyorKwogCiBOYW1lOgotCVNldE5leHRXcml0ZUxvY2F0aW9uKCkKKwlzZXRfbmV4dF93cml0ZV9sb2NhdGlvbigpCiAKIERlc2NyaXB0aW9uOgogCVNldCB0aGUgbmV4dCB3cml0ZSBsb2NhdGlvbiBmb3IgdGhlIHNwZWNpZmllZCByaW5nIGJ1ZmZlcgogCiAtLSovCiBzdGF0aWMgaW5saW5lIHZvaWQKLVNldE5leHRXcml0ZUxvY2F0aW9uKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpSaW5nSW5mbywKLQkJICAgICB1MzIgTmV4dFdyaXRlTG9jYXRpb24pCitzZXRfbmV4dF93cml0ZV9sb2NhdGlvbihzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqcmluZ19pbmZvLAorCQkgICAgIHUzMiBuZXh0X3dyaXRlX2xvY2F0aW9uKQogewotCVJpbmdJbmZvLT5SaW5nQnVmZmVyLT5Xcml0ZUluZGV4ID0gTmV4dFdyaXRlTG9jYXRpb247CisJcmluZ19pbmZvLT5yaW5nX2J1ZmZlci0+d3JpdGVfaW5kZXggPSBuZXh0X3dyaXRlX2xvY2F0aW9uOwogfQogCiAvKisrCiAKIE5hbWU6Ci0JR2V0TmV4dFJlYWRMb2NhdGlvbigpCisJZ2V0X25leHRfcmVhZF9sb2NhdGlvbigpCiAKIERlc2NyaXB0aW9uOgogCUdldCB0aGUgbmV4dCByZWFkIGxvY2F0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHJpbmcgYnVmZmVyCiAKIC0tKi8KIHN0YXRpYyBpbmxpbmUgdTMyCi1HZXROZXh0UmVhZExvY2F0aW9uKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpSaW5nSW5mbykKK2dldF9uZXh0X3JlYWRfbG9jYXRpb24oc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKnJpbmdfaW5mbykKIHsKLQl1MzIgbmV4dCA9IFJpbmdJbmZvLT5SaW5nQnVmZmVyLT5SZWFkSW5kZXg7CisJdTMyIG5leHQgPSByaW5nX2luZm8tPnJpbmdfYnVmZmVyLT5yZWFkX2luZGV4OwogCi0JLyogQVNTRVJUKG5leHQgPCBSaW5nSW5mby0+UmluZ0RhdGFTaXplKTsgKi8KKwkvKiBBU1NFUlQobmV4dCA8IHJpbmdfaW5mby0+UmluZ0RhdGFTaXplKTsgKi8KIAogCXJldHVybiBuZXh0OwogfQpAQCAtMTE1LDcgKzExNiw3IEBACiAvKisrCiAKIE5hbWU6Ci0JR2V0TmV4dFJlYWRMb2NhdGlvbldpdGhPZmZzZXQoKQorCWdldF9uZXh0X3JlYWRsb2NhdGlvbl93aXRob2Zmc2V0KCkKIAogRGVzY3JpcHRpb246CiAJR2V0IHRoZSBuZXh0IHJlYWQgbG9jYXRpb24gKyBvZmZzZXQgZm9yIHRoZSBzcGVjaWZpZWQgcmluZyBidWZmZXIuCkBAIC0xMjMsMTMgKzEyNCwxNCBAQAogCiAtLSovCiBzdGF0aWMgaW5saW5lIHUzMgotR2V0TmV4dFJlYWRMb2NhdGlvbldpdGhPZmZzZXQoc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKlJpbmdJbmZvLCB1MzIgT2Zmc2V0KQorZ2V0X25leHRfcmVhZGxvY2F0aW9uX3dpdGhvZmZzZXQoc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKnJpbmdfaW5mbywKKwkJCQkgdTMyIG9mZnNldCkKIHsKLQl1MzIgbmV4dCA9IFJpbmdJbmZvLT5SaW5nQnVmZmVyLT5SZWFkSW5kZXg7CisJdTMyIG5leHQgPSByaW5nX2luZm8tPnJpbmdfYnVmZmVyLT5yZWFkX2luZGV4OwogCi0JLyogQVNTRVJUKG5leHQgPCBSaW5nSW5mby0+UmluZ0RhdGFTaXplKTsgKi8KLQluZXh0ICs9IE9mZnNldDsKLQluZXh0ICU9IFJpbmdJbmZvLT5SaW5nRGF0YVNpemU7CisJLyogQVNTRVJUKG5leHQgPCByaW5nX2luZm8tPlJpbmdEYXRhU2l6ZSk7ICovCisJbmV4dCArPSBvZmZzZXQ7CisJbmV4dCAlPSByaW5nX2luZm8tPnJpbmdfZGF0YXNpemU7CiAKIAlyZXR1cm4gbmV4dDsKIH0KQEAgLTEzNywxNDEgKzEzOSwxNDUgQEAKIC8qKysKIAogTmFtZToKLQlTZXROZXh0UmVhZExvY2F0aW9uKCkKKwlzZXRfbmV4dF9yZWFkX2xvY2F0aW9uKCkKIAogRGVzY3JpcHRpb246CiAJU2V0IHRoZSBuZXh0IHJlYWQgbG9jYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmluZyBidWZmZXIKIAogLS0qLwogc3RhdGljIGlubGluZSB2b2lkCi1TZXROZXh0UmVhZExvY2F0aW9uKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpSaW5nSW5mbywgdTMyIE5leHRSZWFkTG9jYXRpb24pCitzZXRfbmV4dF9yZWFkX2xvY2F0aW9uKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpyaW5nX2luZm8sCisJCSAgICB1MzIgbmV4dF9yZWFkX2xvY2F0aW9uKQogewotCVJpbmdJbmZvLT5SaW5nQnVmZmVyLT5SZWFkSW5kZXggPSBOZXh0UmVhZExvY2F0aW9uOworCXJpbmdfaW5mby0+cmluZ19idWZmZXItPnJlYWRfaW5kZXggPSBuZXh0X3JlYWRfbG9jYXRpb247CiB9CiAKIAogLyorKwogCiBOYW1lOgotCUdldFJpbmdCdWZmZXIoKQorCWdldF9yaW5nX2J1ZmZlcigpCiAKIERlc2NyaXB0aW9uOgogCUdldCB0aGUgc3RhcnQgb2YgdGhlIHJpbmcgYnVmZmVyCiAKIC0tKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCAqCi1HZXRSaW5nQnVmZmVyKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpSaW5nSW5mbykKK2dldF9yaW5nX2J1ZmZlcihzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqcmluZ19pbmZvKQogewotCXJldHVybiAodm9pZCAqKVJpbmdJbmZvLT5SaW5nQnVmZmVyLT5CdWZmZXI7CisJcmV0dXJuICh2b2lkICopcmluZ19pbmZvLT5yaW5nX2J1ZmZlci0+YnVmZmVyOwogfQogCiAKIC8qKysKIAogTmFtZToKLQlHZXRSaW5nQnVmZmVyU2l6ZSgpCisJZ2V0X3JpbmdfYnVmZmVyc2l6ZSgpCiAKIERlc2NyaXB0aW9uOgogCUdldCB0aGUgc2l6ZSBvZiB0aGUgcmluZyBidWZmZXIKIAogLS0qLwogc3RhdGljIGlubGluZSB1MzIKLUdldFJpbmdCdWZmZXJTaXplKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpSaW5nSW5mbykKK2dldF9yaW5nX2J1ZmZlcnNpemUoc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKnJpbmdfaW5mbykKIHsKLQlyZXR1cm4gUmluZ0luZm8tPlJpbmdEYXRhU2l6ZTsKKwlyZXR1cm4gcmluZ19pbmZvLT5yaW5nX2RhdGFzaXplOwogfQogCiAvKisrCiAKIE5hbWU6Ci0JR2V0UmluZ0J1ZmZlckluZGljZXMoKQorCWdldF9yaW5nX2J1ZmZlcmluZGljZXMoKQogCiBEZXNjcmlwdGlvbjoKIAlHZXQgdGhlIHJlYWQgYW5kIHdyaXRlIGluZGljZXMgYXMgdTY0IG9mIHRoZSBzcGVjaWZpZWQgcmluZyBidWZmZXIKIAogLS0qLwogc3RhdGljIGlubGluZSB1NjQKLUdldFJpbmdCdWZmZXJJbmRpY2VzKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpSaW5nSW5mbykKK2dldF9yaW5nX2J1ZmZlcmluZGljZXMoc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKnJpbmdfaW5mbykKIHsKLQlyZXR1cm4gKHU2NClSaW5nSW5mby0+UmluZ0J1ZmZlci0+V3JpdGVJbmRleCA8PCAzMjsKKwlyZXR1cm4gKHU2NClyaW5nX2luZm8tPnJpbmdfYnVmZmVyLT53cml0ZV9pbmRleCA8PCAzMjsKIH0KIAogCiAvKisrCiAKIE5hbWU6Ci0JRHVtcFJpbmdJbmZvKCkKKwlkdW1wX3JpbmdfaW5mbygpCiAKIERlc2NyaXB0aW9uOgogCUR1bXAgb3V0IHRvIGNvbnNvbGUgdGhlIHJpbmcgYnVmZmVyIGluZm8KIAogLS0qLwotdm9pZCBEdW1wUmluZ0luZm8oc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKlJpbmdJbmZvLCBjaGFyICpQcmVmaXgpCit2b2lkIGR1bXBfcmluZ19pbmZvKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpyaW5nX2luZm8sIGNoYXIgKnByZWZpeCkKIHsKLQl1MzIgYnl0ZXNBdmFpbFRvV3JpdGU7Ci0JdTMyIGJ5dGVzQXZhaWxUb1JlYWQ7CisJdTMyIGJ5dGVzX2F2YWlsX3Rvd3JpdGU7CisJdTMyIGJ5dGVzX2F2YWlsX3RvcmVhZDsKIAotCUdldFJpbmdCdWZmZXJBdmFpbEJ5dGVzKFJpbmdJbmZvLAotCSZieXRlc0F2YWlsVG9SZWFkLAotCSZieXRlc0F2YWlsVG9Xcml0ZSk7CisJZ2V0X3JpbmdidWZmZXJfYXZhaWxieXRlcyhyaW5nX2luZm8sCisJJmJ5dGVzX2F2YWlsX3RvcmVhZCwKKwkmYnl0ZXNfYXZhaWxfdG93cml0ZSk7CiAKIAlEUFJJTlQoVk1CVVMsCiAJCURFQlVHX1JJTkdfTFZMLAogCQkiJXMgPDxyaW5naW5mbyAlcCBidWZmZXIgJXAgYXZhaWwgd3JpdGUgJXUgIgogCQkiYXZhaWwgcmVhZCAldSByZWFkIGlkeCAldSB3cml0ZSBpZHggJXU+PiIsCi0JCVByZWZpeCwKLQkJUmluZ0luZm8sCi0JCVJpbmdJbmZvLT5SaW5nQnVmZmVyLT5CdWZmZXIsCi0JCWJ5dGVzQXZhaWxUb1dyaXRlLAotCQlieXRlc0F2YWlsVG9SZWFkLAotCQlSaW5nSW5mby0+UmluZ0J1ZmZlci0+UmVhZEluZGV4LAotCQlSaW5nSW5mby0+UmluZ0J1ZmZlci0+V3JpdGVJbmRleCk7CisJCXByZWZpeCwKKwkJcmluZ19pbmZvLAorCQlyaW5nX2luZm8tPnJpbmdfYnVmZmVyLT5idWZmZXIsCisJCWJ5dGVzX2F2YWlsX3Rvd3JpdGUsCisJCWJ5dGVzX2F2YWlsX3RvcmVhZCwKKwkJcmluZ19pbmZvLT5yaW5nX2J1ZmZlci0+cmVhZF9pbmRleCwKKwkJcmluZ19pbmZvLT5yaW5nX2J1ZmZlci0+d3JpdGVfaW5kZXgpOwogfQogCiAKIC8qIEludGVybmFsIHJvdXRpbmVzICovCiAKIHN0YXRpYyB1MzIKLUNvcHlUb1JpbmdCdWZmZXIoCi0Jc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8JKlJpbmdJbmZvLAotCXUzMgkJCQlTdGFydFdyaXRlT2Zmc2V0LAotCXZvaWQJCQkJKlNyYywKLQl1MzIJCQkJU3JjTGVuKTsKK2NvcHl0b19yaW5nYnVmZmVyKAorCXN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvCSpyaW5nX2luZm8sCisJdTMyCQkJCXN0YXJ0X3dyaXRlX29mZnNldCwKKwl2b2lkCQkJCSpzcmMsCisJdTMyCQkJCXNyY2xlbik7CiAKIHN0YXRpYyB1MzIKLUNvcHlGcm9tUmluZ0J1ZmZlcigKLQlzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbwkqUmluZ0luZm8sCi0Jdm9pZAkJCQkqRGVzdCwKLQl1MzIJCQkJRGVzdExlbiwKLQl1MzIJCQkJU3RhcnRSZWFkT2Zmc2V0KTsKK2NvcHlmcm9tX3JpbmdidWZmZXIoCisJc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8JKnJpbmdfaW5mbywKKwl2b2lkCQkJCSpkZXN0LAorCXUzMgkJCQlkZXN0bGVuLAorCXUzMgkJCQlzdGFydF9yZWFkX29mZnNldCk7CiAKIAogCiAvKisrCiAKIE5hbWU6Ci0JUmluZ0J1ZmZlckdldERlYnVnSW5mbygpCisJcmluZ2J1ZmZlcl9nZXRfZGVidWdpbmZvKCkKIAogRGVzY3JpcHRpb246CiAJR2V0IHZhcmlvdXMgZGVidWcgbWV0cmljcyBmb3IgdGhlIHNwZWNpZmllZCByaW5nIGJ1ZmZlcgogCiAtLSovCi12b2lkIFJpbmdCdWZmZXJHZXREZWJ1Z0luZm8oc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKlJpbmdJbmZvLAordm9pZCByaW5nYnVmZmVyX2dldF9kZWJ1Z2luZm8oc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKnJpbmdfaW5mbywKIAkJCSAgICBzdHJ1Y3QgaHZfcmluZ19idWZmZXJfZGVidWdfaW5mbyAqZGVidWdfaW5mbykKIHsKLQl1MzIgYnl0ZXNBdmFpbFRvV3JpdGU7Ci0JdTMyIGJ5dGVzQXZhaWxUb1JlYWQ7CisJdTMyIGJ5dGVzX2F2YWlsX3Rvd3JpdGU7CisJdTMyIGJ5dGVzX2F2YWlsX3RvcmVhZDsKIAotCWlmIChSaW5nSW5mby0+UmluZ0J1ZmZlcikgewotCQlHZXRSaW5nQnVmZmVyQXZhaWxCeXRlcyhSaW5nSW5mbywKLQkJCQkJJmJ5dGVzQXZhaWxUb1JlYWQsCi0JCQkJCSZieXRlc0F2YWlsVG9Xcml0ZSk7CisJaWYgKHJpbmdfaW5mby0+cmluZ19idWZmZXIpIHsKKwkJZ2V0X3JpbmdidWZmZXJfYXZhaWxieXRlcyhyaW5nX2luZm8sCisJCQkJCSZieXRlc19hdmFpbF90b3JlYWQsCisJCQkJCSZieXRlc19hdmFpbF90b3dyaXRlKTsKIAotCQlkZWJ1Z19pbmZvLT5CeXRlc0F2YWlsVG9SZWFkID0gYnl0ZXNBdmFpbFRvUmVhZDsKLQkJZGVidWdfaW5mby0+Qnl0ZXNBdmFpbFRvV3JpdGUgPSBieXRlc0F2YWlsVG9Xcml0ZTsKLQkJZGVidWdfaW5mby0+Q3VycmVudFJlYWRJbmRleCA9IFJpbmdJbmZvLT5SaW5nQnVmZmVyLT5SZWFkSW5kZXg7Ci0JCWRlYnVnX2luZm8tPkN1cnJlbnRXcml0ZUluZGV4ID0gUmluZ0luZm8tPlJpbmdCdWZmZXItPldyaXRlSW5kZXg7Ci0JCWRlYnVnX2luZm8tPkN1cnJlbnRJbnRlcnJ1cHRNYXNrID0gUmluZ0luZm8tPlJpbmdCdWZmZXItPkludGVycnVwdE1hc2s7CisJCWRlYnVnX2luZm8tPmJ5dGVzX2F2YWlsX3RvcmVhZCA9IGJ5dGVzX2F2YWlsX3RvcmVhZDsKKwkJZGVidWdfaW5mby0+Ynl0ZXNfYXZhaWxfdG93cml0ZSA9IGJ5dGVzX2F2YWlsX3Rvd3JpdGU7CisJCWRlYnVnX2luZm8tPmN1cnJlbnRfcmVhZF9pbmRleCA9CisJCQlyaW5nX2luZm8tPnJpbmdfYnVmZmVyLT5yZWFkX2luZGV4OworCQlkZWJ1Z19pbmZvLT5jdXJyZW50X3dyaXRlX2luZGV4ID0KKwkJCXJpbmdfaW5mby0+cmluZ19idWZmZXItPndyaXRlX2luZGV4OworCQlkZWJ1Z19pbmZvLT5jdXJyZW50X2ludGVycnVwdF9tYXNrID0KKwkJCXJpbmdfaW5mby0+cmluZ19idWZmZXItPmludGVycnVwdF9tYXNrOwogCX0KIH0KIApAQCAtMjc5LDQwICsyODUsNDIgQEAKIC8qKysKIAogTmFtZToKLQlHZXRSaW5nQnVmZmVySW50ZXJydXB0TWFzaygpCisJZ2V0X3JpbmdidWZmZXJfaW50ZXJydXB0X21hc2soKQogCiBEZXNjcmlwdGlvbjoKIAlHZXQgdGhlIGludGVycnVwdCBtYXNrIGZvciB0aGUgc3BlY2lmaWVkIHJpbmcgYnVmZmVyCiAKIC0tKi8KLXUzMiBHZXRSaW5nQnVmZmVySW50ZXJydXB0TWFzayhzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqcmJpKQordTMyIGdldF9yaW5nYnVmZmVyX2ludGVycnVwdF9tYXNrKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpyYmkpCiB7Ci0JcmV0dXJuIHJiaS0+UmluZ0J1ZmZlci0+SW50ZXJydXB0TWFzazsKKwlyZXR1cm4gcmJpLT5yaW5nX2J1ZmZlci0+aW50ZXJydXB0X21hc2s7CiB9CiAKIC8qKysKIAogTmFtZToKLQlSaW5nQnVmZmVySW5pdCgpCisJcmluZ2J1ZmZlcl9pbml0KCkKIAogRGVzY3JpcHRpb246CiAJSW5pdGlhbGl6ZSB0aGUgcmluZyBidWZmZXIKIAogLS0qLwotaW50IFJpbmdCdWZmZXJJbml0KHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpSaW5nSW5mbywgdm9pZCAqQnVmZmVyLCB1MzIgQnVmZmVyTGVuKQoraW50IHJpbmdidWZmZXJfaW5pdChzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqcmluZ19pbmZvLAorCQkgICB2b2lkICpidWZmZXIsIHUzMiBidWZsZW4pCiB7CiAJaWYgKHNpemVvZihzdHJ1Y3QgaHZfcmluZ19idWZmZXIpICE9IFBBR0VfU0laRSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQltZW1zZXQoUmluZ0luZm8sIDAsIHNpemVvZihzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbykpOworCW1lbXNldChyaW5nX2luZm8sIDAsIHNpemVvZihzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbykpOwogCi0JUmluZ0luZm8tPlJpbmdCdWZmZXIgPSAoc3RydWN0IGh2X3JpbmdfYnVmZmVyICopQnVmZmVyOwotCVJpbmdJbmZvLT5SaW5nQnVmZmVyLT5SZWFkSW5kZXggPSBSaW5nSW5mby0+UmluZ0J1ZmZlci0+V3JpdGVJbmRleCA9IDA7CisJcmluZ19pbmZvLT5yaW5nX2J1ZmZlciA9IChzdHJ1Y3QgaHZfcmluZ19idWZmZXIgKilidWZmZXI7CisJcmluZ19pbmZvLT5yaW5nX2J1ZmZlci0+cmVhZF9pbmRleCA9CisJCXJpbmdfaW5mby0+cmluZ19idWZmZXItPndyaXRlX2luZGV4ID0gMDsKIAotCVJpbmdJbmZvLT5SaW5nU2l6ZSA9IEJ1ZmZlckxlbjsKLQlSaW5nSW5mby0+UmluZ0RhdGFTaXplID0gQnVmZmVyTGVuIC0gc2l6ZW9mKHN0cnVjdCBodl9yaW5nX2J1ZmZlcik7CisJcmluZ19pbmZvLT5yaW5nX3NpemUgPSBidWZsZW47CisJcmluZ19pbmZvLT5yaW5nX2RhdGFzaXplID0gYnVmbGVuIC0gc2l6ZW9mKHN0cnVjdCBodl9yaW5nX2J1ZmZlcik7CiAKLQlzcGluX2xvY2tfaW5pdCgmUmluZ0luZm8tPnJpbmdfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnJpbmdfaW5mby0+cmluZ19sb2NrKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzIwLDk3ICszMjgsOTcgQEAKIC8qKysKIAogTmFtZToKLQlSaW5nQnVmZmVyQ2xlYW51cCgpCisJcmluZ2J1ZmZlcl9jbGVhbnVwKCkKIAogRGVzY3JpcHRpb246CiAJQ2xlYW51cCB0aGUgcmluZyBidWZmZXIKIAogLS0qLwotdm9pZCBSaW5nQnVmZmVyQ2xlYW51cChzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqUmluZ0luZm8pCit2b2lkIHJpbmdidWZmZXJfY2xlYW51cChzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqcmluZ19pbmZvKQogewogfQogCiAvKisrCiAKIE5hbWU6Ci0JUmluZ0J1ZmZlcldyaXRlKCkKKwlyaW5nYnVmZmVyX3dyaXRlKCkKIAogRGVzY3JpcHRpb246CiAJV3JpdGUgdG8gdGhlIHJpbmcgYnVmZmVyCiAKIC0tKi8KLWludCBSaW5nQnVmZmVyV3JpdGUoc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKk91dFJpbmdJbmZvLAoraW50IHJpbmdidWZmZXJfd3JpdGUoc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKm91dHJpbmdfaW5mbywKIAkJICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0LCB1MzIgc2djb3VudCkKIHsKIAlpbnQgaSA9IDA7Ci0JdTMyIGJ5dGVBdmFpbFRvV3JpdGU7Ci0JdTMyIGJ5dGVBdmFpbFRvUmVhZDsKLQl1MzIgdG90YWxCeXRlc1RvV3JpdGUgPSAwOworCXUzMiBieXRlc19hdmFpbF90b3dyaXRlOworCXUzMiBieXRlc19hdmFpbF90b3JlYWQ7CisJdTMyIHRvdGFsYnl0ZXNfdG93cml0ZSA9IDA7CiAKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwotCXZvbGF0aWxlIHUzMiBuZXh0V3JpdGVMb2NhdGlvbjsKLQl1NjQgcHJldkluZGljZXMgPSAwOworCXZvbGF0aWxlIHUzMiBuZXh0X3dyaXRlX2xvY2F0aW9uOworCXU2NCBwcmV2X2luZGljZXMgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlmb3JfZWFjaF9zZyhzZ2xpc3QsIHNnLCBzZ2NvdW50LCBpKQogCXsKLQkJdG90YWxCeXRlc1RvV3JpdGUgKz0gc2ctPmxlbmd0aDsKKwkJdG90YWxieXRlc190b3dyaXRlICs9IHNnLT5sZW5ndGg7CiAJfQogCi0JdG90YWxCeXRlc1RvV3JpdGUgKz0gc2l6ZW9mKHU2NCk7CisJdG90YWxieXRlc190b3dyaXRlICs9IHNpemVvZih1NjQpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJk91dFJpbmdJbmZvLT5yaW5nX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmb3V0cmluZ19pbmZvLT5yaW5nX2xvY2ssIGZsYWdzKTsKIAotCUdldFJpbmdCdWZmZXJBdmFpbEJ5dGVzKE91dFJpbmdJbmZvLAotCQkJCSZieXRlQXZhaWxUb1JlYWQsCi0JCQkJJmJ5dGVBdmFpbFRvV3JpdGUpOworCWdldF9yaW5nYnVmZmVyX2F2YWlsYnl0ZXMob3V0cmluZ19pbmZvLAorCQkJCSZieXRlc19hdmFpbF90b3JlYWQsCisJCQkJJmJ5dGVzX2F2YWlsX3Rvd3JpdGUpOwogCi0JRFBSSU5UX0RCRyhWTUJVUywgIldyaXRpbmcgJXUgYnl0ZXMuLi4iLCB0b3RhbEJ5dGVzVG9Xcml0ZSk7CisJRFBSSU5UX0RCRyhWTUJVUywgIldyaXRpbmcgJXUgYnl0ZXMuLi4iLCB0b3RhbGJ5dGVzX3Rvd3JpdGUpOwogCi0JLyogRHVtcFJpbmdJbmZvKE91dFJpbmdJbmZvLCAiQkVGT1JFICIpOyAqLworCS8qIER1bXByaW5nX2luZm8oT3V0cmluZ19pbmZvLCAiQkVGT1JFICIpOyAqLwogCiAJLyogSWYgdGhlcmUgaXMgb25seSByb29tIGZvciB0aGUgcGFja2V0LCBhc3N1bWUgaXQgaXMgZnVsbC4gKi8KIAkvKiBPdGhlcndpc2UsIHRoZSBuZXh0IHRpbWUgYXJvdW5kLCB3ZSB0aGluayB0aGUgcmluZyBidWZmZXIgKi8KIAkvKiBpcyBlbXB0eSBzaW5jZSB0aGUgcmVhZCBpbmRleCA9PSB3cml0ZSBpbmRleCAqLwotCWlmIChieXRlQXZhaWxUb1dyaXRlIDw9IHRvdGFsQnl0ZXNUb1dyaXRlKSB7CisJaWYgKGJ5dGVzX2F2YWlsX3Rvd3JpdGUgPD0gdG90YWxieXRlc190b3dyaXRlKSB7CiAJCURQUklOVF9EQkcoVk1CVVMsCiAJCQkiTm8gbW9yZSBzcGFjZSBsZWZ0IG9uIG91dGJvdW5kIHJpbmcgYnVmZmVyICIKIAkJCSIobmVlZGVkICV1LCBhdmFpbCAldSkiLAotCQkJdG90YWxCeXRlc1RvV3JpdGUsCi0JCQlieXRlQXZhaWxUb1dyaXRlKTsKKwkJCXRvdGFsYnl0ZXNfdG93cml0ZSwKKwkJCWJ5dGVzX2F2YWlsX3Rvd3JpdGUpOwogCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJk91dFJpbmdJbmZvLT5yaW5nX2xvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3V0cmluZ19pbmZvLT5yaW5nX2xvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIC0xOwogCX0KIAogCS8qIFdyaXRlIHRvIHRoZSByaW5nIGJ1ZmZlciAqLwotCW5leHRXcml0ZUxvY2F0aW9uID0gR2V0TmV4dFdyaXRlTG9jYXRpb24oT3V0UmluZ0luZm8pOworCW5leHRfd3JpdGVfbG9jYXRpb24gPSBnZXRfbmV4dF93cml0ZV9sb2NhdGlvbihvdXRyaW5nX2luZm8pOwogCiAJZm9yX2VhY2hfc2coc2dsaXN0LCBzZywgc2djb3VudCwgaSkKIAl7Ci0JCW5leHRXcml0ZUxvY2F0aW9uID0gQ29weVRvUmluZ0J1ZmZlcihPdXRSaW5nSW5mbywKLQkJCQkJCSAgICAgbmV4dFdyaXRlTG9jYXRpb24sCisJCW5leHRfd3JpdGVfbG9jYXRpb24gPSBjb3B5dG9fcmluZ2J1ZmZlcihvdXRyaW5nX2luZm8sCisJCQkJCQkgICAgIG5leHRfd3JpdGVfbG9jYXRpb24sCiAJCQkJCQkgICAgIHNnX3ZpcnQoc2cpLAogCQkJCQkJICAgICBzZy0+bGVuZ3RoKTsKIAl9CiAKIAkvKiBTZXQgcHJldmlvdXMgcGFja2V0IHN0YXJ0ICovCi0JcHJldkluZGljZXMgPSBHZXRSaW5nQnVmZmVySW5kaWNlcyhPdXRSaW5nSW5mbyk7CisJcHJldl9pbmRpY2VzID0gZ2V0X3JpbmdfYnVmZmVyaW5kaWNlcyhvdXRyaW5nX2luZm8pOwogCi0JbmV4dFdyaXRlTG9jYXRpb24gPSBDb3B5VG9SaW5nQnVmZmVyKE91dFJpbmdJbmZvLAotCQkJCQkgICAgIG5leHRXcml0ZUxvY2F0aW9uLAotCQkJCQkgICAgICZwcmV2SW5kaWNlcywKKwluZXh0X3dyaXRlX2xvY2F0aW9uID0gY29weXRvX3JpbmdidWZmZXIob3V0cmluZ19pbmZvLAorCQkJCQkgICAgIG5leHRfd3JpdGVfbG9jYXRpb24sCisJCQkJCSAgICAgJnByZXZfaW5kaWNlcywKIAkJCQkJICAgICBzaXplb2YodTY0KSk7CiAKIAkvKiBNYWtlIHN1cmUgd2UgZmx1c2ggYWxsIHdyaXRlcyBiZWZvcmUgdXBkYXRpbmcgdGhlIHdyaXRlSW5kZXggKi8KIAltYigpOwogCiAJLyogTm93LCB1cGRhdGUgdGhlIHdyaXRlIGxvY2F0aW9uICovCi0JU2V0TmV4dFdyaXRlTG9jYXRpb24oT3V0UmluZ0luZm8sIG5leHRXcml0ZUxvY2F0aW9uKTsKKwlzZXRfbmV4dF93cml0ZV9sb2NhdGlvbihvdXRyaW5nX2luZm8sIG5leHRfd3JpdGVfbG9jYXRpb24pOwogCi0JLyogRHVtcFJpbmdJbmZvKE91dFJpbmdJbmZvLCAiQUZURVIgIik7ICovCisJLyogRHVtcHJpbmdfaW5mbyhPdXRyaW5nX2luZm8sICJBRlRFUiAiKTsgKi8KIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJk91dFJpbmdJbmZvLT5yaW5nX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvdXRyaW5nX2luZm8tPnJpbmdfbG9jaywgZmxhZ3MpOwogCXJldHVybiAwOwogfQogCkBAIC00MTgsNDcgKzQyNiw0OCBAQAogLyorKwogCiBOYW1lOgotCVJpbmdCdWZmZXJQZWVrKCkKKwlyaW5nYnVmZmVyX3BlZWsoKQogCiBEZXNjcmlwdGlvbjoKIAlSZWFkIHdpdGhvdXQgYWR2YW5jaW5nIHRoZSByZWFkIGluZGV4CiAKIC0tKi8KLWludCBSaW5nQnVmZmVyUGVlayhzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqSW5SaW5nSW5mbywgdm9pZCAqQnVmZmVyLCB1MzIgQnVmZmVyTGVuKQoraW50IHJpbmdidWZmZXJfcGVlayhzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqSW5yaW5nX2luZm8sCisJCSAgIHZvaWQgKkJ1ZmZlciwgdTMyIGJ1ZmxlbikKIHsKLQl1MzIgYnl0ZXNBdmFpbFRvV3JpdGU7Ci0JdTMyIGJ5dGVzQXZhaWxUb1JlYWQ7Ci0JdTMyIG5leHRSZWFkTG9jYXRpb24gPSAwOworCXUzMiBieXRlc19hdmFpbF90b3dyaXRlOworCXUzMiBieXRlc19hdmFpbF90b3JlYWQ7CisJdTMyIG5leHRfcmVhZF9sb2NhdGlvbiA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZJblJpbmdJbmZvLT5yaW5nX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmSW5yaW5nX2luZm8tPnJpbmdfbG9jaywgZmxhZ3MpOwogCi0JR2V0UmluZ0J1ZmZlckF2YWlsQnl0ZXMoSW5SaW5nSW5mbywKLQkJCQkmYnl0ZXNBdmFpbFRvUmVhZCwKLQkJCQkmYnl0ZXNBdmFpbFRvV3JpdGUpOworCWdldF9yaW5nYnVmZmVyX2F2YWlsYnl0ZXMoSW5yaW5nX2luZm8sCisJCQkJJmJ5dGVzX2F2YWlsX3RvcmVhZCwKKwkJCQkmYnl0ZXNfYXZhaWxfdG93cml0ZSk7CiAKIAkvKiBNYWtlIHN1cmUgdGhlcmUgaXMgc29tZXRoaW5nIHRvIHJlYWQgKi8KLQlpZiAoYnl0ZXNBdmFpbFRvUmVhZCA8IEJ1ZmZlckxlbikgeworCWlmIChieXRlc19hdmFpbF90b3JlYWQgPCBidWZsZW4pIHsKIAkJLyogRFBSSU5UX0RCRyhWTUJVUywKIAkJCSJnb3QgY2FsbGJhY2sgYnV0IG5vdCBlbm91Z2ggdG8gcmVhZCAiCiAJCQkiPGF2YWlsIHRvIHJlYWQgJWQgcmVhZCBzaXplICVkPiEhIiwKLQkJCWJ5dGVzQXZhaWxUb1JlYWQsCisJCQlieXRlc19hdmFpbF90b3JlYWQsCiAJCQlCdWZmZXJMZW4pOyAqLwogCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJkluUmluZ0luZm8tPnJpbmdfbG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZJbnJpbmdfaW5mby0+cmluZ19sb2NrLCBmbGFncyk7CiAKIAkJcmV0dXJuIC0xOwogCX0KIAogCS8qIENvbnZlcnQgdG8gYnl0ZSBvZmZzZXQgKi8KLQluZXh0UmVhZExvY2F0aW9uID0gR2V0TmV4dFJlYWRMb2NhdGlvbihJblJpbmdJbmZvKTsKKwluZXh0X3JlYWRfbG9jYXRpb24gPSBnZXRfbmV4dF9yZWFkX2xvY2F0aW9uKElucmluZ19pbmZvKTsKIAotCW5leHRSZWFkTG9jYXRpb24gPSBDb3B5RnJvbVJpbmdCdWZmZXIoSW5SaW5nSW5mbywKKwluZXh0X3JlYWRfbG9jYXRpb24gPSBjb3B5ZnJvbV9yaW5nYnVmZmVyKElucmluZ19pbmZvLAogCQkJCQkJQnVmZmVyLAotCQkJCQkJQnVmZmVyTGVuLAotCQkJCQkJbmV4dFJlYWRMb2NhdGlvbik7CisJCQkJCQlidWZsZW4sCisJCQkJCQluZXh0X3JlYWRfbG9jYXRpb24pOwogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmSW5SaW5nSW5mby0+cmluZ19sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmSW5yaW5nX2luZm8tPnJpbmdfbG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00NjcsNTggKzQ3Niw1OSBAQAogLyorKwogCiBOYW1lOgotCVJpbmdCdWZmZXJSZWFkKCkKKwlyaW5nYnVmZmVyX3JlYWQoKQogCiBEZXNjcmlwdGlvbjoKIAlSZWFkIGFuZCBhZHZhbmNlIHRoZSByZWFkIGluZGV4CiAKIC0tKi8KLWludCBSaW5nQnVmZmVyUmVhZChzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqSW5SaW5nSW5mbywgdm9pZCAqQnVmZmVyLAotCQkgICB1MzIgQnVmZmVyTGVuLCB1MzIgT2Zmc2V0KQoraW50IHJpbmdidWZmZXJfcmVhZChzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqaW5yaW5nX2luZm8sIHZvaWQgKmJ1ZmZlciwKKwkJICAgdTMyIGJ1ZmxlbiwgdTMyIG9mZnNldCkKIHsKLQl1MzIgYnl0ZXNBdmFpbFRvV3JpdGU7Ci0JdTMyIGJ5dGVzQXZhaWxUb1JlYWQ7Ci0JdTMyIG5leHRSZWFkTG9jYXRpb24gPSAwOwotCXU2NCBwcmV2SW5kaWNlcyA9IDA7CisJdTMyIGJ5dGVzX2F2YWlsX3Rvd3JpdGU7CisJdTMyIGJ5dGVzX2F2YWlsX3RvcmVhZDsKKwl1MzIgbmV4dF9yZWFkX2xvY2F0aW9uID0gMDsKKwl1NjQgcHJldl9pbmRpY2VzID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKEJ1ZmZlckxlbiA8PSAwKQorCWlmIChidWZsZW4gPD0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmSW5SaW5nSW5mby0+cmluZ19sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmlucmluZ19pbmZvLT5yaW5nX2xvY2ssIGZsYWdzKTsKIAotCUdldFJpbmdCdWZmZXJBdmFpbEJ5dGVzKEluUmluZ0luZm8sCi0JCQkJJmJ5dGVzQXZhaWxUb1JlYWQsCi0JCQkJJmJ5dGVzQXZhaWxUb1dyaXRlKTsKKwlnZXRfcmluZ2J1ZmZlcl9hdmFpbGJ5dGVzKGlucmluZ19pbmZvLAorCQkJCSZieXRlc19hdmFpbF90b3JlYWQsCisJCQkJJmJ5dGVzX2F2YWlsX3Rvd3JpdGUpOwogCi0JRFBSSU5UX0RCRyhWTUJVUywgIlJlYWRpbmcgJXUgYnl0ZXMuLi4iLCBCdWZmZXJMZW4pOworCURQUklOVF9EQkcoVk1CVVMsICJSZWFkaW5nICV1IGJ5dGVzLi4uIiwgYnVmbGVuKTsKIAotCS8qIER1bXBSaW5nSW5mbyhJblJpbmdJbmZvLCAiQkVGT1JFICIpOyAqLworCS8qIER1bXByaW5nX2luZm8oSW5yaW5nX2luZm8sICJCRUZPUkUgIik7ICovCiAKIAkvKiBNYWtlIHN1cmUgdGhlcmUgaXMgc29tZXRoaW5nIHRvIHJlYWQgKi8KLQlpZiAoYnl0ZXNBdmFpbFRvUmVhZCA8IEJ1ZmZlckxlbikgeworCWlmIChieXRlc19hdmFpbF90b3JlYWQgPCBidWZsZW4pIHsKIAkJRFBSSU5UX0RCRyhWTUJVUywKIAkJCSJnb3QgY2FsbGJhY2sgYnV0IG5vdCBlbm91Z2ggdG8gcmVhZCAiCiAJCQkiPGF2YWlsIHRvIHJlYWQgJWQgcmVhZCBzaXplICVkPiEhIiwKLQkJCWJ5dGVzQXZhaWxUb1JlYWQsCi0JCQlCdWZmZXJMZW4pOworCQkJYnl0ZXNfYXZhaWxfdG9yZWFkLAorCQkJYnVmbGVuKTsKIAotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZJblJpbmdJbmZvLT5yaW5nX2xvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5yaW5nX2luZm8tPnJpbmdfbG9jaywgZmxhZ3MpOwogCiAJCXJldHVybiAtMTsKIAl9CiAKLQluZXh0UmVhZExvY2F0aW9uID0gR2V0TmV4dFJlYWRMb2NhdGlvbldpdGhPZmZzZXQoSW5SaW5nSW5mbywgT2Zmc2V0KTsKKwluZXh0X3JlYWRfbG9jYXRpb24gPQorCQlnZXRfbmV4dF9yZWFkbG9jYXRpb25fd2l0aG9mZnNldChpbnJpbmdfaW5mbywgb2Zmc2V0KTsKIAotCW5leHRSZWFkTG9jYXRpb24gPSBDb3B5RnJvbVJpbmdCdWZmZXIoSW5SaW5nSW5mbywKLQkJCQkJCUJ1ZmZlciwKLQkJCQkJCUJ1ZmZlckxlbiwKLQkJCQkJCW5leHRSZWFkTG9jYXRpb24pOworCW5leHRfcmVhZF9sb2NhdGlvbiA9IGNvcHlmcm9tX3JpbmdidWZmZXIoaW5yaW5nX2luZm8sCisJCQkJCQlidWZmZXIsCisJCQkJCQlidWZsZW4sCisJCQkJCQluZXh0X3JlYWRfbG9jYXRpb24pOwogCi0JbmV4dFJlYWRMb2NhdGlvbiA9IENvcHlGcm9tUmluZ0J1ZmZlcihJblJpbmdJbmZvLAotCQkJCQkJJnByZXZJbmRpY2VzLAorCW5leHRfcmVhZF9sb2NhdGlvbiA9IGNvcHlmcm9tX3JpbmdidWZmZXIoaW5yaW5nX2luZm8sCisJCQkJCQkmcHJldl9pbmRpY2VzLAogCQkJCQkJc2l6ZW9mKHU2NCksCi0JCQkJCQluZXh0UmVhZExvY2F0aW9uKTsKKwkJCQkJCW5leHRfcmVhZF9sb2NhdGlvbik7CiAKIAkvKiBNYWtlIHN1cmUgYWxsIHJlYWRzIGFyZSBkb25lIGJlZm9yZSB3ZSB1cGRhdGUgdGhlIHJlYWQgaW5kZXggc2luY2UgKi8KIAkvKiB0aGUgd3JpdGVyIG1heSBzdGFydCB3cml0aW5nIHRvIHRoZSByZWFkIGFyZWEgb25jZSB0aGUgcmVhZCBpbmRleCAqLwpAQCAtNTI2LDExICs1MzYsMTEgQEAKIAltYigpOwogCiAJLyogVXBkYXRlIHRoZSByZWFkIGluZGV4ICovCi0JU2V0TmV4dFJlYWRMb2NhdGlvbihJblJpbmdJbmZvLCBuZXh0UmVhZExvY2F0aW9uKTsKKwlzZXRfbmV4dF9yZWFkX2xvY2F0aW9uKGlucmluZ19pbmZvLCBuZXh0X3JlYWRfbG9jYXRpb24pOwogCi0JLyogRHVtcFJpbmdJbmZvKEluUmluZ0luZm8sICJBRlRFUiAiKTsgKi8KKwkvKiBEdW1wcmluZ19pbmZvKElucmluZ19pbmZvLCAiQUZURVIgIik7ICovCiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZJblJpbmdJbmZvLT5yaW5nX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnJpbmdfaW5mby0+cmluZ19sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTUzOSw3ICs1NDksNyBAQAogLyorKwogCiBOYW1lOgotCUNvcHlUb1JpbmdCdWZmZXIoKQorCWNvcHl0b19yaW5nYnVmZmVyKCkKIAogRGVzY3JpcHRpb246CiAJSGVscGVyIHJvdXRpbmUgdG8gY29weSBmcm9tIHNvdXJjZSB0byByaW5nIGJ1ZmZlci4KQEAgLTU0NywzNyArNTU3LDM3IEBACiAKIC0tKi8KIHN0YXRpYyB1MzIKLUNvcHlUb1JpbmdCdWZmZXIoCi0Jc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8JKlJpbmdJbmZvLAotCXUzMgkJCQlTdGFydFdyaXRlT2Zmc2V0LAotCXZvaWQJCQkJKlNyYywKLQl1MzIJCQkJU3JjTGVuKQorY29weXRvX3JpbmdidWZmZXIoCisJc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8JKnJpbmdfaW5mbywKKwl1MzIJCQkJc3RhcnRfd3JpdGVfb2Zmc2V0LAorCXZvaWQJCQkJKnNyYywKKwl1MzIJCQkJc3JjbGVuKQogewotCXZvaWQgKnJpbmdCdWZmZXIgPSBHZXRSaW5nQnVmZmVyKFJpbmdJbmZvKTsKLQl1MzIgcmluZ0J1ZmZlclNpemUgPSBHZXRSaW5nQnVmZmVyU2l6ZShSaW5nSW5mbyk7Ci0JdTMyIGZyYWdMZW47CisJdm9pZCAqcmluZ19idWZmZXIgPSBnZXRfcmluZ19idWZmZXIocmluZ19pbmZvKTsKKwl1MzIgcmluZ19idWZmZXJfc2l6ZSA9IGdldF9yaW5nX2J1ZmZlcnNpemUocmluZ19pbmZvKTsKKwl1MzIgZnJhZ19sZW47CiAKIAkvKiB3cmFwLWFyb3VuZCBkZXRlY3RlZCEgKi8KLQlpZiAoU3JjTGVuID4gcmluZ0J1ZmZlclNpemUgLSBTdGFydFdyaXRlT2Zmc2V0KSB7CisJaWYgKHNyY2xlbiA+IHJpbmdfYnVmZmVyX3NpemUgLSBzdGFydF93cml0ZV9vZmZzZXQpIHsKIAkJRFBSSU5UX0RCRyhWTUJVUywgIndyYXAtYXJvdW5kIGRldGVjdGVkISIpOwogCi0JCWZyYWdMZW4gPSByaW5nQnVmZmVyU2l6ZSAtIFN0YXJ0V3JpdGVPZmZzZXQ7Ci0JCW1lbWNweShyaW5nQnVmZmVyICsgU3RhcnRXcml0ZU9mZnNldCwgU3JjLCBmcmFnTGVuKTsKLQkJbWVtY3B5KHJpbmdCdWZmZXIsIFNyYyArIGZyYWdMZW4sIFNyY0xlbiAtIGZyYWdMZW4pOworCQlmcmFnX2xlbiA9IHJpbmdfYnVmZmVyX3NpemUgLSBzdGFydF93cml0ZV9vZmZzZXQ7CisJCW1lbWNweShyaW5nX2J1ZmZlciArIHN0YXJ0X3dyaXRlX29mZnNldCwgc3JjLCBmcmFnX2xlbik7CisJCW1lbWNweShyaW5nX2J1ZmZlciwgc3JjICsgZnJhZ19sZW4sIHNyY2xlbiAtIGZyYWdfbGVuKTsKIAl9IGVsc2UKLQkJbWVtY3B5KHJpbmdCdWZmZXIgKyBTdGFydFdyaXRlT2Zmc2V0LCBTcmMsIFNyY0xlbik7CisJCW1lbWNweShyaW5nX2J1ZmZlciArIHN0YXJ0X3dyaXRlX29mZnNldCwgc3JjLCBzcmNsZW4pOwogCi0JU3RhcnRXcml0ZU9mZnNldCArPSBTcmNMZW47Ci0JU3RhcnRXcml0ZU9mZnNldCAlPSByaW5nQnVmZmVyU2l6ZTsKKwlzdGFydF93cml0ZV9vZmZzZXQgKz0gc3JjbGVuOworCXN0YXJ0X3dyaXRlX29mZnNldCAlPSByaW5nX2J1ZmZlcl9zaXplOwogCi0JcmV0dXJuIFN0YXJ0V3JpdGVPZmZzZXQ7CisJcmV0dXJuIHN0YXJ0X3dyaXRlX29mZnNldDsKIH0KIAogCiAvKisrCiAKIE5hbWU6Ci0JQ29weUZyb21SaW5nQnVmZmVyKCkKKwljb3B5ZnJvbV9yaW5nYnVmZmVyKCkKIAogRGVzY3JpcHRpb246CiAJSGVscGVyIHJvdXRpbmUgdG8gY29weSB0byBzb3VyY2UgZnJvbSByaW5nIGJ1ZmZlci4KQEAgLTU4NSwzNCArNTk1LDM0IEBACiAKIC0tKi8KIHN0YXRpYyB1MzIKLUNvcHlGcm9tUmluZ0J1ZmZlcigKLQlzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbwkqUmluZ0luZm8sCi0Jdm9pZAkJCQkqRGVzdCwKLQl1MzIJCQkJRGVzdExlbiwKLQl1MzIJCQkJU3RhcnRSZWFkT2Zmc2V0KQorY29weWZyb21fcmluZ2J1ZmZlcigKKwlzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbwkqcmluZ19pbmZvLAorCXZvaWQJCQkJKmRlc3QsCisJdTMyCQkJCWRlc3RsZW4sCisJdTMyCQkJCXN0YXJ0X3JlYWRfb2Zmc2V0KQogewotCXZvaWQgKnJpbmdCdWZmZXIgPSBHZXRSaW5nQnVmZmVyKFJpbmdJbmZvKTsKLQl1MzIgcmluZ0J1ZmZlclNpemUgPSBHZXRSaW5nQnVmZmVyU2l6ZShSaW5nSW5mbyk7CisJdm9pZCAqcmluZ19idWZmZXIgPSBnZXRfcmluZ19idWZmZXIocmluZ19pbmZvKTsKKwl1MzIgcmluZ19idWZmZXJfc2l6ZSA9IGdldF9yaW5nX2J1ZmZlcnNpemUocmluZ19pbmZvKTsKIAotCXUzMiBmcmFnTGVuOworCXUzMiBmcmFnX2xlbjsKIAogCS8qIHdyYXAtYXJvdW5kIGRldGVjdGVkIGF0IHRoZSBzcmMgKi8KLQlpZiAoRGVzdExlbiA+IHJpbmdCdWZmZXJTaXplIC0gU3RhcnRSZWFkT2Zmc2V0KSB7CisJaWYgKGRlc3RsZW4gPiByaW5nX2J1ZmZlcl9zaXplIC0gc3RhcnRfcmVhZF9vZmZzZXQpIHsKIAkJRFBSSU5UX0RCRyhWTUJVUywgInNyYyB3cmFwLWFyb3VuZCBkZXRlY3RlZCEiKTsKIAotCQlmcmFnTGVuID0gcmluZ0J1ZmZlclNpemUgLSBTdGFydFJlYWRPZmZzZXQ7CisJCWZyYWdfbGVuID0gcmluZ19idWZmZXJfc2l6ZSAtIHN0YXJ0X3JlYWRfb2Zmc2V0OwogCi0JCW1lbWNweShEZXN0LCByaW5nQnVmZmVyICsgU3RhcnRSZWFkT2Zmc2V0LCBmcmFnTGVuKTsKLQkJbWVtY3B5KERlc3QgKyBmcmFnTGVuLCByaW5nQnVmZmVyLCBEZXN0TGVuIC0gZnJhZ0xlbik7CisJCW1lbWNweShkZXN0LCByaW5nX2J1ZmZlciArIHN0YXJ0X3JlYWRfb2Zmc2V0LCBmcmFnX2xlbik7CisJCW1lbWNweShkZXN0ICsgZnJhZ19sZW4sIHJpbmdfYnVmZmVyLCBkZXN0bGVuIC0gZnJhZ19sZW4pOwogCX0gZWxzZQogCi0JCW1lbWNweShEZXN0LCByaW5nQnVmZmVyICsgU3RhcnRSZWFkT2Zmc2V0LCBEZXN0TGVuKTsKKwkJbWVtY3B5KGRlc3QsIHJpbmdfYnVmZmVyICsgc3RhcnRfcmVhZF9vZmZzZXQsIGRlc3RsZW4pOwogCiAKLQlTdGFydFJlYWRPZmZzZXQgKz0gRGVzdExlbjsKLQlTdGFydFJlYWRPZmZzZXQgJT0gcmluZ0J1ZmZlclNpemU7CisJc3RhcnRfcmVhZF9vZmZzZXQgKz0gZGVzdGxlbjsKKwlzdGFydF9yZWFkX29mZnNldCAlPSByaW5nX2J1ZmZlcl9zaXplOwogCi0JcmV0dXJuIFN0YXJ0UmVhZE9mZnNldDsKKwlyZXR1cm4gc3RhcnRfcmVhZF9vZmZzZXQ7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L3JpbmdfYnVmZmVyLmggYi9kcml2ZXJzL3N0YWdpbmcvaHYvcmluZ19idWZmZXIuaAppbmRleCBhN2YxNzE3Li43YmQ2ZWNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvcmluZ19idWZmZXIuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaHYvcmluZ19idWZmZXIuaApAQCAtMjksMTggKzI5LDE4IEBACiAKIHN0cnVjdCBodl9yaW5nX2J1ZmZlciB7CiAJLyogT2Zmc2V0IGluIGJ5dGVzIGZyb20gdGhlIHN0YXJ0IG9mIHJpbmcgZGF0YSBiZWxvdyAqLwotCXZvbGF0aWxlIHUzMiBXcml0ZUluZGV4OworCXZvbGF0aWxlIHUzMiB3cml0ZV9pbmRleDsKIAogCS8qIE9mZnNldCBpbiBieXRlcyBmcm9tIHRoZSBzdGFydCBvZiByaW5nIGRhdGEgYmVsb3cgKi8KLQl2b2xhdGlsZSB1MzIgUmVhZEluZGV4OworCXZvbGF0aWxlIHUzMiByZWFkX2luZGV4OwogCi0Jdm9sYXRpbGUgdTMyIEludGVycnVwdE1hc2s7CisJdm9sYXRpbGUgdTMyIGludGVycnVwdF9tYXNrOwogCiAJLyogUGFkIGl0IHRvIFBBR0VfU0laRSBzbyB0aGF0IGRhdGEgc3RhcnRzIG9uIHBhZ2UgYm91bmRhcnkgKi8KLQl1OAlSZXNlcnZlZFs0MDg0XTsKKwl1OAlyZXNlcnZlZFs0MDg0XTsKIAogCS8qIE5PVEU6Ci0JICogVGhlIEludGVycnVwdE1hc2sgZmllbGQgaXMgdXNlZCBvbmx5IGZvciBjaGFubmVscyBidXQgc2luY2Ugb3VyCisJICogVGhlIGludGVycnVwdF9tYXNrIGZpZWxkIGlzIHVzZWQgb25seSBmb3IgY2hhbm5lbHMgYnV0IHNpbmNlIG91cgogCSAqIHZtYnVzIGNvbm5lY3Rpb24gYWxzbyB1c2VzIHRoaXMgZGF0YSBzdHJ1Y3R1cmUgYW5kIGl0cyBkYXRhIHN0YXJ0cwogCSAqIGhlcmUsIHdlIGNvbW1lbnRlZCBvdXQgdGhpcyBmaWVsZC4KIAkgKi8KQEAgLTUwLDI0ICs1MCwyNCBAQAogCSAqIFJpbmcgZGF0YSBzdGFydHMgaGVyZSArIFJpbmdEYXRhU3RhcnRPZmZzZXQKIAkgKiAhISEgRE8gTk9UIHBsYWNlIGFueSBmaWVsZHMgYmVsb3cgdGhpcyAhISEKIAkgKi8KLQl1OCBCdWZmZXJbMF07CisJdTggYnVmZmVyWzBdOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gewotCXN0cnVjdCBodl9yaW5nX2J1ZmZlciAqUmluZ0J1ZmZlcjsKLQl1MzIgUmluZ1NpemU7CQkJLyogSW5jbHVkZSB0aGUgc2hhcmVkIGhlYWRlciAqLworCXN0cnVjdCBodl9yaW5nX2J1ZmZlciAqcmluZ19idWZmZXI7CisJdTMyIHJpbmdfc2l6ZTsJCQkvKiBJbmNsdWRlIHRoZSBzaGFyZWQgaGVhZGVyICovCiAJc3BpbmxvY2tfdCByaW5nX2xvY2s7CiAKLQl1MzIgUmluZ0RhdGFTaXplOwkJLyogPCByaW5nU2l6ZSAqLwotCXUzMiBSaW5nRGF0YVN0YXJ0T2Zmc2V0OworCXUzMiByaW5nX2RhdGFzaXplOwkJLyogPCByaW5nX3NpemUgKi8KKwl1MzIgcmluZ19kYXRhX3N0YXJ0b2Zmc2V0OwogfTsKIAogc3RydWN0IGh2X3JpbmdfYnVmZmVyX2RlYnVnX2luZm8gewotCXUzMiBDdXJyZW50SW50ZXJydXB0TWFzazsKLQl1MzIgQ3VycmVudFJlYWRJbmRleDsKLQl1MzIgQ3VycmVudFdyaXRlSW5kZXg7Ci0JdTMyIEJ5dGVzQXZhaWxUb1JlYWQ7Ci0JdTMyIEJ5dGVzQXZhaWxUb1dyaXRlOworCXUzMiBjdXJyZW50X2ludGVycnVwdF9tYXNrOworCXUzMiBjdXJyZW50X3JlYWRfaW5kZXg7CisJdTMyIGN1cnJlbnRfd3JpdGVfaW5kZXg7CisJdTMyIGJ5dGVzX2F2YWlsX3RvcmVhZDsKKwl1MzIgYnl0ZXNfYXZhaWxfdG93cml0ZTsKIH07CiAKIApAQCAtNzUsMjggKzc1LDI4IEBACiAvKiBJbnRlcmZhY2UgKi8KIAogCi1pbnQgUmluZ0J1ZmZlckluaXQoc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKlJpbmdJbmZvLCB2b2lkICpCdWZmZXIsCi0JCSAgIHUzMiBCdWZmZXJMZW4pOworaW50IHJpbmdidWZmZXJfaW5pdChzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqcmluZ19pbmZvLCB2b2lkICpidWZmZXIsCisJCSAgIHUzMiBidWZsZW4pOwogCi12b2lkIFJpbmdCdWZmZXJDbGVhbnVwKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpSaW5nSW5mbyk7Cit2b2lkIHJpbmdidWZmZXJfY2xlYW51cChzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqcmluZ19pbmZvKTsKIAotaW50IFJpbmdCdWZmZXJXcml0ZShzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqUmluZ0luZm8sCitpbnQgcmluZ2J1ZmZlcl93cml0ZShzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqcmluZ19pbmZvLAogCQkgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsCiAJCSAgICB1MzIgc2djb3VudCk7CiAKLWludCBSaW5nQnVmZmVyUGVlayhzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqUmluZ0luZm8sIHZvaWQgKkJ1ZmZlciwKLQkJICAgdTMyIEJ1ZmZlckxlbik7CitpbnQgcmluZ2J1ZmZlcl9wZWVrKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpyaW5nX2luZm8sIHZvaWQgKmJ1ZmZlciwKKwkJICAgdTMyIGJ1Zmxlbik7CiAKLWludCBSaW5nQnVmZmVyUmVhZChzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqUmluZ0luZm8sCi0JCSAgIHZvaWQgKkJ1ZmZlciwKLQkJICAgdTMyIEJ1ZmZlckxlbiwKLQkJICAgdTMyIE9mZnNldCk7CitpbnQgcmluZ2J1ZmZlcl9yZWFkKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpyaW5nX2luZm8sCisJCSAgIHZvaWQgKmJ1ZmZlciwKKwkJICAgdTMyIGJ1ZmxlbiwKKwkJICAgdTMyIG9mZnNldCk7CiAKLXUzMiBHZXRSaW5nQnVmZmVySW50ZXJydXB0TWFzayhzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqUmluZ0luZm8pOwordTMyIGdldF9yaW5nYnVmZmVyX2ludGVycnVwdF9tYXNrKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpyaW5nX2luZm8pOwogCi12b2lkIER1bXBSaW5nSW5mbyhzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqUmluZ0luZm8sIGNoYXIgKlByZWZpeCk7Cit2b2lkIGR1bXBfcmluZ19pbmZvKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpyaW5nX2luZm8sIGNoYXIgKnByZWZpeCk7CiAKLXZvaWQgUmluZ0J1ZmZlckdldERlYnVnSW5mbyhzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqUmluZ0luZm8sCit2b2lkIHJpbmdidWZmZXJfZ2V0X2RlYnVnaW5mbyhzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqcmluZ19pbmZvLAogCQkJICAgIHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9kZWJ1Z19pbmZvICpkZWJ1Z19pbmZvKTsKIAogI2VuZGlmIC8qIF9SSU5HX0JVRkZFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L3JuZGlzLmggYi9kcml2ZXJzL3N0YWdpbmcvaHYvcm5kaXMuaAppbmRleCA3MjNlMWYxLi4wMTRkZTA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvcm5kaXMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaHYvcm5kaXMuaApAQCAtMjg4LDI0ICsyODgsMjQgQEAKICNkZWZpbmUgUk5ESVNfREZfUkFXX0RBVEEJCQkweDAwMDAwMDA0CiAKIC8qICBSZW1vdGUgTkRJUyBtZWRpdW0gdHlwZXMuICovCi0jZGVmaW5lIFJOZGlzTWVkaXVtODAyXzMJCQkweDAwMDAwMDAwCi0jZGVmaW5lIFJOZGlzTWVkaXVtODAyXzUJCQkweDAwMDAwMDAxCi0jZGVmaW5lIFJOZGlzTWVkaXVtRmRkaQkJCQkweDAwMDAwMDAyCi0jZGVmaW5lIFJOZGlzTWVkaXVtV2FuCQkJCTB4MDAwMDAwMDMKLSNkZWZpbmUgUk5kaXNNZWRpdW1Mb2NhbFRhbGsJCQkweDAwMDAwMDA0Ci0jZGVmaW5lIFJOZGlzTWVkaXVtQXJjbmV0UmF3CQkJMHgwMDAwMDAwNgotI2RlZmluZSBSTmRpc01lZGl1bUFyY25ldDg3OF8yCQkJMHgwMDAwMDAwNwotI2RlZmluZSBSTmRpc01lZGl1bUF0bQkJCQkweDAwMDAwMDA4Ci0jZGVmaW5lIFJOZGlzTWVkaXVtV2lyZWxlc3NXYW4JCQkweDAwMDAwMDA5Ci0jZGVmaW5lIFJOZGlzTWVkaXVtSXJkYQkJCQkweDAwMDAwMDBhCi0jZGVmaW5lIFJOZGlzTWVkaXVtQ29XYW4JCQkweDAwMDAwMDBiCisjZGVmaW5lIFJORElTX01FRElVTV84MDJfMwkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgUk5ESVNfTUVESVVNXzgwMl81CQkJMHgwMDAwMDAwMQorI2RlZmluZSBSTkRJU19NRURJVU1fRkRESQkJCQkweDAwMDAwMDAyCisjZGVmaW5lIFJORElTX01FRElVTV9XQU4JCQkJMHgwMDAwMDAwMworI2RlZmluZSBSTkRJU19NRURJVU1fTE9DQUxfVEFMSwkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgUk5ESVNfTUVESVVNX0FSQ05FVF9SQVcJCQkweDAwMDAwMDA2CisjZGVmaW5lIFJORElTX01FRElVTV9BUkNORVRfODc4XzIJCQkweDAwMDAwMDA3CisjZGVmaW5lIFJORElTX01FRElVTV9BVE0JCQkJMHgwMDAwMDAwOAorI2RlZmluZSBSTkRJU19NRURJVU1fV0lSRUxFU1NfV0FOCQkJMHgwMDAwMDAwOQorI2RlZmluZSBSTkRJU19NRURJVU1fSVJEQQkJCQkweDAwMDAwMDBhCisjZGVmaW5lIFJORElTX01FRElVTV9DT19XQU4JCQkweDAwMDAwMDBiCiAvKiBOb3QgYSByZWFsIG1lZGl1bSwgZGVmaW5lZCBhcyBhbiB1cHBlci1ib3VuZCAqLwotI2RlZmluZSBSTmRpc01lZGl1bU1heAkJCQkweDAwMDAwMDBkCisjZGVmaW5lIFJORElTX01FRElVTV9NQVgJCQkJMHgwMDAwMDAwZAogCiAKIC8qIFJlbW90ZSBORElTIG1lZGl1bSBjb25uZWN0aW9uIHN0YXRlcy4gKi8KLSNkZWZpbmUgUk5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkCQkweDAwMDAwMDAwCi0jZGVmaW5lIFJOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZAkJMHgwMDAwMDAwMQorI2RlZmluZSBSTkRJU19NRURJQV9TVEFURV9DT05ORUNURUQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgUk5ESVNfTUVESUFfU1RBVEVfRElTQ09OTkVDVEVECQkweDAwMDAwMDAxCiAKIC8qICBSZW1vdGUgTkRJUyB2ZXJzaW9uIG51bWJlcnMgKi8KICNkZWZpbmUgUk5ESVNfTUFKT1JfVkVSU0lPTgkJCTB4MDAwMDAwMDEKQEAgLTMxNCwxMDYgKzMxNCwxMDYgQEAKIAogLyogTmRpc0luaXRpYWxpemUgbWVzc2FnZSAqLwogc3RydWN0IHJuZGlzX2luaXRpYWxpemVfcmVxdWVzdCB7Ci0JdTMyIFJlcXVlc3RJZDsKLQl1MzIgTWFqb3JWZXJzaW9uOwotCXUzMiBNaW5vclZlcnNpb247Ci0JdTMyIE1heFRyYW5zZmVyU2l6ZTsKKwl1MzIgcmVxX2lkOworCXUzMiBtYWpvcl92ZXI7CisJdTMyIG1pbm9yX3ZlcjsKKwl1MzIgbWF4X3hmZXJfc2l6ZTsKIH07CiAKIC8qIFJlc3BvbnNlIHRvIE5kaXNJbml0aWFsaXplICovCiBzdHJ1Y3Qgcm5kaXNfaW5pdGlhbGl6ZV9jb21wbGV0ZSB7Ci0JdTMyIFJlcXVlc3RJZDsKLQl1MzIgU3RhdHVzOwotCXUzMiBNYWpvclZlcnNpb247Ci0JdTMyIE1pbm9yVmVyc2lvbjsKLQl1MzIgRGV2aWNlRmxhZ3M7Ci0JdTMyIE1lZGl1bTsKLQl1MzIgTWF4UGFja2V0c1Blck1lc3NhZ2U7Ci0JdTMyIE1heFRyYW5zZmVyU2l6ZTsKLQl1MzIgUGFja2V0QWxpZ25tZW50RmFjdG9yOwotCXUzMiBBRkxpc3RPZmZzZXQ7Ci0JdTMyIEFGTGlzdFNpemU7CisJdTMyIHJlcV9pZDsKKwl1MzIgc3RhdHVzOworCXUzMiBtYWpvcl92ZXI7CisJdTMyIG1pbm9yX3ZlcjsKKwl1MzIgZGV2X2ZsYWdzOworCXUzMiBtZWRpdW07CisJdTMyIG1heF9wa3RfcGVyX21zZzsKKwl1MzIgbWF4X3hmZXJfc2l6ZTsKKwl1MzIgcGt0X2FsaWdubWVudF9mYWN0b3I7CisJdTMyIGFmX2xpc3Rfb2Zmc2V0OworCXUzMiBhZl9saXN0X3NpemU7CiB9OwogCiAvKiBDYWxsIG1hbmFnZXIgZGV2aWNlcyBvbmx5OiBJbmZvcm1hdGlvbiBhYm91dCBhbiBhZGRyZXNzIGZhbWlseSAqLwogLyogc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UgaXMgYXBwZW5kZWQgdG8gdGhlIHJlc3BvbnNlIHRvIE5kaXNJbml0aWFsaXplLiAqLwogc3RydWN0IHJuZGlzX2NvX2FkZHJlc3NfZmFtaWx5IHsKLQl1MzIgQWRkcmVzc0ZhbWlseTsKLQl1MzIgTWFqb3JWZXJzaW9uOwotCXUzMiBNaW5vclZlcnNpb247CisJdTMyIGFkZHJlc3NfZmFtaWx5OworCXUzMiBtYWpvcl92ZXI7CisJdTMyIG1pbm9yX3ZlcjsKIH07CiAKIC8qIE5kaXNIYWx0IG1lc3NhZ2UgKi8KIHN0cnVjdCBybmRpc19oYWx0X3JlcXVlc3QgewotCXUzMiBSZXF1ZXN0SWQ7CisJdTMyIHJlcV9pZDsKIH07CiAKIC8qIE5kaXNRdWVyeVJlcXVlc3QgbWVzc2FnZSAqLwogc3RydWN0IHJuZGlzX3F1ZXJ5X3JlcXVlc3QgewotCXUzMiBSZXF1ZXN0SWQ7Ci0JdTMyIE9pZDsKLQl1MzIgSW5mb3JtYXRpb25CdWZmZXJMZW5ndGg7Ci0JdTMyIEluZm9ybWF0aW9uQnVmZmVyT2Zmc2V0OwotCXUzMiBEZXZpY2VWY0hhbmRsZTsKKwl1MzIgcmVxX2lkOworCXUzMiBvaWQ7CisJdTMyIGluZm9fYnVmbGVuOworCXUzMiBpbmZvX2J1Zl9vZmZzZXQ7CisJdTMyIGRldl92Y19oYW5kbGU7CiB9OwogCiAvKiBSZXNwb25zZSB0byBOZGlzUXVlcnlSZXF1ZXN0ICovCiBzdHJ1Y3Qgcm5kaXNfcXVlcnlfY29tcGxldGUgewotCXUzMiBSZXF1ZXN0SWQ7Ci0JdTMyIFN0YXR1czsKLQl1MzIgSW5mb3JtYXRpb25CdWZmZXJMZW5ndGg7Ci0JdTMyIEluZm9ybWF0aW9uQnVmZmVyT2Zmc2V0OworCXUzMiByZXFfaWQ7CisJdTMyIHN0YXR1czsKKwl1MzIgaW5mb19idWZsZW47CisJdTMyIGluZm9fYnVmX29mZnNldDsKIH07CiAKIC8qIE5kaXNTZXRSZXF1ZXN0IG1lc3NhZ2UgKi8KIHN0cnVjdCBybmRpc19zZXRfcmVxdWVzdCB7Ci0JdTMyIFJlcXVlc3RJZDsKLQl1MzIgT2lkOwotCXUzMiBJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aDsKLQl1MzIgSW5mb3JtYXRpb25CdWZmZXJPZmZzZXQ7Ci0JdTMyIERldmljZVZjSGFuZGxlOworCXUzMiByZXFfaWQ7CisJdTMyIG9pZDsKKwl1MzIgaW5mb19idWZsZW47CisJdTMyIGluZm9fYnVmX29mZnNldDsKKwl1MzIgZGV2X3ZjX2hhbmRsZTsKIH07CiAKIC8qIFJlc3BvbnNlIHRvIE5kaXNTZXRSZXF1ZXN0ICovCiBzdHJ1Y3Qgcm5kaXNfc2V0X2NvbXBsZXRlIHsKLQl1MzIgUmVxdWVzdElkOwotCXUzMiBTdGF0dXM7CisJdTMyIHJlcV9pZDsKKwl1MzIgc3RhdHVzOwogfTsKIAogLyogTmRpc1Jlc2V0IG1lc3NhZ2UgKi8KIHN0cnVjdCBybmRpc19yZXNldF9yZXF1ZXN0IHsKLQl1MzIgUmVzZXJ2ZWQ7CisJdTMyIHJlc2VydmVkOwogfTsKIAogLyogUmVzcG9uc2UgdG8gTmRpc1Jlc2V0ICovCiBzdHJ1Y3Qgcm5kaXNfcmVzZXRfY29tcGxldGUgewotCXUzMiBTdGF0dXM7Ci0JdTMyIEFkZHJlc3NpbmdSZXNldDsKKwl1MzIgc3RhdHVzOworCXUzMiBhZGRyZXNzaW5nX3Jlc2V0OwogfTsKIAogLyogTmRpc01JbmRpY2F0ZVN0YXR1cyBtZXNzYWdlICovCiBzdHJ1Y3Qgcm5kaXNfaW5kaWNhdGVfc3RhdHVzIHsKLQl1MzIgU3RhdHVzOwotCXUzMiBTdGF0dXNCdWZmZXJMZW5ndGg7Ci0JdTMyIFN0YXR1c0J1ZmZlck9mZnNldDsKKwl1MzIgc3RhdHVzOworCXUzMiBzdGF0dXNfYnVmbGVuOworCXUzMiBzdGF0dXNfYnVmX29mZnNldDsKIH07CiAKIC8qIERpYWdub3N0aWMgaW5mb3JtYXRpb24gcGFzc2VkIGFzIHRoZSBzdGF0dXMgYnVmZmVyIGluICovCiAvKiBzdHJ1Y3Qgcm5kaXNfaW5kaWNhdGVfc3RhdHVzIG1lc3NhZ2VzIHNpZ25pZnlpbmcgZXJyb3IgY29uZGl0aW9ucy4gKi8KIHN0cnVjdCBybmRpc19kaWFnbm9zdGljX2luZm8gewotCXUzMiBEaWFnU3RhdHVzOwotCXUzMiBFcnJvck9mZnNldDsKKwl1MzIgZGlhZ19zdGF0dXM7CisJdTMyIGVycm9yX29mZnNldDsKIH07CiAKIC8qIE5kaXNLZWVwQWxpdmUgbWVzc2FnZSAqLwogc3RydWN0IHJuZGlzX2tlZXBhbGl2ZV9yZXF1ZXN0IHsKLQl1MzIgUmVxdWVzdElkOworCXUzMiByZXFfaWQ7CiB9OwogCiAvKiBSZXNwb25zZSB0byBOZGlzS2VlcEFsaXZlICovCiBzdHJ1Y3Qgcm5kaXNfa2VlcGFsaXZlX2NvbXBsZXRlIHsKLQl1MzIgUmVxdWVzdElkOwotCXUzMiBTdGF0dXM7CisJdTMyIHJlcV9pZDsKKwl1MzIgc3RhdHVzOwogfTsKIAogLyoKQEAgLTQyMiwzOSArNDIyLDM5IEBACiAgKiB0byAwIGZvciBjb25uZWN0aW9ubGVzcyBkYXRhLCBvdGhlcndpc2UgaXQgY29udGFpbnMgdGhlIFZDIGhhbmRsZS4KICAqLwogc3RydWN0IHJuZGlzX3BhY2tldCB7Ci0JdTMyIERhdGFPZmZzZXQ7Ci0JdTMyIERhdGFMZW5ndGg7Ci0JdTMyIE9PQkRhdGFPZmZzZXQ7Ci0JdTMyIE9PQkRhdGFMZW5ndGg7Ci0JdTMyIE51bU9PQkRhdGFFbGVtZW50czsKLQl1MzIgUGVyUGFja2V0SW5mb09mZnNldDsKLQl1MzIgUGVyUGFja2V0SW5mb0xlbmd0aDsKLQl1MzIgVmNIYW5kbGU7Ci0JdTMyIFJlc2VydmVkOworCXUzMiBkYXRhX29mZnNldDsKKwl1MzIgZGF0YV9sZW47CisJdTMyIG9vYl9kYXRhX29mZnNldDsKKwl1MzIgb29iX2RhdGFfbGVuOworCXUzMiBudW1fb29iX2RhdGFfZWxlbWVudHM7CisJdTMyIHBlcl9wa3RfaW5mb19vZmZzZXQ7CisJdTMyIHBlcl9wa3RfaW5mb19sZW47CisJdTMyIHZjX2hhbmRsZTsKKwl1MzIgcmVzZXJ2ZWQ7CiB9OwogCiAvKiBPcHRpb25hbCBPdXQgb2YgQmFuZCBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIERhdGEgbWVzc2FnZS4gKi8KIHN0cnVjdCBybmRpc19vb2JkIHsKLQl1MzIgU2l6ZTsKLQl1MzIgVHlwZTsKLQl1MzIgQ2xhc3NJbmZvcm1hdGlvbk9mZnNldDsKKwl1MzIgc2l6ZTsKKwl1MzIgdHlwZTsKKwl1MzIgY2xhc3NfaW5mb19vZmZzZXQ7CiB9OwogCiAvKiBQYWNrZXQgZXh0ZW5zaW9uIGZpZWxkIGNvbnRlbnRzIGFzc29jaWF0ZWQgd2l0aCBhIERhdGEgbWVzc2FnZS4gKi8KIHN0cnVjdCBybmRpc19wZXJfcGFja2V0X2luZm8gewotCXUzMiBTaXplOwotCXUzMiBUeXBlOwotCXUzMiBQZXJQYWNrZXRJbmZvcm1hdGlvbk9mZnNldDsKKwl1MzIgc2l6ZTsKKwl1MzIgdHlwZTsKKwl1MzIgcGVyX3BrdF9pbmZvX29mZnNldDsKIH07CiAKIC8qIEZvcm1hdCBvZiBJbmZvcm1hdGlvbiBidWZmZXIgcGFzc2VkIGluIGEgU2V0UmVxdWVzdCBmb3IgdGhlIE9JRCAqLwogLyogT0lEX0dFTl9STkRJU19DT05GSUdfUEFSQU1FVEVSLiAqLwogc3RydWN0IHJuZGlzX2NvbmZpZ19wYXJhbWV0ZXJfaW5mbyB7Ci0JdTMyIFBhcmFtZXRlck5hbWVPZmZzZXQ7Ci0JdTMyIFBhcmFtZXRlck5hbWVMZW5ndGg7Ci0JdTMyIFBhcmFtZXRlclR5cGU7Ci0JdTMyIFBhcmFtZXRlclZhbHVlT2Zmc2V0OwotCXUzMiBQYXJhbWV0ZXJWYWx1ZUxlbmd0aDsKKwl1MzIgcGFyYW1ldGVyX25hbWVfb2Zmc2V0OworCXUzMiBwYXJhbWV0ZXJfbmFtZV9sZW5ndGg7CisJdTMyIHBhcmFtZXRlcl90eXBlOworCXUzMiBwYXJhbWV0ZXJfdmFsdWVfb2Zmc2V0OworCXUzMiBwYXJhbWV0ZXJfdmFsdWVfbGVuZ3RoOwogfTsKIAogLyogVmFsdWVzIGZvciBQYXJhbWV0ZXJUeXBlIGluIHN0cnVjdCBybmRpc19jb25maWdfcGFyYW1ldGVyX2luZm8gKi8KQEAgLTQ2NiwxODcgKzQ2NiwxODggQEAKIAogLyogQ29OZGlzTWluaXBvcnRDcmVhdGVWYyBtZXNzYWdlICovCiBzdHJ1Y3QgcmNvbmRpc19tcF9jcmVhdGVfdmMgewotCXUzMiBSZXF1ZXN0SWQ7Ci0JdTMyIE5kaXNWY0hhbmRsZTsKKwl1MzIgcmVxX2lkOworCXUzMiBuZGlzX3ZjX2hhbmRsZTsKIH07CiAKIC8qIFJlc3BvbnNlIHRvIENvTmRpc01pbmlwb3J0Q3JlYXRlVmMgKi8KIHN0cnVjdCByY29uZGlzX21wX2NyZWF0ZV92Y19jb21wbGV0ZSB7Ci0JdTMyIFJlcXVlc3RJZDsKLQl1MzIgRGV2aWNlVmNIYW5kbGU7Ci0JdTMyIFN0YXR1czsKKwl1MzIgcmVxX2lkOworCXUzMiBkZXZfdmNfaGFuZGxlOworCXUzMiBzdGF0dXM7CiB9OwogCiAvKiBDb05kaXNNaW5pcG9ydERlbGV0ZVZjIG1lc3NhZ2UgKi8KIHN0cnVjdCByY29uZGlzX21wX2RlbGV0ZV92YyB7Ci0JdTMyIFJlcXVlc3RJZDsKLQl1MzIgRGV2aWNlVmNIYW5kbGU7CisJdTMyIHJlcV9pZDsKKwl1MzIgZGV2X3ZjX2hhbmRsZTsKIH07CiAKIC8qIFJlc3BvbnNlIHRvIENvTmRpc01pbmlwb3J0RGVsZXRlVmMgKi8KIHN0cnVjdCByY29uZGlzX21wX2RlbGV0ZV92Y19jb21wbGV0ZSB7Ci0JdTMyIFJlcXVlc3RJZDsKLQl1MzIgU3RhdHVzOworCXUzMiByZXFfaWQ7CisJdTMyIHN0YXR1czsKIH07CiAKIC8qIENvTmRpc01pbmlwb3J0UXVlcnlSZXF1ZXN0IG1lc3NhZ2UgKi8KIHN0cnVjdCByY29uZGlzX21wX3F1ZXJ5X3JlcXVlc3QgewotCXUzMiBSZXF1ZXN0SWQ7Ci0JdTMyIFJlcXVlc3RUeXBlOwotCXUzMiBPaWQ7Ci0JdTMyIERldmljZVZjSGFuZGxlOwotCXUzMiBJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aDsKLQl1MzIgSW5mb3JtYXRpb25CdWZmZXJPZmZzZXQ7CisJdTMyIHJlcV9pZDsKKwl1MzIgcmVxdWVzdF90eXBlOworCXUzMiBvaWQ7CisJdTMyIGRldl92Y19oYW5kbGU7CisJdTMyIGluZm9fYnVmbGVuOworCXUzMiBpbmZvX2J1Zl9vZmZzZXQ7CiB9OwogCiAvKiBDb05kaXNNaW5pcG9ydFNldFJlcXVlc3QgbWVzc2FnZSAqLwogc3RydWN0IHJjb25kaXNfbXBfc2V0X3JlcXVlc3QgewotCXUzMiBSZXF1ZXN0SWQ7Ci0JdTMyIFJlcXVlc3RUeXBlOwotCXUzMiBPaWQ7Ci0JdTMyIERldmljZVZjSGFuZGxlOwotCXUzMiBJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aDsKLQl1MzIgSW5mb3JtYXRpb25CdWZmZXJPZmZzZXQ7CisJdTMyIHJlcV9pZDsKKwl1MzIgcmVxdWVzdF90eXBlOworCXUzMiBvaWQ7CisJdTMyIGRldl92Y19oYW5kbGU7CisJdTMyIGluZm9fYnVmbGVuOworCXUzMiBpbmZvX2J1Zl9vZmZzZXQ7CiB9OwogCiAvKiBDb05kaXNJbmRpY2F0ZVN0YXR1cyBtZXNzYWdlICovCiBzdHJ1Y3QgcmNvbmRpc19pbmRpY2F0ZV9zdGF0dXMgewotCXUzMiBOZGlzVmNIYW5kbGU7Ci0JdTMyIFN0YXR1czsKLQl1MzIgU3RhdHVzQnVmZmVyTGVuZ3RoOwotCXUzMiBTdGF0dXNCdWZmZXJPZmZzZXQ7CisJdTMyIG5kaXNfdmNfaGFuZGxlOworCXUzMiBzdGF0dXM7CisJdTMyIHN0YXR1c19idWZsZW47CisJdTMyIHN0YXR1c19idWZfb2Zmc2V0OwogfTsKIAogLyogQ09ORElTIENhbGwvVkMgcGFyYW1ldGVycyAqLwogc3RydWN0IHJjb25kaXNfc3BlY2lmaWNfcGFyYW1ldGVycyB7Ci0JdTMyIFBhcmFtZXRlclR5cGU7Ci0JdTMyIFBhcmFtZXRlckxlbmd0aDsKLQl1MzIgUGFyYW1ldGVyT2Zmc2V0OworCXUzMiBwYXJhbWV0ZXJfdHlwZTsKKwl1MzIgcGFyYW1ldGVyX2xlbmd0aDsKKwl1MzIgcGFyYW1ldGVyX2xmZnNldDsKIH07CiAKIHN0cnVjdCByY29uZGlzX21lZGlhX3BhcmFtZXRlcnMgewotCXUzMiBGbGFnczsKLQl1MzIgUmVzZXJ2ZWQxOwotCXUzMiBSZXNlcnZlZDI7Ci0Jc3RydWN0IHJjb25kaXNfc3BlY2lmaWNfcGFyYW1ldGVycyBNZWRpYVNwZWNpZmljOworCXUzMiBmbGFnczsKKwl1MzIgcmVzZXJ2ZWQxOworCXUzMiByZXNlcnZlZDI7CisJc3RydWN0IHJjb25kaXNfc3BlY2lmaWNfcGFyYW1ldGVycyBtZWRpYV9zcGVjaWZpYzsKIH07CiAKIHN0cnVjdCBybmRpc19mbG93c3BlYyB7Ci0JdTMyIFRva2VuUmF0ZTsKLQl1MzIgVG9rZW5CdWNrZXRTaXplOwotCXUzMiBQZWFrQmFuZHdpZHRoOwotCXUzMiBMYXRlbmN5OwotCXUzMiBEZWxheVZhcmlhdGlvbjsKLQl1MzIgU2VydmljZVR5cGU7Ci0JdTMyIE1heFNkdVNpemU7Ci0JdTMyIE1pbmltdW1Qb2xpY2VkU2l6ZTsKKwl1MzIgdG9rZW5fcmF0ZTsKKwl1MzIgdG9rZW5fYnVja2V0X3NpemU7CisJdTMyIHBlYWtfYmFuZHdpZHRoOworCXUzMiBsYXRlbmN5OworCXUzMiBkZWxheV92YXJpYXRpb247CisJdTMyIHNlcnZpY2VfdHlwZTsKKwl1MzIgbWF4X3NkdV9zaXplOworCXUzMiBtaW5pbXVtX3BvbGljZWRfc2l6ZTsKIH07CiAKIHN0cnVjdCByY29uZGlzX2NhbGxfbWFuYWdlcl9wYXJhbWV0ZXJzIHsKLQlzdHJ1Y3Qgcm5kaXNfZmxvd3NwZWMgVHJhbnNtaXQ7Ci0Jc3RydWN0IHJuZGlzX2Zsb3dzcGVjIFJlY2VpdmU7Ci0Jc3RydWN0IHJjb25kaXNfc3BlY2lmaWNfcGFyYW1ldGVycyBDYWxsTWdyU3BlY2lmaWM7CisJc3RydWN0IHJuZGlzX2Zsb3dzcGVjIHRyYW5zbWl0OworCXN0cnVjdCBybmRpc19mbG93c3BlYyByZWNlaXZlOworCXN0cnVjdCByY29uZGlzX3NwZWNpZmljX3BhcmFtZXRlcnMgY2FsbF9tZ3Jfc3BlY2lmaWM7CiB9OwogCiAvKiBDb05kaXNNaW5pcG9ydEFjdGl2YXRlVmMgbWVzc2FnZSAqLwogc3RydWN0IHJjb25kaXNfbXBfYWN0aXZhdGVfdmNfcmVxdWVzdCB7Ci0JdTMyIFJlcXVlc3RJZDsKLQl1MzIgRmxhZ3M7Ci0JdTMyIERldmljZVZjSGFuZGxlOwotCXUzMiBNZWRpYVBhcmFtc09mZnNldDsKLQl1MzIgTWVkaWFQYXJhbXNMZW5ndGg7Ci0JdTMyIENhbGxNZ3JQYXJhbXNPZmZzZXQ7Ci0JdTMyIENhbGxNZ3JQYXJhbXNMZW5ndGg7CisJdTMyIHJlcV9pZDsKKwl1MzIgZmxhZ3M7CisJdTMyIGRldl92Y19oYW5kbGU7CisJdTMyIG1lZGlhX3BhcmFtc19vZmZzZXQ7CisJdTMyIG1lZGlhX3BhcmFtc19sZW5ndGg7CisJdTMyIGNhbGxfbWdyX3BhcmFtc19vZmZzZXQ7CisJdTMyIGNhbGxfbWdyX3BhcmFtc19sZW5ndGg7CiB9OwogCiAvKiBSZXNwb25zZSB0byBDb05kaXNNaW5pcG9ydEFjdGl2YXRlVmMgKi8KIHN0cnVjdCByY29uZGlzX21wX2FjdGl2YXRlX3ZjX2NvbXBsZXRlIHsKLQl1MzIgUmVxdWVzdElkOwotCXUzMiBTdGF0dXM7CisJdTMyIHJlcV9pZDsKKwl1MzIgc3RhdHVzOwogfTsKIAogLyogQ29OZGlzTWluaXBvcnREZWFjdGl2YXRlVmMgbWVzc2FnZSAqLwogc3RydWN0IHJjb25kaXNfbXBfZGVhY3RpdmF0ZV92Y19yZXF1ZXN0IHsKLQl1MzIgUmVxdWVzdElkOwotCXUzMiBGbGFnczsKLQl1MzIgRGV2aWNlVmNIYW5kbGU7CisJdTMyIHJlcV9pZDsKKwl1MzIgZmxhZ3M7CisJdTMyIGRldl92Y19oYW5kbGU7CiB9OwogCiAvKiBSZXNwb25zZSB0byBDb05kaXNNaW5pcG9ydERlYWN0aXZhdGVWYyAqLwogc3RydWN0IHJjb25kaXNfbXBfZGVhY3RpdmF0ZV92Y19jb21wbGV0ZSB7Ci0JdTMyIFJlcXVlc3RJZDsKLQl1MzIgU3RhdHVzOworCXUzMiByZXFfaWQ7CisJdTMyIHN0YXR1czsKIH07CiAKIAogLyogdW5pb24gd2l0aCBhbGwgb2YgdGhlIFJORElTIG1lc3NhZ2VzICovCiB1bmlvbiBybmRpc19tZXNzYWdlX2NvbnRhaW5lciB7Ci0Jc3RydWN0IHJuZGlzX3BhY2tldCBQYWNrZXQ7Ci0Jc3RydWN0IHJuZGlzX2luaXRpYWxpemVfcmVxdWVzdCBJbml0aWFsaXplUmVxdWVzdDsKLQlzdHJ1Y3Qgcm5kaXNfaGFsdF9yZXF1ZXN0IEhhbHRSZXF1ZXN0OwotCXN0cnVjdCBybmRpc19xdWVyeV9yZXF1ZXN0IFF1ZXJ5UmVxdWVzdDsKLQlzdHJ1Y3Qgcm5kaXNfc2V0X3JlcXVlc3QgU2V0UmVxdWVzdDsKLQlzdHJ1Y3Qgcm5kaXNfcmVzZXRfcmVxdWVzdCBSZXNldFJlcXVlc3Q7Ci0Jc3RydWN0IHJuZGlzX2tlZXBhbGl2ZV9yZXF1ZXN0IEtlZXBhbGl2ZVJlcXVlc3Q7Ci0Jc3RydWN0IHJuZGlzX2luZGljYXRlX3N0YXR1cyBJbmRpY2F0ZVN0YXR1czsKLQlzdHJ1Y3Qgcm5kaXNfaW5pdGlhbGl6ZV9jb21wbGV0ZSBJbml0aWFsaXplQ29tcGxldGU7Ci0Jc3RydWN0IHJuZGlzX3F1ZXJ5X2NvbXBsZXRlIFF1ZXJ5Q29tcGxldGU7Ci0Jc3RydWN0IHJuZGlzX3NldF9jb21wbGV0ZSBTZXRDb21wbGV0ZTsKLQlzdHJ1Y3Qgcm5kaXNfcmVzZXRfY29tcGxldGUgUmVzZXRDb21wbGV0ZTsKLQlzdHJ1Y3Qgcm5kaXNfa2VlcGFsaXZlX2NvbXBsZXRlIEtlZXBhbGl2ZUNvbXBsZXRlOwotCXN0cnVjdCByY29uZGlzX21wX2NyZWF0ZV92YyBDb01pbmlwb3J0Q3JlYXRlVmM7Ci0Jc3RydWN0IHJjb25kaXNfbXBfZGVsZXRlX3ZjIENvTWluaXBvcnREZWxldGVWYzsKLQlzdHJ1Y3QgcmNvbmRpc19pbmRpY2F0ZV9zdGF0dXMgQ29JbmRpY2F0ZVN0YXR1czsKLQlzdHJ1Y3QgcmNvbmRpc19tcF9hY3RpdmF0ZV92Y19yZXF1ZXN0IENvTWluaXBvcnRBY3RpdmF0ZVZjOwotCXN0cnVjdCByY29uZGlzX21wX2RlYWN0aXZhdGVfdmNfcmVxdWVzdCBDb01pbmlwb3J0RGVhY3RpdmF0ZVZjOwotCXN0cnVjdCByY29uZGlzX21wX2NyZWF0ZV92Y19jb21wbGV0ZSBDb01pbmlwb3J0Q3JlYXRlVmNDb21wbGV0ZTsKLQlzdHJ1Y3QgcmNvbmRpc19tcF9kZWxldGVfdmNfY29tcGxldGUgQ29NaW5pcG9ydERlbGV0ZVZjQ29tcGxldGU7Ci0Jc3RydWN0IHJjb25kaXNfbXBfYWN0aXZhdGVfdmNfY29tcGxldGUgQ29NaW5pcG9ydEFjdGl2YXRlVmNDb21wbGV0ZTsKLQlzdHJ1Y3QgcmNvbmRpc19tcF9kZWFjdGl2YXRlX3ZjX2NvbXBsZXRlIENvTWluaXBvcnREZWFjdGl2YXRlVmNDb21wbGV0ZTsKKwlzdHJ1Y3Qgcm5kaXNfcGFja2V0IHBrdDsKKwlzdHJ1Y3Qgcm5kaXNfaW5pdGlhbGl6ZV9yZXF1ZXN0IGluaXRfcmVxOworCXN0cnVjdCBybmRpc19oYWx0X3JlcXVlc3QgaGFsdF9yZXE7CisJc3RydWN0IHJuZGlzX3F1ZXJ5X3JlcXVlc3QgcXVlcnlfcmVxOworCXN0cnVjdCBybmRpc19zZXRfcmVxdWVzdCBzZXRfcmVxOworCXN0cnVjdCBybmRpc19yZXNldF9yZXF1ZXN0IHJlc2V0X3JlcTsKKwlzdHJ1Y3Qgcm5kaXNfa2VlcGFsaXZlX3JlcXVlc3Qga2VlcF9hbGl2ZV9yZXE7CisJc3RydWN0IHJuZGlzX2luZGljYXRlX3N0YXR1cyBpbmRpY2F0ZV9zdGF0dXM7CisJc3RydWN0IHJuZGlzX2luaXRpYWxpemVfY29tcGxldGUgaW5pdF9jb21wbGV0ZTsKKwlzdHJ1Y3Qgcm5kaXNfcXVlcnlfY29tcGxldGUgcXVlcnlfY29tcGxldGU7CisJc3RydWN0IHJuZGlzX3NldF9jb21wbGV0ZSBzZXRfY29tcGxldGU7CisJc3RydWN0IHJuZGlzX3Jlc2V0X2NvbXBsZXRlIHJlc2V0X2NvbXBsZXRlOworCXN0cnVjdCBybmRpc19rZWVwYWxpdmVfY29tcGxldGUga2VlcF9hbGl2ZV9jb21wbGV0ZTsKKwlzdHJ1Y3QgcmNvbmRpc19tcF9jcmVhdGVfdmMgY29fbWluaXBvcnRfY3JlYXRlX3ZjOworCXN0cnVjdCByY29uZGlzX21wX2RlbGV0ZV92YyBjb19taW5pcG9ydF9kZWxldGVfdmM7CisJc3RydWN0IHJjb25kaXNfaW5kaWNhdGVfc3RhdHVzIGNvX2luZGljYXRlX3N0YXR1czsKKwlzdHJ1Y3QgcmNvbmRpc19tcF9hY3RpdmF0ZV92Y19yZXF1ZXN0IGNvX21pbmlwb3J0X2FjdGl2YXRlX3ZjOworCXN0cnVjdCByY29uZGlzX21wX2RlYWN0aXZhdGVfdmNfcmVxdWVzdCBjb19taW5pcG9ydF9kZWFjdGl2YXRlX3ZjOworCXN0cnVjdCByY29uZGlzX21wX2NyZWF0ZV92Y19jb21wbGV0ZSBjb19taW5pcG9ydF9jcmVhdGVfdmNfY29tcGxldGU7CisJc3RydWN0IHJjb25kaXNfbXBfZGVsZXRlX3ZjX2NvbXBsZXRlIGNvX21pbmlwb3J0X2RlbGV0ZV92Y19jb21wbGV0ZTsKKwlzdHJ1Y3QgcmNvbmRpc19tcF9hY3RpdmF0ZV92Y19jb21wbGV0ZSBjb19taW5pcG9ydF9hY3RpdmF0ZV92Y19jb21wbGV0ZTsKKwlzdHJ1Y3QgcmNvbmRpc19tcF9kZWFjdGl2YXRlX3ZjX2NvbXBsZXRlCisJCWNvX21pbmlwb3J0X2RlYWN0aXZhdGVfdmNfY29tcGxldGU7CiB9OwogCiAvKiBSZW1vdGUgTkRJUyBtZXNzYWdlIGZvcm1hdCAqLwogc3RydWN0IHJuZGlzX21lc3NhZ2UgewotCXUzMiBOZGlzTWVzc2FnZVR5cGU7CisJdTMyIG5kaXNfbXNnX3R5cGU7CiAKIAkvKiBUb3RhbCBsZW5ndGggb2YgdGhpcyBtZXNzYWdlLCBmcm9tIHRoZSBiZWdpbm5pbmcgKi8KIAkvKiBvZiB0aGUgc3J1Y3Qgcm5kaXNfbWVzc2FnZSwgaW4gYnl0ZXMuICovCi0JdTMyIE1lc3NhZ2VMZW5ndGg7CisJdTMyIG1zZ19sZW47CiAKIAkvKiBBY3R1YWwgbWVzc2FnZSAqLwotCXVuaW9uIHJuZGlzX21lc3NhZ2VfY29udGFpbmVyIE1lc3NhZ2U7CisJdW5pb24gcm5kaXNfbWVzc2FnZV9jb250YWluZXIgbXNnOwogfTsKIAogLyogSGFuZHkgbWFjcm9zICovCiAKIC8qIGdldCB0aGUgc2l6ZSBvZiBhbiBSTkRJUyBtZXNzYWdlLiBQYXNzIGluIHRoZSBtZXNzYWdlIHR5cGUsICovCiAvKiBzdHJ1Y3Qgcm5kaXNfc2V0X3JlcXVlc3QsIHN0cnVjdCBybmRpc19wYWNrZXQgZm9yIGV4YW1wbGUgKi8KLSNkZWZpbmUgUk5ESVNfTUVTU0FHRV9TSVpFKE1lc3NhZ2UpCQkJCVwKLQkoc2l6ZW9mKE1lc3NhZ2UpICsgKHNpemVvZihzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSkgLQlcCisjZGVmaW5lIFJORElTX01FU1NBR0VfU0laRShtc2cpCQkJCVwKKwkoc2l6ZW9mKG1zZykgKyAoc2l6ZW9mKHN0cnVjdCBybmRpc19tZXNzYWdlKSAtCVwKIAkgc2l6ZW9mKHVuaW9uIHJuZGlzX21lc3NhZ2VfY29udGFpbmVyKSkpCiAKIC8qIGdldCBwb2ludGVyIHRvIGluZm8gYnVmZmVyIHdpdGggbWVzc2FnZSBwb2ludGVyICovCi0jZGVmaW5lIE1FU1NBR0VfVE9fSU5GT19CVUZGRVIoTWVzc2FnZSkJCQkJXAotCSgoKHVuc2lnbmVkIGNoYXIgKikoTWVzc2FnZSkpICsgTWVzc2FnZS0+SW5mb3JtYXRpb25CdWZmZXJPZmZzZXQpCisjZGVmaW5lIE1FU1NBR0VfVE9fSU5GT19CVUZGRVIobXNnKQkJCQlcCisJKCgodW5zaWduZWQgY2hhciAqKShtc2cpKSArIG1zZy0+aW5mb19idWZfb2Zmc2V0KQogCiAvKiBnZXQgcG9pbnRlciB0byBzdGF0dXMgYnVmZmVyIHdpdGggbWVzc2FnZSBwb2ludGVyICovCi0jZGVmaW5lIE1FU1NBR0VfVE9fU1RBVFVTX0JVRkZFUihNZXNzYWdlKQkJCVwKLQkoKCh1bnNpZ25lZCBjaGFyICopKE1lc3NhZ2UpKSArIE1lc3NhZ2UtPlN0YXR1c0J1ZmZlck9mZnNldCkKKyNkZWZpbmUgTUVTU0FHRV9UT19TVEFUVVNfQlVGRkVSKG1zZykJCQlcCisJKCgodW5zaWduZWQgY2hhciAqKShtc2cpKSArIG1zZy0+c3RhdHVzX2J1Zl9vZmZzZXQpCiAKIC8qIGdldCBwb2ludGVyIHRvIE9PQkQgYnVmZmVyIHdpdGggbWVzc2FnZSBwb2ludGVyICovCi0jZGVmaW5lIE1FU1NBR0VfVE9fT09CRF9CVUZGRVIoTWVzc2FnZSkJCQkJXAotCSgoKHVuc2lnbmVkIGNoYXIgKikoTWVzc2FnZSkpICsgTWVzc2FnZS0+T09CRGF0YU9mZnNldCkKKyNkZWZpbmUgTUVTU0FHRV9UT19PT0JEX0JVRkZFUihtc2cpCQkJCVwKKwkoKCh1bnNpZ25lZCBjaGFyICopKG1zZykpICsgbXNnLT5vb2JfZGF0YV9vZmZzZXQpCiAKIC8qIGdldCBwb2ludGVyIHRvIGRhdGEgYnVmZmVyIHdpdGggbWVzc2FnZSBwb2ludGVyICovCi0jZGVmaW5lIE1FU1NBR0VfVE9fREFUQV9CVUZGRVIoTWVzc2FnZSkJCQkJXAotCSgoKHVuc2lnbmVkIGNoYXIgKikoTWVzc2FnZSkpICsgTWVzc2FnZS0+UGVyUGFja2V0SW5mb09mZnNldCkKKyNkZWZpbmUgTUVTU0FHRV9UT19EQVRBX0JVRkZFUihtc2cpCQkJCVwKKwkoKCh1bnNpZ25lZCBjaGFyICopKG1zZykpICsgbXNnLT5wZXJfcGt0X2luZm9fb2Zmc2V0KQogCiAvKiBnZXQgcG9pbnRlciB0byBjb250YWluZWQgbWVzc2FnZSBmcm9tIE5ESVNfTUVTU0FHRSBwb2ludGVyICovCi0jZGVmaW5lIFJORElTX01FU1NBR0VfUFRSX1RPX01FU1NBR0VfUFRSKFJuZGlzTWVzc2FnZSkJCVwKLQkoKHZvaWQgKikgJlJuZGlzTWVzc2FnZS0+TWVzc2FnZSkKKyNkZWZpbmUgUk5ESVNfTUVTU0FHRV9QVFJfVE9fTUVTU0FHRV9QVFIocm5kaXNfbXNnKQkJXAorCSgodm9pZCAqKSAmcm5kaXNfbXNnLT5tc2cpCiAKIC8qIGdldCBwb2ludGVyIHRvIGNvbnRhaW5lZCBtZXNzYWdlIGZyb20gTkRJU19NRVNTQUdFIHBvaW50ZXIgKi8KLSNkZWZpbmUgUk5ESVNfTUVTU0FHRV9SQVdfUFRSX1RPX01FU1NBR0VfUFRSKFJuZGlzTWVzc2FnZSkJXAotCSgodm9pZCAqKSBSbmRpc01lc3NhZ2UpCisjZGVmaW5lIFJORElTX01FU1NBR0VfUkFXX1BUUl9UT19NRVNTQUdFX1BUUihybmRpc19tc2cpCVwKKwkoKHZvaWQgKikgcm5kaXNfbXNnKQogCiAjZW5kaWYgLyogX1JORElTX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvcm5kaXNfZmlsdGVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvaHYvcm5kaXNfZmlsdGVyLmMKaW5kZXggZmEyMTQxZi4uNTM2NzZkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L3JuZGlzX2ZpbHRlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi9ybmRpc19maWx0ZXIuYwpAQCAtMzIsNyArMzIsNyBAQAogLyogRGF0YSB0eXBlcyAqLwogc3RydWN0IHJuZGlzX2ZpbHRlcl9kcml2ZXJfb2JqZWN0IHsKIAkvKiBUaGUgb3JpZ2luYWwgZHJpdmVyICovCi0Jc3RydWN0IG5ldHZzY19kcml2ZXIgSW5uZXJEcml2ZXI7CisJc3RydWN0IG5ldHZzY19kcml2ZXIgaW5uZXJfZHJ2OwogfTsKIAogZW51bSBybmRpc19kZXZpY2Vfc3RhdGUgewpAQCAtNDMsNjMgKzQzLDYzIEBACiB9OwogCiBzdHJ1Y3Qgcm5kaXNfZGV2aWNlIHsKLQlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqTmV0RGV2aWNlOworCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXRfZGV2OwogCi0JZW51bSBybmRpc19kZXZpY2Vfc3RhdGUgU3RhdGU7Ci0JdTMyIExpbmtTdGF0dXM7Ci0JYXRvbWljX3QgTmV3UmVxdWVzdElkOworCWVudW0gcm5kaXNfZGV2aWNlX3N0YXRlIHN0YXRlOworCXUzMiBsaW5rX3N0YXQ7CisJYXRvbWljX3QgbmV3X3JlcV9pZDsKIAogCXNwaW5sb2NrX3QgcmVxdWVzdF9sb2NrOwotCXN0cnVjdCBsaXN0X2hlYWQgUmVxdWVzdExpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCByZXFfbGlzdDsKIAotCXVuc2lnbmVkIGNoYXIgSHdNYWNBZGRyW0VUSF9BTEVOXTsKKwl1bnNpZ25lZCBjaGFyIGh3X21hY19hZHJbRVRIX0FMRU5dOwogfTsKIAogc3RydWN0IHJuZGlzX3JlcXVlc3QgewotCXN0cnVjdCBsaXN0X2hlYWQgTGlzdEVudHJ5OwotCXN0cnVjdCBvc2Rfd2FpdGV2ZW50ICpXYWl0RXZlbnQ7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0X2VudDsKKwlzdHJ1Y3Qgb3NkX3dhaXRldmVudCAqd2FpdGV2ZW50OwogCiAJLyoKIAkgKiBGSVhNRTogV2UgYXNzdW1lZCBhIGZpeGVkIHNpemUgcmVzcG9uc2UgaGVyZS4gSWYgd2UgZG8gZXZlciBuZWVkIHRvCiAJICogaGFuZGxlIGEgYmlnZ2VyIHJlc3BvbnNlLCB3ZSBjYW4gZWl0aGVyIGRlZmluZSBhIG1heCByZXNwb25zZQogCSAqIG1lc3NhZ2Ugb3IgYWRkIGEgcmVzcG9uc2UgYnVmZmVyIHZhcmlhYmxlIGFib3ZlIHRoaXMgZmllbGQKIAkgKi8KLQlzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSBSZXNwb25zZU1lc3NhZ2U7CisJc3RydWN0IHJuZGlzX21lc3NhZ2UgcmVzcG9uc2VfbXNnOwogCiAJLyogU2ltcGxpZnkgYWxsb2NhdGlvbiBieSBoYXZpbmcgYSBuZXR2c2MgcGFja2V0IGlubGluZSAqLwotCXN0cnVjdCBodl9uZXR2c2NfcGFja2V0CVBhY2tldDsKLQlzdHJ1Y3QgaHZfcGFnZV9idWZmZXIgQnVmZmVyOworCXN0cnVjdCBodl9uZXR2c2NfcGFja2V0CXBrdDsKKwlzdHJ1Y3QgaHZfcGFnZV9idWZmZXIgYnVmOwogCS8qIEZJWE1FOiBXZSBhc3N1bWVkIGEgZml4ZWQgc2l6ZSByZXF1ZXN0IGhlcmUuICovCi0Jc3RydWN0IHJuZGlzX21lc3NhZ2UgUmVxdWVzdE1lc3NhZ2U7CisJc3RydWN0IHJuZGlzX21lc3NhZ2UgcmVxdWVzdF9tc2c7CiB9OwogCiAKIHN0cnVjdCBybmRpc19maWx0ZXJfcGFja2V0IHsKLQl2b2lkICpDb21wbGV0aW9uQ29udGV4dDsKLQl2b2lkICgqT25Db21wbGV0aW9uKSh2b2lkICpjb250ZXh0KTsKLQlzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSBNZXNzYWdlOworCXZvaWQgKmNvbXBsZXRpb25fY3R4OworCXZvaWQgKCpjb21wbGV0aW9uKSh2b2lkICpjb250ZXh0KTsKKwlzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSBtc2c7CiB9OwogCiAKLXN0YXRpYyBpbnQgUm5kaXNGaWx0ZXJPbkRldmljZUFkZChzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UsCi0JCQkJICB2b2lkICpBZGRpdGlvbmFsSW5mbyk7CitzdGF0aWMgaW50IHJuZGlzX2ZpbHRlX2RldmljZV9hZGQoc3RydWN0IGh2X2RldmljZSAqZGV2LAorCQkJCSAgdm9pZCAqYWRkaXRpb25hbF9pbmZvKTsKIAotc3RhdGljIGludCBSbmRpc0ZpbHRlck9uRGV2aWNlUmVtb3ZlKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSk7CitzdGF0aWMgaW50IHJuZGlzX2ZpbHRlcl9kZXZpY2VfcmVtb3ZlKHN0cnVjdCBodl9kZXZpY2UgKmRldik7CiAKLXN0YXRpYyB2b2lkIFJuZGlzRmlsdGVyT25DbGVhbnVwKHN0cnVjdCBodl9kcml2ZXIgKkRyaXZlcik7CitzdGF0aWMgdm9pZCBybmRpc19maWx0ZXJfY2xlYW51cChzdHJ1Y3QgaHZfZHJpdmVyICpkcnYpOwogCi1zdGF0aWMgaW50IFJuZGlzRmlsdGVyT25TZW5kKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSwKLQkJCSAgICAgc3RydWN0IGh2X25ldHZzY19wYWNrZXQgKlBhY2tldCk7CitzdGF0aWMgaW50IHJuZGlzX2ZpbHRlcl9zZW5kKHN0cnVjdCBodl9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGh2X25ldHZzY19wYWNrZXQgKnBrdCk7CiAKLXN0YXRpYyB2b2lkIFJuZGlzRmlsdGVyT25TZW5kQ29tcGxldGlvbih2b2lkICpDb250ZXh0KTsKK3N0YXRpYyB2b2lkIHJuZGlzX2ZpbHRlcl9zZW5kX2NvbXBsZXRpb24odm9pZCAqY3R4KTsKIAotc3RhdGljIHZvaWQgUm5kaXNGaWx0ZXJPblNlbmRSZXF1ZXN0Q29tcGxldGlvbih2b2lkICpDb250ZXh0KTsKK3N0YXRpYyB2b2lkIHJuZGlzX2ZpbHRlcl9zZW5kX3JlcXVlc3RfY29tcGxldGlvbih2b2lkICpjdHgpOwogCiAKIC8qIFRoZSBvbmUgYW5kIG9ubHkgKi8KLXN0YXRpYyBzdHJ1Y3Qgcm5kaXNfZmlsdGVyX2RyaXZlcl9vYmplY3QgZ1JuZGlzRmlsdGVyOworc3RhdGljIHN0cnVjdCBybmRpc19maWx0ZXJfZHJpdmVyX29iamVjdCBybmRpc19maWx0ZXI7CiAKLXN0YXRpYyBzdHJ1Y3Qgcm5kaXNfZGV2aWNlICpHZXRSbmRpc0RldmljZSh2b2lkKQorc3RhdGljIHN0cnVjdCBybmRpc19kZXZpY2UgKmdldF9ybmRpc19kZXZpY2Uodm9pZCkKIHsKIAlzdHJ1Y3Qgcm5kaXNfZGV2aWNlICpkZXZpY2U7CiAKQEAgLTEwOSwxOSArMTA5LDE5IEBACiAKIAlzcGluX2xvY2tfaW5pdCgmZGV2aWNlLT5yZXF1ZXN0X2xvY2spOwogCi0JSU5JVF9MSVNUX0hFQUQoJmRldmljZS0+UmVxdWVzdExpc3QpOworCUlOSVRfTElTVF9IRUFEKCZkZXZpY2UtPnJlcV9saXN0KTsKIAotCWRldmljZS0+U3RhdGUgPSBSTkRJU19ERVZfVU5JTklUSUFMSVpFRDsKKwlkZXZpY2UtPnN0YXRlID0gUk5ESVNfREVWX1VOSU5JVElBTElaRUQ7CiAKIAlyZXR1cm4gZGV2aWNlOwogfQogCi1zdGF0aWMgc3RydWN0IHJuZGlzX3JlcXVlc3QgKkdldFJuZGlzUmVxdWVzdChzdHJ1Y3Qgcm5kaXNfZGV2aWNlICpEZXZpY2UsCi0JCQkJCSAgICAgdTMyIE1lc3NhZ2VUeXBlLAotCQkJCQkgICAgIHUzMiBNZXNzYWdlTGVuZ3RoKQorc3RhdGljIHN0cnVjdCBybmRpc19yZXF1ZXN0ICpnZXRfcm5kaXNfcmVxdWVzdChzdHJ1Y3Qgcm5kaXNfZGV2aWNlICpkZXYsCisJCQkJCSAgICAgdTMyIG1zZ190eXBlLAorCQkJCQkgICAgIHUzMiBtc2dfbGVuKQogewogCXN0cnVjdCBybmRpc19yZXF1ZXN0ICpyZXF1ZXN0OwotCXN0cnVjdCBybmRpc19tZXNzYWdlICpybmRpc01lc3NhZ2U7CisJc3RydWN0IHJuZGlzX21lc3NhZ2UgKnJuZGlzX21zZzsKIAlzdHJ1Y3Qgcm5kaXNfc2V0X3JlcXVlc3QgKnNldDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0xMjksNjEgKzEyOSw2MSBAQAogCWlmICghcmVxdWVzdCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlyZXF1ZXN0LT5XYWl0RXZlbnQgPSBvc2RfV2FpdEV2ZW50Q3JlYXRlKCk7Ci0JaWYgKCFyZXF1ZXN0LT5XYWl0RXZlbnQpIHsKKwlyZXF1ZXN0LT53YWl0ZXZlbnQgPSBvc2Rfd2FpdGV2ZW50X2NyZWF0ZSgpOworCWlmICghcmVxdWVzdC0+d2FpdGV2ZW50KSB7CiAJCWtmcmVlKHJlcXVlc3QpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlybmRpc01lc3NhZ2UgPSAmcmVxdWVzdC0+UmVxdWVzdE1lc3NhZ2U7Ci0Jcm5kaXNNZXNzYWdlLT5OZGlzTWVzc2FnZVR5cGUgPSBNZXNzYWdlVHlwZTsKLQlybmRpc01lc3NhZ2UtPk1lc3NhZ2VMZW5ndGggPSBNZXNzYWdlTGVuZ3RoOworCXJuZGlzX21zZyA9ICZyZXF1ZXN0LT5yZXF1ZXN0X21zZzsKKwlybmRpc19tc2ctPm5kaXNfbXNnX3R5cGUgPSBtc2dfdHlwZTsKKwlybmRpc19tc2ctPm1zZ19sZW4gPSBtc2dfbGVuOwogCiAJLyoKIAkgKiBTZXQgdGhlIHJlcXVlc3QgaWQuIFRoaXMgZmllbGQgaXMgYWx3YXlzIGFmdGVyIHRoZSBybmRpcyBoZWFkZXIgZm9yCiAJICogcmVxdWVzdC9yZXNwb25zZSBwYWNrZXQgdHlwZXMgc28gd2UganVzdCB1c2VkIHRoZSBTZXRSZXF1ZXN0IGFzIGEKIAkgKiB0ZW1wbGF0ZQogCSAqLwotCXNldCA9ICZybmRpc01lc3NhZ2UtPk1lc3NhZ2UuU2V0UmVxdWVzdDsKLQlzZXQtPlJlcXVlc3RJZCA9IGF0b21pY19pbmNfcmV0dXJuKCZEZXZpY2UtPk5ld1JlcXVlc3RJZCk7CisJc2V0ID0gJnJuZGlzX21zZy0+bXNnLnNldF9yZXE7CisJc2V0LT5yZXFfaWQgPSBhdG9taWNfaW5jX3JldHVybigmZGV2LT5uZXdfcmVxX2lkKTsKIAogCS8qIEFkZCB0byB0aGUgcmVxdWVzdCBsaXN0ICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJkRldmljZS0+cmVxdWVzdF9sb2NrLCBmbGFncyk7Ci0JbGlzdF9hZGRfdGFpbCgmcmVxdWVzdC0+TGlzdEVudHJ5LCAmRGV2aWNlLT5SZXF1ZXN0TGlzdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmRGV2aWNlLT5yZXF1ZXN0X2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5yZXF1ZXN0X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZF90YWlsKCZyZXF1ZXN0LT5saXN0X2VudCwgJmRldi0+cmVxX2xpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+cmVxdWVzdF9sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gcmVxdWVzdDsKIH0KIAotc3RhdGljIHZvaWQgUHV0Um5kaXNSZXF1ZXN0KHN0cnVjdCBybmRpc19kZXZpY2UgKkRldmljZSwKLQkJCSAgICBzdHJ1Y3Qgcm5kaXNfcmVxdWVzdCAqUmVxdWVzdCkKK3N0YXRpYyB2b2lkIHB1dF9ybmRpc19yZXF1ZXN0KHN0cnVjdCBybmRpc19kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3Qgcm5kaXNfcmVxdWVzdCAqcmVxKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmRGV2aWNlLT5yZXF1ZXN0X2xvY2ssIGZsYWdzKTsKLQlsaXN0X2RlbCgmUmVxdWVzdC0+TGlzdEVudHJ5KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZEZXZpY2UtPnJlcXVlc3RfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnJlcXVlc3RfbG9jaywgZmxhZ3MpOworCWxpc3RfZGVsKCZyZXEtPmxpc3RfZW50KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnJlcXVlc3RfbG9jaywgZmxhZ3MpOwogCi0Ja2ZyZWUoUmVxdWVzdC0+V2FpdEV2ZW50KTsKLQlrZnJlZShSZXF1ZXN0KTsKKwlrZnJlZShyZXEtPndhaXRldmVudCk7CisJa2ZyZWUocmVxKTsKIH0KIAotc3RhdGljIHZvaWQgRHVtcFJuZGlzTWVzc2FnZShzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSAqUm5kaXNNZXNzYWdlKQorc3RhdGljIHZvaWQgZHVtcF9ybmRpc19tZXNzYWdlKHN0cnVjdCBybmRpc19tZXNzYWdlICpybmRpc19tc2cpCiB7Ci0Jc3dpdGNoIChSbmRpc01lc3NhZ2UtPk5kaXNNZXNzYWdlVHlwZSkgeworCXN3aXRjaCAocm5kaXNfbXNnLT5uZGlzX21zZ190eXBlKSB7CiAJY2FzZSBSRU1PVEVfTkRJU19QQUNLRVRfTVNHOgogCQlEUFJJTlRfREJHKE5FVFZTQywgIlJFTU9URV9ORElTX1BBQ0tFVF9NU0cgKGxlbiAldSwgIgogCQkJICAgImRhdGEgb2Zmc2V0ICV1IGRhdGEgbGVuICV1LCAjIG9vYiAldSwgIgogCQkJICAgIm9vYiBvZmZzZXQgJXUsIG9vYiBsZW4gJXUsIHBrdCBvZmZzZXQgJXUsICIKIAkJCSAgICJwa3QgbGVuICV1IiwKLQkJCSAgIFJuZGlzTWVzc2FnZS0+TWVzc2FnZUxlbmd0aCwKLQkJCSAgIFJuZGlzTWVzc2FnZS0+TWVzc2FnZS5QYWNrZXQuRGF0YU9mZnNldCwKLQkJCSAgIFJuZGlzTWVzc2FnZS0+TWVzc2FnZS5QYWNrZXQuRGF0YUxlbmd0aCwKLQkJCSAgIFJuZGlzTWVzc2FnZS0+TWVzc2FnZS5QYWNrZXQuTnVtT09CRGF0YUVsZW1lbnRzLAotCQkJICAgUm5kaXNNZXNzYWdlLT5NZXNzYWdlLlBhY2tldC5PT0JEYXRhT2Zmc2V0LAotCQkJICAgUm5kaXNNZXNzYWdlLT5NZXNzYWdlLlBhY2tldC5PT0JEYXRhTGVuZ3RoLAotCQkJICAgUm5kaXNNZXNzYWdlLT5NZXNzYWdlLlBhY2tldC5QZXJQYWNrZXRJbmZvT2Zmc2V0LAotCQkJICAgUm5kaXNNZXNzYWdlLT5NZXNzYWdlLlBhY2tldC5QZXJQYWNrZXRJbmZvTGVuZ3RoKTsKKwkJCSAgIHJuZGlzX21zZy0+bXNnX2xlbiwKKwkJCSAgIHJuZGlzX21zZy0+bXNnLnBrdC5kYXRhX29mZnNldCwKKwkJCSAgIHJuZGlzX21zZy0+bXNnLnBrdC5kYXRhX2xlbiwKKwkJCSAgIHJuZGlzX21zZy0+bXNnLnBrdC5udW1fb29iX2RhdGFfZWxlbWVudHMsCisJCQkgICBybmRpc19tc2ctPm1zZy5wa3Qub29iX2RhdGFfb2Zmc2V0LAorCQkJICAgcm5kaXNfbXNnLT5tc2cucGt0Lm9vYl9kYXRhX2xlbiwKKwkJCSAgIHJuZGlzX21zZy0+bXNnLnBrdC5wZXJfcGt0X2luZm9fb2Zmc2V0LAorCQkJICAgcm5kaXNfbXNnLT5tc2cucGt0LnBlcl9wa3RfaW5mb19sZW4pOwogCQlicmVhazsKIAogCWNhc2UgUkVNT1RFX05ESVNfSU5JVElBTElaRV9DTVBMVDoKQEAgLTE5MSwxNDcgKzE5MSwxNTcgQEAKIAkJCSIobGVuICV1LCBpZCAweCV4LCBzdGF0dXMgMHgleCwgbWFqb3IgJWQsIG1pbm9yICVkLCAiCiAJCQkiZGV2aWNlIGZsYWdzICVkLCBtYXggeGZlciBzaXplIDB4JXgsIG1heCBwa3RzICV1LCAiCiAJCQkicGt0IGFsaWduZWQgJXUpIiwKLQkJCVJuZGlzTWVzc2FnZS0+TWVzc2FnZUxlbmd0aCwKLQkJCVJuZGlzTWVzc2FnZS0+TWVzc2FnZS5Jbml0aWFsaXplQ29tcGxldGUuUmVxdWVzdElkLAotCQkJUm5kaXNNZXNzYWdlLT5NZXNzYWdlLkluaXRpYWxpemVDb21wbGV0ZS5TdGF0dXMsCi0JCQlSbmRpc01lc3NhZ2UtPk1lc3NhZ2UuSW5pdGlhbGl6ZUNvbXBsZXRlLk1ham9yVmVyc2lvbiwKLQkJCVJuZGlzTWVzc2FnZS0+TWVzc2FnZS5Jbml0aWFsaXplQ29tcGxldGUuTWlub3JWZXJzaW9uLAotCQkJUm5kaXNNZXNzYWdlLT5NZXNzYWdlLkluaXRpYWxpemVDb21wbGV0ZS5EZXZpY2VGbGFncywKLQkJCVJuZGlzTWVzc2FnZS0+TWVzc2FnZS5Jbml0aWFsaXplQ29tcGxldGUuTWF4VHJhbnNmZXJTaXplLAotCQkJUm5kaXNNZXNzYWdlLT5NZXNzYWdlLkluaXRpYWxpemVDb21wbGV0ZS5NYXhQYWNrZXRzUGVyTWVzc2FnZSwKLQkJCVJuZGlzTWVzc2FnZS0+TWVzc2FnZS5Jbml0aWFsaXplQ29tcGxldGUuUGFja2V0QWxpZ25tZW50RmFjdG9yKTsKKwkJCXJuZGlzX21zZy0+bXNnX2xlbiwKKwkJCXJuZGlzX21zZy0+bXNnLmluaXRfY29tcGxldGUucmVxX2lkLAorCQkJcm5kaXNfbXNnLT5tc2cuaW5pdF9jb21wbGV0ZS5zdGF0dXMsCisJCQlybmRpc19tc2ctPm1zZy5pbml0X2NvbXBsZXRlLm1ham9yX3ZlciwKKwkJCXJuZGlzX21zZy0+bXNnLmluaXRfY29tcGxldGUubWlub3JfdmVyLAorCQkJcm5kaXNfbXNnLT5tc2cuaW5pdF9jb21wbGV0ZS5kZXZfZmxhZ3MsCisJCQlybmRpc19tc2ctPm1zZy5pbml0X2NvbXBsZXRlLm1heF94ZmVyX3NpemUsCisJCQlybmRpc19tc2ctPm1zZy5pbml0X2NvbXBsZXRlLgorCQkJICAgbWF4X3BrdF9wZXJfbXNnLAorCQkJcm5kaXNfbXNnLT5tc2cuaW5pdF9jb21wbGV0ZS4KKwkJCSAgIHBrdF9hbGlnbm1lbnRfZmFjdG9yKTsKIAkJYnJlYWs7CiAKIAljYXNlIFJFTU9URV9ORElTX1FVRVJZX0NNUExUOgogCQlEUFJJTlRfREJHKE5FVFZTQywgIlJFTU9URV9ORElTX1FVRVJZX0NNUExUICIKIAkJCSIobGVuICV1LCBpZCAweCV4LCBzdGF0dXMgMHgleCwgYnVmIGxlbiAldSwgIgogCQkJImJ1ZiBvZmZzZXQgJXUpIiwKLQkJCVJuZGlzTWVzc2FnZS0+TWVzc2FnZUxlbmd0aCwKLQkJCVJuZGlzTWVzc2FnZS0+TWVzc2FnZS5RdWVyeUNvbXBsZXRlLlJlcXVlc3RJZCwKLQkJCVJuZGlzTWVzc2FnZS0+TWVzc2FnZS5RdWVyeUNvbXBsZXRlLlN0YXR1cywKLQkJCVJuZGlzTWVzc2FnZS0+TWVzc2FnZS5RdWVyeUNvbXBsZXRlLkluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoLAotCQkJUm5kaXNNZXNzYWdlLT5NZXNzYWdlLlF1ZXJ5Q29tcGxldGUuSW5mb3JtYXRpb25CdWZmZXJPZmZzZXQpOworCQkJcm5kaXNfbXNnLT5tc2dfbGVuLAorCQkJcm5kaXNfbXNnLT5tc2cucXVlcnlfY29tcGxldGUucmVxX2lkLAorCQkJcm5kaXNfbXNnLT5tc2cucXVlcnlfY29tcGxldGUuc3RhdHVzLAorCQkJcm5kaXNfbXNnLT5tc2cucXVlcnlfY29tcGxldGUuCisJCQkgICBpbmZvX2J1ZmxlbiwKKwkJCXJuZGlzX21zZy0+bXNnLnF1ZXJ5X2NvbXBsZXRlLgorCQkJICAgaW5mb19idWZfb2Zmc2V0KTsKIAkJYnJlYWs7CiAKIAljYXNlIFJFTU9URV9ORElTX1NFVF9DTVBMVDoKIAkJRFBSSU5UX0RCRyhORVRWU0MsCiAJCQkiUkVNT1RFX05ESVNfU0VUX0NNUExUIChsZW4gJXUsIGlkIDB4JXgsIHN0YXR1cyAweCV4KSIsCi0JCQlSbmRpc01lc3NhZ2UtPk1lc3NhZ2VMZW5ndGgsCi0JCQlSbmRpc01lc3NhZ2UtPk1lc3NhZ2UuU2V0Q29tcGxldGUuUmVxdWVzdElkLAotCQkJUm5kaXNNZXNzYWdlLT5NZXNzYWdlLlNldENvbXBsZXRlLlN0YXR1cyk7CisJCQlybmRpc19tc2ctPm1zZ19sZW4sCisJCQlybmRpc19tc2ctPm1zZy5zZXRfY29tcGxldGUucmVxX2lkLAorCQkJcm5kaXNfbXNnLT5tc2cuc2V0X2NvbXBsZXRlLnN0YXR1cyk7CiAJCWJyZWFrOwogCiAJY2FzZSBSRU1PVEVfTkRJU19JTkRJQ0FURV9TVEFUVVNfTVNHOgogCQlEUFJJTlRfREJHKE5FVFZTQywgIlJFTU9URV9ORElTX0lORElDQVRFX1NUQVRVU19NU0cgIgogCQkJIihsZW4gJXUsIHN0YXR1cyAweCV4LCBidWYgbGVuICV1LCBidWYgb2Zmc2V0ICV1KSIsCi0JCQlSbmRpc01lc3NhZ2UtPk1lc3NhZ2VMZW5ndGgsCi0JCQlSbmRpc01lc3NhZ2UtPk1lc3NhZ2UuSW5kaWNhdGVTdGF0dXMuU3RhdHVzLAotCQkJUm5kaXNNZXNzYWdlLT5NZXNzYWdlLkluZGljYXRlU3RhdHVzLlN0YXR1c0J1ZmZlckxlbmd0aCwKLQkJCVJuZGlzTWVzc2FnZS0+TWVzc2FnZS5JbmRpY2F0ZVN0YXR1cy5TdGF0dXNCdWZmZXJPZmZzZXQpOworCQkJcm5kaXNfbXNnLT5tc2dfbGVuLAorCQkJcm5kaXNfbXNnLT5tc2cuaW5kaWNhdGVfc3RhdHVzLnN0YXR1cywKKwkJCXJuZGlzX21zZy0+bXNnLmluZGljYXRlX3N0YXR1cy5zdGF0dXNfYnVmbGVuLAorCQkJcm5kaXNfbXNnLT5tc2cuaW5kaWNhdGVfc3RhdHVzLnN0YXR1c19idWZfb2Zmc2V0KTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgogCQlEUFJJTlRfREJHKE5FVFZTQywgIjB4JXggKGxlbiAldSkiLAotCQkJUm5kaXNNZXNzYWdlLT5OZGlzTWVzc2FnZVR5cGUsCi0JCQlSbmRpc01lc3NhZ2UtPk1lc3NhZ2VMZW5ndGgpOworCQkJcm5kaXNfbXNnLT5uZGlzX21zZ190eXBlLAorCQkJcm5kaXNfbXNnLT5tc2dfbGVuKTsKIAkJYnJlYWs7CiAJfQogfQogCi1zdGF0aWMgaW50IFJuZGlzRmlsdGVyU2VuZFJlcXVlc3Qoc3RydWN0IHJuZGlzX2RldmljZSAqRGV2aWNlLAotCQkJCSAgc3RydWN0IHJuZGlzX3JlcXVlc3QgKlJlcXVlc3QpCitzdGF0aWMgaW50IHJuZGlzX2ZpbHRlcl9zZW5kX3JlcXVlc3Qoc3RydWN0IHJuZGlzX2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IHJuZGlzX3JlcXVlc3QgKnJlcSkKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpwYWNrZXQ7CiAKIAkvKiBTZXR1cCB0aGUgcGFja2V0IHRvIHNlbmQgaXQgKi8KLQlwYWNrZXQgPSAmUmVxdWVzdC0+UGFja2V0OworCXBhY2tldCA9ICZyZXEtPnBrdDsKIAotCXBhY2tldC0+SXNEYXRhUGFja2V0ID0gZmFsc2U7Ci0JcGFja2V0LT5Ub3RhbERhdGFCdWZmZXJMZW5ndGggPSBSZXF1ZXN0LT5SZXF1ZXN0TWVzc2FnZS5NZXNzYWdlTGVuZ3RoOwotCXBhY2tldC0+UGFnZUJ1ZmZlckNvdW50ID0gMTsKKwlwYWNrZXQtPmlzX2RhdGFfcGt0ID0gZmFsc2U7CisJcGFja2V0LT50b3RhbF9kYXRhX2J1ZmxlbiA9IHJlcS0+cmVxdWVzdF9tc2cubXNnX2xlbjsKKwlwYWNrZXQtPnBhZ2VfYnVmX2NudCA9IDE7CiAKLQlwYWNrZXQtPlBhZ2VCdWZmZXJzWzBdLlBmbiA9IHZpcnRfdG9fcGh5cygmUmVxdWVzdC0+UmVxdWVzdE1lc3NhZ2UpID4+CisJcGFja2V0LT5wYWdlX2J1ZlswXS5QZm4gPSB2aXJ0X3RvX3BoeXMoJnJlcS0+cmVxdWVzdF9tc2cpID4+CiAJCQkJCVBBR0VfU0hJRlQ7Ci0JcGFja2V0LT5QYWdlQnVmZmVyc1swXS5MZW5ndGggPSBSZXF1ZXN0LT5SZXF1ZXN0TWVzc2FnZS5NZXNzYWdlTGVuZ3RoOwotCXBhY2tldC0+UGFnZUJ1ZmZlcnNbMF0uT2Zmc2V0ID0KLQkJKHVuc2lnbmVkIGxvbmcpJlJlcXVlc3QtPlJlcXVlc3RNZXNzYWdlICYgKFBBR0VfU0laRSAtIDEpOworCXBhY2tldC0+cGFnZV9idWZbMF0uTGVuZ3RoID0gcmVxLT5yZXF1ZXN0X21zZy5tc2dfbGVuOworCXBhY2tldC0+cGFnZV9idWZbMF0uT2Zmc2V0ID0KKwkJKHVuc2lnbmVkIGxvbmcpJnJlcS0+cmVxdWVzdF9tc2cgJiAoUEFHRV9TSVpFIC0gMSk7CiAKLQlwYWNrZXQtPkNvbXBsZXRpb24uU2VuZC5TZW5kQ29tcGxldGlvbkNvbnRleHQgPSBSZXF1ZXN0Oy8qIHBhY2tldDsgKi8KLQlwYWNrZXQtPkNvbXBsZXRpb24uU2VuZC5PblNlbmRDb21wbGV0aW9uID0KLQkJUm5kaXNGaWx0ZXJPblNlbmRSZXF1ZXN0Q29tcGxldGlvbjsKLQlwYWNrZXQtPkNvbXBsZXRpb24uU2VuZC5TZW5kQ29tcGxldGlvblRpZCA9ICh1bnNpZ25lZCBsb25nKURldmljZTsKKwlwYWNrZXQtPmNvbXBsZXRpb24uc2VuZC5zZW5kX2NvbXBsZXRpb25fY3R4ID0gcmVxOy8qIHBhY2tldDsgKi8KKwlwYWNrZXQtPmNvbXBsZXRpb24uc2VuZC5zZW5kX2NvbXBsZXRpb24gPQorCQlybmRpc19maWx0ZXJfc2VuZF9yZXF1ZXN0X2NvbXBsZXRpb247CisJcGFja2V0LT5jb21wbGV0aW9uLnNlbmQuc2VuZF9jb21wbGV0aW9uX3RpZCA9ICh1bnNpZ25lZCBsb25nKWRldjsKIAotCXJldCA9IGdSbmRpc0ZpbHRlci5Jbm5lckRyaXZlci5PblNlbmQoRGV2aWNlLT5OZXREZXZpY2UtPkRldmljZSwgcGFja2V0KTsKKwlyZXQgPSBybmRpc19maWx0ZXIuaW5uZXJfZHJ2LnNlbmQoZGV2LT5uZXRfZGV2LT5kZXYsIHBhY2tldCk7CiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgUm5kaXNGaWx0ZXJSZWNlaXZlUmVzcG9uc2Uoc3RydWN0IHJuZGlzX2RldmljZSAqRGV2aWNlLAotCQkJCSAgICAgICBzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSAqUmVzcG9uc2UpCitzdGF0aWMgdm9pZCBybmRpc19maWx0ZXJfcmVjZWl2ZV9yZXNwb25zZShzdHJ1Y3Qgcm5kaXNfZGV2aWNlICpkZXYsCisJCQkJICAgICAgIHN0cnVjdCBybmRpc19tZXNzYWdlICpyZXNwKQogewogCXN0cnVjdCBybmRpc19yZXF1ZXN0ICpyZXF1ZXN0ID0gTlVMTDsKIAlib29sIGZvdW5kID0gZmFsc2U7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZEZXZpY2UtPnJlcXVlc3RfbG9jaywgZmxhZ3MpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkocmVxdWVzdCwgJkRldmljZS0+UmVxdWVzdExpc3QsIExpc3RFbnRyeSkgeworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnJlcXVlc3RfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnkocmVxdWVzdCwgJmRldi0+cmVxX2xpc3QsIGxpc3RfZW50KSB7CiAJCS8qCiAJCSAqIEFsbCByZXF1ZXN0L3Jlc3BvbnNlIG1lc3NhZ2UgY29udGFpbnMgUmVxdWVzdElkIGFzIHRoZSAxc3QKIAkJICogZmllbGQKIAkJICovCi0JCWlmIChyZXF1ZXN0LT5SZXF1ZXN0TWVzc2FnZS5NZXNzYWdlLkluaXRpYWxpemVSZXF1ZXN0LlJlcXVlc3RJZAotCQkgICAgPT0gUmVzcG9uc2UtPk1lc3NhZ2UuSW5pdGlhbGl6ZUNvbXBsZXRlLlJlcXVlc3RJZCkgeworCQlpZiAocmVxdWVzdC0+cmVxdWVzdF9tc2cubXNnLmluaXRfcmVxLnJlcV9pZAorCQkgICAgPT0gcmVzcC0+bXNnLmluaXRfY29tcGxldGUucmVxX2lkKSB7CiAJCQlEUFJJTlRfREJHKE5FVFZTQywgImZvdW5kIHJuZGlzIHJlcXVlc3QgZm9yICIKIAkJCQkidGhpcyByZXNwb25zZSAoaWQgMHgleCByZXEgdHlwZSAweCV4IHJlcyAiCiAJCQkJInR5cGUgMHgleCkiLAotCQkJCXJlcXVlc3QtPlJlcXVlc3RNZXNzYWdlLk1lc3NhZ2UuSW5pdGlhbGl6ZVJlcXVlc3QuUmVxdWVzdElkLAotCQkJCXJlcXVlc3QtPlJlcXVlc3RNZXNzYWdlLk5kaXNNZXNzYWdlVHlwZSwKLQkJCQlSZXNwb25zZS0+TmRpc01lc3NhZ2VUeXBlKTsKKwkJCQlyZXF1ZXN0LT5yZXF1ZXN0X21zZy5tc2cuCisJCQkJICAgaW5pdF9yZXEucmVxX2lkLAorCQkJCXJlcXVlc3QtPnJlcXVlc3RfbXNnLm5kaXNfbXNnX3R5cGUsCisJCQkJcmVzcC0+bmRpc19tc2dfdHlwZSk7CiAKIAkJCWZvdW5kID0gdHJ1ZTsKIAkJCWJyZWFrOwogCQl9CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJkRldmljZS0+cmVxdWVzdF9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5yZXF1ZXN0X2xvY2ssIGZsYWdzKTsKIAogCWlmIChmb3VuZCkgewotCQlpZiAoUmVzcG9uc2UtPk1lc3NhZ2VMZW5ndGggPD0gc2l6ZW9mKHN0cnVjdCBybmRpc19tZXNzYWdlKSkgewotCQkJbWVtY3B5KCZyZXF1ZXN0LT5SZXNwb25zZU1lc3NhZ2UsIFJlc3BvbnNlLAotCQkJICAgICAgIFJlc3BvbnNlLT5NZXNzYWdlTGVuZ3RoKTsKKwkJaWYgKHJlc3AtPm1zZ19sZW4gPD0gc2l6ZW9mKHN0cnVjdCBybmRpc19tZXNzYWdlKSkgeworCQkJbWVtY3B5KCZyZXF1ZXN0LT5yZXNwb25zZV9tc2csIHJlc3AsCisJCQkgICAgICAgcmVzcC0+bXNnX2xlbik7CiAJCX0gZWxzZSB7CiAJCQlEUFJJTlRfRVJSKE5FVFZTQywgInJuZGlzIHJlc3BvbnNlIGJ1ZmZlciBvdmVyZmxvdyAiCiAJCQkJICAiZGV0ZWN0ZWQgKHNpemUgJXUgbWF4ICV6dSkiLAotCQkJCSAgUmVzcG9uc2UtPk1lc3NhZ2VMZW5ndGgsCisJCQkJICByZXNwLT5tc2dfbGVuLAogCQkJCSAgc2l6ZW9mKHN0cnVjdCBybmRpc19maWx0ZXJfcGFja2V0KSk7CiAKLQkJCWlmIChSZXNwb25zZS0+TmRpc01lc3NhZ2VUeXBlID09CisJCQlpZiAocmVzcC0+bmRpc19tc2dfdHlwZSA9PQogCQkJICAgIFJFTU9URV9ORElTX1JFU0VUX0NNUExUKSB7CiAJCQkJLyogZG9lcyBub3QgaGF2ZSBhIHJlcXVlc3QgaWQgZmllbGQgKi8KLQkJCQlyZXF1ZXN0LT5SZXNwb25zZU1lc3NhZ2UuTWVzc2FnZS5SZXNldENvbXBsZXRlLlN0YXR1cyA9IFNUQVRVU19CVUZGRVJfT1ZFUkZMT1c7CisJCQkJcmVxdWVzdC0+cmVzcG9uc2VfbXNnLm1zZy5yZXNldF9jb21wbGV0ZS4KKwkJCQkJc3RhdHVzID0gU1RBVFVTX0JVRkZFUl9PVkVSRkxPVzsKIAkJCX0gZWxzZSB7Ci0JCQkJcmVxdWVzdC0+UmVzcG9uc2VNZXNzYWdlLk1lc3NhZ2UuSW5pdGlhbGl6ZUNvbXBsZXRlLlN0YXR1cyA9IFNUQVRVU19CVUZGRVJfT1ZFUkZMT1c7CisJCQkJcmVxdWVzdC0+cmVzcG9uc2VfbXNnLm1zZy4KKwkJCQlpbml0X2NvbXBsZXRlLnN0YXR1cyA9CisJCQkJCVNUQVRVU19CVUZGRVJfT1ZFUkZMT1c7CiAJCQl9CiAJCX0KIAotCQlvc2RfV2FpdEV2ZW50U2V0KHJlcXVlc3QtPldhaXRFdmVudCk7CisJCW9zZF93YWl0ZXZlbnRfc2V0KHJlcXVlc3QtPndhaXRldmVudCk7CiAJfSBlbHNlIHsKIAkJRFBSSU5UX0VSUihORVRWU0MsICJubyBybmRpcyByZXF1ZXN0IGZvdW5kIGZvciB0aGlzIHJlc3BvbnNlICIKIAkJCSAgICIoaWQgMHgleCByZXMgdHlwZSAweCV4KSIsCi0JCQkgICBSZXNwb25zZS0+TWVzc2FnZS5Jbml0aWFsaXplQ29tcGxldGUuUmVxdWVzdElkLAotCQkJICAgUmVzcG9uc2UtPk5kaXNNZXNzYWdlVHlwZSk7CisJCQkgICByZXNwLT5tc2cuaW5pdF9jb21wbGV0ZS5yZXFfaWQsCisJCQkgICByZXNwLT5uZGlzX21zZ190eXBlKTsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIFJuZGlzRmlsdGVyUmVjZWl2ZUluZGljYXRlU3RhdHVzKHN0cnVjdCBybmRpc19kZXZpY2UgKkRldmljZSwKLQkJCQkJICAgICBzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSAqUmVzcG9uc2UpCitzdGF0aWMgdm9pZCBybmRpc19maWx0ZXJfcmVjZWl2ZV9pbmRpY2F0ZV9zdGF0dXMoc3RydWN0IHJuZGlzX2RldmljZSAqZGV2LAorCQkJCQkgICAgIHN0cnVjdCBybmRpc19tZXNzYWdlICpyZXNwKQogewogCXN0cnVjdCBybmRpc19pbmRpY2F0ZV9zdGF0dXMgKmluZGljYXRlID0KLQkJCSZSZXNwb25zZS0+TWVzc2FnZS5JbmRpY2F0ZVN0YXR1czsKKwkJCSZyZXNwLT5tc2cuaW5kaWNhdGVfc3RhdHVzOwogCi0JaWYgKGluZGljYXRlLT5TdGF0dXMgPT0gUk5ESVNfU1RBVFVTX01FRElBX0NPTk5FQ1QpIHsKLQkJZ1JuZGlzRmlsdGVyLklubmVyRHJpdmVyLk9uTGlua1N0YXR1c0NoYW5nZWQoRGV2aWNlLT5OZXREZXZpY2UtPkRldmljZSwgMSk7Ci0JfSBlbHNlIGlmIChpbmRpY2F0ZS0+U3RhdHVzID09IFJORElTX1NUQVRVU19NRURJQV9ESVNDT05ORUNUKSB7Ci0JCWdSbmRpc0ZpbHRlci5Jbm5lckRyaXZlci5PbkxpbmtTdGF0dXNDaGFuZ2VkKERldmljZS0+TmV0RGV2aWNlLT5EZXZpY2UsIDApOworCWlmIChpbmRpY2F0ZS0+c3RhdHVzID09IFJORElTX1NUQVRVU19NRURJQV9DT05ORUNUKSB7CisJCXJuZGlzX2ZpbHRlci5pbm5lcl9kcnYubGlua19zdGF0dXNfY2hhbmdlKAorCQkJZGV2LT5uZXRfZGV2LT5kZXYsIDEpOworCX0gZWxzZSBpZiAoaW5kaWNhdGUtPnN0YXR1cyA9PSBSTkRJU19TVEFUVVNfTUVESUFfRElTQ09OTkVDVCkgeworCQlybmRpc19maWx0ZXIuaW5uZXJfZHJ2Lmxpbmtfc3RhdHVzX2NoYW5nZSgKKwkJCWRldi0+bmV0X2Rldi0+ZGV2LCAwKTsKIAl9IGVsc2UgewogCQkvKgogCQkgKiBUT0RPOgpAQCAtMzM5LDE4ICszNDksMTggQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIFJuZGlzRmlsdGVyUmVjZWl2ZURhdGEoc3RydWN0IHJuZGlzX2RldmljZSAqRGV2aWNlLAotCQkJCSAgIHN0cnVjdCBybmRpc19tZXNzYWdlICpNZXNzYWdlLAotCQkJCSAgIHN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpQYWNrZXQpCitzdGF0aWMgdm9pZCBybmRpc19maWx0ZXJfcmVjZWl2ZV9kYXRhKHN0cnVjdCBybmRpc19kZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSAqbXNnLAorCQkJCSAgIHN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpwa3QpCiB7Ci0Jc3RydWN0IHJuZGlzX3BhY2tldCAqcm5kaXNQYWNrZXQ7Ci0JdTMyIGRhdGFPZmZzZXQ7CisJc3RydWN0IHJuZGlzX3BhY2tldCAqcm5kaXNfcGt0OworCXUzMiBkYXRhX29mZnNldDsKIAogCS8qIGVtcHR5IGV0aGVybmV0IGZyYW1lID8/ICovCiAJLyogQVNTRVJUKFBhY2tldC0+UGFnZUJ1ZmZlcnNbMF0uTGVuZ3RoID4gKi8KIAkvKiAJUk5ESVNfTUVTU0FHRV9TSVpFKHN0cnVjdCBybmRpc19wYWNrZXQpKTsgKi8KIAotCXJuZGlzUGFja2V0ID0gJk1lc3NhZ2UtPk1lc3NhZ2UuUGFja2V0OworCXJuZGlzX3BrdCA9ICZtc2ctPm1zZy5wa3Q7CiAKIAkvKgogCSAqIEZJWE1FOiBIYW5kbGUgbXVsdGlwbGUgcm5kaXMgcGt0IG1zZ3MgdGhhdCBtYXliZSBlbmNsb3NlZCBpbiB0aGlzCkBAIC0zNTgsNDggKzM2OCw0OCBAQAogCSAqLwogCiAJLyogUmVtb3ZlIHRoZSBybmRpcyBoZWFkZXIgYW5kIHBhc3MgaXQgYmFjayB1cCB0aGUgc3RhY2sgKi8KLQlkYXRhT2Zmc2V0ID0gUk5ESVNfSEVBREVSX1NJWkUgKyBybmRpc1BhY2tldC0+RGF0YU9mZnNldDsKKwlkYXRhX29mZnNldCA9IFJORElTX0hFQURFUl9TSVpFICsgcm5kaXNfcGt0LT5kYXRhX29mZnNldDsKIAotCVBhY2tldC0+VG90YWxEYXRhQnVmZmVyTGVuZ3RoIC09IGRhdGFPZmZzZXQ7Ci0JUGFja2V0LT5QYWdlQnVmZmVyc1swXS5PZmZzZXQgKz0gZGF0YU9mZnNldDsKLQlQYWNrZXQtPlBhZ2VCdWZmZXJzWzBdLkxlbmd0aCAtPSBkYXRhT2Zmc2V0OworCXBrdC0+dG90YWxfZGF0YV9idWZsZW4gLT0gZGF0YV9vZmZzZXQ7CisJcGt0LT5wYWdlX2J1ZlswXS5PZmZzZXQgKz0gZGF0YV9vZmZzZXQ7CisJcGt0LT5wYWdlX2J1ZlswXS5MZW5ndGggLT0gZGF0YV9vZmZzZXQ7CiAKLQlQYWNrZXQtPklzRGF0YVBhY2tldCA9IHRydWU7CisJcGt0LT5pc19kYXRhX3BrdCA9IHRydWU7CiAKLQlnUm5kaXNGaWx0ZXIuSW5uZXJEcml2ZXIuT25SZWNlaXZlQ2FsbGJhY2soRGV2aWNlLT5OZXREZXZpY2UtPkRldmljZSwKLQkJCQkJCSAgIFBhY2tldCk7CisJcm5kaXNfZmlsdGVyLmlubmVyX2Rydi5yZWN2X2NiKGRldi0+bmV0X2Rldi0+ZGV2LAorCQkJCQkJICAgcGt0KTsKIH0KIAotc3RhdGljIGludCBSbmRpc0ZpbHRlck9uUmVjZWl2ZShzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UsCi0JCQkJc3RydWN0IGh2X25ldHZzY19wYWNrZXQJKlBhY2tldCkKK3N0YXRpYyBpbnQgcm5kaXNfZmlsdGVyX3JlY2VpdmUoc3RydWN0IGh2X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBodl9uZXR2c2NfcGFja2V0CSpwa3QpCiB7Ci0Jc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldERldmljZSA9IERldmljZS0+RXh0ZW5zaW9uOwotCXN0cnVjdCBybmRpc19kZXZpY2UgKnJuZGlzRGV2aWNlOwotCXN0cnVjdCBybmRpc19tZXNzYWdlIHJuZGlzTWVzc2FnZTsKLQlzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSAqcm5kaXNIZWFkZXI7CisJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXYgPSBkZXYtPkV4dGVuc2lvbjsKKwlzdHJ1Y3Qgcm5kaXNfZGV2aWNlICpybmRpc19kZXY7CisJc3RydWN0IHJuZGlzX21lc3NhZ2Ugcm5kaXNfbXNnOworCXN0cnVjdCBybmRpc19tZXNzYWdlICpybmRpc19oZHI7CiAKLQlpZiAoIW5ldERldmljZSkKKwlpZiAoIW5ldF9kZXYpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyogTWFrZSBzdXJlIHRoZSBybmRpcyBkZXZpY2Ugc3RhdGUgaXMgaW5pdGlhbGl6ZWQgKi8KLQlpZiAoIW5ldERldmljZS0+RXh0ZW5zaW9uKSB7CisJaWYgKCFuZXRfZGV2LT5leHRlbnNpb24pIHsKIAkJRFBSSU5UX0VSUihORVRWU0MsICJnb3Qgcm5kaXMgbWVzc2FnZSBidXQgbm8gcm5kaXMgZGV2aWNlLi4uIgogCQkJICAiZHJvcHBpbmcgdGhpcyBtZXNzYWdlISIpOwogCQlyZXR1cm4gLTE7CiAJfQogCi0Jcm5kaXNEZXZpY2UgPSAoc3RydWN0IHJuZGlzX2RldmljZSAqKW5ldERldmljZS0+RXh0ZW5zaW9uOwotCWlmIChybmRpc0RldmljZS0+U3RhdGUgPT0gUk5ESVNfREVWX1VOSU5JVElBTElaRUQpIHsKKwlybmRpc19kZXYgPSAoc3RydWN0IHJuZGlzX2RldmljZSAqKW5ldF9kZXYtPmV4dGVuc2lvbjsKKwlpZiAocm5kaXNfZGV2LT5zdGF0ZSA9PSBSTkRJU19ERVZfVU5JTklUSUFMSVpFRCkgewogCQlEUFJJTlRfRVJSKE5FVFZTQywgImdvdCBybmRpcyBtZXNzYWdlIGJ1dCBybmRpcyBkZXZpY2UgIgogCQkJICAgInVuaW5pdGlhbGl6ZWQuLi5kcm9wcGluZyB0aGlzIG1lc3NhZ2UhIik7CiAJCXJldHVybiAtMTsKIAl9CiAKLQlybmRpc0hlYWRlciA9IChzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSAqKWttYXBfYXRvbWljKAotCQkJcGZuX3RvX3BhZ2UoUGFja2V0LT5QYWdlQnVmZmVyc1swXS5QZm4pLCBLTV9JUlEwKTsKKwlybmRpc19oZHIgPSAoc3RydWN0IHJuZGlzX21lc3NhZ2UgKilrbWFwX2F0b21pYygKKwkJCXBmbl90b19wYWdlKHBrdC0+cGFnZV9idWZbMF0uUGZuKSwgS01fSVJRMCk7CiAKLQlybmRpc0hlYWRlciA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKXJuZGlzSGVhZGVyICsKLQkJCVBhY2tldC0+UGFnZUJ1ZmZlcnNbMF0uT2Zmc2V0KTsKKwlybmRpc19oZHIgPSAodm9pZCAqKSgodW5zaWduZWQgbG9uZylybmRpc19oZHIgKworCQkJcGt0LT5wYWdlX2J1ZlswXS5PZmZzZXQpOwogCiAJLyogTWFrZSBzdXJlIHdlIGdvdCBhIHZhbGlkIHJuZGlzIG1lc3NhZ2UgKi8KIAkvKgpAQCAtNDA4LDM5ICs0MTgsMzkgQEAKIAkgKiByYW5nZSBzaG93cyA1MiBieXRlcwogCSAqICovCiAjaWYgMAotCWlmIChQYWNrZXQtPlRvdGFsRGF0YUJ1ZmZlckxlbmd0aCAhPSBybmRpc0hlYWRlci0+TWVzc2FnZUxlbmd0aCkgewotCQlrdW5tYXBfYXRvbWljKHJuZGlzSGVhZGVyIC0gUGFja2V0LT5QYWdlQnVmZmVyc1swXS5PZmZzZXQsCisJaWYgKHBrdC0+dG90YWxfZGF0YV9idWZsZW4gIT0gcm5kaXNfaGRyLT5tc2dfbGVuKSB7CisJCWt1bm1hcF9hdG9taWMocm5kaXNfaGRyIC0gcGt0LT5wYWdlX2J1ZlswXS5PZmZzZXQsCiAJCQkgICAgICBLTV9JUlEwKTsKIAogCQlEUFJJTlRfRVJSKE5FVFZTQywgImludmFsaWQgcm5kaXMgbWVzc2FnZT8gKGV4cGVjdGVkICV1ICIKIAkJCSAgICJieXRlcyBnb3QgJXUpLi4uZHJvcHBpbmcgdGhpcyBtZXNzYWdlISIsCi0JCQkgICBybmRpc0hlYWRlci0+TWVzc2FnZUxlbmd0aCwKLQkJCSAgIFBhY2tldC0+VG90YWxEYXRhQnVmZmVyTGVuZ3RoKTsKKwkJCSAgIHJuZGlzX2hkci0+bXNnX2xlbiwKKwkJCSAgIHBrdC0+dG90YWxfZGF0YV9idWZsZW4pOwogCQlyZXR1cm4gLTE7CiAJfQogI2VuZGlmCiAKLQlpZiAoKHJuZGlzSGVhZGVyLT5OZGlzTWVzc2FnZVR5cGUgIT0gUkVNT1RFX05ESVNfUEFDS0VUX01TRykgJiYKLQkgICAgKHJuZGlzSGVhZGVyLT5NZXNzYWdlTGVuZ3RoID4gc2l6ZW9mKHN0cnVjdCBybmRpc19tZXNzYWdlKSkpIHsKKwlpZiAoKHJuZGlzX2hkci0+bmRpc19tc2dfdHlwZSAhPSBSRU1PVEVfTkRJU19QQUNLRVRfTVNHKSAmJgorCSAgICAocm5kaXNfaGRyLT5tc2dfbGVuID4gc2l6ZW9mKHN0cnVjdCBybmRpc19tZXNzYWdlKSkpIHsKIAkJRFBSSU5UX0VSUihORVRWU0MsICJpbmNvbWluZyBybmRpcyBtZXNzYWdlIGJ1ZmZlciBvdmVyZmxvdyAiCiAJCQkgICAiZGV0ZWN0ZWQgKGdvdCAldSwgbWF4ICV6dSkuLi5tYXJraW5nIGl0IGFuIGVycm9yISIsCi0JCQkgICBybmRpc0hlYWRlci0+TWVzc2FnZUxlbmd0aCwKKwkJCSAgIHJuZGlzX2hkci0+bXNnX2xlbiwKIAkJCSAgIHNpemVvZihzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSkpOwogCX0KIAotCW1lbWNweSgmcm5kaXNNZXNzYWdlLCBybmRpc0hlYWRlciwKLQkJKHJuZGlzSGVhZGVyLT5NZXNzYWdlTGVuZ3RoID4gc2l6ZW9mKHN0cnVjdCBybmRpc19tZXNzYWdlKSkgPworCW1lbWNweSgmcm5kaXNfbXNnLCBybmRpc19oZHIsCisJCShybmRpc19oZHItPm1zZ19sZW4gPiBzaXplb2Yoc3RydWN0IHJuZGlzX21lc3NhZ2UpKSA/CiAJCQlzaXplb2Yoc3RydWN0IHJuZGlzX21lc3NhZ2UpIDoKLQkJCXJuZGlzSGVhZGVyLT5NZXNzYWdlTGVuZ3RoKTsKKwkJCXJuZGlzX2hkci0+bXNnX2xlbik7CiAKLQlrdW5tYXBfYXRvbWljKHJuZGlzSGVhZGVyIC0gUGFja2V0LT5QYWdlQnVmZmVyc1swXS5PZmZzZXQsIEtNX0lSUTApOworCWt1bm1hcF9hdG9taWMocm5kaXNfaGRyIC0gcGt0LT5wYWdlX2J1ZlswXS5PZmZzZXQsIEtNX0lSUTApOwogCi0JRHVtcFJuZGlzTWVzc2FnZSgmcm5kaXNNZXNzYWdlKTsKKwlkdW1wX3JuZGlzX21lc3NhZ2UoJnJuZGlzX21zZyk7CiAKLQlzd2l0Y2ggKHJuZGlzTWVzc2FnZS5OZGlzTWVzc2FnZVR5cGUpIHsKKwlzd2l0Y2ggKHJuZGlzX21zZy5uZGlzX21zZ190eXBlKSB7CiAJY2FzZSBSRU1PVEVfTkRJU19QQUNLRVRfTVNHOgogCQkvKiBkYXRhIG1zZyAqLwotCQlSbmRpc0ZpbHRlclJlY2VpdmVEYXRhKHJuZGlzRGV2aWNlLCAmcm5kaXNNZXNzYWdlLCBQYWNrZXQpOworCQlybmRpc19maWx0ZXJfcmVjZWl2ZV9kYXRhKHJuZGlzX2RldiwgJnJuZGlzX21zZywgcGt0KTsKIAkJYnJlYWs7CiAKIAljYXNlIFJFTU9URV9ORElTX0lOSVRJQUxJWkVfQ01QTFQ6CkBAIC00NDksMzcgKzQ1OSwzNyBAQAogCS8qIGNhc2UgUkVNT1RFX05ESVNfUkVTRVRfQ01QTFQ6ICovCiAJLyogY2FzZSBSRU1PVEVfTkRJU19LRUVQQUxJVkVfQ01QTFQ6ICovCiAJCS8qIGNvbXBsZXRpb24gbXNncyAqLwotCQlSbmRpc0ZpbHRlclJlY2VpdmVSZXNwb25zZShybmRpc0RldmljZSwgJnJuZGlzTWVzc2FnZSk7CisJCXJuZGlzX2ZpbHRlcl9yZWNlaXZlX3Jlc3BvbnNlKHJuZGlzX2RldiwgJnJuZGlzX21zZyk7CiAJCWJyZWFrOwogCiAJY2FzZSBSRU1PVEVfTkRJU19JTkRJQ0FURV9TVEFUVVNfTVNHOgogCQkvKiBub3RpZmljYXRpb24gbXNncyAqLwotCQlSbmRpc0ZpbHRlclJlY2VpdmVJbmRpY2F0ZVN0YXR1cyhybmRpc0RldmljZSwgJnJuZGlzTWVzc2FnZSk7CisJCXJuZGlzX2ZpbHRlcl9yZWNlaXZlX2luZGljYXRlX3N0YXR1cyhybmRpc19kZXYsICZybmRpc19tc2cpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlEUFJJTlRfRVJSKE5FVFZTQywgInVuaGFuZGxlZCBybmRpcyBtZXNzYWdlICh0eXBlICV1IGxlbiAldSkiLAotCQkJICAgcm5kaXNNZXNzYWdlLk5kaXNNZXNzYWdlVHlwZSwKLQkJCSAgIHJuZGlzTWVzc2FnZS5NZXNzYWdlTGVuZ3RoKTsKKwkJCSAgIHJuZGlzX21zZy5uZGlzX21zZ190eXBlLAorCQkJICAgcm5kaXNfbXNnLm1zZ19sZW4pOwogCQlicmVhazsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBSbmRpc0ZpbHRlclF1ZXJ5RGV2aWNlKHN0cnVjdCBybmRpc19kZXZpY2UgKkRldmljZSwgdTMyIE9pZCwKLQkJCQkgIHZvaWQgKlJlc3VsdCwgdTMyICpSZXN1bHRTaXplKQorc3RhdGljIGludCBybmRpc19maWx0ZXJfcXVlcnlfZGV2aWNlKHN0cnVjdCBybmRpc19kZXZpY2UgKmRldiwgdTMyIG9pZCwKKwkJCQkgIHZvaWQgKnJlc3VsdCwgdTMyICpyZXN1bHRfc2l6ZSkKIHsKIAlzdHJ1Y3Qgcm5kaXNfcmVxdWVzdCAqcmVxdWVzdDsKLQl1MzIgaW5yZXN1bHRTaXplID0gKlJlc3VsdFNpemU7CisJdTMyIGlucmVzdWx0X3NpemUgPSAqcmVzdWx0X3NpemU7CiAJc3RydWN0IHJuZGlzX3F1ZXJ5X3JlcXVlc3QgKnF1ZXJ5OwotCXN0cnVjdCBybmRpc19xdWVyeV9jb21wbGV0ZSAqcXVlcnlDb21wbGV0ZTsKKwlzdHJ1Y3Qgcm5kaXNfcXVlcnlfY29tcGxldGUgKnF1ZXJ5X2NvbXBsZXRlOwogCWludCByZXQgPSAwOwogCi0JaWYgKCFSZXN1bHQpCisJaWYgKCFyZXN1bHQpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JKlJlc3VsdFNpemUgPSAwOwotCXJlcXVlc3QgPSBHZXRSbmRpc1JlcXVlc3QoRGV2aWNlLCBSRU1PVEVfTkRJU19RVUVSWV9NU0csCisJKnJlc3VsdF9zaXplID0gMDsKKwlyZXF1ZXN0ID0gZ2V0X3JuZGlzX3JlcXVlc3QoZGV2LCBSRU1PVEVfTkRJU19RVUVSWV9NU0csCiAJCQlSTkRJU19NRVNTQUdFX1NJWkUoc3RydWN0IHJuZGlzX3F1ZXJ5X3JlcXVlc3QpKTsKIAlpZiAoIXJlcXVlc3QpIHsKIAkJcmV0ID0gLTE7CkBAIC00ODcsNzEgKzQ5Nyw3MSBAQAogCX0KIAogCS8qIFNldHVwIHRoZSBybmRpcyBxdWVyeSAqLwotCXF1ZXJ5ID0gJnJlcXVlc3QtPlJlcXVlc3RNZXNzYWdlLk1lc3NhZ2UuUXVlcnlSZXF1ZXN0OwotCXF1ZXJ5LT5PaWQgPSBPaWQ7Ci0JcXVlcnktPkluZm9ybWF0aW9uQnVmZmVyT2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBybmRpc19xdWVyeV9yZXF1ZXN0KTsKLQlxdWVyeS0+SW5mb3JtYXRpb25CdWZmZXJMZW5ndGggPSAwOwotCXF1ZXJ5LT5EZXZpY2VWY0hhbmRsZSA9IDA7CisJcXVlcnkgPSAmcmVxdWVzdC0+cmVxdWVzdF9tc2cubXNnLnF1ZXJ5X3JlcTsKKwlxdWVyeS0+b2lkID0gb2lkOworCXF1ZXJ5LT5pbmZvX2J1Zl9vZmZzZXQgPSBzaXplb2Yoc3RydWN0IHJuZGlzX3F1ZXJ5X3JlcXVlc3QpOworCXF1ZXJ5LT5pbmZvX2J1ZmxlbiA9IDA7CisJcXVlcnktPmRldl92Y19oYW5kbGUgPSAwOwogCi0JcmV0ID0gUm5kaXNGaWx0ZXJTZW5kUmVxdWVzdChEZXZpY2UsIHJlcXVlc3QpOworCXJldCA9IHJuZGlzX2ZpbHRlcl9zZW5kX3JlcXVlc3QoZGV2LCByZXF1ZXN0KTsKIAlpZiAocmV0ICE9IDApCiAJCWdvdG8gQ2xlYW51cDsKIAotCW9zZF9XYWl0RXZlbnRXYWl0KHJlcXVlc3QtPldhaXRFdmVudCk7CisJb3NkX3dhaXRldmVudF93YWl0KHJlcXVlc3QtPndhaXRldmVudCk7CiAKIAkvKiBDb3B5IHRoZSByZXNwb25zZSBiYWNrICovCi0JcXVlcnlDb21wbGV0ZSA9ICZyZXF1ZXN0LT5SZXNwb25zZU1lc3NhZ2UuTWVzc2FnZS5RdWVyeUNvbXBsZXRlOworCXF1ZXJ5X2NvbXBsZXRlID0gJnJlcXVlc3QtPnJlc3BvbnNlX21zZy5tc2cucXVlcnlfY29tcGxldGU7CiAKLQlpZiAocXVlcnlDb21wbGV0ZS0+SW5mb3JtYXRpb25CdWZmZXJMZW5ndGggPiBpbnJlc3VsdFNpemUpIHsKKwlpZiAocXVlcnlfY29tcGxldGUtPmluZm9fYnVmbGVuID4gaW5yZXN1bHRfc2l6ZSkgewogCQlyZXQgPSAtMTsKIAkJZ290byBDbGVhbnVwOwogCX0KIAotCW1lbWNweShSZXN1bHQsCi0JICAgICAgICh2b2lkICopKCh1bnNpZ25lZCBsb25nKXF1ZXJ5Q29tcGxldGUgKwotCQkJIHF1ZXJ5Q29tcGxldGUtPkluZm9ybWF0aW9uQnVmZmVyT2Zmc2V0KSwKLQkgICAgICAgcXVlcnlDb21wbGV0ZS0+SW5mb3JtYXRpb25CdWZmZXJMZW5ndGgpOworCW1lbWNweShyZXN1bHQsCisJICAgICAgICh2b2lkICopKCh1bnNpZ25lZCBsb25nKXF1ZXJ5X2NvbXBsZXRlICsKKwkJCSBxdWVyeV9jb21wbGV0ZS0+aW5mb19idWZfb2Zmc2V0KSwKKwkgICAgICAgcXVlcnlfY29tcGxldGUtPmluZm9fYnVmbGVuKTsKIAotCSpSZXN1bHRTaXplID0gcXVlcnlDb21wbGV0ZS0+SW5mb3JtYXRpb25CdWZmZXJMZW5ndGg7CisJKnJlc3VsdF9zaXplID0gcXVlcnlfY29tcGxldGUtPmluZm9fYnVmbGVuOwogCiBDbGVhbnVwOgogCWlmIChyZXF1ZXN0KQotCQlQdXRSbmRpc1JlcXVlc3QoRGV2aWNlLCByZXF1ZXN0KTsKKwkJcHV0X3JuZGlzX3JlcXVlc3QoZGV2LCByZXF1ZXN0KTsKIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgUm5kaXNGaWx0ZXJRdWVyeURldmljZU1hYyhzdHJ1Y3Qgcm5kaXNfZGV2aWNlICpEZXZpY2UpCitzdGF0aWMgaW50IHJuZGlzX2ZpbHRlcl9xdWVyeV9kZXZpY2VfbWFjKHN0cnVjdCBybmRpc19kZXZpY2UgKmRldikKIHsKIAl1MzIgc2l6ZSA9IEVUSF9BTEVOOwogCi0JcmV0dXJuIFJuZGlzRmlsdGVyUXVlcnlEZXZpY2UoRGV2aWNlLAorCXJldHVybiBybmRpc19maWx0ZXJfcXVlcnlfZGV2aWNlKGRldiwKIAkJCQkgICAgICBSTkRJU19PSURfODAyXzNfUEVSTUFORU5UX0FERFJFU1MsCi0JCQkJICAgICAgRGV2aWNlLT5Id01hY0FkZHIsICZzaXplKTsKKwkJCQkgICAgICBkZXYtPmh3X21hY19hZHIsICZzaXplKTsKIH0KIAotc3RhdGljIGludCBSbmRpc0ZpbHRlclF1ZXJ5RGV2aWNlTGlua1N0YXR1cyhzdHJ1Y3Qgcm5kaXNfZGV2aWNlICpEZXZpY2UpCitzdGF0aWMgaW50IHJuZGlzX2ZpbHRlcl9xdWVyeV9kZXZpY2VfbGlua19zdGF0dXMoc3RydWN0IHJuZGlzX2RldmljZSAqZGV2KQogewogCXUzMiBzaXplID0gc2l6ZW9mKHUzMik7CiAKLQlyZXR1cm4gUm5kaXNGaWx0ZXJRdWVyeURldmljZShEZXZpY2UsCisJcmV0dXJuIHJuZGlzX2ZpbHRlcl9xdWVyeV9kZXZpY2UoZGV2LAogCQkJCSAgICAgIFJORElTX09JRF9HRU5fTUVESUFfQ09OTkVDVF9TVEFUVVMsCi0JCQkJICAgICAgJkRldmljZS0+TGlua1N0YXR1cywgJnNpemUpOworCQkJCSAgICAgICZkZXYtPmxpbmtfc3RhdCwgJnNpemUpOwogfQogCi1zdGF0aWMgaW50IFJuZGlzRmlsdGVyU2V0UGFja2V0RmlsdGVyKHN0cnVjdCBybmRpc19kZXZpY2UgKkRldmljZSwKLQkJCQkgICAgICB1MzIgTmV3RmlsdGVyKQorc3RhdGljIGludCBybmRpc19maWx0ZXJfc2V0X3BhY2tldF9maWx0ZXIoc3RydWN0IHJuZGlzX2RldmljZSAqZGV2LAorCQkJCSAgICAgIHUzMiBuZXdfZmlsdGVyKQogewogCXN0cnVjdCBybmRpc19yZXF1ZXN0ICpyZXF1ZXN0OwogCXN0cnVjdCBybmRpc19zZXRfcmVxdWVzdCAqc2V0OwotCXN0cnVjdCBybmRpc19zZXRfY29tcGxldGUgKnNldENvbXBsZXRlOworCXN0cnVjdCBybmRpc19zZXRfY29tcGxldGUgKnNldF9jb21wbGV0ZTsKIAl1MzIgc3RhdHVzOwogCWludCByZXQ7CiAKIAkvKiBBU1NFUlQoUk5ESVNfTUVTU0FHRV9TSVpFKHN0cnVjdCBybmRpc19zZXRfcmVxdWVzdCkgKyBzaXplb2YodTMyKSA8PSAqLwogCS8qIAlzaXplb2Yoc3RydWN0IHJuZGlzX21lc3NhZ2UpKTsgKi8KIAotCXJlcXVlc3QgPSBHZXRSbmRpc1JlcXVlc3QoRGV2aWNlLCBSRU1PVEVfTkRJU19TRVRfTVNHLAorCXJlcXVlc3QgPSBnZXRfcm5kaXNfcmVxdWVzdChkZXYsIFJFTU9URV9ORElTX1NFVF9NU0csCiAJCQlSTkRJU19NRVNTQUdFX1NJWkUoc3RydWN0IHJuZGlzX3NldF9yZXF1ZXN0KSArCiAJCQlzaXplb2YodTMyKSk7CiAJaWYgKCFyZXF1ZXN0KSB7CkBAIC01NjAsMTkgKzU3MCwxOSBAQAogCX0KIAogCS8qIFNldHVwIHRoZSBybmRpcyBzZXQgKi8KLQlzZXQgPSAmcmVxdWVzdC0+UmVxdWVzdE1lc3NhZ2UuTWVzc2FnZS5TZXRSZXF1ZXN0OwotCXNldC0+T2lkID0gUk5ESVNfT0lEX0dFTl9DVVJSRU5UX1BBQ0tFVF9GSUxURVI7Ci0Jc2V0LT5JbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aCA9IHNpemVvZih1MzIpOwotCXNldC0+SW5mb3JtYXRpb25CdWZmZXJPZmZzZXQgPSBzaXplb2Yoc3RydWN0IHJuZGlzX3NldF9yZXF1ZXN0KTsKKwlzZXQgPSAmcmVxdWVzdC0+cmVxdWVzdF9tc2cubXNnLnNldF9yZXE7CisJc2V0LT5vaWQgPSBSTkRJU19PSURfR0VOX0NVUlJFTlRfUEFDS0VUX0ZJTFRFUjsKKwlzZXQtPmluZm9fYnVmbGVuID0gc2l6ZW9mKHUzMik7CisJc2V0LT5pbmZvX2J1Zl9vZmZzZXQgPSBzaXplb2Yoc3RydWN0IHJuZGlzX3NldF9yZXF1ZXN0KTsKIAogCW1lbWNweSgodm9pZCAqKSh1bnNpZ25lZCBsb25nKXNldCArIHNpemVvZihzdHJ1Y3Qgcm5kaXNfc2V0X3JlcXVlc3QpLAotCSAgICAgICAmTmV3RmlsdGVyLCBzaXplb2YodTMyKSk7CisJICAgICAgICZuZXdfZmlsdGVyLCBzaXplb2YodTMyKSk7CiAKLQlyZXQgPSBSbmRpc0ZpbHRlclNlbmRSZXF1ZXN0KERldmljZSwgcmVxdWVzdCk7CisJcmV0ID0gcm5kaXNfZmlsdGVyX3NlbmRfcmVxdWVzdChkZXYsIHJlcXVlc3QpOwogCWlmIChyZXQgIT0gMCkKIAkJZ290byBDbGVhbnVwOwogCi0JcmV0ID0gb3NkX1dhaXRFdmVudFdhaXRFeChyZXF1ZXN0LT5XYWl0RXZlbnQsIDIwMDAvKjJzZWMqLyk7CisJcmV0ID0gb3NkX3dhaXRldmVudF93YWl0ZXgocmVxdWVzdC0+d2FpdGV2ZW50LCAyMDAwLyoyc2VjKi8pOwogCWlmICghcmV0KSB7CiAJCXJldCA9IC0xOwogCQlEUFJJTlRfRVJSKE5FVFZTQywgInRpbWVvdXQgYmVmb3JlIHdlIGdvdCBhIHNldCByZXNwb25zZS4uLiIpOwpAQCAtNTg0LDI3ICs1OTQsMjcgQEAKIAl9IGVsc2UgewogCQlpZiAocmV0ID4gMCkKIAkJCXJldCA9IDA7Ci0JCXNldENvbXBsZXRlID0gJnJlcXVlc3QtPlJlc3BvbnNlTWVzc2FnZS5NZXNzYWdlLlNldENvbXBsZXRlOwotCQlzdGF0dXMgPSBzZXRDb21wbGV0ZS0+U3RhdHVzOworCQlzZXRfY29tcGxldGUgPSAmcmVxdWVzdC0+cmVzcG9uc2VfbXNnLm1zZy5zZXRfY29tcGxldGU7CisJCXN0YXR1cyA9IHNldF9jb21wbGV0ZS0+c3RhdHVzOwogCX0KIAogQ2xlYW51cDoKIAlpZiAocmVxdWVzdCkKLQkJUHV0Um5kaXNSZXF1ZXN0KERldmljZSwgcmVxdWVzdCk7CisJCXB1dF9ybmRpc19yZXF1ZXN0KGRldiwgcmVxdWVzdCk7CiBFeGl0OgogCXJldHVybiByZXQ7CiB9CiAKLWludCBSbmRpc0ZpbHRlckluaXQoc3RydWN0IG5ldHZzY19kcml2ZXIgKkRyaXZlcikKK2ludCBybmRpc19maWx0ZXJfaW5pdChzdHJ1Y3QgbmV0dnNjX2RyaXZlciAqZHJ2KQogewogCURQUklOVF9EQkcoTkVUVlNDLCAic2l6ZW9mKHN0cnVjdCBybmRpc19maWx0ZXJfcGFja2V0KSA9PSAlemQiLAogCQkgICBzaXplb2Yoc3RydWN0IHJuZGlzX2ZpbHRlcl9wYWNrZXQpKTsKIAotCURyaXZlci0+UmVxdWVzdEV4dFNpemUgPSBzaXplb2Yoc3RydWN0IHJuZGlzX2ZpbHRlcl9wYWNrZXQpOworCWRydi0+cmVxX2V4dF9zaXplID0gc2l6ZW9mKHN0cnVjdCBybmRpc19maWx0ZXJfcGFja2V0KTsKIAogCS8qIERyaXZlci0+Q29udGV4dCA9IHJuZGlzRHJpdmVyOyAqLwogCi0JbWVtc2V0KCZnUm5kaXNGaWx0ZXIsIDAsIHNpemVvZihzdHJ1Y3Qgcm5kaXNfZmlsdGVyX2RyaXZlcl9vYmplY3QpKTsKKwltZW1zZXQoJnJuZGlzX2ZpbHRlciwgMCwgc2l6ZW9mKHN0cnVjdCBybmRpc19maWx0ZXJfZHJpdmVyX29iamVjdCkpOwogCiAJLypybmRpc0RyaXZlci0+RHJpdmVyID0gRHJpdmVyOwogCkBAIC02MTIsMzggKzYyMiwzOCBAQAogCXJuZGlzRHJpdmVyLT5PbkxpbmtTdGF0dXNDaGFuZ2VkID0gRHJpdmVyLT5PbkxpbmtTdGF0dXNDaGFuZ2VkOyovCiAKIAkvKiBTYXZlIHRoZSBvcmlnaW5hbCBkaXNwYXRjaCBoYW5kbGVycyBiZWZvcmUgd2Ugb3ZlcnJpZGUgaXQgKi8KLQlnUm5kaXNGaWx0ZXIuSW5uZXJEcml2ZXIuQmFzZS5PbkRldmljZUFkZCA9IERyaXZlci0+QmFzZS5PbkRldmljZUFkZDsKLQlnUm5kaXNGaWx0ZXIuSW5uZXJEcml2ZXIuQmFzZS5PbkRldmljZVJlbW92ZSA9Ci0JCQkJCURyaXZlci0+QmFzZS5PbkRldmljZVJlbW92ZTsKLQlnUm5kaXNGaWx0ZXIuSW5uZXJEcml2ZXIuQmFzZS5PbkNsZWFudXAgPSBEcml2ZXItPkJhc2UuT25DbGVhbnVwOworCXJuZGlzX2ZpbHRlci5pbm5lcl9kcnYuYmFzZS5PbkRldmljZUFkZCA9IGRydi0+YmFzZS5PbkRldmljZUFkZDsKKwlybmRpc19maWx0ZXIuaW5uZXJfZHJ2LmJhc2UuT25EZXZpY2VSZW1vdmUgPQorCQkJCQlkcnYtPmJhc2UuT25EZXZpY2VSZW1vdmU7CisJcm5kaXNfZmlsdGVyLmlubmVyX2Rydi5iYXNlLk9uQ2xlYW51cCA9IGRydi0+YmFzZS5PbkNsZWFudXA7CiAKIAkvKiBBU1NFUlQoRHJpdmVyLT5PblNlbmQpOyAqLwogCS8qIEFTU0VSVChEcml2ZXItPk9uUmVjZWl2ZUNhbGxiYWNrKTsgKi8KLQlnUm5kaXNGaWx0ZXIuSW5uZXJEcml2ZXIuT25TZW5kID0gRHJpdmVyLT5PblNlbmQ7Ci0JZ1JuZGlzRmlsdGVyLklubmVyRHJpdmVyLk9uUmVjZWl2ZUNhbGxiYWNrID0gRHJpdmVyLT5PblJlY2VpdmVDYWxsYmFjazsKLQlnUm5kaXNGaWx0ZXIuSW5uZXJEcml2ZXIuT25MaW5rU3RhdHVzQ2hhbmdlZCA9Ci0JCQkJCURyaXZlci0+T25MaW5rU3RhdHVzQ2hhbmdlZDsKKwlybmRpc19maWx0ZXIuaW5uZXJfZHJ2LnNlbmQgPSBkcnYtPnNlbmQ7CisJcm5kaXNfZmlsdGVyLmlubmVyX2Rydi5yZWN2X2NiID0gZHJ2LT5yZWN2X2NiOworCXJuZGlzX2ZpbHRlci5pbm5lcl9kcnYubGlua19zdGF0dXNfY2hhbmdlID0KKwkJCQkJZHJ2LT5saW5rX3N0YXR1c19jaGFuZ2U7CiAKIAkvKiBPdmVycmlkZSAqLwotCURyaXZlci0+QmFzZS5PbkRldmljZUFkZCA9IFJuZGlzRmlsdGVyT25EZXZpY2VBZGQ7Ci0JRHJpdmVyLT5CYXNlLk9uRGV2aWNlUmVtb3ZlID0gUm5kaXNGaWx0ZXJPbkRldmljZVJlbW92ZTsKLQlEcml2ZXItPkJhc2UuT25DbGVhbnVwID0gUm5kaXNGaWx0ZXJPbkNsZWFudXA7Ci0JRHJpdmVyLT5PblNlbmQgPSBSbmRpc0ZpbHRlck9uU2VuZDsKKwlkcnYtPmJhc2UuT25EZXZpY2VBZGQgPSBybmRpc19maWx0ZV9kZXZpY2VfYWRkOworCWRydi0+YmFzZS5PbkRldmljZVJlbW92ZSA9IHJuZGlzX2ZpbHRlcl9kZXZpY2VfcmVtb3ZlOworCWRydi0+YmFzZS5PbkNsZWFudXAgPSBybmRpc19maWx0ZXJfY2xlYW51cDsKKwlkcnYtPnNlbmQgPSBybmRpc19maWx0ZXJfc2VuZDsKIAkvKiBEcml2ZXItPlF1ZXJ5TGlua1N0YXR1cyA9IFJuZGlzRmlsdGVyUXVlcnlEZXZpY2VMaW5rU3RhdHVzOyAqLwotCURyaXZlci0+T25SZWNlaXZlQ2FsbGJhY2sgPSBSbmRpc0ZpbHRlck9uUmVjZWl2ZTsKKwlkcnYtPnJlY3ZfY2IgPSBybmRpc19maWx0ZXJfcmVjZWl2ZTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IFJuZGlzRmlsdGVySW5pdERldmljZShzdHJ1Y3Qgcm5kaXNfZGV2aWNlICpEZXZpY2UpCitzdGF0aWMgaW50IHJuZGlzX2ZpbHRlcl9pbml0X2RldmljZShzdHJ1Y3Qgcm5kaXNfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHJuZGlzX3JlcXVlc3QgKnJlcXVlc3Q7CiAJc3RydWN0IHJuZGlzX2luaXRpYWxpemVfcmVxdWVzdCAqaW5pdDsKLQlzdHJ1Y3Qgcm5kaXNfaW5pdGlhbGl6ZV9jb21wbGV0ZSAqaW5pdENvbXBsZXRlOworCXN0cnVjdCBybmRpc19pbml0aWFsaXplX2NvbXBsZXRlICppbml0X2NvbXBsZXRlOwogCXUzMiBzdGF0dXM7CiAJaW50IHJldDsKIAotCXJlcXVlc3QgPSBHZXRSbmRpc1JlcXVlc3QoRGV2aWNlLCBSRU1PVEVfTkRJU19JTklUSUFMSVpFX01TRywKKwlyZXF1ZXN0ID0gZ2V0X3JuZGlzX3JlcXVlc3QoZGV2LCBSRU1PVEVfTkRJU19JTklUSUFMSVpFX01TRywKIAkJCVJORElTX01FU1NBR0VfU0laRShzdHJ1Y3Qgcm5kaXNfaW5pdGlhbGl6ZV9yZXF1ZXN0KSk7CiAJaWYgKCFyZXF1ZXN0KSB7CiAJCXJldCA9IC0xOwpAQCAtNjUxLDEwNSArNjYxLDEwNSBAQAogCX0KIAogCS8qIFNldHVwIHRoZSBybmRpcyBzZXQgKi8KLQlpbml0ID0gJnJlcXVlc3QtPlJlcXVlc3RNZXNzYWdlLk1lc3NhZ2UuSW5pdGlhbGl6ZVJlcXVlc3Q7Ci0JaW5pdC0+TWFqb3JWZXJzaW9uID0gUk5ESVNfTUFKT1JfVkVSU0lPTjsKLQlpbml0LT5NaW5vclZlcnNpb24gPSBSTkRJU19NSU5PUl9WRVJTSU9OOworCWluaXQgPSAmcmVxdWVzdC0+cmVxdWVzdF9tc2cubXNnLmluaXRfcmVxOworCWluaXQtPm1ham9yX3ZlciA9IFJORElTX01BSk9SX1ZFUlNJT047CisJaW5pdC0+bWlub3JfdmVyID0gUk5ESVNfTUlOT1JfVkVSU0lPTjsKIAkvKiBGSVhNRTogVXNlIDE1MzYgLSByb3VuZGVkIGV0aGVybmV0IGZyYW1lIHNpemUgKi8KLQlpbml0LT5NYXhUcmFuc2ZlclNpemUgPSAyMDQ4OworCWluaXQtPm1heF94ZmVyX3NpemUgPSAyMDQ4OwogCi0JRGV2aWNlLT5TdGF0ZSA9IFJORElTX0RFVl9JTklUSUFMSVpJTkc7CisJZGV2LT5zdGF0ZSA9IFJORElTX0RFVl9JTklUSUFMSVpJTkc7CiAKLQlyZXQgPSBSbmRpc0ZpbHRlclNlbmRSZXF1ZXN0KERldmljZSwgcmVxdWVzdCk7CisJcmV0ID0gcm5kaXNfZmlsdGVyX3NlbmRfcmVxdWVzdChkZXYsIHJlcXVlc3QpOwogCWlmIChyZXQgIT0gMCkgewotCQlEZXZpY2UtPlN0YXRlID0gUk5ESVNfREVWX1VOSU5JVElBTElaRUQ7CisJCWRldi0+c3RhdGUgPSBSTkRJU19ERVZfVU5JTklUSUFMSVpFRDsKIAkJZ290byBDbGVhbnVwOwogCX0KIAotCW9zZF9XYWl0RXZlbnRXYWl0KHJlcXVlc3QtPldhaXRFdmVudCk7CisJb3NkX3dhaXRldmVudF93YWl0KHJlcXVlc3QtPndhaXRldmVudCk7CiAKLQlpbml0Q29tcGxldGUgPSAmcmVxdWVzdC0+UmVzcG9uc2VNZXNzYWdlLk1lc3NhZ2UuSW5pdGlhbGl6ZUNvbXBsZXRlOwotCXN0YXR1cyA9IGluaXRDb21wbGV0ZS0+U3RhdHVzOworCWluaXRfY29tcGxldGUgPSAmcmVxdWVzdC0+cmVzcG9uc2VfbXNnLm1zZy5pbml0X2NvbXBsZXRlOworCXN0YXR1cyA9IGluaXRfY29tcGxldGUtPnN0YXR1czsKIAlpZiAoc3RhdHVzID09IFJORElTX1NUQVRVU19TVUNDRVNTKSB7Ci0JCURldmljZS0+U3RhdGUgPSBSTkRJU19ERVZfSU5JVElBTElaRUQ7CisJCWRldi0+c3RhdGUgPSBSTkRJU19ERVZfSU5JVElBTElaRUQ7CiAJCXJldCA9IDA7CiAJfSBlbHNlIHsKLQkJRGV2aWNlLT5TdGF0ZSA9IFJORElTX0RFVl9VTklOSVRJQUxJWkVEOworCQlkZXYtPnN0YXRlID0gUk5ESVNfREVWX1VOSU5JVElBTElaRUQ7CiAJCXJldCA9IC0xOwogCX0KIAogQ2xlYW51cDoKIAlpZiAocmVxdWVzdCkKLQkJUHV0Um5kaXNSZXF1ZXN0KERldmljZSwgcmVxdWVzdCk7CisJCXB1dF9ybmRpc19yZXF1ZXN0KGRldiwgcmVxdWVzdCk7CiAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBSbmRpc0ZpbHRlckhhbHREZXZpY2Uoc3RydWN0IHJuZGlzX2RldmljZSAqRGV2aWNlKQorc3RhdGljIHZvaWQgcm5kaXNfZmlsdGVyX2hhbHRfZGV2aWNlKHN0cnVjdCBybmRpc19kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3Qgcm5kaXNfcmVxdWVzdCAqcmVxdWVzdDsKIAlzdHJ1Y3Qgcm5kaXNfaGFsdF9yZXF1ZXN0ICpoYWx0OwogCiAJLyogQXR0ZW1wdCB0byBkbyBhIHJuZGlzIGRldmljZSBoYWx0ICovCi0JcmVxdWVzdCA9IEdldFJuZGlzUmVxdWVzdChEZXZpY2UsIFJFTU9URV9ORElTX0hBTFRfTVNHLAorCXJlcXVlc3QgPSBnZXRfcm5kaXNfcmVxdWVzdChkZXYsIFJFTU9URV9ORElTX0hBTFRfTVNHLAogCQkJCVJORElTX01FU1NBR0VfU0laRShzdHJ1Y3Qgcm5kaXNfaGFsdF9yZXF1ZXN0KSk7CiAJaWYgKCFyZXF1ZXN0KQogCQlnb3RvIENsZWFudXA7CiAKIAkvKiBTZXR1cCB0aGUgcm5kaXMgc2V0ICovCi0JaGFsdCA9ICZyZXF1ZXN0LT5SZXF1ZXN0TWVzc2FnZS5NZXNzYWdlLkhhbHRSZXF1ZXN0OwotCWhhbHQtPlJlcXVlc3RJZCA9IGF0b21pY19pbmNfcmV0dXJuKCZEZXZpY2UtPk5ld1JlcXVlc3RJZCk7CisJaGFsdCA9ICZyZXF1ZXN0LT5yZXF1ZXN0X21zZy5tc2cuaGFsdF9yZXE7CisJaGFsdC0+cmVxX2lkID0gYXRvbWljX2luY19yZXR1cm4oJmRldi0+bmV3X3JlcV9pZCk7CiAKIAkvKiBJZ25vcmUgcmV0dXJuIHNpbmNlIHRoaXMgbXNnIGlzIG9wdGlvbmFsLiAqLwotCVJuZGlzRmlsdGVyU2VuZFJlcXVlc3QoRGV2aWNlLCByZXF1ZXN0KTsKKwlybmRpc19maWx0ZXJfc2VuZF9yZXF1ZXN0KGRldiwgcmVxdWVzdCk7CiAKLQlEZXZpY2UtPlN0YXRlID0gUk5ESVNfREVWX1VOSU5JVElBTElaRUQ7CisJZGV2LT5zdGF0ZSA9IFJORElTX0RFVl9VTklOSVRJQUxJWkVEOwogCiBDbGVhbnVwOgogCWlmIChyZXF1ZXN0KQotCQlQdXRSbmRpc1JlcXVlc3QoRGV2aWNlLCByZXF1ZXN0KTsKKwkJcHV0X3JuZGlzX3JlcXVlc3QoZGV2LCByZXF1ZXN0KTsKIAlyZXR1cm47CiB9CiAKLXN0YXRpYyBpbnQgUm5kaXNGaWx0ZXJPcGVuRGV2aWNlKHN0cnVjdCBybmRpc19kZXZpY2UgKkRldmljZSkKK3N0YXRpYyBpbnQgcm5kaXNfZmlsdGVyX29wZW5fZGV2aWNlKHN0cnVjdCBybmRpc19kZXZpY2UgKmRldikKIHsKIAlpbnQgcmV0OwogCi0JaWYgKERldmljZS0+U3RhdGUgIT0gUk5ESVNfREVWX0lOSVRJQUxJWkVEKQorCWlmIChkZXYtPnN0YXRlICE9IFJORElTX0RFVl9JTklUSUFMSVpFRCkKIAkJcmV0dXJuIDA7CiAKLQlyZXQgPSBSbmRpc0ZpbHRlclNldFBhY2tldEZpbHRlcihEZXZpY2UsCisJcmV0ID0gcm5kaXNfZmlsdGVyX3NldF9wYWNrZXRfZmlsdGVyKGRldiwKIAkJCQkJIE5ESVNfUEFDS0VUX1RZUEVfQlJPQURDQVNUIHwKIAkJCQkJIE5ESVNfUEFDS0VUX1RZUEVfQUxMX01VTFRJQ0FTVCB8CiAJCQkJCSBORElTX1BBQ0tFVF9UWVBFX0RJUkVDVEVEKTsKIAlpZiAocmV0ID09IDApCi0JCURldmljZS0+U3RhdGUgPSBSTkRJU19ERVZfREFUQUlOSVRJQUxJWkVEOworCQlkZXYtPnN0YXRlID0gUk5ESVNfREVWX0RBVEFJTklUSUFMSVpFRDsKIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgUm5kaXNGaWx0ZXJDbG9zZURldmljZShzdHJ1Y3Qgcm5kaXNfZGV2aWNlICpEZXZpY2UpCitzdGF0aWMgaW50IHJuZGlzX2ZpbHRlcl9jbG9zZV9kZXZpY2Uoc3RydWN0IHJuZGlzX2RldmljZSAqZGV2KQogewogCWludCByZXQ7CiAKLQlpZiAoRGV2aWNlLT5TdGF0ZSAhPSBSTkRJU19ERVZfREFUQUlOSVRJQUxJWkVEKQorCWlmIChkZXYtPnN0YXRlICE9IFJORElTX0RFVl9EQVRBSU5JVElBTElaRUQpCiAJCXJldHVybiAwOwogCi0JcmV0ID0gUm5kaXNGaWx0ZXJTZXRQYWNrZXRGaWx0ZXIoRGV2aWNlLCAwKTsKKwlyZXQgPSBybmRpc19maWx0ZXJfc2V0X3BhY2tldF9maWx0ZXIoZGV2LCAwKTsKIAlpZiAocmV0ID09IDApCi0JCURldmljZS0+U3RhdGUgPSBSTkRJU19ERVZfSU5JVElBTElaRUQ7CisJCWRldi0+c3RhdGUgPSBSTkRJU19ERVZfSU5JVElBTElaRUQ7CiAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IFJuZGlzRmlsdGVyT25EZXZpY2VBZGQoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlLAotCQkJCSAgdm9pZCAqQWRkaXRpb25hbEluZm8pCitzdGF0aWMgaW50IHJuZGlzX2ZpbHRlX2RldmljZV9hZGQoc3RydWN0IGh2X2RldmljZSAqZGV2LAorCQkJCSAgdm9pZCAqYWRkaXRpb25hbF9pbmZvKQogewogCWludCByZXQ7CiAJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldERldmljZTsKIAlzdHJ1Y3Qgcm5kaXNfZGV2aWNlICpybmRpc0RldmljZTsKLQlzdHJ1Y3QgbmV0dnNjX2RldmljZV9pbmZvICpkZXZpY2VJbmZvID0gQWRkaXRpb25hbEluZm87CisJc3RydWN0IG5ldHZzY19kZXZpY2VfaW5mbyAqZGV2aWNlSW5mbyA9IGFkZGl0aW9uYWxfaW5mbzsKIAotCXJuZGlzRGV2aWNlID0gR2V0Um5kaXNEZXZpY2UoKTsKKwlybmRpc0RldmljZSA9IGdldF9ybmRpc19kZXZpY2UoKTsKIAlpZiAoIXJuZGlzRGV2aWNlKQogCQlyZXR1cm4gLTE7CiAKQEAgLTc2MCw3ICs3NzAsNyBAQAogCSAqIE5PVEUhIE9uY2UgdGhlIGNoYW5uZWwgaXMgY3JlYXRlZCwgd2UgbWF5IGdldCBhIHJlY2VpdmUgY2FsbGJhY2sKIAkgKiAoUm5kaXNGaWx0ZXJPblJlY2VpdmUoKSkgYmVmb3JlIHRoaXMgY2FsbCBpcyBjb21wbGV0ZWQKIAkgKi8KLQlyZXQgPSBnUm5kaXNGaWx0ZXIuSW5uZXJEcml2ZXIuQmFzZS5PbkRldmljZUFkZChEZXZpY2UsIEFkZGl0aW9uYWxJbmZvKTsKKwlyZXQgPSBybmRpc19maWx0ZXIuaW5uZXJfZHJ2LmJhc2UuT25EZXZpY2VBZGQoZGV2LCBhZGRpdGlvbmFsX2luZm8pOwogCWlmIChyZXQgIT0gMCkgewogCQlrZnJlZShybmRpc0RldmljZSk7CiAJCXJldHVybiByZXQ7CkBAIC03NjgsMTUgKzc3OCwxNSBAQAogCiAKIAkvKiBJbml0aWFsaXplIHRoZSBybmRpcyBkZXZpY2UgKi8KLQluZXREZXZpY2UgPSBEZXZpY2UtPkV4dGVuc2lvbjsKKwluZXREZXZpY2UgPSBkZXYtPkV4dGVuc2lvbjsKIAkvKiBBU1NFUlQobmV0RGV2aWNlKTsgKi8KIAkvKiBBU1NFUlQobmV0RGV2aWNlLT5EZXZpY2UpOyAqLwogCi0JbmV0RGV2aWNlLT5FeHRlbnNpb24gPSBybmRpc0RldmljZTsKLQlybmRpc0RldmljZS0+TmV0RGV2aWNlID0gbmV0RGV2aWNlOworCW5ldERldmljZS0+ZXh0ZW5zaW9uID0gcm5kaXNEZXZpY2U7CisJcm5kaXNEZXZpY2UtPm5ldF9kZXYgPSBuZXREZXZpY2U7CiAKIAkvKiBTZW5kIHRoZSBybmRpcyBpbml0aWFsaXphdGlvbiBtZXNzYWdlICovCi0JcmV0ID0gUm5kaXNGaWx0ZXJJbml0RGV2aWNlKHJuZGlzRGV2aWNlKTsKKwlyZXQgPSBybmRpc19maWx0ZXJfaW5pdF9kZXZpY2Uocm5kaXNEZXZpY2UpOwogCWlmIChyZXQgIT0gMCkgewogCQkvKgogCQkgKiBUT0RPOiBJZiBybmRpcyBpbml0IGZhaWxlZCwgd2Ugd2lsbCBuZWVkIHRvIHNodXQgZG93biB0aGUKQEAgLTc4NSw3ICs3OTUsNyBAQAogCX0KIAogCS8qIEdldCB0aGUgbWFjIGFkZHJlc3MgKi8KLQlyZXQgPSBSbmRpc0ZpbHRlclF1ZXJ5RGV2aWNlTWFjKHJuZGlzRGV2aWNlKTsKKwlyZXQgPSBybmRpc19maWx0ZXJfcXVlcnlfZGV2aWNlX21hYyhybmRpc0RldmljZSk7CiAJaWYgKHJldCAhPSAwKSB7CiAJCS8qCiAJCSAqIFRPRE86IHNodXRkb3duIHJuZGlzIGRldmljZSBhbmQgdGhlIGNoYW5uZWwKQEAgLTc5Myw2MiArODAzLDYyIEBACiAJfQogCiAJRFBSSU5UX0lORk8oTkVUVlNDLCAiRGV2aWNlIDB4JXAgbWFjIGFkZHIgJXBNIiwKLQkJICAgIHJuZGlzRGV2aWNlLCBybmRpc0RldmljZS0+SHdNYWNBZGRyKTsKKwkJICAgIHJuZGlzRGV2aWNlLCBybmRpc0RldmljZS0+aHdfbWFjX2Fkcik7CiAKLQltZW1jcHkoZGV2aWNlSW5mby0+TWFjQWRkciwgcm5kaXNEZXZpY2UtPkh3TWFjQWRkciwgRVRIX0FMRU4pOworCW1lbWNweShkZXZpY2VJbmZvLT5tYWNfYWRyLCBybmRpc0RldmljZS0+aHdfbWFjX2FkciwgRVRIX0FMRU4pOwogCi0JUm5kaXNGaWx0ZXJRdWVyeURldmljZUxpbmtTdGF0dXMocm5kaXNEZXZpY2UpOworCXJuZGlzX2ZpbHRlcl9xdWVyeV9kZXZpY2VfbGlua19zdGF0dXMocm5kaXNEZXZpY2UpOwogCi0JZGV2aWNlSW5mby0+TGlua1N0YXRlID0gcm5kaXNEZXZpY2UtPkxpbmtTdGF0dXM7CisJZGV2aWNlSW5mby0+bGlua19zdGF0ZSA9IHJuZGlzRGV2aWNlLT5saW5rX3N0YXQ7CiAJRFBSSU5UX0lORk8oTkVUVlNDLCAiRGV2aWNlIDB4JXAgbGluayBzdGF0ZSAlcyIsIHJuZGlzRGV2aWNlLAotCQkgICAgKChkZXZpY2VJbmZvLT5MaW5rU3RhdGUpID8gKCJkb3duIikgOiAoInVwIikpKTsKKwkJICAgICgoZGV2aWNlSW5mby0+bGlua19zdGF0ZSkgPyAoImRvd24iKSA6ICgidXAiKSkpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBSbmRpc0ZpbHRlck9uRGV2aWNlUmVtb3ZlKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSkKK3N0YXRpYyBpbnQgcm5kaXNfZmlsdGVyX2RldmljZV9yZW1vdmUoc3RydWN0IGh2X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXREZXZpY2UgPSBEZXZpY2UtPkV4dGVuc2lvbjsKLQlzdHJ1Y3Qgcm5kaXNfZGV2aWNlICpybmRpc0RldmljZSA9IG5ldERldmljZS0+RXh0ZW5zaW9uOworCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXRfZGV2ID0gZGV2LT5FeHRlbnNpb247CisJc3RydWN0IHJuZGlzX2RldmljZSAqcm5kaXNfZGV2ID0gbmV0X2Rldi0+ZXh0ZW5zaW9uOwogCiAJLyogSGFsdCBhbmQgcmVsZWFzZSB0aGUgcm5kaXMgZGV2aWNlICovCi0JUm5kaXNGaWx0ZXJIYWx0RGV2aWNlKHJuZGlzRGV2aWNlKTsKKwlybmRpc19maWx0ZXJfaGFsdF9kZXZpY2Uocm5kaXNfZGV2KTsKIAotCWtmcmVlKHJuZGlzRGV2aWNlKTsKLQluZXREZXZpY2UtPkV4dGVuc2lvbiA9IE5VTEw7CisJa2ZyZWUocm5kaXNfZGV2KTsKKwluZXRfZGV2LT5leHRlbnNpb24gPSBOVUxMOwogCiAJLyogUGFzcyBjb250cm9sIHRvIGlubmVyIGRyaXZlciB0byByZW1vdmUgdGhlIGRldmljZSAqLwotCWdSbmRpc0ZpbHRlci5Jbm5lckRyaXZlci5CYXNlLk9uRGV2aWNlUmVtb3ZlKERldmljZSk7CisJcm5kaXNfZmlsdGVyLmlubmVyX2Rydi5iYXNlLk9uRGV2aWNlUmVtb3ZlKGRldik7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgUm5kaXNGaWx0ZXJPbkNsZWFudXAoc3RydWN0IGh2X2RyaXZlciAqRHJpdmVyKQorc3RhdGljIHZvaWQgcm5kaXNfZmlsdGVyX2NsZWFudXAoc3RydWN0IGh2X2RyaXZlciAqZHJ2KQogewogfQogCi1pbnQgUm5kaXNGaWx0ZXJPbk9wZW4oc3RydWN0IGh2X2RldmljZSAqRGV2aWNlKQoraW50IHJuZGlzX2ZpbHRlcl9vcGVuKHN0cnVjdCBodl9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0RGV2aWNlID0gRGV2aWNlLT5FeHRlbnNpb247CisJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldERldmljZSA9IGRldi0+RXh0ZW5zaW9uOwogCiAJaWYgKCFuZXREZXZpY2UpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0dXJuIFJuZGlzRmlsdGVyT3BlbkRldmljZShuZXREZXZpY2UtPkV4dGVuc2lvbik7CisJcmV0dXJuIHJuZGlzX2ZpbHRlcl9vcGVuX2RldmljZShuZXREZXZpY2UtPmV4dGVuc2lvbik7CiB9CiAKLWludCBSbmRpc0ZpbHRlck9uQ2xvc2Uoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlKQoraW50IHJuZGlzX2ZpbHRlcl9jbG9zZShzdHJ1Y3QgaHZfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldERldmljZSA9IERldmljZS0+RXh0ZW5zaW9uOworCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXREZXZpY2UgPSBkZXYtPkV4dGVuc2lvbjsKIAogCWlmICghbmV0RGV2aWNlKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJldHVybiBSbmRpc0ZpbHRlckNsb3NlRGV2aWNlKG5ldERldmljZS0+RXh0ZW5zaW9uKTsKKwlyZXR1cm4gcm5kaXNfZmlsdGVyX2Nsb3NlX2RldmljZShuZXREZXZpY2UtPmV4dGVuc2lvbik7CiB9CiAKLXN0YXRpYyBpbnQgUm5kaXNGaWx0ZXJPblNlbmQoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlLAotCQkJICAgICBzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqUGFja2V0KQorc3RhdGljIGludCBybmRpc19maWx0ZXJfc2VuZChzdHJ1Y3QgaHZfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpwa3QpCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3Qgcm5kaXNfZmlsdGVyX3BhY2tldCAqZmlsdGVyUGFja2V0OwpAQCAtODU3LDYyICs4NjcsNjIgQEAKIAl1MzIgcm5kaXNNZXNzYWdlU2l6ZTsKIAogCS8qIEFkZCB0aGUgcm5kaXMgaGVhZGVyICovCi0JZmlsdGVyUGFja2V0ID0gKHN0cnVjdCBybmRpc19maWx0ZXJfcGFja2V0ICopUGFja2V0LT5FeHRlbnNpb247CisJZmlsdGVyUGFja2V0ID0gKHN0cnVjdCBybmRpc19maWx0ZXJfcGFja2V0ICopcGt0LT5leHRlbnNpb247CiAJLyogQVNTRVJUKGZpbHRlclBhY2tldCk7ICovCiAKIAltZW1zZXQoZmlsdGVyUGFja2V0LCAwLCBzaXplb2Yoc3RydWN0IHJuZGlzX2ZpbHRlcl9wYWNrZXQpKTsKIAotCXJuZGlzTWVzc2FnZSA9ICZmaWx0ZXJQYWNrZXQtPk1lc3NhZ2U7CisJcm5kaXNNZXNzYWdlID0gJmZpbHRlclBhY2tldC0+bXNnOwogCXJuZGlzTWVzc2FnZVNpemUgPSBSTkRJU19NRVNTQUdFX1NJWkUoc3RydWN0IHJuZGlzX3BhY2tldCk7CiAKLQlybmRpc01lc3NhZ2UtPk5kaXNNZXNzYWdlVHlwZSA9IFJFTU9URV9ORElTX1BBQ0tFVF9NU0c7Ci0Jcm5kaXNNZXNzYWdlLT5NZXNzYWdlTGVuZ3RoID0gUGFja2V0LT5Ub3RhbERhdGFCdWZmZXJMZW5ndGggKworCXJuZGlzTWVzc2FnZS0+bmRpc19tc2dfdHlwZSA9IFJFTU9URV9ORElTX1BBQ0tFVF9NU0c7CisJcm5kaXNNZXNzYWdlLT5tc2dfbGVuID0gcGt0LT50b3RhbF9kYXRhX2J1ZmxlbiArCiAJCQkJICAgICAgcm5kaXNNZXNzYWdlU2l6ZTsKIAotCXJuZGlzUGFja2V0ID0gJnJuZGlzTWVzc2FnZS0+TWVzc2FnZS5QYWNrZXQ7Ci0Jcm5kaXNQYWNrZXQtPkRhdGFPZmZzZXQgPSBzaXplb2Yoc3RydWN0IHJuZGlzX3BhY2tldCk7Ci0Jcm5kaXNQYWNrZXQtPkRhdGFMZW5ndGggPSBQYWNrZXQtPlRvdGFsRGF0YUJ1ZmZlckxlbmd0aDsKKwlybmRpc1BhY2tldCA9ICZybmRpc01lc3NhZ2UtPm1zZy5wa3Q7CisJcm5kaXNQYWNrZXQtPmRhdGFfb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBybmRpc19wYWNrZXQpOworCXJuZGlzUGFja2V0LT5kYXRhX2xlbiA9IHBrdC0+dG90YWxfZGF0YV9idWZsZW47CiAKLQlQYWNrZXQtPklzRGF0YVBhY2tldCA9IHRydWU7Ci0JUGFja2V0LT5QYWdlQnVmZmVyc1swXS5QZm4gPSB2aXJ0X3RvX3BoeXMocm5kaXNNZXNzYWdlKSA+PiBQQUdFX1NISUZUOwotCVBhY2tldC0+UGFnZUJ1ZmZlcnNbMF0uT2Zmc2V0ID0KKwlwa3QtPmlzX2RhdGFfcGt0ID0gdHJ1ZTsKKwlwa3QtPnBhZ2VfYnVmWzBdLlBmbiA9IHZpcnRfdG9fcGh5cyhybmRpc01lc3NhZ2UpID4+IFBBR0VfU0hJRlQ7CisJcGt0LT5wYWdlX2J1ZlswXS5PZmZzZXQgPQogCQkJKHVuc2lnbmVkIGxvbmcpcm5kaXNNZXNzYWdlICYgKFBBR0VfU0laRS0xKTsKLQlQYWNrZXQtPlBhZ2VCdWZmZXJzWzBdLkxlbmd0aCA9IHJuZGlzTWVzc2FnZVNpemU7CisJcGt0LT5wYWdlX2J1ZlswXS5MZW5ndGggPSBybmRpc01lc3NhZ2VTaXplOwogCiAJLyogU2F2ZSB0aGUgcGFja2V0IHNlbmQgY29tcGxldGlvbiBhbmQgY29udGV4dCAqLwotCWZpbHRlclBhY2tldC0+T25Db21wbGV0aW9uID0gUGFja2V0LT5Db21wbGV0aW9uLlNlbmQuT25TZW5kQ29tcGxldGlvbjsKLQlmaWx0ZXJQYWNrZXQtPkNvbXBsZXRpb25Db250ZXh0ID0KLQkJCQlQYWNrZXQtPkNvbXBsZXRpb24uU2VuZC5TZW5kQ29tcGxldGlvbkNvbnRleHQ7CisJZmlsdGVyUGFja2V0LT5jb21wbGV0aW9uID0gcGt0LT5jb21wbGV0aW9uLnNlbmQuc2VuZF9jb21wbGV0aW9uOworCWZpbHRlclBhY2tldC0+Y29tcGxldGlvbl9jdHggPQorCQkJCXBrdC0+Y29tcGxldGlvbi5zZW5kLnNlbmRfY29tcGxldGlvbl9jdHg7CiAKIAkvKiBVc2Ugb3VycyAqLwotCVBhY2tldC0+Q29tcGxldGlvbi5TZW5kLk9uU2VuZENvbXBsZXRpb24gPSBSbmRpc0ZpbHRlck9uU2VuZENvbXBsZXRpb247Ci0JUGFja2V0LT5Db21wbGV0aW9uLlNlbmQuU2VuZENvbXBsZXRpb25Db250ZXh0ID0gZmlsdGVyUGFja2V0OworCXBrdC0+Y29tcGxldGlvbi5zZW5kLnNlbmRfY29tcGxldGlvbiA9IHJuZGlzX2ZpbHRlcl9zZW5kX2NvbXBsZXRpb247CisJcGt0LT5jb21wbGV0aW9uLnNlbmQuc2VuZF9jb21wbGV0aW9uX2N0eCA9IGZpbHRlclBhY2tldDsKIAotCXJldCA9IGdSbmRpc0ZpbHRlci5Jbm5lckRyaXZlci5PblNlbmQoRGV2aWNlLCBQYWNrZXQpOworCXJldCA9IHJuZGlzX2ZpbHRlci5pbm5lcl9kcnYuc2VuZChkZXYsIHBrdCk7CiAJaWYgKHJldCAhPSAwKSB7CiAJCS8qCiAJCSAqIFJlc2V0IHRoZSBjb21wbGV0aW9uIHRvIG9yaWdpbmFscyB0byBhbGxvdyByZXRyaWVzIGZyb20KIAkJICogYWJvdmUKIAkJICovCi0JCVBhY2tldC0+Q29tcGxldGlvbi5TZW5kLk9uU2VuZENvbXBsZXRpb24gPQotCQkJCWZpbHRlclBhY2tldC0+T25Db21wbGV0aW9uOwotCQlQYWNrZXQtPkNvbXBsZXRpb24uU2VuZC5TZW5kQ29tcGxldGlvbkNvbnRleHQgPQotCQkJCWZpbHRlclBhY2tldC0+Q29tcGxldGlvbkNvbnRleHQ7CisJCXBrdC0+Y29tcGxldGlvbi5zZW5kLnNlbmRfY29tcGxldGlvbiA9CisJCQkJZmlsdGVyUGFja2V0LT5jb21wbGV0aW9uOworCQlwa3QtPmNvbXBsZXRpb24uc2VuZC5zZW5kX2NvbXBsZXRpb25fY3R4ID0KKwkJCQlmaWx0ZXJQYWNrZXQtPmNvbXBsZXRpb25fY3R4OwogCX0KIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIFJuZGlzRmlsdGVyT25TZW5kQ29tcGxldGlvbih2b2lkICpDb250ZXh0KQorc3RhdGljIHZvaWQgcm5kaXNfZmlsdGVyX3NlbmRfY29tcGxldGlvbih2b2lkICpjdHgpCiB7Ci0Jc3RydWN0IHJuZGlzX2ZpbHRlcl9wYWNrZXQgKmZpbHRlclBhY2tldCA9IENvbnRleHQ7CisJc3RydWN0IHJuZGlzX2ZpbHRlcl9wYWNrZXQgKmZpbHRlclBhY2tldCA9IGN0eDsKIAogCS8qIFBhc3MgaXQgYmFjayB0byB0aGUgb3JpZ2luYWwgaGFuZGxlciAqLwotCWZpbHRlclBhY2tldC0+T25Db21wbGV0aW9uKGZpbHRlclBhY2tldC0+Q29tcGxldGlvbkNvbnRleHQpOworCWZpbHRlclBhY2tldC0+Y29tcGxldGlvbihmaWx0ZXJQYWNrZXQtPmNvbXBsZXRpb25fY3R4KTsKIH0KIAogCi1zdGF0aWMgdm9pZCBSbmRpc0ZpbHRlck9uU2VuZFJlcXVlc3RDb21wbGV0aW9uKHZvaWQgKkNvbnRleHQpCitzdGF0aWMgdm9pZCBybmRpc19maWx0ZXJfc2VuZF9yZXF1ZXN0X2NvbXBsZXRpb24odm9pZCAqY3R4KQogewogCS8qIE5vb3AgKi8KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9ybmRpc19maWx0ZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9odi9ybmRpc19maWx0ZXIuaAppbmRleCA3NjRiOWJmLi40ZGExOGYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvcm5kaXNfZmlsdGVyLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L3JuZGlzX2ZpbHRlci5oCkBAIC01MCw2ICs1MCw2IEBACiAKIC8qIEludGVyZmFjZSAqLwogCi1leHRlcm4gaW50IFJuZGlzRmlsdGVySW5pdChzdHJ1Y3QgbmV0dnNjX2RyaXZlciAqZHJpdmVyKTsKK2V4dGVybiBpbnQgcm5kaXNfZmlsdGVyX2luaXQoc3RydWN0IG5ldHZzY19kcml2ZXIgKmRyaXZlcik7CiAKICNlbmRpZiAvKiBfUk5ESVNGSUxURVJfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9zdG9ydnNjLmMgYi9kcml2ZXJzL3N0YWdpbmcvaHYvc3RvcnZzYy5jCmluZGV4IDE5ZTg3ZjYuLjkyOTUxMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi9zdG9ydnNjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L3N0b3J2c2MuYwpAQCAtMzQsNDMgKzM0LDQzIEBACiBzdHJ1Y3Qgc3RvcnZzY19yZXF1ZXN0X2V4dGVuc2lvbiB7CiAJLyogTElTVF9FTlRSWSBMaXN0RW50cnk7ICovCiAKLQlzdHJ1Y3QgaHZfc3RvcnZzY19yZXF1ZXN0ICpSZXF1ZXN0OwotCXN0cnVjdCBodl9kZXZpY2UgKkRldmljZTsKKwlzdHJ1Y3QgaHZfc3RvcnZzY19yZXF1ZXN0ICpyZXF1ZXN0OworCXN0cnVjdCBodl9kZXZpY2UgKmRldmljZTsKIAogCS8qIFN5bmNocm9uaXplIHRoZSByZXF1ZXN0L3Jlc3BvbnNlIGlmIG5lZWRlZCAqLwotCXN0cnVjdCBvc2Rfd2FpdGV2ZW50ICpXYWl0RXZlbnQ7CisJc3RydWN0IG9zZF93YWl0ZXZlbnQgKndhaXRfZXZlbnQ7CiAKLQlzdHJ1Y3QgdnN0b3JfcGFja2V0IFZTdG9yUGFja2V0OworCXN0cnVjdCB2c3Rvcl9wYWNrZXQgdnN0b3JfcGFja2V0OwogfTsKIAogLyogQSBzdG9ydnNjIGRldmljZSBpcyBhIGRldmljZSBvYmplY3QgdGhhdCBjb250YWlucyBhIHZtYnVzIGNoYW5uZWwgKi8KIHN0cnVjdCBzdG9ydnNjX2RldmljZSB7Ci0Jc3RydWN0IGh2X2RldmljZSAqRGV2aWNlOworCXN0cnVjdCBodl9kZXZpY2UgKmRldmljZTsKIAogCS8qIDAgaW5kaWNhdGVzIHRoZSBkZXZpY2UgaXMgYmVpbmcgZGVzdHJveWVkICovCi0JYXRvbWljX3QgUmVmQ291bnQ7CisJYXRvbWljX3QgcmVmX2NvdW50OwogCi0JYXRvbWljX3QgTnVtT3V0c3RhbmRpbmdSZXF1ZXN0czsKKwlhdG9taWNfdCBudW1fb3V0c3RhbmRpbmdfcmVxOwogCiAJLyoKIAkgKiBFYWNoIHVuaXF1ZSBQb3J0L1BhdGgvVGFyZ2V0IHJlcHJlc2VudHMgMSBjaGFubmVsIGllIHNjc2kKIAkgKiBjb250cm9sbGVyLiBJbiByZWFsaXR5LCB0aGUgcGF0aGlkLCB0YXJnZXRpZCBpcyBhbHdheXMgMAogCSAqIGFuZCB0aGUgcG9ydCBpcyBzZXQgYnkgdXMKIAkgKi8KLQl1bnNpZ25lZCBpbnQgUG9ydE51bWJlcjsKLQl1bnNpZ25lZCBjaGFyIFBhdGhJZDsKLQl1bnNpZ25lZCBjaGFyIFRhcmdldElkOworCXVuc2lnbmVkIGludCBwb3J0X251bWJlcjsKKwl1bnNpZ25lZCBjaGFyIHBhdGhfaWQ7CisJdW5zaWduZWQgY2hhciB0YXJnZXRfaWQ7CiAKIAkvKiBMSVNUX0VOVFJZIE91dHN0YW5kaW5nUmVxdWVzdExpc3Q7ICovCiAJLyogSEFORExFIE91dHN0YW5kaW5nUmVxdWVzdExvY2s7ICovCiAKIAkvKiBVc2VkIGZvciB2c2MvdnNwIGNoYW5uZWwgcmVzZXQgcHJvY2VzcyAqLwotCXN0cnVjdCBzdG9ydnNjX3JlcXVlc3RfZXh0ZW5zaW9uIEluaXRSZXF1ZXN0OwotCXN0cnVjdCBzdG9ydnNjX3JlcXVlc3RfZXh0ZW5zaW9uIFJlc2V0UmVxdWVzdDsKKwlzdHJ1Y3Qgc3RvcnZzY19yZXF1ZXN0X2V4dGVuc2lvbiBpbml0X3JlcXVlc3Q7CisJc3RydWN0IHN0b3J2c2NfcmVxdWVzdF9leHRlbnNpb24gcmVzZXRfcmVxdWVzdDsKIH07CiAKIAotc3RhdGljIGNvbnN0IGNoYXIgKmdEcml2ZXJOYW1lID0gInN0b3J2c2MiOworc3RhdGljIGNvbnN0IGNoYXIgKmdfZHJpdmVyX25hbWUgPSAic3RvcnZzYyI7CiAKIC8qIHtiYTYxNjNkOS0wNGExLTRkMjktYjYwNS03MmUyZmZiMWRjN2Z9ICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGh2X2d1aWQgZ1N0b3JWc2NEZXZpY2VUeXBlID0gewpAQCAtODEsMTMxICs4MSwxMzMgQEAKIH07CiAKIAotc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKkFsbG9jU3RvckRldmljZShzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzdG9ydnNjX2RldmljZSAqYWxsb2Nfc3Rvcl9kZXZpY2Uoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKQogewotCXN0cnVjdCBzdG9ydnNjX2RldmljZSAqc3RvckRldmljZTsKKwlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKnN0b3JfZGV2aWNlOwogCi0Jc3RvckRldmljZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzdG9ydnNjX2RldmljZSksIEdGUF9LRVJORUwpOwotCWlmICghc3RvckRldmljZSkKKwlzdG9yX2RldmljZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzdG9ydnNjX2RldmljZSksIEdGUF9LRVJORUwpOworCWlmICghc3Rvcl9kZXZpY2UpCiAJCXJldHVybiBOVUxMOwogCiAJLyogU2V0IHRvIDIgdG8gYWxsb3cgYm90aCBpbmJvdW5kIGFuZCBvdXRib3VuZCB0cmFmZmljcyAqLwotCS8qIChpZSBHZXRTdG9yRGV2aWNlKCkgYW5kIE11c3RHZXRTdG9yRGV2aWNlKCkpIHRvIHByb2NlZWQuICovCi0JYXRvbWljX2NtcHhjaGcoJnN0b3JEZXZpY2UtPlJlZkNvdW50LCAwLCAyKTsKKwkvKiAoaWUgZ2V0X3N0b3JfZGV2aWNlKCkgYW5kIG11c3RfZ2V0X3N0b3JfZGV2aWNlKCkpIHRvIHByb2NlZWQuICovCisJYXRvbWljX2NtcHhjaGcoJnN0b3JfZGV2aWNlLT5yZWZfY291bnQsIDAsIDIpOwogCi0Jc3RvckRldmljZS0+RGV2aWNlID0gRGV2aWNlOwotCURldmljZS0+RXh0ZW5zaW9uID0gc3RvckRldmljZTsKKwlzdG9yX2RldmljZS0+ZGV2aWNlID0gZGV2aWNlOworCWRldmljZS0+RXh0ZW5zaW9uID0gc3Rvcl9kZXZpY2U7CiAKLQlyZXR1cm4gc3RvckRldmljZTsKKwlyZXR1cm4gc3Rvcl9kZXZpY2U7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBGcmVlU3RvckRldmljZShzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKkRldmljZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX3N0b3JfZGV2aWNlKHN0cnVjdCBzdG9ydnNjX2RldmljZSAqZGV2aWNlKQogewotCS8qIEFTU0VSVChhdG9taWNfcmVhZCgmRGV2aWNlLT5SZWZDb3VudCkgPT0gMCk7ICovCi0Ja2ZyZWUoRGV2aWNlKTsKKwkvKiBBU1NFUlQoYXRvbWljX3JlYWQoJmRldmljZS0+cmVmX2NvdW50KSA9PSAwKTsgKi8KKwlrZnJlZShkZXZpY2UpOwogfQogCiAvKiBHZXQgdGhlIHN0b3JkZXZpY2Ugb2JqZWN0IGlmZiBleGlzdHMgYW5kIGl0cyByZWZjb3VudCA+IDEgKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHN0b3J2c2NfZGV2aWNlICpHZXRTdG9yRGV2aWNlKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHN0b3J2c2NfZGV2aWNlICpnZXRfc3Rvcl9kZXZpY2Uoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKQogewotCXN0cnVjdCBzdG9ydnNjX2RldmljZSAqc3RvckRldmljZTsKKwlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKnN0b3JfZGV2aWNlOwogCi0Jc3RvckRldmljZSA9IChzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKilEZXZpY2UtPkV4dGVuc2lvbjsKLQlpZiAoc3RvckRldmljZSAmJiBhdG9taWNfcmVhZCgmc3RvckRldmljZS0+UmVmQ291bnQpID4gMSkKLQkJYXRvbWljX2luYygmc3RvckRldmljZS0+UmVmQ291bnQpOworCXN0b3JfZGV2aWNlID0gKHN0cnVjdCBzdG9ydnNjX2RldmljZSAqKWRldmljZS0+RXh0ZW5zaW9uOworCWlmIChzdG9yX2RldmljZSAmJiBhdG9taWNfcmVhZCgmc3Rvcl9kZXZpY2UtPnJlZl9jb3VudCkgPiAxKQorCQlhdG9taWNfaW5jKCZzdG9yX2RldmljZS0+cmVmX2NvdW50KTsKIAllbHNlCi0JCXN0b3JEZXZpY2UgPSBOVUxMOworCQlzdG9yX2RldmljZSA9IE5VTEw7CiAKLQlyZXR1cm4gc3RvckRldmljZTsKKwlyZXR1cm4gc3Rvcl9kZXZpY2U7CiB9CiAKIC8qIEdldCB0aGUgc3RvcmRldmljZSBvYmplY3QgaWZmIGV4aXN0cyBhbmQgaXRzIHJlZmNvdW50ID4gMCAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKk11c3RHZXRTdG9yRGV2aWNlKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHN0b3J2c2NfZGV2aWNlICptdXN0X2dldF9zdG9yX2RldmljZSgKKwkJCQkJc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKQogewotCXN0cnVjdCBzdG9ydnNjX2RldmljZSAqc3RvckRldmljZTsKKwlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKnN0b3JfZGV2aWNlOwogCi0Jc3RvckRldmljZSA9IChzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKilEZXZpY2UtPkV4dGVuc2lvbjsKLQlpZiAoc3RvckRldmljZSAmJiBhdG9taWNfcmVhZCgmc3RvckRldmljZS0+UmVmQ291bnQpKQotCQlhdG9taWNfaW5jKCZzdG9yRGV2aWNlLT5SZWZDb3VudCk7CisJc3Rvcl9kZXZpY2UgPSAoc3RydWN0IHN0b3J2c2NfZGV2aWNlICopZGV2aWNlLT5FeHRlbnNpb247CisJaWYgKHN0b3JfZGV2aWNlICYmIGF0b21pY19yZWFkKCZzdG9yX2RldmljZS0+cmVmX2NvdW50KSkKKwkJYXRvbWljX2luYygmc3Rvcl9kZXZpY2UtPnJlZl9jb3VudCk7CiAJZWxzZQotCQlzdG9yRGV2aWNlID0gTlVMTDsKKwkJc3Rvcl9kZXZpY2UgPSBOVUxMOwogCi0JcmV0dXJuIHN0b3JEZXZpY2U7CisJcmV0dXJuIHN0b3JfZGV2aWNlOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgUHV0U3RvckRldmljZShzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UpCitzdGF0aWMgaW5saW5lIHZvaWQgcHV0X3N0b3JfZGV2aWNlKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKnN0b3JEZXZpY2U7CisJc3RydWN0IHN0b3J2c2NfZGV2aWNlICpzdG9yX2RldmljZTsKIAotCXN0b3JEZXZpY2UgPSAoc3RydWN0IHN0b3J2c2NfZGV2aWNlICopRGV2aWNlLT5FeHRlbnNpb247Ci0JLyogQVNTRVJUKHN0b3JEZXZpY2UpOyAqLworCXN0b3JfZGV2aWNlID0gKHN0cnVjdCBzdG9ydnNjX2RldmljZSAqKWRldmljZS0+RXh0ZW5zaW9uOworCS8qIEFTU0VSVChzdG9yX2RldmljZSk7ICovCiAKLQlhdG9taWNfZGVjKCZzdG9yRGV2aWNlLT5SZWZDb3VudCk7Ci0JLyogQVNTRVJUKGF0b21pY19yZWFkKCZzdG9yRGV2aWNlLT5SZWZDb3VudCkpOyAqLworCWF0b21pY19kZWMoJnN0b3JfZGV2aWNlLT5yZWZfY291bnQpOworCS8qIEFTU0VSVChhdG9taWNfcmVhZCgmc3Rvcl9kZXZpY2UtPnJlZl9jb3VudCkpOyAqLwogfQogCi0vKiBEcm9wIHJlZiBjb3VudCB0byAxIHRvIGVmZmVjdGl2ZWx5IGRpc2FibGUgR2V0U3RvckRldmljZSgpICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBzdG9ydnNjX2RldmljZSAqUmVsZWFzZVN0b3JEZXZpY2Uoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlKQorLyogRHJvcCByZWYgY291bnQgdG8gMSB0byBlZmZlY3RpdmVseSBkaXNhYmxlIGdldF9zdG9yX2RldmljZSgpICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzdG9ydnNjX2RldmljZSAqcmVsZWFzZV9zdG9yX2RldmljZSgKKwkJCQkJc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKQogewotCXN0cnVjdCBzdG9ydnNjX2RldmljZSAqc3RvckRldmljZTsKKwlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKnN0b3JfZGV2aWNlOwogCi0Jc3RvckRldmljZSA9IChzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKilEZXZpY2UtPkV4dGVuc2lvbjsKLQkvKiBBU1NFUlQoc3RvckRldmljZSk7ICovCisJc3Rvcl9kZXZpY2UgPSAoc3RydWN0IHN0b3J2c2NfZGV2aWNlICopZGV2aWNlLT5FeHRlbnNpb247CisJLyogQVNTRVJUKHN0b3JfZGV2aWNlKTsgKi8KIAogCS8qIEJ1c3kgd2FpdCB1bnRpbCB0aGUgcmVmIGRyb3AgdG8gMiwgdGhlbiBzZXQgaXQgdG8gMSAqLwotCXdoaWxlIChhdG9taWNfY21weGNoZygmc3RvckRldmljZS0+UmVmQ291bnQsIDIsIDEpICE9IDIpCisJd2hpbGUgKGF0b21pY19jbXB4Y2hnKCZzdG9yX2RldmljZS0+cmVmX2NvdW50LCAyLCAxKSAhPSAyKQogCQl1ZGVsYXkoMTAwKTsKIAotCXJldHVybiBzdG9yRGV2aWNlOworCXJldHVybiBzdG9yX2RldmljZTsKIH0KIAotLyogRHJvcCByZWYgY291bnQgdG8gMC4gTm8gb25lIGNhbiB1c2UgU3RvckRldmljZSBvYmplY3QuICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBzdG9ydnNjX2RldmljZSAqRmluYWxSZWxlYXNlU3RvckRldmljZSgKLQkJCXN0cnVjdCBodl9kZXZpY2UgKkRldmljZSkKKy8qIERyb3AgcmVmIGNvdW50IHRvIDAuIE5vIG9uZSBjYW4gdXNlIHN0b3JfZGV2aWNlIG9iamVjdC4gKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHN0b3J2c2NfZGV2aWNlICpmaW5hbF9yZWxlYXNlX3N0b3JfZGV2aWNlKAorCQkJc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKQogewotCXN0cnVjdCBzdG9ydnNjX2RldmljZSAqc3RvckRldmljZTsKKwlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKnN0b3JfZGV2aWNlOwogCi0Jc3RvckRldmljZSA9IChzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKilEZXZpY2UtPkV4dGVuc2lvbjsKLQkvKiBBU1NFUlQoc3RvckRldmljZSk7ICovCisJc3Rvcl9kZXZpY2UgPSAoc3RydWN0IHN0b3J2c2NfZGV2aWNlICopZGV2aWNlLT5FeHRlbnNpb247CisJLyogQVNTRVJUKHN0b3JfZGV2aWNlKTsgKi8KIAogCS8qIEJ1c3kgd2FpdCB1bnRpbCB0aGUgcmVmIGRyb3AgdG8gMSwgdGhlbiBzZXQgaXQgdG8gMCAqLwotCXdoaWxlIChhdG9taWNfY21weGNoZygmc3RvckRldmljZS0+UmVmQ291bnQsIDEsIDApICE9IDEpCisJd2hpbGUgKGF0b21pY19jbXB4Y2hnKCZzdG9yX2RldmljZS0+cmVmX2NvdW50LCAxLCAwKSAhPSAxKQogCQl1ZGVsYXkoMTAwKTsKIAotCURldmljZS0+RXh0ZW5zaW9uID0gTlVMTDsKLQlyZXR1cm4gc3RvckRldmljZTsKKwlkZXZpY2UtPkV4dGVuc2lvbiA9IE5VTEw7CisJcmV0dXJuIHN0b3JfZGV2aWNlOwogfQogCi1zdGF0aWMgaW50IFN0b3JWc2NDaGFubmVsSW5pdChzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UpCitzdGF0aWMgaW50IHN0b3JfdnNjX2NoYW5uZWxfaW5pdChzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IHN0b3J2c2NfZGV2aWNlICpzdG9yRGV2aWNlOworCXN0cnVjdCBzdG9ydnNjX2RldmljZSAqc3Rvcl9kZXZpY2U7CiAJc3RydWN0IHN0b3J2c2NfcmVxdWVzdF9leHRlbnNpb24gKnJlcXVlc3Q7Ci0Jc3RydWN0IHZzdG9yX3BhY2tldCAqdnN0b3JQYWNrZXQ7CisJc3RydWN0IHZzdG9yX3BhY2tldCAqdnN0b3JfcGFja2V0OwogCWludCByZXQ7CiAKLQlzdG9yRGV2aWNlID0gR2V0U3RvckRldmljZShEZXZpY2UpOwotCWlmICghc3RvckRldmljZSkgeworCXN0b3JfZGV2aWNlID0gZ2V0X3N0b3JfZGV2aWNlKGRldmljZSk7CisJaWYgKCFzdG9yX2RldmljZSkgewogCQlEUFJJTlRfRVJSKFNUT1JWU0MsICJ1bmFibGUgdG8gZ2V0IHN0b3IgZGV2aWNlLi4uIgogCQkJICAgImRldmljZSBiZWluZyBkZXN0cm95ZWQ/Iik7CiAJCXJldHVybiAtMTsKIAl9CiAKLQlyZXF1ZXN0ID0gJnN0b3JEZXZpY2UtPkluaXRSZXF1ZXN0OwotCXZzdG9yUGFja2V0ID0gJnJlcXVlc3QtPlZTdG9yUGFja2V0OworCXJlcXVlc3QgPSAmc3Rvcl9kZXZpY2UtPmluaXRfcmVxdWVzdDsKKwl2c3Rvcl9wYWNrZXQgPSAmcmVxdWVzdC0+dnN0b3JfcGFja2V0OwogCiAJLyoKIAkgKiBOb3csIGluaXRpYXRlIHRoZSB2c2MvdnNwIGluaXRpYWxpemF0aW9uIHByb3RvY29sIG9uIHRoZSBvcGVuCiAJICogY2hhbm5lbAogCSAqLwogCW1lbXNldChyZXF1ZXN0LCAwLCBzaXplb2Yoc3RydWN0IHN0b3J2c2NfcmVxdWVzdF9leHRlbnNpb24pKTsKLQlyZXF1ZXN0LT5XYWl0RXZlbnQgPSBvc2RfV2FpdEV2ZW50Q3JlYXRlKCk7Ci0JaWYgKCFyZXF1ZXN0LT5XYWl0RXZlbnQpIHsKKwlyZXF1ZXN0LT53YWl0X2V2ZW50ID0gb3NkX3dhaXRldmVudF9jcmVhdGUoKTsKKwlpZiAoIXJlcXVlc3QtPndhaXRfZXZlbnQpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBub21lbTsKIAl9CiAKLQl2c3RvclBhY2tldC0+T3BlcmF0aW9uID0gVlN0b3JPcGVyYXRpb25CZWdpbkluaXRpYWxpemF0aW9uOwotCXZzdG9yUGFja2V0LT5GbGFncyA9IFJFUVVFU1RfQ09NUExFVElPTl9GTEFHOworCXZzdG9yX3BhY2tldC0+b3BlcmF0aW9uID0gVlNUT1JfT1BFUkFUSU9OX0JFR0lOX0lOSVRJQUxJWkFUSU9OOworCXZzdG9yX3BhY2tldC0+ZmxhZ3MgPSBSRVFVRVNUX0NPTVBMRVRJT05fRkxBRzsKIAogCS8qU3BpbmxvY2tBY3F1aXJlKGdEcml2ZXJFeHQucGFja2V0TGlzdExvY2spOwogCUlOU0VSVF9UQUlMX0xJU1QoJmdEcml2ZXJFeHQucGFja2V0TGlzdCwgJnBhY2tldC0+bGlzdEVudHJ5LmVudHJ5KTsKQEAgLTIxMyw3ICsyMTUsNyBAQAogCiAJRFBSSU5UX0lORk8oU1RPUlZTQywgIkJFR0lOX0lOSVRJQUxJWkFUSU9OX09QRVJBVElPTi4uLiIpOwogCi0JcmV0ID0gdm1idXNfc2VuZHBhY2tldChEZXZpY2UtPmNoYW5uZWwsIHZzdG9yUGFja2V0LAorCXJldCA9IHZtYnVzX3NlbmRwYWNrZXQoZGV2aWNlLT5jaGFubmVsLCB2c3Rvcl9wYWNrZXQsCiAJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB2c3Rvcl9wYWNrZXQpLAogCQkJICAgICAgICh1bnNpZ25lZCBsb25nKXJlcXVlc3QsCiAJCQkgICAgICAgVm1idXNQYWNrZXRUeXBlRGF0YUluQmFuZCwKQEAgLTIyNCwyNyArMjI2LDI3IEBACiAJCWdvdG8gQ2xlYW51cDsKIAl9CiAKLQlvc2RfV2FpdEV2ZW50V2FpdChyZXF1ZXN0LT5XYWl0RXZlbnQpOworCW9zZF93YWl0ZXZlbnRfd2FpdChyZXF1ZXN0LT53YWl0X2V2ZW50KTsKIAotCWlmICh2c3RvclBhY2tldC0+T3BlcmF0aW9uICE9IFZTdG9yT3BlcmF0aW9uQ29tcGxldGVJbyB8fAotCSAgICB2c3RvclBhY2tldC0+U3RhdHVzICE9IDApIHsKKwlpZiAodnN0b3JfcGFja2V0LT5vcGVyYXRpb24gIT0gVlNUT1JfT1BFUkFUSU9OX0NPTVBMRVRFX0lPIHx8CisJICAgIHZzdG9yX3BhY2tldC0+c3RhdHVzICE9IDApIHsKIAkJRFBSSU5UX0VSUihTVE9SVlNDLCAiQkVHSU5fSU5JVElBTElaQVRJT05fT1BFUkFUSU9OIGZhaWxlZCAiCiAJCQkgICAiKG9wICVkIHN0YXR1cyAweCV4KSIsCi0JCQkgICB2c3RvclBhY2tldC0+T3BlcmF0aW9uLCB2c3RvclBhY2tldC0+U3RhdHVzKTsKKwkJCSAgIHZzdG9yX3BhY2tldC0+b3BlcmF0aW9uLCB2c3Rvcl9wYWNrZXQtPnN0YXR1cyk7CiAJCWdvdG8gQ2xlYW51cDsKIAl9CiAKIAlEUFJJTlRfSU5GTyhTVE9SVlNDLCAiUVVFUllfUFJPVE9DT0xfVkVSU0lPTl9PUEVSQVRJT04uLi4iKTsKIAogCS8qIHJldXNlIHRoZSBwYWNrZXQgZm9yIHZlcnNpb24gcmFuZ2Ugc3VwcG9ydGVkICovCi0JbWVtc2V0KHZzdG9yUGFja2V0LCAwLCBzaXplb2Yoc3RydWN0IHZzdG9yX3BhY2tldCkpOwotCXZzdG9yUGFja2V0LT5PcGVyYXRpb24gPSBWU3Rvck9wZXJhdGlvblF1ZXJ5UHJvdG9jb2xWZXJzaW9uOwotCXZzdG9yUGFja2V0LT5GbGFncyA9IFJFUVVFU1RfQ09NUExFVElPTl9GTEFHOworCW1lbXNldCh2c3Rvcl9wYWNrZXQsIDAsIHNpemVvZihzdHJ1Y3QgdnN0b3JfcGFja2V0KSk7CisJdnN0b3JfcGFja2V0LT5vcGVyYXRpb24gPSBWU1RPUl9PUEVSQVRJT05fUVVFUllfUFJPVE9DT0xfVkVSU0lPTjsKKwl2c3Rvcl9wYWNrZXQtPmZsYWdzID0gUkVRVUVTVF9DT01QTEVUSU9OX0ZMQUc7CiAKLQl2c3RvclBhY2tldC0+VmVyc2lvbi5NYWpvck1pbm9yID0gVk1TVE9SX1BST1RPQ09MX1ZFUlNJT05fQ1VSUkVOVDsKLQlGSUxMX1ZNU1RPUl9SRVZJU0lPTih2c3RvclBhY2tldC0+VmVyc2lvbi5SZXZpc2lvbik7CisJdnN0b3JfcGFja2V0LT52ZXJzaW9uLm1ham9yX21pbm9yID0gVk1TVE9SX1BST1RPQ09MX1ZFUlNJT05fQ1VSUkVOVDsKKwlGSUxMX1ZNU1RPUl9SRVZJU0lPTih2c3Rvcl9wYWNrZXQtPnZlcnNpb24ucmV2aXNpb24pOwogCi0JcmV0ID0gdm1idXNfc2VuZHBhY2tldChEZXZpY2UtPmNoYW5uZWwsIHZzdG9yUGFja2V0LAorCXJldCA9IHZtYnVzX3NlbmRwYWNrZXQoZGV2aWNlLT5jaGFubmVsLCB2c3Rvcl9wYWNrZXQsCiAJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB2c3Rvcl9wYWNrZXQpLAogCQkJICAgICAgICh1bnNpZ25lZCBsb25nKXJlcXVlc3QsCiAJCQkgICAgICAgVm1idXNQYWNrZXRUeXBlRGF0YUluQmFuZCwKQEAgLTI1NSwyNyArMjU3LDI3IEBACiAJCWdvdG8gQ2xlYW51cDsKIAl9CiAKLQlvc2RfV2FpdEV2ZW50V2FpdChyZXF1ZXN0LT5XYWl0RXZlbnQpOworCW9zZF93YWl0ZXZlbnRfd2FpdChyZXF1ZXN0LT53YWl0X2V2ZW50KTsKIAogCS8qIFRPRE86IENoZWNrIHJldHVybmVkIHZlcnNpb24gKi8KLQlpZiAodnN0b3JQYWNrZXQtPk9wZXJhdGlvbiAhPSBWU3Rvck9wZXJhdGlvbkNvbXBsZXRlSW8gfHwKLQkgICAgdnN0b3JQYWNrZXQtPlN0YXR1cyAhPSAwKSB7CisJaWYgKHZzdG9yX3BhY2tldC0+b3BlcmF0aW9uICE9IFZTVE9SX09QRVJBVElPTl9DT01QTEVURV9JTyB8fAorCSAgICB2c3Rvcl9wYWNrZXQtPnN0YXR1cyAhPSAwKSB7CiAJCURQUklOVF9FUlIoU1RPUlZTQywgIlFVRVJZX1BST1RPQ09MX1ZFUlNJT05fT1BFUkFUSU9OIGZhaWxlZCAiCiAJCQkgICAiKG9wICVkIHN0YXR1cyAweCV4KSIsCi0JCQkgICB2c3RvclBhY2tldC0+T3BlcmF0aW9uLCB2c3RvclBhY2tldC0+U3RhdHVzKTsKKwkJCSAgIHZzdG9yX3BhY2tldC0+b3BlcmF0aW9uLCB2c3Rvcl9wYWNrZXQtPnN0YXR1cyk7CiAJCWdvdG8gQ2xlYW51cDsKIAl9CiAKIAkvKiBRdWVyeSBjaGFubmVsIHByb3BlcnRpZXMgKi8KIAlEUFJJTlRfSU5GTyhTVE9SVlNDLCAiUVVFUllfUFJPUEVSVElFU19PUEVSQVRJT04uLi4iKTsKIAotCW1lbXNldCh2c3RvclBhY2tldCwgMCwgc2l6ZW9mKHN0cnVjdCB2c3Rvcl9wYWNrZXQpKTsKLQl2c3RvclBhY2tldC0+T3BlcmF0aW9uID0gVlN0b3JPcGVyYXRpb25RdWVyeVByb3BlcnRpZXM7Ci0JdnN0b3JQYWNrZXQtPkZsYWdzID0gUkVRVUVTVF9DT01QTEVUSU9OX0ZMQUc7Ci0JdnN0b3JQYWNrZXQtPlN0b3JhZ2VDaGFubmVsUHJvcGVydGllcy5Qb3J0TnVtYmVyID0KLQkJCQkJc3RvckRldmljZS0+UG9ydE51bWJlcjsKKwltZW1zZXQodnN0b3JfcGFja2V0LCAwLCBzaXplb2Yoc3RydWN0IHZzdG9yX3BhY2tldCkpOworCXZzdG9yX3BhY2tldC0+b3BlcmF0aW9uID0gVlNUT1JfT1BFUkFUSU9OX1FVRVJZX1BST1BFUlRJRVM7CisJdnN0b3JfcGFja2V0LT5mbGFncyA9IFJFUVVFU1RfQ09NUExFVElPTl9GTEFHOworCXZzdG9yX3BhY2tldC0+c3RvcmFnZV9jaGFubmVsX3Byb3BlcnRpZXMucG9ydF9udW1iZXIgPQorCQkJCQlzdG9yX2RldmljZS0+cG9ydF9udW1iZXI7CiAKLQlyZXQgPSB2bWJ1c19zZW5kcGFja2V0KERldmljZS0+Y2hhbm5lbCwgdnN0b3JQYWNrZXQsCisJcmV0ID0gdm1idXNfc2VuZHBhY2tldChkZXZpY2UtPmNoYW5uZWwsIHZzdG9yX3BhY2tldCwKIAkJCSAgICAgICBzaXplb2Yoc3RydWN0IHZzdG9yX3BhY2tldCksCiAJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcmVxdWVzdCwKIAkJCSAgICAgICBWbWJ1c1BhY2tldFR5cGVEYXRhSW5CYW5kLApAQCAtMjg3LDMxICsyODksMzIgQEAKIAkJZ290byBDbGVhbnVwOwogCX0KIAotCW9zZF9XYWl0RXZlbnRXYWl0KHJlcXVlc3QtPldhaXRFdmVudCk7CisJb3NkX3dhaXRldmVudF93YWl0KHJlcXVlc3QtPndhaXRfZXZlbnQpOwogCiAJLyogVE9ETzogQ2hlY2sgcmV0dXJuZWQgdmVyc2lvbiAqLwotCWlmICh2c3RvclBhY2tldC0+T3BlcmF0aW9uICE9IFZTdG9yT3BlcmF0aW9uQ29tcGxldGVJbyB8fAotCSAgICB2c3RvclBhY2tldC0+U3RhdHVzICE9IDApIHsKKwlpZiAodnN0b3JfcGFja2V0LT5vcGVyYXRpb24gIT0gVlNUT1JfT1BFUkFUSU9OX0NPTVBMRVRFX0lPIHx8CisJICAgIHZzdG9yX3BhY2tldC0+c3RhdHVzICE9IDApIHsKIAkJRFBSSU5UX0VSUihTVE9SVlNDLCAiUVVFUllfUFJPUEVSVElFU19PUEVSQVRJT04gZmFpbGVkICIKIAkJCSAgICIob3AgJWQgc3RhdHVzIDB4JXgpIiwKLQkJCSAgIHZzdG9yUGFja2V0LT5PcGVyYXRpb24sIHZzdG9yUGFja2V0LT5TdGF0dXMpOworCQkJICAgdnN0b3JfcGFja2V0LT5vcGVyYXRpb24sIHZzdG9yX3BhY2tldC0+c3RhdHVzKTsKIAkJZ290byBDbGVhbnVwOwogCX0KIAotCXN0b3JEZXZpY2UtPlBhdGhJZCA9IHZzdG9yUGFja2V0LT5TdG9yYWdlQ2hhbm5lbFByb3BlcnRpZXMuUGF0aElkOwotCXN0b3JEZXZpY2UtPlRhcmdldElkID0gdnN0b3JQYWNrZXQtPlN0b3JhZ2VDaGFubmVsUHJvcGVydGllcy5UYXJnZXRJZDsKKwlzdG9yX2RldmljZS0+cGF0aF9pZCA9IHZzdG9yX3BhY2tldC0+c3RvcmFnZV9jaGFubmVsX3Byb3BlcnRpZXMucGF0aF9pZDsKKwlzdG9yX2RldmljZS0+dGFyZ2V0X2lkCisJCT0gdnN0b3JfcGFja2V0LT5zdG9yYWdlX2NoYW5uZWxfcHJvcGVydGllcy50YXJnZXRfaWQ7CiAKIAlEUFJJTlRfREJHKFNUT1JWU0MsICJjaGFubmVsIGZsYWcgMHgleCwgbWF4IHhmZXIgbGVuIDB4JXgiLAotCQkgICB2c3RvclBhY2tldC0+U3RvcmFnZUNoYW5uZWxQcm9wZXJ0aWVzLkZsYWdzLAotCQkgICB2c3RvclBhY2tldC0+U3RvcmFnZUNoYW5uZWxQcm9wZXJ0aWVzLk1heFRyYW5zZmVyQnl0ZXMpOworCQkgICB2c3Rvcl9wYWNrZXQtPnN0b3JhZ2VfY2hhbm5lbF9wcm9wZXJ0aWVzLmZsYWdzLAorCQkgICB2c3Rvcl9wYWNrZXQtPnN0b3JhZ2VfY2hhbm5lbF9wcm9wZXJ0aWVzLm1heF90cmFuc2Zlcl9ieXRlcyk7CiAKIAlEUFJJTlRfSU5GTyhTVE9SVlNDLCAiRU5EX0lOSVRJQUxJWkFUSU9OX09QRVJBVElPTi4uLiIpOwogCi0JbWVtc2V0KHZzdG9yUGFja2V0LCAwLCBzaXplb2Yoc3RydWN0IHZzdG9yX3BhY2tldCkpOwotCXZzdG9yUGFja2V0LT5PcGVyYXRpb24gPSBWU3Rvck9wZXJhdGlvbkVuZEluaXRpYWxpemF0aW9uOwotCXZzdG9yUGFja2V0LT5GbGFncyA9IFJFUVVFU1RfQ09NUExFVElPTl9GTEFHOworCW1lbXNldCh2c3Rvcl9wYWNrZXQsIDAsIHNpemVvZihzdHJ1Y3QgdnN0b3JfcGFja2V0KSk7CisJdnN0b3JfcGFja2V0LT5vcGVyYXRpb24gPSBWU1RPUl9PUEVSQVRJT05fRU5EX0lOSVRJQUxJWkFUSU9OOworCXZzdG9yX3BhY2tldC0+ZmxhZ3MgPSBSRVFVRVNUX0NPTVBMRVRJT05fRkxBRzsKIAotCXJldCA9IHZtYnVzX3NlbmRwYWNrZXQoRGV2aWNlLT5jaGFubmVsLCB2c3RvclBhY2tldCwKKwlyZXQgPSB2bWJ1c19zZW5kcGFja2V0KGRldmljZS0+Y2hhbm5lbCwgdnN0b3JfcGFja2V0LAogCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgdnN0b3JfcGFja2V0KSwKIAkJCSAgICAgICAodW5zaWduZWQgbG9uZylyZXF1ZXN0LAogCQkJICAgICAgIFZtYnVzUGFja2V0VHlwZURhdGFJbkJhbmQsCkBAIC0zMjMsMTI1ICszMjYsMTI1IEBACiAJCWdvdG8gQ2xlYW51cDsKIAl9CiAKLQlvc2RfV2FpdEV2ZW50V2FpdChyZXF1ZXN0LT5XYWl0RXZlbnQpOworCW9zZF93YWl0ZXZlbnRfd2FpdChyZXF1ZXN0LT53YWl0X2V2ZW50KTsKIAotCWlmICh2c3RvclBhY2tldC0+T3BlcmF0aW9uICE9IFZTdG9yT3BlcmF0aW9uQ29tcGxldGVJbyB8fAotCSAgICB2c3RvclBhY2tldC0+U3RhdHVzICE9IDApIHsKKwlpZiAodnN0b3JfcGFja2V0LT5vcGVyYXRpb24gIT0gVlNUT1JfT1BFUkFUSU9OX0NPTVBMRVRFX0lPIHx8CisJICAgIHZzdG9yX3BhY2tldC0+c3RhdHVzICE9IDApIHsKIAkJRFBSSU5UX0VSUihTVE9SVlNDLCAiRU5EX0lOSVRJQUxJWkFUSU9OX09QRVJBVElPTiBmYWlsZWQgIgogCQkJICAgIihvcCAlZCBzdGF0dXMgMHgleCkiLAotCQkJICAgdnN0b3JQYWNrZXQtPk9wZXJhdGlvbiwgdnN0b3JQYWNrZXQtPlN0YXR1cyk7CisJCQkgICB2c3Rvcl9wYWNrZXQtPm9wZXJhdGlvbiwgdnN0b3JfcGFja2V0LT5zdGF0dXMpOwogCQlnb3RvIENsZWFudXA7CiAJfQogCiAJRFBSSU5UX0lORk8oU1RPUlZTQywgIioqKiogc3RvcmFnZSBjaGFubmVsIHVwIGFuZCBydW5uaW5nISEgKioqKiIpOwogCiBDbGVhbnVwOgotCWtmcmVlKHJlcXVlc3QtPldhaXRFdmVudCk7Ci0JcmVxdWVzdC0+V2FpdEV2ZW50ID0gTlVMTDsKKwlrZnJlZShyZXF1ZXN0LT53YWl0X2V2ZW50KTsKKwlyZXF1ZXN0LT53YWl0X2V2ZW50ID0gTlVMTDsKIG5vbWVtOgotCVB1dFN0b3JEZXZpY2UoRGV2aWNlKTsKKwlwdXRfc3Rvcl9kZXZpY2UoZGV2aWNlKTsKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBTdG9yVnNjT25JT0NvbXBsZXRpb24oc3RydWN0IGh2X2RldmljZSAqRGV2aWNlLAotCQkJCSAgc3RydWN0IHZzdG9yX3BhY2tldCAqVlN0b3JQYWNrZXQsCi0JCQkJICBzdHJ1Y3Qgc3RvcnZzY19yZXF1ZXN0X2V4dGVuc2lvbiAqUmVxdWVzdEV4dCkKK3N0YXRpYyB2b2lkIHN0b3JfdnNjX29uX2lvX2NvbXBsZXRpb24oc3RydWN0IGh2X2RldmljZSAqZGV2aWNlLAorCQkJCSAgc3RydWN0IHZzdG9yX3BhY2tldCAqdnN0b3JfcGFja2V0LAorCQkJCSAgc3RydWN0IHN0b3J2c2NfcmVxdWVzdF9leHRlbnNpb24gKnJlcXVlc3RfZXh0KQogewogCXN0cnVjdCBodl9zdG9ydnNjX3JlcXVlc3QgKnJlcXVlc3Q7Ci0Jc3RydWN0IHN0b3J2c2NfZGV2aWNlICpzdG9yRGV2aWNlOworCXN0cnVjdCBzdG9ydnNjX2RldmljZSAqc3Rvcl9kZXZpY2U7CiAKLQlzdG9yRGV2aWNlID0gTXVzdEdldFN0b3JEZXZpY2UoRGV2aWNlKTsKLQlpZiAoIXN0b3JEZXZpY2UpIHsKKwlzdG9yX2RldmljZSA9IG11c3RfZ2V0X3N0b3JfZGV2aWNlKGRldmljZSk7CisJaWYgKCFzdG9yX2RldmljZSkgewogCQlEUFJJTlRfRVJSKFNUT1JWU0MsICJ1bmFibGUgdG8gZ2V0IHN0b3IgZGV2aWNlLi4uIgogCQkJICAgImRldmljZSBiZWluZyBkZXN0cm95ZWQ/Iik7CiAJCXJldHVybjsKIAl9CiAKIAlEUFJJTlRfREJHKFNUT1JWU0MsICJJT19DT01QTEVURV9PUEVSQVRJT04gLSByZXF1ZXN0IGV4dGVuc2lvbiAlcCAiCi0JCSAgICJjb21wbGV0ZWQgYnl0ZXMgeGZlciAldSIsIFJlcXVlc3RFeHQsCi0JCSAgIFZTdG9yUGFja2V0LT5WbVNyYi5EYXRhVHJhbnNmZXJMZW5ndGgpOworCQkgICAiY29tcGxldGVkIGJ5dGVzIHhmZXIgJXUiLCByZXF1ZXN0X2V4dCwKKwkJICAgdnN0b3JfcGFja2V0LT52bV9zcmIuZGF0YV90cmFuc2Zlcl9sZW5ndGgpOwogCi0JLyogQVNTRVJUKFJlcXVlc3RFeHQgIT0gTlVMTCk7ICovCi0JLyogQVNTRVJUKFJlcXVlc3RFeHQtPlJlcXVlc3QgIT0gTlVMTCk7ICovCisJLyogQVNTRVJUKHJlcXVlc3RfZXh0ICE9IE5VTEwpOyAqLworCS8qIEFTU0VSVChyZXF1ZXN0X2V4dC0+cmVxdWVzdCAhPSBOVUxMKTsgKi8KIAotCXJlcXVlc3QgPSBSZXF1ZXN0RXh0LT5SZXF1ZXN0OworCXJlcXVlc3QgPSByZXF1ZXN0X2V4dC0+cmVxdWVzdDsKIAogCS8qIEFTU0VSVChyZXF1ZXN0LT5PbklPQ29tcGxldGlvbiAhPSBOVUxMKTsgKi8KIAogCS8qIENvcHkgb3ZlciB0aGUgc3RhdHVzLi4uZXRjICovCi0JcmVxdWVzdC0+U3RhdHVzID0gVlN0b3JQYWNrZXQtPlZtU3JiLlNjc2lTdGF0dXM7CisJcmVxdWVzdC0+c3RhdHVzID0gdnN0b3JfcGFja2V0LT52bV9zcmIuc2NzaV9zdGF0dXM7CiAKLQlpZiAocmVxdWVzdC0+U3RhdHVzICE9IDAgfHwgVlN0b3JQYWNrZXQtPlZtU3JiLlNyYlN0YXR1cyAhPSAxKSB7CisJaWYgKHJlcXVlc3QtPnN0YXR1cyAhPSAwIHx8IHZzdG9yX3BhY2tldC0+dm1fc3JiLnNyYl9zdGF0dXMgIT0gMSkgewogCQlEUFJJTlRfV0FSTihTVE9SVlNDLAogCQkJICAgICJjbWQgMHgleCBzY3NpIHN0YXR1cyAweCV4IHNyYiBzdGF0dXMgMHgleFxuIiwKLQkJCSAgICByZXF1ZXN0LT5DZGJbMF0sIFZTdG9yUGFja2V0LT5WbVNyYi5TY3NpU3RhdHVzLAotCQkJICAgIFZTdG9yUGFja2V0LT5WbVNyYi5TcmJTdGF0dXMpOworCQkJICAgIHJlcXVlc3QtPmNkYlswXSwgdnN0b3JfcGFja2V0LT52bV9zcmIuc2NzaV9zdGF0dXMsCisJCQkgICAgdnN0b3JfcGFja2V0LT52bV9zcmIuc3JiX3N0YXR1cyk7CiAJfQogCi0JaWYgKChyZXF1ZXN0LT5TdGF0dXMgJiAweEZGKSA9PSAweDAyKSB7CisJaWYgKChyZXF1ZXN0LT5zdGF0dXMgJiAweEZGKSA9PSAweDAyKSB7CiAJCS8qIENIRUNLX0NPTkRJVElPTiAqLwotCQlpZiAoVlN0b3JQYWNrZXQtPlZtU3JiLlNyYlN0YXR1cyAmIDB4ODApIHsKKwkJaWYgKHZzdG9yX3BhY2tldC0+dm1fc3JiLnNyYl9zdGF0dXMgJiAweDgwKSB7CiAJCQkvKiBhdXRvc2Vuc2UgZGF0YSBhdmFpbGFibGUgKi8KIAkJCURQUklOVF9XQVJOKFNUT1JWU0MsICJzdG9ydnNjIHBrdCAlcCBhdXRvc2Vuc2UgZGF0YSAiCi0JCQkJICAgICJ2YWxpZCAtIGxlbiAlZFxuIiwgUmVxdWVzdEV4dCwKLQkJCQkgICAgVlN0b3JQYWNrZXQtPlZtU3JiLlNlbnNlSW5mb0xlbmd0aCk7CisJCQkJICAgICJ2YWxpZCAtIGxlbiAlZFxuIiwgcmVxdWVzdF9leHQsCisJCQkJICAgIHZzdG9yX3BhY2tldC0+dm1fc3JiLnNlbnNlX2luZm9fbGVuZ3RoKTsKIAotCQkJLyogQVNTRVJUKFZTdG9yUGFja2V0LT5WbVNyYi5TZW5zZUluZm9MZW5ndGggPD0gKi8KKwkJCS8qIEFTU0VSVCh2c3Rvcl9wYWNrZXQtPnZtX3NyYi5zZW5zZV9pbmZvX2xlbmd0aCA8PSAqLwogCQkJLyogCXJlcXVlc3QtPlNlbnNlQnVmZmVyU2l6ZSk7ICovCi0JCQltZW1jcHkocmVxdWVzdC0+U2Vuc2VCdWZmZXIsCi0JCQkgICAgICAgVlN0b3JQYWNrZXQtPlZtU3JiLlNlbnNlRGF0YSwKLQkJCSAgICAgICBWU3RvclBhY2tldC0+Vm1TcmIuU2Vuc2VJbmZvTGVuZ3RoKTsKKwkJCW1lbWNweShyZXF1ZXN0LT5zZW5zZV9idWZmZXIsCisJCQkgICAgICAgdnN0b3JfcGFja2V0LT52bV9zcmIuc2Vuc2VfZGF0YSwKKwkJCSAgICAgICB2c3Rvcl9wYWNrZXQtPnZtX3NyYi5zZW5zZV9pbmZvX2xlbmd0aCk7CiAKLQkJCXJlcXVlc3QtPlNlbnNlQnVmZmVyU2l6ZSA9Ci0JCQkJCVZTdG9yUGFja2V0LT5WbVNyYi5TZW5zZUluZm9MZW5ndGg7CisJCQlyZXF1ZXN0LT5zZW5zZV9idWZmZXJfc2l6ZSA9CisJCQkJCXZzdG9yX3BhY2tldC0+dm1fc3JiLnNlbnNlX2luZm9fbGVuZ3RoOwogCQl9CiAJfQogCiAJLyogVE9ETzogKi8KLQlyZXF1ZXN0LT5CeXRlc1hmZXIgPSBWU3RvclBhY2tldC0+Vm1TcmIuRGF0YVRyYW5zZmVyTGVuZ3RoOworCXJlcXVlc3QtPmJ5dGVzX3hmZXIgPSB2c3Rvcl9wYWNrZXQtPnZtX3NyYi5kYXRhX3RyYW5zZmVyX2xlbmd0aDsKIAotCXJlcXVlc3QtPk9uSU9Db21wbGV0aW9uKHJlcXVlc3QpOworCXJlcXVlc3QtPm9uX2lvX2NvbXBsZXRpb24ocmVxdWVzdCk7CiAKLQlhdG9taWNfZGVjKCZzdG9yRGV2aWNlLT5OdW1PdXRzdGFuZGluZ1JlcXVlc3RzKTsKKwlhdG9taWNfZGVjKCZzdG9yX2RldmljZS0+bnVtX291dHN0YW5kaW5nX3JlcSk7CiAKLQlQdXRTdG9yRGV2aWNlKERldmljZSk7CisJcHV0X3N0b3JfZGV2aWNlKGRldmljZSk7CiB9CiAKLXN0YXRpYyB2b2lkIFN0b3JWc2NPblJlY2VpdmUoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlLAotCQkJICAgICBzdHJ1Y3QgdnN0b3JfcGFja2V0ICpWU3RvclBhY2tldCwKLQkJCSAgICAgc3RydWN0IHN0b3J2c2NfcmVxdWVzdF9leHRlbnNpb24gKlJlcXVlc3RFeHQpCitzdGF0aWMgdm9pZCBzdG9yX3ZzY19vbl9yZWNlaXZlKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSwKKwkJCSAgICAgc3RydWN0IHZzdG9yX3BhY2tldCAqdnN0b3JfcGFja2V0LAorCQkJICAgICBzdHJ1Y3Qgc3RvcnZzY19yZXF1ZXN0X2V4dGVuc2lvbiAqcmVxdWVzdF9leHQpCiB7Ci0Jc3dpdGNoIChWU3RvclBhY2tldC0+T3BlcmF0aW9uKSB7Ci0JY2FzZSBWU3Rvck9wZXJhdGlvbkNvbXBsZXRlSW86CisJc3dpdGNoICh2c3Rvcl9wYWNrZXQtPm9wZXJhdGlvbikgeworCWNhc2UgVlNUT1JfT1BFUkFUSU9OX0NPTVBMRVRFX0lPOgogCQlEUFJJTlRfREJHKFNUT1JWU0MsICJJT19DT01QTEVURV9PUEVSQVRJT04iKTsKLQkJU3RvclZzY09uSU9Db21wbGV0aW9uKERldmljZSwgVlN0b3JQYWNrZXQsIFJlcXVlc3RFeHQpOworCQlzdG9yX3ZzY19vbl9pb19jb21wbGV0aW9uKGRldmljZSwgdnN0b3JfcGFja2V0LCByZXF1ZXN0X2V4dCk7CiAJCWJyZWFrOwotCWNhc2UgVlN0b3JPcGVyYXRpb25SZW1vdmVEZXZpY2U6CisJY2FzZSBWU1RPUl9PUEVSQVRJT05fUkVNT1ZFX0RFVklDRToKIAkJRFBSSU5UX0lORk8oU1RPUlZTQywgIlJFTU9WRV9ERVZJQ0VfT1BFUkFUSU9OIik7CiAJCS8qIFRPRE86ICovCiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKIAkJRFBSSU5UX0lORk8oU1RPUlZTQywgIlVua25vd24gb3BlcmF0aW9uIHJlY2VpdmVkIC0gJWQiLAotCQkJICAgIFZTdG9yUGFja2V0LT5PcGVyYXRpb24pOworCQkJICAgIHZzdG9yX3BhY2tldC0+b3BlcmF0aW9uKTsKIAkJYnJlYWs7CiAJfQogfQogCi1zdGF0aWMgdm9pZCBTdG9yVnNjT25DaGFubmVsQ2FsbGJhY2sodm9pZCAqY29udGV4dCkKK3N0YXRpYyB2b2lkIHN0b3JfdnNjX29uX2NoYW5uZWxfY2FsbGJhY2sodm9pZCAqY29udGV4dCkKIHsKIAlzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UgPSAoc3RydWN0IGh2X2RldmljZSAqKWNvbnRleHQ7Ci0Jc3RydWN0IHN0b3J2c2NfZGV2aWNlICpzdG9yRGV2aWNlOwotCXUzMiBieXRlc1JlY3ZkOwotCXU2NCByZXF1ZXN0SWQ7CisJc3RydWN0IHN0b3J2c2NfZGV2aWNlICpzdG9yX2RldmljZTsKKwl1MzIgYnl0ZXNfcmVjdmQ7CisJdTY0IHJlcXVlc3RfaWQ7CiAJdW5zaWduZWQgY2hhciBwYWNrZXRbQUxJR05fVVAoc2l6ZW9mKHN0cnVjdCB2c3Rvcl9wYWNrZXQpLCA4KV07CiAJc3RydWN0IHN0b3J2c2NfcmVxdWVzdF9leHRlbnNpb24gKnJlcXVlc3Q7CiAJaW50IHJldDsKIAogCS8qIEFTU0VSVChkZXZpY2UpOyAqLwogCi0Jc3RvckRldmljZSA9IE11c3RHZXRTdG9yRGV2aWNlKGRldmljZSk7Ci0JaWYgKCFzdG9yRGV2aWNlKSB7CisJc3Rvcl9kZXZpY2UgPSBtdXN0X2dldF9zdG9yX2RldmljZShkZXZpY2UpOworCWlmICghc3Rvcl9kZXZpY2UpIHsKIAkJRFBSSU5UX0VSUihTVE9SVlNDLCAidW5hYmxlIHRvIGdldCBzdG9yIGRldmljZS4uLiIKIAkJCSAgICJkZXZpY2UgYmVpbmcgZGVzdHJveWVkPyIpOwogCQlyZXR1cm47CkBAIC00NTAsMzIgKzQ1MywzMyBAQAogCWRvIHsKIAkJcmV0ID0gdm1idXNfcmVjdnBhY2tldChkZXZpY2UtPmNoYW5uZWwsIHBhY2tldCwKIAkJCQkgICAgICAgQUxJR05fVVAoc2l6ZW9mKHN0cnVjdCB2c3Rvcl9wYWNrZXQpLCA4KSwKLQkJCQkgICAgICAgJmJ5dGVzUmVjdmQsICZyZXF1ZXN0SWQpOwotCQlpZiAocmV0ID09IDAgJiYgYnl0ZXNSZWN2ZCA+IDApIHsKKwkJCQkgICAgICAgJmJ5dGVzX3JlY3ZkLCAmcmVxdWVzdF9pZCk7CisJCWlmIChyZXQgPT0gMCAmJiBieXRlc19yZWN2ZCA+IDApIHsKIAkJCURQUklOVF9EQkcoU1RPUlZTQywgInJlY2VpdmUgJWQgYnl0ZXMgLSB0aWQgJWxseCIsCi0JCQkJICAgYnl0ZXNSZWN2ZCwgcmVxdWVzdElkKTsKKwkJCQkgICBieXRlc19yZWN2ZCwgcmVxdWVzdF9pZCk7CiAKLQkJCS8qIEFTU0VSVChieXRlc1JlY3ZkID09IHNpemVvZihzdHJ1Y3QgdnN0b3JfcGFja2V0KSk7ICovCisJCQkvKiBBU1NFUlQoYnl0ZXNfcmVjdmQgPT0KKwkJCQkJc2l6ZW9mKHN0cnVjdCB2c3Rvcl9wYWNrZXQpKTsgKi8KIAogCQkJcmVxdWVzdCA9IChzdHJ1Y3Qgc3RvcnZzY19yZXF1ZXN0X2V4dGVuc2lvbiAqKQotCQkJCQkodW5zaWduZWQgbG9uZylyZXF1ZXN0SWQ7CisJCQkJCSh1bnNpZ25lZCBsb25nKXJlcXVlc3RfaWQ7CiAJCQkvKiBBU1NFUlQocmVxdWVzdCk7YyAqLwogCi0JCQkvKiBpZiAodnN0b3JQYWNrZXQuRmxhZ3MgJiBTWU5USEVUSUNfRkxBRykgKi8KLQkJCWlmICgocmVxdWVzdCA9PSAmc3RvckRldmljZS0+SW5pdFJlcXVlc3QpIHx8Ci0JCQkgICAgKHJlcXVlc3QgPT0gJnN0b3JEZXZpY2UtPlJlc2V0UmVxdWVzdCkpIHsKKwkJCS8qIGlmICh2c3Rvcl9wYWNrZXQuRmxhZ3MgJiBTWU5USEVUSUNfRkxBRykgKi8KKwkJCWlmICgocmVxdWVzdCA9PSAmc3Rvcl9kZXZpY2UtPmluaXRfcmVxdWVzdCkgfHwKKwkJCSAgICAocmVxdWVzdCA9PSAmc3Rvcl9kZXZpY2UtPnJlc2V0X3JlcXVlc3QpKSB7CiAJCQkJLyogRFBSSU5UX0lORk8oU1RPUlZTQywKIAkJCQkgKiAgICAgICAgICAgICAicmVzZXQgY29tcGxldGlvbiAtIG9wZXJhdGlvbiAiCiAJCQkJICogICAgICAgICAgICAgIiV1IHN0YXR1cyAldSIsCi0JCQkJICogICAgICAgICAgICAgdnN0b3JQYWNrZXQuT3BlcmF0aW9uLAotCQkJCSAqICAgICAgICAgICAgIHZzdG9yUGFja2V0LlN0YXR1cyk7ICovCisJCQkJICogICAgICAgICAgICAgdnN0b3JfcGFja2V0Lk9wZXJhdGlvbiwKKwkJCQkgKiAgICAgICAgICAgICB2c3Rvcl9wYWNrZXQuU3RhdHVzKTsgKi8KIAotCQkJCW1lbWNweSgmcmVxdWVzdC0+VlN0b3JQYWNrZXQsIHBhY2tldCwKKwkJCQltZW1jcHkoJnJlcXVlc3QtPnZzdG9yX3BhY2tldCwgcGFja2V0LAogCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHZzdG9yX3BhY2tldCkpOwogCi0JCQkJb3NkX1dhaXRFdmVudFNldChyZXF1ZXN0LT5XYWl0RXZlbnQpOworCQkJCW9zZF93YWl0ZXZlbnRfc2V0KHJlcXVlc3QtPndhaXRfZXZlbnQpOwogCQkJfSBlbHNlIHsKLQkJCQlTdG9yVnNjT25SZWNlaXZlKGRldmljZSwKKwkJCQlzdG9yX3ZzY19vbl9yZWNlaXZlKGRldmljZSwKIAkJCQkJCShzdHJ1Y3QgdnN0b3JfcGFja2V0ICopcGFja2V0LAogCQkJCQkJcmVxdWVzdCk7CiAJCQl9CkBAIC00ODUsNTIgKzQ4OSw1NSBAQAogCQl9CiAJfSB3aGlsZSAoMSk7CiAKLQlQdXRTdG9yRGV2aWNlKGRldmljZSk7CisJcHV0X3N0b3JfZGV2aWNlKGRldmljZSk7CiAJcmV0dXJuOwogfQogCi1zdGF0aWMgaW50IFN0b3JWc2NDb25uZWN0VG9Wc3Aoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlKQorc3RhdGljIGludCBzdG9yX3ZzY19jb25uZWN0X3RvX3ZzcChzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpCiB7CiAJc3RydWN0IHZtc3RvcmFnZV9jaGFubmVsX3Byb3BlcnRpZXMgcHJvcHM7Ci0Jc3RydWN0IHN0b3J2c2NfZHJpdmVyX29iamVjdCAqc3RvckRyaXZlcjsKKwlzdHJ1Y3Qgc3RvcnZzY19kcml2ZXJfb2JqZWN0ICpzdG9yX2RyaXZlcjsKIAlpbnQgcmV0OwogCi0Jc3RvckRyaXZlciA9IChzdHJ1Y3Qgc3RvcnZzY19kcml2ZXJfb2JqZWN0ICopRGV2aWNlLT5Ecml2ZXI7CisJc3Rvcl9kcml2ZXIgPSAoc3RydWN0IHN0b3J2c2NfZHJpdmVyX29iamVjdCAqKWRldmljZS0+RHJpdmVyOwogCW1lbXNldCgmcHJvcHMsIDAsIHNpemVvZihzdHJ1Y3Qgdm1zdG9yYWdlX2NoYW5uZWxfcHJvcGVydGllcykpOwogCiAJLyogT3BlbiB0aGUgY2hhbm5lbCAqLwotCXJldCA9IHZtYnVzX29wZW4oRGV2aWNlLT5jaGFubmVsLAotCQkJIHN0b3JEcml2ZXItPlJpbmdCdWZmZXJTaXplLCBzdG9yRHJpdmVyLT5SaW5nQnVmZmVyU2l6ZSwKKwlyZXQgPSB2bWJ1c19vcGVuKGRldmljZS0+Y2hhbm5lbCwKKwkJCSBzdG9yX2RyaXZlci0+cmluZ19idWZmZXJfc2l6ZSwKKwkJCSBzdG9yX2RyaXZlci0+cmluZ19idWZmZXJfc2l6ZSwKIAkJCSAodm9pZCAqKSZwcm9wcywKIAkJCSBzaXplb2Yoc3RydWN0IHZtc3RvcmFnZV9jaGFubmVsX3Byb3BlcnRpZXMpLAotCQkJIFN0b3JWc2NPbkNoYW5uZWxDYWxsYmFjaywgRGV2aWNlKTsKKwkJCSBzdG9yX3ZzY19vbl9jaGFubmVsX2NhbGxiYWNrLCBkZXZpY2UpOwogCiAJRFBSSU5UX0RCRyhTVE9SVlNDLCAic3RvcmFnZSBwcm9wczogcGF0aCBpZCAlZCwgdGd0IGlkICVkLCBtYXggeGZlciAlZCIsCi0JCSAgIHByb3BzLlBhdGhJZCwgcHJvcHMuVGFyZ2V0SWQsIHByb3BzLk1heFRyYW5zZmVyQnl0ZXMpOworCQkgICBwcm9wcy5wYXRoX2lkLCBwcm9wcy50YXJnZXRfaWQsIHByb3BzLm1heF90cmFuc2Zlcl9ieXRlcyk7CiAKIAlpZiAocmV0ICE9IDApIHsKIAkJRFBSSU5UX0VSUihTVE9SVlNDLCAidW5hYmxlIHRvIG9wZW4gY2hhbm5lbDogJWQiLCByZXQpOwogCQlyZXR1cm4gLTE7CiAJfQogCi0JcmV0ID0gU3RvclZzY0NoYW5uZWxJbml0KERldmljZSk7CisJcmV0ID0gc3Rvcl92c2NfY2hhbm5lbF9pbml0KGRldmljZSk7CiAKIAlyZXR1cm4gcmV0OwogfQogCiAvKgotICogU3RvclZzY09uRGV2aWNlQWRkIC0gQ2FsbGJhY2sgd2hlbiB0aGUgZGV2aWNlIGJlbG9uZ2luZyB0byB0aGlzIGRyaXZlciBpcyBhZGRlZAorICogc3Rvcl92c2Nfb25fZGV2aWNlX2FkZCAtIENhbGxiYWNrIHdoZW4gdGhlIGRldmljZSBiZWxvbmdpbmcgdG8gdGhpcyBkcml2ZXIKKyAqIGlzIGFkZGVkCiAgKi8KLXN0YXRpYyBpbnQgU3RvclZzY09uRGV2aWNlQWRkKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSwgdm9pZCAqQWRkaXRpb25hbEluZm8pCitzdGF0aWMgaW50IHN0b3JfdnNjX29uX2RldmljZV9hZGQoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlLAorCQkJCQl2b2lkICphZGRpdGlvbmFsX2luZm8pCiB7Ci0Jc3RydWN0IHN0b3J2c2NfZGV2aWNlICpzdG9yRGV2aWNlOworCXN0cnVjdCBzdG9ydnNjX2RldmljZSAqc3Rvcl9kZXZpY2U7CiAJLyogc3RydWN0IHZtc3RvcmFnZV9jaGFubmVsX3Byb3BlcnRpZXMgKnByb3BzOyAqLwotCXN0cnVjdCBzdG9ydnNjX2RldmljZV9pbmZvICpkZXZpY2VJbmZvOworCXN0cnVjdCBzdG9ydnNjX2RldmljZV9pbmZvICpkZXZpY2VfaW5mbzsKIAlpbnQgcmV0ID0gMDsKIAotCWRldmljZUluZm8gPSAoc3RydWN0IHN0b3J2c2NfZGV2aWNlX2luZm8gKilBZGRpdGlvbmFsSW5mbzsKLQlzdG9yRGV2aWNlID0gQWxsb2NTdG9yRGV2aWNlKERldmljZSk7Ci0JaWYgKCFzdG9yRGV2aWNlKSB7CisJZGV2aWNlX2luZm8gPSAoc3RydWN0IHN0b3J2c2NfZGV2aWNlX2luZm8gKilhZGRpdGlvbmFsX2luZm87CisJc3Rvcl9kZXZpY2UgPSBhbGxvY19zdG9yX2RldmljZShkZXZpY2UpOworCWlmICghc3Rvcl9kZXZpY2UpIHsKIAkJcmV0ID0gLTE7CiAJCWdvdG8gQ2xlYW51cDsKIAl9CkBAIC01NTAsMTAzICs1NTcsMTAzIEBACiAJc3RvckNoYW5uZWwtPlBhdGhJZCA9IHByb3BzLT5QYXRoSWQ7CiAJc3RvckNoYW5uZWwtPlRhcmdldElkID0gcHJvcHMtPlRhcmdldElkOyAqLwogCi0Jc3RvckRldmljZS0+UG9ydE51bWJlciA9IGRldmljZUluZm8tPlBvcnROdW1iZXI7CisJc3Rvcl9kZXZpY2UtPnBvcnRfbnVtYmVyID0gZGV2aWNlX2luZm8tPnBvcnRfbnVtYmVyOwogCS8qIFNlbmQgaXQgYmFjayB1cCAqLwotCXJldCA9IFN0b3JWc2NDb25uZWN0VG9Wc3AoRGV2aWNlKTsKKwlyZXQgPSBzdG9yX3ZzY19jb25uZWN0X3RvX3ZzcChkZXZpY2UpOwogCi0JLyogZGV2aWNlSW5mby0+UG9ydE51bWJlciA9IHN0b3JEZXZpY2UtPlBvcnROdW1iZXI7ICovCi0JZGV2aWNlSW5mby0+UGF0aElkID0gc3RvckRldmljZS0+UGF0aElkOwotCWRldmljZUluZm8tPlRhcmdldElkID0gc3RvckRldmljZS0+VGFyZ2V0SWQ7CisJLyogZGV2aWNlX2luZm8tPlBvcnROdW1iZXIgPSBzdG9yX2RldmljZS0+UG9ydE51bWJlcjsgKi8KKwlkZXZpY2VfaW5mby0+cGF0aF9pZCA9IHN0b3JfZGV2aWNlLT5wYXRoX2lkOworCWRldmljZV9pbmZvLT50YXJnZXRfaWQgPSBzdG9yX2RldmljZS0+dGFyZ2V0X2lkOwogCiAJRFBSSU5UX0RCRyhTVE9SVlNDLCAiYXNzaWduZWQgcG9ydCAldSwgcGF0aCAldSB0YXJnZXQgJXVcbiIsCi0JCSAgIHN0b3JEZXZpY2UtPlBvcnROdW1iZXIsIHN0b3JEZXZpY2UtPlBhdGhJZCwKLQkJICAgc3RvckRldmljZS0+VGFyZ2V0SWQpOworCQkgICBzdG9yX2RldmljZS0+cG9ydF9udW1iZXIsIHN0b3JfZGV2aWNlLT5wYXRoX2lkLAorCQkgICBzdG9yX2RldmljZS0+dGFyZ2V0X2lkKTsKIAogQ2xlYW51cDoKIAlyZXR1cm4gcmV0OwogfQogCiAvKgotICogU3RvclZzY09uRGV2aWNlUmVtb3ZlIC0gQ2FsbGJhY2sgd2hlbiB0aGUgb3VyIGRldmljZSBpcyBiZWluZyByZW1vdmVkCisgKiBzdG9yX3ZzY19vbl9kZXZpY2VfcmVtb3ZlIC0gQ2FsbGJhY2sgd2hlbiB0aGUgb3VyIGRldmljZSBpcyBiZWluZyByZW1vdmVkCiAgKi8KLXN0YXRpYyBpbnQgU3RvclZzY09uRGV2aWNlUmVtb3ZlKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSkKK3N0YXRpYyBpbnQgc3Rvcl92c2Nfb25fZGV2aWNlX3JlbW92ZShzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IHN0b3J2c2NfZGV2aWNlICpzdG9yRGV2aWNlOworCXN0cnVjdCBzdG9ydnNjX2RldmljZSAqc3Rvcl9kZXZpY2U7CiAKIAlEUFJJTlRfSU5GTyhTVE9SVlNDLCAiZGlzYWJsaW5nIHN0b3JhZ2UgZGV2aWNlICglcCkuLi4iLAotCQkgICAgRGV2aWNlLT5FeHRlbnNpb24pOworCQkgICAgZGV2aWNlLT5FeHRlbnNpb24pOwogCi0Jc3RvckRldmljZSA9IFJlbGVhc2VTdG9yRGV2aWNlKERldmljZSk7CisJc3Rvcl9kZXZpY2UgPSByZWxlYXNlX3N0b3JfZGV2aWNlKGRldmljZSk7CiAKIAkvKgogCSAqIEF0IHRoaXMgcG9pbnQsIGFsbCBvdXRib3VuZCB0cmFmZmljIHNob3VsZCBiZSBkaXNhYmxlLiBXZQogCSAqIG9ubHkgYWxsb3cgaW5ib3VuZCB0cmFmZmljIChyZXNwb25zZXMpIHRvIHByb2NlZWQgc28gdGhhdAogCSAqIG91dHN0YW5kaW5nIHJlcXVlc3RzIGNhbiBiZSBjb21wbGV0ZWQuCiAJICovCi0Jd2hpbGUgKGF0b21pY19yZWFkKCZzdG9yRGV2aWNlLT5OdW1PdXRzdGFuZGluZ1JlcXVlc3RzKSkgeworCXdoaWxlIChhdG9taWNfcmVhZCgmc3Rvcl9kZXZpY2UtPm51bV9vdXRzdGFuZGluZ19yZXEpKSB7CiAJCURQUklOVF9JTkZPKFNUT1JWU0MsICJ3YWl0aW5nIGZvciAlZCByZXF1ZXN0cyB0byBjb21wbGV0ZS4uLiIsCi0JCQkgICAgYXRvbWljX3JlYWQoJnN0b3JEZXZpY2UtPk51bU91dHN0YW5kaW5nUmVxdWVzdHMpKTsKKwkJCSAgICBhdG9taWNfcmVhZCgmc3Rvcl9kZXZpY2UtPm51bV9vdXRzdGFuZGluZ19yZXEpKTsKIAkJdWRlbGF5KDEwMCk7CiAJfQogCiAJRFBSSU5UX0lORk8oU1RPUlZTQywgInJlbW92aW5nIHN0b3JhZ2UgZGV2aWNlICglcCkuLi4iLAotCQkgICAgRGV2aWNlLT5FeHRlbnNpb24pOworCQkgICAgZGV2aWNlLT5FeHRlbnNpb24pOwogCi0Jc3RvckRldmljZSA9IEZpbmFsUmVsZWFzZVN0b3JEZXZpY2UoRGV2aWNlKTsKKwlzdG9yX2RldmljZSA9IGZpbmFsX3JlbGVhc2Vfc3Rvcl9kZXZpY2UoZGV2aWNlKTsKIAotCURQUklOVF9JTkZPKFNUT1JWU0MsICJzdG9yYWdlIGRldmljZSAoJXApIHNhZmUgdG8gcmVtb3ZlIiwgc3RvckRldmljZSk7CisJRFBSSU5UX0lORk8oU1RPUlZTQywgInN0b3JhZ2UgZGV2aWNlICglcCkgc2FmZSB0byByZW1vdmUiLCBzdG9yX2RldmljZSk7CiAKIAkvKiBDbG9zZSB0aGUgY2hhbm5lbCAqLwotCXZtYnVzX2Nsb3NlKERldmljZS0+Y2hhbm5lbCk7CisJdm1idXNfY2xvc2UoZGV2aWNlLT5jaGFubmVsKTsKIAotCUZyZWVTdG9yRGV2aWNlKHN0b3JEZXZpY2UpOworCWZyZWVfc3Rvcl9kZXZpY2Uoc3Rvcl9kZXZpY2UpOwogCXJldHVybiAwOwogfQogCi1pbnQgU3RvclZzY09uSG9zdFJlc2V0KHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSkKK2ludCBzdG9yX3ZzY19vbl9ob3N0X3Jlc2V0KHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKnN0b3JEZXZpY2U7CisJc3RydWN0IHN0b3J2c2NfZGV2aWNlICpzdG9yX2RldmljZTsKIAlzdHJ1Y3Qgc3RvcnZzY19yZXF1ZXN0X2V4dGVuc2lvbiAqcmVxdWVzdDsKLQlzdHJ1Y3QgdnN0b3JfcGFja2V0ICp2c3RvclBhY2tldDsKKwlzdHJ1Y3QgdnN0b3JfcGFja2V0ICp2c3Rvcl9wYWNrZXQ7CiAJaW50IHJldDsKIAogCURQUklOVF9JTkZPKFNUT1JWU0MsICJyZXNldHRpbmcgaG9zdCBhZGFwdGVyLi4uIik7CiAKLQlzdG9yRGV2aWNlID0gR2V0U3RvckRldmljZShEZXZpY2UpOwotCWlmICghc3RvckRldmljZSkgeworCXN0b3JfZGV2aWNlID0gZ2V0X3N0b3JfZGV2aWNlKGRldmljZSk7CisJaWYgKCFzdG9yX2RldmljZSkgewogCQlEUFJJTlRfRVJSKFNUT1JWU0MsICJ1bmFibGUgdG8gZ2V0IHN0b3IgZGV2aWNlLi4uIgogCQkJICAgImRldmljZSBiZWluZyBkZXN0cm95ZWQ/Iik7CiAJCXJldHVybiAtMTsKIAl9CiAKLQlyZXF1ZXN0ID0gJnN0b3JEZXZpY2UtPlJlc2V0UmVxdWVzdDsKLQl2c3RvclBhY2tldCA9ICZyZXF1ZXN0LT5WU3RvclBhY2tldDsKKwlyZXF1ZXN0ID0gJnN0b3JfZGV2aWNlLT5yZXNldF9yZXF1ZXN0OworCXZzdG9yX3BhY2tldCA9ICZyZXF1ZXN0LT52c3Rvcl9wYWNrZXQ7CiAKLQlyZXF1ZXN0LT5XYWl0RXZlbnQgPSBvc2RfV2FpdEV2ZW50Q3JlYXRlKCk7Ci0JaWYgKCFyZXF1ZXN0LT5XYWl0RXZlbnQpIHsKKwlyZXF1ZXN0LT53YWl0X2V2ZW50ID0gb3NkX3dhaXRldmVudF9jcmVhdGUoKTsKKwlpZiAoIXJlcXVlc3QtPndhaXRfZXZlbnQpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBDbGVhbnVwOwogCX0KIAotCXZzdG9yUGFja2V0LT5PcGVyYXRpb24gPSBWU3Rvck9wZXJhdGlvblJlc2V0QnVzOwotCXZzdG9yUGFja2V0LT5GbGFncyA9IFJFUVVFU1RfQ09NUExFVElPTl9GTEFHOwotCXZzdG9yUGFja2V0LT5WbVNyYi5QYXRoSWQgPSBzdG9yRGV2aWNlLT5QYXRoSWQ7CisJdnN0b3JfcGFja2V0LT5vcGVyYXRpb24gPSBWU1RPUl9PUEVSQVRJT05fUkVTRVRfQlVTOworCXZzdG9yX3BhY2tldC0+ZmxhZ3MgPSBSRVFVRVNUX0NPTVBMRVRJT05fRkxBRzsKKwl2c3Rvcl9wYWNrZXQtPnZtX3NyYi5wYXRoX2lkID0gc3Rvcl9kZXZpY2UtPnBhdGhfaWQ7CiAKLQlyZXQgPSB2bWJ1c19zZW5kcGFja2V0KERldmljZS0+Y2hhbm5lbCwgdnN0b3JQYWNrZXQsCisJcmV0ID0gdm1idXNfc2VuZHBhY2tldChkZXZpY2UtPmNoYW5uZWwsIHZzdG9yX3BhY2tldCwKIAkJCSAgICAgICBzaXplb2Yoc3RydWN0IHZzdG9yX3BhY2tldCksCi0JCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpJnN0b3JEZXZpY2UtPlJlc2V0UmVxdWVzdCwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZykmc3Rvcl9kZXZpY2UtPnJlc2V0X3JlcXVlc3QsCiAJCQkgICAgICAgVm1idXNQYWNrZXRUeXBlRGF0YUluQmFuZCwKIAkJCSAgICAgICBWTUJVU19EQVRBX1BBQ0tFVF9GTEFHX0NPTVBMRVRJT05fUkVRVUVTVEVEKTsKIAlpZiAocmV0ICE9IDApIHsKIAkJRFBSSU5UX0VSUihTVE9SVlNDLCAiVW5hYmxlIHRvIHNlbmQgcmVzZXQgcGFja2V0ICVwIHJldCAlZCIsCi0JCQkgICB2c3RvclBhY2tldCwgcmV0KTsKKwkJCSAgIHZzdG9yX3BhY2tldCwgcmV0KTsKIAkJZ290byBDbGVhbnVwOwogCX0KIAogCS8qIEZJWE1FOiBBZGQgYSB0aW1lb3V0ICovCi0Jb3NkX1dhaXRFdmVudFdhaXQocmVxdWVzdC0+V2FpdEV2ZW50KTsKKwlvc2Rfd2FpdGV2ZW50X3dhaXQocmVxdWVzdC0+d2FpdF9ldmVudCk7CiAKLQlrZnJlZShyZXF1ZXN0LT5XYWl0RXZlbnQpOworCWtmcmVlKHJlcXVlc3QtPndhaXRfZXZlbnQpOwogCURQUklOVF9JTkZPKFNUT1JWU0MsICJob3N0IGFkYXB0ZXIgcmVzZXQgY29tcGxldGVkIik7CiAKIAkvKgpAQCAtNjU1LDExOCArNjYyLDExOCBAQAogCSAqLwogCiBDbGVhbnVwOgotCVB1dFN0b3JEZXZpY2UoRGV2aWNlKTsKKwlwdXRfc3Rvcl9kZXZpY2UoZGV2aWNlKTsKIAlyZXR1cm4gcmV0OwogfQogCiAvKgotICogU3RvclZzY09uSU9SZXF1ZXN0IC0gQ2FsbGJhY2sgdG8gaW5pdGlhdGUgYW4gSS9PIHJlcXVlc3QKKyAqIHN0b3JfdnNjX29uX2lvX3JlcXVlc3QgLSBDYWxsYmFjayB0byBpbml0aWF0ZSBhbiBJL08gcmVxdWVzdAogICovCi1zdGF0aWMgaW50IFN0b3JWc2NPbklPUmVxdWVzdChzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UsCi0JCQkgICAgICBzdHJ1Y3QgaHZfc3RvcnZzY19yZXF1ZXN0ICpSZXF1ZXN0KQorc3RhdGljIGludCBzdG9yX3ZzY19vbl9pb19yZXF1ZXN0KHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSwKKwkJCSAgICAgIHN0cnVjdCBodl9zdG9ydnNjX3JlcXVlc3QgKnJlcXVlc3QpCiB7Ci0Jc3RydWN0IHN0b3J2c2NfZGV2aWNlICpzdG9yRGV2aWNlOwotCXN0cnVjdCBzdG9ydnNjX3JlcXVlc3RfZXh0ZW5zaW9uICpyZXF1ZXN0RXh0ZW5zaW9uOwotCXN0cnVjdCB2c3Rvcl9wYWNrZXQgKnZzdG9yUGFja2V0OworCXN0cnVjdCBzdG9ydnNjX2RldmljZSAqc3Rvcl9kZXZpY2U7CisJc3RydWN0IHN0b3J2c2NfcmVxdWVzdF9leHRlbnNpb24gKnJlcXVlc3RfZXh0ZW5zaW9uOworCXN0cnVjdCB2c3Rvcl9wYWNrZXQgKnZzdG9yX3BhY2tldDsKIAlpbnQgcmV0ID0gMDsKIAotCXJlcXVlc3RFeHRlbnNpb24gPQotCQkoc3RydWN0IHN0b3J2c2NfcmVxdWVzdF9leHRlbnNpb24gKilSZXF1ZXN0LT5FeHRlbnNpb247Ci0JdnN0b3JQYWNrZXQgPSAmcmVxdWVzdEV4dGVuc2lvbi0+VlN0b3JQYWNrZXQ7Ci0Jc3RvckRldmljZSA9IEdldFN0b3JEZXZpY2UoRGV2aWNlKTsKKwlyZXF1ZXN0X2V4dGVuc2lvbiA9CisJCShzdHJ1Y3Qgc3RvcnZzY19yZXF1ZXN0X2V4dGVuc2lvbiAqKXJlcXVlc3QtPmV4dGVuc2lvbjsKKwl2c3Rvcl9wYWNrZXQgPSAmcmVxdWVzdF9leHRlbnNpb24tPnZzdG9yX3BhY2tldDsKKwlzdG9yX2RldmljZSA9IGdldF9zdG9yX2RldmljZShkZXZpY2UpOwogCiAJRFBSSU5UX0RCRyhTVE9SVlNDLCAiZW50ZXIgLSBEZXZpY2UgJXAsIERldmljZUV4dCAlcCwgUmVxdWVzdCAlcCwgIgotCQkgICAiRXh0ZW5zaW9uICVwIiwgRGV2aWNlLCBzdG9yRGV2aWNlLCBSZXF1ZXN0LAotCQkgICByZXF1ZXN0RXh0ZW5zaW9uKTsKKwkJICAgIkV4dGVuc2lvbiAlcCIsIGRldmljZSwgc3Rvcl9kZXZpY2UsIHJlcXVlc3QsCisJCSAgIHJlcXVlc3RfZXh0ZW5zaW9uKTsKIAogCURQUklOVF9EQkcoU1RPUlZTQywgInJlcSAlcCBsZW4gJWQgYnVzICVkLCB0YXJnZXQgJWQsIGx1biAlZCBjZGJsZW4gJWQiLAotCQkgICBSZXF1ZXN0LCBSZXF1ZXN0LT5EYXRhQnVmZmVyLkxlbmd0aCwgUmVxdWVzdC0+QnVzLAotCQkgICBSZXF1ZXN0LT5UYXJnZXRJZCwgUmVxdWVzdC0+THVuSWQsIFJlcXVlc3QtPkNkYkxlbik7CisJCSAgIHJlcXVlc3QsIHJlcXVlc3QtPmRhdGFfYnVmZmVyLkxlbmd0aCwgcmVxdWVzdC0+YnVzLAorCQkgICByZXF1ZXN0LT50YXJnZXRfaWQsIHJlcXVlc3QtPmx1bl9pZCwgcmVxdWVzdC0+Y2RiX2xlbik7CiAKLQlpZiAoIXN0b3JEZXZpY2UpIHsKKwlpZiAoIXN0b3JfZGV2aWNlKSB7CiAJCURQUklOVF9FUlIoU1RPUlZTQywgInVuYWJsZSB0byBnZXQgc3RvciBkZXZpY2UuLi4iCiAJCQkgICAiZGV2aWNlIGJlaW5nIGRlc3Ryb3llZD8iKTsKIAkJcmV0dXJuIC0yOwogCX0KIAotCS8qIHByaW50X2hleF9kdW1wX2J5dGVzKCIiLCBEVU1QX1BSRUZJWF9OT05FLCBSZXF1ZXN0LT5DZGIsCi0JICoJCQlSZXF1ZXN0LT5DZGJMZW4pOyAqLworCS8qIHByaW50X2hleF9kdW1wX2J5dGVzKCIiLCBEVU1QX1BSRUZJWF9OT05FLCByZXF1ZXN0LT5DZGIsCisJICoJCQlyZXF1ZXN0LT5DZGJMZW4pOyAqLwogCi0JcmVxdWVzdEV4dGVuc2lvbi0+UmVxdWVzdCA9IFJlcXVlc3Q7Ci0JcmVxdWVzdEV4dGVuc2lvbi0+RGV2aWNlICA9IERldmljZTsKKwlyZXF1ZXN0X2V4dGVuc2lvbi0+cmVxdWVzdCA9IHJlcXVlc3Q7CisJcmVxdWVzdF9leHRlbnNpb24tPmRldmljZSAgPSBkZXZpY2U7CiAKLQltZW1zZXQodnN0b3JQYWNrZXQsIDAgLCBzaXplb2Yoc3RydWN0IHZzdG9yX3BhY2tldCkpOworCW1lbXNldCh2c3Rvcl9wYWNrZXQsIDAgLCBzaXplb2Yoc3RydWN0IHZzdG9yX3BhY2tldCkpOwogCi0JdnN0b3JQYWNrZXQtPkZsYWdzIHw9IFJFUVVFU1RfQ09NUExFVElPTl9GTEFHOworCXZzdG9yX3BhY2tldC0+ZmxhZ3MgfD0gUkVRVUVTVF9DT01QTEVUSU9OX0ZMQUc7CiAKLQl2c3RvclBhY2tldC0+Vm1TcmIuTGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCB2bXNjc2lfcmVxdWVzdCk7CisJdnN0b3JfcGFja2V0LT52bV9zcmIubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCB2bXNjc2lfcmVxdWVzdCk7CiAKLQl2c3RvclBhY2tldC0+Vm1TcmIuUG9ydE51bWJlciA9IFJlcXVlc3QtPkhvc3Q7Ci0JdnN0b3JQYWNrZXQtPlZtU3JiLlBhdGhJZCA9IFJlcXVlc3QtPkJ1czsKLQl2c3RvclBhY2tldC0+Vm1TcmIuVGFyZ2V0SWQgPSBSZXF1ZXN0LT5UYXJnZXRJZDsKLQl2c3RvclBhY2tldC0+Vm1TcmIuTHVuID0gUmVxdWVzdC0+THVuSWQ7CisJdnN0b3JfcGFja2V0LT52bV9zcmIucG9ydF9udW1iZXIgPSByZXF1ZXN0LT5ob3N0OworCXZzdG9yX3BhY2tldC0+dm1fc3JiLnBhdGhfaWQgPSByZXF1ZXN0LT5idXM7CisJdnN0b3JfcGFja2V0LT52bV9zcmIudGFyZ2V0X2lkID0gcmVxdWVzdC0+dGFyZ2V0X2lkOworCXZzdG9yX3BhY2tldC0+dm1fc3JiLmx1biA9IHJlcXVlc3QtPmx1bl9pZDsKIAotCXZzdG9yUGFja2V0LT5WbVNyYi5TZW5zZUluZm9MZW5ndGggPSBTRU5TRV9CVUZGRVJfU0laRTsKKwl2c3Rvcl9wYWNrZXQtPnZtX3NyYi5zZW5zZV9pbmZvX2xlbmd0aCA9IFNFTlNFX0JVRkZFUl9TSVpFOwogCiAJLyogQ29weSBvdmVyIHRoZSBzY3NpIGNvbW1hbmQgZGVzY3JpcHRvciBibG9jayAqLwotCXZzdG9yUGFja2V0LT5WbVNyYi5DZGJMZW5ndGggPSBSZXF1ZXN0LT5DZGJMZW47Ci0JbWVtY3B5KCZ2c3RvclBhY2tldC0+Vm1TcmIuQ2RiLCBSZXF1ZXN0LT5DZGIsIFJlcXVlc3QtPkNkYkxlbik7CisJdnN0b3JfcGFja2V0LT52bV9zcmIuY2RiX2xlbmd0aCA9IHJlcXVlc3QtPmNkYl9sZW47CisJbWVtY3B5KCZ2c3Rvcl9wYWNrZXQtPnZtX3NyYi5jZGIsIHJlcXVlc3QtPmNkYiwgcmVxdWVzdC0+Y2RiX2xlbik7CiAKLQl2c3RvclBhY2tldC0+Vm1TcmIuRGF0YUluID0gUmVxdWVzdC0+VHlwZTsKLQl2c3RvclBhY2tldC0+Vm1TcmIuRGF0YVRyYW5zZmVyTGVuZ3RoID0gUmVxdWVzdC0+RGF0YUJ1ZmZlci5MZW5ndGg7CisJdnN0b3JfcGFja2V0LT52bV9zcmIuZGF0YV9pbiA9IHJlcXVlc3QtPnR5cGU7CisJdnN0b3JfcGFja2V0LT52bV9zcmIuZGF0YV90cmFuc2Zlcl9sZW5ndGggPSByZXF1ZXN0LT5kYXRhX2J1ZmZlci5MZW5ndGg7CiAKLQl2c3RvclBhY2tldC0+T3BlcmF0aW9uID0gVlN0b3JPcGVyYXRpb25FeGVjdXRlU1JCOworCXZzdG9yX3BhY2tldC0+b3BlcmF0aW9uID0gVlNUT1JfT1BFUkFUSU9OX0VYRUNVVEVfU1JCOwogCiAJRFBSSU5UX0RCRyhTVE9SVlNDLCAic3JiIC0gbGVuICVkIHBvcnQgJWQsIHBhdGggJWQsIHRhcmdldCAlZCwgIgogCQkgICAibHVuICVkIHNlbnNlbGVuICVkIGNkYmxlbiAlZCIsCi0JCSAgIHZzdG9yUGFja2V0LT5WbVNyYi5MZW5ndGgsCi0JCSAgIHZzdG9yUGFja2V0LT5WbVNyYi5Qb3J0TnVtYmVyLAotCQkgICB2c3RvclBhY2tldC0+Vm1TcmIuUGF0aElkLAotCQkgICB2c3RvclBhY2tldC0+Vm1TcmIuVGFyZ2V0SWQsCi0JCSAgIHZzdG9yUGFja2V0LT5WbVNyYi5MdW4sCi0JCSAgIHZzdG9yUGFja2V0LT5WbVNyYi5TZW5zZUluZm9MZW5ndGgsCi0JCSAgIHZzdG9yUGFja2V0LT5WbVNyYi5DZGJMZW5ndGgpOworCQkgICB2c3Rvcl9wYWNrZXQtPnZtX3NyYi5sZW5ndGgsCisJCSAgIHZzdG9yX3BhY2tldC0+dm1fc3JiLnBvcnRfbnVtYmVyLAorCQkgICB2c3Rvcl9wYWNrZXQtPnZtX3NyYi5wYXRoX2lkLAorCQkgICB2c3Rvcl9wYWNrZXQtPnZtX3NyYi50YXJnZXRfaWQsCisJCSAgIHZzdG9yX3BhY2tldC0+dm1fc3JiLmx1biwKKwkJICAgdnN0b3JfcGFja2V0LT52bV9zcmIuc2Vuc2VfaW5mb19sZW5ndGgsCisJCSAgIHZzdG9yX3BhY2tldC0+dm1fc3JiLmNkYl9sZW5ndGgpOwogCi0JaWYgKHJlcXVlc3RFeHRlbnNpb24tPlJlcXVlc3QtPkRhdGFCdWZmZXIuTGVuZ3RoKSB7Ci0JCXJldCA9IHZtYnVzX3NlbmRwYWNrZXRfbXVsdGlwYWdlYnVmZmVyKERldmljZS0+Y2hhbm5lbCwKLQkJCQkmcmVxdWVzdEV4dGVuc2lvbi0+UmVxdWVzdC0+RGF0YUJ1ZmZlciwKLQkJCQl2c3RvclBhY2tldCwKKwlpZiAocmVxdWVzdF9leHRlbnNpb24tPnJlcXVlc3QtPmRhdGFfYnVmZmVyLkxlbmd0aCkgeworCQlyZXQgPSB2bWJ1c19zZW5kcGFja2V0X211bHRpcGFnZWJ1ZmZlcihkZXZpY2UtPmNoYW5uZWwsCisJCQkJJnJlcXVlc3RfZXh0ZW5zaW9uLT5yZXF1ZXN0LT5kYXRhX2J1ZmZlciwKKwkJCQl2c3Rvcl9wYWNrZXQsCiAJCQkJc2l6ZW9mKHN0cnVjdCB2c3Rvcl9wYWNrZXQpLAotCQkJCSh1bnNpZ25lZCBsb25nKXJlcXVlc3RFeHRlbnNpb24pOworCQkJCSh1bnNpZ25lZCBsb25nKXJlcXVlc3RfZXh0ZW5zaW9uKTsKIAl9IGVsc2UgewotCQlyZXQgPSB2bWJ1c19zZW5kcGFja2V0KERldmljZS0+Y2hhbm5lbCwgdnN0b3JQYWNrZXQsCisJCXJldCA9IHZtYnVzX3NlbmRwYWNrZXQoZGV2aWNlLT5jaGFubmVsLCB2c3Rvcl9wYWNrZXQsCiAJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgdnN0b3JfcGFja2V0KSwKLQkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcmVxdWVzdEV4dGVuc2lvbiwKKwkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcmVxdWVzdF9leHRlbnNpb24sCiAJCQkJICAgICAgIFZtYnVzUGFja2V0VHlwZURhdGFJbkJhbmQsCiAJCQkJICAgICAgIFZNQlVTX0RBVEFfUEFDS0VUX0ZMQUdfQ09NUExFVElPTl9SRVFVRVNURUQpOwogCX0KIAogCWlmIChyZXQgIT0gMCkgewogCQlEUFJJTlRfREJHKFNUT1JWU0MsICJVbmFibGUgdG8gc2VuZCBwYWNrZXQgJXAgcmV0ICVkIiwKLQkJCSAgIHZzdG9yUGFja2V0LCByZXQpOworCQkJICAgdnN0b3JfcGFja2V0LCByZXQpOwogCX0KIAotCWF0b21pY19pbmMoJnN0b3JEZXZpY2UtPk51bU91dHN0YW5kaW5nUmVxdWVzdHMpOworCWF0b21pY19pbmMoJnN0b3JfZGV2aWNlLT5udW1fb3V0c3RhbmRpbmdfcmVxKTsKIAotCVB1dFN0b3JEZXZpY2UoRGV2aWNlKTsKKwlwdXRfc3Rvcl9kZXZpY2UoZGV2aWNlKTsKIAlyZXR1cm4gcmV0OwogfQogCiAvKgotICogU3RvclZzY09uQ2xlYW51cCAtIFBlcmZvcm0gYW55IGNsZWFudXAgd2hlbiB0aGUgZHJpdmVyIGlzIHJlbW92ZWQKKyAqIHN0b3JfdnNjX29uX2NsZWFudXAgLSBQZXJmb3JtIGFueSBjbGVhbnVwIHdoZW4gdGhlIGRyaXZlciBpcyByZW1vdmVkCiAgKi8KLXN0YXRpYyB2b2lkIFN0b3JWc2NPbkNsZWFudXAoc3RydWN0IGh2X2RyaXZlciAqRHJpdmVyKQorc3RhdGljIHZvaWQgc3Rvcl92c2Nfb25fY2xlYW51cChzdHJ1Y3QgaHZfZHJpdmVyICpkcml2ZXIpCiB7CiB9CiAKIC8qCi0gKiBTdG9yVnNjSW5pdGlhbGl6ZSAtIE1haW4gZW50cnkgcG9pbnQKKyAqIHN0b3JfdnNjX2luaXRpYWxpemUgLSBNYWluIGVudHJ5IHBvaW50CiAgKi8KLWludCBTdG9yVnNjSW5pdGlhbGl6ZShzdHJ1Y3QgaHZfZHJpdmVyICpEcml2ZXIpCitpbnQgc3Rvcl92c2NfaW5pdGlhbGl6ZShzdHJ1Y3QgaHZfZHJpdmVyICpkcml2ZXIpCiB7Ci0Jc3RydWN0IHN0b3J2c2NfZHJpdmVyX29iamVjdCAqc3RvckRyaXZlcjsKKwlzdHJ1Y3Qgc3RvcnZzY19kcml2ZXJfb2JqZWN0ICpzdG9yX2RyaXZlcjsKIAotCXN0b3JEcml2ZXIgPSAoc3RydWN0IHN0b3J2c2NfZHJpdmVyX29iamVjdCAqKURyaXZlcjsKKwlzdG9yX2RyaXZlciA9IChzdHJ1Y3Qgc3RvcnZzY19kcml2ZXJfb2JqZWN0ICopZHJpdmVyOwogCiAJRFBSSU5UX0RCRyhTVE9SVlNDLCAic2l6ZW9mKFNUT1JWU0NfUkVRVUVTVCk9JXpkICIKIAkJICAgInNpemVvZihzdHJ1Y3Qgc3RvcnZzY19yZXF1ZXN0X2V4dGVuc2lvbik9JXpkICIKQEAgLTc3OCwxMyArNzg1LDE0IEBACiAJCSAgIHNpemVvZihzdHJ1Y3Qgdm1zY3NpX3JlcXVlc3QpKTsKIAogCS8qIE1ha2Ugc3VyZSB3ZSBhcmUgYXQgbGVhc3QgMiBwYWdlcyBzaW5jZSAxIHBhZ2UgaXMgdXNlZCBmb3IgY29udHJvbCAqLwotCS8qIEFTU0VSVChzdG9yRHJpdmVyLT5SaW5nQnVmZmVyU2l6ZSA+PSAoUEFHRV9TSVpFIDw8IDEpKTsgKi8KKwkvKiBBU1NFUlQoc3Rvcl9kcml2ZXItPlJpbmdCdWZmZXJTaXplID49IChQQUdFX1NJWkUgPDwgMSkpOyAqLwogCi0JRHJpdmVyLT5uYW1lID0gZ0RyaXZlck5hbWU7Ci0JbWVtY3B5KCZEcml2ZXItPmRldmljZVR5cGUsICZnU3RvclZzY0RldmljZVR5cGUsCisJZHJpdmVyLT5uYW1lID0gZ19kcml2ZXJfbmFtZTsKKwltZW1jcHkoJmRyaXZlci0+ZGV2aWNlVHlwZSwgJmdTdG9yVnNjRGV2aWNlVHlwZSwKIAkgICAgICAgc2l6ZW9mKHN0cnVjdCBodl9ndWlkKSk7CiAKLQlzdG9yRHJpdmVyLT5SZXF1ZXN0RXh0U2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc3RvcnZzY19yZXF1ZXN0X2V4dGVuc2lvbik7CisJc3Rvcl9kcml2ZXItPnJlcXVlc3RfZXh0X3NpemUgPQorCQkJc2l6ZW9mKHN0cnVjdCBzdG9ydnNjX3JlcXVlc3RfZXh0ZW5zaW9uKTsKIAogCS8qCiAJICogRGl2aWRlIHRoZSByaW5nIGJ1ZmZlciBkYXRhIHNpemUgKHdoaWNoIGlzIDEgcGFnZSBsZXNzCkBAIC03OTIsMjIgKzgwMCwyMiBAQAogCSAqIHRoZSByaW5nIGJ1ZmZlciBpbmRpY2VzKSBieSB0aGUgbWF4IHJlcXVlc3Qgc2l6ZSAod2hpY2ggaXMKIAkgKiB2bWJ1c19jaGFubmVsX3BhY2tldF9tdWx0aXBhZ2VfYnVmZmVyICsgc3RydWN0IHZzdG9yX3BhY2tldCArIHU2NCkKIAkgKi8KLQlzdG9yRHJpdmVyLT5NYXhPdXRzdGFuZGluZ1JlcXVlc3RzUGVyQ2hhbm5lbCA9Ci0JCSgoc3RvckRyaXZlci0+UmluZ0J1ZmZlclNpemUgLSBQQUdFX1NJWkUpIC8KKwlzdG9yX2RyaXZlci0+bWF4X291dHN0YW5kaW5nX3JlcV9wZXJfY2hhbm5lbCA9CisJCSgoc3Rvcl9kcml2ZXItPnJpbmdfYnVmZmVyX3NpemUgLSBQQUdFX1NJWkUpIC8KIAkJICBBTElHTl9VUChNQVhfTVVMVElQQUdFX0JVRkZFUl9QQUNLRVQgKwogCQkJICAgc2l6ZW9mKHN0cnVjdCB2c3Rvcl9wYWNrZXQpICsgc2l6ZW9mKHU2NCksCiAJCQkgICBzaXplb2YodTY0KSkpOwogCiAJRFBSSU5UX0lORk8oU1RPUlZTQywgIm1heCBpbyAldSwgY3VycmVudGx5ICV1XG4iLAotCQkgICAgc3RvckRyaXZlci0+TWF4T3V0c3RhbmRpbmdSZXF1ZXN0c1BlckNoYW5uZWwsCisJCSAgICBzdG9yX2RyaXZlci0+bWF4X291dHN0YW5kaW5nX3JlcV9wZXJfY2hhbm5lbCwKIAkJICAgIFNUT1JWU0NfTUFYX0lPX1JFUVVFU1RTKTsKIAogCS8qIFNldHVwIHRoZSBkaXNwYXRjaCB0YWJsZSAqLwotCXN0b3JEcml2ZXItPkJhc2UuT25EZXZpY2VBZGQJPSBTdG9yVnNjT25EZXZpY2VBZGQ7Ci0Jc3RvckRyaXZlci0+QmFzZS5PbkRldmljZVJlbW92ZQk9IFN0b3JWc2NPbkRldmljZVJlbW92ZTsKLQlzdG9yRHJpdmVyLT5CYXNlLk9uQ2xlYW51cAk9IFN0b3JWc2NPbkNsZWFudXA7CisJc3Rvcl9kcml2ZXItPmJhc2UuT25EZXZpY2VBZGQJPSBzdG9yX3ZzY19vbl9kZXZpY2VfYWRkOworCXN0b3JfZHJpdmVyLT5iYXNlLk9uRGV2aWNlUmVtb3ZlCT0gc3Rvcl92c2Nfb25fZGV2aWNlX3JlbW92ZTsKKwlzdG9yX2RyaXZlci0+YmFzZS5PbkNsZWFudXAJPSBzdG9yX3ZzY19vbl9jbGVhbnVwOwogCi0Jc3RvckRyaXZlci0+T25JT1JlcXVlc3QJCT0gU3RvclZzY09uSU9SZXF1ZXN0OworCXN0b3JfZHJpdmVyLT5vbl9pb19yZXF1ZXN0CT0gc3Rvcl92c2Nfb25faW9fcmVxdWVzdDsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L3N0b3J2c2NfYXBpLmggYi9kcml2ZXJzL3N0YWdpbmcvaHYvc3RvcnZzY19hcGkuaAppbmRleCA4NTA1YTFjLi5mYmY1NzU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvc3RvcnZzY19hcGkuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaHYvc3RvcnZzY19hcGkuaApAQCAtNTMsNTggKzUzLDU4IEBACiB9OwogCiBzdHJ1Y3QgaHZfc3RvcnZzY19yZXF1ZXN0IHsKLQllbnVtIHN0b3J2c2NfcmVxdWVzdF90eXBlIFR5cGU7Ci0JdTMyIEhvc3Q7Ci0JdTMyIEJ1czsKLQl1MzIgVGFyZ2V0SWQ7Ci0JdTMyIEx1bklkOwotCXU4ICpDZGI7Ci0JdTMyIENkYkxlbjsKLQl1MzIgU3RhdHVzOwotCXUzMiBCeXRlc1hmZXI7CisJZW51bSBzdG9ydnNjX3JlcXVlc3RfdHlwZSB0eXBlOworCXUzMiBob3N0OworCXUzMiBidXM7CisJdTMyIHRhcmdldF9pZDsKKwl1MzIgbHVuX2lkOworCXU4ICpjZGI7CisJdTMyIGNkYl9sZW47CisJdTMyIHN0YXR1czsKKwl1MzIgYnl0ZXNfeGZlcjsKIAotCXVuc2lnbmVkIGNoYXIgKlNlbnNlQnVmZmVyOwotCXUzMiBTZW5zZUJ1ZmZlclNpemU7CisJdW5zaWduZWQgY2hhciAqc2Vuc2VfYnVmZmVyOworCXUzMiBzZW5zZV9idWZmZXJfc2l6ZTsKIAotCXZvaWQgKkNvbnRleHQ7CisJdm9pZCAqY29udGV4dDsKIAotCXZvaWQgKCpPbklPQ29tcGxldGlvbikoc3RydWN0IGh2X3N0b3J2c2NfcmVxdWVzdCAqUmVxdWVzdCk7CisJdm9pZCAoKm9uX2lvX2NvbXBsZXRpb24pKHN0cnVjdCBodl9zdG9ydnNjX3JlcXVlc3QgKnJlcXVlc3QpOwogCiAJLyogVGhpcyBwb2ludHMgdG8gdGhlIG1lbW9yeSBhZnRlciBEYXRhQnVmZmVyICovCi0Jdm9pZCAqRXh0ZW5zaW9uOworCXZvaWQgKmV4dGVuc2lvbjsKIAotCXN0cnVjdCBodl9tdWx0aXBhZ2VfYnVmZmVyIERhdGFCdWZmZXI7CisJc3RydWN0IGh2X211bHRpcGFnZV9idWZmZXIgZGF0YV9idWZmZXI7CiB9OwogCiAvKiBSZXByZXNlbnRzIHRoZSBibG9jayB2c2MgZHJpdmVyICovCiBzdHJ1Y3Qgc3RvcnZzY19kcml2ZXJfb2JqZWN0IHsKIAkvKiBNdXN0IGJlIHRoZSBmaXJzdCBmaWVsZCAqLwogCS8qIFdoaWNoIGlzIGEgYnVnIEZJWE1FISAqLwotCXN0cnVjdCBodl9kcml2ZXIgQmFzZTsKKwlzdHJ1Y3QgaHZfZHJpdmVyIGJhc2U7CiAKIAkvKiBTZXQgYnkgY2FsbGVyIChpbiBieXRlcykgKi8KLQl1MzIgUmluZ0J1ZmZlclNpemU7CisJdTMyIHJpbmdfYnVmZmVyX3NpemU7CiAKIAkvKiBBbGxvY2F0ZSB0aGlzIG11Y2ggcHJpdmF0ZSBleHRlbnNpb24gZm9yIGVhY2ggSS9PIHJlcXVlc3QgKi8KLQl1MzIgUmVxdWVzdEV4dFNpemU7CisJdTMyIHJlcXVlc3RfZXh0X3NpemU7CiAKIAkvKiBNYXhpbXVtICMgb2YgcmVxdWVzdHMgaW4gZmxpZ2h0IHBlciBjaGFubmVsL2RldmljZSAqLwotCXUzMiBNYXhPdXRzdGFuZGluZ1JlcXVlc3RzUGVyQ2hhbm5lbDsKKwl1MzIgbWF4X291dHN0YW5kaW5nX3JlcV9wZXJfY2hhbm5lbDsKIAogCS8qIFNwZWNpZmljIHRvIHRoaXMgZHJpdmVyICovCi0JaW50ICgqT25JT1JlcXVlc3QpKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSwKLQkJCSAgIHN0cnVjdCBodl9zdG9ydnNjX3JlcXVlc3QgKlJlcXVlc3QpOworCWludCAoKm9uX2lvX3JlcXVlc3QpKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSwKKwkJCSAgIHN0cnVjdCBodl9zdG9ydnNjX3JlcXVlc3QgKnJlcXVlc3QpOwogfTsKIAogc3RydWN0IHN0b3J2c2NfZGV2aWNlX2luZm8gewotCXVuc2lnbmVkIGludCBQb3J0TnVtYmVyOwotCXVuc2lnbmVkIGNoYXIgUGF0aElkOwotCXVuc2lnbmVkIGNoYXIgVGFyZ2V0SWQ7CisJdW5zaWduZWQgaW50IHBvcnRfbnVtYmVyOworCXVuc2lnbmVkIGNoYXIgcGF0aF9pZDsKKwl1bnNpZ25lZCBjaGFyIHRhcmdldF9pZDsKIH07CiAKIC8qIEludGVyZmFjZSAqLwotaW50IFN0b3JWc2NJbml0aWFsaXplKHN0cnVjdCBodl9kcml2ZXIgKmRyaXZlcik7Ci1pbnQgU3RvclZzY09uSG9zdFJlc2V0KHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSk7Ci1pbnQgQmxrVnNjSW5pdGlhbGl6ZShzdHJ1Y3QgaHZfZHJpdmVyICpkcml2ZXIpOworaW50IHN0b3JfdnNjX2luaXRpYWxpemUoc3RydWN0IGh2X2RyaXZlciAqZHJpdmVyKTsKK2ludCBzdG9yX3ZzY19vbl9ob3N0X3Jlc2V0KHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSk7CitpbnQgYmxrX3ZzY19pbml0aWFsaXplKHN0cnVjdCBodl9kcml2ZXIgKmRyaXZlcik7CiAKICNlbmRpZiAvKiBfU1RPUlZTQ19BUElfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9zdG9ydnNjX2Rydi5jIGIvZHJpdmVycy9zdGFnaW5nL2h2L3N0b3J2c2NfZHJ2LmMKaW5kZXggNmY4ZDY3ZC4uMTdmMWIzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L3N0b3J2c2NfZHJ2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L3N0b3J2c2NfZHJ2LmMKQEAgLTE0MCwyOCArMTQwLDI4IEBACiAJc3RydWN0IHN0b3J2c2NfZHJpdmVyX29iamVjdCAqc3RvcnZzY19kcnZfb2JqID0gJmdfc3RvcnZzY19kcnYuZHJ2X29iajsKIAlzdHJ1Y3QgZHJpdmVyX2NvbnRleHQgKmRydl9jdHggPSAmZ19zdG9ydnNjX2Rydi5kcnZfY3R4OwogCi0Jc3RvcnZzY19kcnZfb2JqLT5SaW5nQnVmZmVyU2l6ZSA9IHN0b3J2c2NfcmluZ2J1ZmZlcl9zaXplOworCXN0b3J2c2NfZHJ2X29iai0+cmluZ19idWZmZXJfc2l6ZSA9IHN0b3J2c2NfcmluZ2J1ZmZlcl9zaXplOwogCiAJLyogQ2FsbGJhY2sgdG8gY2xpZW50IGRyaXZlciB0byBjb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gKi8KLQlkcnZfaW5pdCgmc3RvcnZzY19kcnZfb2JqLT5CYXNlKTsKKwlkcnZfaW5pdCgmc3RvcnZzY19kcnZfb2JqLT5iYXNlKTsKIAogCURQUklOVF9JTkZPKFNUT1JWU0NfRFJWLAogCQkgICAgInJlcXVlc3QgZXh0ZW5zaW9uIHNpemUgJXUsIG1heCBvdXRzdGFuZGluZyByZXFzICV1IiwKLQkJICAgIHN0b3J2c2NfZHJ2X29iai0+UmVxdWVzdEV4dFNpemUsCi0JCSAgICBzdG9ydnNjX2Rydl9vYmotPk1heE91dHN0YW5kaW5nUmVxdWVzdHNQZXJDaGFubmVsKTsKKwkJICAgIHN0b3J2c2NfZHJ2X29iai0+cmVxdWVzdF9leHRfc2l6ZSwKKwkJICAgIHN0b3J2c2NfZHJ2X29iai0+bWF4X291dHN0YW5kaW5nX3JlcV9wZXJfY2hhbm5lbCk7CiAKLQlpZiAoc3RvcnZzY19kcnZfb2JqLT5NYXhPdXRzdGFuZGluZ1JlcXVlc3RzUGVyQ2hhbm5lbCA8CisJaWYgKHN0b3J2c2NfZHJ2X29iai0+bWF4X291dHN0YW5kaW5nX3JlcV9wZXJfY2hhbm5lbCA8CiAJICAgIFNUT1JWU0NfTUFYX0lPX1JFUVVFU1RTKSB7CiAJCURQUklOVF9FUlIoU1RPUlZTQ19EUlYsCiAJCQkgICAiVGhlIG51bWJlciBvZiBvdXRzdGFuZGluZyBpbyByZXF1ZXN0cyAoJWQpICIKIAkJCSAgICJpcyBsYXJnZXIgdGhhbiB0aGF0IHN1cHBvcnRlZCAoJWQpIGludGVybmFsbHkuIiwKIAkJCSAgIFNUT1JWU0NfTUFYX0lPX1JFUVVFU1RTLAotCQkJICAgc3RvcnZzY19kcnZfb2JqLT5NYXhPdXRzdGFuZGluZ1JlcXVlc3RzUGVyQ2hhbm5lbCk7CisJCQkgICBzdG9ydnNjX2Rydl9vYmotPm1heF9vdXRzdGFuZGluZ19yZXFfcGVyX2NoYW5uZWwpOwogCQlyZXR1cm4gLTE7CiAJfQogCi0JZHJ2X2N0eC0+ZHJpdmVyLm5hbWUgPSBzdG9ydnNjX2Rydl9vYmotPkJhc2UubmFtZTsKLQltZW1jcHkoJmRydl9jdHgtPmNsYXNzX2lkLCAmc3RvcnZzY19kcnZfb2JqLT5CYXNlLmRldmljZVR5cGUsCisJZHJ2X2N0eC0+ZHJpdmVyLm5hbWUgPSBzdG9ydnNjX2Rydl9vYmotPmJhc2UubmFtZTsKKwltZW1jcHkoJmRydl9jdHgtPmNsYXNzX2lkLCAmc3RvcnZzY19kcnZfb2JqLT5iYXNlLmRldmljZVR5cGUsCiAJICAgICAgIHNpemVvZihzdHJ1Y3QgaHZfZ3VpZCkpOwogCiAJZHJ2X2N0eC0+cHJvYmUgPSBzdG9ydnNjX3Byb2JlOwpAQCAtMjA2LDggKzIwNiw4IEBACiAJCWRldmljZV91bnJlZ2lzdGVyKGN1cnJlbnRfZGV2KTsKIAl9CiAKLQlpZiAoc3RvcnZzY19kcnZfb2JqLT5CYXNlLk9uQ2xlYW51cCkKLQkJc3RvcnZzY19kcnZfb2JqLT5CYXNlLk9uQ2xlYW51cCgmc3RvcnZzY19kcnZfb2JqLT5CYXNlKTsKKwlpZiAoc3RvcnZzY19kcnZfb2JqLT5iYXNlLk9uQ2xlYW51cCkKKwkJc3RvcnZzY19kcnZfb2JqLT5iYXNlLk9uQ2xlYW51cCgmc3RvcnZzY19kcnZfb2JqLT5iYXNlKTsKIAogCXZtYnVzX2NoaWxkX2RyaXZlcl91bnJlZ2lzdGVyKGRydl9jdHgpOwogCXJldHVybjsKQEAgLTIzMSw3ICsyMzEsNyBAQAogCXN0cnVjdCBob3N0X2RldmljZV9jb250ZXh0ICpob3N0X2RldmljZV9jdHg7CiAJc3RydWN0IHN0b3J2c2NfZGV2aWNlX2luZm8gZGV2aWNlX2luZm87CiAKLQlpZiAoIXN0b3J2c2NfZHJ2X29iai0+QmFzZS5PbkRldmljZUFkZCkKKwlpZiAoIXN0b3J2c2NfZHJ2X29iai0+YmFzZS5PbkRldmljZUFkZCkKIAkJcmV0dXJuIC0xOwogCiAJaG9zdCA9IHNjc2lfaG9zdF9hbGxvYygmc2NzaV9kcml2ZXIsCkBAIC0yNTIsNyArMjUyLDcgQEAKIAlob3N0X2RldmljZV9jdHgtPnJlcXVlc3RfcG9vbCA9CiAJCQkJa21lbV9jYWNoZV9jcmVhdGUoZGV2X25hbWUoJmRldmljZV9jdHgtPmRldmljZSksCiAJCQkJCXNpemVvZihzdHJ1Y3Qgc3RvcnZzY19jbWRfcmVxdWVzdCkgKwotCQkJCQlzdG9ydnNjX2Rydl9vYmotPlJlcXVlc3RFeHRTaXplLCAwLAorCQkJCQlzdG9ydnNjX2Rydl9vYmotPnJlcXVlc3RfZXh0X3NpemUsIDAsCiAJCQkJCVNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCk7CiAKIAlpZiAoIWhvc3RfZGV2aWNlX2N0eC0+cmVxdWVzdF9wb29sKSB7CkBAIC0yNjAsOSArMjYwLDkgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JZGV2aWNlX2luZm8uUG9ydE51bWJlciA9IGhvc3QtPmhvc3Rfbm87CisJZGV2aWNlX2luZm8ucG9ydF9udW1iZXIgPSBob3N0LT5ob3N0X25vOwogCS8qIENhbGwgdG8gdGhlIHZzYyBkcml2ZXIgdG8gYWRkIHRoZSBkZXZpY2UgKi8KLQlyZXQgPSBzdG9ydnNjX2Rydl9vYmotPkJhc2UuT25EZXZpY2VBZGQoZGV2aWNlX29iaiwKKwlyZXQgPSBzdG9ydnNjX2Rydl9vYmotPmJhc2UuT25EZXZpY2VBZGQoZGV2aWNlX29iaiwKIAkJCQkJCSh2b2lkICopJmRldmljZV9pbmZvKTsKIAlpZiAocmV0ICE9IDApIHsKIAkJRFBSSU5UX0VSUihTVE9SVlNDX0RSViwgInVuYWJsZSB0byBhZGQgc2NzaSB2c2MgZGV2aWNlIik7CkBAIC0yNzIsOCArMjcyLDggQEAKIAl9CiAKIAkvKiBob3N0X2RldmljZV9jdHgtPnBvcnQgPSBkZXZpY2VfaW5mby5Qb3J0TnVtYmVyOyAqLwotCWhvc3RfZGV2aWNlX2N0eC0+cGF0aCA9IGRldmljZV9pbmZvLlBhdGhJZDsKLQlob3N0X2RldmljZV9jdHgtPnRhcmdldCA9IGRldmljZV9pbmZvLlRhcmdldElkOworCWhvc3RfZGV2aWNlX2N0eC0+cGF0aCA9IGRldmljZV9pbmZvLnBhdGhfaWQ7CisJaG9zdF9kZXZpY2VfY3R4LT50YXJnZXQgPSBkZXZpY2VfaW5mby50YXJnZXRfaWQ7CiAKIAkvKiBtYXggIyBvZiBkZXZpY2VzIHBlciB0YXJnZXQgKi8KIAlob3N0LT5tYXhfbHVuID0gU1RPUlZTQ19NQVhfTFVOU19QRVJfVEFSR0VUOwpAQCAtMjg3LDcgKzI4Nyw3IEBACiAJaWYgKHJldCAhPSAwKSB7CiAJCURQUklOVF9FUlIoU1RPUlZTQ19EUlYsICJ1bmFibGUgdG8gYWRkIHNjc2kgaG9zdCBkZXZpY2UiKTsKIAotCQlzdG9ydnNjX2Rydl9vYmotPkJhc2UuT25EZXZpY2VSZW1vdmUoZGV2aWNlX29iaik7CisJCXN0b3J2c2NfZHJ2X29iai0+YmFzZS5PbkRldmljZVJlbW92ZShkZXZpY2Vfb2JqKTsKIAogCQlrbWVtX2NhY2hlX2Rlc3Ryb3koaG9zdF9kZXZpY2VfY3R4LT5yZXF1ZXN0X3Bvb2wpOwogCQlzY3NpX2hvc3RfcHV0KGhvc3QpOwpAQCAtMzE3LDE0ICszMTcsMTQgQEAKIAkJCShzdHJ1Y3QgaG9zdF9kZXZpY2VfY29udGV4dCAqKWhvc3QtPmhvc3RkYXRhOwogCiAKLQlpZiAoIXN0b3J2c2NfZHJ2X29iai0+QmFzZS5PbkRldmljZVJlbW92ZSkKKwlpZiAoIXN0b3J2c2NfZHJ2X29iai0+YmFzZS5PbkRldmljZVJlbW92ZSkKIAkJcmV0dXJuIC0xOwogCiAJLyoKIAkgKiBDYWxsIHRvIHRoZSB2c2MgZHJpdmVyIHRvIGxldCBpdCBrbm93IHRoYXQgdGhlIGRldmljZSBpcyBiZWluZwogCSAqIHJlbW92ZWQKIAkgKi8KLQlyZXQgPSBzdG9ydnNjX2Rydl9vYmotPkJhc2UuT25EZXZpY2VSZW1vdmUoZGV2aWNlX29iaik7CisJcmV0ID0gc3RvcnZzY19kcnZfb2JqLT5iYXNlLk9uRGV2aWNlUmVtb3ZlKGRldmljZV9vYmopOwogCWlmIChyZXQgIT0gMCkgewogCQkvKiBUT0RPOiAqLwogCQlEUFJJTlRfRVJSKFNUT1JWU0MsICJ1bmFibGUgdG8gcmVtb3ZlIHZzYyBkZXZpY2UgKHJldCAlZCkiLApAQCAtMzUwLDcgKzM1MCw3IEBACiBzdGF0aWMgdm9pZCBzdG9ydnNjX2NvbW1tYW5kX2NvbXBsZXRpb24oc3RydWN0IGh2X3N0b3J2c2NfcmVxdWVzdCAqcmVxdWVzdCkKIHsKIAlzdHJ1Y3Qgc3RvcnZzY19jbWRfcmVxdWVzdCAqY21kX3JlcXVlc3QgPQotCQkoc3RydWN0IHN0b3J2c2NfY21kX3JlcXVlc3QgKilyZXF1ZXN0LT5Db250ZXh0OworCQkoc3RydWN0IHN0b3J2c2NfY21kX3JlcXVlc3QgKilyZXF1ZXN0LT5jb250ZXh0OwogCXN0cnVjdCBzY3NpX2NtbmQgKnNjbW5kID0gY21kX3JlcXVlc3QtPmNtZDsKIAlzdHJ1Y3QgaG9zdF9kZXZpY2VfY29udGV4dCAqaG9zdF9kZXZpY2VfY3R4ID0KIAkJKHN0cnVjdCBob3N0X2RldmljZV9jb250ZXh0ICopc2NtbmQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CkBAIC0zNzUsMTYgKzM3NSwxNyBAQAogCQkJCSAgICAgIGNtZF9yZXF1ZXN0LT5ib3VuY2Vfc2dsX2NvdW50KTsKIAl9CiAKLQlzY21uZC0+cmVzdWx0ID0gcmVxdWVzdC0+U3RhdHVzOworCXNjbW5kLT5yZXN1bHQgPSByZXF1ZXN0LT5zdGF0dXM7CiAKIAlpZiAoc2NtbmQtPnJlc3VsdCkgewogCQlpZiAoc2NzaV9ub3JtYWxpemVfc2Vuc2Uoc2NtbmQtPnNlbnNlX2J1ZmZlciwKLQkJCQkJIHJlcXVlc3QtPlNlbnNlQnVmZmVyU2l6ZSwgJnNlbnNlX2hkcikpCisJCQkJcmVxdWVzdC0+c2Vuc2VfYnVmZmVyX3NpemUsICZzZW5zZV9oZHIpKQogCQkJc2NzaV9wcmludF9zZW5zZV9oZHIoInN0b3J2c2MiLCAmc2Vuc2VfaGRyKTsKIAl9CiAKLQkvKiBBU1NFUlQocmVxdWVzdC0+Qnl0ZXNYZmVyIDw9IHJlcXVlc3QtPkRhdGFCdWZmZXIuTGVuZ3RoKTsgKi8KLQlzY3NpX3NldF9yZXNpZChzY21uZCwgcmVxdWVzdC0+RGF0YUJ1ZmZlci5MZW5ndGggLSByZXF1ZXN0LT5CeXRlc1hmZXIpOworCS8qIEFTU0VSVChyZXF1ZXN0LT5CeXRlc1hmZXIgPD0gcmVxdWVzdC0+ZGF0YV9idWZmZXIuTGVuZ3RoKTsgKi8KKwlzY3NpX3NldF9yZXNpZChzY21uZCwKKwkJcmVxdWVzdC0+ZGF0YV9idWZmZXIuTGVuZ3RoIC0gcmVxdWVzdC0+Ynl0ZXNfeGZlcik7CiAKIAlzY3NpX2RvbmVfZm4gPSBzY21uZC0+c2NzaV9kb25lOwogCkBAIC02NTcsNDIgKzY1OCw0MiBAQAogCiAJcmVxdWVzdCA9ICZjbWRfcmVxdWVzdC0+cmVxdWVzdDsKIAotCXJlcXVlc3QtPkV4dGVuc2lvbiA9CisJcmVxdWVzdC0+ZXh0ZW5zaW9uID0KIAkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpY21kX3JlcXVlc3QgKyByZXF1ZXN0X3NpemUpOwogCURQUklOVF9EQkcoU1RPUlZTQ19EUlYsICJyZXEgJXAgc2l6ZSAlZCBleHQgJWQiLCByZXF1ZXN0LCByZXF1ZXN0X3NpemUsCi0JCSAgIHN0b3J2c2NfZHJ2X29iai0+UmVxdWVzdEV4dFNpemUpOworCQkgICBzdG9ydnNjX2Rydl9vYmotPnJlcXVlc3RfZXh0X3NpemUpOwogCiAJLyogQnVpbGQgdGhlIFNSQiAqLwogCXN3aXRjaCAoc2NtbmQtPnNjX2RhdGFfZGlyZWN0aW9uKSB7CiAJY2FzZSBETUFfVE9fREVWSUNFOgotCQlyZXF1ZXN0LT5UeXBlID0gV1JJVEVfVFlQRTsKKwkJcmVxdWVzdC0+dHlwZSA9IFdSSVRFX1RZUEU7CiAJCWJyZWFrOwogCWNhc2UgRE1BX0ZST01fREVWSUNFOgotCQlyZXF1ZXN0LT5UeXBlID0gUkVBRF9UWVBFOworCQlyZXF1ZXN0LT50eXBlID0gUkVBRF9UWVBFOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlyZXF1ZXN0LT5UeXBlID0gVU5LTk9XTl9UWVBFOworCQlyZXF1ZXN0LT50eXBlID0gVU5LTk9XTl9UWVBFOwogCQlicmVhazsKIAl9CiAKLQlyZXF1ZXN0LT5PbklPQ29tcGxldGlvbiA9IHN0b3J2c2NfY29tbW1hbmRfY29tcGxldGlvbjsKLQlyZXF1ZXN0LT5Db250ZXh0ID0gY21kX3JlcXVlc3Q7Lyogc2NtbmQ7ICovCisJcmVxdWVzdC0+b25faW9fY29tcGxldGlvbiA9IHN0b3J2c2NfY29tbW1hbmRfY29tcGxldGlvbjsKKwlyZXF1ZXN0LT5jb250ZXh0ID0gY21kX3JlcXVlc3Q7Lyogc2NtbmQ7ICovCiAKIAkvKiByZXF1ZXN0LT5Qb3J0SWQgPSBzY21uZC0+ZGV2aWNlLT5jaGFubmVsOyAqLwotCXJlcXVlc3QtPkhvc3QgPSBob3N0X2RldmljZV9jdHgtPnBvcnQ7Ci0JcmVxdWVzdC0+QnVzID0gc2NtbmQtPmRldmljZS0+Y2hhbm5lbDsKLQlyZXF1ZXN0LT5UYXJnZXRJZCA9IHNjbW5kLT5kZXZpY2UtPmlkOwotCXJlcXVlc3QtPkx1bklkID0gc2NtbmQtPmRldmljZS0+bHVuOworCXJlcXVlc3QtPmhvc3QgPSBob3N0X2RldmljZV9jdHgtPnBvcnQ7CisJcmVxdWVzdC0+YnVzID0gc2NtbmQtPmRldmljZS0+Y2hhbm5lbDsKKwlyZXF1ZXN0LT50YXJnZXRfaWQgPSBzY21uZC0+ZGV2aWNlLT5pZDsKKwlyZXF1ZXN0LT5sdW5faWQgPSBzY21uZC0+ZGV2aWNlLT5sdW47CiAKIAkvKiBBU1NFUlQoc2NtbmQtPmNtZF9sZW4gPD0gMTYpOyAqLwotCXJlcXVlc3QtPkNkYkxlbiA9IHNjbW5kLT5jbWRfbGVuOwotCXJlcXVlc3QtPkNkYiA9IHNjbW5kLT5jbW5kOworCXJlcXVlc3QtPmNkYl9sZW4gPSBzY21uZC0+Y21kX2xlbjsKKwlyZXF1ZXN0LT5jZGIgPSBzY21uZC0+Y21uZDsKIAotCXJlcXVlc3QtPlNlbnNlQnVmZmVyID0gc2NtbmQtPnNlbnNlX2J1ZmZlcjsKLQlyZXF1ZXN0LT5TZW5zZUJ1ZmZlclNpemUgPSBTQ1NJX1NFTlNFX0JVRkZFUlNJWkU7CisJcmVxdWVzdC0+c2Vuc2VfYnVmZmVyID0gc2NtbmQtPnNlbnNlX2J1ZmZlcjsKKwlyZXF1ZXN0LT5zZW5zZV9idWZmZXJfc2l6ZSA9IFNDU0lfU0VOU0VfQlVGRkVSU0laRTsKIAogCi0JcmVxdWVzdC0+RGF0YUJ1ZmZlci5MZW5ndGggPSBzY3NpX2J1ZmZsZW4oc2NtbmQpOworCXJlcXVlc3QtPmRhdGFfYnVmZmVyLkxlbmd0aCA9IHNjc2lfYnVmZmxlbihzY21uZCk7CiAJaWYgKHNjc2lfc2dfY291bnQoc2NtbmQpKSB7CiAJCXNnbCA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilzY3NpX3NnbGlzdChzY21uZCk7CiAJCXNnX2NvdW50ID0gc2NzaV9zZ19jb3VudChzY21uZCk7CkBAIC03MzMsMjUgKzczNCwyNSBAQAogCQkJc2dfY291bnQgPSBjbWRfcmVxdWVzdC0+Ym91bmNlX3NnbF9jb3VudDsKIAkJfQogCi0JCXJlcXVlc3QtPkRhdGFCdWZmZXIuT2Zmc2V0ID0gc2dsWzBdLm9mZnNldDsKKwkJcmVxdWVzdC0+ZGF0YV9idWZmZXIuT2Zmc2V0ID0gc2dsWzBdLm9mZnNldDsKIAogCQlmb3IgKGkgPSAwOyBpIDwgc2dfY291bnQ7IGkrKykgewogCQkJRFBSSU5UX0RCRyhTVE9SVlNDX0RSViwgInNnbFslZF0gbGVuICVkIG9mZnNldCAlZFxuIiwKIAkJCQkgICBpLCBzZ2xbaV0ubGVuZ3RoLCBzZ2xbaV0ub2Zmc2V0KTsKLQkJCXJlcXVlc3QtPkRhdGFCdWZmZXIuUGZuQXJyYXlbaV0gPQorCQkJcmVxdWVzdC0+ZGF0YV9idWZmZXIuUGZuQXJyYXlbaV0gPQogCQkJCXBhZ2VfdG9fcGZuKHNnX3BhZ2UoKCZzZ2xbaV0pKSk7CiAJCX0KIAl9IGVsc2UgaWYgKHNjc2lfc2dsaXN0KHNjbW5kKSkgewogCQkvKiBBU1NFUlQoc2NzaV9idWZmbGVuKHNjbW5kKSA8PSBQQUdFX1NJWkUpOyAqLwotCQlyZXF1ZXN0LT5EYXRhQnVmZmVyLk9mZnNldCA9CisJCXJlcXVlc3QtPmRhdGFfYnVmZmVyLk9mZnNldCA9CiAJCQl2aXJ0X3RvX3BoeXMoc2NzaV9zZ2xpc3Qoc2NtbmQpKSAmIChQQUdFX1NJWkUtMSk7Ci0JCXJlcXVlc3QtPkRhdGFCdWZmZXIuUGZuQXJyYXlbMF0gPQorCQlyZXF1ZXN0LT5kYXRhX2J1ZmZlci5QZm5BcnJheVswXSA9CiAJCQl2aXJ0X3RvX3BoeXMoc2NzaV9zZ2xpc3Qoc2NtbmQpKSA+PiBQQUdFX1NISUZUOwogCX0KIAogcmV0cnlfcmVxdWVzdDoKIAkvKiBJbnZva2VzIHRoZSB2c2MgdG8gc3RhcnQgYW4gSU8gKi8KLQlyZXQgPSBzdG9ydnNjX2Rydl9vYmotPk9uSU9SZXF1ZXN0KCZkZXZpY2VfY3R4LT5kZXZpY2Vfb2JqLAorCXJldCA9IHN0b3J2c2NfZHJ2X29iai0+b25faW9fcmVxdWVzdCgmZGV2aWNlX2N0eC0+ZGV2aWNlX29iaiwKIAkJCQkJICAgJmNtZF9yZXF1ZXN0LT5yZXF1ZXN0KTsKIAlpZiAocmV0ID09IC0xKSB7CiAJCS8qIG5vIG1vcmUgc3BhY2UgKi8KQEAgLTg0NCw3ICs4NDUsNyBAQAogCQkgICAgc2NtbmQtPmRldmljZSwgJmRldmljZV9jdHgtPmRldmljZV9vYmopOwogCiAJLyogSW52b2tlcyB0aGUgdnNjIHRvIHJlc2V0IHRoZSBob3N0L2J1cyAqLwotCXJldCA9IFN0b3JWc2NPbkhvc3RSZXNldCgmZGV2aWNlX2N0eC0+ZGV2aWNlX29iaik7CisJcmV0ID0gc3Rvcl92c2Nfb25faG9zdF9yZXNldCgmZGV2aWNlX2N0eC0+ZGV2aWNlX29iaik7CiAJaWYgKHJldCAhPSAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC05MzksNyArOTQwLDcgQEAKIAlpbnQgcmV0OwogCiAJRFBSSU5UX0lORk8oU1RPUlZTQ19EUlYsICJTdG9ydnNjIGluaXRpYWxpemluZy4uLi4iKTsKLQlyZXQgPSBzdG9ydnNjX2Rydl9pbml0KFN0b3JWc2NJbml0aWFsaXplKTsKKwlyZXQgPSBzdG9ydnNjX2Rydl9pbml0KHN0b3JfdnNjX2luaXRpYWxpemUpOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi92bWJ1cy5jIGIvZHJpdmVycy9zdGFnaW5nL2h2L3ZtYnVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NDlkYWYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L3ZtYnVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgTWljcm9zb2Z0IENvcnBvcmF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAotICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCi0gKiBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQS4KLSAqCi0gKiBBdXRob3JzOgotICogICBIYWl5YW5nIFpoYW5nIDxoYWl5YW5nekBtaWNyb3NvZnQuY29tPgotICogICBIYW5rIEphbnNzZW4gIDxoamFuc3NlbkBtaWNyb3NvZnQuY29tPgotICoKLSAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgIm9zZC5oIgotI2luY2x1ZGUgImxvZ2dpbmcuaCIKLSNpbmNsdWRlICJ2ZXJzaW9uX2luZm8uaCIKLSNpbmNsdWRlICJ2bWJ1c19wcml2YXRlLmgiCi0KLXN0YXRpYyBjb25zdCBjaGFyICpnRHJpdmVyTmFtZSA9ICJ2bWJ1cyI7Ci0KLS8qCi0gKiBXaW5kb3dzIHZtYnVzIGRvZXMgbm90IGRlZmluZWQgdGhpcy4KLSAqIFdlIGRlZmluZWQgdGhpcyB0byBiZSBjb25zaXN0ZW50IHdpdGggb3RoZXIgZGV2aWNlcwotICovCi0vKiB7YzUyOTU4MTYtZjYzYS00ZDVmLThkMWEtNGRhZjk5OWNhMTg1fSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBodl9ndWlkIGdWbWJ1c0RldmljZVR5cGUgPSB7Ci0JLmRhdGEgPSB7Ci0JCTB4MTYsIDB4NTgsIDB4MjksIDB4YzUsIDB4M2EsIDB4ZjYsIDB4NWYsIDB4NGQsCi0JCTB4OGQsIDB4MWEsIDB4NGQsIDB4YWYsIDB4OTksIDB4OWMsIDB4YTEsIDB4ODUKLQl9Ci19OwotCi0vKiB7YWMzNzYwZmMtOWFkZi00MGFhLTk0MjctYTcwZWQ2ZGU5NWM1fSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBodl9ndWlkIGdWbWJ1c0RldmljZUlkID0gewotCS5kYXRhID0gewotCQkweGZjLCAweDYwLCAweDM3LCAweGFjLCAweGRmLCAweDlhLCAweGFhLCAweDQwLAotCQkweDk0LCAweDI3LCAweGE3LCAweDBlLCAweGQ2LCAweGRlLCAweDk1LCAweGM1Ci0JfQotfTsKLQotc3RhdGljIHN0cnVjdCBodl9kcml2ZXIgKmdEcml2ZXI7IC8qIHZtYnVzIGRyaXZlciBvYmplY3QgKi8KLXN0YXRpYyBzdHJ1Y3QgaHZfZGV2aWNlICpnRGV2aWNlOyAvKiB2bWJ1cyByb290IGRldmljZSAqLwotCi0vKgotICogVm1idXNHZXRDaGFubmVsT2ZmZXJzIC0gUmV0cmlldmUgdGhlIGNoYW5uZWwgb2ZmZXJzIGZyb20gdGhlIHBhcmVudCBwYXJ0aXRpb24KLSAqLwotc3RhdGljIHZvaWQgVm1idXNHZXRDaGFubmVsT2ZmZXJzKHZvaWQpCi17Ci0Jdm1idXNfcmVxdWVzdF9vZmZlcnMoKTsKLX0KLQotLyoKLSAqIFZtYnVzQ3JlYXRlQ2hpbGREZXZpY2UgLSBDcmVhdGVzIHRoZSBjaGlsZCBkZXZpY2Ugb24gdGhlIGJ1cyB0aGF0IHJlcHJlc2VudHMgdGhlIGNoYW5uZWwgb2ZmZXIKLSAqLwotc3RydWN0IGh2X2RldmljZSAqVm1idXNDaGlsZERldmljZUNyZWF0ZShzdHJ1Y3QgaHZfZ3VpZCAqRGV2aWNlVHlwZSwKLQkJCQkJIHN0cnVjdCBodl9ndWlkICpEZXZpY2VJbnN0YW5jZSwKLQkJCQkJIHN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsKQotewotCXN0cnVjdCB2bWJ1c19kcml2ZXIgKnZtYnVzRHJpdmVyID0gKHN0cnVjdCB2bWJ1c19kcml2ZXIgKilnRHJpdmVyOwotCi0JcmV0dXJuIHZtYnVzRHJpdmVyLT5PbkNoaWxkRGV2aWNlQ3JlYXRlKERldmljZVR5cGUsIERldmljZUluc3RhbmNlLAotCQkJCQkJY2hhbm5lbCk7Ci19Ci0KLS8qCi0gKiBWbWJ1c0NoaWxkRGV2aWNlQWRkIC0gUmVnaXN0ZXJzIHRoZSBjaGlsZCBkZXZpY2Ugd2l0aCB0aGUgdm1idXMKLSAqLwotaW50IFZtYnVzQ2hpbGREZXZpY2VBZGQoc3RydWN0IGh2X2RldmljZSAqQ2hpbGREZXZpY2UpCi17Ci0Jc3RydWN0IHZtYnVzX2RyaXZlciAqdm1idXNEcml2ZXIgPSAoc3RydWN0IHZtYnVzX2RyaXZlciAqKWdEcml2ZXI7Ci0KLQlyZXR1cm4gdm1idXNEcml2ZXItPk9uQ2hpbGREZXZpY2VBZGQoZ0RldmljZSwgQ2hpbGREZXZpY2UpOwotfQotCi0vKgotICogVm1idXNDaGlsZERldmljZVJlbW92ZSBVbnJlZ2lzdGVycyB0aGUgY2hpbGQgZGV2aWNlIGZyb20gdGhlIHZtYnVzCi0gKi8KLXZvaWQgVm1idXNDaGlsZERldmljZVJlbW92ZShzdHJ1Y3QgaHZfZGV2aWNlICpDaGlsZERldmljZSkKLXsKLQlzdHJ1Y3Qgdm1idXNfZHJpdmVyICp2bWJ1c0RyaXZlciA9IChzdHJ1Y3Qgdm1idXNfZHJpdmVyICopZ0RyaXZlcjsKLQotCXZtYnVzRHJpdmVyLT5PbkNoaWxkRGV2aWNlUmVtb3ZlKENoaWxkRGV2aWNlKTsKLX0KLQotLyoKLSAqIFZtYnVzT25EZXZpY2VBZGQgLSBDYWxsYmFjayB3aGVuIHRoZSByb290IGJ1cyBkZXZpY2UgaXMgYWRkZWQKLSAqLwotc3RhdGljIGludCBWbWJ1c09uRGV2aWNlQWRkKHN0cnVjdCBodl9kZXZpY2UgKmRldiwgdm9pZCAqQWRkaXRpb25hbEluZm8pCi17Ci0JdTMyICppcnF2ZWN0b3IgPSBBZGRpdGlvbmFsSW5mbzsKLQlpbnQgcmV0OwotCi0JZ0RldmljZSA9IGRldjsKLQotCW1lbWNweSgmZ0RldmljZS0+ZGV2aWNlVHlwZSwgJmdWbWJ1c0RldmljZVR5cGUsIHNpemVvZihzdHJ1Y3QgaHZfZ3VpZCkpOwotCW1lbWNweSgmZ0RldmljZS0+ZGV2aWNlSW5zdGFuY2UsICZnVm1idXNEZXZpY2VJZCwKLQkgICAgICAgc2l6ZW9mKHN0cnVjdCBodl9ndWlkKSk7Ci0KLQkvKiBzdHJjcHkoZGV2LT5uYW1lLCAidm1idXMiKTsgKi8KLQkvKiBTeW5JQyBzZXR1cC4uLiAqLwotCW9uX2VhY2hfY3B1KEh2U3luaWNJbml0LCAodm9pZCAqKWlycXZlY3RvciwgMSk7Ci0KLQkvKiBDb25uZWN0IHRvIFZNQnVzIGluIHRoZSByb290IHBhcnRpdGlvbiAqLwotCXJldCA9IFZtYnVzQ29ubmVjdCgpOwotCi0JLyogVm1idXNTZW5kRXZlbnQoZGV2aWNlLT5sb2NhbFBvcnRJZCsxKTsgKi8KLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogVm1idXNPbkRldmljZVJlbW92ZSAtIENhbGxiYWNrIHdoZW4gdGhlIHJvb3QgYnVzIGRldmljZSBpcyByZW1vdmVkCi0gKi8KLXN0YXRpYyBpbnQgVm1idXNPbkRldmljZVJlbW92ZShzdHJ1Y3QgaHZfZGV2aWNlICpkZXYpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQl2bWJ1c19yZWxlYXNlX3VuYXR0YWNoZWRfY2hhbm5lbHMoKTsKLQlWbWJ1c0Rpc2Nvbm5lY3QoKTsKLQlvbl9lYWNoX2NwdShIdlN5bmljQ2xlYW51cCwgTlVMTCwgMSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIFZtYnVzT25DbGVhbnVwIC0gUGVyZm9ybSBhbnkgY2xlYW51cCB3aGVuIHRoZSBkcml2ZXIgaXMgcmVtb3ZlZAotICovCi1zdGF0aWMgdm9pZCBWbWJ1c09uQ2xlYW51cChzdHJ1Y3QgaHZfZHJpdmVyICpkcnYpCi17Ci0JLyogc3RydWN0IHZtYnVzX2RyaXZlciAqZHJpdmVyID0gKHN0cnVjdCB2bWJ1c19kcml2ZXIgKilkcnY7ICovCi0KLQlIdkNsZWFudXAoKTsKLX0KLQotLyoKLSAqIFZtYnVzT25Nc2dEUEMgLSBEUEMgcm91dGluZSB0byBoYW5kbGUgbWVzc2FnZXMgZnJvbSB0aGUgaHlwZXJ2aXNpb3IKLSAqLwotc3RhdGljIHZvaWQgVm1idXNPbk1zZ0RQQyhzdHJ1Y3QgaHZfZHJpdmVyICpkcnYpCi17Ci0JaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQl2b2lkICpwYWdlX2FkZHIgPSBnSHZDb250ZXh0LnN5bklDTWVzc2FnZVBhZ2VbY3B1XTsKLQlzdHJ1Y3QgaHZfbWVzc2FnZSAqbXNnID0gKHN0cnVjdCBodl9tZXNzYWdlICopcGFnZV9hZGRyICsKLQkJCQkgIFZNQlVTX01FU1NBR0VfU0lOVDsKLQlzdHJ1Y3QgaHZfbWVzc2FnZSAqY29waWVkOwotCi0Jd2hpbGUgKDEpIHsKLQkJaWYgKG1zZy0+SGVhZGVyLk1lc3NhZ2VUeXBlID09IEh2TWVzc2FnZVR5cGVOb25lKSB7Ci0JCQkvKiBubyBtc2cgKi8KLQkJCWJyZWFrOwotCQl9IGVsc2UgewotCQkJY29waWVkID0ga21lbWR1cChtc2csIHNpemVvZigqY29waWVkKSwgR0ZQX0FUT01JQyk7Ci0JCQlpZiAoY29waWVkID09IE5VTEwpCi0JCQkJY29udGludWU7Ci0KLQkJCW9zZF9zY2hlZHVsZV9jYWxsYmFjayhnVm1idXNDb25uZWN0aW9uLldvcmtRdWV1ZSwKLQkJCQkJICAgICAgdm1idXNfb25tZXNzYWdlLAotCQkJCQkgICAgICAodm9pZCAqKWNvcGllZCk7Ci0JCX0KLQotCQltc2ctPkhlYWRlci5NZXNzYWdlVHlwZSA9IEh2TWVzc2FnZVR5cGVOb25lOwotCi0JCS8qCi0JCSAqIE1ha2Ugc3VyZSB0aGUgd3JpdGUgdG8gTWVzc2FnZVR5cGUgKGllIHNldCB0bwotCQkgKiBIdk1lc3NhZ2VUeXBlTm9uZSkgaGFwcGVucyBiZWZvcmUgd2UgcmVhZCB0aGUKLQkJICogTWVzc2FnZVBlbmRpbmcgYW5kIEVPTWluZy4gT3RoZXJ3aXNlLCB0aGUgRU9NaW5nCi0JCSAqIHdpbGwgbm90IGRlbGl2ZXIgYW55IG1vcmUgbWVzc2FnZXMgc2luY2UgdGhlcmUgaXMKLQkJICogbm8gZW1wdHkgc2xvdAotCQkgKi8KLQkJbWIoKTsKLQotCQlpZiAobXNnLT5IZWFkZXIuTWVzc2FnZUZsYWdzLk1lc3NhZ2VQZW5kaW5nKSB7Ci0JCQkvKgotCQkJICogVGhpcyB3aWxsIGNhdXNlIG1lc3NhZ2UgcXVldWUgcmVzY2FuIHRvCi0JCQkgKiBwb3NzaWJseSBkZWxpdmVyIGFub3RoZXIgbXNnIGZyb20gdGhlCi0JCQkgKiBoeXBlcnZpc29yCi0JCQkgKi8KLQkJCXdybXNybChIVl9YNjRfTVNSX0VPTSwgMCk7Ci0JCX0KLQl9Ci19Ci0KLS8qCi0gKiBWbWJ1c09uRXZlbnREUEMgLSBEUEMgcm91dGluZSB0byBoYW5kbGUgZXZlbnRzIGZyb20gdGhlIGh5cGVydmlzaW9yCi0gKi8KLXN0YXRpYyB2b2lkIFZtYnVzT25FdmVudERQQyhzdHJ1Y3QgaHZfZHJpdmVyICpkcnYpCi17Ci0JLyogVE9ETzogUHJvY2VzcyBhbnkgZXZlbnRzICovCi0JVm1idXNPbkV2ZW50cygpOwotfQotCi0vKgotICogVm1idXNPbklTUiAtIElTUiByb3V0aW5lCi0gKi8KLXN0YXRpYyBpbnQgVm1idXNPbklTUihzdHJ1Y3QgaHZfZHJpdmVyICpkcnYpCi17Ci0JaW50IHJldCA9IDA7Ci0JaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQl2b2lkICpwYWdlX2FkZHI7Ci0Jc3RydWN0IGh2X21lc3NhZ2UgKm1zZzsKLQl1bmlvbiBodl9zeW5pY19ldmVudF9mbGFncyAqZXZlbnQ7Ci0KLQlwYWdlX2FkZHIgPSBnSHZDb250ZXh0LnN5bklDTWVzc2FnZVBhZ2VbY3B1XTsKLQltc2cgPSAoc3RydWN0IGh2X21lc3NhZ2UgKilwYWdlX2FkZHIgKyBWTUJVU19NRVNTQUdFX1NJTlQ7Ci0KLQkvKiBDaGVjayBpZiB0aGVyZSBhcmUgYWN0dWFsIG1zZ3MgdG8gYmUgcHJvY2VzcyAqLwotCWlmIChtc2ctPkhlYWRlci5NZXNzYWdlVHlwZSAhPSBIdk1lc3NhZ2VUeXBlTm9uZSkgewotCQlEUFJJTlRfREJHKFZNQlVTLCAicmVjZWl2ZWQgbXNnIHR5cGUgJWQgc2l6ZSAlZCIsCi0JCQkJbXNnLT5IZWFkZXIuTWVzc2FnZVR5cGUsCi0JCQkJbXNnLT5IZWFkZXIuUGF5bG9hZFNpemUpOwotCQlyZXQgfD0gMHgxOwotCX0KLQotCS8qIFRPRE86IENoZWNrIGlmIHRoZXJlIGFyZSBldmVudHMgdG8gYmUgcHJvY2VzcyAqLwotCXBhZ2VfYWRkciA9IGdIdkNvbnRleHQuc3luSUNFdmVudFBhZ2VbY3B1XTsKLQlldmVudCA9ICh1bmlvbiBodl9zeW5pY19ldmVudF9mbGFncyAqKXBhZ2VfYWRkciArIFZNQlVTX01FU1NBR0VfU0lOVDsKLQotCS8qIFNpbmNlIHdlIGFyZSBhIGNoaWxkLCB3ZSBvbmx5IG5lZWQgdG8gY2hlY2sgYml0IDAgKi8KLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KDAsICh1bnNpZ25lZCBsb25nICopICZldmVudC0+RmxhZ3MzMlswXSkpIHsKLQkJRFBSSU5UX0RCRyhWTUJVUywgInJlY2VpdmVkIGV2ZW50ICVkIiwgZXZlbnQtPkZsYWdzMzJbMF0pOwotCQlyZXQgfD0gMHgyOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBWbWJ1c0luaXRpYWxpemUgLSBNYWluIGVudHJ5IHBvaW50Ci0gKi8KLWludCBWbWJ1c0luaXRpYWxpemUoc3RydWN0IGh2X2RyaXZlciAqZHJ2KQotewotCXN0cnVjdCB2bWJ1c19kcml2ZXIgKmRyaXZlciA9IChzdHJ1Y3Qgdm1idXNfZHJpdmVyICopZHJ2OwotCWludCByZXQ7Ci0KLQlEUFJJTlRfSU5GTyhWTUJVUywgIisrKysrKysgSFYgRHJpdmVyIHZlcnNpb24gPSAlcyArKysrKysrIiwKLQkJICAgIEhWX0RSVl9WRVJTSU9OKTsKLQlEUFJJTlRfSU5GTyhWTUJVUywgIisrKysrKysgVm1idXMgc3VwcG9ydGVkIHZlcnNpb24gPSAlZCArKysrKysrIiwKLQkJCVZNQlVTX1JFVklTSU9OX05VTUJFUik7Ci0JRFBSSU5UX0lORk8oVk1CVVMsICIrKysrKysrIFZtYnVzIHVzaW5nIFNJTlQgJWQgKysrKysrKyIsCi0JCQlWTUJVU19NRVNTQUdFX1NJTlQpOwotCURQUklOVF9EQkcoVk1CVVMsICJzaXplb2Yodm1idXNfY2hhbm5lbF9wYWNrZXRfcGFnZV9idWZmZXIpPSV6ZCwgIgotCQkJInNpemVvZihWTUJVU19DSEFOTkVMX1BBQ0tFVF9NVUxJVFBBR0VfQlVGRkVSKT0lemQiLAotCQkJc2l6ZW9mKHN0cnVjdCB2bWJ1c19jaGFubmVsX3BhY2tldF9wYWdlX2J1ZmZlciksCi0JCQlzaXplb2Yoc3RydWN0IHZtYnVzX2NoYW5uZWxfcGFja2V0X211bHRpcGFnZV9idWZmZXIpKTsKLQotCWRydi0+bmFtZSA9IGdEcml2ZXJOYW1lOwotCW1lbWNweSgmZHJ2LT5kZXZpY2VUeXBlLCAmZ1ZtYnVzRGV2aWNlVHlwZSwgc2l6ZW9mKHN0cnVjdCBodl9ndWlkKSk7Ci0KLQkvKiBTZXR1cCBkaXNwYXRjaCB0YWJsZSAqLwotCWRyaXZlci0+QmFzZS5PbkRldmljZUFkZAk9IFZtYnVzT25EZXZpY2VBZGQ7Ci0JZHJpdmVyLT5CYXNlLk9uRGV2aWNlUmVtb3ZlCT0gVm1idXNPbkRldmljZVJlbW92ZTsKLQlkcml2ZXItPkJhc2UuT25DbGVhbnVwCQk9IFZtYnVzT25DbGVhbnVwOwotCWRyaXZlci0+T25Jc3IJCQk9IFZtYnVzT25JU1I7Ci0JZHJpdmVyLT5Pbk1zZ0RwYwkJPSBWbWJ1c09uTXNnRFBDOwotCWRyaXZlci0+T25FdmVudERwYwkJPSBWbWJ1c09uRXZlbnREUEM7Ci0JZHJpdmVyLT5HZXRDaGFubmVsT2ZmZXJzCT0gVm1idXNHZXRDaGFubmVsT2ZmZXJzOwotCi0JLyogSHlwZXJ2aXNvciBpbml0aWFsaXphdGlvbi4uLnNldHVwIGh5cGVyY2FsbCBwYWdlLi5ldGMgKi8KLQlyZXQgPSBIdkluaXQoKTsKLQlpZiAocmV0ICE9IDApCi0JCURQUklOVF9FUlIoVk1CVVMsICJVbmFibGUgdG8gaW5pdGlhbGl6ZSB0aGUgaHlwZXJ2aXNvciAtIDB4JXgiLAotCQkJCXJldCk7Ci0JZ0RyaXZlciA9IGRydjsKLQotCXJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvdm1idXNfYXBpLmggYi9kcml2ZXJzL3N0YWdpbmcvaHYvdm1idXNfYXBpLmgKaW5kZXggMmFmNDJlNS4uMmRhM2Y1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L3ZtYnVzX2FwaS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi92bWJ1c19hcGkuaApAQCAtMTE1LDI4ICsxMTUsNCBAQAogCXZvaWQgKkV4dGVuc2lvbjsKIH07CiAKLS8qIFZtYnVzIGRyaXZlciBvYmplY3QgKi8KLXN0cnVjdCB2bWJ1c19kcml2ZXIgewotCS8qICEhIE11c3QgYmUgdGhlIDFzdCBmaWVsZCAhISAqLwotCS8qIEZJWE1FIGlmIF4sIHRoZW4gc29tZW9uZSBpcyBkb2luZyBzb210aGluZyBzdHVwaWQgKi8KLQlzdHJ1Y3QgaHZfZHJpdmVyIEJhc2U7Ci0KLQkvKiBTZXQgYnkgdGhlIGNhbGxlciAqLwotCXN0cnVjdCBodl9kZXZpY2UgKiAoKk9uQ2hpbGREZXZpY2VDcmVhdGUpKHN0cnVjdCBodl9ndWlkICpEZXZpY2VUeXBlLAotCQkJCQkJc3RydWN0IGh2X2d1aWQgKkRldmljZUluc3RhbmNlLAotCQkJCQkJc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWwpOwotCXZvaWQgKCpPbkNoaWxkRGV2aWNlRGVzdHJveSkoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKTsKLQlpbnQgKCpPbkNoaWxkRGV2aWNlQWRkKShzdHJ1Y3QgaHZfZGV2aWNlICpSb290RGV2aWNlLAotCQkJCXN0cnVjdCBodl9kZXZpY2UgKkNoaWxkRGV2aWNlKTsKLQl2b2lkICgqT25DaGlsZERldmljZVJlbW92ZSkoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKTsKLQotCS8qIFNldCBieSB0aGUgY2FsbGVlICovCi0JaW50ICgqT25Jc3IpKHN0cnVjdCBodl9kcml2ZXIgKmRyaXZlcik7Ci0Jdm9pZCAoKk9uTXNnRHBjKShzdHJ1Y3QgaHZfZHJpdmVyICpkcml2ZXIpOwotCXZvaWQgKCpPbkV2ZW50RHBjKShzdHJ1Y3QgaHZfZHJpdmVyICpkcml2ZXIpOwotCXZvaWQgKCpHZXRDaGFubmVsT2ZmZXJzKSh2b2lkKTsKLX07Ci0KLWludCBWbWJ1c0luaXRpYWxpemUoc3RydWN0IGh2X2RyaXZlciAqZHJ2KTsKLQogI2VuZGlmIC8qIF9WTUJVU19BUElfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi92bWJ1c19kcnYuYyBiL2RyaXZlcnMvc3RhZ2luZy9odi92bWJ1c19kcnYuYwppbmRleCAwZDlmM2E0Li44NGZkYjY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvdm1idXNfZHJ2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L3ZtYnVzX2Rydi5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSAibG9nZ2luZy5oIgogI2luY2x1ZGUgInZtYnVzLmgiCiAjaW5jbHVkZSAiY2hhbm5lbC5oIgorI2luY2x1ZGUgInZtYnVzX3ByaXZhdGUuaCIKIAogCiAvKiBGSVhNRSEgV2UgbmVlZCB0byBkbyB0aGlzIGR5bmFtaWNhbGx5IGZvciBQSUMgYW5kIEFQSUMgc3lzdGVtICovCkBAIC00Niw3ICs0Nyw3IEBACiAJLyogVGhlIGRyaXZlciBmaWVsZCBpcyBub3QgdXNlZCBpbiBoZXJlLiBJbnN0ZWFkLCB0aGUgYnVzIGZpZWxkIGlzICovCiAJLyogdXNlZCB0byByZXByZXNlbnQgdGhlIGRyaXZlciAqLwogCXN0cnVjdCBkcml2ZXJfY29udGV4dCBkcnZfY3R4OwotCXN0cnVjdCB2bWJ1c19kcml2ZXIgZHJ2X29iajsKKwlzdHJ1Y3QgaHZfZHJpdmVyIGRydl9vYmo7CiAKIAlzdHJ1Y3QgYnVzX3R5cGUgYnVzOwogCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBtc2dfZHBjOwpAQCAtNjksMTMgKzcwLDYgQEAKIHN0YXRpYyB2b2lkIHZtYnVzX2RldmljZV9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldmljZSk7CiBzdGF0aWMgdm9pZCB2bWJ1c19idXNfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpOwogCi1zdGF0aWMgc3RydWN0IGh2X2RldmljZSAqdm1idXNfY2hpbGRfZGV2aWNlX2NyZWF0ZShzdHJ1Y3QgaHZfZ3VpZCAqdHlwZSwKLQkJCQkJCSAgIHN0cnVjdCBodl9ndWlkICppbnN0YW5jZSwKLQkJCQkJCSAgIHN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsKTsKLXN0YXRpYyB2b2lkIHZtYnVzX2NoaWxkX2RldmljZV9kZXN0cm95KHN0cnVjdCBodl9kZXZpY2UgKmRldmljZV9vYmopOwotc3RhdGljIGludCB2bWJ1c19jaGlsZF9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IGh2X2RldmljZSAqcm9vdF9kZXZpY2Vfb2JqLAotCQkJCSAgICAgICBzdHJ1Y3QgaHZfZGV2aWNlICpjaGlsZF9kZXZpY2Vfb2JqKTsKLXN0YXRpYyB2b2lkIHZtYnVzX2NoaWxkX2RldmljZV91bnJlZ2lzdGVyKHN0cnVjdCBodl9kZXZpY2UgKmNoaWxkX2RldmljZV9vYmopOwogc3RhdGljIHNzaXplX3Qgdm1idXNfc2hvd19kZXZpY2VfYXR0cihzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldl9hdHRyLAogCQkJCSAgICAgIGNoYXIgKmJ1Zik7CkBAIC0xMjksNiArMTIzLDE4MiBAQAogCS5idXMuZGV2X2F0dHJzID0Jdm1idXNfZGV2aWNlX2F0dHJzLAogfTsKIAorc3RhdGljIGNvbnN0IGNoYXIgKmdEcml2ZXJOYW1lID0gImh5cGVydiI7CisKKy8qCisgKiBXaW5kb3dzIHZtYnVzIGRvZXMgbm90IGRlZmluZWQgdGhpcy4KKyAqIFdlIGRlZmluZWQgdGhpcyB0byBiZSBjb25zaXN0ZW50IHdpdGggb3RoZXIgZGV2aWNlcworICovCisvKiB7YzUyOTU4MTYtZjYzYS00ZDVmLThkMWEtNGRhZjk5OWNhMTg1fSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBodl9ndWlkIGdWbWJ1c0RldmljZVR5cGUgPSB7CisJLmRhdGEgPSB7CisJCTB4MTYsIDB4NTgsIDB4MjksIDB4YzUsIDB4M2EsIDB4ZjYsIDB4NWYsIDB4NGQsCisJCTB4OGQsIDB4MWEsIDB4NGQsIDB4YWYsIDB4OTksIDB4OWMsIDB4YTEsIDB4ODUKKwl9Cit9OworCisvKiB7YWMzNzYwZmMtOWFkZi00MGFhLTk0MjctYTcwZWQ2ZGU5NWM1fSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBodl9ndWlkIGdWbWJ1c0RldmljZUlkID0geworCS5kYXRhID0geworCQkweGZjLCAweDYwLCAweDM3LCAweGFjLCAweGRmLCAweDlhLCAweGFhLCAweDQwLAorCQkweDk0LCAweDI3LCAweGE3LCAweDBlLCAweGQ2LCAweGRlLCAweDk1LCAweGM1CisJfQorfTsKKworc3RhdGljIHN0cnVjdCBodl9kZXZpY2UgKmdEZXZpY2U7IC8qIHZtYnVzIHJvb3QgZGV2aWNlICovCisKKy8qCisgKiBWbWJ1c0NoaWxkRGV2aWNlQWRkIC0gUmVnaXN0ZXJzIHRoZSBjaGlsZCBkZXZpY2Ugd2l0aCB0aGUgdm1idXMKKyAqLworaW50IFZtYnVzQ2hpbGREZXZpY2VBZGQoc3RydWN0IGh2X2RldmljZSAqQ2hpbGREZXZpY2UpCit7CisJcmV0dXJuIHZtYnVzX2NoaWxkX2RldmljZV9yZWdpc3RlcihnRGV2aWNlLCBDaGlsZERldmljZSk7Cit9CisKKy8qCisgKiBWbWJ1c09uRGV2aWNlQWRkIC0gQ2FsbGJhY2sgd2hlbiB0aGUgcm9vdCBidXMgZGV2aWNlIGlzIGFkZGVkCisgKi8KK3N0YXRpYyBpbnQgVm1idXNPbkRldmljZUFkZChzdHJ1Y3QgaHZfZGV2aWNlICpkZXYsIHZvaWQgKkFkZGl0aW9uYWxJbmZvKQoreworCXUzMiAqaXJxdmVjdG9yID0gQWRkaXRpb25hbEluZm87CisJaW50IHJldDsKKworCWdEZXZpY2UgPSBkZXY7CisKKwltZW1jcHkoJmdEZXZpY2UtPmRldmljZVR5cGUsICZnVm1idXNEZXZpY2VUeXBlLCBzaXplb2Yoc3RydWN0IGh2X2d1aWQpKTsKKwltZW1jcHkoJmdEZXZpY2UtPmRldmljZUluc3RhbmNlLCAmZ1ZtYnVzRGV2aWNlSWQsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgaHZfZ3VpZCkpOworCisJLyogc3RyY3B5KGRldi0+bmFtZSwgInZtYnVzIik7ICovCisJLyogU3luSUMgc2V0dXAuLi4gKi8KKwlvbl9lYWNoX2NwdShodl9zeW5pY19pbml0LCAodm9pZCAqKWlycXZlY3RvciwgMSk7CisKKwkvKiBDb25uZWN0IHRvIFZNQnVzIGluIHRoZSByb290IHBhcnRpdGlvbiAqLworCXJldCA9IFZtYnVzQ29ubmVjdCgpOworCisJLyogVm1idXNTZW5kRXZlbnQoZGV2aWNlLT5sb2NhbFBvcnRJZCsxKTsgKi8KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogVm1idXNPbkRldmljZVJlbW92ZSAtIENhbGxiYWNrIHdoZW4gdGhlIHJvb3QgYnVzIGRldmljZSBpcyByZW1vdmVkCisgKi8KK3N0YXRpYyBpbnQgVm1idXNPbkRldmljZVJlbW92ZShzdHJ1Y3QgaHZfZGV2aWNlICpkZXYpCit7CisJaW50IHJldCA9IDA7CisKKwl2bWJ1c19yZWxlYXNlX3VuYXR0YWNoZWRfY2hhbm5lbHMoKTsKKwlWbWJ1c0Rpc2Nvbm5lY3QoKTsKKwlvbl9lYWNoX2NwdShodl9zeW5pY19jbGVhbnVwLCBOVUxMLCAxKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogVm1idXNPbkNsZWFudXAgLSBQZXJmb3JtIGFueSBjbGVhbnVwIHdoZW4gdGhlIGRyaXZlciBpcyByZW1vdmVkCisgKi8KK3N0YXRpYyB2b2lkIFZtYnVzT25DbGVhbnVwKHN0cnVjdCBodl9kcml2ZXIgKmRydikKK3sKKwkvKiBzdHJ1Y3Qgdm1idXNfZHJpdmVyICpkcml2ZXIgPSAoc3RydWN0IHZtYnVzX2RyaXZlciAqKWRydjsgKi8KKworCWh2X2NsZWFudXAoKTsKK30KKworc3RydWN0IG9ubWVzc2FnZV93b3JrX2NvbnRleHQgeworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworCXN0cnVjdCBodl9tZXNzYWdlIG1zZzsKK307CisKK3N0YXRpYyB2b2lkIHZtYnVzX29ubWVzc2FnZV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qgb25tZXNzYWdlX3dvcmtfY29udGV4dCAqY3R4OworCisJY3R4ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBvbm1lc3NhZ2Vfd29ya19jb250ZXh0LAorCQkJICAgd29yayk7CisJdm1idXNfb25tZXNzYWdlKCZjdHgtPm1zZyk7CisJa2ZyZWUoY3R4KTsKK30KKworLyoKKyAqIHZtYnVzX29uX21zZ19kcGMgLSBEUEMgcm91dGluZSB0byBoYW5kbGUgbWVzc2FnZXMgZnJvbSB0aGUgaHlwZXJ2aXNpb3IKKyAqLworc3RhdGljIHZvaWQgdm1idXNfb25fbXNnX2RwYyhzdHJ1Y3QgaHZfZHJpdmVyICpkcnYpCit7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwl2b2lkICpwYWdlX2FkZHIgPSBodl9jb250ZXh0LnN5bmljX21lc3NhZ2VfcGFnZVtjcHVdOworCXN0cnVjdCBodl9tZXNzYWdlICptc2cgPSAoc3RydWN0IGh2X21lc3NhZ2UgKilwYWdlX2FkZHIgKworCQkJCSAgVk1CVVNfTUVTU0FHRV9TSU5UOworCXN0cnVjdCBvbm1lc3NhZ2Vfd29ya19jb250ZXh0ICpjdHg7CisKKwl3aGlsZSAoMSkgeworCQlpZiAobXNnLT5oZWFkZXIubWVzc2FnZV90eXBlID09IEhWTVNHX05PTkUpIHsKKwkJCS8qIG5vIG1zZyAqLworCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQljdHggPSBrbWFsbG9jKHNpemVvZigqY3R4KSwgR0ZQX0FUT01JQyk7CisJCQlpZiAoY3R4ID09IE5VTEwpCisJCQkJY29udGludWU7CisJCQlJTklUX1dPUksoJmN0eC0+d29yaywgdm1idXNfb25tZXNzYWdlX3dvcmspOworCQkJbWVtY3B5KCZjdHgtPm1zZywgbXNnLCBzaXplb2YoKm1zZykpOworCQkJcXVldWVfd29yayhnVm1idXNDb25uZWN0aW9uLldvcmtRdWV1ZSwgJmN0eC0+d29yayk7CisJCX0KKworCQltc2ctPmhlYWRlci5tZXNzYWdlX3R5cGUgPSBIVk1TR19OT05FOworCisJCS8qCisJCSAqIE1ha2Ugc3VyZSB0aGUgd3JpdGUgdG8gTWVzc2FnZVR5cGUgKGllIHNldCB0bworCQkgKiBIVk1TR19OT05FKSBoYXBwZW5zIGJlZm9yZSB3ZSByZWFkIHRoZQorCQkgKiBNZXNzYWdlUGVuZGluZyBhbmQgRU9NaW5nLiBPdGhlcndpc2UsIHRoZSBFT01pbmcKKwkJICogd2lsbCBub3QgZGVsaXZlciBhbnkgbW9yZSBtZXNzYWdlcyBzaW5jZSB0aGVyZSBpcworCQkgKiBubyBlbXB0eSBzbG90CisJCSAqLworCQltYigpOworCisJCWlmIChtc2ctPmhlYWRlci5tZXNzYWdlX2ZsYWdzLm1zZ19wZW5kaW5nKSB7CisJCQkvKgorCQkJICogVGhpcyB3aWxsIGNhdXNlIG1lc3NhZ2UgcXVldWUgcmVzY2FuIHRvCisJCQkgKiBwb3NzaWJseSBkZWxpdmVyIGFub3RoZXIgbXNnIGZyb20gdGhlCisJCQkgKiBoeXBlcnZpc29yCisJCQkgKi8KKwkJCXdybXNybChIVl9YNjRfTVNSX0VPTSwgMCk7CisJCX0KKwl9Cit9CisKKy8qCisgKiB2bWJ1c19vbl9pc3IgLSBJU1Igcm91dGluZQorICovCitzdGF0aWMgaW50IHZtYnVzX29uX2lzcihzdHJ1Y3QgaHZfZHJpdmVyICpkcnYpCit7CisJaW50IHJldCA9IDA7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwl2b2lkICpwYWdlX2FkZHI7CisJc3RydWN0IGh2X21lc3NhZ2UgKm1zZzsKKwl1bmlvbiBodl9zeW5pY19ldmVudF9mbGFncyAqZXZlbnQ7CisKKwlwYWdlX2FkZHIgPSBodl9jb250ZXh0LnN5bmljX21lc3NhZ2VfcGFnZVtjcHVdOworCW1zZyA9IChzdHJ1Y3QgaHZfbWVzc2FnZSAqKXBhZ2VfYWRkciArIFZNQlVTX01FU1NBR0VfU0lOVDsKKworCS8qIENoZWNrIGlmIHRoZXJlIGFyZSBhY3R1YWwgbXNncyB0byBiZSBwcm9jZXNzICovCisJaWYgKG1zZy0+aGVhZGVyLm1lc3NhZ2VfdHlwZSAhPSBIVk1TR19OT05FKSB7CisJCURQUklOVF9EQkcoVk1CVVMsICJyZWNlaXZlZCBtc2cgdHlwZSAlZCBzaXplICVkIiwKKwkJCQltc2ctPmhlYWRlci5tZXNzYWdlX3R5cGUsCisJCQkJbXNnLT5oZWFkZXIucGF5bG9hZF9zaXplKTsKKwkJcmV0IHw9IDB4MTsKKwl9CisKKwkvKiBUT0RPOiBDaGVjayBpZiB0aGVyZSBhcmUgZXZlbnRzIHRvIGJlIHByb2Nlc3MgKi8KKwlwYWdlX2FkZHIgPSBodl9jb250ZXh0LnN5bmljX2V2ZW50X3BhZ2VbY3B1XTsKKwlldmVudCA9ICh1bmlvbiBodl9zeW5pY19ldmVudF9mbGFncyAqKXBhZ2VfYWRkciArIFZNQlVTX01FU1NBR0VfU0lOVDsKKworCS8qIFNpbmNlIHdlIGFyZSBhIGNoaWxkLCB3ZSBvbmx5IG5lZWQgdG8gY2hlY2sgYml0IDAgKi8KKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KDAsICh1bnNpZ25lZCBsb25nICopICZldmVudC0+ZmxhZ3MzMlswXSkpIHsKKwkJRFBSSU5UX0RCRyhWTUJVUywgInJlY2VpdmVkIGV2ZW50ICVkIiwgZXZlbnQtPmZsYWdzMzJbMF0pOworCQlyZXQgfD0gMHgyOworCX0KKworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyB2b2lkIGdldF9jaGFubmVsX2luZm8oc3RydWN0IGh2X2RldmljZSAqZGV2aWNlLAogCQkJICAgICBzdHJ1Y3QgaHZfZGV2aWNlX2luZm8gKmluZm8pCiB7CkBAIC0xMzksMzUgKzMwOSwzOCBAQAogCiAJdm1idXNfZ2V0X2RlYnVnX2luZm8oZGV2aWNlLT5jaGFubmVsLCAmZGVidWdfaW5mbyk7CiAKLQlpbmZvLT5DaGFubmVsSWQgPSBkZWJ1Z19pbmZvLlJlbElkOwotCWluZm8tPkNoYW5uZWxTdGF0ZSA9IGRlYnVnX2luZm8uU3RhdGU7Ci0JbWVtY3B5KCZpbmZvLT5DaGFubmVsVHlwZSwgJmRlYnVnX2luZm8uSW50ZXJmYWNlVHlwZSwKKwlpbmZvLT5DaGFubmVsSWQgPSBkZWJ1Z19pbmZvLnJlbGlkOworCWluZm8tPkNoYW5uZWxTdGF0ZSA9IGRlYnVnX2luZm8uc3RhdGU7CisJbWVtY3B5KCZpbmZvLT5DaGFubmVsVHlwZSwgJmRlYnVnX2luZm8uaW50ZXJmYWNldHlwZSwKIAkgICAgICAgc2l6ZW9mKHN0cnVjdCBodl9ndWlkKSk7Ci0JbWVtY3B5KCZpbmZvLT5DaGFubmVsSW5zdGFuY2UsICZkZWJ1Z19pbmZvLkludGVyZmFjZUluc3RhbmNlLAorCW1lbWNweSgmaW5mby0+Q2hhbm5lbEluc3RhbmNlLCAmZGVidWdfaW5mby5pbnRlcmZhY2VfaW5zdGFuY2UsCiAJICAgICAgIHNpemVvZihzdHJ1Y3QgaHZfZ3VpZCkpOwogCi0JaW5mby0+TW9uaXRvcklkID0gZGVidWdfaW5mby5Nb25pdG9ySWQ7CisJaW5mby0+TW9uaXRvcklkID0gZGVidWdfaW5mby5tb25pdG9yaWQ7CiAKLQlpbmZvLT5TZXJ2ZXJNb25pdG9yUGVuZGluZyA9IGRlYnVnX2luZm8uU2VydmVyTW9uaXRvclBlbmRpbmc7Ci0JaW5mby0+U2VydmVyTW9uaXRvckxhdGVuY3kgPSBkZWJ1Z19pbmZvLlNlcnZlck1vbml0b3JMYXRlbmN5OwotCWluZm8tPlNlcnZlck1vbml0b3JDb25uZWN0aW9uSWQgPSBkZWJ1Z19pbmZvLlNlcnZlck1vbml0b3JDb25uZWN0aW9uSWQ7CisJaW5mby0+U2VydmVyTW9uaXRvclBlbmRpbmcgPSBkZWJ1Z19pbmZvLnNlcnZlcm1vbml0b3JfcGVuZGluZzsKKwlpbmZvLT5TZXJ2ZXJNb25pdG9yTGF0ZW5jeSA9IGRlYnVnX2luZm8uc2VydmVybW9uaXRvcl9sYXRlbmN5OworCWluZm8tPlNlcnZlck1vbml0b3JDb25uZWN0aW9uSWQgPSBkZWJ1Z19pbmZvLnNlcnZlcm1vbml0b3JfY29ubmVjdGlvbmlkOwogCi0JaW5mby0+Q2xpZW50TW9uaXRvclBlbmRpbmcgPSBkZWJ1Z19pbmZvLkNsaWVudE1vbml0b3JQZW5kaW5nOwotCWluZm8tPkNsaWVudE1vbml0b3JMYXRlbmN5ID0gZGVidWdfaW5mby5DbGllbnRNb25pdG9yTGF0ZW5jeTsKLQlpbmZvLT5DbGllbnRNb25pdG9yQ29ubmVjdGlvbklkID0gZGVidWdfaW5mby5DbGllbnRNb25pdG9yQ29ubmVjdGlvbklkOworCWluZm8tPkNsaWVudE1vbml0b3JQZW5kaW5nID0gZGVidWdfaW5mby5jbGllbnRtb25pdG9yX3BlbmRpbmc7CisJaW5mby0+Q2xpZW50TW9uaXRvckxhdGVuY3kgPSBkZWJ1Z19pbmZvLmNsaWVudG1vbml0b3JfbGF0ZW5jeTsKKwlpbmZvLT5DbGllbnRNb25pdG9yQ29ubmVjdGlvbklkID0gZGVidWdfaW5mby5jbGllbnRtb25pdG9yX2Nvbm5lY3Rpb25pZDsKIAotCWluZm8tPkluYm91bmQuSW50ZXJydXB0TWFzayA9IGRlYnVnX2luZm8uSW5ib3VuZC5DdXJyZW50SW50ZXJydXB0TWFzazsKLQlpbmZvLT5JbmJvdW5kLlJlYWRJbmRleCA9IGRlYnVnX2luZm8uSW5ib3VuZC5DdXJyZW50UmVhZEluZGV4OwotCWluZm8tPkluYm91bmQuV3JpdGVJbmRleCA9IGRlYnVnX2luZm8uSW5ib3VuZC5DdXJyZW50V3JpdGVJbmRleDsKLQlpbmZvLT5JbmJvdW5kLkJ5dGVzQXZhaWxUb1JlYWQgPSBkZWJ1Z19pbmZvLkluYm91bmQuQnl0ZXNBdmFpbFRvUmVhZDsKLQlpbmZvLT5JbmJvdW5kLkJ5dGVzQXZhaWxUb1dyaXRlID0gZGVidWdfaW5mby5JbmJvdW5kLkJ5dGVzQXZhaWxUb1dyaXRlOworCWluZm8tPkluYm91bmQuSW50ZXJydXB0TWFzayA9IGRlYnVnX2luZm8uaW5ib3VuZC5jdXJyZW50X2ludGVycnVwdF9tYXNrOworCWluZm8tPkluYm91bmQuUmVhZEluZGV4ID0gZGVidWdfaW5mby5pbmJvdW5kLmN1cnJlbnRfcmVhZF9pbmRleDsKKwlpbmZvLT5JbmJvdW5kLldyaXRlSW5kZXggPSBkZWJ1Z19pbmZvLmluYm91bmQuY3VycmVudF93cml0ZV9pbmRleDsKKwlpbmZvLT5JbmJvdW5kLkJ5dGVzQXZhaWxUb1JlYWQgPSBkZWJ1Z19pbmZvLmluYm91bmQuYnl0ZXNfYXZhaWxfdG9yZWFkOworCWluZm8tPkluYm91bmQuQnl0ZXNBdmFpbFRvV3JpdGUgPQorCQlkZWJ1Z19pbmZvLmluYm91bmQuYnl0ZXNfYXZhaWxfdG93cml0ZTsKIAotCWluZm8tPk91dGJvdW5kLkludGVycnVwdE1hc2sgPSBkZWJ1Z19pbmZvLk91dGJvdW5kLkN1cnJlbnRJbnRlcnJ1cHRNYXNrOwotCWluZm8tPk91dGJvdW5kLlJlYWRJbmRleCA9IGRlYnVnX2luZm8uT3V0Ym91bmQuQ3VycmVudFJlYWRJbmRleDsKLQlpbmZvLT5PdXRib3VuZC5Xcml0ZUluZGV4ID0gZGVidWdfaW5mby5PdXRib3VuZC5DdXJyZW50V3JpdGVJbmRleDsKLQlpbmZvLT5PdXRib3VuZC5CeXRlc0F2YWlsVG9SZWFkID0gZGVidWdfaW5mby5PdXRib3VuZC5CeXRlc0F2YWlsVG9SZWFkOworCWluZm8tPk91dGJvdW5kLkludGVycnVwdE1hc2sgPQorCQlkZWJ1Z19pbmZvLm91dGJvdW5kLmN1cnJlbnRfaW50ZXJydXB0X21hc2s7CisJaW5mby0+T3V0Ym91bmQuUmVhZEluZGV4ID0gZGVidWdfaW5mby5vdXRib3VuZC5jdXJyZW50X3JlYWRfaW5kZXg7CisJaW5mby0+T3V0Ym91bmQuV3JpdGVJbmRleCA9IGRlYnVnX2luZm8ub3V0Ym91bmQuY3VycmVudF93cml0ZV9pbmRleDsKKwlpbmZvLT5PdXRib3VuZC5CeXRlc0F2YWlsVG9SZWFkID0KKwkJZGVidWdfaW5mby5vdXRib3VuZC5ieXRlc19hdmFpbF90b3JlYWQ7CiAJaW5mby0+T3V0Ym91bmQuQnl0ZXNBdmFpbFRvV3JpdGUgPQotCQlkZWJ1Z19pbmZvLk91dGJvdW5kLkJ5dGVzQXZhaWxUb1dyaXRlOworCQlkZWJ1Z19pbmZvLm91dGJvdW5kLmJ5dGVzX2F2YWlsX3Rvd3JpdGU7CiB9CiAKIC8qCkBAIC0yODYsNDQgKzQ1OSw1NSBAQAogICoJLSBzZXR1cCB0aGUgdm1idXMgcm9vdCBkZXZpY2UKICAqCS0gcmV0cmlldmUgdGhlIGNoYW5uZWwgb2ZmZXJzCiAgKi8KLXN0YXRpYyBpbnQgdm1idXNfYnVzX2luaXQoaW50ICgqZHJ2X2luaXQpKHN0cnVjdCBodl9kcml2ZXIgKmRydikpCitzdGF0aWMgaW50IHZtYnVzX2J1c19pbml0KHZvaWQpCiB7CiAJc3RydWN0IHZtYnVzX2RyaXZlcl9jb250ZXh0ICp2bWJ1c19kcnZfY3R4ID0gJmdfdm1idXNfZHJ2OwotCXN0cnVjdCB2bWJ1c19kcml2ZXIgKnZtYnVzX2Rydl9vYmogPSAmZ192bWJ1c19kcnYuZHJ2X29iajsKKwlzdHJ1Y3QgaHZfZHJpdmVyICpkcml2ZXIgPSAmZ192bWJ1c19kcnYuZHJ2X29iajsKIAlzdHJ1Y3Qgdm1fZGV2aWNlICpkZXZfY3R4ID0gJmdfdm1idXNfZHJ2LmRldmljZV9jdHg7CiAJaW50IHJldDsKIAl1bnNpZ25lZCBpbnQgdmVjdG9yOwogCi0JLyoKLQkgKiBTZXQgdGhpcyB1cCB0byBhbGxvdyBsb3dlciBsYXllciB0byBjYWxsYmFjayB0byBhZGQvcmVtb3ZlIGNoaWxkCi0JICogZGV2aWNlcyBvbiB0aGUgYnVzCi0JICovCi0Jdm1idXNfZHJ2X29iai0+T25DaGlsZERldmljZUNyZWF0ZSA9IHZtYnVzX2NoaWxkX2RldmljZV9jcmVhdGU7Ci0Jdm1idXNfZHJ2X29iai0+T25DaGlsZERldmljZURlc3Ryb3kgPSB2bWJ1c19jaGlsZF9kZXZpY2VfZGVzdHJveTsKLQl2bWJ1c19kcnZfb2JqLT5PbkNoaWxkRGV2aWNlQWRkID0gdm1idXNfY2hpbGRfZGV2aWNlX3JlZ2lzdGVyOwotCXZtYnVzX2Rydl9vYmotPk9uQ2hpbGREZXZpY2VSZW1vdmUgPSB2bWJ1c19jaGlsZF9kZXZpY2VfdW5yZWdpc3RlcjsKKwlEUFJJTlRfSU5GTyhWTUJVUywgIisrKysrKysgSFYgRHJpdmVyIHZlcnNpb24gPSAlcyArKysrKysrIiwKKwkJICAgIEhWX0RSVl9WRVJTSU9OKTsKKwlEUFJJTlRfSU5GTyhWTUJVUywgIisrKysrKysgVm1idXMgc3VwcG9ydGVkIHZlcnNpb24gPSAlZCArKysrKysrIiwKKwkJCVZNQlVTX1JFVklTSU9OX05VTUJFUik7CisJRFBSSU5UX0lORk8oVk1CVVMsICIrKysrKysrIFZtYnVzIHVzaW5nIFNJTlQgJWQgKysrKysrKyIsCisJCQlWTUJVU19NRVNTQUdFX1NJTlQpOworCURQUklOVF9EQkcoVk1CVVMsICJzaXplb2Yodm1idXNfY2hhbm5lbF9wYWNrZXRfcGFnZV9idWZmZXIpPSV6ZCwgIgorCQkJInNpemVvZihWTUJVU19DSEFOTkVMX1BBQ0tFVF9NVUxJVFBBR0VfQlVGRkVSKT0lemQiLAorCQkJc2l6ZW9mKHN0cnVjdCB2bWJ1c19jaGFubmVsX3BhY2tldF9wYWdlX2J1ZmZlciksCisJCQlzaXplb2Yoc3RydWN0IHZtYnVzX2NoYW5uZWxfcGFja2V0X211bHRpcGFnZV9idWZmZXIpKTsKIAotCS8qIENhbGwgdG8gYnVzIGRyaXZlciB0byBpbml0aWFsaXplICovCi0JcmV0ID0gZHJ2X2luaXQoJnZtYnVzX2Rydl9vYmotPkJhc2UpOworCWRyaXZlci0+bmFtZSA9IGdEcml2ZXJOYW1lOworCW1lbWNweSgmZHJpdmVyLT5kZXZpY2VUeXBlLCAmZ1ZtYnVzRGV2aWNlVHlwZSwgc2l6ZW9mKHN0cnVjdCBodl9ndWlkKSk7CisKKwkvKiBTZXR1cCBkaXNwYXRjaCB0YWJsZSAqLworCWRyaXZlci0+T25EZXZpY2VBZGQJPSBWbWJ1c09uRGV2aWNlQWRkOworCWRyaXZlci0+T25EZXZpY2VSZW1vdmUJPSBWbWJ1c09uRGV2aWNlUmVtb3ZlOworCWRyaXZlci0+T25DbGVhbnVwCT0gVm1idXNPbkNsZWFudXA7CisKKwkvKiBIeXBlcnZpc29yIGluaXRpYWxpemF0aW9uLi4uc2V0dXAgaHlwZXJjYWxsIHBhZ2UuLmV0YyAqLworCXJldCA9IGh2X2luaXQoKTsKIAlpZiAocmV0ICE9IDApIHsKLQkJRFBSSU5UX0VSUihWTUJVU19EUlYsICJVbmFibGUgdG8gaW5pdGlhbGl6ZSB2bWJ1cyAoJWQpIiwgcmV0KTsKKwkJRFBSSU5UX0VSUihWTUJVUywgIlVuYWJsZSB0byBpbml0aWFsaXplIHRoZSBoeXBlcnZpc29yIC0gMHgleCIsCisJCQkJcmV0KTsKIAkJZ290byBjbGVhbnVwOwogCX0KIAogCS8qIFNhbml0eSBjaGVja3MgKi8KLQlpZiAoIXZtYnVzX2Rydl9vYmotPkJhc2UuT25EZXZpY2VBZGQpIHsKKwlpZiAoIWRyaXZlci0+T25EZXZpY2VBZGQpIHsKIAkJRFBSSU5UX0VSUihWTUJVU19EUlYsICJPbkRldmljZUFkZCgpIHJvdXRpbmUgbm90IHNldCIpOwogCQlyZXQgPSAtMTsKIAkJZ290byBjbGVhbnVwOwogCX0KIAotCXZtYnVzX2Rydl9jdHgtPmJ1cy5uYW1lID0gdm1idXNfZHJ2X29iai0+QmFzZS5uYW1lOworCXZtYnVzX2Rydl9jdHgtPmJ1cy5uYW1lID0gZHJpdmVyLT5uYW1lOwogCiAJLyogSW5pdGlhbGl6ZSB0aGUgYnVzIGNvbnRleHQgKi8KIAl0YXNrbGV0X2luaXQoJnZtYnVzX2Rydl9jdHgtPm1zZ19kcGMsIHZtYnVzX21zZ19kcGMsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcpdm1idXNfZHJ2X29iaik7CisJCSAgICAgKHVuc2lnbmVkIGxvbmcpZHJpdmVyKTsKIAl0YXNrbGV0X2luaXQoJnZtYnVzX2Rydl9jdHgtPmV2ZW50X2RwYywgdm1idXNfZXZlbnRfZHBjLAotCQkgICAgICh1bnNpZ25lZCBsb25nKXZtYnVzX2Rydl9vYmopOworCQkgICAgICh1bnNpZ25lZCBsb25nKWRyaXZlcik7CiAKIAkvKiBOb3csIHJlZ2lzdGVyIHRoZSBidXMgZHJpdmVyIHdpdGggTERNICovCiAJcmV0ID0gYnVzX3JlZ2lzdGVyKCZ2bWJ1c19kcnZfY3R4LT5idXMpOwpAQCAtMzM0LDcgKzUxOCw3IEBACiAKIAkvKiBHZXQgdGhlIGludGVycnVwdCByZXNvdXJjZSAqLwogCXJldCA9IHJlcXVlc3RfaXJxKHZtYnVzX2lycSwgdm1idXNfaXNyLCBJUlFGX1NBTVBMRV9SQU5ET00sCi0JCQkgIHZtYnVzX2Rydl9vYmotPkJhc2UubmFtZSwgTlVMTCk7CisJCQkgIGRyaXZlci0+bmFtZSwgTlVMTCk7CiAKIAlpZiAocmV0ICE9IDApIHsKIAkJRFBSSU5UX0VSUihWTUJVU19EUlYsICJFUlJPUiAtIFVuYWJsZSB0byByZXF1ZXN0IElSUSAlZCIsCkBAIC0zNTIsNyArNTM2LDcgQEAKIAkvKiBDYWxsIHRvIGJ1cyBkcml2ZXIgdG8gYWRkIHRoZSByb290IGRldmljZSAqLwogCW1lbXNldChkZXZfY3R4LCAwLCBzaXplb2Yoc3RydWN0IHZtX2RldmljZSkpOwogCi0JcmV0ID0gdm1idXNfZHJ2X29iai0+QmFzZS5PbkRldmljZUFkZCgmZGV2X2N0eC0+ZGV2aWNlX29iaiwgJnZlY3Rvcik7CisJcmV0ID0gZHJpdmVyLT5PbkRldmljZUFkZCgmZGV2X2N0eC0+ZGV2aWNlX29iaiwgJnZlY3Rvcik7CiAJaWYgKHJldCAhPSAwKSB7CiAJCURQUklOVF9FUlIoVk1CVVNfRFJWLAogCQkJICAgIkVSUk9SIC0gVW5hYmxlIHRvIGFkZCB2bWJ1cyByb290IGRldmljZSIpOwpAQCAtMzkyLDkgKzU3Niw3IEBACiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKLQotCXZtYnVzX2Rydl9vYmotPkdldENoYW5uZWxPZmZlcnMoKTsKLQorCXZtYnVzX3JlcXVlc3Rfb2ZmZXJzKCk7CiAJd2FpdF9mb3JfY29tcGxldGlvbigmaHZfY2hhbm5lbF9yZWFkeSk7CiAKIGNsZWFudXA6CkBAIC00MDgsMTcgKzU5MCwxNyBAQAogICovCiBzdGF0aWMgdm9pZCB2bWJ1c19idXNfZXhpdCh2b2lkKQogewotCXN0cnVjdCB2bWJ1c19kcml2ZXIgKnZtYnVzX2Rydl9vYmogPSAmZ192bWJ1c19kcnYuZHJ2X29iajsKKwlzdHJ1Y3QgaHZfZHJpdmVyICpkcml2ZXIgPSAmZ192bWJ1c19kcnYuZHJ2X29iajsKIAlzdHJ1Y3Qgdm1idXNfZHJpdmVyX2NvbnRleHQgKnZtYnVzX2Rydl9jdHggPSAmZ192bWJ1c19kcnY7CiAKIAlzdHJ1Y3Qgdm1fZGV2aWNlICpkZXZfY3R4ID0gJmdfdm1idXNfZHJ2LmRldmljZV9jdHg7CiAKIAkvKiBSZW1vdmUgdGhlIHJvb3QgZGV2aWNlICovCi0JaWYgKHZtYnVzX2Rydl9vYmotPkJhc2UuT25EZXZpY2VSZW1vdmUpCi0JCXZtYnVzX2Rydl9vYmotPkJhc2UuT25EZXZpY2VSZW1vdmUoJmRldl9jdHgtPmRldmljZV9vYmopOworCWlmIChkcml2ZXItPk9uRGV2aWNlUmVtb3ZlKQorCQlkcml2ZXItPk9uRGV2aWNlUmVtb3ZlKCZkZXZfY3R4LT5kZXZpY2Vfb2JqKTsKIAotCWlmICh2bWJ1c19kcnZfb2JqLT5CYXNlLk9uQ2xlYW51cCkKLQkJdm1idXNfZHJ2X29iai0+QmFzZS5PbkNsZWFudXAoJnZtYnVzX2Rydl9vYmotPkJhc2UpOworCWlmIChkcml2ZXItPk9uQ2xlYW51cCkKKwkJZHJpdmVyLT5PbkNsZWFudXAoZHJpdmVyKTsKIAogCS8qIFVucmVnaXN0ZXIgdGhlIHJvb3QgYnVzIGRldmljZSAqLwogCWRldmljZV91bnJlZ2lzdGVyKCZkZXZfY3R4LT5kZXZpY2UpOwpAQCAtNDQ2LDcgKzYyOCw2IEBACiAgKi8KIGludCB2bWJ1c19jaGlsZF9kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IGRyaXZlcl9jb250ZXh0ICpkcml2ZXJfY3R4KQogewotCXN0cnVjdCB2bWJ1c19kcml2ZXIgKnZtYnVzX2Rydl9vYmogPSAmZ192bWJ1c19kcnYuZHJ2X29iajsKIAlpbnQgcmV0OwogCiAJRFBSSU5UX0lORk8oVk1CVVNfRFJWLCAiY2hpbGQgZHJpdmVyICglcCkgcmVnaXN0ZXJpbmcgLSBuYW1lICVzIiwKQEAgLTQ1Nyw3ICs2MzgsNyBAQAogCiAJcmV0ID0gZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXJfY3R4LT5kcml2ZXIpOwogCi0Jdm1idXNfZHJ2X29iai0+R2V0Q2hhbm5lbE9mZmVycygpOworCXZtYnVzX3JlcXVlc3Rfb2ZmZXJzKCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNDg5LDkgKzY3MCw5IEBACiAgKiB2bWJ1c19jaGlsZF9kZXZpY2VfY3JlYXRlIC0gQ3JlYXRlcyBhbmQgcmVnaXN0ZXJzIGEgbmV3IGNoaWxkIGRldmljZQogICogb24gdGhlIHZtYnVzLgogICovCi1zdGF0aWMgc3RydWN0IGh2X2RldmljZSAqdm1idXNfY2hpbGRfZGV2aWNlX2NyZWF0ZShzdHJ1Y3QgaHZfZ3VpZCAqdHlwZSwKLQkJCQkJCSAgIHN0cnVjdCBodl9ndWlkICppbnN0YW5jZSwKLQkJCQkJCSAgIHN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsKQorc3RydWN0IGh2X2RldmljZSAqdm1idXNfY2hpbGRfZGV2aWNlX2NyZWF0ZShzdHJ1Y3QgaHZfZ3VpZCAqdHlwZSwKKwkJCQkJICAgIHN0cnVjdCBodl9ndWlkICppbnN0YW5jZSwKKwkJCQkJICAgIHN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsKQogewogCXN0cnVjdCB2bV9kZXZpY2UgKmNoaWxkX2RldmljZV9jdHg7CiAJc3RydWN0IGh2X2RldmljZSAqY2hpbGRfZGV2aWNlX29iajsKQEAgLTUzOCw4ICs3MTksOCBAQAogLyoKICAqIHZtYnVzX2NoaWxkX2RldmljZV9yZWdpc3RlciAtIFJlZ2lzdGVyIHRoZSBjaGlsZCBkZXZpY2Ugb24gdGhlIHNwZWNpZmllZCBidXMKICAqLwotc3RhdGljIGludCB2bWJ1c19jaGlsZF9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IGh2X2RldmljZSAqcm9vdF9kZXZpY2Vfb2JqLAotCQkJCSAgICAgICBzdHJ1Y3QgaHZfZGV2aWNlICpjaGlsZF9kZXZpY2Vfb2JqKQoraW50IHZtYnVzX2NoaWxkX2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgaHZfZGV2aWNlICpyb290X2RldmljZV9vYmosCisJCQkJc3RydWN0IGh2X2RldmljZSAqY2hpbGRfZGV2aWNlX29iaikKIHsKIAlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3Qgdm1fZGV2aWNlICpyb290X2RldmljZV9jdHggPQpAQCAtNTgzLDcgKzc2NCw3IEBACiAgKiB2bWJ1c19jaGlsZF9kZXZpY2VfdW5yZWdpc3RlciAtIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGNoaWxkIGRldmljZQogICogZnJvbSB0aGUgdm1idXMuCiAgKi8KLXN0YXRpYyB2b2lkIHZtYnVzX2NoaWxkX2RldmljZV91bnJlZ2lzdGVyKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZV9vYmopCit2b2lkIHZtYnVzX2NoaWxkX2RldmljZV91bnJlZ2lzdGVyKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZV9vYmopCiB7CiAJc3RydWN0IHZtX2RldmljZSAqZGV2aWNlX2N0eCA9IHRvX3ZtX2RldmljZShkZXZpY2Vfb2JqKTsKIApAQCAtNjAxLDEzICs3ODIsNiBAQAogfQogCiAvKgotICogdm1idXNfY2hpbGRfZGV2aWNlX2Rlc3Ryb3kgLSBEZXN0cm95IHRoZSBzcGVjaWZpZWQgY2hpbGQgZGV2aWNlIG9uIHRoZSB2bWJ1cy4KLSAqLwotc3RhdGljIHZvaWQgdm1idXNfY2hpbGRfZGV2aWNlX2Rlc3Ryb3koc3RydWN0IGh2X2RldmljZSAqZGV2aWNlX29iaikKLXsKLX0KLQotLyoKICAqIHZtYnVzX3VldmVudCAtIGFkZCB1ZXZlbnQgZm9yIG91ciBkZXZpY2UKICAqCiAgKiBUaGlzIHJvdXRpbmUgaXMgaW52b2tlZCB3aGVuIGEgZGV2aWNlIGlzIGFkZGVkIG9yIHJlbW92ZWQgb24gdGhlIHZtYnVzIHRvCkBAIC03MDEsNyArODc1LDcgQEAKIAkJc3RydWN0IHZtYnVzX2RyaXZlcl9jb250ZXh0ICp2bWJ1c19kcnZfY3R4ID0KIAkJCShzdHJ1Y3Qgdm1idXNfZHJpdmVyX2NvbnRleHQgKilkcml2ZXJfY3R4OwogCi0JCWRldmljZV9jdHgtPmRldmljZV9vYmouRHJpdmVyID0gJnZtYnVzX2Rydl9jdHgtPmRydl9vYmouQmFzZTsKKwkJZGV2aWNlX2N0eC0+ZGV2aWNlX29iai5Ecml2ZXIgPSAmdm1idXNfZHJ2X2N0eC0+ZHJ2X29iajsKIAkJRFBSSU5UX0lORk8oVk1CVVNfRFJWLAogCQkJICAgICJkZXZpY2Ugb2JqZWN0ICglcCkgc2V0IHRvIGRyaXZlciBvYmplY3QgKCVwKSIsCiAJCQkgICAgJmRldmljZV9jdHgtPmRldmljZV9vYmosCkBAIC04NDksNyArMTAyMyw2IEBACiB7CiAJc3RydWN0IHZtX2RldmljZSAqZGV2aWNlX2N0eCA9IGRldmljZV90b192bV9kZXZpY2UoZGV2aWNlKTsKIAotCS8qIHZtYnVzX2NoaWxkX2RldmljZV9kZXN0cm95KCZkZXZpY2VfY3R4LT5kZXZpY2Vfb2JqKTsgKi8KIAlrZnJlZShkZXZpY2VfY3R4KTsKIAogCS8qICEhRE8gTk9UIFJFRkVSRU5DRSBkZXZpY2VfY3R4IGFueW1vcmUgYXQgdGhpcyBwb2ludCEhICovCkBAIC04NjAsMzYgKzEwMzMsMjggQEAKICAqLwogc3RhdGljIHZvaWQgdm1idXNfbXNnX2RwYyh1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0Jc3RydWN0IHZtYnVzX2RyaXZlciAqdm1idXNfZHJ2X29iaiA9IChzdHJ1Y3Qgdm1idXNfZHJpdmVyICopZGF0YTsKLQotCS8qIEFTU0VSVCh2bWJ1c19kcnZfb2JqLT5Pbk1zZ0RwYyAhPSBOVUxMKTsgKi8KKwlzdHJ1Y3QgaHZfZHJpdmVyICpkcml2ZXIgPSAoc3RydWN0IGh2X2RyaXZlciAqKWRhdGE7CiAKIAkvKiBDYWxsIHRvIGJ1cyBkcml2ZXIgdG8gaGFuZGxlIGludGVycnVwdCAqLwotCXZtYnVzX2Rydl9vYmotPk9uTXNnRHBjKCZ2bWJ1c19kcnZfb2JqLT5CYXNlKTsKKwl2bWJ1c19vbl9tc2dfZHBjKGRyaXZlcik7CiB9CiAKIC8qCi0gKiB2bWJ1c19tc2dfZHBjIC0gVGFza2xldCByb3V0aW5lIHRvIGhhbmRsZSBoeXBlcnZpc29yIGV2ZW50cworICogdm1idXNfZXZlbnRfZHBjIC0gVGFza2xldCByb3V0aW5lIHRvIGhhbmRsZSBoeXBlcnZpc29yIGV2ZW50cwogICovCiBzdGF0aWMgdm9pZCB2bWJ1c19ldmVudF9kcGModW5zaWduZWQgbG9uZyBkYXRhKQogewotCXN0cnVjdCB2bWJ1c19kcml2ZXIgKnZtYnVzX2Rydl9vYmogPSAoc3RydWN0IHZtYnVzX2RyaXZlciAqKWRhdGE7Ci0KLQkvKiBBU1NFUlQodm1idXNfZHJ2X29iai0+T25FdmVudERwYyAhPSBOVUxMKTsgKi8KLQogCS8qIENhbGwgdG8gYnVzIGRyaXZlciB0byBoYW5kbGUgaW50ZXJydXB0ICovCi0Jdm1idXNfZHJ2X29iai0+T25FdmVudERwYygmdm1idXNfZHJ2X29iai0+QmFzZSk7CisJVm1idXNPbkV2ZW50cygpOwogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3Qgdm1idXNfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLQlzdHJ1Y3Qgdm1idXNfZHJpdmVyICp2bWJ1c19kcml2ZXJfb2JqID0gJmdfdm1idXNfZHJ2LmRydl9vYmo7CisJc3RydWN0IGh2X2RyaXZlciAqZHJpdmVyID0gJmdfdm1idXNfZHJ2LmRydl9vYmo7CiAJaW50IHJldDsKIAotCS8qIEFTU0VSVCh2bWJ1c19kcml2ZXJfb2JqLT5PbklzciAhPSBOVUxMKTsgKi8KLQogCS8qIENhbGwgdG8gYnVzIGRyaXZlciB0byBoYW5kbGUgaW50ZXJydXB0ICovCi0JcmV0ID0gdm1idXNfZHJpdmVyX29iai0+T25Jc3IoJnZtYnVzX2RyaXZlcl9vYmotPkJhc2UpOworCXJldCA9IHZtYnVzX29uX2lzcihkcml2ZXIpOwogCiAJLyogU2NoZWR1bGVzIGEgZHBjIGlmIG5lY2Vzc2FyeSAqLwogCWlmIChyZXQgPiAwKSB7CkBAIC05MjgsNyArMTA5Myw3IEBACiAJaWYgKCFkbWlfY2hlY2tfc3lzdGVtKG1pY3Jvc29mdF9odl9kbWlfdGFibGUpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXJldHVybiB2bWJ1c19idXNfaW5pdChWbWJ1c0luaXRpYWxpemUpOworCXJldHVybiB2bWJ1c19idXNfaW5pdCgpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgdm1idXNfZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L3ZtYnVzX3ByaXZhdGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9odi92bWJ1c19wcml2YXRlLmgKaW5kZXggMDllYWVjOS4uMDdmNmQyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L3ZtYnVzX3ByaXZhdGUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaHYvdm1idXNfcHJpdmF0ZS5oCkBAIC0xMDIsMTMgKzEwMiwxNCBAQAogCiAvKiBHZW5lcmFsIHZtYnVzIGludGVyZmFjZSAqLwogCi1zdHJ1Y3QgaHZfZGV2aWNlICpWbWJ1c0NoaWxkRGV2aWNlQ3JlYXRlKHN0cnVjdCBodl9ndWlkICpkZXZpY2VUeXBlLAorc3RydWN0IGh2X2RldmljZSAqdm1idXNfY2hpbGRfZGV2aWNlX2NyZWF0ZShzdHJ1Y3QgaHZfZ3VpZCAqZGV2aWNlVHlwZSwKIAkJCQkJIHN0cnVjdCBodl9ndWlkICpkZXZpY2VJbnN0YW5jZSwKIAkJCQkJIHN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsKTsKIAogaW50IFZtYnVzQ2hpbGREZXZpY2VBZGQoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlKTsKLQotdm9pZCBWbWJ1c0NoaWxkRGV2aWNlUmVtb3ZlKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSk7CitpbnQgdm1idXNfY2hpbGRfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBodl9kZXZpY2UgKnJvb3RfZGV2aWNlX29iaiwKKwkJCQlzdHJ1Y3QgaHZfZGV2aWNlICpjaGlsZF9kZXZpY2Vfb2JqKTsKK3ZvaWQgdm1idXNfY2hpbGRfZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlX29iaik7CiAKIC8qIHN0YXRpYyB2b2lkICovCiAvKiBWbWJ1c0NoaWxkRGV2aWNlRGVzdHJveSggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi92c3RvcmFnZS5oIGIvZHJpdmVycy9zdGFnaW5nL2h2L3ZzdG9yYWdlLmgKaW5kZXggNGVhNTk3ZC4uYWU4YmU4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L3ZzdG9yYWdlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L3ZzdG9yYWdlLmgKQEAgLTI3LDE1ICsyNywxNyBAQAogCiAjZGVmaW5lIFJFVklTSU9OX1NUUklORyhSRVZJU0lPTl8pICNSRVZJU0lPTl8KICNkZWZpbmUgRklMTF9WTVNUT1JfUkVWSVNJT04oUkVTVUxUX0xWQUxVRV8pCQkJCVwKLXsJCQkJCQkJCQlcCi0JY2hhciAqcmV2aXNpb25TdHJpbmcgPSBSRVZJU0lPTl9TVFJJTkcoJFJldmlzaW9uIDogNiAkKSArIDExOwlcCi0JUkVTVUxUX0xWQUxVRV8gPSAwOwkJCQkJCVwKLQl3aGlsZSAoKnJldmlzaW9uU3RyaW5nID49ICcwJyAmJiAqcmV2aXNpb25TdHJpbmcgPD0gJzknKSB7CVwKLQkJUkVTVUxUX0xWQUxVRV8gKj0gMTA7CQkJCQlcCi0JCVJFU1VMVF9MVkFMVUVfICs9ICpyZXZpc2lvblN0cmluZyAtICcwJzsJCVwKLQkJcmV2aXNpb25TdHJpbmcrKzsJCQkJCVwKLQl9CQkJCQkJCQlcCi19CisJZG8gewkJCQkJCQkJXAorCQljaGFyICpyZXZpc2lvbl9zdHJpbmcJCQkJCVwKKwkJCT0gUkVWSVNJT05fU1RSSU5HKCRSZXYgOiA2ICQpICsgNjsJCVwKKwkJUkVTVUxUX0xWQUxVRV8gPSAwOwkJCQkJXAorCQl3aGlsZSAoKnJldmlzaW9uX3N0cmluZyA+PSAnMCcJCQkJXAorCQkJJiYgKnJldmlzaW9uX3N0cmluZyA8PSAnOScpIHsJCQlcCisJCQlSRVNVTFRfTFZBTFVFXyAqPSAxMDsJCQkJXAorCQkJUkVTVUxUX0xWQUxVRV8gKz0gKnJldmlzaW9uX3N0cmluZyAtICcwJzsJXAorCQkJcmV2aXNpb25fc3RyaW5nKys7CQkJCVwKKwkJfQkJCQkJCQlcCisJfSB3aGlsZSAoMCkKIAogLyogTWFqb3IvbWlub3IgbWFjcm9zLiAgTWlub3IgdmVyc2lvbiBpcyBpbiBMU0IsIG1lYW5pbmcgdGhhdCBlYXJsaWVyIGZsYXQgKi8KIC8qIHZlcnNpb24gbnVtYmVycyB3aWxsIGJlIGludGVycHJldGVkIGFzICIwLngiIChpLmUuLCAxIGJlY29tZXMgMC4xKS4gKi8KQEAgLTY1LDE3ICs2NywxNyBAQAogCiAvKiAgUGFja2V0IHN0cnVjdHVyZSBkZXNjcmliaW5nIHZpcnR1YWwgc3RvcmFnZSByZXF1ZXN0cy4gKi8KIGVudW0gdnN0b3JfcGFja2V0X29wZXJhdGlvbiB7Ci0JVlN0b3JPcGVyYXRpb25Db21wbGV0ZUlvICAgICAgICAgICAgPSAxLAotCVZTdG9yT3BlcmF0aW9uUmVtb3ZlRGV2aWNlICAgICAgICAgID0gMiwKLQlWU3Rvck9wZXJhdGlvbkV4ZWN1dGVTUkIgICAgICAgICAgICA9IDMsCi0JVlN0b3JPcGVyYXRpb25SZXNldEx1biAgICAgICAgICAgICAgPSA0LAotCVZTdG9yT3BlcmF0aW9uUmVzZXRBZGFwdGVyICAgICAgICAgID0gNSwKLQlWU3Rvck9wZXJhdGlvblJlc2V0QnVzICAgICAgICAgICAgICA9IDYsCi0JVlN0b3JPcGVyYXRpb25CZWdpbkluaXRpYWxpemF0aW9uICAgPSA3LAotCVZTdG9yT3BlcmF0aW9uRW5kSW5pdGlhbGl6YXRpb24gICAgID0gOCwKLQlWU3Rvck9wZXJhdGlvblF1ZXJ5UHJvdG9jb2xWZXJzaW9uICA9IDksCi0JVlN0b3JPcGVyYXRpb25RdWVyeVByb3BlcnRpZXMgICAgICAgPSAxMCwKLQlWU3Rvck9wZXJhdGlvbk1heGltdW0gICAgICAgICAgICAgICA9IDEwCisJVlNUT1JfT1BFUkFUSU9OX0NPTVBMRVRFX0lPCQk9IDEsCisJVlNUT1JfT1BFUkFUSU9OX1JFTU9WRV9ERVZJQ0UJCT0gMiwKKwlWU1RPUl9PUEVSQVRJT05fRVhFQ1VURV9TUkIJCT0gMywKKwlWU1RPUl9PUEVSQVRJT05fUkVTRVRfTFVOCQk9IDQsCisJVlNUT1JfT1BFUkFUSU9OX1JFU0VUX0FEQVBURVIJCT0gNSwKKwlWU1RPUl9PUEVSQVRJT05fUkVTRVRfQlVTCQk9IDYsCisJVlNUT1JfT1BFUkFUSU9OX0JFR0lOX0lOSVRJQUxJWkFUSU9OCT0gNywKKwlWU1RPUl9PUEVSQVRJT05fRU5EX0lOSVRJQUxJWkFUSU9OCT0gOCwKKwlWU1RPUl9PUEVSQVRJT05fUVVFUllfUFJPVE9DT0xfVkVSU0lPTgk9IDksCisJVlNUT1JfT1BFUkFUSU9OX1FVRVJZX1BST1BFUlRJRVMJPSAxMCwKKwlWU1RPUl9PUEVSQVRJT05fTUFYSU1VTQkJCT0gMTAKIH07CiAKIC8qCkBAIC04OSwzMSArOTEsMjkgQEAKICNkZWZpbmUgU0VOU0VfQlVGRkVSX1NJWkUJCQkweDEyCiAjZW5kaWYKIAotI2RlZmluZSBNQVhfREFUQV9CVUZGRVJfTEVOR1RIX1dJVEhfUEFERElORwkweDE0CisjZGVmaW5lIE1BWF9EQVRBX0JVRl9MRU5fV0lUSF9QQURESU5HCQkweDE0CiAKIHN0cnVjdCB2bXNjc2lfcmVxdWVzdCB7Ci0JdW5zaWduZWQgc2hvcnQgTGVuZ3RoOwotCXVuc2lnbmVkIGNoYXIgU3JiU3RhdHVzOwotCXVuc2lnbmVkIGNoYXIgU2NzaVN0YXR1czsKKwl1bnNpZ25lZCBzaG9ydCBsZW5ndGg7CisJdW5zaWduZWQgY2hhciBzcmJfc3RhdHVzOworCXVuc2lnbmVkIGNoYXIgc2NzaV9zdGF0dXM7CiAKLQl1bnNpZ25lZCBjaGFyIFBvcnROdW1iZXI7Ci0JdW5zaWduZWQgY2hhciBQYXRoSWQ7Ci0JdW5zaWduZWQgY2hhciBUYXJnZXRJZDsKLQl1bnNpZ25lZCBjaGFyIEx1bjsKKwl1bnNpZ25lZCBjaGFyIHBvcnRfbnVtYmVyOworCXVuc2lnbmVkIGNoYXIgcGF0aF9pZDsKKwl1bnNpZ25lZCBjaGFyIHRhcmdldF9pZDsKKwl1bnNpZ25lZCBjaGFyIGx1bjsKIAotCXVuc2lnbmVkIGNoYXIgQ2RiTGVuZ3RoOwotCXVuc2lnbmVkIGNoYXIgU2Vuc2VJbmZvTGVuZ3RoOwotCXVuc2lnbmVkIGNoYXIgRGF0YUluOwotCXVuc2lnbmVkIGNoYXIgUmVzZXJ2ZWQ7CisJdW5zaWduZWQgY2hhciBjZGJfbGVuZ3RoOworCXVuc2lnbmVkIGNoYXIgc2Vuc2VfaW5mb19sZW5ndGg7CisJdW5zaWduZWQgY2hhciBkYXRhX2luOworCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWQ7CiAKLQl1bnNpZ25lZCBpbnQgRGF0YVRyYW5zZmVyTGVuZ3RoOworCXVuc2lnbmVkIGludCBkYXRhX3RyYW5zZmVyX2xlbmd0aDsKIAogCXVuaW9uIHsKLQl1bnNpZ25lZCBjaGFyIENkYltDREIxNkdFTkVSSUNfTEVOR1RIXTsKLQotCXVuc2lnbmVkIGNoYXIgU2Vuc2VEYXRhW1NFTlNFX0JVRkZFUl9TSVpFXTsKLQotCXVuc2lnbmVkIGNoYXIgUmVzZXJ2ZWRBcnJheVtNQVhfREFUQV9CVUZGRVJfTEVOR1RIX1dJVEhfUEFERElOR107CisJCXVuc2lnbmVkIGNoYXIgY2RiW0NEQjE2R0VORVJJQ19MRU5HVEhdOworCQl1bnNpZ25lZCBjaGFyIHNlbnNlX2RhdGFbU0VOU0VfQlVGRkVSX1NJWkVdOworCQl1bnNpZ25lZCBjaGFyIHJlc2VydmVkX2FycmF5W01BWF9EQVRBX0JVRl9MRU5fV0lUSF9QQURESU5HXTsKIAl9OwogfSBfX2F0dHJpYnV0ZSgocGFja2VkKSk7CiAKQEAgLTEyMywyNCArMTIzLDI0IEBACiAgKiBwcm9wZXJ0aWVzIG9mIHRoZSBjaGFubmVsLgogICovCiBzdHJ1Y3Qgdm1zdG9yYWdlX2NoYW5uZWxfcHJvcGVydGllcyB7Ci0JdW5zaWduZWQgc2hvcnQgUHJvdG9jb2xWZXJzaW9uOwotCXVuc2lnbmVkIGNoYXIgIFBhdGhJZDsKLQl1bnNpZ25lZCBjaGFyICBUYXJnZXRJZDsKKwl1bnNpZ25lZCBzaG9ydCBwcm90b2NvbF92ZXJzaW9uOworCXVuc2lnbmVkIGNoYXIgcGF0aF9pZDsKKwl1bnNpZ25lZCBjaGFyIHRhcmdldF9pZDsKIAogCS8qIE5vdGU6IHBvcnQgbnVtYmVyIGlzIG9ubHkgcmVhbGx5IGtub3duIG9uIHRoZSBjbGllbnQgc2lkZSAqLwotCXVuc2lnbmVkIGludCAgUG9ydE51bWJlcjsKLQl1bnNpZ25lZCBpbnQgIEZsYWdzOwotCXVuc2lnbmVkIGludCAgTWF4VHJhbnNmZXJCeXRlczsKKwl1bnNpZ25lZCBpbnQgcG9ydF9udW1iZXI7CisJdW5zaWduZWQgaW50IGZsYWdzOworCXVuc2lnbmVkIGludCBtYXhfdHJhbnNmZXJfYnl0ZXM7CiAKIAkvKiAgVGhpcyBpZCBpcyB1bmlxdWUgZm9yIGVhY2ggY2hhbm5lbCBhbmQgd2lsbCBjb3JyZXNwb25kIHdpdGggKi8KIAkvKiAgdmVuZG9yIHNwZWNpZmljIGRhdGEgaW4gdGhlIGlucXVpcnlkYXRhICovCi0JdW5zaWduZWQgbG9uZyBsb25nIFVuaXF1ZUlkOworCXVuc2lnbmVkIGxvbmcgbG9uZyB1bmlxdWVfaWQ7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKiAgVGhpcyBzdHJ1Y3R1cmUgaXMgc2VudCBkdXJpbmcgdGhlIHN0b3JhZ2UgcHJvdG9jb2wgbmVnb3RpYXRpb25zLiAqLwogc3RydWN0IHZtc3RvcmFnZV9wcm90b2NvbF92ZXJzaW9uIHsKIAkvKiBNYWpvciAoTVNXKSBhbmQgbWlub3IgKExTVykgdmVyc2lvbiBudW1iZXJzLiAqLwotCXVuc2lnbmVkIHNob3J0IE1ham9yTWlub3I7CisJdW5zaWduZWQgc2hvcnQgbWFqb3JfbWlub3I7CiAKIAkvKgogCSAqIFJldmlzaW9uIG51bWJlciBpcyBhdXRvLWluY3JlbWVudGVkIHdoZW5ldmVyIHRoaXMgZmlsZSBpcyBjaGFuZ2VkCkBAIC0xNDgsNyArMTQ4LDcgQEAKIAkgKiBkZWZpbml0ZWx5IGluZGljYXRlIGluY29tcGF0aWJpbGl0eS0tYnV0IGl0IGRvZXMgaW5kaWNhdGUgbWlzbWF0Y2hlZAogCSAqIGJ1aWxkcy4KIAkgKi8KLQl1bnNpZ25lZCBzaG9ydCBSZXZpc2lvbjsKKwl1bnNpZ25lZCBzaG9ydCByZXZpc2lvbjsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8qIENoYW5uZWwgUHJvcGVydHkgRmxhZ3MgKi8KQEAgLTE1NywxMyArMTU3LDEzIEBACiAKIHN0cnVjdCB2c3Rvcl9wYWNrZXQgewogCS8qIFJlcXVlc3RlZCBvcGVyYXRpb24gdHlwZSAqLwotCWVudW0gdnN0b3JfcGFja2V0X29wZXJhdGlvbiBPcGVyYXRpb247CisJZW51bSB2c3Rvcl9wYWNrZXRfb3BlcmF0aW9uIG9wZXJhdGlvbjsKIAogCS8qICBGbGFncyAtIHNlZSBiZWxvdyBmb3IgdmFsdWVzICovCi0JdW5zaWduZWQgaW50ICAgICBGbGFnczsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CiAKIAkvKiBTdGF0dXMgb2YgdGhlIHJlcXVlc3QgcmV0dXJuZWQgZnJvbSB0aGUgc2VydmVyIHNpZGUuICovCi0JdW5zaWduZWQgaW50ICAgICBTdGF0dXM7CisJdW5zaWduZWQgaW50IHN0YXR1czsKIAogCS8qIERhdGEgcGF5bG9hZCBhcmVhICovCiAJdW5pb24gewpAQCAtMTcxLDEzICsxNzEsMTMgQEAKIAkJICogU3RydWN0dXJlIHVzZWQgdG8gZm9yd2FyZCBTQ1NJIGNvbW1hbmRzIGZyb20gdGhlCiAJCSAqIGNsaWVudCB0byB0aGUgc2VydmVyLgogCQkgKi8KLQkJc3RydWN0IHZtc2NzaV9yZXF1ZXN0IFZtU3JiOworCQlzdHJ1Y3Qgdm1zY3NpX3JlcXVlc3Qgdm1fc3JiOwogCiAJCS8qIFN0cnVjdHVyZSB1c2VkIHRvIHF1ZXJ5IGNoYW5uZWwgcHJvcGVydGllcy4gKi8KLQkJc3RydWN0IHZtc3RvcmFnZV9jaGFubmVsX3Byb3BlcnRpZXMgU3RvcmFnZUNoYW5uZWxQcm9wZXJ0aWVzOworCQlzdHJ1Y3Qgdm1zdG9yYWdlX2NoYW5uZWxfcHJvcGVydGllcyBzdG9yYWdlX2NoYW5uZWxfcHJvcGVydGllczsKIAogCQkvKiBVc2VkIGR1cmluZyB2ZXJzaW9uIG5lZ290aWF0aW9ucy4gKi8KLQkJc3RydWN0IHZtc3RvcmFnZV9wcm90b2NvbF92ZXJzaW9uIFZlcnNpb247CisJCXN0cnVjdCB2bXN0b3JhZ2VfcHJvdG9jb2xfdmVyc2lvbiB2ZXJzaW9uOwogCX07CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL0RvY3VtZW50YXRpb24vc3lzZnMtYnVzLWlpbyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vRG9jdW1lbnRhdGlvbi9zeXNmcy1idXMtaWlvCmluZGV4IGZkYjAxN2EuLjJkZGU5N2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vRG9jdW1lbnRhdGlvbi9zeXNmcy1idXMtaWlvCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vRG9jdW1lbnRhdGlvbi9zeXNmcy1idXMtaWlvCkBAIC0xLDExICsxLDEyIEBACi1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlW25dCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWAogS2VybmVsVmVyc2lvbjoJMi42LjM1CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKIAkJSGFyZHdhcmUgY2hpcCBvciBkZXZpY2UgYWNjZXNzZWQgYnkgb24gY29tbXVuaWNhdGlvbiBwb3J0LgotCQlDb3JyZXNwb25kcyB0byBhIGdyb3VwaW5nIG9mIHNlbnNvciBjaGFubmVscy4KKwkJQ29ycmVzcG9uZHMgdG8gYSBncm91cGluZyBvZiBzZW5zb3IgY2hhbm5lbHMuIFggaXMgdGhlIElJTworCQlpbmRleCBvZiB0aGUgZGV2aWNlLgogCi1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvdHJpZ2dlcltuXQorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL3RyaWdnZXJYCiBLZXJuZWxWZXJzaW9uOgkyLjYuMzUKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgpAQCAtMTMsMjUgKzE0LDI2IEBACiAJCU1heSBiZSBwcm92aWRlZCBieSBhIGRldmljZSBkcml2ZXIgdGhhdCBhbHNvIGhhcyBhbiBJSU8gZGV2aWNlCiAJCWJhc2VkIG9uIGhhcmR3YXJlIGdlbmVyYXRlZCBldmVudHMgKGUuZy4gZGF0YSByZWFkeSkgb3IKIAkJcHJvdmlkZWQgYnkgYSBzZXBhcmF0ZSBkcml2ZXIgZm9yIG90aGVyIGhhcmR3YXJlIChlLmcuCi0JCXBlcmlvZGljIHRpbWVyLCBncGlvIG9yIGhpZ2ggcmVzb2x1dGlvbiB0aW1lcikuCisJCXBlcmlvZGljIHRpbWVyLCBHUElPIG9yIGhpZ2ggcmVzb2x1dGlvbiB0aW1lcikuCiAJCUNvbnRhaW5zIHRyaWdnZXIgdHlwZSBzcGVjaWZpYyBlbGVtZW50cy4gVGhlc2UgZG8gbm90CiAJCWdlbmVyYWxpemUgd2VsbCBhbmQgaGVuY2UgYXJlIG5vdCBkb2N1bWVudGVkIGluIHRoaXMgZmlsZS4KKwkJWCBpcyB0aGUgSUlPIGluZGV4IG9mIHRoZSB0cmlnZ2VyLgogCi1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlW25dOmJ1ZmZlcgorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyCiBLZXJuZWxWZXJzaW9uOgkyLjYuMzUKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgotCQlMaW5rIHRvIC9zeXMvY2xhc3MvaWlvL2RldmljZVtuXS9kZXZpY2Vbbl06YnVmZmVyLiBuIGluZGljYXRlcworCQlMaW5rIHRvIC9zeXMvY2xhc3MvaWlvL2RldmljZVgvZGV2aWNlWDpidWZmZXIuIFggaW5kaWNhdGVzCiAJCXRoZSBkZXZpY2Ugd2l0aCB3aGljaCB0aGlzIGJ1ZmZlciBidWZmZXIgaXMgYXNzb2NpYXRlZC4KIAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVtuXS9uYW1lCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9uYW1lCiBLZXJuZWxWZXJzaW9uOgkyLjYuMzUKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgotCQlEZXNjcmlwdGlvbiBvZiB0aGUgcGh5c2ljYWwgY2hpcCAvIGRldmljZS4gVHlwaWNhbGx5IGEgcGFydAotCQludW1iZXIuCisJCURlc2NyaXB0aW9uIG9mIHRoZSBwaHlzaWNhbCBjaGlwIC8gZGV2aWNlIGZvciBkZXZpY2UgWC4KKwkJVHlwaWNhbGx5IGEgcGFydCBudW1iZXIuCiAKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2Vbbl0vc2FtcGxpbmdfZnJlcXVlbmN5CitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9zYW1wbGluZ19mcmVxdWVuY3kKIEtlcm5lbFZlcnNpb246CTIuNi4zNQogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CkBAIC00NCw5MCArNDYsNDkgQEAKIAkJcmVsZXZhbnQgZGlyZWN0b3JpZXMuICBJZiBpdCBlZmZlY3RzIGFsbCBvZiB0aGUgYWJvdmUKIAkJdGhlbiBpdCBpcyB0byBiZSBmb3VuZCBpbiB0aGUgYmFzZSBkZXZpY2UgZGlyZWN0b3J5IGFzIGhlcmUuCiAKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2Vbbl0vc2FtcGxpbmdfZnJlcXVlbmN5X2F2YWlsYWJsZQorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvc2FtcGxpbmdfZnJlcXVlbmN5X2F2YWlsYWJsZQogS2VybmVsVmVyc2lvbjoJMi42LjM1CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKIAkJV2hlbiB0aGUgaW50ZXJuYWwgc2FtcGxpbmcgY2xvY2sgY2FuIG9ubHkgdGFrZSBhIHNtYWxsCi0JCWRpc2NyZXRlIHNldCBvZiB2YWx1ZXMsIHRoaXMgZmlsZSBsaXN0cyB0aG9zZSBhdmFpbGFsZS4KKwkJZGlzY3JldGUgc2V0IG9mIHZhbHVlcywgdGhpcyBmaWxlIGxpc3RzIHRob3NlIGF2YWlsYWJsZS4KIAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVtuXS9pblttXVtfbmFtZV1fcmF3CitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9pbllfcmF3CitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9pbllfc3VwcGx5X3JhdwogS2VybmVsVmVyc2lvbjoJMi42LjM1CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKIAkJUmF3ICh1bnNjYWxlZCBubyBiaWFzIHJlbW92YWwgZXRjKSB2b2x0YWdlIG1lYXN1cmVtZW50IGZyb20KLQkJY2hhbm5lbCBtLiBuYW1lIGlzIHVzZWQgaW4gc3BlY2lhbCBjYXNlcyB3aGVyZSB0aGlzIGRvZXMKLQkJbm90IGNvcnJlc3BvbmQgdG8gZXh0ZXJuYWxseSBhdmFpbGFibGUgaW5wdXQgKGUuZy4gc3VwcGx5Ci0JCXZvbHRhZ2UgbW9uaXRvcmluZyBpbiB3aGljaCBjYXNlIHRoZSBmaWxlIGlzIGluX3N1cHBseV9yYXcpLgotCQlJZiB0aGUgZGV2aWNlIHN1cHBvcnRzIGV2ZW50cyBvbiB0aGlzIGNoYW5uZWwgdGhlbiBtIG11c3QgYmUKLQkJc3BlY2lmaWVkIChldmVuIG9uIG5hbWVkIGNoYW5uZWxzKSBzbyBhcyB0byBhbGxvdyB0aGUgc291cmNlCi0JCW9mIGV2ZW50IGNvZGVzIHRvIGJlIGlkZW50aWZpZWQuCisJCWNoYW5uZWwgWS4gSW4gc3BlY2lhbCBjYXNlcyB3aGVyZSB0aGUgY2hhbm5lbCBkb2VzIG5vdAorCQljb3JyZXNwb25kIHRvIGV4dGVybmFsbHkgYXZhaWxhYmxlIGlucHV0IG9uZSBvZiB0aGUgbmFtZWQKKwkJdmVyc2lvbnMgbWF5IGJlIHVzZWQuIFRoZSBudW1iZXIgbXVzdCBhbHdheXMgYmUgc3BlY2lmaWVkIGFuZAorCQl1bmlxdWUgdG8gYWxsb3cgYXNzb2NpYXRpb24gd2l0aCBldmVudCBjb2Rlcy4KIAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVtuXS9pblttXVtfbmFtZV1fb2Zmc2V0Ci1LZXJuZWxWZXJzaW9uOgkyLjYuMzUKLUNvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKLURlc2NyaXB0aW9uOgotCQlJZiBrbm93biBmb3IgYSBkZXZpY2UsIG9mZnNldCB0byBiZSBhZGRlZCB0byBpblttXV9yYXcgcHJpb3IKLQkJdG8gc2NhbGluZyBieSBpbltfbmFtZV1bbV1fc2NhbGUgaW4gb3JkZXIgdG8gb2J0YWluIHZvbHRhZ2UgaW4KLQkJbWlsbGl2b2x0cy4gIE5vdCBwcmVzZW50IGlmIHRoZSBvZmZzZXQgaXMgYWx3YXlzIDAgb3IgdW5rbm93bi4KLQkJSWYgbSBpcyBub3QgcHJlc2VudCwgdGhlbiB2b2x0YWdlIG9mZnNldCBhcHBsaWVzIHRvIGFsbCBpbgotCQljaGFubmVscy4gTWF5IGJlIHdyaXRhYmxlIGlmIGEgdmFyaWFibGUgb2Zmc2V0IGlzIGNvbnRyb2xsZWQKLQkJYnkgdGhlIGRldmljZS4gTm90ZSB0aGF0IHRoaXMgaXMgZGlmZmVyZW50IHRvIGNhbGliYmlhcyB3aGljaAotCQlpcyBmb3IgZGV2aWNlcyB0aGF0IGFwcGx5IG9mZnNldHMgdG8gY29tcGVuc2F0ZSBmb3IgdmFyaWF0aW9uCi0JCWJldHdlZW4gZGlmZmVyZW50IGluc3RhbmNlcyBvZiB0aGUgcGFydCwgdHlwaWNhbGx5IGFkanVzdGVkIGJ5Ci0JCXVzaW5nIHNvbWUgaGFyZHdhcmUgc3VwcG9ydGVkIGNhbGlicmF0aW9uIHByb2NlZHVyZS4KLQotV2hhdDoJCS9zeXMvLi4uL2RldmljZVtuXS9pblttXVtfbmFtZV1fb2Zmc2V0X2F2YWlsYWJsZQotS2VybmVsVmVyc2lvbjoJMi42LjM1Ci1Db250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCi1EZXNjcmlwdGlvbjoKLQkJSWYgYSBzbWFsbCBudW1iZXIgb2YgZGlzY3JldGUgb2Zmc2V0IHZhbHVlcyBhcmUgYXZhaWxhYmxlLCB0aGlzCi0JCXdpbGwgYmUgYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdC4gIElmIHRoZXNlIGFyZSBpbmRlcGVuZGFudCAoYnV0Ci0JCW9wdGlvbnMgdGhlIHNhbWUpIGZvciBpbmRpdmlkdWFsIG9mZnNldHMgdGhlbiBtIHNob3VsZCBub3QgYmUKLQkJcHJlc2VudC4KLQotV2hhdDoJCS9zeXMvLi4uL2RldmljZVtuXS9pblttXVtfbmFtZV1fb2Zmc2V0X1ttaW58bWF4XQotS2VybmVsVmVyc2lvbjoJMi42LjM1Ci1Db250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCi1EZXNjcmlwdGlvbjoKLQkJSWYgYSBtb3JlIG9yIGxlc3MgY29udGludW91cyByYW5nZSBvZiB2b2x0YWdlIG9mZnNldHMgYXJlCi0JCXN1cHBvcnRlZCB0aGVuIHRoZXNlIHNwZWNpZnkgdGhlIG1pbmltdW0gYW5kIG1heGltdW0uICBJZiBzaGFyZWQKLQkJYnkgYWxsIGluIGNoYW5uZWxzIHRoZW4gbSBpcyBub3QgcHJlc2VudC4KLQotV2hhdDoJCS9zeXMvLi4uL2RldmljZVtuXS9pblttXVtfbmFtZV1fY2FsaWJiaWFzCi1LZXJuZWxWZXJzaW9uOgkyLjYuMzUKLUNvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKLURlc2NyaXB0aW9uOgotCQlIYXJkd2FyZSBhcHBsaWVkIGNhbGlicmF0aW9uIG9mZnNldC4gKGFzc3VtZWQgdG8gZml4IHByb2R1Y3Rpb24KLQkJaW5hY2N1cmFjaWVzKQotCi1XaGF0CQkvc3lzLy4uLi9kZXZpY2Vbbl0vaW5bbV1bX25hbWVdX2NhbGlic2NhbGUKLUtlcm5lbFZlcnNpb246CTIuNi4zNQotQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwotRGVzY3JpcHRpb246Ci0JCUhhcmR3YXJlIGFwcGxpZWQgY2FsaWJyYXRpb24gc2NhbGUgZmFjdG9yLiAoYXNzdW1lZCB0byBmaXgKLQkJcHJvZHVjdGlvbiBpbmFjY3VyYWNpZXMpCi0KLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2Vbbl0vaW5bbV1bX25hbWVdX3NjYWxlCi1LZXJuZWxWZXJzaW9uOgkyLjYuMzUKLUNvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKLURlc2NyaXB0aW9uOgotCQlJZiBrbm93biBmb3IgYSBkZXZpY2UsIHNjYWxlIHRvIGJlIGFwcGxpZWQgdG8gdm9sdFttXV9yYXcgcG9zdAotCQlhZGRpdGlvbiBvZiBpbltfbmFtZV1bbV1fb2Zmc2V0IGluIG9yZGVyIHRvIG9idGFpbiB0aGUgbWVhc3VyZWQKLQkJdm9sdGFnZSBpbiBtaWxsaXZvbHRzLiAgSWYgc2hhcmVkIGFjcm9zcyBhbGwgaW4gY2hhbm5lbHMgdGhlbgotCQltIGlzIG5vdCBwcmVzZW50LgotCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlW25dL2luW21dLWluW29dX3JhdworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvaW5ZLWluWl9yYXcKIEtlcm5lbFZlcnNpb246CTIuNi4zNQogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CiAJCVJhdyAodW5zY2FsZWQpIGRpZmZlcmVudGlhbCB2b2x0YWdlIG1lYXN1cmVtZW50IGVxdWl2YWxlbnQgdG8KLQkJY2hhbm5lbCBtIC0gY2hhbm5lbCBvIHdoZXJlIHRoZXNlIGNoYW5uZWwgbnVtYmVycyBhcHBseSB0byB0aGUKKwkJY2hhbm5lbCBZIC0gY2hhbm5lbCBaIHdoZXJlIHRoZXNlIGNoYW5uZWwgbnVtYmVycyBhcHBseSB0byB0aGUKIAkJcGh5c2ljYWxseSBlcXVpdmFsZW50IGlucHV0cyB3aGVuIG5vbiBkaWZmZXJlbnRpYWwgcmVhZGluZ3MgYXJlCiAJCXNlcGFyYXRlbHkgYXZhaWxhYmxlLiBJbiBkaWZmZXJlbnRpYWwgb25seSBwYXJ0cywgdGhlbiBhbGwgdGhhdAotCQlpcyByZXF1aXJlZCBpcyBhIGNvbnNpc3RlbnQgbGFiZWxsaW5nLgorCQlpcyByZXF1aXJlZCBpcyBhIGNvbnNpc3RlbnQgbGFiZWxpbmcuCiAKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2Vbbl0vYWNjZWxbX3h8X3l8X3pdW21dX3JhdworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvdGVtcF9yYXcKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL3RlbXBfeF9yYXcKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL3RlbXBfeV9yYXcKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL3RlbXBfel9yYXcKK0tlcm5lbFZlcnNpb246CTIuNi4zNQorQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCVJhdyAodW5zY2FsZWQgbm8gYmlhcyByZW1vdmFsIGV0YykgdGVtcGVyYXR1cmUgbWVhc3VyZW1lbnQuCisJCUl0IGFuIGF4aXMgaXMgc3BlY2lmaWVkIGl0IGdlbmVyYWxseSBtZWFucyB0aGF0IHRoZSB0ZW1wZXJhdHVyZQorCQlzZW5zb3IgaXMgYXNzb2NpYXRlZCB3aXRoIG9uZSBwYXJ0IG9mIGEgY29tcG91bmQgZGV2aWNlIChlLmcuCisJCWEgZ3lyb3Njb3BlIGF4aXMpLgorCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9hY2NlbF94X3JhdworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvYWNjZWxfeV9yYXcKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2FjY2VsX3pfcmF3CiBLZXJuZWxWZXJzaW9uOgkyLjYuMzUKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgpAQCAtMTM1LDI5ICs5NiwzMiBAQAogCQlidXQgc2hvdWxkIG1hdGNoIG90aGVyIHN1Y2ggYXNzaWdubWVudHMgb24gZGV2aWNlKQogCQljaGFubmVsIG0gKG5vdCBwcmVzZW50IGlmIG9ubHkgb25lIGFjY2VsZXJvbWV0ZXIgY2hhbm5lbCBhdAogCQl0aGlzIG9yaWVudGF0aW9uKS4gSGFzIGFsbCBvZiB0aGUgZXF1aXZhbGVudCBwYXJhbWV0ZXJzIGFzIHBlcgotCQlpblttXS4gVW5pdHMgYWZ0ZXIgYXBwbGljYXRpb24gb2Ygc2NhbGUgYW5kIG9mZnNldCBhcmUgbS9zXjIuCisJCWluWS4gVW5pdHMgYWZ0ZXIgYXBwbGljYXRpb24gb2Ygc2NhbGUgYW5kIG9mZnNldCBhcmUgbS9zXjIuCiAKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2Vbbl0vZ3lyb1tfeHxfeXxfel1bbV1fcmF3CitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9neXJvX3hfcmF3CitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9neXJvX3lfcmF3CitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9neXJvX3pfcmF3CiBLZXJuZWxWZXJzaW9uOgkyLjYuMzUKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgogCQlBbmd1bGFyIHZlbG9jaXR5IGFib3V0IGF4aXMgeCwgeSBvciB6IChtYXkgYmUgYXJiaXRyYXJpbHkKLQkJYXNzaWduZWQpIGNoYW5uZWwgbSAobm90IHByZXNlbnQgaWYgb25seSBvbmUgZ3lyb3Njb3BlIGF0Ci0JCXRoaXMgb3JpZW50YXRpb24pLgotCQlEYXRhIGNvbnZlcnRlZCBieSBhcHBsaWNhdGlvbiBvZiBvZmZzZXQgdGhlbiBzY2FsZSB0bworCQlhc3NpZ25lZCkgRGF0YSBjb252ZXJ0ZWQgYnkgYXBwbGljYXRpb24gb2Ygb2Zmc2V0IHRoZW4gc2NhbGUgdG8KIAkJcmFkaWFucyBwZXIgc2Vjb25kLiBIYXMgYWxsIHRoZSBlcXVpdmFsZW50IHBhcmFtZXRlcnMgYXMKLQkJcGVyIGluW21dLgorCQlwZXIgaW5ZLgogCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlW25dL2luY2xpW194fF95fF96XVttXV9yYXcKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2luY2xpX3hfcmF3CitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9pbmNsaV95X3JhdworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvaW5jbGlfel9yYXcKIEtlcm5lbFZlcnNpb246CTIuNi4zNQogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246Ci0JCUluY2xpbmF0aW9uIHJhdyByZWFkaW5nIGFib3V0IGF4aXMgeCwgeSBvciB6IChtYXkgYmUgYXJiaXRhcmlseQotCQlhc3NpZ25lZCkgY2hhbm5lbCBtIChub3QgcHJlc2VudCBpZiBvbmx5IG9uZSBpbmNsaW5vbWV0ZXIgYXQKLQkJdGhpcyBvcmllbnRhdGlvbikuICBEYXRhIGNvbnZlcnRlZCBieSBhcHBsaWNhdGlvbiBvZiBvZmZzZXQKKwkJSW5jbGluYXRpb24gcmF3IHJlYWRpbmcgYWJvdXQgYXhpcyB4LCB5IG9yIHogKG1heSBiZQorCQlhcmJpdHJhcmlseSBhc3NpZ25lZCkuIERhdGEgY29udmVydGVkIGJ5IGFwcGxpY2F0aW9uIG9mIG9mZnNldAogCQlhbmQgc2NhbGUgdG8gRGVncmVlcy4KIAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVtuXS9tYWduW194fF95fF96XVttXV9yYXcKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL21hZ25feF9yYXcKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL21hZ25feV9yYXcKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL21hZ25fel9yYXcKIEtlcm5lbFZlcnNpb246CTIuNi4zNQogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CkBAIC0xNjUsMzcgKzEyOSwxNTAgQEAKIAkJYXNzaWduZWQpIGNoYW5uZWwgbSAobm90IHByZXNlbnQgaWYgb25seSBvbmUgbWFnbmV0b21ldGVyCiAJCWF0IHRoaXMgb3JpZW50YXRpb24pLiAgRGF0YSBjb252ZXJ0ZWQgYnkgYXBwbGljYXRpb24gb2YKIAkJb2Zmc2V0IHRoZW4gc2NhbGUgdG8gR2F1c3MuIEhhcyBhbGwgdGhlIGVxdWl2YWxlbnQgbW9kaWZpZXJzCi0JCWFzIHBlciBpblttXS4KKwkJYXMgcGVyIGluWS4KIAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVtuXS9kZXZpY2Vbbl06ZXZlbnRbbV0KK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2FjY2VsX3hfcGVha19yYXcKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2FjY2VsX3lfcGVha19yYXcKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2FjY2VsX3pfcGVha19yYXcKK0tlcm5lbFZlcnNpb246CTIuNi4zNgorQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCVNvbWUgZGV2aWNlcyBwcm92aWRlIGEgc3RvcmUgb2YgdGhlIGhpZ2hlc3QgdmFsdWUgc2VlbiBzaW5jZQorCQlzb21lIHJlc2V0IGNvbmRpdGlvbi4gIFRoZXNlIGF0dHJpYnV0ZXMgYWxsb3cgYWNjZXNzIHRvIHRoaXMKKwkJYW5kIGFyZSBvdGhlcndpc2UgdGhlIGRpcmVjdCBlcXVpdmFsZW50IG9mIHRoZQorCQk8dHlwZT5ZW19uYW1lXV9yYXcgYXR0cmlidXRlcy4KKworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvYWNjZWxfeHl6X3NxdWFyZWRfcGVha19yYXcKK0tlcm5lbFZlcnNpb246CTIuNi4zNgorQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCUEgY29tcHV0ZWQgcGVhayB2YWx1ZSBiYXNlZCBvbiB0aGUgc3VtIHNxdWFyZWQgbWFnbml0dWRlIG9mCisJCXRoZSB1bmRlcmx5aW5nIHZhbHVlIGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0aW9ucy4KKworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvYWNjZWxfb2Zmc2V0CitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC90ZW1wX29mZnNldAogS2VybmVsVmVyc2lvbjoJMi42LjM1CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKLQkJQ29uZmlndXJhdGlvbiBvZiB3aGljaCBoYXJkd2FyZSBnZW5lcmF0ZWQgZXZlbnRzIGFyZSBwYXNzZWQgdXAgdG8KLQkJdXNlcnNwYWNlLiBTb21lIG9mIHRoZXNlIGFyZSBhIGJpdCBjb21wbGV4IHRvIGdlbmVyYWxpemUgc28gdGhpcwotCQlzZWN0aW9uIGlzIGEgd29yayBpbiBwcm9ncmVzcy4KKwkJSWYga25vd24gZm9yIGEgZGV2aWNlLCBvZmZzZXQgdG8gYmUgYWRkZWQgdG8gPHR5cGU+W1ldX3JhdyBwcmlvcgorCQl0byBzY2FsaW5nIGJ5IDx0eXBlPltZXV9zY2FsZSBpbiBvcmRlciB0byBvYnRhaW4gdmFsdWUgaW4gdGhlCisJCTx0eXBlPiB1bml0cyBhcyBzcGVjaWZpZWQgaW4gPHR5cGU+W3ldX3JhdyBkb2N1bWVudGF0aW9uLgorCQlOb3QgcHJlc2VudCBpZiB0aGUgb2Zmc2V0IGlzIGFsd2F5cyAwIG9yIHVua25vd24uIElmIFkgaXMgbm90CisJCXByZXNlbnQsIHRoZW4gdGhlIG9mZnNldCBhcHBsaWVzIHRvIGFsbCBpbiBjaGFubmVscyBvZiA8dHlwZT4uCisJCU1heSBiZSB3cml0YWJsZSBpZiBhIHZhcmlhYmxlIG9mZnNldCBjYW4gYmUgYXBwbGllZCBvbiB0aGUKKwkJZGV2aWNlLiBOb3RlIHRoYXQgdGhpcyBpcyBkaWZmZXJlbnQgdG8gY2FsaWJiaWFzIHdoaWNoCisJCWlzIGZvciBkZXZpY2VzIChvciBkcml2ZXJzKSB0aGF0IGFwcGx5IG9mZnNldHMgdG8gY29tcGVuc2F0ZQorCQlmb3IgdmFyaWF0aW9uIGJldHdlZW4gZGlmZmVyZW50IGluc3RhbmNlcyBvZiB0aGUgcGFydCwgdHlwaWNhbGx5CisJCWFkanVzdGVkIGJ5IHVzaW5nIHNvbWUgaGFyZHdhcmUgc3VwcG9ydGVkIGNhbGlicmF0aW9uIHByb2NlZHVyZS4KIAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVtuXTpldmVudFttXS9kZXYKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2luWV9zY2FsZQorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvaW5ZX3N1cHBseV9zY2FsZQorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvaW5fc2NhbGUKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2FjY2VsX3NjYWxlCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9hY2NlbF9wZWFrX3NjYWxlCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9neXJvX3NjYWxlCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9tYWduX3NjYWxlCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9tYWduX3hfc2NhbGUKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL21hZ25feV9zY2FsZQorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvbWFnbl96X3NjYWxlCiBLZXJuZWxWZXJzaW9uOgkyLjYuMzUKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgotCQltYWpvcjptaW5vciBjaGFyYWN0ZXIgZGV2aWNlIG51bWJlcnMgZm9yIHRoZSBldmVudCBsaW5lLgorCQlJZiBrbm93biBmb3IgYSBkZXZpY2UsIHNjYWxlIHRvIGJlIGFwcGxpZWQgdG8gPHR5cGU+WVtfbmFtZV1fcmF3CisJCXBvc3QgYWRkaXRpb24gb2YgPHR5cGU+W1ldW19uYW1lXV9vZmZzZXQgaW4gb3JkZXIgdG8gb2J0YWluIHRoZQorCQltZWFzdXJlZCB2YWx1ZSBpbiA8dHlwZT4gdW5pdHMgYXMgc3BlY2lmaWVkIGluCisJCTx0eXBlPltZXVtfbmFtZV1fcmF3IGRvY3VtZW50YXRpb24uLiAgSWYgc2hhcmVkIGFjcm9zcyBhbGwgaW4KKwkJY2hhbm5lbHMgdGhlbiBZIGlzIG5vdCBwcmVzZW50IGFuZCB0aGUgdmFsdWUgaXMgY2FsbGVkCisJCTx0eXBlPltZXVtfbmFtZV1fc2NhbGUuIFRoZSBwZWFrIG1vZGlmaWVyIG1lYW5zIHRoaXMgdmFsdWUKKwkJaXMgYXBwbGllZCB0byA8dHlwZT5ZW19uYW1lXV9wZWFrX3JhdyB2YWx1ZXMuCiAKLVRha2luZyBhY2NlbF94MCBhcyBhbiBleGFtcGxlCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9hY2NlbF94X2NhbGliYmlhcworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvYWNjZWxfeV9jYWxpYmJpYXMKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2FjY2VsX3pfY2FsaWJiaWFzCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9neXJvX3hfY2FsaWJiaWFzCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9neXJvX3lfY2FsaWJiaWFzCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9neXJvX3pfY2FsaWJiaWFzCitLZXJuZWxWZXJzaW9uOgkyLjYuMzUKK0NvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlIYXJkd2FyZSBhcHBsaWVkIGNhbGlicmF0aW9uIG9mZnNldC4gKGFzc3VtZWQgdG8gZml4IHByb2R1Y3Rpb24KKwkJaW5hY2N1cmFjaWVzKS4gSWYgc2hhcmVkIGFjcm9zcyBhbGwgY2hhbm5lbHMsIDx0eXBlPl9jYWxpYmJpYXMKKwkJaXMgdXNlZC4KIAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVtuXTpldmVudFttXS9hY2NlbF94MF90aHJlc2hbX3Jpc2luZ3xfZmFsbGluZ11fZW4KK1doYXQJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvaW5ZX2NhbGlic2NhbGUKK1doYXQJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvaW5ZX3N1cHBseV9jYWxpYnNjYWxlCitXaGF0CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2luX2NhbGlic2NhbGUKK1doYXQJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvYWNjZWxfeF9jYWxpYnNjYWxlCitXaGF0CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2FjY2VsX3lfY2FsaWJzY2FsZQorV2hhdAkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9hY2NlbF96X2NhbGlic2NhbGUKK1doYXQJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvZ3lyb194X2NhbGlic2NhbGUKK1doYXQJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvZ3lyb195X2NhbGlic2NhbGUKK1doYXQJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvZ3lyb196X2NhbGlic2NhbGUKK0tlcm5lbFZlcnNpb246CTIuNi4zNQorQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCUhhcmR3YXJlIGFwcGxpZWQgY2FsaWJyYXRpb24gc2NhbGUgZmFjdG9yLiAoYXNzdW1lZCB0byBmaXgKKwkJcHJvZHVjdGlvbiBpbmFjY3VyYWNpZXMpLiAgSWYgc2hhcmVkIGFjcm9zcyBhbGwgY2hhbm5lbHMsCisJCTx0eXBlPl9jYWxpYnNjYWxlIGlzIHVzZWQuCisKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2FjY2VsX3NjYWxlX2F2YWlsYWJsZQorS2VybmVsVmVyc2lvbjoJMi42MzUKK0NvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlJZiBhIGRpc2NyZXRlIHNldCBvZiBzY2FsZSB2YWx1ZXMgYXJlIGF2YWlsYWJsZSwgdGhleQorCQlhcmUgbGlzdGVkIGluIHRoaXMgYXR0cmlidXRlLgorCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9kZXZpY2VYOmV2ZW50WQorS2VybmVsVmVyc2lvbjoJMi42LjM1CitDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJQ29uZmlndXJhdGlvbiBvZiB3aGljaCBoYXJkd2FyZSBnZW5lcmF0ZWQgZXZlbnRzIGFyZSBwYXNzZWQgdXAKKwkJdG8gdXNlci1zcGFjZS4KKworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6ZXZlbnQvZGV2CitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpldmVudFkvZGV2CitLZXJuZWxWZXJzaW9uOgkyLjYuMzUKK0NvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKK0Rlc2NyaXB0aW9uOgorCQltYWpvcjptaW5vciBjaGFyYWN0ZXIgZGV2aWNlIG51bWJlcnMgZm9yIHRoZSBldmVudCBsaW5lIFkgb2YKKwkJZGV2aWNlIFguCisKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF94X3RocmVzaF9yaXNpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF94X3RocmVzaF9mYWxsaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeV90aHJlc2hfcmlzaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeV90aHJlc2hfZmFsbGluZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3pfdGhyZXNoX3Jpc2luZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3pfdGhyZXNoX2ZhbGxpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3hfdGhyZXNoX3Jpc2luZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9feF90aHJlc2hfZmFsbGluZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9feV90aHJlc2hfcmlzaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb195X3RocmVzaF9mYWxsaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb196X3RocmVzaF9yaXNpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3pfdGhyZXNoX2ZhbGxpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3hfdGhyZXNoX3Jpc2luZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25feF90aHJlc2hfZmFsbGluZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25feV90aHJlc2hfcmlzaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl95X3RocmVzaF9mYWxsaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl96X3RocmVzaF9yaXNpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3pfdGhyZXNoX2ZhbGxpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9pblpfc3VwcGx5X3RocmVzaF9yaXNpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9pblpfc3VwcGx5X3RocmVzaF9mYWxsaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvaW5aX3RocmVzaF9yaXNpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9pblpfdGhyZXNoX2ZhbGxpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS90ZW1wX3RocmVzaF9yaXNpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS90ZW1wX3RocmVzaF9mYWxsaW5nX2VuCiBLZXJuZWxWZXJzaW9uOgkyLjYuMzcKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgotCQlFdmVudCBnZW5lcmF0ZWQgd2hlbiBhY2NlbF94MCBwYXNzZXMgYSB0aHJlc2hvbGQgaW4gdGhlIHNwZWNmaWVkCisJCUV2ZW50IGdlbmVyYXRlZCB3aGVuIGNoYW5uZWwgcGFzc2VzIGEgdGhyZXNob2xkIGluIHRoZSBzcGVjaWZpZWQKIAkJKF9yaXNpbmd8X2ZhbGxpbmcpIGRpcmVjdGlvbi4gSWYgdGhlIGRpcmVjdGlvbiBpcyBub3Qgc3BlY2lmaWVkLAogCQl0aGVuIGVpdGhlciB0aGUgZGV2aWNlIHdpbGwgcmVwb3J0IGFuIGV2ZW50IHdoaWNoIGV2ZXIgZGlyZWN0aW9uCiAJCWEgc2luZ2xlIHRocmVzaG9sZCB2YWx1ZSBpcyBjYWxsZWQgaW4gKGUuZy4KLQkJYWNjZWxfeDBfPHJhd3xpbnB1dD5fdGhyZXNoX3ZhbHVlKSBvcgotCQlhY2NlbF94MF88cmF3fGlucHV0Pl90aHJlc2hfcmlzaW5nX3ZhbHVlIGFuZAotCQlhY2NlbF94MF88cmF3fGlucHV0Pl90aHJlc2hfZmFsbGluZ192YWx1ZSBtYXkgdGFrZSBkaWZmZXJlbnQKLQkJdmFsdWVzLCBidXQgdGhlIGRldmljZSBjYW4gb25seSBlbmFibGUgYm90aCB0aHJlc2hvbGRzIG9yCi0JCW5laXRoZXIuCisJCTx0eXBlPltaXVtfbmFtZV1fPHJhd3xpbnB1dD5fdGhyZXNoX3ZhbHVlKSBvcgorCQk8dHlwZT5bWl1bX25hbWVdXzxyYXd8aW5wdXQ+X3RocmVzaF9yaXNpbmdfdmFsdWUgYW5kCisJCTx0eXBlPltaXVtfbmFtZV1fPHJhd3xpbnB1dD5fdGhyZXNoX2ZhbGxpbmdfdmFsdWUgbWF5IHRha2UKKwkJZGlmZmVyZW50IHZhbHVlcywgYnV0IHRoZSBkZXZpY2UgY2FuIG9ubHkgZW5hYmxlIGJvdGggdGhyZXNob2xkcworCQlvciBuZWl0aGVyLgogCQlOb3RlIHRoZSBkcml2ZXIgd2lsbCBhc3N1bWUgdGhlIGxhc3QgcCBldmVudHMgcmVxdWVzdGVkIGFyZQogCQl0byBiZSBlbmFibGVkIHdoZXJlIHAgaXMgaG93ZXZlciBtYW55IGl0IHN1cHBvcnRzICh3aGljaCBtYXkKIAkJdmFyeSBkZXBlbmRpbmcgb24gdGhlIGV4YWN0IHNldCByZXF1ZXN0ZWQuIFNvIGlmIHlvdSB3YW50IHRvIGJlCkBAIC0yMDUsMTg2ICsyODIsMzM4IEBACiAJCWEgZ2l2ZW4gZXZlbnQgdHlwZSBpcyBlbmFibGVkIGEgZnV0dXJlIHBvaW50IChhbmQgbm90IHRob3NlIGZvcgogCQl3aGF0ZXZlciBldmVudCB3YXMgcHJldmlvdXNseSBlbmFibGVkKS4KIAotV2hhdDoJCS9zeXMvLi4uL2FjY2VsX3gwXzxyYXd8aW5wdXQ+X3RocmVzaFtfcmlzaW5nfF9mYWxsaW5nXV92YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3hfcm9jX3Jpc2luZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3hfcm9jX2ZhbGxpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF95X3JvY19yaXNpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF95X3JvY19mYWxsaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfel9yb2NfcmlzaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfel9yb2NfZmFsbGluZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9feF9yb2NfcmlzaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb194X3JvY19mYWxsaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb195X3JvY19yaXNpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3lfcm9jX2ZhbGxpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3pfcm9jX3Jpc2luZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9fel9yb2NfZmFsbGluZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25feF9yb2NfcmlzaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl94X3JvY19mYWxsaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl95X3JvY19yaXNpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3lfcm9jX2ZhbGxpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3pfcm9jX3Jpc2luZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25fel9yb2NfZmFsbGluZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2luWl9zdXBwbHlfcm9jX3Jpc2luZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2luWl9zdXBwbHlfcm9jX2ZhbGxpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9pblpfcm9jX3Jpc2luZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2luWl9yb2NfZmFsbGluZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL3RlbXBfcm9jX3Jpc2luZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL3RlbXBfcm9jX2ZhbGxpbmdfZW4KK0tlcm5lbFZlcnNpb246CTIuNi4zNworQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCUV2ZW50IGdlbmVyYXRlZCB3aGVuIGNoYW5uZWwgcGFzc2VzIGEgdGhyZXNob2xkIG9uIHRoZSByYXRlIG9mCisJCWNoYW5nZSAoMXN0IGRpZmZlcmVudGlhbCkgaW4gdGhlIHNwZWNpZmllZCAoX3Jpc2luZ3xfZmFsbGluZykKKwkJZGlyZWN0aW9uLiBJZiB0aGUgZGlyZWN0aW9uIGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gZWl0aGVyIHRoZQorCQlkZXZpY2Ugd2lsbCByZXBvcnQgYW4gZXZlbnQgd2hpY2ggZXZlciBkaXJlY3Rpb24gYSBzaW5nbGUKKwkJdGhyZXNob2xkIHZhbHVlIGlzIGNhbGxlZCBpbiAoZS5nLgorCQk8dHlwZT5bWl1bX25hbWVdXzxyYXd8aW5wdXQ+X3JvY192YWx1ZSkgb3IKKwkJPHR5cGU+W1pdW19uYW1lXV88cmF3fGlucHV0Pl9yb2NfcmlzaW5nX3ZhbHVlIGFuZAorCQk8dHlwZT5bWl1bX25hbWVdXzxyYXd8aW5wdXQ+X3JvY19mYWxsaW5nX3ZhbHVlIG1heSB0YWtlCisJCWRpZmZlcmVudCB2YWx1ZXMsIGJ1dCB0aGUgZGV2aWNlIGNhbiBvbmx5IGVuYWJsZSBib3RoIHJhdGUgb2YKKwkJY2hhbmdlIHRocmVzaG9sZHMgb3IgbmVpdGhlci4KKwkJTm90ZSB0aGUgZHJpdmVyIHdpbGwgYXNzdW1lIHRoZSBsYXN0IHAgZXZlbnRzIHJlcXVlc3RlZCBhcmUKKwkJdG8gYmUgZW5hYmxlZCB3aGVyZSBwIGlzIGhvd2V2ZXIgbWFueSBpdCBzdXBwb3J0cyAod2hpY2ggbWF5CisJCXZhcnkgZGVwZW5kaW5nIG9uIHRoZSBleGFjdCBzZXQgcmVxdWVzdGVkLiBTbyBpZiB5b3Ugd2FudCB0byBiZQorCQlzdXJlIHlvdSBoYXZlIHNldCB3aGF0IHlvdSB0aGluayB5b3UgaGF2ZSwgY2hlY2sgdGhlIGNvbnRlbnRzIG9mCisJCXRoZXNlIGF0dHJpYnV0ZXMgYWZ0ZXIgZXZlcnl0aGluZyBpcyBjb25maWd1cmVkLiBEcml2ZXJzIG1heQorCQloYXZlIHRvIGJ1ZmZlciBhbnkgcGFyYW1ldGVycyBzbyB0aGF0IHRoZXkgYXJlIGNvbnNpc3RlbnQgd2hlbgorCQlhIGdpdmVuIGV2ZW50IHR5cGUgaXMgZW5hYmxlZCBhIGZ1dHVyZSBwb2ludCAoYW5kIG5vdCB0aG9zZSBmb3IKKwkJd2hhdGV2ZXIgZXZlbnQgd2FzIHByZXZpb3VzbHkgZW5hYmxlZCkuCisKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF94X3Jhd190aHJlc2hfcmlzaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeF9yYXdfdGhyZXNoX2ZhbGxpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF95X3Jhd190aHJlc2hfcmlzaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeV9yYXdfdGhyZXNoX2ZhbGxpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF96X3Jhd190aHJlc2hfcmlzaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfel9yYXdfdGhyZXNoX2ZhbGxpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3hfcmF3X3RocmVzaF9yaXNpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3hfcmF3X3RocmVzaF9mYWxsaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb195X3Jhd190aHJlc2hfcmlzaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb195X3Jhd190aHJlc2hfZmFsbGluZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9fel9yYXdfdGhyZXNoX3Jpc2luZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9fel9yYXdfdGhyZXNoX2ZhbGxpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3hfcmF3X3RocmVzaF9yaXNpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3hfcmF3X3RocmVzaF9mYWxsaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl95X3Jhd190aHJlc2hfcmlzaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl95X3Jhd190aHJlc2hfZmFsbGluZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25fel9yYXdfdGhyZXNoX3Jpc2luZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25fel9yYXdfdGhyZXNoX2ZhbGxpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9pblpfc3VwcGx5X3Jhd190aHJlc2hfcmlzaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvaW5aX3N1cHBseV9yYXdfdGhyZXNoX2ZhbGxpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9pblpfcmF3X3RocmVzaF9mYWxsaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvaW5aX3Jhd190aHJlc2hfZmFsbGluZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL3RlbXBfcmF3X3RocmVzaF9mYWxsaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvdGVtcF9yYXdfdGhyZXNoX2ZhbGxpbmdfdmFsdWUKIEtlcm5lbFZlcnNpb246CTIuNi4zNwogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CiAJCVNwZWNpZmllcyB0aGUgdmFsdWUgb2YgdGhyZXNob2xkIHRoYXQgdGhlIGRldmljZSBpcyBjb21wYXJpbmcKIAkJYWdhaW5zdCBmb3IgdGhlIGV2ZW50cyBlbmFibGVkIGJ5Ci0JCWFjY2VsX3gwXzxyYXd8aW5wdXQ+X3RocmVzaFtfcmlzaW5nfGZhbGxpbmddX2VuLgotCQlJZiBzZXBlcmF0ZSBleGlzdCBmb3IgdGhlIHR3byBkaXJlY3Rpb25zLCBidXQgZGlyZWN0aW9uIGlzCi0JCW5vdCBzcGVjaWZpZWQgZm9yIHRoaXMgYXR0cmlidXRlLCB0aGVuIGEgc2luZ2xlIHRocmVzaG9sZCB2YWx1ZQotCQlhcHBsaWVzIHRvIGJvdGggZGlyZWN0aW9ucy4KKwkJPHR5cGU+WltfbmFtZV1fdGhyZXNoW19yaXNpbmd8ZmFsbGluZ11fZW4uCisJCUlmIHNlcGFyYXRlIGF0dHJpYnV0ZXMgIGV4aXN0IGZvciB0aGUgdHdvIGRpcmVjdGlvbnMsIGJ1dAorCQlkaXJlY3Rpb24gaXMgbm90IHNwZWNpZmllZCBmb3IgdGhpcyBhdHRyaWJ1dGUsIHRoZW4gYSBzaW5nbGUKKwkJdGhyZXNob2xkIHZhbHVlIGFwcGxpZXMgdG8gYm90aCBkaXJlY3Rpb25zLgogCQlUaGUgcmF3IG9yIGlucHV0IGVsZW1lbnQgb2YgdGhlIG5hbWUgaW5kaWNhdGVzIHdoZXRoZXIgdGhlCiAJCXZhbHVlIGlzIGluIHJhdyBkZXZpY2UgdW5pdHMgb3IgaW4gcHJvY2Vzc2VkIHVuaXRzIChhcyBfcmF3CiAJCWFuZCBfaW5wdXQgZG8gb24gc3lzZnMgZGlyZWN0IGNoYW5uZWwgcmVhZCBhdHRyaWJ1dGVzKS4KIAotV2hhdDoJCS9zeXMvLi4uL2FjY2VsX3gwX3RocmVzaFtfcmlzaW5nfF9mYWxsaW5nXV9tZWFucGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeF9yYXdfcm9jX3Jpc2luZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3hfcmF3X3JvY19mYWxsaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeV9yYXdfcm9jX3Jpc2luZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3lfcmF3X3JvY19mYWxsaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfel9yYXdfcm9jX3Jpc2luZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3pfcmF3X3JvY19mYWxsaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb194X3Jhd19yb2NfcmlzaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb194X3Jhd19yb2NfZmFsbGluZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9feV9yYXdfcm9jX3Jpc2luZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9feV9yYXdfcm9jX2ZhbGxpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3pfcmF3X3JvY19yaXNpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3pfcmF3X3JvY19mYWxsaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl94X3Jhd19yb2NfcmlzaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl94X3Jhd19yb2NfZmFsbGluZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25feV9yYXdfcm9jX3Jpc2luZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25feV9yYXdfcm9jX2ZhbGxpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3pfcmF3X3JvY19yaXNpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3pfcmF3X3JvY19mYWxsaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvaW5aX3N1cHBseV9yYXdfcm9jX3Jpc2luZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2luWl9zdXBwbHlfcmF3X3JvY19mYWxsaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvaW5aX3Jhd19yb2NfZmFsbGluZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2luWl9yYXdfcm9jX2ZhbGxpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS90ZW1wX3Jhd19yb2NfZmFsbGluZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL3RlbXBfcmF3X3JvY19mYWxsaW5nX3ZhbHVlCiBLZXJuZWxWZXJzaW9uOgkyLjYuMzcKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgotCQlQZXJpb2Qgb2YgdGltZSAoaW4gc2Vjb25kcykgb3ZlciB3aGljaCB0aGUgcmF3IGNoYW5uZWwgdmFsdWUKLQkJaXMgYXZlcmFnZWQgYmVmb3JlIGJlaW5nIGNvbXBhcmVkIHdpdGggdGhlIHRocmVzaG9sZCBzZXQgaW4KLQkJYWNjZWxfeDBfdGhyZXNoW19yaXNpbmd8X2ZhbGxpbmddX21lYW5wZXJpb2QuICBJZiBkaXJlY3Rpb24gaXMKLQkJbm90IHNwZWNpZmllZCB0aGVuIHRoaXMgbWVhbiBwZXJpb2QgYXBwbGllcyB0byBib3RoIGRpcmVjdGlvbnMuCisJCVNwZWNpZmllcyB0aGUgdmFsdWUgb2YgcmF0ZSBvZiBjaGFuZ2UgdGhyZXNob2xkIHRoYXQgdGhlCisJCWRldmljZSBpcyBjb21wYXJpbmcgYWdhaW5zdCBmb3IgdGhlIGV2ZW50cyBlbmFibGVkIGJ5CisJCTx0eXBlPltaXVtfbmFtZV1fcm9jW19yaXNpbmd8ZmFsbGluZ11fZW4uCisJCUlmIHNlcGFyYXRlIGF0dHJpYnV0ZXMgZXhpc3QgZm9yIHRoZSB0d28gZGlyZWN0aW9ucywKKwkJYnV0IGRpcmVjdGlvbiBpcyBub3Qgc3BlY2lmaWVkIGZvciB0aGlzIGF0dHJpYnV0ZSwKKwkJdGhlbiBhIHNpbmdsZSB0aHJlc2hvbGQgdmFsdWUgYXBwbGllcyB0byBib3RoIGRpcmVjdGlvbnMuCisJCVRoZSByYXcgb3IgaW5wdXQgZWxlbWVudCBvZiB0aGUgbmFtZSBpbmRpY2F0ZXMgd2hldGhlciB0aGUKKwkJdmFsdWUgaXMgaW4gcmF3IGRldmljZSB1bml0cyBvciBpbiBwcm9jZXNzZWQgdW5pdHMgKGFzIF9yYXcKKwkJYW5kIF9pbnB1dCBkbyBvbiBzeXNmcyBkaXJlY3QgY2hhbm5lbCByZWFkIGF0dHJpYnV0ZXMpLgogCi1XaGF0OgkJL3N5cy8uLi4vYWNjZWxfeDBfdGhyZXNoW19yaXNpbmd8X2ZhbGxpbmddX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3hfdGhyZXNoX3Jpc2luZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF94X3RocmVzaF9mYWxsaW5nX3BlcmlvZAoraGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeF9yb2NfcmlzaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3hfcm9jX2ZhbGxpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeV90aHJlc2hfcmlzaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3lfdGhyZXNoX2ZhbGxpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeV9yb2NfcmlzaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3lfcm9jX2ZhbGxpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfel90aHJlc2hfcmlzaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3pfdGhyZXNoX2ZhbGxpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfel9yb2NfcmlzaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3pfcm9jX2ZhbGxpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb194X3RocmVzaF9yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb194X3RocmVzaF9mYWxsaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9feF9yb2NfcmlzaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9feF9yb2NfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3lfdGhyZXNoX3Jpc2luZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3lfdGhyZXNoX2ZhbGxpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb195X3JvY19yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb195X3JvY19mYWxsaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9fel90aHJlc2hfcmlzaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9fel90aHJlc2hfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3pfcm9jX3Jpc2luZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3pfcm9jX2ZhbGxpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl94X3RocmVzaF9yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl94X3RocmVzaF9mYWxsaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25feF9yb2NfcmlzaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25feF9yb2NfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3lfdGhyZXNoX3Jpc2luZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3lfdGhyZXNoX2ZhbGxpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl95X3JvY19yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl95X3JvY19mYWxsaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25fel90aHJlc2hfcmlzaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25fel90aHJlc2hfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3pfcm9jX3Jpc2luZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3pfcm9jX2ZhbGxpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvaW5aX3N1cHBseV90aHJlc2hfcmlzaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2luWl9zdXBwbHlfdGhyZXNoX2ZhbGxpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvaW56X3N1cHBseV9yb2NfcmlzaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2luWl9zdXBwbHlfcm9jX2ZhbGxpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvaW5aX3RocmVzaF9yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvaW5aX3RocmVzaF9mYWxsaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2luWl9yb2NfcmlzaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2luWl9yb2NfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS90ZW1wX3RocmVzaF9yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvdGVtcF90aHJlc2hfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS90ZW1wX3JvY19yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvdGVtcF9yb2NfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF94Jnkmel9tYWdfZmFsbGluZ19wZXJpb2QKIEtlcm5lbFZlcnNpb246CTIuNi4zNwogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246Ci0JCVBlcmlvZCBvZiB0aW1lIChpbiBzZWNvbmRzKSBmb3Igd2hpY2ggdGhlIHRocmVzaG9sZCBtdXN0IGJlCi0JCXBhc3NlZCBiZWZvcmUgYW4gZXZlbnQgaXMgZ2VuZXJhdGVkLiBJZiBkaXJlY3Rpb24gaXMgbm90CisJCVBlcmlvZCBvZiB0aW1lIChpbiBzZWNvbmRzKSBmb3Igd2hpY2ggdGhlIGNvbmRpdGlvbiBtdXN0IGJlCisJCW1ldCBiZWZvcmUgYW4gZXZlbnQgaXMgZ2VuZXJhdGVkLiBJZiBkaXJlY3Rpb24gaXMgbm90CiAJCXNwZWNpZmllZCB0aGVuIHRoaXMgcGVyaW9kIGFwcGxpZXMgdG8gYm90aCBkaXJlY3Rpb25zLgogCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlW25dOmV2ZW50W21dL2FjY2VsX3gwX21hZ1tfcmlzaW5nfF9mYWxsaW5nXV9lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX21hZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX21hZ19yaXNpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF9tYWdfZmFsbGluZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3hfbWFnX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeF9tYWdfcmlzaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeF9tYWdfZmFsbGluZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3lfbWFnX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeV9tYWdfcmlzaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeV9tYWdfZmFsbGluZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3pfbWFnX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfel9tYWdfcmlzaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfel9tYWdfZmFsbGluZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3gmeSZ6X21hZ19yaXNpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF94Jnkmel9tYWdfZmFsbGluZ19lbgogS2VybmVsVmVyc2lvbjoJMi42LjM3CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKLQkJU2ltaWxhciB0byBhY2NlbF94MF90aHJlc2hbX3Jpc2luZ3xfZmFsbGluZ11fZW4sIGJ1dCBoZXJlIHRoZQorCQlTaW1pbGFyIHRvIGFjY2VsX3hfdGhyZXNoW19yaXNpbmd8X2ZhbGxpbmddX2VuLCBidXQgaGVyZSB0aGUKIAkJbWFnbml0dWRlIG9mIHRoZSBjaGFubmVsIGlzIGNvbXBhcmVkIHRvIHRoZSB0aHJlc2hvbGQsIG5vdCBpdHMKIAkJc2lnbmVkIHZhbHVlLgogCi1XaGF0OgkJL3N5cy8uLi4vYWNjZWxfeDBfPHJhd3xpbnB1dD5fbWFnW19yaXNpbmd8X2ZhbGxpbmddX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vYWNjZWxfcmF3X21hZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2FjY2VsX3hfcmF3X21hZ19yaXNpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9hY2NlbF95X3Jhd19tYWdfcmlzaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vYWNjZWxfel9yYXdfbWFnX3Jpc2luZ192YWx1ZQogS2VybmVsVmVyc2lvbjoJMi42LjM3CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKLQkJVGhlIHZhbHVlIHRvIHdoaWNoIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGNoYW5uZWwgaXMgY29tcGFyZWQuCisJCVRoZSB2YWx1ZSB0byB3aGljaCB0aGUgbWFnbml0dWRlIG9mIHRoZSBjaGFubmVsIGlzIGNvbXBhcmVkLiBJZgorCQludW1iZXIgb3IgZGlyZWN0aW9uIGlzIG5vdCBzcGVjaWZpZWQsIGFwcGxpZXMgdG8gYWxsIGNoYW5uZWxzIG9mCisJCXRoaXMgdHlwZS4KIAotV2hhdDoJCS9zeXMvLi4uL2FjY2VsX3gwX21hZ1tfcmlzaW5nfF9mYWxsaW5nXV9tZWFucGVyaW9kCi1LZXJuZWxWZXJzaW9uOgkyLjYuMzcKLUNvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKLURlc2NyaXB0aW9uOgotCQlQZXJpb2Qgb2YgdGltZSAoaW4gc2Vjb25kcykgb3ZlciB3aGljaCB0aGUgdmFsdWUgb2YgdGhlIGNoYW5uZWwKLQkJaXMgYXZlcmFnZWQgYmVmb3JlIGJlaW5nIGNvbXBhcmVkIHRvIHRoZSB0aHJlc2hvbGQKLQotV2hhdDoJCS9zeXMvLi4uL2FjY2VsX3gwX21hZ1tfcmlzaW5nfF9mYWxsaW5nXV9wZXJpb2QKLUtlcm5lbFZlcnNpb246CTIuNi4zNwotQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwotRGVzY3JpcHRpb246Ci0JCVBlcmlvZCBvZiB0aW1lIChpbiBzZWNvbmRzKSBmb3Igd2hpY2ggdGhlIGNvbmRpdGlvbiBtdXN0IGJlIHRydWUKLQkJYmVmb3JlIGFuIGV2ZW50IG9jY3Vycy4KLQotV2hhdDoJCS9zeXMvLi4uL2RldmljZVtuXTpldmVudFttXS9hY2NlbF94MF9yb2NbX3Jpc2luZ3xfZmFsbGluZ11fZW4KLUtlcm5lbFZlcnNpb246CTIuNi4zNwotQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwotRGVzY3JpcHRpb246Ci0JCVNpbWlsYXIgdG8gYWNjZWxfeDBfdGhyZXNoW19yaXNpbmd8X2ZhbGxpbmddX2VuLCBidXQgaGVyZSB0aGUKLQkJZmlyc3QgZGlmZmVyZW50aWFsIGlzIGNvbXBhcmVkIHdpdGggdGhlIHRocmVzaG9sZC4KLQotV2hhdDoJCS9zeXMvLi4uL2FjY2VsX3gwXzxyYXd8aW5wdXQ+X3JvY1tfcmlzaW5nfF9mYWxsaW5nXV92YWx1ZQotS2VybmVsVmVyc2lvbjoJMi42LjM3Ci1Db250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCi1EZXNjcmlwdGlvbjoKLQkJVGhlIHZhbHVlIHRvIHdoaWNoIHRoZSBmaXJzdCBkaWZmZXJlbnRpYWwgb2YgdGhlIGNoYW5uZWwgaXMKLQkJY29tcGFyZWQuCi0KLVdoYXQ6CQkvc3lzLy4uLi9hY2NlbF94MF9yb2NbX3Jpc2luZ3xfZmFsbGluZ11fbWVhbnBlcmlvZAotS2VybmVsVmVyc2lvbjoJMi42LjM3Ci1Db250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCi1EZXNjcmlwdGlvbjoKLQkJUGVyaW9kIG9mIHRpbWUgKGluIHNlY29uZHMpIG92ZXIgd2hpY2ggdGhlIHZhbHVlIG9mIHRoZSBjaGFubmVsCi0JCWlzIGF2ZXJhZ2VkIGJlZm9yZSBiZWluZyBjb21wYXJlZCB0byB0aGUgdGhyZXNob2xkCi0KLVdoYXQ6CQkvc3lzLy4uLi9hY2NlbF94MF9yb2NbX3Jpc2luZ3xfZmFsbGluZ11fcGVyaW9kCi1LZXJuZWxWZXJzaW9uOgkyLjYuMzcKLUNvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKLURlc2NyaXB0aW9uOgotCQlQZXJpb2Qgb2YgdGltZSAoaW4gc2Vjb25kcykgZm9yIHdoaWNoIHRoZSBjb25kaXRpb24gbXVzdCBiZSB0cnVlCi0JCWJlZm9yZSBhbiBldmVudCBvY2N1cnMuCi0KLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2Vbbl0vZGV2aWNlW25dOmJ1ZmZlcjpldmVudC9kZXYKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlcjpldmVudC9kZXYKIEtlcm5lbFZlcnNpb246CTIuNi4zNQogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246Ci0JCUJ1ZmZlciBmb3IgZGV2aWNlIG4gZXZlbnQgY2hhcmFjdGVyIGRldmljZSBtYWpvcjptaW5vciBudW1iZXJzLgorCQlCdWZmZXIgZm9yIGRldmljZSBYIGV2ZW50IGNoYXJhY3RlciBkZXZpY2UgbWFqb3I6bWlub3IgbnVtYmVycy4KIAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVtuXS9kZXZpY2Vbbl06YnVmZmVyOmFjY2Vzcy9kZXYKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlcjphY2Nlc3MvZGV2CiBLZXJuZWxWZXJzaW9uOgkyLjYuMzUKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgotCQlCdWZmZXIgZm9yIGRldmljZSBuIGFjY2VzcyBjaGFyYWN0ZXIgZGV2aWNlIG8gbWFqb3I6bWlub3IgbnVtYmVycy4KKwkJQnVmZmVyIGZvciBkZXZpY2UgWCBhY2Nlc3MgY2hhcmFjdGVyIGRldmljZSBtYWpvcjptaW5vciBudW1iZXJzLgogCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlW25dOmJ1ZmZlci90cmlnZ2VyCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvdHJpZ2dlcgogS2VybmVsVmVyc2lvbjoJMi42LjM1CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKIAkJVGhlIG5hbWUgb2YgdGhlIHRyaWdnZXIgc291cmNlIGJlaW5nIHVzZWQsIGFzIHBlciBzdHJpbmcgZ2l2ZW4KLQkJaW4gL3N5cy9jbGFzcy9paW8vdHJpZ2dlcltuXS9uYW1lLgorCQlpbiAvc3lzL2NsYXNzL2lpby90cmlnZ2VyWS9uYW1lLgogCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlW25dOmJ1ZmZlci9sZW5ndGgKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9sZW5ndGgKIEtlcm5lbFZlcnNpb246CTIuNi4zNQogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CiAJCU51bWJlciBvZiBzY2FucyBjb250YWluZWQgYnkgdGhlIGJ1ZmZlci4KIAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVtuXTpidWZmZXIvYnl0ZXNfcGVyX2RhdHVtCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvYnl0ZXNfcGVyX2RhdHVtCiBLZXJuZWxWZXJzaW9uOgkyLjYuMzcKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgogCQlCeXRlcyBwZXIgc2Nhbi4gIER1ZSB0byBhbGlnbm1lbnQgZnVuLCB0aGUgc2NhbiBtYXkgYmUgbGFyZ2VyCiAJCXRoYW4gaW1wbGllZCBkaXJlY3RseSBieSB0aGUgc2Nhbl9lbGVtZW50IHBhcmFtZXRlcnMuCiAKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2Vbbl06YnVmZmVyL2VuYWJsZQorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL2VuYWJsZQogS2VybmVsVmVyc2lvbjoJMi42LjM1CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKIAkJQWN0dWFsbHkgc3RhcnQgdGhlIGJ1ZmZlciBjYXB0dXJlIHVwLiAgV2lsbCBzdGFydCB0cmlnZ2VyCiAJCWlmIGZpcnN0IGRldmljZSBhbmQgYXBwcm9wcmlhdGUuCiAKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2Vbbl06YnVmZmVyL2FsaWdubWVudAotS2VybmVsVmVyc2lvbjoJMi42LjM1Ci1Db250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCi1EZXNjcmlwdGlvbjoKLQkJTWluaW11bSBkYXRhIGFsaWdubWVudC4gIFNjYW4gZWxlbWVudHMgbGFyZ2VyIHRoYW4gdGhpcyBhcmUKLQkJYWxpZ25lZCB0byB0aGUgbmVhcmVzdCBwb3dlciBvZiAyIHRpbWVzIHRoaXMuICAobWF5IG5vdCBiZQotCQl0cnVlIGluIHdlaXJkIGhhcmR3YXJlIGJ1ZmZlcnMgdGhhdCBwYWNrIGRhdGEgd2VsbCkKLQotV2hhdDoJCS9zeXMvLi4uL2RldmljZVtuXS9idWZmZXIvc2Nhbl9lbGVtZW50cworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMKIEtlcm5lbFZlcnNpb246CTIuNi4zNwogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CiAJCURpcmVjdG9yeSBjb250YWluaW5nIGludGVyZmFjZXMgZm9yIGVsZW1lbnRzIHRoYXQgd2lsbCBiZQogCQljYXB0dXJlZCBmb3IgYSBzaW5nbGUgdHJpZ2dlcmVkIHNhbXBsZSBzZXQgaW4gdGhlIGJ1ZmZlci4KIAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVtuXS9idWZmZXIvc2Nhbl9lbGVtZW50cy9hY2NlbF94MF9lbgorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvYWNjZWxfeF9lbgorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvYWNjZWxfeV9lbgorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvYWNjZWxfel9lbgorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvZ3lyb194X2VuCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9neXJvX3lfZW4KK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL2d5cm9fel9lbgorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvbWFnbl94X2VuCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9tYWduX3lfZW4KK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL21hZ25fel9lbgorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvdGltZXN0YW1wX2VuCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9pbllfc3VwcGx5X2VuCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9pbllfZW4KK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL2luWS1pblpfZW4KK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL2luY2xpX3hfZW4KK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL2luY2xpX3lfZW4KIEtlcm5lbFZlcnNpb246CTIuNi4zNwogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CiAJCVNjYW4gZWxlbWVudCBjb250cm9sIGZvciB0cmlnZ2VyZWQgZGF0YSBjYXB0dXJlLgogCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlW25dL2J1ZmZlci9zY2FuX2VsZW1lbnRzL2FjY2VsW194MF1fdHlwZQorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvYWNjZWxfdHlwZQorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvZ3lyb190eXBlCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9tYWduX3R5cGUKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL2luY2xpX3R5cGUKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL2luWV90eXBlCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9pbi1pbl90eXBlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9pbllfc3VwcGx5X3R5cGUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL3RpbWVzdGFtcF90eXBlCiBLZXJuZWxWZXJzaW9uOgkyLjYuMzcKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgogCQlEZXNjcmlwdGlvbiBvZiB0aGUgc2NhbiBlbGVtZW50IGRhdGEgc3RvcmFnZSB3aXRoaW4gdGhlIGJ1ZmZlcgotCQlhbmQgaGVuY2UgdGhlIGZvcm0gaW4gd2hpY2ggaXQgaXMgcmVhZCBmcm9tIHVzZXJzcGFjZS4KLQkJRm9ybSBpcyBbc3x1XWJpdHMvc3RvcmFnZWJpdHMuICBzIG9yIHUgc3BlY2lmaWVzIGlmIHNpZ25lZAotCQkoMidzIGNvbXBsZW1lbnQpIG9yIHVuc2lnbmVkLiBiaXRzIGlzIHRoZSBudW1iZXIgb2YgYml0cyBvZgotCQlkYXRhIGFuZCBzdG9yYWdlYml0cyBpcyB0aGUgc3BhY2UgKGFmdGVyIHBhZGRpbmcpIHRoYXQgaXQKLQkJb2NjdXBpZXMgaW4gdGhlIGJ1ZmZlci4gIE5vdGUgdGhhdCBzb21lIGRldmljZXMgd2lsbCBoYXZlCi0JCWFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaW4gdGhlIHVudXNlZCBiaXRzIHNvIHRvIGdldCBhIGNsZWFuCi0JCXZhbHVlLCB0aGUgYml0cyB2YWx1ZSBtdXN0IGJlIHVzZWQgdG8gbWFzayB0aGUgYnVmZmVyIG91dHB1dAotCQl2YWx1ZSBhcHByb3ByaWF0ZWx5LiAgVGhlIHN0b3JhZ2ViaXRzIHZhbHVlIGFsc28gc3BlY2lmaWVzIHRoZQotCQlkYXRhIGFsaWdubWVudC4gIFNvIHM0OC82NCB3aWxsIGJlIGEgc2lnbmVkIDQ4IGJpdCBpbnRlZ2VyCi0JCXN0b3JlZCBpbiBhIDY0IGJpdCBsb2NhdGlvbiBhbGlnbmVkIHRvIGEgYTY0IGJpdCBib3VuZGFyeS4KKwkJYW5kIGhlbmNlIHRoZSBmb3JtIGluIHdoaWNoIGl0IGlzIHJlYWQgZnJvbSB1c2VyLXNwYWNlLgorCQlGb3JtIGlzIFtzfHVdYml0cy9zdG9yYWdlYml0c1s+PnNoaWZ0XS4gIHMgb3IgdSBzcGVjaWZpZXMgaWYKKwkJc2lnbmVkICgyJ3MgY29tcGxlbWVudCkgb3IgdW5zaWduZWQuIGJpdHMgaXMgdGhlIG51bWJlciBvZiBiaXRzCisJCW9mIGRhdGEgYW5kIHN0b3JhZ2ViaXRzIGlzIHRoZSBzcGFjZSAoYWZ0ZXIgcGFkZGluZykgdGhhdCBpdAorCQlvY2N1cGllcyBpbiB0aGUgYnVmZmVyLiBzaGlmdCBpZiBzcGVjaWZpZWQsIGlzIHRoZSBzaGlmdCB0aGF0CisJCW5lZWRzIHRvIGJlIGFwcGxpZWQgcHJpb3IgdG8gbWFza2luZyBvdXQgdW51c2VkIGJpdHMuIFNvbWUKKwkJZGV2aWNlcyBwdXQgdGhlaXIgZGF0YSBpbiB0aGUgbWlkZGxlIG9mIHRoZSB0cmFuc2ZlcnJlZCBlbGVtZW50cworCQl3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gYm90aCBzaWRlcy4gIE5vdGUgdGhhdCBzb21lCisJCWRldmljZXMgd2lsbCBoYXZlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaW4gdGhlIHVudXNlZCBiaXRzCisJCXNvIHRvIGdldCBhIGNsZWFuIHZhbHVlLCB0aGUgYml0cyB2YWx1ZSBtdXN0IGJlIHVzZWQgdG8gbWFzaworCQl0aGUgYnVmZmVyIG91dHB1dCB2YWx1ZSBhcHByb3ByaWF0ZWx5LiAgVGhlIHN0b3JhZ2ViaXRzIHZhbHVlCisJCWFsc28gc3BlY2lmaWVzIHRoZSBkYXRhIGFsaWdubWVudC4gIFNvIHM0OC82ND4+MiB3aWxsIGJlIGEKKwkJc2lnbmVkIDQ4IGJpdCBpbnRlZ2VyIHN0b3JlZCBpbiBhIDY0IGJpdCBsb2NhdGlvbiBhbGlnbmVkIHRvCisJCWEgYTY0IGJpdCBib3VuZGFyeS4gVG8gb2J0YWluIHRoZSBjbGVhbiB2YWx1ZSwgc2hpZnQgcmlnaHQgMgorCQlhbmQgYXBwbHkgYSBtYXNrIHRvIHplcm8gdGhlIHRvcCAxNiBiaXRzIG9mIHRoZSByZXN1bHQuCiAJCUZvciBvdGhlciBzdG9yYWdlIGNvbWJpbmF0aW9ucyB0aGlzIGF0dHJpYnV0ZSB3aWxsIGJlIGV4dGVuZGVkCiAJCWFwcHJvcHJpYXRlbHkuCiAKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2Vbbl0vYnVmZmVyL3NjYW5fZWxlbWVudHMvYWNjZWxbX3gwXV9pbmRleAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvYWNjZWxfdHlwZV9hdmFpbGFibGUKK0tlcm5lbFZlcnNpb246CTIuNi4zNworQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCUlmIHRoZSB0eXBlIHBhcmFtZXRlciBjYW4gdGFrZSBvbmUgb2YgYSBzbWFsbCBzZXQgb2YgdmFsdWVzLAorCQl0aGlzIGF0dHJpYnV0ZSBsaXN0cyB0aGVtLgorCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9pbllfaW5kZXgKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL2luWV9zdXBwbHlfaW5kZXgKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL2FjY2VsX3hfaW5kZXgKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL2FjY2VsX3lfaW5kZXgKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL2FjY2VsX3pfaW5kZXgKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL2d5cm9feF9pbmRleAorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvZ3lyb195X2luZGV4CitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9neXJvX3pfaW5kZXgKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL21hZ25feF9pbmRleAorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvbWFnbl95X2luZGV4CitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9tYWduX3pfaW5kZXgKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL2luY2xpX3hfaW5kZXgKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL2luY2xpX3lfaW5kZXgKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL3RpbWVzdGFtcF9pbmRleAogS2VybmVsVmVyc2lvbjoJMi42LjM3CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKIAkJQSBzaW5nbGUgcG9zaXRpdmUgaW50ZWdlciBzcGVjaWZ5aW5nIHRoZSBwb3NpdGlvbiBvZiB0aGlzCi0JCXNjYW4gZWxlbWVudCBpbiB0aGUgYnVmZmVyLiBOb3RlIHRoZXNlIGFyZSBub3QgZGVwZW5kYW50IG9uCi0JCXdoYXQgaXMgZW5hYmxlZCBhbmQgbWF5IG5vdCBiZSBjb250aWd1b3VzLiBUaHVzIGZvciB1c2Vyc3BhY2UKKwkJc2NhbiBlbGVtZW50IGluIHRoZSBidWZmZXIuIE5vdGUgdGhlc2UgYXJlIG5vdCBkZXBlbmRlbnQgb24KKwkJd2hhdCBpcyBlbmFibGVkIGFuZCBtYXkgbm90IGJlIGNvbnRpZ3VvdXMuIFRodXMgZm9yIHVzZXItc3BhY2UKIAkJdG8gZXN0YWJsaXNoIHRoZSBmdWxsIGxheW91dCB0aGVzZSBtdXN0IGJlIHVzZWQgaW4gY29uanVuY3Rpb24KIAkJd2l0aCBhbGwgX2VuIGF0dHJpYnV0ZXMgdG8gZXN0YWJsaXNoIHdoaWNoIGNoYW5uZWxzIGFyZSBwcmVzZW50LAogCQlhbmQgdGhlIHJlbGV2YW50IF90eXBlIGF0dHJpYnV0ZXMgdG8gZXN0YWJsaXNoIHRoZSBkYXRhIHN0b3JhZ2UKIAkJZm9ybWF0LgotCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlW25dL2J1ZmZlci9zY2FuX2VsZW1lbnRzL2FjY2VsW194MF1fc2hpZnQKLUtlcm5lbFZlcnNpb246CTIuNi4zNwotQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwotRGVzY3JpcHRpb246Ci0JCUEgYml0IHNoaWZ0ICh0byByaWdodCkgdGhhdCBtdXN0IGJlIGFwcGxpZWQgcHJpb3IgdG8KLQkJZXh0cmFjdGluZyB0aGUgYml0cyBzcGVjaWZpZWQgYnkgYWNjZWxbX3gwXV9wcmVjaXNpb24uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL0RvY3VtZW50YXRpb24vc3lzZnMtYnVzLWlpby1kZHMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL0RvY3VtZW50YXRpb24vc3lzZnMtYnVzLWlpby1kZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZkZDU0NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vRG9jdW1lbnRhdGlvbi9zeXNmcy1idXMtaWlvLWRkcwpAQCAtMCwwICsxLDkzIEBACisKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy8uLi4vZGRzWF9mcmVxWQorS2VybmVsVmVyc2lvbjoJMi42LjM3CitDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJU3RvcmVzIGZyZXF1ZW5jeSBpbnRvIHR1bmluZyB3b3JkIFkuCisJCVRoZXJlIHdpbGwgYmUgbW9yZSB0aGFuIG9uZSBkZHNYX2ZyZXFZIGZpbGUsIHdoaWNoIGFsbG93cyBmb3IKKwkJcGluIGNvbnRyb2xsZWQgRlNLIEZyZXF1ZW5jeSBTaGlmdCBLZXlpbmcKKwkJKGRkc1hfcGluY29udHJvbF9mcmVxX2VuIGlzIGFjdGl2ZSkgb3IgdGhlIHVzZXIgY2FuIGNvbnRyb2wKKwkJdGhlIGRlc2lyZWQgYWN0aXZlIHR1bmluZyB3b3JkIGJ5IHdyaXRpbmcgWSB0byB0aGUKKwkJZGRzWF9mcmVxc3ltYm9sIGZpbGUuCisKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy8uLi4vZGRzWF9mcmVxWV9zY2FsZQorS2VybmVsVmVyc2lvbjoJMi42LjM3CitDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJU2NhbGUgdG8gYmUgYXBwbGllZCB0byBkZHNYX2ZyZXFZIGluIG9yZGVyIHRvIG9idGFpbiB0aGUKKwkJZGVzaXJlZCB2YWx1ZSBpbiBIei4gSWYgc2hhcmVkIGFjcm9zcyBhbGwgZnJlcXVlbmN5IHJlZ2lzdGVycworCQlZIGlzIG5vdCBwcmVzZW50LiBJdCBpcyBhbHNvIHBvc3NpYmxlIFggaXMgbm90IHByZXNlbnQgaWYKKwkJc2hhcmVkIGFjcm9zcyBhbGwgY2hhbm5lbHMuCisKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy8uLi4vZGRzWF9mcmVxc3ltYm9sCitLZXJuZWxWZXJzaW9uOgkyLjYuMzcKK0NvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlTcGVjaWZpZXMgdGhlIGFjdGl2ZSBvdXRwdXQgZnJlcXVlbmN5IHR1bmluZyB3b3JkLiBUaGUgdmFsdWUKKwkJY29ycmVzcG9uZHMgdG8gdGhlIFkgaW4gZGRzWF9mcmVxWS4gVG8gZXhpdCB0aGlzIG1vZGUgdGhlIHVzZXIKKwkJY2FuIHdyaXRlIGRkc1hfcGluY29udHJvbF9mcmVxX2VuIG9yIGRkc1hfb3V0X2VuYWJsZSBmaWxlLgorCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvLi4uL2Rkc1hfcGhhc2VZCitLZXJuZWxWZXJzaW9uOgkyLjYuMzcKK0NvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlTdG9yZXMgcGhhc2UgaW50byBZLgorCQlUaGVyZSB3aWxsIGJlIG1vcmUgdGhhbiBvbmUgZGRzWF9waGFzZVkgZmlsZSwgd2hpY2ggYWxsb3dzIGZvcgorCQlwaW4gY29udHJvbGxlZCBQU0sgUGhhc2UgU2hpZnQgS2V5aW5nCisJCShkZHNYX3BpbmNvbnRyb2xfcGhhc2VfZW4gaXMgYWN0aXZlKSBvciB0aGUgdXNlciBjYW4KKwkJY29udHJvbCB0aGUgZGVzaXJlZCBwaGFzZSBZIHdoaWNoIGlzIGFkZGVkIHRvIHRoZSBwaGFzZQorCQlhY2N1bXVsYXRvciBvdXRwdXQgYnkgd3JpdGluZyBZIHRvIHRoZSBlbl9waGFzZSBmaWxlLgorCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvLi4uL2Rkc1hfcGhhc2VZX3NjYWxlCitLZXJuZWxWZXJzaW9uOgkyLjYuMzcKK0NvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlTY2FsZSB0byBiZSBhcHBsaWVkIHRvIGRkc1hfcGhhc2VZIGluIG9yZGVyIHRvIG9idGFpbiB0aGUKKwkJZGVzaXJlZCB2YWx1ZSBpbiByYWQuIElmIHNoYXJlZCBhY3Jvc3MgYWxsIHBoYXNlIHJlZ2lzdGVycworCQlZIGlzIG5vdCBwcmVzZW50LiBJdCBpcyBhbHNvIHBvc3NpYmxlIFggaXMgbm90IHByZXNlbnQgaWYKKwkJc2hhcmVkIGFjcm9zcyBhbGwgY2hhbm5lbHMuCisKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy8uLi4vZGRzWF9waGFzZXN5bWJvbAorS2VybmVsVmVyc2lvbjoJMi42LjM3CitDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJU3BlY2lmaWVzIHRoZSBhY3RpdmUgcGhhc2UgWSB3aGljaCBpcyBhZGRlZCB0byB0aGUgcGhhc2UKKwkJYWNjdW11bGF0b3Igb3V0cHV0LiBUaGUgdmFsdWUgY29ycmVzcG9uZHMgdG8gdGhlIFkgaW4KKwkJZGRzWF9waGFzZVkuIFRvIGV4aXQgdGhpcyBtb2RlIHRoZSB1c2VyIGNhbiB3cml0ZQorCQlkZHNYX3BpbmNvbnRyb2xfcGhhc2VfZW4gb3IgZGlzYWJsZSBmaWxlLgorCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvLi4uL2Rkc1hfcGluY29udHJvbF9lbgorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzLy4uLi9kZHNYX3BpbmNvbnRyb2xfZnJlcV9lbgorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzLy4uLi9kZHNYX3BpbmNvbnRyb2xfcGhhc2VfZW4KK0tlcm5lbFZlcnNpb246CTIuNi4zNworQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCWRkc1hfcGluY29udHJvbF9lbjogQm90aCwgdGhlIGFjdGl2ZSBmcmVxdWVuY3kgYW5kIHBoYXNlIGlzCisJCWNvbnRyb2xsZWQgYnkgdGhlIHJlc3BlY3RpdmUgcGhhc2UgYW5kIGZyZXF1ZW5jeSBjb250cm9sIGlucHV0cy4KKwkJSW4gY2FzZSB0aGUgZGV2aWNlIGluIHF1ZXN0aW9uIGFsbG93cyB0byBpbmRlcGVuZGVudCBjb250cm9scywKKwkJdGhlbiB0aGVyZSBhcmUgZGVkaWNhdGVkIGZpbGVzIChkZHNYX3BpbmNvbnRyb2xfZnJlcV9lbiwKKwkJZGRzWF9waW5jb250cm9sX3BoYXNlX2VuKS4KKworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzLy4uLi9kZHNYX291dF9lbmFibGUKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy8uLi4vZGRzWF9vdXRZX2VuYWJsZQorS2VybmVsVmVyc2lvbjoJMi42LjM3CitDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJZGRzWF9vdXRZX2VuYWJsZSBjb250cm9scyBzaWduYWwgZ2VuZXJhdGlvbiBvbiBvdXRwdXQgWSBvZgorCQljaGFubmVsIFguIFkgbWF5IGJlIHN1cHByZXNzZWQgaWYgYWxsIGNoYW5uZWxzIGFyZQorCQljb250cm9sbGVkIHRvZ2V0aGVyLgorCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvLi4uL2Rkc1hfb3V0WV93YXZldHlwZQorS2VybmVsVmVyc2lvbjoJMi42LjM3CitDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJU3BlY2lmaWVzIHRoZSBvdXRwdXQgd2F2ZWZvcm0uCisJCShzaW5lLCB0cmlhbmdsZSwgcmFtcCwgc3F1YXJlLCAuLi4pCisJCUZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlIG91dHB1dCB3YXZlZm9ybSBvcHRpb25zIHJlYWQKKwkJYXZhaWxhYmxlX291dHB1dF9tb2Rlcy4KKworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzLy4uLi9kZHNYX291dFlfd2F2ZXR5cGVfYXZhaWxhYmxlCitLZXJuZWxWZXJzaW9uOgkyLjYuMzcKK0NvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlMaXN0cyBhbGwgYXZhaWxhYmxlIG91dHB1dCB3YXZlZm9ybSBvcHRpb25zLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2lpby9LY29uZmlnCmluZGV4IGVkNDg4MTUuLmUyYWMwN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL0tjb25maWcKQEAgLTQyLDExICs0MiwxNSBAQAogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvS2NvbmZpZyIKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvS2NvbmZpZyIKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2lpby9hZGRhYy9LY29uZmlnIgorc291cmNlICJkcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9LY29uZmlnIgorc291cmNlICJkcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vS2NvbmZpZyIKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvS2NvbmZpZyIKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvaWlvL21hZ25ldG9tZXRlci9LY29uZmlnIgotCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvS2NvbmZpZyIKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2lpby9yZXNvbHZlci9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvaWlvL3RyaWdnZXIvS2NvbmZpZyIKIAogZW5kaWYgIyBJSU8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL01ha2VmaWxlCmluZGV4IGU5MDk2NzQuLmY5YjVmYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9NYWtlZmlsZQpAQCAtMTEsOCArMTEsMTMgQEAKIAogb2JqLXkgKz0gYWNjZWwvCiBvYmoteSArPSBhZGMvCitvYmoteSArPSBhZGRhYy8KK29iai15ICs9IGRhYy8KK29iai15ICs9IGRkcy8KIG9iai15ICs9IGd5cm8vCiBvYmoteSArPSBpbXUvCiBvYmoteSArPSBsaWdodC8KLW9iai15ICs9IHRyaWdnZXIvCiBvYmoteSArPSBtYWduZXRvbWV0ZXIvCitvYmoteSArPSBtZXRlci8KK29iai15ICs9IHJlc29sdmVyLworb2JqLXkgKz0gdHJpZ2dlci8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vVE9ETwppbmRleCA4OThjYmExLi5kMWFkMzVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL1RPRE8KKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9UT0RPCkBAIC02MSw2ICs2MSwxMCBAQAogZmlsZXMuIChhdm9pZGVkIGF0IHRoZSBtb21lbnQgdG8ga2VlcCB0aGUgZHJpdmVyIHNldAogY29udGFpbmVkIGluIHN0YWdpbmcpLgogCitBREkgRHJpdmVyczoKK0NDIHRoZSBkZXZpY2UtZHJpdmVycy1kZXZlbEBibGFja2Zpbi51Y2xpbnV4Lm9yZyBtYWlsaW5nIGxpc3Qgd2hlbgorZS1tYWlsaW5nIHRoZSBub3JtYWwgSUlPIGxpc3QgKHNlZSBiZWxvdykuCisKIERvY3VtZW50YXRpb24KIDEpIExvdHMgb2YgY2xlYW51cCBhbmQgZXhwYW5zaW9uLgogMikgU29tZSBkZXZpY2UgcmVxdWlyZSBpbmR2aWR1YWwgZG9jcy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvS2NvbmZpZwppbmRleCA1OTI2YzAzLi5hMzRmMWQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9LY29uZmlnCkBAIC0zLDYgKzMsMzMgQEAKICMKIGNvbW1lbnQgIkFjY2VsZXJvbWV0ZXJzIgogCitjb25maWcgQURJUzE2MjAxCisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFESVMxNjIwMSBEdWFsLUF4aXMgRGlnaXRhbCBJbmNsaW5vbWV0ZXIgYW5kIEFjY2VsZXJvbWV0ZXIiCisJZGVwZW5kcyBvbiBTUEkKKwlzZWxlY3QgSUlPX1RSSUdHRVIgaWYgSUlPX1JJTkdfQlVGRkVSCisJc2VsZWN0IElJT19TV19SSU5HIGlmIElJT19SSU5HX0JVRkZFUgorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBhZGlzMTYyMDEgZHVhbC1heGlzCisJICBkaWdpdGFsIGluY2xpbm9tZXRlciBhbmQgYWNjZWxlcm9tZXRlci4KKworY29uZmlnIEFESVMxNjIwMworCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRElTMTYyMDMgUHJvZ3JhbW1hYmxlIDM2MCBEZWdyZWVzIEluY2xpbm9tZXRlciIKKwlkZXBlbmRzIG9uIFNQSQorCXNlbGVjdCBJSU9fVFJJR0dFUiBpZiBJSU9fUklOR19CVUZGRVIKKwlzZWxlY3QgSUlPX1NXX1JJTkcgaWYgSUlPX1JJTkdfQlVGRkVSCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIGFkaXMxNjIwMyBQcm9ncmFtbWFibGUKKwkgIDM2MCBEZWdyZWVzIEluY2xpbm9tZXRlci4KKworY29uZmlnIEFESVMxNjIwNAorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRElTMTYyMDQgUHJvZ3JhbW1hYmxlIEhpZ2gtZyBEaWdpdGFsIEltcGFjdCBTZW5zb3IgYW5kIFJlY29yZGVyIgorCWRlcGVuZHMgb24gU1BJCisJc2VsZWN0IElJT19UUklHR0VSIGlmIElJT19SSU5HX0JVRkZFUgorCXNlbGVjdCBJSU9fU1dfUklORyBpZiBJSU9fUklOR19CVUZGRVIKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgYWRpczE2MjA0IFByb2dyYW1tYWJsZQorCSAgSGlnaC1nIERpZ2l0YWwgSW1wYWN0IFNlbnNvciBhbmQgUmVjb3JkZXIuCisKIGNvbmZpZyBBRElTMTYyMDkKIAl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQURJUzE2MjA5IER1YWwtQXhpcyBEaWdpdGFsIEluY2xpbm9tZXRlciBhbmQgQWNjZWxlcm9tZXRlciIKIAlkZXBlbmRzIG9uIFNQSQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvTWFrZWZpbGUKaW5kZXggZmY4NDcwMy4uMWIyYTZkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL01ha2VmaWxlCkBAIC0yLDYgKzIsMTggQEAKICMgTWFrZWZpbGUgZm9yIGluZHVzdHJpYWwgSS9PIGFjY2VsZXJvbWV0ZXIgZHJpdmVycwogIwogCithZGlzMTYyMDEteSAgICAgICAgICAgICA6PSBhZGlzMTYyMDFfY29yZS5vCithZGlzMTYyMDEtJChDT05GSUdfSUlPX1JJTkdfQlVGRkVSKSArPSBhZGlzMTYyMDFfcmluZy5vIGFkaXMxNjIwMV90cmlnZ2VyLm8KK29iai0kKENPTkZJR19BRElTMTYyMDEpICs9IGFkaXMxNjIwMS5vCisKK2FkaXMxNjIwMy15ICAgICAgICAgICAgIDo9IGFkaXMxNjIwM19jb3JlLm8KK2FkaXMxNjIwMy0kKENPTkZJR19JSU9fUklOR19CVUZGRVIpICs9IGFkaXMxNjIwM19yaW5nLm8gYWRpczE2MjAzX3RyaWdnZXIubworb2JqLSQoQ09ORklHX0FESVMxNjIwMykgKz0gYWRpczE2MjAzLm8KKworYWRpczE2MjA0LXkgICAgICAgICAgICAgOj0gYWRpczE2MjA0X2NvcmUubworYWRpczE2MjA0LSQoQ09ORklHX0lJT19SSU5HX0JVRkZFUikgKz0gYWRpczE2MjA0X3JpbmcubyBhZGlzMTYyMDRfdHJpZ2dlci5vCitvYmotJChDT05GSUdfQURJUzE2MjA0KSArPSBhZGlzMTYyMDQubworCiBhZGlzMTYyMDkteSAgICAgICAgICAgICA6PSBhZGlzMTYyMDlfY29yZS5vCiBhZGlzMTYyMDktJChDT05GSUdfSUlPX1JJTkdfQlVGRkVSKSArPSBhZGlzMTYyMDlfcmluZy5vIGFkaXMxNjIwOV90cmlnZ2VyLm8KIG9iai0kKENPTkZJR19BRElTMTYyMDkpICs9IGFkaXMxNjIwOS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FjY2VsLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FjY2VsLmgKaW5kZXggZjVmNjFiMi4uNTA2NTFmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hY2NlbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWNjZWwuaApAQCAtNjUsMyArNjUsMjMgQEAKICNkZWZpbmUgSUlPX0RFVl9BVFRSX0FDQ0VMX1ooX3Nob3csIF9hZGRyKQkJCVwKIAlJSU9fREVWSUNFX0FUVFIoYWNjZWxfel9yYXcsIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKIAorI2RlZmluZSBJSU9fREVWX0FUVFJfQUNDRUxfWFkoX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIoYWNjZWxfeHksIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQUNDRUxfUEVBSyhfc2hvdywgX2FkZHIpCQkJXAorCUlJT19ERVZJQ0VfQVRUUihhY2NlbF9wZWFrLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FDQ0VMX1hQRUFLKF9zaG93LCBfYWRkcikJCQlcCisJSUlPX0RFVklDRV9BVFRSKGFjY2VsX3hwZWFrLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FDQ0VMX1lQRUFLKF9zaG93LCBfYWRkcikJCQlcCisJSUlPX0RFVklDRV9BVFRSKGFjY2VsX3lwZWFrLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FDQ0VMX1pQRUFLKF9zaG93LCBfYWRkcikJCQlcCisJSUlPX0RFVklDRV9BVFRSKGFjY2VsX3pwZWFrLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FDQ0VMX1hZUEVBSyhfc2hvdywgX2FkZHIpCQlcCisJSUlPX0RFVklDRV9BVFRSKGFjY2VsX3h5cGVhaywgU19JUlVHTywgX3Nob3csIE5VTEwsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9BQ0NFTF9YWVpQRUFLKF9zaG93LCBfYWRkcikJCVwKKwlJSU9fREVWSUNFX0FUVFIoYWNjZWxfeHl6cGVhaywgU19JUlVHTywgX3Nob3csIE5VTEwsIF9hZGRyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDEuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzliZjIyYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAxLmgKQEAgLTAsMCArMSwxNTAgQEAKKyNpZm5kZWYgU1BJX0FESVMxNjIwMV9IXworI2RlZmluZSBTUElfQURJUzE2MjAxX0hfCisKKyNkZWZpbmUgQURJUzE2MjAxX1NUQVJUVVBfREVMQVkJMjIwIC8qIG1zICovCisKKyNkZWZpbmUgQURJUzE2MjAxX1JFQURfUkVHKGEpICAgIGEKKyNkZWZpbmUgQURJUzE2MjAxX1dSSVRFX1JFRyhhKSAoKGEpIHwgMHg4MCkKKworI2RlZmluZSBBRElTMTYyMDFfRkxBU0hfQ05UICAgICAgMHgwMCAvKiBGbGFzaCBtZW1vcnkgd3JpdGUgY291bnQgKi8KKyNkZWZpbmUgQURJUzE2MjAxX1NVUFBMWV9PVVQgICAgIDB4MDIgLyogT3V0cHV0LCBwb3dlciBzdXBwbHkgKi8KKyNkZWZpbmUgQURJUzE2MjAxX1hBQ0NMX09VVCAgICAgIDB4MDQgLyogT3V0cHV0LCB4LWF4aXMgYWNjZWxlcm9tZXRlciAqLworI2RlZmluZSBBRElTMTYyMDFfWUFDQ0xfT1VUICAgICAgMHgwNiAvKiBPdXRwdXQsIHktYXhpcyBhY2NlbGVyb21ldGVyICovCisjZGVmaW5lIEFESVMxNjIwMV9BVVhfQURDICAgICAgICAweDA4IC8qIE91dHB1dCwgYXV4aWxpYXJ5IEFEQyBpbnB1dCAqLworI2RlZmluZSBBRElTMTYyMDFfVEVNUF9PVVQgICAgICAgMHgwQSAvKiBPdXRwdXQsIHRlbXBlcmF0dXJlICovCisjZGVmaW5lIEFESVMxNjIwMV9YSU5DTF9PVVQgICAgICAweDBDIC8qIE91dHB1dCwgeC1heGlzIGluY2xpbmF0aW9uICovCisjZGVmaW5lIEFESVMxNjIwMV9ZSU5DTF9PVVQgICAgICAweDBFIC8qIE91dHB1dCwgeS1heGlzIGluY2xpbmF0aW9uICovCisjZGVmaW5lIEFESVMxNjIwMV9YQUNDTF9PRkZTICAgICAweDEwIC8qIENhbGlicmF0aW9uLCB4LWF4aXMgYWNjZWxlcmF0aW9uIG9mZnNldCAqLworI2RlZmluZSBBRElTMTYyMDFfWUFDQ0xfT0ZGUyAgICAgMHgxMiAvKiBDYWxpYnJhdGlvbiwgeS1heGlzIGFjY2VsZXJhdGlvbiBvZmZzZXQgKi8KKyNkZWZpbmUgQURJUzE2MjAxX1hBQ0NMX1NDQUxFICAgIDB4MTQgLyogeC1heGlzIGFjY2VsZXJhdGlvbiBzY2FsZSBmYWN0b3IgKi8KKyNkZWZpbmUgQURJUzE2MjAxX1lBQ0NMX1NDQUxFICAgIDB4MTYgLyogeS1heGlzIGFjY2VsZXJhdGlvbiBzY2FsZSBmYWN0b3IgKi8KKyNkZWZpbmUgQURJUzE2MjAxX1hJTkNMX09GRlMgICAgIDB4MTggLyogQ2FsaWJyYXRpb24sIHgtYXhpcyBpbmNsaW5hdGlvbiBvZmZzZXQgKi8KKyNkZWZpbmUgQURJUzE2MjAxX1lJTkNMX09GRlMgICAgIDB4MUEgLyogQ2FsaWJyYXRpb24sIHktYXhpcyBpbmNsaW5hdGlvbiBvZmZzZXQgKi8KKyNkZWZpbmUgQURJUzE2MjAxX1hJTkNMX1NDQUxFICAgIDB4MUMgLyogeC1heGlzIGluY2xpbmF0aW9uIHNjYWxlIGZhY3RvciAqLworI2RlZmluZSBBRElTMTYyMDFfWUlOQ0xfU0NBTEUgICAgMHgxRSAvKiB5LWF4aXMgaW5jbGluYXRpb24gc2NhbGUgZmFjdG9yICovCisjZGVmaW5lIEFESVMxNjIwMV9BTE1fTUFHMSAgICAgICAweDIwIC8qIEFsYXJtIDEgYW1wbGl0dWRlIHRocmVzaG9sZCAqLworI2RlZmluZSBBRElTMTYyMDFfQUxNX01BRzIgICAgICAgMHgyMiAvKiBBbGFybSAyIGFtcGxpdHVkZSB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgQURJUzE2MjAxX0FMTV9TTVBMMSAgICAgIDB4MjQgLyogQWxhcm0gMSwgc2FtcGxlIHBlcmlvZCAqLworI2RlZmluZSBBRElTMTYyMDFfQUxNX1NNUEwyICAgICAgMHgyNiAvKiBBbGFybSAyLCBzYW1wbGUgcGVyaW9kICovCisjZGVmaW5lIEFESVMxNjIwMV9BTE1fQ1RSTCAgICAgICAweDI4IC8qIEFsYXJtIGNvbnRyb2wgKi8KKyNkZWZpbmUgQURJUzE2MjAxX0FVWF9EQUMgICAgICAgIDB4MzAgLyogQXV4aWxpYXJ5IERBQyBkYXRhICovCisjZGVmaW5lIEFESVMxNjIwMV9HUElPX0NUUkwgICAgICAweDMyIC8qIEdlbmVyYWwtcHVycG9zZSBkaWdpdGFsIGlucHV0L291dHB1dCBjb250cm9sICovCisjZGVmaW5lIEFESVMxNjIwMV9NU0NfQ1RSTCAgICAgICAweDM0IC8qIE1pc2NlbGxhbmVvdXMgY29udHJvbCAqLworI2RlZmluZSBBRElTMTYyMDFfU01QTF9QUkQgICAgICAgMHgzNiAvKiBJbnRlcm5hbCBzYW1wbGUgcGVyaW9kIChyYXRlKSBjb250cm9sICovCisjZGVmaW5lIEFESVMxNjIwMV9BVkdfQ05UICAgICAgICAweDM4IC8qIE9wZXJhdGlvbiwgZmlsdGVyIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgQURJUzE2MjAxX1NMUF9DTlQgICAgICAgIDB4M0EgLyogT3BlcmF0aW9uLCBzbGVlcCBtb2RlIGNvbnRyb2wgKi8KKyNkZWZpbmUgQURJUzE2MjAxX0RJQUdfU1RBVCAgICAgIDB4M0MgLyogRGlhZ25vc3RpY3MsIHN5c3RlbSBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURJUzE2MjAxX0dMT0JfQ01EICAgICAgIDB4M0UgLyogT3BlcmF0aW9uLCBzeXN0ZW0gY29tbWFuZCByZWdpc3RlciAqLworCisjZGVmaW5lIEFESVMxNjIwMV9PVVRQVVRTICAgICAgICA3CisKKy8qIE1TQ19DVFJMICovCisjZGVmaW5lIEFESVMxNjIwMV9NU0NfQ1RSTF9TRUxGX1RFU1RfRU4JICAgICAgICAoMSA8PCA4KSAgLyogU2VsZi10ZXN0IGVuYWJsZSAqLworI2RlZmluZSBBRElTMTYyMDFfTVNDX0NUUkxfREFUQV9SRFlfRU4JICAgICAgICAoMSA8PCAyKSAgLyogRGF0YS1yZWFkeSBlbmFibGU6IDEgPSBlbmFibGVkLCAwID0gZGlzYWJsZWQgKi8KKyNkZWZpbmUgQURJUzE2MjAxX01TQ19DVFJMX0FDVElWRV9ISUdICSAgICAgICAgKDEgPDwgMSkgIC8qIERhdGEtcmVhZHkgcG9sYXJpdHk6IDEgPSBhY3RpdmUgaGlnaCwgMCA9IGFjdGl2ZSBsb3cgKi8KKyNkZWZpbmUgQURJUzE2MjAxX01TQ19DVFJMX0RBVEFfUkRZX0RJTzEJKDEgPDwgMCkgIC8qIERhdGEtcmVhZHkgbGluZSBzZWxlY3Rpb246IDEgPSBESU8xLCAwID0gRElPMCAqLworCisvKiBESUFHX1NUQVQgKi8KKyNkZWZpbmUgQURJUzE2MjAxX0RJQUdfU1RBVF9BTEFSTTIgICAgICAgICgxPDw5KSAvKiBBbGFybSAyIHN0YXR1czogMSA9IGFsYXJtIGFjdGl2ZSwgMCA9IGFsYXJtIGluYWN0aXZlICovCisjZGVmaW5lIEFESVMxNjIwMV9ESUFHX1NUQVRfQUxBUk0xICAgICAgICAoMTw8OCkgLyogQWxhcm0gMSBzdGF0dXM6IDEgPSBhbGFybSBhY3RpdmUsIDAgPSBhbGFybSBpbmFjdGl2ZSAqLworI2RlZmluZSBBRElTMTYyMDFfRElBR19TVEFUX1NQSV9GQUlMCSAgKDE8PDMpIC8qIFNQSSBjb21tdW5pY2F0aW9ucyBmYWlsdXJlICovCisjZGVmaW5lIEFESVMxNjIwMV9ESUFHX1NUQVRfRkxBU0hfVVBUCSAgKDE8PDIpIC8qIEZsYXNoIHVwZGF0ZSBmYWlsdXJlICovCisjZGVmaW5lIEFESVMxNjIwMV9ESUFHX1NUQVRfUE9XRVJfSElHSAkgICgxPDwxKSAvKiBQb3dlciBzdXBwbHkgYWJvdmUgMy42MjUgViAqLworI2RlZmluZSBBRElTMTYyMDFfRElBR19TVEFUX1BPV0VSX0xPVwkgICgxPDwwKSAvKiBQb3dlciBzdXBwbHkgYmVsb3cgMy4xNSBWICovCisKKy8qIEdMT0JfQ01EICovCisjZGVmaW5lIEFESVMxNjIwMV9HTE9CX0NNRF9TV19SRVNFVAkoMTw8NykKKyNkZWZpbmUgQURJUzE2MjAxX0dMT0JfQ01EX0ZBQ1RPUllfQ0FMCSgxPDwxKQorCisjZGVmaW5lIEFESVMxNjIwMV9NQVhfVFggMTQKKyNkZWZpbmUgQURJUzE2MjAxX01BWF9SWCAxNAorCisjZGVmaW5lIEFESVMxNjIwMV9FUlJPUl9BQ1RJVkUgICAgICAgICAgKDE8PDE0KQorCisvKioKKyAqIHN0cnVjdCBhZGlzMTYyMDFfc3RhdGUgLSBkZXZpY2UgaW5zdGFuY2Ugc3BlY2lmaWMgZGF0YQorICogQHVzOgkJCWFjdHVhbCBzcGlfZGV2aWNlCisgKiBAd29ya190cmlnZ2VyX3RvX3Jpbmc6IGJoIGZvciB0cmlnZ2VyZWQgZXZlbnQgaGFuZGxpbmcKKyAqIEBpbnRlcjoJCXVzZWQgdG8gY2hlY2sgaWYgbmV3IGludGVycnVwdCBoYXMgYmVlbiB0cmlnZ2VyZWQKKyAqIEBsYXN0X3RpbWVzdGFtcDoJcGFzc2luZyB0aW1lc3RhbXAgZnJvbSB0aCB0byBiaCBvZiBpbnRlcnJ1cHQgaGFuZGxlcgorICogQGluZGlvX2RldjoJCWluZHVzdHJpYWwgSS9PIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEB0cmlnOgkJZGF0YSByZWFkeSB0cmlnZ2VyIHJlZ2lzdGVyZWQgd2l0aCBpaW8KKyAqIEB0eDoJCQl0cmFuc21pdCBidWZmZXIKKyAqIEByeDoJCQlyZWNpZXZlIGJ1ZmZlcgorICogQGJ1Zl9sb2NrOgkJbXV0ZXggdG8gcHJvdGVjdCB0eCBhbmQgcngKKyAqKi8KK3N0cnVjdCBhZGlzMTYyMDFfc3RhdGUgeworCXN0cnVjdCBzcGlfZGV2aWNlCQkqdXM7CisJc3RydWN0IHdvcmtfc3RydWN0CQl3b3JrX3RyaWdnZXJfdG9fcmluZzsKKwlzNjQJCQkJbGFzdF90aW1lc3RhbXA7CisJc3RydWN0IGlpb19kZXYJCQkqaW5kaW9fZGV2OworCXN0cnVjdCBpaW9fdHJpZ2dlcgkJKnRyaWc7CisJdTgJCQkJKnR4OworCXU4CQkJCSpyeDsKKwlzdHJ1Y3QgbXV0ZXgJCQlidWZfbG9jazsKK307CisKK2ludCBhZGlzMTYyMDFfc2V0X2lycShzdHJ1Y3QgZGV2aWNlICpkZXYsIGJvb2wgZW5hYmxlKTsKKworI2lmZGVmIENPTkZJR19JSU9fUklOR19CVUZGRVIKK2VudW0gYWRpczE2MjAxX3NjYW4geworCUFESVMxNjIwMV9TQ0FOX1NVUFBMWSwKKwlBRElTMTYyMDFfU0NBTl9BQ0NfWCwKKwlBRElTMTYyMDFfU0NBTl9BQ0NfWSwKKwlBRElTMTYyMDFfU0NBTl9BVVhfQURDLAorCUFESVMxNjIwMV9TQ0FOX1RFTVAsCisJQURJUzE2MjAxX1NDQU5fSU5DTElfWCwKKwlBRElTMTYyMDFfU0NBTl9JTkNMSV9ZLAorfTsKKwordm9pZCBhZGlzMTYyMDFfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CitpbnQgYWRpczE2MjAxX3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKK3NzaXplX3QgYWRpczE2MjAxX3JlYWRfZGF0YV9mcm9tX3Jpbmcoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgIGNoYXIgKmJ1Zik7CisKK2ludCBhZGlzMTYyMDFfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7Cit2b2lkIGFkaXMxNjIwMV91bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOworCitpbnQgYWRpczE2MjAxX2luaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKTsKK3ZvaWQgYWRpczE2MjAxX3VuaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpOworI2Vsc2UgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgYWRpczE2MjAxX3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFkaXMxNjIwMV9wcm9iZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdAorYWRpczE2MjAxX3JlYWRfZGF0YV9mcm9tX3Jpbmcoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICBjaGFyICpidWYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRpczE2MjAxX2NvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGlzMTYyMDFfdW5jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworfQorCitzdGF0aWMgaW5saW5lIGludCBhZGlzMTYyMDFfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGlzMTYyMDFfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKK3sKK30KKworI2VuZGlmIC8qIENPTkZJR19JSU9fUklOR19CVUZGRVIgKi8KKyNlbmRpZiAvKiBTUElfQURJUzE2MjAxX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwMV9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwMV9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzliNzg1YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAxX2NvcmUuYwpAQCAtMCwwICsxLDY1OSBAQAorLyoKKyAqIEFESVMxNjIwMSBQcm9ncmFtbWFibGUgRGlnaXRhbCBWaWJyYXRpb24gU2Vuc29yIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisjaW5jbHVkZSAiYWNjZWwuaCIKKyNpbmNsdWRlICJpbmNsaW5vbWV0ZXIuaCIKKyNpbmNsdWRlICIuLi9neXJvL2d5cm8uaCIKKyNpbmNsdWRlICIuLi9hZGMvYWRjLmgiCisKKyNpbmNsdWRlICJhZGlzMTYyMDEuaCIKKworI2RlZmluZSBEUklWRVJfTkFNRQkJImFkaXMxNjIwMSIKKworc3RhdGljIGludCBhZGlzMTYyMDFfY2hlY2tfc3RhdHVzKHN0cnVjdCBkZXZpY2UgKmRldik7CisKKy8qKgorICogYWRpczE2MjAxX3NwaV93cml0ZV9yZWdfOCgpIC0gd3JpdGUgc2luZ2xlIGJ5dGUgdG8gYSByZWdpc3RlcgorICogQGRldjogZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBjaGlsZCBvZiBhY3R1YWwgZGV2aWNlIChpaW9fZGV2IG9yIGlpb190cmlnKQorICogQHJlZ19hZGRyZXNzOiB0aGUgYWRkcmVzcyBvZiB0aGUgcmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgorICogQHZhbDogdGhlIHZhbHVlIHRvIHdyaXRlCisgKiovCitzdGF0aWMgaW50IGFkaXMxNjIwMV9zcGlfd3JpdGVfcmVnXzgoc3RydWN0IGRldmljZSAqZGV2LAorCQl1OCByZWdfYWRkcmVzcywKKwkJdTggdmFsKQoreworCWludCByZXQ7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGlzMTYyMDFfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSBBRElTMTYyMDFfV1JJVEVfUkVHKHJlZ19hZGRyZXNzKTsKKwlzdC0+dHhbMV0gPSB2YWw7CisKKwlyZXQgPSBzcGlfd3JpdGUoc3QtPnVzLCBzdC0+dHgsIDIpOworCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogYWRpczE2MjAxX3NwaV93cml0ZV9yZWdfMTYoKSAtIHdyaXRlIDIgYnl0ZXMgdG8gYSBwYWlyIG9mIHJlZ2lzdGVycworICogQGRldjogZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBjaGlsZCBvZiBhY3R1YWwgZGV2aWNlIChpaW9fZGV2IG9yIGlpb190cmlnKQorICogQHJlZ19hZGRyZXNzOiB0aGUgYWRkcmVzcyBvZiB0aGUgbG93ZXIgb2YgdGhlIHR3byByZWdpc3RlcnMuIFNlY29uZCByZWdpc3RlcgorICogICAgICAgICAgICAgICBpcyBhc3N1bWVkIHRvIGhhdmUgYWRkcmVzcyBvbmUgZ3JlYXRlci4KKyAqIEB2YWw6IHZhbHVlIHRvIGJlIHdyaXR0ZW4KKyAqKi8KK3N0YXRpYyBpbnQgYWRpczE2MjAxX3NwaV93cml0ZV9yZWdfMTYoc3RydWN0IGRldmljZSAqZGV2LAorCQl1OCBsb3dlcl9yZWdfYWRkcmVzcywKKwkJdTE2IHZhbHVlKQoreworCWludCByZXQ7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkaXMxNjIwMV9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyc1tdID0geworCQl7CisJCQkudHhfYnVmID0gc3QtPnR4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDIsCisJCQkuY3NfY2hhbmdlID0gMSwKKwkJfSwgeworCQkJLnR4X2J1ZiA9IHN0LT50eCArIDIsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gMiwKKwkJCS5jc19jaGFuZ2UgPSAxLAorCQl9LAorCX07CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IEFESVMxNjIwMV9XUklURV9SRUcobG93ZXJfcmVnX2FkZHJlc3MpOworCXN0LT50eFsxXSA9IHZhbHVlICYgMHhGRjsKKwlzdC0+dHhbMl0gPSBBRElTMTYyMDFfV1JJVEVfUkVHKGxvd2VyX3JlZ19hZGRyZXNzICsgMSk7CisJc3QtPnR4WzNdID0gKHZhbHVlID4+IDgpICYgMHhGRjsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXJzWzBdLCAmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcnNbMV0sICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBhZGlzMTYyMDFfc3BpX3JlYWRfcmVnXzE2KCkgLSByZWFkIDIgYnl0ZXMgZnJvbSBhIDE2LWJpdCByZWdpc3RlcgorICogQGRldjogZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBjaGlsZCBvZiBhY3R1YWwgZGV2aWNlIChpaW9fZGV2IG9yIGlpb190cmlnKQorICogQHJlZ19hZGRyZXNzOiB0aGUgYWRkcmVzcyBvZiB0aGUgbG93ZXIgb2YgdGhlIHR3byByZWdpc3RlcnMuIFNlY29uZCByZWdpc3RlcgorICogICAgICAgICAgICAgICBpcyBhc3N1bWVkIHRvIGhhdmUgYWRkcmVzcyBvbmUgZ3JlYXRlci4KKyAqIEB2YWw6IHNvbWV3aGVyZSB0byBwYXNzIGJhY2sgdGhlIHZhbHVlIHJlYWQKKyAqKi8KK3N0YXRpYyBpbnQgYWRpczE2MjAxX3NwaV9yZWFkX3JlZ18xNihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXU4IGxvd2VyX3JlZ19hZGRyZXNzLAorCQl1MTYgKnZhbCkKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRpczE2MjAxX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbXSA9IHsKKwkJeworCQkJLnR4X2J1ZiA9IHN0LT50eCwKKwkJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJCS5sZW4gPSAyLAorCQkJLmNzX2NoYW5nZSA9IDEsCisJCQkuZGVsYXlfdXNlY3MgPSAyMCwKKwkJfSwgeworCQkJLnJ4X2J1ZiA9IHN0LT5yeCwKKwkJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJCS5sZW4gPSAyLAorCQkJLmNzX2NoYW5nZSA9IDEsCisJCQkuZGVsYXlfdXNlY3MgPSAyMCwKKwkJfSwKKwl9OworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSBBRElTMTYyMDFfUkVBRF9SRUcobG93ZXJfcmVnX2FkZHJlc3MpOworCXN0LT50eFsxXSA9IDA7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyc1swXSwgJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXJzWzFdLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+dXMsICZtc2cpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3QtPnVzLT5kZXYsICJwcm9ibGVtIHdoZW4gcmVhZGluZyAxNiBiaXQgcmVnaXN0ZXIgMHglMDJYIiwKKwkJCQlsb3dlcl9yZWdfYWRkcmVzcyk7CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwkqdmFsID0gKHN0LT5yeFswXSA8PCA4KSB8IHN0LT5yeFsxXTsKKworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZGlzMTYyMDFfcmVhZF8xMmJpdF91bnNpZ25lZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJaW50IHJldDsKKwl1MTYgdmFsID0gMDsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisKKwlyZXQgPSBhZGlzMTYyMDFfc3BpX3JlYWRfcmVnXzE2KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKHZhbCAmIEFESVMxNjIwMV9FUlJPUl9BQ1RJVkUpIHsKKwkJcmV0ID0gYWRpczE2MjAxX2NoZWNrX3N0YXR1cyhkZXYpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgdmFsICYgMHgwRkZGKTsKK30KKworc3RhdGljIHNzaXplX3QgYWRpczE2MjAxX3JlYWRfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXNzaXplX3QgcmV0OworCXUxNiB2YWw7CisKKwkvKiBUYWtlIHRoZSBpaW9fZGV2IHN0YXR1cyBsb2NrICovCisJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisKKwlyZXQgPSBhZGlzMTYyMDFfc3BpX3JlYWRfcmVnXzE2KGRldiwgQURJUzE2MjAxX1RFTVBfT1VULCAodTE2ICopJnZhbCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwlpZiAodmFsICYgQURJUzE2MjAxX0VSUk9SX0FDVElWRSkgeworCQlyZXQgPSBhZGlzMTYyMDFfY2hlY2tfc3RhdHVzKGRldik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3JldDsKKwl9CisKKwl2YWwgJj0gMHhGRkY7CisJcmV0ID0gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsKTsKKworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWRpczE2MjAxX3JlYWRfOWJpdF9zaWduZWQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisJczE2IHZhbCA9IDA7CisJc3NpemVfdCByZXQ7CisKKwltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCXJldCA9IGFkaXMxNjIwMV9zcGlfcmVhZF9yZWdfMTYoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsICh1MTYgKikmdmFsKTsKKwlpZiAoIXJldCkgeworCQlpZiAodmFsICYgQURJUzE2MjAxX0VSUk9SX0FDVElWRSkgeworCQkJcmV0ID0gYWRpczE2MjAxX2NoZWNrX3N0YXR1cyhkZXYpOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGVycm9yX3JldDsKKwkJfQorCQl2YWwgPSAoKHMxNikodmFsIDw8IDcpID4+IDcpOworCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2YWwpOworCX0KKworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZGlzMTYyMDFfcmVhZF8xMmJpdF9zaWduZWQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisJczE2IHZhbCA9IDA7CisJc3NpemVfdCByZXQ7CisKKwltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCXJldCA9IGFkaXMxNjIwMV9zcGlfcmVhZF9yZWdfMTYoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsICh1MTYgKikmdmFsKTsKKwlpZiAoIXJldCkgeworCQlpZiAodmFsICYgQURJUzE2MjAxX0VSUk9SX0FDVElWRSkgeworCQkJcmV0ID0gYWRpczE2MjAxX2NoZWNrX3N0YXR1cyhkZXYpOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGVycm9yX3JldDsKKwkJfQorCisJCXZhbCA9ICgoczE2KSh2YWwgPDwgNCkgPj4gNCk7CisJCXJldCA9IHNwcmludGYoYnVmLCAiJWRcbiIsIHZhbCk7CisJfQorCitlcnJvcl9yZXQ6CisJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkaXMxNjIwMV9yZWFkXzE0Yml0X3NpZ25lZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKwlzMTYgdmFsID0gMDsKKwlzc2l6ZV90IHJldDsKKworCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0ID0gYWRpczE2MjAxX3NwaV9yZWFkX3JlZ18xNihkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgKHUxNiAqKSZ2YWwpOworCWlmICghcmV0KSB7CisJCWlmICh2YWwgJiBBRElTMTYyMDFfRVJST1JfQUNUSVZFKSB7CisJCQlyZXQgPSBhZGlzMTYyMDFfY2hlY2tfc3RhdHVzKGRldik7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZXJyb3JfcmV0OworCQl9CisKKwkJdmFsID0gKChzMTYpKHZhbCA8PCAyKSA+PiAyKTsKKwkJcmV0ID0gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsKTsKKwl9CisKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWRpczE2MjAxX3dyaXRlXzE2Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisJaW50IHJldDsKKwlsb25nIHZhbDsKKworCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnZhbCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisJcmV0ID0gYWRpczE2MjAxX3NwaV93cml0ZV9yZWdfMTYoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsIHZhbCk7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgaW50IGFkaXMxNjIwMV9yZXNldChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHJldDsKKwlyZXQgPSBhZGlzMTYyMDFfc3BpX3dyaXRlX3JlZ184KGRldiwKKwkJCUFESVMxNjIwMV9HTE9CX0NNRCwKKwkJCUFESVMxNjIwMV9HTE9CX0NNRF9TV19SRVNFVCk7CisJaWYgKHJldCkKKwkJZGV2X2VycihkZXYsICJwcm9ibGVtIHJlc2V0dGluZyBkZXZpY2UiKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkaXMxNjIwMV93cml0ZV9yZXNldChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJaWYgKGxlbiA8IDEpCisJCXJldHVybiAtRUlOVkFMOworCXN3aXRjaCAoYnVmWzBdKSB7CisJY2FzZSAnMSc6CisJY2FzZSAneSc6CisJY2FzZSAnWSc6CisJCXJldHVybiBhZGlzMTYyMDFfcmVzZXQoZGV2KTsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK2ludCBhZGlzMTYyMDFfc2V0X2lycShzdHJ1Y3QgZGV2aWNlICpkZXYsIGJvb2wgZW5hYmxlKQoreworCWludCByZXQgPSAwOworCXUxNiBtc2M7CisKKwlyZXQgPSBhZGlzMTYyMDFfc3BpX3JlYWRfcmVnXzE2KGRldiwgQURJUzE2MjAxX01TQ19DVFJMLCAmbXNjKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCW1zYyB8PSBBRElTMTYyMDFfTVNDX0NUUkxfQUNUSVZFX0hJR0g7CisJbXNjICY9IH5BRElTMTYyMDFfTVNDX0NUUkxfREFUQV9SRFlfRElPMTsKKwlpZiAoZW5hYmxlKQorCQltc2MgfD0gQURJUzE2MjAxX01TQ19DVFJMX0RBVEFfUkRZX0VOOworCWVsc2UKKwkJbXNjICY9IH5BRElTMTYyMDFfTVNDX0NUUkxfREFUQV9SRFlfRU47CisKKwlyZXQgPSBhZGlzMTYyMDFfc3BpX3dyaXRlX3JlZ18xNihkZXYsIEFESVMxNjIwMV9NU0NfQ1RSTCwgbXNjKTsKKworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRpczE2MjAxX2NoZWNrX3N0YXR1cyhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJdTE2IHN0YXR1czsKKwlpbnQgcmV0OworCisJcmV0ID0gYWRpczE2MjAxX3NwaV9yZWFkX3JlZ18xNihkZXYsIEFESVMxNjIwMV9ESUFHX1NUQVQsICZzdGF0dXMpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiUmVhZGluZyBzdGF0dXMgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCXJldCA9IHN0YXR1cyAmIDB4RjsKKwlpZiAocmV0KQorCQlyZXQgPSAtRUZBVUxUOworCisJaWYgKHN0YXR1cyAmIEFESVMxNjIwMV9ESUFHX1NUQVRfU1BJX0ZBSUwpCisJCWRldl9lcnIoZGV2LCAiU1BJIGZhaWx1cmVcbiIpOworCWlmIChzdGF0dXMgJiBBRElTMTYyMDFfRElBR19TVEFUX0ZMQVNIX1VQVCkKKwkJZGV2X2VycihkZXYsICJGbGFzaCB1cGRhdGUgZmFpbGVkXG4iKTsKKwlpZiAoc3RhdHVzICYgQURJUzE2MjAxX0RJQUdfU1RBVF9QT1dFUl9ISUdIKQorCQlkZXZfZXJyKGRldiwgIlBvd2VyIHN1cHBseSBhYm92ZSAzLjYyNVZcbiIpOworCWlmIChzdGF0dXMgJiBBRElTMTYyMDFfRElBR19TVEFUX1BPV0VSX0xPVykKKwkJZGV2X2VycihkZXYsICJQb3dlciBzdXBwbHkgYmVsb3cgMy4xNVZcbiIpOworCitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGlzMTYyMDFfc2VsZl90ZXN0KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0OworCXJldCA9IGFkaXMxNjIwMV9zcGlfd3JpdGVfcmVnXzE2KGRldiwKKwkJCUFESVMxNjIwMV9NU0NfQ1RSTCwKKwkJCUFESVMxNjIwMV9NU0NfQ1RSTF9TRUxGX1RFU1RfRU4pOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJwcm9ibGVtIHN0YXJ0aW5nIHNlbGYgdGVzdCIpOworCQlnb3RvIGVycl9yZXQ7CisJfQorCisJcmV0ID0gYWRpczE2MjAxX2NoZWNrX3N0YXR1cyhkZXYpOworCitlcnJfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRpczE2MjAxX2luaXRpYWxfc2V0dXAoc3RydWN0IGFkaXMxNjIwMV9zdGF0ZSAqc3QpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmc3QtPmluZGlvX2Rldi0+ZGV2OworCisJLyogRGlzYWJsZSBJUlEgKi8KKwlyZXQgPSBhZGlzMTYyMDFfc2V0X2lycShkZXYsIGZhbHNlKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZGlzYWJsZSBpcnEgZmFpbGVkIik7CisJCWdvdG8gZXJyX3JldDsKKwl9CisKKwkvKiBEbyBzZWxmIHRlc3QgKi8KKwlyZXQgPSBhZGlzMTYyMDFfc2VsZl90ZXN0KGRldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgInNlbGYgdGVzdCBmYWlsdXJlIik7CisJCWdvdG8gZXJyX3JldDsKKwl9CisKKwkvKiBSZWFkIHN0YXR1cyByZWdpc3RlciB0byBjaGVjayB0aGUgcmVzdWx0ICovCisJcmV0ID0gYWRpczE2MjAxX2NoZWNrX3N0YXR1cyhkZXYpOworCWlmIChyZXQpIHsKKwkJYWRpczE2MjAxX3Jlc2V0KGRldik7CisJCWRldl9lcnIoZGV2LCAiZGV2aWNlIG5vdCBwbGF5aW5nIGJhbGwgLT4gcmVzZXQiKTsKKwkJbXNsZWVwKEFESVMxNjIwMV9TVEFSVFVQX0RFTEFZKTsKKwkJcmV0ID0gYWRpczE2MjAxX2NoZWNrX3N0YXR1cyhkZXYpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRldiwgImdpdmluZyB1cCIpOworCQkJZ290byBlcnJfcmV0OworCQl9CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyBEUklWRVJfTkFNRSAiOiBhdCBDUyVkIChpcnEgJWQpXG4iLAorCQkJc3QtPnVzLT5jaGlwX3NlbGVjdCwgc3QtPnVzLT5pcnEpOworCitlcnJfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfSU5fTkFNRURfUkFXKDAsIHN1cHBseSwgYWRpczE2MjAxX3JlYWRfMTJiaXRfdW5zaWduZWQsCisJCUFESVMxNjIwMV9TVVBQTFlfT1VUKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihpbjBfc3VwcGx5X3NjYWxlLCAiMC4wMDEyMiIpOworc3RhdGljIElJT19ERVZfQVRUUl9JTl9SQVcoMSwgYWRpczE2MjAxX3JlYWRfMTJiaXRfdW5zaWduZWQsCisJCUFESVMxNjIwMV9BVVhfQURDKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihpbjFfc2NhbGUsICIwLjAwMDYxIik7CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfQUNDRUxfWChhZGlzMTYyMDFfcmVhZF8xNGJpdF9zaWduZWQsCisJCUFESVMxNjIwMV9YQUNDTF9PVVQpOworc3RhdGljIElJT19ERVZfQVRUUl9BQ0NFTF9ZKGFkaXMxNjIwMV9yZWFkXzE0Yml0X3NpZ25lZCwKKwkJQURJUzE2MjAxX1lBQ0NMX09VVCk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FDQ0VMX1hfT0ZGU0VUKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGlzMTYyMDFfcmVhZF8xMmJpdF9zaWduZWQsCisJCWFkaXMxNjIwMV93cml0ZV8xNmJpdCwKKwkJQURJUzE2MjAxX1hBQ0NMX09GRlMpOworc3RhdGljIElJT19ERVZfQVRUUl9BQ0NFTF9ZX09GRlNFVChTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRpczE2MjAxX3JlYWRfMTJiaXRfc2lnbmVkLAorCQlhZGlzMTYyMDFfd3JpdGVfMTZiaXQsCisJCUFESVMxNjIwMV9ZQUNDTF9PRkZTKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihhY2NlbF9zY2FsZSwgIjAuNDYyNSIpOworCitzdGF0aWMgSUlPX0RFVl9BVFRSX0lOQ0xJX1goYWRpczE2MjAxX3JlYWRfMTRiaXRfc2lnbmVkLAorCQlBRElTMTYyMDFfWElOQ0xfT1VUKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfSU5DTElfWShhZGlzMTYyMDFfcmVhZF8xNGJpdF9zaWduZWQsCisJCUFESVMxNjIwMV9ZSU5DTF9PVVQpOworc3RhdGljIElJT19ERVZfQVRUUl9JTkNMSV9YX09GRlNFVChTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRpczE2MjAxX3JlYWRfOWJpdF9zaWduZWQsCisJCWFkaXMxNjIwMV93cml0ZV8xNmJpdCwKKwkJQURJUzE2MjAxX1hBQ0NMX09GRlMpOworc3RhdGljIElJT19ERVZfQVRUUl9JTkNMSV9ZX09GRlNFVChTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRpczE2MjAxX3JlYWRfOWJpdF9zaWduZWQsCisJCWFkaXMxNjIwMV93cml0ZV8xNmJpdCwKKwkJQURJUzE2MjAxX1lBQ0NMX09GRlMpOworc3RhdGljIElJT19DT05TVF9BVFRSKGluY2xpX3NjYWxlLCAiMC4xIik7CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfVEVNUF9SQVcoYWRpczE2MjAxX3JlYWRfdGVtcCk7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIodGVtcF9vZmZzZXQsICIyNSIpOworc3RhdGljIElJT19DT05TVF9BVFRSKHRlbXBfc2NhbGUsICItMC40NyIpOworCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKHJlc2V0LCBTX0lXVVNSLCBOVUxMLCBhZGlzMTYyMDFfd3JpdGVfcmVzZXQsIDApOworCitzdGF0aWMgSUlPX0NPTlNUX0FUVFIobmFtZSwgImFkaXMxNjIwMSIpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRpczE2MjAxX2V2ZW50X2F0dHJpYnV0ZXNbXSA9IHsKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZGlzMTYyMDFfZXZlbnRfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkaXMxNjIwMV9ldmVudF9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkaXMxNjIwMV9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19kZXZfYXR0cl9pbjBfc3VwcGx5X3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbjBfc3VwcGx5X3NjYWxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl90ZW1wX3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl90ZW1wX29mZnNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl90ZW1wX3NjYWxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9yZXNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9uYW1lLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbjFfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2luMV9zY2FsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYWNjZWxfeF9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FjY2VsX3lfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hY2NlbF94X29mZnNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYWNjZWxfeV9vZmZzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfYWNjZWxfc2NhbGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luY2xpX3hfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbmNsaV95X3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW5jbGlfeF9vZmZzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luY2xpX3lfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2luY2xpX3NjYWxlLmRldl9hdHRyLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWRpczE2MjAxX2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZGlzMTYyMDFfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkaXMxNjIwMV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWludCByZXQsIHJlZ2RvbmUgPSAwOworCXN0cnVjdCBhZGlzMTYyMDFfc3RhdGUgKnN0ID0ga3phbGxvYyhzaXplb2YgKnN0LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0KSB7CisJCXJldCA9ICAtRU5PTUVNOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJLyogdGhpcyBpcyBvbmx5IHVzZWQgZm9yIHJlbW92YWwgcHVycG9zZXMgKi8KKwlzcGlfc2V0X2RydmRhdGEoc3BpLCBzdCk7CisKKwkvKiBBbGxvY2F0ZSB0aGUgY29tbXMgYnVmZmVycyAqLworCXN0LT5yeCA9IGt6YWxsb2Moc2l6ZW9mKCpzdC0+cngpKkFESVMxNjIwMV9NQVhfUlgsIEdGUF9LRVJORUwpOworCWlmIChzdC0+cnggPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfc3Q7CisJfQorCXN0LT50eCA9IGt6YWxsb2Moc2l6ZW9mKCpzdC0+dHgpKkFESVMxNjIwMV9NQVhfVFgsIEdGUF9LRVJORUwpOworCWlmIChzdC0+dHggPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfcng7CisJfQorCXN0LT51cyA9IHNwaTsKKwltdXRleF9pbml0KCZzdC0+YnVmX2xvY2spOworCS8qIHNldHVwIHRoZSBpbmR1c3RyaWFsaW8gZHJpdmVyIGFsbG9jYXRlZCBlbGVtZW50cyAqLworCXN0LT5pbmRpb19kZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKHN0LT5pbmRpb19kZXYgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfdHg7CisJfQorCisJc3QtPmluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZzcGktPmRldjsKKwlzdC0+aW5kaW9fZGV2LT5udW1faW50ZXJydXB0X2xpbmVzID0gMTsKKwlzdC0+aW5kaW9fZGV2LT5ldmVudF9hdHRycyA9ICZhZGlzMTYyMDFfZXZlbnRfYXR0cmlidXRlX2dyb3VwOworCXN0LT5pbmRpb19kZXYtPmF0dHJzID0gJmFkaXMxNjIwMV9hdHRyaWJ1dGVfZ3JvdXA7CisJc3QtPmluZGlvX2Rldi0+ZGV2X2RhdGEgPSAodm9pZCAqKShzdCk7CisJc3QtPmluZGlvX2Rldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCXN0LT5pbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwlyZXQgPSBhZGlzMTYyMDFfY29uZmlndXJlX3Jpbmcoc3QtPmluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldjsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoc3QtPmluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOworCXJlZ2RvbmUgPSAxOworCisJcmV0ID0gYWRpczE2MjAxX2luaXRpYWxpemVfcmluZyhzdC0+aW5kaW9fZGV2LT5yaW5nKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIHJpbmdcbiIpOworCQlnb3RvIGVycm9yX3VucmVnX3JpbmdfZnVuY3M7CisJfQorCisJaWYgKHNwaS0+aXJxKSB7CisJCXJldCA9IGlpb19yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShzcGktPmlycSwKKwkJCQlzdC0+aW5kaW9fZGV2LAorCQkJCTAsCisJCQkJSVJRRl9UUklHR0VSX1JJU0lORywKKwkJCQkiYWRpczE2MjAxIik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3VuaW5pdGlhbGl6ZV9yaW5nOworCisJCXJldCA9IGFkaXMxNjIwMV9wcm9iZV90cmlnZ2VyKHN0LT5pbmRpb19kZXYpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl91bnJlZ2lzdGVyX2xpbmU7CisJfQorCisJLyogR2V0IHRoZSBkZXZpY2UgaW50byBhIHNhbmUgaW5pdGlhbCBzdGF0ZSAqLworCXJldCA9IGFkaXMxNjIwMV9pbml0aWFsX3NldHVwKHN0KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JlbW92ZV90cmlnZ2VyOworCXJldHVybiAwOworCitlcnJvcl9yZW1vdmVfdHJpZ2dlcjoKKwlhZGlzMTYyMDFfcmVtb3ZlX3RyaWdnZXIoc3QtPmluZGlvX2Rldik7CitlcnJvcl91bnJlZ2lzdGVyX2xpbmU6CisJaWYgKHNwaS0+aXJxKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShzdC0+aW5kaW9fZGV2LCAwKTsKK2Vycm9yX3VuaW5pdGlhbGl6ZV9yaW5nOgorCWFkaXMxNjIwMV91bmluaXRpYWxpemVfcmluZyhzdC0+aW5kaW9fZGV2LT5yaW5nKTsKK2Vycm9yX3VucmVnX3JpbmdfZnVuY3M6CisJYWRpczE2MjAxX3VuY29uZmlndXJlX3Jpbmcoc3QtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX2RldjoKKwlpZiAocmVnZG9uZSkKKwkJaWlvX2RldmljZV91bnJlZ2lzdGVyKHN0LT5pbmRpb19kZXYpOworCWVsc2UKKwkJaWlvX2ZyZWVfZGV2aWNlKHN0LT5pbmRpb19kZXYpOworZXJyb3JfZnJlZV90eDoKKwlrZnJlZShzdC0+dHgpOworZXJyb3JfZnJlZV9yeDoKKwlrZnJlZShzdC0+cngpOworZXJyb3JfZnJlZV9zdDoKKwlrZnJlZShzdCk7CitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGlzMTYyMDFfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGFkaXMxNjIwMV9zdGF0ZSAqc3QgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gc3QtPmluZGlvX2RldjsKKworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisKKwlhZGlzMTYyMDFfcmVtb3ZlX3RyaWdnZXIoaW5kaW9fZGV2KTsKKwlpZiAoc3BpLT5pcnEpCisJCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKGluZGlvX2RldiwgMCk7CisKKwlhZGlzMTYyMDFfdW5pbml0aWFsaXplX3JpbmcoaW5kaW9fZGV2LT5yaW5nKTsKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlhZGlzMTYyMDFfdW5jb25maWd1cmVfcmluZyhpbmRpb19kZXYpOworCWtmcmVlKHN0LT50eCk7CisJa2ZyZWUoc3QtPnJ4KTsKKwlrZnJlZShzdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFkaXMxNjIwMV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYWRpczE2MjAxIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhZGlzMTYyMDFfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFkaXMxNjIwMV9yZW1vdmUpLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWRpczE2MjAxX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmYWRpczE2MjAxX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChhZGlzMTYyMDFfaW5pdCk7CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBhZGlzMTYyMDFfZXhpdCh2b2lkKQoreworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYWRpczE2MjAxX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhZGlzMTYyMDFfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkJhcnJ5IFNvbmcgPDIxY25iYW9AZ21haWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBBRElTMTYyMDEgUHJvZ3JhbW1hYmxlIERpZ2l0YWwgVmlicmF0aW9uIFNlbnNvciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAxX3JpbmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAxX3JpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjg3MGEyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDFfcmluZy5jCkBAIC0wLDAgKzEsMjE4IEBACisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisjaW5jbHVkZSAiLi4vcmluZ19zdy5oIgorI2luY2x1ZGUgImFjY2VsLmgiCisjaW5jbHVkZSAiLi4vdHJpZ2dlci5oIgorI2luY2x1ZGUgImFkaXMxNjIwMS5oIgorCitzdGF0aWMgSUlPX1NDQU5fRUxfQyhpbl9zdXBwbHksIEFESVMxNjIwMV9TQ0FOX1NVUFBMWSwgQURJUzE2MjAxX1NVUFBMWV9PVVQsIE5VTEwpOworc3RhdGljIElJT19DT05TVF9BVFRSX1NDQU5fRUxfVFlQRShpbl9zdXBwbHksIHUsIDEyLCAxNik7CitzdGF0aWMgSUlPX1NDQU5fRUxfQyhhY2NlbF94LCBBRElTMTYyMDFfU0NBTl9BQ0NfWCwgQURJUzE2MjAxX1hBQ0NMX09VVCwgTlVMTCk7CitzdGF0aWMgSUlPX1NDQU5fRUxfQyhhY2NlbF95LCBBRElTMTYyMDFfU0NBTl9BQ0NfWSwgQURJUzE2MjAxX1lBQ0NMX09VVCwgTlVMTCk7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFJfU0NBTl9FTF9UWVBFKGFjY2VsLCBzLCAxNCwgMTYpOworc3RhdGljIElJT19TQ0FOX0VMX0MoaW4wLCBBRElTMTYyMDFfU0NBTl9BVVhfQURDLCBBRElTMTYyMDFfQVVYX0FEQywgTlVMTCk7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFJfU0NBTl9FTF9UWVBFKGluMCwgdSwgMTIsIDE2KTsKK3N0YXRpYyBJSU9fU0NBTl9FTF9DKHRlbXAsIEFESVMxNjIwMV9TQ0FOX1RFTVAsIEFESVMxNjIwMV9URU1QX09VVCwgTlVMTCk7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFJfU0NBTl9FTF9UWVBFKHRlbXAsIHUsIDEyLCAxNik7CitzdGF0aWMgSUlPX1NDQU5fRUxfQyhpbmNsaV94LCBBRElTMTYyMDFfU0NBTl9JTkNMSV9YLAorCQkgICAgIEFESVMxNjIwMV9YSU5DTF9PVVQsIE5VTEwpOworc3RhdGljIElJT19TQ0FOX0VMX0MoaW5jbGlfeSwgQURJUzE2MjAxX1NDQU5fSU5DTElfWSwKKwkJICAgICBBRElTMTYyMDFfWUlOQ0xfT1VULCBOVUxMKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUl9TQ0FOX0VMX1RZUEUoaW5jbGksIHMsIDE0LCAxNik7CitzdGF0aWMgSUlPX1NDQU5fRUxfVElNRVNUQU1QKDcpOworc3RhdGljIElJT19DT05TVF9BVFRSX1NDQU5fRUxfVFlQRSh0aW1lc3RhbXAsIHMsIDY0LCA2NCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZGlzMTYyMDFfc2Nhbl9lbF9hdHRyc1tdID0geworCSZpaW9fc2Nhbl9lbF9pbl9zdXBwbHkuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfaW5fc3VwcGx5X2luZGV4LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2luX3N1cHBseV90eXBlLmRldl9hdHRyLmF0dHIsCisJJmlpb19zY2FuX2VsX2FjY2VsX3guZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfYWNjZWxfeF9pbmRleC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fc2Nhbl9lbF9hY2NlbF95LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2FjY2VsX3lfaW5kZXguZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfYWNjZWxfdHlwZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fc2Nhbl9lbF9pbjAuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfaW4wX2luZGV4LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2luMF90eXBlLmRldl9hdHRyLmF0dHIsCisJJmlpb19zY2FuX2VsX3RlbXAuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfdGVtcF9pbmRleC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl90ZW1wX3R5cGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX3NjYW5fZWxfaW5jbGlfeC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbmNsaV94X2luZGV4LmRldl9hdHRyLmF0dHIsCisJJmlpb19zY2FuX2VsX2luY2xpX3kuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfaW5jbGlfeV9pbmRleC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbmNsaV90eXBlLmRldl9hdHRyLmF0dHIsCisJJmlpb19zY2FuX2VsX3RpbWVzdGFtcC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl90aW1lc3RhbXBfaW5kZXguZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfdGltZXN0YW1wX3R5cGUuZGV2X2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWRpczE2MjAxX3NjYW5fZWxfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWRpczE2MjAxX3NjYW5fZWxfYXR0cnMsCisJLm5hbWUgPSAic2Nhbl9lbGVtZW50cyIsCit9OworCisvKioKKyAqIGFkaXMxNjIwMV9wb2xsX2Z1bmNfdGgoKSB0b3AgaGFsZiBpbnRlcnJ1cHQgaGFuZGxlciBjYWxsZWQgYnkgdHJpZ2dlcgorICogQHByaXZhdGVfZGF0YToJaWlvX2RldgorICoqLworc3RhdGljIHZvaWQgYWRpczE2MjAxX3BvbGxfZnVuY190aChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LCBzNjQgdGltZSkKK3sKKwlzdHJ1Y3QgYWRpczE2MjAxX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlzdC0+bGFzdF90aW1lc3RhbXAgPSB0aW1lOworCXNjaGVkdWxlX3dvcmsoJnN0LT53b3JrX3RyaWdnZXJfdG9fcmluZyk7Cit9CisKKy8qKgorICogYWRpczE2MjAxX3JlYWRfcmluZ19kYXRhKCkgcmVhZCBkYXRhIHJlZ2lzdGVycyB3aGljaCB3aWxsIGJlIHBsYWNlZCBpbnRvIHJpbmcKKyAqIEBkZXY6IGRldmljZSBhc3NvY2lhdGVkIHdpdGggY2hpbGQgb2YgYWN0dWFsIGRldmljZSAoaWlvX2RldiBvciBpaW9fdHJpZykKKyAqIEByeDogc29tZXdoZXJlIHRvIHBhc3MgYmFjayB0aGUgdmFsdWUgcmVhZAorICoqLworc3RhdGljIGludCBhZGlzMTYyMDFfcmVhZF9yaW5nX2RhdGEoc3RydWN0IGRldmljZSAqZGV2LCB1OCAqcngpCit7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkaXMxNjIwMV9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyc1tBRElTMTYyMDFfT1VUUFVUUyArIDFdOworCWludCByZXQ7CisJaW50IGk7CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKworCW1lbXNldCh4ZmVycywgMCwgc2l6ZW9mKHhmZXJzKSk7CisJZm9yIChpID0gMDsgaSA8PSBBRElTMTYyMDFfT1VUUFVUUzsgaSsrKSB7CisJCXhmZXJzW2ldLmJpdHNfcGVyX3dvcmQgPSA4OworCQl4ZmVyc1tpXS5jc19jaGFuZ2UgPSAxOworCQl4ZmVyc1tpXS5sZW4gPSAyOworCQl4ZmVyc1tpXS5kZWxheV91c2VjcyA9IDIwOworCQl4ZmVyc1tpXS50eF9idWYgPSBzdC0+dHggKyAyICogaTsKKwkJc3QtPnR4WzIgKiBpXSA9IEFESVMxNjIwMV9SRUFEX1JFRyhBRElTMTYyMDFfU1VQUExZX09VVCArIDIgKiBpKTsKKwkJc3QtPnR4WzIgKiBpICsgMV0gPSAwOworCQlpZiAoaSA+PSAxKQorCQkJeGZlcnNbaV0ucnhfYnVmID0gcnggKyAyICogKGkgLSAxKTsKKwkJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXJzW2ldLCAmbXNnKTsKKwl9CisKKwlyZXQgPSBzcGlfc3luYyhzdC0+dXMsICZtc2cpOworCWlmIChyZXQpCisJCWRldl9lcnIoJnN0LT51cy0+ZGV2LCAicHJvYmxlbSB3aGVuIGJ1cnN0IHJlYWRpbmciKTsKKworCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIFdoaWxzdCB0aGlzIG1ha2VzIGEgbG90IG9mIGNhbGxzIHRvIGlpb19zd19yaW5nIGZ1bmN0aW9ucyAtIGl0IGlzIHRvIGRldmljZQorICogc3BlY2lmaWMgdG8gYmUgcm9sbGVkIGludG8gdGhlIGNvcmUuCisgKi8KK3N0YXRpYyB2b2lkIGFkaXMxNjIwMV90cmlnZ2VyX2JoX3RvX3Jpbmcoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrX3MpCit7CisJc3RydWN0IGFkaXMxNjIwMV9zdGF0ZSAqc3QKKwkJPSBjb250YWluZXJfb2Yod29ya19zLCBzdHJ1Y3QgYWRpczE2MjAxX3N0YXRlLAorCQkJICAgICAgIHdvcmtfdHJpZ2dlcl90b19yaW5nKTsKKwlzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nID0gc3QtPmluZGlvX2Rldi0+cmluZzsKKworCWludCBpID0gMDsKKwlzMTYgKmRhdGE7CisJc2l6ZV90IGRhdGFzaXplID0gcmluZy0+YWNjZXNzLmdldF9ieXRlc19wZXJfZGF0dW0ocmluZyk7CisKKwlkYXRhID0ga21hbGxvYyhkYXRhc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRhdGEgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZzdC0+dXMtPmRldiwgIm1lbW9yeSBhbGxvYyBmYWlsZWQgaW4gcmluZyBiaCIpOworCQlyZXR1cm47CisJfQorCisJaWYgKHJpbmctPnNjYW5fY291bnQpCisJCWlmIChhZGlzMTYyMDFfcmVhZF9yaW5nX2RhdGEoJnN0LT5pbmRpb19kZXYtPmRldiwgc3QtPnJ4KSA+PSAwKQorCQkJZm9yICg7IGkgPCByaW5nLT5zY2FuX2NvdW50OyBpKyspCisJCQkJZGF0YVtpXSA9IGJlMTZfdG9fY3B1cCgKKwkJCQkJKF9fYmUxNiAqKSYoc3QtPnJ4W2kqMl0pKTsKKworCS8qIEd1YXJhbnRlZWQgdG8gYmUgYWxpZ25lZCB3aXRoIDggYnl0ZSBib3VuZGFyeSAqLworCWlmIChyaW5nLT5zY2FuX3RpbWVzdGFtcCkKKwkJKigoczY0ICopKGRhdGEgKyAoKGkgKyAzKS80KSo0KSkgPSBzdC0+bGFzdF90aW1lc3RhbXA7CisKKwlyaW5nLT5hY2Nlc3Muc3RvcmVfdG8ocmluZywKKwkJCSAgICAgICh1OCAqKWRhdGEsCisJCQkgICAgICBzdC0+bGFzdF90aW1lc3RhbXApOworCisJaWlvX3RyaWdnZXJfbm90aWZ5X2RvbmUoc3QtPmluZGlvX2Rldi0+dHJpZyk7CisJa2ZyZWUoZGF0YSk7CisKKwlyZXR1cm47Cit9CisKK3ZvaWQgYWRpczE2MjAxX3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlrZnJlZShpbmRpb19kZXYtPnBvbGxmdW5jKTsKKwlpaW9fc3dfcmJfZnJlZShpbmRpb19kZXYtPnJpbmcpOworfQorCitpbnQgYWRpczE2MjAxX2NvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGFkaXMxNjIwMV9zdGF0ZSAqc3QgPSBpbmRpb19kZXYtPmRldl9kYXRhOworCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmc7CisJSU5JVF9XT1JLKCZzdC0+d29ya190cmlnZ2VyX3RvX3JpbmcsIGFkaXMxNjIwMV90cmlnZ2VyX2JoX3RvX3JpbmcpOworCisJcmluZyA9IGlpb19zd19yYl9hbGxvY2F0ZShpbmRpb19kZXYpOworCWlmICghcmluZykgeworCQlyZXQgPSAtRU5PTUVNOworCQlyZXR1cm4gcmV0OworCX0KKwlpbmRpb19kZXYtPnJpbmcgPSByaW5nOworCS8qIEVmZmVjdGl2ZWx5IHNlbGVjdCB0aGUgcmluZyBidWZmZXIgaW1wbGVtZW50YXRpb24gKi8KKwlpaW9fcmluZ19zd19yZWdpc3Rlcl9mdW5jcygmcmluZy0+YWNjZXNzKTsKKwlyaW5nLT5icGUgPSAyOworCXJpbmctPnNjYW5fZWxfYXR0cnMgPSAmYWRpczE2MjAxX3NjYW5fZWxfZ3JvdXA7CisJcmluZy0+c2Nhbl90aW1lc3RhbXAgPSB0cnVlOworCXJpbmctPnByZWVuYWJsZSA9ICZpaW9fc3dfcmluZ19wcmVlbmFibGU7CisJcmluZy0+cG9zdGVuYWJsZSA9ICZpaW9fdHJpZ2dlcmVkX3JpbmdfcG9zdGVuYWJsZTsKKwlyaW5nLT5wcmVkaXNhYmxlID0gJmlpb190cmlnZ2VyZWRfcmluZ19wcmVkaXNhYmxlOworCXJpbmctPm93bmVyID0gVEhJU19NT0RVTEU7CisKKwkvKiBTZXQgZGVmYXVsdCBzY2FuIG1vZGUgKi8KKwlpaW9fc2Nhbl9tYXNrX3NldChyaW5nLCBpaW9fc2Nhbl9lbF9pbl9zdXBwbHkubnVtYmVyKTsKKwlpaW9fc2Nhbl9tYXNrX3NldChyaW5nLCBpaW9fc2Nhbl9lbF9hY2NlbF94Lm51bWJlcik7CisJaWlvX3NjYW5fbWFza19zZXQocmluZywgaWlvX3NjYW5fZWxfYWNjZWxfeS5udW1iZXIpOworCWlpb19zY2FuX21hc2tfc2V0KHJpbmcsIGlpb19zY2FuX2VsX3RlbXAubnVtYmVyKTsKKwlpaW9fc2Nhbl9tYXNrX3NldChyaW5nLCBpaW9fc2Nhbl9lbF9pbjAubnVtYmVyKTsKKwlpaW9fc2Nhbl9tYXNrX3NldChyaW5nLCBpaW9fc2Nhbl9lbF9pbmNsaV94Lm51bWJlcik7CisJaWlvX3NjYW5fbWFza19zZXQocmluZywgaWlvX3NjYW5fZWxfaW5jbGlfeS5udW1iZXIpOworCisJcmV0ID0gaWlvX2FsbG9jX3BvbGxmdW5jKGluZGlvX2RldiwgTlVMTCwgJmFkaXMxNjIwMV9wb2xsX2Z1bmNfdGgpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfaWlvX3N3X3JiX2ZyZWU7CisKKwlpbmRpb19kZXYtPm1vZGVzIHw9IElORElPX1JJTkdfVFJJR0dFUkVEOworCXJldHVybiAwOworCitlcnJvcl9paW9fc3dfcmJfZnJlZToKKwlpaW9fc3dfcmJfZnJlZShpbmRpb19kZXYtPnJpbmcpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBhZGlzMTYyMDFfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpCit7CisJcmV0dXJuIGlpb19yaW5nX2J1ZmZlcl9yZWdpc3RlcihyaW5nLCAwKTsKK30KKwordm9pZCBhZGlzMTYyMDFfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKK3sKKwlpaW9fcmluZ19idWZmZXJfdW5yZWdpc3RlcihyaW5nKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAxX3RyaWdnZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAxX3RyaWdnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTljZWExOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAxX3RyaWdnZXIuYwpAQCAtMCwwICsxLDEyMiBAQAorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKyNpbmNsdWRlICIuLi90cmlnZ2VyLmgiCisjaW5jbHVkZSAiYWRpczE2MjAxLmgiCisKKy8qKgorICogYWRpczE2MjAxX2RhdGFfcmR5X3RyaWdfcG9sbCgpIHRoZSBldmVudCBoYW5kbGVyIGZvciB0aGUgZGF0YSByZHkgdHJpZworICoqLworc3RhdGljIGludCBhZGlzMTYyMDFfZGF0YV9yZHlfdHJpZ19wb2xsKHN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbywKKwkJCQkgICAgICAgaW50IGluZGV4LAorCQkJCSAgICAgICBzNjQgdGltZXN0YW1wLAorCQkJCSAgICAgICBpbnQgbm9fdGVzdCkKK3sKKwlzdHJ1Y3QgYWRpczE2MjAxX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoZGV2X2luZm8pOworCXN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZyA9IHN0LT50cmlnOworCisJaWlvX3RyaWdnZXJfcG9sbCh0cmlnLCB0aW1lc3RhbXApOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitJSU9fRVZFTlRfU0goZGF0YV9yZHlfdHJpZywgJmFkaXMxNjIwMV9kYXRhX3JkeV90cmlnX3BvbGwpOworCitzdGF0aWMgREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgaWlvX3RyaWdnZXJfcmVhZF9uYW1lLCBOVUxMKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkaXMxNjIwMV90cmlnZ2VyX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX25hbWUuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWRpczE2MjAxX3RyaWdnZXJfYXR0cl9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZGlzMTYyMDFfdHJpZ2dlcl9hdHRycywKK307CisKKy8qKgorICogYWRpczE2MjAxX2RhdGFfcmR5X3RyaWdnZXJfc2V0X3N0YXRlKCkgc2V0IGRhdGFyZHkgaW50ZXJydXB0IHN0YXRlCisgKiovCitzdGF0aWMgaW50IGFkaXMxNjIwMV9kYXRhX3JkeV90cmlnZ2VyX3NldF9zdGF0ZShzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWcsCisJCQkJCQlib29sIHN0YXRlKQoreworCXN0cnVjdCBhZGlzMTYyMDFfc3RhdGUgKnN0ID0gdHJpZy0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBzdC0+aW5kaW9fZGV2OworCWludCByZXQgPSAwOworCisJZGV2X2RiZygmaW5kaW9fZGV2LT5kZXYsICIlcyAoJWQpXG4iLCBfX2Z1bmNfXywgc3RhdGUpOworCXJldCA9IGFkaXMxNjIwMV9zZXRfaXJxKCZzdC0+aW5kaW9fZGV2LT5kZXYsIHN0YXRlKTsKKwlpZiAoc3RhdGUgPT0gZmFsc2UpIHsKKwkJaWlvX3JlbW92ZV9ldmVudF9mcm9tX2xpc3QoJmlpb19ldmVudF9kYXRhX3JkeV90cmlnLAorCQkJCQkgICAmaW5kaW9fZGV2LT5pbnRlcnJ1cHRzWzBdCisJCQkJCSAgIC0+ZXZfbGlzdCk7CisJCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJfSBlbHNlIHsKKwkJaWlvX2FkZF9ldmVudF90b19saXN0KCZpaW9fZXZlbnRfZGF0YV9yZHlfdHJpZywKKwkJCQkgICAgICAmaW5kaW9fZGV2LT5pbnRlcnJ1cHRzWzBdLT5ldl9saXN0KTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBhZGlzMTYyMDFfdHJpZ190cnlfcmVlbigpIHRyeSByZW5hYmxpbmcgaXJxIGZvciBkYXRhIHJkeSB0cmlnZ2VyCisgKiBAdHJpZzoJdGhlIGRhdGFyZHkgdHJpZ2dlcgorICoqLworc3RhdGljIGludCBhZGlzMTYyMDFfdHJpZ190cnlfcmVlbihzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWcpCit7CisJc3RydWN0IGFkaXMxNjIwMV9zdGF0ZSAqc3QgPSB0cmlnLT5wcml2YXRlX2RhdGE7CisJZW5hYmxlX2lycShzdC0+dXMtPmlycSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBhZGlzMTYyMDFfcHJvYmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCWludCByZXQ7CisJc3RydWN0IGFkaXMxNjIwMV9zdGF0ZSAqc3QgPSBpbmRpb19kZXYtPmRldl9kYXRhOworCisJc3QtPnRyaWcgPSBpaW9fYWxsb2NhdGVfdHJpZ2dlcigpOworCXN0LT50cmlnLT5uYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsCisJCQkJImFkaXMxNjIwMS1kZXYlZCIsCisJCQkJaW5kaW9fZGV2LT5pZCk7CisJaWYgKCFzdC0+dHJpZy0+bmFtZSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfdHJpZzsKKwl9CisJc3QtPnRyaWctPmRldi5wYXJlbnQgPSAmc3QtPnVzLT5kZXY7CisJc3QtPnRyaWctPm93bmVyID0gVEhJU19NT0RVTEU7CisJc3QtPnRyaWctPnByaXZhdGVfZGF0YSA9IHN0OworCXN0LT50cmlnLT5zZXRfdHJpZ2dlcl9zdGF0ZSA9ICZhZGlzMTYyMDFfZGF0YV9yZHlfdHJpZ2dlcl9zZXRfc3RhdGU7CisJc3QtPnRyaWctPnRyeV9yZWVuYWJsZSA9ICZhZGlzMTYyMDFfdHJpZ190cnlfcmVlbjsKKwlzdC0+dHJpZy0+Y29udHJvbF9hdHRycyA9ICZhZGlzMTYyMDFfdHJpZ2dlcl9hdHRyX2dyb3VwOworCXJldCA9IGlpb190cmlnZ2VyX3JlZ2lzdGVyKHN0LT50cmlnKTsKKworCS8qIHNlbGVjdCBkZWZhdWx0IHRyaWdnZXIgKi8KKwlpbmRpb19kZXYtPnRyaWcgPSBzdC0+dHJpZzsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfdHJpZ19uYW1lOworCisJcmV0dXJuIDA7CisKK2Vycm9yX2ZyZWVfdHJpZ19uYW1lOgorCWtmcmVlKHN0LT50cmlnLT5uYW1lKTsKK2Vycm9yX2ZyZWVfdHJpZzoKKwlpaW9fZnJlZV90cmlnZ2VyKHN0LT50cmlnKTsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgYWRpczE2MjAxX3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJc3RydWN0IGFkaXMxNjIwMV9zdGF0ZSAqc3RhdGUgPSBpbmRpb19kZXYtPmRldl9kYXRhOworCisJaWlvX3RyaWdnZXJfdW5yZWdpc3RlcihzdGF0ZS0+dHJpZyk7CisJa2ZyZWUoc3RhdGUtPnRyaWctPm5hbWUpOworCWlpb19mcmVlX3RyaWdnZXIoc3RhdGUtPnRyaWcpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDMuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM5MzIzZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAzLmgKQEAgLTAsMCArMSwxNDMgQEAKKyNpZm5kZWYgU1BJX0FESVMxNjIwM19IXworI2RlZmluZSBTUElfQURJUzE2MjAzX0hfCisKKyNkZWZpbmUgQURJUzE2MjAzX1NUQVJUVVBfREVMQVkJMjIwIC8qIG1zICovCisKKyNkZWZpbmUgQURJUzE2MjAzX1JFQURfUkVHKGEpICAgIGEKKyNkZWZpbmUgQURJUzE2MjAzX1dSSVRFX1JFRyhhKSAoKGEpIHwgMHg4MCkKKworI2RlZmluZSBBRElTMTYyMDNfRkxBU0hfQ05UICAgICAgMHgwMCAvKiBGbGFzaCBtZW1vcnkgd3JpdGUgY291bnQgKi8KKyNkZWZpbmUgQURJUzE2MjAzX1NVUFBMWV9PVVQgICAgIDB4MDIgLyogT3V0cHV0LCBwb3dlciBzdXBwbHkgKi8KKyNkZWZpbmUgQURJUzE2MjAzX0FVWF9BREMgICAgICAgIDB4MDggLyogT3V0cHV0LCBhdXhpbGlhcnkgQURDIGlucHV0ICovCisjZGVmaW5lIEFESVMxNjIwM19URU1QX09VVCAgICAgICAweDBBIC8qIE91dHB1dCwgdGVtcGVyYXR1cmUgKi8KKyNkZWZpbmUgQURJUzE2MjAzX1hJTkNMX09VVCAgICAgIDB4MEMgLyogT3V0cHV0LCB4LWF4aXMgaW5jbGluYXRpb24gKi8KKyNkZWZpbmUgQURJUzE2MjAzX1lJTkNMX09VVCAgICAgIDB4MEUgLyogT3V0cHV0LCB5LWF4aXMgaW5jbGluYXRpb24gKi8KKyNkZWZpbmUgQURJUzE2MjAzX0lOQ0xfTlVMTCAgICAgIDB4MTggLyogSW5jbGluZSBudWxsIGNhbGlicmF0aW9uICovCisjZGVmaW5lIEFESVMxNjIwM19BTE1fTUFHMSAgICAgICAweDIwIC8qIEFsYXJtIDEgYW1wbGl0dWRlIHRocmVzaG9sZCAqLworI2RlZmluZSBBRElTMTYyMDNfQUxNX01BRzIgICAgICAgMHgyMiAvKiBBbGFybSAyIGFtcGxpdHVkZSB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgQURJUzE2MjAzX0FMTV9TTVBMMSAgICAgIDB4MjQgLyogQWxhcm0gMSwgc2FtcGxlIHBlcmlvZCAqLworI2RlZmluZSBBRElTMTYyMDNfQUxNX1NNUEwyICAgICAgMHgyNiAvKiBBbGFybSAyLCBzYW1wbGUgcGVyaW9kICovCisjZGVmaW5lIEFESVMxNjIwM19BTE1fQ1RSTCAgICAgICAweDI4IC8qIEFsYXJtIGNvbnRyb2wgKi8KKyNkZWZpbmUgQURJUzE2MjAzX0FVWF9EQUMgICAgICAgIDB4MzAgLyogQXV4aWxpYXJ5IERBQyBkYXRhICovCisjZGVmaW5lIEFESVMxNjIwM19HUElPX0NUUkwgICAgICAweDMyIC8qIEdlbmVyYWwtcHVycG9zZSBkaWdpdGFsIGlucHV0L291dHB1dCBjb250cm9sICovCisjZGVmaW5lIEFESVMxNjIwM19NU0NfQ1RSTCAgICAgICAweDM0IC8qIE1pc2NlbGxhbmVvdXMgY29udHJvbCAqLworI2RlZmluZSBBRElTMTYyMDNfU01QTF9QUkQgICAgICAgMHgzNiAvKiBJbnRlcm5hbCBzYW1wbGUgcGVyaW9kIChyYXRlKSBjb250cm9sICovCisjZGVmaW5lIEFESVMxNjIwM19BVkdfQ05UICAgICAgICAweDM4IC8qIE9wZXJhdGlvbiwgZmlsdGVyIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgQURJUzE2MjAzX1NMUF9DTlQgICAgICAgIDB4M0EgLyogT3BlcmF0aW9uLCBzbGVlcCBtb2RlIGNvbnRyb2wgKi8KKyNkZWZpbmUgQURJUzE2MjAzX0RJQUdfU1RBVCAgICAgIDB4M0MgLyogRGlhZ25vc3RpY3MsIHN5c3RlbSBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURJUzE2MjAzX0dMT0JfQ01EICAgICAgIDB4M0UgLyogT3BlcmF0aW9uLCBzeXN0ZW0gY29tbWFuZCByZWdpc3RlciAqLworCisjZGVmaW5lIEFESVMxNjIwM19PVVRQVVRTICAgICAgICA1CisKKy8qIE1TQ19DVFJMICovCisjZGVmaW5lIEFESVMxNjIwM19NU0NfQ1RSTF9QV1JVUF9TRUxGX1RFU1QJKDEgPDwgMTApIC8qIFNlbGYtdGVzdCBhdCBwb3dlci1vbjogMSA9IGRpc2FibGVkLCAwID0gZW5hYmxlZCAqLworI2RlZmluZSBBRElTMTYyMDNfTVNDX0NUUkxfUkVWRVJTRV9ST1RfRU4JKDEgPDwgOSkgIC8qIFJldmVyc2VzIHJvdGF0aW9uIG9mIGJvdGggaW5jbGluYXRpb24gb3V0cHV0cyAqLworI2RlZmluZSBBRElTMTYyMDNfTVNDX0NUUkxfU0VMRl9URVNUX0VOCSAgICAgICAgKDEgPDwgOCkgIC8qIFNlbGYtdGVzdCBlbmFibGUgKi8KKyNkZWZpbmUgQURJUzE2MjAzX01TQ19DVFJMX0RBVEFfUkRZX0VOCSAgICAgICAgKDEgPDwgMikgIC8qIERhdGEtcmVhZHkgZW5hYmxlOiAxID0gZW5hYmxlZCwgMCA9IGRpc2FibGVkICovCisjZGVmaW5lIEFESVMxNjIwM19NU0NfQ1RSTF9BQ1RJVkVfSElHSAkgICAgICAgICgxIDw8IDEpICAvKiBEYXRhLXJlYWR5IHBvbGFyaXR5OiAxID0gYWN0aXZlIGhpZ2gsIDAgPSBhY3RpdmUgbG93ICovCisjZGVmaW5lIEFESVMxNjIwM19NU0NfQ1RSTF9EQVRBX1JEWV9ESU8xCSgxIDw8IDApICAvKiBEYXRhLXJlYWR5IGxpbmUgc2VsZWN0aW9uOiAxID0gRElPMSwgMCA9IERJTzAgKi8KKworLyogRElBR19TVEFUICovCisjZGVmaW5lIEFESVMxNjIwM19ESUFHX1NUQVRfQUxBUk0yICAgICAgICAoMTw8OSkgLyogQWxhcm0gMiBzdGF0dXM6IDEgPSBhbGFybSBhY3RpdmUsIDAgPSBhbGFybSBpbmFjdGl2ZSAqLworI2RlZmluZSBBRElTMTYyMDNfRElBR19TVEFUX0FMQVJNMSAgICAgICAgKDE8PDgpIC8qIEFsYXJtIDEgc3RhdHVzOiAxID0gYWxhcm0gYWN0aXZlLCAwID0gYWxhcm0gaW5hY3RpdmUgKi8KKyNkZWZpbmUgQURJUzE2MjAzX0RJQUdfU1RBVF9TRUxGVEVTVF9GQUlMICgxPDw1KSAvKiBTZWxmLXRlc3QgZGlhZ25vc3RpYyBlcnJvciBmbGFnICovCisjZGVmaW5lIEFESVMxNjIwM19ESUFHX1NUQVRfU1BJX0ZBSUwJICAoMTw8MykgLyogU1BJIGNvbW11bmljYXRpb25zIGZhaWx1cmUgKi8KKyNkZWZpbmUgQURJUzE2MjAzX0RJQUdfU1RBVF9GTEFTSF9VUFQJICAoMTw8MikgLyogRmxhc2ggdXBkYXRlIGZhaWx1cmUgKi8KKyNkZWZpbmUgQURJUzE2MjAzX0RJQUdfU1RBVF9QT1dFUl9ISUdICSAgKDE8PDEpIC8qIFBvd2VyIHN1cHBseSBhYm92ZSAzLjYyNSBWICovCisjZGVmaW5lIEFESVMxNjIwM19ESUFHX1NUQVRfUE9XRVJfTE9XCSAgKDE8PDApIC8qIFBvd2VyIHN1cHBseSBiZWxvdyAzLjE1IFYgKi8KKworLyogR0xPQl9DTUQgKi8KKyNkZWZpbmUgQURJUzE2MjAzX0dMT0JfQ01EX1NXX1JFU0VUCSgxPDw3KQorI2RlZmluZSBBRElTMTYyMDNfR0xPQl9DTURfQ0xFQVJfU1RBVAkoMTw8NCkKKyNkZWZpbmUgQURJUzE2MjAzX0dMT0JfQ01EX0ZBQ1RPUllfQ0FMCSgxPDwxKQorCisjZGVmaW5lIEFESVMxNjIwM19NQVhfVFggMTIKKyNkZWZpbmUgQURJUzE2MjAzX01BWF9SWCAxMAorCisjZGVmaW5lIEFESVMxNjIwM19FUlJPUl9BQ1RJVkUgICAgICAgICAgKDE8PDE0KQorCisvKioKKyAqIHN0cnVjdCBhZGlzMTYyMDNfc3RhdGUgLSBkZXZpY2UgaW5zdGFuY2Ugc3BlY2lmaWMgZGF0YQorICogQHVzOgkJCWFjdHVhbCBzcGlfZGV2aWNlCisgKiBAd29ya190cmlnZ2VyX3RvX3Jpbmc6IGJoIGZvciB0cmlnZ2VyZWQgZXZlbnQgaGFuZGxpbmcKKyAqIEBpbnRlcjoJCXVzZWQgdG8gY2hlY2sgaWYgbmV3IGludGVycnVwdCBoYXMgYmVlbiB0cmlnZ2VyZWQKKyAqIEBsYXN0X3RpbWVzdGFtcDoJcGFzc2luZyB0aW1lc3RhbXAgZnJvbSB0aCB0byBiaCBvZiBpbnRlcnJ1cHQgaGFuZGxlcgorICogQGluZGlvX2RldjoJCWluZHVzdHJpYWwgSS9PIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEB0cmlnOgkJZGF0YSByZWFkeSB0cmlnZ2VyIHJlZ2lzdGVyZWQgd2l0aCBpaW8KKyAqIEB0eDoJCQl0cmFuc21pdCBidWZmZXIKKyAqIEByeDoJCQlyZWNpZXZlIGJ1ZmZlcgorICogQGJ1Zl9sb2NrOgkJbXV0ZXggdG8gcHJvdGVjdCB0eCBhbmQgcngKKyAqKi8KK3N0cnVjdCBhZGlzMTYyMDNfc3RhdGUgeworCXN0cnVjdCBzcGlfZGV2aWNlCQkqdXM7CisJc3RydWN0IHdvcmtfc3RydWN0CQl3b3JrX3RyaWdnZXJfdG9fcmluZzsKKwlzNjQJCQkJbGFzdF90aW1lc3RhbXA7CisJc3RydWN0IGlpb19kZXYJCQkqaW5kaW9fZGV2OworCXN0cnVjdCBpaW9fdHJpZ2dlcgkJKnRyaWc7CisJdTgJCQkJKnR4OworCXU4CQkJCSpyeDsKKwlzdHJ1Y3QgbXV0ZXgJCQlidWZfbG9jazsKK307CisKK2ludCBhZGlzMTYyMDNfc2V0X2lycShzdHJ1Y3QgZGV2aWNlICpkZXYsIGJvb2wgZW5hYmxlKTsKKworI2lmZGVmIENPTkZJR19JSU9fUklOR19CVUZGRVIKK2VudW0gYWRpczE2MjAzX3NjYW4geworCUFESVMxNjIwM19TQ0FOX1NVUFBMWSwKKwlBRElTMTYyMDNfU0NBTl9BVVhfQURDLAorCUFESVMxNjIwM19TQ0FOX1RFTVAsCisJQURJUzE2MjAzX1NDQU5fSU5DTElfWCwKKwlBRElTMTYyMDNfU0NBTl9JTkNMSV9ZLAorfTsKKwordm9pZCBhZGlzMTYyMDNfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CitpbnQgYWRpczE2MjAzX3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKK3NzaXplX3QgYWRpczE2MjAzX3JlYWRfZGF0YV9mcm9tX3Jpbmcoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgIGNoYXIgKmJ1Zik7CisKK2ludCBhZGlzMTYyMDNfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7Cit2b2lkIGFkaXMxNjIwM191bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOworCitpbnQgYWRpczE2MjAzX2luaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKTsKK3ZvaWQgYWRpczE2MjAzX3VuaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpOworI2Vsc2UgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgYWRpczE2MjAzX3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFkaXMxNjIwM19wcm9iZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdAorYWRpczE2MjAzX3JlYWRfZGF0YV9mcm9tX3Jpbmcoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICBjaGFyICpidWYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRpczE2MjAzX2NvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGlzMTYyMDNfdW5jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworfQorCitzdGF0aWMgaW5saW5lIGludCBhZGlzMTYyMDNfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGlzMTYyMDNfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKK3sKK30KKworI2VuZGlmIC8qIENPTkZJR19JSU9fUklOR19CVUZGRVIgKi8KKyNlbmRpZiAvKiBTUElfQURJUzE2MjAzX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwM19jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwM19jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU3ZjE5MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAzX2NvcmUuYwpAQCAtMCwwICsxLDU2OCBAQAorLyoKKyAqIEFESVMxNjIwMyBQcm9ncmFtbWFibGUgRGlnaXRhbCBWaWJyYXRpb24gU2Vuc29yIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisjaW5jbHVkZSAiYWNjZWwuaCIKKyNpbmNsdWRlICJpbmNsaW5vbWV0ZXIuaCIKKyNpbmNsdWRlICIuLi9neXJvL2d5cm8uaCIKKyNpbmNsdWRlICIuLi9hZGMvYWRjLmgiCisKKyNpbmNsdWRlICJhZGlzMTYyMDMuaCIKKworI2RlZmluZSBEUklWRVJfTkFNRQkJImFkaXMxNjIwMyIKKworc3RhdGljIGludCBhZGlzMTYyMDNfY2hlY2tfc3RhdHVzKHN0cnVjdCBkZXZpY2UgKmRldik7CisKKy8qKgorICogYWRpczE2MjAzX3NwaV93cml0ZV9yZWdfOCgpIC0gd3JpdGUgc2luZ2xlIGJ5dGUgdG8gYSByZWdpc3RlcgorICogQGRldjogZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBjaGlsZCBvZiBhY3R1YWwgZGV2aWNlIChpaW9fZGV2IG9yIGlpb190cmlnKQorICogQHJlZ19hZGRyZXNzOiB0aGUgYWRkcmVzcyBvZiB0aGUgcmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgorICogQHZhbDogdGhlIHZhbHVlIHRvIHdyaXRlCisgKiovCitzdGF0aWMgaW50IGFkaXMxNjIwM19zcGlfd3JpdGVfcmVnXzgoc3RydWN0IGRldmljZSAqZGV2LAorCQl1OCByZWdfYWRkcmVzcywKKwkJdTggdmFsKQoreworCWludCByZXQ7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGlzMTYyMDNfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSBBRElTMTYyMDNfV1JJVEVfUkVHKHJlZ19hZGRyZXNzKTsKKwlzdC0+dHhbMV0gPSB2YWw7CisKKwlyZXQgPSBzcGlfd3JpdGUoc3QtPnVzLCBzdC0+dHgsIDIpOworCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogYWRpczE2MjAzX3NwaV93cml0ZV9yZWdfMTYoKSAtIHdyaXRlIDIgYnl0ZXMgdG8gYSBwYWlyIG9mIHJlZ2lzdGVycworICogQGRldjogZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBjaGlsZCBvZiBhY3R1YWwgZGV2aWNlIChpaW9fZGV2IG9yIGlpb190cmlnKQorICogQHJlZ19hZGRyZXNzOiB0aGUgYWRkcmVzcyBvZiB0aGUgbG93ZXIgb2YgdGhlIHR3byByZWdpc3RlcnMuIFNlY29uZCByZWdpc3RlcgorICogICAgICAgICAgICAgICBpcyBhc3N1bWVkIHRvIGhhdmUgYWRkcmVzcyBvbmUgZ3JlYXRlci4KKyAqIEB2YWw6IHZhbHVlIHRvIGJlIHdyaXR0ZW4KKyAqKi8KK3N0YXRpYyBpbnQgYWRpczE2MjAzX3NwaV93cml0ZV9yZWdfMTYoc3RydWN0IGRldmljZSAqZGV2LAorCQl1OCBsb3dlcl9yZWdfYWRkcmVzcywKKwkJdTE2IHZhbHVlKQoreworCWludCByZXQ7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkaXMxNjIwM19zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyc1tdID0geworCQl7CisJCQkudHhfYnVmID0gc3QtPnR4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDIsCisJCQkuY3NfY2hhbmdlID0gMSwKKwkJfSwgeworCQkJLnR4X2J1ZiA9IHN0LT50eCArIDIsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gMiwKKwkJCS5jc19jaGFuZ2UgPSAxLAorCQl9LAorCX07CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IEFESVMxNjIwM19XUklURV9SRUcobG93ZXJfcmVnX2FkZHJlc3MpOworCXN0LT50eFsxXSA9IHZhbHVlICYgMHhGRjsKKwlzdC0+dHhbMl0gPSBBRElTMTYyMDNfV1JJVEVfUkVHKGxvd2VyX3JlZ19hZGRyZXNzICsgMSk7CisJc3QtPnR4WzNdID0gKHZhbHVlID4+IDgpICYgMHhGRjsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXJzWzBdLCAmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcnNbMV0sICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBhZGlzMTYyMDNfc3BpX3JlYWRfcmVnXzE2KCkgLSByZWFkIDIgYnl0ZXMgZnJvbSBhIDE2LWJpdCByZWdpc3RlcgorICogQGRldjogZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBjaGlsZCBvZiBhY3R1YWwgZGV2aWNlIChpaW9fZGV2IG9yIGlpb190cmlnKQorICogQHJlZ19hZGRyZXNzOiB0aGUgYWRkcmVzcyBvZiB0aGUgbG93ZXIgb2YgdGhlIHR3byByZWdpc3RlcnMuIFNlY29uZCByZWdpc3RlcgorICogICAgICAgICAgICAgICBpcyBhc3N1bWVkIHRvIGhhdmUgYWRkcmVzcyBvbmUgZ3JlYXRlci4KKyAqIEB2YWw6IHNvbWV3aGVyZSB0byBwYXNzIGJhY2sgdGhlIHZhbHVlIHJlYWQKKyAqKi8KK3N0YXRpYyBpbnQgYWRpczE2MjAzX3NwaV9yZWFkX3JlZ18xNihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXU4IGxvd2VyX3JlZ19hZGRyZXNzLAorCQl1MTYgKnZhbCkKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRpczE2MjAzX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbXSA9IHsKKwkJeworCQkJLnR4X2J1ZiA9IHN0LT50eCwKKwkJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJCS5sZW4gPSAyLAorCQkJLmNzX2NoYW5nZSA9IDEsCisJCQkuZGVsYXlfdXNlY3MgPSAyMCwKKwkJfSwgeworCQkJLnJ4X2J1ZiA9IHN0LT5yeCwKKwkJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJCS5sZW4gPSAyLAorCQkJLmNzX2NoYW5nZSA9IDEsCisJCQkuZGVsYXlfdXNlY3MgPSAyMCwKKwkJfSwKKwl9OworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSBBRElTMTYyMDNfUkVBRF9SRUcobG93ZXJfcmVnX2FkZHJlc3MpOworCXN0LT50eFsxXSA9IDA7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyc1swXSwgJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXJzWzFdLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+dXMsICZtc2cpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3QtPnVzLT5kZXYsICJwcm9ibGVtIHdoZW4gcmVhZGluZyAxNiBiaXQgcmVnaXN0ZXIgMHglMDJYIiwKKwkJCQlsb3dlcl9yZWdfYWRkcmVzcyk7CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwkqdmFsID0gKHN0LT5yeFswXSA8PCA4KSB8IHN0LT5yeFsxXTsKKworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZGlzMTYyMDNfcmVhZF8xMmJpdF91bnNpZ25lZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJaW50IHJldDsKKwl1MTYgdmFsID0gMDsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisKKwlyZXQgPSBhZGlzMTYyMDNfc3BpX3JlYWRfcmVnXzE2KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKHZhbCAmIEFESVMxNjIwM19FUlJPUl9BQ1RJVkUpCisJCWFkaXMxNjIwM19jaGVja19zdGF0dXMoZGV2KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCB2YWwgJiAweDBGRkYpOworfQorCitzdGF0aWMgc3NpemVfdCBhZGlzMTYyMDNfcmVhZF90ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3NpemVfdCByZXQ7CisJdTE2IHZhbDsKKworCS8qIFRha2UgdGhlIGlpb19kZXYgc3RhdHVzIGxvY2sgKi8KKwltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCXJldCA9IGFkaXMxNjIwM19zcGlfcmVhZF9yZWdfMTYoZGV2LCBBRElTMTYyMDNfVEVNUF9PVVQsICh1MTYgKikmdmFsKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCWlmICh2YWwgJiBBRElTMTYyMDNfRVJST1JfQUNUSVZFKQorCQlhZGlzMTYyMDNfY2hlY2tfc3RhdHVzKGRldik7CisKKwl2YWwgJj0gMHhGRkY7CisJcmV0ID0gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsKTsKKworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWRpczE2MjAzX3JlYWRfMTRiaXRfc2lnbmVkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCXMxNiB2YWwgPSAwOworCXNzaXplX3QgcmV0OworCisJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisKKwlyZXQgPSBhZGlzMTYyMDNfc3BpX3JlYWRfcmVnXzE2KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCAodTE2ICopJnZhbCk7CisJaWYgKCFyZXQpIHsKKwkJaWYgKHZhbCAmIEFESVMxNjIwM19FUlJPUl9BQ1RJVkUpCisJCQlhZGlzMTYyMDNfY2hlY2tfc3RhdHVzKGRldik7CisKKwkJdmFsID0gKChzMTYpKHZhbCA8PCAyKSA+PiAyKTsKKwkJcmV0ID0gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsKTsKKwl9CisKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWRpczE2MjAzX3dyaXRlXzE2Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisJaW50IHJldDsKKwlsb25nIHZhbDsKKworCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnZhbCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisJcmV0ID0gYWRpczE2MjAzX3NwaV93cml0ZV9yZWdfMTYoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsIHZhbCk7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgaW50IGFkaXMxNjIwM19yZXNldChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHJldDsKKwlyZXQgPSBhZGlzMTYyMDNfc3BpX3dyaXRlX3JlZ184KGRldiwKKwkJCUFESVMxNjIwM19HTE9CX0NNRCwKKwkJCUFESVMxNjIwM19HTE9CX0NNRF9TV19SRVNFVCk7CisJaWYgKHJldCkKKwkJZGV2X2VycihkZXYsICJwcm9ibGVtIHJlc2V0dGluZyBkZXZpY2UiKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkaXMxNjIwM193cml0ZV9yZXNldChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJaWYgKGxlbiA8IDEpCisJCXJldHVybiAtRUlOVkFMOworCXN3aXRjaCAoYnVmWzBdKSB7CisJY2FzZSAnMSc6CisJY2FzZSAneSc6CisJY2FzZSAnWSc6CisJCXJldHVybiBhZGlzMTYyMDNfcmVzZXQoZGV2KTsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK2ludCBhZGlzMTYyMDNfc2V0X2lycShzdHJ1Y3QgZGV2aWNlICpkZXYsIGJvb2wgZW5hYmxlKQoreworCWludCByZXQgPSAwOworCXUxNiBtc2M7CisKKwlyZXQgPSBhZGlzMTYyMDNfc3BpX3JlYWRfcmVnXzE2KGRldiwgQURJUzE2MjAzX01TQ19DVFJMLCAmbXNjKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCW1zYyB8PSBBRElTMTYyMDNfTVNDX0NUUkxfQUNUSVZFX0hJR0g7CisJbXNjICY9IH5BRElTMTYyMDNfTVNDX0NUUkxfREFUQV9SRFlfRElPMTsKKwlpZiAoZW5hYmxlKQorCQltc2MgfD0gQURJUzE2MjAzX01TQ19DVFJMX0RBVEFfUkRZX0VOOworCWVsc2UKKwkJbXNjICY9IH5BRElTMTYyMDNfTVNDX0NUUkxfREFUQV9SRFlfRU47CisKKwlyZXQgPSBhZGlzMTYyMDNfc3BpX3dyaXRlX3JlZ18xNihkZXYsIEFESVMxNjIwM19NU0NfQ1RSTCwgbXNjKTsKKworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRpczE2MjAzX2NoZWNrX3N0YXR1cyhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJdTE2IHN0YXR1czsKKwlpbnQgcmV0OworCisJcmV0ID0gYWRpczE2MjAzX3NwaV9yZWFkX3JlZ18xNihkZXYsIEFESVMxNjIwM19ESUFHX1NUQVQsICZzdGF0dXMpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiUmVhZGluZyBzdGF0dXMgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCXJldCA9IHN0YXR1cyAmIDB4MUY7CisKKwlpZiAoc3RhdHVzICYgQURJUzE2MjAzX0RJQUdfU1RBVF9TRUxGVEVTVF9GQUlMKQorCQlkZXZfZXJyKGRldiwgIlNlbGYgdGVzdCBmYWlsdXJlXG4iKTsKKwlpZiAoc3RhdHVzICYgQURJUzE2MjAzX0RJQUdfU1RBVF9TUElfRkFJTCkKKwkJZGV2X2VycihkZXYsICJTUEkgZmFpbHVyZVxuIik7CisJaWYgKHN0YXR1cyAmIEFESVMxNjIwM19ESUFHX1NUQVRfRkxBU0hfVVBUKQorCQlkZXZfZXJyKGRldiwgIkZsYXNoIHVwZGF0ZSBmYWlsZWRcbiIpOworCWlmIChzdGF0dXMgJiBBRElTMTYyMDNfRElBR19TVEFUX1BPV0VSX0hJR0gpCisJCWRldl9lcnIoZGV2LCAiUG93ZXIgc3VwcGx5IGFib3ZlIDMuNjI1VlxuIik7CisJaWYgKHN0YXR1cyAmIEFESVMxNjIwM19ESUFHX1NUQVRfUE9XRVJfTE9XKQorCQlkZXZfZXJyKGRldiwgIlBvd2VyIHN1cHBseSBiZWxvdyAzLjE1VlxuIik7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkaXMxNjIwM19zZWxmX3Rlc3Qoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCByZXQ7CisJcmV0ID0gYWRpczE2MjAzX3NwaV93cml0ZV9yZWdfMTYoZGV2LAorCQkJQURJUzE2MjAzX01TQ19DVFJMLAorCQkJQURJUzE2MjAzX01TQ19DVFJMX1NFTEZfVEVTVF9FTik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgInByb2JsZW0gc3RhcnRpbmcgc2VsZiB0ZXN0Iik7CisJCWdvdG8gZXJyX3JldDsKKwl9CisKKwlhZGlzMTYyMDNfY2hlY2tfc3RhdHVzKGRldik7CisKK2Vycl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGlzMTYyMDNfaW5pdGlhbF9zZXR1cChzdHJ1Y3QgYWRpczE2MjAzX3N0YXRlICpzdCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZzdC0+aW5kaW9fZGV2LT5kZXY7CisKKwkvKiBEaXNhYmxlIElSUSAqLworCXJldCA9IGFkaXMxNjIwM19zZXRfaXJxKGRldiwgZmFsc2UpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJkaXNhYmxlIGlycSBmYWlsZWQiKTsKKwkJZ290byBlcnJfcmV0OworCX0KKworCS8qIERvIHNlbGYgdGVzdCAqLworCXJldCA9IGFkaXMxNjIwM19zZWxmX3Rlc3QoZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAic2VsZiB0ZXN0IGZhaWx1cmUiKTsKKwkJZ290byBlcnJfcmV0OworCX0KKworCS8qIFJlYWQgc3RhdHVzIHJlZ2lzdGVyIHRvIGNoZWNrIHRoZSByZXN1bHQgKi8KKwlyZXQgPSBhZGlzMTYyMDNfY2hlY2tfc3RhdHVzKGRldik7CisJaWYgKHJldCkgeworCQlhZGlzMTYyMDNfcmVzZXQoZGV2KTsKKwkJZGV2X2VycihkZXYsICJkZXZpY2Ugbm90IHBsYXlpbmcgYmFsbCAtPiByZXNldCIpOworCQltc2xlZXAoQURJUzE2MjAzX1NUQVJUVVBfREVMQVkpOworCQlyZXQgPSBhZGlzMTYyMDNfY2hlY2tfc3RhdHVzKGRldik7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoZGV2LCAiZ2l2aW5nIHVwIik7CisJCQlnb3RvIGVycl9yZXQ7CisJCX0KKwl9CisKKwlwcmludGsoS0VSTl9JTkZPIERSSVZFUl9OQU1FICI6IGF0IENTJWQgKGlycSAlZClcbiIsCisJCQlzdC0+dXMtPmNoaXBfc2VsZWN0LCBzdC0+dXMtPmlycSk7CisKK2Vycl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9JTl9OQU1FRF9SQVcoMCwgc3VwcGx5LCBhZGlzMTYyMDNfcmVhZF8xMmJpdF91bnNpZ25lZCwKKwkJQURJUzE2MjAzX1NVUFBMWV9PVVQpOworc3RhdGljIElJT19DT05TVF9BVFRSKGluMF9zdXBwbHlfc2NhbGUsICIwLjAwMTIyIik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0lOX1JBVygxLCBhZGlzMTYyMDNfcmVhZF8xMmJpdF91bnNpZ25lZCwKKwkJQURJUzE2MjAzX0FVWF9BREMpOworc3RhdGljIElJT19DT05TVF9BVFRSKGluMV9zY2FsZSwgIjAuMDAwNjEiKTsKKworc3RhdGljIElJT19ERVZfQVRUUl9JTkNMSV9YKGFkaXMxNjIwM19yZWFkXzE0Yml0X3NpZ25lZCwKKwkJQURJUzE2MjAzX1hJTkNMX09VVCk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0lOQ0xJX1koYWRpczE2MjAzX3JlYWRfMTRiaXRfc2lnbmVkLAorCQlBRElTMTYyMDNfWUlOQ0xfT1VUKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfSU5DTElfWF9PRkZTRVQoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkaXMxNjIwM19yZWFkXzE0Yml0X3NpZ25lZCwKKwkJYWRpczE2MjAzX3dyaXRlXzE2Yml0LAorCQlBRElTMTYyMDNfSU5DTF9OVUxMKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihpbmNsaV9zY2FsZSwgIjAuMDI1Iik7CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfVEVNUF9SQVcoYWRpczE2MjAzX3JlYWRfdGVtcCk7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIodGVtcF9vZmZzZXQsICIyNSIpOworc3RhdGljIElJT19DT05TVF9BVFRSKHRlbXBfc2NhbGUsICItMC40NyIpOworCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKHJlc2V0LCBTX0lXVVNSLCBOVUxMLCBhZGlzMTYyMDNfd3JpdGVfcmVzZXQsIDApOworCitzdGF0aWMgSUlPX0NPTlNUX0FUVFIobmFtZSwgImFkaXMxNjIwMyIpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRpczE2MjAzX2V2ZW50X2F0dHJpYnV0ZXNbXSA9IHsKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZGlzMTYyMDNfZXZlbnRfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkaXMxNjIwM19ldmVudF9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkaXMxNjIwM19hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19kZXZfYXR0cl9pbjBfc3VwcGx5X3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbjBfc3VwcGx5X3NjYWxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl90ZW1wX3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl90ZW1wX29mZnNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl90ZW1wX3NjYWxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9yZXNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9uYW1lLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbjFfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2luMV9zY2FsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW5jbGlfeF9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luY2xpX3lfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbmNsaV94X29mZnNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbmNsaV9zY2FsZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkaXMxNjIwM19hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWRpczE2MjAzX2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZGlzMTYyMDNfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlpbnQgcmV0LCByZWdkb25lID0gMDsKKwlzdHJ1Y3QgYWRpczE2MjAzX3N0YXRlICpzdCA9IGt6YWxsb2Moc2l6ZW9mICpzdCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdCkgeworCQlyZXQgPSAgLUVOT01FTTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCS8qIHRoaXMgaXMgb25seSB1c2VkIGZvciByZW1vdmFsIHB1cnBvc2VzICovCisJc3BpX3NldF9kcnZkYXRhKHNwaSwgc3QpOworCisJLyogQWxsb2NhdGUgdGhlIGNvbW1zIGJ1ZmZlcnMgKi8KKwlzdC0+cnggPSBremFsbG9jKHNpemVvZigqc3QtPnJ4KSpBRElTMTYyMDNfTUFYX1JYLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QtPnJ4ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3N0OworCX0KKwlzdC0+dHggPSBremFsbG9jKHNpemVvZigqc3QtPnR4KSpBRElTMTYyMDNfTUFYX1RYLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QtPnR4ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3J4OworCX0KKwlzdC0+dXMgPSBzcGk7CisJbXV0ZXhfaW5pdCgmc3QtPmJ1Zl9sb2NrKTsKKwkvKiBzZXR1cCB0aGUgaW5kdXN0cmlhbGlvIGRyaXZlciBhbGxvY2F0ZWQgZWxlbWVudHMgKi8KKwlzdC0+aW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChzdC0+aW5kaW9fZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3R4OworCX0KKworCXN0LT5pbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmc3BpLT5kZXY7CisJc3QtPmluZGlvX2Rldi0+bnVtX2ludGVycnVwdF9saW5lcyA9IDE7CisJc3QtPmluZGlvX2Rldi0+ZXZlbnRfYXR0cnMgPSAmYWRpczE2MjAzX2V2ZW50X2F0dHJpYnV0ZV9ncm91cDsKKwlzdC0+aW5kaW9fZGV2LT5hdHRycyA9ICZhZGlzMTYyMDNfYXR0cmlidXRlX2dyb3VwOworCXN0LT5pbmRpb19kZXYtPmRldl9kYXRhID0gKHZvaWQgKikoc3QpOworCXN0LT5pbmRpb19kZXYtPmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRTsKKwlzdC0+aW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJcmV0ID0gYWRpczE2MjAzX2NvbmZpZ3VyZV9yaW5nKHN0LT5pbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKHN0LT5pbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfdW5yZWdfcmluZ19mdW5jczsKKwlyZWdkb25lID0gMTsKKworCXJldCA9IGFkaXMxNjIwM19pbml0aWFsaXplX3Jpbmcoc3QtPmluZGlvX2Rldi0+cmluZyk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byBpbml0aWFsaXplIHRoZSByaW5nXG4iKTsKKwkJZ290byBlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOworCX0KKworCWlmIChzcGktPmlycSkgeworCQlyZXQgPSBpaW9fcmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoc3BpLT5pcnEsCisJCQkJc3QtPmluZGlvX2RldiwKKwkJCQkwLAorCQkJCUlSUUZfVFJJR0dFUl9SSVNJTkcsCisJCQkJImFkaXMxNjIwMyIpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl91bmluaXRpYWxpemVfcmluZzsKKworCQlyZXQgPSBhZGlzMTYyMDNfcHJvYmVfdHJpZ2dlcihzdC0+aW5kaW9fZGV2KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfdW5yZWdpc3Rlcl9saW5lOworCX0KKworCS8qIEdldCB0aGUgZGV2aWNlIGludG8gYSBzYW5lIGluaXRpYWwgc3RhdGUgKi8KKwlyZXQgPSBhZGlzMTYyMDNfaW5pdGlhbF9zZXR1cChzdCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZW1vdmVfdHJpZ2dlcjsKKwlyZXR1cm4gMDsKKworZXJyb3JfcmVtb3ZlX3RyaWdnZXI6CisJYWRpczE2MjAzX3JlbW92ZV90cmlnZ2VyKHN0LT5pbmRpb19kZXYpOworZXJyb3JfdW5yZWdpc3Rlcl9saW5lOgorCWlmIChzcGktPmlycSkKKwkJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoc3QtPmluZGlvX2RldiwgMCk7CitlcnJvcl91bmluaXRpYWxpemVfcmluZzoKKwlhZGlzMTYyMDNfdW5pbml0aWFsaXplX3Jpbmcoc3QtPmluZGlvX2Rldi0+cmluZyk7CitlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOgorCWFkaXMxNjIwM191bmNvbmZpZ3VyZV9yaW5nKHN0LT5pbmRpb19kZXYpOworZXJyb3JfZnJlZV9kZXY6CisJaWYgKHJlZ2RvbmUpCisJCWlpb19kZXZpY2VfdW5yZWdpc3RlcihzdC0+aW5kaW9fZGV2KTsKKwllbHNlCisJCWlpb19mcmVlX2RldmljZShzdC0+aW5kaW9fZGV2KTsKK2Vycm9yX2ZyZWVfdHg6CisJa2ZyZWUoc3QtPnR4KTsKK2Vycm9yX2ZyZWVfcng6CisJa2ZyZWUoc3QtPnJ4KTsKK2Vycm9yX2ZyZWVfc3Q6CisJa2ZyZWUoc3QpOworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRpczE2MjAzX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBhZGlzMTYyMDNfc3RhdGUgKnN0ID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHN0LT5pbmRpb19kZXY7CisKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCisJYWRpczE2MjAzX3JlbW92ZV90cmlnZ2VyKGluZGlvX2Rldik7CisJaWYgKHNwaS0+aXJxKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShpbmRpb19kZXYsIDApOworCisJYWRpczE2MjAzX3VuaW5pdGlhbGl6ZV9yaW5nKGluZGlvX2Rldi0+cmluZyk7CisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJYWRpczE2MjAzX3VuY29uZmlndXJlX3JpbmcoaW5kaW9fZGV2KTsKKwlrZnJlZShzdC0+dHgpOworCWtmcmVlKHN0LT5yeCk7CisJa2ZyZWUoc3QpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhZGlzMTYyMDNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFkaXMxNjIwMyIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gYWRpczE2MjAzX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZGlzMTYyMDNfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGFkaXMxNjIwM19pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFkaXMxNjIwM19kcml2ZXIpOworfQorbW9kdWxlX2luaXQoYWRpczE2MjAzX2luaXQpOworCitzdGF0aWMgX19leGl0IHZvaWQgYWRpczE2MjAzX2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmFkaXMxNjIwM19kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoYWRpczE2MjAzX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJCYXJyeSBTb25nIDwyMWNuYmFvQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQURJUzE2MjAzIFByb2dyYW1tYWJsZSBEaWdpdGFsIFZpYnJhdGlvbiBTZW5zb3IgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwM19yaW5nLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwM19yaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q3NzRmNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAzX3JpbmcuYwpAQCAtMCwwICsxLDIxMSBAQAorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorI2luY2x1ZGUgIi4uL3Jpbmdfc3cuaCIKKyNpbmNsdWRlICJhY2NlbC5oIgorI2luY2x1ZGUgIi4uL3RyaWdnZXIuaCIKKyNpbmNsdWRlICJhZGlzMTYyMDMuaCIKKworc3RhdGljIElJT19TQ0FOX0VMX0MoaW5fc3VwcGx5LCBBRElTMTYyMDNfU0NBTl9TVVBQTFksIEFESVMxNjIwM19TVVBQTFlfT1VULCBOVUxMKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUl9TQ0FOX0VMX1RZUEUoaW5fc3VwcGx5LCB1LCAxMiwgMTYpOworc3RhdGljIElJT19TQ0FOX0VMX0MoaW4wLCBBRElTMTYyMDNfU0NBTl9BVVhfQURDLCBBRElTMTYyMDNfQVVYX0FEQywgTlVMTCk7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFJfU0NBTl9FTF9UWVBFKGluMCwgdSwgMTIsIDE2KTsKK3N0YXRpYyBJSU9fU0NBTl9FTF9DKHRlbXAsIEFESVMxNjIwM19TQ0FOX1RFTVAsIEFESVMxNjIwM19URU1QX09VVCwgTlVMTCk7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFJfU0NBTl9FTF9UWVBFKHRlbXAsIHUsIDEyLCAxNik7CitzdGF0aWMgSUlPX1NDQU5fRUxfQyhpbmNsaV94LCBBRElTMTYyMDNfU0NBTl9JTkNMSV9YLAorCQkgICAgIEFESVMxNjIwM19YSU5DTF9PVVQsIE5VTEwpOworc3RhdGljIElJT19TQ0FOX0VMX0MoaW5jbGlfeSwgQURJUzE2MjAzX1NDQU5fSU5DTElfWSwKKwkJICAgICBBRElTMTYyMDNfWUlOQ0xfT1VULCBOVUxMKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUl9TQ0FOX0VMX1RZUEUoaW5jbGksIHMsIDE0LCAxNik7CitzdGF0aWMgSUlPX1NDQU5fRUxfVElNRVNUQU1QKDUpOworc3RhdGljIElJT19DT05TVF9BVFRSX1NDQU5fRUxfVFlQRSh0aW1lc3RhbXAsIHMsIDY0LCA2NCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZGlzMTYyMDNfc2Nhbl9lbF9hdHRyc1tdID0geworCSZpaW9fc2Nhbl9lbF9pbl9zdXBwbHkuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfaW5fc3VwcGx5X2luZGV4LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2luX3N1cHBseV90eXBlLmRldl9hdHRyLmF0dHIsCisJJmlpb19zY2FuX2VsX2luMC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbjBfaW5kZXguZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfaW4wX3R5cGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX3NjYW5fZWxfdGVtcC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl90ZW1wX2luZGV4LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX3RlbXBfdHlwZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fc2Nhbl9lbF9pbmNsaV94LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2luY2xpX3hfaW5kZXguZGV2X2F0dHIuYXR0ciwKKwkmaWlvX3NjYW5fZWxfaW5jbGlfeS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbmNsaV95X2luZGV4LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2luY2xpX3R5cGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX3NjYW5fZWxfdGltZXN0YW1wLmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX3RpbWVzdGFtcF9pbmRleC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl90aW1lc3RhbXBfdHlwZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZGlzMTYyMDNfc2Nhbl9lbF9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZGlzMTYyMDNfc2Nhbl9lbF9hdHRycywKKwkubmFtZSA9ICJzY2FuX2VsZW1lbnRzIiwKK307CisKKy8qKgorICogYWRpczE2MjAzX3BvbGxfZnVuY190aCgpIHRvcCBoYWxmIGludGVycnVwdCBoYW5kbGVyIGNhbGxlZCBieSB0cmlnZ2VyCisgKiBAcHJpdmF0ZV9kYXRhOglpaW9fZGV2CisgKiovCitzdGF0aWMgdm9pZCBhZGlzMTYyMDNfcG9sbF9mdW5jX3RoKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIHM2NCB0aW1lc3RhbXApCit7CisJc3RydWN0IGFkaXMxNjIwM19zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJc3QtPmxhc3RfdGltZXN0YW1wID0gdGltZXN0YW1wOworCXNjaGVkdWxlX3dvcmsoJnN0LT53b3JrX3RyaWdnZXJfdG9fcmluZyk7Cit9CisKKy8qKgorICogYWRpczE2MjAzX3JlYWRfcmluZ19kYXRhKCkgcmVhZCBkYXRhIHJlZ2lzdGVycyB3aGljaCB3aWxsIGJlIHBsYWNlZCBpbnRvIHJpbmcKKyAqIEBkZXY6IGRldmljZSBhc3NvY2lhdGVkIHdpdGggY2hpbGQgb2YgYWN0dWFsIGRldmljZSAoaWlvX2RldiBvciBpaW9fdHJpZykKKyAqIEByeDogc29tZXdoZXJlIHRvIHBhc3MgYmFjayB0aGUgdmFsdWUgcmVhZAorICoqLworc3RhdGljIGludCBhZGlzMTYyMDNfcmVhZF9yaW5nX2RhdGEoc3RydWN0IGRldmljZSAqZGV2LCB1OCAqcngpCit7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkaXMxNjIwM19zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyc1tBRElTMTYyMDNfT1VUUFVUUyArIDFdOworCWludCByZXQ7CisJaW50IGk7CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKworCW1lbXNldCh4ZmVycywgMCwgc2l6ZW9mKHhmZXJzKSk7CisJZm9yIChpID0gMDsgaSA8PSBBRElTMTYyMDNfT1VUUFVUUzsgaSsrKSB7CisJCXhmZXJzW2ldLmJpdHNfcGVyX3dvcmQgPSA4OworCQl4ZmVyc1tpXS5jc19jaGFuZ2UgPSAxOworCQl4ZmVyc1tpXS5sZW4gPSAyOworCQl4ZmVyc1tpXS5kZWxheV91c2VjcyA9IDIwOworCQl4ZmVyc1tpXS50eF9idWYgPSBzdC0+dHggKyAyICogaTsKKwkJaWYgKGkgPCAxKSAvKiBTVVBQTFlfT1VUOiAweDAyLCBBVVhfQURDOiAweDA4ICovCisJCQlzdC0+dHhbMiAqIGldID0gQURJUzE2MjAzX1JFQURfUkVHKEFESVMxNjIwM19TVVBQTFlfT1VUICsgMiAqIGkpOworCQllbHNlCisJCQlzdC0+dHhbMiAqIGldID0gQURJUzE2MjAzX1JFQURfUkVHKEFESVMxNjIwM19TVVBQTFlfT1VUICsgMiAqIGkgKyA2KTsKKwkJc3QtPnR4WzIgKiBpICsgMV0gPSAwOworCQlpZiAoaSA+PSAxKQorCQkJeGZlcnNbaV0ucnhfYnVmID0gcnggKyAyICogKGkgLSAxKTsKKwkJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXJzW2ldLCAmbXNnKTsKKwl9CisKKwlyZXQgPSBzcGlfc3luYyhzdC0+dXMsICZtc2cpOworCWlmIChyZXQpCisJCWRldl9lcnIoJnN0LT51cy0+ZGV2LCAicHJvYmxlbSB3aGVuIGJ1cnN0IHJlYWRpbmciKTsKKworCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIFdoaWxzdCB0aGlzIG1ha2VzIGEgbG90IG9mIGNhbGxzIHRvIGlpb19zd19yaW5nIGZ1bmN0aW9ucyAtIGl0IGlzIHRvIGRldmljZQorICogc3BlY2lmaWMgdG8gYmUgcm9sbGVkIGludG8gdGhlIGNvcmUuCisgKi8KK3N0YXRpYyB2b2lkIGFkaXMxNjIwM190cmlnZ2VyX2JoX3RvX3Jpbmcoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrX3MpCit7CisJc3RydWN0IGFkaXMxNjIwM19zdGF0ZSAqc3QKKwkJPSBjb250YWluZXJfb2Yod29ya19zLCBzdHJ1Y3QgYWRpczE2MjAzX3N0YXRlLAorCQkJICAgICAgIHdvcmtfdHJpZ2dlcl90b19yaW5nKTsKKwlzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nID0gc3QtPmluZGlvX2Rldi0+cmluZzsKKworCWludCBpID0gMDsKKwlzMTYgKmRhdGE7CisJc2l6ZV90IGRhdGFzaXplID0gcmluZy0+YWNjZXNzLmdldF9ieXRlc19wZXJfZGF0dW0ocmluZyk7CisKKwlkYXRhID0ga21hbGxvYyhkYXRhc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRhdGEgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZzdC0+dXMtPmRldiwgIm1lbW9yeSBhbGxvYyBmYWlsZWQgaW4gcmluZyBiaCIpOworCQlyZXR1cm47CisJfQorCisJaWYgKHJpbmctPnNjYW5fY291bnQpCisJCWlmIChhZGlzMTYyMDNfcmVhZF9yaW5nX2RhdGEoJnN0LT5pbmRpb19kZXYtPmRldiwgc3QtPnJ4KSA+PSAwKQorCQkJZm9yICg7IGkgPCByaW5nLT5zY2FuX2NvdW50OyBpKyspCisJCQkJZGF0YVtpXSA9IGJlMTZfdG9fY3B1cCgKKwkJCQkJKF9fYmUxNiAqKSYoc3QtPnJ4W2kqMl0pKTsKKworCS8qIEd1YXJhbnRlZWQgdG8gYmUgYWxpZ25lZCB3aXRoIDggYnl0ZSBib3VuZGFyeSAqLworCWlmIChyaW5nLT5zY2FuX3RpbWVzdGFtcCkKKwkJKigoczY0ICopKGRhdGEgKyAoKGkgKyAzKS80KSo0KSkgPSBzdC0+bGFzdF90aW1lc3RhbXA7CisKKwlyaW5nLT5hY2Nlc3Muc3RvcmVfdG8ocmluZywKKwkJCSAgICAgICh1OCAqKWRhdGEsCisJCQkgICAgICBzdC0+bGFzdF90aW1lc3RhbXApOworCisJaWlvX3RyaWdnZXJfbm90aWZ5X2RvbmUoc3QtPmluZGlvX2Rldi0+dHJpZyk7CisJa2ZyZWUoZGF0YSk7CisKKwlyZXR1cm47Cit9CisKK3ZvaWQgYWRpczE2MjAzX3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlrZnJlZShpbmRpb19kZXYtPnBvbGxmdW5jKTsKKwlpaW9fc3dfcmJfZnJlZShpbmRpb19kZXYtPnJpbmcpOworfQorCitpbnQgYWRpczE2MjAzX2NvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGFkaXMxNjIwM19zdGF0ZSAqc3QgPSBpbmRpb19kZXYtPmRldl9kYXRhOworCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmc7CisJSU5JVF9XT1JLKCZzdC0+d29ya190cmlnZ2VyX3RvX3JpbmcsIGFkaXMxNjIwM190cmlnZ2VyX2JoX3RvX3JpbmcpOworCisJcmluZyA9IGlpb19zd19yYl9hbGxvY2F0ZShpbmRpb19kZXYpOworCWlmICghcmluZykgeworCQlyZXQgPSAtRU5PTUVNOworCQlyZXR1cm4gcmV0OworCX0KKwlpbmRpb19kZXYtPnJpbmcgPSByaW5nOworCS8qIEVmZmVjdGl2ZWx5IHNlbGVjdCB0aGUgcmluZyBidWZmZXIgaW1wbGVtZW50YXRpb24gKi8KKwlpaW9fcmluZ19zd19yZWdpc3Rlcl9mdW5jcygmcmluZy0+YWNjZXNzKTsKKwlyaW5nLT5icGUgPSAyOworCXJpbmctPnNjYW5fZWxfYXR0cnMgPSAmYWRpczE2MjAzX3NjYW5fZWxfZ3JvdXA7CisJcmluZy0+c2Nhbl90aW1lc3RhbXAgPSB0cnVlOworCXJpbmctPnByZWVuYWJsZSA9ICZpaW9fc3dfcmluZ19wcmVlbmFibGU7CisJcmluZy0+cG9zdGVuYWJsZSA9ICZpaW9fdHJpZ2dlcmVkX3JpbmdfcG9zdGVuYWJsZTsKKwlyaW5nLT5wcmVkaXNhYmxlID0gJmlpb190cmlnZ2VyZWRfcmluZ19wcmVkaXNhYmxlOworCXJpbmctPm93bmVyID0gVEhJU19NT0RVTEU7CisKKwkvKiBTZXQgZGVmYXVsdCBzY2FuIG1vZGUgKi8KKwlpaW9fc2Nhbl9tYXNrX3NldChyaW5nLCBpaW9fc2Nhbl9lbF9pbl9zdXBwbHkubnVtYmVyKTsKKwlpaW9fc2Nhbl9tYXNrX3NldChyaW5nLCBpaW9fc2Nhbl9lbF90ZW1wLm51bWJlcik7CisJaWlvX3NjYW5fbWFza19zZXQocmluZywgaWlvX3NjYW5fZWxfaW4wLm51bWJlcik7CisJaWlvX3NjYW5fbWFza19zZXQocmluZywgaWlvX3NjYW5fZWxfaW5jbGlfeC5udW1iZXIpOworCWlpb19zY2FuX21hc2tfc2V0KHJpbmcsIGlpb19zY2FuX2VsX2luY2xpX3kubnVtYmVyKTsKKworCXJldCA9IGlpb19hbGxvY19wb2xsZnVuYyhpbmRpb19kZXYsIE5VTEwsICZhZGlzMTYyMDNfcG9sbF9mdW5jX3RoKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2lpb19zd19yYl9mcmVlOworCisJaW5kaW9fZGV2LT5tb2RlcyB8PSBJTkRJT19SSU5HX1RSSUdHRVJFRDsKKwlyZXR1cm4gMDsKKworZXJyb3JfaWlvX3N3X3JiX2ZyZWU6CisJaWlvX3N3X3JiX2ZyZWUoaW5kaW9fZGV2LT5yaW5nKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYWRpczE2MjAzX2luaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQoreworCXJldHVybiBpaW9fcmluZ19idWZmZXJfcmVnaXN0ZXIocmluZywgMCk7Cit9CisKK3ZvaWQgYWRpczE2MjAzX3VuaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpCit7CisJaWlvX3JpbmdfYnVmZmVyX3VucmVnaXN0ZXIocmluZyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwM190cmlnZ2VyLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwM190cmlnZ2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBiZTUxYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAzX3RyaWdnZXIuYwpAQCAtMCwwICsxLDEyMiBAQAorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKyNpbmNsdWRlICIuLi90cmlnZ2VyLmgiCisjaW5jbHVkZSAiYWRpczE2MjAzLmgiCisKKy8qKgorICogYWRpczE2MjAzX2RhdGFfcmR5X3RyaWdfcG9sbCgpIHRoZSBldmVudCBoYW5kbGVyIGZvciB0aGUgZGF0YSByZHkgdHJpZworICoqLworc3RhdGljIGludCBhZGlzMTYyMDNfZGF0YV9yZHlfdHJpZ19wb2xsKHN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbywKKwkJCQkgICAgICAgaW50IGluZGV4LAorCQkJCSAgICAgICBzNjQgdGltZXN0YW1wLAorCQkJCSAgICAgICBpbnQgbm9fdGVzdCkKK3sKKwlzdHJ1Y3QgYWRpczE2MjAzX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoZGV2X2luZm8pOworCXN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZyA9IHN0LT50cmlnOworCisJaWlvX3RyaWdnZXJfcG9sbCh0cmlnLCB0aW1lc3RhbXApOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitJSU9fRVZFTlRfU0goZGF0YV9yZHlfdHJpZywgJmFkaXMxNjIwM19kYXRhX3JkeV90cmlnX3BvbGwpOworCitzdGF0aWMgREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgaWlvX3RyaWdnZXJfcmVhZF9uYW1lLCBOVUxMKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkaXMxNjIwM190cmlnZ2VyX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX25hbWUuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWRpczE2MjAzX3RyaWdnZXJfYXR0cl9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZGlzMTYyMDNfdHJpZ2dlcl9hdHRycywKK307CisKKy8qKgorICogYWRpczE2MjAzX2RhdGFfcmR5X3RyaWdnZXJfc2V0X3N0YXRlKCkgc2V0IGRhdGFyZHkgaW50ZXJydXB0IHN0YXRlCisgKiovCitzdGF0aWMgaW50IGFkaXMxNjIwM19kYXRhX3JkeV90cmlnZ2VyX3NldF9zdGF0ZShzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWcsCisJCQkJCQlib29sIHN0YXRlKQoreworCXN0cnVjdCBhZGlzMTYyMDNfc3RhdGUgKnN0ID0gdHJpZy0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBzdC0+aW5kaW9fZGV2OworCWludCByZXQgPSAwOworCisJZGV2X2RiZygmaW5kaW9fZGV2LT5kZXYsICIlcyAoJWQpXG4iLCBfX2Z1bmNfXywgc3RhdGUpOworCXJldCA9IGFkaXMxNjIwM19zZXRfaXJxKCZzdC0+aW5kaW9fZGV2LT5kZXYsIHN0YXRlKTsKKwlpZiAoc3RhdGUgPT0gZmFsc2UpIHsKKwkJaWlvX3JlbW92ZV9ldmVudF9mcm9tX2xpc3QoJmlpb19ldmVudF9kYXRhX3JkeV90cmlnLAorCQkJCQkgICAmaW5kaW9fZGV2LT5pbnRlcnJ1cHRzWzBdCisJCQkJCSAgIC0+ZXZfbGlzdCk7CisJCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJfSBlbHNlIHsKKwkJaWlvX2FkZF9ldmVudF90b19saXN0KCZpaW9fZXZlbnRfZGF0YV9yZHlfdHJpZywKKwkJCQkgICAgICAmaW5kaW9fZGV2LT5pbnRlcnJ1cHRzWzBdLT5ldl9saXN0KTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBhZGlzMTYyMDNfdHJpZ190cnlfcmVlbigpIHRyeSByZW5hYmxpbmcgaXJxIGZvciBkYXRhIHJkeSB0cmlnZ2VyCisgKiBAdHJpZzoJdGhlIGRhdGFyZHkgdHJpZ2dlcgorICoqLworc3RhdGljIGludCBhZGlzMTYyMDNfdHJpZ190cnlfcmVlbihzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWcpCit7CisJc3RydWN0IGFkaXMxNjIwM19zdGF0ZSAqc3QgPSB0cmlnLT5wcml2YXRlX2RhdGE7CisJZW5hYmxlX2lycShzdC0+dXMtPmlycSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBhZGlzMTYyMDNfcHJvYmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCWludCByZXQ7CisJc3RydWN0IGFkaXMxNjIwM19zdGF0ZSAqc3QgPSBpbmRpb19kZXYtPmRldl9kYXRhOworCisJc3QtPnRyaWcgPSBpaW9fYWxsb2NhdGVfdHJpZ2dlcigpOworCXN0LT50cmlnLT5uYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsCisJCQkJImFkaXMxNjIwMy1kZXYlZCIsCisJCQkJaW5kaW9fZGV2LT5pZCk7CisJaWYgKCFzdC0+dHJpZy0+bmFtZSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfdHJpZzsKKwl9CisJc3QtPnRyaWctPmRldi5wYXJlbnQgPSAmc3QtPnVzLT5kZXY7CisJc3QtPnRyaWctPm93bmVyID0gVEhJU19NT0RVTEU7CisJc3QtPnRyaWctPnByaXZhdGVfZGF0YSA9IHN0OworCXN0LT50cmlnLT5zZXRfdHJpZ2dlcl9zdGF0ZSA9ICZhZGlzMTYyMDNfZGF0YV9yZHlfdHJpZ2dlcl9zZXRfc3RhdGU7CisJc3QtPnRyaWctPnRyeV9yZWVuYWJsZSA9ICZhZGlzMTYyMDNfdHJpZ190cnlfcmVlbjsKKwlzdC0+dHJpZy0+Y29udHJvbF9hdHRycyA9ICZhZGlzMTYyMDNfdHJpZ2dlcl9hdHRyX2dyb3VwOworCXJldCA9IGlpb190cmlnZ2VyX3JlZ2lzdGVyKHN0LT50cmlnKTsKKworCS8qIHNlbGVjdCBkZWZhdWx0IHRyaWdnZXIgKi8KKwlpbmRpb19kZXYtPnRyaWcgPSBzdC0+dHJpZzsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfdHJpZ19uYW1lOworCisJcmV0dXJuIDA7CisKK2Vycm9yX2ZyZWVfdHJpZ19uYW1lOgorCWtmcmVlKHN0LT50cmlnLT5uYW1lKTsKK2Vycm9yX2ZyZWVfdHJpZzoKKwlpaW9fZnJlZV90cmlnZ2VyKHN0LT50cmlnKTsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgYWRpczE2MjAzX3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJc3RydWN0IGFkaXMxNjIwM19zdGF0ZSAqc3RhdGUgPSBpbmRpb19kZXYtPmRldl9kYXRhOworCisJaWlvX3RyaWdnZXJfdW5yZWdpc3RlcihzdGF0ZS0+dHJpZyk7CisJa2ZyZWUoc3RhdGUtPnRyaWctPm5hbWUpOworCWlpb19mcmVlX3RyaWdnZXIoc3RhdGUtPnRyaWcpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDQuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTllZDdjYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA0LmgKQEAgLTAsMCArMSwxNTEgQEAKKyNpZm5kZWYgU1BJX0FESVMxNjIwNF9IXworI2RlZmluZSBTUElfQURJUzE2MjA0X0hfCisKKyNkZWZpbmUgQURJUzE2MjA0X1NUQVJUVVBfREVMQVkJMjIwIC8qIG1zICovCisKKyNkZWZpbmUgQURJUzE2MjA0X1JFQURfUkVHKGEpICAgIGEKKyNkZWZpbmUgQURJUzE2MjA0X1dSSVRFX1JFRyhhKSAoKGEpIHwgMHg4MCkKKworI2RlZmluZSBBRElTMTYyMDRfRkxBU0hfQ05UICAgICAgMHgwMCAvKiBGbGFzaCBtZW1vcnkgd3JpdGUgY291bnQgKi8KKyNkZWZpbmUgQURJUzE2MjA0X1NVUFBMWV9PVVQgICAgIDB4MDIgLyogT3V0cHV0LCBwb3dlciBzdXBwbHkgKi8KKyNkZWZpbmUgQURJUzE2MjA0X1hBQ0NMX09VVCAgICAgIDB4MDQgLyogT3V0cHV0LCB4LWF4aXMgYWNjZWxlcm9tZXRlciAqLworI2RlZmluZSBBRElTMTYyMDRfWUFDQ0xfT1VUICAgICAgMHgwNiAvKiBPdXRwdXQsIHktYXhpcyBhY2NlbGVyb21ldGVyICovCisjZGVmaW5lIEFESVMxNjIwNF9BVVhfQURDICAgICAgICAweDA4IC8qIE91dHB1dCwgYXV4aWxpYXJ5IEFEQyBpbnB1dCAqLworI2RlZmluZSBBRElTMTYyMDRfVEVNUF9PVVQgICAgICAgMHgwQSAvKiBPdXRwdXQsIHRlbXBlcmF0dXJlICovCisjZGVmaW5lIEFESVMxNjIwNF9YX1BFQUtfT1VUICAgICAweDBDIC8qIFR3b3MgY29tcGxlbWVudCAqLworI2RlZmluZSBBRElTMTYyMDRfWV9QRUFLX09VVCAgICAgMHgwRSAvKiBUd29zIGNvbXBsZW1lbnQgKi8KKyNkZWZpbmUgQURJUzE2MjA0X1hBQ0NMX05VTEwgICAgIDB4MTAgLyogQ2FsaWJyYXRpb24sIHgtYXhpcyBhY2NlbGVyYXRpb24gb2Zmc2V0IG51bGwgKi8KKyNkZWZpbmUgQURJUzE2MjA0X1lBQ0NMX05VTEwgICAgIDB4MTIgLyogQ2FsaWJyYXRpb24sIHktYXhpcyBhY2NlbGVyYXRpb24gb2Zmc2V0IG51bGwgKi8KKyNkZWZpbmUgQURJUzE2MjA0X1hBQ0NMX1NDQUxFICAgIDB4MTQgLyogWC1heGlzIHNjYWxlIGZhY3RvciBjYWxpYnJhdGlvbiByZWdpc3RlciAqLworI2RlZmluZSBBRElTMTYyMDRfWUFDQ0xfU0NBTEUgICAgMHgxNiAvKiBZLWF4aXMgc2NhbGUgZmFjdG9yIGNhbGlicmF0aW9uIHJlZ2lzdGVyICovCisjZGVmaW5lIEFESVMxNjIwNF9YWV9SU1NfT1VUICAgICAweDE4IC8qIFhZIGNvbWJpbmVkIGFjY2VsZXJhdGlvbiAoUlNTKSAqLworI2RlZmluZSBBRElTMTYyMDRfWFlfUEVBS19PVVQgICAgMHgxQSAvKiBQZWFrLCBYWSBjb21iaW5lZCBvdXRwdXQgKFJTUykgKi8KKyNkZWZpbmUgQURJUzE2MjA0X0NBUF9CVUZfMSAgICAgIDB4MUMgLyogQ2FwdHVyZSBidWZmZXIgb3V0cHV0IHJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgQURJUzE2MjA0X0NBUF9CVUZfMiAgICAgIDB4MUUgLyogQ2FwdHVyZSBidWZmZXIgb3V0cHV0IHJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUgQURJUzE2MjA0X0FMTV9NQUcxICAgICAgIDB4MjAgLyogQWxhcm0gMSBhbXBsaXR1ZGUgdGhyZXNob2xkICovCisjZGVmaW5lIEFESVMxNjIwNF9BTE1fTUFHMiAgICAgICAweDIyIC8qIEFsYXJtIDIgYW1wbGl0dWRlIHRocmVzaG9sZCAqLworI2RlZmluZSBBRElTMTYyMDRfQUxNX0NUUkwgICAgICAgMHgyOCAvKiBBbGFybSBjb250cm9sICovCisjZGVmaW5lIEFESVMxNjIwNF9DQVBUX1BOVFIgICAgICAweDJBIC8qIENhcHR1cmUgcmVnaXN0ZXIgYWRkcmVzcyBwb2ludGVyICovCisjZGVmaW5lIEFESVMxNjIwNF9BVVhfREFDICAgICAgICAweDMwIC8qIEF1eGlsaWFyeSBEQUMgZGF0YSAqLworI2RlZmluZSBBRElTMTYyMDRfR1BJT19DVFJMICAgICAgMHgzMiAvKiBHZW5lcmFsLXB1cnBvc2UgZGlnaXRhbCBpbnB1dC9vdXRwdXQgY29udHJvbCAqLworI2RlZmluZSBBRElTMTYyMDRfTVNDX0NUUkwgICAgICAgMHgzNCAvKiBNaXNjZWxsYW5lb3VzIGNvbnRyb2wgKi8KKyNkZWZpbmUgQURJUzE2MjA0X1NNUExfUFJEICAgICAgIDB4MzYgLyogSW50ZXJuYWwgc2FtcGxlIHBlcmlvZCAocmF0ZSkgY29udHJvbCAqLworI2RlZmluZSBBRElTMTYyMDRfQVZHX0NOVCAgICAgICAgMHgzOCAvKiBPcGVyYXRpb24sIGZpbHRlciBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIEFESVMxNjIwNF9TTFBfQ05UICAgICAgICAweDNBIC8qIE9wZXJhdGlvbiwgc2xlZXAgbW9kZSBjb250cm9sICovCisjZGVmaW5lIEFESVMxNjIwNF9ESUFHX1NUQVQgICAgICAweDNDIC8qIERpYWdub3N0aWNzLCBzeXN0ZW0gc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIEFESVMxNjIwNF9HTE9CX0NNRCAgICAgICAweDNFIC8qIE9wZXJhdGlvbiwgc3lzdGVtIGNvbW1hbmQgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBBRElTMTYyMDRfT1VUUFVUUyAgICAgICAgNQorCisvKiBNU0NfQ1RSTCAqLworI2RlZmluZSBBRElTMTYyMDRfTVNDX0NUUkxfUFdSVVBfU0VMRl9URVNUCSgxIDw8IDEwKSAvKiBTZWxmLXRlc3QgYXQgcG93ZXItb246IDEgPSBkaXNhYmxlZCwgMCA9IGVuYWJsZWQgKi8KKyNkZWZpbmUgQURJUzE2MjA0X01TQ19DVFJMX1NFTEZfVEVTVF9FTgkgICAgICAgICgxIDw8IDgpICAvKiBTZWxmLXRlc3QgZW5hYmxlICovCisjZGVmaW5lIEFESVMxNjIwNF9NU0NfQ1RSTF9EQVRBX1JEWV9FTgkgICAgICAgICgxIDw8IDIpICAvKiBEYXRhLXJlYWR5IGVuYWJsZTogMSA9IGVuYWJsZWQsIDAgPSBkaXNhYmxlZCAqLworI2RlZmluZSBBRElTMTYyMDRfTVNDX0NUUkxfQUNUSVZFX0hJR0gJICAgICAgICAoMSA8PCAxKSAgLyogRGF0YS1yZWFkeSBwb2xhcml0eTogMSA9IGFjdGl2ZSBoaWdoLCAwID0gYWN0aXZlIGxvdyAqLworI2RlZmluZSBBRElTMTYyMDRfTVNDX0NUUkxfREFUQV9SRFlfRElPMgkoMSA8PCAwKSAgLyogRGF0YS1yZWFkeSBsaW5lIHNlbGVjdGlvbjogMSA9IERJTzIsIDAgPSBESU8xICovCisKKy8qIERJQUdfU1RBVCAqLworI2RlZmluZSBBRElTMTYyMDRfRElBR19TVEFUX0FMQVJNMiAgICAgICAgKDE8PDkpIC8qIEFsYXJtIDIgc3RhdHVzOiAxID0gYWxhcm0gYWN0aXZlLCAwID0gYWxhcm0gaW5hY3RpdmUgKi8KKyNkZWZpbmUgQURJUzE2MjA0X0RJQUdfU1RBVF9BTEFSTTEgICAgICAgICgxPDw4KSAvKiBBbGFybSAxIHN0YXR1czogMSA9IGFsYXJtIGFjdGl2ZSwgMCA9IGFsYXJtIGluYWN0aXZlICovCisjZGVmaW5lIEFESVMxNjIwNF9ESUFHX1NUQVRfU0VMRlRFU1RfRkFJTCAoMTw8NSkgLyogU2VsZi10ZXN0IGRpYWdub3N0aWMgZXJyb3IgZmxhZzogMSA9IGVycm9yIGNvbmRpdGlvbiwKKwkJCQkJCTAgPSBub3JtYWwgb3BlcmF0aW9uICovCisjZGVmaW5lIEFESVMxNjIwNF9ESUFHX1NUQVRfU1BJX0ZBSUwJICAoMTw8MykgLyogU1BJIGNvbW11bmljYXRpb25zIGZhaWx1cmUgKi8KKyNkZWZpbmUgQURJUzE2MjA0X0RJQUdfU1RBVF9GTEFTSF9VUFQJICAoMTw8MikgLyogRmxhc2ggdXBkYXRlIGZhaWx1cmUgKi8KKyNkZWZpbmUgQURJUzE2MjA0X0RJQUdfU1RBVF9QT1dFUl9ISUdICSAgKDE8PDEpIC8qIFBvd2VyIHN1cHBseSBhYm92ZSAzLjYyNSBWICovCisjZGVmaW5lIEFESVMxNjIwNF9ESUFHX1NUQVRfUE9XRVJfTE9XCSAgKDE8PDApIC8qIFBvd2VyIHN1cHBseSBiZWxvdyAyLjk3NSBWICovCisKKy8qIEdMT0JfQ01EICovCisjZGVmaW5lIEFESVMxNjIwNF9HTE9CX0NNRF9TV19SRVNFVAkoMTw8NykKKyNkZWZpbmUgQURJUzE2MjA0X0dMT0JfQ01EX0NMRUFSX1NUQVQJKDE8PDQpCisjZGVmaW5lIEFESVMxNjIwNF9HTE9CX0NNRF9GQUNUT1JZX0NBTAkoMTw8MSkKKworI2RlZmluZSBBRElTMTYyMDRfTUFYX1RYIDI0CisjZGVmaW5lIEFESVMxNjIwNF9NQVhfUlggMjQKKworI2RlZmluZSBBRElTMTYyMDRfRVJST1JfQUNUSVZFICAgICAgICAgICgxPDwxNCkKKworLyoqCisgKiBzdHJ1Y3QgYWRpczE2MjA0X3N0YXRlIC0gZGV2aWNlIGluc3RhbmNlIHNwZWNpZmljIGRhdGEKKyAqIEB1czoJCQlhY3R1YWwgc3BpX2RldmljZQorICogQHdvcmtfdHJpZ2dlcl90b19yaW5nOiBiaCBmb3IgdHJpZ2dlcmVkIGV2ZW50IGhhbmRsaW5nCisgKiBAaW50ZXI6CQl1c2VkIHRvIGNoZWNrIGlmIG5ldyBpbnRlcnJ1cHQgaGFzIGJlZW4gdHJpZ2dlcmVkCisgKiBAbGFzdF90aW1lc3RhbXA6CXBhc3NpbmcgdGltZXN0YW1wIGZyb20gdGggdG8gYmggb2YgaW50ZXJydXB0IGhhbmRsZXIKKyAqIEBpbmRpb19kZXY6CQlpbmR1c3RyaWFsIEkvTyBkZXZpY2Ugc3RydWN0dXJlCisgKiBAdHJpZzoJCWRhdGEgcmVhZHkgdHJpZ2dlciByZWdpc3RlcmVkIHdpdGggaWlvCisgKiBAdHg6CQkJdHJhbnNtaXQgYnVmZmVyCisgKiBAcng6CQkJcmVjaWV2ZSBidWZmZXIKKyAqIEBidWZfbG9jazoJCW11dGV4IHRvIHByb3RlY3QgdHggYW5kIHJ4CisgKiovCitzdHJ1Y3QgYWRpczE2MjA0X3N0YXRlIHsKKwlzdHJ1Y3Qgc3BpX2RldmljZQkJKnVzOworCXN0cnVjdCB3b3JrX3N0cnVjdAkJd29ya190cmlnZ2VyX3RvX3Jpbmc7CisJczY0CQkJCWxhc3RfdGltZXN0YW1wOworCXN0cnVjdCBpaW9fZGV2CQkJKmluZGlvX2RldjsKKwlzdHJ1Y3QgaWlvX3RyaWdnZXIJCSp0cmlnOworCXU4CQkJCSp0eDsKKwl1OAkJCQkqcng7CisJc3RydWN0IG11dGV4CQkJYnVmX2xvY2s7Cit9OworCitpbnQgYWRpczE2MjA0X3NldF9pcnEoc3RydWN0IGRldmljZSAqZGV2LCBib29sIGVuYWJsZSk7CisKKyNpZmRlZiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSCitlbnVtIGFkaXMxNjIwNF9zY2FuIHsKKwlBRElTMTYyMDRfU0NBTl9TVVBQTFksCisJQURJUzE2MjA0X1NDQU5fQUNDX1gsCisJQURJUzE2MjA0X1NDQU5fQUNDX1ksCisJQURJUzE2MjA0X1NDQU5fQVVYX0FEQywKKwlBRElTMTYyMDRfU0NBTl9URU1QLAorfTsKKwordm9pZCBhZGlzMTYyMDRfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CitpbnQgYWRpczE2MjA0X3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKK3NzaXplX3QgYWRpczE2MjA0X3JlYWRfZGF0YV9mcm9tX3Jpbmcoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgIGNoYXIgKmJ1Zik7CisKK2ludCBhZGlzMTYyMDRfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7Cit2b2lkIGFkaXMxNjIwNF91bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOworCitpbnQgYWRpczE2MjA0X2luaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKTsKK3ZvaWQgYWRpczE2MjA0X3VuaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpOworI2Vsc2UgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgYWRpczE2MjA0X3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFkaXMxNjIwNF9wcm9iZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdAorYWRpczE2MjA0X3JlYWRfZGF0YV9mcm9tX3Jpbmcoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICBjaGFyICpidWYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRpczE2MjA0X2NvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGlzMTYyMDRfdW5jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworfQorCitzdGF0aWMgaW5saW5lIGludCBhZGlzMTYyMDRfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGlzMTYyMDRfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKK3sKK30KKworI2VuZGlmIC8qIENPTkZJR19JSU9fUklOR19CVUZGRVIgKi8KKyNlbmRpZiAvKiBTUElfQURJUzE2MjA0X0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwNF9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwNF9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MxNWU0MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA0X2NvcmUuYwpAQCAtMCwwICsxLDYxMyBAQAorLyoKKyAqIEFESVMxNjIwNCBQcm9ncmFtbWFibGUgSGlnaC1nIERpZ2l0YWwgSW1wYWN0IFNlbnNvciBhbmQgUmVjb3JkZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorI2luY2x1ZGUgImFjY2VsLmgiCisjaW5jbHVkZSAiLi4vZ3lyby9neXJvLmgiCisjaW5jbHVkZSAiLi4vYWRjL2FkYy5oIgorCisjaW5jbHVkZSAiYWRpczE2MjA0LmgiCisKKyNkZWZpbmUgRFJJVkVSX05BTUUJCSJhZGlzMTYyMDQiCisKK3N0YXRpYyBpbnQgYWRpczE2MjA0X2NoZWNrX3N0YXR1cyhzdHJ1Y3QgZGV2aWNlICpkZXYpOworCisvKioKKyAqIGFkaXMxNjIwNF9zcGlfd3JpdGVfcmVnXzgoKSAtIHdyaXRlIHNpbmdsZSBieXRlIHRvIGEgcmVnaXN0ZXIKKyAqIEBkZXY6IGRldmljZSBhc3NvY2lhdGVkIHdpdGggY2hpbGQgb2YgYWN0dWFsIGRldmljZSAoaWlvX2RldiBvciBpaW9fdHJpZykKKyAqIEByZWdfYWRkcmVzczogdGhlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAqIEB2YWw6IHRoZSB2YWx1ZSB0byB3cml0ZQorICoqLworc3RhdGljIGludCBhZGlzMTYyMDRfc3BpX3dyaXRlX3JlZ184KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTggcmVnX2FkZHJlc3MsCisJCXU4IHZhbCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRpczE2MjA0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURJUzE2MjA0X1dSSVRFX1JFRyhyZWdfYWRkcmVzcyk7CisJc3QtPnR4WzFdID0gdmFsOworCisJcmV0ID0gc3BpX3dyaXRlKHN0LT51cywgc3QtPnR4LCAyKTsKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGFkaXMxNjIwNF9zcGlfd3JpdGVfcmVnXzE2KCkgLSB3cml0ZSAyIGJ5dGVzIHRvIGEgcGFpciBvZiByZWdpc3RlcnMKKyAqIEBkZXY6IGRldmljZSBhc3NvY2lhdGVkIHdpdGggY2hpbGQgb2YgYWN0dWFsIGRldmljZSAoaWlvX2RldiBvciBpaW9fdHJpZykKKyAqIEByZWdfYWRkcmVzczogdGhlIGFkZHJlc3Mgb2YgdGhlIGxvd2VyIG9mIHRoZSB0d28gcmVnaXN0ZXJzLiBTZWNvbmQgcmVnaXN0ZXIKKyAqICAgICAgICAgICAgICAgaXMgYXNzdW1lZCB0byBoYXZlIGFkZHJlc3Mgb25lIGdyZWF0ZXIuCisgKiBAdmFsOiB2YWx1ZSB0byBiZSB3cml0dGVuCisgKiovCitzdGF0aWMgaW50IGFkaXMxNjIwNF9zcGlfd3JpdGVfcmVnXzE2KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTggbG93ZXJfcmVnX2FkZHJlc3MsCisJCXUxNiB2YWx1ZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGlzMTYyMDRfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbXSA9IHsKKwkJeworCQkJLnR4X2J1ZiA9IHN0LT50eCwKKwkJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJCS5sZW4gPSAyLAorCQkJLmNzX2NoYW5nZSA9IDEsCisJCX0sIHsKKwkJCS50eF9idWYgPSBzdC0+dHggKyAyLAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDIsCisJCQkuY3NfY2hhbmdlID0gMSwKKwkJfSwKKwl9OworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSBBRElTMTYyMDRfV1JJVEVfUkVHKGxvd2VyX3JlZ19hZGRyZXNzKTsKKwlzdC0+dHhbMV0gPSB2YWx1ZSAmIDB4RkY7CisJc3QtPnR4WzJdID0gQURJUzE2MjA0X1dSSVRFX1JFRyhsb3dlcl9yZWdfYWRkcmVzcyArIDEpOworCXN0LT50eFszXSA9ICh2YWx1ZSA+PiA4KSAmIDB4RkY7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyc1swXSwgJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXJzWzFdLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+dXMsICZtc2cpOworCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogYWRpczE2MjA0X3NwaV9yZWFkX3JlZ18xNigpIC0gcmVhZCAyIGJ5dGVzIGZyb20gYSAxNi1iaXQgcmVnaXN0ZXIKKyAqIEBkZXY6IGRldmljZSBhc3NvY2lhdGVkIHdpdGggY2hpbGQgb2YgYWN0dWFsIGRldmljZSAoaWlvX2RldiBvciBpaW9fdHJpZykKKyAqIEByZWdfYWRkcmVzczogdGhlIGFkZHJlc3Mgb2YgdGhlIGxvd2VyIG9mIHRoZSB0d28gcmVnaXN0ZXJzLiBTZWNvbmQgcmVnaXN0ZXIKKyAqICAgICAgICAgICAgICAgaXMgYXNzdW1lZCB0byBoYXZlIGFkZHJlc3Mgb25lIGdyZWF0ZXIuCisgKiBAdmFsOiBzb21ld2hlcmUgdG8gcGFzcyBiYWNrIHRoZSB2YWx1ZSByZWFkCisgKiovCitzdGF0aWMgaW50IGFkaXMxNjIwNF9zcGlfcmVhZF9yZWdfMTYoc3RydWN0IGRldmljZSAqZGV2LAorCQl1OCBsb3dlcl9yZWdfYWRkcmVzcywKKwkJdTE2ICp2YWwpCit7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkaXMxNjIwNF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gMiwKKwkJCS5jc19jaGFuZ2UgPSAxLAorCQkJLmRlbGF5X3VzZWNzID0gMjAsCisJCX0sIHsKKwkJCS5yeF9idWYgPSBzdC0+cngsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gMiwKKwkJCS5jc19jaGFuZ2UgPSAxLAorCQkJLmRlbGF5X3VzZWNzID0gMjAsCisJCX0sCisJfTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURJUzE2MjA0X1JFQURfUkVHKGxvd2VyX3JlZ19hZGRyZXNzKTsKKwlzdC0+dHhbMV0gPSAwOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcnNbMF0sICZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyc1sxXSwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnVzLCAmbXNnKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnN0LT51cy0+ZGV2LCAicHJvYmxlbSB3aGVuIHJlYWRpbmcgMTYgYml0IHJlZ2lzdGVyIDB4JTAyWCIsCisJCQkJbG93ZXJfcmVnX2FkZHJlc3MpOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJKnZhbCA9IChzdC0+cnhbMF0gPDwgOCkgfCBzdC0+cnhbMV07CisKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWRpczE2MjA0X3JlYWRfMTJiaXRfdW5zaWduZWQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCWludCByZXQ7CisJdTE2IHZhbCA9IDA7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCisJcmV0ID0gYWRpczE2MjA0X3NwaV9yZWFkX3JlZ18xNihkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmICh2YWwgJiBBRElTMTYyMDRfRVJST1JfQUNUSVZFKQorCQlhZGlzMTYyMDRfY2hlY2tfc3RhdHVzKGRldik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgdmFsICYgMHgwRkZGKTsKK30KKworc3RhdGljIHNzaXplX3QgYWRpczE2MjA0X3JlYWRfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXNzaXplX3QgcmV0OworCXUxNiB2YWw7CisKKwkvKiBUYWtlIHRoZSBpaW9fZGV2IHN0YXR1cyBsb2NrICovCisJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisKKwlyZXQgPSBhZGlzMTYyMDRfc3BpX3JlYWRfcmVnXzE2KGRldiwgQURJUzE2MjA0X1RFTVBfT1VULCAodTE2ICopJnZhbCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwlpZiAodmFsICYgQURJUzE2MjA0X0VSUk9SX0FDVElWRSkKKwkJYWRpczE2MjA0X2NoZWNrX3N0YXR1cyhkZXYpOworCisJdmFsICY9IDB4RkZGOworCXJldCA9IHNwcmludGYoYnVmLCAiJWRcbiIsIHZhbCk7CisKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkaXMxNjIwNF9yZWFkXzEyYml0X3NpZ25lZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKwlzMTYgdmFsID0gMDsKKwlzc2l6ZV90IHJldDsKKworCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0ID0gYWRpczE2MjA0X3NwaV9yZWFkX3JlZ18xNihkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgKHUxNiAqKSZ2YWwpOworCWlmICghcmV0KSB7CisJCWlmICh2YWwgJiBBRElTMTYyMDRfRVJST1JfQUNUSVZFKQorCQkJYWRpczE2MjA0X2NoZWNrX3N0YXR1cyhkZXYpOworCisJCXZhbCA9ICgoczE2KSh2YWwgPDwgNCkgPj4gNCk7CisJCXJldCA9IHNwcmludGYoYnVmLCAiJWRcbiIsIHZhbCk7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkaXMxNjIwNF9yZWFkXzE0Yml0X3NpZ25lZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKwlzMTYgdmFsID0gMDsKKwlzc2l6ZV90IHJldDsKKworCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0ID0gYWRpczE2MjA0X3NwaV9yZWFkX3JlZ18xNihkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgKHUxNiAqKSZ2YWwpOworCWlmICghcmV0KSB7CisJCWlmICh2YWwgJiBBRElTMTYyMDRfRVJST1JfQUNUSVZFKQorCQkJYWRpczE2MjA0X2NoZWNrX3N0YXR1cyhkZXYpOworCisJCXZhbCA9ICgoczE2KSh2YWwgPDwgMikgPj4gMik7CisJCXJldCA9IHNwcmludGYoYnVmLCAiJWRcbiIsIHZhbCk7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkaXMxNjIwNF93cml0ZV8xNmJpdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCWludCByZXQ7CisJbG9uZyB2YWw7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCXJldCA9IGFkaXMxNjIwNF9zcGlfd3JpdGVfcmVnXzE2KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCB2YWwpOworCitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworc3RhdGljIGludCBhZGlzMTYyMDRfcmVzZXQoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCByZXQ7CisJcmV0ID0gYWRpczE2MjA0X3NwaV93cml0ZV9yZWdfOChkZXYsCisJCQlBRElTMTYyMDRfR0xPQl9DTUQsCisJCQlBRElTMTYyMDRfR0xPQl9DTURfU1dfUkVTRVQpOworCWlmIChyZXQpCisJCWRldl9lcnIoZGV2LCAicHJvYmxlbSByZXNldHRpbmcgZGV2aWNlIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZGlzMTYyMDRfd3JpdGVfcmVzZXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCWlmIChsZW4gPCAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzd2l0Y2ggKGJ1ZlswXSkgeworCWNhc2UgJzEnOgorCWNhc2UgJ3knOgorCWNhc2UgJ1knOgorCQlyZXR1cm4gYWRpczE2MjA0X3Jlc2V0KGRldik7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitpbnQgYWRpczE2MjA0X3NldF9pcnEoc3RydWN0IGRldmljZSAqZGV2LCBib29sIGVuYWJsZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwl1MTYgbXNjOworCisJcmV0ID0gYWRpczE2MjA0X3NwaV9yZWFkX3JlZ18xNihkZXYsIEFESVMxNjIwNF9NU0NfQ1RSTCwgJm1zYyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwltc2MgfD0gQURJUzE2MjA0X01TQ19DVFJMX0FDVElWRV9ISUdIOworCW1zYyAmPSB+QURJUzE2MjA0X01TQ19DVFJMX0RBVEFfUkRZX0RJTzI7CisJaWYgKGVuYWJsZSkKKwkJbXNjIHw9IEFESVMxNjIwNF9NU0NfQ1RSTF9EQVRBX1JEWV9FTjsKKwllbHNlCisJCW1zYyAmPSB+QURJUzE2MjA0X01TQ19DVFJMX0RBVEFfUkRZX0VOOworCisJcmV0ID0gYWRpczE2MjA0X3NwaV93cml0ZV9yZWdfMTYoZGV2LCBBRElTMTYyMDRfTVNDX0NUUkwsIG1zYyk7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkaXMxNjIwNF9jaGVja19zdGF0dXMoc3RydWN0IGRldmljZSAqZGV2KQoreworCXUxNiBzdGF0dXM7CisJaW50IHJldDsKKworCXJldCA9IGFkaXMxNjIwNF9zcGlfcmVhZF9yZWdfMTYoZGV2LCBBRElTMTYyMDRfRElBR19TVEFULCAmc3RhdHVzKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIlJlYWRpbmcgc3RhdHVzIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwlyZXQgPSBzdGF0dXMgJiAweDFGOworCisJaWYgKHN0YXR1cyAmIEFESVMxNjIwNF9ESUFHX1NUQVRfU0VMRlRFU1RfRkFJTCkKKwkJZGV2X2VycihkZXYsICJTZWxmIHRlc3QgZmFpbHVyZVxuIik7CisJaWYgKHN0YXR1cyAmIEFESVMxNjIwNF9ESUFHX1NUQVRfU1BJX0ZBSUwpCisJCWRldl9lcnIoZGV2LCAiU1BJIGZhaWx1cmVcbiIpOworCWlmIChzdGF0dXMgJiBBRElTMTYyMDRfRElBR19TVEFUX0ZMQVNIX1VQVCkKKwkJZGV2X2VycihkZXYsICJGbGFzaCB1cGRhdGUgZmFpbGVkXG4iKTsKKwlpZiAoc3RhdHVzICYgQURJUzE2MjA0X0RJQUdfU1RBVF9QT1dFUl9ISUdIKQorCQlkZXZfZXJyKGRldiwgIlBvd2VyIHN1cHBseSBhYm92ZSAzLjYyNVZcbiIpOworCWlmIChzdGF0dXMgJiBBRElTMTYyMDRfRElBR19TVEFUX1BPV0VSX0xPVykKKwkJZGV2X2VycihkZXYsICJQb3dlciBzdXBwbHkgYmVsb3cgMi45NzVWXG4iKTsKKworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRpczE2MjA0X3NlbGZfdGVzdChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHJldDsKKwlyZXQgPSBhZGlzMTYyMDRfc3BpX3dyaXRlX3JlZ18xNihkZXYsCisJCQlBRElTMTYyMDRfTVNDX0NUUkwsCisJCQlBRElTMTYyMDRfTVNDX0NUUkxfU0VMRl9URVNUX0VOKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAicHJvYmxlbSBzdGFydGluZyBzZWxmIHRlc3QiKTsKKwkJZ290byBlcnJfcmV0OworCX0KKworCWFkaXMxNjIwNF9jaGVja19zdGF0dXMoZGV2KTsKKworZXJyX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkaXMxNjIwNF9pbml0aWFsX3NldHVwKHN0cnVjdCBhZGlzMTYyMDRfc3RhdGUgKnN0KQoreworCWludCByZXQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnN0LT5pbmRpb19kZXYtPmRldjsKKworCS8qIERpc2FibGUgSVJRICovCisJcmV0ID0gYWRpczE2MjA0X3NldF9pcnEoZGV2LCBmYWxzZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgImRpc2FibGUgaXJxIGZhaWxlZCIpOworCQlnb3RvIGVycl9yZXQ7CisJfQorCisJLyogRG8gc2VsZiB0ZXN0ICovCisJcmV0ID0gYWRpczE2MjA0X3NlbGZfdGVzdChkZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJzZWxmIHRlc3QgZmFpbHVyZSIpOworCQlnb3RvIGVycl9yZXQ7CisJfQorCisJLyogUmVhZCBzdGF0dXMgcmVnaXN0ZXIgdG8gY2hlY2sgdGhlIHJlc3VsdCAqLworCXJldCA9IGFkaXMxNjIwNF9jaGVja19zdGF0dXMoZGV2KTsKKwlpZiAocmV0KSB7CisJCWFkaXMxNjIwNF9yZXNldChkZXYpOworCQlkZXZfZXJyKGRldiwgImRldmljZSBub3QgcGxheWluZyBiYWxsIC0+IHJlc2V0Iik7CisJCW1zbGVlcChBRElTMTYyMDRfU1RBUlRVUF9ERUxBWSk7CisJCXJldCA9IGFkaXMxNjIwNF9jaGVja19zdGF0dXMoZGV2KTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihkZXYsICJnaXZpbmcgdXAiKTsKKwkJCWdvdG8gZXJyX3JldDsKKwkJfQorCX0KKworCXByaW50ayhLRVJOX0lORk8gRFJJVkVSX05BTUUgIjogYXQgQ1MlZCAoaXJxICVkKVxuIiwKKwkJCXN0LT51cy0+Y2hpcF9zZWxlY3QsIHN0LT51cy0+aXJxKTsKKworZXJyX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX0lOX05BTUVEX1JBVygwLCBzdXBwbHksIGFkaXMxNjIwNF9yZWFkXzEyYml0X3Vuc2lnbmVkLAorCQlBRElTMTYyMDRfU1VQUExZX09VVCk7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIoaW4wX3N1cHBseV9zY2FsZSwgIjAuMDAxMjIiKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfSU5fUkFXKDEsIGFkaXMxNjIwNF9yZWFkXzEyYml0X3Vuc2lnbmVkLAorCQlBRElTMTYyMDRfQVVYX0FEQyk7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIoaW4xX3NjYWxlLCAiMC4wMDA2MSIpOworCitzdGF0aWMgSUlPX0RFVl9BVFRSX0FDQ0VMX1goYWRpczE2MjA0X3JlYWRfMTRiaXRfc2lnbmVkLAorCQlBRElTMTYyMDRfWEFDQ0xfT1VUKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQUNDRUxfWShhZGlzMTYyMDRfcmVhZF8xNGJpdF9zaWduZWQsCisJCUFESVMxNjIwNF9ZQUNDTF9PVVQpOworc3RhdGljIElJT19ERVZfQVRUUl9BQ0NFTF9YWShhZGlzMTYyMDRfcmVhZF8xNGJpdF9zaWduZWQsCisJCUFESVMxNjIwNF9YWV9SU1NfT1VUKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQUNDRUxfWFBFQUsoYWRpczE2MjA0X3JlYWRfMTRiaXRfc2lnbmVkLAorCQlBRElTMTYyMDRfWF9QRUFLX09VVCk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FDQ0VMX1lQRUFLKGFkaXMxNjIwNF9yZWFkXzE0Yml0X3NpZ25lZCwKKwkJQURJUzE2MjA0X1lfUEVBS19PVVQpOworc3RhdGljIElJT19ERVZfQVRUUl9BQ0NFTF9YWVBFQUsoYWRpczE2MjA0X3JlYWRfMTRiaXRfc2lnbmVkLAorCQlBRElTMTYyMDRfWFlfUEVBS19PVVQpOworc3RhdGljIElJT19ERVZfQVRUUl9BQ0NFTF9YX09GRlNFVChTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRpczE2MjA0X3JlYWRfMTJiaXRfc2lnbmVkLAorCQlhZGlzMTYyMDRfd3JpdGVfMTZiaXQsCisJCUFESVMxNjIwNF9YQUNDTF9OVUxMKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQUNDRUxfWV9PRkZTRVQoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkaXMxNjIwNF9yZWFkXzEyYml0X3NpZ25lZCwKKwkJYWRpczE2MjA0X3dyaXRlXzE2Yml0LAorCQlBRElTMTYyMDRfWUFDQ0xfTlVMTCk7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIoYWNjZWxfeF9zY2FsZSwgIjAuMDE3MTI1Iik7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIoYWNjZWxfeV9zY2FsZSwgIjAuMDA4NDA3Iik7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIoYWNjZWxfeHlfc2NhbGUsICIwLjAxNzEyNSIpOworCitzdGF0aWMgSUlPX0RFVl9BVFRSX1RFTVBfUkFXKGFkaXMxNjIwNF9yZWFkX3RlbXApOworc3RhdGljIElJT19DT05TVF9BVFRSKHRlbXBfb2Zmc2V0LCAiMjUiKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUih0ZW1wX3NjYWxlLCAiLTAuNDciKTsKKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihyZXNldCwgU19JV1VTUiwgTlVMTCwgYWRpczE2MjA0X3dyaXRlX3Jlc2V0LCAwKTsKKworc3RhdGljIElJT19DT05TVF9BVFRSKG5hbWUsICJhZGlzMTYyMDQiKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkaXMxNjIwNF9ldmVudF9hdHRyaWJ1dGVzW10gPSB7CisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWRpczE2MjA0X2V2ZW50X2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZGlzMTYyMDRfZXZlbnRfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZGlzMTYyMDRfYXR0cmlidXRlc1tdID0geworCSZpaW9fZGV2X2F0dHJfaW4wX3N1cHBseV9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfaW4wX3N1cHBseV9zY2FsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfdGVtcF9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfdGVtcF9vZmZzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfdGVtcF9zY2FsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcmVzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW4xX3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbjFfc2NhbGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FjY2VsX3hfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hY2NlbF95X3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYWNjZWxfeHkuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FjY2VsX3hwZWFrLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hY2NlbF95cGVhay5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYWNjZWxfeHlwZWFrLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hY2NlbF94X29mZnNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYWNjZWxfeV9vZmZzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfYWNjZWxfeF9zY2FsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9hY2NlbF95X3NjYWxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2FjY2VsX3h5X3NjYWxlLmRldl9hdHRyLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWRpczE2MjA0X2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZGlzMTYyMDRfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkaXMxNjIwNF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWludCByZXQsIHJlZ2RvbmUgPSAwOworCXN0cnVjdCBhZGlzMTYyMDRfc3RhdGUgKnN0ID0ga3phbGxvYyhzaXplb2YgKnN0LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0KSB7CisJCXJldCA9ICAtRU5PTUVNOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJLyogdGhpcyBpcyBvbmx5IHVzZWQgZm9yIHJlbW92YWwgcHVycG9zZXMgKi8KKwlzcGlfc2V0X2RydmRhdGEoc3BpLCBzdCk7CisKKwkvKiBBbGxvY2F0ZSB0aGUgY29tbXMgYnVmZmVycyAqLworCXN0LT5yeCA9IGt6YWxsb2Moc2l6ZW9mKCpzdC0+cngpKkFESVMxNjIwNF9NQVhfUlgsIEdGUF9LRVJORUwpOworCWlmIChzdC0+cnggPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfc3Q7CisJfQorCXN0LT50eCA9IGt6YWxsb2Moc2l6ZW9mKCpzdC0+dHgpKkFESVMxNjIwNF9NQVhfVFgsIEdGUF9LRVJORUwpOworCWlmIChzdC0+dHggPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfcng7CisJfQorCXN0LT51cyA9IHNwaTsKKwltdXRleF9pbml0KCZzdC0+YnVmX2xvY2spOworCS8qIHNldHVwIHRoZSBpbmR1c3RyaWFsaW8gZHJpdmVyIGFsbG9jYXRlZCBlbGVtZW50cyAqLworCXN0LT5pbmRpb19kZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKHN0LT5pbmRpb19kZXYgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfdHg7CisJfQorCisJc3QtPmluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZzcGktPmRldjsKKwlzdC0+aW5kaW9fZGV2LT5udW1faW50ZXJydXB0X2xpbmVzID0gMTsKKwlzdC0+aW5kaW9fZGV2LT5ldmVudF9hdHRycyA9ICZhZGlzMTYyMDRfZXZlbnRfYXR0cmlidXRlX2dyb3VwOworCXN0LT5pbmRpb19kZXYtPmF0dHJzID0gJmFkaXMxNjIwNF9hdHRyaWJ1dGVfZ3JvdXA7CisJc3QtPmluZGlvX2Rldi0+ZGV2X2RhdGEgPSAodm9pZCAqKShzdCk7CisJc3QtPmluZGlvX2Rldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCXN0LT5pbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwlyZXQgPSBhZGlzMTYyMDRfY29uZmlndXJlX3Jpbmcoc3QtPmluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldjsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoc3QtPmluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOworCXJlZ2RvbmUgPSAxOworCisJcmV0ID0gYWRpczE2MjA0X2luaXRpYWxpemVfcmluZyhzdC0+aW5kaW9fZGV2LT5yaW5nKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIHJpbmdcbiIpOworCQlnb3RvIGVycm9yX3VucmVnX3JpbmdfZnVuY3M7CisJfQorCisJaWYgKHNwaS0+aXJxKSB7CisJCXJldCA9IGlpb19yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShzcGktPmlycSwKKwkJCQlzdC0+aW5kaW9fZGV2LAorCQkJCTAsCisJCQkJSVJRRl9UUklHR0VSX1JJU0lORywKKwkJCQkiYWRpczE2MjA0Iik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3VuaW5pdGlhbGl6ZV9yaW5nOworCisJCXJldCA9IGFkaXMxNjIwNF9wcm9iZV90cmlnZ2VyKHN0LT5pbmRpb19kZXYpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl91bnJlZ2lzdGVyX2xpbmU7CisJfQorCisJLyogR2V0IHRoZSBkZXZpY2UgaW50byBhIHNhbmUgaW5pdGlhbCBzdGF0ZSAqLworCXJldCA9IGFkaXMxNjIwNF9pbml0aWFsX3NldHVwKHN0KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JlbW92ZV90cmlnZ2VyOworCXJldHVybiAwOworCitlcnJvcl9yZW1vdmVfdHJpZ2dlcjoKKwlhZGlzMTYyMDRfcmVtb3ZlX3RyaWdnZXIoc3QtPmluZGlvX2Rldik7CitlcnJvcl91bnJlZ2lzdGVyX2xpbmU6CisJaWYgKHNwaS0+aXJxKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShzdC0+aW5kaW9fZGV2LCAwKTsKK2Vycm9yX3VuaW5pdGlhbGl6ZV9yaW5nOgorCWFkaXMxNjIwNF91bmluaXRpYWxpemVfcmluZyhzdC0+aW5kaW9fZGV2LT5yaW5nKTsKK2Vycm9yX3VucmVnX3JpbmdfZnVuY3M6CisJYWRpczE2MjA0X3VuY29uZmlndXJlX3Jpbmcoc3QtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX2RldjoKKwlpZiAocmVnZG9uZSkKKwkJaWlvX2RldmljZV91bnJlZ2lzdGVyKHN0LT5pbmRpb19kZXYpOworCWVsc2UKKwkJaWlvX2ZyZWVfZGV2aWNlKHN0LT5pbmRpb19kZXYpOworZXJyb3JfZnJlZV90eDoKKwlrZnJlZShzdC0+dHgpOworZXJyb3JfZnJlZV9yeDoKKwlrZnJlZShzdC0+cngpOworZXJyb3JfZnJlZV9zdDoKKwlrZnJlZShzdCk7CitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGlzMTYyMDRfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGFkaXMxNjIwNF9zdGF0ZSAqc3QgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gc3QtPmluZGlvX2RldjsKKworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisKKwlhZGlzMTYyMDRfcmVtb3ZlX3RyaWdnZXIoaW5kaW9fZGV2KTsKKwlpZiAoc3BpLT5pcnEpCisJCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKGluZGlvX2RldiwgMCk7CisKKwlhZGlzMTYyMDRfdW5pbml0aWFsaXplX3JpbmcoaW5kaW9fZGV2LT5yaW5nKTsKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlhZGlzMTYyMDRfdW5jb25maWd1cmVfcmluZyhpbmRpb19kZXYpOworCWtmcmVlKHN0LT50eCk7CisJa2ZyZWUoc3QtPnJ4KTsKKwlrZnJlZShzdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFkaXMxNjIwNF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYWRpczE2MjA0IiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhZGlzMTYyMDRfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFkaXMxNjIwNF9yZW1vdmUpLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWRpczE2MjA0X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmYWRpczE2MjA0X2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChhZGlzMTYyMDRfaW5pdCk7CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBhZGlzMTYyMDRfZXhpdCh2b2lkKQoreworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYWRpczE2MjA0X2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhZGlzMTYyMDRfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkJhcnJ5IFNvbmcgPDIxY25iYW9AZ21haWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBBRElTMTYyMDQgUHJvZ3JhbW1hYmxlIEhpZ2gtZyBEaWdpdGFsIEltcGFjdCBTZW5zb3IgYW5kIFJlY29yZGVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwNF9yaW5nLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwNF9yaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIwYjE2MGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwNF9yaW5nLmMKQEAgLTAsMCArMSwyMDYgQEAKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKyNpbmNsdWRlICIuLi9yaW5nX3N3LmgiCisjaW5jbHVkZSAiYWNjZWwuaCIKKyNpbmNsdWRlICIuLi90cmlnZ2VyLmgiCisjaW5jbHVkZSAiYWRpczE2MjA0LmgiCisKK3N0YXRpYyBJSU9fU0NBTl9FTF9DKGluX3N1cHBseSwgQURJUzE2MjA0X1NDQU5fU1VQUExZLCBBRElTMTYyMDRfU1VQUExZX09VVCwgTlVMTCk7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFJfU0NBTl9FTF9UWVBFKGluX3N1cHBseSwgdSwgMTIsIDE2KTsKK3N0YXRpYyBJSU9fU0NBTl9FTF9DKGFjY2VsX3gsIEFESVMxNjIwNF9TQ0FOX0FDQ19YLCBBRElTMTYyMDRfWEFDQ0xfT1VULCBOVUxMKTsKK3N0YXRpYyBJSU9fU0NBTl9FTF9DKGFjY2VsX3ksIEFESVMxNjIwNF9TQ0FOX0FDQ19ZLCBBRElTMTYyMDRfWUFDQ0xfT1VULCBOVUxMKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUl9TQ0FOX0VMX1RZUEUoYWNjZWwsIHMsIDE0LCAxNik7CitzdGF0aWMgSUlPX1NDQU5fRUxfQyhpbjAsIEFESVMxNjIwNF9TQ0FOX0FVWF9BREMsIEFESVMxNjIwNF9BVVhfQURDLCBOVUxMKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUl9TQ0FOX0VMX1RZUEUoaW4wLCB1LCAxMiwgMTYpOworc3RhdGljIElJT19TQ0FOX0VMX0ModGVtcCwgQURJUzE2MjA0X1NDQU5fVEVNUCwgQURJUzE2MjA0X1RFTVBfT1VULCBOVUxMKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUl9TQ0FOX0VMX1RZUEUodGVtcCwgdSwgMTIsIDE2KTsKK3N0YXRpYyBJSU9fU0NBTl9FTF9USU1FU1RBTVAoNSk7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFJfU0NBTl9FTF9UWVBFKHRpbWVzdGFtcCwgcywgNjQsIDY0KTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkaXMxNjIwNF9zY2FuX2VsX2F0dHJzW10gPSB7CisJJmlpb19zY2FuX2VsX2luX3N1cHBseS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbl9zdXBwbHlfaW5kZXguZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfaW5fc3VwcGx5X3R5cGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX3NjYW5fZWxfYWNjZWxfeC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9hY2NlbF94X2luZGV4LmRldl9hdHRyLmF0dHIsCisJJmlpb19zY2FuX2VsX2FjY2VsX3kuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfYWNjZWxfeV9pbmRleC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9hY2NlbF90eXBlLmRldl9hdHRyLmF0dHIsCisJJmlpb19zY2FuX2VsX2luMC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbjBfaW5kZXguZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfaW4wX3R5cGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX3NjYW5fZWxfdGVtcC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl90ZW1wX2luZGV4LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX3RlbXBfdHlwZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fc2Nhbl9lbF90aW1lc3RhbXAuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfdGltZXN0YW1wX2luZGV4LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX3RpbWVzdGFtcF90eXBlLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkaXMxNjIwNF9zY2FuX2VsX2dyb3VwID0geworCS5hdHRycyA9IGFkaXMxNjIwNF9zY2FuX2VsX2F0dHJzLAorCS5uYW1lID0gInNjYW5fZWxlbWVudHMiLAorfTsKKworLyoqCisgKiBhZGlzMTYyMDRfcG9sbF9mdW5jX3RoKCkgdG9wIGhhbGYgaW50ZXJydXB0IGhhbmRsZXIgY2FsbGVkIGJ5IHRyaWdnZXIKKyAqIEBwcml2YXRlX2RhdGE6CWlpb19kZXYKKyAqKi8KK3N0YXRpYyB2b2lkIGFkaXMxNjIwNF9wb2xsX2Z1bmNfdGgoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgczY0IHRpbWVzdGFtcCkKK3sKKwlzdHJ1Y3QgYWRpczE2MjA0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlzdC0+bGFzdF90aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisJc2NoZWR1bGVfd29yaygmc3QtPndvcmtfdHJpZ2dlcl90b19yaW5nKTsKK30KKworLyoqCisgKiBhZGlzMTYyMDRfcmVhZF9yaW5nX2RhdGEoKSByZWFkIGRhdGEgcmVnaXN0ZXJzIHdoaWNoIHdpbGwgYmUgcGxhY2VkIGludG8gcmluZworICogQGRldjogZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBjaGlsZCBvZiBhY3R1YWwgZGV2aWNlIChpaW9fZGV2IG9yIGlpb190cmlnKQorICogQHJ4OiBzb21ld2hlcmUgdG8gcGFzcyBiYWNrIHRoZSB2YWx1ZSByZWFkCisgKiovCitzdGF0aWMgaW50IGFkaXMxNjIwNF9yZWFkX3JpbmdfZGF0YShzdHJ1Y3QgZGV2aWNlICpkZXYsIHU4ICpyeCkKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRpczE2MjA0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW0FESVMxNjIwNF9PVVRQVVRTICsgMV07CisJaW50IHJldDsKKwlpbnQgaTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCisJbWVtc2V0KHhmZXJzLCAwLCBzaXplb2YoeGZlcnMpKTsKKwlmb3IgKGkgPSAwOyBpIDw9IEFESVMxNjIwNF9PVVRQVVRTOyBpKyspIHsKKwkJeGZlcnNbaV0uYml0c19wZXJfd29yZCA9IDg7CisJCXhmZXJzW2ldLmNzX2NoYW5nZSA9IDE7CisJCXhmZXJzW2ldLmxlbiA9IDI7CisJCXhmZXJzW2ldLmRlbGF5X3VzZWNzID0gMjA7CisJCXhmZXJzW2ldLnR4X2J1ZiA9IHN0LT50eCArIDIgKiBpOworCQlzdC0+dHhbMiAqIGldID0gQURJUzE2MjA0X1JFQURfUkVHKEFESVMxNjIwNF9TVVBQTFlfT1VUICsgMiAqIGkpOworCQlzdC0+dHhbMiAqIGkgKyAxXSA9IDA7CisJCWlmIChpID49IDEpCisJCQl4ZmVyc1tpXS5yeF9idWYgPSByeCArIDIgKiAoaSAtIDEpOworCQlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcnNbaV0sICZtc2cpOworCX0KKworCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CisJaWYgKHJldCkKKwkJZGV2X2Vycigmc3QtPnVzLT5kZXYsICJwcm9ibGVtIHdoZW4gYnVyc3QgcmVhZGluZyIpOworCisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworLyogV2hpbHN0IHRoaXMgbWFrZXMgYSBsb3Qgb2YgY2FsbHMgdG8gaWlvX3N3X3JpbmcgZnVuY3Rpb25zIC0gaXQgaXMgdG8gZGV2aWNlCisgKiBzcGVjaWZpYyB0byBiZSByb2xsZWQgaW50byB0aGUgY29yZS4KKyAqLworc3RhdGljIHZvaWQgYWRpczE2MjA0X3RyaWdnZXJfYmhfdG9fcmluZyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmtfcykKK3sKKwlzdHJ1Y3QgYWRpczE2MjA0X3N0YXRlICpzdAorCQk9IGNvbnRhaW5lcl9vZih3b3JrX3MsIHN0cnVjdCBhZGlzMTYyMDRfc3RhdGUsCisJCQkgICAgICAgd29ya190cmlnZ2VyX3RvX3JpbmcpOworCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcgPSBzdC0+aW5kaW9fZGV2LT5yaW5nOworCisJaW50IGkgPSAwOworCXMxNiAqZGF0YTsKKwlzaXplX3QgZGF0YXNpemUgPSByaW5nLT5hY2Nlc3MuZ2V0X2J5dGVzX3Blcl9kYXR1bShyaW5nKTsKKworCWRhdGEgPSBrbWFsbG9jKGRhdGFzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGF0YSA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnN0LT51cy0+ZGV2LCAibWVtb3J5IGFsbG9jIGZhaWxlZCBpbiByaW5nIGJoIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAocmluZy0+c2Nhbl9jb3VudCkKKwkJaWYgKGFkaXMxNjIwNF9yZWFkX3JpbmdfZGF0YSgmc3QtPmluZGlvX2Rldi0+ZGV2LCBzdC0+cngpID49IDApCisJCQlmb3IgKDsgaSA8IHJpbmctPnNjYW5fY291bnQ7IGkrKykKKwkJCQlkYXRhW2ldID0gYmUxNl90b19jcHVwKAorCQkJCQkoX19iZTE2ICopJihzdC0+cnhbaSoyXSkpOworCisJLyogR3VhcmFudGVlZCB0byBiZSBhbGlnbmVkIHdpdGggOCBieXRlIGJvdW5kYXJ5ICovCisJaWYgKHJpbmctPnNjYW5fdGltZXN0YW1wKQorCQkqKChzNjQgKikoZGF0YSArICgoaSArIDMpLzQpKjQpKSA9IHN0LT5sYXN0X3RpbWVzdGFtcDsKKworCXJpbmctPmFjY2Vzcy5zdG9yZV90byhyaW5nLAorCQkJICAgICAgKHU4ICopZGF0YSwKKwkJCSAgICAgIHN0LT5sYXN0X3RpbWVzdGFtcCk7CisKKwlpaW9fdHJpZ2dlcl9ub3RpZnlfZG9uZShzdC0+aW5kaW9fZGV2LT50cmlnKTsKKwlrZnJlZShkYXRhKTsKKworCXJldHVybjsKK30KKwordm9pZCBhZGlzMTYyMDRfdW5jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCWtmcmVlKGluZGlvX2Rldi0+cG9sbGZ1bmMpOworCWlpb19zd19yYl9mcmVlKGluZGlvX2Rldi0+cmluZyk7Cit9CisKK2ludCBhZGlzMTYyMDRfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYWRpczE2MjA0X3N0YXRlICpzdCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisJc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZzsKKwlJTklUX1dPUksoJnN0LT53b3JrX3RyaWdnZXJfdG9fcmluZywgYWRpczE2MjA0X3RyaWdnZXJfYmhfdG9fcmluZyk7CisKKwlyaW5nID0gaWlvX3N3X3JiX2FsbG9jYXRlKGluZGlvX2Rldik7CisJaWYgKCFyaW5nKSB7CisJCXJldCA9IC1FTk9NRU07CisJCXJldHVybiByZXQ7CisJfQorCWluZGlvX2Rldi0+cmluZyA9IHJpbmc7CisJLyogRWZmZWN0aXZlbHkgc2VsZWN0IHRoZSByaW5nIGJ1ZmZlciBpbXBsZW1lbnRhdGlvbiAqLworCWlpb19yaW5nX3N3X3JlZ2lzdGVyX2Z1bmNzKCZyaW5nLT5hY2Nlc3MpOworCXJpbmctPmJwZSA9IDI7CisJcmluZy0+c2Nhbl9lbF9hdHRycyA9ICZhZGlzMTYyMDRfc2Nhbl9lbF9ncm91cDsKKwlyaW5nLT5zY2FuX3RpbWVzdGFtcCA9IHRydWU7CisJcmluZy0+cHJlZW5hYmxlID0gJmlpb19zd19yaW5nX3ByZWVuYWJsZTsKKwlyaW5nLT5wb3N0ZW5hYmxlID0gJmlpb190cmlnZ2VyZWRfcmluZ19wb3N0ZW5hYmxlOworCXJpbmctPnByZWRpc2FibGUgPSAmaWlvX3RyaWdnZXJlZF9yaW5nX3ByZWRpc2FibGU7CisJcmluZy0+b3duZXIgPSBUSElTX01PRFVMRTsKKworCS8qIFNldCBkZWZhdWx0IHNjYW4gbW9kZSAqLworCWlpb19zY2FuX21hc2tfc2V0KHJpbmcsIGlpb19zY2FuX2VsX2luX3N1cHBseS5udW1iZXIpOworCWlpb19zY2FuX21hc2tfc2V0KHJpbmcsIGlpb19zY2FuX2VsX2FjY2VsX3gubnVtYmVyKTsKKwlpaW9fc2Nhbl9tYXNrX3NldChyaW5nLCBpaW9fc2Nhbl9lbF9hY2NlbF95Lm51bWJlcik7CisJaWlvX3NjYW5fbWFza19zZXQocmluZywgaWlvX3NjYW5fZWxfdGVtcC5udW1iZXIpOworCWlpb19zY2FuX21hc2tfc2V0KHJpbmcsIGlpb19zY2FuX2VsX2luMC5udW1iZXIpOworCisJcmV0ID0gaWlvX2FsbG9jX3BvbGxmdW5jKGluZGlvX2RldiwgTlVMTCwgJmFkaXMxNjIwNF9wb2xsX2Z1bmNfdGgpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfaWlvX3N3X3JiX2ZyZWU7CisKKwlpbmRpb19kZXYtPm1vZGVzIHw9IElORElPX1JJTkdfVFJJR0dFUkVEOworCXJldHVybiAwOworCitlcnJvcl9paW9fc3dfcmJfZnJlZToKKwlpaW9fc3dfcmJfZnJlZShpbmRpb19kZXYtPnJpbmcpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBhZGlzMTYyMDRfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpCit7CisJcmV0dXJuIGlpb19yaW5nX2J1ZmZlcl9yZWdpc3RlcihyaW5nLCAwKTsKK30KKwordm9pZCBhZGlzMTYyMDRfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKK3sKKwlpaW9fcmluZ19idWZmZXJfdW5yZWdpc3RlcihyaW5nKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA0X3RyaWdnZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA0X3RyaWdnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTlkYjkwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDRfdHJpZ2dlci5jCkBAIC0wLDAgKzEsMTIyIEBACisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorI2luY2x1ZGUgIi4uL3RyaWdnZXIuaCIKKyNpbmNsdWRlICJhZGlzMTYyMDQuaCIKKworLyoqCisgKiBhZGlzMTYyMDRfZGF0YV9yZHlfdHJpZ19wb2xsKCkgdGhlIGV2ZW50IGhhbmRsZXIgZm9yIHRoZSBkYXRhIHJkeSB0cmlnCisgKiovCitzdGF0aWMgaW50IGFkaXMxNjIwNF9kYXRhX3JkeV90cmlnX3BvbGwoc3RydWN0IGlpb19kZXYgKmRldl9pbmZvLAorCQkJCSAgICAgICBpbnQgaW5kZXgsCisJCQkJICAgICAgIHM2NCB0aW1lc3RhbXAsCisJCQkJICAgICAgIGludCBub190ZXN0KQoreworCXN0cnVjdCBhZGlzMTYyMDRfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShkZXZfaW5mbyk7CisJc3RydWN0IGlpb190cmlnZ2VyICp0cmlnID0gc3QtPnRyaWc7CisKKwlpaW9fdHJpZ2dlcl9wb2xsKHRyaWcsIHRpbWVzdGFtcCk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK0lJT19FVkVOVF9TSChkYXRhX3JkeV90cmlnLCAmYWRpczE2MjA0X2RhdGFfcmR5X3RyaWdfcG9sbCk7CisKK3N0YXRpYyBERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBpaW9fdHJpZ2dlcl9yZWFkX25hbWUsIE5VTEwpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRpczE2MjA0X3RyaWdnZXJfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfbmFtZS5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZGlzMTYyMDRfdHJpZ2dlcl9hdHRyX2dyb3VwID0geworCS5hdHRycyA9IGFkaXMxNjIwNF90cmlnZ2VyX2F0dHJzLAorfTsKKworLyoqCisgKiBhZGlzMTYyMDRfZGF0YV9yZHlfdHJpZ2dlcl9zZXRfc3RhdGUoKSBzZXQgZGF0YXJkeSBpbnRlcnJ1cHQgc3RhdGUKKyAqKi8KK3N0YXRpYyBpbnQgYWRpczE2MjA0X2RhdGFfcmR5X3RyaWdnZXJfc2V0X3N0YXRlKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZywKKwkJCQkJCWJvb2wgc3RhdGUpCit7CisJc3RydWN0IGFkaXMxNjIwNF9zdGF0ZSAqc3QgPSB0cmlnLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHN0LT5pbmRpb19kZXY7CisJaW50IHJldCA9IDA7CisKKwlkZXZfZGJnKCZpbmRpb19kZXYtPmRldiwgIiVzICglZClcbiIsIF9fZnVuY19fLCBzdGF0ZSk7CisJcmV0ID0gYWRpczE2MjA0X3NldF9pcnEoJnN0LT5pbmRpb19kZXYtPmRldiwgc3RhdGUpOworCWlmIChzdGF0ZSA9PSBmYWxzZSkgeworCQlpaW9fcmVtb3ZlX2V2ZW50X2Zyb21fbGlzdCgmaWlvX2V2ZW50X2RhdGFfcmR5X3RyaWcsCisJCQkJCSAgICZpbmRpb19kZXYtPmludGVycnVwdHNbMF0KKwkJCQkJICAgLT5ldl9saXN0KTsKKwkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwl9IGVsc2UgeworCQlpaW9fYWRkX2V2ZW50X3RvX2xpc3QoJmlpb19ldmVudF9kYXRhX3JkeV90cmlnLAorCQkJCSAgICAgICZpbmRpb19kZXYtPmludGVycnVwdHNbMF0tPmV2X2xpc3QpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGFkaXMxNjIwNF90cmlnX3RyeV9yZWVuKCkgdHJ5IHJlbmFibGluZyBpcnEgZm9yIGRhdGEgcmR5IHRyaWdnZXIKKyAqIEB0cmlnOgl0aGUgZGF0YXJkeSB0cmlnZ2VyCisgKiovCitzdGF0aWMgaW50IGFkaXMxNjIwNF90cmlnX3RyeV9yZWVuKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZykKK3sKKwlzdHJ1Y3QgYWRpczE2MjA0X3N0YXRlICpzdCA9IHRyaWctPnByaXZhdGVfZGF0YTsKKwllbmFibGVfaXJxKHN0LT51cy0+aXJxKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGFkaXMxNjIwNF9wcm9iZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYWRpczE2MjA0X3N0YXRlICpzdCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisKKwlzdC0+dHJpZyA9IGlpb19hbGxvY2F0ZV90cmlnZ2VyKCk7CisJc3QtPnRyaWctPm5hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwKKwkJCQkiYWRpczE2MjA0LWRldiVkIiwKKwkJCQlpbmRpb19kZXYtPmlkKTsKKwlpZiAoIXN0LT50cmlnLT5uYW1lKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV90cmlnOworCX0KKwlzdC0+dHJpZy0+ZGV2LnBhcmVudCA9ICZzdC0+dXMtPmRldjsKKwlzdC0+dHJpZy0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlzdC0+dHJpZy0+cHJpdmF0ZV9kYXRhID0gc3Q7CisJc3QtPnRyaWctPnNldF90cmlnZ2VyX3N0YXRlID0gJmFkaXMxNjIwNF9kYXRhX3JkeV90cmlnZ2VyX3NldF9zdGF0ZTsKKwlzdC0+dHJpZy0+dHJ5X3JlZW5hYmxlID0gJmFkaXMxNjIwNF90cmlnX3RyeV9yZWVuOworCXN0LT50cmlnLT5jb250cm9sX2F0dHJzID0gJmFkaXMxNjIwNF90cmlnZ2VyX2F0dHJfZ3JvdXA7CisJcmV0ID0gaWlvX3RyaWdnZXJfcmVnaXN0ZXIoc3QtPnRyaWcpOworCisJLyogc2VsZWN0IGRlZmF1bHQgdHJpZ2dlciAqLworCWluZGlvX2Rldi0+dHJpZyA9IHN0LT50cmlnOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV90cmlnX25hbWU7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfZnJlZV90cmlnX25hbWU6CisJa2ZyZWUoc3QtPnRyaWctPm5hbWUpOworZXJyb3JfZnJlZV90cmlnOgorCWlpb19mcmVlX3RyaWdnZXIoc3QtPnRyaWcpOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBhZGlzMTYyMDRfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlzdHJ1Y3QgYWRpczE2MjA0X3N0YXRlICpzdGF0ZSA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisKKwlpaW9fdHJpZ2dlcl91bnJlZ2lzdGVyKHN0YXRlLT50cmlnKTsKKwlrZnJlZShzdGF0ZS0+dHJpZy0+bmFtZSk7CisJaWlvX2ZyZWVfdHJpZ2dlcihzdGF0ZS0+dHJpZyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwOV9yaW5nLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwOV9yaW5nLmMKaW5kZXggMDMzMTM1Yy4uOGViYTBhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDlfcmluZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA5X3JpbmcuYwpAQCAtMTA1LDcgKzEwNSw3IEBACiAJCXhmZXJzW2ldLmJpdHNfcGVyX3dvcmQgPSA4OwogCQl4ZmVyc1tpXS5jc19jaGFuZ2UgPSAxOwogCQl4ZmVyc1tpXS5sZW4gPSAyOwotCQl4ZmVyc1tpXS5kZWxheV91c2VjcyA9IDIwOworCQl4ZmVyc1tpXS5kZWxheV91c2VjcyA9IDMwOwogCQl4ZmVyc1tpXS50eF9idWYgPSBzdC0+dHggKyAyICogaTsKIAkJc3QtPnR4WzIgKiBpXQogCQkJPSBBRElTMTYyMDlfUkVBRF9SRUcoQURJUzE2MjA5X1NVUFBMWV9PVVQgKyAyICogaSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2xpczNsMDJkcV9yaW5nLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2xpczNsMDJkcV9yaW5nLmMKaW5kZXggMzMwZDVkNi4uMWZkMDg4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9saXMzbDAyZHFfcmluZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvbGlzM2wwMmRxX3JpbmcuYwpAQCAtNTE3LDcgKzUxNyw3IEBACiAKIAlyZXQgPSBpaW9fYWxsb2NfcG9sbGZ1bmMoaW5kaW9fZGV2LCBOVUxMLCAmbGlzM2wwMmRxX3BvbGxfZnVuY190aCk7CiAJaWYgKHJldCkKLQkJZ290byBlcnJvcl9paW9fc3dfcmJfZnJlZTs7CisJCWdvdG8gZXJyb3JfaWlvX3N3X3JiX2ZyZWU7CiAJaW5kaW9fZGV2LT5tb2RlcyB8PSBJTkRJT19SSU5HX1RSSUdHRVJFRDsKIAlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL0tjb25maWcKaW5kZXggYWNiNjc2Ny4uODY4NjljZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9LY29uZmlnCkBAIC0yNyw2ICsyNyw0MSBAQAogCSAgU2F5IHllcyBoZXJlIHRvIGluY2x1ZGUgcmluZyBidWZmZXIgc3VwcG9ydCBpbiB0aGUgTUFYMTM2MwogCSAgQURDIGRyaXZlci4KIAorY29uZmlnIEFENzE1MAorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBhZDcxNTAvMS82IGNhcGFjaXRpdmUgc2Vuc29yIGRyaXZlciIKKwlkZXBlbmRzIG9uIEkyQworCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBjYXBhY2l0aXZlIHNlbnNvcnMuCisJICAoYWQ3MTUwLCBhZDcxNTEsIGFkNzE1NikgUHJvdmlkZXMgZGlyZWN0IGFjY2VzcyB2aWEgc3lzZnMuCisKK2NvbmZpZyBBRDcxNTIKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgYWQ3MTUyLzMgY2FwYWNpdGl2ZSBzZW5zb3IgZHJpdmVyIgorCWRlcGVuZHMgb24gSTJDCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIGNhcGFjaXRpdmUgc2Vuc29ycy4KKwkgIChhZDcxNTIsIGFkNzE1MykgUHJvdmlkZXMgZGlyZWN0IGFjY2VzcyB2aWEgc3lzZnMuCisKK2NvbmZpZyBBRDcyOTEKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQUQ3MjkxIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIiCisJZGVwZW5kcyBvbiBJMkMKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgQUQ3MjkxCisJICB0ZW1wZXJhdHVyZSBzZW5zb3JzLgorCitjb25maWcgQUQ3Mjk4CisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFENzI5OCB0ZW1wZXJhdHVyZSBzZW5zb3IgYW5kIEFEQyBkcml2ZXIiCisJZGVwZW5kcyBvbiBTUEkKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgQUQ3Mjk4CisJICB0ZW1wZXJhdHVyZSBzZW5zb3JzIGFuZCBBREMuCisKK2NvbmZpZyBBRDczMTQKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQUQ3MzE0IHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIiCisJZGVwZW5kcyBvbiBTUEkKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgQUQ3MzE0CisJICB0ZW1wZXJhdHVyZSBzZW5zb3JzLgorCiBjb25maWcgQUQ3OTlYCiAJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFENzk5eCBBREMgZHJpdmVyIgogCWRlcGVuZHMgb24gSTJDCkBAIC01MCw5ICs4NSw5IEBACiBjb25maWcgQUQ3NDc2CiAJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFENzQ3NS82LzcvOCBBRDc0NjYvNy84IGFuZCBBRDc0OTUgQURDIGRyaXZlciIKIAlkZXBlbmRzIG9uIFNQSQotCXNlbGVjdCBJSU9fUklOR19CVUZGRVIJCisJc2VsZWN0IElJT19SSU5HX0JVRkZFUgogCXNlbGVjdCBJSU9fU1dfUklORwotCXNlbGVjdCBJSU9fVFJJR0dFUiAJCisJc2VsZWN0IElJT19UUklHR0VSCiAJaGVscAogCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzCiAJICBBRDc0NzUsIEFENzQ3NiwgQUQ3NDc3LCBBRDc0NzgsIEFENzQ2NiwgQUQ3NDY3LCBBRDc0NjgsIEFENzQ5NQpAQCAtNjEsMyArOTYsNTUgQEAKIAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYWQ3NDc2LgorCitjb25maWcgQUQ3ODg3CisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFENzg4NyBBREMgZHJpdmVyIgorCWRlcGVuZHMgb24gU1BJCisJc2VsZWN0IElJT19SSU5HX0JVRkZFUgorCXNlbGVjdCBJSU9fU1dfUklORworCXNlbGVjdCBJSU9fVFJJR0dFUgorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcworCSAgQUQ3ODg3IFNQSSBhbmFsb2cgdG8gZGlnaXRhbCBjb252ZXJ0b3IgKEFEQykuCisJICBJZiB1bnN1cmUsIHNheSBOIChidXQgaXQncyBzYWZlIHRvIHNheSAiWSIpLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhZDc4ODcuCisKK2NvbmZpZyBBRDc3NDUKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQUQ3NzQ1LCBBRDc3NDYgQUQ3NzQ3IGNhcGFjaXRpdmUgc2Vuc29yIGRyaXZlciIKKwlkZXBlbmRzIG9uIEkyQworCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBjYXBhY2l0aXZlIHNlbnNvcnMuCisJICAoQUQ3NzQ1LCBBRDc3NDYsIEFENzc0NykgUHJvdmlkZXMgZGlyZWN0IGFjY2VzcyB2aWEgc3lzZnMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFkNzc0NS4KKworY29uZmlnIEFENzgxNgorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRDc4MTYvNy84IHRlbXBlcmF0dXJlIHNlbnNvciBhbmQgQURDIGRyaXZlciIKKwlkZXBlbmRzIG9uIFNQSQorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRDc4MTYvNy84CisJICB0ZW1wZXJhdHVyZSBzZW5zb3JzIGFuZCBBREMuCisKK2NvbmZpZyBBRFQ3NQorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRFQ3NSB0ZW1wZXJhdHVyZSBzZW5zb3IgZHJpdmVyIgorCWRlcGVuZHMgb24gSTJDCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIEFEVDc1CisJICB0ZW1wZXJhdHVyZSBzZW5zb3JzLgorCitjb25maWcgQURUNzMxMAorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRFQ3MzEwIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIiCisJZGVwZW5kcyBvbiBTUEkKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgQURUNzMxMAorCSAgdGVtcGVyYXR1cmUgc2Vuc29ycy4KKworY29uZmlnIEFEVDc0MTAKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQURUNzQxMCB0ZW1wZXJhdHVyZSBzZW5zb3IgZHJpdmVyIgorCWRlcGVuZHMgb24gSTJDCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIEFEVDc0MTAKKwkgIHRlbXBlcmF0dXJlIHNlbnNvcnMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL01ha2VmaWxlCmluZGV4IGI2MmMzMTliLi42ZjIzMWEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9NYWtlZmlsZQpAQCAtMTQsMyArMTQsMTggQEAKIGFkNzQ3Ni15IDo9IGFkNzQ3Nl9jb3JlLm8KIGFkNzQ3Ni0kKENPTkZJR19JSU9fUklOR19CVUZGRVIpICs9IGFkNzQ3Nl9yaW5nLm8KIG9iai0kKENPTkZJR19BRDc0NzYpICs9IGFkNzQ3Ni5vCisKK2FkNzg4Ny15IDo9IGFkNzg4N19jb3JlLm8KK2FkNzg4Ny0kKENPTkZJR19JSU9fUklOR19CVUZGRVIpICs9IGFkNzg4N19yaW5nLm8KK29iai0kKENPTkZJR19BRDc4ODcpICs9IGFkNzg4Ny5vCisKK29iai0kKENPTkZJR19BRDcxNTApICs9IGFkNzE1MC5vCitvYmotJChDT05GSUdfQUQ3MTUyKSArPSBhZDcxNTIubworb2JqLSQoQ09ORklHX0FENzI5MSkgKz0gYWQ3MjkxLm8KK29iai0kKENPTkZJR19BRDcyOTgpICs9IGFkNzI5OC5vCitvYmotJChDT05GSUdfQUQ3MzE0KSArPSBhZDczMTQubworb2JqLSQoQ09ORklHX0FENzc0NSkgKz0gYWQ3NzQ1Lm8KK29iai0kKENPTkZJR19BRDc4MTYpICs9IGFkNzgxNi5vCitvYmotJChDT05GSUdfQURUNzUpICs9IGFkdDc1Lm8KK29iai0kKENPTkZJR19BRFQ3MzEwKSArPSBhZHQ3MzEwLm8KK29iai0kKENPTkZJR19BRFQ3NDEwKSArPSBhZHQ3NDEwLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzE1MC5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3MTUwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU1NTc2NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzE1MC5jCkBAIC0wLDAgKzEsODc3IEBACisvKgorICogQUQ3MTUwIGNhcGFjaXRpdmUgc2Vuc29yIGRyaXZlciBzdXBwb3J0aW5nIEFENzE1MC8xLzYKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKworLyoKKyAqIEFENzE1MCByZWdpc3RlcnMgZGVmaW5pdGlvbgorICovCisKKyNkZWZpbmUgQUQ3MTUwX1NUQVRVUyAgICAgICAgICAgICAgMAorI2RlZmluZSBBRDcxNTBfU1RBVFVTX09VVDEgICAgICAgICAoMSA8PCAzKQorI2RlZmluZSBBRDcxNTBfU1RBVFVTX09VVDIgICAgICAgICAoMSA8PCA1KQorI2RlZmluZSBBRDcxNTBfQ0gxX0RBVEFfSElHSCAgICAgICAxCisjZGVmaW5lIEFENzE1MF9DSDFfREFUQV9MT1cgICAgICAgIDIKKyNkZWZpbmUgQUQ3MTUwX0NIMl9EQVRBX0hJR0ggICAgICAgMworI2RlZmluZSBBRDcxNTBfQ0gyX0RBVEFfTE9XICAgICAgICA0CisjZGVmaW5lIEFENzE1MF9DSDFfQVZHX0hJR0ggICAgICAgIDUKKyNkZWZpbmUgQUQ3MTUwX0NIMV9BVkdfTE9XICAgICAgICAgNgorI2RlZmluZSBBRDcxNTBfQ0gyX0FWR19ISUdIICAgICAgICA3CisjZGVmaW5lIEFENzE1MF9DSDJfQVZHX0xPVyAgICAgICAgIDgKKyNkZWZpbmUgQUQ3MTUwX0NIMV9TRU5TSVRJVklUWSAgICAgOQorI2RlZmluZSBBRDcxNTBfQ0gxX1RIUl9IT0xEX0ggICAgICA5CisjZGVmaW5lIEFENzE1MF9DSDFfVElNRU9VVCAgICAgICAgIDEwCisjZGVmaW5lIEFENzE1MF9DSDFfVEhSX0hPTERfTCAgICAgIDEwCisjZGVmaW5lIEFENzE1MF9DSDFfU0VUVVAgICAgICAgICAgIDExCisjZGVmaW5lIEFENzE1MF9DSDJfU0VOU0lUSVZJVFkgICAgIDEyCisjZGVmaW5lIEFENzE1MF9DSDJfVEhSX0hPTERfSCAgICAgIDEyCisjZGVmaW5lIEFENzE1MF9DSDJfVElNRU9VVCAgICAgICAgIDEzCisjZGVmaW5lIEFENzE1MF9DSDJfVEhSX0hPTERfTCAgICAgIDEzCisjZGVmaW5lIEFENzE1MF9DSDJfU0VUVVAgICAgICAgICAgIDE0CisjZGVmaW5lIEFENzE1MF9DRkcgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIEFENzE1MF9DRkdfRklYICAgICAgICAgICAgICgxIDw8IDcpCisjZGVmaW5lIEFENzE1MF9QRF9USU1FUiAgICAgICAgICAgIDE2CisjZGVmaW5lIEFENzE1MF9DSDFfQ0FQREFDICAgICAgICAgIDE3CisjZGVmaW5lIEFENzE1MF9DSDJfQ0FQREFDICAgICAgICAgIDE4CisjZGVmaW5lIEFENzE1MF9TTjMgICAgICAgICAgICAgICAgIDE5CisjZGVmaW5lIEFENzE1MF9TTjIgICAgICAgICAgICAgICAgIDIwCisjZGVmaW5lIEFENzE1MF9TTjEgICAgICAgICAgICAgICAgIDIxCisjZGVmaW5lIEFENzE1MF9TTjAgICAgICAgICAgICAgICAgIDIyCisjZGVmaW5lIEFENzE1MF9JRCAgICAgICAgICAgICAgICAgIDIzCisKKyNkZWZpbmUgQUQ3MTUwX01BWF9DT05WX01PREUgICAgICAgNAorCisvKgorICogc3RydWN0IGFkNzE1MF9jaGlwX2luZm8gLSBjaGlwIHNwZWNpZmMgaW5mb3JtYXRpb24KKyAqLworCitzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CisJc3RydWN0IHdvcmtfc3RydWN0IHRocmVzaF93b3JrOworCWJvb2wgaW50ZXI7CisJczY0IGxhc3RfdGltZXN0YW1wOworCXUxNiBjaDFfdGhyZXNob2xkOyAgICAgLyogQ2gxIFRocmVzaG9sZCAoaW4gZml4ZWQgdGhyZXNob2xkIG1vZGUpICovCisJdTggIGNoMV9zZW5zaXRpdml0eTsgICAvKiBDaDEgU2Vuc2l0aXZpdHkgKGluIGFkYXB0aXZlIHRocmVzaG9sZCBtb2RlKSAqLworCXU4ICBjaDFfdGltZW91dDsgICAgICAgLyogQ2gxIFRpbWVvdXQgKGluIGFkYXB0aXZlIHRocmVzaG9sZCBtb2RlKSAqLworCXU4ICBjaDFfc2V0dXA7CisJdTE2IGNoMl90aHJlc2hvbGQ7ICAgICAvKiBDaDIgVGhyZXNob2xkIChpbiBmaXhlZCB0aHJlc2hvbGQgbW9kZSkgKi8KKwl1OCAgY2gyX3NlbnNpdGl2aXR5OyAgIC8qIENoMSBTZW5zaXRpdml0eSAoaW4gYWRhcHRpdmUgdGhyZXNob2xkIG1vZGUpICovCisJdTggIGNoMl90aW1lb3V0OyAgICAgICAvKiBDaDEgVGltZW91dCAoaW4gYWRhcHRpdmUgdGhyZXNob2xkIG1vZGUpICovCisJdTggIGNoMl9zZXR1cDsKKwl1OCAgcG93ZXJkb3duX3RpbWVyOworCWNoYXIgdGhyZXNob2xkX21vZGVbMTBdOyAvKiBhZGFwdGl2ZS9maXhlZCB0aHJlc2hvbGQgbW9kZSAqLworCWludCBvbGRfc3RhdGU7CisJY2hhciAqY29udmVyc2lvbl9tb2RlOworfTsKKworc3RydWN0IGFkNzE1MF9jb252ZXJzaW9uX21vZGUgeworCWNoYXIgKm5hbWU7CisJdTggcmVnX2NmZzsKK307CisKK3N0cnVjdCBhZDcxNTBfY29udmVyc2lvbl9tb2RlIGFkNzE1MF9jb252X21vZGVfdGFibGVbQUQ3MTUwX01BWF9DT05WX01PREVdID0geworCXsgImlkbGUiLCAwIH0sCisJeyAiY29udGludW91cy1jb252ZXJzaW9uIiwgMSB9LAorCXsgInNpbmdsZS1jb252ZXJzaW9uIiwgMiB9LAorCXsgInBvd2VyLWRvd24iLCAzIH0sCit9OworCisvKgorICogYWQ3MTUwIHJlZ2lzdGVyIGFjY2VzcyBieSBJMkMKKyAqLworCitzdGF0aWMgaW50IGFkNzE1MF9pMmNfcmVhZChzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCwgdTggcmVnLCB1OCAqZGF0YSwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gY2hpcC0+Y2xpZW50OworCWludCByZXQgPSAwOworCisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgJnJlZywgMSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJMkMgd3JpdGUgZXJyb3JcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGkyY19tYXN0ZXJfcmVjdihjbGllbnQsIGRhdGEsIGxlbik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJMkMgcmVhZCBlcnJvclxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZDcxNTBfaTJjX3dyaXRlKHN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwLCB1OCByZWcsIHU4IGRhdGEpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNoaXAtPmNsaWVudDsKKwlpbnQgcmV0ID0gMDsKKworCXU4IHR4WzJdID0geworCQlyZWcsCisJCWRhdGEsCisJfTsKKworCXJldCA9IGkyY19tYXN0ZXJfc2VuZChjbGllbnQsIHR4LCAyKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJMkMgd3JpdGUgZXJyb3JcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHN5c2ZzIG5vZGVzCisgKi8KKworI2RlZmluZSBJSU9fREVWX0FUVFJfQVZBSUxfQ09OVkVSU0lPTl9NT0RFUyhfc2hvdykJCQkJXAorCUlJT19ERVZJQ0VfQVRUUihhdmFpbGFibGVfY29udmVyc2lvbl9tb2RlcywgU19JUlVHTywgX3Nob3csIE5VTEwsIDApCisjZGVmaW5lIElJT19ERVZfQVRUUl9DT05WRVJTSU9OX01PREUoX21vZGUsIF9zaG93LCBfc3RvcmUpICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGNvbnZlcnNpb25fbW9kZSwgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCisjZGVmaW5lIElJT19ERVZfQVRUUl9BVkFJTF9USFJFU0hPTERfTU9ERVMoX3Nob3cpCQkJCVwKKwlJSU9fREVWSUNFX0FUVFIoYXZhaWxhYmxlX3RocmVzaG9sZF9tb2RlcywgU19JUlVHTywgX3Nob3csIE5VTEwsIDApCisjZGVmaW5lIElJT19ERVZfQVRUUl9USFJFU0hPTERfTU9ERShfbW9kZSwgX3Nob3csIF9zdG9yZSkJCVwKKwlJSU9fREVWSUNFX0FUVFIodGhyZXNob2xkX21vZGUsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCAwKQorI2RlZmluZSBJSU9fREVWX0FUVFJfQ0gxX1RIUkVTSE9MRChfbW9kZSwgX3Nob3csIF9zdG9yZSkgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoY2gxX3RocmVzaG9sZCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCisjZGVmaW5lIElJT19ERVZfQVRUUl9DSDJfVEhSRVNIT0xEKF9tb2RlLCBfc2hvdywgX3N0b3JlKSAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihjaDJfdGhyZXNob2xkLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NIMV9TRU5TSVRJVklUWShfbW9kZSwgX3Nob3csIF9zdG9yZSkJCVwKKwlJSU9fREVWSUNFX0FUVFIoY2gxX3NlbnNpdGl2aXR5LCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NIMl9TRU5TSVRJVklUWShfbW9kZSwgX3Nob3csIF9zdG9yZSkJCVwKKwlJSU9fREVWSUNFX0FUVFIoY2gyX3NlbnNpdGl2aXR5LCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NIMV9USU1FT1VUKF9tb2RlLCBfc2hvdywgX3N0b3JlKQkJXAorCUlJT19ERVZJQ0VfQVRUUihjaDFfdGltZW91dCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCisjZGVmaW5lIElJT19ERVZfQVRUUl9DSDJfVElNRU9VVChfbW9kZSwgX3Nob3csIF9zdG9yZSkJCVwKKwlJSU9fREVWSUNFX0FUVFIoY2gyX3RpbWVvdXQsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCAwKQorI2RlZmluZSBJSU9fREVWX0FUVFJfQ0gxX1ZBTFVFKF9zaG93KQkJXAorCUlJT19ERVZJQ0VfQVRUUihjaDFfdmFsdWUsIFNfSVJVR08sIF9zaG93LCBOVUxMLCAwKQorI2RlZmluZSBJSU9fREVWX0FUVFJfQ0gyX1ZBTFVFKF9zaG93KQkJXAorCUlJT19ERVZJQ0VfQVRUUihjaDJfdmFsdWUsIFNfSVJVR08sIF9zaG93LCBOVUxMLCAwKQorI2RlZmluZSBJSU9fREVWX0FUVFJfQ0gxX1NFVFVQKF9tb2RlLCBfc2hvdywgX3N0b3JlKQkJXAorCUlJT19ERVZJQ0VfQVRUUihjaDFfc2V0dXAsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCAwKQorI2RlZmluZSBJSU9fREVWX0FUVFJfQ0gyX1NFVFVQKF9tb2RlLCBfc2hvdywgX3N0b3JlKSAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihjaDJfc2V0dXAsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCAwKQorI2RlZmluZSBJSU9fREVWX0FUVFJfUE9XRVJET1dOX1RJTUVSKF9tb2RlLCBfc2hvdywgX3N0b3JlKSAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihwb3dlcmRvd25fdGltZXIsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCAwKQorCitzdGF0aWMgc3NpemVfdCBhZDcxNTBfc2hvd19jb252ZXJzaW9uX21vZGVzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlpbnQgaTsKKwlpbnQgbGVuID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBBRDcxNTBfTUFYX0NPTlZfTU9ERTsgaSsrKQorCQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICIlc1xuIiwgYWQ3MTUwX2NvbnZfbW9kZV90YWJsZVtpXS5uYW1lKTsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfQVZBSUxfQ09OVkVSU0lPTl9NT0RFUyhhZDcxNTBfc2hvd19jb252ZXJzaW9uX21vZGVzKTsKKworc3RhdGljIHNzaXplX3QgYWQ3MTUwX3Nob3dfY29udmVyc2lvbl9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBjaGlwLT5jb252ZXJzaW9uX21vZGUpOworfQorCitzdGF0aWMgc3NpemVfdCBhZDcxNTBfc3RvcmVfY29udmVyc2lvbl9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1OCBjZmc7CisJaW50IGk7CisKKwlhZDcxNTBfaTJjX3JlYWQoY2hpcCwgQUQ3MTUwX0NGRywgJmNmZywgMSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQUQ3MTUwX01BWF9DT05WX01PREU7IGkrKykgeworCQlpZiAoc3RybmNtcChidWYsIGFkNzE1MF9jb252X21vZGVfdGFibGVbaV0ubmFtZSwKKwkJCQlzdHJsZW4oYWQ3MTUwX2NvbnZfbW9kZV90YWJsZVtpXS5uYW1lKSAtIDEpID09IDApIHsKKwkJCWNoaXAtPmNvbnZlcnNpb25fbW9kZSA9IGFkNzE1MF9jb252X21vZGVfdGFibGVbaV0ubmFtZTsKKwkJCWNmZyB8PSAweDE4IHwgYWQ3MTUwX2NvbnZfbW9kZV90YWJsZVtpXS5yZWdfY2ZnOworCQkJYWQ3MTUwX2kyY193cml0ZShjaGlwLCBBRDcxNTBfQ0ZHLCBjZmcpOworCQkJcmV0dXJuIGxlbjsKKwkJfQorCX0KKworCWRldl9lcnIoZGV2LCAibm90IHN1cHBvcnRlZCBjb252ZXJzaW9uIG1vZGVcbiIpOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ09OVkVSU0lPTl9NT0RFKFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDcxNTBfc2hvd19jb252ZXJzaW9uX21vZGUsCisJCWFkNzE1MF9zdG9yZV9jb252ZXJzaW9uX21vZGUpOworCitzdGF0aWMgc3NpemVfdCBhZDcxNTBfc2hvd190aHJlc2hvbGRfbW9kZXMoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgImFkYXB0aXZlXG5maXhlZFxuIik7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfQVZBSUxfVEhSRVNIT0xEX01PREVTKGFkNzE1MF9zaG93X3RocmVzaG9sZF9tb2Rlcyk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1MF9zaG93X2NoMV92YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzE1MF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTggZGF0YVsyXTsKKworCWFkNzE1MF9pMmNfcmVhZChjaGlwLCBBRDcxNTBfQ0gxX0RBVEFfSElHSCwgZGF0YSwgMik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsICgoaW50KSBkYXRhWzBdIDw8IDgpIHwgZGF0YVsxXSk7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0gxX1ZBTFVFKGFkNzE1MF9zaG93X2NoMV92YWx1ZSk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1MF9zaG93X2NoMl92YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzE1MF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTggZGF0YVsyXTsKKworCWFkNzE1MF9pMmNfcmVhZChjaGlwLCBBRDcxNTBfQ0gyX0RBVEFfSElHSCwgZGF0YSwgMik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsICgoaW50KSBkYXRhWzBdIDw8IDgpIHwgZGF0YVsxXSk7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0gyX1ZBTFVFKGFkNzE1MF9zaG93X2NoMl92YWx1ZSk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1MF9zaG93X3RocmVzaG9sZF9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBjaGlwLT50aHJlc2hvbGRfbW9kZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1MF9zdG9yZV90aHJlc2hvbGRfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzE1MF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTggY2ZnOworCisJYWQ3MTUwX2kyY19yZWFkKGNoaXAsIEFENzE1MF9DRkcsICZjZmcsIDEpOworCisJaWYgKHN0cm5jbXAoYnVmLCAiZml4ZWQiLCA1KSA9PSAwKSB7CisJCXN0cmNweShjaGlwLT50aHJlc2hvbGRfbW9kZSwgImZpeGVkIik7CisJCWNmZyB8PSBBRDcxNTBfQ0ZHX0ZJWDsKKwkJYWQ3MTUwX2kyY193cml0ZShjaGlwLCBBRDcxNTBfQ0ZHLCBjZmcpOworCisJCXJldHVybiBsZW47CisJfSBlbHNlIGlmIChzdHJuY21wKGJ1ZiwgImFkYXB0aXZlIiwgOCkgPT0gMCkgeworCQlzdHJjcHkoY2hpcC0+dGhyZXNob2xkX21vZGUsICJhZGFwdGl2ZSIpOworCQljZmcgJj0gfkFENzE1MF9DRkdfRklYOworCQlhZDcxNTBfaTJjX3dyaXRlKGNoaXAsIEFENzE1MF9DRkcsIGNmZyk7CisKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlkZXZfZXJyKGRldiwgIm5vdCBzdXBwb3J0ZWQgdGhyZXNob2xkIG1vZGVcbiIpOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX1RIUkVTSE9MRF9NT0RFKFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDcxNTBfc2hvd190aHJlc2hvbGRfbW9kZSwKKwkJYWQ3MTUwX3N0b3JlX3RocmVzaG9sZF9tb2RlKTsKKworc3RhdGljIHNzaXplX3QgYWQ3MTUwX3Nob3dfY2gxX3RocmVzaG9sZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzE1MF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgY2hpcC0+Y2gxX3RocmVzaG9sZCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1MF9zdG9yZV9jaDFfdGhyZXNob2xkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKKworCWlmICgoIXJldCkgJiYgKGRhdGEgPCAweDEwMDAwKSkgeworCQlhZDcxNTBfaTJjX3dyaXRlKGNoaXAsIEFENzE1MF9DSDFfVEhSX0hPTERfSCwgZGF0YSA+PiA4KTsKKwkJYWQ3MTUwX2kyY193cml0ZShjaGlwLCBBRDcxNTBfQ0gxX1RIUl9IT0xEX0wsIGRhdGEpOworCQljaGlwLT5jaDFfdGhyZXNob2xkID0gZGF0YTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9DSDFfVEhSRVNIT0xEKFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDcxNTBfc2hvd19jaDFfdGhyZXNob2xkLAorCQlhZDcxNTBfc3RvcmVfY2gxX3RocmVzaG9sZCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1MF9zaG93X2NoMl90aHJlc2hvbGQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGNoaXAtPmNoMl90aHJlc2hvbGQpOworfQorCitzdGF0aWMgc3NpemVfdCBhZDcxNTBfc3RvcmVfY2gyX3RocmVzaG9sZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzE1MF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7CisKKwlpZiAoKCFyZXQpICYmIChkYXRhIDwgMHgxMDAwMCkpIHsKKwkJYWQ3MTUwX2kyY193cml0ZShjaGlwLCBBRDcxNTBfQ0gyX1RIUl9IT0xEX0gsIGRhdGEgPj4gOCk7CisJCWFkNzE1MF9pMmNfd3JpdGUoY2hpcCwgQUQ3MTUwX0NIMl9USFJfSE9MRF9MLCBkYXRhKTsKKwkJY2hpcC0+Y2gyX3RocmVzaG9sZCA9IGRhdGE7CisJCXJldHVybiBsZW47CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0gyX1RIUkVTSE9MRChTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQ3MTUwX3Nob3dfY2gyX3RocmVzaG9sZCwKKwkJYWQ3MTUwX3N0b3JlX2NoMl90aHJlc2hvbGQpOworCitzdGF0aWMgc3NpemVfdCBhZDcxNTBfc2hvd19jaDFfc2Vuc2l0aXZpdHkoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGNoaXAtPmNoMV9zZW5zaXRpdml0eSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1MF9zdG9yZV9jaDFfc2Vuc2l0aXZpdHkoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOworCisJaWYgKCghcmV0KSAmJiAoZGF0YSA8IDB4MTAwKSkgeworCQlhZDcxNTBfaTJjX3dyaXRlKGNoaXAsIEFENzE1MF9DSDFfU0VOU0lUSVZJVFksIGRhdGEpOworCQljaGlwLT5jaDFfc2Vuc2l0aXZpdHkgPSBkYXRhOworCQlyZXR1cm4gbGVuOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX0NIMV9TRU5TSVRJVklUWShTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQ3MTUwX3Nob3dfY2gxX3NlbnNpdGl2aXR5LAorCQlhZDcxNTBfc3RvcmVfY2gxX3NlbnNpdGl2aXR5KTsKKworc3RhdGljIHNzaXplX3QgYWQ3MTUwX3Nob3dfY2gyX3NlbnNpdGl2aXR5KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBjaGlwLT5jaDJfc2Vuc2l0aXZpdHkpOworfQorCitzdGF0aWMgc3NpemVfdCBhZDcxNTBfc3RvcmVfY2gyX3NlbnNpdGl2aXR5KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKKworCWlmICgoIXJldCkgJiYgKGRhdGEgPCAweDEwMCkpIHsKKwkJYWQ3MTUwX2kyY193cml0ZShjaGlwLCBBRDcxNTBfQ0gyX1NFTlNJVElWSVRZLCBkYXRhKTsKKwkJY2hpcC0+Y2gyX3NlbnNpdGl2aXR5ID0gZGF0YTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9DSDJfU0VOU0lUSVZJVFkoU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkNzE1MF9zaG93X2NoMl9zZW5zaXRpdml0eSwKKwkJYWQ3MTUwX3N0b3JlX2NoMl9zZW5zaXRpdml0eSk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1MF9zaG93X2NoMV90aW1lb3V0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBjaGlwLT5jaDFfdGltZW91dCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1MF9zdG9yZV9jaDFfdGltZW91dChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzE1MF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7CisKKwlpZiAoKCFyZXQpICYmIChkYXRhIDwgMHgxMDApKSB7CisJCWFkNzE1MF9pMmNfd3JpdGUoY2hpcCwgQUQ3MTUwX0NIMV9USU1FT1VULCBkYXRhKTsKKwkJY2hpcC0+Y2gxX3RpbWVvdXQgPSBkYXRhOworCQlyZXR1cm4gbGVuOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX0NIMV9USU1FT1VUKFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDcxNTBfc2hvd19jaDFfdGltZW91dCwKKwkJYWQ3MTUwX3N0b3JlX2NoMV90aW1lb3V0KTsKKworc3RhdGljIHNzaXplX3QgYWQ3MTUwX3Nob3dfY2gyX3RpbWVvdXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGNoaXAtPmNoMl90aW1lb3V0KTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3MTUwX3N0b3JlX2NoMl90aW1lb3V0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKKworCWlmICgoIXJldCkgJiYgKGRhdGEgPCAweDEwMCkpIHsKKwkJYWQ3MTUwX2kyY193cml0ZShjaGlwLCBBRDcxNTBfQ0gyX1RJTUVPVVQsIGRhdGEpOworCQljaGlwLT5jaDJfdGltZW91dCA9IGRhdGE7CisJCXJldHVybiBsZW47CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0gyX1RJTUVPVVQoU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkNzE1MF9zaG93X2NoMl90aW1lb3V0LAorCQlhZDcxNTBfc3RvcmVfY2gyX3RpbWVvdXQpOworCitzdGF0aWMgc3NpemVfdCBhZDcxNTBfc2hvd19jaDFfc2V0dXAoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDJ4XG4iLCBjaGlwLT5jaDFfc2V0dXApOworfQorCitzdGF0aWMgc3NpemVfdCBhZDcxNTBfc3RvcmVfY2gxX3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKKworCWlmICgoIXJldCkgJiYgKGRhdGEgPCAweDEwMCkpIHsKKwkJYWQ3MTUwX2kyY193cml0ZShjaGlwLCBBRDcxNTBfQ0gxX1NFVFVQLCBkYXRhKTsKKwkJY2hpcC0+Y2gxX3NldHVwID0gZGF0YTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX0NIMV9TRVRVUChTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQ3MTUwX3Nob3dfY2gxX3NldHVwLAorCQlhZDcxNTBfc3RvcmVfY2gxX3NldHVwKTsKKworc3RhdGljIHNzaXplX3QgYWQ3MTUwX3Nob3dfY2gyX3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JTAyeFxuIiwgY2hpcC0+Y2gyX3NldHVwKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3MTUwX3N0b3JlX2NoMl9zZXR1cChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzE1MF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7CisKKwlpZiAoKCFyZXQpICYmIChkYXRhIDwgMHgxMDApKSB7CisJCWFkNzE1MF9pMmNfd3JpdGUoY2hpcCwgQUQ3MTUwX0NIMl9TRVRVUCwgZGF0YSk7CisJCWNoaXAtPmNoMl9zZXR1cCA9IGRhdGE7CisJCXJldHVybiBsZW47CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0gyX1NFVFVQKFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDcxNTBfc2hvd19jaDJfc2V0dXAsCisJCWFkNzE1MF9zdG9yZV9jaDJfc2V0dXApOworCitzdGF0aWMgc3NpemVfdCBhZDcxNTBfc2hvd19uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgY2hpcC0+bmFtZSk7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgYWQ3MTUwX3Nob3dfbmFtZSwgTlVMTCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1MF9zaG93X3Bvd2VyZG93bl90aW1lcihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzE1MF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCUwMnhcbiIsIGNoaXAtPnBvd2VyZG93bl90aW1lcik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1MF9zdG9yZV9wb3dlcmRvd25fdGltZXIoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOworCisJaWYgKCghcmV0KSAmJiAoZGF0YSA8IDB4NDApKSB7CisJCWNoaXAtPnBvd2VyZG93bl90aW1lciA9IGRhdGE7CisJCXJldHVybiBsZW47CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfUE9XRVJET1dOX1RJTUVSKFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDcxNTBfc2hvd19wb3dlcmRvd25fdGltZXIsCisJCWFkNzE1MF9zdG9yZV9wb3dlcmRvd25fdGltZXIpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWQ3MTUwX2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2Rldl9hdHRyX2F2YWlsYWJsZV90aHJlc2hvbGRfbW9kZXMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3RocmVzaG9sZF9tb2RlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jaDFfdGhyZXNob2xkLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jaDJfdGhyZXNob2xkLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jaDFfdGltZW91dC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2gyX3RpbWVvdXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NoMV9zZXR1cC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2gyX3NldHVwLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jaDFfc2Vuc2l0aXZpdHkuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NoMl9zZW5zaXRpdml0eS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcG93ZXJkb3duX3RpbWVyLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jaDFfdmFsdWUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NoMl92YWx1ZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDcxNTBfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkNzE1MF9hdHRyaWJ1dGVzLAorfTsKKworLyoKKyAqIHRocmVzaG9sZCBldmVudHMKKyAqLworCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0NIMV9ISUdIICAgIElJT19CVUZGRVJfRVZFTlRfQ09ERSgwKQorI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9DSDFfTE9XICAgICBJSU9fQlVGRkVSX0VWRU5UX0NPREUoMSkKKyNkZWZpbmUgSUlPX0VWRU5UX0NPREVfQ0gyX0hJR0ggICAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDIpCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0NIMl9MT1cgICAgIElJT19CVUZGRVJfRVZFTlRfQ09ERSgzKQorCisjZGVmaW5lIElJT19FVkVOVF9BVFRSX0NIMV9ISUdIX1NIKF9ldmxpc3QsIF9zaG93LCBfc3RvcmUsIF9tYXNrKQlcCisJSUlPX0VWRU5UX0FUVFJfU0goY2gxX2hpZ2gsIF9ldmxpc3QsIF9zaG93LCBfc3RvcmUsIF9tYXNrKQorCisjZGVmaW5lIElJT19FVkVOVF9BVFRSX0NIMl9ISUdIX1NIKF9ldmxpc3QsIF9zaG93LCBfc3RvcmUsIF9tYXNrKQlcCisJSUlPX0VWRU5UX0FUVFJfU0goY2gyX2hpZ2gsIF9ldmxpc3QsIF9zaG93LCBfc3RvcmUsIF9tYXNrKQorCisjZGVmaW5lIElJT19FVkVOVF9BVFRSX0NIMV9MT1dfU0goX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spCVwKKwlJSU9fRVZFTlRfQVRUUl9TSChjaDFfbG93LCBfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykKKworI2RlZmluZSBJSU9fRVZFTlRfQVRUUl9DSDJfTE9XX1NIKF9ldmxpc3QsIF9zaG93LCBfc3RvcmUsIF9tYXNrKQlcCisJSUlPX0VWRU5UX0FUVFJfU0goY2gyX2xvdywgX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spCisKK3N0YXRpYyB2b2lkIGFkNzE1MF9pbnRlcnJ1cHRfaGFuZGxlcl9iaChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmtfcykKK3sKKwlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9CisJCWNvbnRhaW5lcl9vZih3b3JrX3MsIHN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvLCB0aHJlc2hfd29yayk7CisJdTggaW50X3N0YXR1czsKKworCWVuYWJsZV9pcnEoY2hpcC0+Y2xpZW50LT5pcnEpOworCisJYWQ3MTUwX2kyY19yZWFkKGNoaXAsIEFENzE1MF9TVEFUVVMsICZpbnRfc3RhdHVzLCAxKTsKKworCWlmICgoaW50X3N0YXR1cyAmIEFENzE1MF9TVEFUVVNfT1VUMSkgJiYgIShjaGlwLT5vbGRfc3RhdGUgJiBBRDcxNTBfU1RBVFVTX09VVDEpKQorCQlpaW9fcHVzaF9ldmVudChjaGlwLT5pbmRpb19kZXYsIDAsCisJCQkJSUlPX0VWRU5UX0NPREVfQ0gxX0hJR0gsCisJCQkJY2hpcC0+bGFzdF90aW1lc3RhbXApOworCWVsc2UgaWYgKCghKGludF9zdGF0dXMgJiBBRDcxNTBfU1RBVFVTX09VVDEpKSAmJiAoY2hpcC0+b2xkX3N0YXRlICYgQUQ3MTUwX1NUQVRVU19PVVQxKSkKKwkJaWlvX3B1c2hfZXZlbnQoY2hpcC0+aW5kaW9fZGV2LCAwLAorCQkJCUlJT19FVkVOVF9DT0RFX0NIMV9MT1csCisJCQkJY2hpcC0+bGFzdF90aW1lc3RhbXApOworCisJaWYgKChpbnRfc3RhdHVzICYgQUQ3MTUwX1NUQVRVU19PVVQyKSAmJiAhKGNoaXAtPm9sZF9zdGF0ZSAmIEFENzE1MF9TVEFUVVNfT1VUMikpCisJCWlpb19wdXNoX2V2ZW50KGNoaXAtPmluZGlvX2RldiwgMCwKKwkJCQlJSU9fRVZFTlRfQ09ERV9DSDJfSElHSCwKKwkJCQljaGlwLT5sYXN0X3RpbWVzdGFtcCk7CisJZWxzZSBpZiAoKCEoaW50X3N0YXR1cyAmIEFENzE1MF9TVEFUVVNfT1VUMikpICYmIChjaGlwLT5vbGRfc3RhdGUgJiBBRDcxNTBfU1RBVFVTX09VVDIpKQorCQlpaW9fcHVzaF9ldmVudChjaGlwLT5pbmRpb19kZXYsIDAsCisJCQkJSUlPX0VWRU5UX0NPREVfQ0gyX0xPVywKKwkJCQljaGlwLT5sYXN0X3RpbWVzdGFtcCk7Cit9CisKK3N0YXRpYyBpbnQgYWQ3MTUwX2ludGVycnVwdF9oYW5kbGVyX3RoKHN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbywKKwkJaW50IGluZGV4LAorCQlzNjQgdGltZXN0YW1wLAorCQlpbnQgbm9fdGVzdCkKK3sKKwlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCWNoaXAtPmxhc3RfdGltZXN0YW1wID0gdGltZXN0YW1wOworCXNjaGVkdWxlX3dvcmsoJmNoaXAtPnRocmVzaF93b3JrKTsKKworCXJldHVybiAwOworfQorCitJSU9fRVZFTlRfU0godGhyZXNob2xkLCAmYWQ3MTUwX2ludGVycnVwdF9oYW5kbGVyX3RoKTsKKworc3RhdGljIHNzaXplX3QgYWQ3MTUwX3F1ZXJ5X291dF9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwkvKgorCSAqIEFENzE1MCBwcm92aWRlcyB0d28gbG9naWMgb3V0cHV0IGNoYW5uZWxzLCB3aGljaCBjYW4gYmUgdXNlZCBhcyBpbnRlcnJ1cHQKKwkgKiBidXQgdGhlIHBpbnMgYXJlIG5vdCBjb25maWd1cmFibGUKKwkgKi8KKwlyZXR1cm4gc3ByaW50ZihidWYsICIxXG4iKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3MTUwX3NldF9vdXRfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJcmV0dXJuIGxlbjsKK30KKworSUlPX0VWRU5UX0FUVFJfQ0gxX0hJR0hfU0goaWlvX2V2ZW50X3RocmVzaG9sZCwgYWQ3MTUwX3F1ZXJ5X291dF9tb2RlLCBhZDcxNTBfc2V0X291dF9tb2RlLCAwKTsKK0lJT19FVkVOVF9BVFRSX0NIMl9ISUdIX1NIKGlpb19ldmVudF90aHJlc2hvbGQsIGFkNzE1MF9xdWVyeV9vdXRfbW9kZSwgYWQ3MTUwX3NldF9vdXRfbW9kZSwgMCk7CitJSU9fRVZFTlRfQVRUUl9DSDFfTE9XX1NIKGlpb19ldmVudF90aHJlc2hvbGQsIGFkNzE1MF9xdWVyeV9vdXRfbW9kZSwgYWQ3MTUwX3NldF9vdXRfbW9kZSwgMCk7CitJSU9fRVZFTlRfQVRUUl9DSDJfTE9XX1NIKGlpb19ldmVudF90aHJlc2hvbGQsIGFkNzE1MF9xdWVyeV9vdXRfbW9kZSwgYWQ3MTUwX3NldF9vdXRfbW9kZSwgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZDcxNTBfZXZlbnRfYXR0cmlidXRlc1tdID0geworCSZpaW9fZXZlbnRfYXR0cl9jaDFfaGlnaC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl9jaDJfaGlnaC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl9jaDFfbG93LmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX2NoMl9sb3cuZGV2X2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWQ3MTUwX2V2ZW50X2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZDcxNTBfZXZlbnRfYXR0cmlidXRlcywKK307CisKKy8qCisgKiBkZXZpY2UgcHJvYmUgYW5kIHJlbW92ZQorICovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkNzE1MF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJaW50IHJldCA9IDAsIHJlZ2RvbmUgPSAwOworCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0ga3phbGxvYyhzaXplb2YoKmNoaXApLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2hpcCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKworCS8qIHRoaXMgaXMgb25seSB1c2VkIGZvciBkZXZpY2UgcmVtb3ZhbCBwdXJwb3NlcyAqLworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGNoaXApOworCisJY2hpcC0+Y2xpZW50ID0gY2xpZW50OworCWNoaXAtPm5hbWUgPSBpZC0+bmFtZTsKKworCWNoaXAtPmluZGlvX2RldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoY2hpcC0+aW5kaW9fZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX2NoaXA7CisJfQorCisJLyogRWNoaXBhYmlsaXNoIHRoYXQgdGhlIGlpb19kZXYgaXMgYSBjaGlsZCBvZiB0aGUgaTJjIGRldmljZSAqLworCWNoaXAtPmluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZjbGllbnQtPmRldjsKKwljaGlwLT5pbmRpb19kZXYtPmF0dHJzID0gJmFkNzE1MF9hdHRyaWJ1dGVfZ3JvdXA7CisJY2hpcC0+aW5kaW9fZGV2LT5ldmVudF9hdHRycyA9ICZhZDcxNTBfZXZlbnRfYXR0cmlidXRlX2dyb3VwOworCWNoaXAtPmluZGlvX2Rldi0+ZGV2X2RhdGEgPSAodm9pZCAqKShjaGlwKTsKKwljaGlwLT5pbmRpb19kZXYtPmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRTsKKwljaGlwLT5pbmRpb19kZXYtPm51bV9pbnRlcnJ1cHRfbGluZXMgPSAxOworCWNoaXAtPmluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoY2hpcC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2OworCXJlZ2RvbmUgPSAxOworCisJaWYgKGNsaWVudC0+aXJxICYmIGdwaW9faXNfdmFsaWQoaXJxX3RvX2dwaW8oY2xpZW50LT5pcnEpKSA+IDApIHsKKwkJcmV0ID0gaWlvX3JlZ2lzdGVyX2ludGVycnVwdF9saW5lKGNsaWVudC0+aXJxLAorCQkJCWNoaXAtPmluZGlvX2RldiwKKwkJCQkwLAorCQkJCUlSUUZfVFJJR0dFUl9SSVNJTkcgfCBJUlFGX1RSSUdHRVJfRkFMTElORywKKwkJCQkiYWQ3MTUwIik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX2ZyZWVfZGV2OworCisJCWlpb19hZGRfZXZlbnRfdG9fbGlzdChpaW9fZXZlbnRfYXR0cl9jaDJfbG93Lmxpc3RlbCwKKwkJCQkmY2hpcC0+aW5kaW9fZGV2LT5pbnRlcnJ1cHRzWzBdLT5ldl9saXN0KTsKKworCQlJTklUX1dPUksoJmNoaXAtPnRocmVzaF93b3JrLCBhZDcxNTBfaW50ZXJydXB0X2hhbmRsZXJfYmgpOworCX0KKworCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXMgY2FwYWNpdGl2ZSBzZW5zb3IgcmVnaXN0ZXJlZCwgaXJxOiAlZFxuIiwgaWQtPm5hbWUsIGNsaWVudC0+aXJxKTsKKworCXJldHVybiAwOworCitlcnJvcl9mcmVlX2RldjoKKwlpZiAocmVnZG9uZSkKKwkJaWlvX2RldmljZV91bnJlZ2lzdGVyKGNoaXAtPmluZGlvX2Rldik7CisJZWxzZQorCQlpaW9fZnJlZV9kZXZpY2UoY2hpcC0+aW5kaW9fZGV2KTsKK2Vycm9yX2ZyZWVfY2hpcDoKKwlrZnJlZShjaGlwKTsKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhZDcxNTBfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGFkNzE1MF9jaGlwX2luZm8gKmNoaXAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gY2hpcC0+aW5kaW9fZGV2OworCisJaWYgKGNsaWVudC0+aXJxICYmIGdwaW9faXNfdmFsaWQoaXJxX3RvX2dwaW8oY2xpZW50LT5pcnEpKSA+IDApCisJCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKGluZGlvX2RldiwgMCk7CisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJa2ZyZWUoY2hpcCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGFkNzE1MF9pZFtdID0geworCXsgImFkNzE1MCIsIDAgfSwKKwl7ICJhZDcxNTEiLCAwIH0sCisJeyAiYWQ3MTU2IiwgMCB9LAorCXt9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYWQ3MTUwX2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGFkNzE1MF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYWQ3MTUwIiwKKwl9LAorCS5wcm9iZSA9IGFkNzE1MF9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWQ3MTUwX3JlbW92ZSksCisJLmlkX3RhYmxlID0gYWQ3MTUwX2lkLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWQ3MTUwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmFkNzE1MF9kcml2ZXIpOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgYWQ3MTUwX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmYWQ3MTUwX2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIkJhcnJ5IFNvbmcgPDIxY25iYW9AZ21haWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBhZDcxNTAvMS82IGNhcGFjaXRpdmUgc2Vuc29yIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworCittb2R1bGVfaW5pdChhZDcxNTBfaW5pdCk7Cittb2R1bGVfZXhpdChhZDcxNTBfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDcxNTIuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzE1Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhN2Y4NDA2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3MTUyLmMKQEAgLTAsMCArMSw2MTAgQEAKKy8qCisgKiBBRDcxNTIgY2FwYWNpdGl2ZSBzZW5zb3IgZHJpdmVyIHN1cHBvcnRpbmcgQUQ3MTUyLzMKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKworLyoKKyAqIEFENzE1MiByZWdpc3RlcnMgZGVmaW5pdGlvbgorICovCisKKyNkZWZpbmUgQUQ3MTUyX1NUQVRVUyAgICAgICAgICAgICAgMAorI2RlZmluZSBBRDcxNTJfU1RBVFVTX1JEWTEgICAgICAgICAoMSA8PCAwKQorI2RlZmluZSBBRDcxNTJfU1RBVFVTX1JEWTIgICAgICAgICAoMSA8PCAxKQorI2RlZmluZSBBRDcxNTJfQ0gxX0RBVEFfSElHSCAgICAgICAxCisjZGVmaW5lIEFENzE1Ml9DSDFfREFUQV9MT1cgICAgICAgIDIKKyNkZWZpbmUgQUQ3MTUyX0NIMl9EQVRBX0hJR0ggICAgICAgMworI2RlZmluZSBBRDcxNTJfQ0gyX0RBVEFfTE9XICAgICAgICA0CisjZGVmaW5lIEFENzE1Ml9DSDFfT0ZGU19ISUdIICAgICAgIDUKKyNkZWZpbmUgQUQ3MTUyX0NIMV9PRkZTX0xPVyAgICAgICAgNgorI2RlZmluZSBBRDcxNTJfQ0gyX09GRlNfSElHSCAgICAgICA3CisjZGVmaW5lIEFENzE1Ml9DSDJfT0ZGU19MT1cgICAgICAgIDgKKyNkZWZpbmUgQUQ3MTUyX0NIMV9HQUlOX0hJR0ggICAgICAgOQorI2RlZmluZSBBRDcxNTJfQ0gxX0dBSU5fTE9XICAgICAgICAxMAorI2RlZmluZSBBRDcxNTJfQ0gxX1NFVFVQICAgICAgICAgICAxMQorI2RlZmluZSBBRDcxNTJfQ0gyX0dBSU5fSElHSCAgICAgICAxMgorI2RlZmluZSBBRDcxNTJfQ0gyX0dBSU5fTE9XICAgICAgICAxMworI2RlZmluZSBBRDcxNTJfQ0gyX1NFVFVQICAgICAgICAgICAxNAorI2RlZmluZSBBRDcxNTJfQ0ZHICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBBRDcxNTJfUkVTRVZFUkQgICAgICAgICAgICAxNgorI2RlZmluZSBBRDcxNTJfQ0FQREFDX1BPUyAgICAgICAgICAxNworI2RlZmluZSBBRDcxNTJfQ0FQREFDX05FRyAgICAgICAgICAxOAorI2RlZmluZSBBRDcxNTJfQ0ZHMiAgICAgICAgICAgICAgICAyNgorCisjZGVmaW5lIEFENzE1Ml9NQVhfQ09OVl9NT0RFICAgICAgIDYKKworLyoKKyAqIHN0cnVjdCBhZDcxNTJfY2hpcF9pbmZvIC0gY2hpcCBzcGVjaWZjIGluZm9ybWF0aW9uCisgKi8KKworc3RydWN0IGFkNzE1Ml9jaGlwX2luZm8geworCWNvbnN0IGNoYXIgKm5hbWU7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OworCXUxNiBjaDFfb2Zmc2V0OyAgICAgLyogQ2hhbm5lbCAxIG9mZnNldCBjYWxpYnJhdGlvbiBjb2VmZmljaWVudCAqLworCXUxNiBjaDFfZ2FpbjsgICAgICAgLyogQ2hhbm5lbCAxIGdhaW4gY29lZmZpY2llbnQgKi8KKwl1OCAgY2gxX3NldHVwOworCXUxNiBjaDJfb2Zmc2V0OyAgICAgLyogQ2hhbm5lbCAyIG9mZnNldCBjYWxpYnJhdGlvbiBjb2VmZmljaWVudCAqLworCXUxNiBjaDJfZ2FpbjsgICAgICAgLyogQ2hhbm5lbCAxIGdhaW4gY29lZmZpY2llbnQgKi8KKwl1OCAgY2gyX3NldHVwOworCXU4ICBmaWx0ZXJfcmF0ZV9zZXR1cDsgLyogQ2FwYWNpdGl2ZSBjaGFubmVsIGRpZ2l0YWwgZmlsdGVyIHNldHVwOyBjb252ZXJzaW9uIHRpbWUvdXBkYXRlIHJhdGUgc2V0dXAgcGVyIGNoYW5uZWwgKi8KKwljaGFyICpjb252ZXJzaW9uX21vZGU7Cit9OworCitzdHJ1Y3QgYWQ3MTUyX2NvbnZlcnNpb25fbW9kZSB7CisJY2hhciAqbmFtZTsKKwl1OCByZWdfY2ZnOworfTsKKworc3RydWN0IGFkNzE1Ml9jb252ZXJzaW9uX21vZGUgYWQ3MTUyX2NvbnZfbW9kZV90YWJsZVtBRDcxNTJfTUFYX0NPTlZfTU9ERV0gPSB7CisJeyAiaWRsZSIsIDAgfSwKKwl7ICJjb250aW51b3VzLWNvbnZlcnNpb24iLCAxIH0sCisJeyAic2luZ2xlLWNvbnZlcnNpb24iLCAyIH0sCisJeyAicG93ZXItZG93biIsIDMgfSwKKwl7ICJvZmZzZXQtY2FsaWJyYXRpb24iLCA1IH0sCisJeyAiZ2Fpbi1jYWxpYnJhdGlvbiIsIDYgfSwKK307CisKKy8qCisgKiBhZDcxNTIgcmVnaXN0ZXIgYWNjZXNzIGJ5IEkyQworICovCisKK3N0YXRpYyBpbnQgYWQ3MTUyX2kyY19yZWFkKHN0cnVjdCBhZDcxNTJfY2hpcF9pbmZvICpjaGlwLCB1OCByZWcsIHU4ICpkYXRhLCBpbnQgbGVuKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBjaGlwLT5jbGllbnQ7CisJaW50IHJldDsKKworCXJldCA9IGkyY19tYXN0ZXJfc2VuZChjbGllbnQsICZyZWcsIDEpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiSTJDIHdyaXRlIGVycm9yXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBpMmNfbWFzdGVyX3JlY3YoY2xpZW50LCBkYXRhLCBsZW4pOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiSTJDIHJlYWQgZXJyb3JcbiIpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWQ3MTUyX2kyY193cml0ZShzdHJ1Y3QgYWQ3MTUyX2NoaXBfaW5mbyAqY2hpcCwgdTggcmVnLCB1OCBkYXRhKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBjaGlwLT5jbGllbnQ7CisJaW50IHJldDsKKworCXU4IHR4WzJdID0geworCQlyZWcsCisJCWRhdGEsCisJfTsKKworCXJldCA9IGkyY19tYXN0ZXJfc2VuZChjbGllbnQsIHR4LCAyKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJMkMgd3JpdGUgZXJyb3JcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHN5c2ZzIG5vZGVzCisgKi8KKworI2RlZmluZSBJSU9fREVWX0FUVFJfQVZBSUxfQ09OVkVSU0lPTl9NT0RFUyhfc2hvdykJCQkJXAorCUlJT19ERVZJQ0VfQVRUUihhdmFpbGFibGVfY29udmVyc2lvbl9tb2RlcywgU19JUlVHTywgX3Nob3csIE5VTEwsIDApCisjZGVmaW5lIElJT19ERVZfQVRUUl9DT05WRVJTSU9OX01PREUoX21vZGUsIF9zaG93LCBfc3RvcmUpICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGNvbnZlcnNpb25fbW9kZSwgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCisjZGVmaW5lIElJT19ERVZfQVRUUl9DSDFfT0ZGU0VUKF9tb2RlLCBfc2hvdywgX3N0b3JlKQkJXAorCUlJT19ERVZJQ0VfQVRUUihjaDFfb2Zmc2V0LCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NIMl9PRkZTRVQoX21vZGUsIF9zaG93LCBfc3RvcmUpCQlcCisJSUlPX0RFVklDRV9BVFRSKGNoMl9vZmZzZXQsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCAwKQorI2RlZmluZSBJSU9fREVWX0FUVFJfQ0gxX0dBSU4oX21vZGUsIF9zaG93LCBfc3RvcmUpCQlcCisJSUlPX0RFVklDRV9BVFRSKGNoMV9nYWluLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NIMl9HQUlOKF9tb2RlLCBfc2hvdywgX3N0b3JlKQkJXAorCUlJT19ERVZJQ0VfQVRUUihjaDJfZ2FpbiwgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCisjZGVmaW5lIElJT19ERVZfQVRUUl9DSDFfVkFMVUUoX3Nob3cpCQlcCisJSUlPX0RFVklDRV9BVFRSKGNoMV92YWx1ZSwgU19JUlVHTywgX3Nob3csIE5VTEwsIDApCisjZGVmaW5lIElJT19ERVZfQVRUUl9DSDJfVkFMVUUoX3Nob3cpCQlcCisJSUlPX0RFVklDRV9BVFRSKGNoMl92YWx1ZSwgU19JUlVHTywgX3Nob3csIE5VTEwsIDApCisjZGVmaW5lIElJT19ERVZfQVRUUl9DSDFfU0VUVVAoX21vZGUsIF9zaG93LCBfc3RvcmUpCQlcCisJSUlPX0RFVklDRV9BVFRSKGNoMV9zZXR1cCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCisjZGVmaW5lIElJT19ERVZfQVRUUl9DSDJfU0VUVVAoX21vZGUsIF9zaG93LCBfc3RvcmUpICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGNoMl9zZXR1cCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCisjZGVmaW5lIElJT19ERVZfQVRUUl9GSUxURVJfUkFURV9TRVRVUChfbW9kZSwgX3Nob3csIF9zdG9yZSkgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoZmlsdGVyX3JhdGVfc2V0dXAsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCAwKQorCitzdGF0aWMgc3NpemVfdCBhZDcxNTJfc2hvd19jb252ZXJzaW9uX21vZGVzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlpbnQgaTsKKwlpbnQgbGVuID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBBRDcxNTJfTUFYX0NPTlZfTU9ERTsgaSsrKQorCQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICIlcyAiLCBhZDcxNTJfY29udl9tb2RlX3RhYmxlW2ldLm5hbWUpOworCisJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiXG4iKTsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfQVZBSUxfQ09OVkVSU0lPTl9NT0RFUyhhZDcxNTJfc2hvd19jb252ZXJzaW9uX21vZGVzKTsKKworc3RhdGljIHNzaXplX3QgYWQ3MTUyX3Nob3dfY2gxX3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUyX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1OCBkYXRhWzJdOworCisJYWQ3MTUyX2kyY19yZWFkKGNoaXAsIEFENzE1Ml9DSDFfREFUQV9ISUdILCBkYXRhLCAyKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgKChpbnQpZGF0YVswXSA8PCA4KSB8IGRhdGFbMV0pOworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX0NIMV9WQUxVRShhZDcxNTJfc2hvd19jaDFfdmFsdWUpOworCitzdGF0aWMgc3NpemVfdCBhZDcxNTJfc2hvd19jaDJfdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTJfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXU4IGRhdGFbMl07CisKKwlhZDcxNTJfaTJjX3JlYWQoY2hpcCwgQUQ3MTUyX0NIMl9EQVRBX0hJR0gsIGRhdGEsIDIpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAoKGludClkYXRhWzBdIDw8IDgpIHwgZGF0YVsxXSk7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0gyX1ZBTFVFKGFkNzE1Ml9zaG93X2NoMl92YWx1ZSk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1Ml9zaG93X2NvbnZlcnNpb25fbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzE1Ml9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgY2hpcC0+Y29udmVyc2lvbl9tb2RlKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3MTUyX3N0b3JlX2NvbnZlcnNpb25fbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzE1Ml9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTggY2ZnOworCWludCBpOworCisJYWQ3MTUyX2kyY19yZWFkKGNoaXAsIEFENzE1Ml9DRkcsICZjZmcsIDEpOworCisJZm9yIChpID0gMDsgaSA8IEFENzE1Ml9NQVhfQ09OVl9NT0RFOyBpKyspCisJCWlmIChzdHJuY21wKGJ1ZiwgYWQ3MTUyX2NvbnZfbW9kZV90YWJsZVtpXS5uYW1lLAorCQkJCXN0cmxlbihhZDcxNTJfY29udl9tb2RlX3RhYmxlW2ldLm5hbWUpIC0gMSkgPT0gMCkgeworCQkJY2hpcC0+Y29udmVyc2lvbl9tb2RlID0gYWQ3MTUyX2NvbnZfbW9kZV90YWJsZVtpXS5uYW1lOworCQkJY2ZnIHw9IDB4MTggfCBhZDcxNTJfY29udl9tb2RlX3RhYmxlW2ldLnJlZ19jZmc7CisJCQlhZDcxNTJfaTJjX3dyaXRlKGNoaXAsIEFENzE1Ml9DRkcsIGNmZyk7CisJCQlyZXR1cm4gbGVuOworCQl9CisKKwlkZXZfZXJyKGRldiwgIm5vdCBzdXBwb3J0ZWQgY29udmVyc2lvbiBtb2RlXG4iKTsKKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX0NPTlZFUlNJT05fTU9ERShTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQ3MTUyX3Nob3dfY29udmVyc2lvbl9tb2RlLAorCQlhZDcxNTJfc3RvcmVfY29udmVyc2lvbl9tb2RlKTsKKworc3RhdGljIHNzaXplX3QgYWQ3MTUyX3Nob3dfY2gxX29mZnNldChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzE1Ml9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgY2hpcC0+Y2gxX29mZnNldCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1Ml9zdG9yZV9jaDFfb2Zmc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUyX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKKworCWlmICgoIXJldCkgJiYgKGRhdGEgPCAweDEwMDAwKSkgeworCQlhZDcxNTJfaTJjX3dyaXRlKGNoaXAsIEFENzE1Ml9DSDFfT0ZGU19ISUdILCBkYXRhID4+IDgpOworCQlhZDcxNTJfaTJjX3dyaXRlKGNoaXAsIEFENzE1Ml9DSDFfT0ZGU19MT1csIGRhdGEpOworCQljaGlwLT5jaDFfb2Zmc2V0ID0gZGF0YTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9DSDFfT0ZGU0VUKFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDcxNTJfc2hvd19jaDFfb2Zmc2V0LAorCQlhZDcxNTJfc3RvcmVfY2gxX29mZnNldCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1Ml9zaG93X2NoMl9vZmZzZXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTJfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGNoaXAtPmNoMl9vZmZzZXQpOworfQorCitzdGF0aWMgc3NpemVfdCBhZDcxNTJfc3RvcmVfY2gyX29mZnNldChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzE1Ml9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7CisKKwlpZiAoKCFyZXQpICYmIChkYXRhIDwgMHgxMDAwMCkpIHsKKwkJYWQ3MTUyX2kyY193cml0ZShjaGlwLCBBRDcxNTJfQ0gyX09GRlNfSElHSCwgZGF0YSA+PiA4KTsKKwkJYWQ3MTUyX2kyY193cml0ZShjaGlwLCBBRDcxNTJfQ0gyX09GRlNfTE9XLCBkYXRhKTsKKwkJY2hpcC0+Y2gyX29mZnNldCA9IGRhdGE7CisJCXJldHVybiBsZW47CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0gyX09GRlNFVChTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQ3MTUyX3Nob3dfY2gyX29mZnNldCwKKwkJYWQ3MTUyX3N0b3JlX2NoMl9vZmZzZXQpOworCitzdGF0aWMgc3NpemVfdCBhZDcxNTJfc2hvd19jaDFfZ2FpbihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzE1Ml9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgY2hpcC0+Y2gxX2dhaW4pOworfQorCitzdGF0aWMgc3NpemVfdCBhZDcxNTJfc3RvcmVfY2gxX2dhaW4oc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTJfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOworCisJaWYgKCghcmV0KSAmJiAoZGF0YSA8IDB4MTAwMDApKSB7CisJCWFkNzE1Ml9pMmNfd3JpdGUoY2hpcCwgQUQ3MTUyX0NIMV9HQUlOX0hJR0gsIGRhdGEgPj4gOCk7CisJCWFkNzE1Ml9pMmNfd3JpdGUoY2hpcCwgQUQ3MTUyX0NIMV9HQUlOX0xPVywgZGF0YSk7CisJCWNoaXAtPmNoMV9nYWluID0gZGF0YTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9DSDFfR0FJTihTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQ3MTUyX3Nob3dfY2gxX2dhaW4sCisJCWFkNzE1Ml9zdG9yZV9jaDFfZ2Fpbik7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1Ml9zaG93X2NoMl9nYWluKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUyX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBjaGlwLT5jaDJfZ2Fpbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1Ml9zdG9yZV9jaDJfZ2FpbihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzE1Ml9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7CisKKwlpZiAoKCFyZXQpICYmIChkYXRhIDwgMHgxMDAwMCkpIHsKKwkJYWQ3MTUyX2kyY193cml0ZShjaGlwLCBBRDcxNTJfQ0gyX0dBSU5fSElHSCwgZGF0YSA+PiA4KTsKKwkJYWQ3MTUyX2kyY193cml0ZShjaGlwLCBBRDcxNTJfQ0gyX0dBSU5fTE9XLCBkYXRhKTsKKwkJY2hpcC0+Y2gyX2dhaW4gPSBkYXRhOworCQlyZXR1cm4gbGVuOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX0NIMl9HQUlOKFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDcxNTJfc2hvd19jaDJfZ2FpbiwKKwkJYWQ3MTUyX3N0b3JlX2NoMl9nYWluKTsKKworc3RhdGljIHNzaXplX3QgYWQ3MTUyX3Nob3dfY2gxX3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUyX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JTAyeFxuIiwgY2hpcC0+Y2gxX3NldHVwKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3MTUyX3N0b3JlX2NoMV9zZXR1cChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzE1Ml9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7CisKKwlpZiAoKCFyZXQpICYmIChkYXRhIDwgMHgxMDApKSB7CisJCWFkNzE1Ml9pMmNfd3JpdGUoY2hpcCwgQUQ3MTUyX0NIMV9TRVRVUCwgZGF0YSk7CisJCWNoaXAtPmNoMV9zZXR1cCA9IGRhdGE7CisJCXJldHVybiBsZW47CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0gxX1NFVFVQKFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDcxNTJfc2hvd19jaDFfc2V0dXAsCisJCWFkNzE1Ml9zdG9yZV9jaDFfc2V0dXApOworCitzdGF0aWMgc3NpemVfdCBhZDcxNTJfc2hvd19jaDJfc2V0dXAoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTJfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDJ4XG4iLCBjaGlwLT5jaDJfc2V0dXApOworfQorCitzdGF0aWMgc3NpemVfdCBhZDcxNTJfc3RvcmVfY2gyX3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUyX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKKworCWlmICgoIXJldCkgJiYgKGRhdGEgPCAweDEwMCkpIHsKKwkJYWQ3MTUyX2kyY193cml0ZShjaGlwLCBBRDcxNTJfQ0gyX1NFVFVQLCBkYXRhKTsKKwkJY2hpcC0+Y2gyX3NldHVwID0gZGF0YTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9DSDJfU0VUVVAoU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkNzE1Ml9zaG93X2NoMl9zZXR1cCwKKwkJYWQ3MTUyX3N0b3JlX2NoMl9zZXR1cCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1Ml9zaG93X2ZpbHRlcl9yYXRlX3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUyX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JTAyeFxuIiwgY2hpcC0+ZmlsdGVyX3JhdGVfc2V0dXApOworfQorCitzdGF0aWMgc3NpemVfdCBhZDcxNTJfc3RvcmVfZmlsdGVyX3JhdGVfc2V0dXAoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTJfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOworCisJaWYgKCghcmV0KSAmJiAoZGF0YSA8IDB4MTAwKSkgeworCQlhZDcxNTJfaTJjX3dyaXRlKGNoaXAsIEFENzE1Ml9DRkcyLCBkYXRhKTsKKwkJY2hpcC0+ZmlsdGVyX3JhdGVfc2V0dXAgPSBkYXRhOworCQlyZXR1cm4gbGVuOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX0ZJTFRFUl9SQVRFX1NFVFVQKFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDcxNTJfc2hvd19maWx0ZXJfcmF0ZV9zZXR1cCwKKwkJYWQ3MTUyX3N0b3JlX2ZpbHRlcl9yYXRlX3NldHVwKTsKKworc3RhdGljIHNzaXplX3QgYWQ3MTUyX3Nob3dfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzE1Ml9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIGNoaXAtPm5hbWUpOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIGFkNzE1Ml9zaG93X25hbWUsIE5VTEwsIDApOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWQ3MTUyX2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2Rldl9hdHRyX2F2YWlsYWJsZV9jb252ZXJzaW9uX21vZGVzLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jb252ZXJzaW9uX21vZGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NoMV9nYWluLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jaDJfZ2Fpbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2gxX29mZnNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2gyX29mZnNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2gxX3ZhbHVlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jaDJfdmFsdWUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NoMV9zZXR1cC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2gyX3NldHVwLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9maWx0ZXJfcmF0ZV9zZXR1cC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDcxNTJfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkNzE1Ml9hdHRyaWJ1dGVzLAorfTsKKworLyoKKyAqIGRldmljZSBwcm9iZSBhbmQgcmVtb3ZlCisgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgYWQ3MTUyX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYWQ3MTUyX2NoaXBfaW5mbyAqY2hpcCA9IGt6YWxsb2Moc2l6ZW9mKCpjaGlwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNoaXAgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisKKwkvKiB0aGlzIGlzIG9ubHkgdXNlZCBmb3IgZGV2aWNlIHJlbW92YWwgcHVycG9zZXMgKi8KKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBjaGlwKTsKKworCWNoaXAtPmNsaWVudCA9IGNsaWVudDsKKwljaGlwLT5uYW1lID0gaWQtPm5hbWU7CisKKwljaGlwLT5pbmRpb19kZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKGNoaXAtPmluZGlvX2RldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9jaGlwOworCX0KKworCS8qIEVjaGlwYWJpbGlzaCB0aGF0IHRoZSBpaW9fZGV2IGlzIGEgY2hpbGQgb2YgdGhlIGkyYyBkZXZpY2UgKi8KKwljaGlwLT5pbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmY2xpZW50LT5kZXY7CisJY2hpcC0+aW5kaW9fZGV2LT5hdHRycyA9ICZhZDcxNTJfYXR0cmlidXRlX2dyb3VwOworCWNoaXAtPmluZGlvX2Rldi0+ZGV2X2RhdGEgPSAodm9pZCAqKShjaGlwKTsKKwljaGlwLT5pbmRpb19kZXYtPmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRTsKKwljaGlwLT5pbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGNoaXAtPmluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldjsKKworCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXMgY2FwYWNpdGl2ZSBzZW5zb3IgcmVnaXN0ZXJlZFxuIiwgaWQtPm5hbWUpOworCisJcmV0dXJuIDA7CisKK2Vycm9yX2ZyZWVfZGV2OgorCWlpb19mcmVlX2RldmljZShjaGlwLT5pbmRpb19kZXYpOworZXJyb3JfZnJlZV9jaGlwOgorCWtmcmVlKGNoaXApOworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkNzE1Ml9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgYWQ3MTUyX2NoaXBfaW5mbyAqY2hpcCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBjaGlwLT5pbmRpb19kZXY7CisKKwlpZiAoY2xpZW50LT5pcnEgJiYgZ3Bpb19pc192YWxpZChpcnFfdG9fZ3BpbyhjbGllbnQtPmlycSkpID4gMCkKKwkJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoaW5kaW9fZGV2LCAwKTsKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlrZnJlZShjaGlwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgYWQ3MTUyX2lkW10gPSB7CisJeyAiYWQ3MTUyIiwgMCB9LAorCXsgImFkNzE1MyIsIDAgfSwKKwl7fQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGFkNzE1Ml9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBhZDcxNTJfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFkNzE1MiIsCisJfSwKKwkucHJvYmUgPSBhZDcxNTJfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFkNzE1Ml9yZW1vdmUpLAorCS5pZF90YWJsZSA9IGFkNzE1Ml9pZCwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGFkNzE1Ml9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZhZDcxNTJfZHJpdmVyKTsKK30KKworc3RhdGljIF9fZXhpdCB2b2lkIGFkNzE1Ml9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmFkNzE1Ml9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJCYXJyeSBTb25nIDwyMWNuYmFvQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgYWQ3MTUyLzMgY2FwYWNpdGl2ZSBzZW5zb3IgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CisKK21vZHVsZV9pbml0KGFkNzE1Ml9pbml0KTsKK21vZHVsZV9leGl0KGFkNzE1Ml9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzI5MS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3MjkxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQwNDFhNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzI5MS5jCkBAIC0wLDAgKzEsMTAzOSBAQAorLyoKKyAqIEFENzI5MSBkaWdpdGFsIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIgc3VwcG9ydGluZyBBRDcyOTEKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKworLyoKKyAqIEFENzI5MSByZWdpc3RlcnMgZGVmaW5pdGlvbgorICovCisjZGVmaW5lIEFENzI5MV9DT01NQU5ECQkJMAorI2RlZmluZSBBRDcyOTFfVk9MVEFHRQkJCTEKKyNkZWZpbmUgQUQ3MjkxX1RfU0VOU0UJCQkyCisjZGVmaW5lIEFENzI5MV9UX0FWRVJBR0UJCTMKKyNkZWZpbmUgQUQ3MjkxX1ZPTFRBR0VfTElNSVRfQkFTRQk0CisjZGVmaW5lIEFENzI5MV9WT0xUQUdFX0xJTUlUX0NPVU5UCTgKKyNkZWZpbmUgQUQ3MjkxX1RfU0VOU0VfSElHSAkJMHgxYworI2RlZmluZSBBRDcyOTFfVF9TRU5TRV9MT1cJCTB4MWQKKyNkZWZpbmUgQUQ3MjkxX1RfU0VOU0VfSFlTVAkJMHgxZQorI2RlZmluZSBBRDcyOTFfVk9MVEFHRV9BTEVSVF9TVEFUVVMJMHgxZgorI2RlZmluZSBBRDcyOTFfVF9BTEVSVF9TVEFUVVMJCTB4MjAKKworLyoKKyAqIEFENzI5MSBjb21tYW5kCisgKi8KKyNkZWZpbmUgQUQ3MjkxX0FVVE9DWUNMRQkJMHgxCisjZGVmaW5lIEFENzI5MV9SRVNFVAkJCTB4MgorI2RlZmluZSBBRDcyOTFfQUxBUlRfQ0xFQVIJCTB4NAorI2RlZmluZSBBRDcyOTFfQUxBUlRfUE9MQVJJVFkJCTB4OAorI2RlZmluZSBBRDcyOTFfRVhUX1JFRgkJCTB4MTAKKyNkZWZpbmUgQUQ3MjkxX05PSVNFX0RFTEFZCQkweDIwCisjZGVmaW5lIEFENzI5MV9UX1NFTlNFX01BU0sJCTB4NDAKKyNkZWZpbmUgQUQ3MjkxX1ZPTFRBR0VfTUFTSwkJMHhmZjAwCisjZGVmaW5lIEFENzI5MV9WT0xUQUdFX09GRlNFVAkJMHg4CisKKy8qCisgKiBBRDcyOTEgdmFsdWUgbWFza3MKKyAqLworI2RlZmluZSBBRDcyOTFfQ0hBTk5FTF9NQVNLCQkweGYwMDAKKyNkZWZpbmUgQUQ3MjkxX1ZBTFVFX01BU0sJCTB4ZmZmCisjZGVmaW5lIEFENzI5MV9UX1ZBTFVFX1NJR04JCTB4NDAwCisjZGVmaW5lIEFENzI5MV9UX1ZBTFVFX0ZMT0FUX09GRlNFVAkyCisjZGVmaW5lIEFENzI5MV9UX1ZBTFVFX0ZMT0FUX01BU0sJMHgyCisKKy8qCisgKiBzdHJ1Y3QgYWQ3MjkxX2NoaXBfaW5mbyAtIGNoaXAgc3BlY2lmYyBpbmZvcm1hdGlvbgorICovCisKK3N0cnVjdCBhZDcyOTFfY2hpcF9pbmZvIHsKKwljb25zdCBjaGFyICpuYW1lOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdGhyZXNoX3dvcms7CisJczY0IGxhc3RfdGltZXN0YW1wOworCXUxNiBjb21tYW5kOworCXU4ICBjaGFubmVsczsJLyogQWN0aXZlIHZvbHRhZ2UgY2hhbm5lbHMgKi8KK307CisKKy8qCisgKiBzdHJ1Y3QgYWQ3MjkxX2NoaXBfaW5mbyAtIGNoaXAgc3BlY2lmYyBpbmZvcm1hdGlvbgorICovCisKK3N0cnVjdCBhZDcyOTFfbGltaXRfcmVncyB7CisJdTE2CWRhdGFfaGlnaDsKKwl1MTYJZGF0YV9sb3c7CisJdTE2CWh5c3RlcmVzaXM7Cit9OworCisvKgorICogYWQ3MjkxIHJlZ2lzdGVyIGFjY2VzcyBieSBJMkMKKyAqLworc3RhdGljIGludCBhZDcyOTFfaTJjX3JlYWQoc3RydWN0IGFkNzI5MV9jaGlwX2luZm8gKmNoaXAsIHU4IHJlZywgdTE2ICpkYXRhKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBjaGlwLT5jbGllbnQ7CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCByZWcpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiSTJDIHJlYWQgZXJyb3JcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCSpkYXRhID0gc3dhYjE2KCh1MTYpcmV0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkNzI5MV9pMmNfd3JpdGUoc3RydWN0IGFkNzI5MV9jaGlwX2luZm8gKmNoaXAsIHU4IHJlZywgdTE2IGRhdGEpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNoaXAtPmNsaWVudDsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IGkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCByZWcsIHN3YWIxNihkYXRhKSk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiSTJDIHdyaXRlIGVycm9yXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIFJldHVybnMgbmVnYXRpdmUgZXJybm8sIG9yIGVsc2UgdGhlIG51bWJlciBvZiB3b3JkcyByZWFkLiAqLworc3RhdGljIGludCBhZDcyOTFfaTJjX3JlYWRfZGF0YShzdHJ1Y3QgYWQ3MjkxX2NoaXBfaW5mbyAqY2hpcCwgdTggcmVnLCB1MTYgKmRhdGEpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNoaXAtPmNsaWVudDsKKwl1OCBjb21tYW5kc1s0XTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaSwgY291bnQ7CisKKwlpZiAocmVnID09IEFENzI5MV9UX1NFTlNFIHx8IHJlZyA9PSBBRDcyOTFfVF9BVkVSQUdFKQorCQljb3VudCA9IDI7CisJZWxzZSBpZiAocmVnID09IEFENzI5MV9WT0xUQUdFKSB7CisJCWlmICghY2hpcC0+Y2hhbm5lbHMpIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiTm8gdm9sdGFnZSBjaGFubmVsIGlzIHNlbGVjdGVkLlxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQljb3VudCA9IDIgKyBjaGlwLT5jaGFubmVscyAqIDI7CisJfSBlbHNlIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJMkMgd3JvbmcgZGF0YSByZWdpc3RlclxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNvbW1hbmRzWzBdID0gMDsKKwljb21tYW5kc1sxXSA9IChjaGlwLT5jb21tYW5kID4+IDgpICYgMHhmZjsKKwljb21tYW5kc1syXSA9IGNoaXAtPmNvbW1hbmQgJiAweGZmOworCWNvbW1hbmRzWzNdID0gcmVnOworCisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgY29tbWFuZHMsIDQpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiSTJDIG1hc3RlciBzZW5kIGVycm9yXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBpMmNfbWFzdGVyX3JlY3YoY2xpZW50LCAodTggKilkYXRhLCBjb3VudCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJMkMgbWFzdGVyIHJlY2VpdmUgZXJyb3JcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXQgPj49IDI7CisKKwlmb3IgKGkgPSAwOyBpIDwgcmV0OyBpKyspCisJCWRhdGFbaV0gPSBzd2FiMTYoZGF0YVtpXSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZDcyOTFfc2hvd19tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MjkxX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCWlmIChjaGlwLT5jb21tYW5kICYgQUQ3MjkxX0FVVE9DWUNMRSkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiYXV0b2N5Y2xlXG4iKTsKKwllbHNlCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgImNvbW1hbmRcbiIpOworfQorCitzdGF0aWMgc3NpemVfdCBhZDcyOTFfc3RvcmVfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzI5MV9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTE2IGNvbW1hbmQ7CisJaW50IHJldDsKKworCWNvbW1hbmQgPSBjaGlwLT5jb21tYW5kICYgKH5BRDcyOTFfQVVUT0NZQ0xFKTsKKwlpZiAoc3RyY21wKGJ1ZiwgImF1dG9jeWNsZSIpKQorCQljb21tYW5kIHw9IEFENzI5MV9BVVRPQ1lDTEU7CisKKwlyZXQgPSBhZDcyOTFfaTJjX3dyaXRlKGNoaXAsIEFENzI5MV9DT01NQU5ELCBjb21tYW5kKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNoaXAtPmNvbW1hbmQgPSBjb21tYW5kOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihtb2RlLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQ3MjkxX3Nob3dfbW9kZSwKKwkJYWQ3MjkxX3N0b3JlX21vZGUsCisJCTApOworCitzdGF0aWMgc3NpemVfdCBhZDcyOTFfc2hvd19hdmFpbGFibGVfbW9kZXMoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgImNvbW1hbmRcbmF1dG9jeWNsZVxuIik7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoYXZhaWxhYmxlX21vZGVzLCBTX0lSVUdPLCBhZDcyOTFfc2hvd19hdmFpbGFibGVfbW9kZXMsIE5VTEwsIDApOworCitzdGF0aWMgc3NpemVfdCBhZDcyOTFfc3RvcmVfcmVzZXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcyOTFfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXUxNiBjb21tYW5kOworCWludCByZXQ7CisKKwljb21tYW5kID0gY2hpcC0+Y29tbWFuZCB8IEFENzI5MV9SRVNFVDsKKworCXJldCA9IGFkNzI5MV9pMmNfd3JpdGUoY2hpcCwgQUQ3MjkxX0NPTU1BTkQsIGNvbW1hbmQpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihyZXNldCwgU19JV1VTUiwKKwkJTlVMTCwKKwkJYWQ3MjkxX3N0b3JlX3Jlc2V0LAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWQ3MjkxX3Nob3dfZXh0X3JlZihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzI5MV9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgISEoY2hpcC0+Y29tbWFuZCAmIEFENzI5MV9FWFRfUkVGKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzI5MV9zdG9yZV9leHRfcmVmKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MjkxX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1MTYgY29tbWFuZDsKKwlpbnQgcmV0OworCisJY29tbWFuZCA9IGNoaXAtPmNvbW1hbmQgJiAofkFENzI5MV9FWFRfUkVGKTsKKwlpZiAoc3RyY21wKGJ1ZiwgIjEiKSkKKwkJY29tbWFuZCB8PSBBRDcyOTFfRVhUX1JFRjsKKworCXJldCA9IGFkNzI5MV9pMmNfd3JpdGUoY2hpcCwgQUQ3MjkxX0NPTU1BTkQsIGNvbW1hbmQpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+Y29tbWFuZCA9IGNvbW1hbmQ7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGV4dF9yZWYsIFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDcyOTFfc2hvd19leHRfcmVmLAorCQlhZDcyOTFfc3RvcmVfZXh0X3JlZiwKKwkJMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzI5MV9zaG93X25vaXNlX2RlbGF5KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MjkxX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAhIShjaGlwLT5jb21tYW5kICYgQUQ3MjkxX05PSVNFX0RFTEFZKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzI5MV9zdG9yZV9ub2lzZV9kZWxheShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzI5MV9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTE2IGNvbW1hbmQ7CisJaW50IHJldDsKKworCWNvbW1hbmQgPSBjaGlwLT5jb21tYW5kICYgKH5BRDcyOTFfTk9JU0VfREVMQVkpOworCWlmIChzdHJjbXAoYnVmLCAiMSIpKQorCQljb21tYW5kIHw9IEFENzI5MV9OT0lTRV9ERUxBWTsKKworCXJldCA9IGFkNzI5MV9pMmNfd3JpdGUoY2hpcCwgQUQ3MjkxX0NPTU1BTkQsIGNvbW1hbmQpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+Y29tbWFuZCA9IGNvbW1hbmQ7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKG5vaXNlX2RlbGF5LCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQ3MjkxX3Nob3dfbm9pc2VfZGVsYXksCisJCWFkNzI5MV9zdG9yZV9ub2lzZV9kZWxheSwKKwkJMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzI5MV9zaG93X3Rfc2Vuc2Uoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcyOTFfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXUxNiBkYXRhOworCWNoYXIgc2lnbiA9ICcgJzsKKwlpbnQgcmV0OworCisJcmV0ID0gYWQ3MjkxX2kyY19yZWFkX2RhdGEoY2hpcCwgQUQ3MjkxX1RfU0VOU0UsICZkYXRhKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChkYXRhICYgQUQ3MjkxX1RfVkFMVUVfU0lHTikgeworCQkvKiBjb252ZXJ0IHN1cHBsZW1lbnQgdG8gcG9zaXRpdmUgdmFsdWUgKi8KKwkJZGF0YSA9IChBRDcyOTFfVF9WQUxVRV9TSUdOIDw8IDEpIC0gZGF0YTsKKwkJc2lnbiA9ICctJzsKKwl9CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlYyVkLiUuMmRcbiIsIHNpZ24sCisJCShkYXRhID4+IEFENzI5MV9UX1ZBTFVFX0ZMT0FUX09GRlNFVCksCisJCShkYXRhICYgQUQ3MjkxX1RfVkFMVUVfRkxPQVRfTUFTSykgKiAyNSk7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIodF9zZW5zZSwgU19JUlVHTywgYWQ3MjkxX3Nob3dfdF9zZW5zZSwgTlVMTCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzI5MV9zaG93X3RfYXZlcmFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzI5MV9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTE2IGRhdGE7CisJY2hhciBzaWduID0gJyAnOworCWludCByZXQ7CisKKwlyZXQgPSBhZDcyOTFfaTJjX3JlYWRfZGF0YShjaGlwLCBBRDcyOTFfVF9BVkVSQUdFLCAmZGF0YSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoZGF0YSAmIEFENzI5MV9UX1ZBTFVFX1NJR04pIHsKKwkJLyogY29udmVydCBzdXBwbGVtZW50IHRvIHBvc2l0aXZlIHZhbHVlICovCisJCWRhdGEgPSAoQUQ3MjkxX1RfVkFMVUVfU0lHTiA8PCAxKSAtIGRhdGE7CisJCXNpZ24gPSAnLSc7CisJfQorCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWMlZC4lLjJkXG4iLCBzaWduLAorCQkoZGF0YSA+PiBBRDcyOTFfVF9WQUxVRV9GTE9BVF9PRkZTRVQpLAorCQkoZGF0YSAmIEFENzI5MV9UX1ZBTFVFX0ZMT0FUX01BU0spICogMjUpOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKHRfYXZlcmFnZSwgU19JUlVHTywgYWQ3MjkxX3Nob3dfdF9hdmVyYWdlLCBOVUxMLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWQ3MjkxX3Nob3dfdm9sdGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzI5MV9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTE2IGRhdGFbQUQ3MjkxX1ZPTFRBR0VfTElNSVRfQ09VTlRdOworCWludCBpLCBzaXplLCByZXQ7CisKKwlyZXQgPSBhZDcyOTFfaTJjX3JlYWRfZGF0YShjaGlwLCBBRDcyOTFfVk9MVEFHRSwgZGF0YSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlmb3IgKGkgPSAwOyBpIDwgQUQ3MjkxX1ZPTFRBR0VfTElNSVRfQ09VTlQ7IGkrKykgeworCQlpZiAoY2hpcC0+Y29tbWFuZCAmIChBRDcyOTFfVF9TRU5TRV9NQVNLIDw8IGkpKSB7CisJCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgImNoYW5uZWxbJWRdPSVkXG4iLCBpLAorCQkJCQlkYXRhW2ldICYgQUQ3MjkxX1ZBTFVFX01BU0spOworCQkJaWYgKHJldCA8IDApCisJCQkJYnJlYWs7CisJCQlidWYgKz0gcmV0OworCQkJc2l6ZSArPSByZXQ7CisJCX0KKwl9CisKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUih2b2x0YWdlLCBTX0lSVUdPLCBhZDcyOTFfc2hvd192b2x0YWdlLCBOVUxMLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWQ3MjkxX3Nob3dfY2hhbm5lbF9tYXNrKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MjkxX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JXhcbiIsIChjaGlwLT5jb21tYW5kICYgQUQ3MjkxX1ZPTFRBR0VfTUFTSykgPj4KKwkJCUFENzI5MV9WT0xUQUdFX09GRlNFVCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzI5MV9zdG9yZV9jaGFubmVsX21hc2soc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcyOTFfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXUxNiBjb21tYW5kOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlpbnQgaSwgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxNiwgJmRhdGEpOworCWlmIChyZXQgfHwgZGF0YSA+IDB4ZmYpCisJCXJldHVybiAtRUlOVkFMOworCisJY29tbWFuZCA9IGNoaXAtPmNvbW1hbmQgJiAofkFENzI5MV9WT0xUQUdFX01BU0spOworCWNvbW1hbmQgfD0gZGF0YSA8PCBBRDcyOTFfVk9MVEFHRV9PRkZTRVQ7CisKKwlyZXQgPSBhZDcyOTFfaTJjX3dyaXRlKGNoaXAsIEFENzI5MV9DT01NQU5ELCBjb21tYW5kKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNoaXAtPmNvbW1hbmQgPSBjb21tYW5kOworCisJZm9yIChpID0gMCwgY2hpcC0+Y2hhbm5lbHMgPSAwOyBpIDwgQUQ3MjkxX1ZPTFRBR0VfTElNSVRfQ09VTlQ7IGkrKykgeworCQlpZiAoY2hpcC0+Y29tbWFuZCAmIChBRDcyOTFfVF9TRU5TRV9NQVNLIDw8IGkpKQorCQkJY2hpcC0+Y2hhbm5lbHMrKzsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGNoYW5uZWxfbWFzaywgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkNzI5MV9zaG93X2NoYW5uZWxfbWFzaywKKwkJYWQ3MjkxX3N0b3JlX2NoYW5uZWxfbWFzaywKKwkJMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzI5MV9zaG93X25hbWUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcyOTFfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBjaGlwLT5uYW1lKTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBhZDcyOTFfc2hvd19uYW1lLCBOVUxMLCAwKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkNzI5MV9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19kZXZfYXR0cl9hdmFpbGFibGVfbW9kZXMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX21vZGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3Jlc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9leHRfcmVmLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9ub2lzZV9kZWxheS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfdF9zZW5zZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfdF9hdmVyYWdlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl92b2x0YWdlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jaGFubmVsX21hc2suZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX25hbWUuZGV2X2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWQ3MjkxX2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZDcyOTFfYXR0cmlidXRlcywKK307CisKKy8qCisgKiB0ZW1wZXJhdHVyZSBib3VuZCBldmVudHMKKyAqLworCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0FENzI5MV9UX1NFTlNFX0hJR0ggIElJT19CVUZGRVJfRVZFTlRfQ09ERSgwKQorI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9BRDcyOTFfVF9TRU5TRV9MT1cgICBJSU9fQlVGRkVSX0VWRU5UX0NPREUoMSkKKyNkZWZpbmUgSUlPX0VWRU5UX0NPREVfQUQ3MjkxX1RfQVZHX0hJR0ggICAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDIpCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0FENzI5MV9UX0FWR19MT1cgICAgIElJT19CVUZGRVJfRVZFTlRfQ09ERSgzKQorI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9BRDcyOTFfVk9MVEFHRV9CQVNFICBJSU9fQlVGRkVSX0VWRU5UX0NPREUoNCkKKworc3RhdGljIHZvaWQgYWQ3MjkxX2ludGVycnVwdF9iaChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmtfcykKK3sKKwlzdHJ1Y3QgYWQ3MjkxX2NoaXBfaW5mbyAqY2hpcCA9CisJCWNvbnRhaW5lcl9vZih3b3JrX3MsIHN0cnVjdCBhZDcyOTFfY2hpcF9pbmZvLCB0aHJlc2hfd29yayk7CisJdTE2IHRfc3RhdHVzLCB2X3N0YXR1czsKKwl1MTYgY29tbWFuZDsKKwlpbnQgaTsKKworCWlmIChhZDcyOTFfaTJjX3JlYWQoY2hpcCwgQUQ3MjkxX1RfQUxFUlRfU1RBVFVTLCAmdF9zdGF0dXMpKQorCQlyZXR1cm47CisKKwlpZiAoYWQ3MjkxX2kyY19yZWFkKGNoaXAsIEFENzI5MV9WT0xUQUdFX0FMRVJUX1NUQVRVUywgJnZfc3RhdHVzKSkKKwkJcmV0dXJuOworCisJaWYgKCEodF9zdGF0dXMgfHwgdl9zdGF0dXMpKQorCQlyZXR1cm47CisKKwljb21tYW5kID0gY2hpcC0+Y29tbWFuZCB8IEFENzI5MV9BTEFSVF9DTEVBUjsKKwlhZDcyOTFfaTJjX3dyaXRlKGNoaXAsIEFENzI5MV9DT01NQU5ELCBjb21tYW5kKTsKKworCWNvbW1hbmQgPSBjaGlwLT5jb21tYW5kICYgfkFENzI5MV9BTEFSVF9DTEVBUjsKKwlhZDcyOTFfaTJjX3dyaXRlKGNoaXAsIEFENzI5MV9DT01NQU5ELCBjb21tYW5kKTsKKworCWVuYWJsZV9pcnEoY2hpcC0+Y2xpZW50LT5pcnEpOworCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlpZiAodF9zdGF0dXMgJiAoMSA8PCBpKSkKKwkJCWlpb19wdXNoX2V2ZW50KGNoaXAtPmluZGlvX2RldiwgMCwKKwkJCQlJSU9fRVZFTlRfQ09ERV9BRDcyOTFfVF9TRU5TRV9ISUdIICsgaSwKKwkJCQljaGlwLT5sYXN0X3RpbWVzdGFtcCk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFENzI5MV9WT0xUQUdFX0xJTUlUX0NPVU5UKjI7IGkrKykgeworCQlpZiAodl9zdGF0dXMgJiAoMSA8PCBpKSkKKwkJCWlpb19wdXNoX2V2ZW50KGNoaXAtPmluZGlvX2RldiwgMCwKKwkJCQlJSU9fRVZFTlRfQ09ERV9BRDcyOTFfVk9MVEFHRV9CQVNFICsgaSwKKwkJCQljaGlwLT5sYXN0X3RpbWVzdGFtcCk7CisJfQorfQorCitzdGF0aWMgaW50IGFkNzI5MV9pbnRlcnJ1cHQoc3RydWN0IGlpb19kZXYgKmRldl9pbmZvLAorCQlpbnQgaW5kZXgsCisJCXM2NCB0aW1lc3RhbXAsCisJCWludCBub190ZXN0KQoreworCXN0cnVjdCBhZDcyOTFfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJY2hpcC0+bGFzdF90aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisJc2NoZWR1bGVfd29yaygmY2hpcC0+dGhyZXNoX3dvcmspOworCisJcmV0dXJuIDA7Cit9CisKK0lJT19FVkVOVF9TSChhZDcyOTEsICZhZDcyOTFfaW50ZXJydXB0KTsKKworc3RhdGljIGlubGluZSBzc2l6ZV90IGFkNzI5MV9zaG93X3RfYm91bmQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJdTggYm91bmRfcmVnLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzI5MV9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTE2IGRhdGE7CisJY2hhciBzaWduID0gJyAnOworCWludCByZXQ7CisKKwlyZXQgPSBhZDcyOTFfaTJjX3JlYWQoY2hpcCwgYm91bmRfcmVnLCAmZGF0YSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlkYXRhICY9IEFENzI5MV9WQUxVRV9NQVNLOworCWlmIChkYXRhICYgQUQ3MjkxX1RfVkFMVUVfU0lHTikgeworCQkvKiBjb252ZXJ0IHN1cHBsZW1lbnQgdG8gcG9zaXRpdmUgdmFsdWUgKi8KKwkJZGF0YSA9IChBRDcyOTFfVF9WQUxVRV9TSUdOIDw8IDEpIC0gZGF0YTsKKwkJc2lnbiA9ICctJzsKKwl9CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlYyVkLiUuMmRcbiIsIHNpZ24sCisJCQlkYXRhID4+IEFENzI5MV9UX1ZBTFVFX0ZMT0FUX09GRlNFVCwKKwkJCShkYXRhICYgQUQ3MjkxX1RfVkFMVUVfRkxPQVRfTUFTSykgKiAyNSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZDcyOTFfc2V0X3RfYm91bmQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJdTggYm91bmRfcmVnLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzI5MV9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJbG9uZyB0bXAxLCB0bXAyOworCXUxNiBkYXRhOworCWNoYXIgKnBvczsKKwlpbnQgcmV0OworCisJcG9zID0gc3RyY2hyKGJ1ZiwgJy4nKTsKKworCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnRtcDEpOworCisJaWYgKHJldCB8fCB0bXAxID4gMTI3IHx8IHRtcDEgPCAtMTI4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwb3MpIHsKKwkJbGVuID0gc3RybGVuKHBvcyk7CisJCWlmIChsZW4gPiBBRDcyOTFfVF9WQUxVRV9GTE9BVF9PRkZTRVQpCisJCQlsZW4gPSBBRDcyOTFfVF9WQUxVRV9GTE9BVF9PRkZTRVQ7CisJCXBvc1tsZW5dID0gMDsKKwkJcmV0ID0gc3RyaWN0X3N0cnRvbChwb3MsIDEwLCAmdG1wMik7CisKKwkJaWYgKCFyZXQpCisJCQl0bXAyID0gKHRtcDIgLyAyNSkgKiAyNTsKKwl9CisKKwlpZiAodG1wMSA8IDApCisJCWRhdGEgPSAodTE2KSgtdG1wMSk7CisJZWxzZQorCQlkYXRhID0gKHUxNil0bXAxOworCWRhdGEgPSAoZGF0YSA8PCBBRDcyOTFfVF9WQUxVRV9GTE9BVF9PRkZTRVQpIHwKKwkJKHRtcDIgJiBBRDcyOTFfVF9WQUxVRV9GTE9BVF9NQVNLKTsKKwlpZiAodG1wMSA8IDApCisJCS8qIGNvbnZlcnQgcG9zaXRpdmUgdmFsdWUgdG8gc3VwcGx5bWVudCAqLworCQlkYXRhID0gKEFENzI5MV9UX1ZBTFVFX1NJR04gPDwgMSkgLSBkYXRhOworCisJcmV0ID0gYWQ3MjkxX2kyY193cml0ZShjaGlwLCBib3VuZF9yZWcsIGRhdGEpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3MjkxX3Nob3dfdF9zZW5zZV9oaWdoKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gYWQ3MjkxX3Nob3dfdF9ib3VuZChkZXYsIGF0dHIsCisJCQlBRDcyOTFfVF9TRU5TRV9ISUdILCBidWYpOworfQorCitzdGF0aWMgaW5saW5lIHNzaXplX3QgYWQ3MjkxX3NldF90X3NlbnNlX2hpZ2goc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXJldHVybiBhZDcyOTFfc2V0X3RfYm91bmQoZGV2LCBhdHRyLAorCQkJQUQ3MjkxX1RfU0VOU0VfSElHSCwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgc3NpemVfdCBhZDcyOTFfc2hvd190X3NlbnNlX2xvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJcmV0dXJuIGFkNzI5MV9zaG93X3RfYm91bmQoZGV2LCBhdHRyLAorCQkJQUQ3MjkxX1RfU0VOU0VfTE9XLCBidWYpOworfQorCitzdGF0aWMgaW5saW5lIHNzaXplX3QgYWQ3MjkxX3NldF90X3NlbnNlX2xvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJcmV0dXJuIGFkNzI5MV9zZXRfdF9ib3VuZChkZXYsIGF0dHIsCisJCQlBRDcyOTFfVF9TRU5TRV9MT1csIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3MjkxX3Nob3dfdF9zZW5zZV9oeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gYWQ3MjkxX3Nob3dfdF9ib3VuZChkZXYsIGF0dHIsCisJCQlBRDcyOTFfVF9TRU5TRV9IWVNULCBidWYpOworfQorCitzdGF0aWMgaW5saW5lIHNzaXplX3QgYWQ3MjkxX3NldF90X3NlbnNlX2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXJldHVybiBhZDcyOTFfc2V0X3RfYm91bmQoZGV2LCBhdHRyLAorCQkJQUQ3MjkxX1RfU0VOU0VfSFlTVCwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgaW5saW5lIHNzaXplX3QgYWQ3MjkxX3Nob3dfdl9ib3VuZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQl1OCBib3VuZF9yZWcsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MjkxX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1MTYgZGF0YTsKKwlpbnQgcmV0OworCisJaWYgKGJvdW5kX3JlZyA8IEFENzI5MV9WT0xUQUdFX0xJTUlUX0JBU0UgfHwKKwkJYm91bmRfcmVnID49IEFENzI5MV9WT0xUQUdFX0xJTUlUX0JBU0UgKworCQlBRDcyOTFfVk9MVEFHRV9MSU1JVF9DT1VOVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBhZDcyOTFfaTJjX3JlYWQoY2hpcCwgYm91bmRfcmVnLCAmZGF0YSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlkYXRhICY9IEFENzI5MV9WQUxVRV9NQVNLOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEpOworfQorCitzdGF0aWMgaW5saW5lIHNzaXplX3QgYWQ3MjkxX3NldF92X2JvdW5kKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCXU4IGJvdW5kX3JlZywKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcyOTFfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisJdTE2IGRhdGE7CisJaW50IHJldDsKKworCWlmIChib3VuZF9yZWcgPCBBRDcyOTFfVk9MVEFHRV9MSU1JVF9CQVNFIHx8CisJCWJvdW5kX3JlZyA+PSBBRDcyOTFfVk9MVEFHRV9MSU1JVF9CQVNFICsKKwkJQUQ3MjkxX1ZPTFRBR0VfTElNSVRfQ09VTlQpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJnZhbHVlKTsKKworCWlmIChyZXQgfHwgdmFsdWUgPj0gNDA5NikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkYXRhID0gKHUxNil2YWx1ZTsKKwlyZXQgPSBhZDcyOTFfaTJjX3dyaXRlKGNoaXAsIGJvdW5kX3JlZywgZGF0YSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkNzI5MV9nZXRfdm9sdGFnZV9saW1pdF9yZWdzKGNvbnN0IGNoYXIgKmNoYW5uZWwpCit7CisJaW50IGluZGV4OworCisJaWYgKHN0cmxlbihjaGFubmVsKSA8IDMgJiYgY2hhbm5lbFswXSAhPSAndicpCisJCXJldHVybiAtRUlOVkFMOworCisJaW5kZXggPSBjaGFubmVsWzFdIC0gJzAnOworCWlmIChpbmRleCA+PSBBRDcyOTFfVk9MVEFHRV9MSU1JVF9DT1VOVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gaW5kZXg7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzI5MV9zaG93X3ZvbHRhZ2VfaGlnaChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJaW50IHJlZ3M7CisKKwlyZWdzID0gYWQ3MjkxX2dldF92b2x0YWdlX2xpbWl0X3JlZ3MoYXR0ci0+YXR0ci5uYW1lKTsKKworCWlmIChyZWdzIDwgMCkKKwkJcmV0dXJuIHJlZ3M7CisKKwlyZXR1cm4gYWQ3MjkxX3Nob3dfdF9ib3VuZChkZXYsIGF0dHIsIHJlZ3MsIGJ1Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZDcyOTFfc2V0X3ZvbHRhZ2VfaGlnaChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJaW50IHJlZ3M7CisKKwlyZWdzID0gYWQ3MjkxX2dldF92b2x0YWdlX2xpbWl0X3JlZ3MoYXR0ci0+YXR0ci5uYW1lKTsKKworCWlmIChyZWdzIDwgMCkKKwkJcmV0dXJuIHJlZ3M7CisKKwlyZXR1cm4gYWQ3MjkxX3NldF90X2JvdW5kKGRldiwgYXR0ciwgcmVncywgYnVmLCBsZW4pOworfQorCitzdGF0aWMgc3NpemVfdCBhZDcyOTFfc2hvd192b2x0YWdlX2xvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJaW50IHJlZ3M7CisKKwlyZWdzID0gYWQ3MjkxX2dldF92b2x0YWdlX2xpbWl0X3JlZ3MoYXR0ci0+YXR0ci5uYW1lKTsKKworCWlmIChyZWdzIDwgMCkKKwkJcmV0dXJuIHJlZ3M7CisKKwlyZXR1cm4gYWQ3MjkxX3Nob3dfdF9ib3VuZChkZXYsIGF0dHIsIHJlZ3MrMSwgYnVmKTsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90IGFkNzI5MV9zZXRfdm9sdGFnZV9sb3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCWludCByZWdzOworCisJcmVncyA9IGFkNzI5MV9nZXRfdm9sdGFnZV9saW1pdF9yZWdzKGF0dHItPmF0dHIubmFtZSk7CisKKwlpZiAocmVncyA8IDApCisJCXJldHVybiByZWdzOworCisJcmV0dXJuIGFkNzI5MV9zZXRfdF9ib3VuZChkZXYsIGF0dHIsIHJlZ3MrMSwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgc3NpemVfdCBhZDcyOTFfc2hvd192b2x0YWdlX2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCWludCByZWdzOworCisJcmVncyA9IGFkNzI5MV9nZXRfdm9sdGFnZV9saW1pdF9yZWdzKGF0dHItPmF0dHIubmFtZSk7CisKKwlpZiAocmVncyA8IDApCisJCXJldHVybiByZWdzOworCisJcmV0dXJuIGFkNzI5MV9zaG93X3RfYm91bmQoZGV2LCBhdHRyLCByZWdzKzIsIGJ1Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZDcyOTFfc2V0X3ZvbHRhZ2VfaHlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJaW50IHJlZ3M7CisKKwlyZWdzID0gYWQ3MjkxX2dldF92b2x0YWdlX2xpbWl0X3JlZ3MoYXR0ci0+YXR0ci5uYW1lKTsKKworCWlmIChyZWdzIDwgMCkKKwkJcmV0dXJuIHJlZ3M7CisKKwlyZXR1cm4gYWQ3MjkxX3NldF90X2JvdW5kKGRldiwgYXR0ciwgcmVncysyLCBidWYsIGxlbik7Cit9CisKK0lJT19FVkVOVF9BVFRSX1NIKHRfc2Vuc2VfaGlnaCwgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdF9zZW5zZV9oaWdoLCBhZDcyOTFfc2V0X3Rfc2Vuc2VfaGlnaCwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSCh0X3NlbnNlX2xvdywgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdF9zZW5zZV9sb3csIGFkNzI5MV9zZXRfdF9zZW5zZV9sb3csIDApOworSUlPX0VWRU5UX0FUVFJfU0godF9zZW5zZV9oeXN0LCBpaW9fZXZlbnRfYWQ3MjkxLAorCQlhZDcyOTFfc2hvd190X3NlbnNlX2h5c3QsIGFkNzI5MV9zZXRfdF9zZW5zZV9oeXN0LCAwKTsKKworSUlPX0VWRU5UX0FUVFJfU0godjBfaGlnaCwgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdm9sdGFnZV9oaWdoLCBhZDcyOTFfc2V0X3ZvbHRhZ2VfaGlnaCwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSCh2MF9sb3csIGlpb19ldmVudF9hZDcyOTEsCisJCWFkNzI5MV9zaG93X3ZvbHRhZ2VfbG93LCBhZDcyOTFfc2V0X3ZvbHRhZ2VfbG93LCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKHYwX2h5c3QsIGlpb19ldmVudF9hZDcyOTEsCisJCWFkNzI5MV9zaG93X3ZvbHRhZ2VfaHlzdCwgYWQ3MjkxX3NldF92b2x0YWdlX2h5c3QsIDApOworSUlPX0VWRU5UX0FUVFJfU0godjFfaGlnaCwgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdm9sdGFnZV9oaWdoLCBhZDcyOTFfc2V0X3ZvbHRhZ2VfaGlnaCwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSCh2MV9sb3csIGlpb19ldmVudF9hZDcyOTEsCisJCWFkNzI5MV9zaG93X3ZvbHRhZ2VfbG93LCBhZDcyOTFfc2V0X3ZvbHRhZ2VfbG93LCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKHYxX2h5c3QsIGlpb19ldmVudF9hZDcyOTEsCisJCWFkNzI5MV9zaG93X3ZvbHRhZ2VfaHlzdCwgYWQ3MjkxX3NldF92b2x0YWdlX2h5c3QsIDApOworSUlPX0VWRU5UX0FUVFJfU0godjJfaGlnaCwgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdm9sdGFnZV9oaWdoLCBhZDcyOTFfc2V0X3ZvbHRhZ2VfaGlnaCwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSCh2Ml9sb3csIGlpb19ldmVudF9hZDcyOTEsCisJCWFkNzI5MV9zaG93X3ZvbHRhZ2VfbG93LCBhZDcyOTFfc2V0X3ZvbHRhZ2VfbG93LCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKHYyX2h5c3QsIGlpb19ldmVudF9hZDcyOTEsCisJCWFkNzI5MV9zaG93X3ZvbHRhZ2VfaHlzdCwgYWQ3MjkxX3NldF92b2x0YWdlX2h5c3QsIDApOworSUlPX0VWRU5UX0FUVFJfU0godjNfaGlnaCwgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdm9sdGFnZV9oaWdoLCBhZDcyOTFfc2V0X3ZvbHRhZ2VfaGlnaCwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSCh2M19sb3csIGlpb19ldmVudF9hZDcyOTEsCisJCWFkNzI5MV9zaG93X3ZvbHRhZ2VfbG93LCBhZDcyOTFfc2V0X3ZvbHRhZ2VfbG93LCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKHYzX2h5c3QsIGlpb19ldmVudF9hZDcyOTEsCisJCWFkNzI5MV9zaG93X3ZvbHRhZ2VfaHlzdCwgYWQ3MjkxX3NldF92b2x0YWdlX2h5c3QsIDApOworSUlPX0VWRU5UX0FUVFJfU0godjRfaGlnaCwgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdm9sdGFnZV9oaWdoLCBhZDcyOTFfc2V0X3ZvbHRhZ2VfaGlnaCwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSCh2NF9sb3csIGlpb19ldmVudF9hZDcyOTEsCisJCWFkNzI5MV9zaG93X3ZvbHRhZ2VfbG93LCBhZDcyOTFfc2V0X3ZvbHRhZ2VfbG93LCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKHY0X2h5c3QsIGlpb19ldmVudF9hZDcyOTEsCisJCWFkNzI5MV9zaG93X3ZvbHRhZ2VfaHlzdCwgYWQ3MjkxX3NldF92b2x0YWdlX2h5c3QsIDApOworSUlPX0VWRU5UX0FUVFJfU0godjVfaGlnaCwgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdm9sdGFnZV9oaWdoLCBhZDcyOTFfc2V0X3ZvbHRhZ2VfaGlnaCwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSCh2NV9sb3csIGlpb19ldmVudF9hZDcyOTEsCisJCWFkNzI5MV9zaG93X3ZvbHRhZ2VfbG93LCBhZDcyOTFfc2V0X3ZvbHRhZ2VfbG93LCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKHY1X2h5c3QsIGlpb19ldmVudF9hZDcyOTEsCisJCWFkNzI5MV9zaG93X3ZvbHRhZ2VfaHlzdCwgYWQ3MjkxX3NldF92b2x0YWdlX2h5c3QsIDApOworSUlPX0VWRU5UX0FUVFJfU0godjZfaGlnaCwgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdm9sdGFnZV9oaWdoLCBhZDcyOTFfc2V0X3ZvbHRhZ2VfaGlnaCwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSCh2Nl9sb3csIGlpb19ldmVudF9hZDcyOTEsCisJCWFkNzI5MV9zaG93X3ZvbHRhZ2VfbG93LCBhZDcyOTFfc2V0X3ZvbHRhZ2VfbG93LCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKHY2X2h5c3QsIGlpb19ldmVudF9hZDcyOTEsCisJCWFkNzI5MV9zaG93X3ZvbHRhZ2VfaHlzdCwgYWQ3MjkxX3NldF92b2x0YWdlX2h5c3QsIDApOworSUlPX0VWRU5UX0FUVFJfU0godjdfaGlnaCwgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdm9sdGFnZV9oaWdoLCBhZDcyOTFfc2V0X3ZvbHRhZ2VfaGlnaCwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSCh2N19sb3csIGlpb19ldmVudF9hZDcyOTEsCisJCWFkNzI5MV9zaG93X3ZvbHRhZ2VfbG93LCBhZDcyOTFfc2V0X3ZvbHRhZ2VfbG93LCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKHY3X2h5c3QsIGlpb19ldmVudF9hZDcyOTEsCisJCWFkNzI5MV9zaG93X3ZvbHRhZ2VfaHlzdCwgYWQ3MjkxX3NldF92b2x0YWdlX2h5c3QsIDApOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWQ3MjkxX2V2ZW50X2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2V2ZW50X2F0dHJfdF9zZW5zZV9oaWdoLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX3Rfc2Vuc2VfbG93LmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX3Rfc2Vuc2VfaHlzdC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl92MF9oaWdoLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX3YwX2xvdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl92MF9oeXN0LmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX3YxX2hpZ2guZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfdjFfbG93LmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX3YxX2h5c3QuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfdjJfaGlnaC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl92Ml9sb3cuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfdjJfaHlzdC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl92M19oaWdoLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX3YzX2xvdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl92M19oeXN0LmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX3Y0X2hpZ2guZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfdjRfbG93LmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX3Y0X2h5c3QuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfdjVfaGlnaC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl92NV9sb3cuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfdjVfaHlzdC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl92Nl9oaWdoLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX3Y2X2xvdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl92Nl9oeXN0LmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX3Y3X2hpZ2guZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfdjdfbG93LmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX3Y3X2h5c3QuZGV2X2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWQ3MjkxX2V2ZW50X2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZDcyOTFfZXZlbnRfYXR0cmlidXRlcywKK307CisKKy8qCisgKiBkZXZpY2UgcHJvYmUgYW5kIHJlbW92ZQorICovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkNzI5MV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGFkNzI5MV9jaGlwX2luZm8gKmNoaXA7CisJaW50IHJldCA9IDA7CisKKwljaGlwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFkNzI5MV9jaGlwX2luZm8pLCBHRlBfS0VSTkVMKTsKKworCWlmIChjaGlwID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogdGhpcyBpcyBvbmx5IHVzZWQgZm9yIGRldmljZSByZW1vdmFsIHB1cnBvc2VzICovCisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgY2hpcCk7CisKKwljaGlwLT5jbGllbnQgPSBjbGllbnQ7CisJY2hpcC0+bmFtZSA9IGlkLT5uYW1lOworCWNoaXAtPmNvbW1hbmQgPSBBRDcyOTFfTk9JU0VfREVMQVkgfCBBRDcyOTFfVF9TRU5TRV9NQVNLOworCisJY2hpcC0+aW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChjaGlwLT5pbmRpb19kZXYgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfY2hpcDsKKwl9CisKKwljaGlwLT5pbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmY2xpZW50LT5kZXY7CisJY2hpcC0+aW5kaW9fZGV2LT5hdHRycyA9ICZhZDcyOTFfYXR0cmlidXRlX2dyb3VwOworCWNoaXAtPmluZGlvX2Rldi0+ZXZlbnRfYXR0cnMgPSAmYWQ3MjkxX2V2ZW50X2F0dHJpYnV0ZV9ncm91cDsKKwljaGlwLT5pbmRpb19kZXYtPmRldl9kYXRhID0gKHZvaWQgKiljaGlwOworCWNoaXAtPmluZGlvX2Rldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCWNoaXAtPmluZGlvX2Rldi0+bnVtX2ludGVycnVwdF9saW5lcyA9IDE7CisJY2hpcC0+aW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihjaGlwLT5pbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisKKwlpZiAoY2xpZW50LT5pcnEgPiAwKSB7CisJCXJldCA9IGlpb19yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShjbGllbnQtPmlycSwKKwkJCQljaGlwLT5pbmRpb19kZXYsCisJCQkJMCwKKwkJCQlJUlFGX1RSSUdHRVJfTE9XLAorCQkJCWNoaXAtPm5hbWUpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl91bnJlZ19kZXY7CisKKwkJLyoKKwkJICogVGhlIGV2ZW50IGhhbmRsZXIgbGlzdCBlbGVtZW50IHJlZmVyIHRvIGlpb19ldmVudF9hZDcyOTEuCisJCSAqIEFsbCBldmVudCBhdHRyaWJ1dGVzIGJpbmQgdG8gdGhlIHNhbWUgZXZlbnQgaGFuZGxlci4KKwkJICogU28sIG9ubHkgcmVnaXN0ZXIgZXZlbnQgaGFuZGxlciBvbmNlLgorCQkgKi8KKwkJaWlvX2FkZF9ldmVudF90b19saXN0KCZpaW9fZXZlbnRfYWQ3MjkxLAorCQkJCSZjaGlwLT5pbmRpb19kZXYtPmludGVycnVwdHNbMF0tPmV2X2xpc3QpOworCisJCUlOSVRfV09SSygmY2hpcC0+dGhyZXNoX3dvcmssIGFkNzI5MV9pbnRlcnJ1cHRfYmgpOworCisJCS8qIHNldCBpcnEgcG9sYXJpdHkgbG93IGxldmVsICovCisJCWNoaXAtPmNvbW1hbmQgfD0gQUQ3MjkxX0FMQVJUX1BPTEFSSVRZOworCX0KKworCXJldCA9IGFkNzI5MV9pMmNfd3JpdGUoY2hpcCwgQUQ3MjkxX0NPTU1BTkQsIGNoaXAtPmNvbW1hbmQpOworCWlmIChyZXQpIHsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnJvcl91bnJlZ19pcnE7CisJfQorCisJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiJXMgdGVtcGVyYXR1cmUgc2Vuc29yIHJlZ2lzdGVyZWQuXG4iLAorCQkJIGlkLT5uYW1lKTsKKworCXJldHVybiAwOworCitlcnJvcl91bnJlZ19pcnE6CisJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoY2hpcC0+aW5kaW9fZGV2LCAwKTsKK2Vycm9yX3VucmVnX2RldjoKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoY2hpcC0+aW5kaW9fZGV2KTsKK2Vycm9yX2ZyZWVfZGV2OgorCWlpb19mcmVlX2RldmljZShjaGlwLT5pbmRpb19kZXYpOworZXJyb3JfZnJlZV9jaGlwOgorCWtmcmVlKGNoaXApOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYWQ3MjkxX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBhZDcyOTFfY2hpcF9pbmZvICpjaGlwID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGNoaXAtPmluZGlvX2RldjsKKworCWlmIChjbGllbnQtPmlycSkKKwkJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoaW5kaW9fZGV2LCAwKTsKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpaW9fZnJlZV9kZXZpY2UoY2hpcC0+aW5kaW9fZGV2KTsKKwlrZnJlZShjaGlwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgYWQ3MjkxX2lkW10gPSB7CisJeyAiYWQ3MjkxIiwgMCB9LAorCXt9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYWQ3MjkxX2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGFkNzI5MV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYWQ3MjkxIiwKKwl9LAorCS5wcm9iZSA9IGFkNzI5MV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWQ3MjkxX3JlbW92ZSksCisJLmlkX3RhYmxlID0gYWQ3MjkxX2lkLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWQ3MjkxX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmFkNzI5MV9kcml2ZXIpOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgYWQ3MjkxX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmYWQ3MjkxX2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIlNvbmljIFpoYW5nIDxzb25pYy56aGFuZ0BhbmFsb2cuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBBRDcyOTEgZGlnaXRhbCIKKwkJCSIgdGVtcGVyYXR1cmUgc2Vuc29yIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworCittb2R1bGVfaW5pdChhZDcyOTFfaW5pdCk7Cittb2R1bGVfZXhpdChhZDcyOTFfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDcyOTguYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzI5OC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMDgwYzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDcyOTguYwpAQCAtMCwwICsxLDUwMSBAQAorLyoKKyAqIEFENzI5OCBkaWdpdGFsIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIgc3VwcG9ydGluZyBBRDcyOTgKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisKKy8qCisgKiBBRDcyOTggY29tbWFuZAorICovCisjZGVmaW5lIEFENzI5OF9QRAkJCTB4MQorI2RlZmluZSBBRDcyOThfVF9BVkdfTUFTSwkJMHgyCisjZGVmaW5lIEFENzI5OF9FWFRfUkVGCQkJMHg0CisjZGVmaW5lIEFENzI5OF9UX1NFTlNFX01BU0sJCTB4MjAKKyNkZWZpbmUgQUQ3Mjk4X1ZPTFRBR0VfTUFTSwkJMHgzZmMwCisjZGVmaW5lIEFENzI5OF9WT0xUQUdFX09GRlNFVAkJMHg2CisjZGVmaW5lIEFENzI5OF9WT0xUQUdFX0xJTUlUX0NPVU5UCTgKKyNkZWZpbmUgQUQ3Mjk4X1JFUEVBVAkJCTB4NDAKKyNkZWZpbmUgQUQ3Mjk4X1dSSVRFCQkJMHg4MAorCisvKgorICogQUQ3Mjk4IHZhbHVlIG1hc2tzCisgKi8KKyNkZWZpbmUgQUQ3Mjk4X0NIQU5ORUxfTUFTSwkJMHhmMDAwCisjZGVmaW5lIEFENzI5OF9WQUxVRV9NQVNLCQkweGZmZgorI2RlZmluZSBBRDcyOThfVF9WQUxVRV9TSUdOCQkweDQwMAorI2RlZmluZSBBRDcyOThfVF9WQUxVRV9GTE9BVF9PRkZTRVQJMgorI2RlZmluZSBBRDcyOThfVF9WQUxVRV9GTE9BVF9NQVNLCTB4MgorCisvKgorICogc3RydWN0IGFkNzI5OF9jaGlwX2luZm8gLSBjaGlwIHNwZWNpZmMgaW5mb3JtYXRpb24KKyAqLworCitzdHJ1Y3QgYWQ3Mjk4X2NoaXBfaW5mbyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldjsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OworCXUxNiBjb21tYW5kOworCXUxNiBidXN5X3BpbjsKKwl1OCAgY2hhbm5lbHM7CS8qIEFjdGl2ZSB2b2x0YWdlIGNoYW5uZWxzICovCit9OworCisvKgorICogYWQ3Mjk4IHJlZ2lzdGVyIGFjY2VzcyBieSBTUEkKKyAqLworc3RhdGljIGludCBhZDcyOThfc3BpX3dyaXRlKHN0cnVjdCBhZDcyOThfY2hpcF9pbmZvICpjaGlwLCB1MTYgZGF0YSkKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldiA9IGNoaXAtPnNwaV9kZXY7CisJaW50IHJldCA9IDA7CisKKwlkYXRhIHw9IEFENzI5OF9XUklURTsKKwlkYXRhID0gY3B1X3RvX2JlMTYoZGF0YSk7CisJcmV0ID0gc3BpX3dyaXRlKHNwaV9kZXYsICh1OCAqKSZkYXRhLCBzaXplb2YoZGF0YSkpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKCZzcGlfZGV2LT5kZXYsICJTUEkgd3JpdGUgZXJyb3JcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZDcyOThfc3BpX3JlYWQoc3RydWN0IGFkNzI5OF9jaGlwX2luZm8gKmNoaXAsIHUxNiBtYXNrLCB1MTYgKmRhdGEpCit7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaV9kZXYgPSBjaGlwLT5zcGlfZGV2OworCWludCByZXQgPSAwOworCXU4IGNvdW50ID0gY2hpcC0+Y2hhbm5lbHM7CisJdTE2IGNvbW1hbmQ7CisJaW50IGk7CisKKwlpZiAobWFzayAmIEFENzI5OF9UX1NFTlNFX01BU0spIHsKKwkJY29tbWFuZCA9IGNoaXAtPmNvbW1hbmQgJiB+KEFENzI5OF9UX0FWR19NQVNLIHwgQUQ3Mjk4X1ZPTFRBR0VfTUFTSyk7CisJCWNvbW1hbmQgfD0gQUQ3Mjk4X1RfU0VOU0VfTUFTSzsKKwkJY291bnQgPSAxOworCX0gZWxzZSBpZiAobWFzayAmIEFENzI5OF9UX0FWR19NQVNLKSB7CisJCWNvbW1hbmQgPSBjaGlwLT5jb21tYW5kICYgfkFENzI5OF9WT0xUQUdFX01BU0s7CisJCWNvbW1hbmQgfD0gQUQ3Mjk4X1RfU0VOU0VfTUFTSyB8IEFENzI5OF9UX0FWR19NQVNLOworCQljb3VudCA9IDI7CisJfSBlbHNlIGlmIChtYXNrICYgQUQ3Mjk4X1ZPTFRBR0VfTUFTSykgeworCQljb21tYW5kID0gY2hpcC0+Y29tbWFuZCAmIH4oQUQ3Mjk4X1RfQVZHX01BU0sgfCBBRDcyOThfVF9TRU5TRV9NQVNLKTsKKwkJY291bnQgPSBjaGlwLT5jaGFubmVsczsKKwl9CisKKwlyZXQgPSBhZDcyOThfc3BpX3dyaXRlKGNoaXAsIGNoaXAtPmNvbW1hbmQpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnNwaV9kZXYtPmRldiwgIlNQSSB3cml0ZSBjb21tYW5kIGVycm9yXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBzcGlfcmVhZChzcGlfZGV2LCAodTggKikmY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZzcGlfZGV2LT5kZXYsICJTUEkgcmVhZCBlcnJvclxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJaSA9IDEwMDAwOworCXdoaWxlIChpICYmIGdwaW9fZ2V0X3ZhbHVlKGNoaXAtPmJ1c3lfcGluKSkgeworCQljcHVfcmVsYXgoKTsKKwkJaS0tOworCX0KKwlpZiAoIWkpIHsKKwkJZGV2X2Vycigmc3BpX2Rldi0+ZGV2LCAiQWx3YXlzIGluIGJ1c3kgY29udmVydGlvbi5cbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCXJldCA9IHNwaV9yZWFkKHNwaV9kZXYsICh1OCAqKSZkYXRhW2ldLCBzaXplb2YoZGF0YVtpXSkpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2Vycigmc3BpX2Rldi0+ZGV2LCAiU1BJIHJlYWQgZXJyb3JcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQkqZGF0YSA9IGJlMTZfdG9fY3B1KGRhdGFbaV0pOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBhZDcyOThfc2hvd19tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3Mjk4X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCWlmIChjaGlwLT5jb21tYW5kICYgQUQ3Mjk4X1JFUEVBVCkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAicmVwZWF0XG4iKTsKKwllbHNlCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIm5vcm1hbFxuIik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzI5OF9zdG9yZV9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3Mjk4X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCWlmIChzdHJjbXAoYnVmLCAicmVwZWF0IikpCisJCWNoaXAtPmNvbW1hbmQgfD0gQUQ3Mjk4X1JFUEVBVDsKKwllbHNlCisJCWNoaXAtPmNvbW1hbmQgJj0gKH5BRDcyOThfUkVQRUFUKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKG1vZGUsIFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDcyOThfc2hvd19tb2RlLAorCQlhZDcyOThfc3RvcmVfbW9kZSwKKwkJMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzI5OF9zaG93X2F2YWlsYWJsZV9tb2RlcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAibm9ybWFsXG5yZXBlYXRcbiIpOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGF2YWlsYWJsZV9tb2RlcywgU19JUlVHTywgYWQ3Mjk4X3Nob3dfYXZhaWxhYmxlX21vZGVzLCBOVUxMLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWQ3Mjk4X3N0b3JlX3Jlc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3Mjk4X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1MTYgY29tbWFuZDsKKwlpbnQgcmV0OworCisJY29tbWFuZCA9IGNoaXAtPmNvbW1hbmQgJiB+QUQ3Mjk4X1BEOworCisJcmV0ID0gYWQ3Mjk4X3NwaV93cml0ZShjaGlwLCBjb21tYW5kKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNvbW1hbmQgPSBjaGlwLT5jb21tYW5kIHwgQUQ3Mjk4X1BEOworCisJcmV0ID0gYWQ3Mjk4X3NwaV93cml0ZShjaGlwLCBjb21tYW5kKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIocmVzZXQsIFNfSVdVU1IsCisJCU5VTEwsCisJCWFkNzI5OF9zdG9yZV9yZXNldCwKKwkJMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzI5OF9zaG93X2V4dF9yZWYoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcyOThfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsICEhKGNoaXAtPmNvbW1hbmQgJiBBRDcyOThfRVhUX1JFRikpOworfQorCitzdGF0aWMgc3NpemVfdCBhZDcyOThfc3RvcmVfZXh0X3JlZihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzI5OF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTE2IGNvbW1hbmQ7CisJaW50IHJldDsKKworCWNvbW1hbmQgPSBjaGlwLT5jb21tYW5kICYgKH5BRDcyOThfRVhUX1JFRik7CisJaWYgKHN0cmNtcChidWYsICIxIikpCisJCWNvbW1hbmQgfD0gQUQ3Mjk4X0VYVF9SRUY7CisKKwlyZXQgPSBhZDcyOThfc3BpX3dyaXRlKGNoaXAsIGNvbW1hbmQpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+Y29tbWFuZCA9IGNvbW1hbmQ7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGV4dF9yZWYsIFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDcyOThfc2hvd19leHRfcmVmLAorCQlhZDcyOThfc3RvcmVfZXh0X3JlZiwKKwkJMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzI5OF9zaG93X3Rfc2Vuc2Uoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcyOThfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXUxNiBkYXRhOworCWNoYXIgc2lnbiA9ICcgJzsKKwlpbnQgcmV0OworCisJcmV0ID0gYWQ3Mjk4X3NwaV9yZWFkKGNoaXAsIEFENzI5OF9UX1NFTlNFX01BU0ssICZkYXRhKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChkYXRhICYgQUQ3Mjk4X1RfVkFMVUVfU0lHTikgeworCQkvKiBjb252ZXJ0IHN1cHBsZW1lbnQgdG8gcG9zaXRpdmUgdmFsdWUgKi8KKwkJZGF0YSA9IChBRDcyOThfVF9WQUxVRV9TSUdOIDw8IDEpIC0gZGF0YTsKKwkJc2lnbiA9ICctJzsKKwl9CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlYyVkLiUuMmRcbiIsIHNpZ24sCisJCShkYXRhID4+IEFENzI5OF9UX1ZBTFVFX0ZMT0FUX09GRlNFVCksCisJCShkYXRhICYgQUQ3Mjk4X1RfVkFMVUVfRkxPQVRfTUFTSykgKiAyNSk7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIodF9zZW5zZSwgU19JUlVHTywgYWQ3Mjk4X3Nob3dfdF9zZW5zZSwgTlVMTCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzI5OF9zaG93X3RfYXZlcmFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzI5OF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTE2IGRhdGFbMl07CisJY2hhciBzaWduID0gJyAnOworCWludCByZXQ7CisKKwlyZXQgPSBhZDcyOThfc3BpX3JlYWQoY2hpcCwgQUQ3Mjk4X1RfQVZHX01BU0ssIGRhdGEpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJaWYgKGRhdGFbMV0gJiBBRDcyOThfVF9WQUxVRV9TSUdOKSB7CisJCS8qIGNvbnZlcnQgc3VwcGxlbWVudCB0byBwb3NpdGl2ZSB2YWx1ZSAqLworCQlkYXRhWzFdID0gKEFENzI5OF9UX1ZBTFVFX1NJR04gPDwgMSkgLSBkYXRhWzFdOworCQlzaWduID0gJy0nOworCX0KKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVjJWQuJS4yZFxuIiwgc2lnbiwKKwkJKGRhdGFbMV0gPj4gQUQ3Mjk4X1RfVkFMVUVfRkxPQVRfT0ZGU0VUKSwKKwkJKGRhdGFbMV0gJiBBRDcyOThfVF9WQUxVRV9GTE9BVF9NQVNLKSAqIDI1KTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUih0X2F2ZXJhZ2UsIFNfSVJVR08sIGFkNzI5OF9zaG93X3RfYXZlcmFnZSwgTlVMTCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzI5OF9zaG93X3ZvbHRhZ2Uoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcyOThfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXUxNiBkYXRhW0FENzI5OF9WT0xUQUdFX0xJTUlUX0NPVU5UXTsKKwlpbnQgaSwgc2l6ZSwgcmV0OworCisJcmV0ID0gYWQ3Mjk4X3NwaV9yZWFkKGNoaXAsIEFENzI5OF9WT0xUQUdFX01BU0ssIGRhdGEpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJZm9yIChpID0gMDsgaSA8IEFENzI5OF9WT0xUQUdFX0xJTUlUX0NPVU5UOyBpKyspIHsKKwkJaWYgKGNoaXAtPmNvbW1hbmQgJiAoQUQ3Mjk4X1RfU0VOU0VfTUFTSyA8PCBpKSkgeworCQkJcmV0ID0gc3ByaW50ZihidWYsICJjaGFubmVsWyVkXT0lZFxuIiwgaSwKKwkJCQkJZGF0YVtpXSAmIEFENzI5OF9WQUxVRV9NQVNLKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWJyZWFrOworCQkJYnVmICs9IHJldDsKKwkJCXNpemUgKz0gcmV0OworCQl9CisJfQorCisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIodm9sdGFnZSwgU19JUlVHTywgYWQ3Mjk4X3Nob3dfdm9sdGFnZSwgTlVMTCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzI5OF9zaG93X2NoYW5uZWxfbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzI5OF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCV4XG4iLCAoY2hpcC0+Y29tbWFuZCAmIEFENzI5OF9WT0xUQUdFX01BU0spID4+CisJCQlBRDcyOThfVk9MVEFHRV9PRkZTRVQpOworfQorCitzdGF0aWMgc3NpemVfdCBhZDcyOThfc3RvcmVfY2hhbm5lbF9tYXNrKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3Mjk4X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJaW50IGksIHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTYsICZkYXRhKTsKKwlpZiAocmV0IHx8IGRhdGEgPiAweGZmKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNoaXAtPmNvbW1hbmQgJj0gKH5BRDcyOThfVk9MVEFHRV9NQVNLKTsKKwljaGlwLT5jb21tYW5kIHw9IGRhdGEgPDwgQUQ3Mjk4X1ZPTFRBR0VfT0ZGU0VUOworCisJZm9yIChpID0gMCwgY2hpcC0+Y2hhbm5lbHMgPSAwOyBpIDwgQUQ3Mjk4X1ZPTFRBR0VfTElNSVRfQ09VTlQ7IGkrKykgeworCQlpZiAoY2hpcC0+Y29tbWFuZCAmIChBRDcyOThfVF9TRU5TRV9NQVNLIDw8IGkpKQorCQkJY2hpcC0+Y2hhbm5lbHMrKzsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGNoYW5uZWxfbWFzaywgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkNzI5OF9zaG93X2NoYW5uZWxfbWFzaywKKwkJYWQ3Mjk4X3N0b3JlX2NoYW5uZWxfbWFzaywKKwkJMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzI5OF9zaG93X25hbWUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcyOThfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBjaGlwLT5uYW1lKTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBhZDcyOThfc2hvd19uYW1lLCBOVUxMLCAwKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkNzI5OF9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19kZXZfYXR0cl9hdmFpbGFibGVfbW9kZXMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX21vZGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3Jlc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9leHRfcmVmLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl90X3NlbnNlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl90X2F2ZXJhZ2UuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3ZvbHRhZ2UuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NoYW5uZWxfbWFzay5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDcyOThfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkNzI5OF9hdHRyaWJ1dGVzLAorfTsKKworLyoKKyAqIGRldmljZSBwcm9iZSBhbmQgcmVtb3ZlCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkNzI5OF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldikKK3sKKwlzdHJ1Y3QgYWQ3Mjk4X2NoaXBfaW5mbyAqY2hpcDsKKwl1bnNpZ25lZCBzaG9ydCAqcGlucyA9IHNwaV9kZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWludCByZXQgPSAwOworCisJY2hpcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhZDcyOThfY2hpcF9pbmZvKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoY2hpcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIHRoaXMgaXMgb25seSB1c2VkIGZvciBkZXZpY2UgcmVtb3ZhbCBwdXJwb3NlcyAqLworCWRldl9zZXRfZHJ2ZGF0YSgmc3BpX2Rldi0+ZGV2LCBjaGlwKTsKKworCWNoaXAtPnNwaV9kZXYgPSBzcGlfZGV2OworCWNoaXAtPm5hbWUgPSBzcGlfZGV2LT5tb2RhbGlhczsKKwljaGlwLT5idXN5X3BpbiA9IHBpbnNbMF07CisKKwlyZXQgPSBncGlvX3JlcXVlc3QoY2hpcC0+YnVzeV9waW4sIGNoaXAtPm5hbWUpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3BpX2Rldi0+ZGV2LCAiRmFpbCB0byByZXF1ZXN0IGJ1c3kgZ3BpbyBQSU4gJWQuXG4iLAorCQkJY2hpcC0+YnVzeV9waW4pOworCQlnb3RvIGVycm9yX2ZyZWVfY2hpcDsKKwl9CisJZ3Bpb19kaXJlY3Rpb25faW5wdXQoY2hpcC0+YnVzeV9waW4pOworCisJY2hpcC0+aW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChjaGlwLT5pbmRpb19kZXYgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfZ3BpbzsKKwl9CisKKwljaGlwLT5pbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmc3BpX2Rldi0+ZGV2OworCWNoaXAtPmluZGlvX2Rldi0+YXR0cnMgPSAmYWQ3Mjk4X2F0dHJpYnV0ZV9ncm91cDsKKwljaGlwLT5pbmRpb19kZXYtPmRldl9kYXRhID0gKHZvaWQgKiljaGlwOworCWNoaXAtPmluZGlvX2Rldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCWNoaXAtPmluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoY2hpcC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2OworCisJZGV2X2luZm8oJnNwaV9kZXYtPmRldiwgIiVzIHRlbXBlcmF0dXJlIHNlbnNvciBhbmQgQURDIHJlZ2lzdGVyZWQuXG4iLAorCQkJIGNoaXAtPm5hbWUpOworCisJcmV0dXJuIDA7CisKK2Vycm9yX2ZyZWVfZGV2OgorCWlpb19mcmVlX2RldmljZShjaGlwLT5pbmRpb19kZXYpOworZXJyb3JfZnJlZV9ncGlvOgorCWdwaW9fZnJlZShjaGlwLT5idXN5X3Bpbik7CitlcnJvcl9mcmVlX2NoaXA6CisJa2ZyZWUoY2hpcCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhZDcyOThfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGlfZGV2KQoreworCXN0cnVjdCBhZDcyOThfY2hpcF9pbmZvICpjaGlwID0gZGV2X2dldF9kcnZkYXRhKCZzcGlfZGV2LT5kZXYpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBjaGlwLT5pbmRpb19kZXY7CisKKwlkZXZfc2V0X2RydmRhdGEoJnNwaV9kZXYtPmRldiwgTlVMTCk7CisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJaWlvX2ZyZWVfZGV2aWNlKGNoaXAtPmluZGlvX2Rldik7CisJZ3Bpb19mcmVlKGNoaXAtPmJ1c3lfcGluKTsKKwlrZnJlZShjaGlwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNwaV9kZXZpY2VfaWQgYWQ3Mjk4X2lkW10gPSB7CisJeyAiYWQ3Mjk4IiwgMCB9LAorCXt9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHNwaSwgYWQ3Mjk4X2lkKTsKKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFkNzI5OF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYWQ3Mjk4IiwKKwkJLmJ1cyA9ICZzcGlfYnVzX3R5cGUsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gYWQ3Mjk4X3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZDcyOThfcmVtb3ZlKSwKKwkuaWRfdGFibGUgPSBhZDcyOThfaWQsCit9OworCitzdGF0aWMgX19pbml0IGludCBhZDcyOThfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZhZDcyOThfZHJpdmVyKTsKK30KKworc3RhdGljIF9fZXhpdCB2b2lkIGFkNzI5OF9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZDcyOThfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiU29uaWMgWmhhbmcgPHNvbmljLnpoYW5nQGFuYWxvZy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFENzI5OCBkaWdpdGFsIgorCQkJIiB0ZW1wZXJhdHVyZSBzZW5zb3IgYW5kIEFEQyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKKworbW9kdWxlX2luaXQoYWQ3Mjk4X2luaXQpOworbW9kdWxlX2V4aXQoYWQ3Mjk4X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3MzE0LmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDczMTQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzE3YjFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3MzE0LmMKQEAgLTAsMCArMSwzMDggQEAKKy8qCisgKiBBRDczMTQgZGlnaXRhbCB0ZW1wZXJhdHVyZSBzZW5zb3IgZHJpdmVyIGZvciBBRDczMTQsIEFEVDczMDEgYW5kIEFEVDczMDIKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisKKy8qCisgKiBBRDczMTQgcG93ZXIgbW9kZQorICovCisjZGVmaW5lIEFENzMxNF9QRAkJMHgyMDAwCisKKy8qCisgKiBBRDczMTQgdGVtcGVyYXR1cmUgbWFza3MKKyAqLworI2RlZmluZSBBRDczMTRfVEVNUF9TSUdOCQkweDIwMAorI2RlZmluZSBBRDczMTRfVEVNUF9NQVNLCQkweDdGRTAKKyNkZWZpbmUgQUQ3MzE0X1RFTVBfT0ZGU0VUCQk1CisjZGVmaW5lIEFENzMxNF9URU1QX0ZMT0FUX09GRlNFVAkyCisjZGVmaW5lIEFENzMxNF9URU1QX0ZMT0FUX01BU0sJCTB4MworCisvKgorICogQURUNzMwMSBhbmQgQURUNzMwMiB0ZW1wZXJhdHVyZSBtYXNrcworICovCisjZGVmaW5lIEFEVDczMDFfVEVNUF9TSUdOCQkweDIwMDAKKyNkZWZpbmUgQURUNzMwMV9URU1QX01BU0sJCTB4MkZGRgorI2RlZmluZSBBRFQ3MzAxX1RFTVBfRkxPQVRfT0ZGU0VUCTUKKyNkZWZpbmUgQURUNzMwMV9URU1QX0ZMT0FUX01BU0sJCTB4MUYKKworLyoKKyAqIHN0cnVjdCBhZDczMTRfY2hpcF9pbmZvIC0gY2hpcCBzcGVjaWZjIGluZm9ybWF0aW9uCisgKi8KKworc3RydWN0IGFkNzMxNF9jaGlwX2luZm8geworCWNvbnN0IGNoYXIgKm5hbWU7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaV9kZXY7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKwlzNjQgbGFzdF90aW1lc3RhbXA7CisJdTggIG1vZGU7Cit9OworCisvKgorICogYWQ3MzE0IHJlZ2lzdGVyIGFjY2VzcyBieSBTUEkKKyAqLworCitzdGF0aWMgaW50IGFkNzMxNF9zcGlfcmVhZChzdHJ1Y3QgYWQ3MzE0X2NoaXBfaW5mbyAqY2hpcCwgdTE2ICpkYXRhKQoreworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGlfZGV2ID0gY2hpcC0+c3BpX2RldjsKKwlpbnQgcmV0ID0gMDsKKwl1MTYgdmFsdWU7CisKKwlyZXQgPSBzcGlfcmVhZChzcGlfZGV2LCAodTggKikmdmFsdWUsIHNpemVvZih2YWx1ZSkpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnNwaV9kZXYtPmRldiwgIlNQSSByZWFkIGVycm9yXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkqZGF0YSA9IGJlMTZfdG9fY3B1KCh1MTYpdmFsdWUpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZDczMTRfc3BpX3dyaXRlKHN0cnVjdCBhZDczMTRfY2hpcF9pbmZvICpjaGlwLCB1MTYgZGF0YSkKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldiA9IGNoaXAtPnNwaV9kZXY7CisJaW50IHJldCA9IDA7CisJdTE2IHZhbHVlID0gY3B1X3RvX2JlMTYoZGF0YSk7CisKKwlyZXQgPSBzcGlfd3JpdGUoc3BpX2RldiwgKHU4ICopJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2Vycigmc3BpX2Rldi0+ZGV2LCAiU1BJIHdyaXRlIGVycm9yXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzMxNF9zaG93X21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDczMTRfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJaWYgKGNoaXAtPm1vZGUpCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgInBvd2VyLXNhdmVcbiIpOworCWVsc2UKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiZnVsbFxuIik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzMxNF9zdG9yZV9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MzE0X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1MTYgbW9kZSA9IDA7CisJaW50IHJldDsKKworCWlmICghc3RyY21wKGJ1ZiwgImZ1bGwiKSkKKwkJbW9kZSA9IEFENzMxNF9QRDsKKworCXJldCA9IGFkNzMxNF9zcGlfd3JpdGUoY2hpcCwgbW9kZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljaGlwLT5tb2RlID0gbW9kZTsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIobW9kZSwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkNzMxNF9zaG93X21vZGUsCisJCWFkNzMxNF9zdG9yZV9tb2RlLAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWQ3MzE0X3Nob3dfYXZhaWxhYmxlX21vZGVzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICJmdWxsXG5wb3dlci1zYXZlXG4iKTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihhdmFpbGFibGVfbW9kZXMsIFNfSVJVR08sIGFkNzMxNF9zaG93X2F2YWlsYWJsZV9tb2RlcywgTlVMTCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzMxNF9zaG93X3RlbXBlcmF0dXJlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MzE0X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1MTYgZGF0YTsKKwljaGFyIHNpZ24gPSAnICc7CisJaW50IHJldDsKKworCWlmIChjaGlwLT5tb2RlKSB7CisJCXJldCA9IGFkNzMxNF9zcGlfd3JpdGUoY2hpcCwgMCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXQgPSBhZDczMTRfc3BpX3JlYWQoY2hpcCwgJmRhdGEpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJaWYgKGNoaXAtPm1vZGUpCisJCWFkNzMxNF9zcGlfd3JpdGUoY2hpcCwgY2hpcC0+bW9kZSk7CisKKwlpZiAoc3RyY21wKGNoaXAtPm5hbWUsICJhZDczMTQiKSkgeworCQlkYXRhID0gKGRhdGEgJiBBRDczMTRfVEVNUF9NQVNLKSA+PgorCQkJQUQ3MzE0X1RFTVBfT0ZGU0VUOworCQlpZiAoZGF0YSAmIEFENzMxNF9URU1QX1NJR04pIHsKKwkJCWRhdGEgPSAoQUQ3MzE0X1RFTVBfU0lHTiA8PCAxKSAtIGRhdGE7CisJCQlzaWduID0gJy0nOworCQl9CisKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWMlZC4lLjJkXG4iLCBzaWduLAorCQkJCWRhdGEgPj4gQUQ3MzE0X1RFTVBfRkxPQVRfT0ZGU0VULAorCQkJCShkYXRhICYgQUQ3MzE0X1RFTVBfRkxPQVRfTUFTSykgKiAyNSk7CisJfSBlbHNlIHsKKwkJZGF0YSAmPSBBRFQ3MzAxX1RFTVBfTUFTSzsKKwkJaWYgKGRhdGEgJiBBRFQ3MzAxX1RFTVBfU0lHTikgeworCQkJZGF0YSA9IChBRFQ3MzAxX1RFTVBfU0lHTiA8PCAxKSAtIGRhdGE7CisJCQlzaWduID0gJy0nOworCQl9CisKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWMlZC4lLjVkXG4iLCBzaWduLAorCQkJCWRhdGEgPj4gQURUNzMwMV9URU1QX0ZMT0FUX09GRlNFVCwKKwkJCQkoZGF0YSAmIEFEVDczMDFfVEVNUF9GTE9BVF9NQVNLKSAqIDMxMjUpOworCX0KK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUih0ZW1wZXJhdHVyZSwgU19JUlVHTywgYWQ3MzE0X3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwsIDApOworCitzdGF0aWMgc3NpemVfdCBhZDczMTRfc2hvd19uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MzE0X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgY2hpcC0+bmFtZSk7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgYWQ3MzE0X3Nob3dfbmFtZSwgTlVMTCwgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZDczMTRfYXR0cmlidXRlc1tdID0geworCSZpaW9fZGV2X2F0dHJfYXZhaWxhYmxlX21vZGVzLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9tb2RlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl90ZW1wZXJhdHVyZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDczMTRfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkNzMxNF9hdHRyaWJ1dGVzLAorfTsKKworLyoKKyAqIGRldmljZSBwcm9iZSBhbmQgcmVtb3ZlCisgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgYWQ3MzE0X3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGlfZGV2KQoreworCXN0cnVjdCBhZDczMTRfY2hpcF9pbmZvICpjaGlwOworCWludCByZXQgPSAwOworCisJY2hpcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhZDczMTRfY2hpcF9pbmZvKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoY2hpcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIHRoaXMgaXMgb25seSB1c2VkIGZvciBkZXZpY2UgcmVtb3ZhbCBwdXJwb3NlcyAqLworCWRldl9zZXRfZHJ2ZGF0YSgmc3BpX2Rldi0+ZGV2LCBjaGlwKTsKKworCWNoaXAtPnNwaV9kZXYgPSBzcGlfZGV2OworCWNoaXAtPm5hbWUgPSBzcGlfZGV2LT5tb2RhbGlhczsKKworCWNoaXAtPmluZGlvX2RldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoY2hpcC0+aW5kaW9fZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX2NoaXA7CisJfQorCisJY2hpcC0+aW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJnNwaV9kZXYtPmRldjsKKwljaGlwLT5pbmRpb19kZXYtPmF0dHJzID0gJmFkNzMxNF9hdHRyaWJ1dGVfZ3JvdXA7CisJY2hpcC0+aW5kaW9fZGV2LT5kZXZfZGF0YSA9ICh2b2lkICopY2hpcDsKKwljaGlwLT5pbmRpb19kZXYtPmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRTsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoY2hpcC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2OworCisJZGV2X2luZm8oJnNwaV9kZXYtPmRldiwgIiVzIHRlbXBlcmF0dXJlIHNlbnNvciByZWdpc3RlcmVkLlxuIiwKKwkJCSBjaGlwLT5uYW1lKTsKKworCXJldHVybiAwOworZXJyb3JfZnJlZV9kZXY6CisJaWlvX2ZyZWVfZGV2aWNlKGNoaXAtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX2NoaXA6CisJa2ZyZWUoY2hpcCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhZDczMTRfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGlfZGV2KQoreworCXN0cnVjdCBhZDczMTRfY2hpcF9pbmZvICpjaGlwID0gZGV2X2dldF9kcnZkYXRhKCZzcGlfZGV2LT5kZXYpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBjaGlwLT5pbmRpb19kZXY7CisKKwlkZXZfc2V0X2RydmRhdGEoJnNwaV9kZXYtPmRldiwgTlVMTCk7CisJaWYgKHNwaV9kZXYtPmlycSkKKwkJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoaW5kaW9fZGV2LCAwKTsKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpaW9fZnJlZV9kZXZpY2UoY2hpcC0+aW5kaW9fZGV2KTsKKwlrZnJlZShjaGlwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNwaV9kZXZpY2VfaWQgYWQ3MzE0X2lkW10gPSB7CisJeyAiYWR0NzMwMSIsIDAgfSwKKwl7ICJhZHQ3MzAyIiwgMCB9LAorCXsgImFkNzMxNCIsIDAgfSwKKwl7fQorfTsKKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFkNzMxNF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYWQ3MzE0IiwKKwkJLmJ1cyA9ICZzcGlfYnVzX3R5cGUsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gYWQ3MzE0X3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZDczMTRfcmVtb3ZlKSwKKwkuaWRfdGFibGUgPSBhZDczMTRfaWQsCit9OworCitzdGF0aWMgX19pbml0IGludCBhZDczMTRfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZhZDczMTRfZHJpdmVyKTsKK30KKworc3RhdGljIF9fZXhpdCB2b2lkIGFkNzMxNF9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZDczMTRfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiU29uaWMgWmhhbmcgPHNvbmljLnpoYW5nQGFuYWxvZy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFENzMxNCwgQURUNzMwMSBhbmQgQURUNzMwMiBkaWdpdGFsIgorCQkJIiB0ZW1wZXJhdHVyZSBzZW5zb3IgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CisKK21vZHVsZV9pbml0KGFkNzMxNF9pbml0KTsKK21vZHVsZV9leGl0KGFkNzMxNF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzc0NS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3NzQ1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI3ZWY4NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzc0NS5jCkBAIC0wLDAgKzEsNzM0IEBACisvKgorICogQUQ3NzRYIGNhcGFjaXRpdmUgc2Vuc29yIGRyaXZlciBzdXBwb3J0aW5nIEFENzc0NS82LzcKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKworLyoKKyAqIEFENzc0WCByZWdpc3RlcnMgZGVmaW5pdGlvbgorICovCisKKyNkZWZpbmUgQUQ3NzRYX1NUQVRVUwkJMAorI2RlZmluZSBBRDc3NFhfU1RBVFVTX1JEWQkoMSA8PCAyKQorI2RlZmluZSBBRDc3NFhfU1RBVFVTX1JEWVZUCSgxIDw8IDEpCisjZGVmaW5lIEFENzc0WF9TVEFUVVNfUkRZQ0FQCSgxIDw8IDApCisjZGVmaW5lIEFENzc0WF9DQVBfREFUQV9ISUdICTEKKyNkZWZpbmUgQUQ3NzRYX0NBUF9EQVRBX01JRAkyCisjZGVmaW5lIEFENzc0WF9DQVBfREFUQV9MT1cJMworI2RlZmluZSBBRDc3NFhfVlRfREFUQV9ISUdICTQKKyNkZWZpbmUgQUQ3NzRYX1ZUX0RBVEFfTUlECTUKKyNkZWZpbmUgQUQ3NzRYX1ZUX0RBVEFfTE9XCTYKKyNkZWZpbmUgQUQ3NzRYX0NBUF9TRVRVUAk3CisjZGVmaW5lIEFENzc0WF9WVF9TRVRVUAkJOAorI2RlZmluZSBBRDc3NFhfRVhFQ19TRVRVUAk5CisjZGVmaW5lIEFENzc0WF9DRkcJCTEwCisjZGVmaW5lIEFENzc0WF9DQVBEQUNBCQkxMQorI2RlZmluZSBBRDc3NFhfQ0FQREFDQgkJMTIKKyNkZWZpbmUgQUQ3NzRYX0NBUERBQ19FTgkoMSA8PCA3KQorI2RlZmluZSBBRDc3NFhfQ0FQX09GRkgJCTEzCisjZGVmaW5lIEFENzc0WF9DQVBfT0ZGTAkJMTQKKyNkZWZpbmUgQUQ3NzRYX0NBUF9HQUlOSAkxNQorI2RlZmluZSBBRDc3NFhfQ0FQX0dBSU5MCTE2CisjZGVmaW5lIEFENzc0WF9WT0xUX0dBSU5ICTE3CisjZGVmaW5lIEFENzc0WF9WT0xUX0dBSU5MCTE4CisKKyNkZWZpbmUgQUQ3NzRYX01BWF9DT05WX01PREUJNgorCisvKgorICogc3RydWN0IGFkNzc0eF9jaGlwX2luZm8gLSBjaGlwIHNwZWNpZmMgaW5mb3JtYXRpb24KKyAqLworCitzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CisJc3RydWN0IHdvcmtfc3RydWN0IHRocmVzaF93b3JrOworCWJvb2wgaW50ZXI7CisJczY0IGxhc3RfdGltZXN0YW1wOworCXUxNiBjYXBfb2ZmczsgICAgICAgICAgICAgICAgICAgLyogQ2FwYWNpdGl2ZSBvZmZzZXQgKi8KKwl1MTYgY2FwX2dhaW47ICAgICAgICAgICAgICAgICAgIC8qIENhcGFjaXRpdmUgZ2FpbiBjYWxpYnJhdGlvbiAqLworCXUxNiB2b2x0X2dhaW47ICAgICAgICAgICAgICAgICAgLyogVm9sdGFnZSBnYWluIGNhbGlicmF0aW9uICovCisJdTggIGNhcF9zZXR1cDsKKwl1OCAgdnRfc2V0dXA7CisJdTggIGV4ZWNfc2V0dXA7CisKKwljaGFyICpjb252ZXJzaW9uX21vZGU7Cit9OworCitzdHJ1Y3QgYWQ3NzR4X2NvbnZlcnNpb25fbW9kZSB7CisJY2hhciAqbmFtZTsKKwl1OCByZWdfY2ZnOworfTsKKworc3RydWN0IGFkNzc0eF9jb252ZXJzaW9uX21vZGUgYWQ3NzR4X2NvbnZfbW9kZV90YWJsZVtBRDc3NFhfTUFYX0NPTlZfTU9ERV0gPSB7CisJeyAiaWRsZSIsIDAgfSwKKwl7ICJjb250aW51b3VzLWNvbnZlcnNpb24iLCAxIH0sCisJeyAic2luZ2xlLWNvbnZlcnNpb24iLCAyIH0sCisJeyAicG93ZXItZG93biIsIDMgfSwKKwl7ICJvZmZzZXQtY2FsaWJyYXRpb24iLCA1IH0sCisJeyAiZ2Fpbi1jYWxpYnJhdGlvbiIsIDYgfSwKK307CisKKy8qCisgKiBhZDc3NHggcmVnaXN0ZXIgYWNjZXNzIGJ5IEkyQworICovCisKK3N0YXRpYyBpbnQgYWQ3NzR4X2kyY19yZWFkKHN0cnVjdCBhZDc3NHhfY2hpcF9pbmZvICpjaGlwLCB1OCByZWcsIHU4ICpkYXRhLCBpbnQgbGVuKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBjaGlwLT5jbGllbnQ7CisJaW50IHJldDsKKworCXJldCA9IGkyY19tYXN0ZXJfc2VuZChjbGllbnQsICZyZWcsIDEpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiSTJDIHdyaXRlIGVycm9yXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBpMmNfbWFzdGVyX3JlY3YoY2xpZW50LCBkYXRhLCBsZW4pOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiSTJDIHJlYWQgZXJyb3JcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWQ3NzR4X2kyY193cml0ZShzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCwgdTggcmVnLCB1OCBkYXRhKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBjaGlwLT5jbGllbnQ7CisJaW50IHJldDsKKworCXU4IHR4WzJdID0geworCQlyZWcsCisJCWRhdGEsCisJfTsKKworCXJldCA9IGkyY19tYXN0ZXJfc2VuZChjbGllbnQsIHR4LCAyKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJMkMgd3JpdGUgZXJyb3JcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHN5c2ZzIG5vZGVzCisgKi8KKworI2RlZmluZSBJSU9fREVWX0FUVFJfQVZBSUxfQ09OVkVSU0lPTl9NT0RFUyhfc2hvdykJCQkJXAorCUlJT19ERVZJQ0VfQVRUUihhdmFpbGFibGVfY29udmVyc2lvbl9tb2RlcywgU19JUlVHTywgX3Nob3csIE5VTEwsIDApCisjZGVmaW5lIElJT19ERVZfQVRUUl9DT05WRVJTSU9OX01PREUoX21vZGUsIF9zaG93LCBfc3RvcmUpICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGNvbnZlcnNpb25fbW9kZSwgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCisjZGVmaW5lIElJT19ERVZfQVRUUl9DQVBfU0VUVVAoX21vZGUsIF9zaG93LCBfc3RvcmUpCQlcCisJSUlPX0RFVklDRV9BVFRSKGNhcF9zZXR1cCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCisjZGVmaW5lIElJT19ERVZfQVRUUl9WVF9TRVRVUChfbW9kZSwgX3Nob3csIF9zdG9yZSkgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoaW4wX3NldHVwLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0VYRUNfU0VUVVAoX21vZGUsIF9zaG93LCBfc3RvcmUpICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGV4ZWNfc2V0dXAsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCAwKQorI2RlZmluZSBJSU9fREVWX0FUVFJfVk9MVF9HQUlOKF9tb2RlLCBfc2hvdywgX3N0b3JlKQkJXAorCUlJT19ERVZJQ0VfQVRUUihpbjBfZ2FpbiwgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCisjZGVmaW5lIElJT19ERVZfQVRUUl9DQVBfT0ZGUyhfbW9kZSwgX3Nob3csIF9zdG9yZSkJCVwKKwlJSU9fREVWSUNFX0FUVFIoY2FwX29mZnMsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCAwKQorI2RlZmluZSBJSU9fREVWX0FUVFJfQ0FQX0dBSU4oX21vZGUsIF9zaG93LCBfc3RvcmUpCQlcCisJSUlPX0RFVklDRV9BVFRSKGNhcF9nYWluLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NBUF9EQVRBKF9zaG93KQkJXAorCUlJT19ERVZJQ0VfQVRUUihjYXAwX3JhdywgU19JUlVHTywgX3Nob3csIE5VTEwsIDApCisjZGVmaW5lIElJT19ERVZfQVRUUl9WVF9EQVRBKF9zaG93KQkJXAorCUlJT19ERVZJQ0VfQVRUUihpbjBfcmF3LCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgMCkKKworc3RhdGljIHNzaXplX3QgYWQ3NzR4X3Nob3dfY29udmVyc2lvbl9tb2RlcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJaW50IGk7CisJaW50IGxlbiA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgQUQ3NzRYX01BWF9DT05WX01PREU7IGkrKykKKwkJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiJXMgIiwgYWQ3NzR4X2NvbnZfbW9kZV90YWJsZVtpXS5uYW1lKTsKKworCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIlxuIik7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX0FWQUlMX0NPTlZFUlNJT05fTU9ERVMoYWQ3NzR4X3Nob3dfY29udmVyc2lvbl9tb2Rlcyk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzc0eF9zaG93X2NvbnZlcnNpb25fbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzc0eF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgY2hpcC0+Y29udmVyc2lvbl9tb2RlKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3NzR4X3N0b3JlX2NvbnZlcnNpb25fbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzc0eF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTggY2ZnOworCWludCBpOworCisJYWQ3NzR4X2kyY19yZWFkKGNoaXAsIEFENzc0WF9DRkcsICZjZmcsIDEpOworCisJZm9yIChpID0gMDsgaSA8IEFENzc0WF9NQVhfQ09OVl9NT0RFOyBpKyspIHsKKwkJaWYgKHN0cm5jbXAoYnVmLCBhZDc3NHhfY29udl9tb2RlX3RhYmxlW2ldLm5hbWUsCisJCQkJc3RybGVuKGFkNzc0eF9jb252X21vZGVfdGFibGVbaV0ubmFtZSkgLSAxKSA9PSAwKSB7CisJCQljaGlwLT5jb252ZXJzaW9uX21vZGUgPSBhZDc3NHhfY29udl9tb2RlX3RhYmxlW2ldLm5hbWU7CisJCQljZmcgfD0gMHgxOCB8IGFkNzc0eF9jb252X21vZGVfdGFibGVbaV0ucmVnX2NmZzsKKwkJCWFkNzc0eF9pMmNfd3JpdGUoY2hpcCwgQUQ3NzRYX0NGRywgY2ZnKTsKKwkJCXJldHVybiBsZW47CisJCX0KKwl9CisKKwlkZXZfZXJyKGRldiwgIm5vdCBzdXBwb3J0ZWQgY29udmVyc2lvbiBtb2RlXG4iKTsKKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX0NPTlZFUlNJT05fTU9ERShTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQ3NzR4X3Nob3dfY29udmVyc2lvbl9tb2RlLAorCQlhZDc3NHhfc3RvcmVfY29udmVyc2lvbl9tb2RlKTsKKworc3RhdGljIHNzaXplX3QgYWQ3NzR4X3Nob3dfZGFjX3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisJdTggZGF0YTsKKworCWFkNzc0eF9pMmNfcmVhZChjaGlwLCB0aGlzX2F0dHItPmFkZHJlc3MsICZkYXRhLCAxKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiUwMnhcbiIsIGRhdGEgJiAweDdGKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3NzR4X3N0b3JlX2RhY192YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzc0eF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOworCisJaWYgKCFyZXQpIHsKKwkJYWQ3NzR4X2kyY193cml0ZShjaGlwLCB0aGlzX2F0dHItPmFkZHJlc3MsCisJCQkoZGF0YSA/IEFENzc0WF9DQVBEQUNfRU4gOiAwKSB8IChkYXRhICYgMHg3RikpOworCQlyZXR1cm4gbGVuOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGNhcGRhYzBfcmF3LCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJCWFkNzc0eF9zaG93X2RhY192YWx1ZSwKKwkJCWFkNzc0eF9zdG9yZV9kYWNfdmFsdWUsCisJCQlBRDc3NFhfQ0FQREFDQSk7CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoY2FwZGFjMV9yYXcsIFNfSVJVR08gfCBTX0lXVVNSLAorCQkJYWQ3NzR4X3Nob3dfZGFjX3ZhbHVlLAorCQkJYWQ3NzR4X3N0b3JlX2RhY192YWx1ZSwKKwkJCUFENzc0WF9DQVBEQUNCKTsKKworc3RhdGljIHNzaXplX3QgYWQ3NzR4X3Nob3dfY2FwX3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JTAyeFxuIiwgY2hpcC0+Y2FwX3NldHVwKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3NzR4X3N0b3JlX2NhcF9zZXR1cChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzc0eF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7CisKKwlpZiAoKCFyZXQpICYmIChkYXRhIDwgMHgxMDApKSB7CisJCWFkNzc0eF9pMmNfd3JpdGUoY2hpcCwgQUQ3NzRYX0NBUF9TRVRVUCwgZGF0YSk7CisJCWNoaXAtPmNhcF9zZXR1cCA9IGRhdGE7CisJCXJldHVybiBsZW47CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0FQX1NFVFVQKFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDc3NHhfc2hvd19jYXBfc2V0dXAsCisJCWFkNzc0eF9zdG9yZV9jYXBfc2V0dXApOworCitzdGF0aWMgc3NpemVfdCBhZDc3NHhfc2hvd192dF9zZXR1cChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzc0eF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCUwMnhcbiIsIGNoaXAtPnZ0X3NldHVwKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3NzR4X3N0b3JlX3Z0X3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKKworCWlmICgoIXJldCkgJiYgKGRhdGEgPCAweDEwMCkpIHsKKwkJYWQ3NzR4X2kyY193cml0ZShjaGlwLCBBRDc3NFhfVlRfU0VUVVAsIGRhdGEpOworCQljaGlwLT52dF9zZXR1cCA9IGRhdGE7CisJCXJldHVybiBsZW47CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfVlRfU0VUVVAoU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkNzc0eF9zaG93X3Z0X3NldHVwLAorCQlhZDc3NHhfc3RvcmVfdnRfc2V0dXApOworCitzdGF0aWMgc3NpemVfdCBhZDc3NHhfc2hvd19leGVjX3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JTAyeFxuIiwgY2hpcC0+ZXhlY19zZXR1cCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzc0eF9zdG9yZV9leGVjX3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKKworCWlmICgoIXJldCkgJiYgKGRhdGEgPCAweDEwMCkpIHsKKwkJYWQ3NzR4X2kyY193cml0ZShjaGlwLCBBRDc3NFhfRVhFQ19TRVRVUCwgZGF0YSk7CisJCWNoaXAtPmV4ZWNfc2V0dXAgPSBkYXRhOworCQlyZXR1cm4gbGVuOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX0VYRUNfU0VUVVAoU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkNzc0eF9zaG93X2V4ZWNfc2V0dXAsCisJCWFkNzc0eF9zdG9yZV9leGVjX3NldHVwKTsKKworc3RhdGljIHNzaXplX3QgYWQ3NzR4X3Nob3dfdm9sdF9nYWluKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBjaGlwLT52b2x0X2dhaW4pOworfQorCitzdGF0aWMgc3NpemVfdCBhZDc3NHhfc3RvcmVfdm9sdF9nYWluKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKKworCWlmICgoIXJldCkgJiYgKGRhdGEgPCAweDEwMDAwKSkgeworCQlhZDc3NHhfaTJjX3dyaXRlKGNoaXAsIEFENzc0WF9WT0xUX0dBSU5ILCBkYXRhID4+IDgpOworCQlhZDc3NHhfaTJjX3dyaXRlKGNoaXAsIEFENzc0WF9WT0xUX0dBSU5MLCBkYXRhKTsKKwkJY2hpcC0+dm9sdF9nYWluID0gZGF0YTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9WT0xUX0dBSU4oU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkNzc0eF9zaG93X3ZvbHRfZ2FpbiwKKwkJYWQ3NzR4X3N0b3JlX3ZvbHRfZ2Fpbik7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzc0eF9zaG93X2NhcF9kYXRhKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJY2hhciB0bXBbM107CisKKwlhZDc3NHhfaTJjX3JlYWQoY2hpcCwgQUQ3NzRYX0NBUF9EQVRBX0hJR0gsIHRtcCwgMyk7CisJZGF0YSA9ICgoaW50KXRtcFswXSA8PCAxNikgfCAoKGludCl0bXBbMV0gPDwgOCkgfCAoaW50KXRtcFsyXTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgZGF0YSk7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0FQX0RBVEEoYWQ3NzR4X3Nob3dfY2FwX2RhdGEpOworCitzdGF0aWMgc3NpemVfdCBhZDc3NHhfc2hvd192dF9kYXRhKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJY2hhciB0bXBbM107CisKKwlhZDc3NHhfaTJjX3JlYWQoY2hpcCwgQUQ3NzRYX1ZUX0RBVEFfSElHSCwgdG1wLCAzKTsKKwlkYXRhID0gKChpbnQpdG1wWzBdIDw8IDE2KSB8ICgoaW50KXRtcFsxXSA8PCA4KSB8IChpbnQpdG1wWzJdOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBkYXRhKTsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9WVF9EQVRBKGFkNzc0eF9zaG93X3Z0X2RhdGEpOworCitzdGF0aWMgc3NpemVfdCBhZDc3NHhfc2hvd19jYXBfb2ZmcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzc0eF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgY2hpcC0+Y2FwX29mZnMpOworfQorCitzdGF0aWMgc3NpemVfdCBhZDc3NHhfc3RvcmVfY2FwX29mZnMoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDc3NHhfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOworCisJaWYgKCghcmV0KSAmJiAoZGF0YSA8IDB4MTAwMDApKSB7CisJCWFkNzc0eF9pMmNfd3JpdGUoY2hpcCwgQUQ3NzRYX0NBUF9PRkZILCBkYXRhID4+IDgpOworCQlhZDc3NHhfaTJjX3dyaXRlKGNoaXAsIEFENzc0WF9DQVBfT0ZGTCwgZGF0YSk7CisJCWNoaXAtPmNhcF9vZmZzID0gZGF0YTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9DQVBfT0ZGUyhTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQ3NzR4X3Nob3dfY2FwX29mZnMsCisJCWFkNzc0eF9zdG9yZV9jYXBfb2Zmcyk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzc0eF9zaG93X2NhcF9nYWluKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBjaGlwLT5jYXBfZ2Fpbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzc0eF9zdG9yZV9jYXBfZ2FpbihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzc0eF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7CisKKwlpZiAoKCFyZXQpICYmIChkYXRhIDwgMHgxMDAwMCkpIHsKKwkJYWQ3NzR4X2kyY193cml0ZShjaGlwLCBBRDc3NFhfQ0FQX0dBSU5ILCBkYXRhID4+IDgpOworCQlhZDc3NHhfaTJjX3dyaXRlKGNoaXAsIEFENzc0WF9DQVBfR0FJTkwsIGRhdGEpOworCQljaGlwLT5jYXBfZ2FpbiA9IGRhdGE7CisJCXJldHVybiBsZW47CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0FQX0dBSU4oU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkNzc0eF9zaG93X2NhcF9nYWluLAorCQlhZDc3NHhfc3RvcmVfY2FwX2dhaW4pOworCitzdGF0aWMgc3NpemVfdCBhZDc3NHhfc2hvd19uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgY2hpcC0+bmFtZSk7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgYWQ3NzR4X3Nob3dfbmFtZSwgTlVMTCwgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZDc3NHhfYXR0cmlidXRlc1tdID0geworCSZpaW9fZGV2X2F0dHJfYXZhaWxhYmxlX2NvbnZlcnNpb25fbW9kZXMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NvbnZlcnNpb25fbW9kZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2FwX3NldHVwLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbjBfc2V0dXAuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2V4ZWNfc2V0dXAuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NhcF9vZmZzLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jYXBfZ2Fpbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW4wX2dhaW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luMF9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NhcDBfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jYXBkYWMwX3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2FwZGFjMV9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX25hbWUuZGV2X2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWQ3NzR4X2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZDc3NHhfYXR0cmlidXRlcywKK307CisKKy8qCisgKiBkYXRhIHJlYWR5IGV2ZW50cworICovCisKKyNkZWZpbmUgSUlPX0VWRU5UX0NPREVfQ0FQX1JEWSAgICAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDApCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX1ZUX1JEWSAgICAgIElJT19CVUZGRVJfRVZFTlRfQ09ERSgxKQorCisjZGVmaW5lIElJT19FVkVOVF9BVFRSX0NBUF9SRFlfU0goX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spCVwKKwlJSU9fRVZFTlRfQVRUUl9TSChjYXBfcmR5LCBfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykKKworI2RlZmluZSBJSU9fRVZFTlRfQVRUUl9WVF9SRFlfU0goX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spCVwKKwlJSU9fRVZFTlRfQVRUUl9TSCh2dF9yZHksIF9ldmxpc3QsIF9zaG93LCBfc3RvcmUsIF9tYXNrKQorCitzdGF0aWMgdm9pZCBhZDc3NHhfaW50ZXJydXB0X2hhbmRsZXJfYmgoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrX3MpCit7CisJc3RydWN0IGFkNzc0eF9jaGlwX2luZm8gKmNoaXAgPQorCQljb250YWluZXJfb2Yod29ya19zLCBzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbywgdGhyZXNoX3dvcmspOworCXU4IGludF9zdGF0dXM7CisKKwllbmFibGVfaXJxKGNoaXAtPmNsaWVudC0+aXJxKTsKKworCWFkNzc0eF9pMmNfcmVhZChjaGlwLCBBRDc3NFhfU1RBVFVTLCAmaW50X3N0YXR1cywgMSk7CisKKwlpZiAoaW50X3N0YXR1cyAmIEFENzc0WF9TVEFUVVNfUkRZQ0FQKQorCQlpaW9fcHVzaF9ldmVudChjaGlwLT5pbmRpb19kZXYsIDAsCisJCQkJSUlPX0VWRU5UX0NPREVfQ0FQX1JEWSwKKwkJCQljaGlwLT5sYXN0X3RpbWVzdGFtcCk7CisKKwlpZiAoaW50X3N0YXR1cyAmIEFENzc0WF9TVEFUVVNfUkRZVlQpCisJCWlpb19wdXNoX2V2ZW50KGNoaXAtPmluZGlvX2RldiwgMCwKKwkJCQlJSU9fRVZFTlRfQ09ERV9WVF9SRFksCisJCQkJY2hpcC0+bGFzdF90aW1lc3RhbXApOworfQorCitzdGF0aWMgaW50IGFkNzc0eF9pbnRlcnJ1cHRfaGFuZGxlcl90aChzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8sCisJCWludCBpbmRleCwKKwkJczY0IHRpbWVzdGFtcCwKKwkJaW50IG5vX3Rlc3QpCit7CisJc3RydWN0IGFkNzc0eF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwljaGlwLT5sYXN0X3RpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKwlzY2hlZHVsZV93b3JrKCZjaGlwLT50aHJlc2hfd29yayk7CisKKwlyZXR1cm4gMDsKK30KKworSUlPX0VWRU5UX1NIKGRhdGFfcmR5LCAmYWQ3NzR4X2ludGVycnVwdF9oYW5kbGVyX3RoKTsKKworc3RhdGljIHNzaXplX3QgYWQ3NzR4X3F1ZXJ5X291dF9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwkvKgorCSAqIEFENzc0WCBwcm92aWRlcyBvbmUgL1JEWSBwaW4sIHdoaWNoIGNhbiBiZSB1c2VkIGFzIGludGVycnVwdAorCSAqIGJ1dCB0aGUgcGluIGlzIG5vdCBjb25maWd1cmFibGUKKwkgKi8KKwlyZXR1cm4gc3ByaW50ZihidWYsICIxXG4iKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3NzR4X3NldF9vdXRfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJcmV0dXJuIGxlbjsKK30KKworSUlPX0VWRU5UX0FUVFJfQ0FQX1JEWV9TSChpaW9fZXZlbnRfZGF0YV9yZHksIGFkNzc0eF9xdWVyeV9vdXRfbW9kZSwgYWQ3NzR4X3NldF9vdXRfbW9kZSwgMCk7CitJSU9fRVZFTlRfQVRUUl9WVF9SRFlfU0goaWlvX2V2ZW50X2RhdGFfcmR5LCBhZDc3NHhfcXVlcnlfb3V0X21vZGUsIGFkNzc0eF9zZXRfb3V0X21vZGUsIDApOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWQ3NzR4X2V2ZW50X2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2V2ZW50X2F0dHJfY2FwX3JkeS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl92dF9yZHkuZGV2X2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWQ3NzR4X2V2ZW50X2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZDc3NHhfZXZlbnRfYXR0cmlidXRlcywKK307CisKKy8qCisgKiBkZXZpY2UgcHJvYmUgYW5kIHJlbW92ZQorICovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkNzc0eF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJaW50IHJldCA9IDAsIHJlZ2RvbmUgPSAwOworCXN0cnVjdCBhZDc3NHhfY2hpcF9pbmZvICpjaGlwID0ga3phbGxvYyhzaXplb2YoKmNoaXApLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2hpcCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKworCS8qIHRoaXMgaXMgb25seSB1c2VkIGZvciBkZXZpY2UgcmVtb3ZhbCBwdXJwb3NlcyAqLworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGNoaXApOworCisJY2hpcC0+Y2xpZW50ID0gY2xpZW50OworCWNoaXAtPm5hbWUgPSBpZC0+bmFtZTsKKworCWNoaXAtPmluZGlvX2RldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoY2hpcC0+aW5kaW9fZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX2NoaXA7CisJfQorCisJLyogRXN0YWJsaXNoIHRoYXQgdGhlIGlpb19kZXYgaXMgYSBjaGlsZCBvZiB0aGUgaTJjIGRldmljZSAqLworCWNoaXAtPmluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZjbGllbnQtPmRldjsKKwljaGlwLT5pbmRpb19kZXYtPmF0dHJzID0gJmFkNzc0eF9hdHRyaWJ1dGVfZ3JvdXA7CisJY2hpcC0+aW5kaW9fZGV2LT5ldmVudF9hdHRycyA9ICZhZDc3NHhfZXZlbnRfYXR0cmlidXRlX2dyb3VwOworCWNoaXAtPmluZGlvX2Rldi0+ZGV2X2RhdGEgPSAodm9pZCAqKShjaGlwKTsKKwljaGlwLT5pbmRpb19kZXYtPmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRTsKKwljaGlwLT5pbmRpb19kZXYtPm51bV9pbnRlcnJ1cHRfbGluZXMgPSAxOworCWNoaXAtPmluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoY2hpcC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2OworCXJlZ2RvbmUgPSAxOworCisJaWYgKGNsaWVudC0+aXJxKSB7CisJCXJldCA9IGlpb19yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShjbGllbnQtPmlycSwKKwkJCQljaGlwLT5pbmRpb19kZXYsCisJCQkJMCwKKwkJCQlJUlFGX1RSSUdHRVJfRkFMTElORywKKwkJCQkiYWQ3NzR4Iik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX2ZyZWVfZGV2OworCisJCWlpb19hZGRfZXZlbnRfdG9fbGlzdChpaW9fZXZlbnRfYXR0cl9jYXBfcmR5Lmxpc3RlbCwKKwkJCQkmY2hpcC0+aW5kaW9fZGV2LT5pbnRlcnJ1cHRzWzBdLT5ldl9saXN0KTsKKworCQlJTklUX1dPUksoJmNoaXAtPnRocmVzaF93b3JrLCBhZDc3NHhfaW50ZXJydXB0X2hhbmRsZXJfYmgpOworCX0KKworCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXMgY2FwYWNpdGl2ZSBzZW5zb3IgcmVnaXN0ZXJlZCwgaXJxOiAlZFxuIiwgaWQtPm5hbWUsIGNsaWVudC0+aXJxKTsKKworCXJldHVybiAwOworCitlcnJvcl9mcmVlX2RldjoKKwlpZiAocmVnZG9uZSkKKwkJaWlvX2RldmljZV91bnJlZ2lzdGVyKGNoaXAtPmluZGlvX2Rldik7CisJZWxzZQorCQlpaW9fZnJlZV9kZXZpY2UoY2hpcC0+aW5kaW9fZGV2KTsKK2Vycm9yX2ZyZWVfY2hpcDoKKwlrZnJlZShjaGlwKTsKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhZDc3NHhfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGFkNzc0eF9jaGlwX2luZm8gKmNoaXAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gY2hpcC0+aW5kaW9fZGV2OworCisJaWYgKGNsaWVudC0+aXJxKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShpbmRpb19kZXYsIDApOworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWtmcmVlKGNoaXApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBhZDc3NHhfaWRbXSA9IHsKKwl7ICJhZDc3NDUiLCAwIH0sCisJeyAiYWQ3NzQ2IiwgMCB9LAorCXsgImFkNzc0NyIsIDAgfSwKKwl7fQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGFkNzc0eF9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBhZDc3NHhfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFkNzc0eCIsCisJfSwKKwkucHJvYmUgPSBhZDc3NHhfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFkNzc0eF9yZW1vdmUpLAorCS5pZF90YWJsZSA9IGFkNzc0eF9pZCwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGFkNzc0eF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZhZDc3NHhfZHJpdmVyKTsKK30KKworc3RhdGljIF9fZXhpdCB2b2lkIGFkNzc0eF9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmFkNzc0eF9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJCYXJyeSBTb25nIDwyMWNuYmFvQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgYWQ3NzQ1LzYvNyBjYXBhY2l0aXZlIHNlbnNvciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKKworbW9kdWxlX2luaXQoYWQ3NzR4X2luaXQpOworbW9kdWxlX2V4aXQoYWQ3NzR4X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3ODE2LmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc4MTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDc0MTVhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3ODE2LmMKQEAgLTAsMCArMSw1MzUgQEAKKy8qCisgKiBBRDc4MTYgZGlnaXRhbCB0ZW1wZXJhdHVyZSBzZW5zb3IgZHJpdmVyIHN1cHBvcnRpbmcgQUQ3ODE2LzcvOAorICoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKworLyoKKyAqIEFENzgxNiBjb25maWcgbWFza3MKKyAqLworI2RlZmluZSBBRDc4MTZfRlVMTAkJCTB4MQorI2RlZmluZSBBRDc4MTZfUEQJCQkweDIKKyNkZWZpbmUgQUQ3ODE2X0NTX01BU0sJCQkweDcKKyNkZWZpbmUgQUQ3ODE2X0NTX01BWAkJCTB4NAorCisvKgorICogQUQ3ODE2IHRlbXBlcmF0dXJlIG1hc2tzCisgKi8KKyNkZWZpbmUgQUQ3ODE2X1ZBTFVFX09GRlNFVAkJNgorI2RlZmluZSBBRDc4MTZfQk9VTkRfVkFMVUVfQkFTRQkJMHg4CisjZGVmaW5lIEFENzgxNl9CT1VORF9WQUxVRV9NSU4JCS05NQorI2RlZmluZSBBRDc4MTZfQk9VTkRfVkFMVUVfTUFYCQkxNTIKKyNkZWZpbmUgQUQ3ODE2X1RFTVBfRkxPQVRfT0ZGU0VUCTIKKyNkZWZpbmUgQUQ3ODE2X1RFTVBfRkxPQVRfTUFTSwkJMHgzCisKKworLyoKKyAqIHN0cnVjdCBhZDc4MTZfY2hpcF9pbmZvIC0gY2hpcCBzcGVjaWZjIGluZm9ybWF0aW9uCisgKi8KKworc3RydWN0IGFkNzgxNl9jaGlwX2luZm8geworCWNvbnN0IGNoYXIgKm5hbWU7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaV9kZXY7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdGhyZXNoX3dvcms7CisJczY0IGxhc3RfdGltZXN0YW1wOworCXUxNiByZHdyX3BpbjsKKwl1MTYgY29udmVydF9waW47CisJdTE2IGJ1c3lfcGluOworCXU4ICBvdGlfZGF0YVtBRDc4MTZfQ1NfTUFYKzFdOworCXU4ICBjaGFubmVsX2lkOwkvKiAwIGFsd2F5cyBiZSB0ZW1wZXJhdHVyZSAqLworCXU4ICBtb2RlOworfTsKKworLyoKKyAqIGFkNzgxNiBkYXRhIGFjY2VzcyBieSBTUEkKKyAqLworc3RhdGljIGludCBhZDc4MTZfc3BpX3JlYWQoc3RydWN0IGFkNzgxNl9jaGlwX2luZm8gKmNoaXAsIHUxNiAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldiA9IGNoaXAtPnNwaV9kZXY7CisJaW50IHJldCA9IDA7CisKKwlncGlvX3NldF92YWx1ZShjaGlwLT5yZHdyX3BpbiwgMSk7CisJZ3Bpb19zZXRfdmFsdWUoY2hpcC0+cmR3cl9waW4sIDApOworCXJldCA9IHNwaV93cml0ZShzcGlfZGV2LCAmY2hpcC0+Y2hhbm5lbF9pZCwgc2l6ZW9mKGNoaXAtPmNoYW5uZWxfaWQpKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZzcGlfZGV2LT5kZXYsICJTUEkgY2hhbm5lbCBzZXR0aW5nIGVycm9yXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJZ3Bpb19zZXRfdmFsdWUoY2hpcC0+cmR3cl9waW4sIDEpOworCisKKwlpZiAoY2hpcC0+bW9kZSA9PSBBRDc4MTZfUEQpIHsgLyogb3BlcmF0aW5nIG1vZGUgMiAqLworCQlncGlvX3NldF92YWx1ZShjaGlwLT5jb252ZXJ0X3BpbiwgMSk7CisJCWdwaW9fc2V0X3ZhbHVlKGNoaXAtPmNvbnZlcnRfcGluLCAwKTsKKwl9IGVsc2UgeyAvKiBvcGVyYXRpbmcgbW9kZSAxICovCisJCWdwaW9fc2V0X3ZhbHVlKGNoaXAtPmNvbnZlcnRfcGluLCAwKTsKKwkJZ3Bpb19zZXRfdmFsdWUoY2hpcC0+Y29udmVydF9waW4sIDEpOworCX0KKworCXdoaWxlIChncGlvX2dldF92YWx1ZShjaGlwLT5idXN5X3BpbikpCisJCWNwdV9yZWxheCgpOworCisJZ3Bpb19zZXRfdmFsdWUoY2hpcC0+cmR3cl9waW4sIDApOworCWdwaW9fc2V0X3ZhbHVlKGNoaXAtPnJkd3JfcGluLCAxKTsKKwlyZXQgPSBzcGlfcmVhZChzcGlfZGV2LCAodTggKilkYXRhLCBzaXplb2YoKmRhdGEpKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZzcGlfZGV2LT5kZXYsICJTUEkgZGF0YSByZWFkIGVycm9yXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkqZGF0YSA9IGJlMTZfdG9fY3B1KCpkYXRhKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWQ3ODE2X3NwaV93cml0ZShzdHJ1Y3QgYWQ3ODE2X2NoaXBfaW5mbyAqY2hpcCwgdTggZGF0YSkKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldiA9IGNoaXAtPnNwaV9kZXY7CisJaW50IHJldCA9IDA7CisKKwlncGlvX3NldF92YWx1ZShjaGlwLT5yZHdyX3BpbiwgMSk7CisJZ3Bpb19zZXRfdmFsdWUoY2hpcC0+cmR3cl9waW4sIDApOworCXJldCA9IHNwaV93cml0ZShzcGlfZGV2LCAmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2Vycigmc3BpX2Rldi0+ZGV2LCAiU1BJIG90aSBkYXRhIHdyaXRlIGVycm9yXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzgxNl9zaG93X21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDc4MTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJaWYgKGNoaXAtPm1vZGUpCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgInBvd2VyLXNhdmVcbiIpOworCWVsc2UKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiZnVsbFxuIik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzgxNl9zdG9yZV9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3ODE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCWlmIChzdHJjbXAoYnVmLCAiZnVsbCIpKSB7CisJCWdwaW9fc2V0X3ZhbHVlKGNoaXAtPnJkd3JfcGluLCAxKTsKKwkJY2hpcC0+bW9kZSA9IEFENzgxNl9GVUxMOworCX0gZWxzZSB7CisJCWdwaW9fc2V0X3ZhbHVlKGNoaXAtPnJkd3JfcGluLCAwKTsKKwkJY2hpcC0+bW9kZSA9IEFENzgxNl9QRDsKKwl9CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKG1vZGUsIFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDc4MTZfc2hvd19tb2RlLAorCQlhZDc4MTZfc3RvcmVfbW9kZSwKKwkJMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzgxNl9zaG93X2F2YWlsYWJsZV9tb2RlcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiZnVsbFxucG93ZXItc2F2ZVxuIik7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoYXZhaWxhYmxlX21vZGVzLCBTX0lSVUdPLCBhZDc4MTZfc2hvd19hdmFpbGFibGVfbW9kZXMsIE5VTEwsIDApOworCitzdGF0aWMgc3NpemVfdCBhZDc4MTZfc2hvd19jaGFubmVsKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3ODE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBjaGlwLT5jaGFubmVsX2lkKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3ODE2X3N0b3JlX2NoYW5uZWwoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDc4MTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGRhdGEgPiBBRDc4MTZfQ1NfTUFYICYmIGRhdGEgIT0gQUQ3ODE2X0NTX01BU0spIHsKKwkJZGV2X2VycigmY2hpcC0+c3BpX2Rldi0+ZGV2LCAiSW52YWxpZCBjaGFubmVsIGlkICVsdSBmb3IgJXMuXG4iLAorCQkJZGF0YSwgY2hpcC0+bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSBpZiAoc3RyY21wKGNoaXAtPm5hbWUsICJhZDc4MTgiKSA9PSAwICYmIGRhdGEgPiAxKSB7CisJCWRldl9lcnIoJmNoaXAtPnNwaV9kZXYtPmRldiwKKwkJCSJJbnZhbGlkIGNoYW5uZWwgaWQgJWx1IGZvciBhZDc4MTguXG4iLCBkYXRhKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIGlmIChzdHJjbXAoY2hpcC0+bmFtZSwgImFkNzgxNiIpID09IDAgJiYgZGF0YSA+IDApIHsKKwkJZGV2X2VycigmY2hpcC0+c3BpX2Rldi0+ZGV2LAorCQkJIkludmFsaWQgY2hhbm5lbCBpZCAlbHUgZm9yIGFkNzgxNi5cbiIsIGRhdGEpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljaGlwLT5jaGFubmVsX2lkID0gZGF0YTsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoY2hhbm5lbCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkNzgxNl9zaG93X2NoYW5uZWwsCisJCWFkNzgxNl9zdG9yZV9jaGFubmVsLAorCQkwKTsKKworCitzdGF0aWMgc3NpemVfdCBhZDc4MTZfc2hvd192YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzgxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTE2IGRhdGE7CisJczggdmFsdWU7CisJaW50IHJldDsKKworCXJldCA9IGFkNzgxNl9zcGlfcmVhZChjaGlwLCAmZGF0YSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlkYXRhID4+PSBBRDc4MTZfVkFMVUVfT0ZGU0VUOworCisJaWYgKGNoaXAtPmNoYW5uZWxfaWQgPT0gMCkgeworCQl2YWx1ZSA9IChzOCkoKGRhdGEgPj4gQUQ3ODE2X1RFTVBfRkxPQVRfT0ZGU0VUKSAtIDEwMyk7CisJCWRhdGEgJj0gQUQ3ODE2X1RFTVBfRkxPQVRfTUFTSzsKKwkJaWYgKHZhbHVlIDwgMCkKKwkJCWRhdGEgPSAoMSA8PCBBRDc4MTZfVEVNUF9GTE9BVF9PRkZTRVQpIC0gZGF0YTsKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWQuJS4yZFxuIiwgdmFsdWUsIGRhdGEgKiAyNSk7CisJfSBlbHNlCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBkYXRhKTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUih2YWx1ZSwgU19JUlVHTywgYWQ3ODE2X3Nob3dfdmFsdWUsIE5VTEwsIDApOworCitzdGF0aWMgc3NpemVfdCBhZDc4MTZfc2hvd19uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3ODE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgY2hpcC0+bmFtZSk7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgYWQ3ODE2X3Nob3dfbmFtZSwgTlVMTCwgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZDc4MTZfYXR0cmlidXRlc1tdID0geworCSZpaW9fZGV2X2F0dHJfYXZhaWxhYmxlX21vZGVzLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9tb2RlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jaGFubmVsLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl92YWx1ZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDc4MTZfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkNzgxNl9hdHRyaWJ1dGVzLAorfTsKKworLyoKKyAqIHRlbXBlcmF0dXJlIGJvdW5kIGV2ZW50cworICovCisKKyNkZWZpbmUgSUlPX0VWRU5UX0NPREVfQUQ3ODE2X09USSAgICBJSU9fQlVGRkVSX0VWRU5UX0NPREUoMCkKKworc3RhdGljIHZvaWQgYWQ3ODE2X2ludGVycnVwdF9iaChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmtfcykKK3sKKwlzdHJ1Y3QgYWQ3ODE2X2NoaXBfaW5mbyAqY2hpcCA9CisJCWNvbnRhaW5lcl9vZih3b3JrX3MsIHN0cnVjdCBhZDc4MTZfY2hpcF9pbmZvLCB0aHJlc2hfd29yayk7CisKKwllbmFibGVfaXJxKGNoaXAtPnNwaV9kZXYtPmlycSk7CisKKwlpaW9fcHVzaF9ldmVudChjaGlwLT5pbmRpb19kZXYsIDAsCisJCQlJSU9fRVZFTlRfQ09ERV9BRDc4MTZfT1RJLAorCQkJY2hpcC0+bGFzdF90aW1lc3RhbXApOworfQorCitzdGF0aWMgaW50IGFkNzgxNl9pbnRlcnJ1cHQoc3RydWN0IGlpb19kZXYgKmRldl9pbmZvLAorCQlpbnQgaW5kZXgsCisJCXM2NCB0aW1lc3RhbXAsCisJCWludCBub190ZXN0KQoreworCXN0cnVjdCBhZDc4MTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJY2hpcC0+bGFzdF90aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisJc2NoZWR1bGVfd29yaygmY2hpcC0+dGhyZXNoX3dvcmspOworCisJcmV0dXJuIDA7Cit9CisKK0lJT19FVkVOVF9TSChhZDc4MTYsICZhZDc4MTZfaW50ZXJydXB0KTsKKworc3RhdGljIHNzaXplX3QgYWQ3ODE2X3Nob3dfb3RpKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3ODE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwlpbnQgdmFsdWU7CisKKwlpZiAoY2hpcC0+Y2hhbm5lbF9pZCA+IEFENzgxNl9DU19NQVgpIHsKKwkJZGV2X2VycihkZXYsICJJbnZhbGlkIG90aSBjaGFubmVsIGlkICVkLlxuIiwgY2hpcC0+Y2hhbm5lbF9pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSBpZiAoY2hpcC0+Y2hhbm5lbF9pZCA9PSAwKSB7CisJCXZhbHVlID0gQUQ3ODE2X0JPVU5EX1ZBTFVFX01JTiArCisJCQkoY2hpcC0+b3RpX2RhdGFbY2hpcC0+Y2hhbm5lbF9pZF0gLQorCQkJQUQ3ODE2X0JPVU5EX1ZBTFVFX0JBU0UpOworCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsdWUpOworCX0gZWxzZQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgY2hpcC0+b3RpX2RhdGFbY2hpcC0+Y2hhbm5lbF9pZF0pOworfQorCitzdGF0aWMgaW5saW5lIHNzaXplX3QgYWQ3ODE2X3NldF9vdGkoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDc4MTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCWxvbmcgdmFsdWU7CisJdTggZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsdWUpOworCisJaWYgKGNoaXAtPmNoYW5uZWxfaWQgPiBBRDc4MTZfQ1NfTUFYKSB7CisJCWRldl9lcnIoZGV2LCAiSW52YWxpZCBvdGkgY2hhbm5lbCBpZCAlZC5cbiIsIGNoaXAtPmNoYW5uZWxfaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgaWYgKGNoaXAtPmNoYW5uZWxfaWQgPT0gMCkgeworCQlpZiAocmV0IHx8IHZhbHVlIDwgQUQ3ODE2X0JPVU5EX1ZBTFVFX01JTiB8fAorCQkJdmFsdWUgPiBBRDc4MTZfQk9VTkRfVkFMVUVfTUFYKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJZGF0YSA9ICh1OCkodmFsdWUgLSBBRDc4MTZfQk9VTkRfVkFMVUVfTUlOICsKKwkJCUFENzgxNl9CT1VORF9WQUxVRV9CQVNFKTsKKwl9IGVsc2UgeworCQlpZiAocmV0IHx8IHZhbHVlIDwgQUQ3ODE2X0JPVU5EX1ZBTFVFX0JBU0UgfHwgdmFsdWUgPiAyNTUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlkYXRhID0gKHU4KXZhbHVlOworCX0KKworCXJldCA9IGFkNzgxNl9zcGlfd3JpdGUoY2hpcCwgZGF0YSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljaGlwLT5vdGlfZGF0YVtjaGlwLT5jaGFubmVsX2lkXSA9IGRhdGE7CisKKwlyZXR1cm4gbGVuOworfQorCitJSU9fRVZFTlRfQVRUUl9TSChvdGksIGlpb19ldmVudF9hZDc4MTYsCisJCWFkNzgxNl9zaG93X290aSwgYWQ3ODE2X3NldF9vdGksIDApOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWQ3ODE2X2V2ZW50X2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2V2ZW50X2F0dHJfb3RpLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkNzgxNl9ldmVudF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWQ3ODE2X2V2ZW50X2F0dHJpYnV0ZXMsCit9OworCisvKgorICogZGV2aWNlIHByb2JlIGFuZCByZW1vdmUKKyAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZDc4MTZfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaV9kZXYpCit7CisJc3RydWN0IGFkNzgxNl9jaGlwX2luZm8gKmNoaXA7CisJdW5zaWduZWQgc2hvcnQgKnBpbnMgPSBzcGlfZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaTsKKworCWlmICghcGlucykgeworCQlkZXZfZXJyKCZzcGlfZGV2LT5kZXYsICJObyBuZWNlc3NhcnkgR1BJTyBwbGF0Zm9ybSBkYXRhLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNoaXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWQ3ODE2X2NoaXBfaW5mbyksIEdGUF9LRVJORUwpOworCisJaWYgKGNoaXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiB0aGlzIGlzIG9ubHkgdXNlZCBmb3IgZGV2aWNlIHJlbW92YWwgcHVycG9zZXMgKi8KKwlkZXZfc2V0X2RydmRhdGEoJnNwaV9kZXYtPmRldiwgY2hpcCk7CisKKwljaGlwLT5zcGlfZGV2ID0gc3BpX2RldjsKKwljaGlwLT5uYW1lID0gc3BpX2Rldi0+bW9kYWxpYXM7CisJZm9yIChpID0gMDsgaSA8PSBBRDc4MTZfQ1NfTUFYOyBpKyspCisJCWNoaXAtPm90aV9kYXRhW2ldID0gMjAzOworCWNoaXAtPnJkd3JfcGluID0gcGluc1swXTsKKwljaGlwLT5jb252ZXJ0X3BpbiA9IHBpbnNbMV07CisJY2hpcC0+YnVzeV9waW4gPSBwaW5zWzJdOworCisJcmV0ID0gZ3Bpb19yZXF1ZXN0KGNoaXAtPnJkd3JfcGluLCBjaGlwLT5uYW1lKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnNwaV9kZXYtPmRldiwgIkZhaWwgdG8gcmVxdWVzdCByZHdyIGdwaW8gUElOICVkLlxuIiwKKwkJCWNoaXAtPnJkd3JfcGluKTsKKwkJZ290byBlcnJvcl9mcmVlX2NoaXA7CisJfQorCWdwaW9fZGlyZWN0aW9uX2lucHV0KGNoaXAtPnJkd3JfcGluKTsKKwlyZXQgPSBncGlvX3JlcXVlc3QoY2hpcC0+Y29udmVydF9waW4sIGNoaXAtPm5hbWUpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3BpX2Rldi0+ZGV2LCAiRmFpbCB0byByZXF1ZXN0IGNvbnZlcnQgZ3BpbyBQSU4gJWQuXG4iLAorCQkJY2hpcC0+Y29udmVydF9waW4pOworCQlnb3RvIGVycm9yX2ZyZWVfZ3Bpb19yZHdyOworCX0KKwlncGlvX2RpcmVjdGlvbl9pbnB1dChjaGlwLT5jb252ZXJ0X3Bpbik7CisJcmV0ID0gZ3Bpb19yZXF1ZXN0KGNoaXAtPmJ1c3lfcGluLCBjaGlwLT5uYW1lKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnNwaV9kZXYtPmRldiwgIkZhaWwgdG8gcmVxdWVzdCBidXN5IGdwaW8gUElOICVkLlxuIiwKKwkJCWNoaXAtPmJ1c3lfcGluKTsKKwkJZ290byBlcnJvcl9mcmVlX2dwaW9fY29udmVydDsKKwl9CisJZ3Bpb19kaXJlY3Rpb25faW5wdXQoY2hpcC0+YnVzeV9waW4pOworCisJY2hpcC0+aW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChjaGlwLT5pbmRpb19kZXYgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfZ3BpbzsKKwl9CisKKwljaGlwLT5pbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmc3BpX2Rldi0+ZGV2OworCWNoaXAtPmluZGlvX2Rldi0+YXR0cnMgPSAmYWQ3ODE2X2F0dHJpYnV0ZV9ncm91cDsKKwljaGlwLT5pbmRpb19kZXYtPmV2ZW50X2F0dHJzID0gJmFkNzgxNl9ldmVudF9hdHRyaWJ1dGVfZ3JvdXA7CisJY2hpcC0+aW5kaW9fZGV2LT5kZXZfZGF0YSA9ICh2b2lkICopY2hpcDsKKwljaGlwLT5pbmRpb19kZXYtPmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRTsKKwljaGlwLT5pbmRpb19kZXYtPm51bV9pbnRlcnJ1cHRfbGluZXMgPSAxOworCWNoaXAtPmluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoY2hpcC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2OworCisJaWYgKHNwaV9kZXYtPmlycSkgeworCQkvKiBPbmx5IGxvdyB0cmlnZ2VyIGlzIHN1cHBvcnRlZCBpbiBhZDc4MTYvNy84ICovCisJCXJldCA9IGlpb19yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShzcGlfZGV2LT5pcnEsCisJCQkJY2hpcC0+aW5kaW9fZGV2LAorCQkJCTAsCisJCQkJSVJRRl9UUklHR0VSX0xPVywKKwkJCQljaGlwLT5uYW1lKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfdW5yZWdfZGV2OworCisJCS8qCisJCSAqIFRoZSBldmVudCBoYW5kbGVyIGxpc3QgZWxlbWVudCByZWZlciB0byBpaW9fZXZlbnRfYWQ3ODE2LgorCQkgKiBBbGwgZXZlbnQgYXR0cmlidXRlcyBiaW5kIHRvIHRoZSBzYW1lIGV2ZW50IGhhbmRsZXIuCisJCSAqIFNvLCBvbmx5IHJlZ2lzdGVyIGV2ZW50IGhhbmRsZXIgb25jZS4KKwkJICovCisJCWlpb19hZGRfZXZlbnRfdG9fbGlzdCgmaWlvX2V2ZW50X2FkNzgxNiwKKwkJCQkmY2hpcC0+aW5kaW9fZGV2LT5pbnRlcnJ1cHRzWzBdLT5ldl9saXN0KTsKKworCQlJTklUX1dPUksoJmNoaXAtPnRocmVzaF93b3JrLCBhZDc4MTZfaW50ZXJydXB0X2JoKTsKKwl9CisKKwlkZXZfaW5mbygmc3BpX2Rldi0+ZGV2LCAiJXMgdGVtcGVyYXR1cmUgc2Vuc29yIGFuZCBBREMgcmVnaXN0ZXJlZC5cbiIsCisJCQkgY2hpcC0+bmFtZSk7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfdW5yZWdfZGV2OgorCWlpb19kZXZpY2VfdW5yZWdpc3RlcihjaGlwLT5pbmRpb19kZXYpOworZXJyb3JfZnJlZV9kZXY6CisJaWlvX2ZyZWVfZGV2aWNlKGNoaXAtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX2dwaW86CisJZ3Bpb19mcmVlKGNoaXAtPmJ1c3lfcGluKTsKK2Vycm9yX2ZyZWVfZ3Bpb19jb252ZXJ0OgorCWdwaW9fZnJlZShjaGlwLT5jb252ZXJ0X3Bpbik7CitlcnJvcl9mcmVlX2dwaW9fcmR3cjoKKwlncGlvX2ZyZWUoY2hpcC0+cmR3cl9waW4pOworZXJyb3JfZnJlZV9jaGlwOgorCWtmcmVlKGNoaXApOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYWQ3ODE2X3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldikKK3sKKwlzdHJ1Y3QgYWQ3ODE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9nZXRfZHJ2ZGF0YSgmc3BpX2Rldi0+ZGV2KTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gY2hpcC0+aW5kaW9fZGV2OworCisJZGV2X3NldF9kcnZkYXRhKCZzcGlfZGV2LT5kZXYsIE5VTEwpOworCWlmIChzcGlfZGV2LT5pcnEpCisJCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKGluZGlvX2RldiwgMCk7CisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJaWlvX2ZyZWVfZGV2aWNlKGNoaXAtPmluZGlvX2Rldik7CisJZ3Bpb19mcmVlKGNoaXAtPmJ1c3lfcGluKTsKKwlncGlvX2ZyZWUoY2hpcC0+Y29udmVydF9waW4pOworCWdwaW9fZnJlZShjaGlwLT5yZHdyX3Bpbik7CisJa2ZyZWUoY2hpcCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIGFkNzgxNl9pZFtdID0geworCXsgImFkNzgxNiIsIDAgfSwKKwl7ICJhZDc4MTciLCAwIH0sCisJeyAiYWQ3ODE4IiwgMCB9LAorCXt9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHNwaSwgYWQ3ODE2X2lkKTsKKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFkNzgxNl9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYWQ3ODE2IiwKKwkJLmJ1cyA9ICZzcGlfYnVzX3R5cGUsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gYWQ3ODE2X3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZDc4MTZfcmVtb3ZlKSwKKwkuaWRfdGFibGUgPSBhZDc4MTZfaWQsCit9OworCitzdGF0aWMgX19pbml0IGludCBhZDc4MTZfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZhZDc4MTZfZHJpdmVyKTsKK30KKworc3RhdGljIF9fZXhpdCB2b2lkIGFkNzgxNl9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZDc4MTZfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiU29uaWMgWmhhbmcgPHNvbmljLnpoYW5nQGFuYWxvZy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFENzgxNi83LzggZGlnaXRhbCIKKwkJCSIgdGVtcGVyYXR1cmUgc2Vuc29yIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworCittb2R1bGVfaW5pdChhZDc4MTZfaW5pdCk7Cittb2R1bGVfZXhpdChhZDc4MTZfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc4ODcuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzg4Ny5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMmEyMTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc4ODcuaApAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIEFENzg4NyBTUEkgQURDIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKyNpZm5kZWYgSUlPX0FEQ19BRDc4ODdfSF8KKyNkZWZpbmUgSUlPX0FEQ19BRDc4ODdfSF8KKworI2RlZmluZSBBRDc4ODdfUkVGX0RJUwkJKDEgPDwgNSkgLyogb24tY2hpcCByZWZlcmVuY2UgZGlzYWJsZSAqLworI2RlZmluZSBBRDc4ODdfRFVBTAkJKDEgPDwgNCkgLyogZHVhbC1jaGFubmVsIG1vZGUgKi8KKyNkZWZpbmUgQUQ3ODg3X0NIX0FJTjEJCSgxIDw8IDMpIC8qIGNvbnZlcnQgb24gY2hhbm5lbCAxLCBEVUFMPTEgKi8KKyNkZWZpbmUgQUQ3ODg3X0NIX0FJTjAJCSgwIDw8IDMpIC8qIGNvbnZlcnQgb24gY2hhbm5lbCAwLCBEVUFMPTAsMSAqLworI2RlZmluZSBBRDc4ODdfUE1fTU9ERTEJCSgwKQkgLyogQ1MgYmFzZWQgc2h1dGRvd24gKi8KKyNkZWZpbmUgQUQ3ODg3X1BNX01PREUyCQkoMSkJIC8qIGZ1bGwgb24gKi8KKyNkZWZpbmUgQUQ3ODg3X1BNX01PREUzCQkoMikJIC8qIGF1dG8gc2h1dGRvd24gYWZ0ZXIgY29udmVyc2lvbiAqLworI2RlZmluZSBBRDc4ODdfUE1fTU9ERTQJCSgzKQkgLyogc3RhbmRieSBtb2RlICovCisKK2VudW0gYWQ3ODg3X2NoYW5uZWxzIHsKKwlBRDc4ODdfQ0gwLAorCUFENzg4N19DSDBfQ0gxLAorCUFENzg4N19DSDEsCit9OworCisjZGVmaW5lIFJFU19NQVNLKGJpdHMpCSgoMSA8PCAoYml0cykpIC0gMSkgLyogVE9ETzogbW92ZSB0aGlzIGludG8gYSBjb21tb24gaGVhZGVyICovCisKKy8qCisgKiBUT0RPOiBzdHJ1Y3QgYWQ3ODg3X3BsYXRmb3JtX2RhdGEgbmVlZHMgdG8gZ28gaW50byBpbmNsdWRlL2xpbnV4L2lpbworICovCisKK3N0cnVjdCBhZDc4ODdfcGxhdGZvcm1fZGF0YSB7CisJLyogRXh0ZXJuYWwgVnJlZiB2b2x0YWdlIGFwcGxpZWQgKi8KKwl1MTYJCQkJdnJlZl9tdjsKKwkvKgorCSAqIEFENzg4NzoKKwkgKiBJbiBzaW5nbGUgY2hhbm5lbCBtb2RlIGVuX2R1YWwgPSBmbGFzZSwgQUlOMS9WcmVmIHBpbnMgYXNzdW1lcyBpdHMKKwkgKiBWcmVmIGZ1bmN0aW9uLiBJbiBkdWFsIGNoYW5uZWwgbW9kZSBlbl9kdWFsID0gdHJ1ZSwgQUlOMSBiZWNvbWVzIHRoZQorCSAqIHNlY29uZCBpbnB1dCBjaGFubmVsLCBhbmQgVnJlZiBpcyBpbnRlcm5hbGx5IGNvbm5lY3RlZCB0byBWZGQuCisJICovCisJYm9vbAkJCQllbl9kdWFsOworCS8qCisJICogQUQ3ODg3OgorCSAqIHVzZV9vbmNoaXBfcmVmID0gdHJ1ZSwgdGhlIFZyZWYgaXMgaW50ZXJuYWxseSBjb25uZWN0ZWQgdG8gdGhlIDIuNTAwVgorCSAqIFZvbHRhZ2UgcmVmZXJlbmNlLiBJZiB1c2Vfb25jaGlwX3JlZiA9IGZhbHNlLCB0aGUgcmVmZXJlbmNlIHZvbHRhZ2UKKwkgKiBpcyBzdXBwbGllZCBieSBBSU4xL1ZyZWYKKwkgKi8KKwlib29sCQkJCXVzZV9vbmNoaXBfcmVmOworfTsKKworc3RydWN0IGFkNzg4N19jaGlwX2luZm8geworCXU4CQkJCWJpdHM7CQkvKiBudW1iZXIgb2YgQURDIGJpdHMgKi8KKwl1OAkJCQlzdG9yYWdlYml0czsJLyogbnVtYmVyIG9mIGJpdHMgcmVhZCBmcm9tIHRoZSBBREMgKi8KKwl1OAkJCQlsZWZ0X3NoaWZ0OwkvKiBudW1iZXIgb2YgYml0cyB0aGUgc2FtcGxlIG11c3QgYmUgc2hpZnRlZCAqLworCWNoYXIJCQkJc2lnbjsJCS8qIFtzXWlnbmVkIG9yIFt1XW5zaWduZWQgKi8KKwl1MTYJCQkJaW50X3ZyZWZfbXY7CS8qIGludGVybmFsIHJlZmVyZW5jZSB2b2x0YWdlICovCit9OworCitzdHJ1Y3QgYWQ3ODg3X3N0YXRlIHsKKwlzdHJ1Y3QgaWlvX2RldgkJCSppbmRpb19kZXY7CisJc3RydWN0IHNwaV9kZXZpY2UJCSpzcGk7CisJY29uc3Qgc3RydWN0IGFkNzg4N19jaGlwX2luZm8JKmNoaXBfaW5mbzsKKwlzdHJ1Y3QgcmVndWxhdG9yCQkqcmVnOworCXN0cnVjdCB3b3JrX3N0cnVjdAkJcG9sbF93b3JrOworCWF0b21pY190CQkJcHJvdGVjdF9yaW5nOworCXUxNgkJCQlpbnRfdnJlZl9tdjsKKwlib29sCQkJCWVuX2R1YWw7CisJc3RydWN0IHNwaV90cmFuc2ZlcgkJeGZlcls0XTsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UJCW1zZ1szXTsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UJCSpyaW5nX21zZzsKKwl1bnNpZ25lZCBjaGFyCQkJdHhfY21kX2J1Zls4XTsKKworCS8qCisJICogRE1BICh0aHVzIGNhY2hlIGNvaGVyZW5jeSBtYWludGVuYW5jZSkgcmVxdWlyZXMgdGhlCisJICogdHJhbnNmZXIgYnVmZmVycyB0byBsaXZlIGluIHRoZWlyIG93biBjYWNoZSBsaW5lcy4KKwkgKi8KKworCXVuc2lnbmVkIGNoYXIJCQlkYXRhWzRdIF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKK307CisKK2VudW0gYWQ3ODg3X3N1cHBvcnRlZF9kZXZpY2VfaWRzIHsKKwlJRF9BRDc4ODcKK307CisKKyNpZmRlZiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSCitpbnQgYWQ3ODg3X3NjYW5fZnJvbV9yaW5nKHN0cnVjdCBhZDc4ODdfc3RhdGUgKnN0LCBsb25nIG1hc2spOworaW50IGFkNzg4N19yZWdpc3Rlcl9yaW5nX2Z1bmNzX2FuZF9pbml0KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwordm9pZCBhZDc4ODdfcmluZ19jbGVhbnVwKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOworI2Vsc2UgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLworc3RhdGljIGlubGluZSBpbnQgYWQ3ODg3X3NjYW5fZnJvbV9yaW5nKHN0cnVjdCBhZDc4ODdfc3RhdGUgKnN0LCBsb25nIG1hc2spCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CithZDc4ODdfcmVnaXN0ZXJfcmluZ19mdW5jc19hbmRfaW5pdChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWQ3ODg3X3JpbmdfY2xlYW51cChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworfQorI2VuZGlmIC8qIENPTkZJR19JSU9fUklOR19CVUZGRVIgKi8KKyNlbmRpZiAvKiBJSU9fQURDX0FENzg4N19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3ODg3X2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzg4N19jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg1OTA4OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzg4N19jb3JlLmMKQEAgLTAsMCArMSwzMDUgQEAKKy8qCisgKiBBRDc4ODcgU1BJIEFEQyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKyNpbmNsdWRlICIuLi9yaW5nX2dlbmVyaWMuaCIKKyNpbmNsdWRlICJhZGMuaCIKKworI2luY2x1ZGUgImFkNzg4Ny5oIgorCitzdGF0aWMgaW50IGFkNzg4N19zY2FuX2RpcmVjdChzdHJ1Y3QgYWQ3ODg3X3N0YXRlICpzdCwgdW5zaWduZWQgY2gpCit7CisJaW50IHJldCA9IHNwaV9zeW5jKHN0LT5zcGksICZzdC0+bXNnW2NoXSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAoc3QtPmRhdGFbKGNoICogMildIDw8IDgpIHwgc3QtPmRhdGFbKGNoICogMikgKyAxXTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3ODg3X3NjYW4oc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3ODg3X3N0YXRlICpzdCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmRldl9pbmZvLT5tbG9jayk7CisJaWYgKGlpb19yaW5nX2VuYWJsZWQoZGV2X2luZm8pKQorCQlyZXQgPSBhZDc4ODdfc2Nhbl9mcm9tX3Jpbmcoc3QsIDEgPDwgdGhpc19hdHRyLT5hZGRyZXNzKTsKKwllbHNlCisJCXJldCA9IGFkNzg4N19zY2FuX2RpcmVjdChzdCwgdGhpc19hdHRyLT5hZGRyZXNzKTsKKwltdXRleF91bmxvY2soJmRldl9pbmZvLT5tbG9jayk7CisKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAocmV0ID4+IHN0LT5jaGlwX2luZm8tPmxlZnRfc2hpZnQpICYKKwkJICAgICAgIFJFU19NQVNLKHN0LT5jaGlwX2luZm8tPmJpdHMpKTsKK30KK3N0YXRpYyBJSU9fREVWX0FUVFJfSU5fUkFXKDAsIGFkNzg4N19zY2FuLCAwKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfSU5fUkFXKDEsIGFkNzg4N19zY2FuLCAxKTsKKworc3RhdGljIHNzaXplX3QgYWQ3ODg3X3Nob3dfc2NhbGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCWNoYXIgKmJ1ZikKK3sKKwkvKiBEcml2ZXIgY3VycmVudGx5IG9ubHkgc3VwcG9ydCBpbnRlcm5hbCB2cmVmICovCisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzg4N19zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGRldl9pbmZvKTsKKwkvKiBDb3JyZXNwb25kcyB0byBWcmVmIC8gMl4oYml0cykgKi8KKwl1bnNpZ25lZCBpbnQgc2NhbGVfdXYgPSAoc3QtPmludF92cmVmX212ICogMTAwMCkgPj4gc3QtPmNoaXBfaW5mby0+Yml0czsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkLiVkXG4iLCBzY2FsZV91diAvIDEwMDAsIHNjYWxlX3V2ICUgMTAwMCk7Cit9CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGluX3NjYWxlLCBTX0lSVUdPLCBhZDc4ODdfc2hvd19zY2FsZSwgTlVMTCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzg4N19zaG93X25hbWUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDc4ODdfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShkZXZfaW5mbyk7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgc3BpX2dldF9kZXZpY2VfaWQoc3QtPnNwaSktPm5hbWUpOworfQorc3RhdGljIElJT19ERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBhZDc4ODdfc2hvd19uYW1lLCBOVUxMLCAwKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkNzg4N19hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19kZXZfYXR0cl9pbjBfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbjFfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbl9zY2FsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgbW9kZV90IGFkNzg4N19hdHRyX2lzX3Zpc2libGUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBpbnQgbikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzg4N19zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGRldl9pbmZvKTsKKworCW1vZGVfdCBtb2RlID0gYXR0ci0+bW9kZTsKKworCWlmICgoYXR0ciA9PSAmaWlvX2Rldl9hdHRyX2luMV9yYXcuZGV2X2F0dHIuYXR0cikgJiYgIXN0LT5lbl9kdWFsKQorCQkJbW9kZSA9IDA7CisKKwlyZXR1cm4gbW9kZTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWQ3ODg3X2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZDc4ODdfYXR0cmlidXRlcywKKwkuaXNfdmlzaWJsZSA9IGFkNzg4N19hdHRyX2lzX3Zpc2libGUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFkNzg4N19jaGlwX2luZm8gYWQ3ODg3X2NoaXBfaW5mb190YmxbXSA9IHsKKwkvKgorCSAqIE1vcmUgZGV2aWNlcyBhZGRlZCBpbiBmdXR1cmUKKwkgKi8KKwlbSURfQUQ3ODg3XSA9IHsKKwkJLmJpdHMgPSAxMiwKKwkJLnN0b3JhZ2ViaXRzID0gMTYsCisJCS5sZWZ0X3NoaWZ0ID0gMCwKKwkJLnNpZ24gPSBJSU9fU0NBTl9FTF9UWVBFX1VOU0lHTkVELAorCQkuaW50X3ZyZWZfbXYgPSAyNTAwLAorCX0sCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZDc4ODdfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWQ3ODg3X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gc3BpLT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgYWQ3ODg3X3N0YXRlICpzdDsKKwlpbnQgcmV0LCB2b2x0YWdlX3V2ID0gMDsKKworCXN0ID0ga3phbGxvYyhzaXplb2YoKnN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCisJc3QtPnJlZyA9IHJlZ3VsYXRvcl9nZXQoJnNwaS0+ZGV2LCAidmNjIik7CisJaWYgKCFJU19FUlIoc3QtPnJlZykpIHsKKwkJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShzdC0+cmVnKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfcHV0X3JlZzsKKworCQl2b2x0YWdlX3V2ID0gcmVndWxhdG9yX2dldF92b2x0YWdlKHN0LT5yZWcpOworCX0KKworCXN0LT5jaGlwX2luZm8gPQorCQkmYWQ3ODg3X2NoaXBfaW5mb190Ymxbc3BpX2dldF9kZXZpY2VfaWQoc3BpKS0+ZHJpdmVyX2RhdGFdOworCisJc3BpX3NldF9kcnZkYXRhKHNwaSwgc3QpOworCisJYXRvbWljX3NldCgmc3QtPnByb3RlY3RfcmluZywgMCk7CisJc3QtPnNwaSA9IHNwaTsKKworCXN0LT5pbmRpb19kZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKHN0LT5pbmRpb19kZXYgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2Rpc2FibGVfcmVnOworCX0KKworCS8qIEVzdGFiaWxpc2ggdGhhdCB0aGUgaWlvX2RldiBpcyBhIGNoaWxkIG9mIHRoZSBzcGkgZGV2aWNlICovCisJc3QtPmluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZzcGktPmRldjsKKwlzdC0+aW5kaW9fZGV2LT5hdHRycyA9ICZhZDc4ODdfYXR0cmlidXRlX2dyb3VwOworCXN0LT5pbmRpb19kZXYtPmRldl9kYXRhID0gKHZvaWQgKikoc3QpOworCXN0LT5pbmRpb19kZXYtPmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRTsKKwlzdC0+aW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJLyogU2V0dXAgZGVmYXVsdCBtZXNzYWdlICovCisKKwlzdC0+dHhfY21kX2J1ZlswXSA9IEFENzg4N19DSF9BSU4wIHwgQUQ3ODg3X1BNX01PREU0IHwKKwkJCSAgICAoKHBkYXRhICYmIHBkYXRhLT51c2Vfb25jaGlwX3JlZikgPworCQkJICAgIDAgOiBBRDc4ODdfUkVGX0RJUyk7CisKKwlzdC0+eGZlclswXS5yeF9idWYgPSAmc3QtPmRhdGFbMF07CisJc3QtPnhmZXJbMF0udHhfYnVmID0gJnN0LT50eF9jbWRfYnVmWzBdOworCXN0LT54ZmVyWzBdLmxlbiA9IDI7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZzdC0+bXNnW0FENzg4N19DSDBdKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmc3QtPnhmZXJbMF0sICZzdC0+bXNnW0FENzg4N19DSDBdKTsKKworCWlmIChwZGF0YSAmJiBwZGF0YS0+ZW5fZHVhbCkgeworCQlzdC0+dHhfY21kX2J1ZlswXSB8PSBBRDc4ODdfRFVBTCB8IEFENzg4N19SRUZfRElTOworCisJCXN0LT50eF9jbWRfYnVmWzJdID0gQUQ3ODg3X0NIX0FJTjEgfCBBRDc4ODdfRFVBTCB8CisJCQkJICAgIEFENzg4N19SRUZfRElTIHwgQUQ3ODg3X1BNX01PREU0OworCQlzdC0+dHhfY21kX2J1Zls0XSA9IEFENzg4N19DSF9BSU4wIHwgQUQ3ODg3X0RVQUwgfAorCQkJCSAgICBBRDc4ODdfUkVGX0RJUyB8IEFENzg4N19QTV9NT0RFNDsKKwkJc3QtPnR4X2NtZF9idWZbNl0gPSBBRDc4ODdfQ0hfQUlOMSB8IEFENzg4N19EVUFMIHwKKwkJCQkgICAgQUQ3ODg3X1JFRl9ESVMgfCBBRDc4ODdfUE1fTU9ERTQ7CisKKwkJc3QtPnhmZXJbMV0ucnhfYnVmID0gJnN0LT5kYXRhWzBdOworCQlzdC0+eGZlclsxXS50eF9idWYgPSAmc3QtPnR4X2NtZF9idWZbMl07CisJCXN0LT54ZmVyWzFdLmxlbiA9IDI7CisKKwkJc3QtPnhmZXJbMl0ucnhfYnVmID0gJnN0LT5kYXRhWzJdOworCQlzdC0+eGZlclsyXS50eF9idWYgPSAmc3QtPnR4X2NtZF9idWZbNF07CisJCXN0LT54ZmVyWzJdLmxlbiA9IDI7CisKKwkJc3BpX21lc3NhZ2VfaW5pdCgmc3QtPm1zZ1tBRDc4ODdfQ0gwX0NIMV0pOworCQlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmc3QtPnhmZXJbMV0sICZzdC0+bXNnW0FENzg4N19DSDBfQ0gxXSk7CisJCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZzdC0+eGZlclsyXSwgJnN0LT5tc2dbQUQ3ODg3X0NIMF9DSDFdKTsKKworCQlzdC0+eGZlclszXS5yeF9idWYgPSAmc3QtPmRhdGFbMF07CisJCXN0LT54ZmVyWzNdLnR4X2J1ZiA9ICZzdC0+dHhfY21kX2J1Zls2XTsKKwkJc3QtPnhmZXJbM10ubGVuID0gMjsKKworCQlzcGlfbWVzc2FnZV9pbml0KCZzdC0+bXNnW0FENzg4N19DSDFdKTsKKwkJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnN0LT54ZmVyWzNdLCAmc3QtPm1zZ1tBRDc4ODdfQ0gxXSk7CisKKwkJc3QtPmVuX2R1YWwgPSB0cnVlOworCisJCWlmIChwZGF0YSAmJiBwZGF0YS0+dnJlZl9tdikKKwkJCXN0LT5pbnRfdnJlZl9tdiA9IHBkYXRhLT52cmVmX212OworCQllbHNlIGlmICh2b2x0YWdlX3V2KQorCQkJc3QtPmludF92cmVmX212ID0gdm9sdGFnZV91diAvIDEwMDA7CisJCWVsc2UKKwkJCWRldl93YXJuKCZzcGktPmRldiwgInJlZmVyZW5jZSB2b2x0YWdlIHVuc3BlY2lmaWVkXG4iKTsKKworCX0gZWxzZSB7CisJCWlmIChwZGF0YSAmJiBwZGF0YS0+dnJlZl9tdikKKwkJCXN0LT5pbnRfdnJlZl9tdiA9IHBkYXRhLT52cmVmX212OworCQllbHNlIGlmIChwZGF0YSAmJiBwZGF0YS0+dXNlX29uY2hpcF9yZWYpCisJCQlzdC0+aW50X3ZyZWZfbXYgPSBzdC0+Y2hpcF9pbmZvLT5pbnRfdnJlZl9tdjsKKwkJZWxzZQorCQkJZGV2X3dhcm4oJnNwaS0+ZGV2LCAicmVmZXJlbmNlIHZvbHRhZ2UgdW5zcGVjaWZpZWRcbiIpOworCX0KKworCisJcmV0ID0gYWQ3ODg3X3JlZ2lzdGVyX3JpbmdfZnVuY3NfYW5kX2luaXQoc3QtPmluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldmljZTsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoc3QtPmluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldmljZTsKKworCXJldCA9IGlpb19yaW5nX2J1ZmZlcl9yZWdpc3RlcihzdC0+aW5kaW9fZGV2LT5yaW5nLCAwKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2NsZWFudXBfcmluZzsKKwlyZXR1cm4gMDsKKworZXJyb3JfY2xlYW51cF9yaW5nOgorCWFkNzg4N19yaW5nX2NsZWFudXAoc3QtPmluZGlvX2Rldik7CisJaWlvX2RldmljZV91bnJlZ2lzdGVyKHN0LT5pbmRpb19kZXYpOworZXJyb3JfZnJlZV9kZXZpY2U6CisJaWlvX2ZyZWVfZGV2aWNlKHN0LT5pbmRpb19kZXYpOworZXJyb3JfZGlzYWJsZV9yZWc6CisJaWYgKCFJU19FUlIoc3QtPnJlZykpCisJCXJlZ3VsYXRvcl9kaXNhYmxlKHN0LT5yZWcpOworZXJyb3JfcHV0X3JlZzoKKwlpZiAoIUlTX0VSUihzdC0+cmVnKSkKKwkJcmVndWxhdG9yX3B1dChzdC0+cmVnKTsKKwlrZnJlZShzdCk7CitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZDc4ODdfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGFkNzg4N19zdGF0ZSAqc3QgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gc3QtPmluZGlvX2RldjsKKwlpaW9fcmluZ19idWZmZXJfdW5yZWdpc3RlcihpbmRpb19kZXYtPnJpbmcpOworCWFkNzg4N19yaW5nX2NsZWFudXAoaW5kaW9fZGV2KTsKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpZiAoIUlTX0VSUihzdC0+cmVnKSkgeworCQlyZWd1bGF0b3JfZGlzYWJsZShzdC0+cmVnKTsKKwkJcmVndWxhdG9yX3B1dChzdC0+cmVnKTsKKwl9CisJa2ZyZWUoc3QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNwaV9kZXZpY2VfaWQgYWQ3ODg3X2lkW10gPSB7CisJeyJhZDc4ODciLCBJRF9BRDc4ODd9LAorCXt9Cit9OworCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWQ3ODg3X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJhZDc4ODciLAorCQkuYnVzCT0gJnNwaV9idXNfdHlwZSwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gYWQ3ODg3X3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYWQ3ODg3X3JlbW92ZSksCisJLmlkX3RhYmxlCT0gYWQ3ODg3X2lkLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWQ3ODg3X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmYWQ3ODg3X2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChhZDc4ODdfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhZDc4ODdfZXhpdCh2b2lkKQoreworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYWQ3ODg3X2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhZDc4ODdfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIk1pY2hhZWwgSGVubmVyaWNoIDxoZW5uZXJpY2hAYmxhY2tmaW4udWNsaW51eC5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFENzg4NyBBREMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygic3BpOmFkNzg4NyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3ODg3X3JpbmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzg4N19yaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI5Y2IxZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzg4N19yaW5nLmMKQEAgLTAsMCArMSwyNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggSm9uYXRoYW4gQ2FtZXJvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqCisgKiBhZDc4ODdfcmluZy5jCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vcmluZ19nZW5lcmljLmgiCisjaW5jbHVkZSAiLi4vcmluZ19zdy5oIgorI2luY2x1ZGUgIi4uL3RyaWdnZXIuaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorCisjaW5jbHVkZSAiYWQ3ODg3LmgiCisKK3N0YXRpYyBJSU9fU0NBTl9FTF9DKGluMCwgMCwgMCwgTlVMTCk7CitzdGF0aWMgSUlPX1NDQU5fRUxfQyhpbjEsIDEsIDAsIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBhZDc4ODdfc2hvd190eXBlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSByaW5nLT5pbmRpb19kZXY7CisJc3RydWN0IGFkNzg4N19zdGF0ZSAqc3QgPSBpbmRpb19kZXYtPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWMlZC8lZD4+JWRcbiIsIHN0LT5jaGlwX2luZm8tPnNpZ24sCisJCSAgICAgICBzdC0+Y2hpcF9pbmZvLT5iaXRzLCBzdC0+Y2hpcF9pbmZvLT5zdG9yYWdlYml0cywKKwkJICAgICAgIHN0LT5jaGlwX2luZm8tPmxlZnRfc2hpZnQpOworfQorc3RhdGljIElJT19ERVZJQ0VfQVRUUihpbl90eXBlLCBTX0lSVUdPLCBhZDc4ODdfc2hvd190eXBlLCBOVUxMLCAwKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkNzg4N19zY2FuX2VsX2F0dHJzW10gPSB7CisJJmlpb19zY2FuX2VsX2luMC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbjBfaW5kZXguZGV2X2F0dHIuYXR0ciwKKwkmaWlvX3NjYW5fZWxfaW4xLmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2luMV9pbmRleC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW5fdHlwZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgbW9kZV90IGFkNzg4N19zY2FuX2VsX2F0dHJfaXNfdmlzaWJsZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgICAgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGludCBuKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKKwlzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHJpbmctPmluZGlvX2RldjsKKwlzdHJ1Y3QgYWQ3ODg3X3N0YXRlICpzdCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisKKwltb2RlX3QgbW9kZSA9IGF0dHItPm1vZGU7CisKKwlpZiAoKGF0dHIgPT0gJmlpb19zY2FuX2VsX2luMS5kZXZfYXR0ci5hdHRyKSB8fAorCQkoYXR0ciA9PSAmaWlvX2NvbnN0X2F0dHJfaW4xX2luZGV4LmRldl9hdHRyLmF0dHIpKQorCQlpZiAoIXN0LT5lbl9kdWFsKQorCQkJbW9kZSA9IDA7CisKKwlyZXR1cm4gbW9kZTsKK30KKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWQ3ODg3X3NjYW5fZWxfZ3JvdXAgPSB7CisJLm5hbWUgPSAic2Nhbl9lbGVtZW50cyIsCisJLmF0dHJzID0gYWQ3ODg3X3NjYW5fZWxfYXR0cnMsCisJLmlzX3Zpc2libGUgPSBhZDc4ODdfc2Nhbl9lbF9hdHRyX2lzX3Zpc2libGUsCit9OworCitpbnQgYWQ3ODg3X3NjYW5fZnJvbV9yaW5nKHN0cnVjdCBhZDc4ODdfc3RhdGUgKnN0LCBsb25nIG1hc2spCit7CisJc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyA9IHN0LT5pbmRpb19kZXYtPnJpbmc7CisJaW50IGNvdW50ID0gMCwgcmV0OworCXUxNiAqcmluZ19kYXRhOworCisJaWYgKCEocmluZy0+c2Nhbl9tYXNrICYgbWFzaykpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisKKwlyaW5nX2RhdGEgPSBrbWFsbG9jKHJpbmctPmFjY2Vzcy5nZXRfYnl0ZXNfcGVyX2RhdHVtKHJpbmcpLCBHRlBfS0VSTkVMKTsKKwlpZiAocmluZ19kYXRhID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCXJldCA9IHJpbmctPmFjY2Vzcy5yZWFkX2xhc3QocmluZywgKHU4ICopIHJpbmdfZGF0YSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX3JpbmdfZGF0YTsKKworCS8qIGZvciBzaW5nbGUgY2hhbm5lbCBzY2FuIHRoZSByZXN1bHQgaXMgc3RvcmVkIHdpdGggemVybyBvZmZzZXQgKi8KKwlpZiAoKHJpbmctPnNjYW5fbWFzayA9PSAoKDEgPDwgMSkgfCAoMSA8PCAwKSkpICYmIChtYXNrID09ICgxIDw8IDEpKSkKKwkJY291bnQgPSAxOworCisJcmV0ID0gYmUxNl90b19jcHUocmluZ19kYXRhW2NvdW50XSk7CisKK2Vycm9yX2ZyZWVfcmluZ19kYXRhOgorCWtmcmVlKHJpbmdfZGF0YSk7CitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBhZDc4ODdfcmluZ19wcmVlbmFibGUoKSBzZXR1cCB0aGUgcGFyYW1ldGVycyBvZiB0aGUgcmluZyBiZWZvcmUgZW5hYmxpbmcKKyAqCisgKiBUaGUgY29tcGxleCBuYXR1cmUgb2YgdGhlIHNldHRpbmcgb2YgdGhlIG51YmVyIG9mIGJ5dGVzIHBlciBkYXR1bSBpcyBkdWUKKyAqIHRvIHRoaXMgZHJpdmVyIGN1cnJlbnRseSBlbnN1cmluZyB0aGF0IHRoZSB0aW1lc3RhbXAgaXMgc3RvcmVkIGF0IGFuIDgKKyAqIGJ5dGUgYm91bmRhcnkuCisgKiovCitzdGF0aWMgaW50IGFkNzg4N19yaW5nX3ByZWVuYWJsZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCXN0cnVjdCBhZDc4ODdfc3RhdGUgKnN0ID0gaW5kaW9fZGV2LT5kZXZfZGF0YTsKKwlzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nID0gaW5kaW9fZGV2LT5yaW5nOworCXNpemVfdCBkX3NpemU7CisKKwlpZiAoaW5kaW9fZGV2LT5yaW5nLT5hY2Nlc3Muc2V0X2J5dGVzX3Blcl9kYXR1bSkgeworCQlkX3NpemUgPSBzdC0+Y2hpcF9pbmZvLT5zdG9yYWdlYml0cyAvIDggKyBzaXplb2YoczY0KTsKKwkJaWYgKGRfc2l6ZSAlIDgpCisJCQlkX3NpemUgKz0gOCAtIChkX3NpemUgJSA4KTsKKwkJaW5kaW9fZGV2LT5yaW5nLT5hY2Nlc3Muc2V0X2J5dGVzX3Blcl9kYXR1bShpbmRpb19kZXYtPnJpbmcsCisJCQkJCQkJICAgIGRfc2l6ZSk7CisJfQorCisJc3dpdGNoIChyaW5nLT5zY2FuX21hc2spIHsKKwljYXNlICgxIDw8IDApOgorCQlzdC0+cmluZ19tc2cgPSAmc3QtPm1zZ1tBRDc4ODdfQ0gwXTsKKwkJYnJlYWs7CisJY2FzZSAoMSA8PCAxKToKKwkJc3QtPnJpbmdfbXNnID0gJnN0LT5tc2dbQUQ3ODg3X0NIMV07CisJCS8qIER1bW15IHJlYWQ6IHB1c2ggQ0gxIHNldHRpbmcgZG93biB0byBoYXJkd2FyZSAqLworCQlzcGlfc3luYyhzdC0+c3BpLCBzdC0+cmluZ19tc2cpOworCQlicmVhazsKKwljYXNlICgoMSA8PCAxKSB8ICgxIDw8IDApKToKKwkJc3QtPnJpbmdfbXNnID0gJnN0LT5tc2dbQUQ3ODg3X0NIMF9DSDFdOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZDc4ODdfcmluZ19wb3N0ZGlzYWJsZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCXN0cnVjdCBhZDc4ODdfc3RhdGUgKnN0ID0gaW5kaW9fZGV2LT5kZXZfZGF0YTsKKworCS8qIGR1bW15IHJlYWQ6IHJlc3RvcmUgZGVmYXVsdCBDSDAgc2V0dGluICovCisJcmV0dXJuIHNwaV9zeW5jKHN0LT5zcGksICZzdC0+bXNnW0FENzg4N19DSDBdKTsKK30KKworLyoqCisgKiBhZDc4ODdfcG9sbF9mdW5jX3RoKCkgdGggb2YgdHJpZ2dlciBsYXVuY2hlZCBwb2xsaW5nIHRvIHJpbmcgYnVmZmVyCisgKgorICogQXMgc2FtcGxpbmcgb25seSBvY2N1cnMgb24gc3BpIGNvbW1zIG9jY3VyaW5nLCBsZWF2ZSB0aW1lc3RhbXBpbmcgdW50aWwKKyAqIHRoZW4uICBTb21lIHRyaWdnZXJzIHdpbGwgZ2VuZXJhdGUgdGhlaXIgb3duIHRpbWUgc3RhbXAuICBDdXJyZW50bHkKKyAqIHRoZXJlIGlzIG5vIHdheSBvZiBub3RpZnlpbmcgdGhlbSB3aGVuIG5vIG9uZSBjYXJlcy4KKyAqKi8KK3N0YXRpYyB2b2lkIGFkNzg4N19wb2xsX2Z1bmNfdGgoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgczY0IHRpbWUpCit7CisJc3RydWN0IGFkNzg4N19zdGF0ZSAqc3QgPSBpbmRpb19kZXYtPmRldl9kYXRhOworCisJc2NoZWR1bGVfd29yaygmc3QtPnBvbGxfd29yayk7CisJcmV0dXJuOworfQorLyoqCisgKiBhZDc4ODdfcG9sbF9iaF90b19yaW5nKCkgYmggb2YgdHJpZ2dlciBsYXVuY2hlZCBwb2xsaW5nIHRvIHJpbmcgYnVmZmVyCisgKiBAd29ya19zOgl0aGUgd29yayBzdHJ1Y3QgdGhyb3VnaCB3aGljaCB0aGlzIHdhcyBzY2hlZHVsZWQKKyAqCisgKiBDdXJyZW50bHkgdGhlcmUgaXMgbm8gb3B0aW9uIGluIHRoaXMgZHJpdmVyIHRvIGRpc2FibGUgdGhlIHNhdmluZyBvZgorICogdGltZXN0YW1wcyB3aXRoaW4gdGhlIHJpbmcuCisgKiBJIHRoaW5rIHRoZSBvbmUgY29weSBvZiB0aGlzIGF0IGEgdGltZSB3YXMgdG8gYXZvaWQgcHJvYmxlbXMgaWYgdGhlCisgKiB0cmlnZ2VyIHdhcyBzZXQgZmFyIHRvbyBoaWdoIGFuZCB0aGUgcmVhZHMgdGhlbiBsb2NrZWQgdXAgdGhlIGNvbXB1dGVyLgorICoqLworc3RhdGljIHZvaWQgYWQ3ODg3X3BvbGxfYmhfdG9fcmluZyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmtfcykKK3sKKwlzdHJ1Y3QgYWQ3ODg3X3N0YXRlICpzdCA9IGNvbnRhaW5lcl9vZih3b3JrX3MsIHN0cnVjdCBhZDc4ODdfc3RhdGUsCisJCQkJCQkgIHBvbGxfd29yayk7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHN0LT5pbmRpb19kZXY7CisJc3RydWN0IGlpb19zd19yaW5nX2J1ZmZlciAqc3dfcmluZyA9IGlpb190b19zd19yaW5nKGluZGlvX2Rldi0+cmluZyk7CisJc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyA9IGluZGlvX2Rldi0+cmluZzsKKwlzNjQgdGltZV9uczsKKwlfX3U4ICpidWY7CisJaW50IGJfc2VudDsKKwlzaXplX3QgZF9zaXplOworCisJdW5zaWduZWQgaW50IGJ5dGVzID0gcmluZy0+c2Nhbl9jb3VudCAqIHN0LT5jaGlwX2luZm8tPnN0b3JhZ2ViaXRzIC8gODsKKworCS8qIEVuc3VyZSB0aGUgdGltZXN0YW1wIGlzIDggYnl0ZSBhbGlnbmVkICovCisJZF9zaXplID0gYnl0ZXMgKyBzaXplb2YoczY0KTsKKwlpZiAoZF9zaXplICUgc2l6ZW9mKHM2NCkpCisJCWRfc2l6ZSArPSBzaXplb2YoczY0KSAtIChkX3NpemUgJSBzaXplb2YoczY0KSk7CisKKwkvKiBFbnN1cmUgb25seSBvbmUgY29weSBvZiB0aGlzIGZ1bmN0aW9uIHJ1bm5pbmcgYXQgYSB0aW1lICovCisJaWYgKGF0b21pY19pbmNfcmV0dXJuKCZzdC0+cHJvdGVjdF9yaW5nKSA+IDEpCisJCXJldHVybjsKKworCWJ1ZiA9IGt6YWxsb2MoZF9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoYnVmID09IE5VTEwpCisJCXJldHVybjsKKworCWJfc2VudCA9IHNwaV9zeW5jKHN0LT5zcGksIHN0LT5yaW5nX21zZyk7CisJaWYgKGJfc2VudCkKKwkJZ290byBkb25lOworCisJdGltZV9ucyA9IGlpb19nZXRfdGltZV9ucygpOworCisJbWVtY3B5KGJ1Ziwgc3QtPmRhdGEsIGJ5dGVzKTsKKwltZW1jcHkoYnVmICsgZF9zaXplIC0gc2l6ZW9mKHM2NCksICZ0aW1lX25zLCBzaXplb2YodGltZV9ucykpOworCisJaW5kaW9fZGV2LT5yaW5nLT5hY2Nlc3Muc3RvcmVfdG8oJnN3X3JpbmctPmJ1ZiwgYnVmLCB0aW1lX25zKTsKK2RvbmU6CisJa2ZyZWUoYnVmKTsKKwlhdG9taWNfZGVjKCZzdC0+cHJvdGVjdF9yaW5nKTsKK30KKworaW50IGFkNzg4N19yZWdpc3Rlcl9yaW5nX2Z1bmNzX2FuZF9pbml0KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJc3RydWN0IGFkNzg4N19zdGF0ZSAqc3QgPSBpbmRpb19kZXYtPmRldl9kYXRhOworCWludCByZXQ7CisKKwlpbmRpb19kZXYtPnJpbmcgPSBpaW9fc3dfcmJfYWxsb2NhdGUoaW5kaW9fZGV2KTsKKwlpZiAoIWluZGlvX2Rldi0+cmluZykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJLyogRWZmZWN0aXZlbHkgc2VsZWN0IHRoZSByaW5nIGJ1ZmZlciBpbXBsZW1lbnRhdGlvbiAqLworCWlpb19yaW5nX3N3X3JlZ2lzdGVyX2Z1bmNzKCZpbmRpb19kZXYtPnJpbmctPmFjY2Vzcyk7CisJcmV0ID0gaWlvX2FsbG9jX3BvbGxmdW5jKGluZGlvX2RldiwgTlVMTCwgJmFkNzg4N19wb2xsX2Z1bmNfdGgpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZGVhbGxvY2F0ZV9zd19yYjsKKworCS8qIFJpbmcgYnVmZmVyIGZ1bmN0aW9ucyAtIGhlcmUgdHJpZ2dlciBzZXR1cCByZWxhdGVkICovCisKKwlpbmRpb19kZXYtPnJpbmctPnByZWVuYWJsZSA9ICZhZDc4ODdfcmluZ19wcmVlbmFibGU7CisJaW5kaW9fZGV2LT5yaW5nLT5wb3N0ZW5hYmxlID0gJmlpb190cmlnZ2VyZWRfcmluZ19wb3N0ZW5hYmxlOworCWluZGlvX2Rldi0+cmluZy0+cHJlZGlzYWJsZSA9ICZpaW9fdHJpZ2dlcmVkX3JpbmdfcHJlZGlzYWJsZTsKKwlpbmRpb19kZXYtPnJpbmctPnBvc3RkaXNhYmxlID0gJmFkNzg4N19yaW5nX3Bvc3RkaXNhYmxlOworCWluZGlvX2Rldi0+cmluZy0+c2Nhbl9lbF9hdHRycyA9ICZhZDc4ODdfc2Nhbl9lbF9ncm91cDsKKworCUlOSVRfV09SSygmc3QtPnBvbGxfd29yaywgJmFkNzg4N19wb2xsX2JoX3RvX3JpbmcpOworCisJLyogRmxhZyB0aGF0IHBvbGxlZCByaW5nIGJ1ZmZlcmluZyBpcyBwb3NzaWJsZSAqLworCWluZGlvX2Rldi0+bW9kZXMgfD0gSU5ESU9fUklOR19UUklHR0VSRUQ7CisJcmV0dXJuIDA7CitlcnJvcl9kZWFsbG9jYXRlX3N3X3JiOgorCWlpb19zd19yYl9mcmVlKGluZGlvX2Rldi0+cmluZyk7CitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBhZDc4ODdfcmluZ19jbGVhbnVwKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJLyogZW5zdXJlIHRoYXQgdGhlIHRyaWdnZXIgaGFzIGJlZW4gZGV0YWNoZWQgKi8KKwlpZiAoaW5kaW9fZGV2LT50cmlnKSB7CisJCWlpb19wdXRfdHJpZ2dlcihpbmRpb19kZXYtPnRyaWcpOworCQlpaW9fdHJpZ2dlcl9kZXR0YWNoX3BvbGxfZnVuYyhpbmRpb19kZXYtPnRyaWcsCisJCQkJCSAgICAgIGluZGlvX2Rldi0+cG9sbGZ1bmMpOworCX0KKwlrZnJlZShpbmRpb19kZXYtPnBvbGxmdW5jKTsKKwlpaW9fc3dfcmJfZnJlZShpbmRpb19kZXYtPnJpbmcpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWR0NzMxMC5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWR0NzMxMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MWE0MDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZHQ3MzEwLmMKQEAgLTAsMCArMSw5NTIgQEAKKy8qCisgKiBBRFQ3MzEwIGRpZ2l0YWwgdGVtcGVyYXR1cmUgc2Vuc29yIGRyaXZlciBzdXBwb3J0aW5nIEFEVDczMTAKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisKKy8qCisgKiBBRFQ3MzEwIHJlZ2lzdGVycyBkZWZpbml0aW9uCisgKi8KKworI2RlZmluZSBBRFQ3MzEwX1NUQVRVUwkJCTAKKyNkZWZpbmUgQURUNzMxMF9DT05GSUcJCQkxCisjZGVmaW5lIEFEVDczMTBfVEVNUEVSQVRVUkUJCTIKKyNkZWZpbmUgQURUNzMxMF9JRAkJCTMKKyNkZWZpbmUgQURUNzMxMF9UX0NSSVQJCQk0CisjZGVmaW5lIEFEVDczMTBfVF9IWVNUCQkJNQorI2RlZmluZSBBRFQ3MzEwX1RfQUxBUk1fSElHSAkJNgorI2RlZmluZSBBRFQ3MzEwX1RfQUxBUk1fTE9XCQk3CisKKy8qCisgKiBBRFQ3MzEwIHN0YXR1cworICovCisjZGVmaW5lIEFEVDczMTBfU1RBVF9UX0xPVwkJMHgxMAorI2RlZmluZSBBRFQ3MzEwX1NUQVRfVF9ISUdICQkweDIwCisjZGVmaW5lIEFEVDczMTBfU1RBVF9UX0NSSVQJCTB4NDAKKyNkZWZpbmUgQURUNzMxMF9TVEFUX05PVF9SRFkJCTB4ODAKKworLyoKKyAqIEFEVDczMTAgY29uZmlnCisgKi8KKyNkZWZpbmUgQURUNzMxMF9GQVVMVF9RVUVVRV9NQVNLCTB4MworI2RlZmluZSBBRFQ3MzEwX0NUX1BPTEFSSVRZCQkweDQKKyNkZWZpbmUgQURUNzMxMF9JTlRfUE9MQVJJVFkJCTB4OAorI2RlZmluZSBBRFQ3MzEwX0VWRU5UX01PREUJCTB4MTAKKyNkZWZpbmUgQURUNzMxMF9NT0RFX01BU0sJCTB4NjAKKyNkZWZpbmUgQURUNzMxMF9PTkVTSE9UCQkJMHgyMAorI2RlZmluZSBBRFQ3MzEwX1NQUwkJCTB4NDAKKyNkZWZpbmUgQURUNzMxMF9QRAkJCTB4NjAKKyNkZWZpbmUgQURUNzMxMF9SRVNPTFVUSU9OCQkweDgwCisKKy8qCisgKiBBRFQ3MzEwIG1hc2tzCisgKi8KKyNkZWZpbmUgQURUNzMxMF9UMTZfVkFMVUVfU0lHTgkJCTB4ODAwMAorI2RlZmluZSBBRFQ3MzEwX1QxNl9WQUxVRV9GTE9BVF9PRkZTRVQJCTcKKyNkZWZpbmUgQURUNzMxMF9UMTZfVkFMVUVfRkxPQVRfTUFTSwkJMHg3RgorI2RlZmluZSBBRFQ3MzEwX1QxM19WQUxVRV9TSUdOCQkJMHgxMDAwCisjZGVmaW5lIEFEVDczMTBfVDEzX1ZBTFVFX09GRlNFVAkJMworI2RlZmluZSBBRFQ3MzEwX1QxM19WQUxVRV9GTE9BVF9PRkZTRVQJCTQKKyNkZWZpbmUgQURUNzMxMF9UMTNfVkFMVUVfRkxPQVRfTUFTSwkJMHhGCisjZGVmaW5lIEFEVDczMTBfVF9IWVNUX01BU0sJCQkweEYKKyNkZWZpbmUgQURUNzMxMF9ERVZJQ0VfSURfTUFTSwkJCTB4NworI2RlZmluZSBBRFQ3MzEwX01BTlVGQUNUT1JZX0lEX01BU0sJCTB4RjgKKyNkZWZpbmUgQURUNzMxMF9NQU5VRkFDVE9SWV9JRF9PRkZTRVQJCTMKKworCisjZGVmaW5lIEFEVDczMTBfQ01EX1JFR19NQVNLCQkJMHgyOAorI2RlZmluZSBBRFQ3MzEwX0NNRF9SRUdfT0ZGU0VUCQkJMworI2RlZmluZSBBRFQ3MzEwX0NNRF9SRUFECQkJMHg0MAorI2RlZmluZSBBRFQ3MzEwX0NNRF9DT05fUkVBRAkJCTB4NAorCisjZGVmaW5lIEFEVDczMTBfSVJRUwkJCQkyCisKKy8qCisgKiBzdHJ1Y3QgYWR0NzMxMF9jaGlwX2luZm8gLSBjaGlwIHNwZWNpZmMgaW5mb3JtYXRpb24KKyAqLworCitzdHJ1Y3QgYWR0NzMxMF9jaGlwX2luZm8geworCWNvbnN0IGNoYXIgKm5hbWU7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaV9kZXY7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdGhyZXNoX3dvcms7CisJczY0IGxhc3RfdGltZXN0YW1wOworCXU4ICBjb25maWc7Cit9OworCisvKgorICogYWR0NzMxMCByZWdpc3RlciBhY2Nlc3MgYnkgU1BJCisgKi8KKworc3RhdGljIGludCBhZHQ3MzEwX3NwaV9yZWFkX3dvcmQoc3RydWN0IGFkdDczMTBfY2hpcF9pbmZvICpjaGlwLCB1OCByZWcsIHUxNiAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldiA9IGNoaXAtPnNwaV9kZXY7CisJdTggY29tbWFuZCA9IChyZWcgPDwgQURUNzMxMF9DTURfUkVHX09GRlNFVCkgJiBBRFQ3MzEwX0NNRF9SRUdfTUFTSzsKKwlpbnQgcmV0ID0gMDsKKworCWNvbW1hbmQgfD0gQURUNzMxMF9DTURfUkVBRDsKKwlyZXQgPSBzcGlfd3JpdGUoc3BpX2RldiwgJmNvbW1hbmQsIHNpemVvZihjb21tYW5kKSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycigmc3BpX2Rldi0+ZGV2LCAiU1BJIHdyaXRlIGNvbW1hbmQgZXJyb3JcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHNwaV9yZWFkKHNwaV9kZXYsICh1OCAqKWRhdGEsIHNpemVvZigqZGF0YSkpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnNwaV9kZXYtPmRldiwgIlNQSSByZWFkIHdvcmQgZXJyb3JcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCSpkYXRhID0gYmUxNl90b19jcHUoKmRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWR0NzMxMF9zcGlfd3JpdGVfd29yZChzdHJ1Y3QgYWR0NzMxMF9jaGlwX2luZm8gKmNoaXAsIHU4IHJlZywgdTE2IGRhdGEpCit7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaV9kZXYgPSBjaGlwLT5zcGlfZGV2OworCXU4IGJ1ZlszXTsKKwlpbnQgcmV0ID0gMDsKKworCWJ1ZlswXSA9IChyZWcgPDwgQURUNzMxMF9DTURfUkVHX09GRlNFVCkgJiBBRFQ3MzEwX0NNRF9SRUdfTUFTSzsKKwlidWZbMV0gPSAodTgpKGRhdGEgPj4gOCk7CisJYnVmWzJdID0gKHU4KShkYXRhICYgMHhGRik7CisKKwlyZXQgPSBzcGlfd3JpdGUoc3BpX2RldiwgYnVmLCAzKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZzcGlfZGV2LT5kZXYsICJTUEkgd3JpdGUgd29yZCBlcnJvclxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZHQ3MzEwX3NwaV9yZWFkX2J5dGUoc3RydWN0IGFkdDczMTBfY2hpcF9pbmZvICpjaGlwLCB1OCByZWcsIHU4ICpkYXRhKQoreworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGlfZGV2ID0gY2hpcC0+c3BpX2RldjsKKwl1OCBjb21tYW5kID0gKHJlZyA8PCBBRFQ3MzEwX0NNRF9SRUdfT0ZGU0VUKSAmIEFEVDczMTBfQ01EX1JFR19NQVNLOworCWludCByZXQgPSAwOworCisJY29tbWFuZCB8PSBBRFQ3MzEwX0NNRF9SRUFEOworCXJldCA9IHNwaV93cml0ZShzcGlfZGV2LCAmY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZzcGlfZGV2LT5kZXYsICJTUEkgd3JpdGUgY29tbWFuZCBlcnJvclxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gc3BpX3JlYWQoc3BpX2RldiwgZGF0YSwgc2l6ZW9mKCpkYXRhKSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycigmc3BpX2Rldi0+ZGV2LCAiU1BJIHJlYWQgYnl0ZSBlcnJvclxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWR0NzMxMF9zcGlfd3JpdGVfYnl0ZShzdHJ1Y3QgYWR0NzMxMF9jaGlwX2luZm8gKmNoaXAsIHU4IHJlZywgdTggZGF0YSkKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldiA9IGNoaXAtPnNwaV9kZXY7CisJdTggYnVmWzJdOworCWludCByZXQgPSAwOworCisJYnVmWzBdID0gKHJlZyA8PCBBRFQ3MzEwX0NNRF9SRUdfT0ZGU0VUKSAmIEFEVDczMTBfQ01EX1JFR19NQVNLOworCWJ1ZlsxXSA9IGRhdGE7CisKKwlyZXQgPSBzcGlfd3JpdGUoc3BpX2RldiwgYnVmLCAyKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZzcGlfZGV2LT5kZXYsICJTUEkgd3JpdGUgYnl0ZSBlcnJvclxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxMF9zaG93X21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzEwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1OCBjb25maWc7CisKKwljb25maWcgPSBjaGlwLT5jb25maWcgJiBBRFQ3MzEwX01PREVfTUFTSzsKKworCXN3aXRjaCAoY29uZmlnKSB7CisJY2FzZSBBRFQ3MzEwX1BEOgorCQlyZXR1cm4gc3ByaW50ZihidWYsICJwb3dlci1kb3duXG4iKTsKKwljYXNlIEFEVDczMTBfT05FU0hPVDoKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAib25lLXNob3RcbiIpOworCWNhc2UgQURUNzMxMF9TUFM6CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgInNwc1xuIik7CisJZGVmYXVsdDoKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiZnVsbFxuIik7CisJfQorfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzEwX3N0b3JlX21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzEwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1MTYgY29uZmlnOworCWludCByZXQ7CisKKwlyZXQgPSBhZHQ3MzEwX3NwaV9yZWFkX2J5dGUoY2hpcCwgQURUNzMxMF9DT05GSUcsICZjaGlwLT5jb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY29uZmlnID0gY2hpcC0+Y29uZmlnICYgKH5BRFQ3MzEwX01PREVfTUFTSyk7CisJaWYgKHN0cmNtcChidWYsICJwb3dlci1kb3duIikpCisJCWNvbmZpZyB8PSBBRFQ3MzEwX1BEOworCWVsc2UgaWYgKHN0cmNtcChidWYsICJvbmUtc2hvdCIpKQorCQljb25maWcgfD0gQURUNzMxMF9PTkVTSE9UOworCWVsc2UgaWYgKHN0cmNtcChidWYsICJzcHMiKSkKKwkJY29uZmlnIHw9IEFEVDczMTBfU1BTOworCisJcmV0ID0gYWR0NzMxMF9zcGlfd3JpdGVfYnl0ZShjaGlwLCBBRFQ3MzEwX0NPTkZJRywgY29uZmlnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNoaXAtPmNvbmZpZyA9IGNvbmZpZzsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIobW9kZSwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkdDczMTBfc2hvd19tb2RlLAorCQlhZHQ3MzEwX3N0b3JlX21vZGUsCisJCTApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3MzEwX3Nob3dfYXZhaWxhYmxlX21vZGVzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICJmdWxsXG5vbmUtc2hvdFxuc3BzXG5wb3dlci1kb3duXG4iKTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihhdmFpbGFibGVfbW9kZXMsIFNfSVJVR08sIGFkdDczMTBfc2hvd19hdmFpbGFibGVfbW9kZXMsIE5VTEwsIDApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3MzEwX3Nob3dfcmVzb2x1dGlvbihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCWludCByZXQ7CisJaW50IGJpdHM7CisKKwlyZXQgPSBhZHQ3MzEwX3NwaV9yZWFkX2J5dGUoY2hpcCwgQURUNzMxMF9DT05GSUcsICZjaGlwLT5jb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJaWYgKGNoaXAtPmNvbmZpZyAmIEFEVDczMTBfUkVTT0xVVElPTikKKwkJYml0cyA9IDE2OworCWVsc2UKKwkJYml0cyA9IDEzOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWQgYml0c1xuIiwgYml0cyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTBfc3RvcmVfcmVzb2x1dGlvbihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwl1MTYgY29uZmlnOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBhZHQ3MzEwX3NwaV9yZWFkX2J5dGUoY2hpcCwgQURUNzMxMF9DT05GSUcsICZjaGlwLT5jb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY29uZmlnID0gY2hpcC0+Y29uZmlnICYgKH5BRFQ3MzEwX1JFU09MVVRJT04pOworCWlmIChkYXRhKQorCQljb25maWcgfD0gQURUNzMxMF9SRVNPTFVUSU9OOworCisJcmV0ID0gYWR0NzMxMF9zcGlfd3JpdGVfYnl0ZShjaGlwLCBBRFQ3MzEwX0NPTkZJRywgY29uZmlnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNoaXAtPmNvbmZpZyA9IGNvbmZpZzsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIocmVzb2x1dGlvbiwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkdDczMTBfc2hvd19yZXNvbHV0aW9uLAorCQlhZHQ3MzEwX3N0b3JlX3Jlc29sdXRpb24sCisJCTApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3MzEwX3Nob3dfaWQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzEwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1OCBpZDsKKwlpbnQgcmV0OworCisJcmV0ID0gYWR0NzMxMF9zcGlfcmVhZF9ieXRlKGNoaXAsIEFEVDczMTBfSUQsICZpZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICJkZXZpY2UgaWQ6IDB4JXhcbm1hbnVmYWN0b3J5IGlkOiAweCV4XG4iLAorCQkJaWQgJiBBRFQ3MzEwX0RFVklDRV9JRF9NQVNLLAorCQkJKGlkICYgQURUNzMxMF9NQU5VRkFDVE9SWV9JRF9NQVNLKSA+PiBBRFQ3MzEwX01BTlVGQUNUT1JZX0lEX09GRlNFVCk7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoaWQsIFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZHQ3MzEwX3Nob3dfaWQsCisJCU5VTEwsCisJCTApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3MzEwX2NvbnZlcnRfdGVtcGVyYXR1cmUoc3RydWN0IGFkdDczMTBfY2hpcF9pbmZvICpjaGlwLAorCQl1MTYgZGF0YSwgY2hhciAqYnVmKQoreworCWNoYXIgc2lnbiA9ICcgJzsKKworCWlmIChjaGlwLT5jb25maWcgJiBBRFQ3MzEwX1JFU09MVVRJT04pIHsKKwkJaWYgKGRhdGEgJiBBRFQ3MzEwX1QxNl9WQUxVRV9TSUdOKSB7CisJCQkvKiBjb252ZXJ0IHN1cHBsZW1lbnQgdG8gcG9zaXRpdmUgdmFsdWUgKi8KKwkJCWRhdGEgPSAodTE2KSgoQURUNzMxMF9UMTZfVkFMVUVfU0lHTiA8PCAxKSAtICh1MzIpZGF0YSk7CisJCQlzaWduID0gJy0nOworCQl9CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVjJWQuJS43ZFxuIiwgc2lnbiwKKwkJCQkoZGF0YSA+PiBBRFQ3MzEwX1QxNl9WQUxVRV9GTE9BVF9PRkZTRVQpLAorCQkJCShkYXRhICYgQURUNzMxMF9UMTZfVkFMVUVfRkxPQVRfTUFTSykgKiA3ODEyNSk7CisJfSBlbHNlIHsKKwkJaWYgKGRhdGEgJiBBRFQ3MzEwX1QxM19WQUxVRV9TSUdOKSB7CisJCQkvKiBjb252ZXJ0IHN1cHBsZW1lbnQgdG8gcG9zaXRpdmUgdmFsdWUgKi8KKwkJCWRhdGEgPj49IEFEVDczMTBfVDEzX1ZBTFVFX09GRlNFVDsKKwkJCWRhdGEgPSAoQURUNzMxMF9UMTNfVkFMVUVfU0lHTiA8PCAxKSAtIGRhdGE7CisJCQlzaWduID0gJy0nOworCQl9CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVjJWQuJS40ZFxuIiwgc2lnbiwKKwkJCQkoZGF0YSA+PiBBRFQ3MzEwX1QxM19WQUxVRV9GTE9BVF9PRkZTRVQpLAorCQkJCShkYXRhICYgQURUNzMxMF9UMTNfVkFMVUVfRkxPQVRfTUFTSykgKiA2MjUpOworCX0KK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxMF9zaG93X3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxMF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTggc3RhdHVzOworCXUxNiBkYXRhOworCWludCByZXQsIGkgPSAwOworCisJZG8geworCQlyZXQgPSBhZHQ3MzEwX3NwaV9yZWFkX2J5dGUoY2hpcCwgQURUNzMxMF9TVEFUVVMsICZzdGF0dXMpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIC1FSU87CisJCWkrKzsKKwkJaWYgKGkgPT0gMTAwMDApCisJCQlyZXR1cm4gLUVJTzsKKwl9IHdoaWxlIChzdGF0dXMgJiBBRFQ3MzEwX1NUQVRfTk9UX1JEWSk7CisKKwlyZXQgPSBhZHQ3MzEwX3NwaV9yZWFkX3dvcmQoY2hpcCwgQURUNzMxMF9URU1QRVJBVFVSRSwgJmRhdGEpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIGFkdDczMTBfY29udmVydF90ZW1wZXJhdHVyZShjaGlwLCBkYXRhLCBidWYpOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKHZhbHVlLCBTX0lSVUdPLCBhZHQ3MzEwX3Nob3dfdmFsdWUsIE5VTEwsIDApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3MzEwX3Nob3dfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBjaGlwLT5uYW1lKTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBhZHQ3MzEwX3Nob3dfbmFtZSwgTlVMTCwgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZHQ3MzEwX2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2Rldl9hdHRyX2F2YWlsYWJsZV9tb2Rlcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbW9kZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcmVzb2x1dGlvbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaWQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3ZhbHVlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9uYW1lLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkdDczMTBfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkdDczMTBfYXR0cmlidXRlcywKK307CisKKy8qCisgKiB0ZW1wZXJhdHVyZSBib3VuZCBldmVudHMKKyAqLworCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0FEVDczMTBfQUJPVkVfQUxBUk0gICAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDApCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0FEVDczMTBfQkVMTE9XX0FMQVJNICAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDEpCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0FEVDczMTBfQUJPVkVfQ1JJVCAgICAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDIpCisKK3N0YXRpYyB2b2lkIGFkdDczMTBfaW50ZXJydXB0X2JoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29ya19zKQoreworCXN0cnVjdCBhZHQ3MzEwX2NoaXBfaW5mbyAqY2hpcCA9CisJCWNvbnRhaW5lcl9vZih3b3JrX3MsIHN0cnVjdCBhZHQ3MzEwX2NoaXBfaW5mbywgdGhyZXNoX3dvcmspOworCXU4IHN0YXR1czsKKworCWlmIChhZHQ3MzEwX3NwaV9yZWFkX2J5dGUoY2hpcCwgQURUNzMxMF9TVEFUVVMsICZzdGF0dXMpKQorCQlyZXR1cm47CisKKwlpZiAoc3RhdHVzICYgQURUNzMxMF9TVEFUX1RfSElHSCkKKwkJaWlvX3B1c2hfZXZlbnQoY2hpcC0+aW5kaW9fZGV2LCAwLAorCQkJSUlPX0VWRU5UX0NPREVfQURUNzMxMF9BQk9WRV9BTEFSTSwKKwkJCWNoaXAtPmxhc3RfdGltZXN0YW1wKTsKKwlpZiAoc3RhdHVzICYgQURUNzMxMF9TVEFUX1RfTE9XKQorCQlpaW9fcHVzaF9ldmVudChjaGlwLT5pbmRpb19kZXYsIDAsCisJCQlJSU9fRVZFTlRfQ09ERV9BRFQ3MzEwX0JFTExPV19BTEFSTSwKKwkJCWNoaXAtPmxhc3RfdGltZXN0YW1wKTsKKwlpZiAoc3RhdHVzICYgQURUNzMxMF9TVEFUX1RfQ1JJVCkKKwkJaWlvX3B1c2hfZXZlbnQoY2hpcC0+aW5kaW9fZGV2LCAwLAorCQkJSUlPX0VWRU5UX0NPREVfQURUNzMxMF9BQk9WRV9DUklULAorCQkJY2hpcC0+bGFzdF90aW1lc3RhbXApOworfQorCitzdGF0aWMgaW50IGFkdDczMTBfaW50ZXJydXB0KHN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbywKKwkJaW50IGluZGV4LAorCQlzNjQgdGltZXN0YW1wLAorCQlpbnQgbm9fdGVzdCkKK3sKKwlzdHJ1Y3QgYWR0NzMxMF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwljaGlwLT5sYXN0X3RpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKwlzY2hlZHVsZV93b3JrKCZjaGlwLT50aHJlc2hfd29yayk7CisKKwlyZXR1cm4gMDsKK30KKworSUlPX0VWRU5UX1NIKGFkdDczMTAsICZhZHQ3MzEwX2ludGVycnVwdCk7CitJSU9fRVZFTlRfU0goYWR0NzMxMF9jdCwgJmFkdDczMTBfaW50ZXJydXB0KTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxMF9zaG93X2V2ZW50X21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzEwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gYWR0NzMxMF9zcGlfcmVhZF9ieXRlKGNoaXAsIEFEVDczMTBfQ09ORklHLCAmY2hpcC0+Y29uZmlnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChjaGlwLT5jb25maWcgJiBBRFQ3MzEwX0VWRU5UX01PREUpCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgImludGVycnVwdFxuIik7CisJZWxzZQorCQlyZXR1cm4gc3ByaW50ZihidWYsICJjb21wYXJhdG9yXG4iKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxMF9zZXRfZXZlbnRfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXUxNiBjb25maWc7CisJaW50IHJldDsKKworCXJldCA9IGFkdDczMTBfc3BpX3JlYWRfYnl0ZShjaGlwLCBBRFQ3MzEwX0NPTkZJRywgJmNoaXAtPmNvbmZpZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljb25maWcgPSBjaGlwLT5jb25maWcgJj0gfkFEVDczMTBfRVZFTlRfTU9ERTsKKwlpZiAoc3RyY21wKGJ1ZiwgImNvbXBhcmF0b3IiKSAhPSAwKQorCQljb25maWcgfD0gQURUNzMxMF9FVkVOVF9NT0RFOworCisJcmV0ID0gYWR0NzMxMF9zcGlfd3JpdGVfYnl0ZShjaGlwLCBBRFQ3MzEwX0NPTkZJRywgY29uZmlnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNoaXAtPmNvbmZpZyA9IGNvbmZpZzsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTBfc2hvd19hdmFpbGFibGVfZXZlbnRfbW9kZXMoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgImNvbXBhcmF0b3JcbmludGVycnVwdFxuIik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTBfc2hvd19mYXVsdF9xdWV1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBhZHQ3MzEwX3NwaV9yZWFkX2J5dGUoY2hpcCwgQURUNzMxMF9DT05GSUcsICZjaGlwLT5jb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGNoaXAtPmNvbmZpZyAmIEFEVDczMTBfRkFVTFRfUVVFVUVfTUFTSyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTBfc2V0X2ZhdWx0X3F1ZXVlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxMF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCWludCByZXQ7CisJdTggY29uZmlnOworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOworCWlmIChyZXQgfHwgZGF0YSA+IDMpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gYWR0NzMxMF9zcGlfcmVhZF9ieXRlKGNoaXAsIEFEVDczMTBfQ09ORklHLCAmY2hpcC0+Y29uZmlnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNvbmZpZyA9IGNoaXAtPmNvbmZpZyAmIH5BRFQ3MzEwX0ZBVUxUX1FVRVVFX01BU0s7CisJY29uZmlnIHw9IGRhdGE7CisJcmV0ID0gYWR0NzMxMF9zcGlfd3JpdGVfYnl0ZShjaGlwLCBBRFQ3MzEwX0NPTkZJRywgY29uZmlnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNoaXAtPmNvbmZpZyA9IGNvbmZpZzsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZHQ3MzEwX3Nob3dfdF9ib3VuZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQl1OCBib3VuZF9yZWcsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxMF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTE2IGRhdGE7CisJaW50IHJldDsKKworCXJldCA9IGFkdDczMTBfc3BpX3JlYWRfd29yZChjaGlwLCBib3VuZF9yZWcsICZkYXRhKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiBhZHQ3MzEwX2NvbnZlcnRfdGVtcGVyYXR1cmUoY2hpcCwgZGF0YSwgYnVmKTsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90IGFkdDczMTBfc2V0X3RfYm91bmQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJdTggYm91bmRfcmVnLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCWxvbmcgdG1wMSwgdG1wMjsKKwl1MTYgZGF0YTsKKwljaGFyICpwb3M7CisJaW50IHJldDsKKworCXBvcyA9IHN0cmNocihidWYsICcuJyk7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ0bXAxKTsKKworCWlmIChyZXQgfHwgdG1wMSA+IDEyNyB8fCB0bXAxIDwgLTEyOCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocG9zKSB7CisJCWxlbiA9IHN0cmxlbihwb3MpOworCisJCWlmIChjaGlwLT5jb25maWcgJiBBRFQ3MzEwX1JFU09MVVRJT04pIHsKKwkJCWlmIChsZW4gPiBBRFQ3MzEwX1QxNl9WQUxVRV9GTE9BVF9PRkZTRVQpCisJCQkJbGVuID0gQURUNzMxMF9UMTZfVkFMVUVfRkxPQVRfT0ZGU0VUOworCQkJcG9zW2xlbl0gPSAwOworCQkJcmV0ID0gc3RyaWN0X3N0cnRvbChwb3MsIDEwLCAmdG1wMik7CisKKwkJCWlmICghcmV0KQorCQkJCXRtcDIgPSAodG1wMiAvIDc4MTI1KSAqIDc4MTI1OworCQl9IGVsc2UgeworCQkJaWYgKGxlbiA+IEFEVDczMTBfVDEzX1ZBTFVFX0ZMT0FUX09GRlNFVCkKKwkJCQlsZW4gPSBBRFQ3MzEwX1QxM19WQUxVRV9GTE9BVF9PRkZTRVQ7CisJCQlwb3NbbGVuXSA9IDA7CisJCQlyZXQgPSBzdHJpY3Rfc3RydG9sKHBvcywgMTAsICZ0bXAyKTsKKworCQkJaWYgKCFyZXQpCisJCQkJdG1wMiA9ICh0bXAyIC8gNjI1KSAqIDYyNTsKKwkJfQorCX0KKworCWlmICh0bXAxIDwgMCkKKwkJZGF0YSA9ICh1MTYpKC10bXAxKTsKKwllbHNlCisJCWRhdGEgPSAodTE2KXRtcDE7CisKKwlpZiAoY2hpcC0+Y29uZmlnICYgQURUNzMxMF9SRVNPTFVUSU9OKSB7CisJCWRhdGEgPSAoZGF0YSA8PCBBRFQ3MzEwX1QxNl9WQUxVRV9GTE9BVF9PRkZTRVQpIHwKKwkJCSh0bXAyICYgQURUNzMxMF9UMTZfVkFMVUVfRkxPQVRfTUFTSyk7CisKKwkJaWYgKHRtcDEgPCAwKQorCQkJLyogY29udmVydCBwb3NpdGl2ZSB2YWx1ZSB0byBzdXBwbHltZW50ICovCisJCQlkYXRhID0gKHUxNikoKEFEVDczMTBfVDE2X1ZBTFVFX1NJR04gPDwgMSkgLSAodTMyKWRhdGEpOworCX0gZWxzZSB7CisJCWRhdGEgPSAoZGF0YSA8PCBBRFQ3MzEwX1QxM19WQUxVRV9GTE9BVF9PRkZTRVQpIHwKKwkJCSh0bXAyICYgQURUNzMxMF9UMTNfVkFMVUVfRkxPQVRfTUFTSyk7CisKKwkJaWYgKHRtcDEgPCAwKQorCQkJLyogY29udmVydCBwb3NpdGl2ZSB2YWx1ZSB0byBzdXBwbHltZW50ICovCisJCQlkYXRhID0gKEFEVDczMTBfVDEzX1ZBTFVFX1NJR04gPDwgMSkgLSBkYXRhOworCQlkYXRhIDw8PSBBRFQ3MzEwX1QxM19WQUxVRV9PRkZTRVQ7CisJfQorCisJcmV0ID0gYWR0NzMxMF9zcGlfd3JpdGVfd29yZChjaGlwLCBib3VuZF9yZWcsIGRhdGEpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxMF9zaG93X3RfYWxhcm1faGlnaChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJcmV0dXJuIGFkdDczMTBfc2hvd190X2JvdW5kKGRldiwgYXR0ciwKKwkJCUFEVDczMTBfVF9BTEFSTV9ISUdILCBidWYpOworfQorCitzdGF0aWMgaW5saW5lIHNzaXplX3QgYWR0NzMxMF9zZXRfdF9hbGFybV9oaWdoKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gYWR0NzMxMF9zZXRfdF9ib3VuZChkZXYsIGF0dHIsCisJCQlBRFQ3MzEwX1RfQUxBUk1fSElHSCwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzEwX3Nob3dfdF9hbGFybV9sb3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXJldHVybiBhZHQ3MzEwX3Nob3dfdF9ib3VuZChkZXYsIGF0dHIsCisJCQlBRFQ3MzEwX1RfQUxBUk1fTE9XLCBidWYpOworfQorCitzdGF0aWMgaW5saW5lIHNzaXplX3QgYWR0NzMxMF9zZXRfdF9hbGFybV9sb3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXJldHVybiBhZHQ3MzEwX3NldF90X2JvdW5kKGRldiwgYXR0ciwKKwkJCUFEVDczMTBfVF9BTEFSTV9MT1csIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxMF9zaG93X3RfY3JpdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJcmV0dXJuIGFkdDczMTBfc2hvd190X2JvdW5kKGRldiwgYXR0ciwKKwkJCUFEVDczMTBfVF9DUklULCBidWYpOworfQorCitzdGF0aWMgaW5saW5lIHNzaXplX3QgYWR0NzMxMF9zZXRfdF9jcml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gYWR0NzMxMF9zZXRfdF9ib3VuZChkZXYsIGF0dHIsCisJCQlBRFQ3MzEwX1RfQ1JJVCwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzEwX3Nob3dfdF9oeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxMF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJaW50IHJldDsKKwl1OCB0X2h5c3Q7CisKKwlyZXQgPSBhZHQ3MzEwX3NwaV9yZWFkX2J5dGUoY2hpcCwgQURUNzMxMF9UX0hZU1QsICZ0X2h5c3QpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHRfaHlzdCAmIEFEVDczMTBfVF9IWVNUX01BU0spOworfQorCitzdGF0aWMgaW5saW5lIHNzaXplX3QgYWR0NzMxMF9zZXRfdF9oeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxMF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJdTggdF9oeXN0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmZGF0YSk7CisKKwlpZiAocmV0IHx8IGRhdGEgPiBBRFQ3MzEwX1RfSFlTVF9NQVNLKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRfaHlzdCA9ICh1OClkYXRhOworCisJcmV0ID0gYWR0NzMxMF9zcGlfd3JpdGVfYnl0ZShjaGlwLCBBRFQ3MzEwX1RfSFlTVCwgdF9oeXN0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiBsZW47Cit9CisKK0lJT19FVkVOVF9BVFRSX1NIKGV2ZW50X21vZGUsIGlpb19ldmVudF9hZHQ3MzEwLAorCQlhZHQ3MzEwX3Nob3dfZXZlbnRfbW9kZSwgYWR0NzMxMF9zZXRfZXZlbnRfbW9kZSwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSChhdmFpbGFibGVfZXZlbnRfbW9kZXMsIGlpb19ldmVudF9hZHQ3MzEwLAorCQlhZHQ3MzEwX3Nob3dfYXZhaWxhYmxlX2V2ZW50X21vZGVzLCBOVUxMLCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKGZhdWx0X3F1ZXVlLCBpaW9fZXZlbnRfYWR0NzMxMCwKKwkJYWR0NzMxMF9zaG93X2ZhdWx0X3F1ZXVlLCBhZHQ3MzEwX3NldF9mYXVsdF9xdWV1ZSwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSCh0X2FsYXJtX2hpZ2gsIGlpb19ldmVudF9hZHQ3MzEwLAorCQlhZHQ3MzEwX3Nob3dfdF9hbGFybV9oaWdoLCBhZHQ3MzEwX3NldF90X2FsYXJtX2hpZ2gsIDApOworSUlPX0VWRU5UX0FUVFJfU0godF9hbGFybV9sb3csIGlpb19ldmVudF9hZHQ3MzEwLAorCQlhZHQ3MzEwX3Nob3dfdF9hbGFybV9sb3csIGFkdDczMTBfc2V0X3RfYWxhcm1fbG93LCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKHRfY3JpdCwgaWlvX2V2ZW50X2FkdDczMTBfY3QsCisJCWFkdDczMTBfc2hvd190X2NyaXQsIGFkdDczMTBfc2V0X3RfY3JpdCwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSCh0X2h5c3QsIGlpb19ldmVudF9hZHQ3MzEwLAorCQlhZHQ3MzEwX3Nob3dfdF9oeXN0LCBhZHQ3MzEwX3NldF90X2h5c3QsIDApOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWR0NzMxMF9ldmVudF9pbnRfYXR0cmlidXRlc1tdID0geworCSZpaW9fZXZlbnRfYXR0cl9ldmVudF9tb2RlLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX2F2YWlsYWJsZV9ldmVudF9tb2Rlcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl9mYXVsdF9xdWV1ZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl90X2FsYXJtX2hpZ2guZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfdF9hbGFybV9sb3cuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfdF9oeXN0LmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZHQ3MzEwX2V2ZW50X2N0X2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2V2ZW50X2F0dHJfZXZlbnRfbW9kZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl9hdmFpbGFibGVfZXZlbnRfbW9kZXMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfZmF1bHRfcXVldWUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfdF9jcml0LmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX3RfaHlzdC5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZHQ3MzEwX2V2ZW50X2F0dHJpYnV0ZV9ncm91cFtBRFQ3MzEwX0lSUVNdID0geworCXsKKwkJLmF0dHJzID0gYWR0NzMxMF9ldmVudF9pbnRfYXR0cmlidXRlcywKKwl9LAorCXsKKwkJLmF0dHJzID0gYWR0NzMxMF9ldmVudF9jdF9hdHRyaWJ1dGVzLAorCX0KK307CisKKy8qCisgKiBkZXZpY2UgcHJvYmUgYW5kIHJlbW92ZQorICovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkdDczMTBfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaV9kZXYpCit7CisJc3RydWN0IGFkdDczMTBfY2hpcF9pbmZvICpjaGlwOworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgKmFkdDczMTBfcGxhdGZvcm1fZGF0YSA9IHNwaV9kZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworCisJY2hpcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhZHQ3MzEwX2NoaXBfaW5mbyksIEdGUF9LRVJORUwpOworCisJaWYgKGNoaXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiB0aGlzIGlzIG9ubHkgdXNlZCBmb3IgZGV2aWNlIHJlbW92YWwgcHVycG9zZXMgKi8KKwlkZXZfc2V0X2RydmRhdGEoJnNwaV9kZXYtPmRldiwgY2hpcCk7CisKKwljaGlwLT5zcGlfZGV2ID0gc3BpX2RldjsKKwljaGlwLT5uYW1lID0gc3BpX2Rldi0+bW9kYWxpYXM7CisKKwljaGlwLT5pbmRpb19kZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKGNoaXAtPmluZGlvX2RldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9jaGlwOworCX0KKworCWNoaXAtPmluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZzcGlfZGV2LT5kZXY7CisJY2hpcC0+aW5kaW9fZGV2LT5hdHRycyA9ICZhZHQ3MzEwX2F0dHJpYnV0ZV9ncm91cDsKKwljaGlwLT5pbmRpb19kZXYtPmV2ZW50X2F0dHJzID0gYWR0NzMxMF9ldmVudF9hdHRyaWJ1dGVfZ3JvdXA7CisJY2hpcC0+aW5kaW9fZGV2LT5kZXZfZGF0YSA9ICh2b2lkICopY2hpcDsKKwljaGlwLT5pbmRpb19kZXYtPmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRTsKKwljaGlwLT5pbmRpb19kZXYtPm51bV9pbnRlcnJ1cHRfbGluZXMgPSBBRFQ3MzEwX0lSUVM7CisJY2hpcC0+aW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihjaGlwLT5pbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisKKwkvKiBDVCBjcml0Y2FsIHRlbXBlcmF0dXJlIGV2ZW50LiBsaW5lIDAgKi8KKwlpZiAoc3BpX2Rldi0+aXJxKSB7CisJCWlmIChhZHQ3MzEwX3BsYXRmb3JtX2RhdGFbMl0pCisJCQlpcnFfZmxhZ3MgPSBhZHQ3MzEwX3BsYXRmb3JtX2RhdGFbMl07CisJCWVsc2UKKwkJCWlycV9mbGFncyA9IElSUUZfVFJJR0dFUl9MT1c7CisJCXJldCA9IGlpb19yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShzcGlfZGV2LT5pcnEsCisJCQkJY2hpcC0+aW5kaW9fZGV2LAorCQkJCTAsCisJCQkJaXJxX2ZsYWdzLAorCQkJCWNoaXAtPm5hbWUpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl91bnJlZ19kZXY7CisKKwkJLyoKKwkJICogVGhlIGV2ZW50IGhhbmRsZXIgbGlzdCBlbGVtZW50IHJlZmVyIHRvIGlpb19ldmVudF9hZHQ3MzEwLgorCQkgKiBBbGwgZXZlbnQgYXR0cmlidXRlcyBiaW5kIHRvIHRoZSBzYW1lIGV2ZW50IGhhbmRsZXIuCisJCSAqIE9uZSBldmVudCBoYW5kbGVyIGNhbiBvbmx5IGJlIGFkZGVkIHRvIG9uZSBldmVudCBsaXN0LgorCQkgKi8KKwkJaWlvX2FkZF9ldmVudF90b19saXN0KCZpaW9fZXZlbnRfYWR0NzMxMCwKKwkJCQkmY2hpcC0+aW5kaW9fZGV2LT5pbnRlcnJ1cHRzWzBdLT5ldl9saXN0KTsKKwl9CisKKwkvKiBJTlQgYm91bmQgdGVtcGVyYXR1cmUgYWxhcm0gZXZlbnQuIGxpbmUgMSAqLworCWlmIChhZHQ3MzEwX3BsYXRmb3JtX2RhdGFbMF0pIHsKKwkJcmV0ID0gaWlvX3JlZ2lzdGVyX2ludGVycnVwdF9saW5lKGFkdDczMTBfcGxhdGZvcm1fZGF0YVswXSwKKwkJCQljaGlwLT5pbmRpb19kZXYsCisJCQkJMSwKKwkJCQlhZHQ3MzEwX3BsYXRmb3JtX2RhdGFbMV0sCisJCQkJY2hpcC0+bmFtZSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3VucmVnX2N0X2lycTsKKworCQkvKgorCQkgKiBUaGUgZXZlbnQgaGFuZGxlciBsaXN0IGVsZW1lbnQgcmVmZXIgdG8gaWlvX2V2ZW50X2FkdDczMTAuCisJCSAqIEFsbCBldmVudCBhdHRyaWJ1dGVzIGJpbmQgdG8gdGhlIHNhbWUgZXZlbnQgaGFuZGxlci4KKwkJICogT25lIGV2ZW50IGhhbmRsZXIgY2FuIG9ubHkgYmUgYWRkZWQgdG8gb25lIGV2ZW50IGxpc3QuCisJCSAqLworCQlpaW9fYWRkX2V2ZW50X3RvX2xpc3QoJmlpb19ldmVudF9hZHQ3MzEwX2N0LAorCQkJCSZjaGlwLT5pbmRpb19kZXYtPmludGVycnVwdHNbMV0tPmV2X2xpc3QpOworCX0KKworCWlmIChzcGlfZGV2LT5pcnEgJiYgYWR0NzMxMF9wbGF0Zm9ybV9kYXRhWzBdKSB7CisJCUlOSVRfV09SSygmY2hpcC0+dGhyZXNoX3dvcmssIGFkdDczMTBfaW50ZXJydXB0X2JoKTsKKworCQlyZXQgPSBhZHQ3MzEwX3NwaV9yZWFkX2J5dGUoY2hpcCwgQURUNzMxMF9DT05GSUcsICZjaGlwLT5jb25maWcpOworCQlpZiAocmV0KSB7CisJCQlyZXQgPSAtRUlPOworCQkJZ290byBlcnJvcl91bnJlZ19pbnRfaXJxOworCQl9CisKKwkJLyogc2V0IGlycSBwb2xhcml0eSBsb3cgbGV2ZWwgKi8KKwkJY2hpcC0+Y29uZmlnICY9IH5BRFQ3MzEwX0NUX1BPTEFSSVRZOworCisJCWlmIChhZHQ3MzEwX3BsYXRmb3JtX2RhdGFbMV0gJiBJUlFGX1RSSUdHRVJfSElHSCkKKwkJCWNoaXAtPmNvbmZpZyB8PSBBRFQ3MzEwX0lOVF9QT0xBUklUWTsKKwkJZWxzZQorCQkJY2hpcC0+Y29uZmlnICY9IH5BRFQ3MzEwX0lOVF9QT0xBUklUWTsKKworCQlyZXQgPSBhZHQ3MzEwX3NwaV93cml0ZV9ieXRlKGNoaXAsIEFEVDczMTBfQ09ORklHLCBjaGlwLT5jb25maWcpOworCQlpZiAocmV0KSB7CisJCQlyZXQgPSAtRUlPOworCQkJZ290byBlcnJvcl91bnJlZ19pbnRfaXJxOworCQl9CisJfQorCisJZGV2X2luZm8oJnNwaV9kZXYtPmRldiwgIiVzIHRlbXBlcmF0dXJlIHNlbnNvciByZWdpc3RlcmVkLlxuIiwKKwkJCWNoaXAtPm5hbWUpOworCisJcmV0dXJuIDA7CisKK2Vycm9yX3VucmVnX2ludF9pcnE6CisJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoY2hpcC0+aW5kaW9fZGV2LCAxKTsKK2Vycm9yX3VucmVnX2N0X2lycToKKwlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShjaGlwLT5pbmRpb19kZXYsIDApOworZXJyb3JfdW5yZWdfZGV2OgorCWlpb19kZXZpY2VfdW5yZWdpc3RlcihjaGlwLT5pbmRpb19kZXYpOworZXJyb3JfZnJlZV9kZXY6CisJaWlvX2ZyZWVfZGV2aWNlKGNoaXAtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX2NoaXA6CisJa2ZyZWUoY2hpcCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhZHQ3MzEwX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldikKK3sKKwlzdHJ1Y3QgYWR0NzMxMF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfZ2V0X2RydmRhdGEoJnNwaV9kZXYtPmRldik7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGNoaXAtPmluZGlvX2RldjsKKwl1bnNpZ25lZCBsb25nICphZHQ3MzEwX3BsYXRmb3JtX2RhdGEgPSBzcGlfZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCWRldl9zZXRfZHJ2ZGF0YSgmc3BpX2Rldi0+ZGV2LCBOVUxMKTsKKwlpZiAoYWR0NzMxMF9wbGF0Zm9ybV9kYXRhWzBdKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShpbmRpb19kZXYsIDEpOworCWlmIChzcGlfZGV2LT5pcnEpCisJCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKGluZGlvX2RldiwgMCk7CisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJaWlvX2ZyZWVfZGV2aWNlKGNoaXAtPmluZGlvX2Rldik7CisJa2ZyZWUoY2hpcCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIGFkdDczMTBfaWRbXSA9IHsKKwl7ICJhZHQ3MzEwIiwgMCB9LAorCXt9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHNwaSwgYWR0NzMxMF9pZCk7CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhZHQ3MzEwX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhZHQ3MzEwIiwKKwkJLmJ1cyA9ICZzcGlfYnVzX3R5cGUsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gYWR0NzMxMF9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWR0NzMxMF9yZW1vdmUpLAorCS5pZF90YWJsZSA9IGFkdDczMTBfaWQsCit9OworCitzdGF0aWMgX19pbml0IGludCBhZHQ3MzEwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmYWR0NzMxMF9kcml2ZXIpOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgYWR0NzMxMF9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZHQ3MzEwX2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIlNvbmljIFpoYW5nIDxzb25pYy56aGFuZ0BhbmFsb2cuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBBRFQ3MzEwIGRpZ2l0YWwiCisJCQkiIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKKworbW9kdWxlX2luaXQoYWR0NzMxMF9pbml0KTsKK21vZHVsZV9leGl0KGFkdDczMTBfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZHQ3NDEwLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZHQ3NDEwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM0NWYyNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkdDc0MTAuYwpAQCAtMCwwICsxLDkxNSBAQAorLyoKKyAqIEFEVDc0MTAgZGlnaXRhbCB0ZW1wZXJhdHVyZSBzZW5zb3IgZHJpdmVyIHN1cHBvcnRpbmcgQURUNzQxMAorICoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorCisvKgorICogQURUNzQxMCByZWdpc3RlcnMgZGVmaW5pdGlvbgorICovCisKKyNkZWZpbmUgQURUNzQxMF9URU1QRVJBVFVSRQkJMAorI2RlZmluZSBBRFQ3NDEwX1NUQVRVUwkJCTIKKyNkZWZpbmUgQURUNzQxMF9DT05GSUcJCQkzCisjZGVmaW5lIEFEVDc0MTBfVF9BTEFSTV9ISUdICQk0CisjZGVmaW5lIEFEVDc0MTBfVF9BTEFSTV9MT1cJCTYKKyNkZWZpbmUgQURUNzQxMF9UX0NSSVQJCQk4CisjZGVmaW5lIEFEVDc0MTBfVF9IWVNUCQkJMHhBCisjZGVmaW5lIEFEVDc0MTBfSUQJCQkweEIKKyNkZWZpbmUgQURUNzQxMF9SRVNFVAkJCTB4MkYKKworLyoKKyAqIEFEVDc0MTAgc3RhdHVzCisgKi8KKyNkZWZpbmUgQURUNzQxMF9TVEFUX1RfTE9XCQkweDEwCisjZGVmaW5lIEFEVDc0MTBfU1RBVF9UX0hJR0gJCTB4MjAKKyNkZWZpbmUgQURUNzQxMF9TVEFUX1RfQ1JJVAkJMHg0MAorI2RlZmluZSBBRFQ3NDEwX1NUQVRfTk9UX1JEWQkJMHg4MAorCisvKgorICogQURUNzQxMCBjb25maWcKKyAqLworI2RlZmluZSBBRFQ3NDEwX0ZBVUxUX1FVRVVFX01BU0sJMHgzCisjZGVmaW5lIEFEVDc0MTBfQ1RfUE9MQVJJVFkJCTB4NAorI2RlZmluZSBBRFQ3NDEwX0lOVF9QT0xBUklUWQkJMHg4CisjZGVmaW5lIEFEVDc0MTBfRVZFTlRfTU9ERQkJMHgxMAorI2RlZmluZSBBRFQ3NDEwX01PREVfTUFTSwkJMHg2MAorI2RlZmluZSBBRFQ3NDEwX09ORVNIT1QJCQkweDIwCisjZGVmaW5lIEFEVDc0MTBfU1BTCQkJMHg0MAorI2RlZmluZSBBRFQ3NDEwX1BECQkJMHg2MAorI2RlZmluZSBBRFQ3NDEwX1JFU09MVVRJT04JCTB4ODAKKworLyoKKyAqIEFEVDc0MTAgbWFza3MKKyAqLworI2RlZmluZSBBRFQ3NDEwX1QxNl9WQUxVRV9TSUdOCQkJMHg4MDAwCisjZGVmaW5lIEFEVDc0MTBfVDE2X1ZBTFVFX0ZMT0FUX09GRlNFVAkJNworI2RlZmluZSBBRFQ3NDEwX1QxNl9WQUxVRV9GTE9BVF9NQVNLCQkweDdGCisjZGVmaW5lIEFEVDc0MTBfVDEzX1ZBTFVFX1NJR04JCQkweDEwMDAKKyNkZWZpbmUgQURUNzQxMF9UMTNfVkFMVUVfT0ZGU0VUCQkzCisjZGVmaW5lIEFEVDc0MTBfVDEzX1ZBTFVFX0ZMT0FUX09GRlNFVAkJNAorI2RlZmluZSBBRFQ3NDEwX1QxM19WQUxVRV9GTE9BVF9NQVNLCQkweEYKKyNkZWZpbmUgQURUNzQxMF9UX0hZU1RfTUFTSwkJCTB4RgorI2RlZmluZSBBRFQ3NDEwX0RFVklDRV9JRF9NQVNLCQkJMHhGCisjZGVmaW5lIEFEVDc0MTBfTUFOVUZBQ1RPUllfSURfTUFTSwkJMHhGMAorI2RlZmluZSBBRFQ3NDEwX01BTlVGQUNUT1JZX0lEX09GRlNFVAkJNAorCisjZGVmaW5lIEFEVDc0MTBfSVJRUwkJCQkyCisKKy8qCisgKiBzdHJ1Y3QgYWR0NzQxMF9jaGlwX2luZm8gLSBjaGlwIHNwZWNpZmMgaW5mb3JtYXRpb24KKyAqLworCitzdHJ1Y3QgYWR0NzQxMF9jaGlwX2luZm8geworCWNvbnN0IGNoYXIgKm5hbWU7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OworCXN0cnVjdCB3b3JrX3N0cnVjdCB0aHJlc2hfd29yazsKKwlzNjQgbGFzdF90aW1lc3RhbXA7CisJdTggIGNvbmZpZzsKK307CisKKy8qCisgKiBhZHQ3NDEwIHJlZ2lzdGVyIGFjY2VzcyBieSBJMkMKKyAqLworCitzdGF0aWMgaW50IGFkdDc0MTBfaTJjX3JlYWRfd29yZChzdHJ1Y3QgYWR0NzQxMF9jaGlwX2luZm8gKmNoaXAsIHU4IHJlZywgdTE2ICpkYXRhKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBjaGlwLT5jbGllbnQ7CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCByZWcpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiSTJDIHJlYWQgZXJyb3JcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCSpkYXRhID0gc3dhYjE2KCh1MTYpcmV0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkdDc0MTBfaTJjX3dyaXRlX3dvcmQoc3RydWN0IGFkdDc0MTBfY2hpcF9pbmZvICpjaGlwLCB1OCByZWcsIHUxNiBkYXRhKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBjaGlwLT5jbGllbnQ7CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgcmVnLCBzd2FiMTYoZGF0YSkpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkkyQyB3cml0ZSBlcnJvclxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkdDc0MTBfaTJjX3JlYWRfYnl0ZShzdHJ1Y3QgYWR0NzQxMF9jaGlwX2luZm8gKmNoaXAsIHU4IHJlZywgdTggKmRhdGEpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNoaXAtPmNsaWVudDsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHJlZyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJMkMgcmVhZCBlcnJvclxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJKmRhdGEgPSAodTgpcmV0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWR0NzQxMF9pMmNfd3JpdGVfYnl0ZShzdHJ1Y3QgYWR0NzQxMF9jaGlwX2luZm8gKmNoaXAsIHU4IHJlZywgdTggZGF0YSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gY2hpcC0+Y2xpZW50OworCWludCByZXQgPSAwOworCisJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZywgZGF0YSk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiSTJDIHdyaXRlIGVycm9yXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDc0MTBfc2hvd19tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzQxMF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTggY29uZmlnOworCisJY29uZmlnID0gY2hpcC0+Y29uZmlnICYgQURUNzQxMF9NT0RFX01BU0s7CisKKwlzd2l0Y2ggKGNvbmZpZykgeworCWNhc2UgQURUNzQxMF9QRDoKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAicG93ZXItZG93blxuIik7CisJY2FzZSBBRFQ3NDEwX09ORVNIT1Q6CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIm9uZS1zaG90XG4iKTsKKwljYXNlIEFEVDc0MTBfU1BTOgorCQlyZXR1cm4gc3ByaW50ZihidWYsICJzcHNcbiIpOworCWRlZmF1bHQ6CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgImZ1bGxcbiIpOworCX0KK30KKworc3RhdGljIHNzaXplX3QgYWR0NzQxMF9zdG9yZV9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzQxMF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTE2IGNvbmZpZzsKKwlpbnQgcmV0OworCisJcmV0ID0gYWR0NzQxMF9pMmNfcmVhZF9ieXRlKGNoaXAsIEFEVDc0MTBfQ09ORklHLCAmY2hpcC0+Y29uZmlnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNvbmZpZyA9IGNoaXAtPmNvbmZpZyAmICh+QURUNzQxMF9NT0RFX01BU0spOworCWlmIChzdHJjbXAoYnVmLCAicG93ZXItZG93biIpKQorCQljb25maWcgfD0gQURUNzQxMF9QRDsKKwllbHNlIGlmIChzdHJjbXAoYnVmLCAib25lLXNob3QiKSkKKwkJY29uZmlnIHw9IEFEVDc0MTBfT05FU0hPVDsKKwllbHNlIGlmIChzdHJjbXAoYnVmLCAic3BzIikpCisJCWNvbmZpZyB8PSBBRFQ3NDEwX1NQUzsKKworCXJldCA9IGFkdDc0MTBfaTJjX3dyaXRlX2J5dGUoY2hpcCwgQURUNzQxMF9DT05GSUcsIGNvbmZpZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljaGlwLT5jb25maWcgPSBjb25maWc7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKG1vZGUsIFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZHQ3NDEwX3Nob3dfbW9kZSwKKwkJYWR0NzQxMF9zdG9yZV9tb2RlLAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzQxMF9zaG93X2F2YWlsYWJsZV9tb2RlcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiZnVsbFxub25lLXNob3RcbnNwc1xucG93ZXItZG93blxuIik7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoYXZhaWxhYmxlX21vZGVzLCBTX0lSVUdPLCBhZHQ3NDEwX3Nob3dfYXZhaWxhYmxlX21vZGVzLCBOVUxMLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzQxMF9zaG93X3Jlc29sdXRpb24oc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3NDEwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwlpbnQgcmV0OworCWludCBiaXRzOworCisJcmV0ID0gYWR0NzQxMF9pMmNfcmVhZF9ieXRlKGNoaXAsIEFEVDc0MTBfQ09ORklHLCAmY2hpcC0+Y29uZmlnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChjaGlwLT5jb25maWcgJiBBRFQ3NDEwX1JFU09MVVRJT04pCisJCWJpdHMgPSAxNjsKKwllbHNlCisJCWJpdHMgPSAxMzsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkIGJpdHNcbiIsIGJpdHMpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3NDEwX3N0b3JlX3Jlc29sdXRpb24oc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3NDEwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJdTE2IGNvbmZpZzsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gYWR0NzQxMF9pMmNfcmVhZF9ieXRlKGNoaXAsIEFEVDc0MTBfQ09ORklHLCAmY2hpcC0+Y29uZmlnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNvbmZpZyA9IGNoaXAtPmNvbmZpZyAmICh+QURUNzQxMF9SRVNPTFVUSU9OKTsKKwlpZiAoZGF0YSkKKwkJY29uZmlnIHw9IEFEVDc0MTBfUkVTT0xVVElPTjsKKworCXJldCA9IGFkdDc0MTBfaTJjX3dyaXRlX2J5dGUoY2hpcCwgQURUNzQxMF9DT05GSUcsIGNvbmZpZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljaGlwLT5jb25maWcgPSBjb25maWc7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKHJlc29sdXRpb24sIFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZHQ3NDEwX3Nob3dfcmVzb2x1dGlvbiwKKwkJYWR0NzQxMF9zdG9yZV9yZXNvbHV0aW9uLAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzQxMF9zaG93X2lkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzQxMF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTggaWQ7CisJaW50IHJldDsKKworCXJldCA9IGFkdDc0MTBfaTJjX3JlYWRfYnl0ZShjaGlwLCBBRFQ3NDEwX0lELCAmaWQpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiZGV2aWNlIGlkOiAweCV4XG5tYW51ZmFjdG9yeSBpZDogMHgleFxuIiwKKwkJCWlkICYgQURUNzQxMF9ERVZJQ0VfSURfTUFTSywKKwkJCShpZCAmIEFEVDc0MTBfTUFOVUZBQ1RPUllfSURfTUFTSykgPj4gQURUNzQxMF9NQU5VRkFDVE9SWV9JRF9PRkZTRVQpOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGlkLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWR0NzQxMF9zaG93X2lkLAorCQlOVUxMLAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzQxMF9jb252ZXJ0X3RlbXBlcmF0dXJlKHN0cnVjdCBhZHQ3NDEwX2NoaXBfaW5mbyAqY2hpcCwKKwkJdTE2IGRhdGEsIGNoYXIgKmJ1ZikKK3sKKwljaGFyIHNpZ24gPSAnICc7CisKKwlpZiAoY2hpcC0+Y29uZmlnICYgQURUNzQxMF9SRVNPTFVUSU9OKSB7CisJCWlmIChkYXRhICYgQURUNzQxMF9UMTZfVkFMVUVfU0lHTikgeworCQkJLyogY29udmVydCBzdXBwbGVtZW50IHRvIHBvc2l0aXZlIHZhbHVlICovCisJCQlkYXRhID0gKHUxNikoKEFEVDc0MTBfVDE2X1ZBTFVFX1NJR04gPDwgMSkgLSAodTMyKWRhdGEpOworCQkJc2lnbiA9ICctJzsKKwkJfQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIlYyVkLiUuN2RcbiIsIHNpZ24sCisJCQkJKGRhdGEgPj4gQURUNzQxMF9UMTZfVkFMVUVfRkxPQVRfT0ZGU0VUKSwKKwkJCQkoZGF0YSAmIEFEVDc0MTBfVDE2X1ZBTFVFX0ZMT0FUX01BU0spICogNzgxMjUpOworCX0gZWxzZSB7CisJCWlmIChkYXRhICYgQURUNzQxMF9UMTNfVkFMVUVfU0lHTikgeworCQkJLyogY29udmVydCBzdXBwbGVtZW50IHRvIHBvc2l0aXZlIHZhbHVlICovCisJCQlkYXRhID4+PSBBRFQ3NDEwX1QxM19WQUxVRV9PRkZTRVQ7CisJCQlkYXRhID0gKEFEVDc0MTBfVDEzX1ZBTFVFX1NJR04gPDwgMSkgLSBkYXRhOworCQkJc2lnbiA9ICctJzsKKwkJfQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIlYyVkLiUuNGRcbiIsIHNpZ24sCisJCQkJKGRhdGEgPj4gQURUNzQxMF9UMTNfVkFMVUVfRkxPQVRfT0ZGU0VUKSwKKwkJCQkoZGF0YSAmIEFEVDc0MTBfVDEzX1ZBTFVFX0ZMT0FUX01BU0spICogNjI1KTsKKwl9Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDc0MTBfc2hvd192YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDc0MTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXU4IHN0YXR1czsKKwl1MTYgZGF0YTsKKwlpbnQgcmV0LCBpID0gMDsKKworCWRvIHsKKwkJcmV0ID0gYWR0NzQxMF9pMmNfcmVhZF9ieXRlKGNoaXAsIEFEVDc0MTBfU1RBVFVTLCAmc3RhdHVzKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiAtRUlPOworCQlpKys7CisJCWlmIChpID09IDEwMDAwKQorCQkJcmV0dXJuIC1FSU87CisJfSB3aGlsZSAoc3RhdHVzICYgQURUNzQxMF9TVEFUX05PVF9SRFkpOworCisJcmV0ID0gYWR0NzQxMF9pMmNfcmVhZF93b3JkKGNoaXAsIEFEVDc0MTBfVEVNUEVSQVRVUkUsICZkYXRhKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiBhZHQ3NDEwX2NvbnZlcnRfdGVtcGVyYXR1cmUoY2hpcCwgZGF0YSwgYnVmKTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUih2YWx1ZSwgU19JUlVHTywgYWR0NzQxMF9zaG93X3ZhbHVlLCBOVUxMLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzQxMF9zaG93X25hbWUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3NDEwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgY2hpcC0+bmFtZSk7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgYWR0NzQxMF9zaG93X25hbWUsIE5VTEwsIDApOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWR0NzQxMF9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19kZXZfYXR0cl9hdmFpbGFibGVfbW9kZXMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX21vZGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3Jlc29sdXRpb24uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2lkLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl92YWx1ZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZHQ3NDEwX2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZHQ3NDEwX2F0dHJpYnV0ZXMsCit9OworCisvKgorICogdGVtcGVyYXR1cmUgYm91bmQgZXZlbnRzCisgKi8KKworI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9BRFQ3NDEwX0FCT1ZFX0FMQVJNICAgIElJT19CVUZGRVJfRVZFTlRfQ09ERSgwKQorI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9BRFQ3NDEwX0JFTExPV19BTEFSTSAgIElJT19CVUZGRVJfRVZFTlRfQ09ERSgxKQorI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9BRFQ3NDEwX0FCT1ZFX0NSSVQgICAgIElJT19CVUZGRVJfRVZFTlRfQ09ERSgyKQorCitzdGF0aWMgdm9pZCBhZHQ3NDEwX2ludGVycnVwdF9iaChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmtfcykKK3sKKwlzdHJ1Y3QgYWR0NzQxMF9jaGlwX2luZm8gKmNoaXAgPQorCQljb250YWluZXJfb2Yod29ya19zLCBzdHJ1Y3QgYWR0NzQxMF9jaGlwX2luZm8sIHRocmVzaF93b3JrKTsKKwl1OCBzdGF0dXM7CisKKwlpZiAoYWR0NzQxMF9pMmNfcmVhZF9ieXRlKGNoaXAsIEFEVDc0MTBfU1RBVFVTLCAmc3RhdHVzKSkKKwkJcmV0dXJuOworCisJZW5hYmxlX2lycShjaGlwLT5jbGllbnQtPmlycSk7CisKKwlpZiAoc3RhdHVzICYgQURUNzQxMF9TVEFUX1RfSElHSCkKKwkJaWlvX3B1c2hfZXZlbnQoY2hpcC0+aW5kaW9fZGV2LCAwLAorCQkJSUlPX0VWRU5UX0NPREVfQURUNzQxMF9BQk9WRV9BTEFSTSwKKwkJCWNoaXAtPmxhc3RfdGltZXN0YW1wKTsKKwlpZiAoc3RhdHVzICYgQURUNzQxMF9TVEFUX1RfTE9XKQorCQlpaW9fcHVzaF9ldmVudChjaGlwLT5pbmRpb19kZXYsIDAsCisJCQlJSU9fRVZFTlRfQ09ERV9BRFQ3NDEwX0JFTExPV19BTEFSTSwKKwkJCWNoaXAtPmxhc3RfdGltZXN0YW1wKTsKKwlpZiAoc3RhdHVzICYgQURUNzQxMF9TVEFUX1RfQ1JJVCkKKwkJaWlvX3B1c2hfZXZlbnQoY2hpcC0+aW5kaW9fZGV2LCAwLAorCQkJSUlPX0VWRU5UX0NPREVfQURUNzQxMF9BQk9WRV9DUklULAorCQkJY2hpcC0+bGFzdF90aW1lc3RhbXApOworfQorCitzdGF0aWMgaW50IGFkdDc0MTBfaW50ZXJydXB0KHN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbywKKwkJaW50IGluZGV4LAorCQlzNjQgdGltZXN0YW1wLAorCQlpbnQgbm9fdGVzdCkKK3sKKwlzdHJ1Y3QgYWR0NzQxMF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwljaGlwLT5sYXN0X3RpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKwlzY2hlZHVsZV93b3JrKCZjaGlwLT50aHJlc2hfd29yayk7CisKKwlyZXR1cm4gMDsKK30KKworSUlPX0VWRU5UX1NIKGFkdDc0MTAsICZhZHQ3NDEwX2ludGVycnVwdCk7CitJSU9fRVZFTlRfU0goYWR0NzQxMF9jdCwgJmFkdDc0MTBfaW50ZXJydXB0KTsKKworc3RhdGljIHNzaXplX3QgYWR0NzQxMF9zaG93X2V2ZW50X21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3NDEwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gYWR0NzQxMF9pMmNfcmVhZF9ieXRlKGNoaXAsIEFEVDc0MTBfQ09ORklHLCAmY2hpcC0+Y29uZmlnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChjaGlwLT5jb25maWcgJiBBRFQ3NDEwX0VWRU5UX01PREUpCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgImludGVycnVwdFxuIik7CisJZWxzZQorCQlyZXR1cm4gc3ByaW50ZihidWYsICJjb21wYXJhdG9yXG4iKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzQxMF9zZXRfZXZlbnRfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDc0MTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXUxNiBjb25maWc7CisJaW50IHJldDsKKworCXJldCA9IGFkdDc0MTBfaTJjX3JlYWRfYnl0ZShjaGlwLCBBRFQ3NDEwX0NPTkZJRywgJmNoaXAtPmNvbmZpZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljb25maWcgPSBjaGlwLT5jb25maWcgJj0gfkFEVDc0MTBfRVZFTlRfTU9ERTsKKwlpZiAoc3RyY21wKGJ1ZiwgImNvbXBhcmF0b3IiKSAhPSAwKQorCQljb25maWcgfD0gQURUNzQxMF9FVkVOVF9NT0RFOworCisJcmV0ID0gYWR0NzQxMF9pMmNfd3JpdGVfYnl0ZShjaGlwLCBBRFQ3NDEwX0NPTkZJRywgY29uZmlnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNoaXAtPmNvbmZpZyA9IGNvbmZpZzsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDc0MTBfc2hvd19hdmFpbGFibGVfZXZlbnRfbW9kZXMoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgImNvbXBhcmF0b3JcbmludGVycnVwdFxuIik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDc0MTBfc2hvd19mYXVsdF9xdWV1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDc0MTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBhZHQ3NDEwX2kyY19yZWFkX2J5dGUoY2hpcCwgQURUNzQxMF9DT05GSUcsICZjaGlwLT5jb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGNoaXAtPmNvbmZpZyAmIEFEVDc0MTBfRkFVTFRfUVVFVUVfTUFTSyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDc0MTBfc2V0X2ZhdWx0X3F1ZXVlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzQxMF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCWludCByZXQ7CisJdTggY29uZmlnOworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOworCWlmIChyZXQgfHwgZGF0YSA+IDMpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gYWR0NzQxMF9pMmNfcmVhZF9ieXRlKGNoaXAsIEFEVDc0MTBfQ09ORklHLCAmY2hpcC0+Y29uZmlnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNvbmZpZyA9IGNoaXAtPmNvbmZpZyAmIH5BRFQ3NDEwX0ZBVUxUX1FVRVVFX01BU0s7CisJY29uZmlnIHw9IGRhdGE7CisJcmV0ID0gYWR0NzQxMF9pMmNfd3JpdGVfYnl0ZShjaGlwLCBBRFQ3NDEwX0NPTkZJRywgY29uZmlnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNoaXAtPmNvbmZpZyA9IGNvbmZpZzsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZHQ3NDEwX3Nob3dfdF9ib3VuZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQl1OCBib3VuZF9yZWcsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzQxMF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTE2IGRhdGE7CisJaW50IHJldDsKKworCXJldCA9IGFkdDc0MTBfaTJjX3JlYWRfd29yZChjaGlwLCBib3VuZF9yZWcsICZkYXRhKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiBhZHQ3NDEwX2NvbnZlcnRfdGVtcGVyYXR1cmUoY2hpcCwgZGF0YSwgYnVmKTsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90IGFkdDc0MTBfc2V0X3RfYm91bmQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJdTggYm91bmRfcmVnLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDc0MTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCWxvbmcgdG1wMSwgdG1wMjsKKwl1MTYgZGF0YTsKKwljaGFyICpwb3M7CisJaW50IHJldDsKKworCXBvcyA9IHN0cmNocihidWYsICcuJyk7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ0bXAxKTsKKworCWlmIChyZXQgfHwgdG1wMSA+IDEyNyB8fCB0bXAxIDwgLTEyOCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocG9zKSB7CisJCWxlbiA9IHN0cmxlbihwb3MpOworCisJCWlmIChjaGlwLT5jb25maWcgJiBBRFQ3NDEwX1JFU09MVVRJT04pIHsKKwkJCWlmIChsZW4gPiBBRFQ3NDEwX1QxNl9WQUxVRV9GTE9BVF9PRkZTRVQpCisJCQkJbGVuID0gQURUNzQxMF9UMTZfVkFMVUVfRkxPQVRfT0ZGU0VUOworCQkJcG9zW2xlbl0gPSAwOworCQkJcmV0ID0gc3RyaWN0X3N0cnRvbChwb3MsIDEwLCAmdG1wMik7CisKKwkJCWlmICghcmV0KQorCQkJCXRtcDIgPSAodG1wMiAvIDc4MTI1KSAqIDc4MTI1OworCQl9IGVsc2UgeworCQkJaWYgKGxlbiA+IEFEVDc0MTBfVDEzX1ZBTFVFX0ZMT0FUX09GRlNFVCkKKwkJCQlsZW4gPSBBRFQ3NDEwX1QxM19WQUxVRV9GTE9BVF9PRkZTRVQ7CisJCQlwb3NbbGVuXSA9IDA7CisJCQlyZXQgPSBzdHJpY3Rfc3RydG9sKHBvcywgMTAsICZ0bXAyKTsKKworCQkJaWYgKCFyZXQpCisJCQkJdG1wMiA9ICh0bXAyIC8gNjI1KSAqIDYyNTsKKwkJfQorCX0KKworCWlmICh0bXAxIDwgMCkKKwkJZGF0YSA9ICh1MTYpKC10bXAxKTsKKwllbHNlCisJCWRhdGEgPSAodTE2KXRtcDE7CisKKwlpZiAoY2hpcC0+Y29uZmlnICYgQURUNzQxMF9SRVNPTFVUSU9OKSB7CisJCWRhdGEgPSAoZGF0YSA8PCBBRFQ3NDEwX1QxNl9WQUxVRV9GTE9BVF9PRkZTRVQpIHwKKwkJCSh0bXAyICYgQURUNzQxMF9UMTZfVkFMVUVfRkxPQVRfTUFTSyk7CisKKwkJaWYgKHRtcDEgPCAwKQorCQkJLyogY29udmVydCBwb3NpdGl2ZSB2YWx1ZSB0byBzdXBwbHltZW50ICovCisJCQlkYXRhID0gKHUxNikoKEFEVDc0MTBfVDE2X1ZBTFVFX1NJR04gPDwgMSkgLSAodTMyKWRhdGEpOworCX0gZWxzZSB7CisJCWRhdGEgPSAoZGF0YSA8PCBBRFQ3NDEwX1QxM19WQUxVRV9GTE9BVF9PRkZTRVQpIHwKKwkJCSh0bXAyICYgQURUNzQxMF9UMTNfVkFMVUVfRkxPQVRfTUFTSyk7CisKKwkJaWYgKHRtcDEgPCAwKQorCQkJLyogY29udmVydCBwb3NpdGl2ZSB2YWx1ZSB0byBzdXBwbHltZW50ICovCisJCQlkYXRhID0gKEFEVDc0MTBfVDEzX1ZBTFVFX1NJR04gPDwgMSkgLSBkYXRhOworCQlkYXRhIDw8PSBBRFQ3NDEwX1QxM19WQUxVRV9PRkZTRVQ7CisJfQorCisJcmV0ID0gYWR0NzQxMF9pMmNfd3JpdGVfd29yZChjaGlwLCBib3VuZF9yZWcsIGRhdGEpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzQxMF9zaG93X3RfYWxhcm1faGlnaChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJcmV0dXJuIGFkdDc0MTBfc2hvd190X2JvdW5kKGRldiwgYXR0ciwKKwkJCUFEVDc0MTBfVF9BTEFSTV9ISUdILCBidWYpOworfQorCitzdGF0aWMgaW5saW5lIHNzaXplX3QgYWR0NzQxMF9zZXRfdF9hbGFybV9oaWdoKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gYWR0NzQxMF9zZXRfdF9ib3VuZChkZXYsIGF0dHIsCisJCQlBRFQ3NDEwX1RfQUxBUk1fSElHSCwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3NDEwX3Nob3dfdF9hbGFybV9sb3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXJldHVybiBhZHQ3NDEwX3Nob3dfdF9ib3VuZChkZXYsIGF0dHIsCisJCQlBRFQ3NDEwX1RfQUxBUk1fTE9XLCBidWYpOworfQorCitzdGF0aWMgaW5saW5lIHNzaXplX3QgYWR0NzQxMF9zZXRfdF9hbGFybV9sb3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXJldHVybiBhZHQ3NDEwX3NldF90X2JvdW5kKGRldiwgYXR0ciwKKwkJCUFEVDc0MTBfVF9BTEFSTV9MT1csIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzQxMF9zaG93X3RfY3JpdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJcmV0dXJuIGFkdDc0MTBfc2hvd190X2JvdW5kKGRldiwgYXR0ciwKKwkJCUFEVDc0MTBfVF9DUklULCBidWYpOworfQorCitzdGF0aWMgaW5saW5lIHNzaXplX3QgYWR0NzQxMF9zZXRfdF9jcml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gYWR0NzQxMF9zZXRfdF9ib3VuZChkZXYsIGF0dHIsCisJCQlBRFQ3NDEwX1RfQ1JJVCwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3NDEwX3Nob3dfdF9oeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzQxMF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJaW50IHJldDsKKwl1OCB0X2h5c3Q7CisKKwlyZXQgPSBhZHQ3NDEwX2kyY19yZWFkX2J5dGUoY2hpcCwgQURUNzQxMF9UX0hZU1QsICZ0X2h5c3QpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHRfaHlzdCAmIEFEVDc0MTBfVF9IWVNUX01BU0spOworfQorCitzdGF0aWMgaW5saW5lIHNzaXplX3QgYWR0NzQxMF9zZXRfdF9oeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzQxMF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJdTggdF9oeXN0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmZGF0YSk7CisKKwlpZiAocmV0IHx8IGRhdGEgPiBBRFQ3NDEwX1RfSFlTVF9NQVNLKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRfaHlzdCA9ICh1OClkYXRhOworCisJcmV0ID0gYWR0NzQxMF9pMmNfd3JpdGVfYnl0ZShjaGlwLCBBRFQ3NDEwX1RfSFlTVCwgdF9oeXN0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiByZXQ7Cit9CisKK0lJT19FVkVOVF9BVFRSX1NIKGV2ZW50X21vZGUsIGlpb19ldmVudF9hZHQ3NDEwLAorCQlhZHQ3NDEwX3Nob3dfZXZlbnRfbW9kZSwgYWR0NzQxMF9zZXRfZXZlbnRfbW9kZSwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSChhdmFpbGFibGVfZXZlbnRfbW9kZXMsIGlpb19ldmVudF9hZHQ3NDEwLAorCQlhZHQ3NDEwX3Nob3dfYXZhaWxhYmxlX2V2ZW50X21vZGVzLCBOVUxMLCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKGZhdWx0X3F1ZXVlLCBpaW9fZXZlbnRfYWR0NzQxMCwKKwkJYWR0NzQxMF9zaG93X2ZhdWx0X3F1ZXVlLCBhZHQ3NDEwX3NldF9mYXVsdF9xdWV1ZSwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSCh0X2FsYXJtX2hpZ2gsIGlpb19ldmVudF9hZHQ3NDEwLAorCQlhZHQ3NDEwX3Nob3dfdF9hbGFybV9oaWdoLCBhZHQ3NDEwX3NldF90X2FsYXJtX2hpZ2gsIDApOworSUlPX0VWRU5UX0FUVFJfU0godF9hbGFybV9sb3csIGlpb19ldmVudF9hZHQ3NDEwLAorCQlhZHQ3NDEwX3Nob3dfdF9hbGFybV9sb3csIGFkdDc0MTBfc2V0X3RfYWxhcm1fbG93LCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKHRfY3JpdCwgaWlvX2V2ZW50X2FkdDc0MTBfY3QsCisJCWFkdDc0MTBfc2hvd190X2NyaXQsIGFkdDc0MTBfc2V0X3RfY3JpdCwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSCh0X2h5c3QsIGlpb19ldmVudF9hZHQ3NDEwLAorCQlhZHQ3NDEwX3Nob3dfdF9oeXN0LCBhZHQ3NDEwX3NldF90X2h5c3QsIDApOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWR0NzQxMF9ldmVudF9pbnRfYXR0cmlidXRlc1tdID0geworCSZpaW9fZXZlbnRfYXR0cl9ldmVudF9tb2RlLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX2F2YWlsYWJsZV9ldmVudF9tb2Rlcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl9mYXVsdF9xdWV1ZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl90X2FsYXJtX2hpZ2guZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfdF9hbGFybV9sb3cuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfdF9oeXN0LmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZHQ3NDEwX2V2ZW50X2N0X2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2V2ZW50X2F0dHJfZXZlbnRfbW9kZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl9hdmFpbGFibGVfZXZlbnRfbW9kZXMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfZmF1bHRfcXVldWUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfdF9jcml0LmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX3RfaHlzdC5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZHQ3NDEwX2V2ZW50X2F0dHJpYnV0ZV9ncm91cFtBRFQ3NDEwX0lSUVNdID0geworCXsKKwkJLmF0dHJzID0gYWR0NzQxMF9ldmVudF9pbnRfYXR0cmlidXRlcywKKwl9LAorCXsKKwkJLmF0dHJzID0gYWR0NzQxMF9ldmVudF9jdF9hdHRyaWJ1dGVzLAorCX0KK307CisKKy8qCisgKiBkZXZpY2UgcHJvYmUgYW5kIHJlbW92ZQorICovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkdDc0MTBfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBhZHQ3NDEwX2NoaXBfaW5mbyAqY2hpcDsKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nICphZHQ3NDEwX3BsYXRmb3JtX2RhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJY2hpcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhZHQ3NDEwX2NoaXBfaW5mbyksIEdGUF9LRVJORUwpOworCisJaWYgKGNoaXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiB0aGlzIGlzIG9ubHkgdXNlZCBmb3IgZGV2aWNlIHJlbW92YWwgcHVycG9zZXMgKi8KKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBjaGlwKTsKKworCWNoaXAtPmNsaWVudCA9IGNsaWVudDsKKwljaGlwLT5uYW1lID0gaWQtPm5hbWU7CisKKwljaGlwLT5pbmRpb19kZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKGNoaXAtPmluZGlvX2RldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9jaGlwOworCX0KKworCWNoaXAtPmluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZjbGllbnQtPmRldjsKKwljaGlwLT5pbmRpb19kZXYtPmF0dHJzID0gJmFkdDc0MTBfYXR0cmlidXRlX2dyb3VwOworCWNoaXAtPmluZGlvX2Rldi0+ZXZlbnRfYXR0cnMgPSBhZHQ3NDEwX2V2ZW50X2F0dHJpYnV0ZV9ncm91cDsKKwljaGlwLT5pbmRpb19kZXYtPmRldl9kYXRhID0gKHZvaWQgKiljaGlwOworCWNoaXAtPmluZGlvX2Rldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCWNoaXAtPmluZGlvX2Rldi0+bnVtX2ludGVycnVwdF9saW5lcyA9IEFEVDc0MTBfSVJRUzsKKwljaGlwLT5pbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGNoaXAtPmluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldjsKKworCS8qIENUIGNyaXRjYWwgdGVtcGVyYXR1cmUgZXZlbnQuIGxpbmUgMCAqLworCWlmIChjbGllbnQtPmlycSkgeworCQlyZXQgPSBpaW9fcmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoY2xpZW50LT5pcnEsCisJCQkJY2hpcC0+aW5kaW9fZGV2LAorCQkJCTAsCisJCQkJSVJRRl9UUklHR0VSX0xPVywKKwkJCQljaGlwLT5uYW1lKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfdW5yZWdfZGV2OworCisJCS8qCisJCSAqIFRoZSBldmVudCBoYW5kbGVyIGxpc3QgZWxlbWVudCByZWZlciB0byBpaW9fZXZlbnRfYWR0NzQxMC4KKwkJICogQWxsIGV2ZW50IGF0dHJpYnV0ZXMgYmluZCB0byB0aGUgc2FtZSBldmVudCBoYW5kbGVyLgorCQkgKiBPbmUgZXZlbnQgaGFuZGxlciBjYW4gb25seSBiZSBhZGRlZCB0byBvbmUgZXZlbnQgbGlzdC4KKwkJICovCisJCWlpb19hZGRfZXZlbnRfdG9fbGlzdCgmaWlvX2V2ZW50X2FkdDc0MTAsCisJCQkJJmNoaXAtPmluZGlvX2Rldi0+aW50ZXJydXB0c1swXS0+ZXZfbGlzdCk7CisJfQorCisJLyogSU5UIGJvdW5kIHRlbXBlcmF0dXJlIGFsYXJtIGV2ZW50LiBsaW5lIDEgKi8KKwlpZiAoYWR0NzQxMF9wbGF0Zm9ybV9kYXRhWzBdKSB7CisJCXJldCA9IGlpb19yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShhZHQ3NDEwX3BsYXRmb3JtX2RhdGFbMF0sCisJCQkJY2hpcC0+aW5kaW9fZGV2LAorCQkJCTEsCisJCQkJYWR0NzQxMF9wbGF0Zm9ybV9kYXRhWzFdLAorCQkJCWNoaXAtPm5hbWUpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl91bnJlZ19jdF9pcnE7CisKKwkJLyoKKwkJICogVGhlIGV2ZW50IGhhbmRsZXIgbGlzdCBlbGVtZW50IHJlZmVyIHRvIGlpb19ldmVudF9hZHQ3NDEwLgorCQkgKiBBbGwgZXZlbnQgYXR0cmlidXRlcyBiaW5kIHRvIHRoZSBzYW1lIGV2ZW50IGhhbmRsZXIuCisJCSAqIE9uZSBldmVudCBoYW5kbGVyIGNhbiBvbmx5IGJlIGFkZGVkIHRvIG9uZSBldmVudCBsaXN0LgorCQkgKi8KKwkJaWlvX2FkZF9ldmVudF90b19saXN0KCZpaW9fZXZlbnRfYWR0NzQxMF9jdCwKKwkJCQkmY2hpcC0+aW5kaW9fZGV2LT5pbnRlcnJ1cHRzWzFdLT5ldl9saXN0KTsKKwl9CisKKwlpZiAoY2xpZW50LT5pcnEgJiYgYWR0NzQxMF9wbGF0Zm9ybV9kYXRhWzBdKSB7CisJCUlOSVRfV09SSygmY2hpcC0+dGhyZXNoX3dvcmssIGFkdDc0MTBfaW50ZXJydXB0X2JoKTsKKworCQlyZXQgPSBhZHQ3NDEwX2kyY19yZWFkX2J5dGUoY2hpcCwgQURUNzQxMF9DT05GSUcsICZjaGlwLT5jb25maWcpOworCQlpZiAocmV0KSB7CisJCQlyZXQgPSAtRUlPOworCQkJZ290byBlcnJvcl91bnJlZ19pbnRfaXJxOworCQl9CisKKwkJLyogc2V0IGlycSBwb2xhcml0eSBsb3cgbGV2ZWwgKi8KKwkJY2hpcC0+Y29uZmlnICY9IH5BRFQ3NDEwX0NUX1BPTEFSSVRZOworCisJCWlmIChhZHQ3NDEwX3BsYXRmb3JtX2RhdGFbMV0gJiBJUlFGX1RSSUdHRVJfSElHSCkKKwkJCWNoaXAtPmNvbmZpZyB8PSBBRFQ3NDEwX0lOVF9QT0xBUklUWTsKKwkJZWxzZQorCQkJY2hpcC0+Y29uZmlnICY9IH5BRFQ3NDEwX0lOVF9QT0xBUklUWTsKKworCQlyZXQgPSBhZHQ3NDEwX2kyY193cml0ZV9ieXRlKGNoaXAsIEFEVDc0MTBfQ09ORklHLCBjaGlwLT5jb25maWcpOworCQlpZiAocmV0KSB7CisJCQlyZXQgPSAtRUlPOworCQkJZ290byBlcnJvcl91bnJlZ19pbnRfaXJxOworCQl9CisJfQorCisJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiJXMgdGVtcGVyYXR1cmUgc2Vuc29yIHJlZ2lzdGVyZWQuXG4iLAorCQkJIGlkLT5uYW1lKTsKKworCXJldHVybiAwOworCitlcnJvcl91bnJlZ19pbnRfaXJxOgorCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKGNoaXAtPmluZGlvX2RldiwgMSk7CitlcnJvcl91bnJlZ19jdF9pcnE6CisJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoY2hpcC0+aW5kaW9fZGV2LCAwKTsKK2Vycm9yX3VucmVnX2RldjoKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoY2hpcC0+aW5kaW9fZGV2KTsKK2Vycm9yX2ZyZWVfZGV2OgorCWlpb19mcmVlX2RldmljZShjaGlwLT5pbmRpb19kZXYpOworZXJyb3JfZnJlZV9jaGlwOgorCWtmcmVlKGNoaXApOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYWR0NzQxMF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgYWR0NzQxMF9jaGlwX2luZm8gKmNoaXAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gY2hpcC0+aW5kaW9fZGV2OworCXVuc2lnbmVkIGxvbmcgKmFkdDc0MTBfcGxhdGZvcm1fZGF0YSA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlpZiAoYWR0NzQxMF9wbGF0Zm9ybV9kYXRhWzBdKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShpbmRpb19kZXYsIDEpOworCWlmIChjbGllbnQtPmlycSkKKwkJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoaW5kaW9fZGV2LCAwKTsKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpaW9fZnJlZV9kZXZpY2UoY2hpcC0+aW5kaW9fZGV2KTsKKwlrZnJlZShjaGlwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgYWR0NzQxMF9pZFtdID0geworCXsgImFkdDc0MTAiLCAwIH0sCisJe30KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBhZHQ3NDEwX2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGFkdDc0MTBfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFkdDc0MTAiLAorCX0sCisJLnByb2JlID0gYWR0NzQxMF9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWR0NzQxMF9yZW1vdmUpLAorCS5pZF90YWJsZSA9IGFkdDc0MTBfaWQsCit9OworCitzdGF0aWMgX19pbml0IGludCBhZHQ3NDEwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmFkdDc0MTBfZHJpdmVyKTsKK30KKworc3RhdGljIF9fZXhpdCB2b2lkIGFkdDc0MTBfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZhZHQ3NDEwX2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIlNvbmljIFpoYW5nIDxzb25pYy56aGFuZ0BhbmFsb2cuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBBRFQ3NDEwIGRpZ2l0YWwiCisJCQkiIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKKworbW9kdWxlX2luaXQoYWR0NzQxMF9pbml0KTsKK21vZHVsZV9leGl0KGFkdDc0MTBfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZHQ3NS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWR0NzUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmY0ZDMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWR0NzUuYwpAQCAtMCwwICsxLDczMiBAQAorLyoKKyAqIEFEVDc1IGRpZ2l0YWwgdGVtcGVyYXR1cmUgc2Vuc29yIGRyaXZlciBzdXBwb3J0aW5nIEFEVDc1CisgKgorICogQ29weXJpZ2h0IDIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisKKy8qCisgKiBBRFQ3NSByZWdpc3RlcnMgZGVmaW5pdGlvbgorICovCisKKyNkZWZpbmUgQURUNzVfVEVNUEVSQVRVUkUJCTAKKyNkZWZpbmUgQURUNzVfQ09ORklHCQkJMQorI2RlZmluZSBBRFQ3NV9UX0hZU1QJCQkyCisjZGVmaW5lIEFEVDc1X1RfT1MJCQkzCisjZGVmaW5lIEFEVDc1X09ORVNIT1QJCQk0CisKKy8qCisgKiBBRFQ3NSBjb25maWcKKyAqLworI2RlZmluZSBBRFQ3NV9QRAkJCTB4MQorI2RlZmluZSBBRFQ3NV9PU19JTlQJCQkweDIKKyNkZWZpbmUgQURUNzVfT1NfUE9MQVJJVFkJCTB4NAorI2RlZmluZSBBRFQ3NV9GQVVMVF9RVUVVRV9NQVNLCQkweDE4CisjZGVmaW5lIEFEVDc1X0ZBVUxUX1FVRVVFX09GRlNFVAkzCisjZGVmaW5lIEFEVDc1X1NNQlVTX0FMQVJUCQkweDgKKworLyoKKyAqIEFEVDc1IG1hc2tzCisgKi8KKyNkZWZpbmUgQURUNzVfVkFMVUVfU0lHTgkJMHg4MDAKKyNkZWZpbmUgQURUNzVfVkFMVUVfT0ZGU0VUCQk0CisjZGVmaW5lIEFEVDc1X1ZBTFVFX0ZMT0FUX09GRlNFVAk0CisjZGVmaW5lIEFEVDc1X1ZBTFVFX0ZMT0FUX01BU0sJCTB4RgorCisKKy8qCisgKiBzdHJ1Y3QgYWR0NzVfY2hpcF9pbmZvIC0gY2hpcCBzcGVjaWZjIGluZm9ybWF0aW9uCisgKi8KKworc3RydWN0IGFkdDc1X2NoaXBfaW5mbyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CisJc3RydWN0IHdvcmtfc3RydWN0IHRocmVzaF93b3JrOworCXM2NCBsYXN0X3RpbWVzdGFtcDsKKwl1OCAgY29uZmlnOworfTsKKworLyoKKyAqIGFkdDc1IHJlZ2lzdGVyIGFjY2VzcyBieSBJMkMKKyAqLworCitzdGF0aWMgaW50IGFkdDc1X2kyY19yZWFkKHN0cnVjdCBhZHQ3NV9jaGlwX2luZm8gKmNoaXAsIHU4IHJlZywgdTggKmRhdGEpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNoaXAtPmNsaWVudDsKKwlpbnQgcmV0ID0gMCwgbGVuOworCisJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGUoY2xpZW50LCByZWcpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiSTJDIHJlYWQgcmVnaXN0ZXIgYWRkcmVzcyBlcnJvclxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKHJlZyA9PSBBRFQ3NV9DT05GSUcgfHwgcmVnID09IEFEVDc1X09ORVNIT1QpCisJCWxlbiA9IDE7CisJZWxzZQorCQlsZW4gPSAyOworCisJcmV0ID0gaTJjX21hc3Rlcl9yZWN2KGNsaWVudCwgZGF0YSwgbGVuKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkkyQyByZWFkIGVycm9yXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkdDc1X2kyY193cml0ZShzdHJ1Y3QgYWR0NzVfY2hpcF9pbmZvICpjaGlwLCB1OCByZWcsIHU4IGRhdGEpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNoaXAtPmNsaWVudDsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChyZWcgPT0gQURUNzVfQ09ORklHIHx8IHJlZyA9PSBBRFQ3NV9PTkVTSE9UKQorCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCBkYXRhKTsKKwllbHNlCisJCXJldCA9IGkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCByZWcsIGRhdGEpOworCisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiSTJDIHdyaXRlIGVycm9yXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDc1X3Nob3dfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDc1X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCWlmIChjaGlwLT5jb25maWcgJiBBRFQ3NV9QRCkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAicG93ZXItc2F2ZVxuIik7CisJZWxzZQorCQlyZXR1cm4gc3ByaW50ZihidWYsICJmdWxsXG4iKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzVfc3RvcmVfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDc1X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwlpbnQgcmV0OworCXU4IGNvbmZpZzsKKworCXJldCA9IGFkdDc1X2kyY19yZWFkKGNoaXAsIEFEVDc1X0NPTkZJRywgJmNoaXAtPmNvbmZpZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljb25maWcgPSBjaGlwLT5jb25maWcgJiB+QURUNzVfUEQ7CisJaWYgKCFzdHJjbXAoYnVmLCAiZnVsbCIpKQorCQljb25maWcgfD0gQURUNzVfUEQ7CisKKwlyZXQgPSBhZHQ3NV9pMmNfd3JpdGUoY2hpcCwgQURUNzVfQ09ORklHLCBjb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+Y29uZmlnID0gY29uZmlnOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihtb2RlLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWR0NzVfc2hvd19tb2RlLAorCQlhZHQ3NV9zdG9yZV9tb2RlLAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzVfc2hvd19hdmFpbGFibGVfbW9kZXMoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgImZ1bGxcbnBvd2VyLWRvd25cbiIpOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGF2YWlsYWJsZV9tb2RlcywgU19JUlVHTywgYWR0NzVfc2hvd19hdmFpbGFibGVfbW9kZXMsIE5VTEwsIDApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3NV9zaG93X29uZXNob3Qoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3NV9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgISEoY2hpcC0+Y29uZmlnICYgQURUNzVfT05FU0hPVCkpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3NV9zdG9yZV9vbmVzaG90KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzVfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YSA9IDA7CisJaW50IHJldDsKKwl1OCBjb25maWc7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKworCXJldCA9IGFkdDc1X2kyY19yZWFkKGNoaXAsIEFEVDc1X0NPTkZJRywgJmNoaXAtPmNvbmZpZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljb25maWcgPSBjaGlwLT5jb25maWcgJiB+QURUNzVfT05FU0hPVDsKKwlpZiAoZGF0YSkKKwkJY29uZmlnIHw9IEFEVDc1X09ORVNIT1Q7CisKKwlyZXQgPSBhZHQ3NV9pMmNfd3JpdGUoY2hpcCwgQURUNzVfQ09ORklHLCBjb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+Y29uZmlnID0gY29uZmlnOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihvbmVzaG90LCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWR0NzVfc2hvd19vbmVzaG90LAorCQlhZHQ3NV9zdG9yZV9vbmVzaG90LAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzVfc2hvd192YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDc1X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1MTYgZGF0YTsKKwljaGFyIHNpZ24gPSAnICc7CisJaW50IHJldDsKKworCWlmIChjaGlwLT5jb25maWcgJiBBRFQ3NV9QRCkgeworCQlkZXZfZXJyKGRldiwgIkNhbid0IHJlYWQgdmFsdWUgaW4gcG93ZXItZG93biBtb2RlLlxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmIChjaGlwLT5jb25maWcgJiBBRFQ3NV9PTkVTSE9UKSB7CisJCS8qIHdyaXRlIHRvIGFjdGl2ZSBjb252ZXJ0ZXIgKi8KKwkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGUoY2hpcC0+Y2xpZW50LCBBRFQ3NV9PTkVTSE9UKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiAtRUlPOworCX0KKworCXJldCA9IGFkdDc1X2kyY19yZWFkKGNoaXAsIEFEVDc1X1RFTVBFUkFUVVJFLCAodTggKikmZGF0YSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlkYXRhID0gc3dhYjE2KGRhdGEpID4+IEFEVDc1X1ZBTFVFX09GRlNFVDsKKwlpZiAoZGF0YSAmIEFEVDc1X1ZBTFVFX1NJR04pIHsKKwkJLyogY29udmVydCBzdXBwbGVtZW50IHRvIHBvc2l0aXZlIHZhbHVlICovCisJCWRhdGEgPSAoQURUNzVfVkFMVUVfU0lHTiA8PCAxKSAtIGRhdGE7CisJCXNpZ24gPSAnLSc7CisJfQorCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWMlZC4lLjRkXG4iLCBzaWduLAorCQkoZGF0YSA+PiBBRFQ3NV9WQUxVRV9GTE9BVF9PRkZTRVQpLAorCQkoZGF0YSAmIEFEVDc1X1ZBTFVFX0ZMT0FUX01BU0spICogNjI1KTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUih2YWx1ZSwgU19JUlVHTywgYWR0NzVfc2hvd192YWx1ZSwgTlVMTCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDc1X3Nob3dfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDc1X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgY2hpcC0+bmFtZSk7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgYWR0NzVfc2hvd19uYW1lLCBOVUxMLCAwKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkdDc1X2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2Rldl9hdHRyX2F2YWlsYWJsZV9tb2Rlcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbW9kZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfb25lc2hvdC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfdmFsdWUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX25hbWUuZGV2X2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWR0NzVfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkdDc1X2F0dHJpYnV0ZXMsCit9OworCisvKgorICogdGVtcGVyYXR1cmUgYm91bmQgZXZlbnRzCisgKi8KKworI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9BRFQ3NV9PVEkgICAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDApCisKK3N0YXRpYyB2b2lkIGFkdDc1X2ludGVycnVwdF9iaChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmtfcykKK3sKKwlzdHJ1Y3QgYWR0NzVfY2hpcF9pbmZvICpjaGlwID0KKwkJY29udGFpbmVyX29mKHdvcmtfcywgc3RydWN0IGFkdDc1X2NoaXBfaW5mbywgdGhyZXNoX3dvcmspOworCisJZW5hYmxlX2lycShjaGlwLT5jbGllbnQtPmlycSk7CisKKwlpaW9fcHVzaF9ldmVudChjaGlwLT5pbmRpb19kZXYsIDAsCisJCQlJSU9fRVZFTlRfQ09ERV9BRFQ3NV9PVEksCisJCQljaGlwLT5sYXN0X3RpbWVzdGFtcCk7Cit9CisKK3N0YXRpYyBpbnQgYWR0NzVfaW50ZXJydXB0KHN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbywKKwkJaW50IGluZGV4LAorCQlzNjQgdGltZXN0YW1wLAorCQlpbnQgbm9fdGVzdCkKK3sKKwlzdHJ1Y3QgYWR0NzVfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJY2hpcC0+bGFzdF90aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisJc2NoZWR1bGVfd29yaygmY2hpcC0+dGhyZXNoX3dvcmspOworCisJcmV0dXJuIDA7Cit9CisKK0lJT19FVkVOVF9TSChhZHQ3NSwgJmFkdDc1X2ludGVycnVwdCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDc1X3Nob3dfb3RpX21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3NV9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJaW50IHJldDsKKworCS8qIHJldHJpdmUgQUxBUlQgc3RhdHVzICovCisJcmV0ID0gYWR0NzVfaTJjX3JlYWQoY2hpcCwgQURUNzVfQ09ORklHLCAmY2hpcC0+Y29uZmlnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChjaGlwLT5jb25maWcgJiBBRFQ3NV9PU19JTlQpCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgImludGVycnVwdFxuIik7CisJZWxzZQorCQlyZXR1cm4gc3ByaW50ZihidWYsICJjb21wYXJhdG9yXG4iKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzVfc2V0X290aV9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzVfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCWludCByZXQ7CisJdTggY29uZmlnOworCisJLyogcmV0cml2ZSBBTEFSVCBzdGF0dXMgKi8KKwlyZXQgPSBhZHQ3NV9pMmNfcmVhZChjaGlwLCBBRFQ3NV9DT05GSUcsICZjaGlwLT5jb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY29uZmlnID0gY2hpcC0+Y29uZmlnICYgfkFEVDc1X09TX0lOVDsKKwlpZiAoc3RyY21wKGJ1ZiwgImNvbXBhcmF0b3IiKSAhPSAwKQorCQljb25maWcgfD0gQURUNzVfT1NfSU5UOworCisJcmV0ID0gYWR0NzVfaTJjX3dyaXRlKGNoaXAsIEFEVDc1X0NPTkZJRywgY29uZmlnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNoaXAtPmNvbmZpZyA9IGNvbmZpZzsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDc1X3Nob3dfYXZhaWxhYmxlX290aV9tb2RlcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiY29tcGFyYXRvclxuaW50ZXJydXB0XG4iKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzVfc2hvd19zbWJ1c19hbGFydChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDc1X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwlpbnQgcmV0OworCisJLyogcmV0cml2ZSBBTEFSVCBzdGF0dXMgKi8KKwlyZXQgPSBhZHQ3NV9pMmNfcmVhZChjaGlwLCBBRFQ3NV9DT05GSUcsICZjaGlwLT5jb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsICEhKGNoaXAtPmNvbmZpZyAmIEFEVDc1X1NNQlVTX0FMQVJUKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDc1X3NldF9zbWJ1c19hbGFydChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDc1X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRhdGEgPSAwOworCWludCByZXQ7CisJdTggY29uZmlnOworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogcmV0cml2ZSBBTEFSVCBzdGF0dXMgKi8KKwlyZXQgPSBhZHQ3NV9pMmNfcmVhZChjaGlwLCBBRFQ3NV9DT05GSUcsICZjaGlwLT5jb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY29uZmlnID0gY2hpcC0+Y29uZmlnICYgfkFEVDc1X1NNQlVTX0FMQVJUOworCWlmIChkYXRhKQorCQljb25maWcgfD0gQURUNzVfU01CVVNfQUxBUlQ7CisKKwlyZXQgPSBhZHQ3NV9pMmNfd3JpdGUoY2hpcCwgQURUNzVfQ09ORklHLCBjb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+Y29uZmlnID0gY29uZmlnOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzVfc2hvd19mYXVsdF9xdWV1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDc1X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwlpbnQgcmV0OworCisJLyogcmV0cml2ZSBBTEFSVCBzdGF0dXMgKi8KKwlyZXQgPSBhZHQ3NV9pMmNfcmVhZChjaGlwLCBBRFQ3NV9DT05GSUcsICZjaGlwLT5jb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIChjaGlwLT5jb25maWcgJiBBRFQ3NV9GQVVMVF9RVUVVRV9NQVNLKSA+PgorCQkJCUFEVDc1X0ZBVUxUX1FVRVVFX09GRlNFVCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDc1X3NldF9mYXVsdF9xdWV1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDc1X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJaW50IHJldDsKKwl1OCBjb25maWc7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7CisJaWYgKHJldCB8fCBkYXRhID4gMykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiByZXRyaXZlIEFMQVJUIHN0YXR1cyAqLworCXJldCA9IGFkdDc1X2kyY19yZWFkKGNoaXAsIEFEVDc1X0NPTkZJRywgJmNoaXAtPmNvbmZpZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljb25maWcgPSBjaGlwLT5jb25maWcgJiB+QURUNzVfRkFVTFRfUVVFVUVfTUFTSzsKKwljb25maWcgfD0gKGRhdGEgPDwgQURUNzVfRkFVTFRfUVVFVUVfT0ZGU0VUKTsKKwlyZXQgPSBhZHQ3NV9pMmNfd3JpdGUoY2hpcCwgQURUNzVfQ09ORklHLCBjb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+Y29uZmlnID0gY29uZmlnOworCisJcmV0dXJuIHJldDsKK30KK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZHQ3NV9zaG93X3RfYm91bmQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJdTggYm91bmRfcmVnLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDc1X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1MTYgZGF0YTsKKwljaGFyIHNpZ24gPSAnICc7CisJaW50IHJldDsKKworCXJldCA9IGFkdDc1X2kyY19yZWFkKGNoaXAsIGJvdW5kX3JlZywgKHU4ICopJmRhdGEpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJZGF0YSA9IHN3YWIxNihkYXRhKSA+PiBBRFQ3NV9WQUxVRV9PRkZTRVQ7CisJaWYgKGRhdGEgJiBBRFQ3NV9WQUxVRV9TSUdOKSB7CisJCS8qIGNvbnZlcnQgc3VwcGxlbWVudCB0byBwb3NpdGl2ZSB2YWx1ZSAqLworCQlkYXRhID0gKEFEVDc1X1ZBTFVFX1NJR04gPDwgMSkgLSBkYXRhOworCQlzaWduID0gJy0nOworCX0KKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVjJWQuJS40ZFxuIiwgc2lnbiwKKwkJKGRhdGEgPj4gQURUNzVfVkFMVUVfRkxPQVRfT0ZGU0VUKSwKKwkJKGRhdGEgJiBBRFQ3NV9WQUxVRV9GTE9BVF9NQVNLKSAqIDYyNSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZHQ3NV9zZXRfdF9ib3VuZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQl1OCBib3VuZF9yZWcsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzVfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCWxvbmcgdG1wMSwgdG1wMjsKKwl1MTYgZGF0YTsKKwljaGFyICpwb3M7CisJaW50IHJldDsKKworCXBvcyA9IHN0cmNocihidWYsICcuJyk7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ0bXAxKTsKKworCWlmIChyZXQgfHwgdG1wMSA+IDEyNyB8fCB0bXAxIDwgLTEyOCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocG9zKSB7CisJCWxlbiA9IHN0cmxlbihwb3MpOworCQlpZiAobGVuID4gQURUNzVfVkFMVUVfRkxPQVRfT0ZGU0VUKQorCQkJbGVuID0gQURUNzVfVkFMVUVfRkxPQVRfT0ZGU0VUOworCQlwb3NbbGVuXSA9IDA7CisJCXJldCA9IHN0cmljdF9zdHJ0b2wocG9zLCAxMCwgJnRtcDIpOworCisJCWlmICghcmV0KQorCQkJdG1wMiA9ICh0bXAyIC8gNjI1KSAqIDYyNTsKKwl9CisKKwlpZiAodG1wMSA8IDApCisJCWRhdGEgPSAodTE2KSgtdG1wMSk7CisJZWxzZQorCQlkYXRhID0gKHUxNil0bXAxOworCWRhdGEgPSAoZGF0YSA8PCBBRFQ3NV9WQUxVRV9GTE9BVF9PRkZTRVQpIHwgKHRtcDIgJiBBRFQ3NV9WQUxVRV9GTE9BVF9NQVNLKTsKKwlpZiAodG1wMSA8IDApCisJCS8qIGNvbnZlcnQgcG9zaXRpdmUgdmFsdWUgdG8gc3VwcGx5bWVudCAqLworCQlkYXRhID0gKEFEVDc1X1ZBTFVFX1NJR04gPDwgMSkgLSBkYXRhOworCWRhdGEgPDw9IEFEVDc1X1ZBTFVFX09GRlNFVDsKKwlkYXRhID0gc3dhYjE2KGRhdGEpOworCisJcmV0ID0gYWR0NzVfaTJjX3dyaXRlKGNoaXAsIGJvdW5kX3JlZywgKHU4KWRhdGEpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzVfc2hvd190X29zKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gYWR0NzVfc2hvd190X2JvdW5kKGRldiwgYXR0ciwKKwkJCUFEVDc1X1RfT1MsIGJ1Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZHQ3NV9zZXRfdF9vcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJcmV0dXJuIGFkdDc1X3NldF90X2JvdW5kKGRldiwgYXR0ciwKKwkJCUFEVDc1X1RfT1MsIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzVfc2hvd190X2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXJldHVybiBhZHQ3NV9zaG93X3RfYm91bmQoZGV2LCBhdHRyLAorCQkJQURUNzVfVF9IWVNULCBidWYpOworfQorCitzdGF0aWMgaW5saW5lIHNzaXplX3QgYWR0NzVfc2V0X3RfaHlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJcmV0dXJuIGFkdDc1X3NldF90X2JvdW5kKGRldiwgYXR0ciwKKwkJCUFEVDc1X1RfSFlTVCwgYnVmLCBsZW4pOworfQorCitJSU9fRVZFTlRfQVRUUl9TSChvdGlfbW9kZSwgaWlvX2V2ZW50X2FkdDc1LAorCQlhZHQ3NV9zaG93X290aV9tb2RlLCBhZHQ3NV9zZXRfb3RpX21vZGUsIDApOworSUlPX0VWRU5UX0FUVFJfU0goYXZhaWxhYmxlX290aV9tb2RlcywgaWlvX2V2ZW50X2FkdDc1LAorCQlhZHQ3NV9zaG93X2F2YWlsYWJsZV9vdGlfbW9kZXMsIE5VTEwsIDApOworSUlPX0VWRU5UX0FUVFJfU0goc21idXNfYWxhcnQsIGlpb19ldmVudF9hZHQ3NSwKKwkJYWR0NzVfc2hvd19zbWJ1c19hbGFydCwgYWR0NzVfc2V0X3NtYnVzX2FsYXJ0LCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKGZhdWx0X3F1ZXVlLCBpaW9fZXZlbnRfYWR0NzUsCisJCWFkdDc1X3Nob3dfZmF1bHRfcXVldWUsIGFkdDc1X3NldF9mYXVsdF9xdWV1ZSwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSCh0X29zLCBpaW9fZXZlbnRfYWR0NzUsCisJCWFkdDc1X3Nob3dfdF9vcywgYWR0NzVfc2V0X3Rfb3MsIDApOworSUlPX0VWRU5UX0FUVFJfU0godF9oeXN0LCBpaW9fZXZlbnRfYWR0NzUsCisJCWFkdDc1X3Nob3dfdF9oeXN0LCBhZHQ3NV9zZXRfdF9oeXN0LCAwKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkdDc1X2V2ZW50X2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2V2ZW50X2F0dHJfb3RpX21vZGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfYXZhaWxhYmxlX290aV9tb2Rlcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl9zbWJ1c19hbGFydC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl9mYXVsdF9xdWV1ZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl90X29zLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX3RfaHlzdC5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZHQ3NV9ldmVudF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWR0NzVfZXZlbnRfYXR0cmlidXRlcywKK307CisKKy8qCisgKiBkZXZpY2UgcHJvYmUgYW5kIHJlbW92ZQorICovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkdDc1X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgYWR0NzVfY2hpcF9pbmZvICpjaGlwOworCWludCByZXQgPSAwOworCisJY2hpcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhZHQ3NV9jaGlwX2luZm8pLCBHRlBfS0VSTkVMKTsKKworCWlmIChjaGlwID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogdGhpcyBpcyBvbmx5IHVzZWQgZm9yIGRldmljZSByZW1vdmFsIHB1cnBvc2VzICovCisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgY2hpcCk7CisKKwljaGlwLT5jbGllbnQgPSBjbGllbnQ7CisJY2hpcC0+bmFtZSA9IGlkLT5uYW1lOworCisJY2hpcC0+aW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChjaGlwLT5pbmRpb19kZXYgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfY2hpcDsKKwl9CisKKwljaGlwLT5pbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmY2xpZW50LT5kZXY7CisJY2hpcC0+aW5kaW9fZGV2LT5hdHRycyA9ICZhZHQ3NV9hdHRyaWJ1dGVfZ3JvdXA7CisJY2hpcC0+aW5kaW9fZGV2LT5ldmVudF9hdHRycyA9ICZhZHQ3NV9ldmVudF9hdHRyaWJ1dGVfZ3JvdXA7CisJY2hpcC0+aW5kaW9fZGV2LT5kZXZfZGF0YSA9ICh2b2lkICopY2hpcDsKKwljaGlwLT5pbmRpb19kZXYtPmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRTsKKwljaGlwLT5pbmRpb19kZXYtPm51bV9pbnRlcnJ1cHRfbGluZXMgPSAxOworCWNoaXAtPmluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoY2hpcC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2OworCisJaWYgKGNsaWVudC0+aXJxID4gMCkgeworCQlyZXQgPSBpaW9fcmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoY2xpZW50LT5pcnEsCisJCQkJY2hpcC0+aW5kaW9fZGV2LAorCQkJCTAsCisJCQkJSVJRRl9UUklHR0VSX0xPVywKKwkJCQljaGlwLT5uYW1lKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfdW5yZWdfZGV2OworCisJCS8qCisJCSAqIFRoZSBldmVudCBoYW5kbGVyIGxpc3QgZWxlbWVudCByZWZlciB0byBpaW9fZXZlbnRfYWR0NzUuCisJCSAqIEFsbCBldmVudCBhdHRyaWJ1dGVzIGJpbmQgdG8gdGhlIHNhbWUgZXZlbnQgaGFuZGxlci4KKwkJICogU28sIG9ubHkgcmVnaXN0ZXIgZXZlbnQgaGFuZGxlciBvbmNlLgorCQkgKi8KKwkJaWlvX2FkZF9ldmVudF90b19saXN0KCZpaW9fZXZlbnRfYWR0NzUsCisJCQkJJmNoaXAtPmluZGlvX2Rldi0+aW50ZXJydXB0c1swXS0+ZXZfbGlzdCk7CisKKwkJSU5JVF9XT1JLKCZjaGlwLT50aHJlc2hfd29yaywgYWR0NzVfaW50ZXJydXB0X2JoKTsKKworCQlyZXQgPSBhZHQ3NV9pMmNfcmVhZChjaGlwLCBBRFQ3NV9DT05GSUcsICZjaGlwLT5jb25maWcpOworCQlpZiAocmV0KSB7CisJCQlyZXQgPSAtRUlPOworCQkJZ290byBlcnJvcl91bnJlZ19pcnE7CisJCX0KKworCQkvKiBzZXQgaXJxIHBvbGFyaXR5IGxvdyBsZXZlbCAqLworCQljaGlwLT5jb25maWcgJj0gfkFEVDc1X09TX1BPTEFSSVRZOworCisJCXJldCA9IGFkdDc1X2kyY193cml0ZShjaGlwLCBBRFQ3NV9DT05GSUcsIGNoaXAtPmNvbmZpZyk7CisJCWlmIChyZXQpIHsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIGVycm9yX3VucmVnX2lycTsKKwkJfQorCX0KKworCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIiVzIHRlbXBlcmF0dXJlIHNlbnNvciByZWdpc3RlcmVkLlxuIiwKKwkJCSBpZC0+bmFtZSk7CisKKwlyZXR1cm4gMDsKK2Vycm9yX3VucmVnX2lycToKKwlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShjaGlwLT5pbmRpb19kZXYsIDApOworZXJyb3JfdW5yZWdfZGV2OgorCWlpb19kZXZpY2VfdW5yZWdpc3RlcihjaGlwLT5pbmRpb19kZXYpOworZXJyb3JfZnJlZV9kZXY6CisJaWlvX2ZyZWVfZGV2aWNlKGNoaXAtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX2NoaXA6CisJa2ZyZWUoY2hpcCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhZHQ3NV9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgYWR0NzVfY2hpcF9pbmZvICpjaGlwID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGNoaXAtPmluZGlvX2RldjsKKworCWlmIChjbGllbnQtPmlycSkKKwkJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoaW5kaW9fZGV2LCAwKTsKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpaW9fZnJlZV9kZXZpY2UoY2hpcC0+aW5kaW9fZGV2KTsKKwlrZnJlZShjaGlwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgYWR0NzVfaWRbXSA9IHsKKwl7ICJhZHQ3NSIsIDAgfSwKKwl7fQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGFkdDc1X2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGFkdDc1X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhZHQ3NSIsCisJfSwKKwkucHJvYmUgPSBhZHQ3NV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWR0NzVfcmVtb3ZlKSwKKwkuaWRfdGFibGUgPSBhZHQ3NV9pZCwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGFkdDc1X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmFkdDc1X2RyaXZlcik7Cit9CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBhZHQ3NV9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmFkdDc1X2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIlNvbmljIFpoYW5nIDxzb25pYy56aGFuZ0BhbmFsb2cuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBBRFQ3NSBkaWdpdGFsIgorCQkJIiB0ZW1wZXJhdHVyZSBzZW5zb3IgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CisKK21vZHVsZV9pbml0KGFkdDc1X2luaXQpOworbW9kdWxlX2V4aXQoYWR0NzVfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkZGFjL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkZGFjL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg0N2JhZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRkYWMvS2NvbmZpZwpAQCAtMCwwICsxLDI1IEBACisjCisjIEFEREFDIGRyaXZlcnMKKyMKK2NvbW1lbnQgIkFuYWxvZyBkaWdpdGFsIGJpLWRpcmVjdGlvbiBjb252ZXJ0b3JzIgorCitjb25maWcgQURUNzMxNgorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRFQ3MzE2LzcvOCBBRFQ3NTE2LzcvOSB0ZW1wZXJhdHVyZSBzZW5zb3IsIEFEQyBhbmQgREFDIGRyaXZlciIKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgQURUNzMxNiwgQURUNzMxNywgQURUNzMxOAorCSAgYW5kIEFEVDc1MTYsIEFEVDc1MTcsIEFEVDc1MTkgdGVtcGVyYXR1cmUgc2Vuc29ycywgQURDIGFuZCBEQUMuCisKK2NvbmZpZyBBRFQ3MzE2X1NQSQorCXRyaXN0YXRlICJzdXBwb3J0IFNQSSBidXMgY29ubmVjdGlvbiIKKwlkZXBlbmRzIG9uIFNQSSAmJiBBRFQ3MzE2CisJZGVmYXVsdCB5CisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIFNQSSBidXMgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgQURUNzMxNi83LzgKKwkgIGFuZCBBRFQ3NTE2LzcvOS4KKworY29uZmlnIEFEVDczMTZfSTJDCisJdHJpc3RhdGUgInN1cHBvcnQgSTJDIGJ1cyBjb25uZWN0aW9uIgorCWRlcGVuZHMgb24gSTJDICYmIEFEVDczMTYKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgSTJDIGJ1cyBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRFQ3MzE2LzcvOAorCSAgYW5kIEFEVDc1MTYvNy85LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGRhYy9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRkYWMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM3Njg2MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRkYWMvTWFrZWZpbGUKQEAgLTAsMCArMSw3IEBACisjCisjIE1ha2VmaWxlIGZvciBpbmR1c3RyaWFsIEkvTyBBRERBQyBkcml2ZXJzCisjCisKK29iai0kKENPTkZJR19BRFQ3MzE2KSArPSBhZHQ3MzE2Lm8KK29iai0kKENPTkZJR19BRFQ3MzE2X1NQSSkgKz0gYWR0NzMxNi1zcGkubworb2JqLSQoQ09ORklHX0FEVDczMTZfSTJDKSArPSBhZHQ3MzE2LWkyYy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkZGFjL2FkdDczMTYtaTJjLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkZGFjL2FkdDczMTYtaTJjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJkMWVhMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRkYWMvYWR0NzMxNi1pMmMuYwpAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIEkyQyBidXMgZHJpdmVyIGZvciBBRFQ3MzE2LzcvOCBBRFQ3NTE2LzcvOSBkaWdpdGFsIHRlbXBlcmF0dXJlCisgKiBzZW5zb3IsIEFEQyBhbmQgREFDCisgKgorICogQ29weXJpZ2h0IDIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlICJhZHQ3MzE2LmgiCisKKy8qCisgKiBhZHQ3MzE2IHJlZ2lzdGVyIGFjY2VzcyBieSBJMkMKKyAqLworc3RhdGljIGludCBhZHQ3MzE2X2kyY19yZWFkKHZvaWQgKmNsaWVudCwgdTggcmVnLCB1OCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2wgPSBjbGllbnQ7CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZShjbCwgcmVnKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZjbC0+ZGV2LCAiSTJDIGZhaWwgdG8gc2VsZWN0IHJlZ1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZShjbGllbnQpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmNsLT5kZXYsICJJMkMgcmVhZCBlcnJvclxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWR0NzMxNl9pMmNfd3JpdGUodm9pZCAqY2xpZW50LCB1OCByZWcsIHU4IGRhdGEpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsID0gY2xpZW50OworCWludCByZXQgPSAwOworCisJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbCwgcmVnLCBkYXRhKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycigmY2wtPmRldiwgIkkyQyB3cml0ZSBlcnJvclxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkdDczMTZfaTJjX211bHRpX3JlYWQodm9pZCAqY2xpZW50LCB1OCByZWcsIHU4IGNvdW50LCB1OCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2wgPSBjbGllbnQ7CisJaW50IGksIHJldCA9IDA7CisKKwlpZiAoY291bnQgPiBBRFQ3MzE2X1JFR19NQVhfQUREUikKKwkJY291bnQgPSBBRFQ3MzE2X1JFR19NQVhfQUREUjsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCXJldCA9IGFkdDczMTZfaTJjX3JlYWQoY2wsIHJlZywgJmRhdGFbaV0pOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycigmY2wtPmRldiwgIkkyQyBtdWx0aSByZWFkIGVycm9yXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZHQ3MzE2X2kyY19tdWx0aV93cml0ZSh2b2lkICpjbGllbnQsIHU4IHJlZywgdTggY291bnQsIHU4ICpkYXRhKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbCA9IGNsaWVudDsKKwlpbnQgaSwgcmV0ID0gMDsKKworCWlmIChjb3VudCA+IEFEVDczMTZfUkVHX01BWF9BRERSKQorCQljb3VudCA9IEFEVDczMTZfUkVHX01BWF9BRERSOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJcmV0ID0gYWR0NzMxNl9pMmNfd3JpdGUoY2wsIHJlZywgZGF0YVtpXSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKCZjbC0+ZGV2LCAiSTJDIG11bHRpIHdyaXRlIGVycm9yXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGRldmljZSBwcm9iZSBhbmQgcmVtb3ZlCisgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgYWR0NzMxNl9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBhZHQ3MzE2X2J1cyBidXMgPSB7CisJCS5jbGllbnQgPSBjbGllbnQsCisJCS5pcnEgPSBjbGllbnQtPmlycSwKKwkJLmlycV9mbGFncyA9IElSUUZfVFJJR0dFUl9MT1csCisJCS5yZWFkID0gYWR0NzMxNl9pMmNfcmVhZCwKKwkJLndyaXRlID0gYWR0NzMxNl9pMmNfd3JpdGUsCisJCS5tdWx0aV9yZWFkID0gYWR0NzMxNl9pMmNfbXVsdGlfcmVhZCwKKwkJLm11bHRpX3dyaXRlID0gYWR0NzMxNl9pMmNfbXVsdGlfd3JpdGUsCisJfTsKKworCXJldHVybiBhZHQ3MzE2X3Byb2JlKCZjbGllbnQtPmRldiwgJmJ1cywgaWQtPm5hbWUpOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhZHQ3MzE2X2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlyZXR1cm4gYWR0NzMxNl9yZW1vdmUoJmNsaWVudC0+ZGV2KTs7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBhZHQ3MzE2X2kyY19pZFtdID0geworCXsgImFkdDczMTYiLCAwIH0sCisJeyAiYWR0NzMxNyIsIDAgfSwKKwl7ICJhZHQ3MzE4IiwgMCB9LAorCXsgImFkdDc1MTYiLCAwIH0sCisJeyAiYWR0NzUxNyIsIDAgfSwKKwl7ICJhZHQ3NTE5IiwgMCB9LAorCXsgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGFkdDczMTZfaTJjX2lkKTsKKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBhZHQ3MzE2X2kyY19zdXNwZW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHBtX21lc3NhZ2VfdCBtZXNzYWdlKQoreworCXJldHVybiBhZHQ3MzE2X2Rpc2FibGUoJmNsaWVudC0+ZGV2KTsKK30KKworc3RhdGljIGludCBhZHQ3MzE2X2kyY19yZXN1bWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlyZXR1cm4gYWR0NzMxNl9lbmFibGUoJmNsaWVudC0+ZGV2KTsKK30KKyNlbHNlCisjIGRlZmluZSBhZHQ3MzE2X2kyY19zdXNwZW5kIE5VTEwKKyMgZGVmaW5lIGFkdDczMTZfaTJjX3Jlc3VtZSAgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBhZHQ3MzE2X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhZHQ3MzE2IiwKKwkJLm93bmVyICA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gYWR0NzMxNl9pMmNfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFkdDczMTZfaTJjX3JlbW92ZSksCisJLnN1c3BlbmQgPSBhZHQ3MzE2X2kyY19zdXNwZW5kLAorCS5yZXN1bWUgPSBhZHQ3MzE2X2kyY19yZXN1bWUsCisJLmlkX3RhYmxlID0gYWR0NzMxNl9pMmNfaWQsCit9OworCitzdGF0aWMgX19pbml0IGludCBhZHQ3MzE2X2kyY19pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZhZHQ3MzE2X2RyaXZlcik7Cit9CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBhZHQ3MzE2X2kyY19leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmFkdDczMTZfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiU29uaWMgWmhhbmcgPHNvbmljLnpoYW5nQGFuYWxvZy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkkyQyBidXMgZHJpdmVyIGZvciBBbmFsb2cgRGV2aWNlcyBBRFQ3MzE2LzcvOSBhbmQiCisJCQkiQURUNzUxNi83LzggZGlnaXRhbCB0ZW1wZXJhdHVyZSBzZW5zb3IsIEFEQyBhbmQgREFDIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CisKK21vZHVsZV9pbml0KGFkdDczMTZfaTJjX2luaXQpOworbW9kdWxlX2V4aXQoYWR0NzMxNl9pMmNfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkZGFjL2FkdDczMTYtc3BpLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkZGFjL2FkdDczMTYtc3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY5ZDRkMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRkYWMvYWR0NzMxNi1zcGkuYwpAQCAtMCwwICsxLDE4MCBAQAorLyoKKyAqIEFQSSBidXMgZHJpdmVyIGZvciBBRFQ3MzE2LzcvOCBBRFQ3NTE2LzcvOSBkaWdpdGFsIHRlbXBlcmF0dXJlCisgKiBzZW5zb3IsIEFEQyBhbmQgREFDCisgKgorICogQ29weXJpZ2h0IDIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorCisjaW5jbHVkZSAiYWR0NzMxNi5oIgorCisjZGVmaW5lIEFEVDczMTZfU1BJX01BWF9GUkVRX0haCQk1MDAwMDAwCisjZGVmaW5lIEFEVDczMTZfU1BJX0NNRF9SRUFECQkweDkxCisjZGVmaW5lIEFEVDczMTZfU1BJX0NNRF9XUklURQkJMHg5MAorCisvKgorICogYWR0NzMxNiByZWdpc3RlciBhY2Nlc3MgYnkgU1BJCisgKi8KKworc3RhdGljIGludCBhZHQ3MzE2X3NwaV9tdWx0aV9yZWFkKHZvaWQgKmNsaWVudCwgdTggcmVnLCB1OCBjb3VudCwgdTggKmRhdGEpCit7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaV9kZXYgPSBjbGllbnQ7CisJdTggY21kWzJdOworCWludCByZXQgPSAwOworCisJaWYgKGNvdW50ID4gQURUNzMxNl9SRUdfTUFYX0FERFIpCisJCWNvdW50ID0gQURUNzMxNl9SRUdfTUFYX0FERFI7CisKKwljbWRbMF0gPSBBRFQ3MzE2X1NQSV9DTURfV1JJVEU7CisJY21kWzFdID0gcmVnOworCisJcmV0ID0gc3BpX3dyaXRlKHNwaV9kZXYsIGNtZCwgMik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycigmc3BpX2Rldi0+ZGV2LCAiU1BJIGZhaWwgdG8gc2VsZWN0IHJlZ1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJY21kWzBdID0gQURUNzMxNl9TUElfQ01EX1JFQUQ7CisKKwlyZXQgPSBzcGlfd3JpdGVfdGhlbl9yZWFkKHNwaV9kZXYsIGNtZCwgMSwgZGF0YSwgY291bnQpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnNwaV9kZXYtPmRldiwgIlNQSSByZWFkIGRhdGEgZXJyb3JcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkdDczMTZfc3BpX211bHRpX3dyaXRlKHZvaWQgKmNsaWVudCwgdTggcmVnLCB1OCBjb3VudCwgdTggKmRhdGEpCit7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaV9kZXYgPSBjbGllbnQ7CisJdTggYnVmW0FEVDczMTZfUkVHX01BWF9BRERSICsgMl07CisJaW50IGksIHJldCA9IDA7CisKKwlpZiAoY291bnQgPiBBRFQ3MzE2X1JFR19NQVhfQUREUikKKwkJY291bnQgPSBBRFQ3MzE2X1JFR19NQVhfQUREUjsKKworCWJ1ZlswXSA9IEFEVDczMTZfU1BJX0NNRF9XUklURTsKKwlidWZbMV0gPSByZWc7CisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCWJ1ZltpICsgMl0gPSBkYXRhW2ldOworCisJcmV0ID0gc3BpX3dyaXRlKHNwaV9kZXYsIGJ1ZiwgY291bnQgKyAyKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZzcGlfZGV2LT5kZXYsICJTUEkgd3JpdGUgZXJyb3JcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWR0NzMxNl9zcGlfcmVhZCh2b2lkICpjbGllbnQsIHU4IHJlZywgdTggKmRhdGEpCit7CisJcmV0dXJuIGFkdDczMTZfc3BpX211bHRpX3JlYWQoY2xpZW50LCByZWcsIDEsIGRhdGEpOworfQorCitzdGF0aWMgaW50IGFkdDczMTZfc3BpX3dyaXRlKHZvaWQgKmNsaWVudCwgdTggcmVnLCB1OCB2YWwpCit7CisJcmV0dXJuIGFkdDczMTZfc3BpX211bHRpX3dyaXRlKGNsaWVudCwgcmVnLCAxLCAmdmFsKTsKK30KKworLyoKKyAqIGRldmljZSBwcm9iZSBhbmQgcmVtb3ZlCisgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgYWR0NzMxNl9zcGlfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaV9kZXYpCit7CisJc3RydWN0IGFkdDczMTZfYnVzIGJ1cyA9IHsKKwkJLmNsaWVudCA9IHNwaV9kZXYsCisJCS5pcnEgPSBzcGlfZGV2LT5pcnEsCisJCS5pcnFfZmxhZ3MgPSBJUlFGX1RSSUdHRVJfTE9XLAorCQkucmVhZCA9IGFkdDczMTZfc3BpX3JlYWQsCisJCS53cml0ZSA9IGFkdDczMTZfc3BpX3dyaXRlLAorCQkubXVsdGlfcmVhZCA9IGFkdDczMTZfc3BpX211bHRpX3JlYWQsCisJCS5tdWx0aV93cml0ZSA9IGFkdDczMTZfc3BpX211bHRpX3dyaXRlLAorCX07CisKKwkvKiBkb24ndCBleGNlZWQgbWF4IHNwZWNpZmllZCBTUEkgQ0xLIGZyZXF1ZW5jeSAqLworCWlmIChzcGlfZGV2LT5tYXhfc3BlZWRfaHogPiBBRFQ3MzE2X1NQSV9NQVhfRlJFUV9IWikgeworCQlkZXZfZXJyKCZzcGlfZGV2LT5kZXYsICJTUEkgQ0xLICVkIEh6P1xuIiwKKwkJCXNwaV9kZXYtPm1heF9zcGVlZF9oeik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHN3aXRjaCBmcm9tIGRlZmF1bHQgSTJDIHByb3RvY29sIHRvIFNQSSBwcm90b2NvbCAqLworCWFkdDczMTZfc3BpX3dyaXRlKHNwaV9kZXYsIDAsIDApOworCWFkdDczMTZfc3BpX3dyaXRlKHNwaV9kZXYsIDAsIDApOworCWFkdDczMTZfc3BpX3dyaXRlKHNwaV9kZXYsIDAsIDApOworCisJcmV0dXJuIGFkdDczMTZfcHJvYmUoJnNwaV9kZXYtPmRldiwgJmJ1cywgc3BpX2Rldi0+bW9kYWxpYXMpOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhZHQ3MzE2X3NwaV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaV9kZXYpCit7CisJcmV0dXJuIGFkdDczMTZfcmVtb3ZlKCZzcGlfZGV2LT5kZXYpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNwaV9kZXZpY2VfaWQgYWR0NzMxNl9zcGlfaWRbXSA9IHsKKwl7ICJhZHQ3MzE2IiwgMCB9LAorCXsgImFkdDczMTciLCAwIH0sCisJeyAiYWR0NzMxOCIsIDAgfSwKKwl7ICJhZHQ3NTE2IiwgMCB9LAorCXsgImFkdDc1MTciLCAwIH0sCisJeyAiYWR0NzUxOSIsIDAgfSwKKwl7IH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoc3BpLCBhZHQ3MzE2X3NwaV9pZCk7CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgYWR0NzMxNl9zcGlfc3VzcGVuZChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCit7CisJcmV0dXJuIGFkdDczMTZfZGlzYWJsZSgmc3BpX2Rldi0+ZGV2KTsKK30KKworc3RhdGljIGludCBhZHQ3MzE2X3NwaV9yZXN1bWUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaV9kZXYpCit7CisJcmV0dXJuIGFkdDczMTZfZW5hYmxlKCZzcGlfZGV2LT5kZXYpOworfQorI2Vsc2UKKyMgZGVmaW5lIGFkdDczMTZfc3BpX3N1c3BlbmQgTlVMTAorIyBkZWZpbmUgYWR0NzMxNl9zcGlfcmVzdW1lICBOVUxMCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFkdDczMTZfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFkdDczMTYiLAorCQkuYnVzID0gJnNwaV9idXNfdHlwZSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhZHQ3MzE2X3NwaV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWR0NzMxNl9zcGlfcmVtb3ZlKSwKKwkuc3VzcGVuZCA9IGFkdDczMTZfc3BpX3N1c3BlbmQsCisJLnJlc3VtZSA9IGFkdDczMTZfc3BpX3Jlc3VtZSwKKwkuaWRfdGFibGUgPSBhZHQ3MzE2X3NwaV9pZCwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGFkdDczMTZfc3BpX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmYWR0NzMxNl9kcml2ZXIpOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgYWR0NzMxNl9zcGlfZXhpdCh2b2lkKQoreworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYWR0NzMxNl9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJTb25pYyBaaGFuZyA8c29uaWMuemhhbmdAYW5hbG9nLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU1BJIGJ1cyBkcml2ZXIgZm9yIEFuYWxvZyBEZXZpY2VzIEFEVDczMTYvNy84IGFuZCIKKwkJCSJBRFQ3NTE2LzcvOSBkaWdpdGFsIHRlbXBlcmF0dXJlIHNlbnNvciwgQURDIGFuZCBEQUMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKKworbW9kdWxlX2luaXQoYWR0NzMxNl9zcGlfaW5pdCk7Cittb2R1bGVfZXhpdChhZHQ3MzE2X3NwaV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRkYWMvYWR0NzMxNi5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGRhYy9hZHQ3MzE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFiNWIxMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRkYWMvYWR0NzMxNi5jCkBAIC0wLDAgKzEsMjQwMiBAQAorLyoKKyAqIEFEVDczMTYgZGlnaXRhbCB0ZW1wZXJhdHVyZSBzZW5zb3IgZHJpdmVyIHN1cHBvcnRpbmcgQURUNzMxNi83LzggQURUNzUxNi83LzkKKyAqCisgKgorICogQ29weXJpZ2h0IDIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisjaW5jbHVkZSAiYWR0NzMxNi5oIgorCisvKgorICogQURUNzMxNiByZWdpc3RlcnMgZGVmaW5pdGlvbgorICovCisjZGVmaW5lIEFEVDczMTZfSU5UX1NUQVQxCQkweDAKKyNkZWZpbmUgQURUNzMxNl9JTlRfU1RBVDIJCTB4MQorI2RlZmluZSBBRFQ3MzE2X0xTQl9JTl9URU1QX1ZERAkJMHgzCisjZGVmaW5lIEFEVDczMTZfTFNCX0lOX1RFTVBfTUFTSwkweDMKKyNkZWZpbmUgQURUNzMxNl9MU0JfVkREX01BU0sJCTB4QworI2RlZmluZSBBRFQ3MzE2X0xTQl9WRERfT0ZGU0VUCQkyCisjZGVmaW5lIEFEVDczMTZfTFNCX0VYX1RFTVBfQUlOCQkweDQKKyNkZWZpbmUgQURUNzMxNl9MU0JfRVhfVEVNUF9NQVNLCTB4MworI2RlZmluZSBBRFQ3NTE2X0xTQl9BSU5fU0hJRlQJCTIKKyNkZWZpbmUgQURUNzMxNl9BRF9NU0JfREFUQV9CQVNFICAgICAgICAweDYKKyNkZWZpbmUgQURUNzMxNl9BRF9NU0JfREFUQV9SRUdTICAgICAgICAzCisjZGVmaW5lIEFEVDc1MTZfQURfTVNCX0RBVEFfUkVHUyAgICAgICAgNgorI2RlZmluZSBBRFQ3MzE2X01TQl9WREQJCQkweDYKKyNkZWZpbmUgQURUNzMxNl9NU0JfSU5fVEVNUAkJMHg3CisjZGVmaW5lIEFEVDczMTZfTVNCX0VYX1RFTVAJCTB4OAorI2RlZmluZSBBRFQ3NTE2X01TQl9BSU4xCQkweDgKKyNkZWZpbmUgQURUNzUxNl9NU0JfQUlOMgkJMHg5CisjZGVmaW5lIEFEVDc1MTZfTVNCX0FJTjMJCTB4QQorI2RlZmluZSBBRFQ3NTE2X01TQl9BSU40CQkweEIKKyNkZWZpbmUgQURUNzMxNl9EQV9EQVRBX0JBU0UJCTB4MTAKKyNkZWZpbmUgQURUNzMxNl9EQV9NU0JfREFUQV9SRUdTCTQKKyNkZWZpbmUgQURUNzMxNl9MU0JfREFDX0EJCTB4MTAKKyNkZWZpbmUgQURUNzMxNl9NU0JfREFDX0EJCTB4MTEKKyNkZWZpbmUgQURUNzMxNl9MU0JfREFDX0IJCTB4MTIKKyNkZWZpbmUgQURUNzMxNl9NU0JfREFDX0IJCTB4MTMKKyNkZWZpbmUgQURUNzMxNl9MU0JfREFDX0MJCTB4MTQKKyNkZWZpbmUgQURUNzMxNl9NU0JfREFDX0MJCTB4MTUKKyNkZWZpbmUgQURUNzMxNl9MU0JfREFDX0QJCTB4MTYKKyNkZWZpbmUgQURUNzMxNl9NU0JfREFDX0QJCTB4MTcKKyNkZWZpbmUgQURUNzMxNl9DT05GSUcxCQkJMHgxOAorI2RlZmluZSBBRFQ3MzE2X0NPTkZJRzIJCQkweDE5CisjZGVmaW5lIEFEVDczMTZfQ09ORklHMwkJCTB4MUEKKyNkZWZpbmUgQURUNzMxNl9MREFDX0NPTkZJRwkJMHgxQgorI2RlZmluZSBBRFQ3MzE2X0RBQ19DT05GSUcJCTB4MUMKKyNkZWZpbmUgQURUNzMxNl9JTlRfTUFTSzEJCTB4MUQKKyNkZWZpbmUgQURUNzMxNl9JTlRfTUFTSzIJCTB4MUUKKyNkZWZpbmUgQURUNzMxNl9JTl9URU1QX09GRlNFVAkJMHgxRgorI2RlZmluZSBBRFQ3MzE2X0VYX1RFTVBfT0ZGU0VUCQkweDIwCisjZGVmaW5lIEFEVDczMTZfSU5fQU5BTE9HX1RFTVBfT0ZGU0VUCTB4MjEKKyNkZWZpbmUgQURUNzMxNl9FWF9BTkFMT0dfVEVNUF9PRkZTRVQJMHgyMgorI2RlZmluZSBBRFQ3MzE2X1ZERF9ISUdICQkweDIzCisjZGVmaW5lIEFEVDczMTZfVkREX0xPVwkJCTB4MjQKKyNkZWZpbmUgQURUNzMxNl9JTl9URU1QX0hJR0gJCTB4MjUKKyNkZWZpbmUgQURUNzMxNl9JTl9URU1QX0xPVwkJMHgyNgorI2RlZmluZSBBRFQ3MzE2X0VYX1RFTVBfSElHSAkJMHgyNworI2RlZmluZSBBRFQ3MzE2X0VYX1RFTVBfTE9XCQkweDI4CisjZGVmaW5lIEFEVDc1MTZfQUlOMl9ISUdICQkweDJCCisjZGVmaW5lIEFEVDc1MTZfQUlOMl9MT1cJCTB4MkMKKyNkZWZpbmUgQURUNzUxNl9BSU4zX0hJR0gJCTB4MkQKKyNkZWZpbmUgQURUNzUxNl9BSU4zX0xPVwkJMHgyRQorI2RlZmluZSBBRFQ3NTE2X0FJTjRfSElHSAkJMHgyRgorI2RlZmluZSBBRFQ3NTE2X0FJTjRfTE9XCQkweDMwCisjZGVmaW5lIEFEVDczMTZfREVWSUNFX0lECQkweDRECisjZGVmaW5lIEFEVDczMTZfTUFOVUZBQ1RVUkVfSUQJCTB4NEUKKyNkZWZpbmUgQURUNzMxNl9ERVZJQ0VfUkVWCQkweDRGCisjZGVmaW5lIEFEVDczMTZfU1BJX0xPQ0tfU1RBVAkJMHg3RgorCisvKgorICogQURUNzMxNiBjb25maWcxCisgKi8KKyNkZWZpbmUgQURUNzMxNl9FTgkJCTB4MQorI2RlZmluZSBBRFQ3NTE2X1NFTF9FWF9URU1QCQkweDQKKyNkZWZpbmUgQURUNzUxNl9TRUxfQUlOMV8yX0VYX1RFTVBfTUFTSwkweDYKKyNkZWZpbmUgQURUNzUxNl9TRUxfQUlOMwkJMHg4CisjZGVmaW5lIEFEVDczMTZfSU5UX0VOCQkJMHgyMAorI2RlZmluZSBBRFQ3MzE2X0lOVF9QT0xBUklUWQkJMHg0MAorI2RlZmluZSBBRFQ3MzE2X1BECQkJMHg4MAorCisvKgorICogQURUNzMxNiBjb25maWcyCisgKi8KKyNkZWZpbmUgQURUNzMxNl9BRF9TSU5HTEVfQ0hfTUFTSwkweDMKKyNkZWZpbmUgQURUNzUxNl9BRF9TSU5HTEVfQ0hfTUFTSwkweDcKKyNkZWZpbmUgQURUNzMxNl9BRF9TSU5HTEVfQ0hfVkRECTAKKyNkZWZpbmUgQURUNzMxNl9BRF9TSU5HTEVfQ0hfSU4JCTEKKyNkZWZpbmUgQURUNzMxNl9BRF9TSU5HTEVfQ0hfRVgJCTIKKyNkZWZpbmUgQURUNzUxNl9BRF9TSU5HTEVfQ0hfQUlOMQkyCisjZGVmaW5lIEFEVDc1MTZfQURfU0lOR0xFX0NIX0FJTjIJMworI2RlZmluZSBBRFQ3NTE2X0FEX1NJTkdMRV9DSF9BSU4zCTQKKyNkZWZpbmUgQURUNzUxNl9BRF9TSU5HTEVfQ0hfQUlONAk1CisjZGVmaW5lIEFEVDczMTZfQURfU0lOR0xFX0NIX01PREUJMHgxMAorI2RlZmluZSBBRFQ3MzE2X0RJU0FCTEVfQVZFUkFHSU5HCTB4MjAKKyNkZWZpbmUgQURUNzMxNl9FTl9TTUJVU19USU1FT1VUCTB4NDAKKyNkZWZpbmUgQURUNzMxNl9SRVNFVAkJCTB4ODAKKworLyoKKyAqIEFEVDczMTYgY29uZmlnMworICovCisjZGVmaW5lIEFEVDczMTZfQURDTEtfMjJfNQkJMHgxCisjZGVmaW5lIEFEVDczMTZfREFfSElHSF9SRVNPTFVUSU9OCTB4MgorI2RlZmluZSBBRFQ3MzE2X0RBX0VOX1ZJQV9EQUNfTERDQQkweDQKKyNkZWZpbmUgQURUNzUxNl9BSU5fSU5fVlJFRgkJMHgxMAorI2RlZmluZSBBRFQ3MzE2X0VOX0lOX1RFTVBfUFJPUF9EQUNBCTB4MjAKKyNkZWZpbmUgQURUNzMxNl9FTl9FWF9URU1QX1BST1BfREFDQgkweDQwCisKKy8qCisgKiBBRFQ3MzE2IERBQyBjb25maWcKKyAqLworI2RlZmluZSBBRFQ3MzE2X0RBXzJWUkVGX0NIX01BU0sJMHhGCisjZGVmaW5lIEFEVDczMTZfREFfRU5fTU9ERV9NQVNLCQkweDMwCisjZGVmaW5lIEFEVDczMTZfREFfRU5fTU9ERV9TSU5HTEUJMHgwMAorI2RlZmluZSBBRFQ3MzE2X0RBX0VOX01PREVfQUJfQ0QJMHgxMAorI2RlZmluZSBBRFQ3MzE2X0RBX0VOX01PREVfQUJDRAkJMHgyMAorI2RlZmluZSBBRFQ3MzE2X0RBX0VOX01PREVfTERBQwkJMHgzMAorI2RlZmluZSBBRFQ3MzE2X1ZSRUZfQllQQVNTX0RBQ19BQgkweDQwCisjZGVmaW5lIEFEVDczMTZfVlJFRl9CWVBBU1NfREFDX0NECTB4ODAKKworLyoKKyAqIEFEVDczMTYgTERBQyBjb25maWcKKyAqLworI2RlZmluZSBBRFQ3MzE2X0xEQUNfRU5fREFfTUFTSwkJMHhGCisjZGVmaW5lIEFEVDczMTZfREFDX0lOX1ZSRUYJCTB4MTAKKyNkZWZpbmUgQURUNzUxNl9EQUNfQUJfSU5fVlJFRgkJMHgxMAorI2RlZmluZSBBRFQ3NTE2X0RBQ19DRF9JTl9WUkVGCQkweDIwCisjZGVmaW5lIEFEVDc1MTZfREFDX0lOX1ZSRUZfT0ZGU0VUCTQKKyNkZWZpbmUgQURUNzUxNl9EQUNfSU5fVlJFRl9NQVNLCTB4MzAKKworLyoKKyAqIEFEVDczMTYgSU5UX01BU0syCisgKi8KKyNkZWZpbmUgQURUNzMxNl9JTlRfTUFTSzJfVkRECQkweDEwCisKKy8qCisgKiBBRFQ3MzE2IHZhbHVlIG1hc2tzCisgKi8KKyNkZWZpbmUgQURUNzMxNl9WQUxVRV9NQVNLCQkweGZmZgorI2RlZmluZSBBRFQ3MzE2X1RfVkFMVUVfU0lHTgkJMHg0MDAKKyNkZWZpbmUgQURUNzMxNl9UX1ZBTFVFX0ZMT0FUX09GRlNFVAkyCisjZGVmaW5lIEFEVDczMTZfVF9WQUxVRV9GTE9BVF9NQVNLCTB4MgorCisvKgorICogQ2hpcCBJRAorICovCisjZGVmaW5lIElEX0FEVDczMTYJCTB4MQorI2RlZmluZSBJRF9BRFQ3MzE3CQkweDIKKyNkZWZpbmUgSURfQURUNzMxOAkJMHgzCisjZGVmaW5lIElEX0FEVDc1MTYJCTB4MTEKKyNkZWZpbmUgSURfQURUNzUxNwkJMHgxMgorI2RlZmluZSBJRF9BRFQ3NTE5CQkweDE0CisKKyNkZWZpbmUgSURfRkFNSUxZX01BU0sJCTB4RjAKKyNkZWZpbmUgSURfQURUNzNYWAkJMHgwCisjZGVmaW5lIElEX0FEVDc1WFgJCTB4MTAKKworLyoKKyAqIHN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAtIGNoaXAgc3BlY2lmYyBpbmZvcm1hdGlvbgorICovCisKK3N0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyB7CisJY29uc3QgY2hhcgkJKm5hbWU7CisJc3RydWN0IGlpb19kZXYJCSppbmRpb19kZXY7CisJc3RydWN0IHdvcmtfc3RydWN0CXRocmVzaF93b3JrOworCXM2NAkJCWxhc3RfdGltZXN0YW1wOworCXN0cnVjdCBhZHQ3MzE2X2J1cwlidXM7CisJdTE2CQkJbGRhY19waW47CisJdTE2CQkJaW50X21hc2s7CS8qIDB4MmYgKi8KKwl1OAkJCWNvbmZpZzE7CisJdTgJCQljb25maWcyOworCXU4CQkJY29uZmlnMzsKKwl1OAkJCWRhY19jb25maWc7CS8qIERBQyBjb25maWcgKi8KKwl1OAkJCWxkYWNfY29uZmlnOwkvKiBMREFDIGNvbmZpZyAqLworCXU4CQkJZGFjX2JpdHM7CS8qIDgsIDEwLCAxMiAqLworCXU4CQkJaWQ7CQkvKiBjaGlwIGlkICovCit9OworCisvKgorICogTG9naWMgaW50ZXJydXB0IG1hc2sgZm9yIHVzZXIgYXBwbGljYXRpb24gdG8gZW5hYmxlCisgKiBpbnRlcnJ1cHRzLgorICovCisjZGVmaW5lIEFEVDczMTZfSU5fVEVNUF9ISUdIX0lOVF9NQVNLCTB4MQorI2RlZmluZSBBRFQ3MzE2X0lOX1RFTVBfTE9XX0lOVF9NQVNLCTB4MgorI2RlZmluZSBBRFQ3MzE2X0VYX1RFTVBfSElHSF9JTlRfTUFTSwkweDQKKyNkZWZpbmUgQURUNzMxNl9FWF9URU1QX0xPV19JTlRfTUFTSwkweDgKKyNkZWZpbmUgQURUNzMxNl9FWF9URU1QX0ZBVUxUX0lOVF9NQVNLCTB4MTAKKyNkZWZpbmUgQURUNzUxNl9BSU4xX0lOVF9NQVNLCQkweDQKKyNkZWZpbmUgQURUNzUxNl9BSU4yX0lOVF9NQVNLCQkweDIwCisjZGVmaW5lIEFEVDc1MTZfQUlOM19JTlRfTUFTSwkJMHg0MAorI2RlZmluZSBBRFQ3NTE2X0FJTjRfSU5UX01BU0sJCTB4ODAKKyNkZWZpbmUgQURUNzMxNl9WRERfSU5UX01BU0sJCTB4MTAwCisjZGVmaW5lIEFEVDczMTZfVEVNUF9JTlRfTUFTSwkJMHgxRgorI2RlZmluZSBBRFQ3NTE2X0FJTl9JTlRfTUFTSwkJMHhFMAorI2RlZmluZSBBRFQ3MzE2X1RFTVBfQUlOX0lOVF9NQVNLCVwKKwkoQURUNzMxNl9URU1QX0lOVF9NQVNLIHwgQURUNzMxNl9URU1QX0lOVF9NQVNLKQorCisvKgorICogc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvIC0gY2hpcCBzcGVjaWZjIGluZm9ybWF0aW9uCisgKi8KKworc3RydWN0IGFkdDczMTZfbGltaXRfcmVncyB7CisJdTE2CWRhdGFfaGlnaDsKKwl1MTYJZGF0YV9sb3c7Cit9OworCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3Nob3dfZW5hYmxlZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsICEhKGNoaXAtPmNvbmZpZzEgJiBBRFQ3MzE2X0VOKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IF9hZHQ3MzE2X3N0b3JlX2VuYWJsZWQoc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwLAorCQlpbnQgZW5hYmxlKQoreworCXU4IGNvbmZpZzE7CisJaW50IHJldDsKKworCWlmIChlbmFibGUpCisJCWNvbmZpZzEgPSBjaGlwLT5jb25maWcxIHwgQURUNzMxNl9FTjsKKwllbHNlCisJCWNvbmZpZzEgPSBjaGlwLT5jb25maWcxICYgfkFEVDczMTZfRU47CisKKwlyZXQgPSBjaGlwLT5idXMud3JpdGUoY2hpcC0+YnVzLmNsaWVudCwgQURUNzMxNl9DT05GSUcxLCBjb25maWcxKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNoaXAtPmNvbmZpZzEgPSBjb25maWcxOworCisJcmV0dXJuIHJldDsKKworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3N0b3JlX2VuYWJsZWQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwlpbnQgZW5hYmxlOworCisJaWYgKCFtZW1jbXAoYnVmLCAiMSIsIDEpKQorCQllbmFibGUgPSAxOworCWVsc2UKKwkJZW5hYmxlID0gMDsKKworCWlmIChfYWR0NzMxNl9zdG9yZV9lbmFibGVkKGNoaXAsIGVuYWJsZSkgPCAwKQorCQlyZXR1cm4gLUVJTzsKKwllbHNlCisJCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoZW5hYmxlZCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkdDczMTZfc2hvd19lbmFibGVkLAorCQlhZHQ3MzE2X3N0b3JlX2VuYWJsZWQsCisJCTApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3Nob3dfc2VsZWN0X2V4X3RlbXAoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCWlmICgoY2hpcC0+aWQgJiBJRF9GQU1JTFlfTUFTSykgIT0gSURfQURUNzVYWCkKKwkJcmV0dXJuIC1FUEVSTTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAhIShjaGlwLT5jb25maWcxICYgQURUNzUxNl9TRUxfRVhfVEVNUCkpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3N0b3JlX3NlbGVjdF9leF90ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTggY29uZmlnMTsKKwlpbnQgcmV0OworCisJaWYgKChjaGlwLT5pZCAmIElEX0ZBTUlMWV9NQVNLKSAhPSBJRF9BRFQ3NVhYKQorCQlyZXR1cm4gLUVQRVJNOworCisJY29uZmlnMSA9IGNoaXAtPmNvbmZpZzEgJiAofkFEVDc1MTZfU0VMX0VYX1RFTVApOworCWlmICghbWVtY21wKGJ1ZiwgIjEiLCAxKSkKKwkJY29uZmlnMSB8PSBBRFQ3NTE2X1NFTF9FWF9URU1QOworCisJcmV0ID0gY2hpcC0+YnVzLndyaXRlKGNoaXAtPmJ1cy5jbGllbnQsIEFEVDczMTZfQ09ORklHMSwgY29uZmlnMSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljaGlwLT5jb25maWcxID0gY29uZmlnMTsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoc2VsZWN0X2V4X3RlbXAsIFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZHQ3MzE2X3Nob3dfc2VsZWN0X2V4X3RlbXAsCisJCWFkdDczMTZfc3RvcmVfc2VsZWN0X2V4X3RlbXAsCisJCTApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3Nob3dfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJaWYgKGNoaXAtPmNvbmZpZzIgJiBBRFQ3MzE2X0FEX1NJTkdMRV9DSF9NT0RFKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICJzaW5nbGVfY2hhbm5lbFxuIik7CisJZWxzZQorCQlyZXR1cm4gc3ByaW50ZihidWYsICJyb3VuZF9yb2JpblxuIik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc3RvcmVfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXU4IGNvbmZpZzI7CisJaW50IHJldDsKKworCWNvbmZpZzIgPSBjaGlwLT5jb25maWcyICYgKH5BRFQ3MzE2X0FEX1NJTkdMRV9DSF9NT0RFKTsKKwlpZiAoIW1lbWNtcChidWYsICJzaW5nbGVfY2hhbm5lbCIsIDE0KSkKKwkJY29uZmlnMiB8PSBBRFQ3MzE2X0FEX1NJTkdMRV9DSF9NT0RFOworCisJcmV0ID0gY2hpcC0+YnVzLndyaXRlKGNoaXAtPmJ1cy5jbGllbnQsIEFEVDczMTZfQ09ORklHMiwgY29uZmlnMik7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljaGlwLT5jb25maWcyID0gY29uZmlnMjsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIobW9kZSwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkdDczMTZfc2hvd19tb2RlLAorCQlhZHQ3MzE2X3N0b3JlX21vZGUsCisJCTApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3Nob3dfYWxsX21vZGVzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICJzaW5nbGVfY2hhbm5lbFxucm91bmRfcm9iaW5cbiIpOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGFsbF9tb2RlcywgU19JUlVHTywgYWR0NzMxNl9zaG93X2FsbF9tb2RlcywgTlVMTCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19hZF9jaGFubmVsKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlpZiAoIShjaGlwLT5jb25maWcyICYgQURUNzMxNl9BRF9TSU5HTEVfQ0hfTU9ERSkpCisJCXJldHVybiAtRVBFUk07CisKKwlzd2l0Y2ggKGNoaXAtPmNvbmZpZzIgJiBBRFQ3NTE2X0FEX1NJTkdMRV9DSF9NQVNLKSB7CisJY2FzZSBBRFQ3MzE2X0FEX1NJTkdMRV9DSF9WREQ6CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjAgLSBWRERcbiIpOworCWNhc2UgQURUNzMxNl9BRF9TSU5HTEVfQ0hfSU46CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjEgLSBJbnRlcm5hbCBUZW1wZXJhdHVyZVxuIik7CisJY2FzZSBBRFQ3MzE2X0FEX1NJTkdMRV9DSF9FWDoKKwkJaWYgKCgoY2hpcC0+aWQgJiBJRF9GQU1JTFlfTUFTSykgPT0gSURfQURUNzVYWCkgJiYKKwkJCShjaGlwLT5jb25maWcxICYgQURUNzUxNl9TRUxfQUlOMV8yX0VYX1RFTVBfTUFTSykgPT0gMCkKKwkJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjIgLSBBSU4xXG4iKTsKKwkJZWxzZQorCQkJcmV0dXJuIHNwcmludGYoYnVmLCAiMiAtIEV4dGVybmFsIFRlbXBlcmF0dXJlXG4iKTsKKwljYXNlIEFEVDc1MTZfQURfU0lOR0xFX0NIX0FJTjI6CisJCWlmICgoY2hpcC0+Y29uZmlnMSAmIEFEVDc1MTZfU0VMX0FJTjFfMl9FWF9URU1QX01BU0spID09IDApCisJCQlyZXR1cm4gc3ByaW50ZihidWYsICIzIC0gQUlOMlxuIik7CisJCWVsc2UKKwkJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIk4vQVxuIik7CisJY2FzZSBBRFQ3NTE2X0FEX1NJTkdMRV9DSF9BSU4zOgorCQlpZiAoY2hpcC0+Y29uZmlnMSAmIEFEVDc1MTZfU0VMX0FJTjMpCisJCQlyZXR1cm4gc3ByaW50ZihidWYsICI0IC0gQUlOM1xuIik7CisJCWVsc2UKKwkJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIk4vQVxuIik7CisJY2FzZSBBRFQ3NTE2X0FEX1NJTkdMRV9DSF9BSU40OgorCQlyZXR1cm4gc3ByaW50ZihidWYsICI1IC0gQUlONFxuIik7CisJZGVmYXVsdDoKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiTi9BXG4iKTsKKwl9OworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3N0b3JlX2FkX2NoYW5uZWwoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1OCBjb25maWcyOworCXVuc2lnbmVkIGxvbmcgZGF0YSA9IDA7CisJaW50IHJldDsKKworCWlmICghKGNoaXAtPmNvbmZpZzIgJiBBRFQ3MzE2X0FEX1NJTkdMRV9DSF9NT0RFKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgoY2hpcC0+aWQgJiBJRF9GQU1JTFlfTUFTSykgPT0gSURfQURUNzVYWCkgeworCQlpZiAoZGF0YSA+IDUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQljb25maWcyID0gY2hpcC0+Y29uZmlnMiAmICh+QURUNzUxNl9BRF9TSU5HTEVfQ0hfTUFTSyk7CisJfSBlbHNlIHsKKwkJaWYgKGRhdGEgPiAyKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJY29uZmlnMiA9IGNoaXAtPmNvbmZpZzIgJiAofkFEVDczMTZfQURfU0lOR0xFX0NIX01BU0spOworCX0KKworCisJY29uZmlnMiB8PSBkYXRhOworCisJcmV0ID0gY2hpcC0+YnVzLndyaXRlKGNoaXAtPmJ1cy5jbGllbnQsIEFEVDczMTZfQ09ORklHMiwgY29uZmlnMik7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljaGlwLT5jb25maWcyID0gY29uZmlnMjsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoYWRfY2hhbm5lbCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkdDczMTZfc2hvd19hZF9jaGFubmVsLAorCQlhZHQ3MzE2X3N0b3JlX2FkX2NoYW5uZWwsCisJCTApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3Nob3dfYWxsX2FkX2NoYW5uZWxzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlpZiAoIShjaGlwLT5jb25maWcyICYgQURUNzMxNl9BRF9TSU5HTEVfQ0hfTU9ERSkpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAoKGNoaXAtPmlkICYgSURfRkFNSUxZX01BU0spID09IElEX0FEVDc1WFgpCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjAgLSBWRERcbjEgLSBJbnRlcm5hbCBUZW1wZXJhdHVyZVxuIgorCQkJCSIyIC0gRXh0ZXJuYWwgVGVtcGVyYXR1cmUgb3IgQUlOMlxuIgorCQkJCSIzIC0gQUlOMlxuNCAtIEFJTjNcbjUgLSBBSU40XG4iKTsKKwllbHNlCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjAgLSBWRERcbjEgLSBJbnRlcm5hbCBUZW1wZXJhdHVyZVxuIgorCQkJCSIyIC0gRXh0ZXJuYWwgVGVtcGVyYXR1cmVcbiIpOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGFsbF9hZF9jaGFubmVscywgU19JUlVHTywKKwkJYWR0NzMxNl9zaG93X2FsbF9hZF9jaGFubmVscywgTlVMTCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19kaXNhYmxlX2F2ZXJhZ2luZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsCisJCSEhKGNoaXAtPmNvbmZpZzIgJiBBRFQ3MzE2X0RJU0FCTEVfQVZFUkFHSU5HKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc3RvcmVfZGlzYWJsZV9hdmVyYWdpbmcoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1OCBjb25maWcyOworCWludCByZXQ7CisKKwljb25maWcyID0gY2hpcC0+Y29uZmlnMiAmICh+QURUNzMxNl9ESVNBQkxFX0FWRVJBR0lORyk7CisJaWYgKCFtZW1jbXAoYnVmLCAiMSIsIDEpKQorCQljb25maWcyIHw9IEFEVDczMTZfRElTQUJMRV9BVkVSQUdJTkc7CisKKwlyZXQgPSBjaGlwLT5idXMud3JpdGUoY2hpcC0+YnVzLmNsaWVudCwgQURUNzMxNl9DT05GSUcyLCBjb25maWcyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNoaXAtPmNvbmZpZzIgPSBjb25maWcyOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihkaXNhYmxlX2F2ZXJhZ2luZywgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkdDczMTZfc2hvd19kaXNhYmxlX2F2ZXJhZ2luZywKKwkJYWR0NzMxNl9zdG9yZV9kaXNhYmxlX2F2ZXJhZ2luZywKKwkJMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19lbmFibGVfc21idXNfdGltZW91dChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsCisJCSEhKGNoaXAtPmNvbmZpZzIgJiBBRFQ3MzE2X0VOX1NNQlVTX1RJTUVPVVQpKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zdG9yZV9lbmFibGVfc21idXNfdGltZW91dChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXU4IGNvbmZpZzI7CisJaW50IHJldDsKKworCWNvbmZpZzIgPSBjaGlwLT5jb25maWcyICYgKH5BRFQ3MzE2X0VOX1NNQlVTX1RJTUVPVVQpOworCWlmICghbWVtY21wKGJ1ZiwgIjEiLCAxKSkKKwkJY29uZmlnMiB8PSBBRFQ3MzE2X0VOX1NNQlVTX1RJTUVPVVQ7CisKKwlyZXQgPSBjaGlwLT5idXMud3JpdGUoY2hpcC0+YnVzLmNsaWVudCwgQURUNzMxNl9DT05GSUcyLCBjb25maWcyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNoaXAtPmNvbmZpZzIgPSBjb25maWcyOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihlbmFibGVfc21idXNfdGltZW91dCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkdDczMTZfc2hvd19lbmFibGVfc21idXNfdGltZW91dCwKKwkJYWR0NzMxNl9zdG9yZV9lbmFibGVfc21idXNfdGltZW91dCwKKwkJMCk7CisKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zdG9yZV9yZXNldChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXU4IGNvbmZpZzI7CisJaW50IHJldDsKKworCWNvbmZpZzIgPSBjaGlwLT5jb25maWcyIHwgQURUNzMxNl9SRVNFVDsKKworCXJldCA9IGNoaXAtPmJ1cy53cml0ZShjaGlwLT5idXMuY2xpZW50LCBBRFQ3MzE2X0NPTkZJRzIsIGNvbmZpZzIpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihyZXNldCwgU19JV1VTUiwKKwkJTlVMTCwKKwkJYWR0NzMxNl9zdG9yZV9yZXNldCwKKwkJMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19wb3dlcmRvd24oc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAhIShjaGlwLT5jb25maWcxICYgQURUNzMxNl9QRCkpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3N0b3JlX3Bvd2VyZG93bihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXU4IGNvbmZpZzE7CisJaW50IHJldDsKKworCWNvbmZpZzEgPSBjaGlwLT5jb25maWcxICYgKH5BRFQ3MzE2X1BEKTsKKwlpZiAoIW1lbWNtcChidWYsICIxIiwgMSkpCisJCWNvbmZpZzEgfD0gQURUNzMxNl9QRDsKKworCXJldCA9IGNoaXAtPmJ1cy53cml0ZShjaGlwLT5idXMuY2xpZW50LCBBRFQ3MzE2X0NPTkZJRzEsIGNvbmZpZzEpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+Y29uZmlnMSA9IGNvbmZpZzE7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKHBvd2VyZG93biwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkdDczMTZfc2hvd19wb3dlcmRvd24sCisJCWFkdDczMTZfc3RvcmVfcG93ZXJkb3duLAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X2Zhc3RfYWRfY2xvY2soc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAhIShjaGlwLT5jb25maWczICYgQURUNzMxNl9BRENMS18yMl81KSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc3RvcmVfZmFzdF9hZF9jbG9jayhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXU4IGNvbmZpZzM7CisJaW50IHJldDsKKworCWNvbmZpZzMgPSBjaGlwLT5jb25maWczICYgKH5BRFQ3MzE2X0FEQ0xLXzIyXzUpOworCWlmICghbWVtY21wKGJ1ZiwgIjEiLCAxKSkKKwkJY29uZmlnMyB8PSBBRFQ3MzE2X0FEQ0xLXzIyXzU7CisKKwlyZXQgPSBjaGlwLT5idXMud3JpdGUoY2hpcC0+YnVzLmNsaWVudCwgQURUNzMxNl9DT05GSUczLCBjb25maWczKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNoaXAtPmNvbmZpZzMgPSBjb25maWczOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihmYXN0X2FkX2Nsb2NrLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWR0NzMxNl9zaG93X2Zhc3RfYWRfY2xvY2ssCisJCWFkdDczMTZfc3RvcmVfZmFzdF9hZF9jbG9jaywKKwkJMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19kYV9oaWdoX3Jlc29sdXRpb24oc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCWlmIChjaGlwLT5jb25maWczICYgQURUNzMxNl9EQV9ISUdIX1JFU09MVVRJT04pIHsKKwkJaWYgKGNoaXAtPmlkID09IElEX0FEVDczMTYgfHwgY2hpcC0+aWQgPT0gSURfQURUNzUxNikKKwkJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjEgKDEyIGJpdHMpXG4iKTsKKwkJZWxzZSBpZiAoY2hpcC0+aWQgPT0gSURfQURUNzMxNyB8fCBjaGlwLT5pZCA9PSBJRF9BRFQ3NTE3KQorCQkJcmV0dXJuIHNwcmludGYoYnVmLCAiMSAoMTAgYml0cylcbiIpOworCX0KKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjAgKDggYml0cylcbiIpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3N0b3JlX2RhX2hpZ2hfcmVzb2x1dGlvbihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXU4IGNvbmZpZzM7CisJaW50IHJldDsKKworCWNoaXAtPmRhY19iaXRzID0gODsKKworCWlmICghbWVtY21wKGJ1ZiwgIjEiLCAxKSkgeworCQljb25maWczID0gY2hpcC0+Y29uZmlnMyB8IEFEVDczMTZfREFfSElHSF9SRVNPTFVUSU9OOworCQlpZiAoY2hpcC0+aWQgPT0gSURfQURUNzMxNiB8fCBjaGlwLT5pZCA9PSBJRF9BRFQ3NTE2KQorCQkJY2hpcC0+ZGFjX2JpdHMgPSAxMjsKKwkJZWxzZSBpZiAoY2hpcC0+aWQgPT0gSURfQURUNzMxNyB8fCBjaGlwLT5pZCA9PSBJRF9BRFQ3NTE3KQorCQkJY2hpcC0+ZGFjX2JpdHMgPSAxMDsKKwl9IGVsc2UKKwkJY29uZmlnMyA9IGNoaXAtPmNvbmZpZzMgJiAofkFEVDczMTZfREFfSElHSF9SRVNPTFVUSU9OKTsKKworCXJldCA9IGNoaXAtPmJ1cy53cml0ZShjaGlwLT5idXMuY2xpZW50LCBBRFQ3MzE2X0NPTkZJRzMsIGNvbmZpZzMpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+Y29uZmlnMyA9IGNvbmZpZzM7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGRhX2hpZ2hfcmVzb2x1dGlvbiwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkdDczMTZfc2hvd19kYV9oaWdoX3Jlc29sdXRpb24sCisJCWFkdDczMTZfc3RvcmVfZGFfaGlnaF9yZXNvbHV0aW9uLAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X0FJTl9pbnRlcm5hbF9WcmVmKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlpZiAoKGNoaXAtPmlkICYgSURfRkFNSUxZX01BU0spICE9IElEX0FEVDc1WFgpCisJCXJldHVybiAtRVBFUk07CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwKKwkJISEoY2hpcC0+Y29uZmlnMyAmIEFEVDc1MTZfQUlOX0lOX1ZSRUYpKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zdG9yZV9BSU5faW50ZXJuYWxfVnJlZihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXU4IGNvbmZpZzM7CisJaW50IHJldDsKKworCWlmICgoY2hpcC0+aWQgJiBJRF9GQU1JTFlfTUFTSykgIT0gSURfQURUNzVYWCkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmIChtZW1jbXAoYnVmLCAiMSIsIDEpKQorCQljb25maWczID0gY2hpcC0+Y29uZmlnMyAmICh+QURUNzUxNl9BSU5fSU5fVlJFRik7CisJZWxzZQorCQljb25maWczID0gY2hpcC0+Y29uZmlnMyB8IEFEVDc1MTZfQUlOX0lOX1ZSRUY7CisKKwlyZXQgPSBjaGlwLT5idXMud3JpdGUoY2hpcC0+YnVzLmNsaWVudCwgQURUNzMxNl9DT05GSUczLCBjb25maWczKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNoaXAtPmNvbmZpZzMgPSBjb25maWczOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihBSU5faW50ZXJuYWxfVnJlZiwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkdDczMTZfc2hvd19BSU5faW50ZXJuYWxfVnJlZiwKKwkJYWR0NzMxNl9zdG9yZV9BSU5faW50ZXJuYWxfVnJlZiwKKwkJMCk7CisKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X2VuYWJsZV9wcm9wX0RBQ0Eoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLAorCQkhIShjaGlwLT5jb25maWczICYgQURUNzMxNl9FTl9JTl9URU1QX1BST1BfREFDQSkpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3N0b3JlX2VuYWJsZV9wcm9wX0RBQ0Eoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1OCBjb25maWczOworCWludCByZXQ7CisKKwljb25maWczID0gY2hpcC0+Y29uZmlnMyAmICh+QURUNzMxNl9FTl9JTl9URU1QX1BST1BfREFDQSk7CisJaWYgKCFtZW1jbXAoYnVmLCAiMSIsIDEpKQorCQljb25maWczIHw9IEFEVDczMTZfRU5fSU5fVEVNUF9QUk9QX0RBQ0E7CisKKwlyZXQgPSBjaGlwLT5idXMud3JpdGUoY2hpcC0+YnVzLmNsaWVudCwgQURUNzMxNl9DT05GSUczLCBjb25maWczKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNoaXAtPmNvbmZpZzMgPSBjb25maWczOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihlbmFibGVfcHJvcG9ydGlvbl9EQUNBLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWR0NzMxNl9zaG93X2VuYWJsZV9wcm9wX0RBQ0EsCisJCWFkdDczMTZfc3RvcmVfZW5hYmxlX3Byb3BfREFDQSwKKwkJMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19lbmFibGVfcHJvcF9EQUNCKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwKKwkJISEoY2hpcC0+Y29uZmlnMyAmIEFEVDczMTZfRU5fRVhfVEVNUF9QUk9QX0RBQ0IpKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zdG9yZV9lbmFibGVfcHJvcF9EQUNCKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTggY29uZmlnMzsKKwlpbnQgcmV0OworCisJY29uZmlnMyA9IGNoaXAtPmNvbmZpZzMgJiAofkFEVDczMTZfRU5fRVhfVEVNUF9QUk9QX0RBQ0IpOworCWlmICghbWVtY21wKGJ1ZiwgIjEiLCAxKSkKKwkJY29uZmlnMyB8PSBBRFQ3MzE2X0VOX0VYX1RFTVBfUFJPUF9EQUNCOworCisJcmV0ID0gY2hpcC0+YnVzLndyaXRlKGNoaXAtPmJ1cy5jbGllbnQsIEFEVDczMTZfQ09ORklHMywgY29uZmlnMyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljaGlwLT5jb25maWczID0gY29uZmlnMzsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoZW5hYmxlX3Byb3BvcnRpb25fREFDQiwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkdDczMTZfc2hvd19lbmFibGVfcHJvcF9EQUNCLAorCQlhZHQ3MzE2X3N0b3JlX2VuYWJsZV9wcm9wX0RBQ0IsCisJCTApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3Nob3dfREFDXzJWcmVmX2NoX21hc2soc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JXhcbiIsCisJCWNoaXAtPmRhY19jb25maWcgJiBBRFQ3MzE2X0RBXzJWUkVGX0NIX01BU0spOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3N0b3JlX0RBQ18yVnJlZl9jaF9tYXNrKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTggZGFjX2NvbmZpZzsKKwl1bnNpZ25lZCBsb25nIGRhdGEgPSAwOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDE2LCAmZGF0YSk7CisJaWYgKHJldCB8fCBkYXRhID4gQURUNzMxNl9EQV8yVlJFRl9DSF9NQVNLKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRhY19jb25maWcgPSBjaGlwLT5kYWNfY29uZmlnICYgKH5BRFQ3MzE2X0RBXzJWUkVGX0NIX01BU0spOworCWRhY19jb25maWcgfD0gZGF0YTsKKworCXJldCA9IGNoaXAtPmJ1cy53cml0ZShjaGlwLT5idXMuY2xpZW50LCBBRFQ3MzE2X0RBQ19DT05GSUcsIGRhY19jb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+ZGFjX2NvbmZpZyA9IGRhY19jb25maWc7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKERBQ18yVnJlZl9jaGFubmVsc19tYXNrLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWR0NzMxNl9zaG93X0RBQ18yVnJlZl9jaF9tYXNrLAorCQlhZHQ3MzE2X3N0b3JlX0RBQ18yVnJlZl9jaF9tYXNrLAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X0RBQ191cGRhdGVfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJaWYgKCEoY2hpcC0+Y29uZmlnMyAmIEFEVDczMTZfREFfRU5fVklBX0RBQ19MRENBKSkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAibWFudWFsXG4iKTsKKwllbHNlIHsKKwkJc3dpdGNoIChjaGlwLT5kYWNfY29uZmlnICYgQURUNzMxNl9EQV9FTl9NT0RFX01BU0spIHsKKwkJY2FzZSBBRFQ3MzE2X0RBX0VOX01PREVfU0lOR0xFOgorCQkJcmV0dXJuIHNwcmludGYoYnVmLCAiMCAtIGF1dG8gYXQgYW55IE1TQiBEQUMgd3JpdGluZ1xuIik7CisJCWNhc2UgQURUNzMxNl9EQV9FTl9NT0RFX0FCX0NEOgorCQkJcmV0dXJuIHNwcmludGYoYnVmLCAiMSAtIGF1dG8gYXQgTVNCIERBQyBBQiBhbmQgQ0Qgd3JpdGluZ1xuIik7CisJCWNhc2UgQURUNzMxNl9EQV9FTl9NT0RFX0FCQ0Q6CisJCQlyZXR1cm4gc3ByaW50ZihidWYsICIyIC0gYXV0byBhdCBNU0IgREFDIEFCQ0Qgd3JpdGluZ1xuIik7CisJCWRlZmF1bHQ6IC8qIEFEVDczMTZfREFfRU5fTU9ERV9MREFDICovCisJCQlyZXR1cm4gc3ByaW50ZihidWYsICIzIC0gbWFudWFsXG4iKTsKKwkJfTsKKwl9Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc3RvcmVfREFDX3VwZGF0ZV9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTggZGFjX2NvbmZpZzsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJaW50IHJldDsKKworCWlmICghKGNoaXAtPmNvbmZpZzMgJiBBRFQ3MzE2X0RBX0VOX1ZJQV9EQUNfTERDQSkpCisJCXJldHVybiAtRVBFUk07CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7CisJaWYgKHJldCB8fCBkYXRhID4gQURUNzMxNl9EQV9FTl9NT0RFX01BU0spCisJCXJldHVybiAtRUlOVkFMOworCisJZGFjX2NvbmZpZyA9IGNoaXAtPmRhY19jb25maWcgJiAofkFEVDczMTZfREFfRU5fTU9ERV9NQVNLKTsKKwlkYWNfY29uZmlnIHw9IGRhdGE7CisKKwlyZXQgPSBjaGlwLT5idXMud3JpdGUoY2hpcC0+YnVzLmNsaWVudCwgQURUNzMxNl9EQUNfQ09ORklHLCBkYWNfY29uZmlnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNoaXAtPmRhY19jb25maWcgPSBkYWNfY29uZmlnOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihEQUNfdXBkYXRlX21vZGUsIFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZHQ3MzE2X3Nob3dfREFDX3VwZGF0ZV9tb2RlLAorCQlhZHQ3MzE2X3N0b3JlX0RBQ191cGRhdGVfbW9kZSwKKwkJMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19hbGxfREFDX3VwZGF0ZV9tb2RlcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJaWYgKGNoaXAtPmNvbmZpZzMgJiBBRFQ3MzE2X0RBX0VOX1ZJQV9EQUNfTERDQSkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiMCAtIGF1dG8gYXQgYW55IE1TQiBEQUMgd3JpdGluZ1xuIgorCQkJCSIxIC0gYXV0byBhdCBNU0IgREFDIEFCIGFuZCBDRCB3cml0aW5nXG4iCisJCQkJIjIgLSBhdXRvIGF0IE1TQiBEQUMgQUJDRCB3cml0aW5nXG4iCisJCQkJIjMgLSBtYW51YWxcbiIpOworCWVsc2UKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAibWFudWFsXG4iKTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihhbGxfREFDX3VwZGF0ZV9tb2RlcywgU19JUlVHTywKKwkJYWR0NzMxNl9zaG93X2FsbF9EQUNfdXBkYXRlX21vZGVzLCBOVUxMLCAwKTsKKworCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3N0b3JlX3VwZGF0ZV9EQUMoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1OCBsZGFjX2NvbmZpZzsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJaW50IHJldDsKKworCWlmIChjaGlwLT5jb25maWczICYgQURUNzMxNl9EQV9FTl9WSUFfREFDX0xEQ0EpIHsKKwkJaWYgKChjaGlwLT5kYWNfY29uZmlnICYgQURUNzMxNl9EQV9FTl9NT0RFX01BU0spICE9CisJCQlBRFQ3MzE2X0RBX0VOX01PREVfTERBQykKKwkJCXJldHVybiAtRVBFUk07CisKKwkJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxNiwgJmRhdGEpOworCQlpZiAocmV0IHx8IGRhdGEgPiBBRFQ3MzE2X0xEQUNfRU5fREFfTUFTSykKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWxkYWNfY29uZmlnID0gY2hpcC0+bGRhY19jb25maWcgJiAofkFEVDczMTZfTERBQ19FTl9EQV9NQVNLKTsKKwkJbGRhY19jb25maWcgfD0gZGF0YTsKKworCQlyZXQgPSBjaGlwLT5idXMud3JpdGUoY2hpcC0+YnVzLmNsaWVudCwgQURUNzMxNl9MREFDX0NPTkZJRywKKwkJCWxkYWNfY29uZmlnKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiAtRUlPOworCX0gZWxzZSB7CisJCWdwaW9fc2V0X3ZhbHVlKGNoaXAtPmxkYWNfcGluLCAwKTsKKwkJZ3Bpb19zZXRfdmFsdWUoY2hpcC0+bGRhY19waW4sIDEpOworCX0KKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIodXBkYXRlX0RBQywgU19JUlVHTyB8IFNfSVdVU1IsCisJCU5VTEwsCisJCWFkdDczMTZfc3RvcmVfdXBkYXRlX0RBQywKKwkJMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19EQV9BQl9WcmVmX2J5cGFzcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJaWYgKChjaGlwLT5pZCAmIElEX0ZBTUlMWV9NQVNLKSA9PSBJRF9BRFQ3NVhYKQorCQlyZXR1cm4gLUVQRVJNOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsCisJCSEhKGNoaXAtPmRhY19jb25maWcgJiBBRFQ3MzE2X1ZSRUZfQllQQVNTX0RBQ19BQikpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3N0b3JlX0RBX0FCX1ZyZWZfYnlwYXNzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTggZGFjX2NvbmZpZzsKKwlpbnQgcmV0OworCisJaWYgKChjaGlwLT5pZCAmIElEX0ZBTUlMWV9NQVNLKSA9PSBJRF9BRFQ3NVhYKQorCQlyZXR1cm4gLUVQRVJNOworCisJZGFjX2NvbmZpZyA9IGNoaXAtPmRhY19jb25maWcgJiAofkFEVDczMTZfVlJFRl9CWVBBU1NfREFDX0FCKTsKKwlpZiAoIW1lbWNtcChidWYsICIxIiwgMSkpCisJCWRhY19jb25maWcgfD0gQURUNzMxNl9WUkVGX0JZUEFTU19EQUNfQUI7CisKKwlyZXQgPSBjaGlwLT5idXMud3JpdGUoY2hpcC0+YnVzLmNsaWVudCwgQURUNzMxNl9EQUNfQ09ORklHLCBkYWNfY29uZmlnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNoaXAtPmRhY19jb25maWcgPSBkYWNfY29uZmlnOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihEQV9BQl9WcmVmX2J5cGFzcywgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkdDczMTZfc2hvd19EQV9BQl9WcmVmX2J5cGFzcywKKwkJYWR0NzMxNl9zdG9yZV9EQV9BQl9WcmVmX2J5cGFzcywKKwkJMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19EQV9DRF9WcmVmX2J5cGFzcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJaWYgKChjaGlwLT5pZCAmIElEX0ZBTUlMWV9NQVNLKSA9PSBJRF9BRFQ3NVhYKQorCQlyZXR1cm4gLUVQRVJNOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsCisJCSEhKGNoaXAtPmRhY19jb25maWcgJiBBRFQ3MzE2X1ZSRUZfQllQQVNTX0RBQ19DRCkpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3N0b3JlX0RBX0NEX1ZyZWZfYnlwYXNzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTggZGFjX2NvbmZpZzsKKwlpbnQgcmV0OworCisJaWYgKChjaGlwLT5pZCAmIElEX0ZBTUlMWV9NQVNLKSA9PSBJRF9BRFQ3NVhYKQorCQlyZXR1cm4gLUVQRVJNOworCisJZGFjX2NvbmZpZyA9IGNoaXAtPmRhY19jb25maWcgJiAofkFEVDczMTZfVlJFRl9CWVBBU1NfREFDX0NEKTsKKwlpZiAoIW1lbWNtcChidWYsICIxIiwgMSkpCisJCWRhY19jb25maWcgfD0gQURUNzMxNl9WUkVGX0JZUEFTU19EQUNfQ0Q7CisKKwlyZXQgPSBjaGlwLT5idXMud3JpdGUoY2hpcC0+YnVzLmNsaWVudCwgQURUNzMxNl9EQUNfQ09ORklHLCBkYWNfY29uZmlnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNoaXAtPmRhY19jb25maWcgPSBkYWNfY29uZmlnOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihEQV9DRF9WcmVmX2J5cGFzcywgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkdDczMTZfc2hvd19EQV9DRF9WcmVmX2J5cGFzcywKKwkJYWR0NzMxNl9zdG9yZV9EQV9DRF9WcmVmX2J5cGFzcywKKwkJMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19EQUNfaW50ZXJuYWxfVnJlZihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJaWYgKChjaGlwLT5pZCAmIElEX0ZBTUlMWV9NQVNLKSA9PSBJRF9BRFQ3NVhYKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIweCV4XG4iLAorCQkJKGNoaXAtPmRhY19jb25maWcgJiBBRFQ3NTE2X0RBQ19JTl9WUkVGX01BU0spID4+CisJCQlBRFQ3NTE2X0RBQ19JTl9WUkVGX09GRlNFVCk7CisJZWxzZQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwKKwkJCSEhKGNoaXAtPmRhY19jb25maWcgJiBBRFQ3MzE2X0RBQ19JTl9WUkVGKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc3RvcmVfREFDX2ludGVybmFsX1ZyZWYoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1OCBsZGFjX2NvbmZpZzsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJaW50IHJldDsKKworCWlmICgoY2hpcC0+aWQgJiBJRF9GQU1JTFlfTUFTSykgPT0gSURfQURUNzVYWCkgeworCQlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDE2LCAmZGF0YSk7CisJCWlmIChyZXQgfHwgZGF0YSA+IDMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlsZGFjX2NvbmZpZyA9IGNoaXAtPmxkYWNfY29uZmlnICYgKH5BRFQ3NTE2X0RBQ19JTl9WUkVGX01BU0spOworCQlpZiAoZGF0YSAmIDB4MSkKKwkJCWxkYWNfY29uZmlnIHw9IEFEVDc1MTZfREFDX0FCX0lOX1ZSRUY7CisJCWVsc2UgaWYgKGRhdGEgJiAweDIpCisJCQlsZGFjX2NvbmZpZyB8PSBBRFQ3NTE2X0RBQ19DRF9JTl9WUkVGOworCX0gZWxzZSB7CisJCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTYsICZkYXRhKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWxkYWNfY29uZmlnID0gY2hpcC0+bGRhY19jb25maWcgJiAofkFEVDczMTZfREFDX0lOX1ZSRUYpOworCQlpZiAoZGF0YSkKKwkJCWxkYWNfY29uZmlnID0gY2hpcC0+bGRhY19jb25maWcgfCBBRFQ3MzE2X0RBQ19JTl9WUkVGOworCX0KKworCXJldCA9IGNoaXAtPmJ1cy53cml0ZShjaGlwLT5idXMuY2xpZW50LCBBRFQ3MzE2X0xEQUNfQ09ORklHLCBsZGFjX2NvbmZpZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljaGlwLT5sZGFjX2NvbmZpZyA9IGxkYWNfY29uZmlnOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihEQUNfaW50ZXJuYWxfVnJlZiwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkdDczMTZfc2hvd19EQUNfaW50ZXJuYWxfVnJlZiwKKwkJYWR0NzMxNl9zdG9yZV9EQUNfaW50ZXJuYWxfVnJlZiwKKwkJMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19hZChzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAsCisJCWludCBjaGFubmVsLCBjaGFyICpidWYpCit7CisJdTE2IGRhdGE7CisJdTggbXNiLCBsc2I7CisJY2hhciBzaWduID0gJyAnOworCWludCByZXQ7CisKKwlpZiAoKGNoaXAtPmNvbmZpZzIgJiBBRFQ3MzE2X0FEX1NJTkdMRV9DSF9NT0RFKSAmJgorCQljaGFubmVsICE9IChjaGlwLT5jb25maWcyICYgQURUNzUxNl9BRF9TSU5HTEVfQ0hfTUFTSykpCisJCXJldHVybiAtRVBFUk07CisKKwlzd2l0Y2ggKGNoYW5uZWwpIHsKKwljYXNlIEFEVDczMTZfQURfU0lOR0xFX0NIX0lOOgorCQlyZXQgPSBjaGlwLT5idXMucmVhZChjaGlwLT5idXMuY2xpZW50LAorCQkJQURUNzMxNl9MU0JfSU5fVEVNUF9WREQsICZsc2IpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIC1FSU87CisKKwkJcmV0ID0gY2hpcC0+YnVzLnJlYWQoY2hpcC0+YnVzLmNsaWVudCwKKwkJCUFEVDczMTZfQURfTVNCX0RBVEFfQkFTRSArIGNoYW5uZWwsICZtc2IpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIC1FSU87CisKKwkJZGF0YSA9IG1zYiA8PCBBRFQ3MzE2X1RfVkFMVUVfRkxPQVRfT0ZGU0VUOworCQlkYXRhIHw9IGxzYiAmIEFEVDczMTZfTFNCX0lOX1RFTVBfTUFTSzsKKwkJYnJlYWs7CisJY2FzZSBBRFQ3MzE2X0FEX1NJTkdMRV9DSF9WREQ6CisJCXJldCA9IGNoaXAtPmJ1cy5yZWFkKGNoaXAtPmJ1cy5jbGllbnQsCisJCQlBRFQ3MzE2X0xTQl9JTl9URU1QX1ZERCwgJmxzYik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gLUVJTzsKKworCQlyZXQgPSBjaGlwLT5idXMucmVhZChjaGlwLT5idXMuY2xpZW50LAorCisJCQlBRFQ3MzE2X0FEX01TQl9EQVRBX0JBU0UgKyBjaGFubmVsLCAmbXNiKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiAtRUlPOworCisJCWRhdGEgPSBtc2IgPDwgQURUNzMxNl9UX1ZBTFVFX0ZMT0FUX09GRlNFVDsKKwkJZGF0YSB8PSAobHNiICYgQURUNzMxNl9MU0JfVkREX01BU0spID4+IEFEVDczMTZfTFNCX1ZERF9PRkZTRVQ7CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhKTsKKwlkZWZhdWx0OiAvKiBleF90ZW1wIGFuZCBhaW4gKi8KKwkJcmV0ID0gY2hpcC0+YnVzLnJlYWQoY2hpcC0+YnVzLmNsaWVudCwKKwkJCUFEVDczMTZfTFNCX0VYX1RFTVBfQUlOLCAmbHNiKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiAtRUlPOworCisJCXJldCA9IGNoaXAtPmJ1cy5yZWFkKGNoaXAtPmJ1cy5jbGllbnQsCisJCQlBRFQ3MzE2X0FEX01TQl9EQVRBX0JBU0UgKyBjaGFubmVsLCAmbXNiKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiAtRUlPOworCisJCWRhdGEgPSBtc2IgPDwgQURUNzMxNl9UX1ZBTFVFX0ZMT0FUX09GRlNFVDsKKwkJZGF0YSB8PSBsc2IgJiAoQURUNzMxNl9MU0JfRVhfVEVNUF9NQVNLIDw8CisJCQkoQURUNzUxNl9MU0JfQUlOX1NISUZUICogKGNoYW5uZWwgLQorCQkJKEFEVDczMTZfTVNCX0VYX1RFTVAgLSBBRFQ3MzE2X0FEX01TQl9EQVRBX0JBU0UpKSkpOworCisJCWlmICgoY2hpcC0+aWQgJiBJRF9GQU1JTFlfTUFTSykgPT0gSURfQURUNzVYWCkKKwkJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhKTsKKwkJZWxzZQorCQkJYnJlYWs7CisJfTsKKworCWlmIChkYXRhICYgQURUNzMxNl9UX1ZBTFVFX1NJR04pIHsKKwkJLyogY29udmVydCBzdXBwbGVtZW50IHRvIHBvc2l0aXZlIHZhbHVlICovCisJCWRhdGEgPSAoQURUNzMxNl9UX1ZBTFVFX1NJR04gPDwgMSkgLSBkYXRhOworCQlzaWduID0gJy0nOworCX0KKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVjJWQuJS4yZFxuIiwgc2lnbiwKKwkJKGRhdGEgPj4gQURUNzMxNl9UX1ZBTFVFX0ZMT0FUX09GRlNFVCksCisJCShkYXRhICYgQURUNzMxNl9UX1ZBTFVFX0ZMT0FUX01BU0spICogMjUpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3Nob3dfVkREKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gYWR0NzMxNl9zaG93X2FkKGNoaXAsIEFEVDczMTZfQURfU0lOR0xFX0NIX1ZERCwgYnVmKTsKK30KK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoVkRELCBTX0lSVUdPLCBhZHQ3MzE2X3Nob3dfVkRELCBOVUxMLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X2luX3RlbXAoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBhZHQ3MzE2X3Nob3dfYWQoY2hpcCwgQURUNzMxNl9BRF9TSU5HTEVfQ0hfSU4sIGJ1Zik7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoaW5fdGVtcCwgU19JUlVHTywgYWR0NzMxNl9zaG93X2luX3RlbXAsIE5VTEwsIDApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3Nob3dfZXhfdGVtcF9BSU4xKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gYWR0NzMxNl9zaG93X2FkKGNoaXAsIEFEVDczMTZfQURfU0lOR0xFX0NIX0VYLCBidWYpOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGV4X3RlbXBfQUlOMSwgU19JUlVHTywgYWR0NzMxNl9zaG93X2V4X3RlbXBfQUlOMSwgTlVMTCwgMCk7CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGV4X3RlbXAsIFNfSVJVR08sIGFkdDczMTZfc2hvd19leF90ZW1wX0FJTjEsIE5VTEwsIDApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3Nob3dfQUlOMihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIGFkdDczMTZfc2hvd19hZChjaGlwLCBBRFQ3NTE2X0FEX1NJTkdMRV9DSF9BSU4yLCBidWYpOworfQorc3RhdGljIElJT19ERVZJQ0VfQVRUUihBSU4yLCBTX0lSVUdPLCBhZHQ3MzE2X3Nob3dfQUlOMiwgTlVMTCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19BSU4zKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gYWR0NzMxNl9zaG93X2FkKGNoaXAsIEFEVDc1MTZfQURfU0lOR0xFX0NIX0FJTjMsIGJ1Zik7Cit9CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKEFJTjMsIFNfSVJVR08sIGFkdDczMTZfc2hvd19BSU4zLCBOVUxMLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X0FJTjQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBhZHQ3MzE2X3Nob3dfYWQoY2hpcCwgQURUNzUxNl9BRF9TSU5HTEVfQ0hfQUlONCwgYnVmKTsKK30KK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoQUlONCwgU19JUlVHTywgYWR0NzMxNl9zaG93X0FJTjQsIE5VTEwsIDApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3Nob3dfdGVtcF9vZmZzZXQoc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwLAorCQlpbnQgb2Zmc2V0X2FkZHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgZGF0YTsKKwl1OCB2YWw7CisJaW50IHJldDsKKworCXJldCA9IGNoaXAtPmJ1cy5yZWFkKGNoaXAtPmJ1cy5jbGllbnQsIG9mZnNldF9hZGRyLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWRhdGEgPSAoaW50KXZhbDsKKwlpZiAodmFsICYgMHg4MCkKKwkJZGF0YSAtPSAyNTY7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGF0YSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc3RvcmVfdGVtcF9vZmZzZXQoc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwLAorCQlpbnQgb2Zmc2V0X2FkZHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlsb25nIGRhdGE7CisJdTggdmFsOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZkYXRhKTsKKwlpZiAocmV0IHx8IGRhdGEgPiAxMjcgfHwgZGF0YSA8IC0xMjgpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGRhdGEgPCAwKQorCQlkYXRhICs9IDI1NjsKKworCXZhbCA9ICh1OClkYXRhOworCisJcmV0ID0gY2hpcC0+YnVzLndyaXRlKGNoaXAtPmJ1cy5jbGllbnQsIG9mZnNldF9hZGRyLCB2YWwpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X2luX3RlbXBfb2Zmc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gYWR0NzMxNl9zaG93X3RlbXBfb2Zmc2V0KGNoaXAsIEFEVDczMTZfSU5fVEVNUF9PRkZTRVQsIGJ1Zik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc3RvcmVfaW5fdGVtcF9vZmZzZXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBhZHQ3MzE2X3N0b3JlX3RlbXBfb2Zmc2V0KGNoaXAsIEFEVDczMTZfSU5fVEVNUF9PRkZTRVQsIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihpbl90ZW1wX29mZnNldCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkdDczMTZfc2hvd19pbl90ZW1wX29mZnNldCwKKwkJYWR0NzMxNl9zdG9yZV9pbl90ZW1wX29mZnNldCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19leF90ZW1wX29mZnNldChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIGFkdDczMTZfc2hvd190ZW1wX29mZnNldChjaGlwLCBBRFQ3MzE2X0VYX1RFTVBfT0ZGU0VULCBidWYpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3N0b3JlX2V4X3RlbXBfb2Zmc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gYWR0NzMxNl9zdG9yZV90ZW1wX29mZnNldChjaGlwLCBBRFQ3MzE2X0VYX1RFTVBfT0ZGU0VULCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoZXhfdGVtcF9vZmZzZXQsIFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZHQ3MzE2X3Nob3dfZXhfdGVtcF9vZmZzZXQsCisJCWFkdDczMTZfc3RvcmVfZXhfdGVtcF9vZmZzZXQsIDApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3Nob3dfaW5fYW5hbG9nX3RlbXBfb2Zmc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gYWR0NzMxNl9zaG93X3RlbXBfb2Zmc2V0KGNoaXAsCisJCQlBRFQ3MzE2X0lOX0FOQUxPR19URU1QX09GRlNFVCwgYnVmKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zdG9yZV9pbl9hbmFsb2dfdGVtcF9vZmZzZXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBhZHQ3MzE2X3N0b3JlX3RlbXBfb2Zmc2V0KGNoaXAsCisJCQlBRFQ3MzE2X0lOX0FOQUxPR19URU1QX09GRlNFVCwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGluX2FuYWxvZ190ZW1wX29mZnNldCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkdDczMTZfc2hvd19pbl9hbmFsb2dfdGVtcF9vZmZzZXQsCisJCWFkdDczMTZfc3RvcmVfaW5fYW5hbG9nX3RlbXBfb2Zmc2V0LCAwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X2V4X2FuYWxvZ190ZW1wX29mZnNldChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIGFkdDczMTZfc2hvd190ZW1wX29mZnNldChjaGlwLAorCQkJQURUNzMxNl9FWF9BTkFMT0dfVEVNUF9PRkZTRVQsIGJ1Zik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc3RvcmVfZXhfYW5hbG9nX3RlbXBfb2Zmc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gYWR0NzMxNl9zdG9yZV90ZW1wX29mZnNldChjaGlwLAorCQkJQURUNzMxNl9FWF9BTkFMT0dfVEVNUF9PRkZTRVQsIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihleF9hbmFsb2dfdGVtcF9vZmZzZXQsIFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZHQ3MzE2X3Nob3dfZXhfYW5hbG9nX3RlbXBfb2Zmc2V0LAorCQlhZHQ3MzE2X3N0b3JlX2V4X2FuYWxvZ190ZW1wX29mZnNldCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19EQUMoc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwLAorCQlpbnQgY2hhbm5lbCwgY2hhciAqYnVmKQoreworCXUxNiBkYXRhOworCXU4IG1zYiwgbHNiLCBvZmZzZXQ7CisJaW50IHJldDsKKworCWlmIChjaGFubmVsID49IEFEVDczMTZfREFfTVNCX0RBVEFfUkVHUyB8fAorCQkoY2hhbm5lbCA9PSAwICYmCisJCShjaGlwLT5jb25maWczICYgQURUNzMxNl9FTl9JTl9URU1QX1BST1BfREFDQSkpIHx8CisJCShjaGFubmVsID09IDEgJiYKKwkJKGNoaXAtPmNvbmZpZzMgJiBBRFQ3MzE2X0VOX0VYX1RFTVBfUFJPUF9EQUNCKSkpCisJCXJldHVybiAtRVBFUk07CisKKwlvZmZzZXQgPSBjaGlwLT5kYWNfYml0cyAtIDg7CisKKwlpZiAoY2hpcC0+ZGFjX2JpdHMgPiA4KSB7CisJCXJldCA9IGNoaXAtPmJ1cy5yZWFkKGNoaXAtPmJ1cy5jbGllbnQsCisJCQlBRFQ3MzE2X0RBX0RBVEFfQkFTRSArIGNoYW5uZWwgKiAyLCAmbHNiKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiAtRUlPOworCX0KKworCXJldCA9IGNoaXAtPmJ1cy5yZWFkKGNoaXAtPmJ1cy5jbGllbnQsCisJCUFEVDczMTZfREFfREFUQV9CQVNFICsgMSArIGNoYW5uZWwgKiAyLCAmbXNiKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWRhdGEgPSAobXNiIDw8IG9mZnNldCkgKyAobHNiICYgKCgxIDw8IG9mZnNldCkgLSAxKSk7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGF0YSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc3RvcmVfREFDKHN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCwKKwkJaW50IGNoYW5uZWwsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwl1OCBtc2IsIGxzYiwgb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlpbnQgcmV0OworCisJaWYgKGNoYW5uZWwgPj0gQURUNzMxNl9EQV9NU0JfREFUQV9SRUdTIHx8CisJCShjaGFubmVsID09IDAgJiYKKwkJKGNoaXAtPmNvbmZpZzMgJiBBRFQ3MzE2X0VOX0lOX1RFTVBfUFJPUF9EQUNBKSkgfHwKKwkJKGNoYW5uZWwgPT0gMSAmJgorCQkoY2hpcC0+Y29uZmlnMyAmIEFEVDczMTZfRU5fRVhfVEVNUF9QUk9QX0RBQ0IpKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCW9mZnNldCA9IGNoaXAtPmRhY19iaXRzIC0gODsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKKwlpZiAocmV0IHx8IGRhdGEgPj0gKDEgPDwgY2hpcC0+ZGFjX2JpdHMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjaGlwLT5kYWNfYml0cyA+IDgpIHsKKwkJbHNiID0gZGF0YSAmICgxIDw8IG9mZnNldCk7CisJCXJldCA9IGNoaXAtPmJ1cy53cml0ZShjaGlwLT5idXMuY2xpZW50LAorCQkJQURUNzMxNl9EQV9EQVRBX0JBU0UgKyBjaGFubmVsICogMiwgbHNiKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiAtRUlPOworCX0KKworCW1zYiA9IGRhdGEgPj4gb2Zmc2V0OworCXJldCA9IGNoaXAtPmJ1cy53cml0ZShjaGlwLT5idXMuY2xpZW50LAorCQlBRFQ3MzE2X0RBX0RBVEFfQkFTRSArIDEgKyBjaGFubmVsICogMiwgbXNiKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19EQUNfQShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIGFkdDczMTZfc2hvd19EQUMoY2hpcCwgMCwgYnVmKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zdG9yZV9EQUNfQShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIGFkdDczMTZfc3RvcmVfREFDKGNoaXAsIDAsIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihEQUNfQSwgU19JUlVHTyB8IFNfSVdVU1IsIGFkdDczMTZfc2hvd19EQUNfQSwKKwkJYWR0NzMxNl9zdG9yZV9EQUNfQSwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19EQUNfQihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIGFkdDczMTZfc2hvd19EQUMoY2hpcCwgMSwgYnVmKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zdG9yZV9EQUNfQihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIGFkdDczMTZfc3RvcmVfREFDKGNoaXAsIDEsIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihEQUNfQiwgU19JUlVHTyB8IFNfSVdVU1IsIGFkdDczMTZfc2hvd19EQUNfQiwKKwkJYWR0NzMxNl9zdG9yZV9EQUNfQiwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19EQUNfQyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIGFkdDczMTZfc2hvd19EQUMoY2hpcCwgMiwgYnVmKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zdG9yZV9EQUNfQyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIGFkdDczMTZfc3RvcmVfREFDKGNoaXAsIDIsIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihEQUNfQywgU19JUlVHTyB8IFNfSVdVU1IsIGFkdDczMTZfc2hvd19EQUNfQywKKwkJYWR0NzMxNl9zdG9yZV9EQUNfQywgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19EQUNfRChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIGFkdDczMTZfc2hvd19EQUMoY2hpcCwgMywgYnVmKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zdG9yZV9EQUNfRChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIGFkdDczMTZfc3RvcmVfREFDKGNoaXAsIDMsIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihEQUNfRCwgU19JUlVHTyB8IFNfSVdVU1IsIGFkdDczMTZfc2hvd19EQUNfRCwKKwkJYWR0NzMxNl9zdG9yZV9EQUNfRCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19kZXZpY2VfaWQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1OCBpZDsKKwlpbnQgcmV0OworCisJcmV0ID0gY2hpcC0+YnVzLnJlYWQoY2hpcC0+YnVzLmNsaWVudCwgQURUNzMxNl9ERVZJQ0VfSUQsICZpZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgaWQpOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGRldmljZV9pZCwgU19JUlVHTywgYWR0NzMxNl9zaG93X2RldmljZV9pZCwgTlVMTCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19tYW51ZmFjdG9yZXJfaWQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1OCBpZDsKKwlpbnQgcmV0OworCisJcmV0ID0gY2hpcC0+YnVzLnJlYWQoY2hpcC0+YnVzLmNsaWVudCwgQURUNzMxNl9NQU5VRkFDVFVSRV9JRCwgJmlkKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBpZCk7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIobWFudWZhY3RvcmVyX2lkLCBTX0lSVUdPLAorCQlhZHQ3MzE2X3Nob3dfbWFudWZhY3RvcmVyX2lkLCBOVUxMLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X2RldmljZV9yZXYoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1OCByZXY7CisJaW50IHJldDsKKworCXJldCA9IGNoaXAtPmJ1cy5yZWFkKGNoaXAtPmJ1cy5jbGllbnQsIEFEVDczMTZfREVWSUNFX1JFViwgJnJldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcmV2KTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihkZXZpY2VfcmV2LCBTX0lSVUdPLCBhZHQ3MzE2X3Nob3dfZGV2aWNlX3JldiwgTlVMTCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19idXNfdHlwZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXU4IHN0YXQ7CisJaW50IHJldDsKKworCXJldCA9IGNoaXAtPmJ1cy5yZWFkKGNoaXAtPmJ1cy5jbGllbnQsIEFEVDczMTZfU1BJX0xPQ0tfU1RBVCwgJnN0YXQpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJaWYgKHN0YXQpCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgInNwaVxuIik7CisJZWxzZQorCQlyZXR1cm4gc3ByaW50ZihidWYsICJpMmNcbiIpOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGJ1c190eXBlLCBTX0lSVUdPLCBhZHQ3MzE2X3Nob3dfYnVzX3R5cGUsIE5VTEwsIDApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3Nob3dfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIGNoaXAtPm5hbWUpOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIGFkdDczMTZfc2hvd19uYW1lLCBOVUxMLCAwKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkdDczMTZfYXR0cmlidXRlc1tdID0geworCSZpaW9fZGV2X2F0dHJfYWxsX21vZGVzLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9tb2RlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9yZXNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZW5hYmxlZC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYWRfY2hhbm5lbC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYWxsX2FkX2NoYW5uZWxzLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9kaXNhYmxlX2F2ZXJhZ2luZy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZW5hYmxlX3NtYnVzX3RpbWVvdXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3Bvd2VyZG93bi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZmFzdF9hZF9jbG9jay5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZGFfaGlnaF9yZXNvbHV0aW9uLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9lbmFibGVfcHJvcG9ydGlvbl9EQUNBLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9lbmFibGVfcHJvcG9ydGlvbl9EQUNCLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9EQUNfMlZyZWZfY2hhbm5lbHNfbWFzay5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfREFDX3VwZGF0ZV9tb2RlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hbGxfREFDX3VwZGF0ZV9tb2Rlcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfdXBkYXRlX0RBQy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfREFfQUJfVnJlZl9ieXBhc3MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX0RBX0NEX1ZyZWZfYnlwYXNzLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9EQUNfaW50ZXJuYWxfVnJlZi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfVkRELmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbl90ZW1wLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9leF90ZW1wLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbl90ZW1wX29mZnNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZXhfdGVtcF9vZmZzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luX2FuYWxvZ190ZW1wX29mZnNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZXhfYW5hbG9nX3RlbXBfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9EQUNfQS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfREFDX0IuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX0RBQ19DLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9EQUNfRC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZGV2aWNlX2lkLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9tYW51ZmFjdG9yZXJfaWQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2RldmljZV9yZXYuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2J1c190eXBlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9uYW1lLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkdDczMTZfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkdDczMTZfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZHQ3NTE2X2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2Rldl9hdHRyX2FsbF9tb2Rlcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbW9kZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfc2VsZWN0X2V4X3RlbXAuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3Jlc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9lbmFibGVkLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hZF9jaGFubmVsLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hbGxfYWRfY2hhbm5lbHMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2Rpc2FibGVfYXZlcmFnaW5nLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9lbmFibGVfc21idXNfdGltZW91dC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcG93ZXJkb3duLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9mYXN0X2FkX2Nsb2NrLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9BSU5faW50ZXJuYWxfVnJlZi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZGFfaGlnaF9yZXNvbHV0aW9uLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9lbmFibGVfcHJvcG9ydGlvbl9EQUNBLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9lbmFibGVfcHJvcG9ydGlvbl9EQUNCLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9EQUNfMlZyZWZfY2hhbm5lbHNfbWFzay5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfREFDX3VwZGF0ZV9tb2RlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hbGxfREFDX3VwZGF0ZV9tb2Rlcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfdXBkYXRlX0RBQy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfREFfQUJfVnJlZl9ieXBhc3MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX0RBX0NEX1ZyZWZfYnlwYXNzLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9EQUNfaW50ZXJuYWxfVnJlZi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfVkRELmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbl90ZW1wLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9leF90ZW1wX0FJTjEuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX0FJTjIuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX0FJTjMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX0FJTjQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luX3RlbXBfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9leF90ZW1wX29mZnNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW5fYW5hbG9nX3RlbXBfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9leF9hbmFsb2dfdGVtcF9vZmZzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX0RBQ19BLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9EQUNfQi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfREFDX0MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX0RBQ19ELmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9kZXZpY2VfaWQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX21hbnVmYWN0b3Jlcl9pZC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZGV2aWNlX3Jldi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYnVzX3R5cGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX25hbWUuZGV2X2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWR0NzUxNl9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWR0NzUxNl9hdHRyaWJ1dGVzLAorfTsKKworCisvKgorICogdGVtcGVyYXR1cmUgYm91bmQgZXZlbnRzCisgKi8KKworI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9BRFQ3MzE2X0lOX1RFTVBfSElHSCAgIElJT19CVUZGRVJfRVZFTlRfQ09ERSgwKQorI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9BRFQ3MzE2X0lOX1RFTVBfTE9XICAgIElJT19CVUZGRVJfRVZFTlRfQ09ERSgxKQorI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9BRFQ3MzE2X0VYX1RFTVBfSElHSCAgIElJT19CVUZGRVJfRVZFTlRfQ09ERSgyKQorI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9BRFQ3MzE2X0VYX1RFTVBfTE9XICAgIElJT19CVUZGRVJfRVZFTlRfQ09ERSgzKQorI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9BRFQ3MzE2X0VYX1RFTVBfRkFVTFQgIElJT19CVUZGRVJfRVZFTlRfQ09ERSg0KQorI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9BRFQ3NTE2X0FJTjEgICAgICAgICAgIElJT19CVUZGRVJfRVZFTlRfQ09ERSg1KQorI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9BRFQ3NTE2X0FJTjIgICAgICAgICAgIElJT19CVUZGRVJfRVZFTlRfQ09ERSg2KQorI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9BRFQ3NTE2X0FJTjMgICAgICAgICAgIElJT19CVUZGRVJfRVZFTlRfQ09ERSg3KQorI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9BRFQ3NTE2X0FJTjQgICAgICAgICAgIElJT19CVUZGRVJfRVZFTlRfQ09ERSg4KQorI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9BRFQ3MzE2X1ZERCAgICAgICAgICAgIElJT19CVUZGRVJfRVZFTlRfQ09ERSg5KQorCitzdGF0aWMgdm9pZCBhZHQ3MzE2X2ludGVycnVwdF9iaChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmtfcykKK3sKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPQorCQljb250YWluZXJfb2Yod29ya19zLCBzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8sIHRocmVzaF93b3JrKTsKKwl1OCBzdGF0MSwgc3RhdDI7CisJaW50IGksIHJldCwgY291bnQ7CisKKwlyZXQgPSBjaGlwLT5idXMucmVhZChjaGlwLT5idXMuY2xpZW50LCBBRFQ3MzE2X0lOVF9TVEFUMSwgJnN0YXQxKTsKKwlpZiAoIXJldCkgeworCQlpZiAoKGNoaXAtPmlkICYgSURfRkFNSUxZX01BU0spID09IElEX0FEVDc1WFgpCisJCQljb3VudCA9IDg7CisJCWVsc2UKKwkJCWNvdW50ID0gNTsKKworCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQkJaWYgKHN0YXQxICYgKDEgPDwgaSkpCisJCQkJaWlvX3B1c2hfZXZlbnQoY2hpcC0+aW5kaW9fZGV2LCAwLAorCQkJCQlJSU9fRVZFTlRfQ09ERV9BRFQ3MzE2X0lOX1RFTVBfSElHSCArIGksCisJCQkJCWNoaXAtPmxhc3RfdGltZXN0YW1wKTsKKwkJfQorCX0KKworCXJldCA9IGNoaXAtPmJ1cy5yZWFkKGNoaXAtPmJ1cy5jbGllbnQsIEFEVDczMTZfSU5UX1NUQVQyLCAmc3RhdDIpOworCWlmICghcmV0KSB7CisJCWlmIChzdGF0MiAmIEFEVDczMTZfSU5UX01BU0syX1ZERCkKKwkJCWlpb19wdXNoX2V2ZW50KGNoaXAtPmluZGlvX2RldiwgMCwKKwkJCQlJSU9fRVZFTlRfQ09ERV9BRFQ3MzE2X1ZERCwKKwkJCQljaGlwLT5sYXN0X3RpbWVzdGFtcCk7CisJfQorCisJZW5hYmxlX2lycShjaGlwLT5idXMuaXJxKTsKK30KKworc3RhdGljIGludCBhZHQ3MzE2X2ludGVycnVwdChzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8sCisJCWludCBpbmRleCwKKwkJczY0IHRpbWVzdGFtcCwKKwkJaW50IG5vX3Rlc3QpCit7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJY2hpcC0+bGFzdF90aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisJc2NoZWR1bGVfd29yaygmY2hpcC0+dGhyZXNoX3dvcmspOworCisJcmV0dXJuIDA7Cit9CisKK0lJT19FVkVOVF9TSChhZHQ3MzE2LCAmYWR0NzMxNl9pbnRlcnJ1cHQpOworCisvKgorICogU2hvdyBtYXNrIG9mIGVuYWJsZWQgaW50ZXJydXB0cyBpbiBIZXguCisgKi8KK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19pbnRfbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHgleFxuIiwgY2hpcC0+aW50X21hc2spOworfQorCisvKgorICogU2V0IDEgdG8gdGhlIG1hc2sgaW4gSGV4IHRvIGVuYWJsZWQgaW50ZXJydXB0cy4KKyAqLworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zZXRfaW50X21hc2soc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJaW50IHJldDsKKwl1OCBtYXNrOworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxNiwgJmRhdGEpOworCWlmIChyZXQgfHwgZGF0YSA+PSBBRFQ3MzE2X1ZERF9JTlRfTUFTSyArIDEpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGRhdGEgJiBBRFQ3MzE2X1ZERF9JTlRfTUFTSykKKwkJbWFzayA9IDA7CQkJLyogZW5hYmxlIHZkZCBpbnQgKi8KKwllbHNlCisJCW1hc2sgPSBBRFQ3MzE2X0lOVF9NQVNLMl9WREQ7CS8qIGRpc2FibGUgdmRkIGludCAqLworCisJcmV0ID0gY2hpcC0+YnVzLndyaXRlKGNoaXAtPmJ1cy5jbGllbnQsIEFEVDczMTZfSU5UX01BU0syLCBtYXNrKTsKKwlpZiAoIXJldCkgeworCQljaGlwLT5pbnRfbWFzayAmPSB+QURUNzMxNl9WRERfSU5UX01BU0s7CisJCWNoaXAtPmludF9tYXNrIHw9IGRhdGEgJiBBRFQ3MzE2X1ZERF9JTlRfTUFTSzsKKwl9CisKKwlpZiAoZGF0YSAmIEFEVDczMTZfVEVNUF9BSU5fSU5UX01BU0spIHsKKwkJaWYgKChjaGlwLT5pZCAmIElEX0ZBTUlMWV9NQVNLKSA9PSBJRF9BRFQ3M1hYKQorCQkJLyogbWFzayBpbiByZWcgaXMgb3Bwb3NpdGUsIHNldCAxIHRvIGRpc2FibGUgKi8KKwkJCW1hc2sgPSAofmRhdGEpICYgQURUNzMxNl9URU1QX0lOVF9NQVNLOworCQllbHNlCisJCQkvKiBtYXNrIGluIHJlZyBpcyBvcHBvc2l0ZSwgc2V0IDEgdG8gZGlzYWJsZSAqLworCQkJbWFzayA9ICh+ZGF0YSkgJiBBRFQ3MzE2X1RFTVBfQUlOX0lOVF9NQVNLOworCX0KKwlyZXQgPSBjaGlwLT5idXMud3JpdGUoY2hpcC0+YnVzLmNsaWVudCwgQURUNzMxNl9JTlRfTUFTSzEsIG1hc2spOworCisJY2hpcC0+aW50X21hc2sgPSBtYXNrOworCisJcmV0dXJuIGxlbjsKK30KK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZHQ3MzE2X3Nob3dfYWRfYm91bmQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJdTggYm91bmRfcmVnLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXU4IHZhbDsKKwlpbnQgZGF0YTsKKwlpbnQgcmV0OworCisJaWYgKChjaGlwLT5pZCAmIElEX0ZBTUlMWV9NQVNLKSA9PSBJRF9BRFQ3M1hYICYmCisJCWJvdW5kX3JlZyA+IEFEVDczMTZfRVhfVEVNUF9MT1cpCisJCXJldHVybiAtRVBFUk07CisKKwlyZXQgPSBjaGlwLT5idXMucmVhZChjaGlwLT5idXMuY2xpZW50LCBib3VuZF9yZWcsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJZGF0YSA9IChpbnQpdmFsOworCisJaWYgKCEoKGNoaXAtPmlkICYgSURfRkFNSUxZX01BU0spID09IElEX0FEVDc1WFggJiYKKwkJKGNoaXAtPmNvbmZpZzEgJiBBRFQ3NTE2X1NFTF9BSU4xXzJfRVhfVEVNUF9NQVNLKSA9PSAwKSkgeworCQlpZiAoZGF0YSAmIDB4ODApCisJCQlkYXRhIC09IDI1NjsKKwl9CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGF0YSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZHQ3MzE2X3NldF9hZF9ib3VuZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQl1OCBib3VuZF9yZWcsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJbG9uZyBkYXRhOworCXU4IHZhbDsKKwlpbnQgcmV0OworCisJaWYgKChjaGlwLT5pZCAmIElEX0ZBTUlMWV9NQVNLKSA9PSBJRF9BRFQ3M1hYICYmCisJCWJvdW5kX3JlZyA+IEFEVDczMTZfRVhfVEVNUF9MT1cpCisJCXJldHVybiAtRVBFUk07CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZkYXRhKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgoY2hpcC0+aWQgJiBJRF9GQU1JTFlfTUFTSykgPT0gSURfQURUNzVYWCAmJgorCQkoY2hpcC0+Y29uZmlnMSAmIEFEVDc1MTZfU0VMX0FJTjFfMl9FWF9URU1QX01BU0spID09IDApIHsKKwkJaWYgKGRhdGEgPiAyNTUgfHwgZGF0YSA8IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgeworCQlpZiAoZGF0YSA+IDEyNyB8fCBkYXRhIDwgLTEyOCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmIChkYXRhIDwgMCkKKwkJCWRhdGEgKz0gMjU2OworCX0KKworCXZhbCA9ICh1OClkYXRhOworCisJcmV0ID0gY2hpcC0+YnVzLndyaXRlKGNoaXAtPmJ1cy5jbGllbnQsIGJvdW5kX3JlZywgdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19pbl90ZW1wX2hpZ2goc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXJldHVybiBhZHQ3MzE2X3Nob3dfYWRfYm91bmQoZGV2LCBhdHRyLAorCQkJQURUNzMxNl9JTl9URU1QX0hJR0gsIGJ1Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZHQ3MzE2X3NldF9pbl90ZW1wX2hpZ2goc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXJldHVybiBhZHQ3MzE2X3NldF9hZF9ib3VuZChkZXYsIGF0dHIsCisJCQlBRFQ3MzE2X0lOX1RFTVBfSElHSCwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3Nob3dfaW5fdGVtcF9sb3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXJldHVybiBhZHQ3MzE2X3Nob3dfYWRfYm91bmQoZGV2LCBhdHRyLAorCQkJQURUNzMxNl9JTl9URU1QX0xPVywgYnVmKTsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90IGFkdDczMTZfc2V0X2luX3RlbXBfbG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gYWR0NzMxNl9zZXRfYWRfYm91bmQoZGV2LCBhdHRyLAorCQkJQURUNzMxNl9JTl9URU1QX0xPVywgYnVmLCBsZW4pOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3Nob3dfZXhfdGVtcF9haW4xX2hpZ2goc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXJldHVybiBhZHQ3MzE2X3Nob3dfYWRfYm91bmQoZGV2LCBhdHRyLAorCQkJQURUNzMxNl9FWF9URU1QX0hJR0gsIGJ1Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZHQ3MzE2X3NldF9leF90ZW1wX2FpbjFfaGlnaChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJcmV0dXJuIGFkdDczMTZfc2V0X2FkX2JvdW5kKGRldiwgYXR0ciwKKwkJCUFEVDczMTZfRVhfVEVNUF9ISUdILCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19leF90ZW1wX2FpbjFfbG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gYWR0NzMxNl9zaG93X2FkX2JvdW5kKGRldiwgYXR0ciwKKwkJCUFEVDczMTZfRVhfVEVNUF9MT1csIGJ1Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZHQ3MzE2X3NldF9leF90ZW1wX2FpbjFfbG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gYWR0NzMxNl9zZXRfYWRfYm91bmQoZGV2LCBhdHRyLAorCQkJQURUNzMxNl9FWF9URU1QX0xPVywgYnVmLCBsZW4pOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3Nob3dfYWluMl9oaWdoKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gYWR0NzMxNl9zaG93X2FkX2JvdW5kKGRldiwgYXR0ciwKKwkJCUFEVDc1MTZfQUlOMl9ISUdILCBidWYpOworfQorCitzdGF0aWMgaW5saW5lIHNzaXplX3QgYWR0NzMxNl9zZXRfYWluMl9oaWdoKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gYWR0NzMxNl9zZXRfYWRfYm91bmQoZGV2LCBhdHRyLAorCQkJQURUNzUxNl9BSU4yX0hJR0gsIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X2FpbjJfbG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gYWR0NzMxNl9zaG93X2FkX2JvdW5kKGRldiwgYXR0ciwKKwkJCUFEVDc1MTZfQUlOMl9MT1csIGJ1Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZHQ3MzE2X3NldF9haW4yX2xvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJcmV0dXJuIGFkdDczMTZfc2V0X2FkX2JvdW5kKGRldiwgYXR0ciwKKwkJCUFEVDc1MTZfQUlOMl9MT1csIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X2FpbjNfaGlnaChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJcmV0dXJuIGFkdDczMTZfc2hvd19hZF9ib3VuZChkZXYsIGF0dHIsCisJCQlBRFQ3NTE2X0FJTjNfSElHSCwgYnVmKTsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90IGFkdDczMTZfc2V0X2FpbjNfaGlnaChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJcmV0dXJuIGFkdDczMTZfc2V0X2FkX2JvdW5kKGRldiwgYXR0ciwKKwkJCUFEVDc1MTZfQUlOM19ISUdILCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19haW4zX2xvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJcmV0dXJuIGFkdDczMTZfc2hvd19hZF9ib3VuZChkZXYsIGF0dHIsCisJCQlBRFQ3NTE2X0FJTjNfTE9XLCBidWYpOworfQorCitzdGF0aWMgaW5saW5lIHNzaXplX3QgYWR0NzMxNl9zZXRfYWluM19sb3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXJldHVybiBhZHQ3MzE2X3NldF9hZF9ib3VuZChkZXYsIGF0dHIsCisJCQlBRFQ3NTE2X0FJTjNfTE9XLCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19haW40X2hpZ2goc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXJldHVybiBhZHQ3MzE2X3Nob3dfYWRfYm91bmQoZGV2LCBhdHRyLAorCQkJQURUNzUxNl9BSU40X0hJR0gsIGJ1Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZHQ3MzE2X3NldF9haW40X2hpZ2goc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXJldHVybiBhZHQ3MzE2X3NldF9hZF9ib3VuZChkZXYsIGF0dHIsCisJCQlBRFQ3NTE2X0FJTjRfSElHSCwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3Nob3dfYWluNF9sb3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXJldHVybiBhZHQ3MzE2X3Nob3dfYWRfYm91bmQoZGV2LCBhdHRyLAorCQkJQURUNzUxNl9BSU40X0xPVywgYnVmKTsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90IGFkdDczMTZfc2V0X2FpbjRfbG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gYWR0NzMxNl9zZXRfYWRfYm91bmQoZGV2LCBhdHRyLAorCQkJQURUNzUxNl9BSU40X0xPVywgYnVmLCBsZW4pOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3Nob3dfaW50X2VuYWJsZWQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAhIShjaGlwLT5jb25maWcxICYgQURUNzMxNl9JTlRfRU4pKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zZXRfaW50X2VuYWJsZWQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1OCBjb25maWcxOworCWludCByZXQ7CisKKwljb25maWcxID0gY2hpcC0+Y29uZmlnMSAmICh+QURUNzMxNl9JTlRfRU4pOworCWlmICghbWVtY21wKGJ1ZiwgIjEiLCAxKSkKKwkJY29uZmlnMSB8PSBBRFQ3MzE2X0lOVF9FTjsKKworCXJldCA9IGNoaXAtPmJ1cy53cml0ZShjaGlwLT5idXMuY2xpZW50LCBBRFQ3MzE2X0NPTkZJRzEsIGNvbmZpZzEpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+Y29uZmlnMSA9IGNvbmZpZzE7CisKKwlyZXR1cm4gbGVuOworfQorCisKK0lJT19FVkVOVF9BVFRSX1NIKGludF9tYXNrLCBpaW9fZXZlbnRfYWR0NzMxNiwKKwkJYWR0NzMxNl9zaG93X2ludF9tYXNrLCBhZHQ3MzE2X3NldF9pbnRfbWFzaywgMCk7CitJSU9fRVZFTlRfQVRUUl9TSChpbl90ZW1wX2hpZ2gsIGlpb19ldmVudF9hZHQ3MzE2LAorCQlhZHQ3MzE2X3Nob3dfaW5fdGVtcF9oaWdoLCBhZHQ3MzE2X3NldF9pbl90ZW1wX2hpZ2gsIDApOworSUlPX0VWRU5UX0FUVFJfU0goaW5fdGVtcF9sb3csIGlpb19ldmVudF9hZHQ3MzE2LAorCQlhZHQ3MzE2X3Nob3dfaW5fdGVtcF9sb3csIGFkdDczMTZfc2V0X2luX3RlbXBfbG93LCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKGV4X3RlbXBfaGlnaCwgaWlvX2V2ZW50X2FkdDczMTYsCisJCWFkdDczMTZfc2hvd19leF90ZW1wX2FpbjFfaGlnaCwKKwkJYWR0NzMxNl9zZXRfZXhfdGVtcF9haW4xX2hpZ2gsIDApOworSUlPX0VWRU5UX0FUVFJfU0goZXhfdGVtcF9sb3csIGlpb19ldmVudF9hZHQ3MzE2LAorCQlhZHQ3MzE2X3Nob3dfZXhfdGVtcF9haW4xX2xvdywKKwkJYWR0NzMxNl9zZXRfZXhfdGVtcF9haW4xX2xvdywgMCk7CitJSU9fRVZFTlRfQVRUUl9TSChleF90ZW1wX2FpbjFfaGlnaCwgaWlvX2V2ZW50X2FkdDczMTYsCisJCWFkdDczMTZfc2hvd19leF90ZW1wX2FpbjFfaGlnaCwKKwkJYWR0NzMxNl9zZXRfZXhfdGVtcF9haW4xX2hpZ2gsIDApOworSUlPX0VWRU5UX0FUVFJfU0goZXhfdGVtcF9haW4xX2xvdywgaWlvX2V2ZW50X2FkdDczMTYsCisJCWFkdDczMTZfc2hvd19leF90ZW1wX2FpbjFfbG93LAorCQlhZHQ3MzE2X3NldF9leF90ZW1wX2FpbjFfbG93LCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKGFpbjJfaGlnaCwgaWlvX2V2ZW50X2FkdDczMTYsCisJCWFkdDczMTZfc2hvd19haW4yX2hpZ2gsIGFkdDczMTZfc2V0X2FpbjJfaGlnaCwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSChhaW4yX2xvdywgaWlvX2V2ZW50X2FkdDczMTYsCisJCWFkdDczMTZfc2hvd19haW4yX2xvdywgYWR0NzMxNl9zZXRfYWluMl9sb3csIDApOworSUlPX0VWRU5UX0FUVFJfU0goYWluM19oaWdoLCBpaW9fZXZlbnRfYWR0NzMxNiwKKwkJYWR0NzMxNl9zaG93X2FpbjNfaGlnaCwgYWR0NzMxNl9zZXRfYWluM19oaWdoLCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKGFpbjNfbG93LCBpaW9fZXZlbnRfYWR0NzMxNiwKKwkJYWR0NzMxNl9zaG93X2FpbjNfbG93LCBhZHQ3MzE2X3NldF9haW4zX2xvdywgMCk7CitJSU9fRVZFTlRfQVRUUl9TSChhaW40X2hpZ2gsIGlpb19ldmVudF9hZHQ3MzE2LAorCQlhZHQ3MzE2X3Nob3dfYWluNF9oaWdoLCBhZHQ3MzE2X3NldF9haW40X2hpZ2gsIDApOworSUlPX0VWRU5UX0FUVFJfU0goYWluNF9sb3csIGlpb19ldmVudF9hZHQ3MzE2LAorCQlhZHQ3MzE2X3Nob3dfYWluNF9sb3csIGFkdDczMTZfc2V0X2FpbjRfbG93LCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKGludF9lbmFibGVkLCBpaW9fZXZlbnRfYWR0NzMxNiwKKwkJYWR0NzMxNl9zaG93X2ludF9lbmFibGVkLCBhZHQ3MzE2X3NldF9pbnRfZW5hYmxlZCwgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZHQ3MzE2X2V2ZW50X2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2V2ZW50X2F0dHJfaW50X21hc2suZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfaW5fdGVtcF9oaWdoLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX2luX3RlbXBfbG93LmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX2V4X3RlbXBfaGlnaC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl9leF90ZW1wX2xvdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl9pbnRfZW5hYmxlZC5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZHQ3MzE2X2V2ZW50X2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZHQ3MzE2X2V2ZW50X2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWR0NzUxNl9ldmVudF9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19ldmVudF9hdHRyX2ludF9tYXNrLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX2luX3RlbXBfaGlnaC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl9pbl90ZW1wX2xvdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl9leF90ZW1wX2FpbjFfaGlnaC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl9leF90ZW1wX2FpbjFfbG93LmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX2FpbjJfaGlnaC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl9haW4yX2xvdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl9haW4zX2hpZ2guZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfYWluM19sb3cuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfYWluNF9oaWdoLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX2FpbjRfbG93LmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX2ludF9lbmFibGVkLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkdDc1MTZfZXZlbnRfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkdDc1MTZfZXZlbnRfYXR0cmlidXRlcywKK307CisKKyNpZmRlZiBDT05GSUdfUE0KK2ludCBhZHQ3MzE2X2Rpc2FibGUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBfYWR0NzMxNl9zdG9yZV9lbmFibGVkKGNoaXAsIDApOworfQorRVhQT1JUX1NZTUJPTChhZHQ3MzE2X2Rpc2FibGUpOworCitpbnQgYWR0NzMxNl9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBfYWR0NzMxNl9zdG9yZV9lbmFibGVkKGNoaXAsIDEpOworfQorRVhQT1JUX1NZTUJPTChhZHQ3MzE2X2VuYWJsZSk7CisjZW5kaWYKKworLyoKKyAqIGRldmljZSBwcm9iZSBhbmQgcmVtb3ZlCisgKi8KK2ludCBfX2RldmluaXQgYWR0NzMxNl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBhZHQ3MzE2X2J1cyAqYnVzLAorCQljb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcDsKKwl1bnNpZ25lZCBzaG9ydCAqYWR0NzMxNl9wbGF0Zm9ybV9kYXRhID0gZGV2LT5wbGF0Zm9ybV9kYXRhOworCWludCByZXQgPSAwOworCisJY2hpcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyksIEdGUF9LRVJORUwpOworCisJaWYgKGNoaXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiB0aGlzIGlzIG9ubHkgdXNlZCBmb3IgZGV2aWNlIHJlbW92YWwgcHVycG9zZXMgKi8KKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBjaGlwKTsKKworCWNoaXAtPmJ1cyA9ICpidXM7CisJY2hpcC0+bmFtZSA9IG5hbWU7CisKKwlpZiAobmFtZVs0XSA9PSAnMycpCisJCWNoaXAtPmlkID0gSURfQURUNzMxNiArIChuYW1lWzZdIC0gJzYnKTsKKwllbHNlIGlmIChuYW1lWzRdID09ICc1JykKKwkJY2hpcC0+aWQgPSBJRF9BRFQ3NTE2ICsgKG5hbWVbNl0gLSAnNicpOworCWVsc2UKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwljaGlwLT5sZGFjX3BpbiA9IGFkdDczMTZfcGxhdGZvcm1fZGF0YVsxXTsKKwlpZiAoY2hpcC0+bGRhY19waW4pIHsKKwkJY2hpcC0+Y29uZmlnMyB8PSBBRFQ3MzE2X0RBX0VOX1ZJQV9EQUNfTERDQTsKKwkJaWYgKChjaGlwLT5pZCAmIElEX0ZBTUlMWV9NQVNLKSA9PSBJRF9BRFQ3NVhYKQorCQkJY2hpcC0+Y29uZmlnMSB8PSBBRFQ3NTE2X1NFTF9BSU4zOworCX0KKwljaGlwLT5pbnRfbWFzayA9IEFEVDczMTZfVEVNUF9JTlRfTUFTSyB8IEFEVDczMTZfVkREX0lOVF9NQVNLOworCWlmICgoY2hpcC0+aWQgJiBJRF9GQU1JTFlfTUFTSykgPT0gSURfQURUNzVYWCkKKwkJY2hpcC0+aW50X21hc2sgfD0gQURUNzUxNl9BSU5fSU5UX01BU0s7CisKKwljaGlwLT5pbmRpb19kZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKGNoaXAtPmluZGlvX2RldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9jaGlwOworCX0KKworCWNoaXAtPmluZGlvX2Rldi0+ZGV2LnBhcmVudCA9IGRldjsKKwlpZiAoKGNoaXAtPmlkICYgSURfRkFNSUxZX01BU0spID09IElEX0FEVDc1WFgpIHsKKwkJY2hpcC0+aW5kaW9fZGV2LT5hdHRycyA9ICZhZHQ3NTE2X2F0dHJpYnV0ZV9ncm91cDsKKwkJY2hpcC0+aW5kaW9fZGV2LT5ldmVudF9hdHRycyA9ICZhZHQ3NTE2X2V2ZW50X2F0dHJpYnV0ZV9ncm91cDsKKwl9IGVsc2UgeworCQljaGlwLT5pbmRpb19kZXYtPmF0dHJzID0gJmFkdDczMTZfYXR0cmlidXRlX2dyb3VwOworCQljaGlwLT5pbmRpb19kZXYtPmV2ZW50X2F0dHJzID0gJmFkdDczMTZfZXZlbnRfYXR0cmlidXRlX2dyb3VwOworCX0KKwljaGlwLT5pbmRpb19kZXYtPmRldl9kYXRhID0gKHZvaWQgKiljaGlwOworCWNoaXAtPmluZGlvX2Rldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCWNoaXAtPmluZGlvX2Rldi0+bnVtX2ludGVycnVwdF9saW5lcyA9IDE7CisJY2hpcC0+aW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihjaGlwLT5pbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisKKwlpZiAoY2hpcC0+YnVzLmlycSA+IDApIHsKKwkJaWYgKGFkdDczMTZfcGxhdGZvcm1fZGF0YVswXSkKKwkJCWNoaXAtPmJ1cy5pcnFfZmxhZ3MgPSBhZHQ3MzE2X3BsYXRmb3JtX2RhdGFbMF07CisKKwkJcmV0ID0gaWlvX3JlZ2lzdGVyX2ludGVycnVwdF9saW5lKGNoaXAtPmJ1cy5pcnEsCisJCQkJY2hpcC0+aW5kaW9fZGV2LAorCQkJCTAsCisJCQkJY2hpcC0+YnVzLmlycV9mbGFncywKKwkJCQljaGlwLT5uYW1lKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfdW5yZWdfZGV2OworCisJCS8qCisJCSAqIFRoZSBldmVudCBoYW5kbGVyIGxpc3QgZWxlbWVudCByZWZlciB0byBpaW9fZXZlbnRfYWR0NzMxNi4KKwkJICogQWxsIGV2ZW50IGF0dHJpYnV0ZXMgYmluZCB0byB0aGUgc2FtZSBldmVudCBoYW5kbGVyLgorCQkgKiBTbywgb25seSByZWdpc3RlciBldmVudCBoYW5kbGVyIG9uY2UuCisJCSAqLworCQlpaW9fYWRkX2V2ZW50X3RvX2xpc3QoJmlpb19ldmVudF9hZHQ3MzE2LAorCQkJCSZjaGlwLT5pbmRpb19kZXYtPmludGVycnVwdHNbMF0tPmV2X2xpc3QpOworCisJCUlOSVRfV09SSygmY2hpcC0+dGhyZXNoX3dvcmssIGFkdDczMTZfaW50ZXJydXB0X2JoKTsKKworCQlpZiAoY2hpcC0+YnVzLmlycV9mbGFncyAmIElSUUZfVFJJR0dFUl9ISUdIKQorCQkJY2hpcC0+Y29uZmlnMSB8PSBBRFQ3MzE2X0lOVF9QT0xBUklUWTsKKwl9CisKKwlyZXQgPSBjaGlwLT5idXMud3JpdGUoY2hpcC0+YnVzLmNsaWVudCwgQURUNzMxNl9DT05GSUcxLCBjaGlwLT5jb25maWcxKTsKKwlpZiAocmV0KSB7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZXJyb3JfdW5yZWdfaXJxOworCX0KKworCXJldCA9IGNoaXAtPmJ1cy53cml0ZShjaGlwLT5idXMuY2xpZW50LCBBRFQ3MzE2X0NPTkZJRzMsIGNoaXAtPmNvbmZpZzMpOworCWlmIChyZXQpIHsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnJvcl91bnJlZ19pcnE7CisJfQorCisJZGV2X2luZm8oZGV2LCAiJXMgdGVtcGVyYXR1cmUgc2Vuc29yLCBBREMgYW5kIERBQyByZWdpc3RlcmVkLlxuIiwKKwkJCWNoaXAtPm5hbWUpOworCisJcmV0dXJuIDA7CisKK2Vycm9yX3VucmVnX2lycToKKwlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShjaGlwLT5pbmRpb19kZXYsIDApOworZXJyb3JfdW5yZWdfZGV2OgorCWlpb19kZXZpY2VfdW5yZWdpc3RlcihjaGlwLT5pbmRpb19kZXYpOworZXJyb3JfZnJlZV9kZXY6CisJaWlvX2ZyZWVfZGV2aWNlKGNoaXAtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX2NoaXA6CisJa2ZyZWUoY2hpcCk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChhZHQ3MzE2X3Byb2JlKTsKKworaW50IF9fZGV2ZXhpdCBhZHQ3MzE2X3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGNoaXAtPmluZGlvX2RldjsKKworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOworCWlmIChjaGlwLT5idXMuaXJxKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShpbmRpb19kZXYsIDApOworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWlpb19mcmVlX2RldmljZShjaGlwLT5pbmRpb19kZXYpOworCWtmcmVlKGNoaXApOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGFkdDczMTZfcmVtb3ZlKTsKKworTU9EVUxFX0FVVEhPUigiU29uaWMgWmhhbmcgPHNvbmljLnpoYW5nQGFuYWxvZy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFEVDczMTYvNy84IGFuZCBBRFQ3NTE2LzcvOSBkaWdpdGFsIgorCQkJIiB0ZW1wZXJhdHVyZSBzZW5zb3IsIEFEQyBhbmQgREFDIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGRhYy9hZHQ3MzE2LmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkZGFjL2FkdDczMTYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzRiZDY3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGRhYy9hZHQ3MzE2LmgKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIEFEVDczMTYgZGlnaXRhbCB0ZW1wZXJhdHVyZSBzZW5zb3IgZHJpdmVyIHN1cHBvcnRpbmcgQURUNzMxNi83LzggQURUNzUxNi83LzkKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpZm5kZWYgX0FEVDczMTZfSF8KKyNkZWZpbmUgX0FEVDczMTZfSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgQURUNzMxNl9SRUdfTUFYX0FERFIJCTB4M0YKKworc3RydWN0IGFkdDczMTZfYnVzIHsKKwl2b2lkICpjbGllbnQ7CisJaW50IGlycTsKKwlpbnQgaXJxX2ZsYWdzOworCWludCAoKnJlYWQpICh2b2lkICpjbGllbnQsIHU4IHJlZywgdTggKmRhdGEpOworCWludCAoKndyaXRlKSAodm9pZCAqY2xpZW50LCB1OCByZWcsIHU4IHZhbCk7CisJaW50ICgqbXVsdGlfcmVhZCkgKHZvaWQgKmNsaWVudCwgdTggZmlyc3RfcmVnLCB1OCBjb3VudCwgdTggKmRhdGEpOworCWludCAoKm11bHRpX3dyaXRlKSAodm9pZCAqY2xpZW50LCB1OCBmaXJzdF9yZWcsIHU4IGNvdW50LCB1OCAqZGF0YSk7Cit9OworCisjaWZkZWYgQ09ORklHX1BNCitpbnQgYWR0NzMxNl9kaXNhYmxlKHN0cnVjdCBkZXZpY2UgKmRldik7CitpbnQgYWR0NzMxNl9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2KTsKKyNlbmRpZgoraW50IGFkdDczMTZfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgYWR0NzMxNl9idXMgKmJ1cywgY29uc3QgY2hhciAqbmFtZSk7CitpbnQgYWR0NzMxNl9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kYWMvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTkxYmQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kYWMvS2NvbmZpZwpAQCAtMCwwICsxLDIxIEBACisjCisjIERBQyBkcml2ZXJzCisjCitjb21tZW50ICJEaWdpdGFsIHRvIGFuYWxvZyBjb252ZXJ0b3JzIgorCitjb25maWcgQUQ1NjI0Ul9TUEkKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQUQ1NjI0LzQ0LzY0UiBEQUMgc3BpIGRyaXZlciIKKwlkZXBlbmRzIG9uIFNQSQorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRDU2MjRSLCBBRDU2NDRSIGFuZAorCSAgQUQ1NjY0UiBjb252ZXJ0b3JzIChEQUMpLiBUaGlzIGRyaXZlciB1c2VzIHRoZSBjb21tb24gU1BJIGludGVyZmFjZS4KKworY29uZmlnIEFENTQ0NgorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRDU0NDQvNiwgQUQ1NjIwLzQwLzYwIGFuZCBBRDU1NDFBLzEyQSBEQUMgU1BJIGRyaXZlciIKKwlkZXBlbmRzIG9uIFNQSQorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRDU0NDQsIEFENTQ0NiwKKwkgIEFENTYyMCwgQUQ1NjQwLCBBRDU2NjAgYW5kIEFENTU0MUEsIEFENTUxMkEgREFDcy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYWQ1NDQ2LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9kYWMvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2YzMzFiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kYWMvTWFrZWZpbGUKQEAgLTAsMCArMSw2IEBACisjCisjIE1ha2VmaWxlIGZvciBpbmR1c3RyaWFsIEkvTyBEQUMgZHJpdmVycworIworCitvYmotJChDT05GSUdfQUQ1NjI0Ul9TUEkpICs9IGFkNTYyNHJfc3BpLm8KK29iai0kKENPTkZJR19BRDU0NDYpICs9IGFkNTQ0Ni5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9hZDU0NDYuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL2FkNTQ0Ni5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMzg3Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9hZDU0NDYuYwpAQCAtMCwwICsxLDMyMyBAQAorLyoKKyAqIEFENTQ0NiBTUEkgREFDIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorI2luY2x1ZGUgImRhYy5oIgorCisjaW5jbHVkZSAiYWQ1NDQ2LmgiCisKK3N0YXRpYyB2b2lkIGFkNTQ0Nl9zdG9yZV9zYW1wbGUoc3RydWN0IGFkNTQ0Nl9zdGF0ZSAqc3QsIHVuc2lnbmVkIHZhbCkKK3sKKwlzdC0+ZGF0YS5kMTYgPSBjcHVfdG9fYmUxNihBRDU0NDZfTE9BRCB8CisJCQkJCSh2YWwgPDwgc3QtPmNoaXBfaW5mby0+bGVmdF9zaGlmdCkpOworfQorCitzdGF0aWMgdm9pZCBhZDU1NDJfc3RvcmVfc2FtcGxlKHN0cnVjdCBhZDU0NDZfc3RhdGUgKnN0LCB1bnNpZ25lZCB2YWwpCit7CisJc3QtPmRhdGEuZDE2ID0gY3B1X3RvX2JlMTYodmFsIDw8IHN0LT5jaGlwX2luZm8tPmxlZnRfc2hpZnQpOworfQorCitzdGF0aWMgdm9pZCBhZDU2MjBfc3RvcmVfc2FtcGxlKHN0cnVjdCBhZDU0NDZfc3RhdGUgKnN0LCB1bnNpZ25lZCB2YWwpCit7CisJc3QtPmRhdGEuZDE2ID0gY3B1X3RvX2JlMTYoQUQ1NjIwX0xPQUQgfAorCQkJCQkodmFsIDw8IHN0LT5jaGlwX2luZm8tPmxlZnRfc2hpZnQpKTsKK30KKworc3RhdGljIHZvaWQgYWQ1NjYwX3N0b3JlX3NhbXBsZShzdHJ1Y3QgYWQ1NDQ2X3N0YXRlICpzdCwgdW5zaWduZWQgdmFsKQoreworCXZhbCB8PSBBRDU2NjBfTE9BRDsKKwlzdC0+ZGF0YS5kMjRbMF0gPSAodmFsID4+IDE2KSAmIDB4RkY7CisJc3QtPmRhdGEuZDI0WzFdID0gKHZhbCA+PiA4KSAmIDB4RkY7CisJc3QtPmRhdGEuZDI0WzJdID0gdmFsICYgMHhGRjsKK30KKworc3RhdGljIHNzaXplX3QgYWQ1NDQ2X3dyaXRlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ1NDQ2X3N0YXRlICpzdCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwlpbnQgcmV0OworCWxvbmcgdmFsOworCisJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCWlmICh2YWwgPiBSRVNfTUFTSyhzdC0+Y2hpcF9pbmZvLT5iaXRzKSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisKKwltdXRleF9sb2NrKCZkZXZfaW5mby0+bWxvY2spOworCXN0LT5jaGlwX2luZm8tPnN0b3JlX3NhbXBsZShzdCwgdmFsKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c3BpLCAmc3QtPm1zZyk7CisJbXV0ZXhfdW5sb2NrKCZkZXZfaW5mby0+bWxvY2spOworCitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9PVVRfUkFXKDAsIGFkNTQ0Nl93cml0ZSwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNTQ0Nl9zaG93X3NjYWxlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNTQ0Nl9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGRldl9pbmZvKTsKKwkvKiBDb3JyZXNwb25kcyB0byBWcmVmIC8gMl4oYml0cykgKi8KKwl1bnNpZ25lZCBpbnQgc2NhbGVfdXYgPSAoc3QtPnZyZWZfbXYgKiAxMDAwKSA+PiBzdC0+Y2hpcF9pbmZvLT5iaXRzOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWQuJWRcbiIsIHNjYWxlX3V2IC8gMTAwMCwgc2NhbGVfdXYgJSAxMDAwKTsKK30KK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIob3V0X3NjYWxlLCBTX0lSVUdPLCBhZDU0NDZfc2hvd19zY2FsZSwgTlVMTCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNTQ0Nl9zaG93X25hbWUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDU0NDZfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShkZXZfaW5mbyk7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgc3BpX2dldF9kZXZpY2VfaWQoc3QtPnNwaSktPm5hbWUpOworfQorc3RhdGljIElJT19ERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBhZDU0NDZfc2hvd19uYW1lLCBOVUxMLCAwKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkNTQ0Nl9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19kZXZfYXR0cl9vdXQwX3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfb3V0X3NjYWxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9uYW1lLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkNTQ0Nl9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWQ1NDQ2X2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFkNTQ0Nl9jaGlwX2luZm8gYWQ1NDQ2X2NoaXBfaW5mb190YmxbXSA9IHsKKwlbSURfQUQ1NDQ0XSA9IHsKKwkJLmJpdHMgPSAxMiwKKwkJLnN0b3JhZ2ViaXRzID0gMTYsCisJCS5sZWZ0X3NoaWZ0ID0gMiwKKwkJLnN0b3JlX3NhbXBsZSA9IGFkNTQ0Nl9zdG9yZV9zYW1wbGUsCisJfSwKKwlbSURfQUQ1NDQ2XSA9IHsKKwkJLmJpdHMgPSAxNCwKKwkJLnN0b3JhZ2ViaXRzID0gMTYsCisJCS5sZWZ0X3NoaWZ0ID0gMCwKKwkJLnN0b3JlX3NhbXBsZSA9IGFkNTQ0Nl9zdG9yZV9zYW1wbGUsCisJfSwKKwlbSURfQUQ1NTQyQV0gPSB7CisJCS5iaXRzID0gMTYsCisJCS5zdG9yYWdlYml0cyA9IDE2LAorCQkubGVmdF9zaGlmdCA9IDAsCisJCS5zdG9yZV9zYW1wbGUgPSBhZDU1NDJfc3RvcmVfc2FtcGxlLAorCX0sCisJW0lEX0FENTUxMkFdID0geworCQkuYml0cyA9IDEyLAorCQkuc3RvcmFnZWJpdHMgPSAxNiwKKwkJLmxlZnRfc2hpZnQgPSA0LAorCQkuc3RvcmVfc2FtcGxlID0gYWQ1NTQyX3N0b3JlX3NhbXBsZSwKKwl9LAorCVtJRF9BRDU2MjBfMjUwMF0gPSB7CisJCS5iaXRzID0gMTIsCisJCS5zdG9yYWdlYml0cyA9IDE2LAorCQkubGVmdF9zaGlmdCA9IDIsCisJCS5pbnRfdnJlZl9tdiA9IDI1MDAsCisJCS5zdG9yZV9zYW1wbGUgPSBhZDU2MjBfc3RvcmVfc2FtcGxlLAorCX0sCisJW0lEX0FENTYyMF8xMjUwXSA9IHsKKwkJLmJpdHMgPSAxMiwKKwkJLnN0b3JhZ2ViaXRzID0gMTYsCisJCS5sZWZ0X3NoaWZ0ID0gMiwKKwkJLmludF92cmVmX212ID0gMTI1MCwKKwkJLnN0b3JlX3NhbXBsZSA9IGFkNTYyMF9zdG9yZV9zYW1wbGUsCisJfSwKKwlbSURfQUQ1NjQwXzI1MDBdID0geworCQkuYml0cyA9IDE0LAorCQkuc3RvcmFnZWJpdHMgPSAxNiwKKwkJLmxlZnRfc2hpZnQgPSAwLAorCQkuaW50X3ZyZWZfbXYgPSAyNTAwLAorCQkuc3RvcmVfc2FtcGxlID0gYWQ1NjIwX3N0b3JlX3NhbXBsZSwKKwl9LAorCVtJRF9BRDU2NDBfMTI1MF0gPSB7CisJCS5iaXRzID0gMTQsCisJCS5zdG9yYWdlYml0cyA9IDE2LAorCQkubGVmdF9zaGlmdCA9IDAsCisJCS5pbnRfdnJlZl9tdiA9IDEyNTAsCisJCS5zdG9yZV9zYW1wbGUgPSBhZDU2MjBfc3RvcmVfc2FtcGxlLAorCX0sCisJW0lEX0FENTY2MF8yNTAwXSA9IHsKKwkJLmJpdHMgPSAxNiwKKwkJLnN0b3JhZ2ViaXRzID0gMjQsCisJCS5sZWZ0X3NoaWZ0ID0gMCwKKwkJLmludF92cmVmX212ID0gMjUwMCwKKwkJLnN0b3JlX3NhbXBsZSA9IGFkNTY2MF9zdG9yZV9zYW1wbGUsCisJfSwKKwlbSURfQUQ1NjYwXzEyNTBdID0geworCQkuYml0cyA9IDE2LAorCQkuc3RvcmFnZWJpdHMgPSAyNCwKKwkJLmxlZnRfc2hpZnQgPSAwLAorCQkuaW50X3ZyZWZfbXYgPSAxMjUwLAorCQkuc3RvcmVfc2FtcGxlID0gYWQ1NjYwX3N0b3JlX3NhbXBsZSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgYWQ1NDQ2X3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGFkNTQ0Nl9zdGF0ZSAqc3Q7CisJaW50IHJldCwgdm9sdGFnZV91diA9IDA7CisKKwlzdCA9IGt6YWxsb2Moc2l6ZW9mKCpzdCksIEdGUF9LRVJORUwpOworCWlmIChzdCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKworCXN0LT5yZWcgPSByZWd1bGF0b3JfZ2V0KCZzcGktPmRldiwgInZjYyIpOworCWlmICghSVNfRVJSKHN0LT5yZWcpKSB7CisJCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoc3QtPnJlZyk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3B1dF9yZWc7CisKKwkJdm9sdGFnZV91diA9IHJlZ3VsYXRvcl9nZXRfdm9sdGFnZShzdC0+cmVnKTsKKwl9CisKKwlzdC0+Y2hpcF9pbmZvID0KKwkJJmFkNTQ0Nl9jaGlwX2luZm9fdGJsW3NwaV9nZXRfZGV2aWNlX2lkKHNwaSktPmRyaXZlcl9kYXRhXTsKKworCXNwaV9zZXRfZHJ2ZGF0YShzcGksIHN0KTsKKworCXN0LT5zcGkgPSBzcGk7CisKKwlzdC0+aW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChzdC0+aW5kaW9fZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9kaXNhYmxlX3JlZzsKKwl9CisKKwkvKiBFc3RhYmlsaXNoIHRoYXQgdGhlIGlpb19kZXYgaXMgYSBjaGlsZCBvZiB0aGUgc3BpIGRldmljZSAqLworCXN0LT5pbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmc3BpLT5kZXY7CisJc3QtPmluZGlvX2Rldi0+YXR0cnMgPSAmYWQ1NDQ2X2F0dHJpYnV0ZV9ncm91cDsKKwlzdC0+aW5kaW9fZGV2LT5kZXZfZGF0YSA9ICh2b2lkICopKHN0KTsKKwlzdC0+aW5kaW9fZGV2LT5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEU7CisJc3QtPmluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCS8qIFNldHVwIGRlZmF1bHQgbWVzc2FnZSAqLworCisJc3QtPnhmZXIudHhfYnVmID0gJnN0LT5kYXRhOworCXN0LT54ZmVyLmxlbiA9IHN0LT5jaGlwX2luZm8tPnN0b3JhZ2ViaXRzIC8gODsKKworCXNwaV9tZXNzYWdlX2luaXQoJnN0LT5tc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZzdC0+eGZlciwgJnN0LT5tc2cpOworCisJc3dpdGNoIChzcGlfZ2V0X2RldmljZV9pZChzcGkpLT5kcml2ZXJfZGF0YSkgeworCQljYXNlIElEX0FENTYyMF8yNTAwOgorCQljYXNlIElEX0FENTYyMF8xMjUwOgorCQljYXNlIElEX0FENTY0MF8yNTAwOgorCQljYXNlIElEX0FENTY0MF8xMjUwOgorCQljYXNlIElEX0FENTY2MF8yNTAwOgorCQljYXNlIElEX0FENTY2MF8xMjUwOgorCQkJc3QtPnZyZWZfbXYgPSBzdC0+Y2hpcF9pbmZvLT5pbnRfdnJlZl9tdjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaWYgKHZvbHRhZ2VfdXYpCisJCQkJc3QtPnZyZWZfbXYgPSB2b2x0YWdlX3V2IC8gMTAwMDsKKwkJCWVsc2UKKwkJCQlkZXZfd2Fybigmc3BpLT5kZXYsCisJCQkJCSAicmVmZXJlbmNlIHZvbHRhZ2UgdW5zcGVjaWZpZWRcbiIpOworCX0KKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoc3QtPmluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldmljZTsKKworCXJldHVybiAwOworCitlcnJvcl9mcmVlX2RldmljZToKKwlpaW9fZnJlZV9kZXZpY2Uoc3QtPmluZGlvX2Rldik7CitlcnJvcl9kaXNhYmxlX3JlZzoKKwlpZiAoIUlTX0VSUihzdC0+cmVnKSkKKwkJcmVndWxhdG9yX2Rpc2FibGUoc3QtPnJlZyk7CitlcnJvcl9wdXRfcmVnOgorCWlmICghSVNfRVJSKHN0LT5yZWcpKQorCQlyZWd1bGF0b3JfcHV0KHN0LT5yZWcpOworCWtmcmVlKHN0KTsKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkNTQ0Nl9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWQ1NDQ2X3N0YXRlICpzdCA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBzdC0+aW5kaW9fZGV2OworCisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJaWYgKCFJU19FUlIoc3QtPnJlZykpIHsKKwkJcmVndWxhdG9yX2Rpc2FibGUoc3QtPnJlZyk7CisJCXJlZ3VsYXRvcl9wdXQoc3QtPnJlZyk7CisJfQorCWtmcmVlKHN0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIGFkNTQ0Nl9pZFtdID0geworCXsiYWQ1NDQ0IiwgSURfQUQ1NDQ0fSwKKwl7ImFkNTQ0NiIsIElEX0FENTQ0Nn0sCisJeyJhZDU1NDJhIiwgSURfQUQ1NTQyQX0sCisJeyJhZDU1MTJhIiwgSURfQUQ1NTEyQX0sCisJeyJhZDU2MjAtMjUwMCIsIElEX0FENTYyMF8yNTAwfSwgLyogQUQ1NjIwLzQwLzYwOiAqLworCXsiYWQ1NjIwLTEyNTAiLCBJRF9BRDU2MjBfMTI1MH0sIC8qIHBhcnQgbnVtYmVycyBtYXkgbG9vayBkaWZmZXJlbnRseSAqLworCXsiYWQ1NjQwLTI1MDAiLCBJRF9BRDU2NDBfMjUwMH0sCisJeyJhZDU2NDAtMTI1MCIsIElEX0FENTY0MF8xMjUwfSwKKwl7ImFkNTY2MC0yNTAwIiwgSURfQUQ1NjYwXzI1MDB9LAorCXsiYWQ1NjYwLTEyNTAiLCBJRF9BRDU2NjBfMTI1MH0sCisJe30KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhZDU0NDZfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gImFkNTQ0NiIsCisJCS5idXMJPSAmc3BpX2J1c190eXBlLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBhZDU0NDZfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChhZDU0NDZfcmVtb3ZlKSwKKwkuaWRfdGFibGUJPSBhZDU0NDZfaWQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhZDU0NDZfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZhZDU0NDZfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGFkNTQ0Nl9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGFkNTQ0Nl9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZDU0NDZfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFkNTQ0Nl9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiTWljaGFlbCBIZW5uZXJpY2ggPGhlbm5lcmljaEBibGFja2Zpbi51Y2xpbnV4Lm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQUQ1NDQ0L0FENTQ0NiBEQUMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygic3BpOmFkNTQ0NiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9kYWMvYWQ1NDQ2LmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9hZDU0NDYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDI1NDJlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kYWMvYWQ1NDQ2LmgKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIEFENTQ0NiBTUEkgREFDIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKyNpZm5kZWYgSUlPX0RBQ19BRDU0NDZfSF8KKyNkZWZpbmUgSUlPX0RBQ19BRDU0NDZfSF8KKworLyogREFDIENvbnRyb2wgQml0cyAqLworCisjZGVmaW5lIEFENTQ0Nl9MT0FECQkoMHgwIDw8IDE0KSAvKiBMb2FkIGFuZCB1cGRhdGUgKi8KKyNkZWZpbmUgQUQ1NDQ2X1NET19ESVMJCSgweDEgPDwgMTQpIC8qIERpc2FibGUgU0RPICovCisjZGVmaW5lIEFENTQ0Nl9OT1AJCSgweDIgPDwgMTQpIC8qIE5vIG9wZXJhdGlvbiAqLworI2RlZmluZSBBRDU0NDZfQ0xLX1JJU0lORwkoMHgzIDw8IDE0KSAvKiBDbG9jayBkYXRhIG9uIHJpc2luZyBlZGdlICovCisKKyNkZWZpbmUgQUQ1NjIwX0xPQUQJCSgweDAgPDwgMTQpIC8qIExvYWQgYW5kIHVwZGF0ZSBOb3JtIE9wZXJhdGlvbiovCisjZGVmaW5lIEFENTYyMF9QV1JEV05fMWsJKDB4MSA8PCAxNCkgLyogUG93ZXItZG93bjogMWtPaG0gdG8gR05EICovCisjZGVmaW5lIEFENTYyMF9QV1JEV05fMTAwawkoMHgyIDw8IDE0KSAvKiBQb3dlci1kb3duOiAxMDBrT2htIHRvIEdORCAqLworI2RlZmluZSBBRDU2MjBfUFdSRFdOX1RSSVNUQVRFCSgweDMgPDwgMTQpIC8qIFBvd2VyLWRvd246IFRocmVlLXN0YXRlICovCisKKyNkZWZpbmUgQUQ1NjYwX0xPQUQJCSgweDAgPDwgMTYpIC8qIExvYWQgYW5kIHVwZGF0ZSBOb3JtIE9wZXJhdGlvbiovCisjZGVmaW5lIEFENTY2MF9QV1JEV05fMWsJKDB4MSA8PCAxNikgLyogUG93ZXItZG93bjogMWtPaG0gdG8gR05EICovCisjZGVmaW5lIEFENTY2MF9QV1JEV05fMTAwawkoMHgyIDw8IDE2KSAvKiBQb3dlci1kb3duOiAxMDBrT2htIHRvIEdORCAqLworI2RlZmluZSBBRDU2NjBfUFdSRFdOX1RSSVNUQVRFCSgweDMgPDwgMTYpIC8qIFBvd2VyLWRvd246IFRocmVlLXN0YXRlICovCisKKyNkZWZpbmUgUkVTX01BU0soYml0cykJKCgxIDw8IChiaXRzKSkgLSAxKQorCisvKioKKyAqIHN0cnVjdCBhZDU0NDZfc3RhdGUgLSBkcml2ZXIgaW5zdGFuY2Ugc3BlY2lmaWMgZGF0YQorICogQGluZGlvX2RldjoJCXRoZSBpbmR1c3RyaWFsIEkvTyBkZXZpY2UKKyAqIEBzcGk6CQlzcGlfZGV2aWNlCisgKiBAY2hpcF9pbmZvOgkJY2hpcCBtb2RlbCBzcGVjaWZpYyBjb25zdGFudHMsIGF2YWlsYWJsZSBtb2RlcyBldGMKKyAqIEByZWc6CQlzdXBwbHkgcmVndWxhdG9yCisgKiBAcG9sbF93b3JrOgkJYm90dG9tIGhhbGYgb2YgcG9sbGluZyBpbnRlcnJ1cHQgaGFuZGxlcgorICogQHZyZWZfbXY6CQlhY3R1YWwgcmVmZXJlbmNlIHZvbHRhZ2UgdXNlZAorICogQHhmZXI6CQlkZWZhdWx0IHNwaSB0cmFuc2ZlcgorICogQG1zZzoJCWRlZmF1bHQgc3BpIG1lc3NhZ2UKKyAqIEBkYXRhOgkJc3BpIHRyYW5zbWl0IGJ1ZmZlcgorICovCisKK3N0cnVjdCBhZDU0NDZfc3RhdGUgeworCXN0cnVjdCBpaW9fZGV2CQkJKmluZGlvX2RldjsKKwlzdHJ1Y3Qgc3BpX2RldmljZQkJKnNwaTsKKwljb25zdCBzdHJ1Y3QgYWQ1NDQ2X2NoaXBfaW5mbwkqY2hpcF9pbmZvOworCXN0cnVjdCByZWd1bGF0b3IJCSpyZWc7CisJc3RydWN0IHdvcmtfc3RydWN0CQlwb2xsX3dvcms7CisJdW5zaWduZWQgc2hvcnQJCQl2cmVmX212OworCXN0cnVjdCBzcGlfdHJhbnNmZXIJCXhmZXI7CisJc3RydWN0IHNwaV9tZXNzYWdlCQltc2c7CisJdW5pb24geworCQl1bnNpZ25lZCBzaG9ydAkJZDE2OworCQl1bnNpZ25lZCBjaGFyCQlkMjRbM107CisJfSBkYXRhOworfTsKKworLyoqCisgKiBzdHJ1Y3QgYWQ1NDQ2X2NoaXBfaW5mbyAtIGNoaXAgc3BlY2lmaWMgaW5mb3JtYXRpb24KKyAqIEBiaXRzOgkJYWNjdXJhY3kgb2YgdGhlIERBQyBpbiBiaXRzCisgKiBAc3RvcmFnZWJpdHM6CW51bWJlciBvZiBiaXRzIHdyaXR0ZW4gdG8gdGhlIERBQworICogQGxlZnRfc2hpZnQ6CQludW1iZXIgb2YgYml0cyB0aGUgZGF0dW0gbXVzdCBiZSBzaGlmdGVkCisgKiBAaW50X3ZyZWZfbXY6CUFENTYyMC80MC82MDogdGhlIGludGVybmFsIHJlZmVyZW5jZSB2b2x0YWdlCisgKiBAc3RvcmVfc2FtcGxlOgljaGlwIHNwZWNpZmljIGhlbHBlciBmdW5jdGlvbiB0byBzdG9yZSB0aGUgZGF0dW0KKyAqLworCitzdHJ1Y3QgYWQ1NDQ2X2NoaXBfaW5mbyB7CisJdTgJCQkJYml0czsKKwl1OAkJCQlzdG9yYWdlYml0czsKKwl1OAkJCQlsZWZ0X3NoaWZ0OworCXUxNgkJCQlpbnRfdnJlZl9tdjsKKwl2b2lkICgqc3RvcmVfc2FtcGxlKQkJKHN0cnVjdCBhZDU0NDZfc3RhdGUgKnN0LCB1bnNpZ25lZCB2YWwpOworfTsKKworLyoqCisgKiBhZDU0NDZfc3VwcG9ydGVkX2RldmljZV9pZHM6CisgKiBUaGUgQUQ1NjIwLzQwLzYwIHBhcnRzIGFyZSBhdmFpbGFibGUgaW4gZGlmZmVyZW50IGZpeGVkIGludGVybmFsIHJlZmVyZW5jZQorICogdm9sdGFnZSBvcHRpb25zLiBUaGUgYWN0dWFsIHBhcnQgbnVtYmVycyBtYXkgbG9vayBkaWZmZXJlbnRseQorICogKGFuZCBhIGJpdCBjcnlwdGljKSwgaG93ZXZlciB0aGlzIHN0eWxlIGlzIHVzZWQgdG8gbWFrZSBjbGVhciB3aGljaAorICogcGFydHMgYXJlIHN1cHBvcnRlZCBoZXJlLgorICovCisKK2VudW0gYWQ1NDQ2X3N1cHBvcnRlZF9kZXZpY2VfaWRzIHsKKwlJRF9BRDU0NDQsCisJSURfQUQ1NDQ2LAorCUlEX0FENTU0MkEsCisJSURfQUQ1NTEyQSwKKwlJRF9BRDU2MjBfMjUwMCwKKwlJRF9BRDU2MjBfMTI1MCwKKwlJRF9BRDU2NDBfMjUwMCwKKwlJRF9BRDU2NDBfMTI1MCwKKwlJRF9BRDU2NjBfMjUwMCwKKwlJRF9BRDU2NjBfMTI1MCwKK307CisKKyNlbmRpZiAvKiBJSU9fREFDX0FENTQ0Nl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9kYWMvYWQ1NjI0ci5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kYWMvYWQ1NjI0ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNTE4YmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9hZDU2MjRyLmgKQEAgLTAsMCArMSwyMSBAQAorI2lmbmRlZiBTUElfQUQ1NjI0Ul9IXworI2RlZmluZSBTUElfQUQ1NjI0Ul9IXworCisjZGVmaW5lIEFENTYyNFJfREFDX0NIQU5ORUxTCTQKKworI2RlZmluZSBBRDU2MjRSX0FERFJfREFDMAkweDAKKyNkZWZpbmUgQUQ1NjI0Ul9BRERSX0RBQzEJMHgxCisjZGVmaW5lIEFENTYyNFJfQUREUl9EQUMyCTB4MgorI2RlZmluZSBBRDU2MjRSX0FERFJfREFDMwkweDMKKyNkZWZpbmUgQUQ1NjI0Ul9BRERSX0FMTF9EQUMJMHg3CisKKyNkZWZpbmUgQUQ1NjI0Ul9DTURfV1JJVEVfSU5QVVRfTiAgICAgICAgICAgICAweDAKKyNkZWZpbmUgQUQ1NjI0Ul9DTURfVVBEQVRFX0RBQ19OICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgQUQ1NjI0Ul9DTURfV1JJVEVfSU5QVVRfTl9VUERBVEVfQUxMICAweDIKKyNkZWZpbmUgQUQ1NjI0Ul9DTURfV1JJVEVfSU5QVVRfTl9VUERBVEVfTiAgICAweDMKKyNkZWZpbmUgQUQ1NjI0Ul9DTURfUE9XRVJET1dOX0RBQyAgICAgICAgICAgICAweDQKKyNkZWZpbmUgQUQ1NjI0Ul9DTURfUkVTRVQgICAgICAgICAgICAgICAgICAgICAweDUKKyNkZWZpbmUgQUQ1NjI0Ul9DTURfTERBQ19TRVRVUCAgICAgICAgICAgICAgICAweDYKKyNkZWZpbmUgQUQ1NjI0Ul9DTURfSU5URVJOQUxfUkVGRVJfU0VUVVAgICAgICAweDcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9hZDU2MjRyX3NwaS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kYWMvYWQ1NjI0cl9zcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjFjNmRkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kYWMvYWQ1NjI0cl9zcGkuYwpAQCAtMCwwICsxLDMwMCBAQAorLyoKKyAqIEFENTYyNFIsIEFENTY0NFIsIEFENTY2NFIgRGlnaXRhbCB0byBhbmFsb2cgY29udmVydG9ycyBzcGkgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorI2luY2x1ZGUgImRhYy5oIgorI2luY2x1ZGUgImFkNTYyNHIuaCIKKworLyoqCisgKiBzdHJ1Y3QgYWQ1NjI0cl9zdGF0ZSAtIGRldmljZSByZWxhdGVkIHN0b3JhZ2UKKyAqIEBpbmRpb19kZXY6CWFzc29jaWF0ZWQgaW5kdXN0cmlhbCBJTyBkZXZpY2UKKyAqIEB1czoJCXNwaSBkZXZpY2UKKyAqKi8KK3N0cnVjdCBhZDU2MjRyX3N0YXRlIHsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OworCXN0cnVjdCBzcGlfZGV2aWNlICp1czsKKwlpbnQgZGF0YV9sZW47CisJaW50IGxkYWNfbW9kZTsKKwlpbnQgZGFjX3Bvd2VyX21vZGVbQUQ1NjI0Ul9EQUNfQ0hBTk5FTFNdOworCWludCBpbnRlcm5hbF9yZWY7Cit9OworCitzdGF0aWMgaW50IGFkNTYyNHJfc3BpX3dyaXRlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkgICAgIHU4IGNtZCwgdTggYWRkciwgdTE2IHZhbCwgdTggbGVuKQoreworCXUzMiBkYXRhOworCXU4IG1zZ1szXTsKKworCS8qCisJICogVGhlIGlucHV0IHNoaWZ0IHJlZ2lzdGVyIGlzIDI0IGJpdHMgd2lkZS4gVGhlIGZpcnN0IHR3byBiaXRzIGFyZSBkb24ndCBjYXJlIGJpdHMuCisJICogVGhlIG5leHQgdGhyZWUgYXJlIHRoZSBjb21tYW5kIGJpdHMsIEMyIHRvIEMwLCBmb2xsb3dlZCBieSB0aGUgMy1iaXQgREFDIGFkZHJlc3MsCisJICogQTIgdG8gQTAsIGFuZCB0aGVuIHRoZSAxNi0sIDE0LSwgMTItYml0IGRhdGEtd29yZC4gVGhlIGRhdGEtd29yZCBjb21wcmlzZXMgdGhlIDE2LSwKKwkgKiAxNC0sIDEyLWJpdCBpbnB1dCBjb2RlIGZvbGxvd2VkIGJ5IDAsIDIsIG9yIDQgZG9uJ3QgY2FyZSBiaXRzLCBmb3IgdGhlIEFENTY2NFIsCisJICogQUQ1NjQ0UiwgYW5kIEFENTYyNFIsIHJlc3BlY3RpdmVseS4KKwkgKi8KKwlkYXRhID0gKDAgPDwgMjIpIHwgKGNtZCA8PCAxOSkgfCAoYWRkciA8PCAxNikgfCAodmFsIDw8ICgxNiAtIGxlbikpOworCW1zZ1swXSA9IGRhdGEgPj4gMTY7CisJbXNnWzFdID0gZGF0YSA+PiA4OworCW1zZ1syXSA9IGRhdGE7CisKKwlyZXR1cm4gc3BpX3dyaXRlKHNwaSwgbXNnLCAzKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ1NjI0cl93cml0ZV9kYWMoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCWxvbmcgcmVhZGluOworCWludCByZXQ7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDU2MjRyX3N0YXRlICpzdCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCisJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmcmVhZGluKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gYWQ1NjI0cl9zcGlfd3JpdGUoc3QtPnVzLCBBRDU2MjRSX0NNRF9XUklURV9JTlBVVF9OX1VQREFURV9OLAorCQkJCXRoaXNfYXR0ci0+YWRkcmVzcywgcmVhZGluLCBzdC0+ZGF0YV9sZW4pOworCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNTYyNHJfcmVhZF9sZGFjX21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDU2MjRyX3N0YXRlICpzdCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIleFxuIiwgc3QtPmxkYWNfbW9kZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNTYyNHJfd3JpdGVfbGRhY19tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlsb25nIHJlYWRpbjsKKwlpbnQgcmV0OworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ1NjI0cl9zdGF0ZSAqc3QgPSBpbmRpb19kZXYtPmRldl9kYXRhOworCisJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDE2LCAmcmVhZGluKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gYWQ1NjI0cl9zcGlfd3JpdGUoc3QtPnVzLCBBRDU2MjRSX0NNRF9MREFDX1NFVFVQLCAwLAorCQkJCXJlYWRpbiAmIDB4RiwgMTYpOworCXN0LT5sZGFjX21vZGUgPSByZWFkaW4gJiAweEY7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBhZDU2MjRyX3JlYWRfZGFjX3Bvd2VyX21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ1NjI0cl9zdGF0ZSAqc3QgPSBpbmRpb19kZXYtPmRldl9kYXRhOworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBzdC0+ZGFjX3Bvd2VyX21vZGVbdGhpc19hdHRyLT5hZGRyZXNzXSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNTYyNHJfd3JpdGVfZGFjX3Bvd2VyX21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJbG9uZyByZWFkaW47CisJaW50IHJldDsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNTYyNHJfc3RhdGUgKnN0ID0gaW5kaW9fZGV2LT5kZXZfZGF0YTsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZyZWFkaW4pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBhZDU2MjRyX3NwaV93cml0ZShzdC0+dXMsIEFENTYyNFJfQ01EX1BPV0VSRE9XTl9EQUMsIDAsCisJCQkJKChyZWFkaW4gJiAweDMpIDw8IDQpIHwKKwkJCQkoMSA8PCB0aGlzX2F0dHItPmFkZHJlc3MpLCAxNik7CisKKwlzdC0+ZGFjX3Bvd2VyX21vZGVbdGhpc19hdHRyLT5hZGRyZXNzXSA9IHJlYWRpbiAmIDB4MzsKKworCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNTYyNHJfcmVhZF9pbnRlcm5hbF9yZWZfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDU2MjRyX3N0YXRlICpzdCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgc3QtPmludGVybmFsX3JlZik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNTYyNHJfd3JpdGVfaW50ZXJuYWxfcmVmX21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJbG9uZyByZWFkaW47CisJaW50IHJldDsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNTYyNHJfc3RhdGUgKnN0ID0gaW5kaW9fZGV2LT5kZXZfZGF0YTsKKworCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnJlYWRpbik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGFkNTYyNHJfc3BpX3dyaXRlKHN0LT51cywgQUQ1NjI0Ul9DTURfSU5URVJOQUxfUkVGRVJfU0VUVVAsIDAsCisJCQkJISFyZWFkaW4sIDE2KTsKKworCXN0LT5pbnRlcm5hbF9yZWYgPSAhIXJlYWRpbjsKKworCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfT1VUX1JBVygwLCBhZDU2MjRyX3dyaXRlX2RhYywgQUQ1NjI0Ul9BRERSX0RBQzApOworc3RhdGljIElJT19ERVZfQVRUUl9PVVRfUkFXKDEsIGFkNTYyNHJfd3JpdGVfZGFjLCBBRDU2MjRSX0FERFJfREFDMSk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX09VVF9SQVcoMiwgYWQ1NjI0cl93cml0ZV9kYWMsIEFENTYyNFJfQUREUl9EQUMyKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfT1VUX1JBVygzLCBhZDU2MjRyX3dyaXRlX2RhYywgQUQ1NjI0Ul9BRERSX0RBQzMpOworCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGxkYWNfbW9kZSwgU19JUlVHTyB8IFNfSVdVU1IsIGFkNTYyNHJfcmVhZF9sZGFjX21vZGUsCisJCSAgICAgICBhZDU2MjRyX3dyaXRlX2xkYWNfbW9kZSwgMCk7CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGludGVybmFsX3JlZiwgU19JUlVHTyB8IFNfSVdVU1IsCisJCSAgICAgICBhZDU2MjRyX3JlYWRfaW50ZXJuYWxfcmVmX21vZGUsCisJCSAgICAgICBhZDU2MjRyX3dyaXRlX2ludGVybmFsX3JlZl9tb2RlLCAwKTsKKworI2RlZmluZSBJSU9fREVWX0FUVFJfREFDX1BPV0VSX01PREUoX251bSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCQkJXAorCUlJT19ERVZJQ0VfQVRUUihkYWNfcG93ZXJfbW9kZV8jI19udW0sIFNfSVJVR08gfCBTX0lXVVNSLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworc3RhdGljIElJT19ERVZfQVRUUl9EQUNfUE9XRVJfTU9ERSgwLCBhZDU2MjRyX3JlYWRfZGFjX3Bvd2VyX21vZGUsCisJCQkJICAgYWQ1NjI0cl93cml0ZV9kYWNfcG93ZXJfbW9kZSwgMCk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0RBQ19QT1dFUl9NT0RFKDEsIGFkNTYyNHJfcmVhZF9kYWNfcG93ZXJfbW9kZSwKKwkJCQkgICBhZDU2MjRyX3dyaXRlX2RhY19wb3dlcl9tb2RlLCAxKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfREFDX1BPV0VSX01PREUoMiwgYWQ1NjI0cl9yZWFkX2RhY19wb3dlcl9tb2RlLAorCQkJCSAgIGFkNTYyNHJfd3JpdGVfZGFjX3Bvd2VyX21vZGUsIDIpOworc3RhdGljIElJT19ERVZfQVRUUl9EQUNfUE9XRVJfTU9ERSgzLCBhZDU2MjRyX3JlYWRfZGFjX3Bvd2VyX21vZGUsCisJCQkJICAgYWQ1NjI0cl93cml0ZV9kYWNfcG93ZXJfbW9kZSwgMyk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZDU2MjRyX2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2Rldl9hdHRyX291dDBfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9vdXQxX3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfb3V0Ml9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX291dDNfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9kYWNfcG93ZXJfbW9kZV8wLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9kYWNfcG93ZXJfbW9kZV8xLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9kYWNfcG93ZXJfbW9kZV8yLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9kYWNfcG93ZXJfbW9kZV8zLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9sZGFjX21vZGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2ludGVybmFsX3JlZi5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDU2MjRyX2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZDU2MjRyX2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZDU2MjRyX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGFkNTYyNHJfc3RhdGUgKnN0OworCWludCByZXQgPSAwOworCisJc3QgPSBremFsbG9jKHNpemVvZigqc3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJc3BpX3NldF9kcnZkYXRhKHNwaSwgc3QpOworCisJc3QtPmRhdGFfbGVuID0gc3BpX2dldF9kZXZpY2VfaWQoc3BpKS0+ZHJpdmVyX2RhdGE7CisKKwlzdC0+dXMgPSBzcGk7CisJc3QtPmluZGlvX2RldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoc3QtPmluZGlvX2RldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9zdDsKKwl9CisJc3QtPmluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZzcGktPmRldjsKKwlzdC0+aW5kaW9fZGV2LT5udW1faW50ZXJydXB0X2xpbmVzID0gMDsKKwlzdC0+aW5kaW9fZGV2LT5ldmVudF9hdHRycyA9IE5VTEw7CisKKwlzdC0+aW5kaW9fZGV2LT5hdHRycyA9ICZhZDU2MjRyX2F0dHJpYnV0ZV9ncm91cDsKKwlzdC0+aW5kaW9fZGV2LT5kZXZfZGF0YSA9ICh2b2lkICopKHN0KTsKKwlzdC0+aW5kaW9fZGV2LT5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEU7CisJc3QtPmluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoc3QtPmluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldjsKKworCXNwaS0+bW9kZSA9IFNQSV9NT0RFXzA7CisJc3BpX3NldHVwKHNwaSk7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfZnJlZV9kZXY6CisJaWlvX2ZyZWVfZGV2aWNlKHN0LT5pbmRpb19kZXYpOworZXJyb3JfZnJlZV9zdDoKKwlrZnJlZShzdCk7CitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYWQ1NjI0cl9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWQ1NjI0cl9zdGF0ZSAqc3QgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihzdC0+aW5kaW9fZGV2KTsKKwlrZnJlZShzdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIGFkNTYyNHJfaWRbXSA9IHsKKwl7ImFkNTYyNHIiLCAxMn0sCisJeyJhZDU2NDRyIiwgMTR9LAorCXsiYWQ1NjY0ciIsIDE2fSwKKwl7fQorfTsKKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFkNTYyNHJfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCSAgIC5uYW1lID0gImFkNTYyNHIiLAorCQkgICAub3duZXIgPSBUSElTX01PRFVMRSwKKwkJICAgfSwKKwkucHJvYmUgPSBhZDU2MjRyX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZDU2MjRyX3JlbW92ZSksCisJLmlkX3RhYmxlID0gYWQ1NjI0cl9pZCwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGFkNTYyNHJfc3BpX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmYWQ1NjI0cl9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoYWQ1NjI0cl9zcGlfaW5pdCk7CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBhZDU2MjRyX3NwaV9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZDU2MjRyX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhZDU2MjRyX3NwaV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQmFycnkgU29uZyA8MjFjbmJhb0BnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFENTYyNC80NC82NFIgREFDIHNwaSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL2RhYy5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kYWMvZGFjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ4MmYzNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL2RhYy5oCkBAIC0wLDAgKzEsNiBAQAorLyoKKyAqIGRhYy5oIC0gc3lzZnMgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggREFDcworICovCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX09VVF9SQVcoX251bSwgX3N0b3JlLCBfYWRkcikJCQkJXAorCUlJT19ERVZJQ0VfQVRUUihvdXQjI19udW0jI19yYXcsIFNfSVdVU1IsIE5VTEwsIF9zdG9yZSwgX2FkZHIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kZHMvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDQ3ZGE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kZHMvS2NvbmZpZwpAQCAtMCwwICsxLDU2IEBACisjCisjIERpcmVjdCBEaWdpdGFsIFN5bnRoZXNpcyBkcml2ZXJzCisjCitjb21tZW50ICJEaXJlY3QgRGlnaXRhbCBTeW50aGVzaXMiCisKK2NvbmZpZyBBRDU5MzAKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgYWQ1OTMwLzU5MzIgZHJpdmVyIgorCWRlcGVuZHMgb24gU1BJCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIEREUyBjaGlwCisJICBhZDU5MzAvYWQ1OTMyLCBwcm92aWRlcyBkaXJlY3QgYWNjZXNzIHZpYSBzeXNmcy4KKworY29uZmlnIEFEOTgzMgorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBhZDk4MzIvNSBkcml2ZXIiCisJZGVwZW5kcyBvbiBTUEkKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgRERTIGNoaXAKKwkgIGFkOTgzMiBhbmQgYWQ5ODM1LCBwcm92aWRlcyBkaXJlY3QgYWNjZXNzIHZpYSBzeXNmcy4KKworY29uZmlnIEFEOTgzNAorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBhZDk4MzMvNC8gZHJpdmVyIgorCWRlcGVuZHMgb24gU1BJCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIEREUyBjaGlwCisJICBBRDk4MzMgYW5kIEFEOTgzNCwgcHJvdmlkZXMgZGlyZWN0IGFjY2VzcyB2aWEgc3lzZnMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFkOTgzNC4KKworY29uZmlnIEFEOTg1MAorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBhZDk4NTAvMSBkcml2ZXIiCisJZGVwZW5kcyBvbiBTUEkKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgRERTIGNoaXAKKwkgIGFkOTg1MC8xLCBwcm92aWRlcyBkaXJlY3QgYWNjZXNzIHZpYSBzeXNmcy4KKworY29uZmlnIEFEOTg1MgorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBhZDk4NTIvNCBkcml2ZXIiCisJZGVwZW5kcyBvbiBTUEkKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgRERTIGNoaXAKKwkgIGFkOTg1Mi80LCBwcm92aWRlcyBkaXJlY3QgYWNjZXNzIHZpYSBzeXNmcy4KKworY29uZmlnIEFEOTkxMAorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBhZDk5MTAgZHJpdmVyIgorCWRlcGVuZHMgb24gU1BJCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIEREUyBjaGlwCisJICBhZDk5MTAsIHByb3ZpZGVzIGRpcmVjdCBhY2Nlc3MgdmlhIHN5c2ZzLgorCitjb25maWcgQUQ5OTUxCisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIGFkOTk1MSBkcml2ZXIiCisJZGVwZW5kcyBvbiBTUEkKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgRERTIGNoaXAKKwkgIGFkOTk1MSwgcHJvdmlkZXMgZGlyZWN0IGFjY2VzcyB2aWEgc3lzZnMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0Nzc0NjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9NYWtlZmlsZQpAQCAtMCwwICsxLDExIEBACisjCisjIE1ha2VmaWxlIGZvciBEaXJlY3QgRGlnaXRhbCBTeW50aGVzaXMgZHJpdmVycworIworCitvYmotJChDT05GSUdfQUQ1OTMwKSArPSBhZDU5MzAubworb2JqLSQoQ09ORklHX0FEOTgzMikgKz0gYWQ5ODMyLm8KK29iai0kKENPTkZJR19BRDk4MzQpICs9IGFkOTgzNC5vCitvYmotJChDT05GSUdfQUQ5ODUwKSArPSBhZDk4NTAubworb2JqLSQoQ09ORklHX0FEOTg1MikgKz0gYWQ5ODUyLm8KK29iai0kKENPTkZJR19BRDk5MTApICs9IGFkOTkxMC5vCitvYmotJChDT05GSUdfQUQ5OTUxKSArPSBhZDk5NTEubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9kZHMvYWQ1OTMwLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9hZDU5MzAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODAwMzljCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kZHMvYWQ1OTMwLmMKQEAgLTAsMCArMSwxNzAgQEAKKy8qCisgKiBEcml2ZXIgZm9yIEFESSBEaXJlY3QgRGlnaXRhbCBTeW50aGVzaXMgYWQ1OTMwCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisKKyNkZWZpbmUgRFJWX05BTUUgImFkNTkzMCIKKworI2RlZmluZSB2YWx1ZV9tYXNrICh1MTYpMHhmMDAwCisjZGVmaW5lIGFkZHJfc2hpZnQgMTIKKworLyogUmVnaXN0ZXIgZm9ybWF0OiA0IGJpdHMgYWRkciArIDEyIGJpdHMgdmFsdWUgKi8KK3N0cnVjdCBhZDU5MDNfY29uZmlnIHsKKwl1MTYgY29udHJvbDsKKwl1MTYgaW5jbnVtOworCXUxNiBmcnFkZWx0WzJdOworCXUxNiBpbmNpdHZsOworCXUxNiBidXJpdHZsOworCXUxNiBzdHJ0ZnJxWzJdOworfTsKKworc3RydWN0IGFkNTkzMF9zdGF0ZSB7CisJc3RydWN0IG11dGV4IGxvY2s7CisJc3RydWN0IGlpb19kZXYgKmlkZXY7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNkZXY7Cit9OworCitzdGF0aWMgc3NpemVfdCBhZDU5MzBfc2V0X3BhcmFtZXRlcihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQljb25zdCBjaGFyICpidWYsCisJCQkJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXI7CisJaW50IHJldDsKKwlzdHJ1Y3QgYWQ1OTAzX2NvbmZpZyAqY29uZmlnID0gKHN0cnVjdCBhZDU5MDNfY29uZmlnICopYnVmOworCXN0cnVjdCBpaW9fZGV2ICppZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNTkzMF9zdGF0ZSAqc3QgPSBpZGV2LT5kZXZfZGF0YTsKKworCWNvbmZpZy0+Y29udHJvbCA9IChjb25maWctPmNvbnRyb2wgJiB+dmFsdWVfbWFzayk7CisJY29uZmlnLT5pbmNudW0gPSAoY29uZmlnLT5jb250cm9sICYgfnZhbHVlX21hc2spIHwgKDEgPDwgYWRkcl9zaGlmdCk7CisJY29uZmlnLT5mcnFkZWx0WzBdID0gKGNvbmZpZy0+Y29udHJvbCAmIH52YWx1ZV9tYXNrKSB8ICgyIDw8IGFkZHJfc2hpZnQpOworCWNvbmZpZy0+ZnJxZGVsdFsxXSA9IChjb25maWctPmNvbnRyb2wgJiB+dmFsdWVfbWFzaykgfCAzIDw8IGFkZHJfc2hpZnQ7CisJY29uZmlnLT5pbmNpdHZsID0gKGNvbmZpZy0+Y29udHJvbCAmIH52YWx1ZV9tYXNrKSB8IDQgPDwgYWRkcl9zaGlmdDsKKwljb25maWctPmJ1cml0dmwgPSAoY29uZmlnLT5jb250cm9sICYgfnZhbHVlX21hc2spIHwgOCA8PCBhZGRyX3NoaWZ0OworCWNvbmZpZy0+c3RydGZycVswXSA9IChjb25maWctPmNvbnRyb2wgJiB+dmFsdWVfbWFzaykgfCAweGMgPDwgYWRkcl9zaGlmdDsKKwljb25maWctPnN0cnRmcnFbMV0gPSAoY29uZmlnLT5jb250cm9sICYgfnZhbHVlX21hc2spIHwgMHhkIDw8IGFkZHJfc2hpZnQ7CisKKwl4ZmVyLmxlbiA9IGxlbjsKKwl4ZmVyLnR4X2J1ZiA9IGNvbmZpZzsKKwltdXRleF9sb2NrKCZzdC0+bG9jayk7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CitlcnJvcl9yZXQ6CisJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGRkcywgU19JV1VTUiwgTlVMTCwgYWQ1OTMwX3NldF9wYXJhbWV0ZXIsIDApOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWQ1OTMwX2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2Rldl9hdHRyX2Rkcy5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDU5MzBfYXR0cmlidXRlX2dyb3VwID0geworCS5uYW1lID0gRFJWX05BTUUsCisJLmF0dHJzID0gYWQ1OTMwX2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZDU5MzBfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWQ1OTMwX3N0YXRlICpzdDsKKwlpbnQgcmV0ID0gMDsKKworCXN0ID0ga3phbGxvYyhzaXplb2YoKnN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCXNwaV9zZXRfZHJ2ZGF0YShzcGksIHN0KTsKKworCW11dGV4X2luaXQoJnN0LT5sb2NrKTsKKwlzdC0+c2RldiA9IHNwaTsKKworCXN0LT5pZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChzdC0+aWRldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9zdDsKKwl9CisJc3QtPmlkZXYtPmRldi5wYXJlbnQgPSAmc3BpLT5kZXY7CisJc3QtPmlkZXYtPm51bV9pbnRlcnJ1cHRfbGluZXMgPSAwOworCXN0LT5pZGV2LT5ldmVudF9hdHRycyA9IE5VTEw7CisKKwlzdC0+aWRldi0+YXR0cnMgPSAmYWQ1OTMwX2F0dHJpYnV0ZV9ncm91cDsKKwlzdC0+aWRldi0+ZGV2X2RhdGEgPSAodm9pZCAqKShzdCk7CisJc3QtPmlkZXYtPmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRTsKKwlzdC0+aWRldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoc3QtPmlkZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisJc3BpLT5tYXhfc3BlZWRfaHogPSAyMDAwMDAwOworCXNwaS0+bW9kZSA9IFNQSV9NT0RFXzM7CisJc3BpLT5iaXRzX3Blcl93b3JkID0gMTY7CisJc3BpX3NldHVwKHNwaSk7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfZnJlZV9kZXY6CisJaWlvX2ZyZWVfZGV2aWNlKHN0LT5pZGV2KTsKK2Vycm9yX2ZyZWVfc3Q6CisJa2ZyZWUoc3QpOworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkNTkzMF9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWQ1OTMwX3N0YXRlICpzdCA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCisJaWlvX2RldmljZV91bnJlZ2lzdGVyKHN0LT5pZGV2KTsKKwlrZnJlZShzdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFkNTkzMF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBEUlZfTkFNRSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhZDU5MzBfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFkNTkzMF9yZW1vdmUpLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWQ1OTMwX3NwaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFkNTkzMF9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoYWQ1OTMwX3NwaV9pbml0KTsKKworc3RhdGljIF9fZXhpdCB2b2lkIGFkNTkzMF9zcGlfZXhpdCh2b2lkKQoreworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYWQ1OTMwX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhZDU5MzBfc3BpX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJDbGlmZiBDYWkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgYWQ1OTMwIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9kZHMvYWQ5ODMyLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9hZDk4MzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTExODkzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kZHMvYWQ5ODMyLmMKQEAgLTAsMCArMSwyNjQgQEAKKy8qCisgKiBEcml2ZXIgZm9yIEFESSBEaXJlY3QgRGlnaXRhbCBTeW50aGVzaXMgYWQ5ODMyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorCisjZGVmaW5lIERSVl9OQU1FICJhZDk4MzIiCisKKyNkZWZpbmUgdmFsdWVfbWFzayAodTE2KTB4ZjAwMAorI2RlZmluZSBjbWRfc2hpZnQgMTIKKyNkZWZpbmUgYWRkX3NoaWZ0IDgKKyNkZWZpbmUgQUQ5ODMyX1NZTkMgKDEgPDwgMTMpCisjZGVmaW5lIEFEOTgzMl9TRUxTUkMgKDEgPDwgMTIpCisjZGVmaW5lIEFEOTgzMl9TTEVFUCAoMSA8PCAxMykKKyNkZWZpbmUgQUQ5ODMyX1JFU0VUICgxIDw8IDEyKQorI2RlZmluZSBBRDk4MzJfQ0xSICgxIDw8IDExKQorCisjZGVmaW5lIEFERF9GUkVRMExMIDB4MAorI2RlZmluZSBBRERfRlJFUTBITCAweDEKKyNkZWZpbmUgQUREX0ZSRVEwTE0gMHgyCisjZGVmaW5lIEFERF9GUkVRMEhNIDB4MworI2RlZmluZSBBRERfRlJFUTFMTCAweDQKKyNkZWZpbmUgQUREX0ZSRVExSEwgMHg1CisjZGVmaW5lIEFERF9GUkVRMUxNIDB4NgorI2RlZmluZSBBRERfRlJFUTFITSAweDcKKyNkZWZpbmUgQUREX1BIQVNFMEwgMHg4CisjZGVmaW5lIEFERF9QSEFTRTBIIDB4OQorI2RlZmluZSBBRERfUEhBU0UxTCAweGEKKyNkZWZpbmUgQUREX1BIQVNFMUggMHhiCisjZGVmaW5lIEFERF9QSEFTRTJMIDB4YworI2RlZmluZSBBRERfUEhBU0UySCAweGQKKyNkZWZpbmUgQUREX1BIQVNFM0wgMHhlCisjZGVmaW5lIEFERF9QSEFTRTNIIDB4ZgorCisjZGVmaW5lIENNRF9QSEE4QklUU1cgMHgxCisjZGVmaW5lIENNRF9QSEExNkJJVFNXIDB4MAorI2RlZmluZSBDTURfRlJFOEJJVFNXIDB4MworI2RlZmluZSBDTURfRlJFMTZCSVRTVyAweDIKKyNkZWZpbmUgQ01EX1NFTEJJVFNDVEwgMHg2CisKK3N0cnVjdCBhZDk4MzJfc2V0dGluZyB7CisJdTE2IGZyZXEwWzRdOworCXUxNiBmcmVxMVs0XTsKKwl1MTYgcGhhc2UwWzJdOworCXUxNiBwaGFzZTFbMl07CisJdTE2IHBoYXNlMlsyXTsKKwl1MTYgcGhhc2UzWzJdOworfTsKKworc3RydWN0IGFkOTgzMl9zdGF0ZSB7CisJc3RydWN0IG11dGV4IGxvY2s7CisJc3RydWN0IGlpb19kZXYgKmlkZXY7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNkZXY7Cit9OworCitzdGF0aWMgc3NpemVfdCBhZDk4MzJfc2V0X3BhcmFtZXRlcihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQljb25zdCBjaGFyICpidWYsCisJCQkJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXI7CisJaW50IHJldDsKKwlzdHJ1Y3QgYWQ5ODMyX3NldHRpbmcgY29uZmlnOworCXN0cnVjdCBpaW9fZGV2ICppZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkOTgzMl9zdGF0ZSAqc3QgPSBpZGV2LT5kZXZfZGF0YTsKKworCWNvbmZpZy5mcmVxMFswXSA9IChDTURfRlJFOEJJVFNXIDw8IGFkZF9zaGlmdCB8IEFERF9GUkVRMExMIDw8IGFkZF9zaGlmdCB8IGJ1ZlswXSk7CisJY29uZmlnLmZyZXEwWzFdID0gKENNRF9GUkUxNkJJVFNXIDw8IGFkZF9zaGlmdCB8IEFERF9GUkVRMEhMIDw8IGFkZF9zaGlmdCB8IGJ1ZlsxXSk7CisJY29uZmlnLmZyZXEwWzJdID0gKENNRF9GUkU4QklUU1cgPDwgYWRkX3NoaWZ0IHwgQUREX0ZSRVEwTE0gPDwgYWRkX3NoaWZ0IHwgYnVmWzJdKTsKKwljb25maWcuZnJlcTBbM10gPSAoQ01EX0ZSRTE2QklUU1cgPDwgYWRkX3NoaWZ0IHwgQUREX0ZSRVEwSE0gPDwgYWRkX3NoaWZ0IHwgYnVmWzNdKTsKKwljb25maWcuZnJlcTFbMF0gPSAoQ01EX0ZSRThCSVRTVyA8PCBhZGRfc2hpZnQgfCBBRERfRlJFUTFMTCA8PCBhZGRfc2hpZnQgfCBidWZbNF0pOworCWNvbmZpZy5mcmVxMVsxXSA9IChDTURfRlJFMTZCSVRTVyA8PCBhZGRfc2hpZnQgfCBBRERfRlJFUTFITCA8PCBhZGRfc2hpZnQgfCBidWZbNV0pOworCWNvbmZpZy5mcmVxMVsyXSA9IChDTURfRlJFOEJJVFNXIDw8IGFkZF9zaGlmdCB8IEFERF9GUkVRMUxNIDw8IGFkZF9zaGlmdCB8IGJ1Zls2XSk7CisJY29uZmlnLmZyZXExWzNdID0gKENNRF9GUkUxNkJJVFNXIDw8IGFkZF9zaGlmdCB8IEFERF9GUkVRMUhNIDw8IGFkZF9zaGlmdCB8IGJ1Zls3XSk7CisKKwljb25maWcucGhhc2UwWzBdID0gKENNRF9QSEE4QklUU1cgPDwgYWRkX3NoaWZ0IHwgQUREX1BIQVNFMEwgPDwgYWRkX3NoaWZ0IHwgYnVmWzldKTsKKwljb25maWcucGhhc2UwWzFdID0gKENNRF9QSEExNkJJVFNXIDw8IGFkZF9zaGlmdCB8IEFERF9QSEFTRTBIIDw8IGFkZF9zaGlmdCB8IGJ1ZlsxMF0pOworCWNvbmZpZy5waGFzZTFbMF0gPSAoQ01EX1BIQThCSVRTVyA8PCBhZGRfc2hpZnQgfCBBRERfUEhBU0UxTCA8PCBhZGRfc2hpZnQgfCBidWZbMTFdKTsKKwljb25maWcucGhhc2UxWzFdID0gKENNRF9QSEExNkJJVFNXIDw8IGFkZF9zaGlmdCB8IEFERF9QSEFTRTFIIDw8IGFkZF9zaGlmdCB8IGJ1ZlsxMl0pOworCWNvbmZpZy5waGFzZTJbMF0gPSAoQ01EX1BIQThCSVRTVyA8PCBhZGRfc2hpZnQgfCBBRERfUEhBU0UyTCA8PCBhZGRfc2hpZnQgfCBidWZbMTNdKTsKKwljb25maWcucGhhc2UyWzFdID0gKENNRF9QSEExNkJJVFNXIDw8IGFkZF9zaGlmdCB8IEFERF9QSEFTRTJIIDw8IGFkZF9zaGlmdCB8IGJ1ZlsxNF0pOworCWNvbmZpZy5waGFzZTNbMF0gPSAoQ01EX1BIQThCSVRTVyA8PCBhZGRfc2hpZnQgfCBBRERfUEhBU0UzTCA8PCBhZGRfc2hpZnQgfCBidWZbMTVdKTsKKwljb25maWcucGhhc2UzWzFdID0gKENNRF9QSEExNkJJVFNXIDw8IGFkZF9zaGlmdCB8IEFERF9QSEFTRTNIIDw8IGFkZF9zaGlmdCB8IGJ1ZlsxNl0pOworCisJeGZlci5sZW4gPSAyICogbGVuOworCXhmZXIudHhfYnVmID0gJmNvbmZpZzsKKwltdXRleF9sb2NrKCZzdC0+bG9jayk7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CitlcnJvcl9yZXQ6CisJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGRkcywgU19JV1VTUiwgTlVMTCwgYWQ5ODMyX3NldF9wYXJhbWV0ZXIsIDApOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWQ5ODMyX2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2Rldl9hdHRyX2Rkcy5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDk4MzJfYXR0cmlidXRlX2dyb3VwID0geworCS5uYW1lID0gRFJWX05BTUUsCisJLmF0dHJzID0gYWQ5ODMyX2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgdm9pZCBhZDk4MzJfaW5pdChzdHJ1Y3QgYWQ5ODMyX3N0YXRlICpzdCkKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcjsKKwlpbnQgcmV0OworCXUxNiBjb25maWcgPSAwOworCisJY29uZmlnID0gMHgzIDw8IDE0IHwgQUQ5ODMyX1NMRUVQIHwgQUQ5ODMyX1JFU0VUIHwgQUQ5ODMyX0NMUjsKKworCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKKworCXhmZXIubGVuID0gMjsKKwl4ZmVyLnR4X2J1ZiA9ICZjb25maWc7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwljb25maWcgPSAweDIgPDwgMTQgfCBBRDk4MzJfU1lOQyB8IEFEOTgzMl9TRUxTUkM7CisJeGZlci5sZW4gPSAyOworCXhmZXIudHhfYnVmID0gJmNvbmZpZzsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCWNvbmZpZyA9IENNRF9TRUxCSVRTQ1RMIDw8IGNtZF9zaGlmdDsKKwl4ZmVyLmxlbiA9IDI7CisJeGZlci50eF9idWYgPSAmY29uZmlnOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJY29uZmlnID0gMHgzIDw8IDE0OworCisJeGZlci5sZW4gPSAyOworCXhmZXIudHhfYnVmID0gJmNvbmZpZzsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKworCisKK30KKworc3RhdGljIGludCBfX2RldmluaXQgYWQ5ODMyX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGFkOTgzMl9zdGF0ZSAqc3Q7CisJaW50IHJldCA9IDA7CisKKwlzdCA9IGt6YWxsb2Moc2l6ZW9mKCpzdCksIEdGUF9LRVJORUwpOworCWlmIChzdCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwlzcGlfc2V0X2RydmRhdGEoc3BpLCBzdCk7CisKKwltdXRleF9pbml0KCZzdC0+bG9jayk7CisJc3QtPnNkZXYgPSBzcGk7CisKKwlzdC0+aWRldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoc3QtPmlkZXYgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfc3Q7CisJfQorCXN0LT5pZGV2LT5kZXYucGFyZW50ID0gJnNwaS0+ZGV2OworCXN0LT5pZGV2LT5udW1faW50ZXJydXB0X2xpbmVzID0gMDsKKwlzdC0+aWRldi0+ZXZlbnRfYXR0cnMgPSBOVUxMOworCisJc3QtPmlkZXYtPmF0dHJzID0gJmFkOTgzMl9hdHRyaWJ1dGVfZ3JvdXA7CisJc3QtPmlkZXYtPmRldl9kYXRhID0gKHZvaWQgKikoc3QpOworCXN0LT5pZGV2LT5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEU7CisJc3QtPmlkZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKHN0LT5pZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2OworCXNwaS0+bWF4X3NwZWVkX2h6ID0gMjAwMDAwMDsKKwlzcGktPm1vZGUgPSBTUElfTU9ERV8zOworCXNwaS0+Yml0c19wZXJfd29yZCA9IDE2OworCXNwaV9zZXR1cChzcGkpOworCWFkOTgzMl9pbml0KHN0KTsKKwlyZXR1cm4gMDsKKworZXJyb3JfZnJlZV9kZXY6CisJaWlvX2ZyZWVfZGV2aWNlKHN0LT5pZGV2KTsKK2Vycm9yX2ZyZWVfc3Q6CisJa2ZyZWUoc3QpOworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkOTgzMl9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWQ5ODMyX3N0YXRlICpzdCA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCisJaWlvX2RldmljZV91bnJlZ2lzdGVyKHN0LT5pZGV2KTsKKwlrZnJlZShzdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFkOTgzMl9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBEUlZfTkFNRSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhZDk4MzJfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFkOTgzMl9yZW1vdmUpLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWQ5ODMyX3NwaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFkOTgzMl9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoYWQ5ODMyX3NwaV9pbml0KTsKKworc3RhdGljIF9fZXhpdCB2b2lkIGFkOTgzMl9zcGlfZXhpdCh2b2lkKQoreworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYWQ5ODMyX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhZDk4MzJfc3BpX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJDbGlmZiBDYWkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgYWQ5ODMyIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9kZHMvYWQ5ODM0LmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9hZDk4MzQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjFhNjgxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kZHMvYWQ5ODM0LmMKQEAgLTAsMCArMSw0NzcgQEAKKy8qCisgKiBBRDk4MzQgU1BJIERBQyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKyNpbmNsdWRlICJkZHMuaCIKKworI2luY2x1ZGUgImFkOTgzNC5oIgorCitzdGF0aWMgdW5zaWduZWQgaW50IGFkOTgzNF9jYWxjX2ZyZXFyZWcodW5zaWduZWQgbG9uZyBtY2xrLCB1bnNpZ25lZCBsb25nIGZvdXQpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIGZyZXFyZWcgPSAodTY0KSBmb3V0ICogKHU2NCkgKDEgPDwgQUQ5ODM0X0ZSRVFfQklUUyk7CisJZG9fZGl2KGZyZXFyZWcsIG1jbGspOworCXJldHVybiBmcmVxcmVnOworfQorCitzdGF0aWMgaW50IGFkOTgzNF93cml0ZV9mcmVxdWVuY3koc3RydWN0IGFkOTgzNF9zdGF0ZSAqc3QsCisJCQkJICB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZm91dCkKK3sKKwl1bnNpZ25lZCBsb25nIHJlZ3ZhbDsKKworCWlmIChmb3V0ID4gKHN0LT5tY2xrIC8gMikpCisJCXJldHVybiAtRUlOVkFMOworCisJcmVndmFsID0gYWQ5ODM0X2NhbGNfZnJlcXJlZyhzdC0+bWNsaywgZm91dCk7CisKKwlzdC0+ZnJlcV9kYXRhWzBdID0gY3B1X3RvX2JlMTYoYWRkciB8IChyZWd2YWwgJgorCQkJCSAgICAgICBSRVNfTUFTSyhBRDk4MzRfRlJFUV9CSVRTIC8gMikpKTsKKwlzdC0+ZnJlcV9kYXRhWzFdID0gY3B1X3RvX2JlMTYoYWRkciB8ICgocmVndmFsID4+CisJCQkJICAgICAgIChBRDk4MzRfRlJFUV9CSVRTIC8gMikpICYKKwkJCQkgICAgICAgUkVTX01BU0soQUQ5ODM0X0ZSRVFfQklUUyAvIDIpKSk7CisKKwlyZXR1cm4gc3BpX3N5bmMoc3QtPnNwaSwgJnN0LT5mcmVxX21zZyk7OworfQorCitzdGF0aWMgaW50IGFkOTgzNF93cml0ZV9waGFzZShzdHJ1Y3QgYWQ5ODM0X3N0YXRlICpzdCwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBwaGFzZSkKK3sKKwlpZiAocGhhc2UgPiAoMSA8PCBBRDk4MzRfUEhBU0VfQklUUykpCisJCXJldHVybiAtRUlOVkFMOworCXN0LT5kYXRhID0gY3B1X3RvX2JlMTYoYWRkciB8IHBoYXNlKTsKKworCXJldHVybiBzcGlfc3luYyhzdC0+c3BpLCAmc3QtPm1zZyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkOTgzNF93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkOTgzNF9zdGF0ZSAqc3QgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCWludCByZXQ7CisJbG9uZyB2YWw7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCW11dGV4X2xvY2soJmRldl9pbmZvLT5tbG9jayk7CisJc3dpdGNoICh0aGlzX2F0dHItPmFkZHJlc3MpIHsKKwljYXNlIEFEOTgzNF9SRUdfRlJFUTA6CisJY2FzZSBBRDk4MzRfUkVHX0ZSRVExOgorCQlyZXQgPSBhZDk4MzRfd3JpdGVfZnJlcXVlbmN5KHN0LCB0aGlzX2F0dHItPmFkZHJlc3MsIHZhbCk7CisJCWJyZWFrOworCWNhc2UgQUQ5ODM0X1JFR19QSEFTRTA6CisJY2FzZSBBRDk4MzRfUkVHX1BIQVNFMToKKwkJcmV0ID0gYWQ5ODM0X3dyaXRlX3BoYXNlKHN0LCB0aGlzX2F0dHItPmFkZHJlc3MsIHZhbCk7CisJCWJyZWFrOworCWNhc2UgQUQ5ODM0X09QQklURU46CisJCWlmIChzdC0+Y29udHJvbCAmIEFEOTgzNF9NT0RFKSB7CisJCQlyZXQgPSAtRUlOVkFMOyAgLyogQUQ5ODQzIHJlc2VydmVkIG1vZGUgKi8KKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHZhbCkKKwkJCXN0LT5jb250cm9sIHw9IEFEOTgzNF9PUEJJVEVOOworCQllbHNlCisJCQlzdC0+Y29udHJvbCAmPSB+QUQ5ODM0X09QQklURU47CisKKwkJc3QtPmRhdGEgPSBjcHVfdG9fYmUxNihBRDk4MzRfUkVHX0NNRCB8IHN0LT5jb250cm9sKTsKKwkJcmV0ID0gc3BpX3N5bmMoc3QtPnNwaSwgJnN0LT5tc2cpOworCQlicmVhazsKKwljYXNlIEFEOTgzNF9QSU5fU1c6CisJCWlmICh2YWwpCisJCQlzdC0+Y29udHJvbCB8PSBBRDk4MzRfUElOX1NXOworCQllbHNlCisJCQlzdC0+Y29udHJvbCAmPSB+QUQ5ODM0X1BJTl9TVzsKKwkJc3QtPmRhdGEgPSBjcHVfdG9fYmUxNihBRDk4MzRfUkVHX0NNRCB8IHN0LT5jb250cm9sKTsKKwkJcmV0ID0gc3BpX3N5bmMoc3QtPnNwaSwgJnN0LT5tc2cpOworCQlicmVhazsKKwljYXNlIEFEOTgzNF9GU0VMOgorCWNhc2UgQUQ5ODM0X1BTRUw6CisJCWlmICh2YWwgPT0gMCkKKwkJCXN0LT5jb250cm9sICY9IH4odGhpc19hdHRyLT5hZGRyZXNzIHwgQUQ5ODM0X1BJTl9TVyk7CisJCWVsc2UgaWYgKHZhbCA9PSAxKSB7CisJCQlzdC0+Y29udHJvbCB8PSB0aGlzX2F0dHItPmFkZHJlc3M7CisJCQlzdC0+Y29udHJvbCAmPSB+QUQ5ODM0X1BJTl9TVzsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlzdC0+ZGF0YSA9IGNwdV90b19iZTE2KEFEOTgzNF9SRUdfQ01EIHwgc3QtPmNvbnRyb2wpOworCQlyZXQgPSBzcGlfc3luYyhzdC0+c3BpLCAmc3QtPm1zZyk7CisJCWJyZWFrOworCWNhc2UgQUQ5ODM0X1JFU0VUOgorCQlpZiAodmFsKQorCQkJc3QtPmNvbnRyb2wgJj0gfkFEOTgzNF9SRVNFVDsKKwkJZWxzZQorCQkJc3QtPmNvbnRyb2wgfD0gQUQ5ODM0X1JFU0VUOworCisJCXN0LT5kYXRhID0gY3B1X3RvX2JlMTYoQUQ5ODM0X1JFR19DTUQgfCBzdC0+Y29udHJvbCk7CisJCXJldCA9IHNwaV9zeW5jKHN0LT5zcGksICZzdC0+bXNnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT0RFVjsKKwl9CisJbXV0ZXhfdW5sb2NrKCZkZXZfaW5mby0+bWxvY2spOworCitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgYWQ5ODM0X3N0b3JlX3dhdmV0eXBlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ5ODM0X3N0YXRlICpzdCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisJaW50IHJldCA9IDA7CisJYm9vbCBpc19hZDk4MzMgPSBzdC0+ZGV2aWQgPT0gSURfQUQ5ODMzOworCisJbXV0ZXhfbG9jaygmZGV2X2luZm8tPm1sb2NrKTsKKworCXN3aXRjaCAodGhpc19hdHRyLT5hZGRyZXNzKSB7CisJY2FzZSAwOgorCQlpZiAoc3lzZnNfc3RyZXEoYnVmLCAic2luZSIpKSB7CisJCQlzdC0+Y29udHJvbCAmPSB+QUQ5ODM0X01PREU7CisJCQlpZiAoaXNfYWQ5ODMzKQorCQkJCXN0LT5jb250cm9sICY9IH5BRDk4MzRfT1BCSVRFTjsKKwkJfSBlbHNlIGlmIChzeXNmc19zdHJlcShidWYsICJ0cmlhbmdsZSIpKSB7CisJCQlpZiAoaXNfYWQ5ODMzKSB7CisJCQkJc3QtPmNvbnRyb2wgJj0gfkFEOTgzNF9PUEJJVEVOOworCQkJCXN0LT5jb250cm9sIHw9IEFEOTgzNF9NT0RFOworCQkJfSBlbHNlIGlmIChzdC0+Y29udHJvbCAmIEFEOTgzNF9PUEJJVEVOKSB7CisJCQkJcmV0ID0gLUVJTlZBTDsJLyogQUQ5ODQzIHJlc2VydmVkIG1vZGUgKi8KKwkJCX0gZWxzZSB7CisJCQkJc3QtPmNvbnRyb2wgfD0gQUQ5ODM0X01PREU7CisJCQl9CisJCX0gZWxzZSBpZiAoaXNfYWQ5ODMzICYmIHN5c2ZzX3N0cmVxKGJ1ZiwgInNxdWFyZSIpKSB7CisJCQlzdC0+Y29udHJvbCAmPSB+QUQ5ODM0X01PREU7CisJCQlzdC0+Y29udHJvbCB8PSBBRDk4MzRfT1BCSVRFTjsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCX0KKworCQlicmVhazsKKwljYXNlIDE6CisJCWlmIChzeXNmc19zdHJlcShidWYsICJzcXVhcmUiKSAmJgorCQkJIShzdC0+Y29udHJvbCAmIEFEOTgzNF9NT0RFKSkgeworCQkJc3QtPmNvbnRyb2wgJj0gfkFEOTgzNF9NT0RFOworCQkJc3QtPmNvbnRyb2wgfD0gQUQ5ODM0X09QQklURU47CisJCX0gZWxzZSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCWlmICghcmV0KSB7CisJCXN0LT5kYXRhID0gY3B1X3RvX2JlMTYoQUQ5ODM0X1JFR19DTUQgfCBzdC0+Y29udHJvbCk7CisJCXJldCA9IHNwaV9zeW5jKHN0LT5zcGksICZzdC0+bXNnKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZkZXZfaW5mby0+bWxvY2spOworCisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgYWQ5ODM0X3Nob3dfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSBjaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkOTgzNF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGRldl9pbmZvKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBzcGlfZ2V0X2RldmljZV9pZChzdC0+c3BpKS0+bmFtZSk7Cit9CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIGFkOTgzNF9zaG93X25hbWUsIE5VTEwsIDApOworCitzdGF0aWMgc3NpemVfdCBhZDk4MzRfc2hvd19vdXQwX3dhdmV0eXBlX2F2YWlsYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ5ODM0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoZGV2X2luZm8pOworCWNoYXIgKnN0cjsKKworCWlmIChzdC0+ZGV2aWQgPT0gSURfQUQ5ODMzKQorCQlzdHIgPSAic2luZSB0cmlhbmdsZSBzcXVhcmUiOworCWVsc2UgaWYgKHN0LT5jb250cm9sICYgQUQ5ODM0X09QQklURU4pCisJCXN0ciA9ICJzaW5lIjsKKwllbHNlCisJCXN0ciA9ICJzaW5lIHRyaWFuZ2xlIjsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBzdHIpOworfQorCisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoZGRzMF9vdXQwX3dhdmV0eXBlX2F2YWlsYWJsZSwgU19JUlVHTywKKwkJICAgICAgIGFkOTgzNF9zaG93X291dDBfd2F2ZXR5cGVfYXZhaWxhYmxlLCBOVUxMLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWQ5ODM0X3Nob3dfb3V0MV93YXZldHlwZV9hdmFpbGFibGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkOTgzNF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGRldl9pbmZvKTsKKwljaGFyICpzdHI7CisKKwlpZiAoc3QtPmNvbnRyb2wgJiBBRDk4MzRfTU9ERSkKKwkJc3RyID0gIiI7CisJZWxzZQorCQlzdHIgPSAic3F1YXJlIjsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBzdHIpOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGRkczBfb3V0MV93YXZldHlwZV9hdmFpbGFibGUsIFNfSVJVR08sCisJCSAgICAgICBhZDk4MzRfc2hvd19vdXQxX3dhdmV0eXBlX2F2YWlsYWJsZSwgTlVMTCwgMCk7CisKKy8qKgorICogc2VlIGRkcy5oIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uCisgKi8KKworc3RhdGljIElJT19ERVZfQVRUUl9GUkVRKDAsIDAsIFNfSVdVU1IsIE5VTEwsIGFkOTgzNF93cml0ZSwgQUQ5ODM0X1JFR19GUkVRMCk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0ZSRVEoMCwgMSwgU19JV1VTUiwgTlVMTCwgYWQ5ODM0X3dyaXRlLCBBRDk4MzRfUkVHX0ZSRVExKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfRlJFUVNZTUJPTCgwLCBTX0lXVVNSLCBOVUxMLCBhZDk4MzRfd3JpdGUsIEFEOTgzNF9GU0VMKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUl9GUkVRX1NDQUxFKDAsICIxIik7IC8qIDFIeiAqLworCitzdGF0aWMgSUlPX0RFVl9BVFRSX1BIQVNFKDAsIDAsIFNfSVdVU1IsIE5VTEwsIGFkOTgzNF93cml0ZSwgQUQ5ODM0X1JFR19QSEFTRTApOworc3RhdGljIElJT19ERVZfQVRUUl9QSEFTRSgwLCAxLCBTX0lXVVNSLCBOVUxMLCBhZDk4MzRfd3JpdGUsIEFEOTgzNF9SRUdfUEhBU0UxKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfUEhBU0VTWU1CT0woMCwgU19JV1VTUiwgTlVMTCwgYWQ5ODM0X3dyaXRlLCBBRDk4MzRfUFNFTCk7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFJfUEhBU0VfU0NBTEUoMCwgIjAuMDAxNTMzOTgwOCIpOyAvKiAyUEkvMl4xMiByYWQqLworCitzdGF0aWMgSUlPX0RFVl9BVFRSX1BJTkNPTlRST0xfRU4oMCwgU19JV1VTUiwgTlVMTCwKKwlhZDk4MzRfd3JpdGUsIEFEOTgzNF9QSU5fU1cpOworc3RhdGljIElJT19ERVZfQVRUUl9PVVRfRU5BQkxFKDAsIFNfSVdVU1IsIE5VTEwsIGFkOTgzNF93cml0ZSwgQUQ5ODM0X1JFU0VUKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfT1VUWV9FTkFCTEUoMCwgMSwgU19JV1VTUiwgTlVMTCwKKwlhZDk4MzRfd3JpdGUsIEFEOTgzNF9PUEJJVEVOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfT1VUX1dBVkVUWVBFKDAsIDAsIGFkOTgzNF9zdG9yZV93YXZldHlwZSwgMCk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX09VVF9XQVZFVFlQRSgwLCAxLCBhZDk4MzRfc3RvcmVfd2F2ZXR5cGUsIDEpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWQ5ODM0X2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2Rldl9hdHRyX2RkczBfZnJlcTAuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2RkczBfZnJlcTEuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfZGRzMF9mcmVxX3NjYWxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9kZHMwX3BoYXNlMC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZGRzMF9waGFzZTEuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfZGRzMF9waGFzZV9zY2FsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZGRzMF9waW5jb250cm9sX2VuLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9kZHMwX2ZyZXFzeW1ib2wuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2RkczBfcGhhc2VzeW1ib2wuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2RkczBfb3V0X2VuYWJsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZGRzMF9vdXQxX2VuYWJsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZGRzMF9vdXQwX3dhdmV0eXBlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9kZHMwX291dDFfd2F2ZXR5cGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2RkczBfb3V0MF93YXZldHlwZV9hdmFpbGFibGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2RkczBfb3V0MV93YXZldHlwZV9hdmFpbGFibGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX25hbWUuZGV2X2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIG1vZGVfdCBhZDk4MzRfYXR0cl9pc192aXNpYmxlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSAgICAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgaW50IG4pCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDk4MzRfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShkZXZfaW5mbyk7CisKKwltb2RlX3QgbW9kZSA9IGF0dHItPm1vZGU7CisKKwlpZiAoc3QtPmRldmlkID09IElEX0FEOTgzNCkKKwkJcmV0dXJuIG1vZGU7CisKKwlpZiAoKGF0dHIgPT0gJmlpb19kZXZfYXR0cl9kZHMwX291dDFfZW5hYmxlLmRldl9hdHRyLmF0dHIpIHx8CisJCShhdHRyID09ICZpaW9fZGV2X2F0dHJfZGRzMF9vdXQxX3dhdmV0eXBlLmRldl9hdHRyLmF0dHIpIHx8CisJCShhdHRyID09CisJCSZpaW9fZGV2X2F0dHJfZGRzMF9vdXQxX3dhdmV0eXBlX2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyKSkKKwkJbW9kZSA9IDA7CisKKwlyZXR1cm4gbW9kZTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWQ5ODM0X2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZDk4MzRfYXR0cmlidXRlcywKKwkuaXNfdmlzaWJsZSA9IGFkOTgzNF9hdHRyX2lzX3Zpc2libGUsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZDk4MzRfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWQ5ODM0X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gc3BpLT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgYWQ5ODM0X3N0YXRlICpzdDsKKwlpbnQgcmV0OworCisJaWYgKCFwZGF0YSkgeworCQlkZXZfZGJnKCZzcGktPmRldiwgIm5vIHBsYXRmb3JtIGRhdGE/XG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJc3QgPSBremFsbG9jKHNpemVvZigqc3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisKKwlzdC0+cmVnID0gcmVndWxhdG9yX2dldCgmc3BpLT5kZXYsICJ2Y2MiKTsKKwlpZiAoIUlTX0VSUihzdC0+cmVnKSkgeworCQlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKHN0LT5yZWcpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl9wdXRfcmVnOworCX0KKworCXN0LT5tY2xrID0gcGRhdGEtPm1jbGs7CisKKwlzcGlfc2V0X2RydmRhdGEoc3BpLCBzdCk7CisKKwlzdC0+c3BpID0gc3BpOworCXN0LT5kZXZpZCA9IHNwaV9nZXRfZGV2aWNlX2lkKHNwaSktPmRyaXZlcl9kYXRhOworCisJc3QtPmluZGlvX2RldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoc3QtPmluZGlvX2RldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZGlzYWJsZV9yZWc7CisJfQorCisJc3QtPmluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZzcGktPmRldjsKKwlzdC0+aW5kaW9fZGV2LT5hdHRycyA9ICZhZDk4MzRfYXR0cmlidXRlX2dyb3VwOworCXN0LT5pbmRpb19kZXYtPmRldl9kYXRhID0gKHZvaWQgKikgc3Q7CisJc3QtPmluZGlvX2Rldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCXN0LT5pbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwkvKiBTZXR1cCBkZWZhdWx0IG1lc3NhZ2VzICovCisKKwlzdC0+eGZlci50eF9idWYgPSAmc3QtPmRhdGE7CisJc3QtPnhmZXIubGVuID0gMjsKKworCXNwaV9tZXNzYWdlX2luaXQoJnN0LT5tc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZzdC0+eGZlciwgJnN0LT5tc2cpOworCisJc3QtPmZyZXFfeGZlclswXS50eF9idWYgPSAmc3QtPmZyZXFfZGF0YVswXTsKKwlzdC0+ZnJlcV94ZmVyWzBdLmxlbiA9IDI7CisJc3QtPmZyZXFfeGZlclswXS5jc19jaGFuZ2UgPSAxOworCXN0LT5mcmVxX3hmZXJbMV0udHhfYnVmID0gJnN0LT5mcmVxX2RhdGFbMV07CisJc3QtPmZyZXFfeGZlclsxXS5sZW4gPSAyOworCisJc3BpX21lc3NhZ2VfaW5pdCgmc3QtPmZyZXFfbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmc3QtPmZyZXFfeGZlclswXSwgJnN0LT5mcmVxX21zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnN0LT5mcmVxX3hmZXJbMV0sICZzdC0+ZnJlcV9tc2cpOworCisJc3QtPmNvbnRyb2wgPSBBRDk4MzRfQjI4IHwgQUQ5ODM0X1JFU0VUOworCisJaWYgKCFwZGF0YS0+ZW5fZGl2MikKKwkJc3QtPmNvbnRyb2wgfD0gQUQ5ODM0X0RJVjI7CisKKwlpZiAoIXBkYXRhLT5lbl9zaWduYml0X21zYl9vdXQgJiYgKHN0LT5kZXZpZCA9PSBJRF9BRDk4MzQpKQorCQlzdC0+Y29udHJvbCB8PSBBRDk4MzRfU0lHTl9QSUI7CisKKwlzdC0+ZGF0YSA9IGNwdV90b19iZTE2KEFEOTgzNF9SRUdfQ01EIHwgc3QtPmNvbnRyb2wpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zcGksICZzdC0+bXNnKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiZGV2aWNlIGluaXQgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJvcl9mcmVlX2RldmljZTsKKwl9CisKKwlyZXQgPSBhZDk4MzRfd3JpdGVfZnJlcXVlbmN5KHN0LCBBRDk4MzRfUkVHX0ZSRVEwLCBwZGF0YS0+ZnJlcTApOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXZpY2U7CisKKwlyZXQgPSBhZDk4MzRfd3JpdGVfZnJlcXVlbmN5KHN0LCBBRDk4MzRfUkVHX0ZSRVExLCBwZGF0YS0+ZnJlcTEpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXZpY2U7CisKKwlyZXQgPSBhZDk4MzRfd3JpdGVfcGhhc2Uoc3QsIEFEOTgzNF9SRUdfUEhBU0UwLCBwZGF0YS0+cGhhc2UwKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2aWNlOworCisJcmV0ID0gYWQ5ODM0X3dyaXRlX3BoYXNlKHN0LCBBRDk4MzRfUkVHX1BIQVNFMSwgcGRhdGEtPnBoYXNlMSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldmljZTsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoc3QtPmluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldmljZTsKKworCXJldHVybiAwOworCitlcnJvcl9mcmVlX2RldmljZToKKwlpaW9fZnJlZV9kZXZpY2Uoc3QtPmluZGlvX2Rldik7CitlcnJvcl9kaXNhYmxlX3JlZzoKKwlpZiAoIUlTX0VSUihzdC0+cmVnKSkKKwkJcmVndWxhdG9yX2Rpc2FibGUoc3QtPnJlZyk7CitlcnJvcl9wdXRfcmVnOgorCWlmICghSVNfRVJSKHN0LT5yZWcpKQorCQlyZWd1bGF0b3JfcHV0KHN0LT5yZWcpOworCWtmcmVlKHN0KTsKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhZDk4MzRfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGFkOTgzNF9zdGF0ZSAqc3QgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihzdC0+aW5kaW9fZGV2KTsKKwlpZiAoIUlTX0VSUihzdC0+cmVnKSkgeworCQlyZWd1bGF0b3JfZGlzYWJsZShzdC0+cmVnKTsKKwkJcmVndWxhdG9yX3B1dChzdC0+cmVnKTsKKwl9CisJa2ZyZWUoc3QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNwaV9kZXZpY2VfaWQgYWQ5ODM0X2lkW10gPSB7CisJeyJhZDk4MzMiLCBJRF9BRDk4MzN9LAorCXsiYWQ5ODM0IiwgSURfQUQ5ODM0fSwKKwl7fQorfTsKKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFkOTgzNF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAiYWQ5ODM0IiwKKwkJLmJ1cwk9ICZzcGlfYnVzX3R5cGUsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IGFkOTgzNF9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGFkOTgzNF9yZW1vdmUpLAorCS5pZF90YWJsZQk9IGFkOTgzNF9pZCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFkOTgzNF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFkOTgzNF9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoYWQ5ODM0X2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgYWQ5ODM0X2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmFkOTgzNF9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoYWQ5ODM0X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNaWNoYWVsIEhlbm5lcmljaCA8aGVubmVyaWNoQGJsYWNrZmluLnVjbGludXgub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBBRDk4MzMvQUQ5ODM0IEREUyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTKCJzcGk6YWQ5ODM0Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9hZDk4MzQuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL2FkOTgzNC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYzNiODgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9hZDk4MzQuaApAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIEFEOTgzNCBTUEkgRERTIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKyNpZm5kZWYgSUlPX0REU19BRDk4MzRfSF8KKyNkZWZpbmUgSUlPX0REU19BRDk4MzRfSF8KKworLyogUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgQUQ5ODM0X1JFR19DTUQJCSgwIDw8IDE0KQorI2RlZmluZSBBRDk4MzRfUkVHX0ZSRVEwCSgxIDw8IDE0KQorI2RlZmluZSBBRDk4MzRfUkVHX0ZSRVExCSgyIDw8IDE0KQorI2RlZmluZSBBRDk4MzRfUkVHX1BIQVNFMAkoNiA8PCAxMykKKyNkZWZpbmUgQUQ5ODM0X1JFR19QSEFTRTEJKDcgPDwgMTMpCisKKy8qIENvbW1hbmQgQ29udHJvbCBCaXRzICovCisKKyNkZWZpbmUgQUQ5ODM0X0IyOAkJKDEgPDwgMTMpCisjZGVmaW5lIEFEOTgzNF9ITEIJCSgxIDw8IDEyKQorI2RlZmluZSBBRDk4MzRfRlNFTAkJKDEgPDwgMTEpCisjZGVmaW5lIEFEOTgzNF9QU0VMCQkoMSA8PCAxMCkKKyNkZWZpbmUgQUQ5ODM0X1BJTl9TVwkJKDEgPDwgOSkKKyNkZWZpbmUgQUQ5ODM0X1JFU0VUCQkoMSA8PCA4KQorI2RlZmluZSBBRDk4MzRfU0xFRVAxCQkoMSA8PCA3KQorI2RlZmluZSBBRDk4MzRfU0xFRVAxMgkJKDEgPDwgNikKKyNkZWZpbmUgQUQ5ODM0X09QQklURU4JCSgxIDw8IDUpCisjZGVmaW5lIEFEOTgzNF9TSUdOX1BJQgkJKDEgPDwgNCkKKyNkZWZpbmUgQUQ5ODM0X0RJVjIJCSgxIDw8IDMpCisjZGVmaW5lIEFEOTgzNF9NT0RFCQkoMSA8PCAxKQorCisjZGVmaW5lIEFEOTgzNF9GUkVRX0JJVFMJMjgKKyNkZWZpbmUgQUQ5ODM0X1BIQVNFX0JJVFMJMTIKKworI2RlZmluZSBSRVNfTUFTSyhiaXRzKQkoKDEgPDwgKGJpdHMpKSAtIDEpCisKKy8qKgorICogc3RydWN0IGFkOTgzNF9zdGF0ZSAtIGRyaXZlciBpbnN0YW5jZSBzcGVjaWZpYyBkYXRhCisgKiBAaW5kaW9fZGV2OgkJdGhlIGluZHVzdHJpYWwgSS9PIGRldmljZQorICogQHNwaToJCXNwaV9kZXZpY2UKKyAqIEByZWc6CQlzdXBwbHkgcmVndWxhdG9yCisgKiBAbWNsazoJCWV4dGVybmFsIG1hc3RlciBjbG9jaworICogQGNvbnRyb2w6CQljYWNoZWQgY29udHJvbCB3b3JkCisgKiBAeGZlcjoJCWRlZmF1bHQgc3BpIHRyYW5zZmVyCisgKiBAbXNnOgkJZGVmYXVsdCBzcGkgbWVzc2FnZQorICogQGZyZXFfeGZlcjoJCXR1bmluZyB3b3JkIHNwaSB0cmFuc2ZlcgorICogQGZyZXFfbXNnOgkJdHVuaW5nIHdvcmQgc3BpIG1lc3NhZ2UKKyAqIEBkYXRhOgkJc3BpIHRyYW5zbWl0IGJ1ZmZlcgorICogQGZyZXFfZGF0YToJCXR1bmluZyB3b3JkIHNwaSB0cmFuc21pdCBidWZmZXIKKyAqLworCitzdHJ1Y3QgYWQ5ODM0X3N0YXRlIHsKKwlzdHJ1Y3QgaWlvX2RldgkJCSppbmRpb19kZXY7CisJc3RydWN0IHNwaV9kZXZpY2UJCSpzcGk7CisJc3RydWN0IHJlZ3VsYXRvcgkJKnJlZzsKKwl1bnNpZ25lZCBpbnQJCQltY2xrOworCXVuc2lnbmVkIHNob3J0CQkJY29udHJvbDsKKwl1bnNpZ25lZCBzaG9ydAkJCWRldmlkOworCXN0cnVjdCBzcGlfdHJhbnNmZXIJCXhmZXI7CisJc3RydWN0IHNwaV9tZXNzYWdlCQltc2c7CisJc3RydWN0IHNwaV90cmFuc2ZlcgkJZnJlcV94ZmVyWzJdOworCXN0cnVjdCBzcGlfbWVzc2FnZQkJZnJlcV9tc2c7CisKKwkvKgorCSAqIERNQSAodGh1cyBjYWNoZSBjb2hlcmVuY3kgbWFpbnRlbmFuY2UpIHJlcXVpcmVzIHRoZQorCSAqIHRyYW5zZmVyIGJ1ZmZlcnMgdG8gbGl2ZSBpbiB0aGVpciBvd24gY2FjaGUgbGluZXMuCisJICovCisJdW5zaWduZWQgc2hvcnQJCQlkYXRhIF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKKwl1bnNpZ25lZCBzaG9ydAkJCWZyZXFfZGF0YVsyXSA7Cit9OworCisKKy8qCisgKiBUT0RPOiBzdHJ1Y3QgYWQ3ODg3X3BsYXRmb3JtX2RhdGEgbmVlZHMgdG8gZ28gaW50byBpbmNsdWRlL2xpbnV4L2lpbworICovCisKKy8qKgorICogc3RydWN0IGFkOTgzNF9wbGF0Zm9ybV9kYXRhIC0gcGxhdGZvcm0gc3BlY2lmaWMgaW5mb3JtYXRpb24KKyAqIEBtY2xrOgkJbWFzdGVyIGNsb2NrIGluIEh6CisgKiBAZnJlcTA6CQlwb3dlciB1cCBmcmVxMCB0dW5pbmcgd29yZCBpbiBIegorICogQGZyZXExOgkJcG93ZXIgdXAgZnJlcTEgdHVuaW5nIHdvcmQgaW4gSHoKKyAqIEBwaGFzZTA6CQlwb3dlciB1cCBwaGFzZTAgdmFsdWUgWzAuLjQwOTVdIGNvcnJlbGF0ZXMgd2l0aCAwLi4yUEkKKyAqIEBwaGFzZTE6CQlwb3dlciB1cCBwaGFzZTEgdmFsdWUgWzAuLjQwOTVdIGNvcnJlbGF0ZXMgd2l0aCAwLi4yUEkKKyAqIEBlbl9kaXYyOgkJZGlnaXRhbCBvdXRwdXQvMiBpcyBwYXNzZWQgdG8gdGhlIFNJR04gQklUIE9VVCBwaW4KKyAqIEBlbl9zaWduYml0X21zYl9vdXQ6CXRoZSBNU0IgKG9yIE1TQi8yKSBvZiB0aGUgREFDIGRhdGEgaXMgY29ubmVjdGVkIHRvIHRoZQorICoJCQlTSUdOIEJJVCBPVVQgcGluLiBlbl9kaXYyIGNvbnRyb2xzIHdoZXRoZXIgaXQgaXMgdGhlIE1TQgorICoJCQlvciBNU0IvMiB0aGF0IGlzIG91dHB1dC4gaWYgZW5fc2lnbmJpdF9tc2Jfb3V0PWZhbHNlLAorICoJCQl0aGUgb24tYm9hcmQgY29tcGFyYXRvciBpcyBjb25uZWN0ZWQgdG8gU0lHTiBCSVQgT1VUCisgKi8KKworc3RydWN0IGFkOTgzNF9wbGF0Zm9ybV9kYXRhIHsKKwl1bnNpZ25lZCBpbnQJCW1jbGs7CisJdW5zaWduZWQgaW50CQlmcmVxMDsKKwl1bnNpZ25lZCBpbnQJCWZyZXExOworCXVuc2lnbmVkIHNob3J0CQlwaGFzZTA7CisJdW5zaWduZWQgc2hvcnQJCXBoYXNlMTsKKwlib29sCQkJZW5fZGl2MjsKKwlib29sCQkJZW5fc2lnbmJpdF9tc2Jfb3V0OworfTsKKworLyoqCisgKiBhZDk4MzRfc3VwcG9ydGVkX2RldmljZV9pZHM6CisgKi8KKworZW51bSBhZDk4MzRfc3VwcG9ydGVkX2RldmljZV9pZHMgeworCUlEX0FEOTgzMywKKwlJRF9BRDk4MzQsCit9OworCisjZW5kaWYgLyogSUlPX0REU19BRDk4MzRfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL2FkOTg1MC5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kZHMvYWQ5ODUwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI1OWJmZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL2FkOTg1MC5jCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogRHJpdmVyIGZvciBBREkgRGlyZWN0IERpZ2l0YWwgU3ludGhlc2lzIGFkOTg1MAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorCisjZGVmaW5lIERSVl9OQU1FICJhZDk4NTAiCisKKyNkZWZpbmUgdmFsdWVfbWFzayAodTE2KTB4ZjAwMAorI2RlZmluZSBhZGRyX3NoaWZ0IDEyCisKKy8qIFJlZ2lzdGVyIGZvcm1hdDogNCBiaXRzIGFkZHIgKyAxMiBiaXRzIHZhbHVlICovCitzdHJ1Y3QgYWQ5ODUwX2NvbmZpZyB7CisJdTggY29udHJvbFs1XTsKK307CisKK3N0cnVjdCBhZDk4NTBfc3RhdGUgeworCXN0cnVjdCBtdXRleCBsb2NrOworCXN0cnVjdCBpaW9fZGV2ICppZGV2OworCXN0cnVjdCBzcGlfZGV2aWNlICpzZGV2OworfTsKKworc3RhdGljIHNzaXplX3QgYWQ5ODUwX3NldF9wYXJhbWV0ZXIoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJY29uc3QgY2hhciAqYnVmLAorCQkJCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyOworCWludCByZXQ7CisJc3RydWN0IGFkOTg1MF9jb25maWcgKmNvbmZpZyA9IChzdHJ1Y3QgYWQ5ODUwX2NvbmZpZyAqKWJ1ZjsKKwlzdHJ1Y3QgaWlvX2RldiAqaWRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDk4NTBfc3RhdGUgKnN0ID0gaWRldi0+ZGV2X2RhdGE7CisKKwl4ZmVyLmxlbiA9IGxlbjsKKwl4ZmVyLnR4X2J1ZiA9IGNvbmZpZzsKKwltdXRleF9sb2NrKCZzdC0+bG9jayk7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CitlcnJvcl9yZXQ6CisJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGRkcywgU19JV1VTUiwgTlVMTCwgYWQ5ODUwX3NldF9wYXJhbWV0ZXIsIDApOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWQ5ODUwX2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2Rldl9hdHRyX2Rkcy5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDk4NTBfYXR0cmlidXRlX2dyb3VwID0geworCS5uYW1lID0gRFJWX05BTUUsCisJLmF0dHJzID0gYWQ5ODUwX2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZDk4NTBfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWQ5ODUwX3N0YXRlICpzdDsKKwlpbnQgcmV0ID0gMDsKKworCXN0ID0ga3phbGxvYyhzaXplb2YoKnN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCXNwaV9zZXRfZHJ2ZGF0YShzcGksIHN0KTsKKworCW11dGV4X2luaXQoJnN0LT5sb2NrKTsKKwlzdC0+c2RldiA9IHNwaTsKKworCXN0LT5pZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChzdC0+aWRldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9zdDsKKwl9CisJc3QtPmlkZXYtPmRldi5wYXJlbnQgPSAmc3BpLT5kZXY7CisJc3QtPmlkZXYtPm51bV9pbnRlcnJ1cHRfbGluZXMgPSAwOworCXN0LT5pZGV2LT5ldmVudF9hdHRycyA9IE5VTEw7CisKKwlzdC0+aWRldi0+YXR0cnMgPSAmYWQ5ODUwX2F0dHJpYnV0ZV9ncm91cDsKKwlzdC0+aWRldi0+ZGV2X2RhdGEgPSAodm9pZCAqKShzdCk7CisJc3QtPmlkZXYtPmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRTsKKwlzdC0+aWRldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoc3QtPmlkZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisJc3BpLT5tYXhfc3BlZWRfaHogPSAyMDAwMDAwOworCXNwaS0+bW9kZSA9IFNQSV9NT0RFXzM7CisJc3BpLT5iaXRzX3Blcl93b3JkID0gMTY7CisJc3BpX3NldHVwKHNwaSk7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfZnJlZV9kZXY6CisJaWlvX2ZyZWVfZGV2aWNlKHN0LT5pZGV2KTsKK2Vycm9yX2ZyZWVfc3Q6CisJa2ZyZWUoc3QpOworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkOTg1MF9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWQ5ODUwX3N0YXRlICpzdCA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCisJaWlvX2RldmljZV91bnJlZ2lzdGVyKHN0LT5pZGV2KTsKKwlrZnJlZShzdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFkOTg1MF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBEUlZfTkFNRSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhZDk4NTBfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFkOTg1MF9yZW1vdmUpLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWQ5ODUwX3NwaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFkOTg1MF9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoYWQ5ODUwX3NwaV9pbml0KTsKKworc3RhdGljIF9fZXhpdCB2b2lkIGFkOTg1MF9zcGlfZXhpdCh2b2lkKQoreworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYWQ5ODUwX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhZDk4NTBfc3BpX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJDbGlmZiBDYWkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgYWQ5ODUwIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9kZHMvYWQ5ODUyLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9hZDk4NTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTRmYjZhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kZHMvYWQ5ODUyLmMKQEAgLTAsMCArMSwzMDUgQEAKKy8qCisgKiBEcml2ZXIgZm9yIEFESSBEaXJlY3QgRGlnaXRhbCBTeW50aGVzaXMgYWQ5ODUyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorCisjZGVmaW5lIERSVl9OQU1FICJhZDk4NTIiCisKKyNkZWZpbmUgYWRkcl9waGFhZDEgMHgwCisjZGVmaW5lIGFkZHJfcGhhYWQyIDB4MQorI2RlZmluZSBhZGRyX2ZyZXR1MSAweDIKKyNkZWZpbmUgYWRkcl9mcmV0dTIgMHgzCisjZGVmaW5lIGFkZHJfZGVsZnJlIDB4NAorI2RlZmluZSBhZGRyX3VwZGNsayAweDUKKyNkZWZpbmUgYWRkcl9yYW1jbGsgMHg2CisjZGVmaW5lIGFkZHJfY29udHJsIDB4NworI2RlZmluZSBhZGRyX29wdHNrbSAweDgKKyNkZWZpbmUgYWRkcl9vcHRza3IgMHhhCisjZGVmaW5lIGFkZHJfZGFjY3RsIDB4YgorCisjZGVmaW5lIENPTVBQRAkJKDEgPDwgNCkKKyNkZWZpbmUgUkVGTVVMVDIJKDEgPDwgMikKKyNkZWZpbmUgQllQUExMCQkoMSA8PCA1KQorI2RlZmluZSBQTExSQU5HCQkoMSA8PCA2KQorI2RlZmluZSBJRVVQQ0xLCQkoMSkKKyNkZWZpbmUgT1NLRU4JCSgxIDw8IDUpCisKKyNkZWZpbmUgcmVhZF9iaXQJKDEgPDwgNykKKworLyogUmVnaXN0ZXIgZm9ybWF0OiAxIGJ5dGUgYWRkciArIHZhbHVlICovCitzdHJ1Y3QgYWQ5ODUyX2NvbmZpZyB7CisJdTggcGhhanN0MFszXTsKKwl1OCBwaGFqc3QxWzNdOworCXU4IGZyZXR1bjFbNl07CisJdTggZnJldHVuMls2XTsKKwl1OCBkbHRhZnJlWzZdOworCXU4IHVwZHRjbGtbNV07CisJdTggcmFtcHJhdFs0XTsKKwl1OCBjb250cm9sWzVdOworCXU4IG91dHBza21bM107CisJdTggb3V0cHNrclsyXTsKKwl1OCBkYWNjbnRsWzNdOworfTsKKworc3RydWN0IGFkOTg1Ml9zdGF0ZSB7CisJc3RydWN0IG11dGV4IGxvY2s7CisJc3RydWN0IGlpb19kZXYgKmlkZXY7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNkZXY7Cit9OworCitzdGF0aWMgc3NpemVfdCBhZDk4NTJfc2V0X3BhcmFtZXRlcihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQljb25zdCBjaGFyICpidWYsCisJCQkJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXI7CisJaW50IHJldDsKKwlzdHJ1Y3QgYWQ5ODUyX2NvbmZpZyAqY29uZmlnID0gKHN0cnVjdCBhZDk4NTJfY29uZmlnICopYnVmOworCXN0cnVjdCBpaW9fZGV2ICppZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkOTg1Ml9zdGF0ZSAqc3QgPSBpZGV2LT5kZXZfZGF0YTsKKworCXhmZXIubGVuID0gMzsKKwl4ZmVyLnR4X2J1ZiA9ICZjb25maWctPnBoYWpzdDBbMF07CisJbXV0ZXhfbG9jaygmc3QtPmxvY2spOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJeGZlci5sZW4gPSAzOworCXhmZXIudHhfYnVmID0gJmNvbmZpZy0+cGhhanN0MVswXTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCXhmZXIubGVuID0gNjsKKwl4ZmVyLnR4X2J1ZiA9ICZjb25maWctPmZyZXR1bjFbMF07CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwl4ZmVyLmxlbiA9IDY7CisJeGZlci50eF9idWYgPSAmY29uZmlnLT5mcmV0dW4yWzBdOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJeGZlci5sZW4gPSA2OworCXhmZXIudHhfYnVmID0gJmNvbmZpZy0+ZGx0YWZyZVswXTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCXhmZXIubGVuID0gNTsKKwl4ZmVyLnR4X2J1ZiA9ICZjb25maWctPnVwZHRjbGtbMF07CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwl4ZmVyLmxlbiA9IDQ7CisJeGZlci50eF9idWYgPSAmY29uZmlnLT5yYW1wcmF0WzBdOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJeGZlci5sZW4gPSA1OworCXhmZXIudHhfYnVmID0gJmNvbmZpZy0+Y29udHJvbFswXTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCXhmZXIubGVuID0gMzsKKwl4ZmVyLnR4X2J1ZiA9ICZjb25maWctPm91dHBza21bMF07CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwl4ZmVyLmxlbiA9IDI7CisJeGZlci50eF9idWYgPSAmY29uZmlnLT5vdXRwc2tyWzBdOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJeGZlci5sZW4gPSAzOworCXhmZXIudHhfYnVmID0gJmNvbmZpZy0+ZGFjY250bFswXTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKworCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoZGRzLCBTX0lXVVNSLCBOVUxMLCBhZDk4NTJfc2V0X3BhcmFtZXRlciwgMCk7CisKK3N0YXRpYyB2b2lkIGFkOTg1Ml9pbml0KHN0cnVjdCBhZDk4NTJfc3RhdGUgKnN0KQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyOworCWludCByZXQ7CisJdTggY29uZmlnWzVdOworCisJY29uZmlnWzBdID0gYWRkcl9jb250cmw7CisJY29uZmlnWzFdID0gQ09NUFBEOworCWNvbmZpZ1syXSA9IFJFRk1VTFQyIHwgQllQUExMIHwgUExMUkFORzsKKwljb25maWdbM10gPSBJRVVQQ0xLOworCWNvbmZpZ1s0XSA9IE9TS0VOOworCisJbXV0ZXhfbG9jaygmc3QtPmxvY2spOworCisJeGZlci5sZW4gPSA1OworCXhmZXIudHhfYnVmID0gJmNvbmZpZzsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCisKKworfQorCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWQ5ODUyX2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2Rldl9hdHRyX2Rkcy5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDk4NTJfYXR0cmlidXRlX2dyb3VwID0geworCS5uYW1lID0gRFJWX05BTUUsCisJLmF0dHJzID0gYWQ5ODUyX2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZDk4NTJfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWQ5ODUyX3N0YXRlICpzdDsKKwlpbnQgcmV0ID0gMDsKKworCXN0ID0ga3phbGxvYyhzaXplb2YoKnN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCXNwaV9zZXRfZHJ2ZGF0YShzcGksIHN0KTsKKworCW11dGV4X2luaXQoJnN0LT5sb2NrKTsKKwlzdC0+c2RldiA9IHNwaTsKKworCXN0LT5pZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChzdC0+aWRldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9zdDsKKwl9CisJc3QtPmlkZXYtPmRldi5wYXJlbnQgPSAmc3BpLT5kZXY7CisJc3QtPmlkZXYtPm51bV9pbnRlcnJ1cHRfbGluZXMgPSAwOworCXN0LT5pZGV2LT5ldmVudF9hdHRycyA9IE5VTEw7CisKKwlzdC0+aWRldi0+YXR0cnMgPSAmYWQ5ODUyX2F0dHJpYnV0ZV9ncm91cDsKKwlzdC0+aWRldi0+ZGV2X2RhdGEgPSAodm9pZCAqKShzdCk7CisJc3QtPmlkZXYtPmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRTsKKwlzdC0+aWRldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoc3QtPmlkZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisJc3BpLT5tYXhfc3BlZWRfaHogPSAyMDAwMDAwOworCXNwaS0+bW9kZSA9IFNQSV9NT0RFXzM7CisJc3BpLT5iaXRzX3Blcl93b3JkID0gODsKKwlzcGlfc2V0dXAoc3BpKTsKKwlhZDk4NTJfaW5pdChzdCk7CisJcmV0dXJuIDA7CisKK2Vycm9yX2ZyZWVfZGV2OgorCWlpb19mcmVlX2RldmljZShzdC0+aWRldik7CitlcnJvcl9mcmVlX3N0OgorCWtmcmVlKHN0KTsKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhZDk4NTJfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGFkOTg1Ml9zdGF0ZSAqc3QgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihzdC0+aWRldik7CisJa2ZyZWUoc3QpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhZDk4NTJfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gRFJWX05BTUUsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gYWQ5ODUyX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZDk4NTJfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGFkOTg1Ml9zcGlfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZhZDk4NTJfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGFkOTg1Ml9zcGlfaW5pdCk7CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBhZDk4NTJfc3BpX2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmFkOTg1Ml9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoYWQ5ODUyX3NwaV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQ2xpZmYgQ2FpIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIGFkOTg1MiBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL2FkOTkxMC5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kZHMvYWQ5OTEwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThmYjc1YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL2FkOTkxMC5jCkBAIC0wLDAgKzEsNDQwIEBACisvKgorICogRHJpdmVyIGZvciBBREkgRGlyZWN0IERpZ2l0YWwgU3ludGhlc2lzIGFkOTkxMAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKworI2RlZmluZSBEUlZfTkFNRSAiYWQ5OTEwIgorCisjZGVmaW5lIENGUjEgMHgwCisjZGVmaW5lIENGUjIgMHgxCisjZGVmaW5lIENGUjMgMHgyCisKKyNkZWZpbmUgQVVYREFDIDB4MworI2RlZmluZSBJT1VQRCAweDQKKyNkZWZpbmUgRlRXIDB4NworI2RlZmluZSBQT1cgMHg4CisjZGVmaW5lIEFTRiAweDkKKyNkZWZpbmUgTVVMVEMgMHgwQQorI2RlZmluZSBESUdfUkFNUEwgMHgwQgorI2RlZmluZSBESUdfUkFNUFMgMHgwQworI2RlZmluZSBESUdfUkFNUFIgMHgwRAorI2RlZmluZSBTSU5fVE9ORVAwIDB4MEUKKyNkZWZpbmUgU0lOX1RPTkVQMSAweDBGCisjZGVmaW5lIFNJTl9UT05FUDIgMHgxMAorI2RlZmluZSBTSU5fVE9ORVAzIDB4MTEKKyNkZWZpbmUgU0lOX1RPTkVQNCAweDEyCisjZGVmaW5lIFNJTl9UT05FUDUgMHgxMworI2RlZmluZSBTSU5fVE9ORVA2IDB4MTQKKyNkZWZpbmUgU0lOX1RPTkVQNyAweDE1CisKKyNkZWZpbmUgUkFNX0VOQUJMRQkoMSA8PCA3KQorCisjZGVmaW5lIE1BTlVBTF9PU0sJKDEgPDwgNykKKyNkZWZpbmUgSU5WU0lDCQkoMSA8PCA2KQorI2RlZmluZSBERFNfU0lORU9QCSgxKQorCisjZGVmaW5lIEFVVE9fT1NLCSgxKQorI2RlZmluZSBPU0tFTgkJKDEgPDwgMSkKKyNkZWZpbmUgTE9BRF9BUlIJKDEgPDwgMikKKyNkZWZpbmUgQ0xSX1BIQQkJKDEgPDwgMykKKyNkZWZpbmUgQ0xSX0RJRwkJKDEgPDwgNCkKKyNkZWZpbmUgQUNMUl9QSEEJKDEgPDwgNSkKKyNkZWZpbmUgQUNMUl9ESUcJKDEgPDwgNikKKyNkZWZpbmUgTE9BRF9MUlIJKDEgPDwgNykKKworI2RlZmluZSBMU0JfRlNUCQkoMSkKKyNkZWZpbmUgU0RJT19JUFQJKDEgPDwgMSkKKyNkZWZpbmUgRVhUX1BXRAkJKDEgPDwgMykKKyNkZWZpbmUgQURBQ19QV0QJKDEgPDwgNCkKKyNkZWZpbmUgUkVGQ0xLX1BXRAkoMSA8PCA1KQorI2RlZmluZSBEQUNfUFdECQkoMSA8PCA2KQorI2RlZmluZSBESUdfUFdECQkoMSA8PCA3KQorCisjZGVmaW5lIEVOQV9BTVAJCSgxKQorI2RlZmluZSBSRUFEX0ZUVwkoMSkKKyNkZWZpbmUgRElHUl9MT1cJKDEgPDwgMSkKKyNkZWZpbmUgRElHUl9ISUdICSgxIDw8IDIpCisjZGVmaW5lIERJR1JfRU5BCSgxIDw8IDMpCisjZGVmaW5lIFNZTkNDTEtfRU5BCSgxIDw8IDYpCisjZGVmaW5lIElURVJfSU9VUEQJKDEgPDwgNykKKworI2RlZmluZSBUWF9FTkEJCSgxIDw8IDEpCisjZGVmaW5lIFBEQ0xLX0lOVgkoMSA8PCAyKQorI2RlZmluZSBQRENMS19FTkIJKDEgPDwgMykKKworI2RlZmluZSBQQVJBX0VOQQkoMSA8PCA0KQorI2RlZmluZSBTWU5DX0RJUwkoMSA8PCA1KQorI2RlZmluZSBEQVRBX0FTUwkoMSA8PCA2KQorI2RlZmluZSBNQVRDSF9FTkEJKDEgPDwgNykKKworI2RlZmluZSBQTExfRU5BCQkoMSkKKyNkZWZpbmUgUEZEX1JTVAkJKDEgPDwgMikKKyNkZWZpbmUgUkVGQ0xLX1JTVAkoMSA8PCA2KQorI2RlZmluZSBSRUZDTEtfQllQCSgxIDw8IDcpCisKKy8qIFJlZ2lzdGVyIGZvcm1hdDogMSBieXRlIGFkZHIgKyB2YWx1ZSAqLworc3RydWN0IGFkOTkxMF9jb25maWcgeworCXU4IGF1eGRhY1s1XTsKKwl1OCBpb3VwZFs1XTsKKwl1OCBmdHdbNV07CisJdTggcG93WzNdOworCXU4IGFzZls1XTsKKwl1OCBtdWx0Y1s1XTsKKwl1OCBkaWdfcmFtcGxbOV07CisJdTggZGlnX3JhbXBzWzldOworCXU4IGRpZ19yYW1wcls1XTsKKwl1OCBzaW5fdG9uZXAwWzldOworCXU4IHNpbl90b25lcDFbOV07CisJdTggc2luX3RvbmVwMls5XTsKKwl1OCBzaW5fdG9uZXAzWzldOworCXU4IHNpbl90b25lcDRbOV07CisJdTggc2luX3RvbmVwNVs5XTsKKwl1OCBzaW5fdG9uZXA2WzldOworCXU4IHNpbl90b25lcDdbOV07Cit9OworCitzdHJ1Y3QgYWQ5OTEwX3N0YXRlIHsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwlzdHJ1Y3QgaWlvX2RldiAqaWRldjsKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc2RldjsKK307CisKK3N0YXRpYyBzc2l6ZV90IGFkOTkxMF9zZXRfcGFyYW1ldGVyKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcjsKKwlpbnQgcmV0OworCXN0cnVjdCBhZDk5MTBfY29uZmlnICpjb25maWcgPSAoc3RydWN0IGFkOTkxMF9jb25maWcgKilidWY7CisJc3RydWN0IGlpb19kZXYgKmlkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ5OTEwX3N0YXRlICpzdCA9IGlkZXYtPmRldl9kYXRhOworCisJeGZlci5sZW4gPSA1OworCXhmZXIudHhfYnVmID0gJmNvbmZpZy0+YXV4ZGFjWzBdOworCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCXhmZXIubGVuID0gNTsKKwl4ZmVyLnR4X2J1ZiA9ICZjb25maWctPmlvdXBkWzBdOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJeGZlci5sZW4gPSA1OworCXhmZXIudHhfYnVmID0gJmNvbmZpZy0+ZnR3WzBdOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJeGZlci5sZW4gPSAzOworCXhmZXIudHhfYnVmID0gJmNvbmZpZy0+cG93WzBdOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJeGZlci5sZW4gPSA1OworCXhmZXIudHhfYnVmID0gJmNvbmZpZy0+YXNmWzBdOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJeGZlci5sZW4gPSA1OworCXhmZXIudHhfYnVmID0gJmNvbmZpZy0+bXVsdGNbMF07CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwl4ZmVyLmxlbiA9IDk7CisJeGZlci50eF9idWYgPSAmY29uZmlnLT5kaWdfcmFtcGxbMF07CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwl4ZmVyLmxlbiA9IDk7CisJeGZlci50eF9idWYgPSAmY29uZmlnLT5kaWdfcmFtcHNbMF07CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwl4ZmVyLmxlbiA9IDU7CisJeGZlci50eF9idWYgPSAmY29uZmlnLT5kaWdfcmFtcHJbMF07CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwl4ZmVyLmxlbiA9IDk7CisJeGZlci50eF9idWYgPSAmY29uZmlnLT5zaW5fdG9uZXAwWzBdOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJeGZlci5sZW4gPSA5OworCXhmZXIudHhfYnVmID0gJmNvbmZpZy0+c2luX3RvbmVwMVswXTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCXhmZXIubGVuID0gOTsKKwl4ZmVyLnR4X2J1ZiA9ICZjb25maWctPnNpbl90b25lcDJbMF07CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisJeGZlci5sZW4gPSA5OworCXhmZXIudHhfYnVmID0gJmNvbmZpZy0+c2luX3RvbmVwM1swXTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCXhmZXIubGVuID0gOTsKKwl4ZmVyLnR4X2J1ZiA9ICZjb25maWctPnNpbl90b25lcDRbMF07CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwl4ZmVyLmxlbiA9IDk7CisJeGZlci50eF9idWYgPSAmY29uZmlnLT5zaW5fdG9uZXA1WzBdOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJeGZlci5sZW4gPSA5OworCXhmZXIudHhfYnVmID0gJmNvbmZpZy0+c2luX3RvbmVwNlswXTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCXhmZXIubGVuID0gOTsKKwl4ZmVyLnR4X2J1ZiA9ICZjb25maWctPnNpbl90b25lcDdbMF07CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CitlcnJvcl9yZXQ6CisJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGRkcywgU19JV1VTUiwgTlVMTCwgYWQ5OTEwX3NldF9wYXJhbWV0ZXIsIDApOworCitzdGF0aWMgdm9pZCBhZDk5MTBfaW5pdChzdHJ1Y3QgYWQ5OTEwX3N0YXRlICpzdCkKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcjsKKwlpbnQgcmV0OworCXU4IGNmcls1XTsKKworCWNmclswXSA9IENGUjE7CisJY2ZyWzFdID0gMDsKKwljZnJbMl0gPSBNQU5VQUxfT1NLIHwgSU5WU0lDIHwgRERTX1NJTkVPUDsKKwljZnJbM10gPSBBVVRPX09TSyB8IE9TS0VOIHwgQUNMUl9QSEEgfCBBQ0xSX0RJRyB8IExPQURfTFJSOworCWNmcls0XSA9IDA7CisKKwltdXRleF9sb2NrKCZzdC0+bG9jayk7CisKKwl4ZmVyLmxlbiA9IDU7CisJeGZlci50eF9idWYgPSAmY2ZyOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJY2ZyWzBdID0gQ0ZSMjsKKwljZnJbMV0gPSBFTkFfQU1QOworCWNmclsyXSA9IFJFQURfRlRXIHwgRElHUl9FTkEgfCBJVEVSX0lPVVBEOworCWNmclszXSA9IFRYX0VOQSB8IFBEQ0xLX0lOViB8IFBEQ0xLX0VOQjsKKwljZnJbNF0gPSBQQVJBX0VOQTsKKworCXhmZXIubGVuID0gNTsKKwl4ZmVyLnR4X2J1ZiA9ICZjZnI7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwljZnJbMF0gPSBDRlIzOworCWNmclsxXSA9IFBMTF9FTkE7CisJY2ZyWzJdID0gMDsKKwljZnJbM10gPSBSRUZDTEtfUlNUIHwgUkVGQ0xLX0JZUDsKKwljZnJbNF0gPSAwOworCisJeGZlci5sZW4gPSA1OworCXhmZXIudHhfYnVmID0gJmNmcjsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCisKKworfQorCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWQ5OTEwX2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2Rldl9hdHRyX2Rkcy5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDk5MTBfYXR0cmlidXRlX2dyb3VwID0geworCS5uYW1lID0gRFJWX05BTUUsCisJLmF0dHJzID0gYWQ5OTEwX2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZDk5MTBfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWQ5OTEwX3N0YXRlICpzdDsKKwlpbnQgcmV0ID0gMDsKKworCXN0ID0ga3phbGxvYyhzaXplb2YoKnN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCXNwaV9zZXRfZHJ2ZGF0YShzcGksIHN0KTsKKworCW11dGV4X2luaXQoJnN0LT5sb2NrKTsKKwlzdC0+c2RldiA9IHNwaTsKKworCXN0LT5pZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChzdC0+aWRldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9zdDsKKwl9CisJc3QtPmlkZXYtPmRldi5wYXJlbnQgPSAmc3BpLT5kZXY7CisJc3QtPmlkZXYtPm51bV9pbnRlcnJ1cHRfbGluZXMgPSAwOworCXN0LT5pZGV2LT5ldmVudF9hdHRycyA9IE5VTEw7CisKKwlzdC0+aWRldi0+YXR0cnMgPSAmYWQ5OTEwX2F0dHJpYnV0ZV9ncm91cDsKKwlzdC0+aWRldi0+ZGV2X2RhdGEgPSAodm9pZCAqKShzdCk7CisJc3QtPmlkZXYtPmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRTsKKwlzdC0+aWRldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoc3QtPmlkZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisJc3BpLT5tYXhfc3BlZWRfaHogPSAyMDAwMDAwOworCXNwaS0+bW9kZSA9IFNQSV9NT0RFXzM7CisJc3BpLT5iaXRzX3Blcl93b3JkID0gODsKKwlzcGlfc2V0dXAoc3BpKTsKKwlhZDk5MTBfaW5pdChzdCk7CisJcmV0dXJuIDA7CisKK2Vycm9yX2ZyZWVfZGV2OgorCWlpb19mcmVlX2RldmljZShzdC0+aWRldik7CitlcnJvcl9mcmVlX3N0OgorCWtmcmVlKHN0KTsKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhZDk5MTBfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGFkOTkxMF9zdGF0ZSAqc3QgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihzdC0+aWRldik7CisJa2ZyZWUoc3QpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhZDk5MTBfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gRFJWX05BTUUsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gYWQ5OTEwX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZDk5MTBfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGFkOTkxMF9zcGlfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZhZDk5MTBfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGFkOTkxMF9zcGlfaW5pdCk7CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBhZDk5MTBfc3BpX2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmFkOTkxMF9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoYWQ5OTEwX3NwaV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQ2xpZmYgQ2FpIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIGFkOTkxMCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL2FkOTk1MS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kZHMvYWQ5OTUxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdlZGRmNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL2FkOTk1MS5jCkBAIC0wLDAgKzEsMjQ5IEBACisvKgorICogRHJpdmVyIGZvciBBREkgRGlyZWN0IERpZ2l0YWwgU3ludGhlc2lzIGFkOTk1MQorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKworI2RlZmluZSBEUlZfTkFNRSAiYWQ5OTUxIgorCisjZGVmaW5lIENGUjEgMHgwCisjZGVmaW5lIENGUjIgMHgxCisKKyNkZWZpbmUgQVVUT19PU0sJKDEpCisjZGVmaW5lIE9TS0VOCQkoMSA8PCAxKQorI2RlZmluZSBMT0FEX0FSUgkoMSA8PCAyKQorCisjZGVmaW5lIEFVVE9fU1lOQwkoMSA8PCA3KQorCisjZGVmaW5lIExTQl9GU1QJCSgxKQorI2RlZmluZSBTRElPX0lQVAkoMSA8PCAxKQorI2RlZmluZSBDTFJfUEhBCQkoMSA8PCAyKQorI2RlZmluZSBTSU5FX09QVAkoMSA8PCA0KQorI2RlZmluZSBBQ0xSX1BIQQkoMSA8PCA1KQorCisjZGVmaW5lIFZDT19SQU5HRQkoMSA8PCAyKQorCisjZGVmaW5lIENSU19PUFQJCSgxIDw8IDEpCisjZGVmaW5lIEhNQU5VX1NZTkMJKDEgPDwgMikKKyNkZWZpbmUgSFNQRF9TWU5DCSgxIDw8IDMpCisKKy8qIFJlZ2lzdGVyIGZvcm1hdDogMSBieXRlIGFkZHIgKyB2YWx1ZSAqLworc3RydWN0IGFkOTk1MV9jb25maWcgeworCXU4IGFzZlszXTsKKwl1OCBhcnJbMl07CisJdTggZnR3MFs1XTsKKwl1OCBmdHcxWzNdOworfTsKKworc3RydWN0IGFkOTk1MV9zdGF0ZSB7CisJc3RydWN0IG11dGV4IGxvY2s7CisJc3RydWN0IGlpb19kZXYgKmlkZXY7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNkZXY7Cit9OworCitzdGF0aWMgc3NpemVfdCBhZDk5NTFfc2V0X3BhcmFtZXRlcihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQljb25zdCBjaGFyICpidWYsCisJCQkJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXI7CisJaW50IHJldDsKKwlzdHJ1Y3QgYWQ5OTUxX2NvbmZpZyAqY29uZmlnID0gKHN0cnVjdCBhZDk5NTFfY29uZmlnICopYnVmOworCXN0cnVjdCBpaW9fZGV2ICppZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkOTk1MV9zdGF0ZSAqc3QgPSBpZGV2LT5kZXZfZGF0YTsKKworCXhmZXIubGVuID0gMzsKKwl4ZmVyLnR4X2J1ZiA9ICZjb25maWctPmFzZlswXTsKKwltdXRleF9sb2NrKCZzdC0+bG9jayk7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwl4ZmVyLmxlbiA9IDI7CisJeGZlci50eF9idWYgPSAmY29uZmlnLT5hcnJbMF07CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwl4ZmVyLmxlbiA9IDU7CisJeGZlci50eF9idWYgPSAmY29uZmlnLT5mdHcwWzBdOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJeGZlci5sZW4gPSAzOworCXhmZXIudHhfYnVmID0gJmNvbmZpZy0+ZnR3MVswXTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKworCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoZGRzLCBTX0lXVVNSLCBOVUxMLCBhZDk5NTFfc2V0X3BhcmFtZXRlciwgMCk7CisKK3N0YXRpYyB2b2lkIGFkOTk1MV9pbml0KHN0cnVjdCBhZDk5NTFfc3RhdGUgKnN0KQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyOworCWludCByZXQ7CisJdTggY2ZyWzVdOworCisJY2ZyWzBdID0gQ0ZSMTsKKwljZnJbMV0gPSAwOworCWNmclsyXSA9IExTQl9GU1QgfCBDTFJfUEhBIHwgU0lORV9PUFQgfCBBQ0xSX1BIQTsKKwljZnJbM10gPSBBVVRPX09TSyB8IE9TS0VOIHwgTE9BRF9BUlI7CisJY2ZyWzRdID0gMDsKKworCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKKworCXhmZXIubGVuID0gNTsKKwl4ZmVyLnR4X2J1ZiA9ICZjZnI7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwljZnJbMF0gPSBDRlIyOworCWNmclsxXSA9IFZDT19SQU5HRTsKKwljZnJbMl0gPSBIU1BEX1NZTkM7CisJY2ZyWzNdID0gMDsKKworCXhmZXIubGVuID0gNDsKKwl4ZmVyLnR4X2J1ZiA9ICZjZnI7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKworCisKK30KKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkOTk1MV9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19kZXZfYXR0cl9kZHMuZGV2X2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWQ5OTUxX2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkubmFtZSA9IERSVl9OQU1FLAorCS5hdHRycyA9IGFkOTk1MV9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgYWQ5OTUxX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGFkOTk1MV9zdGF0ZSAqc3Q7CisJaW50IHJldCA9IDA7CisKKwlzdCA9IGt6YWxsb2Moc2l6ZW9mKCpzdCksIEdGUF9LRVJORUwpOworCWlmIChzdCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwlzcGlfc2V0X2RydmRhdGEoc3BpLCBzdCk7CisKKwltdXRleF9pbml0KCZzdC0+bG9jayk7CisJc3QtPnNkZXYgPSBzcGk7CisKKwlzdC0+aWRldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoc3QtPmlkZXYgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfc3Q7CisJfQorCXN0LT5pZGV2LT5kZXYucGFyZW50ID0gJnNwaS0+ZGV2OworCXN0LT5pZGV2LT5udW1faW50ZXJydXB0X2xpbmVzID0gMDsKKwlzdC0+aWRldi0+ZXZlbnRfYXR0cnMgPSBOVUxMOworCisJc3QtPmlkZXYtPmF0dHJzID0gJmFkOTk1MV9hdHRyaWJ1dGVfZ3JvdXA7CisJc3QtPmlkZXYtPmRldl9kYXRhID0gKHZvaWQgKikoc3QpOworCXN0LT5pZGV2LT5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEU7CisJc3QtPmlkZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKHN0LT5pZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2OworCXNwaS0+bWF4X3NwZWVkX2h6ID0gMjAwMDAwMDsKKwlzcGktPm1vZGUgPSBTUElfTU9ERV8zOworCXNwaS0+Yml0c19wZXJfd29yZCA9IDg7CisJc3BpX3NldHVwKHNwaSk7CisJYWQ5OTUxX2luaXQoc3QpOworCXJldHVybiAwOworCitlcnJvcl9mcmVlX2RldjoKKwlpaW9fZnJlZV9kZXZpY2Uoc3QtPmlkZXYpOworZXJyb3JfZnJlZV9zdDoKKwlrZnJlZShzdCk7CitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYWQ5OTUxX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBhZDk5NTFfc3RhdGUgKnN0ID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoc3QtPmlkZXYpOworCWtmcmVlKHN0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWQ5OTUxX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9IERSVl9OQU1FLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IGFkOTk1MV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWQ5OTUxX3JlbW92ZSksCit9OworCitzdGF0aWMgX19pbml0IGludCBhZDk5NTFfc3BpX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmYWQ5OTUxX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChhZDk5NTFfc3BpX2luaXQpOworCitzdGF0aWMgX19leGl0IHZvaWQgYWQ5OTUxX3NwaV9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZDk5NTFfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFkOTk1MV9zcGlfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkNsaWZmIENhaSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBhZDk5NTEgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9kZHMuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL2Rkcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YWMzYTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9kZHMuaApAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIGRkcy5oIC0gc3lzZnMgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggRERTIGRldmljZXMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisvKioKKyAqIC9zeXMvYnVzL2lpby9kZXZpY2VzLy4uLi9kZHNYX2ZyZXFZCisgKi8KKworI2RlZmluZSBJSU9fREVWX0FUVFJfRlJFUShfY2hhbm5lbCwgX251bSwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQlcCisJSUlPX0RFVklDRV9BVFRSKGRkcyMjX2NoYW5uZWwjI19mcmVxIyNfbnVtLAkJCVwKKwkJCV9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworLyoqCisgKiAvc3lzL2J1cy9paW8vZGV2aWNlcy8uLi4vZGRzWF9mcmVxWV9zY2FsZQorICovCisKKyNkZWZpbmUgSUlPX0NPTlNUX0FUVFJfRlJFUV9TQ0FMRShfY2hhbm5lbCwgX3N0cmluZykJCQlcCisJSUlPX0NPTlNUX0FUVFIoZGRzIyNfY2hhbm5lbCMjX2ZyZXFfc2NhbGUsIF9zdHJpbmcpCisKKy8qKgorICogL3N5cy9idXMvaWlvL2RldmljZXMvLi4uL2Rkc1hfZnJlcXN5bWJvbAorICovCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0ZSRVFTWU1CT0woX2NoYW5uZWwsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikJXAorCUlJT19ERVZJQ0VfQVRUUihkZHMjI19jaGFubmVsIyNfZnJlcXN5bWJvbCwJCQlcCisJCQlfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpOworCisvKioKKyAqIC9zeXMvYnVzL2lpby9kZXZpY2VzLy4uLi9kZHNYX3BoYXNlWQorICovCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1BIQVNFKF9jaGFubmVsLCBfbnVtLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCVwKKwlJSU9fREVWSUNFX0FUVFIoZGRzIyNfY2hhbm5lbCMjX3BoYXNlIyNfbnVtLAkJCVwKKwkJCV9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworLyoqCisgKiAvc3lzL2J1cy9paW8vZGV2aWNlcy8uLi4vZGRzWF9waGFzZVlfc2NhbGUKKyAqLworCisjZGVmaW5lIElJT19DT05TVF9BVFRSX1BIQVNFX1NDQUxFKF9jaGFubmVsLCBfc3RyaW5nKQkJCVwKKwlJSU9fQ09OU1RfQVRUUihkZHMjI19jaGFubmVsIyNfcGhhc2Vfc2NhbGUsIF9zdHJpbmcpCisKKy8qKgorICogL3N5cy9idXMvaWlvL2RldmljZXMvLi4uL2Rkc1hfcGhhc2VzeW1ib2wKKyAqLworCisjZGVmaW5lIElJT19ERVZfQVRUUl9QSEFTRVNZTUJPTChfY2hhbm5lbCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQlcCisJSUlPX0RFVklDRV9BVFRSKGRkcyMjX2NoYW5uZWwjI19waGFzZXN5bWJvbCwJCQlcCisJCQlfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpOworCisvKioKKyAqIC9zeXMvYnVzL2lpby9kZXZpY2VzLy4uLi9kZHNYX3BpbmNvbnRyb2xfZW4KKyAqLworCisjZGVmaW5lIElJT19ERVZfQVRUUl9QSU5DT05UUk9MX0VOKF9jaGFubmVsLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpXAorCUlJT19ERVZJQ0VfQVRUUihkZHMjI19jaGFubmVsIyNfcGluY29udHJvbF9lbiwJCQlcCisJCQlfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpOworCisvKioKKyAqIC9zeXMvYnVzL2lpby9kZXZpY2VzLy4uLi9kZHNYX3BpbmNvbnRyb2xfZnJlcV9lbgorICovCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1BJTkNPTlRST0xfRlJFUV9FTihfY2hhbm5lbCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKVwKKwlJSU9fREVWSUNFX0FUVFIoZGRzIyNfY2hhbm5lbCMjX3BpbmNvbnRyb2xfZnJlcV9lbiwJCVwKKwkJCV9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcik7CisKKy8qKgorICogL3N5cy9idXMvaWlvL2RldmljZXMvLi4uL2Rkc1hfcGluY29udHJvbF9waGFzZV9lbgorICovCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1BJTkNPTlRST0xfUEhBU0VfRU4oX2NoYW5uZWwsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcilcCisJSUlPX0RFVklDRV9BVFRSKGRkcyMjX2NoYW5uZWwjI19waW5jb250cm9sX3BoYXNlX2VuLAkJXAorCQkJX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKTsKKworLyoqCisgKiAvc3lzL2J1cy9paW8vZGV2aWNlcy8uLi4vZGRzWF9vdXRfZW5hYmxlCisgKi8KKworI2RlZmluZSBJSU9fREVWX0FUVFJfT1VUX0VOQUJMRShfY2hhbm5lbCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQlcCisJSUlPX0RFVklDRV9BVFRSKGRkcyMjX2NoYW5uZWwjI19vdXRfZW5hYmxlLAkJCVwKKwkJCV9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcik7CisKKy8qKgorICogL3N5cy9idXMvaWlvL2RldmljZXMvLi4uL2Rkc1hfb3V0WV9lbmFibGUKKyAqLworCisjZGVmaW5lIElJT19ERVZfQVRUUl9PVVRZX0VOQUJMRShfY2hhbm5lbCwgX291dHB1dCwJCQlcCisJCQlfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCQkJXAorCUlJT19ERVZJQ0VfQVRUUihkZHMjI19jaGFubmVsIyNfb3V0IyNfb3V0cHV0IyNfZW5hYmxlLAkJXAorCQkJX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKTsKKworLyoqCisgKiAvc3lzL2J1cy9paW8vZGV2aWNlcy8uLi4vZGRzWF9vdXRZX3dhdmV0eXBlCisgKi8KKworI2RlZmluZSBJSU9fREVWX0FUVFJfT1VUX1dBVkVUWVBFKF9jaGFubmVsLCBfb3V0cHV0LCBfc3RvcmUsIF9hZGRyKQlcCisJSUlPX0RFVklDRV9BVFRSKGRkcyMjX2NoYW5uZWwjI19vdXQjI19vdXRwdXQjI193YXZldHlwZSwJXAorCQkJU19JV1VTUiwgTlVMTCwgX3N0b3JlLCBfYWRkcik7CisKKy8qKgorICogL3N5cy9idXMvaWlvL2RldmljZXMvLi4uL2Rkc1hfb3V0WV93YXZldHlwZV9hdmFpbGFibGUKKyAqLworCisjZGVmaW5lIElJT19DT05TVF9BVFRSX09VVF9XQVZFVFlQRVNfQVZBSUxBQkxFKF9jaGFubmVsLCBfb3V0cHV0LCBfbW9kZXMpXAorCUlJT19DT05TVF9BVFRSKGRkcyMjX2NoYW5uZWwjI19vdXQjI19vdXRwdXQjI193YXZldHlwZV9hdmFpbGFibGUsXAorCQkJX21vZGVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL0tjb25maWcKaW5kZXggYzQwNDM2MS4uMjM2ZjE1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL0tjb25maWcKQEAgLTMsMTEgKzMsNDUgQEAKICMKIGNvbW1lbnQgIkRpZ2l0YWwgZ3lyb3Njb3BlIHNlbnNvcnMiCiAKK2NvbmZpZyBBRElTMTYwNjAKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQURJUzE2MDYwIFlhdyBSYXRlIEd5cm9zY29wZSB3aXRoIFNQSSBkcml2ZXIiCisJZGVwZW5kcyBvbiBTUEkKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgYWRpczE2MDYwIHdpZGUgYmFuZHdpZHRoCisJICB5YXcgcmF0ZSBneXJvc2NvcGUgd2l0aCBTUEkuCisKK2NvbmZpZyBBRElTMTYwODAKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQURJUzE2MDgwLzEwMCBZYXcgUmF0ZSBHeXJvc2NvcGUgd2l0aCBTUEkgZHJpdmVyIgorCWRlcGVuZHMgb24gU1BJCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIGFkaXMxNjA4MC8xMDAgWWF3IFJhdGUKKwkgIEd5cm9zY29wZSB3aXRoIFNQSS4KKworY29uZmlnIEFESVMxNjEzMAorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRElTMTYxMzAgSGlnaCBQcmVjaXNpb24gQW5ndWxhciBSYXRlIFNlbnNvciBkcml2ZXIiCisJZGVwZW5kcyBvbiBTUEkKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgQURJUzE2MTMwIEhpZ2ggUHJlY2lzaW9uCisJICBBbmd1bGFyIFJhdGUgU2Vuc29yIGRyaXZlci4KKwogY29uZmlnIEFESVMxNjI2MAotCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRElTMTYyNjAvNSBEaWdpdGFsIEd5cm9zY29wZSBTZW5zb3IgU1BJIGRyaXZlciIKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQURJUzE2MjYwIEFESVMxNjI2NSBEaWdpdGFsIEd5cm9zY29wZSBTZW5zb3IgU1BJIGRyaXZlciIKIAlkZXBlbmRzIG9uIFNQSQogCXNlbGVjdCBJSU9fVFJJR0dFUiBpZiBJSU9fUklOR19CVUZGRVIKIAlzZWxlY3QgSUlPX1NXX1JJTkcgaWYgSUlPX1JJTkdfQlVGRkVSCiAJaGVscAotCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIGFkaXMxNjI2MC81CisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgQURJUzE2MjYwIEFESVMxNjI2NQogCSAgcHJvZ3JhbW1hYmxlIGRpZ2l0YWwgZ3lyb3Njb3BlIHNlbnNvci4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgYWRpczE2MjYwLgorCitjb25maWcgQURJUzE2MjUxCisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFESVMxNjI1MSBEaWdpdGFsIEd5cm9zY29wZSBTZW5zb3IgU1BJIGRyaXZlciIKKwlkZXBlbmRzIG9uIFNQSQorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBhZGlzMTYyNjEgcHJvZ3JhbW1hYmxlCisJICBkaWdpdGFsIGd5cm9zY29wZSBzZW5zb3IuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGFkaXMxNjI1MS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9NYWtlZmlsZQppbmRleCBiNWYwZGMwLi4yNzY0YzE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL01ha2VmaWxlCkBAIC0yLDYgKzIsMTggQEAKICMgTWFrZWZpbGUgZm9yIGRpZ2l0YWwgZ3lyb3Njb3BlIHNlbnNvciBkcml2ZXJzCiAjCiAKK2FkaXMxNjA2MC15ICAgICAgICAgICAgIDo9IGFkaXMxNjA2MF9jb3JlLm8KK29iai0kKENPTkZJR19BRElTMTYwNjApICs9IGFkaXMxNjA2MC5vCisKK2FkaXMxNjA4MC15ICAgICAgICAgICAgIDo9IGFkaXMxNjA4MF9jb3JlLm8KK29iai0kKENPTkZJR19BRElTMTYwODApICs9IGFkaXMxNjA4MC5vCisKK2FkaXMxNjEzMC15ICAgICAgICAgICAgIDo9IGFkaXMxNjEzMF9jb3JlLm8KK29iai0kKENPTkZJR19BRElTMTYxMzApICs9IGFkaXMxNjEzMC5vCisKIGFkaXMxNjI2MC15ICAgICAgICAgICAgIDo9IGFkaXMxNjI2MF9jb3JlLm8KIGFkaXMxNjI2MC0kKENPTkZJR19JSU9fUklOR19CVUZGRVIpICs9IGFkaXMxNjI2MF9yaW5nLm8gYWRpczE2MjYwX3RyaWdnZXIubwogb2JqLSQoQ09ORklHX0FESVMxNjI2MCkgKz0gYWRpczE2MjYwLm8KKworYWRpczE2MjUxLXkgICAgICAgICAgICAgOj0gYWRpczE2MjUxX2NvcmUubworb2JqLSQoQ09ORklHX0FESVMxNjI1MSkgKz0gYWRpczE2MjUxLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYwNjAuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYwNjAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzAwZTUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjA2MC5oCkBAIC0wLDAgKzEsMTAxIEBACisjaWZuZGVmIFNQSV9BRElTMTYwNjBfSF8KKyNkZWZpbmUgU1BJX0FESVMxNjA2MF9IXworCisjZGVmaW5lIEFESVMxNjA2MF9HWVJPICAgICAgIDB4MjAgLyogTWVhc3VyZSBBbmd1bGFyIFJhdGUgKEd5cm8pICovCisjZGVmaW5lIEFESVMxNjA2MF9TVVBQTFlfT1VUIDB4MTAgLyogTWVhc3VyZSBUZW1wZXJhdHVyZSAqLworI2RlZmluZSBBRElTMTYwNjBfQUlOMiAgICAgICAweDgwIC8qIE1lYXN1cmUgQUlOMiAqLworI2RlZmluZSBBRElTMTYwNjBfQUlOMSAgICAgICAweDQwIC8qIE1lYXN1cmUgQUlOMSAqLworI2RlZmluZSBBRElTMTYwNjBfVEVNUF9PVVQgICAweDIyIC8qIFNldCBQb3NpdGl2ZSBTZWxmLVRlc3QgYW5kIE91dHB1dCBmb3IgQW5ndWxhciBSYXRlICovCisjZGVmaW5lIEFESVMxNjA2MF9BTkdMX09VVCAgIDB4MjEgLyogU2V0IE5lZ2F0aXZlIFNlbGYtVGVzdCBhbmQgT3V0cHV0IGZvciBBbmd1bGFyIFJhdGUgKi8KKworI2RlZmluZSBBRElTMTYwNjBfTUFYX1RYICAgICAzCisjZGVmaW5lIEFESVMxNjA2MF9NQVhfUlggICAgIDMKKworLyoqCisgKiBzdHJ1Y3QgYWRpczE2MDYwX3N0YXRlIC0gZGV2aWNlIGluc3RhbmNlIHNwZWNpZmljIGRhdGEKKyAqIEB1c193OgkJCWFjdHVhbCBzcGlfZGV2aWNlIHRvIHdyaXRlIGRhdGEKKyAqIEB3b3JrX3RyaWdnZXJfdG9fcmluZzogYmggZm9yIHRyaWdnZXJlZCBldmVudCBoYW5kbGluZworICogQGludGVyOgkJdXNlZCB0byBjaGVjayBpZiBuZXcgaW50ZXJydXB0IGhhcyBiZWVuIHRyaWdnZXJlZAorICogQGxhc3RfdGltZXN0YW1wOglwYXNzaW5nIHRpbWVzdGFtcCBmcm9tIHRoIHRvIGJoIG9mIGludGVycnVwdCBoYW5kbGVyCisgKiBAaW5kaW9fZGV2OgkJaW5kdXN0cmlhbCBJL08gZGV2aWNlIHN0cnVjdHVyZQorICogQHRyaWc6CQlkYXRhIHJlYWR5IHRyaWdnZXIgcmVnaXN0ZXJlZCB3aXRoIGlpbworICogQHR4OgkJCXRyYW5zbWl0IGJ1ZmZlcgorICogQHJ4OgkJCXJlY2lldmUgYnVmZmVyCisgKiBAYnVmX2xvY2s6CQltdXRleCB0byBwcm90ZWN0IHR4IGFuZCByeAorICoqLworc3RydWN0IGFkaXMxNjA2MF9zdGF0ZSB7CisJc3RydWN0IHNwaV9kZXZpY2UJCSp1c193OworCXN0cnVjdCBzcGlfZGV2aWNlCQkqdXNfcjsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCXdvcmtfdHJpZ2dlcl90b19yaW5nOworCXM2NAkJCQlsYXN0X3RpbWVzdGFtcDsKKwlzdHJ1Y3QgaWlvX2RldgkJCSppbmRpb19kZXY7CisJc3RydWN0IGlpb190cmlnZ2VyCQkqdHJpZzsKKwl1OAkJCQkqdHg7CisJdTgJCQkJKnJ4OworCXN0cnVjdCBtdXRleAkJCWJ1Zl9sb2NrOworfTsKKworI2lmIGRlZmluZWQoQ09ORklHX0lJT19SSU5HX0JVRkZFUikgJiYgZGVmaW5lZChUSElTX0hBU19SSU5HX0JVRkZFUl9TVVBQT1JUKQorLyogQXQgdGhlIG1vbWVudCB0cmlnZ2VycyBhcmUgb25seSB1c2VkIGZvciByaW5nIGJ1ZmZlcgorICogZmlsbGluZy4gVGhpcyBtYXkgY2hhbmdlIQorICovCisKK2VudW0gYWRpczE2MDYwX3NjYW4geworCUFESVMxNjA2MF9TQ0FOX0dZUk8sCisJQURJUzE2MDYwX1NDQU5fVEVNUCwKKwlBRElTMTYwNjBfU0NBTl9BRENfMSwKKwlBRElTMTYwNjBfU0NBTl9BRENfMiwKK307CisKK3ZvaWQgYWRpczE2MDYwX3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOworaW50IGFkaXMxNjA2MF9wcm9iZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOworCitzc2l6ZV90IGFkaXMxNjA2MF9yZWFkX2RhdGFfZnJvbV9yaW5nKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgICBjaGFyICpidWYpOworCisKK2ludCBhZGlzMTYwNjBfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7Cit2b2lkIGFkaXMxNjA2MF91bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOworCitpbnQgYWRpczE2MDYwX2luaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKTsKK3ZvaWQgYWRpczE2MDYwX3VuaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpOworI2Vsc2UgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgYWRpczE2MDYwX3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFkaXMxNjA2MF9wcm9iZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdAorYWRpczE2MDYwX3JlYWRfZGF0YV9mcm9tX3Jpbmcoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICBjaGFyICpidWYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRpczE2MDYwX2NvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGlzMTYwNjBfdW5jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworfQorCitzdGF0aWMgaW5saW5lIGludCBhZGlzMTYwNjBfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGlzMTYwNjBfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKK3sKK30KKworI2VuZGlmIC8qIENPTkZJR19JSU9fUklOR19CVUZGRVIgKi8KKyNlbmRpZiAvKiBTUElfQURJUzE2MDYwX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MDYwX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYwNjBfY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNDhhY2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MDYwX2NvcmUuYwpAQCAtMCwwICsxLDMxOSBAQAorLyoKKyAqIEFESVMxNjA2MCBXaWRlIEJhbmR3aWR0aCBZYXcgUmF0ZSBHeXJvc2NvcGUgd2l0aCBTUEkgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKyNpbmNsdWRlICJneXJvLmgiCisjaW5jbHVkZSAiLi4vYWRjL2FkYy5oIgorCisjaW5jbHVkZSAiYWRpczE2MDYwLmgiCisKKyNkZWZpbmUgRFJJVkVSX05BTUUJCSJhZGlzMTYwNjAiCisKK3N0cnVjdCBhZGlzMTYwNjBfc3RhdGUgKmFkaXMxNjA2MF9zdDsKKworaW50IGFkaXMxNjA2MF9zcGlfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LAorCQl1OCB2YWwpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkaXMxNjA2MF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IDA7CisJc3QtPnR4WzFdID0gMDsKKwlzdC0+dHhbMl0gPSB2YWw7IC8qIFRoZSBsYXN0IDggYml0cyBjbG9ja2VkIGluIGFyZSBsYXRjaGVkICovCisKKwlyZXQgPSBzcGlfd3JpdGUoc3QtPnVzX3csIHN0LT50eCwgMyk7CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGFkaXMxNjA2MF9zcGlfcmVhZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXUxNiAqdmFsKQoreworCWludCByZXQ7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGlzMTYwNjBfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKworCXJldCA9IHNwaV9yZWFkKHN0LT51c19yLCBzdC0+cngsIDMpOworCisJLyogVGhlIGludGVybmFsIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbiBBREMgYmVnaW5zIHRoZSBjb252ZXJzaW9uIHByb2Nlc3MKKwkgKiBvbiB0aGUgZmFsbGluZyBlZGdlIG9mIE1TRUwxIGFuZCBzdGFydHMgdG8gcGxhY2UgZGF0YSBNU0IgZmlyc3Qgb24gdGhlCisJICogRE9VVCBsaW5lIGF0IHRoZSA2dGggZmFsbGluZyBlZGdlIG9mIFNDTEsKKwkgKi8KKwlpZiAocmV0ID09IDApCisJCSp2YWwgPSAoKHN0LT5yeFswXSAmIDB4MykgPDwgMTIpIHwgKHN0LT5yeFsxXSA8PCA0KSB8ICgoc3QtPnJ4WzJdID4+IDQpICYgMHhGKTsKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZGlzMTYwNjBfcmVhZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXUxNiB2YWw7CisJc3NpemVfdCByZXQ7CisKKwkvKiBUYWtlIHRoZSBpaW9fZGV2IHN0YXR1cyBsb2NrICovCisJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJcmV0ID0gIGFkaXMxNjA2MF9zcGlfcmVhZChkZXYsICZ2YWwpOworCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisKKwlpZiAocmV0ID09IDApCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2YWwpOworCWVsc2UKKwkJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWRpczE2MDYwX3dyaXRlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlpbnQgcmV0OworCWxvbmcgdmFsOworCisJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDE2LCAmdmFsKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKwlyZXQgPSBhZGlzMTYwNjBfc3BpX3dyaXRlKGRldiwgdmFsKTsKKworZXJyb3JfcmV0OgorCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0lOKF9zaG93KQkJCQlcCisJSUlPX0RFVklDRV9BVFRSKGluLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgMCkKKworI2RlZmluZSBJSU9fREVWX0FUVFJfT1VUKF9zdG9yZSkJCQkJXAorCUlJT19ERVZJQ0VfQVRUUihvdXQsIFNfSVJVR08sIE5VTEwsIF9zdG9yZSwgMCkKKworc3RhdGljIElJT19ERVZfQVRUUl9JTihhZGlzMTYwNjBfcmVhZCk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX09VVChhZGlzMTYwNjBfd3JpdGUpOworCitzdGF0aWMgSUlPX0NPTlNUX0FUVFIobmFtZSwgImFkaXMxNjA2MCIpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRpczE2MDYwX2V2ZW50X2F0dHJpYnV0ZXNbXSA9IHsKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZGlzMTYwNjBfZXZlbnRfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkaXMxNjA2MF9ldmVudF9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkaXMxNjA2MF9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19kZXZfYXR0cl9pbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfb3V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX25hbWUuZGV2X2F0dHIuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZGlzMTYwNjBfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkaXMxNjA2MF9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgYWRpczE2MDYwX3JfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlpbnQgcmV0LCByZWdkb25lID0gMDsKKwlzdHJ1Y3QgYWRpczE2MDYwX3N0YXRlICpzdCA9IGt6YWxsb2Moc2l6ZW9mICpzdCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdCkgeworCQlyZXQgPSAgLUVOT01FTTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCS8qIHRoaXMgaXMgb25seSB1c2VkIGZvciByZW1vdmFsIHB1cnBvc2VzICovCisJc3BpX3NldF9kcnZkYXRhKHNwaSwgc3QpOworCisJLyogQWxsb2NhdGUgdGhlIGNvbW1zIGJ1ZmZlcnMgKi8KKwlzdC0+cnggPSBremFsbG9jKHNpemVvZigqc3QtPnJ4KSpBRElTMTYwNjBfTUFYX1JYLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QtPnJ4ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3N0OworCX0KKwlzdC0+dHggPSBremFsbG9jKHNpemVvZigqc3QtPnR4KSpBRElTMTYwNjBfTUFYX1RYLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QtPnR4ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3J4OworCX0KKwlzdC0+dXNfciA9IHNwaTsKKwltdXRleF9pbml0KCZzdC0+YnVmX2xvY2spOworCS8qIHNldHVwIHRoZSBpbmR1c3RyaWFsaW8gZHJpdmVyIGFsbG9jYXRlZCBlbGVtZW50cyAqLworCXN0LT5pbmRpb19kZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKHN0LT5pbmRpb19kZXYgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfdHg7CisJfQorCisJc3QtPmluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZzcGktPmRldjsKKwlzdC0+aW5kaW9fZGV2LT5udW1faW50ZXJydXB0X2xpbmVzID0gMTsKKwlzdC0+aW5kaW9fZGV2LT5ldmVudF9hdHRycyA9ICZhZGlzMTYwNjBfZXZlbnRfYXR0cmlidXRlX2dyb3VwOworCXN0LT5pbmRpb19kZXYtPmF0dHJzID0gJmFkaXMxNjA2MF9hdHRyaWJ1dGVfZ3JvdXA7CisJc3QtPmluZGlvX2Rldi0+ZGV2X2RhdGEgPSAodm9pZCAqKShzdCk7CisJc3QtPmluZGlvX2Rldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCXN0LT5pbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwlyZXQgPSBhZGlzMTYwNjBfY29uZmlndXJlX3Jpbmcoc3QtPmluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldjsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoc3QtPmluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOworCXJlZ2RvbmUgPSAxOworCisJcmV0ID0gYWRpczE2MDYwX2luaXRpYWxpemVfcmluZyhzdC0+aW5kaW9fZGV2LT5yaW5nKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIHJpbmdcbiIpOworCQlnb3RvIGVycm9yX3VucmVnX3JpbmdfZnVuY3M7CisJfQorCisJaWYgKHNwaS0+aXJxICYmIGdwaW9faXNfdmFsaWQoaXJxX3RvX2dwaW8oc3BpLT5pcnEpKSA+IDApIHsKKwkJcmV0ID0gaWlvX3JlZ2lzdGVyX2ludGVycnVwdF9saW5lKHNwaS0+aXJxLAorCQkJCXN0LT5pbmRpb19kZXYsCisJCQkJMCwKKwkJCQlJUlFGX1RSSUdHRVJfUklTSU5HLAorCQkJCSJhZGlzMTYwNjAiKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfdW5pbml0aWFsaXplX3Jpbmc7CisKKwkJcmV0ID0gYWRpczE2MDYwX3Byb2JlX3RyaWdnZXIoc3QtPmluZGlvX2Rldik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3VucmVnaXN0ZXJfbGluZTsKKwl9CisKKwlhZGlzMTYwNjBfc3QgPSBzdDsKKwlyZXR1cm4gMDsKKworZXJyb3JfdW5yZWdpc3Rlcl9saW5lOgorCWlmIChzdC0+aW5kaW9fZGV2LT5tb2RlcyAmIElORElPX1JJTkdfVFJJR0dFUkVEKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShzdC0+aW5kaW9fZGV2LCAwKTsKK2Vycm9yX3VuaW5pdGlhbGl6ZV9yaW5nOgorCWFkaXMxNjA2MF91bmluaXRpYWxpemVfcmluZyhzdC0+aW5kaW9fZGV2LT5yaW5nKTsKK2Vycm9yX3VucmVnX3JpbmdfZnVuY3M6CisJYWRpczE2MDYwX3VuY29uZmlndXJlX3Jpbmcoc3QtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX2RldjoKKwlpZiAocmVnZG9uZSkKKwkJaWlvX2RldmljZV91bnJlZ2lzdGVyKHN0LT5pbmRpb19kZXYpOworCWVsc2UKKwkJaWlvX2ZyZWVfZGV2aWNlKHN0LT5pbmRpb19kZXYpOworZXJyb3JfZnJlZV90eDoKKwlrZnJlZShzdC0+dHgpOworZXJyb3JfZnJlZV9yeDoKKwlrZnJlZShzdC0+cngpOworZXJyb3JfZnJlZV9zdDoKKwlrZnJlZShzdCk7CitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworLyogZml4bWUsIGNvbmZpcm0gb3JkZXJpbmcgaW4gdGhpcyBmdW5jdGlvbiAqLworc3RhdGljIGludCBhZGlzMTYwNjBfcl9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWRpczE2MDYwX3N0YXRlICpzdCA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBzdC0+aW5kaW9fZGV2OworCisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKworCWFkaXMxNjA2MF9yZW1vdmVfdHJpZ2dlcihpbmRpb19kZXYpOworCWlmIChzcGktPmlycSAmJiBncGlvX2lzX3ZhbGlkKGlycV90b19ncGlvKHNwaS0+aXJxKSkgPiAwKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShpbmRpb19kZXYsIDApOworCisJYWRpczE2MDYwX3VuaW5pdGlhbGl6ZV9yaW5nKGluZGlvX2Rldi0+cmluZyk7CisJYWRpczE2MDYwX3VuY29uZmlndXJlX3JpbmcoaW5kaW9fZGV2KTsKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlrZnJlZShzdC0+dHgpOworCWtmcmVlKHN0LT5yeCk7CisJa2ZyZWUoc3QpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkaXMxNjA2MF93X3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYWRpczE2MDYwX3N0YXRlICpzdCA9IGFkaXMxNjA2MF9zdDsKKwlpZiAoIXN0KSB7CisJCXJldCA9ICAtRU5PREVWOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJc3BpX3NldF9kcnZkYXRhKHNwaSwgc3QpOworCXN0LT51c193ID0gc3BpOworCXJldHVybiAwOworCitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGlzMTYwNjBfd19yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFkaXMxNjA2MF9yX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhZGlzMTYwNjBfciIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gYWRpczE2MDYwX3JfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFkaXMxNjA2MF9yX3JlbW92ZSksCit9OworCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWRpczE2MDYwX3dfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFkaXMxNjA2MF93IiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhZGlzMTYwNjBfd19wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWRpczE2MDYwX3dfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGFkaXMxNjA2MF9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFkaXMxNjA2MF9yX2RyaXZlcik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZhZGlzMTYwNjBfd19kcml2ZXIpOworCWlmIChyZXQgPCAwKSB7CisJCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYWRpczE2MDYwX3JfZHJpdmVyKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KK21vZHVsZV9pbml0KGFkaXMxNjA2MF9pbml0KTsKKworc3RhdGljIF9fZXhpdCB2b2lkIGFkaXMxNjA2MF9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZGlzMTYwNjBfd19kcml2ZXIpOworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYWRpczE2MDYwX3JfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFkaXMxNjA2MF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQmFycnkgU29uZyA8MjFjbmJhb0BnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFESVMxNjA2MCBZYXcgUmF0ZSBHeXJvc2NvcGUgd2l0aCBTUEkgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MDgwLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MDgwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZjYmU2NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYwODAuaApAQCAtMCwwICsxLDEwMiBAQAorI2lmbmRlZiBTUElfQURJUzE2MDgwX0hfCisjZGVmaW5lIFNQSV9BRElTMTYwODBfSF8KKworI2RlZmluZSBBRElTMTYwODBfRElOX0NPREUgICA0IC8qIE91dHB1dCBkYXRhIGZvcm1hdCBzZXR0aW5nLiAwOiBUd29zIGNvbXBsZW1lbnQuIDE6IE9mZnNldCBiaW5hcnkuICovCisjZGVmaW5lIEFESVMxNjA4MF9ESU5fR1lSTyAgICgwIDw8IDEwKSAvKiBHeXJvc2NvcGUgb3V0cHV0ICovCisjZGVmaW5lIEFESVMxNjA4MF9ESU5fVEVNUCAgICgxIDw8IDEwKSAvKiBUZW1wZXJhdHVyZSBvdXRwdXQgKi8KKyNkZWZpbmUgQURJUzE2MDgwX0RJTl9BSU4xICAgKDIgPDwgMTApCisjZGVmaW5lIEFESVMxNjA4MF9ESU5fQUlOMiAgICgzIDw8IDEwKQorI2RlZmluZSBBRElTMTYwODBfRElOX1dSSVRFICAoMSA8PCAxNSkgLyogMTogV3JpdGUgY29udGVudHMgb24gRElOIHRvIGNvbnRyb2wgcmVnaXN0ZXIuCisJCQkJCSogMDogTm8gY2hhbmdlcyB0byBjb250cm9sIHJlZ2lzdGVyLgorCQkJCQkqLworCisjZGVmaW5lIEFESVMxNjA4MF9NQVhfVFggICAgIDIKKyNkZWZpbmUgQURJUzE2MDgwX01BWF9SWCAgICAgMgorCisvKioKKyAqIHN0cnVjdCBhZGlzMTYwODBfc3RhdGUgLSBkZXZpY2UgaW5zdGFuY2Ugc3BlY2lmaWMgZGF0YQorICogQHVzOgkJCWFjdHVhbCBzcGlfZGV2aWNlIHRvIHdyaXRlIGRhdGEKKyAqIEB3b3JrX3RyaWdnZXJfdG9fcmluZzogYmggZm9yIHRyaWdnZXJlZCBldmVudCBoYW5kbGluZworICogQGludGVyOgkJdXNlZCB0byBjaGVjayBpZiBuZXcgaW50ZXJydXB0IGhhcyBiZWVuIHRyaWdnZXJlZAorICogQGxhc3RfdGltZXN0YW1wOglwYXNzaW5nIHRpbWVzdGFtcCBmcm9tIHRoIHRvIGJoIG9mIGludGVycnVwdCBoYW5kbGVyCisgKiBAaW5kaW9fZGV2OgkJaW5kdXN0cmlhbCBJL08gZGV2aWNlIHN0cnVjdHVyZQorICogQHRyaWc6CQlkYXRhIHJlYWR5IHRyaWdnZXIgcmVnaXN0ZXJlZCB3aXRoIGlpbworICogQHR4OgkJCXRyYW5zbWl0IGJ1ZmZlcgorICogQHJ4OgkJCXJlY2lldmUgYnVmZmVyCisgKiBAYnVmX2xvY2s6CQltdXRleCB0byBwcm90ZWN0IHR4IGFuZCByeAorICoqLworc3RydWN0IGFkaXMxNjA4MF9zdGF0ZSB7CisJc3RydWN0IHNwaV9kZXZpY2UJCSp1czsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCXdvcmtfdHJpZ2dlcl90b19yaW5nOworCXM2NAkJCQlsYXN0X3RpbWVzdGFtcDsKKwlzdHJ1Y3QgaWlvX2RldgkJCSppbmRpb19kZXY7CisJc3RydWN0IGlpb190cmlnZ2VyCQkqdHJpZzsKKwl1OAkJCQkqdHg7CisJdTgJCQkJKnJ4OworCXN0cnVjdCBtdXRleAkJCWJ1Zl9sb2NrOworfTsKKworI2lmIGRlZmluZWQoQ09ORklHX0lJT19SSU5HX0JVRkZFUikgJiYgZGVmaW5lZChUSElTX0hBU19SSU5HX0JVRkZFUl9TVVBQT1JUKQorLyogQXQgdGhlIG1vbWVudCB0cmlnZ2VycyBhcmUgb25seSB1c2VkIGZvciByaW5nIGJ1ZmZlcgorICogZmlsbGluZy4gVGhpcyBtYXkgY2hhbmdlIQorICovCisKK2VudW0gYWRpczE2MDgwX3NjYW4geworCUFESVMxNjA4MF9TQ0FOX0dZUk8sCisJQURJUzE2MDgwX1NDQU5fVEVNUCwKKwlBRElTMTYwODBfU0NBTl9BRENfMSwKKwlBRElTMTYwODBfU0NBTl9BRENfMiwKK307CisKK3ZvaWQgYWRpczE2MDgwX3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOworaW50IGFkaXMxNjA4MF9wcm9iZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOworCitzc2l6ZV90IGFkaXMxNjA4MF9yZWFkX2RhdGFfZnJvbV9yaW5nKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgICBjaGFyICpidWYpOworCisKK2ludCBhZGlzMTYwODBfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7Cit2b2lkIGFkaXMxNjA4MF91bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOworCitpbnQgYWRpczE2MDgwX2luaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKTsKK3ZvaWQgYWRpczE2MDgwX3VuaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpOworI2Vsc2UgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgYWRpczE2MDgwX3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFkaXMxNjA4MF9wcm9iZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdAorYWRpczE2MDgwX3JlYWRfZGF0YV9mcm9tX3Jpbmcoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICBjaGFyICpidWYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRpczE2MDgwX2NvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGlzMTYwODBfdW5jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworfQorCitzdGF0aWMgaW5saW5lIGludCBhZGlzMTYwODBfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGlzMTYwODBfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKK3sKK30KKworI2VuZGlmIC8qIENPTkZJR19JSU9fUklOR19CVUZGRVIgKi8KKyNlbmRpZiAvKiBTUElfQURJUzE2MDgwX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MDgwX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYwODBfY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZmI3NjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MDgwX2NvcmUuYwpAQCAtMCwwICsxLDI3MSBAQAorLyoKKyAqIEFESVMxNjA4MC8xMDAgWWF3IFJhdGUgR3lyb3Njb3BlIHdpdGggU1BJIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisjaW5jbHVkZSAiZ3lyby5oIgorI2luY2x1ZGUgIi4uL2FkYy9hZGMuaCIKKworI2luY2x1ZGUgImFkaXMxNjA4MC5oIgorCisjZGVmaW5lIERSSVZFUl9OQU1FCQkiYWRpczE2MDgwIgorCitzdHJ1Y3QgYWRpczE2MDgwX3N0YXRlICphZGlzMTYwODBfc3Q7CisKK2ludCBhZGlzMTYwODBfc3BpX3dyaXRlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTE2IHZhbCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRpczE2MDgwX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gdmFsID4+IDg7CisJc3QtPnR4WzFdID0gdmFsOworCisJcmV0ID0gc3BpX3dyaXRlKHN0LT51cywgc3QtPnR4LCAyKTsKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYWRpczE2MDgwX3NwaV9yZWFkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTE2ICp2YWwpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkaXMxNjA4MF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0ID0gc3BpX3JlYWQoc3QtPnVzLCBzdC0+cngsIDIpOworCisJaWYgKHJldCA9PSAwKQorCQkqdmFsID0gKChzdC0+cnhbMF0gJiAweEYpIDw8IDgpIHwgc3QtPnJ4WzFdOworCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkaXMxNjA4MF9yZWFkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdTE2IHZhbDsKKwlzc2l6ZV90IHJldDsKKworCS8qIFRha2UgdGhlIGlpb19kZXYgc3RhdHVzIGxvY2sgKi8KKwltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwlyZXQgPSAgYWRpczE2MDgwX3NwaV9yZWFkKGRldiwgJnZhbCk7CisJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCWlmIChyZXQgPT0gMCkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHZhbCk7CisJZWxzZQorCQlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZGlzMTYwODBfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCWludCByZXQ7CisJbG9uZyB2YWw7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTYsICZ2YWwpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCXJldCA9IGFkaXMxNjA4MF9zcGlfd3JpdGUoZGV2LCB2YWwpOworCitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworI2RlZmluZSBJSU9fREVWX0FUVFJfSU4oX3Nob3cpCQkJCVwKKwlJSU9fREVWSUNFX0FUVFIoaW4sIFNfSVJVR08sIF9zaG93LCBOVUxMLCAwKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9PVVQoX3N0b3JlKQkJCQlcCisJSUlPX0RFVklDRV9BVFRSKG91dCwgU19JUlVHTywgTlVMTCwgX3N0b3JlLCAwKQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX0lOKGFkaXMxNjA4MF9yZWFkKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfT1VUKGFkaXMxNjA4MF93cml0ZSk7CisKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihuYW1lLCAiYWRpczE2MDgwIik7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZGlzMTYwODBfZXZlbnRfYXR0cmlidXRlc1tdID0geworCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkaXMxNjA4MF9ldmVudF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWRpczE2MDgwX2V2ZW50X2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRpczE2MDgwX2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2Rldl9hdHRyX2luLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9vdXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkaXMxNjA4MF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWRpczE2MDgwX2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZGlzMTYwODBfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlpbnQgcmV0LCByZWdkb25lID0gMDsKKwlzdHJ1Y3QgYWRpczE2MDgwX3N0YXRlICpzdCA9IGt6YWxsb2Moc2l6ZW9mICpzdCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdCkgeworCQlyZXQgPSAgLUVOT01FTTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCS8qIHRoaXMgaXMgb25seSB1c2VkIGZvciByZW1vdmFsIHB1cnBvc2VzICovCisJc3BpX3NldF9kcnZkYXRhKHNwaSwgc3QpOworCisJLyogQWxsb2NhdGUgdGhlIGNvbW1zIGJ1ZmZlcnMgKi8KKwlzdC0+cnggPSBremFsbG9jKHNpemVvZigqc3QtPnJ4KSpBRElTMTYwODBfTUFYX1JYLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QtPnJ4ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3N0OworCX0KKwlzdC0+dHggPSBremFsbG9jKHNpemVvZigqc3QtPnR4KSpBRElTMTYwODBfTUFYX1RYLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QtPnR4ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3J4OworCX0KKwlzdC0+dXMgPSBzcGk7CisJbXV0ZXhfaW5pdCgmc3QtPmJ1Zl9sb2NrKTsKKwkvKiBzZXR1cCB0aGUgaW5kdXN0cmlhbGlvIGRyaXZlciBhbGxvY2F0ZWQgZWxlbWVudHMgKi8KKwlzdC0+aW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChzdC0+aW5kaW9fZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3R4OworCX0KKworCXN0LT5pbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmc3BpLT5kZXY7CisJc3QtPmluZGlvX2Rldi0+bnVtX2ludGVycnVwdF9saW5lcyA9IDE7CisJc3QtPmluZGlvX2Rldi0+ZXZlbnRfYXR0cnMgPSAmYWRpczE2MDgwX2V2ZW50X2F0dHJpYnV0ZV9ncm91cDsKKwlzdC0+aW5kaW9fZGV2LT5hdHRycyA9ICZhZGlzMTYwODBfYXR0cmlidXRlX2dyb3VwOworCXN0LT5pbmRpb19kZXYtPmRldl9kYXRhID0gKHZvaWQgKikoc3QpOworCXN0LT5pbmRpb19kZXYtPmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRTsKKwlzdC0+aW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJcmV0ID0gYWRpczE2MDgwX2NvbmZpZ3VyZV9yaW5nKHN0LT5pbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKHN0LT5pbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfdW5yZWdfcmluZ19mdW5jczsKKwlyZWdkb25lID0gMTsKKworCXJldCA9IGFkaXMxNjA4MF9pbml0aWFsaXplX3Jpbmcoc3QtPmluZGlvX2Rldi0+cmluZyk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byBpbml0aWFsaXplIHRoZSByaW5nXG4iKTsKKwkJZ290byBlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOworCX0KKworCWlmIChzcGktPmlycSAmJiBncGlvX2lzX3ZhbGlkKGlycV90b19ncGlvKHNwaS0+aXJxKSkgPiAwKSB7CisJCXJldCA9IGlpb19yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShzcGktPmlycSwKKwkJCQlzdC0+aW5kaW9fZGV2LAorCQkJCTAsCisJCQkJSVJRRl9UUklHR0VSX1JJU0lORywKKwkJCQkiYWRpczE2MDgwIik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3VuaW5pdGlhbGl6ZV9yaW5nOworCisJCXJldCA9IGFkaXMxNjA4MF9wcm9iZV90cmlnZ2VyKHN0LT5pbmRpb19kZXYpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl91bnJlZ2lzdGVyX2xpbmU7CisJfQorCisJYWRpczE2MDgwX3N0ID0gc3Q7CisJcmV0dXJuIDA7CisKK2Vycm9yX3VucmVnaXN0ZXJfbGluZToKKwlpZiAoc3QtPmluZGlvX2Rldi0+bW9kZXMgJiBJTkRJT19SSU5HX1RSSUdHRVJFRCkKKwkJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoc3QtPmluZGlvX2RldiwgMCk7CitlcnJvcl91bmluaXRpYWxpemVfcmluZzoKKwlhZGlzMTYwODBfdW5pbml0aWFsaXplX3Jpbmcoc3QtPmluZGlvX2Rldi0+cmluZyk7CitlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOgorCWFkaXMxNjA4MF91bmNvbmZpZ3VyZV9yaW5nKHN0LT5pbmRpb19kZXYpOworZXJyb3JfZnJlZV9kZXY6CisJaWYgKHJlZ2RvbmUpCisJCWlpb19kZXZpY2VfdW5yZWdpc3RlcihzdC0+aW5kaW9fZGV2KTsKKwllbHNlCisJCWlpb19mcmVlX2RldmljZShzdC0+aW5kaW9fZGV2KTsKK2Vycm9yX2ZyZWVfdHg6CisJa2ZyZWUoc3QtPnR4KTsKK2Vycm9yX2ZyZWVfcng6CisJa2ZyZWUoc3QtPnJ4KTsKK2Vycm9yX2ZyZWVfc3Q6CisJa2ZyZWUoc3QpOworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKKy8qIGZpeG1lLCBjb25maXJtIG9yZGVyaW5nIGluIHRoaXMgZnVuY3Rpb24gKi8KK3N0YXRpYyBpbnQgYWRpczE2MDgwX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBhZGlzMTYwODBfc3RhdGUgKnN0ID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHN0LT5pbmRpb19kZXY7CisKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCisJYWRpczE2MDgwX3JlbW92ZV90cmlnZ2VyKGluZGlvX2Rldik7CisJaWYgKHNwaS0+aXJxICYmIGdwaW9faXNfdmFsaWQoaXJxX3RvX2dwaW8oc3BpLT5pcnEpKSA+IDApCisJCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKGluZGlvX2RldiwgMCk7CisKKwlhZGlzMTYwODBfdW5pbml0aWFsaXplX3JpbmcoaW5kaW9fZGV2LT5yaW5nKTsKKwlhZGlzMTYwODBfdW5jb25maWd1cmVfcmluZyhpbmRpb19kZXYpOworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWtmcmVlKHN0LT50eCk7CisJa2ZyZWUoc3QtPnJ4KTsKKwlrZnJlZShzdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFkaXMxNjA4MF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYWRpczE2MDgwIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhZGlzMTYwODBfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFkaXMxNjA4MF9yZW1vdmUpLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWRpczE2MDgwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmYWRpczE2MDgwX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChhZGlzMTYwODBfaW5pdCk7CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBhZGlzMTYwODBfZXhpdCh2b2lkKQoreworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYWRpczE2MDgwX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhZGlzMTYwODBfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkJhcnJ5IFNvbmcgPDIxY25iYW9AZ21haWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBBRElTMTYwODAvMTAwIFlhdyBSYXRlIEd5cm9zY29wZSB3aXRoIFNQSSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYxMzAuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYxMzAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjgwZWY2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjEzMC5oCkBAIC0wLDAgKzEsMTA4IEBACisjaWZuZGVmIFNQSV9BRElTMTYxMzBfSF8KKyNkZWZpbmUgU1BJX0FESVMxNjEzMF9IXworCisjZGVmaW5lIEFESVMxNjEzMF9DT04gICAgICAgICAweDAKKyNkZWZpbmUgQURJUzE2MTMwX0NPTl9SRCAgICAgICgxIDw8IDYpCisjZGVmaW5lIEFESVMxNjEzMF9JT1AgICAgICAgICAweDEKKyNkZWZpbmUgQURJUzE2MTMwX0lPUF9BTExfUkRZICgxIDw8IDMpIC8qIDEgPSBkYXRhLXJlYWR5IHNpZ25hbCBsb3cgd2hlbiB1bnJlYWQgZGF0YSBvbiBhbGwgY2hhbm5lbHM7ICovCisjZGVmaW5lIEFESVMxNjEzMF9JT1BfU1lOQyAgICAoMSA8PCAwKSAvKiAxID0gc3luY2hyb25pemF0aW9uIGVuYWJsZWQgKi8KKyNkZWZpbmUgQURJUzE2MTMwX1JBVEVEQVRBICAgIDB4OCAvKiBHeXJvc2NvcGUgb3V0cHV0LCByYXRlIG9mIHJvdGF0aW9uICovCisjZGVmaW5lIEFESVMxNjEzMF9URU1QREFUQSAgICAweEEgLyogVGVtcGVyYXR1cmUgb3V0cHV0ICovCisjZGVmaW5lIEFESVMxNjEzMF9SQVRFQ1MgICAgICAweDI4IC8qIEd5cm9zY29wZSBjaGFubmVsIHNldHVwICovCisjZGVmaW5lIEFESVMxNjEzMF9SQVRFQ1NfRU4gICAoMSA8PCAzKSAvKiAxID0gY2hhbm5lbCBlbmFibGU7ICovCisjZGVmaW5lIEFESVMxNjEzMF9URU1QQ1MgICAgICAweDJBIC8qIFRlbXBlcmF0dXJlIGNoYW5uZWwgc2V0dXAgKi8KKyNkZWZpbmUgQURJUzE2MTMwX1RFTVBDU19FTiAgICgxIDw8IDMpCisjZGVmaW5lIEFESVMxNjEzMF9SQVRFQ09OViAgICAweDMwCisjZGVmaW5lIEFESVMxNjEzMF9URU1QQ09OViAgICAweDMyCisjZGVmaW5lIEFESVMxNjEzMF9NT0RFICAgICAgICAweDM4CisjZGVmaW5lIEFESVMxNjEzMF9NT0RFXzI0QklUICAoMSA8PCAxKSAvKiAxID0gMjQtYml0IHJlc29sdXRpb247ICovCisKKyNkZWZpbmUgQURJUzE2MTMwX01BWF9UWCAgICAgNAorI2RlZmluZSBBRElTMTYxMzBfTUFYX1JYICAgICA0CisKKy8qKgorICogc3RydWN0IGFkaXMxNjEzMF9zdGF0ZSAtIGRldmljZSBpbnN0YW5jZSBzcGVjaWZpYyBkYXRhCisgKiBAdXM6CQkJYWN0dWFsIHNwaV9kZXZpY2UgdG8gd3JpdGUgZGF0YQorICogQHdvcmtfdHJpZ2dlcl90b19yaW5nOiBiaCBmb3IgdHJpZ2dlcmVkIGV2ZW50IGhhbmRsaW5nCisgKiBAaW50ZXI6CQl1c2VkIHRvIGNoZWNrIGlmIG5ldyBpbnRlcnJ1cHQgaGFzIGJlZW4gdHJpZ2dlcmVkCisgKiBAbGFzdF90aW1lc3RhbXA6CXBhc3NpbmcgdGltZXN0YW1wIGZyb20gdGggdG8gYmggb2YgaW50ZXJydXB0IGhhbmRsZXIKKyAqIEBpbmRpb19kZXY6CQlpbmR1c3RyaWFsIEkvTyBkZXZpY2Ugc3RydWN0dXJlCisgKiBAdHJpZzoJCWRhdGEgcmVhZHkgdHJpZ2dlciByZWdpc3RlcmVkIHdpdGggaWlvCisgKiBAdHg6CQkJdHJhbnNtaXQgYnVmZmVyCisgKiBAcng6CQkJcmVjaWV2ZSBidWZmZXIKKyAqIEBidWZfbG9jazoJCW11dGV4IHRvIHByb3RlY3QgdHggYW5kIHJ4CisgKiovCitzdHJ1Y3QgYWRpczE2MTMwX3N0YXRlIHsKKwlzdHJ1Y3Qgc3BpX2RldmljZQkJKnVzOworCXN0cnVjdCB3b3JrX3N0cnVjdAkJd29ya190cmlnZ2VyX3RvX3Jpbmc7CisJczY0CQkJCWxhc3RfdGltZXN0YW1wOworCXN0cnVjdCBpaW9fZGV2CQkJKmluZGlvX2RldjsKKwlzdHJ1Y3QgaWlvX3RyaWdnZXIJCSp0cmlnOworCXU4CQkJCSp0eDsKKwl1OAkJCQkqcng7CisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlOyAvKiAxOiAyNGJpdHMgbW9kZSAwOjE2Yml0cyBtb2RlICovCisJc3RydWN0IG11dGV4CQkJYnVmX2xvY2s7Cit9OworCisjaWYgZGVmaW5lZChDT05GSUdfSUlPX1JJTkdfQlVGRkVSKSAmJiBkZWZpbmVkKFRISVNfSEFTX1JJTkdfQlVGRkVSX1NVUFBPUlQpCisvKiBBdCB0aGUgbW9tZW50IHRyaWdnZXJzIGFyZSBvbmx5IHVzZWQgZm9yIHJpbmcgYnVmZmVyCisgKiBmaWxsaW5nLiBUaGlzIG1heSBjaGFuZ2UhCisgKi8KKworZW51bSBhZGlzMTYxMzBfc2NhbiB7CisJQURJUzE2MTMwX1NDQU5fR1lSTywKKwlBRElTMTYxMzBfU0NBTl9URU1QLAorfTsKKwordm9pZCBhZGlzMTYxMzBfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CitpbnQgYWRpczE2MTMwX3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKK3NzaXplX3QgYWRpczE2MTMwX3JlYWRfZGF0YV9mcm9tX3Jpbmcoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgIGNoYXIgKmJ1Zik7CisKKworaW50IGFkaXMxNjEzMF9jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKK3ZvaWQgYWRpczE2MTMwX3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKK2ludCBhZGlzMTYxMzBfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpOwordm9pZCBhZGlzMTYxMzBfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7CisjZWxzZSAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGlzMTYxMzBfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKK30KKworc3RhdGljIGlubGluZSBpbnQgYWRpczE2MTMwX3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90CithZGlzMTYxMzBfcmVhZF9kYXRhX2Zyb21fcmluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGlzMTYxMzBfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFkaXMxNjEzMF91bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFkaXMxNjEzMF9pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFkaXMxNjEzMF91bmluaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQoreworfQorCisjZW5kaWYgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLworI2VuZGlmIC8qIFNQSV9BRElTMTYxMzBfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYxMzBfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjEzMF9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlmZmM3YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYxMzBfY29yZS5jCkBAIC0wLDAgKzEsMzEzIEBACisvKgorICogQURJUzE2MTMwIERpZ2l0YWwgT3V0cHV0LCBIaWdoIFByZWNpc2lvbiBBbmd1bGFyIFJhdGUgU2Vuc29yIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisjaW5jbHVkZSAiZ3lyby5oIgorI2luY2x1ZGUgIi4uL2FkYy9hZGMuaCIKKworI2luY2x1ZGUgImFkaXMxNjEzMC5oIgorCisjZGVmaW5lIERSSVZFUl9OQU1FCQkiYWRpczE2MTMwIgorCitzdHJ1Y3QgYWRpczE2MTMwX3N0YXRlICphZGlzMTYxMzBfc3Q7CisKK2ludCBhZGlzMTYxMzBfc3BpX3dyaXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgdTggcmVnX2FkZHIsCisJCXU4IHZhbCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRpczE2MTMwX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gcmVnX2FkZHI7CisJc3QtPnR4WzFdID0gdmFsOworCisJcmV0ID0gc3BpX3dyaXRlKHN0LT51cywgc3QtPnR4LCAyKTsKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYWRpczE2MTMwX3NwaV9yZWFkKHN0cnVjdCBkZXZpY2UgKmRldiwgdTggcmVnX2FkZHIsCisJCXUzMiAqdmFsKQoreworCWludCByZXQ7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGlzMTYxMzBfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKworCXN0LT50eFswXSA9IEFESVMxNjEzMF9DT05fUkQgfCByZWdfYWRkcjsKKwlpZiAoc3QtPm1vZGUpCisJCXJldCA9IHNwaV9yZWFkKHN0LT51cywgc3QtPnJ4LCA0KTsKKwllbHNlCisJCXJldCA9IHNwaV9yZWFkKHN0LT51cywgc3QtPnJ4LCAzKTsKKworCWlmIChyZXQgPT0gMCkgeworCQlpZiAoc3QtPm1vZGUpCisJCQkqdmFsID0gKHN0LT5yeFsxXSA8PCAxNikgfCAoc3QtPnJ4WzJdIDw8IDgpIHwgc3QtPnJ4WzNdOworCQllbHNlCisJCQkqdmFsID0gKHN0LT5yeFsxXSA8PCA4KSB8IHN0LT5yeFsyXTsKKwl9CisKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZGlzMTYxMzBfZ3lyb19yZWFkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdTMyIHZhbDsKKwlzc2l6ZV90IHJldDsKKworCS8qIFRha2UgdGhlIGlpb19kZXYgc3RhdHVzIGxvY2sgKi8KKwltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwlyZXQgPSAgYWRpczE2MTMwX3NwaV9yZWFkKGRldiwgQURJUzE2MTMwX1JBVEVEQVRBLCAmdmFsKTsKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJaWYgKHJldCA9PSAwKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsKTsKKwllbHNlCisJCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkaXMxNjEzMF90ZW1wX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1MzIgdmFsOworCXNzaXplX3QgcmV0OworCisJLyogVGFrZSB0aGUgaWlvX2RldiBzdGF0dXMgbG9jayAqLworCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOworCXJldCA9ICBhZGlzMTYxMzBfc3BpX3JlYWQoZGV2LCBBRElTMTYxMzBfVEVNUERBVEEsICZ2YWwpOworCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisKKwlpZiAocmV0ID09IDApCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2YWwpOworCWVsc2UKKwkJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWRpczE2MTMwX2JpdHNtb2RlX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRpczE2MTMwX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBzdC0+bW9kZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkaXMxNjEzMF9iaXRzbW9kZV93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJaW50IHJldDsKKwlsb25nIHZhbDsKKworCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxNiwgJnZhbCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisJcmV0ID0gYWRpczE2MTMwX3NwaV93cml0ZShkZXYsIEFESVMxNjEzMF9NT0RFLCAhIXZhbCk7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX1RFTVBfUkFXKGFkaXMxNjEzMF90ZW1wX3JlYWQpOworCitzdGF0aWMgSUlPX0NPTlNUX0FUVFIobmFtZSwgImFkaXMxNjEzMCIpOworCitzdGF0aWMgSUlPX0RFVl9BVFRSX0dZUk8oYWRpczE2MTMwX2d5cm9fcmVhZCwKKwkJQURJUzE2MTMwX1JBVEVEQVRBKTsKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQklUU19NT0RFKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikJXAorCUlJT19ERVZJQ0VfQVRUUihiaXRzX21vZGUsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworc3RhdGljIElJT19ERVZfQVRUUl9CSVRTX01PREUoU19JV1VTUiB8IFNfSVJVR08sIGFkaXMxNjEzMF9iaXRzbW9kZV9yZWFkLCBhZGlzMTYxMzBfYml0c21vZGVfd3JpdGUsCisJCQlBRElTMTYxMzBfTU9ERSk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZGlzMTYxMzBfZXZlbnRfYXR0cmlidXRlc1tdID0geworCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkaXMxNjEzMF9ldmVudF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWRpczE2MTMwX2V2ZW50X2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRpczE2MTMwX2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2Rldl9hdHRyX3RlbXBfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX25hbWUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2d5cm9fcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9iaXRzX21vZGUuZGV2X2F0dHIuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZGlzMTYxMzBfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkaXMxNjEzMF9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgYWRpczE2MTMwX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJaW50IHJldCwgcmVnZG9uZSA9IDA7CisJc3RydWN0IGFkaXMxNjEzMF9zdGF0ZSAqc3QgPSBremFsbG9jKHNpemVvZiAqc3QsIEdGUF9LRVJORUwpOworCWlmICghc3QpIHsKKwkJcmV0ID0gIC1FTk9NRU07CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwkvKiB0aGlzIGlzIG9ubHkgdXNlZCBmb3IgcmVtb3ZhbCBwdXJwb3NlcyAqLworCXNwaV9zZXRfZHJ2ZGF0YShzcGksIHN0KTsKKworCS8qIEFsbG9jYXRlIHRoZSBjb21tcyBidWZmZXJzICovCisJc3QtPnJ4ID0ga3phbGxvYyhzaXplb2YoKnN0LT5yeCkqQURJUzE2MTMwX01BWF9SWCwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0LT5yeCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9zdDsKKwl9CisJc3QtPnR4ID0ga3phbGxvYyhzaXplb2YoKnN0LT50eCkqQURJUzE2MTMwX01BWF9UWCwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0LT50eCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9yeDsKKwl9CisJc3QtPnVzID0gc3BpOworCW11dGV4X2luaXQoJnN0LT5idWZfbG9jayk7CisJLyogc2V0dXAgdGhlIGluZHVzdHJpYWxpbyBkcml2ZXIgYWxsb2NhdGVkIGVsZW1lbnRzICovCisJc3QtPmluZGlvX2RldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoc3QtPmluZGlvX2RldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV90eDsKKwl9CisKKwlzdC0+aW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJnNwaS0+ZGV2OworCXN0LT5pbmRpb19kZXYtPm51bV9pbnRlcnJ1cHRfbGluZXMgPSAxOworCXN0LT5pbmRpb19kZXYtPmV2ZW50X2F0dHJzID0gJmFkaXMxNjEzMF9ldmVudF9hdHRyaWJ1dGVfZ3JvdXA7CisJc3QtPmluZGlvX2Rldi0+YXR0cnMgPSAmYWRpczE2MTMwX2F0dHJpYnV0ZV9ncm91cDsKKwlzdC0+aW5kaW9fZGV2LT5kZXZfZGF0YSA9ICh2b2lkICopKHN0KTsKKwlzdC0+aW5kaW9fZGV2LT5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEU7CisJc3QtPmluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKwlzdC0+bW9kZSA9IDE7CisKKwlyZXQgPSBhZGlzMTYxMzBfY29uZmlndXJlX3Jpbmcoc3QtPmluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldjsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoc3QtPmluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOworCXJlZ2RvbmUgPSAxOworCisJcmV0ID0gYWRpczE2MTMwX2luaXRpYWxpemVfcmluZyhzdC0+aW5kaW9fZGV2LT5yaW5nKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIHJpbmdcbiIpOworCQlnb3RvIGVycm9yX3VucmVnX3JpbmdfZnVuY3M7CisJfQorCisJaWYgKHNwaS0+aXJxICYmIGdwaW9faXNfdmFsaWQoaXJxX3RvX2dwaW8oc3BpLT5pcnEpKSA+IDApIHsKKwkJcmV0ID0gaWlvX3JlZ2lzdGVyX2ludGVycnVwdF9saW5lKHNwaS0+aXJxLAorCQkJCXN0LT5pbmRpb19kZXYsCisJCQkJMCwKKwkJCQlJUlFGX1RSSUdHRVJfUklTSU5HLAorCQkJCSJhZGlzMTYxMzAiKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfdW5pbml0aWFsaXplX3Jpbmc7CisKKwkJcmV0ID0gYWRpczE2MTMwX3Byb2JlX3RyaWdnZXIoc3QtPmluZGlvX2Rldik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3VucmVnaXN0ZXJfbGluZTsKKwl9CisKKwlhZGlzMTYxMzBfc3QgPSBzdDsKKwlyZXR1cm4gMDsKKworZXJyb3JfdW5yZWdpc3Rlcl9saW5lOgorCWlmIChzdC0+aW5kaW9fZGV2LT5tb2RlcyAmIElORElPX1JJTkdfVFJJR0dFUkVEKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShzdC0+aW5kaW9fZGV2LCAwKTsKK2Vycm9yX3VuaW5pdGlhbGl6ZV9yaW5nOgorCWFkaXMxNjEzMF91bmluaXRpYWxpemVfcmluZyhzdC0+aW5kaW9fZGV2LT5yaW5nKTsKK2Vycm9yX3VucmVnX3JpbmdfZnVuY3M6CisJYWRpczE2MTMwX3VuY29uZmlndXJlX3Jpbmcoc3QtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX2RldjoKKwlpZiAocmVnZG9uZSkKKwkJaWlvX2RldmljZV91bnJlZ2lzdGVyKHN0LT5pbmRpb19kZXYpOworCWVsc2UKKwkJaWlvX2ZyZWVfZGV2aWNlKHN0LT5pbmRpb19kZXYpOworZXJyb3JfZnJlZV90eDoKKwlrZnJlZShzdC0+dHgpOworZXJyb3JfZnJlZV9yeDoKKwlrZnJlZShzdC0+cngpOworZXJyb3JfZnJlZV9zdDoKKwlrZnJlZShzdCk7CitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworLyogZml4bWUsIGNvbmZpcm0gb3JkZXJpbmcgaW4gdGhpcyBmdW5jdGlvbiAqLworc3RhdGljIGludCBhZGlzMTYxMzBfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGFkaXMxNjEzMF9zdGF0ZSAqc3QgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gc3QtPmluZGlvX2RldjsKKworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisKKwlhZGlzMTYxMzBfcmVtb3ZlX3RyaWdnZXIoaW5kaW9fZGV2KTsKKwlpZiAoc3BpLT5pcnEgJiYgZ3Bpb19pc192YWxpZChpcnFfdG9fZ3BpbyhzcGktPmlycSkpID4gMCkKKwkJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoaW5kaW9fZGV2LCAwKTsKKworCWFkaXMxNjEzMF91bmluaXRpYWxpemVfcmluZyhpbmRpb19kZXYtPnJpbmcpOworCWFkaXMxNjEzMF91bmNvbmZpZ3VyZV9yaW5nKGluZGlvX2Rldik7CisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJa2ZyZWUoc3QtPnR4KTsKKwlrZnJlZShzdC0+cngpOworCWtmcmVlKHN0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWRpczE2MTMwX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhZGlzMTYxMzAiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IGFkaXMxNjEzMF9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWRpczE2MTMwX3JlbW92ZSksCit9OworCitzdGF0aWMgX19pbml0IGludCBhZGlzMTYxMzBfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZhZGlzMTYxMzBfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGFkaXMxNjEzMF9pbml0KTsKKworc3RhdGljIF9fZXhpdCB2b2lkIGFkaXMxNjEzMF9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZGlzMTYxMzBfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFkaXMxNjEzMF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQmFycnkgU29uZyA8MjFjbmJhb0BnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFESVMxNjEzMCBIaWdoIFByZWNpc2lvbiBBbmd1bGFyIFJhdGUgU2Vuc29yIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjI1MS5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjI1MS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMzg1MmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjUxLmgKQEAgLTAsMCArMSwxODUgQEAKKyNpZm5kZWYgU1BJX0FESVMxNjI1MV9IXworI2RlZmluZSBTUElfQURJUzE2MjUxX0hfCisKKyNkZWZpbmUgQURJUzE2MjUxX1NUQVJUVVBfREVMQVkJMjIwIC8qIG1zICovCisKKyNkZWZpbmUgQURJUzE2MjUxX1JFQURfUkVHKGEpICAgIGEKKyNkZWZpbmUgQURJUzE2MjUxX1dSSVRFX1JFRyhhKSAoKGEpIHwgMHg4MCkKKworI2RlZmluZSBBRElTMTYyNTFfRU5EVVJBTkNFICAweDAwIC8qIEZsYXNoIG1lbW9yeSB3cml0ZSBjb3VudCAqLworI2RlZmluZSBBRElTMTYyNTFfU1VQUExZX09VVCAweDAyIC8qIFBvd2VyIHN1cHBseSBtZWFzdXJlbWVudCAqLworI2RlZmluZSBBRElTMTYyNTFfR1lST19PVVQgICAweDA0IC8qIFgtYXhpcyBneXJvc2NvcGUgb3V0cHV0ICovCisjZGVmaW5lIEFESVMxNjI1MV9BVVhfQURDICAgIDB4MEEgLyogYW5hbG9nIGlucHV0IGNoYW5uZWwgbWVhc3VyZW1lbnQgKi8KKyNkZWZpbmUgQURJUzE2MjUxX1RFTVBfT1VUICAgMHgwQyAvKiBpbnRlcm5hbCB0ZW1wZXJhdHVyZSBtZWFzdXJlbWVudCAqLworI2RlZmluZSBBRElTMTYyNTFfQU5HTF9PVVQgICAweDBFIC8qIGFuZ2xlIGRpc3BsYWNlbWVudCAqLworI2RlZmluZSBBRElTMTYyNTFfR1lST19PRkYgICAweDE0IC8qIENhbGlicmF0aW9uLCBvZmZzZXQvYmlhcyBhZGp1c3RtZW50ICovCisjZGVmaW5lIEFESVMxNjI1MV9HWVJPX1NDQUxFIDB4MTYgLyogQ2FsaWJyYXRpb24sIHNjYWxlIGFkanVzdG1lbnQgKi8KKyNkZWZpbmUgQURJUzE2MjUxX0FMTV9NQUcxICAgMHgyMCAvKiBBbGFybSAxIG1hZ25pdHVkZS9wb2xhcml0eSBzZXR0aW5nICovCisjZGVmaW5lIEFESVMxNjI1MV9BTE1fTUFHMiAgIDB4MjIgLyogQWxhcm0gMiBtYWduaXR1ZGUvcG9sYXJpdHkgc2V0dGluZyAqLworI2RlZmluZSBBRElTMTYyNTFfQUxNX1NNUEwxICAweDI0IC8qIEFsYXJtIDEgZHluYW1pYyByYXRlIG9mIGNoYW5nZSBzZXR0aW5nICovCisjZGVmaW5lIEFESVMxNjI1MV9BTE1fU01QTDIgIDB4MjYgLyogQWxhcm0gMiBkeW5hbWljIHJhdGUgb2YgY2hhbmdlIHNldHRpbmcgKi8KKyNkZWZpbmUgQURJUzE2MjUxX0FMTV9DVFJMICAgMHgyOCAvKiBBbGFybSBjb250cm9sICovCisjZGVmaW5lIEFESVMxNjI1MV9BVVhfREFDICAgIDB4MzAgLyogQXV4aWxpYXJ5IERBQyBkYXRhICovCisjZGVmaW5lIEFESVMxNjI1MV9HUElPX0NUUkwgIDB4MzIgLyogQ29udHJvbCwgZGlnaXRhbCBJL08gbGluZSAqLworI2RlZmluZSBBRElTMTYyNTFfTVNDX0NUUkwgICAweDM0IC8qIENvbnRyb2wsIGRhdGEgcmVhZHksIHNlbGYtdGVzdCBzZXR0aW5ncyAqLworI2RlZmluZSBBRElTMTYyNTFfU01QTF9QUkQgICAweDM2IC8qIENvbnRyb2wsIGludGVybmFsIHNhbXBsZSByYXRlICovCisjZGVmaW5lIEFESVMxNjI1MV9TRU5TX0FWRyAgIDB4MzggLyogQ29udHJvbCwgZHluYW1pYyByYW5nZSwgZmlsdGVyaW5nICovCisjZGVmaW5lIEFESVMxNjI1MV9TTFBfQ05UICAgIDB4M0EgLyogQ29udHJvbCwgc2xlZXAgbW9kZSBpbml0aWF0aW9uICovCisjZGVmaW5lIEFESVMxNjI1MV9ESUFHX1NUQVQgIDB4M0MgLyogRGlhZ25vc3RpYywgZXJyb3IgZmxhZ3MgKi8KKyNkZWZpbmUgQURJUzE2MjUxX0dMT0JfQ01EICAgMHgzRSAvKiBDb250cm9sLCBnbG9iYWwgY29tbWFuZHMgKi8KKworI2RlZmluZSBBRElTMTYyNTFfRVJST1JfQUNUSVZFCQkJKDE8PDE0KQorI2RlZmluZSBBRElTMTYyNTFfTkVXX0RBVEEJCQkoMTw8MTQpCisKKy8qIE1TQ19DVFJMICovCisjZGVmaW5lIEFESVMxNjI1MV9NU0NfQ1RSTF9JTlRfU0VMRl9URVNUCSgxPDwxMCkgLyogSW50ZXJuYWwgc2VsZi10ZXN0IGVuYWJsZSAqLworI2RlZmluZSBBRElTMTYyNTFfTVNDX0NUUkxfTkVHX1NFTEZfVEVTVAkoMTw8OSkKKyNkZWZpbmUgQURJUzE2MjUxX01TQ19DVFJMX1BPU19TRUxGX1RFU1QJKDE8PDgpCisjZGVmaW5lIEFESVMxNjI1MV9NU0NfQ1RSTF9EQVRBX1JEWV9FTgkJKDE8PDIpCisjZGVmaW5lIEFESVMxNjI1MV9NU0NfQ1RSTF9EQVRBX1JEWV9QT0xfSElHSAkoMTw8MSkKKyNkZWZpbmUgQURJUzE2MjUxX01TQ19DVFJMX0RBVEFfUkRZX0RJTzIJKDE8PDApCisKKy8qIFNNUExfUFJEICovCisjZGVmaW5lIEFESVMxNjI1MV9TTVBMX1BSRF9USU1FX0JBU0UJKDE8PDcpIC8qIFRpbWUgYmFzZSAodEIpOiAwID0gMS45NTMgbXMsIDEgPSA2MC41NCBtcyAqLworI2RlZmluZSBBRElTMTYyNTFfU01QTF9QUkRfRElWX01BU0sJMHg3RgorCisvKiBTTFBfQ05UICovCisjZGVmaW5lIEFESVMxNjI1MV9TTFBfQ05UX1BPV0VSX09GRiAgICAgMHg4MAorCisvKiBESUFHX1NUQVQgKi8KKyNkZWZpbmUgQURJUzE2MjUxX0RJQUdfU1RBVF9BTEFSTTIJKDE8PDkpCisjZGVmaW5lIEFESVMxNjI1MV9ESUFHX1NUQVRfQUxBUk0xCSgxPDw4KQorI2RlZmluZSBBRElTMTYyNTFfRElBR19TVEFUX1NFTEZfVEVTVAkoMTw8NSkKKyNkZWZpbmUgQURJUzE2MjUxX0RJQUdfU1RBVF9PVkVSRkxPVwkoMTw8NCkKKyNkZWZpbmUgQURJUzE2MjUxX0RJQUdfU1RBVF9TUElfRkFJTAkoMTw8MykKKyNkZWZpbmUgQURJUzE2MjUxX0RJQUdfU1RBVF9GTEFTSF9VUFQJKDE8PDIpCisjZGVmaW5lIEFESVMxNjI1MV9ESUFHX1NUQVRfUE9XRVJfSElHSAkoMTw8MSkKKyNkZWZpbmUgQURJUzE2MjUxX0RJQUdfU1RBVF9QT1dFUl9MT1cJKDE8PDApCisKKyNkZWZpbmUgQURJUzE2MjUxX0RJQUdfU1RBVF9FUlJfTUFTSyAoQURJUzE2MjUxX0RJQUdfU1RBVF9BTEFSTTIgfCBcCisJCQkJICAgICAgQURJUzE2MjUxX0RJQUdfU1RBVF9BTEFSTTEgfCBcCisJCQkJICAgICAgQURJUzE2MjUxX0RJQUdfU1RBVF9TRUxGX1RFU1QgfCBcCisJCQkJICAgICAgQURJUzE2MjUxX0RJQUdfU1RBVF9PVkVSRkxPVyB8IFwKKwkJCQkgICAgICBBRElTMTYyNTFfRElBR19TVEFUX1NQSV9GQUlMIHwgXAorCQkJCSAgICAgIEFESVMxNjI1MV9ESUFHX1NUQVRfRkxBU0hfVVBUIHwgXAorCQkJCSAgICAgIEFESVMxNjI1MV9ESUFHX1NUQVRfUE9XRVJfSElHSCB8IFwKKwkJCQkgICAgICBBRElTMTYyNTFfRElBR19TVEFUX1BPV0VSX0xPVykKKworLyogR0xPQl9DTUQgKi8KKyNkZWZpbmUgQURJUzE2MjUxX0dMT0JfQ01EX1NXX1JFU0VUCSgxPDw3KQorI2RlZmluZSBBRElTMTYyNTFfR0xPQl9DTURfRkxBU0hfVVBECSgxPDwzKQorI2RlZmluZSBBRElTMTYyNTFfR0xPQl9DTURfREFDX0xBVENICSgxPDwyKQorI2RlZmluZSBBRElTMTYyNTFfR0xPQl9DTURfRkFDX0NBTElCCSgxPDwxKQorI2RlZmluZSBBRElTMTYyNTFfR0xPQl9DTURfQVVUT19OVUxMCSgxPDwwKQorCisjZGVmaW5lIEFESVMxNjI1MV9NQVhfVFggMjQKKyNkZWZpbmUgQURJUzE2MjUxX01BWF9SWCAyNAorCisjZGVmaW5lIEFESVMxNjI1MV9TUElfU0xPVwkodTMyKSgzMDAgKiAxMDAwKQorI2RlZmluZSBBRElTMTYyNTFfU1BJX0JVUlNUCSh1MzIpKDEwMDAgKiAxMDAwKQorI2RlZmluZSBBRElTMTYyNTFfU1BJX0ZBU1QJKHUzMikoMjAwMCAqIDEwMDApCisKKy8qKgorICogc3RydWN0IGFkaXMxNjI1MV9zdGF0ZSAtIGRldmljZSBpbnN0YW5jZSBzcGVjaWZpYyBkYXRhCisgKiBAdXM6CQkJYWN0dWFsIHNwaV9kZXZpY2UKKyAqIEB3b3JrX3RyaWdnZXJfdG9fcmluZzogYmggZm9yIHRyaWdnZXJlZCBldmVudCBoYW5kbGluZworICogQGludGVyOgkJdXNlZCB0byBjaGVjayBpZiBuZXcgaW50ZXJydXB0IGhhcyBiZWVuIHRyaWdnZXJlZAorICogQGxhc3RfdGltZXN0YW1wOglwYXNzaW5nIHRpbWVzdGFtcCBmcm9tIHRoIHRvIGJoIG9mIGludGVycnVwdCBoYW5kbGVyCisgKiBAaW5kaW9fZGV2OgkJaW5kdXN0cmlhbCBJL08gZGV2aWNlIHN0cnVjdHVyZQorICogQHRyaWc6CQlkYXRhIHJlYWR5IHRyaWdnZXIgcmVnaXN0ZXJlZCB3aXRoIGlpbworICogQHR4OgkJCXRyYW5zbWl0IGJ1ZmZlcgorICogQHJ4OgkJCXJlY2lldmUgYnVmZmVyCisgKiBAYnVmX2xvY2s6CQltdXRleCB0byBwcm90ZWN0IHR4IGFuZCByeAorICoqLworc3RydWN0IGFkaXMxNjI1MV9zdGF0ZSB7CisJc3RydWN0IHNwaV9kZXZpY2UJCSp1czsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCXdvcmtfdHJpZ2dlcl90b19yaW5nOworCXM2NAkJCQlsYXN0X3RpbWVzdGFtcDsKKwlzdHJ1Y3QgaWlvX2RldgkJCSppbmRpb19kZXY7CisJc3RydWN0IGlpb190cmlnZ2VyCQkqdHJpZzsKKwl1OAkJCQkqdHg7CisJdTgJCQkJKnJ4OworCXN0cnVjdCBtdXRleAkJCWJ1Zl9sb2NrOworfTsKKworaW50IGFkaXMxNjI1MV9zcGlfd3JpdGVfcmVnXzgoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgdTggcmVnX2FkZHJlc3MsCisJCQkgICAgICB1OCB2YWwpOworCitpbnQgYWRpczE2MjUxX3NwaV9yZWFkX2J1cnN0KHN0cnVjdCBkZXZpY2UgKmRldiwgdTggKnJ4KTsKKworaW50IGFkaXMxNjI1MV9zcGlfcmVhZF9zZXF1ZW5jZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgdTggKnR4LCB1OCAqcngsIGludCBudW0pOworCitpbnQgYWRpczE2MjUxX3NldF9pcnEoc3RydWN0IGRldmljZSAqZGV2LCBib29sIGVuYWJsZSk7CisKK2ludCBhZGlzMTYyNTFfcmVzZXQoc3RydWN0IGRldmljZSAqZGV2KTsKKworaW50IGFkaXMxNjI1MV9zdG9wX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCitpbnQgYWRpczE2MjUxX2NoZWNrX3N0YXR1cyhzdHJ1Y3QgZGV2aWNlICpkZXYpOworCisjaWYgZGVmaW5lZChDT05GSUdfSUlPX1JJTkdfQlVGRkVSKSAmJiBkZWZpbmVkKFRISVNfSEFTX1JJTkdfQlVGRkVSX1NVUFBPUlQpCisvKiBBdCB0aGUgbW9tZW50IHRyaWdnZXJzIGFyZSBvbmx5IHVzZWQgZm9yIHJpbmcgYnVmZmVyCisgKiBmaWxsaW5nLiBUaGlzIG1heSBjaGFuZ2UhCisgKi8KKworZW51bSBhZGlzMTYyNTFfc2NhbiB7CisJQURJUzE2MjUxX1NDQU5fU1VQUExZLAorCUFESVMxNjI1MV9TQ0FOX0dZUk8sCisJQURJUzE2MjUxX1NDQU5fVEVNUCwKKwlBRElTMTYyNTFfU0NBTl9BRENfMCwKK307CisKK3ZvaWQgYWRpczE2MjUxX3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOworaW50IGFkaXMxNjI1MV9wcm9iZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOworCitzc2l6ZV90IGFkaXMxNjI1MV9yZWFkX2RhdGFfZnJvbV9yaW5nKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgICBjaGFyICpidWYpOworCisKK2ludCBhZGlzMTYyNTFfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7Cit2b2lkIGFkaXMxNjI1MV91bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOworCitpbnQgYWRpczE2MjUxX2luaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKTsKK3ZvaWQgYWRpczE2MjUxX3VuaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpOworI2Vsc2UgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgYWRpczE2MjUxX3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFkaXMxNjI1MV9wcm9iZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdAorYWRpczE2MjUxX3JlYWRfZGF0YV9mcm9tX3Jpbmcoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICBjaGFyICpidWYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRpczE2MjUxX2NvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGlzMTYyNTFfdW5jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworfQorCitzdGF0aWMgaW5saW5lIGludCBhZGlzMTYyNTFfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGlzMTYyNTFfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKK3sKK30KKworI2VuZGlmIC8qIENPTkZJR19JSU9fUklOR19CVUZGRVIgKi8KKyNlbmRpZiAvKiBTUElfQURJUzE2MjUxX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjUxX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYyNTFfY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwZDQwMGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjUxX2NvcmUuYwpAQCAtMCwwICsxLDc3NyBAQAorLyoKKyAqIEFESVMxNjI1MSBQcm9ncmFtbWFibGUgRGlnaXRhbCBHeXJvc2NvcGUgU2Vuc29yIERyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisjaW5jbHVkZSAiZ3lyby5oIgorI2luY2x1ZGUgIi4uL2FkYy9hZGMuaCIKKworI2luY2x1ZGUgImFkaXMxNjI1MS5oIgorCisjZGVmaW5lIERSSVZFUl9OQU1FCQkiYWRpczE2MjUxIgorCisvKiBBdCB0aGUgbW9tZW50IHRoZSBzcGkgZnJhbWV3b3JrIGRvZXNuJ3QgYWxsb3cgZ2xvYmFsIHNldHRpbmcgb2YgY3NfY2hhbmdlLgorICogSXQncyBpbiB0aGUgbGlrZWx5IHRvIGJlIGFkZGVkIGNvbW1lbnQgYXQgdGhlIHRvcCBvZiBzcGkuaC4KKyAqIFRoaXMgbWVhbnMgdGhhdCB1c2UgY2Fubm90IGJlIG1hZGUgb2Ygc3BpX3dyaXRlIGV0Yy4KKyAqLworCisvKioKKyAqIGFkaXMxNjI1MV9zcGlfd3JpdGVfcmVnXzgoKSAtIHdyaXRlIHNpbmdsZSBieXRlIHRvIGEgcmVnaXN0ZXIKKyAqIEBkZXY6IGRldmljZSBhc3NvY2lhdGVkIHdpdGggY2hpbGQgb2YgYWN0dWFsIGRldmljZSAoaWlvX2RldiBvciBpaW9fdHJpZykKKyAqIEByZWdfYWRkcmVzczogdGhlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAqIEB2YWw6IHRoZSB2YWx1ZSB0byB3cml0ZQorICoqLworaW50IGFkaXMxNjI1MV9zcGlfd3JpdGVfcmVnXzgoc3RydWN0IGRldmljZSAqZGV2LAorCQl1OCByZWdfYWRkcmVzcywKKwkJdTggdmFsKQoreworCWludCByZXQ7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGlzMTYyNTFfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSBBRElTMTYyNTFfV1JJVEVfUkVHKHJlZ19hZGRyZXNzKTsKKwlzdC0+dHhbMV0gPSB2YWw7CisKKwlyZXQgPSBzcGlfd3JpdGUoc3QtPnVzLCBzdC0+dHgsIDIpOworCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogYWRpczE2MjUxX3NwaV93cml0ZV9yZWdfMTYoKSAtIHdyaXRlIDIgYnl0ZXMgdG8gYSBwYWlyIG9mIHJlZ2lzdGVycworICogQGRldjogZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBjaGlsZCBvZiBhY3R1YWwgZGV2aWNlIChpaW9fZGV2IG9yIGlpb190cmlnKQorICogQHJlZ19hZGRyZXNzOiB0aGUgYWRkcmVzcyBvZiB0aGUgbG93ZXIgb2YgdGhlIHR3byByZWdpc3RlcnMuIFNlY29uZCByZWdpc3RlcgorICogICAgICAgICAgICAgICBpcyBhc3N1bWVkIHRvIGhhdmUgYWRkcmVzcyBvbmUgZ3JlYXRlci4KKyAqIEB2YWw6IHZhbHVlIHRvIGJlIHdyaXR0ZW4KKyAqKi8KK3N0YXRpYyBpbnQgYWRpczE2MjUxX3NwaV93cml0ZV9yZWdfMTYoc3RydWN0IGRldmljZSAqZGV2LAorCQl1OCBsb3dlcl9yZWdfYWRkcmVzcywKKwkJdTE2IHZhbHVlKQoreworCWludCByZXQ7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkaXMxNjI1MV9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyc1tdID0geworCQl7CisJCQkudHhfYnVmID0gc3QtPnR4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDIsCisJCQkuY3NfY2hhbmdlID0gMSwKKwkJfSwgeworCQkJLnR4X2J1ZiA9IHN0LT50eCArIDIsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gMiwKKwkJCS5jc19jaGFuZ2UgPSAxLAorCQl9LAorCX07CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IEFESVMxNjI1MV9XUklURV9SRUcobG93ZXJfcmVnX2FkZHJlc3MpOworCXN0LT50eFsxXSA9IHZhbHVlICYgMHhGRjsKKwlzdC0+dHhbMl0gPSBBRElTMTYyNTFfV1JJVEVfUkVHKGxvd2VyX3JlZ19hZGRyZXNzICsgMSk7CisJc3QtPnR4WzNdID0gKHZhbHVlID4+IDgpICYgMHhGRjsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXJzWzBdLCAmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcnNbMV0sICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBhZGlzMTYyNTFfc3BpX3JlYWRfcmVnXzE2KCkgLSByZWFkIDIgYnl0ZXMgZnJvbSBhIDE2LWJpdCByZWdpc3RlcgorICogQGRldjogZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBjaGlsZCBvZiBhY3R1YWwgZGV2aWNlIChpaW9fZGV2IG9yIGlpb190cmlnKQorICogQHJlZ19hZGRyZXNzOiB0aGUgYWRkcmVzcyBvZiB0aGUgbG93ZXIgb2YgdGhlIHR3byByZWdpc3RlcnMuIFNlY29uZCByZWdpc3RlcgorICogICAgICAgICAgICAgICBpcyBhc3N1bWVkIHRvIGhhdmUgYWRkcmVzcyBvbmUgZ3JlYXRlci4KKyAqIEB2YWw6IHNvbWV3aGVyZSB0byBwYXNzIGJhY2sgdGhlIHZhbHVlIHJlYWQKKyAqKi8KK3N0YXRpYyBpbnQgYWRpczE2MjUxX3NwaV9yZWFkX3JlZ18xNihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXU4IGxvd2VyX3JlZ19hZGRyZXNzLAorCQl1MTYgKnZhbCkKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRpczE2MjUxX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbXSA9IHsKKwkJeworCQkJLnR4X2J1ZiA9IHN0LT50eCwKKwkJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJCS5sZW4gPSAyLAorCQkJLmNzX2NoYW5nZSA9IDEsCisJCX0sIHsKKwkJCS5yeF9idWYgPSBzdC0+cngsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gMiwKKwkJCS5jc19jaGFuZ2UgPSAxLAorCQl9LAorCX07CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IEFESVMxNjI1MV9SRUFEX1JFRyhsb3dlcl9yZWdfYWRkcmVzcyk7CisJc3QtPnR4WzFdID0gMDsKKwlzdC0+dHhbMl0gPSAwOworCXN0LT50eFszXSA9IDA7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyc1swXSwgJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXJzWzFdLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+dXMsICZtc2cpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3QtPnVzLT5kZXYsICJwcm9ibGVtIHdoZW4gcmVhZGluZyAxNiBiaXQgcmVnaXN0ZXIgMHglMDJYIiwKKwkJCQlsb3dlcl9yZWdfYWRkcmVzcyk7CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwkqdmFsID0gKHN0LT5yeFswXSA8PCA4KSB8IHN0LT5yeFsxXTsKKworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGFkaXMxNjI1MV9zcGlfcmVhZF9idXJzdCgpIC0gcmVhZCBhbGwgZGF0YSByZWdpc3RlcnMKKyAqIEBkZXY6IGRldmljZSBhc3NvY2lhdGVkIHdpdGggY2hpbGQgb2YgYWN0dWFsIGRldmljZSAoaWlvX2RldiBvciBpaW9fdHJpZykKKyAqIEByeDogc29tZXdoZXJlIHRvIHBhc3MgYmFjayB0aGUgdmFsdWUgcmVhZCAobWluIHNpemUgaXMgMjQgYnl0ZXMpCisgKiovCitpbnQgYWRpczE2MjUxX3NwaV9yZWFkX2J1cnN0KHN0cnVjdCBkZXZpY2UgKmRldiwgdTggKnJ4KQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGlzMTYyNTFfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCXUzMiBvbGRfc3BlZWRfaHogPSBzdC0+dXMtPm1heF9zcGVlZF9oejsKKwlpbnQgcmV0OworCisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyc1tdID0geworCQl7CisJCQkudHhfYnVmID0gc3QtPnR4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDIsCisJCQkuY3NfY2hhbmdlID0gMCwKKwkJfSwgeworCQkJLnJ4X2J1ZiA9IHJ4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDI0LAorCQkJLmNzX2NoYW5nZSA9IDEsCisJCX0sCisJfTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURJUzE2MjUxX1JFQURfUkVHKEFESVMxNjI1MV9HTE9CX0NNRCk7CisJc3QtPnR4WzFdID0gMDsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXJzWzBdLCAmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcnNbMV0sICZtc2cpOworCisJc3QtPnVzLT5tYXhfc3BlZWRfaHogPSBtaW4oQURJUzE2MjUxX1NQSV9CVVJTVCwgb2xkX3NwZWVkX2h6KTsKKwlzcGlfc2V0dXAoc3QtPnVzKTsKKworCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CisJaWYgKHJldCkKKwkJZGV2X2Vycigmc3QtPnVzLT5kZXYsICJwcm9ibGVtIHdoZW4gYnVyc3QgcmVhZGluZyIpOworCisJc3QtPnVzLT5tYXhfc3BlZWRfaHogPSBvbGRfc3BlZWRfaHo7CisJc3BpX3NldHVwKHN0LT51cyk7CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogYWRpczE2MjUxX3NwaV9yZWFkX3NlcXVlbmNlKCkgLSByZWFkIGEgc2VxdWVuY2Ugb2YgMTYtYml0IHJlZ2lzdGVycworICogQGRldjogZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBjaGlsZCBvZiBhY3R1YWwgZGV2aWNlIChpaW9fZGV2IG9yIGlpb190cmlnKQorICogQHR4OiByZWdpc3RlciBhZGRyZXNzZXMgaW4gYnl0ZXMgMCwyLDQsNi4uLiAobWluIHNpemUgaXMgMipudW0gYnl0ZXMpCisgKiBAcng6IHNvbWV3aGVyZSB0byBwYXNzIGJhY2sgdGhlIHZhbHVlIHJlYWQgKG1pbiBzaXplIGlzIDIqbnVtIGJ5dGVzKQorICoqLworaW50IGFkaXMxNjI1MV9zcGlfcmVhZF9zZXF1ZW5jZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXU4ICp0eCwgdTggKnJ4LCBpbnQgbnVtKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcnM7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGlzMTYyNTFfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCWludCByZXQsIGk7CisKKwl4ZmVycyA9IGt6YWxsb2MobnVtICsgMSwgR0ZQX0tFUk5FTCk7CisJaWYgKHhmZXJzID09IE5VTEwpIHsKKwkJZGV2X2Vycigmc3QtPnVzLT5kZXYsICJtZW1vcnkgYWxsb2MgZmFpbGVkIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKworCS8qIHR4OiB8YWRkMXxhZGRyMnxhZGRyM3wuLi58YWRkck4gfHplcm98CisJICogcng6IHx6ZXJvfHJlczEgfHJlczIgfC4uLnxyZXNOLTF8cmVzTnwgKi8KKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCWZvciAoaSA9IDA7IGkgPCBudW0gKyAxOyBpKyspIHsKKwkJaWYgKGkgPiAwKQorCQkJeGZlcnNbaV0ucnhfYnVmID0gc3QtPnJ4ICsgMiooaSAtIDEpOworCQlpZiAoaSA8IG51bSkKKwkJCXhmZXJzW2ldLnR4X2J1ZiA9IHN0LT50eCArIDIqaTsKKwkJeGZlcnNbaV0uYml0c19wZXJfd29yZCA9IDg7CisJCXhmZXJzW2ldLmxlbiA9IDI7CisJCXhmZXJzW2ldLmNzX2NoYW5nZSA9IDE7CisJCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyc1tpXSwgJm1zZyk7CisJfQorCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKworCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CisJaWYgKHJldCkKKwkJZGV2X2Vycigmc3QtPnVzLT5kZXYsICJwcm9ibGVtIHdoZW4gcmVhZGluZyBzZXF1ZW5jZSIpOworCisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCWtmcmVlKHhmZXJzKTsKKworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkaXMxNjI1MV9zcGlfcmVhZF9zaWduZWQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmLAorCQl1bnNpZ25lZCBiaXRzKQoreworCWludCByZXQ7CisJczE2IHZhbCA9IDA7CisJdW5zaWduZWQgc2hpZnQgPSAxNiAtIGJpdHM7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCisJcmV0ID0gYWRpczE2MjUxX3NwaV9yZWFkX3JlZ18xNihkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgKHUxNiAqKSZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAodmFsICYgQURJUzE2MjUxX0VSUk9SX0FDVElWRSkKKwkJYWRpczE2MjUxX2NoZWNrX3N0YXR1cyhkZXYpOworCXZhbCA9ICgoczE2KSh2YWwgPDwgc2hpZnQpID4+IHNoaWZ0KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsKTsKK30KKworc3RhdGljIHNzaXplX3QgYWRpczE2MjUxX3JlYWRfMTJiaXRfdW5zaWduZWQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCWludCByZXQ7CisJdTE2IHZhbCA9IDA7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCisJcmV0ID0gYWRpczE2MjUxX3NwaV9yZWFkX3JlZ18xNihkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmICh2YWwgJiBBRElTMTYyNTFfRVJST1JfQUNUSVZFKQorCQlhZGlzMTYyNTFfY2hlY2tfc3RhdHVzKGRldik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgdmFsICYgMHgwRkZGKTsKK30KKworc3RhdGljIHNzaXplX3QgYWRpczE2MjUxX3JlYWRfMTRiaXRfc2lnbmVkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3NpemVfdCByZXQ7CisKKwkvKiBUYWtlIHRoZSBpaW9fZGV2IHN0YXR1cyBsb2NrICovCisJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJcmV0ID0gIGFkaXMxNjI1MV9zcGlfcmVhZF9zaWduZWQoZGV2LCBhdHRyLCBidWYsIDE0KTsKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWRpczE2MjUxX3JlYWRfMTJiaXRfc2lnbmVkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3NpemVfdCByZXQ7CisKKwkvKiBUYWtlIHRoZSBpaW9fZGV2IHN0YXR1cyBsb2NrICovCisJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJcmV0ID0gIGFkaXMxNjI1MV9zcGlfcmVhZF9zaWduZWQoZGV2LCBhdHRyLCBidWYsIDEyKTsKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWRpczE2MjUxX3dyaXRlXzE2Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisJaW50IHJldDsKKwlsb25nIHZhbDsKKworCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnZhbCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisJcmV0ID0gYWRpczE2MjUxX3NwaV93cml0ZV9yZWdfMTYoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsIHZhbCk7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBhZGlzMTYyNTFfcmVhZF9mcmVxdWVuY3koc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCWludCByZXQsIGxlbiA9IDA7CisJdTE2IHQ7CisJaW50IHNwczsKKwlyZXQgPSBhZGlzMTYyNTFfc3BpX3JlYWRfcmVnXzE2KGRldiwKKwkJCUFESVMxNjI1MV9TTVBMX1BSRCwKKwkJCSZ0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXNwcyA9ICAodCAmIEFESVMxNjI1MV9TTVBMX1BSRF9USU1FX0JBU0UpID8gOCA6IDI1NjsKKwlzcHMgLz0gKHQgJiBBRElTMTYyNTFfU01QTF9QUkRfRElWX01BU0spICsgMTsKKwlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVkIFNQU1xuIiwgc3BzKTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBhZGlzMTYyNTFfd3JpdGVfZnJlcXVlbmN5KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkaXMxNjI1MV9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJbG9uZyB2YWw7CisJaW50IHJldDsKKwl1OCB0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisKKwl0ID0gKDI1NiAvIHZhbCk7CisJaWYgKHQgPiAwKQorCQl0LS07CisJdCAmPSBBRElTMTYyNTFfU01QTF9QUkRfRElWX01BU0s7CisJaWYgKCh0ICYgQURJUzE2MjUxX1NNUExfUFJEX0RJVl9NQVNLKSA+PSAweDBBKQorCQlzdC0+dXMtPm1heF9zcGVlZF9oeiA9IEFESVMxNjI1MV9TUElfU0xPVzsKKwllbHNlCisJCXN0LT51cy0+bWF4X3NwZWVkX2h6ID0gQURJUzE2MjUxX1NQSV9GQVNUOworCisJcmV0ID0gYWRpczE2MjUxX3NwaV93cml0ZV9yZWdfOChkZXYsCisJCQlBRElTMTYyNTFfU01QTF9QUkQsCisJCQl0KTsKKworCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBhZGlzMTYyNTFfd3JpdGVfcmVzZXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCWlmIChsZW4gPCAxKQorCQlyZXR1cm4gLTE7CisJc3dpdGNoIChidWZbMF0pIHsKKwljYXNlICcxJzoKKwljYXNlICd5JzoKKwljYXNlICdZJzoKKwkJcmV0dXJuIGFkaXMxNjI1MV9yZXNldChkZXYpOworCX0KKwlyZXR1cm4gLTE7Cit9CisKKworCitpbnQgYWRpczE2MjUxX3NldF9pcnEoc3RydWN0IGRldmljZSAqZGV2LCBib29sIGVuYWJsZSkKK3sKKwlpbnQgcmV0OworCXUxNiBtc2M7CisJcmV0ID0gYWRpczE2MjUxX3NwaV9yZWFkX3JlZ18xNihkZXYsIEFESVMxNjI1MV9NU0NfQ1RSTCwgJm1zYyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwltc2MgfD0gQURJUzE2MjUxX01TQ19DVFJMX0RBVEFfUkRZX1BPTF9ISUdIOworCWlmIChlbmFibGUpCisJCW1zYyB8PSBBRElTMTYyNTFfTVNDX0NUUkxfREFUQV9SRFlfRU47CisJZWxzZQorCQltc2MgJj0gfkFESVMxNjI1MV9NU0NfQ1RSTF9EQVRBX1JEWV9FTjsKKworCXJldCA9IGFkaXMxNjI1MV9zcGlfd3JpdGVfcmVnXzE2KGRldiwgQURJUzE2MjUxX01TQ19DVFJMLCBtc2MpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworaW50IGFkaXMxNjI1MV9yZXNldChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHJldDsKKwlyZXQgPSBhZGlzMTYyNTFfc3BpX3dyaXRlX3JlZ184KGRldiwKKwkJCUFESVMxNjI1MV9HTE9CX0NNRCwKKwkJCUFESVMxNjI1MV9HTE9CX0NNRF9TV19SRVNFVCk7CisJaWYgKHJldCkKKwkJZGV2X2VycihkZXYsICJwcm9ibGVtIHJlc2V0dGluZyBkZXZpY2UiKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIFBvd2VyIGRvd24gdGhlIGRldmljZSAqLworaW50IGFkaXMxNjI1MV9zdG9wX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHJldDsKKwl1MTYgdmFsID0gQURJUzE2MjUxX1NMUF9DTlRfUE9XRVJfT0ZGOworCisJcmV0ID0gYWRpczE2MjUxX3NwaV93cml0ZV9yZWdfMTYoZGV2LCBBRElTMTYyNTFfU0xQX0NOVCwgdmFsKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKGRldiwgInByb2JsZW0gd2l0aCB0dXJuaW5nIGRldmljZSBvZmY6IFNMUF9DTlQiKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRpczE2MjUxX3NlbGZfdGVzdChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHJldDsKKworCXJldCA9IGFkaXMxNjI1MV9zcGlfd3JpdGVfcmVnXzE2KGRldiwKKwkJCUFESVMxNjI1MV9NU0NfQ1RSTCwKKwkJCUFESVMxNjI1MV9NU0NfQ1RSTF9JTlRfU0VMRl9URVNUKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAicHJvYmxlbSBzdGFydGluZyBzZWxmIHRlc3QiKTsKKwkJZ290byBlcnJfcmV0OworCX0KKworCWFkaXMxNjI1MV9jaGVja19zdGF0dXMoZGV2KTsKKworZXJyX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYWRpczE2MjUxX2NoZWNrX3N0YXR1cyhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJdTE2IHN0YXR1czsKKwlpbnQgcmV0OworCisJcmV0ID0gYWRpczE2MjUxX3NwaV9yZWFkX3JlZ18xNihkZXYsIEFESVMxNjI1MV9ESUFHX1NUQVQsICZzdGF0dXMpOworCisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJSZWFkaW5nIHN0YXR1cyBmYWlsZWRcbiIpOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisKKwlpZiAoIShzdGF0dXMgJiBBRElTMTYyNTFfRElBR19TVEFUX0VSUl9NQVNLKSkgeworCQlyZXQgPSAwOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisKKwlyZXQgPSAtRUZBVUxUOworCisJaWYgKHN0YXR1cyAmIEFESVMxNjI1MV9ESUFHX1NUQVRfQUxBUk0yKQorCQlkZXZfZXJyKGRldiwgIkFsYXJtIDIgYWN0aXZlXG4iKTsKKwlpZiAoc3RhdHVzICYgQURJUzE2MjUxX0RJQUdfU1RBVF9BTEFSTTEpCisJCWRldl9lcnIoZGV2LCAiQWxhcm0gMSBhY3RpdmVcbiIpOworCWlmIChzdGF0dXMgJiBBRElTMTYyNTFfRElBR19TVEFUX1NFTEZfVEVTVCkKKwkJZGV2X2VycihkZXYsICJTZWxmIHRlc3QgZXJyb3JcbiIpOworCWlmIChzdGF0dXMgJiBBRElTMTYyNTFfRElBR19TVEFUX09WRVJGTE9XKQorCQlkZXZfZXJyKGRldiwgIlNlbnNvciBvdmVycmFuZ2VcbiIpOworCWlmIChzdGF0dXMgJiBBRElTMTYyNTFfRElBR19TVEFUX1NQSV9GQUlMKQorCQlkZXZfZXJyKGRldiwgIlNQSSBmYWlsdXJlXG4iKTsKKwlpZiAoc3RhdHVzICYgQURJUzE2MjUxX0RJQUdfU1RBVF9GTEFTSF9VUFQpCisJCWRldl9lcnIoZGV2LCAiRmxhc2ggdXBkYXRlIGZhaWxlZFxuIik7CisJaWYgKHN0YXR1cyAmIEFESVMxNjI1MV9ESUFHX1NUQVRfUE9XRVJfSElHSCkKKwkJZGV2X2VycihkZXYsICJQb3dlciBzdXBwbHkgYWJvdmUgNS4yNVZcbiIpOworCWlmIChzdGF0dXMgJiBBRElTMTYyNTFfRElBR19TVEFUX1BPV0VSX0xPVykKKwkJZGV2X2VycihkZXYsICJQb3dlciBzdXBwbHkgYmVsb3cgNC43NVZcbiIpOworCitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGlzMTYyNTFfaW5pdGlhbF9zZXR1cChzdHJ1Y3QgYWRpczE2MjUxX3N0YXRlICpzdCkKK3sKKwlpbnQgcmV0OworCXUxNiBzbXBfcHJkOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZzdC0+aW5kaW9fZGV2LT5kZXY7CisKKwkvKiB1c2UgbG93IHNwaSBzcGVlZCBmb3IgaW5pdCAqLworCXN0LT51cy0+bWF4X3NwZWVkX2h6ID0gQURJUzE2MjUxX1NQSV9TTE9XOworCXN0LT51cy0+bW9kZSA9IFNQSV9NT0RFXzM7CisJc3BpX3NldHVwKHN0LT51cyk7CisKKwkvKiBEaXNhYmxlIElSUSAqLworCXJldCA9IGFkaXMxNjI1MV9zZXRfaXJxKGRldiwgZmFsc2UpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJkaXNhYmxlIGlycSBmYWlsZWQiKTsKKwkJZ290byBlcnJfcmV0OworCX0KKworCS8qIERvIHNlbGYgdGVzdCAqLworCisJLyogUmVhZCBzdGF0dXMgcmVnaXN0ZXIgdG8gY2hlY2sgdGhlIHJlc3VsdCAqLworCXJldCA9IGFkaXMxNjI1MV9jaGVja19zdGF0dXMoZGV2KTsKKwlpZiAocmV0KSB7CisJCWFkaXMxNjI1MV9yZXNldChkZXYpOworCQlkZXZfZXJyKGRldiwgImRldmljZSBub3QgcGxheWluZyBiYWxsIC0+IHJlc2V0Iik7CisJCW1zbGVlcChBRElTMTYyNTFfU1RBUlRVUF9ERUxBWSk7CisJCXJldCA9IGFkaXMxNjI1MV9jaGVja19zdGF0dXMoZGV2KTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihkZXYsICJnaXZpbmcgdXAiKTsKKwkJCWdvdG8gZXJyX3JldDsKKwkJfQorCX0KKworCXByaW50ayhLRVJOX0lORk8gRFJJVkVSX05BTUUgIjogYXQgQ1MlZCAoaXJxICVkKVxuIiwKKwkJCXN0LT51cy0+Y2hpcF9zZWxlY3QsIHN0LT51cy0+aXJxKTsKKworCS8qIHVzZSBoaWdoIHNwaSBzcGVlZCBpZiBwb3NzaWJsZSAqLworCXJldCA9IGFkaXMxNjI1MV9zcGlfcmVhZF9yZWdfMTYoZGV2LCBBRElTMTYyNTFfU01QTF9QUkQsICZzbXBfcHJkKTsKKwlpZiAoIXJldCAmJiAoc21wX3ByZCAmIEFESVMxNjI1MV9TTVBMX1BSRF9ESVZfTUFTSykgPCAweDBBKSB7CisJCXN0LT51cy0+bWF4X3NwZWVkX2h6ID0gQURJUzE2MjUxX1NQSV9TTE9XOworCQlzcGlfc2V0dXAoc3QtPnVzKTsKKwl9CisKK2Vycl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9JTl9OQU1FRF9SQVcoMCwgc3VwcGx5LCBhZGlzMTYyNTFfcmVhZF8xMmJpdF9zaWduZWQsCisJCUFESVMxNjI1MV9TVVBQTFlfT1VUKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihpbjBfc3VwcGx5X3NjYWxlLCAiMC4wMDE4MzE1Iik7CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfR1lSTyhhZGlzMTYyNTFfcmVhZF8xNGJpdF9zaWduZWQsCisJCUFESVMxNjI1MV9HWVJPX09VVCk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0dZUk9fU0NBTEUoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkaXMxNjI1MV9yZWFkXzEyYml0X3NpZ25lZCwKKwkJYWRpczE2MjUxX3dyaXRlXzE2Yml0LAorCQlBRElTMTYyNTFfR1lST19TQ0FMRSk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0dZUk9fT0ZGU0VUKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGlzMTYyNTFfcmVhZF8xMmJpdF9zaWduZWQsCisJCWFkaXMxNjI1MV93cml0ZV8xNmJpdCwKKwkJQURJUzE2MjUxX0dZUk9fT0ZGKTsKKworc3RhdGljIElJT19ERVZfQVRUUl9URU1QX1JBVyhhZGlzMTYyNTFfcmVhZF8xMmJpdF9zaWduZWQpOworc3RhdGljIElJT19DT05TVF9BVFRSKHRlbXBfb2Zmc2V0LCAiMjUgSyIpOworc3RhdGljIElJT19DT05TVF9BVFRSKHRlbXBfc2NhbGUsICIwLjE0NTMgSyIpOworCitzdGF0aWMgSUlPX0RFVl9BVFRSX0lOX05BTUVEX1JBVygxLCBhdXgsIGFkaXMxNjI1MV9yZWFkXzEyYml0X3Vuc2lnbmVkLAorCQlBRElTMTYyNTFfQVVYX0FEQyk7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIoaW4xX2F1eF9zY2FsZSwgIjAuMDAwNjEwNSIpOworCitzdGF0aWMgSUlPX0RFVl9BVFRSX1NBTVBfRlJFUShTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRpczE2MjUxX3JlYWRfZnJlcXVlbmN5LAorCQlhZGlzMTYyNTFfd3JpdGVfZnJlcXVlbmN5KTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQU5HTChhZGlzMTYyNTFfcmVhZF8xNGJpdF9zaWduZWQsCisJCUFESVMxNjI1MV9BTkdMX09VVCk7CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfUkVTRVQoYWRpczE2MjUxX3dyaXRlX3Jlc2V0KTsKKworc3RhdGljIElJT19DT05TVF9BVFRSX1NBTVBfRlJFUV9BVkFJTCgiMC4xMjkgfiAyNTYiKTsKKworc3RhdGljIElJT19DT05TVF9BVFRSKG5hbWUsICJhZGlzMTYyNTEiKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkaXMxNjI1MV9ldmVudF9hdHRyaWJ1dGVzW10gPSB7CisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWRpczE2MjUxX2V2ZW50X2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZGlzMTYyNTFfZXZlbnRfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZGlzMTYyNTFfYXR0cmlidXRlc1tdID0geworCSZpaW9fZGV2X2F0dHJfaW4wX3N1cHBseV9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfaW4wX3N1cHBseV9zY2FsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZ3lyb19yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2d5cm9fc2NhbGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2d5cm9fb2Zmc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hbmdsX3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfdGVtcF9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfdGVtcF9vZmZzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfdGVtcF9zY2FsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW4xX2F1eF9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfaW4xX2F1eF9zY2FsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfc2FtcGxpbmdfZnJlcXVlbmN5LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX3NhbXBsaW5nX2ZyZXF1ZW5jeV9hdmFpbGFibGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3Jlc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX25hbWUuZGV2X2F0dHIuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZGlzMTYyNTFfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkaXMxNjI1MV9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgYWRpczE2MjUxX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJaW50IHJldCwgcmVnZG9uZSA9IDA7CisJc3RydWN0IGFkaXMxNjI1MV9zdGF0ZSAqc3QgPSBremFsbG9jKHNpemVvZiAqc3QsIEdGUF9LRVJORUwpOworCWlmICghc3QpIHsKKwkJcmV0ID0gIC1FTk9NRU07CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwkvKiB0aGlzIGlzIG9ubHkgdXNlZCBmb3IgcmVtb3ZhbCBwdXJwb3NlcyAqLworCXNwaV9zZXRfZHJ2ZGF0YShzcGksIHN0KTsKKworCS8qIEFsbG9jYXRlIHRoZSBjb21tcyBidWZmZXJzICovCisJc3QtPnJ4ID0ga3phbGxvYyhzaXplb2YoKnN0LT5yeCkqQURJUzE2MjUxX01BWF9SWCwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0LT5yeCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9zdDsKKwl9CisJc3QtPnR4ID0ga3phbGxvYyhzaXplb2YoKnN0LT50eCkqQURJUzE2MjUxX01BWF9UWCwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0LT50eCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9yeDsKKwl9CisJc3QtPnVzID0gc3BpOworCW11dGV4X2luaXQoJnN0LT5idWZfbG9jayk7CisJLyogc2V0dXAgdGhlIGluZHVzdHJpYWxpbyBkcml2ZXIgYWxsb2NhdGVkIGVsZW1lbnRzICovCisJc3QtPmluZGlvX2RldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoc3QtPmluZGlvX2RldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV90eDsKKwl9CisKKwlzdC0+aW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJnNwaS0+ZGV2OworCXN0LT5pbmRpb19kZXYtPm51bV9pbnRlcnJ1cHRfbGluZXMgPSAxOworCXN0LT5pbmRpb19kZXYtPmV2ZW50X2F0dHJzID0gJmFkaXMxNjI1MV9ldmVudF9hdHRyaWJ1dGVfZ3JvdXA7CisJc3QtPmluZGlvX2Rldi0+YXR0cnMgPSAmYWRpczE2MjUxX2F0dHJpYnV0ZV9ncm91cDsKKwlzdC0+aW5kaW9fZGV2LT5kZXZfZGF0YSA9ICh2b2lkICopKHN0KTsKKwlzdC0+aW5kaW9fZGV2LT5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEU7CisJc3QtPmluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCXJldCA9IGFkaXMxNjI1MV9jb25maWd1cmVfcmluZyhzdC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2OworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihzdC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3VucmVnX3JpbmdfZnVuY3M7CisJcmVnZG9uZSA9IDE7CisKKwlyZXQgPSBhZGlzMTYyNTFfaW5pdGlhbGl6ZV9yaW5nKHN0LT5pbmRpb19kZXYtPnJpbmcpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcmluZ1xuIik7CisJCWdvdG8gZXJyb3JfdW5yZWdfcmluZ19mdW5jczsKKwl9CisKKwlpZiAoc3BpLT5pcnEgJiYgZ3Bpb19pc192YWxpZChpcnFfdG9fZ3BpbyhzcGktPmlycSkpID4gMCkgeworCQlyZXQgPSBpaW9fcmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoc3BpLT5pcnEsCisJCQkJc3QtPmluZGlvX2RldiwKKwkJCQkwLAorCQkJCUlSUUZfVFJJR0dFUl9SSVNJTkcsCisJCQkJImFkaXMxNjI1MSIpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl91bmluaXRpYWxpemVfcmluZzsKKworCQlyZXQgPSBhZGlzMTYyNTFfcHJvYmVfdHJpZ2dlcihzdC0+aW5kaW9fZGV2KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfdW5yZWdpc3Rlcl9saW5lOworCX0KKworCS8qIEdldCB0aGUgZGV2aWNlIGludG8gYSBzYW5lIGluaXRpYWwgc3RhdGUgKi8KKwlyZXQgPSBhZGlzMTYyNTFfaW5pdGlhbF9zZXR1cChzdCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZW1vdmVfdHJpZ2dlcjsKKwlyZXR1cm4gMDsKKworZXJyb3JfcmVtb3ZlX3RyaWdnZXI6CisJaWYgKHN0LT5pbmRpb19kZXYtPm1vZGVzICYgSU5ESU9fUklOR19UUklHR0VSRUQpCisJCWFkaXMxNjI1MV9yZW1vdmVfdHJpZ2dlcihzdC0+aW5kaW9fZGV2KTsKK2Vycm9yX3VucmVnaXN0ZXJfbGluZToKKwlpZiAoc3QtPmluZGlvX2Rldi0+bW9kZXMgJiBJTkRJT19SSU5HX1RSSUdHRVJFRCkKKwkJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoc3QtPmluZGlvX2RldiwgMCk7CitlcnJvcl91bmluaXRpYWxpemVfcmluZzoKKwlhZGlzMTYyNTFfdW5pbml0aWFsaXplX3Jpbmcoc3QtPmluZGlvX2Rldi0+cmluZyk7CitlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOgorCWFkaXMxNjI1MV91bmNvbmZpZ3VyZV9yaW5nKHN0LT5pbmRpb19kZXYpOworZXJyb3JfZnJlZV9kZXY6CisJaWYgKHJlZ2RvbmUpCisJCWlpb19kZXZpY2VfdW5yZWdpc3RlcihzdC0+aW5kaW9fZGV2KTsKKwllbHNlCisJCWlpb19mcmVlX2RldmljZShzdC0+aW5kaW9fZGV2KTsKK2Vycm9yX2ZyZWVfdHg6CisJa2ZyZWUoc3QtPnR4KTsKK2Vycm9yX2ZyZWVfcng6CisJa2ZyZWUoc3QtPnJ4KTsKK2Vycm9yX2ZyZWVfc3Q6CisJa2ZyZWUoc3QpOworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKKy8qIGZpeG1lLCBjb25maXJtIG9yZGVyaW5nIGluIHRoaXMgZnVuY3Rpb24gKi8KK3N0YXRpYyBpbnQgYWRpczE2MjUxX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWludCByZXQ7CisJc3RydWN0IGFkaXMxNjI1MV9zdGF0ZSAqc3QgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gc3QtPmluZGlvX2RldjsKKworCXJldCA9IGFkaXMxNjI1MV9zdG9wX2RldmljZSgmKGluZGlvX2Rldi0+ZGV2KSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfcmV0OworCisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKworCWFkaXMxNjI1MV9yZW1vdmVfdHJpZ2dlcihpbmRpb19kZXYpOworCWlmIChzcGktPmlycSAmJiBncGlvX2lzX3ZhbGlkKGlycV90b19ncGlvKHNwaS0+aXJxKSkgPiAwKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShpbmRpb19kZXYsIDApOworCisJYWRpczE2MjUxX3VuaW5pdGlhbGl6ZV9yaW5nKGluZGlvX2Rldi0+cmluZyk7CisJYWRpczE2MjUxX3VuY29uZmlndXJlX3JpbmcoaW5kaW9fZGV2KTsKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlrZnJlZShzdC0+dHgpOworCWtmcmVlKHN0LT5yeCk7CisJa2ZyZWUoc3QpOworCisJcmV0dXJuIDA7CisKK2Vycl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFkaXMxNjI1MV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYWRpczE2MjUxIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhZGlzMTYyNTFfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFkaXMxNjI1MV9yZW1vdmUpLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWRpczE2MjUxX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmYWRpczE2MjUxX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChhZGlzMTYyNTFfaW5pdCk7CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBhZGlzMTYyNTFfZXhpdCh2b2lkKQoreworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYWRpczE2MjUxX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhZGlzMTYyNTFfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkJhcnJ5IFNvbmcgPDIxY25iYW9AZ21haWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBBRElTMTYyNTEgRGlnaXRhbCBHeXJvc2NvcGUgU2Vuc29yIFNQSSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYyNjAuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYyNjAuaAppbmRleCA4MTI0NDBhLi5jMWZkNDM2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjI2MC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYyNjAuaApAQCAtMSw1ICsxLDYgQEAKICNpZm5kZWYgU1BJX0FESVMxNjI2MF9IXwogI2RlZmluZSBTUElfQURJUzE2MjYwX0hfCisjaW5jbHVkZSAiYWRpczE2MjYwX3BsYXRmb3JtX2RhdGEuaCIKIAogI2RlZmluZSBBRElTMTYyNjBfU1RBUlRVUF9ERUxBWQkyMjAgLyogbXMgKi8KIApAQCAtOTIsNiArOTMsNyBAQAogICogQHR4OgkJCXRyYW5zbWl0IGJ1ZmZlcgogICogQHJ4OgkJCXJlY2lldmUgYnVmZmVyCiAgKiBAYnVmX2xvY2s6CQltdXRleCB0byBwcm90ZWN0IHR4IGFuZCByeAorICogQG5lZ2F0ZToJCW5lZ2F0ZSB0aGUgc2NhbGUgcGFyYW1ldGVyCiAgKiovCiBzdHJ1Y3QgYWRpczE2MjYwX3N0YXRlIHsKIAlzdHJ1Y3Qgc3BpX2RldmljZQkJKnVzOwpAQCAtMTAyLDYgKzEwNCw3IEBACiAJdTgJCQkJKnR4OwogCXU4CQkJCSpyeDsKIAlzdHJ1Y3QgbXV0ZXgJCQlidWZfbG9jazsKKwl1bnNpZ25lZAkJCW5lZ2F0ZToxOwogfTsKIAogaW50IGFkaXMxNjI2MF9zZXRfaXJxKHN0cnVjdCBkZXZpY2UgKmRldiwgYm9vbCBlbmFibGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjI2MF9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjYwX2NvcmUuYwppbmRleCA3ZDc3MTZlLi4wNDVlMjdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjYwX2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjYwX2NvcmUuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBBRElTMTYyNjAgUHJvZ3JhbW1hYmxlIERpZ2l0YWwgR3lyb3Njb3BlIFNlbnNvciBEcml2ZXIKKyAqIEFESVMxNjI2MC9BRElTMTYyNjUgUHJvZ3JhbW1hYmxlIERpZ2l0YWwgR3lyb3Njb3BlIFNlbnNvciBEcml2ZXIKICAqCiAgKiBDb3B5cmlnaHQgMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgpAQCAtMTM0LDggKzEzNCw2IEBACiAJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKIAlzdC0+dHhbMF0gPSBBRElTMTYyNjBfUkVBRF9SRUcobG93ZXJfcmVnX2FkZHJlc3MpOwogCXN0LT50eFsxXSA9IDA7Ci0Jc3QtPnR4WzJdID0gMDsKLQlzdC0+dHhbM10gPSAwOwogCiAJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKIAlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcnNbMF0sICZtc2cpOwpAQCAtMjkzLDYgKzI5MSwyMiBAQAogCXJldHVybiByZXQgPyByZXQgOiBsZW47CiB9CiAKK3N0YXRpYyBzc2l6ZV90IGFkaXMxNjI2MF9yZWFkX2d5cm9fc2NhbGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRpczE2MjYwX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlzc2l6ZV90IHJldCA9IDA7CisKKwlpZiAoc3QtPm5lZ2F0ZSkKKwkJcmV0ID0gc3ByaW50ZihidWYsICItIik7CisJLyogVGFrZSB0aGUgaWlvX2RldiBzdGF0dXMgbG9jayAqLworCXJldCArPSBzcHJpbnRmKGJ1ZiArIHJldCwgIiVzXG4iLCAiMC4wMDEyNzg2MjgyMSIpOworCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCBhZGlzMTYyNjBfcmVzZXQoc3RydWN0IGRldmljZSAqZGV2KQogewogCWludCByZXQ7CkBAIC00NDcsMTggKzQ2MSw2IEBACiAJCQkJQURJUzE2MjYwX1NVUFBMWV9PVVQpOwogc3RhdGljIElJT19DT05TVF9BVFRSX0lOX05BTUVEX1NDQUxFKDAsIHN1cHBseSwgIjAuMDAxODMxNSIpOwogCi1zdGF0aWMgSUlPX0RFVl9BVFRSX0dZUk8oYWRpczE2MjYwX3JlYWRfMTRiaXRfc2lnbmVkLAotCQlBRElTMTYyNjBfR1lST19PVVQpOwotc3RhdGljIElJT19DT05TVF9BVFRSX0dZUk9fU0NBTEUoIjAuMDAxMjc4NjI4MjEiKTsKLXN0YXRpYyBJSU9fREVWX0FUVFJfR1lST19DQUxJQlNDQUxFKFNfSVdVU1IgfCBTX0lSVUdPLAotCQlhZGlzMTYyNjBfcmVhZF8xNGJpdF9zaWduZWQsCi0JCWFkaXMxNjI2MF93cml0ZV8xNmJpdCwKLQkJQURJUzE2MjYwX0dZUk9fU0NBTEUpOwotc3RhdGljIElJT19ERVZfQVRUUl9HWVJPX0NBTElCQklBUyhTX0lXVVNSIHwgU19JUlVHTywKLQkJYWRpczE2MjYwX3JlYWRfMTJiaXRfc2lnbmVkLAotCQlhZGlzMTYyNjBfd3JpdGVfMTZiaXQsCi0JCUFESVMxNjI2MF9HWVJPX09GRik7Ci0KIHN0YXRpYyBJSU9fREVWX0FUVFJfVEVNUF9SQVcoYWRpczE2MjYwX3JlYWRfMTJiaXRfdW5zaWduZWQpOwogc3RhdGljIElJT19DT05TVF9BVFRSX1RFTVBfT0ZGU0VUKCIyNSIpOwogc3RhdGljIElJT19DT05TVF9BVFRSX1RFTVBfU0NBTEUoIjAuMTQ1MyIpOwpAQCAtNDcwLDggKzQ3Miw2IEBACiBzdGF0aWMgSUlPX0RFVl9BVFRSX1NBTVBfRlJFUShTX0lXVVNSIHwgU19JUlVHTywKIAkJYWRpczE2MjYwX3JlYWRfZnJlcXVlbmN5LAogCQlhZGlzMTYyNjBfd3JpdGVfZnJlcXVlbmN5KTsKLXN0YXRpYyBJSU9fREVWX0FUVFJfQU5HTChhZGlzMTYyNjBfcmVhZF8xNGJpdF9zaWduZWQsCi0JCUFESVMxNjI2MF9BTkdMX09VVCk7CiAKIHN0YXRpYyBJSU9fREVWSUNFX0FUVFIocmVzZXQsIFNfSVdVU1IsIE5VTEwsIGFkaXMxNjI2MF93cml0ZV9yZXNldCwgMCk7CiAKQEAgLTQ4NywzOCArNDg3LDcwIEBACiAJLmF0dHJzID0gYWRpczE2MjYwX2V2ZW50X2F0dHJpYnV0ZXMsCiB9OwogCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRpczE2MjYwX2F0dHJpYnV0ZXNbXSA9IHsKLQkmaWlvX2Rldl9hdHRyX2luMF9zdXBwbHlfcmF3LmRldl9hdHRyLmF0dHIsCi0JJmlpb19jb25zdF9hdHRyX2luMF9zdXBwbHlfc2NhbGUuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX2d5cm9fcmF3LmRldl9hdHRyLmF0dHIsCi0JJmlpb19jb25zdF9hdHRyX2d5cm9fc2NhbGUuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX2d5cm9fY2FsaWJzY2FsZS5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfZ3lyb19jYWxpYmJpYXMuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX2FuZ2xfcmF3LmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl90ZW1wX3Jhdy5kZXZfYXR0ci5hdHRyLAotCSZpaW9fY29uc3RfYXR0cl90ZW1wX29mZnNldC5kZXZfYXR0ci5hdHRyLAotCSZpaW9fY29uc3RfYXR0cl90ZW1wX3NjYWxlLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9pbjFfcmF3LmRldl9hdHRyLmF0dHIsCi0JJmlpb19jb25zdF9hdHRyX2luMV9zY2FsZS5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfc2FtcGxpbmdfZnJlcXVlbmN5LmRldl9hdHRyLmF0dHIsCi0JJmlpb19jb25zdF9hdHRyX3NhbXBsaW5nX2ZyZXF1ZW5jeV9hdmFpbGFibGUuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX3Jlc2V0LmRldl9hdHRyLmF0dHIsCi0JJmlpb19jb25zdF9hdHRyX25hbWUuZGV2X2F0dHIuYXR0ciwKLQlOVUxMCi19OworI2RlZmluZSBBRElTMTYyNjBfR1lST19BVFRSX1NFVChheGlzKQkJCQkJXAorCUlJT19ERVZfQVRUUl9HWVJPIyNheGlzKGFkaXMxNjI2MF9yZWFkXzE0Yml0X3NpZ25lZCwJCVwKKwkJCQlBRElTMTYyNjBfR1lST19PVVQpOwkJCVwKKwlzdGF0aWMgSUlPX0RFVl9BVFRSX0dZUk8jI2F4aXMjI19TQ0FMRShTX0lSVUdPLAkJCVwKKwkJCQkJYWRpczE2MjYwX3JlYWRfZ3lyb19zY2FsZSwJXAorCQkJCQlOVUxMLAkJCQlcCisJCQkJCTApOwkJCQlcCisJc3RhdGljIElJT19ERVZfQVRUUl9HWVJPIyNheGlzIyNfQ0FMSUJTQ0FMRShTX0lSVUdPIHwgU19JV1VTUiwJXAorCQkJCQlhZGlzMTYyNjBfcmVhZF8xMmJpdF91bnNpZ25lZCwJXAorCQkJCQlhZGlzMTYyNjBfd3JpdGVfMTZiaXQsCQlcCisJCQkJCUFESVMxNjI2MF9HWVJPX1NDQUxFKTsJCVwKKwlzdGF0aWMgSUlPX0RFVl9BVFRSX0dZUk8jI2F4aXMjI19DQUxJQkJJQVMoU19JV1VTUiB8IFNfSVJVR08sCVwKKwkJCQkJYWRpczE2MjYwX3JlYWRfMTJiaXRfc2lnbmVkLAlcCisJCQkJCWFkaXMxNjI2MF93cml0ZV8xNmJpdCwJCVwKKwkJCQkJQURJUzE2MjYwX0dZUk9fT0ZGKTsJCVwKKwlzdGF0aWMgSUlPX0RFVl9BVFRSX0FOR0wjI2F4aXMoYWRpczE2MjYwX3JlYWRfMTRiaXRfc2lnbmVkLAlcCisJCQkJICAgICAgIEFESVMxNjI2MF9BTkdMX09VVCk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkaXMxNjI2MF9hdHRyaWJ1dGVfZ3JvdXAgPSB7Ci0JLmF0dHJzID0gYWRpczE2MjYwX2F0dHJpYnV0ZXMsCi19Oworc3RhdGljIEFESVMxNjI2MF9HWVJPX0FUVFJfU0VUKCk7CitzdGF0aWMgQURJUzE2MjYwX0dZUk9fQVRUUl9TRVQoX1gpOworc3RhdGljIEFESVMxNjI2MF9HWVJPX0FUVFJfU0VUKF9ZKTsKK3N0YXRpYyBBRElTMTYyNjBfR1lST19BVFRSX1NFVChfWik7CisKKyNkZWZpbmUgQURJUzE2MjYwX0FUVFJfR1JPVVAoYXhpcykJCQkJCVwKKwlzdHJ1Y3QgYXR0cmlidXRlICphZGlzMTYyNjBfYXR0cmlidXRlcyMjYXhpc1tdID0gewkJXAorCQkmaWlvX2Rldl9hdHRyX2luMF9zdXBwbHlfcmF3LmRldl9hdHRyLmF0dHIsCQlcCisJCSZpaW9fY29uc3RfYXR0cl9pbjBfc3VwcGx5X3NjYWxlLmRldl9hdHRyLmF0dHIsCQlcCisJCSZpaW9fZGV2X2F0dHJfZ3lybyMjYXhpcyMjX3Jhdy5kZXZfYXR0ci5hdHRyLAkJXAorCQkmaWlvX2Rldl9hdHRyX2d5cm8jI2F4aXMjI19zY2FsZS5kZXZfYXR0ci5hdHRyLAkJXAorCQkmaWlvX2Rldl9hdHRyX2d5cm8jI2F4aXMjI19jYWxpYnNjYWxlLmRldl9hdHRyLmF0dHIsCVwKKwkJJmlpb19kZXZfYXR0cl9neXJvIyNheGlzIyNfY2FsaWJiaWFzLmRldl9hdHRyLmF0dHIsCVwKKwkJJmlpb19kZXZfYXR0cl9hbmdsIyNheGlzIyNfcmF3LmRldl9hdHRyLmF0dHIsCQlcCisJCSZpaW9fZGV2X2F0dHJfdGVtcF9yYXcuZGV2X2F0dHIuYXR0ciwJCQlcCisJCSZpaW9fY29uc3RfYXR0cl90ZW1wX29mZnNldC5kZXZfYXR0ci5hdHRyLAkJXAorCQkmaWlvX2NvbnN0X2F0dHJfdGVtcF9zY2FsZS5kZXZfYXR0ci5hdHRyLAkJXAorCQkmaWlvX2Rldl9hdHRyX2luMV9yYXcuZGV2X2F0dHIuYXR0ciwJCQlcCisJCSZpaW9fY29uc3RfYXR0cl9pbjFfc2NhbGUuZGV2X2F0dHIuYXR0ciwJCVwKKwkJJmlpb19kZXZfYXR0cl9zYW1wbGluZ19mcmVxdWVuY3kuZGV2X2F0dHIuYXR0ciwJCVwKKwkJJmlpb19jb25zdF9hdHRyX3NhbXBsaW5nX2ZyZXF1ZW5jeV9hdmFpbGFibGUuZGV2X2F0dHIuYXR0ciwgXAorCQkmaWlvX2Rldl9hdHRyX3Jlc2V0LmRldl9hdHRyLmF0dHIsCQkJXAorCQkmaWlvX2NvbnN0X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAkJCVwKKwkJTlVMTAkJCQkJCQlcCisJfTsJCQkJCQkJCVwKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZGlzMTYyNjBfYXR0cmlidXRlX2dyb3VwIyNheGlzIFwKKwk9IHsJCQkJCQkJCVwKKwkJLmF0dHJzID0gYWRpczE2MjYwX2F0dHJpYnV0ZXMjI2F4aXMsCQkJXAorCX07CisKK3N0YXRpYyBBRElTMTYyNjBfQVRUUl9HUk9VUCgpOworc3RhdGljIEFESVMxNjI2MF9BVFRSX0dST1VQKF94KTsKK3N0YXRpYyBBRElTMTYyNjBfQVRUUl9HUk9VUChfeSk7CitzdGF0aWMgQURJUzE2MjYwX0FUVFJfR1JPVVAoX3opOwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBhZGlzMTYyNjBfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKIAlpbnQgcmV0LCByZWdkb25lID0gMDsKKwlzdHJ1Y3QgYWRpczE2MjYwX3BsYXRmb3JtX2RhdGEgKnBkID0gc3BpLT5kZXYucGxhdGZvcm1fZGF0YTsKIAlzdHJ1Y3QgYWRpczE2MjYwX3N0YXRlICpzdCA9IGt6YWxsb2Moc2l6ZW9mICpzdCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzdCkgewogCQlyZXQgPSAgLUVOT01FTTsKIAkJZ290byBlcnJvcl9yZXQ7CiAJfQorCWlmIChwZCkKKwkJc3QtPm5lZ2F0ZSA9IHBkLT5uZWdhdGU7CiAJLyogdGhpcyBpcyBvbmx5IHVzZWQgZm9yIHJlbW92YWwgcHVycG9zZXMgKi8KIAlzcGlfc2V0X2RydmRhdGEoc3BpLCBzdCk7CiAKQEAgLTU0NSw3ICs1NzcsMjQgQEAKIAlzdC0+aW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJnNwaS0+ZGV2OwogCXN0LT5pbmRpb19kZXYtPm51bV9pbnRlcnJ1cHRfbGluZXMgPSAxOwogCXN0LT5pbmRpb19kZXYtPmV2ZW50X2F0dHJzID0gJmFkaXMxNjI2MF9ldmVudF9hdHRyaWJ1dGVfZ3JvdXA7Ci0Jc3QtPmluZGlvX2Rldi0+YXR0cnMgPSAmYWRpczE2MjYwX2F0dHJpYnV0ZV9ncm91cDsKKwlpZiAocGQgJiYgcGQtPmRpcmVjdGlvbikKKwkJc3dpdGNoIChwZC0+ZGlyZWN0aW9uKSB7CisJCWNhc2UgJ3gnOgorCQkJc3QtPmluZGlvX2Rldi0+YXR0cnMgPSAmYWRpczE2MjYwX2F0dHJpYnV0ZV9ncm91cF94OworCQkJYnJlYWs7CisJCWNhc2UgJ3knOgorCQkJc3QtPmluZGlvX2Rldi0+YXR0cnMgPSAmYWRpczE2MjYwX2F0dHJpYnV0ZV9ncm91cF95OworCQkJYnJlYWs7CisJCWNhc2UgJ3onOgorCQkJc3QtPmluZGlvX2Rldi0+YXR0cnMgPSAmYWRpczE2MjYwX2F0dHJpYnV0ZV9ncm91cF96OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzdC0+aW5kaW9fZGV2LT5hdHRycyA9ICZhZGlzMTYyNjBfYXR0cmlidXRlX2dyb3VwOworCQkJYnJlYWs7CisJCX0KKwllbHNlCisJCXN0LT5pbmRpb19kZXYtPmF0dHJzID0gJmFkaXMxNjI2MF9hdHRyaWJ1dGVfZ3JvdXA7CisKIAlzdC0+aW5kaW9fZGV2LT5kZXZfZGF0YSA9ICh2b2lkICopKHN0KTsKIAlzdC0+aW5kaW9fZGV2LT5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEU7CiAJc3QtPmluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKQEAgLTYzNSw2ICs2ODQsMTggQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKgorICogVGhlc2UgcGFydHMgZG8gbm90IG5lZWQgdG8gYmUgZGlmZmVyZW50aWF0ZWQgdW50aWwgc29tZW9uZSBhZGRzCisgKiBzdXBwb3J0IGZvciB0aGUgb24gY2hpcCBmaWx0ZXJpbmcuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZV9pZCBhZGlzMTYyNjBfaWRbXSA9IHsKKwl7ImFkaXMxNjI2MCIsIDB9LAorCXsiYWRpczE2MjY1IiwgMH0sCisJeyJhZGlzMTYyNTAiLCAwfSwKKwl7ImFkaXMxNjI1NSIsIDB9LAorCXt9Cit9OworCiBzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWRpczE2MjYwX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZSA9ICJhZGlzMTYyNjAiLApAQCAtNjQyLDYgKzcwMyw3IEBACiAJfSwKIAkucHJvYmUgPSBhZGlzMTYyNjBfcHJvYmUsCiAJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFkaXMxNjI2MF9yZW1vdmUpLAorCS5pZF90YWJsZSA9IGFkaXMxNjI2MF9pZCwKIH07CiAKIHN0YXRpYyBfX2luaXQgaW50IGFkaXMxNjI2MF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjYwX3BsYXRmb3JtX2RhdGEuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYyNjBfcGxhdGZvcm1fZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyODAyZTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjYwX3BsYXRmb3JtX2RhdGEuaApAQCAtMCwwICsxLDE5IEBACisvKgorICogQURJUzE2MjYwIFByb2dyYW1tYWJsZSBEaWdpdGFsIEd5cm9zY29wZSBTZW5zb3IgRHJpdmVyIFBsYXRmb3JtIERhdGEKKyAqCisgKiBCYXNlZCBvbiBhZGlzMTYyNTUuaCBNYXR0aGlhIEJydWdnZXIgPG1fYnJ1Z2dlciZ3ZWIuZGU+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzCisgICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisvKioKKyAqIHN0cnVjdCBhZGlzMTYyNjBfcGxhdGZvcm1fZGF0YSAtIGluc3RhbmNlIHNwZWNpZmljIGRhdGEKKyAqIEBkaXJlY3Rpb246IHggeSBvciB6CisgKiBAbmVnYXRlOiBmbGFnIHRvIGluZGljYXRlIHZhbHVlIHNob3VsZCBiZSBpbnZlcnRlZC4KKyAqKi8KK3N0cnVjdCBhZGlzMTYyNjBfcGxhdGZvcm1fZGF0YSB7CisJY2hhciBkaXJlY3Rpb247CisJdW5zaWduZWQgbmVnYXRlOjE7Cit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2d5cm8uaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9neXJvLmgKaW5kZXggOThiODM3Yi4uYjRlYTViZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2d5cm8uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vZ3lyby5oCkBAIC03MSwzICs3MSwxMiBAQAogCiAjZGVmaW5lIElJT19ERVZfQVRUUl9BTkdMKF9zaG93LCBfYWRkcikgICAgICAgICAgICAgICAgICAgICAgICAgXAogCUlJT19ERVZJQ0VfQVRUUihhbmdsX3JhdywgU19JUlVHTywgX3Nob3csIE5VTEwsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9BTkdMX1goX3Nob3csIF9hZGRyKQkJCQlcCisJSUlPX0RFVklDRV9BVFRSKGFuZ2xfeF9yYXcsIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQU5HTF9ZKF9zaG93LCBfYWRkcikJCQkJXAorCUlJT19ERVZJQ0VfQVRUUihhbmdsX3lfcmF3LCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FOR0xfWihfc2hvdywgX2FkZHIpCQkJCVwKKwlJSU9fREVWSUNFX0FUVFIoYW5nbF96X3JhdywgU19JUlVHTywgX3Nob3csIE5VTEwsIF9hZGRyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvYWRpczE2MzUwX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L2FkaXMxNjM1MF9jb3JlLmMKaW5kZXggOTdjMWVjOC4uY2Y3MTc2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvYWRpczE2MzUwX2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9hZGlzMTYzNTBfY29yZS5jCkBAIC01NzAsNiArNTcwLDcgQEAKIAkmaWlvX2Rldl9hdHRyX3RlbXBfeV9yYXcuZGV2X2F0dHIuYXR0ciwKIAkmaWlvX2Rldl9hdHRyX3RlbXBfel9yYXcuZGV2X2F0dHIuYXR0ciwKIAkmaWlvX2NvbnN0X2F0dHJfdGVtcF9zY2FsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl90ZW1wX29mZnNldC5kZXZfYXR0ci5hdHRyLAogCSZpaW9fZGV2X2F0dHJfaW4xX3Jhdy5kZXZfYXR0ci5hdHRyLAogCSZpaW9fY29uc3RfYXR0cl9pbjFfc2NhbGUuZGV2X2F0dHIuYXR0ciwKIAkmaWlvX2Rldl9hdHRyX3NhbXBsaW5nX2ZyZXF1ZW5jeS5kZXZfYXR0ci5hdHRyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZTM2ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL0tjb25maWcKQEAgLTAsMCArMSw2MSBAQAorIworIyBJSU8gbWV0ZXIgZHJpdmVycyBjb25maWd1cmF0aW9uCisjCitjb21tZW50ICJBY3RpdmUgZW5lcmd5IG1ldGVyaW5nIElDIgorCitjb25maWcgQURFNzc1MworCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBREU3NzUzLzYgU2luZ2xlLVBoYXNlIE11bHRpZnVuY3Rpb24gTWV0ZXJpbmcgSUMgRHJpdmVyIgorCWRlcGVuZHMgb24gU1BJCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIEFERTc3NTMgU2luZ2xlLVBoYXNlIE11bHRpZnVuY3Rpb24KKwkgIE1ldGVyaW5nIElDIHdpdGggZGkvZHQgU2Vuc29yIEludGVyZmFjZS4KKworY29uZmlnIEFERTc3NTQKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQURFNzc1NCBQb2x5cGhhc2UgTXVsdGlmdW5jdGlvbiBFbmVyZ3kgTWV0ZXJpbmcgSUMgRHJpdmVyIgorCWRlcGVuZHMgb24gU1BJCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIEFERTc3NTQgUG9seXBoYXNlCisJICBNdWx0aWZ1bmN0aW9uIEVuZXJneSBNZXRlcmluZyBJQyBEcml2ZXIuCisKK2NvbmZpZyBBREU3NzU4CisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFERTc3NTggUG9seSBQaGFzZSBNdWx0aWZ1bmN0aW9uIEVuZXJneSBNZXRlcmluZyBJQyBEcml2ZXIiCisJZGVwZW5kcyBvbiBTUEkKKwlzZWxlY3QgSUlPX1RSSUdHRVIgaWYgSUlPX1JJTkdfQlVGRkVSCisJc2VsZWN0IElJT19TV19SSU5HIGlmIElJT19SSU5HX0JVRkZFUgorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBREU3NzU4IFBvbHlwaGFzZQorCSAgTXVsdGlmdW5jdGlvbiBFbmVyZ3kgTWV0ZXJpbmcgSUMgd2l0aCBQZXIgUGhhc2UgSW5mb3JtYXRpb24gRHJpdmVyLgorCitjb25maWcgQURFNzc1OQorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBREU3NzU5IEFjdGl2ZSBFbmVyZ3kgTWV0ZXJpbmcgSUMgRHJpdmVyIgorCWRlcGVuZHMgb24gU1BJCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIEFERTc3NTggQWN0aXZlIEVuZXJneQorCSAgTWV0ZXJpbmcgSUMgd2l0aCBkaS9kdCBTZW5zb3IgSW50ZXJmYWNlLgorCitjb25maWcgQURFNzg1NAorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBREU3ODU0LzU4LzY4Lzc4IFBvbHlwaGFzZSBNdWx0aWZ1bmN0aW9uIEVuZXJneSBNZXRlcmluZyBJQyBEcml2ZXIiCisJZGVwZW5kcyBvbiBTUEkgfHwgSTJDCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIEFERTc4NTQvNTgvNjgvNzggUG9seXBoYXNlCisJICBNdWx0aWZ1bmN0aW9uIEVuZXJneSBNZXRlcmluZyBJQyBEcml2ZXIuCisKK2NvbmZpZyBBREU3ODU0X0kyQworCXRyaXN0YXRlICJzdXBwb3J0IEkyQyBidXMgY29ubmVjdGlvbiIKKwlkZXBlbmRzIG9uIEFERTc4NTQgJiYgSTJDCisJZGVmYXVsdCB5CisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBBREU3ODU0LzU4LzY4Lzc4IGhvb2tlZCB0byBhbiBJMkMgYnVzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhZGU3ODU0LWkyYy4KKworY29uZmlnIEFERTc4NTRfU1BJCisJdHJpc3RhdGUgInN1cHBvcnQgU1BJIGJ1cyBjb25uZWN0aW9uIgorCWRlcGVuZHMgb24gQURFNzg1NCAmJiBTUEkKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIEFERTc4NTQvNTgvNjgvNzggaG9va2VkIHRvIGEgU1BJIGJ1cy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYWRlNzg1NC1zcGkuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2M3ZDUxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9NYWtlZmlsZQpAQCAtMCwwICsxLDE1IEBACisjCisjIE1ha2VmaWxlIGZvciBtZXRlcmluZyBpYyBkcml2ZXJzCisjCisKK29iai0kKENPTkZJR19BREU3NzUzKSArPSBhZGU3NzUzLm8KK29iai0kKENPTkZJR19BREU3NzU0KSArPSBhZGU3NzU0Lm8KKworYWRlNzc1OC15ICAgICAgICAgICAgIDo9IGFkZTc3NThfY29yZS5vCithZGU3NzU4LSQoQ09ORklHX0lJT19SSU5HX0JVRkZFUikgKz0gYWRlNzc1OF9yaW5nLm8gYWRlNzc1OF90cmlnZ2VyLm8KK29iai0kKENPTkZJR19BREU3NzU4KSArPSBhZGU3NzU4Lm8KKworb2JqLSQoQ09ORklHX0FERTc3NTkpICs9IGFkZTc3NTkubworb2JqLSQoQ09ORklHX0FERTc4NTQpICs9IGFkZTc4NTQubworb2JqLSQoQ09ORklHX0FERTc4NTRfSTJDKSArPSBhZGU3ODU0LWkyYy5vCitvYmotJChDT05GSUdfQURFNzg1NF9TUEkpICs9IGFkZTc4NTQtc3BpLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1My5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzUzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcyYWZiZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1My5jCkBAIC0wLDAgKzEsNzMwIEBACisvKgorICogQURFNzc1MyBTaW5nbGUtUGhhc2UgTXVsdGlmdW5jdGlvbiBNZXRlcmluZyBJQyB3aXRoIGRpL2R0IFNlbnNvciBJbnRlcmZhY2UgRHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKyNpbmNsdWRlICJtZXRlci5oIgorI2luY2x1ZGUgImFkZTc3NTMuaCIKKworaW50IGFkZTc3NTNfc3BpX3dyaXRlX3JlZ184KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTggcmVnX2FkZHJlc3MsCisJCXU4IHZhbCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzc1M19zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IEFERTc3NTNfV1JJVEVfUkVHKHJlZ19hZGRyZXNzKTsKKwlzdC0+dHhbMV0gPSB2YWw7CisKKwlyZXQgPSBzcGlfd3JpdGUoc3QtPnVzLCBzdC0+dHgsIDIpOworCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRlNzc1M19zcGlfd3JpdGVfcmVnXzE2KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTggcmVnX2FkZHJlc3MsCisJCXUxNiB2YWx1ZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3NzUzX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gMywKKwkJfQorCX07CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IEFERTc3NTNfV1JJVEVfUkVHKHJlZ19hZGRyZXNzKTsKKwlzdC0+dHhbMV0gPSAodmFsdWUgPj4gOCkgJiAweEZGOworCXN0LT50eFsyXSA9IHZhbHVlICYgMHhGRjsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeGZlcnMsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3NzUzX3NwaV9yZWFkX3JlZ184KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTggcmVnX2FkZHJlc3MsCisJCXU4ICp2YWwpCit7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkZTc3NTNfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCWludCByZXQ7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyc1tdID0geworCQl7CisJCQkudHhfYnVmID0gc3QtPnR4LAorCQkJLnJ4X2J1ZiA9IHN0LT5yeCwKKwkJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJCS5sZW4gPSAyLAorCQl9LAorCX07CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IEFERTc3NTNfUkVBRF9SRUcocmVnX2FkZHJlc3MpOworCXN0LT50eFsxXSA9IDA7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKHhmZXJzLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+dXMsICZtc2cpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3QtPnVzLT5kZXYsICJwcm9ibGVtIHdoZW4gcmVhZGluZyA4IGJpdCByZWdpc3RlciAweCUwMlgiLAorCQkJCXJlZ19hZGRyZXNzKTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCSp2YWwgPSBzdC0+cnhbMV07CisKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3NzUzX3NwaV9yZWFkX3JlZ18xNihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXU4IHJlZ19hZGRyZXNzLAorCQl1MTYgKnZhbCkKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzc1M19zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkucnhfYnVmID0gc3QtPnJ4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDMsCisJCX0sCisJfTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURFNzc1M19SRUFEX1JFRyhyZWdfYWRkcmVzcyk7CisJc3QtPnR4WzFdID0gMDsKKwlzdC0+dHhbMl0gPSAwOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCh4ZmVycywgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnVzLCAmbXNnKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnN0LT51cy0+ZGV2LCAicHJvYmxlbSB3aGVuIHJlYWRpbmcgMTYgYml0IHJlZ2lzdGVyIDB4JTAyWCIsCisJCQkJcmVnX2FkZHJlc3MpOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJKnZhbCA9IChzdC0+cnhbMV0gPDwgOCkgfCBzdC0+cnhbMl07CisKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3NzUzX3NwaV9yZWFkX3JlZ18yNChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXU4IHJlZ19hZGRyZXNzLAorCQl1MzIgKnZhbCkKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzc1M19zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkucnhfYnVmID0gc3QtPnJ4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDQsCisJCX0sCisJfTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURFNzc1M19SRUFEX1JFRyhyZWdfYWRkcmVzcyk7CisJc3QtPnR4WzFdID0gMDsKKwlzdC0+dHhbMl0gPSAwOworCXN0LT50eFszXSA9IDA7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKHhmZXJzLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+dXMsICZtc2cpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3QtPnVzLT5kZXYsICJwcm9ibGVtIHdoZW4gcmVhZGluZyAyNCBiaXQgcmVnaXN0ZXIgMHglMDJYIiwKKwkJCQlyZWdfYWRkcmVzcyk7CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwkqdmFsID0gKHN0LT5yeFsxXSA8PCAxNikgfCAoc3QtPnJ4WzJdIDw8IDgpIHwgc3QtPnJ4WzNdOworCitlcnJvcl9yZXQ6CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkZTc3NTNfcmVhZF84Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCXU4IHZhbCA9IDA7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCisJcmV0ID0gYWRlNzc1M19zcGlfcmVhZF9yZWdfOChkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCB2YWwpOworfQorCitzdGF0aWMgc3NpemVfdCBhZGU3NzUzX3JlYWRfMTZiaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCWludCByZXQ7CisJdTE2IHZhbCA9IDA7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCisJcmV0ID0gYWRlNzc1M19zcGlfcmVhZF9yZWdfMTYoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgdmFsKTsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzc1M19yZWFkXzI0Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCXUzMiB2YWwgPSAwOworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKworCXJldCA9IGFkZTc3NTNfc3BpX3JlYWRfcmVnXzI0KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHZhbCAmIDB4RkZGRkZGKTsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzc1M193cml0ZV84Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisJaW50IHJldDsKKwlsb25nIHZhbDsKKworCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnZhbCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisJcmV0ID0gYWRlNzc1M19zcGlfd3JpdGVfcmVnXzgoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsIHZhbCk7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBhZGU3NzUzX3dyaXRlXzE2Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisJaW50IHJldDsKKwlsb25nIHZhbDsKKworCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnZhbCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisJcmV0ID0gYWRlNzc1M19zcGlfd3JpdGVfcmVnXzE2KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCB2YWwpOworCitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworc3RhdGljIGludCBhZGU3NzUzX3Jlc2V0KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0OworCXUxNiB2YWw7CisJYWRlNzc1M19zcGlfcmVhZF9yZWdfMTYoZGV2LAorCQkJQURFNzc1M19NT0RFLAorCQkJJnZhbCk7CisJdmFsIHw9IDEgPDwgNjsgLyogU29mdHdhcmUgQ2hpcCBSZXNldCAqLworCXJldCA9IGFkZTc3NTNfc3BpX3dyaXRlX3JlZ18xNihkZXYsCisJCQlBREU3NzUzX01PREUsCisJCQl2YWwpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzc1M193cml0ZV9yZXNldChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJaWYgKGxlbiA8IDEpCisJCXJldHVybiAtMTsKKwlzd2l0Y2ggKGJ1ZlswXSkgeworCWNhc2UgJzEnOgorCWNhc2UgJ3knOgorCWNhc2UgJ1knOgorCQlyZXR1cm4gYWRlNzc1M19yZXNldChkZXYpOworCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfQUVORVJHWShhZGU3NzUzX3JlYWRfMjRiaXQsIEFERTc3NTNfQUVORVJHWSk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0xBRU5FUkdZKGFkZTc3NTNfcmVhZF8yNGJpdCwgQURFNzc1M19MQUVORVJHWSk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX1ZBRU5FUkdZKGFkZTc3NTNfcmVhZF8yNGJpdCwgQURFNzc1M19WQUVORVJHWSk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0xWQUVORVJHWShhZGU3NzUzX3JlYWRfMjRiaXQsIEFERTc3NTNfTFZBRU5FUkdZKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0ZERU4oU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTNfcmVhZF8xNmJpdCwKKwkJYWRlNzc1M193cml0ZV8xNmJpdCwKKwkJQURFNzc1M19DRkRFTik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0NGTlVNKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzUzX3JlYWRfOGJpdCwKKwkJYWRlNzc1M193cml0ZV84Yml0LAorCQlBREU3NzUzX0NGTlVNKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0hLU1VNKGFkZTc3NTNfcmVhZF84Yml0LCBBREU3NzUzX0NIS1NVTSk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX1BIQ0FMKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzUzX3JlYWRfMTZiaXQsCisJCWFkZTc3NTNfd3JpdGVfMTZiaXQsCisJCUFERTc3NTNfUEhDQUwpOworc3RhdGljIElJT19ERVZfQVRUUl9BUE9TKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzUzX3JlYWRfMTZiaXQsCisJCWFkZTc3NTNfd3JpdGVfMTZiaXQsCisJCUFERTc3NTNfQVBPUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX1NBR0NZQyhTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1M19yZWFkXzhiaXQsCisJCWFkZTc3NTNfd3JpdGVfOGJpdCwKKwkJQURFNzc1M19TQUdDWUMpOworc3RhdGljIElJT19ERVZfQVRUUl9TQUdMVkwoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTNfcmVhZF84Yml0LAorCQlhZGU3NzUzX3dyaXRlXzhiaXQsCisJCUFERTc3NTNfU0FHTFZMKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfTElORUNZQyhTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1M19yZWFkXzhiaXQsCisJCWFkZTc3NTNfd3JpdGVfOGJpdCwKKwkJQURFNzc1M19MSU5FQ1lDKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfV0RJVihTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1M19yZWFkXzhiaXQsCisJCWFkZTc3NTNfd3JpdGVfOGJpdCwKKwkJQURFNzc1M19XRElWKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfSVJNUyhTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1M19yZWFkXzI0Yml0LAorCQlOVUxMLAorCQlBREU3NzUzX0lSTVMpOworc3RhdGljIElJT19ERVZfQVRUUl9WUk1TKFNfSVJVR08sCisJCWFkZTc3NTNfcmVhZF8yNGJpdCwKKwkJTlVMTCwKKwkJQURFNzc1M19WUk1TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfSVJNU09TKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzUzX3JlYWRfMTZiaXQsCisJCWFkZTc3NTNfd3JpdGVfMTZiaXQsCisJCUFERTc3NTNfSVJNU09TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfVlJNU09TKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzUzX3JlYWRfMTZiaXQsCisJCWFkZTc3NTNfd3JpdGVfMTZiaXQsCisJCUFERTc3NTNfVlJNU09TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfV0dBSU4oU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTNfcmVhZF8xNmJpdCwKKwkJYWRlNzc1M193cml0ZV8xNmJpdCwKKwkJQURFNzc1M19XR0FJTik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX1ZBR0FJTihTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1M19yZWFkXzE2Yml0LAorCQlhZGU3NzUzX3dyaXRlXzE2Yml0LAorCQlBREU3NzUzX1ZBR0FJTik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX1BHQV9HQUlOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzUzX3JlYWRfMTZiaXQsCisJCWFkZTc3NTNfd3JpdGVfMTZiaXQsCisJCUFERTc3NTNfR0FJTik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0lQS0xWTChTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1M19yZWFkXzhiaXQsCisJCWFkZTc3NTNfd3JpdGVfOGJpdCwKKwkJQURFNzc1M19JUEtMVkwpOworc3RhdGljIElJT19ERVZfQVRUUl9WUEtMVkwoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTNfcmVhZF84Yml0LAorCQlhZGU3NzUzX3dyaXRlXzhiaXQsCisJCUFERTc3NTNfVlBLTFZMKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfSVBFQUsoU19JUlVHTywKKwkJYWRlNzc1M19yZWFkXzI0Yml0LAorCQlOVUxMLAorCQlBREU3NzUzX0lQRUFLKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfVlBFQUsoU19JUlVHTywKKwkJYWRlNzc1M19yZWFkXzI0Yml0LAorCQlOVUxMLAorCQlBREU3NzUzX1ZQRUFLKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfVlBFUklPRChTX0lSVUdPLAorCQlhZGU3NzUzX3JlYWRfMTZiaXQsCisJCU5VTEwsCisJCUFERTc3NTNfUEVSSU9EKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0hfT0ZGKDEsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzUzX3JlYWRfOGJpdCwKKwkJYWRlNzc1M193cml0ZV84Yml0LAorCQlBREU3NzUzX0NIMU9TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0hfT0ZGKDIsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzUzX3JlYWRfOGJpdCwKKwkJYWRlNzc1M193cml0ZV84Yml0LAorCQlBREU3NzUzX0NIMk9TKTsKKworc3RhdGljIGludCBhZGU3NzUzX3NldF9pcnEoc3RydWN0IGRldmljZSAqZGV2LCBib29sIGVuYWJsZSkKK3sKKwlpbnQgcmV0OworCXU4IGlycWVuOworCXJldCA9IGFkZTc3NTNfc3BpX3JlYWRfcmVnXzgoZGV2LCBBREU3NzUzX0lSUUVOLCAmaXJxZW4pOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJaWYgKGVuYWJsZSkKKwkJaXJxZW4gfD0gMSA8PCAzOyAvKiBFbmFibGVzIGFuIGludGVycnVwdCB3aGVuIGEgZGF0YSBpcworCQkJCSAgICBwcmVzZW50IGluIHRoZSB3YXZlZm9ybSByZWdpc3RlciAqLworCWVsc2UKKwkJaXJxZW4gJj0gfigxIDw8IDMpOworCisJcmV0ID0gYWRlNzc1M19zcGlfd3JpdGVfcmVnXzgoZGV2LCBBREU3NzUzX0lSUUVOLCBpcnFlbik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCisvKiBQb3dlciBkb3duIHRoZSBkZXZpY2UgKi8KK2ludCBhZGU3NzUzX3N0b3BfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0OworCXUxNiB2YWw7CisJYWRlNzc1M19zcGlfcmVhZF9yZWdfMTYoZGV2LAorCQkJQURFNzc1M19NT0RFLAorCQkJJnZhbCk7CisJdmFsIHw9IDEgPDwgNDsgIC8qIEFEIGNvbnZlcnRlcnMgY2FuIGJlIHR1cm5lZCBvZmYgKi8KKwlyZXQgPSBhZGU3NzUzX3NwaV93cml0ZV9yZWdfMTYoZGV2LAorCQkJQURFNzc1M19NT0RFLAorCQkJdmFsKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRlNzc1M19pbml0aWFsX3NldHVwKHN0cnVjdCBhZGU3NzUzX3N0YXRlICpzdCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZzdC0+aW5kaW9fZGV2LT5kZXY7CisKKwkvKiB1c2UgbG93IHNwaSBzcGVlZCBmb3IgaW5pdCAqLworCXN0LT51cy0+bW9kZSA9IFNQSV9NT0RFXzM7CisJc3BpX3NldHVwKHN0LT51cyk7CisKKwkvKiBEaXNhYmxlIElSUSAqLworCXJldCA9IGFkZTc3NTNfc2V0X2lycShkZXYsIGZhbHNlKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZGlzYWJsZSBpcnEgZmFpbGVkIik7CisJCWdvdG8gZXJyX3JldDsKKwl9CisKKwlhZGU3NzUzX3Jlc2V0KGRldik7CisJbXNsZWVwKEFERTc3NTNfU1RBUlRVUF9ERUxBWSk7CisKK2Vycl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzc1M19yZWFkX2ZyZXF1ZW5jeShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJaW50IHJldCwgbGVuID0gMDsKKwl1OCB0OworCWludCBzcHM7CisJcmV0ID0gYWRlNzc1M19zcGlfcmVhZF9yZWdfOChkZXYsCisJCQlBREU3NzUzX01PREUsCisJCQkmdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXQgPSAodCA+PiAxMSkgJiAweDM7CisJc3BzID0gMjc5MDAgLyAoMSArIHQpOworCisJbGVuID0gc3ByaW50ZihidWYsICIlZCBTUFNcbiIsIHNwcyk7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzc1M193cml0ZV9mcmVxdWVuY3koc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzc1M19zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJaW50IHJldDsKKwl1MTYgcmVnLCB0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisKKwl0ID0gKDI3OTAwIC8gdmFsKTsKKwlpZiAodCA+IDApCisJCXQtLTsKKworCWlmICh0ID4gMSkKKwkJc3QtPnVzLT5tYXhfc3BlZWRfaHogPSBBREU3NzUzX1NQSV9TTE9XOworCWVsc2UKKwkJc3QtPnVzLT5tYXhfc3BlZWRfaHogPSBBREU3NzUzX1NQSV9GQVNUOworCisJcmV0ID0gYWRlNzc1M19zcGlfcmVhZF9yZWdfMTYoZGV2LAorCQkJQURFNzc1M19NT0RFLAorCQkJJnJlZyk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZWcgJj0gfigzIDw8IDExKTsKKwlyZWcgfD0gdCA8PCAxMTsKKworCXJldCA9IGFkZTc3NTNfc3BpX3dyaXRlX3JlZ18xNihkZXYsCisJCQlBREU3NzUzX01PREUsCisJCQlyZWcpOworCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CitzdGF0aWMgSUlPX0RFVl9BVFRSX1RFTVBfUkFXKGFkZTc3NTNfcmVhZF84Yml0KTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUih0ZW1wX29mZnNldCwgIi0yNSBDIik7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIodGVtcF9zY2FsZSwgIjAuNjcgQyIpOworCitzdGF0aWMgSUlPX0RFVl9BVFRSX1NBTVBfRlJFUShTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1M19yZWFkX2ZyZXF1ZW5jeSwKKwkJYWRlNzc1M193cml0ZV9mcmVxdWVuY3kpOworCitzdGF0aWMgSUlPX0RFVl9BVFRSX1JFU0VUKGFkZTc3NTNfd3JpdGVfcmVzZXQpOworCitzdGF0aWMgSUlPX0NPTlNUX0FUVFJfU0FNUF9GUkVRX0FWQUlMKCIyNzkwMCAxNDAwMCA3MDAwIDM1MDAiKTsKKworc3RhdGljIElJT19DT05TVF9BVFRSKG5hbWUsICJhZGU3NzUzIik7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZGU3NzUzX2V2ZW50X2F0dHJpYnV0ZXNbXSA9IHsKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZGU3NzUzX2V2ZW50X2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZGU3NzUzX2V2ZW50X2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRlNzc1M19hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19kZXZfYXR0cl90ZW1wX3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl90ZW1wX29mZnNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl90ZW1wX3NjYWxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9zYW1wbGluZ19mcmVxdWVuY3kuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfc2FtcGxpbmdfZnJlcXVlbmN5X2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcmVzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcGhjYWwuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NmZGVuLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hZW5lcmd5LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9sYWVuZXJneS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfdmFlbmVyZ3kuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2x2YWVuZXJneS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2ZudW0uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2Fwb3MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3NhZ2N5Yy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfc2FnbHZsLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9saW5lY3ljLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jaGtzdW0uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3BnYV9nYWluLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl93Z2Fpbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2hvZmZfMS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2hvZmZfMi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfd2Rpdi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaXJtcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfdnJtcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaXJtc29zLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl92cm1zb3MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3ZhZ2Fpbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaXBrbHZsLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl92cGtsdmwuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2lwZWFrLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl92cGVhay5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfdnBlcmlvZC5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZGU3NzUzX2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZGU3NzUzX2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZGU3NzUzX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJaW50IHJldCwgcmVnZG9uZSA9IDA7CisJc3RydWN0IGFkZTc3NTNfc3RhdGUgKnN0ID0ga3phbGxvYyhzaXplb2YgKnN0LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0KSB7CisJCXJldCA9ICAtRU5PTUVNOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJLyogdGhpcyBpcyBvbmx5IHVzZWQgZm9yIHJlbW92YWwgcHVycG9zZXMgKi8KKwlzcGlfc2V0X2RydmRhdGEoc3BpLCBzdCk7CisKKwkvKiBBbGxvY2F0ZSB0aGUgY29tbXMgYnVmZmVycyAqLworCXN0LT5yeCA9IGt6YWxsb2Moc2l6ZW9mKCpzdC0+cngpKkFERTc3NTNfTUFYX1JYLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QtPnJ4ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3N0OworCX0KKwlzdC0+dHggPSBremFsbG9jKHNpemVvZigqc3QtPnR4KSpBREU3NzUzX01BWF9UWCwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0LT50eCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9yeDsKKwl9CisJc3QtPnVzID0gc3BpOworCW11dGV4X2luaXQoJnN0LT5idWZfbG9jayk7CisJLyogc2V0dXAgdGhlIGluZHVzdHJpYWxpbyBkcml2ZXIgYWxsb2NhdGVkIGVsZW1lbnRzICovCisJc3QtPmluZGlvX2RldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoc3QtPmluZGlvX2RldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV90eDsKKwl9CisKKwlzdC0+aW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJnNwaS0+ZGV2OworCXN0LT5pbmRpb19kZXYtPm51bV9pbnRlcnJ1cHRfbGluZXMgPSAxOworCXN0LT5pbmRpb19kZXYtPmV2ZW50X2F0dHJzID0gJmFkZTc3NTNfZXZlbnRfYXR0cmlidXRlX2dyb3VwOworCXN0LT5pbmRpb19kZXYtPmF0dHJzID0gJmFkZTc3NTNfYXR0cmlidXRlX2dyb3VwOworCXN0LT5pbmRpb19kZXYtPmRldl9kYXRhID0gKHZvaWQgKikoc3QpOworCXN0LT5pbmRpb19kZXYtPmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRTsKKwlzdC0+aW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJcmV0ID0gYWRlNzc1M19jb25maWd1cmVfcmluZyhzdC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2OworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihzdC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3VucmVnX3JpbmdfZnVuY3M7CisJcmVnZG9uZSA9IDE7CisKKwlyZXQgPSBhZGU3NzUzX2luaXRpYWxpemVfcmluZyhzdC0+aW5kaW9fZGV2LT5yaW5nKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIHJpbmdcbiIpOworCQlnb3RvIGVycm9yX3VucmVnX3JpbmdfZnVuY3M7CisJfQorCisJaWYgKHNwaS0+aXJxKSB7CisJCXJldCA9IGlpb19yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShzcGktPmlycSwKKwkJCQlzdC0+aW5kaW9fZGV2LAorCQkJCTAsCisJCQkJSVJRRl9UUklHR0VSX0ZBTExJTkcsCisJCQkJImFkZTc3NTMiKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfdW5pbml0aWFsaXplX3Jpbmc7CisKKwkJcmV0ID0gYWRlNzc1M19wcm9iZV90cmlnZ2VyKHN0LT5pbmRpb19kZXYpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl91bnJlZ2lzdGVyX2xpbmU7CisJfQorCisJLyogR2V0IHRoZSBkZXZpY2UgaW50byBhIHNhbmUgaW5pdGlhbCBzdGF0ZSAqLworCXJldCA9IGFkZTc3NTNfaW5pdGlhbF9zZXR1cChzdCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZW1vdmVfdHJpZ2dlcjsKKwlyZXR1cm4gMDsKKworZXJyb3JfcmVtb3ZlX3RyaWdnZXI6CisJaWYgKHN0LT5pbmRpb19kZXYtPm1vZGVzICYgSU5ESU9fUklOR19UUklHR0VSRUQpCisJCWFkZTc3NTNfcmVtb3ZlX3RyaWdnZXIoc3QtPmluZGlvX2Rldik7CitlcnJvcl91bnJlZ2lzdGVyX2xpbmU6CisJaWYgKHN0LT5pbmRpb19kZXYtPm1vZGVzICYgSU5ESU9fUklOR19UUklHR0VSRUQpCisJCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKHN0LT5pbmRpb19kZXYsIDApOworZXJyb3JfdW5pbml0aWFsaXplX3Jpbmc6CisJYWRlNzc1M191bmluaXRpYWxpemVfcmluZyhzdC0+aW5kaW9fZGV2LT5yaW5nKTsKK2Vycm9yX3VucmVnX3JpbmdfZnVuY3M6CisJYWRlNzc1M191bmNvbmZpZ3VyZV9yaW5nKHN0LT5pbmRpb19kZXYpOworZXJyb3JfZnJlZV9kZXY6CisJaWYgKHJlZ2RvbmUpCisJCWlpb19kZXZpY2VfdW5yZWdpc3RlcihzdC0+aW5kaW9fZGV2KTsKKwllbHNlCisJCWlpb19mcmVlX2RldmljZShzdC0+aW5kaW9fZGV2KTsKK2Vycm9yX2ZyZWVfdHg6CisJa2ZyZWUoc3QtPnR4KTsKK2Vycm9yX2ZyZWVfcng6CisJa2ZyZWUoc3QtPnJ4KTsKK2Vycm9yX2ZyZWVfc3Q6CisJa2ZyZWUoc3QpOworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKKy8qIGZpeG1lLCBjb25maXJtIG9yZGVyaW5nIGluIHRoaXMgZnVuY3Rpb24gKi8KK3N0YXRpYyBpbnQgYWRlNzc1M19yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBhZGU3NzUzX3N0YXRlICpzdCA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBzdC0+aW5kaW9fZGV2OworCisJcmV0ID0gYWRlNzc1M19zdG9wX2RldmljZSgmKGluZGlvX2Rldi0+ZGV2KSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfcmV0OworCisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKworCWFkZTc3NTNfcmVtb3ZlX3RyaWdnZXIoaW5kaW9fZGV2KTsKKwlpZiAoc3BpLT5pcnEgJiYgZ3Bpb19pc192YWxpZChpcnFfdG9fZ3BpbyhzcGktPmlycSkpID4gMCkKKwkJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoaW5kaW9fZGV2LCAwKTsKKworCWFkZTc3NTNfdW5pbml0aWFsaXplX3JpbmcoaW5kaW9fZGV2LT5yaW5nKTsKKwlhZGU3NzUzX3VuY29uZmlndXJlX3JpbmcoaW5kaW9fZGV2KTsKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlrZnJlZShzdC0+dHgpOworCWtmcmVlKHN0LT5yeCk7CisJa2ZyZWUoc3QpOworCisJcmV0dXJuIDA7CisKK2Vycl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFkZTc3NTNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFkZTc3NTMiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IGFkZTc3NTNfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFkZTc3NTNfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGFkZTc3NTNfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZhZGU3NzUzX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChhZGU3NzUzX2luaXQpOworCitzdGF0aWMgX19leGl0IHZvaWQgYWRlNzc1M19leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZGU3NzUzX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhZGU3NzUzX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJCYXJyeSBTb25nIDwyMWNuYmFvQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQURFNzc1My82IFNpbmdsZS1QaGFzZSBNdWx0aWZ1bmN0aW9uIE1ldGVyaW5nIElDIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzUzLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzcyMmI4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzUzLmgKQEAgLTAsMCArMSwxNDAgQEAKKyNpZm5kZWYgX0FERTc3NTNfSAorI2RlZmluZSBfQURFNzc1M19ICisKKyNkZWZpbmUgQURFNzc1M19XQVZFRk9STSAgIDB4MDEKKyNkZWZpbmUgQURFNzc1M19BRU5FUkdZICAgIDB4MDIKKyNkZWZpbmUgQURFNzc1M19SQUVORVJHWSAgIDB4MDMKKyNkZWZpbmUgQURFNzc1M19MQUVORVJHWSAgIDB4MDQKKyNkZWZpbmUgQURFNzc1M19WQUVORVJHWSAgIDB4MDUKKyNkZWZpbmUgQURFNzc1M19SVkFFTkVSR1kgIDB4MDYKKyNkZWZpbmUgQURFNzc1M19MVkFFTkVSR1kgIDB4MDcKKyNkZWZpbmUgQURFNzc1M19MVkFSRU5FUkdZIDB4MDgKKyNkZWZpbmUgQURFNzc1M19NT0RFICAgICAgIDB4MDkKKyNkZWZpbmUgQURFNzc1M19JUlFFTiAgICAgIDB4MEEKKyNkZWZpbmUgQURFNzc1M19TVEFUVVMgICAgIDB4MEIKKyNkZWZpbmUgQURFNzc1M19SU1RTVEFUVVMgIDB4MEMKKyNkZWZpbmUgQURFNzc1M19DSDFPUyAgICAgIDB4MEQKKyNkZWZpbmUgQURFNzc1M19DSDJPUyAgICAgIDB4MEUKKyNkZWZpbmUgQURFNzc1M19HQUlOICAgICAgIDB4MEYKKyNkZWZpbmUgQURFNzc1M19QSENBTCAgICAgIDB4MTAKKyNkZWZpbmUgQURFNzc1M19BUE9TICAgICAgIDB4MTEKKyNkZWZpbmUgQURFNzc1M19XR0FJTiAgICAgIDB4MTIKKyNkZWZpbmUgQURFNzc1M19XRElWICAgICAgIDB4MTMKKyNkZWZpbmUgQURFNzc1M19DRk5VTSAgICAgIDB4MTQKKyNkZWZpbmUgQURFNzc1M19DRkRFTiAgICAgIDB4MTUKKyNkZWZpbmUgQURFNzc1M19JUk1TICAgICAgIDB4MTYKKyNkZWZpbmUgQURFNzc1M19WUk1TICAgICAgIDB4MTcKKyNkZWZpbmUgQURFNzc1M19JUk1TT1MgICAgIDB4MTgKKyNkZWZpbmUgQURFNzc1M19WUk1TT1MgICAgIDB4MTkKKyNkZWZpbmUgQURFNzc1M19WQUdBSU4gICAgIDB4MUEKKyNkZWZpbmUgQURFNzc1M19WQURJViAgICAgIDB4MUIKKyNkZWZpbmUgQURFNzc1M19MSU5FQ1lDICAgIDB4MUMKKyNkZWZpbmUgQURFNzc1M19aWFRPVVQgICAgIDB4MUQKKyNkZWZpbmUgQURFNzc1M19TQUdDWUMgICAgIDB4MUUKKyNkZWZpbmUgQURFNzc1M19TQUdMVkwgICAgIDB4MUYKKyNkZWZpbmUgQURFNzc1M19JUEtMVkwgICAgIDB4MjAKKyNkZWZpbmUgQURFNzc1M19WUEtMVkwgICAgIDB4MjEKKyNkZWZpbmUgQURFNzc1M19JUEVBSyAgICAgIDB4MjIKKyNkZWZpbmUgQURFNzc1M19SU1RJUEVBSyAgIDB4MjMKKyNkZWZpbmUgQURFNzc1M19WUEVBSyAgICAgIDB4MjQKKyNkZWZpbmUgQURFNzc1M19SU1RWUEVBSyAgIDB4MjUKKyNkZWZpbmUgQURFNzc1M19URU1QICAgICAgIDB4MjYKKyNkZWZpbmUgQURFNzc1M19QRVJJT0QgICAgIDB4MjcKKyNkZWZpbmUgQURFNzc1M19UTU9ERSAgICAgIDB4M0QKKyNkZWZpbmUgQURFNzc1M19DSEtTVU0gICAgIDB4M0UKKyNkZWZpbmUgQURFNzc1M19ESUVSRVYgICAgIDB4M0YKKworI2RlZmluZSBBREU3NzUzX1JFQURfUkVHKGEpICAgIGEKKyNkZWZpbmUgQURFNzc1M19XUklURV9SRUcoYSkgKChhKSB8IDB4ODApCisKKyNkZWZpbmUgQURFNzc1M19NQVhfVFggICAgNAorI2RlZmluZSBBREU3NzUzX01BWF9SWCAgICA0CisjZGVmaW5lIEFERTc3NTNfU1RBUlRVUF9ERUxBWSAxCisKKyNkZWZpbmUgQURFNzc1M19TUElfU0xPVwkodTMyKSgzMDAgKiAxMDAwKQorI2RlZmluZSBBREU3NzUzX1NQSV9CVVJTVAkodTMyKSgxMDAwICogMTAwMCkKKyNkZWZpbmUgQURFNzc1M19TUElfRkFTVAkodTMyKSgyMDAwICogMTAwMCkKKworI2RlZmluZSBEUklWRVJfTkFNRQkJImFkZTc3NTMiCisKKy8qKgorICogc3RydWN0IGFkZTc3NTNfc3RhdGUgLSBkZXZpY2UgaW5zdGFuY2Ugc3BlY2lmaWMgZGF0YQorICogQHVzOgkJCWFjdHVhbCBzcGlfZGV2aWNlCisgKiBAd29ya190cmlnZ2VyX3RvX3Jpbmc6IGJoIGZvciB0cmlnZ2VyZWQgZXZlbnQgaGFuZGxpbmcKKyAqIEBpbnRlcjoJCXVzZWQgdG8gY2hlY2sgaWYgbmV3IGludGVycnVwdCBoYXMgYmVlbiB0cmlnZ2VyZWQKKyAqIEBsYXN0X3RpbWVzdGFtcDoJcGFzc2luZyB0aW1lc3RhbXAgZnJvbSB0aCB0byBiaCBvZiBpbnRlcnJ1cHQgaGFuZGxlcgorICogQGluZGlvX2RldjoJCWluZHVzdHJpYWwgSS9PIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEB0cmlnOgkJZGF0YSByZWFkeSB0cmlnZ2VyIHJlZ2lzdGVyZWQgd2l0aCBpaW8KKyAqIEB0eDoJCQl0cmFuc21pdCBidWZmZXIKKyAqIEByeDoJCQlyZWNpZXZlIGJ1ZmZlcgorICogQGJ1Zl9sb2NrOgkJbXV0ZXggdG8gcHJvdGVjdCB0eCBhbmQgcngKKyAqKi8KK3N0cnVjdCBhZGU3NzUzX3N0YXRlIHsKKwlzdHJ1Y3Qgc3BpX2RldmljZQkJKnVzOworCXN0cnVjdCB3b3JrX3N0cnVjdAkJd29ya190cmlnZ2VyX3RvX3Jpbmc7CisJczY0CQkJCWxhc3RfdGltZXN0YW1wOworCXN0cnVjdCBpaW9fZGV2CQkJKmluZGlvX2RldjsKKwlzdHJ1Y3QgaWlvX3RyaWdnZXIJCSp0cmlnOworCXU4CQkJCSp0eDsKKwl1OAkJCQkqcng7CisJc3RydWN0IG11dGV4CQkJYnVmX2xvY2s7Cit9OworI2lmIGRlZmluZWQoQ09ORklHX0lJT19SSU5HX0JVRkZFUikgJiYgZGVmaW5lZChUSElTX0hBU19SSU5HX0JVRkZFUl9TVVBQT1JUKQorLyogQXQgdGhlIG1vbWVudCB0cmlnZ2VycyBhcmUgb25seSB1c2VkIGZvciByaW5nIGJ1ZmZlcgorICogZmlsbGluZy4gVGhpcyBtYXkgY2hhbmdlIQorICovCisKK2VudW0gYWRlNzc1M19zY2FuIHsKKwlBREU3NzUzX1NDQU5fQUNUSVZFX1BPV0VSLAorCUFERTc3NTNfU0NBTl9DSDEsCisJQURFNzc1M19TQ0FOX0NIMiwKK307CisKK3ZvaWQgYWRlNzc1M19yZW1vdmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKK2ludCBhZGU3NzUzX3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKK3NzaXplX3QgYWRlNzc1M19yZWFkX2RhdGFfZnJvbV9yaW5nKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1Zik7CisKKworaW50IGFkZTc3NTNfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7Cit2b2lkIGFkZTc3NTNfdW5jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKKworaW50IGFkZTc3NTNfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpOwordm9pZCBhZGU3NzUzX3VuaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpOworI2Vsc2UgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgYWRlNzc1M19yZW1vdmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworfQorc3RhdGljIGlubGluZSBpbnQgYWRlNzc1M19wcm9iZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdAorYWRlNzc1M19yZWFkX2RhdGFfZnJvbV9yaW5nKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGU3NzUzX2NvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgYWRlNzc1M191bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7Cit9CitzdGF0aWMgaW5saW5lIGludCBhZGU3NzUzX2luaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQoreworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSB2b2lkIGFkZTc3NTNfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKK3sKK30KKyNlbmRpZiAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU0LmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2RlZGZhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU0LmMKQEAgLTAsMCArMSw3NTYgQEAKKy8qCisgKiBBREU3NzU0IFBvbHlwaGFzZSBNdWx0aWZ1bmN0aW9uIEVuZXJneSBNZXRlcmluZyBJQyBEcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorI2luY2x1ZGUgIm1ldGVyLmgiCisjaW5jbHVkZSAiYWRlNzc1NC5oIgorCitzdGF0aWMgaW50IGFkZTc3NTRfc3BpX3dyaXRlX3JlZ184KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTggcmVnX2FkZHJlc3MsCisJCXU4IHZhbCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzc1NF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IEFERTc3NTRfV1JJVEVfUkVHKHJlZ19hZGRyZXNzKTsKKwlzdC0+dHhbMV0gPSB2YWw7CisKKwlyZXQgPSBzcGlfd3JpdGUoc3QtPnVzLCBzdC0+dHgsIDIpOworCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRlNzc1NF9zcGlfd3JpdGVfcmVnXzE2KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTggcmVnX2FkZHJlc3MsCisJCXUxNiB2YWx1ZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3NzU0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gMywKKwkJfQorCX07CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IEFERTc3NTRfV1JJVEVfUkVHKHJlZ19hZGRyZXNzKTsKKwlzdC0+dHhbMV0gPSAodmFsdWUgPj4gOCkgJiAweEZGOworCXN0LT50eFsyXSA9IHZhbHVlICYgMHhGRjsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeGZlcnMsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3NzU0X3NwaV9yZWFkX3JlZ184KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTggcmVnX2FkZHJlc3MsCisJCXU4ICp2YWwpCit7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkZTc3NTRfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCWludCByZXQ7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyc1tdID0geworCQl7CisJCQkudHhfYnVmID0gc3QtPnR4LAorCQkJLnJ4X2J1ZiA9IHN0LT5yeCwKKwkJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJCS5sZW4gPSAyLAorCQl9LAorCX07CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IEFERTc3NTRfUkVBRF9SRUcocmVnX2FkZHJlc3MpOworCXN0LT50eFsxXSA9IDA7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKHhmZXJzLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+dXMsICZtc2cpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3QtPnVzLT5kZXYsICJwcm9ibGVtIHdoZW4gcmVhZGluZyA4IGJpdCByZWdpc3RlciAweCUwMlgiLAorCQkJCXJlZ19hZGRyZXNzKTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCSp2YWwgPSBzdC0+cnhbMV07CisKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3NzU0X3NwaV9yZWFkX3JlZ18xNihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXU4IHJlZ19hZGRyZXNzLAorCQl1MTYgKnZhbCkKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzc1NF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkucnhfYnVmID0gc3QtPnJ4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDMsCisJCX0sCisJfTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURFNzc1NF9SRUFEX1JFRyhyZWdfYWRkcmVzcyk7CisJc3QtPnR4WzFdID0gMDsKKwlzdC0+dHhbMl0gPSAwOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCh4ZmVycywgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnVzLCAmbXNnKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnN0LT51cy0+ZGV2LCAicHJvYmxlbSB3aGVuIHJlYWRpbmcgMTYgYml0IHJlZ2lzdGVyIDB4JTAyWCIsCisJCQkJcmVnX2FkZHJlc3MpOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJKnZhbCA9IChzdC0+cnhbMV0gPDwgOCkgfCBzdC0+cnhbMl07CisKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3NzU0X3NwaV9yZWFkX3JlZ18yNChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXU4IHJlZ19hZGRyZXNzLAorCQl1MzIgKnZhbCkKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzc1NF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkucnhfYnVmID0gc3QtPnJ4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDQsCisJCX0sCisJfTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURFNzc1NF9SRUFEX1JFRyhyZWdfYWRkcmVzcyk7CisJc3QtPnR4WzFdID0gMDsKKwlzdC0+dHhbMl0gPSAwOworCXN0LT50eFszXSA9IDA7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKHhmZXJzLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+dXMsICZtc2cpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3QtPnVzLT5kZXYsICJwcm9ibGVtIHdoZW4gcmVhZGluZyAyNCBiaXQgcmVnaXN0ZXIgMHglMDJYIiwKKwkJCQlyZWdfYWRkcmVzcyk7CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwkqdmFsID0gKHN0LT5yeFsxXSA8PCAxNikgfCAoc3QtPnJ4WzJdIDw8IDgpIHwgc3QtPnJ4WzNdOworCitlcnJvcl9yZXQ6CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkZTc3NTRfcmVhZF84Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCXU4IHZhbCA9IDA7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCisJcmV0ID0gYWRlNzc1NF9zcGlfcmVhZF9yZWdfOChkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCB2YWwpOworfQorCitzdGF0aWMgc3NpemVfdCBhZGU3NzU0X3JlYWRfMTZiaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCWludCByZXQ7CisJdTE2IHZhbCA9IDA7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCisJcmV0ID0gYWRlNzc1NF9zcGlfcmVhZF9yZWdfMTYoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgdmFsKTsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzc1NF9yZWFkXzI0Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCXUzMiB2YWwgPSAwOworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKworCXJldCA9IGFkZTc3NTRfc3BpX3JlYWRfcmVnXzI0KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHZhbCAmIDB4RkZGRkZGKTsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzc1NF93cml0ZV84Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisJaW50IHJldDsKKwlsb25nIHZhbDsKKworCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnZhbCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisJcmV0ID0gYWRlNzc1NF9zcGlfd3JpdGVfcmVnXzgoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsIHZhbCk7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBhZGU3NzU0X3dyaXRlXzE2Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisJaW50IHJldDsKKwlsb25nIHZhbDsKKworCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnZhbCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisJcmV0ID0gYWRlNzc1NF9zcGlfd3JpdGVfcmVnXzE2KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCB2YWwpOworCitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworc3RhdGljIGludCBhZGU3NzU0X3Jlc2V0KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0OworCXU4IHZhbDsKKwlhZGU3NzU0X3NwaV9yZWFkX3JlZ184KGRldiwKKwkJCUFERTc3NTRfT1BNT0RFLAorCQkJJnZhbCk7CisJdmFsIHw9IDEgPDwgNjsgLyogU29mdHdhcmUgQ2hpcCBSZXNldCAqLworCXJldCA9IGFkZTc3NTRfc3BpX3dyaXRlX3JlZ184KGRldiwKKwkJCUFERTc3NTRfT1BNT0RFLAorCQkJdmFsKTsKKworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHNzaXplX3QgYWRlNzc1NF93cml0ZV9yZXNldChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJaWYgKGxlbiA8IDEpCisJCXJldHVybiAtMTsKKwlzd2l0Y2ggKGJ1ZlswXSkgeworCWNhc2UgJzEnOgorCWNhc2UgJ3knOgorCWNhc2UgJ1knOgorCQlyZXR1cm4gYWRlNzc1NF9yZXNldChkZXYpOworCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfQUVORVJHWShhZGU3NzU0X3JlYWRfMjRiaXQsIEFERTc3NTRfQUVORVJHWSk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0xBRU5FUkdZKGFkZTc3NTRfcmVhZF8yNGJpdCwgQURFNzc1NF9MQUVORVJHWSk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX1ZBRU5FUkdZKGFkZTc3NTRfcmVhZF8yNGJpdCwgQURFNzc1NF9WQUVORVJHWSk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0xWQUVORVJHWShhZGU3NzU0X3JlYWRfMjRiaXQsIEFERTc3NTRfTFZBRU5FUkdZKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfVlBFQUsoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTRfcmVhZF84Yml0LAorCQlhZGU3NzU0X3dyaXRlXzhiaXQsCisJCUFERTc3NTRfVlBFQUspOworc3RhdGljIElJT19ERVZfQVRUUl9JUEVBSyhTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1NF9yZWFkXzhiaXQsCisJCWFkZTc3NTRfd3JpdGVfOGJpdCwKKwkJQURFNzc1NF9WUEVBSyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FQSENBTChTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1NF9yZWFkXzhiaXQsCisJCWFkZTc3NTRfd3JpdGVfOGJpdCwKKwkJQURFNzc1NF9BUEhDQUwpOworc3RhdGljIElJT19ERVZfQVRUUl9CUEhDQUwoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTRfcmVhZF84Yml0LAorCQlhZGU3NzU0X3dyaXRlXzhiaXQsCisJCUFERTc3NTRfQlBIQ0FMKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ1BIQ0FMKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU0X3JlYWRfOGJpdCwKKwkJYWRlNzc1NF93cml0ZV84Yml0LAorCQlBREU3NzU0X0NQSENBTCk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FBUE9TKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU0X3JlYWRfMTZiaXQsCisJCWFkZTc3NTRfd3JpdGVfMTZiaXQsCisJCUFERTc3NTRfQUFQT1MpOworc3RhdGljIElJT19ERVZfQVRUUl9CQVBPUyhTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1NF9yZWFkXzE2Yml0LAorCQlhZGU3NzU0X3dyaXRlXzE2Yml0LAorCQlBREU3NzU0X0JBUE9TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0FQT1MoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTRfcmVhZF8xNmJpdCwKKwkJYWRlNzc1NF93cml0ZV8xNmJpdCwKKwkJQURFNzc1NF9DQVBPUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX1dESVYoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTRfcmVhZF84Yml0LAorCQlhZGU3NzU0X3dyaXRlXzhiaXQsCisJCUFERTc3NTRfV0RJVik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX1ZBRElWKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU0X3JlYWRfOGJpdCwKKwkJYWRlNzc1NF93cml0ZV84Yml0LAorCQlBREU3NzU0X1ZBRElWKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0ZOVU0oU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTRfcmVhZF8xNmJpdCwKKwkJYWRlNzc1NF93cml0ZV8xNmJpdCwKKwkJQURFNzc1NF9DRk5VTSk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0NGREVOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU0X3JlYWRfMTZiaXQsCisJCWFkZTc3NTRfd3JpdGVfMTZiaXQsCisJCUFERTc3NTRfQ0ZERU4pOworc3RhdGljIElJT19ERVZfQVRUUl9BQ1RJVkVfUE9XRVJfQV9HQUlOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU0X3JlYWRfMTZiaXQsCisJCWFkZTc3NTRfd3JpdGVfMTZiaXQsCisJCUFERTc3NTRfQUFQR0FJTik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FDVElWRV9QT1dFUl9CX0dBSU4oU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTRfcmVhZF8xNmJpdCwKKwkJYWRlNzc1NF93cml0ZV8xNmJpdCwKKwkJQURFNzc1NF9CQVBHQUlOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQUNUSVZFX1BPV0VSX0NfR0FJTihTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1NF9yZWFkXzE2Yml0LAorCQlhZGU3NzU0X3dyaXRlXzE2Yml0LAorCQlBREU3NzU0X0NBUEdBSU4pOworc3RhdGljIElJT19ERVZfQVRUUl9BSVJNUyhTX0lSVUdPLAorCQlhZGU3NzU0X3JlYWRfMjRiaXQsCisJCU5VTEwsCisJCUFERTc3NTRfQUlSTVMpOworc3RhdGljIElJT19ERVZfQVRUUl9CSVJNUyhTX0lSVUdPLAorCQlhZGU3NzU0X3JlYWRfMjRiaXQsCisJCU5VTEwsCisJCUFERTc3NTRfQklSTVMpOworc3RhdGljIElJT19ERVZfQVRUUl9DSVJNUyhTX0lSVUdPLAorCQlhZGU3NzU0X3JlYWRfMjRiaXQsCisJCU5VTEwsCisJCUFERTc3NTRfQ0lSTVMpOworc3RhdGljIElJT19ERVZfQVRUUl9BVlJNUyhTX0lSVUdPLAorCQlhZGU3NzU0X3JlYWRfMjRiaXQsCisJCU5VTEwsCisJCUFERTc3NTRfQVZSTVMpOworc3RhdGljIElJT19ERVZfQVRUUl9CVlJNUyhTX0lSVUdPLAorCQlhZGU3NzU0X3JlYWRfMjRiaXQsCisJCU5VTEwsCisJCUFERTc3NTRfQlZSTVMpOworc3RhdGljIElJT19ERVZfQVRUUl9DVlJNUyhTX0lSVUdPLAorCQlhZGU3NzU0X3JlYWRfMjRiaXQsCisJCU5VTEwsCisJCUFERTc3NTRfQ1ZSTVMpOworc3RhdGljIElJT19ERVZfQVRUUl9BSVJNU09TKFNfSVJVR08sCisJCWFkZTc3NTRfcmVhZF8xNmJpdCwKKwkJYWRlNzc1NF93cml0ZV8xNmJpdCwKKwkJQURFNzc1NF9BSVJNU09TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQklSTVNPUyhTX0lSVUdPLAorCQlhZGU3NzU0X3JlYWRfMTZiaXQsCisJCWFkZTc3NTRfd3JpdGVfMTZiaXQsCisJCUFERTc3NTRfQklSTVNPUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0NJUk1TT1MoU19JUlVHTywKKwkJYWRlNzc1NF9yZWFkXzE2Yml0LAorCQlhZGU3NzU0X3dyaXRlXzE2Yml0LAorCQlBREU3NzU0X0NJUk1TT1MpOworc3RhdGljIElJT19ERVZfQVRUUl9BVlJNU09TKFNfSVJVR08sCisJCWFkZTc3NTRfcmVhZF8xNmJpdCwKKwkJYWRlNzc1NF93cml0ZV8xNmJpdCwKKwkJQURFNzc1NF9BVlJNU09TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQlZSTVNPUyhTX0lSVUdPLAorCQlhZGU3NzU0X3JlYWRfMTZiaXQsCisJCWFkZTc3NTRfd3JpdGVfMTZiaXQsCisJCUFERTc3NTRfQlZSTVNPUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0NWUk1TT1MoU19JUlVHTywKKwkJYWRlNzc1NF9yZWFkXzE2Yml0LAorCQlhZGU3NzU0X3dyaXRlXzE2Yml0LAorCQlBREU3NzU0X0NWUk1TT1MpOworCitzdGF0aWMgaW50IGFkZTc3NTRfc2V0X2lycShzdHJ1Y3QgZGV2aWNlICpkZXYsIGJvb2wgZW5hYmxlKQoreworCWludCByZXQ7CisJdTE2IGlycWVuOworCXJldCA9IGFkZTc3NTRfc3BpX3JlYWRfcmVnXzE2KGRldiwgQURFNzc1NF9JUlFFTiwgJmlycWVuKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCWlmIChlbmFibGUpCisJCWlycWVuIHw9IDEgPDwgMTQ7IC8qIEVuYWJsZXMgYW4gaW50ZXJydXB0IHdoZW4gYSBkYXRhIGlzCisJCQkJICAgICBwcmVzZW50IGluIHRoZSB3YXZlZm9ybSByZWdpc3RlciAqLworCWVsc2UKKwkJaXJxZW4gJj0gfigxIDw8IDE0KTsKKworCXJldCA9IGFkZTc3NTRfc3BpX3dyaXRlX3JlZ18xNihkZXYsIEFERTc3NTRfSVJRRU4sIGlycWVuKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKKy8qIFBvd2VyIGRvd24gdGhlIGRldmljZSAqLworc3RhdGljIGludCBhZGU3NzU0X3N0b3BfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0OworCXU4IHZhbDsKKwlhZGU3NzU0X3NwaV9yZWFkX3JlZ184KGRldiwKKwkJCUFERTc3NTRfT1BNT0RFLAorCQkJJnZhbCk7CisJdmFsIHw9IDcgPDwgMzsgIC8qIEFERTc3NTQgcG93ZXJlZCBkb3duICovCisJcmV0ID0gYWRlNzc1NF9zcGlfd3JpdGVfcmVnXzgoZGV2LAorCQkJQURFNzc1NF9PUE1PREUsCisJCQl2YWwpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3NzU0X2luaXRpYWxfc2V0dXAoc3RydWN0IGFkZTc3NTRfc3RhdGUgKnN0KQoreworCWludCByZXQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnN0LT5pbmRpb19kZXYtPmRldjsKKworCS8qIHVzZSBsb3cgc3BpIHNwZWVkIGZvciBpbml0ICovCisJc3QtPnVzLT5tb2RlID0gU1BJX01PREVfMzsKKwlzcGlfc2V0dXAoc3QtPnVzKTsKKworCS8qIERpc2FibGUgSVJRICovCisJcmV0ID0gYWRlNzc1NF9zZXRfaXJxKGRldiwgZmFsc2UpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJkaXNhYmxlIGlycSBmYWlsZWQiKTsKKwkJZ290byBlcnJfcmV0OworCX0KKworCWFkZTc3NTRfcmVzZXQoZGV2KTsKKwltc2xlZXAoQURFNzc1NF9TVEFSVFVQX0RFTEFZKTsKKworZXJyX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZGU3NzU0X3JlYWRfZnJlcXVlbmN5KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0LCBsZW4gPSAwOworCXU4IHQ7CisJaW50IHNwczsKKwlyZXQgPSBhZGU3NzU0X3NwaV9yZWFkX3JlZ184KGRldiwKKwkJCUFERTc3NTRfV0FWTU9ERSwKKwkJCSZ0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJdCA9ICh0ID4+IDMpICYgMHgzOworCXNwcyA9IDI2MDAwIC8gKDEgKyB0KTsKKworCWxlbiA9IHNwcmludGYoYnVmLCAiJWQgU1BTXG4iLCBzcHMpOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkZTc3NTRfd3JpdGVfZnJlcXVlbmN5KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkZTc3NTRfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCByZXQ7CisJdTggcmVnLCB0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisKKwl0ID0gKDI2MDAwIC8gdmFsKTsKKwlpZiAodCA+IDApCisJCXQtLTsKKworCWlmICh0ID4gMSkKKwkJc3QtPnVzLT5tYXhfc3BlZWRfaHogPSBBREU3NzU0X1NQSV9TTE9XOworCWVsc2UKKwkJc3QtPnVzLT5tYXhfc3BlZWRfaHogPSBBREU3NzU0X1NQSV9GQVNUOworCisJcmV0ID0gYWRlNzc1NF9zcGlfcmVhZF9yZWdfOChkZXYsCisJCQlBREU3NzU0X1dBVk1PREUsCisJCQkmcmVnKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJlZyAmPSB+KDMgPDwgMyk7CisJcmVnIHw9IHQgPDwgMzsKKworCXJldCA9IGFkZTc3NTRfc3BpX3dyaXRlX3JlZ184KGRldiwKKwkJCUFERTc3NTRfV0FWTU9ERSwKKwkJCXJlZyk7CisKK291dDoKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KK3N0YXRpYyBJSU9fREVWX0FUVFJfVEVNUF9SQVcoYWRlNzc1NF9yZWFkXzhiaXQpOworc3RhdGljIElJT19DT05TVF9BVFRSKHRlbXBfb2Zmc2V0LCAiMTI5IEMiKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUih0ZW1wX3NjYWxlLCAiNCBDIik7CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfU0FNUF9GUkVRKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU0X3JlYWRfZnJlcXVlbmN5LAorCQlhZGU3NzU0X3dyaXRlX2ZyZXF1ZW5jeSk7CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfUkVTRVQoYWRlNzc1NF93cml0ZV9yZXNldCk7CisKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUl9TQU1QX0ZSRVFfQVZBSUwoIjI2MDAwIDEzMDAwIDY1MDAwIDMzMDAwIik7CisKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihuYW1lLCAiYWRlNzc1NCIpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRlNzc1NF9ldmVudF9hdHRyaWJ1dGVzW10gPSB7CisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWRlNzc1NF9ldmVudF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWRlNzc1NF9ldmVudF9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkZTc3NTRfYXR0cmlidXRlc1tdID0geworCSZpaW9fZGV2X2F0dHJfdGVtcF9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfdGVtcF9vZmZzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfdGVtcF9zY2FsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfc2FtcGxpbmdfZnJlcXVlbmN5LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX3NhbXBsaW5nX2ZyZXF1ZW5jeV9hdmFpbGFibGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3Jlc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX25hbWUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FlbmVyZ3kuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2xhZW5lcmd5LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl92YWVuZXJneS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbHZhZW5lcmd5LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl92cGVhay5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaXBlYWsuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FwaGNhbC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYnBoY2FsLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jcGhjYWwuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FhcG9zLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9iYXBvcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2Fwb3MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3dkaXYuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3ZhZGl2LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jZm51bS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2ZkZW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FjdGl2ZV9wb3dlcl9hX2dhaW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FjdGl2ZV9wb3dlcl9iX2dhaW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FjdGl2ZV9wb3dlcl9jX2dhaW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2Fpcm1zLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9iaXJtcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2lybXMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2F2cm1zLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9idnJtcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY3ZybXMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2Fpcm1zb3MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2Jpcm1zb3MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2Npcm1zb3MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2F2cm1zb3MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2J2cm1zb3MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2N2cm1zb3MuZGV2X2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWRlNzc1NF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWRlNzc1NF9hdHRyaWJ1dGVzLAorfTsKKworCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkZTc3NTRfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlpbnQgcmV0LCByZWdkb25lID0gMDsKKwlzdHJ1Y3QgYWRlNzc1NF9zdGF0ZSAqc3QgPSBremFsbG9jKHNpemVvZiAqc3QsIEdGUF9LRVJORUwpOworCWlmICghc3QpIHsKKwkJcmV0ID0gIC1FTk9NRU07CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwkvKiB0aGlzIGlzIG9ubHkgdXNlZCBmb3IgcmVtb3ZhbCBwdXJwb3NlcyAqLworCXNwaV9zZXRfZHJ2ZGF0YShzcGksIHN0KTsKKworCS8qIEFsbG9jYXRlIHRoZSBjb21tcyBidWZmZXJzICovCisJc3QtPnJ4ID0ga3phbGxvYyhzaXplb2YoKnN0LT5yeCkqQURFNzc1NF9NQVhfUlgsIEdGUF9LRVJORUwpOworCWlmIChzdC0+cnggPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfc3Q7CisJfQorCXN0LT50eCA9IGt6YWxsb2Moc2l6ZW9mKCpzdC0+dHgpKkFERTc3NTRfTUFYX1RYLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QtPnR4ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3J4OworCX0KKwlzdC0+dXMgPSBzcGk7CisJbXV0ZXhfaW5pdCgmc3QtPmJ1Zl9sb2NrKTsKKwkvKiBzZXR1cCB0aGUgaW5kdXN0cmlhbGlvIGRyaXZlciBhbGxvY2F0ZWQgZWxlbWVudHMgKi8KKwlzdC0+aW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChzdC0+aW5kaW9fZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3R4OworCX0KKworCXN0LT5pbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmc3BpLT5kZXY7CisJc3QtPmluZGlvX2Rldi0+bnVtX2ludGVycnVwdF9saW5lcyA9IDE7CisJc3QtPmluZGlvX2Rldi0+ZXZlbnRfYXR0cnMgPSAmYWRlNzc1NF9ldmVudF9hdHRyaWJ1dGVfZ3JvdXA7CisJc3QtPmluZGlvX2Rldi0+YXR0cnMgPSAmYWRlNzc1NF9hdHRyaWJ1dGVfZ3JvdXA7CisJc3QtPmluZGlvX2Rldi0+ZGV2X2RhdGEgPSAodm9pZCAqKShzdCk7CisJc3QtPmluZGlvX2Rldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCXN0LT5pbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwlyZXQgPSBhZGU3NzU0X2NvbmZpZ3VyZV9yaW5nKHN0LT5pbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKHN0LT5pbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfdW5yZWdfcmluZ19mdW5jczsKKwlyZWdkb25lID0gMTsKKworCXJldCA9IGFkZTc3NTRfaW5pdGlhbGl6ZV9yaW5nKHN0LT5pbmRpb19kZXYtPnJpbmcpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcmluZ1xuIik7CisJCWdvdG8gZXJyb3JfdW5yZWdfcmluZ19mdW5jczsKKwl9CisKKwlpZiAoc3BpLT5pcnEpIHsKKwkJcmV0ID0gaWlvX3JlZ2lzdGVyX2ludGVycnVwdF9saW5lKHNwaS0+aXJxLAorCQkJCXN0LT5pbmRpb19kZXYsCisJCQkJMCwKKwkJCQlJUlFGX1RSSUdHRVJfRkFMTElORywKKwkJCQkiYWRlNzc1NCIpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl91bmluaXRpYWxpemVfcmluZzsKKworCQlyZXQgPSBhZGU3NzU0X3Byb2JlX3RyaWdnZXIoc3QtPmluZGlvX2Rldik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3VucmVnaXN0ZXJfbGluZTsKKwl9CisKKwkvKiBHZXQgdGhlIGRldmljZSBpbnRvIGEgc2FuZSBpbml0aWFsIHN0YXRlICovCisJcmV0ID0gYWRlNzc1NF9pbml0aWFsX3NldHVwKHN0KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JlbW92ZV90cmlnZ2VyOworCXJldHVybiAwOworCitlcnJvcl9yZW1vdmVfdHJpZ2dlcjoKKwlpZiAoc3QtPmluZGlvX2Rldi0+bW9kZXMgJiBJTkRJT19SSU5HX1RSSUdHRVJFRCkKKwkJYWRlNzc1NF9yZW1vdmVfdHJpZ2dlcihzdC0+aW5kaW9fZGV2KTsKK2Vycm9yX3VucmVnaXN0ZXJfbGluZToKKwlpZiAoc3QtPmluZGlvX2Rldi0+bW9kZXMgJiBJTkRJT19SSU5HX1RSSUdHRVJFRCkKKwkJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoc3QtPmluZGlvX2RldiwgMCk7CitlcnJvcl91bmluaXRpYWxpemVfcmluZzoKKwlhZGU3NzU0X3VuaW5pdGlhbGl6ZV9yaW5nKHN0LT5pbmRpb19kZXYtPnJpbmcpOworZXJyb3JfdW5yZWdfcmluZ19mdW5jczoKKwlhZGU3NzU0X3VuY29uZmlndXJlX3Jpbmcoc3QtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX2RldjoKKwlpZiAocmVnZG9uZSkKKwkJaWlvX2RldmljZV91bnJlZ2lzdGVyKHN0LT5pbmRpb19kZXYpOworCWVsc2UKKwkJaWlvX2ZyZWVfZGV2aWNlKHN0LT5pbmRpb19kZXYpOworZXJyb3JfZnJlZV90eDoKKwlrZnJlZShzdC0+dHgpOworZXJyb3JfZnJlZV9yeDoKKwlrZnJlZShzdC0+cngpOworZXJyb3JfZnJlZV9zdDoKKwlrZnJlZShzdCk7CitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworLyogZml4bWUsIGNvbmZpcm0gb3JkZXJpbmcgaW4gdGhpcyBmdW5jdGlvbiAqLworc3RhdGljIGludCBhZGU3NzU0X3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWludCByZXQ7CisJc3RydWN0IGFkZTc3NTRfc3RhdGUgKnN0ID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHN0LT5pbmRpb19kZXY7CisKKwlyZXQgPSBhZGU3NzU0X3N0b3BfZGV2aWNlKCYoaW5kaW9fZGV2LT5kZXYpKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9yZXQ7CisKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCisJYWRlNzc1NF9yZW1vdmVfdHJpZ2dlcihpbmRpb19kZXYpOworCWlmIChzcGktPmlycSkKKwkJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoaW5kaW9fZGV2LCAwKTsKKworCWFkZTc3NTRfdW5pbml0aWFsaXplX3JpbmcoaW5kaW9fZGV2LT5yaW5nKTsKKwlhZGU3NzU0X3VuY29uZmlndXJlX3JpbmcoaW5kaW9fZGV2KTsKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlrZnJlZShzdC0+dHgpOworCWtmcmVlKHN0LT5yeCk7CisJa2ZyZWUoc3QpOworCisJcmV0dXJuIDA7CisKK2Vycl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFkZTc3NTRfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFkZTc3NTQiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IGFkZTc3NTRfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFkZTc3NTRfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGFkZTc3NTRfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZhZGU3NzU0X2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChhZGU3NzU0X2luaXQpOworCitzdGF0aWMgX19leGl0IHZvaWQgYWRlNzc1NF9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZGU3NzU0X2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhZGU3NzU0X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJCYXJyeSBTb25nIDwyMWNuYmFvQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQURFNzc1NCBQb2x5cGhhc2UgTXVsdGlmdW5jdGlvbiBFbmVyZ3kgTWV0ZXJpbmcgSUMgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTQuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YTNlNGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTQuaApAQCAtMCwwICsxLDE2MSBAQAorI2lmbmRlZiBfQURFNzc1NF9ICisjZGVmaW5lIF9BREU3NzU0X0gKKworI2RlZmluZSBBREU3NzU0X0FFTkVSR1kgICAweDAxCisjZGVmaW5lIEFERTc3NTRfUkFFTkVSR1kgIDB4MDIKKyNkZWZpbmUgQURFNzc1NF9MQUVORVJHWSAgMHgwMworI2RlZmluZSBBREU3NzU0X1ZBRU5FUkdZICAweDA0CisjZGVmaW5lIEFERTc3NTRfUlZBRU5FUkdZIDB4MDUKKyNkZWZpbmUgQURFNzc1NF9MVkFFTkVSR1kgMHgwNgorI2RlZmluZSBBREU3NzU0X1BFUklPRCAgICAweDA3CisjZGVmaW5lIEFERTc3NTRfVEVNUCAgICAgIDB4MDgKKyNkZWZpbmUgQURFNzc1NF9XRk9STSAgICAgMHgwOQorI2RlZmluZSBBREU3NzU0X09QTU9ERSAgICAweDBBCisjZGVmaW5lIEFERTc3NTRfTU1PREUgICAgIDB4MEIKKyNkZWZpbmUgQURFNzc1NF9XQVZNT0RFICAgMHgwQworI2RlZmluZSBBREU3NzU0X1dBVE1PREUgICAweDBECisjZGVmaW5lIEFERTc3NTRfVkFNT0RFICAgIDB4MEUKKyNkZWZpbmUgQURFNzc1NF9JUlFFTiAgICAgMHgwRgorI2RlZmluZSBBREU3NzU0X1NUQVRVUyAgICAweDEwCisjZGVmaW5lIEFERTc3NTRfUlNUQVRVUyAgIDB4MTEKKyNkZWZpbmUgQURFNzc1NF9aWFRPVVQgICAgMHgxMgorI2RlZmluZSBBREU3NzU0X0xJTkNZQyAgICAweDEzCisjZGVmaW5lIEFERTc3NTRfU0FHQ1lDICAgIDB4MTQKKyNkZWZpbmUgQURFNzc1NF9TQUdMVkwgICAgMHgxNQorI2RlZmluZSBBREU3NzU0X1ZQRUFLICAgICAweDE2CisjZGVmaW5lIEFERTc3NTRfSVBFQUsgICAgIDB4MTcKKyNkZWZpbmUgQURFNzc1NF9HQUlOICAgICAgMHgxOAorI2RlZmluZSBBREU3NzU0X0FXRyAgICAgICAweDE5CisjZGVmaW5lIEFERTc3NTRfQldHICAgICAgIDB4MUEKKyNkZWZpbmUgQURFNzc1NF9DV0cgICAgICAgMHgxQgorI2RlZmluZSBBREU3NzU0X0FWQUcgICAgICAweDFDCisjZGVmaW5lIEFERTc3NTRfQlZBRyAgICAgIDB4MUQKKyNkZWZpbmUgQURFNzc1NF9DVkFHICAgICAgMHgxRQorI2RlZmluZSBBREU3NzU0X0FQSENBTCAgICAweDFGCisjZGVmaW5lIEFERTc3NTRfQlBIQ0FMICAgIDB4MjAKKyNkZWZpbmUgQURFNzc1NF9DUEhDQUwgICAgMHgyMQorI2RlZmluZSBBREU3NzU0X0FBUE9TICAgICAweDIyCisjZGVmaW5lIEFERTc3NTRfQkFQT1MgICAgIDB4MjMKKyNkZWZpbmUgQURFNzc1NF9DQVBPUyAgICAgMHgyNAorI2RlZmluZSBBREU3NzU0X0NGTlVNICAgICAweDI1CisjZGVmaW5lIEFERTc3NTRfQ0ZERU4gICAgIDB4MjYKKyNkZWZpbmUgQURFNzc1NF9XRElWICAgICAgMHgyNworI2RlZmluZSBBREU3NzU0X1ZBRElWICAgICAweDI4CisjZGVmaW5lIEFERTc3NTRfQUlSTVMgICAgIDB4MjkKKyNkZWZpbmUgQURFNzc1NF9CSVJNUyAgICAgMHgyQQorI2RlZmluZSBBREU3NzU0X0NJUk1TICAgICAweDJCCisjZGVmaW5lIEFERTc3NTRfQVZSTVMgICAgIDB4MkMKKyNkZWZpbmUgQURFNzc1NF9CVlJNUyAgICAgMHgyRAorI2RlZmluZSBBREU3NzU0X0NWUk1TICAgICAweDJFCisjZGVmaW5lIEFERTc3NTRfQUlSTVNPUyAgIDB4MkYKKyNkZWZpbmUgQURFNzc1NF9CSVJNU09TICAgMHgzMAorI2RlZmluZSBBREU3NzU0X0NJUk1TT1MgICAweDMxCisjZGVmaW5lIEFERTc3NTRfQVZSTVNPUyAgIDB4MzIKKyNkZWZpbmUgQURFNzc1NF9CVlJNU09TICAgMHgzMworI2RlZmluZSBBREU3NzU0X0NWUk1TT1MgICAweDM0CisjZGVmaW5lIEFERTc3NTRfQUFQR0FJTiAgIDB4MzUKKyNkZWZpbmUgQURFNzc1NF9CQVBHQUlOICAgMHgzNgorI2RlZmluZSBBREU3NzU0X0NBUEdBSU4gICAweDM3CisjZGVmaW5lIEFERTc3NTRfQVZHQUlOICAgIDB4MzgKKyNkZWZpbmUgQURFNzc1NF9CVkdBSU4gICAgMHgzOQorI2RlZmluZSBBREU3NzU0X0NWR0FJTiAgICAweDNBCisjZGVmaW5lIEFERTc3NTRfQ0hLU1VNICAgIDB4M0UKKyNkZWZpbmUgQURFNzc1NF9WRVJTSU9OICAgMHgzRgorCisjZGVmaW5lIEFERTc3NTRfUkVBRF9SRUcoYSkgICAgYQorI2RlZmluZSBBREU3NzU0X1dSSVRFX1JFRyhhKSAoKGEpIHwgMHg4MCkKKworI2RlZmluZSBBREU3NzU0X01BWF9UWCAgICA0CisjZGVmaW5lIEFERTc3NTRfTUFYX1JYICAgIDQKKyNkZWZpbmUgQURFNzc1NF9TVEFSVFVQX0RFTEFZIDEKKworI2RlZmluZSBBREU3NzU0X1NQSV9TTE9XCSh1MzIpKDMwMCAqIDEwMDApCisjZGVmaW5lIEFERTc3NTRfU1BJX0JVUlNUCSh1MzIpKDEwMDAgKiAxMDAwKQorI2RlZmluZSBBREU3NzU0X1NQSV9GQVNUCSh1MzIpKDIwMDAgKiAxMDAwKQorCisjZGVmaW5lIERSSVZFUl9OQU1FCQkiYWRlNzc1NCIKKworLyoqCisgKiBzdHJ1Y3QgYWRlNzc1NF9zdGF0ZSAtIGRldmljZSBpbnN0YW5jZSBzcGVjaWZpYyBkYXRhCisgKiBAdXM6CQkJYWN0dWFsIHNwaV9kZXZpY2UKKyAqIEB3b3JrX3RyaWdnZXJfdG9fcmluZzogYmggZm9yIHRyaWdnZXJlZCBldmVudCBoYW5kbGluZworICogQGludGVyOgkJdXNlZCB0byBjaGVjayBpZiBuZXcgaW50ZXJydXB0IGhhcyBiZWVuIHRyaWdnZXJlZAorICogQGxhc3RfdGltZXN0YW1wOglwYXNzaW5nIHRpbWVzdGFtcCBmcm9tIHRoIHRvIGJoIG9mIGludGVycnVwdCBoYW5kbGVyCisgKiBAaW5kaW9fZGV2OgkJaW5kdXN0cmlhbCBJL08gZGV2aWNlIHN0cnVjdHVyZQorICogQHRyaWc6CQlkYXRhIHJlYWR5IHRyaWdnZXIgcmVnaXN0ZXJlZCB3aXRoIGlpbworICogQHR4OgkJCXRyYW5zbWl0IGJ1ZmZlcgorICogQHJ4OgkJCXJlY2lldmUgYnVmZmVyCisgKiBAYnVmX2xvY2s6CQltdXRleCB0byBwcm90ZWN0IHR4IGFuZCByeAorICoqLworc3RydWN0IGFkZTc3NTRfc3RhdGUgeworCXN0cnVjdCBzcGlfZGV2aWNlCQkqdXM7CisJc3RydWN0IHdvcmtfc3RydWN0CQl3b3JrX3RyaWdnZXJfdG9fcmluZzsKKwlzNjQJCQkJbGFzdF90aW1lc3RhbXA7CisJc3RydWN0IGlpb19kZXYJCQkqaW5kaW9fZGV2OworCXN0cnVjdCBpaW9fdHJpZ2dlcgkJKnRyaWc7CisJdTgJCQkJKnR4OworCXU4CQkJCSpyeDsKKwlzdHJ1Y3QgbXV0ZXgJCQlidWZfbG9jazsKK307CisjaWYgZGVmaW5lZChDT05GSUdfSUlPX1JJTkdfQlVGRkVSKSAmJiBkZWZpbmVkKFRISVNfSEFTX1JJTkdfQlVGRkVSX1NVUFBPUlQpCisvKiBBdCB0aGUgbW9tZW50IHRyaWdnZXJzIGFyZSBvbmx5IHVzZWQgZm9yIHJpbmcgYnVmZmVyCisgKiBmaWxsaW5nLiBUaGlzIG1heSBjaGFuZ2UhCisgKi8KKworZW51bSBhZGU3NzU0X3NjYW4geworCUFERTc3NTRfU0NBTl9QSEFfViwKKwlBREU3NzU0X1NDQU5fUEhCX1YsCisJQURFNzc1NF9TQ0FOX1BIQ19WLAorCUFERTc3NTRfU0NBTl9QSEFfSSwKKwlBREU3NzU0X1NDQU5fUEhCX0ksCisJQURFNzc1NF9TQ0FOX1BIQ19JLAorfTsKKwordm9pZCBhZGU3NzU0X3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOworaW50IGFkZTc3NTRfcHJvYmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKKworc3NpemVfdCBhZGU3NzU0X3JlYWRfZGF0YV9mcm9tX3Jpbmcoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgIGNoYXIgKmJ1Zik7CisKKworaW50IGFkZTc3NTRfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7Cit2b2lkIGFkZTc3NTRfdW5jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKKworaW50IGFkZTc3NTRfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpOwordm9pZCBhZGU3NzU0X3VuaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpOworI2Vsc2UgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgYWRlNzc1NF9yZW1vdmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworfQorc3RhdGljIGlubGluZSBpbnQgYWRlNzc1NF9wcm9iZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdAorYWRlNzc1NF9yZWFkX2RhdGFfZnJvbV9yaW5nKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICAgY2hhciAqYnVmKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkZTc3NTRfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGU3NzU0X3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKK30KK3N0YXRpYyBpbmxpbmUgaW50IGFkZTc3NTRfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgYWRlNzc1NF91bmluaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQoreworfQorI2VuZGlmIC8qIENPTkZJR19JSU9fUklOR19CVUZGRVIgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTguaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNWJiN2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTguaApAQCAtMCwwICsxLDE3MSBAQAorI2lmbmRlZiBfQURFNzc1OF9ICisjZGVmaW5lIF9BREU3NzU4X0gKKworI2RlZmluZSBBREU3NzU4X0FXQVRUSFIgICAweDAxCisjZGVmaW5lIEFERTc3NThfQldBVFRIUiAgIDB4MDIKKyNkZWZpbmUgQURFNzc1OF9DV0FUVEhSICAgMHgwMworI2RlZmluZSBBREU3NzU4X0FWQVJIUiAgICAweDA0CisjZGVmaW5lIEFERTc3NThfQlZBUkhSICAgIDB4MDUKKyNkZWZpbmUgQURFNzc1OF9DVkFSSFIgICAgMHgwNgorI2RlZmluZSBBREU3NzU4X0FWQUhSICAgICAweDA3CisjZGVmaW5lIEFERTc3NThfQlZBSFIgICAgIDB4MDgKKyNkZWZpbmUgQURFNzc1OF9DVkFIUiAgICAgMHgwOQorI2RlZmluZSBBREU3NzU4X0FJUk1TICAgICAweDBBCisjZGVmaW5lIEFERTc3NThfQklSTVMgICAgIDB4MEIKKyNkZWZpbmUgQURFNzc1OF9DSVJNUyAgICAgMHgwQworI2RlZmluZSBBREU3NzU4X0FWUk1TICAgICAweDBECisjZGVmaW5lIEFERTc3NThfQlZSTVMgICAgIDB4MEUKKyNkZWZpbmUgQURFNzc1OF9DVlJNUyAgICAgMHgwRgorI2RlZmluZSBBREU3NzU4X0ZSRVEgICAgICAweDEwCisjZGVmaW5lIEFERTc3NThfVEVNUCAgICAgIDB4MTEKKyNkZWZpbmUgQURFNzc1OF9XRk9STSAgICAgMHgxMgorI2RlZmluZSBBREU3NzU4X09QTU9ERSAgICAweDEzCisjZGVmaW5lIEFERTc3NThfTU1PREUgICAgIDB4MTQKKyNkZWZpbmUgQURFNzc1OF9XQVZNT0RFICAgMHgxNQorI2RlZmluZSBBREU3NzU4X0NPTVBNT0RFICAweDE2CisjZGVmaW5lIEFERTc3NThfTENZQ01PREUgIDB4MTcKKyNkZWZpbmUgQURFNzc1OF9NQVNLICAgICAgMHgxOAorI2RlZmluZSBBREU3NzU4X1NUQVRVUyAgICAweDE5CisjZGVmaW5lIEFERTc3NThfUlNUQVRVUyAgIDB4MUEKKyNkZWZpbmUgQURFNzc1OF9aWFRPVVQgICAgMHgxQgorI2RlZmluZSBBREU3NzU4X0xJTkVDWUMgICAweDFDCisjZGVmaW5lIEFERTc3NThfU0FHQ1lDICAgIDB4MUQKKyNkZWZpbmUgQURFNzc1OF9TQUdMVkwgICAgMHgxRQorI2RlZmluZSBBREU3NzU4X1ZQSU5UTFZMICAweDFGCisjZGVmaW5lIEFERTc3NThfSVBJTlRMVkwgIDB4MjAKKyNkZWZpbmUgQURFNzc1OF9WUEVBSyAgICAgMHgyMQorI2RlZmluZSBBREU3NzU4X0lQRUFLICAgICAweDIyCisjZGVmaW5lIEFERTc3NThfR0FJTiAgICAgIDB4MjMKKyNkZWZpbmUgQURFNzc1OF9BVlJNU0dBSU4gMHgyNAorI2RlZmluZSBBREU3NzU4X0JWUk1TR0FJTiAweDI1CisjZGVmaW5lIEFERTc3NThfQ1ZSTVNHQUlOIDB4MjYKKyNkZWZpbmUgQURFNzc1OF9BSUdBSU4gICAgMHgyNworI2RlZmluZSBBREU3NzU4X0JJR0FJTiAgICAweDI4CisjZGVmaW5lIEFERTc3NThfQ0lHQUlOICAgIDB4MjkKKyNkZWZpbmUgQURFNzc1OF9BV0cgICAgICAgMHgyQQorI2RlZmluZSBBREU3NzU4X0JXRyAgICAgICAweDJCCisjZGVmaW5lIEFERTc3NThfQ1dHICAgICAgIDB4MkMKKyNkZWZpbmUgQURFNzc1OF9BVkFSRyAgICAgMHgyRAorI2RlZmluZSBBREU3NzU4X0JWQVJHICAgICAweDJFCisjZGVmaW5lIEFERTc3NThfQ1ZBUkcgICAgIDB4MkYKKyNkZWZpbmUgQURFNzc1OF9BVkFHICAgICAgMHgzMAorI2RlZmluZSBBREU3NzU4X0JWQUcgICAgICAweDMxCisjZGVmaW5lIEFERTc3NThfQ1ZBRyAgICAgIDB4MzIKKyNkZWZpbmUgQURFNzc1OF9BVlJNU09TICAgMHgzMworI2RlZmluZSBBREU3NzU4X0JWUk1TT1MgICAweDM0CisjZGVmaW5lIEFERTc3NThfQ1ZSTVNPUyAgIDB4MzUKKyNkZWZpbmUgQURFNzc1OF9BSVJNU09TICAgMHgzNgorI2RlZmluZSBBREU3NzU4X0JJUk1TT1MgICAweDM3CisjZGVmaW5lIEFERTc3NThfQ0lSTVNPUyAgIDB4MzgKKyNkZWZpbmUgQURFNzc1OF9BV0FJVE9TICAgMHgzOQorI2RlZmluZSBBREU3NzU4X0JXQUlUT1MgICAweDNBCisjZGVmaW5lIEFERTc3NThfQ1dBSVRPUyAgIDB4M0IKKyNkZWZpbmUgQURFNzc1OF9BVkFST1MgICAgMHgzQworI2RlZmluZSBBREU3NzU4X0JWQVJPUyAgICAweDNECisjZGVmaW5lIEFERTc3NThfQ1ZBUk9TICAgIDB4M0UKKyNkZWZpbmUgQURFNzc1OF9BUEhDQUwgICAgMHgzRgorI2RlZmluZSBBREU3NzU4X0JQSENBTCAgICAweDQwCisjZGVmaW5lIEFERTc3NThfQ1BIQ0FMICAgIDB4NDEKKyNkZWZpbmUgQURFNzc1OF9XRElWICAgICAgMHg0MgorI2RlZmluZSBBREU3NzU4X1ZBRElWICAgICAweDQ0CisjZGVmaW5lIEFERTc3NThfVkFSRElWICAgIDB4NDMKKyNkZWZpbmUgQURFNzc1OF9BUENGTlVNICAgMHg0NQorI2RlZmluZSBBREU3NzU4X0FQQ0ZERU4gICAweDQ2CisjZGVmaW5lIEFERTc3NThfVkFSQ0ZOVU0gIDB4NDcKKyNkZWZpbmUgQURFNzc1OF9WQVJDRkRFTiAgMHg0OAorI2RlZmluZSBBREU3NzU4X0NIS1NVTSAgICAweDdFCisjZGVmaW5lIEFERTc3NThfVkVSU0lPTiAgIDB4N0YKKworI2RlZmluZSBBREU3NzU4X1JFQURfUkVHKGEpICAgIGEKKyNkZWZpbmUgQURFNzc1OF9XUklURV9SRUcoYSkgKChhKSB8IDB4ODApCisKKyNkZWZpbmUgQURFNzc1OF9NQVhfVFggICAgOAorI2RlZmluZSBBREU3NzU4X01BWF9SWCAgICA0CisjZGVmaW5lIEFERTc3NThfU1RBUlRVUF9ERUxBWSAxCisKKyNkZWZpbmUgQURFNzc1OF9TUElfU0xPVwkodTMyKSgzMDAgKiAxMDAwKQorI2RlZmluZSBBREU3NzU4X1NQSV9CVVJTVAkodTMyKSgxMDAwICogMTAwMCkKKyNkZWZpbmUgQURFNzc1OF9TUElfRkFTVAkodTMyKSgyMDAwICogMTAwMCkKKworI2RlZmluZSBEUklWRVJfTkFNRQkJImFkZTc3NTgiCisKKy8qKgorICogc3RydWN0IGFkZTc3NThfc3RhdGUgLSBkZXZpY2UgaW5zdGFuY2Ugc3BlY2lmaWMgZGF0YQorICogQHVzOgkJCWFjdHVhbCBzcGlfZGV2aWNlCisgKiBAd29ya190cmlnZ2VyX3RvX3Jpbmc6IGJoIGZvciB0cmlnZ2VyZWQgZXZlbnQgaGFuZGxpbmcKKyAqIEBpbnRlcjoJCXVzZWQgdG8gY2hlY2sgaWYgbmV3IGludGVycnVwdCBoYXMgYmVlbiB0cmlnZ2VyZWQKKyAqIEBsYXN0X3RpbWVzdGFtcDoJcGFzc2luZyB0aW1lc3RhbXAgZnJvbSB0aCB0byBiaCBvZiBpbnRlcnJ1cHQgaGFuZGxlcgorICogQGluZGlvX2RldjoJCWluZHVzdHJpYWwgSS9PIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEB0cmlnOgkJZGF0YSByZWFkeSB0cmlnZ2VyIHJlZ2lzdGVyZWQgd2l0aCBpaW8KKyAqIEB0eDoJCQl0cmFuc21pdCBidWZmZXIKKyAqIEByeDoJCQlyZWNpZXZlIGJ1ZmZlcgorICogQGJ1Zl9sb2NrOgkJbXV0ZXggdG8gcHJvdGVjdCB0eCBhbmQgcngKKyAqKi8KK3N0cnVjdCBhZGU3NzU4X3N0YXRlIHsKKwlzdHJ1Y3Qgc3BpX2RldmljZQkJKnVzOworCXN0cnVjdCB3b3JrX3N0cnVjdAkJd29ya190cmlnZ2VyX3RvX3Jpbmc7CisJczY0CQkJCWxhc3RfdGltZXN0YW1wOworCXN0cnVjdCBpaW9fZGV2CQkJKmluZGlvX2RldjsKKwlzdHJ1Y3QgaWlvX3RyaWdnZXIJCSp0cmlnOworCXU4CQkJCSp0eDsKKwl1OAkJCQkqcng7CisJc3RydWN0IG11dGV4CQkJYnVmX2xvY2s7Cit9OworI2lmZGVmIENPTkZJR19JSU9fUklOR19CVUZGRVIKKy8qIEF0IHRoZSBtb21lbnQgdHJpZ2dlcnMgYXJlIG9ubHkgdXNlZCBmb3IgcmluZyBidWZmZXIKKyAqIGZpbGxpbmcuIFRoaXMgbWF5IGNoYW5nZSEKKyAqLworCitlbnVtIGFkZTc3NThfc2NhbiB7CisJQURFNzc1OF9TQ0FOX1dGT1JNLAorfTsKKwordm9pZCBhZGU3NzU4X3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOworaW50IGFkZTc3NThfcHJvYmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKKworc3NpemVfdCBhZGU3NzU4X3JlYWRfZGF0YV9mcm9tX3Jpbmcoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKTsKKworCitpbnQgYWRlNzc1OF9jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKK3ZvaWQgYWRlNzc1OF91bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOworCitpbnQgYWRlNzc1OF9pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7Cit2b2lkIGFkZTc3NThfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7CitpbnQgYWRlNzc1OF9zZXRfaXJxKHN0cnVjdCBkZXZpY2UgKmRldiwgYm9vbCBlbmFibGUpOworI2Vsc2UgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgYWRlNzc1OF9yZW1vdmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworfQorc3RhdGljIGlubGluZSBpbnQgYWRlNzc1OF9wcm9iZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdAorYWRlNzc1OF9yZWFkX2RhdGFfZnJvbV9yaW5nKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGU3NzU4X2NvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgYWRlNzc1OF91bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7Cit9CitzdGF0aWMgaW5saW5lIGludCBhZGU3NzU4X2luaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQoreworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSB2b2lkIGFkZTc3NThfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKK3sKK30KKyNlbmRpZiAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU4X2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OF9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc2MzRjYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OF9jb3JlLmMKQEAgLTAsMCArMSw4NjYgQEAKKy8qCisgKiBBREU3NzU4IFBvbHlwaGFzZSBNdWx0aWZ1bmN0aW9uIEVuZXJneSBNZXRlcmluZyBJQyBEcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorI2luY2x1ZGUgIm1ldGVyLmgiCisjaW5jbHVkZSAiYWRlNzc1OC5oIgorCitpbnQgYWRlNzc1OF9zcGlfd3JpdGVfcmVnXzgoc3RydWN0IGRldmljZSAqZGV2LAorCQl1OCByZWdfYWRkcmVzcywKKwkJdTggdmFsKQoreworCWludCByZXQ7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3NzU4X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURFNzc1OF9XUklURV9SRUcocmVnX2FkZHJlc3MpOworCXN0LT50eFsxXSA9IHZhbDsKKworCXJldCA9IHNwaV93cml0ZShzdC0+dXMsIHN0LT50eCwgMik7CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3NzU4X3NwaV93cml0ZV9yZWdfMTYoc3RydWN0IGRldmljZSAqZGV2LAorCQl1OCByZWdfYWRkcmVzcywKKwkJdTE2IHZhbHVlKQoreworCWludCByZXQ7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkZTc3NThfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbXSA9IHsKKwkJeworCQkJLnR4X2J1ZiA9IHN0LT50eCwKKwkJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJCS5sZW4gPSAzLAorCQl9CisJfTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURFNzc1OF9XUklURV9SRUcocmVnX2FkZHJlc3MpOworCXN0LT50eFsxXSA9ICh2YWx1ZSA+PiA4KSAmIDB4RkY7CisJc3QtPnR4WzJdID0gdmFsdWUgJiAweEZGOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCh4ZmVycywgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnVzLCAmbXNnKTsKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkZTc3NThfc3BpX3dyaXRlX3JlZ18yNChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXU4IHJlZ19hZGRyZXNzLAorCQl1MzIgdmFsdWUpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzc1OF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyc1tdID0geworCQl7CisJCQkudHhfYnVmID0gc3QtPnR4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDQsCisJCX0KKwl9OworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSBBREU3NzU4X1dSSVRFX1JFRyhyZWdfYWRkcmVzcyk7CisJc3QtPnR4WzFdID0gKHZhbHVlID4+IDE2KSAmIDB4RkY7CisJc3QtPnR4WzJdID0gKHZhbHVlID4+IDgpICYgMHhGRjsKKwlzdC0+dHhbM10gPSB2YWx1ZSAmIDB4RkY7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKHhmZXJzLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+dXMsICZtc2cpOworCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRlNzc1OF9zcGlfcmVhZF9yZWdfOChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXU4IHJlZ19hZGRyZXNzLAorCQl1OCAqdmFsKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3NzU4X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbXSA9IHsKKwkJeworCQkJLnR4X2J1ZiA9IHN0LT50eCwKKwkJCS5yeF9idWYgPSBzdC0+cngsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gMiwKKwkJfSwKKwl9OworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSBBREU3NzU4X1JFQURfUkVHKHJlZ19hZGRyZXNzKTsKKwlzdC0+dHhbMV0gPSAwOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCh4ZmVycywgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnVzLCAmbXNnKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnN0LT51cy0+ZGV2LCAicHJvYmxlbSB3aGVuIHJlYWRpbmcgOCBiaXQgcmVnaXN0ZXIgMHglMDJYIiwKKwkJCQlyZWdfYWRkcmVzcyk7CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwkqdmFsID0gc3QtPnJ4WzFdOworCitlcnJvcl9yZXQ6CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRlNzc1OF9zcGlfcmVhZF9yZWdfMTYoc3RydWN0IGRldmljZSAqZGV2LAorCQl1OCByZWdfYWRkcmVzcywKKwkJdTE2ICp2YWwpCit7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkZTc3NThfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCWludCByZXQ7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyc1tdID0geworCQl7CisJCQkudHhfYnVmID0gc3QtPnR4LAorCQkJLnJ4X2J1ZiA9IHN0LT5yeCwKKwkJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJCS5sZW4gPSAzLAorCQl9LAorCX07CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IEFERTc3NThfUkVBRF9SRUcocmVnX2FkZHJlc3MpOworCXN0LT50eFsxXSA9IDA7CisJc3QtPnR4WzJdID0gMDsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeGZlcnMsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzdC0+dXMtPmRldiwgInByb2JsZW0gd2hlbiByZWFkaW5nIDE2IGJpdCByZWdpc3RlciAweCUwMlgiLAorCQkJCXJlZ19hZGRyZXNzKTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCSp2YWwgPSAoc3QtPnJ4WzFdIDw8IDgpIHwgc3QtPnJ4WzJdOworCitlcnJvcl9yZXQ6CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRlNzc1OF9zcGlfcmVhZF9yZWdfMjQoc3RydWN0IGRldmljZSAqZGV2LAorCQl1OCByZWdfYWRkcmVzcywKKwkJdTMyICp2YWwpCit7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkZTc3NThfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCWludCByZXQ7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyc1tdID0geworCQl7CisJCQkudHhfYnVmID0gc3QtPnR4LAorCQkJLnJ4X2J1ZiA9IHN0LT5yeCwKKwkJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJCS5sZW4gPSA0LAorCQl9LAorCX07CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IEFERTc3NThfUkVBRF9SRUcocmVnX2FkZHJlc3MpOworCXN0LT50eFsxXSA9IDA7CisJc3QtPnR4WzJdID0gMDsKKwlzdC0+dHhbM10gPSAwOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCh4ZmVycywgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnVzLCAmbXNnKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnN0LT51cy0+ZGV2LCAicHJvYmxlbSB3aGVuIHJlYWRpbmcgMjQgYml0IHJlZ2lzdGVyIDB4JTAyWCIsCisJCQkJcmVnX2FkZHJlc3MpOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJKnZhbCA9IChzdC0+cnhbMV0gPDwgMTYpIHwgKHN0LT5yeFsyXSA8PCA4KSB8IHN0LT5yeFszXTsKKworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZGU3NzU4X3JlYWRfOGJpdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJaW50IHJldDsKKwl1OCB2YWwgPSAwOworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKworCXJldCA9IGFkZTc3NThfc3BpX3JlYWRfcmVnXzgoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgdmFsKTsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzc1OF9yZWFkXzE2Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCXUxNiB2YWwgPSAwOworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKworCXJldCA9IGFkZTc3NThfc3BpX3JlYWRfcmVnXzE2KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHZhbCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkZTc3NThfcmVhZF8yNGJpdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJaW50IHJldDsKKwl1MzIgdmFsID0gMDsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisKKwlyZXQgPSBhZGU3NzU4X3NwaV9yZWFkX3JlZ18yNChkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCB2YWwgJiAweEZGRkZGRik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkZTc3NThfd3JpdGVfOGJpdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCWludCByZXQ7CisJbG9uZyB2YWw7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCXJldCA9IGFkZTc3NThfc3BpX3dyaXRlX3JlZ184KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCB2YWwpOworCitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzc1OF93cml0ZV8xNmJpdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCWludCByZXQ7CisJbG9uZyB2YWw7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCXJldCA9IGFkZTc3NThfc3BpX3dyaXRlX3JlZ18xNihkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgdmFsKTsKKworZXJyb3JfcmV0OgorCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKK2ludCBhZGU3NzU4X3Jlc2V0KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0OworCXU4IHZhbDsKKwlhZGU3NzU4X3NwaV9yZWFkX3JlZ184KGRldiwKKwkJCUFERTc3NThfT1BNT0RFLAorCQkJJnZhbCk7CisJdmFsIHw9IDEgPDwgNjsgLyogU29mdHdhcmUgQ2hpcCBSZXNldCAqLworCXJldCA9IGFkZTc3NThfc3BpX3dyaXRlX3JlZ184KGRldiwKKwkJCUFERTc3NThfT1BNT0RFLAorCQkJdmFsKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkZTc3NThfd3JpdGVfcmVzZXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCWlmIChsZW4gPCAxKQorCQlyZXR1cm4gLTE7CisJc3dpdGNoIChidWZbMF0pIHsKKwljYXNlICcxJzoKKwljYXNlICd5JzoKKwljYXNlICdZJzoKKwkJcmV0dXJuIGFkZTc3NThfcmVzZXQoZGV2KTsKKwl9CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX1ZQRUFLKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU4X3JlYWRfOGJpdCwKKwkJYWRlNzc1OF93cml0ZV84Yml0LAorCQlBREU3NzU4X1ZQRUFLKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfSVBFQUsoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NThfcmVhZF84Yml0LAorCQlhZGU3NzU4X3dyaXRlXzhiaXQsCisJCUFERTc3NThfVlBFQUspOworc3RhdGljIElJT19ERVZfQVRUUl9BUEhDQUwoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NThfcmVhZF84Yml0LAorCQlhZGU3NzU4X3dyaXRlXzhiaXQsCisJCUFERTc3NThfQVBIQ0FMKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQlBIQ0FMKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU4X3JlYWRfOGJpdCwKKwkJYWRlNzc1OF93cml0ZV84Yml0LAorCQlBREU3NzU4X0JQSENBTCk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0NQSENBTChTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1OF9yZWFkXzhiaXQsCisJCWFkZTc3NThfd3JpdGVfOGJpdCwKKwkJQURFNzc1OF9DUEhDQUwpOworc3RhdGljIElJT19ERVZfQVRUUl9XRElWKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU4X3JlYWRfOGJpdCwKKwkJYWRlNzc1OF93cml0ZV84Yml0LAorCQlBREU3NzU4X1dESVYpOworc3RhdGljIElJT19ERVZfQVRUUl9WQURJVihTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1OF9yZWFkXzhiaXQsCisJCWFkZTc3NThfd3JpdGVfOGJpdCwKKwkJQURFNzc1OF9WQURJVik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FJUk1TKFNfSVJVR08sCisJCWFkZTc3NThfcmVhZF8yNGJpdCwKKwkJTlVMTCwKKwkJQURFNzc1OF9BSVJNUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0JJUk1TKFNfSVJVR08sCisJCWFkZTc3NThfcmVhZF8yNGJpdCwKKwkJTlVMTCwKKwkJQURFNzc1OF9CSVJNUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0NJUk1TKFNfSVJVR08sCisJCWFkZTc3NThfcmVhZF8yNGJpdCwKKwkJTlVMTCwKKwkJQURFNzc1OF9DSVJNUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FWUk1TKFNfSVJVR08sCisJCWFkZTc3NThfcmVhZF8yNGJpdCwKKwkJTlVMTCwKKwkJQURFNzc1OF9BVlJNUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0JWUk1TKFNfSVJVR08sCisJCWFkZTc3NThfcmVhZF8yNGJpdCwKKwkJTlVMTCwKKwkJQURFNzc1OF9CVlJNUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0NWUk1TKFNfSVJVR08sCisJCWFkZTc3NThfcmVhZF8yNGJpdCwKKwkJTlVMTCwKKwkJQURFNzc1OF9DVlJNUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FJUk1TT1MoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NThfcmVhZF8xNmJpdCwKKwkJYWRlNzc1OF93cml0ZV8xNmJpdCwKKwkJQURFNzc1OF9BSVJNU09TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQklSTVNPUyhTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1OF9yZWFkXzE2Yml0LAorCQlhZGU3NzU4X3dyaXRlXzE2Yml0LAorCQlBREU3NzU4X0JJUk1TT1MpOworc3RhdGljIElJT19ERVZfQVRUUl9DSVJNU09TKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU4X3JlYWRfMTZiaXQsCisJCWFkZTc3NThfd3JpdGVfMTZiaXQsCisJCUFERTc3NThfQ0lSTVNPUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FWUk1TT1MoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NThfcmVhZF8xNmJpdCwKKwkJYWRlNzc1OF93cml0ZV8xNmJpdCwKKwkJQURFNzc1OF9BVlJNU09TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQlZSTVNPUyhTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1OF9yZWFkXzE2Yml0LAorCQlhZGU3NzU4X3dyaXRlXzE2Yml0LAorCQlBREU3NzU4X0JWUk1TT1MpOworc3RhdGljIElJT19ERVZfQVRUUl9DVlJNU09TKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU4X3JlYWRfMTZiaXQsCisJCWFkZTc3NThfd3JpdGVfMTZiaXQsCisJCUFERTc3NThfQ1ZSTVNPUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FJR0FJTihTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1OF9yZWFkXzE2Yml0LAorCQlhZGU3NzU4X3dyaXRlXzE2Yml0LAorCQlBREU3NzU4X0FJR0FJTik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0JJR0FJTihTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1OF9yZWFkXzE2Yml0LAorCQlhZGU3NzU4X3dyaXRlXzE2Yml0LAorCQlBREU3NzU4X0JJR0FJTik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0NJR0FJTihTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1OF9yZWFkXzE2Yml0LAorCQlhZGU3NzU4X3dyaXRlXzE2Yml0LAorCQlBREU3NzU4X0NJR0FJTik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FWUk1TR0FJTihTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1OF9yZWFkXzE2Yml0LAorCQlhZGU3NzU4X3dyaXRlXzE2Yml0LAorCQlBREU3NzU4X0FWUk1TR0FJTik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0JWUk1TR0FJTihTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1OF9yZWFkXzE2Yml0LAorCQlhZGU3NzU4X3dyaXRlXzE2Yml0LAorCQlBREU3NzU4X0JWUk1TR0FJTik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0NWUk1TR0FJTihTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1OF9yZWFkXzE2Yml0LAorCQlhZGU3NzU4X3dyaXRlXzE2Yml0LAorCQlBREU3NzU4X0NWUk1TR0FJTik7CisKK2ludCBhZGU3NzU4X3NldF9pcnEoc3RydWN0IGRldmljZSAqZGV2LCBib29sIGVuYWJsZSkKK3sKKwlpbnQgcmV0OworCXUzMiBpcnFlbjsKKwlyZXQgPSBhZGU3NzU4X3NwaV9yZWFkX3JlZ18yNChkZXYsIEFERTc3NThfTUFTSywgJmlycWVuKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCWlmIChlbmFibGUpCisJCWlycWVuIHw9IDEgPDwgMTY7IC8qIEVuYWJsZXMgYW4gaW50ZXJydXB0IHdoZW4gYSBkYXRhIGlzCisJCQkJICAgICBwcmVzZW50IGluIHRoZSB3YXZlZm9ybSByZWdpc3RlciAqLworCWVsc2UKKwkJaXJxZW4gJj0gfigxIDw8IDE2KTsKKworCXJldCA9IGFkZTc3NThfc3BpX3dyaXRlX3JlZ18yNChkZXYsIEFERTc3NThfTUFTSywgaXJxZW4pOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworLyogUG93ZXIgZG93biB0aGUgZGV2aWNlICovCitzdGF0aWMgaW50IGFkZTc3NThfc3RvcF9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCByZXQ7CisJdTggdmFsOworCWFkZTc3NThfc3BpX3JlYWRfcmVnXzgoZGV2LAorCQkJQURFNzc1OF9PUE1PREUsCisJCQkmdmFsKTsKKwl2YWwgfD0gNyA8PCAzOyAgLyogQURFNzc1OCBwb3dlcmVkIGRvd24gKi8KKwlyZXQgPSBhZGU3NzU4X3NwaV93cml0ZV9yZWdfOChkZXYsCisJCQlBREU3NzU4X09QTU9ERSwKKwkJCXZhbCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkZTc3NThfaW5pdGlhbF9zZXR1cChzdHJ1Y3QgYWRlNzc1OF9zdGF0ZSAqc3QpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmc3QtPmluZGlvX2Rldi0+ZGV2OworCisJLyogdXNlIGxvdyBzcGkgc3BlZWQgZm9yIGluaXQgKi8KKwlzdC0+dXMtPm1vZGUgPSBTUElfTU9ERV8zOworCXNwaV9zZXR1cChzdC0+dXMpOworCisJLyogRGlzYWJsZSBJUlEgKi8KKwlyZXQgPSBhZGU3NzU4X3NldF9pcnEoZGV2LCBmYWxzZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgImRpc2FibGUgaXJxIGZhaWxlZCIpOworCQlnb3RvIGVycl9yZXQ7CisJfQorCisJYWRlNzc1OF9yZXNldChkZXYpOworCW1zbGVlcChBREU3NzU4X1NUQVJUVVBfREVMQVkpOworCitlcnJfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkZTc3NThfcmVhZF9mcmVxdWVuY3koc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCWludCByZXQsIGxlbiA9IDA7CisJdTggdDsKKwlpbnQgc3BzOworCXJldCA9IGFkZTc3NThfc3BpX3JlYWRfcmVnXzgoZGV2LAorCQkJQURFNzc1OF9XQVZNT0RFLAorCQkJJnQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwl0ID0gKHQgPj4gNSkgJiAweDM7CisJc3BzID0gMjYwNDAgLyAoMSA8PCB0KTsKKworCWxlbiA9IHNwcmludGYoYnVmLCAiJWQgU1BTXG4iLCBzcHMpOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkZTc3NThfd3JpdGVfZnJlcXVlbmN5KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkZTc3NThfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCByZXQ7CisJdTggcmVnLCB0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisKKwl0ID0gKDI2MDQwIC8gdmFsKTsKKwlpZiAodCA+IDApCisJCXQgPj49IDE7CisKKwlpZiAodCA+IDEpCisJCXN0LT51cy0+bWF4X3NwZWVkX2h6ID0gQURFNzc1OF9TUElfU0xPVzsKKwllbHNlCisJCXN0LT51cy0+bWF4X3NwZWVkX2h6ID0gQURFNzc1OF9TUElfRkFTVDsKKworCXJldCA9IGFkZTc3NThfc3BpX3JlYWRfcmVnXzgoZGV2LAorCQkJQURFNzc1OF9XQVZNT0RFLAorCQkJJnJlZyk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZWcgJj0gfig1IDw8IDMpOworCXJlZyB8PSB0IDw8IDU7CisKKwlyZXQgPSBhZGU3NzU4X3NwaV93cml0ZV9yZWdfOChkZXYsCisJCQlBREU3NzU4X1dBVk1PREUsCisJCQlyZWcpOworCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkZTc3NThfcmVhZF93YXZlZm9ybV90eXBlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0LCBsZW4gPSAwOworCXU4IHQ7CisJcmV0ID0gYWRlNzc1OF9zcGlfcmVhZF9yZWdfOChkZXYsCisJCQlBREU3NzU4X1dBVk1PREUsCisJCQkmdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXQgPSAodCA+PiAyKSAmIDB4NzsKKworCWxlbiA9IHNwcmludGYoYnVmLCAiJWRcbiIsIHQpOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzc1OF93cml0ZV93YXZlZm9ybV90eXBlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJaW50IHJldDsKKwl1OCByZWc7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAodmFsID4gNCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCXJldCA9IGFkZTc3NThfc3BpX3JlYWRfcmVnXzgoZGV2LAorCQkJQURFNzc1OF9XQVZNT0RFLAorCQkJJnJlZyk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZWcgJj0gfig3IDw8IDIpOworCXJlZyB8PSB2YWwgPDwgMjsKKworCXJldCA9IGFkZTc3NThfc3BpX3dyaXRlX3JlZ184KGRldiwKKwkJCUFERTc3NThfV0FWTU9ERSwKKwkJCXJlZyk7CisKK291dDoKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9URU1QX1JBVyhhZGU3NzU4X3JlYWRfOGJpdCk7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIodGVtcF9vZmZzZXQsICIxMjkgQyIpOworc3RhdGljIElJT19DT05TVF9BVFRSKHRlbXBfc2NhbGUsICI0IEMiKTsKKworc3RhdGljIElJT19ERVZfQVRUUl9BV0FUVEhSKGFkZTc3NThfcmVhZF8xNmJpdCwKKwkJQURFNzc1OF9BV0FUVEhSKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQldBVFRIUihhZGU3NzU4X3JlYWRfMTZiaXQsCisJCUFERTc3NThfQldBVFRIUik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0NXQVRUSFIoYWRlNzc1OF9yZWFkXzE2Yml0LAorCQlBREU3NzU4X0NXQVRUSFIpOworc3RhdGljIElJT19ERVZfQVRUUl9BVkFSSFIoYWRlNzc1OF9yZWFkXzE2Yml0LAorCQlBREU3NzU4X0FWQVJIUik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0JWQVJIUihhZGU3NzU4X3JlYWRfMTZiaXQsCisJCUFERTc3NThfQlZBUkhSKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ1ZBUkhSKGFkZTc3NThfcmVhZF8xNmJpdCwKKwkJQURFNzc1OF9DVkFSSFIpOworc3RhdGljIElJT19ERVZfQVRUUl9BVkFIUihhZGU3NzU4X3JlYWRfMTZiaXQsCisJCUFERTc3NThfQVZBSFIpOworc3RhdGljIElJT19ERVZfQVRUUl9CVkFIUihhZGU3NzU4X3JlYWRfMTZiaXQsCisJCUFERTc3NThfQlZBSFIpOworc3RhdGljIElJT19ERVZfQVRUUl9DVkFIUihhZGU3NzU4X3JlYWRfMTZiaXQsCisJCUFERTc3NThfQ1ZBSFIpOworCitzdGF0aWMgSUlPX0RFVl9BVFRSX1NBTVBfRlJFUShTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1OF9yZWFkX2ZyZXF1ZW5jeSwKKwkJYWRlNzc1OF93cml0ZV9mcmVxdWVuY3kpOworCisvKioKKyAqIElJT19ERVZfQVRUUl9XQVZFRk9STV9UWVBFIC0gc2V0IHRoZSB0eXBlIG9mIHdhdmVmb3JtLgorICogQF9tb2RlOiBzeXNmcyBmaWxlIG1vZGUvcGVybWlzc2lvbnMKKyAqIEBfc2hvdzogb3V0cHV0IG1ldGhvZCBmb3IgdGhlIGF0dHJpYnV0ZQorICogQF9zdG9yZTogaW5wdXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlCisgKiovCisjZGVmaW5lIElJT19ERVZfQVRUUl9XQVZFRk9STV9UWVBFKF9tb2RlLCBfc2hvdywgX3N0b3JlKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIod2F2ZWZvcm1fdHlwZSwgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCisKK3N0YXRpYyBJSU9fREVWX0FUVFJfV0FWRUZPUk1fVFlQRShTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1OF9yZWFkX3dhdmVmb3JtX3R5cGUsCisJCWFkZTc3NThfd3JpdGVfd2F2ZWZvcm1fdHlwZSk7CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfUkVTRVQoYWRlNzc1OF93cml0ZV9yZXNldCk7CisKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUl9TQU1QX0ZSRVFfQVZBSUwoIjI2MDAwIDEzMDAwIDY1MDAwIDMzMDAwIik7CisKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihuYW1lLCAiYWRlNzc1OCIpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRlNzc1OF9ldmVudF9hdHRyaWJ1dGVzW10gPSB7CisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWRlNzc1OF9ldmVudF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWRlNzc1OF9ldmVudF9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkZTc3NThfYXR0cmlidXRlc1tdID0geworCSZpaW9fZGV2X2F0dHJfdGVtcF9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfdGVtcF9vZmZzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfdGVtcF9zY2FsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfc2FtcGxpbmdfZnJlcXVlbmN5LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl93YXZlZm9ybV90eXBlLmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX3NhbXBsaW5nX2ZyZXF1ZW5jeV9hdmFpbGFibGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3Jlc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX25hbWUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2F3YXR0aHIuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2J3YXR0aHIuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2N3YXR0aHIuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2F2YXJoci5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYnZhcmhyLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jdmFyaHIuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2F2YWhyLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9idmFoci5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY3ZhaHIuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3ZwZWFrLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pcGVhay5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYXBoY2FsLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9icGhjYWwuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NwaGNhbC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfd2Rpdi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfdmFkaXYuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2Fpcm1zLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9iaXJtcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2lybXMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2F2cm1zLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9idnJtcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY3ZybXMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FpZ2Fpbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYmlnYWluLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jaWdhaW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2F2cm1zZ2Fpbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYnZybXNnYWluLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jdnJtc2dhaW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2Fpcm1zb3MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2Jpcm1zb3MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2Npcm1zb3MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2F2cm1zb3MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2J2cm1zb3MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2N2cm1zb3MuZGV2X2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWRlNzc1OF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWRlNzc1OF9hdHRyaWJ1dGVzLAorfTsKKworCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkZTc3NThfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlpbnQgcmV0LCByZWdkb25lID0gMDsKKwlzdHJ1Y3QgYWRlNzc1OF9zdGF0ZSAqc3QgPSBremFsbG9jKHNpemVvZiAqc3QsIEdGUF9LRVJORUwpOworCWlmICghc3QpIHsKKwkJcmV0ID0gIC1FTk9NRU07CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwkvKiB0aGlzIGlzIG9ubHkgdXNlZCBmb3IgcmVtb3ZhbCBwdXJwb3NlcyAqLworCXNwaV9zZXRfZHJ2ZGF0YShzcGksIHN0KTsKKworCS8qIEFsbG9jYXRlIHRoZSBjb21tcyBidWZmZXJzICovCisJc3QtPnJ4ID0ga3phbGxvYyhzaXplb2YoKnN0LT5yeCkqQURFNzc1OF9NQVhfUlgsIEdGUF9LRVJORUwpOworCWlmIChzdC0+cnggPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfc3Q7CisJfQorCXN0LT50eCA9IGt6YWxsb2Moc2l6ZW9mKCpzdC0+dHgpKkFERTc3NThfTUFYX1RYLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QtPnR4ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3J4OworCX0KKwlzdC0+dXMgPSBzcGk7CisJbXV0ZXhfaW5pdCgmc3QtPmJ1Zl9sb2NrKTsKKwkvKiBzZXR1cCB0aGUgaW5kdXN0cmlhbGlvIGRyaXZlciBhbGxvY2F0ZWQgZWxlbWVudHMgKi8KKwlzdC0+aW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChzdC0+aW5kaW9fZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3R4OworCX0KKworCXN0LT5pbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmc3BpLT5kZXY7CisJc3QtPmluZGlvX2Rldi0+bnVtX2ludGVycnVwdF9saW5lcyA9IDE7CisJc3QtPmluZGlvX2Rldi0+ZXZlbnRfYXR0cnMgPSAmYWRlNzc1OF9ldmVudF9hdHRyaWJ1dGVfZ3JvdXA7CisJc3QtPmluZGlvX2Rldi0+YXR0cnMgPSAmYWRlNzc1OF9hdHRyaWJ1dGVfZ3JvdXA7CisJc3QtPmluZGlvX2Rldi0+ZGV2X2RhdGEgPSAodm9pZCAqKShzdCk7CisJc3QtPmluZGlvX2Rldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCXN0LT5pbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwlyZXQgPSBhZGU3NzU4X2NvbmZpZ3VyZV9yaW5nKHN0LT5pbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKHN0LT5pbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfdW5yZWdfcmluZ19mdW5jczsKKwlyZWdkb25lID0gMTsKKworCXJldCA9IGFkZTc3NThfaW5pdGlhbGl6ZV9yaW5nKHN0LT5pbmRpb19kZXYtPnJpbmcpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcmluZ1xuIik7CisJCWdvdG8gZXJyb3JfdW5yZWdfcmluZ19mdW5jczsKKwl9CisKKwlpZiAoc3BpLT5pcnEpIHsKKwkJcmV0ID0gaWlvX3JlZ2lzdGVyX2ludGVycnVwdF9saW5lKHNwaS0+aXJxLAorCQkJCXN0LT5pbmRpb19kZXYsCisJCQkJMCwKKwkJCQlJUlFGX1RSSUdHRVJfRkFMTElORywKKwkJCQkiYWRlNzc1OCIpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl91bmluaXRpYWxpemVfcmluZzsKKworCQlyZXQgPSBhZGU3NzU4X3Byb2JlX3RyaWdnZXIoc3QtPmluZGlvX2Rldik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3VucmVnaXN0ZXJfbGluZTsKKwl9CisKKwkvKiBHZXQgdGhlIGRldmljZSBpbnRvIGEgc2FuZSBpbml0aWFsIHN0YXRlICovCisJcmV0ID0gYWRlNzc1OF9pbml0aWFsX3NldHVwKHN0KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JlbW92ZV90cmlnZ2VyOworCXJldHVybiAwOworCitlcnJvcl9yZW1vdmVfdHJpZ2dlcjoKKwlpZiAoc3QtPmluZGlvX2Rldi0+bW9kZXMgJiBJTkRJT19SSU5HX1RSSUdHRVJFRCkKKwkJYWRlNzc1OF9yZW1vdmVfdHJpZ2dlcihzdC0+aW5kaW9fZGV2KTsKK2Vycm9yX3VucmVnaXN0ZXJfbGluZToKKwlpZiAoc3QtPmluZGlvX2Rldi0+bW9kZXMgJiBJTkRJT19SSU5HX1RSSUdHRVJFRCkKKwkJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoc3QtPmluZGlvX2RldiwgMCk7CitlcnJvcl91bmluaXRpYWxpemVfcmluZzoKKwlhZGU3NzU4X3VuaW5pdGlhbGl6ZV9yaW5nKHN0LT5pbmRpb19kZXYtPnJpbmcpOworZXJyb3JfdW5yZWdfcmluZ19mdW5jczoKKwlhZGU3NzU4X3VuY29uZmlndXJlX3Jpbmcoc3QtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX2RldjoKKwlpZiAocmVnZG9uZSkKKwkJaWlvX2RldmljZV91bnJlZ2lzdGVyKHN0LT5pbmRpb19kZXYpOworCWVsc2UKKwkJaWlvX2ZyZWVfZGV2aWNlKHN0LT5pbmRpb19kZXYpOworZXJyb3JfZnJlZV90eDoKKwlrZnJlZShzdC0+dHgpOworZXJyb3JfZnJlZV9yeDoKKwlrZnJlZShzdC0+cngpOworZXJyb3JfZnJlZV9zdDoKKwlrZnJlZShzdCk7CitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3NzU4X3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWludCByZXQ7CisJc3RydWN0IGFkZTc3NThfc3RhdGUgKnN0ID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHN0LT5pbmRpb19kZXY7CisKKwlyZXQgPSBhZGU3NzU4X3N0b3BfZGV2aWNlKCYoaW5kaW9fZGV2LT5kZXYpKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9yZXQ7CisKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCisJYWRlNzc1OF9yZW1vdmVfdHJpZ2dlcihpbmRpb19kZXYpOworCWlmIChzcGktPmlycSAmJiBncGlvX2lzX3ZhbGlkKGlycV90b19ncGlvKHNwaS0+aXJxKSkgPiAwKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShpbmRpb19kZXYsIDApOworCisJYWRlNzc1OF91bmluaXRpYWxpemVfcmluZyhpbmRpb19kZXYtPnJpbmcpOworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWFkZTc3NThfdW5jb25maWd1cmVfcmluZyhpbmRpb19kZXYpOworCWtmcmVlKHN0LT50eCk7CisJa2ZyZWUoc3QtPnJ4KTsKKwlrZnJlZShzdCk7CisKKwlyZXR1cm4gMDsKKworZXJyX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWRlNzc1OF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYWRlNzc1OCIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gYWRlNzc1OF9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWRlNzc1OF9yZW1vdmUpLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWRlNzc1OF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFkZTc3NThfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGFkZTc3NThfaW5pdCk7CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBhZGU3NzU4X2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmFkZTc3NThfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFkZTc3NThfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkJhcnJ5IFNvbmcgPDIxY25iYW9AZ21haWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBBREU3NzU4IFBvbHlwaGFzZSBNdWx0aWZ1bmN0aW9uIEVuZXJneSBNZXRlcmluZyBJQyBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OF9yaW5nLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NThfcmluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NGI0YTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NThfcmluZy5jCkBAIC0wLDAgKzEsMjEyIEBACisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisjaW5jbHVkZSAiLi4vcmluZ19zdy5oIgorI2luY2x1ZGUgIi4uL2FjY2VsL2FjY2VsLmgiCisjaW5jbHVkZSAiLi4vdHJpZ2dlci5oIgorI2luY2x1ZGUgImFkZTc3NTguaCIKKworLyoqCisgKiBjb21iaW5lXzhfdG9fMzIoKSB1dGlsaXR5IGZ1bmN0aW9uIHRvIG11bmdlIHRvIHU4cyBpbnRvIHUzMgorICoqLworc3RhdGljIGlubGluZSB1MzIgY29tYmluZV84X3RvXzMyKHU4IGxvd2VyLCB1OCBtaWQsIHU4IHVwcGVyKQoreworCXUzMiBfbG93ZXIgPSBsb3dlcjsKKwl1MzIgX21pZCA9IG1pZDsKKwl1MzIgX3VwcGVyID0gdXBwZXI7CisKKwlyZXR1cm4gX2xvd2VyIHwgKF9taWQgPDwgOCkgfCAoX3VwcGVyIDw8IDE2KTsKK30KKworc3RhdGljIElJT19TQ0FOX0VMX0Mod2Zvcm0sIEFERTc3NThfU0NBTl9XRk9STSwgQURFNzc1OF9XRk9STSwgTlVMTCk7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFJfU0NBTl9FTF9UWVBFKHdmb3JtLCBzLCAyNCwgMzIpOworc3RhdGljIElJT19TQ0FOX0VMX1RJTUVTVEFNUCgxKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUl9TQ0FOX0VMX1RZUEUodGltZXN0YW1wLCBzLCA2NCwgNjQpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRlNzc1OF9zY2FuX2VsX2F0dHJzW10gPSB7CisJJmlpb19zY2FuX2VsX3dmb3JtLmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX3dmb3JtX2luZGV4LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX3dmb3JtX3R5cGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX3NjYW5fZWxfdGltZXN0YW1wLmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX3RpbWVzdGFtcF9pbmRleC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl90aW1lc3RhbXBfdHlwZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZGU3NzU4X3NjYW5fZWxfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWRlNzc1OF9zY2FuX2VsX2F0dHJzLAorCS5uYW1lID0gInNjYW5fZWxlbWVudHMiLAorfTsKKworLyoqCisgKiBhZGU3NzU4X3BvbGxfZnVuY190aCgpIHRvcCBoYWxmIGludGVycnVwdCBoYW5kbGVyIGNhbGxlZCBieSB0cmlnZ2VyCisgKiBAcHJpdmF0ZV9kYXRhOglpaW9fZGV2CisgKiovCitzdGF0aWMgdm9pZCBhZGU3NzU4X3BvbGxfZnVuY190aChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LCBzNjQgdGltZSkKK3sKKwlzdHJ1Y3QgYWRlNzc1OF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJc3QtPmxhc3RfdGltZXN0YW1wID0gdGltZTsKKwlzY2hlZHVsZV93b3JrKCZzdC0+d29ya190cmlnZ2VyX3RvX3JpbmcpOworCS8qIEluZGljYXRlIHRoYXQgdGhpcyBpbnRlcnJ1cHQgaXMgYmVpbmcgaGFuZGxlZCAqLworCisJLyogVGVjaG5pY2FsbHkgdGhpcyBpcyB0cmlnZ2VyIHJlbGF0ZWQsIGJ1dCB3aXRob3V0IHRoaXMKKwkgKiBoYW5kbGVyIHJ1bm5pbmcgdGhlcmUgaXMgY3VycmVudGx5IG5vIHdheSBmb3IgdGhlIGludGVycnVwdAorCSAqIHRvIGNsZWFyLgorCSAqLworfQorCisvKioKKyAqIGFkZTc3NThfc3BpX3JlYWRfYnVyc3QoKSAtIHJlYWQgYWxsIGRhdGEgcmVnaXN0ZXJzCisgKiBAZGV2OiBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIGNoaWxkIG9mIGFjdHVhbCBkZXZpY2UgKGlpb19kZXYgb3IgaWlvX3RyaWcpCisgKiBAcng6IHNvbWV3aGVyZSB0byBwYXNzIGJhY2sgdGhlIHZhbHVlIHJlYWQgKG1pbiBzaXplIGlzIDI0IGJ5dGVzKQorICoqLworc3RhdGljIGludCBhZGU3NzU4X3NwaV9yZWFkX2J1cnN0KHN0cnVjdCBkZXZpY2UgKmRldiwgdTggKnJ4KQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3NzU4X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyc1tdID0geworCQl7CisJCQkudHhfYnVmID0gc3QtPnR4LAorCQkJLnJ4X2J1ZiA9IHJ4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDQsCisJCX0sIHsKKwkJCS50eF9idWYgPSBzdC0+dHggKyA0LAorCQkJLnJ4X2J1ZiA9IHJ4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDQsCisJCX0sCisJfTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURFNzc1OF9SRUFEX1JFRyhBREU3NzU4X1JTVEFUVVMpOworCXN0LT50eFsxXSA9IDA7CisJc3QtPnR4WzJdID0gMDsKKwlzdC0+dHhbM10gPSAwOworCXN0LT50eFs0XSA9IEFERTc3NThfUkVBRF9SRUcoQURFNzc1OF9XRk9STSk7CisJc3QtPnR4WzVdID0gMDsKKwlzdC0+dHhbNl0gPSAwOworCXN0LT50eFs3XSA9IDA7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyc1swXSwgJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXJzWzFdLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+dXMsICZtc2cpOworCWlmIChyZXQpCisJCWRldl9lcnIoJnN0LT51cy0+ZGV2LCAicHJvYmxlbSB3aGVuIHJlYWRpbmcgV0ZPUk0gdmFsdWVcbiIpOworCisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworLyogV2hpbHN0IHRoaXMgbWFrZXMgYSBsb3Qgb2YgY2FsbHMgdG8gaWlvX3N3X3JpbmcgZnVuY3Rpb25zIC0gaXQgaXMgdG8gZGV2aWNlCisgKiBzcGVjaWZpYyB0byBiZSByb2xsZWQgaW50byB0aGUgY29yZS4KKyAqLworc3RhdGljIHZvaWQgYWRlNzc1OF90cmlnZ2VyX2JoX3RvX3Jpbmcoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrX3MpCit7CisJc3RydWN0IGFkZTc3NThfc3RhdGUgKnN0CisJCT0gY29udGFpbmVyX29mKHdvcmtfcywgc3RydWN0IGFkZTc3NThfc3RhdGUsCisJCQkgICAgICAgd29ya190cmlnZ2VyX3RvX3JpbmcpOworCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcgPSBzdC0+aW5kaW9fZGV2LT5yaW5nOworCisJaW50IGkgPSAwOworCXMzMiAqZGF0YTsKKwlzaXplX3QgZGF0YXNpemUgPSByaW5nLT5hY2Nlc3MuZ2V0X2J5dGVzX3Blcl9kYXR1bShyaW5nKTsKKworCWRhdGEgPSBrbWFsbG9jKGRhdGFzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGF0YSA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnN0LT51cy0+ZGV2LCAibWVtb3J5IGFsbG9jIGZhaWxlZCBpbiByaW5nIGJoIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAocmluZy0+c2Nhbl9jb3VudCkKKwkJaWYgKGFkZTc3NThfc3BpX3JlYWRfYnVyc3QoJnN0LT5pbmRpb19kZXYtPmRldiwgc3QtPnJ4KSA+PSAwKQorCQkJZm9yICg7IGkgPCByaW5nLT5zY2FuX2NvdW50OyBpKyspCisJCQkJZGF0YVtpXSA9IGNvbWJpbmVfOF90b18zMihzdC0+cnhbaSoyKzJdLAorCQkJCQkJc3QtPnJ4W2kqMisxXSwKKwkJCQkJCXN0LT5yeFtpKjJdKTsKKworCS8qIEd1YXJhbnRlZWQgdG8gYmUgYWxpZ25lZCB3aXRoIDggYnl0ZSBib3VuZGFyeSAqLworCWlmIChyaW5nLT5zY2FuX3RpbWVzdGFtcCkKKwkJKigoczY0ICopCisJCSgoKHUzMilkYXRhICsgNCAqIHJpbmctPnNjYW5fY291bnQgKyA0KSAmIH4weDcpKSA9CisJCQlzdC0+bGFzdF90aW1lc3RhbXA7CisKKwlyaW5nLT5hY2Nlc3Muc3RvcmVfdG8ocmluZywKKwkJCSAgICAgICh1OCAqKWRhdGEsCisJCQkgICAgICBzdC0+bGFzdF90aW1lc3RhbXApOworCisJaWlvX3RyaWdnZXJfbm90aWZ5X2RvbmUoc3QtPmluZGlvX2Rldi0+dHJpZyk7CisJa2ZyZWUoZGF0YSk7CisKKwlyZXR1cm47Cit9CisKK3ZvaWQgYWRlNzc1OF91bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJa2ZyZWUoaW5kaW9fZGV2LT5wb2xsZnVuYyk7CisJaWlvX3N3X3JiX2ZyZWUoaW5kaW9fZGV2LT5yaW5nKTsKK30KKworaW50IGFkZTc3NThfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYWRlNzc1OF9zdGF0ZSAqc3QgPSBpbmRpb19kZXYtPmRldl9kYXRhOworCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmc7CisJSU5JVF9XT1JLKCZzdC0+d29ya190cmlnZ2VyX3RvX3JpbmcsIGFkZTc3NThfdHJpZ2dlcl9iaF90b19yaW5nKTsKKworCXJpbmcgPSBpaW9fc3dfcmJfYWxsb2NhdGUoaW5kaW9fZGV2KTsKKwlpZiAoIXJpbmcpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJcmV0dXJuIHJldDsKKwl9CisJaW5kaW9fZGV2LT5yaW5nID0gcmluZzsKKwkvKiBFZmZlY3RpdmVseSBzZWxlY3QgdGhlIHJpbmcgYnVmZmVyIGltcGxlbWVudGF0aW9uICovCisJaWlvX3Jpbmdfc3dfcmVnaXN0ZXJfZnVuY3MoJnJpbmctPmFjY2Vzcyk7CisJcmluZy0+YnBlID0gNDsKKwlyaW5nLT5zY2FuX2VsX2F0dHJzID0gJmFkZTc3NThfc2Nhbl9lbF9ncm91cDsKKwlyaW5nLT5zY2FuX3RpbWVzdGFtcCA9IHRydWU7CisJcmluZy0+cHJlZW5hYmxlID0gJmlpb19zd19yaW5nX3ByZWVuYWJsZTsKKwlyaW5nLT5wb3N0ZW5hYmxlID0gJmlpb190cmlnZ2VyZWRfcmluZ19wb3N0ZW5hYmxlOworCXJpbmctPnByZWRpc2FibGUgPSAmaWlvX3RyaWdnZXJlZF9yaW5nX3ByZWRpc2FibGU7CisJcmluZy0+b3duZXIgPSBUSElTX01PRFVMRTsKKworCS8qIFNldCBkZWZhdWx0IHNjYW4gbW9kZSAqLworCWlpb19zY2FuX21hc2tfc2V0KHJpbmcsIGlpb19zY2FuX2VsX3dmb3JtLm51bWJlcik7CisKKwlyZXQgPSBpaW9fYWxsb2NfcG9sbGZ1bmMoaW5kaW9fZGV2LCBOVUxMLCAmYWRlNzc1OF9wb2xsX2Z1bmNfdGgpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfaWlvX3N3X3JiX2ZyZWU7CisKKwlpbmRpb19kZXYtPm1vZGVzIHw9IElORElPX1JJTkdfVFJJR0dFUkVEOworCXJldHVybiAwOworCitlcnJvcl9paW9fc3dfcmJfZnJlZToKKwlpaW9fc3dfcmJfZnJlZShpbmRpb19kZXYtPnJpbmcpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBhZGU3NzU4X2luaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQoreworCXJldHVybiBpaW9fcmluZ19idWZmZXJfcmVnaXN0ZXIocmluZywgMCk7Cit9CisKK3ZvaWQgYWRlNzc1OF91bmluaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQoreworCWlpb19yaW5nX2J1ZmZlcl91bnJlZ2lzdGVyKHJpbmcpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU4X3RyaWdnZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OF90cmlnZ2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBhYmNhMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OF90cmlnZ2VyLmMKQEAgLTAsMCArMSwxMjUgQEAKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisjaW5jbHVkZSAiLi4vdHJpZ2dlci5oIgorI2luY2x1ZGUgImFkZTc3NTguaCIKKworLyoqCisgKiBhZGU3NzU4X2RhdGFfcmR5X3RyaWdfcG9sbCgpIHRoZSBldmVudCBoYW5kbGVyIGZvciB0aGUgZGF0YSByZHkgdHJpZworICoqLworc3RhdGljIGludCBhZGU3NzU4X2RhdGFfcmR5X3RyaWdfcG9sbChzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8sCisJCQkJICAgICAgIGludCBpbmRleCwKKwkJCQkgICAgICAgczY0IHRpbWVzdGFtcCwKKwkJCQkgICAgICAgaW50IG5vX3Rlc3QpCit7CisJc3RydWN0IGFkZTc3NThfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShkZXZfaW5mbyk7CisJc3RydWN0IGlpb190cmlnZ2VyICp0cmlnID0gc3QtPnRyaWc7CisKKwlpaW9fdHJpZ2dlcl9wb2xsKHRyaWcsIHRpbWVzdGFtcCk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK0lJT19FVkVOVF9TSChkYXRhX3JkeV90cmlnLCAmYWRlNzc1OF9kYXRhX3JkeV90cmlnX3BvbGwpOworCitzdGF0aWMgREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgaWlvX3RyaWdnZXJfcmVhZF9uYW1lLCBOVUxMKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkZTc3NThfdHJpZ2dlcl9hdHRyc1tdID0geworCSZkZXZfYXR0cl9uYW1lLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkZTc3NThfdHJpZ2dlcl9hdHRyX2dyb3VwID0geworCS5hdHRycyA9IGFkZTc3NThfdHJpZ2dlcl9hdHRycywKK307CisKKy8qKgorICogYWRlNzc1OF9kYXRhX3JkeV90cmlnZ2VyX3NldF9zdGF0ZSgpIHNldCBkYXRhcmR5IGludGVycnVwdCBzdGF0ZQorICoqLworc3RhdGljIGludCBhZGU3NzU4X2RhdGFfcmR5X3RyaWdnZXJfc2V0X3N0YXRlKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZywKKwkJCQkJCWJvb2wgc3RhdGUpCit7CisJc3RydWN0IGFkZTc3NThfc3RhdGUgKnN0ID0gdHJpZy0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBzdC0+aW5kaW9fZGV2OworCWludCByZXQgPSAwOworCisJZGV2X2RiZygmaW5kaW9fZGV2LT5kZXYsICIlcyAoJWQpXG4iLCBfX2Z1bmNfXywgc3RhdGUpOworCXJldCA9IGFkZTc3NThfc2V0X2lycSgmc3QtPmluZGlvX2Rldi0+ZGV2LCBzdGF0ZSk7CisJaWYgKHN0YXRlID09IGZhbHNlKSB7CisJCWlpb19yZW1vdmVfZXZlbnRfZnJvbV9saXN0KCZpaW9fZXZlbnRfZGF0YV9yZHlfdHJpZywKKwkJCQkJICAgJmluZGlvX2Rldi0+aW50ZXJydXB0c1swXQorCQkJCQkgICAtPmV2X2xpc3QpOworCQkvKiBwb3NzaWJsZSBxdWlyayB3aXRoIGhhbmRsZXIgY3VycmVudGx5IHdvcmtlZCBhcm91bmQKKwkJICAgYnkgZW5zdXJpbmcgdGhlIHdvcmsgcXVldWUgaXMgZW1wdHkgKi8KKwkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwl9IGVsc2UgeworCQlpaW9fYWRkX2V2ZW50X3RvX2xpc3QoJmlpb19ldmVudF9kYXRhX3JkeV90cmlnLAorCQkJCSAgICAgICZpbmRpb19kZXYtPmludGVycnVwdHNbMF0tPmV2X2xpc3QpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGFkZTc3NThfdHJpZ190cnlfcmVlbigpIHRyeSByZW5hYmxpbmcgaXJxIGZvciBkYXRhIHJkeSB0cmlnZ2VyCisgKiBAdHJpZzoJdGhlIGRhdGFyZHkgdHJpZ2dlcgorICoqLworc3RhdGljIGludCBhZGU3NzU4X3RyaWdfdHJ5X3JlZW4oc3RydWN0IGlpb190cmlnZ2VyICp0cmlnKQoreworCXN0cnVjdCBhZGU3NzU4X3N0YXRlICpzdCA9IHRyaWctPnByaXZhdGVfZGF0YTsKKwllbmFibGVfaXJxKHN0LT51cy0+aXJxKTsKKwkvKiBpcnEgcmVlbmFibGVkIHNvIHN1Y2Nlc3MhICovCisJcmV0dXJuIDA7Cit9CisKK2ludCBhZGU3NzU4X3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBhZGU3NzU4X3N0YXRlICpzdCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisKKwlzdC0+dHJpZyA9IGlpb19hbGxvY2F0ZV90cmlnZ2VyKCk7CisJc3QtPnRyaWctPm5hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwKKwkJCQkiYWRlNzc1OC1kZXYlZCIsCisJCQkJaW5kaW9fZGV2LT5pZCk7CisJaWYgKCFzdC0+dHJpZy0+bmFtZSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfdHJpZzsKKwl9CisJc3QtPnRyaWctPmRldi5wYXJlbnQgPSAmc3QtPnVzLT5kZXY7CisJc3QtPnRyaWctPm93bmVyID0gVEhJU19NT0RVTEU7CisJc3QtPnRyaWctPnByaXZhdGVfZGF0YSA9IHN0OworCXN0LT50cmlnLT5zZXRfdHJpZ2dlcl9zdGF0ZSA9ICZhZGU3NzU4X2RhdGFfcmR5X3RyaWdnZXJfc2V0X3N0YXRlOworCXN0LT50cmlnLT50cnlfcmVlbmFibGUgPSAmYWRlNzc1OF90cmlnX3RyeV9yZWVuOworCXN0LT50cmlnLT5jb250cm9sX2F0dHJzID0gJmFkZTc3NThfdHJpZ2dlcl9hdHRyX2dyb3VwOworCXJldCA9IGlpb190cmlnZ2VyX3JlZ2lzdGVyKHN0LT50cmlnKTsKKworCS8qIHNlbGVjdCBkZWZhdWx0IHRyaWdnZXIgKi8KKwlpbmRpb19kZXYtPnRyaWcgPSBzdC0+dHJpZzsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfdHJpZ19uYW1lOworCisJcmV0dXJuIDA7CisKK2Vycm9yX2ZyZWVfdHJpZ19uYW1lOgorCWtmcmVlKHN0LT50cmlnLT5uYW1lKTsKK2Vycm9yX2ZyZWVfdHJpZzoKKwlpaW9fZnJlZV90cmlnZ2VyKHN0LT50cmlnKTsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgYWRlNzc1OF9yZW1vdmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCXN0cnVjdCBhZGU3NzU4X3N0YXRlICpzdGF0ZSA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisKKwlpaW9fdHJpZ2dlcl91bnJlZ2lzdGVyKHN0YXRlLT50cmlnKTsKKwlrZnJlZShzdGF0ZS0+dHJpZy0+bmFtZSk7CisJaWlvX2ZyZWVfdHJpZ2dlcihzdGF0ZS0+dHJpZyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTkuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZmMzYzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTkuYwpAQCAtMCwwICsxLDY3MCBAQAorLyoKKyAqIEFERTc3NTkgQWN0aXZlIEVuZXJneSBNZXRlcmluZyBJQyB3aXRoIGRpL2R0IFNlbnNvciBJbnRlcmZhY2UgRHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKyNpbmNsdWRlICJtZXRlci5oIgorI2luY2x1ZGUgImFkZTc3NTkuaCIKKworaW50IGFkZTc3NTlfc3BpX3dyaXRlX3JlZ184KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTggcmVnX2FkZHJlc3MsCisJCXU4IHZhbCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzc1OV9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IEFERTc3NTlfV1JJVEVfUkVHKHJlZ19hZGRyZXNzKTsKKwlzdC0+dHhbMV0gPSB2YWw7CisKKwlyZXQgPSBzcGlfd3JpdGUoc3QtPnVzLCBzdC0+dHgsIDIpOworCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRlNzc1OV9zcGlfd3JpdGVfcmVnXzE2KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTggcmVnX2FkZHJlc3MsCisJCXUxNiB2YWx1ZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3NzU5X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gMywKKwkJfQorCX07CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IEFERTc3NTlfV1JJVEVfUkVHKHJlZ19hZGRyZXNzKTsKKwlzdC0+dHhbMV0gPSAodmFsdWUgPj4gOCkgJiAweEZGOworCXN0LT50eFsyXSA9IHZhbHVlICYgMHhGRjsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeGZlcnMsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3NzU5X3NwaV9yZWFkX3JlZ184KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTggcmVnX2FkZHJlc3MsCisJCXU4ICp2YWwpCit7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkZTc3NTlfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCWludCByZXQ7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyc1tdID0geworCQl7CisJCQkudHhfYnVmID0gc3QtPnR4LAorCQkJLnJ4X2J1ZiA9IHN0LT5yeCwKKwkJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJCS5sZW4gPSAyLAorCQl9LAorCX07CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IEFERTc3NTlfUkVBRF9SRUcocmVnX2FkZHJlc3MpOworCXN0LT50eFsxXSA9IDA7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKHhmZXJzLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+dXMsICZtc2cpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3QtPnVzLT5kZXYsICJwcm9ibGVtIHdoZW4gcmVhZGluZyA4IGJpdCByZWdpc3RlciAweCUwMlgiLAorCQkJCXJlZ19hZGRyZXNzKTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCSp2YWwgPSBzdC0+cnhbMV07CisKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3NzU5X3NwaV9yZWFkX3JlZ18xNihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXU4IHJlZ19hZGRyZXNzLAorCQl1MTYgKnZhbCkKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzc1OV9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkucnhfYnVmID0gc3QtPnJ4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDMsCisJCX0sCisJfTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURFNzc1OV9SRUFEX1JFRyhyZWdfYWRkcmVzcyk7CisJc3QtPnR4WzFdID0gMDsKKwlzdC0+dHhbMl0gPSAwOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCh4ZmVycywgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnVzLCAmbXNnKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnN0LT51cy0+ZGV2LCAicHJvYmxlbSB3aGVuIHJlYWRpbmcgMTYgYml0IHJlZ2lzdGVyIDB4JTAyWCIsCisJCQkJcmVnX2FkZHJlc3MpOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJKnZhbCA9IChzdC0+cnhbMV0gPDwgOCkgfCBzdC0+cnhbMl07CisKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3NzU5X3NwaV9yZWFkX3JlZ180MChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXU4IHJlZ19hZGRyZXNzLAorCQl1NjQgKnZhbCkKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzc1OV9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkucnhfYnVmID0gc3QtPnJ4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDYsCisJCX0sCisJfTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURFNzc1OV9SRUFEX1JFRyhyZWdfYWRkcmVzcyk7CisJbWVtc2V0KCZzdC0+dHhbMV0sIDAgLCA1KTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeGZlcnMsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzdC0+dXMtPmRldiwgInByb2JsZW0gd2hlbiByZWFkaW5nIDQwIGJpdCByZWdpc3RlciAweCUwMlgiLAorCQkJCXJlZ19hZGRyZXNzKTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCSp2YWwgPSAoKHU2NClzdC0+cnhbMV0gPDwgMzIpIHwgKHN0LT5yeFsyXSA8PCAyNCkgfAorCQkoc3QtPnJ4WzNdIDw8IDE2KSB8IChzdC0+cnhbNF0gPDwgOCkgfCBzdC0+cnhbNV07CisKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzc1OV9yZWFkXzhiaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCWludCByZXQ7CisJdTggdmFsID0gMDsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisKKwlyZXQgPSBhZGU3NzU5X3NwaV9yZWFkX3JlZ184KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHZhbCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkZTc3NTlfcmVhZF8xNmJpdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJaW50IHJldDsKKwl1MTYgdmFsID0gMDsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisKKwlyZXQgPSBhZGU3NzU5X3NwaV9yZWFkX3JlZ18xNihkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCB2YWwpOworfQorCitzdGF0aWMgc3NpemVfdCBhZGU3NzU5X3JlYWRfNDBiaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCWludCByZXQ7CisJdTY0IHZhbCA9IDA7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCisJcmV0ID0gYWRlNzc1OV9zcGlfcmVhZF9yZWdfNDAoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbGx1XG4iLCB2YWwpOworfQorCitzdGF0aWMgc3NpemVfdCBhZGU3NzU5X3dyaXRlXzhiaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKwlpbnQgcmV0OworCWxvbmcgdmFsOworCisJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKwlyZXQgPSBhZGU3NzU5X3NwaV93cml0ZV9yZWdfOChkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgdmFsKTsKKworZXJyb3JfcmV0OgorCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkZTc3NTlfd3JpdGVfMTZiaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKwlpbnQgcmV0OworCWxvbmcgdmFsOworCisJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKwlyZXQgPSBhZGU3NzU5X3NwaV93cml0ZV9yZWdfMTYoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsIHZhbCk7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgaW50IGFkZTc3NTlfcmVzZXQoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCByZXQ7CisJdTE2IHZhbDsKKwlhZGU3NzU5X3NwaV9yZWFkX3JlZ18xNihkZXYsCisJCQlBREU3NzU5X01PREUsCisJCQkmdmFsKTsKKwl2YWwgfD0gMSA8PCA2OyAvKiBTb2Z0d2FyZSBDaGlwIFJlc2V0ICovCisJcmV0ID0gYWRlNzc1OV9zcGlfd3JpdGVfcmVnXzE2KGRldiwKKwkJCUFERTc3NTlfTU9ERSwKKwkJCXZhbCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZGU3NzU5X3dyaXRlX3Jlc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlpZiAobGVuIDwgMSkKKwkJcmV0dXJuIC0xOworCXN3aXRjaCAoYnVmWzBdKSB7CisJY2FzZSAnMSc6CisJY2FzZSAneSc6CisJY2FzZSAnWSc6CisJCXJldHVybiBhZGU3NzU5X3Jlc2V0KGRldik7CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9BRU5FUkdZKGFkZTc3NTlfcmVhZF80MGJpdCwgQURFNzc1OV9BRU5FUkdZKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0ZERU4oU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTlfcmVhZF8xNmJpdCwKKwkJYWRlNzc1OV93cml0ZV8xNmJpdCwKKwkJQURFNzc1OV9DRkRFTik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0NGTlVNKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU5X3JlYWRfOGJpdCwKKwkJYWRlNzc1OV93cml0ZV84Yml0LAorCQlBREU3NzU5X0NGTlVNKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0hLU1VNKGFkZTc3NTlfcmVhZF84Yml0LCBBREU3NzU5X0NIS1NVTSk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX1BIQ0FMKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU5X3JlYWRfMTZiaXQsCisJCWFkZTc3NTlfd3JpdGVfMTZiaXQsCisJCUFERTc3NTlfUEhDQUwpOworc3RhdGljIElJT19ERVZfQVRUUl9BUE9TKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU5X3JlYWRfMTZiaXQsCisJCWFkZTc3NTlfd3JpdGVfMTZiaXQsCisJCUFERTc3NTlfQVBPUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX1NBR0NZQyhTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1OV9yZWFkXzhiaXQsCisJCWFkZTc3NTlfd3JpdGVfOGJpdCwKKwkJQURFNzc1OV9TQUdDWUMpOworc3RhdGljIElJT19ERVZfQVRUUl9TQUdMVkwoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTlfcmVhZF84Yml0LAorCQlhZGU3NzU5X3dyaXRlXzhiaXQsCisJCUFERTc3NTlfU0FHTFZMKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfTElORUNZQyhTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1OV9yZWFkXzhiaXQsCisJCWFkZTc3NTlfd3JpdGVfOGJpdCwKKwkJQURFNzc1OV9MSU5FQ1lDKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfTEVORVJHWShhZGU3NzU5X3JlYWRfNDBiaXQsIEFERTc3NTlfTEVORVJHWSk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX1BHQV9HQUlOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU5X3JlYWRfOGJpdCwKKwkJYWRlNzc1OV93cml0ZV84Yml0LAorCQlBREU3NzU5X0dBSU4pOworc3RhdGljIElJT19ERVZfQVRUUl9BQ1RJVkVfUE9XRVJfR0FJTihTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1OV9yZWFkXzE2Yml0LAorCQlhZGU3NzU5X3dyaXRlXzE2Yml0LAorCQlBREU3NzU5X0FQR0FJTik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0NIX09GRigxLCBTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1OV9yZWFkXzhiaXQsCisJCWFkZTc3NTlfd3JpdGVfOGJpdCwKKwkJQURFNzc1OV9DSDFPUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0NIX09GRigyLCBTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1OV9yZWFkXzhiaXQsCisJCWFkZTc3NTlfd3JpdGVfOGJpdCwKKwkJQURFNzc1OV9DSDJPUyk7CisKK3N0YXRpYyBpbnQgYWRlNzc1OV9zZXRfaXJxKHN0cnVjdCBkZXZpY2UgKmRldiwgYm9vbCBlbmFibGUpCit7CisJaW50IHJldDsKKwl1OCBpcnFlbjsKKwlyZXQgPSBhZGU3NzU5X3NwaV9yZWFkX3JlZ184KGRldiwgQURFNzc1OV9JUlFFTiwgJmlycWVuKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCWlmIChlbmFibGUpCisJCWlycWVuIHw9IDEgPDwgMzsgLyogRW5hYmxlcyBhbiBpbnRlcnJ1cHQgd2hlbiBhIGRhdGEgaXMKKwkJCQkgICAgcHJlc2VudCBpbiB0aGUgd2F2ZWZvcm0gcmVnaXN0ZXIgKi8KKwllbHNlCisJCWlycWVuICY9IH4oMSA8PCAzKTsKKworCXJldCA9IGFkZTc3NTlfc3BpX3dyaXRlX3JlZ184KGRldiwgQURFNzc1OV9JUlFFTiwgaXJxZW4pOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworLyogUG93ZXIgZG93biB0aGUgZGV2aWNlICovCitpbnQgYWRlNzc1OV9zdG9wX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHJldDsKKwl1MTYgdmFsOworCWFkZTc3NTlfc3BpX3JlYWRfcmVnXzE2KGRldiwKKwkJCUFERTc3NTlfTU9ERSwKKwkJCSZ2YWwpOworCXZhbCB8PSAxIDw8IDQ7ICAvKiBBRCBjb252ZXJ0ZXJzIGNhbiBiZSB0dXJuZWQgb2ZmICovCisJcmV0ID0gYWRlNzc1OV9zcGlfd3JpdGVfcmVnXzE2KGRldiwKKwkJCUFERTc3NTlfTU9ERSwKKwkJCXZhbCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkZTc3NTlfaW5pdGlhbF9zZXR1cChzdHJ1Y3QgYWRlNzc1OV9zdGF0ZSAqc3QpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmc3QtPmluZGlvX2Rldi0+ZGV2OworCisJLyogdXNlIGxvdyBzcGkgc3BlZWQgZm9yIGluaXQgKi8KKwlzdC0+dXMtPm1vZGUgPSBTUElfTU9ERV8zOworCXNwaV9zZXR1cChzdC0+dXMpOworCisJLyogRGlzYWJsZSBJUlEgKi8KKwlyZXQgPSBhZGU3NzU5X3NldF9pcnEoZGV2LCBmYWxzZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgImRpc2FibGUgaXJxIGZhaWxlZCIpOworCQlnb3RvIGVycl9yZXQ7CisJfQorCisJYWRlNzc1OV9yZXNldChkZXYpOworCW1zbGVlcChBREU3NzU5X1NUQVJUVVBfREVMQVkpOworCitlcnJfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkZTc3NTlfcmVhZF9mcmVxdWVuY3koc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCWludCByZXQsIGxlbiA9IDA7CisJdTE2IHQ7CisJaW50IHNwczsKKwlyZXQgPSBhZGU3NzU5X3NwaV9yZWFkX3JlZ18xNihkZXYsCisJCQlBREU3NzU5X01PREUsCisJCQkmdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXQgPSAodCA+PiAzKSAmIDB4MzsKKwlzcHMgPSAyNzkwMCAvICgxICsgdCk7CisKKwlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVkIFNQU1xuIiwgc3BzKTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBhZGU3NzU5X3dyaXRlX2ZyZXF1ZW5jeShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3NzU5X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwlpbnQgcmV0OworCXUxNiByZWcsIHQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCXQgPSAoMjc5MDAgLyB2YWwpOworCWlmICh0ID4gMCkKKwkJdC0tOworCisJaWYgKHQgPiAxKQorCQlzdC0+dXMtPm1heF9zcGVlZF9oeiA9IEFERTc3NTlfU1BJX1NMT1c7CisJZWxzZQorCQlzdC0+dXMtPm1heF9zcGVlZF9oeiA9IEFERTc3NTlfU1BJX0ZBU1Q7CisKKwlyZXQgPSBhZGU3NzU5X3NwaV9yZWFkX3JlZ18xNihkZXYsCisJCQlBREU3NzU5X01PREUsCisJCQkmcmVnKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJlZyAmPSB+KDMgPDwgMTMpOworCXJlZyB8PSB0IDw8IDEzOworCisJcmV0ID0gYWRlNzc1OV9zcGlfd3JpdGVfcmVnXzE2KGRldiwKKwkJCUFERTc3NTlfTU9ERSwKKwkJCXJlZyk7CisKK291dDoKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KK3N0YXRpYyBJSU9fREVWX0FUVFJfVEVNUF9SQVcoYWRlNzc1OV9yZWFkXzhiaXQpOworc3RhdGljIElJT19DT05TVF9BVFRSKHRlbXBfb2Zmc2V0LCAiNzAgQyIpOworc3RhdGljIElJT19DT05TVF9BVFRSKHRlbXBfc2NhbGUsICIxIEMiKTsKKworc3RhdGljIElJT19ERVZfQVRUUl9TQU1QX0ZSRVEoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTlfcmVhZF9mcmVxdWVuY3ksCisJCWFkZTc3NTlfd3JpdGVfZnJlcXVlbmN5KTsKKworc3RhdGljIElJT19ERVZfQVRUUl9SRVNFVChhZGU3NzU5X3dyaXRlX3Jlc2V0KTsKKworc3RhdGljIElJT19DT05TVF9BVFRSX1NBTVBfRlJFUV9BVkFJTCgiMjc5MDAgMTQwMDAgNzAwMCAzNTAwIik7CisKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihuYW1lLCAiYWRlNzc1OSIpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRlNzc1OV9ldmVudF9hdHRyaWJ1dGVzW10gPSB7CisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWRlNzc1OV9ldmVudF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWRlNzc1OV9ldmVudF9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkZTc3NTlfYXR0cmlidXRlc1tdID0geworCSZpaW9fZGV2X2F0dHJfdGVtcF9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfdGVtcF9vZmZzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfdGVtcF9zY2FsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfc2FtcGxpbmdfZnJlcXVlbmN5LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX3NhbXBsaW5nX2ZyZXF1ZW5jeV9hdmFpbGFibGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3Jlc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX25hbWUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3BoY2FsLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jZmRlbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYWVuZXJneS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2ZudW0uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2Fwb3MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3NhZ2N5Yy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfc2FnbHZsLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9saW5lY3ljLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9sZW5lcmd5LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jaGtzdW0uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3BnYV9nYWluLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hY3RpdmVfcG93ZXJfZ2Fpbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2hvZmZfMS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2hvZmZfMi5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZGU3NzU5X2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZGU3NzU5X2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZGU3NzU5X3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJaW50IHJldCwgcmVnZG9uZSA9IDA7CisJc3RydWN0IGFkZTc3NTlfc3RhdGUgKnN0ID0ga3phbGxvYyhzaXplb2YgKnN0LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0KSB7CisJCXJldCA9ICAtRU5PTUVNOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJLyogdGhpcyBpcyBvbmx5IHVzZWQgZm9yIHJlbW92YWwgcHVycG9zZXMgKi8KKwlzcGlfc2V0X2RydmRhdGEoc3BpLCBzdCk7CisKKwkvKiBBbGxvY2F0ZSB0aGUgY29tbXMgYnVmZmVycyAqLworCXN0LT5yeCA9IGt6YWxsb2Moc2l6ZW9mKCpzdC0+cngpKkFERTc3NTlfTUFYX1JYLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QtPnJ4ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3N0OworCX0KKwlzdC0+dHggPSBremFsbG9jKHNpemVvZigqc3QtPnR4KSpBREU3NzU5X01BWF9UWCwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0LT50eCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9yeDsKKwl9CisJc3QtPnVzID0gc3BpOworCW11dGV4X2luaXQoJnN0LT5idWZfbG9jayk7CisJLyogc2V0dXAgdGhlIGluZHVzdHJpYWxpbyBkcml2ZXIgYWxsb2NhdGVkIGVsZW1lbnRzICovCisJc3QtPmluZGlvX2RldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoc3QtPmluZGlvX2RldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV90eDsKKwl9CisKKwlzdC0+aW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJnNwaS0+ZGV2OworCXN0LT5pbmRpb19kZXYtPm51bV9pbnRlcnJ1cHRfbGluZXMgPSAxOworCXN0LT5pbmRpb19kZXYtPmV2ZW50X2F0dHJzID0gJmFkZTc3NTlfZXZlbnRfYXR0cmlidXRlX2dyb3VwOworCXN0LT5pbmRpb19kZXYtPmF0dHJzID0gJmFkZTc3NTlfYXR0cmlidXRlX2dyb3VwOworCXN0LT5pbmRpb19kZXYtPmRldl9kYXRhID0gKHZvaWQgKikoc3QpOworCXN0LT5pbmRpb19kZXYtPmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRTsKKwlzdC0+aW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJcmV0ID0gYWRlNzc1OV9jb25maWd1cmVfcmluZyhzdC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2OworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihzdC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3VucmVnX3JpbmdfZnVuY3M7CisJcmVnZG9uZSA9IDE7CisKKwlyZXQgPSBhZGU3NzU5X2luaXRpYWxpemVfcmluZyhzdC0+aW5kaW9fZGV2LT5yaW5nKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIHJpbmdcbiIpOworCQlnb3RvIGVycm9yX3VucmVnX3JpbmdfZnVuY3M7CisJfQorCisJaWYgKHNwaS0+aXJxKSB7CisJCXJldCA9IGlpb19yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShzcGktPmlycSwKKwkJCQlzdC0+aW5kaW9fZGV2LAorCQkJCTAsCisJCQkJSVJRRl9UUklHR0VSX0ZBTExJTkcsCisJCQkJImFkZTc3NTkiKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfdW5pbml0aWFsaXplX3Jpbmc7CisKKwkJcmV0ID0gYWRlNzc1OV9wcm9iZV90cmlnZ2VyKHN0LT5pbmRpb19kZXYpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl91bnJlZ2lzdGVyX2xpbmU7CisJfQorCisJLyogR2V0IHRoZSBkZXZpY2UgaW50byBhIHNhbmUgaW5pdGlhbCBzdGF0ZSAqLworCXJldCA9IGFkZTc3NTlfaW5pdGlhbF9zZXR1cChzdCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZW1vdmVfdHJpZ2dlcjsKKwlyZXR1cm4gMDsKKworZXJyb3JfcmVtb3ZlX3RyaWdnZXI6CisJaWYgKHN0LT5pbmRpb19kZXYtPm1vZGVzICYgSU5ESU9fUklOR19UUklHR0VSRUQpCisJCWFkZTc3NTlfcmVtb3ZlX3RyaWdnZXIoc3QtPmluZGlvX2Rldik7CitlcnJvcl91bnJlZ2lzdGVyX2xpbmU6CisJaWYgKHN0LT5pbmRpb19kZXYtPm1vZGVzICYgSU5ESU9fUklOR19UUklHR0VSRUQpCisJCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKHN0LT5pbmRpb19kZXYsIDApOworZXJyb3JfdW5pbml0aWFsaXplX3Jpbmc6CisJYWRlNzc1OV91bmluaXRpYWxpemVfcmluZyhzdC0+aW5kaW9fZGV2LT5yaW5nKTsKK2Vycm9yX3VucmVnX3JpbmdfZnVuY3M6CisJYWRlNzc1OV91bmNvbmZpZ3VyZV9yaW5nKHN0LT5pbmRpb19kZXYpOworZXJyb3JfZnJlZV9kZXY6CisJaWYgKHJlZ2RvbmUpCisJCWlpb19kZXZpY2VfdW5yZWdpc3RlcihzdC0+aW5kaW9fZGV2KTsKKwllbHNlCisJCWlpb19mcmVlX2RldmljZShzdC0+aW5kaW9fZGV2KTsKK2Vycm9yX2ZyZWVfdHg6CisJa2ZyZWUoc3QtPnR4KTsKK2Vycm9yX2ZyZWVfcng6CisJa2ZyZWUoc3QtPnJ4KTsKK2Vycm9yX2ZyZWVfc3Q6CisJa2ZyZWUoc3QpOworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKKy8qIGZpeG1lLCBjb25maXJtIG9yZGVyaW5nIGluIHRoaXMgZnVuY3Rpb24gKi8KK3N0YXRpYyBpbnQgYWRlNzc1OV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBhZGU3NzU5X3N0YXRlICpzdCA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBzdC0+aW5kaW9fZGV2OworCisJcmV0ID0gYWRlNzc1OV9zdG9wX2RldmljZSgmKGluZGlvX2Rldi0+ZGV2KSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfcmV0OworCisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKworCWFkZTc3NTlfcmVtb3ZlX3RyaWdnZXIoaW5kaW9fZGV2KTsKKwlpZiAoc3BpLT5pcnEgJiYgZ3Bpb19pc192YWxpZChpcnFfdG9fZ3BpbyhzcGktPmlycSkpID4gMCkKKwkJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoaW5kaW9fZGV2LCAwKTsKKworCWFkZTc3NTlfdW5pbml0aWFsaXplX3JpbmcoaW5kaW9fZGV2LT5yaW5nKTsKKwlhZGU3NzU5X3VuY29uZmlndXJlX3JpbmcoaW5kaW9fZGV2KTsKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlrZnJlZShzdC0+dHgpOworCWtmcmVlKHN0LT5yeCk7CisJa2ZyZWUoc3QpOworCisJcmV0dXJuIDA7CisKK2Vycl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFkZTc3NTlfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFkZTc3NTkiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IGFkZTc3NTlfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFkZTc3NTlfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGFkZTc3NTlfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZhZGU3NzU5X2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChhZGU3NzU5X2luaXQpOworCitzdGF0aWMgX19leGl0IHZvaWQgYWRlNzc1OV9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZGU3NzU5X2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhZGU3NzU5X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJCYXJyeSBTb25nIDwyMWNuYmFvQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQURFNzc1OSBBY3RpdmUgRW5lcmd5IE1ldGVyaW5nIElDIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU5LmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTNkZWEyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU5LmgKQEAgLTAsMCArMSwxMjIgQEAKKyNpZm5kZWYgX0FERTc3NTlfSAorI2RlZmluZSBfQURFNzc1OV9ICisKKyNkZWZpbmUgQURFNzc1OV9XQVZFRk9STSAgMHgwMQorI2RlZmluZSBBREU3NzU5X0FFTkVSR1kgICAweDAyCisjZGVmaW5lIEFERTc3NTlfUlNURU5FUkdZIDB4MDMKKyNkZWZpbmUgQURFNzc1OV9TVEFUVVMgICAgMHgwNAorI2RlZmluZSBBREU3NzU5X1JTVFNUQVRVUyAweDA1CisjZGVmaW5lIEFERTc3NTlfTU9ERSAgICAgIDB4MDYKKyNkZWZpbmUgQURFNzc1OV9DRkRFTiAgICAgMHgwNworI2RlZmluZSBBREU3NzU5X0NIMU9TICAgICAweDA4CisjZGVmaW5lIEFERTc3NTlfQ0gyT1MgICAgIDB4MDkKKyNkZWZpbmUgQURFNzc1OV9HQUlOICAgICAgMHgwQQorI2RlZmluZSBBREU3NzU5X0FQR0FJTiAgICAweDBCCisjZGVmaW5lIEFERTc3NTlfUEhDQUwgICAgIDB4MEMKKyNkZWZpbmUgQURFNzc1OV9BUE9TICAgICAgMHgwRAorI2RlZmluZSBBREU3NzU5X1pYVE9VVCAgICAweDBFCisjZGVmaW5lIEFERTc3NTlfU0FHQ1lDICAgIDB4MEYKKyNkZWZpbmUgQURFNzc1OV9JUlFFTiAgICAgMHgxMAorI2RlZmluZSBBREU3NzU5X1NBR0xWTCAgICAweDExCisjZGVmaW5lIEFERTc3NTlfVEVNUCAgICAgIDB4MTIKKyNkZWZpbmUgQURFNzc1OV9MSU5FQ1lDICAgMHgxMworI2RlZmluZSBBREU3NzU5X0xFTkVSR1kgICAweDE0CisjZGVmaW5lIEFERTc3NTlfQ0ZOVU0gICAgIDB4MTUKKyNkZWZpbmUgQURFNzc1OV9DSEtTVU0gICAgMHgxRQorI2RlZmluZSBBREU3NzU5X0RJRVJFViAgICAweDFGCisKKyNkZWZpbmUgQURFNzc1OV9SRUFEX1JFRyhhKSAgICBhCisjZGVmaW5lIEFERTc3NTlfV1JJVEVfUkVHKGEpICgoYSkgfCAweDgwKQorCisjZGVmaW5lIEFERTc3NTlfTUFYX1RYICAgIDYKKyNkZWZpbmUgQURFNzc1OV9NQVhfUlggICAgNgorI2RlZmluZSBBREU3NzU5X1NUQVJUVVBfREVMQVkgMQorCisjZGVmaW5lIEFERTc3NTlfU1BJX1NMT1cJKHUzMikoMzAwICogMTAwMCkKKyNkZWZpbmUgQURFNzc1OV9TUElfQlVSU1QJKHUzMikoMTAwMCAqIDEwMDApCisjZGVmaW5lIEFERTc3NTlfU1BJX0ZBU1QJKHUzMikoMjAwMCAqIDEwMDApCisKKyNkZWZpbmUgRFJJVkVSX05BTUUJCSJhZGU3NzU5IgorCisvKioKKyAqIHN0cnVjdCBhZGU3NzU5X3N0YXRlIC0gZGV2aWNlIGluc3RhbmNlIHNwZWNpZmljIGRhdGEKKyAqIEB1czoJCQlhY3R1YWwgc3BpX2RldmljZQorICogQHdvcmtfdHJpZ2dlcl90b19yaW5nOiBiaCBmb3IgdHJpZ2dlcmVkIGV2ZW50IGhhbmRsaW5nCisgKiBAaW50ZXI6CQl1c2VkIHRvIGNoZWNrIGlmIG5ldyBpbnRlcnJ1cHQgaGFzIGJlZW4gdHJpZ2dlcmVkCisgKiBAbGFzdF90aW1lc3RhbXA6CXBhc3NpbmcgdGltZXN0YW1wIGZyb20gdGggdG8gYmggb2YgaW50ZXJydXB0IGhhbmRsZXIKKyAqIEBpbmRpb19kZXY6CQlpbmR1c3RyaWFsIEkvTyBkZXZpY2Ugc3RydWN0dXJlCisgKiBAdHJpZzoJCWRhdGEgcmVhZHkgdHJpZ2dlciByZWdpc3RlcmVkIHdpdGggaWlvCisgKiBAdHg6CQkJdHJhbnNtaXQgYnVmZmVyCisgKiBAcng6CQkJcmVjaWV2ZSBidWZmZXIKKyAqIEBidWZfbG9jazoJCW11dGV4IHRvIHByb3RlY3QgdHggYW5kIHJ4CisgKiovCitzdHJ1Y3QgYWRlNzc1OV9zdGF0ZSB7CisJc3RydWN0IHNwaV9kZXZpY2UJCSp1czsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCXdvcmtfdHJpZ2dlcl90b19yaW5nOworCXM2NAkJCQlsYXN0X3RpbWVzdGFtcDsKKwlzdHJ1Y3QgaWlvX2RldgkJCSppbmRpb19kZXY7CisJc3RydWN0IGlpb190cmlnZ2VyCQkqdHJpZzsKKwl1OAkJCQkqdHg7CisJdTgJCQkJKnJ4OworCXN0cnVjdCBtdXRleAkJCWJ1Zl9sb2NrOworfTsKKyNpZiBkZWZpbmVkKENPTkZJR19JSU9fUklOR19CVUZGRVIpICYmIGRlZmluZWQoVEhJU19IQVNfUklOR19CVUZGRVJfU1VQUE9SVCkKKy8qIEF0IHRoZSBtb21lbnQgdHJpZ2dlcnMgYXJlIG9ubHkgdXNlZCBmb3IgcmluZyBidWZmZXIKKyAqIGZpbGxpbmcuIFRoaXMgbWF5IGNoYW5nZSEKKyAqLworCitlbnVtIGFkZTc3NTlfc2NhbiB7CisJQURFNzc1OV9TQ0FOX0FDVElWRV9QT1dFUiwKKwlBREU3NzU5X1NDQU5fQ0gxX0NIMiwKKwlBREU3NzU5X1NDQU5fQ0gxLAorCUFERTc3NTlfU0NBTl9DSDIsCit9OworCit2b2lkIGFkZTc3NTlfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CitpbnQgYWRlNzc1OV9wcm9iZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOworCitzc2l6ZV90IGFkZTc3NTlfcmVhZF9kYXRhX2Zyb21fcmluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpOworCisKK2ludCBhZGU3NzU5X2NvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwordm9pZCBhZGU3NzU5X3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKK2ludCBhZGU3NzU5X2luaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKTsKK3ZvaWQgYWRlNzc1OV91bmluaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKTsKKyNlbHNlIC8qIENPTkZJR19JSU9fUklOR19CVUZGRVIgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGFkZTc3NTlfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKK30KK3N0YXRpYyBpbmxpbmUgaW50IGFkZTc3NTlfcHJvYmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHNzaXplX3QKK2FkZTc3NTlfcmVhZF9kYXRhX2Zyb21fcmluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRlNzc1OV9jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSB2b2lkIGFkZTc3NTlfdW5jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworfQorc3RhdGljIGlubGluZSBpbnQgYWRlNzc1OV9pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGU3NzU5X3VuaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpCit7Cit9CisjZW5kaWYgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzg1NC1pMmMuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzg1NC1pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTc4ZTdiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3ODU0LWkyYy5jCkBAIC0wLDAgKzEsMjcyIEBACisvKgorICogQURFNzg1NC81OC82OC83OCBQb2x5cGhhc2UgTXVsdGlmdW5jdGlvbiBFbmVyZ3kgTWV0ZXJpbmcgSUMgRHJpdmVyIChJMkMgQnVzKQorICoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgImFkZTc4NTQuaCIKKworc3RhdGljIGludCBhZGU3ODU0X2kyY193cml0ZV9yZWdfOChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXUxNiByZWdfYWRkcmVzcywKKwkJdTggdmFsdWUpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkZTc4NTRfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSAocmVnX2FkZHJlc3MgPj4gOCkgJiAweEZGOworCXN0LT50eFsxXSA9IHJlZ19hZGRyZXNzICYgMHhGRjsKKwlzdC0+dHhbMl0gPSB2YWx1ZTsKKworCXJldCA9IGkyY19tYXN0ZXJfc2VuZChzdC0+aTJjLCBzdC0+dHgsIDMpOworCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRlNzg1NF9pMmNfd3JpdGVfcmVnXzE2KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTE2IHJlZ19hZGRyZXNzLAorCQl1MTYgdmFsdWUpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkZTc4NTRfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSAocmVnX2FkZHJlc3MgPj4gOCkgJiAweEZGOworCXN0LT50eFsxXSA9IHJlZ19hZGRyZXNzICYgMHhGRjsKKwlzdC0+dHhbMl0gPSAodmFsdWUgPj4gOCkgJiAweEZGOworCXN0LT50eFszXSA9IHZhbHVlICYgMHhGRjsKKworCXJldCA9IGkyY19tYXN0ZXJfc2VuZChzdC0+aTJjLCBzdC0+dHgsIDQpOworCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRlNzg1NF9pMmNfd3JpdGVfcmVnXzI0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTE2IHJlZ19hZGRyZXNzLAorCQl1MzIgdmFsdWUpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkZTc4NTRfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSAocmVnX2FkZHJlc3MgPj4gOCkgJiAweEZGOworCXN0LT50eFsxXSA9IHJlZ19hZGRyZXNzICYgMHhGRjsKKwlzdC0+dHhbMl0gPSAodmFsdWUgPj4gMTYpICYgMHhGRjsKKwlzdC0+dHhbM10gPSAodmFsdWUgPj4gOCkgJiAweEZGOworCXN0LT50eFs0XSA9IHZhbHVlICYgMHhGRjsKKworCXJldCA9IGkyY19tYXN0ZXJfc2VuZChzdC0+aTJjLCBzdC0+dHgsIDUpOworCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRlNzg1NF9pMmNfd3JpdGVfcmVnXzMyKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTE2IHJlZ19hZGRyZXNzLAorCQl1MzIgdmFsdWUpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkZTc4NTRfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSAocmVnX2FkZHJlc3MgPj4gOCkgJiAweEZGOworCXN0LT50eFsxXSA9IHJlZ19hZGRyZXNzICYgMHhGRjsKKwlzdC0+dHhbMl0gPSAodmFsdWUgPj4gMjQpICYgMHhGRjsKKwlzdC0+dHhbM10gPSAodmFsdWUgPj4gMTYpICYgMHhGRjsKKwlzdC0+dHhbNF0gPSAodmFsdWUgPj4gOCkgJiAweEZGOworCXN0LT50eFs1XSA9IHZhbHVlICYgMHhGRjsKKworCXJldCA9IGkyY19tYXN0ZXJfc2VuZChzdC0+aTJjLCBzdC0+dHgsIDYpOworCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRlNzg1NF9pMmNfcmVhZF9yZWdfOChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXUxNiByZWdfYWRkcmVzcywKKwkJdTggKnZhbCkKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkZTc4NTRfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IChyZWdfYWRkcmVzcyA+PiA4KSAmIDB4RkY7CisJc3QtPnR4WzFdID0gcmVnX2FkZHJlc3MgJiAweEZGOworCisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKHN0LT5pMmMsIHN0LT50eCwgMik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBpMmNfbWFzdGVyX3JlY3Yoc3QtPmkyYywgc3QtPnJ4LCAxKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCSp2YWwgPSBzdC0+cnhbMF07CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRlNzg1NF9pMmNfcmVhZF9yZWdfMTYoc3RydWN0IGRldmljZSAqZGV2LAorCQl1MTYgcmVnX2FkZHJlc3MsCisJCXUxNiAqdmFsKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gKHJlZ19hZGRyZXNzID4+IDgpICYgMHhGRjsKKwlzdC0+dHhbMV0gPSByZWdfYWRkcmVzcyAmIDB4RkY7CisKKwlyZXQgPSBpMmNfbWFzdGVyX3NlbmQoc3QtPmkyYywgc3QtPnR4LCAyKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJldCA9IGkyY19tYXN0ZXJfcmVjdihzdC0+aTJjLCBzdC0+cngsIDIpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJKnZhbCA9IChzdC0+cnhbMF0gPDwgOCkgfCBzdC0+cnhbMV07CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRlNzg1NF9pMmNfcmVhZF9yZWdfMjQoc3RydWN0IGRldmljZSAqZGV2LAorCQl1MTYgcmVnX2FkZHJlc3MsCisJCXUzMiAqdmFsKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gKHJlZ19hZGRyZXNzID4+IDgpICYgMHhGRjsKKwlzdC0+dHhbMV0gPSByZWdfYWRkcmVzcyAmIDB4RkY7CisKKwlyZXQgPSBpMmNfbWFzdGVyX3NlbmQoc3QtPmkyYywgc3QtPnR4LCAyKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJldCA9IGkyY19tYXN0ZXJfcmVjdihzdC0+aTJjLCBzdC0+cngsIDMpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJKnZhbCA9IChzdC0+cnhbMF0gPDwgMTYpIHwgKHN0LT5yeFsxXSA8PCA4KSB8IHN0LT5yeFsyXTsKK291dDoKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3ODU0X2kyY19yZWFkX3JlZ18zMihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXUxNiByZWdfYWRkcmVzcywKKwkJdTMyICp2YWwpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3ODU0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSAocmVnX2FkZHJlc3MgPj4gOCkgJiAweEZGOworCXN0LT50eFsxXSA9IHJlZ19hZGRyZXNzICYgMHhGRjsKKworCXJldCA9IGkyY19tYXN0ZXJfc2VuZChzdC0+aTJjLCBzdC0+dHgsIDIpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcmV0ID0gaTJjX21hc3Rlcl9yZWN2KHN0LT5pMmMsIHN0LT5yeCwgMyk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwkqdmFsID0gKHN0LT5yeFswXSA8PCAyNCkgfCAoc3QtPnJ4WzFdIDw8IDE2KSB8IChzdC0+cnhbMl0gPDwgOCkgfCBzdC0+cnhbM107CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkZTc4NTRfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBhZGU3ODU0X3N0YXRlICpzdCA9IGt6YWxsb2Moc2l6ZW9mICpzdCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdCkgeworCQlyZXQgPSAgLUVOT01FTTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBzdCk7CisJc3QtPnJlYWRfcmVnXzggPSBhZGU3ODU0X2kyY19yZWFkX3JlZ184OworCXN0LT5yZWFkX3JlZ18xNiA9IGFkZTc4NTRfaTJjX3JlYWRfcmVnXzE2OworCXN0LT5yZWFkX3JlZ18yNCA9IGFkZTc4NTRfaTJjX3JlYWRfcmVnXzI0OworCXN0LT5yZWFkX3JlZ18zMiA9IGFkZTc4NTRfaTJjX3JlYWRfcmVnXzMyOworCXN0LT53cml0ZV9yZWdfOCA9IGFkZTc4NTRfaTJjX3dyaXRlX3JlZ184OworCXN0LT53cml0ZV9yZWdfMTYgPSBhZGU3ODU0X2kyY193cml0ZV9yZWdfMTY7CisJc3QtPndyaXRlX3JlZ18yNCA9IGFkZTc4NTRfaTJjX3dyaXRlX3JlZ18yNDsKKwlzdC0+d3JpdGVfcmVnXzMyID0gYWRlNzg1NF9pMmNfd3JpdGVfcmVnXzMyOworCXN0LT5pMmMgPSBjbGllbnQ7CisJc3QtPmlycSA9IGNsaWVudC0+aXJxOworCisJcmV0ID0gYWRlNzg1NF9wcm9iZShzdCwgJmNsaWVudC0+ZGV2KTsKKwlpZiAocmV0KSB7CisJCWtmcmVlKHN0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhZGU3ODU0X2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlyZXR1cm4gYWRlNzg1NF9yZW1vdmUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgYWRlNzg1NF9pZFtdID0geworCXsgImFkZTc4NTQiLCAwIH0sCisJeyAiYWRlNzg1OCIsIDAgfSwKKwl7ICJhZGU3ODY4IiwgMCB9LAorCXsgImFkZTc4NzgiLCAwIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGFkZTc4NTRfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYWRlNzg1NF9pMmNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFkZTc4NTQiLAorCX0sCisJLnByb2JlICAgID0gYWRlNzg1NF9pMmNfcHJvYmUsCisJLnJlbW92ZSAgID0gX19kZXZleGl0X3AoYWRlNzg1NF9pMmNfcmVtb3ZlKSwKKwkuaWRfdGFibGUgPSBhZGU3ODU0X2lkLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWRlNzg1NF9pMmNfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmYWRlNzg1NF9pMmNfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGFkZTc4NTRfaTJjX2luaXQpOworCitzdGF0aWMgX19leGl0IHZvaWQgYWRlNzg1NF9pMmNfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZhZGU3ODU0X2kyY19kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoYWRlNzg1NF9pMmNfZXhpdCk7CisKKworTU9EVUxFX0FVVEhPUigiQmFycnkgU29uZyA8MjFjbmJhb0BnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFERTc4NTQvNTgvNjgvNzggUG9seXBoYXNlIE11bHRpZnVuY3Rpb24gRW5lcmd5IE1ldGVyaW5nIElDIEkyQyBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzg1NC1zcGkuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzg1NC1zcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTU4MTAzZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzg1NC1zcGkuYwpAQCAtMCwwICsxLDM2MCBAQAorLyoKKyAqIEFERTc4NTQvNTgvNjgvNzggUG9seXBoYXNlIE11bHRpZnVuY3Rpb24gRW5lcmd5IE1ldGVyaW5nIElDIERyaXZlciAoU1BJIEJ1cykKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiYWRlNzg1NC5oIgorCitzdGF0aWMgaW50IGFkZTc4NTRfc3BpX3dyaXRlX3JlZ184KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTE2IHJlZ19hZGRyZXNzLAorCQl1OCB2YWx1ZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3ODU0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gNCwKKwkJfQorCX07CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IEFERTc4NTRfV1JJVEVfUkVHOworCXN0LT50eFsxXSA9IChyZWdfYWRkcmVzcyA+PiA4KSAmIDB4RkY7CisJc3QtPnR4WzJdID0gcmVnX2FkZHJlc3MgJiAweEZGOworCXN0LT50eFszXSA9IHZhbHVlICYgMHhGRjsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeGZlcnMsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zcGksICZtc2cpOworCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRlNzg1NF9zcGlfd3JpdGVfcmVnXzE2KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTE2IHJlZ19hZGRyZXNzLAorCQl1MTYgdmFsdWUpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyc1tdID0geworCQl7CisJCQkudHhfYnVmID0gc3QtPnR4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDUsCisJCX0KKwl9OworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSBBREU3ODU0X1dSSVRFX1JFRzsKKwlzdC0+dHhbMV0gPSAocmVnX2FkZHJlc3MgPj4gOCkgJiAweEZGOworCXN0LT50eFsyXSA9IHJlZ19hZGRyZXNzICYgMHhGRjsKKwlzdC0+dHhbM10gPSAodmFsdWUgPj4gOCkgJiAweEZGOworCXN0LT50eFs0XSA9IHZhbHVlICYgMHhGRjsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeGZlcnMsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zcGksICZtc2cpOworCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRlNzg1NF9zcGlfd3JpdGVfcmVnXzI0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTE2IHJlZ19hZGRyZXNzLAorCQl1MzIgdmFsdWUpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyc1tdID0geworCQl7CisJCQkudHhfYnVmID0gc3QtPnR4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDYsCisJCX0KKwl9OworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSBBREU3ODU0X1dSSVRFX1JFRzsKKwlzdC0+dHhbMV0gPSAocmVnX2FkZHJlc3MgPj4gOCkgJiAweEZGOworCXN0LT50eFsyXSA9IHJlZ19hZGRyZXNzICYgMHhGRjsKKwlzdC0+dHhbM10gPSAodmFsdWUgPj4gMTYpICYgMHhGRjsKKwlzdC0+dHhbNF0gPSAodmFsdWUgPj4gOCkgJiAweEZGOworCXN0LT50eFs1XSA9IHZhbHVlICYgMHhGRjsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeGZlcnMsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zcGksICZtc2cpOworCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRlNzg1NF9zcGlfd3JpdGVfcmVnXzMyKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTE2IHJlZ19hZGRyZXNzLAorCQl1MzIgdmFsdWUpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyc1tdID0geworCQl7CisJCQkudHhfYnVmID0gc3QtPnR4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDcsCisJCX0KKwl9OworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSBBREU3ODU0X1dSSVRFX1JFRzsKKwlzdC0+dHhbMV0gPSAocmVnX2FkZHJlc3MgPj4gOCkgJiAweEZGOworCXN0LT50eFsyXSA9IHJlZ19hZGRyZXNzICYgMHhGRjsKKwlzdC0+dHhbM10gPSAodmFsdWUgPj4gMjQpICYgMHhGRjsKKwlzdC0+dHhbNF0gPSAodmFsdWUgPj4gMTYpICYgMHhGRjsKKwlzdC0+dHhbNV0gPSAodmFsdWUgPj4gOCkgJiAweEZGOworCXN0LT50eFs2XSA9IHZhbHVlICYgMHhGRjsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeGZlcnMsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zcGksICZtc2cpOworCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRlNzg1NF9zcGlfcmVhZF9yZWdfOChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXUxNiByZWdfYWRkcmVzcywKKwkJdTggKnZhbCkKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gNCwKKwkJfSwKKwl9OworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKworCXN0LT50eFswXSA9IEFERTc4NTRfUkVBRF9SRUc7CisJc3QtPnR4WzFdID0gKHJlZ19hZGRyZXNzID4+IDgpICYgMHhGRjsKKwlzdC0+dHhbMl0gPSByZWdfYWRkcmVzcyAmIDB4RkY7CisJc3QtPnR4WzNdID0gMDsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeGZlcnMsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zcGksICZtc2cpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3QtPnNwaS0+ZGV2LCAicHJvYmxlbSB3aGVuIHJlYWRpbmcgOCBiaXQgcmVnaXN0ZXIgMHglMDJYIiwKKwkJCQlyZWdfYWRkcmVzcyk7CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwkqdmFsID0gc3QtPnJ4WzNdOworCitlcnJvcl9yZXQ6CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRlNzg1NF9zcGlfcmVhZF9yZWdfMTYoc3RydWN0IGRldmljZSAqZGV2LAorCQl1MTYgcmVnX2FkZHJlc3MsCisJCXUxNiAqdmFsKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3ODU0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbXSA9IHsKKwkJeworCQkJLnR4X2J1ZiA9IHN0LT50eCwKKwkJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJCS5sZW4gPSA1LAorCQl9LAorCX07CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IEFERTc4NTRfUkVBRF9SRUc7CisJc3QtPnR4WzFdID0gKHJlZ19hZGRyZXNzID4+IDgpICYgMHhGRjsKKwlzdC0+dHhbMl0gPSByZWdfYWRkcmVzcyAmIDB4RkY7CisJc3QtPnR4WzNdID0gMDsKKwlzdC0+dHhbNF0gPSAwOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCh4ZmVycywgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNwaSwgJm1zZyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzdC0+c3BpLT5kZXYsICJwcm9ibGVtIHdoZW4gcmVhZGluZyAxNiBiaXQgcmVnaXN0ZXIgMHglMDJYIiwKKwkJCQlyZWdfYWRkcmVzcyk7CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwkqdmFsID0gKHN0LT5yeFszXSA8PCA4KSB8IHN0LT5yeFs0XTsKKworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkZTc4NTRfc3BpX3JlYWRfcmVnXzI0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTE2IHJlZ19hZGRyZXNzLAorCQl1MzIgKnZhbCkKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gNiwKKwkJfSwKKwl9OworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKworCXN0LT50eFswXSA9IEFERTc4NTRfUkVBRF9SRUc7CisJc3QtPnR4WzFdID0gKHJlZ19hZGRyZXNzID4+IDgpICYgMHhGRjsKKwlzdC0+dHhbMl0gPSByZWdfYWRkcmVzcyAmIDB4RkY7CisJc3QtPnR4WzNdID0gMDsKKwlzdC0+dHhbNF0gPSAwOworCXN0LT50eFs1XSA9IDA7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKHhmZXJzLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c3BpLCAmbXNnKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnN0LT5zcGktPmRldiwgInByb2JsZW0gd2hlbiByZWFkaW5nIDI0IGJpdCByZWdpc3RlciAweCUwMlgiLAorCQkJCXJlZ19hZGRyZXNzKTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCSp2YWwgPSAoc3QtPnJ4WzNdIDw8IDE2KSB8IChzdC0+cnhbNF0gPDwgOCkgfCBzdC0+cnhbNV07CisKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3ODU0X3NwaV9yZWFkX3JlZ18zMihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXUxNiByZWdfYWRkcmVzcywKKwkJdTMyICp2YWwpCit7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkZTc4NTRfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCWludCByZXQ7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyc1tdID0geworCQl7CisJCQkudHhfYnVmID0gc3QtPnR4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDcsCisJCX0sCisJfTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisKKwlzdC0+dHhbMF0gPSBBREU3ODU0X1JFQURfUkVHOworCXN0LT50eFsxXSA9IChyZWdfYWRkcmVzcyA+PiA4KSAmIDB4RkY7CisJc3QtPnR4WzJdID0gcmVnX2FkZHJlc3MgJiAweEZGOworCXN0LT50eFszXSA9IDA7CisJc3QtPnR4WzRdID0gMDsKKwlzdC0+dHhbNV0gPSAwOworCXN0LT50eFs2XSA9IDA7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKHhmZXJzLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c3BpLCAmbXNnKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnN0LT5zcGktPmRldiwgInByb2JsZW0gd2hlbiByZWFkaW5nIDMyIGJpdCByZWdpc3RlciAweCUwMlgiLAorCQkJCXJlZ19hZGRyZXNzKTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCSp2YWwgPSAoc3QtPnJ4WzNdIDw8IDI0KSB8IChzdC0+cnhbNF0gPDwgMTYpIHwgKHN0LT5yeFs1XSA8PCA4KSB8IHN0LT5yeFs2XTsKKworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZGU3ODU0X3NwaV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWludCByZXQ7CisJc3RydWN0IGFkZTc4NTRfc3RhdGUgKnN0ID0ga3phbGxvYyhzaXplb2YgKnN0LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0KSB7CisJCXJldCA9ICAtRU5PTUVNOworCQlyZXR1cm4gcmV0OworCX0KKworCXNwaV9zZXRfZHJ2ZGF0YShzcGksIHN0KTsKKwlzdC0+cmVhZF9yZWdfOCA9IGFkZTc4NTRfc3BpX3JlYWRfcmVnXzg7CisJc3QtPnJlYWRfcmVnXzE2ID0gYWRlNzg1NF9zcGlfcmVhZF9yZWdfMTY7CisJc3QtPnJlYWRfcmVnXzI0ID0gYWRlNzg1NF9zcGlfcmVhZF9yZWdfMjQ7CisJc3QtPnJlYWRfcmVnXzMyID0gYWRlNzg1NF9zcGlfcmVhZF9yZWdfMzI7CisJc3QtPndyaXRlX3JlZ184ID0gYWRlNzg1NF9zcGlfd3JpdGVfcmVnXzg7CisJc3QtPndyaXRlX3JlZ18xNiA9IGFkZTc4NTRfc3BpX3dyaXRlX3JlZ18xNjsKKwlzdC0+d3JpdGVfcmVnXzI0ID0gYWRlNzg1NF9zcGlfd3JpdGVfcmVnXzI0OworCXN0LT53cml0ZV9yZWdfMzIgPSBhZGU3ODU0X3NwaV93cml0ZV9yZWdfMzI7CisJc3QtPmlycSA9IHNwaS0+aXJxOworCXN0LT5zcGkgPSBzcGk7CisKKwlyZXQgPSBhZGU3ODU0X3Byb2JlKHN0LCAmc3BpLT5kZXYpOworCWlmIChyZXQpIHsKKwkJa2ZyZWUoc3QpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkZTc4NTRfc3BpX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWFkZTc4NTRfcmVtb3ZlKHNwaV9nZXRfZHJ2ZGF0YShzcGkpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWRlNzg1NF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYWRlNzg1NCIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gYWRlNzg1NF9zcGlfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFkZTc4NTRfc3BpX3JlbW92ZSksCit9OworCitzdGF0aWMgX19pbml0IGludCBhZGU3ODU0X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmYWRlNzg1NF9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoYWRlNzg1NF9pbml0KTsKKworc3RhdGljIF9fZXhpdCB2b2lkIGFkZTc4NTRfZXhpdCh2b2lkKQoreworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYWRlNzg1NF9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoYWRlNzg1NF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQmFycnkgU29uZyA8MjFjbmJhb0BnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFERTc4NTQvNTgvNjgvNzggUG9seXBoYXNlIE11bHRpZnVuY3Rpb24gRW5lcmd5IE1ldGVyaW5nIElDIFNQSSBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzg1NC5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3ODU0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEzZDUwNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzg1NC5jCkBAIC0wLDAgKzEsNjgwIEBACisvKgorICogQURFNzg1NC81OC82OC83OCBQb2x5cGhhc2UgTXVsdGlmdW5jdGlvbiBFbmVyZ3kgTWV0ZXJpbmcgSUMgRHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorI2luY2x1ZGUgIm1ldGVyLmgiCisjaW5jbHVkZSAiYWRlNzg1NC5oIgorCitzdGF0aWMgc3NpemVfdCBhZGU3ODU0X3JlYWRfOGJpdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJaW50IHJldDsKKwl1OCB2YWwgPSAwOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCisJcmV0ID0gc3QtPnJlYWRfcmVnXzgoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgdmFsKTsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzg1NF9yZWFkXzE2Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCXUxNiB2YWwgPSAwOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCisJcmV0ID0gc3QtPnJlYWRfcmVnXzE2KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHZhbCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkZTc4NTRfcmVhZF8yNGJpdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJaW50IHJldDsKKwl1MzIgdmFsID0gMDsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkZTc4NTRfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKworCXJldCA9IHN0LT5yZWFkX3JlZ18yNChkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCB2YWwgJiAweEZGRkZGRik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkZTc4NTRfcmVhZF8zMmJpdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJaW50IHJldDsKKwl1MzIgdmFsID0gMDsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3ODU0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKworCXJldCA9IHN0LT5yZWFkX3JlZ18zMihkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCB2YWwpOworfQorCitzdGF0aWMgc3NpemVfdCBhZGU3ODU0X3dyaXRlXzhiaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkZTc4NTRfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCisJaW50IHJldDsKKwlsb25nIHZhbDsKKworCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnZhbCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisJcmV0ID0gc3QtPndyaXRlX3JlZ184KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCB2YWwpOworCitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzg1NF93cml0ZV8xNmJpdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisKKwlpbnQgcmV0OworCWxvbmcgdmFsOworCisJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKwlyZXQgPSBzdC0+d3JpdGVfcmVnXzE2KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCB2YWwpOworCitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzg1NF93cml0ZV8yNGJpdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisKKwlpbnQgcmV0OworCWxvbmcgdmFsOworCisJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKwlyZXQgPSBzdC0+d3JpdGVfcmVnXzI0KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCB2YWwpOworCitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzg1NF93cml0ZV8zMmJpdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisKKwlpbnQgcmV0OworCWxvbmcgdmFsOworCisJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKwlyZXQgPSBzdC0+d3JpdGVfcmVnXzMyKGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCB2YWwpOworCitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworc3RhdGljIGludCBhZGU3ODU0X3Jlc2V0KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkZTc4NTRfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCisJaW50IHJldDsKKwl1MTYgdmFsOworCisJc3QtPnJlYWRfcmVnXzE2KGRldiwgQURFNzg1NF9DT05GSUcsICZ2YWwpOworCXZhbCB8PSAxIDw8IDc7IC8qIFNvZnR3YXJlIENoaXAgUmVzZXQgKi8KKwlyZXQgPSBzdC0+d3JpdGVfcmVnXzE2KGRldiwgQURFNzg1NF9DT05GSUcsIHZhbCk7CisKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBzc2l6ZV90IGFkZTc4NTRfd3JpdGVfcmVzZXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCWlmIChsZW4gPCAxKQorCQlyZXR1cm4gLTE7CisJc3dpdGNoIChidWZbMF0pIHsKKwljYXNlICcxJzoKKwljYXNlICd5JzoKKwljYXNlICdZJzoKKwkJcmV0dXJuIGFkZTc4NTRfcmVzZXQoZGV2KTsKKwl9CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX0FJR0FJTihTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlhZGU3ODU0X3dyaXRlXzI0Yml0LAorCQlBREU3ODU0X0FJR0FJTik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0JJR0FJTihTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlhZGU3ODU0X3dyaXRlXzI0Yml0LAorCQlBREU3ODU0X0JJR0FJTik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0NJR0FJTihTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlhZGU3ODU0X3dyaXRlXzI0Yml0LAorCQlBREU3ODU0X0NJR0FJTik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX05JR0FJTihTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlhZGU3ODU0X3dyaXRlXzI0Yml0LAorCQlBREU3ODU0X05JR0FJTik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FWR0FJTihTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlhZGU3ODU0X3dyaXRlXzI0Yml0LAorCQlBREU3ODU0X0FWR0FJTik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0JWR0FJTihTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlhZGU3ODU0X3dyaXRlXzI0Yml0LAorCQlBREU3ODU0X0JWR0FJTik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0NWR0FJTihTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlhZGU3ODU0X3dyaXRlXzI0Yml0LAorCQlBREU3ODU0X0NWR0FJTik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FQUEFSRU5UX1BPV0VSX0FfR0FJTihTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlhZGU3ODU0X3dyaXRlXzI0Yml0LAorCQlBREU3ODU0X0FWQUdBSU4pOworc3RhdGljIElJT19ERVZfQVRUUl9BUFBBUkVOVF9QT1dFUl9CX0dBSU4oU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc4NTRfcmVhZF8yNGJpdCwKKwkJYWRlNzg1NF93cml0ZV8yNGJpdCwKKwkJQURFNzg1NF9CVkFHQUlOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQVBQQVJFTlRfUE9XRVJfQ19HQUlOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMjRiaXQsCisJCWFkZTc4NTRfd3JpdGVfMjRiaXQsCisJCUFERTc4NTRfQ1ZBR0FJTik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FDVElWRV9QT1dFUl9BX09GRlNFVChTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlhZGU3ODU0X3dyaXRlXzI0Yml0LAorCQlBREU3ODU0X0FXQVRUT1MpOworc3RhdGljIElJT19ERVZfQVRUUl9BQ1RJVkVfUE9XRVJfQl9PRkZTRVQoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc4NTRfcmVhZF8yNGJpdCwKKwkJYWRlNzg1NF93cml0ZV8yNGJpdCwKKwkJQURFNzg1NF9CV0FUVE9TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQUNUSVZFX1BPV0VSX0NfT0ZGU0VUKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMjRiaXQsCisJCWFkZTc4NTRfd3JpdGVfMjRiaXQsCisJCUFERTc4NTRfQ1dBVFRPUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX1JFQUNUSVZFX1BPV0VSX0FfR0FJTihTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlhZGU3ODU0X3dyaXRlXzI0Yml0LAorCQlBREU3ODU0X0FWQVJHQUlOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfUkVBQ1RJVkVfUE9XRVJfQl9HQUlOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMjRiaXQsCisJCWFkZTc4NTRfd3JpdGVfMjRiaXQsCisJCUFERTc4NTRfQlZBUkdBSU4pOworc3RhdGljIElJT19ERVZfQVRUUl9SRUFDVElWRV9QT1dFUl9DX0dBSU4oU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc4NTRfcmVhZF8yNGJpdCwKKwkJYWRlNzg1NF93cml0ZV8yNGJpdCwKKwkJQURFNzg1NF9DVkFSR0FJTik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX1JFQUNUSVZFX1BPV0VSX0FfT0ZGU0VUKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMjRiaXQsCisJCWFkZTc4NTRfd3JpdGVfMjRiaXQsCisJCUFERTc4NTRfQVZBUk9TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfUkVBQ1RJVkVfUE9XRVJfQl9PRkZTRVQoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc4NTRfcmVhZF8yNGJpdCwKKwkJYWRlNzg1NF93cml0ZV8yNGJpdCwKKwkJQURFNzg1NF9CVkFST1MpOworc3RhdGljIElJT19ERVZfQVRUUl9SRUFDVElWRV9QT1dFUl9DX09GRlNFVChTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlhZGU3ODU0X3dyaXRlXzI0Yml0LAorCQlBREU3ODU0X0NWQVJPUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX1ZQRUFLKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMzJiaXQsCisJCWFkZTc4NTRfd3JpdGVfMzJiaXQsCisJCUFERTc4NTRfVlBFQUspOworc3RhdGljIElJT19ERVZfQVRUUl9JUEVBSyhTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzg1NF9yZWFkXzMyYml0LAorCQlhZGU3ODU0X3dyaXRlXzMyYml0LAorCQlBREU3ODU0X1ZQRUFLKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQVBIQ0FMKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMTZiaXQsCisJCWFkZTc4NTRfd3JpdGVfMTZiaXQsCisJCUFERTc4NTRfQVBIQ0FMKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQlBIQ0FMKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMTZiaXQsCisJCWFkZTc4NTRfd3JpdGVfMTZiaXQsCisJCUFERTc4NTRfQlBIQ0FMKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ1BIQ0FMKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMTZiaXQsCisJCWFkZTc4NTRfd3JpdGVfMTZiaXQsCisJCUFERTc4NTRfQ1BIQ0FMKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0YxREVOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMTZiaXQsCisJCWFkZTc4NTRfd3JpdGVfMTZiaXQsCisJCUFERTc4NTRfQ0YxREVOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0YyREVOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMTZiaXQsCisJCWFkZTc4NTRfd3JpdGVfMTZiaXQsCisJCUFERTc4NTRfQ0YyREVOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0YzREVOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMTZiaXQsCisJCWFkZTc4NTRfd3JpdGVfMTZiaXQsCisJCUFERTc4NTRfQ0YzREVOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfTElORUNZQyhTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzg1NF9yZWFkXzE2Yml0LAorCQlhZGU3ODU0X3dyaXRlXzE2Yml0LAorCQlBREU3ODU0X0xJTkVDWUMpOworc3RhdGljIElJT19ERVZfQVRUUl9TQUdDWUMoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc4NTRfcmVhZF84Yml0LAorCQlhZGU3ODU0X3dyaXRlXzhiaXQsCisJCUFERTc4NTRfU0FHQ1lDKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0ZDWUMoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc4NTRfcmVhZF84Yml0LAorCQlhZGU3ODU0X3dyaXRlXzhiaXQsCisJCUFERTc4NTRfQ0ZDWUMpOworc3RhdGljIElJT19ERVZfQVRUUl9QRUFLQ1lDKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfOGJpdCwKKwkJYWRlNzg1NF93cml0ZV84Yml0LAorCQlBREU3ODU0X1BFQUtDWUMpOworc3RhdGljIElJT19ERVZfQVRUUl9DSEtTVU0oYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlBREU3ODU0X0NIRUNLU1VNKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQU5HTEUwKGFkZTc4NTRfcmVhZF8yNGJpdCwKKwkJQURFNzg1NF9BTkdMRTApOworc3RhdGljIElJT19ERVZfQVRUUl9BTkdMRTEoYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlBREU3ODU0X0FOR0xFMSk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FOR0xFMihhZGU3ODU0X3JlYWRfMjRiaXQsCisJCUFERTc4NTRfQU5HTEUyKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQUlSTVMoU19JUlVHTywKKwkJYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlOVUxMLAorCQlBREU3ODU0X0FJUk1TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQklSTVMoU19JUlVHTywKKwkJYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlOVUxMLAorCQlBREU3ODU0X0JJUk1TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0lSTVMoU19JUlVHTywKKwkJYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlOVUxMLAorCQlBREU3ODU0X0NJUk1TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfTklSTVMoU19JUlVHTywKKwkJYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlOVUxMLAorCQlBREU3ODU0X05JUk1TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQVZSTVMoU19JUlVHTywKKwkJYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlOVUxMLAorCQlBREU3ODU0X0FWUk1TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQlZSTVMoU19JUlVHTywKKwkJYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlOVUxMLAorCQlBREU3ODU0X0JWUk1TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ1ZSTVMoU19JUlVHTywKKwkJYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlOVUxMLAorCQlBREU3ODU0X0NWUk1TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQUlSTVNPUyhTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMTZiaXQsCisJCWFkZTc4NTRfd3JpdGVfMTZiaXQsCisJCUFERTc4NTRfQUlSTVNPUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0JJUk1TT1MoU19JUlVHTywKKwkJYWRlNzg1NF9yZWFkXzE2Yml0LAorCQlhZGU3ODU0X3dyaXRlXzE2Yml0LAorCQlBREU3ODU0X0JJUk1TT1MpOworc3RhdGljIElJT19ERVZfQVRUUl9DSVJNU09TKFNfSVJVR08sCisJCWFkZTc4NTRfcmVhZF8xNmJpdCwKKwkJYWRlNzg1NF93cml0ZV8xNmJpdCwKKwkJQURFNzg1NF9DSVJNU09TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQVZSTVNPUyhTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMTZiaXQsCisJCWFkZTc4NTRfd3JpdGVfMTZiaXQsCisJCUFERTc4NTRfQVZSTVNPUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0JWUk1TT1MoU19JUlVHTywKKwkJYWRlNzg1NF9yZWFkXzE2Yml0LAorCQlhZGU3ODU0X3dyaXRlXzE2Yml0LAorCQlBREU3ODU0X0JWUk1TT1MpOworc3RhdGljIElJT19ERVZfQVRUUl9DVlJNU09TKFNfSVJVR08sCisJCWFkZTc4NTRfcmVhZF8xNmJpdCwKKwkJYWRlNzg1NF93cml0ZV8xNmJpdCwKKwkJQURFNzg1NF9DVlJNU09TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfVk9MVF9BKGFkZTc4NTRfcmVhZF8yNGJpdCwKKwkJQURFNzg1NF9WQVdWKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfVk9MVF9CKGFkZTc4NTRfcmVhZF8yNGJpdCwKKwkJQURFNzg1NF9WQldWKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfVk9MVF9DKGFkZTc4NTRfcmVhZF8yNGJpdCwKKwkJQURFNzg1NF9WQ1dWKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ1VSUkVOVF9BKGFkZTc4NTRfcmVhZF8yNGJpdCwKKwkJQURFNzg1NF9JQVdWKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ1VSUkVOVF9CKGFkZTc4NTRfcmVhZF8yNGJpdCwKKwkJQURFNzg1NF9JQldWKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ1VSUkVOVF9DKGFkZTc4NTRfcmVhZF8yNGJpdCwKKwkJQURFNzg1NF9JQ1dWKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQVdBVFRIUihhZGU3ODU0X3JlYWRfMzJiaXQsCisJCUFERTc4NTRfQVdBVFRIUik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0JXQVRUSFIoYWRlNzg1NF9yZWFkXzMyYml0LAorCQlBREU3ODU0X0JXQVRUSFIpOworc3RhdGljIElJT19ERVZfQVRUUl9DV0FUVEhSKGFkZTc4NTRfcmVhZF8zMmJpdCwKKwkJQURFNzg1NF9DV0FUVEhSKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQUZXQVRUSFIoYWRlNzg1NF9yZWFkXzMyYml0LAorCQlBREU3ODU0X0FGV0FUVEhSKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQkZXQVRUSFIoYWRlNzg1NF9yZWFkXzMyYml0LAorCQlBREU3ODU0X0JGV0FUVEhSKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0ZXQVRUSFIoYWRlNzg1NF9yZWFkXzMyYml0LAorCQlBREU3ODU0X0NGV0FUVEhSKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQVZBUkhSKGFkZTc4NTRfcmVhZF8zMmJpdCwKKwkJQURFNzg1NF9BVkFSSFIpOworc3RhdGljIElJT19ERVZfQVRUUl9CVkFSSFIoYWRlNzg1NF9yZWFkXzMyYml0LAorCQlBREU3ODU0X0JWQVJIUik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0NWQVJIUihhZGU3ODU0X3JlYWRfMzJiaXQsCisJCUFERTc4NTRfQ1ZBUkhSKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQVZBSFIoYWRlNzg1NF9yZWFkXzMyYml0LAorCQlBREU3ODU0X0FWQUhSKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQlZBSFIoYWRlNzg1NF9yZWFkXzMyYml0LAorCQlBREU3ODU0X0JWQUhSKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ1ZBSFIoYWRlNzg1NF9yZWFkXzMyYml0LAorCQlBREU3ODU0X0NWQUhSKTsKKworc3RhdGljIGludCBhZGU3ODU0X3NldF9pcnEoc3RydWN0IGRldmljZSAqZGV2LCBib29sIGVuYWJsZSkKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkZTc4NTRfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCisJaW50IHJldDsKKwl1MzIgaXJxZW47CisKKwlyZXQgPSBzdC0+cmVhZF9yZWdfMzIoZGV2LCBBREU3ODU0X01BU0swLCAmaXJxZW4pOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJaWYgKGVuYWJsZSkKKwkJaXJxZW4gfD0gMSA8PCAxNzsgLyogMTogaW50ZXJydXB0IGVuYWJsZWQgd2hlbiBhbGwgcGVyaW9kaWNhbAorCQkJCSAgICAgKGF0IDgga0h6IHJhdGUpIERTUCBjb21wdXRhdGlvbnMgZmluaXNoLiAqLworCWVsc2UKKwkJaXJxZW4gJj0gfigxIDw8IDE3KTsKKworCXJldCA9IHN0LT53cml0ZV9yZWdfMzIoZGV2LCBBREU3ODU0X01BU0swLCBpcnFlbik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkZTc4NTRfaW5pdGlhbF9zZXR1cChzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmc3QtPmluZGlvX2Rldi0+ZGV2OworCisJLyogRGlzYWJsZSBJUlEgKi8KKwlyZXQgPSBhZGU3ODU0X3NldF9pcnEoZGV2LCBmYWxzZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgImRpc2FibGUgaXJxIGZhaWxlZCIpOworCQlnb3RvIGVycl9yZXQ7CisJfQorCisJYWRlNzg1NF9yZXNldChkZXYpOworCW1zbGVlcChBREU3ODU0X1NUQVJUVVBfREVMQVkpOworCitlcnJfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfUkVTRVQoYWRlNzg1NF93cml0ZV9yZXNldCk7CisKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUl9TQU1QX0ZSRVFfQVZBSUwoIjgwMDAiKTsKKworc3RhdGljIElJT19DT05TVF9BVFRSKG5hbWUsICJhZGU3ODU0Iik7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZGU3ODU0X2V2ZW50X2F0dHJpYnV0ZXNbXSA9IHsKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZGU3ODU0X2V2ZW50X2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZGU3ODU0X2V2ZW50X2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRlNzg1NF9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19kZXZfYXR0cl9haWdhaW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2JpZ2Fpbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2lnYWluLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9uaWdhaW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2F2Z2Fpbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYnZnYWluLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jdmdhaW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2xpbmVjeWMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3NhZ2N5Yy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2ZjeWMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3BlYWtjeWMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2Noa3N1bS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYXBwYXJlbnRfcG93ZXJfYV9nYWluLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hcHBhcmVudF9wb3dlcl9iX2dhaW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FwcGFyZW50X3Bvd2VyX2NfZ2Fpbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYWN0aXZlX3Bvd2VyX2Ffb2Zmc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hY3RpdmVfcG93ZXJfYl9vZmZzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FjdGl2ZV9wb3dlcl9jX29mZnNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcmVhY3RpdmVfcG93ZXJfYV9nYWluLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9yZWFjdGl2ZV9wb3dlcl9iX2dhaW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3JlYWN0aXZlX3Bvd2VyX2NfZ2Fpbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcmVhY3RpdmVfcG93ZXJfYV9vZmZzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3JlYWN0aXZlX3Bvd2VyX2Jfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9yZWFjdGl2ZV9wb3dlcl9jX29mZnNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYXdhdHRoci5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYndhdHRoci5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY3dhdHRoci5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYWZ3YXR0aHIuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2Jmd2F0dGhyLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jZndhdHRoci5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYXZhcmhyLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9idmFyaHIuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2N2YXJoci5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYW5nbGUwLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hbmdsZTEuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FuZ2xlMi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYXZhaHIuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2J2YWhyLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jdmFoci5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9zYW1wbGluZ19mcmVxdWVuY3lfYXZhaWxhYmxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9yZXNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9uYW1lLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl92cGVhay5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaXBlYWsuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FwaGNhbC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYnBoY2FsLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jcGhjYWwuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NmMWRlbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2YyZGVuLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jZjNkZW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2Fpcm1zLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9iaXJtcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2lybXMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX25pcm1zLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hdnJtcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYnZybXMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2N2cm1zLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9haXJtc29zLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9iaXJtc29zLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jaXJtc29zLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hdnJtc29zLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9idnJtc29zLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jdnJtc29zLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl92b2x0X2EuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3ZvbHRfYi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfdm9sdF9jLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jdXJyZW50X2EuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2N1cnJlbnRfYi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY3VycmVudF9jLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkZTc4NTRfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkZTc4NTRfYXR0cmlidXRlcywKK307CisKK2ludCBhZGU3ODU0X3Byb2JlKHN0cnVjdCBhZGU3ODU0X3N0YXRlICpzdCwgc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCByZXQsIHJlZ2RvbmUgPSAwOworCisJLyogQWxsb2NhdGUgdGhlIGNvbW1zIGJ1ZmZlcnMgKi8KKwlzdC0+cnggPSBremFsbG9jKHNpemVvZigqc3QtPnJ4KSpBREU3ODU0X01BWF9SWCwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0LT5yeCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9zdDsKKwl9CisJc3QtPnR4ID0ga3phbGxvYyhzaXplb2YoKnN0LT50eCkqQURFNzg1NF9NQVhfVFgsIEdGUF9LRVJORUwpOworCWlmIChzdC0+dHggPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfcng7CisJfQorCW11dGV4X2luaXQoJnN0LT5idWZfbG9jayk7CisJLyogc2V0dXAgdGhlIGluZHVzdHJpYWxpbyBkcml2ZXIgYWxsb2NhdGVkIGVsZW1lbnRzICovCisJc3QtPmluZGlvX2RldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoc3QtPmluZGlvX2RldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV90eDsKKwl9CisKKwlzdC0+aW5kaW9fZGV2LT5kZXYucGFyZW50ID0gZGV2OworCXN0LT5pbmRpb19kZXYtPm51bV9pbnRlcnJ1cHRfbGluZXMgPSAxOworCXN0LT5pbmRpb19kZXYtPmV2ZW50X2F0dHJzID0gJmFkZTc4NTRfZXZlbnRfYXR0cmlidXRlX2dyb3VwOworCXN0LT5pbmRpb19kZXYtPmF0dHJzID0gJmFkZTc4NTRfYXR0cmlidXRlX2dyb3VwOworCXN0LT5pbmRpb19kZXYtPmRldl9kYXRhID0gKHZvaWQgKikoc3QpOworCXN0LT5pbmRpb19kZXYtPmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRTsKKwlzdC0+aW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJcmV0ID0gYWRlNzg1NF9jb25maWd1cmVfcmluZyhzdC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2OworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihzdC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3VucmVnX3JpbmdfZnVuY3M7CisJcmVnZG9uZSA9IDE7CisKKwlyZXQgPSBhZGU3ODU0X2luaXRpYWxpemVfcmluZyhzdC0+aW5kaW9fZGV2LT5yaW5nKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIHJpbmdcbiIpOworCQlnb3RvIGVycm9yX3VucmVnX3JpbmdfZnVuY3M7CisJfQorCisJaWYgKHN0LT5pcnEpIHsKKwkJcmV0ID0gaWlvX3JlZ2lzdGVyX2ludGVycnVwdF9saW5lKHN0LT5pcnEsCisJCQkJc3QtPmluZGlvX2RldiwKKwkJCQkwLAorCQkJCUlSUUZfVFJJR0dFUl9GQUxMSU5HLAorCQkJCSJhZGU3ODU0Iik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3VuaW5pdGlhbGl6ZV9yaW5nOworCisJCXJldCA9IGFkZTc4NTRfcHJvYmVfdHJpZ2dlcihzdC0+aW5kaW9fZGV2KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfdW5yZWdpc3Rlcl9saW5lOworCX0KKwkvKiBHZXQgdGhlIGRldmljZSBpbnRvIGEgc2FuZSBpbml0aWFsIHN0YXRlICovCisJcmV0ID0gYWRlNzg1NF9pbml0aWFsX3NldHVwKHN0KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JlbW92ZV90cmlnZ2VyOworCisJcmV0dXJuIDA7CisKK2Vycm9yX3JlbW92ZV90cmlnZ2VyOgorCWlmIChzdC0+aW5kaW9fZGV2LT5tb2RlcyAmIElORElPX1JJTkdfVFJJR0dFUkVEKQorCQlhZGU3ODU0X3JlbW92ZV90cmlnZ2VyKHN0LT5pbmRpb19kZXYpOworZXJyb3JfdW5yZWdpc3Rlcl9saW5lOgorCWlmIChzdC0+aW5kaW9fZGV2LT5tb2RlcyAmIElORElPX1JJTkdfVFJJR0dFUkVEKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShzdC0+aW5kaW9fZGV2LCAwKTsKK2Vycm9yX3VuaW5pdGlhbGl6ZV9yaW5nOgorCWFkZTc4NTRfdW5pbml0aWFsaXplX3Jpbmcoc3QtPmluZGlvX2Rldi0+cmluZyk7CitlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOgorCWFkZTc4NTRfdW5jb25maWd1cmVfcmluZyhzdC0+aW5kaW9fZGV2KTsKK2Vycm9yX2ZyZWVfZGV2OgorCWlmIChyZWdkb25lKQorCQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoc3QtPmluZGlvX2Rldik7CisJZWxzZQorCQlpaW9fZnJlZV9kZXZpY2Uoc3QtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX3R4OgorCWtmcmVlKHN0LT50eCk7CitlcnJvcl9mcmVlX3J4OgorCWtmcmVlKHN0LT5yeCk7CitlcnJvcl9mcmVlX3N0OgorCWtmcmVlKHN0KTsKKwlyZXR1cm4gcmV0OworCit9CitFWFBPUlRfU1lNQk9MKGFkZTc4NTRfcHJvYmUpOworCitpbnQgYWRlNzg1NF9yZW1vdmUoc3RydWN0IGFkZTc4NTRfc3RhdGUgKnN0KQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBzdC0+aW5kaW9fZGV2OworCisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKworCWFkZTc4NTRfcmVtb3ZlX3RyaWdnZXIoaW5kaW9fZGV2KTsKKwlpZiAoc3QtPmlycSkKKwkJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoaW5kaW9fZGV2LCAwKTsKKworCWFkZTc4NTRfdW5pbml0aWFsaXplX3JpbmcoaW5kaW9fZGV2LT5yaW5nKTsKKwlhZGU3ODU0X3VuY29uZmlndXJlX3JpbmcoaW5kaW9fZGV2KTsKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlrZnJlZShzdC0+dHgpOworCWtmcmVlKHN0LT5yeCk7CisJa2ZyZWUoc3QpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGFkZTc4NTRfcmVtb3ZlKTsKKworTU9EVUxFX0FVVEhPUigiQmFycnkgU29uZyA8MjFjbmJhb0BnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFERTc4NTQvNTgvNjgvNzggUG9seXBoYXNlIE11bHRpZnVuY3Rpb24gRW5lcmd5IE1ldGVyaW5nIElDIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3ODU0LmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc4NTQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzY5MGU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3ODU0LmgKQEAgLTAsMCArMSwyNDUgQEAKKyNpZm5kZWYgX0FERTc4NTRfSAorI2RlZmluZSBfQURFNzg1NF9ICisKKyNkZWZpbmUgQURFNzg1NF9BSUdBSU4gICAgMHg0MzgwCisjZGVmaW5lIEFERTc4NTRfQVZHQUlOICAgIDB4NDM4MQorI2RlZmluZSBBREU3ODU0X0JJR0FJTiAgICAweDQzODIKKyNkZWZpbmUgQURFNzg1NF9CVkdBSU4gICAgMHg0MzgzCisjZGVmaW5lIEFERTc4NTRfQ0lHQUlOICAgIDB4NDM4NAorI2RlZmluZSBBREU3ODU0X0NWR0FJTiAgICAweDQzODUKKyNkZWZpbmUgQURFNzg1NF9OSUdBSU4gICAgMHg0Mzg2CisjZGVmaW5lIEFERTc4NTRfQUlSTVNPUyAgIDB4NDM4NworI2RlZmluZSBBREU3ODU0X0FWUk1TT1MgICAweDQzODgKKyNkZWZpbmUgQURFNzg1NF9CSVJNU09TICAgMHg0Mzg5CisjZGVmaW5lIEFERTc4NTRfQlZSTVNPUyAgIDB4NDM4QQorI2RlZmluZSBBREU3ODU0X0NJUk1TT1MgICAweDQzOEIKKyNkZWZpbmUgQURFNzg1NF9DVlJNU09TICAgMHg0MzhDCisjZGVmaW5lIEFERTc4NTRfTklSTVNPUyAgIDB4NDM4RAorI2RlZmluZSBBREU3ODU0X0FWQUdBSU4gICAweDQzOEUKKyNkZWZpbmUgQURFNzg1NF9CVkFHQUlOICAgMHg0MzhGCisjZGVmaW5lIEFERTc4NTRfQ1ZBR0FJTiAgIDB4NDM5MAorI2RlZmluZSBBREU3ODU0X0FXR0FJTiAgICAweDQzOTEKKyNkZWZpbmUgQURFNzg1NF9BV0FUVE9TICAgMHg0MzkyCisjZGVmaW5lIEFERTc4NTRfQldHQUlOICAgIDB4NDM5MworI2RlZmluZSBBREU3ODU0X0JXQVRUT1MgICAweDQzOTQKKyNkZWZpbmUgQURFNzg1NF9DV0dBSU4gICAgMHg0Mzk1CisjZGVmaW5lIEFERTc4NTRfQ1dBVFRPUyAgIDB4NDM5NgorI2RlZmluZSBBREU3ODU0X0FWQVJHQUlOICAweDQzOTcKKyNkZWZpbmUgQURFNzg1NF9BVkFST1MgICAgMHg0Mzk4CisjZGVmaW5lIEFERTc4NTRfQlZBUkdBSU4gIDB4NDM5OQorI2RlZmluZSBBREU3ODU0X0JWQVJPUyAgICAweDQzOUEKKyNkZWZpbmUgQURFNzg1NF9DVkFSR0FJTiAgMHg0MzlCCisjZGVmaW5lIEFERTc4NTRfQ1ZBUk9TICAgIDB4NDM5QworI2RlZmluZSBBREU3ODU0X0FGV0dBSU4gICAweDQzOUQKKyNkZWZpbmUgQURFNzg1NF9BRldBVFRPUyAgMHg0MzlFCisjZGVmaW5lIEFERTc4NTRfQkZXR0FJTiAgIDB4NDM5RgorI2RlZmluZSBBREU3ODU0X0JGV0FUVE9TICAweDQzQTAKKyNkZWZpbmUgQURFNzg1NF9DRldHQUlOICAgMHg0M0ExCisjZGVmaW5lIEFERTc4NTRfQ0ZXQVRUT1MgIDB4NDNBMgorI2RlZmluZSBBREU3ODU0X0FGVkFSR0FJTiAweDQzQTMKKyNkZWZpbmUgQURFNzg1NF9BRlZBUk9TICAgMHg0M0E0CisjZGVmaW5lIEFERTc4NTRfQkZWQVJHQUlOIDB4NDNBNQorI2RlZmluZSBBREU3ODU0X0JGVkFST1MgICAweDQzQTYKKyNkZWZpbmUgQURFNzg1NF9DRlZBUkdBSU4gMHg0M0E3CisjZGVmaW5lIEFERTc4NTRfQ0ZWQVJPUyAgIDB4NDNBOAorI2RlZmluZSBBREU3ODU0X1ZBVEhSMSAgICAweDQzQTkKKyNkZWZpbmUgQURFNzg1NF9WQVRIUjAgICAgMHg0M0FBCisjZGVmaW5lIEFERTc4NTRfV1RIUjEgICAgIDB4NDNBQgorI2RlZmluZSBBREU3ODU0X1dUSFIwICAgICAweDQzQUMKKyNkZWZpbmUgQURFNzg1NF9WQVJUSFIxICAgMHg0M0FECisjZGVmaW5lIEFERTc4NTRfVkFSVEhSMCAgIDB4NDNBRQorI2RlZmluZSBBREU3ODU0X1JTViAgICAgICAweDQzQUYKKyNkZWZpbmUgQURFNzg1NF9WQU5PTE9BRCAgMHg0M0IwCisjZGVmaW5lIEFERTc4NTRfQVBOT0xPQUQgIDB4NDNCMQorI2RlZmluZSBBREU3ODU0X1ZBUk5PTE9BRCAweDQzQjIKKyNkZWZpbmUgQURFNzg1NF9WTEVWRUwgICAgMHg0M0IzCisjZGVmaW5lIEFERTc4NTRfRElDT0VGRiAgIDB4NDNCNQorI2RlZmluZSBBREU3ODU0X0hQRkRJUyAgICAweDQzQjYKKyNkZWZpbmUgQURFNzg1NF9JU1VNTFZMICAgMHg0M0I4CisjZGVmaW5lIEFERTc4NTRfSVNVTSAgICAgIDB4NDNCRgorI2RlZmluZSBBREU3ODU0X0FJUk1TICAgICAweDQzQzAKKyNkZWZpbmUgQURFNzg1NF9BVlJNUyAgICAgMHg0M0MxCisjZGVmaW5lIEFERTc4NTRfQklSTVMgICAgIDB4NDNDMgorI2RlZmluZSBBREU3ODU0X0JWUk1TICAgICAweDQzQzMKKyNkZWZpbmUgQURFNzg1NF9DSVJNUyAgICAgMHg0M0M0CisjZGVmaW5lIEFERTc4NTRfQ1ZSTVMgICAgIDB4NDNDNQorI2RlZmluZSBBREU3ODU0X05JUk1TICAgICAweDQzQzYKKyNkZWZpbmUgQURFNzg1NF9SVU4gICAgICAgMHhFMjI4CisjZGVmaW5lIEFERTc4NTRfQVdBVFRIUiAgIDB4RTQwMAorI2RlZmluZSBBREU3ODU0X0JXQVRUSFIgICAweEU0MDEKKyNkZWZpbmUgQURFNzg1NF9DV0FUVEhSICAgMHhFNDAyCisjZGVmaW5lIEFERTc4NTRfQUZXQVRUSFIgIDB4RTQwMworI2RlZmluZSBBREU3ODU0X0JGV0FUVEhSICAweEU0MDQKKyNkZWZpbmUgQURFNzg1NF9DRldBVFRIUiAgMHhFNDA1CisjZGVmaW5lIEFERTc4NTRfQVZBUkhSICAgIDB4RTQwNgorI2RlZmluZSBBREU3ODU0X0JWQVJIUiAgICAweEU0MDcKKyNkZWZpbmUgQURFNzg1NF9DVkFSSFIgICAgMHhFNDA4CisjZGVmaW5lIEFERTc4NTRfQUZWQVJIUiAgIDB4RTQwOQorI2RlZmluZSBBREU3ODU0X0JGVkFSSFIgICAweEU0MEEKKyNkZWZpbmUgQURFNzg1NF9DRlZBUkhSICAgMHhFNDBCCisjZGVmaW5lIEFERTc4NTRfQVZBSFIgICAgIDB4RTQwQworI2RlZmluZSBBREU3ODU0X0JWQUhSICAgICAweEU0MEQKKyNkZWZpbmUgQURFNzg1NF9DVkFIUiAgICAgMHhFNDBFCisjZGVmaW5lIEFERTc4NTRfSVBFQUsgICAgIDB4RTUwMAorI2RlZmluZSBBREU3ODU0X1ZQRUFLICAgICAweEU1MDEKKyNkZWZpbmUgQURFNzg1NF9TVEFUVVMwICAgMHhFNTAyCisjZGVmaW5lIEFERTc4NTRfU1RBVFVTMSAgIDB4RTUwMworI2RlZmluZSBBREU3ODU0X09JTFZMICAgICAweEU1MDcKKyNkZWZpbmUgQURFNzg1NF9PVkxWTCAgICAgMHhFNTA4CisjZGVmaW5lIEFERTc4NTRfU0FHTFZMICAgIDB4RTUwOQorI2RlZmluZSBBREU3ODU0X01BU0swICAgICAweEU1MEEKKyNkZWZpbmUgQURFNzg1NF9NQVNLMSAgICAgMHhFNTBCCisjZGVmaW5lIEFERTc4NTRfSUFXViAgICAgIDB4RTUwQworI2RlZmluZSBBREU3ODU0X0lCV1YgICAgICAweEU1MEQKKyNkZWZpbmUgQURFNzg1NF9JQ1dWICAgICAgMHhFNTBFCisjZGVmaW5lIEFERTc4NTRfVkFXViAgICAgIDB4RTUxMAorI2RlZmluZSBBREU3ODU0X1ZCV1YgICAgICAweEU1MTEKKyNkZWZpbmUgQURFNzg1NF9WQ1dWICAgICAgMHhFNTEyCisjZGVmaW5lIEFERTc4NTRfQVdBVFQgICAgIDB4RTUxMworI2RlZmluZSBBREU3ODU0X0JXQVRUICAgICAweEU1MTQKKyNkZWZpbmUgQURFNzg1NF9DV0FUVCAgICAgMHhFNTE1CisjZGVmaW5lIEFERTc4NTRfQVZBICAgICAgIDB4RTUxOQorI2RlZmluZSBBREU3ODU0X0JWQSAgICAgICAweEU1MUEKKyNkZWZpbmUgQURFNzg1NF9DVkEgICAgICAgMHhFNTFCCisjZGVmaW5lIEFERTc4NTRfQ0hFQ0tTVU0gIDB4RTUxRgorI2RlZmluZSBBREU3ODU0X1ZOT00gICAgICAweEU1MjAKKyNkZWZpbmUgQURFNzg1NF9QSFNUQVRVUyAgMHhFNjAwCisjZGVmaW5lIEFERTc4NTRfQU5HTEUwICAgIDB4RTYwMQorI2RlZmluZSBBREU3ODU0X0FOR0xFMSAgICAweEU2MDIKKyNkZWZpbmUgQURFNzg1NF9BTkdMRTIgICAgMHhFNjAzCisjZGVmaW5lIEFERTc4NTRfUEVSSU9EICAgIDB4RTYwNworI2RlZmluZSBBREU3ODU0X1BITk9MT0FEICAweEU2MDgKKyNkZWZpbmUgQURFNzg1NF9MSU5FQ1lDICAgMHhFNjBDCisjZGVmaW5lIEFERTc4NTRfWlhUT1VUICAgIDB4RTYwRAorI2RlZmluZSBBREU3ODU0X0NPTVBNT0RFICAweEU2MEUKKyNkZWZpbmUgQURFNzg1NF9HQUlOICAgICAgMHhFNjBGCisjZGVmaW5lIEFERTc4NTRfQ0ZNT0RFICAgIDB4RTYxMAorI2RlZmluZSBBREU3ODU0X0NGMURFTiAgICAweEU2MTEKKyNkZWZpbmUgQURFNzg1NF9DRjJERU4gICAgMHhFNjEyCisjZGVmaW5lIEFERTc4NTRfQ0YzREVOICAgIDB4RTYxMworI2RlZmluZSBBREU3ODU0X0FQSENBTCAgICAweEU2MTQKKyNkZWZpbmUgQURFNzg1NF9CUEhDQUwgICAgMHhFNjE1CisjZGVmaW5lIEFERTc4NTRfQ1BIQ0FMICAgIDB4RTYxNgorI2RlZmluZSBBREU3ODU0X1BIU0lHTiAgICAweEU2MTcKKyNkZWZpbmUgQURFNzg1NF9DT05GSUcgICAgMHhFNjE4CisjZGVmaW5lIEFERTc4NTRfTU1PREUgICAgIDB4RTcwMAorI2RlZmluZSBBREU3ODU0X0FDQ01PREUgICAweEU3MDEKKyNkZWZpbmUgQURFNzg1NF9MQ1lDTU9ERSAgMHhFNzAyCisjZGVmaW5lIEFERTc4NTRfUEVBS0NZQyAgIDB4RTcwMworI2RlZmluZSBBREU3ODU0X1NBR0NZQyAgICAweEU3MDQKKyNkZWZpbmUgQURFNzg1NF9DRkNZQyAgICAgMHhFNzA1CisjZGVmaW5lIEFERTc4NTRfSFNEQ19DRkcgIDB4RTcwNgorI2RlZmluZSBBREU3ODU0X0NPTkZJRzIgICAweEVDMDEKKworI2RlZmluZSBBREU3ODU0X1JFQURfUkVHICAgMHgxCisjZGVmaW5lIEFERTc4NTRfV1JJVEVfUkVHICAweDAKKworI2RlZmluZSBBREU3ODU0X01BWF9UWCAgICA3CisjZGVmaW5lIEFERTc4NTRfTUFYX1JYICAgIDcKKyNkZWZpbmUgQURFNzg1NF9TVEFSVFVQX0RFTEFZIDEKKworI2RlZmluZSBBREU3ODU0X1NQSV9TTE9XCSh1MzIpKDMwMCAqIDEwMDApCisjZGVmaW5lIEFERTc4NTRfU1BJX0JVUlNUCSh1MzIpKDEwMDAgKiAxMDAwKQorI2RlZmluZSBBREU3ODU0X1NQSV9GQVNUCSh1MzIpKDIwMDAgKiAxMDAwKQorCisjZGVmaW5lIERSSVZFUl9OQU1FCQkiYWRlNzg1NCIKKworLyoqCisgKiBzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAtIGRldmljZSBpbnN0YW5jZSBzcGVjaWZpYyBkYXRhCisgKiBAc3BpOgkJCWFjdHVhbCBzcGlfZGV2aWNlCisgKiBAd29ya190cmlnZ2VyX3RvX3Jpbmc6IGJoIGZvciB0cmlnZ2VyZWQgZXZlbnQgaGFuZGxpbmcKKyAqIEBpbnRlcjoJCXVzZWQgdG8gY2hlY2sgaWYgbmV3IGludGVycnVwdCBoYXMgYmVlbiB0cmlnZ2VyZWQKKyAqIEBsYXN0X3RpbWVzdGFtcDoJcGFzc2luZyB0aW1lc3RhbXAgZnJvbSB0aCB0byBiaCBvZiBpbnRlcnJ1cHQgaGFuZGxlcgorICogQGluZGlvX2RldjoJCWluZHVzdHJpYWwgSS9PIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEB0cmlnOgkJZGF0YSByZWFkeSB0cmlnZ2VyIHJlZ2lzdGVyZWQgd2l0aCBpaW8KKyAqIEB0eDoJCQl0cmFuc21pdCBidWZmZXIKKyAqIEByeDoJCQlyZWNpZXZlIGJ1ZmZlcgorICogQGJ1Zl9sb2NrOgkJbXV0ZXggdG8gcHJvdGVjdCB0eCBhbmQgcngKKyAqKi8KK3N0cnVjdCBhZGU3ODU0X3N0YXRlIHsKKwlzdHJ1Y3Qgc3BpX2RldmljZQkJKnNwaTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAgICAgICAgICAgICAgICppMmM7CisJc3RydWN0IHdvcmtfc3RydWN0CQl3b3JrX3RyaWdnZXJfdG9fcmluZzsKKwlzNjQJCQkJbGFzdF90aW1lc3RhbXA7CisJc3RydWN0IGlpb19kZXYJCQkqaW5kaW9fZGV2OworCXN0cnVjdCBpaW9fdHJpZ2dlcgkJKnRyaWc7CisJdTgJCQkJKnR4OworCXU4CQkJCSpyeDsKKwlpbnQJCQkJKCpyZWFkX3JlZ184KSAoc3RydWN0IGRldmljZSAqLCB1MTYsIHU4ICopOworCWludAkJCQkoKnJlYWRfcmVnXzE2KSAoc3RydWN0IGRldmljZSAqLCB1MTYsIHUxNiAqKTsKKwlpbnQJCQkJKCpyZWFkX3JlZ18yNCkgKHN0cnVjdCBkZXZpY2UgKiwgdTE2LCB1MzIgKik7CisJaW50CQkJCSgqcmVhZF9yZWdfMzIpIChzdHJ1Y3QgZGV2aWNlICosIHUxNiwgdTMyICopOworCWludAkJCQkoKndyaXRlX3JlZ184KSAoc3RydWN0IGRldmljZSAqLCB1MTYsIHU4KTsKKwlpbnQJCQkJKCp3cml0ZV9yZWdfMTYpIChzdHJ1Y3QgZGV2aWNlICosIHUxNiwgdTE2KTsKKwlpbnQJCQkJKCp3cml0ZV9yZWdfMjQpIChzdHJ1Y3QgZGV2aWNlICosIHUxNiwgdTMyKTsKKwlpbnQJCQkJKCp3cml0ZV9yZWdfMzIpIChzdHJ1Y3QgZGV2aWNlICosIHUxNiwgdTMyKTsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlycTsKKwlzdHJ1Y3QgbXV0ZXgJCQlidWZfbG9jazsKK307CisKK2V4dGVybiBpbnQgYWRlNzg1NF9wcm9iZShzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QsIHN0cnVjdCBkZXZpY2UgKmRldik7CitleHRlcm4gaW50IGFkZTc4NTRfcmVtb3ZlKHN0cnVjdCBhZGU3ODU0X3N0YXRlICpzdCk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19JSU9fUklOR19CVUZGRVIpICYmIGRlZmluZWQoVEhJU19IQVNfUklOR19CVUZGRVJfU1VQUE9SVCkKKy8qIEF0IHRoZSBtb21lbnQgdHJpZ2dlcnMgYXJlIG9ubHkgdXNlZCBmb3IgcmluZyBidWZmZXIKKyAqIGZpbGxpbmcuIFRoaXMgbWF5IGNoYW5nZSEKKyAqLworCitlbnVtIGFkZTc4NTRfc2NhbiB7CisJQURFNzg1NF9TQ0FOX1BIQV9WLAorCUFERTc4NTRfU0NBTl9QSEJfViwKKwlBREU3ODU0X1NDQU5fUEhDX1YsCisJQURFNzg1NF9TQ0FOX1BIQV9JLAorCUFERTc4NTRfU0NBTl9QSEJfSSwKKwlBREU3ODU0X1NDQU5fUEhDX0ksCit9OworCit2b2lkIGFkZTc4NTRfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CitpbnQgYWRlNzg1NF9wcm9iZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOworCitzc2l6ZV90IGFkZTc4NTRfcmVhZF9kYXRhX2Zyb21fcmluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICAgY2hhciAqYnVmKTsKKworCitpbnQgYWRlNzg1NF9jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKK3ZvaWQgYWRlNzg1NF91bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOworCitpbnQgYWRlNzg1NF9pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7Cit2b2lkIGFkZTc4NTRfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7CisjZWxzZSAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGU3ODU0X3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7Cit9CitzdGF0aWMgaW5saW5lIGludCBhZGU3ODU0X3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90CithZGU3ODU0X3JlYWRfZGF0YV9mcm9tX3Jpbmcoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICBjaGFyICpidWYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFkZTc4NTRfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFkZTc4NTRfdW5jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworfQorc3RhdGljIGlubGluZSBpbnQgYWRlNzg1NF9pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGU3ODU0X3VuaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpCit7Cit9CisjZW5kaWYgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvbWV0ZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvbWV0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDJjNTBkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9tZXRlci5oCkBAIC0wLDAgKzEsMzk2IEBACisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKworLyogbWV0ZXJpbmcgaWMgdHlwZXMgb2YgYXR0cmlidXRlICovCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NVUlJFTlRfQV9PRkZTRVQoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQlcCisJSUlPX0RFVklDRV9BVFRSKGN1cnJlbnRfYV9vZmZzZXQsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQ1VSUkVOVF9CX09GRlNFVChfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCVwKKwlJSU9fREVWSUNFX0FUVFIoY3VycmVudF9iX29mZnNldCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9DVVJSRU5UX0NfT0ZGU0VUKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikJXAorCUlJT19ERVZJQ0VfQVRUUihjdXJyZW50X2Nfb2Zmc2V0LCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1ZPTFRfQV9PRkZTRVQoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIodm9sdF9hX29mZnNldCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9WT0xUX0JfT0ZGU0VUKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKHZvbHRfYl9vZmZzZXQsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfVk9MVF9DX09GRlNFVChfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUih2b2x0X2Nfb2Zmc2V0LCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1JFQUNUSVZFX1BPV0VSX0FfT0ZGU0VUKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihyZWFjdGl2ZV9wb3dlcl9hX29mZnNldCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9SRUFDVElWRV9QT1dFUl9CX09GRlNFVChfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIocmVhY3RpdmVfcG93ZXJfYl9vZmZzZXQsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfUkVBQ1RJVkVfUE9XRVJfQ19PRkZTRVQoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKHJlYWN0aXZlX3Bvd2VyX2Nfb2Zmc2V0LCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FDVElWRV9QT1dFUl9BX09GRlNFVChfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoYWN0aXZlX3Bvd2VyX2Ffb2Zmc2V0LCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FDVElWRV9QT1dFUl9CX09GRlNFVChfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoYWN0aXZlX3Bvd2VyX2Jfb2Zmc2V0LCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FDVElWRV9QT1dFUl9DX09GRlNFVChfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoYWN0aXZlX3Bvd2VyX2Nfb2Zmc2V0LCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NVUlJFTlRfQV9HQUlOKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikJCVwKKwlJSU9fREVWSUNFX0FUVFIoY3VycmVudF9hX2dhaW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQ1VSUkVOVF9CX0dBSU4oX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQkJXAorCUlJT19ERVZJQ0VfQVRUUihjdXJyZW50X2JfZ2FpbiwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9DVVJSRU5UX0NfR0FJTihfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCQlcCisJSUlPX0RFVklDRV9BVFRSKGN1cnJlbnRfY19nYWluLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FQUEFSRU5UX1BPV0VSX0FfR0FJTihfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoYXBwYXJlbnRfcG93ZXJfYV9nYWluLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FQUEFSRU5UX1BPV0VSX0JfR0FJTihfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoYXBwYXJlbnRfcG93ZXJfYl9nYWluLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FQUEFSRU5UX1BPV0VSX0NfR0FJTihfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoYXBwYXJlbnRfcG93ZXJfY19nYWluLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FDVElWRV9QT1dFUl9HQUlOKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihhY3RpdmVfcG93ZXJfZ2FpbiwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9BQ1RJVkVfUE9XRVJfQV9HQUlOKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihhY3RpdmVfcG93ZXJfYV9nYWluLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FDVElWRV9QT1dFUl9CX0dBSU4oX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGFjdGl2ZV9wb3dlcl9iX2dhaW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQUNUSVZFX1BPV0VSX0NfR0FJTihfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoYWN0aXZlX3Bvd2VyX2NfZ2FpbiwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9SRUFDVElWRV9QT1dFUl9BX0dBSU4oX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKHJlYWN0aXZlX3Bvd2VyX2FfZ2FpbiwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9SRUFDVElWRV9QT1dFUl9CX0dBSU4oX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKHJlYWN0aXZlX3Bvd2VyX2JfZ2FpbiwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9SRUFDVElWRV9QT1dFUl9DX0dBSU4oX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKHJlYWN0aXZlX3Bvd2VyX2NfZ2FpbiwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9DVVJSRU5UX0EoX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIoY3VycmVudF9hLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NVUlJFTlRfQihfc2hvdywgX2FkZHIpCQkJXAorCUlJT19ERVZJQ0VfQVRUUihjdXJyZW50X2IsIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQ1VSUkVOVF9DKF9zaG93LCBfYWRkcikJCQlcCisJSUlPX0RFVklDRV9BVFRSKGN1cnJlbnRfYywgU19JUlVHTywgX3Nob3csIE5VTEwsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9WT0xUX0EoX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIodm9sdF9hLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1ZPTFRfQihfc2hvdywgX2FkZHIpCQkJXAorCUlJT19ERVZJQ0VfQVRUUih2b2x0X2IsIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfVk9MVF9DKF9zaG93LCBfYWRkcikJCQlcCisJSUlPX0RFVklDRV9BVFRSKHZvbHRfYywgU19JUlVHTywgX3Nob3csIE5VTEwsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9BRU5FUkdZKF9zaG93LCBfYWRkcikJCQlcCisJSUlPX0RFVklDRV9BVFRSKGFlbmVyZ3ksIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfTEVORVJHWShfc2hvdywgX2FkZHIpCQkJXAorCUlJT19ERVZJQ0VfQVRUUihsZW5lcmd5LCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1JBRU5FUkdZKF9zaG93LCBfYWRkcikJCQlcCisJSUlPX0RFVklDRV9BVFRSKHJhZW5lcmd5LCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0xBRU5FUkdZKF9zaG93LCBfYWRkcikJCQlcCisJSUlPX0RFVklDRV9BVFRSKGxhZW5lcmd5LCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1ZBRU5FUkdZKF9zaG93LCBfYWRkcikJCQlcCisJSUlPX0RFVklDRV9BVFRSKHZhZW5lcmd5LCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0xWQUVORVJHWShfc2hvdywgX2FkZHIpCQkJXAorCUlJT19ERVZJQ0VfQVRUUihsdmFlbmVyZ3ksIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfUlZBRU5FUkdZKF9zaG93LCBfYWRkcikJCQlcCisJSUlPX0RFVklDRV9BVFRSKHJ2YWVuZXJneSwgU19JUlVHTywgX3Nob3csIE5VTEwsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9MVkFSRU5FUkdZKF9zaG93LCBfYWRkcikJCQlcCisJSUlPX0RFVklDRV9BVFRSKGx2YXJlbmVyZ3ksIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQ0hLU1VNKF9zaG93LCBfYWRkcikgICAgICAgICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoY2hrc3VtLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FOR0xFMChfc2hvdywgX2FkZHIpICAgICAgICAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGFuZ2xlMCwgU19JUlVHTywgX3Nob3csIE5VTEwsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9BTkdMRTEoX3Nob3csIF9hZGRyKSAgICAgICAgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihhbmdsZTEsIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQU5HTEUyKF9zaG93LCBfYWRkcikgICAgICAgICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoYW5nbGUyLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FXQVRUSFIoX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIoYXdhdHRociwgU19JUlVHTywgX3Nob3csIE5VTEwsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9CV0FUVEhSKF9zaG93LCBfYWRkcikJCQlcCisJSUlPX0RFVklDRV9BVFRSKGJ3YXR0aHIsIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQ1dBVFRIUihfc2hvdywgX2FkZHIpCQkJXAorCUlJT19ERVZJQ0VfQVRUUihjd2F0dGhyLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FGV0FUVEhSKF9zaG93LCBfYWRkcikJCQlcCisJSUlPX0RFVklDRV9BVFRSKGFmd2F0dGhyLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0JGV0FUVEhSKF9zaG93LCBfYWRkcikJCQlcCisJSUlPX0RFVklDRV9BVFRSKGJmd2F0dGhyLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NGV0FUVEhSKF9zaG93LCBfYWRkcikJCQlcCisJSUlPX0RFVklDRV9BVFRSKGNmd2F0dGhyLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FWQVJIUihfc2hvdywgX2FkZHIpCQkJXAorCUlJT19ERVZJQ0VfQVRUUihhdmFyaHIsIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQlZBUkhSKF9zaG93LCBfYWRkcikJCQlcCisJSUlPX0RFVklDRV9BVFRSKGJ2YXJociwgU19JUlVHTywgX3Nob3csIE5VTEwsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9DVkFSSFIoX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIoY3ZhcmhyLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FWQUhSKF9zaG93LCBfYWRkcikJCQlcCisJSUlPX0RFVklDRV9BVFRSKGF2YWhyLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0JWQUhSKF9zaG93LCBfYWRkcikJCQlcCisJSUlPX0RFVklDRV9BVFRSKGJ2YWhyLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NWQUhSKF9zaG93LCBfYWRkcikJCQlcCisJSUlPX0RFVklDRV9BVFRSKGN2YWhyLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0lPUyhfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoaW9zLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1ZPUyhfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIodm9zLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1BIQ0FMKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihwaGNhbCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9BUEhDQUwoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGFwaGNhbCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9CUEhDQUwoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGJwaGNhbCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9DUEhDQUwoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGNwaGNhbCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9BUE9TKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihhcG9zLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FBUE9TKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihhYXBvcywgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9CQVBPUyhfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoYmFwb3MsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQ0FQT1MoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGNhcG9zLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FWUk1TR0FJTihfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoYXZybXNnYWluLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0JWUk1TR0FJTihfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoYnZybXNnYWluLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NWUk1TR0FJTihfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoY3ZybXNnYWluLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FJR0FJTihfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoYWlnYWluLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0JJR0FJTihfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoYmlnYWluLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NJR0FJTihfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoY2lnYWluLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX05JR0FJTihfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIobmlnYWluLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FWR0FJTihfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoYXZnYWluLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0JWR0FJTihfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoYnZnYWluLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NWR0FJTihfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoY3ZnYWluLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1dHQUlOKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUih3Z2FpbiwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9XRElWKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUih3ZGl2LCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NGTlVNKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihjZm51bSwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9DRkRFTihfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoY2ZkZW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQ0YxREVOKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihjZjFkZW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQ0YyREVOKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihjZjJkZW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQ0YzREVOKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihjZjNkZW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfSVJNUyhfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoaXJtcywgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9WUk1TKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUih2cm1zLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FJUk1TKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihhaXJtcywgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9CSVJNUyhfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoYmlybXMsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQ0lSTVMoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGNpcm1zLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX05JUk1TKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihuaXJtcywgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9BVlJNUyhfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoYXZybXMsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQlZSTVMoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGJ2cm1zLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NWUk1TKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihjdnJtcywgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9JUk1TT1MoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGlybXNvcywgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9WUk1TT1MoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKHZybXNvcywgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9BSVJNU09TKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihhaXJtc29zLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0JJUk1TT1MoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGJpcm1zb3MsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQ0lSTVNPUyhfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoY2lybXNvcywgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9BVlJNU09TKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihhdnJtc29zLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0JWUk1TT1MoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGJ2cm1zb3MsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQ1ZSTVNPUyhfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoY3ZybXNvcywgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9WQUdBSU4oX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKHZhZ2FpbiwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9QR0FfR0FJTihfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIocGdhX2dhaW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfVkFESVYoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKHZhZGl2LCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0xJTkVDWUMoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGxpbmVjeWMsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfU0FHQ1lDKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihzYWdjeWMsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQ0ZDWUMoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGNmY3ljLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1BFQUtDWUMoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKHBlYWtjeWMsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfU0FHTFZMKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihzYWdsdmwsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfSVBLTFZMKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihpcGtsdmwsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfVlBLTFZMKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUih2cGtsdmwsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfSVBFQUsoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIoaXBlYWssIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfUklQRUFLKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikJCQlcCisJSUlPX0RFVklDRV9BVFRSKHJpcGVhaywgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9WUEVBSyhfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCQkJXAorCUlJT19ERVZJQ0VfQVRUUih2cGVhaywgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9SVlBFQUsoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIocnZwZWFrLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1ZQRVJJT0QoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIodnBlcmlvZCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9DSF9PRkYoX251bSwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQkJCVwKKyAgSUlPX0RFVklDRV9BVFRSKGNob2ZmXyMjX251bSwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisvKiBhY3RpdmUgZW5lcmd5IHJlZ2lzdGVyLCBBRU5FUkdZLCBpcyBtb3JlIHRoYW4gaGFsZiBmdWxsICovCisjZGVmaW5lIElJT19FVkVOVF9BVFRSX0FFTkVSR1lfSEFMRl9GVUxMKF9ldmxpc3QsIF9zaG93LCBfc3RvcmUsIF9tYXNrKSBcCisJSUlPX0VWRU5UX0FUVFJfU0goYWVuZXJneV9oYWxmX2Z1bGwsIF9ldmxpc3QsIF9zaG93LCBfc3RvcmUsIF9tYXNrKQorCisvKiBhIFNBRyBvbiB0aGUgbGluZSB2b2x0YWdlICovCisjZGVmaW5lIElJT19FVkVOVF9BVFRSX0xJTkVfVk9MVF9TQUcoX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spIFwKKwlJSU9fRVZFTlRfQVRUUl9TSChsaW5lX3ZvbHRfc2FnLCBfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykKKworLyoKKyAqIEluZGljYXRlcyB0aGUgZW5kIG9mIGVuZXJneSBhY2N1bXVsYXRpb24gb3ZlciBhbiBpbnRlZ2VyIG51bWJlcgorICogb2YgaGFsZiBsaW5lIGN5Y2xlcworICovCisjZGVmaW5lIElJT19FVkVOVF9BVFRSX0NZQ0VORChfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykgXAorCUlJT19FVkVOVF9BVFRSX1NIKGN5Y2VuZCwgX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spCisKKy8qIG9uIHRoZSByaXNpbmcgYW5kIGZhbGxpbmcgZWRnZSBvZiB0aGUgdGhlIHZvbHRhZ2Ugd2F2ZWZvcm0gKi8KKyNkZWZpbmUgSUlPX0VWRU5UX0FUVFJfWkVST19DUk9TUyhfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykgXAorCUlJT19FVkVOVF9BVFRSX1NIKHplcm9fY3Jvc3MsIF9ldmxpc3QsIF9zaG93LCBfc3RvcmUsIF9tYXNrKQorCisvKiB0aGUgYWN0aXZlIGVuZXJneSByZWdpc3RlciBoYXMgb3ZlcmZsb3dlZCAqLworI2RlZmluZSBJSU9fRVZFTlRfQVRUUl9BRU5FUkdZX09WRVJGTE9XKF9ldmxpc3QsIF9zaG93LCBfc3RvcmUsIF9tYXNrKSBcCisJSUlPX0VWRU5UX0FUVFJfU0goYWVuZXJneV9vdmVyZmxvdywgX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spCisKKy8qIHRoZSBhcHBhcmVudCBlbmVyZ3kgcmVnaXN0ZXIgaGFzIG92ZXJmbG93ZWQgKi8KKyNkZWZpbmUgSUlPX0VWRU5UX0FUVFJfVkFFTkVSR1lfT1ZFUkZMT1coX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spIFwKKwlJSU9fRVZFTlRfQVRUUl9TSCh2YWVuZXJneV9vdmVyZmxvdywgX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spCisKKy8qIHRoZSBhY3RpdmUgZW5lcmd5IHJlZ2lzdGVyLCBWQUVORVJHWSwgaXMgbW9yZSB0aGFuIGhhbGYgZnVsbCAqLworI2RlZmluZSBJSU9fRVZFTlRfQVRUUl9WQUVORVJHWV9IQUxGX0ZVTEwoX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spIFwKKwlJSU9fRVZFTlRfQVRUUl9TSCh2YWVuZXJneV9oYWxmX2Z1bGwsIF9ldmxpc3QsIF9zaG93LCBfc3RvcmUsIF9tYXNrKQorCisvKiB0aGUgcG93ZXIgaGFzIGdvbmUgZnJvbSBuZWdhdGl2ZSB0byBwb3NpdGl2ZSAqLworI2RlZmluZSBJSU9fRVZFTlRfQVRUUl9QUE9TKF9ldmxpc3QsIF9zaG93LCBfc3RvcmUsIF9tYXNrKSBcCisJSUlPX0VWRU5UX0FUVFJfU0gocHBvcywgX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spCisKKy8qIHRoZSBwb3dlciBoYXMgZ29uZSBmcm9tIHBvc2l0aXZlIHRvIG5lZ2F0aXZlICovCisjZGVmaW5lIElJT19FVkVOVF9BVFRSX1BORUcoX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spIFwKKwlJSU9fRVZFTlRfQVRUUl9TSChwbmVnLCBfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykKKworLyogd2F2ZWZvcm0gc2FtcGxlIGZyb20gQ2hhbm5lbCAxIGhhcyBleGNlZWRlZCB0aGUgSVBLTFZMIHZhbHVlICovCisjZGVmaW5lIElJT19FVkVOVF9BVFRSX0lQS0xWTF9FWEMoX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spIFwKKwlJSU9fRVZFTlRfQVRUUl9TSChpcGtsdmxfZXhjLCBfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykKKworLyogd2F2ZWZvcm0gc2FtcGxlIGZyb20gQ2hhbm5lbCAyIGhhcyBleGNlZWRlZCB0aGUgVlBLTFZMIHZhbHVlICovCisjZGVmaW5lIElJT19FVkVOVF9BVFRSX1ZQS0xWTF9FWEMoX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spIFwKKwlJSU9fRVZFTlRfQVRUUl9TSCh2cGtsdmxfZXhjLCBfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9yZXNvbHZlci9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2lpby9yZXNvbHZlci9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YTM2MzQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jlc29sdmVyL0tjb25maWcKQEAgLTAsMCArMSw1NCBAQAorIworIyBSZXNvbHZlci9TeW5jaHJvIGRyaXZlcnMKKyMKK2NvbW1lbnQgIlJlc29sdmVyIHRvIGRpZ2l0YWwgY29udmVydGVycyIKKworY29uZmlnIEFEMlM5MAorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBhZDJzOTAgZHJpdmVyIgorCWRlcGVuZHMgb24gU1BJCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIHNwaSByZXNvbHZlcgorCSAgdG8gZGlnaXRhbCBjb252ZXJ0ZXJzLCBhZDJzOTAsIHByb3ZpZGVzIGRpcmVjdCBhY2Nlc3MgdmlhIHN5c2ZzLgorCitjb25maWcgQUQyUzEyMFgKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgYWQyczEyMHggZHJpdmVyIgorCWRlcGVuZHMgb24gU1BJCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIHNwaSByZXNvbHZlcgorCSAgdG8gZGlnaXRhbCBjb252ZXJ0ZXJzLCBhZDJzMTIwMCBhbmQgYWQyczEyMDUsIHByb3ZpZGVzIGRpcmVjdCBhY2Nlc3MKKwkgIHZpYSBzeXNmcy4KKworY29uZmlnIEFEMlMxMjEwCisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIGFkMnMxMjEwIGRyaXZlciIKKwlkZXBlbmRzIG9uIFNQSQorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBzcGkgcmVzb2x2ZXIKKwkgIHRvIGRpZ2l0YWwgY29udmVydGVycywgYWQyczEyMTAsIHByb3ZpZGVzIGRpcmVjdCBhY2Nlc3MgdmlhIHN5c2ZzLgorCitjaG9pY2UKKwlwcm9tcHQgIlJlc29sdXRpb24gQ29udHJvbCIKKwlkZXBlbmRzIG9uIEFEMlMxMjEwCisJZGVmYXVsdCBBRDJTMTIxMF9HUElPX05PTkUKKwloZWxwCisJICBJbiBub3JtYWwgbW9kZSwgdGhlIHJlc29sdXRpb24gb2YgdGhlIGRpZ2l0YWwgb3V0cHV0IGlzIHNlbGVjdGVkCisJICB1c2luZyB0aGUgUkVTMCBhbmQgUkVTMSBpbnB1dCBwaW5zLiBJbiBjb25maWd1cmF0aW9uIG1vZGUsIHRoZQorCSAgcmVzb2x1dGlvbiBpcyBzZWxlY3RlZCBieSBzZXR0aW5nIHRoZSBSRVMwIGFuZCBSRVMxIGJpdHMgaW4gdGhlCisJICBjb250cm9sIHJlZ3NpdGVyLiBXaGVuIHN3aXRjaGluZyBiZXR3ZWVuIG5vcm1hbCBtb2RlIGFuZCBjb25maWd1cmF0aW9uCisJICBtb2RlLCB0aGVyZSBhcmUgc29tZSBzY2hlbWVzIHRvIGtlZXAgdGhlbSBtYXRjaHMuCisKK2NvbmZpZyBBRDJTMTIxMF9HUElPX0lOUFVUCisJYm9vbCAicmVhZCByZXNvbHV0aW9uIGZyb20gZ3BpbyBwaW5zIgorCWhlbHAKKwkgIEdQSU8gcGlucyBhcmUgc2FtcGxpbmcgUkVTMCBhbmQgUkVTMSBwaW5zLCByZWFkIHRoZSByZXNvbHV0aW9uCisJICBzZXR0aW5ncyBmcm9tIHRoZSBHUElPIHBpbnMuCisKK2NvbmZpZyBBRDJTMTIxMF9HUElPX09VVFBVVAorCWJvb2wgInNldCBncGlvIHBpbnMgdG8gc2V0IHJlc29sdXRpb24iCisJaGVscAorCSAgUkVTMCBhbmQgUkVTMSBwaW5zIGFyZSBjb250cm9sbGVkIGJ5IEdQSU9zLCBzZXR0aW5nIEdQSU8gcGlucyB0bworCSAgc2V0IHRoZSByZXNvbHV0aW9uLgorCitjb25maWcgQUQyUzEyMTBfR1BJT19OT05FCisJYm9vbCAidGFrZSB0aGUgcmVzcG9uc2liaWxpdHkgYnkgdXNlciIKKworZW5kY2hvaWNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jlc29sdmVyL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2lpby9yZXNvbHZlci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjg0YTg5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9yZXNvbHZlci9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIFJlc29sdmVyL1N5bmNocm8gZHJpdmVycworIworCitvYmotJChDT05GSUdfQUQyUzkwKSArPSBhZDJzOTAubworb2JqLSQoQ09ORklHX0FEMlMxMjBYKSArPSBhZDJzMTIweC5vCitvYmotJChDT05GSUdfQUQyUzEyMTApICs9IGFkMnMxMjEwLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vcmVzb2x2ZXIvYWQyczEyMHguYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vcmVzb2x2ZXIvYWQyczEyMHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjQ5N2EyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9yZXNvbHZlci9hZDJzMTIweC5jCkBAIC0wLDAgKzEsMzEwIEBACisvKgorICogYWQyczEyMHguYyBzaW1wbGUgc3VwcG9ydCBmb3IgdGhlIEFESSBSZXNvbHZlciB0byBEaWdpdGFsIENvbnZlcnRlcnM6IEFEMlMxMjAwLzEyMDUKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKworI2RlZmluZSBEUlZfTkFNRSAiYWQyczEyMHgiCisKKy8qIGlucHV0IHBpbiBzYW1wbGUgYW5kIHJkdmVsIGlzIGNvbnRyb2xsZWQgYnkgZHJpdmVyICovCisjZGVmaW5lIEFEMlMxMjBYX1BOCTIKKworLyogaW5wdXQgY2xvY2sgb24gc2VyaWFsIGludGVyZmFjZSAqLworI2RlZmluZSBBRDJTMTIwWF9IWgk4MTkyMDAwCisvKiBjbG9jayBwZXJpb2QgaW4gbmFubyBzZWNvbmQgKi8KKyNkZWZpbmUgQUQyUzEyMFhfVFNDTEsJKDEwMDAwMDAwMDAvQUQyUzEyMFhfSFopCisKK3N0cnVjdCBhZDJzMTIweF9zdGF0ZSB7CisJc3RydWN0IG11dGV4IGxvY2s7CisJc3RydWN0IGlpb19kZXYgKmlkZXY7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNkZXY7CisJdW5zaWduZWQgc2hvcnQgc2FtcGxlOworCXVuc2lnbmVkIHNob3J0IHJkdmVsOworCXU4IHJ4WzJdOworCXU4IHR4WzJdOworfTsKKworc3RhdGljIHNzaXplX3QgYWQyczEyMHhfc2hvd19wb3NfdmVsKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXI7CisJaW50IHJldCA9IDA7CisJc3NpemVfdCBsZW4gPSAwOworCXUxNiBwb3M7CisJczE2IHZlbDsKKwl1OCBzdGF0dXM7CisJc3RydWN0IGlpb19kZXYgKmlkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQyczEyMHhfc3RhdGUgKnN0ID0gaWRldi0+ZGV2X2RhdGE7CisKKwl4ZmVyLmxlbiA9IDE7CisJeGZlci50eF9idWYgPSBzdC0+dHg7CisJeGZlci5yeF9idWYgPSBzdC0+cng7CisJbXV0ZXhfbG9jaygmc3QtPmxvY2spOworCisJZ3Bpb19zZXRfdmFsdWUoc3QtPnNhbXBsZSwgMCk7CisJLyogZGVsYXkgKDYgKiBBRDJTMTIwWF9UU0NMSyArIDIwKSBuYW5vIHNlY29uZHMgKi8KKwl1ZGVsYXkoMSk7CisJZ3Bpb19zZXRfdmFsdWUoc3QtPnNhbXBsZSwgMSk7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisJc3RhdHVzID0gc3QtPnJ4WzFdOworCXBvcyA9ICgoKHUxNikoc3QtPnJ4WzBdKSkgPDwgNCkgfCAoKHN0LT5yeFsxXSAmIDB4RjApID4+IDQpOworCWxlbiA9IHNwcmludGYoYnVmLCAiJWQgJWMlYyVjJWMgIiwgcG9zLAorCQkJCShzdGF0dXMgJiAweDgpID8gJ1AnIDogJ1YnLAorCQkJCShzdGF0dXMgJiAweDQpID8gJ2QnIDogJ18nLAorCQkJCShzdGF0dXMgJiAweDIpID8gJ2wnIDogJ18nLAorCQkJCShzdGF0dXMgJiAweDEpID8gJzEnIDogJzAnKTsKKworCS8qIGRlbGF5IDE4IG5zICovCisJLyogbmRlbGF5KDE4KTsgKi8KKworCWdwaW9fc2V0X3ZhbHVlKHN0LT5yZHZlbCwgMCk7CisJLyogbmRlbGF5KDUpOyovCisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisJc3RhdHVzID0gc3QtPnJ4WzFdOworCXZlbCA9IChzdC0+cnhbMF0gJiAweDgwKSA/IDB4ZjAwMCA6IDA7CisJdmVsIHw9ICgoKHMxNikoc3QtPnJ4WzBdKSkgPDwgNCkgfCAoKHN0LT5yeFsxXSAmIDB4RjApID4+IDQpOworCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIiVkICVjJWMlYyVjXG4iLCB2ZWwsCisJCQkJKHN0YXR1cyAmIDB4OCkgPyAnUCcgOiAnVicsCisJCQkJKHN0YXR1cyAmIDB4NCkgPyAnZCcgOiAnXycsCisJCQkJKHN0YXR1cyAmIDB4MikgPyAnbCcgOiAnXycsCisJCQkJKHN0YXR1cyAmIDB4MSkgPyAnMScgOiAnMCcpOworZXJyb3JfcmV0OgorCWdwaW9fc2V0X3ZhbHVlKHN0LT5yZHZlbCwgMSk7CisJLyogZGVsYXkgKDIgKiBBRDJTMTIwWF9UU0NMSyArIDIwKSBucyBmb3Igc2FtcGxlIHB1bHNlICovCisJdWRlbGF5KDEpOworCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgYWQyczEyMHhfc2hvd19wb3Moc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcjsKKwlpbnQgcmV0ID0gMDsKKwlzc2l6ZV90IGxlbiA9IDA7CisJdTE2IHBvczsKKwl1OCBzdGF0dXM7CisJc3RydWN0IGlpb19kZXYgKmlkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQyczEyMHhfc3RhdGUgKnN0ID0gaWRldi0+ZGV2X2RhdGE7CisKKwl4ZmVyLmxlbiA9IDE7CisJeGZlci50eF9idWYgPSBzdC0+dHg7CisJeGZlci5yeF9idWYgPSBzdC0+cng7CisJbXV0ZXhfbG9jaygmc3QtPmxvY2spOworCisJZ3Bpb19zZXRfdmFsdWUoc3QtPnNhbXBsZSwgMCk7CisJLyogZGVsYXkgKDYgKiBBRDJTMTIwWF9UU0NMSyArIDIwKSBuYW5vIHNlY29uZHMgKi8KKwl1ZGVsYXkoMSk7CisJZ3Bpb19zZXRfdmFsdWUoc3QtPnNhbXBsZSwgMSk7CisJZ3Bpb19zZXRfdmFsdWUoc3QtPnJkdmVsLCAxKTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKwlzdGF0dXMgPSBzdC0+cnhbMV07CisJcG9zID0gKCgodTE2KShzdC0+cnhbMF0pKSA8PCA0KSB8ICgoc3QtPnJ4WzFdICYgMHhGMCkgPj4gNCk7CisJbGVuID0gc3ByaW50ZihidWYsICIlZCAlYyVjJWMlYyAiLCBwb3MsCisJCQkJKHN0YXR1cyAmIDB4OCkgPyAnUCcgOiAnVicsCisJCQkJKHN0YXR1cyAmIDB4NCkgPyAnZCcgOiAnXycsCisJCQkJKHN0YXR1cyAmIDB4MikgPyAnbCcgOiAnXycsCisJCQkJKHN0YXR1cyAmIDB4MSkgPyAnMScgOiAnMCcpOworZXJyb3JfcmV0OgorCS8qIGRlbGF5ICgyICogQUQyUzEyMFhfVFNDTEsgKyAyMCkgbnMgZm9yIHNhbXBsZSBwdWxzZSAqLworCXVkZWxheSgxKTsKKwltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKworCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkMnMxMjB4X3Nob3dfdmVsKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXI7CisJaW50IHJldCA9IDA7CisJc3NpemVfdCBsZW4gPSAwOworCXMxNiB2ZWw7CisJdTggc3RhdHVzOworCXN0cnVjdCBpaW9fZGV2ICppZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkMnMxMjB4X3N0YXRlICpzdCA9IGlkZXYtPmRldl9kYXRhOworCisJeGZlci5sZW4gPSAxOworCXhmZXIudHhfYnVmID0gc3QtPnR4OworCXhmZXIucnhfYnVmID0gc3QtPnJ4OworCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKKworCWdwaW9fc2V0X3ZhbHVlKHN0LT5zYW1wbGUsIDApOworCS8qIGRlbGF5ICg2ICogQUQyUzEyMFhfVFNDTEsgKyAyMCkgbmFubyBzZWNvbmRzICovCisJdWRlbGF5KDEpOworCWdwaW9fc2V0X3ZhbHVlKHN0LT5zYW1wbGUsIDEpOworCisJZ3Bpb19zZXRfdmFsdWUoc3QtPnJkdmVsLCAwKTsKKwkvKiBuZGVsYXkoNSk7Ki8KKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKwlzdGF0dXMgPSBzdC0+cnhbMV07CisJdmVsID0gKHN0LT5yeFswXSAmIDB4ODApID8gMHhmMDAwIDogMDsKKwl2ZWwgfD0gKCgoczE2KShzdC0+cnhbMF0pKSA8PCA0KSB8ICgoc3QtPnJ4WzFdICYgMHhGMCkgPj4gNCk7CisJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiJWQgJWMlYyVjJWNcbiIsIHZlbCwKKwkJCQkoc3RhdHVzICYgMHg4KSA/ICdQJyA6ICdWJywKKwkJCQkoc3RhdHVzICYgMHg0KSA/ICdkJyA6ICdfJywKKwkJCQkoc3RhdHVzICYgMHgyKSA/ICdsJyA6ICdfJywKKwkJCQkoc3RhdHVzICYgMHgxKSA/ICcxJyA6ICcwJyk7CitlcnJvcl9yZXQ6CisJZ3Bpb19zZXRfdmFsdWUoc3QtPnJkdmVsLCAxKTsKKwkvKiBkZWxheSAoMiAqIEFEMlMxMjBYX1RTQ0xLICsgMjApIG5zIGZvciBzYW1wbGUgcHVsc2UgKi8KKwl1ZGVsYXkoMSk7CisJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgSUlPX0NPTlNUX0FUVFIoZGVzY3JpcHRpb24sCisJIjEyLUJpdCBSL0QgQ29udmVydGVyIHdpdGggUmVmZXJlbmNlIE9zY2lsbGF0b3IiKTsKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIocG9zX3ZlbCwgU19JUlVHTywgYWQyczEyMHhfc2hvd19wb3NfdmVsLCBOVUxMLCAwKTsKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIocG9zLCBTX0lSVUdPLCBhZDJzMTIweF9zaG93X3BvcywgTlVMTCwgMCk7CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKHZlbCwgU19JUlVHTywgYWQyczEyMHhfc2hvd192ZWwsIE5VTEwsIDApOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWQyczEyMHhfYXR0cmlidXRlc1tdID0geworCSZpaW9fY29uc3RfYXR0cl9kZXNjcmlwdGlvbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcG9zX3ZlbC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcG9zLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl92ZWwuZGV2X2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWQyczEyMHhfYXR0cmlidXRlX2dyb3VwID0geworCS5uYW1lID0gRFJWX05BTUUsCisJLmF0dHJzID0gYWQyczEyMHhfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkMnMxMjB4X3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGFkMnMxMjB4X3N0YXRlICpzdDsKKwlpbnQgcG4sIHJldCA9IDA7CisJdW5zaWduZWQgc2hvcnQgKnBpbnMgPSBzcGktPmRldi5wbGF0Zm9ybV9kYXRhOworCisJZm9yIChwbiA9IDA7IHBuIDwgQUQyUzEyMFhfUE47IHBuKyspIHsKKwkJaWYgKGdwaW9fcmVxdWVzdChwaW5zW3BuXSwgRFJWX05BTUUpKSB7CisJCQlwcl9lcnIoIiVzOiByZXF1ZXN0IGdwaW8gcGluICVkIGZhaWxlZFxuIiwKKwkJCQkJCURSVl9OQU1FLCBwaW5zW3BuXSk7CisJCQlnb3RvIGVycm9yX3JldDsKKwkJfQorCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQocGluc1twbl0sIDEpOworCX0KKworCXN0ID0ga3phbGxvYyhzaXplb2YoKnN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCXNwaV9zZXRfZHJ2ZGF0YShzcGksIHN0KTsKKworCW11dGV4X2luaXQoJnN0LT5sb2NrKTsKKwlzdC0+c2RldiA9IHNwaTsKKwlzdC0+c2FtcGxlID0gcGluc1swXTsKKwlzdC0+cmR2ZWwgPSBwaW5zWzFdOworCisJc3QtPmlkZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKHN0LT5pZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3N0OworCX0KKwlzdC0+aWRldi0+ZGV2LnBhcmVudCA9ICZzcGktPmRldjsKKwlzdC0+aWRldi0+bnVtX2ludGVycnVwdF9saW5lcyA9IDA7CisJc3QtPmlkZXYtPmV2ZW50X2F0dHJzID0gTlVMTDsKKworCXN0LT5pZGV2LT5hdHRycyA9ICZhZDJzMTIweF9hdHRyaWJ1dGVfZ3JvdXA7CisJc3QtPmlkZXYtPmRldl9kYXRhID0gKHZvaWQgKikoc3QpOworCXN0LT5pZGV2LT5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEU7CisJc3QtPmlkZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKHN0LT5pZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2OworCisJc3BpLT5tYXhfc3BlZWRfaHogPSBBRDJTMTIwWF9IWjsKKwlzcGktPm1vZGUgPSBTUElfTU9ERV8zOworCXNwaV9zZXR1cChzcGkpOworCisJcmV0dXJuIDA7CisKK2Vycm9yX2ZyZWVfZGV2OgorCWlpb19mcmVlX2RldmljZShzdC0+aWRldik7CitlcnJvcl9mcmVlX3N0OgorCWtmcmVlKHN0KTsKK2Vycm9yX3JldDoKKwlmb3IgKC0tcG47IHBuID49IDA7IHBuLS0pCisJCWdwaW9fZnJlZShwaW5zW3BuXSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYWQyczEyMHhfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGFkMnMxMjB4X3N0YXRlICpzdCA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCisJaWlvX2RldmljZV91bnJlZ2lzdGVyKHN0LT5pZGV2KTsKKwlrZnJlZShzdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFkMnMxMjB4X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9IERSVl9OQU1FLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IGFkMnMxMjB4X3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZDJzMTIweF9yZW1vdmUpLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWQyczEyMHhfc3BpX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmYWQyczEyMHhfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGFkMnMxMjB4X3NwaV9pbml0KTsKKworc3RhdGljIF9fZXhpdCB2b2lkIGFkMnMxMjB4X3NwaV9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZDJzMTIweF9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoYWQyczEyMHhfc3BpX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJHcmFmZiBZYW5nIDxncmFmZi55YW5nQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQUQyUzEyMDAvMTIwNSBSZXNvbHZlciB0byBEaWdpdGFsIFNQSSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vcmVzb2x2ZXIvYWQyczEyMTAuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vcmVzb2x2ZXIvYWQyczEyMTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTJmNjRjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9yZXNvbHZlci9hZDJzMTIxMC5jCkBAIC0wLDAgKzEsODcyIEBACisvKgorICogYWQyczEyMTAuYyBzdXBwb3J0IGZvciB0aGUgQURJIFJlc29sdmVyIHRvIERpZ2l0YWwgQ29udmVydGVyczogQUQyUzEyMTAKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKworI2RlZmluZSBEUlZfTkFNRSAiYWQyczEyMTAiCisKKyNkZWZpbmUgREVGX0NPTlRST0wJCTB4N0UKKworI2RlZmluZSBNU0JfSVNfSElHSAkJMHg4MAorI2RlZmluZSBNU0JfSVNfTE9XCQkweDdGCisjZGVmaW5lIFBIQVNFX0xPQ0tfUkFOR0VfNDQJMHgyMAorI2RlZmluZSBFTkFCTEVfSFlTVEVSRVNJUwkweDEwCisjZGVmaW5lIFNFVF9FTlJFUzEJCTB4MDgKKyNkZWZpbmUgU0VUX0VOUkVTMAkJMHgwNAorI2RlZmluZSBTRVRfUkVTMQkJMHgwMgorI2RlZmluZSBTRVRfUkVTMAkJMHgwMQorCisjZGVmaW5lIFNFVF9FTlJFU09MVVRJT04JKFNFVF9FTlJFUzEgfCBTRVRfRU5SRVMwKQorI2RlZmluZSBTRVRfUkVTT0xVVElPTgkJKFNFVF9SRVMxIHwgU0VUX1JFUzApCisKKyNkZWZpbmUgUkVHX1BPU0lUSU9OCQkweDgwCisjZGVmaW5lIFJFR19WRUxPQ0lUWQkJMHg4MgorI2RlZmluZSBSRUdfTE9TX1RIUkQJCTB4ODgKKyNkZWZpbmUgUkVHX0RPU19PVlJfVEhSRAkweDg5CisjZGVmaW5lIFJFR19ET1NfTUlTX1RIUkQJMHg4QQorI2RlZmluZSBSRUdfRE9TX1JTVF9NQVhfVEhSRAkweDhCCisjZGVmaW5lIFJFR19ET1NfUlNUX01JTl9USFJECTB4OEMKKyNkZWZpbmUgUkVHX0xPVF9ISUdIX1RIUkQJMHg4RAorI2RlZmluZSBSRUdfTE9UX0xPV19USFJECTB4OEUKKyNkZWZpbmUgUkVHX0VYQ0lUX0ZSRVEJCTB4OTEKKyNkZWZpbmUgUkVHX0NPTlRST0wJCTB4OTIKKyNkZWZpbmUgUkVHX1NPRlRfUkVTRVQJCTB4RjAKKyNkZWZpbmUgUkVHX0ZBVUxUCQkweEZGCisKKy8qIHBpbiBTQU1QTEUsIEEwLCBBMSwgUkVTMCwgUkVTMSwgaXMgY29udHJvbGxlZCBieSBkcml2ZXIgKi8KKyNkZWZpbmUgQUQyUzEyMTBfU0FBCQkzCisjaWYgZGVmaW5lZChDT05GSUdfQUQyUzEyMTBfR1BJT19JTlBVVCkgfHwgZGVmaW5lZChDT05GSUdfQUQyUzEyMTBfR1BJT19PVVRQVVQpCisjIGRlZmluZSBBRDJTMTIxMF9SRVMJCTIKKyNlbHNlCisjIGRlZmluZSBBRDJTMTIxMF9SRVMJCTAKKyNlbmRpZgorI2RlZmluZSBBRDJTMTIxMF9QTgkJKEFEMlMxMjEwX1NBQSArIEFEMlMxMjEwX1JFUykKKworI2RlZmluZSBBRDJTMTIxMF9NSU5fQ0xLSU4JNjE0NDAwMAorI2RlZmluZSBBRDJTMTIxMF9NQVhfQ0xLSU4JMTAyNDAwMDAKKyNkZWZpbmUgQUQyUzEyMTBfTUlOX0VYQ0lUCTIwMDAKKyNkZWZpbmUgQUQyUzEyMTBfTUFYX0VYQ0lUCTIwMDAwCisjZGVmaW5lIEFEMlMxMjEwX01JTl9GQ1cJMHg0CisjZGVmaW5lIEFEMlMxMjEwX01BWF9GQ1cJMHg1MAorCisvKiBkZWZhdWx0IGlucHV0IGNsb2NrIG9uIHNlcmlhbCBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgQUQyUzEyMTBfREVGX0NMS0lOCTgxOTIwMDAKKy8qIGNsb2NrIHBlcmlvZCBpbiBuYW5vIHNlY29uZCAqLworI2RlZmluZSBBRDJTMTIxMF9ERUZfVENLCSgxMDAwMDAwMDAwL0FEMlMxMjEwX0RFRl9DTEtJTikKKyNkZWZpbmUgQUQyUzEyMTBfREVGX0VYQ0lUCTEwMDAwCisKK2VudW0gYWQyczEyMTBfbW9kZSB7CisJTU9EX1BPUyA9IDAsCisJTU9EX1ZFTCwKKwlNT0RfUkVTRVJWRUQsCisJTU9EX0NPTkZJRywKK307CisKK2VudW0gYWQyczEyMTBfcmVzIHsKKwlSRVNfMTAgPSAxMCwKKwlSRVNfMTIgPSAxMiwKKwlSRVNfMTQgPSAxNCwKKwlSRVNfMTYgPSAxNiwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcmVzb2x1dGlvbl92YWx1ZVtdID0geworCQlSRVNfMTAsIFJFU18xMiwgUkVTXzE0LCBSRVNfMTZ9OworCitzdHJ1Y3QgYWQyczEyMTBfc3RhdGUgeworCXN0cnVjdCBtdXRleCBsb2NrOworCXN0cnVjdCBpaW9fZGV2ICppZGV2OworCXN0cnVjdCBzcGlfZGV2aWNlICpzZGV2OworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcjsKKwl1bnNpZ25lZCBpbnQgaHlzdGVyZXNpczsKKwl1bnNpZ25lZCBpbnQgb2xkX2RhdGE7CisJZW51bSBhZDJzMTIxMF9tb2RlIG1vZGU7CisJZW51bSBhZDJzMTIxMF9yZXMgcmVzb2x1dGlvbjsKKwl1bnNpZ25lZCBpbnQgZmNsa2luOworCXVuc2lnbmVkIGludCBmZXhjaXQ7CisJdW5zaWduZWQgc2hvcnQgc2FtcGxlOworCXVuc2lnbmVkIHNob3J0IGEwOworCXVuc2lnbmVkIHNob3J0IGExOworCXVuc2lnbmVkIHNob3J0IHJlczA7CisJdW5zaWduZWQgc2hvcnQgcmVzMTsKKwl1OCByeFszXTsKKwl1OCB0eFszXTsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdGFydF9zYW1wbGUoc3RydWN0IGFkMnMxMjEwX3N0YXRlICpzdCkKK3sKKwlncGlvX3NldF92YWx1ZShzdC0+c2FtcGxlLCAwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN0b3Bfc2FtcGxlKHN0cnVjdCBhZDJzMTIxMF9zdGF0ZSAqc3QpCit7CisJZ3Bpb19zZXRfdmFsdWUoc3QtPnNhbXBsZSwgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfbW9kZShlbnVtIGFkMnMxMjEwX21vZGUgbW9kZSwgc3RydWN0IGFkMnMxMjEwX3N0YXRlICpzdCkKK3sKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIE1PRF9QT1M6CisJCWdwaW9fc2V0X3ZhbHVlKHN0LT5hMCwgMCk7CisJCWdwaW9fc2V0X3ZhbHVlKHN0LT5hMSwgMCk7CisJCWJyZWFrOworCWNhc2UgTU9EX1ZFTDoKKwkJZ3Bpb19zZXRfdmFsdWUoc3QtPmEwLCAwKTsKKwkJZ3Bpb19zZXRfdmFsdWUoc3QtPmExLCAxKTsKKwkJYnJlYWs7CisJY2FzZSBNT0RfQ09ORklHOgorCQlncGlvX3NldF92YWx1ZShzdC0+YTAsIDEpOworCQlncGlvX3NldF92YWx1ZShzdC0+YTEsIDEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBzZXQgdG8gcmVzZXJ2ZWQgbW9kZSAqLworCQlncGlvX3NldF92YWx1ZShzdC0+YTAsIDEpOworCQlncGlvX3NldF92YWx1ZShzdC0+YTEsIDApOworCX0KKwlzdC0+bW9kZSA9IG1vZGU7Cit9CisKKy8qIHdyaXRlIDEgYnl0ZXMgKGFkZHJlc3Mgb3IgZGF0YSkgdG8gdGhlIGNoaXAgKi8KK3N0YXRpYyBpbnQgY29uZmlnX3dyaXRlKHN0cnVjdCBhZDJzMTIxMF9zdGF0ZSAqc3QsCisJCQkJCXVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCWludCByZXQgPSAwOworCisJc3QtPnhmZXIubGVuID0gMTsKKwlzZXRfbW9kZShNT0RfQ09ORklHLCBzdCk7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZzdC0+eGZlciwgJm1zZyk7CisJc3QtPnR4WzBdID0gZGF0YTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlzdC0+b2xkX2RhdGEgPSAxOworCXJldHVybiByZXQ7Cit9CisKKy8qIHJlYWQgdmFsdWUgZnJvbSBvbmUgb2YgdGhlIHJlZ2lzdGVycyAqLworc3RhdGljIGludCBjb25maWdfcmVhZChzdHJ1Y3QgYWQyczEyMTBfc3RhdGUgKnN0LAorCQkJCXVuc2lnbmVkIGNoYXIgYWRkcmVzcywKKwkJCQkJdW5zaWduZWQgY2hhciAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCWludCByZXQgPSAwOworCisJc3QtPnhmZXIubGVuID0gMjsKKwlzZXRfbW9kZShNT0RfQ09ORklHLCBzdCk7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZzdC0+eGZlciwgJm1zZyk7CisJc3QtPnR4WzBdID0gYWRkcmVzcyB8IE1TQl9JU19ISUdIOworCXN0LT50eFsxXSA9IFJFR19GQVVMVDsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwkqZGF0YSA9IHN0LT5yeFsxXTsKKwlzdC0+b2xkX2RhdGEgPSAxOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVfZnJlcXVlbmN5X2NvbnRyb2xfd29yZChzdHJ1Y3QgYWQyczEyMTBfc3RhdGUgKnN0KQoreworCXVuc2lnbmVkIGNoYXIgZmN3OworCWZjdyA9ICh1bnNpZ25lZCBjaGFyKShzdC0+ZmV4Y2l0ICogKDEgPDwgMTUpIC8gc3QtPmZjbGtpbik7CisJaWYgKGZjdyA+PSBBRDJTMTIxMF9NSU5fRkNXICYmIGZjdyA8PSBBRDJTMTIxMF9NQVhfRkNXKSB7CisJCWNvbmZpZ193cml0ZShzdCwgUkVHX0VYQ0lUX0ZSRVEpOworCQljb25maWdfd3JpdGUoc3QsIGZjdyk7CisJfSBlbHNlCisJCXByX2VycigiYWQyczEyMTA6IEZDVyBvdXQgb2YgcmFuZ2VcbiIpOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfQUQyUzEyMTBfR1BJT19JTlBVVCkKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciByZWFkX3Jlc29sdXRpb25fcGluKHN0cnVjdCBhZDJzMTIxMF9zdGF0ZSAqc3QpCit7CisJdW5zaWduZWQgaW50IGRhdGE7CisJZGF0YSA9IChncGlvX2dldF92YWx1ZShzdC0+cmVzMCkgPDwgMSkgIHwKKwkJCWdwaW9fZ2V0X3ZhbHVlKHN0LT5yZXMxKTsKKwlyZXR1cm4gcmVzb2x1dGlvbl92YWx1ZVtkYXRhXTsKK30KKyNlbGlmIGRlZmluZWQoQ09ORklHX0FEMlMxMjEwX0dQSU9fT1VUUFVUKQorc3RhdGljIGlubGluZSB2b2lkIHNldF9yZXNvbHV0aW9uX3BpbihzdHJ1Y3QgYWQyczEyMTBfc3RhdGUgKnN0KQoreworCXN3aXRjaCAoc3QtPnJlc29sdXRpb24pIHsKKwljYXNlIFJFU18xMDoKKwkJZ3Bpb19zZXRfdmFsdWUoc3QtPnJlczAsIDApOworCQlncGlvX3NldF92YWx1ZShzdC0+cmVzMSwgMCk7CisJCWJyZWFrOworCWNhc2UgUkVTXzEyOgorCQlncGlvX3NldF92YWx1ZShzdC0+cmVzMCwgMCk7CisJCWdwaW9fc2V0X3ZhbHVlKHN0LT5yZXMxLCAxKTsKKwkJYnJlYWs7CisJY2FzZSBSRVNfMTQ6CisJCWdwaW9fc2V0X3ZhbHVlKHN0LT5yZXMwLCAxKTsKKwkJZ3Bpb19zZXRfdmFsdWUoc3QtPnJlczEsIDApOworCQlicmVhazsKKwljYXNlIFJFU18xNjoKKwkJZ3Bpb19zZXRfdmFsdWUoc3QtPnJlczAsIDEpOworCQlncGlvX3NldF92YWx1ZShzdC0+cmVzMSwgMSk7CisJCWJyZWFrOworCX0KK30KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHZvaWQgc29mdF9yZXNldChzdHJ1Y3QgYWQyczEyMTBfc3RhdGUgKnN0KQoreworCWNvbmZpZ193cml0ZShzdCwgUkVHX1NPRlRfUkVTRVQpOworCWNvbmZpZ193cml0ZShzdCwgMHgwKTsKK30KKworCisvKiByZXR1cm4gdGhlIE9MRCBEQVRBIHNpbmNlIGxhc3Qgc3BpIGJ1cyB3cml0ZSAqLworc3RhdGljIHNzaXplX3QgYWQyczEyMTBfc2hvd19yYXcoc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaWRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDJzMTIxMF9zdGF0ZSAqc3QgPSBpZGV2LT5kZXZfZGF0YTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmc3QtPmxvY2spOworCWlmIChzdC0+b2xkX2RhdGEpIHsKKwkJcmV0ID0gc3ByaW50ZihidWYsICIweCV4XG4iLCBzdC0+cnhbMF0pOworCQlzdC0+b2xkX2RhdGEgPSAwOworCX0gZWxzZQorCQlyZXQgPSAwOworCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkMnMxMjEwX3N0b3JlX3JhdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmlkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQyczEyMTBfc3RhdGUgKnN0ID0gaWRldi0+ZGV2X2RhdGE7CisJdW5zaWduZWQgbG9uZyB1ZGF0YTsKKwl1bnNpZ25lZCBjaGFyIGRhdGE7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTYsICZ1ZGF0YSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZGF0YSA9IHVkYXRhICYgMHhmZjsKKwltdXRleF9sb2NrKCZzdC0+bG9jayk7CisJY29uZmlnX3dyaXRlKHN0LCBkYXRhKTsKKwltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHNzaXplX3QgYWQyczEyMTBfc3RvcmVfc29mdHJlc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICppZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkMnMxMjEwX3N0YXRlICpzdCA9IGlkZXYtPmRldl9kYXRhOworCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKKwlzb2Z0X3Jlc2V0KHN0KTsKKwltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBhZDJzMTIxMF9zaG93X2ZjbGtpbihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICppZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkMnMxMjEwX3N0YXRlICpzdCA9IGlkZXYtPmRldl9kYXRhOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBzdC0+ZmNsa2luKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQyczEyMTBfc3RvcmVfZmNsa2luKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICppZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkMnMxMjEwX3N0YXRlICpzdCA9IGlkZXYtPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmNsa2luOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZmNsa2luKTsKKwlpZiAoIXJldCAmJiBmY2xraW4gPj0gQUQyUzEyMTBfTUlOX0NMS0lOICYmCisJCQkJZmNsa2luIDw9IEFEMlMxMjEwX01BWF9DTEtJTikgeworCQltdXRleF9sb2NrKCZzdC0+bG9jayk7CisJCXN0LT5mY2xraW4gPSBmY2xraW47CisJfSBlbHNlIHsKKwkJcHJfZXJyKCJhZDJzMTIxMDogZmNsa2luIG91dCBvZiByYW5nZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwl1cGRhdGVfZnJlcXVlbmN5X2NvbnRyb2xfd29yZChzdCk7CisJc29mdF9yZXNldChzdCk7CisJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgYWQyczEyMTBfc2hvd19mZXhjaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaWRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDJzMTIxMF9zdGF0ZSAqc3QgPSBpZGV2LT5kZXZfZGF0YTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgc3QtPmZleGNpdCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkMnMxMjEwX3N0b3JlX2ZleGNpdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaWRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDJzMTIxMF9zdGF0ZSAqc3QgPSBpZGV2LT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZleGNpdDsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmZleGNpdCk7CisJaWYgKCFyZXQgJiYgZmV4Y2l0ID49IEFEMlMxMjEwX01JTl9FWENJVCAmJgorCQkJCWZleGNpdCA8PSBBRDJTMTIxMF9NQVhfRVhDSVQpIHsKKwkJbXV0ZXhfbG9jaygmc3QtPmxvY2spOworCQlzdC0+ZmV4Y2l0ID0gZmV4Y2l0OworCX0gZWxzZSB7CisJCXByX2VycigiYWQyczEyMTA6IGV4Y2l0YXRpb24gZnJlcXVlbmN5IG91dCBvZiByYW5nZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwl1cGRhdGVfZnJlcXVlbmN5X2NvbnRyb2xfd29yZChzdCk7CisJc29mdF9yZXNldChzdCk7CisJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgYWQyczEyMTBfc2hvd19jb250cm9sKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmlkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQyczEyMTBfc3RhdGUgKnN0ID0gaWRldi0+ZGV2X2RhdGE7CisJdW5zaWduZWQgY2hhciBkYXRhOworCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKKwljb25maWdfcmVhZChzdCwgUkVHX0NPTlRST0wsICZkYXRhKTsKKwltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCV4XG4iLCBkYXRhKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQyczEyMTBfc3RvcmVfY29udHJvbChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaWRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDJzMTIxMF9zdGF0ZSAqc3QgPSBpZGV2LT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIHVkYXRhOworCXVuc2lnbmVkIGNoYXIgZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxNiwgJnVkYXRhKTsKKwlpZiAocmV0KSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwltdXRleF9sb2NrKCZzdC0+bG9jayk7CisJY29uZmlnX3dyaXRlKHN0LCBSRUdfQ09OVFJPTCk7CisJZGF0YSA9IHVkYXRhICYgTVNCX0lTX0xPVzsKKwljb25maWdfd3JpdGUoc3QsIGRhdGEpOworCWNvbmZpZ19yZWFkKHN0LCBSRUdfQ09OVFJPTCwgJmRhdGEpOworCWlmIChkYXRhICYgTVNCX0lTX0hJR0gpIHsKKwkJcmV0ID0gLUVJTzsKKwkJcHJfZXJyKCJhZDJzMTIxMDogd3JpdGUgY29udHJvbCByZWdpc3RlciBmYWlsXG4iKTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCXN0LT5yZXNvbHV0aW9uID0gcmVzb2x1dGlvbl92YWx1ZVtkYXRhICYgU0VUX1JFU09MVVRJT05dOworI2lmIGRlZmluZWQoQ09ORklHX0FEMlMxMjEwX0dQSU9fSU5QVVQpCisJZGF0YSA9IHJlYWRfcmVzb2x1dGlvbl9waW4oc3QpOworCWlmIChkYXRhICE9IHN0LT5yZXNvbHV0aW9uKQorCQlwcl93YXJuaW5nKCJhZDJzMTIxMDogcmVzb2x1dGlvbiBzZXR0aW5ncyBub3QgbWF0Y2hcbiIpOworI2VsaWYgZGVmaW5lZChDT05GSUdfQUQyUzEyMTBfR1BJT19PVVRQVVQpCisJc2V0X3Jlc29sdXRpb25fcGluKHN0KTsKKyNlbmRpZgorCXJldCA9IGxlbjsKKwlpZiAoZGF0YSAmIEVOQUJMRV9IWVNURVJFU0lTKQorCQlzdC0+aHlzdGVyZXNpcyA9IDE7CisJZWxzZQorCQlzdC0+aHlzdGVyZXNpcyA9IDA7CitlcnJvcl9yZXQ6CisJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWQyczEyMTBfc2hvd19yZXNvbHV0aW9uKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmlkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQyczEyMTBfc3RhdGUgKnN0ID0gaWRldi0+ZGV2X2RhdGE7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHN0LT5yZXNvbHV0aW9uKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQyczEyMTBfc3RvcmVfcmVzb2x1dGlvbihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaWRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDJzMTIxMF9zdGF0ZSAqc3QgPSBpZGV2LT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBjaGFyIGRhdGE7CisJdW5zaWduZWQgbG9uZyB1ZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJnVkYXRhKTsKKwlpZiAocmV0IHx8IHVkYXRhIDwgUkVTXzEwIHx8IHVkYXRhID4gUkVTXzE2KSB7CisJCXByX2VycigiYWQyczEyMTA6IHJlc29sdXRpb24gb3V0IG9mIHJhbmdlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKKwljb25maWdfcmVhZChzdCwgUkVHX0NPTlRST0wsICZkYXRhKTsKKwlkYXRhICY9IH5TRVRfUkVTT0xVVElPTjsKKwlkYXRhIHw9ICh1ZGF0YSAtIFJFU18xMCkgPj4gMTsKKwljb25maWdfd3JpdGUoc3QsIFJFR19DT05UUk9MKTsKKwljb25maWdfd3JpdGUoc3QsIGRhdGEgJiBNU0JfSVNfTE9XKTsKKwljb25maWdfcmVhZChzdCwgUkVHX0NPTlRST0wsICZkYXRhKTsKKwlpZiAoZGF0YSAmIE1TQl9JU19ISUdIKSB7CisJCXJldCA9IC1FSU87CisJCXByX2VycigiYWQyczEyMTA6IHNldHRpbmcgcmVzb2x1dGlvbiBmYWlsXG4iKTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCXN0LT5yZXNvbHV0aW9uID0gcmVzb2x1dGlvbl92YWx1ZVtkYXRhICYgU0VUX1JFU09MVVRJT05dOworI2lmIGRlZmluZWQoQ09ORklHX0FEMlMxMjEwX0dQSU9fSU5QVVQpCisJZGF0YSA9IHJlYWRfcmVzb2x1dGlvbl9waW4oc3QpOworCWlmIChkYXRhICE9IHN0LT5yZXNvbHV0aW9uKQorCQlwcl93YXJuaW5nKCJhZDJzMTIxMDogcmVzb2x1dGlvbiBzZXR0aW5ncyBub3QgbWF0Y2hcbiIpOworI2VsaWYgZGVmaW5lZChDT05GSUdfQUQyUzEyMTBfR1BJT19PVVRQVVQpCisJc2V0X3Jlc29sdXRpb25fcGluKHN0KTsKKyNlbmRpZgorCXJldCA9IGxlbjsKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorLyogcmVhZCB0aGUgZmF1bHQgcmVnaXN0ZXIgc2luY2UgbGFzdCBzYW1wbGUgKi8KK3N0YXRpYyBzc2l6ZV90IGFkMnMxMjEwX3Nob3dfZmF1bHQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0ID0gMDsKKwlzc2l6ZV90IGxlbiA9IDA7CisJdW5zaWduZWQgY2hhciBkYXRhOworCXN0cnVjdCBpaW9fZGV2ICppZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkMnMxMjEwX3N0YXRlICpzdCA9IGlkZXYtPmRldl9kYXRhOworCisJbXV0ZXhfbG9jaygmc3QtPmxvY2spOworCXJldCA9IGNvbmZpZ19yZWFkKHN0LCBSRUdfRkFVTFQsICZkYXRhKTsKKworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCWxlbiA9IHNwcmludGYoYnVmLCAiMHgleFxuIiwgZGF0YSk7CitlcnJvcl9yZXQ6CisJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgYWQyczEyMTBfY2xlYXJfZmF1bHQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmlkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQyczEyMTBfc3RhdGUgKnN0ID0gaWRldi0+ZGV2X2RhdGE7CisJdW5zaWduZWQgY2hhciBkYXRhOworCisJbXV0ZXhfbG9jaygmc3QtPmxvY2spOworCXN0YXJ0X3NhbXBsZShzdCk7CisJLyogZGVsYXkgKDIgKiB0Y2sgKyAyMCkgbmFubyBzZWNvbmRzICovCisJdWRlbGF5KDEpOworCXN0b3Bfc2FtcGxlKHN0KTsKKwljb25maWdfcmVhZChzdCwgUkVHX0ZBVUxULCAmZGF0YSk7CisJc3RhcnRfc2FtcGxlKHN0KTsKKwlzdG9wX3NhbXBsZShzdCk7CisJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgYWQyczEyMTBfc2hvd19yZWcoc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaWRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDJzMTIxMF9zdGF0ZSAqc3QgPSBpZGV2LT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBjaGFyIGRhdGE7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqaWF0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisKKwltdXRleF9sb2NrKCZzdC0+bG9jayk7CisJY29uZmlnX3JlYWQoc3QsIGlhdHRyLT5hZGRyZXNzLCAmZGF0YSk7CisJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEpOworfQorCitzdGF0aWMgc3NpemVfdCBhZDJzMTIxMF9zdG9yZV9yZWcoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICppZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkMnMxMjEwX3N0YXRlICpzdCA9IGlkZXYtPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlpbnQgcmV0OworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKmlhdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlOVkFMOworCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKKwljb25maWdfd3JpdGUoc3QsIGlhdHRyLT5hZGRyZXNzKTsKKwljb25maWdfd3JpdGUoc3QsIGRhdGEgJiBNU0JfSVNfTE9XKTsKKwltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBhZDJzMTIxMF9zaG93X3BvcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJaW50IHJldCA9IDA7CisJc3NpemVfdCBsZW4gPSAwOworCXUxNiBwb3M7CisJc3RydWN0IGlpb19kZXYgKmlkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQyczEyMTBfc3RhdGUgKnN0ID0gaWRldi0+ZGV2X2RhdGE7CisKKwlzdC0+eGZlci5sZW4gPSAyOworCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKKwlzdGFydF9zYW1wbGUoc3QpOworCS8qIGRlbGF5ICg2ICogdGNrICsgMjApIG5hbm8gc2Vjb25kcyAqLworCXVkZWxheSgxKTsKKworCXNldF9tb2RlKE1PRF9QT1MsIHN0KTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnN0LT54ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisJcG9zID0gKCgoKHUxNikoc3QtPnJ4WzBdKSkgPDwgOCkgfCAoc3QtPnJ4WzFdKSk7CisJaWYgKHN0LT5oeXN0ZXJlc2lzKQorCQlwb3MgPj49IDE2IC0gc3QtPnJlc29sdXRpb247CisJbGVuID0gc3ByaW50ZihidWYsICIlZFxuIiwgcG9zKTsKK2Vycm9yX3JldDoKKwlzdG9wX3NhbXBsZShzdCk7CisJLyogZGVsYXkgKDIgKiB0Y2sgKyAyMCkgbmFubyBzZWNvbmRzICovCisJdWRlbGF5KDEpOworCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgYWQyczEyMTBfc2hvd192ZWwoc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXVuc2lnbmVkIHNob3J0IG5lZ2F0aXZlOworCWludCByZXQgPSAwOworCXNzaXplX3QgbGVuID0gMDsKKwlzMTYgdmVsOworCXN0cnVjdCBpaW9fZGV2ICppZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkMnMxMjEwX3N0YXRlICpzdCA9IGlkZXYtPmRldl9kYXRhOworCisJc3QtPnhmZXIubGVuID0gMjsKKwltdXRleF9sb2NrKCZzdC0+bG9jayk7CisJc3RhcnRfc2FtcGxlKHN0KTsKKwkvKiBkZWxheSAoNiAqIHRjayArIDIwKSBuYW5vIHNlY29uZHMgKi8KKwl1ZGVsYXkoMSk7CisKKwlzZXRfbW9kZShNT0RfVkVMLCBzdCk7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZzdC0+eGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCW5lZ2F0aXZlID0gc3QtPnJ4WzBdICYgMHg4MDsKKwl2ZWwgPSAoKCgoczE2KShzdC0+cnhbMF0pKSA8PCA4KSB8IChzdC0+cnhbMV0pKTsKKwl2ZWwgPj49IDE2IC0gc3QtPnJlc29sdXRpb247CisJaWYgKG5lZ2F0aXZlKSB7CisJCW5lZ2F0aXZlID0gKDB4ZmZmZiA+PiBzdC0+cmVzb2x1dGlvbikgPDwgc3QtPnJlc29sdXRpb247CisJCXZlbCB8PSBuZWdhdGl2ZTsKKwl9CisJbGVuID0gc3ByaW50ZihidWYsICIlZFxuIiwgdmVsKTsKK2Vycm9yX3JldDoKKwlzdG9wX3NhbXBsZShzdCk7CisJLyogZGVsYXkgKDIgKiB0Y2sgKyAyMCkgbmFubyBzZWNvbmRzICovCisJdWRlbGF5KDEpOworCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgYWQyczEyMTBfc2hvd19wb3NfdmVsKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwl1bnNpZ25lZCBzaG9ydCBuZWdhdGl2ZTsKKwlpbnQgcmV0ID0gMDsKKwlzc2l6ZV90IGxlbiA9IDA7CisJdTE2IHBvczsKKwlzMTYgdmVsOworCXN0cnVjdCBpaW9fZGV2ICppZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkMnMxMjEwX3N0YXRlICpzdCA9IGlkZXYtPmRldl9kYXRhOworCisJc3QtPnhmZXIubGVuID0gMjsKKwltdXRleF9sb2NrKCZzdC0+bG9jayk7CisJc3RhcnRfc2FtcGxlKHN0KTsKKwkvKiBkZWxheSAoNiAqIHRjayArIDIwKSBuYW5vIHNlY29uZHMgKi8KKwl1ZGVsYXkoMSk7CisKKwlzZXRfbW9kZShNT0RfUE9TLCBzdCk7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZzdC0+eGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCXBvcyA9ICgoKCh1MTYpKHN0LT5yeFswXSkpIDw8IDgpIHwgKHN0LT5yeFsxXSkpOworCWlmIChzdC0+aHlzdGVyZXNpcykKKwkJcG9zID4+PSAxNiAtIHN0LT5yZXNvbHV0aW9uOworCWxlbiA9IHNwcmludGYoYnVmLCAiJWQgIiwgcG9zKTsKKworCXN0LT54ZmVyLmxlbiA9IDI7CisJc2V0X21vZGUoTU9EX1ZFTCwgc3QpOworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnN0LT54ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisJbmVnYXRpdmUgPSBzdC0+cnhbMF0gJiAweDgwOworCXZlbCA9ICgoKChzMTYpKHN0LT5yeFswXSkpIDw8IDgpIHwgKHN0LT5yeFsxXSkpOworCXZlbCA+Pj0gMTYgLSBzdC0+cmVzb2x1dGlvbjsKKwlpZiAobmVnYXRpdmUpIHsKKwkJbmVnYXRpdmUgPSAoMHhmZmZmID4+IHN0LT5yZXNvbHV0aW9uKSA8PCBzdC0+cmVzb2x1dGlvbjsKKwkJdmVsIHw9IG5lZ2F0aXZlOworCX0KKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICIlZFxuIiwgdmVsKTsKK2Vycm9yX3JldDoKKwlzdG9wX3NhbXBsZShzdCk7CisJLyogZGVsYXkgKDIgKiB0Y2sgKyAyMCkgbmFubyBzZWNvbmRzICovCisJdWRlbGF5KDEpOworCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworc3RhdGljIElJT19DT05TVF9BVFRSKGRlc2NyaXB0aW9uLAorCSJWYXJpYWJsZSBSZXNvbHV0aW9uLCAxMC1CaXQgdG8gMTZCaXQgUi9EXG5cCitDb252ZXJ0ZXIgd2l0aCBSZWZlcmVuY2UgT3NjaWxsYXRvciIpOworc3RhdGljIElJT19ERVZJQ0VfQVRUUihyYXdfaW8sIFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDJzMTIxMF9zaG93X3JhdywgYWQyczEyMTBfc3RvcmVfcmF3LCAwKTsKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIocmVzZXQsIFNfSVdVU1IsCisJCU5VTEwsIGFkMnMxMjEwX3N0b3JlX3NvZnRyZXNldCwgMCk7CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGZjbGtpbiwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkMnMxMjEwX3Nob3dfZmNsa2luLCBhZDJzMTIxMF9zdG9yZV9mY2xraW4sIDApOworc3RhdGljIElJT19ERVZJQ0VfQVRUUihmZXhjaXQsIFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDJzMTIxMF9zaG93X2ZleGNpdCwJYWQyczEyMTBfc3RvcmVfZmV4Y2l0LCAwKTsKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoY29udHJvbCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkMnMxMjEwX3Nob3dfY29udHJvbCwgYWQyczEyMTBfc3RvcmVfY29udHJvbCwgMCk7CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGJpdHMsIFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDJzMTIxMF9zaG93X3Jlc29sdXRpb24sIGFkMnMxMjEwX3N0b3JlX3Jlc29sdXRpb24sIDApOworc3RhdGljIElJT19ERVZJQ0VfQVRUUihmYXVsdCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkMnMxMjEwX3Nob3dfZmF1bHQsIGFkMnMxMjEwX2NsZWFyX2ZhdWx0LCAwKTsKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIocG9zLCBTX0lSVUdPLAorCQlhZDJzMTIxMF9zaG93X3BvcywgTlVMTCwgMCk7CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKHZlbCwgU19JUlVHTywKKwkJYWQyczEyMTBfc2hvd192ZWwsIE5VTEwsIDApOworc3RhdGljIElJT19ERVZJQ0VfQVRUUihwb3NfdmVsLCBTX0lSVUdPLAorCQlhZDJzMTIxMF9zaG93X3Bvc192ZWwsIE5VTEwsIDApOworc3RhdGljIElJT19ERVZJQ0VfQVRUUihsb3NfdGhyZCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkMnMxMjEwX3Nob3dfcmVnLCBhZDJzMTIxMF9zdG9yZV9yZWcsIFJFR19MT1NfVEhSRCk7CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGRvc19vdnJfdGhyZCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkMnMxMjEwX3Nob3dfcmVnLCBhZDJzMTIxMF9zdG9yZV9yZWcsIFJFR19ET1NfT1ZSX1RIUkQpOworc3RhdGljIElJT19ERVZJQ0VfQVRUUihkb3NfbWlzX3RocmQsIFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDJzMTIxMF9zaG93X3JlZywgYWQyczEyMTBfc3RvcmVfcmVnLCBSRUdfRE9TX01JU19USFJEKTsKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoZG9zX3JzdF9tYXhfdGhyZCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkMnMxMjEwX3Nob3dfcmVnLCBhZDJzMTIxMF9zdG9yZV9yZWcsIFJFR19ET1NfUlNUX01BWF9USFJEKTsKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoZG9zX3JzdF9taW5fdGhyZCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkMnMxMjEwX3Nob3dfcmVnLCBhZDJzMTIxMF9zdG9yZV9yZWcsIFJFR19ET1NfUlNUX01JTl9USFJEKTsKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIobG90X2hpZ2hfdGhyZCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkMnMxMjEwX3Nob3dfcmVnLCBhZDJzMTIxMF9zdG9yZV9yZWcsIFJFR19MT1RfSElHSF9USFJEKTsKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIobG90X2xvd190aHJkLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQyczEyMTBfc2hvd19yZWcsIGFkMnMxMjEwX3N0b3JlX3JlZywgUkVHX0xPVF9MT1dfVEhSRCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZDJzMTIxMF9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19jb25zdF9hdHRyX2Rlc2NyaXB0aW9uLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9yYXdfaW8uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3Jlc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9mY2xraW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2ZleGNpdC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY29udHJvbC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYml0cy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZmF1bHQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3Bvcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfdmVsLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9wb3NfdmVsLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9sb3NfdGhyZC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZG9zX292cl90aHJkLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9kb3NfbWlzX3RocmQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2Rvc19yc3RfbWF4X3RocmQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2Rvc19yc3RfbWluX3RocmQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2xvdF9oaWdoX3RocmQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2xvdF9sb3dfdGhyZC5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDJzMTIxMF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLm5hbWUgPSBEUlZfTkFNRSwKKwkuYXR0cnMgPSBhZDJzMTIxMF9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgYWQyczEyMTBfaW5pdGlhbChzdHJ1Y3QgYWQyczEyMTBfc3RhdGUgKnN0KQoreworCXVuc2lnbmVkIGNoYXIgZGF0YTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmc3QtPmxvY2spOworI2lmIGRlZmluZWQoQ09ORklHX0FEMlMxMjEwX0dQSU9fSU5QVVQpCisJc3QtPnJlc29sdXRpb24gPSByZWFkX3Jlc29sdXRpb25fcGluKHN0KTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX0FEMlMxMjEwX0dQSU9fT1VUUFVUKQorCXNldF9yZXNvbHV0aW9uX3BpbihzdCk7CisjZW5kaWYKKworCWNvbmZpZ193cml0ZShzdCwgUkVHX0NPTlRST0wpOworCWRhdGEgPSBERUZfQ09OVFJPTCAmIH4oU0VUX1JFU09MVVRJT04pOworCWRhdGEgfD0gKHN0LT5yZXNvbHV0aW9uIC0gUkVTXzEwKSA+PiAxOworCWNvbmZpZ193cml0ZShzdCwgZGF0YSk7CisJcmV0ID0gY29uZmlnX3JlYWQoc3QsIFJFR19DT05UUk9MLCAmZGF0YSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwlpZiAoZGF0YSAmIE1TQl9JU19ISUdIKSB7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKworCXVwZGF0ZV9mcmVxdWVuY3lfY29udHJvbF93b3JkKHN0KTsKKwlzb2Z0X3Jlc2V0KHN0KTsKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZDJzMTIxMF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBhZDJzMTIxMF9zdGF0ZSAqc3Q7CisJaW50IHBuLCByZXQgPSAwOworCXVuc2lnbmVkIHNob3J0ICpwaW5zID0gc3BpLT5kZXYucGxhdGZvcm1fZGF0YTsKKworCWZvciAocG4gPSAwOyBwbiA8IEFEMlMxMjEwX1BOOyBwbisrKSB7CisJCWlmIChncGlvX3JlcXVlc3QocGluc1twbl0sIERSVl9OQU1FKSkgeworCQkJcHJfZXJyKCIlczogcmVxdWVzdCBncGlvIHBpbiAlZCBmYWlsZWRcbiIsCisJCQkJCQlEUlZfTkFNRSwgcGluc1twbl0pOworCQkJZ290byBlcnJvcl9yZXQ7CisJCX0KKwkJaWYgKHBuIDwgQUQyUzEyMTBfU0FBKQorCQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHBpbnNbcG5dLCAxKTsKKwkJZWxzZSB7CisjaWYgZGVmaW5lZChDT05GSUdfQUQyUzEyMTBfR1BJT19JTlBVVCkKKwkJCWdwaW9fZGlyZWN0aW9uX2lucHV0KHBpbnNbcG5dKTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX0FEMlMxMjEwX0dQSU9fT1VUUFVUKQorCQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHBpbnNbcG5dLCAxKTsKKyNlbmRpZgorCQl9CisJfQorCisJc3QgPSBremFsbG9jKHNpemVvZigqc3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJc3BpX3NldF9kcnZkYXRhKHNwaSwgc3QpOworCisJbXV0ZXhfaW5pdCgmc3QtPmxvY2spOworCXN0LT5zZGV2ID0gc3BpOworCXN0LT54ZmVyLnR4X2J1ZiA9IHN0LT50eDsKKwlzdC0+eGZlci5yeF9idWYgPSBzdC0+cng7CisJc3QtPmh5c3RlcmVzaXMgPSAxOworCXN0LT5tb2RlID0gTU9EX0NPTkZJRzsKKwlzdC0+cmVzb2x1dGlvbiA9IFJFU18xMjsKKwlzdC0+ZmNsa2luID0gQUQyUzEyMTBfREVGX0NMS0lOOworCXN0LT5mZXhjaXQgPSBBRDJTMTIxMF9ERUZfRVhDSVQ7CisJc3QtPnNhbXBsZSA9IHBpbnNbMF07CisJc3QtPmEwID0gcGluc1sxXTsKKwlzdC0+YTEgPSBwaW5zWzJdOworCXN0LT5yZXMwID0gcGluc1szXTsKKwlzdC0+cmVzMSA9IHBpbnNbNF07CisKKwlzdC0+aWRldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoc3QtPmlkZXYgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfc3Q7CisJfQorCXN0LT5pZGV2LT5kZXYucGFyZW50ID0gJnNwaS0+ZGV2OworCXN0LT5pZGV2LT5udW1faW50ZXJydXB0X2xpbmVzID0gMDsKKwlzdC0+aWRldi0+ZXZlbnRfYXR0cnMgPSBOVUxMOworCisJc3QtPmlkZXYtPmF0dHJzID0gJmFkMnMxMjEwX2F0dHJpYnV0ZV9ncm91cDsKKwlzdC0+aWRldi0+ZGV2X2RhdGEgPSAodm9pZCAqKShzdCk7CisJc3QtPmlkZXYtPmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRTsKKwlzdC0+aWRldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoc3QtPmlkZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisKKwlpZiAoc3BpLT5tYXhfc3BlZWRfaHogIT0gQUQyUzEyMTBfREVGX0NMS0lOKQorCQlzdC0+ZmNsa2luID0gc3BpLT5tYXhfc3BlZWRfaHo7CisJc3BpLT5tb2RlID0gU1BJX01PREVfMzsKKwlzcGlfc2V0dXAoc3BpKTsKKworCWFkMnMxMjEwX2luaXRpYWwoc3QpOworCXJldHVybiAwOworCitlcnJvcl9mcmVlX2RldjoKKwlpaW9fZnJlZV9kZXZpY2Uoc3QtPmlkZXYpOworZXJyb3JfZnJlZV9zdDoKKwlrZnJlZShzdCk7CitlcnJvcl9yZXQ6CisJZm9yICgtLXBuOyBwbiA+PSAwOyBwbi0tKQorCQlncGlvX2ZyZWUocGluc1twbl0pOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkMnMxMjEwX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBhZDJzMTIxMF9zdGF0ZSAqc3QgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihzdC0+aWRldik7CisJa2ZyZWUoc3QpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhZDJzMTIxMF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBEUlZfTkFNRSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhZDJzMTIxMF9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWQyczEyMTBfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGFkMnMxMjEwX3NwaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFkMnMxMjEwX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChhZDJzMTIxMF9zcGlfaW5pdCk7CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBhZDJzMTIxMF9zcGlfZXhpdCh2b2lkKQoreworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYWQyczEyMTBfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFkMnMxMjEwX3NwaV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiR3JhZmYgWWFuZyA8Z3JhZmYueWFuZ0BnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFEMlMxMjEwIFJlc29sdmVyIHRvIERpZ2l0YWwgU1BJIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9yZXNvbHZlci9hZDJzOTAuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vcmVzb2x2ZXIvYWQyczkwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE0MzUzNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vcmVzb2x2ZXIvYWQyczkwLmMKQEAgLTAsMCArMSwxNTkgQEAKKy8qCisgKiBhZDJzOTAuYyBzaW1wbGUgc3VwcG9ydCBmb3IgdGhlIEFESSBSZXNvbHZlciB0byBEaWdpdGFsIENvbnZlcnRlcnM6IEFEMlM5MAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorCisjZGVmaW5lIERSVl9OQU1FICJhZDJzOTAiCisKK3N0cnVjdCBhZDJzOTBfc3RhdGUgeworCXN0cnVjdCBtdXRleCBsb2NrOworCXN0cnVjdCBpaW9fZGV2ICppZGV2OworCXN0cnVjdCBzcGlfZGV2aWNlICpzZGV2OworCXU4IHJ4WzJdOworCXU4IHR4WzJdOworfTsKKworc3RhdGljIHNzaXplX3QgYWQyczkwX3Nob3dfYW5ndWxhcihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyOworCWludCByZXQ7CisJc3NpemVfdCBsZW4gPSAwOworCXUxNiB2YWw7CisJc3RydWN0IGlpb19kZXYgKmlkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQyczkwX3N0YXRlICpzdCA9IGlkZXYtPmRldl9kYXRhOworCisJeGZlci5sZW4gPSAxOworCXhmZXIudHhfYnVmID0gc3QtPnR4OworCXhmZXIucnhfYnVmID0gc3QtPnJ4OworCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKwl2YWwgPSAoKCh1MTYpKHN0LT5yeFswXSkpIDw8IDQpIHwgKChzdC0+cnhbMV0gJiAweEYwKSA+PiA0KTsKKwlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2YWwpOworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworI2RlZmluZSBJSU9fREVWX0FUVFJfU0lNUExFX1JFU09MVkVSKF9zaG93KSBcCisJSUlPX0RFVklDRV9BVFRSKGFuZ3VsYXIsIFNfSVJVR08sIF9zaG93LCBOVUxMLCAwKQorCitzdGF0aWMgSUlPX0NPTlNUX0FUVFIoZGVzY3JpcHRpb24sCisJIkxvdyBDb3N0LCBDb21wbGV0ZSAxMi1CaXQgUmVzb2x2ZXItdG8tRGlnaXRhbCBDb252ZXJ0ZXIiKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfU0lNUExFX1JFU09MVkVSKGFkMnM5MF9zaG93X2FuZ3VsYXIpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWQyczkwX2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2NvbnN0X2F0dHJfZGVzY3JpcHRpb24uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FuZ3VsYXIuZGV2X2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWQyczkwX2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkubmFtZSA9IERSVl9OQU1FLAorCS5hdHRycyA9IGFkMnM5MF9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgYWQyczkwX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGFkMnM5MF9zdGF0ZSAqc3Q7CisJaW50IHJldCA9IDA7CisKKwlzdCA9IGt6YWxsb2Moc2l6ZW9mKCpzdCksIEdGUF9LRVJORUwpOworCWlmIChzdCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwlzcGlfc2V0X2RydmRhdGEoc3BpLCBzdCk7CisKKwltdXRleF9pbml0KCZzdC0+bG9jayk7CisJc3QtPnNkZXYgPSBzcGk7CisKKwlzdC0+aWRldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoc3QtPmlkZXYgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfc3Q7CisJfQorCXN0LT5pZGV2LT5kZXYucGFyZW50ID0gJnNwaS0+ZGV2OworCXN0LT5pZGV2LT5udW1faW50ZXJydXB0X2xpbmVzID0gMDsKKwlzdC0+aWRldi0+ZXZlbnRfYXR0cnMgPSBOVUxMOworCisJc3QtPmlkZXYtPmF0dHJzID0gJmFkMnM5MF9hdHRyaWJ1dGVfZ3JvdXA7CisJc3QtPmlkZXYtPmRldl9kYXRhID0gKHZvaWQgKikoc3QpOworCXN0LT5pZGV2LT5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEU7CisJc3QtPmlkZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKHN0LT5pZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2OworCisJLyogbmVlZCA2MDBucyBiZXR3ZWVuIENTIGFuZCB0aGUgZmlyc3QgZmFsbGluZyBlZGdlIG9mIFNDTEsgKi8KKwlzcGktPm1heF9zcGVlZF9oeiA9IDgzMDAwMDsKKwlzcGktPm1vZGUgPSBTUElfTU9ERV8zOworCXNwaV9zZXR1cChzcGkpOworCisJcmV0dXJuIDA7CisKK2Vycm9yX2ZyZWVfZGV2OgorCWlpb19mcmVlX2RldmljZShzdC0+aWRldik7CitlcnJvcl9mcmVlX3N0OgorCWtmcmVlKHN0KTsKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhZDJzOTBfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGFkMnM5MF9zdGF0ZSAqc3QgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihzdC0+aWRldik7CisJa2ZyZWUoc3QpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhZDJzOTBfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gRFJWX05BTUUsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gYWQyczkwX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZDJzOTBfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGFkMnM5MF9zcGlfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZhZDJzOTBfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGFkMnM5MF9zcGlfaW5pdCk7CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBhZDJzOTBfc3BpX2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmFkMnM5MF9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoYWQyczkwX3NwaV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiR3JhZmYgWWFuZyA8Z3JhZmYueWFuZ0BnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFEMlM5MCBSZXNvbHZlciB0byBEaWdpdGFsIFNQSSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vc3lzZnMuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vc3lzZnMuaAppbmRleCBlZTkxYTk1Li4yNGI3NGRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3N5c2ZzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9zeXNmcy5oCkBAIC0xMDgsNiArMTA4LDEyIEBACiAJSUlPX0RFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIF9zaG93LCBOVUxMLCAwKQogCiAvKioKKyAqIElJT19ERVZfQVRUUl9SRVNFVDogcmVzZXRzIHRoZSBkZXZpY2UKKyAqKi8KKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1JFU0VUKF9zdG9yZSkJCQlcCisJSUlPX0RFVklDRV9BVFRSKHJlc2V0LCBTX0lXVVNSLCBOVUxMLCBfc3RvcmUsIDApCisKKy8qKgogICogSUlPX0NPTlNUX0FUVFJfTkFNRSAtIGNvbnN0YW50IGlkZW50aWZpZXIKICAqIEBfc3RyaW5nOiB0aGUgbmFtZQogICoqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9LY29uZmlnCmluZGV4IGI0NmJkOWQuLjgyMzkxMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L0tjb25maWcKQEAgLTgsNiArOCw3IEBACiAKIGNvbmZpZyBTTkRfSU5URUxNSUQKIAl0cmlzdGF0ZSAiSW50ZWwgTUlEIHNvdW5kIGNhcmQgZHJpdmVyIgorCWRlcGVuZHMgb24gU09VTkQgJiYgU05ECiAJc2VsZWN0IFNORF9QQ00KIAlzZWxlY3QgU05EX1NFUVVFTkNFUgogCXNlbGVjdCBTTkRfSkFDSwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0LmMKaW5kZXggMjRkMzkyOC4uY2U0YTlmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdC5jCkBAIC0yOSwxMSArMjksMTQgQEAKICAqICBUaGlzIGZpbGUgY29udGFpbnMgYWxsIGluaXQgZnVuY3Rpb25zCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAjaW5jbHVkZSA8YXNtL21yc3QuaD4KICNpbmNsdWRlICJpbnRlbF9zc3QuaCIKICNpbmNsdWRlICJpbnRlbF9zc3RfaW9jdGwuaCIKQEAgLTE2OSwxNyArMTcyLDE3IEBACiB7CiAJaW50IGksIHJldCA9IDA7CiAKLQlwcl9kZWJ1Zygic3N0OiBQcm9iZSBmb3IgRElEICV4XG4iLCBwY2ktPmRldmljZSk7CisJcHJfZGVidWcoIlByb2JlIGZvciBESUQgJXhcbiIsIHBjaS0+ZGV2aWNlKTsKIAltdXRleF9sb2NrKCZkcnZfY3R4X2xvY2spOwogCWlmIChzc3RfZHJ2X2N0eCkgewotCQlwcl9lcnIoInNzdDogT25seSBvbmUgc3N0IGhhbmRsZSBpcyBzdXBwb3J0ZWRcbiIpOworCQlwcl9lcnIoIk9ubHkgb25lIHNzdCBoYW5kbGUgaXMgc3VwcG9ydGVkXG4iKTsKIAkJbXV0ZXhfdW5sb2NrKCZkcnZfY3R4X2xvY2spOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAogCXNzdF9kcnZfY3R4ID0ga3phbGxvYyhzaXplb2YoKnNzdF9kcnZfY3R4KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzc3RfZHJ2X2N0eCkgewotCQlwcl9lcnIoInNzdDogaW50ZWxfc3N0IG1hbGxvYyBmYWlsXG4iKTsKKwkJcHJfZXJyKCJtYWxsb2MgZmFpbFxuIik7CiAJCW11dGV4X3VubG9jaygmZHJ2X2N0eF9sb2NrKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMjI2LDcgKzIyOSw3IEBACiAJc3Bpbl9sb2NrX2luaXQoJnNzdF9kcnZfY3R4LT5saXN0X3NwaW5fbG9jayk7CiAKIAlzc3RfZHJ2X2N0eC0+bWF4X3N0cmVhbXMgPSBwY2lfaWQtPmRyaXZlcl9kYXRhOwotCXByX2RlYnVnKCJzc3Q6IEdvdCBkcnYgZGF0YSBtYXggc3RyZWFtICVkXG4iLAorCXByX2RlYnVnKCJHb3QgZHJ2IGRhdGEgbWF4IHN0cmVhbSAlZFxuIiwKIAkJCQlzc3RfZHJ2X2N0eC0+bWF4X3N0cmVhbXMpOwogCWZvciAoaSA9IDE7IGkgPD0gc3N0X2Rydl9jdHgtPm1heF9zdHJlYW1zOyBpKyspIHsKIAkJc3RydWN0IHN0cmVhbV9pbmZvICpzdHJlYW0gPSAmc3N0X2Rydl9jdHgtPnN0cmVhbXNbaV07CkBAIC0yNDEsMTggKzI0NCwxOCBAQAogCQkJc3N0X2Rydl9jdHgtPm1tYXBfbWVtID0KIAkJCQlremFsbG9jKHNzdF9kcnZfY3R4LT5tbWFwX2xlbiwgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoc3N0X2Rydl9jdHgtPm1tYXBfbWVtKSB7Ci0JCQkJcHJfZGVidWcoInNzdDogR290IG1lbW9yeSAlcCBzaXplIDB4JXhcbiIsCisJCQkJcHJfZGVidWcoIkdvdCBtZW1vcnkgJXAgc2l6ZSAweCV4XG4iLAogCQkJCQlzc3RfZHJ2X2N0eC0+bW1hcF9tZW0sCiAJCQkJCXNzdF9kcnZfY3R4LT5tbWFwX2xlbik7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlpZiAoc3N0X2Rydl9jdHgtPm1tYXBfbGVuIDwgKFNTVF9NTUFQX1NURVAqUEFHRV9TSVpFKSkgewotCQkJCXByX2Vycigic3N0OiBtZW0gYWxsb2MgZmFpbC4uLmFib3J0ISFcbiIpOworCQkJCXByX2VycigibWVtIGFsbG9jIGZhaWwuLi5hYm9ydCEhXG4iKTsKIAkJCQlyZXQgPSAtRU5PTUVNOwogCQkJCWdvdG8gZnJlZV9wcm9jZXNzX3JlcGx5X3dxOwogCQkJfQogCQkJc3N0X2Rydl9jdHgtPm1tYXBfbGVuIC09IChTU1RfTU1BUF9TVEVQICogUEFHRV9TSVpFKTsKLQkJCXByX2RlYnVnKCJzc3Q6bWVtIGFsbG9jIGZhaWxlZC4uLnRyeWluZyAlZFxuIiwKKwkJCXByX2RlYnVnKCJtZW0gYWxsb2MgZmFpbGVkLi4udHJ5aW5nICVkXG4iLAogCQkJCQkJc3N0X2Rydl9jdHgtPm1tYXBfbGVuKTsKIAkJfQogCX0KQEAgLTI2MCw3ICsyNjMsNyBAQAogCS8qIEluaXQgdGhlIGRldmljZSAqLwogCXJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBjaSk7CiAJaWYgKHJldCkgewotCQlwcl9lcnIoInNzdDogZGV2aWNlIGNhbnQgYmUgZW5hYmxlZFxuIik7CisJCXByX2VycigiZGV2aWNlIGNhbnQgYmUgZW5hYmxlZFxuIik7CiAJCWdvdG8gZG9fZnJlZV9tZW07CiAJfQogCXNzdF9kcnZfY3R4LT5wY2kgPSBwY2lfZGV2X2dldChwY2kpOwpAQCAtMjczLDI1ICsyNzYsMjUgQEAKIAlzc3RfZHJ2X2N0eC0+c2hpbSA9IHBjaV9pb3JlbWFwX2JhcihwY2ksIDEpOwogCWlmICghc3N0X2Rydl9jdHgtPnNoaW0pCiAJCWdvdG8gZG9fcmVsZWFzZV9yZWdpb25zOwotCXByX2RlYnVnKCJzc3Q6IFNTVCBTaGltIFB0ciAlcFxuIiwgc3N0X2Rydl9jdHgtPnNoaW0pOworCXByX2RlYnVnKCJTU1QgU2hpbSBQdHIgJXBcbiIsIHNzdF9kcnZfY3R4LT5zaGltKTsKIAogCS8qIFNoYXJlZCBTUkFNICovCiAJc3N0X2Rydl9jdHgtPm1haWxib3ggPSBwY2lfaW9yZW1hcF9iYXIocGNpLCAyKTsKIAlpZiAoIXNzdF9kcnZfY3R4LT5tYWlsYm94KQogCQlnb3RvIGRvX3VubWFwX3NoaW07Ci0JcHJfZGVidWcoInNzdDogU1JBTSBQdHIgJXBcbiIsIHNzdF9kcnZfY3R4LT5tYWlsYm94KTsKKwlwcl9kZWJ1ZygiU1JBTSBQdHIgJXBcbiIsIHNzdF9kcnZfY3R4LT5tYWlsYm94KTsKIAogCS8qIElSQU0gKi8KIAlzc3RfZHJ2X2N0eC0+aXJhbSA9IHBjaV9pb3JlbWFwX2JhcihwY2ksIDMpOwogCWlmICghc3N0X2Rydl9jdHgtPmlyYW0pCiAJCWdvdG8gZG9fdW5tYXBfc3JhbTsKLQlwcl9kZWJ1Zygic3N0OklSQU0gUHRyICVwXG4iLCBzc3RfZHJ2X2N0eC0+aXJhbSk7CisJcHJfZGVidWcoIklSQU0gUHRyICVwXG4iLCBzc3RfZHJ2X2N0eC0+aXJhbSk7CiAKIAkvKiBEUkFNICovCiAJc3N0X2Rydl9jdHgtPmRyYW0gPSBwY2lfaW9yZW1hcF9iYXIocGNpLCA0KTsKIAlpZiAoIXNzdF9kcnZfY3R4LT5kcmFtKQogCQlnb3RvIGRvX3VubWFwX2lyYW07Ci0JcHJfZGVidWcoInNzdDogRFJBTSBQdHIgJXBcbiIsIHNzdF9kcnZfY3R4LT5kcmFtKTsKKwlwcl9kZWJ1ZygiRFJBTSBQdHIgJXBcbiIsIHNzdF9kcnZfY3R4LT5kcmFtKTsKIAogCW11dGV4X2xvY2soJnNzdF9kcnZfY3R4LT5zc3RfbG9jayk7CiAJc3N0X2Rydl9jdHgtPnNzdF9zdGF0ZSA9IFNTVF9VTl9JTklUOwpAQCAtMzAxLDI2ICszMDQsMzEgQEAKIAkJSVJRRl9TSEFSRUQsIFNTVF9EUlZfTkFNRSwgc3N0X2Rydl9jdHgpOwogCWlmIChyZXQpCiAJCWdvdG8gZG9fdW5tYXBfZHJhbTsKLQlwcl9kZWJ1Zygic3N0OiBSZWdpc3RlcmVkIElSUSAweCV4XG4iLCBwY2ktPmlycSk7CisJcHJfZGVidWcoIlJlZ2lzdGVyZWQgSVJRIDB4JXhcbiIsIHBjaS0+aXJxKTsKKworCS8qUmVnaXN0ZXIgTFBFIENvbnRyb2wgYXMgbWlzYyBkcml2ZXIqLworCXJldCA9IG1pc2NfcmVnaXN0ZXIoJmxwZV9jdHJsKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiY291bGRuJ3QgcmVnaXN0ZXIgY29udHJvbCBkZXZpY2VcbiIpOworCQlnb3RvIGRvX2ZyZWVfaXJxOworCX0KIAogCWlmIChzc3RfZHJ2X2N0eC0+cGNpX2lkID09IFNTVF9NUlNUX1BDSV9JRCkgewogCQlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZscGVfZGV2KTsKIAkJaWYgKHJldCkgewotCQkJcHJfZXJyKCJzc3Q6IGNvdWxkbid0IHJlZ2lzdGVyIExQRSBkZXZpY2VcbiIpOwotCQkJZ290byBkb19mcmVlX2lycTsKLQkJfQotCi0JCS8qUmVnaXN0ZXIgTFBFIENvbnRyb2wgYXMgbWlzYyBkcml2ZXIqLwotCQlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZscGVfY3RybCk7Ci0JCWlmIChyZXQpIHsKLQkJCXByX2Vycigic3N0OiBjb3VsZG4ndCByZWdpc3RlciBtaXNjIGRyaXZlclxuIik7Ci0JCQlnb3RvIGRvX2ZyZWVfaXJxOwotCQl9CisgCQkJcHJfZXJyKCJjb3VsZG4ndCByZWdpc3RlciBtaXNjIGRyaXZlclxuIik7CisJCQlnb3RvIGRvX2ZyZWVfbWlzYzsKKyAJCX0KIAl9CiAJc3N0X2Rydl9jdHgtPmxwZV9zdGFsbGVkID0gMDsKLQlwcl9kZWJ1Zygic3N0OiAuLi5zdWNjZXNzZnVsbHkgZG9uZSEhIVxuIik7CisJcG1fcnVudGltZV9zZXRfYWN0aXZlKCZwY2ktPmRldik7CisJcG1fcnVudGltZV9lbmFibGUoJnBjaS0+ZGV2KTsKKwlwbV9ydW50aW1lX2FsbG93KCZwY2ktPmRldik7CisJcHJfZGVidWcoIi4uLnN1Y2Nlc3NmdWxseSBkb25lISEhXG4iKTsKIAlyZXR1cm4gcmV0OwogCitkb19mcmVlX21pc2M6CisJbWlzY19kZXJlZ2lzdGVyKCZscGVfY3RybCk7CiBkb19mcmVlX2lycToKIAlmcmVlX2lycShwY2ktPmlycSwgc3N0X2Rydl9jdHgpOwogZG9fdW5tYXBfZHJhbToKQEAgLTM0Nyw3ICszNTUsNyBAQAogCWRlc3Ryb3lfd29ya3F1ZXVlKHNzdF9kcnZfY3R4LT5tYWRfd3EpOwogZG9fZnJlZV9kcnZfY3R4OgogCWtmcmVlKHNzdF9kcnZfY3R4KTsKLQlwcl9lcnIoInNzdDogUHJvYmUgZmFpbGVkIHdpdGggMHgleFxuIiwgcmV0KTsKKwlwcl9lcnIoIlByb2JlIGZhaWxlZCB3aXRoIDB4JXhcbiIsIHJldCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMzY1LDEwICszNzMsOSBAQAogCW11dGV4X2xvY2soJnNzdF9kcnZfY3R4LT5zc3RfbG9jayk7CiAJc3N0X2Rydl9jdHgtPnNzdF9zdGF0ZSA9IFNTVF9VTl9JTklUOwogCW11dGV4X3VubG9jaygmc3N0X2Rydl9jdHgtPnNzdF9sb2NrKTsKLQlpZiAoc3N0X2Rydl9jdHgtPnBjaV9pZCA9PSBTU1RfTVJTVF9QQ0lfSUQpIHsKKwltaXNjX2RlcmVnaXN0ZXIoJmxwZV9jdHJsKTsKKwlpZiAoc3N0X2Rydl9jdHgtPnBjaV9pZCA9PSBTU1RfTVJTVF9QQ0lfSUQpCiAJCW1pc2NfZGVyZWdpc3RlcigmbHBlX2Rldik7Ci0JCW1pc2NfZGVyZWdpc3RlcigmbHBlX2N0cmwpOwotCX0KIAlmcmVlX2lycShwY2ktPmlycSwgc3N0X2Rydl9jdHgpOwogCWlvdW5tYXAoc3N0X2Rydl9jdHgtPmRyYW0pOwogCWlvdW5tYXAoc3N0X2Rydl9jdHgtPmlyYW0pOwpAQCAtNDA0LDEwICs0MTEsMTIgQEAKIHsKIAl1bmlvbiBjb25maWdfc3RhdHVzX3JlZyBjc3I7CiAKLQlwcl9kZWJ1Zygic3N0OiBpbnRlbF9zc3Rfc3VzcGVuZCBjYWxsZWRcbiIpOworCXByX2RlYnVnKCJpbnRlbF9zc3Rfc3VzcGVuZCBjYWxsZWRcbiIpOwogCi0JaWYgKHNzdF9kcnZfY3R4LT5wYl9zdHJlYW1zICE9IDAgfHwgc3N0X2Rydl9jdHgtPmNwX3N0cmVhbXMgIT0gMCkKLQkJcmV0dXJuIC1FUEVSTTsKKwlpZiAoc3N0X2Rydl9jdHgtPnN0cmVhbV9jbnQpIHsKKwkJcHJfZXJyKCJhY3RpdmUgc3RyZWFtcyxub3QgYWJsZSB0byBzdXNwZW5kXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CiAJLypBc3NlcnQgUkVTRVQgb24gTFBFIFByb2Nlc3NvciovCiAJY3NyLmZ1bGwgPSBzc3Rfc2hpbV9yZWFkKHNzdF9kcnZfY3R4LT5zaGltLCBTU1RfQ1NSKTsKIAljc3IuZnVsbCA9IGNzci5mdWxsIHwgMHgyOwpAQCAtNDM0LDE3ICs0NDMsMTcgQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAotCXByX2RlYnVnKCJzc3Q6IGludGVsX3NzdF9yZXN1bWUgY2FsbGVkXG4iKTsKKwlwcl9kZWJ1ZygiaW50ZWxfc3N0X3Jlc3VtZSBjYWxsZWRcbiIpOwogCWlmIChzc3RfZHJ2X2N0eC0+c3N0X3N0YXRlICE9IFNTVF9TVVNQRU5ERUQpIHsKLQkJcHJfZXJyKCJzc3Q6IFNTVCBpcyBub3QgaW4gc3VzcGVuZGVkIHN0YXRlXG4iKTsKLQkJcmV0dXJuIC1FUEVSTTsKKwkJcHJfZXJyKCJTU1QgaXMgbm90IGluIHN1c3BlbmRlZCBzdGF0ZVxuIik7CisJCXJldHVybiAwOwogCX0KIAlzc3RfZHJ2X2N0eCA9IHBjaV9nZXRfZHJ2ZGF0YShwY2kpOwogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOwogCXBjaV9yZXN0b3JlX3N0YXRlKHBjaSk7CiAJcmV0ID0gcGNpX2VuYWJsZV9kZXZpY2UocGNpKTsKIAlpZiAocmV0KQotCQlwcl9lcnIoInNzdDogZGV2aWNlIGNhbnQgYmUgZW5hYmxlZFxuIik7CisJCXByX2VycigiZGV2aWNlIGNhbnQgYmUgZW5hYmxlZFxuIik7CiAKIAltdXRleF9sb2NrKCZzc3RfZHJ2X2N0eC0+c3N0X2xvY2spOwogCXNzdF9kcnZfY3R4LT5zc3Rfc3RhdGUgPSBTU1RfVU5fSU5JVDsKQEAgLTQ1Miw2ICs0NjEsMzQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBpbnRlbF9zc3RfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IHRvX3BjaV9kZXYoZGV2KTsKKwlwcl9kZWJ1ZygicnVudGltZV9zdXNwZW5kIGNhbGxlZFxuIik7CisJcmV0dXJuIGludGVsX3NzdF9zdXNwZW5kKHBjaV9kZXYsIFBNU0dfU1VTUEVORCk7Cit9CisKK3N0YXRpYyBpbnQgaW50ZWxfc3N0X3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IHRvX3BjaV9kZXYoZGV2KTsKKwlwcl9kZWJ1ZygicnVudGltZV9yZXN1bWUgY2FsbGVkXG4iKTsKKwlyZXR1cm4gaW50ZWxfc3N0X3Jlc3VtZShwY2lfZGV2KTsKK30KKworc3RhdGljIGludCBpbnRlbF9zc3RfcnVudGltZV9pZGxlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlwcl9kZWJ1ZygicnVudGltZV9pZGxlIGNhbGxlZFxuIik7CisJaWYgKHNzdF9kcnZfY3R4LT5zdHJlYW1fY250ID09IDAgJiYgc3N0X2Rydl9jdHgtPmFtX2NudCA9PSAwKQorCQlwbV9zY2hlZHVsZV9zdXNwZW5kKGRldiwgU1NUX1NVU1BFTkRfREVMQVkpOworCXJldHVybiAtRUJVU1k7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBpbnRlbF9zc3RfcG0gPSB7CisJLnJ1bnRpbWVfc3VzcGVuZCA9IGludGVsX3NzdF9ydW50aW1lX3N1c3BlbmQsCisJLnJ1bnRpbWVfcmVzdW1lID0gaW50ZWxfc3N0X3J1bnRpbWVfcmVzdW1lLAorCS5ydW50aW1lX2lkbGUgPSBpbnRlbF9zc3RfcnVudGltZV9pZGxlLAorfTsKKwogLyogUENJIFJvdXRpbmVzICovCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaW50ZWxfc3N0X2lkc1tdID0gewogCXsgUENJX1ZERVZJQ0UoSU5URUwsIFNTVF9NUlNUX1BDSV9JRCksIDN9LApAQCAtNDY4LDYgKzUwNSw5IEBACiAjaWZkZWYgQ09ORklHX1BNCiAJLnN1c3BlbmQgPSBpbnRlbF9zc3Rfc3VzcGVuZCwKIAkucmVzdW1lID0gaW50ZWxfc3N0X3Jlc3VtZSwKKwkuZHJpdmVyID0geworCQkucG0gPSAmaW50ZWxfc3N0X3BtLAorCX0sCiAjZW5kaWYKIH07CiAKQEAgLTQ4MiwxNCArNTIyLDE0IEBACiB7CiAJLyogSW5pdCBhbGwgdmFyaWFibGVzLCBkYXRhIHN0cnVjdHVyZSBldGMuLi4uKi8KIAlpbnQgcmV0ID0gMDsKLQlwcl9kZWJ1Zygic3N0OiBJTkZPOiAqKioqKioqKiBTU1QgRFJJVkVSIGxvYWRpbmcuLiBWZXI6ICVzXG4iLAorCXByX2RlYnVnKCJJTkZPOiAqKioqKioqKiBTU1QgRFJJVkVSIGxvYWRpbmcuLiBWZXI6ICVzXG4iLAogCQkJCSAgICAgICBTU1RfRFJJVkVSX1ZFUlNJT04pOwogCiAJbXV0ZXhfaW5pdCgmZHJ2X2N0eF9sb2NrKTsKIAkvKiBSZWdpc3RlciB3aXRoIFBDSSAqLwogCXJldCA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7CiAJaWYgKHJldCkKLQkJcHJfZXJyKCJzc3Q6IFBDSSByZWdpc3RlciBmYWlsZWRcbiIpOworCQlwcl9lcnIoIlBDSSByZWdpc3RlciBmYWlsZWRcbiIpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTUwNCw3ICs1NDQsNyBAQAogewogCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKIAotCXByX2RlYnVnKCJzc3Q6IGRyaXZlciB1bmxvYWRlZFxuIik7CisJcHJfZGVidWcoImRyaXZlciB1bmxvYWRlZFxuIik7CiAJcmV0dXJuOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdC5oIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3QuaAppbmRleCAxZjE5ZjBkLi5jYjAzZmY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0LmgKQEAgLTI5LDYgKzI5LDcgQEAKICAqCWFuZCBtaWRkbGV3YXJlLgogICogIFRoaXMgZmlsZSBpcyBzaGFyZWQgYmV0d2VlbiB0aGUgU1NUIGFuZCBNQUQgZHJpdmVycwogICovCisjaW5jbHVkZSAiaW50ZWxfc3N0X2lvY3RsLmgiCiAKICNkZWZpbmUgU1NUX0NBUkRfTkFNRVMgImludGVsX21pZF9jYXJkIgogCkBAIC0xMDcsMTAgKzEwOCwxNSBAQAogCWludCAoKnBvd2VyX2Rvd25fcG1pYykgKHZvaWQpOwogfTsKIAorc3RydWN0IGludGVsX3NzdF9wY21fY29udHJvbCB7CisJaW50ICgqb3BlbikgKHN0cnVjdCBzbmRfc3N0X3BhcmFtcyAqc3RyX3BhcmFtKTsKKwlpbnQgKCpkZXZpY2VfY29udHJvbCkgKGludCBjbWQsIHZvaWQgKmFyZyk7CisJaW50ICgqY2xvc2UpICh1bnNpZ25lZCBpbnQgc3RyX2lkKTsKK307CiBzdHJ1Y3QgaW50ZWxfc3N0X2NhcmRfb3BzIHsKIAljaGFyICptb2R1bGVfbmFtZTsKIAl1bnNpZ25lZCBpbnQgIHZlbmRvcl9pZDsKLQlpbnQgKCpjb250cm9sX3NldCkgKGludCBjb250cm9sX2VsZW1lbnQsIHZvaWQgKnZhbHVlKTsKKwlzdHJ1Y3QgaW50ZWxfc3N0X3BjbV9jb250cm9sICpwY21fY29udHJvbDsKIAlzdHJ1Y3Qgc25kX3BtaWNfb3BzICpzY2FyZF9vcHM7CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9hcHBfaW50ZXJmYWNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9hcHBfaW50ZXJmYWNlLmMKaW5kZXggOTkxNDQwMC4uYTM2Nzk5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3RfYXBwX2ludGVyZmFjZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0X2FwcF9pbnRlcmZhY2UuYwpAQCAtMjcsMTIgKzI3LDE1IEBACiAgKiAgVXBwZXIgbGF5ZXIgaW50ZXJmYWNlcyAoTUFEIGRyaXZlciwgTU1GKSB0byBTU1QgZHJpdmVyCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC91aW8uaD4KICNpbmNsdWRlIDxsaW51eC9haW8uaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KICNpZmRlZiBDT05GSUdfTVJTVF9SQVJfSEFORExFUgogI2luY2x1ZGUgPGxpbnV4L3Jhcl9yZWdpc3Rlci5oPgpAQCAtNTgsMTQgKzYxLDE0IEBACiB7CiAJaW50IHJldHZhbCA9IDA7CiAJaWYgKHNzdF9kcnZfY3R4LT5wbWljX3N0YXRlICE9IFNORF9NQURfSU5JVF9ET05FKSB7Ci0JCXByX3dhcm4oInNzdDogU291bmQgY2FyZCBub3QgYXZhaWxibGVcbiAiKTsKKwkJcHJfd2FybigiU291bmQgY2FyZCBub3QgYXZhaWxhYmxlXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCWlmIChzc3RfZHJ2X2N0eC0+c3N0X3N0YXRlID09IFNTVF9TVVNQRU5ERUQpIHsKLQkJcHJfZGVidWcoInNzdDogUmVzdW1pbmcgZnJvbSBTdXNwZW5kZWQgc3RhdGVcbiIpOworCQlwcl9kZWJ1ZygiUmVzdW1pbmcgZnJvbSBTdXNwZW5kZWQgc3RhdGVcbiIpOwogCQlyZXR2YWwgPSBpbnRlbF9zc3RfcmVzdW1lKHNzdF9kcnZfY3R4LT5wY2kpOwogCQlpZiAocmV0dmFsKSB7Ci0JCQlwcl9kZWJ1Zygic3N0OiBSZXN1bWUgRmFpbGVkPSAlI3gsYWJvcnRcbiIsIHJldHZhbCk7CisJCQlwcl9kZWJ1ZygiUmVzdW1lIEZhaWxlZD0gJSN4LGFib3J0XG4iLCByZXR2YWwpOwogCQkJcmV0dXJuIHJldHZhbDsKIAkJfQogCX0KQEAgLTk3LDE1ICsxMDAsMjIgQEAKICAqLwogaW50IGludGVsX3NzdF9vcGVuKHN0cnVjdCBpbm9kZSAqaV9ub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZV9wdHIpCiB7Ci0JaW50IHJldHZhbCA9IGludGVsX3NzdF9jaGVja19kZXZpY2UoKTsKLQlpZiAocmV0dmFsKQotCQlyZXR1cm4gcmV0dmFsOworCXVuc2lnbmVkIGludCByZXR2YWw7CiAKIAltdXRleF9sb2NrKCZzc3RfZHJ2X2N0eC0+c3RyZWFtX2xvY2spOworCXBtX3J1bnRpbWVfZ2V0X3N5bmMoJnNzdF9kcnZfY3R4LT5wY2ktPmRldik7CisJcmV0dmFsID0gaW50ZWxfc3N0X2NoZWNrX2RldmljZSgpOworCWlmIChyZXR2YWwpIHsKKwkJcG1fcnVudGltZV9wdXQoJnNzdF9kcnZfY3R4LT5wY2ktPmRldik7CisJCW11dGV4X3VubG9jaygmc3N0X2Rydl9jdHgtPnN0cmVhbV9sb2NrKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKIAlpZiAoc3N0X2Rydl9jdHgtPmVuY29kZWRfY250IDwgTUFYX0VOQ19TVFJFQU0pIHsKIAkJc3RydWN0IGlvY3RsX3B2dF9kYXRhICpkYXRhID0KIAkJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpb2N0bF9wdnRfZGF0YSksIEdGUF9LRVJORUwpOwogCQlpZiAoIWRhdGEpIHsKKwkJCXBtX3J1bnRpbWVfcHV0KCZzc3RfZHJ2X2N0eC0+cGNpLT5kZXYpOwogCQkJbXV0ZXhfdW5sb2NrKCZzc3RfZHJ2X2N0eC0+c3RyZWFtX2xvY2spOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KQEAgLTExNSw5ICsxMjUsMTAgQEAKIAkJZGF0YS0+cHZ0X2lkID0gc3N0X2Fzc2lnbl9wdnRfaWQoc3N0X2Rydl9jdHgpOwogCQlkYXRhLT5zdHJfaWQgPSAwOwogCQlmaWxlX3B0ci0+cHJpdmF0ZV9kYXRhID0gKHZvaWQgKilkYXRhOwotCQlwcl9kZWJ1Zygic3N0OiBwdnRfaWQgaGFuZGxlID0gJWQhXG4iLCBkYXRhLT5wdnRfaWQpOworCQlwcl9kZWJ1ZygicHZ0X2lkIGhhbmRsZSA9ICVkIVxuIiwgZGF0YS0+cHZ0X2lkKTsKIAl9IGVsc2UgewogCQlyZXR2YWwgPSAtRVVTRVJTOworCQlwbV9ydW50aW1lX3B1dCgmc3N0X2Rydl9jdHgtPnBjaS0+ZGV2KTsKIAkJbXV0ZXhfdW5sb2NrKCZzc3RfZHJ2X2N0eC0+c3RyZWFtX2xvY2spOwogCX0KIAlyZXR1cm4gcmV0dmFsOwpAQCAtMTM2LDE4ICsxNDcsMjYgQEAKICAqLwogaW50IGludGVsX3NzdF9vcGVuX2NudHJsKHN0cnVjdCBpbm9kZSAqaV9ub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZV9wdHIpCiB7Ci0JaW50IHJldHZhbCA9IGludGVsX3NzdF9jaGVja19kZXZpY2UoKTsKLQlpZiAocmV0dmFsKQotCQlyZXR1cm4gcmV0dmFsOworCXVuc2lnbmVkIGludCByZXR2YWw7CiAKIAkvKiBhdWRpbyBtYW5hZ2VyIG9wZW4gKi8KIAltdXRleF9sb2NrKCZzc3RfZHJ2X2N0eC0+c3RyZWFtX2xvY2spOworCXBtX3J1bnRpbWVfZ2V0X3N5bmMoJnNzdF9kcnZfY3R4LT5wY2ktPmRldik7CisJcmV0dmFsID0gaW50ZWxfc3N0X2NoZWNrX2RldmljZSgpOworCWlmIChyZXR2YWwpIHsKKwkJcG1fcnVudGltZV9wdXQoJnNzdF9kcnZfY3R4LT5wY2ktPmRldik7CisJCW11dGV4X3VubG9jaygmc3N0X2Rydl9jdHgtPnN0cmVhbV9sb2NrKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKIAlpZiAoc3N0X2Rydl9jdHgtPmFtX2NudCA8IE1BWF9BTV9IQU5ETEVTKSB7CiAJCXNzdF9kcnZfY3R4LT5hbV9jbnQrKzsKLQkJcHJfZGVidWcoInNzdDogQU0gaGFuZGxlIG9wZW5lZC4uLlxuIik7CisJCXByX2RlYnVnKCJBTSBoYW5kbGUgb3BlbmVkLi4uXG4iKTsKIAkJZmlsZV9wdHItPnByaXZhdGVfZGF0YSA9IE5VTEw7Ci0JfSBlbHNlCisJfSBlbHNlIHsKIAkJcmV0dmFsID0gLUVBQ0NFUzsKKwkJcG1fcnVudGltZV9wdXQoJnNzdF9kcnZfY3R4LT5wY2ktPmRldik7CisJfQogCiAJbXV0ZXhfdW5sb2NrKCZzc3RfZHJ2X2N0eC0+c3RyZWFtX2xvY2spOwogCXJldHVybiByZXR2YWw7CkBAIC0xNjYsMTAgKzE4NSwxMSBAQAogewogCXN0cnVjdCBpb2N0bF9wdnRfZGF0YSAqZGF0YSA9IGZpbGVfcHRyLT5wcml2YXRlX2RhdGE7CiAKLQlwcl9kZWJ1Zygic3N0OiBSZWxlYXNlIGNhbGxlZCwgY2xvc2luZyBhcHAgaGFuZGxlXG4iKTsKKwlwcl9kZWJ1ZygiUmVsZWFzZSBjYWxsZWQsIGNsb3NpbmcgYXBwIGhhbmRsZVxuIik7CiAJbXV0ZXhfbG9jaygmc3N0X2Rydl9jdHgtPnN0cmVhbV9sb2NrKTsKIAlzc3RfZHJ2X2N0eC0+ZW5jb2RlZF9jbnQtLTsKIAlzc3RfZHJ2X2N0eC0+c3RyZWFtX2NudC0tOworCXBtX3J1bnRpbWVfcHV0KCZzc3RfZHJ2X2N0eC0+cGNpLT5kZXYpOwogCW11dGV4X3VubG9jaygmc3N0X2Rydl9jdHgtPnN0cmVhbV9sb2NrKTsKIAlmcmVlX3N0cmVhbV9jb250ZXh0KGRhdGEtPnN0cl9pZCk7CiAJa2ZyZWUoZGF0YSk7CkBAIC0xODEsOCArMjAxLDkgQEAKIAkvKiBhdWRpbyBtYW5hZ2VyIGNsb3NlICovCiAJbXV0ZXhfbG9jaygmc3N0X2Rydl9jdHgtPnN0cmVhbV9sb2NrKTsKIAlzc3RfZHJ2X2N0eC0+YW1fY250LS07CisJcG1fcnVudGltZV9wdXQoJnNzdF9kcnZfY3R4LT5wY2ktPmRldik7CiAJbXV0ZXhfdW5sb2NrKCZzc3RfZHJ2X2N0eC0+c3RyZWFtX2xvY2spOwotCXByX2RlYnVnKCJzc3Q6IEFNIGhhbmRsZSBjbG9zZWRcbiIpOworCXByX2RlYnVnKCJBTSBoYW5kbGUgY2xvc2VkXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjA4LDcgKzIyOSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJbGVuZ3RoID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OwotCXByX2RlYnVnKCJzc3Q6IGNhbGxlZCBmb3Igc3RyZWFtICVkIGxlbmd0aCAweCV4XG4iLCBzdHJfaWQsIGxlbmd0aCk7CisJcHJfZGVidWcoImNhbGxlZCBmb3Igc3RyZWFtICVkIGxlbmd0aCAweCV4XG4iLCBzdHJfaWQsIGxlbmd0aCk7CiAKIAlpZiAobGVuZ3RoID4gc3N0X2Rydl9jdHgtPm1tYXBfbGVuKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTIzMSw3ICsyNTIsNyBAQAogCWVsc2UKIAkJc3N0X2Rydl9jdHgtPnN0cmVhbXNbc3RyX2lkXS5tbWFwcGVkID0gdHJ1ZTsKIAotCXByX2RlYnVnKCJzc3Q6IG1tYXAgcmV0IDB4JXhcbiIsIHJldHZhbCk7CisJcHJfZGVidWcoIm1tYXAgcmV0IDB4JXhcbiIsIHJldHZhbCk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtMjQ1LDcgKzI2Niw3IEBACiAJc3RydWN0IHNuZF9zc3RfbW1hcF9idWZmX2VudHJ5ICpidWZfZW50cnk7CiAJc3RydWN0IHNuZF9zc3RfbW1hcF9idWZmX2VudHJ5ICp0bXBfYnVmOwogCi0JcHJfZGVidWcoInNzdDpjYWxsZWQgZm9yIHN0cl9pZCAlZFxuIiwgc3RyX2lkKTsKKwlwcl9kZWJ1ZygiY2FsbGVkIGZvciBzdHJfaWQgJWRcbiIsIHN0cl9pZCk7CiAJcmV0dmFsID0gc3N0X3ZhbGlkYXRlX3N0cmlkKHN0cl9pZCk7CiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yNzAsNyArMjkxLDcgQEAKIAkJZ290byBvdXRfZnJlZTsKIAl9CiAKLQlwcl9kZWJ1Zygic3N0Om5ldyBidWZmZXJzIGNvdW50ICVkIHN0YXR1cyAlZFxuIiwKKwlwcl9kZWJ1ZygibmV3IGJ1ZmZlcnMgY291bnQgJWQgc3RhdHVzICVkXG4iLAogCQkJbW1hcF9idWYtPmVudHJpZXMsIHN0cmVhbS0+c3RhdHVzKTsKIAlidWZfZW50cnkgPSB0bXBfYnVmOwogCWZvciAoaSA9IDA7IGkgPCBtbWFwX2J1Zi0+ZW50cmllczsgaSsrKSB7CkBAIC0zMDAsMTQgKzMyMSwxNCBAQAogCQlzdHJlYW0tPnN0YXR1cyA9IFNUUkVBTV9SVU5OSU5HOwogCQlpZiAoc3RyZWFtLT5vcHMgPT0gU1RSRUFNX09QU19QTEFZQkFDSykgewogCQkJaWYgKHNzdF9wbGF5X2ZyYW1lKHN0cl9pZCkgPCAwKSB7Ci0JCQkJcHJfd2Fybigic3N0OiBwbGF5IGZyYW1lcyBmYWlsXG4iKTsKKwkJCQlwcl93YXJuKCJwbGF5IGZyYW1lcyBmYWlsXG4iKTsKIAkJCQltdXRleF91bmxvY2soJnN0cmVhbS0+bG9jayk7CiAJCQkJcmV0dmFsID0gLUVJTzsKIAkJCQlnb3RvIG91dF9mcmVlOwogCQkJfQogCQl9IGVsc2UgaWYgKHN0cmVhbS0+b3BzID09IFNUUkVBTV9PUFNfQ0FQVFVSRSkgewogCQkJaWYgKHNzdF9jYXB0dXJlX2ZyYW1lKHN0cl9pZCkgPCAwKSB7Ci0JCQkJcHJfd2Fybigic3N0OiBjYXB0dXJlIGZyYW1lIGZhaWxcbiIpOworCQkJCXByX3dhcm4oImNhcHR1cmUgZnJhbWUgZmFpbFxuIik7CiAJCQkJbXV0ZXhfdW5sb2NrKCZzdHJlYW0tPmxvY2spOwogCQkJCXJldHZhbCA9IC1FSU87CiAJCQkJZ290byBvdXRfZnJlZTsKQEAgLTMyNCw3ICszNDUsNyBAQAogCiAJaWYgKHJldHZhbCA+PSAwKQogCQlyZXR2YWwgPSBzdHJlYW0tPmN1bW1fYnl0ZXM7Ci0JcHJfZGVidWcoInNzdDplbmQgb2YgcGxheS9yZWMgaW9jdGwgYnl0ZXMgPSAlZCEhXG4iLCByZXR2YWwpOworCXByX2RlYnVnKCJlbmQgb2YgcGxheS9yZWMgaW9jdGwgYnl0ZXMgPSAlZCEhXG4iLCByZXR2YWwpOwogCiBvdXRfZnJlZToKIAlrZnJlZSh0bXBfYnVmKTsKQEAgLTM0OSw3ICszNzAsNyBAQAogCiAJaWYgKHN0cmVhbS0+c3RhdHVzID09IFNUUkVBTV9JTklUICYmIHN0cmVhbS0+cHJldiA9PSBTVFJFQU1fVU5fSU5JVCkgewogCQkvKiBzdHJlYW0gaXMgbm90IHN0YXJ0ZWQgeWV0ICovCi0JCXByX2RlYnVnKCJzc3Q6IFN0cmVhbSBpc24ndCBpbiBzdGFydGVkIHN0YXRlICVkLCBwcmV2ICVkXG4iLAorCQlwcl9kZWJ1ZygiU3RyZWFtIGlzbid0IGluIHN0YXJ0ZWQgc3RhdGUgJWQsIHByZXYgJWRcbiIsCiAJCQlzdHJlYW0tPnN0YXR1cywgc3RyZWFtLT5wcmV2KTsKIAl9IGVsc2UgaWYgKChzdHJlYW0tPnN0YXR1cyA9PSBTVFJFQU1fUlVOTklORyB8fAogCQkJc3RyZWFtLT5zdGF0dXMgPT0gU1RSRUFNX1BBVVNFRCkgJiYKQEAgLTM1OCwxMyArMzc5LDEzIEBACiAJCWlmIChzdHJlYW0tPm9wcyA9PSBTVFJFQU1fT1BTX1BMQVlCQUNLIHx8CiAJCQkJc3RyZWFtLT5vcHMgPT0gU1RSRUFNX09QU19QTEFZQkFDS19EUk0pIHsKIAkJCWlmIChzc3RfcGxheV9mcmFtZShzdHJfaWQpIDwgMCkgewotCQkJCXByX3dhcm4oInNzdDogcGxheSBmcmFtZXMgZmFpbGVkXG4iKTsKKwkJCQlwcl93YXJuKCJwbGF5IGZyYW1lcyBmYWlsZWRcbiIpOwogCQkJCW11dGV4X3VubG9jaygmc3RyZWFtLT5sb2NrKTsKIAkJCQlyZXR1cm4gLUVJTzsKIAkJCX0KIAkJfSBlbHNlIGlmIChzdHJlYW0tPm9wcyA9PSBTVFJFQU1fT1BTX0NBUFRVUkUpIHsKIAkJCWlmIChzc3RfY2FwdHVyZV9mcmFtZShzdHJfaWQpIDwgMCkgewotCQkJCXByX3dhcm4oInNzdDogY2FwdHVyZSBmcmFtZXMgZmFpbGVkXG4gIik7CisJCQkJcHJfd2FybigiY2FwdHVyZSBmcmFtZXMgZmFpbGVkXG4iKTsKIAkJCQltdXRleF91bmxvY2soJnN0cmVhbS0+bG9jayk7CiAJCQkJcmV0dXJuIC1FSU87CiAJCQl9CkBAIC0zNzksNyArNDAwLDcgQEAKIAlyZXR2YWwgPSBzc3Rfd2FpdF9pbnRlcnJ1cHRpYmxlKHNzdF9kcnZfY3R4LCAmc3RyZWFtLT5kYXRhX2Jsayk7CiAJaWYgKHJldHZhbCkgewogCQlzdHJlYW0tPnN0YXR1cyA9IFNUUkVBTV9JTklUOwotCQlwcl9kZWJ1Zygic3N0OiB3YWl0IHJldHVybmVkIGVycm9yLi4uXG4iKTsKKwkJcHJfZGVidWcoIndhaXQgcmV0dXJuZWQgZXJyb3IuLi5cbiIpOwogCX0KIAlyZXR1cm4gcmV0dmFsOwogfQpAQCAtNDc3LDcgKzQ5OCw3IEBACiAJCWlmICgoKHVuc2lnbmVkIGxvbmcpaW92ZWNbaW5kZXhdLmlvdl9iYXNlCiAJCQkJKyBpb3ZlY1tpbmRleF0uaW92X2xlbikgPAogCQkJCSgodW5zaWduZWQgbG9uZylpb3ZlY1tpbmRleF0uaW92X2Jhc2UpKSB7Ci0JCQlwcl9kZWJ1Zygic3N0OiBCdWZmZXIgb3ZlcmZsb3dzIik7CisJCQlwcl9kZWJ1ZygiQnVmZmVyIG92ZXJmbG93c1xuIik7CiAJCQlrZnJlZShzdHJlYW1fYnVmcyk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtNDkwLDcgKzUxMSw3IEBACiAJCX0KIAogCQljb3BpZWRfc2l6ZSArPSBzaXplOwotCQlwcl9kZWJ1Zygic3N0OiBjb3BpZWRfc2l6ZSAtICVseFxuIiwgY29waWVkX3NpemUpOworCQlwcl9kZWJ1ZygiY29waWVkX3NpemUgLSAlbHhcbiIsIGNvcGllZF9zaXplKTsKIAkJaWYgKChjb3BpZWRfc2l6ZSA+PSBtbWFwX2xlbikgfHwKIAkJCQkoc3RyZWFtLT5zZ19pbmRleCA9PSBucl9zZWdzKSkgewogCQkJYWRkX3RvX2xpc3QgPSAxOwpAQCAtNTIwLDcgKzU0MSw3IEBACiAJaW50IHJldHZhbCA9IDA7CiAKIAkvKiBjb3B5IHNlbnQgYnVmZmVycyAqLwotCXByX2RlYnVnKCJzc3Q6IGNhcHR1cmUgc3RyZWFtIGNvcHlpbmcgdG8gdXNlciBub3cuLi5cbiIpOworCXByX2RlYnVnKCJjYXB0dXJlIHN0cmVhbSBjb3B5aW5nIHRvIHVzZXIgbm93Li4uXG4iKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoa2J1ZnMsIF9rYnVmcywgJnN0cmVhbS0+YnVmcywgbm9kZSkgewogCQlpZiAoa2J1ZnMtPmluX3VzZSA9PSB0cnVlKSB7CiAJCQkvKiBjb3B5IHRvIHVzZXIgKi8KQEAgLTUzOCw3ICs1NTksNyBAQAogCQkJfQogCQl9CiAJfQotCXByX2RlYnVnKCJzc3Q6IGVuZCBvZiBjYXAgY29weVxuIik7CisJcHJfZGVidWcoImVuZCBvZiBjYXAgY29weVxuIik7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtNTkwLDcgKzYxMSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCXN0cmVhbSA9ICZzc3RfZHJ2X2N0eC0+c3RyZWFtc1tzdHJfaWRdOwogCWlmIChzdHJlYW0tPm1tYXBwZWQgPT0gdHJ1ZSkgewotCQlwcl93YXJuKCJzc3Q6IHVzZXIgd3JpdGUgYW5kIHN0cmVhbSBpcyBtYXBwZWQiKTsKKwkJcHJfd2FybigidXNlciB3cml0ZSBhbmQgc3RyZWFtIGlzIG1hcHBlZFxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIAlpZiAoIWNvdW50KQpAQCAtNTk4LDcgKzYxOSw3IEBACiAJc3RyZWFtLT5jdXJyX2J5dGVzID0gMDsKIAlzdHJlYW0tPmN1bW1fYnl0ZXMgPSAwOwogCS8qIGNvcHkgdXNlciBidWYgZGV0YWlscyAqLwotCXByX2RlYnVnKCJzc3Q6IG5ldyBidWZmZXJzICVwLCBjb3B5IHNpemUgJWQsIHN0YXR1cyAlZFxuIiAsCisJcHJfZGVidWcoIm5ldyBidWZmZXJzICVwLCBjb3B5IHNpemUgJWQsIHN0YXR1cyAlZFxuIiAsCiAJCQlidWYsIChpbnQpIGNvdW50LCAoaW50KSBzdHJlYW0tPnN0YXR1cyk7CiAKIAlzdHJlYW0tPmJ1Zl90eXBlID0gU1NUX0JVRl9VU0VSX1NUQVRJQzsKQEAgLTYxOCw3ICs2MzksNyBAQAogCXN0cmVhbS0+Y3VyX3B0ciA9IE5VTEw7CiAJaWYgKHJldHZhbCA+PSAwKQogCQlyZXR2YWwgPSBzdHJlYW0tPmN1bW1fYnl0ZXM7Ci0JcHJfZGVidWcoInNzdDogZW5kIG9mIHBsYXkvcmVjIGJ5dGVzID0gJWQhIVxuIiwgcmV0dmFsKTsKKwlwcl9kZWJ1ZygiZW5kIG9mIHBsYXkvcmVjIGJ5dGVzID0gJWQhIVxuIiwgcmV0dmFsKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC02MzksNyArNjYwLDcgQEAKIAlpbnQgc3RyX2lkID0gZGF0YS0+c3RyX2lkOwogCXN0cnVjdCBzdHJlYW1faW5mbyAqc3RyZWFtID0gJnNzdF9kcnZfY3R4LT5zdHJlYW1zW3N0cl9pZF07CiAKLQlwcl9kZWJ1Zygic3N0OiBjYWxsZWQgZm9yICVkXG4iLCBzdHJfaWQpOworCXByX2RlYnVnKCJjYWxsZWQgZm9yICVkXG4iLCBzdHJfaWQpOwogCWlmIChzdHJlYW0tPnN0YXR1cyA9PSBTVFJFQU1fVU5fSU5JVCB8fAogCQlzdHJlYW0tPnN0YXR1cyA9PSBTVFJFQU1fREVDT0RFKSB7CiAJCXJldHVybiAtRUJBRFJRQzsKQEAgLTY2NSwxMiArNjg2LDEyIEBACiAJaW50IHN0cl9pZCA9IGRhdGEtPnN0cl9pZDsKIAlzdHJ1Y3Qgc3RyZWFtX2luZm8gKnN0cmVhbTsKIAotCXByX2RlYnVnKCJzc3Q6IGVudHJ5IC0gJWxkXG4iLCBucl9zZWdzKTsKKwlwcl9kZWJ1ZygiZW50cnkgLSAlbGRcbiIsIG5yX3NlZ3MpOwogCiAJaWYgKGlzX3N5bmNfa2lvY2Ioa2lvY2IpID09IGZhbHNlKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXByX2RlYnVnKCJzc3Q6IGNhbGxlZCBmb3Igc3RyX2lkICVkXG4iLCBzdHJfaWQpOworCXByX2RlYnVnKCJjYWxsZWQgZm9yIHN0cl9pZCAlZFxuIiwgc3RyX2lkKTsKIAlyZXR2YWwgPSBzc3RfdmFsaWRhdGVfc3RyaWQoc3RyX2lkKTsKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTY4Myw3ICs3MDQsNyBAQAogCX0KIAlzdHJlYW0tPmN1cnJfYnl0ZXMgPSAwOwogCXN0cmVhbS0+Y3VtbV9ieXRlcyA9IDA7Ci0JcHJfZGVidWcoInNzdDogbmV3IHNlZ3MgJWxkLCBvZmZzZXQgJWQsIHN0YXR1cyAlZFxuIiAsCisJcHJfZGVidWcoIm5ldyBzZWdzICVsZCwgb2Zmc2V0ICVkLCBzdGF0dXMgJWRcbiIgLAogCQkJbnJfc2VncywgKGludCkgb2Zmc2V0LCAoaW50KSBzdHJlYW0tPnN0YXR1cyk7CiAJc3RyZWFtLT5idWZfdHlwZSA9IFNTVF9CVUZfVVNFUl9TVEFUSUM7CiAJZG8gewpAQCAtNjk4LDcgKzcxOSw3IEBACiAJc3RyZWFtLT5jdXJfcHRyID0gTlVMTDsKIAlpZiAocmV0dmFsID49IDApCiAJCXJldHZhbCA9IHN0cmVhbS0+Y3VtbV9ieXRlczsKLQlwcl9kZWJ1Zygic3N0OiBlbmQgb2YgcGxheS9yZWMgYnl0ZXMgPSAlZCEhXG4iLCByZXR2YWwpOworCXByX2RlYnVnKCJlbmQgb2YgcGxheS9yZWMgYnl0ZXMgPSAlZCEhXG4iLCByZXR2YWwpOwogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTcxOSw3ICs3NDAsNyBAQAogCWludCBzdHJfaWQgPSBkYXRhLT5zdHJfaWQ7CiAJc3RydWN0IHN0cmVhbV9pbmZvICpzdHJlYW0gPSAmc3N0X2Rydl9jdHgtPnN0cmVhbXNbc3RyX2lkXTsKIAotCXByX2RlYnVnKCJzc3Q6IGNhbGxlZCBmb3IgJWRcbiIsIHN0cl9pZCk7CisJcHJfZGVidWcoImNhbGxlZCBmb3IgJWRcbiIsIHN0cl9pZCk7CiAJaWYgKHN0cmVhbS0+c3RhdHVzID09IFNUUkVBTV9VTl9JTklUIHx8CiAJCQlzdHJlYW0tPnN0YXR1cyA9PSBTVFJFQU1fREVDT0RFKQogCQlyZXR1cm4gLUVCQURSUUM7CkBAIC03NDQsMTQgKzc2NSwxNCBAQAogCWludCBzdHJfaWQgPSBkYXRhLT5zdHJfaWQ7CiAJc3RydWN0IHN0cmVhbV9pbmZvICpzdHJlYW07CiAKLQlwcl9kZWJ1Zygic3N0OiBlbnRyeSAtICVsZFxuIiwgbnJfc2Vncyk7CisJcHJfZGVidWcoImVudHJ5IC0gJWxkXG4iLCBucl9zZWdzKTsKIAogCWlmIChpc19zeW5jX2tpb2NiKGtpb2NiKSA9PSBmYWxzZSkgewotCQlwcl9kZWJ1Zygic3N0OiBhaW9fcmVhZCBmcm9tIHVzZXIgc3BhY2UgaXMgbm90IGFsbG93ZWRcbiIpOworCQlwcl9kZWJ1ZygiYWlvX3JlYWQgZnJvbSB1c2VyIHNwYWNlIGlzIG5vdCBhbGxvd2VkXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcHJfZGVidWcoInNzdDogY2FsbGVkIGZvciBzdHJfaWQgJWRcbiIsIHN0cl9pZCk7CisJcHJfZGVidWcoImNhbGxlZCBmb3Igc3RyX2lkICVkXG4iLCBzdHJfaWQpOwogCXJldHZhbCA9IHNzdF92YWxpZGF0ZV9zdHJpZChzdHJfaWQpOwogCWlmIChyZXR2YWwpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNzY0LDcgKzc4NSw3IEBACiAJc3RyZWFtLT5jdXJyX2J5dGVzID0gMDsKIAlzdHJlYW0tPmN1bW1fYnl0ZXMgPSAwOwogCi0JcHJfZGVidWcoInNzdDogbmV3IHNlZ3MgJWxkLCBvZmZzZXQgJWQsIHN0YXR1cyAlZFxuIiAsCisJcHJfZGVidWcoIm5ldyBzZWdzICVsZCwgb2Zmc2V0ICVkLCBzdGF0dXMgJWRcbiIgLAogCQkJbnJfc2VncywgKGludCkgb2Zmc2V0LCAoaW50KSBzdHJlYW0tPnN0YXR1cyk7CiAJc3RyZWFtLT5idWZfdHlwZSA9IFNTVF9CVUZfVVNFUl9TVEFUSUM7CiAJZG8gewpAQCAtNzc5LDM0ICs4MDAsMTY5IEBACiAJc3RyZWFtLT5jdXJfcHRyID0gTlVMTDsKIAlpZiAocmV0dmFsID49IDApCiAJCXJldHZhbCA9IHN0cmVhbS0+Y3VtbV9ieXRlczsKLQlwcl9kZWJ1Zygic3N0OiBlbmQgb2YgcGxheS9yZWMgYnl0ZXMgPSAlZCEhXG4iLCByZXR2YWwpOworCXByX2RlYnVnKCJlbmQgb2YgcGxheS9yZWMgYnl0ZXMgPSAlZCEhXG4iLCByZXR2YWwpOwogCXJldHVybiByZXR2YWw7CiB9CiAKIC8qIHNzdF9wcmludF9zdHJlYW1fcGFyYW1zIC0gcHJpbnRzIHRoZSBzdHJlYW0gcGFyYW1ldGVycyAoZGVidWcgZm4pKi8KIHN0YXRpYyB2b2lkIHNzdF9wcmludF9zdHJlYW1fcGFyYW1zKHN0cnVjdCBzbmRfc3N0X2dldF9zdHJlYW1fcGFyYW1zICpnZXRfcHJtKQogewotCXByX2RlYnVnKCJzc3Q6IGNvZGVjIHBhcmFtczpyZXN1bHQgPSVkXG4iLAorCXByX2RlYnVnKCJjb2RlYyBwYXJhbXM6cmVzdWx0ID0gJWRcbiIsCiAJCQkJZ2V0X3BybS0+Y29kZWNfcGFyYW1zLnJlc3VsdCk7Ci0JcHJfZGVidWcoInNzdDogY29kZWMgcGFyYW1zOnN0cmVhbSA9ICVkXG4iLAorCXByX2RlYnVnKCJjb2RlYyBwYXJhbXM6c3RyZWFtID0gJWRcbiIsCiAJCQkJZ2V0X3BybS0+Y29kZWNfcGFyYW1zLnN0cmVhbV9pZCk7Ci0JcHJfZGVidWcoInNzdDogY29kZWMgcGFyYW1zOmNvZGVjID0gJWRcbiIsCisJcHJfZGVidWcoImNvZGVjIHBhcmFtczpjb2RlYyA9ICVkXG4iLAogCQkJCWdldF9wcm0tPmNvZGVjX3BhcmFtcy5jb2RlYyk7Ci0JcHJfZGVidWcoInNzdDogY29kZWMgcGFyYW1zOm9wcyA9ICVkXG4iLAorCXByX2RlYnVnKCJjb2RlYyBwYXJhbXM6b3BzID0gJWRcbiIsCiAJCQkJZ2V0X3BybS0+Y29kZWNfcGFyYW1zLm9wcyk7Ci0JcHJfZGVidWcoInNzdDogY29kZWMgcGFyYW1zOnN0cmVhbV90eXBlPSAlZFxuIiwKKwlwcl9kZWJ1ZygiY29kZWMgcGFyYW1zOnN0cmVhbV90eXBlID0gJWRcbiIsCiAJCQkJZ2V0X3BybS0+Y29kZWNfcGFyYW1zLnN0cmVhbV90eXBlKTsKLQlwcl9kZWJ1Zygic3N0OiBwY21wYXJhbXM6c2ZyZXE9ICVkXG4iLAorCXByX2RlYnVnKCJwY21wYXJhbXM6c2ZyZXEgPSAlZFxuIiwKIAkJCQlnZXRfcHJtLT5wY21fcGFyYW1zLnNmcmVxKTsKLQlwcl9kZWJ1Zygic3N0OiBwY21wYXJhbXM6bnVtX2NoYW49ICVkXG4iLAorCXByX2RlYnVnKCJwY21wYXJhbXM6bnVtX2NoYW4gPSAlZFxuIiwKIAkJCQlnZXRfcHJtLT5wY21fcGFyYW1zLm51bV9jaGFuKTsKLQlwcl9kZWJ1Zygic3N0OiBwY21wYXJhbXM6cGNtX3dkX3N6PSAlZFxuIiwKKwlwcl9kZWJ1ZygicGNtcGFyYW1zOnBjbV93ZF9zeiA9ICVkXG4iLAogCQkJCWdldF9wcm0tPnBjbV9wYXJhbXMucGNtX3dkX3N6KTsKIAlyZXR1cm47CiB9CiAKIC8qKgotICogaW50ZWxfc3N0X2lvY3RsIC0gcmVjaWV2ZXMgdGhlIGRldmljZSBpb2N0bCdzCisgKiBzc3RfY3JlYXRlX2FsZ29faXBjIC0gY3JlYXRlIGlwYyBtc2cgZm9yIGFsZ29yaXRobSBwYXJhbWV0ZXJzCisgKgorICogQGFsZ29fcGFyYW1zOiBBbGdvcml0aG0gcGFyYW1ldGVycworICogQG1zZzogcG9zdCBtc2cgcG9pbnRlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNyZWF0ZSBpcGMgbXNnCisgKi8KK2ludCBzc3RfY3JlYXRlX2FsZ29faXBjKHN0cnVjdCBzbmRfcHBwX3BhcmFtcyAqYWxnb19wYXJhbXMsCisJCQkJCXN0cnVjdCBpcGNfcG9zdCAqKm1zZykKK3sKKwlpZiAoc3N0X2NyZWF0ZV9sYXJnZV9tc2cobXNnKSkKKwkJcmV0dXJuIC1FTk9NRU07CisJc3N0X2ZpbGxfaGVhZGVyKCYoKm1zZyktPmhlYWRlciwKKwkJCUlQQ19JQV9BTEdfUEFSQU1TLCAxLCBhbGdvX3BhcmFtcy0+c3RyX2lkKTsKKwkoKm1zZyktPmhlYWRlci5wYXJ0LmRhdGEgPSBzaXplb2YodTMyKSArCisJCQlzaXplb2YoKmFsZ29fcGFyYW1zKSArIGFsZ29fcGFyYW1zLT5zaXplOworCW1lbWNweSgoKm1zZyktPm1haWxib3hfZGF0YSwgJigqbXNnKS0+aGVhZGVyLCBzaXplb2YodTMyKSk7CisJbWVtY3B5KCgqbXNnKS0+bWFpbGJveF9kYXRhICsgc2l6ZW9mKHUzMiksCisJCQkJYWxnb19wYXJhbXMsIHNpemVvZigqYWxnb19wYXJhbXMpKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBzc3Rfc2VuZF9hbGdvX2lwYyAtIHNlbmQgaXBjIG1zZyBmb3IgYWxnb3JpdGhtIHBhcmFtZXRlcnMKKyAqCisgKiBAbXNnOiBwb3N0IG1zZyBwb2ludGVyCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2VuZCBpcGMgbXNnCisgKi8KK2ludCBzc3Rfc2VuZF9hbGdvX2lwYyhzdHJ1Y3QgaXBjX3Bvc3QgKiptc2cpCit7CisJc3N0X2Rydl9jdHgtPnBwcF9wYXJhbXNfYmxrLmNvbmRpdGlvbiA9IGZhbHNlOworCXNzdF9kcnZfY3R4LT5wcHBfcGFyYW1zX2Jsay5yZXRfY29kZSA9IDA7CisJc3N0X2Rydl9jdHgtPnBwcF9wYXJhbXNfYmxrLm9uID0gdHJ1ZTsKKwlzc3RfZHJ2X2N0eC0+cHBwX3BhcmFtc19ibGsuZGF0YSA9IE5VTEw7CisJc3Bpbl9sb2NrKCZzc3RfZHJ2X2N0eC0+bGlzdF9zcGluX2xvY2spOworCWxpc3RfYWRkX3RhaWwoJigqbXNnKS0+bm9kZSwgJnNzdF9kcnZfY3R4LT5pcGNfZGlzcGF0Y2hfbGlzdCk7CisJc3Bpbl91bmxvY2soJnNzdF9kcnZfY3R4LT5saXN0X3NwaW5fbG9jayk7CisJc3N0X3Bvc3RfbWVzc2FnZSgmc3N0X2Rydl9jdHgtPmlwY19wb3N0X21zZ193cSk7CisJcmV0dXJuIHNzdF93YWl0X2ludGVycnVwdGlibGVfdGltZW91dChzc3RfZHJ2X2N0eCwKKwkJCSZzc3RfZHJ2X2N0eC0+cHBwX3BhcmFtc19ibGssIFNTVF9CTE9DS19USU1FT1VUKTsKK30KKworLyoqCisgKiBpbnRlbF9zc3RfaW9jdGxfZHNwIC0gcmVjaWV2ZXMgdGhlIGRldmljZSBpb2N0bCdzCisgKgorICogQGNtZDpJb2N0bCBjbWQKKyAqIEBhcmc6ZGF0YQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSB1c2VyIHNwYWNlIGNvbXBvbmVudAorICogc2VuZHMgYSBEU1AgSW9jdGwgdG8gU1NUIGRyaXZlcgorICovCitsb25nIGludGVsX3NzdF9pb2N0bF9kc3AodW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHJldHZhbCA9IDA7CisJc3RydWN0IHNuZF9wcHBfcGFyYW1zIGFsZ29fcGFyYW1zOworCXN0cnVjdCBzbmRfcHBwX3BhcmFtcyAqYWxnb19wYXJhbXNfY29waWVkOworCXN0cnVjdCBpcGNfcG9zdCAqbXNnOworCisJc3dpdGNoIChfSU9DX05SKGNtZCkpIHsKKwljYXNlIF9JT0NfTlIoU05EUlZfU1NUX1NFVF9BTEdPKToKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZhbGdvX3BhcmFtcywgKHZvaWQgX191c2VyICopYXJnLAorCQkJCQkJCXNpemVvZihhbGdvX3BhcmFtcykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChhbGdvX3BhcmFtcy5zaXplID4gU1NUX01BSUxCT1hfU0laRSkKKwkJCXJldHVybiAtRU1TR1NJWkU7CisKKwkJcHJfZGVidWcoIkFsZ28gSUQgJWQgU3RyIGlkICVkIEVuYWJsZSAlZCBTaXplICVkXG4iLAorCQkJYWxnb19wYXJhbXMuYWxnb19pZCwgYWxnb19wYXJhbXMuc3RyX2lkLAorCQkJYWxnb19wYXJhbXMuZW5hYmxlLCBhbGdvX3BhcmFtcy5zaXplKTsKKwkJcmV0dmFsID0gc3N0X2NyZWF0ZV9hbGdvX2lwYygmYWxnb19wYXJhbXMsICZtc2cpOworCQlpZiAocmV0dmFsKQorCQkJYnJlYWs7CisJCWFsZ29fcGFyYW1zLnJlc2VydmVkID0gMDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKG1zZy0+bWFpbGJveF9kYXRhICsgc2l6ZW9mKGFsZ29fcGFyYW1zKSwKKwkJCQlhbGdvX3BhcmFtcy5wYXJhbXMsIGFsZ29fcGFyYW1zLnNpemUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcmV0dmFsID0gc3N0X3NlbmRfYWxnb19pcGMoJm1zZyk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXByX2RlYnVnKCJFcnJvciBpbiBzc3Rfc2V0X2FsZ28gPSAlZFxuIiwgcmV0dmFsKTsKKwkJCXJldHZhbCA9IC1FSU87CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIF9JT0NfTlIoU05EUlZfU1NUX0dFVF9BTEdPKToKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZhbGdvX3BhcmFtcywgKHZvaWQgX191c2VyICopYXJnLAorCQkJCQkJCXNpemVvZihhbGdvX3BhcmFtcykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXByX2RlYnVnKCJBbGdvIElEICVkIFN0ciBpZCAlZCBFbmFibGUgJWQgU2l6ZSAlZFxuIiwKKwkJCWFsZ29fcGFyYW1zLmFsZ29faWQsIGFsZ29fcGFyYW1zLnN0cl9pZCwKKwkJCWFsZ29fcGFyYW1zLmVuYWJsZSwgYWxnb19wYXJhbXMuc2l6ZSk7CisJCXJldHZhbCA9IHNzdF9jcmVhdGVfYWxnb19pcGMoJmFsZ29fcGFyYW1zLCAmbXNnKTsKKwkJaWYgKHJldHZhbCkKKwkJCWJyZWFrOworCQlhbGdvX3BhcmFtcy5yZXNlcnZlZCA9IDE7CisJCXJldHZhbCA9IHNzdF9zZW5kX2FsZ29faXBjKCZtc2cpOworCQlpZiAocmV0dmFsKSB7CisJCQlwcl9kZWJ1ZygiRXJyb3IgaW4gc3N0X2dldF9hbGdvID0gJWRcbiIsIHJldHZhbCk7CisJCQlyZXR2YWwgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKwkJYWxnb19wYXJhbXNfY29waWVkID0gKHN0cnVjdCBzbmRfcHBwX3BhcmFtcyAqKQorCQkJCQlzc3RfZHJ2X2N0eC0+cHBwX3BhcmFtc19ibGsuZGF0YTsKKwkJaWYgKGFsZ29fcGFyYW1zX2NvcGllZC0+c2l6ZSA+IGFsZ29fcGFyYW1zLnNpemUpIHsKKwkJCXByX2RlYnVnKCJtZW0gaW5zdWZmaWNpZW50IHRvIGNvcHlcbiIpOworCQkJcmV0dmFsID0gLUVNU0dTSVpFOworCQkJZ290byBmcmVlX21lbTsKKwkJfSBlbHNlIHsKKwkJCWNoYXIgX191c2VyICp0bXA7CisKKwkJCWlmIChjb3B5X3RvX3VzZXIoYWxnb19wYXJhbXMucGFyYW1zLAorCQkJCQlhbGdvX3BhcmFtc19jb3BpZWQtPnBhcmFtcywKKwkJCQkJYWxnb19wYXJhbXNfY29waWVkLT5zaXplKSkgeworCQkJCXJldHZhbCA9IC1FRkFVTFQ7CisJCQkJZ290byBmcmVlX21lbTsKKwkJCX0KKwkJCXRtcCA9IChjaGFyIF9fdXNlciAqKWFyZyArIG9mZnNldG9mKAorCQkJCQlzdHJ1Y3Qgc25kX3BwcF9wYXJhbXMsIHNpemUpOworCQkJaWYgKGNvcHlfdG9fdXNlcih0bXAsICZhbGdvX3BhcmFtc19jb3BpZWQtPnNpemUsCisJCQkJCQkgc2l6ZW9mKF9fdTMyKSkpIHsKKwkJCQlyZXR2YWwgPSAtRUZBVUxUOworCQkJCWdvdG8gZnJlZV9tZW07CisJCQl9CisKKwkJfQorZnJlZV9tZW06CisJCWtmcmVlKGFsZ29fcGFyYW1zX2NvcGllZC0+cGFyYW1zKTsKKwkJa2ZyZWUoYWxnb19wYXJhbXNfY29waWVkKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogaW50ZWxfc3N0X2lvY3RsIC0gcmVjZWl2ZXMgdGhlIGRldmljZSBpb2N0bCdzCiAgKiBAZmlsZV9wdHI6cG9pbnRlciB0byBmaWxlCiAgKiBAY21kOklvY3RsIGNtZAogICogQGFyZzpkYXRhCkBAIC04MzIsNyArOTg4LDcgQEAKIAogCXN3aXRjaCAoX0lPQ19OUihjbWQpKSB7CiAJY2FzZSBfSU9DX05SKFNORFJWX1NTVF9TVFJFQU1fUEFVU0UpOgotCQlwcl9kZWJ1Zygic3N0OiBJT0NUTF9QQVVTRSByZWNpZXZlZCBmb3IgJWQhXG4iLCBzdHJfaWQpOworCQlwcl9kZWJ1ZygiSU9DVExfUEFVU0UgcmVjZWl2ZWQgZm9yICVkIVxuIiwgc3RyX2lkKTsKIAkJaWYgKG1pbm9yICE9IFNUUkVBTV9NT0RVTEUpIHsKIAkJCXJldHZhbCA9IC1FQkFEUlFDOwogCQkJYnJlYWs7CkBAIC04NDEsNyArOTk3LDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIF9JT0NfTlIoU05EUlZfU1NUX1NUUkVBTV9SRVNVTUUpOgotCQlwcl9kZWJ1Zygic3N0OiBTTkRSVl9TU1RfSU9DVExfUkVTVU1FIHJlY2lldmVkIVxuIik7CisJCXByX2RlYnVnKCJTTkRSVl9TU1RfSU9DVExfUkVTVU1FIHJlY2VpdmVkIVxuIik7CiAJCWlmIChtaW5vciAhPSBTVFJFQU1fTU9EVUxFKSB7CiAJCQlyZXR2YWwgPSAtRUJBRFJRQzsKIAkJCWJyZWFrOwpAQCAtODUyLDcgKzEwMDgsNyBAQAogCWNhc2UgX0lPQ19OUihTTkRSVl9TU1RfU1RSRUFNX1NFVF9QQVJBTVMpOiB7CiAJCXN0cnVjdCBzbmRfc3N0X3BhcmFtcyBzdHJfcGFyYW07CiAKLQkJcHJfZGVidWcoInNzdDogSU9DVExfU0VUX1BBUkFNUyByZWNpZXZlZCFcbiIpOworCQlwcl9kZWJ1ZygiSU9DVExfU0VUX1BBUkFNUyByZWNlaXZlZCFcbiIpOwogCQlpZiAobWlub3IgIT0gU1RSRUFNX01PRFVMRSkgewogCQkJcmV0dmFsID0gLUVCQURSUUM7CiAJCQlicmVhazsKQEAgLTg4NCw3ICsxMDQwLDcgQEAKIAkJCQkJcmV0dmFsID0gLUVJTlZBTDsKIAkJCX0KIAkJfSBlbHNlIHsKLQkJCXByX2RlYnVnKCJzc3Q6IFNFVF9TVFJFQU1fUEFSQU1TIHJlY2lldmVkIVxuIik7CisJCQlwcl9kZWJ1ZygiU0VUX1NUUkVBTV9QQVJBTVMgcmVjZWl2ZWQhXG4iKTsKIAkJCS8qIGFsbG9jYXRlZCBzZXQgcGFyYW1zIG9ubHkgKi8KIAkJCXJldHZhbCA9IHNzdF9zZXRfc3RyZWFtX3BhcmFtKHN0cl9pZCwgJnN0cl9wYXJhbSk7CiAJCQkvKiBCbG9jayB0aGUgY2FsbCBmb3IgcmVwbHkgKi8KQEAgLTkwNywxNCArMTA2MywxNCBAQAogCiAJCWlmIChjb3B5X2Zyb21fdXNlcigmc2V0X3ZvbCwgKHZvaWQgX191c2VyICopYXJnLAogCQkJCXNpemVvZihzZXRfdm9sKSkpIHsKLQkJCXByX2RlYnVnKCJzc3Q6IGNvcHkgZmFpbGVkXG4iKTsKKwkJCXByX2RlYnVnKCJjb3B5IGZhaWxlZFxuIik7CiAJCQlyZXR2YWwgPSAtRUZBVUxUOwogCQkJYnJlYWs7CiAJCX0KLQkJcHJfZGVidWcoInNzdDogU0VUX1ZPTFVNRSByZWNpZXZlZCBmb3IgJWQhXG4iLAorCQlwcl9kZWJ1ZygiU0VUX1ZPTFVNRSByZWNpZXZlZCBmb3IgJWQhXG4iLAogCQkJCXNldF92b2wuc3RyZWFtX2lkKTsKIAkJaWYgKG1pbm9yID09IFNUUkVBTV9NT0RVTEUgJiYgc2V0X3ZvbC5zdHJlYW1faWQgPT0gMCkgewotCQkJcHJfZGVidWcoInNzdDogaW52YWxpZCBvcGVyYXRpb24hXG4iKTsKKwkJCXByX2RlYnVnKCJpbnZhbGlkIG9wZXJhdGlvbiFcbiIpOwogCQkJcmV0dmFsID0gLUVQRVJNOwogCQkJYnJlYWs7CiAJCX0KQEAgLTkyOSwxMCArMTA4NSwxMCBAQAogCQkJcmV0dmFsID0gLUVGQVVMVDsKIAkJCWJyZWFrOwogCQl9Ci0JCXByX2RlYnVnKCJzc3Q6IElPQ1RMX0dFVF9WT0xVTUUgcmVjaWV2ZWQgZm9yIHN0cmVhbSA9ICVkIVxuIiwKKwkJcHJfZGVidWcoIklPQ1RMX0dFVF9WT0xVTUUgcmVjaWV2ZWQgZm9yIHN0cmVhbSA9ICVkIVxuIiwKIAkJCQlnZXRfdm9sLnN0cmVhbV9pZCk7CiAJCWlmIChtaW5vciA9PSBTVFJFQU1fTU9EVUxFICYmIGdldF92b2wuc3RyZWFtX2lkID09IDApIHsKLQkJCXByX2RlYnVnKCJzc3Q6IGludmFsaWQgb3BlcmF0aW9uIVxuIik7CisJCQlwcl9kZWJ1ZygiaW52YWxpZCBvcGVyYXRpb24hXG4iKTsKIAkJCXJldHZhbCA9IC1FUEVSTTsKIAkJCWJyZWFrOwogCQl9CkBAIC05NDEsNyArMTA5Nyw3IEBACiAJCQlyZXR2YWwgPSAtRUlPOwogCQkJYnJlYWs7CiAJCX0KLQkJcHJfZGVidWcoInNzdDogaWQ6JWRcbiwgdm9sOiVkLCByYW1wX2R1cjolZCwgcmFtcF90eXBlOiVkXG4iLAorCQlwcl9kZWJ1ZygiaWQ6JWRcbiwgdm9sOiVkLCByYW1wX2R1cjolZCwgcmFtcF90eXBlOiVkXG4iLAogCQkJCWdldF92b2wuc3RyZWFtX2lkLCBnZXRfdm9sLnZvbHVtZSwKIAkJCQlnZXRfdm9sLnJhbXBfZHVyYXRpb24sIGdldF92b2wucmFtcF90eXBlKTsKIAkJaWYgKGNvcHlfdG9fdXNlcigoc3RydWN0IHNuZF9zc3Rfdm9sIF9fdXNlciAqKWFyZywKQEAgLTk2MSw3ICsxMTE3LDcgQEAKIAkJCXJldHZhbCA9IC1FRkFVTFQ7CiAJCQlicmVhazsKIAkJfQotCQlwcl9kZWJ1Zygic3N0OiBTTkRSVl9TU1RfU0VUX1ZPTFVNRSByZWNpZXZlZCBmb3IgJWQhXG4iLAorCQlwcl9kZWJ1ZygiU05EUlZfU1NUX1NFVF9WT0xVTUUgcmVjaWV2ZWQgZm9yICVkIVxuIiwKIAkJCXNldF9tdXRlLnN0cmVhbV9pZCk7CiAJCWlmIChtaW5vciA9PSBTVFJFQU1fTU9EVUxFICYmIHNldF9tdXRlLnN0cmVhbV9pZCA9PSAwKSB7CiAJCQlyZXR2YWwgPSAtRVBFUk07CkBAIC05NzMsNyArMTEyOSw3IEBACiAJY2FzZSBfSU9DX05SKFNORFJWX1NTVF9TVFJFQU1fR0VUX1BBUkFNUyk6IHsKIAkJc3RydWN0IHNuZF9zc3RfZ2V0X3N0cmVhbV9wYXJhbXMgZ2V0X3BhcmFtczsKIAotCQlwcl9kZWJ1Zygic3N0OiBJT0NUTF9HRVRfUEFSQU1TIHJlY2lldmVkIVxuIik7CisJCXByX2RlYnVnKCJJT0NUTF9HRVRfUEFSQU1TIHJlY2VpdmVkIVxuIik7CiAJCWlmIChtaW5vciAhPSAwKSB7CiAJCQlyZXR2YWwgPSAtRUJBRFJRQzsKIAkJCWJyZWFrOwpAQCAtOTk3LDcgKzExNTMsNyBAQAogCWNhc2UgX0lPQ19OUihTTkRSVl9TU1RfTU1BUF9DQVBUVVJFKTogewogCQlzdHJ1Y3Qgc25kX3NzdF9tbWFwX2J1ZmZzIG1tYXBfYnVmOwogCi0JCXByX2RlYnVnKCJzc3Q6IFNORFJWX1NTVF9NTUFQX1BMQVkvQ0FQVFVSRSByZWNpZXZlZCFcbiIpOworCQlwcl9kZWJ1ZygiU05EUlZfU1NUX01NQVBfUExBWS9DQVBUVVJFIHJlY2lldmVkIVxuIik7CiAJCWlmIChtaW5vciAhPSBTVFJFQU1fTU9EVUxFKSB7CiAJCQlyZXR2YWwgPSAtRUJBRFJRQzsKIAkJCWJyZWFrOwpAQCAtMTAxMSw3ICsxMTY3LDcgQEAKIAkJYnJlYWs7CiAJfQogCWNhc2UgX0lPQ19OUihTTkRSVl9TU1RfU1RSRUFNX0RST1ApOgotCQlwcl9kZWJ1Zygic3N0OiBTTkRSVl9TU1RfSU9DVExfRFJPUCByZWNpZXZlZCFcbiIpOworCQlwcl9kZWJ1ZygiU05EUlZfU1NUX0lPQ1RMX0RST1AgcmVjZWl2ZWQhXG4iKTsKIAkJaWYgKG1pbm9yICE9IFNUUkVBTV9NT0RVTEUpIHsKIAkJCXJldHZhbCA9IC1FSU5WQUw7CiAJCQlicmVhazsKQEAgLTEwMjMsNyArMTE3OSw3IEBACiAJCXN0cnVjdCBzbmRfc3N0X3RzdGFtcCB0c3RhbXAgPSB7MH07CiAJCXVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lLCBmcmVxLCBtb2Q7CiAKLQkJcHJfZGVidWcoInNzdDogU05EUlZfU1NUX1NUUkVBTV9HRVRfVFNUQU1QIHJlY2lldmVkIVxuIik7CisJCXByX2RlYnVnKCJTTkRSVl9TU1RfU1RSRUFNX0dFVF9UU1RBTVAgcmVjZWl2ZWQhXG4iKTsKIAkJaWYgKG1pbm9yICE9IFNUUkVBTV9NT0RVTEUpIHsKIAkJCXJldHZhbCA9IC1FQkFEUlFDOwogCQkJYnJlYWs7CkBAIC0xMDQ0LDcgKzEyMDAsNyBAQAogCWNhc2UgX0lPQ19OUihTTkRSVl9TU1RfU1RSRUFNX1NUQVJUKTp7CiAJCXN0cnVjdCBzdHJlYW1faW5mbyAqc3RyZWFtOwogCi0JCXByX2RlYnVnKCJzc3Q6IFNORFJWX1NTVF9TVFJFQU1fU1RBUlQgcmVjaWV2ZWQhXG4iKTsKKwkJcHJfZGVidWcoIlNORFJWX1NTVF9TVFJFQU1fU1RBUlQgcmVjZWl2ZWQhXG4iKTsKIAkJaWYgKG1pbm9yICE9IFNUUkVBTV9NT0RVTEUpIHsKIAkJCXJldHZhbCA9IC1FSU5WQUw7CiAJCQlicmVhazsKQEAgLTEwODMsNyArMTIzOSw3IEBACiAJY2FzZSBfSU9DX05SKFNORFJWX1NTVF9TRVRfVEFSR0VUX0RFVklDRSk6IHsKIAkJc3RydWN0IHNuZF9zc3RfdGFyZ2V0X2RldmljZSB0YXJnZXRfZGV2aWNlOwogCi0JCXByX2RlYnVnKCJzc3Q6IFNFVF9UQVJHRVRfREVWSUNFIHJlY2lldmVkIVxuIik7CisJCXByX2RlYnVnKCJTRVRfVEFSR0VUX0RFVklDRSByZWNpZXZlZCFcbiIpOwogCQlpZiAoY29weV9mcm9tX3VzZXIoJnRhcmdldF9kZXZpY2UsICh2b2lkIF9fdXNlciAqKWFyZywKIAkJCQlzaXplb2YodGFyZ2V0X2RldmljZSkpKSB7CiAJCQlyZXR2YWwgPSAtRUZBVUxUOwpAQCAtMTEwMCw3ICsxMjU2LDcgQEAKIAljYXNlIF9JT0NfTlIoU05EUlZfU1NUX0RSSVZFUl9JTkZPKTogewogCQlzdHJ1Y3Qgc25kX3NzdF9kcml2ZXJfaW5mbyBpbmZvOwogCi0JCXByX2RlYnVnKCJzc3Q6IFNORFJWX1NTVF9EUklWRVJfSU5GTyByZWNpdmVkXG4iKTsKKwkJcHJfZGVidWcoIlNORFJWX1NTVF9EUklWRVJfSU5GTyByZWNpdmVkXG4iKTsKIAkJaW5mby52ZXJzaW9uID0gU1NUX1ZFUlNJT05fTlVNOwogCQkvKiBoYXJkIGNvZGluZywgc2h1ZCBnZXQgc3VtaG93IGxhdGVyICovCiAJCWluZm8uYWN0aXZlX3BjbV9zdHJlYW1zID0gc3N0X2Rydl9jdHgtPnN0cmVhbV9jbnQgLQpAQCAtMTEyMiw3ICsxMjc4LDcgQEAKIAkJc3RydWN0IHNuZF9zc3RfYnVmZl9lbnRyeSAqaWJ1Zl90bXAsICpvYnVmX3RtcDsKIAkJY2hhciBfX3VzZXIgKmRlc3Q7CiAKLQkJcHJfZGVidWcoInNzdDogU05EUlZfU1NUX1NUUkVBTV9ERUNPREUgcmVjaXZlZFxuIik7CisJCXByX2RlYnVnKCJTTkRSVl9TU1RfU1RSRUFNX0RFQ09ERSByZWNlaXZlZFxuIik7CiAJCWlmIChtaW5vciAhPSBTVFJFQU1fTU9EVUxFKSB7CiAJCQlyZXR2YWwgPSAtRUJBRFJRQzsKIAkJCWJyZWFrOwpAQCAtMTE5Nyw3ICsxMzUzLDcgQEAKIAl9CiAKIAljYXNlIF9JT0NfTlIoU05EUlZfU1NUX1NUUkVBTV9EUkFJTik6Ci0JCXByX2RlYnVnKCJzc3Q6IFNORFJWX1NTVF9TVFJFQU1fRFJBSU4gcmVjaXZlZFxuIik7CisJCXByX2RlYnVnKCJTTkRSVl9TU1RfU1RSRUFNX0RSQUlOIHJlY2VpdmVkXG4iKTsKIAkJaWYgKG1pbm9yICE9IFNUUkVBTV9NT0RVTEUpIHsKIAkJCXJldHZhbCA9IC1FSU5WQUw7CiAJCQlicmVhazsKQEAgLTEyMDksNyArMTM2NSw3IEBACiAJCXVuc2lnbmVkIGxvbmcgbG9uZyBfX3VzZXIgKmJ5dGVzID0gKHVuc2lnbmVkIGxvbmcgbG9uZyBfX3VzZXIgKilhcmc7CiAJCXN0cnVjdCBzbmRfc3N0X3RzdGFtcCB0c3RhbXAgPSB7MH07CiAKLQkJcHJfZGVidWcoInNzdDogU1RSRUFNX0JZVEVTX0RFQ09ERUQgcmVjaWV2ZWQhXG4iKTsKKwkJcHJfZGVidWcoIlNUUkVBTV9CWVRFU19ERUNPREVEIHJlY2VpdmVkIVxuIik7CiAJCWlmIChtaW5vciAhPSBTVFJFQU1fTU9EVUxFKSB7CiAJCQlyZXR2YWwgPSAtRUlOVkFMOwogCQkJYnJlYWs7CkBAIC0xMjI1LDcgKzEzODEsNyBAQAogCWNhc2UgX0lPQ19OUihTTkRSVl9TU1RfRldfSU5GTyk6IHsKIAkJc3RydWN0IHNuZF9zc3RfZndfaW5mbyAqZndfaW5mbzsKIAotCQlwcl9kZWJ1Zygic3N0OiBTTkRSVl9TU1RfRldfSU5GTyByZWNpdmVkXG4iKTsKKwkJcHJfZGVidWcoIlNORFJWX1NTVF9GV19JTkZPIHJlY2VpdmVkXG4iKTsKIAogCQlmd19pbmZvID0ga3phbGxvYyhzaXplb2YoKmZ3X2luZm8pLCBHRlBfQVRPTUlDKTsKIAkJaWYgKCFmd19pbmZvKSB7CkBAIC0xMjQ4LDEwICsxNDA0LDE4IEBACiAJCWtmcmVlKGZ3X2luZm8pOwogCQlicmVhazsKIAl9CisJY2FzZSBfSU9DX05SKFNORFJWX1NTVF9HRVRfQUxHTyk6CisJY2FzZSBfSU9DX05SKFNORFJWX1NTVF9TRVRfQUxHTyk6CisJCWlmIChtaW5vciAhPSBBTV9NT0RVTEUpIHsKKwkJCXJldHZhbCA9IC1FQkFEUlFDOworCQkJYnJlYWs7CisJCX0KKwkJcmV0dmFsID0gaW50ZWxfc3N0X2lvY3RsX2RzcChjbWQsIGFyZyk7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHZhbCA9IC1FSU5WQUw7CiAJfQotCXByX2RlYnVnKCJzc3Q6IGludGVsX3NzdF9pb2N0bDpjb21wbGV0ZSByZXQgY29kZSA9ICVkXG4iLCByZXR2YWwpOworCXByX2RlYnVnKCJpbnRlbF9zc3RfaW9jdGw6Y29tcGxldGUgcmV0IGNvZGUgPSAlZFxuIiwgcmV0dmFsKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9jb21tb24uaCBiL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0X2NvbW1vbi5oCmluZGV4IGJmMGVhZDcuLjBhNjBlODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0X2NvbW1vbi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0X2NvbW1vbi5oCkBAIC0yOCwxNSArMjgsMTUgQEAKICAqICBDb21tb24gcHJpdmF0ZSBkZWNsYXJhdGlvbnMgZm9yIFNTVAogICovCiAKLSNkZWZpbmUgU1NUX0RSSVZFUl9WRVJTSU9OICIxLjIuMDUiCi0jZGVmaW5lIFNTVF9WRVJTSU9OX05VTSAweDEyMDUKKyNkZWZpbmUgU1NUX0RSSVZFUl9WRVJTSU9OICIxLjIuMDkiCisjZGVmaW5lIFNTVF9WRVJTSU9OX05VTSAweDEyMDkKIAogLyogZHJpdmVyIG5hbWVzICovCiAjZGVmaW5lIFNTVF9EUlZfTkFNRSAiaW50ZWxfc3N0X2RyaXZlciIKLSNkZWZpbmUgU1NUX0ZXX0ZJTEVOQU1FX01SU1QgImZ3X3NzdF8wODBhLmJpbiIKLSNkZWZpbmUgU1NUX0ZXX0ZJTEVOQU1FX01GTEQgImZ3X3NzdF8wODJmLmJpbiIKICNkZWZpbmUgU1NUX01SU1RfUENJX0lEIDB4MDgwQQogI2RlZmluZSBTU1RfTUZMRF9QQ0lfSUQgMHgwODJGCisjZGVmaW5lIFBDSV9JRF9MRU5HVEggNAorI2RlZmluZSBTU1RfU1VTUEVORF9ERUxBWSAyMDAwCiAKIGVudW0gc3N0X3N0YXRlcyB7CiAJU1NUX0ZXX0xPQURFRCA9IDEsCkBAIC0zOTIsNyArMzkyLDcgQEAKIAogCXN0cnVjdCBzdHJlYW1faW5mbwlzdHJlYW1zW01BWF9OVU1fU1RSRUFNU107CiAJc3RydWN0IHN0cmVhbV9hbGxvY19ibG9jayBhbGxvY19ibG9ja1tNQVhfQUNUSVZFX1NUUkVBTV07Ci0Jc3RydWN0IHNzdF9ibG9jawl0Z3RfZGV2X2JsaywgZndfaW5mb19ibGssCisJc3RydWN0IHNzdF9ibG9jawl0Z3RfZGV2X2JsaywgZndfaW5mb19ibGssIHBwcF9wYXJhbXNfYmxrLAogCQkJCXZvbF9pbmZvX2JsaywgbXV0ZV9pbmZvX2JsaywgaHNfaW5mb19ibGs7CiAJc3RydWN0IG11dGV4CQlsaXN0X2xvY2s7LyogbXV0ZXggZm9yIElQQyBsaXN0IGxvY2tpbmcgKi8KIAlzcGlubG9ja190CWxpc3Rfc3Bpbl9sb2NrOyAvKiBtdXRleCBmb3IgSVBDIGxpc3QgbG9ja2luZyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3RfZHJ2X2ludGVyZmFjZS5jIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3RfZHJ2X2ludGVyZmFjZS5jCmluZGV4IDY2OWUyOTguLmVhOGUyNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0X2Rydl9pbnRlcmZhY2UuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9kcnZfaW50ZXJmYWNlLmMKQEAgLTI2LDEwICsyNiwxMyBAQAogICogIFVwcGVyIGxheWVyIGludGVyZmFjZXMgKE1BRCBkcml2ZXIsIE1NRikgdG8gU1NUIGRyaXZlcgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KICNpbmNsdWRlICJpbnRlbF9zc3QuaCIKICNpbmNsdWRlICJpbnRlbF9zc3RfaW9jdGwuaCIKICNpbmNsdWRlICJpbnRlbF9zc3RfZndfaXBjLmgiCkBAIC00NSwxNyArNDgsMTggQEAKIHsKIAlpbnQgcmV0dmFsOwogCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZndfc3N0OwotCWNvbnN0IGNoYXIgKm5hbWU7CisJY2hhciBuYW1lWzIwXTsKKwogCWlmIChzc3RfZHJ2X2N0eC0+c3N0X3N0YXRlICE9IFNTVF9VTl9JTklUKQogCQlyZXR1cm4gLUVQRVJNOwotCWlmIChzc3RfZHJ2X2N0eC0+cGNpX2lkID09IFNTVF9NUlNUX1BDSV9JRCkKLQkJbmFtZSA9IFNTVF9GV19GSUxFTkFNRV9NUlNUOwotCWVsc2UKLQkJbmFtZSA9IFNTVF9GV19GSUxFTkFNRV9NRkxEOwotCXByX2RlYnVnKCJzc3Q6IERvd25sb2FkaW5nICVzIEZXIG5vdy4uLlxuIiwgbmFtZSk7CisKKwlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlcyUwNHglcyIsICJmd19zc3RfIiwKKwkJCQkJc3N0X2Rydl9jdHgtPnBjaV9pZCwgIi5iaW4iKTsKKworCXByX2RlYnVnKCJEb3dubG9hZGluZyAlcyBGVyBub3cuLi5cbiIsIG5hbWUpOwogCXJldHZhbCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3X3NzdCwgbmFtZSwgJnNzdF9kcnZfY3R4LT5wY2ktPmRldik7CiAJaWYgKHJldHZhbCkgewotCQlwcl9lcnIoInNzdDogcmVxdWVzdCBmdyBmYWlsZWQgJWRcbiIsIHJldHZhbCk7CisJCXByX2VycigicmVxdWVzdCBmdyBmYWlsZWQgJWRcbiIsIHJldHZhbCk7CiAJCXJldHVybiByZXR2YWw7CiAJfQogCXNzdF9kcnZfY3R4LT5hbGxvY19ibG9ja1swXS5zc3RfaWQgPSBGV19EV05MX0lEOwpAQCAtNjYsNyArNzAsNyBAQAogCiAJcmV0dmFsID0gc3N0X3dhaXRfdGltZW91dChzc3RfZHJ2X2N0eCwgJnNzdF9kcnZfY3R4LT5hbGxvY19ibG9ja1swXSk7CiAJaWYgKHJldHZhbCkKLQkJcHJfZXJyKCJzc3Q6IGZ3IGRvd25sb2FkIGZhaWxlZCAlZFxuIiAsIHJldHZhbCk7CisJCXByX2VycigiZncgZG93bmxvYWQgZmFpbGVkICVkXG4iICwgcmV0dmFsKTsKIGVuZF9yZXN0b3JlOgogCXJlbGVhc2VfZmlybXdhcmUoZndfc3N0KTsKIAlzc3RfZHJ2X2N0eC0+YWxsb2NfYmxvY2tbMF0uc3N0X2lkID0gQkxPQ0tfVU5JTklUOwpAQCAtOTAsNyArOTQsNyBAQAogCiAJCXJldHJ5LS07CiAJfQotCXByX2RlYnVnKCJzc3Q6IGluIFN0YWxsZWQgU3RhdGVcbiIpOworCXByX2RlYnVnKCJpbiBTdGFsbGVkIFN0YXRlXG4iKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC0xMzgsMjMgKzE0MiwyMyBAQAogCXJldHZhbCA9IHNzdF9hbGxvY19zdHJlYW0oKGNoYXIgKikgJnN0cl9wYXJhbS0+c3BhcmFtcywgc3RyX3BhcmFtLT5vcHMsCiAJCQkJc3RyX3BhcmFtLT5jb2RlYywgc3RyX3BhcmFtLT5kZXZpY2VfdHlwZSk7CiAJaWYgKHJldHZhbCA8IDApIHsKLQkJcHJfZXJyKCJzc3Q6IHNzdF9hbGxvY19zdHJlYW0gZmFpbGVkICVkXG4iLCByZXR2YWwpOworCQlwcl9lcnIoInNzdF9hbGxvY19zdHJlYW0gZmFpbGVkICVkXG4iLCByZXR2YWwpOwogCQlyZXR1cm4gcmV0dmFsOwogCX0KLQlwcl9kZWJ1Zygic3N0OiBTdHJlYW0gYWxsb2NhdGVkICVkXG4iLCByZXR2YWwpOworCXByX2RlYnVnKCJTdHJlYW0gYWxsb2NhdGVkICVkXG4iLCByZXR2YWwpOwogCXN0cl9pZCA9IHJldHZhbDsKIAlzdHJfaW5mbyA9ICZzc3RfZHJ2X2N0eC0+c3RyZWFtc1tzdHJfaWRdOwogCS8qIEJsb2NrIHRoZSBjYWxsIGZvciByZXBseSAqLwogCXJldHZhbCA9IHNzdF93YWl0X2ludGVycnVwdGlibGVfdGltZW91dChzc3RfZHJ2X2N0eCwKIAkJCSZzdHJfaW5mby0+Y3RybF9ibGssIFNTVF9CTE9DS19USU1FT1VUKTsKIAlpZiAoKHJldHZhbCAhPSAwKSB8fCAoc3RyX2luZm8tPmN0cmxfYmxrLnJldF9jb2RlICE9IDApKSB7Ci0JCXByX2RlYnVnKCJzc3Q6IEZXIGFsbG9jIGZhaWxlZCByZXR2YWwgJWQsIHJldF9jb2RlICVkXG4iLAorCQlwcl9kZWJ1ZygiRlcgYWxsb2MgZmFpbGVkIHJldHZhbCAlZCwgcmV0X2NvZGUgJWRcbiIsCiAJCQkJcmV0dmFsLCBzdHJfaW5mby0+Y3RybF9ibGsucmV0X2NvZGUpOwogCQlzdHJfaWQgPSAtc3RyX2luZm8tPmN0cmxfYmxrLnJldF9jb2RlOyAvKnJldHVybiBlcnJvciovCiAJCSpsaWJfZG5sZCA9IHN0cl9pbmZvLT5jdHJsX2Jsay5kYXRhOwogCQlzc3RfY2xlYW5fc3RyZWFtKHN0cl9pbmZvKTsKIAl9IGVsc2UKLQkJcHJfZGVidWcoInNzdDogRlcgU3RyZWFtIGFsbG9jYXRlZCBzdWNlc3NcbiIpOworCQlwcl9kZWJ1ZygiRlcgU3RyZWFtIGFsbG9jYXRlZCBzdWNjZXNzXG4iKTsKIAlyZXR1cm4gc3RyX2lkOyAvKndpbGwgcmV0IGVpdGhlciBlcnJvciAoaW4gYWJvdmUgaWYpIG9yIGNvcnJlY3Qgc3RyIGlkKi8KIH0KIApAQCAtMTcxLDkgKzE3NSw5IEBACiAJY2FzZSBTU1RfQ09ERUNfVFlQRV9NUDM6CiAJCXJldHVybiBzdHJfcGFyYW0tPnNwYXJhbXMudWMubXAzX3BhcmFtcy5zZnJlcTsKIAljYXNlIFNTVF9DT0RFQ19UWVBFX0FBQzoKLQkJcmV0dXJuIHN0cl9wYXJhbS0+c3BhcmFtcy51Yy5hYWNfcGFyYW1zLnNmcmVxOzsKKwkJcmV0dXJuIHN0cl9wYXJhbS0+c3BhcmFtcy51Yy5hYWNfcGFyYW1zLnNmcmVxOwogCWNhc2UgU1NUX0NPREVDX1RZUEVfV01BOToKLQkJcmV0dXJuIHN0cl9wYXJhbS0+c3BhcmFtcy51Yy53bWFfcGFyYW1zLnNmcmVxOzsKKwkJcmV0dXJuIHN0cl9wYXJhbS0+c3BhcmFtcy51Yy53bWFfcGFyYW1zLnNmcmVxOwogCWRlZmF1bHQ6CiAJCXJldHVybiAwOwogCX0KQEAgLTE5NiwxNCArMjAwLDE0IEBACiAJCS8qIGNvZGVjIGRvd25sb2FkIGlzIHJlcXVpcmVkICovCiAJCXN0cnVjdCBzbmRfc3N0X2FsbG9jX3Jlc3BvbnNlICpyZXNwb25zZTsKIAotCQlwcl9kZWJ1Zygic3N0OiBDb2RlYyBpcyByZXF1aXJlZC4uLi4gdHJ5aW5nIHRoYXRcbiIpOworCQlwcl9kZWJ1ZygiQ29kZWMgaXMgcmVxdWlyZWQuLi4uIHRyeWluZyB0aGF0XG4iKTsKIAkJaWYgKGxpYl9kbmxkID09IE5VTEwpIHsKLQkJCXByX2Vycigic3N0OiBsaWIgZG93bmxvYWQgbnVsbCEhISBhYm9ydFxuIik7CisJCQlwcl9lcnIoImxpYiBkb3dubG9hZCBudWxsISEhIGFib3J0XG4iKTsKIAkJCXJldHVybiAtRUlPOwogCQl9CiAJCWkgPSBzc3RfZ2V0X2Jsb2NrX3N0cmVhbShzc3RfZHJ2X2N0eCk7CiAJCXJlc3BvbnNlID0gc3N0X2Rydl9jdHgtPmFsbG9jX2Jsb2NrW2ldLm9wc19ibG9jay5kYXRhOwotCQlwcl9kZWJ1Zygic3N0OiBhbGxvYyBibG9jayBhbGxvY2F0ZWQgPSAlZFxuIiwgaSk7CisJCXByX2RlYnVnKCJhbGxvYyBibG9jayBhbGxvY2F0ZWQgPSAlZFxuIiwgaSk7CiAJCWlmIChpIDwgMCkgewogCQkJa2ZyZWUobGliX2RubGQpOwogCQkJcmV0dXJuIC1FTk9NRU07CkBAIC0yMTMsMTUgKzIxNywxNSBAQAogCiAJCXNzdF9kcnZfY3R4LT5hbGxvY19ibG9ja1tpXS5zc3RfaWQgPSBCTE9DS19VTklOSVQ7CiAJCWlmICghcmV0dmFsKSB7Ci0JCQlwcl9kZWJ1Zygic3N0OiBjb2RlYyB3YXMgZG93bmxvYWRlZCBzdWNlc2Z1bGx5XG4iKTsKKwkJCXByX2RlYnVnKCJjb2RlYyB3YXMgZG93bmxvYWRlZCBzdWNjZXNzZnVsbHlcbiIpOwogCiAJCQlyZXR2YWwgPSBzc3RfZ2V0X3N0cmVhbV9hbGxvY2F0ZWQoc3RyX3BhcmFtLCAmbGliX2RubGQpOwogCQkJaWYgKHJldHZhbCA8PSAwKQogCQkJCWdvdG8gZXJyOwogCi0JCQlwcl9kZWJ1Zygic3N0OiBBbGxvYyBkb25lIHN0cmVhbSBpZCAlZFxuIiwgcmV0dmFsKTsKKwkJCXByX2RlYnVnKCJBbGxvYyBkb25lIHN0cmVhbSBpZCAlZFxuIiwgcmV0dmFsKTsKIAkJfSBlbHNlIHsKLQkJCXByX2RlYnVnKCJzc3Q6IGNvZGVjIGRvd25sb2FkIGZhaWxlZFxuIik7CisJCQlwcl9kZWJ1ZygiY29kZWMgZG93bmxvYWQgZmFpbGVkXG4iKTsKIAkJCXJldHZhbCA9IC1FSU87CiAJCQlnb3RvIGVycjsKIAkJfQpAQCAtMjc5LDk3ICsyODMsMTM4IEBACiAJCXJldHZhbCA9IHNzdF9zdGFydF9zdHJlYW0obWFkX29wcy0+c3RyZWFtX2lkKTsKIAkJYnJlYWs7CiAJY2FzZSBTU1RfU05EX1NUUkVBTV9QUk9DRVNTOgotCQlwcl9kZWJ1Zygic3N0OiBwbGF5L2NhcHQgZnJhbWVzLi4uXG4iKTsKKwkJcHJfZGVidWcoInBsYXkvY2FwdCBmcmFtZXMuLi5cbiIpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcl9lcnIoInNzdDogIHdyb25nIGNvbnRyb2xfb3BzIHJlcG9ydGVkXG4iKTsKKwkJcHJfZXJyKCIgd3JvbmcgY29udHJvbF9vcHMgcmVwb3J0ZWRcbiIpOwogCX0KIAlyZXR1cm47CiB9Ci0vKgotICogc3N0X2NvbnRyb2xfc2V0IC0gU2V0IENvbnRyb2wgcGFyYW1zCi0gKgotICogQGNvbnRyb2xfbGlzdDogbGlzdCBvZiBjb250cm9scyB0byBiZSBzZXQKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBNSUQgc291bmQgY2FyZCBkcml2ZXIgdG8gc2V0Ci0gKiBTU1QvU291bmQgY2FyZCBjb250cm9scy4gVGhpcyBpcyByZWdpc3RlcmVkIHdpdGggTUlEIGRyaXZlcgotICovCi1pbnQgc3N0X2NvbnRyb2xfc2V0KGludCBjb250cm9sX2VsZW1lbnQsIHZvaWQgKnZhbHVlKQorCit2b2lkIHNlbmRfaW50aWFsX3J4X3RpbWVzbG90KHZvaWQpCiB7Ci0JaW50IHJldHZhbCA9IDAsIHN0cl9pZCA9IDA7Ci0Jc3RydWN0IHN0cmVhbV9pbmZvICpzdHJlYW07CisJaWYgKHNzdF9kcnZfY3R4LT5wY2lfaWQgPT0gU1NUX01SU1RfUENJX0lEICYmCisJCQlzc3RfZHJ2X2N0eC0+cnhfdGltZV9zbG90X3N0YXR1cyAhPSBSWF9USU1FU0xPVF9VTklOSVQKKwkJCSYmIHNzdF9kcnZfY3R4LT5wbWljX3ZlbmRvciAhPSBTTkRfTkMpCisJCXNzdF9lbmFibGVfcnhfdGltZXNsb3Qoc3N0X2Rydl9jdHgtPnJ4X3RpbWVfc2xvdF9zdGF0dXMpOworfQorCisvKgorICogc3N0X29wZW5fcGNtX3N0cmVhbSAtIE9wZW4gUENNIGludGVyZmFjZQorICoKKyAqIEBzdHJfcGFyYW06IHBhcmFtZXRlcnMgb2YgcGNtIHN0cmVhbQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IE1JRCBzb3VuZCBjYXJkIGRyaXZlciB0byBvcGVuCisgKiBhIG5ldyBwY20gaW50ZXJmYWNlCisgKi8KK2ludCBzc3Rfb3Blbl9wY21fc3RyZWFtKHN0cnVjdCBzbmRfc3N0X3BhcmFtcyAqc3RyX3BhcmFtKQoreworCXN0cnVjdCBzdHJlYW1faW5mbyAqc3RyX2luZm87CisJaW50IHJldHZhbDsKKworCXBtX3J1bnRpbWVfZ2V0X3N5bmMoJnNzdF9kcnZfY3R4LT5wY2ktPmRldik7CiAKIAlpZiAoc3N0X2Rydl9jdHgtPnNzdF9zdGF0ZSA9PSBTU1RfU1VTUEVOREVEKSB7Ci0JCS8qTFBFIGlzIHN1c3BlbmRlZCwgcmVzdW1lIGl0IGJlZm9yZSBwcm9jZWRpbmcqLwotCQlwcl9kZWJ1Zygic3N0OiBSZXN1bWluZyBmcm9tIFN1c3BlbmRlZCBzdGF0ZVxuIik7CisJCS8qIExQRSBpcyBzdXNwZW5kZWQsIHJlc3VtZSBpdCBiZWZvcmUgcHJvY2VkaW5nKi8KKwkJcHJfZGVidWcoIlJlc3VtaW5nIGZyb20gU3VzcGVuZGVkIHN0YXRlXG4iKTsKIAkJcmV0dmFsID0gaW50ZWxfc3N0X3Jlc3VtZShzc3RfZHJ2X2N0eC0+cGNpKTsKIAkJaWYgKHJldHZhbCkgewotCQkJcHJfZXJyKCJzc3Q6IFJlc3VtZSBGYWlsZWQgPSAlI3gsIGFib3J0XG4iLCByZXR2YWwpOworCQkJcHJfZXJyKCJSZXN1bWUgRmFpbGVkID0gJSN4LCBhYm9ydFxuIiwgcmV0dmFsKTsKKwkJCXBtX3J1bnRpbWVfcHV0KCZzc3RfZHJ2X2N0eC0+cGNpLT5kZXYpOwogCQkJcmV0dXJuIHJldHZhbDsKIAkJfQogCX0KIAlpZiAoc3N0X2Rydl9jdHgtPnNzdF9zdGF0ZSA9PSBTU1RfVU5fSU5JVCkgewogCQkvKiBGVyBpcyBub3QgZG93bmxvYWRlZCAqLwotCQlwcl9kZWJ1Zygic3N0OiBEU1AgRG93bmxvYWRpbmcgRlcgbm93Li4uXG4iKTsKKwkJcHJfZGVidWcoIkRTUCBEb3dubG9hZGluZyBGVyBub3cuLi5cbiIpOwogCQlyZXR2YWwgPSBzc3RfZG93bmxvYWRfZncoKTsKIAkJaWYgKHJldHZhbCkgewotCQkJcHJfZXJyKCJzc3Q6IEZXIGRvd25sb2FkIGZhaWwgJXgsIGFib3J0XG4iLCByZXR2YWwpOworCQkJcHJfZXJyKCJGVyBkb3dubG9hZCBmYWlsICV4LCBhYm9ydFxuIiwgcmV0dmFsKTsKKwkJCXBtX3J1bnRpbWVfcHV0KCZzc3RfZHJ2X2N0eC0+cGNpLT5kZXYpOwogCQkJcmV0dXJuIHJldHZhbDsKIAkJfQotCQlpZiAoc3N0X2Rydl9jdHgtPnBjaV9pZCA9PSBTU1RfTVJTVF9QQ0lfSUQgJiYKLQkJCXNzdF9kcnZfY3R4LT5yeF90aW1lX3Nsb3Rfc3RhdHVzICE9IFJYX1RJTUVTTE9UX1VOSU5JVAotCQkJCSYmIHNzdF9kcnZfY3R4LT5wbWljX3ZlbmRvciAhPSBTTkRfTkMpCi0JCQlzc3RfZW5hYmxlX3J4X3RpbWVzbG90KAotCQkJCQlzc3RfZHJ2X2N0eC0+cnhfdGltZV9zbG90X3N0YXR1cyk7CisJCXNlbmRfaW50aWFsX3J4X3RpbWVzbG90KCk7CiAJfQogCi0Jc3dpdGNoIChjb250cm9sX2VsZW1lbnQpIHsKLQljYXNlIFNTVF9TTkRfQUxMT0M6IHsKLQkJc3RydWN0IHNuZF9zc3RfcGFyYW1zICpzdHJfcGFyYW07Ci0JCXN0cnVjdCBzdHJlYW1faW5mbyAqc3RyX2luZm87CisJaWYgKCFzdHJfcGFyYW0pIHsKKwkJcG1fcnVudGltZV9wdXQoJnNzdF9kcnZfY3R4LT5wY2ktPmRldik7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAotCQlzdHJfcGFyYW0gPSAoc3RydWN0IHNuZF9zc3RfcGFyYW1zICopdmFsdWU7Ci0JCUJVR19PTighc3RyX3BhcmFtKTsKLQkJcmV0dmFsID0gc3N0X2dldF9zdHJlYW0oc3RyX3BhcmFtKTsKLQkJaWYgKHJldHZhbCA+PSAwKQotCQkJc3N0X2Rydl9jdHgtPnN0cmVhbV9jbnQrKzsKKwlyZXR2YWwgPSBzc3RfZ2V0X3N0cmVhbShzdHJfcGFyYW0pOworCWlmIChyZXR2YWwgPiAwKSB7CisJCXNzdF9kcnZfY3R4LT5zdHJlYW1fY250Kys7CiAJCXN0cl9pbmZvID0gJnNzdF9kcnZfY3R4LT5zdHJlYW1zW3JldHZhbF07CiAJCXN0cl9pbmZvLT5zcmMgPSBNQURfRFJWOwotCQlicmVhazsKLQl9CisJfSBlbHNlCisJCXBtX3J1bnRpbWVfcHV0KCZzc3RfZHJ2X2N0eC0+cGNpLT5kZXYpOwogCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIHNzdF9jbG9zZV9wY21fc3RyZWFtIC0gQ2xvc2UgUENNIGludGVyZmFjZQorICoKKyAqIEBzdHJfaWQ6IHN0cmVhbSBpZCB0byBiZSBjbG9zZWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBNSUQgc291bmQgY2FyZCBkcml2ZXIgdG8gY2xvc2UKKyAqIGFuIGV4aXN0aW5nIHBjbSBpbnRlcmZhY2UKKyAqLworaW50IHNzdF9jbG9zZV9wY21fc3RyZWFtKHVuc2lnbmVkIGludCBzdHJfaWQpCit7CisJc3RydWN0IHN0cmVhbV9pbmZvICpzdHJlYW07CisKKwlwcl9kZWJ1Zygic3N0OiBzdHJlYW0gZnJlZSBjYWxsZWRcbiIpOworCWlmIChzc3RfdmFsaWRhdGVfc3RyaWQoc3RyX2lkKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJc3RyZWFtID0gJnNzdF9kcnZfY3R4LT5zdHJlYW1zW3N0cl9pZF07CisJZnJlZV9zdHJlYW1fY29udGV4dChzdHJfaWQpOworCXN0cmVhbS0+cGNtX3N1YnN0cmVhbSA9IE5VTEw7CisJc3RyZWFtLT5zdGF0dXMgPSBTVFJFQU1fVU5fSU5JVDsKKwlzdHJlYW0tPnBlcmlvZF9lbGFwc2VkID0gTlVMTDsKKwlzc3RfZHJ2X2N0eC0+c3RyZWFtX2NudC0tOworCXByX2RlYnVnKCJzc3Q6IHdpbGwgY2FsbCBydW50aW1lIHB1dCBub3dcbiIpOworCXBtX3J1bnRpbWVfcHV0KCZzc3RfZHJ2X2N0eC0+cGNpLT5kZXYpOworCXJldHVybiAwOworfQorCisvKgorICogc3N0X2RldmljZV9jb250cm9sIC0gU2V0IENvbnRyb2wgcGFyYW1zCisgKgorICogQGNtZDogY29udHJvbCBjbWQgdG8gYmUgc2V0CisgKiBAYXJnOiBjb21tYW5kIGFyZ3VtZW50CisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgTUlEIHNvdW5kIGNhcmQgZHJpdmVyIHRvIHNldAorICogU1NUL1NvdW5kIGNhcmQgY29udHJvbHMgZm9yIGFuIG9wZW5lZCBzdHJlYW0uCisgKiBUaGlzIGlzIHJlZ2lzdGVyZWQgd2l0aCBNSUQgZHJpdmVyCisgKi8KK2ludCBzc3RfZGV2aWNlX2NvbnRyb2woaW50IGNtZCwgdm9pZCAqYXJnKQoreworCWludCByZXR2YWwgPSAwLCBzdHJfaWQgPSAwOworCisJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNTVF9TTkRfUEFVU0U6CiAJY2FzZSBTU1RfU05EX1JFU1VNRToKIAljYXNlIFNTVF9TTkRfRFJPUDoKIAljYXNlIFNTVF9TTkRfU1RBUlQ6Ci0JCXNzdF9kcnZfY3R4LT5tYWRfb3BzLmNvbnRyb2xfb3AgPSBjb250cm9sX2VsZW1lbnQ7Ci0JCXNzdF9kcnZfY3R4LT5tYWRfb3BzLnN0cmVhbV9pZCA9ICooaW50ICopdmFsdWU7CisJCXNzdF9kcnZfY3R4LT5tYWRfb3BzLmNvbnRyb2xfb3AgPSBjbWQ7CisJCXNzdF9kcnZfY3R4LT5tYWRfb3BzLnN0cmVhbV9pZCA9ICooaW50ICopYXJnOwogCQlxdWV1ZV93b3JrKHNzdF9kcnZfY3R4LT5tYWRfd3EsICZzc3RfZHJ2X2N0eC0+bWFkX29wcy53cSk7CiAJCWJyZWFrOwogCi0JY2FzZSBTU1RfU05EX0ZSRUU6Ci0JCXN0cl9pZCA9ICooaW50ICopdmFsdWU7Ci0JCXN0cmVhbSA9ICZzc3RfZHJ2X2N0eC0+c3RyZWFtc1tzdHJfaWRdOwotCQlmcmVlX3N0cmVhbV9jb250ZXh0KHN0cl9pZCk7Ci0JCXN0cmVhbS0+cGNtX3N1YnN0cmVhbSA9IE5VTEw7Ci0JCXN0cmVhbS0+c3RhdHVzID0gU1RSRUFNX1VOX0lOSVQ7Ci0JCXN0cmVhbS0+cGVyaW9kX2VsYXBzZWQgPSBOVUxMOwotCQlzc3RfZHJ2X2N0eC0+c3RyZWFtX2NudC0tOwotCQlicmVhazsKLQogCWNhc2UgU1NUX1NORF9TVFJFQU1fSU5JVDogewogCQlzdHJ1Y3QgcGNtX3N0cmVhbV9pbmZvICpzdHJfaW5mbzsKIAkJc3RydWN0IHN0cmVhbV9pbmZvICpzdHJlYW07CiAKLQkJcHJfZGVidWcoInNzdDogc3RyZWFtIGluaXQgY2FsbGVkXG4iKTsKLQkJc3RyX2luZm8gPSAoc3RydWN0IHBjbV9zdHJlYW1faW5mbyAqKXZhbHVlOworCQlwcl9kZWJ1Zygic3RyZWFtIGluaXQgY2FsbGVkXG4iKTsKKwkJc3RyX2luZm8gPSAoc3RydWN0IHBjbV9zdHJlYW1faW5mbyAqKWFyZzsKIAkJc3RyX2lkID0gc3RyX2luZm8tPnN0cl9pZDsKIAkJcmV0dmFsID0gc3N0X3ZhbGlkYXRlX3N0cmlkKHN0cl9pZCk7CiAJCWlmIChyZXR2YWwpCiAJCQlicmVhazsKIAogCQlzdHJlYW0gPSAmc3N0X2Rydl9jdHgtPnN0cmVhbXNbc3RyX2lkXTsKLQkJcHJfZGVidWcoInNzdDogc2V0dGluZyB0aGUgcGVyaW9kIHB0cnNcbiIpOworCQlwcl9kZWJ1Zygic2V0dGluZyB0aGUgcGVyaW9kIHB0cnNcbiIpOwogCQlzdHJlYW0tPnBjbV9zdWJzdHJlYW0gPSBzdHJfaW5mby0+bWFkX3N1YnN0cmVhbTsKIAkJc3RyZWFtLT5wZXJpb2RfZWxhcHNlZCA9IHN0cl9pbmZvLT5wZXJpb2RfZWxhcHNlZDsKIAkJc3RyZWFtLT5zZnJlcSA9IHN0cl9pbmZvLT5zZnJlcTsKQEAgLTM4NCw3ICs0MjksNyBAQAogCQlzdHJ1Y3Qgc3RyZWFtX2luZm8gKnN0cmVhbTsKIAogCi0JCXN0cmVhbV9pbmZvID0gKHN0cnVjdCBwY21fc3RyZWFtX2luZm8gKil2YWx1ZTsKKwkJc3RyZWFtX2luZm8gPSAoc3RydWN0IHBjbV9zdHJlYW1faW5mbyAqKWFyZzsKIAkJc3RyX2lkID0gc3RyZWFtX2luZm8tPnN0cl9pZDsKIAkJcmV0dmFsID0gc3N0X3ZhbGlkYXRlX3N0cmlkKHN0cl9pZCk7CiAJCWlmIChyZXR2YWwpCkBAIC0zOTgsMjYgKzQ0MywyNiBAQAogCQkJKyhzdHJfaWQgKiBzaXplb2YoZndfdHN0YW1wKSkpLAogCQkJc2l6ZW9mKGZ3X3RzdGFtcCkpOwogCi0JCXByX2RlYnVnKCJzc3Q6IFBvaW50ZXIgUXVlcnkgb24gc3RyaWQgPSAlZCBvcHMgJWRcbiIsCisJCXByX2RlYnVnKCJQb2ludGVyIFF1ZXJ5IG9uIHN0cmlkID0gJWQgb3BzICVkXG4iLAogCQkJCQkJc3RyX2lkLCBzdHJlYW0tPm9wcyk7CiAKIAkJaWYgKHN0cmVhbS0+b3BzID09IFNUUkVBTV9PUFNfUExBWUJBQ0spCiAJCQlzdHJlYW1faW5mby0+YnVmZmVyX3B0ciA9IGZ3X3RzdGFtcC5zYW1wbGVzX3JlbmRlcmVkOwogCQllbHNlCiAJCQlzdHJlYW1faW5mby0+YnVmZmVyX3B0ciA9IGZ3X3RzdGFtcC5zYW1wbGVzX3Byb2Nlc3NlZDsKLQkJcHJfZGVidWcoInNzdDogU2FtcGxlcyByZW5kZXJlZCA9ICVsbHUsIGJ1ZmZlciBwdHIgJWxsdVxuIiwKKwkJcHJfZGVidWcoIlNhbXBsZXMgcmVuZGVyZWQgPSAlbGx1LCBidWZmZXIgcHRyICVsbHVcbiIsCiAJCQlmd190c3RhbXAuc2FtcGxlc19yZW5kZXJlZCwgc3RyZWFtX2luZm8tPmJ1ZmZlcl9wdHIpOwogCQlicmVhazsKIAl9CiAJY2FzZSBTU1RfRU5BQkxFX1JYX1RJTUVfU0xPVDogewotCQlpbnQgc3RhdHVzID0gKihpbnQgKil2YWx1ZTsKKwkJaW50IHN0YXR1cyA9ICooaW50ICopYXJnOwogCQlzc3RfZHJ2X2N0eC0+cnhfdGltZV9zbG90X3N0YXR1cyA9IHN0YXR1cyA7CiAJCXNzdF9lbmFibGVfcnhfdGltZXNsb3Qoc3RhdHVzKTsKIAkJYnJlYWs7CiAJfQogCWRlZmF1bHQ6CiAJCS8qIElsbGVnYWwgY2FzZSAqLwotCQlwcl93YXJuKCJzc3Q6IGlsbGVnYWwgcmVxXG4iKTsKKwkJcHJfd2FybigiaWxsZWdhbCByZXFcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTQyNSw4ICs0NzAsMTQgQEAKIH0KIAogCitzdHJ1Y3QgaW50ZWxfc3N0X3BjbV9jb250cm9sIHBjbV9vcHMgPSB7CisJLm9wZW4gPSBzc3Rfb3Blbl9wY21fc3RyZWFtLAorCS5kZXZpY2VfY29udHJvbCA9IHNzdF9kZXZpY2VfY29udHJvbCwKKwkuY2xvc2UgPSBzc3RfY2xvc2VfcGNtX3N0cmVhbSwKK307CisKIHN0cnVjdCBpbnRlbF9zc3RfY2FyZF9vcHMgc3N0X3BtaWNfb3BzID0gewotCS5jb250cm9sX3NldCA9IHNzdF9jb250cm9sX3NldCwKKwkucGNtX2NvbnRyb2wgPSAmcGNtX29wcywKIH07CiAKIC8qCkBAIC00MzksMTIgKzQ5MCwxMiBAQAogaW50IHJlZ2lzdGVyX3NzdF9jYXJkKHN0cnVjdCBpbnRlbF9zc3RfY2FyZF9vcHMgKmNhcmQpCiB7CiAJaWYgKCFzc3RfZHJ2X2N0eCkgewotCQlwcl9lcnIoInNzdDogTm8gU1NUIGRyaXZlciByZWdpc3RlciBjYXJkIHJlamVjdFxuIik7CisJCXByX2VycigiTm8gU1NUIGRyaXZlciByZWdpc3RlciBjYXJkIHJlamVjdFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCWlmICghY2FyZCB8fCAhY2FyZC0+bW9kdWxlX25hbWUpIHsKLQkJcHJfZXJyKCJzc3Q6IE51bGwgUG9pbnRlciBQYXNzZWRcbiIpOworCQlwcl9lcnIoIk51bGwgUG9pbnRlciBQYXNzZWRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJaWYgKHNzdF9kcnZfY3R4LT5wbWljX3N0YXRlID09IFNORF9NQURfVU5fSU5JVCkgewpAQCAtNDU2LDE3ICs1MDcsMTcgQEAKIAkJCXNzdF9wbWljX29wcy5tb2R1bGVfbmFtZSA9IGNhcmQtPm1vZHVsZV9uYW1lOwogCQkJc3N0X2Rydl9jdHgtPnBtaWNfc3RhdGUgPSBTTkRfTUFEX0lOSVRfRE9ORTsKIAkJCXNzdF9kcnZfY3R4LT5yeF90aW1lX3Nsb3Rfc3RhdHVzID0gMDsgLypkZWZhdWx0IEFNSUMqLwotCQkJY2FyZC0+Y29udHJvbF9zZXQgPSBzc3RfcG1pY19vcHMuY29udHJvbF9zZXQ7CisJCQljYXJkLT5wY21fY29udHJvbCA9IHNzdF9wbWljX29wcy5wY21fY29udHJvbDsKIAkJCXNzdF9kcnZfY3R4LT5zY2FyZF9vcHMtPmNhcmRfc3RhdHVzID0gU05EX0NBUkRfVU5fSU5JVDsKIAkJCXJldHVybiAwOwogCQl9IGVsc2UgewotCQkJcHJfZXJyKCJzc3Q6IHN0cmNtcCBmYWlsICVzXG4iLCBjYXJkLT5tb2R1bGVfbmFtZSk7CisJCQlwcl9lcnIoInN0cmNtcCBmYWlsICVzXG4iLCBjYXJkLT5tb2R1bGVfbmFtZSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCiAJfSBlbHNlIHsKIAkJLyogYWxyZWFkeSByZWdpc3RlcmVkIGEgZHJpdmVyICovCi0JCXByX2Vycigic3N0OiBSZXBlYXQgZm9yIHJlZ2lzdGVyYXRpb24uLmRlbmllZFxuIik7CisJCXByX2VycigiUmVwZWF0IGZvciByZWdpc3RyYXRpb24uLmRlbmllZFxuIik7CiAJCXJldHVybiAtRUJBRFJRQzsKIAl9CiAJcmV0dXJuIDA7CkBAIC00ODIsMTEgKzUzMywxMSBAQAogICovCiB2b2lkIHVucmVnaXN0ZXJfc3N0X2NhcmQoc3RydWN0IGludGVsX3NzdF9jYXJkX29wcyAqY2FyZCkKIHsKLQlpZiAoc3N0X3BtaWNfb3BzLmNvbnRyb2xfc2V0ID09IGNhcmQtPmNvbnRyb2xfc2V0KSB7CisJaWYgKHNzdF9wbWljX29wcy5wY21fY29udHJvbCA9PSBjYXJkLT5wY21fY29udHJvbCkgewogCQkvKiB1bnJlZyAqLwogCQlzc3RfcG1pY19vcHMubW9kdWxlX25hbWUgPSAiIjsKIAkJc3N0X2Rydl9jdHgtPnBtaWNfc3RhdGUgPSBTTkRfTUFEX1VOX0lOSVQ7Ci0JCXByX2RlYnVnKCJzc3Q6IFVucmVnaXN0ZXJlZCAlc1xuIiwgY2FyZC0+bW9kdWxlX25hbWUpOworCQlwcl9kZWJ1ZygiVW5yZWdpc3RlcmVkICVzXG4iLCBjYXJkLT5tb2R1bGVfbmFtZSk7CiAJfQogCXJldHVybjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0X2RzcC5jIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3RfZHNwLmMKaW5kZXggZDgwYTZlZTIuLjZlNWM5MTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0X2RzcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0X2RzcC5jCkBAIC0yOSw2ICsyOSw5IEBACiAgKiAgVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCBkc3AgY29udHJvbGxpbmcgZnVuY3Rpb25zIGxpa2UgZmlybXdhcmUgZG93bmxvYWQsCiAgKiBzZXR0aW5nL3Jlc2V0dGluZyBkc3AgY29yZXMsIGV0YwogICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KQEAgLTQ3LDggKzUwLDkgQEAKIHsKIAl1bmlvbiBjb25maWdfc3RhdHVzX3JlZyBjc3I7CiAKLQlwcl9kZWJ1Zygic3N0OiBSZXNldHRpbmcgdGhlIERTUCBpbiBtcnN0XG4iKTsKLQljc3IuZnVsbCA9IDB4M2EyOworCXByX2RlYnVnKCJSZXNldHRpbmcgdGhlIERTUCBpbiBtcnN0XG4iKTsKKwljc3IuZnVsbCA9IHNzdF9zaGltX3JlYWQoc3N0X2Rydl9jdHgtPnNoaW0sIFNTVF9DU1IpOworCWNzci5mdWxsIHw9IDB4MzgyOwogCXNzdF9zaGltX3dyaXRlKHNzdF9kcnZfY3R4LT5zaGltLCBTU1RfQ1NSLCBjc3IuZnVsbCk7CiAJY3NyLmZ1bGwgPSBzc3Rfc2hpbV9yZWFkKHNzdF9kcnZfY3R4LT5zaGltLCBTU1RfQ1NSKTsKIAljc3IucGFydC5zdHJiX2NudHJfcnN0ID0gMDsKQEAgLTY4LDcgKzcyLDcgQEAKIHsKIAl1bmlvbiBjb25maWdfc3RhdHVzX3JlZyBjc3I7CiAKLQlwcl9kZWJ1Zygic3N0OiBSZXNldHRpbmcgdGhlIERTUCBpbiBtZWRmaWVsZFxuIik7CisJcHJfZGVidWcoIlJlc2V0dGluZyB0aGUgRFNQIGluIG1lZGZpZWxkXG4iKTsKIAljc3IuZnVsbCA9IDB4MDQ4MzAzRTI7CiAJc3N0X3NoaW1fd3JpdGUoc3N0X2Rydl9jdHgtPnNoaW0sIFNTVF9DU1IsIGNzci5mdWxsKTsKIApAQCAtOTAsNyArOTQsNyBAQAogCWNzci5wYXJ0LnJ1bl9zdGFsbCA9IDA7CiAJY3NyLnBhcnQuc3N0X3Jlc2V0ID0gMDsKIAljc3IucGFydC5zdHJiX2NudHJfcnN0ID0gMTsKLQlwcl9kZWJ1Zygic3N0OiBTZXR0aW5nIFNTVCB0byBleGVjdXRlX21yc3QgMHgleFxuIiwgY3NyLmZ1bGwpOworCXByX2RlYnVnKCJTZXR0aW5nIFNTVCB0byBleGVjdXRlX21yc3QgMHgleFxuIiwgY3NyLmZ1bGwpOwogCXNzdF9zaGltX3dyaXRlKHNzdF9kcnZfY3R4LT5zaGltLCBTU1RfQ1NSLCBjc3IuZnVsbCk7CiAKIAlyZXR1cm4gMDsKQEAgLTExMSw3ICsxMTUsNyBAQAogCXNzdF9zaGltX3dyaXRlKHNzdF9kcnZfY3R4LT5zaGltLCBTU1RfQ1NSLCBjc3IuZnVsbCk7CiAJY3NyLmZ1bGwgPSAweDA0ODMwMDYxOwogCXNzdF9zaGltX3dyaXRlKHNzdF9kcnZfY3R4LT5zaGltLCBTU1RfQ1NSLCBjc3IuZnVsbCk7Ci0JcHJfZGVidWcoInNzdDogU3RhcnRpbmcgdGhlIERTUF9tZWRmbGRcbiIpOworCXByX2RlYnVnKCJTdGFydGluZyB0aGUgRFNQX21lZGZsZFxuIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEzMCwxNiArMTM0LDE2IEBACiAJdTMyIGNvdW50OwogCXZvaWQgX19pb21lbSAqcmFtOwogCi0JcHJfZGVidWcoInNzdDogbW9kdWxlIHNpZ24gJXMgc2l6ZSAleCBibG9ja3MgJXggdHlwZSAleFxuIiwKKwlwcl9kZWJ1ZygibW9kdWxlIHNpZ24gJXMgc2l6ZSAleCBibG9ja3MgJXggdHlwZSAleFxuIiwKIAkJCW1vZHVsZS0+c2lnbmF0dXJlLCBtb2R1bGUtPm1vZF9zaXplLAogCQkJbW9kdWxlLT5ibG9ja3MsIG1vZHVsZS0+dHlwZSk7Ci0JcHJfZGVidWcoInNzdDogbW9kdWxlIGVudHJ5cG9pbnQgMHgleFxuIiwgbW9kdWxlLT5lbnRyeV9wb2ludCk7CisJcHJfZGVidWcoIm1vZHVsZSBlbnRyeXBvaW50IDB4JXhcbiIsIG1vZHVsZS0+ZW50cnlfcG9pbnQpOwogCiAJYmxvY2sgPSAodm9pZCAqKW1vZHVsZSArIHNpemVvZigqbW9kdWxlKTsKIAogCWZvciAoY291bnQgPSAwOyBjb3VudCA8IG1vZHVsZS0+YmxvY2tzOyBjb3VudCsrKSB7CiAJCWlmIChibG9jay0+c2l6ZSA8PSAwKSB7Ci0JCQlwcl9lcnIoInNzdDogYmxvY2sgc2l6ZSBpbnZhbGlkXG4iKTsKKwkJCXByX2VycigiYmxvY2sgc2l6ZSBpbnZhbGlkXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCXN3aXRjaCAoYmxvY2stPnR5cGUpIHsKQEAgLTE1MCw3ICsxNTQsNyBAQAogCQkJcmFtID0gc3N0X2Rydl9jdHgtPmRyYW07CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXByX2Vycigic3N0OiB3cm9uZyByYW0gdHlwZTB4JXggaW4gYmxvY2sweCV4XG4iLAorCQkJcHJfZXJyKCJ3cm9uZyByYW0gdHlwZTB4JXggaW4gYmxvY2sweCV4XG4iLAogCQkJCQlibG9jay0+dHlwZSwgY291bnQpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTE4NCwxMCArMTg4LDEwIEBACiAJaWYgKChzdHJuY21wKGhlYWRlci0+c2lnbmF0dXJlLCBTU1RfRldfU0lHTiwgNCkgIT0gMCkgfHwKIAkJCShzc3RfZnctPnNpemUgIT0gaGVhZGVyLT5maWxlX3NpemUgKyBzaXplb2YoKmhlYWRlcikpKSB7CiAJCS8qIEludmFsaWQgRlcgc2lnbmF0dXJlICovCi0JCXByX2Vycigic3N0OiBJbnZhbGlkRlcgc2lnbi9maWxlc2l6ZSBtaXNtYXRjaFxuIik7CisJCXByX2VycigiSW52YWxpZCBGVyBzaWduL2ZpbGVzaXplIG1pc21hdGNoXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCXByX2RlYnVnKCJzc3Q6IGhlYWRlciBzaWduPSVzIHNpemU9JXggbW9kdWxlcz0leCBmbXQ9JXggc2l6ZT0leFxuIiwKKwlwcl9kZWJ1ZygiaGVhZGVyIHNpZ249JXMgc2l6ZT0leCBtb2R1bGVzPSV4IGZtdD0leCBzaXplPSV4XG4iLAogCQkJaGVhZGVyLT5zaWduYXR1cmUsIGhlYWRlci0+ZmlsZV9zaXplLCBoZWFkZXItPm1vZHVsZXMsCiAJCQloZWFkZXItPmZpbGVfZm9ybWF0LCBzaXplb2YoKmhlYWRlcikpOwogCW1vZHVsZSA9ICh2b2lkICopc3N0X2Z3LT5kYXRhICsgc2l6ZW9mKCpoZWFkZXIpOwpAQCAtMjE0LDcgKzIxOCw3IEBACiB7CiAJaW50IHJldF92YWw7CiAKLQlwcl9kZWJ1Zygic3N0OiBsb2FkX2Z3IGNhbGxlZFxuIik7CisJcHJfZGVidWcoImxvYWRfZncgY2FsbGVkXG4iKTsKIAlCVUdfT04oIWZ3KTsKIAogCWlmIChzc3RfZHJ2X2N0eC0+cGNpX2lkID09IFNTVF9NUlNUX1BDSV9JRCkKQEAgLTIzOSw3ICsyNDMsNyBAQAogCWlmIChyZXRfdmFsKQogCQlyZXR1cm4gcmV0X3ZhbDsKIAotCXByX2RlYnVnKCJzc3Q6IGZ3IGxvYWRlZCBzdWNjZXNzZnVsISEhXG4iKTsKKwlwcl9kZWJ1ZygiZncgbG9hZGVkIHN1Y2Nlc3NmdWwhISFcbiIpOwogCXJldHVybiByZXRfdmFsOwogfQogCkBAIC0yNjEsNyArMjY1LDcgQEAKIAogCXB2dF9pZCA9IHNzdF9hc3NpZ25fcHZ0X2lkKHNzdF9kcnZfY3R4KTsKIAlpID0gc3N0X2dldF9ibG9ja19zdHJlYW0oc3N0X2Rydl9jdHgpOwotCXByX2RlYnVnKCJzc3Q6IGFsbG9jIGJsb2NrIGFsbG9jYXRlZCA9ICVkLCBwdnRfaWQgJWRcbiIsIGksIHB2dF9pZCk7CisJcHJfZGVidWcoImFsbG9jIGJsb2NrIGFsbG9jYXRlZCA9ICVkLCBwdnRfaWQgJWRcbiIsIGksIHB2dF9pZCk7CiAJaWYgKGkgPCAwKSB7CiAJCWtmcmVlKG1zZyk7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMjgxLDExICsyODUsMTEgQEAKIAlpZiAocmV0dmFsKSB7CiAJCS8qIGVycm9yICovCiAJCXNzdF9kcnZfY3R4LT5hbGxvY19ibG9ja1tpXS5zc3RfaWQgPSBCTE9DS19VTklOSVQ7Ci0JCXByX2Vycigic3N0OiBQcmVwIGNvZGVjIGRvd25sb2FkZWQgZmFpbGVkICVkXG4iLAorCQlwcl9lcnIoIlByZXAgY29kZWMgZG93bmxvYWRlZCBmYWlsZWQgJWRcbiIsCiAJCQkJcmV0dmFsKTsKIAkJcmV0dXJuIC1FSU87CiAJfQotCXByX2RlYnVnKCJzc3Q6IEZXIHJlc3BvbmRlZCwgcmVhZHkgZm9yIGRvd25sb2FkIG5vdy4uLlxuIik7CisJcHJfZGVidWcoIkZXIHJlc3BvbmRlZCwgcmVhZHkgZm9yIGRvd25sb2FkIG5vdy4uLlxuIik7CiAJLyogZG93bmxvYWRpbmcgb24gc3VjY2VzcyAqLwogCW11dGV4X2xvY2soJnNzdF9kcnZfY3R4LT5zc3RfbG9jayk7CiAJc3N0X2Rydl9jdHgtPnNzdF9zdGF0ZSA9IFNTVF9GV19MT0FERUQ7CkBAIC0zMjUsNyArMzI5LDcgQEAKIAlsaXN0X2FkZF90YWlsKCZtc2ctPm5vZGUsICZzc3RfZHJ2X2N0eC0+aXBjX2Rpc3BhdGNoX2xpc3QpOwogCXNwaW5fdW5sb2NrKCZzc3RfZHJ2X2N0eC0+bGlzdF9zcGluX2xvY2spOwogCXNzdF9wb3N0X21lc3NhZ2UoJnNzdF9kcnZfY3R4LT5pcGNfcG9zdF9tc2dfd3EpOwotCXByX2RlYnVnKCJzc3Q6IFdhaXRpbmcgZm9yIEZXIHJlc3BvbnNlIERvd25sb2FkIGNvbXBsZXRlXG4iKTsKKwlwcl9kZWJ1ZygiV2FpdGluZyBmb3IgRlcgcmVzcG9uc2UgRG93bmxvYWQgY29tcGxldGVcbiIpOwogCXNzdF9kcnZfY3R4LT5hbGxvY19ibG9ja1tpXS5vcHNfYmxvY2suY29uZGl0aW9uID0gZmFsc2U7CiAJcmV0dmFsID0gc3N0X3dhaXRfdGltZW91dChzc3RfZHJ2X2N0eCwgJnNzdF9kcnZfY3R4LT5hbGxvY19ibG9ja1tpXSk7CiAJaWYgKHJldHZhbCkgewpAQCAtMzM3LDcgKzM0MSw3IEBACiAJCXJldHVybiAtRUlPOwogCX0KIAotCXByX2RlYnVnKCJzc3Q6IEZXIHN1Y2VzcyBvbiBEb3dubG9hZCBjb21wbGV0ZVxuIik7CisJcHJfZGVidWcoIkZXIHN1Y2Nlc3Mgb24gRG93bmxvYWQgY29tcGxldGVcbiIpOwogCXNzdF9kcnZfY3R4LT5hbGxvY19ibG9ja1tpXS5zc3RfaWQgPSBCTE9DS19VTklOSVQ7CiAJbXV0ZXhfbG9jaygmc3N0X2Rydl9jdHgtPnNzdF9sb2NrKTsKIAlzc3RfZHJ2X2N0eC0+c3N0X3N0YXRlID0gU1NUX0ZXX1JVTk5JTkc7CkBAIC0zNjAsMTQgKzM2NCwxNCBAQAogCiAJaGVhZGVyID0gKHN0cnVjdCBmd19oZWFkZXIgKilmd19saWItPmRhdGE7CiAJaWYgKGhlYWRlci0+bW9kdWxlcyAhPSAxKSB7Ci0JCXByX2Vycigic3N0OiBNb2R1bGUgbm8gbWlzbWF0Y2ggZm91bmRcbiAiKTsKKwkJcHJfZXJyKCJNb2R1bGUgbm8gbWlzbWF0Y2ggZm91bmRcbiIpOwogCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIGV4aXQ7CiAJfQogCW1vZHVsZSA9ICh2b2lkICopZndfbGliLT5kYXRhICsgc2l6ZW9mKCpoZWFkZXIpOwogCSplbnRyeV9wb2ludCA9IG1vZHVsZS0+ZW50cnlfcG9pbnQ7Ci0JcHJfZGVidWcoInNzdDogTW9kdWxlIGVudHJ5IHBvaW50IDB4JXhcbiIsICplbnRyeV9wb2ludCk7Ci0JcHJfZGVidWcoInNzdDogTW9kdWxlIFNpZ24gJXMsIFNpemUgMHgleCwgQmxvY2tzIDB4JXggVHlwZSAweCV4XG4iLAorCXByX2RlYnVnKCJNb2R1bGUgZW50cnkgcG9pbnQgMHgleFxuIiwgKmVudHJ5X3BvaW50KTsKKwlwcl9kZWJ1ZygiTW9kdWxlIFNpZ24gJXMsIFNpemUgMHgleCwgQmxvY2tzIDB4JXggVHlwZSAweCV4XG4iLAogCQkJbW9kdWxlLT5zaWduYXR1cmUsIG1vZHVsZS0+bW9kX3NpemUsCiAJCQltb2R1bGUtPmJsb2NrcywgbW9kdWxlLT50eXBlKTsKIApAQCAtMzgxLDIwICszODUsMjAgQEAKIAkJCWRzaXplICs9IGJsb2NrLT5zaXplOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlwcl9lcnIoInNzdDogSW52YWxpZCBibG9jayB0eXBlIGZvciAweCV4XG4iLCBuX2Jsayk7CisJCQlwcl9lcnIoIkludmFsaWQgYmxvY2sgdHlwZSBmb3IgMHgleFxuIiwgbl9ibGspOwogCQkJZXJyID0gLUVJTlZBTDsKIAkJCWdvdG8gZXhpdDsKIAkJfQogCQlibG9jayA9ICh2b2lkICopYmxvY2sgKyBzaXplb2YoKmJsb2NrKSArIGJsb2NrLT5zaXplOwogCX0KIAlpZiAoaXNpemUgPiBzbG90LT5pcmFtX3NpemUgfHwgZHNpemUgPiBzbG90LT5kcmFtX3NpemUpIHsKLQkJcHJfZXJyKCJzc3Q6IGxpYnJhcnkgZXhjZWVkcyBzaXplIGFsbG9jYXRlZFxuIik7CisJCXByX2VycigibGlicmFyeSBleGNlZWRzIHNpemUgYWxsb2NhdGVkXG4iKTsKIAkJZXJyID0gLUVJTlZBTDsKIAkJZ290byBleGl0OwogCX0gZWxzZQotCQlwcl9kZWJ1Zygic3N0OiBMaWJyYXJ5IGlzIHNhZmUgZm9yIGRvd25sb2FkLi4uXG4iKTsKKwkJcHJfZGVidWcoIkxpYnJhcnkgaXMgc2FmZSBmb3IgZG93bmxvYWQuLi5cbiIpOwogCi0JcHJfZGVidWcoInNzdDogaXJhbSAweCV4LCBkcmFtIDB4JXgsIGlyYW0gMHgleCwgZHJhbSAweCV4XG4iLAorCXByX2RlYnVnKCJpcmFtIDB4JXgsIGRyYW0gMHgleCwgaXJhbSAweCV4LCBkcmFtIDB4JXhcbiIsCiAJCQlpc2l6ZSwgZHNpemUsIHNsb3QtPmlyYW1fc2l6ZSwgc2xvdC0+ZHJhbV9zaXplKTsKIGV4aXQ6CiAJcmV0dXJuIGVycjsKQEAgLTQxNCwxNSArNDE4LDE1IEBACiAKIAltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CiAKLQlwcl9kZWJ1Zygic3N0OiBMaWIgVHlwZSAweCV4LCBTbG90IDB4JXgsIG9wcyAweCV4XG4iLAorCXByX2RlYnVnKCJMaWIgVHlwZSAweCV4LCBTbG90IDB4JXgsIG9wcyAweCV4XG4iLAogCQkJbGliLT5saWJfaW5mby5saWJfdHlwZSwgbGliLT5zbG90X2luZm8uc2xvdF9udW0sIG9wcyk7Ci0JcHJfZGVidWcoInNzdDogVmVyc2lvbiAweCV4LCBuYW1lICVzLCBjYXBzIDB4JXggbWVkaWEgdHlwZSAweCV4XG4iLAorCXByX2RlYnVnKCJWZXJzaW9uIDB4JXgsIG5hbWUgJXMsIGNhcHMgMHgleCBtZWRpYSB0eXBlIDB4JXhcbiIsCiAJCWxpYi0+bGliX2luZm8ubGliX3ZlcnNpb24sIGxpYi0+bGliX2luZm8ubGliX25hbWUsCiAJCWxpYi0+bGliX2luZm8ubGliX2NhcHMsIGxpYi0+bGliX2luZm8ubWVkaWFfdHlwZSk7CiAKLQlwcl9kZWJ1Zygic3N0OiBJUkFNIFNpemUgMHgleCwgb2Zmc2V0IDB4JXhcbiIsCisJcHJfZGVidWcoIklSQU0gU2l6ZSAweCV4LCBvZmZzZXQgMHgleFxuIiwKIAkJbGliLT5zbG90X2luZm8uaXJhbV9zaXplLCBsaWItPnNsb3RfaW5mby5pcmFtX29mZnNldCk7Ci0JcHJfZGVidWcoInNzdDogRFJBTSBTaXplIDB4JXgsIG9mZnNldCAweCV4XG4iLAorCXByX2RlYnVnKCJEUkFNIFNpemUgMHgleCwgb2Zmc2V0IDB4JXhcbiIsCiAJCWxpYi0+c2xvdF9pbmZvLmRyYW1fc2l6ZSwgbGliLT5zbG90X2luZm8uZHJhbV9vZmZzZXQpOwogCiAJc3dpdGNoIChsaWItPmxpYl9pbmZvLmxpYl90eXBlKSB7CkBAIC00NDIsNyArNDQ2LDcgQEAKIAkJdHlwZSA9ICJ3bWE5XyI7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByX2Vycigic3N0OiBJbnZhbGlkIGNvZGVjIHR5cGVcbiIpOworCQlwcl9lcnIoIkludmFsaWQgY29kZWMgdHlwZVxuIik7CiAJCWVycm9yID0gLUVJTlZBTDsKIAkJZ290byB3YWtlOwogCX0KQEAgLTQ1OCwxMSArNDYyLDExIEBACiAJCQlsaWItPnNsb3RfaW5mby5zbG90X251bSk7CiAJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZW9mKGJ1ZikgLSBsZW4sICIuYmluIik7CiAKLQlwcl9kZWJ1Zygic3N0OiBSZXF1ZXN0aW5nICVzXG4iLCBidWYpOworCXByX2RlYnVnKCJSZXF1ZXN0aW5nICVzXG4iLCBidWYpOwogCiAJZXJyb3IgPSByZXF1ZXN0X2Zpcm13YXJlKCZmd19saWIsIGJ1ZiwgJnNzdF9kcnZfY3R4LT5wY2ktPmRldik7CiAJaWYgKGVycm9yKSB7Ci0JCXByX2Vycigic3N0OiBsaWJyYXJ5IGxvYWQgZmFpbGVkICVkXG4iLCBlcnJvcik7CisJCXByX2VycigibGlicmFyeSBsb2FkIGZhaWxlZCAlZFxuIiwgZXJyb3IpOwogCQlnb3RvIHdha2U7CiAJfQogCWVycm9yID0gc3N0X3ZhbGlkYXRlX2xpYnJhcnkoZndfbGliLCAmbGliLT5zbG90X2luZm8sICZlbnRyeV9wb2ludCk7CkBAIC00NzYsNyArNDgwLDcgQEAKIAkJZ290byB3YWtlX2ZyZWU7CiAKIAkvKiBsaWIgaXMgZG93bmxvYWRlZCBhbmQgaW5pdCBzZW5kIGFsbG9jIGFnYWluICovCi0JcHJfZGVidWcoInNzdDogTGlicmFyeSBpcyBkb3dubG9hZGVkIG5vdy4uLlxuIik7CisJcHJfZGVidWcoIkxpYnJhcnkgaXMgZG93bmxvYWRlZCBub3cuLi5cbiIpOwogd2FrZV9mcmVlOgogCS8qIHNzdF93YWtlX3VwX2FsbG9jX2Jsb2NrKHNzdF9kcnZfY3R4LCBwdnRfaWQsIGVycm9yLCBOVUxMKTsgKi8KIAlyZWxlYXNlX2Zpcm13YXJlKGZ3X2xpYik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9md19pcGMuaCBiL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0X2Z3X2lwYy5oCmluZGV4IDlkM2MzNjguLjhkZjMxM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0X2Z3X2lwYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0X2Z3X2lwYy5oCkBAIC0zMSw2ICszMSw3IEBACiAqLwogCiAjZGVmaW5lIE1BWF9OVU1fU1RSRUFNU19NUlNUIDMKKyNkZWZpbmUgTUFYX05VTV9TVFJFQU1TX01GTEQgNgogI2RlZmluZSBNQVhfTlVNX1NUUkVBTVMgNgogI2RlZmluZSBNQVhfREJHX1JXX0JZVEVTIDgwCiAjZGVmaW5lIE1BWF9OVU1fU0NBVFRFUl9CVUZGRVJTIDgKQEAgLTY3LDYgKzY4LDggQEAKICNkZWZpbmUgSVBDX0lBX0NBUFRfVk9JQ0UgMHgxNwogI2RlZmluZSBJUENfSUFfREVDT0RFX0ZSQU1FUyAweDE4CiAKKyNkZWZpbmUgSVBDX0lBX0FMR19QQVJBTVMgMHgxQQorCiAvKiBJMkwgU3RyZWFtIGNvbmZpZy9jb250cm9sIG1zZ3MgKi8KICNkZWZpbmUgSVBDX0lBX0FMTE9DX1NUUkVBTSAweDIwIC8qIEFsbG9jYXRlIGEgc3RyZWFtIElEICovCiAjZGVmaW5lIElQQ19JQV9GUkVFX1NUUkVBTSAweDIxIC8qIEZyZWUgdGhlIHN0cmVhbSBJRCAqLwpAQCAtMTQxLDczICsxNDQsODcgQEAKIAkvKiBFcnJvciBjb2RlLHJlc3BvbnNlIHRvIG1zZ0lkOiBEZXNjcmlwdGlvbiAqLwogCS8qIENvbW1vbiBlcnJvciBjb2RlcyAqLwogCVNTVF9TVUNDRVNTID0gMCwJLyogU3VjY2VzcyAqLwotCVNTVF9FUlJfSU5WQUxJRF9TVFJFQU1fSUQsIC8qIEludmFsaWQgc3RyZWFtIElEICovCi0JU1NUX0VSUl9JTlZBTElEX01TR19JRCwJLyogSW52YWxpZCBtZXNzYWdlIElEICovCi0JU1NUX0VSUl9JTlZBTElEX1NUUkVBTV9PUCwgLyogSW52YWxpZCBzdHJlYW0gb3BlcmF0aW9uIHJlcXVlc3QgKi8KLQlTU1RfRVJSX0lOVkFMSURfUEFSQU1TLAkvKiBJbnZhbGlkIHBhcmFtcyAqLwotCVNTVF9FUlJfSU5WQUxJRF9DT0RFQywJLyogSW52YWxpZCBjb2RlYyB0eXBlICovCi0JU1NUX0VSUl9JTlZBTElEX01FRElBX1RZUEUsIC8qIEludmFsaWQgbWVkaWEgdHlwZSAqLwotCVNTVF9FUlJfU1RSRUFNX0VSUiwgIC8qIEFOWTogU3RyZWFtIGNvbnRyb2wgb3IgY29uZmlnIG9yCi0JCQkJCXByb2Nlc3NpbmcgZXJyb3IgKi8KKwlTU1RfRVJSX0lOVkFMSURfU1RSRUFNX0lEID0gMSwKKwlTU1RfRVJSX0lOVkFMSURfTVNHX0lEID0gMiwKKwlTU1RfRVJSX0lOVkFMSURfU1RSRUFNX09QID0gMywKKwlTU1RfRVJSX0lOVkFMSURfUEFSQU1TID0gNCwKKwlTU1RfRVJSX0lOVkFMSURfQ09ERUMgPSA1LAorCVNTVF9FUlJfSU5WQUxJRF9NRURJQV9UWVBFID0gNiwKKwlTU1RfRVJSX1NUUkVBTV9FUlIgPSA3LAogCiAJLyogSVBDIHNwZWNpZmljIGVycm9yIGNvZGVzICovCi0JU1NUX0lQQ19FUlJfQ0FMTF9CQUNLX05PVF9SRUdELCAvKiBDYWxsIGJhY2sgZm9yIG1zZyBub3QgcmVnZCAqLwotCVNTVF9JUENfRVJSX1NUUkVBTV9OT1RfQUxMT0NBVEVELCAvKiBTdHJlYW0gaXMgbm90IGFsbG9jYXRlZCAgKi8KLQlTU1RfSVBDX0VSUl9TVFJFQU1fQUxMT0NfRkFJTEVELCAvKiBBTExPQzpTdHJlYW0gYWxsb2MgZmFpbGVkICovCi0JU1NUX0lQQ19FUlJfR0VUX1NUUkVBTV9GQUlMRUQsIC8qIEFMTE9DOkdldCBzdHJlYW0gaWQgZmFpbGVkKi8KLQlTU1RfRVJSX01PRF9OT1RfQVZBSUwsIC8qIFNFVC9HRVQ6IE1vZChBRUMvQUdDL0FMQykgbm90IGF2YWlsYWJsZSAqLwotCVNTVF9FUlJfTU9EX0ROTERfUlFELCAvKiBTRVQvR0VUOiBNb2QoQUVDL0FHQy9BTEMpIGRvd25sb2FkIHJlcXVpcmVkICovCi0JU1NUX0VSUl9TVFJFQU1fU1RPUFBFRCwJCS8qIEFOWTogU3RyZWFtIGlzIGluIHN0b3BwZWQgc3RhdGUgKi8KLQlTU1RfRVJSX1NUUkVBTV9JTl9VU0UsIC8qIEFOWTogU3RyZWFtIGlzIGFscmVhZHkgaW4gdXNlICovCisJU1NUX0lQQ19FUlJfQ0FMTF9CQUNLX05PVF9SRUdEID0gOCwKKwlTU1RfSVBDX0VSUl9TVFJFQU1fTk9UX0FMTE9DQVRFRCA9IDksCisJU1NUX0lQQ19FUlJfU1RSRUFNX0FMTE9DX0ZBSUxFRCA9IDEwLAorCVNTVF9JUENfRVJSX0dFVF9TVFJFQU1fRkFJTEVEID0gMTEsCisJU1NUX0VSUl9NT0RfTk9UX0FWQUlMID0gMTIsCisJU1NUX0VSUl9NT0RfRE5MRF9SUUQgPSAxMywKKwlTU1RfRVJSX1NUUkVBTV9TVE9QUEVEID0gMTQsCisJU1NUX0VSUl9TVFJFQU1fSU5fVVNFID0gMTUsCiAKIAkvKiBDYXB0dXJlIHNwZWNpZmljIGVycm9yIGNvZGVzICovCi0JU1NUX0NBUF9FUlJfSU5DTVBMVEVfQ0FQVFVSRV9NU0csLyogQU5ZOkluY29tcGxldGUgbWVzc2FnZSAqLwotCVNTVF9DQVBfRVJSX0NBUFRVUkVfRkFJTCwgLyogQU5ZOkNhcHR1cmUgb3AgZmFpbGVkICovCi0JU1NUX0NBUF9FUlJfR0VUX0REUl9ORVdfU0dMSVNULAotCVNTVF9DQVBfRVJSX1VOREVSX1JVTiwJLyogbGFjayBvZiBpbnB1dCBkYXRhICovCi0JU1NUX0NBUF9FUlJfT1ZFUkZMT1csCS8qIGxhY2sgb2Ygb3V0cHV0IHNwYWNlICovCisJU1NUX0NBUF9FUlJfSU5DTVBMVEVfQ0FQVFVSRV9NU0cgPSAxNiwKKwlTU1RfQ0FQX0VSUl9DQVBUVVJFX0ZBSUwgPSAxNywKKwlTU1RfQ0FQX0VSUl9HRVRfRERSX05FV19TR0xJU1QgPSAxOCwKKwlTU1RfQ0FQX0VSUl9VTkRFUl9SVU4gPSAxOSwKKwlTU1RfQ0FQX0VSUl9PVkVSRkxPVyA9IDIwLAogCiAJLyogUGxheWJhY2sgc3BlY2lmaWMgZXJyb3IgY29kZXMqLwotCVNTVF9QQl9FUlJfSU5DTVBMVEVfUExBWV9NU0csIC8qIEFOWTogSW5jb21wbGV0ZSBtZXNzYWdlICovCi0JU1NUX1BCX0VSUl9QTEFZX0ZBSUwsIC8qIEFOWTogUGxheWJhY2sgb3BlcmF0aW9uIGZhaWxlZCAqLwotCVNTVF9QQl9FUlJfR0VUX0REUl9ORVdfU0dMSVNULAorCVNTVF9QQl9FUlJfSU5DTVBMVEVfUExBWV9NU0cgPSAyMSwKKwlTU1RfUEJfRVJSX1BMQVlfRkFJTCA9IDIyLAorCVNTVF9QQl9FUlJfR0VUX0REUl9ORVdfU0dMSVNUID0gMjMsCiAKIAkvKiBDb2RlYyBtYW5hZ2VyIHNwZWNpZmljIGVycm9yIGNvZGVzICovCi0JU1NUX0xJQl9FUlJfTElCX0ROTERfUkVRVUlSRUQsIC8qIEFMTE9DOiBDb2RlYyBkb3dubG9hZCByZXF1aXJlZCAqLwotCVNTVF9MSUJfRVJSX0xJQl9OT1RfU1VQUE9SVEVELCAvKiBMaWJyYXJ5IGlzIG5vdCBzdXBwb3J0ZWQgKi8KKwlTU1RfTElCX0VSUl9MSUJfRE5MRF9SRVFVSVJFRCA9IDI0LAorCVNTVF9MSUJfRVJSX0xJQl9OT1RfU1VQUE9SVEVEID0gMjUsCiAKIAkvKiBMaWJyYXJ5IG1hbmFnZXIgc3BlY2lmaWMgZXJyb3IgY29kZXMgKi8KLQlTU1RfU0NDX0VSUl9QUkVQX0ROTERfRkFJTEVELCAvKiBGYWlsZWQgdG8gcHJlcGFyZSBmb3IgY29kZWMgZG93bmxvYWQgKi8KLQlTU1RfU0NDX0VSUl9MSUJfRE5MRF9SRVNfRkFJTEVELCAvKiBMaWIgZG93bmxvYWQgcmVzdW1lIGZhaWxlZCAqLworCVNTVF9TQ0NfRVJSX1BSRVBfRE5MRF9GQUlMRUQgPSAyNiwKKwlTU1RfU0NDX0VSUl9MSUJfRE5MRF9SRVNfRkFJTEVEID0gMjcsCiAJLyogU2NoZWR1bGVyIHNwZWNpZmljIGVycm9yIGNvZGVzICovCi0JU1NUX1NDSF9FUlJfRkFJTCwgLyogUkVQT1JUOiAqLworCVNTVF9TQ0hfRVJSX0ZBSUwgPSAyOCwKIAogCS8qIERNQSBzcGVjaWZpYyBlcnJvciBjb2RlcyAqLwotCVNTVF9ETUFfRVJSX05PX0NITkxfQVZBSUxBQkxFLCAvKiBETUEgQ2ggbm90IGF2YWlsYWJsZSAqLwotCVNTVF9ETUFfRVJSX0lOVkFMSURfSU5QVVRfUEFSQU1TLCAvKiBJbnZhbGlkIGlucHV0IHBhcmFtcyAqLwotCVNTVF9ETUFfRVJSX0NITkxfQUxSRUFEWV9TVVNQRU5ERUQsIC8qIENoIGlzIHN1c3BlbmRlZCAqLwotCVNTVF9ETUFfRVJSX0NITkxfQUxSRUFEWV9TVEFSVEVELCAvKiBDaCBhbHJlYWR5IHN0YXJ0ZWQgKi8KLQlTU1RfRE1BX0VSUl9DSE5MX05PVF9FTkFCTEVELCAvKiBDaCBub3QgZW5hYmxlZCAqLwotCVNTVF9ETUFfRVJSX1RSQU5TRkVSX0ZBSUxFRCwgLyogVHJhbnNmZXIgZmFpbGVkICovCi0JU1NUX1NTUF9FUlJfQUxSRUFEWV9FTkFCTEVELCAvKiBSRVBPUlQ6IFNTUCBhbHJlYWR5IGVuYWJsZWQgKi8KLQlTU1RfU1NQX0VSUl9BTFJFQURZX0RJU0FCTEVELCAvKiBSRVBPUlQ6IFNTUCBhbHJlYWR5IGRpc2FibGVkICovCi0JU1NUX1NTUF9FUlJfTk9UX0lOSVRJQUxJWkVELAorCVNTVF9ETUFfRVJSX05PX0NITkxfQVZBSUxBQkxFID0gMjksCisJU1NUX0RNQV9FUlJfSU5WQUxJRF9JTlBVVF9QQVJBTVMgPSAzMCwKKwlTU1RfRE1BX0VSUl9DSE5MX0FMUkVBRFlfU1VTUEVOREVEID0gMzEsCisJU1NUX0RNQV9FUlJfQ0hOTF9BTFJFQURZX1NUQVJURUQgPSAzMiwKKwlTU1RfRE1BX0VSUl9DSE5MX05PVF9FTkFCTEVEID0gMzMsCisJU1NUX0RNQV9FUlJfVFJBTlNGRVJfRkFJTEVEID0gMzQsCisKKwlTU1RfU1NQX0VSUl9BTFJFQURZX0VOQUJMRUQgPSAzNSwKKwlTU1RfU1NQX0VSUl9BTFJFQURZX0RJU0FCTEVEID0gMzYsCisJU1NUX1NTUF9FUlJfTk9UX0lOSVRJQUxJWkVEID0gMzcsCisJU1NUX1NTUF9FUlJfU1JBTV9OT19ETUFfREFUQSA9IDM4LAogCiAJLyogT3RoZXIgZXJyb3IgY29kZXMgKi8KLQlTU1RfRVJSX01PRF9JTklUX0ZBSUwsCS8qIEZpcm13YXJlIE1vZHVsZSBpbml0IGZhaWxlZCAqLworCVNTVF9FUlJfTU9EX0lOSVRfRkFJTCA9IDM5LAogCiAJLyogRlcgaW5pdCBlcnJvciBjb2RlcyAqLwotCVNTVF9SRFJfRVJSX0lPX0RFVl9TRUxfTk9UX0FMTE9XRUQsCi0JU1NUX1JEUl9FUlJfUk9VVEVfQUxSRUFEWV9TVEFSVEVELAotCVNTVF9SRFJfUFJFUF9DT0RFQ19ETkxEX0ZBSUxFRCwKKwlTU1RfUkRSX0VSUl9JT19ERVZfU0VMX05PVF9BTExPV0VEID0gNDAsCisJU1NUX1JEUl9FUlJfUk9VVEVfQUxSRUFEWV9TVEFSVEVEID0gNDEsCisJU1NUX1JEUl9FUlJfSU9fREVWX1NFTF9GQUlMRUQgPSA0MiwKKwlTU1RfUkRSX1BSRVBfQ09ERUNfRE5MRF9GQUlMRUQgPSA0MywKIAogCS8qIE1lbW9yeSBkZWJ1ZyBlcnJvciBjb2RlcyAqLwotCVNTVF9FUlJfREJHX01FTV9SRUFEX0ZBSUwsCi0JU1NUX0VSUl9EQkdfTUVNX1dSSVRFX0ZBSUwsCisJU1NUX0VSUl9EQkdfTUVNX1JFQURfRkFJTCA9IDQ0LAorCVNTVF9FUlJfREJHX01FTV9XUklURV9GQUlMID0gNDUsCisJU1NUX0VSUl9JTlNVRkZJQ0lFTlRfSU5QVVRfU0dfTElTVCA9IDQ2LAorCVNTVF9FUlJfSU5TVUZGSUNJRU5UX09VVFBVVF9TR19MSVNUID0gNDcsCiAKLQkvKiBEZWNvZGUgZXJyb3IgY29kZXMgKi8KLQlTU1RfRVJSX0RFQ19ORUVEX0lOUFVUX0JVRiwKKwlTU1RfRVJSX0JVRkZFUl9OT1RfQVZBSUxBQkxFID0gNDgsCisJU1NUX0VSUl9CVUZGRVJfTk9UX0FMTE9DQVRFRCA9IDQ5LAorCVNTVF9FUlJfSU5WQUxJRF9SRUdJT05fVFlQRSA9IDUwLAorCVNTVF9FUlJfTlVMTF9QVFIgPSA1MSwKKwlTU1RfRVJSX0lOVkFMSURfQlVGRkVSX1NJWkUgPSA1MiwKKwlTU1RfRVJSX0lOVkFMSURfQlVGRkVSX0lOREVYID0gNTMsCiAKKwkvKklJUEMgc3BlY2lmaWMgZXJyb3IgY29kZXMgKi8KKwlTU1RfSUlQQ19RVUVVRV9GVUxMID0gNTQsCisJU1NUX0lJUENfRVJSX01TR19TTkRfRkFJTEVEID0gNTUsCisJU1NUX1BCX0VSUl9VTkRFUlJVTl9PQ0NVUkVEID0gNTYsCisJU1NUX1JEUl9JTlNVRkZJQ0lFTlRfTUlYRVJfQlVGRkVSID0gNTcsCisJU1NUX0lOVkFMSURfVElNRV9TTE9UUyA9IDU4LAogfTsKIAogZW51bSBkYmdfbWVtX2RhdGFfdHlwZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9pb2N0bC5oIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3RfaW9jdGwuaAppbmRleCAwM2I5MzE2Li5iZWJjMzk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9pb2N0bC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0X2lvY3RsLmgKQEAgLTE5MCwyMSArMTkwLDE1IEBACiAJX191MzIgcmVzZXJ2ZWQ7CS8qIE5vIHByZS1wcm9jZXNzaW5nIGRlZmluZWQgeWV0ICovCiB9OwogCi1zdHJ1Y3Qgc25kX3BhcmFtc19ibG9jayB7Ci0JX191MzIgdHlwZTsJCS8qVHlwZSBvZiB0aGUgcGFyYW1ldGVyKi8KLQlfX3UzMiBzaXplOwkJLypzaXplIG9mIHRoZSBwYXJhbWV0ZXJzIGluIHRoZSBibG9jayovCi0JX191OCBwYXJhbXNbMF07CS8qUGFyYW1ldGVycyBvZiB0aGUgYWxnb3JpdGhtKi8KLX07Ci0KIC8qIFByZSBhbmQgcG9zdCBwcm9jZXNzaW5nIHBhcmFtcyBzdHJ1Y3R1cmUgKi8KIHN0cnVjdCBzbmRfcHBwX3BhcmFtcyB7Ci0JZW51bSBzc3RfYWxnb190eXBlcwlhbGdvX2lkOy8qIFBvc3QvUHJlIHByb2Nlc3NpbmcgYWxnb3JpdGhtIElEICAqLworCV9fdTgJCQlhbGdvX2lkOy8qIFBvc3QvUHJlIHByb2Nlc3NpbmcgYWxnb3JpdGhtIElEICAqLwogCV9fdTgJCQlzdHJfaWQ7CS8qT25seSA1IGJpdHMgdXNlZCAwIC0gMzEgYXJlIHZhbGlkKi8KIAlfX3U4CQkJZW5hYmxlOwkvKiAwPSBkaXNhYmxlLCAxPSBlbmFibGUqLwogCV9fdTgJCQlyZXNlcnZlZDsKIAlfX3UzMgkJCXNpemU7CS8qU2l6ZSBvZiBwYXJhbWV0ZXJzIGZvciBhbGwgYmxvY2tzKi8KLQlzdHJ1Y3Qgc25kX3BhcmFtc19ibG9jawlwYXJhbXNbMF07Ci19OworCXZvaWQJCQkqcGFyYW1zOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKIHN0cnVjdCBzbmRfc3N0X3Bvc3Rwcm9jX2luZm8gewogCV9fdTMyIHNyY19taW47CQkvKiBTdXBwb3J0ZWQgU1JDIE1pbiBzYW1wbGluZyBmcmVxICovCkBAIC00MzEsNSArNDI1LDggQEAKICNkZWZpbmUgU05EUlZfU1NUX0ZXX0lORk8JX0lPUignTCcsIDB4MjAsICBzdHJ1Y3Qgc25kX3NzdF9md19pbmZvICopCiAjZGVmaW5lIFNORFJWX1NTVF9TRVRfVEFSR0VUX0RFVklDRSBfSU9XKCdMJywgMHgyMSwgXAogCQkJCQlzdHJ1Y3Qgc25kX3NzdF90YXJnZXRfZGV2aWNlICopCisvKkRTUCBJb2N0bHMgb24gL2Rldi9pbnRlbF9zc3RfY3RybCBvbmx5Ki8KKyNkZWZpbmUgU05EUlZfU1NUX1NFVF9BTEdPCV9JT1coJ0wnLCAweDMwLCAgc3RydWN0IHNuZF9wcHBfcGFyYW1zICopCisjZGVmaW5lIFNORFJWX1NTVF9HRVRfQUxHTwlfSU9XUignTCcsIDB4MzEsICBzdHJ1Y3Qgc25kX3BwcF9wYXJhbXMgKikKIAogI2VuZGlmIC8qIF9fSU5URUxfU1NUX0lPQ1RMX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3RfaXBjLmMgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9pcGMuYwppbmRleCAzOWM2N2ZhLi4wNzQyZGRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9pcGMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9pcGMuYwpAQCAtMjYsNiArMjYsOCBAQAogICogIFRoaXMgZmlsZSBkZWZpbmVzIGFsbCBpcGMgZnVuY3Rpb25zCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgpAQCAtNzUsMTYgKzc3LDE2IEBACiAJLypUbyBjaGVjayBpZiBMUEUgaXMgaW4gc3RhbGxlZCBzdGF0ZS4qLwogCXJldHZhbCA9IHNzdF9zdGFsbGVkKCk7CiAJaWYgKHJldHZhbCA8IDApIHsKLQkJcHJfZXJyKCJzc3Q6IGluIHN0YWxsZWQgc3RhdGVcbiIpOworCQlwcl9lcnIoImluIHN0YWxsZWQgc3RhdGVcbiIpOwogCQlyZXR1cm47CiAJfQotCXByX2RlYnVnKCJzc3Q6IHBvc3QgbWVzc2FnZSBjYWxsZWRcbiIpOworCXByX2RlYnVnKCJwb3N0IG1lc3NhZ2UgY2FsbGVkXG4iKTsKIAlzcGluX2xvY2soJnNzdF9kcnZfY3R4LT5saXN0X3NwaW5fbG9jayk7CiAKIAkvKiBjaGVjayBsaXN0ICovCiAJaWYgKGxpc3RfZW1wdHkoJnNzdF9kcnZfY3R4LT5pcGNfZGlzcGF0Y2hfbGlzdCkpIHsKIAkJLyogbGlzdCBpcyBlbXB0eSwgbWFzayBpbXIgKi8KLQkJcHJfZGVidWcoInNzdDogRW1wdHkgbXNnIHF1ZXVlLi4uIG1hc2tpbmdcbiIpOworCQlwcl9kZWJ1ZygiRW1wdHkgbXNnIHF1ZXVlLi4uIG1hc2tpbmdcbiIpOwogCQlpbXIuZnVsbCA9IHJlYWRsKHNzdF9kcnZfY3R4LT5zaGltICsgU1NUX0lNUlgpOwogCQlpbXIucGFydC5kb25lX2ludGVycnVwdCA9IDE7CiAJCS8qIGR1bW15IHJlZ2lzdGVyIGZvciBzaGltIHdvcmthcm91bmQgKi8KQEAgLTk3LDcgKzk5LDcgQEAKIAloZWFkZXIuZnVsbCA9IHNzdF9zaGltX3JlYWQoc3N0X2Rydl9jdHgtPnNoaW0sIFNTVF9JUENYKTsKIAlpZiAoaGVhZGVyLnBhcnQuYnVzeSkgewogCQkvKiBidXN5LCB1bm1hc2sgKi8KLQkJcHJfZGVidWcoInNzdDogQnVzeSBub3QgZnJlZS4uLiB1bm1hc2tpbmdcbiIpOworCQlwcl9kZWJ1ZygiQnVzeSBub3QgZnJlZS4uLiB1bm1hc2tpbmdcbiIpOwogCQlpbXIuZnVsbCA9IHJlYWRsKHNzdF9kcnZfY3R4LT5zaGltICsgU1NUX0lNUlgpOwogCQlpbXIucGFydC5kb25lX2ludGVycnVwdCA9IDA7CiAJCS8qIGR1bW15IHJlZ2lzdGVyIGZvciBzaGltIHdvcmthcm91bmQgKi8KQEAgLTEwOSw4ICsxMTEsOCBAQAogCW1zZyA9IGxpc3RfZW50cnkoc3N0X2Rydl9jdHgtPmlwY19kaXNwYXRjaF9saXN0Lm5leHQsCiAJCQlzdHJ1Y3QgaXBjX3Bvc3QsIG5vZGUpOwogCWxpc3RfZGVsKCZtc2ctPm5vZGUpOwotCXByX2RlYnVnKCJzc3Q6IFBvc3QgbWVzc2FnZTogaGVhZGVyID0gJXhcbiIsIG1zZy0+aGVhZGVyLmZ1bGwpOwotCXByX2RlYnVnKCJzc3Q6IHNpemU6ID0gJXhcbiIsIG1zZy0+aGVhZGVyLnBhcnQuZGF0YSk7CisJcHJfZGVidWcoIlBvc3QgbWVzc2FnZTogaGVhZGVyID0gJXhcbiIsIG1zZy0+aGVhZGVyLmZ1bGwpOworCXByX2RlYnVnKCJzaXplOiA9ICV4XG4iLCBtc2ctPmhlYWRlci5wYXJ0LmRhdGEpOwogCWlmIChtc2ctPmhlYWRlci5wYXJ0LmxhcmdlKQogCQltZW1jcHlfdG9pbyhzc3RfZHJ2X2N0eC0+bWFpbGJveCArIFNTVF9NQUlMQk9YX1NFTkQsCiAJCQltc2ctPm1haWxib3hfZGF0YSwgbXNnLT5oZWFkZXIucGFydC5kYXRhKTsKQEAgLTE2NiwxMyArMTY4LDEzIEBACiAJCShzdHJ1Y3QgaXBjX2hlYWRlcl9md19pbml0ICopbXNnLT5tYWlsYm94OwogCWludCByZXR2YWwgPSAwOwogCi0JcHJfZGVidWcoInNzdDogKioqIEZXIEluaXQgbXNnIGNhbWUqKipcbiIpOworCXByX2RlYnVnKCIqKiogRlcgSW5pdCBtc2cgY2FtZSoqKlxuIik7CiAJaWYgKGluaXQtPnJlc3VsdCkgewogCQltdXRleF9sb2NrKCZzc3RfZHJ2X2N0eC0+c3N0X2xvY2spOwogCQlzc3RfZHJ2X2N0eC0+c3N0X3N0YXRlID0gU1NUX0VSUk9SOwogCQltdXRleF91bmxvY2soJnNzdF9kcnZfY3R4LT5zc3RfbG9jayk7Ci0JCXByX2RlYnVnKCJzc3Q6IEZXIEluaXQgZmFpbGVkLCBFcnJvciAleFxuIiwgaW5pdC0+cmVzdWx0KTsKLQkJcHJfZXJyKCJzc3Q6IEZXIEluaXQgZmFpbGVkLCBFcnJvciAleFxuIiwgaW5pdC0+cmVzdWx0KTsKKwkJcHJfZGVidWcoIkZXIEluaXQgZmFpbGVkLCBFcnJvciAleFxuIiwgaW5pdC0+cmVzdWx0KTsKKwkJcHJfZXJyKCJGVyBJbml0IGZhaWxlZCwgRXJyb3IgJXhcbiIsIGluaXQtPnJlc3VsdCk7CiAJCXJldHZhbCA9IC1pbml0LT5yZXN1bHQ7CiAJCXJldHVybiByZXR2YWw7CiAJfQpAQCAtMTgwLDEyICsxODIsMTMgQEAKIAkJc3N0X3NlbmRfc291bmRfY2FyZF90eXBlKCk7CiAJbXV0ZXhfbG9jaygmc3N0X2Rydl9jdHgtPnNzdF9sb2NrKTsKIAlzc3RfZHJ2X2N0eC0+c3N0X3N0YXRlID0gU1NUX0ZXX1JVTk5JTkc7CisJc3N0X2Rydl9jdHgtPmxwZV9zdGFsbGVkID0gMDsKIAltdXRleF91bmxvY2soJnNzdF9kcnZfY3R4LT5zc3RfbG9jayk7Ci0JcHJfZGVidWcoInNzdDogRlcgVmVyc2lvbiAleC4leFxuIiwKKwlwcl9kZWJ1ZygiRlcgVmVyc2lvbiAleC4leFxuIiwKIAkJCWluaXQtPmZ3X3ZlcnNpb24ubWFqb3IsIGluaXQtPmZ3X3ZlcnNpb24ubWlub3IpOwotCXByX2RlYnVnKCJzc3Q6IEJ1aWxkIE5vICV4IFR5cGUgJXhcbiIsCisJcHJfZGVidWcoIkJ1aWxkIE5vICV4IFR5cGUgJXhcbiIsCiAJCQlpbml0LT5md192ZXJzaW9uLmJ1aWxkLCBpbml0LT5md192ZXJzaW9uLnR5cGUpOwotCXByX2RlYnVnKCJzc3Q6ICBCdWlsZCBkYXRlICVzIFRpbWUgJXNcbiIsCisJcHJfZGVidWcoIiBCdWlsZCBkYXRlICVzIFRpbWUgJXNcbiIsCiAJCQlpbml0LT5idWlsZF9pbmZvLmRhdGUsIGluaXQtPmJ1aWxkX2luZm8udGltZSk7CiAJc3N0X3dha2VfdXBfYWxsb2NfYmxvY2soc3N0X2Rydl9jdHgsIEZXX0RXTkxfSUQsIHJldHZhbCwgTlVMTCk7CiAJcmV0dXJuIHJldHZhbDsKQEAgLTIwNCwxOSArMjA3LDE5IEBACiAJCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHNzdF9pcGNfbXNnX3dxLCB3cSk7CiAJaW50IHN0cl9pZCA9IG1zZy0+aGVhZGVyLnBhcnQuc3RyX2lkOwogCi0JcHJfZGVidWcoInNzdDogSVBDIHByb2Nlc3MgZm9yICV4XG4iLCBtc2ctPmhlYWRlci5mdWxsKTsKKwlwcl9kZWJ1ZygiSVBDIHByb2Nlc3MgZm9yICV4XG4iLCBtc2ctPmhlYWRlci5mdWxsKTsKIAogCS8qIGJhc2VkIG9uIG1zZyBpbiBsaXN0IGNhbGwgcmVzcGVjdGl2ZSBoYW5kbGVyICovCiAJc3dpdGNoIChtc2ctPmhlYWRlci5wYXJ0Lm1zZ19pZCkgewogCWNhc2UgSVBDX1NTVF9CVUZfVU5ERVJfUlVOOgogCWNhc2UgSVBDX1NTVF9CVUZfT1ZFUl9SVU46CiAJCWlmIChzc3RfdmFsaWRhdGVfc3RyaWQoc3RyX2lkKSkgewotCQkJcHJfZXJyKCJzc3Q6ICBzdHJlYW0gaWQgJWQgaW52YWxpZFxuIiwgc3RyX2lkKTsKKwkJCXByX2Vycigic3RyZWFtIGlkICVkIGludmFsaWRcbiIsIHN0cl9pZCk7CiAJCQlicmVhazsKIAkJfQotCQlwcl9lcnIoInNzdDogQnVmZmVyIHVuZGVyL292ZXJydW4gZm9yJWRcbiIsCisJCXByX2VycigiQnVmZmVyIHVuZGVyL292ZXJydW4gZm9yICVkXG4iLAogCQkJCW1zZy0+aGVhZGVyLnBhcnQuc3RyX2lkKTsKLQkJcHJfZXJyKCJzc3Q6IEdvdCBVbmRlcnJ1biAmIG5vdCB0byBzZW5kIGRhdGEuLi5pZ25vcmVcbiIpOworCQlwcl9lcnIoIkdvdCBVbmRlcnJ1biAmIG5vdCB0byBzZW5kIGRhdGEuLi5pZ25vcmVcbiIpOwogCQlicmVhazsKIAogCWNhc2UgSVBDX1NTVF9HRVRfUExBWV9GUkFNRVM6CkBAIC0yMjQsMzUgKzIyNywzNSBAQAogCQkJc3RydWN0IHN0cmVhbV9pbmZvICpzdHJlYW0gOwogCiAJCQlpZiAoc3N0X3ZhbGlkYXRlX3N0cmlkKHN0cl9pZCkpIHsKLQkJCQlwcl9lcnIoInNzdDogc3RyaWQgJWQgaW52YWxpZFxuIiwgc3RyX2lkKTsKKwkJCQlwcl9lcnIoInN0cmlkICVkIGludmFsaWRcbiIsIHN0cl9pZCk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQkvKiBjYWxsIHNzdF9wbGF5X2ZyYW1lICovCiAJCQlzdHJlYW0gPSAmc3N0X2Rydl9jdHgtPnN0cmVhbXNbc3RyX2lkXTsKLQkJCXByX2RlYnVnKCJzc3Q6IHNzdF9wbGF5X2ZyYW1lcyBmb3IgJWRcbiIsCisJCQlwcl9kZWJ1Zygic3N0X3BsYXlfZnJhbWVzIGZvciAlZFxuIiwKIAkJCQkJbXNnLT5oZWFkZXIucGFydC5zdHJfaWQpOwogCQkJbXV0ZXhfbG9jaygmc3N0X2Rydl9jdHgtPnN0cmVhbXNbc3RyX2lkXS5sb2NrKTsKIAkJCXNzdF9wbGF5X2ZyYW1lKG1zZy0+aGVhZGVyLnBhcnQuc3RyX2lkKTsKIAkJCW11dGV4X3VubG9jaygmc3N0X2Rydl9jdHgtPnN0cmVhbXNbc3RyX2lkXS5sb2NrKTsKIAkJCWJyZWFrOwogCQl9IGVsc2UKLQkJCXByX2Vycigic3N0OiBzc3RfcGxheV9mcmFtZXMgZm9yIFBlbndlbGwhIVxuIik7CisJCQlwcl9lcnIoInNzdF9wbGF5X2ZyYW1lcyBmb3IgUGVud2VsbCEhXG4iKTsKIAogCWNhc2UgSVBDX1NTVF9HRVRfQ0FQVF9GUkFNRVM6CiAJCWlmIChzc3RfZHJ2X2N0eC0+cGNpX2lkID09IFNTVF9NUlNUX1BDSV9JRCkgewogCQkJc3RydWN0IHN0cmVhbV9pbmZvICpzdHJlYW07CiAJCQkvKiBjYWxsIHNzdF9jYXB0dXJlX2ZyYW1lICovCiAJCQlpZiAoc3N0X3ZhbGlkYXRlX3N0cmlkKHN0cl9pZCkpIHsKLQkJCQlwcl9lcnIoInNzdDogc3RyIGlkICVkIGludmFsaWRcbiIsIHN0cl9pZCk7CisJCQkJcHJfZXJyKCJzdHIgaWQgJWQgaW52YWxpZFxuIiwgc3RyX2lkKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJCXN0cmVhbSA9ICZzc3RfZHJ2X2N0eC0+c3RyZWFtc1tzdHJfaWRdOwotCQkJcHJfZGVidWcoInNzdDogc3N0X2NhcHR1cmVfZnJhbWVzIGZvciAlZFxuIiwKKwkJCXByX2RlYnVnKCJzc3RfY2FwdHVyZV9mcmFtZXMgZm9yICVkXG4iLAogCQkJCQltc2ctPmhlYWRlci5wYXJ0LnN0cl9pZCk7CiAJCQltdXRleF9sb2NrKCZzdHJlYW0tPmxvY2spOwogCQkJaWYgKHN0cmVhbS0+bW1hcHBlZCA9PSBmYWxzZSAmJgogCQkJCQlzdHJlYW0tPnNyYyA9PSBTU1RfRFJWKSB7Ci0JCQkJcHJfZGVidWcoInNzdDogd2FraW5nIHVwIGJsb2NrIGZvciBjb3B5LlxuIik7CisJCQkJcHJfZGVidWcoIndha2luZyB1cCBibG9jayBmb3IgY29weS5cbiIpOwogCQkJCXN0cmVhbS0+ZGF0YV9ibGsucmV0X2NvZGUgPSAwOwogCQkJCXN0cmVhbS0+ZGF0YV9ibGsuY29uZGl0aW9uID0gdHJ1ZTsKIAkJCQlzdHJlYW0tPmRhdGFfYmxrLm9uID0gZmFsc2U7CkBAIC0yNjEsMTEgKzI2NCwxMSBAQAogCQkJCXNzdF9jYXB0dXJlX2ZyYW1lKG1zZy0+aGVhZGVyLnBhcnQuc3RyX2lkKTsKIAkJCW11dGV4X3VubG9jaygmc3RyZWFtLT5sb2NrKTsKIAkJfSBlbHNlCi0JCQlwcl9lcnIoInNzdDogc3N0X3BsYXlfZnJhbWVzIGZvciBQZW53ZWxsISFcbiIpOworCQkJcHJfZXJyKCJzc3RfcGxheV9mcmFtZXMgZm9yIFBlbndlbGwhIVxuIik7CiAJCWJyZWFrOwogCiAJY2FzZSBJUENfSUFfUFJJTlRfU1RSSU5HOgotCQlwcl9kZWJ1Zygic3N0OiBiZWVuIGFza2VkIHRvIHByaW50IHNvbWV0aGluZyBieSBmd1xuIik7CisJCXByX2RlYnVnKCJiZWVuIGFza2VkIHRvIHByaW50IHNvbWV0aGluZyBieSBmd1xuIik7CiAJCS8qIFRCRCAqLwogCQlicmVhazsKIApAQCAtMjc3LDEyICsyODAsMTIgQEAKIAogCWNhc2UgSVBDX1NTVF9TVFJFQU1fUFJPQ0VTU19GQVRBTF9FUlI6CiAJCWlmIChzc3RfdmFsaWRhdGVfc3RyaWQoc3RyX2lkKSkgewotCQkJcHJfZXJyKCJzc3Q6IHN0cmVhbSBpZCAlZCBpbnZhbGlkXG4iLCBzdHJfaWQpOworCQkJcHJfZXJyKCJzdHJlYW0gaWQgJWQgaW52YWxpZFxuIiwgc3RyX2lkKTsKIAkJCWJyZWFrOwogCQl9Ci0JCXByX2Vycigic3N0OiBjb2RlYyBmYXRhbCBlcnJvciAleCBzdHJlYW0gJWQuLi5cbiIsCisJCXByX2VycigiY29kZWMgZmF0YWwgZXJyb3IgJXggc3RyZWFtICVkLi4uXG4iLAogCQkJCW1zZy0+aGVhZGVyLmZ1bGwsIG1zZy0+aGVhZGVyLnBhcnQuc3RyX2lkKTsKLQkJcHJfZXJyKCJzc3Q6IERyb3BwaW5nIHRoZSBzdHJlYW1cbiIpOworCQlwcl9lcnIoIkRyb3BwaW5nIHRoZSBzdHJlYW1cbiIpOwogCQlzc3RfZHJvcF9zdHJlYW0obXNnLT5oZWFkZXIucGFydC5zdHJfaWQpOwogCQlicmVhazsKIAljYXNlIElQQ19JQV9MUEVfR0VUVElOR19TVEFMTEVEOgpAQCAtMjkzLDcgKzI5Niw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCS8qIElsbGVnYWwgY2FzZSAqLwotCQlwcl9lcnIoInNzdDogVW5oYW5kbGVkIG1zZyAleCBoZWFkZXIgJXhcbiIsCisJCXByX2VycigiVW5oYW5kbGVkIG1zZyAleCBoZWFkZXIgJXhcbiIsCiAJCW1zZy0+aGVhZGVyLnBhcnQubXNnX2lkLCBtc2ctPmhlYWRlci5mdWxsKTsKIAl9CiAJc3N0X2NsZWFyX2ludGVycnVwdCgpOwpAQCAtMzIyLDcgKzMyNSw3IEBACiAJCWlmICghbXNnLT5oZWFkZXIucGFydC5kYXRhKSB7CiAJCQlzc3RfZHJ2X2N0eC0+dGd0X2Rldl9ibGsucmV0X2NvZGUgPSAwOwogCQl9IGVsc2UgewotCQkJcHJfZXJyKCJzc3Q6ICBNc2cgJXggcmVwbHkgZXJyb3IgJXhcbiIsCisJCQlwcl9lcnIoIiBNc2cgJXggcmVwbHkgZXJyb3IgJXhcbiIsCiAJCQltc2ctPmhlYWRlci5wYXJ0Lm1zZ19pZCwgbXNnLT5oZWFkZXIucGFydC5kYXRhKTsKIAkJCXNzdF9kcnZfY3R4LT50Z3RfZGV2X2Jsay5yZXRfY29kZSA9CiAJCQkJCS1tc2ctPmhlYWRlci5wYXJ0LmRhdGE7CkBAIC0zMzMsNiArMzM2LDU1IEBACiAJCQkJd2FrZV91cCgmc3N0X2Rydl9jdHgtPndhaXRfcXVldWUpOwogCQl9CiAJCWJyZWFrOworCWNhc2UgSVBDX0lBX0FMR19QQVJBTVM6IHsKKwkJcHJfZGVidWcoInNzdDpJUENfQUxHX1BBUkFNUyByZXNwb25zZSAleFxuIiwgbXNnLT5oZWFkZXIuZnVsbCk7CisJCXByX2RlYnVnKCJzc3Q6IGRhdGEgdmFsdWUgJXhcbiIsIG1zZy0+aGVhZGVyLnBhcnQuZGF0YSk7CisJCXByX2RlYnVnKCJzc3Q6IGxhcmdlIHZhbHVlICV4XG4iLCBtc2ctPmhlYWRlci5wYXJ0LmxhcmdlKTsKKworCQlpZiAoIW1zZy0+aGVhZGVyLnBhcnQubGFyZ2UpIHsKKwkJCWlmICghbXNnLT5oZWFkZXIucGFydC5kYXRhKSB7CisJCQkJcHJfZGVidWcoInNzdDogYWxnIHNldCBzdWNjZXNzXG4iKTsKKwkJCQlzc3RfZHJ2X2N0eC0+cHBwX3BhcmFtc19ibGsucmV0X2NvZGUgPSAwOworCQkJfSBlbHNlIHsKKwkJCQlwcl9kZWJ1Zygic3N0OiBhbGcgc2V0IGZhaWxlZFxuIik7CisJCQkJc3N0X2Rydl9jdHgtPnBwcF9wYXJhbXNfYmxrLnJldF9jb2RlID0KKwkJCQkJCQktbXNnLT5oZWFkZXIucGFydC5kYXRhOworCQkJfQorCisJCX0gZWxzZSBpZiAobXNnLT5oZWFkZXIucGFydC5kYXRhKSB7CisJCQlzdHJ1Y3Qgc25kX3BwcF9wYXJhbXMgKm1haWxib3hfcGFyYW1zLCAqZ2V0X3BhcmFtczsKKwkJCWNoYXIgKnBhcmFtczsKKworCQkJcHJfZGVidWcoInNzdDogYWxnIGdldCBzdWNjZXNzXG4iKTsKKwkJCW1haWxib3hfcGFyYW1zID0gKHN0cnVjdCBzbmRfcHBwX3BhcmFtcyAqKW1zZy0+bWFpbGJveDsKKwkJCWdldF9wYXJhbXMgPSBremFsbG9jKHNpemVvZigqZ2V0X3BhcmFtcyksIEdGUF9LRVJORUwpOworCQkJaWYgKGdldF9wYXJhbXMgPT0gTlVMTCkgeworCQkJCXByX2Vycigic3N0OiBvdXQgb2YgbWVtb3J5IGZvciBBTEcgUEFSQU1TIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQltZW1jcHlfZnJvbWlvKGdldF9wYXJhbXMsIG1haWxib3hfcGFyYW1zLAorCQkJCQkJCXNpemVvZigqZ2V0X3BhcmFtcykpOworCQkJZ2V0X3BhcmFtcy0+cGFyYW1zID0ga3phbGxvYyhtYWlsYm94X3BhcmFtcy0+c2l6ZSwKKwkJCQkJCQlHRlBfS0VSTkVMKTsKKwkJCWlmIChnZXRfcGFyYW1zLT5wYXJhbXMgPT0gTlVMTCkgeworCQkJCWtmcmVlKGdldF9wYXJhbXMpOworCQkJCXByX2Vycigic3N0OiBvdXQgb2YgbWVtb3J5IGZvciBBTEcgUEFSQU1TIGJsb2NrIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlwYXJhbXMgPSBtc2ctPm1haWxib3g7CisJCQlwYXJhbXMgPSBwYXJhbXMgKyBzaXplb2YoKm1haWxib3hfcGFyYW1zKSAtIHNpemVvZih1MzIpOworCQkJbWVtY3B5X2Zyb21pbyhnZXRfcGFyYW1zLT5wYXJhbXMsIHBhcmFtcywKKwkJCQkJCQlnZXRfcGFyYW1zLT5zaXplKTsKKwkJCXNzdF9kcnZfY3R4LT5wcHBfcGFyYW1zX2Jsay5yZXRfY29kZSA9IDA7CisJCQlzc3RfZHJ2X2N0eC0+cHBwX3BhcmFtc19ibGsuZGF0YSA9IGdldF9wYXJhbXM7CisJCX0KKworCQlpZiAoc3N0X2Rydl9jdHgtPnBwcF9wYXJhbXNfYmxrLm9uID09IHRydWUpIHsKKwkJCXNzdF9kcnZfY3R4LT5wcHBfcGFyYW1zX2Jsay5jb25kaXRpb24gPSB0cnVlOworCQkJd2FrZV91cCgmc3N0X2Rydl9jdHgtPndhaXRfcXVldWUpOworCQl9CisJCWJyZWFrOworCX0KIAljYXNlIElQQ19JQV9HRVRfRldfSU5GTzogewogCQlzdHJ1Y3Qgc25kX3NzdF9md19pbmZvICpmd19pbmZvID0KIAkJCShzdHJ1Y3Qgc25kX3NzdF9md19pbmZvICopbXNnLT5tYWlsYm94OwpAQCAtMzQwLDcgKzM5Miw3IEBACiAJCQlpbnQgbWFqb3IgPSBmd19pbmZvLT5md192ZXJzaW9uLm1ham9yOwogCQkJaW50IG1pbm9yID0gZndfaW5mby0+ZndfdmVyc2lvbi5taW5vcjsKIAkJCWludCBidWlsZCA9IGZ3X2luZm8tPmZ3X3ZlcnNpb24uYnVpbGQ7Ci0JCQlwcl9kZWJ1Zygic3N0OiBNc2cgc3VjY2VkZGVkICV4XG4iLAorCQkJcHJfZGVidWcoIk1zZyBzdWNjZWVkZWQgJXhcbiIsCiAJCQkJICAgICAgIG1zZy0+aGVhZGVyLnBhcnQubXNnX2lkKTsKIAkJCXByX2RlYnVnKCJJTkZPOiAqKipGVyoqKiA9ICUwMmQuJTAyZC4lMDJkXG4iLAogCQkJCQltYWpvciwgbWlub3IsIGJ1aWxkKTsKQEAgLTM0OSwxMyArNDAxLDEzIEBACiAJCQkJc2l6ZW9mKHN0cnVjdCBzbmRfc3N0X2Z3X2luZm8pKTsKIAkJCXNzdF9kcnZfY3R4LT5md19pbmZvX2Jsay5yZXRfY29kZSA9IDA7CiAJCX0gZWxzZSB7Ci0JCQlwcl9lcnIoInNzdDogIE1zZyAleCByZXBseSBlcnJvciAleFxuIiwKKwkJCXByX2VycigiIE1zZyAleCByZXBseSBlcnJvciAleFxuIiwKIAkJCW1zZy0+aGVhZGVyLnBhcnQubXNnX2lkLCBtc2ctPmhlYWRlci5wYXJ0LmRhdGEpOwogCQkJc3N0X2Rydl9jdHgtPmZ3X2luZm9fYmxrLnJldF9jb2RlID0KIAkJCQkJLW1zZy0+aGVhZGVyLnBhcnQuZGF0YTsKIAkJfQogCQlpZiAoc3N0X2Rydl9jdHgtPmZ3X2luZm9fYmxrLm9uID09IHRydWUpIHsKLQkJCXByX2RlYnVnKCJzc3Q6IE1lbWNvcHkgc3VjY2VkZGVkXG4iKTsKKwkJCXByX2RlYnVnKCJNZW1jb3B5IHN1Y2NlZWRlZFxuIik7CiAJCQlzc3RfZHJ2X2N0eC0+ZndfaW5mb19ibGsub24gPSBmYWxzZTsKIAkJCXNzdF9kcnZfY3R4LT5md19pbmZvX2Jsay5jb25kaXRpb24gPSB0cnVlOwogCQkJd2FrZV91cCgmc3N0X2Rydl9jdHgtPndhaXRfcXVldWUpOwpAQCAtMzY0LDExICs0MTYsMTEgQEAKIAl9CiAJY2FzZSBJUENfSUFfU0VUX1NUUkVBTV9NVVRFOgogCQlpZiAoIW1zZy0+aGVhZGVyLnBhcnQuZGF0YSkgewotCQkJcHJfZGVidWcoInNzdDogTXNnIHN1Y2NlZGRlZCAleFxuIiwKKwkJCXByX2RlYnVnKCJNc2cgc3VjY2VlZGVkICV4XG4iLAogCQkJCSAgICAgICBtc2ctPmhlYWRlci5wYXJ0Lm1zZ19pZCk7CiAJCQlzc3RfZHJ2X2N0eC0+bXV0ZV9pbmZvX2Jsay5yZXRfY29kZSA9IDA7CiAJCX0gZWxzZSB7Ci0JCQlwcl9lcnIoInNzdDogIE1zZyAleCByZXBseSBlcnJvciAleFxuIiwKKwkJCXByX2VycigiIE1zZyAleCByZXBseSBlcnJvciAleFxuIiwKIAkJCW1zZy0+aGVhZGVyLnBhcnQubXNnX2lkLCBtc2ctPmhlYWRlci5wYXJ0LmRhdGEpOwogCQkJc3N0X2Rydl9jdHgtPm11dGVfaW5mb19ibGsucmV0X2NvZGUgPQogCQkJCQktbXNnLT5oZWFkZXIucGFydC5kYXRhOwpAQCAtMzgyLDExICs0MzQsMTEgQEAKIAkJYnJlYWs7CiAJY2FzZSBJUENfSUFfU0VUX1NUUkVBTV9WT0w6CiAJCWlmICghbXNnLT5oZWFkZXIucGFydC5kYXRhKSB7Ci0JCQlwcl9kZWJ1Zygic3N0OiBNc2cgc3VjY2VkZGVkICV4XG4iLAorCQkJcHJfZGVidWcoIk1zZyBzdWNjZWVkZWQgJXhcbiIsCiAJCQkJICAgICAgIG1zZy0+aGVhZGVyLnBhcnQubXNnX2lkKTsKIAkJCXNzdF9kcnZfY3R4LT52b2xfaW5mb19ibGsucmV0X2NvZGUgPSAwOwogCQl9IGVsc2UgewotCQkJcHJfZXJyKCJzc3Q6ICBNc2cgJXggcmVwbHkgZXJyb3IgJXhcbiIsCisJCQlwcl9lcnIoIiBNc2cgJXggcmVwbHkgZXJyb3IgJXhcbiIsCiAJCQkJCW1zZy0+aGVhZGVyLnBhcnQubXNnX2lkLAogCQkJbXNnLT5oZWFkZXIucGFydC5kYXRhKTsKIAkJCXNzdF9kcnZfY3R4LT52b2xfaW5mb19ibGsucmV0X2NvZGUgPQpAQCAtNDAyLDE1ICs0NTQsMTUgQEAKIAkJYnJlYWs7CiAJY2FzZSBJUENfSUFfR0VUX1NUUkVBTV9WT0w6CiAJCWlmIChtc2ctPmhlYWRlci5wYXJ0LmxhcmdlKSB7Ci0JCQlwcl9kZWJ1Zygic3N0OiBMYXJnZSBNc2cgUmVjZWl2ZWQgU3VjY2Vzc2Z1bGx5XG4iKTsKLQkJCXByX2RlYnVnKCJzc3Q6IE1zZyBzdWNjZWRkZWQgJXhcbiIsCisJCQlwcl9kZWJ1ZygiTGFyZ2UgTXNnIFJlY2VpdmVkIFN1Y2Nlc3NmdWxseVxuIik7CisJCQlwcl9kZWJ1ZygiTXNnIHN1Y2NlZWRlZCAleFxuIiwKIAkJCQkgICAgICAgbXNnLT5oZWFkZXIucGFydC5tc2dfaWQpOwogCQkJbWVtY3B5X2Zyb21pbyhzc3RfZHJ2X2N0eC0+dm9sX2luZm9fYmxrLmRhdGEsCiAJCQkJKHZvaWQgKikgbXNnLT5tYWlsYm94LAogCQkJCXNpemVvZihzdHJ1Y3Qgc25kX3NzdF92b2wpKTsKIAkJCXNzdF9kcnZfY3R4LT52b2xfaW5mb19ibGsucmV0X2NvZGUgPSAwOwogCQl9IGVsc2UgewotCQkJcHJfZXJyKCJzc3Q6IE1zZyAleCByZXBseSBlcnJvciAleFxuIiwKKwkJCXByX2VycigiTXNnICV4IHJlcGx5IGVycm9yICV4XG4iLAogCQkJbXNnLT5oZWFkZXIucGFydC5tc2dfaWQsIG1zZy0+aGVhZGVyLnBhcnQuZGF0YSk7CiAJCQlzc3RfZHJ2X2N0eC0+dm9sX2luZm9fYmxrLnJldF9jb2RlID0KIAkJCQkJLW1zZy0+aGVhZGVyLnBhcnQuZGF0YTsKQEAgLTQyNCwxOCArNDc2LDE4IEBACiAKIAljYXNlIElQQ19JQV9HRVRfU1RSRUFNX1BBUkFNUzoKIAkJaWYgKHNzdF92YWxpZGF0ZV9zdHJpZChzdHJfaWQpKSB7Ci0JCQlwcl9lcnIoInNzdDogc3RyZWFtIGlkICVkIGludmFsaWRcbiIsIHN0cl9pZCk7CisJCQlwcl9lcnIoInN0cmVhbSBpZCAlZCBpbnZhbGlkXG4iLCBzdHJfaWQpOwogCQkJYnJlYWs7CiAJCX0KIAkJc3RyX2luZm8gPSAmc3N0X2Rydl9jdHgtPnN0cmVhbXNbc3RyX2lkXTsKIAkJaWYgKG1zZy0+aGVhZGVyLnBhcnQubGFyZ2UpIHsKLQkJCXByX2RlYnVnKCJzc3Q6IEdldCBzdHJlYW0gbGFyZ2Ugc3VjY2Vzc1xuIik7CisJCQlwcl9kZWJ1ZygiR2V0IHN0cmVhbSBsYXJnZSBzdWNjZXNzXG4iKTsKIAkJCW1lbWNweV9mcm9taW8oc3RyX2luZm8tPmN0cmxfYmxrLmRhdGEsCiAJCQkJKCh2b2lkICopKG1zZy0+bWFpbGJveCkpLAogCQkJCXNpemVvZihzdHJ1Y3Qgc25kX3NzdF9md19nZXRfc3RyZWFtX3BhcmFtcykpOwogCQkJc3RyX2luZm8tPmN0cmxfYmxrLnJldF9jb2RlID0gMDsKIAkJfSBlbHNlIHsKLQkJCXByX2Vycigic3N0OiBNc2cgJXggcmVwbHkgZXJyb3IgJXhcbiIsCisJCQlwcl9lcnIoIk1zZyAleCByZXBseSBlcnJvciAleFxuIiwKIAkJCQltc2ctPmhlYWRlci5wYXJ0Lm1zZ19pZCwgbXNnLT5oZWFkZXIucGFydC5kYXRhKTsKIAkJCXN0cl9pbmZvLT5jdHJsX2Jsay5yZXRfY29kZSA9IC1tc2ctPmhlYWRlci5wYXJ0LmRhdGE7CiAJCX0KQEAgLTQ0NywxOSArNDk5LDE5IEBACiAJCWJyZWFrOwogCWNhc2UgSVBDX0lBX0RFQ09ERV9GUkFNRVM6CiAJCWlmIChzc3RfdmFsaWRhdGVfc3RyaWQoc3RyX2lkKSkgewotCQkJcHJfZXJyKCJzc3Q6IHN0cmVhbSBpZCAlZCBpbnZhbGlkXG4iLCBzdHJfaWQpOworCQkJcHJfZXJyKCJzdHJlYW0gaWQgJWQgaW52YWxpZFxuIiwgc3RyX2lkKTsKIAkJCWJyZWFrOwogCQl9CiAJCXN0cl9pbmZvID0gJnNzdF9kcnZfY3R4LT5zdHJlYW1zW3N0cl9pZF07CiAJCWlmIChtc2ctPmhlYWRlci5wYXJ0LmxhcmdlKSB7Ci0JCQlwcl9kZWJ1Zygic3N0OiBNc2cgc3VjY2VkZGVkICV4XG4iLAorCQkJcHJfZGVidWcoIk1zZyBzdWNjZWVkZWQgJXhcbiIsCiAJCQkJICAgICAgIG1zZy0+aGVhZGVyLnBhcnQubXNnX2lkKTsKIAkJCW1lbWNweV9mcm9taW8oc3RyX2luZm8tPmRhdGFfYmxrLmRhdGEsCiAJCQkJCSgodm9pZCAqKShtc2ctPm1haWxib3gpKSwKIAkJCQkJc2l6ZW9mKHN0cnVjdCBzbmRfc3N0X2RlY29kZV9pbmZvKSk7CiAJCQlzdHJfaW5mby0+ZGF0YV9ibGsucmV0X2NvZGUgPSAwOwogCQl9IGVsc2UgewotCQkJcHJfZXJyKCJzc3Q6IE1zZyAleCByZXBseSBlcnJvciAleFxuIiwKKwkJCXByX2VycigiTXNnICV4IHJlcGx5IGVycm9yICV4XG4iLAogCQkJCW1zZy0+aGVhZGVyLnBhcnQubXNnX2lkLCBtc2ctPmhlYWRlci5wYXJ0LmRhdGEpOwogCQkJc3RyX2luZm8tPmRhdGFfYmxrLnJldF9jb2RlID0gLW1zZy0+aGVhZGVyLnBhcnQuZGF0YTsKIAkJfQpAQCAtNDcxLDE3ICs1MjMsMTcgQEAKIAkJYnJlYWs7CiAJY2FzZSBJUENfSUFfRFJBSU5fU1RSRUFNOgogCQlpZiAoc3N0X3ZhbGlkYXRlX3N0cmlkKHN0cl9pZCkpIHsKLQkJCXByX2Vycigic3N0OiBzdHJlYW0gaWQgJWQgaW52YWxpZFxuIiwgc3RyX2lkKTsKKwkJCXByX2Vycigic3RyZWFtIGlkICVkIGludmFsaWRcbiIsIHN0cl9pZCk7CiAJCQlicmVhazsKIAkJfQogCQlzdHJfaW5mbyA9ICZzc3RfZHJ2X2N0eC0+c3RyZWFtc1tzdHJfaWRdOwogCQlpZiAoIW1zZy0+aGVhZGVyLnBhcnQuZGF0YSkgewotCQkJcHJfZGVidWcoInNzdDogTXNnIHN1Y2NlZGRlZCAleFxuIiwKKwkJCXByX2RlYnVnKCJNc2cgc3VjY2VlZGVkICV4XG4iLAogCQkJCQltc2ctPmhlYWRlci5wYXJ0Lm1zZ19pZCk7CiAJCQlzdHJfaW5mby0+Y3RybF9ibGsucmV0X2NvZGUgPSAwOwogCiAJCX0gZWxzZSB7Ci0JCQlwcl9lcnIoInNzdDogIE1zZyAleCByZXBseSBlcnJvciAleFxuIiwKKwkJCXByX2VycigiIE1zZyAleCByZXBseSBlcnJvciAleFxuIiwKIAkJCQltc2ctPmhlYWRlci5wYXJ0Lm1zZ19pZCwgbXNnLT5oZWFkZXIucGFydC5kYXRhKTsKIAkJCXN0cl9pbmZvLT5jdHJsX2Jsay5yZXRfY29kZSA9IC1tc2ctPmhlYWRlci5wYXJ0LmRhdGE7CiAKQEAgLTQ5Niw3ICs1NDgsNyBAQAogCiAJY2FzZSBJUENfSUFfRFJPUF9TVFJFQU06CiAJCWlmIChzc3RfdmFsaWRhdGVfc3RyaWQoc3RyX2lkKSkgewotCQkJcHJfZXJyKCJzc3Q6IHN0ciBpZCAlZCBpbnZhbGlkXG4iLCBzdHJfaWQpOworCQkJcHJfZXJyKCJzdHIgaWQgJWQgaW52YWxpZFxuIiwgc3RyX2lkKTsKIAkJCWJyZWFrOwogCQl9CiAJCXN0cl9pbmZvID0gJnNzdF9kcnZfY3R4LT5zdHJlYW1zW3N0cl9pZF07CkBAIC01MDQsMTIgKzU1NiwxMiBAQAogCQkJc3RydWN0IHNuZF9zc3RfZHJvcF9yZXNwb25zZSAqZHJvcF9yZXNwID0KIAkJCQkoc3RydWN0IHNuZF9zc3RfZHJvcF9yZXNwb25zZSAqKW1zZy0+bWFpbGJveDsKIAotCQkJcHJfZGVidWcoInNzdDogRHJvcCByZXQgYnl0ZXMgJXhcbiIsIGRyb3BfcmVzcC0+Ynl0ZXMpOworCQkJcHJfZGVidWcoIkRyb3AgcmV0IGJ5dGVzICV4XG4iLCBkcm9wX3Jlc3AtPmJ5dGVzKTsKIAogCQkJc3RyX2luZm8tPmN1cnJfYnl0ZXMgPSBkcm9wX3Jlc3AtPmJ5dGVzOwogCQkJc3RyX2luZm8tPmN0cmxfYmxrLnJldF9jb2RlID0gIDA7CiAJCX0gZWxzZSB7Ci0JCQlwcl9lcnIoInNzdDogIE1zZyAleCByZXBseSBlcnJvciAleFxuIiwKKwkJCXByX2VycigiIE1zZyAleCByZXBseSBlcnJvciAleFxuIiwKIAkJCQltc2ctPmhlYWRlci5wYXJ0Lm1zZ19pZCwgbXNnLT5oZWFkZXIucGFydC5kYXRhKTsKIAkJCXN0cl9pbmZvLT5jdHJsX2Jsay5yZXRfY29kZSA9IC1tc2ctPmhlYWRlci5wYXJ0LmRhdGE7CiAJCX0KQEAgLTUyMSwxMCArNTczLDEwIEBACiAJCWJyZWFrOwogCWNhc2UgSVBDX0lBX0VOQUJMRV9SWF9USU1FX1NMT1Q6CiAJCWlmICghbXNnLT5oZWFkZXIucGFydC5kYXRhKSB7Ci0JCQlwcl9kZWJ1Zygic3N0OiBSWF9USU1FX1NMT1Qgc3VjY2Vzc1xuIik7CisJCQlwcl9kZWJ1ZygiUlhfVElNRV9TTE9UIHN1Y2Nlc3NcbiIpOwogCQkJc3N0X2Rydl9jdHgtPmhzX2luZm9fYmxrLnJldF9jb2RlID0gMDsKIAkJfSBlbHNlIHsKLQkJCXByX2Vycigic3N0OiAgTXNnICV4IHJlcGx5IGVycm9yICV4XG4iLAorCQkJcHJfZXJyKCIgTXNnICV4IHJlcGx5IGVycm9yICV4XG4iLAogCQkJCW1zZy0+aGVhZGVyLnBhcnQubXNnX2lkLAogCQkJCW1zZy0+aGVhZGVyLnBhcnQuZGF0YSk7CiAJCQlzc3RfZHJ2X2N0eC0+aHNfaW5mb19ibGsucmV0X2NvZGUgPQpAQCAtNTQxLDE3ICs1OTMsMTcgQEAKIAljYXNlIElQQ19JQV9TRVRfU1RSRUFNX1BBUkFNUzoKIAkJc3RyX2luZm8gPSAmc3N0X2Rydl9jdHgtPnN0cmVhbXNbc3RyX2lkXTsKIAkJaWYgKCFtc2ctPmhlYWRlci5wYXJ0LmRhdGEpIHsKLQkJCXByX2RlYnVnKCJzc3Q6IE1zZyBzdWNjZWRkZWQgJXhcbiIsCisJCQlwcl9kZWJ1ZygiTXNnIHN1Y2NlZWRlZCAleFxuIiwKIAkJCQkJbXNnLT5oZWFkZXIucGFydC5tc2dfaWQpOwogCQkJc3RyX2luZm8tPmN0cmxfYmxrLnJldF9jb2RlID0gMDsKIAkJfSBlbHNlIHsKLQkJCXByX2Vycigic3N0OiAgTXNnICV4IHJlcGx5IGVycm9yICV4XG4iLAorCQkJcHJfZXJyKCIgTXNnICV4IHJlcGx5IGVycm9yICV4XG4iLAogCQkJCQltc2ctPmhlYWRlci5wYXJ0Lm1zZ19pZCwKIAkJCQkJbXNnLT5oZWFkZXIucGFydC5kYXRhKTsKIAkJCXN0cl9pbmZvLT5jdHJsX2Jsay5yZXRfY29kZSA9IC1tc2ctPmhlYWRlci5wYXJ0LmRhdGE7CiAJCX0KIAkJaWYgKHNzdF92YWxpZGF0ZV9zdHJpZChzdHJfaWQpKSB7Ci0JCQlwcl9lcnIoInNzdDogIHN0cmVhbSBpZCAlZCBpbnZhbGlkXG4iLCBzdHJfaWQpOworCQkJcHJfZXJyKCIgc3RyZWFtIGlkICVkIGludmFsaWRcbiIsIHN0cl9pZCk7CiAJCQlicmVhazsKIAkJfQogCkBAIC01NjQsOSArNjE2LDkgQEAKIAogCWNhc2UgSVBDX0lBX0ZSRUVfU1RSRUFNOgogCQlpZiAoIW1zZy0+aGVhZGVyLnBhcnQuZGF0YSkgewotCQkJcHJfZGVidWcoInNzdDogU3RyZWFtICVkIGZyZWVkXG4iLCBzdHJfaWQpOworCQkJcHJfZGVidWcoIlN0cmVhbSAlZCBmcmVlZFxuIiwgc3RyX2lkKTsKIAkJfSBlbHNlIHsKLQkJCXByX2Vycigic3N0OiBGcmVlIGZvciAlZCByZXQgZXJyb3IgJXhcbiIsCisJCQlwcl9lcnIoIkZyZWUgZm9yICVkIHJldCBlcnJvciAleFxuIiwKIAkJCQkgICAgICAgc3RyX2lkLCBtc2ctPmhlYWRlci5wYXJ0LmRhdGEpOwogCQl9CiAJCWJyZWFrOwpAQCAtNTc1LDcgKzYyNyw3IEBACiAJCXN0cnVjdCBzbmRfc3N0X2FsbG9jX3Jlc3BvbnNlICpyZXNwID0KIAkJCQkoc3RydWN0IHNuZF9zc3RfYWxsb2NfcmVzcG9uc2UgKiltc2ctPm1haWxib3g7CiAJCWlmIChyZXNwLT5zdHJfdHlwZS5yZXN1bHQpCi0JCQlwcl9lcnIoInNzdDogZXJyb3IgYWxsb2Mgc3RyZWFtID0gJXhcbiIsCisJCQlwcl9lcnIoImVycm9yIGFsbG9jIHN0cmVhbSA9ICV4XG4iLAogCQkJCSAgICAgICByZXNwLT5zdHJfdHlwZS5yZXN1bHQpOwogCQlzc3RfYWxsb2Nfc3RyZWFtX3Jlc3BvbnNlKHN0cl9pZCwgcmVzcCk7CiAJCWJyZWFrOwpAQCAtNTg0LDIxICs2MzYsMjEgQEAKIAljYXNlIElQQ19JQV9QTEFZX0ZSQU1FUzoKIAljYXNlIElQQ19JQV9DQVBUX0ZSQU1FUzoKIAkJaWYgKHNzdF92YWxpZGF0ZV9zdHJpZChzdHJfaWQpKSB7Ci0JCQlwcl9lcnIoInNzdDogc3RyZWFtIGlkICVkIGludmFsaWRcbiIgLCBzdHJfaWQpOworCQkJcHJfZXJyKCJzdHJlYW0gaWQgJWQgaW52YWxpZFxuIiwgc3RyX2lkKTsKIAkJCWJyZWFrOwogCQl9Ci0JCXByX2RlYnVnKCJzc3Q6IEFjayBmb3IgcGxheS9jYXB0IGZyYW1lcyByZWNpdmVkXG4iKTsKKwkJcHJfZGVidWcoIkFjayBmb3IgcGxheS9jYXB0IGZyYW1lcyByZWNlaXZlZFxuIik7CiAJCWJyZWFrOwogCiAJY2FzZSBJUENfSUFfUFJFUF9MSUJfRE5MRDogewogCQlzdHJ1Y3Qgc25kX3NzdF9zdHJfdHlwZSAqc3RyX3R5cGUgPQogCQkJKHN0cnVjdCBzbmRfc3N0X3N0cl90eXBlICopbXNnLT5tYWlsYm94OwotCQlwcl9kZWJ1Zygic3N0OiBQcmVwIExpYiBkb3dubG9hZCAleFxuIiwKKwkJcHJfZGVidWcoIlByZXAgTGliIGRvd25sb2FkICV4XG4iLAogCQkJCW1zZy0+aGVhZGVyLnBhcnQubXNnX2lkKTsKIAkJaWYgKHN0cl90eXBlLT5yZXN1bHQpCi0JCQlwcl9lcnIoInNzdDogUHJlcCBsaWIgZG93bmxvYWQgJXhcbiIsIHN0cl90eXBlLT5yZXN1bHQpOworCQkJcHJfZXJyKCJQcmVwIGxpYiBkb3dubG9hZCAleFxuIiwgc3RyX3R5cGUtPnJlc3VsdCk7CiAJCWVsc2UKLQkJCXByX2RlYnVnKCJzc3Q6IENhbiBkb3dubG9hZCBjb2RlYyBub3cuLi5cbiIpOworCQkJcHJfZGVidWcoIkNhbiBkb3dubG9hZCBjb2RlYyBub3cuLi5cbiIpOwogCQlzc3Rfd2FrZV91cF9hbGxvY19ibG9jayhzc3RfZHJ2X2N0eCwgc3RyX2lkLAogCQkJCXN0cl90eXBlLT5yZXN1bHQsIE5VTEwpOwogCQlicmVhazsKQEAgLTYwOSwxMiArNjYxLDEyIEBACiAJCQkoc3RydWN0IHNuZF9zc3RfbGliX2Rvd25sb2FkX2luZm8gKiltc2ctPm1haWxib3g7CiAJCWludCByZXR2YWwgPSByZXNwLT5yZXN1bHQ7CiAKLQkJcHJfZGVidWcoInNzdDogTGliIGRvd25sb2FkZWQgJXhcbiIsIG1zZy0+aGVhZGVyLnBhcnQubXNnX2lkKTsKKwkJcHJfZGVidWcoIkxpYiBkb3dubG9hZGVkICV4XG4iLCBtc2ctPmhlYWRlci5wYXJ0Lm1zZ19pZCk7CiAJCWlmIChyZXNwLT5yZXN1bHQpIHsKLQkJCXByX2Vycigic3N0OiBlcnIgaW4gbGliIGRsb2FkICV4XG4iLCByZXNwLT5yZXN1bHQpOworCQkJcHJfZXJyKCJlcnIgaW4gbGliIGRsb2FkICV4XG4iLCByZXNwLT5yZXN1bHQpOwogCQl9IGVsc2UgewotCQkJcHJfZGVidWcoInNzdDogQ29kZWMgZG93bmxvYWQgY29tcGxldGUuLi5cbiIpOwotCQkJcHJfZGVidWcoInNzdDogY29kZWMgVHlwZSAlZCBWZXIgJWQgQnVpbHQgJXM6ICVzXG4iLAorCQkJcHJfZGVidWcoIkNvZGVjIGRvd25sb2FkIGNvbXBsZXRlLi4uXG4iKTsKKwkJCXByX2RlYnVnKCJjb2RlYyBUeXBlICVkIFZlciAlZCBCdWlsdCAlczogJXNcbiIsCiAJCQkJcmVzcC0+ZGxvYWRfbGliLmxpYl9pbmZvLmxpYl90eXBlLAogCQkJCXJlc3AtPmRsb2FkX2xpYi5saWJfaW5mby5saWJfdmVyc2lvbiwKIAkJCQlyZXNwLT5kbG9hZF9saWIubGliX2luZm8uYl9kYXRlLApAQCAtNjM5LDE3ICs2OTEsMTcgQEAKIAljYXNlIElQQ19JQV9HRVRfRldfQlVJTERfSU5GOiB7CiAJCXN0cnVjdCBzc3RfZndfYnVpbGRfaW5mbyAqYnVpbGQgPQogCQkJKHN0cnVjdCBzc3RfZndfYnVpbGRfaW5mbyAqKW1zZy0+bWFpbGJveDsKLQkJcHJfZGVidWcoInNzdDogQnVpbGQgZGF0ZTolc1RpbWU6JXMiLCBidWlsZC0+ZGF0ZSwgYnVpbGQtPnRpbWUpOworCQlwcl9kZWJ1ZygiQnVpbGQgZGF0ZTolc1RpbWU6JXMiLCBidWlsZC0+ZGF0ZSwgYnVpbGQtPnRpbWUpOwogCQlicmVhazsKIAl9CiAJY2FzZSBJUENfSUFfU0VUX1BNSUNfVFlQRToKIAkJYnJlYWs7CiAJY2FzZSBJUENfSUFfU1RBUlRfU1RSRUFNOgotCQlwcl9kZWJ1Zygic3N0OiByZXBseSBmb3IgU1RBUlQgU1RSRUFNICV4XG4iLCBtc2ctPmhlYWRlci5mdWxsKTsKKwkJcHJfZGVidWcoInJlcGx5IGZvciBTVEFSVCBTVFJFQU0gJXhcbiIsIG1zZy0+aGVhZGVyLmZ1bGwpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQkvKiBJbGxlZ2FsIGNhc2UgKi8KLQkJcHJfZXJyKCJzc3Q6IHByb2Nlc3MgcmVwbHk6ZGVmYXVsdCA9ICV4XG4iLCBtc2ctPmhlYWRlci5mdWxsKTsKKwkJcHJfZXJyKCJwcm9jZXNzIHJlcGx5OmRlZmF1bHQgPSAleFxuIiwgbXNnLT5oZWFkZXIuZnVsbCk7CiAJfQogCXNzdF9jbGVhcl9pbnRlcnJ1cHQoKTsKIAlyZXR1cm47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9wdnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0X3B2dC5jCmluZGV4IDY0ODdlMTkuLjAxZjhjM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0X3B2dC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0X3B2dC5jCkBAIC0yOSw2ICsyOSw4IEBACiAgKiAgVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCBwcml2YXRlIGZ1bmN0aW9ucwogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KQEAgLTYwLDcgKzYyLDcgQEAKIAkJfQogCX0KIAlpZiAoaSA9PSBNQVhfQUNUSVZFX1NUUkVBTSkgewotCQlwcl9lcnIoInNzdDogbWF4IGFsbG9jX3N0cmVhbSByZWFjaGVkIik7CisJCXByX2VycigibWF4IGFsbG9jX3N0cmVhbSByZWFjaGVkXG4iKTsKIAkJaSA9IC1FQlVTWTsgLyogYWN0aXZlIHN0cmVhbSBsaW1pdCByZWFjaGVkICovCiAJfQogCXJldHVybiBpOwpAQCAtODQsMTQgKzg2LDE0IEBACiAJCQkJYmxvY2stPmNvbmRpdGlvbikpIHsKIAkJLyogZXZlbnQgd2FrZSAqLwogCQlpZiAoYmxvY2stPnJldF9jb2RlIDwgMCkgewotCQkJcHJfZXJyKCJzc3Q6IHN0cmVhbSBmYWlsZWQgJWRcbiIsIGJsb2NrLT5yZXRfY29kZSk7CisJCQlwcl9lcnIoInN0cmVhbSBmYWlsZWQgJWRcbiIsIGJsb2NrLT5yZXRfY29kZSk7CiAJCQlyZXR2YWwgPSAtRUJVU1k7CiAJCX0gZWxzZSB7Ci0JCQlwcl9kZWJ1Zygic3N0OiBldmVudCB1cFxuIik7CisJCQlwcl9kZWJ1ZygiZXZlbnQgdXBcbiIpOwogCQkJcmV0dmFsID0gMDsKIAkJfQogCX0gZWxzZSB7Ci0JCXByX2Vycigic3N0OiBzaWduYWwgaW50ZXJydXB0ZWRcbiIpOworCQlwcl9lcnIoInNpZ25hbCBpbnRlcnJ1cHRlZFxuIik7CiAJCXJldHZhbCA9IC1FSU5UUjsKIAl9CiAJcmV0dXJuIHJldHZhbDsKQEAgLTExNSwxOCArMTE3LDE4IEBACiB7CiAJaW50IHJldHZhbCA9IDA7CiAKLQlwcl9kZWJ1Zygic3N0OiBzc3Rfd2FpdF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQgLSB3YWl0aW5nLi4uLlxuIik7CisJcHJfZGVidWcoInNzdF93YWl0X2ludGVycnVwdGlibGVfdGltZW91dCAtIHdhaXRpbmcuLi4uXG4iKTsKIAlpZiAod2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoc3N0X2Rydl9jdHgtPndhaXRfcXVldWUsCiAJCQkJCQlibG9jay0+Y29uZGl0aW9uLAogCQkJCQkJbXNlY3NfdG9famlmZmllcyh0aW1lb3V0KSkpIHsKIAkJaWYgKGJsb2NrLT5yZXRfY29kZSA8IDApCi0JCQlwcl9lcnIoInNzdDogc3RyZWFtIGZhaWxlZCAlZFxuIiwgYmxvY2stPnJldF9jb2RlKTsKKwkJCXByX2Vycigic3RyZWFtIGZhaWxlZCAlZFxuIiwgYmxvY2stPnJldF9jb2RlKTsKIAkJZWxzZQotCQkJcHJfZGVidWcoInNzdDogZXZlbnQgdXBcbiIpOworCQkJcHJfZGVidWcoImV2ZW50IHVwXG4iKTsKIAkJcmV0dmFsID0gYmxvY2stPnJldF9jb2RlOwogCX0gZWxzZSB7CiAJCWJsb2NrLT5vbiA9IGZhbHNlOwotCQlwcl9lcnIoInNzdDogdGltZW91dCBvY2N1cmVkLi4uXG4iKTsKKwkJcHJfZXJyKCJ0aW1lb3V0IG9jY3VycmVkLi4uXG4iKTsKIAkJLypzZXR0aW5nIGZpcm13YXJlIHN0YXRlIGFzIHVuaW5pdCBzbyB0aGF0IHRoZQogCQlmaXJtd2FyZSB3aWxsIGdldCByZS1kb3dubG9hZGVkIG9uIG5leHQgcmVxdWVzdAogCQl0aGlzIGlzIGJlY2F1c2UgZmlybWFyZSBub3QgcmVzcG9uZGluZyBmb3IgNSBzZWMKQEAgLTE1NiwxOCArMTU4LDE4IEBACiAJLyogTk9URToKIAlPYnNlcnZlZCB0aGF0IEZXIHByb2Nlc3NlcyB0aGUgYWxsb2MgbXNnIGFuZCByZXBsaWVzIGV2ZW4KIAliZWZvcmUgdGhlIGFsbG9jIHRocmVhZCBoYXMgZmluaXNoZWQgZXhlY3V0aW9uICovCi0JcHJfZGVidWcoInNzdDogd2FpdGluZyBmb3IgJXgsIGNvbmRpdGlvbiAleFxuIiwKKwlwcl9kZWJ1Zygid2FpdGluZyBmb3IgJXgsIGNvbmRpdGlvbiAleFxuIiwKIAkJICAgICAgIGJsb2NrLT5zc3RfaWQsIGJsb2NrLT5vcHNfYmxvY2suY29uZGl0aW9uKTsKIAlpZiAod2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoc3N0X2Rydl9jdHgtPndhaXRfcXVldWUsCiAJCQkJYmxvY2stPm9wc19ibG9jay5jb25kaXRpb24sCiAJCQkJbXNlY3NfdG9famlmZmllcyhTU1RfQkxPQ0tfVElNRU9VVCkpKSB7CiAJCS8qIGV2ZW50IHdha2UgKi8KLQkJcHJfZGVidWcoInNzdDogRXZlbnQgd2FrZSAleFxuIiwgYmxvY2stPm9wc19ibG9jay5jb25kaXRpb24pOwotCQlwcl9kZWJ1Zygic3N0OiBtZXNzYWdlIHJldDogJWRcbiIsIGJsb2NrLT5vcHNfYmxvY2sucmV0X2NvZGUpOworCQlwcl9kZWJ1ZygiRXZlbnQgd2FrZSAleFxuIiwgYmxvY2stPm9wc19ibG9jay5jb25kaXRpb24pOworCQlwcl9kZWJ1ZygibWVzc2FnZSByZXQ6ICVkXG4iLCBibG9jay0+b3BzX2Jsb2NrLnJldF9jb2RlKTsKIAkJcmV0dmFsID0gYmxvY2stPm9wc19ibG9jay5yZXRfY29kZTsKIAl9IGVsc2UgewogCQlibG9jay0+b3BzX2Jsb2NrLm9uID0gZmFsc2U7Ci0JCXByX2Vycigic3N0OiBXYWl0IHRpbWVkLW91dCAleFxuIiwgYmxvY2stPm9wc19ibG9jay5jb25kaXRpb24pOworCQlwcl9lcnIoIldhaXQgdGltZWQtb3V0ICV4XG4iLCBibG9jay0+b3BzX2Jsb2NrLmNvbmRpdGlvbik7CiAJCS8qIHNldHRpZ24gZmlybXdhcmUgc3RhdGUgYXMgdW5pbml0IHNvIHRoYXQgdGhlCiAJCWZpcm13YXJlIHdpbGwgZ2V0IHJlZG93bmxvYWRlZCBvbiBuZXh0IHJlcXVlc3QKIAkJdGhpcyBpcyBiZWNhdXNlIGZpcm1hcmUgbm90IHJlc3BvbmRpbmcgZm9yIDUgc2VjCkBAIC0xOTIsMTQgKzE5NCwxNCBAQAogCiAJbXNnID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGlwY19wb3N0KSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFtc2cpIHsKLQkJcHJfZXJyKCJzc3Q6IGt6YWxsb2MgbXNnIGZhaWxlZFxuIik7CisJCXByX2Vycigia3phbGxvYyBtc2cgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCiAJbXNnLT5tYWlsYm94X2RhdGEgPSBremFsbG9jKFNTVF9NQUlMQk9YX1NJWkUsIEdGUF9BVE9NSUMpOwogCWlmICghbXNnLT5tYWlsYm94X2RhdGEpIHsKIAkJa2ZyZWUobXNnKTsKLQkJcHJfZXJyKCJzc3Q6IGt6YWxsb2MgbWFpbGJveF9kYXRhIGZhaWxlZCIpOworCQlwcl9lcnIoImt6YWxsb2MgbWFpbGJveF9kYXRhIGZhaWxlZCIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9OwogCSphcmcgPSBtc2c7CkBAIC0yMTksNyArMjIxLDcgQEAKIAogCW1zZyA9IGt6YWxsb2Moc2l6ZW9mKCptc2cpLCBHRlBfQVRPTUlDKTsKIAlpZiAoIW1zZykgewotCQlwcl9lcnIoInNzdDoga3phbGxvYyBtc2cgZmFpbGVkXG4iKTsKKwkJcHJfZXJyKCJremFsbG9jIG1zZyBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJbXNnLT5tYWlsYm94X2RhdGEgPSBOVUxMOwpAQCAtMjkwLDEwICsyOTIsMTAgQEAKIAlzdHJ1Y3QgaXBjX3Bvc3QgKm1zZyA9IE5VTEw7CiAKIAlpZiAoc3N0X2NyZWF0ZV9zaG9ydF9tc2coJm1zZykpIHsKLQkJcHJfZXJyKCJzc3Q6IG1lbSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXByX2VycigibWVtIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCX0KLQlwcl9kZWJ1Zygic3N0OiBpcGMgbWVzc2FnZSBzZW5kaW5nOiBFTkFCTEVfUlhfVElNRV9TTE9UXG4iKTsKKwlwcl9kZWJ1ZygiaXBjIG1lc3NhZ2Ugc2VuZGluZzogRU5BQkxFX1JYX1RJTUVfU0xPVFxuIik7CiAJc3N0X2ZpbGxfaGVhZGVyKCZtc2ctPmhlYWRlciwgSVBDX0lBX0VOQUJMRV9SWF9USU1FX1NMT1QsIDAsIDApOwogCW1zZy0+aGVhZGVyLnBhcnQuZGF0YSA9IHN0YXR1czsKIAlzc3RfZHJ2X2N0eC0+aHNfaW5mb19ibGsuY29uZGl0aW9uID0gZmFsc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9zdHJlYW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0X3N0cmVhbS5jCmluZGV4IGIyYzRiNzAuLjc5NWU0MmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0X3N0cmVhbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0X3N0cmVhbS5jCkBAIC0yNiw2ICsyNiw4IEBACiAgKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBzdHJlYW0gb3BlcmF0aW9ucyBvZiBTU1QgZHJpdmVyCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgpAQCAtNDUsOCArNDcsOCBAQAogICovCiBpbnQgc3N0X2NoZWNrX2RldmljZV90eXBlKHUzMiBkZXZpY2UsIHUzMiBudW1fY2hhbiwgdTMyICpwY21fc2xvdCkKIHsKLQlpZiAoZGV2aWNlID49IE1BWF9OVU1fU1RSRUFNUykgewotCQlwcl9kZWJ1Zygic3N0OiBkZXZpY2UgdHlwZSBpbnZhbGlkICVkXG4iLCBkZXZpY2UpOworCWlmIChkZXZpY2UgPiBNQVhfTlVNX1NUUkVBTVNfTUZMRCkgeworCQlwcl9kZWJ1ZygiZGV2aWNlIHR5cGUgaW52YWxpZCAlZFxuIiwgZGV2aWNlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWlmIChzc3RfZHJ2X2N0eC0+c3RyZWFtc1tkZXZpY2VdLnN0YXR1cyA9PSBTVFJFQU1fVU5fSU5JVCkgewpAQCAtNzEsMTUgKzczLDE1IEBACiAJCWVsc2UgaWYgKGRldmljZSA9PSBTTkRfU1NUX0RFVklDRV9DQVBUVVJFICYmIG51bV9jaGFuID09IDQpCiAJCQkqcGNtX3Nsb3QgPSAweDBGOwogCQllbHNlIHsKLQkJCXByX2RlYnVnKCJzc3Q6IE5vIGNvbmRpdGlvbiBzYXRpc2ZpZWQuLiByZXQgZXJyXG4iKTsKKwkJCXByX2RlYnVnKCJObyBjb25kaXRpb24gc2F0aXNmaWVkLi4gcmV0IGVyclxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0gZWxzZSB7Ci0JCXByX2RlYnVnKCJzc3Q6IHRoaXMgc3RyZWFtIHN0YXRlIGlzIG5vdCB1bmktaW5pdCwgaXMgJWRcbiIsCisJCXByX2RlYnVnKCJ0aGlzIHN0cmVhbSBzdGF0ZSBpcyBub3QgdW5pLWluaXQsIGlzICVkXG4iLAogCQkJCXNzdF9kcnZfY3R4LT5zdHJlYW1zW2RldmljZV0uc3RhdHVzKTsKIAkJcmV0dXJuIC1FQkFEUlFDOwogCX0KLQlwcl9kZWJ1Zygic3N0OiByZXR1cm5pbmcgc2xvdCAleFxuIiwgKnBjbV9zbG90KTsKKwlwcl9kZWJ1ZygicmV0dXJuaW5nIHNsb3QgJXhcbiIsICpwY21fc2xvdCk7CiAJcmV0dXJuIDA7CiB9CiAvKioKQEAgLTk2LDcgKzk4LDcgQEAKIAkJaWYgKHNzdF9kcnZfY3R4LT5zdHJlYW1zW2ldLnN0YXR1cyA9PSBTVFJFQU1fVU5fSU5JVCkKIAkJCXJldHVybiBpOwogCX0KLQlwcl9kZWJ1Zygic3N0OiBEaWRudCBmaW5kIGVtcHR5IHN0cmVhbSBmb3IgbXJzdFxuIik7CisJcHJfZGVidWcoIkRpZG50IGZpbmQgZW1wdHkgc3RyZWFtIGZvciBtcnN0XG4iKTsKIAlyZXR1cm4gLUVCVVNZOwogfQogCkBAIC0zMDUsNyArMzA3LDcgQEAKIAkJaWYgKHN0cl9pbmZvLT5wcmV2ID09IFNUUkVBTV9VTl9JTklUKQogCQkJcmV0dXJuIC1FQkFEUlFDOwogCQlpZiAoc3RyX2luZm8tPmN0cmxfYmxrLm9uID09IHRydWUpIHsKLQkJCXByX2VycigiU1NUIEVSUjogY29udHJvbCBwYXRoIGlzIGluIHVzZVxuICIpOworCQkJcHJfZXJyKCJTU1QgRVJSOiBjb250cm9sIHBhdGggaXMgaW4gdXNlXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCWlmIChzc3RfY3JlYXRlX3Nob3J0X21zZygmbXNnKSkKQEAgLTMzMyw3ICszMzUsNyBAQAogCQl9CiAJfSBlbHNlIHsKIAkJcmV0dmFsID0gLUVCQURSUUM7Ci0JCXByX2VycigiU1NUIEVSUjpCQURRUkMgZm9yIHN0cmVhbVxuICIpOworCQlwcl9lcnIoIlNTVCBFUlI6IEJBRFFSQyBmb3Igc3RyZWFtXG4iKTsKIAl9CiAKIAlyZXR1cm4gcmV0dmFsOwpAQCAtNDY4LDcgKzQ3MCw3IEBACiAJCX0KIAl9IGVsc2UgewogCQlyZXR2YWwgPSAtRUJBRFJRQzsKLQkJcHJfZXJyKCJTU1QgRVJSOkJBRFFSQyBmb3Igc3RyZWFtXG4iKTsKKwkJcHJfZXJyKCJTU1QgRVJSOiBCQURRUkMgZm9yIHN0cmVhbVxuIik7CiAJfQogCXJldHVybiByZXR2YWw7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9zdHJlYW1fZW5jb2RlZC5jIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3Rfc3RyZWFtX2VuY29kZWQuYwppbmRleCA1YzQ1NTYwLi44NTc4OWJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9zdHJlYW1fZW5jb2RlZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0X3N0cmVhbV9lbmNvZGVkLmMKQEAgLTI2LDEzICsyNiwxNSBAQAogICogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgc3RyZWFtIG9wZXJhdGlvbnMgb2YgU1NUIGRyaXZlcgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3Jhcl9yZWdpc3Rlci5oPgogI2lmZGVmIENPTkZJR19NUlNUX1JBUl9IQU5ETEVSCi0jaW5jbHVkZSAiLi4vLi4vLi4vZHJpdmVycy9zdGFnaW5nL21lbXJhci9tZW1yYXIuaCIKKyNpbmNsdWRlIDxsaW51eC9yYXJfcmVnaXN0ZXIuaD4KKyNpbmNsdWRlICIuLi9tZW1yYXIvbWVtcmFyLmgiCiAjZW5kaWYKICNpbmNsdWRlICJpbnRlbF9zc3RfaW9jdGwuaCIKICNpbmNsdWRlICJpbnRlbF9zc3QuaCIKQEAgLTUzLDcgKzU1LDcgQEAKIAlzdHJ1Y3Qgc3RyZWFtX2luZm8gKnN0cl9pbmZvOwogCXN0cnVjdCBzbmRfc3N0X2Z3X2dldF9zdHJlYW1fcGFyYW1zICpmd19wYXJhbXM7CiAKLQlwcl9kZWJ1Zygic3N0OiBnZXRfc3RyZWFtIGZvciAlZFxuIiwgc3RyX2lkKTsKKwlwcl9kZWJ1ZygiZ2V0X3N0cmVhbSBmb3IgJWRcbiIsIHN0cl9pZCk7CiAJcmV0dmFsID0gc3N0X3ZhbGlkYXRlX3N0cmlkKHN0cl9pZCk7CiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKQEAgLTYxLDE2ICs2MywxNiBAQAogCXN0cl9pbmZvID0gJnNzdF9kcnZfY3R4LT5zdHJlYW1zW3N0cl9pZF07CiAJaWYgKHN0cl9pbmZvLT5zdGF0dXMgIT0gU1RSRUFNX1VOX0lOSVQpIHsKIAkJaWYgKHN0cl9pbmZvLT5jdHJsX2Jsay5vbiA9PSB0cnVlKSB7Ci0JCQlwcl9lcnIoInNzdDogY29udHJvbCBwYXRoIGluIHVzZVxuIik7CisJCQlwcl9lcnIoImNvbnRyb2wgcGF0aCBpbiB1c2VcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJaWYgKHNzdF9jcmVhdGVfc2hvcnRfbXNnKCZtc2cpKSB7Ci0JCQlwcl9lcnIoInNzdDogbWVzc2FnZSBjcmVhdGlvbiBmYWlsZWRcbiIpOworCQkJcHJfZXJyKCJtZXNzYWdlIGNyZWF0aW9uIGZhaWxlZFxuIik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCQlmd19wYXJhbXMgPSBremFsbG9jKHNpemVvZigqZndfcGFyYW1zKSwgR0ZQX0FUT01JQyk7CiAJCWlmICghZndfcGFyYW1zKSB7Ci0JCQlwcl9lcnIoInNzdDogbWVtIGFsbGNvYXRpb24gZmFpbGVkXG4gIik7CisJCQlwcl9lcnIoIm1lbSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CiAJCQlrZnJlZShtc2cpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KQEAgLTEwNCw3ICsxMDYsNyBAQAogCQlnZXRfcGFyYW1zLT5jb2RlY19wYXJhbXMuc3RyZWFtX3R5cGUgPSBzdHJfaW5mby0+c3RyX3R5cGU7CiAJCWtmcmVlKGZ3X3BhcmFtcyk7CiAJfSBlbHNlIHsKLQkJcHJfZGVidWcoInNzdDogU3RyZWFtIGlzIG5vdCBpbiB0aGUgaW5pdCBzdGF0ZVxuIik7CisJCXByX2RlYnVnKCJTdHJlYW0gaXMgbm90IGluIHRoZSBpbml0IHN0YXRlXG4iKTsKIAl9CiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTEyNSwxNyArMTI3LDE3IEBACiAKIAlCVUdfT04oIXN0cl9wYXJhbSk7CiAJaWYgKHNzdF9kcnZfY3R4LT5zdHJlYW1zW3N0cl9pZF0ub3BzICE9IHN0cl9wYXJhbS0+b3BzKSB7Ci0JCXByX2Vycigic3N0OiBJbnZhbGlkIG9wZXJhdGlvblxuIik7CisJCXByX2VycigiSW52YWxpZCBvcGVyYXRpb25cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJcmV0dmFsID0gc3N0X3ZhbGlkYXRlX3N0cmlkKHN0cl9pZCk7CiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKLQlwcl9kZWJ1Zygic3N0OiBzZXRfc3RyZWFtIGZvciAlZFxuIiwgc3RyX2lkKTsKKwlwcl9kZWJ1Zygic2V0X3N0cmVhbSBmb3IgJWRcbiIsIHN0cl9pZCk7CiAJc3RyX2luZm8gPSAgJnNzdF9kcnZfY3R4LT5zdHJlYW1zW3N0cl9pZF07CiAJaWYgKHNzdF9kcnZfY3R4LT5zdHJlYW1zW3N0cl9pZF0uc3RhdHVzID09IFNUUkVBTV9JTklUKSB7CiAJCWlmIChzdHJfaW5mby0+Y3RybF9ibGsub24gPT0gdHJ1ZSkgewotCQkJcHJfZXJyKCJzc3Q6IGNvbnRyb2wgcGF0aCBpbiB1c2VcbiIpOworCQkJcHJfZXJyKCJjb250cm9sIHBhdGggaW4gdXNlXG4iKTsKIAkJCXJldHVybiAtRUFHQUlOOwogCQl9CiAJCWlmIChzc3RfY3JlYXRlX2xhcmdlX21zZygmbXNnKSkKQEAgLTE2Myw3ICsxNjUsNyBAQAogCQl9CiAJfSBlbHNlIHsKIAkJcmV0dmFsID0gLUVCQURSUUM7Ci0JCXByX2Vycigic3N0OiBCQURRUkMgZm9yIHN0cmVhbVxuIik7CisJCXByX2VycigiQkFEUVJDIGZvciBzdHJlYW1cbiIpOwogCX0KIAlyZXR1cm4gcmV0dmFsOwogfQpAQCAtMTgzLDcgKzE4NSw3IEBACiAJc3RydWN0IHNuZF9zc3Rfdm9sICpmd19nZXRfdm9sOwogCWludCBzdHJfaWQgPSBnZXRfdm9sLT5zdHJlYW1faWQ7CiAKLQlwcl9kZWJ1Zygic3N0OiBnZXQgdm9sIGNhbGxlZFxuIik7CisJcHJfZGVidWcoImdldCB2b2wgY2FsbGVkXG4iKTsKIAogCWlmIChzc3RfY3JlYXRlX3Nob3J0X21zZygmbXNnKSkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0xOTUsNyArMTk3LDcgQEAKIAlzc3RfZHJ2X2N0eC0+dm9sX2luZm9fYmxrLm9uID0gdHJ1ZTsKIAlmd19nZXRfdm9sID0ga3phbGxvYyhzaXplb2YoKmZ3X2dldF92b2wpLCBHRlBfQVRPTUlDKTsKIAlpZiAoIWZ3X2dldF92b2wpIHsKLQkJcHJfZXJyKCJzc3Q6IG1lbSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXByX2VycigibWVtIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKIAkJa2ZyZWUobXNnKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMjA5LDEwICsyMTEsMTAgQEAKIAlpZiAocmV0dmFsKQogCQlyZXR2YWwgPSAtRUlPOwogCWVsc2UgewotCQlwcl9kZWJ1Zygic3N0OiBzdHJlYW0gaWQgJWRcbiIsIGZ3X2dldF92b2wtPnN0cmVhbV9pZCk7Ci0JCXByX2RlYnVnKCJzc3Q6IHZvbHVtZSAlZFxuIiwgZndfZ2V0X3ZvbC0+dm9sdW1lKTsKLQkJcHJfZGVidWcoInNzdDogcmFtcCBkdXJhdGlvbiAlZFxuIiwgZndfZ2V0X3ZvbC0+cmFtcF9kdXJhdGlvbik7Ci0JCXByX2RlYnVnKCJzc3Q6IHJhbXBfdHlwZSAlZFxuIiwgZndfZ2V0X3ZvbC0+cmFtcF90eXBlKTsKKwkJcHJfZGVidWcoInN0cmVhbSBpZCAlZFxuIiwgZndfZ2V0X3ZvbC0+c3RyZWFtX2lkKTsKKwkJcHJfZGVidWcoInZvbHVtZSAlZFxuIiwgZndfZ2V0X3ZvbC0+dm9sdW1lKTsKKwkJcHJfZGVidWcoInJhbXAgZHVyYXRpb24gJWRcbiIsIGZ3X2dldF92b2wtPnJhbXBfZHVyYXRpb24pOworCQlwcl9kZWJ1ZygicmFtcF90eXBlICVkXG4iLCBmd19nZXRfdm9sLT5yYW1wX3R5cGUpOwogCQltZW1jcHkoZ2V0X3ZvbCwgZndfZ2V0X3ZvbCwgc2l6ZW9mKCpmd19nZXRfdm9sKSk7CiAJfQogCXJldHVybiByZXR2YWw7CkBAIC0yMzEsMTAgKzIzMywxMCBAQAogCWludCByZXR2YWwgPSAwOwogCXN0cnVjdCBpcGNfcG9zdCAqbXNnID0gTlVMTDsKIAotCXByX2RlYnVnKCJzc3Q6IHNldCB2b2wgY2FsbGVkXG4iKTsKKwlwcl9kZWJ1Zygic2V0IHZvbCBjYWxsZWRcbiIpOwogCiAJaWYgKHNzdF9jcmVhdGVfbGFyZ2VfbXNnKCZtc2cpKSB7Ci0JCXByX2Vycigic3N0OiBtZXNzYWdlIGNyZWF0aW9uIGZhaWxlZFxuIik7CisJCXByX2VycigibWVzc2FnZSBjcmVhdGlvbiBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJc3N0X2ZpbGxfaGVhZGVyKCZtc2ctPmhlYWRlciwgSVBDX0lBX1NFVF9TVFJFQU1fVk9MLCAxLApAQCAtMjU0LDcgKzI1Niw3IEBACiAJcmV0dmFsID0gc3N0X3dhaXRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHNzdF9kcnZfY3R4LAogCQkJJnNzdF9kcnZfY3R4LT52b2xfaW5mb19ibGssIFNTVF9CTE9DS19USU1FT1VUKTsKIAlpZiAocmV0dmFsKSB7Ci0JCXByX2Vycigic3N0OiBlcnJvciBpbiBzZXRfdm9sID0gJWRcbiIsIHJldHZhbCk7CisJCXByX2VycigiZXJyb3IgaW4gc2V0X3ZvbCA9ICVkXG4iLCByZXR2YWwpOwogCQlyZXR2YWwgPSAtRUlPOwogCX0KIAlyZXR1cm4gcmV0dmFsOwpAQCAtMjczLDEwICsyNzUsMTAgQEAKIAlpbnQgcmV0dmFsID0gMDsKIAlzdHJ1Y3QgaXBjX3Bvc3QgKm1zZyA9IE5VTEw7CiAKLQlwcl9kZWJ1Zygic3N0OiBzZXQgbXV0ZSBjYWxsZWRcbiIpOworCXByX2RlYnVnKCJzZXQgbXV0ZSBjYWxsZWRcbiIpOwogCiAJaWYgKHNzdF9jcmVhdGVfbGFyZ2VfbXNnKCZtc2cpKSB7Ci0JCXByX2Vycigic3N0OiBtZXNzYWdlIGNyZWF0aW9uIGZhaWxlZFxuIik7CisJCXByX2VycigibWVzc2FnZSBjcmVhdGlvbiBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJc3N0X2ZpbGxfaGVhZGVyKCZtc2ctPmhlYWRlciwgSVBDX0lBX1NFVF9TVFJFQU1fTVVURSwgMSwKQEAgLTI5Nyw3ICsyOTksNyBAQAogCXJldHZhbCA9IHNzdF93YWl0X2ludGVycnVwdGlibGVfdGltZW91dChzc3RfZHJ2X2N0eCwKIAkJCSZzc3RfZHJ2X2N0eC0+bXV0ZV9pbmZvX2JsaywgU1NUX0JMT0NLX1RJTUVPVVQpOwogCWlmIChyZXR2YWwpIHsKLQkJcHJfZXJyKCJzc3Q6IGVycm9yIGluIHNldF9tdXRlID0gJWRcbiIsIHJldHZhbCk7CisJCXByX2VycigiZXJyb3IgaW4gc2V0X211dGUgPSAlZFxuIiwgcmV0dmFsKTsKIAkJcmV0dmFsID0gLUVJTzsKIAl9CiAJcmV0dXJuIHJldHZhbDsKQEAgLTM1OCwyMCArMzYwLDIwIEBACiAJCXNsb3QtPmRldmljZV90eXBlID09IFNORF9TU1RfREVWSUNFX1BDTSkgewogCQkJcmV0dmFsID0gc3N0X2FjdGl2YXRlX3RhcmdldChzbG90KTsKIAkJCWlmIChyZXR2YWwpCi0JCQkJcHJfZXJyKCJzc3Q6IFNTVF9BY3RpdmF0ZV90YXJnZXRfZmFpbFxuIik7CisJCQkJcHJfZXJyKCJTU1RfQWN0aXZhdGVfdGFyZ2V0X2ZhaWxcbiIpOwogCQkJZWxzZQotCQkJCXByX2Vycigic3N0OiBTU1RfQWN0aXZhdGVfdGFyZ2V0X3Bhc3NcbiIpOworCQkJCXByX2VycigiU1NUX0FjdGl2YXRlX3RhcmdldF9wYXNzXG4iKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9IGVsc2UgaWYgKHNsb3QtPmFjdGlvbiA9PSBTTkRfU1NUX1BPUlRfUFJFUEFSRSAmJgogCQkJc2xvdC0+ZGV2aWNlX3R5cGUgPT0gU05EX1NTVF9ERVZJQ0VfUENNKSB7CiAJCQkJcmV0dmFsID0gc3N0X3ByZXBhcmVfdGFyZ2V0KHNsb3QpOwogCQkJaWYgKHJldHZhbCkKLQkJCQlwcl9lcnIoInNzdDogU1NUX3ByZXBhcmVfdGFyZ2V0X2ZhaWxcbiIpOworCQkJCXByX2VycigiU1NUX3ByZXBhcmVfdGFyZ2V0X2ZhaWxcbiIpOwogCQkJZWxzZQotCQkJCXByX2Vycigic3N0OiBTU1RfcHJlcGFyZV90YXJnZXRfcGFzc1xuIik7CisJCQkJcHJfZXJyKCJTU1RfcHJlcGFyZV90YXJnZXRfcGFzc1xuIik7CiAJCQlyZXR1cm4gcmV0dmFsOwogCX0gZWxzZSB7Ci0JCXByX2Vycigic3N0OiBzbG90X2FjdGlvbiA6ICVkLCBkZXZpY2VfdHlwZTogJWRcbiIsCisJCXByX2Vycigic2xvdF9hY3Rpb24gOiAlZCwgZGV2aWNlX3R5cGU6ICVkXG4iLAogCQkJCXNsb3QtPmFjdGlvbiwgc2xvdC0+ZGV2aWNlX3R5cGUpOwogCQlyZXR1cm4gcmV0dmFsOwogCX0KQEAgLTM4Myw3ICszODUsNyBAQAogCXN0cnVjdCBpcGNfcG9zdCAqbXNnOwogCiAJaWYgKHNzdF9jcmVhdGVfbGFyZ2VfbXNnKCZtc2cpKSB7Ci0JCXByX2Vycigic3N0OiBtZXNzYWdlIGNyZWF0aW9uIGZhaWxlZFxuIik7CisJCXByX2VycigibWVzc2FnZSBjcmVhdGlvbiBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJc3N0X2ZpbGxfaGVhZGVyKCZtc2ctPmhlYWRlciwgSVBDX0lBX1RBUkdFVF9ERVZfU0VMRUNULCAxLCAwKTsKQEAgLTM5OSwxMSArNDAxLDExIEBACiAJbGlzdF9hZGRfdGFpbCgmbXNnLT5ub2RlLCAmc3N0X2Rydl9jdHgtPmlwY19kaXNwYXRjaF9saXN0KTsKIAlzcGluX3VubG9jaygmc3N0X2Rydl9jdHgtPmxpc3Rfc3Bpbl9sb2NrKTsKIAlzc3RfcG9zdF9tZXNzYWdlKCZzc3RfZHJ2X2N0eC0+aXBjX3Bvc3RfbXNnX3dxKTsKLQlwcl9kZWJ1Zygic3N0OiBtZXNzYWdlIHNlbnQtIHdhaXRpbmdcbiIpOworCXByX2RlYnVnKCJtZXNzYWdlIHNlbnQtIHdhaXRpbmdcbiIpOwogCXJldHZhbCA9IHNzdF93YWl0X2ludGVycnVwdGlibGVfdGltZW91dChzc3RfZHJ2X2N0eCwKIAkJCSZzc3RfZHJ2X2N0eC0+dGd0X2Rldl9ibGssIFRBUkdFVF9ERVZfQkxPQ0tfVElNRU9VVCk7CiAJaWYgKHJldHZhbCkKLQkJcHJfZXJyKCJzc3Q6IHRhcmdldCBkZXZpY2UgaXBjIGZhaWxlZCA9IDB4JXhcbiIsIHJldHZhbCk7CisJCXByX2VycigidGFyZ2V0IGRldmljZSBpcGMgZmFpbGVkID0gMHgleFxuIiwgcmV0dmFsKTsKIAlyZXR1cm4gcmV0dmFsOwogCiB9CkBAIC00MzksNyArNDQxLDcgQEAKIAkJCQkJZ290byBlcnI7CiAJCQl9IGVsc2UgewogZXJyOgotCQkJCXByX2Vycigic3N0OiBpL3AgcGFyYW1zIGluY29ycmVjdFxuIik7CisJCQkJcHJfZXJyKCJpL3AgcGFyYW1zIGluY29ycmVjdFxuIik7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAJCX0KQEAgLTQ2MCwxNSArNDYyLDE1IEBACiB7CiAJaW50IHJldHZhbCwgaSwgcHJlcGFyZV9jb3VudCA9IDA7CiAKLQlwcl9kZWJ1Zygic3N0OiBUYXJnZXQgRGV2aWNlIFNlbGVjdFxuIik7CisJcHJfZGVidWcoIlRhcmdldCBEZXZpY2UgU2VsZWN0XG4iKTsKIAogCWlmICh0YXJnZXQtPmRldmljZV9yb3V0ZSA8IDAgfHwgdGFyZ2V0LT5kZXZpY2Vfcm91dGUgPiAyKSB7Ci0JCXByX2Vycigic3N0OiBkZXZpY2Ugcm91dGUgaXMgaW52YWxpZFxuIik7CisJCXByX2VycigiZGV2aWNlIHJvdXRlIGlzIGludmFsaWRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlpZiAodGFyZ2V0LT5kZXZpY2Vfcm91dGUgIT0gMCkgewotCQlwcl9lcnIoInNzdDogVW5zdXBwb3J0ZWQgY29uZmlnXG4iKTsKKwkJcHJfZXJyKCJVbnN1cHBvcnRlZCBjb25maWdcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAJcmV0dmFsID0gc3N0X3RhcmdldF9kZXZpY2VfdmFsaWRhdGUodGFyZ2V0KTsKQEAgLTQ4MCwxOCArNDgyLDE4IEBACiAJCXJldHVybiByZXR2YWw7CiAJZm9yIChpID0gMDsgaSA8IFNTVF9NQVhfVEFSR0VUX0RFVklDRVM7IGkrKykgewogCQlpZiAodGFyZ2V0LT5kZXZpY2VzW2ldLmFjdGlvbiA9PSBTTkRfU1NUX1BPUlRfQUNUSVZBVEUpIHsKLQkJCXByX2RlYnVnKCJzc3Q6IGFjdGl2YXRlIGNhbGxlZCBpbiAlZFxuIiwgaSk7CisJCQlwcl9kZWJ1ZygiYWN0aXZhdGUgY2FsbGVkIGluICVkXG4iLCBpKTsKIAkJCXJldHZhbCA9IHNzdF9wYXJzZV90YXJnZXQoJnRhcmdldC0+ZGV2aWNlc1tpXSk7CiAJCQlpZiAocmV0dmFsKQogCQkJCXJldHVybiByZXR2YWw7CiAJCX0gZWxzZSBpZiAodGFyZ2V0LT5kZXZpY2VzW2ldLmFjdGlvbiA9PSBTTkRfU1NUX1BPUlRfUFJFUEFSRSkgewotCQkJcHJfZGVidWcoInNzdDogUFJFUEFSRSBpbiAlZCwgRm9yd2FkaW5nXG4iLCBpKTsKKwkJCXByX2RlYnVnKCJQUkVQQVJFIGluICVkLCBGb3J3YXJkaW5nXG4iLCBpKTsKIAkJCXJldHZhbCA9IHNzdF9wYXJzZV90YXJnZXQoJnRhcmdldC0+ZGV2aWNlc1tpXSk7CiAJCQlpZiAocmV0dmFsKSB7Ci0JCQkJcHJfZXJyKCJzc3Q6IFBhcnNlIFRhcmdldCBmYWlsICVkIiwgcmV0dmFsKTsKKwkJCQlwcl9lcnIoIlBhcnNlIFRhcmdldCBmYWlsICVkXG4iLCByZXR2YWwpOwogCQkJCXJldHVybiByZXR2YWw7CiAJCQl9Ci0JCQlwcl9kZWJ1Zygic3N0OiBQYXJzZSBUYXJnZXQgc3VjY2Vzc2Z1bCAlZCIsIHJldHZhbCk7CisJCQlwcl9kZWJ1ZygiUGFyc2UgVGFyZ2V0IHN1Y2Nlc3NmdWwgJWRcbiIsIHJldHZhbCk7CiAJCQlpZiAodGFyZ2V0LT5kZXZpY2VzW2ldLmRldmljZV90eXBlID09CiAJCQkJCQlTTkRfU1NUX0RFVklDRV9QQ00pCiAJCQkJcHJlcGFyZV9jb3VudCsrOwpAQCAtNTEyLDExICs1MTQsMTEgQEAKIAlyYXJfc3RhdHVzID0gcmFyX2hhbmRsZV90b19idXMoYnVmZmVycywgY291bnQpOwogCiAJaWYgKGNvdW50ICE9IHJhcl9zdGF0dXMpIHsKLQkJcHJfZXJyKCJzc3Q6IFRoZSByYXIgQ0FMTCBGYWlsZWQiKTsKKwkJcHJfZXJyKCJUaGUgcmFyIENBTEwgRmFpbGVkIik7CiAJCXJldHZhbCA9IC1FSU87CiAJfQogCWlmIChidWZmZXJzLT5pbmZvLnR5cGUgIT0gUkFSX1RZUEVfQVVESU8pIHsKLQkJcHJfZXJyKCJzc3Q6IEludmFsaWQgUkFSIHR5cGVcbiIpOworCQlwcl9lcnIoIkludmFsaWQgUkFSIHR5cGVcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJcmV0dXJuIHJldHZhbDsKQEAgLTUzOSwxMCArNTQxLDEwIEBACiAJCWlmIChrYnVmcy0+aW5fdXNlID09IGZhbHNlKSB7CiAjaWZkZWYgQ09ORklHX01SU1RfUkFSX0hBTkRMRVIKIAkJCWlmIChzdHJlYW0tPm9wcyA9PSBTVFJFQU1fT1BTX1BMQVlCQUNLX0RSTSkgewotCQkJCXByX2RlYnVnKCJzc3Q6IERSTSBwbGF5YmFjayBoYW5kbGluZ1xuIik7CisJCQkJcHJfZGVidWcoIkRSTSBwbGF5YmFjayBoYW5kbGluZ1xuIik7CiAJCQkJcmFyX2J1ZmZlcnMuaW5mby5oYW5kbGUgPSAoX191MzIpa2J1ZnMtPmFkZHI7CiAJCQkJcmFyX2J1ZmZlcnMuaW5mby5zaXplID0ga2J1ZnMtPnNpemU7Ci0JCQkJcHJfZGVidWcoInNzdDogcmFyIGhhbmRsZSAweCV4IHNpemU9MHgleCIsCisJCQkJcHJfZGVidWcoInJhciBoYW5kbGUgMHgleCBzaXplPTB4JXhcbiIsCiAJCQkJCXJhcl9idWZmZXJzLmluZm8uaGFuZGxlLAogCQkJCQlyYXJfYnVmZmVycy5pbmZvLnNpemUpOwogCQkJCXJldHZhbCA9ICBzc3RfZ2V0X1JBUigmcmFyX2J1ZmZlcnMsIDEpOwpAQCAtNTUyLDcgKzU1NCw3IEBACiAJCQkJc2dfbGlzdC0+YWRkcltpXS5hZGRyID0gcmFyX2J1ZmZlcnMuYnVzX2FkZHJlc3M7CiAJCQkJLyogcmFyX2J1ZmZlcnMuaW5mby5zaXplOyAqLwogCQkJCXNnX2xpc3QtPmFkZHJbaV0uc2l6ZSA9IChfX3UzMilrYnVmcy0+c2l6ZTsKLQkJCQlwcl9kZWJ1Zygic3N0OiBwaHlhZGRyWyVkXSAweCV4IFNpemU6MHgleFxuIgorCQkJCXByX2RlYnVnKCJwaHlhZGRyWyVkXSAweCV4IFNpemU6MHgleFxuIgogCQkJCQksIGksIHNnX2xpc3QtPmFkZHJbaV0uYWRkciwKIAkJCQkJc2dfbGlzdC0+YWRkcltpXS5zaXplKTsKIAkJCX0KQEAgLTU2Miw3ICs1NjQsNyBAQAogCQkJCQl2aXJ0X3RvX3BoeXMoKHZvaWQgKikKIAkJCQkJCWtidWZzLT5hZGRyICsga2J1ZnMtPm9mZnNldCk7CiAJCQkJc2dfbGlzdC0+YWRkcltpXS5zaXplID0ga2J1ZnMtPnNpemU7Ci0JCQkJcHJfZGVidWcoInNzdDogcGh5YWRkclslZF06MHgleCBTaXplOjB4JXhcbiIKKwkJCQlwcl9kZWJ1ZygicGh5YWRkclslZF06MHgleCBTaXplOjB4JXhcbiIKIAkJCQksIGkgLCBzZ19saXN0LT5hZGRyW2ldLmFkZHIsIGtidWZzLT5zaXplKTsKIAkJCX0KIAkJCXN0cmVhbS0+Y3Vycl9ieXRlcyArPSBzZ19saXN0LT5hZGRyW2ldLnNpemU7CkBAIC01NzQsNyArNTc2LDcgQEAKIAl9CiAKIAlzZ19saXN0LT5udW1fZW50cmllcyA9IGk7Ci0JcHJfZGVidWcoInNzdDpzZyBsaXN0IGVudHJpZXMgPSAlZFxuIiwgc2dfbGlzdC0+bnVtX2VudHJpZXMpOworCXByX2RlYnVnKCJzZyBsaXN0IGVudHJpZXMgPSAlZFxuIiwgc2dfbGlzdC0+bnVtX2VudHJpZXMpOwogCXJldHVybiBpOwogfQogCkBAIC01OTUsNyArNTk3LDcgQEAKIAlzdHJ1Y3Qgc3N0X3N0cmVhbV9idWZzICprYnVmcyA9IE5VTEwsICpfa2J1ZnM7CiAJc3RydWN0IHN0cmVhbV9pbmZvICpzdHJlYW07CiAKLQlwcl9kZWJ1Zygic3N0OiBwbGF5IGZyYW1lIGZvciAlZFxuIiwgc3RyX2lkKTsKKwlwcl9kZWJ1ZygicGxheSBmcmFtZSBmb3IgJWRcbiIsIHN0cl9pZCk7CiAJcmV0dmFsID0gc3N0X3ZhbGlkYXRlX3N0cmlkKHN0cl9pZCk7CiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKQEAgLTYxNSwxNCArNjE3LDE0IEBACiAJc3RyZWFtLT5jdXJyX2J5dGVzID0gMDsKIAlpZiAobGlzdF9lbXB0eSgmc3RyZWFtLT5idWZzKSkgewogCQkvKiBubyB1c2VyIGJ1ZmZlciBhdmFpbGFibGUgKi8KLQkJcHJfZGVidWcoInNzdDogTnVsbCBidWZmZXIgc3RyZWFtIHN0YXR1cyAlZFxuIiwgc3RyZWFtLT5zdGF0dXMpOworCQlwcl9kZWJ1ZygiTnVsbCBidWZmZXIgc3RyZWFtIHN0YXR1cyAlZFxuIiwgc3RyZWFtLT5zdGF0dXMpOwogCQlzdHJlYW0tPnByZXYgPSBzdHJlYW0tPnN0YXR1czsKIAkJc3RyZWFtLT5zdGF0dXMgPSBTVFJFQU1fSU5JVDsKLQkJcHJfZGVidWcoInNzdDpuZXcgc3RyZWFtIHN0YXR1cyA9ICVkXG4iLCBzdHJlYW0tPnN0YXR1cyk7CisJCXByX2RlYnVnKCJuZXcgc3RyZWFtIHN0YXR1cyA9ICVkXG4iLCBzdHJlYW0tPnN0YXR1cyk7CiAJCWlmIChzdHJlYW0tPm5lZWRfZHJhaW5pbmcgPT0gdHJ1ZSkgewotCQkJcHJfZGVidWcoInNzdDpkcmFpbmluZyBzdHJlYW1cbiIpOworCQkJcHJfZGVidWcoImRyYWluaW5nIHN0cmVhbVxuIik7CiAJCQlpZiAoc3N0X2NyZWF0ZV9zaG9ydF9tc2coJm1zZykpIHsKLQkJCQlwcl9lcnIoInNzdDogbWVtIGFsbG9jIGZhaWxlZFxuIik7CisJCQkJcHJfZXJyKCJtZW0gYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwogCQkJCXJldHVybiAtRU5PTUVNOwogCQkJfQogCQkJc3N0X2ZpbGxfaGVhZGVyKCZtc2ctPmhlYWRlciwgSVBDX0lBX0RSQUlOX1NUUkVBTSwKQEAgLTYzMyw3ICs2MzUsNyBAQAogCQkJc3Bpbl91bmxvY2soJnNzdF9kcnZfY3R4LT5saXN0X3NwaW5fbG9jayk7CiAJCQlzc3RfcG9zdF9tZXNzYWdlKCZzc3RfZHJ2X2N0eC0+aXBjX3Bvc3RfbXNnX3dxKTsKIAkJfSBlbHNlIGlmIChzdHJlYW0tPmRhdGFfYmxrLm9uID09IHRydWUpIHsKLQkJCXByX2RlYnVnKCJzc3Q6dXNlciBsaXN0IGVtcHR5Li4gd2FrZVxuIik7CisJCQlwcl9kZWJ1ZygidXNlciBsaXN0IGVtcHR5Li4gd2FrZVxuIik7CiAJCQkvKiB1bmJsb2NrICovCiAJCQlzdHJlYW0tPmRhdGFfYmxrLnJldF9jb2RlID0gMDsKIAkJCXN0cmVhbS0+ZGF0YV9ibGsuY29uZGl0aW9uID0gdHJ1ZTsKQEAgLTY3OCw3ICs2ODAsNyBAQAogCXN0cnVjdCBzdHJlYW1faW5mbyAqc3RyZWFtOwogCiAKLQlwcl9kZWJ1Zygic3N0OmNhcHR1cmUgZnJhbWUgZm9yICVkXG4iLCBzdHJfaWQpOworCXByX2RlYnVnKCJjYXB0dXJlIGZyYW1lIGZvciAlZFxuIiwgc3RyX2lkKTsKIAlyZXR2YWwgPSBzc3RfdmFsaWRhdGVfc3RyaWQoc3RyX2lkKTsKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwpAQCAtNjg4LDE5ICs2OTAsMTkgQEAKIAkJaWYgKGtidWZzLT5pbl91c2UgPT0gdHJ1ZSkgewogCQkJbGlzdF9kZWwoJmtidWZzLT5ub2RlKTsKIAkJCWtmcmVlKGtidWZzKTsKLQkJCXByX2RlYnVnKCJzc3Q6ZGVsIG5vZGVcbiIpOworCQkJcHJfZGVidWcoImRlbCBub2RlXG4iKTsKIAkJfQogCX0KIAlpZiAobGlzdF9lbXB0eSgmc3RyZWFtLT5idWZzKSkgewogCQkvKiBubyB1c2VyIGJ1ZmZlciBhdmFpbGFibGUgKi8KLQkJcHJfZGVidWcoInNzdDpOdWxsIGJ1ZmZlciEhISFzdHJlYW0gc3RhdHVzICVkXG4iLAorCQlwcl9kZWJ1ZygiTnVsbCBidWZmZXIhISEhc3RyZWFtIHN0YXR1cyAlZFxuIiwKIAkJCSAgICAgICBzdHJlYW0tPnN0YXR1cyk7CiAJCXN0cmVhbS0+cHJldiA9IHN0cmVhbS0+c3RhdHVzOwogCQlzdHJlYW0tPnN0YXR1cyA9IFNUUkVBTV9JTklUOwotCQlwcl9kZWJ1Zygic3N0Om5ldyBzdHJlYW0gc3RhdHVzID0gJWRcbiIsCisJCXByX2RlYnVnKCJuZXcgc3RyZWFtIHN0YXR1cyA9ICVkXG4iLAogCQkJICAgICAgIHN0cmVhbS0+c3RhdHVzKTsKIAkJaWYgKHN0cmVhbS0+ZGF0YV9ibGsub24gPT0gdHJ1ZSkgewotCQkJcHJfZGVidWcoInNzdDp1c2VyIGxpc3QgZW1wdHkuLiB3YWtlXG4iKTsKKwkJCXByX2RlYnVnKCJ1c2VyIGxpc3QgZW1wdHkuLiB3YWtlXG4iKTsKIAkJCS8qIHVuYmxvY2sgKi8KIAkJCXN0cmVhbS0+ZGF0YV9ibGsucmV0X2NvZGUgPSAwOwogCQkJc3RyZWFtLT5kYXRhX2Jsay5jb25kaXRpb24gPSB0cnVlOwpAQCAtNzMxLDcgKzczMyw3IEBACiAJc3RyZWFtLT5jdW1tX2J5dGVzICs9IHN0cmVhbS0+Y3Vycl9ieXRlczsKIAlzdHJlYW0tPmN1cnJfYnl0ZXMgPSAwOwogCi0gICAgcHJfZGVidWcoInNzdDpDdW0gYnl0ZXMgID0gJWRcbiIsIHN0cmVhbS0+Y3VtbV9ieXRlcyk7CisgICAgcHJfZGVidWcoIkN1bSBieXRlcyAgPSAlZFxuIiwgc3RyZWFtLT5jdW1tX2J5dGVzKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzQzLDcgKzc0NSw3IEBACiAJCWlmIChidWZzLT5idWZmX2VudHJ5W2ldLnNpemUgPCBtaW5fdmFsKQogCQkJbWluX3ZhbCA9IGJ1ZnMtPmJ1ZmZfZW50cnlbaV0uc2l6ZTsKIAl9Ci0JcHJfZGVidWcoInNzdDptaW5fdmFsID0gJWRcbiIsIG1pbl92YWwpOworCXByX2RlYnVnKCJtaW5fdmFsID0gJWRcbiIsIG1pbl92YWwpOwogCXJldHVybiBtaW5fdmFsOwogfQogCkBAIC03NTQsNyArNzU2LDcgQEAKIAkJaWYgKGJ1ZnMtPmJ1ZmZfZW50cnlbaV0uc2l6ZSA+IG1heF92YWwpCiAJCQltYXhfdmFsID0gYnVmcy0+YnVmZl9lbnRyeVtpXS5zaXplOwogCX0KLQlwcl9kZWJ1Zygic3N0Om1heF92YWwgPSAlZFxuIiwgbWF4X3ZhbCk7CisJcHJfZGVidWcoIm1heF92YWwgPSAlZFxuIiwgbWF4X3ZhbCk7CiAJcmV0dXJuIG1heF92YWw7CiB9CiAKQEAgLTc3Myw3ICs3NzUsNyBAQAogCQkJaWYgKGRidWZzLT5pYnVmcy0+ZW50cmllcyA9PSBkYnVmcy0+b2J1ZnMtPmVudHJpZXMpCiAJCQkJcmV0dXJuIDA7CiAJCQllbHNlIHsKLQkJCQlwcl9lcnIoInNzdDogUkFSIGVudHJpZXMgZG9udCBtYXRjaFxuIik7CisJCQkJcHJfZXJyKCJSQVIgZW50cmllcyBkb250IG1hdGNoXG4iKTsKIAkJCQkgcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAJCX0gZWxzZQpAQCAtNzgzLDI2ICs3ODUsMjYgQEAKIAl9CiAjZW5kaWYKIAlpZiAoIXN0cl9pbmZvLT5kZWNvZGVfaWJ1ZikgewotCQlwcl9kZWJ1Zygic3N0Om5vIGkvcCBidWZmZXJzLCB0cnlpbmcgZnVsbCBzaXplXG4iKTsKKwkJcHJfZGVidWcoIm5vIGkvcCBidWZmZXJzLCB0cnlpbmcgZnVsbCBzaXplXG4iKTsKIAkJc3RyX2luZm8tPmRlY29kZV9pc2l6ZSA9IGN1bV9pbnB1dF9naXZlbjsKIAkJc3RyX2luZm8tPmRlY29kZV9pYnVmID0ga3phbGxvYyhzdHJfaW5mby0+ZGVjb2RlX2lzaXplLAogCQkJCQkJR0ZQX0tFUk5FTCk7CiAJCXN0cl9pbmZvLT5pZGVjb2RlX2FsbG9jID0gc3RyX2luZm8tPmRlY29kZV9pc2l6ZTsKIAl9CiAJaWYgKCFzdHJfaW5mby0+ZGVjb2RlX2lidWYpIHsKLQkJcHJfZGVidWcoInNzdDpidWZmIGFsbG9jIGZhaWxlZCwgdHJ5IG1heCBzaXplXG4iKTsKKwkJcHJfZGVidWcoImJ1ZmYgYWxsb2MgZmFpbGVkLCB0cnkgbWF4IHNpemVcbiIpOwogCQlzdHJfaW5mby0+ZGVjb2RlX2lzaXplID0gY2FsY3VsYXRlX21heF9zaXplKGRidWZzLT5pYnVmcyk7CiAJCXN0cl9pbmZvLT5kZWNvZGVfaWJ1ZiA9IGt6YWxsb2MoCiAJCQkJc3RyX2luZm8tPmRlY29kZV9pc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJCXN0cl9pbmZvLT5pZGVjb2RlX2FsbG9jID0gc3RyX2luZm8tPmRlY29kZV9pc2l6ZTsKIAl9CiAJaWYgKCFzdHJfaW5mby0+ZGVjb2RlX2lidWYpIHsKLQkJcHJfZGVidWcoInNzdDpidWZmIGFsbG9jIGZhaWxlZCwgdHJ5IG1pbiBzaXplXG4iKTsKKwkJcHJfZGVidWcoImJ1ZmYgYWxsb2MgZmFpbGVkLCB0cnkgbWluIHNpemVcbiIpOwogCQlzdHJfaW5mby0+ZGVjb2RlX2lzaXplID0gY2FsY3VsYXRlX21pbl9zaXplKGRidWZzLT5pYnVmcyk7CiAJCXN0cl9pbmZvLT5kZWNvZGVfaWJ1ZiA9IGt6YWxsb2Moc3RyX2luZm8tPmRlY29kZV9pc2l6ZSwKIAkJCQkJCUdGUF9LRVJORUwpOwogCQlpZiAoIXN0cl9pbmZvLT5kZWNvZGVfaWJ1ZikgewotCQkJcHJfZXJyKCJzc3Q6IG1lbSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCQlwcl9lcnIoIm1lbSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCQlzdHJfaW5mby0+aWRlY29kZV9hbGxvYyA9IHN0cl9pbmZvLT5kZWNvZGVfaXNpemU7CkBAIC04MjAsNyArODIyLDcgQEAKIAlzdHJ1Y3QgaXBjX3Bvc3QgKm1zZyA9IE5VTEw7CiAJaW50IHJldHZhbCA9IDA7CiAKLQlwcl9kZWJ1ZygiU1NUIERCR3NzdF9zZXRfbXV0ZTpjYWxsZWRcbiIpOworCXByX2RlYnVnKCJTU1QgREJHOnNzdF9zZXRfbXV0ZTpjYWxsZWRcbiIpOwogCiAJaWYgKHN0cl9pbmZvLT5kZWNvZGVfaWJ1Zl90eXBlID09IFNTVF9CVUZfUkFSKSB7CiAjaWZkZWYgQ09ORklHX01SU1RfUkFSX0hBTkRMRVIKQEAgLTg1Nyw3ICs4NTksNyBAQAogCWRlY19pbmZvLT5pbnB1dF9ieXRlc19jb25zdW1lZCA9IDA7CiAJZGVjX2luZm8tPm91dHB1dF9ieXRlc19wcm9kdWNlZCA9IDA7CiAJaWYgKHNzdF9jcmVhdGVfbGFyZ2VfbXNnKCZtc2cpKSB7Ci0JCXByX2Vycigic3N0OiBtZXNzYWdlIGNyZWF0aW9uIGZhaWxlZFxuIik7CisJCXByX2VycigibWVzc2FnZSBjcmVhdGlvbiBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTg3OCwxMyArODgwLDEzIEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAorI2lmZGVmIENPTkZJR19NUlNUX1JBUl9IQU5ETEVSCiBzdGF0aWMgaW50IHNzdF9wcmVwYXJlX2lucHV0X2J1ZmZlcnNfcmFyKHN0cnVjdCBzdHJlYW1faW5mbyAqc3RyX2luZm8sCiAJCQlzdHJ1Y3Qgc25kX3NzdF9kYnVmcyAqZGJ1ZnMsCiAJCQlpbnQgKmlucHV0X2luZGV4LCBpbnQgKmluX2NvcGllZCwKIAkJCWludCAqaW5wdXRfaW5kZXhfdmFsaWRfc2l6ZSwgaW50ICpuZXdfZW50cnlfZmxhZykKIHsKIAlpbnQgcmV0dmFsID0gMDsKLSNpZmRlZiBDT05GSUdfTVJTVF9SQVJfSEFORExFUgogCWludCBpOwogCiAJaWYgKHN0cl9pbmZvLT5vcHMgPT0gU1RSRUFNX09QU19QTEFZQkFDS19EUk0pIHsKQEAgLTg5NCw3ICs4OTYsNyBAQAogCQkJCWRidWZzLT5pYnVmcy0+YnVmZl9lbnRyeVtpXS5idWZmZXIsCiAJCQkJc2l6ZW9mKF9fdTMyKSk7CiAJCWlmIChyZXR2YWwpIHsKLQkJCXByX2Vycigic3N0OmNweSBmcm9tIHVzZXIgZmFpbFxuIik7CisJCQlwcl9lcnIoImNweSBmcm9tIHVzZXIgZmFpbFxuIik7CiAJCQlyZXR1cm4gLUVBR0FJTjsKIAkJfQogCQlyYXJfYnVmZmVycy5pbmZvLnR5cGUgPSBkYnVmcy0+aWJ1ZnMtPnR5cGU7CkBAIC05MTksOSArOTIxLDEwIEBACiAJCXN0cl9pbmZvLT5kZWNvZGVfaWJ1Zl90eXBlID0gZGJ1ZnMtPmlidWZzLT50eXBlOwogCQkqaW5fY29waWVkID0gc3RyX2luZm8tPmRlY29kZV9pc2l6ZTsKIAl9Ci0jZW5kaWYKIAlyZXR1cm4gcmV0dmFsOwogfQorI2VuZGlmCisKIC8qVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHByZXBhcmUgdGhlIGtlcm5lbCBpbnB1dCBidWZmZXJzIHdpdGggY29udGVudHMKIGJlZm9yZSBzZW5kaW5nIGZvciBkZWNvZGUqLwogc3RhdGljIGludCBzc3RfcHJlcGFyZV9pbnB1dF9idWZmZXJzKHN0cnVjdCBzdHJlYW1faW5mbyAqc3RyX2luZm8sCkBAIC05MzEsNyArOTM0LDcgQEAKIHsKIAlpbnQgaSwgY3B5X3NpemUsIHJldHZhbCA9IDA7CiAKLQlwcl9kZWJ1Zygic3N0OmlucHV0X2luZGV4ID0gJWQsIGlucHV0IGVudHJpZXMgPSAlZFxuIiwKKwlwcl9kZWJ1ZygiaW5wdXRfaW5kZXggPSAlZCwgaW5wdXQgZW50cmllcyA9ICVkXG4iLAogCQkJICppbnB1dF9pbmRleCwgZGJ1ZnMtPmlidWZzLT5lbnRyaWVzKTsKIAlmb3IgKGkgPSAqaW5wdXRfaW5kZXg7IGkgPCBkYnVmcy0+aWJ1ZnMtPmVudHJpZXM7IGkrKykgewogI2lmZGVmIENPTkZJR19NUlNUX1JBUl9IQU5ETEVSCkBAIC05MzksNyArOTQyLDcgQEAKIAkJCWRidWZzLCBpbnB1dF9pbmRleCwgaW5fY29waWVkLAogCQkJCWlucHV0X2luZGV4X3ZhbGlkX3NpemUsIG5ld19lbnRyeV9mbGFnKTsKIAkJaWYgKHJldHZhbCkgewotCQkJcHJfZXJyKCJzc3Q6IEluIHByZXBhcmUgaW5wdXQgYnVmZmVycyBmb3IgUkFSXG4iKTsKKwkJCXByX2VycigiSW4gcHJlcGFyZSBpbnB1dCBidWZmZXJzIGZvciBSQVJcbiIpOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KICNlbmRpZgpAQCAtOTQ3LDEwICs5NTAsMTAgQEAKIAkJaWYgKCppbnB1dF9pbmRleF92YWxpZF9zaXplID09IDApCiAJCQkqaW5wdXRfaW5kZXhfdmFsaWRfc2l6ZSA9CiAJCQkJZGJ1ZnMtPmlidWZzLT5idWZmX2VudHJ5W2ldLnNpemU7Ci0JCXByX2RlYnVnKCJzc3Q6aW5vdXQgYWRkciA9ICVwLCBzaXplID0gJWRcbiIsCisJCXByX2RlYnVnKCJpbm91dCBhZGRyID0gJXAsIHNpemUgPSAlZFxuIiwKIAkJCWRidWZzLT5pYnVmcy0+YnVmZl9lbnRyeVtpXS5idWZmZXIsCiAJCQkqaW5wdXRfaW5kZXhfdmFsaWRfc2l6ZSk7Ci0JCXByX2RlYnVnKCJzc3Q6ZGVjb2RlX2lzaXplID0gJWQsIGluX2NvcGllZCAlZFxuIiwKKwkJcHJfZGVidWcoImRlY29kZV9pc2l6ZSA9ICVkLCBpbl9jb3BpZWQgJWRcbiIsCiAJCQlzdHJfaW5mby0+ZGVjb2RlX2lzaXplLCAqaW5fY29waWVkKTsKIAkJaWYgKCppbnB1dF9pbmRleF92YWxpZF9zaXplIDw9CiAJCQkJCShzdHJfaW5mby0+ZGVjb2RlX2lzaXplIC0gKmluX2NvcGllZCkpCkBAIC05NTgsMTIgKzk2MSwxMiBAQAogCQllbHNlCiAJCQljcHlfc2l6ZSA9IHN0cl9pbmZvLT5kZWNvZGVfaXNpemUgLSAqaW5fY29waWVkOwogCi0JCXByX2RlYnVnKCJzc3Q6Y3B5IHNpemUgPSAlZFxuIiwgY3B5X3NpemUpOworCQlwcl9kZWJ1ZygiY3B5IHNpemUgPSAlZFxuIiwgY3B5X3NpemUpOwogCQlpZiAoIWRidWZzLT5pYnVmcy0+YnVmZl9lbnRyeVtpXS5idWZmZXIpIHsKLQkJCXByX2Vycigic3N0OiBpL3AgYnVmZmVyIGlzIG51bGxcbiIpOworCQkJcHJfZXJyKCJpL3AgYnVmZmVyIGlzIG51bGxcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQkJcHJfZGVidWcoInNzdDpUcnkgY29weSBUbyAlcCwgRnJvbSAlcCwgc2l6ZSAlZFxuIiwKKwkJcHJfZGVidWcoIlRyeSBjb3B5IFRvICVwLCBGcm9tICVwLCBzaXplICVkXG4iLAogCQkJCXN0cl9pbmZvLT5kZWNvZGVfaWJ1ZiArICppbl9jb3BpZWQsCiAJCQkJZGJ1ZnMtPmlidWZzLT5idWZmX2VudHJ5W2ldLmJ1ZmZlciwgY3B5X3NpemUpOwogCkBAIC05NzIsMjIgKzk3NSwyMiBAQAogCQkJCSh2b2lkICopIGRidWZzLT5pYnVmcy0+YnVmZl9lbnRyeVtpXS5idWZmZXIsCiAJCQkJY3B5X3NpemUpOwogCQlpZiAocmV0dmFsKSB7Ci0JCQlwcl9lcnIoInNzdDogY29weSBmcm9tIHVzZXIgZmFpbGVkXG4iKTsKKwkJCXByX2VycigiY29weSBmcm9tIHVzZXIgZmFpbGVkXG4iKTsKIAkJCXJldHVybiAtRUlPOwogCQl9CiAJCSppbl9jb3BpZWQgKz0gY3B5X3NpemU7CiAJCSppbnB1dF9pbmRleF92YWxpZF9zaXplIC09IGNweV9zaXplOwotCQlwcl9kZWJ1Zygic3N0OmluIGJ1ZmYgc2l6ZSA9ICVkLCBpbl9jb3BpZWQgPSAlZFxuIiwKKwkJcHJfZGVidWcoImluIGJ1ZmYgc2l6ZSA9ICVkLCBpbl9jb3BpZWQgPSAlZFxuIiwKIAkJCSppbnB1dF9pbmRleF92YWxpZF9zaXplLCAqaW5fY29waWVkKTsKIAkJaWYgKCppbnB1dF9pbmRleF92YWxpZF9zaXplICE9IDApIHsKLQkJCXByX2RlYnVnKCJzc3Q6bW9yZSBpbnB1dCBidWZmZXJzIGxlZnRcbiIpOworCQkJcHJfZGVidWcoIm1vcmUgaW5wdXQgYnVmZmVycyBsZWZ0XG4iKTsKIAkJCWRidWZzLT5pYnVmcy0+YnVmZl9lbnRyeVtpXS5idWZmZXIgKz0gY3B5X3NpemU7CiAJCQlicmVhazsKIAkJfQogCQlpZiAoKmluX2NvcGllZCA9PSBzdHJfaW5mby0+ZGVjb2RlX2lzaXplICYmCiAJCQkqaW5wdXRfaW5kZXhfdmFsaWRfc2l6ZSA9PSAwICYmCiAJCQkoaSsxKSA8PSBkYnVmcy0+aWJ1ZnMtPmVudHJpZXMpIHsKLQkJCXByX2RlYnVnKCJzc3Q6YWxsIGlucHV0IGJ1ZmZlcnMgY29waWVkXG4iKTsKKwkJCXByX2RlYnVnKCJhbGwgaW5wdXQgYnVmZmVycyBjb3BpZWRcbiIpOwogCQkJKm5ld19lbnRyeV9mbGFnID0gdHJ1ZTsKIAkJCSppbnB1dF9pbmRleCA9IGkgKyAxOwogCQkJYnJlYWs7CkBAIC0xMDA1LDIzICsxMDA4LDIzIEBACiAKIHsKIAlpbnQgaSwgY3B5X3NpemUsIHJldHZhbCA9IDA7Ci0JcHJfZGVidWcoInNzdDpvdXRwdXRfaW5kZXggPSAlZCwgb3V0cHV0IGVudHJpZXMgPSAlZFxuIiwKKwlwcl9kZWJ1Zygib3V0cHV0X2luZGV4ID0gJWQsIG91dHB1dCBlbnRyaWVzID0gJWRcbiIsCiAJCQkJKm91dHB1dF9pbmRleCwKIAkJCQlkYnVmcy0+b2J1ZnMtPmVudHJpZXMpOwogCWZvciAoaSA9ICpvdXRwdXRfaW5kZXg7IGkgPCBkYnVmcy0+b2J1ZnMtPmVudHJpZXM7IGkrKykgewogCQkqb3V0cHV0X2luZGV4ID0gaTsKLQkJcHJfZGVidWcoInNzdDpvdXRwdXQgYWRkciA9ICVwLCBzaXplID0gJWRcbiIsCisJCXByX2RlYnVnKCJvdXRwdXQgYWRkciA9ICVwLCBzaXplID0gJWRcbiIsCiAJCQlkYnVmcy0+b2J1ZnMtPmJ1ZmZfZW50cnlbaV0uYnVmZmVyLAogCQkJZGJ1ZnMtPm9idWZzLT5idWZmX2VudHJ5W2ldLnNpemUpOwotCQlwcl9kZWJ1Zygic3N0Om91dHB1dF9zaXplID0gJWQsIG91dF9jb3BpZWQgPSAlZFxuIiwKKwkJcHJfZGVidWcoIm91dHB1dF9zaXplID0gJWQsIG91dF9jb3BpZWQgPSAlZFxuIiwKIAkJCQlvdXRwdXRfc2l6ZSwgKm91dF9jb3BpZWQpOwogCQlpZiAoZGJ1ZnMtPm9idWZzLT5idWZmX2VudHJ5W2ldLnNpemUgPAogCQkJCShvdXRwdXRfc2l6ZSAtICpvdXRfY29waWVkKSkKIAkJCWNweV9zaXplID0gZGJ1ZnMtPm9idWZzLT5idWZmX2VudHJ5W2ldLnNpemU7CiAJCWVsc2UKIAkJCWNweV9zaXplID0gb3V0cHV0X3NpemUgLSAqb3V0X2NvcGllZDsKLQkJcHJfZGVidWcoInNzdDpjcHkgc2l6ZSA9ICVkXG4iLCBjcHlfc2l6ZSk7Ci0JCXByX2RlYnVnKCJzc3Q6VHJ5IGNvcHkgVG86ICVwLCBGcm9tICVwLCBzaXplICVkXG4iLAorCQlwcl9kZWJ1ZygiY3B5IHNpemUgPSAlZFxuIiwgY3B5X3NpemUpOworCQlwcl9kZWJ1ZygiVHJ5IGNvcHkgVG86ICVwLCBGcm9tICVwLCBzaXplICVkXG4iLAogCQkJCWRidWZzLT5vYnVmcy0+YnVmZl9lbnRyeVtpXS5idWZmZXIsCiAJCQkJc3N0X2Rydl9jdHgtPm1tYXBfbWVtICsgKm91dF9jb3BpZWQsCiAJCQkJY3B5X3NpemUpOwpAQCAtMTAyOSwxMyArMTAzMiwxMyBAQAogCQkJCQlzc3RfZHJ2X2N0eC0+bW1hcF9tZW0gKyAqb3V0X2NvcGllZCwKIAkJCQkJY3B5X3NpemUpOwogCQlpZiAocmV0dmFsKSB7Ci0JCQlwcl9lcnIoInNzdDogY29weSB0byB1c2VyIGZhaWxlZFxuIik7CisJCQlwcl9lcnIoImNvcHkgdG8gdXNlciBmYWlsZWRcbiIpOwogCQkJcmV0dXJuIC1FSU87CiAJCX0gZWxzZQotCQkJcHJfZGVidWcoInNzdDpjb3B5IHRvIHVzZXIgcGFzc2VkXG4iKTsKKwkJCXByX2RlYnVnKCJjb3B5IHRvIHVzZXIgcGFzc2VkXG4iKTsKIAkJKm91dF9jb3BpZWQgKz0gY3B5X3NpemU7CiAJCWRidWZzLT5vYnVmcy0+YnVmZl9lbnRyeVtpXS5zaXplIC09IGNweV9zaXplOwotCQlwcl9kZWJ1Zygic3N0Om8vcCBidWZmIHNpemUgJWQsIG91dF9jb3BpZWQgJWRcbiIsCisJCXByX2RlYnVnKCJvL3AgYnVmZiBzaXplICVkLCBvdXRfY29waWVkICVkXG4iLAogCQkJZGJ1ZnMtPm9idWZzLT5idWZmX2VudHJ5W2ldLnNpemUsICpvdXRfY29waWVkKTsKIAkJaWYgKGRidWZzLT5vYnVmcy0+YnVmZl9lbnRyeVtpXS5zaXplICE9IDApIHsKIAkJCSpvdXRwdXRfaW5kZXggPSBpOwpAQCAtMTA3Myw3ICsxMDc2LDcgQEAKIAl1bnNpZ25lZCBsb25nIGxvbmcgaW5wdXRfYnl0ZXMsIG91dHB1dF9ieXRlczsKIAogCXNzdF9kcnZfY3R4LT5zY2FyZF9vcHMtPnBvd2VyX2Rvd25fcG1pYygpOwotCXByX2RlYnVnKCJzc3Q6IFBvd2VyaW5nX2Rvd25fUE1JQy4uLlxuIik7CisJcHJfZGVidWcoIlBvd2VyaW5nX2Rvd25fUE1JQy4uLlxuIik7CiAKIAlyZXR2YWwgPSBzc3RfdmFsaWRhdGVfc3RyaWQoc3RyX2lkKTsKIAlpZiAocmV0dmFsKQpAQCAtMTA4MSw3ICsxMDg0LDcgQEAKIAogCXN0cl9pbmZvID0gJnNzdF9kcnZfY3R4LT5zdHJlYW1zW3N0cl9pZF07CiAJaWYgKHN0cl9pbmZvLT5zdGF0dXMgIT0gU1RSRUFNX0lOSVQpIHsKLQkJcHJfZXJyKCJzc3Q6IGludmFsaWQgc3RyZWFtIHN0YXRlID0gJWRcbiIsCisJCXByX2VycigiaW52YWxpZCBzdHJlYW0gc3RhdGUgPSAlZFxuIiwKIAkJCSAgICAgICBzdHJfaW5mby0+c3RhdHVzKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTA5OCw3ICsxMTAxLDcgQEAKIAlyZXR2YWwgPSAgc3N0X2FsbG9jYXRlX2RlY29kZV9idWYoc3RyX2luZm8sIGRidWZzLAogCQkJCWN1bV9pbnB1dF9naXZlbiwgY3VtX291dHB1dF9naXZlbik7CiAJaWYgKHJldHZhbCkgewotCQlwcl9lcnIoInNzdDogbWVtIGFsbG9jYXRpb24gZmFpbGVkLCBhYm9ydCEhIVxuIik7CisJCXByX2VycigibWVtIGFsbG9jYXRpb24gZmFpbGVkLCBhYm9ydCEhIVxuIik7CiAJCXJldHZhbCA9IC1FTk9NRU07CiAJCWdvdG8gZmluaXNoOwogCX0KQEAgLTExMTQsNyArMTExNyw3IEBACiAJCQlkYnVmcywgJmlucHV0X2luZGV4LCAmaW5fY29waWVkLAogCQkJJmlucHV0X2luZGV4X3ZhbGlkX3NpemUsICZuZXdfZW50cnlfZmxhZyk7CiAJCWlmIChyZXR2YWwpIHsKLQkJCXByX2Vycigic3N0OiBwcmVwYXJlIGluIGJ1ZmZlcnMgZmFpbGVkXG4iKTsKKwkJCXByX2VycigicHJlcGFyZSBpbiBidWZmZXJzIGZhaWxlZFxuIik7CiAJCQlnb3RvIGZpbmlzaDsKIAkJfQogCkBAIC0xMTQ1LDggKzExNDgsOCBAQAogCQkJCXN0cl9pbmZvLT5kZWNvZGVfb3NpemUgPSBkYnVmcy0+b2J1ZnMtPgogCQkJCQlidWZmX2VudHJ5W291dHB1dF9pbmRleF0uc2l6ZTsKIAkJCQlzdHJfaW5mby0+ZGVjb2RlX29idWZfdHlwZSA9IGRidWZzLT5vYnVmcy0+dHlwZTsKLQkJCQlwcl9kZWJ1Zygic3N0OkRSTSBoYW5kbGluZ1xuIik7Ci0JCQkJcHJfZGVidWcoIm8vcF9hZGQ9MHglbHUgU2l6ZT0weCV4IiwKKwkJCQlwcl9kZWJ1ZygiRFJNIGhhbmRsaW5nXG4iKTsKKwkJCQlwcl9kZWJ1Zygiby9wX2FkZD0weCVsdSBTaXplPTB4JXhcbiIsCiAJCQkJCSh1bnNpZ25lZCBsb25nKSBzdHJfaW5mby0+ZGVjb2RlX29idWYsCiAJCQkJCXN0cl9pbmZvLT5kZWNvZGVfb3NpemUpOwogCQkJfSBlbHNlIHsKQEAgLTExNjAsNyArMTE2Myw3IEBACiAJCWlmIChzdHJfaW5mby0+b3BzICE9IFNUUkVBTV9PUFNfUExBWUJBQ0tfRFJNKSB7CiAJCQlpZiAoc3RyX2luZm8tPmRlY29kZV9pc2l6ZSA+IGluX2NvcGllZCkgewogCQkJCXN0cl9pbmZvLT5kZWNvZGVfaXNpemUgPSBpbl9jb3BpZWQ7Ci0JCQkJcHJfZGVidWcoInNzdDppL3Agc2l6ZSA9ICVkXG4iLAorCQkJCXByX2RlYnVnKCJpL3Agc2l6ZSA9ICVkXG4iLAogCQkJCQkJc3RyX2luZm8tPmRlY29kZV9pc2l6ZSk7CiAJCQl9CiAJCX0KQEAgLTExNjgsMjAgKzExNzEsMTkgQEAKIAogCQlyZXR2YWwgPSBzc3Rfc2VuZF9kZWNvZGVfbWVzcyhzdHJfaWQsIHN0cl9pbmZvLCAmZGVjX2luZm8pOwogCQlpZiAocmV0dmFsIHx8IGRlY19pbmZvLmlucHV0X2J5dGVzX2NvbnN1bWVkID09IDApIHsKLQkJCXByX2VycigKLQkJCQkiU1NUIEVSUjogbWVzcyBmYWlsZWQgb3Igbm8gaW5wdXQgY29uc3VtZWRcbiIpOworCQkJcHJfZXJyKCJTU1QgRVJSOiBtZXNzIGZhaWxlZCBvciBubyBpbnB1dCBjb25zdW1lZFxuIik7CiAJCQlnb3RvIGZpbmlzaDsKIAkJfQogCQlpbnB1dF9ieXRlcyA9IGRlY19pbmZvLmlucHV0X2J5dGVzX2NvbnN1bWVkOwogCQlvdXRwdXRfYnl0ZXMgPSBkZWNfaW5mby5vdXRwdXRfYnl0ZXNfcHJvZHVjZWQ7CiAKLQkJcHJfZGVidWcoInNzdDppbl9jb3BpZWQ9JWQsIGNvbj0lbGxkLCBwcm9kPSVsbGRcbiIsCisJCXByX2RlYnVnKCJpbl9jb3BpZWQ9JWQsIGNvbj0lbGxkLCBwcm9kPSVsbGRcbiIsCiAJCQlpbl9jb3BpZWQsIGlucHV0X2J5dGVzLCBvdXRwdXRfYnl0ZXMpOwogCQlpZiAoZGJ1ZnMtPm9idWZzLT50eXBlID09IFNTVF9CVUZfUkFSKSB7CiAJCQlvdXRwdXRfaW5kZXggKz0gMTsKIAkJCWlmIChvdXRwdXRfaW5kZXggPT0gZGJ1ZnMtPm9idWZzLT5lbnRyaWVzKSB7CiAJCQkJY29weV9pbl9kb25lID0gdHJ1ZTsKLQkJCQlwcl9kZWJ1Zygic3N0OmFsbCBpL3AgY3B5IGRvbmVcbiIpOworCQkJCXByX2RlYnVnKCJhbGwgaS9wIGNweSBkb25lXG4iKTsKIAkJCX0KIAkJCXRvdGFsX291dHB1dCArPSBvdXRwdXRfYnl0ZXM7CiAJCX0gZWxzZSB7CkBAIC0xMTkwLDE0ICsxMTkyLDE0IEBACiAJCQlyZXR2YWwgPSBzc3RfcHJlcGFyZV9vdXRwdXRfYnVmZmVycyhzdHJfaW5mbywgZGJ1ZnMsCiAJCQkJJm91dHB1dF9pbmRleCwgb3V0cHV0X3NpemUsICZvdXRfY29waWVkKTsKIAkJCWlmIChyZXR2YWwpIHsKLQkJCQlwcl9lcnIoInNzdDpwcmVwIG91dCBidWZmIGZhaWxcbiIpOworCQkJCXByX2VycigicHJlcCBvdXQgYnVmZiBmYWlsXG4iKTsKIAkJCQlnb3RvIGZpbmlzaDsKIAkJCX0KIAkJCWlmIChzdHJfaW5mby0+b3BzICE9IFNUUkVBTV9PUFNfUExBWUJBQ0tfRFJNKSB7CiAJCQkJaWYgKGluX2NvcGllZCAhPSBpbnB1dF9ieXRlcykgewogCQkJCQlpbnQgYnl0ZXNfbGVmdCA9IGluX2NvcGllZCAtCiAJCQkJCQkJCWlucHV0X2J5dGVzOwotCQkJCQlwcl9kZWJ1Zygic3N0OmJ5dGVzICVkXG4iLAorCQkJCQlwcl9kZWJ1ZygiYnl0ZXMgJWRcbiIsCiAJCQkJCQkJYnl0ZXNfbGVmdCk7CiAJCQkJCWlmIChuZXdfZW50cnlfZmxhZyA9PSB0cnVlKQogCQkJCQkJaW5wdXRfaW5kZXgtLTsKQEAgLTEyMzcsNyArMTIzOSw3IEBACiAJCQl0b3RhbF9vdXRwdXQgKz0gb3V0X2NvcGllZDsKIAkJCWlmIChzdHJfaW5mby0+ZGVjb2RlX29zaXplICE9IG91dF9jb3BpZWQpIHsKIAkJCQlzdHJfaW5mby0+ZGVjb2RlX29zaXplIC09IG91dF9jb3BpZWQ7Ci0JCQkJcHJfZGVidWcoInNzdDpvdXRwdXQgc2l6ZSBtb2RpZmllZCA9ICVkXG4iLAorCQkJCXByX2RlYnVnKCJvdXRwdXQgc2l6ZSBtb2RpZmllZCA9ICVkXG4iLAogCQkJCQkJc3RyX2luZm8tPmRlY29kZV9vc2l6ZSk7CiAJCQl9CiAJCX0KQEAgLTEyNTEsMTYgKzEyNTMsMTYgQEAKIAkJfSBlbHNlIHsKIAkJCWlmICh0b3RhbF9vdXRwdXQgPT0gY3VtX291dHB1dF9naXZlbikgewogCQkJCWNvcHlfb3V0X2RvbmUgPSB0cnVlOwotCQkJCXByX2RlYnVnKCJzc3Q6YWxsIG8vcCBjcHkgZG9uZVxuIik7CisJCQkJcHJfZGVidWcoImFsbCBvL3AgY3B5IGRvbmVcbiIpOwogCQkJfQogCiAJCQlpZiAodG90YWxfaW5wdXQgPT0gY3VtX2lucHV0X2dpdmVuKSB7CiAJCQkJY29weV9pbl9kb25lID0gdHJ1ZTsKLQkJCQlwcl9kZWJ1Zygic3N0OmFsbCBpL3AgY3B5IGRvbmVcbiIpOworCQkJCXByX2RlYnVnKCJhbGwgaS9wIGNweSBkb25lXG4iKTsKIAkJCX0KIAkJfQogCi0JCXByX2RlYnVnKCJzc3Q6Y29weV9vdXQgPSAlZCwgY29weV9pbiA9ICVkXG4iLAorCQlwcl9kZWJ1ZygiY29weV9vdXQgPSAlZCwgY29weV9pbiA9ICVkXG4iLAogCQkJCWNvcHlfb3V0X2RvbmUsIGNvcHlfaW5fZG9uZSk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsbWlkLmMgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsbWlkLmMKaW5kZXggNGMwMjY0Yy4uZmIyMjkyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbG1pZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxtaWQuYwpAQCAtMjQsNiArMjQsOSBAQAogICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KICAqIEFMU0EgZHJpdmVyIGZvciBJbnRlbCBNSUQgc291bmQgY2FyZCBjaGlwc2V0CiAgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC0xMDEsMTIgKzEwNCwxMCBAQAogc3RhdGljIGludCBzbmRfaW50ZWxtYWRfcGNtX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCQkJCWludCBjbWQpCiB7Ci0JaW50IHJldF92YWwgPSAwOworCWludCByZXRfdmFsID0gMCwgc3RyX2lkOwogCXN0cnVjdCBzbmRfaW50ZWxtYWQgKmludGVsbWFkZGF0YTsKIAlzdHJ1Y3QgbWFkX3N0cmVhbV9wdnQgKnN0cmVhbTsKLQkvKnN0cnVjdCBzdHJlYW1fYnVmZmVyIGJ1ZmZlcl90b19zc3Q7Ki8KLQotCisJc3RydWN0IGludGVsX3NzdF9wY21fY29udHJvbCAqc3N0X29wczsKIAogCVdBUk5fT04oIXN1YnN0cmVhbSk7CiAKQEAgLTExNSwzOCArMTE2LDM1IEBACiAKIAlXQVJOX09OKCFpbnRlbG1hZGRhdGEtPnNzdGRydl9vcHMpOwogCVdBUk5fT04oIWludGVsbWFkZGF0YS0+c3N0ZHJ2X29wcy0+c2NhcmRfb3BzKTsKKwlzc3Rfb3BzICA9IGludGVsbWFkZGF0YS0+c3N0ZHJ2X29wcy0+cGNtX2NvbnRyb2w7CisJc3RyX2lkID0gc3RyZWFtLT5zdHJlYW1faW5mby5zdHJfaWQ7CiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6Ci0JCXByX2RlYnVnKCJzc3Q6IFRyaWdnZXIgU3RhcnRcbiIpOwotCQlyZXRfdmFsID0gaW50ZWxtYWRkYXRhLT5zc3RkcnZfb3BzLT5jb250cm9sX3NldChTU1RfU05EX1NUQVJULAotCQkJCSZzdHJlYW0tPnN0cmVhbV9pbmZvLnN0cl9pZCk7CisJCXByX2RlYnVnKCJUcmlnZ2VyIFN0YXJ0XG4iKTsKKwkJcmV0X3ZhbCA9IHNzdF9vcHMtPmRldmljZV9jb250cm9sKFNTVF9TTkRfU1RBUlQsICZzdHJfaWQpOwogCQlpZiAocmV0X3ZhbCkKIAkJCXJldHVybiByZXRfdmFsOwogCQlzdHJlYW0tPnN0cmVhbV9zdGF0dXMgPSBSVU5OSU5HOwogCQlzdHJlYW0tPnN1YnN0cmVhbSA9IHN1YnN0cmVhbTsKLQkJc3RyZWFtLT5zdHJlYW1fc3RhdHVzID0gUlVOTklORzsKIAkJYnJlYWs7CiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgotCQlwcl9kZWJ1Zygic3N0OiBpbiBzdG9wXG4iKTsKLQkJcmV0X3ZhbCA9IGludGVsbWFkZGF0YS0+c3N0ZHJ2X29wcy0+Y29udHJvbF9zZXQoU1NUX1NORF9EUk9QLAotCQkJCSZzdHJlYW0tPnN0cmVhbV9pbmZvLnN0cl9pZCk7CisJCXByX2RlYnVnKCJpbiBzdG9wXG4iKTsKKwkJcmV0X3ZhbCA9IHNzdF9vcHMtPmRldmljZV9jb250cm9sKFNTVF9TTkRfRFJPUCwgJnN0cl9pZCk7CiAJCWlmIChyZXRfdmFsKQogCQkJcmV0dXJuIHJldF92YWw7CiAJCXN0cmVhbS0+c3RyZWFtX3N0YXR1cyA9IERST1BQRUQ7CiAJCWJyZWFrOwogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKLQkJcHJfZGVidWcoInNzdDogaW4gcGF1c2VcbiIpOwotCQlyZXRfdmFsID0gaW50ZWxtYWRkYXRhLT5zc3RkcnZfb3BzLT5jb250cm9sX3NldChTU1RfU05EX1BBVVNFLAotCQkJCSZzdHJlYW0tPnN0cmVhbV9pbmZvLnN0cl9pZCk7CisJCXByX2RlYnVnKCJpbiBwYXVzZVxuIik7CisJCXJldF92YWwgPSBzc3Rfb3BzLT5kZXZpY2VfY29udHJvbChTU1RfU05EX1BBVVNFLCAmc3RyX2lkKTsKIAkJaWYgKHJldF92YWwpCiAJCQlyZXR1cm4gcmV0X3ZhbDsKIAkJc3RyZWFtLT5zdHJlYW1fc3RhdHVzID0gUEFVU0VEOwogCQlicmVhazsKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6Ci0JCXByX2RlYnVnKCJzc3Q6IGluIHBhdXNlIHJlbGVhc2VcbiIpOwotCQlyZXRfdmFsID0gaW50ZWxtYWRkYXRhLT5zc3RkcnZfb3BzLT5jb250cm9sX3NldChTU1RfU05EX1JFU1VNRSwKLQkJCQkJCSZzdHJlYW0tPnN0cmVhbV9pbmZvLnN0cl9pZCk7CisJCXByX2RlYnVnKCJpbiBwYXVzZSByZWxlYXNlXG4iKTsKKwkJcmV0X3ZhbCA9IHNzdF9vcHMtPmRldmljZV9jb250cm9sKFNTVF9TTkRfUkVTVU1FLCAmc3RyX2lkKTsKIAkJaWYgKHJldF92YWwpCiAJCQlyZXR1cm4gcmV0X3ZhbDsKIAkJc3RyZWFtLT5zdHJlYW1fc3RhdHVzID0gUlVOTklORzsKQEAgLTE3MCwxOSArMTY4LDE5IEBACiAJaW50IHJldF92YWwgPSAwOwogCXN0cnVjdCBzbmRfaW50ZWxtYWQgKmludGVsbWFkZGF0YTsKIAotCXByX2RlYnVnKCJzc3Q6IHBjbV9wcmVwYXJlIGNhbGxlZFxuIik7CisJcHJfZGVidWcoInBjbV9wcmVwYXJlIGNhbGxlZFxuIik7CiAKIAlXQVJOX09OKCFzdWJzdHJlYW0pOwogCXN0cmVhbSA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwogCWludGVsbWFkZGF0YSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKLQlwcl9kZWJ1Zygic3N0OiBwYiBjbnQgPSAlZCBjYXAgY250ID0gJWRcbiIsXAorCXByX2RlYnVnKCJwYiBjbnQgPSAlZCBjYXAgY250ID0gJWRcbiIsXAogCQlpbnRlbG1hZGRhdGEtPnBsYXliYWNrX2NudCwKIAkJaW50ZWxtYWRkYXRhLT5jYXB0dXJlX2NudCk7CiAKIAlpZiAoc3RyZWFtLT5zdHJlYW1faW5mby5zdHJfaWQpIHsKLQkJcHJfZGVidWcoInNzdDogUHJlcGFyZSBjYWxsZWQgZm9yIGFscmVhZHkgc2V0IHN0cmVhbVxuIik7Ci0JCXJldF92YWwgPSBpbnRlbG1hZGRhdGEtPnNzdGRydl9vcHMtPmNvbnRyb2xfc2V0KFNTVF9TTkRfRFJPUCwKLQkJCQkJJnN0cmVhbS0+c3RyZWFtX2luZm8uc3RyX2lkKTsKKwkJcHJfZGVidWcoIlByZXBhcmUgY2FsbGVkIGZvciBhbHJlYWR5IHNldCBzdHJlYW1cbiIpOworCQlyZXRfdmFsID0gaW50ZWxtYWRkYXRhLT5zc3RkcnZfb3BzLT5wY21fY29udHJvbC0+ZGV2aWNlX2NvbnRyb2woCisJCQkJU1NUX1NORF9EUk9QLCAmc3RyZWFtLT5zdHJlYW1faW5mby5zdHJfaWQpOwogCQlyZXR1cm4gcmV0X3ZhbDsKIAl9CiAKQEAgLTE5Nyw3ICsxOTUsNyBAQAogCS8qIHJldHVybiBiYWNrIHRoZSBzdHJlYW0gaWQgKi8KIAlzbnByaW50ZihzdWJzdHJlYW0tPnBjbS0+aWQsIHNpemVvZihzdWJzdHJlYW0tPnBjbS0+aWQpLAogCQkJIiVkIiwgc3RyZWFtLT5zdHJlYW1faW5mby5zdHJfaWQpOwotCXByX2RlYnVnKCJzc3Q6IHN0cmVhbSBpZCB0byB1c2VyID0gJXNcbiIsCisJcHJfZGVidWcoInN0cmVhbSBpZCB0byB1c2VyID0gJXNcbiIsCiAJCQlzdWJzdHJlYW0tPnBjbS0+aWQpOwogCiAJcmV0X3ZhbCA9IHNuZF9pbnRlbG1hZF9pbml0X3N0cmVhbShzdWJzdHJlYW0pOwpAQCAtMjEyLDcgKzIxMCw3IEBACiB7CiAJaW50IHJldF92YWw7CiAKLQlwcl9kZWJ1Zygic3N0OiBzbmRfaW50ZWxtYWRfaHdfcGFyYW1zIGNhbGxlZFxuIik7CisJcHJfZGVidWcoInNuZF9pbnRlbG1hZF9od19wYXJhbXMgY2FsbGVkXG4iKTsKIAlyZXRfdmFsID0gc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwKIAkJCXBhcmFtc19idWZmZXJfYnl0ZXMoaHdfcGFyYW1zKSk7CiAJbWVtc2V0KHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FyZWEsIDAsCkBAIC0yMjMsNyArMjIxLDcgQEAKIAogc3RhdGljIGludCBzbmRfaW50ZWxtYWRfaHdfZnJlZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKLQlwcl9kZWJ1Zygic3N0OiBzbmRfaW50ZWxtYWRfaHdfZnJlZSBjYWxsZWRcbiIpOworCXByX2RlYnVnKCJzbmRfaW50ZWxtYWRfaHdfZnJlZSBjYWxsZWRcbiIpOwogCXJldHVybiBzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7CiB9CiAKQEAgLTI1MCwxNSArMjQ4LDE1IEBACiAJaWYgKHN0cmVhbS0+c3RyZWFtX3N0YXR1cyA9PSBJTklUKQogCQlyZXR1cm4gMDsKIAotCXJldF92YWwgPSBpbnRlbG1hZGRhdGEtPnNzdGRydl9vcHMtPmNvbnRyb2xfc2V0KFNTVF9TTkRfQlVGRkVSX1BPSU5URVIsCi0JCQkJJnN0cmVhbS0+c3RyZWFtX2luZm8pOworCXJldF92YWwgPSBpbnRlbG1hZGRhdGEtPnNzdGRydl9vcHMtPnBjbV9jb250cm9sLT5kZXZpY2VfY29udHJvbCgKKwkJCVNTVF9TTkRfQlVGRkVSX1BPSU5URVIsICZzdHJlYW0tPnN0cmVhbV9pbmZvKTsKIAlpZiAocmV0X3ZhbCkgewotCQlwcl9lcnIoInNzdDogZXJyb3IgY29kZSA9IDB4JXhcbiIsIHJldF92YWwpOworCQlwcl9lcnIoImVycm9yIGNvZGUgPSAweCV4XG4iLCByZXRfdmFsKTsKIAkJcmV0dXJuIHJldF92YWw7CiAJfQotCXByX2RlYnVnKCJzc3Q6IHNhbXBsZXMgcmVwb3J0ZWQgb3V0IDB4JWxseFxuIiwKKwlwcl9kZWJ1Zygic2FtcGxlcyByZXBvcnRlZCBvdXQgMHglbGx4XG4iLAogCQkJc3RyZWFtLT5zdHJlYW1faW5mby5idWZmZXJfcHRyKTsKLQlwcl9kZWJ1Zygic3N0OiBGcmFtZSBiaXRzOjogJWQgcGVyaW9kX2NvdW50IDo6ICVkXG4iLAorCXByX2RlYnVnKCJGcmFtZSBiaXRzOjogJWQgcGVyaW9kX2NvdW50IDo6ICVkXG4iLAogCQkJKGludClzdWJzdHJlYW0tPnJ1bnRpbWUtPmZyYW1lX2JpdHMsCiAJCQkoaW50KXN1YnN0cmVhbS0+cnVudGltZS0+cGVyaW9kX3NpemUpOwogCkBAIC0yNzcsMjYgKzI3NSwyNiBAQAogewogCXN0cnVjdCBzbmRfaW50ZWxtYWQgKmludGVsbWFkZGF0YTsKIAlzdHJ1Y3QgbWFkX3N0cmVhbV9wdnQgKnN0cmVhbTsKLQlpbnQgcmV0X3ZhbCA9IDA7CisJaW50IHJldF92YWwgPSAwLCBzdHJfaWQ7CiAKIAlXQVJOX09OKCFzdWJzdHJlYW0pOwogCiAJc3RyZWFtID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJc3RyX2lkID0gc3RyZWFtLT5zdHJlYW1faW5mby5zdHJfaWQ7CiAKLQlwcl9kZWJ1Zygic3N0OiBzbmRfaW50ZWxtYWRfY2xvc2UgY2FsbGVkXG4iKTsKKwlwcl9kZWJ1Zygic3N0OiBzbmRfaW50ZWxtYWRfY2xvc2UgY2FsbGVkIGZvciAlZFxuIiwgc3RyX2lkKTsKIAlpbnRlbG1hZGRhdGEgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CiAKLQlwcl9kZWJ1Zygic3N0OiBzdHIgaWQgPSAlZFxuIiwgc3RyZWFtLT5zdHJlYW1faW5mby5zdHJfaWQpOworCXByX2RlYnVnKCJzdHIgaWQgPSAlZFxuIiwgc3RyZWFtLT5zdHJlYW1faW5mby5zdHJfaWQpOwogCWlmIChzdHJlYW0tPnN0cmVhbV9pbmZvLnN0cl9pZCkgewogCQkvKiBTU1QgQVBJIHRvIGFjdHVhbGx5IHN0b3AvZnJlZSB0aGUgc3RyZWFtICovCi0JCXJldF92YWwgPSBpbnRlbG1hZGRhdGEtPnNzdGRydl9vcHMtPmNvbnRyb2xfc2V0KFNTVF9TTkRfRlJFRSwKLQkJCQkmc3RyZWFtLT5zdHJlYW1faW5mby5zdHJfaWQpOworCQlyZXRfdmFsID0gaW50ZWxtYWRkYXRhLT5zc3RkcnZfb3BzLT5wY21fY29udHJvbC0+Y2xvc2Uoc3RyX2lkKTsKIAkJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCiAJCQlpbnRlbG1hZGRhdGEtPnBsYXliYWNrX2NudC0tOwogCQllbHNlCiAJCQlpbnRlbG1hZGRhdGEtPmNhcHR1cmVfY250LS07CiAJfQotCXByX2RlYnVnKCJzc3Q6IHNuZF9pbnRlbG1hZF9jbG9zZSA6IHBiIGNudCA9ICVkIGNhcCBjbnQgPSAlZFxuIiwKKwlwcl9kZWJ1Zygic25kX2ludGVsbWFkX2Nsb3NlIDogcGIgY250ID0gJWQgY2FwIGNudCA9ICVkXG4iLAogCQlpbnRlbG1hZGRhdGEtPnBsYXliYWNrX2NudCwgaW50ZWxtYWRkYXRhLT5jYXB0dXJlX2NudCk7CiAJa2ZyZWUoc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGEpOwogCXJldHVybiByZXRfdmFsOwpAQCAtMzE5LDcgKzMxNyw3IEBACiAKIAlXQVJOX09OKCFzdWJzdHJlYW0pOwogCi0JcHJfZGVidWcoInNzdDogc25kX2ludGVsbWFkX29wZW4gY2FsbGVkXG4iKTsKKwlwcl9kZWJ1Zygic25kX2ludGVsbWFkX29wZW4gY2FsbGVkXG4iKTsKIAogCWludGVsbWFkZGF0YSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKIAlydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwpAQCAtNDU2LDE3ICs0NTQsMTcgQEAKIHsKIAogCWlmICghamFjaykgewotCQlwcl9kZWJ1Zygic3N0OiBNQUQgZXJyb3IgamFjayBlbXB0eVxuIik7CisJCXByX2RlYnVnKCJNQUQgZXJyb3IgamFjayBlbXB0eVxuIik7CiAKIAl9IGVsc2UgewotCQlwcl9kZWJ1Zygic3N0OiBNQUQgc2VuZCBqYWNrIHJlcG9ydCBmb3IgPSAlZCEhIVxuIiwgc3RhdHVzKTsKLQkJcHJfZGVidWcoInNzdDogTUFEIHNlbmQgamFjayByZXBvcnQgJWRcbiIsIGphY2stPnR5cGUpOworCQlwcl9kZWJ1ZygiTUFEIHNlbmQgamFjayByZXBvcnQgZm9yID0gJWQhISFcbiIsIHN0YXR1cyk7CisJCXByX2RlYnVnKCJNQUQgc2VuZCBqYWNrIHJlcG9ydCAlZFxuIiwgamFjay0+dHlwZSk7CiAJCXNuZF9qYWNrX3JlcG9ydChqYWNrLCBzdGF0dXMpOwogCiAJCS8qYnV0dG9uIHByZXNzZWQgYW5kIHJlbGVhc2VkICovCiAJCWlmIChidXR0b25wcmVzc2V2ZW50KQogCQkJc25kX2phY2tfcmVwb3J0KGphY2ssIDApOwotCQlwcl9kZWJ1Zygic3N0OiBNQUQgc2VuZGluZyBqYWNrIHJlcG9ydCBEb25lICEhIVxuIik7CisJCXByX2RlYnVnKCJNQUQgc2VuZGluZyBqYWNrIHJlcG9ydCBEb25lICEhIVxuIik7CiAJfQogCiAKQEAgLTQ5MCw3ICs0ODgsNyBAQAogCWlmIChpbnRzdHMgJiAweDQpIHsKIAogCQlpZiAoIShpbnRlbG1pZF9hdWRpb19pbnRlcnJ1cHRfZW5hYmxlKSkgewotCQkJcHJfZGVidWcoInNzdDogQXVkaW8gaW50ZXJydXB0IGVuYWJsZVxuIik7CisJCQlwcl9kZWJ1ZygiQXVkaW8gaW50ZXJydXB0IGVuYWJsZVxuIik7CiAJCQlzc3Rfc2NfcmVnX2FjY2VzcyhzY19hY2Nlc3MsIFBNSUNfUkVBRF9NT0RJRlksIDMpOwogCiAJCQlzc3Rfc2NfcmVnX2FjY2VzcyhzY19hY2Nlc3Nfd3JpdGUsIFBNSUNfV1JJVEUsIDEpOwpAQCAtNTAwLDcgKzQ5OCw3IEBACiAKIAkJfQogCQkvKiBzZW5kIGhlYWRwaG9uZSBkZXRlY3QgKi8KLQkJcHJfZGVidWcoInNzdDogTUFEIGhlYWRwaG9uZSAlZFxuIiwgaW50c3RzICYgMHg0KTsKKwkJcHJfZGVidWcoIk1BRCBoZWFkcGhvbmUgJWRcbiIsIGludHN0cyAmIDB4NCk7CiAJCWphY2sgPSAmaW50ZWxtYWRkYXRhLT5qYWNrWzBdLmphY2s7CiAJCXByZXNlbnQgPSAhKGludGVsbWFkZGF0YS0+amFja1swXS5qYWNrX3N0YXR1cyk7CiAJCWludGVsbWFkZGF0YS0+amFja1swXS5qYWNrX3N0YXR1cyA9IHByZXNlbnQ7CkBAIC01MTAsNyArNTA4LDcgQEAKIAogCWlmIChpbnRzdHMgJiAweDIpIHsKIAkJLyogc2VuZCBzaG9ydCBwdXNoICovCi0JCXByX2RlYnVnKCJzc3Q6IE1BRCBzaG9ydCBwdXNoICVkXG4iLCBpbnRzdHMgJiAweDIpOworCQlwcl9kZWJ1ZygiTUFEIHNob3J0IHB1c2ggJWRcbiIsIGludHN0cyAmIDB4Mik7CiAJCWphY2sgPSAmaW50ZWxtYWRkYXRhLT5qYWNrWzJdLmphY2s7CiAJCXByZXNlbnQgPSAxOwogCQlqYWNrX2V2ZW50X2ZsYWcgPSAxOwpAQCAtNTE4LDcgKzUxNiw3IEBACiAJfQogCWlmIChpbnRzdHMgJiAweDEpIHsKIAkJLyogc2VuZCBsb25nIHB1c2ggKi8KLQkJcHJfZGVidWcoInNzdDogTUFEIGxvbmcgcHVzaCAlZFxuIiwgaW50c3RzICYgMHgxKTsKKwkJcHJfZGVidWcoIk1BRCBsb25nIHB1c2ggJWRcbiIsIGludHN0cyAmIDB4MSk7CiAJCWphY2sgPSAmaW50ZWxtYWRkYXRhLT5qYWNrWzNdLmphY2s7CiAJCXByZXNlbnQgPSAxOwogCQlqYWNrX2V2ZW50X2ZsYWcgPSAxOwpAQCAtNTI2LDcgKzUyNCw3IEBACiAJfQogCWlmIChpbnRzdHMgJiAweDgpIHsKIAkJaWYgKCEoaW50ZWxtaWRfYXVkaW9faW50ZXJydXB0X2VuYWJsZSkpIHsKLQkJCXByX2RlYnVnKCJzc3Q6IEF1ZGlvIGludGVycnVwdCBlbmFibGVcbiIpOworCQkJcHJfZGVidWcoIkF1ZGlvIGludGVycnVwdCBlbmFibGVcbiIpOwogCQkJc3N0X3NjX3JlZ19hY2Nlc3Moc2NfYWNjZXNzLCBQTUlDX1JFQURfTU9ESUZZLCAzKTsKIAogCQkJc3N0X3NjX3JlZ19hY2Nlc3Moc2NfYWNjZXNzX3dyaXRlLCBQTUlDX1dSSVRFLCAxKTsKQEAgLTUzNSw3ICs1MzMsNyBAQAogCQkJaW50ZWxtYWRkYXRhLT5qYWNrWzFdLmphY2tfc3RhdHVzID0gMDsKIAkJfQogCQkvKiBzZW5kIGhlYWRzZXQgZGV0ZWN0ICovCi0JCXByX2RlYnVnKCJzc3Q6IE1BRCBoZWFkc2V0ID0gJWRcbiIsIGludHN0cyAmIDB4OCk7CisJCXByX2RlYnVnKCJNQUQgaGVhZHNldCA9ICVkXG4iLCBpbnRzdHMgJiAweDgpOwogCQlqYWNrID0gJmludGVsbWFkZGF0YS0+amFja1sxXS5qYWNrOwogCQlwcmVzZW50ID0gIShpbnRlbG1hZGRhdGEtPmphY2tbMV0uamFja19zdGF0dXMpOwogCQlpbnRlbG1hZGRhdGEtPmphY2tbMV0uamFja19zdGF0dXMgPSBwcmVzZW50OwpAQCAtNTU4LDEwICs1NTYsMTAgQEAKIAogCXNjYXJkX29wcyA9IGludGVsbWFkZGF0YS0+c3N0ZHJ2X29wcy0+c2NhcmRfb3BzOwogCi0JcHJfZGVidWcoInNzdDogcHJldmlvdXMgdmFsdWU6ICV4XG4iLCBpbnRlbG1hZGRhdGEtPmphY2tfcHJldl9zdGF0ZSk7CisJcHJfZGVidWcoInByZXZpb3VzIHZhbHVlOiAleFxuIiwgaW50ZWxtYWRkYXRhLT5qYWNrX3ByZXZfc3RhdGUpOwogCiAJaWYgKCEoaW50ZWxtaWRfYXVkaW9faW50ZXJydXB0X2VuYWJsZSkpIHsKLQkJcHJfZGVidWcoInNzdDogQXVkaW8gaW50ZXJydXB0IGVuYWJsZVxuIik7CisJCXByX2RlYnVnKCJBdWRpbyBpbnRlcnJ1cHQgZW5hYmxlXG4iKTsKIAkJaW50ZWxtYWRkYXRhLT5qYWNrX3ByZXZfc3RhdGUgPSAweEMwOwogCQlpbnRlbG1pZF9hdWRpb19pbnRlcnJ1cHRfZW5hYmxlID0gMTsKIAl9CkBAIC01NzIsMTIgKzU3MCwxMiBAQAogCQkJc2NfYWNjZXNzX3JlYWQucmVnX2FkZHIgPSAweDIwMTsKIAkJCXNzdF9zY19yZWdfYWNjZXNzKCZzY19hY2Nlc3NfcmVhZCwgUE1JQ19SRUFELCAxKTsKIAkJCXZhbHVlID0gKHNjX2FjY2Vzc19yZWFkLnZhbHVlKTsKLQkJCXByX2RlYnVnKCJzc3Q6IHZhbHVlIHJldHVybmVkID0gMHgleFxuIiwgdmFsdWUpOworCQkJcHJfZGVidWcoInZhbHVlIHJldHVybmVkID0gMHgleFxuIiwgdmFsdWUpOwogCQl9CiAKIAkJaWYgKGphY2tfcHJldl9zdGF0ZSA9PSAweGMwICYmIHZhbHVlID09IDB4NDApIHsKIAkJCS8qaGVhZHNldCBkZXRlY3RlZC4gKi8KLQkJCXByX2RlYnVnKCJzc3Q6IE1BRCBoZWFkc2V0IGluc2VydGVkXG4iKTsKKwkJCXByX2RlYnVnKCJNQUQgaGVhZHNldCBpbnNlcnRlZFxuIik7CiAJCQlqYWNrID0gJmludGVsbWFkZGF0YS0+amFja1sxXS5qYWNrOwogCQkJcHJlc2VudCA9IDE7CiAJCQlqYWNrX2V2ZW50X2ZsYWcgPSAxOwpAQCAtNTg3LDcgKzU4NSw3IEBACiAKIAkJaWYgKGphY2tfcHJldl9zdGF0ZSA9PSAweGMwICYmIHZhbHVlID09IDB4MDApIHsKIAkJCS8qIGhlYWRwaG9uZSAgZGV0ZWN0ZWQuICovCi0JCQlwcl9kZWJ1Zygic3N0OiBNQUQgaGVhZHBob25lIGluc2VydGVkXG4iKTsKKwkJCXByX2RlYnVnKCJNQUQgaGVhZHBob25lIGluc2VydGVkXG4iKTsKIAkJCWphY2sgPSAmaW50ZWxtYWRkYXRhLT5qYWNrWzBdLmphY2s7CiAJCQlwcmVzZW50ID0gMTsKIAkJCWphY2tfZXZlbnRfZmxhZyA9IDE7CkBAIC01OTYsOSArNTk0LDkgQEAKIAogCQlpZiAoamFja19wcmV2X3N0YXRlID09IDB4NDAgJiYgdmFsdWUgPT0gMHhjMCkgewogCQkJLypoZWFkc2V0ICByZW1vdmVkKi8KLQkJCXByX2RlYnVnKCJzc3Q6IEphY2sgaGVhZHNldCBzdGF0dXMgJWRcbiIsCisJCQlwcl9kZWJ1ZygiSmFjayBoZWFkc2V0IHN0YXR1cyAlZFxuIiwKIAkJCQlpbnRlbG1hZGRhdGEtPmphY2tbMV0uamFja19zdGF0dXMpOwotCQkJcHJfZGVidWcoInNzdDogTUFEIGhlYWRzZXQgcmVtb3ZlZFxuIik7CisJCQlwcl9kZWJ1ZygiTUFEIGhlYWRzZXQgcmVtb3ZlZFxuIik7CiAJCQlqYWNrID0gJmludGVsbWFkZGF0YS0+amFja1sxXS5qYWNrOwogCQkJcHJlc2VudCA9IDA7CiAJCQlqYWNrX2V2ZW50X2ZsYWcgPSAxOwpAQCAtNjA3LDkgKzYwNSw5IEBACiAKIAkJaWYgKGphY2tfcHJldl9zdGF0ZSA9PSAweDAwICYmIHZhbHVlID09IDB4YzApIHsKIAkJCS8qIGhlYWRwaG9uZSAgZGV0ZWN0ZWQuICovCi0JCQlwcl9kZWJ1Zygic3N0OiBKYWNrIGhlYWRwaG9uZSBzdGF0dXMgJWRcbiIsCisJCQlwcl9kZWJ1ZygiSmFjayBoZWFkcGhvbmUgc3RhdHVzICVkXG4iLAogCQkJCQlpbnRlbG1hZGRhdGEtPmphY2tbMF0uamFja19zdGF0dXMpOwotCQkJcHJfZGVidWcoInNzdDogaGVhZHBob25lIHJlbW92ZWRcbiIpOworCQkJcHJfZGVidWcoImhlYWRwaG9uZSByZW1vdmVkXG4iKTsKIAkJCWphY2sgPSAmaW50ZWxtYWRkYXRhLT5qYWNrWzBdLmphY2s7CiAJCQlwcmVzZW50ID0gMDsKIAkJCWphY2tfZXZlbnRfZmxhZyA9IDE7CkBAIC02MTgsNyArNjE2LDcgQEAKIAkJaWYgKGphY2tfcHJldl9zdGF0ZSA9PSAweDQwICYmIHZhbHVlID09IDB4MDApIHsKIAkJCS8qYnV0dG9uIHByZXNzZWQqLwogCQkJZG9fZ2V0dGltZW9mZGF5KCZpbnRlbG1hZGRhdGEtPmphY2tbMV0uYnV0dG9ucHJlc3NlZCk7Ci0JCQlwcl9kZWJ1Zygic3N0OiBNQUQgYnV0dG9uIHByZXNzIGRldGVjdGVkIG4iKTsKKwkJCXByX2RlYnVnKCJNQUQgYnV0dG9uIHByZXNzIGRldGVjdGVkXG4iKTsKIAkJfQogCiAKQEAgLTYyOCwxOSArNjI2LDE5IEBACiAJCQkJZG9fZ2V0dGltZW9mZGF5KAogCQkJCQkmaW50ZWxtYWRkYXRhLT5qYWNrWzFdLmJ1dHRvbnJlbGVhc2VkKTsKIAkJCQkvKmJ1dHRvbiBwcmVzc2VkICovCi0JCQkJcHJfZGVidWcoInNzdDogQnV0dG9uIFJlbGVhc2VkIGRldGVjdGVkXG4iKTsKKwkJCQlwcl9kZWJ1ZygiQnV0dG9uIFJlbGVhc2VkIGRldGVjdGVkXG4iKTsKIAkJCQl0aW1lZGlmZiA9IGludGVsbWFkZGF0YS0+amFja1sxXS4KIAkJCQkJYnV0dG9ucmVsZWFzZWQudHZfc2VjIC0gaW50ZWxtYWRkYXRhLT4KIAkJCQkJamFja1sxXS5idXR0b25wcmVzc2VkLnR2X3NlYzsKIAkJCQlidXR0b25wcmVzc2ZsYWcgPSAxOwogCQkJCWlmICh0aW1lZGlmZiA+IDEpIHsKLQkJCQkJcHJfZGVidWcoInNzdDogbG9uZyBwcmVzcyBkZXRlY3RlZFxuIik7CisJCQkJCXByX2RlYnVnKCJsb25nIHByZXNzIGRldGVjdGVkXG4iKTsKIAkJCQkJLyogc2VuZCBoZWFkcGhvbmUgZGV0ZWN0L3VuZGV0ZWN0ICovCiAJCQkJCWphY2sgPSAmaW50ZWxtYWRkYXRhLT5qYWNrWzNdLmphY2s7CiAJCQkJCXByZXNlbnQgPSAxOwogCQkJCQlqYWNrX2V2ZW50X2ZsYWcgPSAxOwogCQkJCX0gZWxzZSB7Ci0JCQkJCXByX2RlYnVnKCJzc3Q6IHNob3J0IHByZXNzIGRldGVjdGVkXG4iKTsKKwkJCQkJcHJfZGVidWcoInNob3J0IHByZXNzIGRldGVjdGVkXG4iKTsKIAkJCQkJLyogc2VuZCBoZWFkcGhvbmUgZGV0ZWN0L3VuZGV0ZWN0ICovCiAJCQkJCWphY2sgPSAmaW50ZWxtYWRkYXRhLT5qYWNrWzJdLmphY2s7CiAJCQkJCXByZXNlbnQgPSAxOwpAQCAtNjY3LDI0ICs2NjUsMjQgQEAKIAkJc2NfYWNjZXNzX3JlYWQucmVnX2FkZHIgPSAweDEzMjsKIAkJc3N0X3NjX3JlZ19hY2Nlc3MoJnNjX2FjY2Vzc19yZWFkLCBQTUlDX1JFQUQsIDEpOwogCQl2YWx1ZSA9IChzY19hY2Nlc3NfcmVhZC52YWx1ZSk7Ci0JCXByX2RlYnVnKCJzc3Q6IHZhbHVlIHJldHVybmVkID0gMHgleFxuIiwgdmFsdWUpOworCQlwcl9kZWJ1ZygidmFsdWUgcmV0dXJuZWQgPSAweCV4XG4iLCB2YWx1ZSk7CiAJfQogCWlmIChpbnRzdHMgJiAweDEpIHsKLQkJcHJfZGVidWcoInNzdDogaGVhZHNldCBkZXRlY3RlZFxuIik7CisJCXByX2RlYnVnKCJoZWFkc2V0IGRldGVjdGVkXG4iKTsKIAkJLyogc2VuZCBoZWFkc2V0IGRldGVjdC91bmRldGVjdCAqLwogCQlqYWNrID0gJmludGVsbWFkZGF0YS0+amFja1sxXS5qYWNrOwogCQlwcmVzZW50ID0gKHZhbHVlID09IDB4MSkgPyAxIDogMDsKIAkJamFja19ldmVudF9mbGFnID0gMTsKIAl9CiAJaWYgKGludHN0cyAmIDB4MikgewotCQlwcl9kZWJ1Zygic3N0OiBoZWFkcGhvbmUgZGV0ZWN0ZWRcbiIpOworCQlwcl9kZWJ1ZygiaGVhZHBob25lIGRldGVjdGVkXG4iKTsKIAkJLyogc2VuZCBoZWFkcGhvbmUgZGV0ZWN0L3VuZGV0ZWN0ICovCiAJCWphY2sgPSAmaW50ZWxtYWRkYXRhLT5qYWNrWzBdLmphY2s7CiAJCXByZXNlbnQgPSAodmFsdWUgPT0gMHgyKSA/IDEgOiAwOwogCQlqYWNrX2V2ZW50X2ZsYWcgPSAxOwogCX0KIAlpZiAoaW50c3RzICYgMHg0KSB7Ci0JCXByX2RlYnVnKCJzc3Q6IHNob3J0IHB1c2ggZGV0ZWN0ZWRcbiIpOworCQlwcl9kZWJ1Zygic2hvcnQgcHVzaCBkZXRlY3RlZFxuIik7CiAJCS8qIHNlbmQgc2hvcnQgcHVzaCAqLwogCQlqYWNrID0gJmludGVsbWFkZGF0YS0+amFja1syXS5qYWNrOwogCQlwcmVzZW50ID0gMTsKQEAgLTY5Miw3ICs2OTAsNyBAQAogCQlidXR0b25wcmVzc2ZsYWcgPSAxOwogCX0KIAlpZiAoaW50c3RzICYgMHg4KSB7Ci0JCXByX2RlYnVnKCJzc3Q6IGxvbmcgcHVzaCBkZXRlY3RlZFxuIik7CisJCXByX2RlYnVnKCJsb25nIHB1c2ggZGV0ZWN0ZWRcbiIpOwogCQkvKiBzZW5kIGxvbmcgcHVzaCAqLwogCQlqYWNrID0gJmludGVsbWFkZGF0YS0+amFja1szXS5qYWNrOwogCQlwcmVzZW50ID0gMTsKQEAgLTczOCwxMiArNzM2LDEyIEBACiAJdTMyIHJlZ2Jhc2UgPSBBVURJTlRfQkFTRSwgcmVnc2l6ZSA9IDg7CiAJY2hhciAqZHJ2X25hbWU7CiAKLQlwcl9kZWJ1Zygic3N0OiBpcnEgcmVnIGRvbmUsIHJlZ2Jhc2UgMHgleCwgcmVnc2l6ZSAweCV4XG4iLAorCXByX2RlYnVnKCJpcnEgcmVnIGRvbmUsIHJlZ2Jhc2UgMHgleCwgcmVnc2l6ZSAweCV4XG4iLAogCQkJCQlyZWdiYXNlLCByZWdzaXplKTsKIAlpbnRlbG1hZGRhdGEtPmludF9iYXNlID0gaW9yZW1hcF9ub2NhY2hlKHJlZ2Jhc2UsIHJlZ3NpemUpOwogCWlmICghaW50ZWxtYWRkYXRhLT5pbnRfYmFzZSkKLQkJcHJfZXJyKCJzc3Q6IE1hcHBpbmcgb2YgY2FjaGUgZmFpbGVkXG4iKTsKLQlwcl9kZWJ1Zygic3N0OiBpcnEgPSAweCV4XG4iLCBpbnRlbG1hZGRhdGEtPmlycSk7CisJCXByX2VycigiTWFwcGluZyBvZiBjYWNoZSBmYWlsZWRcbiIpOworCXByX2RlYnVnKCJpcnEgPSAweCV4XG4iLCBpbnRlbG1hZGRhdGEtPmlycSk7CiAJaWYgKGludGVsbWFkZGF0YS0+Y3B1X2lkID09IENQVV9DSElQX1BFTldFTEwpCiAJCWRydl9uYW1lID0gRFJJVkVSX05BTUVfTUZMRDsKIAllbHNlCkBAIC03NTMsNyArNzUxLDcgQEAKIAkJCQlJUlFGX1NIQVJFRCwgZHJ2X25hbWUsCiAJCQkJaW50ZWxtYWRkYXRhKTsKIAlpZiAocmV0X3ZhbCkKLQkJcHJfZXJyKCJzc3Q6IGNhbm5vdCByZWdpc3RlciBJUlFcbiIpOworCQlwcl9lcnIoImNhbm5vdCByZWdpc3RlciBJUlFcbiIpOwogCXJldHVybiByZXRfdmFsOwogfQogCkBAIC03NzUsMTAgKzc3MywxMCBAQAogCQlpZiAocmV0X3ZhbCkKIAkJCXJldHVybiByZXRfdmFsOwogCQlzc3RfY2FyZF92ZW5kb3JfaWQgPSAodmVuZG9yX2FkZHIudmFsdWUgJiAoTUFTSzJ8TUFTSzF8TUFTSzApKTsKLQkJcHJfZGVidWcoInNzdDogb3JnaW5hbCBuIGV4dHJhdGVkIHZlbmRvciBpZCA9IDB4JXggJWRcbiIsCisJCXByX2RlYnVnKCJvcmdpbmFsIG4gZXh0cmF0ZWQgdmVuZG9yIGlkID0gMHgleCAlZFxuIiwKIAkJCQl2ZW5kb3JfYWRkci52YWx1ZSwgc3N0X2NhcmRfdmVuZG9yX2lkKTsKIAkJaWYgKHNzdF9jYXJkX3ZlbmRvcl9pZCA8IDAgfHwgc3N0X2NhcmRfdmVuZG9yX2lkID4gMikgewotCQkJcHJfZXJyKCJzc3Q6IHZlbmRvciBjYXJkIG5vdCBzdXBwb3J0ZWQhIVxuIik7CisJCQlwcl9lcnIoInZlbmRvciBjYXJkIG5vdCBzdXBwb3J0ZWQhIVxuIik7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQogCX0gZWxzZQpAQCAtODAxLDcgKzc5OSw3IEBACiAJLyogcmVnaXN0ZXJpbmcgd2l0aCBTU1QgZHJpdmVyIHRvIGdldCBhY2Nlc3MgdG8gU1NUIEFQSXMgdG8gdXNlICovCiAJcmV0X3ZhbCA9IHJlZ2lzdGVyX3NzdF9jYXJkKGludGVsbWFkZGF0YS0+c3N0ZHJ2X29wcyk7CiAJaWYgKHJldF92YWwpIHsKLQkJcHJfZXJyKCJzc3Q6IHNzdCBjYXJkIHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIpOworCQlwcl9lcnIoInNzdCBjYXJkIHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIpOwogCQlyZXR1cm4gcmV0X3ZhbDsKIAl9CiAKQEAgLTgzMiw3ICs4MzAsNyBAQAogCWNoYXIgbmFtZVszMl0gPSBJTlRFTF9NQUQ7CiAJc3RydWN0IHNuZF9wY21fb3BzICpwYl9vcHMgPSBOVUxMLCAqY2FwX29wcyA9IE5VTEw7CiAKLQlwcl9kZWJ1Zygic3N0OiBjYWxsZWQgZm9yIHBiICVkLCBjcCAlZCwgaWR4ICVkXG4iLCBwYiwgY2FwLCBpbmRleCk7CisJcHJfZGVidWcoImNhbGxlZCBmb3IgcGIgJWQsIGNwICVkLCBpZHggJWRcbiIsIHBiLCBjYXAsIGluZGV4KTsKIAlyZXRfdmFsID0gc25kX3BjbV9uZXcoY2FyZCwgbmFtZSwgaW5kZXgsIHBiLCBjYXAsICZwY20pOwogCWlmIChyZXRfdmFsKQogCQlyZXR1cm4gcmV0X3ZhbDsKQEAgLTg3OCw3ICs4NzYsNyBAQAogCiAJV0FSTl9PTighY2FyZCk7CiAJV0FSTl9PTighaW50ZWxtYWRkYXRhKTsKLQlwcl9kZWJ1Zygic3N0OiBzbmRfaW50ZWxtYWRfcGNtIGNhbGxlZFxuIik7CisJcHJfZGVidWcoInNuZF9pbnRlbG1hZF9wY20gY2FsbGVkXG4iKTsKIAlyZXRfdmFsID0gc25kX2ludGVsbWFkX3BjbV9uZXcoY2FyZCwgaW50ZWxtYWRkYXRhLCAxLCAxLCAwKTsKIAlpZiAoaW50ZWxtYWRkYXRhLT5jcHVfaWQgPT0gQ1BVX0NISVBfTElOQ1JPRlQpCiAJCXJldHVybiByZXRfdmFsOwpAQCAtOTAzLDcgKzkwMSw3IEBACiAJc3RydWN0IHNuZF9qYWNrICpqYWNrOwogCWludCByZXR2YWw7CiAKLQlwcl9kZWJ1Zygic3N0OiBzbmRfaW50ZWxtYWRfamFjayBjYWxsZWRcbiIpOworCXByX2RlYnVnKCJzbmRfaW50ZWxtYWRfamFjayBjYWxsZWRcbiIpOwogCWphY2sgPSAmaW50ZWxtYWRkYXRhLT5qYWNrWzBdLmphY2s7CiAJcmV0dmFsID0gc25kX2phY2tfbmV3KGludGVsbWFkZGF0YS0+Y2FyZCwgIkhlYWRwaG9uZSIsCiAJCQkJU05EX0pBQ0tfSEVBRFBIT05FLCAmamFjayk7CkBAIC05ODIsOSArOTgwLDkgQEAKIAkJcmV0X3ZhbCA9IHNuZF9jdGxfYWRkKGNhcmQsCiAJCQkJc25kX2N0bF9uZXcxKCZjb250cm9sc1tpZHhdLAogCQkJCWludGVsbWFkZGF0YSkpOwotCQlwcl9kZWJ1Zygic3N0OiBtaXhlcltpZHhdPSVkIGFkZGVkXG4iLCBpZHgpOworCQlwcl9kZWJ1ZygibWl4ZXJbaWR4XT0lZCBhZGRlZFxuIiwgaWR4KTsKIAkJaWYgKHJldF92YWwpIHsKLQkJCXByX2Vycigic3N0OiBpbiBhZGRpbmcgb2YgY29udHJvbCBpbmRleCA9ICVkXG4iLCBpZHgpOworCQkJcHJfZXJyKCJpbiBhZGRpbmcgb2YgY29udHJvbCBpbmRleCA9ICVkXG4iLCBpZHgpOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC05OTksNyArOTk3LDcgQEAKIAogCWludGVsbWFkZGF0YSA9IGRldmljZS0+ZGV2aWNlX2RhdGE7CiAKLQlwcl9kZWJ1Zygic3N0OiBzbmRfaW50ZWxtYWRfZGV2X2ZyZWUgY2FsbGVkXG4iKTsKKwlwcl9kZWJ1Zygic25kX2ludGVsbWFkX2Rldl9mcmVlIGNhbGxlZFxuIik7CiAJc25kX2NhcmRfZnJlZShpbnRlbG1hZGRhdGEtPmNhcmQpOwogCS8qZ2VubF91bnJlZ2lzdGVyX2ZhbWlseSgmYXVkaW9fZXZlbnRfZ2VubF9mYW1pbHkpOyovCiAJdW5yZWdpc3Rlcl9zc3RfY2FyZChpbnRlbG1hZGRhdGEtPnNzdGRydl9vcHMpOwpAQCAtMTA0MCwyMyArMTAzOCwyMyBAQAogCWNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgKmlkID0gcGxhdGZvcm1fZ2V0X2RldmljZV9pZChwZGV2KTsKIAl1bnNpZ25lZCBpbnQgY3B1X2lkID0gKHVuc2lnbmVkIGludClpZC0+ZHJpdmVyX2RhdGE7CiAKLQlwcl9kZWJ1Zygic3N0OiBwcm9iZSBmb3IgJXMgY3B1X2lkICVkXG4iLCBwZGV2LT5uYW1lLCBjcHVfaWQpOworCXByX2RlYnVnKCJwcm9iZSBmb3IgJXMgY3B1X2lkICVkXG4iLCBwZGV2LT5uYW1lLCBjcHVfaWQpOwogCWlmICghc3RyY21wKHBkZXYtPm5hbWUsIERSSVZFUl9OQU1FX01SU1QpKQotCQlwcl9kZWJ1Zygic3N0OiBkZXRlY3RlZCBNUlNUXG4iKTsKKwkJcHJfZGVidWcoImRldGVjdGVkIE1SU1RcbiIpOwogCWVsc2UgaWYgKCFzdHJjbXAocGRldi0+bmFtZSwgRFJJVkVSX05BTUVfTUZMRCkpCi0JCXByX2RlYnVnKCJzc3Q6IGRldGVjdGVkIE1GTERcbiIpOworCQlwcl9kZWJ1ZygiZGV0ZWN0ZWQgTUZMRFxuIik7CiAJZWxzZSB7Ci0JCXByX2Vycigic3N0OiBkZXRlY3RlZCB1bmtub3duIGRldmljZSBhYm9ydCEhXG4iKTsKKwkJcHJfZXJyKCJkZXRlY3RlZCB1bmtub3duIGRldmljZSBhYm9ydCEhXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCWlmICgoY3B1X2lkIDwgQ1BVX0NISVBfTElOQ1JPRlQpIHx8IChjcHVfaWQgPiBDUFVfQ0hJUF9QRU5XRUxMKSkgewotCQlwcl9lcnIoInNzdDogZGV0ZWN0ZWQgdW5rbm93biBjcHVfaWQgYWJvcnQhIVxuIik7CisJCXByX2VycigiZGV0ZWN0ZWQgdW5rbm93biBjcHVfaWQgYWJvcnQhIVxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIAkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHNhdmluZyBpbnRlcm5hbCBjb250ZXh0IGFuZCB3b3JraW5nICovCiAJaW50ZWxtYWRkYXRhID0ga3phbGxvYyhzaXplb2YoKmludGVsbWFkZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghaW50ZWxtYWRkYXRhKSB7Ci0JCXByX2RlYnVnKCJzc3Q6IG1lbSBhbGxvY3RuIGZhaWxcbiIpOworCQlwcl9kZWJ1ZygibWVtIGFsbG9jdG4gZmFpbFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMTA2NCw3ICsxMDYyLDcgQEAKIAlpbnRlbG1hZGRhdGEtPnNzdGRydl9vcHMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaW50ZWxfc3N0X2NhcmRfb3BzKSwKIAkJCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFpbnRlbG1hZGRhdGEtPnNzdGRydl9vcHMpIHsKLQkJcHJfZXJyKCJzc3Q6IG1lbSBhbGxvY2F0aW9uIGZvciBvcHMgZmFpbFxuIik7CisJCXByX2VycigibWVtIGFsbG9jYXRpb24gZm9yIG9wcyBmYWlsXG4iKTsKIAkJa2ZyZWUoaW50ZWxtYWRkYXRhKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMTA3Myw3ICsxMDcxLDcgQEAKIAkvKiBjcmVhdGUgYSBjYXJkIGluc3RhbmNlIHdpdGggQUxTQSBmcmFtZXdvcmsgKi8KIAlyZXRfdmFsID0gc25kX2NhcmRfY3JlYXRlKGNhcmRfaW5kZXgsIGNhcmRfaWQsIFRISVNfTU9EVUxFLCAwLCAmY2FyZCk7CiAJaWYgKHJldF92YWwpIHsKLQkJcHJfZXJyKCJzc3Q6IHNuZF9jYXJkX2NyZWF0ZSBmYWlsXG4iKTsKKwkJcHJfZXJyKCJzbmRfY2FyZF9jcmVhdGUgZmFpbFxuIik7CiAJCWdvdG8gZnJlZV9hbGxvY3M7CiAJfQogCkBAIC0xMDkyLDcgKzEwOTAsNyBAQAogCS8qIHJlZ2lzdGVyaW5nIHdpdGggTFBFIGRyaXZlciB0byBnZXQgYWNjZXNzIHRvIFNTVCBBUElzIHRvIHVzZSAqLwogCXJldF92YWwgPSBzbmRfaW50ZWxtYWRfc3N0X3JlZ2lzdGVyKGludGVsbWFkZGF0YSk7CiAJaWYgKHJldF92YWwpIHsKLQkJcHJfZXJyKCJzc3Q6IHNuZF9pbnRlbG1hZF9zc3RfcmVnaXN0ZXIgZmFpbGVkXG4iKTsKKwkJcHJfZXJyKCJzbmRfaW50ZWxtYWRfc3N0X3JlZ2lzdGVyIGZhaWxlZFxuIik7CiAJCWdvdG8gZnJlZV9hbGxvY3M7CiAJfQogCkBAIC0xMTAwLDE5ICsxMDk4LDE5IEBACiAKIAlyZXRfdmFsID0gc25kX2ludGVsbWFkX3BjbShjYXJkLCBpbnRlbG1hZGRhdGEpOwogCWlmIChyZXRfdmFsKSB7Ci0JCXByX2Vycigic3N0OiBzbmRfaW50ZWxtYWRfcGNtIGZhaWxlZFxuIik7CisJCXByX2Vycigic25kX2ludGVsbWFkX3BjbSBmYWlsZWRcbiIpOwogCQlnb3RvIGZyZWVfYWxsb2NzOwogCX0KIAogCXJldF92YWwgPSBzbmRfaW50ZWxtYWRfbWl4ZXIoaW50ZWxtYWRkYXRhKTsKIAlpZiAocmV0X3ZhbCkgewotCQlwcl9lcnIoInNzdDogc25kX2ludGVsbWFkX21peGVyIGZhaWxlZFxuIik7CisJCXByX2Vycigic25kX2ludGVsbWFkX21peGVyIGZhaWxlZFxuIik7CiAJCWdvdG8gZnJlZV9hbGxvY3M7CiAJfQogCiAJcmV0X3ZhbCA9IHNuZF9pbnRlbG1hZF9qYWNrKGludGVsbWFkZGF0YSk7CiAJaWYgKHJldF92YWwpIHsKLQkJcHJfZXJyKCJzc3Q6IHNuZF9pbnRlbG1hZF9qYWNrIGZhaWxlZFxuIik7CisJCXByX2Vycigic25kX2ludGVsbWFkX2phY2sgZmFpbGVkXG4iKTsKIAkJZ290byBmcmVlX2FsbG9jczsKIAl9CiAKQEAgLTExMjYsMzEgKzExMjQsMzEgQEAKIAogCXJldF92YWwgPSBzbmRfaW50ZWxtYWRfcmVnaXN0ZXJfaXJxKGludGVsbWFkZGF0YSk7CiAJaWYgKHJldF92YWwpIHsKLQkJcHJfZXJyKCJzc3Q6IHNuZF9pbnRlbG1hZF9yZWdpc3Rlcl9pcnEgZmFpbFxuIik7CisJCXByX2Vycigic25kX2ludGVsbWFkX3JlZ2lzdGVyX2lycSBmYWlsXG4iKTsKIAkJZ290byBmcmVlX2FsbG9jczsKIAl9CiAKIAkvKiBpbnRlcm5hbCBmdW5jdGlvbiBjYWxsIHRvIHJlZ2lzdGVyIGRldmljZSB3aXRoIEFMU0EgKi8KIAlyZXRfdmFsID0gc25kX2ludGVsbWFkX2NyZWF0ZShpbnRlbG1hZGRhdGEsIGNhcmQpOwogCWlmIChyZXRfdmFsKSB7Ci0JCXByX2Vycigic3N0OiBzbmRfaW50ZWxtYWRfY3JlYXRlIGZhaWxlZFxuIik7CisJCXByX2Vycigic25kX2ludGVsbWFkX2NyZWF0ZSBmYWlsZWRcbiIpOwogCQlnb3RvIGZyZWVfYWxsb2NzOwogCX0KIAljYXJkLT5wcml2YXRlX2RhdGEgPSAmaW50ZWxtYWRkYXRhOwogCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBkZXYtPmRldik7CiAJcmV0X3ZhbCA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpOwogCWlmIChyZXRfdmFsKSB7Ci0JCXByX2Vycigic3N0OiBzbmRfY2FyZF9yZWdpc3RlciBmYWlsZWRcbiIpOworCQlwcl9lcnIoInNuZF9jYXJkX3JlZ2lzdGVyIGZhaWxlZFxuIik7CiAJCWdvdG8gZnJlZV9hbGxvY3M7CiAJfQogCi0JcHJfZGVidWcoInNzdDpzbmRfaW50ZWxtYWRfcHJvYmUgY29tcGxldGVcbiIpOworCXByX2RlYnVnKCJzbmRfaW50ZWxtYWRfcHJvYmUgY29tcGxldGVcbiIpOwogCXJldHVybiByZXRfdmFsOwogCiBmcmVlX21hZF9qYWNrX3dxOgogCWRlc3Ryb3lfd29ya3F1ZXVlKGludGVsbWFkZGF0YS0+bWFkX2phY2tfd3EpOwogZnJlZV9hbGxvY3M6Ci0JcHJfZXJyKCJzc3Q6IHByb2JlIGZhaWxlZFxuIik7CisJcHJfZXJyKCJwcm9iZSBmYWlsZWRcbiIpOwogCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJa2ZyZWUoaW50ZWxtYWRkYXRhLT5zc3RkcnZfb3BzKTsKIAlrZnJlZShpbnRlbG1hZGRhdGEpOwpAQCAtMTIwMCw3ICsxMTk4LDcgQEAKICAqLwogc3RhdGljIGludCBfX2luaXQgYWxzYV9jYXJkX2ludGVsbWFkX2luaXQodm9pZCkKIHsKLQlwcl9kZWJ1Zygic3N0OiBtYWRfaW5pdCBjYWxsZWRcbiIpOworCXByX2RlYnVnKCJtYWRfaW5pdCBjYWxsZWRcbiIpOwogCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNuZF9pbnRlbG1hZF9kcml2ZXIpOwogfQogCkBAIC0xMjExLDcgKzEyMDksNyBAQAogICovCiBzdGF0aWMgdm9pZCBfX2V4aXQgYWxzYV9jYXJkX2ludGVsbWFkX2V4aXQodm9pZCkKIHsKLQlwcl9kZWJ1Zygic3N0Om1hZF9leGl0IGNhbGxlZFxuIik7CisJcHJfZGVidWcoIm1hZF9leGl0IGNhbGxlZFxuIik7CiAJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzbmRfaW50ZWxtYWRfZHJpdmVyKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbG1pZC5oIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbG1pZC5oCmluZGV4IDgxZTc0NDguLjBjZTEwMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxtaWQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsbWlkLmgKQEAgLTE3OCw5ICsxNzgsNCBAQAogZXh0ZXJuIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pbnRlbG1hZF9jb250cm9sc19tZmxkW107CiBleHRlcm4gc3RydWN0IHNuZF9wbWljX29wcyAqaW50ZWxtYWRfdmVuZG9yX29wc1tdOwogCi0vKiBUaGlzIGlzIGFuIGVuYWJsZXIgaG9vayBhcyB0aGUgcGxhdGZvcm0gZGV0ZWN0aW9uIGxvZ2ljIGlzbid0IHlldAotICAgcHJlc2VudCBhbmQgZGVwZW5kcyBvbiBzb21lIGZpcm13YXJlIGFuZCBETUkgc3VwcG9ydCB0byBkZXRlY3QgQUFWQQotICAgZGV2aWNlcy4gSXQgd2lsbCB2YW5pc2ggb25jZSB0aGUgQUFWQSBwbGF0Zm9ybSBzdXBwb3J0IGlzIG1lcmdlZCAqLwotI2RlZmluZSBpc19hYXZhKCkJMAotCiAjZW5kaWYgLyogX19JTlRFTE1JRF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsbWlkX2N0cmwuYyBiL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxtaWRfY3RybC5jCmluZGV4IDAzYjRlY2UuLjY5YWYwNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxtaWRfY3RybC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxtaWRfY3RybC5jCkBAIC0yNCw2ICsyNCw5IEBACiAgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgogICogIEFMU0EgZHJpdmVyIGhhbmRsaW5nIG1peGVyIGNvbnRyb2xzIGZvciBJbnRlbCBNQUQgY2hpcHNldAogICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CiAjaW5jbHVkZSAiamFjay5oIgpAQCAtMjE2LDcgKzIxOSw3IEBACiAJc3RydWN0IHNuZF9pbnRlbG1hZCAqaW50ZWxtYWRkYXRhOwogCXN0cnVjdCBzbmRfcG1pY19vcHMgKnNjYXJkX29wczsKIAotCXByX2RlYnVnKCJzc3Q6IHNuZF9pbnRlbG1hZF92b2x1bWVfZ2V0IGNhbGxlZFxuIik7CisJcHJfZGVidWcoInNuZF9pbnRlbG1hZF92b2x1bWVfZ2V0IGNhbGxlZFxuIik7CiAKIAlXQVJOX09OKCF1dmFsKTsKIAlXQVJOX09OKCFrY29udHJvbCk7CkBAIC0yNzMsNyArMjc2LDcgQEAKIAlzdHJ1Y3Qgc25kX2ludGVsbWFkICppbnRlbG1hZGRhdGE7CiAJc3RydWN0IHNuZF9wbWljX29wcyAqc2NhcmRfb3BzOwogCi0JcHJfZGVidWcoInNzdDogTXV0ZV9nZXQgY2FsbGVkXG4iKTsKKwlwcl9kZWJ1ZygiTXV0ZV9nZXQgY2FsbGVkXG4iKTsKIAogCVdBUk5fT04oIXV2YWwpOwogCVdBUk5fT04oIWtjb250cm9sKTsKQEAgLTMzMiw3ICszMzUsNyBAQAogCXN0cnVjdCBzbmRfaW50ZWxtYWQgKmludGVsbWFkZGF0YTsKIAlzdHJ1Y3Qgc25kX3BtaWNfb3BzICpzY2FyZF9vcHM7CiAKLQlwcl9kZWJ1Zygic3N0OiB2b2x1bWUgc2V0IGNhbGxlZDolbGQgJWxkXG4iLAorCXByX2RlYnVnKCJ2b2x1bWUgc2V0IGNhbGxlZDolbGQgJWxkXG4iLAogCQkJdXZhbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSwKIAkJCXV2YWwtPnZhbHVlLmludGVnZXIudmFsdWVbMV0pOwogCkBAIC0zODcsNyArMzkwLDcgQEAKIAlzdHJ1Y3Qgc25kX2ludGVsbWFkICppbnRlbG1hZGRhdGE7CiAJc3RydWN0IHNuZF9wbWljX29wcyAqc2NhcmRfb3BzOwogCi0JcHJfZGVidWcoInNzdDogc25kX2ludGVsbWFkX211dGVfc2V0IGNhbGxlZFxuIik7CisJcHJfZGVidWcoInNuZF9pbnRlbG1hZF9tdXRlX3NldCBjYWxsZWRcbiIpOwogCiAJV0FSTl9PTighdXZhbCk7CiAJV0FSTl9PTigha2NvbnRyb2wpOwpAQCAtNDU1LDcgKzQ1OCw3IEBACiB7CiAJc3RydWN0IHNuZF9pbnRlbG1hZCAqaW50ZWxtYWRkYXRhOwogCXN0cnVjdCBzbmRfcG1pY19vcHMgKnNjYXJkX29wczsKLQlwcl9kZWJ1Zygic3N0OiBkZXZpY2VfZ2V0IGNhbGxlZFxuIik7CisJcHJfZGVidWcoImRldmljZV9nZXQgY2FsbGVkXG4iKTsKIAogCVdBUk5fT04oIXV2YWwpOwogCVdBUk5fT04oIWtjb250cm9sKTsKQEAgLTQ5MSw4ICs0OTQsOSBAQAogCXN0cnVjdCBzbmRfaW50ZWxtYWQgKmludGVsbWFkZGF0YTsKIAlzdHJ1Y3Qgc25kX3BtaWNfb3BzICpzY2FyZF9vcHM7CiAJaW50IHJldF92YWwgPSAwLCB2ZW5kb3IsIHN0YXR1czsKKwlzdHJ1Y3QgaW50ZWxfc3N0X3BjbV9jb250cm9sICpwY21fY29udHJvbDsKIAotCXByX2RlYnVnKCJzc3Q6IHNuZF9pbnRlbG1hZF9kZXZpY2Vfc2V0IGNhbGxlZFxuIik7CisJcHJfZGVidWcoInNuZF9pbnRlbG1hZF9kZXZpY2Vfc2V0IGNhbGxlZFxuIik7CiAKIAlXQVJOX09OKCF1dmFsKTsKIAlXQVJOX09OKCFrY29udHJvbCk7CkBAIC01MTgsMTUgKzUyMiwxMyBAQAogCWNhc2UgSU5QVVRfU0VMOgogCQl2ZW5kb3IgPSBpbnRlbG1hZGRhdGEtPnNzdGRydl9vcHMtPnZlbmRvcl9pZDsKIAkJaWYgKCh2ZW5kb3IgPT0gU05EX01YKSB8fCAodmVuZG9yID09IFNORF9GUykpIHsKLQkJCWlmICh1dmFsLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPT0gSFNfTUlDKSB7CisJCQlwY21fY29udHJvbCA9IGludGVsbWFkZGF0YS0+c3N0ZHJ2X29wcy0+cGNtX2NvbnRyb2w7CisJCQlpZiAodXZhbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID09IEhTX01JQykKIAkJCQlzdGF0dXMgPSAxOwotCQkJCWludGVsbWFkZGF0YS0+c3N0ZHJ2X29wcy0+Ci0JCQkJY29udHJvbF9zZXQoU1NUX0VOQUJMRV9SWF9USU1FX1NMT1QsICZzdGF0dXMpOwotCQkJfSBlbHNlIHsKKwkJCWVsc2UKIAkJCQlzdGF0dXMgPSAwOwotCQkJCWludGVsbWFkZGF0YS0+c3N0ZHJ2X29wcy0+Ci0JCQkJY29udHJvbF9zZXQoU1NUX0VOQUJMRV9SWF9USU1FX1NMT1QsICZzdGF0dXMpOwotCQkJfQorCQkJcGNtX2NvbnRyb2wtPmRldmljZV9jb250cm9sKAorCQkJCQlTU1RfRU5BQkxFX1JYX1RJTUVfU0xPVCwgJnN0YXR1cyk7CiAJCX0KIAkJcmV0X3ZhbCA9IHNjYXJkX29wcy0+c2V0X2lucHV0X2RldigKIAkJCQl1dmFsLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbG1pZF9tc2ljX2NvbnRyb2wuYyBiL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxtaWRfbXNpY19jb250cm9sLmMKaW5kZXggNGQxNzU1ZS4uZGEwOTNlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbG1pZF9tc2ljX2NvbnRyb2wuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsbWlkX21zaWNfY29udHJvbC5jCkBAIC0yNCw2ICsyNCw4IEBACiAgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGNvbnRyb2wgb3BlcmF0aW9ucyBvZiBtc2ljIHZlbmRvcnMKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSAiaW50ZWxfc3N0LmgiCkBAIC04Myw3ICs4NSw3IEBACiAJc25kX21zaWNfb3BzLmNhcF9vbiA9IDA7CiAJc25kX21zaWNfb3BzLmlucHV0X2Rldl9pZCA9IERNSUM7IC8qZGVmIGRldiovCiAJc25kX21zaWNfb3BzLm91dHB1dF9kZXZfaWQgPSBTVEVSRU9fSEVBRFBIT05FOwotCXByX2RlYnVnKCJzc3Q6IG1zaWMgaW5pdCBjb21wbGV0ZSEhXG4iKTsKKwlwcl9kZWJ1ZygibXNpYyBpbml0IGNvbXBsZXRlISFcbiIpOwogCXJldHVybiAwOwogfQogCkBAIC0xNzMsNyArMTc1LDcgQEAKIAkJCXJldHVybiByZXR2YWw7CiAJfQogCi0JcHJfZGVidWcoInNzdDogcG93ZXJpbmcgdXAgcGIuLi4uIERldmljZSAlZFxuIiwgZGV2aWNlKTsKKwlwcl9kZWJ1ZygicG93ZXJpbmcgdXAgcGIuLi4uIERldmljZSAlZFxuIiwgZGV2aWNlKTsKIAlzc3Rfc2NfcmVnX2FjY2VzcyhzY19hY2Nlc3MxLCBQTUlDX1dSSVRFLCA0KTsKIAlzd2l0Y2ggKGRldmljZSkgewogCWNhc2UgU05EX1NTVF9ERVZJQ0VfSEVBRFNFVDoKQEAgLTIwNSw3ICsyMDcsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCXByX3dhcm4oInNzdDogV3JvbmcgRGV2aWNlICVkLCBzZWxlY3RlZCAlZFxuIiwKKwkJcHJfd2FybigiV3JvbmcgRGV2aWNlICVkLCBzZWxlY3RlZCAlZFxuIiwKIAkJCSAgICAgICBkZXZpY2UsIHNuZF9tc2ljX29wcy5vdXRwdXRfZGV2X2lkKTsKIAl9CiAJcmV0dXJuIHNzdF9zY19yZWdfYWNjZXNzKHNjX2FjY2Vzc19wY20yLCBQTUlDX1JFQURfTU9ESUZZLCAxKTsKQEAgLTI2OCw3ICsyNzAsNyBAQAogCQkJcmV0dXJuIHJldHZhbDsKIAl9CiAKLQlwcl9kZWJ1Zygic3N0OiBwb3dlcmluZyB1cCBjcC4uLi4lZFxuIiwgc25kX21zaWNfb3BzLmlucHV0X2Rldl9pZCk7CisJcHJfZGVidWcoInBvd2VyaW5nIHVwIGNwLi4uLiVkXG4iLCBzbmRfbXNpY19vcHMuaW5wdXRfZGV2X2lkKTsKIAlzc3Rfc2NfcmVnX2FjY2VzcyhzY19hY2Nlc3MyLCBQTUlDX1JFQURfTU9ESUZZLCAxKTsKIAlzbmRfbXNpY19vcHMuY2FwX29uID0gMTsKIAlpZiAoc25kX21zaWNfb3BzLmlucHV0X2Rldl9pZCA9PSBBTUlDKQpAQCAtMjgzLDcgKzI4NSw3IEBACiB7CiAJaW50IHJldHZhbCA9IDA7CiAKLQlwcl9kZWJ1Zygic3N0OiBwb3dlcmluZyBkbiBtc2ljXG4iKTsKKwlwcl9kZWJ1ZygicG93ZXJpbmcgZG4gbXNpY1xuIik7CiAJc25kX21zaWNfb3BzLnBiX29uID0gMDsKIAlzbmRfbXNpY19vcHMuY2FwX29uID0gMDsKIAlyZXR1cm4gcmV0dmFsOwpAQCAtMjkzLDcgKzI5NSw3IEBACiB7CiAJaW50IHJldHZhbCA9IDA7CiAKLQlwcl9kZWJ1Zygic3N0OiBwb3dlcmluZyBkbiBwYi4uLi5cbiIpOworCXByX2RlYnVnKCJwb3dlcmluZyBkbiBwYi4uLi5cbiIpOwogCXNuZF9tc2ljX29wcy5wYl9vbiA9IDA7CiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTMwMiw3ICszMDQsNyBAQAogewogCWludCByZXR2YWwgPSAwOwogCi0JcHJfZGVidWcoInNzdDogcG93ZXJpbmcgZG4gY3AuLi4uXG4iKTsKKwlwcl9kZWJ1ZygicG93ZXJpbmcgZG4gY3AuLi4uXG4iKTsKIAlzbmRfbXNpY19vcHMuY2FwX29uID0gMDsKIAlyZXR1cm4gcmV0dmFsOwogfQpAQCAtMzExLDcgKzMxMyw3IEBACiB7CiAJaW50IHJldHZhbCA9IDA7CiAKLQlwcl9kZWJ1Zygic3N0OiBtc2ljIHNldCBzZWxlY3RlZCBvdXRwdXQ6JWRcbiIsIHZhbHVlKTsKKwlwcl9kZWJ1ZygibXNpYyBzZXQgc2VsZWN0ZWQgb3V0cHV0OiVkXG4iLCB2YWx1ZSk7CiAJc25kX21zaWNfb3BzLm91dHB1dF9kZXZfaWQgPSB2YWx1ZTsKIAlpZiAoc25kX21zaWNfb3BzLnBiX29uKQogCQltc2ljX3Bvd2VyX3VwX3BiKFNORF9TU1RfREVWSUNFX0hFQURTRVQpOwpAQCAtMzMwLDE1ICszMzIsMTUgQEAKIAl9OwogCWludCByZXR2YWwgPSAwOwogCi0JcHJfZGVidWcoInNzdDogbXNpY19zZXRfc2VsZWN0ZWRfaW5wdXRfZGV2OiVkXG4iLCB2YWx1ZSk7CisJcHJfZGVidWcoIm1zaWNfc2V0X3NlbGVjdGVkX2lucHV0X2RldjolZFxuIiwgdmFsdWUpOwogCXNuZF9tc2ljX29wcy5pbnB1dF9kZXZfaWQgPSB2YWx1ZTsKIAlzd2l0Y2ggKHZhbHVlKSB7CiAJY2FzZSBBTUlDOgotCQlwcl9kZWJ1Zygic3N0OiBTZWxlY3RpbmcgQU1JQzFcbiIpOworCQlwcl9kZWJ1ZygiU2VsZWN0aW5nIEFNSUMxXG4iKTsKIAkJcmV0dmFsID0gc3N0X3NjX3JlZ19hY2Nlc3Moc2NfYWNjZXNzX2FtaWMsIFBNSUNfV1JJVEUsIDEpOwogCQlicmVhazsKIAljYXNlIERNSUM6Ci0JCXByX2RlYnVnKCJzc3Q6IFNlbGVjdGluZyBETUlDMVxuIik7CisJCXByX2RlYnVnKCJTZWxlY3RpbmcgRE1JQzFcbiIpOwogCQlyZXR2YWwgPSBzc3Rfc2NfcmVnX2FjY2VzcyhzY19hY2Nlc3NfZG1pYywgUE1JQ19XUklURSwgMSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsbWlkX3B2dC5jIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbG1pZF9wdnQuYwppbmRleCA5ZWQ5NDc1Li4zYmE5ZGFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsbWlkX3B2dC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxtaWRfcHZ0LmMKQEAgLTIzLDYgKzIzLDkgQEAKICAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CiAgKiBBTFNBIGRyaXZlciBmb3IgSW50ZWwgTUlEIHNvdW5kIGNhcmQgY2hpcHNldCAtIGhvbGRpbmcgcHJpdmF0ZSBmdW5jdGlvbnMKICAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGFzbS9pbnRlbF9zY3VfaXBjLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpAQCAtNTAsNyArNTMsNyBAQAogCiAJaWYgKHN0cmVhbS0+c3RyZWFtX3N0YXR1cyAhPSBSVU5OSU5HKQogCQlyZXR1cm47Ci0JcHJfZGVidWcoInNzdDogY2FsbGluZyBwZXJpb2QgZWxhcHNlZFxuIik7CisJcHJfZGVidWcoImNhbGxpbmcgcGVyaW9kIGVsYXBzZWRcbiIpOwogCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoc3Vic3RyZWFtKTsKIAlyZXR1cm47CiB9CkBAIC03Niw4ICs3OSw4IEBACiAJcGFyYW0udWMucGNtX3BhcmFtcy5wZXJpb2RfY291bnQgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnBlcmlvZF9zaXplOwogCXBhcmFtLnVjLnBjbV9wYXJhbXMucmluZ19idWZmZXJfYWRkciA9CiAJCQkJdmlydF90b19waHlzKHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FyZWEpOwotCXByX2RlYnVnKCJzc3Q6IHBlcmlvZF9jbnQgPSAlZFxuIiwgcGFyYW0udWMucGNtX3BhcmFtcy5wZXJpb2RfY291bnQpOwotCXByX2RlYnVnKCJzc3Q6IHNmcmVxPSAlZCwgd2Rfc3ogPSAlZFxuIiwKKwlwcl9kZWJ1ZygicGVyaW9kX2NudCA9ICVkXG4iLCBwYXJhbS51Yy5wY21fcGFyYW1zLnBlcmlvZF9jb3VudCk7CisJcHJfZGVidWcoInNmcmVxPSAlZCwgd2Rfc3ogPSAlZFxuIiwKIAkJIHBhcmFtLnVjLnBjbV9wYXJhbXMuc2ZyZXEsIHBhcmFtLnVjLnBjbV9wYXJhbXMucGNtX3dkX3N6KTsKIAogCXN0cl9wYXJhbXMuc3BhcmFtcyA9IHBhcmFtOwpAQCAtODUsMjQgKzg4LDIyIEBACiAKIAlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgewogCQlzdHJfcGFyYW1zLm9wcyA9IFNUUkVBTV9PUFNfUExBWUJBQ0s7Ci0JCXByX2RlYnVnKCJzc3Q6IFBsYXliY2sgc3RyZWFtLERldmljZSAlZFxuIiwgc3RyZWFtLT5kZXZpY2UpOworCQlwcl9kZWJ1ZygiUGxheWJjayBzdHJlYW0sRGV2aWNlICVkXG4iLCBzdHJlYW0tPmRldmljZSk7CiAJfSBlbHNlIHsKIAkJc3RyX3BhcmFtcy5vcHMgPSBTVFJFQU1fT1BTX0NBUFRVUkU7CiAJCXN0cmVhbS0+ZGV2aWNlID0gU05EX1NTVF9ERVZJQ0VfQ0FQVFVSRTsKLQkJcHJfZGVidWcoInNzdDogQ2FwdHVyZSBzdHJlYW0sRGV2aWNlICVkXG4iLCBzdHJlYW0tPmRldmljZSk7CisJCXByX2RlYnVnKCJDYXB0dXJlIHN0cmVhbSxEZXZpY2UgJWRcbiIsIHN0cmVhbS0+ZGV2aWNlKTsKIAl9CiAJc3RyX3BhcmFtcy5kZXZpY2VfdHlwZSA9IHN0cmVhbS0+ZGV2aWNlOwotCXJldF92YWwgPSBpbnRlbG1hZGRhdGEtPnNzdGRydl9vcHMtPmNvbnRyb2xfc2V0KFNTVF9TTkRfQUxMT0MsCi0JCQkJCSZzdHJfcGFyYW1zKTsKLQlwcl9kZWJ1Zygic3N0OiBTU1RfU05EX1BMQVkvQ0FQVFVSRSByZXRfdmFsID0gJXhcbiIsCi0JCQlyZXRfdmFsKTsKKwlyZXRfdmFsID0gaW50ZWxtYWRkYXRhLT5zc3RkcnZfb3BzLT5wY21fY29udHJvbC0+b3Blbigmc3RyX3BhcmFtcyk7CisJcHJfZGVidWcoInNzdDogU1NUX1NORF9QTEFZL0NBUFRVUkUgcmV0X3ZhbCA9ICV4XG4iLCByZXRfdmFsKTsKIAlpZiAocmV0X3ZhbCA8IDApCiAJCXJldHVybiByZXRfdmFsOwogCiAJc3RyZWFtLT5zdHJlYW1faW5mby5zdHJfaWQgPSByZXRfdmFsOwogCXN0cmVhbS0+c3RyZWFtX3N0YXR1cyA9IElOSVQ7CiAJc3RyZWFtLT5zdHJlYW1faW5mby5idWZmZXJfcHRyID0gMDsKLQlwcl9kZWJ1Zygic3N0OiBzdHIgaWQgOiAgJWRcbiIsIHN0cmVhbS0+c3RyZWFtX2luZm8uc3RyX2lkKTsKKwlwcl9kZWJ1Zygic3RyIGlkIDogICVkXG4iLCBzdHJlYW0tPnN0cmVhbV9pbmZvLnN0cl9pZCk7CiAKIAlyZXR1cm4gcmV0X3ZhbDsKIH0KQEAgLTExMywxNSArMTE0LDE1IEBACiAJc3RydWN0IHNuZF9pbnRlbG1hZCAqaW50ZWxtYWRkYXRhID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwogCWludCByZXRfdmFsOwogCi0JcHJfZGVidWcoInNzdDogc2V0dGluZyBidWZmZXIgcHRyIHBhcmFtXG4iKTsKKwlwcl9kZWJ1Zygic2V0dGluZyBidWZmZXIgcHRyIHBhcmFtXG4iKTsKIAlzdHJlYW0tPnN0cmVhbV9pbmZvLnBlcmlvZF9lbGFwc2VkID0gcGVyaW9kX2VsYXBzZWQ7CiAJc3RyZWFtLT5zdHJlYW1faW5mby5tYWRfc3Vic3RyZWFtID0gc3Vic3RyZWFtOwogCXN0cmVhbS0+c3RyZWFtX2luZm8uYnVmZmVyX3B0ciA9IDA7CiAJc3RyZWFtLT5zdHJlYW1faW5mby5zZnJlcSA9IHN1YnN0cmVhbS0+cnVudGltZS0+cmF0ZTsKLQlyZXRfdmFsID0gaW50ZWxtYWRkYXRhLT5zc3RkcnZfb3BzLT5jb250cm9sX3NldChTU1RfU05EX1NUUkVBTV9JTklULAotCQkJCQkmc3RyZWFtLT5zdHJlYW1faW5mbyk7CisJcmV0X3ZhbCA9IGludGVsbWFkZGF0YS0+c3N0ZHJ2X29wcy0+cGNtX2NvbnRyb2wtPmRldmljZV9jb250cm9sKAorCQkJU1NUX1NORF9TVFJFQU1fSU5JVCwgJnN0cmVhbS0+c3RyZWFtX2luZm8pOwogCWlmIChyZXRfdmFsKQotCQlwcl9lcnIoInNzdDogY29udHJvbF9zZXQgcmV0IGVycm9yICVkXG4iLCByZXRfdmFsKTsKKwkJcHJfZXJyKCJjb250cm9sX3NldCByZXQgZXJyb3IgJWRcbiIsIHJldF92YWwpOwogCXJldHVybiByZXRfdmFsOwogCiB9CkBAIC0xNDUsMzAgKzE0NiwyOSBAQAogCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3ZhbDsgaSsrKSB7CiAJCQlyZXR2YWwgPSBpbnRlbF9zY3VfaXBjX2lvd3JpdGU4KHNjX2FjY2Vzc1tpXS5yZWdfYWRkciwKIAkJCQkJCQlzY19hY2Nlc3NbaV0udmFsdWUpOwotCQkJaWYgKHJldHZhbCkgewotCQkJCXByX2Vycigic3N0OiBJUEMgd3JpdGUgZmFpbGVkISEhICVkXG4iLCByZXR2YWwpOwotCQkJCXJldHVybiByZXR2YWw7Ci0JCQl9CisJCQlpZiAocmV0dmFsKQorCQkJCWdvdG8gZXJyOwogCQl9CiAJfSBlbHNlIGlmICh0eXBlID09IFBNSUNfUkVBRCkgewogCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3ZhbDsgaSsrKSB7CiAJCQlyZXR2YWwgPSBpbnRlbF9zY3VfaXBjX2lvcmVhZDgoc2NfYWNjZXNzW2ldLnJlZ19hZGRyLAogCQkJCQkJCSYoc2NfYWNjZXNzW2ldLnZhbHVlKSk7Ci0JCQlpZiAocmV0dmFsKSB7Ci0JCQkJcHJfZXJyKCJzc3Q6IElQQyByZWFkIGZhaWxlZCEhISEhJWRcbiIsIHJldHZhbCk7Ci0JCQkJcmV0dXJuIHJldHZhbDsKLQkJCX0KKwkJCWlmIChyZXR2YWwpCisJCQkJZ290byBlcnI7CiAJCX0KIAl9IGVsc2UgewogCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3ZhbDsgaSsrKSB7CiAJCQlyZXR2YWwgPSBpbnRlbF9zY3VfaXBjX3VwZGF0ZV9yZWdpc3RlcigKIAkJCQlzY19hY2Nlc3NbaV0ucmVnX2FkZHIsIHNjX2FjY2Vzc1tpXS52YWx1ZSwKIAkJCQlzY19hY2Nlc3NbaV0ubWFzayk7Ci0JCQlpZiAocmV0dmFsKSB7Ci0JCQkJcHJfZXJyKCJzc3Q6IElQQyBNb2RpZnkgZmFpbGVkISEhJWRcbiIsIHJldHZhbCk7Ci0JCQkJcmV0dXJuIHJldHZhbDsKLQkJCX0KKwkJCWlmIChyZXR2YWwpCisJCQkJZ290byBlcnI7CiAJCX0KIAl9Ci0JcmV0dXJuIHJldHZhbDsKKwlyZXR1cm4gMDsKK2VycjoKKwlwcl9lcnIoIklQQyBmYWlsZWQgZm9yIGNtZCAlZCwgJWRcbiIsIHJldHZhbCwgdHlwZSk7CisJcHJfZXJyKCJyZWc6MHglMnggYWRkcjoweCUyeFxuIiwKKwkJc2NfYWNjZXNzW2ldLnJlZ19hZGRyLCBzY19hY2Nlc3NbaV0udmFsdWUpOworIAlyZXR1cm4gcmV0dmFsOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbG1pZF92MF9jb250cm9sLmMgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsbWlkX3YwX2NvbnRyb2wuYwppbmRleCBmNTg2ZDYyLi43ODU5MjI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsbWlkX3YwX2NvbnRyb2wuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsbWlkX3YwX2NvbnRyb2wuYwpAQCAtMjYsNiArMjYsOCBAQAogICogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgY29udHJvbCBvcGVyYXRpb25zIG9mIHZlbmRvciAxCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgogI2luY2x1ZGUgImludGVsX3NzdC5oIgpAQCAtMTUxLDcgKzE1Myw3IEBACiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKIAotCXByX2RlYnVnKCJzc3Q6IGluIGZzIHBvd2VyIHVwIHBiXG4iKTsKKwlwcl9kZWJ1ZygiaW4gZnMgcG93ZXIgdXAgcGJcbiIpOwogCXJldHVybiBmc19lbmFibGVfYXVkaW9kYWMoVU5NVVRFKTsKIH0KIApAQCAtMTczLDcgKzE3NSw3IEBACiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKIAotCXByX2RlYnVnKCJzc3Q6IGluIGZzbCBwb3dlciBkb3duIHBiXG4iKTsKKwlwcl9kZWJ1ZygiaW4gZnNsIHBvd2VyIGRvd24gcGJcbiIpOwogCXJldHVybiBmc19lbmFibGVfYXVkaW9kYWMoVU5NVVRFKTsKIH0KIApAQCAtMzgwLDcgKzM4Miw3IEBACiAJCXNzdF9zY19yZWdfYWNjZXNzKHNjX2FjY2VzcywgUE1JQ19SRUFEX01PRElGWSwgMik7CiAKIAl9Ci0JcHJfZGVidWcoInNzdDogc2ZyZXE6JWQsUmVnaXN0ZXIgdmFsdWUgPSAleFxuIiwgc2ZyZXEsIGNvbmZpZzEpOworCXByX2RlYnVnKCJzZnJlcTolZCxSZWdpc3RlciB2YWx1ZSA9ICV4XG4iLCBzZnJlcSwgY29uZmlnMSk7CiAKIAlpZiAod29yZF9zaXplID09IDI0KSB7CiAJCXNjX2FjY2Vzc1swXS5yZWdfYWRkciAgPSBBVURJT1BPUlQxOwpAQCAtNDM4LDE4ICs0NDAsMTggQEAKIAogCXN3aXRjaCAodmFsdWUpIHsKIAljYXNlIEFNSUM6Ci0JCXByX2RlYnVnKCJzc3Q6IFNlbGVjdGluZyBhbWljIG5vdCBzdXBwb3J0ZWQgaW4gbW9ubyBjZmdcbiIpOworCQlwcl9kZWJ1ZygiU2VsZWN0aW5nIGFtaWMgbm90IHN1cHBvcnRlZCBpbiBtb25vIGNmZ1xuIik7CiAJCXJldHVybiBzc3Rfc2NfcmVnX2FjY2VzcyhzY19hY2Nlc3NfbWljLCBQTUlDX1JFQURfTU9ESUZZLCAyKTsKIAkJYnJlYWs7CiAKIAljYXNlIEhTX01JQzoKLQkJcHJfZGVidWcoInNzdDogU2VsZWN0aW5nIGhzbWljXG4iKTsKKwkJcHJfZGVidWcoIlNlbGVjdGluZyBoc21pY1xuIik7CiAJCXJldHVybiBzc3Rfc2NfcmVnX2FjY2VzcyhzY19hY2Nlc3NfaHNtaWMsCiAJCQkJUE1JQ19SRUFEX01PRElGWSwgMik7CiAJCWJyZWFrOwogCiAJY2FzZSBETUlDOgotCQlwcl9kZWJ1Zygic3N0OiBTZWxlY3RpbmcgZG1pY1xuIik7CisJCXByX2RlYnVnKCJTZWxlY3RpbmcgZG1pY1xuIik7CiAJCXJldHVybiBzc3Rfc2NfcmVnX2FjY2VzcyhzY19hY2Nlc3NfZG1pYywgUE1JQ19SRUFEX01PRElGWSwgMik7CiAJCWJyZWFrOwogCkBAIC01MDUsNyArNTA3LDcgQEAKIAkJcmV0dXJuIHJldHZhbDsKIAogCi0JcHJfZGVidWcoInNzdDogZGV2X2lkOjB4JXggdmFsdWU6MHgleFxuIiwgZGV2X2lkLCB2YWx1ZSk7CisJcHJfZGVidWcoImRldl9pZDoweCV4IHZhbHVlOjB4JXhcbiIsIGRldl9pZCwgdmFsdWUpOwogCXN3aXRjaCAoZGV2X2lkKSB7CiAJY2FzZSBQTUlDX1NORF9ETUlDX01VVEU6CiAJCXNjX2FjY2Vzc1swXS5yZWdfYWRkciA9IE1JQ0NUUkw7CkBAIC02MDYsNyArNjA4LDcgQEAKIAogCXN3aXRjaCAoZGV2X2lkKSB7CiAJY2FzZSBQTUlDX1NORF9MRUZUX1BCX1ZPTDoKLQkJcHJfZGVidWcoInNzdDogUE1JQ19TTkRfTEVGVF9QQl9WT0w6JWRcbiIsIHZhbHVlKTsKKwkJcHJfZGVidWcoIlBNSUNfU05EX0xFRlRfUEJfVk9MOiVkXG4iLCB2YWx1ZSk7CiAJCXNjX2FjY2Vzc1swXS52YWx1ZSA9IHNjX2FjY2Vzc1sxXS52YWx1ZSA9IHZhbHVlOwogCQlzY19hY2Nlc3NbMF0ucmVnX2FkZHIgPSBBVUQxNjsKIAkJc2NfYWNjZXNzWzFdLnJlZ19hZGRyID0gQVVEMTU7CkBAIC02MTYsNyArNjE4LDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFBNSUNfU05EX1JJR0hUX1BCX1ZPTDoKLQkJcHJfZGVidWcoInNzdDogUE1JQ19TTkRfUklHSFRfUEJfVk9MOiVkXG4iLCB2YWx1ZSk7CisJCXByX2RlYnVnKCJQTUlDX1NORF9SSUdIVF9QQl9WT0w6JWRcbiIsIHZhbHVlKTsKIAkJc2NfYWNjZXNzWzBdLnZhbHVlID0gc2NfYWNjZXNzWzFdLnZhbHVlID0gdmFsdWU7CiAJCXNjX2FjY2Vzc1swXS5yZWdfYWRkciA9IEFVRDE3OwogCQlzY19hY2Nlc3NbMV0ucmVnX2FkZHIgPSBBVUQxNTsKQEAgLTYyOSw3ICs2MzEsNyBAQAogCQlyZWdfbnVtID0gMjsKIAkJYnJlYWs7CiAJY2FzZSBQTUlDX1NORF9DQVBUVVJFX1ZPTDoKLQkJcHJfZGVidWcoInNzdDogUE1JQ19TTkRfQ0FQVFVSRV9WT0w6JWRcbiIsIHZhbHVlKTsKKwkJcHJfZGVidWcoIlBNSUNfU05EX0NBUFRVUkVfVk9MOiVkXG4iLCB2YWx1ZSk7CiAJCXNjX2FjY2Vzc1swXS5yZWdfYWRkciA9IE1JQ0xJQ1RSTDE7CiAJCXNjX2FjY2Vzc1sxXS5yZWdfYWRkciA9IE1JQ0xJQ1RSTDI7CiAJCXNjX2FjY2Vzc1syXS5yZWdfYWRkciA9IERNSUNDVFJMMTsKQEAgLTcyNiwxNyArNzI4LDE3IEBACiAKIAlzd2l0Y2ggKGRldl9pZCkgewogCWNhc2UgUE1JQ19TTkRfQ0FQVFVSRV9WT0w6Ci0JCXByX2RlYnVnKCJzc3Q6IFBNSUNfU05EX0NBUFRVUkVfVk9MXG4iKTsKKwkJcHJfZGVidWcoIlBNSUNfU05EX0NBUFRVUkVfVk9MXG4iKTsKIAkJc2NfYWNjZXNzLnJlZ19hZGRyID0gTUlDTElDVFJMMTsKIAkJbWFzayA9IChNQVNLNXxNQVNLNHxNQVNLM3xNQVNLMnxNQVNLMXxNQVNLMCk7CiAJCWJyZWFrOwogCWNhc2UgUE1JQ19TTkRfTEVGVF9QQl9WT0w6Ci0JCXByX2RlYnVnKCJzc3Q6IFBNSUNfU05EX0xFRlRfUEJfVk9MXG4iKTsKKwkJcHJfZGVidWcoIlBNSUNfU05EX0xFRlRfUEJfVk9MXG4iKTsKIAkJc2NfYWNjZXNzLnJlZ19hZGRyID0gQVVEMTY7CiAJCW1hc2sgPSAoTUFTSzV8TUFTSzR8TUFTSzN8TUFTSzJ8TUFTSzF8TUFTSzApOwogCQlicmVhazsKIAljYXNlIFBNSUNfU05EX1JJR0hUX1BCX1ZPTDoKLQkJcHJfZGVidWcoInNzdDogUE1JQ19TTkRfUlRfUEJfVk9MXG4iKTsKKwkJcHJfZGVidWcoIlBNSUNfU05EX1JUX1BCX1ZPTFxuIik7CiAJCXNjX2FjY2Vzcy5yZWdfYWRkciA9IEFVRDE3OwogCQltYXNrID0gKE1BU0s1fE1BU0s0fE1BU0szfE1BU0syfE1BU0sxfE1BU0swKTsKIAkJYnJlYWs7CkBAIC03NDUsOSArNzQ3LDkgQEAKIAl9CiAKIAlyZXR2YWwgPSBzc3Rfc2NfcmVnX2FjY2Vzcygmc2NfYWNjZXNzLCBQTUlDX1JFQUQsIDEpOwotCXByX2RlYnVnKCJzc3Q6IHZhbHVlIHJlYWQgPSAweCV4XG4iLCBzY19hY2Nlc3MudmFsdWUpOworCXByX2RlYnVnKCJ2YWx1ZSByZWFkID0gMHgleFxuIiwgc2NfYWNjZXNzLnZhbHVlKTsKIAkqdmFsdWUgPSAoaW50KSAoc2NfYWNjZXNzLnZhbHVlICYgbWFzayk7Ci0JcHJfZGVidWcoInNzdDogdmFsdWUgcmV0dXJuZWQgPSAweCV4XG4iLCAqdmFsdWUpOworCXByX2RlYnVnKCJ2YWx1ZSByZXR1cm5lZCA9IDB4JXhcbiIsICp2YWx1ZSk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbG1pZF92MV9jb250cm9sLmMgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsbWlkX3YxX2NvbnRyb2wuYwppbmRleCA5ZGU4NmIyLi40NzhjZmVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsbWlkX3YxX2NvbnRyb2wuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsbWlkX3YxX2NvbnRyb2wuYwpAQCAtMjUsNiArMjUsOCBAQAogICogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgY29udHJvbCBvcGVyYXRpb25zIG9mIHZlbmRvciAyCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgogI2luY2x1ZGUgPGFzbS9tcnN0Lmg+CkBAIC0xMzIsNTYgKzEzNCw2IEBACiAJcmV0dXJuIHNzdF9zY19yZWdfYWNjZXNzKHNjX2FjY2VzcywgUE1JQ19XUklURSwgNDcpOwogfQogCi1zdGF0aWMgaW50IG14X2luaXRfY2FwdHVyZV9jYXJkKHZvaWQpCi17Ci0Jc3RydWN0IHNjX3JlZ19hY2Nlc3Mgc2NfYWNjZXNzW10gPSB7Ci0JCXsweDIwNiwgMHg1YSwgMHgwfSwKLQkJezB4MjA3LCAweGJlLCAweDB9LAotCQl7MHgyMDgsIDB4OTAsIDB4MH0sCi0JCXsweDIwOSwgMHgzMiwgMHgwfSwKLQkJezB4MjBlLCAweDIyLCAweDB9LAotCQl7MHgyMTAsIDB4ODQsIDB4MH0sCi0JCXsweDIyMywgMHgyMCwgMHgwfSwKLQkJezB4MjI2LCAweEMwLCAweDB9LAotCX07Ci0KLQlpbnQgcmV0dmFsID0gMDsKLQotCXJldHZhbCA9IHNzdF9zY19yZWdfYWNjZXNzKHNjX2FjY2VzcywgUE1JQ19XUklURSwgOCk7Ci0JaWYgKDAgIT0gcmV0dmFsKSB7Ci0JCS8qIHBtaWMgY29tbXVuaWNhdGlvbiBmYWlscyAqLwotCQlwcl9kZWJ1Zygic3N0OiBwbWljIGNvbW1uIGZhaWxlZFxuIik7Ci0JCXJldHVybiByZXR2YWw7Ci0JfQotCi0JcHJfZGVidWcoInNzdDogQ2FwdHVyZSBjb25maWd1cmF0aW9uIGNvbXBsZXRlISFcbiIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG14X2luaXRfcGxheWJhY2tfY2FyZCh2b2lkKQotewotCXN0cnVjdCBzY19yZWdfYWNjZXNzIHNjX2FjY2Vzc1tdID0gewotCQl7MHgyMDYsIDB4MDAsIDB4MH0sCi0JCXsweDIwNywgMHgwMCwgMHgwfSwKLQkJezB4MjA4LCAweDAwLCAweDB9LAotCQl7MHgyMDksIDB4NTEsIDB4MH0sCi0JCXsweDIwZSwgMHg1MSwgMHgwfSwKLQkJezB4MjEwLCAweDIxLCAweDB9LAotCQl7MHgyMjMsIDB4MDEsIDB4MH0sCi0JfTsKLQlpbnQgcmV0dmFsID0gMDsKLQotCXJldHZhbCA9IHNzdF9zY19yZWdfYWNjZXNzKHNjX2FjY2VzcywgUE1JQ19XUklURSwgOSk7Ci0JaWYgKDAgIT0gcmV0dmFsKSB7Ci0JCS8qIHBtaWMgY29tbXVuaWNhdGlvbiBmYWlscyAqLwotCQlwcl9kZWJ1Zygic3N0OiBwbWljIGNvbW1uIGZhaWxlZFxuIik7Ci0JCXJldHVybiByZXR2YWw7Ci0JfQotCi0JcHJfZGVidWcoInNzdDogUGxheWJhY2sgY29uZmlndXJhdGlvbiBjb21wbGV0ZSEhXG4iKTsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBteF9lbmFibGVfYXVkaW9kYWMoaW50IHZhbHVlKQogewogCXN0cnVjdCBzY19yZWdfYWNjZXNzIHNjX2FjY2Vzc1szXTsKQEAgLTIwNCw3ICsxNTYsNyBAQAogCXJldHZhbCA9IHNzdF9zY19yZWdfYWNjZXNzKHNjX2FjY2VzcywgUE1JQ19SRUFEX01PRElGWSwgMik7CiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKLQlwcl9kZWJ1Zygic3N0OiBtdXRlIHN0YXR1cyA9ICVkIiwgc25kX3BtaWNfb3BzX214Lm11dGVfc3RhdHVzKTsKKwlwcl9kZWJ1ZygibXV0ZSBzdGF0dXMgPSAlZFxuIiwgc25kX3BtaWNfb3BzX214Lm11dGVfc3RhdHVzKTsKIAlpZiAoc25kX3BtaWNfb3BzX214Lm11dGVfc3RhdHVzID09IE1VVEUgfHwKIAkJCQlzbmRfcG1pY19vcHNfbXgubWFzdGVyX211dGUgPT0gTVVURSkKIAkJcmV0dXJuIHJldHZhbDsKQEAgLTQxMiw3ICszNjQsNyBAQAogCQlpZiAocmV0dmFsKQogCQkJcmV0dXJuIHJldHZhbDsKIAl9Ci0JcHJfZGVidWcoInNzdDogU1NUIERCRyBteF9zZXRfcGNtX3ZvaWNlX3BhcmFtcyBjYWxsZWRcbiIpOworCXByX2RlYnVnKCJTU1QgREJHOm14X3NldF9wY21fdm9pY2VfcGFyYW1zIGNhbGxlZFxuIik7CiAJcmV0dXJuIHNzdF9zY19yZWdfYWNjZXNzKHNjX2FjY2VzcywgUE1JQ19XUklURSwgNDQpOwogfQogCkBAIC01MjksNyArNDgxLDcgQEAKIAkJCXJldHVybiByZXR2YWw7CiAJfQogCi0JcHJfZGVidWcoInNzdDogbXhfc2V0X3NlbGVjdGVkX291dHB1dF9kZXYgZGV2X2lkOjB4JXhcbiIsIGRldl9pZCk7CisJcHJfZGVidWcoIm14X3NldF9zZWxlY3RlZF9vdXRwdXRfZGV2IGRldl9pZDoweCV4XG4iLCBkZXZfaWQpOwogCXNuZF9wbWljX29wc19teC5vdXRwdXRfZGV2X2lkID0gZGV2X2lkOwogCXN3aXRjaCAoZGV2X2lkKSB7CiAJY2FzZSBTVEVSRU9fSEVBRFBIT05FOgpAQCAtNTQ5LDcgKzUwMSw3IEBACiAJCW51bV9yZWcgPSAxOwogCQlicmVhazsKIAljYXNlIFJFQ0VJVkVSOgotCQlwcl9kZWJ1Zygic3N0OiBSRUNFSVZFUiBLb3NraSBzZWxlY3RlZFxuIik7CisJCXByX2RlYnVnKCJSRUNFSVZFUiBLb3NraSBzZWxlY3RlZFxuIik7CiAKIAkJLyogY29uZmlndXJhdGlvbiAtIEFTIGVuYWJsZSwgcmVjZWl2ZXIgZW5hYmxlICovCiAJCXNjX2FjY2Vzc1swXS5yZWdfYWRkciA9IDB4RkY7CkBAIC01NTksNyArNTExLDcgQEAKIAkJbnVtX3JlZyA9IDE7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByX2Vycigic3N0OiBOb3QgYSB2YWxpZCBvdXRwdXQgZGV2XG4iKTsKKwkJcHJfZXJyKCJOb3QgYSB2YWxpZCBvdXRwdXQgZGV2XG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCXJldHVybiBzc3Rfc2NfcmVnX2FjY2VzcyhzY19hY2Nlc3MsIFBNSUNfV1JJVEUsIG51bV9yZWcpOwpAQCAtNTk4LDcgKzU1MCw3IEBACiAJCQlyZXR1cm4gcmV0dmFsOwogCX0KIAlzbmRfcG1pY19vcHNfbXguaW5wdXRfZGV2X2lkID0gZGV2X2lkOwotCXByX2RlYnVnKCJzc3Q6IG14X3NldF9zZWxlY3RlZF9pbnB1dF9kZXYgZGV2X2lkOjB4JXhcbiIsIGRldl9pZCk7CisJcHJfZGVidWcoIm14X3NldF9zZWxlY3RlZF9pbnB1dF9kZXYgZGV2X2lkOjB4JXhcbiIsIGRldl9pZCk7CiAKIAlzd2l0Y2ggKGRldl9pZCkgewogCWNhc2UgQU1JQzoKQEAgLTY0Niw3ICs1OTgsNyBAQAogCX0KIAogCi0JcHJfZGVidWcoInNzdDogc2V0X211dGUgZGV2X2lkOjB4JXggLCB2YWx1ZTolZFxuIiwgZGV2X2lkLCB2YWx1ZSk7CisJcHJfZGVidWcoInNldF9tdXRlIGRldl9pZDoweCV4ICwgdmFsdWU6JWRcbiIsIGRldl9pZCwgdmFsdWUpOwogCiAJc3dpdGNoIChkZXZfaWQpIHsKIAljYXNlIFBNSUNfU05EX0RNSUNfTVVURToKQEAgLTc2MCw3ICs3MTIsNyBAQAogCQlpZiAocmV0dmFsKQogCQkJcmV0dXJuIHJldHZhbDsKIAl9Ci0JcHJfZGVidWcoInNzdDogc2V0X3ZvbCBkZXZfaWQ6MHgleCAsdmFsdWU6JWRcbiIsIGRldl9pZCwgdmFsdWUpOworCXByX2RlYnVnKCJzZXRfdm9sIGRldl9pZDoweCV4ICx2YWx1ZTolZFxuIiwgZGV2X2lkLCB2YWx1ZSk7CiAJc3dpdGNoIChkZXZfaWQpIHsKIAljYXNlIFBNSUNfU05EX1JFQ0VJVkVSX1ZPTDoKIAkJcmV0dXJuIDA7CkBAIC04NzUsNyArODI3LDcgQEAKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwogCSp2YWx1ZSA9IC0oc2NfYWNjZXNzLnZhbHVlICYgbWFzayk7Ci0JcHJfZGVidWcoInNzdDogZ2V0IHZvbHVtZSB2YWx1ZSBleHRyYWN0ZWQgJWRcbiIsICp2YWx1ZSk7CisJcHJfZGVidWcoImdldCB2b2x1bWUgdmFsdWUgZXh0cmFjdGVkICVkXG4iLCAqdmFsdWUpOwogCXJldHVybiByZXR2YWw7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxtaWRfdjJfY29udHJvbC5jIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbG1pZF92Ml9jb250cm9sLmMKaW5kZXggM2E3ZGU3Ni4uZTM4ZTg5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbG1pZF92Ml9jb250cm9sLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbG1pZF92Ml9jb250cm9sLmMKQEAgLTI2LDYgKzI2LDggQEAKICAqICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGNvbnRyb2wgb3BlcmF0aW9ucyBvZiB2ZW5kb3IgMwogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KICNpbmNsdWRlICJpbnRlbF9zc3QuaCIKQEAgLTEyMCw3ICsxMjIsNyBAQAogCXNuZF9wbWljX29wc19uYy5tYXN0ZXJfbXV0ZSA9IFVOTVVURTsKIAlzbmRfcG1pY19vcHNfbmMubXV0ZV9zdGF0dXMgPSBVTk1VVEU7CiAJc3N0X3NjX3JlZ19hY2Nlc3Moc2NfYWNjZXNzLCBQTUlDX1dSSVRFLCAyNik7Ci0JcHJfZGVidWcoInNzdDogaW5pdCBjb21wbGV0ZSEhXG4iKTsKKwlwcl9kZWJ1ZygiaW5pdCBjb21wbGV0ZSEhXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTY5LDcgKzE3MSw3IEBACiAJbmNfZW5hYmxlX2F1ZGlvZGFjKE1VVEUpOwogCW1zbGVlcCgzMCk7CiAKLQlwcl9kZWJ1Zygic3N0OiBwb3dlcmluZyB1cCBwYi4uLi5cbiIpOworCXByX2RlYnVnKCJwb3dlcmluZyB1cCBwYi4uLi5cbiIpOwogCiAJc2NfYWNjZXNzWzBdLnJlZ19hZGRyID0gVkFVRElPQ05UOwogCXNjX2FjY2Vzc1swXS52YWx1ZSA9IDB4Mjc7CkBAIC0yMjIsNyArMjI0LDcgQEAKIAkJcmV0dXJuIHJldHZhbDsKIAogCi0JcHJfZGVidWcoInNzdDogcG93ZXJpbmcgdXAgY3AuLi4uXG4iKTsKKwlwcl9kZWJ1ZygicG93ZXJpbmcgdXAgY3AuLi4uXG4iKTsKIAogCWlmIChwb3J0ID09IDB4RkYpCiAJCXJldHVybiAwOwpAQCAtMjc1LDcgKzI3Nyw3IEBACiAJbmNfZW5hYmxlX2F1ZGlvZGFjKE1VVEUpOwogCiAKLQlwcl9kZWJ1Zygic3N0OiBwb3dlcmluZyBkbiBuY19wb3dlcl9kb3duIC4uLi5cbiIpOworCXByX2RlYnVnKCJwb3dlcmluZyBkbiBuY19wb3dlcl9kb3duIC4uLi5cbiIpOwogCiAJbXNsZWVwKDMwKTsKIApAQCAtMzI0LDcgKzMyNiw3IEBACiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKIAotCXByX2RlYnVnKCJzc3Q6IHBvd2VyaW5nIGRuIHBiLi4uLlxuIik7CisJcHJfZGVidWcoInBvd2VyaW5nIGRuIHBiLi4uLlxuIik7CiAKIAluY19lbmFibGVfYXVkaW9kYWMoTVVURSk7CiAKQEAgLTM3MCw3ICszNzIsNyBAQAogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7CiAKLQlwcl9kZWJ1Zygic3N0OiBwb3dlcmluZyBkbiBjcC4uLi5cbiIpOworCXByX2RlYnVnKCJwb3dlcmluZyBkbiBjcC4uLi5cbiIpOwogCXJldHVybiBzc3Rfc2NfcmVnX2FjY2VzcyhzY19hY2Nlc3MsIFBNSUNfUkVBRF9NT0RJRlksIDEpOwogfQogCkBAIC00MDAsNyArNDAyLDcgQEAKIAkJcmV0dXJuIHJldHZhbDsKIAogCXNzdF9zY19yZWdfYWNjZXNzKHNjX2FjY2VzcywgUE1JQ19XUklURSwgMTQpOwotCXByX2RlYnVnKCJzc3Q6IFZvaWNlIHBhcmFtZXRlcnMgc2V0IHN1Y2Nlc3NmdWxseSEhXG4iKTsKKwlwcl9kZWJ1ZygiVm9pY2UgcGFyYW1ldGVycyBzZXQgc3VjY2Vzc2Z1bGx5ISFcbiIpOwogCXJldHVybiAwOwogfQogCkBAIC00NTEsMjAgKzQ1MywyMCBAQAogCiAJCXNjX2FjY2Vzcy52YWx1ZSA9IDB4MDc7CiAJCXNjX2FjY2Vzcy5yZWdfYWRkciA9IFJNVVRFOwotCQlwcl9kZWJ1Zygic3N0OiBSSUdIVF9IUF9NVVRFIHZhbHVlJWRcbiIsIHNjX2FjY2Vzcy52YWx1ZSk7CisJCXByX2RlYnVnKCJSSUdIVF9IUF9NVVRFIHZhbHVlJWRcbiIsIHNjX2FjY2Vzcy52YWx1ZSk7CiAJCXNjX2FjY2Vzcy5tYXNrID0gTUFTSzI7CiAJCXNzdF9zY19yZWdfYWNjZXNzKCZzY19hY2Nlc3MsIFBNSUNfUkVBRF9NT0RJRlksIDEpOwogCX0gZWxzZSB7CiAJCXNjX2FjY2Vzcy52YWx1ZSA9IDB4MDA7CiAJCXNjX2FjY2Vzcy5yZWdfYWRkciA9IFJNVVRFOwotCQlwcl9kZWJ1Zygic3N0OiBSSUdIVF9IUF9NVVRFIHZhbHVlICVkXG4iLCBzY19hY2Nlc3MudmFsdWUpOworCQlwcl9kZWJ1ZygiUklHSFRfSFBfTVVURSB2YWx1ZSAlZFxuIiwgc2NfYWNjZXNzLnZhbHVlKTsKIAkJc2NfYWNjZXNzLm1hc2sgPSBNQVNLMjsKIAkJc3N0X3NjX3JlZ19hY2Nlc3MoJnNjX2FjY2VzcywgUE1JQ19SRUFEX01PRElGWSwgMSk7CiAKIAogCX0KIAotCXByX2RlYnVnKCJzc3Q6IHdvcmRfc2l6ZSA9ICVkXG4iLCB3b3JkX3NpemUpOworCXByX2RlYnVnKCJ3b3JkX3NpemUgPSAlZFxuIiwgd29yZF9zaXplKTsKIAogCWlmICh3b3JkX3NpemUgPT0gMjQpIHsKIAkJc2NfYWNjZXNzLnJlZ19hZGRyID0gQVVESU9QT1JUMjsKQEAgLTQ3Nyw3ICs0NzksNyBAQAogCX0KIAlzc3Rfc2NfcmVnX2FjY2Vzcygmc2NfYWNjZXNzLCBQTUlDX1JFQURfTU9ESUZZLCAxKTsKIAotCXByX2RlYnVnKCJzc3Q6IHdvcmRfc2l6ZSA9ICVkXG4iLCB3b3JkX3NpemUpOworCXByX2RlYnVnKCJ3b3JkX3NpemUgPSAlZFxuIiwgd29yZF9zaXplKTsKIAlzY19hY2Nlc3MucmVnX2FkZHIgPSBBVURJT1BPUlQxOwogCXNjX2FjY2Vzcy5tYXNrID0gTUFTSzV8TUFTSzR8TUFTSzF8TUFTSzA7CiAJaWYgKHdvcmRfc2l6ZSA9PSAxNikKQEAgLTUwOCw3ICs1MTAsNyBAQAogCQlyZXR2YWwgPSBuY19pbml0X2NhcmQoKTsKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwotCXByX2RlYnVnKCJzc3Q6IG5jIHNldCBzZWxlY3RlZCBvdXRwdXQ6JWRcbiIsIHZhbHVlKTsKKwlwcl9kZWJ1ZygibmMgc2V0IHNlbGVjdGVkIG91dHB1dDolZFxuIiwgdmFsdWUpOwogCXN3aXRjaCAodmFsdWUpIHsKIAljYXNlIFNURVJFT19IRUFEUEhPTkU6CiAJCXJldHZhbCA9IHNzdF9zY19yZWdfYWNjZXNzKHNjX2FjY2Vzc19IUCwgUE1JQ19XUklURSwgMik7CkBAIC01MTcsNyArNTE5LDcgQEAKIAkJcmV0dmFsID0gc3N0X3NjX3JlZ19hY2Nlc3Moc2NfYWNjZXNzX0lTLCBQTUlDX1dSSVRFLCAyKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJfZXJyKCJzc3Q6IHJjdmQgaWxsZWdhbCByZXF1ZXN0OiAlZFxuIiwgdmFsdWUpOworCQlwcl9lcnIoInJjdmQgaWxsZWdhbCByZXF1ZXN0OiAlZFxuIiwgdmFsdWUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJcmV0dXJuIHJldHZhbDsKQEAgLTU0MSw3ICs1NDMsNyBAQAogCX07CiAKIAlzc3Rfc2NfcmVnX2FjY2VzcyhzY19hY2Nlc3MsIFBNSUNfV1JJVEUsIDEyKTsKLQlwcl9kZWJ1Zygic3N0OiBBdWRpbyBJbml0IHN1Y2Nlc3NmdWxseSEhXG4iKTsKKwlwcl9kZWJ1ZygiQXVkaW8gSW5pdCBzdWNjZXNzZnVsbHkhIVxuIik7CiAKIAkvKnNldCBvdXRwdXQgZGV2aWNlICovCiAJbmNfc2V0X3NlbGVjdGVkX291dHB1dF9kZXYoc25kX3BtaWNfb3BzX25jLm91dHB1dF9kZXZfaWQpOwpAQCAtNTQ5LDEzICs1NTEsMTMgQEAKIAlpZiAoc25kX3BtaWNfb3BzX25jLm51bV9jaGFubmVsID09IDEpIHsKIAkJc2NfYWNjZXMudmFsdWUgPSAweDA3OwogCQlzY19hY2Nlcy5yZWdfYWRkciA9IFJNVVRFOwotCQlwcl9kZWJ1Zygic3N0OiBSSUdIVF9IUF9NVVRFIHZhbHVlJWRcbiIsIHNjX2FjY2VzLnZhbHVlKTsKKwkJcHJfZGVidWcoIlJJR0hUX0hQX01VVEUgdmFsdWUlZFxuIiwgc2NfYWNjZXMudmFsdWUpOwogCQlzY19hY2Nlcy5tYXNrID0gTUFTSzI7CiAJCXNzdF9zY19yZWdfYWNjZXNzKCZzY19hY2NlcywgUE1JQ19SRUFEX01PRElGWSwgMSk7CiAJfSBlbHNlIHsKIAkJc2NfYWNjZXMudmFsdWUgPSAweDAwOwogCQlzY19hY2Nlcy5yZWdfYWRkciA9IFJNVVRFOwotCQlwcl9kZWJ1Zygic3N0OiBSSUdIVF9IUF9NVVRFIHZhbHVlJWRcbiIsIHNjX2FjY2VzLnZhbHVlKTsKKwkJcHJfZGVidWcoIlJJR0hUX0hQX01VVEUgdmFsdWUlZFxuIiwgc2NfYWNjZXMudmFsdWUpOwogCQlzY19hY2Nlcy5tYXNrID0gTUFTSzI7CiAJCXNzdF9zY19yZWdfYWNjZXNzKCZzY19hY2NlcywgUE1JQ19SRUFEX01PRElGWSwgMSk7CiAJfQpAQCAtNjI5LDExICs2MzEsMTEgQEAKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwogCi0JcHJfZGVidWcoInNzdDogc2V0IGRldmljZSBpZDo6JWQsIHZhbHVlICVkXG4iLCBkZXZfaWQsIHZhbHVlKTsKKwlwcl9kZWJ1Zygic2V0IGRldmljZSBpZDo6JWQsIHZhbHVlICVkXG4iLCBkZXZfaWQsIHZhbHVlKTsKIAogCXN3aXRjaCAoZGV2X2lkKSB7CiAJY2FzZSBQTUlDX1NORF9NVVRFX0FMTDoKLQkJcHJfZGVidWcoInNzdDogUE1JQ19TTkRfTVVURV9BTEwgdmFsdWUgJWRcbiIsIHZhbHVlKTsKKwkJcHJfZGVidWcoIlBNSUNfU05EX01VVEVfQUxMIHZhbHVlICVkXG4iLCB2YWx1ZSk7CiAJCXNuZF9wbWljX29wc19uYy5tdXRlX3N0YXR1cyA9IHZhbHVlOwogCQlzbmRfcG1pY19vcHNfbmMubWFzdGVyX211dGUgPSB2YWx1ZTsKIAkJaWYgKHZhbHVlID09IFVOTVVURSkgewpAQCAtNjY5LDcgKzY3MSw3IEBACiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBQTUlDX1NORF9IUF9NSUNfTVVURToKLQkJcHJfZGVidWcoInNzdDogUE1JQ19TTkRfSFBNSUNfTVVURSB2YWx1ZSAlZFxuIiwgdmFsdWUpOworCQlwcl9kZWJ1ZygiUE1JQ19TTkRfSFBNSUNfTVVURSB2YWx1ZSAlZFxuIiwgdmFsdWUpOwogCQlpZiAodmFsdWUgPT0gVU5NVVRFKSB7CiAJCQkvKiB1bm11dGUgdGhlIHN5c3RlbSwgc2V0IHRoZSA2dGggYml0IHRvIG9uZSAqLwogCQkJc2NfYWNjZXNzWzBdLnZhbHVlID0gMHgwMDsKQEAgLTY4Miw3ICs2ODQsNyBAQAogCQlyZXR2YWwgPSBzc3Rfc2NfcmVnX2FjY2VzcyhzY19hY2Nlc3MsIFBNSUNfUkVBRF9NT0RJRlksIDEpOwogCQlicmVhazsKIAljYXNlIFBNSUNfU05EX0FNSUNfTVVURToKLQkJcHJfZGVidWcoInNzdDogUE1JQ19TTkRfQU1JQ19NVVRFIHZhbHVlICVkXG4iLCB2YWx1ZSk7CisJCXByX2RlYnVnKCJQTUlDX1NORF9BTUlDX01VVEUgdmFsdWUgJWRcbiIsIHZhbHVlKTsKIAkJaWYgKHZhbHVlID09IFVOTVVURSkgewogCQkJLyogdW5tdXRlIHRoZSBzeXN0ZW0sIHNldCB0aGUgNnRoIGJpdCB0byBvbmUgKi8KIAkJCXNjX2FjY2Vzc1swXS52YWx1ZSA9IDB4MDA7CkBAIC02OTYsNyArNjk4LDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFBNSUNfU05EX0RNSUNfTVVURToKLQkJcHJfZGVidWcoInNzdDogSU5QVVRfTVVURV9ETUlDIHZhbHVlJWRcbiIsIHZhbHVlKTsKKwkJcHJfZGVidWcoIklOUFVUX01VVEVfRE1JQyB2YWx1ZSVkXG4iLCB2YWx1ZSk7CiAJCWlmICh2YWx1ZSA9PSBVTk1VVEUpIHsKIAkJCS8qIHVubXV0ZSB0aGUgc3lzdGVtLCBzZXQgdGhlIDZ0aCBiaXQgdG8gb25lICovCiAJCQlzY19hY2Nlc3NbMV0udmFsdWUgPSAweDAwOwpAQCAtNzI0LDEzICs3MjYsMTMgQEAKIAogCQlpZiAoZGV2X2lkID09IFBNSUNfU05EX0xFRlRfSFBfTVVURSkgewogCQkJc2NfYWNjZXNzWzBdLnJlZ19hZGRyID0gTE1VVEU7Ci0JCQlwcl9kZWJ1Zygic3N0OiBMRUZUX0hQX01VVEUgdmFsdWUgJWRcbiIsCisJCQlwcl9kZWJ1ZygiTEVGVF9IUF9NVVRFIHZhbHVlICVkXG4iLAogCQkJCQlzY19hY2Nlc3NbMF0udmFsdWUpOwogCQl9IGVsc2UgewogCQkJaWYgKHNuZF9wbWljX29wc19uYy5udW1fY2hhbm5lbCA9PSAxKQogCQkJCXNjX2FjY2Vzc1swXS52YWx1ZSA9IDB4MDQ7CiAJCQlzY19hY2Nlc3NbMF0ucmVnX2FkZHIgPSBSTVVURTsKLQkJCXByX2RlYnVnKCJzc3Q6IFJJR0hUX0hQX01VVEUgdmFsdWUgJWRcbiIsCisJCQlwcl9kZWJ1ZygiUklHSFRfSFBfTVVURSB2YWx1ZSAlZFxuIiwKIAkJCQkJc2NfYWNjZXNzWzBdLnZhbHVlKTsKIAkJfQogCQlzY19hY2Nlc3NbMF0ubWFzayA9IE1BU0syOwpAQCAtNzQzLDcgKzc0NSw3IEBACiAJCWVsc2UKIAkJCXNjX2FjY2Vzc1swXS52YWx1ZSA9IDB4MDM7CiAJCXNjX2FjY2Vzc1swXS5yZWdfYWRkciA9IExNVVRFOwotCQlwcl9kZWJ1Zygic3N0OiBTUEVBS0VSX01VVEUgJWRcbiIsIHNjX2FjY2Vzc1swXS52YWx1ZSk7CisJCXByX2RlYnVnKCJTUEVBS0VSX01VVEUgJWRcbiIsIHNjX2FjY2Vzc1swXS52YWx1ZSk7CiAJCXNjX2FjY2Vzc1swXS5tYXNrID0gTUFTSzE7CiAJCXJldHZhbCA9IHNzdF9zY19yZWdfYWNjZXNzKHNjX2FjY2VzcywgUE1JQ19SRUFEX01PRElGWSwgMSk7CiAJCWJyZWFrOwpAQCAtNzY0LDEwICs3NjYsMTAgQEAKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwogCi0JcHJfZGVidWcoInNzdDogc2V0IHZvbHVtZTolZFxuIiwgZGV2X2lkKTsKKwlwcl9kZWJ1Zygic2V0IHZvbHVtZTolZFxuIiwgZGV2X2lkKTsKIAlzd2l0Y2ggKGRldl9pZCkgewogCWNhc2UgUE1JQ19TTkRfQ0FQVFVSRV9WT0w6Ci0JCXByX2RlYnVnKCJzc3Q6IFBNSUNfU05EX0NBUFRVUkVfVk9MOnZhbHVlOjolZFxuIiwgdmFsdWUpOworCQlwcl9kZWJ1ZygiUE1JQ19TTkRfQ0FQVFVSRV9WT0w6dmFsdWU6OiVkXG4iLCB2YWx1ZSk7CiAJCXNjX2FjY2Vzc1swXS52YWx1ZSA9IHNjX2FjY2Vzc1sxXS52YWx1ZSA9CiAJCQkJCXNjX2FjY2Vzc1syXS52YWx1ZSA9IC12YWx1ZTsKIAkJc2NfYWNjZXNzWzBdLm1hc2sgPSBzY19hY2Nlc3NbMV0ubWFzayA9IHNjX2FjY2Vzc1syXS5tYXNrID0KQEAgLTc3OSw3ICs3ODEsNyBAQAogCQlicmVhazsKIAogCWNhc2UgUE1JQ19TTkRfTEVGVF9QQl9WT0w6Ci0JCXByX2RlYnVnKCJzc3Q6IFBNSUNfU05EX0xFRlRfSFBfVk9MICVkXG4iLCB2YWx1ZSk7CisJCXByX2RlYnVnKCJQTUlDX1NORF9MRUZUX0hQX1ZPTCAlZFxuIiwgdmFsdWUpOwogCQlzY19hY2Nlc3NbMF0udmFsdWUgPSAtdmFsdWU7CiAJCXNjX2FjY2Vzc1swXS5yZWdfYWRkciAgPSBBVURJT0xWT0w7CiAJCXNjX2FjY2Vzc1swXS5tYXNrID0KQEAgLTc4OCw3ICs3OTAsNyBAQAogCQlicmVhazsKIAogCWNhc2UgUE1JQ19TTkRfUklHSFRfUEJfVk9MOgotCQlwcl9kZWJ1Zygic3N0OiBQTUlDX1NORF9SSUdIVF9IUF9WT0wgdmFsdWUgJWRcbiIsIHZhbHVlKTsKKwkJcHJfZGVidWcoIlBNSUNfU05EX1JJR0hUX0hQX1ZPTCB2YWx1ZSAlZFxuIiwgdmFsdWUpOwogCQlpZiAoc25kX3BtaWNfb3BzX25jLm51bV9jaGFubmVsID09IDEpIHsKIAkJCXNjX2FjY2Vzc1swXS52YWx1ZSA9IDB4MDQ7CiAJCSAgICBzY19hY2Nlc3NbMF0ucmVnX2FkZHIgPSBSTVVURTsKQEAgLTgyMSwxMSArODIzLDExIEBACiAJCXJldHVybiByZXR2YWw7CiAJc25kX3BtaWNfb3BzX25jLmlucHV0X2Rldl9pZCA9IHZhbHVlOwogCi0JcHJfZGVidWcoInNzdDogbmMgc2V0IHNlbGVjdGVkIGlucHV0OiVkXG4iLCB2YWx1ZSk7CisJcHJfZGVidWcoIm5jIHNldCBzZWxlY3RlZCBpbnB1dDolZFxuIiwgdmFsdWUpOwogCiAJc3dpdGNoICh2YWx1ZSkgewogCWNhc2UgQU1JQzoKLQkJcHJfZGVidWcoInNzdDogU2VsZWN0aW5nIEFNSUNcbiIpOworCQlwcl9kZWJ1ZygiU2VsZWN0aW5nIEFNSUNcbiIpOwogCQlzY19hY2Nlc3NbMF0ucmVnX2FkZHIgPSAweDEwNzsKIAkJc2NfYWNjZXNzWzBdLnZhbHVlID0gMHg0MDsKIAkJc2NfYWNjZXNzWzBdLm1hc2sgPSAgTUFTSzZ8TUFTSzR8TUFTSzN8TUFTSzF8TUFTSzA7CkBAIC04NDIsNyArODQ0LDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIEhTX01JQzoKLQkJcHJfZGVidWcoInNzdDogU2VsZWN0aW5nIEhTX01JQ1xuIik7CisJCXByX2RlYnVnKCJTZWxlY3RpbmcgSFNfTUlDXG4iKTsKIAkJc2NfYWNjZXNzWzBdLnJlZ19hZGRyID0gMHgxMDc7CiAJCXNjX2FjY2Vzc1swXS5tYXNrID0gIE1BU0s2fE1BU0s0fE1BU0szfE1BU0sxfE1BU0swOwogCQlzY19hY2Nlc3NbMF0udmFsdWUgPSAweDEwOwpAQCAtODU5LDcgKzg2MSw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBETUlDOgotCQlwcl9kZWJ1Zygic3N0OiBETUlDXG4iKTsKKwkJcHJfZGVidWcoIkRNSUNcbiIpOwogCQlzY19hY2Nlc3NbMF0ucmVnX2FkZHIgPSAweDEwNzsKIAkJc2NfYWNjZXNzWzBdLm1hc2sgPSBNQVNLNnxNQVNLNHxNQVNLM3xNQVNLMXxNQVNLMDsKIAkJc2NfYWNjZXNzWzBdLnZhbHVlID0gMHgwQjsKQEAgLTg3MSw3ICs4NzMsNyBAQAogCQlzY19hY2Nlc3NbMl0ubWFzayA9IE1BU0s2OwogCQlzY19hY2Nlc3NbM10ucmVnX2FkZHIgPSAweDEwOTsKIAkJc2NfYWNjZXNzWzNdLm1hc2sgPSBNQVNLNjsKLQkJc2NfYWNjZXNzWzNdLnZhbHVlID0gMHg0MDsKKwkJc2NfYWNjZXNzWzNdLnZhbHVlID0gMHgwMDsKIAkJbnVtX3ZhbCA9IDQ7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC04OTAsMjMgKzg5MiwyMyBAQAogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7CiAKLQlwcl9kZWJ1Zygic3N0OiBnZXQgbXV0ZTo6JWRcbiIsIGRldl9pZCk7CisJcHJfZGVidWcoImdldCBtdXRlOjolZFxuIiwgZGV2X2lkKTsKIAogCXN3aXRjaCAoZGV2X2lkKSB7CiAJY2FzZSBQTUlDX1NORF9BTUlDX01VVEU6Ci0JCXByX2RlYnVnKCJzc3Q6IFBNSUNfU05EX0lOUFVUX01VVEVfTUlDMVxuIik7CisJCXByX2RlYnVnKCJQTUlDX1NORF9JTlBVVF9NVVRFX01JQzFcbiIpOwogCQlzY19hY2Nlc3MucmVnX2FkZHIgPSBMSUxTRUw7CiAJCW1hc2sgPSBNQVNLNjsKIAkJYnJlYWs7CiAJY2FzZSBQTUlDX1NORF9IUF9NSUNfTVVURToKLQkJcHJfZGVidWcoInNzdDogUE1JQ19TTkRfSU5QVVRfTVVURV9NSUMyXG4iKTsKKwkJcHJfZGVidWcoIlBNSUNfU05EX0lOUFVUX01VVEVfTUlDMlxuIik7CiAJCXNjX2FjY2Vzcy5yZWdfYWRkciA9IExJUlNFTDsKIAkJbWFzayA9IE1BU0s2OwogCQlicmVhazsKIAljYXNlIFBNSUNfU05EX0xFRlRfSFBfTVVURToKIAljYXNlIFBNSUNfU05EX1JJR0hUX0hQX01VVEU6CiAJCW1hc2sgPSBNQVNLMjsKLQkJcHJfZGVidWcoInNzdDogUE1JQ19TTl9MRUZUL1JJR0hUX0hQX01VVEVcbiIpOworCQlwcl9kZWJ1ZygiUE1JQ19TTl9MRUZUL1JJR0hUX0hQX01VVEVcbiIpOwogCQlpZiAoZGV2X2lkID09IFBNSUNfU05EX1JJR0hUX0hQX01VVEUpCiAJCQlzY19hY2Nlc3MucmVnX2FkZHIgPSBSTVVURTsKIAkJZWxzZQpAQCAtOTE0LDEyICs5MTYsMTIgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFBNSUNfU05EX0xFRlRfU1BFQUtFUl9NVVRFOgotCQlwcl9kZWJ1Zygic3N0OiBQTUlDX01PTk9fRUFSUElFQ0VfTVVURVxuIik7CisJCXByX2RlYnVnKCJQTUlDX01PTk9fRUFSUElFQ0VfTVVURVxuIik7CiAJCXNjX2FjY2Vzcy5yZWdfYWRkciA9IFJNVVRFOwogCQltYXNrID0gTUFTSzE7CiAJCWJyZWFrOwogCWNhc2UgUE1JQ19TTkRfRE1JQ19NVVRFOgotCQlwcl9kZWJ1Zygic3N0OiBQTUlDX1NORF9JTlBVVF9NVVRFX0RNSUNcbiIpOworCQlwcl9kZWJ1ZygiUE1JQ19TTkRfSU5QVVRfTVVURV9ETUlDXG4iKTsKIAkJc2NfYWNjZXNzLnJlZ19hZGRyID0gMHgxMDU7CiAJCW1hc2sgPSBNQVNLNjsKIAkJYnJlYWs7CkBAIC05MjgsMTYgKzkzMCwxNiBAQAogCiAJfQogCXJldHZhbCA9IHNzdF9zY19yZWdfYWNjZXNzKCZzY19hY2Nlc3MsIFBNSUNfUkVBRCwgMSk7Ci0JcHJfZGVidWcoInNzdDogcmVnIHZhbHVlID0gJWRcbiIsIHNjX2FjY2Vzcy52YWx1ZSk7CisJcHJfZGVidWcoInJlZyB2YWx1ZSA9ICVkXG4iLCBzY19hY2Nlc3MudmFsdWUpOwogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7CiAJKnZhbHVlID0gKHNjX2FjY2Vzcy52YWx1ZSkgJiBtYXNrOwotCXByX2RlYnVnKCJzc3Q6IG1hc2tlZCB2YWx1ZSA9ICVkXG4iLCAqdmFsdWUpOworCXByX2RlYnVnKCJtYXNrZWQgdmFsdWUgPSAlZFxuIiwgKnZhbHVlKTsKIAlpZiAoKnZhbHVlKQogCQkqdmFsdWUgPSAwOwogCWVsc2UKIAkJKnZhbHVlID0gMTsKLQlwcl9kZWJ1Zygic3N0OiB2YWx1ZSByZXR1cm5lZCA9IDB4JXhcbiIsICp2YWx1ZSk7CisJcHJfZGVidWcoInZhbHVlIHJldHVybmVkID0gMHgleFxuIiwgKnZhbHVlKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC05NTMsMTkgKzk1NSwxOSBAQAogCiAJc3dpdGNoIChkZXZfaWQpIHsKIAljYXNlIFBNSUNfU05EX0NBUFRVUkVfVk9MOgotCQlwcl9kZWJ1Zygic3N0OiBQTUlDX1NORF9JTlBVVF9DQVBUVVJFX1ZPTFxuIik7CisJCXByX2RlYnVnKCJQTUlDX1NORF9JTlBVVF9DQVBUVVJFX1ZPTFxuIik7CiAJCXNjX2FjY2Vzcy5yZWdfYWRkciA9ICBMSUxTRUw7CiAJCW1hc2sgPSAoTUFTSzB8TUFTSzF8TUFTSzJ8TUFTSzN8TUFTSzR8TUFTSzUpOwogCQlicmVhazsKIAogCWNhc2UgUE1JQ19TTkRfUklHSFRfUEJfVk9MOgotCQlwcl9kZWJ1Zygic3N0OiBHRVRfVk9MVU1FX1BNSUNfTEVGVF9IUF9WT0xcbiIpOworCQlwcl9kZWJ1ZygiR0VUX1ZPTFVNRV9QTUlDX0xFRlRfSFBfVk9MXG4iKTsKIAkJc2NfYWNjZXNzLnJlZ19hZGRyID0gQVVESU9MVk9MOwogCQltYXNrID0gKE1BU0swfE1BU0sxfE1BU0syfE1BU0szfE1BU0s0fE1BU0s1fE1BU0s2KTsKIAkJYnJlYWs7CiAKIAljYXNlIFBNSUNfU05EX0xFRlRfUEJfVk9MOgotCQlwcl9kZWJ1Zygic3N0OiBHRVRfVk9MVU1FX1BNSUNfUklHSFRfSFBfVk9MXG4iKTsKKwkJcHJfZGVidWcoIkdFVF9WT0xVTUVfUE1JQ19SSUdIVF9IUF9WT0xcbiIpOwogCQlzY19hY2Nlc3MucmVnX2FkZHIgPSBBVURJT1JWT0w7CiAJCW1hc2sgPSAoTUFTSzB8TUFTSzF8TUFTSzJ8TUFTSzN8TUFTSzR8TUFTSzV8TUFTSzYpOwogCQlicmVhazsKQEAgLTk3NSw5ICs5NzcsOSBAQAogCiAJfQogCXJldHZhbCA9IHNzdF9zY19yZWdfYWNjZXNzKCZzY19hY2Nlc3MsIFBNSUNfUkVBRCwgMSk7Ci0JcHJfZGVidWcoInNzdDogdmFsdWUgcmVhZCA9IDB4JXhcbiIsIHNjX2FjY2Vzcy52YWx1ZSk7CisJcHJfZGVidWcoInZhbHVlIHJlYWQgPSAweCV4XG4iLCBzY19hY2Nlc3MudmFsdWUpOwogCSp2YWx1ZSA9IC0oKHNjX2FjY2Vzcy52YWx1ZSkgJiBtYXNrKTsKLQlwcl9kZWJ1Zygic3N0OiBnZXQgdm9sIHZhbHVlIHJldHVybmVkID0gJWRcbiIsICp2YWx1ZSk7CisJcHJfZGVidWcoImdldCB2b2wgdmFsdWUgcmV0dXJuZWQgPSAlZFxuIiwgKnZhbHVlKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3IvaW5pdC5jIGIvZHJpdmVycy9zdGFnaW5nL2tldWNyL2luaXQuYwppbmRleCA5NzhiZjg3Li41MTVlNDQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3IvaW5pdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9pbml0LmMKQEAgLTExLDQzICsxMSwzNyBAQAogI2luY2x1ZGUgInRyYW5zcG9ydC5oIgogI2luY2x1ZGUgImluaXQuaCIKIAotQllURQkJSXNTU0ZEQ0NvbXBsaWFuY2U7Ci1CWVRFCQlJc1hEQ29tcGxpYW5jZTsKLWV4dGVybiBEV09SRCBNZWRpYUNoYW5nZTsKLWV4dGVybiBpbnQJQ2hlY2tfRF9NZWRpYUZtdChzdHJ1Y3QgdXNfZGF0YSAqKTsKK0JZVEUgSXNTU0ZEQ0NvbXBsaWFuY2U7CitCWVRFIElzWERDb21wbGlhbmNlOwogCi0vLy0tLS0tIEVORV9Jbml0TWVkaWEoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKgorICogRU5FX0luaXRNZWRpYSgpOgorICovCiBpbnQgRU5FX0luaXRNZWRpYShzdHJ1Y3QgdXNfZGF0YSAqdXMpCiB7CiAJaW50CXJlc3VsdDsKIAlCWVRFCU1pc2NSZWcwMyA9IDA7CiAKLQlwcmludGsoIi0tLSBJbml0IE1lZGlhIC0tLVxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiLS0tIEluaXQgTWVkaWEgLS0tXG4iKTsKIAlyZXN1bHQgPSBFTkVfUmVhZF9CWVRFKHVzLCBSRUdfQ0FSRF9TVEFUVVMsICZNaXNjUmVnMDMpOwotCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQotCXsKLQkJcHJpbnRrKCJSZWFkIHJlZ2lzdGVyIGZhaWwgISFcbiIpOworCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKSB7CisJCXByaW50ayhLRVJOX0VSUiAiUmVhZCByZWdpc3RlciBmYWlsICEhXG4iKTsKIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKIAl9Ci0JcHJpbnRrKCJNaXNjUmVnMDMgPSAleFxuIiwgTWlzY1JlZzAzKTsKKwlwcmludGsoS0VSTl9JTkZPICJNaXNjUmVnMDMgPSAleFxuIiwgTWlzY1JlZzAzKTsKIAotCWlmIChNaXNjUmVnMDMgJiAweDAxKQotCXsKLQkJaWYgKCF1cy0+U0RfU3RhdHVzLlJlYWR5KQotCQl7CisJaWYgKE1pc2NSZWcwMyAmIDB4MDEpIHsKKwkJaWYgKCF1cy0+U0RfU3RhdHVzLlJlYWR5KSB7CiAJCQlyZXN1bHQgPSBFTkVfU0RJbml0KHVzKTsKIAkJCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQogCQkJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAJCX0KIAl9CiAKLQlpZiAoTWlzY1JlZzAzICYgMHgwMikKLQl7Ci0JCWlmICghdXMtPlNNX1N0YXR1cy5SZWFkeSAmJiAhdXMtPk1TX1N0YXR1cy5SZWFkeSkKLQkJeworCWlmIChNaXNjUmVnMDMgJiAweDAyKSB7CisJCWlmICghdXMtPlNNX1N0YXR1cy5SZWFkeSAmJiAhdXMtPk1TX1N0YXR1cy5SZWFkeSkgewogCQkJcmVzdWx0ID0gRU5FX1NNSW5pdCh1cyk7Ci0JCQlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKLQkJCXsKKwkJCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKSB7CiAJCQkJcmVzdWx0ID0gRU5FX01TSW5pdCh1cyk7CiAJCQkJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCiAJCQkJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CkBAIC01OCw3ICs1Miw5IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotLy8tLS0tLSBFTkVfUmVhZF9CWVRFKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoKKyAqIEVORV9SZWFkX0JZVEUoKSA6CisgKi8KIGludCBFTkVfUmVhZF9CWVRFKHN0cnVjdCB1c19kYXRhICp1cywgV09SRCBpbmRleCwgdm9pZCAqYnVmKQogewogCXN0cnVjdCBidWxrX2NiX3dyYXAgKmJjYiA9IChzdHJ1Y3QgYnVsa19jYl93cmFwICopIHVzLT5pb2J1ZjsKQEAgLTc2LDE5ICs3MiwyMCBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLS8vLS0tLS0gRU5FX1NESW5pdCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoKKyAqIEVORV9TREluaXQoKToKKyAqLwogaW50IEVORV9TREluaXQoc3RydWN0IHVzX2RhdGEgKnVzKQogewogCXN0cnVjdCBidWxrX2NiX3dyYXAgKmJjYiA9IChzdHJ1Y3QgYnVsa19jYl93cmFwICopIHVzLT5pb2J1ZjsKIAlpbnQJcmVzdWx0OwogCUJZVEUJYnVmWzB4MjAwXTsKIAotCXByaW50aygidHJhbnNwb3J0IC0tLSBFTkVfU0RJbml0XG4iKTsKLQkvLyBTRCBJbml0IFBhcnQtMQorCXByaW50ayhLRVJOX0lORk8gInRyYW5zcG9ydCAtLS0gRU5FX1NESW5pdFxuIik7CisJLyogU0QgSW5pdCBQYXJ0LTEgKi8KIAlyZXN1bHQgPSBFTkVfTG9hZEJpbkNvZGUodXMsIFNEX0lOSVQxX1BBVFRFUk4pOwotCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQotCXsKLQkJcHJpbnRrKCJMb2FkIFNEIEluaXQgQ29kZSBQYXJ0LTEgRmFpbCAhIVxuIik7CisJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJMb2FkIFNEIEluaXQgQ29kZSBQYXJ0LTEgRmFpbCAhIVxuIik7CiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAJfQogCkBAIC05OCwxNyArOTUsMTUgQEAKIAliY2ItPkNEQlswXSA9IDB4RjI7CiAKIAlyZXN1bHQgPSBFTkVfU2VuZFNjc2lDbWQodXMsIEZESVJfUkVBRCwgTlVMTCwgMCk7Ci0JaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCi0JewotCQlwcmludGsoIkV4ZWN0aW9uIFNEIEluaXQgQ29kZSBGYWlsICEhXG4iKTsKKwlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkgeworCQlwcmludGsoS0VSTl9FUlIgIkV4ZWN0aW9uIFNEIEluaXQgQ29kZSBGYWlsICEhXG4iKTsKIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKIAl9CiAKLQkvLyBTRCBJbml0IFBhcnQtMgorCS8qIFNEIEluaXQgUGFydC0yICovCiAJcmVzdWx0ID0gRU5FX0xvYWRCaW5Db2RlKHVzLCBTRF9JTklUMl9QQVRURVJOKTsKLQlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKLQl7Ci0JCXByaW50aygiTG9hZCBTRCBJbml0IENvZGUgUGFydC0yIEZhaWwgISFcbiIpOworCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTG9hZCBTRCBJbml0IENvZGUgUGFydC0yIEZhaWwgISFcbiIpOwogCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwogCX0KIApAQCAtMTE5LDQ1ICsxMTQsNDEgQEAKIAliY2ItPkNEQlswXQkJCT0gMHhGMTsKIAogCXJlc3VsdCA9IEVORV9TZW5kU2NzaUNtZCh1cywgRkRJUl9SRUFELCAmYnVmLCAwKTsKLQlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKLQl7Ci0JCXByaW50aygiRXhlY3Rpb24gU0QgSW5pdCBDb2RlIEZhaWwgISFcbiIpOworCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRXhlY3Rpb24gU0QgSW5pdCBDb2RlIEZhaWwgISFcbiIpOwogCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwogCX0KIAogCXVzLT5TRF9TdGF0dXMgPSAgKihQU0RfU1RBVFVTKSZidWZbMF07Ci0JaWYgKHVzLT5TRF9TdGF0dXMuSW5zZXJ0ICYmIHVzLT5TRF9TdGF0dXMuUmVhZHkpCi0JeworCWlmICh1cy0+U0RfU3RhdHVzLkluc2VydCAmJiB1cy0+U0RfU3RhdHVzLlJlYWR5KSB7CiAJCUVORV9SZWFkU0RSZWcodXMsIChQQllURSkmYnVmKTsKLQkJcHJpbnRrKCJJbnNlcnQgICAgID0gJXhcbiIsIHVzLT5TRF9TdGF0dXMuSW5zZXJ0KTsKLQkJcHJpbnRrKCJSZWFkeSAgICAgID0gJXhcbiIsIHVzLT5TRF9TdGF0dXMuUmVhZHkpOwotCQlwcmludGsoIklzTU1DICAgICAgPSAleFxuIiwgdXMtPlNEX1N0YXR1cy5Jc01NQyk7Ci0JCXByaW50aygiSGlDYXBhY2l0eSA9ICV4XG4iLCB1cy0+U0RfU3RhdHVzLkhpQ2FwYWNpdHkpOwotCQlwcmludGsoIkhpU3BlZWQgICAgPSAleFxuIiwgdXMtPlNEX1N0YXR1cy5IaVNwZWVkKTsKLQkJcHJpbnRrKCJXdFAgICAgICAgID0gJXhcbiIsIHVzLT5TRF9TdGF0dXMuV3RQKTsKLQl9Ci0JZWxzZQotCXsKLQkJcHJpbnRrKCJTRCBDYXJkIE5vdCBSZWFkeSAtLS0gJXhcbiIsIGJ1ZlswXSk7CisJCXByaW50ayhLRVJOX0lORk8gIkluc2VydCAgICAgPSAleFxuIiwgdXMtPlNEX1N0YXR1cy5JbnNlcnQpOworCQlwcmludGsoS0VSTl9JTkZPICJSZWFkeSAgICAgID0gJXhcbiIsIHVzLT5TRF9TdGF0dXMuUmVhZHkpOworCQlwcmludGsoS0VSTl9JTkZPICJJc01NQyAgICAgID0gJXhcbiIsIHVzLT5TRF9TdGF0dXMuSXNNTUMpOworCQlwcmludGsoS0VSTl9JTkZPICJIaUNhcGFjaXR5ID0gJXhcbiIsIHVzLT5TRF9TdGF0dXMuSGlDYXBhY2l0eSk7CisJCXByaW50ayhLRVJOX0lORk8gIkhpU3BlZWQgICAgPSAleFxuIiwgdXMtPlNEX1N0YXR1cy5IaVNwZWVkKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiV3RQICAgICAgICA9ICV4XG4iLCB1cy0+U0RfU3RhdHVzLld0UCk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTRCBDYXJkIE5vdCBSZWFkeSAtLS0gJXhcbiIsIGJ1ZlswXSk7CiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAJfQogCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRDsKIH0KIAotLy8tLS0tLSBFTkVfTVNJbml0KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoKKyAqIEVORV9NU0luaXQoKToKKyAqLwogaW50IEVORV9NU0luaXQoc3RydWN0IHVzX2RhdGEgKnVzKQogewogCXN0cnVjdCBidWxrX2NiX3dyYXAgKmJjYiA9IChzdHJ1Y3QgYnVsa19jYl93cmFwICopIHVzLT5pb2J1ZjsKIAlpbnQJcmVzdWx0OwogCUJZVEUJYnVmWzB4MjAwXTsKIAlXT1JECU1TUF9CbG9ja1NpemUsIE1TUF9Vc2VyQXJlYUJsb2NrczsKLQkKIAotCXByaW50aygidHJhbnNwb3J0IC0tLSBFTkVfTVNJbml0XG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJ0cmFuc3BvcnQgLS0tIEVORV9NU0luaXRcbiIpOwogCXJlc3VsdCA9IEVORV9Mb2FkQmluQ29kZSh1cywgTVNfSU5JVF9QQVRURVJOKTsKLQlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKLQl7Ci0JCXByaW50aygiTG9hZCBNUyBJbml0IENvZGUgRmFpbCAhIVxuIik7CisJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJMb2FkIE1TIEluaXQgQ29kZSBGYWlsICEhXG4iKTsKIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKIAl9CiAKQEAgLTE2OSw1MyArMTYwLDQ5IEBACiAJYmNiLT5DREJbMV0JCQk9IDB4MDE7CiAKIAlyZXN1bHQgPSBFTkVfU2VuZFNjc2lDbWQodXMsIEZESVJfUkVBRCwgJmJ1ZiwgMCk7Ci0JaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCi0JewotCQlwcmludGsoIkV4ZWN0aW9uIE1TIEluaXQgQ29kZSBGYWlsICEhXG4iKTsKKwlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkgeworCQlwcmludGsoS0VSTl9FUlIgIkV4ZWN0aW9uIE1TIEluaXQgQ29kZSBGYWlsICEhXG4iKTsKIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKIAl9CiAKIAl1cy0+TVNfU3RhdHVzID0gKihQTVNfU1RBVFVTKSZidWZbMF07CiAKLQlpZiAodXMtPk1TX1N0YXR1cy5JbnNlcnQgJiYgdXMtPk1TX1N0YXR1cy5SZWFkeSkKLQl7Ci0JCXByaW50aygiSW5zZXJ0ICAgICA9ICV4XG4iLCB1cy0+TVNfU3RhdHVzLkluc2VydCk7Ci0JCXByaW50aygiUmVhZHkgICAgICA9ICV4XG4iLCB1cy0+TVNfU3RhdHVzLlJlYWR5KTsKLQkJcHJpbnRrKCJJc01TUHJvICAgID0gJXhcbiIsIHVzLT5NU19TdGF0dXMuSXNNU1Bybyk7Ci0JCXByaW50aygiSXNNU1BIRyAgICA9ICV4XG4iLCB1cy0+TVNfU3RhdHVzLklzTVNQSEcpOwotCQlwcmludGsoIld0UCAgICAgICAgPSAleFxuIiwgdXMtPk1TX1N0YXR1cy5XdFApOwotCQlpZiAodXMtPk1TX1N0YXR1cy5Jc01TUHJvKQotCQl7Ci0JCQlNU1BfQmxvY2tTaXplICAgICAgPSAoYnVmWzZdIDw8OCkgfCBidWZbN107Ci0JCQlNU1BfVXNlckFyZWFCbG9ja3MgPSAoYnVmWzEwXTw8OCkgfCBidWZbMTFdOworCWlmICh1cy0+TVNfU3RhdHVzLkluc2VydCAmJiB1cy0+TVNfU3RhdHVzLlJlYWR5KSB7CisJCXByaW50ayhLRVJOX0lORk8gIkluc2VydCAgICAgPSAleFxuIiwgdXMtPk1TX1N0YXR1cy5JbnNlcnQpOworCQlwcmludGsoS0VSTl9JTkZPICJSZWFkeSAgICAgID0gJXhcbiIsIHVzLT5NU19TdGF0dXMuUmVhZHkpOworCQlwcmludGsoS0VSTl9JTkZPICJJc01TUHJvICAgID0gJXhcbiIsIHVzLT5NU19TdGF0dXMuSXNNU1Bybyk7CisJCXByaW50ayhLRVJOX0lORk8gIklzTVNQSEcgICAgPSAleFxuIiwgdXMtPk1TX1N0YXR1cy5Jc01TUEhHKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiV3RQICAgICAgICA9ICV4XG4iLCB1cy0+TVNfU3RhdHVzLld0UCk7CisJCWlmICh1cy0+TVNfU3RhdHVzLklzTVNQcm8pIHsKKwkJCU1TUF9CbG9ja1NpemUgICAgICA9IChidWZbNl0gPDwgOCkgfCBidWZbN107CisJCQlNU1BfVXNlckFyZWFCbG9ja3MgPSAoYnVmWzEwXSA8PCA4KSB8IGJ1ZlsxMV07CiAJCQl1cy0+TVNQX1RvdGFsQmxvY2sgPSBNU1BfQmxvY2tTaXplICogTVNQX1VzZXJBcmVhQmxvY2tzOwotCQl9Ci0JCWVsc2UKKwkJfSBlbHNlIHsKIAkJCU1TX0NhcmRJbml0KHVzKTsKLQkJcHJpbnRrKCJNUyBJbml0IENvZGUgT0sgISFcbiIpOwotCX0KLQllbHNlCi0JewotCQlwcmludGsoIk1TIENhcmQgTm90IFJlYWR5IC0tLSAleFxuIiwgYnVmWzBdKTsKKwkJfQorCQlwcmludGsoS0VSTl9JTkZPICJNUyBJbml0IENvZGUgT0sgISFcbiIpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0lORk8gIk1TIENhcmQgTm90IFJlYWR5IC0tLSAleFxuIiwgYnVmWzBdKTsKIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKIAl9CiAKIAlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7CiB9CiAKLS8vLS0tLS0gRU5FX1NNSW5pdCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qCisgKkVORV9TTUluaXQoKQorICovCiBpbnQgRU5FX1NNSW5pdChzdHJ1Y3QgdXNfZGF0YSAqdXMpCiB7CiAJc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwogCWludAlyZXN1bHQ7CiAJQllURQlidWZbMHgyMDBdOwogCi0JcHJpbnRrKCJ0cmFuc3BvcnQgLS0tIEVORV9TTUluaXRcbiIpOworCXByaW50ayhLRVJOX0lORk8gInRyYW5zcG9ydCAtLS0gRU5FX1NNSW5pdFxuIik7CiAKIAlyZXN1bHQgPSBFTkVfTG9hZEJpbkNvZGUodXMsIFNNX0lOSVRfUEFUVEVSTik7Ci0JaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCi0JewotCQlwcmludGsoIkxvYWQgU00gSW5pdCBDb2RlIEZhaWwgISFcbiIpOworCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKSB7CisJCXByaW50ayhLRVJOX0lORk8gIkxvYWQgU00gSW5pdCBDb2RlIEZhaWwgISFcbiIpOwogCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwogCX0KIApAQCAtMjI3LDkgKzIxNCw5IEBACiAJYmNiLT5DREJbMV0JCQk9IDB4MDE7CiAKIAlyZXN1bHQgPSBFTkVfU2VuZFNjc2lDbWQodXMsIEZESVJfUkVBRCwgJmJ1ZiwgMCk7Ci0JaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCi0JewotCQlwcmludGsoIkV4ZWN0aW9uIFNNIEluaXQgQ29kZSBGYWlsICEhIHJlc3VsdCA9ICV4XG4iLCByZXN1bHQpOworCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIkV4ZWN0aW9uIFNNIEluaXQgQ29kZSBGYWlsICEhIHJlc3VsdCA9ICV4XG4iLCByZXN1bHQpOwogCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwogCX0KIApAQCAtMjM4LDMyICsyMjUsMzEgQEAKIAl1cy0+U01fRGV2aWNlSUQgPSBidWZbMV07CiAJdXMtPlNNX0NhcmRJRCAgID0gYnVmWzJdOwogCi0JaWYgKHVzLT5TTV9TdGF0dXMuSW5zZXJ0ICYmIHVzLT5TTV9TdGF0dXMuUmVhZHkpCi0JewotCQlwcmludGsoIkluc2VydCAgICAgPSAleFxuIiwgdXMtPlNNX1N0YXR1cy5JbnNlcnQpOwotCQlwcmludGsoIlJlYWR5ICAgICAgPSAleFxuIiwgdXMtPlNNX1N0YXR1cy5SZWFkeSk7Ci0JCXByaW50aygiV3RQICAgICAgICA9ICV4XG4iLCB1cy0+U01fU3RhdHVzLld0UCk7Ci0JCXByaW50aygiRGV2aWNlSUQgICA9ICV4XG4iLCB1cy0+U01fRGV2aWNlSUQpOwotCQlwcmludGsoIkNhcmRJRCAgICAgPSAleFxuIiwgdXMtPlNNX0NhcmRJRCk7CisJaWYgKHVzLT5TTV9TdGF0dXMuSW5zZXJ0ICYmIHVzLT5TTV9TdGF0dXMuUmVhZHkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiSW5zZXJ0ICAgICA9ICV4XG4iLCB1cy0+U01fU3RhdHVzLkluc2VydCk7CisJCXByaW50ayhLRVJOX0lORk8gIlJlYWR5ICAgICAgPSAleFxuIiwgdXMtPlNNX1N0YXR1cy5SZWFkeSk7CisJCXByaW50ayhLRVJOX0lORk8gIld0UCAgICAgICAgPSAleFxuIiwgdXMtPlNNX1N0YXR1cy5XdFApOworCQlwcmludGsoS0VSTl9JTkZPICJEZXZpY2VJRCAgID0gJXhcbiIsIHVzLT5TTV9EZXZpY2VJRCk7CisJCXByaW50ayhLRVJOX0lORk8gIkNhcmRJRCAgICAgPSAleFxuIiwgdXMtPlNNX0NhcmRJRCk7CiAJCU1lZGlhQ2hhbmdlID0gMTsKIAkJQ2hlY2tfRF9NZWRpYUZtdCh1cyk7Ci0JfQotCWVsc2UKLQl7Ci0JCXByaW50aygiU00gQ2FyZCBOb3QgUmVhZHkgLS0tICV4XG4iLCBidWZbMF0pOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAiU00gQ2FyZCBOb3QgUmVhZHkgLS0tICV4XG4iLCBidWZbMF0pOwogCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwogCX0KIAogCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRDsKIH0KIAotLy8tLS0tLSBFTkVfUmVhZFNEUmVnKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoKKyAqIEVORV9SZWFkU0RSZWcoKQorICovCiBpbnQgRU5FX1JlYWRTRFJlZyhzdHJ1Y3QgdXNfZGF0YSAqdXMsIHU4ICpSZEJ1ZikKIHsKIAlXT1JECXRtcHJlZzsKIAlEV09SRAlyZWc0YjsKLQkKLQkvL3ByaW50aygidHJhbnNwb3J0IC0tLSBFTkVfUmVhZFNEUmVnXG4iKTsKKworCS8qIHByaW50ayhLRVJOX0lORk8gInRyYW5zcG9ydCAtLS0gRU5FX1JlYWRTRFJlZ1xuIik7ICovCiAJcmVnNGIgPSAqKFBEV09SRCkmUmRCdWZbMHgxOF07CiAJdXMtPlNEX1JFQURfQkxfTEVOID0gKEJZVEUpKChyZWc0YiA+PiA4KSAmIDB4MGYpOwogCkBAIC0yNzcsNzQgKzI2Myw3NSBAQAogCWlmICh1cy0+U0RfU3RhdHVzLkhpQ2FwYWNpdHkgJiYgdXMtPlNEX1N0YXR1cy5Jc01NQykKIAkJdXMtPkhDX0NfU0laRSA9ICooUERXT1JEKSgmUmRCdWZbMHgxMDBdKTsKIAotCWlmICh1cy0+U0RfUkVBRF9CTF9MRU4gPiBTRF9CTE9DS19MRU4pCi0JewotCQl1cy0+U0RfQmxvY2tfTXVsdCA9IDEgPDwgKHVzLT5TRF9SRUFEX0JMX0xFTiAtIFNEX0JMT0NLX0xFTik7CQl1cy0+U0RfUkVBRF9CTF9MRU4gPSBTRF9CTE9DS19MRU47Ci0JfQotCWVsc2UKLQl7CQl1cy0+U0RfQmxvY2tfTXVsdCA9IDE7CisJaWYgKHVzLT5TRF9SRUFEX0JMX0xFTiA+IFNEX0JMT0NLX0xFTikgeworCQl1cy0+U0RfQmxvY2tfTXVsdCA9CisJCQkxIDw8ICh1cy0+U0RfUkVBRF9CTF9MRU4gLSBTRF9CTE9DS19MRU4pOworCQl1cy0+U0RfUkVBRF9CTF9MRU4gPSBTRF9CTE9DS19MRU47CisJfSBlbHNlIHsKKwkJdXMtPlNEX0Jsb2NrX011bHQgPSAxOwogCX0KIAlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7CiB9CiAKLS8vLS0tLS0gRU5FX0xvYWRCaW5Db2RlKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKgorICogRU5FX0xvYWRCaW5Db2RlKCkKKyAqLwogaW50IEVORV9Mb2FkQmluQ29kZShzdHJ1Y3QgdXNfZGF0YSAqdXMsIEJZVEUgZmxhZykKIHsKIAlzdHJ1Y3QgYnVsa19jYl93cmFwICpiY2IgPSAoc3RydWN0IGJ1bGtfY2Jfd3JhcCAqKSB1cy0+aW9idWY7CiAJaW50IHJlc3VsdDsKLQkvL3ZvaWQgKmJ1ZjsKKwkvKiB2b2lkICpidWY7ICovCiAJUEJZVEUgYnVmOwogCi0JLy9wcmludGsoInRyYW5zcG9ydCAtLS0gRU5FX0xvYWRCaW5Db2RlXG4iKTsKKwkvKiBwcmludGsoS0VSTl9JTkZPICJ0cmFuc3BvcnQgLS0tIEVORV9Mb2FkQmluQ29kZVxuIik7ICovCiAJaWYgKHVzLT5CSU5fRkxBRyA9PSBmbGFnKQogCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7CiAKIAlidWYgPSBrbWFsbG9jKDB4ODAwLCBHRlBfS0VSTkVMKTsKIAlpZiAoYnVmID09IE5VTEwpCiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7Ci0Jc3dpdGNoICggZmxhZyApCi0JewotCQkvLyBGb3IgU0QKLQkJY2FzZSBTRF9JTklUMV9QQVRURVJOOgotCQkJcHJpbnRrKCJTRF9JTklUMV9QQVRURVJOXG4iKTsKLQkJCW1lbWNweShidWYsIFNEX0luaXQxLCAweDgwMCk7CisJc3dpdGNoIChmbGFnKSB7CisJLyogRm9yIFNEICovCisJY2FzZSBTRF9JTklUMV9QQVRURVJOOgorCQlwcmludGsoS0VSTl9JTkZPICJTRF9JTklUMV9QQVRURVJOXG4iKTsKKwkJbWVtY3B5KGJ1ZiwgU0RfSW5pdDEsIDB4ODAwKTsKIAkJYnJlYWs7Ci0JCWNhc2UgU0RfSU5JVDJfUEFUVEVSTjoKLQkJCXByaW50aygiU0RfSU5JVDJfUEFUVEVSTlxuIik7Ci0JCQltZW1jcHkoYnVmLCBTRF9Jbml0MiwgMHg4MDApOworCWNhc2UgU0RfSU5JVDJfUEFUVEVSTjoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiU0RfSU5JVDJfUEFUVEVSTlxuIik7CisJCW1lbWNweShidWYsIFNEX0luaXQyLCAweDgwMCk7CiAJCWJyZWFrOwotCQljYXNlIFNEX1JXX1BBVFRFUk46Ci0JCQlwcmludGsoIlNEX1JXX1BBVFRFUk5cbiIpOwotCQkJbWVtY3B5KGJ1ZiwgU0RfUmR3ciwgMHg4MDApOworCWNhc2UgU0RfUldfUEFUVEVSTjoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiU0RfUldfUEFUVEVSTlxuIik7CisJCW1lbWNweShidWYsIFNEX1Jkd3IsIDB4ODAwKTsKIAkJYnJlYWs7Ci0JCS8vIEZvciBNUwotCQljYXNlIE1TX0lOSVRfUEFUVEVSTjoKLQkJCXByaW50aygiTVNfSU5JVF9QQVRURVJOXG4iKTsKLQkJCW1lbWNweShidWYsIE1TX0luaXQsIDB4ODAwKTsKKwkvKiBGb3IgTVMgKi8KKwljYXNlIE1TX0lOSVRfUEFUVEVSTjoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiTVNfSU5JVF9QQVRURVJOXG4iKTsKKwkJbWVtY3B5KGJ1ZiwgTVNfSW5pdCwgMHg4MDApOwogCQlicmVhazsKLQkJY2FzZSBNU1BfUldfUEFUVEVSTjoKLQkJCXByaW50aygiTVNQX1JXX1BBVFRFUk5cbiIpOwotCQkJbWVtY3B5KGJ1ZiwgTVNQX1Jkd3IsIDB4ODAwKTsKKwljYXNlIE1TUF9SV19QQVRURVJOOgorCQlwcmludGsoS0VSTl9JTkZPICJNU1BfUldfUEFUVEVSTlxuIik7CisJCW1lbWNweShidWYsIE1TUF9SZHdyLCAweDgwMCk7CiAJCWJyZWFrOwotCQljYXNlIE1TX1JXX1BBVFRFUk46Ci0JCQlwcmludGsoIk1TX1JXX1BBVFRFUk5cbiIpOwotCQkJbWVtY3B5KGJ1ZiwgTVNfUmR3ciwgMHg4MDApOworCWNhc2UgTVNfUldfUEFUVEVSTjoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiTVNfUldfUEFUVEVSTlxuIik7CisJCW1lbWNweShidWYsIE1TX1Jkd3IsIDB4ODAwKTsKIAkJYnJlYWs7Ci0JCS8vIEZvciBTUwotCQljYXNlIFNNX0lOSVRfUEFUVEVSTjoKLQkJCXByaW50aygiU01fSU5JVF9QQVRURVJOXG4iKTsKLQkJCW1lbWNweShidWYsIFNNX0luaXQsIDB4ODAwKTsKKwkvKiBGb3IgU1MgKi8KKwljYXNlIFNNX0lOSVRfUEFUVEVSTjoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiU01fSU5JVF9QQVRURVJOXG4iKTsKKwkJbWVtY3B5KGJ1ZiwgU01fSW5pdCwgMHg4MDApOwogCQlicmVhazsKLQkJY2FzZSBTTV9SV19QQVRURVJOOgotCQkJcHJpbnRrKCJTTV9SV19QQVRURVJOXG4iKTsKLQkJCW1lbWNweShidWYsIFNNX1Jkd3IsIDB4ODAwKTsKKwljYXNlIFNNX1JXX1BBVFRFUk46CisJCXByaW50ayhLRVJOX0lORk8gIlNNX1JXX1BBVFRFUk5cbiIpOworCQltZW1jcHkoYnVmLCBTTV9SZHdyLCAweDgwMCk7CiAJCWJyZWFrOwogCX0KIAogCW1lbXNldChiY2IsIDAsIHNpemVvZihzdHJ1Y3QgYnVsa19jYl93cmFwKSk7CiAJYmNiLT5TaWduYXR1cmUgPSBjcHVfdG9fbGUzMihVU19CVUxLX0NCX1NJR04pOwogCWJjYi0+RGF0YVRyYW5zZmVyTGVuZ3RoID0gMHg4MDA7Ci0JYmNiLT5GbGFncyA9MHgwMDsKKwliY2ItPkZsYWdzID0gMHgwMDsKIAliY2ItPkNEQlswXSA9IDB4RUY7CiAKIAlyZXN1bHQgPSBFTkVfU2VuZFNjc2lDbWQodXMsIEZESVJfV1JJVEUsIGJ1ZiwgMCk7CkBAIC0zNTQsNTQgKzM0MSw2MyBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLS8vLS0tLS0gRU5FX1NlbmRTY3NpQ21kKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKgorICogRU5FX1NlbmRTY3NpQ21kKCk6CisgKi8KIGludCBFTkVfU2VuZFNjc2lDbWQoc3RydWN0IHVzX2RhdGEgKnVzLCBCWVRFIGZEaXIsIHZvaWQgKmJ1ZiwgaW50IHVzZV9zZykKIHsKIAlzdHJ1Y3QgYnVsa19jYl93cmFwICpiY2IgPSAoc3RydWN0IGJ1bGtfY2Jfd3JhcCAqKSB1cy0+aW9idWY7CiAJc3RydWN0IGJ1bGtfY3Nfd3JhcCAqYmNzID0gKHN0cnVjdCBidWxrX2NzX3dyYXAgKikgdXMtPmlvYnVmOwogCiAJaW50IHJlc3VsdDsKLQl1bnNpZ25lZCBpbnQgdHJhbnNmZXJfbGVuZ3RoPWJjYi0+RGF0YVRyYW5zZmVyTGVuZ3RoLCBjc3dsZW49MCwgcGFydGlhbD0wOworCXVuc2lnbmVkIGludCB0cmFuc2Zlcl9sZW5ndGggPSBiY2ItPkRhdGFUcmFuc2Zlckxlbmd0aCwKKwkJICAgICBjc3dsZW4gPSAwLCBwYXJ0aWFsID0gMDsKIAl1bnNpZ25lZCBpbnQgcmVzaWR1ZTsKIAotCS8vcHJpbnRrKCJ0cmFuc3BvcnQgLS0tIEVORV9TZW5kU2NzaUNtZFxuIik7Ci0JLy8gc2VuZCBjbWQgdG8gb3V0IGVuZHBvaW50Ci0JcmVzdWx0ID0gdXNiX3N0b3JfYnVsa190cmFuc2Zlcl9idWYodXMsIHVzLT5zZW5kX2J1bGtfcGlwZSwgYmNiLCBVU19CVUxLX0NCX1dSQVBfTEVOLCBOVUxMKTsKLQlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKLQl7Ci0JCXByaW50aygic2VuZCBjbWQgdG8gb3V0IGVuZHBvaW50IGZhaWwgLS0tXG4iKTsKKwkvKiBwcmludGsoS0VSTl9JTkZPICJ0cmFuc3BvcnQgLS0tIEVORV9TZW5kU2NzaUNtZFxuIik7ICovCisJLyogc2VuZCBjbWQgdG8gb3V0IGVuZHBvaW50ICovCisJcmVzdWx0ID0gdXNiX3N0b3JfYnVsa190cmFuc2Zlcl9idWYodXMsIHVzLT5zZW5kX2J1bGtfcGlwZSwKKwkJCQkJICAgIGJjYiwgVVNfQlVMS19DQl9XUkFQX0xFTiwgTlVMTCk7CisJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzZW5kIGNtZCB0byBvdXQgZW5kcG9pbnQgZmFpbCAtLS1cbiIpOwogCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwogCX0KIAotCWlmIChidWYpCi0JewotCQl1bnNpZ25lZCBpbnQgcGlwZSA9IGZEaXIgPT0gRkRJUl9SRUFEID8gdXMtPnJlY3ZfYnVsa19waXBlIDogdXMtPnNlbmRfYnVsa19waXBlOwotCQkvLyBCdWxrCisJaWYgKGJ1ZikgeworCQl1bnNpZ25lZCBpbnQgcGlwZSA9IGZEaXI7CisKKwkJaWYgKGZEaXIgPT0gRkRJUl9SRUFEKQorCQkJcGlwZSA9IHVzLT5yZWN2X2J1bGtfcGlwZTsKKwkJZWxzZQorCQkJcGlwZSA9IHVzLT5zZW5kX2J1bGtfcGlwZTsKKworCQkvKiBCdWxrICovCiAJCWlmICh1c2Vfc2cpCiAJCQlyZXN1bHQgPSB1c2Jfc3Rvcl9idWxrX3NyYih1cywgcGlwZSwgdXMtPnNyYik7CiAJCWVsc2UKLQkJCXJlc3VsdCA9IHVzYl9zdG9yX2J1bGtfdHJhbnNmZXJfc2codXMsIHBpcGUsIGJ1ZiwgdHJhbnNmZXJfbGVuZ3RoLCAwLCAmcGFydGlhbCk7Ci0JCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQotCQl7Ci0JCQlwcmludGsoImRhdGEgdHJhbnNmZXIgZmFpbCAtLS1cbiIpOworCQkJcmVzdWx0ID0gdXNiX3N0b3JfYnVsa190cmFuc2Zlcl9zZyh1cywgcGlwZSwgYnVmLAorCQkJCQkJdHJhbnNmZXJfbGVuZ3RoLCAwLCAmcGFydGlhbCk7CisJCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImRhdGEgdHJhbnNmZXIgZmFpbCAtLS1cbiIpOwogCQkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKIAkJfQogCX0KIAotCS8vIEdldCBDU1cgZm9yIGRldmljZSBzdGF0dXMKLQlyZXN1bHQgPSB1c2Jfc3Rvcl9idWxrX3RyYW5zZmVyX2J1Zih1cywgdXMtPnJlY3ZfYnVsa19waXBlLCBiY3MsIFVTX0JVTEtfQ1NfV1JBUF9MRU4sICZjc3dsZW4pOworCS8qIEdldCBDU1cgZm9yIGRldmljZSBzdGF0dXMgKi8KKwlyZXN1bHQgPSB1c2Jfc3Rvcl9idWxrX3RyYW5zZmVyX2J1Zih1cywgdXMtPnJlY3ZfYnVsa19waXBlLCBiY3MsCisJCQkJCQlVU19CVUxLX0NTX1dSQVBfTEVOLCAmY3N3bGVuKTsKIAotCWlmIChyZXN1bHQgPT0gVVNCX1NUT1JfWEZFUl9TSE9SVCAmJiBjc3dsZW4gPT0gMCkKLQl7Ci0JCXByaW50aygiUmVjZWl2ZWQgMC1sZW5ndGggQ1NXOyByZXRyeWluZy4uLlxuIik7Ci0JCXJlc3VsdCA9IHVzYl9zdG9yX2J1bGtfdHJhbnNmZXJfYnVmKHVzLCB1cy0+cmVjdl9idWxrX3BpcGUsIGJjcywgVVNfQlVMS19DU19XUkFQX0xFTiwgJmNzd2xlbik7CisJaWYgKHJlc3VsdCA9PSBVU0JfU1RPUl9YRkVSX1NIT1JUICYmIGNzd2xlbiA9PSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlJlY2VpdmVkIDAtbGVuZ3RoIENTVzsgcmV0cnlpbmcuLi5cbiIpOworCQlyZXN1bHQgPSB1c2Jfc3Rvcl9idWxrX3RyYW5zZmVyX2J1Zih1cywgdXMtPnJlY3ZfYnVsa19waXBlLAorCQkJCQliY3MsIFVTX0JVTEtfQ1NfV1JBUF9MRU4sICZjc3dsZW4pOwogCX0KIAotCWlmIChyZXN1bHQgPT0gVVNCX1NUT1JfWEZFUl9TVEFMTEVEKQotCXsKKwlpZiAocmVzdWx0ID09IFVTQl9TVE9SX1hGRVJfU1RBTExFRCkgewogCQkvKiBnZXQgdGhlIHN0YXR1cyBhZ2FpbiAqLwotCQlwcmludGsoIkF0dGVtcHRpbmcgdG8gZ2V0IENTVyAoMm5kIHRyeSkuLi5cbiIpOwotCQlyZXN1bHQgPSB1c2Jfc3Rvcl9idWxrX3RyYW5zZmVyX2J1Zih1cywgdXMtPnJlY3ZfYnVsa19waXBlLCBiY3MsIFVTX0JVTEtfQ1NfV1JBUF9MRU4sIE5VTEwpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJBdHRlbXB0aW5nIHRvIGdldCBDU1cgKDJuZCB0cnkpLi4uXG4iKTsKKwkJcmVzdWx0ID0gdXNiX3N0b3JfYnVsa190cmFuc2Zlcl9idWYodXMsIHVzLT5yZWN2X2J1bGtfcGlwZSwKKwkJCQkJCWJjcywgVVNfQlVMS19DU19XUkFQX0xFTiwgTlVMTCk7CiAJfQogCiAJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCkBAIC00MTAsMTIgKzQwNiwxNCBAQAogCS8qIGNoZWNrIGJ1bGsgc3RhdHVzICovCiAJcmVzaWR1ZSA9IGxlMzJfdG9fY3B1KGJjcy0+UmVzaWR1ZSk7CiAKLQkvKiB0cnkgdG8gY29tcHV0ZSB0aGUgYWN0dWFsIHJlc2lkdWUsIGJhc2VkIG9uIGhvdyBtdWNoIGRhdGEKLQkgKiB3YXMgcmVhbGx5IHRyYW5zZmVycmVkIGFuZCB3aGF0IHRoZSBkZXZpY2UgdGVsbHMgdXMgKi8KLQlpZiAocmVzaWR1ZSAmJiAhKHVzLT5mZmxhZ3MgJiBVU19GTF9JR05PUkVfUkVTSURVRSkpCi0JeworCS8qCisJICogdHJ5IHRvIGNvbXB1dGUgdGhlIGFjdHVhbCByZXNpZHVlLCBiYXNlZCBvbiBob3cgbXVjaCBkYXRhCisJICogd2FzIHJlYWxseSB0cmFuc2ZlcnJlZCBhbmQgd2hhdCB0aGUgZGV2aWNlIHRlbGxzIHVzCisJICovCisJaWYgKHJlc2lkdWUgJiYgISh1cy0+ZmZsYWdzICYgVVNfRkxfSUdOT1JFX1JFU0lEVUUpKSB7CiAJCXJlc2lkdWUgPSBtaW4ocmVzaWR1ZSwgdHJhbnNmZXJfbGVuZ3RoKTsKLQkJc2NzaV9zZXRfcmVzaWQodXMtPnNyYiwgbWF4KHNjc2lfZ2V0X3Jlc2lkKHVzLT5zcmIpLCAoaW50KSByZXNpZHVlKSk7CisJCXNjc2lfc2V0X3Jlc2lkKHVzLT5zcmIsIG1heChzY3NpX2dldF9yZXNpZCh1cy0+c3JiKSwKKwkJCQkJCQkoaW50KSByZXNpZHVlKSk7CiAJfQogCiAJaWYgKGJjcy0+U3RhdHVzICE9IFVTX0JVTEtfU1RBVF9PSykKQEAgLTQyNCwzNSArNDIyLDQwIEBACiAJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9HT09EOwogfQogCi0vLy0tLS0tIEVORV9SZWFkX0RhdGEoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qCisgKiBFTkVfUmVhZF9EYXRhKCkKKyAqLwogaW50IEVORV9SZWFkX0RhdGEoc3RydWN0IHVzX2RhdGEgKnVzLCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW5ndGgpCiB7CiAJc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwogCXN0cnVjdCBidWxrX2NzX3dyYXAgKmJjcyA9IChzdHJ1Y3QgYnVsa19jc193cmFwICopIHVzLT5pb2J1ZjsKIAlpbnQgcmVzdWx0OwogCi0JLy9wcmludGsoInRyYW5zcG9ydCAtLS0gRU5FX1JlYWRfRGF0YVxuIik7Ci0JLy8gc2V0IHVwIHRoZSBjb21tYW5kIHdyYXBwZXIKKwkvKiBwcmludGsoS0VSTl9JTkZPICJ0cmFuc3BvcnQgLS0tIEVORV9SZWFkX0RhdGFcbiIpOyAqLworCS8qIHNldCB1cCB0aGUgY29tbWFuZCB3cmFwcGVyICovCiAJbWVtc2V0KGJjYiwgMCwgc2l6ZW9mKHN0cnVjdCBidWxrX2NiX3dyYXApKTsKIAliY2ItPlNpZ25hdHVyZSA9IGNwdV90b19sZTMyKFVTX0JVTEtfQ0JfU0lHTik7CiAJYmNiLT5EYXRhVHJhbnNmZXJMZW5ndGggPSBsZW5ndGg7Ci0JYmNiLT5GbGFncyA9MHg4MDsKKwliY2ItPkZsYWdzID0gMHg4MDsKIAliY2ItPkNEQlswXSA9IDB4RUQ7CiAJYmNiLT5DREJbMl0gPSAweEZGOwogCWJjYi0+Q0RCWzNdID0gMHg4MTsKIAotCS8vIHNlbmQgY21kIHRvIG91dCBlbmRwb2ludAotCXJlc3VsdCA9IHVzYl9zdG9yX2J1bGtfdHJhbnNmZXJfYnVmKHVzLCB1cy0+c2VuZF9idWxrX3BpcGUsIGJjYiwgVVNfQlVMS19DQl9XUkFQX0xFTiwgTlVMTCk7CisJLyogc2VuZCBjbWQgdG8gb3V0IGVuZHBvaW50ICovCisJcmVzdWx0ID0gdXNiX3N0b3JfYnVsa190cmFuc2Zlcl9idWYodXMsIHVzLT5zZW5kX2J1bGtfcGlwZSwgYmNiLAorCQkJCQkJVVNfQlVMS19DQl9XUkFQX0xFTiwgTlVMTCk7CiAJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAKLQkvLyBSL1cgZGF0YQotCXJlc3VsdCA9IHVzYl9zdG9yX2J1bGtfdHJhbnNmZXJfYnVmKHVzLCB1cy0+cmVjdl9idWxrX3BpcGUsIGJ1ZiwgbGVuZ3RoLCBOVUxMKTsKKwkvKiBSL1cgZGF0YSAqLworCXJlc3VsdCA9IHVzYl9zdG9yX2J1bGtfdHJhbnNmZXJfYnVmKHVzLCB1cy0+cmVjdl9idWxrX3BpcGUsCisJCQkJCQlidWYsIGxlbmd0aCwgTlVMTCk7CiAJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAKLQkvLyBHZXQgQ1NXIGZvciBkZXZpY2Ugc3RhdHVzCi0JcmVzdWx0ID0gdXNiX3N0b3JfYnVsa190cmFuc2Zlcl9idWYodXMsIHVzLT5yZWN2X2J1bGtfcGlwZSwgYmNzLCBVU19CVUxLX0NTX1dSQVBfTEVOLCBOVUxMKTsKKwkvKiBHZXQgQ1NXIGZvciBkZXZpY2Ugc3RhdHVzICovCisJcmVzdWx0ID0gdXNiX3N0b3JfYnVsa190cmFuc2Zlcl9idWYodXMsIHVzLT5yZWN2X2J1bGtfcGlwZSwgYmNzLAorCQkJCQkJVVNfQlVMS19DU19XUkFQX0xFTiwgTlVMTCk7CiAJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAJaWYgKGJjcy0+U3RhdHVzICE9IFVTX0JVTEtfU1RBVF9PSykKQEAgLTQ2MSwzNSArNDY0LDQwIEBACiAJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9HT09EOwogfQogCi0vLy0tLS0tIEVORV9Xcml0ZV9EYXRhKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKgorICogRU5FX1dyaXRlX0RhdGEoKToKKyAqLwogaW50IEVORV9Xcml0ZV9EYXRhKHN0cnVjdCB1c19kYXRhICp1cywgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQogewogCXN0cnVjdCBidWxrX2NiX3dyYXAgKmJjYiA9IChzdHJ1Y3QgYnVsa19jYl93cmFwICopIHVzLT5pb2J1ZjsKIAlzdHJ1Y3QgYnVsa19jc193cmFwICpiY3MgPSAoc3RydWN0IGJ1bGtfY3Nfd3JhcCAqKSB1cy0+aW9idWY7CiAJaW50IHJlc3VsdDsKIAotCS8vcHJpbnRrKCJ0cmFuc3BvcnQgLS0tIEVORV9Xcml0ZV9EYXRhXG4iKTsKLQkvLyBzZXQgdXAgdGhlIGNvbW1hbmQgd3JhcHBlcgorCS8qIHByaW50aygidHJhbnNwb3J0IC0tLSBFTkVfV3JpdGVfRGF0YVxuIik7ICovCisJLyogc2V0IHVwIHRoZSBjb21tYW5kIHdyYXBwZXIgKi8KIAltZW1zZXQoYmNiLCAwLCBzaXplb2Yoc3RydWN0IGJ1bGtfY2Jfd3JhcCkpOwogCWJjYi0+U2lnbmF0dXJlID0gY3B1X3RvX2xlMzIoVVNfQlVMS19DQl9TSUdOKTsKIAliY2ItPkRhdGFUcmFuc2Zlckxlbmd0aCA9IGxlbmd0aDsKLQliY2ItPkZsYWdzID0weDAwOworCWJjYi0+RmxhZ3MgPSAweDAwOwogCWJjYi0+Q0RCWzBdID0gMHhFRTsKIAliY2ItPkNEQlsyXSA9IDB4RkY7CiAJYmNiLT5DREJbM10gPSAweDgxOwogCi0JLy8gc2VuZCBjbWQgdG8gb3V0IGVuZHBvaW50Ci0JcmVzdWx0ID0gdXNiX3N0b3JfYnVsa190cmFuc2Zlcl9idWYodXMsIHVzLT5zZW5kX2J1bGtfcGlwZSwgYmNiLCBVU19CVUxLX0NCX1dSQVBfTEVOLCBOVUxMKTsKKwkvKiBzZW5kIGNtZCB0byBvdXQgZW5kcG9pbnQgKi8KKwlyZXN1bHQgPSB1c2Jfc3Rvcl9idWxrX3RyYW5zZmVyX2J1Zih1cywgdXMtPnNlbmRfYnVsa19waXBlLCBiY2IsCisJCQkJCQlVU19CVUxLX0NCX1dSQVBfTEVOLCBOVUxMKTsKIAlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKIAotCS8vIFIvVyBkYXRhCi0JcmVzdWx0ID0gdXNiX3N0b3JfYnVsa190cmFuc2Zlcl9idWYodXMsIHVzLT5zZW5kX2J1bGtfcGlwZSwgYnVmLCBsZW5ndGgsIE5VTEwpOworCS8qIFIvVyBkYXRhICovCisJcmVzdWx0ID0gdXNiX3N0b3JfYnVsa190cmFuc2Zlcl9idWYodXMsIHVzLT5zZW5kX2J1bGtfcGlwZSwKKwkJCQkJCWJ1ZiwgbGVuZ3RoLCBOVUxMKTsKIAlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKIAotCS8vIEdldCBDU1cgZm9yIGRldmljZSBzdGF0dXMKLQlyZXN1bHQgPSB1c2Jfc3Rvcl9idWxrX3RyYW5zZmVyX2J1Zih1cywgdXMtPnJlY3ZfYnVsa19waXBlLCBiY3MsIFVTX0JVTEtfQ1NfV1JBUF9MRU4sIE5VTEwpOworCS8qIEdldCBDU1cgZm9yIGRldmljZSBzdGF0dXMgKi8KKwlyZXN1bHQgPSB1c2Jfc3Rvcl9idWxrX3RyYW5zZmVyX2J1Zih1cywgdXMtPnJlY3ZfYnVsa19waXBlLCBiY3MsCisJCQkJCQlVU19CVUxLX0NTX1dSQVBfTEVOLCBOVUxMKTsKIAlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKIAlpZiAoYmNzLT5TdGF0dXMgIT0gVVNfQlVMS19TVEFUX09LKQpAQCAtNDk4LDQyICs1MDYsNTIgQEAKIAlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7CiB9CiAKLS8vLS0tLS0gdXNiX3N0b3JfcHJpbnRfY21kKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKgorICogdXNiX3N0b3JfcHJpbnRfY21kKCk6CisgKi8KIHZvaWQgdXNiX3N0b3JfcHJpbnRfY21kKHN0cnVjdCBzY3NpX2NtbmQgKnNyYikKIHsKIAlQQllURQlDZGIgPSBzcmItPmNtbmQ7CiAJRFdPUkQJY21kID0gQ2RiWzBdOwotCURXT1JECWJuICA9CSgoQ2RiWzJdPDwyNCkgJiAweGZmMDAwMDAwKSB8ICgoQ2RiWzNdPDwxNikgJiAweDAwZmYwMDAwKSB8Ci0JCQkoKENkYls0XTw8IDgpICYgMHgwMDAwZmYwMCkgfCAoKENkYls1XTw8IDApICYgMHgwMDAwMDBmZik7Ci0JV09SRAlibGVuID0gKChDZGJbN108PCA4KSAmIDB4ZmYwMCkgfCAoKENkYls4XTw8IDApICYgMHgwMGZmKTsKKwlEV09SRAlibiAgPQkoKENkYlsyXSA8PCAyNCkgJiAweGZmMDAwMDAwKSB8CisJCQkoKENkYlszXSA8PCAxNikgJiAweDAwZmYwMDAwKSB8CisJCQkoKENkYls0XSA8PCA4KSAmIDB4MDAwMGZmMDApIHwKKwkJCSgoQ2RiWzVdIDw8IDApICYgMHgwMDAwMDBmZik7CisJV09SRAlibGVuID0gKChDZGJbN10gPDwgOCkgJiAweGZmMDApIHwgKChDZGJbOF0gPDwgMCkgJiAweDAwZmYpOwogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFRFU1RfVU5JVF9SRUFEWToKLQkJLy9wcmludGsoInNjc2kgY21kICVYIC0tLSBTQ1NJT1BfVEVTVF9VTklUX1JFQURZXG4iLCBjbWQpOworCQkvKiBwcmludGsoS0VSTl9JTkZPCisJCQkgInNjc2kgY21kICVYIC0tLSBTQ1NJT1BfVEVTVF9VTklUX1JFQURZXG4iLCBjbWQpOyAqLwogCQlicmVhazsKIAljYXNlIElOUVVJUlk6Ci0JCXByaW50aygic2NzaSBjbWQgJVggLS0tIFNDU0lPUF9JTlFVSVJZXG4iLCBjbWQpOworCQlwcmludGsoS0VSTl9JTkZPICJzY3NpIGNtZCAlWCAtLS0gU0NTSU9QX0lOUVVJUllcbiIsIGNtZCk7CiAJCWJyZWFrOwogCWNhc2UgTU9ERV9TRU5TRToKLQkJcHJpbnRrKCJzY3NpIGNtZCAlWCAtLS0gU0NTSU9QX01PREVfU0VOU0VcbiIsIGNtZCk7CisJCXByaW50ayhLRVJOX0lORk8gInNjc2kgY21kICVYIC0tLSBTQ1NJT1BfTU9ERV9TRU5TRVxuIiwgY21kKTsKIAkJYnJlYWs7CiAJY2FzZSBTVEFSVF9TVE9QOgotCQlwcmludGsoInNjc2kgY21kICVYIC0tLSBTQ1NJT1BfU1RBUlRfU1RPUFxuIiwgY21kKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAic2NzaSBjbWQgJVggLS0tIFNDU0lPUF9TVEFSVF9TVE9QXG4iLCBjbWQpOwogCQlicmVhazsKIAljYXNlIFJFQURfQ0FQQUNJVFk6Ci0JCXByaW50aygic2NzaSBjbWQgJVggLS0tIFNDU0lPUF9SRUFEX0NBUEFDSVRZXG4iLCBjbWQpOworCQlwcmludGsoS0VSTl9JTkZPICJzY3NpIGNtZCAlWCAtLS0gU0NTSU9QX1JFQURfQ0FQQUNJVFlcbiIsIGNtZCk7CiAJCWJyZWFrOwogCWNhc2UgUkVBRF8xMDoKLQkJLy9wcmludGsoInNjc2kgY21kICVYIC0tLSBTQ1NJT1BfUkVBRCwgYm4gPSAlWCwgYmxlbiA9ICVYXG4iLCBjbWQsIGJuLCBibGVuKTsKKwkJLyogIHByaW50ayhLRVJOX0lORk8KKwkJCSAgICJzY3NpIGNtZCAlWCAtLS0gU0NTSU9QX1JFQUQsYm4gPSAlWCwgYmxlbiA9ICVYXG4iCisJCQkgICAsY21kLCBibiwgYmxlbik7ICovCiAJCWJyZWFrOwogCWNhc2UgV1JJVEVfMTA6Ci0JCS8vcHJpbnRrKCJzY3NpIGNtZCAlWCAtLS0gU0NTSU9QX1dSSVRFLCBibiA9ICVYLCBibGVuID0gJVhcbiIsIGNtZCwgYm4sIGJsZW4pOworCQkvKiBwcmludGsoS0VSTl9JTkZPCisJCQkgICJzY3NpIGNtZCAlWCAtLS0gU0NTSU9QX1dSSVRFLAorCQkJICBibiA9ICVYLCBibGVuID0gJVhcbiIgLCBjbWQsIGJuLCBibGVuKTsgKi8KIAkJYnJlYWs7CiAJY2FzZSBBTExPV19NRURJVU1fUkVNT1ZBTDoKLQkJcHJpbnRrKCJzY3NpIGNtZCAlWCAtLS0gU0NTSU9QX0FMTE9XX01FRElVTV9SRU1PVkFMXG4iLCBjbWQpOworCQlwcmludGsoS0VSTl9JTkZPCisJCQkic2NzaSBjbWQgJVggLS0tIFNDU0lPUF9BTExPV19NRURJVU1fUkVNT1ZBTFxuIiwgY21kKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKCJzY3NpIGNtZCAlWCAtLS0gT3RoZXIgY21kXG4iLCBjbWQpOworCQlwcmludGsoS0VSTl9JTkZPICJzY3NpIGNtZCAlWCAtLS0gT3RoZXIgY21kXG4iLCBjbWQpOwogCQlicmVhazsKIAl9CiAJYm4gPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2tldWNyL2luaXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9pbml0LmgKaW5kZXggY2QxOTlmYy4uNTIyMzEzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2tldWNyL2luaXQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcva2V1Y3IvaW5pdC5oCkBAIC0xLDUgKzEsOCBAQAogI2luY2x1ZGUgImNvbW1vbi5oIgogCitleHRlcm4gRFdPUkQgTWVkaWFDaGFuZ2U7CitleHRlcm4gaW50IENoZWNrX0RfTWVkaWFGbXQoc3RydWN0IHVzX2RhdGEgKik7CisKIEJZVEUgU0RfSW5pdDFbXSA9IHsKIDB4OTAsIDB4RkYsIDB4MDksIDB4RTAsIDB4MzAsIDB4RTEsIDB4MDYsIDB4OTAsCiAweEZGLCAweDIzLCAweDc0LCAweDgwLCAweEYwLCAweDkwLCAweEZGLCAweDA5LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2tldWNyL21zLmMgYi9kcml2ZXJzL3N0YWdpbmcva2V1Y3IvbXMuYwppbmRleCA5YTNmZGI0Li40NTJlYThmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3IvbXMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcva2V1Y3IvbXMuYwpAQCAtMzQ3LDcgKzM0Nyw3IEBACiAJQllURSAgICAgICAgICAgICAgICAgICAgICpQYWdlQnVmZmVyOwogCU1TX0xpYlR5cGVFeHRkYXQgICAgICAgICBFeHRyYURhdGE7CiAKLQlpZiAoKFBhZ2VCdWZmZXIgPSAoQllURSAqKWttYWxsb2MoTVNfQllURVNfUEVSX1BBR0UsIEdGUF9LRVJORUwpKT09TlVMTCkKKwlpZiAoKFBhZ2VCdWZmZXIgPSBrbWFsbG9jKE1TX0JZVEVTX1BFUl9QQUdFLCBHRlBfS0VSTkVMKSk9PU5VTEwpCiAJCXJldHVybiAoRFdPUkQpLTE7CiAKIAlyZXN1bHQgPSAoRFdPUkQpLTE7CkBAIC00ODAsOCArNDgwLDggQEAKIAlEV09SRCAgaTsKIAogCi0JdXMtPk1TX0xpYi5QaHkyTG9nTWFwID0gKFdPUkQgKilrbWFsbG9jKHVzLT5NU19MaWIuTnVtYmVyT2ZQaHlCbG9jayAqIHNpemVvZihXT1JEKSwgR0ZQX0tFUk5FTCk7Ci0JdXMtPk1TX0xpYi5Mb2cyUGh5TWFwID0gKFdPUkQgKilrbWFsbG9jKHVzLT5NU19MaWIuTnVtYmVyT2ZMb2dCbG9jayAqIHNpemVvZihXT1JEKSwgR0ZQX0tFUk5FTCk7CisJdXMtPk1TX0xpYi5QaHkyTG9nTWFwID0ga21hbGxvYyh1cy0+TVNfTGliLk51bWJlck9mUGh5QmxvY2sgKiBzaXplb2YoV09SRCksIEdGUF9LRVJORUwpOworCXVzLT5NU19MaWIuTG9nMlBoeU1hcCA9IGttYWxsb2ModXMtPk1TX0xpYi5OdW1iZXJPZkxvZ0Jsb2NrICogc2l6ZW9mKFdPUkQpLCBHRlBfS0VSTkVMKTsKIAogCWlmICgodXMtPk1TX0xpYi5QaHkyTG9nTWFwID09IE5VTEwpIHx8ICh1cy0+TVNfTGliLkxvZzJQaHlNYXAgPT0gTlVMTCkpCiAJewpAQCAtNjEwLDggKzYxMCw4IEBACiB7CiAJdXMtPk1TX0xpYi53cnRibGsgPSAoV09SRCktMTsKIAotCXVzLT5NU19MaWIuYmxrcGFnID0gKEJZVEUgKilrbWFsbG9jKHVzLT5NU19MaWIuUGFnZXNQZXJCbG9jayAqIHVzLT5NU19MaWIuQnl0ZXNQZXJTZWN0b3IsIEdGUF9LRVJORUwpOwotCXVzLT5NU19MaWIuYmxrZXh0ID0gKE1TX0xpYlR5cGVFeHRkYXQgKilrbWFsbG9jKHVzLT5NU19MaWIuUGFnZXNQZXJCbG9jayAqIHNpemVvZihNU19MaWJUeXBlRXh0ZGF0KSwgR0ZQX0tFUk5FTCk7CisJdXMtPk1TX0xpYi5ibGtwYWcgPSBrbWFsbG9jKHVzLT5NU19MaWIuUGFnZXNQZXJCbG9jayAqIHVzLT5NU19MaWIuQnl0ZXNQZXJTZWN0b3IsIEdGUF9LRVJORUwpOworCXVzLT5NU19MaWIuYmxrZXh0ID0ga21hbGxvYyh1cy0+TVNfTGliLlBhZ2VzUGVyQmxvY2sgKiBzaXplb2YoTVNfTGliVHlwZUV4dGRhdCksIEdGUF9LRVJORUwpOwogCiAJaWYgKCh1cy0+TVNfTGliLmJsa3BhZyA9PSBOVUxMKSB8fCAodXMtPk1TX0xpYi5ibGtleHQgPT0gTlVMTCkpCiAJewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2tldWNyL3NtaWxtYWluLmMgYi9kcml2ZXJzL3N0YWdpbmcva2V1Y3Ivc21pbG1haW4uYwppbmRleCBiZGZiZjc2Li4yY2JlOWY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3Ivc21pbG1haW4uYworKysgYi9kcml2ZXJzL3N0YWdpbmcva2V1Y3Ivc21pbG1haW4uYwpAQCAtMTUzLDkgKzE1Myw5IEBACiAJV09SRCBsZW4sIGJuOwogCiAJLy9pZiAoQ2hlY2tfRF9NZWRpYVBvd2VyKCkpICAgICAgICA7IKZiIDYyNTAgZG9uJ3QgY2FyZQotCS8vICAgIHJldHVybihFcnJDb2RlKTsgICAgICAgICAgICAgOworCS8vICAgIHJldHVybihFcnJDb2RlKTsKIAkvL2lmIChDaGVja19EX01lZGlhRm10KGZkb0V4dCkpICAgIDsKLQkvLyAgICByZXR1cm4oRXJyQ29kZSk7ICAgICAgICAgICAgIDsKKwkvLyAgICByZXR1cm4oRXJyQ29kZSk7CiAJaWYgKENvbnZfRF9NZWRpYUFkZHIodXMsIHN0YXJ0KSkKIAkJcmV0dXJuKEVyckNvZGUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3Ivc21pbHN1Yi5jIGIvZHJpdmVycy9zdGFnaW5nL2tldWNyL3NtaWxzdWIuYwppbmRleCAxYjUyNTM1Li5jZTEwY2YyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3Ivc21pbHN1Yi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9zbWlsc3ViLmMKQEAgLTc2Myw4ICs3NjMsOCBAQAogCWJjYi0+Q0RCWzddCQkJPSAoQllURSlhZGRyOwogCWJjYi0+Q0RCWzZdCQkJPSAoQllURSkoYWRkci8weDAxMDApOwogCWJjYi0+Q0RCWzVdCQkJPSBNZWRpYS5ab25lLzI7Ci0JYmNiLT5DREJbOF0JCQk9ICoocmVkdW5kYW50K1JFRFRfQUREUjFIKTs7Ci0JYmNiLT5DREJbOV0JCQk9ICoocmVkdW5kYW50K1JFRFRfQUREUjFMKTs7CisJYmNiLT5DREJbOF0JCQk9ICoocmVkdW5kYW50K1JFRFRfQUREUjFIKTsKKwliY2ItPkNEQls5XQkJCT0gKihyZWR1bmRhbnQrUkVEVF9BRERSMUwpOwogCiAJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1dSSVRFLCBidWYsIDApOwogCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2NhcHR1cmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9jYXB0dXJlLmMKaW5kZXggMWUzYmIxNC4uOTY0NzE1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2NhcHR1cmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvY2FwdHVyZS5jCkBAIC0xNDcsNyArMTQ3LDcgQEAKIAljb25zdCBpbnQgYnl0ZXNfcGVyX2ZyYW1lID0gbGluZTZwY20tPnByb3BlcnRpZXMtPmJ5dGVzX3Blcl9mcmFtZTsKIAlpbnQgZnJhbWVzID0gZnNpemUgLyBieXRlc19wZXJfZnJhbWU7CiAKLQlpZiAocnVudGltZSA9PSAwKQorCWlmIChydW50aW1lID09IE5VTEwpCiAJCXJldHVybjsKIAogCWlmIChsaW5lNnBjbS0+cG9zX2luX2RvbmUgKyBmcmFtZXMgPiBydW50aW1lLT5idWZmZXJfc2l6ZSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L21pZGkuYyBiL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9taWRpLmMKaW5kZXggYWI2N2U4OC4uZTU1NGEyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L21pZGkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvbWlkaS5jCkBAIC0xMjcsNyArMTI3LDcgQEAKIAogCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7CiAKLQlpZiAodXJiID09IDApIHsKKwlpZiAodXJiID09IE5VTEwpIHsKIAkJZGV2X2VycihsaW5lNi0+aWZjZGV2LCAiT3V0IG9mIG1lbW9yeVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTEzNyw3ICsxMzcsNyBAQAogCiAJdHJhbnNmZXJfYnVmZmVyID0ga21hbGxvYyhsZW5ndGgsIEdGUF9BVE9NSUMpOwogCi0JaWYgKHRyYW5zZmVyX2J1ZmZlciA9PSAwKSB7CisJaWYgKHRyYW5zZmVyX2J1ZmZlciA9PSBOVUxMKSB7CiAJCXVzYl9mcmVlX3VyYih1cmIpOwogCQlkZXZfZXJyKGxpbmU2LT5pZmNkZXYsICJPdXQgb2YgbWVtb3J5XG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGluZTYvcGxheWJhY2suYyBiL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9wbGF5YmFjay5jCmluZGV4IDI5OTQwZmQuLjEwYzU0MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9wbGF5YmFjay5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9wbGF5YmFjay5jCkBAIC0yNDYsNyArMjQ2LDcgQEAKIAogCWNoYW5nZV92b2x1bWUodXJiX291dCwgbGluZTZwY20tPnZvbHVtZV9wbGF5YmFjaywgYnl0ZXNfcGVyX2ZyYW1lKTsKIAotCWlmIChsaW5lNnBjbS0+cHJldl9mYnVmICE9IDApIHsKKwlpZiAobGluZTZwY20tPnByZXZfZmJ1ZiAhPSBOVUxMKSB7CiAjaWZkZWYgQ09ORklHX0xJTkU2X1VTQl9JTVBVTFNFX1JFU1BPTlNFCiAJCWlmIChsaW5lNnBjbS0+ZmxhZ3MgJiBNQVNLX1BDTV9JTVBVTFNFKSB7CiAJCQljcmVhdGVfaW1wdWxzZV90ZXN0X3NpZ25hbChsaW5lNnBjbSwgdXJiX291dCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZW1yYXIvbWVtcmFyLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVtcmFyL21lbXJhci5oCmluZGV4IDBiNzM1YjguLjBmZWI3M2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZW1yYXIvbWVtcmFyLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lbXJhci9tZW1yYXIuaApAQCAtOTUsNiArOTUsNyBAQAogCWRtYV9hZGRyX3QgYnVzX2FkZHJlc3M7CiB9OwogCisjaWYgZGVmaW5lZChDT05GSUdfTVJTVF9SQVJfSEFORExFUikKIC8qKgogICogcmFyX3Jlc2VydmUoKSAtIHJlc2VydmUgUkFSIGJ1ZmZlcnMKICAqIEBidWZmZXJzOglhcnJheSBvZiBSQVJfYnVmZmVycyB3aGVyZSB0eXBlIGFuZCBzaXplIG9mIGJ1ZmZlcnMgdG8KQEAgLTE0OSw3ICsxNTAsMjUgQEAKIGV4dGVybiBzaXplX3QgcmFyX2hhbmRsZV90b19idXMoc3RydWN0IFJBUl9idWZmZXIgKmJ1ZmZlcnMsCiAJCQkJc2l6ZV90IGNvdW50KTsKIAorI2Vsc2UKIAorZXh0ZXJuIGlubGluZSBzaXplX3QgcmFyX3Jlc2VydmUoc3RydWN0IFJBUl9idWZmZXIgKmJ1ZmZlcnMsIHNpemVfdCBjb3VudCkKK3sKKwlyZXR1cm4gMDsKK30KKworZXh0ZXJuIGlubGluZSBzaXplX3QgcmFyX3JlbGVhc2Uoc3RydWN0IFJBUl9idWZmZXIgKmJ1ZmZlcnMsIHNpemVfdCBjb3VudCkKK3sKKwlyZXR1cm4gMDsKK30KKworZXh0ZXJuIGlubGluZSBzaXplX3QgcmFyX2hhbmRsZV90b19idXMoc3RydWN0IFJBUl9idWZmZXIgKmJ1ZmZlcnMsCisJCQkJc2l6ZV90IGNvdW50KQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgIC8qIE1SU1RfUkFSX0hBTkRMRVIgKi8KICNlbmRpZiAgLyogX19LRVJORUxfXyAqLwogCiAjZW5kaWYgIC8qIF9NRU1SQVJfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21zbS9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9tc20vTWFrZWZpbGUKaW5kZXggYmIzNjA2Zi4uMDdhODllYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21zbS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvbXNtL01ha2VmaWxlCkBAIC00MSwxMSArNDEsMTEgQEAKIG9iai0kKENPTkZJR19GQl9NU01fTENEQykgKz0gbGNkYy5vCiAKICMgTURESQotbXNtX21kZGktb2JqcyA6PSBtZGRpLm8gbWRkaWhvc3QubyBtZGRpaG9zdGkubworbXNtX21kZGkteSA6PSBtZGRpLm8gbWRkaWhvc3QubyBtZGRpaG9zdGkubwogb2JqLSQoQ09ORklHX0ZCX01TTV9NRERJKSArPSBtc21fbWRkaS5vCiAKICMgRXh0ZXJuYWwgTURESQotbXNtX21kZGlfZXh0LW9ianMgOj0gbWRkaWhvc3RfZS5vIG1kZGlfZXh0Lm8KK21zbV9tZGRpX2V4dC15IDo9IG1kZGlob3N0X2UubyBtZGRpX2V4dC5vCiBvYmotJChDT05GSUdfRkJfTVNNX0VYVE1EREkpICs9IG1zbV9tZGRpX2V4dC5vCiAKICMgVFZFbmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tc20vbGNkY190b3NoaWJhX3d2Z2FfcHQuYyBiL2RyaXZlcnMvc3RhZ2luZy9tc20vbGNkY190b3NoaWJhX3d2Z2FfcHQuYwppbmRleCA4NjRkN2MxLi5lZGJhNzhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbXNtL2xjZGNfdG9zaGliYV93dmdhX3B0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21zbS9sY2RjX3Rvc2hpYmFfd3ZnYV9wdC5jCkBAIC03Nyw3ICs3Nyw3IEBACiAKIAkvKiBmb2xsb3dlZCBieSBwYXJhbWV0ZXIgYnl0ZXMgKi8KIAlpZiAobnVtKSB7Ci0JCWJwID0gKGNoYXIgKikmZGF0YTs7CisJCWJwID0gKGNoYXIgKikmZGF0YTsKIAkJYnAgKz0gKG51bSAtIDEpOwogCQl3aGlsZSAobnVtKSB7CiAJCQl0b3NoaWJhX3NwaV93cml0ZV9ieXRlKDEsICpicCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbXNtL3R2ZW5jLmMgYi9kcml2ZXJzL3N0YWdpbmcvbXNtL3R2ZW5jLmMKaW5kZXggZjQxYzVhYy4uNGZiYjc3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21zbS90dmVuYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tc20vdHZlbmMuYwpAQCAtMjc5LDEyICsyNzksMTMgQEAKIAogCWlmIChJU19FUlIodHZlbmNfY2xrKSkgewogCQlwcmludGsoS0VSTl9FUlIgImVycm9yOiBjYW4ndCBnZXQgdHZlbmNfY2xrIVxuIik7Ci0JCXJldHVybiBJU19FUlIodHZlbmNfY2xrKTsKKwkJcmV0dXJuIFBUUl9FUlIodHZlbmNfY2xrKTsKIAl9CiAKIAlpZiAoSVNfRVJSKHR2ZGFjX2NsaykpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJlcnJvcjogY2FuJ3QgZ2V0IHR2ZGFjX2NsayFcbiIpOwotCQlyZXR1cm4gSVNfRVJSKHR2ZGFjX2Nsayk7CisJCWNsa19wdXQodHZlbmNfY2xrKTsKKwkJcmV0dXJuIFBUUl9FUlIodHZkYWNfY2xrKTsKIAl9CiAKIC8vCXBtX3Fvc19hZGRfcmVxdWlyZW1lbnQoUE1fUU9TX1NZU1RFTV9CVVNfRlJFUSAsICJ0dmVuYyIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcGhpc29uL3BoaXNvbi5jIGIvZHJpdmVycy9zdGFnaW5nL3BoaXNvbi9waGlzb24uYwppbmRleCA2NzcxNTIwLi42ODM2NTdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcGhpc29uL3BoaXNvbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9waGlzb24vcGhpc29uLmMKQEAgLTY5LDcgKzY5LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGhpc29uX3BjaV90YmxbXSA9IHsKK3N0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRShwaGlzb25fcGNpX3RibCkgPSB7CiAJeyBQQ0lfVkVORE9SX0lEX1BISVNPTiwgUENJX0RFVklDRV9JRF9QUzUwMDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsCiAJICBQQ0lfQ0xBU1NfU1RPUkFHRV9JREUgPDwgOCwgMHhmZmZmMDAsIDAgfSwKIAl7IDAsIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcG9obWVsZnMvY3J5cHRvLmMgYi9kcml2ZXJzL3N0YWdpbmcvcG9obWVsZnMvY3J5cHRvLmMKaW5kZXggMmZkYjNlMC4uNjU0MDg2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3BvaG1lbGZzL2NyeXB0by5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9wb2htZWxmcy9jcnlwdG8uYwpAQCAtMTMwLDEwICsxMzAsOCBAQAogCiB2b2lkIHBvaG1lbGZzX2NyeXB0b19lbmdpbmVfZXhpdChzdHJ1Y3QgcG9obWVsZnNfY3J5cHRvX2VuZ2luZSAqZSkKIHsKLQlpZiAoZS0+aGFzaCkKLQkJY3J5cHRvX2ZyZWVfaGFzaChlLT5oYXNoKTsKLQlpZiAoZS0+Y2lwaGVyKQotCQljcnlwdG9fZnJlZV9hYmxrY2lwaGVyKGUtPmNpcGhlcik7CisJY3J5cHRvX2ZyZWVfaGFzaChlLT5oYXNoKTsKKwljcnlwdG9fZnJlZV9hYmxrY2lwaGVyKGUtPmNpcGhlcik7CiAJa2ZyZWUoZS0+ZGF0YSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcC9tYWNfcGNpLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvbWFjX3BjaS5oCmluZGV4IDlmMjVlZjAuLmI4ODY4YTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcC9tYWNfcGNpLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL21hY19wY2kuaApAQCAtMzAsNyArMzAsOCBAQAogICAgIEFic3RyYWN0OgogCiAgICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisgICAgV2hvICAgICAgICAgIAlXaGVuICAgICAgICAgICAgV2hhdAorICAgIEp1c3RpbiBQLiBNYXR0b2NrCTExLzA3LzIwMTAJRml4IHNvbWUgdHlwb3MKICAgICAtLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KIApAQCAtNDUsNyArNDYsNyBAQAogCiAvKiAqLwogLyogRGV2aWNlIElEICYgVmVuZG9yIElEIHJlbGF0ZWQgZGVmaW5pdGlvbnMsICovCi0vKiBOT1RFOiB5b3Ugc2hvdWxkIG5vdCBhZGQgdGhlIG5ldyBWZW5kb3JJRC9EZXZpY2VJRCBoZXJlIHVubGVzcyB5b3Ugbm90IHN1cmUgaXQgYmVsb25ncyB0byB3aGF0IGNoaXAuICovCisvKiBOT1RFOiB5b3Ugc2hvdWxkIG5vdCBhZGQgdGhlIG5ldyBWZW5kb3JJRC9EZXZpY2VJRCBoZXJlIHVubGVzcyB5b3Uga25vdyBmb3Igc3VyZSB3aGF0IGNoaXAgaXQgYmVsb25ncyB0b28uICovCiAvKiAqLwogI2RlZmluZSBOSUNfUENJX1ZFTkRPUl9JRAkJMHgxODE0CiAjZGVmaW5lIFBDSUJVU19JTlRFTF9WRU5ET1IJMHg4MDg2CkBAIC04Myw3ICs4NCw3IEBACiAJdTMyIFNEUHRyMTsKIAkvKldvcmQzICovCiAJdTMyIHJzdjI6MjQ7Ci0JdTMyIFdJVjoxOwkJLyogV2lyZWxlc3MgSW5mbyBWYWxpZC4gMSBpZiBEcml2ZXIgYWxyZWFkeSBmaWxsIFdJLCAgbyBpZiBETUEgbmVlZHMgdG8gY29weSBXSSB0byBjb3JyZWN0cG9zaXRpb24gKi8KKwl1MzIgV0lWOjE7CQkvKiBXaXJlbGVzcyBJbmZvIFZhbGlkLiAxIGlmIERyaXZlciBhbHJlYWR5IGZpbGwgV0ksICBvIGlmIERNQSBuZWVkcyB0byBjb3B5IFdJIHRvIGNvcnJlY3QgcG9zaXRpb24gKi8KIAl1MzIgUVNFTDoyOwkJLyogc2VsZWN0IG9uLWNoaXAgRklGTyBJRCBmb3IgMm5kLXN0YWdlIG91dHB1dCBzY2hlZHVsZXIuMDpNR01ULCAxOkhDQ0EgMjpFRENBICovCiAJdTMyIHJzdjoyOwogCXUzMiBUQ086MTsJCS8qICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvbWFjX3VzYi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL21hY191c2IuaAppbmRleCBlZDBjMGI0Li5lODE1OGZiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL21hY191c2IuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvbWFjX3VzYi5oCkBAIC0zMCw3ICszMCw4IEBACiAgICAgQWJzdHJhY3Q6CiAKICAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKyAgICBXaG8gICAgICAgICAgCVdoZW4gICAgICAgICAgICBXaGF0CisgICAgSnVzdGluIFAuIE1hdHRvY2sJMTEvMDcvMjAxMAlGaXggYSB0eXBvCiAgICAgLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCiAKQEAgLTkzLDcgKzk0LDcgQEAKIAkvKiBXb3JkIDAgKi8KIAl1MzIgVVNCRE1BVHhQa3RMZW46MTY7CS8qdXNlZCBPTkxZIGluIFVTQiBidWxrIEFnZ3JlZ2F0aW9uLCAgVG90YWwgYnl0ZSBjb3VudHMgb2YgYWxsIHN1Yi1mcmFtZS4gKi8KIAl1MzIgcnN2Ojg7Ci0JdTMyIFdJVjoxOwkJLyogV2lyZWxlc3MgSW5mbyBWYWxpZC4gMSBpZiBEcml2ZXIgYWxyZWFkeSBmaWxsIFdJLCAgbyBpZiBETUEgbmVlZHMgdG8gY29weSBXSSB0byBjb3JyZWN0cG9zaXRpb24gKi8KKwl1MzIgV0lWOjE7CQkvKiBXaXJlbGVzcyBJbmZvIFZhbGlkLiAxIGlmIERyaXZlciBhbHJlYWR5IGZpbGwgV0ksICBvIGlmIERNQSBuZWVkcyB0byBjb3B5IFdJIHRvIGNvcnJlY3QgcG9zaXRpb24gKi8KIAl1MzIgUVNFTDoyOwkJLyogc2VsZWN0IG9uLWNoaXAgRklGTyBJRCBmb3IgMm5kLXN0YWdlIG91dHB1dCBzY2hlZHVsZXIuMDpNR01ULCAxOkhDQ0EgMjpFRENBICovCiAJdTMyIFN3VXNlTGFzdFJvdW5kOjE7CS8qIFNvZnR3YXJlIHVzZS4gKi8KIAl1MzIgcnN2MjoyOwkJLyogU29mdHdhcmUgdXNlLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL3J0bXBfbWFjLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvcnRtcF9tYWMuaAppbmRleCBlOGY3MTcyLi4zZDFlNDkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvcnRtcF9tYWMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvcnRtcF9tYWMuaApAQCAtMzIsNiArMzIsNyBAQAogCiAJUmV2aXNpb24gSGlzdG9yeToKIAlXaG8JCQlXaGVuCQkgIFdoYXQKKwlKdXN0aW4gUC4gTWF0dG9jawkxMS8wNy8yMDEwCSAgRml4IGEgY29tbWVudHMsIGFuZCB0eXBvcwogCS0tLS0tLS0tCS0tLS0tLS0tLS0JICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwogCkBAIC00Myw3ICs0NCw3IEBACiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAogLyogdGhlIGZpcnN0IDI0LWJ5dGUgaW4gVFhEIGlzIGNhbGxlZCBUWElORk8gYW5kIHdpbGwgYmUgRE1BZWQgdG8gTUFDIGJsb2NrIHRocm91Z2ggVFhGSUZPLiAqLwotLyogTUFDIGJsb2NrIHVzZSB0aGlzIFRYSU5GTyB0byBjb250cm9sIHRoZSB0cmFuc21pc3Npb24gYmVoYXZpb3Igb2YgdGhpcyBmcmFtZS4gKi8KKy8qIE1BQyBibG9jayB1c2VzIHRoaXMgVFhJTkZPIHRvIGNvbnRyb2wgdGhlIHRyYW5zbWlzc2lvbiBiZWhhdmlvciBvZiB0aGlzIGZyYW1lLiAqLwogI2RlZmluZSBGSUZPX01HTVQgICAgICAgICAgICAgICAgIDAKICNkZWZpbmUgRklGT19IQ0NBICAgICAgICAgICAgICAgICAxCiAjZGVmaW5lIEZJRk9fRURDQSAgICAgICAgICAgICAgICAgMgpAQCAtNDU4LDggKzQ1OSw4IEBACiAvKiAqLwogdHlwZWRlZiB1bmlvbiBfUkZfQ1NSX0NGRzBfU1RSVUMgewogCXN0cnVjdCB7Ci0JCXUzMiBSZWdJZEFuZENvbnRlbnQ6MjQ7CS8qIFJlZ2lzdGVyICAgICB2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQICovCi0JCXUzMiBiaXR3aWR0aDo1OwkvKiBTZWxlY3RlZCAgICAgQkJQICAgICByZWdpc3RlciAqLworCQl1MzIgUmVnSWRBbmRDb250ZW50OjI0OwkvKiBSZWdpc3RlciB2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQICovCisJCXUzMiBiaXR3aWR0aDo1OwkvKiBTZWxlY3RlZCBCQlAgcmVnaXN0ZXIgKi8KIAkJdTMyIFN0YW5kYnlNb2RlOjE7CS8qIDA6IGhpZ2ggd2hlbiBzdGFuZCBieSAxOiBsb3cgd2hlbiBzdGFuZGJ5ICovCiAJCXUzMiBTZWw6MTsJLyogMDpSRl9MRTAgYWN0aXZhdGUgIDE6UkZfTEUxIGFjdGl2YXRlICovCiAJCXUzMiBCdXN5OjE7CS8qIDA6IGlkbGUgMTogOGJ1c3kgKi8KQEAgLTQ2OSw3ICs0NzAsNyBAQAogI2RlZmluZSBSRl9DU1JfQ0ZHMQkJCTB4MTAyNAogdHlwZWRlZiB1bmlvbiBfUkZfQ1NSX0NGRzFfU1RSVUMgewogCXN0cnVjdCB7Ci0JCXUzMiBSZWdJZEFuZENvbnRlbnQ6MjQ7CS8qIFJlZ2lzdGVyICAgICB2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQICovCisJCXUzMiBSZWdJZEFuZENvbnRlbnQ6MjQ7CS8qIFJlZ2lzdGVyIHZhbHVlIHRvIHByb2dyYW0gaW50byBCQlAgKi8KIAkJdTMyIFJGR2FwOjU7CS8qIEdhcCBiZXR3ZWVuIEJCX0NPTlRST0xfUkYgYW5kIFJGX0xFLiAwOiAzIHN5c3RlbSBjbG9jayBjeWNsZSAoMzcuNXVzZWMpIDE6IDUgc3lzdGVtIGNsb2NrIGN5Y2xlICg2Mi41dXNlYykgKi8KIAkJdTMyIHJzdjo3OwkvKiAwOiBpZGxlIDE6IDhidXN5ICovCiAJfSBmaWVsZDsKQEAgLTQ3OCw3ICs0NzksNyBAQAogI2RlZmluZSBSRl9DU1JfQ0ZHMgkJCTB4MTAyOAkvKiAqLwogdHlwZWRlZiB1bmlvbiBfUkZfQ1NSX0NGRzJfU1RSVUMgewogCXN0cnVjdCB7Ci0JCXUzMiBSZWdJZEFuZENvbnRlbnQ6MjQ7CS8qIFJlZ2lzdGVyICAgICB2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQICovCisJCXUzMiBSZWdJZEFuZENvbnRlbnQ6MjQ7CS8qIFJlZ2lzdGVyIHZhbHVlIHRvIHByb2dyYW0gaW50byBCQlAgKi8KIAkJdTMyIHJzdjo4OwkvKiAwOiBpZGxlIDE6IDhidXN5ICovCiAJfSBmaWVsZDsKIAl1MzIgd29yZDsKQEAgLTQ5MCw3ICs0OTEsNyBAQAogCQl1MzIgT2ZmUGVyaW9kOjg7CS8qIGJsaW5raW5nIG9mZiBwZXJpb2QgdW5pdCAxbXMgKi8KIAkJdTMyIFNsb3dCbGlua1BlcmlvZDo2OwkvKiBzbG93IGJsaW5raW5nIHBlcmlvZC4gdW5pdDoxbXMgKi8KIAkJdTMyIHJzdjoyOwotCQl1MzIgUkxlZE1vZGU6MjsJLyogcmVkIExlZCBNb2RlICAgIDA6IG9mZjE6IGJsaW5raW5nIHVwb24gVFgyOiBwZXJpb2RpYyBzbG93IGJsaW5raW5nMzogYWx3YXlzIG9uICovCisJCXUzMiBSTGVkTW9kZToyOwkvKiByZWQgTGVkIE1vZGUgMDogb2ZmMTogYmxpbmtpbmcgdXBvbiBUWDI6IHBlcmlvZGljIHNsb3cgYmxpbmtpbmczOiBhbHdheXMgb24gKi8KIAkJdTMyIEdMZWRNb2RlOjI7CS8qIGdyZWVuIExlZCBNb2RlICovCiAJCXUzMiBZTGVkTW9kZToyOwkvKiB5ZWxsb3cgTGVkIE1vZGUgKi8KIAkJdTMyIExlZFBvbGFyOjE7CS8qIExlZCBQb2xhcml0eS4gIDA6IGFjdGl2ZSBsb3cxOiBhY3RpdmUgaGlnaCAqLwpAQCAtNjIxLDkgKzYyMiw5IEBACiAjZGVmaW5lIFRYX1JUWV9DRkcJMHgxMzRjCiB0eXBlZGVmIHVuaW9uIFBBQ0tFRCBfVFhfUlRZX0NGR19TVFJVQyB7CiAJc3RydWN0IHsKLQkJdTMyIFNob3J0UnR5TGltaXQ6ODsJLyogIHNob3J0IHJldHJ5IGxpbWl0ICovCi0JCXUzMiBMb25nUnR5TGltaXQ6ODsJLypsb25nIHJldHJ5IGxpbWl0ICovCi0JCXUzMiBMb25nUnR5VGhyZToxMjsJLyogTG9uZyByZXRyeSB0aHJlc2hvb2xkICovCisJCXUzMiBTaG9ydFJ0eUxpbWl0Ojg7CS8qIHNob3J0IHJldHJ5IGxpbWl0ICovCisJCXUzMiBMb25nUnR5TGltaXQ6ODsJLyogbG9uZyByZXRyeSBsaW1pdCAqLworCQl1MzIgTG9uZ1J0eVRocmU6MTI7CS8qIExvbmcgcmV0cnkgdGhyZXNob2xkICovCiAJCXUzMiBOb25BZ2dSdHlNb2RlOjE7CS8qIE5vbi1BZ2dyZWdhdGUgTVBEVSByZXRyeSBtb2RlLiAgMDpleHBpcmVkIGJ5IHJldHJ5IGxpbWl0LCAxOiBleHBpcmVkIGJ5IG1wZHUgbGlmZSB0aW1lciAqLwogCQl1MzIgQWdnUnR5TW9kZToxOwkvKiBBZ2dyZWdhdGUgTVBEVSByZXRyeSBtb2RlLiAgMDpleHBpcmVkIGJ5IHJldHJ5IGxpbWl0LCAxOiBleHBpcmVkIGJ5IG1wZHUgbGlmZSB0aW1lciAqLwogCQl1MzIgVHhhdXRvRkJFbmFibGU6MTsJLyogVHggcmV0cnkgUEhZIHJhdGUgYXV0byBmYWxsYmFjayBlbmFibGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcC9ydG1wX3BoeS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL3J0bXBfcGh5LmgKaW5kZXggOWY5MjRlYS4uOTg0NTRkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL3J0bXBfcGh5LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL3J0bXBfcGh5LmgKQEAgLTI0Nyw3ICsyNDcsNyBAQAogCQkJfQkJCQkJCVwKIAkJfQkJCQkJCQlcCiAJCWlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSB7CQkJXAotCQkJREJHUFJJTlRfRVJSKCgiQkJQKHZpYU1DVT0lZCkgcmVhZCBSJWQgZmFpbFxuIiwgKF9iVmlhTUNVKSwgX2JicElEKSk7CVwKKwkJCURCR1BSSU5UX0VSUigiQkJQKHZpYU1DVT0lZCkgcmVhZCBSJWQgZmFpbFxuIiwgKF9iVmlhTUNVKSwgX2JicElEKTsJXAogCQkJKihfcFYpID0gKF9wQWQpLT5CYnBXcml0ZUxhdGNoW19iYnBJRF07ICAgICAgICAgICAgICAgXAogCQkJaWYgKChfYlZpYU1DVSkgPT0gVFJVRSkgewkJCVwKIAkJCQlSVE1QX0lPX1JFQUQzMihfcEFkLCBfcmVnSUQsICZCYnBDc3Iud29yZCk7CQkJCVwKQEAgLTMzNiwxMSArMzM2LDExIEBACiAJCQl9CQkJCQkJXAogCQl9CQkJCQkJCVwKIAl9IGVsc2UgewkJCQkJCQlcCi0JCURCR1BSSU5UX0VSUigoIiAsIGJydDMweHhCYW5NY3VDbWQgPSAlZCwgUmVhZCBCQlAgJWQgXG4iLCAoX0EpLT5icnQzMHh4QmFuTWN1Q21kLCAoX0kpKSk7CVwKKwkJREJHUFJJTlRfRVJSKCIgLCBicnQzMHh4QmFuTWN1Q21kID0gJWQsIFJlYWQgQkJQICVkIFxuIiwgKF9BKS0+YnJ0MzB4eEJhbk1jdUNtZCwgKF9JKSk7CVwKIAkJKihfcFYpID0gKF9BKS0+QmJwV3JpdGVMYXRjaFtfSV07CQkJXAogCX0JCQkJCQkJCVwKIAlpZiAoKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpIHx8ICgoX0EpLT5iUENJY2xrT2ZmID09IFRSVUUpKSB7IFwKLQkJREJHUFJJTlRfRVJSKCgiQkJQIHJlYWQgUiVkPTB4JXggZmFpbFxuIiwgX0ksIEJicENzci53b3JkKSk7IFwKKwkJREJHUFJJTlRfRVJSKCJCQlAgcmVhZCBSJWQ9MHgleCBmYWlsXG4iLCBfSSwgQmJwQ3NyLndvcmQpOyBcCiAJCSooX3BWKSA9IChfQSktPkJicFdyaXRlTGF0Y2hbX0ldOwkJCVwKIAl9CQkJCQkJCQlcCiB9CkBAIC0zNzgsNyArMzc4LDcgQEAKIAkJCWJyZWFrOwkJCQkJCVwKIAkJfQkJCQkJCQlcCiAJCWlmIChfYnVzeUNudCA9PSBNQVhfQlVTWV9DT1VOVCkgewkJCVwKLQkJCURCR1BSSU5UX0VSUigoIkJCUCB3cml0ZSBSJWQgZmFpbFxuIiwgX2JicElEKSk7CVwKKwkJCURCR1BSSU5UX0VSUigiQkJQIHdyaXRlIFIlZCBmYWlsXG4iLCBfYmJwSUQpOwlcCiAJCQlpZiAoKF9iVmlhTUNVKSA9PSBUUlVFKSB7CQkJXAogCQkJCVJUTVBfSU9fUkVBRDMyKF9wQWQsIEgyTV9CQlBfQUdFTlQsICZCYnBDc3Iud29yZCk7CVwKIAkJCQlCYnBDc3IuZmllbGQuQnVzeSA9IDA7CQkJXApAQCAtNDU5LDE1ICs0NTksMTUgQEAKIAkJCQlicmVhazsJCQkJCQkJCQkJCQkJCQlcCiAJCQl9CQkJCQkJCQkJCQkJCQkJCQlcCiAJCX0gZWxzZSB7CQkJCQkJXAotCQkJREJHUFJJTlRfRVJSKCgiICBicnQzMHh4QmFuTWN1Q21kID0gJWQuIFdyaXRlIEJCUCAlZCBcbiIsICAoX0EpLT5icnQzMHh4QmFuTWN1Q21kLCAoX0kpKSk7CVwKKwkJCURCR1BSSU5UX0VSUigiICBicnQzMHh4QmFuTWN1Q21kID0gJWQuIFdyaXRlIEJCUCAlZCBcbiIsICAoX0EpLT5icnQzMHh4QmFuTWN1Q21kLCAoX0kpKTsJXAogCQl9CQkJCQkJCQkJCQkJCQkJCQlcCiAJCWlmICgoQnVzeUNudCA9PSBNQVhfQlVTWV9DT1VOVCkgfHwgKChfQSktPmJQQ0ljbGtPZmYgPT0gVFJVRSkpIHsgXAogCQkJaWYgKEJ1c3lDbnQgPT0gTUFYX0JVU1lfQ09VTlQpCQkJCVwKIAkJCQkoX0EpLT5BY2Nlc3NCQlBGYWlsQ291bnQrKzsJCQkJCVwKLQkJCURCR1BSSU5UX0VSUigoIkJCUCB3cml0ZSBSJWQ9MHgleCBmYWlsLiBCdXN5Q250PSAlZC5iUENJY2xrT2ZmID0gJWQuIFxuIiwgX0ksIEJicENzci53b3JkLCBCdXN5Q250LCAoX0EpLT5iUENJY2xrT2ZmKSk7CVwKKwkJCURCR1BSSU5UX0VSUigiQkJQIHdyaXRlIFIlZD0weCV4IGZhaWwuIEJ1c3lDbnQ9ICVkLmJQQ0ljbGtPZmYgPSAlZC4gXG4iLCBfSSwgQmJwQ3NyLndvcmQsIEJ1c3lDbnQsIChfQSktPmJQQ0ljbGtPZmYpOwlcCiAJCX0JCQkJCQkJCQkJCQkJCQkJCVwKIAl9IGVsc2UgewkJCQkJCQlcCi0JCURCR1BSSU5UX0VSUigoIioqKioqKiBCQlBfV3JpdGVfTGF0Y2ggQnVmZmVyIGV4Y2VlZHMgbWF4IGJvdW5kcnkgKioqKioqIFxuIikpOwlcCisJCURCR1BSSU5UX0VSUigiKioqKioqIEJCUF9Xcml0ZV9MYXRjaCBCdWZmZXIgZXhjZWVkcyBtYXggYm91bmRyeSAqKioqKiogXG4iKTsJXAogCX0JCQkJCQkJCQkJCQkJCQkJCQlcCiB9CiAjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXBzL3J0MzA5MC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwcy9ydDMwOTAuYwppbmRleCBjMjkzM2M2Li4zMzQ3MjBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXBzL3J0MzA5MC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcHMvcnQzMDkwLmMKQEAgLTI4LDEwICsyOCwxMSBAQAogCXJ0MzA5MC5jCiAKIAlBYnN0cmFjdDoKLQlTcGVjaWZpYyBmdW5jaXRvbnMgYW5kIHZhcmlhYmxlcyBmb3IgUlQzMDcwCisJU3BlY2lmaWMgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgZm9yIFJUMzA3MAogCiAJUmV2aXNpb24gSGlzdG9yeToKLQlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKwlXaG8gICAgICAgICAJCVdoZW4gICAgICAgICAgICBXaGF0CisJSnVzdGluIFAuIE1hdHRvY2sJMTEvMDcvMjAxMAlGaXggYSB0eXBvCiAJLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwogCkBAIC01MSw3ICs1Miw4IEBACiAJaWYgKElTX1JUMzA5MChwQWQpKSB7CiAJCS8qIEluaXQgUkYgY2FsaWJyYXRpb24gKi8KIAkJLyogRHJpdmVyIHNob3VsZCB0b2dnbGUgUkYgUjMwIGJpdDcgYmVmb3JlIGluaXQgUkYgcmVnaXN0ZXJzICovCi0JCXUzMiBSZlJlZyA9IDAsIGRhdGE7CisJCXU4IFJmUmVnOworCQl1MzIgZGF0YTsKIAogCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IzMCwgKHU4ICopJlJmUmVnKTsKIAkJUmZSZWcgfD0gMHg4MDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcHMvcnQzMHh4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXBzL3J0MzB4eC5jCmluZGV4IDQzNjdhMTkuLjM1NGRlYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcHMvcnQzMHh4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwcy9ydDMweHguYwpAQCAtMjgsMTAgKzI4LDExIEBACiAJcnQzMHh4LmMKIAogCUFic3RyYWN0OgotCVNwZWNpZmljIGZ1bmNpdG9ucyBhbmQgdmFyaWFibGVzIGZvciBSVDMweHguCisJU3BlY2lmaWMgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgZm9yIFJUMzB4eC4KIAogCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisJV2hvICAgICAgICAgCQlXaGVuICAgICAgICAgICAgV2hhdAorCUp1c3RpbiBQLiBNYXR0b2NrCTExLzA3LzIwMTAJRml4IHNvbWUgdHlwb3MKIAktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCiAKQEAgLTUzLDcgKzU0LDcgQEAKIAksCiAJe1JGX1IwNiwgMHgwMn0KIAksCi0Je1JGX1IwNywgMHg3MH0KKwl7UkZfUjA3LCAweDYwfQogCSwKIAl7UkZfUjA5LCAweDBGfQogCSwKQEAgLTg5LDcgKzkwLDcgQEAKIAogdTggTlVNX1JGX1JFR19QQVJNUyA9IChzaXplb2YoUlQzMHh4X1JGUmVnVGFibGUpIC8gc2l6ZW9mKHN0cnVjdCBydF9yZWdfcGFpcikpOwogCi0vKiBBbnRlbm5hIGRpdmVzaXR5IHVzZSBHUElPMyBhbmQgRUVTSyBwaW4gZm9yIGNvbnRyb2wgKi8KKy8qIEFudGVubmEgZGl2ZXJzaXR5IHVzZSBHUElPMyBhbmQgRUVTSyBwaW4gZm9yIGNvbnRyb2wgKi8KIC8qIEFudGVubmEgYW5kIEVFUFJPTSBhY2Nlc3MgYXJlIGJvdGggdXNpbmcgRUVTSyBwaW4sICovCiAvKiBUaGVyZWZvciB3ZSBzaG91bGQgYXZvaWQgYWNjZXNzaW5nIEVFU0sgYXQgdGhlIHNhbWUgdGltZSAqLwogLyogVGhlbiByZXN0b3JlIGFudGVubmEgYWZ0ZXIgRUVQUk9NIGFjY2VzcyAqLwpAQCAtMjQzLDcgKzI0NCw3IEBACiAJCQkJYnJlYWs7CiAJCQl9CiAKLQkJCS8qIHByZXZlbnQgaW5maW5pdGUgbG9vcCBjYXVzZSBkcml2ZXIgaGFuZy4gKi8KKwkJCS8qIHByZXZlbnQgaW5maW5pdGUgbG9vcDsgY2F1c2VzIGRyaXZlciBoYW5nLiAqLwogCQkJaWYgKGxvb3BjbnQrKyA+IDEwMCkgewogCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAogCQkJCQkgKCJSVE1QRmlsdGVyQ2FsaWJyYXRpb24gLSBjYW4ndCBmaW5kIGEgdmFsaWQgdmFsdWUsIGxvb3BjbnQ9JWQgc3RvcCBjYWxpYnJhdGluZyIsCkBAIC00NDEsNyArNDQyLDcgQEAKIAogCQkvKiBWQ09fSUMsIFJGIFI3IHJlZ2lzdGVyIEJpdCA0ICYgQml0IDUgdG8gMSAqLwogCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwNywgJlJGVmFsdWUpOwotCQlSRlZhbHVlIHw9IDB4MzA7CisJCVJGVmFsdWUgfD0gMHgyMDsKIAkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjA3LCBSRlZhbHVlKTsKIAogCQkvKiBJZG9oLCBSRiBSOSByZWdpc3RlciBCaXQgMSwgQml0IDIgJiBCaXQgMyB0byAxICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9iYV9hY3Rpb24uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2JhX2FjdGlvbi5jCmluZGV4IDhlZWY4MmQuLmIwNDZjMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2JhX2FjdGlvbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2JhX2FjdGlvbi5jCkBAIC03OTksOCArNzk5LDggQEAKIAkJCS8qIGZvcmNlIHNlbmQgc3BlY2lmaWVkIFRJRCBEZWxCQSAqLwogCQkJc3RydWN0IHJ0X21sbWVfZGVsYmFfcmVxIERlbGJhUmVxOwogCQkJc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSA9Ci0JCQkgICAgKHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtKSwKLQkJCQkJCQlNRU1fQUxMT0NfRkxBRyk7CisJCQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSksCisJCQkJCU1FTV9BTExPQ19GTEFHKTsKIAkJCWlmIChFbGVtICE9IE5VTEwpIHsKIAkJCQlOZGlzWmVyb01lbW9yeSgmRGVsYmFSZXEsIHNpemVvZihEZWxiYVJlcSkpOwogCQkJCU5kaXNaZXJvTWVtb3J5KEVsZW0sIHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtKSk7CkBAIC04MzksOCArODM5LDggQEAKIAkgICAgJiYgKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfRG9uZSkpIHsKIAkJc3RydWN0IHJ0X21sbWVfZGVsYmFfcmVxIERlbGJhUmVxOwogCQlzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtID0KLQkJICAgIChzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICopa21hbGxvYyhzaXplb2Yoc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSksCi0JCQkJCQlNRU1fQUxMT0NfRkxBRyk7CisJCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtKSwKKwkJCQlNRU1fQUxMT0NfRkxBRyk7CiAJCWlmIChFbGVtICE9IE5VTEwpIHsKIAkJCU5kaXNaZXJvTWVtb3J5KCZEZWxiYVJlcSwgc2l6ZW9mKERlbGJhUmVxKSk7CiAJCQlOZGlzWmVyb01lbW9yeShFbGVtLCBzaXplb2Yoc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSkpOwpAQCAtOTA4LDggKzkwOCw4IEBACiAJCS8qICovCiAJCWlmIChiUGFzc2l2ZSA9PSBGQUxTRSkgewogCQkJc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSA9Ci0JCQkgICAgKHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtKSwKLQkJCQkJCQlNRU1fQUxMT0NfRkxBRyk7CisJCQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSksCisJCQkJCU1FTV9BTExPQ19GTEFHKTsKIAkJCWlmIChFbGVtICE9IE5VTEwpIHsKIAkJCQlOZGlzWmVyb01lbW9yeSgmRGVsYmFSZXEsIHNpemVvZihEZWxiYVJlcSkpOwogCQkJCU5kaXNaZXJvTWVtb3J5KEVsZW0sIHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtKSk7CkBAIC0xMjcwLDEzICsxMjcwLDEzIEBACiAKIAkvKiBGaXJzdCBjaGVjayB0aGUgc2l6ZSwgaXQgTVVTVCBub3QgZXhjZWVkIHRoZSBtbG1lIHF1ZXVlIHNpemUgKi8KIAlpZiAoTXNnTGVuID4gTUdNVF9ETUFfQlVGRkVSX1NJWkUpIHsKLQkJREJHUFJJTlRfRVJSKCgiQ250bEVucXVldWVGb3JSZWN2OiBmcmFtZSB0b28gbGFyZ2UsIHNpemUgPSAlbGQgXG4iLCBNc2dMZW4pKTsKKwkJREJHUFJJTlRfRVJSKCJDbnRsRW5xdWV1ZUZvclJlY3Y6IGZyYW1lIHRvbyBsYXJnZSwgc2l6ZSA9ICVsZCBcbiIsIE1zZ0xlbik7CiAJCXJldHVybiBGQUxTRTsKIAl9IGVsc2UgaWYgKE1zZ0xlbiAhPSBzaXplb2Yoc3RydWN0IHJ0X2ZyYW1lX2JhX3JlcSkpIHsKLQkJREJHUFJJTlRfRVJSKCgiQ250bEVucXVldWVGb3JSZWN2OiBCbG9ja0FjayBSZXF1ZXN0IGZyYW1lIGxlbmd0aCBzaXplID0gJWxkIGluY29ycmVjdFxuIiwgTXNnTGVuKSk7CisJCURCR1BSSU5UX0VSUigiQ250bEVucXVldWVGb3JSZWN2OiBCbG9ja0FjayBSZXF1ZXN0IGZyYW1lIGxlbmd0aCBzaXplID0gJWxkIGluY29ycmVjdFxuIiwgTXNnTGVuKTsKIAkJcmV0dXJuIEZBTFNFOwogCX0gZWxzZSBpZiAoTXNnTGVuICE9IHNpemVvZihzdHJ1Y3QgcnRfZnJhbWVfYmFfcmVxKSkgewotCQlEQkdQUklOVF9FUlIoKCJDbnRsRW5xdWV1ZUZvclJlY3Y6IEJsb2NrQWNrIFJlcXVlc3QgZnJhbWUgbGVuZ3RoIHNpemUgPSAlbGQgaW5jb3JyZWN0XG4iLCBNc2dMZW4pKTsKKwkJREJHUFJJTlRfRVJSKCJDbnRsRW5xdWV1ZUZvclJlY3Y6IEJsb2NrQWNrIFJlcXVlc3QgZnJhbWUgbGVuZ3RoIHNpemUgPSAlbGQgaW5jb3JyZWN0XG4iLCBNc2dMZW4pOwogCQlyZXR1cm4gRkFMU0U7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fZGF0YS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2RhdGEuYwppbmRleCA5M2E1MzQ3Li4yMjA0YzJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fZGF0YS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9kYXRhLmMKQEAgLTEzNjYsNyArMTM2Niw3IEBACiAJLyogUjY2IHNob3VsZCBub3QgYmUgMCAqLwogCWlmIChwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUgPT0gMCkgewogCQlwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUgPSAweDM4OwotCQlEQkdQUklOVF9FUlIoKCJSVE1QUmVzdW1lTXNkdVRyYW5zbWlzc2lvbiwgUjY2Q3VycmVudFZhbHVlPTAuLi5cbiIpKTsKKwkJREJHUFJJTlRfRVJSKCJSVE1QUmVzdW1lTXNkdVRyYW5zbWlzc2lvbiwgUjY2Q3VycmVudFZhbHVlPTAuLi5cbiIpOwogCX0KIAogCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2RhdGFfcGNpLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fZGF0YV9wY2kuYwppbmRleCA0M2Q3M2EwLi43YWY1OWZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fZGF0YV9wY2kuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fZGF0YV9wY2kuYwpAQCAtMTM3LDcgKzEzNyw3IEBACiAKIAlwVHhELT5TRFB0cjAgPSBCdWZCYXNlUGFMb3c7CiAJcFR4RC0+U0RMZW4wID0gVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hlYWRlckxlbjsJLyogaW5jbHVkZSBwYWRkaW5nICovCi0JcFR4RC0+U0RQdHIxID0gUENJX01BUF9TSU5HTEUocEFkLCBwVHhCbGssIDAsIDEsIFBDSV9ETUFfVE9ERVZJQ0UpOzsKKwlwVHhELT5TRFB0cjEgPSBQQ0lfTUFQX1NJTkdMRShwQWQsIHBUeEJsaywgMCwgMSwgUENJX0RNQV9UT0RFVklDRSk7CiAJcFR4RC0+U0RMZW4xID0gcFR4QmxrLT5TcmNCdWZMZW47CiAJcFR4RC0+TGFzdFNlYzAgPSAwOwogCXBUeEQtPkxhc3RTZWMxID0gKGJJc0xhc3QpID8gMSA6IDA7CkBAIC0yMTUsNyArMjE1LDcgQEAKIAogCXBUeEQtPlNEUHRyMCA9IEJ1ZkJhc2VQYUxvdzsKIAlwVHhELT5TRExlbjAgPSBmaXJzdERNQUxlbjsJLyogaW5jbHVkZSBwYWRkaW5nICovCi0JcFR4RC0+U0RQdHIxID0gUENJX01BUF9TSU5HTEUocEFkLCBwVHhCbGssIDAsIDEsIFBDSV9ETUFfVE9ERVZJQ0UpOzsKKwlwVHhELT5TRFB0cjEgPSBQQ0lfTUFQX1NJTkdMRShwQWQsIHBUeEJsaywgMCwgMSwgUENJX0RNQV9UT0RFVklDRSk7CiAJcFR4RC0+U0RMZW4xID0gcFR4QmxrLT5TcmNCdWZMZW47CiAJcFR4RC0+TGFzdFNlYzAgPSAwOwogCXBUeEQtPkxhc3RTZWMxID0gKGJJc0xhc3QpID8gMSA6IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fbWFjX3BjaS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX21hY19wY2kuYwppbmRleCBlMjZiYTQ5Li44NTBmMGZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fbWFjX3BjaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9tYWNfcGNpLmMKQEAgLTg5LDcgKzg5LDcgQEAKIAogCQkJaWYgKHBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jVmEgPT0gTlVMTCkgewogCQkJCUVycm9yVmFsdWUgPSBFUlJMT0dfT1VUX09GX1NIQVJFRF9NRU1PUlk7Ci0JCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYmlnIGJ1ZmZlclxuIikpOworCQkJCURCR1BSSU5UX0VSUigiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYmlnIGJ1ZmZlclxuIik7CiAJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtMTIxLDcgKzEyMSw3IEBACiAKIAkJCWlmIChwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1ZhID09IE5VTEwpIHsKIAkJCQlFcnJvclZhbHVlID0gRVJSTE9HX09VVF9PRl9TSEFSRURfTUVNT1JZOwotCQkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBhIGJpZyBidWZmZXJcbiIpKTsKKwkJCQlEQkdQUklOVF9FUlIoIkZhaWxlZCB0byBhbGxvY2F0ZSBhIGJpZyBidWZmZXJcbiIpOwogCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTE5Nyw3ICsxOTcsNyBAQAogCiAJCWlmIChwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhID09IE5VTEwpIHsKIAkJCUVycm9yVmFsdWUgPSBFUlJMT0dfT1VUX09GX1NIQVJFRF9NRU1PUlk7Ci0JCQlEQkdQUklOVF9FUlIoKCJGYWlsZWQgdG8gYWxsb2NhdGUgYSBiaWcgYnVmZmVyXG4iKSk7CisJCQlEQkdQUklOVF9FUlIoIkZhaWxlZCB0byBhbGxvY2F0ZSBhIGJpZyBidWZmZXJcbiIpOwogCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOwogCQkJYnJlYWs7CiAJCX0KQEAgLTI1MSw3ICsyNTEsNyBAQAogCiAJCWlmIChwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYSA9PSBOVUxMKSB7CiAJCQlFcnJvclZhbHVlID0gRVJSTE9HX09VVF9PRl9TSEFSRURfTUVNT1JZOwotCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYmlnIGJ1ZmZlclxuIikpOworCQkJREJHUFJJTlRfRVJSKCJGYWlsZWQgdG8gYWxsb2NhdGUgYSBiaWcgYnVmZmVyXG4iKTsKIAkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKIAkJCWJyZWFrOwogCQl9CkBAIC0zMDQsNyArMzA0LDcgQEAKIAkJCS8qIEVycm9yIGhhbmRsaW5nICovCiAJCQlpZiAocERtYUJ1Zi0+QWxsb2NWYSA9PSBOVUxMKSB7CiAJCQkJRXJyb3JWYWx1ZSA9IEVSUkxPR19PVVRfT0ZfU0hBUkVEX01FTU9SWTsKLQkJCQlEQkdQUklOVF9FUlIoKCJGYWlsZWQgdG8gYWxsb2NhdGUgUnhSaW5nJ3MgMXN0IGJ1ZmZlclxuIikpOworCQkJCURCR1BSSU5UX0VSUigiRmFpbGVkIHRvIGFsbG9jYXRlIFJ4UmluZydzIDFzdCBidWZmZXJcbiIpOwogCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKIAkJCQlicmVhazsKIAkJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9tYWNfdXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fbWFjX3VzYi5jCmluZGV4IDcyNzMxY2IuLjY0YTY1YTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9tYWNfdXNiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX21hY191c2IuYwpAQCAtMjM2LDcgKzIzNiw3IEBACiAJCW9zX2FsbG9jX21lbShwQWQsICh1OCAqKikgKCZwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhKSwKIAkJCSAgICAgcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NTaXplKTsKIAkJaWYgKHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEgPT0gTlVMTCkgewotCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYmlnIGJ1ZmZlciBmb3IgTWdtdERlc2NSaW5nIVxuIikpOworCQkJREJHUFJJTlRfRVJSKCJGYWlsZWQgdG8gYWxsb2NhdGUgYSBiaWcgYnVmZmVyIGZvciBNZ210RGVzY1JpbmchXG4iKTsKIAkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKIAkJCWdvdG8gb3V0MTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3dwYS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3dwYS5jCmluZGV4IGUzN2I2NGIuLjAwNDBmNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV93cGEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fd3BhLmMKQEAgLTI3OTQsNyArMjc5NCw3IEBACiAKIAkvKiBDaGVjayBsZW5ndGggKi8KIAlpZiAoKGxlbiA8PSAwKSB8fCAocEVpZC0+TGVuICE9IGxlbikpIHsKLQkJREJHUFJJTlRfRVJSKCgiJXMgOiBUaGUgbGVuZ3RoIGlzIGludmFsaWRcbiIsIF9fZnVuY19fKSk7CisJCURCR1BSSU5UX0VSUigiJXMgOiBUaGUgbGVuZ3RoIGlzIGludmFsaWRcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCS8qIENoZWNrIFdQQSBvciBXUEEyICovCkBAIC0yODAzLDE0ICsyODAzLDEzIEBACiAJCXUxNiB1Y291bnQ7CiAKIAkJaWYgKGxlbiA8IHNpemVvZihzdHJ1Y3QgcnRfcnNuaWUpKSB7Ci0JCQlEQkdQUklOVF9FUlIoKCIlcyA6IFRoZSBsZW5ndGggaXMgdG9vIHNob3J0IGZvciBXUEFcbiIsCi0JCQkJICAgICAgX19mdW5jX18pKTsKKwkJCURCR1BSSU5UX0VSUigiJXMgOiBUaGUgbGVuZ3RoIGlzIHRvbyBzaG9ydCBmb3IgV1BBXG4iLCBfX2Z1bmNfXyk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCQkvKiBHZXQgdGhlIGNvdW50IG9mIHBhaXJ3aXNlIGNpcGhlciAqLwogCQl1Y291bnQgPSBjcHUybGUxNihwUnNuaWUtPnVjb3VudCk7CiAJCWlmICh1Y291bnQgPiAyKSB7Ci0JCQlEQkdQUklOVF9FUlIoKCIlcyA6IFRoZSBjb3VudCglZCkgb2YgcGFpcndpc2UgY2lwaGVyIGlzIGludmxhaWRcbiIsIF9fZnVuY19fLCB1Y291bnQpKTsKKwkJCURCR1BSSU5UX0VSUigiJXMgOiBUaGUgY291bnQoJWQpIG9mIHBhaXJ3aXNlIGNpcGhlciBpcyBpbnZsYWlkXG4iLCBfX2Z1bmNfXywgdWNvdW50KTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJCS8qIEdldCB0aGUgZ3JvdXAgY2lwaGVyICovCkBAIC0yODM2LDE0ICsyODM1LDEzIEBACiAJCWlzV1BBMiA9IFRSVUU7CiAKIAkJaWYgKGxlbiA8IHNpemVvZihzdHJ1Y3QgcnRfcnNuaWUyKSkgewotCQkJREJHUFJJTlRfRVJSKCgiJXMgOiBUaGUgbGVuZ3RoIGlzIHRvbyBzaG9ydCBmb3IgV1BBMlxuIiwKLQkJCQkgICAgICBfX2Z1bmNfXykpOworCQkJREJHUFJJTlRfRVJSKCIlcyA6IFRoZSBsZW5ndGggaXMgdG9vIHNob3J0IGZvciBXUEEyXG4iLCBfX2Z1bmNfXyk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCQkvKiBHZXQgdGhlIGNvdW50IG9mIHBhaXJ3aXNlIGNpcGhlciAqLwogCQl1Y291bnQgPSBjcHUybGUxNihwUnNuaWUtPnVjb3VudCk7CiAJCWlmICh1Y291bnQgPiAyKSB7Ci0JCQlEQkdQUklOVF9FUlIoKCIlcyA6IFRoZSBjb3VudCglZCkgb2YgcGFpcndpc2UgY2lwaGVyIGlzIGludmxhaWRcbiIsIF9fZnVuY19fLCB1Y291bnQpKTsKKwkJCURCR1BSSU5UX0VSUigiJXMgOiBUaGUgY291bnQoJWQpIG9mIHBhaXJ3aXNlIGNpcGhlciBpcyBpbnZsYWlkXG4iLCBfX2Z1bmNfXywgdWNvdW50KTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJCS8qIEdldCB0aGUgZ3JvdXAgY2lwaGVyICovCkBAIC0yODYzLDcgKzI4NjEsNyBAQAogCQlvZmZzZXQgPSBzaXplb2Yoc3RydWN0IHJ0X3JzbmllMikgKyAoNCAqICh1Y291bnQgLSAxKSk7CiAKIAl9IGVsc2UgewotCQlEQkdQUklOVF9FUlIoKCIlcyA6IFVua25vd24gSUUgKCVkKVxuIiwgX19mdW5jX18sIHBFaWQtPkVpZCkpOworCQlEQkdQUklOVF9FUlIoIiVzIDogVW5rbm93biBJRSAoJWQpXG4iLCBfX2Z1bmNfXywgcEVpZC0+RWlkKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC0yODcyLDggKzI4NzAsNyBAQAogCWxlbiAtPSBvZmZzZXQ7CiAKIAlpZiAobGVuIDwgc2l6ZW9mKHN0cnVjdCBydF9yc25pZV9hdXRoKSkgewotCQlEQkdQUklOVF9FUlIoKCIlcyA6IFRoZSBsZW5ndGggb2YgUlNOSUUgaXMgdG9vIHNob3J0XG4iLAotCQkJICAgICAgX19mdW5jX18pKTsKKwkJREJHUFJJTlRfRVJSKCIlcyA6IFRoZSBsZW5ndGggb2YgUlNOSUUgaXMgdG9vIHNob3J0XG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiBOVUxMOwogCX0KIAkvKiBwb2ludGVyIHRvIEFLTSBjb3VudCAqLwpAQCAtMjg4Miw4ICsyODc5LDcgQEAKIAkvKiBHZXQgdGhlIGNvdW50IG9mIHBhaXJ3aXNlIGNpcGhlciAqLwogCWFjb3VudCA9IGNwdTJsZTE2KHBBa20tPmFjb3VudCk7CiAJaWYgKGFjb3VudCA+IDIpIHsKLQkJREJHUFJJTlRfRVJSKCgiJXMgOiBUaGUgY291bnQoJWQpIG9mIEFLTSBpcyBpbnZsYWlkXG4iLAotCQkJICAgICAgX19mdW5jX18sIGFjb3VudCkpOworCQlEQkdQUklOVF9FUlIoIiVzIDogVGhlIGNvdW50KCVkKSBvZiBBS00gaXMgaW52bGFpZFxuIiwgX19mdW5jX18sIGFjb3VudCk7CiAJCXJldHVybiBOVUxMOwogCX0KIAkvKiBHZXQgdGhlIEFLTSBzdWl0ZSAqLwpAQCAtMjkxMCw3ICsyOTA2LDcgQEAKIAkJCXJldHVybiBwQnVmOwogCQl9CiAJfSBlbHNlIHsKLQkJREJHUFJJTlRfRVJSKCgiJXMgOiBpdCBjYW4ndCBnZXQgYW55IG1vcmUgaW5mb3JtYXRpb24gYmV5b25kIEFLTSBcbiIsIF9fZnVuY19fKSk7CisJCURCR1BSSU5UX0VSUigiJXMgOiBpdCBjYW4ndCBnZXQgYW55IG1vcmUgaW5mb3JtYXRpb24gYmV5b25kIEFLTSBcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9lZV9lZnVzZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vZWVfZWZ1c2UuYwppbmRleCAwMzQxMmY1Li5mZWQwYmE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9lZV9lZnVzZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2VlX2VmdXNlLmMKQEAgLTI2NCw3ICsyNjQsNyBAQAogCQlpZiAoaSA9PSBFRlVTRV9VU0FHRV9NQVBfRU5EKQogCQkJZWZ1c2VmcmVlbnVtID0gMDsKIAl9Ci0JcHJpbnRrKCJlZnVzZUZyZWVOdW1iZXIgaXMgJWRcbiIsIGVmdXNlZnJlZW51bSk7CisJcHJpbnRrKEtFUk5fREVCVUcgImVmdXNlRnJlZU51bWJlciBpcyAlZFxuIiwgZWZ1c2VmcmVlbnVtKTsKIAlyZXR1cm4gVFJVRTsKIH0KIApAQCAtMjc0LDE2ICsyNzQsMjMgQEAKIAlpbnQgaSA9IDA7CiAJaWYgKCFwQWQtPmJVc2VFZnVzZSkKIAkJcmV0dXJuIEZBTFNFOworCisJcHJpbnRrKEtFUk5fREVCVUcgIkJsb2NrIDA6ICIpOworCiAJZm9yIChpID0gMDsgaSA8IEVGVVNFX1VTQUdFX01BUF9FTkQgLyAyOyBpKyspIHsKIAkJSW5CdWZbMF0gPSAyICogaTsKIAkJSW5CdWZbMV0gPSAyOwogCQlJbkJ1ZlsyXSA9IDB4MDsKIAogCQllRnVzZVJlYWRQaHlzaWNhbChwQWQsICZJbkJ1ZlswXSwgNCwgJkluQnVmWzJdLCAyKTsKLQkJaWYgKGkgJSA0ID09IDApCi0JCQlwcmludGsoIlxuQmxvY2sgJXg6IiwgaSAvIDgpOwotCQlwcmludGsoIiUwNHggIiwgSW5CdWZbMl0pOworCQlpZiAoaSAmJiBpICUgNCA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9DT05UICJcbiIpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgIkJsb2NrICV4OiIsIGkgLyA4KTsKKwkJfQorCQlwcmludGsoS0VSTl9DT05UICIlMDR4ICIsIEluQnVmWzJdKTsKIAl9CisJcHJpbnRrKEtFUk5fQ09OVCAiXG4iKTsKKwogCXJldHVybiBUUlVFOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9tbG1lLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9tbG1lLmMKaW5kZXggNzMwMGM2ZS4uZDljM2ZkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vbWxtZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL21sbWUuYwpAQCAtNTUwLDcgKzU1MCw3IEBACiAJCQlFbGVtLT5Nc2dMZW4gPSAwOwogCiAJCX0gZWxzZSB7Ci0JCQlEQkdQUklOVF9FUlIoKCJNbG1lSGFuZGxlcjogTWxtZVF1ZXVlIGVtcHR5XG4iKSk7CisJCQlEQkdQUklOVF9FUlIoIk1sbWVIYW5kbGVyOiBNbG1lUXVldWUgZW1wdHlcbiIpOwogCQl9CiAJfQogCkBAIC00Njk4LDggKzQ2OTgsNyBAQAogCiAJLyogRmlyc3QgY2hlY2sgdGhlIHNpemUsIGl0IE1VU1Qgbm90IGV4Y2VlZCB0aGUgbWxtZSBxdWV1ZSBzaXplICovCiAJaWYgKE1zZ0xlbiA+IE1HTVRfRE1BX0JVRkZFUl9TSVpFKSB7Ci0JCURCR1BSSU5UX0VSUigoIk1sbWVFbnF1ZXVlOiBtc2cgdG9vIGxhcmdlLCBzaXplID0gJWxkIFxuIiwKLQkJCSAgICAgIE1zZ0xlbikpOworCQlEQkdQUklOVF9FUlIoIk1sbWVFbnF1ZXVlOiBtc2cgdG9vIGxhcmdlLCBzaXplID0gJWxkIFxuIiwgTXNnTGVuKTsKIAkJcmV0dXJuIEZBTFNFOwogCX0KIApAQCAtNDc2MiwxMiArNDc2MSwxMiBAQAogCWlmIChSVE1QX1RFU1RfRkxBRwogCSAgICAocEFkLAogCSAgICAgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkgewotCQlEQkdQUklOVF9FUlIoKCJNbG1lRW5xdWV1ZUZvclJlY3Y6IGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTU1xuIikpOworCQlEQkdQUklOVF9FUlIoIk1sbWVFbnF1ZXVlRm9yUmVjdjogZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTXG4iKTsKIAkJcmV0dXJuIEZBTFNFOwogCX0KIAkvKiBGaXJzdCBjaGVjayB0aGUgc2l6ZSwgaXQgTVVTVCBub3QgZXhjZWVkIHRoZSBtbG1lIHF1ZXVlIHNpemUgKi8KIAlpZiAoTXNnTGVuID4gTUdNVF9ETUFfQlVGRkVSX1NJWkUpIHsKLQkJREJHUFJJTlRfRVJSKCgiTWxtZUVucXVldWVGb3JSZWN2OiBmcmFtZSB0b28gbGFyZ2UsIHNpemUgPSAlbGQgXG4iLCBNc2dMZW4pKTsKKwkJREJHUFJJTlRfRVJSKCJNbG1lRW5xdWV1ZUZvclJlY3Y6IGZyYW1lIHRvbyBsYXJnZSwgc2l6ZSA9ICVsZCBcbiIsIE1zZ0xlbik7CiAJCXJldHVybiBGQUxTRTsKIAl9CiAKQEAgLTQ3NzcsNyArNDc3Niw3IEBACiAKIAl7CiAJCWlmICghTXNnVHlwZVN1YnN0KHBBZCwgcEZyYW1lLCAmTWFjaGluZSwgJk1zZ1R5cGUpKSB7Ci0JCQlEQkdQUklOVF9FUlIoKCJNbG1lRW5xdWV1ZUZvclJlY3Y6IHVuLXJlY29uZ25pemVkIG1nbXQtPnN1YnR5cGU9JWRcbiIsIHBGcmFtZS0+SGRyLkZDLlN1YlR5cGUpKTsKKwkJCURCR1BSSU5UX0VSUigiTWxtZUVucXVldWVGb3JSZWN2OiB1bi1yZWNvbmduaXplZCBtZ210LT5zdWJ0eXBlPSVkXG4iLCBwRnJhbWUtPkhkci5GQy5TdWJUeXBlKTsKIAkJCXJldHVybiBGQUxTRTsKIAkJfQogCX0KQEAgLTQ4NjcsNyArNDg2Niw3IEBACiAJCQlFbGVtLT5Nc2dMZW4gPSAwOwogCiAJCX0gZWxzZSB7Ci0JCQlEQkdQUklOVF9FUlIoKCJNbG1lUmVzdGFydFN0YXRlTWFjaGluZTogTWxtZVF1ZXVlIGVtcHR5XG4iKSk7CisJCQlEQkdQUklOVF9FUlIoIk1sbWVSZXN0YXJ0U3RhdGVNYWNoaW5lOiBNbG1lUXVldWUgZW1wdHlcbiIpOwogCQl9CiAJfQogI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRfcmYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0X3JmLmMKaW5kZXggNTE5MTIxZC4uMjg5NTQ0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRfcmYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydF9yZi5jCkBAIC0xMzEsOCArMTMxLDcgQEAKIAkJfQogCX0KIAlpZiAocmZjc3IuZmllbGQuUkZfQ1NSX0tJQ0sgPT0gQlVTWSkgewotCQlEQkdQUklOVF9FUlIoKCJSRiByZWFkIFIlZD0weCV4IGZhaWwsIGlbJWRdLCBrWyVkXVxuIiwgcmVnSUQsCi0JCQkgICAgICByZmNzci53b3JkLCBpLCBrKSk7CisJCURCR1BSSU5UX0VSUigiUkYgcmVhZCBSJWQ9MHgleCBmYWlsLCBpWyVkXSwga1slZF1cbiIsIHJlZ0lELCByZmNzci53b3JkLCBpLCBrKTsKIAkJcmV0dXJuIFNUQVRVU19VTlNVQ0NFU1NGVUw7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydG1wX2luaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfaW5pdC5jCmluZGV4IDM2MjhlODUuLmQzNTlhMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfaW5pdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfaW5pdC5jCkBAIC0xNjksMTQgKzE2OSwxNCBAQAogCQlwQmVhY29uQnVmID0ga21hbGxvYyhNQVhfQkVBQ09OX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKIAkJaWYgKHBCZWFjb25CdWYgPT0gTlVMTCkgewogCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgLSBCZWFjb25CdWYhXG4iKSk7CisJCQlEQkdQUklOVF9FUlIoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgLSBCZWFjb25CdWYhXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAJCU5kaXNaZXJvTWVtb3J5KHBCZWFjb25CdWYsIE1BWF9CRUFDT05fU0laRSk7CiAKIAkJU3RhdHVzID0gQWRhcHRlckJsb2NrQWxsb2NhdGVNZW1vcnkoaGFuZGxlLCAodm9pZCAqKikgJiBwQWQpOwogCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKLQkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgLSBBREFQVEVSXG4iKSk7CisJCQlEQkdQUklOVF9FUlIoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgLSBBREFQVEVSXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAJCXBBZC0+QmVhY29uQnVmID0gcEJlYWNvbkJ1ZjsKQEAgLTc4NSw4ICs3ODUsNyBAQAogCQkgIFZlcnNpb24uZmllbGQuVmVyc2lvbiwgVmVyc2lvbi5maWVsZC5GYWVSZWxlYXNlTnVtYmVyKSk7CiAKIAlpZiAoVmVyc2lvbi5maWVsZC5WZXJzaW9uID4gVkFMSURfRUVQUk9NX1ZFUlNJT04pIHsKLQkJREJHUFJJTlRfRVJSKCgiRTJQUk9NOiBXUk9ORyBWRVJTSU9OIDB4JXgsIHNob3VsZCBiZSAlZFxuIiwKLQkJCSAgICAgIFZlcnNpb24uZmllbGQuVmVyc2lvbiwgVkFMSURfRUVQUk9NX1ZFUlNJT04pKTsKKwkJREJHUFJJTlRfRVJSKCJFMlBST006IFdST05HIFZFUlNJT04gMHgleCwgc2hvdWxkIGJlICVkXG4iLCBWZXJzaW9uLmZpZWxkLlZlcnNpb24sIFZBTElEX0VFUFJPTV9WRVJTSU9OKTsKIAkJLypwQWQtPlN5c3RlbUVycm9yQml0bWFwIHw9IDB4MDAwMDAwMDE7CiAKIAkJICAgLy8gaGFyZC1jb2RlIGRlZmF1bHQgdmFsdWUgd2hlbiBubyBwcm9wZXIgRTJQUk9NIGluc3RhbGxlZApAQCAtMjkxMSw3ICsyOTEwLDcgQEAKIAkJCVJUTVBfT1NfQWRkX1RpbWVyKCZwVGltZXItPlRpbWVyT2JqLCBWYWx1ZSk7CiAJCX0KIAl9IGVsc2UgewotCQlEQkdQUklOVF9FUlIoKCJSVE1QU2V0VGltZXIgZmFpbGVkLCBUaW1lciBoYXNuJ3QgYmVlbiBpbml0aWFsaXplIVxuIikpOworCQlEQkdQUklOVF9FUlIoIlJUTVBTZXRUaW1lciBmYWlsZWQsIFRpbWVyIGhhc24ndCBiZWVuIGluaXRpYWxpemUhXG4iKTsKIAl9CiB9CiAKQEAgLTI5NDcsNyArMjk0Niw3IEBACiAJCQlSVE1QX09TX01vZF9UaW1lcigmcFRpbWVyLT5UaW1lck9iaiwgVmFsdWUpOwogCQl9CiAJfSBlbHNlIHsKLQkJREJHUFJJTlRfRVJSKCgiUlRNUE1vZFRpbWVyIGZhaWxlZCwgVGltZXIgaGFzbid0IGJlZW4gaW5pdGlhbGl6ZSFcbiIpKTsKKwkJREJHUFJJTlRfRVJSKCJSVE1QTW9kVGltZXIgZmFpbGVkLCBUaW1lciBoYXNuJ3QgYmVlbiBpbml0aWFsaXplIVxuIik7CiAJfQogfQogCkBAIC0yOTg5LDcgKzI5ODgsNyBAQAogCQlSdG1wVGltZXJRUmVtb3ZlKHBUaW1lci0+cEFkLCBwVGltZXIpOwogI2VuZGlmIC8qIFJUTVBfVElNRVJfVEFTS19TVVBQT1JUIC8vICovCiAJfSBlbHNlIHsKLQkJREJHUFJJTlRfRVJSKCgiUlRNUENhbmNlbFRpbWVyIGZhaWxlZCwgVGltZXIgaGFzbid0IGJlZW4gaW5pdGlhbGl6ZSFcbiIpKTsKKwkJREJHUFJJTlRfRVJSKCJSVE1QQ2FuY2VsVGltZXIgZmFpbGVkLCBUaW1lciBoYXNuJ3QgYmVlbiBpbml0aWFsaXplIVxuIik7CiAJfQogfQogCkBAIC0zMjUxLDggKzMyNTAsNyBAQAogCS8qIExvYWQgODA1MSBmaXJtd2FyZSAqLwogCVN0YXR1cyA9IE5JQ0xvYWRGaXJtd2FyZShwQWQpOwogCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgewotCQlEQkdQUklOVF9FUlIoKCJOSUNMb2FkRmlybXdhcmUgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsCi0JCQkgICAgICBTdGF0dXMpKTsKKwkJREJHUFJJTlRfRVJSKCJOSUNMb2FkRmlybXdhcmUgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsIFN0YXR1cyk7CiAJCWdvdG8gZXJyMTsKIAl9CiAKQEAgLTMyNjgsOCArMzI2Niw3IEBACiAKIAlTdGF0dXMgPSBSVE1QQWxsb2NUeFJ4UmluZ01lbW9yeShwQWQpOwogCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgewotCQlEQkdQUklOVF9FUlIoKCJSVE1QQWxsb2NETUFNZW1vcnkgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsCi0JCQkgICAgICBTdGF0dXMpKTsKKwkJREJHUFJJTlRfRVJSKCJSVE1QQWxsb2NETUFNZW1vcnkgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsIFN0YXR1cyk7CiAJCWdvdG8gZXJyMTsKIAl9CiAKQEAgLTMyODQsNyArMzI4MSw3IEBACiAKIAlTdGF0dXMgPSBNbG1lSW5pdChwQWQpOwogCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgewotCQlEQkdQUklOVF9FUlIoKCJNbG1lSW5pdCBmYWlsZWQsIFN0YXR1c1s9MHglMDh4XVxuIiwgU3RhdHVzKSk7CisJCURCR1BSSU5UX0VSUigiTWxtZUluaXQgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsIFN0YXR1cyk7CiAJCWdvdG8gZXJyMjsKIAl9CiAJLyogSW5pdGlhbGl6ZSBwQWQtPlN0YUNmZywgcEFkLT5BcENmZywgcEFkLT5Db21tb25DZmcgdG8gbWFudWZhY3R1cmUgZGVmYXVsdCAqLwpAQCAtMzMwOSw4ICszMzA2LDcgQEAKIAkvKiAqLwogCVN0YXR1cyA9IE5JQ0luaXRpYWxpemVBZGFwdGVyKHBBZCwgVFJVRSk7CiAJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSB7Ci0JCURCR1BSSU5UX0VSUigoIk5JQ0luaXRpYWxpemVBZGFwdGVyIGZhaWxlZCwgU3RhdHVzWz0weCUwOHhdXG4iLAotCQkJICAgICAgU3RhdHVzKSk7CisJCURCR1BSSU5UX0VSUigiTklDSW5pdGlhbGl6ZUFkYXB0ZXIgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsIFN0YXR1cyk7CiAJCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKIAkJCWdvdG8gZXJyMzsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydG1wX21jdS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRtcF9tY3UuYwppbmRleCA4NDRkNGI5Li44MGZhNDE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydG1wX21jdS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfbWN1LmMKQEAgLTI2Nyw3ICsyNjcsNyBAQAogCQl9IHdoaWxlIChpKysgPCAxMDApOwogCiAJCWlmIChpID4gMTAwKSB7Ci0JCQlEQkdQUklOVF9FUlIoKCJIMk1fTUFJTEJPWCBzdGlsbCBob2xkIGJ5IE1DVS4gY29tbWFuZCBmYWlsXG4iKSk7CisJCQlEQkdQUklOVF9FUlIoIkgyTV9NQUlMQk9YIHN0aWxsIGhvbGQgYnkgTUNVLiBjb21tYW5kIGZhaWxcbiIpOwogCQkJcmV0dXJuIEZBTFNFOwogCQl9CiAKQEAgLTI5Niw3ICsyOTYsNyBAQAogI2lmZGVmIFJUTVBfTUFDX1BDSQogI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCQkJewotCQkJCURCR1BSSU5UX0VSUigoIkgyTV9NQUlMQk9YIHN0aWxsIGhvbGQgYnkgTUNVLiBjb21tYW5kIGZhaWxcbiIpKTsKKwkJCQlEQkdQUklOVF9FUlIoIkgyTV9NQUlMQk9YIHN0aWxsIGhvbGQgYnkgTUNVLiBjb21tYW5kIGZhaWxcbiIpOwogCQkJfQogCQkJcmV0dXJuIEZBTFNFOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9zcGVjdHJ1bS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vc3BlY3RydW0uYwppbmRleCAyZDVmODQ3Li4xZGZiODAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9zcGVjdHJ1bS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3NwZWN0cnVtLmMKQEAgLTE4MzcsNyArMTgzNyw3IEBACiAJCQl9CiAKIAkJCWlmIChpbmRleCA+PSBwQWQtPkNoYW5uZWxMaXN0TnVtKSB7Ci0JCQkJREJHUFJJTlRfRVJSKCgiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiZQZWVyQ2hTd0FubkFjdGlvbihjYW4gbm90IGZpbmQgTmV3IENoYW5uZWw9JWQgaW4gQ2hhbm5lbExpc3RbJWRdXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBwQWQtPkNoYW5uZWxMaXN0TnVtKSk7CisJCQkJREJHUFJJTlRfRVJSKCImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJlBlZXJDaFN3QW5uQWN0aW9uKGNhbiBub3QgZmluZCBOZXcgQ2hhbm5lbD0lZCBpbiBDaGFubmVsTGlzdFslZF1cbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBBZC0+Q2hhbm5lbExpc3ROdW0pOwogCQkJfQogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9tbG1lLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL21sbWUuaAppbmRleCAwMTQxNGMzLi5jZDFlZTNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL21sbWUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL21sbWUuaApAQCAtMzIsOCArMzIsOSBAQAogCVJldmlzaW9uIEhpc3Rvcnk6CiAJV2hvCQkJV2hlbgkJCVdoYXQKIAktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlKb2huIENoYW5nCTIwMDMtMDgtMjgJCUNyZWF0ZWQKLQlKb2huIENoYW5nICAyMDA0LTA5LTA2ICAgICAgbW9kaWZpZWQgZm9yIFJUMjYwMAorCUpvaG4gQ2hhbmcJCTIwMDMtMDgtMjgJCUNyZWF0ZWQKKwlKb2huIENoYW5nICAJCTIwMDQtMDktMDYgICAgICAJbW9kaWZpZWQgZm9yIFJUMjYwMAorCUp1c3RpbiBQLiBNYXR0b2NrCTExLzA3LzIwMTAJCUZpeCB0eXBvcyBpbiBjb21tZW50cwogCiAqLwogI2lmbmRlZiBfX01MTUVfSF9fCkBAIC00MSw3ICs0Miw3IEBACiAKICNpbmNsdWRlICJydG1wX2RvdDExLmgiCiAKLS8qIG1heGltdW0gc3VwcG9ydGVkIGNhcGFiaWxpdHkgaW5mb3JtYXRpb24gLSAqLworLyogbWF4aW11bSBzdXBwb3J0ZWQgY2FwYWJpbGl0eSBpbmZvcm1hdGlvbiAqLwogLyogRVNTLCBJQlNTLCBQcml2YWN5LCBTaG9ydCBQcmVhbWJsZSwgU3BlY3RydW0gbWdtdCwgU2hvcnQgU2xvdCAqLwogI2RlZmluZSBTVVBQT1JURURfQ0FQQUJJTElUWV9JTkZPICAgMHgwNTMzCiAKQEAgLTc3LDcgKzc4LDcgQEAKICNkZWZpbmUgQ1dfTUFYX0lOX0JJVFMgICAgICAgICAgICAgIDEwCS8qIGFjdHVhbCBDd01heCA9IDJeQ1dfTUFYX0lOX0JJVFMgLSAxICovCiAKIC8qIE5vdGU6IFJTU0lfVE9fREJNX09GRlNFVCBoYXMgYmVlbiBjaGFuZ2VkIHRvIHZhcmlhYmxlIGZvciBuZXcgUkYgKDIwMDQtMDcyMCkuICovCi0vKiBTSG91bGQgbm90IHJlZmVyIHRvIHRoaXMgY29uc3RhbnQgYW55bW9yZSAqLworLyogU2hvdWxkIG5vdCByZWZlciB0byB0aGlzIGNvbnN0YW50IGFueW1vcmUgKi8KIC8qI2RlZmluZSBSU1NJX1RPX0RCTV9PRkZTRVQgICAgICAgICAgMTIwIC8vIGZvciBSVDI1MzAgUlNTSS0xMTUgPSBkQm0gKi8KICNkZWZpbmUgUlNTSV9GT1JfTUlEX1RYX1BPV0VSICAgICAgIC01NQkvKiAtNTUgZGIgaXMgY29uc2lkZXJlZCBtaWQtZGlzdGFuY2UgKi8KICNkZWZpbmUgUlNTSV9GT1JfTE9XX1RYX1BPV0VSICAgICAgIC00NQkvKiAtNDUgZGIgaXMgY29uc2lkZXJlZCB2ZXJ5IHNob3J0IGRpc3RhbmNlIGFuZCAqLwpAQCAtMTIzLDcgKzEyNCw3IEBACiAjZGVmaW5lIFRJRF9NQUNfSEFTSF9JTkRFWChBZGRyLCBUSUQpICAgICAgKFRJRF9NQUNfSEFTSChBZGRyLCBUSUQpICUgSEFTSF9UQUJMRV9TSVpFKQogCiAvKiBMRUQgQ29udHJvbCAqLwotLyogYXNzb2lhdGlvbiBPTi4gb25lIExFRCBPTi4gYW5vdGhlciBibGlua2luZyB3aGVuIFRYLCBPRkYgd2hlbiBpZGxlICovCisvKiBhc3NvY2lhdGlvbiBPTi4gb25lIExFRCBPTi4gYW5vdGhlciBibGlua2luZyB3aGVuIFRYLCBPRkYgd2hlbiBpZGxlICovCiAvKiBubyBhc3NvY2lhdGlvbiwgYm90aCBMRUQgb2ZmICovCiAjZGVmaW5lIEFTSUNfTEVEX0FDVF9PTihwQWQpICAgICAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQ1NSMTQsIDB4MDAwMzFlNDYpCiAjZGVmaW5lIEFTSUNfTEVEX0FDVF9PRkYocEFkKSAgICAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQ1NSMTQsIDB4MDAwMDFlNDYpCkBAIC0yODQsOCArMjg1LDggQEAKIAogLyogODAyLjExbiBkcmFmdDMgcmVsYXRlZCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMuICovCiAvKiA3LjMuMi42MCAqLwotI2RlZmluZSBkb3QxMU9CU1NTY2FuUGFzc2l2ZUR3ZWxsCQkJCQkJCTIwCS8qIGluIFRVLiBtaW4gYW1vdW50IG9mIHRpbWUgdGhhdCB0aGUgU1RBIGNvbnRpbm91c2x5IHNjYW5zIGVhY2ggY2hhbm5lbCB3aGVuIHBlcmZvcm1pbmcgYW4gYWN0aXZlIE9CU1Mgc2Nhbi4gKi8KLSNkZWZpbmUgZG90MTFPQlNTU2NhbkFjdGl2ZUR3ZWxsCQkJCQkJCTEwCS8qIGluIFRVLm1pbiBhbW91bnQgb2YgdGltZSB0aGF0IHRoZSBTVEEgY29udGlub3VzbHkgc2NhbnMgZWFjaCBjaGFubmVsIHdoZW4gcGVyZm9ybWluZyBhbiBwYXNzaXZlIE9CU1Mgc2Nhbi4gKi8KKyNkZWZpbmUgZG90MTFPQlNTU2NhblBhc3NpdmVEd2VsbAkJCQkJCQkyMAkvKiBpbiBUVS4gbWluIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIFNUQSBjb250aW51b3VzbHkgc2NhbnMgZWFjaCBjaGFubmVsIHdoZW4gcGVyZm9ybWluZyBhbiBhY3RpdmUgT0JTUyBzY2FuLiAqLworI2RlZmluZSBkb3QxMU9CU1NTY2FuQWN0aXZlRHdlbGwJCQkJCQkJMTAJLyogaW4gVFUubWluIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIFNUQSBjb250aW51b3VzbHkgc2NhbnMgZWFjaCBjaGFubmVsIHdoZW4gcGVyZm9ybWluZyBhbiBwYXNzaXZlIE9CU1Mgc2Nhbi4gKi8KICNkZWZpbmUgZG90MTFCU1NXaWR0aFRyaWdnZXJTY2FuSW50ZXJ2YWwJCQkJCTMwMAkvKiBpbiBzZWMuIG1heCBpbnRlcnZhbCBiZXR3ZWVuIHNjYW4gb3BlcmF0aW9ucyB0byBiZSBwZXJmb3JtZWQgdG8gZGV0ZWN0IEJTUyBjaGFubmVsIHdpZHRoIHRyaWdnZXIgZXZlbnRzLiAqLwogI2RlZmluZSBkb3QxMU9CU1NTY2FuUGFzc2l2ZVRvdGFsUGVyQ2hhbm5lbAkJCQkJMjAwCS8qIGluIFRVLiBtaW4gdG90YWwgYW1vdW50IG9mIHRpbWUgdGhhdCB0aGUgU1RBIHNjYW5zIGVhY2ggY2hhbm5lbCB3aGVuIHBlcmZvcm1pbmcgYSBwYXNzaXZlIE9CU1Mgc2Nhbi4gKi8KICNkZWZpbmUgZG90MTFPQlNTU2NhbkFjdGl2ZVRvdGFsUGVyQ2hhbm5lbAkJCQkJMjAJLyppbiBUVS4gbWluIHRvdGFsIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIFNUQSBzY2FucyBlYWNoIGNoYW5uZWwgd2hlbiBwZXJmb3JtaW5nIGEgYWN0aXZlIE9CU1Mgc2NhbiAqLwpAQCAtMzI1LDcgKzMyNiw3IEBACiB9OwogCiAvKiAyMC80MCB0cmlnZ2VyIGV2ZW50IHRhYmxlICovCi0vKiBJZiBvbmUgRXZlbnQgQSBkZWxldGUgb3IgY3JlYXRlZCwgb3IgaWYgRXZlbnQgQiBpcyBkZXRlY3RlZCBvciBub3QgZGV0ZWN0ZWQsIFNUQSBzaG91bGQgc2VuZCAyMDQwQlNTQ29leGlzdGVuY2UgdG8gQVAuICovCisvKiBJZiBvbmUgRXZlbnQgKEEpIGlzIGRlbGV0ZWQgb3IgY3JlYXRlZCwgb3IgaWYgRXZlbnQgKEIpIGlzIGRldGVjdGVkIG9yIG5vdCBkZXRlY3RlZCwgU1RBIHNob3VsZCBzZW5kIDIwNDBCU1NDb2V4aXN0ZW5jZSB0byBBUC4gKi8KICNkZWZpbmUgTUFYX1RSSUdHRVJfRVZFTlQJCTY0CiBzdHJ1Y3QgcnRfdHJpZ2dlcl9ldmVudF90YWIgewogCXU4IEV2ZW50QU5vOwpAQCAtMzU3LDE0ICszNTgsMTQgQEAKIAl1OCBDaExpc3RbMF07CiB9OwogCi0vKiBUaGUgc3RydWN0dXJlIGZvciBjaGFubmVsIHN3aXRjaCBhbm5vdWNlbWVudCBJRS4gVGhpcyBpcyBpbiA4MDIuMTFuIEQzLjAzICovCisvKiBUaGUgc3RydWN0dXJlIGZvciBjaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgSUUuIFRoaXMgaXMgaW4gODAyLjExbiBEMy4wMyAqLwogc3RydWN0IFBBQ0tFRCBydF9jaGFfc3dpdGNoX2Fubm91bmNlX2llIHsKIAl1OCBTd2l0Y2hNb2RlOwkvKmNoYW5uZWwgc3dpdGNoIG1vZGUgKi8KIAl1OCBOZXdDaGFubmVsOwkvKiAqLwogCXU4IFN3aXRjaENvdW50OwkvKiAqLwogfTsKIAotLyogVGhlIHN0cnVjdHVyZSBmb3IgY2hhbm5lbCBzd2l0Y2ggYW5ub3VjZW1lbnQgSUUuIFRoaXMgaXMgaW4gODAyLjExbiBEMy4wMyAqLworLyogVGhlIHN0cnVjdHVyZSBmb3IgY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IElFLiBUaGlzIGlzIGluIDgwMi4xMW4gRDMuMDMgKi8KIHN0cnVjdCBQQUNLRUQgcnRfc2VjX2NoYV9vZmZzZXRfaWUgewogCXU4IFNlY29uZGFyeUNoYW5uZWxPZmZzZXQ7CS8qIDE6IFNlY29uZGFyeSBhYm92ZSwgMzogU2Vjb25kYXJ5IGJlbG93LCAwOiBubyBTZWNvbmRhcnkgKi8KIH07CkBAIC0zNzcsNyArMzc4LDcgQEAKIAl1OCBNQ1NTZXRbMTZdOwogfTsKIAotLypUaGlzIHN0cnVjdHVyZSBzdWJzdHJhY3RzIHJhbGluayBzdXBwb3J0cyBmcm9tIGFsbCA4MDIuMTFuLXJlbGF0ZWQgZmVhdHVyZXMuICovCisvKlRoaXMgc3RydWN0dXJlIHN1YnRyYWN0cyByYWxpbmsgc3VwcG9ydHMgZnJvbSBhbGwgODAyLjExbi1yZWxhdGVkIGZlYXR1cmVzLiAqLwogLypGZWF0dXJlcyBub3QgbGlzdGVkIGhlcmUgYnV0IGNvbnRhaW5lZCBpbiA4MDIuMTFuIHNwZWMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gcnQyODYwLiAqLwogc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHkgewogCXUxNiBDaGFubmVsV2lkdGg6MTsKQEAgLTM4NywxNCArMzg4LDE0IEBACiAJdTE2IFNob3J0R0lmb3I0MDoxOwkvKmZvcjQwTUh6ICovCiAJdTE2IFR4U1RCQzoxOwogCXUxNiBSeFNUQkM6MjsJLyogMiBiaXRzICovCi0JdTE2IEFtc2R1RW5hYmxlOjE7CS8qIEVuYWJsZSB0byB0cmFuc21pdCBBLU1TRFUuIFN1Z2dlc3QgZGlzYWJsZS4gV2Ugc2hvdWxkIHVzZSBBLU1QRFUgdG8gZ2FpbiBiZXN0IGJlbmlmaXQgb2YgODAyLjExbiAqLworCXUxNiBBbXNkdUVuYWJsZToxOwkvKiBFbmFibGUgdG8gdHJhbnNtaXQgQS1NU0RVLiBTdWdnZXN0IGRpc2FibGUuIFdlIHNob3VsZCB1c2UgQS1NUERVIHRvIGdhaW4gYmVzdCBiZW5lZml0IG9mIDgwMi4xMW4gKi8KIAl1MTYgQW1zZHVTaXplOjE7CS8qIE1heCByZWNlaXZpbmcgQS1NU0RVIHNpemUgKi8KIAl1MTYgcnN2OjU7CiAKIAkvKlN1YnN0cmFjdCBmcm9tIEFkZGlvbnQgSFQgSU5GTyBJRSAqLwogCXU4IE1heFJBbXBkdUZhY3RvcjoyOwogCXU4IE1wZHVEZW5zaXR5OjM7Ci0JdTggRXh0Q2hhbk9mZnNldDoyOwkvKiBQbGVhc2Ugbm90IHRoZSBkaWZmZXJlbmNlIHdpdGggZm9sbG93aW5nICAgICB1OCAgIE5ld0V4dENoYW5uZWxPZmZzZXQ7IGZyb20gODAyLjExbiAqLworCXU4IEV4dENoYW5PZmZzZXQ6MjsJLyogUGxlYXNlIG5vdGUgdGhlIGRpZmZlcmVuY2Ugd2l0aCBmb2xsb3dpbmcgICAgIHU4ICAgTmV3RXh0Q2hhbm5lbE9mZnNldDsgZnJvbSA4MDIuMTFuICovCiAJdTggUmVjb21XaWR0aDoxOwogCiAJdTE2IE9wZXJhaW9uTW9kZToyOwpAQCAtNDgxLDcgKzQ4Miw3IEBACiAJdTE2IEFNU0RVU3VwcG9ydGVkOjE7CS8qIDA6IG5vdCBwZXJtaXR0ZWQgICAgICAgICAgICAgMTogcGVybWl0dGVkICovCiAJdTE2IEJBUG9saWN5OjE7CS8qIDE6IGltbWVkaWF0ZWx5IEJBICAgIDA6ZGVsYXllZCBCQSAqLwogCXUxNiBUSUQ6NDsJCS8qIHZhbHVlIG9mIFRDIG9zIFRTICovCi0JdTE2IEJ1ZlNpemU6MTA7CS8qIG51bWJlciBvZiBidWZmZSBvZiBzaXplIDIzMDQgb2N0ZXRzciAqLworCXUxNiBCdWZTaXplOjEwOwkvKiBudW1iZXIgb2YgYnVmZmVyIG9mIHNpemUgMjMwNCBvY3RldHNyICovCiB9OwogCiAvKiAyLWJ5dGUgQkEgU3RhcnRpbmcgU2VxIENPTlRST0wgZmllbGQgKi8KQEAgLTU1MSw3ICs1NTIsNyBAQAogCUJBU0VRX0NPTlRST0wgQkFTdGFydGluZ1NlcTsKIH07CiAKLS8qIENvbXByZXNzZWQgZm9ybWF0IGlzIG1hbmRhbnRvcnkgaW4gSFQgU1RBICovCisvKiBDb21wcmVzc2VkIGZvcm1hdCBpcyBtYW5kYXRvcnkgaW4gSFQgU1RBICovCiBzdHJ1Y3QgUEFDS0VEIHJ0X2ZyYW1lX210YmEgewogCXN0cnVjdCBydF9mcmFtZV9jb250cm9sIEZDOwogCXUxNiBEdXJhdGlvbjsKQEAgLTY0Nyw3ICs2NDgsNyBAQAogCXU4IGJpdG1hc2tbOF07CiB9OwogCi0vKiBSYWRpbyBNZWFzdWVtZW50IFJlcXVlc3QgRnJhbWUgRm9ybWF0ICovCisvKiBSYWRpbyBNZWFzdXJlbWVudCBSZXF1ZXN0IEZyYW1lIEZvcm1hdCAqLwogc3RydWN0IFBBQ0tFRCBydF9mcmFtZV9ybV9yZXFfYWN0aW9uIHsKIAlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSBIZHI7CiAJdTggQ2F0ZWdvcnk7CkBAIC03MDksNyArNzEwLDcgQEAKIAl1OCBDd21pbls0XTsKIAl1OCBDd21heFs0XTsKIAl1MTYgVHhvcFs0XTsJCS8qIGluIHVuaXQgb2YgMzItdXMgKi8KLQlCT09MRUFOIGJBQ01bNF07CS8qIDE6IEFkbWlzc2lvbiBDb250cm9sIG9mIEFDX0JLIGlzIG1hbmRhdHRvcnkgKi8KKwlCT09MRUFOIGJBQ01bNF07CS8qIDE6IEFkbWlzc2lvbiBDb250cm9sIG9mIEFDX0JLIGlzIG1hbmRhdG9yeSAqLwogfTsKIAogLyogUUJTUyBMT0FEIGluZm9ybWF0aW9uIGZyb20gUUFQJ3MgQkVBQ09OL1Byb2JlUnNwICovCkBAIC03NTcsNyArNzU4LDcgQEAKIHN0cnVjdCBydF9ic3NfZW50cnkgewogCXU4IEJzc2lkW01BQ19BRERSX0xFTl07CiAJdTggQ2hhbm5lbDsKLQl1OCBDZW50cmFsQ2hhbm5lbDsJLypTdG9yZSB0aGUgd2lkZS1iYW5kIGNlbnRyYWwgY2hhbm5lbCBmb3IgNDBNSHouICAudXNlZCBpbiA0ME1IeiBBUC4gT3IgdGhpcyBpcyB0aGUgc2FtZSBhcyBDaGFubmVsLiAqLworCXU4IENlbnRyYWxDaGFubmVsOwkvKlN0b3JlIHRoZSB3aWRlLWJhbmQgY2VudHJhbCBjaGFubmVsIGZvciA0ME1Iei4gdXNlZCBpbiA0ME1IeiBBUC4gT3IgdGhpcyBpcyB0aGUgc2FtZSBhcyBDaGFubmVsLiAqLwogCXU4IEJzc1R5cGU7CiAJdTE2IEF0aW1XaW47CiAJdTE2IEJlYWNvblBlcmlvZDsKQEAgLTg1NSw3ICs4NTYsNyBAQAogCVNUQVRFX01BQ0hJTkVfRlVOQyAqVHJhbnNGdW5jOwogfTsKIAotLyogTUxNRSBBVVggZGF0YSBzdHJ1Y3R1cmUgdGhhdCBob2xkIHRlbXBvcmFybGl5IHNldHRpbmdzIGR1cmluZyBhIGNvbm5lY3Rpb24gYXR0ZW1wdC4gKi8KKy8qIE1MTUUgQVVYIGRhdGEgc3RydWN0dXJlIHRoYXQgaG9sZHMgdGVtcG9yYXJsaXkgc2V0dGluZ3MgZHVyaW5nIGEgY29ubmVjdGlvbiBhdHRlbXB0LiAqLwogLyogT25jZSB0aGlzIGF0dGVtcCBzdWNjZWVkcywgYWxsIHNldHRpbmdzIHdpbGwgYmUgY29weSB0byBwQWQtPlN0YUFjdGl2ZS4gKi8KIC8qIEEgY29ubmVjdGlvbiBhdHRlbXB0ICh1c2VyIHNldCBPSUQsIHJvYW1pbmcsIENDWCBmYXN0IHJvYW1pbmcsLi4pIGNvbnNpc3RzIG9mICovCiAvKiBzZXZlcmFsIHN0ZXBzIChKT0lOLCBBVVRILCBBU1NPQyBvciBSRUFTU09DKSBhbmQgbWF5IGZhaWwgYXQgYW55IHN0ZXAuIFdlIHB1cnBvc2VseSAqLwpAQCAtOTk2LDcgKzk5Nyw3IEBACiAjZGVmaW5lIE1BQ19UQUJMRV9BU1NPQ19USU1FT1VUCQkJNQkvKiB1bml0OiBzZWMgKi8KICNkZWZpbmUgTUFDX1RBQkxFX0ZVTEwoVGFiKQkJCQkoKFRhYikuc2l6ZSA9PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKIAotLyogQVAgc2hhbGwgZHJvcCB0aGUgc3RhIGlmIGNvbnRpbmUgVHggZmFpbCBjb3VudCByZWFjaCBpdC4gKi8KKy8qIEFQIHNoYWxsIGRyb3AgdGhlIHN0YSBpZiBjb250aW51ZSBUeCBmYWlsIGNvdW50IHJlYWNoIGl0LiAqLwogI2RlZmluZSBNQUNfRU5UUllfTElGRV9DSEVDS19DTlQJCTIwCS8qIHBhY2tldCBjbnQuICovCiAKIC8qIFZhbHVlIGRvbWFpbiBvZiBwTWFjRW50cnktPlNzdCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9vaWQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvb2lkLmgKaW5kZXggMTcwNGMyNy4uNWEyNWYwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9vaWQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL29pZC5oCkBAIC0zMiw3ICszMiw4IEBACiAJUmV2aXNpb24gSGlzdG9yeToKIAlXaG8JCQlXaGVuCQkJV2hhdAogCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlOYW1lCQlEYXRlCQkJTW9kaWZpY2F0aW9uIGxvZ3MKKwlOYW1lCQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCisJSnVzdGluIFAuIE1hdHRvY2sgCTExLzA3LzIwMTAJRml4IHR5cG9zIGluIGNvbW1lbnRzCiAqLwogI2lmbmRlZiBfT0lEX0hfCiAjZGVmaW5lIF9PSURfSF8KQEAgLTc4LDcgKzc5LDcgQEAKICNkZWZpbmUgTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTICAgICAgICA4CiAjZGVmaW5lIE5ESVNfODAyXzExX0xFTkdUSF9SQVRFU19FWCAgICAgMTYKICNkZWZpbmUgTUFDX0FERFJfTEVOR1RIICAgICAgICAgICAgICAgICA2Ci0vKiNkZWZpbmUgTUFYX05VTV9PRl9DSFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDkgLy8gMTQgY2hhbm5lbHMgQDIuNEcgKyAgMTJAVU5JSSArIDQgQE1NQUMgKyAxMSBASGlwZXJMQU4yICsgNyBASmFwYW4gKyAxIGFzIE5VTEwgdGVybWluYXRpb25jICovCisvKiNkZWZpbmUgTUFYX05VTV9PRl9DSFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDkgLy8gMTQgY2hhbm5lbHMgQDIuNEcgKyAgMTJAVU5JSSArIDQgQE1NQUMgKyAxMSBASGlwZXJMQU4yICsgNyBASmFwYW4gKyAxIGFzIE5VTEwgdGVybWluYXRpb24gKi8KICNkZWZpbmUgTUFYX05VTV9PRl9DSFMJCQkJNTQJLyogMTQgY2hhbm5lbHMgQDIuNEcgKyAgMTJAVU5JSShsb3dlci9taWRkbGUpICsgMTZASGlwZXJMQU4yICsgMTFAVU5JSSh1cHBlcikgKyAwIEBKYXBhbiArIDEgYXMgTlVMTCB0ZXJtaW5hdGlvbiAqLwogI2RlZmluZSBNQVhfTlVNQkVSX09GX0VWRU5UCQkJCTEwCS8qIGVudHJ5ICMgaW4gRVZFTlQgdGFibGUgKi8KICNkZWZpbmUgTUFYX05VTUJFUl9PRl9NQUMJCQkJMzIJLyogaWYgTUFYX01CU1NJRF9OVU0gaXMgOCwgdGhpcyB2YWx1ZSBjYW4ndCBiZSBsYXJnZXIgdGhhbiAyMTEgKi8KQEAgLTg3LDcgKzg4LDcgQEAKICNkZWZpbmUgTUFYX05VTUJFUl9PRl9ETFNfRU5UUlkJCQk0CiAKICNkZWZpbmUgUlRfUVVFUllfU0lHTkFMX0NPTlRFWFQJCQkJMHgwNDAyCi0jZGVmaW5lIFJUX1NFVF9JQVBQX1BJRCAgICAgICAgICAgICAgICAgCTB4MDQwNAorI2RlZmluZSBSVF9TRVRfSUFQUF9QSUQJCQkJMHgwNDA0CiAjZGVmaW5lIFJUX1NFVF9BUERfUElECQkJCQkJMHgwNDA1CiAjZGVmaW5lIFJUX1NFVF9ERUxfTUFDX0VOVFJZCQkJCTB4MDQwNgogI2RlZmluZSBSVF9RVUVSWV9FVkVOVF9UQUJMRQkJCTB4MDQwNwpAQCAtNjEwLDcgKzYxMSw3IEBACiAKIHN0cnVjdCBydF84MDJfMTFfZXZlbnRfdGFibGUgewogCXVuc2lnbmVkIGxvbmcgTnVtOwotCXVuc2lnbmVkIGxvbmcgUnN2OwkJLyogdG8gYWxpZ24gTG9nW10gYXQgTEFSR0VfSU5FR0VSIGJvdW5kYXJ5ICovCisJdW5zaWduZWQgbG9uZyBSc3Y7CQkvKiB0byBhbGlnbiBMb2dbXSBhdCBMQVJHRV9JTlRFR0VSIGJvdW5kYXJ5ICovCiAJc3RydWN0IHJ0XzgwMl8xMV9ldmVudF9sb2cgTG9nW01BWF9OVU1CRVJfT0ZfRVZFTlRdOwogfTsKIApAQCAtNzIxLDkgKzcyMiw5IEBACiAjZGVmaW5lCUFVVEhfRkFJTAkJCQkweDQJLyogT3BlbiBhdXRoZW50aWNhdGlvbiBmYWlsICovCiAjZGVmaW5lCUFVVEhfRkFJTF9LRVlTCQkJMHg1CS8qIFNoYXJlZCBhdXRoZW50aWNhdGlvbiBmYWlsICovCiAjZGVmaW5lCUFTU09DX0ZBSUwJCQkJMHg2CS8qIEFzc29jaWF0aW9uIGZhaWxlZCAqLwotI2RlZmluZQlFQVBfTUlDX0ZBSUxVUkUJCQkweDcJLyogRGVhdXRoZW5jYXRpb24gYmVjYXVzZSBNSUMgZmFpbHVyZSAqLwotI2RlZmluZQlFQVBfNFdBWV9USU1FT1VUCQkweDgJLyogRGVhdXRoZW5jYXRpb24gb24gNC13YXkgaGFuZHNoYWtlIHRpbWVvdXQgKi8KLSNkZWZpbmUJRUFQX0dST1VQX0tFWV9USU1FT1VUCTB4OQkvKiBEZWF1dGhlbmNhdGlvbiBvbiBncm91cCBrZXkgaGFuZHNoYWtlIHRpbWVvdXQgKi8KKyNkZWZpbmUJRUFQX01JQ19GQUlMVVJFCQkJMHg3CS8qIERlYXV0aGVudGljYXRpb24gYmVjYXVzZSBNSUMgZmFpbHVyZSAqLworI2RlZmluZQlFQVBfNFdBWV9USU1FT1VUCQkweDgJLyogRGVhdXRoZW50aWNhdGlvbiBvbiA0LXdheSBoYW5kc2hha2UgdGltZW91dCAqLworI2RlZmluZQlFQVBfR1JPVVBfS0VZX1RJTUVPVVQJMHg5CS8qIERlYXV0aGVudGljYXRpb24gb24gZ3JvdXAga2V5IGhhbmRzaGFrZSB0aW1lb3V0ICovCiAjZGVmaW5lCUVBUF9TVUNDRVNTCQkJCTB4YQkvKiBFQVAgc3VjY2VlZCAqLwogI2RlZmluZQlERVRFQ1RfUkFEQVJfU0lHTkFMCQkweGIJLyogUmFkYXIgc2lnbmFsIG9jY3VyIGluIGN1cnJlbnQgY2hhbm5lbCAqLwogI2RlZmluZSBFWFRSQV9JTkZPX01BWAkJCTB4YgkvKiBJbmRpY2F0ZSBMYXN0IE9JRCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9wY2lfbWFpbl9kZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcGNpX21haW5fZGV2LmMKaW5kZXggMzIxZmFjZC4uMjVmYmIxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9wY2lfbWFpbl9kZXYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3BjaV9tYWluX2Rldi5jCkBAIC0zMSw3ICszMSw4IEBACiAgICAgQ3JlYXRlIGFuZCByZWdpc3RlciBuZXR3b3JrIGludGVyZmFjZSBmb3IgUENJIGJhc2VkIGNoaXBzZXRzIGluIExpbnV4IHBsYXRmb3JtLgogCiAgICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgICAgV2hhdAorICAgIFdobyAgICAgICAgIAlXaGVuICAgICAgICAgICAgV2hhdAorICAgIEp1c3RpbiBQLiBNYXR0b2NrCTExLzA3LzIwMTAJRml4IHR5cG9zIGluIHNvbWUgY29tbWVudHMKICAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KIApAQCAtNDAsOCArNDEsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogLyogRm9sbG93aW5nIGluZm9ybWF0aW9uIHdpbGwgYmUgc2hvdyB3aGVuIHlvdSBydW4gJ21vZGluZm8nICovCi0vKiAqKiogSWYgeW91IGhhdmUgYSBzb2x1dGlvbiBmb3IgdGhlIGJ1ZyBpbiBjdXJyZW50IHZlcnNpb24gb2YgZHJpdmVyLCBwbGVhc2UgbWFpbCB0byBtZS4gKi8KLS8qIE90aGVyd2lzZSBwb3N0IHRvIGZvcnVtIGluIHJhbGlua3RlY2gncyB3ZWIgc2l0ZSh3d3cucmFsaW5rdGVjaC5jb20pIGFuZCBsZXQgYWxsIHVzZXJzIGhlbHAgeW91LiAqKiogKi8KKy8qIElmIHlvdSBoYXZlIGEgc29sdXRpb24gZm9yIGEgYnVnIGluIGN1cnJlbnQgdmVyc2lvbiBvZiBkcml2ZXIsIHBsZWFzZSBlLW1haWwgbWUuICovCisvKiBPdGhlcndpc2UgcG9zdCB0byBmb3J1bSBpbiByYWxpbmt0ZWNoJ3Mgd2ViIHNpdGUod3d3LnJhbGlua3RlY2guY29tKSBhbmQgbGV0IGFsbCB1c2VycyBoZWxwIHlvdS4gKi8KIE1PRFVMRV9BVVRIT1IoIkpldHQgQ2hlbiA8amV0dF9jaGVuQHJhbGlua3RlY2guY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJSVDI4NjAvUlQzMDkwIFdpcmVsZXNzIExhbiBMaW51eCBEcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKQEAgLTUwLDkgKzUxLDYgQEAKIC8qICovCiAvKiBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgKi8KIC8qICovCi1leHRlcm4gaW50IHJ0Mjh4eF9jbG9zZShJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7Ci1leHRlcm4gaW50IHJ0Mjh4eF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKLQogc3RhdGljIHZvaWQgX19kZXZleGl0IHJ0Mjg2MF9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KTsKIHN0YXRpYyBpbnQgX19kZXZpbml0IHJ0Mjg2MF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwKIAkJCQkgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOwpAQCAtMjA1LDcgKzIwMyw3IEBACiAKIAkvKiBpbml0aWFsaXplIGRldmljZSBiZWZvcmUgaXQncyB1c2VkIGJ5IGEgZHJpdmVyICovCiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaV9kZXYpKSB7Ci0JCXByaW50aygicGNpIGVuYWJsZSBmYWlsIVxuIik7CisJCXByaW50ayhLRVJOX0VSUiAicnQyODYwOiBwY2kgZW5hYmxlIGZhaWwhXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC01OTksNyArNTk3LDcgQEAKIAkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLAogCQkJICAgICAoIiBBVVhfQ1RSTCA9IDB4JTMyeFxuIiwgTWFjVmFsdWUpKTsKIAotCQkvKiBmb3IgUlQzMHh4IEYgYW5kIGFmdGVyLCBQQ0llIGluZnRlcmZhY2UsIGFuZCBmb3IgcG93ZXIgc29sdXRpb24gMyAqLworCQkvKiBmb3IgUlQzMHh4IEYgYW5kIGFmdGVyLCBQQ0llIGludGVyZmFjZSwgYW5kIGZvciBwb3dlciBzb2x1dGlvbiAzICovCiAJCWlmICgoSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkpCiAJCSAgICAmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA+PSAyKQogCQkgICAgJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhQb3dlck1vZGUgPD0gMykpIHsKQEAgLTkwMiw3ICs5MDAsNyBAQAogCQkJCSAgQ29uZmlndXJhdGlvbik7CiAJCWlmICgoQ29uZmlndXJhdGlvbiAhPSAwKSAmJiAoQ29uZmlndXJhdGlvbiAhPSAweEZGRkYpKSB7CiAJCQlDb25maWd1cmF0aW9uICY9IDB4ZmVmYzsKLQkJCS8qIElmIGNhbGwgZnJvbSBpbnRlcmZhY2UgZG93biwgcmVzdG9yZSB0byBvcmdpbmlhbCBzZXR0aW5nLiAqLworCQkJLyogSWYgY2FsbCBmcm9tIGludGVyZmFjZSBkb3duLCByZXN0b3JlIHRvIG9yaWdpbmFsIHNldHRpbmcuICovCiAJCQlpZiAoTGV2ZWwgPT0gUkVTVE9SRV9DTE9TRSkKIAkJCQlDb25maWd1cmF0aW9uIHw9IHBBZC0+SG9zdExua0N0cmxDb25maWd1cmF0aW9uOwogCQkJZWxzZQpAQCAtOTI0LDcgKzkyMiw3IEBACiAJCQkJICBDb25maWd1cmF0aW9uKTsKIAkJaWYgKChDb25maWd1cmF0aW9uICE9IDApICYmIChDb25maWd1cmF0aW9uICE9IDB4RkZGRikpIHsKIAkJCUNvbmZpZ3VyYXRpb24gJj0gMHhmZWZjOwotCQkJLyogSWYgY2FsbCBmcm9tIGludGVyZmFjZSBkb3duLCByZXN0b3JlIHRvIG9yZ2luaWFsIHNldHRpbmcuICovCisJCQkvKiBJZiBjYWxsIGZyb20gaW50ZXJmYWNlIGRvd24sIHJlc3RvcmUgdG8gb3JpZ2luYWwgc2V0dGluZy4gKi8KIAkJCWlmIChMZXZlbCA9PSBSRVNUT1JFX0NMT1NFKQogCQkJCUNvbmZpZ3VyYXRpb24gfD0gcEFkLT5STG5rQ3RybENvbmZpZ3VyYXRpb247CiAJCQllbHNlCkBAIC0xMTA2LDEyICsxMTA0LDEyIEBACiAJCWlmIChwb3MgIT0gMCkKIAkJCXBBZC0+SG9zdExua0N0cmxPZmZzZXQgPSBwb3MgKyBQQ0lfRVhQX0xOS0NUTDsKIAotCQkvKiBJZiBjb25maWd1cmFyZWQgdG8gdHVybiBvbiBMMS4gKi8KKwkJLyogSWYgY29uZmlndXJlZCB0byB0dXJuIG9uIEwxLiAqLwogCQlIb3N0Q29uZmlndXJhdGlvbiA9IDA7CiAJCWlmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4Rm9yY2VBU1BNVGVzdCA9PSAxKSB7CiAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJFbnRlcixQU00gOiBGb3JjZSBBU1BNXG4iKSk7CiAKLQkJCS8qIFNraXAgbm9uLWV4aXN0IGRlaWNlIHJpZ2h0IGF3YXkgKi8KKwkJCS8qIFNraXAgbm9uLWV4aXN0IGRldmljZSByaWdodCBhd2F5ICovCiAJCQlpZiAoKHBBZC0+SG9zdExua0N0cmxPZmZzZXQgIT0gMCkpIHsKIAkJCQlQQ0lfUkVHX1JFQURfV09SRChwT2JqLT5wYXJlbnRfcGNpX2RldiwKIAkJCQkJCSAgcEFkLT5Ib3N0TG5rQ3RybE9mZnNldCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfbGludXguYwppbmRleCBhYmZlZWExLi43Mjg4NjRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9saW51eC5jCkBAIC0zMjEsNyArMzIxLDcgQEAKIAogCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UoT1NQS1RfVE9fUlRQS1QocGt0KSwgUEtUU1JDX05ESVMpOwogCi0JcHJpbnRrKCIjIyNDbG9uZSMjI1xuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgIiMjI0Nsb25lIyMjXG4iKTsKIAogCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwogfQpAQCAtMzQzLDkgKzM0Myw4IEBACiAJCQkJCSAgIFJUTVBfUEtUX1RBSUxfUEFERElORyk7CiAJaWYgKHBQYWNrZXQgPT0gTlVMTCkgewogCQkqcHBQYWNrZXQgPSBOVUxMOwotI2lmZGVmIERFQlVHCi0JCXByaW50aygiUlRNUEFsbG9jYXRlTmRpc1BhY2tldCBGYWlsXG4iKTsKLSNlbmRpZgorCQlwcl9kZXZlbCgiUlRNUEFsbG9jYXRlTmRpc1BhY2tldCBGYWlsXG4iKTsKKwogCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKIAl9CiAJLyogMi4gY2xvbmUgdGhlIGZyYW1lIGNvbnRlbnQgKi8KQEAgLTYwMSwxNSArNjAwLDE1IEBACiAJCXJldHVybjsKIAogCXB0ID0gcFNyY0J1ZlZBOwotCXByaW50aygiJXM6ICVwLCBsZW4gPSAlZFxuIiwgc3RyLCBwU3JjQnVmVkEsIFNyY0J1Zkxlbik7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlcCwgbGVuID0gJWRcbiIsIHN0ciwgcFNyY0J1ZlZBLCBTcmNCdWZMZW4pOwogCWZvciAoeCA9IDA7IHggPCBTcmNCdWZMZW47IHgrKykgewogCQlpZiAoeCAlIDE2ID09IDApCi0JCQlwcmludGsoIjB4JTA0eCA6ICIsIHgpOwotCQlwcmludGsoIiUwMnggIiwgKCh1bnNpZ25lZCBjaGFyKXB0W3hdKSk7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiMHglMDR4IDogIiwgeCk7CisJCXByaW50ayhLRVJOX0RFQlVHICIlMDJ4ICIsICgodW5zaWduZWQgY2hhcilwdFt4XSkpOwogCQlpZiAoeCAlIDE2ID09IDE1KQotCQkJcHJpbnRrKCJcbiIpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgIlxuIik7CiAJfQotCXByaW50aygiXG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiXG4iKTsKIH0KIAogLyoKQEAgLTc2NywxMyArNzY2LDEzIEBACiAJCS8qIFFPUyAqLwogCQlpZiAocFJ4QmxrLT5wSGVhZGVyLT5GQy5TdWJUeXBlICYgMHgwOCkgewogCQkJaGVhZGVyX2xlbiArPSAyOwotCQkJLyogRGF0YSBza2lwIFFPUyBjb250b3JsIGZpZWxkICovCisJCQkvKiBEYXRhIHNraXAgUU9TIGNvbnRyb2wgZmllbGQgKi8KIAkJCXBSeEJsay0+RGF0YVNpemUgLT0gMjsKIAkJfQogCQkvKiBPcmRlciBiaXQ6IEEtUmFsaW5rIG9yIEhUQysgKi8KIAkJaWYgKHBSeEJsay0+cEhlYWRlci0+RkMuT3JkZXIpIHsKIAkJCWhlYWRlcl9sZW4gKz0gNDsKLQkJCS8qIERhdGEgc2tpcCBIVEMgY29udG9ybCBmaWVsZCAqLworCQkJLyogRGF0YSBza2lwIEhUQyBjb250cm9sIGZpZWxkICovCiAJCQlwUnhCbGstPkRhdGFTaXplIC09IDQ7CiAJCX0KIAkJLyogQ29weSBIZWFkZXIgKi8KQEAgLTg1NCw3ICs4NTMsNyBAQAogCQkJCQkJCQkJIFJTU0kxLAogCQkJCQkJCQkJIFJTU0lfMSksCiAJCQkJICAgIENvbnZlcnRUb1Jzc2kocEFkLCBwUnhCbGstPnBSeFdJLT5SU1NJMiwKLQkJCQkJCSAgUlNTSV8yKSk7OworCQkJCQkJICBSU1NJXzIpKTsKIAogCXBoLT5zaWduYWwuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9zaWduYWw7CiAJcGgtPnNpZ25hbC5zdGF0dXMgPSAwOwpAQCAtOTI2LDcgKzkyNSw3IEBACiAJCSAgICByZXF1ZXN0X2lycShfcE9iai0+cGNpX2Rldi0+aXJxLCBydDI4NjBfaW50ZXJydXB0LCBTQV9TSElSUSwKIAkJCQkobmV0X2RldiktPm5hbWUsIChuZXRfZGV2KSk7CiAJCWlmIChyZXR2YWwgIT0gMCkKLQkJCXByaW50aygiUlQyODYwOiByZXF1ZXN0X2lycSAgRVJST1IoJWQpXG4iLCByZXR2YWwpOworCQkJcHJpbnRrKEtFUk5fRVJSICJydDI4NjA6IHJlcXVlc3RfaXJxICBFUlJPUiglZClcbiIsIHJldHZhbCk7CiAJfQogCiAJcmV0dXJuIHJldHZhbDsKQEAgLTEwMjIsNyArMTAyMSw3IEBACiAJfQogI2Vsc2UKIAlDSEVDS19QSURfTEVHQUxJVFkocFRhc2stPnRhc2tQSUQpIHsKLQkJcHJpbnRrKCJUZXJtaW5hdGUgdGhlIHRhc2soJXMpIHdpdGggcGlkKCVkKSFcbiIsCisJCXByaW50ayhLRVJOX0lORk8gIlRlcm1pbmF0ZSB0aGUgdGFzayglcykgd2l0aCBwaWQoJWQpIVxuIiwKIAkJICAgICAgIHBUYXNrLT50YXNrTmFtZSwgR0VUX1BJRF9OVU1CRVIocFRhc2stPnRhc2tQSUQpKTsKIAkJbWIoKTsKIAkJcFRhc2stPnRhc2tfa2lsbGVkID0gMTsKQEAgLTExNzUsNyArMTE3NCw3IEBACiAJbmV0X2RldiA9IHBOZXREZXY7CiAJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkLCBuZXRfZGV2KTsKIAotCS8qIHdvcmstYXJvdW5kIGZvciB0aGUgU3VTRSBkdWUgdG8gaXQgaGFzIGl0J3Mgb3duIGludGVyZmFjZSBuYW1lIG1hbmFnZW1lbnQgc3lzdGVtLiAqLworCS8qIHdvcmstYXJvdW5kIGZvciBTdVNFLCBkdWUgdG8gdGhlbSBoYXZpbmcgdGhlaXIgb3duIGludGVyZmFjZSBuYW1lIG1hbmFnZW1lbnQgc3lzdGVtLiAqLwogCXsKIAkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuZGV2X25hbWUsIDE2KTsKIAkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuZGV2X25hbWUsIG5ldF9kZXYtPm5hbWUsCkBAIC0xMzAwLDcgKzEyOTksNyBAQAogCWludCByZXQsIHJ0bmxfbG9ja2VkID0gRkFMU0U7CiAKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSdG1wT1NOZXREZXZBdHRhY2goKS0tLT5cbiIpKTsKLQkvKiBJZiB3ZSBuZWVkIGhvb2sgc29tZSBjYWxsYmFjayBmdW5jdGlvbiB0byB0aGUgbmV0IGRldmljZSBzdHJ1Y3RydWUsIG5vdyBkbyBpdC4gKi8KKwkvKiBJZiB3ZSBuZWVkIGhvb2sgc29tZSBjYWxsYmFjayBmdW5jdGlvbiB0byB0aGUgbmV0IGRldmljZSBzdHJ1Y3R1cmUsIG5vdyBkbyBpdC4gKi8KIAlpZiAocERldk9wSG9vaykgewogCQlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSBOVUxMOwogCkBAIC0xMzUxLDEwICsxMzUwLDEwIEBACiAJCXJldHVybiBOVUxMOwogCX0KIAotCS8qIGZpbmQgYSBhdmFpbGFibGUgaW50ZXJmYWNlIG5hbWUsIG1heCAzMiBpbnRlcmZhY2VzICovCisJLyogZmluZCBhbiBhdmFpbGFibGUgaW50ZXJmYWNlIG5hbWUsIG1heCAzMiBpbnRlcmZhY2VzICovCiAJc3RhdHVzID0gUnRtcE9TTmV0RGV2UmVxdWVzdE5hbWUocEFkLCBwTmV0RGV2LCBwTmFtZVByZWZpeCwgZGV2TnVtKTsKIAlpZiAoc3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKLQkJLyogZXJyb3IhIG5vIGFueSBhdmFpbGFibGUgcmEgbmFtZSBjYW4gYmUgdXNlZCEgKi8KKwkJLyogZXJyb3IhIG5vIGF2YWlsYWJsZSByYSBuYW1lIGNhbiBiZSB1c2VkISAqLwogCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKIAkJCSAoIkFzc2lnbiBpbnRlcmZhY2UgbmFtZSAoJXMgd2l0aCBzdWZmaXggMH4zMikgZmFpbGVkLi4uXG4iLAogCQkJICBwTmFtZVByZWZpeCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9saW51eC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9saW51eC5oCmluZGV4IDVhY2VkZjEuLjkyZmY1NDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfbGludXguaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2xpbnV4LmgKQEAgLTMwLDcgKzMwLDggQEAKICAgICBBYnN0cmFjdDoKIAogICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorICAgIFdobyAgICAgICAgICAJV2hlbiAgICAgICAgIAlXaGF0CisgICAgSnVzdGluIFAuIE1hdHRvY2sJMTEvMDcvMjAxMCAJRml4IHR5cG8gaW4gYSBjb21tZW50CiAgICAgLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KIApAQCAtNDIyLDExICs0MjMsNyBAQAogCiAjZGVmaW5lIERCR1BSSU5UKExldmVsLCBGbXQpICAgIERCR1BSSU5UX1JBVyhMZXZlbCwgRm10KQogCi0jZGVmaW5lIERCR1BSSU5UX0VSUihGbXQpICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcHJpbnRrKCJFUlJPUiEgIik7ICAgICAgICAgIFwKLSAgICBwcmludGsgRm10OyAgICAgICAgICAgICAgICAgIFwKLX0KKyNkZWZpbmUgREJHUFJJTlRfRVJSKGZtdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fRVJSIGZtdCwgIyNhcmdzKQogCiAjZGVmaW5lIERCR1BSSU5UX1MoU3RhdHVzLCBGbXQpCQlcCiB7CQkJCQkJCQkJXApAQCAtNzI2LDcgKzcyMyw3IEBACiAjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9NT1JFREFUQShfcCkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzddKQogCiAvKiAqLwotLyogICAgICBTZXBjaWZpYyBQYWtjZXQgVHlwZSBkZWZpbml0aW9uICovCisvKiAgICAgIFNwZWNpZmljIFBhY2tldCBUeXBlIGRlZmluaXRpb24gKi8KIC8qICovCiAjZGVmaW5lIFJUTVBfUEFDS0VUX1NQRUNJRklDX0NCX09GRlNFVAkxMQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X21haW5fZGV2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X21haW5fZGV2LmMKaW5kZXggYWQ2MGNlYS4uNzAxNTYxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9tYWluX2Rldi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfbWFpbl9kZXYuYwpAQCAtMzEsNyArMzEsOCBAQAogICAgIENyZWF0ZSBhbmQgcmVnaXN0ZXIgbmV0d29yayBpbnRlcmZhY2UuCiAKICAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgICBXaGF0CisgICAgV2hvICAgICAgICAgCVdoZW4gICAgICAgICAgICBXaGF0CisgICAgSnVzdGluIFAuIE1hdHRvY2sJMTEvMDcvMjAxMAlGaXggdHlwb3MgaW4gY29tbWVudHMKICAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KIApAQCAtMTAxLDggKzEwMiw4IEBACiAJCSAgICAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpIHsKIAkJCXN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSBEaXNSZXE7CiAJCQlzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpNc2dFbGVtID0KLQkJCSAgICAoc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0pLAotCQkJCQkJCU1FTV9BTExPQ19GTEFHKTsKKwkJCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtKSwKKwkJCQkJTUVNX0FMTE9DX0ZMQUcpOwogCiAJCQlpZiAoTXNnRWxlbSkgewogCQkJCUNPUFlfTUFDX0FERFIoRGlzUmVxLkFkZHIsCkBAIC0yMzQsNyArMjM1LDcgQEAKIAkJUlRNUFBDSWVMaW5rQ3RybFZhbHVlUmVzdG9yZShwQWQsIFJFU1RPUkVfQ0xPU0UpOwogI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCi0JCS8qIElmIGRpcnZlciBkb2Vzbid0IHdha2UgdXAgZmlybXdhcmUgaGVyZSwgKi8KKwkJLyogSWYgZHJpdmVyIGRvZXNuJ3Qgd2FrZSB1cCBmaXJtd2FyZSBoZXJlLCAqLwogCQkvKiBOSUNMb2FkRmlybXdhcmUgd2lsbCBoYW5nIGZvcmV2ZXIgd2hlbiBpbnRlcmZhY2UgaXMgdXAgYWdhaW4uICovCiAJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKSB7CiAJCQlBc2ljRm9yY2VXYWtldXAocEFkLCBUUlVFKTsKQEAgLTMxMCw4ICszMTEsOCBAQAogCQkJUlRNUF9BU0lDX0lOVEVSUlVQVF9ESVNBQkxFKHBBZCk7CiAJCX0KIAkJLyogUmVjZWl2ZSBwYWNrZXRzIHRvIGNsZWFyIERNQSBpbmRleCBhZnRlciBkaXNhYmxlIGludGVycnVwdC4gKi8KLQkJLypSVE1QSGFuZGxlUnhEb25lSW50ZXJydXB0KHBBZCk7ICovCi0JCS8qIHB1dCB0byByYWRpbyBvZmYgdG8gc2F2ZSBwb3dlciB3aGVuIGRyaXZlciB1bmxvYWQuICBBZnRlciByYWRpb29mZiwgY2FuJ3Qgd3JpdGUgL3JlYWQgcmVnaXN0ZXIuICBTbyBuZWVkIHRvIGZpbmlzaCBhbGwgKi8KKwkJLyogUlRNUEhhbmRsZVJ4RG9uZUludGVycnVwdChwQWQpOyAqLworCQkvKiBwdXQgcmFkaW8gb2ZmIHRvIHNhdmUgcG93ZXIgd2hlbiBkcml2ZXIgdW5sb2Fkcy4gIEFmdGVyIHJhZGlvb2ZmLCBjYW4ndCB3cml0ZS9yZWFkIHJlZ2lzdGVyLCBzbyBuZWVkIHRvIGZpbmlzaCBhbGwuICovCiAJCS8qIHJlZ2lzdGVyIGFjY2VzcyBiZWZvcmUgUmFkaW8gb2ZmLiAqLwogCiAJCWJyYyA9IFJUMjh4eFBjaUFzaWNSYWRpb09mZihwQWQsIFJUTVBfSEFMVCwgMCk7CkBAIC00MjAsNyArNDIxLDcgQEAKIAl7CiAJCXUzMiByZWcgPSAwOwogCQlSVE1QX0lPX1JFQUQzMihwQWQsIDB4MTMwMCwgJnJlZyk7CS8qIGNsZWFyIGdhcmJhZ2UgaW50ZXJydXB0cyAqLwotCQlwcmludGsoIjB4MTMwMCA9ICUwOHhcbiIsIHJlZyk7CisJCXByaW50ayhLRVJOX0RFQlVHICIweDEzMDAgPSAlMDh4XG4iLCByZWcpOwogCX0KIAogCXsKQEAgLTcyNCw3ICs3MjUsOCBAQAogaW50IEFkYXB0ZXJCbG9ja0FsbG9jYXRlTWVtb3J5KHZvaWQgKmhhbmRsZSwgdm9pZCAqKiBwcEFkKQogewogCi0JKnBwQWQgPSAodm9pZCAqKXZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIpKTsJLypwY2lfYWxsb2NfY29uc2lzdGVudChwY2lfZGV2LCBzaXplb2Yoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciksIHBoeV9hZGRyKTsgKi8KKwkqcHBBZCA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIpKTsKKwkvKiBwY2lfYWxsb2NfY29uc2lzdGVudChwY2lfZGV2LCBzaXplb2Yoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciksIHBoeV9hZGRyKTsgKi8KIAogCWlmICgqcHBBZCkgewogCQlOZGlzWmVyb01lbW9yeSgqcHBBZCwgc2l6ZW9mKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfcGNpX3JidXMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfcGNpX3JidXMuYwppbmRleCAzMDA0YmU2Li5lNWZiNjdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X3BjaV9yYnVzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9wY2lfcmJ1cy5jCkBAIC0zMSw3ICszMSw4IEBACiAgICAgQ3JlYXRlIGFuZCByZWdpc3RlciBuZXR3b3JrIGludGVyZmFjZS4KIAogICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICAgIFdoYXQKKyAgICBXaG8gICAgICAgICAJV2hlbiAgICAgICAgICAgIFdoYXQKKyAgICBKdXN0aW4gUC4gTWF0dG9jawkxMS8wNy8yMDEwCUZpeCBhIHR5cG8KICAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KIApAQCAtMzU2LDcgKzM1Nyw3IEBACiAKIAlSVE1QSGFuZGxlTWdtdFJpbmdEbWFEb25lSW50ZXJydXB0KHBBZCk7CiAKLQkvKiBpZiB5b3UgdXNlIFJUTVBfU0VNX0xPQ0ssIHNvbWV0aW1lcyBrZXJuZWwgd2lsbCBoYW5nIHVwLCBubyBhbnkgKi8KKwkvKiBpZiB5b3UgdXNlIFJUTVBfU0VNX0xPQ0ssIHNvbWV0aW1lcyBrZXJuZWwgd2lsbCBoYW5nIHVwLCB3aXRob3V0IGFueSAqLwogCS8qIGJ1ZyByZXBvcnQgb3V0cHV0ICovCiAJUlRNUF9JTlRfTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwogCS8qCkBAIC03ODcsNyArNzg4LDcgQEAKIH0KIAogLyoKLSAqIGludmFpbGQgb3Igd3JpdGViYWNrIGNhY2hlCisgKiBpbnZhbGlkIG9yIHdyaXRlYmFjayBjYWNoZQogICogYW5kIGNvbnZlcnQgdmlydHVhbCBhZGRyZXNzIHRvIHBoeXNpY2FsIGFkZHJlc3MKICAqLwogZG1hX2FkZHJfdCBsaW51eF9wY2lfbWFwX3NpbmdsZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHZvaWQgKnB0ciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfdXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X3VzYi5jCmluZGV4IGJjZmMwZjUuLmViMDM3ZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfdXNiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF91c2IuYwpAQCAtMzIsNyArMzIsOCBAQAogCVJldmlzaW9uIEhpc3Rvcnk6CiAJV2hvCQkJV2hlbgkJV2hhdAogCS0tLS0tLS0tCS0tLS0tLS0tLS0JLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCU5hbWUJCURhdGUJCU1vZGlmaWNhdGlvbiBsb2dzCisJTmFtZQkJCURhdGUJCU1vZGlmaWNhdGlvbiBsb2dzCisJSnVzdGluIFAuIE1hdHRvY2sJMTEvMDcvMjAxMAlGaXggc29tZSB0eXBvcy4KIAogKi8KIApAQCAtNDAsMjUgKzQxLDI1IEBACiAKIHZvaWQgZHVtcF91cmIoc3RydWN0IHVyYiAqcHVyYikKIHsKLQlwcmludGsoInVyYiAgICAgICAgICAgICAgICAgIDoweCUwOGx4XG4iLCAodW5zaWduZWQgbG9uZylwdXJiKTsKLQlwcmludGsoIlx0ZGV2ICAgICAgICAgICAgICAgICAgIDoweCUwOGx4XG4iLCAodW5zaWduZWQgbG9uZylwdXJiLT5kZXYpOwotCXByaW50aygiXHRcdGRldi0+c3RhdGUgICAgICAgICAgOjB4JWRcbiIsIHB1cmItPmRldi0+c3RhdGUpOwotCXByaW50aygiXHRwaXBlICAgICAgICAgICAgICAgICAgOjB4JTA4eFxuIiwgcHVyYi0+cGlwZSk7Ci0JcHJpbnRrKCJcdHN0YXR1cyAgICAgICAgICAgICAgICA6JWRcbiIsIHB1cmItPnN0YXR1cyk7Ci0JcHJpbnRrKCJcdHRyYW5zZmVyX2ZsYWdzICAgICAgICA6MHglMDh4XG4iLCBwdXJiLT50cmFuc2Zlcl9mbGFncyk7Ci0JcHJpbnRrKCJcdHRyYW5zZmVyX2J1ZmZlciAgICAgICA6MHglMDhseFxuIiwKKwlwcmludGsoS0VSTl9ERUJVRyAidXJiICAgICAgICAgICAgICAgICAgOjB4JTA4bHhcbiIsICh1bnNpZ25lZCBsb25nKXB1cmIpOworCXByaW50ayhLRVJOX0RFQlVHICJcdGRldiAgICAgICAgICAgICAgICAgICA6MHglMDhseFxuIiwgKHVuc2lnbmVkIGxvbmcpcHVyYi0+ZGV2KTsKKwlwcmludGsoS0VSTl9ERUJVRyAiXHRcdGRldi0+c3RhdGUgICAgICAgICAgOjB4JWRcbiIsIHB1cmItPmRldi0+c3RhdGUpOworCXByaW50ayhLRVJOX0RFQlVHICJcdHBpcGUgICAgICAgICAgICAgICAgICA6MHglMDh4XG4iLCBwdXJiLT5waXBlKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiXHRzdGF0dXMgICAgICAgICAgICAgICAgOiVkXG4iLCBwdXJiLT5zdGF0dXMpOworCXByaW50ayhLRVJOX0RFQlVHICJcdHRyYW5zZmVyX2ZsYWdzICAgICAgICA6MHglMDh4XG4iLCBwdXJiLT50cmFuc2Zlcl9mbGFncyk7CisJcHJpbnRrKEtFUk5fREVCVUcgIlx0dHJhbnNmZXJfYnVmZmVyICAgICAgIDoweCUwOGx4XG4iLAogCSAgICAgICAodW5zaWduZWQgbG9uZylwdXJiLT50cmFuc2Zlcl9idWZmZXIpOwotCXByaW50aygiXHR0cmFuc2Zlcl9idWZmZXJfbGVuZ3RoOiVkXG4iLCBwdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoKTsKLQlwcmludGsoIlx0YWN0dWFsX2xlbmd0aCAgICAgICAgIDolZFxuIiwgcHVyYi0+YWN0dWFsX2xlbmd0aCk7Ci0JcHJpbnRrKCJcdHNldHVwX3BhY2tldCAgICAgICAgICA6MHglMDhseFxuIiwKKwlwcmludGsoS0VSTl9ERUJVRyAiXHR0cmFuc2Zlcl9idWZmZXJfbGVuZ3RoOiVkXG4iLCBwdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiXHRhY3R1YWxfbGVuZ3RoICAgICAgICAgOiVkXG4iLCBwdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiXHRzZXR1cF9wYWNrZXQgICAgICAgICAgOjB4JTA4bHhcbiIsCiAJICAgICAgICh1bnNpZ25lZCBsb25nKXB1cmItPnNldHVwX3BhY2tldCk7Ci0JcHJpbnRrKCJcdHN0YXJ0X2ZyYW1lICAgICAgICAgICA6JWRcbiIsIHB1cmItPnN0YXJ0X2ZyYW1lKTsKLQlwcmludGsoIlx0bnVtYmVyX29mX3BhY2tldHMgICAgIDolZFxuIiwgcHVyYi0+bnVtYmVyX29mX3BhY2tldHMpOwotCXByaW50aygiXHRpbnRlcnZhbCAgICAgICAgICAgICAgOiVkXG4iLCBwdXJiLT5pbnRlcnZhbCk7Ci0JcHJpbnRrKCJcdGVycm9yX2NvdW50ICAgICAgICAgICA6JWRcbiIsIHB1cmItPmVycm9yX2NvdW50KTsKLQlwcmludGsoIlx0Y29udGV4dCAgICAgICAgICAgICAgIDoweCUwOGx4XG4iLAorCXByaW50ayhLRVJOX0RFQlVHICJcdHN0YXJ0X2ZyYW1lICAgICAgICAgICA6JWRcbiIsIHB1cmItPnN0YXJ0X2ZyYW1lKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiXHRudW1iZXJfb2ZfcGFja2V0cyAgICAgOiVkXG4iLCBwdXJiLT5udW1iZXJfb2ZfcGFja2V0cyk7CisJcHJpbnRrKEtFUk5fREVCVUcgIlx0aW50ZXJ2YWwgICAgICAgICAgICAgIDolZFxuIiwgcHVyYi0+aW50ZXJ2YWwpOworCXByaW50ayhLRVJOX0RFQlVHICJcdGVycm9yX2NvdW50ICAgICAgICAgICA6JWRcbiIsIHB1cmItPmVycm9yX2NvdW50KTsKKwlwcmludGsoS0VSTl9ERUJVRyAiXHRjb250ZXh0ICAgICAgICAgICAgICAgOjB4JTA4bHhcbiIsCiAJICAgICAgICh1bnNpZ25lZCBsb25nKXB1cmItPmNvbnRleHQpOwotCXByaW50aygiXHRjb21wbGV0ZSAgICAgICAgICAgICAgOjB4JTA4bHhcblxuIiwKKwlwcmludGsoS0VSTl9ERUJVRyAiXHRjb21wbGV0ZSAgICAgICAgICAgICAgOjB4JTA4bHhcblxuIiwKIAkgICAgICAgKHVuc2lnbmVkIGxvbmcpcHVyYi0+Y29tcGxldGUpOwogfQogCkBAIC0yNzksNyArMjgwLDcgQEAKIAkgICAgJiYgIVJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwKIAkJCQkgICAgIChmUlRVU0JfQlVMS19PVVRfREFUQV9GUkFHIDw8CiAJCQkJICAgICAgQnVsa091dFBpcGVJZCkpKSB7Ci0JCS8qIEluZGljYXRlIFRoZXJlIGlzIGRhdGEgYXZhbGlhYmxlICovCisJCS8qIEluZGljYXRlIFRoZXJlIGlzIGRhdGEgYXZhaWxhYmxlICovCiAJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLAogCQkJCSAgICAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMIDw8CiAJCQkJICAgICBCdWxrT3V0UGlwZUlkKSk7CkBAIC0zMzUsNyArMzM2LDcgQEAKIAl9CiAKIAkvKiBBbHdheXMgY2FsbCBCdWxrIHJvdXRpbmUsIGV2ZW4gcmVzZXQgYnVsay4gKi8KLQkvKiBUaGUgcHJvdGVjdGlvb24gb2YgcmVzdCBidWxrIHNob3VsZCBiZSBpbiBCdWxrT3V0IHJvdXRpbmUgKi8KKwkvKiBUaGUgcHJvdGVjdGlvbiBvZiByZXN0IGJ1bGsgc2hvdWxkIGJlIGluIEJ1bGtPdXQgcm91dGluZSAqLwogCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKIH0KIApAQCAtMzgzLDcgKzM4NCw3IEBACiAJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW3BSVFNDb250ZXh0LT5CdWxrT3V0UGlwZUlkXSk7CiAKIAkvKiBBbHdheXMgY2FsbCBCdWxrIHJvdXRpbmUsIGV2ZW4gcmVzZXQgYnVsay4gKi8KLQkvKiBUaGUgcHJvdGVjdGlvb24gb2YgcmVzdCBidWxrIHNob3VsZCBiZSBpbiBCdWxrT3V0IHJvdXRpbmUgKi8KKwkvKiBUaGUgcHJvdGVjdGlvbiBvZiByZXN0IGJ1bGsgc2hvdWxkIGJlIGluIEJ1bGtPdXQgcm91dGluZSAqLwogCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKIAogfQpAQCAtNDI3LDcgKzQyOCw3IEBACiAJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdKTsKIAogCS8qIEFsd2F5cyBjYWxsIEJ1bGsgcm91dGluZSwgZXZlbiByZXNldCBidWxrLiAqLwotCS8qIFRoZSBwcm90ZWN0aW9vbiBvZiByZXN0IGJ1bGsgc2hvdWxkIGJlIGluIEJ1bGtPdXQgcm91dGluZSAqLworCS8qIFRoZSBwcm90ZWN0aW9uIG9mIHJlc3QgYnVsayBzaG91bGQgYmUgaW4gQnVsa091dCByb3V0aW5lICovCiAJUlRVU0JLaWNrQnVsa091dChwQWQpOwogCiB9CkBAIC01NzUsNyArNTc2LDcgQEAKIAkJfSBlbHNlIHsKIAogCQkJLyogQWx3YXlzIGNhbGwgQnVsayByb3V0aW5lLCBldmVuIHJlc2V0IGJ1bGsuICovCi0JCQkvKiBUaGUgcHJvdGVjdGlvb24gb2YgcmVzdCBidWxrIHNob3VsZCBiZSBpbiBCdWxrT3V0IHJvdXRpbmUgKi8KKwkJCS8qIFRoZSBwcm90ZWN0aW9uIG9mIHJlc3QgYnVsayBzaG91bGQgYmUgaW4gQnVsa091dCByb3V0aW5lICovCiAJCQlpZiAocEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA8CiAJCQkgICAgTUdNVF9SSU5HX1NJWkUKIAkJCSAgICAvKiBwTUxNRUNvbnRleHQtPmJXYWl0aW5nQnVsa091dCA9PSBUUlVFICovKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcC5oCmluZGV4IGNhNTRlNTMuLjcwZGFhYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcC5oCkBAIC0zMSwxMSArMzEsMTIgQEAKICAgICBNaW5pcG9ydCBnZW5lcmljIHBvcnRpb24gaGVhZGVyIGZpbGUKIAogICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisgICAgV2hvICAgICAgICAgCVdoZW4gICAgICAgICAgCVdoYXQKICAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBQYXVsIExpbiAgICAyMDAyLTA4LTAxICAgIGNyZWF0ZWQKLSAgICBKYW1lcyBUYW4gICAyMDAyLTA5LTA2ICAgIG1vZGlmaWVkIChSZXZpc2UgTlRDUmVnVGFibGUpCi0gICAgSm9obiBDaGFuZyAgMjAwNC0wOS0wNiAgICBtb2RpZmllZCBmb3IgUlQyNjAwCisgICAgUGF1bCBMaW4gICAgCTIwMDItMDgtMDEgICAgCWNyZWF0ZWQKKyAgICBKYW1lcyBUYW4gICAJMjAwMi0wOS0wNiAgICAJbW9kaWZpZWQgKFJldmlzZSBOVENSZWdUYWJsZSkKKyAgICBKb2huIENoYW5nICAJMjAwNC0wOS0wNiAgICAJbW9kaWZpZWQgZm9yIFJUMjYwMAorICAgIEp1c3RpbiBQLiBNYXR0b2NrCTExLzA3LzIwMTAJRml4IHNvbWUgdHlwb3MKICovCiAjaWZuZGVmIF9fUlRNUF9IX18KICNkZWZpbmUgX19SVE1QX0hfXwpAQCAtMzM3LDcgKzMzOCw3IEBACiAjZGVmaW5lIExFQVBfT04oX3ApICAgICAgICAgICAgICAgICAoKChfcCktPlN0YUNmZy5MZWFwQXV0aE1vZGUpID09IENJU0NPX0F1dGhNb2RlTEVBUCkKICNkZWZpbmUgTEVBUF9DQ0tNX09OKF9wKSAgICAgICAgICAgICgoKChfcCktPlN0YUNmZy5MZWFwQXV0aE1vZGUpID09IENJU0NPX0F1dGhNb2RlTEVBUCkgJiYgKChfcCktPlN0YUNmZy5MZWFwQXV0aEluZm8uQ0NLTSA9PSBUUlVFKSkKIAotLyogaWYgb3JnaW5hbCBFdGhlcm5ldCBmcmFtZSBjb250YWlucyBubyBMTEMvU05BUCwgdGhlbiBhbiBleHRyYSBMTEMvU05BUCBlbmNhcCBpcyByZXF1aXJlZCAqLworLyogaWYgb3JpZ2luYWwgRXRoZXJuZXQgZnJhbWUgY29udGFpbnMgbm8gTExDL1NOQVAsIHRoZW4gYW4gZXh0cmEgTExDL1NOQVAgZW5jYXAgaXMgcmVxdWlyZWQgKi8KICNkZWZpbmUgRVhUUkFfTExDU05BUF9FTkNBUF9GUk9NX1BLVF9TVEFSVChfcEJ1ZlZBLCBfcEV4dHJhTGxjU25hcEVuY2FwKQkJXAogewkJCQkJCQkJCQkJCQkJCQlcCiAJaWYgKCgoKihfcEJ1ZlZBICsgMTIpIDw8IDgpICsgKihfcEJ1ZlZBICsgMTMpKSA+IDE1MDApIHsJXApAQCAtNDY2LDcgKzQ2Nyw3IEBACiAvKiBDb250cm9sIGJsb2NrIChEZXNjcmlwdG9yKSBmb3IgYWxsIHJpbmcgZGVzY3JpcHRvciBETUEgb3BlcmF0aW9uLCBidWZmZXIgbXVzdCBiZSAqLwogLyogY29udGlndW91cyBwaHlzaWNhbCBtZW1vcnkuIGNoYXIgc3RvcmVkIHRoZSBiaW5kaW5nIFJ4IHBhY2tldCBkZXNjcmlwdG9yICovCiAvKiB3aGljaCB3b24ndCBiZSByZWxlYXNlZCwgZHJpdmVyIGhhcyB0byB3YWl0IHVudGlsIHVwcGVyIGxheWVyIHJldHVybiB0aGUgcGFja2V0ICovCi0vKiBiZWZvcmUgZ2l2ZWluZyB1cCB0aGlzIHJ4IHJpbmcgZGVzY3JpcHRvciB0byBBU0lDLiBORElTX0JVRkZFUiBpcyBhc3NvY2FpdGVkIHBhaXIgKi8KKy8qIGJlZm9yZSBnaXZpbmcgdXAgdGhpcyByeCByaW5nIGRlc2NyaXB0b3IgdG8gQVNJQy4gTkRJU19CVUZGRVIgaXMgYXNzb2NpYXRlZCBwYWlyICovCiAvKiB0byBkZXNjcmliZSB0aGUgcGFja2V0IGJ1ZmZlci4gRm9yIFR4LCBjaGFyIHN0b3JlZCB0aGUgdHggcGFja2V0IGRlc2NyaXB0b3IgKi8KIC8qIHdoaWNoIGRyaXZlciBzaG91bGQgQUNLIHVwcGVyIGxheWVyIHdoZW4gdGhlIHR4IGlzIHBoeXNpY2FsbHkgZG9uZSBvciBmYWlsZWQuICovCiAvKiAqLwpAQCAtNjAyLDcgKzYwMyw3IEBACiB9OwogCiBzdHJ1Y3QgcnRfY291bnRlcl9kcnMgewotCS8qIHRvIHJlY29yZCB0aGUgZWFjaCBUWCByYXRlJ3MgcXVhbGl0eS4gMCBpcyBiZXN0LCB0aGUgYmlnZ2VyIHRoZSB3b3JzZS4gKi8KKwkvKiByZWNvcmQgZWFjaCBUWCByYXRlJ3MgcXVhbGl0eS4gMCBpcyBiZXN0LCB0aGUgYmlnZ2VyIHRoZSB3b3JzZS4gKi8KIAl1MTYgVHhRdWFsaXR5W01BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIXTsKIAl1OCBQRVJbTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0hdOwogCXU4IFR4UmF0ZVVwUGVuYWx0eTsJLyogZXh0cmEgIyBvZiBzZWNvbmQgcGVuYWx0eSBkdWUgdG8gbGFzdCB1bnN0YWJsZSBjb25kaXRpb24gKi8KQEAgLTcxOSw3ICs3MjAsNyBAQAogLyogUGFja2V0IGluZm9ybWF0aW9uIGZvciBOZGlzUXVlcnlQYWNrZXQgKi8KIC8qICovCiBzdHJ1Y3QgcnRfcGFja2V0X2luZm8gewotCXUzMiBQaHlzaWNhbEJ1ZmZlckNvdW50OwkvKiBQaHlzaWNhbCBicmVha3Mgb2YgYnVmZmVyIGRlc2NyaXBvciBjaGFpbmVkICovCisJdTMyIFBoeXNpY2FsQnVmZmVyQ291bnQ7CS8qIFBoeXNpY2FsIGJyZWFrcyBvZiBidWZmZXIgZGVzY3JpcHRvciBjaGFpbmVkICovCiAJdTMyIEJ1ZmZlckNvdW50OwkvKiBOdW1iZXIgb2YgQnVmZmVyIGRlc2NyaXB0b3IgY2hhaW5lZCAqLwogCXUzMiBUb3RhbFBhY2tldExlbmd0aDsJLyogU2VsZiBleHBsYWluZWQgKi8KIAljaGFyICpwRmlyc3RCdWZmZXI7CS8qIFBvaW50ZXIgdG8gZmlyc3QgYnVmZmVyIGRlc2NyaXB0b3IgKi8KQEAgLTg0Niw4ICs4NDcsOCBAQAogLyogUG93ZXIgc2F2ZSBtZXRob2QgY29udHJvbCAqLwogdHlwZWRlZiB1bmlvbiBfUFNfQ09OVFJPTCB7CiAJc3RydWN0IHsKLQkJdW5zaWduZWQgbG9uZyBFbmFibGVQU2luSWRsZToxOwkvKiBFbmFibGUgcmFkaW8gb2ZmIHdoZW4gbm90IGNvbm5lY3QgdG8gQVAuIHJhZGlvIG9uIG9ubHkgd2hlbiBzaXRlc3VydmV5LCAqLwotCQl1bnNpZ25lZCBsb25nIEVuYWJsZU5ld1BTOjE7CS8qIEVuYWJsZSBuZXcgIENoaXAgcG93ZXIgc2F2ZSBmdWNudGlvbiAuIE5ldyBtZXRob2QgY2FuIG9ubHkgYmUgYXBwbGllZCBpbiBjaGlwIHZlcnNpb24gYWZ0ZXIgMjg3Mi4gYW5kIFBDSWUuICovCisJCXVuc2lnbmVkIGxvbmcgRW5hYmxlUFNpbklkbGU6MTsJLyogRW5hYmxlIHJhZGlvIG9mZiB3aGVuIG5vdCBjb25uZWN0ZWQgdG8gQVAuIHJhZGlvIG9uIG9ubHkgd2hlbiBzaXRlc3VydmV5LCAqLworCQl1bnNpZ25lZCBsb25nIEVuYWJsZU5ld1BTOjE7CS8qIEVuYWJsZSBuZXcgIENoaXAgcG93ZXIgc2F2ZSBmdW5jdGlvbiAuIE5ldyBtZXRob2QgY2FuIG9ubHkgYmUgYXBwbGllZCBpbiBjaGlwIHZlcnNpb24gYWZ0ZXIgMjg3Mi4gYW5kIFBDSWUuICovCiAJCXVuc2lnbmVkIGxvbmcgcnQzMHh4UG93ZXJNb2RlOjI7CS8qIFBvd2VyIExldmVsIE1vZGUgZm9yIHJ0MzB4eCBjaGlwICovCiAJCXVuc2lnbmVkIGxvbmcgcnQzMHh4Rm9sbG93SG9zdEFTUE06MTsJLyogQ2FyZCBGb2xsb3dzIEhvc3QncyBzZXR0aW5nIGZvciBydDMweHggY2hpcC4gKi8KIAkJdW5zaWduZWQgbG9uZyBydDMweHhGb3JjZUFTUE1UZXN0OjE7CS8qIEZvcmNlIGVuYWJsZSBMMSBmb3IgcnQzMHh4IGNoaXAuIFRoaXMgaGFzIGhpZ2hlciBwcmlvcml0eSB0aGFuIHJ0MzB4eEZvbGxvd0hvc3RBU1BNIE1vZGUuICovCkBAIC0xMTE3LDggKzExMTgsOCBAQAogCXVuc2lnbmVkIGxvbmcgVGltSUVMb2NhdGlvbkluQmVhY29uW0hXX0JFQUNPTl9NQVhfQ09VTlRdOwogCXVuc2lnbmVkIGxvbmcgQ2FwYWJpbGl0eUluZm9Mb2NhdGlvbkluQmVhY29uW0hXX0JFQUNPTl9NQVhfQ09VTlRdOwogCUJPT0xFQU4gRW5hYmxlQmVhY29uOwkvKiB0cmlnZ2VyIHRvIGVuYWJsZSBiZWFjb24gdHJhbnNtaXNzaW9uLiAqLwotCXU4IEJlYWNvbkJpdE1hcDsJLyogTk9URTogSWYgdGhlIE1BWF9NQlNTSURfTlVNIGlzIGxhcmdlciB0aGFuIDgsIHRoaXMgcGFyYW1ldGVyIG5lZWQgdG8gY2hhbmdlLiAqLwotCXU4IER0aW1CaXRPbjsJLyogTk9URTogSWYgdGhlIE1BWF9NQlNTSURfTlVNIGlzIGxhcmdlciB0aGFuIDgsIHRoaXMgcGFyYW1ldGVyIG5lZWQgdG8gY2hhbmdlLiAqLworCXU4IEJlYWNvbkJpdE1hcDsJLyogTk9URTogSWYgdGhlIE1BWF9NQlNTSURfTlVNIGlzIGxhcmdlciB0aGFuIDgsIHRoaXMgcGFyYW1ldGVyIG5lZWRzIHRvIGNoYW5nZS4gKi8KKwl1OCBEdGltQml0T247CS8qIE5PVEU6IElmIHRoZSBNQVhfTUJTU0lEX05VTSBpcyBsYXJnZXIgdGhhbiA4LCB0aGlzIHBhcmFtZXRlciBuZWVkcyB0byBjaGFuZ2UuICovCiB9OwogI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLwogCkBAIC0xMjExLDcgKzEyMTIsNyBAQAogCS8qQk9PTEVBTiAgICAgICAgICAgICAgIGJBdXRvVHhSYXRlU3dpdGNoOyAqLwogCXU4IE1pblR4UmF0ZTsJLyogUkFURV8xLCBSQVRFXzIsIFJBVEVfNV81LCBSQVRFXzExICovCiAJdTggUnRzUmF0ZTsJCS8qIFJBVEVfeHh4ICovCi0JSFRUUkFOU01JVF9TRVRUSU5HIE1sbWVUcmFuc21pdDsJLyogTUdNVCBmcmFtZSBQSFkgcmF0ZSBzZXR0aW5nIHdoZW4gb3BlcmF0aW4gYXQgSHQgcmF0ZS4gKi8KKwlIVFRSQU5TTUlUX1NFVFRJTkcgTWxtZVRyYW5zbWl0OwkvKiBNR01UIGZyYW1lIFBIWSByYXRlIHNldHRpbmcgd2hlbiBvcGVyYXRpb24gYXQgSHQgcmF0ZS4gKi8KIAl1OCBNbG1lUmF0ZTsJCS8qIFJBVEVfeHh4LCB1c2VkIHRvIHNlbmQgTUxNRSBmcmFtZXMgKi8KIAl1OCBCYXNpY01sbWVSYXRlOwkvKiBEZWZhdWx0IFJhdGUgZm9yIHNlbmRpbmcgTUxNRSBmcmFtZXMgKi8KIApAQCAtMTI2NCw3ICsxMjY1LDcgQEAKIAlzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eV9pZSBIdENhcGFiaWxpdHk7CiAJc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llIEFkZEhUSW5mbzsJLyogVXNlZnVsIGFzIEFQLiAqLwogCS8qVGhpcyBJRSBpcyB1c2VkIHdpdGggY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IGVsZW1lbnQgd2hlbiBjaGFuZ2luZyB0byBhIG5ldyA0ME1Iei4gKi8KLQkvKlRoaXMgSUUgaXMgaW5jbHVkZWQgaW4gY2hhbm5lbCBzd2l0Y2ggYW1tb3VuY2VtZW50IGZyYW1lcyA3LjQuMS41LCBiZWFjb25zLCBwcm9iZSBSc3AuICovCisJLypUaGlzIElFIGlzIGluY2x1ZGVkIGluIGNoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudCBmcmFtZXMgNy40LjEuNSwgYmVhY29ucywgcHJvYmUgUnNwLiAqLwogCXN0cnVjdCBydF9uZXdfZXh0X2NoYW5faWUgTmV3RXh0Q2hhbk9mZnNldDsJLyo3LjMuMi4yMEEsIDEgaWYgZXh0ZW5zaW9uIGNoYW5uZWwgaXMgYWJvdmUgdGhlIGNvbnRyb2wgY2hhbm5lbCwgMyBpZiBiZWxvdywgMCBpZiBub3QgcHJlc2VudCAqLwogCiAJQk9PTEVBTiBiSFRQcm90ZWN0OwpAQCAtMTMyOSw3ICsxMzMwLDcgQEAKIAkvKiBHUk9VUCAxIC0gKi8KIAkvKiAgIFVzZXIgY29uZmlndXJhdGlvbiBsb2FkZWQgZnJvbSBSZWdpc3RyeSwgRTJQUk9NIG9yIE9JRF94eHguIFRoZXNlIHNldHRpbmdzIGRlc2NyaWJlICovCiAJLyogICB0aGUgdXNlciBpbnRlbmRlZCBjb25maWd1cmF0aW9uLCBidXQgbm90IG5lY2Vzc2FyeSBmdWxseSBlcXVhbCB0byB0aGUgZmluYWwgKi8KLQkvKiAgIHNldHRpbmdzIGluIEFDVElWRSBCU1MgYWZ0ZXIgbmVnb3RpYXRpb24vY29tcHJvbWl6ZSB3aXRoIHRoZSBCU1MgaG9sZGVyIChlaXRoZXIgKi8KKwkvKiAgIHNldHRpbmdzIGluIEFDVElWRSBCU1MgYWZ0ZXIgbmVnb3RpYXRpb24vY29tcHJvbWlzZSB3aXRoIHRoZSBCU1MgaG9sZGVyIChlaXRoZXIgKi8KIAkvKiAgIEFQIG9yIElCU1MgaG9sZGVyKS4gKi8KIAkvKiAgIE9uY2UgaW5pdGlhbGl6ZWQsIHVzZXIgY29uZmlndXJhdGlvbiBjYW4gb25seSBiZSBjaGFuZ2VkIHZpYSBPSURfeHh4ICovCiAJdTggQnNzVHlwZTsJCS8qIEJTU19JTkZSQSBvciBCU1NfQURIT0MgKi8KQEAgLTEzODYsMTIgKzEzODcsMTIgQEAKIAogCS8qIEZvciBXUEEgY291bnRlcm1lYXN1cmVzICovCiAJdW5zaWduZWQgbG9uZyBMYXN0TWljRXJyb3JUaW1lOwkvKiByZWNvcmQgbGFzdCBNSUMgZXJyb3IgdGltZSAqLwotCXVuc2lnbmVkIGxvbmcgTWljRXJyQ250OwkvKiBTaG91bGQgYmUgMCwgMSwgMiwgdGhlbiByZXNldCB0byB6ZXJvIChhZnRlciBkaXNhc3NvaWNpYXRpb24pLiAqLworCXVuc2lnbmVkIGxvbmcgTWljRXJyQ250OwkvKiBTaG91bGQgYmUgMCwgMSwgMiwgdGhlbiByZXNldCB0byB6ZXJvIChhZnRlciBkaXNhc3NvY2lhdGlvbikuICovCiAJQk9PTEVBTiBiQmxvY2tBc3NvYzsJLyogQmxvY2sgYXNzb2NpYXRlIGF0dGVtcHQgZm9yIDYwIHNlY29uZHMgYWZ0ZXIgY291bnRlciBtZWFzdXJlIG9jY3VycmVkLiAqLwogCS8qIEZvciBXUEEtUFNLIHN1cHBsaWNhbnQgc3RhdGUgKi8KIAlXUEFfU1RBVEUgV3BhU3RhdGU7CS8qIERlZmF1bHQgaXMgU1NfTk9UVVNFIGFuZCBoYW5kbGVkIGJ5IG1pY3Jvc29mdCA4MDIuMXggKi8KIAl1OCBSZXBsYXlDb3VudGVyWzhdOwotCXU4IEFOb25jZVszMl07CS8qIEFOb25jZSBmb3IgV1BBLVBTSyBmcm9tIGF1cmhlbnRpY2F0b3IgKi8KKwl1OCBBTm9uY2VbMzJdOwkvKiBBTm9uY2UgZm9yIFdQQS1QU0sgZnJvbSBhdWhlbnRpY2F0b3IgKi8KIAl1OCBTTm9uY2VbMzJdOwkvKiBTTm9uY2UgZm9yIFdQQS1QU0sgKi8KIAogCXU4IExhc3RTTlIwOwkJLyogbGFzdCByZWNlaXZlZCBCRUFDT04ncyBTTlIgKi8KQEAgLTE0MjMsNyArMTQyNCw3IEBACiAJdTggUlNOSUVfTGVuOwogCXU4IFJTTl9JRVtNQVhfTEVOX09GX1JTTklFXTsJLyogVGhlIGNvbnRlbnQgc2F2ZWQgaGVyZSBzaG91bGQgYmUgbGl0dGxlLWVuZGlhbiBmb3JtYXQuICovCiAKLQl1bnNpZ25lZCBsb25nIENMQnVzeUJ5dGVzOwkvKiBTYXZlIHRoZSB0b3RhbCBieXRlcyByZWNlaXZlZCBkdXJuaW5nIGNoYW5uZWwgbG9hZCBzY2FuIHRpbWUgKi8KKwl1bnNpZ25lZCBsb25nIENMQnVzeUJ5dGVzOwkvKiBTYXZlIHRoZSB0b3RhbCBieXRlcyByZWNlaXZlZCBkdXJpbmcgY2hhbm5lbCBsb2FkIHNjYW4gdGltZSAqLwogCXUxNiBSUElEZW5zaXR5WzhdOwkvKiBBcnJheSBmb3IgUlBJIGRlbnNpdHkgY29sbGVjdGlvbiAqLwogCiAJdTggUk1SZXFDbnQ7CQkvKiBOdW1iZXIgb2YgbWVhc3VyZW1lbnQgcmVxdWVzdCBzYXZlZC4gKi8KQEAgLTE0ODksOSArMTQ5MCw5IEBACiAJQk9PTEVBTiBiRm9yY2VUeEJ1cnN0OwkvKiAxOiBmb3JjZSBlbmJsZSBUWCBQQUNLRVQgQlVSU1QsIDA6IGRpc2FibGUgKi8KIH07CiAKLS8qIFRoaXMgZGF0YSBzdHJ1Y3R1cmUga2VlcCB0aGUgY3VycmVudCBhY3RpdmUgQlNTL0lCU1MncyBjb25maWd1cmF0aW9uIHRoYXQgdGhpcyBTVEEgKi8KKy8qIFRoaXMgZGF0YSBzdHJ1Y3R1cmUga2VlcHMgdGhlIGN1cnJlbnQgYWN0aXZlIEJTUy9JQlNTJ3MgY29uZmlndXJhdGlvbiB0aGF0IHRoaXMgU1RBICovCiAvKiBoYWQgYWdyZWVkIHVwb24gam9pbmluZyB0aGUgbmV0d29yay4gV2hpY2ggbWVhbnMgdGhlc2UgcGFyYW1ldGVycyBhcmUgdXN1YWxseSBkZWNpZGVkICovCi0vKiBieSB0aGUgQlNTL0lCU1MgY3JlYXRvciBpbnN0ZWFkIG9mIHVzZXIgY29uZmlndXJhdGlvbi4gRGF0YSBpbiB0aGlzIGRhdGEgc3RydWN0dXJyZSAqLworLyogYnkgdGhlIEJTUy9JQlNTIGNyZWF0b3IgaW5zdGVhZCBvZiB1c2VyIGNvbmZpZ3VyYXRpb24uIERhdGEgaW4gdGhpcyBkYXRhIHN0cnVjdHVyZSAqLwogLyogaXMgdmFsaWQgb25seSB3aGVuIGVpdGhlciBBREhPQ19PTihwQWQpIG9yIElORlJBX09OKHBBZCkgaXMgVFJVRS4gKi8KIC8qIE5vcm1hbGx5LCBhZnRlciBTQ0FOIG9yIGZhaWxlZCByb2FtaW5nIGF0dGVtcHRzLCB3ZSBuZWVkIHRvIHJlY292ZXIgYmFjayB0byAqLwogLyogdGhlIGN1cnJlbnQgYWN0aXZlIHNldHRpbmdzLiAqLwpAQCAtMTUxOSw3ICsxNTIwLDcgQEAKIAkvKkNob29zZSAxIGZyb20gVmFsaWRBc1dEUyBhbmQgVmFsaWRBc0NMSSAgdG8gdmFsaWRpemUuICovCiAJQk9PTEVBTiBWYWxpZEFzQ0xJOwkvKiBTdGEgbW9kZSwgc2V0IHRoaXMgVFJVRSBhZnRlciBMaW5rdXAsdG9vLiAqLwogCUJPT0xFQU4gVmFsaWRBc1dEUzsJLyogVGhpcyBpcyBXRFMgRW50cnkuIG9ubHkgZm9yIEFQIG1vZGUuICovCi0JQk9PTEVBTiBWYWxpZEFzQXBDbGk7CS8qVGhpcyBpcyBhIEFQLUNsaWVudCBlbnRyeSwgb25seSBmb3IgQVAgbW9kZSB3aGljaCBlbmFibGUgQVAtQ2xpZW50IGZ1bmN0aW9ucy4gKi8KKwlCT09MRUFOIFZhbGlkQXNBcENsaTsJLyogVGhpcyBpcyBhIEFQLUNsaWVudCBlbnRyeSwgb25seSBmb3IgQVAgbW9kZSB3aGljaCBlbmFibGUgQVAtQ2xpZW50IGZ1bmN0aW9ucy4gKi8KIAlCT09MRUFOIFZhbGlkQXNNZXNoOwogCUJPT0xFQU4gVmFsaWRBc0RsczsJLyogVGhpcyBpcyBETFMgRW50cnkuIG9ubHkgZm9yIFNUQSBtb2RlLiAqLwogCUJPT0xFQU4gaXNDYWNoZWQ7CkBAIC0xNTI3LDcgKzE1MjgsNyBAQAogCiAJdTggRW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmc7CS8qIEVucXVldWUgRUFQb0wtU3RhcnQgZm9yIHRyaWdnZXJpbmcgRUFQIFNNICovCiAJLypqYW4gZm9yIHdwYSAqLwotCS8qIHJlY29yZCB3aGljaCBlbnRyeSByZXZva2UgTUlDIEZhaWx1cmUgLCBpZiBpdCBsZWF2ZXMgdGhlIEJTUyBpdHNlbGYsIEFQIHdvbid0IHVwZGF0ZSBhTUlDRmFpbFRpbWUgTUlCICovCisJLyogcmVjb3JkIHdoaWNoIGVudHJ5IHJldm9rZSBNSUMgRmFpbHVyZSwgaWYgaXQgbGVhdmVzIHRoZSBCU1MgaXRzZWxmLCBBUCB3b24ndCB1cGRhdGUgYU1JQ0ZhaWxUaW1lIE1JQiAqLwogCXU4IENNVGltZXJSdW5uaW5nOwogCXU4IGFwaWR4OwkJLyogTUJTUyBudW1iZXIgKi8KIAl1OCBSU05JRV9MZW47CkBAIC0xNzIyLDcgKzE3MjMsNyBAQAogCXVuc2lnbmVkIGxvbmcgUnQzeHhSYWxpbmtMaW5rQ3RybDsJLyogVVNlZCBmb3IgMzA5MEYgY2hpcCAqLwogCXUxNiBEZXZpY2VJRDsJLyogUmVhZCBmcm9tIFBDSSBjb25maWcgKi8KIAl1bnNpZ25lZCBsb25nIEFjY2Vzc0JCUEZhaWxDb3VudDsKLQlCT09MRUFOIGJQQ0ljbGtPZmY7CS8qIGZsYWcgdGhhdCBpbmRpY2F0ZSBpZiB0aGUgUElDRSBwb3dlciBzdGF0dXMgaW4gQ29uZmlndXJhdGlvbiBTUGFjZS4uICovCisJQk9PTEVBTiBiUENJY2xrT2ZmOwkvKiBmbGFnIHRoYXQgaW5kaWNhdGVzIGlmIHRoZSBQSUNFIHBvd2VyIHN0YXR1cyBpbiBDb25maWd1cmF0aW9uIFNwYWNlLi4gKi8KIAlCT09MRUFOIGJQQ0ljbGtPZmZEaXNhYmxlVHg7CS8qICovCiAKIAlCT09MRUFOIGJydDMweHhCYW5NY3VDbWQ7CS8qd2hlbiA9IDB4ZmYgbWVhbnMgYWxsIGNvbW1hbmRzIGFyZSBvayB0byBzZXQgLiAqLwpAQCAtMTg3MSw5ICsxODcyLDkgQEAKIAkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAJdTggUmZJY1R5cGU7CQkvKiBSRklDX3h4eCAqLwogCXVuc2lnbmVkIGxvbmcgUmZGcmVxT2Zmc2V0OwkvKiBGcmVxdWVuY3kgb2Zmc2V0IGZvciBjaGFubmVsIHN3aXRjaGluZyAqLwotCXN0cnVjdCBydF9ydG1wX3JmX3JlZ3MgTGF0Y2hSZlJlZ3M7CS8qIGxhdGNoIHRoIGxhdGVzdCBSRiBwcm9ncmFtbWluZyB2YWx1ZSBzaW5jZSBSRiBJQyBkb2Vzbid0IHN1cHBvcnQgUkVBRCAqLworCXN0cnVjdCBydF9ydG1wX3JmX3JlZ3MgTGF0Y2hSZlJlZ3M7CS8qIGxhdGNoIHRoZSBsYXRlc3QgUkYgcHJvZ3JhbW1pbmcgdmFsdWUgc2luY2UgUkYgSUMgZG9lc24ndCBzdXBwb3J0IFJFQUQgKi8KIAotCUVFUFJPTV9BTlRFTk5BX1NUUlVDIEFudGVubmE7CS8qIFNpbmNlIEFOdGVubmEgZGVmaW5pdGlvbiBpcyBkaWZmZXJlbnQgZm9yIGEgJiBnLiBXZSBuZWVkIHRvIHNhdmUgaXQgZm9yIGZ1dHVyZSByZWZlcmVuY2UuICovCisJRUVQUk9NX0FOVEVOTkFfU1RSVUMgQW50ZW5uYTsJLyogU2luY2UgQW50ZW5uYSBkZWZpbml0aW9uIGlzIGRpZmZlcmVudCBmb3IgYSAmIGcuIFdlIG5lZWQgdG8gc2F2ZSBpdCBmb3IgZnV0dXJlIHJlZmVyZW5jZS4gKi8KIAlFRVBST01fTklDX0NPTkZJRzJfU1RSVUMgTmljQ29uZmlnMjsKIAogCS8qIFRoaXMgc29mdCBSeCBBbnRlbm5hIERpdmVyc2l0eSBtZWNoYW5pc20gaXMgdXNlZCBvbmx5IHdoZW4gdXNlciBzZXQgKi8KQEAgLTE5OTAsNyArMTk5MSw3IEBACiAJc3RydWN0IHJ0X2NvbW1vbl9jb25maWcgQ29tbW9uQ2ZnOwogCXN0cnVjdCBydF9tbG1lIE1sbWU7CiAKLQkvKiBBUCBuZWVkcyB0aG9zZSB2YWlhYmxlcyBmb3Igc2l0ZSBzdXJ2ZXkgZmVhdHVyZS4gKi8KKwkvKiBBUCBuZWVkcyB0aG9zZSB2YXJpYWJsZXMgZm9yIHNpdGUgc3VydmV5IGZlYXR1cmUuICovCiAJc3RydWN0IHJ0X21sbWVfYXV4IE1sbWVBdXg7CS8qIHRlbXBvcmFyeSBzZXR0aW5ncyB1c2VkIGR1cmluZyBNTE1FIHN0YXRlIG1hY2hpbmUgKi8KIAlzdHJ1Y3QgcnRfYnNzX3RhYmxlIFNjYW5UYWI7CS8qIHN0b3JlIHRoZSBsYXRlc3QgU0NBTiByZXN1bHQgKi8KIApAQCAtMjAxMiw3ICsyMDEzLDcgQEAKIAkvKiB2YXJpb3VzIENvdW50ZXJzICovCiAJc3RydWN0IHJ0X2NvdW50ZXJfODAyXzMgQ291bnRlcnM4MDIzOwkvKiA4MDIuMyBjb3VudGVycyAqLwogCXN0cnVjdCBydF9jb3VudGVyXzgwMl8xMSBXbGFuQ291bnRlcnM7CS8qIDgwMi4xMSBNSUIgY291bnRlcnMgKi8KLQlzdHJ1Y3QgcnRfY291bnRlcl9yYWxpbmsgUmFsaW5rQ291bnRlcnM7CS8qIFJhbGluayBwcm9wcmlldHkgY291bnRlcnMgKi8KKwlzdHJ1Y3QgcnRfY291bnRlcl9yYWxpbmsgUmFsaW5rQ291bnRlcnM7CS8qIFJhbGluayBwcm9wcmlldGFyeSBjb3VudGVycyAqLwogCXN0cnVjdCBydF9jb3VudGVyX2RycyBEcnNDb3VudGVyczsJLyogY291bnRlcnMgZm9yIER5bmFtaWMgVFggUmF0ZSBTd2l0Y2hpbmcgKi8KIAlzdHJ1Y3QgcnRfcHJpdmF0ZSBQcml2YXRlSW5mbzsJLyogUHJpdmF0ZSBpbmZvcm1hdGlvbiAmIGNvdW50ZXJzICovCiAKQEAgLTIwMjQsNyArMjAyNSw3IEBACiAJdTE2IFNlcXVlbmNlOwogCiAJLyogQ29udHJvbCBkaXNjb25uZWN0IC8gY29ubmVjdCBldmVudCBnZW5lcmF0aW9uICovCi0JLyorKytEaWRuJ3QgdXNlZCBhbnltb3JlICovCisJLyorKytOb3QgdXNlZCBhbnltb3JlICovCiAJdW5zaWduZWQgbG9uZyBMaW5rRG93blRpbWU7CiAJLyotLS0gKi8KIAl1bnNpZ25lZCBsb25nIExhc3RSeFJhdGU7CkBAIC0yMDM2LDcgKzIwMzcsNyBAQAogCXVuc2lnbmVkIGxvbmcgRXh0cmFJbmZvOwkvKiBFeHRyYSBpbmZvcm1hdGlvbiBmb3IgZGlzcGxheWluZyBzdGF0dXMgKi8KIAl1bnNpZ25lZCBsb25nIFN5c3RlbUVycm9yQml0bWFwOwkvKiBiMDogRTJQUk9NIHZlcnNpb24gZXJyb3IgKi8KIAotCS8qKysrRGlkbid0IHVzZWQgYW55bW9yZSAqLworCS8qKysrTm90IHVzZWQgYW55bW9yZSAqLwogCXVuc2lnbmVkIGxvbmcgTWFjSWNWZXJzaW9uOwkvKiBNQUMvQkJQIHNlcmlhbCBpbnRlcmZhY2UgaXNzdWUgc29sdmVkIGFmdGVyIHZlci5EICovCiAJLyotLS0gKi8KIApAQCAtMjA4OSw3ICsyMDkwLDcgQEAKIAl1bnNpZ25lZCBsb25nIEJ1bGtPdXRSZXE7CiAJdW5zaWduZWQgbG9uZyBCdWxrT3V0Q29tcGxldGU7CiAJdW5zaWduZWQgbG9uZyBCdWxrT3V0Q29tcGxldGVPdGhlcjsKLQl1bnNpZ25lZCBsb25nIEJ1bGtPdXRDb21wbGV0ZUNhbmNlbDsJLyogc2VlbXMgbm90IHVzZSBub3c/ICovCisJdW5zaWduZWQgbG9uZyBCdWxrT3V0Q29tcGxldGVDYW5jZWw7CS8qIHNlZW1zIG5vdCB1c2VkIG5vdz8gKi8KIAl1bnNpZ25lZCBsb25nIEJ1bGtJblJlcTsKIAl1bnNpZ25lZCBsb25nIEJ1bGtJbkNvbXBsZXRlOwogCXVuc2lnbmVkIGxvbmcgQnVsa0luQ29tcGxldGVGYWlsOwpAQCAtMjE5Niw5ICsyMTk3LDkgQEAKIHN0cnVjdCBydF90eF9ibGsgewogCXU4IFF1ZUlkeDsKIAl1OCBUeEZyYW1lVHlwZTsJLyogSW5kaWNhdGUgdGhlIFRyYW5zbWlzc2lvbiB0eXBlIG9mIHRoZSBhbGwgZnJhbWVzIGluIG9uZSBiYXRjaCAqLwotCXU4IFRvdGFsRnJhbWVOdW07CS8qIFRvdGFsIGZyYW1lIG51bWJlciB3YW50IHRvIHNlbmQtb3V0IGluIG9uZSBiYXRjaCAqLworCXU4IFRvdGFsRnJhbWVOdW07CS8qIFRvdGFsIGZyYW1lIG51bWJlciB0aGF0IHdhbnRzIHRvIHNlbmQtb3V0IGluIG9uZSBiYXRjaCAqLwogCXUxNiBUb3RhbEZyYWdOdW07CS8qIFRvdGFsIGZyYW1lIGZyYWdtZW50cyByZXF1aXJlZCBpbiBvbmUgYmF0Y2ggKi8KLQl1MTYgVG90YWxGcmFtZUxlbjsJLyogVG90YWwgbGVuZ3RoIG9mIGFsbCBmcmFtZXMgd2FudCB0byBzZW5kLW91dCBpbiBvbmUgYmF0Y2ggKi8KKwl1MTYgVG90YWxGcmFtZUxlbjsJLyogVG90YWwgbGVuZ3RoIG9mIGFsbCBmcmFtZXMgdGhhdCB3YW50cyB0byBzZW5kLW91dCBpbiBvbmUgYmF0Y2ggKi8KIAogCXN0cnVjdCBydF9xdWV1ZV9oZWFkZXIgVHhQYWNrZXRMaXN0OwogCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBNYWNFbnRyeTsJLyogTlVMTDogcGFja2V0IHdpdGggODAyLjExIFJBIGZpZWxkIGlzIG11bHRpY2FzdC9icm9hZGNhc3QgYWRkcmVzcyAqLwpAQCAtMjIwNyw3ICsyMjA4LDcgQEAKIAkvKiBGb2xsb3dpbmcgc3RydWN0dXJlIHVzZWQgZm9yIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgYSBzcGVjaWZpYyBwYWNrZXQuICovCiAJdm9pZCAqcFBhY2tldDsKIAl1OCAqcFNyY0J1ZkhlYWRlcjsJLyogUmVmZXJlbmNlIHRvIHRoZSBoZWFkIG9mIHNrX2J1ZmYtPmRhdGEgKi8KLQl1OCAqcFNyY0J1ZkRhdGE7CS8qIFJlZmVyZW5jZSB0byB0aGUgc2tfYnVmZi0+ZGF0YSwgd2lsbCBjaGFuZ2VkIGRlcGVuZHMgb24gaGFubGRpbmcgcHJvZ3Jlc3NzICovCisJdTggKnBTcmNCdWZEYXRhOwkvKiBSZWZlcmVuY2UgdG8gdGhlIHNrX2J1ZmYtPmRhdGEsIHdpbGwgY2hhbmdlIGRlcGVuZGluZyBvbiB0aGUgaGFuZGxpbmcgcHJvZ3Jlc3NzICovCiAJdTMyIFNyY0J1ZkxlbjsJCS8qIExlbmd0aCBvZiBwYWNrZXQgcGF5bG9hZCB3aGljaCBub3QgaW5jbHVkaW5nIExheWVyIDIgaGVhZGVyICovCiAJdTggKnBFeHRyYUxsY1NuYXBFbmNhcDsJLyogTlVMTCBtZWFucyBubyBleHRyYSBMTEMvU05BUCBpcyByZXF1aXJlZCAqLwogCXU4IEhlYWRlckJ1ZlsxMjhdOwkvKiBUZW1wQnVmZmVyIGZvciBUWF9JTkZPICsgVFhfV0kgKyA4MDIuMTEgSGVhZGVyICsgcGFkZGluZyArIEFNU0RVIFN1YkhlYWRlciArIExMQy9TTkFQICovCkBAIC0yMjE5LDcgKzIyMjAsNyBAQAogCXU4IGFwaWR4OwkJLyogVGhlIGludGVyZmFjZSBhc3NvY2lhdGVkIHRvIHRoaXMgcGFja2V0ICovCiAJdTggV2NpZDsJCS8qIFRoZSBNQUMgZW50cnkgYXNzb2NpYXRlZCB0byB0aGlzIHBhY2tldCAqLwogCXU4IFVzZXJQcmlvcml0eTsJLyogcHJpb3JpdHkgY2xhc3Mgb2YgcGFja2V0ICovCi0JdTggRnJhbWVHYXA7CQkvKiB3aGF0IGtpbmQgb2YgSUZTIHRoaXMgcGFja2V0IHVzZSAqLworCXU4IEZyYW1lR2FwOwkJLyogd2hhdCBraW5kIG9mIElGUyBkb2VzIHRoaXMgcGFja2V0IHVzZSAqLwogCXU4IE1wZHVSZXFOdW07CS8qIG51bWJlciBvZiBmcmFnbWVudHMgb2YgdGhpcyBmcmFtZSAqLwogCXU4IFR4UmF0ZTsJCS8qIFRPRE86IE9ic29sZXRlZD8gU2hvdWxkIGNoYW5nZSB0byBNQ1M/ICovCiAJdTggQ2lwaGVyQWxnOwkvKiBjaXBoZXIgYWxvZ3JpdGhtICovCkBAIC0yOTc4LDcgKzI5NzksNyBAQAogCiB2b2lkIEl0ZXJhdGVPbkJzc1RhYihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi12b2lkIEl0ZXJhdGVPbkJzc1RhYjIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTs7Cit2b2lkIEl0ZXJhdGVPbkJzc1RhYjIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAogdm9pZCBKb2luUGFybUZpbGwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAogCQkgIHN0cnVjdCBydF9tbG1lX2pvaW5fcmVxICpKb2luUmVxLCB1bnNpZ25lZCBsb25nIEJzc0lkeCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfZGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfZGVmLmgKaW5kZXggOWM1NGJhYy4uNmFjNjE3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX2RlZi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF9kZWYuaApAQCAtMzEsMTAgKzMxLDExIEBACiAgICAgTWluaXBvcnQgcmVsYXRlZCBkZWZpbml0aW9uIGhlYWRlcgogCiAgICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKyAgICBXaG8gICAgICAgIAkgCVdoZW4gICAgICAgICAgCVdoYXQKICAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBQYXVsIExpbiAgICAwOC0wMS0yMDAyICAgIGNyZWF0ZWQKLSAgICBKb2huIENoYW5nICAwOC0wNS0yMDAzICAgIGFkZCBkZWZpbml0aW9uIGZvciAxMWcgJiBvdGhlciBkcmFmdHMKKyAgICBQYXVsIExpbiAgICAJMDgtMDEtMjAwMiAgICAJY3JlYXRlZAorICAgIEpvaG4gQ2hhbmcgIAkwOC0wNS0yMDAzICAgIAlhZGQgZGVmaW5pdGlvbiBmb3IgMTFnICYgb3RoZXIgZHJhZnRzCisgICAgSnVzdGluIFAuIE1hdHRvY2sJMTEvMDcvMjAxMAlGaXggc29tZSB0eXBvcwogKi8KICNpZm5kZWYgX19SVE1QX0RFRl9IX18KICNkZWZpbmUgX19SVE1QX0RFRl9IX18KQEAgLTExMSwxMSArMTEyLDExIEBACiAJV01NIE5vdGU6IElmIG1lbW9yeSBvZiB5b3VyIHN5c3RlbSBpcyBub3QgbXVjaCwgcGxlYXNlIHJlZHVjZSB0aGUgZGVmaW5pdGlvbjsKIAlvciB3aGVuIHlvdSBkbyBXTU0gdGVzdCwgdGhlIHF1ZXVlIGZvciBsb3cgcHJpb3JpdHkgQUMgd2lsbCBiZSBmdWxsLCBpLmUuCiAJVFhfUklOR19TSVpFICsgTUFYX1BBQ0tFVFNfSU5fUVVFVUUgcGFja2V0cyBmb3IgdGhlIEFDIHdpbGwgYmUgYnVmZmVyZWQgaW4KLQlXTEFOLCBtYXliZSBubyBhbnkgcGFja2V0IGJ1ZmZlciBjYW4gYmUgZ290IGluIEV0aGVybmV0IGRyaXZlci4KKwlXTEFOLCBtYXliZSBubyBwYWNrZXQgYnVmZmVycyBjYW4gZ2V0IGludG8gdGhlIEV0aGVybmV0IGRyaXZlci4KIAotCVNvbWV0aW1lcyBubyBwYWNrZXQgYnVmZmVyIGNhbiBiZSBnb3QgaW4gRXRoZXJuZXQgZHJpdmVyLCB0aGUgc3lzdGVtIHdpbGwKKwlTb21ldGltZXMgbm8gcGFja2V0IGJ1ZmZlciBjYW4gYmUgZ2V0IGludG8gdGhlIEV0aGVybmV0IGRyaXZlciwgdGhlIHN5c3RlbSB3aWxsCiAJc2VuZCBmbG93IGNvbnRyb2wgcGFja2V0IHRvIHRoZSBzZW5kZXIgdG8gc2xvdyBkb3duIGl0cyBzZW5kaW5nIHJhdGUuCi0JU28gbm8gV01NIGNhbiBiZSBzYXcgaW4gdGhlIGFpci4KKwlTbyBubyBXTU0gY2FuIGJlIHNlZW4gaW4gdGhlIGFpci4KICovCiAKIC8qCkBAIC0xMjUsNyArMTI2LDcgQEAKIAlBbmQgaW4gcnRfbWFpbl9lbmQuYywgY2xDb25maWcuY2xOdW0gPSBSWF9SSU5HX1NJWkUgKiAzOyBpcyBjaGFuZ2VkIHRvCiAJY2xDb25maWcuY2xOdW0gPSBSWF9SSU5HX1NJWkUgKiA0OwogKi8KLS8qIFRPRE86IEZvciBWeFdvcmtzIHRoZSBzaXplIGlzIDI1Ni4gU2hhbGwgd2UgY2FobmdlIHRoZSB2YWx1ZSBhcyAyNTYgZm9yIGFsbCBPUz8/Pz8/ICovCisvKiBUT0RPOiBGb3IgVnhXb3JrcyB0aGUgc2l6ZSBpcyAyNTYuIFNoYWxsIHdlIGNoYW5nZSB0aGUgdmFsdWUgYXMgMjU2IGZvciBhbGwgT1M/ICovCiAjZGVmaW5lIE1BWF9QQUNLRVRTX0lOX1FVRVVFCQkJCSg1MTIpCS8qKDUxMikgICAgLy8gdG8gcGFzcyBXTU0gQTUtV1BBUFNLICovCiAKICNkZWZpbmUgTUFYX1BBQ0tFVFNfSU5fTUNBU1RfUFNfUVVFVUUJCTMyCkBAIC0xNzEsNyArMTcyLDcgQEAKICNkZWZpbmUgZlJUTVBfQURBUFRFUl9TQ0FOXzIwNDAgCQkJMHgwNDAwMDAwMAogI2RlZmluZQlmUlRNUF9BREFQVEVSX1JBRElPX01FQVNVUkVNRU5UCQkweDA4MDAwMDAwCiAKLSNkZWZpbmUgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCAgICAgICAgIAkJMHgxMDAwMDAwMAkvKkRldml2ZSBhbHJlYWR5IGluaXRpYWxpemVkIGFuZCBlbmFibGVkIFR4L1J4LiAqLworI2RlZmluZSBmUlRNUF9BREFQVEVSX1NUQVJUX1VQICAgICAgICAgCQkweDEwMDAwMDAwCS8qRGV2aWNlIGFscmVhZHkgaW5pdGlhbGl6ZWQgYW5kIGVuYWJsZWQgVHgvUnguICovCiAjZGVmaW5lIGZSVE1QX0FEQVBURVJfTUVESUFfU1RBVEVfQ0hBTkdFICAgIDB4MjAwMDAwMDAKICNkZWZpbmUgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRiAgICAgICAgMHg0MDAwMDAwMAogCkBAIC0yMDUsOCArMjA2LDggQEAKICNkZWZpbmUgZlJUTVBfUFNfU0VUX1BDSV9DTEtfT0ZGX0NPTU1BTkQgICAgICAgICAgMHgwMDAwMDAwMgogLyogSW5kaWNhdGUgZHJpdmVyIHNob3VsZCBkaXNhYmxlIGtpY2sgb2ZmIGhhcmR3YXJlIHRvIHNlbmQgcGFja2V0cyBmcm9tIG5vdy4gKi8KICNkZWZpbmUgZlJUTVBfUFNfRElTQUJMRV9UWCAgICAgICAgIDB4MDAwMDAwMDQKLS8qIEluZGljYXRlIGRyaXZlciBzaG91bGQgSU1NRURJQVRFTFkgZm8gdG8gc2xlZXAgYWZ0ZXIgcmVjZWl2aW5nIEFQJ3MgYmVhY29uIGluIHdoaWNoICBkb2Vzbid0IGluZGljYXRlIHVuaWNhdGUgbm9yIG11bHRpY2FzdCBwYWNrZXRzIGZvciBtZSAqLwotLyouIFRoaXMgZmxhZyBpcyB1c2VkIE9OTFkgaW4gUlRNUEhhbmRsZVJ4RG9uZUludGVycnVwdCByb3V0aW5lLiAqLworLyogSW5kaWNhdGUgZHJpdmVyIHNob3VsZCBJTU1FRElBVEVMWSBnbyB0byBzbGVlcCBhZnRlciByZWNlaXZpbmcgQVAncyBiZWFjb24gaW4gd2hpY2ggZG9lc24ndCBpbmRpY2F0ZSB1bmljYXRlIG5vciBtdWx0aWNhc3QgcGFja2V0cyBmb3IgbWUgKi8KKy8qIFRoaXMgZmxhZyBpcyB1c2VkIE9OTFkgaW4gUlRNUEhhbmRsZVJ4RG9uZUludGVycnVwdCByb3V0aW5lLiAqLwogI2RlZmluZSBmUlRNUF9QU19HT19UT19TTEVFUF9OT1cgICAgICAgICAweDAwMDAwMDA4CiAjZGVmaW5lIGZSVE1QX1BTX1RPR0dMRV9MMQkJMHgwMDAwMDAxMAkvKiBVc2UgVG9nZ2xlIEwxIG1lY2hhbmlzbSBmb3IgcnQyOHh4IFBDSWUgKi8KIApAQCAtMzAzLDcgKzMwNCw3IEBACiAKIC8qIFdEUyBkZWZpbml0aW9uICovCiAjZGVmaW5lCU1BWF9XRFNfRU5UUlkgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIFdEU19QQUlSV0lTRV9LRVlfT0ZGU0VUICAgICA2MAkvKiBXRFMgbGlua3MgdXNlcyBwYWlyd2lzZSBrZXkjNjAgfiA2MyBpbiBBU0lDIHBhaXJ3aXNlIGtleSB0YWJsZSAqLworI2RlZmluZSBXRFNfUEFJUldJU0VfS0VZX09GRlNFVCAgICAgNjAJLyogV0RTIGxpbmtzIHVzZSBwYWlyd2lzZSBrZXkjNjAgfiA2MyBpbiBBU0lDIHBhaXJ3aXNlIGtleSB0YWJsZSAqLwogCiAjZGVmaW5lCVdEU19ESVNBQkxFX01PREUgICAgICAgICAgICAwCiAjZGVmaW5lCVdEU19SRVNUUklDVF9NT0RFICAgICAgICAgICAxCkBAIC01NTksNyArNTYwLDcgQEAKICNkZWZpbmUgSUVfQUREX0hUMiAgICAgICAgICAgICAgICAgICAgICAgIDUzCS8qIDgwMi4xMW4gZDEuIEFERElUSU9OQUwgSFQgQ0FQQUJJTElUWS4gRUxFTUVOVCBJRCBUQkQgKi8KIAogLyogRm9yIDgwMi4xMW4gRDMuMDMgKi8KLS8qI2RlZmluZSBJRV9ORVdfRVhUX0NIQV9PRkZTRVQgICAgICAgICAgICAgNjIgICAgLy8gODAyLjExbiBkMS4gTmV3IGV4dGVuc2lvbiBjaGFubmVsIG9mZnNldCBlbGVtZXQgKi8KKy8qI2RlZmluZSBJRV9ORVdfRVhUX0NIQV9PRkZTRVQgICAgICAgICAgICAgNjIgICAgLy8gODAyLjExbiBkMS4gTmV3IGV4dGVuc2lvbiBjaGFubmVsIG9mZnNldCBlbGVtZW50ICovCiAjZGVmaW5lIElFX1NFQ09OREFSWV9DSF9PRkZTRVQJCTYyCS8qIDgwMi4xMW4gRDMuMDMgICAgICAgIFNlY29uZGFyeSBDaGFubmVsIE9mZnNldCBlbGVtZW50ICovCiAjZGVmaW5lIElFX1dBUEkJCQkJCQkJNjgJLyogV0FQSSBpbmZvcm1hdGlvbiBlbGVtZW50ICovCiAjZGVmaW5lIElFXzIwNDBfQlNTX0NPRVhJU1QgICAgICAgICAgICAgICA3MgkvKiA4MDIuMTFuIEQzLjAuMyAqLwpAQCAtNjc4LDcgKzY3OSw3IEBACiAKICNkZWZpbmUgQUNUX01BQ0hJTkVfQkFTRSAgICAgICAgICAgICAgMAogCi0vKlRob3NlIFBFRVJfeHhfQ0FURSBudW1iZXIgaXMgYmFzZWQgb24gcmVhbCBDYXRlZ2FyeSB2YWx1ZSBpbiBJRUVFIHNwZWMuIFBsZWFzZSBkb24nZXMgbW9kaWZ5IGl0IGJ5IHlvdXIgc2VsZi4gKi8KKy8qVGhvc2UgUEVFUl94eF9DQVRFIG51bWJlciBpcyBiYXNlZCBvbiByZWFsIENhdGVnYXJ5IHZhbHVlIGluIElFRUUgc3BlYy4gUGxlYXNlIGRvIG5vdCBtb2RpZnkgaXQgYnkgeW91ciBzZWxmLiAqLwogLypDYXRlZ29yeSAqLwogI2RlZmluZSBNVDJfUEVFUl9TUEVDVFJVTV9DQVRFICAgICAgICAgICAgICAwCiAjZGVmaW5lIE1UMl9QRUVSX1FPU19DQVRFICAgICAgICAgICAgICAxCkBAIC03NDgsNyArNzQ5LDcgQEAKIAogI2RlZmluZSBBQ1RfRlVOQ19TSVpFICAgICAgICAgICAgICAgICAoTUFYX0FDVF9TVEFURSAqIE1BWF9BQ1RfTVNHKQogLyogKi8KLS8qIFNUQSdzIEFVVEhFTlRJQ0FUSU9OIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZ2ZW50cywgdG90YWwgZnVuY3Rpb24gIyAqLworLyogU1RBJ3MgQVVUSEVOVElDQVRJT04gc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMgKi8KIC8qICovCiAjZGVmaW5lIEFVVEhfUkVRX0lETEUgICAgICAgICAgICAgICAgICAgMAogI2RlZmluZSBBVVRIX1dBSVRfU0VRMiAgICAgICAgICAgICAgICAgIDEKQEAgLTk0OCw3ICs5NDksNyBAQAogI2RlZmluZSBCTE9DS19BQ0sgICAgICAgICAgICAgICAgICAgMHg2MAkvKiBiNjo1ID0gMTEgKi8KIAogLyogKi8KLS8qIHJ0bXBfZGF0YS5jIHVzZSB0aGVzZSBkZWZpbml0aW9uICovCisvKiBydG1wX2RhdGEuYyB1c2VzIHRoaXMgZGVmaW5pdGlvbiAqLwogLyogKi8KICNkZWZpbmUgTEVOR1RIXzgwMl8xMSAgICAgICAgICAgICAgIDI0CiAjZGVmaW5lIExFTkdUSF84MDJfMTFfQU5EX0ggICAgICAgICAzMApAQCAtMTI4OCw3ICsxMjg5LDcgQEAKICNkZWZpbmUgSVdfU1RBX0xJTktET1dOX0VWRU5UX0ZMQUcJCQkJCTB4MDIxMAogI2RlZmluZSBJV19TQ0FOX0NPTVBMRVRFRF9FVkVOVF9GTEFHCQkJCTB4MDIxMQogI2RlZmluZSBJV19TQ0FOX0VOUVVFVUVfRkFJTF9FVkVOVF9GTEFHCQkJCTB4MDIxMgotLyogaWYgYWRkIG5ldyBzeXN0ZW0gZXZlbnQgZmxhZywgcGxlYXNlIHVwYWR0ZSB0aGUgSVdfU1lTX0VWRU5UX0ZMQUdfRU5EICovCisvKiBpZiBhZGQgbmV3IHN5c3RlbSBldmVudCBmbGFnLCBwbGVhc2UgdXBkYXRlIHRoZSBJV19TWVNfRVZFTlRfRkxBR19FTkQgKi8KICNkZWZpbmUJSVdfU1lTX0VWRU5UX0ZMQUdfRU5EICAgICAgICAgICAgICAgICAgICAgICAweDAyMTIKICNkZWZpbmUJSVdfU1lTX0VWRU5UX1RZUEVfTlVNCQkJCQkJKElXX1NZU19FVkVOVF9GTEFHX0VORCAtIElXX1NZU19FVkVOVF9GTEFHX1NUQVJUICsgMSkKIC8qIEZvciBzeXN0ZW0gZXZlbnQgLSBlbmQgKi8KQEAgLTEzMDUsNyArMTMwNiw3IEBACiAjZGVmaW5lIElXX1NQT09GX0RFQVVUSF9FVkVOVF9GTEFHCQkJCQkweDAzMDcKICNkZWZpbmUgSVdfU1BPT0ZfVU5LTk9XTl9NR01UX0VWRU5UX0ZMQUcJCQkweDAzMDgKICNkZWZpbmUgSVdfUkVQTEFZX0FUVEFDS19FVkVOVF9GTEFHCQkJCQkweDAzMDkKLS8qIGlmIGFkZCBuZXcgc3Bvb2YgYXR0YWNrIGV2ZW50IGZsYWcsIHBsZWFzZSB1cGFkdGUgdGhlIElXX1NQT09GX0VWRU5UX0ZMQUdfRU5EICovCisvKiBpZiBhZGQgbmV3IHNwb29mIGF0dGFjayBldmVudCBmbGFnLCBwbGVhc2UgdXBkYXRlIHRoZSBJV19TUE9PRl9FVkVOVF9GTEFHX0VORCAqLwogI2RlZmluZQlJV19TUE9PRl9FVkVOVF9GTEFHX0VORCAgICAgICAgICAgICAgICAgICAgIDB4MDMwOQogI2RlZmluZQlJV19TUE9PRl9FVkVOVF9UWVBFX05VTQkJCQkJCShJV19TUE9PRl9FVkVOVF9GTEFHX0VORCAtIElXX1NQT09GX0VWRU5UX0ZMQUdfU1RBUlQgKyAxKQogLyogRm9yIHNwb29mIGF0dGFjayBldmVudCAtIGVuZCAqLwpAQCAtMTMxOSw3ICsxMzIwLDcgQEAKICNkZWZpbmUgSVdfRkxPT0RfRElTQVNTT0NfRVZFTlRfRkxBRwkJCQkweDA0MDQKICNkZWZpbmUgSVdfRkxPT0RfREVBVVRIX0VWRU5UX0ZMQUcJCQkJCTB4MDQwNQogI2RlZmluZSBJV19GTE9PRF9FQVBfUkVRX0VWRU5UX0ZMQUcJCQkJCTB4MDQwNgotLyogaWYgYWRkIG5ldyBmbG9vZGluZyBhdHRhY2sgZXZlbnQgZmxhZywgcGxlYXNlIHVwYWR0ZSB0aGUgSVdfRkxPT0RfRVZFTlRfRkxBR19FTkQgKi8KKy8qIGlmIGFkZCBuZXcgZmxvb2RpbmcgYXR0YWNrIGV2ZW50IGZsYWcsIHBsZWFzZSB1cGRhdGUgdGhlIElXX0ZMT09EX0VWRU5UX0ZMQUdfRU5EICovCiAjZGVmaW5lCUlXX0ZMT09EX0VWRU5UX0ZMQUdfRU5EICAgICAgICAgICAgICAgICAgIAkweDA0MDYKICNkZWZpbmUJSVdfRkxPT0RfRVZFTlRfVFlQRV9OVU0JCQkJCQkoSVdfRkxPT0RfRVZFTlRfRkxBR19FTkQgLSBJV19GTE9PRF9FVkVOVF9GTEFHX1NUQVJUICsgMSkKIC8qIEZvciBmbG9vZGluZyBhdHRhY2sgLSBlbmQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF90aW1lci5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX3RpbWVyLmgKaW5kZXggMjhiOGFjNi4uMTViNjI4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX3RpbWVyLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX3RpbWVyLmgKQEAgLTI4LDEzICsyOCwxNCBAQAogCXJ0bXBfdGltZXIuaAogCiAgICAgQWJzdHJhY3Q6Ci0JUmFsaW5rIFdpcmVsZXNzIERyaXZlciB0aW1lciByZWxhdGVkIGRhdGEgc3RydWN0dXJlcyBhbmQgZGVsY2FyYXRpb25zCisJUmFsaW5rIFdpcmVsZXNzIERyaXZlciB0aW1lciByZWxhdGVkIGRhdGEgc3RydWN0dXJlcyBhbmQgZGVjbGFyYXRpb25zIAogCiAgICAgUmV2aXNpb24gSGlzdG9yeToKLQlXaG8gICAgICAgICAgIFdoZW4gICAgICAgICAgICAgICAgV2hhdAorCVdobyAgICAgICAgICAJCVdoZW4gICAgICAgICAgICAgICAgIFdoYXQKIAktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCU5hbWUgICAgICAgICAgRGF0ZSAgICAgICAgICAgICAgICAgTW9kaWZpY2F0aW9uIGxvZ3MKLQlTaGlhbmcgVHUgICAgQXVnLTI4LTIwMDgJaW5pdCB2ZXJzaW9uCisJTmFtZSAgICAgICAgICAJCURhdGUgICAgICAgICAgICAgICAgIE1vZGlmaWNhdGlvbiBsb2dzCisJU2hpYW5nIFR1ICAgIAkJQXVnLTI4LTIwMDggCSAgICAgaW5pdCB2ZXJzaW9uCisJSnVzdGluIFAuIE1hdHRvY2sJMTEvMDcvMjAxMAkgICAgIEZpeCBhIHR5cG8KIAogKi8KIApAQCAtNTEsOCArNTIsOCBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLSBUaW1lciBSZWxhdGVkIE1BUkNPIC0tLS0tLS0tLS0tLS0tLSovCiAvKiBJbiBzb21lIG9zIG9yIGNoaXBzZXQsIHdlIGhhdmUgYSBsb3Qgb2YgdGltZXIgZnVuY3Rpb25zIGFuZCB3aWxsIHJlYWQvd3JpdGUgcmVnaXN0ZXIsICovCi0vKiAgIGl0J3Mgbm90IGFsbG93ZWQgaW4gTGludXggVVNCIHN1Yi1zeXN0ZW0gdG8gZG8gaXQgKCBiZWNhdXNlIG9mIHNsZWVwIGlzc3VlIHdoZW4gKi8KLS8qICBzdWJtaXQgdG8gY3RybCBwaXBlKS4gU28gd2UgbmVlZCBhIHdyYXBwZXIgZnVuY3Rpb24gdG8gdGFrZSBjYXJlIGl0LiAqLworLyogaXQncyBub3QgYWxsb3dlZCBpbiBMaW51eCBVU0Igc3ViLXN5c3RlbSB0byBkbyBpdCAoIGJlY2F1c2Ugb2Ygc2xlZXAgaXNzdWUgd2hlbiAqLworLyogc3VibWl0IHRvIGN0cmwgcGlwZSkuIFNvIHdlIG5lZWQgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvIHRha2UgY2FyZSBpdC4gKi8KIAogI2lmZGVmIFJUTVBfVElNRVJfVEFTS19TVVBQT1JUCiB0eXBlZGVmIHZvaWQoKlJUTVBfVElNRVJfVEFTS19IQU5ETEUpICh2b2lkICpTeXN0ZW1TcGVjaWZpYzEsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3NwZWN0cnVtLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3NwZWN0cnVtLmgKaW5kZXggNjQ4ZmQ2My4uNGMzMjViYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zcGVjdHJ1bS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3BlY3RydW0uaApAQCAtMzcsNyArMzcsNyBAQAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAJRGVzY3JpcHRpb246CiAJCVByZXBhcmUgTWVhc3VyZW1lbnQgcmVxdWVzdCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bwotCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWlzc2lvbi4KIAogCVBhcmFtZXRyczoKIAkJMS4gdGhlIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIG9mIHRoZSBmcmFtZS4KQEAgLTYwLDcgKzYwLDcgQEAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCURlc2NyaXB0aW9uOgogCQlQcmVwYXJlIE1lYXN1cmVtZW50IHJlcG9ydCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bwotCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWlzc2lvbi4KIAogCVBhcmFtZXRyczoKIAkJMS4gdGhlIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIG9mIHRoZSBmcmFtZS4KQEAgLTgwLDcgKzgwLDcgQEAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCURlc2NyaXB0aW9uOgogCQlQcmVwYXJlIFRQQyBSZXF1ZXN0IGFjdGlvbiBmcmFtZSBhbmQgZW5xdWV1ZSBpdCBpbnRvCi0JCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXRpb24uCisJCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXNzaW9uLgogCiAJUGFyYW1ldHJzOgogCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgpAQCAtOTQsNyArOTQsNyBAQAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAJRGVzY3JpcHRpb246CiAJCVByZXBhcmUgVFBDIFJlcG9ydCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bwotCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWlzc2lvbi4KIAogCVBhcmFtZXRyczoKIAkJMS4gdGhlIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIG9mIHRoZSBmcmFtZS4KQEAgLTExMCw3ICsxMTAsNyBAQAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAJRGVzY3JpcHRpb246CiAJCVByZXBhcmUgQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50IGFjdGlvbiBmcmFtZSBhbmQgZW5xdWV1ZSBpdCBpbnRvCi0JCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXRpb24uCisJCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXNzaW9uLgogCiAJUGFyYW1ldHJzOgogCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgpAQCAtMTI2LDcgKzEyNiw3IEBACiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAJRGVzY3JpcHRpb246Ci0JCVNwZWN0cnVuIGFjdGlvbiBmcmFtZXMgSGFuZGxlciBzdWNoIGFzIGNoYW5uZWwgc3dpdGNoIGFubm91Y2VtZW50LAorCQlTcGVjdHJ1biBhY3Rpb24gZnJhbWVzIEhhbmRsZXIgc3VjaCBhcyBjaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQsCiAJCW1lYXN1cmVtZW50IHJlcG9ydCwgbWVhc3VyZW1lbnQgcmVxdWVzdCBhY3Rpb25zIGZyYW1lcy4KIAogCVBhcmFtZXRyczoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2Fzc29jLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9hc3NvYy5jCmluZGV4IGI3ZWZiMGIuLjU5ZTkzMWMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9hc3NvYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2Fzc29jLmMKQEAgLTMyLDcgKzMyLDggQEAKIAlSZXZpc2lvbiBIaXN0b3J5OgogCVdobwkJCVdoZW4JCQlXaGF0CiAJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUpvaG4JCTIwMDQtOS0zCQlwb3J0aW5nIGZyb20gUlQyNTAwCisJSm9obgkJCTIwMDQtOS0zCQlwb3J0aW5nIGZyb20gUlQyNTAwCisJSnVzdGluIFAuIE1hdHRvY2sJMTEvMDcvMjAxMAkJRml4IHR5cG9zCiAqLwogI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgogCkBAIC0yNzcsMTAgKzI3OCwxMCBAQAogCXUxNiBWYXJJZXNPZmZzZXQ7CiAJdTE2IFN0YXR1czsKIAotCS8qIEJsb2NrIGFsbCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZCAqLworCS8qIEJsb2NrIGFsbCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IGR1cmluZyBXUEEgYmxvY2sgcGVyaW9kICovCiAJaWYgKHBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jID09IFRSVUUpIHsKIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCi0JCQkgKCJBU1NPQyAtIEJsb2NrIEFzc29jIHJlcXVlc3QgZHVybmluZyBXUEEgYmxvY2sgcGVyaW9kIVxuIikpOworCQkJICgiQVNTT0MgLSBCbG9jayBBc3NvYyByZXF1ZXN0IGR1cmluZyBXUEEgYmxvY2sgcGVyaW9kIVxuIikpOwogCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CiAJCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CiAJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BU1NPQ19DT05GLCAyLApAQCAtNjA1LDEwICs2MDYsMTAgQEAKIAl1OCAqcE91dEJ1ZmZlciA9IE5VTEw7CiAJdTE2IFN0YXR1czsKIAotCS8qIEJsb2NrIGFsbCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZCAqLworCS8qIEJsb2NrIGFsbCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IGR1cmluZyBXUEEgYmxvY2sgcGVyaW9kICovCiAJaWYgKHBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jID09IFRSVUUpIHsKIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCi0JCQkgKCJBU1NPQyAtIEJsb2NrIFJlQXNzb2MgcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QhXG4iKSk7CisJCQkgKCJBU1NPQyAtIEJsb2NrIFJlQXNzb2MgcmVxdWVzdCBkdXJpbmcgV1BBIGJsb2NrIHBlcmlvZCFcbiIpKTsKIAkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOwogCQlTdGF0dXMgPSBNTE1FX1NUQVRFX01BQ0hJTkVfUkVKRUNUOwogCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19DT05GLCAyLApAQCAtMTAwMSw3ICsxMDAyLDcgQEAKIAlwQWQtPk1sbWVBdXguQ2FwYWJpbGl0eUluZm8gPQogCSAgICBDYXBhYmlsaXR5SW5mbyAmIFNVUFBPUlRFRF9DQVBBQklMSVRZX0lORk87CiAKLQkvKiBTb21lIEhUIEFQIG1pZ2h0IGxvc3QgV01NIElFLiBXZSBhZGQgV01NIG91cnNlbHZlcy4gYmVhY3Vhc2UgSFQgcmVxdWlyZXMgUW9TIG9uLiAqLworCS8qIFNvbWUgSFQgQVAgbWlnaHQgbG9zdCBXTU0gSUUuIFdlIGFkZCBXTU0gb3Vyc2VsdmVzLiBiZWNhdXNlIEhUIHJlcXVpcmVzIFFvUyBvbi4gKi8KIAlpZiAoKEh0Q2FwYWJpbGl0eUxlbiA+IDApICYmIChwRWRjYVBhcm0tPmJWYWxpZCA9PSBGQUxTRSkpIHsKIAkJcEVkY2FQYXJtLT5iVmFsaWQgPSBUUlVFOwogCQlwRWRjYVBhcm0tPkFpZnNuWzBdID0gMzsKQEAgLTEwNTQsNyArMTA1NSw3IEBACiAJLyogU2V0IE5ldyBXUEEgaW5mb3JtYXRpb24gKi8KIAlJZHggPSBCc3NUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBwQWRkcjIsIHBBZC0+TWxtZUF1eC5DaGFubmVsKTsKIAlpZiAoSWR4ID09IEJTU19OT1RfRk9VTkQpIHsKLQkJREJHUFJJTlRfRVJSKCgiQVNTT0MgLSBDYW4ndCBmaW5kIEJTUyBhZnRlciByZWNlaXZpbmcgQXNzb2MgcmVzcG9uc2VcbiIpKTsKKwkJREJHUFJJTlRfRVJSKCJBU1NPQyAtIENhbid0IGZpbmQgQlNTIGFmdGVyIHJlY2VpdmluZyBBc3NvYyByZXNwb25zZVxuIik7CiAJfSBlbHNlIHsKIAkJLyogSW5pdCB2YXJpYWJsZSAqLwogCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbiA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9hdXRoLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9hdXRoLmMKaW5kZXggNDA0YmQyMi4uMjNlYTAwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvYXV0aC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2F1dGguYwpAQCAtMzIsNyArMzIsOCBAQAogCVJldmlzaW9uIEhpc3Rvcnk6CiAJV2hvCQkJV2hlbgkJCVdoYXQKIAktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JSm9obgkJMjAwNC05LTMJCXBvcnRpbmcgZnJvbSBSVDI1MDAKKwlKb2huCQkJMjAwNC05LTMJCXBvcnRpbmcgZnJvbSBSVDI1MDAKKwlKdXN0aW4gUC4gTWF0dG9jawkxMS8wNy8yMDEwCQlGaXggdHlwb3MKICovCiAjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCiAKQEAgLTQ1NSwxMCArNDU2LDEwIEBACiAJdTggKnBPdXRCdWZmZXIgPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgRnJhbWVMZW4gPSAwLCB0bXAgPSAwOwogCi0JLyogQmxvY2sgYWxsIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QgZHVybmluZyBXUEEgYmxvY2sgcGVyaW9kICovCisJLyogQmxvY2sgYWxsIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QgZHVyaW5nIFdQQSBibG9jayBwZXJpb2QgKi8KIAlpZiAocEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgPT0gVFJVRSkgewogCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKLQkJCSAoIiVzIC0gQmxvY2sgQXV0aCByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZCFcbiIsCisJCQkgKCIlcyAtIEJsb2NrIEF1dGggcmVxdWVzdCBkdXJpbmcgV1BBIGJsb2NrIHBlcmlvZCFcbiIsCiAJCQkgIHBTTU5hbWUpKTsKIAkJcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CiAJCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CkBAIC01MDgsOCArNTA5LDcgQEAKIAkJUlRNUFNldFRpbWVyKHBBdXRoVGltZXIsIFRpbWVvdXQpOwogCQlyZXR1cm4gVFJVRTsKIAl9IGVsc2UgewotCQlEQkdQUklOVF9FUlIoKCIlcyAtIE1sbWVBdXRoUmVxQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxlZFxuIiwKLQkJCSAgICAgIHBTTU5hbWUpKTsKKwkJREJHUFJJTlRfRVJSKCIlcyAtIE1sbWVBdXRoUmVxQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxlZFxuIiwgcFNNTmFtZSk7CiAJCXJldHVybiBGQUxTRTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2Nvbm5lY3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2Nvbm5lY3QuYwppbmRleCBjMzgwNTUxLi40OTk2MjU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9jb25uZWN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvY29ubmVjdC5jCkBAIC0zMiw3ICszMiw4IEBACiAJUmV2aXNpb24gSGlzdG9yeToKIAlXaG8JCQlXaGVuCQkJV2hhdAogCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlKb2huCQkJMjAwNC0wOC0wOAkJCU1ham9yIG1vZGlmaWNhdGlvbiBmcm9tIFJUMjU2MAorCUpvaG4JCQkyMDA0LTA4LTA4CQlNYWpvciBtb2RpZmljYXRpb24gZnJvbSBSVDI1NjAKKwlKdXN0aW4gUC4gTWF0dG9jawkxMS8wNy8yMDEwCQlGaXggdHlwb3MKICovCiAjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCiAKQEAgLTY0LDcgKzY1LDcgQEAKIAogLyogVGhlIGZvbGxvd2luZyBNQUNSTyBpcyBjYWxsZWQgYWZ0ZXIgMS4gc3RhcnRpbmcgYW4gbmV3IElCU1MsIDIuIHN1Y2Nlc3NmdWxseSBKT0lOIGFuIElCU1MsICovCiAvKiBvciAzLiBzdWNjZXNzZnVsbHkgQVNTT0NJQVRFIHRvIGEgQlNTLCA0LiBzdWNjZXNzZnVsbHkgUkVfQVNTT0NJQVRFIHRvIGEgQlNTICovCi0vKiBBbGwgc2V0dGluZ3Mgc3VjY2Vzc2Z1bHkgbmVnb3RpYXRlZCBmdXJpbmcgTUxNRSBzdGF0ZSBtYWNoaW5lcyBiZWNvbWUgZmluYWwgc2V0dGluZ3MgKi8KKy8qIEFsbCBzZXR0aW5ncyBzdWNjZXNzZnVseSBuZWdvdGlhdGVkIGZpcmluZyBNTE1FIHN0YXRlIG1hY2hpbmVzIGJlY29tZSBmaW5hbCBzZXR0aW5ncyAqLwogLyogYW5kIGFyZSBjb3BpZWQgdG8gcEFkLT5TdGFBY3RpdmUgKi8KICNkZWZpbmUgQ09QWV9TRVRUSU5HU19GUk9NX01MTUVfQVVYX1RPX0FDVElWRV9DRkcoX3BBZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMjE0LDggKzIxNSw3IEBACiAJCWJyZWFrOwogI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLwogCWRlZmF1bHQ6Ci0JCURCR1BSSU5UX0VSUigoIkVSUk9SISBDTlRMIC0gSWxsZWdhbCBtZXNzYWdlIHR5cGUoPSVsZCkiLAotCQkJICAgICAgRWxlbS0+TXNnVHlwZSkpOworCQlEQkdQUklOVF9FUlIoIkVSUk9SISBDTlRMIC0gSWxsZWdhbCBtZXNzYWdlIHR5cGUoPSVsZCkiLCBFbGVtLT5Nc2dUeXBlKTsKIAkJYnJlYWs7CiAJfQogfQpAQCAtNTUzLDcgKzU1Myw3IEBACiAJTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5WzBdLAogCQkgICAgICAgJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLCBzaXplb2Yoc3RydWN0IHJ0X2Jzc19lbnRyeSkpOwogCi0JLyogQWRkIFNTSUQgaW50byBNbG1lQXV4IGZvciBzaXRlIHN1cmV5IGpvaW5pbmcgaGlkZGVuIFNTSUQgKi8KKwkvKiBBZGQgU1NJRCBpbnRvIE1sbWVBdXggZm9yIHNpdGUgc3VydmV5IGpvaW5pbmcgaGlkZGVuIFNTSUQgKi8KIAlwQWQtPk1sbWVBdXguU3NpZExlbiA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLlNzaWRMZW47CiAJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLlNzaWQsCiAJCSAgICAgICBwQWQtPk1sbWVBdXguU3NpZExlbik7CkBAIC02NjYsNyArNjY2LDcgQEAKIH0KIAogLyogUm9hbWluZyBpcyB0aGUgb25seSBleHRlcm5hbCByZXF1ZXN0IHRyaWdnZXJpbmcgQ05UTCBzdGF0ZSBtYWNoaW5lICovCi0vKiBkZXNwaXRlIG9mIG90aGVyICJTRVQgT0lEIiBvcGVyYXRpb24uIEFsbCAiU0VUIE9JRCIgcmVsYXRlZCBvZXJhdGlvbnMgKi8KKy8qIGRlc3BpdGUgb2Ygb3RoZXIgIlNFVCBPSUQiIG9wZXJhdGlvbi4gQWxsICJTRVQgT0lEIiByZWxhdGVkIG9wZXJhdGlvbnMgKi8KIC8qIGhhcHBlbiBpbiBzZXF1ZW5jZSwgYmVjYXVzZSBubyBvdGhlciBTRVQgT0lEIHdpbGwgYmUgc2VudCB0byB0aGlzIGRldmljZSAqLwogLyogdW50aWwgdGhlIHRoZSBwcmV2aW91cyBTRVQgb3BlcmF0aW9uIGlzIGNvbXBsZXRlIChzdWNjZXNzZnVsIG8gZmFpbGVkKS4gKi8KIC8qIFNvLCBob3cgZG8gd2UgcXVhcmFudGVlIHRoaXMgUk9BTUlORyByZXF1ZXN0IHdvbid0IGNvcnJ1cHQgb3RoZXIgIlNFVCBPSUQiPyAqLwpAQCAtMTIyNCw3ICsxMjI0LDcgQEAKIAkvKiBDaGFuZ2UgdG8gQVAgY2hhbm5lbCAqLwogCWlmICgocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPiBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQogCSAgICAmJiAocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkgewotCQkvKiBNdXN0IHVzaW5nIDQwTUh6LiAqLworCQkvKiBNdXN0IHVzZSA0ME1Iei4gKi8KIAkJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7CiAJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKIAkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOwpAQCAtMTI1OSw3ICsxMjU5LDcgQEAKIAl9IGVsc2UgaWYgKChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA8IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCiAJCSAgICYmIChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0KIAkJICAgICAgIEJXXzQwKSkgewotCQkvKiBNdXN0IHVzaW5nIDQwTUh6LiAqLworCQkvKiBNdXN0IHVzZSA0ME1Iei4gKi8KIAkJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7CiAJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKIAkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOwpAQCAtMTM0MywxMiArMTM0MywxMiBAQAogCUFzaWNTZXRTbG90VGltZShwQWQsIFRSVUUpOwogCUFzaWNTZXRFZGNhUGFybShwQWQsICZwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtKTsKIAotCS8qIENhbGwgdGhpcyBmb3IgUlRTIHByb3RlY3Rpb25mb3IgbGVnYWN5IHJhdGUsIHdlIHdpbGwgYWx3YXlzIGVuYWJsZSBSVFMgdGhyZXNob2xkLCBidXQgbm9ybWFsbHkgaXQgd2lsbCBub3QgaGl0ICovCisJLyogQ2FsbCB0aGlzIGZvciBSVFMgcHJvdGVjdGlvbiBmb3IgbGVnYWN5IHJhdGUsIHdlIHdpbGwgYWx3YXlzIGVuYWJsZSBSVFMgdGhyZXNob2xkLCBidXQgbm9ybWFsbHkgaXQgd2lsbCBub3QgaGl0ICovCiAJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCAwLCAoT0ZETVNFVFBST1RFQ1QgfCBDQ0tTRVRQUk9URUNUKSwgVFJVRSwKIAkJCSAgRkFMU0UpOwogCiAJaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBUUlVFKSkgewotCQkvKiBVcGRhdGUgSFQgcHJvdGVjdGlvbmZvciBiYXNlZCBvbiBBUCdzIG9wZXJhdGluZyBtb2RlLiAqLworCQkvKiBVcGRhdGUgSFQgcHJvdGVjdGlvbiBmb3IgYmFzZWQgb24gQVAncyBvcGVyYXRpbmcgbW9kZS4gKi8KIAkJaWYgKHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPT0gMSkgewogCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLAogCQkJCQkgIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi4KQEAgLTE1MzAsNyArMTUzMCw3IEBACiAJCS8qIEFkZCBCU1NJRCB0byBXQ0lEIHNlYXJjaCB0YWJsZSAqLwogCQlBc2ljVXBkYXRlUnhXQ0lEVGFibGUocEFkLCBCU1NJRF9XQ0lELCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CiAKLQkJLyogSWYgV0VQIGlzIGVuYWJsZWQsIGFkZCBwYWlld2lzZSBhbmQgc2hhcmVkIGtleSAqLworCQkvKiBJZiBXRVAgaXMgZW5hYmxlZCwgYWRkIHBhaXJ3aXNlIGFuZCBzaGFyZWQga2V5ICovCiAJCWlmICgoKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkgJiYKIAkJICAgICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKSAmJgogCQkgICAgIChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkpIHx8CkBAIC0xNjgxLDkgKzE2ODEsOSBAQAogCXBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kID0gMDsKIAlwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCA9IDA7CiAJcEFkLT5iQ29uZmlnQ2hhbmdlZCA9IEZBTFNFOwkvKiBSZXNldCBjb25maWcgZmxhZyAqLwotCXBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX1VQOwkvKiBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24gdG8gbGluayBpcyB1cCAqLworCXBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX1VQOwkvKiBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24gYWZ0ZXIgbGluayBpcyB1cCAqLwogCi0JLyogU2V0IGFzaWMgYXV0byBmYWxsIGJhY2sgKi8KKwkvKiBTZXQgYmFzaWMgYXV0byBmYWxsIGJhY2sgKi8KIAl7CiAJCXU4ICpwVGFibGU7CiAJCXU4IFRhYmxlU2l6ZSA9IDA7CkBAIC0xODU0LDggKzE4NTQsOCBAQAogCU5vdGU6CiAJCVdlIG5lZWQgbW9yZSBpbmZvcm1hdGlvbiB0byBrbm93IGl0J3MgdGhpcyByZXF1c3QgZnJvbSBBUC4KIAkJSWYgeWVzISB3ZSBuZWVkIHRvIGRvIGV4dHJhIGhhbmRsaW5nLCBmb3IgZXhhbXBsZSwgcmVtb3ZlIHRoZSBXUEEga2V5LgotCQlPdGhlcndpc2Ugb24gNC13YXkgaGFuZHNoYWtpbmcgd2lsbCBmYWllZCwgc2luY2UgdGhlIFdQQSBrZXkgZGlkbid0IGJlCi0JCXJlbW92ZSB3aGlsZSBhdXRvIHJlY29ubmVjdC4KKwkJT3RoZXJ3aXNlIG9uIDQtd2F5IGhhbmRzaGFraW5nIHdpbGwgZmFpbCwgc2luY2UgdGhlIFdQQSBrZXkgZGlkbid0IGdldAorCQlyZW1vdmVkIHdoaWxlIGF1dG8gcmVjb25uZWN0LgogCQlEaXNjb25uZWN0IHJlcXVlc3QgZnJvbSBBUCwgaXQgbWVhbnMgd2Ugd2lsbCBzdGFydCBhZnJlc2ggNC13YXkgaGFuZHNoYWtpbmcKIAkJb24gV1BBIG1vZGUuCiAKQEAgLTE4NzAsOSArMTg3MCw5IEBACiAJCXJldHVybjsKIAogCVJUTVBfQ0xFQVJfUFNGTEFHKHBBZCwgZlJUTVBfUFNfR09fVE9fU0xFRVBfTk9XKTsKLQkvKkNvbW1lbnQgdGhlIGNvZGVzLCBiZWFzdWUgdGhlIGxpbmUgMjI5MSBjYWxsIHRoZSBzYW1lIGZ1bmN0aW9uLiAqLwotCS8qUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsICAgICAgICAgICAgICAgJkNhbmNlbGxlZCk7ICovCi0JLyogTm90IGFsbG93IGdvIHRvIHNsZWVwIHdpdGhpbiBsaW5rZG93biBmdW5jdGlvbi4gKi8KKwkvKiBDb21tZW50IHRoZSBjb2RlcywgYmVjYXVzZSB0aGUgbGluZSAyMjkxIGNhbGwgdGhlIHNhbWUgZnVuY3Rpb24uICovCisJLyogUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsICZDYW5jZWxsZWQpOyAqLworCS8qIE5vdCBhbGxvd2VkIGdvIHRvIHNsZWVwIHdpdGhpbiB0aGUgbGlua2Rvd24gZnVuY3Rpb24uICovCiAJUlRNUF9DTEVBUl9QU0ZMQUcocEFkLCBmUlRNUF9QU19DQU5fR09fU0xFRVApOwogCiAJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KSB7CkBAIC0xOTcwLDcgKzE5NzAsNyBAQAogCS8qIFNldCBMRUQgKi8KIAlSVE1QU2V0TEVEKHBBZCwgTEVEX0xJTktfRE9XTik7CiAJcEFkLT5MZWRJbmRpY2F0b3JTdHJlbmd0aCA9IDB4RjA7Ci0JUlRNUFNldFNpZ25hbExFRChwQWQsIC0xMDApOwkvKiBGb3JjZSBzaWduYWwgc3RyZW5ndGggTGVkIHRvIGJlIHR1cm5lZCBvZmYsIGZpcm13YXJlIGlzIG5vdCBkb25lIGl0LiAqLworCVJUTVBTZXRTaWduYWxMRUQocEFkLCAtMTAwKTsJLyogRm9yY2Ugc2lnbmFsIHN0cmVuZ3RoIExlZCB0byBiZSB0dXJuZWQgb2ZmLCBmaXJtd2FyZSBoYXMgbm90IGRvbmUgaXQuICovCiAKIAlBc2ljRGlzYWJsZVN5bmMocEFkKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvcnRtcF9kYXRhLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9ydG1wX2RhdGEuYwppbmRleCAyMzg3OWI3Li5lODJjNmI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9ydG1wX2RhdGEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9ydG1wX2RhdGEuYwpAQCAtMzEsNyArMzEsOCBAQAogCURhdGEgcGF0aCBzdWJyb3V0aW5lcwogCiAJUmV2aXNpb24gSGlzdG9yeToKLQlXaG8gCQlXaGVuCQkJV2hhdAorCVdobyAJICAJCVdoZW4JCVdoYXQKKwlKdXN0aW4gUC4gTWF0dG9jawkxMS8wNy8yMDEwCUZpeCB0eXBvcwogCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCiAjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCkBAIC0yNTcsOCArMjU4LDggQEAKIAkJICAgICYmIChwQWQtPkNvbW1vbkNmZy5iRGlzYWJsZVJlb3JkZXJpbmcgPT0gMCkpIHsKIAkJCUluZGljYXRlX0FNUERVX1BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOwogCQl9IGVsc2UgewotCQkJLyogRGV0ZXJtaW4gdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBFQVAgZnJhbWUgKi8KLQkJCS8qICB0byBXUEEgc3RhdGUgbWFjaGluZSBvciB1cHBlciBsYXllciAqLworCQkJLyogRGV0ZXJtaW5lIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgRUFQIGZyYW1lICovCisJCQkvKiB0byBXUEEgc3RhdGUgbWFjaGluZSBvciB1cHBlciBsYXllciAqLwogCQkJU1RBUnhFQVBPTEZyYW1lSW5kaWNhdGUocEFkLCBwRW50cnksIHBSeEJsaywKIAkJCQkJCUZyb21XaGljaEJTU0lEKTsKIAkJfQpAQCAtNjQ0LDcgKzY0NSw3IEBACiAKIAkJLyogRmlyc3QgY2hlY2sgdGhlIHNpemUsIGl0IE1VU1Qgbm90IGV4Y2VlZCB0aGUgbWxtZSBxdWV1ZSBzaXplICovCiAJCWlmIChwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID4gTUdNVF9ETUFfQlVGRkVSX1NJWkUpIHsKLQkJCURCR1BSSU5UX0VSUigoIlNUQUhhbmRsZVJ4TWdtdEZyYW1lOiBmcmFtZSB0b28gbGFyZ2UsIHNpemUgPSAlZCBcbiIsIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQpKTsKKwkJCURCR1BSSU5UX0VSUigiU1RBSGFuZGxlUnhNZ210RnJhbWU6IGZyYW1lIHRvbyBsYXJnZSwgc2l6ZSA9ICVkIFxuIiwgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCk7CiAJCQlicmVhazsKIAkJfQogCkBAIC04NTMsNyArODU0LDcgQEAKIAlOT05FCiAKIE5vdGU6Ci0JVGhpcyBmdW5jdGlvbiBkbyBlYXJseSBjaGVja2luZyBhbmQgY2xhc3NpZmljYXRpb24gZm9yIHNlbmQtb3V0IHBhY2tldC4KKwlUaGlzIGZ1bmN0aW9uIGRvZXMgZWFybHkgY2hlY2tpbmcgYW5kIGNsYXNzaWZpY2F0aW9uIGZvciBzZW5kLW91dCBwYWNrZXQuCiAJWW91IG9ubHkgY2FuIHB1dCBPUy1kZXBlbmVkICYgU1RBIHJlbGF0ZWQgY29kZSBpbiBoZXJlLgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwpAQCAtOTQzLDcgKzk0NCw3IEBACiAJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAogCQkJICgiU1RBU2VuZFBhY2tldCAtLT4gcFNyY0J1ZlZBID09IE5VTEwgIVNyY0J1Zkxlbj0leFxuIiwKIAkJCSAgU3JjQnVmTGVuKSk7Ci0JCS8qIFJlc291cmVjZSBpcyBsb3csIHN5c3RlbSBkaWQgbm90IGFsbG9jYXRlIHZpcnR1YWwgYWRkcmVzcyAqLworCQkvKiBSZXNvdXJjZSBpcyBsb3csIHN5c3RlbSBkaWQgbm90IGFsbG9jYXRlIHZpcnR1YWwgYWRkcmVzcyAqLwogCQkvKiByZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRSBkaXJlY3RseSB0byB1cHBlciBsYXllciAqLwogCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwpAQCAtOTc5LDcgKzk4MCw3IEBACiAJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAogCQkJKCJTVEFTZW5kUGFja2V0LT5DYW5ub3QgZmluZCBwRW50cnkoJXBNKSBpbiBNYWNUYWIhXG4iLAogCQkJCXBTcmNCdWZWQSkpOwotCQkvKiBSZXNvdXJlY2UgaXMgbG93LCBzeXN0ZW0gZGlkIG5vdCBhbGxvY2F0ZSB2aXJ0dWFsIGFkZHJlc3MgKi8KKwkJLyogUmVzb3VyY2UgaXMgbG93LCBzeXN0ZW0gZGlkIG5vdCBhbGxvY2F0ZSB2aXJ0dWFsIGFkZHJlc3MgKi8KIAkJLyogcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkUgZGlyZWN0bHkgdG8gdXBwZXIgbGF5ZXIgKi8KIAkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKQEAgLTEwNTcsOSArMTA1OCw5IEBACiAKIAkvKiBTVEVQIDIuIENoZWNrIHRoZSByZXF1aXJlbWVudCBvZiBSVFM6ICovCiAJLyogICAgICAgICBJZiBtdWx0aXBsZSBmcmFnbWVudCByZXF1aXJlZCwgUlRTIGlzIHJlcXVpcmVkIG9ubHkgZm9yIHRoZSBmaXJzdCBmcmFnbWVudCAqLwotCS8qICAgICAgICAgaWYgdGhlIGZyYWdtZW50IHNpemUgbGFyZ2UgdGhhbiBSVFMgdGhyZXNob2xkICovCisJLyogICAgICAgICBpZiB0aGUgZnJhZ21lbnQgc2l6ZSBpcyBsYXJnZXIgdGhhbiBSVFMgdGhyZXNob2xkICovCiAJLyogICAgIEZvciBSVDI4eHgsIExldCBBU0lDIHNlbmQgUlRTL0NUUyAqLwotLyogICAgICBSVE1QX1NFVF9QQUNLRVRfUlRTKHBQYWNrZXQsIDApOyAqLworCS8qICAgICAgUlRNUF9TRVRfUEFDS0VUX1JUUyhwUGFja2V0LCAwKTsgKi8KIAlpZiAoTnVtYmVyT2ZGcmFnID4gMSkKIAkJUlRTUmVxdWlyZWQgPQogCQkgICAgKHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID4KQEAgLTExNzEsOCArMTE3Miw4IEBACiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIAlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlUaGlzIHN1YnJvdXRpbmUgd2lsbCBzY2FuIHRocm91Z2ggcmVsZWF0aXZlIHJpbmcgZGVzY3JpcHRvciB0byBmaW5kCi0JCW91dCBhdmFsaWFibGUgZnJlZSByaW5nIGRlc2NyaXB0b3IgYW5kIGNvbXBhcmUgd2l0aCByZXF1ZXN0IHNpemUuCisJCVRoaXMgc3Vicm91dGluZSB3aWxsIHNjYW4gdGhyb3VnaCByZWxhdGl2ZSByaW5nIGRlc2NyaXB0b3IgdG8gZmluZAorCQlvdXQgYXZhaWxhYmxlIGZyZWUgcmluZyBkZXNjcmlwdG9yIGFuZCBjb21wYXJlIHdpdGggcmVxdWVzdCBzaXplLgogCiAJQXJndW1lbnRzOgogCQlwQWQgUG9pbnRlciB0byBvdXIgYWRhcHRlcgpAQCAtMTU4OCw3ICsxNTg5LDcgQEAKIAkJcEhlYWRlckJ1ZlB0ciArPSAyOwogCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gMjsKIAl9Ci0JLyogcGFkZGluZyBhdCBmcm9udCBvZiBMTEMgaGVhZGVyLiBMTEMgaGVhZGVyIHNob3VsZCBhdCA0LWJ5dGVzIGFsaWdtZW50LiAqLworCS8qIHBhZGRpbmcgYXQgZnJvbnQgb2YgTExDIGhlYWRlci4gTExDIGhlYWRlciBzaG91bGQgYXQgNC1ieXRlcyBhbGlnbm1lbnQuICovCiAJcFR4QmxrLT5IZHJQYWRMZW4gPSAodW5zaWduZWQgbG9uZylwSGVhZGVyQnVmUHRyOwogCXBIZWFkZXJCdWZQdHIgPSAodTggKilST1VORF9VUChwSGVhZGVyQnVmUHRyLCA0KTsKIAlwVHhCbGstPkhkclBhZExlbiA9ICh1bnNpZ25lZCBsb25nKShwSGVhZGVyQnVmUHRyIC0gcFR4QmxrLT5IZHJQYWRMZW4pOwpAQCAtMjAxNCw3ICsyMDE1LDcgQEAKIAkJcEhlYWRlckJ1ZlB0ciArPSAyOwogCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gMjsKIAl9Ci0JLyogVGhlIHJlbWFpbmluZyBjb250ZW50IG9mIE1QRFUgaGVhZGVyIHNob3VsZCBsb2NhdGUgYXQgNC1vY3RldHMgYWxpZ21lbnQgKi8KKwkvKiBUaGUgcmVtYWluaW5nIGNvbnRlbnQgb2YgTVBEVSBoZWFkZXIgc2hvdWxkIGxvY2F0ZSBhdCA0LW9jdGV0cyBhbGlnbm1lbnQgKi8KIAlwVHhCbGstPkhkclBhZExlbiA9ICh1bnNpZ25lZCBsb25nKXBIZWFkZXJCdWZQdHI7CiAJcEhlYWRlckJ1ZlB0ciA9ICh1OCAqKVJPVU5EX1VQKHBIZWFkZXJCdWZQdHIsIDQpOwogCXBUeEJsay0+SGRyUGFkTGVuID0gKHVuc2lnbmVkIGxvbmcpKHBIZWFkZXJCdWZQdHIgLSBwVHhCbGstPkhkclBhZExlbik7CkBAIC0yMTE0LDcgKzIxMTUsNyBAQAogCQkJICAgIFNUQV9CdWlsZF9BUmFsaW5rX0ZyYW1lX0hlYWRlcihwQWQsIHBUeEJsayk7CiAKIAkJCS8qIEl0J3Mgb2sgd3JpdGUgdGhlIFR4V0kgaGVyZSwgYmVjYXVzZSB0aGUgVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ICovCi0JCQkvKiAgICAgIHdpbGwgYmUgdXBkYXRlZCBhZnRlciBmaW5hbCBmcmFtZSB3YXMgaGFuZGxlZC4gKi8KKwkJCS8qIHdpbGwgYmUgdXBkYXRlZCBhZnRlciBmaW5hbCBmcmFtZSB3YXMgaGFuZGxlZC4gKi8KIAkJCVJUTVBXcml0ZVR4V0lfRGF0YShwQWQsCiAJCQkJCSAgIChzdHJ1Y3QgcnRfdHh3aSAqKSAoJnBUeEJsay0+CiAJCQkJCQkJICBIZWFkZXJCdWYKQEAgLTIyOTEsOCArMjI5Miw4IEBACiAJCQkJICAgICAgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXAsIHBUeEJsay0+cEtleSwKIAkJCQkgICAgICAwKTsKIAotCQkvKiBOT1RFOiBET04nVCByZWZlciB0aGUgc2tiLT5sZW4gZGlyZWN0bHkgYWZ0ZXIgZm9sbG93aW5nIGNvcHkuIEJlY2FzdWUgdGhlIGxlbmd0aCBpcyBub3QgYWRqdXN0ICovCi0JCS8qICAgICAgICAgICAgICAgICAgICAgIHRvIGNvcnJlY3QgbGVuZ2h0LCByZWZlciB0byBwVHhCbGstPlNyY0J1ZkxlbiBmb3IgdGhlIHBhY2tldCBsZW5ndGggaW4gZm9sbG93aW5nIHByb2dyZXNzLiAqLworCQkvKiBOT1RFOiBET04nVCByZWZlciB0aGUgc2tiLT5sZW4gZGlyZWN0bHkgYWZ0ZXIgZm9sbG93aW5nIGNvcHkuIEJlY2F1c2UgdGhlIGxlbmd0aCBpcyBub3QgYWRqdXN0ZWQgKi8KKwkJLyogICAgICAgICAgICAgICAgICAgICAgdG8gY29ycmVjdCBsZW5ndGgsIHJlZmVyIHRvIHBUeEJsay0+U3JjQnVmTGVuIGZvciB0aGUgcGFja2V0IGxlbmd0aCBpbiBmb2xsb3dpbmcgcHJvZ3Jlc3MuICovCiAJCU5kaXNNb3ZlTWVtb3J5KHBUeEJsay0+cFNyY0J1ZkRhdGEgKyBwVHhCbGstPlNyY0J1ZkxlbiwKIAkJCSAgICAgICAmcEFkLT5Qcml2YXRlSW5mby5UeC5NSUNbMF0sIDgpOwogCQkvKnNrYl9wdXQoKFJUUEtUX1RPX09TUEtUKHBUeEJsay0+cFBhY2tldCkpLT50YWlsLCA4KTsgKi8KQEAgLTIzMDEsNyArMjMwMiw3IEBACiAJCXBUeEJsay0+Q2lwaGVyQWxnID0gQ0lQSEVSX1RLSVBfTk9fTUlDOwogCX0KIAkvKiAqLwotCS8qIGNhbGN1YXRlIHRoZSBvdmVyaGVhZCBieXRlcyB0aGF0IGVuY3J5cHRpb24gYWxnb3JpdGhtIG1heSBhZGQuIFRoaXMgKi8KKwkvKiBjYWxjdWxhdGUgdGhlIG92ZXJoZWFkIGJ5dGVzIHRoYXQgZW5jcnlwdGlvbiBhbGdvcml0aG0gbWF5IGFkZC4gVGhpcyAqLwogCS8qIGFmZmVjdHMgdGhlIGNhbGN1bGF0ZSBvZiAiZHVyYXRpb24iIGZpZWxkICovCiAJLyogKi8KIAlpZiAoKHBUeEJsay0+Q2lwaGVyQWxnID09IENJUEhFUl9XRVA2NCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3Nhbml0eS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvc2FuaXR5LmMKaW5kZXggOGY5ZmQxOS4uMGMzMjYwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvc2FuaXR5LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvc2FuaXR5LmMKQEAgLTMyLDcgKzMyLDggQEAKIAlSZXZpc2lvbiBIaXN0b3J5OgogCVdobwkJCVdoZW4JCQlXaGF0CiAJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUpvaG4gQ2hhbmcgIDIwMDQtMDktMDEgICAgICBhZGQgV01NIHN1cHBvcnQKKwlKb2huIENoYW5nICAJCTIwMDQtMDktMDEgICAgICBhZGQgV01NIHN1cHBvcnQKKwlKdXN0aW4gUC4gTWF0dG9jawkxMS8wNy8yMDEwCUZpeCB0eXBvcwogKi8KICNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKIApAQCAtMTE4LDcgKzExOSw3IEBACiAJTmRpc01vdmVNZW1vcnkocEFpZCwgJnBGcmFtZS0+T2N0ZXRbNF0sIDIpOwogCUxlbmd0aCArPSAyOwogCi0JLyogQWlkIGFscmVhZHkgc3dhcGVkIGJ5dGUgb3JkZXIgaW4gUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKCkgZm9yIGJpZyBlbmRpYW4gcGxhdGZvcm0gKi8KKwkvKiBBaWQgYWxyZWFkeSBzd2FwcGVkIGJ5dGUgb3JkZXIgaW4gUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKCkgZm9yIGJpZyBlbmRpYW4gcGxhdGZvcm0gKi8KIAkqcEFpZCA9ICgqcEFpZCkgJiAweDNmZmY7CS8qIEFJRCBpcyBsb3cgMTQtYml0ICovCiAKIAkvKiAtLSBnZXQgc3VwcG9ydGVkIHJhdGVzIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvc3luYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvc3luYy5jCmluZGV4IDc0N2QzYzYuLjcwNTRiYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3N5bmMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9zeW5jLmMKQEAgLTMyLDggKzMyLDkgQEAKIAlSZXZpc2lvbiBIaXN0b3J5OgogCVdobwkJCVdoZW4JCQlXaGF0CiAJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUpvaG4gQ2hhbmcJMjAwNC0wOS0wMSAgICAgIG1vZGlmaWVkIGZvciBydDI1NjEvMjY2MQotCUphbiBMZWUJCTIwMDYtMDgtMDEgICAgICBtb2RpZmllZCBmb3IgcnQyODYwIGZvciA4MDIuMTFuCisJSm9obiBDaGFuZwkJMjAwNC0wOS0wMSAgICAgIAltb2RpZmllZCBmb3IgcnQyNTYxLzI2NjEKKwlKYW4gTGVlCQkJMjAwNi0wOC0wMSAgICAgIAltb2RpZmllZCBmb3IgcnQyODYwIGZvciA4MDIuMTFuCisJSnVzdGluIFAuIE1hdHRvY2sJMTEvMDcvMjAxMAkJRml4IHR5cG9zCiAqLwogI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgogCkBAIC0yMzMsOSArMjM0LDkgQEAKIAkJUlRNUFN1c3BlbmRNc2R1VHJhbnNtaXNzaW9uKHBBZCk7CiAKIAkJLyogKi8KLQkJLyogVG8gcHJldmVudCBkYXRhIGxvc3QuICovCi0JCS8qIFNlbmQgYW4gTlVMTCBkYXRhIHdpdGggdHVybmVkIFBTTSBiaXQgb24gdG8gY3VycmVudCBhc3NvY2lhdGVkIEFQIGJlZm9yZSBTQ0FOIHByb2dyZXNzLiAqLwotCQkvKiBBbmQgc2hvdWxkIHNlbmQgYW4gTlVMTCBkYXRhIHdpdGggdHVybmVkIFBTTSBiaXQgb2ZmIHRvIEFQLCB3aGVuIHNjYW4gcHJvZ3Jlc3MgZG9uZSAqLworCQkvKiBUbyBwcmV2ZW50IGRhdGEgbG9zcy4gKi8KKwkJLyogU2VuZCBhIE5VTEwgZGF0YSB3aXRoIHR1cm5lZCBQU00gYml0IG9uIHRvIGN1cnJlbnQgYXNzb2NpYXRlZCBBUCBiZWZvcmUgU0NBTiBwcm9ncmVzcy4gKi8KKwkJLyogQW5kIHNob3VsZCBzZW5kIGEgTlVMTCBkYXRhIHdpdGggdHVybmVkIFBTTSBiaXQgb2ZmIHRvIEFQLCB3aGVuIHNjYW4gcHJvZ3Jlc3MgZG9uZSAqLwogCQkvKiAqLwogCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpCiAJCSAgICAmJiAoSU5GUkFfT04ocEFkKSkpIHsKQEAgLTI4Myw3ICsyODQsNyBAQAogCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gQkJQIFI0IHRvIDIwTUh6LmxcbiIpKTsKIAkJU2Nhbk5leHRDaGFubmVsKHBBZCk7CiAJfSBlbHNlIHsKLQkJREJHUFJJTlRfRVJSKCgiU1lOQyAtIE1sbWVTY2FuUmVxQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKKwkJREJHUFJJTlRfRVJSKCJTWU5DIC0gTWxtZVNjYW5SZXFBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbFxuIik7CiAJCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7CiAJCVN0YXR1cyA9IE1MTUVfSU5WQUxJRF9GT1JNQVQ7CiAJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9TQ0FOX0NPTkYsIDIsCkBAIC01MzUsNyArNTM2LDcgQEAKIAkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NUQVJUX0NPTkYsIDIsCiAJCQkgICAgJlN0YXR1cyk7CiAJfSBlbHNlIHsKLQkJREJHUFJJTlRfRVJSKCgiU1lOQyAtIE1sbWVTdGFydFJlcUFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsLlxuIikpOworCQlEQkdQUklOVF9FUlIoIlNZTkMgLSBNbG1lU3RhcnRSZXFBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbC5cbiIpOwogCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOwogCQlTdGF0dXMgPSBNTE1FX0lOVkFMSURfRk9STUFUOwogCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfU1RBUlRfQ09ORiwgMiwKQEAgLTc1MCw5ICs3NTEsOSBAQAogCiAJCS8qIEJFQUNPTiBmcm9tIGRlc2lyZWQgQlNTL0lCU1MgZm91bmQuIFdlIHNob3VsZCBiZSBhYmxlIHRvIGRlY2lkZSBtb3N0ICovCiAJCS8qIEJTUyBwYXJhbWV0ZXJzIGhlcmUuICovCi0JCS8qIFEuIEJ1dCB3aGF0IGhhcHBlbiBpZiB0aGlzIEpPSU4gZG9lc24ndCBjb25jbHVkZSBhIHN1Y2Nlc3NmdWwgQVNTT0NJQVRFSU9OPyAqLwotCQkvKiAgICBEbyB3ZSBuZWVkIHRvIHJlY2VvdmVyIGJhY2sgYWxsIHBhcmFtZXRlcnMgYmVsb25naW5nIHRvIHByZXZpb3VzIEJTUz8gKi8KLQkJLyogQS4gU2hvdWxkIGJlIG5vdC4gVGhlcmUncyBubyBiYWNrLWRvb3IgcmVjb3ZlciB0byBwcmV2aW91cyBBUC4gSXQgc3RpbGwgbmVlZCAqLworCQkvKiBRLiBCdXQgd2hhdCBoYXBwZW4gaWYgdGhpcyBKT0lOIGRvZXNuJ3QgY29uY2x1ZGUgYSBzdWNjZXNzZnVsIEFTU09DSUFUSU9OPyAqLworCQkvKiAgICBEbyB3ZSBuZWVkIHRvIHJlY292ZXIgYmFjayBhbGwgcGFyYW1ldGVycyBiZWxvbmdpbmcgdG8gcHJldmlvdXMgQlNTPyAqLworCQkvKiBBLiBTaG91bGQgYmUgbm90LiBUaGVyZSdzIG5vIGJhY2stZG9vciByZWNvdmVyIHRvIHByZXZpb3VzIEFQLiBJdCBzdGlsbCBuZWVkcyAqLwogCQkvKiAgICBhIG5ldyBKT0lOLUFVVEgtQVNTT0Mgc2VxdWVuY2UuICovCiAJCWlmIChNQUNfQUREUl9FUVVBTChwQWQtPk1sbWVBdXguQnNzaWQsIEJzc2lkKSkgewogCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCkBAIC04NzYsNyArODc3LDcgQEAKIAkJCXBBZC0+TWxtZUF1eC5DZnBNYXhEdXJhdGlvbiA9IENmLkNmcE1heER1cmF0aW9uOwogCQkJcEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgPSBSYWxpbmtJZTsKIAotCQkJLyogQ29weSBBUCdzIHN1cHBvcnRlZCByYXRlIHRvIE1sbWVBdXggZm9yIGNyZWF0aW5nIGFzc29pY2F0aW9uIHJlcXVlc3QgKi8KKwkJCS8qIENvcHkgQVAncyBzdXBwb3J0ZWQgcmF0ZSB0byBNbG1lQXV4IGZvciBjcmVhdGluZyBhc3NvY2lhdGlvbiByZXF1ZXN0ICovCiAJCQkvKiBBbHNvIGZpbHRlciBvdXQgbm90IHN1cHBvcnRlZCByYXRlICovCiAJCQlwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiA9IFN1cFJhdGVMZW47CiAJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3VwUmF0ZSwgU3VwUmF0ZSwKQEAgLTEyMDcsNyArMTIwOCw3IEBACiAJCQl9CiAKIAkJCWlmIChpbmRleCA+PSBwQWQtPkNoYW5uZWxMaXN0TnVtKSB7Ci0JCQkJREJHUFJJTlRfRVJSKCgiUGVlckJlYWNvbihjYW4gbm90IGZpbmQgTmV3IENoYW5uZWw9JWQgaW4gQ2hhbm5lbExpc3RbJWRdXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBwQWQtPkNoYW5uZWxMaXN0TnVtKSk7CisJCQkJREJHUFJJTlRfRVJSKCJQZWVyQmVhY29uKGNhbiBub3QgZmluZCBOZXcgQ2hhbm5lbD0lZCBpbiBDaGFubmVsTGlzdFslZF1cbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBBZC0+Q2hhbm5lbExpc3ROdW0pOwogCQkJfQogCQl9CiAJCS8qIGlmIHRoZSBzc2lkIG1hdGNoZWQgJiBic3NpZCB1bm1hdGNoZWQsIHdlIHNob3VsZCBzZWxlY3QgdGhlIGJzc2lkIHdpdGggbGFyZ2UgdmFsdWUuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS93cGEuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3dwYS5jCmluZGV4IDY5YjhhMjQuLmZmMzQ4MzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3dwYS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3dwYS5jCkBAIC0zMyw3ICszMyw4IEBACiAJV2hvCQkJV2hlbgkJCVdoYXQKIAktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJSmFuCUxlZQkJMDMtMDctMjIJCUluaXRpYWwKLQlQYXVsIExpbgkwMy0xMS0yOAkJTW9kaWZ5IGZvciBzdXBwbGljYW50CisJUGF1bCBMaW4JCTAzLTExLTI4CQlNb2RpZnkgZm9yIHN1cHBsaWNhbnQKKwlKdXN0aW4gUC4gTWF0dG9jawkxMS8wNy8yMDEwCQlGaXggdHlwb3MKICovCiAjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCiAKQEAgLTg2LDcgKzg3LDcgQEAKIAkJCS8qIFZpb2xhdGUgTUlDIGVycm9yIGNvdW50cywgTUlDIGNvdW50ZXJtZWFzdXJlcyBraWNrcyBpbiAqLwogCQkJcEFkLT5TdGFDZmcuTWljRXJyQ250Kys7CiAJCQkvKiBXZSBzaGFsbCBibG9jayBhbGwgcmVjZXB0aW9uICovCi0JCQkvKiBXZSBzaGFsbCBjbGVhbiBhbGwgVHggcmluZyBhbmQgZGlzYXNzb2ljYXRlIGZyb20gQVAgYWZ0ZXIgbmV4dCBFQVBPTCBmcmFtZSAqLworCQkJLyogV2Ugc2hhbGwgY2xlYW4gYWxsIFR4IHJpbmcgYW5kIGRpc2Fzc29jaWF0ZSBmcm9tIEFQIGFmdGVyIG5leHQgRUFQT0wgZnJhbWUgKi8KIAkJCS8qICovCiAJCQkvKiBObyBuZWNlc3NhcnkgdG8gY2xlYW4gYWxsIFR4IHJpbmcsIG9uIFJUTVBIYXJkVHJhbnNtaXQgd2lsbCBzdG9wIHNlbmRpbmcgbm9uLTgwMi4xWCBFQVBPTCBwYWNrZXRzICovCiAJCQkvKiBpZiBwQWQtPlN0YUNmZy5NaWNFcnJDbnQgZ3JlYXRlciB0aGFuIDIuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YV9pb2N0bC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGFfaW9jdGwuYwppbmRleCBlMDk1YTQ0Li41NzE3ZTEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YV9pb2N0bC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhX2lvY3RsLmMKQEAgLTMxLDEwICszMSwxMSBAQAogICAgIElPQ1RMIHJlbGF0ZWQgc3Vicm91dGluZXMKIAogICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisgICAgCVdobyAgICAgICAgCQkgV2hlbiAgICAgICAgICBXaGF0CiAgICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgUm9yeSBDaGVuICAgMDEtMDMtMjAwMyAgICBjcmVhdGVkCi0JUm9yeSBDaGVuICAgMDItMTQtMjAwNSAgICBtb2RpZnkgdG8gc3VwcG9ydCBSVDYxCisgICAJUm9yeSBDaGVuICAgCQkwMS0wMy0yMDAzICAgIAljcmVhdGVkCisJUm9yeSBDaGVuICAgCQkwMi0xNC0yMDA1ICAgIAltb2RpZnkgdG8gc3VwcG9ydCBSVDYxCisJSnVzdGluIFAuIE1hdHRvY2sJMTEvMDcvMjAxMAlGaXggdHlwb3MKICovCiAKICNpbmNsdWRlCSJydF9jb25maWcuaCIKQEAgLTg1MSw3ICs4NTIsNyBAQAogCiAJCS8qCiAJCSAgIFByb3RvY29sOgotCQkgICBpdCB3aWxsIHNob3cgc2Nhbm5lZCBBUCdzIFdpcmVsZXNzTW9kZSAuCisJCSAgIGl0IHdpbGwgc2hvdyBzY2FubmVkIEFQJ3MgV2lyZWxlc3NNb2RlLgogCQkgICBpdCBtaWdodCBiZQogCQkgICA4MDIuMTFhCiAJCSAgIDgwMi4xMWEvbgpAQCAtODc1LDEzICs4NzYsMTMgQEAKIAkJCQkJc3RyY3B5KGl3ZS51Lm5hbWUsICI4MDIuMTFhIik7CiAJCQl9IGVsc2UgewogCQkJCS8qCi0JCQkJICAgaWYgb25lIG9mIG5vbiBCIG1vZGUgcmF0ZSBpcyBzZXQgc3VwcG9ydGVkIHJhdGUgLiBpdCBtZWFuIEcgb25seS4KKwkJCQkgICBpZiBvbmUgb2Ygbm9uIEIgbW9kZSByYXRlIGlzIHNldCBzdXBwb3J0ZWQgcmF0ZSwgaXQgbWVhbnMgRyBvbmx5LgogCQkJCSAqLwogCQkJCWZvciAocmF0ZUNudCA9IDA7CiAJCQkJICAgICByYXRlQ250IDwgcEJzc0VudHJ5LT5TdXBSYXRlTGVuOwogCQkJCSAgICAgcmF0ZUNudCsrKSB7CiAJCQkJCS8qCi0JCQkJCSAgIDZNYnBzKDE0MCkgOU1icHMoMTQ2KSBhbmQgPj0xMk1icHMoMTUyKSBhcmUgc3VwcG9ydGVkIHJhdGUgLCBpdCBtZWFuIEcgb25seS4KKwkJCQkJICAgNk1icHMoMTQwKSA5TWJwcygxNDYpIGFuZCA+PTEyTWJwcygxNTIpIGFyZSBzdXBwb3J0ZWQgcmF0ZSwgaXQgbWVhbnMgRyBvbmx5LgogCQkJCQkgKi8KIAkJCQkJaWYgKHBCc3NFbnRyeS0+U3VwUmF0ZVtyYXRlQ250XSA9PSAxNDAKIAkJCQkJICAgIHx8IHBCc3NFbnRyeS0+U3VwUmF0ZVtyYXRlQ250XSA9PQpAQCAtMTQxNyw3ICsxNDE4LDcgQEAKIAkJaWYgKChpbmRleCA+PSAwKSAmJiAoaW5kZXggPCA0KSkgewogCQkJcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSBpbmRleDsKIAkJfSBlbHNlCi0JCQkvKiBEb24ndCBjb21wbGFpbiBpZiBvbmx5IGNoYW5nZSB0aGUgbW9kZSAqLworCQkJLyogRG9uJ3QgY29tcGxhaW4gaWYgdGhlIG1vZGUgaXMgb25seSBjaGFuZ2VkICovCiAJCWlmICghKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfTU9ERSkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0yNzMyLDggKzI3MzMsOCBAQAogCQkJfQogCQkJaWYgKElORlJBX09OKHBBZGFwdGVyKSkgewogCQkJCS8qQk9PTEVBTiBDYW5jZWxsZWQ7ICovCi0JCQkJLyogU2V0IHRoZSBBdXRvUmVjb25uZWN0U3NpZCB0byBwcmV2ZW50IGl0IHJlY29ubmVjdCB0byBvbGQgU1NJRCAqLwotCQkJCS8qIFNpbmNlIGNhbGxpbmcgdGhpcyBpbmRpY2F0ZSB1c2VyIGRvbid0IHdhbnQgdG8gY29ubmVjdCB0byB0aGF0IFNTSUQgYW55bW9yZS4gKi8KKwkJCQkvKiBTZXQgdGhlIEF1dG9SZWNvbm5lY3RTc2lkIHRvIHByZXZlbnQgaXQgZnJvbSByZWNvbm5lY3RpbmcgdG8gdGhlIG9sZCBTU0lEICovCisJCQkJLyogU2luY2UgY2FsbGluZyB0aGlzIGluZGljYXRlcyB1c2VycyBkb24ndCB3YW50IHRvIGNvbm5lY3QgdG8gdGhhdCBTU0lEIGFueW1vcmUuICovCiAJCQkJcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4gPSAzMjsKIAkJCQlOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+TWxtZUF1eC4KIAkJCQkJICAgICAgIEF1dG9SZWNvbm5lY3RTc2lkLApAQCAtMjc2Niw4ICsyNzY3LDggQEAKIAkJCQlMaW5rRG93bihwQWRhcHRlciwgRkFMU0UpOwogCQkJfQogCQkJaWYgKEFESE9DX09OKHBBZGFwdGVyKSkgewotCQkJCS8qIFNldCB0aGUgQXV0b1JlY29ubmVjdFNzaWQgdG8gcHJldmVudCBpdCByZWNvbm5lY3QgdG8gb2xkIFNTSUQgKi8KLQkJCQkvKiBTaW5jZSBjYWxsaW5nIHRoaXMgaW5kaWNhdGUgdXNlciBkb24ndCB3YW50IHRvIGNvbm5lY3QgdG8gdGhhdCBTU0lEIGFueW1vcmUuICovCisJCQkJLyogU2V0IHRoZSBBdXRvUmVjb25uZWN0U3NpZCB0byBwcmV2ZW50IGl0IGZyb20gcmVjb25uZWN0aW5nIHRvIHRoZSBvbGQgU1NJRCAqLworCQkJCS8qIFNpbmNlIGNhbGxpbmcgdGhpcyBpbmRpY2F0ZXMgdXNlcnMgZG9uJ3Qgd2FudCB0byBjb25uZWN0IHRvIHRoYXQgU1NJRCBhbnltb3JlLiAqLwogCQkJCXBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuID0gMzI7CiAJCQkJTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPk1sbWVBdXguCiAJCQkJCSAgICAgICBBdXRvUmVjb25uZWN0U3NpZCwKQEAgLTI4ODQsNyArMjg4NSw3IEBACiAJCX0KIAkJLyogRW5hYmxlIFJ4IHdpdGggcHJvbWlzY3VvdXMgcmVjZXB0aW9uICovCiAJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgUlhfRklMVFJfQ0ZHLCAweDMpOwotCQkvKiBBU0lDIHN1cHBvcnN0cyBzbmlmZmVyIGZ1bmN0aW9uIHdpdGggcmVwbGFjaW5nIFJTU0kgd2l0aCB0aW1lc3RhbXAuICovCisJCS8qIEFTSUMgc3VwcG9ydHMgc25pZmZlciBmdW5jdGlvbiB3aXRoIHJlcGxhY2luZyBSU1NJIHdpdGggdGltZXN0YW1wLiAqLwogCQkvKlJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7ICovCiAJCS8qVmFsdWUgfD0gKDB4ODApOyAqLwogCQkvKlJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3VzYl9tYWluX2Rldi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC91c2JfbWFpbl9kZXYuYwppbmRleCBjZDE1ZGFhLi5lZTY4ZDUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3VzYl9tYWluX2Rldi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvdXNiX21haW5fZGV2LmMKQEAgLTI3LDggKzI3LDggQEAKICNpbmNsdWRlICJydF9jb25maWcuaCIKIAogLyogRm9sbG93aW5nIGluZm9ybWF0aW9uIHdpbGwgYmUgc2hvdyB3aGVuIHlvdSBydW4gJ21vZGluZm8nICovCi0vKiAqKiogSWYgeW91IGhhdmUgYSBzb2x1dGlvbiBmb3IgdGhlIGJ1ZyBpbiBjdXJyZW50IHZlcnNpb24gb2YgZHJpdmVyLCBwbGVhc2UgbWFpbCB0byBtZS4gKi8KLS8qIE90aGVyd2lzZSBwb3N0IHRvIGZvcnVtIGluIHJhbGlua3RlY2gncyB3ZWIgc2l0ZSh3d3cucmFsaW5rdGVjaC5jb20pIGFuZCBsZXQgYWxsIHVzZXJzIGhlbHAgeW91LiAqKiogKi8KKy8qIElmIHlvdSBoYXZlIGEgc29sdXRpb24gZm9yIHRoZSBidWcgaW4gY3VycmVudCB2ZXJzaW9uIG9mIGRyaXZlciwgcGxlYXNlIGUtbWFpbCBtZS4gKi8KKy8qIE90aGVyd2lzZSBwb3N0IHRvIHRoZSBmb3J1bSBhdCByYWxpbmt0ZWNoJ3Mgd2ViIHNpdGUod3d3LnJhbGlua3RlY2guY29tKSBhbmQgbGV0IGFsbCB1c2VycyBoZWxwIHlvdS4gKi8KIE1PRFVMRV9BVVRIT1IoIlBhdWwgTGluIDxwYXVsX2xpbkByYWxpbmt0ZWNoLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiUlQyODcwL1JUMzA3MCBXaXJlbGVzcyBMYW4gTGludXggRHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CkBAIC0yMzMsNyArMjMzLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgcnR1c2JfdXNiX2lkX2xlbjsgaSsrKSB7CiAJCWlmIChkZXZfcC0+ZGVzY3JpcHRvci5pZFZlbmRvciA9PSBydHVzYl91c2JfaWRbaV0uaWRWZW5kb3IgJiYKIAkJICAgIGRldl9wLT5kZXNjcmlwdG9yLmlkUHJvZHVjdCA9PSBydHVzYl91c2JfaWRbaV0uaWRQcm9kdWN0KSB7Ci0JCQlwcmludGsoInJ0Mjg3MDogaWRWZW5kb3IgPSAweCV4LCBpZFByb2R1Y3QgPSAweCV4XG4iLAorCQkJcHJpbnRrKEtFUk5fSU5GTyAicnQyODcwOiBpZFZlbmRvciA9IDB4JXgsIGlkUHJvZHVjdCA9IDB4JXhcbiIsCiAJCQkgICAgICAgZGV2X3AtPmRlc2NyaXB0b3IuaWRWZW5kb3IsCiAJCQkgICAgICAgZGV2X3AtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KTsKIAkJCWJyZWFrOwpAQCAtMjQxLDcgKzI0MSw3IEBACiAJfQogCiAJaWYgKGkgPT0gcnR1c2JfdXNiX2lkX2xlbikgewotCQlwcmludGsoInJ0Mjg3MDogRXJyb3IhIERldmljZSBEZXNjcmlwdG9yIG5vdCBtYXRjaGluZyFcbiIpOworCQlwcmludGsoS0VSTl9FUlIgInJ0Mjg3MDogRXJyb3IhIERldmljZSBEZXNjcmlwdG9yIG5vdCBtYXRjaGluZyFcbiIpOwogCQlyZXR1cm4gRkFMU0U7CiAJfQogCkBAIC0zMjMsNyArMzIzLDcgQEAKIAogCWlmICghKHBBZC0+QnVsa0luRXBBZGRyICYmIHBBZC0+QnVsa091dEVwQWRkclswXSkpIHsKIAkJcHJpbnRrCi0JCSAgICAoIiVzOiBDb3VsZCBub3QgZmluZCBib3RoIGJ1bGstaW4gYW5kIGJ1bGstb3V0IGVuZHBvaW50c1xuIiwKKwkJICAgIChLRVJOX0VSUiAiJXM6IENvdWxkIG5vdCBmaW5kIGJvdGggYnVsay1pbiBhbmQgYnVsay1vdXQgZW5kcG9pbnRzXG4iLAogCQkgICAgIF9fRlVOQ1RJT05fXyk7CiAJCXJldHVybiBGQUxTRTsKIAl9CkBAIC00MjMsNyArNDIzLDcgQEAKIC8qIEluaXQgZHJpdmVyIG1vZHVsZSAqLwogaW50IF9faW5pdCBydHVzYl9pbml0KHZvaWQpCiB7Ci0JcHJpbnRrKCJydHVzYiBpbml0IC0tLT5cbiIpOworCXByaW50ayhLRVJOX0RFQlVHICJydHVzYiBpbml0IC0tLT5cbiIpOwogCXJldHVybiB1c2JfcmVnaXN0ZXIoJnJ0dXNiX2RyaXZlcik7CiB9CiAKQEAgLTQzMSw3ICs0MzEsNyBAQAogdm9pZCBfX2V4aXQgcnR1c2JfZXhpdCh2b2lkKQogewogCXVzYl9kZXJlZ2lzdGVyKCZydHVzYl9kcml2ZXIpOwotCXByaW50aygiPC0tLSBydHVzYiBleGl0XG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiPC0tLSBydHVzYiBleGl0XG4iKTsKIH0KIAogbW9kdWxlX2luaXQocnR1c2JfaW5pdCk7CkBAIC04MTQsNyArODE0LDcgQEAKIAkJICBkZXYtPmJ1cy0+YnVzX25hbWUsIGRldi0+ZGV2cGF0aCkpOwogCWlmICghcEFkKSB7CiAJCXVzYl9wdXRfZGV2KGRldik7Ci0JCXByaW50aygicnR1c2JfZGlzY29ubmVjdDogcEFkID09IE5VTEwhXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJydHVzYl9kaXNjb25uZWN0OiBwQWQgPT0gTlVMTCFcbiIpOwogCQlyZXR1cm47CiAJfQogCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpOwpAQCAtODg0LDggKzg4NCw4IEBACiAJaWYgKG5ldF9kZXYgPT0gTlVMTCkKIAkJZ290byBlcnJfb3V0X2ZyZWVfcmFkZXY7CiAKLQkvKiBIZXJlIGFyZSB0aGUgbmV0X2RldmljZSBzdHJ1Y3R1cmUgd2l0aCB1c2Igc3BlY2lmaWMgcGFyYW1ldGVycy4gKi8KLQkvKiBmb3Igc3VwcG9ydGluZyBOZXR3b3JrIE1hbmFnZXIuCisJLyogSGVyZSBhcmUgdGhlIG5ldF9kZXZpY2Ugc3RydWN0dXJlIHdpdGggdXNiIHNwZWNpZmljIHBhcmFtZXRlcnMuIAorCSAqIGZvciBzdXBwb3J0aW5nIE5ldHdvcmsgTWFuYWdlci4KIAkgKiBTZXQgdGhlIHN5c2ZzIHBoeXNpY2FsIGRldmljZSByZWZlcmVuY2UgZm9yIHRoZSBuZXR3b3JrIGxvZ2ljYWwgZGV2aWNlIGlmIHNldCBwcmlvciB0byByZWdpc3RyYXRpb24gd2lsbAogCSAqIGNhdXNlIGEgc3ltbGluayBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCiAJICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3dwYS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC93cGEuaAppbmRleCA2MTk5YWU2Li4xMTZmYzJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3dwYS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvd3BhLmgKQEAgLTMyLDEzICszMiwxNCBAQAogCVJldmlzaW9uIEhpc3Rvcnk6CiAJV2hvCQkJV2hlbgkJCVdoYXQKIAktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JTmFtZQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCisJTmFtZQkJCURhdGUJCQlNb2RpZmljYXRpb24gbG9ncworCUp1c3RpbiBQLiBNYXR0b2NrCTExLzA3LzIwMTAJCUZpeCBhIHR5cG8KICovCiAKICNpZm5kZWYJX19XUEFfSF9fCiAjZGVmaW5lCV9fV1BBX0hfXwogCi0vKiBFQVBPTCBLZXkgZGVzY3JpcHRlciBmcmFtZSBmb3JtYXQgcmVsYXRlZCBsZW5ndGggKi8KKy8qIEVBUE9MIEtleSBkZXNjcmlwdG9yIGZyYW1lIGZvcm1hdCByZWxhdGVkIGxlbmd0aCAqLwogI2RlZmluZSBMRU5fS0VZX0RFU0NfTk9OQ0UJCQkzMgogI2RlZmluZSBMRU5fS0VZX0RFU0NfSVYJCQkJMTYKICNkZWZpbmUgTEVOX0tFWV9ERVNDX1JTQwkJCTgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jCmluZGV4IGRkOGEyMjEuLmIyNmI1YTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfdHguYwpAQCAtODIyLDcgKzgyMiw3IEBACiAJCXsKIAkJCXR4Yi0+cXVldWVfaW5kZXggPSBVUDJBQyhza2ItPnByaW9yaXR5KTsKIAkJfSBlbHNlIHsKLQkJCXR4Yi0+cXVldWVfaW5kZXggPSBXTUVfQUNfQks7OworCQkJdHhiLT5xdWV1ZV9pbmRleCA9IFdNRV9BQ19CSzsKIAkJfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkVfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV9jb3JlLmMKaW5kZXggYjE3ODZkYy4uZmFjNGVlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV9jb3JlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV9jb3JlLmMKQEAgLTg5LDcgKzg5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIAlDT01QX0lOVFIgICAgICAgfAogCQkJCUNPTVBfRVJSIDsgLy9hbHdheXMgb3BlbiBlcnIgZmxhZ3Mgb24KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHJ0bDgxOTJfcGNpX2lkX3RibFtdIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUocnRsODE5Ml9wY2lfaWRfdGJsKSA9IHsKICNpZmRlZiBSVEw4MTkwUAogCS8qIFJlYWx0ZWsgKi8KIAkvKiBEbGluayAqLwpAQCAtMjI4Myw5ICsyMjgzLDcgQEAKIAkJCQlJTVJfVFhGT1ZXIHwgSU1SX0JjbkludCB8IElNUl9UQkRPSyB8IElNUl9UQkRFUik7CiAKIAlwcml2LT5BY21Db250cm9sID0gMDsKLQlwcml2LT5wRmlybXdhcmUgPSAocnRfZmlybXdhcmUqKXZtYWxsb2Moc2l6ZW9mKHJ0X2Zpcm13YXJlKSk7Ci0JaWYgKHByaXYtPnBGaXJtd2FyZSkKLQltZW1zZXQocHJpdi0+cEZpcm13YXJlLCAwLCBzaXplb2YocnRfZmlybXdhcmUpKTsKKwlwcml2LT5wRmlybXdhcmUgPSB2emFsbG9jKHNpemVvZihydF9maXJtd2FyZSkpOwogCiAJLyogcnggcmVsYXRlZCBxdWV1ZSAqLwogICAgICAgICBza2JfcXVldWVfaGVhZF9pbml0KCZwcml2LT5yeF9xdWV1ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOXhFX3BoeS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTl4RV9waHkuYwppbmRleCBkODNiY2JjLi41MGNkMGU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOXhFX3BoeS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5eEVfcGh5LmMKQEAgLTI1OTYsNyArMjU5Niw3IEBACiAJCQlicmVhazsKIAl9CiAKLQlyZXR1cm4gcmV0OzsKKwlyZXR1cm4gcmV0OwogCiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvTWFrZWZpbGUKaW5kZXggMjA2ZDkyNC4uZWVmYzY1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9NYWtlZmlsZQpAQCAtOSw3ICs5LDYgQEAKICNjY2ZsYWdzLXkgKz0gLURVU0JfVFhfRFJJVkVSX0FHR1JFR0FUSU9OX0VOQUJMRQogI2NjZmxhZ3MteSArPSAtRFVTQl9SWF9BR0dSRUdBVElPTl9TVVBQT1JUCiBjY2ZsYWdzLXkgKz0gLURVU0VfT05FX1BJUEUKLWNjZmxhZ3MteSArPSAtREVOQUJMRV9ET1QxMUQKIGNjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEKIAogcjgxOTJ1X3VzYi15IDo9IHI4MTkyVV9jb3JlLm8gcjgxODBfOTNjeDYubyByODE5MlVfd3gubwkJXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2RvdDExZC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2RvdDExZC5oCmluZGV4IGQ5OWNjMDMuLjkyZTdhMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9kb3QxMWQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvZG90MTFkLmgKQEAgLTEsNyArMSw2IEBACiAjaWZuZGVmIF9fSU5DX0RPVDExRF9ICiAjZGVmaW5lIF9fSU5DX0RPVDExRF9ICiAKLSNpZmRlZiBFTkFCTEVfRE9UMTFECiAjaW5jbHVkZSAiaWVlZTgwMjExL2llZWU4MDIxMS5oIgogCiAKQEAgLTk4LDUgKzk3LDQgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqZGV2LAogCXU4IGNoYW5uZWwKICk7Ci0jZW5kaWYgLyogRU5BQkxFX0RPVDExRCAqLwogI2VuZGlmIC8qICNpZm5kZWYgX19JTkNfRE9UMTFEX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL01ha2VmaWxlCmluZGV4IDQ1NzA0ZjguLjA3NzVjNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9NYWtlZmlsZQpAQCAtMjAsNyArMjAsNiBAQAogZW5kaWYKICNjY2ZsYWdzLXkgOj0gLURKT0hOX05PQ1BZCiAjZmxhZ3MgdG8gZW5hYmxlIG9yIGRpc2JsZSA4MDIxMUQgZmVhdHVyZQotY2NmbGFncy15ICs9IC1ERU5BQkxFX0RPVDExRAogaWVlZTgwMjExLXJzbC1vYmpzIDo9IGllZWU4MDIxMV9yeC5vIFwKIAkJICAgICAgaWVlZTgwMjExX3NvZnRtYWMubyBcCiAJCSAgICAgIGllZWU4MDIxMV90eC5vIFwKQEAgLTc1LDcgKzc0LDYgQEAKIENGTEFHUyArPSAtRE1PRFZFUlNJT05TIC1ERVhQT1JUX1NZTVRBQiAtaW5jbHVkZSAkKEtTUkMpL2luY2x1ZGUvbGludXgvbW9kdmVyc2lvbnMuaAogI0tlcm5lbCAyLjQuMjAKICNDRkxBR1MgKz0gLURfX05PX1ZFUlNJT05fXyAtREVYUE9SVF9TWU1UQUIKLSNDRkxBR1MgKz0gLURFTkFCTEVfRE9UMTFECiBTTVAgOj0gJChzaGVsbCAkKENDKSAkKE1PRENGTEFHUykgLUUgLWRNICQoQ09ORklHX0ZJTEUpIHwgXAogICAgZ3JlcCBDT05GSUdfU01QIHwgYXdrICd7cHJpbnQgJCQzfScpCiBpZm5lcSAoJChTTVApLDEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2RvdDExZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9kb3QxMWQuYwppbmRleCBiOTFjYmZjLi5jZTYzZmMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2RvdDExZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvZG90MTFkLmMKQEAgLTEsNCArMSwzIEBACi0jaWZkZWYgRU5BQkxFX0RPVDExRAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8JRmlsZToKIC8vCQlEb3QxMWQuYwpAQCAtMjIwLDQgKzIxOSwzIEBACiBFWFBPUlRfU1lNQk9MKElzTGVnYWxDaGFubmVsKTsKIEVYUE9SVF9TWU1CT0woVG9MZWdhbENoYW5uZWwpOwogCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvZG90MTFkLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2RvdDExZC5oCmluZGV4IDE1YjdhNGIuLjU0ZjJiNGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvZG90MTFkLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9kb3QxMWQuaApAQCAtMSwxMCArMSw4IEBACiAjaWZuZGVmIF9fSU5DX0RPVDExRF9ICiAjZGVmaW5lIF9fSU5DX0RPVDExRF9ICiAKLSNpZmRlZiBFTkFCTEVfRE9UMTFECiAjaW5jbHVkZSAiaWVlZTgwMjExLmgiCiAKLS8vI2RlZmluZSBFTkFCTEVfRE9UMTFECiAKIC8vI2RlZmluZSBET1QxMURfTUFYX0NITkxfTlVNIDgzCiAKQEAgLTk4LDUgKzk2LDQgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqIGRldiwKIAl1OCBjaGFubmVsCiApOwotI2VuZGlmIC8vRU5BQkxFX0RPVDExRAogI2VuZGlmIC8vICNpZm5kZWYgX19JTkNfRE9UMTFEX0gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMS5oCmluZGV4IGUxMjE2YjcuLmMwYjg0NGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTEuaApAQCAtMTU3MiwxMCArMTU3Miw4IEBACiAjaWZkZWYgVEhPTUFTX1RVUkJPCiAJdTggVHVyYm9fRW5hYmxlOy8vZW5hYmxlIHR1cmJvIG1vZGUsIGFkZGVkIGJ5IHRob21hcwogI2VuZGlmCi0jaWZkZWYgRU5BQkxFX0RPVDExRAogCXUxNiBDb3VudHJ5SWVMZW47CiAJdTggQ291bnRyeUllQnVmW01BWF9JRV9MRU5dOwotI2VuZGlmCiAJLy8gSFQgUmVsYXRlZCwgYnkgYW15LCAyMDA4LjA0LjI5CiAJQlNTX0hUCWJzc2h0OwogCS8vIEFkZCB0byBoYW5kbGUgYnJvYWRjb20gQVAgbWFuYWdlbWVudCBmcmFtZSBDQ0sgcmF0ZS4KQEAgLTE3NjksNyArMTc2Nyw2IEBACiAjZGVmaW5lIFJGX0NIQU5HRV9CWV9JUFMgQklUMjgKICNkZWZpbmUgUkZfQ0hBTkdFX0JZX0lOSVQJMAkvLyBEbyBub3QgY2hhbmdlIHRoZSBSRk9mZiByZWFzb24uIERlZmluZWQgYnkgQnJ1Y2UsIDIwMDgtMDEtMTcuCiAKLSNpZmRlZiBFTkFCTEVfRE9UMTFECiB0eXBlZGVmIGVudW0KIHsKIAlDT1VOVFJZX0NPREVfRkNDID0gMCwKQEAgLTE3ODQsNyArMTc4MSw2IEBACiAJQ09VTlRSWV9DT0RFX01JQywKIAlDT1VOVFJZX0NPREVfR0xPQkFMX0RPTUFJTgogfWNvdW50cnlfY29kZV90eXBlX3Q7Ci0jZW5kaWYKIAogI2RlZmluZSBSVF9NQVhfTERfU0xPVF9OVU0JMTAKIHR5cGVkZWYgc3RydWN0IF9SVF9MSU5LX0RFVEVDVF9UewpAQCAtMTk3MCwxMiArMTk2Niw4IEBACiAKIAkvKiBtYXAgb2YgYWxsb3dlZCBjaGFubmVscy4gMCBpcyBkdW1teSAqLwogCS8vIEZJWE1FOiByZW1lYmVyIHRvIGRlZmF1bHQgdG8gYSBiYXNpYyBjaGFubmVsIHBsYW4gZGVwZW5kaW5nIG9mIHRoZSBQSFkgdHlwZQotI2lmZGVmIEVOQUJMRV9ET1QxMUQKIAl2b2lkKiBwRG90MTFkSW5mbzsKIAlib29sIGJHbG9iYWxEb21haW47Ci0jZWxzZQotCWludCBjaGFubmVsX21hcFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07Ci0jZW5kaWYKIAlpbnQgcmF0ZTsgICAgICAgLyogY3VycmVudCByYXRlICovCiAJaW50IGJhc2ljX3JhdGU7CiAJLy9GSVhNRTogcGxlYWNlIGNhbGxiYWNrLCBzZWUgaWYgcmVkdW5kYW50IHdpdGggc29mdG1hY19mZWF0dXJlcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfcnguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMKaW5kZXggYzhjYTlkOC4uMWVhOGRhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfcnguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jCkBAIC00NCw5ICs0NCw3IEBACiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KIAogI2luY2x1ZGUgImllZWU4MDIxMS5oIgotI2lmZGVmIEVOQUJMRV9ET1QxMUQKICNpbmNsdWRlICJkb3QxMWQuaCIKLSNlbmRpZgogc3RhdGljIGlubGluZSB2b2lkIGllZWU4MDIxMV9tb25pdG9yX3J4KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAogCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cykKQEAgLTE1OTksNyArMTU5Nyw2IEBACiB9CiAjZW5kaWYKIAotI2lmZGVmIEVOQUJMRV9ET1QxMUQKIHN0YXRpYyBpbmxpbmUgdm9pZCBpZWVlODAyMTFfZXh0cmFjdF9jb3VudHJ5X2llKAogCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAogCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50ICppbmZvX2VsZW1lbnQsCkBAIC0xNjMyLDcgKzE2MjksNiBAQAogCX0KIAogfQotI2VuZGlmCiAKIGludCBpZWVlODAyMTFfcGFyc2VfaW5mb19wYXJhbShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKIAkJc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgKmluZm9fZWxlbWVudCwKQEAgLTIwODYsMTQgKzIwODIsMTIgQEAKIAkJCSAgICAgICAiUW9TIEVycm9yIG5lZWQgdG8gcGFyc2UgUU9TX1BBUkFNRVRFUiBJRVxuIik7CiAJCQlicmVhazsKIAotI2lmZGVmIEVOQUJMRV9ET1QxMUQKIAkJY2FzZSBNRklFX1RZUEVfQ09VTlRSWToKIAkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJNRklFX1RZUEVfQ09VTlRSWTogJWQgYnl0ZXNcbiIsCiAJCQkJCSAgICAgaW5mb19lbGVtZW50LT5sZW4pOwogCQkJLy9wcmludGsoIj09PT09PlJlY2VpdmUgPCVzPiBDb3VudHJ5IElFXG4iLG5ldHdvcmstPnNzaWQpOwogCQkJaWVlZTgwMjExX2V4dHJhY3RfY291bnRyeV9pZShpZWVlLCBpbmZvX2VsZW1lbnQsIG5ldHdvcmssIG5ldHdvcmstPmJzc2lkKTsvL2FkZHIyIGlzIHNhbWUgYXMgYWRkcjMgd2hlbiBmcm9tIGFuIEFQCiAJCQlicmVhazsKLSNlbmRpZgogLyogVE9ETyAqLwogCQlkZWZhdWx0OgogCQkJSUVFRTgwMjExX0RFQlVHX01HTVQKQEAgLTIyMjksMTAgKzIyMjMsOCBAQAogI2lmZGVmIFRIT01BU19UVVJCTwogCW5ldHdvcmstPlR1cmJvX0VuYWJsZSA9IDA7CiAjZW5kaWYKLSNpZmRlZiBFTkFCTEVfRE9UMTFECiAJbmV0d29yay0+Q291bnRyeUllTGVuID0gMDsKIAltZW1zZXQobmV0d29yay0+Q291bnRyeUllQnVmLCAwLCBNQVhfSUVfTEVOKTsKLSNlbmRpZgogLy9Jbml0aWFsaXplIEhUIHBhcmFtZXRlcnMKIAkvL2llZWU4MDIxMV9odF9pbml0aWFsaXplKCZuZXR3b3JrLT5ic3NodCk7CiAJSFRJbml0aWFsaXplQnNzRGVzYygmbmV0d29yay0+YnNzaHQpOwpAQCAtMjM5OSwxMCArMjM5MSw4IEBACiAJZHN0LT5UdXJib19FbmFibGUgPSBzcmMtPlR1cmJvX0VuYWJsZTsKICNlbmRpZgogCi0jaWZkZWYgRU5BQkxFX0RPVDExRAogCWRzdC0+Q291bnRyeUllTGVuID0gc3JjLT5Db3VudHJ5SWVMZW47CiAJbWVtY3B5KGRzdC0+Q291bnRyeUllQnVmLCBzcmMtPkNvdW50cnlJZUJ1Ziwgc3JjLT5Db3VudHJ5SWVMZW4pOwotI2VuZGlmCiAKIAkvL2FkZGVkIGJ5IGFteSBmb3IgTEVBUAogCWRzdC0+YldpdGhBaXJvbmV0SUUgPSBzcmMtPmJXaXRoQWlyb25ldElFOwpAQCAtMjQ3MCw3ICsyNDYwLDYgQEAKIAkJcmV0dXJuOwogCX0KIAotI2lmZGVmIEVOQUJMRV9ET1QxMUQKIAkvLyBGb3IgQXN1cyBFZWVQYyByZXF1ZXN0LAogCS8vICgxKSBpZiB3aXJlbGVzcyBhZGFwdGVyIHJlY2VpdmUgZ2V0IGFueSA4MDIuMTFkIGNvdW50cnkgY29kZSBpbiBBUCBiZWFjb24sCiAJLy8JICAgd2lyZWxlc3MgYWRhcHRlciBzaG91bGQgZm9sbG93IHRoZSBjb3VudHJ5IGNvZGUuCkBAIC0yNTI3LDcgKzI1MTYsNiBAQAogCQkJfQogCQl9CiAJfQotI2VuZGlmCiAKIAkvKiBUaGUgbmV0d29yayBwYXJzZWQgY29ycmVjdGx5IC0tIHNvIG5vdyB3ZSBzY2FuIG91ciBrbm93biBuZXR3b3JrcwogCSAqIHRvIHNlZSBpZiB3ZSBjYW4gZmluZCBpdCBpbiBvdXIgbGlzdC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYwppbmRleCBiYzhjNDI1Li4yMGY4YzM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCkBAIC0yMSw5ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2lmZGVmIEVOQUJMRV9ET1QxMUQKICNpbmNsdWRlICJkb3QxMWQuaCIKLSNlbmRpZgogCiB1OCByc25fYXV0aGVuX2NpcGhlcl9zdWl0ZVsxNl1bNF0gPSB7CiAJezB4MDAsMHgwRiwweEFDLDB4MDB9LCAvL1VzZSBncm91cCBrZXksIC8vUmVzZXJ2ZWQKQEAgLTQzMCwxMCArNDI4LDggQEAKIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfc2Nhbl9zeW5jcm8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJc2hvcnQgY2ggPSAwOwotI2lmZGVmIEVOQUJMRV9ET1QxMUQKIAl1OCBjaGFubmVsX21hcFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07CiAJbWVtY3B5KGNoYW5uZWxfbWFwLCBHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7Ci0jZW5kaWYKIAlkb3duKCZpZWVlLT5zY2FuX3NlbSk7CiAKIAl3aGlsZSgxKQpAQCAtNDQzLDExICs0MzksNyBAQAogCQkJY2grKzsKIAkJCWlmIChjaCA+IE1BWF9DSEFOTkVMX05VTUJFUikKIAkJCQlnb3RvIG91dDsgLyogc2NhbiBjb21wbGV0ZWQgKi8KLSNpZmRlZiBFTkFCTEVfRE9UMTFECiAJCX13aGlsZSghY2hhbm5lbF9tYXBbY2hdKTsKLSNlbHNlCi0JCX13aGlsZSghaWVlZS0+Y2hhbm5lbF9tYXBbY2hdKTsKLSNlbmRpZgogCiAJCS8qIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBpbiB0d28gc2l0dWF0aW9ucwogCQkgKiAxLSBXZSBoYXZlIHN3aXRjaGVkIHRvIGFkLWhvYyBtb2RlIGFuZCB3ZSBhcmUKQEAgLTQ3MSw5ICs0NjMsNyBAQAogCQlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkKIAkJCWdvdG8gb3V0OwogCQlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGNoKTsKLSNpZmRlZiBFTkFCTEVfRE9UMTFECiAJCWlmKGNoYW5uZWxfbWFwW2NoXSA9PSAxKQotI2VuZGlmCiAJCWllZWU4MDIxMV9zZW5kX3Byb2JlX3JlcXVlc3RzKGllZWUpOwogCiAJCS8qIHRoaXMgcHJldmVudCBleGNlc3NpdmUgdGltZSB3YWl0IHdoZW4gd2UKQEAgLTQ5NiwxMCArNDg2LDggQEAKIAl9CiAJZWxzZXsKIAlpZWVlLT5zeW5jX3NjYW5faHVycnl1cCA9IDA7Ci0jaWZkZWYgRU5BQkxFX0RPVDExRAogCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkpCiAJCURPVDExRF9TY2FuQ29tcGxldGUoaWVlZSk7Ci0jZW5kaWYKIAl1cCgmaWVlZS0+c2Nhbl9zZW0pOwogfQogfQpAQCAtNTEwLDEwICs0OTgsOCBAQAogCXN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkZWxheWVkX3dvcmssIHdvcmspOwogCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKGR3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgc29mdG1hY19zY2FuX3dxKTsKIAlzdGF0aWMgc2hvcnQgd2F0Y2hkb2cgPSAwOwotI2lmZGVmIEVOQUJMRV9ET1QxMUQKIAl1OCBjaGFubmVsX21hcFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07CiAJbWVtY3B5KGNoYW5uZWxfbWFwLCBHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7Ci0jZW5kaWYKIAlpZighaWVlZS0+aWVlZV91cCkKIAkJcmV0dXJuOwogCWRvd24oJmllZWUtPnNjYW5fc2VtKTsKQEAgLTUyMywyNSArNTA5LDE2IEBACiAJCWlmICh3YXRjaGRvZysrID4gTUFYX0NIQU5ORUxfTlVNQkVSKQogCQl7CiAJCS8vaWYgY3VycmVudCBjaGFubmVsIGlzIG5vdCBpbiBjaGFubmVsIG1hcCwgc2V0IHRvIGRlZmF1bHQgY2hhbm5lbC4KLQkJI2lmZGVmIEVOQUJMRV9ET1QxMUQKLQkJCWlmICghY2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdKTsKLQkJI2Vsc2UKLQkJCWlmICghaWVlZS0+Y2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdKTsKLQkJI2VuZGlmCisJCQlpZiAoIWNoYW5uZWxfbWFwW2llZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXSkgewogCQkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID0gNjsKIAkJCQlnb3RvIG91dDsgLyogbm8gZ29vZCBjaGFucyAqLworCQkJfQogCQl9Ci0jaWZkZWYgRU5BQkxFX0RPVDExRAogCX13aGlsZSghY2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdKTsKLSNlbHNlCi0JfXdoaWxlKCFpZWVlLT5jaGFubmVsX21hcFtpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbF0pOwotI2VuZGlmCiAJaWYgKGllZWUtPnNjYW5uaW5nID09IDAgKQogCQlnb3RvIG91dDsKIAlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKLSNpZmRlZiBFTkFCTEVfRE9UMTFECiAJaWYoY2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdID09IDEpCi0jZW5kaWYKIAlpZWVlODAyMTFfc2VuZF9wcm9iZV9yZXF1ZXN0cyhpZWVlKTsKIAogCkBAIC01NTAsMTAgKzUyNyw4IEBACiAJdXAoJmllZWUtPnNjYW5fc2VtKTsKIAlyZXR1cm47CiBvdXQ6Ci0jaWZkZWYgRU5BQkxFX0RPVDExRAogCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkpCiAJCURPVDExRF9TY2FuQ29tcGxldGUoaWVlZSk7Ci0jZW5kaWYKIAlpZWVlLT5hY3RzY2FubmluZyA9IGZhbHNlOwogCXdhdGNoZG9nID0gMDsKIAlpZWVlLT5zY2FubmluZyA9IDA7CkBAIC02MzUsNyArNjEwLDYgQEAKIC8qIGNhbGxlZCB3aXRoIGllZWUtPmxvY2sgaGVsZCAqLwogdm9pZCBpZWVlODAyMTFfc3RhcnRfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKLSNpZmRlZiBFTkFCTEVfRE9UMTFECiAJaWYoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSApCiAJewogCQlpZihJU19DT1VOVFJZX0lFX1ZBTElEKGllZWUpKQpAQCAtNjQzLDcgKzYxNyw2IEBACiAJCQlSRVNFVF9DSUVfV0FUQ0hET0coaWVlZSk7CiAJCX0KIAl9Ci0jZW5kaWYKIAlpZiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TQ0FOKXsKIAkJaWYgKGllZWUtPnNjYW5uaW5nID09IDApewogCQkJaWVlZS0+c2Nhbm5pbmcgPSAxOwpAQCAtNjU3LDcgKzYzMCw2IEBACiAvKiBjYWxsZWQgd2l0aCB3eF9zZW0gaGVsZCAqLwogdm9pZCBpZWVlODAyMTFfc3RhcnRfc2Nhbl9zeW5jcm8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7Ci0jaWZkZWYgRU5BQkxFX0RPVDExRAogCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkgKQogCXsKIAkJaWYoSVNfQ09VTlRSWV9JRV9WQUxJRChpZWVlKSkKQEAgLTY2NSw3ICs2MzcsNiBAQAogCQkJUkVTRVRfQ0lFX1dBVENIRE9HKGllZWUpOwogCQl9CiAJfQotI2VuZGlmCiAJaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAwOwogCWlmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1NDQU4pCiAJCWllZWU4MDIxMV9zb2Z0bWFjX3NjYW5fc3luY3JvKGllZWUpOwpAQCAtMjM5MCwxMSArMjM2MSw5IEBACiAJaWVlZTgwMjExX3NvZnRtYWNfY2hlY2tfYWxsX25ldHMoaWVlZSk7CiAKIAotI2lmZGVmIEVOQUJMRV9ET1QxMUQgLy9pZiBjcmVhdGluZyBhbiBhZC1ob2MsIHNldCBpdHMgY2hhbm5lbCB0byAxMCB0ZW1wb3JhcmlseS0tdGhpcyBpcyB0aGUgcmVxdWlyZW1lbnQgZm9yIEFTVVMsIG5vdCAxMUQsIHNvIGRpc2FibGUgMTFkLgogLy8JaWYoKElTX0RPVDExRF9FTkFCTEUoaWVlZSkpICYmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTk9MSU5LKSkKIAlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSykKIAkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPSA2OwotI2VuZGlmCiAJLyogaWYgbm90IHRoZW4gdGhlIHN0YXRlIGlzIG5vdCBsaW5rZWQuIE1heWJlIHRoZSB1c2VyIHN3aXRoY2VkIHRvCiAJICogYWQtaG9jIG1vZGUganVzdCBhZnRlciBiZWluZyBpbiBtb25pdG9yIG1vZGUsIG9yIGp1c3QgYWZ0ZXIKIAkgKiBiZWluZyB2ZXJ5IGZldyB0aW1lIGluIG1hbmFnZWQgbW9kZSAoc28gdGhlIGNhcmQgaGF2ZSBoYWQgbm8KQEAgLTI0ODMsNyArMjQ1Miw2IEBACiB2b2lkIGllZWU4MDIxMV9zdGFydF9ic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLSNpZmRlZiBFTkFCTEVfRE9UMTFECiAJLy8KIAkvLyBSZWY6IDgwMi4xMWQgMTEuMS4zLjMKIAkvLyBTVEEgc2hhbGwgbm90IHN0YXJ0IGEgQlNTIHVubGVzcyBwcm9wZXJseSBmb3JtZWQgQmVhY29uIGZyYW1lIGluY2x1ZGluZyBhIENvdW50cnkgSUUuCkBAIC0yNDk1LDcgKzI0NjMsNiBAQAogCQkJcmV0dXJuOwogCQl9CiAJfQotI2VuZGlmCiAJLyogY2hlY2sgaWYgd2UgaGF2ZSBhbHJlYWR5IGZvdW5kIHRoZSBuZXQgd2UKIAkgKiBhcmUgaW50ZXJlc3RlZCBpbiAoaWYgYW55KS4KIAkgKiBpZiBub3QgKHdlIGFyZSBkaXNhc3NvY2lhdGVkIGFuZCB3ZSBhcmUgbm90CkBAIC0yNTMwLDEwICsyNDk3LDggQEAKIAogCWlmIChpZWVlLT5kYXRhX2hhcmRfc3RvcCkKIAkJCWllZWUtPmRhdGFfaGFyZF9zdG9wKGllZWUtPmRldik7Ci0jaWZkZWYgRU5BQkxFX0RPVDExRAogCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkpCiAJCURvdDExZF9SZXNldChpZWVlKTsKLSNlbmRpZgogCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX05PTElOSzsKIAlpZWVlLT5pc19zZXRfa2V5ID0gZmFsc2U7CiAJaWVlZS0+bGlua19jaGFuZ2UoaWVlZS0+ZGV2KTsKQEAgLTI2NjksMTEgKzI2MzQsNyBAQAogCQkJY2grKzsKIAkJCWlmIChjaCA+IE1BWF9DSEFOTkVMX05VTUJFUikKIAkJCQlyZXR1cm47IC8qIG5vIGNoYW5uZWwgZm91bmQgKi8KLSNpZmRlZiBFTkFCTEVfRE9UMTFECiAJCX13aGlsZSghR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcFtjaF0pOwotI2Vsc2UKLQkJfXdoaWxlKCFpZWVlLT5jaGFubmVsX21hcFtjaF0pOwotI2VuZGlmCiAJCWllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID0gY2g7CiAJfQogCkBAIC0yNzIxLDExICsyNjgyLDkgQEAKIAlmb3IoaSA9IDA7IGkgPCA1OyBpKyspIHsKIAkgIGllZWUtPnNlcV9jdHJsW2ldID0gMDsKIAl9Ci0jaWZkZWYgRU5BQkxFX0RPVDExRAogCWllZWUtPnBEb3QxMWRJbmZvID0ga3phbGxvYyhzaXplb2YoUlRfRE9UMTFEX0lORk8pLCBHRlBfQVRPTUlDKTsKIAlpZiAoIWllZWUtPnBEb3QxMWRJbmZvKQogCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgImNhbid0IGFsbG9jIG1lbW9yeSBmb3IgRE9UMTFEXG4iKTsKLSNlbmRpZgogCS8vYWRkZWQgZm9yICBBUCByb2FtaW5nCiAJaWVlZS0+TGlua0RldGVjdEluZm8uU2xvdE51bSA9IDI7CiAJaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUmVjdkJjbkluUGVyaW9kPTA7CkBAIC0yNzk2LDEzICsyNzU1LDExIEBACiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX2ZyZWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJZG93bigmaWVlZS0+d3hfc2VtKTsKLSNpZmRlZiBFTkFCTEVfRE9UMTFECiAJaWYoTlVMTCAhPSBpZWVlLT5wRG90MTFkSW5mbykKIAl7CiAJCWtmcmVlKGllZWUtPnBEb3QxMWRJbmZvKTsKIAkJaWVlZS0+cERvdDExZEluZm8gPSBOVUxMOwogCX0KLSNlbmRpZgogCWRlbF90aW1lcl9zeW5jKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpOwogCiAJY2FuY2VsX2RlbGF5ZWRfd29yaygmaWVlZS0+YXNzb2NpYXRlX3JldHJ5X3dxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWNfd3guYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWNfd3guYwppbmRleCBmMzM1YzI1Li5jYjVhM2MzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjX3d4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hY193eC5jCkBAIC0xNSw5ICsxNSw3IEBACiAKIAogI2luY2x1ZGUgImllZWU4MDIxMS5oIgotI2lmZGVmIEVOQUJMRV9ET1QxMUQKICNpbmNsdWRlICJkb3QxMWQuaCIKLSNlbmRpZgogLyogRklYTUU6IGFkZCBBIGZyZXFzICovCiAKIGNvbnN0IGxvbmcgaWVlZTgwMjExX3dsYW5fZnJlcXVlbmNpZXNbXSA9IHsKQEAgLTYzLDEyICs2MSwxMCBAQAogCiAJfWVsc2UgeyAvKiBTZXQgdGhlIGNoYW5uZWwgKi8KIAotI2lmZGVmIEVOQUJMRV9ET1QxMUQKIAkJaWYgKCEoR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcClbZndycS0+bV0pIHsKIAkJCXJldCA9IC1FSU5WQUw7CiAJCQlnb3RvIG91dDsKIAkJfQotI2VuZGlmCiAJCWllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID0gZndycS0+bTsKIAkJaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jCmluZGV4IDgxYWEyZWQyLi5lYzc4NDVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMKQEAgLTc1NCw3ICs3NTQsNyBAQAogCQl7CiAJCQl0eGItPnF1ZXVlX2luZGV4ID0gVVAyQUMoc2tiLT5wcmlvcml0eSk7CiAJCX0gZWxzZSB7Ci0JCQl0eGItPnF1ZXVlX2luZGV4ID0gV01FX0FDX0JLOzsKKwkJCXR4Yi0+cXVldWVfaW5kZXggPSBXTUVfQUNfQks7CiAJCX0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfY29yZS5jCmluZGV4IDQ5NGYxODAuLmFlNGYyYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfY29yZS5jCkBAIC03Nyw5ICs3Nyw3IEBACiAjaW5jbHVkZSAicjgxOTJfcG0uaCIKICNlbmRpZgogCi0jaWZkZWYgRU5BQkxFX0RPVDExRAogI2luY2x1ZGUgImRvdDExZC5oIgotI2VuZGlmCiAvL3NldCBoZXJlIHRvIG9wZW4geW91ciB0cmFjZSBjb2RlLiAvL1dCCiB1MzIgcnRfZ2xvYmFsX2RlYnVnX2NvbXBvbmVudCA9IFwKIAkJCS8vCUNPTVBfSU5JVCAgICAJfApAQCAtMTY2LDcgKzE2NCw2IEBACiAjZW5kaWYKIH07CiAKLSNpZmRlZiBFTkFCTEVfRE9UMTFECiAKIHR5cGVkZWYgc3RydWN0IF9DSEFOTkVMX0xJU1QKIHsKQEAgLTI0Miw5ICsyMzksNyBAQAogCX0KIAlyZXR1cm47CiB9Ci0jZW5kaWYKIAotI2RlZmluZSBlcU1hY0FkZHIoYSxiKSAoICgoYSlbMF09PShiKVswXSAmJiAoYSlbMV09PShiKVsxXSAmJiAoYSlbMl09PShiKVsyXSAmJiAoYSlbM109PShiKVszXSAmJiAoYSlbNF09PShiKVs0XSAmJiAoYSlbNV09PShiKVs1XSkgPyAxOjAgKQogCiAjZGVmaW5lIAlyeF9oYWxfaXNfY2NrX3JhdGUoX3BkcnZpbmZvKVwKIAkJCShfcGRydmluZm8tPlJ4UmF0ZSA9PSBERVNDOTBfUkFURTFNIHx8XApAQCAtMTUwNyw3ICsxNTAyLDcgQEAKIAl7CiAJCS8vCiAJCS8vIEhhbmRsZSBIVyBCZWFjb246Ci0JCS8vIFdlIGhhZCB0cmFuc2ZlciBvdXIgYmVhY29uIGZyYW1lIHRvIGhvc3QgY29udHJvbGVyIGF0IHRoaXMgbW9tZW50LgorCQkvLyBXZSBoYWQgdHJhbnNmZXIgb3VyIGJlYWNvbiBmcmFtZSB0byBob3N0IGNvbnRyb2xsZXIgYXQgdGhpcyBtb21lbnQuCiAJCS8vCiAJCS8vCiAJCS8vIENhdXRpb246CkBAIC0yMjAzLDYgKzIxOTgsOCBAQAogCiAJcHJpdi0+cnhfdXJiID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHVyYiAqKSAqIChNQVhfUlhfVVJCKzEpLAogCQkJCUdGUF9LRVJORUwpOworCWlmIChwcml2LT5yeF91cmIgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CiAKICNpZm5kZWYgSkFDS1NPTl9ORVdfUlgKIAlmb3IoaT0wO2k8KE1BWF9SWF9VUkIrMSk7aSsrKXsKQEAgLTMxNTUsNyArMzE1Miw2IEBACiBzaG9ydCBydGw4MTkyX2dldF9jaGFubmVsX21hcChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7Ci0jaWZkZWYgRU5BQkxFX0RPVDExRAogCWlmKHByaXYtPkNoYW5uZWxQbGFuID4gQ09VTlRSWV9DT0RFX0dMT0JBTF9ET01BSU4pewogCQlwcmludGsoInJ0bDgxODBfaW5pdDpFcnJvciBjaGFubmVsIHBsYW4hIFNldCB0byBkZWZhdWx0LlxuIik7CiAJCXByaXYtPkNoYW5uZWxQbGFuPSAwOwpAQCAtMzE2MywyMSArMzE1OSw2IEBACiAJUlRfVFJBQ0UoQ09NUF9JTklULCAiQ2hhbm5lbCBwbGFuIGlzICVkXG4iLHByaXYtPkNoYW5uZWxQbGFuKTsKIAogCXJ0bDgxOXhfc2V0X2NoYW5uZWxfbWFwKHByaXYtPkNoYW5uZWxQbGFuLCBwcml2KTsKLSNlbHNlCi0JaW50IGNoLGk7Ci0JLy9TZXQgRGVmYXVsdCBDaGFubmVsIFBsYW4KLQlpZighY2hhbm5lbHMpewotCQlETUVTRygiTm8gY2hhbm5lbHMsIGFib3J0aW5nIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JY2g9Y2hhbm5lbHM7Ci0JcHJpdi0+Q2hhbm5lbFBsYW49IDA7Ly9oaWthcnUKLQkgLy8gc2V0IGNoYW5uZWxzIDEuLjE0IGFsbG93ZWQgaW4gZ2l2ZW4gbG9jYWxlCi0JZm9yIChpPTE7IGk8PTE0OyBpKyspIHsKLQkJKHByaXYtPmllZWU4MDIxMS0+Y2hhbm5lbF9tYXApW2ldID0gKHU4KShjaCAmIDB4MDEpOwotCQljaCA+Pj0gMTsKLQl9Ci0jZW5kaWYKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTA4NSw3ICs1MDY2LDcgQEAKIAkJCS8vR2V0IFJ4IHNuciB2YWx1ZSBpbiBEQgogCQkJdG1wX3J4c25yID0JcG9mZG1fYnVmLT5yeHNucl9YW2ldOwogCQkJcnhfc25yWCA9IChjaGFyKSh0bXBfcnhzbnIpOwotCQkJLy9yeF9zbnJYID4+PSAxOzsKKwkJCS8vcnhfc25yWCA+Pj0gMTsKIAkJCXJ4X3NuclggLz0gMjsKIAkJCXByaXYtPnN0YXRzLnJ4U05SZEJbaV0gPSAobG9uZylyeF9zbnJYOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX3d4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX3d4LmMKaW5kZXggMjVkNWM4Ny4uZjY0MDhmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV93eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfd3guYwpAQCAtMjEsOSArMjEsNyBAQAogI2luY2x1ZGUgInI4MTkyVS5oIgogI2luY2x1ZGUgInI4MTkyVV9ody5oIgogCi0jaWZkZWYgRU5BQkxFX0RPVDExRAogI2luY2x1ZGUgImRvdDExZC5oIgotI2VuZGlmCiAKICNkZWZpbmUgUkFURV9DT1VOVCAxMgogdTMyIHJ0bDgxODBfcmF0ZXNbXSA9IHsxMDAwMDAwLDIwMDAwMDAsNTUwMDAwMCwxMTAwMDAwMCwKQEAgLTQ1OCwxMSArNDU2LDcgQEAKIAlmb3IgKGkgPSAwLCB2YWwgPSAwOyBpIDwgMTQ7IGkrKykgewogCiAJCS8vIEluY2x1ZGUgb25seSBsZWdhbCBmcmVxdWVuY2llcyBmb3Igc29tZSBjb3VudHJpZXMKLSNpZmRlZiBFTkFCTEVfRE9UMTFECiAJCWlmICgoR0VUX0RPVDExRF9JTkZPKHByaXYtPmllZWU4MDIxMSktPmNoYW5uZWxfbWFwKVtpKzFdKSB7Ci0jZWxzZQotCQlpZiAoKHByaXYtPmllZWU4MDIxMS0+Y2hhbm5lbF9tYXApW2krMV0pIHsKLSNlbmRpZgogCQkJcmFuZ2UtPmZyZXFbdmFsXS5pID0gaSArIDE7CiAJCQlyYW5nZS0+ZnJlcVt2YWxdLm0gPSBpZWVlODAyMTFfd2xhbl9mcmVxdWVuY2llc1tpXSAqIDEwMDAwMDsKIAkJCXJhbmdlLT5mcmVxW3ZhbF0uZSA9IDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX3BoeS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9waHkuYwppbmRleCBhM2FkYWVkLi40MTY4NGU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX3BoeS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfcGh5LmMKQEAgLTYsOSArNiw3IEBACiAjaW5jbHVkZSAicjgxOTJVX2RtLmgiCiAjaW5jbHVkZSAicjgxOXhVX2Zpcm13YXJlX2ltZy5oIgogCi0jaWZkZWYgRU5BQkxFX0RPVDExRAogI2luY2x1ZGUgImRvdDExZC5oIgotI2VuZGlmCiBzdGF0aWMgdTMyIFJGX0NIQU5ORUxfVEFCTEVfWkVCUkFbXSA9IHsKIAkwLAogCTB4MDg1YywgLy8yNDEyIDEKQEAgLTEwMTEsNyArMTAwOSw3IEBACiAJCQlicmVhazsKIAl9CiAKLQlyZXR1cm4gcmV0OzsKKwlyZXR1cm4gcmV0OwogCiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMjU3LDEzICsxMjU1LDExIEBACiAKIAlSVF9UUkFDRShDT01QX0NILCAiPT09PT4lcygpPT09PXN0YWdlOiVkLCBzdGVwOiVkLCBjaGFubmVsOiVkXG4iLCBfX0ZVTkNUSU9OX18sICpzdGFnZSwgKnN0ZXAsIGNoYW5uZWwpOwogLy8JUlRfQVNTRVJUKElzTGVnYWxDaGFubmVsKEFkYXB0ZXIsIGNoYW5uZWwpLCAoImlsbGVnYWwgY2hhbm5lbDogJWRcbiIsIGNoYW5uZWwpKTsKLSNpZmRlZiBFTkFCTEVfRE9UMTFECiAJaWYgKCFJc0xlZ2FsQ2hhbm5lbChwcml2LT5pZWVlODAyMTEsIGNoYW5uZWwpKQogCXsKIAkJUlRfVFJBQ0UoQ09NUF9FUlIsICI9PT09PT09PT09PT09PnNldCB0byBpbGxlZ2FsIGNoYW5uZWw6JWRcbiIsIGNoYW5uZWwpOwogCQlyZXR1cm4gdHJ1ZTsgLy9yZXR1cm4gdHJ1ZSB0byB0ZWxsIHVwcGVyIGNhbGxlciBmdW5jdGlvbiB0aGlzIGNoYW5uZWwgc2V0dGluZyBpcyBmaW5pc2hlZCEgT3IgaXQgd2lsbCBpbiB3aGlsZSBsb29wLgogCX0KLSNlbmRpZgogLy9GSVhNRTpuZWVkIHRvIGNoZWNrIHdoZXRoZXIgY2hhbm5lbCBpcyBsZWdhbCBvciBub3QgaGVyZS5XQgogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9UT0RPCmluZGV4IDVjODg4MjEuLjJhYTVkZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL1RPRE8KKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvVE9ETwpAQCAtMyw3ICszLDYgQEAKIC0gc3dpdGNoIHRvIHVzZSBMSUI4MDIxMQogLSBzd2l0Y2ggdG8gdXNlIE1BQzgwMjExCiAtIGNoZWNrcGF0Y2gucGwgZml4ZXMgLSBvbmx5IGEgZmV3IHJlbWFpbgotLSBzcGFyc2UgZml4ZXMKIC0gc3dpdGNoIGZyb20gbGFyZ2UgaW5saW5lIGZpcm13YXJlIGZpbGUgdG8gdXNlIHRoZSBmaXJtd2FyZSBpbnRlcmZhY2UKICAgYW5kIGFkZCB0aGUgZmlsZSB0byB0aGUgbGludXgtZmlybXdhcmUgcGFja2FnZS4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvb3NkZXBfc2VydmljZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvb3NkZXBfc2VydmljZS5oCmluZGV4IDgzMWQ4MWUuLjM2ZWViNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL29zZGVwX3NlcnZpY2UuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9vc2RlcF9zZXJ2aWNlLmgKQEAgLTE5NSwxMCArMTk1LDcgQEAKIAogc3RhdGljIGlubGluZSB1OCAqX21hbGxvYyh1MzIgc3opCiB7Ci0JdTggKnBidWY7Ci0KLQlwYnVmID0Ja21hbGxvYyhzeiwgR0ZQX0FUT01JQyk7Ci0JcmV0dXJuIHBidWY7CisJcmV0dXJuCWttYWxsb2Moc3osIEdGUF9BVE9NSUMpOwogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgX2NhbmNlbF90aW1lcl9leChzdHJ1Y3QgdGltZXJfbGlzdCAqcHRpbWVyKQpAQCAtMjIwLDM0ICsyMTcsMjIgQEAKIAogc3RhdGljIGlubGluZSB1MzIgX1JORDgodTMyIHN6KQogewotCXUzMgl2YWw7Ci0KLQl2YWwgPSAoKHN6ID4+IDMpICsgKChzeiAmIDcpID8gMSA6IDApKSA8PCAzOwotCXJldHVybiB2YWw7CisJcmV0dXJuICgoc3ogPj4gMykgKyAoKHN6ICYgNykgPyAxIDogMCkpIDw8IDM7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdTMyIF9STkQxMjgodTMyIHN6KQogewotCXUzMgl2YWw7Ci0KLQl2YWwgPSAoKHN6ID4+IDcpICsgKChzeiAmIDEyNykgPyAxIDogMCkpIDw8IDc7Ci0JcmV0dXJuIHZhbDsKKwlyZXR1cm4gKChzeiA+PiA3KSArICgoc3ogJiAxMjcpID8gMSA6IDApKSA8PCA3OwogfQogCiBzdGF0aWMgaW5saW5lIHUzMiBfUk5EMjU2KHUzMiBzeikKIHsKLQl1MzIJdmFsOwotCi0JdmFsID0gKChzeiA+PiA4KSArICgoc3ogJiAyNTUpID8gMSA6IDApKSA8PCA4OwotCXJldHVybiB2YWw7CisJcmV0dXJuICgoc3ogPj4gOCkgKyAoKHN6ICYgMjU1KSA/IDEgOiAwKSkgPDwgODsKIH0KIAogc3RhdGljIGlubGluZSB1MzIgX1JORDUxMih1MzIgc3opCiB7Ci0JdTMyCXZhbDsKLQotCXZhbCA9ICgoc3ogPj4gOSkgKyAoKHN6ICYgNTExKSA/IDEgOiAwKSkgPDwgOTsKLQlyZXR1cm4gdmFsOworCXJldHVybiAoKHN6ID4+IDkpICsgKChzeiAmIDUxMSkgPyAxIDogMCkpIDw8IDk7CiB9CiAKICNkZWZpbmUgU1RSVUNUX1BBQ0tFRCBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfZWZ1c2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfZWZ1c2UuYwppbmRleCA5NzMwYWUxLi4xZGMxMmI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2VmdXNlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9lZnVzZS5jCkBAIC00MjgsNyArNDI4LDcgQEAKIAkJICAgICAgdTE2IGNudHMsIHU4ICpkYXRhKQogewogCWludCBpOwotCXU4IHJlcyA9IHRydWU7OworCXU4IHJlcyA9IHRydWU7CiAKIAlpZiAoc3RhcnRfYWRkciA+IEVGVVNFX01BWF9TSVpFKQogCQlyZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3htaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfeG1pdC5jCmluZGV4IDhlZGM1MTguLjg4YTE1MDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfeG1pdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfeG1pdC5jCkBAIC0xNDgsNyArMTQ4LDcgQEAKIAkJY2FzZSAweDExOgogCQljYXNlIDB4MTI6CiAJCWNhc2UgMHgxMzoKLQkJCWFkZHIgPSBSVEw4NzEyX0RNQV9IMkNDTUQ7OworCQkJYWRkciA9IFJUTDg3MTJfRE1BX0gyQ0NNRDsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJYWRkciA9IFJUTDg3MTJfRE1BX0JFUTsvKlJUTDg3MTJfRVBfTE87Ki8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfeG1pdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF94bWl0LmMKaW5kZXggYjgxOTVlMy4uNzVmMWE2YmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfeG1pdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfeG1pdC5jCkBAIC0zNzIsNyArMzcyLDcgQEAKIAkJCQkJICAgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLAogCQkJCQkgICAweDAsIDB4MH07CiAJCQlkYXRhbGVuID0gcGF0dHJpYi0+cGt0bGVuIC0gcGF0dHJpYi0+aGRybGVuOwotCQkJcGZyYW1lID0gcHhtaXRmcmFtZS0+YnVmX2FkZHIgKyBUWERFU0NfT0ZGU0VUOzsKKwkJCXBmcmFtZSA9IHB4bWl0ZnJhbWUtPmJ1Zl9hZGRyICsgVFhERVNDX09GRlNFVDsKIAkJCWlmIChibWNzdCkgewogCQkJCWlmICghbWVtY21wKHBzZWN1cml0eXByaXYtPlhHcnB0eG1pY2tleQogCQkJCSAgIFtwc2VjdXJpdHlwcml2LT5YR3JwS2V5aWRdLnNrZXksCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi91c2JfaW50Zi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvdXNiX2ludGYuYwppbmRleCBmMWYwYzYzLi5hNjkyZWU4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvdXNiX2ludGYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi91c2JfaW50Zi5jCkBAIC01MjcsNyArNTI3LDcgQEAKIHN0YXRpYyB2b2lkIHI4NzF4dV9kZXZfcmVtb3ZlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICpwdXNiX2ludGYpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKnBuZXRkZXYgPSB1c2JfZ2V0X2ludGZkYXRhKHB1c2JfaW50Zik7Ci0Jc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKiluZXRkZXZfcHJpdihwbmV0ZGV2KTsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYocG5ldGRldik7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KHB1c2JfaW50Zik7CiAKIAlpZiAocGFkYXB0ZXIpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zZXAvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9zZXAvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmJmMTY2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NlcC9LY29uZmlnCkBAIC0wLDAgKzEsMTAgQEAKK2NvbmZpZyBEWF9TRVAKKwl0cmlzdGF0ZSAiRGlzY3JldGl4IFNFUCBkcml2ZXIiCisJZGVwZW5kcyBvbiBQQ0kKKwloZWxwCisJICBEaXNjcmV0aXggU0VQIGRyaXZlcjsgdXNlZCBmb3IgdGhlIHNlY3VyaXR5IHByb2Nlc3NvciBzdWJzeXN0ZW0KKwkgIG9uIGJhcmQgdGhlIEludGVsIE1vYmlsZSBJbnRlcm5ldCBEZXZpY2UuCisKKwkgIFRoZSBkcml2ZXIncyBuYW1lIGlzIHNlcF9kcml2ZXIuCisKKwkgIElmIHVuc3VyZSwgc2VsZWN0IE4uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2VwL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3NlcC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjhkNWY5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NlcC9NYWtlZmlsZQpAQCAtMCwwICsxLDIgQEAKK29iai0kKENPTkZJR19EWF9TRVApIDo9IHNlcF9kcml2ZXIubworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2VwL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvc2VwL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg5YzI0MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zZXAvVE9ETwpAQCAtMCwwICsxLDUgQEAKK1RvZG8ncyBzbyBmYXIgKGZyb20gQWxhbiBDb3gpCistIENoZWNrIHdoZXRoZXIgaXQgY2FuIGJlIHBsdWdnZWQgaW50byBhbnkgb2YgdGhlIGtlcm5lbCBjcnlwdG8gQVBJCisgIGludGVyZmFjZXMgLSBDcnlwdG8gQVBJICdnbHVlJyBpcyBzdGlsbCBub3QgcmVhZHkgdG8gc3VibWl0CistIENsZWFuIHVwIHVudXNlZCBpb2N0bHMgLSBOZWVkcyB2ZW5kb3IgaGVscAorLSBDbGVhbiB1cCB1bnVzZWQgZmllbGRzIGluIGlvY3RsIHN0cnVjdHVyZXMgLSBOZWVkcyB2ZW5kb3IgaGVscApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NlcC9zZXBfZGV2LmggYi9kcml2ZXJzL3N0YWdpbmcvc2VwL3NlcF9kZXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmZlNjhjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NlcC9zZXBfZGV2LmgKQEAgLTAsMCArMSwxNTYgQEAKKyNpZm5kZWYgX19TRVBfREVWX0hfXworI2RlZmluZSBfX1NFUF9ERVZfSF9fCisKKy8qCisgKgorICogIHNlcF9kZXYuaCAtIFNlY3VyaXR5IFByb2Nlc3NvciBEZXZpY2UgU3RydWN0dXJlcworICoKKyAqICBDb3B5cmlnaHQoYykgMjAwOSwyMDEwIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogIENvbnRyaWJ1dGlvbnMoYykgMjAwOSwyMDEwIERpc2NyZXRpeC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqICBDT05UQUNUUzoKKyAqCisgKiAgTWFyayBBbGx5bgkJbWFyay5hLmFsbHluQGludGVsLmNvbQorICogIEpheWFudCBNYW5nYWxhbXBhbGxpIGpheWFudC5tYW5nYWxhbXBhbGxpQGludGVsLmNvbQorICoKKyAqICBDSEFOR0VTCisgKiAgMjAxMC4wOS4xNCAgdXBncmFkZSB0byBNZWRmaWVsZAorICovCisKK3N0cnVjdCBzZXBfZGV2aWNlIHsKKwkvKiBwb2ludGVyIHRvIHBjaSBkZXYgKi8KKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKworCS8qIGNoYXJhY3RlciBkZXZpY2UgZmlsZSAqLworCXN0cnVjdCBjZGV2IHNlcF9jZGV2OworCXN0cnVjdCBjZGV2IHNlcF9kYWVtb25fY2RldjsKKwlzdHJ1Y3QgY2RldiBzZXBfc2luZ2xldG9uX2NkZXY7CisKKwkvKiBkZXZpY2VzICh1c2luZyBtaXNjIGRldikgKi8KKwlzdHJ1Y3QgbWlzY2RldmljZSBtaXNjZGV2X3NlcDsKKwlzdHJ1Y3QgbWlzY2RldmljZSBtaXNjZGV2X3NpbmdsZXRvbjsKKwlzdHJ1Y3QgbWlzY2RldmljZSBtaXNjZGV2X2RhZW1vbjsKKworCS8qIG1ham9yIC8gbWlub3IgbnVtYmVycyBvZiBkZXZpY2UgKi8KKwlkZXZfdCBzZXBfZGV2bm87CisJZGV2X3Qgc2VwX2RhZW1vbl9kZXZubzsKKwlkZXZfdCBzZXBfc2luZ2xldG9uX2Rldm5vOworCisJc3RydWN0IG11dGV4IHNlcF9tdXRleDsKKwlzdHJ1Y3QgbXV0ZXggaW9jdGxfbXV0ZXg7CisJc3BpbmxvY2tfdCBzbmRfcnBseV9sY2s7CisKKwkvKiBmbGFncyB0byBpbmRpY2F0ZSB1c2UgYW5kIGxvY2sgc3RhdHVzIG9mIHNlcCAqLworCXUzMiBwaWRfZG9pbmdfdHJhbnNhY3Rpb247CisJdW5zaWduZWQgbG9uZyBpbl91c2VfZmxhZ3M7CisKKwkvKiByZXF1ZXN0IGRhZW1vbiBhbHJlYWQgb3BlbiAqLworCXVuc2lnbmVkIGxvbmcgcmVxdWVzdF9kYWVtb25fb3BlbjsKKworCS8qIDEgPSBNb29yZXN0b3duOyAwID0gTWVkZmllbGQgKi8KKwlpbnQgbXJzdDsKKworCS8qIGFkZHJlc3Mgb2YgdGhlIHNoYXJlZCBtZW1vcnkgYWxsb2NhdGVkIGR1cmluZyBpbml0IGZvciBTRVAgZHJpdmVyCisJICAgKGNvaGVyZW50IGFsbG9jKSAqLworCWRtYV9hZGRyX3Qgc2hhcmVkX2J1czsKKwlzaXplX3Qgc2hhcmVkX3NpemU7CisJdm9pZCAqc2hhcmVkX2FkZHI7CisKKwkvKiByZXN0cmljdGVkIGFjY2VzcyByZWdpb24gKGNvaGVyZW50IGFsbG9jKSAqLworCWRtYV9hZGRyX3QgcmFyX2J1czsKKwlzaXplX3QgcmFyX3NpemU7CisJdm9pZCAqcmFyX2FkZHI7CisKKwkvKiBGaXJtd2FyZSByZWdpb25zOyBjYWNoZSBpcyBhdCByYXIgZm9yIE1vb3Jlc3Rvd24gYW5kCisJICAgcmVzaWRlbnQgaXMgYXQgcmFyIGZvciBNZWRmaWVsZCAqLworCWRtYV9hZGRyX3QgY2FjaGVfYnVzOworCXNpemVfdCBjYWNoZV9zaXplOworCXZvaWQgKmNhY2hlX2FkZHI7CisKKwlkbWFfYWRkcl90IHJlc2lkZW50X2J1czsKKwlzaXplX3QgcmVzaWRlbnRfc2l6ZTsKKwl2b2lkICpyZXNpZGVudF9hZGRyOworCisJLyogc2VwJ3Mgc2NyYXRjaHBhZCAqLworCWRtYV9hZGRyX3QgZGNhY2hlX2J1czsKKwlzaXplX3QgZGNhY2hlX3NpemU7CisJdm9pZCAqZGNhY2hlX2FkZHI7CisKKwkvKiBPbmx5IHVzZWQgb24gTWVkZmllbGQgKi8KKwlkbWFfYWRkcl90IGV4dGFwcF9idXM7CisJc2l6ZV90IGV4dGFwcF9zaXplOworCXZvaWQgKmV4dGFwcF9hZGRyOworCisJLyogc3RhcnQgYWRkcmVzcyBvZiB0aGUgYWNjZXNzIHRvIHRoZSBTRVAgcmVnaXN0ZXJzIGZyb20gZHJpdmVyICovCisJZG1hX2FkZHJfdCByZWdfcGh5c2ljYWxfYWRkcjsKKwlkbWFfYWRkcl90IHJlZ19waHlzaWNhbF9lbmQ7CisJdm9pZCBfX2lvbWVtICpyZWdfYWRkcjsKKworCS8qIHdhaXQgcXVldWUgaGVhZCAoZXZlbnQpIG9mIHRoZSBkcml2ZXIgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBldmVudDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBldmVudF9yZXF1ZXN0X2RhZW1vbjsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBldmVudF9tbWFwOworCisJc3RydWN0IHNlcF9jYWxsZXJfaWRfZW50cnkKKwkJY2FsbGVyX2lkX3RhYmxlW1NFUF9DQUxMRVJfSURfVEFCTEVfTlVNX0VOVFJJRVNdOworCisJLyogYWNjZXNzIGZsYWcgZm9yIHNpbmdsZXRvbiBkZXZpY2UgKi8KKwl1bnNpZ25lZCBsb25nIHNpbmdsZXRvbl9hY2Nlc3NfZmxhZzsKKworCS8qIHRyYW5zYWN0aW9uIGNvdW50ZXIgdGhhdCBjb29yZGluYXRlcyB0aGUKKwkgICB0cmFuc2FjdGlvbnMgYmV0d2VlbiBTRVAgYW5kIEhPU1QgKi8KKwl1bnNpZ25lZCBsb25nIHNlbmRfY3Q7CisJLyogY291bnRlciBmb3IgdGhlIG1lc3NhZ2VzIGZyb20gc2VwICovCisJdW5zaWduZWQgbG9uZyByZXBseV9jdDsKKwkvKiBjb3VudGVyIGZvciB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFsbG9jYXRlZCBpbiB0aGUgcG9vbCBmb3IgdGhlCisJICAgY3VycmVudCB0cmFuc2FjdGlvbiAqLworCWxvbmcgZGF0YV9wb29sX2J5dGVzX2FsbG9jYXRlZDsKKworCXUzMiBudW1fb2ZfZGF0YV9hbGxvY2F0aW9uczsKKworCS8qIG51bWJlciBvZiB0aGUgbGxpIHRhYmxlcyBjcmVhdGVkIGluIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uICovCisJdTMyICAgICBudW1fbGxpX3RhYmxlc19jcmVhdGVkOworCisJLyogbnVtYmVyIG9mIGRhdGEgY29udHJvbCBibG9ja3MgKi8KKwl1MzIgbnJfZGNiX2NyZWF0OworCisJc3RydWN0IHNlcF9kbWFfcmVzb3VyY2UgZG1hX3Jlc19hcnJbU0VQX01BWF9OVU1fU1lOQ19ETUFfT1BTXTsKKworfTsKKworc3RhdGljIGlubGluZSB2b2lkIHNlcF93cml0ZV9yZWcoc3RydWN0IHNlcF9kZXZpY2UgKmRldiwgaW50IHJlZywgdTMyIHZhbHVlKQoreworCXZvaWQgX19pb21lbSAqYWRkciA9IGRldi0+cmVnX2FkZHIgKyByZWc7CisJd3JpdGVsKHZhbHVlLCBhZGRyKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgc2VwX3JlYWRfcmVnKHN0cnVjdCBzZXBfZGV2aWNlICpkZXYsIGludCByZWcpCit7CisJdm9pZCBfX2lvbWVtICphZGRyID0gZGV2LT5yZWdfYWRkciArIHJlZzsKKwlyZXR1cm4gcmVhZGwoYWRkcik7Cit9CisKKy8qIHdhaXQgZm9yIFNSQU0gd3JpdGUgY29tcGxldGUoaW5kaXJlY3Qgd3JpdGUgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXBfd2FpdF9zcmFtX3dyaXRlKHN0cnVjdCBzZXBfZGV2aWNlICpkZXYpCit7CisJdTMyIHJlZ192YWw7CisJZG8geworCQlyZWdfdmFsID0gc2VwX3JlYWRfcmVnKGRldiwgSFdfU1JBTV9EQVRBX1JFQURZX1JFR19BRERSKTsKKwl9IHdoaWxlICghKHJlZ192YWwgJiAxKSk7Cit9CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2VwL3NlcF9kcml2ZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9zZXAvc2VwX2RyaXZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNWQ1NjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc2VwL3NlcF9kcml2ZXIuYwpAQCAtMCwwICsxLDM1NzcgQEAKKy8qCisgKgorICogIHNlcF9kcml2ZXIuYyAtIFNlY3VyaXR5IFByb2Nlc3NvciBEcml2ZXIgbWFpbiBncm91cCBvZiBmdW5jdGlvbnMKKyAqCisgKiAgQ29weXJpZ2h0KGMpIDIwMDksMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICBDb250cmlidXRpb25zKGMpIDIwMDksMjAxMCBEaXNjcmV0aXguIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqICBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqICBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiAgQ09OVEFDVFM6CisgKgorICogIE1hcmsgQWxseW4JCW1hcmsuYS5hbGx5bkBpbnRlbC5jb20KKyAqICBKYXlhbnQgTWFuZ2FsYW1wYWxsaSBqYXlhbnQubWFuZ2FsYW1wYWxsaUBpbnRlbC5jb20KKyAqCisgKiAgQ0hBTkdFUzoKKyAqCisgKiAgMjAwOS4wNi4yNglJbml0aWFsIHB1Ymxpc2gKKyAqICAyMDEwLjA5LjE0ICBVcGdyYWRlIHRvIE1lZGZpZWxkCisgKgorICovCisjZGVmaW5lIERFQlVHCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8YXNtL2N1cnJlbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvcmFyX3JlZ2lzdGVyLmg+CisKKyNpbmNsdWRlICIuLi9tZW1yYXIvbWVtcmFyLmgiCisKKyNpbmNsdWRlICJzZXBfZHJpdmVyX2h3X2RlZnMuaCIKKyNpbmNsdWRlICJzZXBfZHJpdmVyX2NvbmZpZy5oIgorI2luY2x1ZGUgInNlcF9kcml2ZXJfYXBpLmgiCisjaW5jbHVkZSAic2VwX2Rldi5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlERUZJTkVTCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgU0VQX1JBUl9JT19NRU1fUkVHSU9OX1NJWkUgMHg0MDAwMAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJR0xPQkFMIHZhcmlhYmxlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBLZWVwIHRoaXMgYSBzaW5nbGUgc3RhdGljIG9iamVjdCBmb3Igbm93IHRvIGtlZXAgdGhlIGNvbnZlcnNpb24gZWFzeSAqLworCitzdGF0aWMgc3RydWN0IHNlcF9kZXZpY2UgKnNlcF9kZXY7CisKKy8qKgorICoJc2VwX2xvYWRfZmlybXdhcmUgLSBjb3B5IGZpcm13YXJlIGNhY2hlL3Jlc2lkZW50CisgKglAc2VwOiBwb2ludGVyIHRvIHN0cnVjdCBzZXBfZGV2aWNlIHdlIGFyZSBsb2FkaW5nCisgKgorICoJVGhpcyBmdW5jdGlvbnMgY29waWVzIHRoZSBjYWNoZSBhbmQgcmVzaWRlbnQgZnJvbSB0aGVpciBzb3VyY2UKKyAqCWxvY2F0aW9uIGludG8gZGVzdGluYXRpb24gc2hhcmVkIG1lbW9yeS4KKyAqLworc3RhdGljIGludCBzZXBfbG9hZF9maXJtd2FyZShzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwKQoreworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CisJY2hhciAqY2FjaGVfbmFtZSA9ICJjYWNoZS5pbWFnZS5iaW4iOworCWNoYXIgKnJlc19uYW1lID0gInJlc2lkZW50LmltYWdlLmJpbiI7CisJY2hhciAqZXh0YXBwX25hbWUgPSAiZXh0YXBwLmltYWdlLmJpbiI7CisJaW50IGVycm9yIDsKKwl1bnNpZ25lZCBsb25nIHdvcmsxLCB3b3JrMiwgd29yazM7CisKKwkvKiBTZXQgYWRkcmVzc2VzIGFuZCBsb2FkIHJlc2lkZW50ICovCisJc2VwLT5yZXNpZGVudF9idXMgPSBzZXAtPnJhcl9idXM7CisJc2VwLT5yZXNpZGVudF9hZGRyID0gc2VwLT5yYXJfYWRkcjsKKworCWVycm9yID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIHJlc19uYW1lLCAmc2VwLT5wZGV2LT5kZXYpOworCWlmIChlcnJvcikgeworCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsICJjYW4ndCByZXF1ZXN0IHJlc2lkZW50IGZ3XG4iKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCW1lbWNweShzZXAtPnJlc2lkZW50X2FkZHIsICh2b2lkICopZnctPmRhdGEsIGZ3LT5zaXplKTsKKwlzZXAtPnJlc2lkZW50X3NpemUgPSBmdy0+c2l6ZTsKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAicmVzaWRlbnQgdmlydHVhbCBpcyAlcFxuIiwKKwkJc2VwLT5yZXNpZGVudF9hZGRyKTsKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInJlc2lkZW50IGJ1cyBpcyAlbHhcbiIsCisJCSh1bnNpZ25lZCBsb25nKXNlcC0+cmVzaWRlbnRfYnVzKTsKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInJlc2lkZW50IHNpemUgaXMgJTA4enhcbiIsCisJCXNlcC0+cmVzaWRlbnRfc2l6ZSk7CisKKwkvKiBTZXQgYWRkcmVzc2VzIGZvciBkY2FjaGUgKG5vIGxvYWRpbmcgbmVlZGVkKSAqLworCXdvcmsxID0gKHVuc2lnbmVkIGxvbmcpc2VwLT5yZXNpZGVudF9idXM7CisJd29yazIgPSAodW5zaWduZWQgbG9uZylzZXAtPnJlc2lkZW50X3NpemU7CisJd29yazMgPSAod29yazEgKyB3b3JrMiArICgxMDI0ICogNCkpICYgMHhmZmZmZjAwMDsKKwlzZXAtPmRjYWNoZV9idXMgPSAoZG1hX2FkZHJfdCl3b3JrMzsKKworCXdvcmsxID0gKHVuc2lnbmVkIGxvbmcpc2VwLT5yZXNpZGVudF9hZGRyOworCXdvcmsyID0gKHVuc2lnbmVkIGxvbmcpc2VwLT5yZXNpZGVudF9zaXplOworCXdvcmszID0gKHdvcmsxICsgd29yazIgKyAoMTAyNCAqIDQpKSAmIDB4ZmZmZmYwMDA7CisJc2VwLT5kY2FjaGVfYWRkciA9ICh2b2lkICopd29yazM7CisKKwlzZXAtPmRjYWNoZV9zaXplID0gMTAyNCAqIDEyODsKKworCS8qIFNldCBhZGRyZXNzZXMgYW5kIGxvYWQgY2FjaGUgKi8KKwlzZXAtPmNhY2hlX2J1cyA9IHNlcC0+ZGNhY2hlX2J1cyArIHNlcC0+ZGNhY2hlX3NpemU7CisJc2VwLT5jYWNoZV9hZGRyID0gc2VwLT5kY2FjaGVfYWRkciArIHNlcC0+ZGNhY2hlX3NpemU7CisKKwllcnJvciA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBjYWNoZV9uYW1lLCAmc2VwLT5wZGV2LT5kZXYpOworCWlmIChlcnJvcikgeworCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsICJVbmFibGUgdG8gcmVxdWVzdCBjYWNoZSBmaXJtd2FyZVxuIik7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwltZW1jcHkoc2VwLT5jYWNoZV9hZGRyLCAodm9pZCAqKWZ3LT5kYXRhLCBmdy0+c2l6ZSk7CisJc2VwLT5jYWNoZV9zaXplID0gZnctPnNpemU7CisJcmVsZWFzZV9maXJtd2FyZShmdyk7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImNhY2hlIHZpcnR1YWwgaXMgJXBcbiIsCisJCXNlcC0+Y2FjaGVfYWRkcik7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJjYWNoZSBidXMgaXMgJTA4bHhcbiIsCisJCSh1bnNpZ25lZCBsb25nKXNlcC0+Y2FjaGVfYnVzKTsKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImNhY2hlIHNpemUgaXMgJTA4enhcbiIsCisJCXNlcC0+Y2FjaGVfc2l6ZSk7CisKKwkvKiBTZXQgYWRkcmVzc2VzIGFuZCBsb2FkIGV4dGFwcCAqLworCXNlcC0+ZXh0YXBwX2J1cyA9IHNlcC0+Y2FjaGVfYnVzICsgKDEwMjQgKiAzNzApOworCXNlcC0+ZXh0YXBwX2FkZHIgPSBzZXAtPmNhY2hlX2FkZHIgKyAoMTAyNCAqIDM3MCk7CisKKwllcnJvciA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBleHRhcHBfbmFtZSwgJnNlcC0+cGRldi0+ZGV2KTsKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LCAiVW5hYmxlIHRvIHJlcXVlc3QgZXh0YXBwIGZpcm13YXJlXG4iKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCW1lbWNweShzZXAtPmV4dGFwcF9hZGRyLCAodm9pZCAqKWZ3LT5kYXRhLCBmdy0+c2l6ZSk7CisJc2VwLT5leHRhcHBfc2l6ZSA9IGZ3LT5zaXplOworCXJlbGVhc2VfZmlybXdhcmUoZncpOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJleHRhcHAgdmlydHVhbCBpcyAlcFxuIiwKKwkJc2VwLT5leHRhcHBfYWRkcik7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJleHRhcHAgYnVzIGlzICUwOGxseFxuIiwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZylzZXAtPmV4dGFwcF9idXMpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiZXh0YXBwIHNpemUgaXMgJTA4enhcbiIsCisJCXNlcC0+ZXh0YXBwX3NpemUpOworCisJcmV0dXJuIGVycm9yOworfQorCitNT0RVTEVfRklSTVdBUkUoInNlcC9jYWNoZS5pbWFnZS5iaW4iKTsKK01PRFVMRV9GSVJNV0FSRSgic2VwL3Jlc2lkZW50LmltYWdlLmJpbiIpOworTU9EVUxFX0ZJUk1XQVJFKCJzZXAvZXh0YXBwLmltYWdlLmJpbiIpOworCisvKioKKyAqCXNlcF9kdW1wX21lc3NhZ2UgLSBkdW1wIHRoZSBtZXNzYWdlIHRoYXQgaXMgcGVuZGluZworICoJQHNlcDogU0VQIGRldmljZQorICovCitzdGF0aWMgdm9pZCBzZXBfZHVtcF9tZXNzYWdlKHN0cnVjdCBzZXBfZGV2aWNlICpzZXApCit7CisJaW50IGNvdW50OworCXUzMiAqcCA9IHNlcC0+c2hhcmVkX2FkZHI7CisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMTIgKiA0OyBjb3VudCArPSA0KQorCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgIldvcmQgJWQgb2YgdGhlIG1lc3NhZ2UgaXMgJXhcbiIsCisJCQkJCQkJCWNvdW50LCAqcCsrKTsKK30KKworLyoqCisgKglzZXBfbWFwX2FuZF9hbGxvY19zaGFyZWRfYXJlYSAtCWFsbG9jYXRlIHNoYXJlZCBibG9jaworICoJQHNlcDogc2VjdXJpdHkgcHJvY2Vzc29yCisgKglAc2l6ZTogc2l6ZSBvZiBzaGFyZWQgYXJlYQorICovCitzdGF0aWMgaW50IHNlcF9tYXBfYW5kX2FsbG9jX3NoYXJlZF9hcmVhKHN0cnVjdCBzZXBfZGV2aWNlICpzZXApCit7CisJc2VwLT5zaGFyZWRfYWRkciA9IGRtYV9hbGxvY19jb2hlcmVudCgmc2VwLT5wZGV2LT5kZXYsCisJCXNlcC0+c2hhcmVkX3NpemUsCisJCSZzZXAtPnNoYXJlZF9idXMsIEdGUF9LRVJORUwpOworCisJaWYgKCFzZXAtPnNoYXJlZF9hZGRyKSB7CisJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwKKwkJCSJzaGFyZWQgbWVtb3J5IGRtYV9hbGxvY19jb2hlcmVudCBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCisJCSJzaGFyZWRfYWRkciAlenggYnl0ZXMgQCVwIChidXMgJWxseClcbiIsCisJCQkJc2VwLT5zaGFyZWRfc2l6ZSwgc2VwLT5zaGFyZWRfYWRkciwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXNlcC0+c2hhcmVkX2J1cyk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJc2VwX3VubWFwX2FuZF9mcmVlX3NoYXJlZF9hcmVhIC0gZnJlZSBzaGFyZWQgYmxvY2sKKyAqCUBzZXA6IHNlY3VyaXR5IHByb2Nlc3NvcgorICovCitzdGF0aWMgdm9pZCBzZXBfdW5tYXBfYW5kX2ZyZWVfc2hhcmVkX2FyZWEoc3RydWN0IHNlcF9kZXZpY2UgKnNlcCkKK3sKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNoYXJlZCBhcmVhIHVubWFwIGFuZCBmcmVlXG4iKTsKKwlkbWFfZnJlZV9jb2hlcmVudCgmc2VwLT5wZGV2LT5kZXYsIHNlcC0+c2hhcmVkX3NpemUsCisJCQkJc2VwLT5zaGFyZWRfYWRkciwgc2VwLT5zaGFyZWRfYnVzKTsKK30KKworLyoqCisgKglzZXBfc2hhcmVkX2J1c190b192aXJ0IC0gY29udmVydCBidXMvdmlydCBhZGRyZXNzZXMKKyAqCUBzZXA6IHBvaW50ZXIgdG8gc3RydWN0IHNlcF9kZXZpY2UKKyAqCUBidXNfYWRkcmVzczogYWRkcmVzcyB0byBjb252ZXJ0CisgKgorICoJUmV0dXJucyB2aXJ0dWFsIGFkZHJlc3MgaW5zaWRlIHRoZSBzaGFyZWQgYXJlYSBhY2NvcmRpbmcKKyAqCXRvIHRoZSBidXMgYWRkcmVzcy4KKyAqLworc3RhdGljIHZvaWQgKnNlcF9zaGFyZWRfYnVzX3RvX3ZpcnQoc3RydWN0IHNlcF9kZXZpY2UgKnNlcCwKKwkJCQkJCWRtYV9hZGRyX3QgYnVzX2FkZHJlc3MpCit7CisJcmV0dXJuIHNlcC0+c2hhcmVkX2FkZHIgKyAoYnVzX2FkZHJlc3MgLSBzZXAtPnNoYXJlZF9idXMpOworfQorCisvKioKKyAqCW9wZW4gZnVuY3Rpb24gZm9yIHRoZSBzaW5nbGV0b24gZHJpdmVyCisgKglAaW5vZGVfcHRyIHN0cnVjdCBpbm9kZSAqCisgKglAZmlsZV9wdHIgc3RydWN0IGZpbGUgKgorICoKKyAqCUNhbGxlZCB3aGVuIHRoZSB1c2VyIG9wZW5zIHRoZSBzaW5nbGV0b24gZGV2aWNlIGludGVyZmFjZQorICovCitzdGF0aWMgaW50IHNlcF9zaW5nbGV0b25fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlX3B0ciwgc3RydWN0IGZpbGUgKmZpbGVfcHRyKQoreworCWludCBlcnJvciA9IDA7CisJc3RydWN0IHNlcF9kZXZpY2UgKnNlcDsKKworCS8qCisJICogR2V0IHRoZSBTRVAgZGV2aWNlIHN0cnVjdHVyZSBhbmQgdXNlIGl0IGZvciB0aGUKKwkgKiBwcml2YXRlX2RhdGEgZmllbGQgaW4gZmlscCBmb3Igb3RoZXIgbWV0aG9kcworCSAqLworCXNlcCA9IHNlcF9kZXY7CisKKwlmaWxlX3B0ci0+cHJpdmF0ZV9kYXRhID0gc2VwOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJTaW5nbGV0b24gb3BlbiBmb3IgcGlkICVkXG4iLCBjdXJyZW50LT5waWQpOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJjYWxsaW5nIHRlc3QgYW5kIHNldCBmb3Igc2luZ2xldG9uIDBcbiIpOworCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZzZXAtPnNpbmdsZXRvbl9hY2Nlc3NfZmxhZykpIHsKKwkJZXJyb3IgPSAtRUJVU1k7CisJCWdvdG8gZW5kX2Z1bmN0aW9uOworCX0KKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX3NpbmdsZXRvbl9vcGVuIGVuZFxuIik7CitlbmRfZnVuY3Rpb246CisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqCXNlcF9vcGVuIC0gZGV2aWNlIG9wZW4gbWV0aG9kCisgKglAaW5vZGU6IGlub2RlIG9mIFNFUCBkZXZpY2UKKyAqCUBmaWxwOiBmaWxlIGhhbmRsZSB0byBTRVAgZGV2aWNlCisgKgorICoJT3BlbiBtZXRob2QgZm9yIHRoZSBTRVAgZGV2aWNlLiBDYWxsZWQgd2hlbiB1c2Vyc3BhY2Ugb3BlbnMKKyAqCXRoZSBTRVAgZGV2aWNlIG5vZGUuCisgKgorICoJUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3Mgb3RoZXJ3aXNlIGFuIGVycm9yIGNvZGUuCisgKi8KK3N0YXRpYyBpbnQgc2VwX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IHNlcF9kZXZpY2UgKnNlcDsKKworCS8qCisJICogR2V0IHRoZSBTRVAgZGV2aWNlIHN0cnVjdHVyZSBhbmQgdXNlIGl0IGZvciB0aGUKKwkgKiBwcml2YXRlX2RhdGEgZmllbGQgaW4gZmlscCBmb3Igb3RoZXIgbWV0aG9kcworCSAqLworCXNlcCA9IHNlcF9kZXY7CisJZmlscC0+cHJpdmF0ZV9kYXRhID0gc2VwOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJPcGVuIGZvciBwaWQgJWRcbiIsIGN1cnJlbnQtPnBpZCk7CisKKwkvKiBBbnlvbmUgY2FuIG9wZW47IGxvY2tpbmcgdGFrZXMgcGxhY2UgYXQgdHJhbnNhY3Rpb24gbGV2ZWwgKi8KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglzZXBfc2luZ2xldG9uX3JlbGVhc2UgLSBjbG9zZSBhIFNFUCBzaW5nbGV0b24gZGV2aWNlCisgKglAaW5vZGU6IGlub2RlIG9mIFNFUCBkZXZpY2UKKyAqCUBmaWxwOiBmaWxlIGhhbmRsZSBiZWluZyBjbG9zZWQKKyAqCisgKglDYWxsZWQgb24gdGhlIGZpbmFsIGNsb3NlIG9mIGEgU0VQIGRldmljZS4gQXMgdGhlIG9wZW4gcHJvdGVjdHMgYWdhaW5zdAorICoJbXVsdGlwbGUgc2ltdWx0YWVub3VzIG9wZW5zIHRoYXQgbWVhbnMgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlCisgKglmaW5hbCByZWZlcmVuY2UgdG8gdGhlIG9wZW4gaGFuZGxlIGlzIGRyb3BwZWQuCisgKi8KK3N0YXRpYyBpbnQgc2VwX3NpbmdsZXRvbl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBzZXBfZGV2aWNlICpzZXAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgIlNpbmdsZXRvbiByZWxlYXNlIGZvciBwaWQgJWRcbiIsCisJCQkJCQkJY3VycmVudC0+cGlkKTsKKwljbGVhcl9iaXQoMCwgJnNlcC0+c2luZ2xldG9uX2FjY2Vzc19mbGFnKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglzZXBfcmVxdWVzdF9kYWVtb25vcGVuIC0gcmVxdWVzdCBkYWVtb24gb3BlbiBtZXRob2QKKyAqCUBpbm9kZTogaW5vZGUgb2YgU0VQIGRldmljZQorICoJQGZpbHA6IGZpbGUgaGFuZGxlIHRvIFNFUCBkZXZpY2UKKyAqCisgKglPcGVuIG1ldGhvZCBmb3IgdGhlIFNFUCByZXF1ZXN0IGRhZW1vbi4gQ2FsbGVkIHdoZW4KKyAqCXJlcXVlc3QgZGFlbW9uIGluIHVzZXJzcGFjZSBvcGVucyB0aGUgU0VQIGRldmljZSBub2RlLgorICoKKyAqCVJldHVybnMgemVybyBvbiBzdWNjZXNzIG90aGVyd2lzZSBhbiBlcnJvciBjb2RlLgorICovCitzdGF0aWMgaW50IHNlcF9yZXF1ZXN0X2RhZW1vbl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBzZXBfZGV2aWNlICpzZXAgPSBzZXBfZGV2OworCWludCBlcnJvciA9IDA7CisKKwlmaWxwLT5wcml2YXRlX2RhdGEgPSBzZXA7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgIlJlcXVlc3QgZGFlbW9uIG9wZW4gZm9yIHBpZCAlZFxuIiwKKwkJY3VycmVudC0+cGlkKTsKKworCS8qIFRoZXJlIGlzIHN1cHBvc2VkIHRvIGJlIG9ubHkgb25lIHJlcXVlc3QgZGFlbW9uICovCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJjYWxsaW5nIHRlc3QgYW5kIHNldCBmb3IgcmVxX2Rtb24gb3BlbiAwXG4iKTsKKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmc2VwLT5yZXF1ZXN0X2RhZW1vbl9vcGVuKSkKKwkJZXJyb3IgPSAtRUJVU1k7CisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqCXNlcF9yZXF1ZXN0X2RhZW1vbl9yZWxlYXNlIC0gY2xvc2UgYSBTRVAgZGFlbW9uCisgKglAaW5vZGU6IGlub2RlIG9mIFNFUCBkZXZpY2UKKyAqCUBmaWxwOiBmaWxlIGhhbmRsZSBiZWluZyBjbG9zZWQKKyAqCisgKglDYWxsZWQgb24gdGhlIGZpbmFsIGNsb3NlIG9mIGEgU0VQIGRhZW1vbi4KKyAqLworc3RhdGljIGludCBzZXBfcmVxdWVzdF9kYWVtb25fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJSZXF1ZXMgZGFlbW9uIHJlbGVhc2UgZm9yIHBpZCAlZFxuIiwKKwkJY3VycmVudC0+cGlkKTsKKworCS8qIENsZWFyIHRoZSByZXF1ZXN0X2RhZW1vbl9vcGVuIGZsYWcgKi8KKwljbGVhcl9iaXQoMCwgJnNlcC0+cmVxdWVzdF9kYWVtb25fb3Blbik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJc2VwX3JlcV9kYWVtb25fc2VuZF9yZXBseV9jb21tYW5kX2hhbmRsZXIgLSBwb2tlIHRoZSBTRVAKKyAqCUBzZXA6IHN0cnVjdCBzZXBfZGV2aWNlICoKKyAqCisgKglUaGlzIGZ1bmN0aW9uIHJhaXNlcyBpbnRlcnJ1cHQgdG8gU0VQbSB0aGF0IHNpZ25hbHMgdGhhdCBpcyBoYXMgYQorICoJbmV3IGNvbW1hbmQgZnJvbSBIT1NUCisgKi8KK3N0YXRpYyBpbnQgc2VwX3JlcV9kYWVtb25fc2VuZF9yZXBseV9jb21tYW5kX2hhbmRsZXIoc3RydWN0IHNlcF9kZXZpY2UgKnNlcCkKK3sKKwl1bnNpZ25lZCBsb25nIGxja19mbGFnczsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkic2VwX3JlcV9kYWVtb25fc2VuZF9yZXBseV9jb21tYW5kX2hhbmRsZXIgc3RhcnRcbiIpOworCisJc2VwX2R1bXBfbWVzc2FnZShzZXApOworCisJLyogQ291bnRlcnMgYXJlIGxvY2thYmxlIHJlZ2lvbiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZzZXAtPnNuZF9ycGx5X2xjaywgbGNrX2ZsYWdzKTsKKwlzZXAtPnNlbmRfY3QrKzsKKwlzZXAtPnJlcGx5X2N0Kys7CisKKwkvKiBTZW5kIHRoZSBpbnRlcnJ1cHQgdG8gU0VQICovCisJc2VwX3dyaXRlX3JlZyhzZXAsIEhXX0hPU1RfSE9TVF9TRVBfR1BSMl9SRUdfQUREUiwgc2VwLT5zZW5kX2N0KTsKKwlzZXAtPnNlbmRfY3QrKzsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlcC0+c25kX3JwbHlfbGNrLCBsY2tfZmxhZ3MpOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCisJCSJzZXBfcmVxX2RhZW1vbl9zZW5kX3JlcGx5IHNlbmRfY3QgJWx4IHJlcGx5X2N0ICVseFxuIiwKKwkJc2VwLT5zZW5kX2N0LCBzZXAtPnJlcGx5X2N0KTsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkic2VwX3JlcV9kYWVtb25fc2VuZF9yZXBseV9jb21tYW5kX2hhbmRsZXIgZW5kXG4iKTsKKworCXJldHVybiAwOworfQorCisKKy8qKgorICoJc2VwX2ZyZWVfZG1hX3RhYmxlX2RhdGFfaGFuZGxlciAtIGZyZWUgRE1BIHRhYmxlCisgKglAc2VwOiBwb2ludGVyZSB0byBzdHJ1Y3Qgc2VwX2RldmljZQorICoKKyAqCUhhbmRsZXMgdGhlIHJlcXVlc3QgdG8gIGZyZWUgRE1BIHRhYmxlIGZvciBzeW5jaHJvbmljIGFjdGlvbnMKKyAqLworc3RhdGljIGludCBzZXBfZnJlZV9kbWFfdGFibGVfZGF0YV9oYW5kbGVyKHN0cnVjdCBzZXBfZGV2aWNlICpzZXApCit7CisJaW50IGNvdW50OworCWludCBkY2JfY291bnRlcjsKKwkvKiBQb2ludGVyIHRvIHRoZSBjdXJyZW50IGRtYV9yZXNvdXJjZSBzdHJ1Y3QgKi8KKwlzdHJ1Y3Qgc2VwX2RtYV9yZXNvdXJjZSAqZG1hOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfZnJlZV9kbWFfdGFibGVfZGF0YV9oYW5kbGVyIHN0YXJ0XG4iKTsKKworCWZvciAoZGNiX2NvdW50ZXIgPSAwOyBkY2JfY291bnRlciA8IHNlcC0+bnJfZGNiX2NyZWF0OyBkY2JfY291bnRlcisrKSB7CisJCWRtYSA9ICZzZXAtPmRtYV9yZXNfYXJyW2RjYl9jb3VudGVyXTsKKworCQkvKiBVbm1hcCBhbmQgZnJlZSBpbnB1dCBtYXAgYXJyYXkgKi8KKwkJaWYgKGRtYS0+aW5fbWFwX2FycmF5KSB7CisJCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBkbWEtPmluX251bV9wYWdlczsgY291bnQrKykgeworCQkJCWRtYV91bm1hcF9wYWdlKCZzZXAtPnBkZXYtPmRldiwKKwkJCQkJZG1hLT5pbl9tYXBfYXJyYXlbY291bnRdLmRtYV9hZGRyLAorCQkJCQlkbWEtPmluX21hcF9hcnJheVtjb3VudF0uc2l6ZSwKKwkJCQkJRE1BX1RPX0RFVklDRSk7CisJCQl9CisJCQlrZnJlZShkbWEtPmluX21hcF9hcnJheSk7CisJCX0KKworCQkvKiBVbm1hcCBvdXRwdXQgbWFwIGFycmF5LCBET04nVCBmcmVlIGl0IHlldCAqLworCQlpZiAoZG1hLT5vdXRfbWFwX2FycmF5KSB7CisJCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBkbWEtPm91dF9udW1fcGFnZXM7IGNvdW50KyspIHsKKwkJCQlkbWFfdW5tYXBfcGFnZSgmc2VwLT5wZGV2LT5kZXYsCisJCQkJCWRtYS0+b3V0X21hcF9hcnJheVtjb3VudF0uZG1hX2FkZHIsCisJCQkJCWRtYS0+b3V0X21hcF9hcnJheVtjb3VudF0uc2l6ZSwKKwkJCQkJRE1BX0ZST01fREVWSUNFKTsKKwkJCX0KKwkJCWtmcmVlKGRtYS0+b3V0X21hcF9hcnJheSk7CisJCX0KKworCQkvKiBGcmVlIHBhZ2UgY2FjaGUgZm9yIG91dHB1dCAqLworCQlpZiAoZG1hLT5pbl9wYWdlX2FycmF5KSB7CisJCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBkbWEtPmluX251bV9wYWdlczsgY291bnQrKykgeworCQkJCWZsdXNoX2RjYWNoZV9wYWdlKGRtYS0+aW5fcGFnZV9hcnJheVtjb3VudF0pOworCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShkbWEtPmluX3BhZ2VfYXJyYXlbY291bnRdKTsKKwkJCX0KKwkJCWtmcmVlKGRtYS0+aW5fcGFnZV9hcnJheSk7CisJCX0KKworCQlpZiAoZG1hLT5vdXRfcGFnZV9hcnJheSkgeworCQkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgZG1hLT5vdXRfbnVtX3BhZ2VzOyBjb3VudCsrKSB7CisJCQkJaWYgKCFQYWdlUmVzZXJ2ZWQoZG1hLT5vdXRfcGFnZV9hcnJheVtjb3VudF0pKQorCQkJCQlTZXRQYWdlRGlydHkoZG1hLT5vdXRfcGFnZV9hcnJheVtjb3VudF0pOworCQkJCWZsdXNoX2RjYWNoZV9wYWdlKGRtYS0+b3V0X3BhZ2VfYXJyYXlbY291bnRdKTsKKwkJCQlwYWdlX2NhY2hlX3JlbGVhc2UoZG1hLT5vdXRfcGFnZV9hcnJheVtjb3VudF0pOworCQkJfQorCQkJa2ZyZWUoZG1hLT5vdXRfcGFnZV9hcnJheSk7CisJCX0KKworCQkvKiBSZXNldCBhbGwgdGhlIHZhbHVlcyAqLworCQlkbWEtPmluX3BhZ2VfYXJyYXkgPSBOVUxMOworCQlkbWEtPm91dF9wYWdlX2FycmF5ID0gTlVMTDsKKwkJZG1hLT5pbl9udW1fcGFnZXMgPSAwOworCQlkbWEtPm91dF9udW1fcGFnZXMgPSAwOworCQlkbWEtPmluX21hcF9hcnJheSA9IE5VTEw7CisJCWRtYS0+b3V0X21hcF9hcnJheSA9IE5VTEw7CisJCWRtYS0+aW5fbWFwX251bV9lbnRyaWVzID0gMDsKKwkJZG1hLT5vdXRfbWFwX251bV9lbnRyaWVzID0gMDsKKwl9CisKKwlzZXAtPm5yX2RjYl9jcmVhdCA9IDA7CisJc2VwLT5udW1fbGxpX3RhYmxlc19jcmVhdGVkID0gMDsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX2ZyZWVfZG1hX3RhYmxlX2RhdGFfaGFuZGxlciBlbmRcbiIpOworCXJldHVybiAwOworfQorCisvKioKKyAqCXNlcF9yZXF1ZXN0X2RhZW1vbl9tbWFwIC0gbWFwcyB0aGUgc2hhcmVkIGFyZWEgdG8gdXNlciBzcGFjZQorICoJQGZpbHA6IHBvaW50ZXIgdG8gc3RydWN0IGZpbGUKKyAqCUB2bWE6IHBvaW50ZXIgdG8gdm1fYXJlYV9zdHJ1Y3QKKyAqCisgKglDYWxsZWQgYnkgdGhlIGtlcm5lbCB3aGVuIHRoZSBkYWVtb24gYXR0ZW1wdHMgYW4gbW1hcCgpIHN5c2NhbGwKKyAqCXVzaW5nIG91ciBoYW5kbGUuCisgKi8KK3N0YXRpYyBpbnQgc2VwX3JlcXVlc3RfZGFlbW9uX21tYXAoc3RydWN0IGZpbGUgICpmaWxwLAorCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAgKnZtYSkKK3sKKwlzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWRtYV9hZGRyX3QgYnVzX2FkZHJlc3M7CisJaW50IGVycm9yID0gMDsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiZGFlbW9uIG1tYXAgc3RhcnRcbiIpOworCisJaWYgKCh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpID4gU0VQX0RSSVZFUl9NTU1BUF9BUkVBX1NJWkUpIHsKKwkJZXJyb3IgPSAtRUlOVkFMOworCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwl9CisKKwkvKiBHZXQgcGh5c2ljYWwgYWRkcmVzcyAqLworCWJ1c19hZGRyZXNzID0gc2VwLT5zaGFyZWRfYnVzOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJidXNfYWRkcmVzcyBpcyAlMDhseFxuIiwKKwkJCQkJKHVuc2lnbmVkIGxvbmcpYnVzX2FkZHJlc3MpOworCisJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsIGJ1c19hZGRyZXNzID4+IFBBR0VfU0hJRlQsCisJCXZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCwgdm1hLT52bV9wYWdlX3Byb3QpKSB7CisKKwkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LCAicmVtYXBfcGFnZV9yYW5nZSBmYWlsZWRcbiIpOworCQllcnJvciA9IC1FQUdBSU47CisJCWdvdG8gZW5kX2Z1bmN0aW9uOworCX0KKworZW5kX2Z1bmN0aW9uOgorCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiZGFlbW9uIG1tYXAgZW5kXG4iKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICoJc2VwX3JlcXVlc3RfZGFlbW9uX3BvbGwgLSBwb2xsIGltcGxlbWVudGF0aW9uCisgKglAc2VwOiBzdHJ1Y3Qgc2VwX2RldmljZSAqIGZvciBjdXJyZW50IFNFUCBkZXZpY2UKKyAqCUBmaWxwOiBzdHJ1Y3QgZmlsZSAqIGZvciBvcGVuIGZpbGUKKyAqCUB3YWl0OiBwb2xsX3RhYmxlICogZm9yIHBvbGwKKyAqCisgKglDYWxsZWQgd2hlbiBvdXIgZGV2aWNlIGlzIHBhcnQgb2YgYSBwb2xsKCkgb3Igc2VsZWN0KCkgc3lzY2FsbAorICovCitzdGF0aWMgdW5zaWduZWQgaW50IHNlcF9yZXF1ZXN0X2RhZW1vbl9wb2xsKHN0cnVjdCBmaWxlICpmaWxwLAorCXBvbGxfdGFibGUgICp3YWl0KQoreworCXUzMgltYXNrID0gMDsKKwkvKiBHUFIyIHJlZ2lzdGVyICovCisJdTMyCXJldHZhbDI7CisJdW5zaWduZWQgbG9uZyBsY2tfZmxhZ3M7CisJc3RydWN0IHNlcF9kZXZpY2UgKnNlcCA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiZGFlbW9uIHBvbGw6IHN0YXJ0XG4iKTsKKworCXBvbGxfd2FpdChmaWxwLCAmc2VwLT5ldmVudF9yZXF1ZXN0X2RhZW1vbiwgd2FpdCk7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImRhZW1vbiBwb2xsOiBzZW5kX2N0IGlzICVseCByZXBseSBjdCBpcyAlbHhcbiIsCisJCQkJCQlzZXAtPnNlbmRfY3QsIHNlcC0+cmVwbHlfY3QpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlcC0+c25kX3JwbHlfbGNrLCBsY2tfZmxhZ3MpOworCS8qIENoZWNrIGlmIHRoZSBkYXRhIGlzIHJlYWR5ICovCisJaWYgKHNlcC0+c2VuZF9jdCA9PSBzZXAtPnJlcGx5X2N0KSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlcC0+c25kX3JwbHlfbGNrLCBsY2tfZmxhZ3MpOworCisJCXJldHZhbDIgPSBzZXBfcmVhZF9yZWcoc2VwLCBIV19IT1NUX1NFUF9IT1NUX0dQUjJfUkVHX0FERFIpOworCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKKwkJCSJkYWVtb24gcG9sbDogZGF0YSBjaGVjayAoR1BSMikgaXMgJXhcbiIsIHJldHZhbDIpOworCisJCS8qIENoZWNrIGlmIFBSSU5UIHJlcXVlc3QgKi8KKwkJaWYgKChyZXR2YWwyID4+IDMwKSAmIDB4MSkgeworCQkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJkYWVtb24gcG9sbDogUFJJTlRGIHJlcXVlc3QgaW5cbiIpOworCQkJbWFzayB8PSBQT0xMSU47CisJCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwkJfQorCQkvKiBDaGVjayBpZiBOVlMgcmVxdWVzdCAqLworCQlpZiAocmV0dmFsMiA+PiAzMSkgeworCQkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJkYWVtb24gcG9sbDogTlZTIHJlcXVlc3QgaW5cbiIpOworCQkJbWFzayB8PSBQT0xMUFJJIHwgUE9MTFdSTk9STTsKKwkJfQorCX0gZWxzZSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlcC0+c25kX3JwbHlfbGNrLCBsY2tfZmxhZ3MpOworCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKKwkJCSJkYWVtb24gcG9sbDogbm8gcmVwbHkgcmVjZWl2ZWQ7IHJldHVybmluZyAwXG4iKTsKKwkJbWFzayA9IDA7CisJfQorZW5kX2Z1bmN0aW9uOgorCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiZGFlbW9uIHBvbGw6IGV4aXRcbiIpOworCXJldHVybiBtYXNrOworfQorCisvKioKKyAqCXNlcF9yZWxlYXNlIC0gY2xvc2UgYSBTRVAgZGV2aWNlCisgKglAaW5vZGU6IGlub2RlIG9mIFNFUCBkZXZpY2UKKyAqCUBmaWxwOiBmaWxlIGhhbmRsZSBiZWluZyBjbG9zZWQKKyAqCisgKglDYWxsZWQgb24gdGhlIGZpbmFsIGNsb3NlIG9mIGEgU0VQIGRldmljZS4KKyAqLworc3RhdGljIGludCBzZXBfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJSZWxlYXNlIGZvciBwaWQgJWRcbiIsIGN1cnJlbnQtPnBpZCk7CisKKwltdXRleF9sb2NrKCZzZXAtPnNlcF9tdXRleCk7CisJLyogSXMgdGhpcyB0aGUgcHJvY2VzcyB0aGF0IGhhcyBhIHRyYW5zYWN0aW9uIG9wZW4/CisJICogSWYgc28sIGxldHMgcmVzZXQgcGlkX2RvaW5nX3RyYW5zYWN0aW9uIHRvIDAgYW5kCisJICogY2xlYXIgdGhlIGluIHVzZSBmbGFncywgYW5kIHRoZW4gd2FrZSB1cCBzZXBfZXZlbnQKKwkgKiBzbyB0aGF0IG90aGVyIHByb2Nlc3NlcyBjYW4gZG8gdHJhbnNhY3Rpb25zCisJICovCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJ3YWtpbmcgdXAgZXZlbnQgYW5kIG1tYXBfZXZlbnRcbiIpOworCWlmIChzZXAtPnBpZF9kb2luZ190cmFuc2FjdGlvbiA9PSBjdXJyZW50LT5waWQpIHsKKwkJY2xlYXJfYml0KFNFUF9NTUFQX0xPQ0tfQklULCAmc2VwLT5pbl91c2VfZmxhZ3MpOworCQljbGVhcl9iaXQoU0VQX1NFTkRfTVNHX0xPQ0tfQklULCAmc2VwLT5pbl91c2VfZmxhZ3MpOworCQlzZXBfZnJlZV9kbWFfdGFibGVfZGF0YV9oYW5kbGVyKHNlcCk7CisJCXdha2VfdXAoJnNlcC0+ZXZlbnQpOworCQlzZXAtPnBpZF9kb2luZ190cmFuc2FjdGlvbiA9IDA7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZzZXAtPnNlcF9tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJc2VwX21tYXAgLSAgbWFwcyB0aGUgc2hhcmVkIGFyZWEgdG8gdXNlciBzcGFjZQorICoJQGZpbHA6IHBvaW50ZXIgdG8gc3RydWN0IGZpbGUKKyAqCUB2bWE6IHBvaW50ZXIgdG8gdm1fYXJlYV9zdHJ1Y3QKKyAqCisgKglDYWxsZWQgb24gYW4gbW1hcCBvZiBvdXIgc3BhY2UgdmlhIHRoZSBub3JtYWwgU0VQIGRldmljZQorICovCitzdGF0aWMgaW50IHNlcF9tbWFwKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlkbWFfYWRkcl90IGJ1c19hZGRyOworCXN0cnVjdCBzZXBfZGV2aWNlICpzZXAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBlcnJvciA9IDA7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgIm1tYXAgc3RhcnRcbiIpOworCisJLyogU2V0IHRoZSB0cmFuc2FjdGlvbiBidXN5IChvd24gdGhlIGRldmljZSkgKi8KKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoc2VwLT5ldmVudCwKKwkJdGVzdF9hbmRfc2V0X2JpdChTRVBfTU1BUF9MT0NLX0JJVCwKKwkJJnNlcC0+aW5fdXNlX2ZsYWdzKSA9PSAwKTsKKworCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQllcnJvciA9IC1FSU5UUjsKKwkJZ290byBlbmRfZnVuY3Rpb25fd2l0aF9lcnJvcjsKKwl9CisJLyoKKwkgKiBUaGUgcGlkX2RvaW5nX3RyYW5zYWN0aW9uIGluZGljYXRlcyB0aGF0IHRoaXMgcHJvY2VzcworCSAqIG5vdyBvd25zIHRoZSBmYWNpbGl0aWVzIHRvIHBlcmZvcm1hIGEgdHJhbnNhY3Rpb24gd2l0aAorCSAqIHRoZSBTRVAuIFdoaWxlIHRoaXMgcHJvY2VzcyBpcyBwZXJmb3JtaW5nIGEgdHJhbnNhY3Rpb24sCisJICogbm8gb3RoZXIgcHJvY2VzcyB3aG8gaGFzIHRoZSBTRVAgZGV2aWNlIG9wZW4gY2FuIHBlcmZvcm0KKwkgKiBhbnkgdHJhbnNhY3Rpb25zLiBUaGlzIG1ldGhvZCBhbGxvd3MgbW9yZSB0aGFuIG9uZSBwcm9jZXNzCisJICogdG8gaGF2ZSB0aGUgZGV2aWNlIG9wZW4gYXQgYW55IGdpdmVuIHRpbWUsIHdoaWNoIHByb3ZpZGVzCisJICogZmluZXIgZ3JhbnVsYXJpdHkgZm9yIGRldmljZSB1dGlsaXphdGlvbiBieSBtdWx0aXBsZQorCSAqIHByb2Nlc3Nlcy4KKwkgKi8KKwltdXRleF9sb2NrKCZzZXAtPnNlcF9tdXRleCk7CisJc2VwLT5waWRfZG9pbmdfdHJhbnNhY3Rpb24gPSBjdXJyZW50LT5waWQ7CisJbXV0ZXhfdW5sb2NrKCZzZXAtPnNlcF9tdXRleCk7CisKKwkvKiBaZXJvIHRoZSBwb29scyBhbmQgdGhlIG51bWJlciBvZiBkYXRhIHBvb2wgYWxvY2F0aW9uIHBvaW50ZXJzICovCisJc2VwLT5kYXRhX3Bvb2xfYnl0ZXNfYWxsb2NhdGVkID0gMDsKKwlzZXAtPm51bV9vZl9kYXRhX2FsbG9jYXRpb25zID0gMDsKKworCS8qCisJICogQ2hlY2sgdGhhdCB0aGUgc2l6ZSBvZiB0aGUgbWFwcGVkIHJhbmdlIGlzIGFzIHRoZSBzaXplIG9mIHRoZSBtZXNzYWdlCisJICogc2hhcmVkIGFyZWEKKwkgKi8KKwlpZiAoKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCkgPiBTRVBfRFJJVkVSX01NTUFQX0FSRUFfU0laRSkgeworCQllcnJvciA9IC1FSU5WQUw7CisJCWdvdG8gZW5kX2Z1bmN0aW9uX3dpdGhfZXJyb3I7CisJfQorCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzaGFyZWRfYWRkciBpcyAlcFxuIiwgc2VwLT5zaGFyZWRfYWRkcik7CisKKwkvKiBHZXQgYnVzIGFkZHJlc3MgKi8KKwlidXNfYWRkciA9IHNlcC0+c2hhcmVkX2J1czsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkiYnVzX2FkZHJlc3MgaXMgJWx4XG4iLCAodW5zaWduZWQgbG9uZylidXNfYWRkcik7CisKKwlpZiAocmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwgYnVzX2FkZHIgPj4gUEFHRV9TSElGVCwKKwkJdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX3BhZ2VfcHJvdCkpIHsKKwkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LCAicmVtYXBfcGFnZV9yYW5nZSBmYWlsZWRcbiIpOworCQllcnJvciA9IC1FQUdBSU47CisJCWdvdG8gZW5kX2Z1bmN0aW9uX3dpdGhfZXJyb3I7CisJfQorCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAibW1hcCBlbmRcbiIpOworCWdvdG8gZW5kX2Z1bmN0aW9uOworCitlbmRfZnVuY3Rpb25fd2l0aF9lcnJvcjoKKwkvKiBDbGVhciB0aGUgYml0ICovCisJY2xlYXJfYml0KFNFUF9NTUFQX0xPQ0tfQklULCAmc2VwLT5pbl91c2VfZmxhZ3MpOworCW11dGV4X2xvY2soJnNlcC0+c2VwX211dGV4KTsKKwlzZXAtPnBpZF9kb2luZ190cmFuc2FjdGlvbiA9IDA7CisJbXV0ZXhfdW5sb2NrKCZzZXAtPnNlcF9tdXRleCk7CisKKwkvKiBSYWlzZSBldmVudCBmb3Igc3R1Y2sgY29udGV4dGVzICovCisKKwlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsICJtbWFwIGVycm9yIC0gd2FraW5nIHVwIGV2ZW50XG4iKTsKKwl3YWtlX3VwKCZzZXAtPmV2ZW50KTsKKworZW5kX2Z1bmN0aW9uOgorCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKglzZXBfcG9sbCAtIHBvbGwgaGFuZGxlcgorICoJQGZpbHA6IHBvaW50ZXIgdG8gc3RydWN0IGZpbGUKKyAqCUB3YWl0OiBwb2ludGVyIHRvIHBvbGxfdGFibGUKKyAqCisgKglDYWxsZWQgYnkgdGhlIE9TIHdoZW4gdGhlIGtlcm5lbCBpcyBhc2tlZCB0byBkbyBhIHBvbGwgb24KKyAqCWEgU0VQIGZpbGUgaGFuZGxlLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IHNlcF9wb2xsKHN0cnVjdCBmaWxlICpmaWxwLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXUzMiBtYXNrID0gMDsKKwl1MzIgcmV0dmFsID0gMDsKKwl1MzIgcmV0dmFsMiA9IDA7CisJdW5zaWduZWQgbG9uZyBsY2tfZmxhZ3M7CisKKwlzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJwb2xsOiBzdGFydFxuIik7CisKKwkvKiBBbSBJIHRoZSBwcm9jZXNzIHRoYXQgb3ducyB0aGUgdHJhbnNhY3Rpb24/ICovCisJbXV0ZXhfbG9jaygmc2VwLT5zZXBfbXV0ZXgpOworCWlmIChjdXJyZW50LT5waWQgIT0gc2VwLT5waWRfZG9pbmdfdHJhbnNhY3Rpb24pIHsKKwkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LCAicG9sbDsgd3JvbmcgcGlkXG4iKTsKKwkJbWFzayA9IFBPTExFUlI7CisJCW11dGV4X3VubG9jaygmc2VwLT5zZXBfbXV0ZXgpOworCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwl9CisJbXV0ZXhfdW5sb2NrKCZzZXAtPnNlcF9tdXRleCk7CisKKwkvKiBDaGVjayBpZiBzZW5kIGNvbW1hbmQgb3Igc2VuZF9yZXBseSB3ZXJlIGFjdGl2YXRlZCBwcmV2aW91c2x5ICovCisJaWYgKCF0ZXN0X2JpdChTRVBfU0VORF9NU0dfTE9DS19CSVQsICZzZXAtPmluX3VzZV9mbGFncykpIHsKKwkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LCAicG9sbDsgbG9jayBiaXQgc2V0XG4iKTsKKwkJbWFzayA9IFBPTExFUlI7CisJCWdvdG8gZW5kX2Z1bmN0aW9uOworCX0KKworCS8qIEFkZCB0aGUgZXZlbnQgdG8gdGhlIHBvbGxpbmcgd2FpdCB0YWJsZSAqLworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAicG9sbDogY2FsbGluZyB3YWl0IHNlcF9ldmVudFxuIik7CisKKwlwb2xsX3dhaXQoZmlscCwgJnNlcC0+ZXZlbnQsIHdhaXQpOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJwb2xsOiBzZW5kX2N0IGlzICVseCByZXBseSBjdCBpcyAlbHhcbiIsCisJCXNlcC0+c2VuZF9jdCwgc2VwLT5yZXBseV9jdCk7CisKKwkvKiBDaGVjayBpZiBlcnJvciBvY2N1cmVkIGR1cmluZyBwb2xsICovCisJcmV0dmFsMiA9IHNlcF9yZWFkX3JlZyhzZXAsIEhXX0hPU1RfU0VQX0hPU1RfR1BSM19SRUdfQUREUik7CisJaWYgKHJldHZhbDIgIT0gMHgwKSB7CisJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwgInBvbGw7IHBvbGwgZXJyb3IgJXhcbiIsIHJldHZhbDIpOworCQltYXNrIHw9IFBPTExFUlI7CisJCWdvdG8gZW5kX2Z1bmN0aW9uOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZzZXAtPnNuZF9ycGx5X2xjaywgbGNrX2ZsYWdzKTsKKworCWlmIChzZXAtPnNlbmRfY3QgPT0gc2VwLT5yZXBseV9jdCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZXAtPnNuZF9ycGx5X2xjaywgbGNrX2ZsYWdzKTsKKwkJcmV0dmFsID0gc2VwX3JlYWRfcmVnKHNlcCwgSFdfSE9TVF9TRVBfSE9TVF9HUFIyX1JFR19BRERSKTsKKwkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJwb2xsOiBkYXRhIHJlYWR5IGNoZWNrIChHUFIyKSAgJXhcbiIsCisJCQlyZXR2YWwpOworCisJCS8qIENoZWNrIGlmIHByaW50ZiByZXF1ZXN0ICAqLworCQlpZiAoKHJldHZhbCA+PiAzMCkgJiAweDEpIHsKKwkJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAicG9sbDogU0VQIHByaW50ZiByZXF1ZXN0XG4iKTsKKwkJCXdha2VfdXAoJnNlcC0+ZXZlbnRfcmVxdWVzdF9kYWVtb24pOworCQkJZ290byBlbmRfZnVuY3Rpb247CisJCX0KKworCQkvKiBDaGVjayBpZiB0aGUgdGhpcyBpcyBTRVAgcmVwbHkgb3IgcmVxdWVzdCAqLworCQlpZiAocmV0dmFsID4+IDMxKSB7CisJCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInBvbGw6IFNFUCByZXF1ZXN0XG4iKTsKKwkJCXdha2VfdXAoJnNlcC0+ZXZlbnRfcmVxdWVzdF9kYWVtb24pOworCQl9IGVsc2UgeworCQkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJwb2xsOiBub3JtYWwgcmV0dXJuXG4iKTsKKwkJCS8qIEluIGNhc2UgaXQgaXMgYWdhaW4gYnkgc2VuZF9yZXBseV9jb21hbmQgKi8KKwkJCWNsZWFyX2JpdChTRVBfU0VORF9NU0dfTE9DS19CSVQsICZzZXAtPmluX3VzZV9mbGFncyk7CisJCQlzZXBfZHVtcF9tZXNzYWdlKHNlcCk7CisJCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKKwkJCQkicG9sbDsgU0VQIHJlcGx5IFBPTExJTiB8IFBPTExSRE5PUk1cbiIpOworCQkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCQl9CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VwLT5zbmRfcnBseV9sY2ssIGxja19mbGFncyk7CisJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkJInBvbGw7IG5vIHJlcGx5IHJlY2VpdmVkOyByZXR1cm5pbmcgbWFzayBvZiAwXG4iKTsKKwkJbWFzayA9IDA7CisJfQorCitlbmRfZnVuY3Rpb246CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJwb2xsOiBlbmRcbiIpOworCXJldHVybiBtYXNrOworfQorCisvKioKKyAqCXNlcF90aW1lX2FkZHJlc3MgLSBhZGRyZXNzIGluIFNFUCBtZW1vcnkgb2YgdGltZQorICoJQHNlcDogU0VQIGRldmljZSB3ZSB3YW50IHRoZSBhZGRyZXNzIGZyb20KKyAqCisgKglSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIHR3byBkd29yZHMgaW4gbWVtb3J5IHVzZWQgZm9yIHRpbWUKKyAqCXNldHRpbmcuCisgKi8KK3N0YXRpYyB1MzIgKnNlcF90aW1lX2FkZHJlc3Moc3RydWN0IHNlcF9kZXZpY2UgKnNlcCkKK3sKKwlyZXR1cm4gc2VwLT5zaGFyZWRfYWRkciArIFNFUF9EUklWRVJfU1lTVEVNX1RJTUVfTUVNT1JZX09GRlNFVF9JTl9CWVRFUzsKK30KKworLyoqCisgKglzZXBfc2V0X3RpbWUgLSBzZXQgdGhlIFNFUCB0aW1lCisgKglAc2VwOiB0aGUgU0VQIHdlIGFyZSBzZXR0aW5nIHRoZSB0aW1lIGZvcgorICoKKyAqCUNhbGN1bGF0ZXMgdGltZSBhbmQgc2V0cyBpdCBhdCB0aGUgcHJlZGVmaW5lZCBhZGRyZXNzLgorICoJQ2FsbGVkIHdpdGggdGhlIFNFUCBtdXRleCBoZWxkLgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzZXBfc2V0X3RpbWUoc3RydWN0IHNlcF9kZXZpY2UgKnNlcCkKK3sKKwlzdHJ1Y3QgdGltZXZhbCB0aW1lOworCXUzMiAqdGltZV9hZGRyOwkvKiBBZGRyZXNzIG9mIHRpbWUgYXMgc2VlbiBieSB0aGUga2VybmVsICovCisKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX3NldF90aW1lIHN0YXJ0XG4iKTsKKworCWRvX2dldHRpbWVvZmRheSgmdGltZSk7CisKKwkvKiBTZXQgdmFsdWUgaW4gdGhlIFNZU1RFTSBNRU1PUlkgb2Zmc2V0ICovCisJdGltZV9hZGRyID0gc2VwX3RpbWVfYWRkcmVzcyhzZXApOworCisJdGltZV9hZGRyWzBdID0gU0VQX1RJTUVfVkFMX1RPS0VOOworCXRpbWVfYWRkclsxXSA9IHRpbWUudHZfc2VjOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJ0aW1lLnR2X3NlYyBpcyAlbHVcbiIsIHRpbWUudHZfc2VjKTsKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInRpbWVfYWRkciBpcyAlcFxuIiwgdGltZV9hZGRyKTsKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcC0+c2hhcmVkX2FkZHIgaXMgJXBcbiIsIHNlcC0+c2hhcmVkX2FkZHIpOworCisJcmV0dXJuIHRpbWUudHZfc2VjOworfQorCisvKioKKyAqCXNlcF9zZXRfY2FsbGVyX2lkX2hhbmRsZXIgLSBpbnNlcnQgY2FsbGVyIGlkIGVudHJ5CisgKglAc2VwOiBTRVAgZGV2aWNlCisgKglAYXJnOiBwb2ludGVyIHRvIHN0cnVjdCBjYWxsZXJfaWRfc3RydWN0CisgKgorICoJSW5zZXJ0cyB0aGUgZGF0YSBpbnRvIHRoZSBjYWxsZXIgaWQgdGFibGUuIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uCisgKglmYWxscyB1bmRlciB0aGUgaW9jdGwgbG9jaworICovCitzdGF0aWMgaW50IHNlcF9zZXRfY2FsbGVyX2lkX2hhbmRsZXIoc3RydWN0IHNlcF9kZXZpY2UgKnNlcCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdm9pZCBfX3VzZXIgKmhhc2g7CisJaW50ICAgZXJyb3IgPSAwOworCWludCAgIGk7CisJc3RydWN0IGNhbGxlcl9pZF9zdHJ1Y3QgY29tbWFuZF9hcmdzOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfc2V0X2NhbGxlcl9pZF9oYW5kbGVyIHN0YXJ0XG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCBTRVBfQ0FMTEVSX0lEX1RBQkxFX05VTV9FTlRSSUVTOyBpKyspIHsKKwkJaWYgKHNlcC0+Y2FsbGVyX2lkX3RhYmxlW2ldLnBpZCA9PSAwKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gU0VQX0NBTExFUl9JRF9UQUJMRV9OVU1fRU5UUklFUykgeworCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsICJubyBtb3JlIGNhbGxlciBpZCBlbnRyaWVzIGxlZnRcbiIpOworCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsICJtYXhpbXVtIG51bWJlciBpcyAlZFxuIiwKKwkJCQkJU0VQX0NBTExFUl9JRF9UQUJMRV9OVU1fRU5UUklFUyk7CisJCWVycm9yID0gLUVVU0VSUzsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCisJLyogQ29weSB0aGUgZGF0YSAqLworCWlmIChjb3B5X2Zyb21fdXNlcigmY29tbWFuZF9hcmdzLCAodm9pZCBfX3VzZXIgKilhcmcsCisJCXNpemVvZihjb21tYW5kX2FyZ3MpKSkgeworCQllcnJvciA9IC1FRkFVTFQ7CisJCWdvdG8gZW5kX2Z1bmN0aW9uOworCX0KKworCWhhc2ggPSAodm9pZCBfX3VzZXIgKikodW5zaWduZWQgbG9uZyljb21tYW5kX2FyZ3MuY2FsbGVySWRBZGRyZXNzOworCisJaWYgKCFjb21tYW5kX2FyZ3MucGlkIHx8ICFjb21tYW5kX2FyZ3MuY2FsbGVySWRTaXplSW5CeXRlcykgeworCQllcnJvciA9IC1FSU5WQUw7CisJCWdvdG8gZW5kX2Z1bmN0aW9uOworCX0KKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAicGlkIGlzICV4XG4iLCBjb21tYW5kX2FyZ3MucGlkKTsKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImNhbGxlcklkU2l6ZUluQnl0ZXMgaXMgJXhcbiIsCisJCWNvbW1hbmRfYXJncy5jYWxsZXJJZFNpemVJbkJ5dGVzKTsKKworCWlmIChjb21tYW5kX2FyZ3MuY2FsbGVySWRTaXplSW5CeXRlcyA+CisJCQkJCVNFUF9DQUxMRVJfSURfSEFTSF9TSVpFX0lOX0JZVEVTKSB7CisJCWVycm9yID0gLUVNU0dTSVpFOworCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwl9CisKKwlzZXAtPmNhbGxlcl9pZF90YWJsZVtpXS5waWQgPSBjb21tYW5kX2FyZ3MucGlkOworCisJaWYgKGNvcHlfZnJvbV91c2VyKHNlcC0+Y2FsbGVyX2lkX3RhYmxlW2ldLmNhbGxlcklkSGFzaCwKKwkJaGFzaCwgY29tbWFuZF9hcmdzLmNhbGxlcklkU2l6ZUluQnl0ZXMpKQorCQllcnJvciA9IC1FRkFVTFQ7CitlbmRfZnVuY3Rpb246CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfc2V0X2NhbGxlcl9pZF9oYW5kbGVyIGVuZFxuIik7CisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqCXNlcF9zZXRfY3VycmVudF9jYWxsZXJfaWQgLSBzZXQgdGhlIGNhbGxlciBpZAorICoJQHNlcDogcG9pbnRlciB0byBzdHJ1Y3Rfc2VwX2RldmljZQorICoKKyAqCVNldCB0aGUgY2FsbGVyIElEIChpZiBpdCBleGlzdHMpIHRvIHRoZSBTRVAuIE5vdGUgdGhhdCB0aGlzCisgKglmdW5jdGlvbiBmYWxscyB1bmRlciB0aGUgaW9jdGwgbG9jaworICovCitzdGF0aWMgaW50IHNlcF9zZXRfY3VycmVudF9jYWxsZXJfaWQoc3RydWN0IHNlcF9kZXZpY2UgKnNlcCkKK3sKKwlpbnQgaTsKKwl1MzIgKmhhc2hfYnVmX3B0cjsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX3NldF9jdXJyZW50X2NhbGxlcl9pZCBzdGFydFxuIik7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJjdXJyZW50IHByb2Nlc3MgaXMgJWRcbiIsIGN1cnJlbnQtPnBpZCk7CisKKwkvKiBaZXJvIHRoZSBwcmV2aW91cyB2YWx1ZSAqLworCW1lbXNldChzZXAtPnNoYXJlZF9hZGRyICsgU0VQX0NBTExFUl9JRF9PRkZTRVRfQllURVMsCisJCQkJCTAsIFNFUF9DQUxMRVJfSURfSEFTSF9TSVpFX0lOX0JZVEVTKTsKKworCWZvciAoaSA9IDA7IGkgPCBTRVBfQ0FMTEVSX0lEX1RBQkxFX05VTV9FTlRSSUVTOyBpKyspIHsKKwkJaWYgKHNlcC0+Y2FsbGVyX2lkX3RhYmxlW2ldLnBpZCA9PSBjdXJyZW50LT5waWQpIHsKKwkJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiQ2FsbGVyIElkIGZvdW5kXG4iKTsKKworCQkJbWVtY3B5KHNlcC0+c2hhcmVkX2FkZHIgKyBTRVBfQ0FMTEVSX0lEX09GRlNFVF9CWVRFUywKKwkJCQkodm9pZCAqKShzZXAtPmNhbGxlcl9pZF90YWJsZVtpXS5jYWxsZXJJZEhhc2gpLAorCQkJCVNFUF9DQUxMRVJfSURfSEFTSF9TSVpFX0lOX0JZVEVTKTsKKwkJCWJyZWFrOworCQl9CisJfQorCS8qIEVuc3VyZSBkYXRhIGlzIGluIGxpdHRsZSBlbmRpYW4gKi8KKwloYXNoX2J1Zl9wdHIgPSAodTMyICopc2VwLT5zaGFyZWRfYWRkciArCisJCVNFUF9DQUxMRVJfSURfT0ZGU0VUX0JZVEVTOworCisJZm9yIChpID0gMDsgaSA8IFNFUF9DQUxMRVJfSURfSEFTSF9TSVpFX0lOX1dPUkRTOyBpKyspCisJCWhhc2hfYnVmX3B0cltpXSA9IGNwdV90b19sZTMyKGhhc2hfYnVmX3B0cltpXSk7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9zZXRfY3VycmVudF9jYWxsZXJfaWQgZW5kXG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglzZXBfc2VuZF9jb21tYW5kX2hhbmRsZXIgLSBraWNrIG9mZiBhIGNvbW1hbmQKKyAqCUBzZXA6IFNFUCBiZWluZyBzaWduYWxsZWQKKyAqCisgKglUaGlzIGZ1bmN0aW9uIHJhaXNlcyBpbnRlcnJ1cHQgdG8gU0VQIHRoYXQgc2lnbmFscyB0aGF0IGlzIGhhcyBhIG5ldworICoJY29tbWFuZCBmcm9tIHRoZSBob3N0CisgKgorICogICAgICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBkb2VzIGZhbGwgdW5kZXIgdGhlIGlvY3RsIGxvY2sKKyAqLworc3RhdGljIGludCBzZXBfc2VuZF9jb21tYW5kX2hhbmRsZXIoc3RydWN0IHNlcF9kZXZpY2UgKnNlcCkKK3sKKwl1bnNpZ25lZCBsb25nIGxja19mbGFnczsKKwlpbnQgZXJyb3IgPSAwOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfc2VuZF9jb21tYW5kX2hhbmRsZXIgc3RhcnRcbiIpOworCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoU0VQX1NFTkRfTVNHX0xPQ0tfQklULCAmc2VwLT5pbl91c2VfZmxhZ3MpKSB7CisJCWVycm9yID0gLUVQUk9UTzsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCXNlcF9zZXRfdGltZShzZXApOworCisJc2VwX3NldF9jdXJyZW50X2NhbGxlcl9pZChzZXApOworCisJc2VwX2R1bXBfbWVzc2FnZShzZXApOworCisJLyogVXBkYXRlIGNvdW50ZXIgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VwLT5zbmRfcnBseV9sY2ssIGxja19mbGFncyk7CisJc2VwLT5zZW5kX2N0Kys7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VwLT5zbmRfcnBseV9sY2ssIGxja19mbGFncyk7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKKwkJInNlcF9zZW5kX2NvbW1hbmRfaGFuZGxlciBzZW5kX2N0ICVseCByZXBseV9jdCAlbHhcbiIsCisJCQkJCQlzZXAtPnNlbmRfY3QsIHNlcC0+cmVwbHlfY3QpOworCisJLyogU2VuZCBpbnRlcnJ1cHQgdG8gU0VQICovCisJc2VwX3dyaXRlX3JlZyhzZXAsIEhXX0hPU1RfSE9TVF9TRVBfR1BSMF9SRUdfQUREUiwgMHgyKTsKKworZW5kX2Z1bmN0aW9uOgorCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX3NlbmRfY29tbWFuZF9oYW5kbGVyIGVuZFxuIik7CisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqCXNlcF9hbGxvY2F0ZV9kYXRhX3Bvb2xfbWVtb3J5X2hhbmRsZXIgLWFsbG9jYXRlIHBvb2wgbWVtb3J5CisgKglAc2VwOiBwb2ludGVyIHRvIHN0cnVjdCBzZXBfZGV2aWNlCisgKglAYXJnOiBwb2ludGVyIHRvIHN0cnVjdCBhbGxvY19zdHJ1Y3QKKyAqCisgKglUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIGFsbG9jYXRlIGRhdGEgcG9vbCBtZW1vcnkgcmVxdWVzdAorICoJVGhpcyBmdW5jdGlvbiByZXR1cm5zIGNhbGN1bGF0ZXMgdGhlIGJ1cyBhZGRyZXNzIG9mIHRoZQorICoJYWxsb2NhdGVkIG1lbW9yeSwgYW5kIHRoZSBvZmZzZXQgb2YgdGhpcyBhcmVhIGZyb20gdGhlIG1hcHBlZCBhZGRyZXNzLgorICoJVGhlcmVmb3JlLCB0aGUgRlZPcyBpbiB1c2VyIHNwYWNlIGNhbiBjYWxjdWxhdGUgdGhlIGV4YWN0IHZpcnR1YWwKKyAqCWFkZHJlc3Mgb2YgdGhpcyBhbGxvY2F0ZWQgbWVtb3J5CisgKi8KK3N0YXRpYyBpbnQgc2VwX2FsbG9jYXRlX2RhdGFfcG9vbF9tZW1vcnlfaGFuZGxlcihzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwLAorCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCBlcnJvciA9IDA7CisJc3RydWN0IGFsbG9jX3N0cnVjdCBjb21tYW5kX2FyZ3M7CisKKwkvKiBIb2xkcyB0aGUgYWxsb2NhdGVkIGJ1ZmZlciBhZGRyZXNzIGluIHRoZSBzeXN0ZW0gbWVtb3J5IHBvb2wgKi8KKwl1MzIgKnRva2VuX2FkZHI7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKKwkJInNlcF9hbGxvY2F0ZV9kYXRhX3Bvb2xfbWVtb3J5X2hhbmRsZXIgc3RhcnRcbiIpOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjb21tYW5kX2FyZ3MsICh2b2lkIF9fdXNlciAqKWFyZywKKwkJCQkJc2l6ZW9mKHN0cnVjdCBhbGxvY19zdHJ1Y3QpKSkgeworCQllcnJvciA9IC1FRkFVTFQ7CisJCWdvdG8gZW5kX2Z1bmN0aW9uOworCX0KKworCS8qIEFsbG9jYXRlIG1lbW9yeSAqLworCWlmICgoc2VwLT5kYXRhX3Bvb2xfYnl0ZXNfYWxsb2NhdGVkICsgY29tbWFuZF9hcmdzLm51bV9ieXRlcykgPgorCQlTRVBfRFJJVkVSX0RBVEFfUE9PTF9TSEFSRURfQVJFQV9TSVpFX0lOX0JZVEVTKSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCisJCSJieXRlc19hbGxvY2F0ZWQ6ICV4XG4iLCAoaW50KXNlcC0+ZGF0YV9wb29sX2J5dGVzX2FsbG9jYXRlZCk7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCisJCSJvZmZzZXQ6ICV4XG4iLCBTRVBfRFJJVkVSX0RBVEFfUE9PTF9BUkVBX09GRlNFVF9JTl9CWVRFUyk7CisJLyogU2V0IHRoZSB2aXJ0dWFsIGFuZCBidXMgYWRkcmVzcyAqLworCWNvbW1hbmRfYXJncy5vZmZzZXQgPSBTRVBfRFJJVkVSX0RBVEFfUE9PTF9BUkVBX09GRlNFVF9JTl9CWVRFUyArCisJCXNlcC0+ZGF0YV9wb29sX2J5dGVzX2FsbG9jYXRlZDsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkiY29tbWFuZF9hcmdzLm9mZnNldDogJXhcbiIsIGNvbW1hbmRfYXJncy5vZmZzZXQpOworCisJLyogUGxhY2UgaW4gdGhlIHNoYXJlZCBhcmVhIHRoYXQgaXMga25vd24gYnkgdGhlIFNFUCAqLworCXRva2VuX2FkZHIgPSAodTMyICopKHNlcC0+c2hhcmVkX2FkZHIgKworCQlTRVBfRFJJVkVSX0RBVEFfUE9PTF9BTExPQ0FUSU9OX09GRlNFVF9JTl9CWVRFUyArCisJCShzZXAtPm51bV9vZl9kYXRhX2FsbG9jYXRpb25zKSoyKnNpemVvZih1MzIpKTsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiYWxsb2NhdGlvbiBvZmZzZXQ6ICV4XG4iLAorCQlTRVBfRFJJVkVSX0RBVEFfUE9PTF9BTExPQ0FUSU9OX09GRlNFVF9JTl9CWVRFUyk7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJkYXRhIHBvb2wgdG9rZW4gYWRkciBpcyAlcFxuIiwgdG9rZW5fYWRkcik7CisKKwl0b2tlbl9hZGRyWzBdID0gU0VQX0RBVEFfUE9PTF9QT0lOVEVSU19WQUxfVE9LRU47CisJdG9rZW5fYWRkclsxXSA9ICh1MzIpc2VwLT5zaGFyZWRfYnVzICsKKwkJU0VQX0RSSVZFUl9EQVRBX1BPT0xfQVJFQV9PRkZTRVRfSU5fQllURVMgKworCQlzZXAtPmRhdGFfcG9vbF9ieXRlc19hbGxvY2F0ZWQ7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImRhdGEgcG9vbCB0b2tlbiBbMF0gJXhcbiIsIHRva2VuX2FkZHJbMF0pOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiZGF0YSBwb29sIHRva2VuIFsxXSAleFxuIiwgdG9rZW5fYWRkclsxXSk7CisKKwkvKiBXcml0ZSB0aGUgbWVtb3J5IGJhY2sgdG8gdGhlIHVzZXIgc3BhY2UgKi8KKwllcnJvciA9IGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgKHZvaWQgKikmY29tbWFuZF9hcmdzLAorCQlzaXplb2Yoc3RydWN0IGFsbG9jX3N0cnVjdCkpOworCWlmIChlcnJvcikgeworCQllcnJvciA9IC1FRkFVTFQ7CisJCWdvdG8gZW5kX2Z1bmN0aW9uOworCX0KKworCS8qIFVwZGF0ZSB0aGUgYWxsb2NhdGlvbiAqLworCXNlcC0+ZGF0YV9wb29sX2J5dGVzX2FsbG9jYXRlZCArPSBjb21tYW5kX2FyZ3MubnVtX2J5dGVzOworCXNlcC0+bnVtX29mX2RhdGFfYWxsb2NhdGlvbnMgKz0gMTsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiZGF0YV9hbGxvY2F0aW9ucyAlZFxuIiwKKwkJc2VwLT5udW1fb2ZfZGF0YV9hbGxvY2F0aW9ucyk7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJieXRlcyBhbGxvY2F0ZWQgICVkXG4iLAorCQkoaW50KXNlcC0+ZGF0YV9wb29sX2J5dGVzX2FsbG9jYXRlZCk7CisKK2VuZF9mdW5jdGlvbjoKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9hbGxvY2F0ZV9kYXRhX3Bvb2xfbWVtb3J5X2hhbmRsZXIgZW5kXG4iKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICoJc2VwX2xvY2tfa2VybmVsX3BhZ2VzIC0gbWFwIGtlcm5lbCBwYWdlcyBmb3IgRE1BCisgKglAc2VwOiBwb2ludGVyIHRvIHN0cnVjdCBzZXBfZGV2aWNlCisgKglAa2VybmVsX3ZpcnRfYWRkcjogYWRkcmVzcyBvZiBkYXRhIGJ1ZmZlciBpbiBrZXJuZWwKKyAqCUBkYXRhX3NpemU6IHNpemUgb2YgZGF0YQorICoJQGxsaV9hcnJheV9wdHI6IGxsaSBhcnJheQorICoJQGluX291dF9mbGFnOiBpbnB1dCBpbnRvIGRldmljZSBvciBvdXRwdXQgZnJvbSBkZXZpY2UKKyAqCisgKglUaGlzIGZ1bmN0aW9uIGxvY2tzIGFsbCB0aGUgcGh5c2ljYWwgcGFnZXMgb2YgdGhlIGtlcm5lbCB2aXJ0dWFsIGJ1ZmZlcgorICoJYW5kIGNvbnN0cnVjdCBhIGJhc2ljIGxsaSAgYXJyYXksIHdoZXJlIGVhY2ggZW50cnkgaG9sZHMgdGhlIHBoeXNpY2FsCisgKglwYWdlIGFkZHJlc3MgYW5kIHRoZSBzaXplIHRoYXQgYXBwbGljYXRpb24gZGF0YSBob2xkcyBpbiB0aGlzIHBhZ2UKKyAqCVRoaXMgZnVuY3Rpb24gaXMgdXNlZCBvbmx5IGR1cmluZyBrZXJuZWwgY3J5cHRvIG1vZCBjYWxscyBmcm9tIHdpdGhpbgorICoJdGhlIGtlcm5lbCAod2hlbiBpb2N0bCBpcyBub3QgdXNlZCkKKyAqLworc3RhdGljIGludCBzZXBfbG9ja19rZXJuZWxfcGFnZXMoc3RydWN0IHNlcF9kZXZpY2UgKnNlcCwKKwl1bnNpZ25lZCBsb25nIGtlcm5lbF92aXJ0X2FkZHIsCisJdTMyIGRhdGFfc2l6ZSwKKwlzdHJ1Y3Qgc2VwX2xsaV9lbnRyeSAqKmxsaV9hcnJheV9wdHIsCisJaW50IGluX291dF9mbGFnKQorCit7CisJaW50IGVycm9yID0gMDsKKwkvKiBBcnJheSBvZiBsbGkgKi8KKwlzdHJ1Y3Qgc2VwX2xsaV9lbnRyeSAqbGxpX2FycmF5OworCS8qIE1hcCBhcnJheSAqLworCXN0cnVjdCBzZXBfZG1hX21hcCAqbWFwX2FycmF5OworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfbG9ja19rZXJuZWxfcGFnZXMgc3RhcnRcbiIpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAia2VybmVsX3ZpcnRfYWRkciBpcyAlMDhseFxuIiwKKwkJCQkodW5zaWduZWQgbG9uZylrZXJuZWxfdmlydF9hZGRyKTsKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImRhdGFfc2l6ZSBpcyAleFxuIiwgZGF0YV9zaXplKTsKKworCWxsaV9hcnJheSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXBfbGxpX2VudHJ5KSwgR0ZQX0FUT01JQyk7CisJaWYgKCFsbGlfYXJyYXkpIHsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwl9CisJbWFwX2FycmF5ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNlcF9kbWFfbWFwKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFtYXBfYXJyYXkpIHsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIGVuZF9mdW5jdGlvbl93aXRoX2Vycm9yOworCX0KKworCW1hcF9hcnJheVswXS5kbWFfYWRkciA9CisJCWRtYV9tYXBfc2luZ2xlKCZzZXAtPnBkZXYtPmRldiwgKHZvaWQgKilrZXJuZWxfdmlydF9hZGRyLAorCQlkYXRhX3NpemUsIERNQV9CSURJUkVDVElPTkFMKTsKKwltYXBfYXJyYXlbMF0uc2l6ZSA9IGRhdGFfc2l6ZTsKKworCisJLyoKKwkgKiBTZXQgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIGZpcnN0IHBhZ2UgLSBhcHAgZGF0YSBtYXkgc3RhcnQgbm90IGF0CisJICogdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFnZQorCSAqLworCWxsaV9hcnJheVswXS5idXNfYWRkcmVzcyA9ICh1MzIpbWFwX2FycmF5WzBdLmRtYV9hZGRyOworCWxsaV9hcnJheVswXS5ibG9ja19zaXplID0gbWFwX2FycmF5WzBdLnNpemU7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKKwkibGxpX2FycmF5WzBdLmJ1c19hZGRyZXNzIGlzICUwOGx4LCBsbGlfYXJyYXlbMF0uYmxvY2tfc2l6ZSBpcyAleFxuIiwKKwkJKHVuc2lnbmVkIGxvbmcpbGxpX2FycmF5WzBdLmJ1c19hZGRyZXNzLAorCQlsbGlfYXJyYXlbMF0uYmxvY2tfc2l6ZSk7CisKKwkvKiBTZXQgdGhlIG91dHB1dCBwYXJhbWV0ZXJzICovCisJaWYgKGluX291dF9mbGFnID09IFNFUF9EUklWRVJfSU5fRkxBRykgeworCQkqbGxpX2FycmF5X3B0ciA9IGxsaV9hcnJheTsKKwkJc2VwLT5kbWFfcmVzX2FycltzZXAtPm5yX2RjYl9jcmVhdF0uaW5fbnVtX3BhZ2VzID0gMTsKKwkJc2VwLT5kbWFfcmVzX2FycltzZXAtPm5yX2RjYl9jcmVhdF0uaW5fcGFnZV9hcnJheSA9IE5VTEw7CisJCXNlcC0+ZG1hX3Jlc19hcnJbc2VwLT5ucl9kY2JfY3JlYXRdLmluX21hcF9hcnJheSA9IG1hcF9hcnJheTsKKwkJc2VwLT5kbWFfcmVzX2FycltzZXAtPm5yX2RjYl9jcmVhdF0uaW5fbWFwX251bV9lbnRyaWVzID0gMTsKKwl9IGVsc2UgeworCQkqbGxpX2FycmF5X3B0ciA9IGxsaV9hcnJheTsKKwkJc2VwLT5kbWFfcmVzX2FycltzZXAtPm5yX2RjYl9jcmVhdF0ub3V0X251bV9wYWdlcyA9IDE7CisJCXNlcC0+ZG1hX3Jlc19hcnJbc2VwLT5ucl9kY2JfY3JlYXRdLm91dF9wYWdlX2FycmF5ID0gTlVMTDsKKwkJc2VwLT5kbWFfcmVzX2FycltzZXAtPm5yX2RjYl9jcmVhdF0ub3V0X21hcF9hcnJheSA9IG1hcF9hcnJheTsKKwkJc2VwLT5kbWFfcmVzX2FycltzZXAtPm5yX2RjYl9jcmVhdF0ub3V0X21hcF9udW1fZW50cmllcyA9IDE7CisJfQorCWdvdG8gZW5kX2Z1bmN0aW9uOworCitlbmRfZnVuY3Rpb25fd2l0aF9lcnJvcjoKKwlrZnJlZShsbGlfYXJyYXkpOworCitlbmRfZnVuY3Rpb246CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfbG9ja19rZXJuZWxfcGFnZXMgZW5kXG4iKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICoJc2VwX2xvY2tfdXNlcl9wYWdlcyAtIGxvY2sgYW5kIG1hcCB1c2VyIHBhZ2VzIGZvciBETUEKKyAqCUBzZXA6IHBvaW50ZXIgdG8gc3RydWN0IHNlcF9kZXZpY2UKKyAqCUBhcHBfdmlydF9hZGRyOiB1c2VyIG1lbW9yeSBkYXRhIGJ1ZmZlcgorICoJQGRhdGFfc2l6ZTogc2l6ZSBvZiBkYXRhIGJ1ZmZlcgorICoJQGxsaV9hcnJheV9wdHI6IGxsaSBhcnJheQorICoJQGluX291dF9mbGFnOiBpbnB1dCBvciBvdXRwdXQgdG8gZGV2aWNlCisgKgorICoJVGhpcyBmdW5jdGlvbiBsb2NrcyBhbGwgdGhlIHBoeXNpY2FsIHBhZ2VzIG9mIHRoZSBhcHBsaWNhdGlvbgorICoJdmlydHVhbCBidWZmZXIgYW5kIGNvbnN0cnVjdCBhIGJhc2ljIGxsaSAgYXJyYXksIHdoZXJlIGVhY2ggZW50cnkKKyAqCWhvbGRzIHRoZSBwaHlzaWNhbCBwYWdlIGFkZHJlc3MgYW5kIHRoZSBzaXplIHRoYXQgYXBwbGljYXRpb24KKyAqCWRhdGEgaG9sZHMgaW4gdGhpcyBwaHlzaWNhbCBwYWdlcworICovCitzdGF0aWMgaW50IHNlcF9sb2NrX3VzZXJfcGFnZXMoc3RydWN0IHNlcF9kZXZpY2UgKnNlcCwKKwl1MzIgYXBwX3ZpcnRfYWRkciwKKwl1MzIgZGF0YV9zaXplLAorCXN0cnVjdCBzZXBfbGxpX2VudHJ5ICoqbGxpX2FycmF5X3B0ciwKKwlpbnQgaW5fb3V0X2ZsYWcpCisKK3sKKwlpbnQgZXJyb3IgPSAwOworCXUzMiBjb3VudDsKKwlpbnQgcmVzdWx0OworCS8qIFRoZSB0aGUgcGFnZSBvZiB0aGUgZW5kIGFkZHJlc3Mgb2YgdGhlIHVzZXIgc3BhY2UgYnVmZmVyICovCisJdTMyIGVuZF9wYWdlOworCS8qIFRoZSBwYWdlIG9mIHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSB1c2VyIHNwYWNlIGJ1ZmZlciAqLworCXUzMiBzdGFydF9wYWdlOworCS8qIFRoZSByYW5nZSBpbiBwYWdlcyAqLworCXUzMiBudW1fcGFnZXM7CisJLyogQXJyYXkgb2YgcG9pbnRlcnMgdG8gcGFnZSAqLworCXN0cnVjdCBwYWdlICoqcGFnZV9hcnJheTsKKwkvKiBBcnJheSBvZiBsbGkgKi8KKwlzdHJ1Y3Qgc2VwX2xsaV9lbnRyeSAqbGxpX2FycmF5OworCS8qIE1hcCBhcnJheSAqLworCXN0cnVjdCBzZXBfZG1hX21hcCAqbWFwX2FycmF5OworCS8qIERpcmVjdGlvbiBvZiB0aGUgRE1BIG1hcHBpbmcgZm9yIGxvY2tlZCBwYWdlcyAqLworCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uCWRpcjsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX2xvY2tfdXNlcl9wYWdlcyBzdGFydFxuIik7CisKKwkvKiBTZXQgc3RhcnQgYW5kIGVuZCBwYWdlcyAgYW5kIG51bSBwYWdlcyAqLworCWVuZF9wYWdlID0gKGFwcF92aXJ0X2FkZHIgKyBkYXRhX3NpemUgLSAxKSA+PiBQQUdFX1NISUZUOworCXN0YXJ0X3BhZ2UgPSBhcHBfdmlydF9hZGRyID4+IFBBR0VfU0hJRlQ7CisJbnVtX3BhZ2VzID0gZW5kX3BhZ2UgLSBzdGFydF9wYWdlICsgMTsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiYXBwX3ZpcnRfYWRkciBpcyAleFxuIiwgYXBwX3ZpcnRfYWRkcik7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJkYXRhX3NpemUgaXMgJXhcbiIsIGRhdGFfc2l6ZSk7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzdGFydF9wYWdlIGlzICV4XG4iLCBzdGFydF9wYWdlKTsKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImVuZF9wYWdlIGlzICV4XG4iLCBlbmRfcGFnZSk7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJudW1fcGFnZXMgaXMgJXhcbiIsIG51bV9wYWdlcyk7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInN0YXJ0aW5nIHBhZ2VfYXJyYXkgbWFsbG9jXG4iKTsKKworCS8qIEFsbG9jYXRlIGFycmF5IG9mIHBhZ2VzIHN0cnVjdHVyZSBwb2ludGVycyAqLworCXBhZ2VfYXJyYXkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGFnZSAqKSAqIG51bV9wYWdlcywgR0ZQX0FUT01JQyk7CisJaWYgKCFwYWdlX2FycmF5KSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCW1hcF9hcnJheSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXBfZG1hX21hcCkgKiBudW1fcGFnZXMsIEdGUF9BVE9NSUMpOworCWlmICghbWFwX2FycmF5KSB7CisJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwgImttYWxsb2MgZm9yIG1hcF9hcnJheSBmYWlsZWRcbiIpOworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gZW5kX2Z1bmN0aW9uX3dpdGhfZXJyb3IxOworCX0KKworCWxsaV9hcnJheSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXBfbGxpX2VudHJ5KSAqIG51bV9wYWdlcywKKwkJR0ZQX0FUT01JQyk7CisKKwlpZiAoIWxsaV9hcnJheSkgeworCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsICJrbWFsbG9jIGZvciBsbGlfYXJyYXkgZmFpbGVkXG4iKTsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIGVuZF9mdW5jdGlvbl93aXRoX2Vycm9yMjsKKwl9CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInN0YXJ0aW5nIGdldF91c2VyX3BhZ2VzXG4iKTsKKworCS8qIENvbnZlcnQgdGhlIGFwcGxpY2F0aW9uIHZpcnR1YWwgYWRkcmVzcyBpbnRvIGEgc2V0IG9mIHBoeXNpY2FsICovCisJZG93bl9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCXJlc3VsdCA9IGdldF91c2VyX3BhZ2VzKGN1cnJlbnQsIGN1cnJlbnQtPm1tLCBhcHBfdmlydF9hZGRyLAorCQludW1fcGFnZXMsCisJCSgoaW5fb3V0X2ZsYWcgPT0gU0VQX0RSSVZFUl9JTl9GTEFHKSA/IDAgOiAxKSwKKwkJMCwgcGFnZV9hcnJheSwgTlVMTCk7CisKKwl1cF9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCisJLyogQ2hlY2sgdGhlIG51bWJlciBvZiBwYWdlcyBsb2NrZWQgLSBpZiBub3QgYWxsIHRoZW4gZXhpdCB3aXRoIGVycm9yICovCisJaWYgKHJlc3VsdCAhPSBudW1fcGFnZXMpIHsKKwkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LAorCQkJIm5vdCBhbGwgcGFnZXMgbG9ja2VkIGJ5IGdldF91c2VyX3BhZ2VzXG4iKTsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIGVuZF9mdW5jdGlvbl93aXRoX2Vycm9yMzsKKwl9CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImdldF91c2VyX3BhZ2VzIHN1Y2NlZWRlZFxuIik7CisKKwkvKiBTZXQgZGlyZWN0aW9uICovCisJaWYgKGluX291dF9mbGFnID09IFNFUF9EUklWRVJfSU5fRkxBRykKKwkJZGlyID0gRE1BX1RPX0RFVklDRTsKKwllbHNlCisJCWRpciA9IERNQV9GUk9NX0RFVklDRTsKKworCS8qCisJICogRmlsbCB0aGUgYXJyYXkgdXNpbmcgcGFnZSBhcnJheSBkYXRhIGFuZAorCSAqIG1hcCB0aGUgcGFnZXMgLSB0aGlzIGFjdGlvbiB3aWxsIGFsc28gZmx1c2ggdGhlIGNhY2hlIGFzIG5lZWRlZAorCSAqLworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IG51bV9wYWdlczsgY291bnQrKykgeworCQkvKiBGaWxsIHRoZSBtYXAgYXJyYXkgKi8KKwkJbWFwX2FycmF5W2NvdW50XS5kbWFfYWRkciA9CisJCQlkbWFfbWFwX3BhZ2UoJnNlcC0+cGRldi0+ZGV2LCBwYWdlX2FycmF5W2NvdW50XSwKKwkJCTAsIFBBR0VfU0laRSwgLypkaXIqL0RNQV9CSURJUkVDVElPTkFMKTsKKworCQltYXBfYXJyYXlbY291bnRdLnNpemUgPSBQQUdFX1NJWkU7CisKKwkJLyogRmlsbCB0aGUgbGxpIGFycmF5IGVudHJ5ICovCisJCWxsaV9hcnJheVtjb3VudF0uYnVzX2FkZHJlc3MgPSAodTMyKW1hcF9hcnJheVtjb3VudF0uZG1hX2FkZHI7CisJCWxsaV9hcnJheVtjb3VudF0uYmxvY2tfc2l6ZSA9IFBBR0VfU0laRTsKKworCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsICJsbGlfYXJyYXlbJXhdLmJ1c19hZGRyZXNzIGlzICUwOGx4LCBsbGlfYXJyYXlbJXhdLmJsb2NrX3NpemUgaXMgJXhcbiIsCisJCQljb3VudCwgKHVuc2lnbmVkIGxvbmcpbGxpX2FycmF5W2NvdW50XS5idXNfYWRkcmVzcywKKwkJCWNvdW50LCBsbGlfYXJyYXlbY291bnRdLmJsb2NrX3NpemUpOworCX0KKworCS8qIENoZWNrIHRoZSBvZmZzZXQgZm9yIHRoZSBmaXJzdCBwYWdlICovCisJbGxpX2FycmF5WzBdLmJ1c19hZGRyZXNzID0KKwkJbGxpX2FycmF5WzBdLmJ1c19hZGRyZXNzICsgKGFwcF92aXJ0X2FkZHIgJiAoflBBR0VfTUFTSykpOworCisJLyogQ2hlY2sgdGhhdCBub3QgYWxsIHRoZSBkYXRhIGlzIGluIHRoZSBmaXJzdCBwYWdlIG9ubHkgKi8KKwlpZiAoKFBBR0VfU0laRSAtIChhcHBfdmlydF9hZGRyICYgKH5QQUdFX01BU0spKSkgPj0gZGF0YV9zaXplKQorCQlsbGlfYXJyYXlbMF0uYmxvY2tfc2l6ZSA9IGRhdGFfc2l6ZTsKKwllbHNlCisJCWxsaV9hcnJheVswXS5ibG9ja19zaXplID0KKwkJCVBBR0VfU0laRSAtIChhcHBfdmlydF9hZGRyICYgKH5QQUdFX01BU0spKTsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkibGxpX2FycmF5WzBdLmJ1c19hZGRyZXNzIGlzICUwOGx4LCBsbGlfYXJyYXlbMF0uYmxvY2tfc2l6ZSBpcyAleFxuIiwKKwkJKHVuc2lnbmVkIGxvbmcpbGxpX2FycmF5W2NvdW50XS5idXNfYWRkcmVzcywKKwkJbGxpX2FycmF5W2NvdW50XS5ibG9ja19zaXplKTsKKworCS8qIENoZWNrIHRoZSBzaXplIG9mIHRoZSBsYXN0IHBhZ2UgKi8KKwlpZiAobnVtX3BhZ2VzID4gMSkgeworCQlsbGlfYXJyYXlbbnVtX3BhZ2VzIC0gMV0uYmxvY2tfc2l6ZSA9CisJCQkoYXBwX3ZpcnRfYWRkciArIGRhdGFfc2l6ZSkgJiAoflBBR0VfTUFTSyk7CisKKwkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LAorCQkJImxsaV9hcnJheVsleF0uYnVzX2FkZHJlc3MgaXMgJTA4bHgsIGxsaV9hcnJheVsleF0uYmxvY2tfc2l6ZSBpcyAleFxuIiwKKwkJCW51bV9wYWdlcyAtIDEsCisJCQkodW5zaWduZWQgbG9uZylsbGlfYXJyYXlbY291bnRdLmJ1c19hZGRyZXNzLAorCQkJbnVtX3BhZ2VzIC0gMSwKKwkJCWxsaV9hcnJheVtjb3VudF0uYmxvY2tfc2l6ZSk7CisJfQorCisJLyogU2V0IG91dHB1dCBwYXJhbXMgYWNvcmRpbmcgdG8gdGhlIGluX291dCBmbGFnICovCisJaWYgKGluX291dF9mbGFnID09IFNFUF9EUklWRVJfSU5fRkxBRykgeworCQkqbGxpX2FycmF5X3B0ciA9IGxsaV9hcnJheTsKKwkJc2VwLT5kbWFfcmVzX2FycltzZXAtPm5yX2RjYl9jcmVhdF0uaW5fbnVtX3BhZ2VzID0gbnVtX3BhZ2VzOworCQlzZXAtPmRtYV9yZXNfYXJyW3NlcC0+bnJfZGNiX2NyZWF0XS5pbl9wYWdlX2FycmF5ID0gcGFnZV9hcnJheTsKKwkJc2VwLT5kbWFfcmVzX2FycltzZXAtPm5yX2RjYl9jcmVhdF0uaW5fbWFwX2FycmF5ID0gbWFwX2FycmF5OworCQlzZXAtPmRtYV9yZXNfYXJyW3NlcC0+bnJfZGNiX2NyZWF0XS5pbl9tYXBfbnVtX2VudHJpZXMgPQorCQkJCQkJCQludW1fcGFnZXM7CisJfSBlbHNlIHsKKwkJKmxsaV9hcnJheV9wdHIgPSBsbGlfYXJyYXk7CisJCXNlcC0+ZG1hX3Jlc19hcnJbc2VwLT5ucl9kY2JfY3JlYXRdLm91dF9udW1fcGFnZXMgPSBudW1fcGFnZXM7CisJCXNlcC0+ZG1hX3Jlc19hcnJbc2VwLT5ucl9kY2JfY3JlYXRdLm91dF9wYWdlX2FycmF5ID0KKwkJCQkJCQkJcGFnZV9hcnJheTsKKwkJc2VwLT5kbWFfcmVzX2FycltzZXAtPm5yX2RjYl9jcmVhdF0ub3V0X21hcF9hcnJheSA9IG1hcF9hcnJheTsKKwkJc2VwLT5kbWFfcmVzX2FycltzZXAtPm5yX2RjYl9jcmVhdF0ub3V0X21hcF9udW1fZW50cmllcyA9CisJCQkJCQkJCW51bV9wYWdlczsKKwl9CisJZ290byBlbmRfZnVuY3Rpb247CisKK2VuZF9mdW5jdGlvbl93aXRoX2Vycm9yMzoKKwkvKiBGcmVlIGxsaSBhcnJheSAqLworCWtmcmVlKGxsaV9hcnJheSk7CisKK2VuZF9mdW5jdGlvbl93aXRoX2Vycm9yMjoKKwlrZnJlZShtYXBfYXJyYXkpOworCitlbmRfZnVuY3Rpb25fd2l0aF9lcnJvcjE6CisJLyogRnJlZSBwYWdlIGFycmF5ICovCisJa2ZyZWUocGFnZV9hcnJheSk7CisKK2VuZF9mdW5jdGlvbjoKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9sb2NrX3VzZXJfcGFnZXMgZW5kXG4iKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICoJdTMyIHNlcF9jYWxjdWxhdGVfbGxpX3RhYmxlX21heF9zaXplIC0gc2l6ZSB0aGUgTExJIHRhYmxlCisgKglAc2VwOiBwb2ludGVyIHRvIHN0cnVjdCBzZXBfZGV2aWNlCisgKglAbGxpX2luX2FycmF5X3B0cgorICoJQG51bV9hcnJheV9lbnRyaWVzCisgKglAbGFzdF90YWJsZV9mbGFnCisgKgorICoJVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBzaXplIG9mIGRhdGEgdGhhdCBjYW4gYmUgaW5zZXJ0ZWQgaW50bworICoJdGhlIGxsaSB0YWJsZSBmcm9tIHRoaXMgYXJyYXksIHN1Y2ggdGhhdCBlaXRoZXIgdGhlIHRhYmxlIGlzIGZ1bGwKKyAqCShhbGwgZW50cmllcyBhcmUgZW50ZXJlZCksIG9yIHRoZXJlIGFyZSBubyBtb3JlIGVudHJpZXMgaW4gdGhlCisgKglsbGkgYXJyYXkKKyAqLworc3RhdGljIHUzMiBzZXBfY2FsY3VsYXRlX2xsaV90YWJsZV9tYXhfc2l6ZShzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwLAorCXN0cnVjdCBzZXBfbGxpX2VudHJ5ICpsbGlfaW5fYXJyYXlfcHRyLAorCXUzMiBudW1fYXJyYXlfZW50cmllcywKKwl1MzIgKmxhc3RfdGFibGVfZmxhZykKK3sKKwl1MzIgY291bnRlcjsKKwkvKiBUYWJsZSBkYXRhIHNpemUgKi8KKwl1MzIgdGFibGVfZGF0YV9zaXplID0gMDsKKwkvKiBEYXRhIHNpemUgZm9yIHRoZSBuZXh0IHRhYmxlICovCisJdTMyIG5leHRfdGFibGVfZGF0YV9zaXplOworCisJKmxhc3RfdGFibGVfZmxhZyA9IDA7CisKKwkvKgorCSAqIENhbGN1bGF0ZSB0aGUgZGF0YSBpbiB0aGUgb3V0IGxsaSB0YWJsZSB0aWxsIHdlIGZpbGwgdGhlIHdob2xlCisJICogdGFibGUgb3IgdGlsbCB0aGUgZGF0YSBoYXMgZW5kZWQKKwkgKi8KKwlmb3IgKGNvdW50ZXIgPSAwOworCQkoY291bnRlciA8IChTRVBfRFJJVkVSX0VOVFJJRVNfUEVSX1RBQkxFX0lOX1NFUCAtIDEpKSAmJgorCQkJKGNvdW50ZXIgPCBudW1fYXJyYXlfZW50cmllcyk7IGNvdW50ZXIrKykKKwkJdGFibGVfZGF0YV9zaXplICs9IGxsaV9pbl9hcnJheV9wdHJbY291bnRlcl0uYmxvY2tfc2l6ZTsKKworCS8qCisJICogQ2hlY2sgaWYgd2UgcmVhY2hlZCB0aGUgbGFzdCBlbnRyeSwKKwkgKiBtZWFuaW5nIHRoaXMgaWEgdGhlIGxhc3QgdGFibGUgdG8gYnVpbGQsCisJICogYW5kIG5vIG5lZWQgdG8gY2hlY2sgdGhlIGJsb2NrIGFsaWdubWVudAorCSAqLworCWlmIChjb3VudGVyID09IG51bV9hcnJheV9lbnRyaWVzKSB7CisJCS8qIFNldCB0aGUgbGFzdCB0YWJsZSBmbGFnICovCisJCSpsYXN0X3RhYmxlX2ZsYWcgPSAxOworCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwl9CisKKwkvKgorCSAqIENhbGN1bGF0ZSB0aGUgZGF0YSBzaXplIG9mIHRoZSBuZXh0IHRhYmxlLgorCSAqIFN0b3AgaWYgbm8gZW50cmllcyBsZWZ0IG9yIGlmIGRhdGEgc2l6ZSBpcyBtb3JlIHRoZSBETUEgcmVzdHJpY3Rpb24KKwkgKi8KKwluZXh0X3RhYmxlX2RhdGFfc2l6ZSA9IDA7CisJZm9yICg7IGNvdW50ZXIgPCBudW1fYXJyYXlfZW50cmllczsgY291bnRlcisrKSB7CisJCW5leHRfdGFibGVfZGF0YV9zaXplICs9IGxsaV9pbl9hcnJheV9wdHJbY291bnRlcl0uYmxvY2tfc2l6ZTsKKwkJaWYgKG5leHRfdGFibGVfZGF0YV9zaXplID49IFNFUF9EUklWRVJfTUlOX0RBVEFfU0laRV9QRVJfVEFCTEUpCisJCQlicmVhazsKKwl9CisKKwkvKgorCSAqIENoZWNrIGlmIHRoZSBuZXh0IHRhYmxlIGRhdGEgc2l6ZSBpcyBsZXNzIHRoZW4gRE1BIHJzdHJpY3Rpb24uCisJICogaWYgaXQgaXMgLSByZWNhbGN1bGF0ZSB0aGUgY3VycmVudCB0YWJsZSBzaXplLCBzbyB0aGF0IHRoZSBuZXh0CisJICogdGFibGUgZGF0YSBzaXplIHdpbGwgYmUgYWRhcXVldGUgZm9yIERNQQorCSAqLworCWlmIChuZXh0X3RhYmxlX2RhdGFfc2l6ZSAmJgorCQluZXh0X3RhYmxlX2RhdGFfc2l6ZSA8IFNFUF9EUklWRVJfTUlOX0RBVEFfU0laRV9QRVJfVEFCTEUpCisKKwkJdGFibGVfZGF0YV9zaXplIC09IChTRVBfRFJJVkVSX01JTl9EQVRBX1NJWkVfUEVSX1RBQkxFIC0KKwkJCW5leHRfdGFibGVfZGF0YV9zaXplKTsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAidGFibGUgZGF0YSBzaXplIGlzICV4XG4iLAorCQkJCQkJCXRhYmxlX2RhdGFfc2l6ZSk7CitlbmRfZnVuY3Rpb246CisJcmV0dXJuIHRhYmxlX2RhdGFfc2l6ZTsKK30KKworLyoqCisgKglzZXBfYnVpbGRfbGxpX3RhYmxlIC0gYnVpbGQgYW4gbGxpIGFycmF5IGZvciB0aGUgZ2l2ZW4gdGFibGUKKyAqCUBzZXA6IHBvaW50ZXIgdG8gc3RydWN0IHNlcF9kZXZpY2UKKyAqCUBsbGlfYXJyYXlfcHRyOiBwb2ludGVyIHRvIGxsaSBhcnJheQorICoJQGxsaV90YWJsZV9wdHI6IHBvaW50ZXIgdG8gbGxpIHRhYmxlCisgKglAbnVtX3Byb2Nlc3NlZF9lbnRyaWVzX3B0cjogcG9pbnRlciB0byBudW1iZXIgb2YgZW50cmllcworICoJQG51bV90YWJsZV9lbnRyaWVzX3B0cjogcG9pbnRlciB0byBudW1iZXIgb2YgdGFibGVzCisgKglAdGFibGVfZGF0YV9zaXplOiB0b3RhbCBkYXRhIHNpemUKKyAqCisgKglCdWlsZHMgYW50IGxsaSB0YWJsZSBmcm9tIHRoZSBsbGlfYXJyYXkgYWNjb3JkaW5nIHRvCisgKgl0aGUgZ2l2ZW4gc2l6ZSBvZiBkYXRhCisgKi8KK3N0YXRpYyB2b2lkIHNlcF9idWlsZF9sbGlfdGFibGUoc3RydWN0IHNlcF9kZXZpY2UgKnNlcCwKKwlzdHJ1Y3Qgc2VwX2xsaV9lbnRyeQkqbGxpX2FycmF5X3B0ciwKKwlzdHJ1Y3Qgc2VwX2xsaV9lbnRyeQkqbGxpX3RhYmxlX3B0ciwKKwl1MzIgKm51bV9wcm9jZXNzZWRfZW50cmllc19wdHIsCisJdTMyICpudW1fdGFibGVfZW50cmllc19wdHIsCisJdTMyIHRhYmxlX2RhdGFfc2l6ZSkKK3sKKwkvKiBDdXJyZW50IHRhYmxlIGRhdGEgc2l6ZSAqLworCXUzMiBjdXJyX3RhYmxlX2RhdGFfc2l6ZTsKKwkvKiBDb3VudGVyIG9mIGxsaSBhcnJheSBlbnRyeSAqLworCXUzMiBhcnJheV9jb3VudGVyOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfYnVpbGRfbGxpX3RhYmxlIHN0YXJ0XG4iKTsKKworCS8qIEluaXQgY3VycnJlbnQgdGFibGUgZGF0YSBzaXplIGFuZCBsbGkgYXJyYXkgZW50cnkgY291bnRlciAqLworCWN1cnJfdGFibGVfZGF0YV9zaXplID0gMDsKKwlhcnJheV9jb3VudGVyID0gMDsKKwkqbnVtX3RhYmxlX2VudHJpZXNfcHRyID0gMTsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAidGFibGVfZGF0YV9zaXplIGlzICV4XG4iLCB0YWJsZV9kYXRhX3NpemUpOworCisJLyogRmlsbCB0aGUgdGFibGUgdGlsbCB0YWJsZSBzaXplIHJlYWNoZXMgdGhlIG5lZWRlZCBhbW91bnQgKi8KKwl3aGlsZSAoY3Vycl90YWJsZV9kYXRhX3NpemUgPCB0YWJsZV9kYXRhX3NpemUpIHsKKwkJLyogVXBkYXRlIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0YWJsZSAqLworCQkoKm51bV90YWJsZV9lbnRyaWVzX3B0cikrKzsKKworCQlsbGlfdGFibGVfcHRyLT5idXNfYWRkcmVzcyA9CisJCQljcHVfdG9fbGUzMihsbGlfYXJyYXlfcHRyW2FycmF5X2NvdW50ZXJdLmJ1c19hZGRyZXNzKTsKKworCQlsbGlfdGFibGVfcHRyLT5ibG9ja19zaXplID0KKwkJCWNwdV90b19sZTMyKGxsaV9hcnJheV9wdHJbYXJyYXlfY291bnRlcl0uYmxvY2tfc2l6ZSk7CisKKwkJY3Vycl90YWJsZV9kYXRhX3NpemUgKz0gbGxpX2FycmF5X3B0clthcnJheV9jb3VudGVyXS5ibG9ja19zaXplOworCisJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAibGxpX3RhYmxlX3B0ciBpcyAlcFxuIiwKKwkJCQkJCQkJbGxpX3RhYmxlX3B0cik7CisJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAibGxpX3RhYmxlX3B0ci0+YnVzX2FkZHJlc3MgaXMgJTA4bHhcbiIsCisJCQkJKHVuc2lnbmVkIGxvbmcpbGxpX3RhYmxlX3B0ci0+YnVzX2FkZHJlc3MpOworCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImxsaV90YWJsZV9wdHItPmJsb2NrX3NpemUgaXMgJXhcbiIsCisJCQlsbGlfdGFibGVfcHRyLT5ibG9ja19zaXplKTsKKworCQkvKiBDaGVjayBmb3Igb3ZlcmZsb3cgb2YgdGhlIHRhYmxlIGRhdGEgKi8KKwkJaWYgKGN1cnJfdGFibGVfZGF0YV9zaXplID4gdGFibGVfZGF0YV9zaXplKSB7CisJCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKKwkJCQkiY3Vycl90YWJsZV9kYXRhX3NpemUgdG9vIGxhcmdlXG4iKTsKKworCQkJLyogVXBkYXRlIHRoZSBzaXplIG9mIGJsb2NrIGluIHRoZSB0YWJsZSAqLworCQkJbGxpX3RhYmxlX3B0ci0+YmxvY2tfc2l6ZSAtPQorCQkJY3B1X3RvX2xlMzIoKGN1cnJfdGFibGVfZGF0YV9zaXplIC0gdGFibGVfZGF0YV9zaXplKSk7CisKKwkJCS8qIFVwZGF0ZSB0aGUgcGh5c2ljYWwgYWRkcmVzcyBpbiB0aGUgbGxpIGFycmF5ICovCisJCQlsbGlfYXJyYXlfcHRyW2FycmF5X2NvdW50ZXJdLmJ1c19hZGRyZXNzICs9CisJCQljcHVfdG9fbGUzMihsbGlfdGFibGVfcHRyLT5ibG9ja19zaXplKTsKKworCQkJLyogVXBkYXRlIHRoZSBibG9jayBzaXplIGxlZnQgaW4gdGhlIGxsaSBhcnJheSAqLworCQkJbGxpX2FycmF5X3B0clthcnJheV9jb3VudGVyXS5ibG9ja19zaXplID0KKwkJCQkoY3Vycl90YWJsZV9kYXRhX3NpemUgLSB0YWJsZV9kYXRhX3NpemUpOworCQl9IGVsc2UKKwkJCS8qIEFkdmFuY2UgdG8gdGhlIG5leHQgZW50cnkgaW4gdGhlIGxsaV9hcnJheSAqLworCQkJYXJyYXlfY291bnRlcisrOworCisJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkJImxsaV90YWJsZV9wdHItPmJ1c19hZGRyZXNzIGlzICUwOGx4XG4iLAorCQkJCSh1bnNpZ25lZCBsb25nKWxsaV90YWJsZV9wdHItPmJ1c19hZGRyZXNzKTsKKwkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCisJCQkibGxpX3RhYmxlX3B0ci0+YmxvY2tfc2l6ZSBpcyAleFxuIiwKKwkJCWxsaV90YWJsZV9wdHItPmJsb2NrX3NpemUpOworCisJCS8qIE1vdmUgdG8gdGhlIG5leHQgZW50cnkgaW4gdGFibGUgKi8KKwkJbGxpX3RhYmxlX3B0cisrOworCX0KKworCS8qIFNldCB0aGUgaW5mbyBlbnRyeSB0byBkZWZhdWx0ICovCisJbGxpX3RhYmxlX3B0ci0+YnVzX2FkZHJlc3MgPSAweGZmZmZmZmZmOworCWxsaV90YWJsZV9wdHItPmJsb2NrX3NpemUgPSAwOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJsbGlfdGFibGVfcHRyIGlzICVwXG4iLCBsbGlfdGFibGVfcHRyKTsKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImxsaV90YWJsZV9wdHItPmJ1c19hZGRyZXNzIGlzICUwOGx4XG4iLAorCQkJCSh1bnNpZ25lZCBsb25nKWxsaV90YWJsZV9wdHItPmJ1c19hZGRyZXNzKTsKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImxsaV90YWJsZV9wdHItPmJsb2NrX3NpemUgaXMgJXhcbiIsCisJCQkJCQlsbGlfdGFibGVfcHRyLT5ibG9ja19zaXplKTsKKworCS8qIFNldCB0aGUgb3V0cHV0IHBhcmFtZXRlciAqLworCSpudW1fcHJvY2Vzc2VkX2VudHJpZXNfcHRyICs9IGFycmF5X2NvdW50ZXI7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgIm51bV9wcm9jZXNzZWRfZW50cmllc19wdHIgaXMgJXhcbiIsCisJCSpudW1fcHJvY2Vzc2VkX2VudHJpZXNfcHRyKTsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX2J1aWxkX2xsaV90YWJsZSBlbmRcbiIpOworfQorCisvKioKKyAqCXNlcF9zaGFyZWRfYXJlYV92aXJ0X3RvX2J1cyAtIG1hcCBzaGFyZWQgYXJlYSB0byBidXMgYWRkcmVzcworICoJQHNlcDogcG9pbnRlciB0byBzdHJ1Y3Qgc2VwX2RldmljZQorICoJQHZpcnRfYWRkcmVzczogdmlydHVhbCBhZGRyZXNzIHRvIGNvbnZlcnQKKyAqCisgKglUaGlzIGZ1bmN0aW9ucyByZXR1cm5zIHRoZSBwaHlzaWNhbCBhZGRyZXNzIGluc2lkZSBzaGFyZWQgYXJlYSBhY2NvcmRpbmcKKyAqCXRvIHRoZSB2aXJ0dWFsIGFkZHJlc3MuIEl0IGNhbiBiZSBlaXRoZXIgb24gdGhlIGV4dGVybmEgUkFNIGRldmljZQorICoJKGlvcmVtYXBwZWQpLCBvciBvbiB0aGUgc3lzdGVtIFJBTQorICoJVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBmb3IgdGhlIGV4dGVybmFsIFJBTQorICovCitzdGF0aWMgZG1hX2FkZHJfdCBzZXBfc2hhcmVkX2FyZWFfdmlydF90b19idXMoc3RydWN0IHNlcF9kZXZpY2UgKnNlcCwKKwl2b2lkICp2aXJ0X2FkZHJlc3MpCit7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzaCB2aXJ0IHRvIHBoeXMgdiAlcFxuIiwgdmlydF9hZGRyZXNzKTsKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNoIHZpcnQgdG8gcGh5cyBwICUwOGx4XG4iLAorCQkodW5zaWduZWQgbG9uZykKKwkJc2VwLT5zaGFyZWRfYnVzICsgKHZpcnRfYWRkcmVzcyAtIHNlcC0+c2hhcmVkX2FkZHIpKTsKKworCXJldHVybiBzZXAtPnNoYXJlZF9idXMgKyAoc2l6ZV90KSh2aXJ0X2FkZHJlc3MgLSBzZXAtPnNoYXJlZF9hZGRyKTsKK30KKworLyoqCisgKglzZXBfc2hhcmVkX2FyZWFfYnVzX3RvX3ZpcnQgLSBtYXAgc2hhcmVkIGFyZWEgYnVzIGFkZHJlc3MgdG8ga2VybmVsCisgKglAc2VwOiBwb2ludGVyIHRvIHN0cnVjdCBzZXBfZGV2aWNlCisgKglAYnVzX2FkZHJlc3M6IGJ1cyBhZGRyZXNzIHRvIGNvbnZlcnQKKyAqCisgKglUaGlzIGZ1bmN0aW9ucyByZXR1cm5zIHRoZSB2aXJ0dWFsIGFkZHJlc3MgaW5zaWRlIHNoYXJlZCBhcmVhCisgKglhY2NvcmRpbmcgdG8gdGhlIHBoeXNpY2FsIGFkZHJlc3MuIEl0IGNhbiBiZSBlaXRoZXIgb24gdGhlCisgKglleHRlcm5hIFJBTSBkZXZpY2UgKGlvcmVtYXBwZWQpLCBvciBvbiB0aGUgc3lzdGVtIFJBTQorICoJVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBmb3IgdGhlIGV4dGVybmFsIFJBTQorICovCitzdGF0aWMgdm9pZCAqc2VwX3NoYXJlZF9hcmVhX2J1c190b192aXJ0KHN0cnVjdCBzZXBfZGV2aWNlICpzZXAsCisJZG1hX2FkZHJfdCBidXNfYWRkcmVzcykKK3sKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNoYXJlZCBidXMgdG8gdmlydCBiPSVseCB2PSVseFxuIiwKKwkJKHVuc2lnbmVkIGxvbmcpYnVzX2FkZHJlc3MsICh1bnNpZ25lZCBsb25nKShzZXAtPnNoYXJlZF9hZGRyICsKKwkJCShzaXplX3QpKGJ1c19hZGRyZXNzIC0gc2VwLT5zaGFyZWRfYnVzKSkpOworCisJcmV0dXJuIHNlcC0+c2hhcmVkX2FkZHIJKyAoc2l6ZV90KShidXNfYWRkcmVzcyAtIHNlcC0+c2hhcmVkX2J1cyk7Cit9CisKKy8qKgorICoJc2VwX2RlYnVnX3ByaW50X2xsaV90YWJsZXMgLSBkdW1wIExMSSB0YWJsZQorICoJQHNlcDogcG9pbnRlciB0byBzdHJ1Y3Qgc2VwX2RldmljZQorICoJQGxsaV90YWJsZV9wdHI6IHBvaW50ZXIgdG8gc2VwX2xsaV9lbnRyeQorICoJQG51bV90YWJsZV9lbnRyaWVzOiBudW1iZXIgb2YgZW50cmllcworICoJQHRhYmxlX2RhdGFfc2l6ZTogdG90YWwgZGF0YSBzaXplCisgKgorICoJV2FsayB0aGUgdGhlIGxpc3Qgb2YgdGhlIHByaW50IGNyZWF0ZWQgdGFibGVzIGFuZCBwcmludCBhbGwgdGhlIGRhdGEKKyAqLworc3RhdGljIHZvaWQgc2VwX2RlYnVnX3ByaW50X2xsaV90YWJsZXMoc3RydWN0IHNlcF9kZXZpY2UgKnNlcCwKKwlzdHJ1Y3Qgc2VwX2xsaV9lbnRyeSAqbGxpX3RhYmxlX3B0ciwKKwl1bnNpZ25lZCBsb25nIG51bV90YWJsZV9lbnRyaWVzLAorCXVuc2lnbmVkIGxvbmcgdGFibGVfZGF0YV9zaXplKQoreworCXVuc2lnbmVkIGxvbmcgdGFibGVfY291bnQgPSAxOworCXVuc2lnbmVkIGxvbmcgZW50cmllc19jb3VudCA9IDA7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9kZWJ1Z19wcmludF9sbGlfdGFibGVzIHN0YXJ0XG4iKTsKKworCXdoaWxlICgodW5zaWduZWQgbG9uZykgbGxpX3RhYmxlX3B0ci0+YnVzX2FkZHJlc3MgIT0gMHhmZmZmZmZmZikgeworCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKKwkJCSJsbGkgdGFibGUgJTA4bHgsIHRhYmxlX2RhdGFfc2l6ZSBpcyAlbHVcbiIsCisJCQl0YWJsZV9jb3VudCwgdGFibGVfZGF0YV9zaXplKTsKKwkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJudW1fdGFibGVfZW50cmllcyBpcyAlbHVcbiIsCisJCQkJCQkJbnVtX3RhYmxlX2VudHJpZXMpOworCisJCS8qIFByaW50IGVudHJpZXMgb2YgdGhlIHRhYmxlICh3aXRob3V0IGluZm8gZW50cnkpICovCisJCWZvciAoZW50cmllc19jb3VudCA9IDA7IGVudHJpZXNfY291bnQgPCBudW1fdGFibGVfZW50cmllczsKKwkJCWVudHJpZXNfY291bnQrKywgbGxpX3RhYmxlX3B0cisrKSB7CisKKwkJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkJCSJsbGlfdGFibGVfcHRyIGFkZHJlc3MgaXMgJTA4bHhcbiIsCisJCQkJKHVuc2lnbmVkIGxvbmcpIGxsaV90YWJsZV9wdHIpOworCisJCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKKwkJCQkicGh5cyBhZGRyZXNzIGlzICUwOGx4IGJsb2NrIHNpemUgaXMgJXhcbiIsCisJCQkJKHVuc2lnbmVkIGxvbmcpbGxpX3RhYmxlX3B0ci0+YnVzX2FkZHJlc3MsCisJCQkJbGxpX3RhYmxlX3B0ci0+YmxvY2tfc2l6ZSk7CisJCX0KKwkJLyogUG9pbnQgdG8gdGhlIGluZm8gZW50cnkgKi8KKwkJbGxpX3RhYmxlX3B0ci0tOworCisJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkJInBoeXMgbGxpX3RhYmxlX3B0ci0+YmxvY2tfc2l6ZSBpcyAleFxuIiwKKwkJCWxsaV90YWJsZV9wdHItPmJsb2NrX3NpemUpOworCisJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkJInBoeXMgbGxpX3RhYmxlX3B0ci0+cGh5c2ljYWxfYWRkcmVzcyBpcyAlMDhsdVxuIiwKKwkJCSh1bnNpZ25lZCBsb25nKWxsaV90YWJsZV9wdHItPmJ1c19hZGRyZXNzKTsKKworCisJCXRhYmxlX2RhdGFfc2l6ZSA9IGxsaV90YWJsZV9wdHItPmJsb2NrX3NpemUgJiAweGZmZmZmZjsKKwkJbnVtX3RhYmxlX2VudHJpZXMgPSAobGxpX3RhYmxlX3B0ci0+YmxvY2tfc2l6ZSA+PiAyNCkgJiAweGZmOworCisJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkJInBoeXMgdGFibGVfZGF0YV9zaXplIGlzICVsdSBudW1fdGFibGVfZW50cmllcyBpcyIKKwkJCSIgJWx1IGJ1c19hZGRyZXNzIGlzJWx1XG4iLCB0YWJsZV9kYXRhX3NpemUsCisJCQludW1fdGFibGVfZW50cmllcywgKHVuc2lnbmVkIGxvbmcpbGxpX3RhYmxlX3B0ci0+YnVzX2FkZHJlc3MpOworCisJCWlmICgodW5zaWduZWQgbG9uZylsbGlfdGFibGVfcHRyLT5idXNfYWRkcmVzcyAhPSAweGZmZmZmZmZmKQorCQkJbGxpX3RhYmxlX3B0ciA9IChzdHJ1Y3Qgc2VwX2xsaV9lbnRyeSAqKQorCQkJCXNlcF9zaGFyZWRfYnVzX3RvX3ZpcnQoc2VwLAorCQkJCSh1bnNpZ25lZCBsb25nKWxsaV90YWJsZV9wdHItPmJ1c19hZGRyZXNzKTsKKworCQl0YWJsZV9jb3VudCsrOworCX0KKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9kZWJ1Z19wcmludF9sbGlfdGFibGVzIGVuZFxuIik7Cit9CisKKworLyoqCisgKglzZXBfcHJlcGFyZV9lbXB0eV9sbGlfdGFibGUgLSBjcmVhdGUgYSBibGFuayBMTEkgdGFibGUKKyAqCUBzZXA6IHBvaW50ZXIgdG8gc3RydWN0IHNlcF9kZXZpY2UKKyAqCUBsbGlfdGFibGVfYWRkcl9wdHI6IHBvaW50ZXIgdG8gbGxpIHRhYmxlCisgKglAbnVtX2VudHJpZXNfcHRyOiBwb2ludGVyIHRvIG51bWJlciBvZiBlbnRyaWVzCisgKglAdGFibGVfZGF0YV9zaXplX3B0cjogcG9pbnQgdG8gdGFibGUgZGF0YSBzaXplCisgKgorICoJVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGVtcHR5IGxsaSB0YWJsZXMgd2hlbiB0aGVyZSBpcyBubyBkYXRhCisgKi8KK3N0YXRpYyB2b2lkIHNlcF9wcmVwYXJlX2VtcHR5X2xsaV90YWJsZShzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwLAorCQlkbWFfYWRkcl90ICpsbGlfdGFibGVfYWRkcl9wdHIsCisJCXUzMiAqbnVtX2VudHJpZXNfcHRyLAorCQl1MzIgKnRhYmxlX2RhdGFfc2l6ZV9wdHIpCit7CisJc3RydWN0IHNlcF9sbGlfZW50cnkgKmxsaV90YWJsZV9wdHI7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9wcmVwYXJlX2VtcHR5X2xsaV90YWJsZSBzdGFydFxuIik7CisKKwkvKiBGaW5kIHRoZSBhcmVhIGZvciBuZXcgdGFibGUgKi8KKwlsbGlfdGFibGVfcHRyID0KKwkJKHN0cnVjdCBzZXBfbGxpX2VudHJ5ICopKHNlcC0+c2hhcmVkX2FkZHIgKworCQlTWU5DSFJPTklDX0RNQV9UQUJMRVNfQVJFQV9PRkZTRVRfQllURVMgKworCQlzZXAtPm51bV9sbGlfdGFibGVzX2NyZWF0ZWQgKiBzaXplb2Yoc3RydWN0IHNlcF9sbGlfZW50cnkpICoKKwkJCVNFUF9EUklWRVJfRU5UUklFU19QRVJfVEFCTEVfSU5fU0VQKTsKKworCWxsaV90YWJsZV9wdHItPmJ1c19hZGRyZXNzID0gMDsKKwlsbGlfdGFibGVfcHRyLT5ibG9ja19zaXplID0gMDsKKworCWxsaV90YWJsZV9wdHIrKzsKKwlsbGlfdGFibGVfcHRyLT5idXNfYWRkcmVzcyA9IDB4RkZGRkZGRkY7CisJbGxpX3RhYmxlX3B0ci0+YmxvY2tfc2l6ZSA9IDA7CisKKwkvKiBTZXQgdGhlIG91dHB1dCBwYXJhbWV0ZXIgdmFsdWUgKi8KKwkqbGxpX3RhYmxlX2FkZHJfcHRyID0gc2VwLT5zaGFyZWRfYnVzICsKKwkJU1lOQ0hST05JQ19ETUFfVEFCTEVTX0FSRUFfT0ZGU0VUX0JZVEVTICsKKwkJc2VwLT5udW1fbGxpX3RhYmxlc19jcmVhdGVkICoKKwkJc2l6ZW9mKHN0cnVjdCBzZXBfbGxpX2VudHJ5KSAqCisJCVNFUF9EUklWRVJfRU5UUklFU19QRVJfVEFCTEVfSU5fU0VQOworCisJLyogU2V0IHRoZSBudW0gb2YgZW50cmllcyBhbmQgdGFibGUgZGF0YSBzaXplIGZvciBlbXB0eSB0YWJsZSAqLworCSpudW1fZW50cmllc19wdHIgPSAyOworCSp0YWJsZV9kYXRhX3NpemVfcHRyID0gMDsKKworCS8qIFVwZGF0ZSB0aGUgbnVtYmVyIG9mIGNyZWF0ZWQgdGFibGVzICovCisJc2VwLT5udW1fbGxpX3RhYmxlc19jcmVhdGVkKys7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9wcmVwYXJlX2VtcHR5X2xsaV90YWJsZSBzdGFydFxuIik7CisKK30KKworLyoqCisgKglzZXBfcHJlcGFyZV9pbnB1dF9kbWFfdGFibGUgLSBwcmVwYXJlIGlucHV0IERNQSBtYXBwaW5ncworICoJQHNlcDogcG9pbnRlciB0byBzdHJ1Y3Qgc2VwX2RldmljZQorICoJQGRhdGFfc2l6ZToKKyAqCUBibG9ja19zaXplOgorICoJQGxsaV90YWJsZV9wdHI6CisgKglAbnVtX2VudHJpZXNfcHRyOgorICoJQHRhYmxlX2RhdGFfc2l6ZV9wdHI6CisgKglAaXNfa3ZhOiBzZXQgZm9yIGtlcm5lbCBkYXRhIChrZXJuZWwgY3J5cHRpbyBjYWxsKQorICoKKyAqCVRoaXMgZnVuY3Rpb24gcHJlcGFyZXMgb25seSBpbnB1dCBETUEgdGFibGUgZm9yIHN5bmhyb25pYyBzeW1tZXRyaWMKKyAqCW9wZXJhdGlvbnMgKEhBU0gpCisgKglOb3RlIHRoYXQgYWxsIGJ1cyBhZGRyZXNzZXMgdGhhdCBhcmUgcGFzc2VkIHRvIHRoZSBTRVAKKyAqCWFyZSBpbiAzMiBiaXQgZm9ybWF0OyB0aGUgU0VQIGlzIGEgMzIgYml0IGRldmljZQorICovCitzdGF0aWMgaW50IHNlcF9wcmVwYXJlX2lucHV0X2RtYV90YWJsZShzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwLAorCXVuc2lnbmVkIGxvbmcgYXBwX3ZpcnRfYWRkciwKKwl1MzIgZGF0YV9zaXplLAorCXUzMiBibG9ja19zaXplLAorCWRtYV9hZGRyX3QgKmxsaV90YWJsZV9wdHIsCisJdTMyICpudW1fZW50cmllc19wdHIsCisJdTMyICp0YWJsZV9kYXRhX3NpemVfcHRyLAorCWJvb2wgaXNfa3ZhKQoreworCWludCBlcnJvciA9IDA7CisJLyogUG9pbnRlciB0byB0aGUgaW5mbyBlbnRyeSBvZiB0aGUgdGFibGUgLSB0aGUgbGFzdCBlbnRyeSAqLworCXN0cnVjdCBzZXBfbGxpX2VudHJ5ICppbmZvX2VudHJ5X3B0cjsKKwkvKiBBcnJheSBvZiBwb2ludGVycyB0byBwYWdlICovCisJc3RydWN0IHNlcF9sbGlfZW50cnkgKmxsaV9hcnJheV9wdHI7CisJLyogUG9pbnRzIHRvIHRoZSBmaXJzdCBlbnRyeSB0byBiZSBwcm9jZXNzZWQgaW4gdGhlIGxsaV9pbl9hcnJheSAqLworCXUzMiBjdXJyZW50X2VudHJ5ID0gMDsKKwkvKiBOdW0gZW50cmllcyBpbiB0aGUgdmlydHVhbCBidWZmZXIgKi8KKwl1MzIgc2VwX2xsaV9lbnRyaWVzID0gMDsKKwkvKiBMbGkgdGFibGUgcG9pbnRlciAqLworCXN0cnVjdCBzZXBfbGxpX2VudHJ5ICppbl9sbGlfdGFibGVfcHRyOworCS8qIFRoZSB0b3RhbCBkYXRhIGluIG9uZSB0YWJsZSAqLworCXUzMiB0YWJsZV9kYXRhX3NpemUgPSAwOworCS8qIEZsYWcgZm9yIGxhc3QgdGFibGUgKi8KKwl1MzIgbGFzdF90YWJsZV9mbGFnID0gMDsKKwkvKiBOdW1iZXIgb2YgZW50cmllcyBpbiBsbGkgdGFibGUgKi8KKwl1MzIgbnVtX2VudHJpZXNfaW5fdGFibGUgPSAwOworCS8qIE5leHQgdGFibGUgYWRkcmVzcyAqLworCXZvaWQgKmxsaV90YWJsZV9hbGxvY19hZGRyID0gMDsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX3ByZXBhcmVfaW5wdXRfZG1hX3RhYmxlIHN0YXJ0XG4iKTsKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImRhdGFfc2l6ZSBpcyAleFxuIiwgZGF0YV9zaXplKTsKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImJsb2NrX3NpemUgaXMgJXhcbiIsIGJsb2NrX3NpemUpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgcGFnZXMgcG9pbnRlcnMgKi8KKwlzZXAtPmRtYV9yZXNfYXJyW3NlcC0+bnJfZGNiX2NyZWF0XS5pbl9wYWdlX2FycmF5ID0gTlVMTDsKKwlzZXAtPmRtYV9yZXNfYXJyW3NlcC0+bnJfZGNiX2NyZWF0XS5pbl9udW1fcGFnZXMgPSAwOworCisJLyogU2V0IHRoZSBrZXJuZWwgYWRkcmVzcyBmb3IgZmlyc3QgdGFibGUgdG8gYmUgYWxsb2NhdGVkICovCisJbGxpX3RhYmxlX2FsbG9jX2FkZHIgPSAodm9pZCAqKShzZXAtPnNoYXJlZF9hZGRyICsKKwkJU1lOQ0hST05JQ19ETUFfVEFCTEVTX0FSRUFfT0ZGU0VUX0JZVEVTICsKKwkJc2VwLT5udW1fbGxpX3RhYmxlc19jcmVhdGVkICogc2l6ZW9mKHN0cnVjdCBzZXBfbGxpX2VudHJ5KSAqCisJCVNFUF9EUklWRVJfRU5UUklFU19QRVJfVEFCTEVfSU5fU0VQKTsKKworCWlmIChkYXRhX3NpemUgPT0gMCkgeworCQkvKiBTcGVjaWFsIGNhc2UgIC0gY3JlYXRlIG1lcHR1IHRhYmxlIC0gMiBlbnRyaWVzLCB6ZXJvIGRhdGEgKi8KKwkJc2VwX3ByZXBhcmVfZW1wdHlfbGxpX3RhYmxlKHNlcCwgbGxpX3RhYmxlX3B0ciwKKwkJCQludW1fZW50cmllc19wdHIsIHRhYmxlX2RhdGFfc2l6ZV9wdHIpOworCQlnb3RvIHVwZGF0ZV9kY2JfY291bnRlcjsKKwl9CisKKwkvKiBDaGVjayBpZiB0aGUgcGFnZXMgYXJlIGluIEtlcm5lbCBWaXJ0dWFsIEFkZHJlc3MgbGF5b3V0ICovCisJaWYgKGlzX2t2YSA9PSB0cnVlKQorCQkvKiBMb2NrIHRoZSBwYWdlcyBpbiB0aGUga2VybmVsICovCisJCWVycm9yID0gc2VwX2xvY2tfa2VybmVsX3BhZ2VzKHNlcCwgYXBwX3ZpcnRfYWRkciwKKwkJCWRhdGFfc2l6ZSwgJmxsaV9hcnJheV9wdHIsIFNFUF9EUklWRVJfSU5fRkxBRyk7CisJZWxzZQorCQkvKgorCQkgKiBMb2NrIHRoZSBwYWdlcyBvZiB0aGUgdXNlciBidWZmZXIKKwkJICogYW5kIHRyYW5zbGF0ZSB0aGVtIHRvIHBhZ2VzCisJCSAqLworCQllcnJvciA9IHNlcF9sb2NrX3VzZXJfcGFnZXMoc2VwLCBhcHBfdmlydF9hZGRyLAorCQkJZGF0YV9zaXplLCAmbGxpX2FycmF5X3B0ciwgU0VQX0RSSVZFUl9JTl9GTEFHKTsKKworCWlmIChlcnJvcikKKwkJZ290byBlbmRfZnVuY3Rpb247CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgIm91dHB1dCBzZXBfaW5fbnVtX3BhZ2VzIGlzICV4XG4iLAorCQlzZXAtPmRtYV9yZXNfYXJyW3NlcC0+bnJfZGNiX2NyZWF0XS5pbl9udW1fcGFnZXMpOworCisJY3VycmVudF9lbnRyeSA9IDA7CisJaW5mb19lbnRyeV9wdHIgPSBOVUxMOworCisJc2VwX2xsaV9lbnRyaWVzID0gc2VwLT5kbWFfcmVzX2FycltzZXAtPm5yX2RjYl9jcmVhdF0uaW5fbnVtX3BhZ2VzOworCisJLyogTG9vcCB0aWxsIGFsbCB0aGUgZW50cmllcyBpbiBpbiBhcnJheSBhcmUgbm90IHByb2Nlc3NlZCAqLworCXdoaWxlIChjdXJyZW50X2VudHJ5IDwgc2VwX2xsaV9lbnRyaWVzKSB7CisKKwkJLyogU2V0IHRoZSBuZXcgaW5wdXQgYW5kIG91dHB1dCB0YWJsZXMgKi8KKwkJaW5fbGxpX3RhYmxlX3B0ciA9CisJCQkoc3RydWN0IHNlcF9sbGlfZW50cnkgKilsbGlfdGFibGVfYWxsb2NfYWRkcjsKKworCQlsbGlfdGFibGVfYWxsb2NfYWRkciArPSBzaXplb2Yoc3RydWN0IHNlcF9sbGlfZW50cnkpICoKKwkJCVNFUF9EUklWRVJfRU5UUklFU19QRVJfVEFCTEVfSU5fU0VQOworCisJCWlmIChsbGlfdGFibGVfYWxsb2NfYWRkciA+CisJCQkoKHZvaWQgKilzZXAtPnNoYXJlZF9hZGRyICsKKwkJCVNZTkNIUk9OSUNfRE1BX1RBQkxFU19BUkVBX09GRlNFVF9CWVRFUyArCisJCQlTWU5DSFJPTklDX0RNQV9UQUJMRVNfQVJFQV9TSVpFX0JZVEVTKSkgeworCisJCQllcnJvciA9IC1FTk9NRU07CisJCQlnb3RvIGVuZF9mdW5jdGlvbl9lcnJvcjsKKworCQl9CisKKwkJLyogVXBkYXRlIHRoZSBudW1iZXIgb2YgY3JlYXRlZCB0YWJsZXMgKi8KKwkJc2VwLT5udW1fbGxpX3RhYmxlc19jcmVhdGVkKys7CisKKwkJLyogQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIHNpemUgb2YgZGF0YSBmb3IgaW5wdXQgdGFibGUgKi8KKwkJdGFibGVfZGF0YV9zaXplID0gc2VwX2NhbGN1bGF0ZV9sbGlfdGFibGVfbWF4X3NpemUoc2VwLAorCQkJJmxsaV9hcnJheV9wdHJbY3VycmVudF9lbnRyeV0sCisJCQkoc2VwX2xsaV9lbnRyaWVzIC0gY3VycmVudF9lbnRyeSksCisJCQkmbGFzdF90YWJsZV9mbGFnKTsKKworCQkvKgorCQkgKiBJZiB0aGlzIGlzIG5vdCB0aGUgbGFzdCB0YWJsZSAtCisJCSAqIHRoZW4gYWxsaWduIGl0IHRvIHRoZSBibG9jayBzaXplCisJCSAqLworCQlpZiAoIWxhc3RfdGFibGVfZmxhZykKKwkJCXRhYmxlX2RhdGFfc2l6ZSA9CisJCQkJKHRhYmxlX2RhdGFfc2l6ZSAvIGJsb2NrX3NpemUpICogYmxvY2tfc2l6ZTsKKworCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgIm91dHB1dCB0YWJsZV9kYXRhX3NpemUgaXMgJXhcbiIsCisJCQkJCQkJdGFibGVfZGF0YV9zaXplKTsKKworCQkvKiBDb25zdHJ1Y3QgaW5wdXQgbGxpIHRhYmxlICovCisJCXNlcF9idWlsZF9sbGlfdGFibGUoc2VwLCAmbGxpX2FycmF5X3B0cltjdXJyZW50X2VudHJ5XSwKKwkJCWluX2xsaV90YWJsZV9wdHIsCisJCQkmY3VycmVudF9lbnRyeSwgJm51bV9lbnRyaWVzX2luX3RhYmxlLCB0YWJsZV9kYXRhX3NpemUpOworCisJCWlmIChpbmZvX2VudHJ5X3B0ciA9PSBOVUxMKSB7CisKKwkJCS8qIFNldCB0aGUgb3V0cHV0IHBhcmFtZXRlcnMgdG8gcGh5c2ljYWwgYWRkcmVzc2VzICovCisJCQkqbGxpX3RhYmxlX3B0ciA9IHNlcF9zaGFyZWRfYXJlYV92aXJ0X3RvX2J1cyhzZXAsCisJCQkJaW5fbGxpX3RhYmxlX3B0cik7CisJCQkqbnVtX2VudHJpZXNfcHRyID0gbnVtX2VudHJpZXNfaW5fdGFibGU7CisJCQkqdGFibGVfZGF0YV9zaXplX3B0ciA9IHRhYmxlX2RhdGFfc2l6ZTsKKworCQkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCisJCQkJIm91dHB1dCBsbGlfdGFibGVfaW5fcHRyIGlzICUwOGx4XG4iLAorCQkJCSh1bnNpZ25lZCBsb25nKSpsbGlfdGFibGVfcHRyKTsKKworCQl9IGVsc2UgeworCQkJLyogVXBkYXRlIHRoZSBpbmZvIGVudHJ5IG9mIHRoZSBwcmV2aW91cyBpbiB0YWJsZSAqLworCQkJaW5mb19lbnRyeV9wdHItPmJ1c19hZGRyZXNzID0KKwkJCQlzZXBfc2hhcmVkX2FyZWFfdmlydF90b19idXMoc2VwLAorCQkJCQkJCWluX2xsaV90YWJsZV9wdHIpOworCQkJaW5mb19lbnRyeV9wdHItPmJsb2NrX3NpemUgPQorCQkJCSgobnVtX2VudHJpZXNfaW5fdGFibGUpIDw8IDI0KSB8CisJCQkJKHRhYmxlX2RhdGFfc2l6ZSk7CisJCX0KKwkJLyogU2F2ZSB0aGUgcG9pbnRlciB0byB0aGUgaW5mbyBlbnRyeSBvZiB0aGUgY3VycmVudCB0YWJsZXMgKi8KKwkJaW5mb19lbnRyeV9wdHIgPSBpbl9sbGlfdGFibGVfcHRyICsgbnVtX2VudHJpZXNfaW5fdGFibGUgLSAxOworCX0KKwkvKiBQcmludCBpbnB1dCB0YWJsZXMgKi8KKwlzZXBfZGVidWdfcHJpbnRfbGxpX3RhYmxlcyhzZXAsIChzdHJ1Y3Qgc2VwX2xsaV9lbnRyeSAqKQorCQlzZXBfc2hhcmVkX2FyZWFfYnVzX3RvX3ZpcnQoc2VwLCAqbGxpX3RhYmxlX3B0ciksCisJCSpudW1fZW50cmllc19wdHIsICp0YWJsZV9kYXRhX3NpemVfcHRyKTsKKwkvKiBUaGUgYXJyYXkgb2YgdGhlIHBhZ2VzICovCisJa2ZyZWUobGxpX2FycmF5X3B0cik7CisKK3VwZGF0ZV9kY2JfY291bnRlcjoKKwkvKiBVcGRhdGUgRENCIGNvdW50ZXIgKi8KKwlzZXAtPm5yX2RjYl9jcmVhdCsrOworCWdvdG8gZW5kX2Z1bmN0aW9uOworCitlbmRfZnVuY3Rpb25fZXJyb3I6CisJLyogRnJlZSBhbGwgdGhlIGFsbG9jYXRlZCByZXNvdXJjZXMgKi8KKwlrZnJlZShzZXAtPmRtYV9yZXNfYXJyW3NlcC0+bnJfZGNiX2NyZWF0XS5pbl9tYXBfYXJyYXkpOworCWtmcmVlKGxsaV9hcnJheV9wdHIpOworCWtmcmVlKHNlcC0+ZG1hX3Jlc19hcnJbc2VwLT5ucl9kY2JfY3JlYXRdLmluX3BhZ2VfYXJyYXkpOworCitlbmRfZnVuY3Rpb246CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfcHJlcGFyZV9pbnB1dF9kbWFfdGFibGUgZW5kXG4iKTsKKwlyZXR1cm4gZXJyb3I7CisKK30KKy8qKgorICoJc2VwX2NvbnN0cnVjdF9kbWFfdGFibGVzX2Zyb21fbGxpIC0gcHJlcGFyZSBBRVMvREVTIG1hcHBpbmdzCisgKglAc2VwOiBwb2ludGVyIHRvIHN0cnVjdCBzZXBfZGV2aWNlCisgKglAbGxpX2luX2FycmF5OgorICoJQHNlcF9pbl9sbGlfZW50cmllczoKKyAqCUBsbGlfb3V0X2FycmF5OgorICoJQHNlcF9vdXRfbGxpX2VudHJpZXMKKyAqCUBibG9ja19zaXplCisgKglAbGxpX3RhYmxlX2luX3B0cgorICoJQGxsaV90YWJsZV9vdXRfcHRyCisgKglAaW5fbnVtX2VudHJpZXNfcHRyCisgKglAb3V0X251bV9lbnRyaWVzX3B0cgorICoJQHRhYmxlX2RhdGFfc2l6ZV9wdHIKKyAqCisgKglUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgdGhlIGlucHV0IGFuZCBvdXRwdXQgRE1BIHRhYmxlcyBmb3IKKyAqCXN5bW1ldHJpYyBvcGVyYXRpb25zIChBRVMvREVTKSBhY2NvcmRpbmcgdG8gdGhlIGJsb2NrCisgKglzaXplIGZyb20gTExJIGFyYXlzCisgKglOb3RlIHRoYXQgYWxsIGJ1cyBhZGRyZXNzZXMgdGhhdCBhcmUgcGFzc2VkIHRvIHRoZSBTRVAKKyAqCWFyZSBpbiAzMiBiaXQgZm9ybWF0OyB0aGUgU0VQIGlzIGEgMzIgYml0IGRldmljZQorICovCitzdGF0aWMgaW50IHNlcF9jb25zdHJ1Y3RfZG1hX3RhYmxlc19mcm9tX2xsaSgKKwlzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwLAorCXN0cnVjdCBzZXBfbGxpX2VudHJ5ICpsbGlfaW5fYXJyYXksCisJdTMyCXNlcF9pbl9sbGlfZW50cmllcywKKwlzdHJ1Y3Qgc2VwX2xsaV9lbnRyeSAqbGxpX291dF9hcnJheSwKKwl1MzIJc2VwX291dF9sbGlfZW50cmllcywKKwl1MzIJYmxvY2tfc2l6ZSwKKwlkbWFfYWRkcl90ICpsbGlfdGFibGVfaW5fcHRyLAorCWRtYV9hZGRyX3QgKmxsaV90YWJsZV9vdXRfcHRyLAorCXUzMgkqaW5fbnVtX2VudHJpZXNfcHRyLAorCXUzMgkqb3V0X251bV9lbnRyaWVzX3B0ciwKKwl1MzIJKnRhYmxlX2RhdGFfc2l6ZV9wdHIpCit7CisJLyogUG9pbnRzIHRvIHRoZSBhcmVhIHdoZXJlIG5leHQgbGxpIHRhYmxlIGNhbiBiZSBhbGxvY2F0ZWQgKi8KKwl2b2lkICpsbGlfdGFibGVfYWxsb2NfYWRkciA9IDA7CisJLyogSW5wdXQgbGxpIHRhYmxlICovCisJc3RydWN0IHNlcF9sbGlfZW50cnkgKmluX2xsaV90YWJsZV9wdHIgPSBOVUxMOworCS8qIE91dHB1dCBsbGkgdGFibGUgKi8KKwlzdHJ1Y3Qgc2VwX2xsaV9lbnRyeSAqb3V0X2xsaV90YWJsZV9wdHIgPSBOVUxMOworCS8qIFBvaW50ZXIgdG8gdGhlIGluZm8gZW50cnkgb2YgdGhlIHRhYmxlIC0gdGhlIGxhc3QgZW50cnkgKi8KKwlzdHJ1Y3Qgc2VwX2xsaV9lbnRyeSAqaW5mb19pbl9lbnRyeV9wdHIgPSBOVUxMOworCS8qIFBvaW50ZXIgdG8gdGhlIGluZm8gZW50cnkgb2YgdGhlIHRhYmxlIC0gdGhlIGxhc3QgZW50cnkgKi8KKwlzdHJ1Y3Qgc2VwX2xsaV9lbnRyeSAqaW5mb19vdXRfZW50cnlfcHRyID0gTlVMTDsKKwkvKiBQb2ludHMgdG8gdGhlIGZpcnN0IGVudHJ5IHRvIGJlIHByb2Nlc3NlZCBpbiB0aGUgbGxpX2luX2FycmF5ICovCisJdTMyIGN1cnJlbnRfaW5fZW50cnkgPSAwOworCS8qIFBvaW50cyB0byB0aGUgZmlyc3QgZW50cnkgdG8gYmUgcHJvY2Vzc2VkIGluIHRoZSBsbGlfb3V0X2FycmF5ICovCisJdTMyIGN1cnJlbnRfb3V0X2VudHJ5ID0gMDsKKwkvKiBNYXggc2l6ZSBvZiB0aGUgaW5wdXQgdGFibGUgKi8KKwl1MzIgaW5fdGFibGVfZGF0YV9zaXplID0gMDsKKwkvKiBNYXggc2l6ZSBvZiB0aGUgb3V0cHV0IHRhYmxlICovCisJdTMyIG91dF90YWJsZV9kYXRhX3NpemUgPSAwOworCS8qIEZsYWcgdGUgc2lnbmlmaWVzIGlmIHRoaXMgaXMgdGhlIGxhc3QgdGFibGVzIGJ1aWxkICovCisJdTMyIGxhc3RfdGFibGVfZmxhZyA9IDA7CisJLyogVGhlIGRhdGEgc2l6ZSB0aGF0IHNob3VsZCBiZSBpbiB0YWJsZSAqLworCXUzMiB0YWJsZV9kYXRhX3NpemUgPSAwOworCS8qIE51bWJlciBvZiBldG5yaWVzIGluIHRoZSBpbnB1dCB0YWJsZSAqLworCXUzMiBudW1fZW50cmllc19pbl90YWJsZSA9IDA7CisJLyogTnVtYmVyIG9mIGV0bnJpZXMgaW4gdGhlIG91dHB1dCB0YWJsZSAqLworCXUzMiBudW1fZW50cmllc19vdXRfdGFibGUgPSAwOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfY29uc3RydWN0X2RtYV90YWJsZXNfZnJvbV9sbGkgc3RhcnRcbiIpOworCisJLyogSW5pdGlhdGUgdG8gcG9pbnQgYWZ0ZXIgdGhlIG1lc3NhZ2UgYXJlYSAqLworCWxsaV90YWJsZV9hbGxvY19hZGRyID0gKHZvaWQgKikoc2VwLT5zaGFyZWRfYWRkciArCisJCVNZTkNIUk9OSUNfRE1BX1RBQkxFU19BUkVBX09GRlNFVF9CWVRFUyArCisJCShzZXAtPm51bV9sbGlfdGFibGVzX2NyZWF0ZWQgKgorCQkoc2l6ZW9mKHN0cnVjdCBzZXBfbGxpX2VudHJ5KSAqCisJCVNFUF9EUklWRVJfRU5UUklFU19QRVJfVEFCTEVfSU5fU0VQKSkpOworCisJLyogTG9vcCB0aWxsIGFsbCB0aGUgZW50cmllcyBpbiBpbiBhcnJheSBhcmUgbm90IHByb2Nlc3NlZCAqLworCXdoaWxlIChjdXJyZW50X2luX2VudHJ5IDwgc2VwX2luX2xsaV9lbnRyaWVzKSB7CisJCS8qIFNldCB0aGUgbmV3IGlucHV0IGFuZCBvdXRwdXQgdGFibGVzICovCisJCWluX2xsaV90YWJsZV9wdHIgPQorCQkJKHN0cnVjdCBzZXBfbGxpX2VudHJ5ICopbGxpX3RhYmxlX2FsbG9jX2FkZHI7CisKKwkJbGxpX3RhYmxlX2FsbG9jX2FkZHIgKz0gc2l6ZW9mKHN0cnVjdCBzZXBfbGxpX2VudHJ5KSAqCisJCQlTRVBfRFJJVkVSX0VOVFJJRVNfUEVSX1RBQkxFX0lOX1NFUDsKKworCQkvKiBTZXQgdGhlIGZpcnN0IG91dHB1dCB0YWJsZXMgKi8KKwkJb3V0X2xsaV90YWJsZV9wdHIgPQorCQkJKHN0cnVjdCBzZXBfbGxpX2VudHJ5ICopbGxpX3RhYmxlX2FsbG9jX2FkZHI7CisKKwkJLyogQ2hlY2sgaWYgdGhlIERNQSB0YWJsZSBhcmVhIGxpbWl0IHdhcyBvdmVycnVuICovCisJCWlmICgobGxpX3RhYmxlX2FsbG9jX2FkZHIgKyBzaXplb2Yoc3RydWN0IHNlcF9sbGlfZW50cnkpICoKKwkJCVNFUF9EUklWRVJfRU5UUklFU19QRVJfVEFCTEVfSU5fU0VQKSA+CisJCQkoKHZvaWQgKilzZXAtPnNoYXJlZF9hZGRyICsKKwkJCVNZTkNIUk9OSUNfRE1BX1RBQkxFU19BUkVBX09GRlNFVF9CWVRFUyArCisJCQlTWU5DSFJPTklDX0RNQV9UQUJMRVNfQVJFQV9TSVpFX0JZVEVTKSkgeworCisJCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsICJkbWEgdGFibGUgbGltaXQgb3ZlcnJ1blxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCS8qIFVwZGF0ZSB0aGUgbnVtYmVyIG9mIHRoZSBsbGkgdGFibGVzIGNyZWF0ZWQgKi8KKwkJc2VwLT5udW1fbGxpX3RhYmxlc19jcmVhdGVkICs9IDI7CisKKwkJbGxpX3RhYmxlX2FsbG9jX2FkZHIgKz0gc2l6ZW9mKHN0cnVjdCBzZXBfbGxpX2VudHJ5KSAqCisJCQlTRVBfRFJJVkVSX0VOVFJJRVNfUEVSX1RBQkxFX0lOX1NFUDsKKworCQkvKiBDYWxjdWxhdGUgdGhlIG1heGltdW0gc2l6ZSBvZiBkYXRhIGZvciBpbnB1dCB0YWJsZSAqLworCQlpbl90YWJsZV9kYXRhX3NpemUgPQorCQkJc2VwX2NhbGN1bGF0ZV9sbGlfdGFibGVfbWF4X3NpemUoc2VwLAorCQkJJmxsaV9pbl9hcnJheVtjdXJyZW50X2luX2VudHJ5XSwKKwkJCShzZXBfaW5fbGxpX2VudHJpZXMgLSBjdXJyZW50X2luX2VudHJ5KSwKKwkJCSZsYXN0X3RhYmxlX2ZsYWcpOworCisJCS8qIENhbGN1bGF0ZSB0aGUgbWF4aW11bSBzaXplIG9mIGRhdGEgZm9yIG91dHB1dCB0YWJsZSAqLworCQlvdXRfdGFibGVfZGF0YV9zaXplID0KKwkJCXNlcF9jYWxjdWxhdGVfbGxpX3RhYmxlX21heF9zaXplKHNlcCwKKwkJCSZsbGlfb3V0X2FycmF5W2N1cnJlbnRfb3V0X2VudHJ5XSwKKwkJCShzZXBfb3V0X2xsaV9lbnRyaWVzIC0gY3VycmVudF9vdXRfZW50cnkpLAorCQkJJmxhc3RfdGFibGVfZmxhZyk7CisKKwkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCisJCQkiaW5fdGFibGVfZGF0YV9zaXplIGlzICV4XG4iLAorCQkJaW5fdGFibGVfZGF0YV9zaXplKTsKKworCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKKwkJCSJvdXRfdGFibGVfZGF0YV9zaXplIGlzICV4XG4iLAorCQkJb3V0X3RhYmxlX2RhdGFfc2l6ZSk7CisKKwkJdGFibGVfZGF0YV9zaXplID0gaW5fdGFibGVfZGF0YV9zaXplOworCisJCWlmICghbGFzdF90YWJsZV9mbGFnKSB7CisJCQkvKgorCQkJICogSWYgdGhpcyBpcyBub3QgdGhlIGxhc3QgdGFibGUsCisJCQkgKiB0aGVuIG11c3QgY2hlY2sgd2hlcmUgdGhlIGRhdGEgaXMgc21hbGxlc3QKKwkJCSAqIGFuZCB0aGVuIGFsaWduIGl0IHRvIHRoZSBibG9jayBzaXplCisJCQkgKi8KKwkJCWlmICh0YWJsZV9kYXRhX3NpemUgPiBvdXRfdGFibGVfZGF0YV9zaXplKQorCQkJCXRhYmxlX2RhdGFfc2l6ZSA9IG91dF90YWJsZV9kYXRhX3NpemU7CisKKwkJCS8qCisJCQkgKiBOb3cgY2FsY3VsYXRlIHRoZSB0YWJsZSBzaXplIHNvIHRoYXQKKwkJCSAqIGl0IHdpbGwgYmUgbW9kdWxlIGJsb2NrIHNpemUKKwkJCSAqLworCQkJdGFibGVfZGF0YV9zaXplID0gKHRhYmxlX2RhdGFfc2l6ZSAvIGJsb2NrX3NpemUpICoKKwkJCQlibG9ja19zaXplOworCQl9CisKKwkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJ0YWJsZV9kYXRhX3NpemUgaXMgJXhcbiIsCisJCQkJCQkJdGFibGVfZGF0YV9zaXplKTsKKworCQkvKiBDb25zdHJ1Y3QgaW5wdXQgbGxpIHRhYmxlICovCisJCXNlcF9idWlsZF9sbGlfdGFibGUoc2VwLCAmbGxpX2luX2FycmF5W2N1cnJlbnRfaW5fZW50cnldLAorCQkJaW5fbGxpX3RhYmxlX3B0ciwKKwkJCSZjdXJyZW50X2luX2VudHJ5LAorCQkJJm51bV9lbnRyaWVzX2luX3RhYmxlLAorCQkJdGFibGVfZGF0YV9zaXplKTsKKworCQkvKiBDb25zdHJ1Y3Qgb3V0cHV0IGxsaSB0YWJsZSAqLworCQlzZXBfYnVpbGRfbGxpX3RhYmxlKHNlcCwgJmxsaV9vdXRfYXJyYXlbY3VycmVudF9vdXRfZW50cnldLAorCQkJb3V0X2xsaV90YWJsZV9wdHIsCisJCQkmY3VycmVudF9vdXRfZW50cnksCisJCQkmbnVtX2VudHJpZXNfb3V0X3RhYmxlLAorCQkJdGFibGVfZGF0YV9zaXplKTsKKworCQkvKiBJZiBpbmZvIGVudHJ5IGlzIG51bGwgLSB0aGlzIGlzIHRoZSBmaXJzdCB0YWJsZSBidWlsdCAqLworCQlpZiAoaW5mb19pbl9lbnRyeV9wdHIgPT0gTlVMTCkgeworCQkJLyogU2V0IHRoZSBvdXRwdXQgcGFyYW1ldGVycyB0byBwaHlzaWNhbCBhZGRyZXNzZXMgKi8KKwkJCSpsbGlfdGFibGVfaW5fcHRyID0KKwkJCXNlcF9zaGFyZWRfYXJlYV92aXJ0X3RvX2J1cyhzZXAsIGluX2xsaV90YWJsZV9wdHIpOworCisJCQkqaW5fbnVtX2VudHJpZXNfcHRyID0gbnVtX2VudHJpZXNfaW5fdGFibGU7CisKKwkJCSpsbGlfdGFibGVfb3V0X3B0ciA9CisJCQkJc2VwX3NoYXJlZF9hcmVhX3ZpcnRfdG9fYnVzKHNlcCwKKwkJCQlvdXRfbGxpX3RhYmxlX3B0cik7CisKKwkJCSpvdXRfbnVtX2VudHJpZXNfcHRyID0gbnVtX2VudHJpZXNfb3V0X3RhYmxlOworCQkJKnRhYmxlX2RhdGFfc2l6ZV9wdHIgPSB0YWJsZV9kYXRhX3NpemU7CisKKwkJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkJIm91dHB1dCBsbGlfdGFibGVfaW5fcHRyIGlzICUwOGx4XG4iLAorCQkJCSh1bnNpZ25lZCBsb25nKSpsbGlfdGFibGVfaW5fcHRyKTsKKwkJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkJIm91dHB1dCBsbGlfdGFibGVfb3V0X3B0ciBpcyAlMDhseFxuIiwKKwkJCQkodW5zaWduZWQgbG9uZykqbGxpX3RhYmxlX291dF9wdHIpOworCQl9IGVsc2UgeworCQkJLyogVXBkYXRlIHRoZSBpbmZvIGVudHJ5IG9mIHRoZSBwcmV2aW91cyBpbiB0YWJsZSAqLworCQkJaW5mb19pbl9lbnRyeV9wdHItPmJ1c19hZGRyZXNzID0KKwkJCQlzZXBfc2hhcmVkX2FyZWFfdmlydF90b19idXMoc2VwLAorCQkJCWluX2xsaV90YWJsZV9wdHIpOworCisJCQlpbmZvX2luX2VudHJ5X3B0ci0+YmxvY2tfc2l6ZSA9CisJCQkJKChudW1fZW50cmllc19pbl90YWJsZSkgPDwgMjQpIHwKKwkJCQkodGFibGVfZGF0YV9zaXplKTsKKworCQkJLyogVXBkYXRlIHRoZSBpbmZvIGVudHJ5IG9mIHRoZSBwcmV2aW91cyBpbiB0YWJsZSAqLworCQkJaW5mb19vdXRfZW50cnlfcHRyLT5idXNfYWRkcmVzcyA9CisJCQkJc2VwX3NoYXJlZF9hcmVhX3ZpcnRfdG9fYnVzKHNlcCwKKwkJCQlvdXRfbGxpX3RhYmxlX3B0cik7CisKKwkJCWluZm9fb3V0X2VudHJ5X3B0ci0+YmxvY2tfc2l6ZSA9CisJCQkJKChudW1fZW50cmllc19vdXRfdGFibGUpIDw8IDI0KSB8CisJCQkJKHRhYmxlX2RhdGFfc2l6ZSk7CisKKwkJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkJCSJvdXRwdXQgbGxpX3RhYmxlX2luX3B0cjolMDhseCAlMDh4XG4iLAorCQkJCSh1bnNpZ25lZCBsb25nKWluZm9faW5fZW50cnlfcHRyLT5idXNfYWRkcmVzcywKKwkJCQlpbmZvX2luX2VudHJ5X3B0ci0+YmxvY2tfc2l6ZSk7CisKKwkJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkJCSJvdXRwdXQgbGxpX3RhYmxlX291dF9wdHI6JTA4bHggICUwOHhcbiIsCisJCQkJKHVuc2lnbmVkIGxvbmcpaW5mb19vdXRfZW50cnlfcHRyLT5idXNfYWRkcmVzcywKKwkJCQlpbmZvX291dF9lbnRyeV9wdHItPmJsb2NrX3NpemUpOworCQl9CisKKwkJLyogU2F2ZSB0aGUgcG9pbnRlciB0byB0aGUgaW5mbyBlbnRyeSBvZiB0aGUgY3VycmVudCB0YWJsZXMgKi8KKwkJaW5mb19pbl9lbnRyeV9wdHIgPSBpbl9sbGlfdGFibGVfcHRyICsKKwkJCW51bV9lbnRyaWVzX2luX3RhYmxlIC0gMTsKKwkJaW5mb19vdXRfZW50cnlfcHRyID0gb3V0X2xsaV90YWJsZV9wdHIgKworCQkJbnVtX2VudHJpZXNfb3V0X3RhYmxlIC0gMTsKKworCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKKwkJCSJvdXRwdXQgbnVtX2VudHJpZXNfb3V0X3RhYmxlIGlzICV4XG4iLAorCQkJKHUzMiludW1fZW50cmllc19vdXRfdGFibGUpOworCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKKwkJCSJvdXRwdXQgaW5mb19pbl9lbnRyeV9wdHIgaXMgJWx4XG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpaW5mb19pbl9lbnRyeV9wdHIpOworCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKKwkJCSJvdXRwdXQgaW5mb19vdXRfZW50cnlfcHRyIGlzICVseFxuIiwKKwkJCSh1bnNpZ25lZCBsb25nKWluZm9fb3V0X2VudHJ5X3B0cik7CisJfQorCisJLyogUHJpbnQgaW5wdXQgdGFibGVzICovCisJc2VwX2RlYnVnX3ByaW50X2xsaV90YWJsZXMoc2VwLAorCShzdHJ1Y3Qgc2VwX2xsaV9lbnRyeSAqKQorCXNlcF9zaGFyZWRfYXJlYV9idXNfdG9fdmlydChzZXAsICpsbGlfdGFibGVfaW5fcHRyKSwKKwkqaW5fbnVtX2VudHJpZXNfcHRyLAorCSp0YWJsZV9kYXRhX3NpemVfcHRyKTsKKworCS8qIFByaW50IG91dHB1dCB0YWJsZXMgKi8KKwlzZXBfZGVidWdfcHJpbnRfbGxpX3RhYmxlcyhzZXAsCisJKHN0cnVjdCBzZXBfbGxpX2VudHJ5ICopCisJc2VwX3NoYXJlZF9hcmVhX2J1c190b192aXJ0KHNlcCwgKmxsaV90YWJsZV9vdXRfcHRyKSwKKwkqb3V0X251bV9lbnRyaWVzX3B0ciwKKwkqdGFibGVfZGF0YV9zaXplX3B0cik7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9jb25zdHJ1Y3RfZG1hX3RhYmxlc19mcm9tX2xsaSBlbmRcbiIpOworCXJldHVybiAwOworfQorCisvKioKKyAqCXNlcF9wcmVwYXJlX2lucHV0X291dHB1dF9kbWFfdGFibGUgLSBwcmVwYXJlIERNQSBJL08gdGFibGUKKyAqCUBhcHBfdmlydF9pbl9hZGRyOgorICoJQGFwcF92aXJ0X291dF9hZGRyOgorICoJQGRhdGFfc2l6ZToKKyAqCUBibG9ja19zaXplOgorICoJQGxsaV90YWJsZV9pbl9wdHI6CisgKglAbGxpX3RhYmxlX291dF9wdHI6CisgKglAaW5fbnVtX2VudHJpZXNfcHRyOgorICoJQG91dF9udW1fZW50cmllc19wdHI6CisgKglAdGFibGVfZGF0YV9zaXplX3B0cjoKKyAqCUBpc19rdmE6IHNldCBmb3Iga2VybmVsIGRhdGE7IHVzZWQgb25seSBmb3Iga2VybmVsIGNyeXB0byBtb2R1bGUKKyAqCisgKglUaGlzIGZ1bmN0aW9uIGJ1aWxkcyBpbnB1dCBhbmQgb3V0cHV0IERNQSB0YWJsZXMgZm9yIHN5bmhyb25pYworICoJc3ltbWV0cmljIG9wZXJhdGlvbnMgKEFFUywgREVTLCBIQVNIKS4gSXQgYWxzbyBjaGVja3MgdGhhdCBlYWNoIHRhYmxlCisgKglpcyBvZiB0aGUgbW9kdWxhciBibG9jayBzaXplCisgKglOb3RlIHRoYXQgYWxsIGJ1cyBhZGRyZXNzZXMgdGhhdCBhcmUgcGFzc2VkIHRvIHRoZSBTRVAKKyAqCWFyZSBpbiAzMiBiaXQgZm9ybWF0OyB0aGUgU0VQIGlzIGEgMzIgYml0IGRldmljZQorICovCitzdGF0aWMgaW50IHNlcF9wcmVwYXJlX2lucHV0X291dHB1dF9kbWFfdGFibGUoc3RydWN0IHNlcF9kZXZpY2UgKnNlcCwKKwl1bnNpZ25lZCBsb25nIGFwcF92aXJ0X2luX2FkZHIsCisJdW5zaWduZWQgbG9uZyBhcHBfdmlydF9vdXRfYWRkciwKKwl1MzIgZGF0YV9zaXplLAorCXUzMiBibG9ja19zaXplLAorCWRtYV9hZGRyX3QgKmxsaV90YWJsZV9pbl9wdHIsCisJZG1hX2FkZHJfdCAqbGxpX3RhYmxlX291dF9wdHIsCisJdTMyICppbl9udW1fZW50cmllc19wdHIsCisJdTMyICpvdXRfbnVtX2VudHJpZXNfcHRyLAorCXUzMiAqdGFibGVfZGF0YV9zaXplX3B0ciwKKwlib29sIGlzX2t2YSkKKworeworCWludCBlcnJvciA9IDA7CisJLyogQXJyYXkgb2YgcG9pbnRlcnMgb2YgcGFnZSAqLworCXN0cnVjdCBzZXBfbGxpX2VudHJ5ICpsbGlfaW5fYXJyYXk7CisJLyogQXJyYXkgb2YgcG9pbnRlcnMgb2YgcGFnZSAqLworCXN0cnVjdCBzZXBfbGxpX2VudHJ5ICpsbGlfb3V0X2FycmF5OworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfcHJlcGFyZV9pbnB1dF9vdXRwdXRfZG1hX3RhYmxlIHN0YXJ0XG4iKTsKKworCWlmIChkYXRhX3NpemUgPT0gMCkgeworCQkvKiBQcmVwYXJlIGVtcHR5IHRhYmxlIGZvciBpbnB1dCBhbmQgb3V0cHV0ICovCisJCXNlcF9wcmVwYXJlX2VtcHR5X2xsaV90YWJsZShzZXAsIGxsaV90YWJsZV9pbl9wdHIsCisJCQlpbl9udW1fZW50cmllc19wdHIsIHRhYmxlX2RhdGFfc2l6ZV9wdHIpOworCisJCXNlcF9wcmVwYXJlX2VtcHR5X2xsaV90YWJsZShzZXAsIGxsaV90YWJsZV9vdXRfcHRyLAorCQkJb3V0X251bV9lbnRyaWVzX3B0ciwgdGFibGVfZGF0YV9zaXplX3B0cik7CisKKwkJZ290byB1cGRhdGVfZGNiX2NvdW50ZXI7CisJfQorCisJLyogSW5pdGlhbGl6ZSB0aGUgcGFnZXMgcG9pbnRlcnMgKi8KKwlzZXAtPmRtYV9yZXNfYXJyW3NlcC0+bnJfZGNiX2NyZWF0XS5pbl9wYWdlX2FycmF5ID0gTlVMTDsKKwlzZXAtPmRtYV9yZXNfYXJyW3NlcC0+bnJfZGNiX2NyZWF0XS5vdXRfcGFnZV9hcnJheSA9IE5VTEw7CisKKwkvKiBMb2NrIHRoZSBwYWdlcyBvZiB0aGUgYnVmZmVyIGFuZCB0cmFuc2xhdGUgdGhlbSB0byBwYWdlcyAqLworCWlmIChpc19rdmEgPT0gdHJ1ZSkgeworCQllcnJvciA9IHNlcF9sb2NrX2tlcm5lbF9wYWdlcyhzZXAsIGFwcF92aXJ0X2luX2FkZHIsCisJCQlkYXRhX3NpemUsICZsbGlfaW5fYXJyYXksIFNFUF9EUklWRVJfSU5fRkxBRyk7CisKKwkJaWYgKGVycm9yKSB7CisJCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsCisJCQkJImxvY2sga2VybmVsIGZvciBpbiBmYWlsZWRcbiIpOworCQkJZ290byBlbmRfZnVuY3Rpb247CisJCX0KKworCQllcnJvciA9IHNlcF9sb2NrX2tlcm5lbF9wYWdlcyhzZXAsIGFwcF92aXJ0X291dF9hZGRyLAorCQkJZGF0YV9zaXplLCAmbGxpX291dF9hcnJheSwgU0VQX0RSSVZFUl9PVVRfRkxBRyk7CisKKwkJaWYgKGVycm9yKSB7CisJCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsCisJCQkJImxvY2sga2VybmVsIGZvciBvdXQgZmFpbGVkXG4iKTsKKwkJCWdvdG8gZW5kX2Z1bmN0aW9uOworCQl9CisJfQorCisJZWxzZSB7CisJCWVycm9yID0gc2VwX2xvY2tfdXNlcl9wYWdlcyhzZXAsIGFwcF92aXJ0X2luX2FkZHIsCisJCQkJZGF0YV9zaXplLCAmbGxpX2luX2FycmF5LCBTRVBfRFJJVkVSX0lOX0ZMQUcpOworCQlpZiAoZXJyb3IpIHsKKwkJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwKKwkJCQkic2VwX2xvY2tfdXNlcl9wYWdlcyBmb3IgaW5wdXQgdmlydHVhbCBidWZmZXIgZmFpbGVkXG4iKTsKKwkJCWdvdG8gZW5kX2Z1bmN0aW9uOworCQl9CisKKwkJZXJyb3IgPSBzZXBfbG9ja191c2VyX3BhZ2VzKHNlcCwgYXBwX3ZpcnRfb3V0X2FkZHIsCisJCQlkYXRhX3NpemUsICZsbGlfb3V0X2FycmF5LCBTRVBfRFJJVkVSX09VVF9GTEFHKTsKKworCQlpZiAoZXJyb3IpIHsKKwkJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwKKwkJCQkic2VwX2xvY2tfdXNlcl9wYWdlcyBmb3Igb3V0cHV0IHZpcnR1YWwgYnVmZmVyIGZhaWxlZFxuIik7CisJCQlnb3RvIGVuZF9mdW5jdGlvbl9mcmVlX2xsaV9pbjsKKwkJfQorCX0KKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX2luX251bV9wYWdlcyBpcyAleFxuIiwKKwkJc2VwLT5kbWFfcmVzX2FycltzZXAtPm5yX2RjYl9jcmVhdF0uaW5fbnVtX3BhZ2VzKTsKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9vdXRfbnVtX3BhZ2VzIGlzICV4XG4iLAorCQlzZXAtPmRtYV9yZXNfYXJyW3NlcC0+bnJfZGNiX2NyZWF0XS5vdXRfbnVtX3BhZ2VzKTsKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgIlNFUF9EUklWRVJfRU5UUklFU19QRVJfVEFCTEVfSU5fU0VQIGlzICV4XG4iLAorCQlTRVBfRFJJVkVSX0VOVFJJRVNfUEVSX1RBQkxFX0lOX1NFUCk7CisKKwkvKiBDYWxsIHRoZSBmdWNudGlvbiB0aGF0IGNyZWF0ZXMgdGFibGUgZnJvbSB0aGUgbGxpIGFycmF5cyAqLworCWVycm9yID0gc2VwX2NvbnN0cnVjdF9kbWFfdGFibGVzX2Zyb21fbGxpKHNlcCwgbGxpX2luX2FycmF5LAorCQlzZXAtPmRtYV9yZXNfYXJyW3NlcC0+bnJfZGNiX2NyZWF0XS5pbl9udW1fcGFnZXMsCisJCWxsaV9vdXRfYXJyYXksCisJCXNlcC0+ZG1hX3Jlc19hcnJbc2VwLT5ucl9kY2JfY3JlYXRdLm91dF9udW1fcGFnZXMsCisJCWJsb2NrX3NpemUsIGxsaV90YWJsZV9pbl9wdHIsIGxsaV90YWJsZV9vdXRfcHRyLAorCQlpbl9udW1fZW50cmllc19wdHIsIG91dF9udW1fZW50cmllc19wdHIsIHRhYmxlX2RhdGFfc2l6ZV9wdHIpOworCisJaWYgKGVycm9yKSB7CisJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwKKwkJCSJzZXBfY29uc3RydWN0X2RtYV90YWJsZXNfZnJvbV9sbGkgZmFpbGVkXG4iKTsKKwkJZ290byBlbmRfZnVuY3Rpb25fd2l0aF9lcnJvcjsKKwl9CisKKwlrZnJlZShsbGlfb3V0X2FycmF5KTsKKwlrZnJlZShsbGlfaW5fYXJyYXkpOworCit1cGRhdGVfZGNiX2NvdW50ZXI6CisJLyogVXBkYXRlIERDQiBjb3VudGVyICovCisJc2VwLT5ucl9kY2JfY3JlYXQrKzsKKwkvKiBGYWxsIHRocm91Z2ggLSBmcmVlIHRoZSBsbGkgZW50cnkgYXJyYXlzICovCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJpbl9udW1fZW50cmllc19wdHIgaXMgJTA4eFxuIiwKKwkJCQkJCSppbl9udW1fZW50cmllc19wdHIpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAib3V0X251bV9lbnRyaWVzX3B0ciBpcyAlMDh4XG4iLAorCQkJCQkJKm91dF9udW1fZW50cmllc19wdHIpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAidGFibGVfZGF0YV9zaXplX3B0ciBpcyAlMDh4XG4iLAorCQkJCQkJKnRhYmxlX2RhdGFfc2l6ZV9wdHIpOworCisJZ290byBlbmRfZnVuY3Rpb247CisKK2VuZF9mdW5jdGlvbl93aXRoX2Vycm9yOgorCWtmcmVlKHNlcC0+ZG1hX3Jlc19hcnJbc2VwLT5ucl9kY2JfY3JlYXRdLm91dF9tYXBfYXJyYXkpOworCWtmcmVlKHNlcC0+ZG1hX3Jlc19hcnJbc2VwLT5ucl9kY2JfY3JlYXRdLm91dF9wYWdlX2FycmF5KTsKKwlrZnJlZShsbGlfb3V0X2FycmF5KTsKKworCitlbmRfZnVuY3Rpb25fZnJlZV9sbGlfaW46CisJa2ZyZWUoc2VwLT5kbWFfcmVzX2FycltzZXAtPm5yX2RjYl9jcmVhdF0uaW5fbWFwX2FycmF5KTsKKwlrZnJlZShzZXAtPmRtYV9yZXNfYXJyW3NlcC0+bnJfZGNiX2NyZWF0XS5pbl9wYWdlX2FycmF5KTsKKwlrZnJlZShsbGlfaW5fYXJyYXkpOworCitlbmRfZnVuY3Rpb246CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCisJCSJzZXBfcHJlcGFyZV9pbnB1dF9vdXRwdXRfZG1hX3RhYmxlIGVuZCByZXN1bHQgPSAlZFxuIiwgZXJyb3IpOworCisJcmV0dXJuIGVycm9yOworCit9CisKKy8qKgorICoJc2VwX3ByZXBhcmVfaW5wdXRfb3V0cHV0X2RtYV90YWJsZV9pbl9kY2IgLSBwcmVwYXJlIGNvbnRyb2wgYmxvY2tzCisgKglAYXBwX2luX2FkZHJlc3M6IHVuc2lnbmVkIGxvbmc7IGZvciBkYXRhIGJ1ZmZlciBpbiAodXNlciBzcGFjZSkKKyAqCUBhcHBfb3V0X2FkZHJlc3M6IHVuc2lnbmVkIGxvbmc7IGZvciBkYXRhIGJ1ZmZlciBvdXQgKHVzZXIgc3BhY2UpCisgKglAZGF0YV9pbl9zaXplOiB1MzI7IGZvciBzaXplIG9mIGRhdGEKKyAqCUBibG9ja19zaXplOiB1MzI7IGZvciBibG9jayBzaXplCisgKglAdGFpbF9ibG9ja19zaXplOiB1MzI7IGZvciBzaXplIG9mIHRhaWwgYmxvY2sKKyAqCUBpc2FwcGxldDogYm9vbDsgdG8gaW5kaWNhdGUgZXh0ZXJuYWwgYXBwCisgKglAaXNfa3ZhOiBib29sOyBrZXJuZWwgYnVmZmVyOyBvbmx5IHVzZWQgZm9yIGtlcm5lbCBjcnlwdG8gbW9kdWxlCisgKgorICoJVGhpcyBmdW5jdGlvbiBwcmVwYXJlcyB0aGUgbGlua2VkIERNQSB0YWJsZXMgYW5kIHB1dHMgdGhlCisgKglhZGRyZXNzIGZvciB0aGUgbGlua2VkIGxpc3Qgb2YgdGFibGVzIGludGEgYSBEQ0IgKGRhdGEgY29udHJvbAorICoJYmxvY2spIHRoZSBhZGRyZXNzIG9mIHdoaWNoIGlzIGtub3duIGJ5IHRoZSBTRVAgaGFyZHdhcmUKKyAqCU5vdGUgdGhhdCBhbGwgYnVzIGFkZHJlc3NlcyB0aGF0IGFyZSBwYXNzZWQgdG8gdGhlIFNFUAorICoJYXJlIGluIDMyIGJpdCBmb3JtYXQ7IHRoZSBTRVAgaXMgYSAzMiBiaXQgZGV2aWNlCisgKi8KK3N0YXRpYyBpbnQgc2VwX3ByZXBhcmVfaW5wdXRfb3V0cHV0X2RtYV90YWJsZV9pbl9kY2Ioc3RydWN0IHNlcF9kZXZpY2UgKnNlcCwKKwl1bnNpZ25lZCBsb25nICBhcHBfaW5fYWRkcmVzcywKKwl1bnNpZ25lZCBsb25nICBhcHBfb3V0X2FkZHJlc3MsCisJdTMyICBkYXRhX2luX3NpemUsCisJdTMyICBibG9ja19zaXplLAorCXUzMiAgdGFpbF9ibG9ja19zaXplLAorCWJvb2wgaXNhcHBsZXQsCisJYm9vbAlpc19rdmEpCit7CisJaW50IGVycm9yID0gMDsKKwkvKiBTaXplIG9mIHRhaWwgKi8KKwl1MzIgdGFpbF9zaXplID0gMDsKKwkvKiBBZGRyZXNzIG9mIHRoZSBjcmVhdGVkIERDQiB0YWJsZSAqLworCXN0cnVjdCBzZXBfZGNibG9jayAqZGNiX3RhYmxlX3B0ciA9IE5VTEw7CisJLyogVGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGlucHV0IERNQSB0YWJsZSAqLworCWRtYV9hZGRyX3QgaW5fZmlyc3RfbWxsaV9hZGRyZXNzID0gMDsKKwkvKiBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgZmlyc3QgaW5wdXQgRE1BIHRhYmxlICovCisJdTMyICBpbl9maXJzdF9udW1fZW50cmllcyA9IDA7CisJLyogVGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IG91dHB1dCBETUEgdGFibGUgKi8KKwlkbWFfYWRkcl90ICBvdXRfZmlyc3RfbWxsaV9hZGRyZXNzID0gMDsKKwkvKiBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgZmlyc3Qgb3V0cHV0IERNQSB0YWJsZSAqLworCXUzMiAgb3V0X2ZpcnN0X251bV9lbnRyaWVzID0gMDsKKwkvKiBEYXRhIGluIHRoZSBmaXJzdCBpbnB1dC9vdXRwdXQgdGFibGUgKi8KKwl1MzIgIGZpcnN0X2RhdGFfc2l6ZSA9IDA7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInByZXBhcmVfaW5wdXRfb3V0cHV0X2RtYV90YWJsZV9pbl9kY2Igc3RhcnRcbiIpOworCisJaWYgKHNlcC0+bnJfZGNiX2NyZWF0ID09IFNFUF9NQVhfTlVNX1NZTkNfRE1BX09QUykgeworCQkvKiBObyBtb3JlIERDQnMgdG8gYWxsb2NhdGUgKi8KKwkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LCAibm8gbW9yZSBEQ0JzIGF2YWlsYWJsZVxuIik7CisJCWVycm9yID0gLUVOT1NQQzsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCisJLyogQWxsb2NhdGUgbmV3IERDQiAqLworCWRjYl90YWJsZV9wdHIgPSAoc3RydWN0IHNlcF9kY2Jsb2NrICopKHNlcC0+c2hhcmVkX2FkZHIgKworCQlTRVBfRFJJVkVSX1NZU1RFTV9EQ0JfTUVNT1JZX09GRlNFVF9JTl9CWVRFUyArCisJCShzZXAtPm5yX2RjYl9jcmVhdCAqIHNpemVvZihzdHJ1Y3Qgc2VwX2RjYmxvY2spKSk7CisKKwkvKiBTZXQgdGhlIGRlZmF1bHQgdmFsdWVzIGluIHRoZSBEQ0IgKi8KKwlkY2JfdGFibGVfcHRyLT5pbnB1dF9tbGxpX2FkZHJlc3MgPSAwOworCWRjYl90YWJsZV9wdHItPmlucHV0X21sbGlfbnVtX2VudHJpZXMgPSAwOworCWRjYl90YWJsZV9wdHItPmlucHV0X21sbGlfZGF0YV9zaXplID0gMDsKKwlkY2JfdGFibGVfcHRyLT5vdXRwdXRfbWxsaV9hZGRyZXNzID0gMDsKKwlkY2JfdGFibGVfcHRyLT5vdXRwdXRfbWxsaV9udW1fZW50cmllcyA9IDA7CisJZGNiX3RhYmxlX3B0ci0+b3V0cHV0X21sbGlfZGF0YV9zaXplID0gMDsKKwlkY2JfdGFibGVfcHRyLT50YWlsX2RhdGFfc2l6ZSA9IDA7CisJZGNiX3RhYmxlX3B0ci0+b3V0X3ZyX3RhaWxfcHQgPSAwOworCisJaWYgKGlzYXBwbGV0ID09IHRydWUpIHsKKwkJdGFpbF9zaXplID0gZGF0YV9pbl9zaXplICUgYmxvY2tfc2l6ZTsKKwkJaWYgKHRhaWxfc2l6ZSkgeworCQkJaWYgKGRhdGFfaW5fc2l6ZSA8IHRhaWxfYmxvY2tfc2l6ZSkgeworCQkJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwgImRhdGEgaW4gc2l6ZSBzbWFsbGVyIHRoYW4gdGFpbCBibG9jayBzaXplXG4iKTsKKwkJCQllcnJvciA9IC1FTk9TUEM7CisJCQkJZ290byBlbmRfZnVuY3Rpb247CisJCQl9CisJCQlpZiAodGFpbF9ibG9ja19zaXplKQorCQkJCS8qCisJCQkJICogQ2FzZSB0aGUgdGFpbCBzaXplIHNob3VsZCBiZQorCQkJCSAqIGJpZ2dlciB0aGFuIHRoZSByZWFsIGJsb2NrIHNpemUKKwkJCQkgKi8KKwkJCQl0YWlsX3NpemUgPSB0YWlsX2Jsb2NrX3NpemUgKworCQkJCQkoKGRhdGFfaW5fc2l6ZSAtCisJCQkJCQl0YWlsX2Jsb2NrX3NpemUpICUgYmxvY2tfc2l6ZSk7CisJCX0KKworCQkvKiBDaGVjayBpZiB0aGVyZSBpcyBlbm91Z2ggZGF0YSBmb3IgRE1BIG9wZXJhdGlvbiAqLworCQlpZiAoZGF0YV9pbl9zaXplIDwgU0VQX0RSSVZFUl9NSU5fREFUQV9TSVpFX1BFUl9UQUJMRSkgeworCQkJaWYgKGlzX2t2YSA9PSB0cnVlKSB7CisJCQkJbWVtY3B5KGRjYl90YWJsZV9wdHItPnRhaWxfZGF0YSwKKwkJCQkJKHZvaWQgKilhcHBfaW5fYWRkcmVzcywgZGF0YV9pbl9zaXplKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRjYl90YWJsZV9wdHItPnRhaWxfZGF0YSwKKwkJCQkJKHZvaWQgX191c2VyICopYXBwX2luX2FkZHJlc3MsCisJCQkJCWRhdGFfaW5fc2l6ZSkpIHsKKwkJCQkJZXJyb3IgPSAtRUZBVUxUOworCQkJCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwkJCQl9CisJCQl9CisKKwkJCWRjYl90YWJsZV9wdHItPnRhaWxfZGF0YV9zaXplID0gZGF0YV9pbl9zaXplOworCisJCQkvKiBTZXQgdGhlIG91dHB1dCB1c2VyLXNwYWNlIGFkZHJlc3MgZm9yIG1lbTJtZW0gb3AgKi8KKwkJCWlmIChhcHBfb3V0X2FkZHJlc3MpCisJCQkJZGNiX3RhYmxlX3B0ci0+b3V0X3ZyX3RhaWxfcHQgPQorCQkJCQkJCSh1MzIpYXBwX291dF9hZGRyZXNzOworCisJCQkvKgorCQkJICogVXBkYXRlIGJvdGggZGF0YSBsZW5ndGggcGFyYW1ldGVycyBpbiBvcmRlciB0byBhdm9pZAorCQkJICogc2Vjb25kIGRhdGEgY29weSBhbmQgYWxsb3cgYnVpbGRpbmcgb2YgZW1wdHkgbWxsaQorCQkJICogdGFibGVzCisJCQkgKi8KKwkJCXRhaWxfc2l6ZSA9IDB4MDsKKwkJCWRhdGFfaW5fc2l6ZSA9IDB4MDsKKwkJfQorCQlpZiAodGFpbF9zaXplKSB7CisJCQlpZiAoaXNfa3ZhID09IHRydWUpIHsKKwkJCQltZW1jcHkoZGNiX3RhYmxlX3B0ci0+dGFpbF9kYXRhLAorCQkJCQkodm9pZCAqKShhcHBfaW5fYWRkcmVzcyArIGRhdGFfaW5fc2l6ZSAtCisJCQkJCXRhaWxfc2l6ZSksIHRhaWxfc2l6ZSk7CisJCQl9IGVsc2UgeworCQkJCS8qIFdlIGhhdmUgdGFpbCBkYXRhIC0gY29weSBpdCB0byBEQ0IgKi8KKwkJCQlpZiAoY29weV9mcm9tX3VzZXIoZGNiX3RhYmxlX3B0ci0+dGFpbF9kYXRhLAorCQkJCQkodm9pZCAqKShhcHBfaW5fYWRkcmVzcyArCisJCQkJCWRhdGFfaW5fc2l6ZSAtIHRhaWxfc2l6ZSksIHRhaWxfc2l6ZSkpIHsKKwkJCQkJZXJyb3IgPSAtRUZBVUxUOworCQkJCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwkJCQl9CisJCQl9CisJCQlpZiAoYXBwX291dF9hZGRyZXNzKQorCQkJCS8qCisJCQkJICogQ2FsY3VsYXRlIHRoZSBvdXRwdXQgYWRkcmVzcworCQkJCSAqIGFjY29yZGluZyB0byB0YWlsIGRhdGEgc2l6ZQorCQkJCSAqLworCQkJCWRjYl90YWJsZV9wdHItPm91dF92cl90YWlsX3B0ID0KKwkJCQkJKHUzMilhcHBfb3V0X2FkZHJlc3MgKyBkYXRhX2luX3NpemUKKwkJCQkJLSB0YWlsX3NpemU7CisKKwkJCS8qIFNhdmUgdGhlIHJlYWwgdGFpbCBkYXRhIHNpemUgKi8KKwkJCWRjYl90YWJsZV9wdHItPnRhaWxfZGF0YV9zaXplID0gdGFpbF9zaXplOworCQkJLyoKKwkJCSAqIFVwZGF0ZSB0aGUgZGF0YSBzaXplIHdpdGhvdXQgdGhlIHRhaWwKKwkJCSAqIGRhdGEgc2l6ZSBBS0EgZGF0YSBmb3IgdGhlIGRtYQorCQkJICovCisJCQlkYXRhX2luX3NpemUgPSAoZGF0YV9pbl9zaXplIC0gdGFpbF9zaXplKTsKKwkJfQorCX0KKwkvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIGJ1aWxkIG9ubHkgaW5wdXQgdGFibGUgb3IgaW5wdXQvb3V0cHV0ICovCisJaWYgKGFwcF9vdXRfYWRkcmVzcykgeworCQkvKiBQcmVwYXJlIGlucHV0L291dHB1dCB0YWJsZXMgKi8KKwkJZXJyb3IgPSBzZXBfcHJlcGFyZV9pbnB1dF9vdXRwdXRfZG1hX3RhYmxlKHNlcCwKKwkJCWFwcF9pbl9hZGRyZXNzLAorCQkJYXBwX291dF9hZGRyZXNzLAorCQkJZGF0YV9pbl9zaXplLAorCQkJYmxvY2tfc2l6ZSwKKwkJCSZpbl9maXJzdF9tbGxpX2FkZHJlc3MsCisJCQkmb3V0X2ZpcnN0X21sbGlfYWRkcmVzcywKKwkJCSZpbl9maXJzdF9udW1fZW50cmllcywKKwkJCSZvdXRfZmlyc3RfbnVtX2VudHJpZXMsCisJCQkmZmlyc3RfZGF0YV9zaXplLAorCQkJaXNfa3ZhKTsKKwl9IGVsc2UgeworCQkvKiBQcmVwYXJlIGlucHV0IHRhYmxlcyAqLworCQllcnJvciA9IHNlcF9wcmVwYXJlX2lucHV0X2RtYV90YWJsZShzZXAsCisJCQlhcHBfaW5fYWRkcmVzcywKKwkJCWRhdGFfaW5fc2l6ZSwKKwkJCWJsb2NrX3NpemUsCisJCQkmaW5fZmlyc3RfbWxsaV9hZGRyZXNzLAorCQkJJmluX2ZpcnN0X251bV9lbnRyaWVzLAorCQkJJmZpcnN0X2RhdGFfc2l6ZSwKKwkJCWlzX2t2YSk7CisJfQorCisJaWYgKGVycm9yKSB7CisJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwgInByZXBhcmUgRE1BIHRhYmxlIGNhbGwgZmFpbGVkIGZyb20gcHJlcGFyZSBEQ0IgY2FsbFxuIik7CisJCWdvdG8gZW5kX2Z1bmN0aW9uOworCX0KKworCS8qIFNldCB0aGUgRENCIHZhbHVlcyAqLworCWRjYl90YWJsZV9wdHItPmlucHV0X21sbGlfYWRkcmVzcyA9IGluX2ZpcnN0X21sbGlfYWRkcmVzczsKKwlkY2JfdGFibGVfcHRyLT5pbnB1dF9tbGxpX251bV9lbnRyaWVzID0gaW5fZmlyc3RfbnVtX2VudHJpZXM7CisJZGNiX3RhYmxlX3B0ci0+aW5wdXRfbWxsaV9kYXRhX3NpemUgPSBmaXJzdF9kYXRhX3NpemU7CisJZGNiX3RhYmxlX3B0ci0+b3V0cHV0X21sbGlfYWRkcmVzcyA9IG91dF9maXJzdF9tbGxpX2FkZHJlc3M7CisJZGNiX3RhYmxlX3B0ci0+b3V0cHV0X21sbGlfbnVtX2VudHJpZXMgPSBvdXRfZmlyc3RfbnVtX2VudHJpZXM7CisJZGNiX3RhYmxlX3B0ci0+b3V0cHV0X21sbGlfZGF0YV9zaXplID0gZmlyc3RfZGF0YV9zaXplOworCitlbmRfZnVuY3Rpb246CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCisJCSJzZXBfcHJlcGFyZV9pbnB1dF9vdXRwdXRfZG1hX3RhYmxlX2luX2RjYiBlbmRcbiIpOworCXJldHVybiBlcnJvcjsKKworfQorCisKKy8qKgorICoJc2VwX2NyZWF0ZV9zeW5jX2RtYV90YWJsZXNfaGFuZGxlciAtIGNyZWF0ZSBzeW5jIERNQSB0YWJsZXMKKyAqCUBzZXA6IHBvaW50ZXIgdG8gc3RydWN0IHNlcF9kZXZpY2UKKyAqCUBhcmc6IHBvaW50ZXIgdG8gc3RydWN0IGJsZF9zeW5fdGFiX3N0cnVjdAorICoKKyAqCUhhbmRsZSB0aGUgcmVxdWVzdCBmb3IgY3JlYXRpb24gb2YgdGhlIERNQSB0YWJsZXMgZm9yIHRoZSBzeW5jaHJvbmljCisgKglzeW1tZXRyaWMgb3BlcmF0aW9ucyAoQUVTLERFUykuIE5vdGUgdGhhdCBhbGwgYnVzIGFkZHJlc3NlcyB0aGF0IGFyZQorICoJcGFzc2VkIHRvIHRoZSBTRVAgYXJlIGluIDMyIGJpdCBmb3JtYXQ7IHRoZSBTRVAgaXMgYSAzMiBiaXQgZGV2aWNlCisgKi8KK3N0YXRpYyBpbnQgc2VwX2NyZWF0ZV9zeW5jX2RtYV90YWJsZXNfaGFuZGxlcihzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwLAorCQkJCQkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IGVycm9yID0gMDsKKworCS8qIENvbW1hbmQgYXJndW1lbnRzICovCisJc3RydWN0IGJsZF9zeW5fdGFiX3N0cnVjdCBjb21tYW5kX2FyZ3M7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKKwkJInNlcF9jcmVhdGVfc3luY19kbWFfdGFibGVzX2hhbmRsZXIgc3RhcnRcbiIpOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjb21tYW5kX2FyZ3MsICh2b2lkIF9fdXNlciAqKWFyZywKKwkJCQkJc2l6ZW9mKHN0cnVjdCBibGRfc3luX3RhYl9zdHJ1Y3QpKSkgeworCQllcnJvciA9IC1FRkFVTFQ7CisJCWdvdG8gZW5kX2Z1bmN0aW9uOworCX0KKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiYXBwX2luX2FkZHJlc3MgaXMgJTA4bGx4XG4iLAorCQkJCQkJY29tbWFuZF9hcmdzLmFwcF9pbl9hZGRyZXNzKTsKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImFwcF9vdXRfYWRkcmVzcyBpcyAlMDhsbHhcbiIsCisJCQkJCQljb21tYW5kX2FyZ3MuYXBwX291dF9hZGRyZXNzKTsKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImRhdGFfc2l6ZSBpcyAldVxuIiwKKwkJCQkJCWNvbW1hbmRfYXJncy5kYXRhX2luX3NpemUpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiYmxvY2tfc2l6ZSBpcyAldVxuIiwKKwkJCQkJCWNvbW1hbmRfYXJncy5ibG9ja19zaXplKTsKKworCS8qIFZhbGlkYXRlIHVzZXIgcGFyYW1ldGVycyAqLworCWlmICghY29tbWFuZF9hcmdzLmFwcF9pbl9hZGRyZXNzKSB7CisJCWVycm9yID0gLUVJTlZBTDsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCisJZXJyb3IgPSBzZXBfcHJlcGFyZV9pbnB1dF9vdXRwdXRfZG1hX3RhYmxlX2luX2RjYihzZXAsCisJCSh1bnNpZ25lZCBsb25nKWNvbW1hbmRfYXJncy5hcHBfaW5fYWRkcmVzcywKKwkJKHVuc2lnbmVkIGxvbmcpY29tbWFuZF9hcmdzLmFwcF9vdXRfYWRkcmVzcywKKwkJY29tbWFuZF9hcmdzLmRhdGFfaW5fc2l6ZSwKKwkJY29tbWFuZF9hcmdzLmJsb2NrX3NpemUsCisJCTB4MCwKKwkJZmFsc2UsCisJCWZhbHNlKTsKKworZW5kX2Z1bmN0aW9uOgorCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX2NyZWF0ZV9zeW5jX2RtYV90YWJsZXNfaGFuZGxlciBlbmRcbiIpOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKglzZXBfZnJlZV9kbWFfdGFibGVzX2FuZF9kY2IgLSBmcmVlIERNQSB0YWJsZXMgYW5kIERDQnMKKyAqCUBzZXA6IHBvaW50ZXIgdG8gc3RydWN0IHNlcF9kZXZpY2UKKyAqCUBpc2FwcGxldDogaW5kaWNhdGVzIGV4dGVybmFsIGFwcGxpY2F0aW9uICh1c2VkIGZvciBrZXJuZWwgYWNjZXNzKQorICoJQGlzX2t2YTogaW5kaWNhdGVzIGtlcm5lbCBhZGRyZXNzZXMgKG9ubHkgdXNlZCBmb3Iga2VybmVsIGNyeXB0bykKKyAqCisgKglUaGlzIGZ1bmN0aW9uIGZyZWVzIHRoZSBETUEgdGFibGVzIGFuZCBEQ0IKKyAqLworc3RhdGljIGludCBzZXBfZnJlZV9kbWFfdGFibGVzX2FuZF9kY2Ioc3RydWN0IHNlcF9kZXZpY2UgKnNlcCwgYm9vbCBpc2FwcGxldCwKKwlib29sIGlzX2t2YSkKK3sKKwlpbnQgaSA9IDA7CisJaW50IGVycm9yID0gMDsKKwlpbnQgZXJyb3JfdGVtcCA9IDA7CisJc3RydWN0IHNlcF9kY2Jsb2NrICpkY2JfdGFibGVfcHRyOworCXVuc2lnbmVkIGxvbmcgcHRfaG9sZDsKKwl2b2lkICp0YWlsX3B0OworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfZnJlZV9kbWFfdGFibGVzX2FuZF9kY2Igc3RhcnRcbiIpOworCisJaWYgKGlzYXBwbGV0ID09IHRydWUpIHsKKwkJLyogU2V0IHBvaW50ZXIgdG8gZmlyc3QgRENCIHRhYmxlICovCisJCWRjYl90YWJsZV9wdHIgPSAoc3RydWN0IHNlcF9kY2Jsb2NrICopCisJCQkoc2VwLT5zaGFyZWRfYWRkciArCisJCQlTRVBfRFJJVkVSX1NZU1RFTV9EQ0JfTUVNT1JZX09GRlNFVF9JTl9CWVRFUyk7CisKKwkJLyogR28gb3ZlciBlYWNoIERDQiBhbmQgc2VlIGlmIHRhaWwgcG9pbnRlciBtdXN0IGJlIHVwZGF0ZWQgKi8KKwkJZm9yIChpID0gMDsgaSA8IHNlcC0+bnJfZGNiX2NyZWF0OyBpKyssIGRjYl90YWJsZV9wdHIrKykgeworCQkJaWYgKGRjYl90YWJsZV9wdHItPm91dF92cl90YWlsX3B0KSB7CisJCQkJcHRfaG9sZCA9ICh1bnNpZ25lZCBsb25nKWRjYl90YWJsZV9wdHItPm91dF92cl90YWlsX3B0OworCQkJCXRhaWxfcHQgPSAodm9pZCAqKXB0X2hvbGQ7CisJCQkJaWYgKGlzX2t2YSA9PSB0cnVlKSB7CisJCQkJCW1lbWNweSh0YWlsX3B0LAorCQkJCQkJZGNiX3RhYmxlX3B0ci0+dGFpbF9kYXRhLAorCQkJCQkJZGNiX3RhYmxlX3B0ci0+dGFpbF9kYXRhX3NpemUpOworCQkJCX0gZWxzZSB7CisJCQkJCWVycm9yX3RlbXAgPSBjb3B5X3RvX3VzZXIoCisJCQkJCQl0YWlsX3B0LAorCQkJCQkJZGNiX3RhYmxlX3B0ci0+dGFpbF9kYXRhLAorCQkJCQkJZGNiX3RhYmxlX3B0ci0+dGFpbF9kYXRhX3NpemUpOworCQkJCX0KKwkJCQlpZiAoZXJyb3JfdGVtcCkgeworCQkJCQkvKiBSZWxlYXNlIHRoZSBETUEgcmVzb3VyY2UgKi8KKwkJCQkJZXJyb3IgPSAtRUZBVUxUOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJLyogRnJlZSB0aGUgb3V0cHV0IHBhZ2VzLCBpZiBhbnkgKi8KKwlzZXBfZnJlZV9kbWFfdGFibGVfZGF0YV9oYW5kbGVyKHNlcCk7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9mcmVlX2RtYV90YWJsZXNfYW5kX2RjYiBlbmRcbiIpOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKglzZXBfZ2V0X3N0YXRpY19wb29sX2FkZHJfaGFuZGxlciAtIGdldCBzdGF0aWMgcG9vbCBhZGRyZXNzCisgKglAc2VwOiBwb2ludGVyIHRvIHN0cnVjdCBzZXBfZGV2aWNlCisgKgorICoJVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBidXMgYW5kIHZpcnR1YWwgYWRkcmVzc2VzIG9mIHRoZSBzdGF0aWMgcG9vbAorICovCitzdGF0aWMgaW50IHNlcF9nZXRfc3RhdGljX3Bvb2xfYWRkcl9oYW5kbGVyKHN0cnVjdCBzZXBfZGV2aWNlICpzZXApCit7CisJdTMyICpzdGF0aWNfcG9vbF9hZGRyID0gTlVMTDsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX2dldF9zdGF0aWNfcG9vbF9hZGRyX2hhbmRsZXIgc3RhcnRcbiIpOworCisJc3RhdGljX3Bvb2xfYWRkciA9ICh1MzIgKikoc2VwLT5zaGFyZWRfYWRkciArCisJCVNFUF9EUklWRVJfU1lTVEVNX1JBUl9NRU1PUllfT0ZGU0VUX0lOX0JZVEVTKTsKKworCXN0YXRpY19wb29sX2FkZHJbMF0gPSBTRVBfU1RBVElDX1BPT0xfVkFMX1RPS0VOOworCXN0YXRpY19wb29sX2FkZHJbMV0gPSAodTMyKXNlcC0+c2hhcmVkX2J1cyArCisJCVNFUF9EUklWRVJfU1RBVElDX0FSRUFfT0ZGU0VUX0lOX0JZVEVTOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzdGF0aWMgcG9vbDogcGh5c2ljYWwgJXhcbiIsCisJCSh1MzIpc3RhdGljX3Bvb2xfYWRkclsxXSk7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9nZXRfc3RhdGljX3Bvb2xfYWRkcl9oYW5kbGVyIGVuZFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglzZXBfc3RhcnRfaGFuZGxlciAtIHN0YXJ0IGRldmljZQorICoJQHNlcDogcG9pbnRlciB0byBzdHJ1Y3Qgc2VwX2RldmljZQorICovCitzdGF0aWMgaW50IHNlcF9zdGFydF9oYW5kbGVyKHN0cnVjdCBzZXBfZGV2aWNlICpzZXApCit7CisJdW5zaWduZWQgbG9uZyByZWdfdmFsOworCXVuc2lnbmVkIGxvbmcgZXJyb3IgPSAwOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfc3RhcnRfaGFuZGxlciBzdGFydFxuIik7CisKKwkvKiBXYWl0IGluIHBvbGxpbmcgZm9yIG1lc3NhZ2UgZnJvbSBTRVAgKi8KKwlkbyB7CisJCXJlZ192YWwgPSBzZXBfcmVhZF9yZWcoc2VwLCBIV19IT1NUX1NFUF9IT1NUX0dQUjNfUkVHX0FERFIpOworCX0gd2hpbGUgKCFyZWdfdmFsKTsKKworCS8qIENoZWNrIHRoZSB2YWx1ZSAqLworCWlmIChyZWdfdmFsID09IDB4MSkKKwkJLyogRmF0YWwgZXJyb3IgLSByZWFkIGVycm9yIHN0YXR1cyBmcm9tIEdQUk8gKi8KKwkJZXJyb3IgPSBzZXBfcmVhZF9yZWcoc2VwLCBIV19IT1NUX1NFUF9IT1NUX0dQUjBfUkVHX0FERFIpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX3N0YXJ0X2hhbmRsZXIgZW5kXG4iKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICoJZXBfY2hlY2tfc3VtX2NhbGMgLSBjaGVja3N1bSBtZXNzYWdlcworICoJQGRhdGE6IGJ1ZmZlciB0byBjaGVja3N1bQorICoJQGxlbmd0aDogYnVmZmVyIHNpemUKKyAqCisgKglUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGEgY2hlY2tzdW0gZm9yIG1lc3NhZ2VzIHRoYXQgYXJlIHNlbnQKKyAqCXRvIHRoZSBTRVAuCisgKi8KK3N0YXRpYyB1MzIgc2VwX2NoZWNrX3N1bV9jYWxjKHU4ICpkYXRhLCB1MzIgbGVuZ3RoKQoreworCXUzMiBzdW0gPSAwOworCXUxNiAqVGRhdGEgPSAodTE2ICopZGF0YTsKKworCXdoaWxlIChsZW5ndGggPiAxKSB7CisJCS8qICBUaGlzIGlzIHRoZSBpbm5lciBsb29wICovCisJCXN1bSArPSAqVGRhdGErKzsKKwkJbGVuZ3RoIC09IDI7CisJfQorCisJLyogIEFkZCBsZWZ0LW92ZXIgYnl0ZSwgaWYgYW55ICovCisJaWYgKGxlbmd0aCA+IDApCisJCXN1bSArPSAqKHU4ICopVGRhdGE7CisKKwkvKiAgRm9sZCAzMi1iaXQgc3VtIHRvIDE2IGJpdHMgKi8KKwl3aGlsZSAoc3VtPj4xNikKKwkJc3VtID0gKHN1bSAmIDB4ZmZmZikgKyAoc3VtID4+IDE2KTsKKworCXJldHVybiB+c3VtICYgMHhGRkZGOworfQorCisvKioKKyAqCXNlcF9pbml0X2hhbmRsZXIgLQorICoJQHNlcDogcG9pbnRlciB0byBzdHJ1Y3Qgc2VwX2RldmljZQorICoJQGFyZzogcGFyYW1ldGVycyBmcm9tIHVzZXIgc3BhY2UgYXBwbGljYXRpb24KKyAqCisgKglIYW5kbGVzIHRoZSByZXF1ZXN0IGZvciBTRVAgaW5pdGlhbGl6YXRpb24KKyAqCU5vdGUgdGhhdCB0aGlzIHdpbGwgZ28gYXdheSBmb3IgTWVkZmllbGQgb25jZSB0aGUgU0NVCisgKglTRVAgaW5pdGlhbGl6YXRpb24gaXMgY29tcGxldGUKKyAqCUFsc28gbm90ZSB0aGF0IHRoZSBtZXNzYWdlIHRvIHRoZSBTRVAgaGFzIGNvbXBvbmVudHMKKyAqCWZyb20gdXNlciBzcGFjZSBhcyB3ZWxsIGFzIGNvbXBvbmVudHMgd3JpdHRlbiBieSB0aGUgZHJpdmVyCisgKglUaGlzIGlzIGJlY3Vhc2UgdGhlIHBvcnRpb25zIG9mIHRoZSBtZXNzYWdlIHRoYXQgcGVydGFpbiB0bworICoJcGh5c2ljYWwgYWRkcmVzc2VzIG11c3QgYmUgc2V0IGJ5IHRoZSBkcml2ZXIgYWZ0ZXIgdGhlIG1lc3NhZ2UKKyAqCWxlYXZlcyBjdXN0b2R5IG9mIHRoZSB1c2VyIHNwYWNlIGFwcGxpY2F0aW9uIGZvciBzZWN1cml0eQorICoJcmVhc29ucy4KKyAqLworc3RhdGljIGludCBzZXBfaW5pdF9oYW5kbGVyKHN0cnVjdCBzZXBfZGV2aWNlICpzZXAsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXUzMiBtZXNzYWdlX2J1ZmZbMTRdOworCXUzMiBjb3VudGVyOworCWludCBlcnJvciA9IDA7CisJdTMyIHJlZ192YWw7CisJZG1hX2FkZHJfdCBuZXdfYmFzZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgYWRkcl9ob2xkOworCXN0cnVjdCBpbml0X3N0cnVjdCBjb21tYW5kX2FyZ3M7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9pbml0X2hhbmRsZXIgc3RhcnRcbiIpOworCisJLyogTWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBub3QgaW5pdGlhbGl6ZWQgYWxyZWFkeSAqLworCXJlZ192YWwgPSBzZXBfcmVhZF9yZWcoc2VwLCBIV19IT1NUX1NFUF9IT1NUX0dQUjNfUkVHX0FERFIpOworCisJaWYgKHJlZ192YWwgIT0gMHgyKSB7CisJCWVycm9yID0gU0VQX0FMUkVBRFlfSU5JVElBTElaRURfRVJSOworCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsICJpbml0OyBkZXZpY2UgYWxyZWFkeSBpbml0aWFsaXplZFxuIik7CisJCWdvdG8gZW5kX2Z1bmN0aW9uOworCX0KKworCS8qIE9ubHkgcm9vdCBjYW4gaW5pdGlhbGl6ZSAqLworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgeworCQllcnJvciA9IC1FQUNDRVM7CisJCWdvdG8gZW5kX2Z1bmN0aW9uOworCX0KKworCS8qIENvcHkgaW4gdGhlIHBhcmFtZXRlcnMgKi8KKwllcnJvciA9IGNvcHlfZnJvbV91c2VyKCZjb21tYW5kX2FyZ3MsICh2b2lkIF9fdXNlciAqKWFyZywKKwkJc2l6ZW9mKHN0cnVjdCBpbml0X3N0cnVjdCkpOworCisJaWYgKGVycm9yKSB7CisJCWVycm9yID0gLUVGQVVMVDsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCisJLyogVmFsaWRhdGUgcGFyYW1ldGVycyAqLworCWlmICghY29tbWFuZF9hcmdzLm1lc3NhZ2VfYWRkciB8fCAhY29tbWFuZF9hcmdzLnNlcF9zcmFtX2FkZHIgfHwKKwkJY29tbWFuZF9hcmdzLm1lc3NhZ2Vfc2l6ZV9pbl93b3JkcyA+IDE0KSB7CisJCWVycm9yID0gLUVJTlZBTDsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCisJLyogQ29weSBpbiB0aGUgU0VQIGluaXQgbWVzc2FnZSAqLworCWFkZHJfaG9sZCA9ICh1bnNpZ25lZCBsb25nKWNvbW1hbmRfYXJncy5tZXNzYWdlX2FkZHI7CisJZXJyb3IgPSBjb3B5X2Zyb21fdXNlcihtZXNzYWdlX2J1ZmYsCisJCSh2b2lkIF9fdXNlciAqKWFkZHJfaG9sZCwKKwkJY29tbWFuZF9hcmdzLm1lc3NhZ2Vfc2l6ZV9pbl93b3JkcypzaXplb2YodTMyKSk7CisKKwlpZiAoZXJyb3IpIHsKKwkJZXJyb3IgPSAtRUZBVUxUOworCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwl9CisKKwkvKiBMb2FkIHJlc2lkZW50LCBjYWNoZSwgYW5kIGV4dGFwcCBmaXJtd2FyZSAqLworCWVycm9yID0gc2VwX2xvYWRfZmlybXdhcmUoc2VwKTsKKworCWlmIChlcnJvcikgeworCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsCisJCQkiaW5pdDsgY29weSBTRVAgaW5pdCBtZXNzYWdlIGZhaWxlZCAleFxuIiwgZXJyb3IpOworCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwl9CisKKwkvKiBDb21wdXRlIHRoZSBiYXNlIGFkZHJlc3MgKi8KKwluZXdfYmFzZV9hZGRyID0gc2VwLT5zaGFyZWRfYnVzOworCisJaWYgKHNlcC0+cmVzaWRlbnRfYnVzIDwgbmV3X2Jhc2VfYWRkcikKKwkJbmV3X2Jhc2VfYWRkciA9IHNlcC0+cmVzaWRlbnRfYnVzOworCisJaWYgKHNlcC0+Y2FjaGVfYnVzIDwgbmV3X2Jhc2VfYWRkcikKKwkJbmV3X2Jhc2VfYWRkciA9IHNlcC0+Y2FjaGVfYnVzOworCisJaWYgKHNlcC0+ZGNhY2hlX2J1cyA8IG5ld19iYXNlX2FkZHIpCisJCW5ld19iYXNlX2FkZHIgPSBzZXAtPmRjYWNoZV9idXM7CisKKwkvKiBQdXQgcGh5c2ljYWwgYWRkcmVzc2VzIGluIFNFUCBtZXNzYWdlICovCisJbWVzc2FnZV9idWZmWzNdID0gKHUzMiluZXdfYmFzZV9hZGRyOworCW1lc3NhZ2VfYnVmZls0XSA9ICh1MzIpc2VwLT5zaGFyZWRfYnVzOworCW1lc3NhZ2VfYnVmZls2XSA9ICh1MzIpc2VwLT5yZXNpZGVudF9idXM7CisJbWVzc2FnZV9idWZmWzddID0gKHUzMilzZXAtPmNhY2hlX2J1czsKKwltZXNzYWdlX2J1ZmZbOF0gPSAodTMyKXNlcC0+ZGNhY2hlX2J1czsKKworCW1lc3NhZ2VfYnVmZltjb21tYW5kX2FyZ3MubWVzc2FnZV9zaXplX2luX3dvcmRzIC0gMV0gPSAweDA7CisJbWVzc2FnZV9idWZmW2NvbW1hbmRfYXJncy5tZXNzYWdlX3NpemVfaW5fd29yZHMgLSAxXSA9CisJCXNlcF9jaGVja19zdW1fY2FsYygodTggKiltZXNzYWdlX2J1ZmYsCisJCWNvbW1hbmRfYXJncy5tZXNzYWdlX3NpemVfaW5fd29yZHMqc2l6ZW9mKHUzMikpOworCisJLyogRGVidWcgcHJpbnQgb2YgbWVzc2FnZSAqLworCWZvciAoY291bnRlciA9IDA7IGNvdW50ZXIgPCBjb21tYW5kX2FyZ3MubWVzc2FnZV9zaXplX2luX3dvcmRzOworCQkJCQkJCQljb3VudGVyKyspCisJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiaW5pdDsgU0VQIG1lc3NhZ2Ugd29yZCAlZCBpcyAleFxuIiwKKwkJCWNvdW50ZXIsIG1lc3NhZ2VfYnVmZltjb3VudGVyXSk7CisKKwkvKiBUZWxsIHRoZSBTRVAgdGhlIHNyYW0gYWRkcmVzcyAqLworCXNlcF93cml0ZV9yZWcoc2VwLCBIV19TUkFNX0FERFJfUkVHX0FERFIsIGNvbW1hbmRfYXJncy5zZXBfc3JhbV9hZGRyKTsKKworCS8qIFB1c2ggdGhlIG1lc3NhZ2UgdG8gdGhlIFNFUCAqLworCWZvciAoY291bnRlciA9IDA7IGNvdW50ZXIgPCBjb21tYW5kX2FyZ3MubWVzc2FnZV9zaXplX2luX3dvcmRzOworCQkJCQkJCQljb3VudGVyKyspIHsKKwkJc2VwX3dyaXRlX3JlZyhzZXAsIEhXX1NSQU1fREFUQV9SRUdfQUREUiwKKwkJCQkJCW1lc3NhZ2VfYnVmZltjb3VudGVyXSk7CisJCXNlcF93YWl0X3NyYW1fd3JpdGUoc2VwKTsKKwl9CisKKwkvKiBTaWduYWwgU0VQIHRoYXQgbWVzc2FnZSBpcyByZWFkeSBhbmQgdG8gaW5pdCAqLworCXNlcF93cml0ZV9yZWcoc2VwLCBIV19IT1NUX0hPU1RfU0VQX0dQUjBfUkVHX0FERFIsIDB4MSk7CisKKwkvKiBXYWl0IGZvciBhY2tub3dsZWRnZSAqLworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiaW5pdDsgd2FpdGluZyBmb3IgbXNnIHJlc3BvbnNlXG4iKTsKKworCWRvIHsKKwkJcmVnX3ZhbCA9IHNlcF9yZWFkX3JlZyhzZXAsIEhXX0hPU1RfU0VQX0hPU1RfR1BSM19SRUdfQUREUik7CisJfSB3aGlsZSAoIShyZWdfdmFsICYgMHhGRkZGRkZGRCkpOworCisJaWYgKHJlZ192YWwgPT0gMHgxKSB7CisJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwgImluaXQ7IGRldmljZSBpbnQgZmFpbGVkXG4iKTsKKwkJZXJyb3IgPSBzZXBfcmVhZF9yZWcoc2VwLCAweDgwNjApOworCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsICJpbml0OyBzdyBtb25pdG9yIGlzICV4XG4iLCBlcnJvcik7CisJCWVycm9yID0gc2VwX3JlYWRfcmVnKHNlcCwgSFdfSE9TVF9TRVBfSE9TVF9HUFIwX1JFR19BRERSKTsKKwkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LCAiaW5pdDsgZXJyb3IgaXMgJXhcbiIsIGVycm9yKTsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiaW5pdDsgZW5kIENDIElOSVQsIHJlZ192YWwgaXMgJXhcbiIsIHJlZ192YWwpOworCisJLyogU2lnbmFsIFNFUCB0byB6ZXJvIHRoZSBHUFIzICovCisJc2VwX3dyaXRlX3JlZyhzZXAsIEhXX0hPU1RfSE9TVF9TRVBfR1BSMF9SRUdfQUREUiwgMHgxMCk7CisKKwkvKiBXYWl0IGZvciByZXNwb25zZSAqLworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiaW5pdDsgd2FpdGluZyBmb3IgemVybyBzZXQgcmVzcG9uc2VcbiIpOworCisJZG8geworCQlyZWdfdmFsID0gc2VwX3JlYWRfcmVnKHNlcCwgSFdfSE9TVF9TRVBfSE9TVF9HUFIzX1JFR19BRERSKTsKKwl9IHdoaWxlIChyZWdfdmFsICE9IDApOworCitlbmRfZnVuY3Rpb246CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJpbml0IGlzIGRvbmVcbiIpOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKglzZXBfZW5kX3RyYW5zYWN0aW9uX2hhbmRsZXIgLSBlbmQgdHJhbnNhY3Rpb24KKyAqCUBzZXA6IHBvaW50ZXIgdG8gc3RydWN0IHNlcF9kZXZpY2UKKyAqCisgKglUaGlzIEFQSSBoYW5kbGVzIHRoZSBlbmQgdHJhbnNhY3Rpb24gcmVxdWVzdAorICovCitzdGF0aWMgaW50IHNlcF9lbmRfdHJhbnNhY3Rpb25faGFuZGxlcihzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwKQoreworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX2VuZF90cmFuc2FjdGlvbl9oYW5kbGVyIHN0YXJ0XG4iKTsKKworCS8qIENsZWFyIHRoZSBkYXRhIHBvb2wgcG9pbnRlcnMgVG9rZW4gKi8KKwltZW1zZXQoKHZvaWQgKikoc2VwLT5zaGFyZWRfYWRkciArCisJCVNFUF9EUklWRVJfREFUQV9QT09MX0FMTE9DQVRJT05fT0ZGU0VUX0lOX0JZVEVTKSwKKwkJMCwgc2VwLT5udW1fb2ZfZGF0YV9hbGxvY2F0aW9ucyoyKnNpemVvZih1MzIpKTsKKworCS8qIENoZWNrIHRoYXQgYWxsIHRoZSBETUEgcmVzb3VyY2VzIHdlcmUgZnJlZWQgKi8KKwlzZXBfZnJlZV9kbWFfdGFibGVfZGF0YV9oYW5kbGVyKHNlcCk7CisKKwljbGVhcl9iaXQoU0VQX01NQVBfTE9DS19CSVQsICZzZXAtPmluX3VzZV9mbGFncyk7CisKKwkvKgorCSAqIFdlIGFyZSBub3cgdGhyb3VnaCB3aXRoIHRoZSB0cmFuc2FjdGlvbi4gTGV0J3MKKwkgKiBhbGxvdyBvdGhlciBwcm9jZXNzZXMgd2hvIGhhdmUgdGhlIGRldmljZSBvcGVuCisJICogdG8gcGVyZm9ybSB0cmFuc2FjdGlvbnMKKwkgKi8KKwltdXRleF9sb2NrKCZzZXAtPnNlcF9tdXRleCk7CisJc2VwLT5waWRfZG9pbmdfdHJhbnNhY3Rpb24gPSAwOworCW11dGV4X3VubG9jaygmc2VwLT5zZXBfbXV0ZXgpOworCS8qIFJhaXNlIGV2ZW50IGZvciBzdHVjayBjb250ZXh0ZXMgKi8KKwl3YWtlX3VwKCZzZXAtPmV2ZW50KTsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAid2FraW5nIHVwIGV2ZW50XG4iKTsKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9lbmRfdHJhbnNhY3Rpb25faGFuZGxlciBlbmRcbiIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJc2VwX3ByZXBhcmVfZGNiX2hhbmRsZXIgLSBwcmVwYXJlIGEgY29udHJvbCBibG9jaworICoJQHNlcDogcG9pbnRlciB0byBzdHJ1Y3Qgc2VwX2RldmljZQorICoJQGFyZzogcG9pbnRlciB0byB1c2VyIHBhcmFtZXRlcnMKKyAqCisgKglUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0cmlldmUgdGhlIFJBUiBidWZmZXIgcGh5c2ljYWwgYWRkcmVzc2VzLCB0eXBlCisgKgkmIHNpemUgY29ycmVzcG9uZGluZyB0byB0aGUgUkFSIGhhbmRsZXMgcHJvdmlkZWQgaW4gdGhlIGJ1ZmZlcnMgdmVjdG9yLgorICovCitzdGF0aWMgaW50IHNlcF9wcmVwYXJlX2RjYl9oYW5kbGVyKHN0cnVjdCBzZXBfZGV2aWNlICpzZXAsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCBlcnJvcjsKKwkvKiBDb21tYW5kIGFyZ3VtZW50cyAqLworCXN0cnVjdCBidWlsZF9kY2Jfc3RydWN0IGNvbW1hbmRfYXJnczsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX3ByZXBhcmVfZGNiX2hhbmRsZXIgc3RhcnRcbiIpOworCisJLyogR2V0IHRoZSBjb21tYW5kIGFyZ3VtZW50cyAqLworCWlmIChjb3B5X2Zyb21fdXNlcigmY29tbWFuZF9hcmdzLCAodm9pZCBfX3VzZXIgKilhcmcsCisJCQkJCXNpemVvZihzdHJ1Y3QgYnVpbGRfZGNiX3N0cnVjdCkpKSB7CisJCWVycm9yID0gLUVGQVVMVDsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJhcHBfaW5fYWRkcmVzcyBpcyAlMDhsbHhcbiIsCisJCQkJCQljb21tYW5kX2FyZ3MuYXBwX2luX2FkZHJlc3MpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiYXBwX291dF9hZGRyZXNzIGlzICUwOGxseFxuIiwKKwkJCQkJCWNvbW1hbmRfYXJncy5hcHBfb3V0X2FkZHJlc3MpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiZGF0YV9zaXplIGlzICV4XG4iLAorCQkJCQkJY29tbWFuZF9hcmdzLmRhdGFfaW5fc2l6ZSk7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJibG9ja19zaXplIGlzICV4XG4iLAorCQkJCQkJY29tbWFuZF9hcmdzLmJsb2NrX3NpemUpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAidGFpbCBibG9ja19zaXplIGlzICV4XG4iLAorCQkJCQkJY29tbWFuZF9hcmdzLnRhaWxfYmxvY2tfc2l6ZSk7CisKKwllcnJvciA9IHNlcF9wcmVwYXJlX2lucHV0X291dHB1dF9kbWFfdGFibGVfaW5fZGNiKHNlcCwKKwkJKHVuc2lnbmVkIGxvbmcpY29tbWFuZF9hcmdzLmFwcF9pbl9hZGRyZXNzLAorCQkodW5zaWduZWQgbG9uZyljb21tYW5kX2FyZ3MuYXBwX291dF9hZGRyZXNzLAorCQljb21tYW5kX2FyZ3MuZGF0YV9pbl9zaXplLCBjb21tYW5kX2FyZ3MuYmxvY2tfc2l6ZSwKKwkJY29tbWFuZF9hcmdzLnRhaWxfYmxvY2tfc2l6ZSwgdHJ1ZSwgZmFsc2UpOworCitlbmRfZnVuY3Rpb246CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfcHJlcGFyZV9kY2JfaGFuZGxlciBlbmRcbiIpOworCXJldHVybiBlcnJvcjsKKworfQorCisvKioKKyAqCXNlcF9mcmVlX2RjYl9oYW5kbGVyIC0gZnJlZSBjb250cm9sIGJsb2NrIHJlc291cmNlcworICoJQHNlcDogcG9pbnRlciB0byBzdHJ1Y3Qgc2VwX2RldmljZQorICoKKyAqCVRoaXMgZnVuY3Rpb24gZnJlZXMgdGhlIERDQiByZXNvdXJjZXMgYW5kIHVwZGF0ZXMgdGhlIG5lZWRlZAorICoJdXNlci1zcGFjZSBidWZmZXJzLgorICovCitzdGF0aWMgaW50IHNlcF9mcmVlX2RjYl9oYW5kbGVyKHN0cnVjdCBzZXBfZGV2aWNlICpzZXApCit7CisJaW50IGVycm9yIDsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX3ByZXBhcmVfZGNiX2hhbmRsZXIgc3RhcnRcbiIpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAibnVtIG9mIERDQnMgJXhcbiIsIHNlcC0+bnJfZGNiX2NyZWF0KTsKKworCWVycm9yID0gc2VwX2ZyZWVfZG1hX3RhYmxlc19hbmRfZGNiKHNlcCwgZmFsc2UsIGZhbHNlKTsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX2ZyZWVfZGNiX2hhbmRsZXIgZW5kXG4iKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICoJc2VwX3Jhcl9wcmVwYXJlX291dHB1dF9tc2dfaGFuZGxlciAtIHByZXBhcmUgYW4gb3V0cHV0IG1lc3NhZ2UKKyAqCUBzZXA6IHBvaW50ZXIgdG8gc3RydWN0IHNlcF9kZXZpY2UKKyAqCUBhcmc6IHBvaW50ZXIgdG8gdXNlciBwYXJhbWV0ZXJzCisgKgorICoJVGhpcyBmdW5jdGlvbiB3aWxsIHJldHJpZXZlIHRoZSBSQVIgYnVmZmVyIHBoeXNpY2FsIGFkZHJlc3NlcywgdHlwZQorICoJJiBzaXplIGNvcnJlc3BvbmRpbmcgdG8gdGhlIFJBUiBoYW5kbGVzIHByb3ZpZGVkIGluIHRoZSBidWZmZXJzIHZlY3Rvci4KKyAqLworc3RhdGljIGludCBzZXBfcmFyX3ByZXBhcmVfb3V0cHV0X21zZ19oYW5kbGVyKHN0cnVjdCBzZXBfZGV2aWNlICpzZXAsCisJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IGVycm9yID0gMDsKKwkvKiBDb21tYW5kIGFyZ3MgKi8KKwlzdHJ1Y3QgcmFyX2huZGxfdG9fYnVzX3N0cnVjdCBjb21tYW5kX2FyZ3M7CisJc3RydWN0IFJBUl9idWZmZXIgcmFyX2J1ZjsKKwkvKiBCdXMgYWRkcmVzcyAqLworCWRtYV9hZGRyX3QgIHJhcl9idXMgPSAwOworCS8qIEhvbGRzIHRoZSBSQVIgYWRkcmVzcyBpbiB0aGUgc3lzdGVtIG1lbW9yeSBvZmZzZXQgKi8KKwl1MzIgKnJhcl9hZGRyOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfcmFyX3ByZXBhcmVfb3V0cHV0X21zZ19oYW5kbGVyIHN0YXJ0XG4iKTsKKworCS8qIENvcHkgdGhlIGRhdGEgKi8KKwlpZiAoY29weV9mcm9tX3VzZXIoJmNvbW1hbmRfYXJncywgKHZvaWQgX191c2VyICopYXJnLAorCQkJCQkJc2l6ZW9mKGNvbW1hbmRfYXJncykpKSB7CisJCWVycm9yID0gLUVGQVVMVDsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCisJLyogQ2FsbCB0byB0cmFuc2xhdGlvbiBmdW5jdGlvbiBvbmx5IGlmIHVzZXIgaGFuZGxlIGlzIG5vdCBOVUxMICovCisJaWYgKGNvbW1hbmRfYXJncy5yYXJfaGFuZGxlKSB7CisJCW1lbXNldCgmcmFyX2J1ZiwgMCwgc2l6ZW9mKHJhcl9idWYpKTsKKwkJcmFyX2J1Zi5pbmZvLmhhbmRsZSA9ICh1MzIpY29tbWFuZF9hcmdzLnJhcl9oYW5kbGU7CisKKwkJaWYgKHJhcl9oYW5kbGVfdG9fYnVzKCZyYXJfYnVmLCAxKSAhPSAxKSB7CisJCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInJhcl9oYW5kbGVfdG9fYnVzIGZhaWx1cmVcbiIpOworCQkJZXJyb3IgPSAtRUZBVUxUOworCQkJZ290byBlbmRfZnVuY3Rpb247CisJCX0KKwkJcmFyX2J1cyA9IHJhcl9idWYuYnVzX2FkZHJlc3M7CisJfQorCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAicmFyIG1zZzsgcmFyX2FkZHJfYnVzID0gJXhcbiIsICh1MzIpcmFyX2J1cyk7CisKKwkvKiBTZXQgdmFsdWUgaW4gdGhlIFNZU1RFTSBNRU1PUlkgb2Zmc2V0ICovCisJcmFyX2FkZHIgPSAodTMyICopKHNlcC0+c2hhcmVkX2FkZHIgKworCQlTRVBfRFJJVkVSX1NZU1RFTV9SQVJfTUVNT1JZX09GRlNFVF9JTl9CWVRFUyk7CisKKwkvKiBDb3B5IHRoZSBwaHlzaWNhbCBhZGRyZXNzIHRvIHRoZSBTeXN0ZW0gQXJlYSBmb3IgdGhlIFNFUCAqLworCXJhcl9hZGRyWzBdID0gU0VQX1JBUl9WQUxfVE9LRU47CisJcmFyX2FkZHJbMV0gPSByYXJfYnVzOworCitlbmRfZnVuY3Rpb246CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfcmFyX3ByZXBhcmVfb3V0cHV0X21zZ19oYW5kbGVyIHN0YXJ0XG4iKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICoJc2VwX3JlYWxsb2NfZXh0X2NhY2hlX2hhbmRsZXIgLSByZXBvcnQgbG9jYXRpb24gb2YgZXh0Y2FjaGUKKyAqCUBzZXA6IHBvaW50ZXIgdG8gc3RydWN0IHNlcF9kZXZpY2UKKyAqCUBhcmc6IHBvaW50ZXIgdG8gdXNlciBwYXJhbWV0ZXJzCisgKgorICoJVGhpcyBmdW5jdGlvbiB0ZWxscyB0aGUgU0VQIHdoZXJlIHRoZSBleHRhcHAgaXMgbG9jYXRlZAorICovCitzdGF0aWMgaW50IHNlcF9yZWFsbG9jX2V4dF9jYWNoZV9oYW5kbGVyKHN0cnVjdCBzZXBfZGV2aWNlICpzZXAsCisJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJLyogSG9sZHMgdGhlIG5ldyBleHQgY2FjaGUgYWRkcmVzcyBpbiB0aGUgc3lzdGVtIG1lbW9yeSBvZmZzZXQgKi8KKwl1MzIgKnN5c3RlbV9hZGRyOworCisJLyogU2V0IHZhbHVlIGluIHRoZSBTWVNURU0gTUVNT1JZIG9mZnNldCAqLworCXN5c3RlbV9hZGRyID0gKHUzMiAqKShzZXAtPnNoYXJlZF9hZGRyICsKKwkJU0VQX0RSSVZFUl9TWVNURU1fRVhUX0NBQ0hFX0FERFJfT0ZGU0VUX0lOX0JZVEVTKTsKKworCS8qIENvcHkgdGhlIHBoeXNpY2FsIGFkZHJlc3MgdG8gdGhlIFN5c3RlbSBBcmVhIGZvciB0aGUgU0VQICovCisJc3lzdGVtX2FkZHJbMF0gPSBTRVBfRVhUX0NBQ0hFX0FERFJfVkFMX1RPS0VOOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiZXh0IGNhY2hlIGluaXQ7IHN5c3RlbSBhZGRyIDAgaXMgJXhcbiIsCisJCQkJCQkJc3lzdGVtX2FkZHJbMF0pOworCXN5c3RlbV9hZGRyWzFdID0gc2VwLT5leHRhcHBfYnVzOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiZXh0IGNhY2hlIGluaXQ7IHN5c3RlbSBhZGRyIDEgaXMgJXhcbiIsCisJCQkJCQkJc3lzdGVtX2FkZHJbMV0pOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJc2VwX2lvY3RsIC0gaW9jdGwgYXBpCisgKglAZmlscDogcG9pbnRlciB0byBzdHJ1Y3QgZmlsZQorICoJQGNtZDogY29tbWFuZAorICoJQGFyZzogcG9pbnRlciB0byBhcmd1bWVudCBzdHJ1Y3R1cmUKKyAqCisgKglJbXBsZW1lbnQgdGhlIGlvY3RsIG1ldGhvZHMgYXZhaWxibGUgb24gdGhlIFNFUCBkZXZpY2UuCisgKi8KK3N0YXRpYyBsb25nIHNlcF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IGVycm9yID0gMDsKKwlzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJpb2N0bCBzdGFydFxuIik7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImNtZCBpcyAleFxuIiwgY21kKTsKKworCS8qIE1ha2Ugc3VyZSB3ZSBvd24gdGhpcyBkZXZpY2UgKi8KKwltdXRleF9sb2NrKCZzZXAtPnNlcF9tdXRleCk7CisJaWYgKChjdXJyZW50LT5waWQgIT0gc2VwLT5waWRfZG9pbmdfdHJhbnNhY3Rpb24pICYmCisJCQkJKHNlcC0+cGlkX2RvaW5nX3RyYW5zYWN0aW9uICE9IDApKSB7CisJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiaW9jdGwgcGlkIGlzIG5vdCBvd25lclxuIik7CisJCW11dGV4X3VubG9jaygmc2VwLT5zZXBfbXV0ZXgpOworCQllcnJvciA9IC1FQUNDRVM7CisJCWdvdG8gZW5kX2Z1bmN0aW9uOworCX0KKworCW11dGV4X3VubG9jaygmc2VwLT5zZXBfbXV0ZXgpOworCisJLyogQ2hlY2sgdGhhdCB0aGUgY29tbWFuZCBpcyBmb3IgU0VQIGRldmljZSAqLworCWlmIChfSU9DX1RZUEUoY21kKSAhPSBTRVBfSU9DX01BR0lDX05VTUJFUikgeworCQllcnJvciA9IC1FTk9UVFk7CisJCWdvdG8gZW5kX2Z1bmN0aW9uOworCX0KKworCS8qIExvY2sgdG8gcHJldmVudCB0aGUgZGFlbW9uIHRvIGludGVyZmVyZSB3aXRoIG9wZXJhdGlvbiAqLworCW11dGV4X2xvY2soJnNlcC0+aW9jdGxfbXV0ZXgpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNFUF9JT0NTRU5EU0VQQ09NTUFORDoKKwkJLyogU2VuZCBjb21tYW5kIHRvIFNFUCAqLworCQllcnJvciA9IHNlcF9zZW5kX2NvbW1hbmRfaGFuZGxlcihzZXApOworCQlicmVhazsKKwljYXNlIFNFUF9JT0NBTExPQ0RBVEFQT0xMOgorCQkvKiBBbGxvY2F0ZSBkYXRhIHBvb2wgKi8KKwkJZXJyb3IgPSBzZXBfYWxsb2NhdGVfZGF0YV9wb29sX21lbW9yeV9oYW5kbGVyKHNlcCwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBTRVBfSU9DQ1JFQVRFU1lNRE1BVEFCTEU6CisJCS8qIENyZWF0ZSBETUEgdGFibGUgZm9yIHN5bmhyb25pYyBvcGVyYXRpb24gKi8KKwkJZXJyb3IgPSBzZXBfY3JlYXRlX3N5bmNfZG1hX3RhYmxlc19oYW5kbGVyKHNlcCwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBTRVBfSU9DRlJFRURNQVRBQkxFREFUQToKKwkJLyogRnJlZSB0aGUgcGFnZXMgKi8KKwkJZXJyb3IgPSBzZXBfZnJlZV9kbWFfdGFibGVfZGF0YV9oYW5kbGVyKHNlcCk7CisJCWJyZWFrOworCWNhc2UgU0VQX0lPQ1NFUFNUQVJUOgorCQkvKiBTdGFydCBjb21tYW5kIHRvIFNFUCAqLworCQlpZiAoc2VwLT5wZGV2LT5yZXZpc2lvbiA9PSAwKSAvKiBPbmx5IGZvciBvbGQgY2hpcCAqLworCQkJZXJyb3IgPSBzZXBfc3RhcnRfaGFuZGxlcihzZXApOworCQllbHNlCisJCQllcnJvciA9IC1FUEVSTTsgLyogTm90IHBlcm1pdHRlZCBvbiBuZXcgY2hpcCAqLworCQlicmVhazsKKwljYXNlIFNFUF9JT0NTRVBJTklUOgorCQkvKiBJbml0IGNvbW1hbmQgdG8gU0VQICovCisJCWlmIChzZXAtPnBkZXYtPnJldmlzaW9uID09IDApIC8qIE9ubHkgZm9yIG9sZCBjaGlwICovCisJCQllcnJvciA9IHNlcF9pbml0X2hhbmRsZXIoc2VwLCBhcmcpOworCQllbHNlCisJCQllcnJvciA9IC1FUEVSTTsgLyogTm90IHBlcm1pdHRlZCBvbiBuZXcgY2hpcCAqLworCQlicmVhazsKKwljYXNlIFNFUF9JT0NHRVRTVEFUSUNQT09MQUREUjoKKwkJLyogSW5mb3JtIHRoZSBTRVAgdGhlIGJ1cyBhZGRyZXNzIG9mIHRoZSBzdGF0aWMgcG9vbCAqLworCQllcnJvciA9IHNlcF9nZXRfc3RhdGljX3Bvb2xfYWRkcl9oYW5kbGVyKHNlcCk7CisJCWJyZWFrOworCWNhc2UgU0VQX0lPQ0VORFRSQU5TQUNUSU9OOgorCQllcnJvciA9IHNlcF9lbmRfdHJhbnNhY3Rpb25faGFuZGxlcihzZXApOworCQlicmVhazsKKwljYXNlIFNFUF9JT0NSRUFMTE9DRVhUQ0FDSEU6CisJCWlmIChzZXAtPnBkZXYtPnJldmlzaW9uID09IDApIC8qIE9ubHkgZm9yIG9sZCBjaGlwICovCisJCQllcnJvciA9IHNlcF9yZWFsbG9jX2V4dF9jYWNoZV9oYW5kbGVyKHNlcCwgYXJnKTsKKwkJZWxzZQorCQkJZXJyb3IgPSAtRVBFUk07IC8qIE5vdCBwZXJtaXR0ZWQgb24gbmV3IGNoaXAgKi8KKwkJYnJlYWs7CisJY2FzZSBTRVBfSU9DUkFSUFJFUEFSRU1FU1NBR0U6CisJCWVycm9yID0gc2VwX3Jhcl9wcmVwYXJlX291dHB1dF9tc2dfaGFuZGxlcihzZXAsIGFyZyk7CisJCWJyZWFrOworCWNhc2UgU0VQX0lPQ1BSRVBBUkVEQ0I6CisJCWVycm9yID0gc2VwX3ByZXBhcmVfZGNiX2hhbmRsZXIoc2VwLCBhcmcpOworCQlicmVhazsKKwljYXNlIFNFUF9JT0NGUkVFRENCOgorCQllcnJvciA9IHNlcF9mcmVlX2RjYl9oYW5kbGVyKHNlcCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiaW52YWxpZCBpb2N0bCAleFxuIiwgY21kKTsKKwkJZXJyb3IgPSAtRU5PVFRZOworCQlicmVhazsKKwl9CisJbXV0ZXhfdW5sb2NrKCZzZXAtPmlvY3RsX211dGV4KTsKKworZW5kX2Z1bmN0aW9uOgorCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiaW9jdGwgZW5kXG4iKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICoJc2VwX3NpbmdsZXRvbl9pb2N0bCAtIGlvY3RsIGFwaSBmb3Igc2luZ2xldG9uIGludGVyZmFjZQorICoJQGZpbHA6IHBvaW50ZXIgdG8gc3RydWN0IGZpbGUKKyAqCUBjbWQ6IGNvbW1hbmQKKyAqCUBhcmc6IHBvaW50ZXIgdG8gYXJndW1lbnQgc3RydWN0dXJlCisgKgorICoJSW1wbGVtZW50IHRoZSBhZGRpdGlvbmFsIGlvY3RscyBmb3IgdGhlIHNpbmdsZXRvbiBkZXZpY2UKKyAqLworc3RhdGljIGxvbmcgc2VwX3NpbmdsZXRvbl9pb2N0bChzdHJ1Y3QgZmlsZSAgKmZpbHAsIHUzMiBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWxvbmcgZXJyb3IgPSAwOworCXN0cnVjdCBzZXBfZGV2aWNlICpzZXAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNpbmdsZXRvbl9pb2N0bCBzdGFydFxuIik7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJjbWQgaXMgJXhcbiIsIGNtZCk7CisKKwkvKiBDaGVjayB0aGF0IHRoZSBjb21tYW5kIGlzIGZvciB0aGUgU0VQIGRldmljZSAqLworCWlmIChfSU9DX1RZUEUoY21kKSAhPSBTRVBfSU9DX01BR0lDX05VTUJFUikgeworCQllcnJvciA9ICAtRU5PVFRZOworCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwl9CisKKwkvKiBNYWtlIHN1cmUgd2Ugb3duIHRoaXMgZGV2aWNlICovCisJbXV0ZXhfbG9jaygmc2VwLT5zZXBfbXV0ZXgpOworCWlmICgoY3VycmVudC0+cGlkICE9IHNlcC0+cGlkX2RvaW5nX3RyYW5zYWN0aW9uKSAmJgorCQkJCShzZXAtPnBpZF9kb2luZ190cmFuc2FjdGlvbiAhPSAwKSkgeworCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNpbmdsZXRvbiBpb2N0bCBwaWQgaXMgbm90IG93bmVyXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZzZXAtPnNlcF9tdXRleCk7CisJCWVycm9yID0gLUVBQ0NFUzsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCisJbXV0ZXhfdW5sb2NrKCZzZXAtPnNlcF9tdXRleCk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0VQX0lPQ1RMU0VUQ0FMTEVSSUQ6CisJCW11dGV4X2xvY2soJnNlcC0+aW9jdGxfbXV0ZXgpOworCQllcnJvciA9IHNlcF9zZXRfY2FsbGVyX2lkX2hhbmRsZXIoc2VwLCBhcmcpOworCQltdXRleF91bmxvY2soJnNlcC0+aW9jdGxfbXV0ZXgpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnJvciA9IHNlcF9pb2N0bChmaWxwLCBjbWQsIGFyZyk7CisJCWJyZWFrOworCX0KKworZW5kX2Z1bmN0aW9uOgorCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2luZ2xldG9uIGlvY3RsIGVuZFxuIik7CisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqCXNlcF9yZXF1ZXN0X2RhZW1vbl9pb2N0bCAtIGlvY3RsIGZvciBkYWVtb24KKyAqCUBmaWxwOiBwb2ludGVyIHRvIHN0cnVjdCBmaWxlCisgKglAY21kOiBjb21tYW5kCisgKglAYXJnOiBwb2ludGVyIHRvIGFyZ3VtZW50IHN0cnVjdHVyZQorICoKKyAqCUNhbGxlZCBieSB0aGUgcmVxdWVzdCBkYWVtb24gdG8gcGVyZm9ybSBpb2N0bHMgb24gdGhlIGRhZW1vbiBkZXZpY2UKKyAqLworc3RhdGljIGxvbmcgc2VwX3JlcXVlc3RfZGFlbW9uX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1MzIgY21kLAorCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCisJbG9uZyBlcnJvcjsKKwlzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJkYWVtb24gaW9jdGw6IHN0YXJ0XG4iKTsKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImRhZW1vbiBpb2N0bDogY21kIGlzICV4XG4iLCBjbWQpOworCisJLyogQ2hlY2sgdGhhdCB0aGUgY29tbWFuZCBpcyBmb3IgU0VQIGRldmljZSAqLworCWlmIChfSU9DX1RZUEUoY21kKSAhPSBTRVBfSU9DX01BR0lDX05VTUJFUikgeworCQllcnJvciA9IC1FTk9UVFk7CisJCWdvdG8gZW5kX2Z1bmN0aW9uOworCX0KKworCS8qIE9ubHkgb25lIHByb2Nlc3MgY2FuIGFjY2VzcyBpb2N0bCBhdCBhbnkgZ2l2ZW4gdGltZSAqLworCW11dGV4X2xvY2soJnNlcC0+aW9jdGxfbXV0ZXgpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNFUF9JT0NTRU5EU0VQUlBMWUNPTU1BTkQ6CisJCS8qIFNlbmQgcmVwbHkgY29tbWFuZCB0byBTRVAgKi8KKwkJZXJyb3IgPSBzZXBfcmVxX2RhZW1vbl9zZW5kX3JlcGx5X2NvbW1hbmRfaGFuZGxlcihzZXApOworCQlicmVhazsKKwljYXNlIFNFUF9JT0NFTkRUUkFOU0FDVElPTjoKKwkJLyoKKwkJICogRW5kIHJlcSBkYWVtb24gdHJhbnNhY3Rpb24sIGRvIG5vdGhpbmcKKwkJICogd2lsbCBiZSByZW1vdmVkIHVwb24gdXBkYXRlIGluIG1pZGRsZXdhcmUKKwkJICogQVBJIGxpYnJhcnkKKwkJICovCisJCWVycm9yID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJkYWVtb24gaW9jdGw6IG5vIHN1Y2ggSU9DVExcbiIpOworCQllcnJvciA9IC1FTk9UVFk7CisJfQorCW11dGV4X3VubG9jaygmc2VwLT5pb2N0bF9tdXRleCk7CisKK2VuZF9mdW5jdGlvbjoKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImRhZW1vbiBpb2N0bDogZW5kXG4iKTsKKwlyZXR1cm4gZXJyb3I7CisKK30KKworLyoqCisgKglzZXBfaW50aGFuZGxlciAtIGludGVycnVwdCBoYW5kbGVyCisgKglAaXJxOiBpbnRlcnJ1cHQKKyAqCUBkZXZfaWQ6IGRldmljZSBpZAorICovCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2VwX2ludGhhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCWlycXJldHVybl90IGludF9lcnJvciA9IElSUV9IQU5ETEVEOworCXVuc2lnbmVkIGxvbmcgbGNrX2ZsYWdzOworCXUzMiByZWdfdmFsLCByZWdfdmFsMiA9IDA7CisJc3RydWN0IHNlcF9kZXZpY2UgKnNlcCA9IGRldl9pZDsKKworCS8qIFJlYWQgdGhlIElSUiByZWdpc3RlciB0byBjaGVjayBpZiB0aGlzIGlzIFNFUCBpbnRlcnJ1cHQgKi8KKwlyZWdfdmFsID0gc2VwX3JlYWRfcmVnKHNlcCwgSFdfSE9TVF9JUlJfUkVHX0FERFIpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiU0VQIEludGVycnVwdCAtIHJlZyBpcyAlMDh4XG4iLCByZWdfdmFsKTsKKworCWlmIChyZWdfdmFsICYgKDB4MSA8PCAxMykpIHsKKwkJLyogTG9jayBhbmQgdXBkYXRlIHRoZSBjb3VudGVyIG9mIHJlcGx5IG1lc3NhZ2VzICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzZXAtPnNuZF9ycGx5X2xjaywgbGNrX2ZsYWdzKTsKKwkJc2VwLT5yZXBseV9jdCsrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZXAtPnNuZF9ycGx5X2xjaywgbGNrX2ZsYWdzKTsKKworCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcCBpbnQ6IHNlbmRfY3QgJWx4IHJlcGx5X2N0ICVseFxuIiwKKwkJCQkJc2VwLT5zZW5kX2N0LCBzZXAtPnJlcGx5X2N0KTsKKworCQkvKiBJcyB0aGlzIHByaW50ZiBvciBkYWVtb24gcmVxdWVzdD8gKi8KKwkJcmVnX3ZhbDIgPSBzZXBfcmVhZF9yZWcoc2VwLCBIV19IT1NUX1NFUF9IT1NUX0dQUjJfUkVHX0FERFIpOworCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKKwkJCSJTRVAgSW50ZXJydXB0IC0gcmVnMiBpcyAlMDh4XG4iLCByZWdfdmFsMik7CisKKwkJaWYgKChyZWdfdmFsMiA+PiAzMCkgJiAweDEpIHsKKwkJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiaW50OiBwcmludGYgcmVxdWVzdFxuIik7CisJCQl3YWtlX3VwKCZzZXAtPmV2ZW50X3JlcXVlc3RfZGFlbW9uKTsKKwkJfSBlbHNlIGlmIChyZWdfdmFsMiA+PiAzMSkgeworCQkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJpbnQ6IGRhZW1vbiByZXF1ZXN0XG4iKTsKKwkJCXdha2VfdXAoJnNlcC0+ZXZlbnRfcmVxdWVzdF9kYWVtb24pOworCQl9IGVsc2UgeworCQkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJpbnQ6IFNFUCByZXBseVxuIik7CisJCQl3YWtlX3VwKCZzZXAtPmV2ZW50KTsKKwkJfQorCX0gZWxzZSB7CisJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiaW50OiBub3QgU0VQIGludGVycnVwdFxuIik7CisJCWludF9lcnJvciA9IElSUV9OT05FOworCX0KKwlpZiAoaW50X2Vycm9yID09IElSUV9IQU5ETEVEKQorCQlzZXBfd3JpdGVfcmVnKHNlcCwgSFdfSE9TVF9JQ1JfUkVHX0FERFIsIHJlZ192YWwpOworCisJcmV0dXJuIGludF9lcnJvcjsKK30KKworLyoqCisgKglzZXBfcmVjb25maWdfc2hhcmVkX2FyZWEgLSByZWNvbmZpZ3VyZSBzaGFyZWQgYXJlYQorICoJQHNlcDogcG9pbnRlciB0byBzdHJ1Y3Qgc2VwX2RldmljZQorICoKKyAqCVJlY29uZmlnIHRoZSBzaGFyZWQgYXJlYSBiZXR3ZWVuIEhPU1QgYW5kIFNFUCAtIG5lZWRlZCBpbiBjYXNlCisgKgl0aGUgRFhfQ0NfSW5pdCBmdW5jdGlvbiB3YXMgY2FsbGVkIGJlZm9yZSBPUyBsb2FkaW5nLgorICovCitzdGF0aWMgaW50IHNlcF9yZWNvbmZpZ19zaGFyZWRfYXJlYShzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwKQoreworCWludCByZXRfdmFsOworCisJLyogdXNlIHRvIGxpbWl0IHdhaXRpbmcgZm9yIFNFUCAqLworCXVuc2lnbmVkIGxvbmcgZW5kX3RpbWU7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInJlY29uZmlnIHNoYXJlZCBhcmVhIHN0YXJ0XG4iKTsKKworCS8qIFNlbmQgdGhlIG5ldyBTSEFSRUQgTUVTU0FHRSBBUkVBIHRvIHRoZSBTRVAgKi8KKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlbmRpbmcgJTA4bGx4IHRvIHNlcFxuIiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXNlcC0+c2hhcmVkX2J1cyk7CisKKwlzZXBfd3JpdGVfcmVnKHNlcCwgSFdfSE9TVF9IT1NUX1NFUF9HUFIxX1JFR19BRERSLCBzZXAtPnNoYXJlZF9idXMpOworCisJLyogUG9sbCBmb3IgU0VQIHJlc3BvbnNlICovCisJcmV0X3ZhbCA9IHNlcF9yZWFkX3JlZyhzZXAsIEhXX0hPU1RfU0VQX0hPU1RfR1BSMV9SRUdfQUREUik7CisKKwllbmRfdGltZSA9IGppZmZpZXMgKyAoV0FJVF9USU1FICogSFopOworCisJd2hpbGUgKCh0aW1lX2JlZm9yZShqaWZmaWVzLCBlbmRfdGltZSkpICYmIChyZXRfdmFsICE9IDB4ZmZmZmZmZmYpICYmCisJCShyZXRfdmFsICE9IHNlcC0+c2hhcmVkX2J1cykpCisJCXJldF92YWwgPSBzZXBfcmVhZF9yZWcoc2VwLCBIV19IT1NUX1NFUF9IT1NUX0dQUjFfUkVHX0FERFIpOworCisJLyogQ2hlY2sgdGhlIHJldHVybiB2YWx1ZSAocmVnaXN0ZXIpICovCisJaWYgKHJldF92YWwgIT0gc2VwLT5zaGFyZWRfYnVzKSB7CisJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwgImNvdWxkIG5vdCByZWNvbmZpZyBzaGFyZWQgYXJlYVxuIik7CisJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwgInJlc3VsdCB3YXMgJXhcbiIsIHJldF92YWwpOworCQlyZXRfdmFsID0gLUVOT01FTTsKKwl9IGVsc2UKKwkJcmV0X3ZhbCA9IDA7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInJlY29uZmlnIHNoYXJlZCBhcmVhIGVuZFxuIik7CisJcmV0dXJuIHJldF92YWw7Cit9CisKKy8qIEZpbGUgb3BlcmF0aW9uIGZvciBzaW5nbGV0b24gU0VQIG9wZXJhdGlvbnMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNpbmdsZXRvbl9maWxlX29wZXJhdGlvbnMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLnVubG9ja2VkX2lvY3RsID0gc2VwX3NpbmdsZXRvbl9pb2N0bCwKKwkucG9sbCA9IHNlcF9wb2xsLAorCS5vcGVuID0gc2VwX3NpbmdsZXRvbl9vcGVuLAorCS5yZWxlYXNlID0gc2VwX3NpbmdsZXRvbl9yZWxlYXNlLAorCS5tbWFwID0gc2VwX21tYXAsCit9OworCisvKiBGaWxlIG9wZXJhdGlvbiBmb3IgZGFlbW9uIG9wZXJhdGlvbnMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRhZW1vbl9maWxlX29wZXJhdGlvbnMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLnVubG9ja2VkX2lvY3RsID0gc2VwX3JlcXVlc3RfZGFlbW9uX2lvY3RsLAorCS5wb2xsID0gc2VwX3JlcXVlc3RfZGFlbW9uX3BvbGwsCisJLm9wZW4gPSBzZXBfcmVxdWVzdF9kYWVtb25fb3BlbiwKKwkucmVsZWFzZSA9IHNlcF9yZXF1ZXN0X2RhZW1vbl9yZWxlYXNlLAorCS5tbWFwID0gc2VwX3JlcXVlc3RfZGFlbW9uX21tYXAsCit9OworCisvKiBUaGUgZmlsZXMgb3BlcmF0aW9ucyBzdHJ1Y3R1cmUgb2YgdGhlIGRyaXZlciAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc2VwX2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkudW5sb2NrZWRfaW9jdGwgPSBzZXBfaW9jdGwsCisJLnBvbGwgPSBzZXBfcG9sbCwKKwkub3BlbiA9IHNlcF9vcGVuLAorCS5yZWxlYXNlID0gc2VwX3JlbGVhc2UsCisJLm1tYXAgPSBzZXBfbW1hcCwKK307CisKKy8qKgorICoJc2VwX3JlZ2lzdGVyX2RyaXZlcl93aXRoX2ZzIC0gcmVnaXN0ZXIgbWlzYyBkZXZpY2VzCisgKglAc2VwOiBwb2ludGVyIHRvIHN0cnVjdCBzZXBfZGV2aWNlCisgKgorICoJVGhpcyBmdW5jdGlvbiByZWdpc3RlcnMgdGhlIGRyaXZlciB3aXRoIHRoZSBmaWxlIHN5c3RlbQorICovCitzdGF0aWMgaW50IHNlcF9yZWdpc3Rlcl9kcml2ZXJfd2l0aF9mcyhzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwKQoreworCWludCByZXRfdmFsOworCisJc2VwLT5taXNjZGV2X3NlcC5taW5vciA9IE1JU0NfRFlOQU1JQ19NSU5PUjsKKwlzZXAtPm1pc2NkZXZfc2VwLm5hbWUgPSBTRVBfREVWX05BTUU7CisJc2VwLT5taXNjZGV2X3NlcC5mb3BzID0gJnNlcF9maWxlX29wZXJhdGlvbnM7CisKKwlzZXAtPm1pc2NkZXZfc2luZ2xldG9uLm1pbm9yID0gTUlTQ19EWU5BTUlDX01JTk9SOworCXNlcC0+bWlzY2Rldl9zaW5nbGV0b24ubmFtZSA9IFNFUF9ERVZfU0lOR0xFVE9OOworCXNlcC0+bWlzY2Rldl9zaW5nbGV0b24uZm9wcyA9ICZzaW5nbGV0b25fZmlsZV9vcGVyYXRpb25zOworCisJc2VwLT5taXNjZGV2X2RhZW1vbi5taW5vciA9IE1JU0NfRFlOQU1JQ19NSU5PUjsKKwlzZXAtPm1pc2NkZXZfZGFlbW9uLm5hbWUgPSBTRVBfREVWX0RBRU1PTjsKKwlzZXAtPm1pc2NkZXZfZGFlbW9uLmZvcHMgPSAmZGFlbW9uX2ZpbGVfb3BlcmF0aW9uczsKKworCXJldF92YWwgPSBtaXNjX3JlZ2lzdGVyKCZzZXAtPm1pc2NkZXZfc2VwKTsKKwlpZiAocmV0X3ZhbCkgeworCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsICJtaXNjIHJlZyBmYWlscyBmb3IgU0VQICV4XG4iLAorCQkJcmV0X3ZhbCk7CisJCXJldHVybiByZXRfdmFsOworCX0KKworCXJldF92YWwgPSBtaXNjX3JlZ2lzdGVyKCZzZXAtPm1pc2NkZXZfc2luZ2xldG9uKTsKKwlpZiAocmV0X3ZhbCkgeworCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsICJtaXNjIHJlZyBmYWlscyBmb3Igc2luZyAleFxuIiwKKwkJCXJldF92YWwpOworCQltaXNjX2RlcmVnaXN0ZXIoJnNlcC0+bWlzY2Rldl9zZXApOworCQlyZXR1cm4gcmV0X3ZhbDsKKwl9CisKKwlyZXRfdmFsID0gbWlzY19yZWdpc3Rlcigmc2VwLT5taXNjZGV2X2RhZW1vbik7CisJaWYgKHJldF92YWwpIHsKKwkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LCAibWlzYyByZWcgZmFpbHMgZm9yIGRtbiAleFxuIiwKKwkJCXJldF92YWwpOworCQltaXNjX2RlcmVnaXN0ZXIoJnNlcC0+bWlzY2Rldl9zZXApOworCQltaXNjX2RlcmVnaXN0ZXIoJnNlcC0+bWlzY2Rldl9zaW5nbGV0b24pOworCisJCXJldHVybiByZXRfdmFsOworCX0KKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworCisvKioKKyAqCXNlcF9wcm9iZSAtIHByb2JlIGEgbWF0Y2hpbmcgUENJIGRldmljZQorICoJQHBkZXY6IHBjaV9kZXZpY2UKKyAqCUBlbmQ6IHBjaV9kZXZpY2VfaWQKKyAqCisgKglBdHRlbXB0IHRvIHNldCB1cCBhbmQgY29uZmlndXJlIGEgU0VQIGRldmljZSB0aGF0IGhhcyBiZWVuCisgKglkaXNjb3ZlcmVkIGJ5IHRoZSBQQ0kgbGF5ZXIuCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IHNlcF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCWludCBlcnJvciA9IDA7CisJc3RydWN0IHNlcF9kZXZpY2UgKnNlcDsKKworCXByX2RlYnVnKCJTRVAgcGNpIHByb2JlIHN0YXJ0aW5nXG4iKTsKKwlpZiAoc2VwX2RldiAhPSBOVUxMKSB7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJvbmx5IG9uZSBTRVAgc3VwcG9ydGVkLlxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJLyogRW5hYmxlIHRoZSBkZXZpY2UgKi8KKwllcnJvciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChlcnJvcikgeworCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiZXJyb3IgZW5hYmxpbmcgcGNpIGRldmljZVxuIik7CisJCWdvdG8gZW5kX2Z1bmN0aW9uOworCX0KKworCS8qIEFsbG9jYXRlIHRoZSBzZXBfZGV2aWNlIHN0cnVjdHVyZSBmb3IgdGhpcyBkZXZpY2UgKi8KKwlzZXBfZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNlcF9kZXZpY2UpLCBHRlBfQVRPTUlDKTsKKwlpZiAoc2VwX2RldiA9PSBOVUxMKSB7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCQkiY2FuJ3Qga21hbGxvYyB0aGUgc2VwX2RldmljZSBzdHJ1Y3R1cmVcbiIpOworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gZW5kX2Z1bmN0aW9uX2Rpc2FibGVfZGV2aWNlOworCX0KKworCS8qCisJICogV2UncmUgZ29pbmcgdG8gdXNlIGFub3RoZXIgdmFyaWFibGUgZm9yIGFjdHVhbGx5CisJICogd29ya2luZyB3aXRoIHRoZSBkZXZpY2U7IHRoaXMgd2F5LCBpZiB3ZSBoYXZlCisJICogbXVsdGlwbGUgZGV2aWNlcyBpbiB0aGUgZnV0dXJlLCBpdCB3b3VsZCBiZSBlYXNpZXIKKwkgKiB0byBtYWtlIGFwcHJvcHJpYXRlIGNoYW5nZXMKKwkgKi8KKwlzZXAgPSBzZXBfZGV2OworCisJc2VwLT5wZGV2ID0gcGNpX2Rldl9nZXQocGRldik7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzZXAtPmV2ZW50KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzZXAtPmV2ZW50X3JlcXVlc3RfZGFlbW9uKTsKKwlzcGluX2xvY2tfaW5pdCgmc2VwLT5zbmRfcnBseV9sY2spOworCW11dGV4X2luaXQoJnNlcC0+c2VwX211dGV4KTsKKwltdXRleF9pbml0KCZzZXAtPmlvY3RsX211dGV4KTsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiUENJIG9idGFpbmVkLCBkZXZpY2UgYmVpbmcgcHJlcGFyZWRcbiIpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAicmV2aXNpb24gaXMgJWRcbiIsIHNlcC0+cGRldi0+cmV2aXNpb24pOworCisJLyogU2V0IHVwIG91ciByZWdpc3RlciBhcmVhICovCisJc2VwLT5yZWdfcGh5c2ljYWxfYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChzZXAtPnBkZXYsIDApOworCWlmICghc2VwLT5yZWdfcGh5c2ljYWxfYWRkcikgeworCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsICJFcnJvciBnZXR0aW5nIHJlZ2lzdGVyIHN0YXJ0XG4iKTsKKwkJZXJyb3IgPSAtRU5PREVWOworCQlnb3RvIGVuZF9mdW5jdGlvbl9mcmVlX3NlcF9kZXY7CisJfQorCisJc2VwLT5yZWdfcGh5c2ljYWxfZW5kID0gcGNpX3Jlc291cmNlX2VuZChzZXAtPnBkZXYsIDApOworCWlmICghc2VwLT5yZWdfcGh5c2ljYWxfZW5kKSB7CisJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwgIkVycm9yIGdldHRpbmcgcmVnaXN0ZXIgZW5kXG4iKTsKKwkJZXJyb3IgPSAtRU5PREVWOworCQlnb3RvIGVuZF9mdW5jdGlvbl9mcmVlX3NlcF9kZXY7CisJfQorCisJc2VwLT5yZWdfYWRkciA9IGlvcmVtYXBfbm9jYWNoZShzZXAtPnJlZ19waHlzaWNhbF9hZGRyLAorCQkoc2l6ZV90KShzZXAtPnJlZ19waHlzaWNhbF9lbmQgLSBzZXAtPnJlZ19waHlzaWNhbF9hZGRyICsgMSkpOworCWlmICghc2VwLT5yZWdfYWRkcikgeworCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsICJFcnJvciBnZXR0aW5nIHJlZ2lzdGVyIHZpcnR1YWxcbiIpOworCQllcnJvciA9IC1FTk9ERVY7CisJCWdvdG8gZW5kX2Z1bmN0aW9uX2ZyZWVfc2VwX2RldjsKKwl9CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKKwkJIlJlZ2lzdGVyIGFyZWEgc3RhcnQgJWxseCBlbmQgJWxseCB2aXJ0dWFsICVwXG4iLAorCQkodW5zaWduZWQgbG9uZyBsb25nKXNlcC0+cmVnX3BoeXNpY2FsX2FkZHIsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpc2VwLT5yZWdfcGh5c2ljYWxfZW5kLAorCQlzZXAtPnJlZ19hZGRyKTsKKworCS8qIEFsbG9jYXRlIHRoZSBzaGFyZWQgYXJlYSAqLworCXNlcC0+c2hhcmVkX3NpemUgPSBTRVBfRFJJVkVSX01FU1NBR0VfU0hBUkVEX0FSRUFfU0laRV9JTl9CWVRFUyArCisJCVNZTkNIUk9OSUNfRE1BX1RBQkxFU19BUkVBX1NJWkVfQllURVMgKworCQlTRVBfRFJJVkVSX0RBVEFfUE9PTF9TSEFSRURfQVJFQV9TSVpFX0lOX0JZVEVTICsKKwkJU0VQX0RSSVZFUl9TVEFUSUNfQVJFQV9TSVpFX0lOX0JZVEVTICsKKwkJU0VQX0RSSVZFUl9TWVNURU1fREFUQV9NRU1PUllfU0laRV9JTl9CWVRFUzsKKworCWlmIChzZXBfbWFwX2FuZF9hbGxvY19zaGFyZWRfYXJlYShzZXApKSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJLyogQWxsb2NhdGlvbiBmYWlsZWQgKi8KKwkJZ290byBlbmRfZnVuY3Rpb25fZXJyb3I7CisJfQorCisJc2VwLT5yYXJfc2l6ZSA9IEZBS0VfUkFSX1NJWkU7CisJc2VwLT5yYXJfYWRkciA9IGRtYV9hbGxvY19jb2hlcmVudCgmc2VwLT5wZGV2LT5kZXYsCisJCXNlcC0+cmFyX3NpemUsICZzZXAtPnJhcl9idXMsIEdGUF9LRVJORUwpOworCWlmIChzZXAtPnJhcl9hZGRyID09IE5VTEwpIHsKKwkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LCAiY2FuJ3QgYWxsb2NhdGUgbWZsZCByYXJcbiIpOworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gZW5kX2Z1bmN0aW9uX2RlYWxsb2NhdGVfc2VwX3NoYXJlZF9hcmVhOworCX0KKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAicmFyIHN0YXJ0IGlzICVwLCBwaHkgaXMgJWxseCwiCisJCSIgc2l6ZSBpcyAlenhcbiIsIHNlcC0+cmFyX2FkZHIsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpc2VwLT5yYXJfYnVzLAorCQlzZXAtPnJhcl9zaXplKTsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiYWJvdXQgdG8gd3JpdGUgSU1SIGFuZCBJQ1IgUkVHX0FERFJcbiIpOworCisJLyogQ2xlYXIgSUNSIHJlZ2lzdGVyICovCisJc2VwX3dyaXRlX3JlZyhzZXAsIEhXX0hPU1RfSUNSX1JFR19BRERSLCAweEZGRkZGRkZGKTsKKworCS8qIFNldCB0aGUgSU1SIHJlZ2lzdGVyIC0gb3BlbiBvbmx5IEdQUiAyICovCisJc2VwX3dyaXRlX3JlZyhzZXAsIEhXX0hPU1RfSU1SX1JFR19BRERSLCAofigweDEgPDwgMTMpKSk7CisKKwkvKiBSZWFkIHNlbmQvcmVjZWl2ZSBjb3VudGVycyBmcm9tIFNFUCAqLworCXNlcC0+cmVwbHlfY3QgPSBzZXBfcmVhZF9yZWcoc2VwLCBIV19IT1NUX1NFUF9IT1NUX0dQUjJfUkVHX0FERFIpOworCXNlcC0+cmVwbHlfY3QgJj0gMHgzRkZGRkZGRjsKKwlzZXAtPnNlbmRfY3QgPSBzZXAtPnJlcGx5X2N0OworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJhYm91dCB0byBjYWxsIHJlcXVlc3RfaXJxXG4iKTsKKwkvKiBHZXQgdGhlIGludGVycnVwdCBsaW5lICovCisJZXJyb3IgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsIHNlcF9pbnRoYW5kbGVyLCBJUlFGX1NIQVJFRCwKKwkJInNlcF9kcml2ZXIiLCBzZXApOworCisJaWYgKGVycm9yKQorCQlnb3RvIGVuZF9mdW5jdGlvbl9kZWFsbG9jX3JhcjsKKworCS8qIFRoZSBuZXcgY2hpcCByZXF1aXJlcyBhc2hhcmVkIGFyZWEgcmVjb25maWd1cmUgKi8KKwlpZiAoc2VwLT5wZGV2LT5yZXZpc2lvbiA9PSA0KSB7IC8qIE9ubHkgZm9yIG5ldyBjaGlwICovCisJCWVycm9yID0gc2VwX3JlY29uZmlnX3NoYXJlZF9hcmVhKHNlcCk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZW5kX2Z1bmN0aW9uX2ZyZWVfaXJxOworCX0KKwkvKiBGaW5hbGx5IG1hZ2ljIHVwIHRoZSBkZXZpY2Ugbm9kZXMgKi8KKwkvKiBSZWdpc3RlciBkcml2ZXIgd2l0aCB0aGUgZnMgKi8KKwllcnJvciA9IHNlcF9yZWdpc3Rlcl9kcml2ZXJfd2l0aF9mcyhzZXApOworCWlmIChlcnJvciA9PSAwKQorCQkvKiBTdWNjZXNzICovCisJCXJldHVybiAwOworCitlbmRfZnVuY3Rpb25fZnJlZV9pcnE6CisJZnJlZV9pcnEocGRldi0+aXJxLCBzZXApOworCitlbmRfZnVuY3Rpb25fZGVhbGxvY19yYXI6CisJaWYgKHNlcC0+cmFyX2FkZHIpCisJCWRtYV9mcmVlX2NvaGVyZW50KCZzZXAtPnBkZXYtPmRldiwgc2VwLT5yYXJfc2l6ZSwKKwkJCXNlcC0+cmFyX2FkZHIsIHNlcC0+cmFyX2J1cyk7CisJZ290byBlbmRfZnVuY3Rpb247CisKK2VuZF9mdW5jdGlvbl9kZWFsbG9jYXRlX3NlcF9zaGFyZWRfYXJlYToKKwkvKiBEZS1hbGxvY2F0ZSBzaGFyZWQgYXJlYSAqLworCXNlcF91bm1hcF9hbmRfZnJlZV9zaGFyZWRfYXJlYShzZXApOworCitlbmRfZnVuY3Rpb25fZXJyb3I6CisJaW91bm1hcChzZXAtPnJlZ19hZGRyKTsKKworZW5kX2Z1bmN0aW9uX2ZyZWVfc2VwX2RldjoKKwlwY2lfZGV2X3B1dChzZXBfZGV2LT5wZGV2KTsKKwlrZnJlZShzZXBfZGV2KTsKKwlzZXBfZGV2ID0gTlVMTDsKKworZW5kX2Z1bmN0aW9uX2Rpc2FibGVfZGV2aWNlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKworZW5kX2Z1bmN0aW9uOgorCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHZvaWQgc2VwX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwID0gc2VwX2RldjsKKworCS8qIFVucmVnaXN0ZXIgZnJvbSBmcyAqLworCW1pc2NfZGVyZWdpc3Rlcigmc2VwLT5taXNjZGV2X3NlcCk7CisJbWlzY19kZXJlZ2lzdGVyKCZzZXAtPm1pc2NkZXZfc2luZ2xldG9uKTsKKwltaXNjX2RlcmVnaXN0ZXIoJnNlcC0+bWlzY2Rldl9kYWVtb24pOworCisJLyogRnJlZSB0aGUgaXJxICovCisJZnJlZV9pcnEoc2VwLT5wZGV2LT5pcnEsIHNlcCk7CisKKwkvKiBGcmVlIHRoZSBzaGFyZWQgYXJlYSAgKi8KKwlzZXBfdW5tYXBfYW5kX2ZyZWVfc2hhcmVkX2FyZWEoc2VwX2Rldik7CisJaW91bm1hcCgodm9pZCAqKSBzZXBfZGV2LT5yZWdfYWRkcik7Cit9CisKK3N0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRShzZXBfcGNpX2lkX3RibCkgPSB7CisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgTUZMRF9QQ0lfREVWSUNFX0lEKX0sCisJezB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgc2VwX3BjaV9pZF90YmwpOworCisvKiBGaWVsZCBmb3IgcmVnaXN0ZXJpbmcgZHJpdmVyIHRvIFBDSSBkZXZpY2UgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBzZXBfcGNpX2RyaXZlciA9IHsKKwkubmFtZSA9ICJzZXBfc2VjX2RyaXZlciIsCisJLmlkX3RhYmxlID0gc2VwX3BjaV9pZF90YmwsCisJLnByb2JlID0gc2VwX3Byb2JlLAorCS5yZW1vdmUgPSBzZXBfcmVtb3ZlCit9OworCisKKy8qKgorICoJc2VwX2luaXQgLSBpbml0IGZ1bmN0aW9uCisgKgorICoJTW9kdWxlIGxvYWQgdGltZS4gUmVnaXN0ZXIgdGhlIFBDSSBkZXZpY2UgZHJpdmVyLgorICovCitzdGF0aWMgaW50IF9faW5pdCBzZXBfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZzZXBfcGNpX2RyaXZlcik7Cit9CisKKworLyoqCisgKglzZXBfZXhpdCAtIGNhbGxlZCB0byB1bmxvYWQgZHJpdmVyCisgKgorICoJRHJvcCB0aGUgbWlzYyBkZXZpY2VzIHRoZW4gcmVtb3ZlIGFuZCB1bm1hcCB0aGUgdmFyaW91cyByZXNvdXJjZXMKKyAqCXRoYXQgYXJlIG5vdCByZWxlYXNlZCBieSB0aGUgZHJpdmVyIHJlbW92ZSBtZXRob2QuCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBzZXBfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmc2VwX3BjaV9kcml2ZXIpOworfQorCisKK21vZHVsZV9pbml0KHNlcF9pbml0KTsKK21vZHVsZV9leGl0KHNlcF9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NlcC9zZXBfZHJpdmVyX2FwaS5oIGIvZHJpdmVycy9zdGFnaW5nL3NlcC9zZXBfZHJpdmVyX2FwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYmZhMjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc2VwL3NlcF9kcml2ZXJfYXBpLmgKQEAgLTAsMCArMSwyOTcgQEAKKy8qCisgKgorICogIHNlcF9kcml2ZXJfYXBpLmggLSBTZWN1cml0eSBQcm9jZXNzb3IgRHJpdmVyIGFwaSBkZWZpbml0aW9ucworICoKKyAqICBDb3B5cmlnaHQoYykgMjAwOSwyMDEwIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogIENvbnRyaWJ1dGlvbnMoYykgMjAwOSwyMDEwIERpc2NyZXRpeC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqICBDT05UQUNUUzoKKyAqCisgKiAgTWFyayBBbGx5bgkJbWFyay5hLmFsbHluQGludGVsLmNvbQorICogIEpheWFudCBNYW5nYWxhbXBhbGxpIGpheWFudC5tYW5nYWxhbXBhbGxpQGludGVsLmNvbQorICoKKyAqICBDSEFOR0VTOgorICoKKyAqICAyMDEwLjA5LjE0ICBVcGdyYWRlIHRvIE1lZGZpZWxkCisgKgorICovCisKKyNpZm5kZWYgX19TRVBfRFJJVkVSX0FQSV9IX18KKyNkZWZpbmUgX19TRVBfRFJJVkVSX0FQSV9IX18KKworLyogVHlwZSBvZiByZXF1ZXN0IGZyb20gZGV2aWNlICovCisjZGVmaW5lIFNFUF9EUklWRVJfU1JDX1JFUExZCQkxCisjZGVmaW5lIFNFUF9EUklWRVJfU1JDX1JFUQkJMgorI2RlZmluZSBTRVBfRFJJVkVSX1NSQ19QUklOVEYJCTMKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBUWVBFREVGUworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBOb3RlIHRoYXQgc2V2ZXJhbCBtZW1iZXJzIG9mIHRoZXNlIHN0cnVjdHJlcyBhcmUgb25seSBoZXJlCisgKiBmb3IgY2FtcGF0YWJpbGl0eSB3aXRoIHRoZSBtaWRkbGV3YXJlOyB0aGV5IGFyZSBub3QgdXNlZAorICogYnkgdGhpcyBkcml2ZXIuCisgKiBBbGwgdXNlciBzcGFjZSBidWZmZXIgYWRkcmVzc2VzIGFyZSBzZXQgdG8gYWxpZ25lZCB1NjQKKyAqIGluIG9yZGVyIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5IHdpdGggNjQgYml0IHN5c3RlbXMKKyAqLworCisvKgorICBpbml0IGNvbW1hbmQgc3RydWN0OyB0aGlzIHdpbGwgZ28gYXdheSB3aGVuIFNDVSBkb2VzIGluaXQKKyovCitzdHJ1Y3QgaW5pdF9zdHJ1Y3QgeworCS8qIGFkZHJlc3MgdGhhdCBTRVAgY2FuIGFjY2VzcyBmb3IgbWVzc2FnZSAqLworCWFsaWduZWRfdTY0ICAgbWVzc2FnZV9hZGRyOworCisJLyogbWVzc2FnZSBzaXplICovCisJdTMyICAgbWVzc2FnZV9zaXplX2luX3dvcmRzOworCisJLyogb2Zmc2V0IG9mIHRoZSBpbml0IG1lc3NhZ2UgaW4gdGhlIHNlcCBzcmFtICovCisJdTMyICAgc2VwX3NyYW1fYWRkcjsKKworCS8qIC1ub3QgdXNlZC0gcmVzaWRlbnQgc2l6ZSBpbiBieXRlcyovCisJdTMyICAgdW51c2VkX3Jlc2lkZW50X3NpemVfaW5fYnl0ZXM7CisKKwkvKiAtbm90IHVzZWQtIGNhY2hlIHNpemUgaW4gYnl0ZXMqLworCXUzMiAgIHVudXNlZF9jYWNoZV9zaXplX2luX2J5dGVzOworCisJLyogLW5vdCB1c2VkLSBleHQgY2FjaGUgY3VycmVudCBhZGRyZXNzICovCisJYWxpZ25lZF91NjQgICB1bnVzZWRfZXh0Y2FjaGVfYWRkcjsKKworCS8qIC1ub3QgdXNlZC0gZXh0IGNhY2hlIHNpemUgaW4gYnl0ZXMqLworCXUzMiAgIHVudXNlZF9leHRjYWNoZV9zaXplX2luX2J5dGVzOworfTsKKworc3RydWN0IHJlYWxsb2NfZXh0X3N0cnVjdCB7CisJLyogLW5vdCB1c2VkLSBjdXJyZW50IGV4dGVybmFsIGNhY2hlIGFkZHJlc3MgKi8KKwlhbGlnbmVkX3U2NCAgIHVudXNlZF9leHRfY2FjaGVfYWRkcjsKKworCS8qIC1ub3QgdXNlZC0gZXh0ZXJuYWwgY2FjaGUgc2l6ZSBpbiBieXRlcyovCisJdTMyICAgdW51c2VkX2V4dF9jYWNoZV9zaXplX2luX2J5dGVzOworfTsKKworc3RydWN0IGFsbG9jX3N0cnVjdCB7CisJLyogb2Zmc2V0IGZyb20gc3RhcnQgb2Ygc2hhcmVkIHBvb2wgYXJlYSAqLworCXUzMiAgb2Zmc2V0OworCS8qIG51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZSAqLworCXUzMiAgbnVtX2J5dGVzOworfTsKKworLyoKKwlOb3RlIHRoYXQgYWxsIGFwcCBhZGRyZXNzZXMgYXJlIGNhc3QgYXMgdTMyOyB0aGUgc2VwCisJbWlkZGxld2FyZSBzZW5kcyB0aGVtIGFzIGZpeGVkIDMyIGJpdCB3b3JkcworKi8KK3N0cnVjdCBibGRfc3luX3RhYl9zdHJ1Y3QgeworCS8qIGFkZHJlc3MgdmFsdWUgb2YgdGhlIGRhdGEgaW4gKHVzZXIgc3BhY2UgYWRkcikgKi8KKwlhbGlnbmVkX3U2NCBhcHBfaW5fYWRkcmVzczsKKworCS8qIHNpemUgb2YgZGF0YSBpbiAqLworCXUzMiBkYXRhX2luX3NpemU7CisKKwkvKiBhZGRyZXNzIG9mIHRoZSBkYXRhIG91dCAodXNlciBzcGFjZSBhZGRyKSAqLworCWFsaWduZWRfdTY0IGFwcF9vdXRfYWRkcmVzczsKKworCS8qIHRoZSBzaXplIG9mIHRoZSBibG9jayBvZiB0aGUgb3BlcmF0aW9uIC0gaWYgbmVlZGVkLAorCSAgIGV2ZXJ5IHRhYmxlIHdpbGwgYmUgbW9kdWxvIHRoaXMgcGFyYW1ldGVyICovCisJdTMyIGJsb2NrX3NpemU7CisKKwkvKiAtbm90IHVzZWQtIGRpc3RpbmN0IHVzZXIva2VybmVsIGxheW91dCAqLworCWJvb2wgaXNLZXJuZWxWaXJ0dWFsQWRkcmVzczsKKworfTsKKworLyogY29tbWFuZCBzdHJ1Y3QgZm9yIGdldHRpbmcgY2FsbGVyIGlkIHZhbHVlIGFuZCBhZGRyZXNzICovCitzdHJ1Y3QgY2FsbGVyX2lkX3N0cnVjdCB7CisJLyogcGlkIG9mIHRoZSBwcm9jZXNzICovCisJdTMyIHBpZDsKKwkvKiB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIGNhbGxlciBpZCBoYXNoICovCisJYWxpZ25lZF91NjQgY2FsbGVySWRBZGRyZXNzOworCS8qIGNhbGxlciBpZCBoYXNoIHNpemUgaW4gYnl0ZXMgKi8KKwl1MzIgY2FsbGVySWRTaXplSW5CeXRlczsKK307CisKKy8qCisgIHN0cnVjdHVyZSB0aGF0IHJlcHJlc2VudHMgRENCCisqLworc3RydWN0IHNlcF9kY2Jsb2NrIHsKKwkvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBmaXJzdCBpbnB1dCBtbGxpICovCisJdTMyCWlucHV0X21sbGlfYWRkcmVzczsKKwkvKiBudW0gb2YgZW50cmllcyBpbiB0aGUgZmlyc3QgaW5wdXQgbWxsaSAqLworCXUzMglpbnB1dF9tbGxpX251bV9lbnRyaWVzOworCS8qIHNpemUgb2YgZGF0YSBpbiB0aGUgZmlyc3QgaW5wdXQgbWxsaSAqLworCXUzMglpbnB1dF9tbGxpX2RhdGFfc2l6ZTsKKwkvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBmaXJzdCBvdXRwdXQgbWxsaSAqLworCXUzMglvdXRwdXRfbWxsaV9hZGRyZXNzOworCS8qIG51bSBvZiBlbnRyaWVzIGluIHRoZSBmaXJzdCBvdXRwdXQgbWxsaSAqLworCXUzMglvdXRwdXRfbWxsaV9udW1fZW50cmllczsKKwkvKiBzaXplIG9mIGRhdGEgaW4gdGhlIGZpcnN0IG91dHB1dCBtbGxpICovCisJdTMyCW91dHB1dF9tbGxpX2RhdGFfc2l6ZTsKKwkvKiBwb2ludGVyIHRvIHRoZSBvdXRwdXQgdmlydHVhbCB0YWlsICovCisJdTMyCW91dF92cl90YWlsX3B0OworCS8qIHNpemUgb2YgdGFpbCBkYXRhICovCisJdTMyCXRhaWxfZGF0YV9zaXplOworCS8qIGlucHV0IHRhaWwgZGF0YSBhcnJheSAqLworCXU4CXRhaWxfZGF0YVs2NF07Cit9OworCitzdHJ1Y3Qgc2VwX2NhbGxlcl9pZF9lbnRyeSB7CisJaW50IHBpZDsKKwl1bnNpZ25lZCBjaGFyIGNhbGxlcklkSGFzaFtTRVBfQ0FMTEVSX0lEX0hBU0hfU0laRV9JTl9CWVRFU107Cit9OworCisvKgorCWNvbW1hbmQgc3RydWN0dXJlIGZvciBidWlsZGluZyBkY2IgYmxvY2sgKGN1cnJlbnRseSBmb3IgZXh0IGFwcCBvbmx5CisqLworc3RydWN0IGJ1aWxkX2RjYl9zdHJ1Y3QgeworCS8qIGFkZHJlc3MgdmFsdWUgb2YgdGhlIGRhdGEgaW4gKi8KKwlhbGlnbmVkX3U2NCBhcHBfaW5fYWRkcmVzczsKKwkvKiBzaXplIG9mIGRhdGEgaW4gKi8KKwl1MzIgIGRhdGFfaW5fc2l6ZTsKKwkvKiBhZGRyZXNzIG9mIHRoZSBkYXRhIG91dCAqLworCWFsaWduZWRfdTY0IGFwcF9vdXRfYWRkcmVzczsKKwkvKiB0aGUgc2l6ZSBvZiB0aGUgYmxvY2sgb2YgdGhlIG9wZXJhdGlvbiAtIGlmIG5lZWRlZCwKKwlldmVyeSB0YWJsZSB3aWxsIGJlIG1vZHVsbyB0aGlzIHBhcmFtZXRlciAqLworCXUzMiAgYmxvY2tfc2l6ZTsKKwkvKiB0aGUgc2l6ZSBvZiB0aGUgYmxvY2sgb2YgdGhlIG9wZXJhdGlvbiAtIGlmIG5lZWRlZCwKKwlldmVyeSB0YWJsZSB3aWxsIGJlIG1vZHVsbyB0aGlzIHBhcmFtZXRlciAqLworCXUzMiAgdGFpbF9ibG9ja19zaXplOworfTsKKworLyoqCisgKiBAc3RydWN0IHNlcF9kbWFfbWFwCisgKgorICogU3RydWN0dXJlIHRoYXQgY29udGFpbnMgYWxsIGluZm9ybWF0aW9uIG5lZWRlZCBmb3IgbWFwcGluZyB0aGUgdXNlciBwYWdlcworICoJICAgICBvciBrZXJuZWwgYnVmZmVycyBmb3IgZG1hIG9wZXJhdGlvbnMKKyAqCisgKgorICovCitzdHJ1Y3Qgc2VwX2RtYV9tYXAgeworCS8qIG1hcHBlZCBkbWEgYWRkcmVzcyAqLworCWRtYV9hZGRyX3QgICAgZG1hX2FkZHI7CisJLyogc2l6ZSBvZiB0aGUgbWFwcGVkIGRhdGEgKi8KKwlzaXplX3QgICAgICAgIHNpemU7Cit9OworCitzdHJ1Y3Qgc2VwX2RtYV9yZXNvdXJjZSB7CisJLyogYXJyYXkgb2YgcG9pbnRlcnMgdG8gdGhlIHBhZ2VzIHRoYXQgcmVwcmVzZW50CisJaW5wdXQgZGF0YSBmb3IgdGhlIHN5bmNocm9uaWMgRE1BIGFjdGlvbiAqLworCXN0cnVjdCBwYWdlICoqaW5fcGFnZV9hcnJheTsKKworCS8qIGFycmF5IG9mIHBvaW50ZXJzIHRvIHRoZSBwYWdlcyB0aGF0IHJlcHJlc2VudCBvdXQKKwlkYXRhIGZvciB0aGUgc3luY2hyb25pYyBETUEgYWN0aW9uICovCisJc3RydWN0IHBhZ2UgKipvdXRfcGFnZV9hcnJheTsKKworCS8qIG51bWJlciBvZiBwYWdlcyBpbiB0aGUgc2VwX2luX3BhZ2VfYXJyYXkgKi8KKwl1MzIgaW5fbnVtX3BhZ2VzOworCisJLyogbnVtYmVyIG9mIHBhZ2VzIGluIHRoZSBzZXBfb3V0X3BhZ2VfYXJyYXkgKi8KKwl1MzIgb3V0X251bV9wYWdlczsKKworCS8qIG1hcCBhcnJheSBvZiB0aGUgaW5wdXQgZGF0YSAqLworCXN0cnVjdCBzZXBfZG1hX21hcCAqaW5fbWFwX2FycmF5OworCisJLyogbWFwIGFycmF5IG9mIHRoZSBvdXRwdXQgZGF0YSAqLworCXN0cnVjdCBzZXBfZG1hX21hcCAqb3V0X21hcF9hcnJheTsKKworCS8qIG51bWJlciBvZiBlbnRyaWVzIG9mIHRoZSBpbnB1dCBtYXBwIGFycmF5ICovCisJdTMyIGluX21hcF9udW1fZW50cmllczsKKworCS8qIG51bWJlciBvZiBlbnRyaWVzIG9mIHRoZSBvdXRwdXQgbWFwcCBhcnJheSAqLworCXUzMiBvdXRfbWFwX251bV9lbnRyaWVzOworfTsKKworCisvKiBjb21tYW5kIHN0cnVjdCBmb3IgdHJhbnNsYXRpbmcgcmFyIGhhbmRsZSB0byBidXMgYWRkcmVzcworICAgYW5kIHNldHRpbmcgaXQgYXQgcHJlZGVmaW5lZCBsb2NhdGlvbiAqLworc3RydWN0IHJhcl9obmRsX3RvX2J1c19zdHJ1Y3QgeworCisJLyogcmFyIGhhbmRsZSAqLworCWFsaWduZWRfdTY0IHJhcl9oYW5kbGU7Cit9OworCisvKgorICBzdHJ1Y3R1cmUgdGhhdCByZXByZXNlbnQgb25lIGVudHJ5IGluIHRoZSBETUEgTExJIHRhYmxlCisqLworc3RydWN0IHNlcF9sbGlfZW50cnkgeworCS8qIHBoeXNpY2FsIGFkZHJlc3MgKi8KKwl1MzIgYnVzX2FkZHJlc3M7CisKKwkvKiBibG9jayBzaXplICovCisJdTMyIGJsb2NrX3NpemU7Cit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlJT0NUTCBjb21tYW5kIGRlZmluZXMKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIG1hZ2ljIG51bWJlciAxIG9mIHRoZSBzZXAgSU9DVEwgY29tbWFuZCAqLworI2RlZmluZSBTRVBfSU9DX01BR0lDX05VTUJFUgkgICAgICAgICAgICAgICAgICAgICAncycKKworLyogc2VuZHMgaW50ZXJydXB0IHRvIHNlcCB0aGF0IG1lc3NhZ2UgaXMgcmVhZHkgKi8KKyNkZWZpbmUgU0VQX0lPQ1NFTkRTRVBDT01NQU5ECSBcCisJX0lPKFNFUF9JT0NfTUFHSUNfTlVNQkVSLCAwKQorCisvKiBzZW5kcyBpbnRlcnJ1cHQgdG8gc2VwIHRoYXQgbWVzc2FnZSBpcyByZWFkeSAqLworI2RlZmluZSBTRVBfSU9DU0VORFNFUFJQTFlDT01NQU5ECSBcCisJX0lPKFNFUF9JT0NfTUFHSUNfTlVNQkVSLCAxKQorCisvKiBhbGxvY2F0ZSBtZW1vcnkgaW4gZGF0YSBwb29sICovCisjZGVmaW5lIFNFUF9JT0NBTExPQ0RBVEFQT0xMCVwKKwlfSU9XKFNFUF9JT0NfTUFHSUNfTlVNQkVSLCAyLCBzdHJ1Y3QgYWxsb2Nfc3RydWN0KQorCisvKiBjcmVhdGUgc3ltIGRtYSBsbGkgdGFibGVzICovCisjZGVmaW5lIFNFUF9JT0NDUkVBVEVTWU1ETUFUQUJMRQlcCisJX0lPVyhTRVBfSU9DX01BR0lDX05VTUJFUiwgNSwgc3RydWN0IGJsZF9zeW5fdGFiX3N0cnVjdCkKKworLyogZnJlZSBkeW5hbWljIGRhdGEgYWFsb2NhdGVkIGR1cmluZyB0YWJsZSBjcmVhdGlvbiAqLworI2RlZmluZSBTRVBfSU9DRlJFRURNQVRBQkxFREFUQQkgXAorCV9JTyhTRVBfSU9DX01BR0lDX05VTUJFUiwgNykKKworLyogZ2V0IHRoZSBzdGF0aWMgcG9vbCBhcmVhIGFkZGVyc3NlcyAocGh5c2ljYWwgYW5kIHZpcnR1YWwpICovCisjZGVmaW5lIFNFUF9JT0NHRVRTVEFUSUNQT09MQUREUglcCisJX0lPKFNFUF9JT0NfTUFHSUNfTlVNQkVSLCA4KQorCisvKiBzdGFydCBzZXAgY29tbWFuZCAqLworI2RlZmluZSBTRVBfSU9DU0VQU1RBUlQJIFwKKwlfSU8oU0VQX0lPQ19NQUdJQ19OVU1CRVIsIDEyKQorCisvKiBpbml0IHNlcCBjb21tYW5kICovCisjZGVmaW5lIFNFUF9JT0NTRVBJTklUCVwKKwlfSU9XKFNFUF9JT0NfTUFHSUNfTlVNQkVSLCAxMywgc3RydWN0IGluaXRfc3RydWN0KQorCisvKiBlbmQgdHJhbnNhY3Rpb24gY29tbWFuZCAqLworI2RlZmluZSBTRVBfSU9DRU5EVFJBTlNBQ1RJT04JIFwKKwlfSU8oU0VQX0lPQ19NQUdJQ19OVU1CRVIsIDE1KQorCisvKiByZWFsbG9jYXRlIGV4dGVybmFsIGFwcDsgdW51c2VkIHN0cnVjdHVyZSBzdGlsbCBuZWVkZWQgZm9yCisgKiBjb21wYXRhYmlsaXR5IHdpdGggbWlkZGxld2FyZSAqLworI2RlZmluZSBTRVBfSU9DUkVBTExPQ0VYVENBQ0hFCVwKKwlfSU9XKFNFUF9JT0NfTUFHSUNfTlVNQkVSLCAxOCwgc3RydWN0IHJlYWxsb2NfZXh0X3N0cnVjdCkKKworI2RlZmluZSBTRVBfSU9DUkFSUFJFUEFSRU1FU1NBR0UJXAorCV9JT1coU0VQX0lPQ19NQUdJQ19OVU1CRVIsIDIwLCBzdHJ1Y3QgcmFyX2huZGxfdG9fYnVzX3N0cnVjdCkKKworI2RlZmluZSBTRVBfSU9DVExTRVRDQUxMRVJJRAlcCisJX0lPVyhTRVBfSU9DX01BR0lDX05VTUJFUiwgMzQsIHN0cnVjdCBjYWxsZXJfaWRfc3RydWN0KQorCisjZGVmaW5lIFNFUF9JT0NQUkVQQVJFRENCCQkJCQlcCisJX0lPVyhTRVBfSU9DX01BR0lDX05VTUJFUiwgMzUsIHN0cnVjdCBidWlsZF9kY2Jfc3RydWN0KQorCisjZGVmaW5lIFNFUF9JT0NGUkVFRENCCQkJCQlcCisJX0lPKFNFUF9JT0NfTUFHSUNfTlVNQkVSLCAzNikKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2VwL3NlcF9kcml2ZXJfY29uZmlnLmggYi9kcml2ZXJzL3N0YWdpbmcvc2VwL3NlcF9kcml2ZXJfY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE4NjI1ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zZXAvc2VwX2RyaXZlcl9jb25maWcuaApAQCAtMCwwICsxLDIzOSBAQAorLyoKKyAqCisgKiAgc2VwX2RyaXZlcl9jb25maWcuaCAtIFNlY3VyaXR5IFByb2Nlc3NvciBEcml2ZXIgY29uZmlndXJhdGlvbgorICoKKyAqICBDb3B5cmlnaHQoYykgMjAwOSwyMDEwIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogIENvbnRyaWJ1dGlvbnMoYykgMjAwOSwyMDEwIERpc2NyZXRpeC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqICBDT05UQUNUUzoKKyAqCisgKiAgTWFyayBBbGx5bgkJbWFyay5hLmFsbHluQGludGVsLmNvbQorICogIEpheWFudCBNYW5nYWxhbXBhbGxpIGpheWFudC5tYW5nYWxhbXBhbGxpQGludGVsLmNvbQorICoKKyAqICBDSEFOR0VTOgorICoKKyAqICAyMDEwLjA2LjI2CVVwZ3JhZGUgdG8gTWVkZmllbGQKKyAqCisgKi8KKworI2lmbmRlZiBfX1NFUF9EUklWRVJfQ09ORklHX0hfXworI2RlZmluZSBfX1NFUF9EUklWRVJfQ09ORklHX0hfXworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRFJJVkVSIENPTkZJR1VSQVRJT04gRkxBR1MKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIGlmIGZsYWcgaXMgb24gLCB0aGVuIHRoZSBkcml2ZXIgaXMgcnVubmluZyBpbiBwb2xsaW5nIGFuZAorCW5vdCBpbnRlcnJ1cHQgbW9kZSAqLworI2RlZmluZSBTRVBfRFJJVkVSX1BPTExJTkdfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qIGZsYWcgd2hpY2ggZGVmaW5lcyBpZiB0aGUgc2hhcmVkIGFyZWEgYWRkcmVzcyBzaG91bGQgYmUKKwlyZWNvbmZpZ2VkIChzZW5kIHRvIFNFUCBhbmV3KSBkdXJpbmcgaW5pdCBvZiB0aGUgZHJpdmVyICovCisjZGVmaW5lIFNFUF9EUklWRVJfUkVDT05GSUdfTUVTU0FHRV9BUkVBICAgICAgICAgICAgICAgIDAKKworLyogdGhlIG1vZGUgZm9yIHJ1bm5pbmcgb24gdGhlIEFSTTExNzIgRXZhbHVhdGlvbiBwbGF0Zm9ybSAoZmxhZyBpcyAxKSAqLworI2RlZmluZSBTRVBfRFJJVkVSX0FSTV9ERUJVR19NT0RFICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUlOVEVSTkFMIERBVEEgQ09ORklHVVJBVElPTgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBmbGFnIGZvciB0aGUgaW5wdXQgYXJyYXkgKi8KKyNkZWZpbmUgU0VQX0RSSVZFUl9JTl9GTEFHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKiBmbGFnIGZvciBvdXRwdXQgYXJyYXkgKi8KKyNkZWZpbmUgU0VQX0RSSVZFUl9PVVRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorCisvKiBtYXhpbXVtIG51bWJlciBvZiBlbnRyaWVzIGluIG9uZSBMTEkgdGFibGVzICovCisjZGVmaW5lIFNFUF9EUklWRVJfRU5UUklFU19QRVJfVEFCTEVfSU5fU0VQICAgICAgICAgICAgIDMxCisKKy8qIG1pbmltdW0gZGF0YSBzaXplIG9mIHRoZSBNTExJIHRhYmxlICovCisjZGVmaW5lIFNFUF9EUklWRVJfTUlOX0RBVEFfU0laRV9QRVJfVEFCTEUJCTE2CisKKy8qIGZsYWcgdGhhdCBzaWduaWZpZXMgdGFoIHRoZSBsb2NrIGlzCitjdXJyZW50bHkgaGVsZCBieSB0aGUgcHJvY2Nlc3MgKHN0cnVjdCBmaWxlKSAqLworI2RlZmluZSBTRVBfRFJJVkVSX09XTl9MT0NLX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgICAxCisKKy8qIGZsYWcgdGhhdCBzaWduaWZpZXMgdGFoIHRoZSBsb2NrIGlzIGN1cnJlbnRseSBOT1QKK2hlbGQgYnkgdGhlIHByb2NjZXNzIChzdHJ1Y3QgZmlsZSkgKi8KKyNkZWZpbmUgU0VQX0RSSVZFUl9ESVNPV05fTE9DS19GTEFHICAgICAgICAgICAgICAgICAgICAgMAorCisvKiBpbmRpY2F0ZXMgd2hldGhlciBkcml2ZXIgaGFzIG1hcHBlZC91bm1hcHBlZCBzaGFyZWQgYXJlYSAqLworI2RlZmluZSBTRVBfUkVRVUVTVF9EQUVNT05fTUFQUEVEIDEKKyNkZWZpbmUgU0VQX1JFUVVFU1RfREFFTU9OX1VOTUFQUEVEIDAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVNIQVJFRCBBUkVBICBtZW1vcnkgdG90YWwgc2l6ZSBpcyAzNksKKwlpdCBpcyBkaXZpZGVkIGlzIGZvbGxvd2luZzoKKworCVNIQVJFRF9NRVNTQUdFX0FSRUEgICAgICAgICAgICAgICAgICAgICA4SyAgICAgICAgIH0KKwkJCQkJCQkJCX0KKwlTVEFUSUNfUE9PTF9BUkVBICAgICAgICAgICAgICAgICAgICAgICAgNEsgICAgICAgICB9IE1BUFBFRCBBUkVBICggMjQgSykKKwkJCQkJCQkJCX0KKwlEQVRBX1BPT0xfQVJFQSAgICAgICAgICAgICAgICAgICAgICAgICAgMTJLICAgICAgICB9CisKKwlTWU5DSFJPTklDX0RNQV9UQUJMRVNfQVJFQSAgICAgICAgICAgICAgNUsKKworCXBsYWNlaG9sZGVyIHVudGlsIGRydmVyIGNoYW5nZXMKKwlGTE9XX0RNQV9UQUJMRVNfQVJFQSAgICAgICAgICAgICAgICAgICAgNEsKKworCVNZU1RFTV9NRU1PUllfQVJFQSAgICAgICAgICAgICAgICAgICAgICAzaworCisJU1lTVEVNX01FTU9SWSB0b3RhbCBzaXplIGlzIDNrCisJaXQgaXMgZGl2aWRlZCBhcyBmb2xsb3dpbmc6CisKKwlUSU1FX01FTU9SWV9BUkVBICAgICAgICAgICAgICAgICAgICAgOEIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBTRVBfREVWX05BTUUgInNlcF9zZWNfZHJpdmVyIgorI2RlZmluZSBTRVBfREVWX1NJTkdMRVRPTiAic2VwX3NlY19zaW5nbGV0b25fZHJpdmVyIgorI2RlZmluZSBTRVBfREVWX0RBRU1PTiAic2VwX3JlcV9kYWVtb25fZHJpdmVyIgorCisKKy8qCisJdGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBtZXNzYWdlIC0gdGhlIHJlc3Qgb2YgdGhlIG1lc3NhZ2Ugc2hhcmVkCisJYXJlYSB3aWxsIGJlIGRlZGljYXRlZCB0byB0aGUgZG1hIGxsaSB0YWJsZXMKKyovCisjZGVmaW5lIFNFUF9EUklWRVJfTUFYX01FU1NBR0VfU0laRV9JTl9CWVRFUwkJCSg4ICogMTAyNCkKKworLyogdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2Ugc2hhcmVkIGFyZWEgaW4gcGFnZXMgKi8KKyNkZWZpbmUgU0VQX0RSSVZFUl9NRVNTQUdFX1NIQVJFRF9BUkVBX1NJWkVfSU5fQllURVMJCSg4ICogMTAyNCkKKworLyogdGhlIHNpemUgb2YgdGhlIGRhdGEgcG9vbCBzdGF0aWMgYXJlYSBpbiBwYWdlcyAqLworI2RlZmluZSBTRVBfRFJJVkVSX1NUQVRJQ19BUkVBX1NJWkVfSU5fQllURVMJCQkoNCAqIDEwMjQpCisKKy8qIHRoZSBzaXplIG9mIHRoZSBkYXRhIHBvb2wgc2hhcmVkIGFyZWEgc2l6ZSBpbiBwYWdlcyAqLworI2RlZmluZSBTRVBfRFJJVkVSX0RBVEFfUE9PTF9TSEFSRURfQVJFQV9TSVpFX0lOX0JZVEVTCQkoMTYgKiAxMDI0KQorCisvKiB0aGUgc2l6ZSBvZiB0aGUgbWVzc2FnZSBzaGFyZWQgYXJlYSBpbiBwYWdlcyAqLworI2RlZmluZSBTWU5DSFJPTklDX0RNQV9UQUJMRVNfQVJFQV9TSVpFX0JZVEVTCSgxMDI0ICogNSkKKworLyogUGxhY2Vob2xkZXIgdW50aWwgZHJpdmVyIGNoYW5nZXMgKi8KKyNkZWZpbmUgU0VQX0RSSVZFUl9GTE9XX0RNQV9UQUJMRVNfQVJFQV9TSVpFX0lOX0JZVEVTCQkoMTAyNCAqIDQpCisKKy8qIHN5c3RlbSBkYXRhICh0aW1lLCBjYWxsZXIgaWQgZXRjJykgcG9vbCAqLworI2RlZmluZSBTRVBfRFJJVkVSX1NZU1RFTV9EQVRBX01FTU9SWV9TSVpFX0lOX0JZVEVTCQkoMTAyNCAqIDMpCisKKy8qIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSB0aW1lIG1lbW9yeSAqLworI2RlZmluZSBTRVBfRFJJVkVSX1RJTUVfTUVNT1JZX1NJWkVfSU5fQllURVMJCQk4CisKKy8qIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBSQVIgcGFyYW1ldGVycyBtZW1vcnkgKi8KKyNkZWZpbmUgU0VQX0RSSVZFUl9TWVNURU1fUkFSX01FTU9SWV9TSVpFX0lOX0JZVEVTCQk4CisKKy8qIGFyZWEgc2l6ZSB0aGF0IGlzIG1hcHBlZCAgLSB3ZSBtYXAgdGhlIE1FU1NBR0UgQVJFQSwgU1RBVElDIFBPT0wgYW5kCisJREFUQSBQT09MIGFyZWFzLiBhcmVhIG11c3QgYmUgbW9kdWxlIDRrICovCisjZGVmaW5lIFNFUF9EUklWRVJfTU1NQVBfQVJFQV9TSVpFCQkJCSgxMDI0ICogMjgpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlvZmZzZXRzIG9mIHRoZSBhcmVhcyBzdGFydGluZyBmcm9tIHRoZSBzaGFyZWQgYXJlYSBzdGFydCBhZGRyZXNzCisqLworCisvKiBtZXNzYWdlIGFyZWEgb2Zmc2V0ICovCisjZGVmaW5lIFNFUF9EUklWRVJfTUVTU0FHRV9BUkVBX09GRlNFVF9JTl9CWVRFUwkJCTAKKworLyogc3RhdGljIHBvb2wgYXJlYSBvZmZzZXQgKi8KKyNkZWZpbmUgU0VQX0RSSVZFUl9TVEFUSUNfQVJFQV9PRkZTRVRfSU5fQllURVMgXAorCShTRVBfRFJJVkVSX01FU1NBR0VfU0hBUkVEX0FSRUFfU0laRV9JTl9CWVRFUykKKworLyogZGF0YSBwb29sIGFyZWEgb2Zmc2V0ICovCisjZGVmaW5lIFNFUF9EUklWRVJfREFUQV9QT09MX0FSRUFfT0ZGU0VUX0lOX0JZVEVTIFwKKwkoU0VQX0RSSVZFUl9TVEFUSUNfQVJFQV9PRkZTRVRfSU5fQllURVMgKyBcCisJU0VQX0RSSVZFUl9TVEFUSUNfQVJFQV9TSVpFX0lOX0JZVEVTKQorCisvKiBzeW5ocm9uaWMgZG1hIHRhYmxlcyBhcmVhIG9mZnNldCAqLworI2RlZmluZSBTWU5DSFJPTklDX0RNQV9UQUJMRVNfQVJFQV9PRkZTRVRfQllURVMgXAorCShTRVBfRFJJVkVSX0RBVEFfUE9PTF9BUkVBX09GRlNFVF9JTl9CWVRFUyArIFwKKwlTRVBfRFJJVkVSX0RBVEFfUE9PTF9TSEFSRURfQVJFQV9TSVpFX0lOX0JZVEVTKQorCisvKiBzeXN0ZW0gbWVtb3J5IG9mZnNldCBpbiBieXRlcyAqLworI2RlZmluZSBTRVBfRFJJVkVSX1NZU1RFTV9EQVRBX01FTU9SWV9PRkZTRVRfSU5fQllURVMgXAorCShTWU5DSFJPTklDX0RNQV9UQUJMRVNfQVJFQV9PRkZTRVRfQllURVMgKyBcCisJU1lOQ0hST05JQ19ETUFfVEFCTEVTX0FSRUFfU0laRV9CWVRFUykKKworLyogb2Zmc2V0IG9mIHRoZSB0aW1lIGFyZWEgKi8KKyNkZWZpbmUgU0VQX0RSSVZFUl9TWVNURU1fVElNRV9NRU1PUllfT0ZGU0VUX0lOX0JZVEVTIFwKKwkoU0VQX0RSSVZFUl9TWVNURU1fREFUQV9NRU1PUllfT0ZGU0VUX0lOX0JZVEVTKQorCisvKiBvZmZzZXQgb2YgdGhlIFJBUiBhcmVhICovCisjZGVmaW5lIFNFUF9EUklWRVJfU1lTVEVNX1JBUl9NRU1PUllfT0ZGU0VUX0lOX0JZVEVTIFwKKwkoU0VQX0RSSVZFUl9TWVNURU1fVElNRV9NRU1PUllfT0ZGU0VUX0lOX0JZVEVTICsgXAorCVNFUF9EUklWRVJfVElNRV9NRU1PUllfU0laRV9JTl9CWVRFUykKKworLyogb2Zmc2V0IG9mIHRoZSBjYWxsZXIgaWQgYXJlYSAqLworI2RlZmluZSBTRVBfQ0FMTEVSX0lEX09GRlNFVF9CWVRFUyBcCisJKFNFUF9EUklWRVJfU1lTVEVNX1JBUl9NRU1PUllfT0ZGU0VUX0lOX0JZVEVTICsgXAorICAgIFNFUF9EUklWRVJfU1lTVEVNX1JBUl9NRU1PUllfU0laRV9JTl9CWVRFUykKKworLyogb2Zmc2V0IG9mIHRoZSBEQ0IgYXJlYSAqLworI2RlZmluZSBTRVBfRFJJVkVSX1NZU1RFTV9EQ0JfTUVNT1JZX09GRlNFVF9JTl9CWVRFUyBcCisJKFNFUF9EUklWRVJfU1lTVEVNX0RBVEFfTUVNT1JZX09GRlNFVF9JTl9CWVRFUyArIFwKKwkweDQwMCkKKworLyogb2Zmc2V0IG9mIHRoZSBleHQgY2FjaGUgYXJlYSAqLworI2RlZmluZSBTRVBfRFJJVkVSX1NZU1RFTV9FWFRfQ0FDSEVfQUREUl9PRkZTRVRfSU5fQllURVMgXAorCVNFUF9EUklWRVJfU1lTVEVNX1JBUl9NRU1PUllfT0ZGU0VUX0lOX0JZVEVTCisKKy8qIG9mZnNldCBvZiB0aGUgYWxsb2NhdGlvbiBkYXRhIHBvaW50ZXIgYXJlYSAqLworI2RlZmluZSBTRVBfRFJJVkVSX0RBVEFfUE9PTF9BTExPQ0FUSU9OX09GRlNFVF9JTl9CWVRFUyBcCisJKFNFUF9DQUxMRVJfSURfT0ZGU0VUX0JZVEVTICsgXAorCVNFUF9DQUxMRVJfSURfSEFTSF9TSVpFX0lOX0JZVEVTKQorCisvKiB0aGUgdG9rZW4gdGhhdCBkZWZpbmVzIHRoZSBzdGFydCBvZiB0aW1lIGFkZHJlc3MgKi8KKyNkZWZpbmUgU0VQX1RJTUVfVkFMX1RPS0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMjM0NTY3OAorCisjZGVmaW5lIEZBS0VfUkFSX1NJWkUgKDEwMjQqMTAyNCkgLyogdXNlZCBvbmx5IGZvciBtZmxkICovCisvKiBERUJVRyBMRVZFTCBNQVNLUyAqLworCisvKiBzaXplIG9mIHRoZSBjYWxsZXIgaWQgaGFzaCAoc2hhMikgKi8KKyNkZWZpbmUgU0VQX0NBTExFUl9JRF9IQVNIX1NJWkVfSU5fQllURVMgICAgICAgICAgICAgICAgICAgICAgMzIKKworLyogc2l6ZSBvZiB0aGUgY2FsbGVyIGlkIGhhc2ggKHNoYTIpIGluIDMyIGJpdCB3b3JkcyAqLworI2RlZmluZSBTRVBfQ0FMTEVSX0lEX0hBU0hfU0laRV9JTl9XT1JEUyAgICAgICAgICAgICAgICA4CisKKy8qIG1heGltdW0gbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGNhbGxlciBpZCB0YWJsZSAqLworI2RlZmluZSBTRVBfQ0FMTEVSX0lEX1RBQkxFX05VTV9FTlRSSUVTICAgICAgICAgICAgICAgICAgICAgICAyMAorCisvKiBtYXhpbXVtIG51bWJlciBvZiBzeW1ldHJpYyBvcGVyYXRpb24gKHRoYXQgcmVxdWlyZSBETUEgcmVzb3VyY2UpCisJcGVyIG9uZSBtZXNzYWdlICovCisjZGVmaW5lIFNFUF9NQVhfTlVNX1NZTkNfRE1BX09QUwkJCTE2CisKKy8qIHRoZSB0b2tlbiB0aGF0IGRlZmluZXMgdGhlIHN0YXJ0IG9mIHRpbWUgYWRkcmVzcyAqLworI2RlZmluZSBTRVBfUkFSX1ZBTF9UT0tFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEFCQUJBQkFCCisKKy8qIGlvY3RsIGVycm9yIHRoYXQgc2hvdWxkIGJlIHJldHVybmVkIHdoZW4gdHJ5aW5nCisgICB0byByZWFsbG9jIHRoZSBjYWNoZS9yZXNpZGVudCBzZWNvbmQgdGltZSAqLworI2RlZmluZSBTRVBfQUxSRUFEWV9JTklUSUFMSVpFRF9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAxMgorCisvKiBiaXQgdGhhdCBsb2NrcyBhY2Nlc3MgdG8gdGhlIHNoYXJlZCBhcmVhICovCisjZGVmaW5lIFNFUF9NTUFQX0xPQ0tfQklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyogYml0IHRoYXQgbG9jayBhY2Nlc3MgdG8gdGhlIHBvbGwgIC0gYWZ0ZXIgc2VuZF9jb21tYW5kICovCisjZGVmaW5lIFNFUF9TRU5EX01TR19MT0NLX0JJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKworLyogdGhlIHRva2VuIHRoYXQgZGVmaW5lcyB0aGUgc3RhdGljIHBvb2wgYWRkcmVzcyBhZGRyZXNzICovCisjZGVmaW5lIFNFUF9TVEFUSUNfUE9PTF9WQUxfVE9LRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QUJCQUFCQkEKKworLyogdGhlIHRva2VuIHRoYXQgZGVmaW5lcyB0aGUgZGF0YSBwb29sIHBvaW50ZXJzIGFkZHJlc3MgKi8KKyNkZWZpbmUgU0VQX0RBVEFfUE9PTF9QT0lOVEVSU19WQUxfVE9LRU4gICAgICAgICAgICAgICAgICAgICAgMHhFRERFRURERQorCisvKiB0aGUgdG9rZW4gdGhhdCBkZWZpbmVzIHRoZSBkYXRhIHBvb2wgcG9pbnRlcnMgYWRkcmVzcyAqLworI2RlZmluZSBTRVBfRVhUX0NBQ0hFX0FERFJfVkFMX1RPS0VOICAgICAgICAgICAgICAgICAgICAgICAgICAweEJBQkFCQUJBCisKKy8qIFRpbWUgbGltaXQgZm9yIFNFUCB0byBmaW5pc2ggKi8KKyNkZWZpbmUgV0FJVF9USU1FIDEwCisKKyNlbmRpZiAvKiBTRVAgRFJJVkVSIENPTkZJRyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NlcC9zZXBfZHJpdmVyX2h3X2RlZnMuaCBiL2RyaXZlcnMvc3RhZ2luZy9zZXAvc2VwX2RyaXZlcl9od19kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAwZjkwOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zZXAvc2VwX2RyaXZlcl9od19kZWZzLmgKQEAgLTAsMCArMSwyMzMgQEAKKy8qCisgKgorICogIHNlcF9kcml2ZXJfaHdfZGVmcy5oIC0gU2VjdXJpdHkgUHJvY2Vzc29yIERyaXZlciBoYXJkd2FyZSBkZWZpbml0aW9ucworICoKKyAqICBDb3B5cmlnaHQoYykgMjAwOSwyMDEwIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogIENvbnRyaWJ1dGlvbnMoYykgMjAwOSwyMDEwIERpc2NyZXRpeC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqICBDT05UQUNUUzoKKyAqCisgKiAgTWFyayBBbGx5bgkJbWFyay5hLmFsbHluQGludGVsLmNvbQorICogIEpheWFudCBNYW5nYWxhbXBhbGxpIGpheWFudC5tYW5nYWxhbXBhbGxpQGludGVsLmNvbQorICoKKyAqICBDSEFOR0VTOgorICoKKyAqICAyMDEwLjA5LjIwCVVwZ3JhZGUgdG8gTWVkZmllbGQKKyAqCisgKi8KKworI2lmbmRlZiBTRVBfRFJJVkVSX0hXX0RFRlNfX0gKKyNkZWZpbmUgU0VQX0RSSVZFUl9IV19ERUZTX19ICisKKy8qIFBDSSBJRCdzICovCisjZGVmaW5lIE1GTERfUENJX0RFVklDRV9JRCAweDA4MjYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogSFcgUmVnaXN0ZXJzIERlZmluZXMuICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0qLworCisKKy8qIGNmIHJlZ2lzdGVycyAqLworI2RlZmluZQkJSFdfUjBCX0FERFJfMF9SRUdfQUREUgkJCTB4MDAwMFVMCisjZGVmaW5lCQlIV19SMEJfQUREUl8xX1JFR19BRERSCQkJMHgwMDA0VUwKKyNkZWZpbmUJCUhXX1IwQl9BRERSXzJfUkVHX0FERFIJCQkweDAwMDhVTAorI2RlZmluZQkJSFdfUjBCX0FERFJfM19SRUdfQUREUgkJCTB4MDAwY1VMCisjZGVmaW5lCQlIV19SMEJfQUREUl80X1JFR19BRERSCQkJMHgwMDEwVUwKKyNkZWZpbmUJCUhXX1IwQl9BRERSXzVfUkVHX0FERFIJCQkweDAwMTRVTAorI2RlZmluZQkJSFdfUjBCX0FERFJfNl9SRUdfQUREUgkJCTB4MDAxOFVMCisjZGVmaW5lCQlIV19SMEJfQUREUl83X1JFR19BRERSCQkJMHgwMDFjVUwKKyNkZWZpbmUJCUhXX1IwQl9BRERSXzhfUkVHX0FERFIJCQkweDAwMjBVTAorI2RlZmluZQkJSFdfUjJCX0FERFJfMF9SRUdfQUREUgkJCTB4MDA4MFVMCisjZGVmaW5lCQlIV19SMkJfQUREUl8xX1JFR19BRERSCQkJMHgwMDg0VUwKKyNkZWZpbmUJCUhXX1IyQl9BRERSXzJfUkVHX0FERFIJCQkweDAwODhVTAorI2RlZmluZQkJSFdfUjJCX0FERFJfM19SRUdfQUREUgkJCTB4MDA4Y1VMCisjZGVmaW5lCQlIV19SMkJfQUREUl80X1JFR19BRERSCQkJMHgwMDkwVUwKKyNkZWZpbmUJCUhXX1IyQl9BRERSXzVfUkVHX0FERFIJCQkweDAwOTRVTAorI2RlZmluZQkJSFdfUjJCX0FERFJfNl9SRUdfQUREUgkJCTB4MDA5OFVMCisjZGVmaW5lCQlIV19SMkJfQUREUl83X1JFR19BRERSCQkJMHgwMDljVUwKKyNkZWZpbmUJCUhXX1IyQl9BRERSXzhfUkVHX0FERFIJCQkweDAwYTBVTAorI2RlZmluZQkJSFdfUjNCX1JFR19BRERSCQkJCTB4MDBDMFVMCisjZGVmaW5lCQlIV19SNEJfUkVHX0FERFIJCQkJMHgwMTAwVUwKKyNkZWZpbmUJCUhXX0NTQV9BRERSXzBfUkVHX0FERFIJCQkweDAxNDBVTAorI2RlZmluZQkJSFdfQ1NBX0FERFJfMV9SRUdfQUREUgkJCTB4MDE0NFVMCisjZGVmaW5lCQlIV19DU0FfQUREUl8yX1JFR19BRERSCQkJMHgwMTQ4VUwKKyNkZWZpbmUJCUhXX0NTQV9BRERSXzNfUkVHX0FERFIJCQkweDAxNGNVTAorI2RlZmluZQkJSFdfQ1NBX0FERFJfNF9SRUdfQUREUgkJCTB4MDE1MFVMCisjZGVmaW5lCQlIV19DU0FfQUREUl81X1JFR19BRERSCQkJMHgwMTU0VUwKKyNkZWZpbmUJCUhXX0NTQV9BRERSXzZfUkVHX0FERFIJCQkweDAxNThVTAorI2RlZmluZQkJSFdfQ1NBX0FERFJfN19SRUdfQUREUgkJCTB4MDE1Y1VMCisjZGVmaW5lCQlIV19DU0FfQUREUl84X1JFR19BRERSCQkJMHgwMTYwVUwKKyNkZWZpbmUJCUhXX0NTQV9SRUdfQUREUgkJCQkweDAxNDBVTAorI2RlZmluZQkJSFdfU0lOQl9SRUdfQUREUgkJCTB4MDE4MFVMCisjZGVmaW5lCQlIV19TT1VUQl9SRUdfQUREUgkJCTB4MDE4NFVMCisjZGVmaW5lCQlIV19QS0lfQ09OVFJPTF9SRUdfQUREUgkJCTB4MDFDMFVMCisjZGVmaW5lCQlIV19QS0lfU1RBVFVTX1JFR19BRERSCQkJMHgwMUM0VUwKKyNkZWZpbmUJCUhXX1BLSV9CVVNZX1JFR19BRERSCQkJMHgwMUM4VUwKKyNkZWZpbmUJCUhXX1BLSV9BXzEwMjVfUkVHX0FERFIJCQkweDAxQ0NVTAorI2RlZmluZQkJSFdfUEtJX1NETUFfQ1RMX1JFR19BRERSCQkweDAxRDBVTAorI2RlZmluZQkJSFdfUEtJX1NETUFfT0ZGU0VUX1JFR19BRERSCQkweDAxRDRVTAorI2RlZmluZQkJSFdfUEtJX1NETUFfUE9JTlRFUlNfUkVHX0FERFIJCTB4MDFEOFVMCisjZGVmaW5lCQlIV19QS0lfU0RNQV9ETEVOR19SRUdfQUREUgkJMHgwMURDVUwKKyNkZWZpbmUJCUhXX1BLSV9TRE1BX0VYUF9QT0lOVEVSU19SRUdfQUREUgkweDAxRTBVTAorI2RlZmluZQkJSFdfUEtJX1NETUFfUkVTX1BPSU5URVJTX1JFR19BRERSCTB4MDFFNFVMCisjZGVmaW5lCQlIV19QS0lfQ0xSX1JFR19BRERSCQkJMHgwMUU4VUwKKyNkZWZpbmUJCUhXX1BLSV9TRE1BX0JVU1lfUkVHX0FERFIJCTB4MDFFOFVMCisjZGVmaW5lCQlIV19QS0lfU0RNQV9GSVJTVF9FWFBfTl9SRUdfQUREUgkweDAxRUNVTAorI2RlZmluZQkJSFdfUEtJX1NETUFfTVVMX0JZMV9SRUdfQUREUgkJMHgwMUYwVUwKKyNkZWZpbmUJCUhXX1BLSV9TRE1BX1JNVUxfU0VMX1JFR19BRERSCQkweDAxRjRVTAorI2RlZmluZQkJSFdfREVTX0tFWV8wX1JFR19BRERSCQkJMHgwMjA4VUwKKyNkZWZpbmUJCUhXX0RFU19LRVlfMV9SRUdfQUREUgkJCTB4MDIwQ1VMCisjZGVmaW5lCQlIV19ERVNfS0VZXzJfUkVHX0FERFIJCQkweDAyMTBVTAorI2RlZmluZQkJSFdfREVTX0tFWV8zX1JFR19BRERSCQkJMHgwMjE0VUwKKyNkZWZpbmUJCUhXX0RFU19LRVlfNF9SRUdfQUREUgkJCTB4MDIxOFVMCisjZGVmaW5lCQlIV19ERVNfS0VZXzVfUkVHX0FERFIJCQkweDAyMUNVTAorI2RlZmluZQkJSFdfREVTX0NPTlRST0xfMF9SRUdfQUREUgkJMHgwMjIwVUwKKyNkZWZpbmUJCUhXX0RFU19DT05UUk9MXzFfUkVHX0FERFIJCTB4MDIyNFVMCisjZGVmaW5lCQlIV19ERVNfSVZfMF9SRUdfQUREUgkJCTB4MDIyOFVMCisjZGVmaW5lCQlIV19ERVNfSVZfMV9SRUdfQUREUgkJCTB4MDIyQ1VMCisjZGVmaW5lCQlIV19BRVNfS0VZXzBfQUREUl8wX1JFR19BRERSCQkweDA0MDBVTAorI2RlZmluZQkJSFdfQUVTX0tFWV8wX0FERFJfMV9SRUdfQUREUgkJMHgwNDA0VUwKKyNkZWZpbmUJCUhXX0FFU19LRVlfMF9BRERSXzJfUkVHX0FERFIJCTB4MDQwOFVMCisjZGVmaW5lCQlIV19BRVNfS0VZXzBfQUREUl8zX1JFR19BRERSCQkweDA0MGNVTAorI2RlZmluZQkJSFdfQUVTX0tFWV8wX0FERFJfNF9SRUdfQUREUgkJMHgwNDEwVUwKKyNkZWZpbmUJCUhXX0FFU19LRVlfMF9BRERSXzVfUkVHX0FERFIJCTB4MDQxNFVMCisjZGVmaW5lCQlIV19BRVNfS0VZXzBfQUREUl82X1JFR19BRERSCQkweDA0MThVTAorI2RlZmluZQkJSFdfQUVTX0tFWV8wX0FERFJfN19SRUdfQUREUgkJMHgwNDFjVUwKKyNkZWZpbmUJCUhXX0FFU19LRVlfMF9SRUdfQUREUgkJCTB4MDQwMFVMCisjZGVmaW5lCQlIV19BRVNfSVZfMF9BRERSXzBfUkVHX0FERFIJCTB4MDQ0MFVMCisjZGVmaW5lCQlIV19BRVNfSVZfMF9BRERSXzFfUkVHX0FERFIJCTB4MDQ0NFVMCisjZGVmaW5lCQlIV19BRVNfSVZfMF9BRERSXzJfUkVHX0FERFIJCTB4MDQ0OFVMCisjZGVmaW5lCQlIV19BRVNfSVZfMF9BRERSXzNfUkVHX0FERFIJCTB4MDQ0Y1VMCisjZGVmaW5lCQlIV19BRVNfSVZfMF9SRUdfQUREUgkJCTB4MDQ0MFVMCisjZGVmaW5lCQlIV19BRVNfQ1RSMV9BRERSXzBfUkVHX0FERFIJCTB4MDQ2MFVMCisjZGVmaW5lCQlIV19BRVNfQ1RSMV9BRERSXzFfUkVHX0FERFIJCTB4MDQ2NFVMCisjZGVmaW5lCQlIV19BRVNfQ1RSMV9BRERSXzJfUkVHX0FERFIJCTB4MDQ2OFVMCisjZGVmaW5lCQlIV19BRVNfQ1RSMV9BRERSXzNfUkVHX0FERFIJCTB4MDQ2Y1VMCisjZGVmaW5lCQlIV19BRVNfQ1RSMV9SRUdfQUREUgkJCTB4MDQ2MFVMCisjZGVmaW5lCQlIV19BRVNfU0tfUkVHX0FERFIJCQkweDA0NzhVTAorI2RlZmluZQkJSFdfQUVTX01BQ19PS19SRUdfQUREUgkJCTB4MDQ4MFVMCisjZGVmaW5lCQlIV19BRVNfUFJFVl9JVl8wX0FERFJfMF9SRUdfQUREUgkweDA0OTBVTAorI2RlZmluZQkJSFdfQUVTX1BSRVZfSVZfMF9BRERSXzFfUkVHX0FERFIJMHgwNDk0VUwKKyNkZWZpbmUJCUhXX0FFU19QUkVWX0lWXzBfQUREUl8yX1JFR19BRERSCTB4MDQ5OFVMCisjZGVmaW5lCQlIV19BRVNfUFJFVl9JVl8wX0FERFJfM19SRUdfQUREUgkweDA0OWNVTAorI2RlZmluZQkJSFdfQUVTX1BSRVZfSVZfMF9SRUdfQUREUgkJMHgwNDkwVUwKKyNkZWZpbmUJCUhXX0FFU19DT05UUk9MX1JFR19BRERSCQkJMHgwNEMwVUwKKyNkZWZpbmUJCUhXX0hBU0hfSDBfUkVHX0FERFIJCQkweDA2NDBVTAorI2RlZmluZQkJSFdfSEFTSF9IMV9SRUdfQUREUgkJCTB4MDY0NFVMCisjZGVmaW5lCQlIV19IQVNIX0gyX1JFR19BRERSCQkJMHgwNjQ4VUwKKyNkZWZpbmUJCUhXX0hBU0hfSDNfUkVHX0FERFIJCQkweDA2NENVTAorI2RlZmluZQkJSFdfSEFTSF9INF9SRUdfQUREUgkJCTB4MDY1MFVMCisjZGVmaW5lCQlIV19IQVNIX0g1X1JFR19BRERSCQkJMHgwNjU0VUwKKyNkZWZpbmUJCUhXX0hBU0hfSDZfUkVHX0FERFIJCQkweDA2NThVTAorI2RlZmluZQkJSFdfSEFTSF9IN19SRUdfQUREUgkJCTB4MDY1Q1VMCisjZGVmaW5lCQlIV19IQVNIX0g4X1JFR19BRERSCQkJMHgwNjYwVUwKKyNkZWZpbmUJCUhXX0hBU0hfSDlfUkVHX0FERFIJCQkweDA2NjRVTAorI2RlZmluZQkJSFdfSEFTSF9IMTBfUkVHX0FERFIJCQkweDA2NjhVTAorI2RlZmluZQkJSFdfSEFTSF9IMTFfUkVHX0FERFIJCQkweDA2NkNVTAorI2RlZmluZQkJSFdfSEFTSF9IMTJfUkVHX0FERFIJCQkweDA2NzBVTAorI2RlZmluZQkJSFdfSEFTSF9IMTNfUkVHX0FERFIJCQkweDA2NzRVTAorI2RlZmluZQkJSFdfSEFTSF9IMTRfUkVHX0FERFIJCQkweDA2NzhVTAorI2RlZmluZQkJSFdfSEFTSF9IMTVfUkVHX0FERFIJCQkweDA2N0NVTAorI2RlZmluZQkJSFdfSEFTSF9DT05UUk9MX1JFR19BRERSCQkweDA3QzBVTAorI2RlZmluZQkJSFdfSEFTSF9QQURfRU5fUkVHX0FERFIJCQkweDA3QzRVTAorI2RlZmluZQkJSFdfSEFTSF9QQURfQ0ZHX1JFR19BRERSCQkweDA3QzhVTAorI2RlZmluZQkJSFdfSEFTSF9DVVJfTEVOXzBfUkVHX0FERFIJCTB4MDdDQ1VMCisjZGVmaW5lCQlIV19IQVNIX0NVUl9MRU5fMV9SRUdfQUREUgkJMHgwN0QwVUwKKyNkZWZpbmUJCUhXX0hBU0hfQ1VSX0xFTl8yX1JFR19BRERSCQkweDA3RDRVTAorI2RlZmluZQkJSFdfSEFTSF9DVVJfTEVOXzNfUkVHX0FERFIJCTB4MDdEOFVMCisjZGVmaW5lCQlIV19IQVNIX1BBUkFNX1JFR19BRERSCQkJMHgwN0RDVUwKKyNkZWZpbmUJCUhXX0hBU0hfSU5UX0JVU1lfUkVHX0FERFIJCTB4MDdFMFVMCisjZGVmaW5lCQlIV19IQVNIX1NXX1JFU0VUX1JFR19BRERSCQkweDA3RTRVTAorI2RlZmluZQkJSFdfSEFTSF9FTkRJQU5FU1NfUkVHX0FERFIJCTB4MDdFOFVMCisjZGVmaW5lCQlIV19IQVNIX0RBVEFfUkVHX0FERFIJCQkweDA3RUNVTAorI2RlZmluZQkJSFdfRFJOR19DT05UUk9MX1JFR19BRERSCQkweDA4MDBVTAorI2RlZmluZQkJSFdfRFJOR19WQUxJRF9SRUdfQUREUgkJCTB4MDgwNFVMCisjZGVmaW5lCQlIV19EUk5HX0RBVEFfUkVHX0FERFIJCQkweDA4MDhVTAorI2RlZmluZQkJSFdfUk5EX1NSQ19FTl9SRUdfQUREUgkJCTB4MDgwQ1VMCisjZGVmaW5lCQlIV19BRVNfQ0xLX0VOQUJMRV9SRUdfQUREUgkJMHgwODEwVUwKKyNkZWZpbmUJCUhXX0RFU19DTEtfRU5BQkxFX1JFR19BRERSCQkweDA4MTRVTAorI2RlZmluZQkJSFdfSEFTSF9DTEtfRU5BQkxFX1JFR19BRERSCQkweDA4MThVTAorI2RlZmluZQkJSFdfUEtJX0NMS19FTkFCTEVfUkVHX0FERFIJCTB4MDgxQ1VMCisjZGVmaW5lCQlIV19DTEtfU1RBVFVTX1JFR19BRERSCQkJMHgwODI0VUwKKyNkZWZpbmUJCUhXX0NMS19FTkFCTEVfUkVHX0FERFIJCQkweDA4MjhVTAorI2RlZmluZQkJSFdfRFJOR19TQU1QTEVfUkVHX0FERFIJCQkweDA4NTBVTAorI2RlZmluZQkJSFdfUk5EX1NSQ19DVExfUkVHX0FERFIJCQkweDA4NThVTAorI2RlZmluZQkJSFdfQ1JZUFRPX0NUTF9SRUdfQUREUgkJCTB4MDkwMFVMCisjZGVmaW5lCQlIV19DUllQVE9fU1RBVFVTX1JFR19BRERSCQkweDA5MENVTAorI2RlZmluZQkJSFdfQ1JZUFRPX0JVU1lfUkVHX0FERFIJCQkweDA5MTBVTAorI2RlZmluZQkJSFdfQUVTX0JVU1lfUkVHX0FERFIJCQkweDA5MTRVTAorI2RlZmluZQkJSFdfREVTX0JVU1lfUkVHX0FERFIJCQkweDA5MThVTAorI2RlZmluZQkJSFdfSEFTSF9CVVNZX1JFR19BRERSCQkJMHgwOTFDVUwKKyNkZWZpbmUJCUhXX0NPTlRFTlRfUkVHX0FERFIJCQkweDA5MjRVTAorI2RlZmluZQkJSFdfVkVSU0lPTl9SRUdfQUREUgkJCTB4MDkyOFVMCisjZGVmaW5lCQlIV19DT05URVhUX0lEX1JFR19BRERSCQkJMHgwOTMwVUwKKyNkZWZpbmUJCUhXX0RJTl9CVUZGRVJfUkVHX0FERFIJCQkweDBDMDBVTAorI2RlZmluZQkJSFdfRElOX01FTV9ETUFfQlVTWV9SRUdfQUREUgkJMHgwYzIwVUwKKyNkZWZpbmUJCUhXX1NSQ19MTElfTUVNX0FERFJfUkVHX0FERFIJCTB4MGMyNFVMCisjZGVmaW5lCQlIV19TUkNfTExJX1dPUkQwX1JFR19BRERSCQkweDBDMjhVTAorI2RlZmluZQkJSFdfU1JDX0xMSV9XT1JEMV9SRUdfQUREUgkJMHgwQzJDVUwKKyNkZWZpbmUJCUhXX1NSQU1fU1JDX0FERFJfUkVHX0FERFIJCTB4MGMzMFVMCisjZGVmaW5lCQlIV19ESU5fU1JBTV9CWVRFU19MRU5fUkVHX0FERFIJCTB4MGMzNFVMCisjZGVmaW5lCQlIV19ESU5fU1JBTV9ETUFfQlVTWV9SRUdfQUREUgkJMHgwQzM4VUwKKyNkZWZpbmUJCUhXX1dSSVRFX0FMSUdOX1JFR19BRERSCQkJMHgwQzNDVUwKKyNkZWZpbmUJCUhXX09MRF9EQVRBX1JFR19BRERSCQkJMHgwQzQ4VUwKKyNkZWZpbmUJCUhXX1dSSVRFX0FMSUdOX0xBU1RfUkVHX0FERFIJCTB4MEM0Q1VMCisjZGVmaW5lCQlIV19ET1VUX0JVRkZFUl9SRUdfQUREUgkJCTB4MEMwMFVMCisjZGVmaW5lCQlIV19EU1RfTExJX1dPUkQwX1JFR19BRERSCQkweDBEMjhVTAorI2RlZmluZQkJSFdfRFNUX0xMSV9XT1JEMV9SRUdfQUREUgkJMHgwRDJDVUwKKyNkZWZpbmUJCUhXX0RTVF9MTElfTUVNX0FERFJfUkVHX0FERFIJCTB4MEQyNFVMCisjZGVmaW5lCQlIV19ET1VUX01FTV9ETUFfQlVTWV9SRUdfQUREUgkJMHgwRDIwVUwKKyNkZWZpbmUJCUhXX1NSQU1fREVTVF9BRERSX1JFR19BRERSCQkweDBEMzBVTAorI2RlZmluZQkJSFdfRE9VVF9TUkFNX0JZVEVTX0xFTl9SRUdfQUREUgkJMHgwRDM0VUwKKyNkZWZpbmUJCUhXX0RPVVRfU1JBTV9ETUFfQlVTWV9SRUdfQUREUgkJMHgwRDM4VUwKKyNkZWZpbmUJCUhXX1JFQURfQUxJR05fUkVHX0FERFIJCQkweDBEM0NVTAorI2RlZmluZQkJSFdfUkVBRF9MQVNUX0RBVEFfUkVHX0FERFIJCTB4MEQ0NFVMCisjZGVmaW5lCQlIV19SQzRfVEhSVV9DUFVfUkVHX0FERFIJCTB4MEQ0Q1VMCisjZGVmaW5lCQlIV19BSEJfU0lOR0xFX1JFR19BRERSCQkJMHgwRTAwVUwKKyNkZWZpbmUJCUhXX1NSQU1fREFUQV9SRUdfQUREUgkJCTB4MEYwMFVMCisjZGVmaW5lCQlIV19TUkFNX0FERFJfUkVHX0FERFIJCQkweDBGMDRVTAorI2RlZmluZQkJSFdfU1JBTV9EQVRBX1JFQURZX1JFR19BRERSCQkweDBGMDhVTAorI2RlZmluZQkJSFdfSE9TVF9JUlJfUkVHX0FERFIJCQkweDBBMDBVTAorI2RlZmluZQkJSFdfSE9TVF9JTVJfUkVHX0FERFIJCQkweDBBMDRVTAorI2RlZmluZQkJSFdfSE9TVF9JQ1JfUkVHX0FERFIJCQkweDBBMDhVTAorI2RlZmluZQkJSFdfSE9TVF9TRVBfU1JBTV9USFJFU0hPTERfUkVHX0FERFIJMHgwQTEwVUwKKyNkZWZpbmUJCUhXX0hPU1RfU0VQX0JVU1lfUkVHX0FERFIJCTB4MEExNFVMCisjZGVmaW5lCQlIV19IT1NUX1NFUF9MQ1NfUkVHX0FERFIJCTB4MEExOFVMCisjZGVmaW5lCQlIV19IT1NUX0NDX1NXX1JTVF9SRUdfQUREUgkJMHgwQTQwVUwKKyNkZWZpbmUJCUhXX0hPU1RfU0VQX1NXX1JTVF9SRUdfQUREUgkJMHgwQTQ0VUwKKyNkZWZpbmUJCUhXX0hPU1RfRkxPV19ETUFfU1dfSU5UMF9SRUdfQUREUgkweDBBODBVTAorI2RlZmluZQkJSFdfSE9TVF9GTE9XX0RNQV9TV19JTlQxX1JFR19BRERSCTB4MEE4NFVMCisjZGVmaW5lCQlIV19IT1NUX0ZMT1dfRE1BX1NXX0lOVDJfUkVHX0FERFIJMHgwQTg4VUwKKyNkZWZpbmUJCUhXX0hPU1RfRkxPV19ETUFfU1dfSU5UM19SRUdfQUREUgkweDBBOGNVTAorI2RlZmluZQkJSFdfSE9TVF9GTE9XX0RNQV9TV19JTlQ0X1JFR19BRERSCTB4MEE5MFVMCisjZGVmaW5lCQlIV19IT1NUX0ZMT1dfRE1BX1NXX0lOVDVfUkVHX0FERFIJMHgwQTk0VUwKKyNkZWZpbmUJCUhXX0hPU1RfRkxPV19ETUFfU1dfSU5UNl9SRUdfQUREUgkweDBBOThVTAorI2RlZmluZQkJSFdfSE9TVF9GTE9XX0RNQV9TV19JTlQ3X1JFR19BRERSCTB4MEE5Y1VMCisjZGVmaW5lCQlIV19IT1NUX1NFUF9IT1NUX0dQUjBfUkVHX0FERFIJCTB4MEIwMFVMCisjZGVmaW5lCQlIV19IT1NUX1NFUF9IT1NUX0dQUjFfUkVHX0FERFIJCTB4MEIwNFVMCisjZGVmaW5lCQlIV19IT1NUX1NFUF9IT1NUX0dQUjJfUkVHX0FERFIJCTB4MEIwOFVMCisjZGVmaW5lCQlIV19IT1NUX1NFUF9IT1NUX0dQUjNfUkVHX0FERFIJCTB4MEIwQ1VMCisjZGVmaW5lCQlIV19IT1NUX0hPU1RfU0VQX0dQUjBfUkVHX0FERFIJCTB4MEI4MFVMCisjZGVmaW5lCQlIV19IT1NUX0hPU1RfU0VQX0dQUjFfUkVHX0FERFIJCTB4MEI4NFVMCisjZGVmaW5lCQlIV19IT1NUX0hPU1RfU0VQX0dQUjJfUkVHX0FERFIJCTB4MEI4OFVMCisjZGVmaW5lCQlIV19IT1NUX0hPU1RfU0VQX0dQUjNfUkVHX0FERFIJCTB4MEI4Q1VMCisjZGVmaW5lCQlIV19IT1NUX0hPU1RfRU5ESUFOX1JFR19BRERSCQkweDBCOTBVTAorI2RlZmluZQkJSFdfSE9TVF9IT1NUX0NPTU1fQ0xLX0VOX1JFR19BRERSCTB4MEI5NFVMCisjZGVmaW5lCQlIV19DTFJfU1JBTV9CVVNZX1JFR19SRUdfQUREUgkJMHgwRjBDVUwKKyNkZWZpbmUJCUhXX0NDX1NSQU1fQkFTRV9BRERSRVNTCQkJMHg1ODAwVUwKKworI2VuZGlmCQkvKiBpZm5kZWYgSFdfREVGUyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtN3h4L3NtdGNmYi5jIGIvZHJpdmVycy9zdGFnaW5nL3NtN3h4L3NtdGNmYi5jCmluZGV4IDI0ZjQ3ZDYuLmY0YjE2M2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zbTd4eC9zbXRjZmIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc203eHgvc210Y2ZiLmMKQEAgLTk5Niw3ICs5OTYsNyBAQAogCiAKIC8qIEphc29uICgwOC8xMS8yMDA5KSBQQ0lfRFJWIHdyYXBwZXIgZXNzZW50aWFsIHN0cnVjdHMgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzbXRjZmJfcGNpX3RhYmxlW10gPSB7CitzdGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUoc210Y2ZiX3BjaV90YWJsZSkgPSB7CiAJezB4MTI2ZiwgMHg3MTAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAogCXsweDEyNmYsIDB4NzEyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKIAl7MHgxMjZmLCAweDcyMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9LY29uZmlnCmluZGV4IGQ5NjM5OGMuLjJjZjc3YzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9LY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogY29uZmlnIFNPTE82WDEwCiAJdHJpc3RhdGUgIlNvZnRsb2dpYyA2eDEwIE1QRUcgY29kZWMgY2FyZHMiCi0JZGVwZW5kcyBvbiBQQ0kgJiYgVklERU9fREVWICYmIFNORAotCXNlbGVjdCBWSURFT0JVRl9ETUFfQ09OVElHCisJZGVwZW5kcyBvbiBQQ0kgJiYgVklERU9fREVWICYmIFNORCAmJiBJMkMKKwlzZWxlY3QgVklERU9CVUZfRE1BX1NHCiAJLS0taGVscC0tLQogCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIFNvZnRsb2dpYyBiYXNlZCBNUEVHLTQgYW5kIGguMjY0IGNvZGVjCiAJICBjb2RlYyBjYXJkcy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL1RPRE8KaW5kZXggZTZhMmVlMi4uN2U2YzRmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL1RPRE8KKysrIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL1RPRE8KQEAgLTEsNyArMSw1IEBACiBUT0RPIChzdGFnaW5nID0+IG1haW4pOgogCi0JKiBjaGVja3BhdGNoLnBsIChoYXZlbid0IHJ1biBpdCB5ZXQpCi0JKiBMaW5kZW50IChzaG91bGQgYmUgY2xlYW4sIGJ1dCBjaGVjaykKIAkqIE1vdGlvbiBkZXRlY3Rpb24gZmxhZ3MgbmVlZCB0byBiZSBtb3ZlZCB0byB2NGwyCiAJKiBTb21lIHByaXZhdGUgQ0lEcyBuZWVkIHRvIGJlIG1vdmVkIHRvIHY0bDIKIApAQCAtMjEsOCArMTksNiBAQAogCSAgLSBpbXBsZW1lbnQgcGxheWJhY2sgdmlhIGV4dGVybmFsIHNvdW5kIGphY2sKIAkgIC0gaW1wbGVtZW50IGxvb3BiYWNrIG9mIGV4dGVybmFsIHNvdW5kIGphY2sgd2l0aCBpbmNvbWluZyBhdWRpbz8KIAkgIC0gaW1wbGVtZW50IHBhdXNlL3Jlc3VtZQotCSAgLSBjaGVjayBpbnRvIGphY2tpbmcgc291bmQgZnJvbSB0eDI4eHggY2hpcHMgZGlyZWN0bHkgKHRvIGF2b2lkCi0JICAgIGcuNzIzLzhraHogbGltaXRhdGlvbnMpCiAKIFBsYXNlIHNlbmQgcGF0Y2hlcyB0byBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPiBhbmQgQ2MgQmVuIENvbGxpbnMKIDxiY29sbGluc0BibHVlY2hlcnJ5Lm5ldD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC1jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtY29yZS5jCmluZGV4IDRhMDUxY2QuLmM0MzMxMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC1jb3JlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLWNvcmUuYwpAQCAtMTM2LDYgKzEzNiw3IEBACiAJaW50IHJldDsKIAlpbnQgc2RyYW07CiAJdTggY2hpcF9pZDsKKwogCXNvbG9fZGV2ID0ga3phbGxvYyhzaXplb2YoKnNvbG9fZGV2KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHNvbG9fZGV2ID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMTYzLDIxICsxNjQsMjEgQEAKIAljaGlwX2lkID0gc29sb19yZWdfcmVhZChzb2xvX2RldiwgU09MT19DSElQX09QVElPTikgJgogCQkJCQlTT0xPX0NISVBfSURfTUFTSzsKIAlzd2l0Y2ggKGNoaXBfaWQpIHsKLQkJY2FzZSA3OgotCQkJc29sb19kZXYtPm5yX2NoYW5zID0gMTY7Ci0JCQlzb2xvX2Rldi0+bnJfZXh0ID0gNTsKLQkJCWJyZWFrOwotCQljYXNlIDY6Ci0JCQlzb2xvX2Rldi0+bnJfY2hhbnMgPSA4OwotCQkJc29sb19kZXYtPm5yX2V4dCA9IDI7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWRldl93YXJuKCZwZGV2LT5kZXYsICJJbnZhbGlkIGNoaXBfaWQgMHglMDJ4LCAiCi0JCQkJICJkZWZhdWx0aW5nIHRvIDQgY2hhbm5lbHNcbiIsCi0JCQkJIGNoaXBfaWQpOwotCQljYXNlIDU6Ci0JCQlzb2xvX2Rldi0+bnJfY2hhbnMgPSA0OwotCQkJc29sb19kZXYtPm5yX2V4dCA9IDE7CisJY2FzZSA3OgorCQlzb2xvX2Rldi0+bnJfY2hhbnMgPSAxNjsKKwkJc29sb19kZXYtPm5yX2V4dCA9IDU7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJc29sb19kZXYtPm5yX2NoYW5zID0gODsKKwkJc29sb19kZXYtPm5yX2V4dCA9IDI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJJbnZhbGlkIGNoaXBfaWQgMHglMDJ4LCAiCisJCQkgImRlZmF1bHRpbmcgdG8gNCBjaGFubmVsc1xuIiwKKwkJCSBjaGlwX2lkKTsKKwljYXNlIDU6CisJCXNvbG9fZGV2LT5ucl9jaGFucyA9IDQ7CisJCXNvbG9fZGV2LT5ucl9leHQgPSAxOwogCX0KIAogCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMgdG8gc3RhcnQgKi8KQEAgLTI2MSwxMyArMjYyLDE4IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzb2xvNjAxMF9pZF90YWJsZVtdID0geworCS8qIDYwMTAgYmFzZWQgY2FyZHMgKi8KIAl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1NPRlRMT0dJQywgUENJX0RFVklDRV9JRF9TT0xPNjAxMCl9LAogCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQkxVRUNIRVJSWSwgUENJX0RFVklDRV9JRF9ORVVTT0xPXzQpfSwKIAl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0JMVUVDSEVSUlksIFBDSV9ERVZJQ0VfSURfTkVVU09MT185KX0sCiAJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9CTFVFQ0hFUlJZLCBQQ0lfREVWSUNFX0lEX05FVVNPTE9fMTYpfSwKLQl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0JMVUVDSEVSUlksIFBDSV9ERVZJQ0VfSURfQ09NTVNPTE9fNCl9LAotCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQkxVRUNIRVJSWSwgUENJX0RFVklDRV9JRF9DT01NU09MT185KX0sCi0Je1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9CTFVFQ0hFUlJZLCBQQ0lfREVWSUNFX0lEX0NPTU1TT0xPXzE2KX0sCisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9CTFVFQ0hFUlJZLCBQQ0lfREVWSUNFX0lEX0JDX1NPTE9fNCl9LAorCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQkxVRUNIRVJSWSwgUENJX0RFVklDRV9JRF9CQ19TT0xPXzkpfSwKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0JMVUVDSEVSUlksIFBDSV9ERVZJQ0VfSURfQkNfU09MT18xNil9LAorCS8qIDYxMTAgYmFzZWQgY2FyZHMgKi8KKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0JMVUVDSEVSUlksIFBDSV9ERVZJQ0VfSURfQkNfNjExMF80KX0sCisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9CTFVFQ0hFUlJZLCBQQ0lfREVWSUNFX0lEX0JDXzYxMTBfOCl9LAorCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQkxVRUNIRVJSWSwgUENJX0RFVklDRV9JRF9CQ182MTEwXzE2KX0sCiAJezAsfQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLWRpc3AuYyBiL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC1kaXNwLmMKaW5kZXggNTU1ZjAyNC4uZjg2NmY4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLWRpc3AuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtZGlzcC5jCkBAIC0xOTgsMTIgKzE5OCwxMiBAQAogCX0KIAogCS8qIERlZmF1bHQgbW90aW9uIHNldHRpbmdzICovCi0gICAgICAgIHNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1ZJX01PVF9BRFIsIFNPTE9fVklfTU9USU9OX0VOKDApIHwKKwlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19WSV9NT1RfQURSLCBTT0xPX1ZJX01PVElPTl9FTigwKSB8CiAJCSAgICAgICAoU09MT19NT1RJT05fRVhUX0FERFIoc29sb19kZXYpID4+IDE2KSk7CiAJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVklfTU9UX0NUUkwsCiAJCSAgICAgICBTT0xPX1ZJX01PVElPTl9GUkFNRV9DT1VOVCgzKSB8CiAJCSAgICAgICBTT0xPX1ZJX01PVElPTl9TQU1QTEVfTEVOR1RIKHNvbG9fZGV2LT52aWRlb19oc2l6ZSAvIDE2KQotCQkgICAgICAgfCAvL1NPTE9fVklfTU9USU9OX0lOVFJfU1RBUlRfU1RPUCB8CisJCSAgICAgICB8IC8qIFNPTE9fVklfTU9USU9OX0lOVFJfU1RBUlRfU1RPUCB8ICovCiAJCSAgICAgICBTT0xPX1ZJX01PVElPTl9TQU1QTEVfQ09VTlQoMTApKTsKIAogCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1ZJX01PVElPTl9CT1JERVIsIDApOwpAQCAtMjY0LDcgKzI2NCw3IEBACiAJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVk9fUkVDVEFOR0xFX0NUUkwoMCksIDApOwogCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1ZPX1JFQ1RBTkdMRV9TVEFSVCgwKSwgMCk7CiAJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVk9fUkVDVEFOR0xFX1NUT1AoMCksIDApOwotCQorCiAJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVk9fUkVDVEFOR0xFX0NUUkwoMSksIDApOwogCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1ZPX1JFQ1RBTkdMRV9TVEFSVCgxKSwgMCk7CiAJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVk9fUkVDVEFOR0xFX1NUT1AoMSksIDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLWVuYy5jIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLWVuYy5jCmluZGV4IGE2Y2YwYTguLjQ4MWE0OTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC1lbmMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtZW5jLmMKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlICJzb2xvNjAxMC5oIgogI2luY2x1ZGUgInNvbG82MDEwLW9zZC1mb250LmgiCiAKLSNkZWZpbmUgQ0FQVFVSRV9NQVhfQkFORFdJRFRICQkzMgkvLyBEMSA0Y2hhbm5lbCAoRDEgPT0gNCkKKyNkZWZpbmUgQ0FQVFVSRV9NQVhfQkFORFdJRFRICQkzMgkvKiBEMSA0Y2hhbm5lbCAoRDEgPT0gNCkgKi8KICNkZWZpbmUgT1NHX0JVRkZFUl9TSVpFCQkJMTAyNAogCiAjZGVmaW5lIFZJX1BST0dfSFNJWkUJCQkoMTI4MCAtIDE2KQpAQCAtMTQ1LDggKzE0NSw4IEBACiAKIAlzb2xvX3AybV9kbWEoc29sb19kZXYsIDAsIDEsIGJ1ZiwgU09MT19FT1NEX0VYVF9BRERSKHNvbG9fZGV2KSArCiAJCSAgICAgKHNvbG9fZW5jLT5jaCAqIFNPTE9fRU9TRF9FWFRfU0laRSksIFNPTE9fRU9TRF9FWFRfU0laRSk7Ci0gICAgICAgIHJlZyB8PSAoMSA8PCBzb2xvX2VuYy0+Y2gpOwotICAgICAgICBzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19WRV9PU0RfQ0gsIHJlZyk7CisJcmVnIHw9ICgxIDw8IHNvbG9fZW5jLT5jaCk7CisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVkVfT1NEX0NILCByZWcpOwogCiAJa2ZyZWUoYnVmKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLWc3MjMuYyBiL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC1nNzIzLmMKaW5kZXggODJmYmNiOC4uMjU0YjQ2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLWc3MjMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtZzcyMy5jCkBAIC00Nyw3ICs0Nyw3IEBACiAgKiBpcyBicm9rZW4gZG93biB0byAyMCAqIDQ4IGJ5dGUgcmVnaW9ucyAob25lIGZvciBlYWNoIGNoYW5uZWwgcG9zc2libGUpCiAgKiB3aXRoIHRoZSByZXN0IG9mIHRoZSBwYWdlIGJlaW5nIGR1bW15IGRhdGEuICovCiAjZGVmaW5lIE1BWF9CVUZGRVIJCShHNzIzX1BFUklPRF9CWVRFUyAqIFBFUklPRFNfTUFYKQotI2RlZmluZSBJUlFfUEFHRVMJCTQgLy8gMCAtIDQKKyNkZWZpbmUgSVJRX1BBR0VTCQk0IC8qIDAgLSA0ICovCiAjZGVmaW5lIFBFUklPRFNfTUlOCQkoMSA8PCBJUlFfUEFHRVMpCiAjZGVmaW5lIFBFUklPRFNfTUFYCQlHNzIzX0ZETUFfUEFHRVMKIApAQCAtMTU4LDcgKzE1OCw3IEBACiAJc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzcykgPSBzb2xvX3BjbS0+c29sb19kZXY7CiAJa2ZyZWUoc29sb19wY20pOwogCi0gICAgICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHNuZF9zb2xvX3BjbV90cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3MsIGludCBjbWQpCkBAIC0xOTcsNyArMTk3LDcgQEAKIAogc3RhdGljIGludCBzbmRfc29sb19wY21fcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnNzKQogewotICAgICAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNuZF9zb2xvX3BjbV9wb2ludGVyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3MpCkBAIC0yNzEsNyArMjcxLDcgQEAKIAogCXZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gdHcyOF9nZXRfYXVkaW9fZ2Fpbihzb2xvX2RldiwgY2gpOwogCi0gICAgICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHNuZF9zb2xvX2NhcHR1cmVfdm9sdW1lX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKQEAgLTI3OSwxNSArMjc5LDE1IEBACiB7CiAJc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJdTggY2ggPSB2YWx1ZS0+aWQubnVtaWQgLSAxOwotICAgICAgICB1OCBvbGRfdmFsOworCXU4IG9sZF92YWw7CiAKLSAgICAgICAgb2xkX3ZhbCA9IHR3MjhfZ2V0X2F1ZGlvX2dhaW4oc29sb19kZXYsIGNoKTsKKwlvbGRfdmFsID0gdHcyOF9nZXRfYXVkaW9fZ2Fpbihzb2xvX2RldiwgY2gpOwogCWlmIChvbGRfdmFsID09IHZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQogCQlyZXR1cm4gMDsKIAogCXR3Mjhfc2V0X2F1ZGlvX2dhaW4oc29sb19kZXYsIGNoLCB2YWx1ZS0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CiAKLSAgICAgICAgcmV0dXJuIDE7CisJcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfc29sb19jYXB0dXJlX3ZvbHVtZSA9IHsKQEAgLTM2OCwxNCArMzY4LDE2IEBACiAJc3RyY3B5KGNhcmQtPm1peGVybmFtZSwgIlNPTE8tNjAxMCIpOwogCWtjdGwgPSBzbmRfc29sb19jYXB0dXJlX3ZvbHVtZTsKIAlrY3RsLmNvdW50ID0gc29sb19kZXYtPm5yX2NoYW5zOwotICAgICAgICByZXQgPSBzbmRfY3RsX2FkZChjYXJkLCBzbmRfY3RsX25ldzEoJmtjdGwsIHNvbG9fZGV2KSk7CisJcmV0ID0gc25kX2N0bF9hZGQoY2FyZCwgc25kX2N0bF9uZXcxKCZrY3RsLCBzb2xvX2RldikpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JaWYgKChyZXQgPSBzb2xvX3NuZF9wY21faW5pdChzb2xvX2RldikpIDwgMCkKKwlyZXQgPSBzb2xvX3NuZF9wY21faW5pdChzb2xvX2Rldik7CisJaWYgKHJldCA8IDApCiAJCWdvdG8gc25kX2Vycm9yOwogCi0JaWYgKChyZXQgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKSkgPCAwKQorCXJldCA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpOworCWlmIChyZXQgPCAwKQogCQlnb3RvIHNuZF9lcnJvcjsKIAogCXNvbG9fZzcyM19jb25maWcoc29sb19kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLWdwaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC1ncGlvLmMKaW5kZXggNDZmN2E3MWVkYS4uODg2OWI4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLWdwaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtZ3Bpby5jCkBAIC05Miw4ICs5Miw4IEBACiAKIGludCBzb2xvX2dwaW9faW5pdChzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldikKIHsKLSAgICAgICAgc29sb19ncGlvX2NvbmZpZyhzb2xvX2Rldik7Ci0gICAgICAgIHJldHVybiAwOworCXNvbG9fZ3Bpb19jb25maWcoc29sb19kZXYpOworCXJldHVybiAwOwogfQogCiB2b2lkIHNvbG9fZ3Bpb19leGl0KHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLWkyYy5jIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLWkyYy5jCmluZGV4IGNhZGQ1MTIuLjYwYjY5Y2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC1pMmMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtaTJjLmMKQEAgLTQ2LDcgKzQ2LDcgQEAKIAogCWkyY190cmFuc2Zlcigmc29sb19kZXYtPmkyY19hZGFwW2lkXSwgbXNncywgMik7CiAKLSAgICAgICAgcmV0dXJuIGRhdGE7CisJcmV0dXJuIGRhdGE7CiB9CiAKIHZvaWQgc29sb19pMmNfd3JpdGVieXRlKHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2LCBpbnQgaWQsIHU4IGFkZHIsCkBAIC0yMjUsOSArMjI1LDkgQEAKIAl9CiAKIAlpZiAoaSA9PSBTT0xPX0kyQ19BREFQVEVSUykKLQkJcmV0dXJuIG51bTsgLy8gWFhYIFJpZ2h0IHJldHVybiB2YWx1ZSBmb3IgZmFpbHVyZT8KKwkJcmV0dXJuIG51bTsgLyogWFhYIFJpZ2h0IHJldHVybiB2YWx1ZSBmb3IgZmFpbHVyZT8gKi8KIAotCWRvd24oJnNvbG9fZGV2LT5pMmNfc2VtKTsKKwltdXRleF9sb2NrKCZzb2xvX2Rldi0+aTJjX211dGV4KTsKIAlzb2xvX2Rldi0+aTJjX2lkID0gaTsKIAlzb2xvX2Rldi0+aTJjX21zZyA9IG1zZ3M7CiAJc29sb19kZXYtPmkyY19tc2dfbnVtID0gbnVtOwpAQCAtMjU4LDcgKzI1OCw3IEBACiAJc29sb19kZXYtPmkyY19zdGF0ZSA9IElJQ19TVEFURV9JRExFOwogCXNvbG9fZGV2LT5pMmNfaWQgPSAtMTsKIAotCXVwKCZzb2xvX2Rldi0+aTJjX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZzb2xvX2Rldi0+aTJjX211dGV4KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0yODQsNyArMjg0LDcgQEAKIAlzb2xvX2Rldi0+aTJjX2lkID0gLTE7CiAJc29sb19kZXYtPmkyY19zdGF0ZSA9IElJQ19TVEFURV9JRExFOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNvbG9fZGV2LT5pMmNfd2FpdCk7Ci0Jc2VtYV9pbml0KCZzb2xvX2Rldi0+aTJjX3NlbSwgMSk7CisJbXV0ZXhfaW5pdCgmc29sb19kZXYtPmkyY19tdXRleCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgU09MT19JMkNfQURBUFRFUlM7IGkrKykgewogCQlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAgPSAmc29sb19kZXYtPmkyY19hZGFwW2ldOwpAQCAtMjk2LDcgKzI5Niw4IEBACiAJCWFkYXAtPnJldHJpZXMgPSAxOwogCQlhZGFwLT5kZXYucGFyZW50ID0gJnNvbG9fZGV2LT5wZGV2LT5kZXY7CiAKLQkJaWYgKChyZXQgPSBpMmNfYWRkX2FkYXB0ZXIoYWRhcCkpKSB7CisJCXJldCA9IGkyY19hZGRfYWRhcHRlcihhZGFwKTsKKwkJaWYgKHJldCkgewogCQkJYWRhcC0+YWxnb19kYXRhID0gTlVMTDsKIAkJCWJyZWFrOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtb3NkLWZvbnQuaCBiL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC1vc2QtZm9udC5oCmluZGV4IGQ2ZjU2NWIuLmQ3MmVmYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC1vc2QtZm9udC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC1vc2QtZm9udC5oCkBAIC0yMiw3ICsyMiw3IEBACiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc29sb19vc2RfZm9udFtdID0gewogCTB4MDAwMDAwMDAsIDB4MDAwMGMwYzgsIDB4Y2NmZWZlMGMsIDB4MDgwMDAwMDAsCi0JMHgwMDAwMDAwMCwgMHgxMDEwMzgzOCwgMHg3YzdjZmVmZSwgMHgwMDAwMDAwMCwJLy8gMAorCTB4MDAwMDAwMDAsIDB4MTAxMDM4MzgsIDB4N2M3Y2ZlZmUsIDB4MDAwMDAwMDAsCS8qIDAgKi8KIAkweDAwMDAwMDAwLCAweGZlZmU3YzdjLCAweDM4MzgxMDEwLCAweDEwMDAwMDAwLAogCTB4MDAwMDAwMDAsIDB4N2M4MmZlZmUsIDB4ZmVmZWZlN2MsIDB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwgMHgwMDAwMTAzOCwgMHgxMDAwMDAwMCwgMHgwMDAwMDAwMCwKQEAgLTU0LDY3ICs1NCw2NyBAQAogCTB4MDAwMDAwM2YsIDB4N2Y0MDRjNTIsIDB4NTI0YzQwN2YsIDB4MDAwMDAwMDAsCiAJMHgwMDAwMDA3YywgMHg4MmJhODJiYSwgMHg4MmJhODJmZSwgMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsIDB4MTgzYzNjM2MsIDB4MTgxODAwMTgsIDB4MTgwMDAwMDAsCS8vIDMyICAgIQorCTB4MDAwMDAwMDAsIDB4MTgzYzNjM2MsIDB4MTgxODAwMTgsIDB4MTgwMDAwMDAsCS8qIDMyICAgISAqLwogCTB4MDAwMDAwNjYsIDB4NjYyNDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwgMHg2YzZjZmU2YywgMHg2YzZjZmU2YywgMHg2YzAwMDAwMCwJLy8gMzQgIiAjCisJMHgwMDAwMDAwMCwgMHg2YzZjZmU2YywgMHg2YzZjZmU2YywgMHg2YzAwMDAwMCwJLyogMzQgIiAjICovCiAJMHgwMDAwMTAxMCwgMHg3Y2Q2ZDYxNiwgMHg3Y2QwZDZkNiwgMHg3YzEwMTAwMCwKLQkweDAwMDAwMDAwLCAweDAwODZjNjYwLCAweDMwMTgwY2M2LCAweGMyMDAwMDAwLAkvLyAzNiAkICUKKwkweDAwMDAwMDAwLCAweDAwODZjNjYwLCAweDMwMTgwY2M2LCAweGMyMDAwMDAwLAkvKiAzNiAkICUgKi8KIAkweDAwMDAwMDAwLCAweDM4NmM2YzM4LCAweGRjNzY2NjY2LCAweGRjMDAwMDAwLAotCTB4MDAwMDAwMGMsIDB4MGMwYzA2MDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCS8vIDM4ICYgJworCTB4MDAwMDAwMGMsIDB4MGMwYzA2MDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCS8qIDM4ICYgJyAqLwogCTB4MDAwMDAwMDAsIDB4MzAxODBjMGMsIDB4MGMwYzBjMTgsIDB4MzAwMDAwMDAsCi0JMHgwMDAwMDAwMCwgMHgwYzE4MzAzMCwgMHgzMDMwMzAxOCwgMHgwYzAwMDAwMCwJLy8gNDAgKCApCisJMHgwMDAwMDAwMCwgMHgwYzE4MzAzMCwgMHgzMDMwMzAxOCwgMHgwYzAwMDAwMCwJLyogNDAgKCApICovCiAJMHgwMDAwMDAwMCwgMHgwMDAwNjYzYywgMHhmZjNjNjYwMCwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLCAweDAwMDAxODE4LCAweDdlMTgxODAwLCAweDAwMDAwMDAwLAkvLyA0MiAqICsKKwkweDAwMDAwMDAwLCAweDAwMDAxODE4LCAweDdlMTgxODAwLCAweDAwMDAwMDAwLAkvKiA0MiAqICsgKi8KIAkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwZTBlLCAweDBjMDYwMDAwLAotCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4N2UwMDAwMDAsIDB4MDAwMDAwMDAsCS8vIDQ0ICwgLQorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4N2UwMDAwMDAsIDB4MDAwMDAwMDAsCS8qIDQ0ICwgLSAqLwogCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDYsIDB4MDYwMDAwMDAsCi0JMHgwMDAwMDAwMCwgMHg4MGMwNjAzMCwgMHgxODBjMDYwMiwgMHgwMDAwMDAwMCwJLy8gNDYgLiAvCisJMHgwMDAwMDAwMCwgMHg4MGMwNjAzMCwgMHgxODBjMDYwMiwgMHgwMDAwMDAwMCwJLyogNDYgLiAvICovCiAJMHgwMDAwMDA3YywgMHhjNmU2ZjZkZSwgMHhjZWM2YzY3YywgMHgwMDAwMDAwMCwKLQkweDAwMDAwMDMwLCAweDM4M2MzMDMwLCAweDMwMzAzMGZjLCAweDAwMDAwMDAwLAkvLyA0OCAwIDEKKwkweDAwMDAwMDMwLCAweDM4M2MzMDMwLCAweDMwMzAzMGZjLCAweDAwMDAwMDAwLAkvKiA0OCAwIDEgKi8KIAkweDAwMDAwMDdjLCAweGM2YzA2MDMwLCAweDE4MGNjNmZlLCAweDAwMDAwMDAwLAotCTB4MDAwMDAwN2MsIDB4YzZjMGMwN2MsIDB4YzBjMGM2N2MsIDB4MDAwMDAwMDAsCS8vIDUwIDIgMworCTB4MDAwMDAwN2MsIDB4YzZjMGMwN2MsIDB4YzBjMGM2N2MsIDB4MDAwMDAwMDAsCS8qIDUwIDIgMyAqLwogCTB4MDAwMDAwNjAsIDB4NzA3ODZjNjYsIDB4ZmU2MDYwZjAsIDB4MDAwMDAwMDAsCi0JMHgwMDAwMDBmZSwgMHgwNjA2MDY3ZSwgMHhjMGMwYzY3YywgMHgwMDAwMDAwMCwJLy8gNTIgNCA1CisJMHgwMDAwMDBmZSwgMHgwNjA2MDY3ZSwgMHhjMGMwYzY3YywgMHgwMDAwMDAwMCwJLyogNTIgNCA1ICovCiAJMHgwMDAwMDAzOCwgMHgwYzA2MDY3ZSwgMHhjNmM2YzY3YywgMHgwMDAwMDAwMCwKLQkweDAwMDAwMGZlLCAweGM2YzA2MDMwLCAweDE4MTgxODE4LCAweDAwMDAwMDAwLAkvLyA1NCA2IDcKKwkweDAwMDAwMGZlLCAweGM2YzA2MDMwLCAweDE4MTgxODE4LCAweDAwMDAwMDAwLAkvKiA1NCA2IDcgKi8KIAkweDAwMDAwMDdjLCAweGM2YzZjNjdjLCAweGM2YzZjNjdjLCAweDAwMDAwMDAwLAotCTB4MDAwMDAwN2MsIDB4YzZjNmM2ZmMsIDB4YzBjMDYwMzgsIDB4MDAwMDAwMDAsCS8vIDU2IDggOQorCTB4MDAwMDAwN2MsIDB4YzZjNmM2ZmMsIDB4YzBjMDYwMzgsIDB4MDAwMDAwMDAsCS8qIDU2IDggOSAqLwogCTB4MDAwMDAwMDAsIDB4MTgxODAwMDAsIDB4MDAxODE4MDAsIDB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwgMHgxODE4MDAwMCwgMHgwMDE4MTgwYywgMHgwMDAwMDAwMCwJLy8gNTggOiA7CisJMHgwMDAwMDAwMCwgMHgxODE4MDAwMCwgMHgwMDE4MTgwYywgMHgwMDAwMDAwMCwJLyogNTggOiA7ICovCiAJMHgwMDAwMDA2MCwgMHgzMDE4MGMwNiwgMHgwYzE4MzA2MCwgMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLCAweDAwN2UwMDAwLCAweDAwN2UwMDAwLCAweDAwMDAwMDAwLAogCTB4MDAwMDAwMDYsIDB4MGMxODMwNjAsIDB4MzAxODBjMDYsIDB4MDAwMDAwMDAsCiAJMHgwMDAwMDA3YywgMHhjNmM2NjAzMCwgMHgzMDAwMzAzMCwgMHgwMDAwMDAwMCwKIAkweDAwMDAwMDdjLCAweGM2ZjZkNmQ2LCAweDc2MDYwNjdjLCAweDAwMDAwMDAwLAotCTB4MDAwMDAwMTAsIDB4Mzg2Y2M2YzYsIDB4ZmVjNmM2YzYsIDB4MDAwMDAwMDAsCS8vIDY0IEAgQQorCTB4MDAwMDAwMTAsIDB4Mzg2Y2M2YzYsIDB4ZmVjNmM2YzYsIDB4MDAwMDAwMDAsCS8qIDY0IEAgQSAqLwogCTB4MDAwMDAwN2UsIDB4YzZjNmM2N2UsIDB4YzZjNmM2N2UsIDB4MDAwMDAwMDAsCi0JMHgwMDAwMDA3OCwgMHhjYzA2MDYwNiwgMHgwNjA2Y2M3OCwgMHgwMDAwMDAwMCwJLy8gNjYKKwkweDAwMDAwMDc4LCAweGNjMDYwNjA2LCAweDA2MDZjYzc4LCAweDAwMDAwMDAwLAkvKiA2NiAqLwogCTB4MDAwMDAwM2UsIDB4NjZjNmM2YzYsIDB4YzZjNjY2M2UsIDB4MDAwMDAwMDAsCi0JMHgwMDAwMDBmZSwgMHgwNjA2MDYzZSwgMHgwNjA2MDZmZSwgMHgwMDAwMDAwMCwJLy8gNjgKKwkweDAwMDAwMGZlLCAweDA2MDYwNjNlLCAweDA2MDYwNmZlLCAweDAwMDAwMDAwLAkvKiA2OCAqLwogCTB4MDAwMDAwZmUsIDB4MDYwNjA2M2UsIDB4MDYwNjA2MDYsIDB4MDAwMDAwMDAsCi0JMHgwMDAwMDA3OCwgMHhjYzA2MDYwNiwgMHhmNmM2Y2NiOCwgMHgwMDAwMDAwMCwJLy8gNzAKKwkweDAwMDAwMDc4LCAweGNjMDYwNjA2LCAweGY2YzZjY2I4LCAweDAwMDAwMDAwLAkvKiA3MCAqLwogCTB4MDAwMDAwYzYsIDB4YzZjNmM2ZmUsIDB4YzZjNmM2YzYsIDB4MDAwMDAwMDAsCi0JMHgwMDAwMDAzYywgMHgxODE4MTgxOCwgMHgxODE4MTgzYywgMHgwMDAwMDAwMCwJLy8gNzIKKwkweDAwMDAwMDNjLCAweDE4MTgxODE4LCAweDE4MTgxODNjLCAweDAwMDAwMDAwLAkvKiA3MiAqLwogCTB4MDAwMDAwNjAsIDB4NjA2MDYwNjAsIDB4NjA2NjY2M2MsIDB4MDAwMDAwMDAsCi0JMHgwMDAwMDBjNiwgMHhjNjY2MzYxZSwgMHgzNjY2YzZjNiwgMHgwMDAwMDAwMCwJLy8gNzQKKwkweDAwMDAwMGM2LCAweGM2NjYzNjFlLCAweDM2NjZjNmM2LCAweDAwMDAwMDAwLAkvKiA3NCAqLwogCTB4MDAwMDAwMDYsIDB4MDYwNjA2MDYsIDB4MDYwNjA2ZmUsIDB4MDAwMDAwMDAsCi0JMHgwMDAwMDBjNiwgMHhlZWZlZDZjNiwgMHhjNmM2YzZjNiwgMHgwMDAwMDAwMCwJLy8gNzYKKwkweDAwMDAwMGM2LCAweGVlZmVkNmM2LCAweGM2YzZjNmM2LCAweDAwMDAwMDAwLAkvKiA3NiAqLwogCTB4MDAwMDAwYzYsIDB4Y2VkZWZlZjYsIDB4ZTZjNmM2YzYsIDB4MDAwMDAwMDAsCi0JMHgwMDAwMDAzOCwgMHg2Y2M2YzZjNiwgMHhjNmM2NmMzOCwgMHgwMDAwMDAwMCwJLy8gNzgKKwkweDAwMDAwMDM4LCAweDZjYzZjNmM2LCAweGM2YzY2YzM4LCAweDAwMDAwMDAwLAkvKiA3OCAqLwogCTB4MDAwMDAwN2UsIDB4YzZjNmM2N2UsIDB4MDYwNjA2MDYsIDB4MDAwMDAwMDAsCi0JMHgwMDAwMDAzOCwgMHg2Y2M2YzZjNiwgMHhjNmQ2N2MzOCwgMHg2MDAwMDAwMCwJLy8gODAKKwkweDAwMDAwMDM4LCAweDZjYzZjNmM2LCAweGM2ZDY3YzM4LCAweDYwMDAwMDAwLAkvKiA4MCAqLwogCTB4MDAwMDAwN2UsIDB4YzZjNmM2N2UsIDB4NjZjNmM2YzYsIDB4MDAwMDAwMDAsCi0JMHgwMDAwMDA3YywgMHhjNmM2MGMzOCwgMHg2MGM2YzY3YywgMHgwMDAwMDAwMCwJLy8gODIKKwkweDAwMDAwMDdjLCAweGM2YzYwYzM4LCAweDYwYzZjNjdjLCAweDAwMDAwMDAwLAkvKiA4MiAqLwogCTB4MDAwMDAwN2UsIDB4MTgxODE4MTgsIDB4MTgxODE4MTgsIDB4MDAwMDAwMDAsCi0JMHgwMDAwMDBjNiwgMHhjNmM2YzZjNiwgMHhjNmM2YzY3YywgMHgwMDAwMDAwMCwJLy8gODQKKwkweDAwMDAwMGM2LCAweGM2YzZjNmM2LCAweGM2YzZjNjdjLCAweDAwMDAwMDAwLAkvKiA4NCAqLwogCTB4MDAwMDAwYzYsIDB4YzZjNmM2YzYsIDB4YzY2YzM4MTAsIDB4MDAwMDAwMDAsCi0JMHgwMDAwMDBjNiwgMHhjNmM2YzZjNiwgMHhkNmQ2ZmU2YywgMHgwMDAwMDAwMCwJLy8gODYKKwkweDAwMDAwMGM2LCAweGM2YzZjNmM2LCAweGQ2ZDZmZTZjLCAweDAwMDAwMDAwLAkvKiA4NiAqLwogCTB4MDAwMDAwYzYsIDB4YzZjNjZjMzgsIDB4NmNjNmM2YzYsIDB4MDAwMDAwMDAsCi0JMHgwMDAwMDA2NiwgMHg2NjY2NjY2NiwgMHgzYzE4MTgxOCwgMHgwMDAwMDAwMCwJLy8gODgKKwkweDAwMDAwMDY2LCAweDY2NjY2NjY2LCAweDNjMTgxODE4LCAweDAwMDAwMDAwLAkvKiA4OCAqLwogCTB4MDAwMDAwZmUsIDB4YzA2MDMwMTgsIDB4MGMwNjA2ZmUsIDB4MDAwMDAwMDAsCi0JMHgwMDAwMDAzYywgMHgwYzBjMGMwYywgMHgwYzBjMGMzYywgMHgwMDAwMDAwMCwJLy8gOTAKKwkweDAwMDAwMDNjLCAweDBjMGMwYzBjLCAweDBjMGMwYzNjLCAweDAwMDAwMDAwLAkvKiA5MCAqLwogCTB4MDAwMDAwMDIsIDB4MDYwYzE4MzAsIDB4NjBjMDgwMDAsIDB4MDAwMDAwMDAsCi0JMHgwMDAwMDAzYywgMHgzMDMwMzAzMCwgMHgzMDMwMzAzYywgMHgwMDAwMDAwMCwJLy8gOTIKKwkweDAwMDAwMDNjLCAweDMwMzAzMDMwLCAweDMwMzAzMDNjLCAweDAwMDAwMDAwLAkvKiA5MiAqLwogCTB4MDAwMDEwMzgsIDB4NmNjNjAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMGZlMDAwMCwKIAkweDAwMDAxODE4LCAweDMwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLXAybS5jIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLXAybS5jCmluZGV4IDdlZDNlZDQuLjk1NmRlYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC1wMm0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtcDJtLmMKQEAgLTE4LDEwICsxOCwxMSBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogCiAjaW5jbHVkZSAic29sbzYwMTAuaCIKIAotLy8gI2RlZmluZSBTT0xPX1RFU1RfUDJNCisvKiAjZGVmaW5lIFNPTE9fVEVTVF9QMk0gKi8KIAogaW50IHNvbG9fcDJtX2RtYShzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwgdTggaWQsIGludCB3ciwKIAkJIHZvaWQgKnN5c19hZGRyLCB1MzIgZXh0X2FkZHIsIHUzMiBzaXplKQpAQCAtMzAsOCArMzEsOSBAQAogCWludCByZXQ7CiAKIAlXQVJOX09OKCFzaXplKTsKLQlXQVJOX09OKGlkID49IFNPTE9fTlJfUDJNKTsKLQlpZiAoIXNpemUgfHwgaWQgPj0gU09MT19OUl9QMk0pCisJQlVHX09OKGlkID49IFNPTE9fTlJfUDJNKTsKKworCWlmICghc2l6ZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlkbWFfYWRkciA9IHBjaV9tYXBfc2luZ2xlKHNvbG9fZGV2LT5wZGV2LCBzeXNfYWRkciwgc2l6ZSwKQEAgLTQ4LDQxICs1MCwxMzYgQEAKIGludCBzb2xvX3AybV9kbWFfdChzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwgdTggaWQsIGludCB3ciwKIAkJICAgZG1hX2FkZHJfdCBkbWFfYWRkciwgdTMyIGV4dF9hZGRyLCB1MzIgc2l6ZSkKIHsKLQlzdHJ1Y3Qgc29sb19wMm1fZGV2ICpwMm1fZGV2OwotCXVuc2lnbmVkIGludCB0aW1lb3V0ID0gMDsKKwlzdHJ1Y3QgcDJtX2Rlc2MgKmRlc2MgPSBremFsbG9jKHNpemVvZigqZGVzYykgKiAyLCBHRlBfRE1BKTsKKwlpbnQgcmV0OwogCi0JV0FSTl9PTighc2l6ZSk7Ci0JV0FSTl9PTihpZCA+PSBTT0xPX05SX1AyTSk7Ci0JaWYgKCFzaXplIHx8IGlkID49IFNPTE9fTlJfUDJNKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZGVzYyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNvbG9fcDJtX3B1c2hfZGVzYygmZGVzY1sxXSwgd3IsIGRtYV9hZGRyLCBleHRfYWRkciwgc2l6ZSwgMCwgMCk7CisJcmV0ID0gc29sb19wMm1fZG1hX2Rlc2Moc29sb19kZXYsIGlkLCBkZXNjLCAyKTsKKwlrZnJlZShkZXNjKTsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgc29sb19wMm1fcHVzaF9kZXNjKHN0cnVjdCBwMm1fZGVzYyAqZGVzYywgaW50IHdyLCBkbWFfYWRkcl90IGRtYV9hZGRyLAorCQkJdTMyIGV4dF9hZGRyLCB1MzIgc2l6ZSwgaW50IHJlcGVhdCwgdTMyIGV4dF9zaXplKQoreworCWRlc2MtPnRhID0gZG1hX2FkZHI7CisJZGVzYy0+ZmEgPSBleHRfYWRkcjsKKworCWRlc2MtPmV4dCA9IFNPTE9fUDJNX0NPUFlfU0laRShzaXplID4+IDIpOworCWRlc2MtPmN0cmwgPSBTT0xPX1AyTV9CVVJTVF9TSVpFKFNPTE9fUDJNX0JVUlNUXzI1NikgfAorCQkod3IgPyBTT0xPX1AyTV9XUklURSA6IDApIHwgU09MT19QMk1fVFJBTlNfT047CisKKwkvKiBFeHQgc2l6ZSBvbmx5IG1hdHRlcnMgd2hlbiB3ZSdyZSByZXBlYXRpbmcgKi8KKwlpZiAocmVwZWF0KSB7CisJCWRlc2MtPmV4dCB8PSBTT0xPX1AyTV9FWFRfSU5DKGV4dF9zaXplID4+IDIpOworCQlkZXNjLT5jdHJsIHw9ICBTT0xPX1AyTV9QQ0lfSU5DKHNpemUgPj4gMikgfAorCQkJU09MT19QMk1fUkVQRUFUKHJlcGVhdCk7CisJfQorfQorCitpbnQgc29sb19wMm1fZG1hX2Rlc2Moc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYsIHU4IGlkLAorCQkgICAgICBzdHJ1Y3QgcDJtX2Rlc2MgKmRlc2MsIGludCBkZXNjX2NvdW50KQoreworCXN0cnVjdCBzb2xvX3AybV9kZXYgKnAybV9kZXY7CisJdW5zaWduZWQgaW50IHRpbWVvdXQ7CisJaW50IHJldCA9IDA7CisJdTMyIGNvbmZpZyA9IDA7CisJZG1hX2FkZHJfdCBkZXNjX2RtYSA9IDA7CisKKwlCVUdfT04oaWQgPj0gU09MT19OUl9QMk0pOworCUJVR19PTighZGVzY19jb3VudCB8fCBkZXNjX2NvdW50ID4gU09MT19OUl9QMk1fREVTQyk7CiAKIAlwMm1fZGV2ID0gJnNvbG9fZGV2LT5wMm1fZGV2W2lkXTsKIAotCWRvd24oJnAybV9kZXYtPnNlbSk7CisJbXV0ZXhfbG9jaygmcDJtX2Rldi0+bXV0ZXgpOwogCi1zdGFydF9kbWE6CisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fUDJNX0NPTlRST0woaWQpLCAwKTsKKwogCUlOSVRfQ09NUExFVElPTihwMm1fZGV2LT5jb21wbGV0aW9uKTsKIAlwMm1fZGV2LT5lcnJvciA9IDA7Ci0Jc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fUDJNX1RBUl9BRFIoaWQpLCBkbWFfYWRkcik7Ci0Jc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fUDJNX0VYVF9BRFIoaWQpLCBleHRfYWRkcik7Ci0Jc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fUDJNX0VYVF9DRkcoaWQpLAotCQkgICAgICAgU09MT19QMk1fQ09QWV9TSVpFKHNpemUgPj4gMikpOwotCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1AyTV9DT05UUk9MKGlkKSwKLQkJICAgICAgIFNPTE9fUDJNX0JVUlNUX1NJWkUoU09MT19QMk1fQlVSU1RfMjU2KSB8Ci0JCSAgICAgICAod3IgPyBTT0xPX1AyTV9XUklURSA6IDApIHwgU09MT19QMk1fVFJBTlNfT04pOwogCisJLyogRW5hYmxlIHRoZSBkZXNjcmlwdG9ycyAqLworCWNvbmZpZyA9IHNvbG9fcmVnX3JlYWQoc29sb19kZXYsIFNPTE9fUDJNX0NPTkZJRyhpZCkpOworCWRlc2NfZG1hID0gcGNpX21hcF9zaW5nbGUoc29sb19kZXYtPnBkZXYsIGRlc2MsCisJCQkJICBkZXNjX2NvdW50ICogc2l6ZW9mKCpkZXNjKSwKKwkJCQkgIFBDSV9ETUFfVE9ERVZJQ0UpOworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1AyTV9ERVNfQURSKGlkKSwgZGVzY19kbWEpOworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1AyTV9ERVNDX0lEKGlkKSwgZGVzY19jb3VudCAtIDEpOworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1AyTV9DT05GSUcoaWQpLCBjb25maWcgfAorCQkgICAgICAgU09MT19QMk1fREVTQ19NT0RFKTsKKworCS8qIFNob3VsZCBoYXZlIGFsbCBkZXNjcmlwdG9ycyBjb21wbGV0ZWQgZnJvbSBvbmUgaW50ZXJydXB0ICovCiAJdGltZW91dCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmcDJtX2Rldi0+Y29tcGxldGlvbiwgSFopOwogCiAJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fUDJNX0NPTlRST0woaWQpLCAwKTsKIAotCS8qIFhYWCBSZWFsbHkgbG9va3MgdG8gbWUgbGlrZSB3ZSB3aWxsIGdldCBzdHVjayBoZXJlIGlmIGEKLQkgKiByZWFsIFBDSSBQMk0gZXJyb3Igb2NjdXJzICovCisJLyogUmVzZXQgYmFjayB0byBub24tZGVzY3JpcHRvciBtb2RlICovCisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fUDJNX0NPTkZJRyhpZCksIGNvbmZpZyk7CisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fUDJNX0RFU0NfSUQoaWQpLCAwKTsKKwlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19QMk1fREVTX0FEUihpZCksIDApOworCXBjaV91bm1hcF9zaW5nbGUoc29sb19kZXYtPnBkZXYsIGRlc2NfZG1hLAorCQkJIGRlc2NfY291bnQgKiBzaXplb2YoKmRlc2MpLAorCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCiAJaWYgKHAybV9kZXYtPmVycm9yKQotCQlnb3RvIHN0YXJ0X2RtYTsKKwkJcmV0ID0gLUVJTzsKKwllbHNlIGlmICh0aW1lb3V0ID09IDApCisJCXJldCA9IC1FQUdBSU47CiAKLQl1cCgmcDJtX2Rldi0+c2VtKTsKKwltdXRleF91bmxvY2soJnAybV9kZXYtPm11dGV4KTsKIAotCXJldHVybiAodGltZW91dCA9PSAwKSA/IC1FQUdBSU4gOiAwOworCVdBUk5fT05fT05DRShyZXQpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IHNvbG9fcDJtX2RtYV9zZyhzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwgdTggaWQsCisJCSAgICBzdHJ1Y3QgcDJtX2Rlc2MgKnBkZXNjLCBpbnQgd3IsCisJCSAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCB1MzIgc2dfb2ZmLAorCQkgICAgdTMyIGV4dF9hZGRyLCB1MzIgc2l6ZSkKK3sKKwlpbnQgaTsKKwlpbnQgaWR4OworCisJQlVHX09OKGlkID49IFNPTE9fTlJfUDJNKTsKKworCWlmIChXQVJOX09OX09OQ0UoIXNpemUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbXNldChwZGVzYywgMCwgc2l6ZW9mKCpwZGVzYykpOworCisJLyogU2hvdWxkIHJld3JpdGUgdGhpcyB0byBoYW5kbGUgPiBTT0xPX05SX1AyTV9ERVNDIHRyYW5zYWN0aW9ucyAqLworCWZvciAoaSA9IDAsIGlkeCA9IDE7IGlkeCA8IFNPTE9fTlJfUDJNX0RFU0MgJiYgc2cgJiYgc2l6ZSA+IDA7CisJICAgICBpKyssIHNnID0gc2dfbmV4dChzZykpIHsKKwkJc3RydWN0IHAybV9kZXNjICpkZXNjID0gJnBkZXNjW2lkeF07CisJCXUzMiBzZ19sZW4gPSBzZ19kbWFfbGVuKHNnKTsKKwkJdTMyIGxlbjsKKworCQlpZiAoc2dfb2ZmID49IHNnX2xlbikgeworCQkJc2dfb2ZmIC09IHNnX2xlbjsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc2dfbGVuIC09IHNnX29mZjsKKwkJbGVuID0gbWluKHNnX2xlbiwgc2l6ZSk7CisKKwkJc29sb19wMm1fcHVzaF9kZXNjKGRlc2MsIHdyLCBzZ19kbWFfYWRkcmVzcyhzZykgKyBzZ19vZmYsCisJCQkJICAgZXh0X2FkZHIsIGxlbiwgMCwgMCk7CisKKwkJc2l6ZSAtPSBsZW47CisJCWV4dF9hZGRyICs9IGxlbjsKKwkJaWR4Kys7CisKKwkJc2dfb2ZmID0gMDsKKwl9CisKKwlXQVJOX09OX09OQ0Uoc2l6ZSB8fCBpID49IFNPTE9fTlJfUDJNX0RFU0MpOworCisJcmV0dXJuIHNvbG9fcDJtX2RtYV9kZXNjKHNvbG9fZGV2LCBpZCwgcGRlc2MsIGlkeCk7CiB9CiAKICNpZmRlZiBTT0xPX1RFU1RfUDJNCkBAIC0xNDcsMTMgKzI0NCwxNiBAQAogCXJldHVybjsKIH0KICNlbHNlCi0jZGVmaW5lIHJ1bl9wMm1fdGVzdChfX3NvbG8pCWRve313aGlsZSgwKQorI2RlZmluZSBydW5fcDJtX3Rlc3QoX19zb2xvKQlkbyB7fSB3aGlsZSAoMCkKICNlbmRpZgogCiB2b2lkIHNvbG9fcDJtX2lzcihzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwgaW50IGlkKQogeworCXN0cnVjdCBzb2xvX3AybV9kZXYgKnAybV9kZXYgPSAmc29sb19kZXYtPnAybV9kZXZbaWRdOworCiAJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fSVJRX1NUQVQsIFNPTE9fSVJRX1AyTShpZCkpOwotCWNvbXBsZXRlKCZzb2xvX2Rldi0+cDJtX2RldltpZF0uY29tcGxldGlvbik7CisKKwljb21wbGV0ZSgmcDJtX2Rldi0+Y29tcGxldGlvbik7CiB9CiAKIHZvaWQgc29sb19wMm1fZXJyb3JfaXNyKHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2LCB1MzIgc3RhdHVzKQpAQCAtMTg4LDE2ICsyODgsMTQgQEAKIAlmb3IgKGkgPSAwOyBpIDwgU09MT19OUl9QMk07IGkrKykgewogCQlwMm1fZGV2ID0gJnNvbG9fZGV2LT5wMm1fZGV2W2ldOwogCi0JCXNlbWFfaW5pdCgmcDJtX2Rldi0+c2VtLCAxKTsKKwkJbXV0ZXhfaW5pdCgmcDJtX2Rldi0+bXV0ZXgpOwogCQlpbml0X2NvbXBsZXRpb24oJnAybV9kZXYtPmNvbXBsZXRpb24pOwogCi0JCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1AyTV9ERVNfQURSKGkpLAotCQkJICAgICAgIF9fcGEocDJtX2Rldi0+ZGVzYykpOwotCiAJCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1AyTV9DT05UUk9MKGkpLCAwKTsKIAkJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fUDJNX0NPTkZJRyhpKSwKIAkJCSAgICAgICBTT0xPX1AyTV9DU0NfMTZCSVRfNTY1IHwKLQkJCSAgICAgICBTT0xPX1AyTV9ETUFfSU5URVJWQUwoMCkgfAorCQkJICAgICAgIFNPTE9fUDJNX0RNQV9JTlRFUlZBTCgzKSB8CisJCQkgICAgICAgU09MT19QMk1fREVTQ19JTlRSX09QVCB8CiAJCQkgICAgICAgU09MT19QMk1fUENJX01BU1RFUl9NT0RFKTsKIAkJc29sbzYwMTBfaXJxX29uKHNvbG9fZGV2LCBTT0xPX0lSUV9QMk0oaSkpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC10dzI4LmMgYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtdHcyOC5jCmluZGV4IDAxNTljODMuLjkwNWE2YWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC10dzI4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLXR3MjguYwpAQCAtMzUsMTA3ICszNSwxMDcgQEAKICNkZWZpbmUgREVGQVVMVF9WQUNUSVZFX1BBTAkJKDMxMi1ERUZBVUxUX1ZERUxBWV9QQUwpCiAKIHN0YXRpYyB1OCB0YmxfdHcyODY0X3RlbXBsYXRlW10gPSB7Ci0JMHgwMCwgMHgwMCwgMHg4MCwgMHgxMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMiwgLy8gMHgwMAorCTB4MDAsIDB4MDAsIDB4ODAsIDB4MTAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDIsIC8qIDB4MDAgKi8KIAkweDEyLCAweGY1LCAweDA5LCAweGQwLCAweDAwLCAweDAwLCAweDAwLCAweDdmLAotCTB4MDAsIDB4MDAsIDB4ODAsIDB4MTAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDIsIC8vIDB4MTAKKwkweDAwLCAweDAwLCAweDgwLCAweDEwLCAweDgwLCAweDgwLCAweDAwLCAweDAyLCAvKiAweDEwICovCiAJMHgxMiwgMHhmNSwgMHgwOSwgMHhkMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3ZiwKLQkweDAwLCAweDAwLCAweDgwLCAweDEwLCAweDgwLCAweDgwLCAweDAwLCAweDAyLCAvLyAweDIwCisJMHgwMCwgMHgwMCwgMHg4MCwgMHgxMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMiwgLyogMHgyMCAqLwogCTB4MTIsIDB4ZjUsIDB4MDksIDB4ZDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2YsCi0JMHgwMCwgMHgwMCwgMHg4MCwgMHgxMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMiwgLy8gMHgzMAorCTB4MDAsIDB4MDAsIDB4ODAsIDB4MTAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDIsIC8qIDB4MzAgKi8KIAkweDEyLCAweGY1LCAweDA5LCAweGQwLCAweDAwLCAweDAwLCAweDAwLCAweDdmLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8vIDB4NDAKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwICovCiAJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvLyAweDUwCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MCAqLwogCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLy8gMHg2MAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAgKi8KIAkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8vIDB4NzAKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwICovCiAJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMywgMHgwMCwKLQkweDAwLCAweDAyLCAweDAwLCAweGNjLCAweDAwLCAweDgwLCAweDQ0LCAweDUwLCAvLyAweDgwCisJMHgwMCwgMHgwMiwgMHgwMCwgMHhjYywgMHgwMCwgMHg4MCwgMHg0NCwgMHg1MCwgLyogMHg4MCAqLwogCTB4MjIsIDB4MDEsIDB4ZDgsIDB4YmMsIDB4YjgsIDB4NDQsIDB4MzgsIDB4MDAsCi0JMHgwMCwgMHg3OCwgMHg3MiwgMHgzZSwgMHgxNCwgMHhhNSwgMHhlNCwgMHgwNSwgLy8gMHg5MAorCTB4MDAsIDB4NzgsIDB4NzIsIDB4M2UsIDB4MTQsIDB4YTUsIDB4ZTQsIDB4MDUsIC8qIDB4OTAgKi8KIAkweDAwLCAweDI4LCAweDQ0LCAweDQ0LCAweGEwLCAweDg4LCAweDVhLCAweDAxLAotCTB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MWEsIDB4MWEsIDB4MWEsIDB4MWEsIC8vIDB4YTAKKwkweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDFhLCAweDFhLCAweDFhLCAweDFhLCAvKiAweGEwICovCiAJMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHhmMCwgMHg0NCwKLQkweDQ0LCAweDBhLCAweDAwLCAweGZmLCAweGVmLCAweGVmLCAweGVmLCAweGVmLCAvLyAweGIwCisJMHg0NCwgMHgwYSwgMHgwMCwgMHhmZiwgMHhlZiwgMHhlZiwgMHhlZiwgMHhlZiwgLyogMHhiMCAqLwogCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLy8gMHhjMAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YzAgKi8KIAkweDAwLCAweDAwLCAweDU1LCAweDAwLCAweGIxLCAweGU0LCAweDQwLCAweDAwLAotCTB4NzcsIDB4NzcsIDB4MDEsIDB4MTMsIDB4NTcsIDB4OWIsIDB4ZGYsIDB4MjAsIC8vIDB4ZDAKKwkweDc3LCAweDc3LCAweDAxLCAweDEzLCAweDU3LCAweDliLCAweGRmLCAweDIwLCAvKiAweGQwICovCiAJMHg2NCwgMHhhOCwgMHhlYywgMHhkMSwgMHgwZiwgMHgxMSwgMHgxMSwgMHg4MSwKLQkweDEwLCAweGUwLCAweGJiLCAweGJiLCAweDAwLCAweDExLCAweDAwLCAweDAwLCAvLyAweGUwCisJMHgxMCwgMHhlMCwgMHhiYiwgMHhiYiwgMHgwMCwgMHgxMSwgMHgwMCwgMHgwMCwgLyogMHhlMCAqLwogCTB4MTEsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MDAsCi0JMHg4MywgMHhiNSwgMHgwOSwgMHg3OCwgMHg4NSwgMHgwMCwgMHgwMSwgMHgyMCwgLy8gMHhmMAorCTB4ODMsIDB4YjUsIDB4MDksIDB4NzgsIDB4ODUsIDB4MDAsIDB4MDEsIDB4MjAsIC8qIDB4ZjAgKi8KIAkweDY0LCAweDExLCAweDQwLCAweGFmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLAogfTsKIAogc3RhdGljIHU4IHRibF90dzI4NjVfbnRzY190ZW1wbGF0ZVtdID0gewotCTB4MDAsIDB4ZjAsIDB4NzAsIDB4MzAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDIsIC8vIDB4MDAKKwkweDAwLCAweGYwLCAweDcwLCAweDMwLCAweDgwLCAweDgwLCAweDAwLCAweDAyLCAvKiAweDAwICovCiAJMHgxMiwgMHhmZiwgMHgwOSwgMHhkMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3ZiwKLQkweDAwLCAweGYwLCAweDcwLCAweDMwLCAweDgwLCAweDgwLCAweDAwLCAweDAyLCAvLyAweDEwCisJMHgwMCwgMHhmMCwgMHg3MCwgMHgzMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMiwgLyogMHgxMCAqLwogCTB4MTIsIDB4ZmYsIDB4MDksIDB4ZDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2YsCi0JMHgwMCwgMHhmMCwgMHg3MCwgMHgzMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMiwgLy8gMHgyMAorCTB4MDAsIDB4ZjAsIDB4NzAsIDB4MzAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDIsIC8qIDB4MjAgKi8KIAkweDEyLCAweGZmLCAweDA5LCAweGQwLCAweDAwLCAweDAwLCAweDAwLCAweDdmLAotCTB4MDAsIDB4ZjAsIDB4NzAsIDB4NDgsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDIsIC8vIDB4MzAKKwkweDAwLCAweGYwLCAweDcwLCAweDQ4LCAweDgwLCAweDgwLCAweDAwLCAweDAyLCAvKiAweDMwICovCiAJMHgxMiwgMHhmZiwgMHgwOSwgMHhkMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3ZiwKLQkweDAwLCAweDAwLCAweDkwLCAweDY4LCAweDAwLCAweDM4LCAweDgwLCAweDgwLCAvLyAweDQwCisJMHgwMCwgMHgwMCwgMHg5MCwgMHg2OCwgMHgwMCwgMHgzOCwgMHg4MCwgMHg4MCwgLyogMHg0MCAqLwogCTB4ODAsIDB4ODAsIDB4NzcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLy8gMHg1MAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAgKi8KIAkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4NDUsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8vIDB4NjAKKwkweDQ1LCAweDExLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwICovCiAJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMSwgMHg0MywKLQkweDA4LCAweDAwLCAweDAwLCAweDAxLCAweGYxLCAweDAzLCAweEVGLCAweDAzLCAvLyAweDcwCisJMHgwOCwgMHgwMCwgMHgwMCwgMHgwMSwgMHhmMSwgMHgwMywgMHhFRiwgMHgwMywgLyogMHg3MCAqLwogCTB4RTksIDB4MDMsIDB4RDksIDB4MTUsIDB4MTUsIDB4RTQsIDB4QTMsIDB4ODAsCi0JMHgwMCwgMHgwMiwgMHgwMCwgMHhDQywgMHgwMCwgMHg4MCwgMHg0NCwgMHg1MCwgLy8gMHg4MAorCTB4MDAsIDB4MDIsIDB4MDAsIDB4Q0MsIDB4MDAsIDB4ODAsIDB4NDQsIDB4NTAsIC8qIDB4ODAgKi8KIAkweDIyLCAweDAxLCAweEQ4LCAweEJDLCAweEI4LCAweDQ0LCAweDM4LCAweDAwLAotCTB4MDAsIDB4NzgsIDB4NDQsIDB4M0QsIDB4MTQsIDB4QTUsIDB4RTAsIDB4MDUsIC8vIDB4OTAKKwkweDAwLCAweDc4LCAweDQ0LCAweDNELCAweDE0LCAweEE1LCAweEUwLCAweDA1LCAvKiAweDkwICovCiAJMHgwMCwgMHgyOCwgMHg0NCwgMHg0NCwgMHhBMCwgMHg5MCwgMHg1MiwgMHgxMywKLQkweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDFBLCAweDFBLCAweDFCLCAweDFBLCAvLyAweGEwCisJMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgxQSwgMHgxQSwgMHgxQiwgMHgxQSwgLyogMHhhMCAqLwogCTB4MDAsIDB4MDAsIDB4MDAsIDB4RjAsIDB4RjAsIDB4RjAsIDB4RjAsIDB4NDQsCi0JMHg0NCwgMHg0QSwgMHgwMCwgMHhGRiwgMHhFRiwgMHhFRiwgMHhFRiwgMHhFRiwgLy8gMHhiMAorCTB4NDQsIDB4NEEsIDB4MDAsIDB4RkYsIDB4RUYsIDB4RUYsIDB4RUYsIDB4RUYsIC8qIDB4YjAgKi8KIAkweEZGLCAweEU3LCAweEU5LCAweEU5LCAweEVCLCAweEZGLCAweEQ2LCAweEQ4LAotCTB4RDgsIDB4RDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8vIDB4YzAKKwkweEQ4LCAweEQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGMwICovCiAJMHgwMCwgMHgwMCwgMHg1NSwgMHgwMCwgMHhFNCwgMHgzOSwgMHgwMCwgMHg4MCwKLQkweDc3LCAweDc3LCAweDAzLCAweDIwLCAweDU3LCAweDliLCAweGRmLCAweDMxLCAvLyAweGQwCisJMHg3NywgMHg3NywgMHgwMywgMHgyMCwgMHg1NywgMHg5YiwgMHhkZiwgMHgzMSwgLyogMHhkMCAqLwogCTB4NjQsIDB4YTgsIDB4ZWMsIDB4ZDEsIDB4MGYsIDB4MTEsIDB4MTEsIDB4ODEsCi0JMHgxMCwgMHhDMCwgMHhBQSwgMHhBQSwgMHgwMCwgMHgxMSwgMHgwMCwgMHgwMCwgLy8gMHhlMAorCTB4MTAsIDB4QzAsIDB4QUEsIDB4QUEsIDB4MDAsIDB4MTEsIDB4MDAsIDB4MDAsIC8qIDB4ZTAgKi8KIAkweDExLCAweDAwLCAweDAwLCAweDExLCAweDAwLCAweDAwLCAweDExLCAweDAwLAotCTB4ODMsIDB4QjUsIDB4MDksIDB4NzgsIDB4ODUsIDB4MDAsIDB4MDEsIDB4MjAsIC8vIDB4ZjAKKwkweDgzLCAweEI1LCAweDA5LCAweDc4LCAweDg1LCAweDAwLCAweDAxLCAweDIwLCAvKiAweGYwICovCiAJMHg2NCwgMHg1MSwgMHg0MCwgMHhhZiwgMHhGRiwgMHhGMCwgMHgwMCwgMHhDMCwKIH07CiAKIHN0YXRpYyB1OCB0YmxfdHcyODY1X3BhbF90ZW1wbGF0ZVtdID0gewotCTB4MDAsIDB4ZjAsIDB4NzAsIDB4MzAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MTIsIC8vIDB4MDAKKwkweDAwLCAweGYwLCAweDcwLCAweDMwLCAweDgwLCAweDgwLCAweDAwLCAweDEyLCAvKiAweDAwICovCiAJMHgxMSwgMHhmZiwgMHgwMSwgMHhjMywgMHgwMCwgMHgwMCwgMHgwMSwgMHg3ZiwKLQkweDAwLCAweGYwLCAweDcwLCAweDMwLCAweDgwLCAweDgwLCAweDAwLCAweDEyLCAvLyAweDEwCisJMHgwMCwgMHhmMCwgMHg3MCwgMHgzMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgxMiwgLyogMHgxMCAqLwogCTB4MTEsIDB4ZmYsIDB4MDEsIDB4YzMsIDB4MDAsIDB4MDAsIDB4MDEsIDB4N2YsCi0JMHgwMCwgMHhmMCwgMHg3MCwgMHgzMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgxMiwgLy8gMHgyMAorCTB4MDAsIDB4ZjAsIDB4NzAsIDB4MzAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MTIsIC8qIDB4MjAgKi8KIAkweDExLCAweGZmLCAweDAxLCAweGMzLCAweDAwLCAweDAwLCAweDAxLCAweDdmLAotCTB4MDAsIDB4ZjAsIDB4NzAsIDB4MzAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MTIsIC8vIDB4MzAKKwkweDAwLCAweGYwLCAweDcwLCAweDMwLCAweDgwLCAweDgwLCAweDAwLCAweDEyLCAvKiAweDMwICovCiAJMHgxMSwgMHhmZiwgMHgwMSwgMHhjMywgMHgwMCwgMHgwMCwgMHgwMSwgMHg3ZiwKLQkweDAwLCAweDk0LCAweDkwLCAweDQ4LCAweDAwLCAweDM4LCAweDdGLCAweDgwLCAvLyAweDQwCisJMHgwMCwgMHg5NCwgMHg5MCwgMHg0OCwgMHgwMCwgMHgzOCwgMHg3RiwgMHg4MCwgLyogMHg0MCAqLwogCTB4ODAsIDB4ODAsIDB4NzcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLy8gMHg1MAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAgKi8KIAkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4NDUsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8vIDB4NjAKKwkweDQ1LCAweDExLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwICovCiAJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMSwgMHg0MywKLQkweDA4LCAweDAwLCAweDAwLCAweDAxLCAweGYxLCAweDAzLCAweEVGLCAweDAzLCAvLyAweDcwCisJMHgwOCwgMHgwMCwgMHgwMCwgMHgwMSwgMHhmMSwgMHgwMywgMHhFRiwgMHgwMywgLyogMHg3MCAqLwogCTB4RUEsIDB4MDMsIDB4RDksIDB4MTUsIDB4MTUsIDB4RTQsIDB4QTMsIDB4ODAsCi0JMHgwMCwgMHgwMiwgMHgwMCwgMHhDQywgMHgwMCwgMHg4MCwgMHg0NCwgMHg1MCwgLy8gMHg4MAorCTB4MDAsIDB4MDIsIDB4MDAsIDB4Q0MsIDB4MDAsIDB4ODAsIDB4NDQsIDB4NTAsIC8qIDB4ODAgKi8KIAkweDIyLCAweDAxLCAweEQ4LCAweEJDLCAweEI4LCAweDQ0LCAweDM4LCAweDAwLAotCTB4MDAsIDB4NzgsIDB4NDQsIDB4M0QsIDB4MTQsIDB4QTUsIDB4RTAsIDB4MDUsIC8vIDB4OTAKKwkweDAwLCAweDc4LCAweDQ0LCAweDNELCAweDE0LCAweEE1LCAweEUwLCAweDA1LCAvKiAweDkwICovCiAJMHgwMCwgMHgyOCwgMHg0NCwgMHg0NCwgMHhBMCwgMHg5MCwgMHg1MiwgMHgxMywKLQkweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAvLyAweGEwCisJMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgLyogMHhhMCAqLwogCTB4MDAsIDB4MDAsIDB4MDAsIDB4RjAsIDB4RjAsIDB4RjAsIDB4RjAsIDB4NDQsCi0JMHg0NCwgMHg0QSwgMHgwMCwgMHhGRiwgMHhFRiwgMHhFRiwgMHhFRiwgMHhFRiwgLy8gMHhiMAorCTB4NDQsIDB4NEEsIDB4MDAsIDB4RkYsIDB4RUYsIDB4RUYsIDB4RUYsIDB4RUYsIC8qIDB4YjAgKi8KIAkweEZGLCAweEU3LCAweEU5LCAweEU5LCAweEU5LCAweEZGLCAweEQ3LCAweEQ4LAotCTB4RDksIDB4RDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8vIDB4YzAKKwkweEQ5LCAweEQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGMwICovCiAJMHgwMCwgMHgwMCwgMHg1NSwgMHgwMCwgMHhFNCwgMHgzOSwgMHgwMCwgMHg4MCwKLQkweDc3LCAweDc3LCAweDAzLCAweDIwLCAweDU3LCAweDliLCAweGRmLCAweDMxLCAvLyAweGQwCisJMHg3NywgMHg3NywgMHgwMywgMHgyMCwgMHg1NywgMHg5YiwgMHhkZiwgMHgzMSwgLyogMHhkMCAqLwogCTB4NjQsIDB4YTgsIDB4ZWMsIDB4ZDEsIDB4MGYsIDB4MTEsIDB4MTEsIDB4ODEsCi0JMHgxMCwgMHhDMCwgMHhBQSwgMHhBQSwgMHgwMCwgMHgxMSwgMHgwMCwgMHgwMCwgLy8gMHhlMAorCTB4MTAsIDB4QzAsIDB4QUEsIDB4QUEsIDB4MDAsIDB4MTEsIDB4MDAsIDB4MDAsIC8qIDB4ZTAgKi8KIAkweDExLCAweDAwLCAweDAwLCAweDExLCAweDAwLCAweDAwLCAweDExLCAweDAwLAotCTB4ODMsIDB4QjUsIDB4MDksIDB4MDAsIDB4QTAsIDB4MDAsIDB4MDEsIDB4MjAsIC8vIDB4ZjAKKwkweDgzLCAweEI1LCAweDA5LCAweDAwLCAweEEwLCAweDAwLCAweDAxLCAweDIwLCAvKiAweGYwICovCiAJMHg2NCwgMHg1MSwgMHg0MCwgMHhhZiwgMHhGRiwgMHhGMCwgMHgwMCwgMHhDMCwKIH07CiAKQEAgLTE4MSw4ICsxODEsOCBAQAogCQltc2xlZXBfaW50ZXJydXB0aWJsZSgxKTsKIAl9CiAKLS8vCXByaW50aygic29sbzYwMTAvdHcyODogRXJyb3Igd3JpdGluZyByZWdpc3RlcjogJTAyeC0+JTAyeCBbJTAyeF1cbiIsCi0vLwkJYWRkciwgb2ZmLCB2YWwpOworLyoJcHJpbnRrKCJzb2xvNjAxMC90dzI4OiBFcnJvciB3cml0aW5nIHJlZ2lzdGVyOiAlMDJ4LT4lMDJ4IFslMDJ4XVxuIiwKKwkJYWRkciwgb2ZmLCB2YWwpOyAqLwogfQogCiBzdGF0aWMgaW50IHR3Mjg2NV9zZXR1cChzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwgdTggZGV2X2FkZHIpCkBAIC0yMTcsNyArMjE3LDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCAweGZmOyBpKyspIHsKIAkJLyogU2tpcCByZWFkIG9ubHkgcmVnaXN0ZXJzICovCi0JCWlmIChpID49IDB4YjggJiYgaSA8PSAweGMxICkKKwkJaWYgKGkgPj0gMHhiOCAmJiBpIDw9IDB4YzEpCiAJCQljb250aW51ZTsKIAkJaWYgKChpICYgfjB4MzApID09IDB4MDAgfHwKIAkJICAgIChpICYgfjB4MzApID09IDB4MGMgfHwKQEAgLTMwMiw3ICszMDIsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IDB4ZmY7IGkrKykgewogCQkvKiBTa2lwIHJlYWQgb25seSByZWdpc3RlcnMgKi8KLQkJaWYgKGkgPj0gMHhiOCAmJiBpIDw9IDB4YzEgKQorCQlpZiAoaSA+PSAweGI4ICYmIGkgPD0gMHhjMSkKIAkJCWNvbnRpbnVlOwogCQlpZiAoKGkgJiB+MHgzMCkgPT0gMHgwMCB8fAogCQkgICAgKGkgJiB+MHgzMCkgPT0gMHgwYyB8fApAQCAtMzM0LDEzICszMzQsMTMgQEAKIAl9OwogCiAJdTggdGJsX3R3MjgxNV9zZnJbXSA9IHsKLQkJMHgwMCwgMHgwMCwgMHgwMCwgMHhjMCwgMHg0NSwgMHhhMCwgMHhkMCwgMHgyZiwgLy8gMHgwMAorCQkweDAwLCAweDAwLCAweDAwLCAweGMwLCAweDQ1LCAweGEwLCAweGQwLCAweDJmLCAvKiAweDAwICovCiAJCTB4NjQsIDB4ODAsIDB4ODAsIDB4ODIsIDB4ODIsIDB4MDAsIDB4MDAsIDB4MDAsCi0JCTB4MDAsIDB4MGYsIDB4MDUsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDYsIDB4MDAsIC8vIDB4MTAKKwkJMHgwMCwgMHgwZiwgMHgwNSwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwNiwgMHgwMCwgLyogMHgxMCAqLwogCQkweDAwLCAweDAwLCAweDAwLCAweGZmLCAweDhmLCAweDAwLCAweDAwLCAweDAwLAotCQkweDg4LCAweDg4LCAweGMwLCAweDAwLCAweDIwLCAweDY0LCAweGE4LCAweGVjLCAvLyAweDIwCisJCTB4ODgsIDB4ODgsIDB4YzAsIDB4MDAsIDB4MjAsIDB4NjQsIDB4YTgsIDB4ZWMsIC8qIDB4MjAgKi8KIAkJMHgzMSwgMHg3NSwgMHhiOSwgMHhmZCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwKLQkJMHg4OCwgMHgxMSwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwJCS8vIDB4MzAKKwkJMHg4OCwgMHgxMSwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwJCS8qIDB4MzAgKi8KIAl9OwogCXU4ICp0YmxfdHcyODE1X2NvbW1vbjsKIAlpbnQgaTsKQEAgLTQ1OSw3ICs0NTksNyBAQAogCiAJCWZvciAoaSA9IDA7IGkgPCAweDBmOyBpKyspIHsKIAkJCWlmIChpID09IDB4MDApCi0JCQkJY29udGludWU7CS8vIHJlYWQtb25seQorCQkJCWNvbnRpbnVlOwkvKiByZWFkLW9ubHkgKi8KIAkJCXNvbG9faTJjX3dyaXRlYnl0ZShzb2xvX2RldiwgU09MT19JMkNfVFcsCiAJCQkJCSAgIGRldl9hZGRyLCAoY2ggKiAweDEwKSArIGksCiAJCQkJCSAgIHRibF90dzI4MTVfY29tbW9uW2ldKTsKQEAgLTU5Nyw3ICs1OTcsNyBAQAogCXJldHVybiAwOwogfQogCi0vKiAKKy8qCiAgKiBXZSBhY2Nlc3NlZCB0aGUgdmlkZW8gc3RhdHVzIHNpZ25hbCBpbiB0aGUgVGVjaHdlbGwgY2hpcCB0aHJvdWdoCiAgKiBpaWMvaTJjIGJlY2F1c2UgdGhlIHZpZGVvIHN0YXR1cyByZXBvcnRlZCBieSByZWdpc3RlciBSRUdfVklfU1RBVFVTMQogICogKGFkZHJlc3MgMHgwMTJDKSBvZiB0aGUgU09MTzYwMTAgY2hpcCBkb2Vzbid0IGdpdmUgdGhlIGNvcnJlY3QgdmlkZW8KQEAgLTc1MSw3ICs3NTEsNyBAQAogCQlydmFsID0gdHdfcmVhZGJ5dGUoc29sb19kZXYsIGNoaXBfbnVtLAogCQkJCSAgIFRXMjg2eF9CUklHSFRORVNTX0FERFIoY2gpLAogCQkJCSAgIFRXX0JSSUdIVE5FU1NfQUREUihjaCkpOwotCQlpZiAoaXNfdHcyODZ4KHNvbG9fZGV2LCBjaGlwX251bSkpIAorCQlpZiAoaXNfdHcyODZ4KHNvbG9fZGV2LCBjaGlwX251bSkpCiAJCQkqdmFsID0gKHMzMikoKGNoYXIpcnZhbCkgKyAxMjg7CiAJCWVsc2UKIAkJCSp2YWwgPSBydmFsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLXY0bDItZW5jLmMgYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtdjRsMi1lbmMuYwppbmRleCAwOTdlODJiLi43YmJiOTQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtdjRsMi1lbmMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtdjRsMi1lbmMuYwpAQCAtMjQsNyArMjQsNyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYtZG1hLWNvbnRpZy5oPgorI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmLWRtYS1zZy5oPgogCiAjaW5jbHVkZSAic29sbzYwMTAuaCIKICNpbmNsdWRlICJzb2xvNjAxMC10dzI4LmgiCkBAIC00NywxMyArNDcsMTQgQEAKIAlzdHJ1Y3QgdmlkZW9idWZfcXVldWUJdmlkcTsKIAlzdHJ1Y3QgbGlzdF9oZWFkCXZpZHFfYWN0aXZlOwogCXN0cnVjdCB0YXNrX3N0cnVjdAkqa3RocmVhZDsKKwlzdHJ1Y3QgcDJtX2Rlc2MJCWRlc2NbU09MT19OUl9QMk1fREVTQ107CiB9OwogCiBzdGF0aWMgdW5zaWduZWQgY2hhciB2aWRfdm9wX2hlYWRlcltdID0gewogCTB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MjAsCiAJMHgwMiwgMHg0OCwgMHgwNSwgMHhjMCwgMHgwMCwgMHg0MCwgMHgwMCwgMHg0MCwKIAkweDAwLCAweDQwLCAweDAwLCAweDgwLCAweDAwLCAweDk3LCAweDUzLCAweDA0LAotCTB4MWYsIDB4NGMsIDB4NTgsIDB4MTAsIDB4NzgsIDB4NTEsIDB4MTgsIDB4M2UsCisJMHgxZiwgMHg0YywgMHg1OCwgMHgxMCwgMHg3OCwgMHg1MSwgMHgxOCwgMHgzZiwKIH07CiAKIC8qCkBAIC0xNTEsNiArMTUyLDExIEBACiAJZWxzZQogCQlzb2xvX2Rldi0+bW90aW9uX21hc2sgJj0gfigxIDw8IGNoKTsKIAorCS8qIERvIHRoaXMgcmVnYXJkbGVzcyBvZiBpZiB3ZSBhcmUgdHVybmluZyBvbiBvciBvZmYgKi8KKwlzb2xvX3JlZ193cml0ZShzb2xvX2VuYy0+c29sb19kZXYsIFNPTE9fVklfTU9UX0NMRUFSLAorCQkgICAgICAgMSA8PCBzb2xvX2VuYy0+Y2gpOworCXNvbG9fZW5jLT5tb3Rpb25fZGV0ZWN0ZWQgPSAwOworCiAJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVklfTU9UX0FEUiwKIAkJICAgICAgIFNPTE9fVklfTU9USU9OX0VOKHNvbG9fZGV2LT5tb3Rpb25fbWFzaykgfAogCQkgICAgICAgKFNPTE9fTU9USU9OX0VYVF9BRERSKHNvbG9fZGV2KSA+PiAxNikpOwpAQCAtMTg0LDcgKzE5MCw3IEBACiAJCXNvbG9fZW5jLT5id193ZWlnaHQgPDw9IDI7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCVdBUk4oMSwgIm1vZGUgaXMgdW5rbm93biIpOworCQlXQVJOKDEsICJtb2RlIGlzIHVua25vd25cbiIpOwogCX0KIH0KIApAQCAtMjExLDExICsyMTcsNiBAQAogCQkJc29sb19kZXYtPmVuY19id19yZW1haW4gLT0gc29sb19lbmMtPmJ3X3dlaWdodDsKIAl9CiAKLQlmaC0+a3RocmVhZCA9IGt0aHJlYWRfcnVuKHNvbG9fZW5jX3RocmVhZCwgZmgsIFNPTE82MDEwX05BTUUgIl9lbmMiKTsKLQotCWlmIChJU19FUlIoZmgtPmt0aHJlYWQpKQotCQlyZXR1cm4gUFRSX0VSUihmaC0+a3RocmVhZCk7Ci0KIAlmaC0+ZW5jX29uID0gMTsKIAlmaC0+cmRfaWR4ID0gc29sb19lbmMtPnNvbG9fZGV2LT5lbmNfd3JfaWR4OwogCkBAIC0yNzksNiArMjgwLDI0IEBACiAJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fQ0FQX0NIX0NPTVBfRU5BX0Uoc29sb19lbmMtPmNoKSwgMCk7CiB9CiAKK3N0YXRpYyBpbnQgc29sb19zdGFydF9maF90aHJlYWQoc3RydWN0IHNvbG9fZW5jX2ZoICpmaCkKK3sKKwlzdHJ1Y3Qgc29sb19lbmNfZGV2ICpzb2xvX2VuYyA9IGZoLT5lbmM7CisKKwlmaC0+a3RocmVhZCA9IGt0aHJlYWRfcnVuKHNvbG9fZW5jX3RocmVhZCwgZmgsIFNPTE82MDEwX05BTUUgIl9lbmMiKTsKKworCS8qIE9vcHMsIHdlIGhhZCBhIHByb2JsZW0gKi8KKwlpZiAoSVNfRVJSKGZoLT5rdGhyZWFkKSkgeworCQlzcGluX2xvY2soJnNvbG9fZW5jLT5sb2NrKTsKKwkJc29sb19lbmNfb2ZmKGZoKTsKKwkJc3Bpbl91bmxvY2soJnNvbG9fZW5jLT5sb2NrKTsKKworCQlyZXR1cm4gUFRSX0VSUihmaC0+a3RocmVhZCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIGVuY19yZXNldF9nb3Aoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYsIHU4IGNoKQogewogCUJVR19PTihjaCA+PSBzb2xvX2Rldi0+bnJfY2hhbnMpOwpAQCAtMjk5LDIyICszMTgsNjggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBlbmNfZ2V0X21wZWdfZG1hX3Qoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYsIGRtYV9hZGRyX3QgYnVmLAotCQkJICAgICAgdW5zaWduZWQgaW50IG9mZiwgdW5zaWduZWQgaW50IHNpemUpCitzdGF0aWMgdm9pZCBlbmNfd3JpdGVfc2coc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsIHZvaWQgKmJ1ZiwgaW50IHNpemUpCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwl1OCAqc3JjID0gYnVmOworCisJZm9yIChzZyA9IHNnbGlzdDsgc2cgJiYgc2l6ZSA+IDA7IHNnID0gc2dfbmV4dChzZykpIHsKKwkJdTggKnAgPSBzZ192aXJ0KHNnKTsKKwkJc2l6ZV90IGxlbiA9IHNnX2RtYV9sZW4oc2cpOworCQlpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgbGVuICYmIHNpemU7IGkrKykKKwkJCXBbaV0gPSAqKHNyYysrKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZW5jX2dldF9tcGVnX2RtYV9zZyhzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwKKwkJCSAgICAgICBzdHJ1Y3QgcDJtX2Rlc2MgKmRlc2MsCisJCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsIGludCBza2lwLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBvZmYsIHVuc2lnbmVkIGludCBzaXplKQogewogCWludCByZXQ7CiAKIAlpZiAob2ZmID4gU09MT19NUDRFX0VYVF9TSVpFKHNvbG9fZGV2KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAob2ZmICsgc2l6ZSA8PSBTT0xPX01QNEVfRVhUX1NJWkUoc29sb19kZXYpKQorCWlmIChvZmYgKyBzaXplIDw9IFNPTE9fTVA0RV9FWFRfU0laRShzb2xvX2RldikpIHsKKwkJcmV0dXJuIHNvbG9fcDJtX2RtYV9zZyhzb2xvX2RldiwgU09MT19QMk1fRE1BX0lEX01QNEUsCisJCQkJICAgICAgIGRlc2MsIDAsIHNnbGlzdCwgc2tpcCwKKwkJCQkgICAgICAgU09MT19NUDRFX0VYVF9BRERSKHNvbG9fZGV2KSArIG9mZiwgc2l6ZSk7CisJfQorCisJLyogQnVmZmVyIHdyYXAgKi8KKwlyZXQgPSBzb2xvX3AybV9kbWFfc2coc29sb19kZXYsIFNPTE9fUDJNX0RNQV9JRF9NUDRFLCBkZXNjLCAwLAorCQkJICAgICAgc2dsaXN0LCBza2lwLCBTT0xPX01QNEVfRVhUX0FERFIoc29sb19kZXYpICsgb2ZmLAorCQkJICAgICAgU09MT19NUDRFX0VYVF9TSVpFKHNvbG9fZGV2KSAtIG9mZik7CisKKwlyZXQgfD0gc29sb19wMm1fZG1hX3NnKHNvbG9fZGV2LCBTT0xPX1AyTV9ETUFfSURfTVA0RSwgZGVzYywgMCwKKwkJCSAgICAgICBzZ2xpc3QsIHNraXAgKyBTT0xPX01QNEVfRVhUX1NJWkUoc29sb19kZXYpIC0gb2ZmLAorCQkJICAgICAgIFNPTE9fTVA0RV9FWFRfQUREUihzb2xvX2RldiksCisJCQkgICAgICAgc2l6ZSArIG9mZiAtIFNPTE9fTVA0RV9FWFRfU0laRShzb2xvX2RldikpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBlbmNfZ2V0X21wZWdfZG1hX3Qoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYsCisJCQkgICAgICBkbWFfYWRkcl90IGJ1ZiwgdW5zaWduZWQgaW50IG9mZiwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBzaXplKQoreworCWludCByZXQ7CisKKwlpZiAob2ZmID4gU09MT19NUDRFX0VYVF9TSVpFKHNvbG9fZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAob2ZmICsgc2l6ZSA8PSBTT0xPX01QNEVfRVhUX1NJWkUoc29sb19kZXYpKSB7CiAJCXJldHVybiBzb2xvX3AybV9kbWFfdChzb2xvX2RldiwgU09MT19QMk1fRE1BX0lEX01QNEUsIDAsIGJ1ZiwKIAkJCQkgICAgICBTT0xPX01QNEVfRVhUX0FERFIoc29sb19kZXYpICsgb2ZmLCBzaXplKTsKKwl9CiAKIAkvKiBCdWZmZXIgd3JhcCAqLwogCXJldCA9IHNvbG9fcDJtX2RtYV90KHNvbG9fZGV2LCBTT0xPX1AyTV9ETUFfSURfTVA0RSwgMCwgYnVmLAotCQkJICAgIFNPTE9fTVA0RV9FWFRfQUREUihzb2xvX2RldikgKyBvZmYsCi0JCQkgICAgU09MT19NUDRFX0VYVF9TSVpFKHNvbG9fZGV2KSAtIG9mZik7CisJCQkgICAgIFNPTE9fTVA0RV9FWFRfQUREUihzb2xvX2RldikgKyBvZmYsCisJCQkgICAgIFNPTE9fTVA0RV9FWFRfU0laRShzb2xvX2RldikgLSBvZmYpOwogCiAJcmV0IHw9IHNvbG9fcDJtX2RtYV90KHNvbG9fZGV2LCBTT0xPX1AyTV9ETUFfSURfTVA0RSwgMCwKIAkJCSAgICAgIGJ1ZiArIFNPTE9fTVA0RV9FWFRfU0laRShzb2xvX2RldikgLSBvZmYsCkBAIC0zMzcsNzAgKzQwMiwxMDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGVuY19nZXRfanBlZ19kbWEoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYsIGRtYV9hZGRyX3QgYnVmLAotCQkJICAgIHVuc2lnbmVkIGludCBvZmYsIHVuc2lnbmVkIGludCBzaXplKQorc3RhdGljIGludCBlbmNfZ2V0X2pwZWdfZG1hX3NnKHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2LAorCQkJICAgICAgIHN0cnVjdCBwMm1fZGVzYyAqZGVzYywKKwkJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwgaW50IHNraXAsCisJCQkgICAgICAgdW5zaWduZWQgaW50IG9mZiwgdW5zaWduZWQgaW50IHNpemUpCiB7CiAJaW50IHJldDsKIAogCWlmIChvZmYgPiBTT0xPX0pQRUdfRVhUX1NJWkUoc29sb19kZXYpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChvZmYgKyBzaXplIDw9IFNPTE9fSlBFR19FWFRfU0laRShzb2xvX2RldikpCi0JCXJldHVybiBzb2xvX3AybV9kbWFfdChzb2xvX2RldiwgU09MT19QMk1fRE1BX0lEX0pQRUcsIDAsIGJ1ZiwKLQkJCQkgICAgICBTT0xPX0pQRUdfRVhUX0FERFIoc29sb19kZXYpICsgb2ZmLCBzaXplKTsKKwlpZiAob2ZmICsgc2l6ZSA8PSBTT0xPX0pQRUdfRVhUX1NJWkUoc29sb19kZXYpKSB7CisJCXJldHVybiBzb2xvX3AybV9kbWFfc2coc29sb19kZXYsIFNPTE9fUDJNX0RNQV9JRF9KUEVHLAorCQkJCSAgICAgICBkZXNjLCAwLCBzZ2xpc3QsIHNraXAsCisJCQkJICAgICAgIFNPTE9fSlBFR19FWFRfQUREUihzb2xvX2RldikgKyBvZmYsIHNpemUpOworCX0KIAogCS8qIEJ1ZmZlciB3cmFwICovCi0JcmV0ID0gc29sb19wMm1fZG1hX3Qoc29sb19kZXYsIFNPTE9fUDJNX0RNQV9JRF9KUEVHLCAwLCBidWYsCi0JCQkgICAgIFNPTE9fSlBFR19FWFRfQUREUihzb2xvX2RldikgKyBvZmYsCi0JCQkgICAgIFNPTE9fSlBFR19FWFRfU0laRShzb2xvX2RldikgLSBvZmYpOworCXJldCA9IHNvbG9fcDJtX2RtYV9zZyhzb2xvX2RldiwgU09MT19QMk1fRE1BX0lEX0pQRUcsIGRlc2MsIDAsCisJCQkgICAgICBzZ2xpc3QsIHNraXAsIFNPTE9fSlBFR19FWFRfQUREUihzb2xvX2RldikgKyBvZmYsCisJCQkgICAgICBTT0xPX0pQRUdfRVhUX1NJWkUoc29sb19kZXYpIC0gb2ZmKTsKIAotCXJldCB8PSBzb2xvX3AybV9kbWFfdChzb2xvX2RldiwgU09MT19QMk1fRE1BX0lEX0pQRUcsIDAsCi0JCQkgICAgICBidWYgKyBTT0xPX0pQRUdfRVhUX1NJWkUoc29sb19kZXYpIC0gb2ZmLAotCQkJICAgICAgU09MT19KUEVHX0VYVF9BRERSKHNvbG9fZGV2KSwKLQkJCSAgICAgIHNpemUgKyBvZmYgLSBTT0xPX0pQRUdfRVhUX1NJWkUoc29sb19kZXYpKTsKKwlyZXQgfD0gc29sb19wMm1fZG1hX3NnKHNvbG9fZGV2LCBTT0xPX1AyTV9ETUFfSURfSlBFRywgZGVzYywgMCwKKwkJCSAgICAgICBzZ2xpc3QsIHNraXAgKyBTT0xPX0pQRUdfRVhUX1NJWkUoc29sb19kZXYpIC0gb2ZmLAorCQkJICAgICAgIFNPTE9fSlBFR19FWFRfQUREUihzb2xvX2RldiksCisJCQkgICAgICAgc2l6ZSArIG9mZiAtIFNPTE9fSlBFR19FWFRfU0laRShzb2xvX2RldikpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBzb2xvX2ZpbGxfanBlZyhzdHJ1Y3Qgc29sb19lbmNfZmggKmZoLCBzdHJ1Y3Qgc29sb19lbmNfYnVmICplbmNfYnVmLAotCQkJICBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YiwgZG1hX2FkZHJfdCB2YnVmKQorLyogUmV0dXJucyB0cnVlIG9mIF9fY2hrIGlzIHdpdGhpbiB0aGUgZmlyc3QgX19yYW5nZSBieXRlcyBvZiBfX29mZiAqLworI2RlZmluZSBPRkZfSU5fUkFOR0UoX19vZmYsIF9fcmFuZ2UsIF9fY2hrKSBcCisJKChfX29mZiA8PSBfX2NoaykgJiYgKChfX29mZiArIF9fcmFuZ2UpID49IF9fY2hrKSkKKworc3RhdGljIHZvaWQgc29sb19qcGVnX2hlYWRlcihzdHJ1Y3Qgc29sb19lbmNfZGV2ICpzb2xvX2VuYywKKwkJCSAgICAgc3RydWN0IHZpZGVvYnVmX2RtYWJ1ZiAqdmJ1ZikKIHsKLQlzdHJ1Y3Qgc29sb19lbmNfZGV2ICpzb2xvX2VuYyA9IGZoLT5lbmM7Ci0Jc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYgPSBzb2xvX2VuYy0+c29sb19kZXY7Ci0JdTggKnAgPSB2aWRlb2J1Zl9xdWV1ZV90b192YWRkcigmZmgtPnZpZHEsIHZiKTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCXZvaWQgKnNyYyA9IGpwZWdfaGVhZGVyOworCXNpemVfdCBjb3BpZWQgPSAwOworCXNpemVfdCB0b19jb3B5ID0gc2l6ZW9mKGpwZWdfaGVhZGVyKTsKIAotCW1lbWNweShwLCBqcGVnX2hlYWRlciwgc2l6ZW9mKGpwZWdfaGVhZGVyKSk7Ci0JcFtTT0YwX1NUQVJUICsgNV0gPSAweGZmICYgKHNvbG9fZW5jLT5oZWlnaHQgPj4gOCk7Ci0JcFtTT0YwX1NUQVJUICsgNl0gPSAweGZmICYgc29sb19lbmMtPmhlaWdodDsKLQlwW1NPRjBfU1RBUlQgKyA3XSA9IDB4ZmYgJiAoc29sb19lbmMtPndpZHRoID4+IDgpOwotCXBbU09GMF9TVEFSVCArIDhdID0gMHhmZiAmIHNvbG9fZW5jLT53aWR0aDsKKwlmb3IgKHNnID0gdmJ1Zi0+c2dsaXN0OyBzZyAmJiBjb3BpZWQgPCB0b19jb3B5OyBzZyA9IHNnX25leHQoc2cpKSB7CisJCXNpemVfdCB0aGlzX2NvcHkgPSBtaW4oc2dfZG1hX2xlbihzZyksCisJCQkJICAgICAgICh1bnNpZ25lZCBpbnQpKHRvX2NvcHkgLSBjb3BpZWQpKTsKKwkJdTggKnAgPSBzZ192aXJ0KHNnKTsKIAotCXZidWYgKz0gc2l6ZW9mKGpwZWdfaGVhZGVyKTsKLQl2Yi0+c2l6ZSA9IGVuY19idWYtPmpwZWdfc2l6ZSArIHNpemVvZihqcGVnX2hlYWRlcik7CisJCW1lbWNweShwLCBzcmMgKyBjb3BpZWQsIHRoaXNfY29weSk7CiAKLQlyZXR1cm4gZW5jX2dldF9qcGVnX2RtYShzb2xvX2RldiwgdmJ1ZiwgZW5jX2J1Zi0+anBlZ19vZmYsCi0JCQkJZW5jX2J1Zi0+anBlZ19zaXplKTsKKwkJaWYgKE9GRl9JTl9SQU5HRShjb3BpZWQsIHRoaXNfY29weSwgU09GMF9TVEFSVCArIDUpKQorCQkJcFsoU09GMF9TVEFSVCArIDUpIC0gY29waWVkXSA9CisJCQkJMHhmZiAmIChzb2xvX2VuYy0+aGVpZ2h0ID4+IDgpOworCQlpZiAoT0ZGX0lOX1JBTkdFKGNvcGllZCwgdGhpc19jb3B5LCBTT0YwX1NUQVJUICsgNikpCisJCQlwWyhTT0YwX1NUQVJUICsgNikgLSBjb3BpZWRdID0gMHhmZiAmIHNvbG9fZW5jLT5oZWlnaHQ7CisJCWlmIChPRkZfSU5fUkFOR0UoY29waWVkLCB0aGlzX2NvcHksIFNPRjBfU1RBUlQgKyA3KSkKKwkJCXBbKFNPRjBfU1RBUlQgKyA3KSAtIGNvcGllZF0gPQorCQkJCTB4ZmYgJiAoc29sb19lbmMtPndpZHRoID4+IDgpOworCQlpZiAoT0ZGX0lOX1JBTkdFKGNvcGllZCwgdGhpc19jb3B5LCBTT0YwX1NUQVJUICsgOCkpCisJCQlwWyhTT0YwX1NUQVJUICsgOCkgLSBjb3BpZWRdID0gMHhmZiAmIHNvbG9fZW5jLT53aWR0aDsKKworCQljb3BpZWQgKz0gdGhpc19jb3B5OworCX0KK30KKworc3RhdGljIGludCBzb2xvX2ZpbGxfanBlZyhzdHJ1Y3Qgc29sb19lbmNfZmggKmZoLCBzdHJ1Y3Qgc29sb19lbmNfYnVmICplbmNfYnVmLAorCQkJICBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YiwKKwkJCSAgc3RydWN0IHZpZGVvYnVmX2RtYWJ1ZiAqdmJ1ZikKK3sKKwlzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiA9IGZoLT5lbmMtPnNvbG9fZGV2OworCWludCBzaXplID0gZW5jX2J1Zi0+anBlZ19zaXplOworCisJLyogQ29weSB0aGUgaGVhZGVyIGZpcnN0IChkaXJlY3Qgd3JpdGUpICovCisJc29sb19qcGVnX2hlYWRlcihmaC0+ZW5jLCB2YnVmKTsKKworCXZiLT5zaXplID0gc2l6ZSArIHNpemVvZihqcGVnX2hlYWRlcik7CisKKwkvKiBHcmFiIHRoZSBqcGVnIGZyYW1lICovCisJcmV0dXJuIGVuY19nZXRfanBlZ19kbWFfc2coc29sb19kZXYsIGZoLT5kZXNjLCB2YnVmLT5zZ2xpc3QsCisJCQkJICAgc2l6ZW9mKGpwZWdfaGVhZGVyKSwKKwkJCQkgICBlbmNfYnVmLT5qcGVnX29mZiwgc2l6ZSk7CiB9CiAKIHN0YXRpYyBpbnQgc29sb19maWxsX21wZWcoc3RydWN0IHNvbG9fZW5jX2ZoICpmaCwgc3RydWN0IHNvbG9fZW5jX2J1ZiAqZW5jX2J1ZiwKLQkJCSAgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIsIGRtYV9hZGRyX3QgdmJ1ZikKKwkJCSAgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIsCisJCQkgIHN0cnVjdCB2aWRlb2J1Zl9kbWFidWYgKnZidWYpCiB7CiAJc3RydWN0IHNvbG9fZW5jX2RldiAqc29sb19lbmMgPSBmaC0+ZW5jOwogCXN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2ID0gc29sb19lbmMtPnNvbG9fZGV2OwogCXN0cnVjdCB2b3BfaGVhZGVyIHZoOwogCWludCByZXQ7CiAJaW50IGZyYW1lX3NpemUsIGZyYW1lX29mZjsKKwlpbnQgc2tpcCA9IDA7CiAKIAlpZiAoV0FSTl9PTl9PTkNFKGVuY19idWYtPnNpemUgPD0gc2l6ZW9mKHZoKSkpCi0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBGaXJzdCBnZXQgdGhlIGhhcmR3YXJlIHZvcCBoZWFkZXIgKG5vdCByZWFsIG1wZWcpICovCiAJcmV0ID0gZW5jX2dldF9tcGVnX2RtYShzb2xvX2RldiwgJnZoLCBlbmNfYnVmLT5vZmYsIHNpemVvZih2aCkpOwotCWlmIChyZXQpCi0JCXJldHVybiAtMTsKKwlpZiAoV0FSTl9PTl9PTkNFKHJldCkpCisJCXJldHVybiByZXQ7CiAKIAlpZiAoV0FSTl9PTl9PTkNFKHZoLnNpemUgPiBlbmNfYnVmLT5zaXplKSkKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVJTlZBTDsKIAogCXZiLT53aWR0aCA9IHZoLmhzaXplIDw8IDQ7CiAJdmItPmhlaWdodCA9IHZoLnZzaXplIDw8IDQ7CkBAIC00MTAsOSArNTEzLDkgQEAKIAlpZiAoIWVuY19idWYtPnZvcCkgewogCQl1MTYgZnBzID0gc29sb19kZXYtPmZwcyAqIDEwMDA7CiAJCXUxNiBpbnRlcnZhbCA9IHNvbG9fZW5jLT5pbnRlcnZhbCAqIDEwMDA7Ci0JCXU4ICpwID0gdmlkZW9idWZfcXVldWVfdG9fdmFkZHIoJmZoLT52aWRxLCB2Yik7CisJCXU4IHBbc2l6ZW9mKHZpZF92b3BfaGVhZGVyKV07CiAKLQkJbWVtY3B5KHAsIHZpZF92b3BfaGVhZGVyLCBzaXplb2YodmlkX3ZvcF9oZWFkZXIpKTsKKwkJbWVtY3B5KHAsIHZpZF92b3BfaGVhZGVyLCBzaXplb2YocCkpOwogCiAJCWlmIChzb2xvX2Rldi0+dmlkZW9fdHlwZSA9PSBTT0xPX1ZPX0ZNVF9UWVBFX05UU0MpCiAJCQlwWzEwXSB8PSAoKFhWSURfUEFSXzQzX05UU0MgPDwgMykgJiAweDc4KTsKQEAgLTQzNCw0MyArNTM3LDQ5IEBACiAJCWlmICh2aC5pbnRlcmxhY2UpCiAJCQlwWzI5XSB8PSAweDIwOwogCisJCWVuY193cml0ZV9zZyh2YnVmLT5zZ2xpc3QsIHAsIHNpemVvZihwKSk7CisKIAkJLyogQWRqdXN0IHRoZSBkbWEgYnVmZmVyIHBhc3QgdGhpcyBoZWFkZXIgKi8KIAkJdmItPnNpemUgKz0gc2l6ZW9mKHZpZF92b3BfaGVhZGVyKTsKLQkJdmJ1ZiArPSBzaXplb2YodmlkX3ZvcF9oZWFkZXIpOworCQlza2lwID0gc2l6ZW9mKHZpZF92b3BfaGVhZGVyKTsKIAl9CiAKIAkvKiBOb3cgZ2V0IHRoZSBhY3R1YWwgbXBlZyBwYXlsb2FkICovCiAJZnJhbWVfb2ZmID0gKGVuY19idWYtPm9mZiArIHNpemVvZih2aCkpICUgU09MT19NUDRFX0VYVF9TSVpFKHNvbG9fZGV2KTsKIAlmcmFtZV9zaXplID0gZW5jX2J1Zi0+c2l6ZSAtIHNpemVvZih2aCk7Ci0JcmV0ID0gZW5jX2dldF9tcGVnX2RtYV90KHNvbG9fZGV2LCB2YnVmLCBmcmFtZV9vZmYsIGZyYW1lX3NpemUpOwotCWlmIChXQVJOX09OX09OQ0UocmV0KSkKLQkJcmV0dXJuIC0xOwogCi0JcmV0dXJuIDA7CisJcmV0ID0gZW5jX2dldF9tcGVnX2RtYV9zZyhzb2xvX2RldiwgZmgtPmRlc2MsIHZidWYtPnNnbGlzdCwKKwkJCQkgIHNraXAsIGZyYW1lX29mZiwgZnJhbWVfc2l6ZSk7CisJV0FSTl9PTl9PTkNFKHJldCk7CisKKwlyZXR1cm4gcmV0OwogfQogCi0vKiBPbiBzdWNjZXNzZnVsIHJldHVybiAoMCksIGxlYXZlcyBzb2xvX2VuYy0+bG9jayB1bmxvY2tlZCAqLwotc3RhdGljIGludCBzb2xvX2VuY19maWxsYnVmKHN0cnVjdCBzb2xvX2VuY19maCAqZmgsCitzdGF0aWMgdm9pZCBzb2xvX2VuY19maWxsYnVmKHN0cnVjdCBzb2xvX2VuY19maCAqZmgsCiAJCQkgICAgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIpCiB7CiAJc3RydWN0IHNvbG9fZW5jX2RldiAqc29sb19lbmMgPSBmaC0+ZW5jOwogCXN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2ID0gc29sb19lbmMtPnNvbG9fZGV2OwogCXN0cnVjdCBzb2xvX2VuY19idWYgKmVuY19idWYgPSBOVUxMOwotCWRtYV9hZGRyX3QgdmJ1ZjsKKwlzdHJ1Y3QgdmlkZW9idWZfZG1hYnVmICp2YnVmOwogCWludCByZXQ7CisJaW50IGVycm9yID0gMTsKIAl1MTYgaWR4ID0gZmgtPnJkX2lkeDsKIAogCXdoaWxlIChpZHggIT0gc29sb19kZXYtPmVuY193cl9pZHgpIHsKIAkJc3RydWN0IHNvbG9fZW5jX2J1ZiAqZWJ1ZiA9ICZzb2xvX2Rldi0+ZW5jX2J1ZltpZHhdOworCiAJCWlkeCA9IChpZHggKyAxKSAlIFNPTE9fTlJfUklOR19CVUZTOworCisJCWlmIChlYnVmLT5jaCAhPSBzb2xvX2VuYy0+Y2gpCisJCQljb250aW51ZTsKKwogCQlpZiAoZmgtPmZtdCA9PSBWNEwyX1BJWF9GTVRfTVBFRykgewotCQkJaWYgKGZoLT50eXBlICE9IGVidWYtPnR5cGUpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoZWJ1Zi0+Y2ggPT0gc29sb19lbmMtPmNoKSB7CisJCQlpZiAoZmgtPnR5cGUgPT0gZWJ1Zi0+dHlwZSkgewogCQkJCWVuY19idWYgPSBlYnVmOwogCQkJCWJyZWFrOwogCQkJfQotCQl9IGVsc2UgaWYgKGVidWYtPmNoID09IHNvbG9fZW5jLT5jaCkgeworCQl9IGVsc2UgewogCQkJLyogRm9yIG1qcGVnLCBrZWVwIHJlYWRpbmcgdG8gdGhlIG5ld2VzdCBmcmFtZSAqLwogCQkJZW5jX2J1ZiA9IGVidWY7CiAJCX0KQEAgLTQ3OCw0OCArNTg3LDU1IEBACiAKIAlmaC0+cmRfaWR4ID0gaWR4OwogCi0JaWYgKCFlbmNfYnVmKQotCQlyZXR1cm4gLTE7CisJaWYgKFdBUk5fT05fT05DRSghZW5jX2J1ZikpCisJCWdvdG8gYnVmX2VycjsKIAogCWlmICgoZmgtPmZtdCA9PSBWNEwyX1BJWF9GTVRfTVBFRyAmJgogCSAgICAgdmItPmJzaXplIDwgZW5jX2J1Zi0+c2l6ZSkgfHwKIAkgICAgKGZoLT5mbXQgPT0gVjRMMl9QSVhfRk1UX01KUEVHICYmCiAJICAgICB2Yi0+YnNpemUgPCAoZW5jX2J1Zi0+anBlZ19zaXplICsgc2l6ZW9mKGpwZWdfaGVhZGVyKSkpKSB7Ci0JCXJldHVybiAtMTsKKwkJV0FSTl9PTl9PTkNFKDEpOworCQlnb3RvIGJ1Zl9lcnI7CiAJfQogCi0JaWYgKCEodmJ1ZiA9IHZpZGVvYnVmX3RvX2RtYV9jb250aWcodmIpKSkKLQkJcmV0dXJuIC0xOwotCi0JLyogSXMgaXQgb2sgdGhhdCB3ZSBtZXNzIHdpdGggdGhpcyBidWZmZXIgb3V0IG9mIGxvY2s/ICovCi0Jc3Bpbl91bmxvY2soJnNvbG9fZW5jLT5sb2NrKTsKKwl2YnVmID0gdmlkZW9idWZfdG9fZG1hKHZiKTsKKwlpZiAoV0FSTl9PTl9PTkNFKCF2YnVmKSkKKwkJZ290byBidWZfZXJyOwogCiAJaWYgKGZoLT5mbXQgPT0gVjRMMl9QSVhfRk1UX01QRUcpCiAJCXJldCA9IHNvbG9fZmlsbF9tcGVnKGZoLCBlbmNfYnVmLCB2YiwgdmJ1Zik7CiAJZWxzZQogCQlyZXQgPSBzb2xvX2ZpbGxfanBlZyhmaCwgZW5jX2J1ZiwgdmIsIHZidWYpOwogCi0JaWYgKHJldCkgLy8gSWdub3JlIGZhaWx1cmVzCi0JCXJldHVybiAwOworCWlmICghcmV0KQorCQllcnJvciA9IDA7CiAKLQlsaXN0X2RlbCgmdmItPnF1ZXVlKTsKLQl2Yi0+ZmllbGRfY291bnQrKzsKLQl2Yi0+dHMgPSBlbmNfYnVmLT50czsKLQl2Yi0+c3RhdGUgPSBWSURFT0JVRl9ET05FOworYnVmX2VycjoKKwlpZiAoZXJyb3IpIHsKKwkJdmItPnN0YXRlID0gVklERU9CVUZfRVJST1I7CisJfSBlbHNlIHsKKwkJdmItPmZpZWxkX2NvdW50Kys7CisJCXZiLT50cyA9IGVuY19idWYtPnRzOworCQl2Yi0+c3RhdGUgPSBWSURFT0JVRl9ET05FOworCX0KIAogCXdha2VfdXAoJnZiLT5kb25lKTsKIAotCXJldHVybiAwOworCXJldHVybjsKIH0KIAogc3RhdGljIHZvaWQgc29sb19lbmNfdGhyZWFkX3RyeShzdHJ1Y3Qgc29sb19lbmNfZmggKmZoKQogewogCXN0cnVjdCBzb2xvX2VuY19kZXYgKnNvbG9fZW5jID0gZmgtPmVuYzsKKwlzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiA9IHNvbG9fZW5jLT5zb2xvX2RldjsKIAlzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YjsKIAogCWZvciAoOzspIHsKIAkJc3Bpbl9sb2NrKCZzb2xvX2VuYy0+bG9jayk7CiAKKwkJaWYgKGZoLT5yZF9pZHggPT0gc29sb19kZXYtPmVuY193cl9pZHgpCisJCQlicmVhazsKKwogCQlpZiAobGlzdF9lbXB0eSgmZmgtPnZpZHFfYWN0aXZlKSkKIAkJCWJyZWFrOwogCkBAIC01MjksOSArNjQ1LDExIEBACiAJCWlmICghd2FpdHF1ZXVlX2FjdGl2ZSgmdmItPmRvbmUpKQogCQkJYnJlYWs7CiAKLQkJLyogT24gc3VjY2VzcywgcmV0dXJucyB3aXRoIHNvbG9fZW5jLT5sb2NrIHVubG9ja2VkICovCi0JCWlmIChzb2xvX2VuY19maWxsYnVmKGZoLCB2YikpCi0JCQlicmVhazsKKwkJbGlzdF9kZWwoJnZiLT5xdWV1ZSk7CisKKwkJc3Bpbl91bmxvY2soJnNvbG9fZW5jLT5sb2NrKTsKKworCQlzb2xvX2VuY19maWxsYnVmKGZoLCB2Yik7CiAJfQogCiAJYXNzZXJ0X3NwaW5fbG9ja2VkKCZzb2xvX2VuYy0+bG9jayk7CkBAIC01NTcsNyArNjc1LDcgQEAKIAogCXJlbW92ZV93YWl0X3F1ZXVlKCZzb2xvX2VuYy0+dGhyZWFkX3dhaXQsICZ3YWl0KTsKIAotICAgICAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAogdm9pZCBzb2xvX21vdGlvbl9pc3Ioc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYpCkBAIC02MTQsNyArNzMyLDggQEAKIAkJanBlZ19uZXh0ID0gc29sb19yZWdfcmVhZChzb2xvX2RldiwKIAkJCQkJU09MT19WRV9KUEVHX1FVRShzb2xvX2Rldi0+ZW5jX2lkeCkpOwogCi0JCWlmICgoY2ggPSAobXBlZ19jdXJyZW50ID4+IDI0KSAmIDB4MWYpID49IFNPTE9fTUFYX0NIQU5ORUxTKSB7CisJCWNoID0gKG1wZWdfY3VycmVudCA+PiAyNCkgJiAweDFmOworCQlpZiAoY2ggPj0gU09MT19NQVhfQ0hBTk5FTFMpIHsKIAkJCWNoIC09IFNPTE9fTUFYX0NIQU5ORUxTOwogCQkJZW5jX3R5cGUgPSBTT0xPX0VOQ19UWVBFX0VYVDsKIAkJfSBlbHNlCkBAIC02NjksMTIgKzc4OCwxMiBAQAogc3RhdGljIGludCBzb2xvX2VuY19idWZfc2V0dXAoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICp2cSwgdW5zaWduZWQgaW50ICpjb3VudCwKIAkJCSAgICAgIHVuc2lnbmVkIGludCAqc2l6ZSkKIHsKLSAgICAgICAgKnNpemUgPSBGUkFNRV9CVUZfU0laRTsKKwkqc2l6ZSA9IEZSQU1FX0JVRl9TSVpFOwogCi0gICAgICAgIGlmICgqY291bnQgPCBNSU5fVklEX0JVRkZFUlMpCisJaWYgKCpjb3VudCA8IE1JTl9WSURfQlVGRkVSUykKIAkJKmNvdW50ID0gTUlOX1ZJRF9CVUZGRVJTOwogCi0gICAgICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHNvbG9fZW5jX2J1Zl9wcmVwYXJlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqdnEsCkBAIC02OTYsNyArODE1LDkgQEAKIAlpZiAodmItPnN0YXRlID09IFZJREVPQlVGX05FRURTX0lOSVQpIHsKIAkJaW50IHJjID0gdmlkZW9idWZfaW9sb2NrKHZxLCB2YiwgTlVMTCk7CiAJCWlmIChyYyA8IDApIHsKLQkJCXZpZGVvYnVmX2RtYV9jb250aWdfZnJlZSh2cSwgdmIpOworCQkJc3RydWN0IHZpZGVvYnVmX2RtYWJ1ZiAqZG1hID0gdmlkZW9idWZfdG9fZG1hKHZiKTsKKwkJCXZpZGVvYnVmX2RtYV91bm1hcCh2cS0+ZGV2LCBkbWEpOworCQkJdmlkZW9idWZfZG1hX2ZyZWUoZG1hKTsKIAkJCXZiLT5zdGF0ZSA9IFZJREVPQlVGX05FRURTX0lOSVQ7CiAJCQlyZXR1cm4gcmM7CiAJCX0KQEAgLTcxOSw3ICs4NDAsMTAgQEAKIHN0YXRpYyB2b2lkIHNvbG9fZW5jX2J1Zl9yZWxlYXNlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqdnEsCiAJCQkJIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiKQogewotCXZpZGVvYnVmX2RtYV9jb250aWdfZnJlZSh2cSwgdmIpOworCXN0cnVjdCB2aWRlb2J1Zl9kbWFidWYgKmRtYSA9IHZpZGVvYnVmX3RvX2RtYSh2Yik7CisKKwl2aWRlb2J1Zl9kbWFfdW5tYXAodnEtPmRldiwgZG1hKTsKKwl2aWRlb2J1Zl9kbWFfZnJlZShkbWEpOwogCXZiLT5zdGF0ZSA9IFZJREVPQlVGX05FRURTX0lOSVQ7CiB9CiAKQEAgLTc1MCwyNSArODc0LDIyIEBACiAJc3RydWN0IHNvbG9fZW5jX2RldiAqc29sb19lbmMgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCXN0cnVjdCBzb2xvX2VuY19maCAqZmg7CiAKLQlpZiAoKGZoID0ga3phbGxvYyhzaXplb2YoKmZoKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJZmggPSBremFsbG9jKHNpemVvZigqZmgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZmggPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlzcGluX2xvY2soJnNvbG9fZW5jLT5sb2NrKTsKLQogCWZoLT5lbmMgPSBzb2xvX2VuYzsKIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBmaDsKIAlJTklUX0xJU1RfSEVBRCgmZmgtPnZpZHFfYWN0aXZlKTsKIAlmaC0+Zm10ID0gVjRMMl9QSVhfRk1UX01QRUc7CiAJZmgtPnR5cGUgPSBTT0xPX0VOQ19UWVBFX1NURDsKIAotCXZpZGVvYnVmX3F1ZXVlX2RtYV9jb250aWdfaW5pdCgmZmgtPnZpZHEsICZzb2xvX2VuY192aWRlb19xb3BzLAotCQkJCSAgICAmc29sb19lbmMtPnNvbG9fZGV2LT5wZGV2LT5kZXYsCi0JCQkJICAgICZzb2xvX2VuYy0+bG9jaywKLQkJCQkgICAgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLAotCQkJCSAgICBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQsCi0JCQkJICAgIHNpemVvZihzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyKSwgZmgsIE5VTEwpOwotCi0Jc3Bpbl91bmxvY2soJnNvbG9fZW5jLT5sb2NrKTsKKwl2aWRlb2J1Zl9xdWV1ZV9zZ19pbml0KCZmaC0+dmlkcSwgJnNvbG9fZW5jX3ZpZGVvX3FvcHMsCisJCQkgICAgICAgJnNvbG9fZW5jLT5zb2xvX2Rldi0+cGRldi0+ZGV2LAorCQkJICAgICAgICZzb2xvX2VuYy0+bG9jaywKKwkJCSAgICAgICBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUsCisJCQkgICAgICAgVjRMMl9GSUVMRF9JTlRFUkxBQ0VELAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyKSwgZmgsIE5VTEwpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC03ODUsNyArOTA2LDExIEBACiAKIAkJc3Bpbl9sb2NrKCZzb2xvX2VuYy0+bG9jayk7CiAJCXJldCA9IHNvbG9fZW5jX29uKGZoKTsKLQkgICAgICAgIHNwaW5fdW5sb2NrKCZzb2xvX2VuYy0+bG9jayk7CisJCXNwaW5fdW5sb2NrKCZzb2xvX2VuYy0+bG9jayk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IHNvbG9fc3RhcnRfZmhfdGhyZWFkKGZoKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAJfQpAQCAtNzk3LDEwICs5MjIsMTUgQEAKIHN0YXRpYyBpbnQgc29sb19lbmNfcmVsZWFzZShzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3Qgc29sb19lbmNfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzb2xvX2VuY19kZXYgKnNvbG9fZW5jID0gZmgtPmVuYzsKIAogCXZpZGVvYnVmX3N0b3AoJmZoLT52aWRxKTsKIAl2aWRlb2J1Zl9tbWFwX2ZyZWUoJmZoLT52aWRxKTsKKworCXNwaW5fbG9jaygmc29sb19lbmMtPmxvY2spOwogCXNvbG9fZW5jX29mZihmaCk7CisJc3Bpbl91bmxvY2soJnNvbG9fZW5jLT5sb2NrKTsKKwogCWtmcmVlKGZoKTsKIAogCXJldHVybiAwOwpAQCAtODQyLDcgKzk3Miw3IEBACiAJaWYgKHNvbG9fZGV2LT52aWRlb190eXBlID09IFNPTE9fVk9fRk1UX1RZUEVfTlRTQykKIAkJaW5wdXQtPnN0ZCA9IFY0TDJfU1REX05UU0NfTTsKIAllbHNlCi0JCWlucHV0LT5zdGQgPSBWNEwyX1NURF9QQUxfTTsKKwkJaW5wdXQtPnN0ZCA9IFY0TDJfU1REX1BBTF9COwogCiAJaWYgKCF0dzI4X2dldF92aWRlb19zdGF0dXMoc29sb19kZXYsIHNvbG9fZW5jLT5jaCkpCiAJCWlucHV0LT5zdGF0dXMgPSBWNEwyX0lOX1NUX05PX1NJR05BTDsKQEAgLTkxNSw5ICsxMDQ1LDggQEAKIAogCWlmIChwaXgtPmZpZWxkID09IFY0TDJfRklFTERfQU5ZKQogCQlwaXgtPmZpZWxkID0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEOwotCWVsc2UgaWYgKHBpeC0+ZmllbGQgIT0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEKSB7CisJZWxzZSBpZiAocGl4LT5maWVsZCAhPSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQpCiAJCXBpeC0+ZmllbGQgPSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQ7Ci0JfQogCiAJLyogSnVzdCBzZXQgdGhlc2UgKi8KIAlwaXgtPmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU01QVEUxNzBNOwpAQCAtOTM3LDcgKzEwNjYsOCBAQAogCiAJc3Bpbl9sb2NrKCZzb2xvX2VuYy0+bG9jayk7CiAKLQlpZiAoKHJldCA9IHNvbG9fZW5jX3RyeV9mbXRfY2FwKGZpbGUsIHByaXYsIGYpKSkgeworCXJldCA9IHNvbG9fZW5jX3RyeV9mbXRfY2FwKGZpbGUsIHByaXYsIGYpOworCWlmIChyZXQpIHsKIAkJc3Bpbl91bmxvY2soJnNvbG9fZW5jLT5sb2NrKTsKIAkJcmV0dXJuIHJldDsKIAl9CkBAIC05NTYsNyArMTA4NiwxMCBAQAogCiAJc3Bpbl91bmxvY2soJnNvbG9fZW5jLT5sb2NrKTsKIAotCXJldHVybiByZXQ7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBzb2xvX3N0YXJ0X2ZoX3RocmVhZChmaCk7CiB9CiAKIHN0YXRpYyBpbnQgc29sb19lbmNfZ2V0X2ZtdF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCkBAIC05NzcsNyArMTExMCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc29sb19lbmNfcmVxYnVmcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgCitzdGF0aWMgaW50IHNvbG9fZW5jX3JlcWJ1ZnMoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkgICAgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnJlcSkKIHsKIAlzdHJ1Y3Qgc29sb19lbmNfZmggKmZoID0gcHJpdjsKQEAgLTEwMTQsNiArMTE0NywxMCBAQAogCQlzcGluX3VubG9jaygmc29sb19lbmMtPmxvY2spOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKKworCQlyZXQgPSBzb2xvX3N0YXJ0X2ZoX3RocmVhZChmaCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCX0KIAogCXJldCA9IHZpZGVvYnVmX2RxYnVmKCZmaC0+dmlkcSwgYnVmLCBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CkBAIC0xMDMzLDEyICsxMTcwLDE2IEBACiAKIAkvKiBDaGVjayBmb3Iga2V5IGZyYW1lIG9uIG1wZWcgZGF0YSAqLwogCWlmIChmaC0+Zm10ID09IFY0TDJfUElYX0ZNVF9NUEVHKSB7Ci0JCXN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiID0gZmgtPnZpZHEuYnVmc1tidWYtPmluZGV4XTsKLQkJdTggKnAgPSB2aWRlb2J1Zl9xdWV1ZV90b192YWRkcigmZmgtPnZpZHEsIHZiKTsKLQkJaWYgKHBbM10gPT0gMHgwMCkKLQkJCWJ1Zi0+ZmxhZ3MgfD0gVjRMMl9CVUZfRkxBR19LRVlGUkFNRTsKLQkJZWxzZQotCQkJYnVmLT5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX1BGUkFNRTsKKwkJc3RydWN0IHZpZGVvYnVmX2RtYWJ1ZiAqdmJ1ZiA9CisJCQkJdmlkZW9idWZfdG9fZG1hKGZoLT52aWRxLmJ1ZnNbYnVmLT5pbmRleF0pOworCisJCWlmICh2YnVmKSB7CisJCQl1OCAqcCA9IHNnX3ZpcnQodmJ1Zi0+c2dsaXN0KTsKKwkJCWlmIChwWzNdID09IDB4MDApCisJCQkJYnVmLT5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX0tFWUZSQU1FOworCQkJZWxzZQorCQkJCWJ1Zi0+ZmxhZ3MgfD0gVjRMMl9CVUZfRkxBR19QRlJBTUU7CisJCX0KIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTExMzYsNyArMTI3Nyw3IEBACiAJLyogWFhYOiBTaG91bGRuJ3Qgd2UgYmUgYWJsZSB0byBnZXQvc2V0IHRoaXMgZnJvbSB2aWRlb2J1Zj8gKi8KIAljcC0+cmVhZGJ1ZmZlcnMgPSAyOwogCi0gICAgICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHNvbG9fc19wYXJtKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LApAQCAtMTE3Niw3ICsxMzE3LDcgQEAKIAogCXNwaW5fdW5sb2NrKCZzb2xvX2VuYy0+bG9jayk7CiAKLSAgICAgICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgc29sb19xdWVyeWN0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCkBAIC0xMjQwLDcgKzEzODEsNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIC1FSU5WQUw7CiB9CiAKIHN0YXRpYyBpbnQgc29sb19xdWVyeW1lbnUoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCkBAIC0xMjUwLDcgKzEzOTEsOCBAQAogCWludCBlcnI7CiAKIAlxY3RybC5pZCA9IHFtZW51LT5pZDsKLQlpZiAoKGVyciA9IHNvbG9fcXVlcnljdHJsKGZpbGUsIHByaXYsICZxY3RybCkpKQorCWVyciA9IHNvbG9fcXVlcnljdHJsKGZpbGUsIHByaXYsICZxY3RybCk7CisJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAogCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfbWVudShxbWVudSwgJnFjdHJsLCBOVUxMKTsKQEAgLTEzNTAsOSArMTQ5Miw5IEBACiAJCXN3aXRjaCAoY3RybC0+aWQpIHsKIAkJY2FzZSBWNEwyX0NJRF9SRFNfVFhfUkFESU9fVEVYVDoKIAkJCWlmIChjdHJsLT5zaXplIC0gMSA+IE9TRF9URVhUX01BWCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gLUVSQU5HRTsKKwkJCQllcnIgPSAtRVJBTkdFOwogCQkJZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAJZXJyID0gY29weV9mcm9tX3VzZXIoc29sb19lbmMtPm9zZF90ZXh0LAorCQkJCWVyciA9IGNvcHlfZnJvbV91c2VyKHNvbG9fZW5jLT5vc2RfdGV4dCwKIAkJCQkJCSAgICAgY3RybC0+c3RyaW5nLAogCQkJCQkJICAgICBPU0RfVEVYVF9NQVgpOwogCQkJCXNvbG9fZW5jLT5vc2RfdGV4dFtPU0RfVEVYVF9NQVhdID0gJ1wwJzsKQEAgLTE0NTksNyArMTYwMSw3IEBACiAJLm1pbm9yCQkJPSAtMSwKIAkucmVsZWFzZQkJPSB2aWRlb19kZXZpY2VfcmVsZWFzZSwKIAotCS50dm5vcm1zCQk9IFY0TDJfU1REX05UU0NfTSB8IFY0TDJfU1REX1BBTF9NLAorCS50dm5vcm1zCQk9IFY0TDJfU1REX05UU0NfTSB8IFY0TDJfU1REX1BBTF9CLAogCS5jdXJyZW50X25vcm0JCT0gVjRMMl9TVERfTlRTQ19NLAogfTsKIApAQCAtMTUwNSw3ICsxNjQ3LDcgQEAKIAlhdG9taWNfc2V0KCZzb2xvX2VuYy0+cmVhZGVycywgMCk7CiAKIAlzb2xvX2VuYy0+cXAgPSBTT0xPX0RFRkFVTFRfUVA7Ci0gICAgICAgIHNvbG9fZW5jLT5nb3AgPSBzb2xvX2Rldi0+ZnBzOworCXNvbG9fZW5jLT5nb3AgPSBzb2xvX2Rldi0+ZnBzOwogCXNvbG9fZW5jLT5pbnRlcnZhbCA9IDE7CiAJc29sb19lbmMtPm1vZGUgPSBTT0xPX0VOQ19NT0RFX0NJRjsKIAlzb2xvX2VuYy0+bW90aW9uX3RocmVzaCA9IFNPTE9fREVGX01PVF9USFJFU0g7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtdjRsMi5jIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLXY0bDIuYwppbmRleCA2ZmZkMjFkLi5hODQ5MWRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtdjRsMi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC12NGwyLmMKQEAgLTI0LDE0ICsyNCwxMyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYtZG1hLWNvbnRpZy5oPgorI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmLWRtYS1zZy5oPgogCiAjaW5jbHVkZSAic29sbzYwMTAuaCIKICNpbmNsdWRlICJzb2xvNjAxMC10dzI4LmgiCiAKICNkZWZpbmUgU09MT19IV19CUEwJCTIwNDgKICNkZWZpbmUgU09MT19ESVNQX1BJWF9GSUVMRAlWNEwyX0ZJRUxEX0lOVEVSTEFDRUQKLSNkZWZpbmUgU09MT19ESVNQX0JVRl9TSVpFCSg2NCAqIDEwMjQpIC8vIDY0awogCiAvKiBJbWFnZSBzaXplIGlzIHR3byBmaWVsZHMsIFNPTE9fSFdfQlBMIGlzIG9uZSBob3Jpem9udGFsIGxpbmUgKi8KICNkZWZpbmUgc29sb192bGluZXMoX19zb2xvKQkoX19zb2xvLT52aWRlb192c2l6ZSAqIDIpCkBAIC00OSw2ICs0OCw4IEBACiAJc3BpbmxvY2tfdAkJc2xvY2s7CiAJaW50CQkJb2xkX3dyaXRlOwogCXN0cnVjdCBsaXN0X2hlYWQJdmlkcV9hY3RpdmU7CisJc3RydWN0IHAybV9kZXNjCQlkZXNjW1NPTE9fTlJfUDJNX0RFU0NdOworCWludAkJCWRlc2NfaWR4OwogfTsKIAogdW5zaWduZWQgdmlkZW9fbnIgPSAtMTsKQEAgLTk2LDcgKzk3LDcgQEAKIAkJICAgICAgIFNPTE9fVklfV0lOX0VYKGV4KSB8CiAJCSAgICAgICBTT0xPX1ZJX1dJTl9TQ0FMRShzY2FsZSkpOwogCi0gICAgICAgIHNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1ZJX1dJTl9DVFJMMShjaCksCisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVklfV0lOX0NUUkwxKGNoKSwKIAkJICAgICAgIFNPTE9fVklfV0lOX1NZKHN5KSB8CiAJCSAgICAgICBTT0xPX1ZJX1dJTl9FWShleSkpOwogfQpAQCAtMjAzLDUwICsyMDQsMTQ5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGRpc3BfcmVzZXRfZGVzYyhzdHJ1Y3Qgc29sb19maWxlaGFuZGxlICpmaCkKK3sKKwkvKiBXZSB1c2UgZGVzYyBtb2RlLCB3aGljaCBpZ25vcmVzIGRlc2MgMCAqLworCW1lbXNldChmaC0+ZGVzYywgMCwgc2l6ZW9mKCpmaC0+ZGVzYykpOworCWZoLT5kZXNjX2lkeCA9IDE7Cit9CisKK3N0YXRpYyBpbnQgZGlzcF9mbHVzaF9kZXNjcyhzdHJ1Y3Qgc29sb19maWxlaGFuZGxlICpmaCkKK3sKKwlpbnQgcmV0OworCisJaWYgKCFmaC0+ZGVzY19pZHgpCisJCXJldHVybiAwOworCisJcmV0ID0gc29sb19wMm1fZG1hX2Rlc2MoZmgtPnNvbG9fZGV2LCBTT0xPX1AyTV9ETUFfSURfRElTUCwKKwkJCQlmaC0+ZGVzYywgZmgtPmRlc2NfaWR4KTsKKwlkaXNwX3Jlc2V0X2Rlc2MoZmgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkaXNwX3B1c2hfZGVzYyhzdHJ1Y3Qgc29sb19maWxlaGFuZGxlICpmaCwgZG1hX2FkZHJfdCBkbWFfYWRkciwKKwkJICAgICAgdTMyIGV4dF9hZGRyLCBpbnQgc2l6ZSwgaW50IHJlcGVhdCwgaW50IGV4dF9zaXplKQoreworCWlmIChmaC0+ZGVzY19pZHggPj0gU09MT19OUl9QMk1fREVTQykgeworCQlpbnQgcmV0ID0gZGlzcF9mbHVzaF9kZXNjcyhmaCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXNvbG9fcDJtX3B1c2hfZGVzYygmZmgtPmRlc2NbZmgtPmRlc2NfaWR4XSwgMCwgZG1hX2FkZHIsIGV4dF9hZGRyLAorCQkJICAgc2l6ZSwgcmVwZWF0LCBleHRfc2l6ZSk7CisJZmgtPmRlc2NfaWR4Kys7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHZvaWQgc29sb19maWxsYnVmKHN0cnVjdCBzb2xvX2ZpbGVoYW5kbGUgKmZoLAogCQkJIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiKQogewogCXN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2ID0gZmgtPnNvbG9fZGV2OwotCWRtYV9hZGRyX3QgdmJ1ZjsKKwlzdHJ1Y3QgdmlkZW9idWZfZG1hYnVmICp2YnVmOwogCXVuc2lnbmVkIGludCBmZG1hX2FkZHI7Ci0JaW50IGZyYW1lX3NpemU7CiAJaW50IGVycm9yID0gMTsKIAlpbnQgaTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCWRtYV9hZGRyX3Qgc2dfZG1hOworCWludCBzZ19zaXplX2xlZnQ7CiAKLQlpZiAoISh2YnVmID0gdmlkZW9idWZfdG9fZG1hX2NvbnRpZyh2YikpKQorCXZidWYgPSB2aWRlb2J1Zl90b19kbWEodmIpOworCWlmICghdmJ1ZikKIAkJZ290byBmaW5pc2hfYnVmOwogCiAJaWYgKGVyYXNlX29mZihzb2xvX2RldikpIHsKLQkJdm9pZCAqcCA9IHZpZGVvYnVmX3F1ZXVlX3RvX3ZhZGRyKCZmaC0+dmlkcSwgdmIpOwotCQlpbnQgaW1hZ2Vfc2l6ZSA9IHNvbG9faW1hZ2Vfc2l6ZShzb2xvX2Rldik7Ci0JCWZvciAoaSA9IDA7IGkgPCBpbWFnZV9zaXplOyBpICs9IDIpIHsKLQkJCSgodTggKilwKVtpXSA9IDB4ODA7Ci0JCQkoKHU4ICopcClbaSArIDFdID0gMHgwMDsKKwkJaW50IGk7CisKKwkJLyogSnVzdCBibGl0IHRvIHRoZSBlbnRpcmUgc2cgbGlzdCwgaWdub3Jpbmcgc2l6ZSAqLworCQlmb3JfZWFjaF9zZyh2YnVmLT5zZ2xpc3QsIHNnLCB2YnVmLT5zZ2xlbiwgaSkgeworCQkJdm9pZCAqcCA9IHNnX3ZpcnQoc2cpOworCQkJc2l6ZV90IGxlbiA9IHNnX2RtYV9sZW4oc2cpOworCisJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDIpIHsKKwkJCQkoKHU4ICopcClbaV0gPSAweDgwOworCQkJCSgodTggKilwKVtpICsgMV0gPSAweDAwOworCQkJfQogCQl9CisKIAkJZXJyb3IgPSAwOwogCQlnb3RvIGZpbmlzaF9idWY7CiAJfQogCi0JZnJhbWVfc2l6ZSA9IFNPTE9fSFdfQlBMICogc29sb192bGluZXMoc29sb19kZXYpOwotCWZkbWFfYWRkciA9IFNPTE9fRElTUF9FWFRfQUREUihzb2xvX2RldikgKyAoZmgtPm9sZF93cml0ZSAqIGZyYW1lX3NpemUpOworCWRpc3BfcmVzZXRfZGVzYyhmaCk7CisJc2cgPSB2YnVmLT5zZ2xpc3Q7CisJc2dfZG1hID0gc2dfZG1hX2FkZHJlc3Moc2cpOworCXNnX3NpemVfbGVmdCA9IHNnX2RtYV9sZW4oc2cpOwogCi0JZm9yIChpID0gMDsgaSA8IGZyYW1lX3NpemUgLyBTT0xPX0RJU1BfQlVGX1NJWkU7IGkrKykgewotCQlpbnQgajsKLQkJZm9yIChqID0gMDsgaiA8IChTT0xPX0RJU1BfQlVGX1NJWkUgLyBTT0xPX0hXX0JQTCk7IGorKykgewotCQkJaWYgKHNvbG9fcDJtX2RtYV90KHNvbG9fZGV2LCBTT0xPX1AyTV9ETUFfSURfRElTUCwgMCwKLQkJCQkJICAgdmJ1ZiwgZmRtYV9hZGRyICsgKGogKiBTT0xPX0hXX0JQTCksCi0JCQkJCSAgIHNvbG9fYnl0ZXNwZXJsaW5lKHNvbG9fZGV2KSkpCisJZmRtYV9hZGRyID0gU09MT19ESVNQX0VYVF9BRERSKHNvbG9fZGV2KSArIChmaC0+b2xkX3dyaXRlICoKKwkJCShTT0xPX0hXX0JQTCAqIHNvbG9fdmxpbmVzKHNvbG9fZGV2KSkpOworCisJZm9yIChpID0gMDsgaSA8IHNvbG9fdmxpbmVzKHNvbG9fZGV2KTsgaSsrKSB7CisJCWludCBsaW5lX2xlbiA9IHNvbG9fYnl0ZXNwZXJsaW5lKHNvbG9fZGV2KTsKKwkJaW50IGxpbmVzOworCisJCWlmICghc2dfc2l6ZV9sZWZ0KSB7CisJCQlzZyA9IHNnX25leHQoc2cpOworCQkJaWYgKHNnID09IE5VTEwpCiAJCQkJZ290byBmaW5pc2hfYnVmOwotCQkJdmJ1ZiArPSBzb2xvX2J5dGVzcGVybGluZShzb2xvX2Rldik7CisJCQlzZ19kbWEgPSBzZ19kbWFfYWRkcmVzcyhzZyk7CisJCQlzZ19zaXplX2xlZnQgPSBzZ19kbWFfbGVuKHNnKTsKIAkJfQotCQlmZG1hX2FkZHIgKz0gU09MT19ESVNQX0JVRl9TSVpFOworCisJCS8qIE5vIHJvb20gZm9yIGFuIGVudGlyZSBsaW5lLCBzbyBjaHVuayBpdCB1cCAqLworCQlpZiAoc2dfc2l6ZV9sZWZ0IDwgbGluZV9sZW4pIHsKKwkJCWludCB0aGlzX2FkZHIgPSBmZG1hX2FkZHI7CisKKwkJCXdoaWxlIChsaW5lX2xlbiA+IDApIHsKKwkJCQlpbnQgdGhpc193cml0ZTsKKworCQkJCWlmICghc2dfc2l6ZV9sZWZ0KSB7CisJCQkJCXNnID0gc2dfbmV4dChzZyk7CisJCQkJCWlmIChzZyA9PSBOVUxMKQorCQkJCQkJZ290byBmaW5pc2hfYnVmOworCQkJCQlzZ19kbWEgPSBzZ19kbWFfYWRkcmVzcyhzZyk7CisJCQkJCXNnX3NpemVfbGVmdCA9IHNnX2RtYV9sZW4oc2cpOworCQkJCX0KKworCQkJCXRoaXNfd3JpdGUgPSBtaW4oc2dfc2l6ZV9sZWZ0LCBsaW5lX2xlbik7CisKKwkJCQlpZiAoZGlzcF9wdXNoX2Rlc2MoZmgsIHNnX2RtYSwgdGhpc19hZGRyLAorCQkJCQkJICAgdGhpc193cml0ZSwgMCwgMCkpCisJCQkJCWdvdG8gZmluaXNoX2J1ZjsKKworCQkJCWxpbmVfbGVuIC09IHRoaXNfd3JpdGU7CisJCQkJc2dfc2l6ZV9sZWZ0IC09IHRoaXNfd3JpdGU7CisJCQkJc2dfZG1hICs9IHRoaXNfd3JpdGU7CisJCQkJdGhpc19hZGRyICs9IHRoaXNfd3JpdGU7CisJCQl9CisKKwkJCWZkbWFfYWRkciArPSBTT0xPX0hXX0JQTDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogU2hvdmUgYXMgbWFueSBsaW5lcyBpbnRvIGEgcmVwZWF0aW5nIGRlc2NyaXB0b3IgYXMgcG9zc2libGUgKi8KKwkJbGluZXMgPSBtaW4oc2dfc2l6ZV9sZWZ0IC8gbGluZV9sZW4sCisJCQkgICAgc29sb192bGluZXMoc29sb19kZXYpIC0gaSk7CisKKwkJaWYgKGRpc3BfcHVzaF9kZXNjKGZoLCBzZ19kbWEsIGZkbWFfYWRkciwgbGluZV9sZW4sCisJCQkJICAgbGluZXMgLSAxLCBTT0xPX0hXX0JQTCkpCisJCQlnb3RvIGZpbmlzaF9idWY7CisKKwkJaSArPSBsaW5lcyAtIDE7CisJCWZkbWFfYWRkciArPSBTT0xPX0hXX0JQTCAqIGxpbmVzOworCQlzZ19kbWEgKz0gbGluZXMgKiBsaW5lX2xlbjsKKwkJc2dfc2l6ZV9sZWZ0IC09IGxpbmVzICogbGluZV9sZW47CiAJfQotCWVycm9yID0gMDsKKworCWVycm9yID0gZGlzcF9mbHVzaF9kZXNjcyhmaCk7CiAKIGZpbmlzaF9idWY6CiAJaWYgKGVycm9yKSB7CiAJCXZiLT5zdGF0ZSA9IFZJREVPQlVGX0VSUk9SOwogCX0gZWxzZSB7CisJCXZiLT5zaXplID0gc29sb192bGluZXMoc29sb19kZXYpICogc29sb19ieXRlc3BlcmxpbmUoc29sb19kZXYpOwogCQl2Yi0+c3RhdGUgPSBWSURFT0JVRl9ET05FOwogCQl2Yi0+ZmllbGRfY291bnQrKzsKIAkJZG9fZ2V0dGltZW9mZGF5KCZ2Yi0+dHMpOwpAQCAtMjc1LDcgKzM3NSw3IEBACiAJCQlicmVhazsKIAogCQljdXJfd3JpdGUgPSBTT0xPX1ZJX1NUQVRVUzBfUEFHRShzb2xvX3JlZ19yZWFkKGZoLT5zb2xvX2RldiwKLQkJCQkJCQlTT0xPX1ZJX1NUQVRVUzApKTsKKwkJCQkJCSBTT0xPX1ZJX1NUQVRVUzApKTsKIAkJaWYgKGN1cl93cml0ZSA9PSBmaC0+b2xkX3dyaXRlKQogCQkJYnJlYWs7CiAKQEAgLTMxMCw3ICs0MTAsNyBAQAogCiAJcmVtb3ZlX3dhaXRfcXVldWUoJnNvbG9fZGV2LT5kaXNwX3RocmVhZF93YWl0LCAmd2FpdCk7CiAKLSAgICAgICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgc29sb19zdGFydF90aHJlYWQoc3RydWN0IHNvbG9fZmlsZWhhbmRsZSAqZmgpCkBAIC0zMzcsMTIgKzQzNywxMiBAQAogCXN0cnVjdCBzb2xvX2ZpbGVoYW5kbGUgKmZoID0gdnEtPnByaXZfZGF0YTsKIAlzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiAgPSBmaC0+c29sb19kZXY7CiAKLSAgICAgICAgKnNpemUgPSBzb2xvX2ltYWdlX3NpemUoc29sb19kZXYpOworCSpzaXplID0gc29sb19pbWFnZV9zaXplKHNvbG9fZGV2KTsKIAotICAgICAgICBpZiAoKmNvdW50IDwgTUlOX1ZJRF9CVUZGRVJTKQorCWlmICgqY291bnQgPCBNSU5fVklEX0JVRkZFUlMpCiAJCSpjb3VudCA9IE1JTl9WSURfQlVGRkVSUzsKIAotICAgICAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBzb2xvX2J1Zl9wcmVwYXJlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqdnEsCkBAIC0zNjQsNyArNDY0LDkgQEAKIAlpZiAodmItPnN0YXRlID09IFZJREVPQlVGX05FRURTX0lOSVQpIHsKIAkJaW50IHJjID0gdmlkZW9idWZfaW9sb2NrKHZxLCB2YiwgTlVMTCk7CiAJCWlmIChyYyA8IDApIHsKLQkJCXZpZGVvYnVmX2RtYV9jb250aWdfZnJlZSh2cSwgdmIpOworCQkJc3RydWN0IHZpZGVvYnVmX2RtYWJ1ZiAqZG1hID0gdmlkZW9idWZfdG9fZG1hKHZiKTsKKwkJCXZpZGVvYnVmX2RtYV91bm1hcCh2cS0+ZGV2LCBkbWEpOworCQkJdmlkZW9idWZfZG1hX2ZyZWUoZG1hKTsKIAkJCXZiLT5zdGF0ZSA9IFZJREVPQlVGX05FRURTX0lOSVQ7CiAJCQlyZXR1cm4gcmM7CiAJCX0KQEAgLTM4OCw3ICs0OTAsMTAgQEAKIHN0YXRpYyB2b2lkIHNvbG9fYnVmX3JlbGVhc2Uoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICp2cSwKIAkJCSAgICAgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIpCiB7Ci0JdmlkZW9idWZfZG1hX2NvbnRpZ19mcmVlKHZxLCB2Yik7CisJc3RydWN0IHZpZGVvYnVmX2RtYWJ1ZiAqZG1hID0gdmlkZW9idWZfdG9fZG1hKHZiKTsKKworCXZpZGVvYnVmX2RtYV91bm1hcCh2cS0+ZGV2LCBkbWEpOworCXZpZGVvYnVmX2RtYV9mcmVlKGRtYSk7CiAJdmItPnN0YXRlID0gVklERU9CVUZfTkVFRFNfSU5JVDsKIH0KIApAQCAtNDA0LDcgKzUwOSw3IEBACiB7CiAJc3RydWN0IHNvbG9fZmlsZWhhbmRsZSAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAKLSAgICAgICAgcmV0dXJuIHZpZGVvYnVmX3BvbGxfc3RyZWFtKGZpbGUsICZmaC0+dmlkcSwgd2FpdCk7CisJcmV0dXJuIHZpZGVvYnVmX3BvbGxfc3RyZWFtKGZpbGUsICZmaC0+dmlkcSwgd2FpdCk7CiB9CiAKIHN0YXRpYyBpbnQgc29sb192NGwyX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQpAQCAtNDIwLDcgKzUyNSw4IEBACiAJc3RydWN0IHNvbG9fZmlsZWhhbmRsZSAqZmg7CiAJaW50IHJldDsKIAotCWlmICgoZmggPSBremFsbG9jKHNpemVvZigqZmgpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwlmaCA9IGt6YWxsb2Moc2l6ZW9mKCpmaCksIEdGUF9LRVJORUwpOworCWlmIChmaCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCXNwaW5fbG9ja19pbml0KCZmaC0+c2xvY2spOwpAQCAtNDI4LDE2ICs1MzQsMTcgQEAKIAlmaC0+c29sb19kZXYgPSBzb2xvX2RldjsKIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBmaDsKIAotCWlmICgocmV0ID0gc29sb19zdGFydF90aHJlYWQoZmgpKSkgeworCXJldCA9IHNvbG9fc3RhcnRfdGhyZWFkKGZoKTsKKwlpZiAocmV0KSB7CiAJCWtmcmVlKGZoKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQl2aWRlb2J1Zl9xdWV1ZV9kbWFfY29udGlnX2luaXQoJmZoLT52aWRxLCAmc29sb192aWRlb19xb3BzLAotCQkJCSAgICAmc29sb19kZXYtPnBkZXYtPmRldiwgJmZoLT5zbG9jaywKLQkJCQkgICAgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLAotCQkJCSAgICBTT0xPX0RJU1BfUElYX0ZJRUxELAotCQkJCSAgICBzaXplb2Yoc3RydWN0IHZpZGVvYnVmX2J1ZmZlciksIGZoLCBOVUxMKTsKKwl2aWRlb2J1Zl9xdWV1ZV9zZ19pbml0KCZmaC0+dmlkcSwgJnNvbG9fdmlkZW9fcW9wcywKKwkJCSAgICAgICAmc29sb19kZXYtPnBkZXYtPmRldiwgJmZoLT5zbG9jaywKKwkJCSAgICAgICBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUsCisJCQkgICAgICAgU09MT19ESVNQX1BJWF9GSUVMRCwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IHZpZGVvYnVmX2J1ZmZlciksIGZoLCBOVUxMKTsKIAogCXJldHVybiAwOwogfQpAQCAtNTMwLDcgKzYzNyw3IEBACiAJaWYgKHNvbG9fZGV2LT52aWRlb190eXBlID09IFNPTE9fVk9fRk1UX1RZUEVfTlRTQykKIAkJaW5wdXQtPnN0ZCA9IFY0TDJfU1REX05UU0NfTTsKIAllbHNlCi0JCWlucHV0LT5zdGQgPSBWNEwyX1NURF9QQUxfTTsKKwkJaW5wdXQtPnN0ZCA9IFY0TDJfU1REX1BBTF9COwogCiAJcmV0dXJuIDA7CiB9CkBAIC02MjIsNyArNzI5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzb2xvX3JlcWJ1ZnMoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIAorc3RhdGljIGludCBzb2xvX3JlcWJ1ZnMoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQlzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyAqcmVxKQogewogCXN0cnVjdCBzb2xvX2ZpbGVoYW5kbGUgKmZoID0gcHJpdjsKQEAgLTc4MSwxMSArODg4LDExIEBACiAJLnZpZGlvY19xYnVmCQkJPSBzb2xvX3FidWYsCiAJLnZpZGlvY19kcWJ1ZgkJCT0gc29sb19kcWJ1ZiwKIAkudmlkaW9jX3N0cmVhbW9uCQk9IHNvbG9fc3RyZWFtb24sCi0gICAgICAgIC52aWRpb2Nfc3RyZWFtb2ZmCQk9IHNvbG9fc3RyZWFtb2ZmLAorCS52aWRpb2Nfc3RyZWFtb2ZmCQk9IHNvbG9fc3RyZWFtb2ZmLAogCS8qIENvbnRyb2xzICovCiAJLnZpZGlvY19xdWVyeWN0cmwJCT0gc29sb19kaXNwX3F1ZXJ5Y3RybCwKLSAgICAgICAgLnZpZGlvY19nX2N0cmwJCQk9IHNvbG9fZGlzcF9nX2N0cmwsCi0gICAgICAgIC52aWRpb2Nfc19jdHJsCQkJPSBzb2xvX2Rpc3Bfc19jdHJsLAorCS52aWRpb2NfZ19jdHJsCQkJPSBzb2xvX2Rpc3BfZ19jdHJsLAorCS52aWRpb2Nfc19jdHJsCQkJPSBzb2xvX2Rpc3Bfc19jdHJsLAogfTsKIAogc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2Ugc29sb192NGwyX3RlbXBsYXRlID0gewpAQCAtNzk1LDcgKzkwMiw3IEBACiAJLm1pbm9yCQkJPSAtMSwKIAkucmVsZWFzZQkJPSB2aWRlb19kZXZpY2VfcmVsZWFzZSwKIAotCS50dm5vcm1zCQk9IFY0TDJfU1REX05UU0NfTSB8IFY0TDJfU1REX1BBTF9NLAorCS50dm5vcm1zCQk9IFY0TDJfU1REX05UU0NfTSB8IFY0TDJfU1REX1BBTF9CLAogCS5jdXJyZW50X25vcm0JCT0gVjRMMl9TVERfTlRTQ19NLAogfTsKIApAQCAtODM2LDEzICs5NDMsMTMgQEAKIAlmb3IgKGkgPSAwOyBpIDwgc29sb19kZXYtPm5yX2NoYW5zOyBpKyspIHsKIAkJc29sb192NGwyX3NldF9jaChzb2xvX2RldiwgaSk7CiAJCXdoaWxlIChlcmFzZV9vZmYoc29sb19kZXYpKQotCQkJOy8vIERvIG5vdGhpbmcKKwkJCTsvKiBEbyBub3RoaW5nICovCiAJfQogCiAJLyogU2V0IHRoZSBkZWZhdWx0IGRpc3BsYXkgY2hhbm5lbCAqLwogCXNvbG9fdjRsMl9zZXRfY2goc29sb19kZXYsIDApOwogCXdoaWxlIChlcmFzZV9vZmYoc29sb19kZXYpKQotCQk7Ly8gRG8gbm90aGluZworCQk7LyogRG8gbm90aGluZyAqLwogCiAJc29sbzYwMTBfaXJxX29uKHNvbG9fZGV2LCBTT0xPX0lSUV9WSURFT19JTik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC5oIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLmgKaW5kZXggZGNhOGUzZS4uOWM5MzBmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLmgKQEAgLTI2LDggKzI2LDggQEAKICNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KIApAQCAtNDgsMTAgKzQ4LDE0IEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTkVVU09MT180CQkweDQzMDQKICNkZWZpbmUgUENJX0RFVklDRV9JRF9ORVVTT0xPXzkJCTB4NDMwOQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX05FVVNPTE9fMTYJMHg0MzEwCi0vKiBDb21tZWxsIFNvZnRsb2dpYyA2MDEwIGJhc2VkIGNhcmRzICovCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ09NTVNPTE9fNAkweDRFMDQKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9DT01NU09MT185CTB4NEUwOQotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NPTU1TT0xPXzE2CTB4NEUxMAorLyogQmx1ZWNoZXJyeSBTb2Z0bG9naWMgNjAxMCBiYXNlZCBjYXJkcyAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0JDX1NPTE9fNAkJMHg0RTA0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQkNfU09MT185CQkweDRFMDkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9CQ19TT0xPXzE2CTB4NEUxMAorLyogQmx1ZWNoZXJyeSBTb2Z0bG9naWMgNjExMCBiYXNlZCBjYXJkcyAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0JDXzYxMTBfNAkJMHg1MzA0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQkNfNjExMF84CQkweDUzMDgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9CQ182MTEwXzE2CTB4NTMxMAogI2VuZGlmIC8qIEJsdWVjaGVycnkgKi8KIAogI2RlZmluZSBTT0xPNjAxMF9OQU1FCQkJInNvbG82MDEwIgpAQCAtNjQsNyArNjgsNyBAQAogI2RlZmluZSBTT0xPNjAxMF9WRVJfTUlOT1IJCTAKICNkZWZpbmUgU09MTzYwMTBfVkVSX1NVQgkJMAogI2RlZmluZSBTT0xPNjAxMF9WRVJfTlVNIFwKLSAgICBLRVJORUxfVkVSU0lPTihTT0xPNjAxMF9WRVJfTUFKT1IsIFNPTE82MDEwX1ZFUl9NSU5PUiwgU09MTzYwMTBfVkVSX1NVQikKKwlLRVJORUxfVkVSU0lPTihTT0xPNjAxMF9WRVJfTUFKT1IsIFNPTE82MDEwX1ZFUl9NSU5PUiwgU09MTzYwMTBfVkVSX1NVQikKIAogLyoKICAqIFRoZSBTT0xPNjAxMCBhY3R1YWxseSBoYXMgOCBpMmMgY2hhbm5lbHMsIGJ1dCB3ZSBvbmx5IHVzZSAyLgpAQCAtNzgsNyArODIsNiBAQAogLyogRE1BIEVuZ2luZSBzZXR1cCAqLwogI2RlZmluZSBTT0xPX05SX1AyTQkJCTQKICNkZWZpbmUgU09MT19OUl9QMk1fREVTQwkJMjU2Ci0jZGVmaW5lIFNPTE9fUDJNX0RFU0NfU0laRQkJKFNPTE9fTlJfUDJNX0RFU0MgKiAxNikKIC8qIE1QRUcgYW5kIEpQRUcgc2hhcmUgdGhlIHNhbWUgaW50ZXJydXB0IGFuZCBsb2NrcyBzbyB0aGV5IG11c3QgYmUgdG9nZXRoZXIKICAqIGluIHRoZSBzYW1lIGRtYSBjaGFubmVsLiAqLwogI2RlZmluZSBTT0xPX1AyTV9ETUFfSURfTVA0RQkJMApAQCAtMTIzLDExICsxMjYsMTcgQEAKIAlJSUNfU1RBVEVfU1RPUAogfTsKIAorc3RydWN0IHAybV9kZXNjIHsKKwl1MzIgY3RybDsKKwl1MzIgZXh0OworCXUzMiB0YTsKKwl1MzIgZmE7Cit9OworCiBzdHJ1Y3Qgc29sb19wMm1fZGV2IHsKLQlzdHJ1Y3Qgc2VtYXBob3JlCXNlbTsKKwlzdHJ1Y3QgbXV0ZXgJCW11dGV4OwogCXN0cnVjdCBjb21wbGV0aW9uCWNvbXBsZXRpb247CiAJaW50CQkJZXJyb3I7Ci0JdTgJCQlkZXNjW1NPTE9fUDJNX0RFU0NfU0laRV07CiB9OwogCiAjZGVmaW5lIE9TRF9URVhUX01BWAkJMzAKQEAgLTE4NSw3ICsxOTQsNyBAQAogCS8qIGkyYyByZWxhdGVkIGl0ZW1zICovCiAJc3RydWN0IGkyY19hZGFwdGVyCWkyY19hZGFwW1NPTE9fSTJDX0FEQVBURVJTXTsKIAllbnVtIFNPTE9fSTJDX1NUQVRFCWkyY19zdGF0ZTsKLQlzdHJ1Y3Qgc2VtYXBob3JlCWkyY19zZW07CisJc3RydWN0IG11dGV4CQlpMmNfbXV0ZXg7CiAJaW50CQkJaTJjX2lkOwogCXdhaXRfcXVldWVfaGVhZF90CWkyY193YWl0OwogCXN0cnVjdCBpMmNfbXNnCQkqaTJjX21zZzsKQEAgLTIxMiw3ICsyMjEsNyBAQAogCXN0cnVjdCBzb2xvX2VuY19idWYJZW5jX2J1ZltTT0xPX05SX1JJTkdfQlVGU107CiAKIAkvKiBDdXJyZW50IHZpZGVvIHNldHRpbmdzICovCi0JdTMyIAkJCXZpZGVvX3R5cGU7CisJdTMyCQkJdmlkZW9fdHlwZTsKIAl1MTYJCQl2aWRlb19oc2l6ZSwgdmlkZW9fdnNpemU7CiAJdTE2CQkJdm91dF9oc3RhcnQsIHZvdXRfdnN0YXJ0OwogCXUxNgkJCXZpbl9oc3RhcnQsIHZpbl92c3RhcnQ7CkBAIC0zMDYsNiArMzE1LDE0IEBACiAJCSAgIGRtYV9hZGRyX3QgZG1hX2FkZHIsIHUzMiBleHRfYWRkciwgdTMyIHNpemUpOwogaW50IHNvbG9fcDJtX2RtYShzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwgdTggaWQsIGludCB3ciwKIAkJIHZvaWQgKnN5c19hZGRyLCB1MzIgZXh0X2FkZHIsIHUzMiBzaXplKTsKK2ludCBzb2xvX3AybV9kbWFfc2coc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYsIHU4IGlkLAorCQkgICAgc3RydWN0IHAybV9kZXNjICpwZGVzYywgaW50IHdyLAorCQkgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsIHUzMiBzZ19vZmYsCisJCSAgICB1MzIgZXh0X2FkZHIsIHUzMiBzaXplKTsKK3ZvaWQgc29sb19wMm1fcHVzaF9kZXNjKHN0cnVjdCBwMm1fZGVzYyAqZGVzYywgaW50IHdyLCBkbWFfYWRkcl90IGRtYV9hZGRyLAorCQkJdTMyIGV4dF9hZGRyLCB1MzIgc2l6ZSwgaW50IHJlcGVhdCwgdTMyIGV4dF9zaXplKTsKK2ludCBzb2xvX3AybV9kbWFfZGVzYyhzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwgdTggaWQsCisJCSAgICAgIHN0cnVjdCBwMm1fZGVzYyAqZGVzYywgaW50IGRlc2NfY291bnQpOwogCiAvKiBTZXQgdGhlIHRocmVzaG9sZCBmb3IgbW90aW9uIGRldGVjdGlvbiAqLwogdm9pZCBzb2xvX3NldF9tb3Rpb25fdGhyZXNob2xkKHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2LCB1OCBjaCwgdTE2IHZhbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9rb2JqZWN0cy5jIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAva29iamVjdHMuYwppbmRleCBjYzc5ZjllLi40MDhiYjliIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9rb2JqZWN0cy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL2tvYmplY3RzLmMKQEAgLTk4NCw4ICs5ODQsMTAgQEAKIAkgKiBub3Qga25vd24gYWhlYWQgb2YgdGltZS4KIAkgKi8KIAlhY2Nlc3NpYmlsaXR5X2tvYmogPSBrb2JqZWN0X2NyZWF0ZV9hbmRfYWRkKCJhY2Nlc3NpYmlsaXR5IiwgTlVMTCk7Ci0JaWYgKCFhY2Nlc3NpYmlsaXR5X2tvYmopCi0JCXJldHVybiAtRU5PTUVNOworCWlmICghYWNjZXNzaWJpbGl0eV9rb2JqKSB7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KIAogCXNwZWFrdXBfa29iaiA9IGtvYmplY3RfY3JlYXRlX2FuZF9hZGQoInNwZWFrdXAiLCBhY2Nlc3NpYmlsaXR5X2tvYmopOwogCWlmICghc3BlYWt1cF9rb2JqKSB7CkBAIC0xMDAyLDcgKzEwMDQsNyBAQAogCWlmIChyZXR2YWwpCiAJCWdvdG8gZXJyX2dyb3VwOwogCi0JcmV0dXJuIDA7CisJZ290byBvdXQ7CiAKIGVycl9ncm91cDoKIAlzeXNmc19yZW1vdmVfZ3JvdXAoc3BlYWt1cF9rb2JqLCAmbWFpbl9hdHRyX2dyb3VwKTsKQEAgLTEwMTAsNiArMTAxMiw3IEBACiAJa29iamVjdF9wdXQoc3BlYWt1cF9rb2JqKTsKIGVycl9hY2M6CiAJa29iamVjdF9wdXQoYWNjZXNzaWJpbGl0eV9rb2JqKTsKK291dDoKIAlyZXR1cm4gcmV0dmFsOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9tYWluLmMgYi9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9tYWluLmMKaW5kZXggNGI3YTljMi4uM2NkMDAzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvbWFpbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL21haW4uYwpAQCAtMjI1MywxNyArMjI1MywxNyBAQAogCiAJZXJyID0gc3BlYWt1cF9hZGRfdmlydHVhbF9rZXlib2FyZCgpOwogCWlmIChlcnIpCi0JCXJldHVybiBlcnI7CisJCWdvdG8gb3V0OwogCiAJaW5pdGlhbGl6ZV9tc2dzKCk7CS8qIEluaXRpYWxpemUgYXJyYXlzIGZvciBpMThuLiAqLwogCWZpcnN0X2NvbnNvbGUgPSBremFsbG9jKHNpemVvZigqZmlyc3RfY29uc29sZSksIEdGUF9LRVJORUwpOwotCWlmICghZmlyc3RfY29uc29sZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JZXJyID0gc3BlYWt1cF9rb2JqX2luaXQoKTsKLQlpZiAoZXJyKSB7Ci0JCWtmcmVlKGZpcnN0X2NvbnNvbGUpOwotCQlyZXR1cm4gZXJyOworCWlmICghZmlyc3RfY29uc29sZSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9jb25zOwogCX0KKwllcnIgPSBzcGVha3VwX2tvYmpfaW5pdCgpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX2tvYmplY3Q7CiAKIAlyZXNldF9kZWZhdWx0X2NoYXJzKCk7CiAJcmVzZXRfZGVmYXVsdF9jaGFydGFiKCk7CkBAIC0yMjk5LDExICsyMjk5LDIwIEBACiAKIAlzcGVha3VwX3Rhc2sgPSBrdGhyZWFkX2NyZWF0ZShzcGVha3VwX3RocmVhZCwgTlVMTCwgInNwZWFrdXAiKTsKIAlzZXRfdXNlcl9uaWNlKHNwZWFrdXBfdGFzaywgMTApOwotCWlmICghSVNfRVJSKHNwZWFrdXBfdGFzaykpCi0JCXdha2VfdXBfcHJvY2VzcyhzcGVha3VwX3Rhc2spOwotCWVsc2UKLQkJcmV0dXJuIC1FTk9NRU07Ci0JcmV0dXJuIDA7CisJaWYgKElTX0VSUihzcGVha3VwX3Rhc2spKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2tvYmplY3Q7CisJfQorCXdha2VfdXBfcHJvY2VzcyhzcGVha3VwX3Rhc2spOworCWdvdG8gb3V0OworCitlcnJfa29iamVjdDoKK3NwZWFrdXBfa29ial9leGl0KCk7CisJa2ZyZWUoZmlyc3RfY29uc29sZSk7CitlcnJfY29uczoKKwlzcGVha3VwX3JlbW92ZV92aXJ0dWFsX2tleWJvYXJkKCk7CitvdXQ6CisJcmV0dXJuIGVycjsKIH0KIAogbW9kdWxlX2luaXQoc3BlYWt1cF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3Nwa190eXBlcy5oIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BrX3R5cGVzLmgKaW5kZXggODQwYmRkYi4uZDM2YzkwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BrX3R5cGVzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BrX3R5cGVzLmgKQEAgLTUyLDcgKzUyLDcgQEAKIAogI2RlZmluZSBDT0xPUl9CVUZGRVJfU0laRSAxNjAKIAotc3RydWN0IHNwa19oaWdobGlnaHRfY29sb3JfdHJhY2t7CitzdHJ1Y3Qgc3BrX2hpZ2hsaWdodF9jb2xvcl90cmFjayB7CiAJLyogQ291bnQgb2YgZWFjaCBiYWNrZ3JvdW5kIGNvbG9yICovCiAJdW5zaWduZWQgaW50IGJnY291bnRbOF07CiAJLyogQnVmZmVyIGZvciBjaGFyYWN0ZXJzIGRyYXduIHdpdGggZWFjaCBiYWNrZ3JvdW5kIGNvbG9yICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9mZnNwb3J0LmMgYi9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9mZnNwb3J0LmMKaW5kZXggNjNhOWQwYS4uMDA3YjI0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NwZWN0cmEvZmZzcG9ydC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2Zmc3BvcnQuYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2FzeW5jLmg+CiAKIC8qKioqIEhlbHBlciBmdW5jdGlvbnMgdXNlZCBmb3IgRGl2LCBSZW1haW5kZXIgb3BlcmF0aW9uIG9uIHU2NCAqKioqLwogCkBAIC03MjksMzQgKzczMCwxNiBAQAogfQogKi8KIAotc3RhdGljIGludCBHTE9CX1NCRF9pbml0KHZvaWQpCitzdGF0aWMgdm9pZCByZWdpc3Rlcl9zcGVjdHJhX2Z0bF9hc3luYyh2b2lkICp1bnVzZWQsIGFzeW5jX2Nvb2tpZV90IGNvb2tpZSkKIHsKIAlpbnQgaTsKIAotCS8qIFNldCBkZWJ1ZyBvdXRwdXQgbGV2ZWwgKDB+MykgaGVyZS4gMyBpcyBtb3N0IHZlcmJvc2UgKi8KLQlwcmludGsoS0VSTl9BTEVSVCAiU3BlY3RyYTogJXNcbiIsIEdMT0JfdmVyc2lvbik7Ci0KLQltdXRleF9pbml0KCZzcGVjdHJhX2xvY2spOwotCi0JR0xPQl9TQkRfbWFqb3JudW0gPSByZWdpc3Rlcl9ibGtkZXYoMCwgR0xPQl9TQkRfTkFNRSk7Ci0JaWYgKEdMT0JfU0JEX21ham9ybnVtIDw9IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gZ2V0IHRoZSBtYWpvciAlZCBmb3IgU3BlY3RyYSIsCi0JCSAgICAgICBHTE9CX1NCRF9tYWpvcm51bSk7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JaWYgKFBBU1MgIT0gR0xPQl9GVExfRmxhc2hfSW5pdCgpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiU3BlY3RyYTogVW5hYmxlIHRvIEluaXRpYWxpemUgRmxhc2ggRGV2aWNlLiAiCi0JCSAgICAgICAiQWJvcnRpbmdcbiIpOwotCQlnb3RvIG91dF9mbGFzaF9yZWdpc3RlcjsKLQl9Ci0KIAkvKiBjcmVhdGVfc3lzZnNfZW50cnkoJmRldi0+ZGV2KTsgKi8KIAogCWlmIChQQVNTICE9IEdMT0JfRlRMX0lkZW50aWZ5RGV2aWNlKCZJZGVudGlmeURldmljZURhdGEpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiU3BlY3RyYTogVW5hYmxlIHRvIFJlYWQgRmxhc2ggRGV2aWNlLiAiCiAJCSAgICAgICAiQWJvcnRpbmdcbiIpOwotCQlnb3RvIG91dF9mbGFzaF9yZWdpc3RlcjsKKwkJcmV0dXJuOwogCX0gZWxzZSB7CiAJCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1dBUk4sICJJbiBHTE9CX1NCRF9pbml0OiAiCiAJCQkgICAgICAgIk51bSBibG9ja3M9JWQsIHBhZ2VzcGVyYmxvY2s9JWQsICIKQEAgLTc3NSwyNCArNzU4LDUwIEBACiAJfQogCXByaW50ayhLRVJOX0FMRVJUICJTcGVjdHJhOiBibG9jayB0YWJsZSBoYXMgYmVlbiBmb3VuZC5cbiIpOwogCisJR0xPQl9TQkRfbWFqb3JudW0gPSByZWdpc3Rlcl9ibGtkZXYoMCwgR0xPQl9TQkRfTkFNRSk7CisJaWYgKEdMT0JfU0JEX21ham9ybnVtIDw9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gZ2V0IHRoZSBtYWpvciAlZCBmb3IgU3BlY3RyYSIsCisJCSAgICAgICBHTE9CX1NCRF9tYWpvcm51bSk7CisJCWdvdG8gb3V0X2Z0bF9mbGFzaF9yZWdpc3RlcjsKKwl9CisKIAlmb3IgKGkgPSAwOyBpIDwgTlVNX0RFVklDRVM7IGkrKykKIAkJaWYgKFNCRF9zZXR1cF9kZXZpY2UoJm5hbmRfZGV2aWNlW2ldLCBpKSA9PSAtRU5PTUVNKQotCQkJZ290byBvdXRfZnRsX2ZsYXNoX3JlZ2lzdGVyOworCQkJZ290byBvdXRfYmxrX3JlZ2lzdGVyOwogCiAJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsCiAJCSAgICAgICAiU3BlY3RyYTogbW9kdWxlIGxvYWRlZCB3aXRoIG1ham9yIG51bWJlciAlZFxuIiwKIAkJICAgICAgIEdMT0JfU0JEX21ham9ybnVtKTsKIAotCXJldHVybiAwOworCXJldHVybjsKIAorb3V0X2Jsa19yZWdpc3RlcjoKKwl1bnJlZ2lzdGVyX2Jsa2RldihHTE9CX1NCRF9tYWpvcm51bSwgR0xPQl9TQkRfTkFNRSk7CiBvdXRfZnRsX2ZsYXNoX3JlZ2lzdGVyOgogCUdMT0JfRlRMX0NhY2hlX1JlbGVhc2UoKTsKLW91dF9mbGFzaF9yZWdpc3RlcjoKLQlHTE9CX0ZUTF9GbGFzaF9SZWxlYXNlKCk7Ci0JdW5yZWdpc3Rlcl9ibGtkZXYoR0xPQl9TQkRfbWFqb3JudW0sIEdMT0JfU0JEX05BTUUpOwogCXByaW50ayhLRVJOX0VSUiAiU3BlY3RyYTogTW9kdWxlIGxvYWQgZmFpbGVkLlxuIik7Cit9CiAKLQlyZXR1cm4gLUVOT01FTTsKK2ludCByZWdpc3Rlcl9zcGVjdHJhX2Z0bCgpCit7CisJYXN5bmNfc2NoZWR1bGUocmVnaXN0ZXJfc3BlY3RyYV9mdGxfYXN5bmMsIE5VTEwpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwocmVnaXN0ZXJfc3BlY3RyYV9mdGwpOworCitzdGF0aWMgaW50IEdMT0JfU0JEX2luaXQodm9pZCkKK3sKKwkvKiBTZXQgZGVidWcgb3V0cHV0IGxldmVsICgwfjMpIGhlcmUuIDMgaXMgbW9zdCB2ZXJib3NlICovCisJcHJpbnRrKEtFUk5fQUxFUlQgIlNwZWN0cmE6ICVzXG4iLCBHTE9CX3ZlcnNpb24pOworCisJbXV0ZXhfaW5pdCgmc3BlY3RyYV9sb2NrKTsKKworCWlmIChQQVNTICE9IEdMT0JfRlRMX0ZsYXNoX0luaXQoKSkgeworCQlwcmludGsoS0VSTl9FUlIgIlNwZWN0cmE6IFVuYWJsZSB0byBJbml0aWFsaXplIEZsYXNoIERldmljZS4gIgorCQkgICAgICAgIkFib3J0aW5nXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgR0xPQl9TQkRfZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NwZWN0cmEvZmZzcG9ydC5oIGIvZHJpdmVycy9zdGFnaW5nL3NwZWN0cmEvZmZzcG9ydC5oCmluZGV4IDZjNWQ5MGMuLjg1YzA3NTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2Zmc3BvcnQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9mZnNwb3J0LmgKQEAgLTgwLDUgKzgwLDYgQEAKIGV4dGVybiBpbnQgR0xPQl9DYWxjX1VzZWRfQml0cyh1MzIgbik7CiBleHRlcm4gdTY0IEdMT0JfdTY0X0Rpdih1NjQgYWRkciwgdTMyIGRpdmlzb3IpOwogZXh0ZXJuIHU2NCBHTE9CX3U2NF9SZW1haW5kZXIodTY0IGFkZHIsIHUzMiBkaXZpc29yX3R5cGUpOworZXh0ZXJuIGludCByZWdpc3Rlcl9zcGVjdHJhX2Z0bCh2b2lkKTsKIAogI2VuZGlmIC8qIF9GRlNQT1JUXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NwZWN0cmEvZmxhc2guYyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2ZsYXNoLmMKaW5kZXggNGU2ZTQ1MS4uZmIzOWM4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NwZWN0cmEvZmxhc2guYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9mbGFzaC5jCkBAIC0xMjU4LDkgKzEyNTgsNyBAQAogCiAJZ19TQkRDbWRJbmRleCA9IDA7CiAKLQlHTE9CX0xMRF9GbGFzaF9Jbml0KCk7Ci0KLQlzdGF0dXMgPSBHTE9CX0xMRF9SZWFkX0RldmljZV9JRCgpOworCXN0YXR1cyA9IEdMT0JfTExEX0ZsYXNoX0luaXQoKTsKIAogCXJldHVybiBzdGF0dXM7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9sbGRfZW11LmMgYi9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9sbGRfZW11LmMKaW5kZXggNjczM2JiZi4uMDk1ZjJmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NwZWN0cmEvbGxkX2VtdS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2xsZF9lbXUuYwpAQCAtMTgwLDEwICsxODAsOCBAQAogCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1RSQUNFLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKIAkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOwogCi0JZmxhc2hfbWVtb3J5WzBdID0gKHU4ICopdm1hbGxvYyhHTE9CX0xMRF9QQUdFX1NJWkUgKgotCQkJCQkJICAgR0xPQl9MTERfQkxPQ0tTICoKLQkJCQkJCSAgIEdMT0JfTExEX1BBR0VTICoKLQkJCQkJCSAgIHNpemVvZih1OCkpOworCWZsYXNoX21lbW9yeVswXSA9IHZtYWxsb2MoR0xPQl9MTERfUEFHRV9TSVpFICogR0xPQl9MTERfQkxPQ0tTICoKKwkJCQkgIEdMT0JfTExEX1BBR0VTICogc2l6ZW9mKHU4KSk7CiAJaWYgKCFmbGFzaF9tZW1vcnlbMF0pIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJGYWlsIHRvIGFsbG9jYXRlIG1lbW9yeSAiCiAJCSAgICAgICAiZm9yIG5hbmQgZW11bGF0b3IhXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2xsZF9uYW5kLmMgYi9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9sbGRfbmFuZC5jCmluZGV4IDBkNjQ3YThmLi4yMjYzZDNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9sbGRfbmFuZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2xsZF9uYW5kLmMKQEAgLTIzOTUsMTEyICsyMzk1LDkgQEAKIAl1bnNpZ25lZCBsb25nIGNzcl9iYXNlOwogCXVuc2lnbmVkIGxvbmcgY3NyX2xlbjsKIAlzdHJ1Y3QgbXJzdF9uYW5kX2luZm8gKnBuZGV2ID0gJmluZm87Ci0KLQluYW5kX2RiZ19wcmludChOQU5EX0RCR19XQVJOLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKLQkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOwotCi0JcmV0ID0gcGNpX2VuYWJsZV9kZXZpY2UoZGV2KTsKLQlpZiAocmV0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiU3BlY3RyYTogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLlxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcGNpX3NldF9tYXN0ZXIoZGV2KTsKLQlwbmRldi0+ZGV2ID0gZGV2OwotCi0JY3NyX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKTsKLQlpZiAoIWNzcl9iYXNlKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiU3BlY3RyYTogcGNpX3Jlc291cmNlX3N0YXJ0IGZhaWxlZCFcbiIpOwotCQlyZXQgPSAtRU5PREVWOwotCQlnb3RvIGZhaWxlZF9yZXFfY3NyOwotCX0KLQotCWNzcl9sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKGRldiwgMCk7Ci0JaWYgKCFjc3JfbGVuKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiU3BlY3RyYTogcGNpX3Jlc291cmNlX2xlbiBmYWlsZWQhXG4iKTsKLQkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBmYWlsZWRfcmVxX2NzcjsKLQl9Ci0KLQlyZXQgPSBwY2lfcmVxdWVzdF9yZWdpb25zKGRldiwgU1BFQ1RSQV9OQU5EX05BTUUpOwotCWlmIChyZXQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTcGVjdHJhOiBVbmFibGUgdG8gcmVxdWVzdCAiCi0JCSAgICAgICAibWVtb3J5IHJlZ2lvblxuIik7Ci0JCWdvdG8gZmFpbGVkX3JlcV9jc3I7Ci0JfQotCi0JcG5kZXYtPmlvYWRkciA9IGlvcmVtYXBfbm9jYWNoZShjc3JfYmFzZSwgY3NyX2xlbik7Ci0JaWYgKCFwbmRldi0+aW9hZGRyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiU3BlY3RyYTogVW5hYmxlIHRvIHJlbWFwIG1lbW9yeSByZWdpb25cbiIpOwotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGZhaWxlZF9yZW1hcF9jc3I7Ci0JfQotCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAiU3BlY3RyYTogQ1NSIDB4JTA4bHggLT4gMHglcCAoMHglbHgpXG4iLAotCQkgICAgICAgY3NyX2Jhc2UsIHBuZGV2LT5pb2FkZHIsIGNzcl9sZW4pOwotCi0JaW5pdF9jb21wbGV0aW9uKCZwbmRldi0+Y29tcGxldGUpOwotCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAiU3BlY3RyYTogSVJRICVkXG4iLCBkZXYtPmlycSk7Ci0KLSNpZiBDTURfRE1BCi0JaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCBjZG1hX2lzciwgSVJRRl9TSEFSRUQsCi0JCQlTUEVDVFJBX05BTkRfTkFNRSwgJmluZm8pKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiU3BlY3RyYTogVW5hYmxlIHRvIGFsbG9jYXRlIElSUVxuIik7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWlvdW5tYXAocG5kZXYtPmlvYWRkcik7Ci0JCWdvdG8gZmFpbGVkX3JlbWFwX2NzcjsKLQl9Ci0jZWxzZQotCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgZGRtYV9pc3IsIElSUUZfU0hBUkVELAotCQkJU1BFQ1RSQV9OQU5EX05BTUUsICZpbmZvKSkgewotCQlwcmludGsoS0VSTl9FUlIgIlNwZWN0cmE6IFVuYWJsZSB0byBhbGxvY2F0ZSBJUlFcbiIpOwotCQlyZXQgPSAtRU5PREVWOwotCQlpb3VubWFwKHBuZGV2LT5pb2FkZHIpOwotCQlnb3RvIGZhaWxlZF9yZW1hcF9jc3I7Ci0JfQotI2VuZGlmCi0KLQlwY2lfc2V0X2RydmRhdGEoZGV2LCBwbmRldik7Ci0KLQlyZXR1cm4gMDsKLQotZmFpbGVkX3JlbWFwX2NzcjoKLQlwY2lfcmVsZWFzZV9yZWdpb25zKGRldik7Ci1mYWlsZWRfcmVxX2NzcjoKLQlwY2lfZGlzYWJsZV9kZXZpY2UoZGV2KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIG5hbmRfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCXN0cnVjdCBtcnN0X25hbmRfaW5mbyAqcG5kZXYgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKLQotCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1dBUk4sICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAotCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7Ci0KLSNpZiBDTURfRE1BCi0JZnJlZV9pcnEoZGV2LT5pcnEsIHBuZGV2KTsKLSNlbmRpZgotCWlvdW5tYXAocG5kZXYtPmlvYWRkcik7Ci0JcGNpX3JlbGVhc2VfcmVnaW9ucyhkZXYpOwotCXBjaV9kaXNhYmxlX2RldmljZShkZXYpOwotfQotCi1NT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgbmFuZF9wY2lfaWRzKTsKLQotc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIG5hbmRfcGNpX2RyaXZlciA9IHsKLQkubmFtZSA9IFNQRUNUUkFfTkFORF9OQU1FLAotCS5pZF90YWJsZSA9IG5hbmRfcGNpX2lkcywKLQkucHJvYmUgPSBuYW5kX3BjaV9wcm9iZSwKLQkucmVtb3ZlID0gbmFuZF9wY2lfcmVtb3ZlLAotfTsKLQotaW50IE5BTkRfRmxhc2hfSW5pdCh2b2lkKQotewotCWludCByZXR2YWw7CiAJdTMyIGludF9tYXNrOwogCi0JbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfVFJBQ0UsICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1dBUk4sICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAogCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CiAKIAlGbGFzaFJlZyA9IGlvcmVtYXBfbm9jYWNoZShHTE9CX0hXQ1RMX1JFR19CQVNFLApAQCAtMjU4Miw2ICsyNDc5LDEyMiBAQAogCWlvd3JpdGUzMigwLCBGbGFzaFJlZyArIFRXT19ST1dfQUREUl9DWUNMRVMpOwogCWlvd3JpdGUzMigxLCBGbGFzaFJlZyArIEVDQ19FTkFCTEUpOwogCWVuYWJsZV9lY2MgPSAxOworCXJldCA9IHBjaV9lbmFibGVfZGV2aWNlKGRldik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgIlNwZWN0cmE6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZC5cbiIpOworCQlnb3RvIGZhaWxlZF9yZXFfY3NyOworCX0KKworCXBjaV9zZXRfbWFzdGVyKGRldik7CisJcG5kZXYtPmRldiA9IGRldjsKKworCWNzcl9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMCk7CisJaWYgKCFjc3JfYmFzZSkgeworCQlwcmludGsoS0VSTl9FUlIgIlNwZWN0cmE6IHBjaV9yZXNvdXJjZV9zdGFydCBmYWlsZWQhXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBmYWlsZWRfcmVxX2NzcjsKKwl9CisKKwljc3JfbGVuID0gcGNpX3Jlc291cmNlX2xlbihkZXYsIDApOworCWlmICghY3NyX2xlbikgeworCQlwcmludGsoS0VSTl9FUlIgIlNwZWN0cmE6IHBjaV9yZXNvdXJjZV9sZW4gZmFpbGVkIVxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZmFpbGVkX3JlcV9jc3I7CisJfQorCisJcmV0ID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhkZXYsIFNQRUNUUkFfTkFORF9OQU1FKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiU3BlY3RyYTogVW5hYmxlIHRvIHJlcXVlc3QgIgorCQkgICAgICAgIm1lbW9yeSByZWdpb25cbiIpOworCQlnb3RvIGZhaWxlZF9yZXFfY3NyOworCX0KKworCXBuZGV2LT5pb2FkZHIgPSBpb3JlbWFwX25vY2FjaGUoY3NyX2Jhc2UsIGNzcl9sZW4pOworCWlmICghcG5kZXYtPmlvYWRkcikgeworCQlwcmludGsoS0VSTl9FUlIgIlNwZWN0cmE6IFVuYWJsZSB0byByZW1hcCBtZW1vcnkgcmVnaW9uXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsZWRfcmVtYXBfY3NyOworCX0KKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywgIlNwZWN0cmE6IENTUiAweCUwOGx4IC0+IDB4JXAgKDB4JWx4KVxuIiwKKwkJICAgICAgIGNzcl9iYXNlLCBwbmRldi0+aW9hZGRyLCBjc3JfbGVuKTsKKworCWluaXRfY29tcGxldGlvbigmcG5kZXYtPmNvbXBsZXRlKTsKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywgIlNwZWN0cmE6IElSUSAlZFxuIiwgZGV2LT5pcnEpOworCisjaWYgQ01EX0RNQQorCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgY2RtYV9pc3IsIElSUUZfU0hBUkVELAorCQkJU1BFQ1RSQV9OQU5EX05BTUUsICZpbmZvKSkgeworCQlwcmludGsoS0VSTl9FUlIgIlNwZWN0cmE6IFVuYWJsZSB0byBhbGxvY2F0ZSBJUlFcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlpb3VubWFwKHBuZGV2LT5pb2FkZHIpOworCQlnb3RvIGZhaWxlZF9yZW1hcF9jc3I7CisJfQorI2Vsc2UKKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIGRkbWFfaXNyLCBJUlFGX1NIQVJFRCwKKwkJCVNQRUNUUkFfTkFORF9OQU1FLCAmaW5mbykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTcGVjdHJhOiBVbmFibGUgdG8gYWxsb2NhdGUgSVJRXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJaW91bm1hcChwbmRldi0+aW9hZGRyKTsKKwkJZ290byBmYWlsZWRfcmVtYXBfY3NyOworCX0KKyNlbmRpZgorCisJcGNpX3NldF9kcnZkYXRhKGRldiwgcG5kZXYpOworCisJcmV0ID0gR0xPQl9MTERfUmVhZF9EZXZpY2VfSUQoKTsKKwlpZiAocmV0KSB7CisJCWlvdW5tYXAocG5kZXYtPmlvYWRkcik7CisJCWdvdG8gZmFpbGVkX3JlbWFwX2NzcjsKKwl9CisKKwlyZXQgPSByZWdpc3Rlcl9zcGVjdHJhX2Z0bCgpOworCWlmIChyZXQpIHsKKwkJaW91bm1hcChwbmRldi0+aW9hZGRyKTsKKwkJZ290byBmYWlsZWRfcmVtYXBfY3NyOworCX0KKworCXJldHVybiAwOworCitmYWlsZWRfcmVtYXBfY3NyOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMoZGV2KTsKK2ZhaWxlZF9yZXFfY3NyOgorCXBjaV9kaXNhYmxlX2RldmljZShkZXYpOworCWlvdW5tYXAoRmxhc2hNZW0pOworCWlvdW5tYXAoRmxhc2hSZWcpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbmFuZF9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IG1yc3RfbmFuZF9pbmZvICpwbmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfV0FSTiwgIiVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXNcbiIsCisJCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKKworI2lmIENNRF9ETUEKKwlmcmVlX2lycShkZXYtPmlycSwgcG5kZXYpOworI2VuZGlmCisJaW91bm1hcChwbmRldi0+aW9hZGRyKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7Cit9CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBuYW5kX3BjaV9pZHMpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgbmFuZF9wY2lfZHJpdmVyID0geworCS5uYW1lID0gU1BFQ1RSQV9OQU5EX05BTUUsCisJLmlkX3RhYmxlID0gbmFuZF9wY2lfaWRzLAorCS5wcm9iZSA9IG5hbmRfcGNpX3Byb2JlLAorCS5yZW1vdmUgPSBuYW5kX3BjaV9yZW1vdmUsCit9OworCitpbnQgTkFORF9GbGFzaF9Jbml0KHZvaWQpCit7CisJaW50IHJldHZhbDsKKworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1RSQUNFLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOwogCiAJcmV0dmFsID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmbmFuZF9wY2lfZHJpdmVyKTsKIAlpZiAocmV0dmFsKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3N0ZV9ybWk0L0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvc3RlX3JtaTQvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODY3OTUwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3N0ZV9ybWk0L0tjb25maWcKQEAgLTAsMCArMSw5IEBACitjb25maWcgVE9VQ0hTQ1JFRU5fU1lOQVBUSUNTX0kyQ19STUk0CisJdHJpc3RhdGUgIlN5bmFwdGljcyBpMmMgcm1pNCB0b3VjaHNjcmVlbiIKKwlkZXBlbmRzIG9uIEkyQyAmJiBJTlBVVAorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBTeW5hcHRpY3MgUk1JNCBhbmQKKwkgIHdhbnQgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBidWlsdC1pbiB0b3VjaHNjcmVlbi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc3luYXB0aWNzX3JtaTRfdHMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3RlX3JtaTQvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvc3RlX3JtaTQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNjZTJlZDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc3RlX3JtaTQvTWFrZWZpbGUKQEAgLTAsMCArMSw0IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgUk1JNCB0b3VjaHNjcmVlbiBkcml2ZXIuCisjCitvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fU1lOQVBUSUNTX0kyQ19STUk0KSArPSBzeW5hcHRpY3NfaTJjX3JtaTQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3N0ZV9ybWk0L1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvc3RlX3JtaTQvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmUyNDM3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3N0ZV9ybWk0L1RPRE8KQEAgLTAsMCArMSw3IEBACitUT0RPCistLS0tCisKK1dhaXQgZm9yIHRoZSBvZmZpY2lhbCB1cHN0cmVhbSBzeW5hcHRpY3Mgcm1pNCBjbGVhcnBhZCBkcml2ZXJzIGFzIHByb21pc2VkIG92ZXIgdGhlIHBhc3QgZmV3IG1vbnRocworTWVyZ2UgYW55IGRldmljZSBzdXBwb3J0IG5lZWRlZCBmcm9tIHRoaXMgZHJpdmVyIGludG8gaXQKK0RlbGV0ZSB0aGlzIGRyaXZlcgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3RlX3JtaTQvc3luYXB0aWNzX2kyY19ybWk0LmMgYi9kcml2ZXJzL3N0YWdpbmcvc3RlX3JtaTQvc3luYXB0aWNzX2kyY19ybWk0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThmMDQ3ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zdGVfcm1pNC9zeW5hcHRpY3NfaTJjX3JtaTQuYwpAQCAtMCwwICsxLDExNzkgQEAKKy8qKgorICoKKyAqIFN5bmFwdGljcyBSZWdpc3RlciBNYXBwZWQgSW50ZXJmYWNlIChSTUk0KSBJMkMgUGh5c2ljYWwgTGF5ZXIgRHJpdmVyLgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMTAsIFN5bmFwdGljcyBJbmNvcnBvcmF0ZWQKKyAqCisgKiBBdXRob3I6IEpzIEhBIDxqcy5oYUBzdGVyaWNzc29uLmNvbT4gZm9yIFNULUVyaWNzc29uCisgKiBBdXRob3I6IE5hdmVlbiBLdW1hciBHIDxuYXZlZW4uZ2FkZGlwYXRpQHN0ZXJpY3Nzb24uY29tPiBmb3IgU1QtRXJpY3Nzb24KKyAqIENvcHlyaWdodCAyMDEwIChjKSBTVC1Fcmljc3NvbiBBQgorICovCisvKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwyIGxpY2Vuc2UuCisgKgorICojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICogR1BMCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorICogb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSAic3luYXB0aWNzX2kyY19ybWk0LmgiCisKKy8qIFRPRE86IGZvciBtdWx0aXBsZSBkZXZpY2Ugc3VwcG9ydCB3aWxsIG5lZWQgYSBwZXItZGV2aWNlIG11dGV4ICovCisjZGVmaW5lIERSSVZFUl9OQU1FICJzeW5hcHRpY3Nfcm1pNF9pMmMiCisKKyNkZWZpbmUgTUFYX0VSUk9SX1JFUE9SVAk2CisjZGVmaW5lIE1BWF9UT1VDSF9NQUpPUgkJMTUKKyNkZWZpbmUgTUFYX1JFVFJZX0NPVU5UCQk1CisjZGVmaW5lIFNURF9RVUVSWV9MRU4JCTIxCisjZGVmaW5lIFBBR0VfTEVOCQkyCisjZGVmaW5lIERBVEFfQlVGX0xFTgkJMzIKKyNkZWZpbmUgQlVGX0xFTgkJCTM3CisjZGVmaW5lIFFVRVJZX0xFTgkJOQorI2RlZmluZSBEQVRBX0xFTgkJMTIKKyNkZWZpbmUgSEFTX1RBUAkJCTB4MDEKKyNkZWZpbmUgSEFTX1BBTE1ERVRFQ1QJCTB4MDEKKyNkZWZpbmUgSEFTX1JPVEFURQkJMHgwMgorI2RlZmluZSBIQVNfVEFQQU5ESE9MRAkJMHgwMgorI2RlZmluZSBIQVNfRE9VQkxFVEFQCQkweDA0CisjZGVmaW5lIEhBU19FQVJMWVRBUAkJMHgwOAorI2RlZmluZSBIQVNfUkVMRUFTRQkJMHgwOAorI2RlZmluZSBIQVNfRkxJQ0sJCTB4MTAKKyNkZWZpbmUgSEFTX1BSRVNTCQkweDIwCisjZGVmaW5lIEhBU19QSU5DSAkJMHg0MAorCisjZGVmaW5lIE1BU0tfMTZCSVQJCTB4RkZGRgorI2RlZmluZSBNQVNLXzhCSVQJCTB4RkYKKyNkZWZpbmUgTUFTS183QklUCQkweDdGCisjZGVmaW5lIE1BU0tfNUJJVAkJMHgxRgorI2RlZmluZSBNQVNLXzRCSVQJCTB4MEYKKyNkZWZpbmUgTUFTS18zQklUCQkweDA3CisjZGVmaW5lIE1BU0tfMkJJVAkJMHgwMworI2RlZmluZSBUT1VDSFBBRF9DVFJMX0lOVFIJMHg4CisjZGVmaW5lIFBEVF9TVEFSVF9TQ0FOX0xPQ0FUSU9OICgweDAwRTkpCisjZGVmaW5lIFBEVF9FTkRfU0NBTl9MT0NBVElPTgkoMHgwMDBBKQorI2RlZmluZSBQRFRfRU5UUllfU0laRQkJKDB4MDAwNikKKyNkZWZpbmUgUk1JNF9OVU1CRVJfT0ZfTUFYX0ZJTkdFUlMJCSg4KQorI2RlZmluZSBTWU5BUFRJQ1NfUk1JNF9UT1VDSFBBRF9GVU5DX05VTQkoMHgxMSkKKyNkZWZpbmUgU1lOQVBUSUNTX1JNSTRfREVWSUNFX0NPTlRST0xfRlVOQ19OVU0JKDB4MDEpCisKKy8qKgorICogc3RydWN0IHN5bmFwdGljc19ybWk0X2ZuX2Rlc2MgLSBjb250YWlucyB0aGUgZnVudGlvbiBkZXNjcmlwdG9yIGluZm9ybWF0aW9uCisgKiBAcXVlcnlfYmFzZV9hZGRyOiBiYXNlIGFkZHJlc3MgZm9yIHF1ZXJ5CisgKiBAY21kX2Jhc2VfYWRkcjogYmFzZSBhZGRyZXNzIGZvciBjb21tYW5kCisgKiBAY3RybF9iYXNlX2FkZHI6IGJhc2UgYWRkcmVzcyBmb3IgY29udHJvbAorICogQGRhdGFfYmFzZV9hZGRyOiBiYXNlIGFkZHJlc3MgZm9yIGRhdGEKKyAqIEBpbnRyX3NyY19jb3VudDogY291bnQgZm9yIHRoZSBpbnRlcnJ1cHQgc291cmNlCisgKiBAZm5fbnVtYmVyOiBmdW5jdGlvbiBudW1iZXIKKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGdpdmVzIHRoZSBmdW5jdGlvbiBkZXNjcmlwdG9yIGluZm9ybWF0aW9uCisgKiBvZiB0aGUgcGFydGljdWxhciBmdW5jdGlvbmFsaXR5LgorICovCitzdHJ1Y3Qgc3luYXB0aWNzX3JtaTRfZm5fZGVzYyB7CisJdW5zaWduZWQgY2hhcglxdWVyeV9iYXNlX2FkZHI7CisJdW5zaWduZWQgY2hhcgljbWRfYmFzZV9hZGRyOworCXVuc2lnbmVkIGNoYXIJY3RybF9iYXNlX2FkZHI7CisJdW5zaWduZWQgY2hhcglkYXRhX2Jhc2VfYWRkcjsKKwl1bnNpZ25lZCBjaGFyCWludHJfc3JjX2NvdW50OworCXVuc2lnbmVkIGNoYXIJZm5fbnVtYmVyOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgc3luYXB0aWNzX3JtaTRfZm4gLSBjb250YWlucyB0aGUgZnVudGlvbiBpbmZvcm1hdGlvbgorICogQGZuX251bWJlcjogZnVuY3Rpb24gbnVtYmVyCisgKiBAbnVtX29mX2RhdGFfc291cmNlczogbnVtYmVyIG9mIGRhdGEgc291cmNlcworICogQG51bV9vZl9kYXRhX3BvaW50czogbnVtYmVyIG9mIGZpbmdlcnMgdG91Y2hlZAorICogQHNpemVfb2ZfZGF0YV9yZWdpc3Rlcl9ibG9jazogZGF0YSByZWdpc3RlciBibG9jayBzaXplCisgKiBAaW5kZXhfdG9faW50cl9yZWc6IGluZGV4IGZvciBpbnRlcnJ1cHQgcmVnaXN0ZXIKKyAqIEBpbnRyX21hc2s6IGludGVycnVwdCBtYXNrIHZhbHVlCisgKiBAZm5fZGVzYzogdmFyaWFibGUgZm9yIGZ1bmN0aW9uIGRlc2NyaXB0b3Igc3RydWN0dXJlCisgKiBAbGluazogbGlua2VkIGxpc3QgZm9yIGZ1bmN0aW9uIGRlc2NyaXB0b3JzCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgZ2l2ZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG51bWJlciBvZiBkYXRhIHNvdXJjZXMgYW5kCisgKiB0aGUgbnVtYmVyIG9mIGRhdGEgcmVnaXN0ZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZnVuY3Rpb24uCisgKi8KK3N0cnVjdCBzeW5hcHRpY3Nfcm1pNF9mbiB7CisJdW5zaWduZWQgY2hhcgkJZm5fbnVtYmVyOworCXVuc2lnbmVkIGNoYXIJCW51bV9vZl9kYXRhX3NvdXJjZXM7CisJdW5zaWduZWQgY2hhcgkJbnVtX29mX2RhdGFfcG9pbnRzOworCXVuc2lnbmVkIGNoYXIJCXNpemVfb2ZfZGF0YV9yZWdpc3Rlcl9ibG9jazsKKwl1bnNpZ25lZCBjaGFyCQlpbmRleF90b19pbnRyX3JlZzsKKwl1bnNpZ25lZCBjaGFyCQlpbnRyX21hc2s7CisJc3RydWN0IHN5bmFwdGljc19ybWk0X2ZuX2Rlc2MJZm5fZGVzYzsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpbms7Cit9OworCisvKioKKyAqIHN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9kZXZpY2VfaW5mbyAtIGNvbnRhaW5zIHRoZSBybWk0IGRldmljZSBpbmZvcm1hdGlvbgorICogQHZlcnNpb25fbWFqb3I6IHByb3RvY29sIG1ham9yIHZlcnNpb24gbnVtYmVyCisgKiBAdmVyc2lvbl9taW5vcjogcHJvdG9jb2wgbWlub3IgdmVyc2lvbiBudW1iZXIKKyAqIEBtYW51ZmFjdHVyZXJfaWQ6IG1hbnVmYWN0dXJlciBpZGVudGlmaWNhdGlvbiBieXRlCisgKiBAcHJvZHVjdF9wcm9wczogcHJvZHVjdCBwcm9wZXJ0aWVzIGluZm9ybWF0aW9uCisgKiBAcHJvZHVjdF9pbmZvOiBwcm9kdWN0IGluZm8gYXJyYXkKKyAqIEBkYXRlX2NvZGU6IGRldmljZSBtYW51ZmFjdHVyZSBkYXRlCisgKiBAdGVzdGVyX2lkOiB0ZXN0ZXIgaWQgYXJyYXkKKyAqIEBzZXJpYWxfbnVtYmVyOiBzZXJpYWwgbnVtYmVyIGZvciB0aGF0IGRldmljZQorICogQHByb2R1Y3RfaWRfc3RyaW5nOiBwcm9kdWN0IGlkIGZvciB0aGUgZGV2aWNlCisgKiBAc3VwcG9ydF9mbl9saXN0OiBsaW5rZWQgbGlzdCBmb3IgZGV2aWNlIGluZm9ybWF0aW9uCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgZ2l2ZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG51bWJlciBvZiBkYXRhIHNvdXJjZXMgYW5kCisgKiB0aGUgbnVtYmVyIG9mIGRhdGEgcmVnaXN0ZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZnVuY3Rpb24uCisgKi8KK3N0cnVjdCBzeW5hcHRpY3Nfcm1pNF9kZXZpY2VfaW5mbyB7CisJdW5zaWduZWQgaW50CQl2ZXJzaW9uX21ham9yOworCXVuc2lnbmVkIGludAkJdmVyc2lvbl9taW5vcjsKKwl1bnNpZ25lZCBjaGFyCQltYW51ZmFjdHVyZXJfaWQ7CisJdW5zaWduZWQgY2hhcgkJcHJvZHVjdF9wcm9wczsKKwl1bnNpZ25lZCBjaGFyCQlwcm9kdWN0X2luZm9bMl07CisJdW5zaWduZWQgY2hhcgkJZGF0ZV9jb2RlWzNdOworCXVuc2lnbmVkIHNob3J0CQl0ZXN0ZXJfaWQ7CisJdW5zaWduZWQgc2hvcnQJCXNlcmlhbF9udW1iZXI7CisJdW5zaWduZWQgY2hhcgkJcHJvZHVjdF9pZF9zdHJpbmdbMTFdOworCXN0cnVjdCBsaXN0X2hlYWQJc3VwcG9ydF9mbl9saXN0OworfTsKKworLyoqCisgKiBzdHJ1Y3Qgc3luYXB0aWNzX3JtaTRfZGF0YSAtIGNvbnRhaW5zIHRoZSBybWk0IGRldmljZSBkYXRhCisgKiBAcm1pNF9tb2RfaW5mbzogc3RydWN0dXJlIHZhcmlhYmxlIGZvciBybWk0IGRldmljZSBpbmZvCisgKiBAaW5wdXRfZGV2OiBwb2ludGVyIGZvciBpbnB1dCBkZXZpY2UKKyAqIEBpMmNfY2xpZW50OiBwb2ludGVyIGZvciBpMmMgY2xpZW50CisgKiBAYm9hcmQ6IGNvbnN0YW50IHBvaW50ZXIgZm9yIHRvdWNoIHBsYXRmb3JtIGRhdGEKKyAqIEBmbl9saXN0X211dGV4OiBtdXRleCBmb3IgZnVudGlvbiBsaXN0CisgKiBAcm1pNF9wYWdlX211dGV4OiBtdXRleCBmb3Igcm1pNCBwYWdlCisgKiBAY3VycmVudF9wYWdlOiB2YXJpYWJsZSBmb3IgaW50ZWdlcgorICogQG51bWJlcl9vZl9pbnRlcnJ1cHRfcmVnaXN0ZXI6IGludGVycnVwdCByZWdpc3RlcnMgY291bnQKKyAqIEBmbjAxX2N0cmxfYmFzZV9hZGRyOiBjb250cm9sIGJhc2UgYWRkcmVzcyBmb3IgZm4wMQorICogQGZuMDFfcXVlcnlfYmFzZV9hZGRyOiBxdWVyeSBiYXNlIGFkZHJlc3MgZm9yIGZuMDEKKyAqIEBmbjAxX2RhdGFfYmFzZV9hZGRyOiBkYXRhIGJhc2UgYWRkcmVzcyBmb3IgZm4wMQorICogQHNlbnNvcl9tYXhfeDogc2Vuc29yIG1heGltdW0geCB2YWx1ZQorICogQHNlbnNvcl9tYXhfeTogc2Vuc29yIG1heGltdW0geSB2YWx1ZQorICogQHJlZ3VsYXRvcjogcG9pbnRlciB0byB0aGUgcmVndWxhdG9yIHN0cnVjdHVyZQorICogQHdhaXQ6IHdhaXQgcXVldWUgc3RydWN0dXJlIHZhcmlhYmxlCisgKiBAdG91Y2hfc3RvcHBlZDogZmxhZyB0byBzdG9wIHRoZSB0aHJlYWQgZnVuY3Rpb24KKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBnaXZlcyB0aGUgZGV2aWNlIGRhdGEgaW5mb3JtYXRpb24uCisgKi8KK3N0cnVjdCBzeW5hcHRpY3Nfcm1pNF9kYXRhIHsKKwlzdHJ1Y3Qgc3luYXB0aWNzX3JtaTRfZGV2aWNlX2luZm8gcm1pNF9tb2RfaW5mbzsKKwlzdHJ1Y3QgaW5wdXRfZGV2CSppbnB1dF9kZXY7CisJc3RydWN0IGkyY19jbGllbnQJKmkyY19jbGllbnQ7CisJY29uc3Qgc3RydWN0IHN5bmFwdGljc19ybWk0X3BsYXRmb3JtX2RhdGEgKmJvYXJkOworCXN0cnVjdCBtdXRleAkJZm5fbGlzdF9tdXRleDsKKwlzdHJ1Y3QgbXV0ZXgJCXJtaTRfcGFnZV9tdXRleDsKKwlpbnQJCQljdXJyZW50X3BhZ2U7CisJdW5zaWduZWQgaW50CQludW1iZXJfb2ZfaW50ZXJydXB0X3JlZ2lzdGVyOworCXVuc2lnbmVkIHNob3J0CQlmbjAxX2N0cmxfYmFzZV9hZGRyOworCXVuc2lnbmVkIHNob3J0CQlmbjAxX3F1ZXJ5X2Jhc2VfYWRkcjsKKwl1bnNpZ25lZCBzaG9ydAkJZm4wMV9kYXRhX2Jhc2VfYWRkcjsKKwlpbnQJCQlzZW5zb3JfbWF4X3g7CisJaW50CQkJc2Vuc29yX21heF95OworCXN0cnVjdCByZWd1bGF0b3IJKnJlZ3VsYXRvcjsKKwl3YWl0X3F1ZXVlX2hlYWRfdAl3YWl0OworCWJvb2wJCQl0b3VjaF9zdG9wcGVkOworfTsKKworLyoqCisgKiBzeW5hcHRpY3Nfcm1pNF9zZXRfcGFnZSgpIC0gc2V0cyB0aGUgcGFnZQorICogQHBkYXRhOiBwb2ludGVyIHRvIHN5bmFwdGljc19ybWk0X2RhdGEgc3RydWN0dXJlCisgKiBAYWRkcmVzczogc2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBwYWdlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCB0aGUgcGFnZSBhbmQgcmV0dXJucyBpbnRlZ2VyLgorICovCitzdGF0aWMgaW50IHN5bmFwdGljc19ybWk0X3NldF9wYWdlKHN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9kYXRhICpwZGF0YSwKKwkJCQkJdW5zaWduZWQgaW50IGFkZHJlc3MpCit7CisJdW5zaWduZWQgY2hhcgl0eGJ1ZltQQUdFX0xFTl07CisJaW50CQlyZXR2YWw7CisJdW5zaWduZWQgaW50CXBhZ2U7CisJc3RydWN0IGkyY19jbGllbnQgKmkyYyA9IHBkYXRhLT5pMmNfY2xpZW50OworCisJcGFnZQk9ICgoYWRkcmVzcyA+PiA4KSAmIE1BU0tfOEJJVCk7CisJaWYgKHBhZ2UgIT0gcGRhdGEtPmN1cnJlbnRfcGFnZSkgeworCQl0eGJ1ZlswXQk9IE1BU0tfOEJJVDsKKwkJdHhidWZbMV0JPSBwYWdlOworCQlyZXR2YWwJPSBpMmNfbWFzdGVyX3NlbmQoaTJjLCB0eGJ1ZiwgUEFHRV9MRU4pOworCQlpZiAocmV0dmFsICE9IFBBR0VfTEVOKQorCQkJZGV2X2VycigmaTJjLT5kZXYsICIlczpmYWlsZWQ6JWRcbiIsIF9fZnVuY19fLCByZXR2YWwpOworCQllbHNlCisJCQlwZGF0YS0+Y3VycmVudF9wYWdlID0gcGFnZTsKKwl9IGVsc2UKKwkJcmV0dmFsID0gUEFHRV9MRU47CisJcmV0dXJuIHJldHZhbDsKK30KKy8qKgorICogc3luYXB0aWNzX3JtaTRfaTJjX2Jsb2NrX3JlYWQoKSAtIHJlYWQgdGhlIGJsb2NrIG9mIGRhdGEKKyAqIEBwZGF0YTogcG9pbnRlciB0byBzeW5hcHRpY3Nfcm1pNF9kYXRhIHN0cnVjdHVyZQorICogQGFkZHJlc3M6IHJlYWQgdGhlIGJsb2NrIG9mIGRhdGEgZnJvbSB0aGlzIG9mZnNldAorICogQHZhbHA6IHBvaW50ZXIgdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgZGF0YSB0byBiZSByZWFkCisgKiBAc2l6ZTogbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHRvIHJlYWQgdGhlIGJsb2NrIG9mIGRhdGEgYW5kIHJldHVybnMgaW50ZWdlci4KKyAqLworc3RhdGljIGludCBzeW5hcHRpY3Nfcm1pNF9pMmNfYmxvY2tfcmVhZChzdHJ1Y3Qgc3luYXB0aWNzX3JtaTRfZGF0YSAqcGRhdGEsCisJCQkJCQl1bnNpZ25lZCBzaG9ydCBhZGRyZXNzLAorCQkJCQkJdW5zaWduZWQgY2hhciAqdmFscCwgaW50IHNpemUpCit7CisJaW50IHJldHZhbCA9IDA7CisJaW50IHJldHJ5X2NvdW50ID0gMDsKKwlpbnQgaW5kZXg7CisJc3RydWN0IGkyY19jbGllbnQgKmkyYyA9IHBkYXRhLT5pMmNfY2xpZW50OworCisJbXV0ZXhfbG9jaygmKHBkYXRhLT5ybWk0X3BhZ2VfbXV0ZXgpKTsKKwlyZXR2YWwgPSBzeW5hcHRpY3Nfcm1pNF9zZXRfcGFnZShwZGF0YSwgYWRkcmVzcyk7CisJaWYgKHJldHZhbCAhPSBQQUdFX0xFTikKKwkJZ290byBleGl0OworCWluZGV4ID0gYWRkcmVzcyAmIE1BU0tfOEJJVDsKK3JldHJ5OgorCXJldHZhbCA9IGkyY19zbWJ1c19yZWFkX2kyY19ibG9ja19kYXRhKGkyYywgaW5kZXgsIHNpemUsIHZhbHApOworCWlmIChyZXR2YWwgIT0gc2l6ZSkgeworCQlpZiAoKytyZXRyeV9jb3VudCA9PSBNQVhfUkVUUllfQ09VTlQpCisJCQlkZXZfZXJyKCZpMmMtPmRldiwKKwkJCQkiJXM6YWRkcmVzcyAweCUwNHggc2l6ZSAlZCBmYWlsZWQ6JWRcbiIsCisJCQkJCV9fZnVuY19fLCBhZGRyZXNzLCBzaXplLCByZXR2YWwpOworCQllbHNlIHsKKwkJCXN5bmFwdGljc19ybWk0X3NldF9wYWdlKHBkYXRhLCBhZGRyZXNzKTsKKwkJCWdvdG8gcmV0cnk7CisJCX0KKwl9CitleGl0OgorCW11dGV4X3VubG9jaygmKHBkYXRhLT5ybWk0X3BhZ2VfbXV0ZXgpKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIHN5bmFwdGljc19ybWk0X2kyY19ieXRlX3dyaXRlKCkgLSB3cml0ZSB0aGUgc2luZ2xlIGJ5dGUgZGF0YQorICogQHBkYXRhOiBwb2ludGVyIHRvIHN5bmFwdGljc19ybWk0X2RhdGEgc3RydWN0dXJlCisgKiBAYWRkcmVzczogd3JpdGUgdGhlIGJsb2NrIG9mIGRhdGEgZnJvbSB0aGlzIG9mZnNldAorICogQGRhdGE6IGRhdGEgdG8gYmUgd3JpdGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHRvIHdyaXRlIHRoZSBzaW5nbGUgYnl0ZSBkYXRhIGFuZCByZXR1cm5zIGludGVnZXIuCisgKi8KK3N0YXRpYyBpbnQgc3luYXB0aWNzX3JtaTRfaTJjX2J5dGVfd3JpdGUoc3RydWN0IHN5bmFwdGljc19ybWk0X2RhdGEgKnBkYXRhLAorCQkJCQkJdW5zaWduZWQgc2hvcnQgYWRkcmVzcywKKwkJCQkJCXVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwl1bnNpZ25lZCBjaGFyIHR4YnVmWzJdOworCWludCByZXR2YWwgPSAwOworCXN0cnVjdCBpMmNfY2xpZW50ICppMmMgPSBwZGF0YS0+aTJjX2NsaWVudDsKKworCS8qIENhbid0IGhhdmUgYW55b25lIGVsc2UgY2hhbmdpbmcgdGhlIHBhZ2UgYmVoaW5kIG91ciBiYWNrcyAqLworCW11dGV4X2xvY2soJihwZGF0YS0+cm1pNF9wYWdlX211dGV4KSk7CisKKwlyZXR2YWwgPSBzeW5hcHRpY3Nfcm1pNF9zZXRfcGFnZShwZGF0YSwgYWRkcmVzcyk7CisJaWYgKHJldHZhbCAhPSBQQUdFX0xFTikKKwkJZ290byBleGl0OworCXR4YnVmWzBdCT0gYWRkcmVzcyAmIE1BU0tfOEJJVDsKKwl0eGJ1ZlsxXQk9IGRhdGE7CisJcmV0dmFsCQk9IGkyY19tYXN0ZXJfc2VuZChwZGF0YS0+aTJjX2NsaWVudCwgdHhidWYsIDIpOworCS8qIEFkZCBpbiByZXRyeSBvbiB3cml0ZXMgb25seSBpbiBjZXJ0aWFuIGVycm9yIHJldHVybiB2YWx1ZXMgKi8KKwlpZiAocmV0dmFsICE9IDIpIHsKKwkJZGV2X2VycigmaTJjLT5kZXYsICIlczpmYWlsZWQ6JWRcbiIsIF9fZnVuY19fLCByZXR2YWwpOworCQlyZXR2YWwgPSAtRUlPOworCX0gZWxzZQorCQlyZXR2YWwgPSAxOworZXhpdDoKKwltdXRleF91bmxvY2soJihwZGF0YS0+cm1pNF9wYWdlX211dGV4KSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBzeW5wYXRpY3Nfcm1pNF90b3VjaHBhZF9yZXBvcnQoKSAtIHJlcG9ydHMgZm9yIHRoZSBybWk0IHRvdWNocGFkIGRldmljZQorICogQHBkYXRhOiBwb2ludGVyIHRvIHN5bmFwdGljc19ybWk0X2RhdGEgc3RydWN0dXJlCisgKiBAcmZpOiBwb2ludGVyIHRvIHN5bmFwdGljc19ybWk0X2ZuIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsbHMgdG8gcmVwb3J0cyBmb3IgdGhlIHJtaTQgdG91Y2hwYWQgZGV2aWNlCisgKi8KK3N0YXRpYyBpbnQgc3lucGF0aWNzX3JtaTRfdG91Y2hwYWRfcmVwb3J0KHN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9kYXRhICpwZGF0YSwKKwkJCQkJCXN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9mbiAqcmZpKQoreworCS8qIG51bWJlciBvZiB0b3VjaCBwb2ludHMgLSBmaW5nZXJzIGRvd24gaW4gdGhpcyBjYXNlICovCisJaW50CXRvdWNoX2NvdW50ID0gMDsKKwlpbnQJZmluZ2VyOworCWludAlmaW5nZXJzX3N1cHBvcnRlZDsKKwlpbnQJZmluZ2VyX3JlZ2lzdGVyczsKKwlpbnQJcmVnOworCWludAlmaW5nZXJfc2hpZnQ7CisJaW50CWZpbmdlcl9zdGF0dXM7CisJaW50CXJldHZhbDsKKwl1bnNpZ25lZCBzaG9ydAlkYXRhX2Jhc2VfYWRkcjsKKwl1bnNpZ25lZCBzaG9ydAlkYXRhX29mZnNldDsKKwl1bnNpZ25lZCBjaGFyCWRhdGFfcmVnX2Jsa19zaXplOworCXVuc2lnbmVkIGNoYXIJdmFsdWVzWzJdOworCXVuc2lnbmVkIGNoYXIJZGF0YVtEQVRBX0xFTl07CisJaW50CXhbUk1JNF9OVU1CRVJfT0ZfTUFYX0ZJTkdFUlNdOworCWludAl5W1JNSTRfTlVNQkVSX09GX01BWF9GSU5HRVJTXTsKKwlpbnQJd3hbUk1JNF9OVU1CRVJfT0ZfTUFYX0ZJTkdFUlNdOworCWludAl3eVtSTUk0X05VTUJFUl9PRl9NQVhfRklOR0VSU107CisJc3RydWN0CWkyY19jbGllbnQgKmNsaWVudCA9IHBkYXRhLT5pMmNfY2xpZW50OworCisJLyogZ2V0IDJEIHNlbnNvciBmaW5nZXIgZGF0YSAqLworCS8qCisJICogRmlyc3QgZ2V0IHRoZSBmaW5nZXIgc3RhdHVzIGZpZWxkIC0gdGhlIHNpemUgb2YgdGhlIGZpbmdlciBzdGF0dXMKKwkgKiBmaWVsZCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBudW1iZXIgb2YgZmluZ2VyIHN1cHBvcnRlIC0gMiBiaXRzIHBlcgorCSAqIGZpbmdlciwgc28gdGhlIG51bWJlciBvZiByZWdpc3RlcnMgdG8gcmVhZCBpczoKKwkgKiByZWdpc3RlckNvdW50ID0gY2VpbChudW1iZXJPZkZpbmdlcnMvNCkuCisJICogUmVhZCB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mIHJlZ2lzdGVycyBhbmQgY2hlY2sgZWFjaCAyIGJpdCBmaWVsZCB0bworCSAqIGRldGVybWluZSBpZiBhIGZpbmdlciBpcyBkb3duOgorCSAqCTAwID0gZmluZ2VyIG5vdCBwcmVzZW50LAorCSAqCTAxID0gZmluZ2VyIHByZXNlbnQgYW5kIGRhdGEgYWNjdXJhdGUsCisJICoJMTAgPSBmaW5nZXIgcHJlc2VudCBidXQgZGF0YSBtYXkgbm90IGJlIGFjY3VyYXRlLAorCSAqCTExID0gcmVzZXJ2ZWQgZm9yIHByb2R1Y3QgdXNlLgorCSAqLworCWZpbmdlcnNfc3VwcG9ydGVkCT0gcmZpLT5udW1fb2ZfZGF0YV9wb2ludHM7CisJZmluZ2VyX3JlZ2lzdGVycwk9IChmaW5nZXJzX3N1cHBvcnRlZCArIDMpLzQ7CisJZGF0YV9iYXNlX2FkZHIJCT0gcmZpLT5mbl9kZXNjLmRhdGFfYmFzZV9hZGRyOworCXJldHZhbCA9IHN5bmFwdGljc19ybWk0X2kyY19ibG9ja19yZWFkKHBkYXRhLCBkYXRhX2Jhc2VfYWRkciwgdmFsdWVzLAorCQkJCQkJCWZpbmdlcl9yZWdpc3RlcnMpOworCWlmIChyZXR2YWwgIT0gZmluZ2VyX3JlZ2lzdGVycykgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOnJlYWQgc3RhdHVzIHJlZ2lzdGVycyBmYWlsZWRcbiIsCisJCQkJCQkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qCisJICogRm9yIGVhY2ggZmluZ2VyIHByZXNlbnQsIHJlYWQgdGhlIHByb3BlciBudW1iZXIgb2YgcmVnaXN0ZXJzCisJICogdG8gZ2V0IGFic29sdXRlIGRhdGEuCisJICovCisJZGF0YV9yZWdfYmxrX3NpemUgPSByZmktPnNpemVfb2ZfZGF0YV9yZWdpc3Rlcl9ibG9jazsKKwlmb3IgKGZpbmdlciA9IDA7IGZpbmdlciA8IGZpbmdlcnNfc3VwcG9ydGVkOyBmaW5nZXIrKykgeworCQkvKiBkZXRlcm1pbmUgd2hpY2ggZGF0YSBieXRlIHRoZSBmaW5nZXIgc3RhdHVzIGlzIGluICovCisJCXJlZyA9IGZpbmdlci80OworCQkvKiBiaXQgc2hpZnQgdG8gZ2V0IGZpbmdlcidzIHN0YXR1cyAqLworCQlmaW5nZXJfc2hpZnQJPSAoZmluZ2VyICUgNCkgKiAyOworCQlmaW5nZXJfc3RhdHVzCT0gKHZhbHVlc1tyZWddID4+IGZpbmdlcl9zaGlmdCkgJiAzOworCQkvKgorCQkgKiBpZiBmaW5nZXIgc3RhdHVzIGluZGljYXRlcyBhIGZpbmdlciBpcyBwcmVzZW50IHRoZW4KKwkJICogcmVhZCB0aGUgZmluZ2VyIGRhdGEgYW5kIHJlcG9ydCBpdAorCQkgKi8KKwkJaWYgKGZpbmdlcl9zdGF0dXMgPT0gMSB8fCBmaW5nZXJfc3RhdHVzID09IDIpIHsKKwkJCS8qIFJlYWQgdGhlIGZpbmdlciBkYXRhICovCisJCQlkYXRhX29mZnNldCA9IGRhdGFfYmFzZV9hZGRyICsKKwkJCQkJKChmaW5nZXIgKiBkYXRhX3JlZ19ibGtfc2l6ZSkgKworCQkJCQlmaW5nZXJfcmVnaXN0ZXJzKTsKKwkJCXJldHZhbCA9IHN5bmFwdGljc19ybWk0X2kyY19ibG9ja19yZWFkKHBkYXRhLAorCQkJCQkJZGF0YV9vZmZzZXQsIGRhdGEsCisJCQkJCQlkYXRhX3JlZ19ibGtfc2l6ZSk7CisJCQlpZiAocmV0dmFsICE9IGRhdGFfcmVnX2Jsa19zaXplKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczpyZWFkIGRhdGEgZmFpbGVkXG4iLAorCQkJCQkJCQlfX2Z1bmNfXyk7CisJCQkJcmV0dXJuIDA7CisJCQl9IGVsc2UgeworCQkJCXhbdG91Y2hfY291bnRdCT0KKwkJCQkJKGRhdGFbMF0gPDwgNCkgfCAoZGF0YVsyXSAmIE1BU0tfNEJJVCk7CisJCQkJeVt0b3VjaF9jb3VudF0JPQorCQkJCQkoZGF0YVsxXSA8PCA0KSB8CisJCQkJCSgoZGF0YVsyXSA+PiA0KSAmIE1BU0tfNEJJVCk7CisJCQkJd3lbdG91Y2hfY291bnRdCT0KKwkJCQkJCShkYXRhWzNdID4+IDQpICYgTUFTS180QklUOworCQkJCXd4W3RvdWNoX2NvdW50XQk9CisJCQkJCQkoZGF0YVszXSAmIE1BU0tfNEJJVCk7CisKKwkJCQlpZiAocGRhdGEtPmJvYXJkLT54X2ZsaXApCisJCQkJCXhbdG91Y2hfY291bnRdID0KKwkJCQkJCXBkYXRhLT5zZW5zb3JfbWF4X3ggLQorCQkJCQkJCQl4W3RvdWNoX2NvdW50XTsKKwkJCQlpZiAocGRhdGEtPmJvYXJkLT55X2ZsaXApCisJCQkJCXlbdG91Y2hfY291bnRdID0KKwkJCQkJCXBkYXRhLT5zZW5zb3JfbWF4X3kgLQorCQkJCQkJCQl5W3RvdWNoX2NvdW50XTsKKwkJCX0KKwkJCS8qIG51bWJlciBvZiBhY3RpdmUgdG91Y2ggcG9pbnRzICovCisJCQl0b3VjaF9jb3VudCsrOworCQl9CisJfQorCisJLyogcmVwb3J0IHRvIGlucHV0IHN1YnN5c3RlbSAqLworCWlmICh0b3VjaF9jb3VudCkgeworCQlmb3IgKGZpbmdlciA9IDA7IGZpbmdlciA8IHRvdWNoX2NvdW50OyBmaW5nZXIrKykgeworCQkJaW5wdXRfcmVwb3J0X2FicyhwZGF0YS0+aW5wdXRfZGV2LCBBQlNfTVRfVE9VQ0hfTUFKT1IsCisJCQkJCQltYXgod3hbZmluZ2VyXSAsIHd5W2Zpbmdlcl0pKTsKKwkJCWlucHV0X3JlcG9ydF9hYnMocGRhdGEtPmlucHV0X2RldiwgQUJTX01UX1BPU0lUSU9OX1gsCisJCQkJCQkJCXhbZmluZ2VyXSk7CisJCQlpbnB1dF9yZXBvcnRfYWJzKHBkYXRhLT5pbnB1dF9kZXYsIEFCU19NVF9QT1NJVElPTl9ZLAorCQkJCQkJCQl5W2Zpbmdlcl0pOworCQkJaW5wdXRfbXRfc3luYyhwZGF0YS0+aW5wdXRfZGV2KTsKKwkJfQorCX0gZWxzZQorCQlpbnB1dF9tdF9zeW5jKHBkYXRhLT5pbnB1dF9kZXYpOworCisJLyogc3luYyBhZnRlciBncm91cHMgb2YgZXZlbnRzICovCisJaW5wdXRfc3luYyhwZGF0YS0+aW5wdXRfZGV2KTsKKwkvKiByZXR1cm4gdGhlIG51bWJlciBvZiB0b3VjaCBwb2ludHMgKi8KKwlyZXR1cm4gdG91Y2hfY291bnQ7Cit9CisKKy8qKgorICogc3luYXB0aWNzX3JtaTRfcmVwb3J0X2RldmljZSgpIC0gcmVwb3J0cyB0aGUgcm1pNCBkZXZpY2UKKyAqIEBwZGF0YTogcG9pbnRlciB0byBzeW5hcHRpY3Nfcm1pNF9kYXRhIHN0cnVjdHVyZQorICogQHJmaTogcG9pbnRlciB0byBzeW5hcHRpY3Nfcm1pNF9mbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjYWxsIHRoZSByZXBvcnQgZnVuY3Rpb24gb2YgdGhlIHJtaTQgZGV2aWNlLgorICovCitzdGF0aWMgaW50IHN5bmFwdGljc19ybWk0X3JlcG9ydF9kZXZpY2Uoc3RydWN0IHN5bmFwdGljc19ybWk0X2RhdGEgKnBkYXRhLAorCQkJCQlzdHJ1Y3Qgc3luYXB0aWNzX3JtaTRfZm4gKnJmaSkKK3sKKwlpbnQgdG91Y2ggPSAwOworCXN0cnVjdAlpMmNfY2xpZW50ICpjbGllbnQgPSBwZGF0YS0+aTJjX2NsaWVudDsKKwlzdGF0aWMgaW50IG51bV9lcnJvcl9yZXBvcnRzOworCWlmIChyZmktPmZuX251bWJlciAhPSBTWU5BUFRJQ1NfUk1JNF9UT1VDSFBBRF9GVU5DX05VTSkgeworCQludW1fZXJyb3JfcmVwb3J0cysrOworCQlpZiAobnVtX2Vycm9yX3JlcG9ydHMgPCBNQVhfRVJST1JfUkVQT1JUKQorCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczpyZXBvcnQgbm90IHN1cHBvcnRlZFxuIiwKKwkJCQkJCQkJX19mdW5jX18pOworCX0gZWxzZQorCQl0b3VjaCA9IHN5bnBhdGljc19ybWk0X3RvdWNocGFkX3JlcG9ydChwZGF0YSwgcmZpKTsKKwlyZXR1cm4gdG91Y2g7Cit9CisvKioKKyAqIHN5bmFwdGljc19ybWk0X3NlbnNvcl9yZXBvcnQoKSAtIHJlcG9ydHMgdG8gaW5wdXQgc3Vic3lzdGVtCisgKiBAcGRhdGE6IHBvaW50ZXIgdG8gc3luYXB0aWNzX3JtaTRfZGF0YSBzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVhZHMgaW4gYWxsIGRhdGEgc291cmNlcyBhbmQgcmVwb3J0cworICogdGhlbSB0byB0aGUgaW5wdXQgc3Vic3lzdGVtLgorICovCitzdGF0aWMgaW50IHN5bmFwdGljc19ybWk0X3NlbnNvcl9yZXBvcnQoc3RydWN0IHN5bmFwdGljc19ybWk0X2RhdGEgKnBkYXRhKQoreworCXVuc2lnbmVkIGNoYXIJaW50cl9zdGF0dXNbNF07CisJLyogbnVtYmVyIG9mIHRvdWNoIHBvaW50cyAtIGZpbmdlcnMgb3IgYnV0dG9ucyAqLworCWludCB0b3VjaCA9IDA7CisJdW5zaWduZWQgaW50IHJldHZhbDsKKwlzdHJ1Y3Qgc3luYXB0aWNzX3JtaTRfZm4JCSpyZmk7CisJc3RydWN0IHN5bmFwdGljc19ybWk0X2RldmljZV9pbmZvCSpybWk7CisJc3RydWN0CWkyY19jbGllbnQgKmNsaWVudCA9IHBkYXRhLT5pMmNfY2xpZW50OworCisJLyoKKwkgKiBHZXQgdGhlIGludGVycnVwdCBzdGF0dXMgZnJvbSB0aGUgZnVuY3Rpb24gJDAxCisJICogY29udHJvbCByZWdpc3RlcisxIHRvIGZpbmQgd2hpY2ggc291cmNlKHMpIHdlcmUgaW50ZXJydXB0aW5nCisJICogc28gd2UgY2FuIHJlYWQgdGhlIGRhdGEgZnJvbSB0aGUgc291cmNlKHMpICgyRCBzZW5zb3IsIGJ1dHRvbnMuLikKKwkgKi8KKwlyZXR2YWwgPSBzeW5hcHRpY3Nfcm1pNF9pMmNfYmxvY2tfcmVhZChwZGF0YSwKKwkJCQkJcGRhdGEtPmZuMDFfZGF0YV9iYXNlX2FkZHIgKyAxLAorCQkJCQlpbnRyX3N0YXR1cywKKwkJCQkJcGRhdGEtPm51bWJlcl9vZl9pbnRlcnJ1cHRfcmVnaXN0ZXIpOworCWlmIChyZXR2YWwgIT0gcGRhdGEtPm51bWJlcl9vZl9pbnRlcnJ1cHRfcmVnaXN0ZXIpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCQkJImNvdWxkIG5vdCByZWFkIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXJzXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qCisJICogY2hlY2sgZWFjaCBmdW5jdGlvbiB0aGF0IGhhcyBkYXRhIHNvdXJjZXMgYW5kIGlmIHRoZSBpbnRlcnJ1cHQgZm9yCisJICogdGhhdCB0cmlnZ2VyZWQgdGhlbiBjYWxsIHRoYXQgUk1JNCBmdW5jdGlvbnMgcmVwb3J0KCkgZnVuY3Rpb24gdG8KKwkgKiBnYXRoZXIgZGF0YSBhbmQgcmVwb3J0IGl0IHRvIHRoZSBpbnB1dCBzdWJzeXN0ZW0KKwkgKi8KKwlybWkgPSAmKHBkYXRhLT5ybWk0X21vZF9pbmZvKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJmaSwgJnJtaS0+c3VwcG9ydF9mbl9saXN0LCBsaW5rKSB7CisJCWlmIChyZmktPm51bV9vZl9kYXRhX3NvdXJjZXMpIHsKKwkJCWlmIChpbnRyX3N0YXR1c1tyZmktPmluZGV4X3RvX2ludHJfcmVnXSAmCisJCQkJCQkJcmZpLT5pbnRyX21hc2spCisJCQkJdG91Y2ggPSBzeW5hcHRpY3Nfcm1pNF9yZXBvcnRfZGV2aWNlKHBkYXRhLAorCQkJCQkJCQkJcmZpKTsKKwkJfQorCX0KKwkvKiByZXR1cm4gdGhlIG51bWJlciBvZiB0b3VjaCBwb2ludHMgKi8KKwlyZXR1cm4gdG91Y2g7Cit9CisKKy8qKgorICogc3luYXB0aWNzX3JtaTRfaXJxKCkgLSB0aHJlYWQgZnVuY3Rpb24gZm9yIHJtaTQgYXR0ZW50aW9uIGxpbmUKKyAqIEBpcnE6IGlycSB2YWx1ZQorICogQGRhdGE6IHZvaWQgcG9pbnRlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgaW50ZXJydXB0IHRocmVhZCBmdW5jdGlvbi4gSXQganVzdCBub3RpZmllcyB0aGUKKyAqIGFwcGxpY2F0aW9uIGxheWVyIHRoYXQgYXR0ZW50aW9uIGlzIHJlcXVpcmVkLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3Qgc3luYXB0aWNzX3JtaTRfaXJxKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHN5bmFwdGljc19ybWk0X2RhdGEgKnBkYXRhID0gZGF0YTsKKwlpbnQgdG91Y2hfY291bnQ7CisJZG8geworCQl0b3VjaF9jb3VudCA9IHN5bmFwdGljc19ybWk0X3NlbnNvcl9yZXBvcnQocGRhdGEpOworCQlpZiAodG91Y2hfY291bnQpCisJCQl3YWl0X2V2ZW50X3RpbWVvdXQocGRhdGEtPndhaXQsIHBkYXRhLT50b3VjaF9zdG9wcGVkLAorCQkJCQkJCW1zZWNzX3RvX2ppZmZpZXMoMSkpOworCQllbHNlCisJCQlicmVhazsKKwl9IHdoaWxlICghcGRhdGEtPnRvdWNoX3N0b3BwZWQpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqCisgKiBzeW5wYXRpY3Nfcm1pNF90b3VjaHBhZF9kZXRlY3QoKSAtIGRldGVjdHMgdGhlIHJtaTQgdG91Y2hwYWQgZGV2aWNlCisgKiBAcGRhdGE6IHBvaW50ZXIgdG8gc3luYXB0aWNzX3JtaTRfZGF0YSBzdHJ1Y3R1cmUKKyAqIEByZmk6IHBvaW50ZXIgdG8gc3luYXB0aWNzX3JtaTRfZm4gc3RydWN0dXJlCisgKiBAZmQ6IHBvaW50ZXIgdG8gc3luYXB0aWNzX3JtaTRfZm5fZGVzYyBzdHJ1Y3R1cmUKKyAqIEBpbnRlcnJ1cHRjb3VudDogY291bnQgdGhlIG51bWJlciBvZiBpbnRlcnJ1cHRzCisgKgorICogVGhpcyBmdW5jdGlvbiBjYWxscyB0byBkZXRlY3RzIHRoZSBybWk0IHRvdWNocGFkIGRldmljZQorICovCitzdGF0aWMgaW50IHN5bnBhdGljc19ybWk0X3RvdWNocGFkX2RldGVjdChzdHJ1Y3Qgc3luYXB0aWNzX3JtaTRfZGF0YSAqcGRhdGEsCisJCQkJCXN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9mbiAqcmZpLAorCQkJCQlzdHJ1Y3Qgc3luYXB0aWNzX3JtaTRfZm5fZGVzYyAqZmQsCisJCQkJCXVuc2lnbmVkIGludCBpbnRlcnJ1cHRjb3VudCkKK3sKKwl1bnNpZ25lZCBjaGFyCXF1ZXJpZXNbUVVFUllfTEVOXTsKKwl1bnNpZ25lZCBzaG9ydAlpbnRyX29mZnNldDsKKwl1bnNpZ25lZCBjaGFyCWFic19kYXRhX3NpemU7CisJdW5zaWduZWQgY2hhcglhYnNfZGF0YV9ibGtfc2l6ZTsKKwl1bnNpZ25lZCBjaGFyCWVncl8wLCBlZ3JfMTsKKwl1bnNpZ25lZCBpbnQJYWxsX2RhdGFfYmxrX3NpemU7CisJaW50CWhhc19waW5jaCwgaGFzX2ZsaWNrLCBoYXNfdGFwOworCWludAloYXNfdGFwYW5kaG9sZCwgaGFzX2RvdWJsZXRhcDsKKwlpbnQJaGFzX2Vhcmx5dGFwLCBoYXNfcHJlc3M7CisJaW50CWhhc19wYWxtZGV0ZWN0LCBoYXNfcm90YXRlOworCWludAloYXNfcmVsOworCWludAlpOworCWludAlyZXR2YWw7CisJc3RydWN0CWkyY19jbGllbnQgKmNsaWVudCA9IHBkYXRhLT5pMmNfY2xpZW50OworCisJcmZpLT5mbl9kZXNjLnF1ZXJ5X2Jhc2VfYWRkcgk9IGZkLT5xdWVyeV9iYXNlX2FkZHI7CisJcmZpLT5mbl9kZXNjLmRhdGFfYmFzZV9hZGRyCT0gZmQtPmRhdGFfYmFzZV9hZGRyOworCXJmaS0+Zm5fZGVzYy5pbnRyX3NyY19jb3VudAk9IGZkLT5pbnRyX3NyY19jb3VudDsKKwlyZmktPmZuX2Rlc2MuZm5fbnVtYmVyCQk9IGZkLT5mbl9udW1iZXI7CisJcmZpLT5mbl9udW1iZXIJCQk9IGZkLT5mbl9udW1iZXI7CisJcmZpLT5udW1fb2ZfZGF0YV9zb3VyY2VzCT0gZmQtPmludHJfc3JjX2NvdW50OworCXJmaS0+Zm5fZGVzYy5jdHJsX2Jhc2VfYWRkcgk9IGZkLT5jdHJsX2Jhc2VfYWRkcjsKKwlyZmktPmZuX2Rlc2MuY21kX2Jhc2VfYWRkcgk9IGZkLT5jbWRfYmFzZV9hZGRyOworCisJLyoKKwkgKiBuZWVkIHRvIGdldCBudW1iZXIgb2YgZmluZ2VycyBzdXBwb3J0ZWQsIGRhdGEgc2l6ZSwgZXRjLgorCSAqIHRvIGJlIHVzZWQgd2hlbiBnZXR0aW5nIGRhdGEgc2luY2UgdGhlIG51bWJlciBvZiByZWdpc3RlcnMgdG8KKwkgKiByZWFkIGRlcGVuZHMgb24gdGhlIG51bWJlciBvZiBmaW5nZXJzIHN1cHBvcnRlZCBhbmQgZGF0YSBzaXplLgorCSAqLworCXJldHZhbCA9IHN5bmFwdGljc19ybWk0X2kyY19ibG9ja19yZWFkKHBkYXRhLCBmZC0+cXVlcnlfYmFzZV9hZGRyLAorCQkJCQkJCXF1ZXJpZXMsCisJCQkJCQkJc2l6ZW9mKHF1ZXJpZXMpKTsKKwlpZiAocmV0dmFsICE9IHNpemVvZihxdWVyaWVzKSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOnJlYWQgZnVuY3Rpb24gcXVlcnkgcmVnaXN0ZXJzXG4iLAorCQkJCQkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJLyoKKwkgKiAyRCBkYXRhIHNvdXJjZXMgaGF2ZSBvbmx5IDMgYml0cyBmb3IgdGhlIG51bWJlciBvZiBmaW5nZXJzCisJICogc3VwcG9ydGVkIC0gc28gdGhlIGVuY29kaW5nIGlzIGEgYml0IHdpZXJkLgorCSAqLworCWlmICgocXVlcmllc1sxXSAmIE1BU0tfM0JJVCkgPD0gNCkKKwkJLyogYWRkIDEgc2luY2UgemVybyBiYXNlZCAqLworCQlyZmktPm51bV9vZl9kYXRhX3BvaW50cyA9IChxdWVyaWVzWzFdICYgTUFTS18zQklUKSArIDE7CisJZWxzZSB7CisJCS8qCisJCSAqIGEgdmFsdWUgb2YgNSBpcyB1cCB0byAxMCBmaW5nZXJzIC0gNiBhbmQgNyBhcmUgcmVzZXJ2ZWQKKwkJICogKHNob3VsZG4ndCBnZXQgdGhlc2UgaSBpbnQgcmV0dmFsO24gYSBub3JtYWwgMkQgc291cmNlKS4KKwkJICovCisJCWlmICgocXVlcmllc1sxXSAmIE1BU0tfM0JJVCkgPT0gNSkKKwkJCXJmaS0+bnVtX29mX2RhdGFfcG9pbnRzID0gMTA7CisJfQorCS8qIE5lZWQgdG8gZ2V0IGludGVycnVwdCBpbmZvIGZvciBoYW5kbGluZyBpbnRlcnJ1cHRzICovCisJcmZpLT5pbmRleF90b19pbnRyX3JlZyA9IChpbnRlcnJ1cHRjb3VudCArIDcpLzg7CisJaWYgKHJmaS0+aW5kZXhfdG9faW50cl9yZWcgIT0gMCkKKwkJcmZpLT5pbmRleF90b19pbnRyX3JlZyAtPSAxOworCS8qCisJICogbG9vcCB0aHJvdWdoIGludGVycnVwdHMgZm9yIGVhY2ggc291cmNlIGluIGZuICQxMQorCSAqIGFuZCBvciBpbiBhIGJpdCB0byB0aGUgaW50ZXJydXB0IG1hc2sgZm9yIGVhY2guCisJICovCisJaW50cl9vZmZzZXQgPSBpbnRlcnJ1cHRjb3VudCAlIDg7CisJcmZpLT5pbnRyX21hc2sgPSAwOworCWZvciAoaSA9IGludHJfb2Zmc2V0OworCQlpIDwgKChmZC0+aW50cl9zcmNfY291bnQgJiBNQVNLXzNCSVQpICsgaW50cl9vZmZzZXQpOyBpKyspCisJCXJmaS0+aW50cl9tYXNrIHw9IDEgPDwgaTsKKworCS8qIFNpemUgb2YganVzdCB0aGUgYWJzb2x1dGUgZGF0YSBmb3Igb25lIGZpbmdlciAqLworCWFic19kYXRhX3NpemUJPSBxdWVyaWVzWzVdICYgTUFTS18yQklUOworCS8qIE9uZSBlYWNoIGZvciBYIGFuZCBZLCBvbmUgZm9yIExTQiBmb3IgWCAmIFksIG9uZSBmb3IgVywgb25lIGZvciBaICovCisJYWJzX2RhdGFfYmxrX3NpemUgPSAzICsgKDIgKiAoYWJzX2RhdGFfc2l6ZSA9PSAwID8gMSA6IDApKTsKKwlyZmktPnNpemVfb2ZfZGF0YV9yZWdpc3Rlcl9ibG9jayA9IGFic19kYXRhX2Jsa19zaXplOworCisJLyoKKwkgKiBuZWVkIHRvIGRldGVybWluZSB0aGUgc2l6ZSBvZiBkYXRhIHRvIHJlYWQgLSB0aGlzIGRlcGVuZHMgb24KKwkgKiBjb25kaXRpb25zIHN1Y2ggYXMgd2hldGhlciBSZWxhdGl2ZSBkYXRhIGlzIHJlcG9ydGVkIGFuZCBpZiBHZXN0dXJlCisJICogZGF0YSBpcyByZXBvcnRlZC4KKwkgKi8KKwllZ3JfMCA9IHF1ZXJpZXNbN107CisJZWdyXzEgPSBxdWVyaWVzWzhdOworCisJLyoKKwkgKiBHZXQgaW5mbyBhYm91dCB3aGF0IEVHUiBkYXRhIGlzIHN1cHBvcnRlZCwgd2hldGhlciBpdCBoYXMKKwkgKiBSZWxhdGl2ZSBkYXRhIHN1cHBvcnRlZCwgZXRjLgorCSAqLworCWhhc19waW5jaAk9IGVncl8wICYgSEFTX1BJTkNIOworCWhhc19mbGljawk9IGVncl8wICYgSEFTX0ZMSUNLOworCWhhc190YXAJCT0gZWdyXzAgJiBIQVNfVEFQOworCWhhc19lYXJseXRhcAk9IGVncl8wICYgSEFTX0VBUkxZVEFQOworCWhhc19wcmVzcwk9IGVncl8wICYgSEFTX1BSRVNTOworCWhhc19yb3RhdGUJPSBlZ3JfMSAmIEhBU19ST1RBVEU7CisJaGFzX3JlbAkJPSBxdWVyaWVzWzFdICYgSEFTX1JFTEVBU0U7CisJaGFzX3RhcGFuZGhvbGQJPSBlZ3JfMCAmIEhBU19UQVBBTkRIT0xEOworCWhhc19kb3VibGV0YXAJPSBlZ3JfMCAmIEhBU19ET1VCTEVUQVA7CisJaGFzX3BhbG1kZXRlY3QJPSBlZ3JfMSAmIEhBU19QQUxNREVURUNUOworCisJLyoKKwkgKiBTaXplIG9mIGFsbCBkYXRhIGluY2x1ZGluZyBmaW5nZXIgc3RhdHVzLCBhYnNvbHV0ZSBkYXRhIGZvciBlYWNoCisJICogZmluZ2VyLCByZWxhdGl2ZSBkYXRhIGFuZCBFR1IgZGF0YQorCSAqLworCWFsbF9kYXRhX2Jsa19zaXplID0KKwkJLyogZmluZ2VyIHN0YXR1cywgZm91ciBmaW5nZXJzIHBlciByZWdpc3RlciAqLworCQkoKHJmaS0+bnVtX29mX2RhdGFfcG9pbnRzICsgMykgLyA0KSArCisJCS8qIGFic29sdXRlIGRhdGEsIHBlciBmaW5nZXIgdGltZXMgbnVtYmVyIG9mIGZpbmdlcnMgKi8KKwkJKGFic19kYXRhX2Jsa19zaXplICogcmZpLT5udW1fb2ZfZGF0YV9wb2ludHMpICsKKwkJLyoKKwkJICogdHdvIHJlbGF0aXZlIHJlZ2lzdGVycyAoaWYgcmVsYXRpdmUgaXMgYmVpbmcgcmVwb3J0ZWQpCisJCSAqLworCQkyICogaGFzX3JlbCArCisJCS8qCisJCSAqIEYxMV8yRF9kYXRhOCBpcyBvbmx5IHByZXNlbnQgaWYgdGhlIGVncl8wCisJCSAqIHJlZ2lzdGVyIGlzIG5vbi16ZXJvLgorCQkgKi8KKwkJISEoZWdyXzApICsKKwkJLyoKKwkJICogRjExXzJEX2RhdGE5IGlzIG9ubHkgcHJlc2VudCBpZiBlaXRoZXIgZWdyXzAgb3IKKwkJICogZWdyXzEgcmVnaXN0ZXJzIGFyZSBub24temVyby4KKwkJICovCisJCShlZ3JfMCB8fCBlZ3JfMSkgKworCQkvKgorCQkgKiBGMTFfMkRfZGF0YTEwIGlzIG9ubHkgcHJlc2VudCBpZiBFR1JfUElOQ0ggb3IgRUdSX0ZMSUNLIG9mCisJCSAqIGVncl8wIHJlcG9ydHMgYXMgMS4KKwkJICovCisJCSEhKGhhc19waW5jaCB8IGhhc19mbGljaykgKworCQkvKgorCQkgKiBGMTFfMkRfZGF0YTExIGFuZCBGMTFfMkRfZGF0YTEyIGFyZSBvbmx5IHByZXNlbnQgaWYKKwkJICogRUdSX0ZMSUNLIG9mIGVncl8wIHJlcG9ydHMgYXMgMS4KKwkJICovCisJCTIgKiAhIShoYXNfZmxpY2spOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogc3lucGF0aWNzX3JtaTRfdG91Y2hwYWRfY29uZmlnKCkgLSBjb25maXVyZXMgdGhlIHJtaTQgdG91Y2hwYWQgZGV2aWNlCisgKiBAcGRhdGE6IHBvaW50ZXIgdG8gc3luYXB0aWNzX3JtaTRfZGF0YSBzdHJ1Y3R1cmUKKyAqIEByZmk6IHBvaW50ZXIgdG8gc3luYXB0aWNzX3JtaTRfZm4gc3RydWN0dXJlCisgKgorICogVGhpcyBmdW5jdGlvbiBjYWxscyB0byBjb25maXVyZXMgdGhlIHJtaTQgdG91Y2hwYWQgZGV2aWNlCisgKi8KK2ludCBzeW5wYXRpY3Nfcm1pNF90b3VjaHBhZF9jb25maWcoc3RydWN0IHN5bmFwdGljc19ybWk0X2RhdGEgKnBkYXRhLAorCQkJCQkJc3RydWN0IHN5bmFwdGljc19ybWk0X2ZuICpyZmkpCit7CisJLyoKKwkgKiBGb3IgdGhlIGRhdGEgc291cmNlIC0gcHJpbnQgaW5mbyBhbmQgZG8gYW55CisJICogc291cmNlIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24uCisJICovCisJdW5zaWduZWQgY2hhciBkYXRhW0JVRl9MRU5dOworCWludCByZXR2YWwgPSAwOworCXN0cnVjdAlpMmNfY2xpZW50ICpjbGllbnQgPSBwZGF0YS0+aTJjX2NsaWVudDsKKworCS8qIEdldCBhbmQgcHJpbnQgc29tZSBpbmZvIGFib3V0IHRoZSBkYXRhIHNvdXJjZS4uLiAqLworCS8qIFRvIFF1ZXJ5IDJEIGRldmljZXMgd2UgbmVlZCB0byByZWFkIGZyb20gdGhlIGFkZHJlc3Mgb2J0YWluZWQKKwkgKiBmcm9tIHRoZSBmdW5jdGlvbiBkZXNjcmlwdG9yIHN0b3JlZCBpbiB0aGUgUk1JIGZ1bmN0aW9uIGluZm8uCisJICovCisJcmV0dmFsID0gc3luYXB0aWNzX3JtaTRfaTJjX2Jsb2NrX3JlYWQocGRhdGEsCisJCQkJCQlyZmktPmZuX2Rlc2MucXVlcnlfYmFzZV9hZGRyLAorCQkJCQkJZGF0YSwgUVVFUllfTEVOKTsKKwlpZiAocmV0dmFsICE9IFFVRVJZX0xFTikKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczpyZWFkIHF1ZXJ5IHJlZ2lzdGVycyBmYWlsZWRcbiIsCisJCQkJCQkJCV9fZnVuY19fKTsKKwllbHNlIHsKKwkJcmV0dmFsID0gc3luYXB0aWNzX3JtaTRfaTJjX2Jsb2NrX3JlYWQocGRhdGEsCisJCQkJCQlyZmktPmZuX2Rlc2MuY3RybF9iYXNlX2FkZHIsCisJCQkJCQlkYXRhLCBEQVRBX0JVRl9MRU4pOworCQlpZiAocmV0dmFsICE9IERBVEFfQlVGX0xFTikgeworCQkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCQkJIiVzOnJlYWQgY29udHJvbCByZWdpc3RlcnMgZmFpbGVkXG4iLAorCQkJCQkJCQlfX2Z1bmNfXyk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJCS8qIFN0b3JlIHRoZXNlIGZvciB1c2UgbGF0ZXIqLworCQlwZGF0YS0+c2Vuc29yX21heF94ID0gKChkYXRhWzZdICYgTUFTS184QklUKSA8PCAwKSB8CisJCQkJCQkoKGRhdGFbN10gJiBNQVNLXzRCSVQpIDw8IDgpOworCQlwZGF0YS0+c2Vuc29yX21heF95ID0gKChkYXRhWzhdICYgTUFTS181QklUKSA8PCAwKSB8CisJCQkJCQkoKGRhdGFbOV0gJiBNQVNLXzRCSVQpIDw8IDgpOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIHN5bmFwdGljc19ybWk0X2kyY19xdWVyeV9kZXZpY2UoKSAtIHF1ZXJ5IHRoZSBybWk0IGRldmljZQorICogQHBkYXRhOiBwb2ludGVyIHRvIHN5bmFwdGljc19ybWk0X2RhdGEgc3RydWN0dXJlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHF1ZXJ5IHRoZSBybWk0IGRldmljZS4KKyAqLworc3RhdGljIGludCBzeW5hcHRpY3Nfcm1pNF9pMmNfcXVlcnlfZGV2aWNlKHN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9kYXRhICpwZGF0YSkKK3sKKwlpbnQgaTsKKwlpbnQgcmV0dmFsOworCXVuc2lnbmVkIGNoYXIgc3RkX3F1ZXJpZXNbU1REX1FVRVJZX0xFTl07CisJdW5zaWduZWQgY2hhciBpbnRyX2NvdW50ID0gMDsKKwlpbnQgZGF0YV9zb3VyY2VzID0gMDsKKwl1bnNpZ25lZCBpbnQgY3RybF9vZmZzZXQ7CisJc3RydWN0IHN5bmFwdGljc19ybWk0X2ZuICpyZmk7CisJc3RydWN0IHN5bmFwdGljc19ybWk0X2ZuX2Rlc2MJcm1pX2ZkOworCXN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9kZXZpY2VfaW5mbyAqcm1pOworCXN0cnVjdAlpMmNfY2xpZW50ICpjbGllbnQgPSBwZGF0YS0+aTJjX2NsaWVudDsKKworCS8qCisJICogaW5pdCB0aGUgcGh5c2ljYWwgZHJpdmVycyBSTUkgbW9kdWxlCisJICogaW5mbyBsaXN0IG9mIGZ1bmN0aW9ucworCSAqLworCUlOSVRfTElTVF9IRUFEKCZwZGF0YS0+cm1pNF9tb2RfaW5mby5zdXBwb3J0X2ZuX2xpc3QpOworCisJLyoKKwkgKiBSZWFkIHRoZSBQYWdlIERlc2NyaXB0b3IgVGFibGUgdG8gZGV0ZXJtaW5lIHdoYXQgZnVuY3Rpb25zCisJICogYXJlIHByZXNlbnQKKwkgKi8KKwlmb3IgKGkgPSBQRFRfU1RBUlRfU0NBTl9MT0NBVElPTjsgaSA+IFBEVF9FTkRfU0NBTl9MT0NBVElPTjsKKwkJCQkJCWkgLT0gUERUX0VOVFJZX1NJWkUpIHsKKwkJcmV0dmFsID0gc3luYXB0aWNzX3JtaTRfaTJjX2Jsb2NrX3JlYWQocGRhdGEsIGksCisJCQkJCQkodW5zaWduZWQgY2hhciAqKSZybWlfZmQsCisJCQkJCQlzaXplb2Yocm1pX2ZkKSk7CisJCWlmIChyZXR2YWwgIT0gc2l6ZW9mKHJtaV9mZCkpIHsKKwkJCS8qIGZhaWxlZCB0byByZWFkIG5leHQgUERUIGVudHJ5ICovCisJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiByZWFkIGVycm9yXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlyZmkgPSBOVUxMOworCQlpZiAocm1pX2ZkLmZuX251bWJlcikgeworCQkJc3dpdGNoIChybWlfZmQuZm5fbnVtYmVyICYgTUFTS184QklUKSB7CisJCQljYXNlIFNZTkFQVElDU19STUk0X0RFVklDRV9DT05UUk9MX0ZVTkNfTlVNOgorCQkJCXBkYXRhLT5mbjAxX3F1ZXJ5X2Jhc2VfYWRkciA9CisJCQkJCQlybWlfZmQucXVlcnlfYmFzZV9hZGRyOworCQkJCXBkYXRhLT5mbjAxX2N0cmxfYmFzZV9hZGRyID0KKwkJCQkJCXJtaV9mZC5jdHJsX2Jhc2VfYWRkcjsKKwkJCQlwZGF0YS0+Zm4wMV9kYXRhX2Jhc2VfYWRkciA9CisJCQkJCQlybWlfZmQuZGF0YV9iYXNlX2FkZHI7CisJCQkJYnJlYWs7CisJCQljYXNlIFNZTkFQVElDU19STUk0X1RPVUNIUEFEX0ZVTkNfTlVNOgorCQkJCWlmIChybWlfZmQuaW50cl9zcmNfY291bnQpIHsKKwkJCQkJcmZpID0ga21hbGxvYyhzaXplb2YoKnJmaSksCisJCQkJCQkJCUdGUF9LRVJORUwpOworCQkJCQlpZiAoIXJmaSkgeworCQkJCQkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCQkJCQkJIiVzOmttYWxsb2MgZmFpbGVkXG4iLAorCQkJCQkJCQlfX2Z1bmNfXyk7CisJCQkJCQkJcmV0dXJuIC1FTk9NRU07CisJCQkJCX0KKwkJCQkJcmV0dmFsID0gc3lucGF0aWNzX3JtaTRfdG91Y2hwYWRfZGV0ZWN0CisJCQkJCQkJCShwZGF0YSwJcmZpLAorCQkJCQkJCQkmcm1pX2ZkLAorCQkJCQkJCQlpbnRyX2NvdW50KTsKKwkJCQkJaWYgKHJldHZhbCA8IDApCisJCQkJCQlyZXR1cm4gcmV0dmFsOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIGludGVycnVwdCBjb3VudCBmb3IgbmV4dCBpdGVyYXRpb24gKi8KKwkJCWludHJfY291bnQgKz0gKHJtaV9mZC5pbnRyX3NyY19jb3VudCAmIE1BU0tfM0JJVCk7CisJCQkvKgorCQkJICogV2Ugb25seSB3YW50IHRvIGFkZCBmdW5jdGlvbnMgdG8gdGhlIGxpc3QKKwkJCSAqIHRoYXQgaGF2ZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGVtLgorCQkJICovCisJCQlpZiAocmZpICYmIHJtaV9mZC5pbnRyX3NyY19jb3VudCkgeworCQkJCS8qIGxpbmsgdGhpcyBmdW5jdGlvbiBpbmZvIHRvIHRoZSBSTUkgbW9kdWxlICovCisJCQkJbXV0ZXhfbG9jaygmKHBkYXRhLT5mbl9saXN0X211dGV4KSk7CisJCQkJbGlzdF9hZGRfdGFpbCgmcmZpLT5saW5rLAorCQkJCQkmcGRhdGEtPnJtaTRfbW9kX2luZm8uc3VwcG9ydF9mbl9saXN0KTsKKwkJCQltdXRleF91bmxvY2soJihwZGF0YS0+Zm5fbGlzdF9tdXRleCkpOworCQkJfQorCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIEEgemVybyBpbiB0aGUgZnVuY3Rpb24gbnVtYmVyCisJCQkgKiBzaWduYWxzIHRoZSBlbmQgb2YgdGhlIFBEVAorCQkJICovCisJCQlkZXZfZGJnKCZjbGllbnQtPmRldiwKKwkJCQkiJXM6ZW5kIG9mIFBEVFxuIiwgX19mdW5jX18pOworCQkJYnJlYWs7CisJCX0KKwl9CisJLyoKKwkgKiBjYWxjdWxhdGUgdGhlIGludGVycnVwdCByZWdpc3RlciBjb3VudCAtIHVzZWQgaW4gdGhlCisJICogSVNSIHRvIHJlYWQgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGludGVycnVwdCByZWdpc3RlcnMKKwkgKi8KKwlwZGF0YS0+bnVtYmVyX29mX2ludGVycnVwdF9yZWdpc3RlciA9IChpbnRyX2NvdW50ICsgNykgLyA4OworCS8qCisJICogRnVuY3Rpb24gJDAxIHdpbGwgYmUgdXNlZCB0byBxdWVyeSB0aGUgcHJvZHVjdCBwcm9wZXJ0aWVzLAorCSAqIGFuZCBwcm9kdWN0IElEICBzbyB3ZSBoYWQgdG8gcmVhZCB0aGUgUERUIGFib3ZlIGZpcnN0IHRvIGdldAorCSAqIHRoZSBGbiAkMDEgcXVlcnkgYWRkcmVzcyBhbmQgcHJpb3IgdG8gZmlsbGluZyBpbiB0aGUgcHJvZHVjdAorCSAqIGluZm8uIE5PVEU6IEV2ZW4gYW4gdW5mbGFzaGVkIGRldmljZSB3aWxsIHN0aWxsIGhhdmUgRk4gJDAxLgorCSAqLworCisJLyogTG9hZCB1cCB0aGUgc3RhbmRhcmQgcXVlcmllcyBhbmQgZ2V0IHRoZSBSTUk0IG1vZHVsZSBpbmZvICovCisJcmV0dmFsID0gc3luYXB0aWNzX3JtaTRfaTJjX2Jsb2NrX3JlYWQocGRhdGEsCisJCQkJCXBkYXRhLT5mbjAxX3F1ZXJ5X2Jhc2VfYWRkciwKKwkJCQkJc3RkX3F1ZXJpZXMsCisJCQkJCXNpemVvZihzdGRfcXVlcmllcykpOworCWlmIChyZXR2YWwgIT0gc2l6ZW9mKHN0ZF9xdWVyaWVzKSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOkZhaWxlZCByZWFkaW5nIHF1ZXJpZXNcbiIsCisJCQkJCQkJX19mdW5jX18pOworCQkgcmV0dXJuIC1FSU87CisJfQorCisJLyogQ3VycmVudGx5IHN1cHBvcnRlZCBSTUkgdmVyc2lvbiBpcyA0LjAgKi8KKwlwZGF0YS0+cm1pNF9tb2RfaW5mby52ZXJzaW9uX21ham9yCT0gNDsKKwlwZGF0YS0+cm1pNF9tb2RfaW5mby52ZXJzaW9uX21pbm9yCT0gMDsKKwkvKgorCSAqIGdldCBtYW51ZmFjdHVyZXIgaWQsIHByb2R1Y3RfcHJvcHMsIHByb2R1Y3QgaW5mbywKKwkgKiBkYXRlIGNvZGUsIHRlc3RlciBpZCwgc2VyaWFsIG51bSBhbmQgcHJvZHVjdCBpZCAobmFtZSkKKwkgKi8KKwlwZGF0YS0+cm1pNF9tb2RfaW5mby5tYW51ZmFjdHVyZXJfaWQJPSBzdGRfcXVlcmllc1swXTsKKwlwZGF0YS0+cm1pNF9tb2RfaW5mby5wcm9kdWN0X3Byb3BzCT0gc3RkX3F1ZXJpZXNbMV07CisJcGRhdGEtPnJtaTRfbW9kX2luZm8ucHJvZHVjdF9pbmZvWzBdCT0gc3RkX3F1ZXJpZXNbMl07CisJcGRhdGEtPnJtaTRfbW9kX2luZm8ucHJvZHVjdF9pbmZvWzFdCT0gc3RkX3F1ZXJpZXNbM107CisJLyogeWVhciAtIDIwMDEtMjAzMiAqLworCXBkYXRhLT5ybWk0X21vZF9pbmZvLmRhdGVfY29kZVswXQk9IHN0ZF9xdWVyaWVzWzRdICYgTUFTS181QklUOworCS8qIG1vbnRoIC0gMS0xMiAqLworCXBkYXRhLT5ybWk0X21vZF9pbmZvLmRhdGVfY29kZVsxXQk9IHN0ZF9xdWVyaWVzWzVdICYgTUFTS180QklUOworCS8qIGRheSAtIDEtMzEgKi8KKwlwZGF0YS0+cm1pNF9tb2RfaW5mby5kYXRlX2NvZGVbMl0JPSBzdGRfcXVlcmllc1s2XSAmIE1BU0tfNUJJVDsKKwlwZGF0YS0+cm1pNF9tb2RfaW5mby50ZXN0ZXJfaWQgPSAoKHN0ZF9xdWVyaWVzWzddICYgTUFTS183QklUKSA8PCA4KSB8CisJCQkJCQkoc3RkX3F1ZXJpZXNbOF0gJiBNQVNLXzdCSVQpOworCXBkYXRhLT5ybWk0X21vZF9pbmZvLnNlcmlhbF9udW1iZXIgPQorCQkoKHN0ZF9xdWVyaWVzWzldICYgTUFTS183QklUKSA8PCA4KSB8CisJCQkJKHN0ZF9xdWVyaWVzWzEwXSAmIE1BU0tfN0JJVCk7CisJbWVtY3B5KHBkYXRhLT5ybWk0X21vZF9pbmZvLnByb2R1Y3RfaWRfc3RyaW5nLCAmc3RkX3F1ZXJpZXNbMTFdLCAxMCk7CisKKwkvKiBDaGVjayBpZiB0aGlzIGlzIGEgU3luYXB0aWNzIGRldmljZSAtIHJlcG9ydCBpZiBub3QuICovCisJaWYgKHBkYXRhLT5ybWk0X21vZF9pbmZvLm1hbnVmYWN0dXJlcl9pZCAhPSAxKQorCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiBub24tU3luYXB0aWNzIG1mZyBpZDolZFxuIiwKKwkJCV9fZnVuY19fLCBwZGF0YS0+cm1pNF9tb2RfaW5mby5tYW51ZmFjdHVyZXJfaWQpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZmksICZwZGF0YS0+cm1pNF9tb2RfaW5mby5zdXBwb3J0X2ZuX2xpc3QsIGxpbmspCisJCWRhdGFfc291cmNlcyArPSByZmktPm51bV9vZl9kYXRhX3NvdXJjZXM7CisJaWYgKGRhdGFfc291cmNlcykgeworCQlybWkgPSAmKHBkYXRhLT5ybWk0X21vZF9pbmZvKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShyZmksICZybWktPnN1cHBvcnRfZm5fbGlzdCwgbGluaykgeworCQkJaWYgKHJmaS0+bnVtX29mX2RhdGFfc291cmNlcykgeworCQkJCWlmIChyZmktPmZuX251bWJlciA9PQorCQkJCQlTWU5BUFRJQ1NfUk1JNF9UT1VDSFBBRF9GVU5DX05VTSkgeworCQkJCQlyZXR2YWwgPSBzeW5wYXRpY3Nfcm1pNF90b3VjaHBhZF9jb25maWcKKwkJCQkJCQkJKHBkYXRhLCByZmkpOworCQkJCQlpZiAocmV0dmFsIDwgMCkKKwkJCQkJCXJldHVybiByZXR2YWw7CisJCQkJfSBlbHNlCisJCQkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJCQkJIiVzOmZuX251bWJlciBub3Qgc3VwcG9ydGVkXG4iLAorCQkJCQkJCQlfX2Z1bmNfXyk7CisJCQkJLyoKKwkJCQkgKiBUdXJuIG9uIGludGVycnVwdHMgZm9yIHRoaXMKKwkJCQkgKiBmdW5jdGlvbidzIGRhdGEgc291cmNlcy4KKwkJCQkgKi8KKwkJCQljdHJsX29mZnNldCA9IHBkYXRhLT5mbjAxX2N0cmxfYmFzZV9hZGRyICsgMSArCisJCQkJCQkJcmZpLT5pbmRleF90b19pbnRyX3JlZzsKKwkJCQlyZXR2YWwgPSBzeW5hcHRpY3Nfcm1pNF9pMmNfYnl0ZV93cml0ZShwZGF0YSwKKwkJCQkJCQljdHJsX29mZnNldCwKKwkJCQkJCQlyZmktPmludHJfbWFzayk7CisJCQkJaWYgKHJldHZhbCA8IDApCisJCQkJCXJldHVybiByZXR2YWw7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogc3luYXB0aWNzX3JtaTRfcHJvYmUoKSAtIEluaXRpYWx6ZSB0aGUgaTJjLWNsaWVudCB0b3VjaHNjcmVlbiBkcml2ZXIKKyAqIEBpMmM6IGkyYyBjbGllbnQgc3RydWN0dXJlIHBvaW50ZXIKKyAqIEBpZDppMmMgZGV2aWNlIGlkIHBvaW50ZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIGluc3RhbmNlCisgKiBkYXRhIGFuZCByZXF1ZXN0IHRoZSBpcnEgYW5kIHNldCB0aGUgaW5zdGFuY2UgZGF0YSBhcyB0aGUgY2xpZW50cworICogcGxhdGZvcm0gZGF0YSB0aGVuIHJlZ2lzdGVyIHRoZSBwaHlzaWNhbCBkcml2ZXIgd2hpY2ggd2lsbCBkbyBhIHNjYW4gb2YKKyAqIHRoZSBybWk0IFBoeXNpY2FsIERldmljZSBUYWJsZSBhbmQgZW51bWVyYXRlIGFueSBybWk0IGZ1bmN0aW9ucyB0aGF0CisgKiBoYXZlIGRhdGEgc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlbS4KKyAqLworc3RhdGljIGludCBfX2RldmluaXQgc3luYXB0aWNzX3JtaTRfcHJvYmUKKwkoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmRldl9pZCkKK3sKKwlpbnQgcmV0dmFsOworCXVuc2lnbmVkIGNoYXIgaW50cl9zdGF0dXNbNF07CisJc3RydWN0IHN5bmFwdGljc19ybWk0X2RhdGEgKnJtaTRfZGF0YTsKKwljb25zdCBzdHJ1Y3Qgc3luYXB0aWNzX3JtaTRfcGxhdGZvcm1fZGF0YSAqcGxhdGZvcm1kYXRhID0KKwkJCQkJCWNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwKKwkJCQkJSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImkyYyBzbWJ1cyBieXRlIGRhdGEgbm90IHN1cHBvcnRlZFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmICghcGxhdGZvcm1kYXRhKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXM6IG5vIHBsYXRmb3JtIGRhdGFcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIGluc3RhbmNlIGRhdGEgZm9yIHRoaXMgY2xpZW50ICovCisJcm1pNF9kYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHN5bmFwdGljc19ybWk0X2RhdGEpICogMiwKKwkJCQkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIXJtaTRfZGF0YSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiBubyBtZW1vcnkgYWxsb2NhdGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJtaTRfZGF0YS0+aW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKHJtaTRfZGF0YS0+aW5wdXRfZGV2ID09IE5VTEwpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczppbnB1dCBkZXZpY2UgYWxsb2MgZmFpbGVkXG4iLAorCQkJCQkJX19mdW5jX18pOworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlnb3RvIGVycl9pbnB1dDsKKwl9CisKKwlkZXZfc2V0X25hbWUoJmNsaWVudC0+ZGV2LCBwbGF0Zm9ybWRhdGEtPm5hbWUpOworCisJaWYgKHBsYXRmb3JtZGF0YS0+cmVndWxhdG9yX2VuKSB7CisJCXJtaTRfZGF0YS0+cmVndWxhdG9yID0gcmVndWxhdG9yX2dldCgmY2xpZW50LT5kZXYsICJ2LXRvdWNoIik7CisJCWlmIChJU19FUlIocm1pNF9kYXRhLT5yZWd1bGF0b3IpKSB7CisJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOmdldCByZWd1bGF0b3IgZmFpbGVkXG4iLAorCQkJCQkJCQlfX2Z1bmNfXyk7CisJCQlyZXR2YWwgPSBQVFJfRVJSKHJtaTRfZGF0YS0+cmVndWxhdG9yKTsKKwkJCWdvdG8gZXJyX3JlZ3VsYXRvcjsKKwkJfQorCQlyZWd1bGF0b3JfZW5hYmxlKHJtaTRfZGF0YS0+cmVndWxhdG9yKTsKKwl9CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZybWk0X2RhdGEtPndhaXQpOworCS8qCisJICogQ29weSBpMmNfY2xpZW50IHBvaW50ZXIgaW50byBSVElEJ3MgaTJjX2NsaWVudCBwb2ludGVyIGZvcgorCSAqIGxhdGVyIHVzZSBpbiBybWk0X3JlYWQsIHJtaTRfd3JpdGUsIGV0Yy4KKwkgKi8KKwlybWk0X2RhdGEtPmkyY19jbGllbnQJCT0gY2xpZW50OworCS8qIFNvIHdlIHNldCB0aGUgcGFnZSBjb3JyZWN0bHkgdGhlIGZpcnN0IHRpbWUgKi8KKwlybWk0X2RhdGEtPmN1cnJlbnRfcGFnZQkJPSBNQVNLXzE2QklUOworCXJtaTRfZGF0YS0+Ym9hcmQJCT0gcGxhdGZvcm1kYXRhOworCXJtaTRfZGF0YS0+dG91Y2hfc3RvcHBlZAk9IGZhbHNlOworCisJLyogaW5pdCB0aGUgbXV0ZXhlcyBmb3IgbWFpbnRhaW4gdGhlIGxpc3RzICovCisJbXV0ZXhfaW5pdCgmKHJtaTRfZGF0YS0+Zm5fbGlzdF9tdXRleCkpOworCW11dGV4X2luaXQoJihybWk0X2RhdGEtPnJtaTRfcGFnZV9tdXRleCkpOworCisJLyoKKwkgKiBSZWdpc3RlciBwaHlzaWNhbCBkcml2ZXIgLSB0aGlzIHdpbGwgY2FsbCB0aGUgZGV0ZWN0IGZ1bmN0aW9uIHRoYXQKKwkgKiB3aWxsIHRoZW4gc2NhbiB0aGUgZGV2aWNlIGFuZCBkZXRlcm1pbmUgdGhlIHN1cHBvcnRlZAorCSAqIHJtaTQgZnVuY3Rpb25zLgorCSAqLworCXJldHZhbCA9IHN5bmFwdGljc19ybWk0X2kyY19xdWVyeV9kZXZpY2Uocm1pNF9kYXRhKTsKKwlpZiAocmV0dmFsKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXM6IHJtaTQgcXVlcnkgZGV2aWNlIGZhaWxlZFxuIiwKKwkJCQkJCQlfX2Z1bmNfXyk7CisJCWdvdG8gZXJyX3F1ZXJ5X2RldjsKKwl9CisKKwkvKiBTdG9yZSB0aGUgaW5zdGFuY2UgZGF0YSBpbiB0aGUgaTJjX2NsaWVudCAqLworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHJtaTRfZGF0YSk7CisKKwkvKmluaXRpYWxpemUgdGhlIGlucHV0IGRldmljZSBwYXJhbWV0ZXJzICovCisJcm1pNF9kYXRhLT5pbnB1dF9kZXYtPm5hbWUJPSBEUklWRVJfTkFNRTsKKwlybWk0X2RhdGEtPmlucHV0X2Rldi0+cGh5cwk9ICJTeW5hcHRpY3NfQ2xlYXJwYWQiOworCXJtaTRfZGF0YS0+aW5wdXRfZGV2LT5pZC5idXN0eXBlID0gQlVTX0kyQzsKKwlybWk0X2RhdGEtPmlucHV0X2Rldi0+ZGV2LnBhcmVudCA9ICZjbGllbnQtPmRldjsKKwlpbnB1dF9zZXRfZHJ2ZGF0YShybWk0X2RhdGEtPmlucHV0X2Rldiwgcm1pNF9kYXRhKTsKKworCS8qIEluaXRpYWxpemUgdGhlIGZ1bmN0aW9uIGhhbmRsZXJzIGZvciBybWk0ICovCisJc2V0X2JpdChFVl9TWU4sIHJtaTRfZGF0YS0+aW5wdXRfZGV2LT5ldmJpdCk7CisJc2V0X2JpdChFVl9LRVksIHJtaTRfZGF0YS0+aW5wdXRfZGV2LT5ldmJpdCk7CisJc2V0X2JpdChFVl9BQlMsIHJtaTRfZGF0YS0+aW5wdXRfZGV2LT5ldmJpdCk7CisKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhybWk0X2RhdGEtPmlucHV0X2RldiwgQUJTX01UX1BPU0lUSU9OX1gsIDAsCisJCQkJCXJtaTRfZGF0YS0+c2Vuc29yX21heF94LCAwLCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhybWk0X2RhdGEtPmlucHV0X2RldiwgQUJTX01UX1BPU0lUSU9OX1ksIDAsCisJCQkJCXJtaTRfZGF0YS0+c2Vuc29yX21heF95LCAwLCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhybWk0X2RhdGEtPmlucHV0X2RldiwgQUJTX01UX1RPVUNIX01BSk9SLCAwLAorCQkJCQkJTUFYX1RPVUNIX01BSk9SLCAwLCAwKTsKKworCXJldHZhbCA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShybWk0X2RhdGEtPmlucHV0X2Rldik7CisJaWYgKHJldHZhbCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOmlucHV0IHJlZ2lzdGVyIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlnb3RvIGVycl9pbnB1dF9yZWdpc3RlcjsKKwl9CisKKwkvKiBDbGVhciBpbnRlcnJ1cHRzICovCisJc3luYXB0aWNzX3JtaTRfaTJjX2Jsb2NrX3JlYWQocm1pNF9kYXRhLAorCQkJcm1pNF9kYXRhLT5mbjAxX2RhdGFfYmFzZV9hZGRyICsgMSwgaW50cl9zdGF0dXMsCisJCQkJcm1pNF9kYXRhLT5udW1iZXJfb2ZfaW50ZXJydXB0X3JlZ2lzdGVyKTsKKwlyZXR2YWwgPSByZXF1ZXN0X3RocmVhZGVkX2lycShwbGF0Zm9ybWRhdGEtPmlycV9udW1iZXIsIE5VTEwsCisJCQkJCXN5bmFwdGljc19ybWk0X2lycSwKKwkJCQkJcGxhdGZvcm1kYXRhLT5pcnFfdHlwZSwKKwkJCQkJcGxhdGZvcm1kYXRhLT5uYW1lLCBybWk0X2RhdGEpOworCWlmIChyZXR2YWwpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczpVbmFibGUgdG8gZ2V0IGF0dG4gaXJxICVkXG4iLAorCQkJCV9fZnVuY19fLCBwbGF0Zm9ybWRhdGEtPmlycV9udW1iZXIpOworCQlnb3RvIGVycl9yZXF1ZXN0X2lycTsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworCitlcnJfcmVxdWVzdF9pcnE6CisJZnJlZV9pcnEocGxhdGZvcm1kYXRhLT5pcnFfbnVtYmVyLCBybWk0X2RhdGEpOworCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHJtaTRfZGF0YS0+aW5wdXRfZGV2KTsKK2Vycl9pbnB1dF9yZWdpc3RlcjoKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBOVUxMKTsKK2Vycl9xdWVyeV9kZXY6CisJaWYgKHBsYXRmb3JtZGF0YS0+cmVndWxhdG9yX2VuKSB7CisJCXJlZ3VsYXRvcl9kaXNhYmxlKHJtaTRfZGF0YS0+cmVndWxhdG9yKTsKKwkJcmVndWxhdG9yX3B1dChybWk0X2RhdGEtPnJlZ3VsYXRvcik7CisJfQorZXJyX3JlZ3VsYXRvcjoKKwlpbnB1dF9mcmVlX2RldmljZShybWk0X2RhdGEtPmlucHV0X2Rldik7CisJcm1pNF9kYXRhLT5pbnB1dF9kZXYgPSBOVUxMOworZXJyX2lucHV0OgorCWtmcmVlKHJtaTRfZGF0YSk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorLyoqCisgKiBzeW5hcHRpY3Nfcm1pNF9yZW1vdmUoKSAtIFJlbW92ZXMgdGhlIGkyYy1jbGllbnQgdG91Y2hzY3JlZW4gZHJpdmVyCisgKiBAY2xpZW50OiBpMmMgY2xpZW50IHN0cnVjdHVyZSBwb2ludGVyCisgKgorICogVGhpcyBmdW50aW9uIHVzZXMgdG8gcmVtb3ZlIHRoZSBpMmMtY2xpZW50CisgKiB0b3VjaHNjcmVlbiBkcml2ZXIgYW5kIHJldHVybnMgaW50ZWdlci4KKyAqLworc3RhdGljIGludCBfX2RldmV4aXQgc3luYXB0aWNzX3JtaTRfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHN5bmFwdGljc19ybWk0X2RhdGEgKnJtaTRfZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWNvbnN0IHN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHJtaTRfZGF0YS0+Ym9hcmQ7CisKKwlybWk0X2RhdGEtPnRvdWNoX3N0b3BwZWQgPSB0cnVlOworCXdha2VfdXAoJnJtaTRfZGF0YS0+d2FpdCk7CisJZnJlZV9pcnEocGRhdGEtPmlycV9udW1iZXIsIHJtaTRfZGF0YSk7CisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2Uocm1pNF9kYXRhLT5pbnB1dF9kZXYpOworCWlmIChwZGF0YS0+cmVndWxhdG9yX2VuKSB7CisJCXJlZ3VsYXRvcl9kaXNhYmxlKHJtaTRfZGF0YS0+cmVndWxhdG9yKTsKKwkJcmVndWxhdG9yX3B1dChybWk0X2RhdGEtPnJlZ3VsYXRvcik7CisJfQorCWtmcmVlKHJtaTRfZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorLyoqCisgKiBzeW5hcHRpY3Nfcm1pNF9zdXNwZW5kKCkgLSBzdXNwZW5kIHRoZSB0b3VjaCBzY3JlZW4gY29udHJvbGxlcgorICogQGRldjogcG9pbnRlciB0byBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogVGhpcyBmdW50aW9uIGlzIHVzZWQgdG8gc3VzcGVuZCB0aGUKKyAqIHRvdWNoIHBhbmVsIGNvbnRyb2xsZXIgYW5kIHJldHVybnMgaW50ZWdlcgorICovCitzdGF0aWMgaW50IHN5bmFwdGljc19ybWk0X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCS8qIFRvdWNoIHNsZWVwIG1vZGUgKi8KKwlpbnQgcmV0dmFsOworCXVuc2lnbmVkIGNoYXIgaW50cl9zdGF0dXM7CisJc3RydWN0IHN5bmFwdGljc19ybWk0X2RhdGEgKnJtaTRfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWNvbnN0IHN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHJtaTRfZGF0YS0+Ym9hcmQ7CisKKwlybWk0X2RhdGEtPnRvdWNoX3N0b3BwZWQgPSB0cnVlOworCWRpc2FibGVfaXJxKHBkYXRhLT5pcnFfbnVtYmVyKTsKKworCXJldHZhbCA9IHN5bmFwdGljc19ybWk0X2kyY19ibG9ja19yZWFkKHJtaTRfZGF0YSwKKwkJCQlybWk0X2RhdGEtPmZuMDFfZGF0YV9iYXNlX2FkZHIgKyAxLAorCQkJCSZpbnRyX3N0YXR1cywKKwkJCQlybWk0X2RhdGEtPm51bWJlcl9vZl9pbnRlcnJ1cHRfcmVnaXN0ZXIpOworCWlmIChyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCisJcmV0dmFsID0gc3luYXB0aWNzX3JtaTRfaTJjX2J5dGVfd3JpdGUocm1pNF9kYXRhLAorCQkJCQlybWk0X2RhdGEtPmZuMDFfY3RybF9iYXNlX2FkZHIgKyAxLAorCQkJCQkoaW50cl9zdGF0dXMgJiB+VE9VQ0hQQURfQ1RSTF9JTlRSKSk7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisKKwlpZiAocGRhdGEtPnJlZ3VsYXRvcl9lbikKKwkJcmVndWxhdG9yX2Rpc2FibGUocm1pNF9kYXRhLT5yZWd1bGF0b3IpOworCisJcmV0dXJuIDA7Cit9CisvKioKKyAqIHN5bmFwdGljc19ybWk0X3Jlc3VtZSgpIC0gcmVzdW1lIHRoZSB0b3VjaCBzY3JlZW4gY29udHJvbGxlcgorICogQGRldjogcG9pbnRlciB0byBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogVGhpcyBmdW50aW9uIGlzIHVzZWQgdG8gcmVzdW1lIHRoZSB0b3VjaCBwYW5lbAorICogY29udHJvbGxlciBhbmQgcmV0dXJucyBpbnRlZ2VyLgorICovCitzdGF0aWMgaW50IHN5bmFwdGljc19ybWk0X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHJldHZhbDsKKwl1bnNpZ25lZCBjaGFyIGludHJfc3RhdHVzOworCXN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9kYXRhICpybWk0X2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwljb25zdCBzdHJ1Y3Qgc3luYXB0aWNzX3JtaTRfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBybWk0X2RhdGEtPmJvYXJkOworCisJaWYgKHBkYXRhLT5yZWd1bGF0b3JfZW4pCisJCXJlZ3VsYXRvcl9lbmFibGUocm1pNF9kYXRhLT5yZWd1bGF0b3IpOworCisJZW5hYmxlX2lycShwZGF0YS0+aXJxX251bWJlcik7CisJcm1pNF9kYXRhLT50b3VjaF9zdG9wcGVkID0gZmFsc2U7CisKKwlyZXR2YWwgPSBzeW5hcHRpY3Nfcm1pNF9pMmNfYmxvY2tfcmVhZChybWk0X2RhdGEsCisJCQkJcm1pNF9kYXRhLT5mbjAxX2RhdGFfYmFzZV9hZGRyICsgMSwKKwkJCQkmaW50cl9zdGF0dXMsCisJCQkJcm1pNF9kYXRhLT5udW1iZXJfb2ZfaW50ZXJydXB0X3JlZ2lzdGVyKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHZhbCA9IHN5bmFwdGljc19ybWk0X2kyY19ieXRlX3dyaXRlKHJtaTRfZGF0YSwKKwkJCQkJcm1pNF9kYXRhLT5mbjAxX2N0cmxfYmFzZV9hZGRyICsgMSwKKwkJCQkJKGludHJfc3RhdHVzIHwgVE9VQ0hQQURfQ1RSTF9JTlRSKSk7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHN5bmFwdGljc19ybWk0X2Rldl9wbV9vcHMgPSB7CisJLnN1c3BlbmQgPSBzeW5hcHRpY3Nfcm1pNF9zdXNwZW5kLAorCS5yZXN1bWUgID0gc3luYXB0aWNzX3JtaTRfcmVzdW1lLAorfTsKKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgc3luYXB0aWNzX3JtaTRfaWRfdGFibGVbXSA9IHsKKwl7IERSSVZFUl9OQU1FLCAwIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBzeW5hcHRpY3Nfcm1pNF9pZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBzeW5hcHRpY3Nfcm1pNF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPQlEUklWRVJfTkFNRSwKKwkJLm93bmVyCT0JVEhJU19NT0RVTEUsCisjaWZkZWYgQ09ORklHX1BNCisJCS5wbQk9CSZzeW5hcHRpY3Nfcm1pNF9kZXZfcG1fb3BzLAorI2VuZGlmCisJfSwKKwkucHJvYmUJCT0Jc3luYXB0aWNzX3JtaTRfcHJvYmUsCisJLnJlbW92ZQkJPQlfX2RldmV4aXRfcChzeW5hcHRpY3Nfcm1pNF9yZW1vdmUpLAorCS5pZF90YWJsZQk9CXN5bmFwdGljc19ybWk0X2lkX3RhYmxlLAorfTsKKy8qKgorICogc3luYXB0aWNzX3JtaTRfaW5pdCgpIC0gSW5pdGlhbGl6ZSB0aGUgdG91Y2hzY3JlZW4gZHJpdmVyCisgKgorICogVGhpcyBmdW50aW9uIHVzZXMgdG8gaW5pdGlhbGl6ZXMgdGhlIHN5bmFwdGljcworICogdG91Y2hzY3JlZW4gZHJpdmVyIGFuZCByZXR1cm5zIGludGVnZXIuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHN5bmFwdGljc19ybWk0X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJnN5bmFwdGljc19ybWk0X2RyaXZlcik7Cit9CisvKioKKyAqIHN5bmFwdGljc19ybWk0X2V4aXQoKSAtIERlLWluaXRpYWxpemUgdGhlIHRvdWNoc2NyZWVuIGRyaXZlcgorICoKKyAqIFRoaXMgZnVudGlvbiB1c2VzIHRvIGRlLWluaXRpYWxpemUgdGhlIHN5bmFwdGljcworICogdG91Y2hzY3JlZW4gZHJpdmVyIGFuZCByZXR1cm5zIG5vbmUuCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBzeW5hcHRpY3Nfcm1pNF9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJnN5bmFwdGljc19ybWk0X2RyaXZlcik7Cit9CisKKworbW9kdWxlX2luaXQoc3luYXB0aWNzX3JtaTRfaW5pdCk7Cittb2R1bGVfZXhpdChzeW5hcHRpY3Nfcm1pNF9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FVVEhPUigibmF2ZWVuLmdhZGRpcGF0aUBzdGVyaWNzc29uLmNvbSwganMuaGFAc3Rlcmljc3Nvbi5jb20iKTsKK01PRFVMRV9ERVNDUklQVElPTigic3luYXB0aWNzIHJtaTQgaTJjIHRvdWNoIERyaXZlciIpOworTU9EVUxFX0FMSUFTKCJpMmM6c3luYXB0aWNzX3JtaTRfdHMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zdGVfcm1pNC9zeW5hcHRpY3NfaTJjX3JtaTQuaCBiL2RyaXZlcnMvc3RhZ2luZy9zdGVfcm1pNC9zeW5hcHRpY3NfaTJjX3JtaTQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjBhZTI3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3N0ZV9ybWk0L3N5bmFwdGljc19pMmNfcm1pNC5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qKgorICoKKyAqIFN5bmFwdGljcyBSZWdpc3RlciBNYXBwZWQgSW50ZXJmYWNlIChSTUk0KSBJMkMgUGh5c2ljYWwgTGF5ZXIgRHJpdmVyLgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMTAsIFN5bmFwdGljcyBJbmNvcnBvcmF0ZWQKKyAqCisgKiBBdXRob3I6IEpzIEhBIDxqcy5oYUBzdGVyaWNzc29uLmNvbT4gZm9yIFNULUVyaWNzc29uCisgKiBBdXRob3I6IE5hdmVlbiBLdW1hciBHIDxuYXZlZW4uZ2FkZGlwYXRpQHN0ZXJpY3Nzb24uY29tPiBmb3IgU1QtRXJpY3Nzb24KKyAqIENvcHlyaWdodCAyMDEwIChjKSBTVC1Fcmljc3NvbiBBQgorICovCisvKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwyIGxpY2Vuc2UuCisgKgorICojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICogR1BMCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorICogb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAqLworCisjaWZuZGVmIF9TWU5BUFRJQ1NfUk1JNF9IX0lOQ0xVREVEXworI2RlZmluZSBfU1lOQVBUSUNTX1JNSTRfSF9JTkNMVURFRF8KKworLyoqCisgKiBzdHJ1Y3Qgc3luYXB0aWNzX3JtaTRfcGxhdGZvcm1fZGF0YSAtIGNvbnRhaW5zIHRoZSBybWk0IHBsYXRmb3JtIGRhdGEKKyAqIEBpcnFfbnVtYmVyOiBpcnEgbnVtYmVyCisgKiBAaXJxX3R5cGU6IGlycSB0eXBlCisgKiBAeCBmbGlwOiB4IGZsaXAgZmxhZworICogQHkgZmxpcDogeSBmbGlwIGZsYWcKKyAqIEByZWd1bGF0b3JfZW46IHJlZ3VsYXRvciBlbmFibGUgZmxhZworICoKKyAqIFRoaXMgc3RydWN0dXJlIGdpdmVzIHBsYXRmb3JtIGRhdGEgZm9yIHJtaTQuCisgKi8KK3N0cnVjdCBzeW5hcHRpY3Nfcm1pNF9wbGF0Zm9ybV9kYXRhIHsKKwljb25zdCBjaGFyICpuYW1lOworCWludCBpcnFfbnVtYmVyOworCWludCBpcnFfdHlwZTsKKwlib29sIHhfZmxpcDsKKwlib29sIHlfZmxpcDsKKwlib29sIHJlZ3VsYXRvcl9lbjsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2NvcmUvdGlvbWFwMzQzMC5jIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2NvcmUvdGlvbWFwMzQzMC5jCmluZGV4IDFiZTA4MWYuLmEzYjBhMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9jb3JlL3Rpb21hcDM0MzAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvY29yZS90aW9tYXAzNDMwLmMKQEAgLTU5Niw3ICs1OTYsNyBAQAogCQlkZXZfZGJnKGJyaWRnZSwgIkRTUCBjX2ludDAwIEFkZHJlc3MgPSAgMHgleFxuIiwgZHNwX2FkZHIpOwogCQlpZiAoZHNwX2RlYnVnKQogCQkJd2hpbGUgKF9fcmF3X3JlYWR3KGR3X3N5bmNfYWRkcikpCi0JCQkJOzsKKwkJCQk7CiAKIAkJLyogV2FpdCBmb3IgRFNQIHRvIGNsZWFyIHdvcmQgaW4gc2hhcmVkIG1lbW9yeSAqLwogCQkvKiBSZWFkIHRoZSBMb2NhdGlvbiAqLwpAQCAtMTY3MSw3ICsxNjcxLDcgQEAKIAkJCS8qIEZpbmQgYSBmcmVlIEwyIFBULiAqLwogCQkJZm9yIChpID0gMDsgKGkgPCBwdC0+bDJfbnVtX3BhZ2VzKSAmJgogCQkJICAgICAocHQtPnBnX2luZm9baV0ubnVtX2VudHJpZXMgIT0gMCk7IGkrKykKLQkJCQk7OworCQkJCTsKIAkJCWlmIChpIDwgcHQtPmwyX251bV9wYWdlcykgewogCQkJCWwyX3BhZ2VfbnVtID0gaTsKIAkJCQlsMl9iYXNlX3BhID0gcHQtPmwyX2Jhc2VfcGEgKyAobDJfcGFnZV9udW0gKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3JtZ3Ivbmxkci5jIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3JtZ3Ivbmxkci5jCmluZGV4IGE2YWUwMDcuLjI4MzU0YmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ybWdyL25sZHIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9ubGRyLmMKQEAgLTk0Myw3ICs5NDMsNyBAQAogCiAJLyogRGV0ZXJtaW5lIHdoaWNoIHBoYXNlIHRoaXMgc2VjdGlvbiBiZWxvbmdzIHRvICovCiAJZm9yIChwY2ggPSBzZWN0X25hbWUgKyAxOyAqcGNoICYmICpwY2ggIT0gc2VwczsgcGNoKyspCi0JCTs7CisJCTsKIAogCWlmICgqcGNoKSB7CiAJCXBjaCsrOwkJLyogU2tpcCBvdmVyIHRoZSAnOicgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC92aGNpX2hjZC5jIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3ZoY2lfaGNkLmMKaW5kZXggODMyNjA4ZC4uMDhiZDI2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3ZoY2lfaGNkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3ZoY2lfaGNkLmMKQEAgLTc5OSwyMCArNzk5LDYgQEAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmRldi0+cHJpdl9sb2NrLCBmbGFnczIpOwogCX0KIAotCi0JaWYgKCF2ZGV2LT51ZC50Y3Bfc29ja2V0KSB7Ci0JCS8qIHRjcCBjb25uZWN0aW9uIGlzIGNsb3NlZCAqLwotCQl1c2JpcF91aW5mbygidmhjaV9oY2Q6IHZoY2lfdXJiX2RlcXVldWUoKSBnaXZlcyBiYWNrIHVyYiAlcFxuIiwKLQkJCQkJCQkJCXVyYik7Ci0KLQkJdXNiX2hjZF91bmxpbmtfdXJiX2Zyb21fZXAoaGNkLCB1cmIpOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRoZV9jb250cm9sbGVyLT5sb2NrLCBmbGFncyk7Ci0JCXVzYl9oY2RfZ2l2ZWJhY2tfdXJiKHZoY2lfdG9faGNkKHRoZV9jb250cm9sbGVyKSwgdXJiLAotCQkJCQkJCQl1cmItPnN0YXR1cyk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZ0aGVfY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOwotCX0KLQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRoZV9jb250cm9sbGVyLT5sb2NrLCBmbGFncyk7CiAKIAl1c2JpcF9kYmdfdmhjaV9oYygibGVhdmVcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZtZS9icmlkZ2VzL01vZHVsZS5zeW12ZXJzIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS9icmlkZ2VzL01vZHVsZS5zeW12ZXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdm1lL2JyaWRnZXMvTW9kdWxlLnN5bXZlcnMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92bWUvYnJpZGdlcy92bWVfY2E5MWN4NDIuYyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvYnJpZGdlcy92bWVfY2E5MWN4NDIuYwppbmRleCA0ZDc0NTYyLi40MmRlODNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdm1lL2JyaWRnZXMvdm1lX2NhOTFjeDQyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS9icmlkZ2VzL3ZtZV9jYTkxY3g0Mi5jCkBAIC00NCw3ICs0NCw3IEBACiAKIHN0YXRpYyBjaGFyIGRyaXZlcl9uYW1lW10gPSAidm1lX2NhOTFjeDQyIjsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGNhOTFjeDQyX2lkc1tdID0geworc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGNhOTFjeDQyX2lkcykgPSB7CiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfVFVORFJBLCBQQ0lfREVWSUNFX0lEX1RVTkRSQV9DQTkxQzE0MikgfSwKIAl7IH0sCiB9OwpAQCAtNTgsNyArNTgsNyBAQAogCiBzdGF0aWMgdTMyIGNhOTFjeDQyX0RNQV9pcnFoYW5kbGVyKHN0cnVjdCBjYTkxY3g0Ml9kcml2ZXIgKmJyaWRnZSkKIHsKLQl3YWtlX3VwKCYoYnJpZGdlLT5kbWFfcXVldWUpKTsKKwl3YWtlX3VwKCZicmlkZ2UtPmRtYV9xdWV1ZSk7CiAKIAlyZXR1cm4gQ0E5MUNYNDJfTElOVF9ETUE7CiB9CkBAIC04MiwxNCArODIsMTQgQEAKIC8qIFhYWCBUaGlzIG5lZWRzIHRvIGJlIHNwbGl0IGludG8gNCBxdWV1ZXMgKi8KIHN0YXRpYyB1MzIgY2E5MWN4NDJfTUJfaXJxaGFuZGxlcihzdHJ1Y3QgY2E5MWN4NDJfZHJpdmVyICpicmlkZ2UsIGludCBtYm94X21hc2spCiB7Ci0Jd2FrZV91cCgmKGJyaWRnZS0+bWJveF9xdWV1ZSkpOworCXdha2VfdXAoJmJyaWRnZS0+bWJveF9xdWV1ZSk7CiAKIAlyZXR1cm4gQ0E5MUNYNDJfTElOVF9NQk9YOwogfQogCiBzdGF0aWMgdTMyIGNhOTFjeDQyX0lBQ0tfaXJxaGFuZGxlcihzdHJ1Y3QgY2E5MWN4NDJfZHJpdmVyICpicmlkZ2UpCiB7Ci0Jd2FrZV91cCgmKGJyaWRnZS0+aWFja19xdWV1ZSkpOworCXdha2VfdXAoJmJyaWRnZS0+aWFja19xdWV1ZSk7CiAKIAlyZXR1cm4gQ0E5MUNYNDJfTElOVF9TV19JQUNLOwogfQpAQCAtMjA3LDkgKzIwNyw5IEBACiAJcGRldiA9IGNvbnRhaW5lcl9vZihjYTkxY3g0Ml9icmlkZ2UtPnBhcmVudCwgc3RydWN0IHBjaV9kZXYsIGRldik7CiAKIAkvKiBJbml0aWFsaXNlIGxpc3QgZm9yIFZNRSBidXMgZXJyb3JzICovCi0JSU5JVF9MSVNUX0hFQUQoJihjYTkxY3g0Ml9icmlkZ2UtPnZtZV9lcnJvcnMpKTsKKwlJTklUX0xJU1RfSEVBRCgmY2E5MWN4NDJfYnJpZGdlLT52bWVfZXJyb3JzKTsKIAotCW11dGV4X2luaXQoJihjYTkxY3g0Ml9icmlkZ2UtPmlycV9tdHgpKTsKKwltdXRleF9pbml0KCZjYTkxY3g0Ml9icmlkZ2UtPmlycV9tdHgpOwogCiAJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGZyb20gUENJIHRvIFZNRSAqLwogCWlvd3JpdGUzMigwLCBicmlkZ2UtPmJhc2UgKyBWSU5UX0VOKTsKQEAgLTI1OSw4ICsyNTksOCBAQAogLyoKICAqIFNldCB1cCBhbiBWTUUgaW50ZXJydXB0CiAgKi8KLXZvaWQgY2E5MWN4NDJfaXJxX3NldChzdHJ1Y3Qgdm1lX2JyaWRnZSAqY2E5MWN4NDJfYnJpZGdlLCBpbnQgbGV2ZWwsIGludCBzdGF0ZSwKLQlpbnQgc3luYykKK3N0YXRpYyB2b2lkIGNhOTFjeDQyX2lycV9zZXQoc3RydWN0IHZtZV9icmlkZ2UgKmNhOTFjeDQyX2JyaWRnZSwgaW50IGxldmVsLAorCWludCBzdGF0ZSwgaW50IHN5bmMpCiAKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKQEAgLTI4Nyw3ICsyODcsNyBAQAogCX0KIH0KIAotaW50IGNhOTFjeDQyX2lycV9nZW5lcmF0ZShzdHJ1Y3Qgdm1lX2JyaWRnZSAqY2E5MWN4NDJfYnJpZGdlLCBpbnQgbGV2ZWwsCitzdGF0aWMgaW50IGNhOTFjeDQyX2lycV9nZW5lcmF0ZShzdHJ1Y3Qgdm1lX2JyaWRnZSAqY2E5MWN4NDJfYnJpZGdlLCBpbnQgbGV2ZWwsCiAJaW50IHN0YXRpZCkKIHsKIAl1MzIgdG1wOwpAQCAtMjk5LDcgKzI5OSw3IEBACiAJaWYgKHN0YXRpZCAmIDEpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbXV0ZXhfbG9jaygmKGJyaWRnZS0+dm1lX2ludCkpOworCW11dGV4X2xvY2soJmJyaWRnZS0+dm1lX2ludCk7CiAKIAl0bXAgPSBpb3JlYWQzMihicmlkZ2UtPmJhc2UgKyBWSU5UX0VOKTsKIApAQCAtMzE4LDEyICszMTgsMTIgQEAKIAl0bXAgPSB0bXAgJiB+KDEgPDwgKGxldmVsICsgMjQpKTsKIAlpb3dyaXRlMzIodG1wLCBicmlkZ2UtPmJhc2UgKyBWSU5UX0VOKTsKIAotCW11dGV4X3VubG9jaygmKGJyaWRnZS0+dm1lX2ludCkpOworCW11dGV4X3VubG9jaygmYnJpZGdlLT52bWVfaW50KTsKIAogCXJldHVybiAwOwogfQogCi1pbnQgY2E5MWN4NDJfc2xhdmVfc2V0KHN0cnVjdCB2bWVfc2xhdmVfcmVzb3VyY2UgKmltYWdlLCBpbnQgZW5hYmxlZCwKK3N0YXRpYyBpbnQgY2E5MWN4NDJfc2xhdmVfc2V0KHN0cnVjdCB2bWVfc2xhdmVfcmVzb3VyY2UgKmltYWdlLCBpbnQgZW5hYmxlZCwKIAl1bnNpZ25lZCBsb25nIGxvbmcgdm1lX2Jhc2UsIHVuc2lnbmVkIGxvbmcgbG9uZyBzaXplLAogCWRtYV9hZGRyX3QgcGNpX2Jhc2UsIHZtZV9hZGRyZXNzX3QgYXNwYWNlLCB2bWVfY3ljbGVfdCBjeWNsZSkKIHsKQEAgLTQyOSw3ICs0MjksNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgY2E5MWN4NDJfc2xhdmVfZ2V0KHN0cnVjdCB2bWVfc2xhdmVfcmVzb3VyY2UgKmltYWdlLCBpbnQgKmVuYWJsZWQsCitzdGF0aWMgaW50IGNhOTFjeDQyX3NsYXZlX2dldChzdHJ1Y3Qgdm1lX3NsYXZlX3Jlc291cmNlICppbWFnZSwgaW50ICplbmFibGVkLAogCXVuc2lnbmVkIGxvbmcgbG9uZyAqdm1lX2Jhc2UsIHVuc2lnbmVkIGxvbmcgbG9uZyAqc2l6ZSwKIAlkbWFfYWRkcl90ICpwY2lfYmFzZSwgdm1lX2FkZHJlc3NfdCAqYXNwYWNlLCB2bWVfY3ljbGVfdCAqY3ljbGUpCiB7CkBAIC01MTgsOCArNTE4LDggQEAKIAkJaW1hZ2UtPmtlcm5fYmFzZSA9IE5VTEw7CiAJCWlmIChpbWFnZS0+YnVzX3Jlc291cmNlLm5hbWUgIT0gTlVMTCkKIAkJCWtmcmVlKGltYWdlLT5idXNfcmVzb3VyY2UubmFtZSk7Ci0JCXJlbGVhc2VfcmVzb3VyY2UoJihpbWFnZS0+YnVzX3Jlc291cmNlKSk7Ci0JCW1lbXNldCgmKGltYWdlLT5idXNfcmVzb3VyY2UpLCAwLCBzaXplb2Yoc3RydWN0IHJlc291cmNlKSk7CisJCXJlbGVhc2VfcmVzb3VyY2UoJmltYWdlLT5idXNfcmVzb3VyY2UpOworCQltZW1zZXQoJmltYWdlLT5idXNfcmVzb3VyY2UsIDAsIHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKIAl9CiAKIAlpZiAoaW1hZ2UtPmJ1c19yZXNvdXJjZS5uYW1lID09IE5VTEwpIHsKQEAgLTU0MCw3ICs1NDAsNyBAQAogCWltYWdlLT5idXNfcmVzb3VyY2UuZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKIAogCXJldHZhbCA9IHBjaV9idXNfYWxsb2NfcmVzb3VyY2UocGRldi0+YnVzLAotCQkmKGltYWdlLT5idXNfcmVzb3VyY2UpLCBzaXplLCBzaXplLCBQQ0lCSU9TX01JTl9NRU0sCisJCSZpbWFnZS0+YnVzX3Jlc291cmNlLCBzaXplLCBzaXplLCBQQ0lCSU9TX01JTl9NRU0sCiAJCTAsIE5VTEwsIE5VTEwpOwogCWlmIChyZXR2YWwpIHsKIAkJZGV2X2VycihjYTkxY3g0Ml9icmlkZ2UtPnBhcmVudCwgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW0gIgpAQCAtNTYzLDEwICs1NjMsMTAgQEAKIAlpb3VubWFwKGltYWdlLT5rZXJuX2Jhc2UpOwogCWltYWdlLT5rZXJuX2Jhc2UgPSBOVUxMOwogZXJyX3JlbWFwOgotCXJlbGVhc2VfcmVzb3VyY2UoJihpbWFnZS0+YnVzX3Jlc291cmNlKSk7CisJcmVsZWFzZV9yZXNvdXJjZSgmaW1hZ2UtPmJ1c19yZXNvdXJjZSk7CiBlcnJfcmVzb3VyY2U6CiAJa2ZyZWUoaW1hZ2UtPmJ1c19yZXNvdXJjZS5uYW1lKTsKLQltZW1zZXQoJihpbWFnZS0+YnVzX3Jlc291cmNlKSwgMCwgc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOworCW1lbXNldCgmaW1hZ2UtPmJ1c19yZXNvdXJjZSwgMCwgc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOwogZXJyX25hbWU6CiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTU3OCwxMyArNTc4LDEzIEBACiB7CiAJaW91bm1hcChpbWFnZS0+a2Vybl9iYXNlKTsKIAlpbWFnZS0+a2Vybl9iYXNlID0gTlVMTDsKLQlyZWxlYXNlX3Jlc291cmNlKCYoaW1hZ2UtPmJ1c19yZXNvdXJjZSkpOworCXJlbGVhc2VfcmVzb3VyY2UoJmltYWdlLT5idXNfcmVzb3VyY2UpOwogCWtmcmVlKGltYWdlLT5idXNfcmVzb3VyY2UubmFtZSk7Ci0JbWVtc2V0KCYoaW1hZ2UtPmJ1c19yZXNvdXJjZSksIDAsIHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKKwltZW1zZXQoJmltYWdlLT5idXNfcmVzb3VyY2UsIDAsIHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKIH0KIAogCi1pbnQgY2E5MWN4NDJfbWFzdGVyX3NldChzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSAqaW1hZ2UsIGludCBlbmFibGVkLAorc3RhdGljIGludCBjYTkxY3g0Ml9tYXN0ZXJfc2V0KHN0cnVjdCB2bWVfbWFzdGVyX3Jlc291cmNlICppbWFnZSwgaW50IGVuYWJsZWQsCiAJdW5zaWduZWQgbG9uZyBsb25nIHZtZV9iYXNlLCB1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZSwKIAl2bWVfYWRkcmVzc190IGFzcGFjZSwgdm1lX2N5Y2xlX3QgY3ljbGUsIHZtZV93aWR0aF90IGR3aWR0aCkKIHsKQEAgLTYyMCw3ICs2MjAsNyBAQAogCQlnb3RvIGVycl93aW5kb3c7CiAJfQogCi0Jc3Bpbl9sb2NrKCYoaW1hZ2UtPmxvY2spKTsKKwlzcGluX2xvY2soJmltYWdlLT5sb2NrKTsKIAogCS8qCiAJICogTGV0J3MgYWxsb2NhdGUgdGhlIHJlc291cmNlIGhlcmUgcmF0aGVyIHRoYW4gZnVydGhlciB1cCB0aGUgc3RhY2sgYXMKQEAgLTYyOCw3ICs2MjgsNyBAQAogCSAqLwogCXJldHZhbCA9IGNhOTFjeDQyX2FsbG9jX3Jlc291cmNlKGltYWdlLCBzaXplKTsKIAlpZiAocmV0dmFsKSB7Ci0JCXNwaW5fdW5sb2NrKCYoaW1hZ2UtPmxvY2spKTsKKwkJc3Bpbl91bmxvY2soJmltYWdlLT5sb2NrKTsKIAkJZGV2X2VycihjYTkxY3g0Ml9icmlkZ2UtPnBhcmVudCwgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgIgogCQkJImZvciByZXNvdXJjZSBuYW1lXG4iKTsKIAkJcmV0dmFsID0gLUVOT01FTTsKQEAgLTY3Miw3ICs2NzIsNyBAQAogCQl0ZW1wX2N0bCB8PSBDQTkxQ1g0Ml9MU0lfQ1RMX1ZEV19ENjQ7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXNwaW5fdW5sb2NrKCYoaW1hZ2UtPmxvY2spKTsKKwkJc3Bpbl91bmxvY2soJmltYWdlLT5sb2NrKTsKIAkJZGV2X2VycihjYTkxY3g0Ml9icmlkZ2UtPnBhcmVudCwgIkludmFsaWQgZGF0YSB3aWR0aFxuIik7CiAJCXJldHZhbCA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyX2R3aWR0aDsKQEAgLTcwNCw3ICs3MDQsNyBAQAogCWNhc2UgVk1FX1VTRVIzOgogCWNhc2UgVk1FX1VTRVI0OgogCWRlZmF1bHQ6Ci0JCXNwaW5fdW5sb2NrKCYoaW1hZ2UtPmxvY2spKTsKKwkJc3Bpbl91bmxvY2soJmltYWdlLT5sb2NrKTsKIAkJZGV2X2VycihjYTkxY3g0Ml9icmlkZ2UtPnBhcmVudCwgIkludmFsaWQgYWRkcmVzcyBzcGFjZVxuIik7CiAJCXJldHZhbCA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyX2FzcGFjZTsKQEAgLTczMCw3ICs3MzAsNyBAQAogCiAJaW93cml0ZTMyKHRlbXBfY3RsLCBicmlkZ2UtPmJhc2UgKyBDQTkxQ1g0Ml9MU0lfQ1RMW2ldKTsKIAotCXNwaW5fdW5sb2NrKCYoaW1hZ2UtPmxvY2spKTsKKwlzcGluX3VubG9jaygmaW1hZ2UtPmxvY2spOwogCXJldHVybiAwOwogCiBlcnJfYXNwYWNlOgpAQCAtNzQxLDggKzc0MSw4IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotaW50IF9fY2E5MWN4NDJfbWFzdGVyX2dldChzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSAqaW1hZ2UsIGludCAqZW5hYmxlZCwKLQl1bnNpZ25lZCBsb25nIGxvbmcgKnZtZV9iYXNlLCB1bnNpZ25lZCBsb25nIGxvbmcgKnNpemUsCitzdGF0aWMgaW50IF9fY2E5MWN4NDJfbWFzdGVyX2dldChzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSAqaW1hZ2UsCisJaW50ICplbmFibGVkLCB1bnNpZ25lZCBsb25nIGxvbmcgKnZtZV9iYXNlLCB1bnNpZ25lZCBsb25nIGxvbmcgKnNpemUsCiAJdm1lX2FkZHJlc3NfdCAqYXNwYWNlLCB2bWVfY3ljbGVfdCAqY3ljbGUsIHZtZV93aWR0aF90ICpkd2lkdGgpCiB7CiAJdW5zaWduZWQgaW50IGksIGN0bDsKQEAgLTgyOCwyNCArODI4LDI0IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBjYTkxY3g0Ml9tYXN0ZXJfZ2V0KHN0cnVjdCB2bWVfbWFzdGVyX3Jlc291cmNlICppbWFnZSwgaW50ICplbmFibGVkLAorc3RhdGljIGludCBjYTkxY3g0Ml9tYXN0ZXJfZ2V0KHN0cnVjdCB2bWVfbWFzdGVyX3Jlc291cmNlICppbWFnZSwgaW50ICplbmFibGVkLAogCXVuc2lnbmVkIGxvbmcgbG9uZyAqdm1lX2Jhc2UsIHVuc2lnbmVkIGxvbmcgbG9uZyAqc2l6ZSwKIAl2bWVfYWRkcmVzc190ICphc3BhY2UsIHZtZV9jeWNsZV90ICpjeWNsZSwgdm1lX3dpZHRoX3QgKmR3aWR0aCkKIHsKIAlpbnQgcmV0dmFsOwogCi0Jc3Bpbl9sb2NrKCYoaW1hZ2UtPmxvY2spKTsKKwlzcGluX2xvY2soJmltYWdlLT5sb2NrKTsKIAogCXJldHZhbCA9IF9fY2E5MWN4NDJfbWFzdGVyX2dldChpbWFnZSwgZW5hYmxlZCwgdm1lX2Jhc2UsIHNpemUsIGFzcGFjZSwKIAkJY3ljbGUsIGR3aWR0aCk7CiAKLQlzcGluX3VubG9jaygmKGltYWdlLT5sb2NrKSk7CisJc3Bpbl91bmxvY2soJmltYWdlLT5sb2NrKTsKIAogCXJldHVybiByZXR2YWw7CiB9CiAKLXNzaXplX3QgY2E5MWN4NDJfbWFzdGVyX3JlYWQoc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UgKmltYWdlLCB2b2lkICpidWYsCi0Jc2l6ZV90IGNvdW50LCBsb2ZmX3Qgb2Zmc2V0KQorc3RhdGljIHNzaXplX3QgY2E5MWN4NDJfbWFzdGVyX3JlYWQoc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UgKmltYWdlLAorCXZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3Qgb2Zmc2V0KQogewogCXNzaXplX3QgcmV0dmFsOwogCXZvaWQgKmFkZHIgPSBpbWFnZS0+a2Vybl9iYXNlICsgb2Zmc2V0OwpAQCAtODU1LDcgKzg1NSw3IEBACiAJaWYgKGNvdW50ID09IDApCiAJCXJldHVybiAwOwogCi0Jc3Bpbl9sb2NrKCYoaW1hZ2UtPmxvY2spKTsKKwlzcGluX2xvY2soJmltYWdlLT5sb2NrKTsKIAogCS8qIFRoZSBmb2xsb3dpbmcgY29kZSBoYW5kbGVzIFZNRSBhZGRyZXNzIGFsaWdubWVudCBwcm9ibGVtCiAJICogaW4gb3JkZXIgdG8gYXNzdXJlIHRoZSBtYXhpbWFsIGRhdGEgd2lkdGggY3ljbGUuCkBAIC04OTksMTMgKzg5OSwxMyBAQAogCX0KIG91dDoKIAlyZXR2YWwgPSBjb3VudDsKLQlzcGluX3VubG9jaygmKGltYWdlLT5sb2NrKSk7CisJc3Bpbl91bmxvY2soJmltYWdlLT5sb2NrKTsKIAogCXJldHVybiByZXR2YWw7CiB9CiAKLXNzaXplX3QgY2E5MWN4NDJfbWFzdGVyX3dyaXRlKHN0cnVjdCB2bWVfbWFzdGVyX3Jlc291cmNlICppbWFnZSwgdm9pZCAqYnVmLAotCXNpemVfdCBjb3VudCwgbG9mZl90IG9mZnNldCkKK3N0YXRpYyBzc2l6ZV90IGNhOTFjeDQyX21hc3Rlcl93cml0ZShzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSAqaW1hZ2UsCisJdm9pZCAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCBvZmZzZXQpCiB7CiAJc3NpemVfdCByZXR2YWw7CiAJdm9pZCAqYWRkciA9IGltYWdlLT5rZXJuX2Jhc2UgKyBvZmZzZXQ7CkBAIC05MTUsNyArOTE1LDcgQEAKIAlpZiAoY291bnQgPT0gMCkKIAkJcmV0dXJuIDA7CiAKLQlzcGluX2xvY2soJihpbWFnZS0+bG9jaykpOworCXNwaW5fbG9jaygmaW1hZ2UtPmxvY2spOwogCiAJLyogSGVyZSB3ZSBhcHBseSBmb3IgdGhlIHNhbWUgc3RyYXRlZ3kgd2UgZG8gaW4gbWFzdGVyX3JlYWQKIAkgKiBmdW5jdGlvbiBpbiBvcmRlciB0byBhc3N1cmUgRDE2IGN5Y2xlIHdoZW4gcmVxdWlyZWQuCkBAIC05NTQsMTEgKzk1NCwxMiBAQAogb3V0OgogCXJldHZhbCA9IGNvdW50OwogCi0Jc3Bpbl91bmxvY2soJihpbWFnZS0+bG9jaykpOworCXNwaW5fdW5sb2NrKCZpbWFnZS0+bG9jayk7CisKIAlyZXR1cm4gcmV0dmFsOwogfQogCi11bnNpZ25lZCBpbnQgY2E5MWN4NDJfbWFzdGVyX3JtdyhzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSAqaW1hZ2UsCitzdGF0aWMgdW5zaWduZWQgaW50IGNhOTFjeDQyX21hc3Rlcl9ybXcoc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UgKmltYWdlLAogCXVuc2lnbmVkIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgY29tcGFyZSwgdW5zaWduZWQgaW50IHN3YXAsCiAJbG9mZl90IG9mZnNldCkKIHsKQEAgLTk3NCwxMCArOTc1LDEwIEBACiAJaSA9IGltYWdlLT5udW1iZXI7CiAKIAkvKiBMb2NraW5nIGFzIHdlIGNhbiBvbmx5IGRvIG9uZSBvZiB0aGVzZSBhdCBhIHRpbWUgKi8KLQltdXRleF9sb2NrKCYoYnJpZGdlLT52bWVfcm13KSk7CisJbXV0ZXhfbG9jaygmYnJpZGdlLT52bWVfcm13KTsKIAogCS8qIExvY2sgaW1hZ2UgKi8KLQlzcGluX2xvY2soJihpbWFnZS0+bG9jaykpOworCXNwaW5fbG9jaygmaW1hZ2UtPmxvY2spOwogCiAJcGNpX2FkZHIgPSAodTMyKWltYWdlLT5rZXJuX2Jhc2UgKyBvZmZzZXQ7CiAKQEAgLTEwMDcsMTUgKzEwMDgsMTUgQEAKIAlpb3dyaXRlMzIoMCwgYnJpZGdlLT5iYXNlICsgU0NZQ19DVEwpOwogCiBvdXQ6Ci0Jc3Bpbl91bmxvY2soJihpbWFnZS0+bG9jaykpOworCXNwaW5fdW5sb2NrKCZpbWFnZS0+bG9jayk7CiAKLQltdXRleF91bmxvY2soJihicmlkZ2UtPnZtZV9ybXcpKTsKKwltdXRleF91bmxvY2soJmJyaWRnZS0+dm1lX3Jtdyk7CiAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi1pbnQgY2E5MWN4NDJfZG1hX2xpc3RfYWRkKHN0cnVjdCB2bWVfZG1hX2xpc3QgKmxpc3QsIHN0cnVjdCB2bWVfZG1hX2F0dHIgKnNyYywKLQlzdHJ1Y3Qgdm1lX2RtYV9hdHRyICpkZXN0LCBzaXplX3QgY291bnQpCitzdGF0aWMgaW50IGNhOTFjeDQyX2RtYV9saXN0X2FkZChzdHJ1Y3Qgdm1lX2RtYV9saXN0ICpsaXN0LAorCXN0cnVjdCB2bWVfZG1hX2F0dHIgKnNyYywgc3RydWN0IHZtZV9kbWFfYXR0ciAqZGVzdCwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBjYTkxY3g0Ml9kbWFfZW50cnkgKmVudHJ5LCAqcHJldjsKIAlzdHJ1Y3Qgdm1lX2RtYV9wY2kgKnBjaV9hdHRyOwpAQCAtMTAzNiwxNCArMTAzNywxNCBAQAogCX0KIAogCS8qIFRlc3QgZGVzY3JpcHRvciBhbGlnbm1lbnQgKi8KLQlpZiAoKHVuc2lnbmVkIGxvbmcpJihlbnRyeS0+ZGVzY3JpcHRvcikgJiBDQTkxQ1g0Ml9EQ1BQX00pIHsKKwlpZiAoKHVuc2lnbmVkIGxvbmcpJmVudHJ5LT5kZXNjcmlwdG9yICYgQ0E5MUNYNDJfRENQUF9NKSB7CiAJCWRldl9lcnIoZGV2LCAiRGVzY3JpcHRvciBub3QgYWxpZ25lZCB0byAxNiBieXRlIGJvdW5kYXJ5IGFzICIKLQkJCSJyZXF1aXJlZDogJXBcbiIsICYoZW50cnktPmRlc2NyaXB0b3IpKTsKKwkJCSJyZXF1aXJlZDogJXBcbiIsICZlbnRyeS0+ZGVzY3JpcHRvcik7CiAJCXJldHZhbCA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyX2FsaWduOwogCX0KIAotCW1lbXNldCgmKGVudHJ5LT5kZXNjcmlwdG9yKSwgMCwgc2l6ZW9mKHN0cnVjdCBjYTkxY3g0Ml9kbWFfZGVzY3JpcHRvcikpOworCW1lbXNldCgmZW50cnktPmRlc2NyaXB0b3IsIDAsIHNpemVvZihzdHJ1Y3QgY2E5MWN4NDJfZG1hX2Rlc2NyaXB0b3IpKTsKIAogCWlmIChkZXN0LT50eXBlID09IFZNRV9ETUFfVk1FKSB7CiAJCWVudHJ5LT5kZXNjcmlwdG9yLmRjdGwgfD0gQ0E5MUNYNDJfRENUTF9MMlY7CkBAIC0xMTM4LDE0ICsxMTM5LDE0IEBACiAJZW50cnktPmRlc2NyaXB0b3IuZGNwcCA9IENBOTFDWDQyX0RDUFBfTlVMTDsKIAogCS8qIEFkZCB0byBsaXN0ICovCi0JbGlzdF9hZGRfdGFpbCgmKGVudHJ5LT5saXN0KSwgJihsaXN0LT5lbnRyaWVzKSk7CisJbGlzdF9hZGRfdGFpbCgmZW50cnktPmxpc3QsICZsaXN0LT5lbnRyaWVzKTsKIAogCS8qIEZpbGwgb3V0IHByZXZpb3VzIGRlc2NyaXB0b3JzICJOZXh0IEFkZHJlc3MiICovCi0JaWYgKGVudHJ5LT5saXN0LnByZXYgIT0gJihsaXN0LT5lbnRyaWVzKSkgeworCWlmIChlbnRyeS0+bGlzdC5wcmV2ICE9ICZsaXN0LT5lbnRyaWVzKSB7CiAJCXByZXYgPSBsaXN0X2VudHJ5KGVudHJ5LT5saXN0LnByZXYsIHN0cnVjdCBjYTkxY3g0Ml9kbWFfZW50cnksCiAJCQlsaXN0KTsKIAkJLyogV2UgbmVlZCB0aGUgYnVzIGFkZHJlc3MgZm9yIHRoZSBwb2ludGVyICovCi0JCWRlc2NfcHRyID0gdmlydF90b19idXMoJihlbnRyeS0+ZGVzY3JpcHRvcikpOworCQlkZXNjX3B0ciA9IHZpcnRfdG9fYnVzKCZlbnRyeS0+ZGVzY3JpcHRvcik7CiAJCXByZXYtPmRlc2NyaXB0b3IuZGNwcCA9IGRlc2NfcHRyICYgfkNBOTFDWDQyX0RDUFBfTTsKIAl9CiAKQEAgLTExNzUsNyArMTE3Niw3IEBACiAJCXJldHVybiAxOwogfQogCi1pbnQgY2E5MWN4NDJfZG1hX2xpc3RfZXhlYyhzdHJ1Y3Qgdm1lX2RtYV9saXN0ICpsaXN0KQorc3RhdGljIGludCBjYTkxY3g0Ml9kbWFfbGlzdF9leGVjKHN0cnVjdCB2bWVfZG1hX2xpc3QgKmxpc3QpCiB7CiAJc3RydWN0IHZtZV9kbWFfcmVzb3VyY2UgKmN0cmxyOwogCXN0cnVjdCBjYTkxY3g0Ml9kbWFfZW50cnkgKmVudHJ5OwpAQCAtMTE5MCwyOCArMTE5MSwyOCBAQAogCWJyaWRnZSA9IGN0cmxyLT5wYXJlbnQtPmRyaXZlcl9wcml2OwogCWRldiA9IGN0cmxyLT5wYXJlbnQtPnBhcmVudDsKIAotCW11dGV4X2xvY2soJihjdHJsci0+bXR4KSk7CisJbXV0ZXhfbG9jaygmY3RybHItPm10eCk7CiAKLQlpZiAoIShsaXN0X2VtcHR5KCYoY3RybHItPnJ1bm5pbmcpKSkpIHsKKwlpZiAoIShsaXN0X2VtcHR5KCZjdHJsci0+cnVubmluZykpKSB7CiAJCS8qCiAJCSAqIFhYWCBXZSBoYXZlIGFuIGFjdGl2ZSBETUEgdHJhbnNmZXIgYW5kIGN1cnJlbnRseSBoYXZlbid0CiAJCSAqICAgICBzb3J0ZWQgb3V0IHRoZSBtZWNoYW5pc20gZm9yICJwZW5kaW5nIiBETUEgdHJhbnNmZXJzLgogCQkgKiAgICAgUmV0dXJuIGJ1c3kuCiAJCSAqLwogCQkvKiBOZWVkIHRvIGFkZCB0byBwZW5kaW5nIGhlcmUgKi8KLQkJbXV0ZXhfdW5sb2NrKCYoY3RybHItPm10eCkpOworCQltdXRleF91bmxvY2soJmN0cmxyLT5tdHgpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0gZWxzZSB7Ci0JCWxpc3RfYWRkKCYobGlzdC0+bGlzdCksICYoY3RybHItPnJ1bm5pbmcpKTsKKwkJbGlzdF9hZGQoJmxpc3QtPmxpc3QsICZjdHJsci0+cnVubmluZyk7CiAJfQogCiAJLyogR2V0IGZpcnN0IGJ1cyBhZGRyZXNzIGFuZCB3cml0ZSBpbnRvIHJlZ2lzdGVycyAqLwotCWVudHJ5ID0gbGlzdF9maXJzdF9lbnRyeSgmKGxpc3QtPmVudHJpZXMpLCBzdHJ1Y3QgY2E5MWN4NDJfZG1hX2VudHJ5LAorCWVudHJ5ID0gbGlzdF9maXJzdF9lbnRyeSgmbGlzdC0+ZW50cmllcywgc3RydWN0IGNhOTFjeDQyX2RtYV9lbnRyeSwKIAkJbGlzdCk7CiAKLQlidXNfYWRkciA9IHZpcnRfdG9fYnVzKCYoZW50cnktPmRlc2NyaXB0b3IpKTsKKwlidXNfYWRkciA9IHZpcnRfdG9fYnVzKCZlbnRyeS0+ZGVzY3JpcHRvcik7CiAKLQltdXRleF91bmxvY2soJihjdHJsci0+bXR4KSk7CisJbXV0ZXhfdW5sb2NrKCZjdHJsci0+bXR4KTsKIAogCWlvd3JpdGUzMigwLCBicmlkZ2UtPmJhc2UgKyBEVEJDKTsKIAlpb3dyaXRlMzIoYnVzX2FkZHIgJiB+Q0E5MUNYNDJfRENQUF9NLCBicmlkZ2UtPmJhc2UgKyBEQ1BQKTsKQEAgLTEyNDksMjEgKzEyNTAsMjEgQEAKIAl9CiAKIAkvKiBSZW1vdmUgbGlzdCBmcm9tIHJ1bm5pbmcgbGlzdCAqLwotCW11dGV4X2xvY2soJihjdHJsci0+bXR4KSk7Ci0JbGlzdF9kZWwoJihsaXN0LT5saXN0KSk7Ci0JbXV0ZXhfdW5sb2NrKCYoY3RybHItPm10eCkpOworCW11dGV4X2xvY2soJmN0cmxyLT5tdHgpOworCWxpc3RfZGVsKCZsaXN0LT5saXN0KTsKKwltdXRleF91bmxvY2soJmN0cmxyLT5tdHgpOwogCiAJcmV0dXJuIHJldHZhbDsKIAogfQogCi1pbnQgY2E5MWN4NDJfZG1hX2xpc3RfZW1wdHkoc3RydWN0IHZtZV9kbWFfbGlzdCAqbGlzdCkKK3N0YXRpYyBpbnQgY2E5MWN4NDJfZG1hX2xpc3RfZW1wdHkoc3RydWN0IHZtZV9kbWFfbGlzdCAqbGlzdCkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MsICp0ZW1wOwogCXN0cnVjdCBjYTkxY3g0Ml9kbWFfZW50cnkgKmVudHJ5OwogCiAJLyogZGV0YWNoIGFuZCBmcmVlIGVhY2ggZW50cnkgKi8KLQlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCB0ZW1wLCAmKGxpc3QtPmVudHJpZXMpKSB7CisJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdGVtcCwgJmxpc3QtPmVudHJpZXMpIHsKIAkJbGlzdF9kZWwocG9zKTsKIAkJZW50cnkgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IGNhOTFjeDQyX2RtYV9lbnRyeSwgbGlzdCk7CiAJCWtmcmVlKGVudHJ5KTsKQEAgLTEyNzksOCArMTI4MCw4IEBACiAgKiBUaGlzIGRvZXMgbm90IGVuYWJsZSB0aGUgTE0gbW9uaXRvciAtIHRoYXQgc2hvdWxkIGJlIGRvbmUgd2hlbiB0aGUgZmlyc3QKICAqIGNhbGxiYWNrIGlzIGF0dGFjaGVkIGFuZCBkaXNhYmxlZCB3aGVuIHRoZSBsYXN0IGNhbGxiYWNrIGlzIHJlbW92ZWQuCiAgKi8KLWludCBjYTkxY3g0Ml9sbV9zZXQoc3RydWN0IHZtZV9sbV9yZXNvdXJjZSAqbG0sIHVuc2lnbmVkIGxvbmcgbG9uZyBsbV9iYXNlLAotCXZtZV9hZGRyZXNzX3QgYXNwYWNlLCB2bWVfY3ljbGVfdCBjeWNsZSkKK3N0YXRpYyBpbnQgY2E5MWN4NDJfbG1fc2V0KHN0cnVjdCB2bWVfbG1fcmVzb3VyY2UgKmxtLAorCXVuc2lnbmVkIGxvbmcgbG9uZyBsbV9iYXNlLCB2bWVfYWRkcmVzc190IGFzcGFjZSwgdm1lX2N5Y2xlX3QgY3ljbGUpCiB7CiAJdTMyIHRlbXBfYmFzZSwgbG1fY3RsID0gMDsKIAlpbnQgaTsKQEAgLTEyOTgsMTIgKzEyOTksMTIgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JbXV0ZXhfbG9jaygmKGxtLT5tdHgpKTsKKwltdXRleF9sb2NrKCZsbS0+bXR4KTsKIAogCS8qIElmIHdlIGFscmVhZHkgaGF2ZSBhIGNhbGxiYWNrIGF0dGFjaGVkLCB3ZSBjYW4ndCBtb3ZlIGl0ISAqLwogCWZvciAoaSA9IDA7IGkgPCBsbS0+bW9uaXRvcnM7IGkrKykgewogCQlpZiAoYnJpZGdlLT5sbV9jYWxsYmFja1tpXSAhPSBOVUxMKSB7Ci0JCQltdXRleF91bmxvY2soJihsbS0+bXR4KSk7CisJCQltdXRleF91bmxvY2soJmxtLT5tdHgpOwogCQkJZGV2X2VycihkZXYsICJMb2NhdGlvbiBtb25pdG9yIGNhbGxiYWNrIGF0dGFjaGVkLCAiCiAJCQkJImNhbid0IHJlc2V0XG4iKTsKIAkJCXJldHVybiAtRUJVU1k7CkBAIC0xMzIxLDcgKzEzMjIsNyBAQAogCQlsbV9jdGwgfD0gQ0E5MUNYNDJfTE1fQ1RMX0FTX0EzMjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJbXV0ZXhfdW5sb2NrKCYobG0tPm10eCkpOworCQltdXRleF91bmxvY2soJmxtLT5tdHgpOwogCQlkZXZfZXJyKGRldiwgIkludmFsaWQgYWRkcmVzcyBzcGFjZVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCQlicmVhazsKQEAgLTEzMzksNyArMTM0MCw3IEBACiAJaW93cml0ZTMyKGxtX2Jhc2UsIGJyaWRnZS0+YmFzZSArIExNX0JTKTsKIAlpb3dyaXRlMzIobG1fY3RsLCBicmlkZ2UtPmJhc2UgKyBMTV9DVEwpOwogCi0JbXV0ZXhfdW5sb2NrKCYobG0tPm10eCkpOworCW11dGV4X3VubG9jaygmbG0tPm10eCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEzNDcsMTUgKzEzNDgsMTUgQEAKIC8qIEdldCBjb25maWd1cmF0aW9uIG9mIHRoZSBjYWxsYmFjayBtb25pdG9yIGFuZCByZXR1cm4gd2hldGhlciBpdCBpcyBlbmFibGVkCiAgKiBvciBkaXNhYmxlZC4KICAqLwotaW50IGNhOTFjeDQyX2xtX2dldChzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlICpsbSwgdW5zaWduZWQgbG9uZyBsb25nICpsbV9iYXNlLAotCXZtZV9hZGRyZXNzX3QgKmFzcGFjZSwgdm1lX2N5Y2xlX3QgKmN5Y2xlKQorc3RhdGljIGludCBjYTkxY3g0Ml9sbV9nZXQoc3RydWN0IHZtZV9sbV9yZXNvdXJjZSAqbG0sCisJdW5zaWduZWQgbG9uZyBsb25nICpsbV9iYXNlLCB2bWVfYWRkcmVzc190ICphc3BhY2UsIHZtZV9jeWNsZV90ICpjeWNsZSkKIHsKIAl1MzIgbG1fY3RsLCBlbmFibGVkID0gMDsKIAlzdHJ1Y3QgY2E5MWN4NDJfZHJpdmVyICpicmlkZ2U7CiAKIAlicmlkZ2UgPSBsbS0+cGFyZW50LT5kcml2ZXJfcHJpdjsKIAotCW11dGV4X2xvY2soJihsbS0+bXR4KSk7CisJbXV0ZXhfbG9jaygmbG0tPm10eCk7CiAKIAkqbG1fYmFzZSA9ICh1bnNpZ25lZCBsb25nIGxvbmcpaW9yZWFkMzIoYnJpZGdlLT5iYXNlICsgTE1fQlMpOwogCWxtX2N0bCA9IGlvcmVhZDMyKGJyaWRnZS0+YmFzZSArIExNX0NUTCk7CkBAIC0xMzgwLDcgKzEzODEsNyBAQAogCWlmIChsbV9jdGwgJiBDQTkxQ1g0Ml9MTV9DVExfREFUQSkKIAkJKmN5Y2xlIHw9IFZNRV9EQVRBOwogCi0JbXV0ZXhfdW5sb2NrKCYobG0tPm10eCkpOworCW11dGV4X3VubG9jaygmbG0tPm10eCk7CiAKIAlyZXR1cm4gZW5hYmxlZDsKIH0KQEAgLTEzOTAsNyArMTM5MSw3IEBACiAgKgogICogQ2FsbGJhY2sgd2lsbCBiZSBwYXNzZWQgdGhlIG1vbml0b3IgdHJpZ2dlcmVkLgogICovCi1pbnQgY2E5MWN4NDJfbG1fYXR0YWNoKHN0cnVjdCB2bWVfbG1fcmVzb3VyY2UgKmxtLCBpbnQgbW9uaXRvciwKK3N0YXRpYyBpbnQgY2E5MWN4NDJfbG1fYXR0YWNoKHN0cnVjdCB2bWVfbG1fcmVzb3VyY2UgKmxtLCBpbnQgbW9uaXRvciwKIAl2b2lkICgqY2FsbGJhY2spKGludCkpCiB7CiAJdTMyIGxtX2N0bCwgdG1wOwpAQCAtMTQwMCwxOSArMTQwMSwxOSBAQAogCWJyaWRnZSA9IGxtLT5wYXJlbnQtPmRyaXZlcl9wcml2OwogCWRldiA9IGxtLT5wYXJlbnQtPnBhcmVudDsKIAotCW11dGV4X2xvY2soJihsbS0+bXR4KSk7CisJbXV0ZXhfbG9jaygmbG0tPm10eCk7CiAKIAkvKiBFbnN1cmUgdGhhdCB0aGUgbG9jYXRpb24gbW9uaXRvciBpcyBjb25maWd1cmVkIC0gbmVlZCBQR00gb3IgREFUQSAqLwogCWxtX2N0bCA9IGlvcmVhZDMyKGJyaWRnZS0+YmFzZSArIExNX0NUTCk7CiAJaWYgKChsbV9jdGwgJiAoQ0E5MUNYNDJfTE1fQ1RMX1BHTSB8IENBOTFDWDQyX0xNX0NUTF9EQVRBKSkgPT0gMCkgewotCQltdXRleF91bmxvY2soJihsbS0+bXR4KSk7CisJCW11dGV4X3VubG9jaygmbG0tPm10eCk7CiAJCWRldl9lcnIoZGV2LCAiTG9jYXRpb24gbW9uaXRvciBub3QgcHJvcGVybHkgY29uZmlndXJlZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCS8qIENoZWNrIHRoYXQgYSBjYWxsYmFjayBpc24ndCBhbHJlYWR5IGF0dGFjaGVkICovCiAJaWYgKGJyaWRnZS0+bG1fY2FsbGJhY2tbbW9uaXRvcl0gIT0gTlVMTCkgewotCQltdXRleF91bmxvY2soJihsbS0+bXR4KSk7CisJCW11dGV4X3VubG9jaygmbG0tPm10eCk7CiAJCWRldl9lcnIoZGV2LCAiRXhpc3RpbmcgY2FsbGJhY2sgYXR0YWNoZWRcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTE0MzEsNyArMTQzMiw3IEBACiAJCWlvd3JpdGUzMihsbV9jdGwsIGJyaWRnZS0+YmFzZSArIExNX0NUTCk7CiAJfQogCi0JbXV0ZXhfdW5sb2NrKCYobG0tPm10eCkpOworCW11dGV4X3VubG9jaygmbG0tPm10eCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE0MzksMTQgKzE0NDAsMTQgQEAKIC8qCiAgKiBEZXRhY2ggYSBjYWxsYmFjayBmdW5jdGlvbiBmb3JuIGEgc3BlY2lmaWMgbG9jYXRpb24gbW9uaXRvci4KICAqLwotaW50IGNhOTFjeDQyX2xtX2RldGFjaChzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlICpsbSwgaW50IG1vbml0b3IpCitzdGF0aWMgaW50IGNhOTFjeDQyX2xtX2RldGFjaChzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlICpsbSwgaW50IG1vbml0b3IpCiB7CiAJdTMyIHRtcDsKIAlzdHJ1Y3QgY2E5MWN4NDJfZHJpdmVyICpicmlkZ2U7CiAKIAlicmlkZ2UgPSBsbS0+cGFyZW50LT5kcml2ZXJfcHJpdjsKIAotCW11dGV4X2xvY2soJihsbS0+bXR4KSk7CisJbXV0ZXhfbG9jaygmbG0tPm10eCk7CiAKIAkvKiBEaXNhYmxlIExvY2F0aW9uIE1vbml0b3IgYW5kIGVuc3VyZSBwcmV2aW91cyBpbnRlcnJ1cHRzIGFyZSBjbGVhciAqLwogCXRtcCA9IGlvcmVhZDMyKGJyaWRnZS0+YmFzZSArIExJTlRfRU4pOwpAQCAtMTQ2NywxMiArMTQ2OCwxMiBAQAogCQlpb3dyaXRlMzIodG1wLCBicmlkZ2UtPmJhc2UgKyBMTV9DVEwpOwogCX0KIAotCW11dGV4X3VubG9jaygmKGxtLT5tdHgpKTsKKwltdXRleF91bmxvY2soJmxtLT5tdHgpOwogCiAJcmV0dXJuIDA7CiB9CiAKLWludCBjYTkxY3g0Ml9zbG90X2dldChzdHJ1Y3Qgdm1lX2JyaWRnZSAqY2E5MWN4NDJfYnJpZGdlKQorc3RhdGljIGludCBjYTkxY3g0Ml9zbG90X2dldChzdHJ1Y3Qgdm1lX2JyaWRnZSAqY2E5MWN4NDJfYnJpZGdlKQogewogCXUzMiBzbG90ID0gMDsKIAlzdHJ1Y3QgY2E5MWN4NDJfZHJpdmVyICpicmlkZ2U7CkBAIC0xNTI2LDcgKzE1MjcsNyBAQAogCiAJLyogQWxsb2NhdGUgbWVtIGZvciBDUi9DU1IgaW1hZ2UgKi8KIAlicmlkZ2UtPmNyY3NyX2tlcm5lbCA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIFZNRV9DUkNTUl9CVUZfU0laRSwKLQkJJihicmlkZ2UtPmNyY3NyX2J1cykpOworCQkmYnJpZGdlLT5jcmNzcl9idXMpOwogCWlmIChicmlkZ2UtPmNyY3NyX2tlcm5lbCA9PSBOVUxMKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIENSL0NTUiAiCiAJCQkiaW1hZ2VcbiIpOwpAQCAtMTYzMiwxMiArMTYzMywxMiBAQAogCX0KIAogCS8qIEluaXRpYWxpemUgd2FpdCBxdWV1ZXMgJiBtdXR1YWwgZXhjbHVzaW9uIGZsYWdzICovCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmKGNhOTFjeDQyX2RldmljZS0+ZG1hX3F1ZXVlKSk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmKGNhOTFjeDQyX2RldmljZS0+aWFja19xdWV1ZSkpOwotCW11dGV4X2luaXQoJihjYTkxY3g0Ml9kZXZpY2UtPnZtZV9pbnQpKTsKLQltdXRleF9pbml0KCYoY2E5MWN4NDJfZGV2aWNlLT52bWVfcm13KSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmY2E5MWN4NDJfZGV2aWNlLT5kbWFfcXVldWUpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNhOTFjeDQyX2RldmljZS0+aWFja19xdWV1ZSk7CisJbXV0ZXhfaW5pdCgmY2E5MWN4NDJfZGV2aWNlLT52bWVfaW50KTsKKwltdXRleF9pbml0KCZjYTkxY3g0Ml9kZXZpY2UtPnZtZV9ybXcpOwogCi0JY2E5MWN4NDJfYnJpZGdlLT5wYXJlbnQgPSAmKHBkZXYtPmRldik7CisJY2E5MWN4NDJfYnJpZGdlLT5wYXJlbnQgPSAmcGRldi0+ZGV2OwogCXN0cmNweShjYTkxY3g0Ml9icmlkZ2UtPm5hbWUsIGRyaXZlcl9uYW1lKTsKIAogCS8qIFNldHVwIElSUSAqLwpAQCAtMTY0OCw3ICsxNjQ5LDcgQEAKIAl9CiAKIAkvKiBBZGQgbWFzdGVyIHdpbmRvd3MgdG8gbGlzdCAqLwotCUlOSVRfTElTVF9IRUFEKCYoY2E5MWN4NDJfYnJpZGdlLT5tYXN0ZXJfcmVzb3VyY2VzKSk7CisJSU5JVF9MSVNUX0hFQUQoJmNhOTFjeDQyX2JyaWRnZS0+bWFzdGVyX3Jlc291cmNlcyk7CiAJZm9yIChpID0gMDsgaSA8IENBOTFDMTQyX01BWF9NQVNURVI7IGkrKykgewogCQltYXN0ZXJfaW1hZ2UgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSksCiAJCQlHRlBfS0VSTkVMKTsKQEAgLTE2NTksNyArMTY2MCw3IEBACiAJCQlnb3RvIGVycl9tYXN0ZXI7CiAJCX0KIAkJbWFzdGVyX2ltYWdlLT5wYXJlbnQgPSBjYTkxY3g0Ml9icmlkZ2U7Ci0JCXNwaW5fbG9ja19pbml0KCYobWFzdGVyX2ltYWdlLT5sb2NrKSk7CisJCXNwaW5fbG9ja19pbml0KCZtYXN0ZXJfaW1hZ2UtPmxvY2spOwogCQltYXN0ZXJfaW1hZ2UtPmxvY2tlZCA9IDA7CiAJCW1hc3Rlcl9pbWFnZS0+bnVtYmVyID0gaTsKIAkJbWFzdGVyX2ltYWdlLT5hZGRyZXNzX2F0dHIgPSBWTUVfQTE2IHwgVk1FX0EyNCB8IFZNRV9BMzIgfApAQCAtMTY2NywxNSArMTY2OCwxNSBAQAogCQltYXN0ZXJfaW1hZ2UtPmN5Y2xlX2F0dHIgPSBWTUVfU0NUIHwgVk1FX0JMVCB8IFZNRV9NQkxUIHwKIAkJCVZNRV9TVVBFUiB8IFZNRV9VU0VSIHwgVk1FX1BST0cgfCBWTUVfREFUQTsKIAkJbWFzdGVyX2ltYWdlLT53aWR0aF9hdHRyID0gVk1FX0Q4IHwgVk1FX0QxNiB8IFZNRV9EMzIgfCBWTUVfRDY0OwotCQltZW1zZXQoJihtYXN0ZXJfaW1hZ2UtPmJ1c19yZXNvdXJjZSksIDAsCisJCW1lbXNldCgmbWFzdGVyX2ltYWdlLT5idXNfcmVzb3VyY2UsIDAsCiAJCQlzaXplb2Yoc3RydWN0IHJlc291cmNlKSk7CiAJCW1hc3Rlcl9pbWFnZS0+a2Vybl9iYXNlICA9IE5VTEw7Ci0JCWxpc3RfYWRkX3RhaWwoJihtYXN0ZXJfaW1hZ2UtPmxpc3QpLAotCQkJJihjYTkxY3g0Ml9icmlkZ2UtPm1hc3Rlcl9yZXNvdXJjZXMpKTsKKwkJbGlzdF9hZGRfdGFpbCgmbWFzdGVyX2ltYWdlLT5saXN0LAorCQkJJmNhOTFjeDQyX2JyaWRnZS0+bWFzdGVyX3Jlc291cmNlcyk7CiAJfQogCiAJLyogQWRkIHNsYXZlIHdpbmRvd3MgdG8gbGlzdCAqLwotCUlOSVRfTElTVF9IRUFEKCYoY2E5MWN4NDJfYnJpZGdlLT5zbGF2ZV9yZXNvdXJjZXMpKTsKKwlJTklUX0xJU1RfSEVBRCgmY2E5MWN4NDJfYnJpZGdlLT5zbGF2ZV9yZXNvdXJjZXMpOwogCWZvciAoaSA9IDA7IGkgPCBDQTkxQzE0Ml9NQVhfU0xBVkU7IGkrKykgewogCQlzbGF2ZV9pbWFnZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2bWVfc2xhdmVfcmVzb3VyY2UpLAogCQkJR0ZQX0tFUk5FTCk7CkBAIC0xNjg2LDcgKzE2ODcsNyBAQAogCQkJZ290byBlcnJfc2xhdmU7CiAJCX0KIAkJc2xhdmVfaW1hZ2UtPnBhcmVudCA9IGNhOTFjeDQyX2JyaWRnZTsKLQkJbXV0ZXhfaW5pdCgmKHNsYXZlX2ltYWdlLT5tdHgpKTsKKwkJbXV0ZXhfaW5pdCgmc2xhdmVfaW1hZ2UtPm10eCk7CiAJCXNsYXZlX2ltYWdlLT5sb2NrZWQgPSAwOwogCQlzbGF2ZV9pbWFnZS0+bnVtYmVyID0gaTsKIAkJc2xhdmVfaW1hZ2UtPmFkZHJlc3NfYXR0ciA9IFZNRV9BMjQgfCBWTUVfQTMyIHwgVk1FX1VTRVIxIHwKQEAgLTE2OTgsMTIgKzE2OTksMTIgQEAKIAogCQlzbGF2ZV9pbWFnZS0+Y3ljbGVfYXR0ciA9IFZNRV9TQ1QgfCBWTUVfQkxUIHwgVk1FX01CTFQgfAogCQkJVk1FX1NVUEVSIHwgVk1FX1VTRVIgfCBWTUVfUFJPRyB8IFZNRV9EQVRBOwotCQlsaXN0X2FkZF90YWlsKCYoc2xhdmVfaW1hZ2UtPmxpc3QpLAotCQkJJihjYTkxY3g0Ml9icmlkZ2UtPnNsYXZlX3Jlc291cmNlcykpOworCQlsaXN0X2FkZF90YWlsKCZzbGF2ZV9pbWFnZS0+bGlzdCwKKwkJCSZjYTkxY3g0Ml9icmlkZ2UtPnNsYXZlX3Jlc291cmNlcyk7CiAJfQogCiAJLyogQWRkIGRtYSBlbmdpbmVzIHRvIGxpc3QgKi8KLQlJTklUX0xJU1RfSEVBRCgmKGNhOTFjeDQyX2JyaWRnZS0+ZG1hX3Jlc291cmNlcykpOworCUlOSVRfTElTVF9IRUFEKCZjYTkxY3g0Ml9icmlkZ2UtPmRtYV9yZXNvdXJjZXMpOwogCWZvciAoaSA9IDA7IGkgPCBDQTkxQzE0Ml9NQVhfRE1BOyBpKyspIHsKIAkJZG1hX2N0cmxyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHZtZV9kbWFfcmVzb3VyY2UpLAogCQkJR0ZQX0tFUk5FTCk7CkBAIC0xNzE0LDE5ICsxNzE1LDE5IEBACiAJCQlnb3RvIGVycl9kbWE7CiAJCX0KIAkJZG1hX2N0cmxyLT5wYXJlbnQgPSBjYTkxY3g0Ml9icmlkZ2U7Ci0JCW11dGV4X2luaXQoJihkbWFfY3RybHItPm10eCkpOworCQltdXRleF9pbml0KCZkbWFfY3RybHItPm10eCk7CiAJCWRtYV9jdHJsci0+bG9ja2VkID0gMDsKIAkJZG1hX2N0cmxyLT5udW1iZXIgPSBpOwogCQlkbWFfY3RybHItPnJvdXRlX2F0dHIgPSBWTUVfRE1BX1ZNRV9UT19NRU0gfAogCQkJVk1FX0RNQV9NRU1fVE9fVk1FOwotCQlJTklUX0xJU1RfSEVBRCgmKGRtYV9jdHJsci0+cGVuZGluZykpOwotCQlJTklUX0xJU1RfSEVBRCgmKGRtYV9jdHJsci0+cnVubmluZykpOwotCQlsaXN0X2FkZF90YWlsKCYoZG1hX2N0cmxyLT5saXN0KSwKLQkJCSYoY2E5MWN4NDJfYnJpZGdlLT5kbWFfcmVzb3VyY2VzKSk7CisJCUlOSVRfTElTVF9IRUFEKCZkbWFfY3RybHItPnBlbmRpbmcpOworCQlJTklUX0xJU1RfSEVBRCgmZG1hX2N0cmxyLT5ydW5uaW5nKTsKKwkJbGlzdF9hZGRfdGFpbCgmZG1hX2N0cmxyLT5saXN0LAorCQkJJmNhOTFjeDQyX2JyaWRnZS0+ZG1hX3Jlc291cmNlcyk7CiAJfQogCiAJLyogQWRkIGxvY2F0aW9uIG1vbml0b3IgdG8gbGlzdCAqLwotCUlOSVRfTElTVF9IRUFEKCYoY2E5MWN4NDJfYnJpZGdlLT5sbV9yZXNvdXJjZXMpKTsKKwlJTklUX0xJU1RfSEVBRCgmY2E5MWN4NDJfYnJpZGdlLT5sbV9yZXNvdXJjZXMpOwogCWxtID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHZtZV9sbV9yZXNvdXJjZSksIEdGUF9LRVJORUwpOwogCWlmIChsbSA9PSBOVUxMKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yICIKQEAgLTE3MzUsMTEgKzE3MzYsMTEgQEAKIAkJZ290byBlcnJfbG07CiAJfQogCWxtLT5wYXJlbnQgPSBjYTkxY3g0Ml9icmlkZ2U7Ci0JbXV0ZXhfaW5pdCgmKGxtLT5tdHgpKTsKKwltdXRleF9pbml0KCZsbS0+bXR4KTsKIAlsbS0+bG9ja2VkID0gMDsKIAlsbS0+bnVtYmVyID0gMTsKIAlsbS0+bW9uaXRvcnMgPSA0OwotCWxpc3RfYWRkX3RhaWwoJihsbS0+bGlzdCksICYoY2E5MWN4NDJfYnJpZGdlLT5sbV9yZXNvdXJjZXMpKTsKKwlsaXN0X2FkZF90YWlsKCZsbS0+bGlzdCwgJmNhOTFjeDQyX2JyaWRnZS0+bG1fcmVzb3VyY2VzKTsKIAogCWNhOTFjeDQyX2JyaWRnZS0+c2xhdmVfZ2V0ID0gY2E5MWN4NDJfc2xhdmVfZ2V0OwogCWNhOTFjeDQyX2JyaWRnZS0+c2xhdmVfc2V0ID0gY2E5MWN4NDJfc2xhdmVfc2V0OwpAQCAtMTc4NiwyOCArMTc4NywyOCBAQAogCWNhOTFjeDQyX2NyY3NyX2V4aXQoY2E5MWN4NDJfYnJpZGdlLCBwZGV2KTsKIGVycl9sbToKIAkvKiByZXNvdXJjZXMgYXJlIHN0b3JlZCBpbiBsaW5rIGxpc3QgKi8KLQlsaXN0X2Zvcl9lYWNoKHBvcywgJihjYTkxY3g0Ml9icmlkZ2UtPmxtX3Jlc291cmNlcykpIHsKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJmNhOTFjeDQyX2JyaWRnZS0+bG1fcmVzb3VyY2VzKSB7CiAJCWxtID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCB2bWVfbG1fcmVzb3VyY2UsIGxpc3QpOwogCQlsaXN0X2RlbChwb3MpOwogCQlrZnJlZShsbSk7CiAJfQogZXJyX2RtYToKIAkvKiByZXNvdXJjZXMgYXJlIHN0b3JlZCBpbiBsaW5rIGxpc3QgKi8KLQlsaXN0X2Zvcl9lYWNoKHBvcywgJihjYTkxY3g0Ml9icmlkZ2UtPmRtYV9yZXNvdXJjZXMpKSB7CisJbGlzdF9mb3JfZWFjaChwb3MsICZjYTkxY3g0Ml9icmlkZ2UtPmRtYV9yZXNvdXJjZXMpIHsKIAkJZG1hX2N0cmxyID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCB2bWVfZG1hX3Jlc291cmNlLCBsaXN0KTsKIAkJbGlzdF9kZWwocG9zKTsKIAkJa2ZyZWUoZG1hX2N0cmxyKTsKIAl9CiBlcnJfc2xhdmU6CiAJLyogcmVzb3VyY2VzIGFyZSBzdG9yZWQgaW4gbGluayBsaXN0ICovCi0JbGlzdF9mb3JfZWFjaChwb3MsICYoY2E5MWN4NDJfYnJpZGdlLT5zbGF2ZV9yZXNvdXJjZXMpKSB7CisJbGlzdF9mb3JfZWFjaChwb3MsICZjYTkxY3g0Ml9icmlkZ2UtPnNsYXZlX3Jlc291cmNlcykgewogCQlzbGF2ZV9pbWFnZSA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgdm1lX3NsYXZlX3Jlc291cmNlLCBsaXN0KTsKIAkJbGlzdF9kZWwocG9zKTsKIAkJa2ZyZWUoc2xhdmVfaW1hZ2UpOwogCX0KIGVycl9tYXN0ZXI6CiAJLyogcmVzb3VyY2VzIGFyZSBzdG9yZWQgaW4gbGluayBsaXN0ICovCi0JbGlzdF9mb3JfZWFjaChwb3MsICYoY2E5MWN4NDJfYnJpZGdlLT5tYXN0ZXJfcmVzb3VyY2VzKSkgeworCWxpc3RfZm9yX2VhY2gocG9zLCAmY2E5MWN4NDJfYnJpZGdlLT5tYXN0ZXJfcmVzb3VyY2VzKSB7CiAJCW1hc3Rlcl9pbWFnZSA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSwKIAkJCWxpc3QpOwogCQlsaXN0X2RlbChwb3MpOwpAQCAtMTgzMSw3ICsxODMyLDcgQEAKIAogfQogCi12b2lkIGNhOTFjeDQyX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3N0YXRpYyB2b2lkIGNhOTFjeDQyX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MgPSBOVUxMOwogCXN0cnVjdCB2bWVfbWFzdGVyX3Jlc291cmNlICptYXN0ZXJfaW1hZ2U7CkBAIC0xODcwLDI4ICsxODcxLDI4IEBACiAJY2E5MWN4NDJfY3Jjc3JfZXhpdChjYTkxY3g0Ml9icmlkZ2UsIHBkZXYpOwogCiAJLyogcmVzb3VyY2VzIGFyZSBzdG9yZWQgaW4gbGluayBsaXN0ICovCi0JbGlzdF9mb3JfZWFjaChwb3MsICYoY2E5MWN4NDJfYnJpZGdlLT5sbV9yZXNvdXJjZXMpKSB7CisJbGlzdF9mb3JfZWFjaChwb3MsICZjYTkxY3g0Ml9icmlkZ2UtPmxtX3Jlc291cmNlcykgewogCQlsbSA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlLCBsaXN0KTsKIAkJbGlzdF9kZWwocG9zKTsKIAkJa2ZyZWUobG0pOwogCX0KIAogCS8qIHJlc291cmNlcyBhcmUgc3RvcmVkIGluIGxpbmsgbGlzdCAqLwotCWxpc3RfZm9yX2VhY2gocG9zLCAmKGNhOTFjeDQyX2JyaWRnZS0+ZG1hX3Jlc291cmNlcykpIHsKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJmNhOTFjeDQyX2JyaWRnZS0+ZG1hX3Jlc291cmNlcykgewogCQlkbWFfY3RybHIgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHZtZV9kbWFfcmVzb3VyY2UsIGxpc3QpOwogCQlsaXN0X2RlbChwb3MpOwogCQlrZnJlZShkbWFfY3RybHIpOwogCX0KIAogCS8qIHJlc291cmNlcyBhcmUgc3RvcmVkIGluIGxpbmsgbGlzdCAqLwotCWxpc3RfZm9yX2VhY2gocG9zLCAmKGNhOTFjeDQyX2JyaWRnZS0+c2xhdmVfcmVzb3VyY2VzKSkgeworCWxpc3RfZm9yX2VhY2gocG9zLCAmY2E5MWN4NDJfYnJpZGdlLT5zbGF2ZV9yZXNvdXJjZXMpIHsKIAkJc2xhdmVfaW1hZ2UgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHZtZV9zbGF2ZV9yZXNvdXJjZSwgbGlzdCk7CiAJCWxpc3RfZGVsKHBvcyk7CiAJCWtmcmVlKHNsYXZlX2ltYWdlKTsKIAl9CiAKIAkvKiByZXNvdXJjZXMgYXJlIHN0b3JlZCBpbiBsaW5rIGxpc3QgKi8KLQlsaXN0X2Zvcl9lYWNoKHBvcywgJihjYTkxY3g0Ml9icmlkZ2UtPm1hc3Rlcl9yZXNvdXJjZXMpKSB7CisJbGlzdF9mb3JfZWFjaChwb3MsICZjYTkxY3g0Ml9icmlkZ2UtPm1hc3Rlcl9yZXNvdXJjZXMpIHsKIAkJbWFzdGVyX2ltYWdlID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCB2bWVfbWFzdGVyX3Jlc291cmNlLAogCQkJbGlzdCk7CiAJCWxpc3RfZGVsKHBvcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdm1lL2JyaWRnZXMvdm1lX2NhOTFjeDQyLmggYi9kcml2ZXJzL3N0YWdpbmcvdm1lL2JyaWRnZXMvdm1lX2NhOTFjeDQyLmgKaW5kZXggZTcyYzY1Yi4uMDJhN2M3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3ZtZS9icmlkZ2VzL3ZtZV9jYTkxY3g0Mi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvYnJpZGdlcy92bWVfY2E5MWN4NDIuaApAQCAtMzksNyArMzksNyBAQAogCiAvKiBTdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGRyaXZlciBzcGVjaWZpYyBpbmZvcm1hdGlvbiAqLwogc3RydWN0IGNhOTFjeDQyX2RyaXZlciB7Ci0Jdm9pZCAqYmFzZTsJLyogQmFzZSBBZGRyZXNzIG9mIGRldmljZSByZWdpc3RlcnMgKi8KKwl2b2lkIF9faW9tZW0gKmJhc2U7CS8qIEJhc2UgQWRkcmVzcyBvZiBkZXZpY2UgcmVnaXN0ZXJzICovCiAJd2FpdF9xdWV1ZV9oZWFkX3QgZG1hX3F1ZXVlOwogCXdhaXRfcXVldWVfaGVhZF90IGlhY2tfcXVldWU7CiAJd2FpdF9xdWV1ZV9oZWFkX3QgbWJveF9xdWV1ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92bWUvYnJpZGdlcy92bWVfdHNpMTQ4LmMgYi9kcml2ZXJzL3N0YWdpbmcvdm1lL2JyaWRnZXMvdm1lX3RzaTE0OC5jCmluZGV4IDQ5MmRkYjIuLjI2ZWE0MmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92bWUvYnJpZGdlcy92bWVfdHNpMTQ4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS9icmlkZ2VzL3ZtZV90c2kxNDguYwpAQCAtNDYsNyArNDYsNyBAQAogCiBzdGF0aWMgY2hhciBkcml2ZXJfbmFtZVtdID0gInZtZV90c2kxNDgiOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgdHNpMTQ4X2lkc1tdID0geworc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKHRzaTE0OF9pZHMpID0gewogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1RVTkRSQSwgUENJX0RFVklDRV9JRF9UVU5EUkFfVFNJMTQ4KSB9LAogCXsgfSwKIH07CkBAIC04MSwxMSArODEsMTEgQEAKIAl1MzIgc2VydmljZWQgPSAwOwogCiAJaWYgKGNoYW5uZWxfbWFzayAmIFRTSTE0OF9MQ1NSX0lOVFNfRE1BMFMpIHsKLQkJd2FrZV91cCgmKGJyaWRnZS0+ZG1hX3F1ZXVlWzBdKSk7CisJCXdha2VfdXAoJmJyaWRnZS0+ZG1hX3F1ZXVlWzBdKTsKIAkJc2VydmljZWQgfD0gVFNJMTQ4X0xDU1JfSU5UQ19ETUEwQzsKIAl9CiAJaWYgKGNoYW5uZWxfbWFzayAmIFRTSTE0OF9MQ1NSX0lOVFNfRE1BMVMpIHsKLQkJd2FrZV91cCgmKGJyaWRnZS0+ZG1hX3F1ZXVlWzFdKSk7CisJCXdha2VfdXAoJmJyaWRnZS0+ZG1hX3F1ZXVlWzFdKTsKIAkJc2VydmljZWQgfD0gVFNJMTQ4X0xDU1JfSU5UQ19ETUExQzsKIAl9CiAKQEAgLTE5MSw3ICsxOTEsNyBAQAogCWlmIChlcnJvcikgewogCQllcnJvci0+YWRkcmVzcyA9IGVycm9yX2FkZHI7CiAJCWVycm9yLT5hdHRyaWJ1dGVzID0gZXJyb3JfYXR0cmliOwotCQlsaXN0X2FkZF90YWlsKCYoZXJyb3ItPmxpc3QpLCAmKHRzaTE0OF9icmlkZ2UtPnZtZV9lcnJvcnMpKTsKKwkJbGlzdF9hZGRfdGFpbCgmZXJyb3ItPmxpc3QsICZ0c2kxNDhfYnJpZGdlLT52bWVfZXJyb3JzKTsKIAl9IGVsc2UgewogCQlkZXZfZXJyKHRzaTE0OF9icmlkZ2UtPnBhcmVudCwgIlVuYWJsZSB0byBhbGxvYyBtZW1vcnkgZm9yICIKIAkJCSJWTUVidXMgRXJyb3IgcmVwb3J0aW5nXG4iKTsKQEAgLTIxMCw3ICsyMTAsNyBAQAogICovCiBzdGF0aWMgdTMyIHRzaTE0OF9JQUNLX2lycWhhbmRsZXIoc3RydWN0IHRzaTE0OF9kcml2ZXIgKmJyaWRnZSkKIHsKLQl3YWtlX3VwKCYoYnJpZGdlLT5pYWNrX3F1ZXVlKSk7CisJd2FrZV91cCgmYnJpZGdlLT5pYWNrX3F1ZXVlKTsKIAogCXJldHVybiBUU0kxNDhfTENTUl9JTlRDX0lBQ0tDOwogfQpAQCAtMzIwLDkgKzMyMCw5IEBACiAJYnJpZGdlID0gdHNpMTQ4X2JyaWRnZS0+ZHJpdmVyX3ByaXY7CiAKIAkvKiBJbml0aWFsaXNlIGxpc3QgZm9yIFZNRSBidXMgZXJyb3JzICovCi0JSU5JVF9MSVNUX0hFQUQoJih0c2kxNDhfYnJpZGdlLT52bWVfZXJyb3JzKSk7CisJSU5JVF9MSVNUX0hFQUQoJnRzaTE0OF9icmlkZ2UtPnZtZV9lcnJvcnMpOwogCi0JbXV0ZXhfaW5pdCgmKHRzaTE0OF9icmlkZ2UtPmlycV9tdHgpKTsKKwltdXRleF9pbml0KCZ0c2kxNDhfYnJpZGdlLT5pcnFfbXR4KTsKIAogCXJlc3VsdCA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwKIAkJCSAgICAgdHNpMTQ4X2lycWhhbmRsZXIsCkBAIC0zNzQsOCArMzc0LDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHRzaTE0OF9pcnFfZXhpdChzdHJ1Y3QgdHNpMTQ4X2RyaXZlciAqYnJpZGdlLCBzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3N0YXRpYyB2b2lkIHRzaTE0OF9pcnFfZXhpdChzdHJ1Y3Qgdm1lX2JyaWRnZSAqdHNpMTQ4X2JyaWRnZSwKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKKwlzdHJ1Y3QgdHNpMTQ4X2RyaXZlciAqYnJpZGdlID0gdHNpMTQ4X2JyaWRnZS0+ZHJpdmVyX3ByaXY7CisKIAkvKiBUdXJuIG9mZiBpbnRlcnJ1cHRzICovCiAJaW93cml0ZTMyYmUoMHgwLCBicmlkZ2UtPmJhc2UgKyBUU0kxNDhfTENTUl9JTlRFTyk7CiAJaW93cml0ZTMyYmUoMHgwLCBicmlkZ2UtPmJhc2UgKyBUU0kxNDhfTENTUl9JTlRFTik7CkBAIC0zODQsMTMgKzM4NywxMyBAQAogCWlvd3JpdGUzMmJlKDB4RkZGRkZGRkYsIGJyaWRnZS0+YmFzZSArIFRTSTE0OF9MQ1NSX0lOVEMpOwogCiAJLyogRGV0YWNoIGludGVycnVwdCBoYW5kbGVyICovCi0JZnJlZV9pcnEocGRldi0+aXJxLCBwZGV2KTsKKwlmcmVlX2lycShwZGV2LT5pcnEsIHRzaTE0OF9icmlkZ2UpOwogfQogCiAvKgogICogQ2hlY2sgdG8gc2VlIGlmIGFuIElBQ2sgaGFzIGJlZW4gcmVjZWl2ZWQsIHJldHVybiB0cnVlICgxKSBvciBmYWxzZSAoMCkuCiAgKi8KLWludCB0c2kxNDhfaWFja19yZWNlaXZlZChzdHJ1Y3QgdHNpMTQ4X2RyaXZlciAqYnJpZGdlKQorc3RhdGljIGludCB0c2kxNDhfaWFja19yZWNlaXZlZChzdHJ1Y3QgdHNpMTQ4X2RyaXZlciAqYnJpZGdlKQogewogCXUzMiB0bXA7CiAKQEAgLTQwNSw3ICs0MDgsNyBAQAogLyoKICAqIENvbmZpZ3VyZSBWTUUgaW50ZXJydXB0CiAgKi8KLXZvaWQgdHNpMTQ4X2lycV9zZXQoc3RydWN0IHZtZV9icmlkZ2UgKnRzaTE0OF9icmlkZ2UsIGludCBsZXZlbCwKK3N0YXRpYyB2b2lkIHRzaTE0OF9pcnFfc2V0KHN0cnVjdCB2bWVfYnJpZGdlICp0c2kxNDhfYnJpZGdlLCBpbnQgbGV2ZWwsCiAJaW50IHN0YXRlLCBpbnQgc3luYykKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKQEAgLTQ0NSwxNCArNDQ4LDE1IEBACiAgKiBHZW5lcmF0ZSBhIFZNRSBidXMgaW50ZXJydXB0IGF0IHRoZSByZXF1ZXN0ZWQgbGV2ZWwgJiB2ZWN0b3IuIFdhaXQgZm9yCiAgKiBpbnRlcnJ1cHQgdG8gYmUgYWNrZWQuCiAgKi8KLWludCB0c2kxNDhfaXJxX2dlbmVyYXRlKHN0cnVjdCB2bWVfYnJpZGdlICp0c2kxNDhfYnJpZGdlLCBpbnQgbGV2ZWwsIGludCBzdGF0aWQpCitzdGF0aWMgaW50IHRzaTE0OF9pcnFfZ2VuZXJhdGUoc3RydWN0IHZtZV9icmlkZ2UgKnRzaTE0OF9icmlkZ2UsIGludCBsZXZlbCwKKwlpbnQgc3RhdGlkKQogewogCXUzMiB0bXA7CiAJc3RydWN0IHRzaTE0OF9kcml2ZXIgKmJyaWRnZTsKIAogCWJyaWRnZSA9IHRzaTE0OF9icmlkZ2UtPmRyaXZlcl9wcml2OwogCi0JbXV0ZXhfbG9jaygmKGJyaWRnZS0+dm1lX2ludCkpOworCW11dGV4X2xvY2soJmJyaWRnZS0+dm1lX2ludCk7CiAKIAkvKiBSZWFkIFZJQ1IgcmVnaXN0ZXIgKi8KIAl0bXAgPSBpb3JlYWQzMmJlKGJyaWRnZS0+YmFzZSArIFRTSTE0OF9MQ1NSX1ZJQ1IpOwpAQCAtNDcwLDcgKzQ3NCw3IEBACiAJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGJyaWRnZS0+aWFja19xdWV1ZSwKIAkJdHNpMTQ4X2lhY2tfcmVjZWl2ZWQoYnJpZGdlKSk7CiAKLQltdXRleF91bmxvY2soJihicmlkZ2UtPnZtZV9pbnQpKTsKKwltdXRleF91bmxvY2soJmJyaWRnZS0+dm1lX2ludCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQ5Niw3ICs1MDAsNyBAQAogCSAqLwogCWVycl9wb3MgPSBOVUxMOwogCS8qIEl0ZXJhdGUgdGhyb3VnaCBlcnJvcnMgKi8KLQlsaXN0X2Zvcl9lYWNoKGVycl9wb3MsICYodHNpMTQ4X2JyaWRnZS0+dm1lX2Vycm9ycykpIHsKKwlsaXN0X2Zvcl9lYWNoKGVycl9wb3MsICZ0c2kxNDhfYnJpZGdlLT52bWVfZXJyb3JzKSB7CiAJCXZtZV9lcnIgPSBsaXN0X2VudHJ5KGVycl9wb3MsIHN0cnVjdCB2bWVfYnVzX2Vycm9yLCBsaXN0KTsKIAkJaWYgKCh2bWVfZXJyLT5hZGRyZXNzID49IGFkZHJlc3MpICYmCiAJCQkodm1lX2Vyci0+YWRkcmVzcyA8IGJvdW5kKSkgewpAQCAtNTMwLDcgKzUzNCw3IEBACiAJICovCiAJZXJyX3BvcyA9IE5VTEw7CiAJLyogSXRlcmF0ZSB0aHJvdWdoIGVycm9ycyAqLwotCWxpc3RfZm9yX2VhY2hfc2FmZShlcnJfcG9zLCB0ZW1wLCAmKHRzaTE0OF9icmlkZ2UtPnZtZV9lcnJvcnMpKSB7CisJbGlzdF9mb3JfZWFjaF9zYWZlKGVycl9wb3MsIHRlbXAsICZ0c2kxNDhfYnJpZGdlLT52bWVfZXJyb3JzKSB7CiAJCXZtZV9lcnIgPSBsaXN0X2VudHJ5KGVycl9wb3MsIHN0cnVjdCB2bWVfYnVzX2Vycm9yLCBsaXN0KTsKIAogCQlpZiAoKHZtZV9lcnItPmFkZHJlc3MgPj0gYWRkcmVzcykgJiYKQEAgLTU0NSw3ICs1NDksNyBAQAogLyoKICAqIEluaXRpYWxpemUgYSBzbGF2ZSB3aW5kb3cgd2l0aCB0aGUgcmVxdWVzdGVkIGF0dHJpYnV0ZXMuCiAgKi8KLWludCB0c2kxNDhfc2xhdmVfc2V0KHN0cnVjdCB2bWVfc2xhdmVfcmVzb3VyY2UgKmltYWdlLCBpbnQgZW5hYmxlZCwKK3N0YXRpYyBpbnQgdHNpMTQ4X3NsYXZlX3NldChzdHJ1Y3Qgdm1lX3NsYXZlX3Jlc291cmNlICppbWFnZSwgaW50IGVuYWJsZWQsCiAJdW5zaWduZWQgbG9uZyBsb25nIHZtZV9iYXNlLCB1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZSwKIAlkbWFfYWRkcl90IHBjaV9iYXNlLCB2bWVfYWRkcmVzc190IGFzcGFjZSwgdm1lX2N5Y2xlX3QgY3ljbGUpCiB7CkBAIC02OTUsNyArNjk5LDcgQEAKIC8qCiAgKiBHZXQgc2xhdmUgd2luZG93IGNvbmZpZ3VyYXRpb24uCiAgKi8KLWludCB0c2kxNDhfc2xhdmVfZ2V0KHN0cnVjdCB2bWVfc2xhdmVfcmVzb3VyY2UgKmltYWdlLCBpbnQgKmVuYWJsZWQsCitzdGF0aWMgaW50IHRzaTE0OF9zbGF2ZV9nZXQoc3RydWN0IHZtZV9zbGF2ZV9yZXNvdXJjZSAqaW1hZ2UsIGludCAqZW5hYmxlZCwKIAl1bnNpZ25lZCBsb25nIGxvbmcgKnZtZV9iYXNlLCB1bnNpZ25lZCBsb25nIGxvbmcgKnNpemUsCiAJZG1hX2FkZHJfdCAqcGNpX2Jhc2UsIHZtZV9hZGRyZXNzX3QgKmFzcGFjZSwgdm1lX2N5Y2xlX3QgKmN5Y2xlKQogewpAQCAtODE5LDggKzgyMyw4IEBACiAJCWltYWdlLT5rZXJuX2Jhc2UgPSBOVUxMOwogCQlpZiAoaW1hZ2UtPmJ1c19yZXNvdXJjZS5uYW1lICE9IE5VTEwpCiAJCQlrZnJlZShpbWFnZS0+YnVzX3Jlc291cmNlLm5hbWUpOwotCQlyZWxlYXNlX3Jlc291cmNlKCYoaW1hZ2UtPmJ1c19yZXNvdXJjZSkpOwotCQltZW1zZXQoJihpbWFnZS0+YnVzX3Jlc291cmNlKSwgMCwgc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOworCQlyZWxlYXNlX3Jlc291cmNlKCZpbWFnZS0+YnVzX3Jlc291cmNlKTsKKwkJbWVtc2V0KCZpbWFnZS0+YnVzX3Jlc291cmNlLCAwLCBzaXplb2Yoc3RydWN0IHJlc291cmNlKSk7CiAJfQogCiAJLyogRXhpdCBoZXJlIGlmIHNpemUgaXMgemVybyAqLwpAQCAtODQ1LDcgKzg0OSw3IEBACiAJaW1hZ2UtPmJ1c19yZXNvdXJjZS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNOwogCiAJcmV0dmFsID0gcGNpX2J1c19hbGxvY19yZXNvdXJjZShwZGV2LT5idXMsCi0JCSYoaW1hZ2UtPmJ1c19yZXNvdXJjZSksIHNpemUsIHNpemUsIFBDSUJJT1NfTUlOX01FTSwKKwkJJmltYWdlLT5idXNfcmVzb3VyY2UsIHNpemUsIHNpemUsIFBDSUJJT1NfTUlOX01FTSwKIAkJMCwgTlVMTCwgTlVMTCk7CiAJaWYgKHJldHZhbCkgewogCQlkZXZfZXJyKHRzaTE0OF9icmlkZ2UtPnBhcmVudCwgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW0gIgpAQCAtODY4LDEwICs4NzIsMTAgQEAKIAlpb3VubWFwKGltYWdlLT5rZXJuX2Jhc2UpOwogCWltYWdlLT5rZXJuX2Jhc2UgPSBOVUxMOwogZXJyX3JlbWFwOgotCXJlbGVhc2VfcmVzb3VyY2UoJihpbWFnZS0+YnVzX3Jlc291cmNlKSk7CisJcmVsZWFzZV9yZXNvdXJjZSgmaW1hZ2UtPmJ1c19yZXNvdXJjZSk7CiBlcnJfcmVzb3VyY2U6CiAJa2ZyZWUoaW1hZ2UtPmJ1c19yZXNvdXJjZS5uYW1lKTsKLQltZW1zZXQoJihpbWFnZS0+YnVzX3Jlc291cmNlKSwgMCwgc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOworCW1lbXNldCgmaW1hZ2UtPmJ1c19yZXNvdXJjZSwgMCwgc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOwogZXJyX25hbWU6CiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTg4MywxNSArODg3LDE1IEBACiB7CiAJaW91bm1hcChpbWFnZS0+a2Vybl9iYXNlKTsKIAlpbWFnZS0+a2Vybl9iYXNlID0gTlVMTDsKLQlyZWxlYXNlX3Jlc291cmNlKCYoaW1hZ2UtPmJ1c19yZXNvdXJjZSkpOworCXJlbGVhc2VfcmVzb3VyY2UoJmltYWdlLT5idXNfcmVzb3VyY2UpOwogCWtmcmVlKGltYWdlLT5idXNfcmVzb3VyY2UubmFtZSk7Ci0JbWVtc2V0KCYoaW1hZ2UtPmJ1c19yZXNvdXJjZSksIDAsIHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKKwltZW1zZXQoJmltYWdlLT5idXNfcmVzb3VyY2UsIDAsIHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKIH0KIAogLyoKICAqIFNldCB0aGUgYXR0cmlidXRlcyBvZiBhbiBvdXRib3VuZCB3aW5kb3cuCiAgKi8KLWludCB0c2kxNDhfbWFzdGVyX3NldChzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSAqaW1hZ2UsIGludCBlbmFibGVkLAorc3RhdGljIGludCB0c2kxNDhfbWFzdGVyX3NldChzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSAqaW1hZ2UsIGludCBlbmFibGVkLAogCXVuc2lnbmVkIGxvbmcgbG9uZyB2bWVfYmFzZSwgdW5zaWduZWQgbG9uZyBsb25nIHNpemUsCiAJdm1lX2FkZHJlc3NfdCBhc3BhY2UsIHZtZV9jeWNsZV90IGN5Y2xlLCB2bWVfd2lkdGhfdCBkd2lkdGgpCiB7CkBAIC05MjQsNyArOTI4LDcgQEAKIAkJZ290byBlcnJfd2luZG93OwogCX0KIAotCXNwaW5fbG9jaygmKGltYWdlLT5sb2NrKSk7CisJc3Bpbl9sb2NrKCZpbWFnZS0+bG9jayk7CiAKIAkvKiBMZXQncyBhbGxvY2F0ZSB0aGUgcmVzb3VyY2UgaGVyZSByYXRoZXIgdGhhbiBmdXJ0aGVyIHVwIHRoZSBzdGFjayBhcwogCSAqIGl0IGF2b2lkcyBwdXNoaW5nIGxvYWRzIG9mIGJ1cyBkZXBlbmRhbnQgc3R1ZmYgdXAgdGhlIHN0YWNrLiBJZiBzaXplCkBAIC05MzIsNyArOTM2LDcgQEAKIAkgKi8KIAlyZXR2YWwgPSB0c2kxNDhfYWxsb2NfcmVzb3VyY2UoaW1hZ2UsIHNpemUpOwogCWlmIChyZXR2YWwpIHsKLQkJc3Bpbl91bmxvY2soJihpbWFnZS0+bG9jaykpOworCQlzcGluX3VubG9jaygmaW1hZ2UtPmxvY2spOwogCQlkZXZfZXJyKHRzaTE0OF9icmlkZ2UtPnBhcmVudCwgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yICIKIAkJCSJyZXNvdXJjZVxuIik7CiAJCWdvdG8gZXJyX3JlczsKQEAgLTk1OSwxOSArOTYzLDE5IEBACiAJcmVnX3NwbGl0KHZtZV9vZmZzZXQsICZ2bWVfb2Zmc2V0X2hpZ2gsICZ2bWVfb2Zmc2V0X2xvdyk7CiAKIAlpZiAocGNpX2Jhc2VfbG93ICYgMHhGRkZGKSB7Ci0JCXNwaW5fdW5sb2NrKCYoaW1hZ2UtPmxvY2spKTsKKwkJc3Bpbl91bmxvY2soJmltYWdlLT5sb2NrKTsKIAkJZGV2X2Vycih0c2kxNDhfYnJpZGdlLT5wYXJlbnQsICJJbnZhbGlkIFBDSSBiYXNlIGFsaWdubWVudFxuIik7CiAJCXJldHZhbCA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyX2dyYW47CiAJfQogCWlmIChwY2lfYm91bmRfbG93ICYgMHhGRkZGKSB7Ci0JCXNwaW5fdW5sb2NrKCYoaW1hZ2UtPmxvY2spKTsKKwkJc3Bpbl91bmxvY2soJmltYWdlLT5sb2NrKTsKIAkJZGV2X2Vycih0c2kxNDhfYnJpZGdlLT5wYXJlbnQsICJJbnZhbGlkIFBDSSBib3VuZCBhbGlnbm1lbnRcbiIpOwogCQlyZXR2YWwgPSAtRUlOVkFMOwogCQlnb3RvIGVycl9ncmFuOwogCX0KIAlpZiAodm1lX29mZnNldF9sb3cgJiAweEZGRkYpIHsKLQkJc3Bpbl91bmxvY2soJihpbWFnZS0+bG9jaykpOworCQlzcGluX3VubG9jaygmaW1hZ2UtPmxvY2spOwogCQlkZXZfZXJyKHRzaTE0OF9icmlkZ2UtPnBhcmVudCwgIkludmFsaWQgVk1FIE9mZnNldCAiCiAJCQkiYWxpZ25tZW50XG4iKTsKIAkJcmV0dmFsID0gLUVJTlZBTDsKQEAgLTEwMzUsNyArMTAzOSw3IEBACiAJCXRlbXBfY3RsIHw9IFRTSTE0OF9MQ1NSX09UQVRfREJXXzMyOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlzcGluX3VubG9jaygmKGltYWdlLT5sb2NrKSk7CisJCXNwaW5fdW5sb2NrKCZpbWFnZS0+bG9jayk7CiAJCWRldl9lcnIodHNpMTQ4X2JyaWRnZS0+cGFyZW50LCAiSW52YWxpZCBkYXRhIHdpZHRoXG4iKTsKIAkJcmV0dmFsID0gLUVJTlZBTDsKIAkJZ290byBlcnJfZHdpZHRoOwpAQCAtMTA3Miw3ICsxMDc2LDcgQEAKIAkJdGVtcF9jdGwgfD0gVFNJMTQ4X0xDU1JfT1RBVF9BTU9ERV9VU0VSNDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJc3Bpbl91bmxvY2soJihpbWFnZS0+bG9jaykpOworCQlzcGluX3VubG9jaygmaW1hZ2UtPmxvY2spOwogCQlkZXZfZXJyKHRzaTE0OF9icmlkZ2UtPnBhcmVudCwgIkludmFsaWQgYWRkcmVzcyBzcGFjZVxuIik7CiAJCXJldHZhbCA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyX2FzcGFjZTsKQEAgLTExMDksNyArMTExMyw3IEBACiAJaW93cml0ZTMyYmUodGVtcF9jdGwsIGJyaWRnZS0+YmFzZSArIFRTSTE0OF9MQ1NSX09UW2ldICsKIAkJVFNJMTQ4X0xDU1JfT0ZGU0VUX09UQVQpOwogCi0Jc3Bpbl91bmxvY2soJihpbWFnZS0+bG9jaykpOworCXNwaW5fdW5sb2NrKCZpbWFnZS0+bG9jayk7CiAJcmV0dXJuIDA7CiAKIGVycl9hc3BhY2U6CkBAIC0xMTI3LDcgKzExMzEsNyBAQAogICoKICAqIFhYWCBOb3QgcGFyc2luZyBwcmVmZXRjaCBpbmZvcm1hdGlvbi4KICAqLwotaW50IF9fdHNpMTQ4X21hc3Rlcl9nZXQoc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UgKmltYWdlLCBpbnQgKmVuYWJsZWQsCitzdGF0aWMgaW50IF9fdHNpMTQ4X21hc3Rlcl9nZXQoc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UgKmltYWdlLCBpbnQgKmVuYWJsZWQsCiAJdW5zaWduZWQgbG9uZyBsb25nICp2bWVfYmFzZSwgdW5zaWduZWQgbG9uZyBsb25nICpzaXplLAogCXZtZV9hZGRyZXNzX3QgKmFzcGFjZSwgdm1lX2N5Y2xlX3QgKmN5Y2xlLCB2bWVfd2lkdGhfdCAqZHdpZHRoKQogewpAQCAtMTIzNywyMyArMTI0MSwyMyBAQAogfQogCiAKLWludCB0c2kxNDhfbWFzdGVyX2dldChzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSAqaW1hZ2UsIGludCAqZW5hYmxlZCwKK3N0YXRpYyBpbnQgdHNpMTQ4X21hc3Rlcl9nZXQoc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UgKmltYWdlLCBpbnQgKmVuYWJsZWQsCiAJdW5zaWduZWQgbG9uZyBsb25nICp2bWVfYmFzZSwgdW5zaWduZWQgbG9uZyBsb25nICpzaXplLAogCXZtZV9hZGRyZXNzX3QgKmFzcGFjZSwgdm1lX2N5Y2xlX3QgKmN5Y2xlLCB2bWVfd2lkdGhfdCAqZHdpZHRoKQogewogCWludCByZXR2YWw7CiAKLQlzcGluX2xvY2soJihpbWFnZS0+bG9jaykpOworCXNwaW5fbG9jaygmaW1hZ2UtPmxvY2spOwogCiAJcmV0dmFsID0gX190c2kxNDhfbWFzdGVyX2dldChpbWFnZSwgZW5hYmxlZCwgdm1lX2Jhc2UsIHNpemUsIGFzcGFjZSwKIAkJY3ljbGUsIGR3aWR0aCk7CiAKLQlzcGluX3VubG9jaygmKGltYWdlLT5sb2NrKSk7CisJc3Bpbl91bmxvY2soJmltYWdlLT5sb2NrKTsKIAogCXJldHVybiByZXR2YWw7CiB9CiAKLXNzaXplX3QgdHNpMTQ4X21hc3Rlcl9yZWFkKHN0cnVjdCB2bWVfbWFzdGVyX3Jlc291cmNlICppbWFnZSwgdm9pZCAqYnVmLAorc3RhdGljIHNzaXplX3QgdHNpMTQ4X21hc3Rlcl9yZWFkKHN0cnVjdCB2bWVfbWFzdGVyX3Jlc291cmNlICppbWFnZSwgdm9pZCAqYnVmLAogCXNpemVfdCBjb3VudCwgbG9mZl90IG9mZnNldCkKIHsKIAlpbnQgcmV0dmFsLCBlbmFibGVkOwpAQCAtMTI2Niw3ICsxMjcwLDcgQEAKIAogCXRzaTE0OF9icmlkZ2UgPSBpbWFnZS0+cGFyZW50OwogCi0Jc3Bpbl9sb2NrKCYoaW1hZ2UtPmxvY2spKTsKKwlzcGluX2xvY2soJmltYWdlLT5sb2NrKTsKIAogCW1lbWNweV9mcm9taW8oYnVmLCBpbWFnZS0+a2Vybl9iYXNlICsgb2Zmc2V0LCAodW5zaWduZWQgaW50KWNvdW50KTsKIAlyZXR2YWwgPSBjb3VudDsKQEAgLTEyODksMTMgKzEyOTMsMTMgQEAKIAl9CiAKIHNraXBfY2hrOgotCXNwaW5fdW5sb2NrKCYoaW1hZ2UtPmxvY2spKTsKKwlzcGluX3VubG9jaygmaW1hZ2UtPmxvY2spOwogCiAJcmV0dXJuIHJldHZhbDsKIH0KIAogCi1zc2l6ZV90IHRzaTE0OF9tYXN0ZXJfd3JpdGUoc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UgKmltYWdlLCB2b2lkICpidWYsCitzdGF0aWMgc3NpemVfdCB0c2kxNDhfbWFzdGVyX3dyaXRlKHN0cnVjdCB2bWVfbWFzdGVyX3Jlc291cmNlICppbWFnZSwgdm9pZCAqYnVmLAogCXNpemVfdCBjb3VudCwgbG9mZl90IG9mZnNldCkKIHsKIAlpbnQgcmV0dmFsID0gMCwgZW5hYmxlZDsKQEAgLTEzMTIsNyArMTMxNiw3IEBACiAKIAlicmlkZ2UgPSB0c2kxNDhfYnJpZGdlLT5kcml2ZXJfcHJpdjsKIAotCXNwaW5fbG9jaygmKGltYWdlLT5sb2NrKSk7CisJc3Bpbl9sb2NrKCZpbWFnZS0+bG9jayk7CiAKIAltZW1jcHlfdG9pbyhpbWFnZS0+a2Vybl9iYXNlICsgb2Zmc2V0LCBidWYsICh1bnNpZ25lZCBpbnQpY291bnQpOwogCXJldHZhbCA9IGNvdW50OwpAQCAtMTM1Miw3ICsxMzU2LDcgQEAKIAl9CiAKIHNraXBfY2hrOgotCXNwaW5fdW5sb2NrKCYoaW1hZ2UtPmxvY2spKTsKKwlzcGluX3VubG9jaygmaW1hZ2UtPmxvY2spOwogCiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTEzNjIsNyArMTM2Niw3IEBACiAgKgogICogUmVxdWlyZXMgYSBwcmV2aW91c2x5IGNvbmZpZ3VyZWQgbWFzdGVyIHdpbmRvdywgcmV0dXJucyBmaW5hbCB2YWx1ZS4KICAqLwotdW5zaWduZWQgaW50IHRzaTE0OF9tYXN0ZXJfcm13KHN0cnVjdCB2bWVfbWFzdGVyX3Jlc291cmNlICppbWFnZSwKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdHNpMTQ4X21hc3Rlcl9ybXcoc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UgKmltYWdlLAogCXVuc2lnbmVkIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgY29tcGFyZSwgdW5zaWduZWQgaW50IHN3YXAsCiAJbG9mZl90IG9mZnNldCkKIHsKQEAgLTEzNzgsMTAgKzEzODIsMTAgQEAKIAlpID0gaW1hZ2UtPm51bWJlcjsKIAogCS8qIExvY2tpbmcgYXMgd2UgY2FuIG9ubHkgZG8gb25lIG9mIHRoZXNlIGF0IGEgdGltZSAqLwotCW11dGV4X2xvY2soJihicmlkZ2UtPnZtZV9ybXcpKTsKKwltdXRleF9sb2NrKCZicmlkZ2UtPnZtZV9ybXcpOwogCiAJLyogTG9jayBpbWFnZSAqLwotCXNwaW5fbG9jaygmKGltYWdlLT5sb2NrKSk7CisJc3Bpbl9sb2NrKCZpbWFnZS0+bG9jayk7CiAKIAlwY2lfYWRkcl9oaWdoID0gaW9yZWFkMzJiZShicmlkZ2UtPmJhc2UgKyBUU0kxNDhfTENTUl9PVFtpXSArCiAJCVRTSTE0OF9MQ1NSX09GRlNFVF9PVFNBVSk7CkBAIC0xNDExLDkgKzE0MTUsOSBAQAogCXRtcCAmPSB+VFNJMTQ4X0xDU1JfVk1DVFJMX1JNV0VOOwogCWlvd3JpdGUzMmJlKHRtcCwgYnJpZGdlLT5iYXNlICsgVFNJMTQ4X0xDU1JfVk1DVFJMKTsKIAotCXNwaW5fdW5sb2NrKCYoaW1hZ2UtPmxvY2spKTsKKwlzcGluX3VubG9jaygmaW1hZ2UtPmxvY2spOwogCi0JbXV0ZXhfdW5sb2NrKCYoYnJpZGdlLT52bWVfcm13KSk7CisJbXV0ZXhfdW5sb2NrKCZicmlkZ2UtPnZtZV9ybXcpOwogCiAJcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTE2MDksOCArMTYxMyw4IEBACiAvKgogICogQWRkIGEgbGluayBsaXN0IGRlc2NyaXB0b3IgdG8gdGhlIGxpc3QKICAqLwotaW50IHRzaTE0OF9kbWFfbGlzdF9hZGQoc3RydWN0IHZtZV9kbWFfbGlzdCAqbGlzdCwgc3RydWN0IHZtZV9kbWFfYXR0ciAqc3JjLAotCXN0cnVjdCB2bWVfZG1hX2F0dHIgKmRlc3QsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBpbnQgdHNpMTQ4X2RtYV9saXN0X2FkZChzdHJ1Y3Qgdm1lX2RtYV9saXN0ICpsaXN0LAorCXN0cnVjdCB2bWVfZG1hX2F0dHIgKnNyYywgc3RydWN0IHZtZV9kbWFfYXR0ciAqZGVzdCwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCB0c2kxNDhfZG1hX2VudHJ5ICplbnRyeSwgKnByZXY7CiAJdTMyIGFkZHJlc3NfaGlnaCwgYWRkcmVzc19sb3c7CkBAIC0xNjMzLDEwICsxNjM3LDEwIEBACiAJfQogCiAJLyogVGVzdCBkZXNjcmlwdG9yIGFsaWdubWVudCAqLwotCWlmICgodW5zaWduZWQgbG9uZykmKGVudHJ5LT5kZXNjcmlwdG9yKSAmIDB4NykgeworCWlmICgodW5zaWduZWQgbG9uZykmZW50cnktPmRlc2NyaXB0b3IgJiAweDcpIHsKIAkJZGV2X2Vycih0c2kxNDhfYnJpZGdlLT5wYXJlbnQsICJEZXNjcmlwdG9yIG5vdCBhbGlnbmVkIHRvIDggIgogCQkJImJ5dGUgYm91bmRhcnkgYXMgcmVxdWlyZWQ6ICVwXG4iLAotCQkJJihlbnRyeS0+ZGVzY3JpcHRvcikpOworCQkJJmVudHJ5LT5kZXNjcmlwdG9yKTsKIAkJcmV0dmFsID0gLUVJTlZBTDsKIAkJZ290byBlcnJfYWxpZ247CiAJfQpAQCAtMTY0NCw3ICsxNjQ4LDcgQEAKIAkvKiBHaXZlbiB3ZSBhcmUgZ29pbmcgdG8gZmlsbCBvdXQgdGhlIHN0cnVjdHVyZSwgd2UgcHJvYmFibHkgZG9uJ3QKIAkgKiBuZWVkIHRvIHplcm8gaXQsIGJ1dCBiZXR0ZXIgc2FmZSB0aGFuIHNvcnJ5IGZvciBub3cuCiAJICovCi0JbWVtc2V0KCYoZW50cnktPmRlc2NyaXB0b3IpLCAwLCBzaXplb2Yoc3RydWN0IHRzaTE0OF9kbWFfZGVzY3JpcHRvcikpOworCW1lbXNldCgmZW50cnktPmRlc2NyaXB0b3IsIDAsIHNpemVvZihzdHJ1Y3QgdHNpMTQ4X2RtYV9kZXNjcmlwdG9yKSk7CiAKIAkvKiBGaWxsIG91dCBzb3VyY2UgcGFydCAqLwogCXN3aXRjaCAoc3JjLT50eXBlKSB7CkBAIC0xNjgxLDcgKzE2ODUsNyBAQAogCQllbnRyeS0+ZGVzY3JpcHRvci5kc2F0ID0gVFNJMTQ4X0xDU1JfRFNBVF9UWVBfVk1FOwogCiAJCXJldHZhbCA9IHRzaTE0OF9kbWFfc2V0X3ZtZV9zcmNfYXR0cmlidXRlcygKLQkJCXRzaTE0OF9icmlkZ2UtPnBhcmVudCwgJihlbnRyeS0+ZGVzY3JpcHRvci5kc2F0KSwKKwkJCXRzaTE0OF9icmlkZ2UtPnBhcmVudCwgJmVudHJ5LT5kZXNjcmlwdG9yLmRzYXQsCiAJCQl2bWVfYXR0ci0+YXNwYWNlLCB2bWVfYXR0ci0+Y3ljbGUsIHZtZV9hdHRyLT5kd2lkdGgpOwogCQlpZiAocmV0dmFsIDwgMCkKIAkJCWdvdG8gZXJyX3NvdXJjZTsKQEAgLTE3MTksNyArMTcyMyw3IEBACiAJCWVudHJ5LT5kZXNjcmlwdG9yLmRkYXQgPSBUU0kxNDhfTENTUl9EREFUX1RZUF9WTUU7CiAKIAkJcmV0dmFsID0gdHNpMTQ4X2RtYV9zZXRfdm1lX2Rlc3RfYXR0cmlidXRlcygKLQkJCXRzaTE0OF9icmlkZ2UtPnBhcmVudCwgJihlbnRyeS0+ZGVzY3JpcHRvci5kZGF0KSwKKwkJCXRzaTE0OF9icmlkZ2UtPnBhcmVudCwgJmVudHJ5LT5kZXNjcmlwdG9yLmRkYXQsCiAJCQl2bWVfYXR0ci0+YXNwYWNlLCB2bWVfYXR0ci0+Y3ljbGUsIHZtZV9hdHRyLT5kd2lkdGgpOwogCQlpZiAocmV0dmFsIDwgMCkKIAkJCWdvdG8gZXJyX2Rlc3Q7CkBAIC0xNzM1LDE2ICsxNzM5LDE2IEBACiAJZW50cnktPmRlc2NyaXB0b3IuZGNudCA9ICh1MzIpY291bnQ7CiAKIAkvKiBBZGQgdG8gbGlzdCAqLwotCWxpc3RfYWRkX3RhaWwoJihlbnRyeS0+bGlzdCksICYobGlzdC0+ZW50cmllcykpOworCWxpc3RfYWRkX3RhaWwoJmVudHJ5LT5saXN0LCAmbGlzdC0+ZW50cmllcyk7CiAKIAkvKiBGaWxsIG91dCBwcmV2aW91cyBkZXNjcmlwdG9ycyAiTmV4dCBBZGRyZXNzIiAqLwotCWlmIChlbnRyeS0+bGlzdC5wcmV2ICE9ICYobGlzdC0+ZW50cmllcykpIHsKKwlpZiAoZW50cnktPmxpc3QucHJldiAhPSAmbGlzdC0+ZW50cmllcykgewogCQlwcmV2ID0gbGlzdF9lbnRyeShlbnRyeS0+bGlzdC5wcmV2LCBzdHJ1Y3QgdHNpMTQ4X2RtYV9lbnRyeSwKIAkJCWxpc3QpOwogCQkvKiBXZSBuZWVkIHRoZSBidXMgYWRkcmVzcyBmb3IgdGhlIHBvaW50ZXIgKi8KLQkJZGVzY19wdHIgPSB2aXJ0X3RvX2J1cygmKGVudHJ5LT5kZXNjcmlwdG9yKSk7Ci0JCXJlZ19zcGxpdChkZXNjX3B0ciwgJihwcmV2LT5kZXNjcmlwdG9yLmRubGF1KSwKLQkJCSYocHJldi0+ZGVzY3JpcHRvci5kbmxhbCkpOworCQlkZXNjX3B0ciA9IHZpcnRfdG9fYnVzKCZlbnRyeS0+ZGVzY3JpcHRvcik7CisJCXJlZ19zcGxpdChkZXNjX3B0ciwgJnByZXYtPmRlc2NyaXB0b3IuZG5sYXUsCisJCQkmcHJldi0+ZGVzY3JpcHRvci5kbmxhbCk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xNzgyLDcgKzE3ODYsNyBAQAogICoKICAqIFhYWCBOZWVkIHRvIHByb3ZpZGUgY29udHJvbCByZWdpc3RlciBjb25maWd1cmF0aW9uLgogICovCi1pbnQgdHNpMTQ4X2RtYV9saXN0X2V4ZWMoc3RydWN0IHZtZV9kbWFfbGlzdCAqbGlzdCkKK3N0YXRpYyBpbnQgdHNpMTQ4X2RtYV9saXN0X2V4ZWMoc3RydWN0IHZtZV9kbWFfbGlzdCAqbGlzdCkKIHsKIAlzdHJ1Y3Qgdm1lX2RtYV9yZXNvdXJjZSAqY3RybHI7CiAJaW50IGNoYW5uZWwsIHJldHZhbCA9IDA7CkBAIC0xNzk5LDMwICsxODAzLDMwIEBACiAKIAlicmlkZ2UgPSB0c2kxNDhfYnJpZGdlLT5kcml2ZXJfcHJpdjsKIAotCW11dGV4X2xvY2soJihjdHJsci0+bXR4KSk7CisJbXV0ZXhfbG9jaygmY3RybHItPm10eCk7CiAKIAljaGFubmVsID0gY3RybHItPm51bWJlcjsKIAotCWlmICghbGlzdF9lbXB0eSgmKGN0cmxyLT5ydW5uaW5nKSkpIHsKKwlpZiAoIWxpc3RfZW1wdHkoJmN0cmxyLT5ydW5uaW5nKSkgewogCQkvKgogCQkgKiBYWFggV2UgaGF2ZSBhbiBhY3RpdmUgRE1BIHRyYW5zZmVyIGFuZCBjdXJyZW50bHkgaGF2ZW4ndAogCQkgKiAgICAgc29ydGVkIG91dCB0aGUgbWVjaGFuaXNtIGZvciAicGVuZGluZyIgRE1BIHRyYW5zZmVycy4KIAkJICogICAgIFJldHVybiBidXN5LgogCQkgKi8KIAkJLyogTmVlZCB0byBhZGQgdG8gcGVuZGluZyBoZXJlICovCi0JCW11dGV4X3VubG9jaygmKGN0cmxyLT5tdHgpKTsKKwkJbXV0ZXhfdW5sb2NrKCZjdHJsci0+bXR4KTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9IGVsc2UgewotCQlsaXN0X2FkZCgmKGxpc3QtPmxpc3QpLCAmKGN0cmxyLT5ydW5uaW5nKSk7CisJCWxpc3RfYWRkKCZsaXN0LT5saXN0LCAmY3RybHItPnJ1bm5pbmcpOwogCX0KIAogCS8qIEdldCBmaXJzdCBidXMgYWRkcmVzcyBhbmQgd3JpdGUgaW50byByZWdpc3RlcnMgKi8KLQllbnRyeSA9IGxpc3RfZmlyc3RfZW50cnkoJihsaXN0LT5lbnRyaWVzKSwgc3RydWN0IHRzaTE0OF9kbWFfZW50cnksCisJZW50cnkgPSBsaXN0X2ZpcnN0X2VudHJ5KCZsaXN0LT5lbnRyaWVzLCBzdHJ1Y3QgdHNpMTQ4X2RtYV9lbnRyeSwKIAkJbGlzdCk7CiAKLQlidXNfYWRkciA9IHZpcnRfdG9fYnVzKCYoZW50cnktPmRlc2NyaXB0b3IpKTsKKwlidXNfYWRkciA9IHZpcnRfdG9fYnVzKCZlbnRyeS0+ZGVzY3JpcHRvcik7CiAKLQltdXRleF91bmxvY2soJihjdHJsci0+bXR4KSk7CisJbXV0ZXhfdW5sb2NrKCZjdHJsci0+bXR4KTsKIAogCXJlZ19zcGxpdChidXNfYWRkciwgJmJ1c19hZGRyX2hpZ2gsICZidXNfYWRkcl9sb3cpOwogCkBAIC0xODUwLDkgKzE4NTQsOSBAQAogCX0KIAogCS8qIFJlbW92ZSBsaXN0IGZyb20gcnVubmluZyBsaXN0ICovCi0JbXV0ZXhfbG9jaygmKGN0cmxyLT5tdHgpKTsKLQlsaXN0X2RlbCgmKGxpc3QtPmxpc3QpKTsKLQltdXRleF91bmxvY2soJihjdHJsci0+bXR4KSk7CisJbXV0ZXhfbG9jaygmY3RybHItPm10eCk7CisJbGlzdF9kZWwoJmxpc3QtPmxpc3QpOworCW11dGV4X3VubG9jaygmY3RybHItPm10eCk7CiAKIAlyZXR1cm4gcmV0dmFsOwogfQpAQCAtMTg2MiwxMyArMTg2NiwxMyBAQAogICoKICAqIFdlIGhhdmUgYSBzZXBhcmF0ZSBmdW5jdGlvbiwgZG9uJ3QgYXNzdW1lIHRoYXQgdGhlIGNoYWluIGNhbid0IGJlIHJldXNlZC4KICAqLwotaW50IHRzaTE0OF9kbWFfbGlzdF9lbXB0eShzdHJ1Y3Qgdm1lX2RtYV9saXN0ICpsaXN0KQorc3RhdGljIGludCB0c2kxNDhfZG1hX2xpc3RfZW1wdHkoc3RydWN0IHZtZV9kbWFfbGlzdCAqbGlzdCkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MsICp0ZW1wOwogCXN0cnVjdCB0c2kxNDhfZG1hX2VudHJ5ICplbnRyeTsKIAogCS8qIGRldGFjaCBhbmQgZnJlZSBlYWNoIGVudHJ5ICovCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdGVtcCwgJihsaXN0LT5lbnRyaWVzKSkgeworCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHRlbXAsICZsaXN0LT5lbnRyaWVzKSB7CiAJCWxpc3RfZGVsKHBvcyk7CiAJCWVudHJ5ID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCB0c2kxNDhfZG1hX2VudHJ5LCBsaXN0KTsKIAkJa2ZyZWUoZW50cnkpOwpAQCAtMTg4NCw3ICsxODg4LDcgQEAKICAqIFRoaXMgZG9lcyBub3QgZW5hYmxlIHRoZSBMTSBtb25pdG9yIC0gdGhhdCBzaG91bGQgYmUgZG9uZSB3aGVuIHRoZSBmaXJzdAogICogY2FsbGJhY2sgaXMgYXR0YWNoZWQgYW5kIGRpc2FibGVkIHdoZW4gdGhlIGxhc3QgY2FsbGJhY2sgaXMgcmVtb3ZlZC4KICAqLwotaW50IHRzaTE0OF9sbV9zZXQoc3RydWN0IHZtZV9sbV9yZXNvdXJjZSAqbG0sIHVuc2lnbmVkIGxvbmcgbG9uZyBsbV9iYXNlLAorc3RhdGljIGludCB0c2kxNDhfbG1fc2V0KHN0cnVjdCB2bWVfbG1fcmVzb3VyY2UgKmxtLCB1bnNpZ25lZCBsb25nIGxvbmcgbG1fYmFzZSwKIAl2bWVfYWRkcmVzc190IGFzcGFjZSwgdm1lX2N5Y2xlX3QgY3ljbGUpCiB7CiAJdTMyIGxtX2Jhc2VfaGlnaCwgbG1fYmFzZV9sb3csIGxtX2N0bCA9IDA7CkBAIC0xODk2LDEyICsxOTAwLDEyIEBACiAKIAlicmlkZ2UgPSB0c2kxNDhfYnJpZGdlLT5kcml2ZXJfcHJpdjsKIAotCW11dGV4X2xvY2soJihsbS0+bXR4KSk7CisJbXV0ZXhfbG9jaygmbG0tPm10eCk7CiAKIAkvKiBJZiB3ZSBhbHJlYWR5IGhhdmUgYSBjYWxsYmFjayBhdHRhY2hlZCwgd2UgY2FuJ3QgbW92ZSBpdCEgKi8KIAlmb3IgKGkgPSAwOyBpIDwgbG0tPm1vbml0b3JzOyBpKyspIHsKIAkJaWYgKGJyaWRnZS0+bG1fY2FsbGJhY2tbaV0gIT0gTlVMTCkgewotCQkJbXV0ZXhfdW5sb2NrKCYobG0tPm10eCkpOworCQkJbXV0ZXhfdW5sb2NrKCZsbS0+bXR4KTsKIAkJCWRldl9lcnIodHNpMTQ4X2JyaWRnZS0+cGFyZW50LCAiTG9jYXRpb24gbW9uaXRvciAiCiAJCQkJImNhbGxiYWNrIGF0dGFjaGVkLCBjYW4ndCByZXNldFxuIik7CiAJCQlyZXR1cm4gLUVCVVNZOwpAQCAtMTkyMiw3ICsxOTI2LDcgQEAKIAkJbG1fY3RsIHw9IFRTSTE0OF9MQ1NSX0xNQVRfQVNfQTY0OwogCQlicmVhazsKIAlkZWZhdWx0OgotCQltdXRleF91bmxvY2soJihsbS0+bXR4KSk7CisJCW11dGV4X3VubG9jaygmbG0tPm10eCk7CiAJCWRldl9lcnIodHNpMTQ4X2JyaWRnZS0+cGFyZW50LCAiSW52YWxpZCBhZGRyZXNzIHNwYWNlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJCWJyZWFrOwpAQCAtMTk0Myw3ICsxOTQ3LDcgQEAKIAlpb3dyaXRlMzJiZShsbV9iYXNlX2xvdywgYnJpZGdlLT5iYXNlICsgVFNJMTQ4X0xDU1JfTE1CQUwpOwogCWlvd3JpdGUzMmJlKGxtX2N0bCwgYnJpZGdlLT5iYXNlICsgVFNJMTQ4X0xDU1JfTE1BVCk7CiAKLQltdXRleF91bmxvY2soJihsbS0+bXR4KSk7CisJbXV0ZXhfdW5sb2NrKCZsbS0+bXR4KTsKIAogCXJldHVybiAwOwogfQpAQCAtMTk1MSwxNSArMTk1NSwxNSBAQAogLyogR2V0IGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNhbGxiYWNrIG1vbml0b3IgYW5kIHJldHVybiB3aGV0aGVyIGl0IGlzIGVuYWJsZWQKICAqIG9yIGRpc2FibGVkLgogICovCi1pbnQgdHNpMTQ4X2xtX2dldChzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlICpsbSwgdW5zaWduZWQgbG9uZyBsb25nICpsbV9iYXNlLAotCXZtZV9hZGRyZXNzX3QgKmFzcGFjZSwgdm1lX2N5Y2xlX3QgKmN5Y2xlKQorc3RhdGljIGludCB0c2kxNDhfbG1fZ2V0KHN0cnVjdCB2bWVfbG1fcmVzb3VyY2UgKmxtLAorCXVuc2lnbmVkIGxvbmcgbG9uZyAqbG1fYmFzZSwgdm1lX2FkZHJlc3NfdCAqYXNwYWNlLCB2bWVfY3ljbGVfdCAqY3ljbGUpCiB7CiAJdTMyIGxtX2Jhc2VfaGlnaCwgbG1fYmFzZV9sb3csIGxtX2N0bCwgZW5hYmxlZCA9IDA7CiAJc3RydWN0IHRzaTE0OF9kcml2ZXIgKmJyaWRnZTsKIAogCWJyaWRnZSA9IGxtLT5wYXJlbnQtPmRyaXZlcl9wcml2OwogCi0JbXV0ZXhfbG9jaygmKGxtLT5tdHgpKTsKKwltdXRleF9sb2NrKCZsbS0+bXR4KTsKIAogCWxtX2Jhc2VfaGlnaCA9IGlvcmVhZDMyYmUoYnJpZGdlLT5iYXNlICsgVFNJMTQ4X0xDU1JfTE1CQVUpOwogCWxtX2Jhc2VfbG93ID0gaW9yZWFkMzJiZShicmlkZ2UtPmJhc2UgKyBUU0kxNDhfTENTUl9MTUJBTCk7CkBAIC0xOTkyLDcgKzE5OTYsNyBAQAogCWlmIChsbV9jdGwgJiBUU0kxNDhfTENTUl9MTUFUX0RBVEEpCiAJCSpjeWNsZSB8PSBWTUVfREFUQTsKIAotCW11dGV4X3VubG9jaygmKGxtLT5tdHgpKTsKKwltdXRleF91bmxvY2soJmxtLT5tdHgpOwogCiAJcmV0dXJuIGVuYWJsZWQ7CiB9CkBAIC0yMDAyLDcgKzIwMDYsNyBAQAogICoKICAqIENhbGxiYWNrIHdpbGwgYmUgcGFzc2VkIHRoZSBtb25pdG9yIHRyaWdnZXJlZC4KICAqLwotaW50IHRzaTE0OF9sbV9hdHRhY2goc3RydWN0IHZtZV9sbV9yZXNvdXJjZSAqbG0sIGludCBtb25pdG9yLAorc3RhdGljIGludCB0c2kxNDhfbG1fYXR0YWNoKHN0cnVjdCB2bWVfbG1fcmVzb3VyY2UgKmxtLCBpbnQgbW9uaXRvciwKIAl2b2lkICgqY2FsbGJhY2spKGludCkpCiB7CiAJdTMyIGxtX2N0bCwgdG1wOwpAQCAtMjAxMywxMiArMjAxNywxMiBAQAogCiAJYnJpZGdlID0gdHNpMTQ4X2JyaWRnZS0+ZHJpdmVyX3ByaXY7CiAKLQltdXRleF9sb2NrKCYobG0tPm10eCkpOworCW11dGV4X2xvY2soJmxtLT5tdHgpOwogCiAJLyogRW5zdXJlIHRoYXQgdGhlIGxvY2F0aW9uIG1vbml0b3IgaXMgY29uZmlndXJlZCAtIG5lZWQgUEdNIG9yIERBVEEgKi8KIAlsbV9jdGwgPSBpb3JlYWQzMmJlKGJyaWRnZS0+YmFzZSArIFRTSTE0OF9MQ1NSX0xNQVQpOwogCWlmICgobG1fY3RsICYgKFRTSTE0OF9MQ1NSX0xNQVRfUEdNIHwgVFNJMTQ4X0xDU1JfTE1BVF9EQVRBKSkgPT0gMCkgewotCQltdXRleF91bmxvY2soJihsbS0+bXR4KSk7CisJCW11dGV4X3VubG9jaygmbG0tPm10eCk7CiAJCWRldl9lcnIodHNpMTQ4X2JyaWRnZS0+cGFyZW50LCAiTG9jYXRpb24gbW9uaXRvciBub3QgcHJvcGVybHkgIgogCQkJImNvbmZpZ3VyZWRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTIwMjYsNyArMjAzMCw3IEBACiAKIAkvKiBDaGVjayB0aGF0IGEgY2FsbGJhY2sgaXNuJ3QgYWxyZWFkeSBhdHRhY2hlZCAqLwogCWlmIChicmlkZ2UtPmxtX2NhbGxiYWNrW21vbml0b3JdICE9IE5VTEwpIHsKLQkJbXV0ZXhfdW5sb2NrKCYobG0tPm10eCkpOworCQltdXRleF91bmxvY2soJmxtLT5tdHgpOwogCQlkZXZfZXJyKHRzaTE0OF9icmlkZ2UtPnBhcmVudCwgIkV4aXN0aW5nIGNhbGxiYWNrIGF0dGFjaGVkXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CkBAIC0yMDQ5LDcgKzIwNTMsNyBAQAogCQlpb3dyaXRlMzJiZShsbV9jdGwsIGJyaWRnZS0+YmFzZSArIFRTSTE0OF9MQ1NSX0xNQVQpOwogCX0KIAotCW11dGV4X3VubG9jaygmKGxtLT5tdHgpKTsKKwltdXRleF91bmxvY2soJmxtLT5tdHgpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yMDU3LDE0ICsyMDYxLDE0IEBACiAvKgogICogRGV0YWNoIGEgY2FsbGJhY2sgZnVuY3Rpb24gZm9ybiBhIHNwZWNpZmljIGxvY2F0aW9uIG1vbml0b3IuCiAgKi8KLWludCB0c2kxNDhfbG1fZGV0YWNoKHN0cnVjdCB2bWVfbG1fcmVzb3VyY2UgKmxtLCBpbnQgbW9uaXRvcikKK3N0YXRpYyBpbnQgdHNpMTQ4X2xtX2RldGFjaChzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlICpsbSwgaW50IG1vbml0b3IpCiB7CiAJdTMyIGxtX2VuLCB0bXA7CiAJc3RydWN0IHRzaTE0OF9kcml2ZXIgKmJyaWRnZTsKIAogCWJyaWRnZSA9IGxtLT5wYXJlbnQtPmRyaXZlcl9wcml2OwogCi0JbXV0ZXhfbG9jaygmKGxtLT5tdHgpKTsKKwltdXRleF9sb2NrKCZsbS0+bXR4KTsKIAogCS8qIERpc2FibGUgTG9jYXRpb24gTW9uaXRvciBhbmQgZW5zdXJlIHByZXZpb3VzIGludGVycnVwdHMgYXJlIGNsZWFyICovCiAJbG1fZW4gPSBpb3JlYWQzMmJlKGJyaWRnZS0+YmFzZSArIFRTSTE0OF9MQ1NSX0lOVEVOKTsKQEAgLTIwODksNyArMjA5Myw3IEBACiAJCWlvd3JpdGUzMmJlKHRtcCwgYnJpZGdlLT5iYXNlICsgVFNJMTQ4X0xDU1JfTE1BVCk7CiAJfQogCi0JbXV0ZXhfdW5sb2NrKCYobG0tPm10eCkpOworCW11dGV4X3VubG9jaygmbG0tPm10eCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIwOTcsNyArMjEwMSw3IEBACiAvKgogICogRGV0ZXJtaW5lIEdlb2dyYXBoaWNhbCBBZGRyZXNzaW5nCiAgKi8KLWludCB0c2kxNDhfc2xvdF9nZXQoc3RydWN0IHZtZV9icmlkZ2UgKnRzaTE0OF9icmlkZ2UpCitzdGF0aWMgaW50IHRzaTE0OF9zbG90X2dldChzdHJ1Y3Qgdm1lX2JyaWRnZSAqdHNpMTQ4X2JyaWRnZSkKIHsKIAl1MzIgc2xvdCA9IDA7CiAJc3RydWN0IHRzaTE0OF9kcml2ZXIgKmJyaWRnZTsKQEAgLTIxNDIsNyArMjE0Niw3IEBACiAKIAkvKiBBbGxvY2F0ZSBtZW0gZm9yIENSL0NTUiBpbWFnZSAqLwogCWJyaWRnZS0+Y3Jjc3Jfa2VybmVsID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgVk1FX0NSQ1NSX0JVRl9TSVpFLAotCQkmKGJyaWRnZS0+Y3Jjc3JfYnVzKSk7CisJCSZicmlkZ2UtPmNyY3NyX2J1cyk7CiAJaWYgKGJyaWRnZS0+Y3Jjc3Jfa2VybmVsID09IE5VTEwpIHsKIAkJZGV2X2Vycih0c2kxNDhfYnJpZGdlLT5wYXJlbnQsICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciAiCiAJCQkiQ1IvQ1NSIGltYWdlXG4iKTsKQEAgLTIyODAsMTMgKzIyODQsMTMgQEAKIAl9CiAKIAkvKiBJbml0aWFsaXplIHdhaXQgcXVldWVzICYgbXV0dWFsIGV4Y2x1c2lvbiBmbGFncyAqLwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJih0c2kxNDhfZGV2aWNlLT5kbWFfcXVldWVbMF0pKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCYodHNpMTQ4X2RldmljZS0+ZG1hX3F1ZXVlWzFdKSk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmKHRzaTE0OF9kZXZpY2UtPmlhY2tfcXVldWUpKTsKLQltdXRleF9pbml0KCYodHNpMTQ4X2RldmljZS0+dm1lX2ludCkpOwotCW11dGV4X2luaXQoJih0c2kxNDhfZGV2aWNlLT52bWVfcm13KSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmdHNpMTQ4X2RldmljZS0+ZG1hX3F1ZXVlWzBdKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0c2kxNDhfZGV2aWNlLT5kbWFfcXVldWVbMV0pOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnRzaTE0OF9kZXZpY2UtPmlhY2tfcXVldWUpOworCW11dGV4X2luaXQoJnRzaTE0OF9kZXZpY2UtPnZtZV9pbnQpOworCW11dGV4X2luaXQoJnRzaTE0OF9kZXZpY2UtPnZtZV9ybXcpOwogCi0JdHNpMTQ4X2JyaWRnZS0+cGFyZW50ID0gJihwZGV2LT5kZXYpOworCXRzaTE0OF9icmlkZ2UtPnBhcmVudCA9ICZwZGV2LT5kZXY7CiAJc3RyY3B5KHRzaTE0OF9icmlkZ2UtPm5hbWUsIGRyaXZlcl9uYW1lKTsKIAogCS8qIFNldHVwIElSUSAqLwpAQCAtMjMxNCw3ICsyMzE4LDcgQEAKIAkJCWdvdG8gZXJyX21hc3RlcjsKIAkJfQogCQl0c2kxNDhfZGV2aWNlLT5mbHVzaF9pbWFnZS0+cGFyZW50ID0gdHNpMTQ4X2JyaWRnZTsKLQkJc3Bpbl9sb2NrX2luaXQoJih0c2kxNDhfZGV2aWNlLT5mbHVzaF9pbWFnZS0+bG9jaykpOworCQlzcGluX2xvY2tfaW5pdCgmdHNpMTQ4X2RldmljZS0+Zmx1c2hfaW1hZ2UtPmxvY2spOwogCQl0c2kxNDhfZGV2aWNlLT5mbHVzaF9pbWFnZS0+bG9ja2VkID0gMTsKIAkJdHNpMTQ4X2RldmljZS0+Zmx1c2hfaW1hZ2UtPm51bWJlciA9IG1hc3Rlcl9udW07CiAJCXRzaTE0OF9kZXZpY2UtPmZsdXNoX2ltYWdlLT5hZGRyZXNzX2F0dHIgPSBWTUVfQTE2IHwgVk1FX0EyNCB8CkBAIC0yMzI0LDEzICsyMzI4LDEzIEBACiAJCQlWTUVfMmVTU1QxNjAgfCBWTUVfMmVTU1QyNjcgfCBWTUVfMmVTU1QzMjAgfCBWTUVfU1VQRVIgfAogCQkJVk1FX1VTRVIgfCBWTUVfUFJPRyB8IFZNRV9EQVRBOwogCQl0c2kxNDhfZGV2aWNlLT5mbHVzaF9pbWFnZS0+d2lkdGhfYXR0ciA9IFZNRV9EMTYgfCBWTUVfRDMyOwotCQltZW1zZXQoJih0c2kxNDhfZGV2aWNlLT5mbHVzaF9pbWFnZS0+YnVzX3Jlc291cmNlKSwgMCwKKwkJbWVtc2V0KCZ0c2kxNDhfZGV2aWNlLT5mbHVzaF9pbWFnZS0+YnVzX3Jlc291cmNlLCAwLAogCQkJc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOwogCQl0c2kxNDhfZGV2aWNlLT5mbHVzaF9pbWFnZS0+a2Vybl9iYXNlICA9IE5VTEw7CiAJfQogCiAJLyogQWRkIG1hc3RlciB3aW5kb3dzIHRvIGxpc3QgKi8KLQlJTklUX0xJU1RfSEVBRCgmKHRzaTE0OF9icmlkZ2UtPm1hc3Rlcl9yZXNvdXJjZXMpKTsKKwlJTklUX0xJU1RfSEVBRCgmdHNpMTQ4X2JyaWRnZS0+bWFzdGVyX3Jlc291cmNlcyk7CiAJZm9yIChpID0gMDsgaSA8IG1hc3Rlcl9udW07IGkrKykgewogCQltYXN0ZXJfaW1hZ2UgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSksCiAJCQlHRlBfS0VSTkVMKTsKQEAgLTIzNDEsNyArMjM0NSw3IEBACiAJCQlnb3RvIGVycl9tYXN0ZXI7CiAJCX0KIAkJbWFzdGVyX2ltYWdlLT5wYXJlbnQgPSB0c2kxNDhfYnJpZGdlOwotCQlzcGluX2xvY2tfaW5pdCgmKG1hc3Rlcl9pbWFnZS0+bG9jaykpOworCQlzcGluX2xvY2tfaW5pdCgmbWFzdGVyX2ltYWdlLT5sb2NrKTsKIAkJbWFzdGVyX2ltYWdlLT5sb2NrZWQgPSAwOwogCQltYXN0ZXJfaW1hZ2UtPm51bWJlciA9IGk7CiAJCW1hc3Rlcl9pbWFnZS0+YWRkcmVzc19hdHRyID0gVk1FX0ExNiB8IFZNRV9BMjQgfCBWTUVfQTMyIHwKQEAgLTIzNTEsMTUgKzIzNTUsMTUgQEAKIAkJCVZNRV8yZVNTVDI2NyB8IFZNRV8yZVNTVDMyMCB8IFZNRV9TVVBFUiB8IFZNRV9VU0VSIHwKIAkJCVZNRV9QUk9HIHwgVk1FX0RBVEE7CiAJCW1hc3Rlcl9pbWFnZS0+d2lkdGhfYXR0ciA9IFZNRV9EMTYgfCBWTUVfRDMyOwotCQltZW1zZXQoJihtYXN0ZXJfaW1hZ2UtPmJ1c19yZXNvdXJjZSksIDAsCisJCW1lbXNldCgmbWFzdGVyX2ltYWdlLT5idXNfcmVzb3VyY2UsIDAsCiAJCQlzaXplb2Yoc3RydWN0IHJlc291cmNlKSk7CiAJCW1hc3Rlcl9pbWFnZS0+a2Vybl9iYXNlICA9IE5VTEw7Ci0JCWxpc3RfYWRkX3RhaWwoJihtYXN0ZXJfaW1hZ2UtPmxpc3QpLAotCQkJJih0c2kxNDhfYnJpZGdlLT5tYXN0ZXJfcmVzb3VyY2VzKSk7CisJCWxpc3RfYWRkX3RhaWwoJm1hc3Rlcl9pbWFnZS0+bGlzdCwKKwkJCSZ0c2kxNDhfYnJpZGdlLT5tYXN0ZXJfcmVzb3VyY2VzKTsKIAl9CiAKIAkvKiBBZGQgc2xhdmUgd2luZG93cyB0byBsaXN0ICovCi0JSU5JVF9MSVNUX0hFQUQoJih0c2kxNDhfYnJpZGdlLT5zbGF2ZV9yZXNvdXJjZXMpKTsKKwlJTklUX0xJU1RfSEVBRCgmdHNpMTQ4X2JyaWRnZS0+c2xhdmVfcmVzb3VyY2VzKTsKIAlmb3IgKGkgPSAwOyBpIDwgVFNJMTQ4X01BWF9TTEFWRTsgaSsrKSB7CiAJCXNsYXZlX2ltYWdlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHZtZV9zbGF2ZV9yZXNvdXJjZSksCiAJCQlHRlBfS0VSTkVMKTsKQEAgLTIzNzAsNyArMjM3NCw3IEBACiAJCQlnb3RvIGVycl9zbGF2ZTsKIAkJfQogCQlzbGF2ZV9pbWFnZS0+cGFyZW50ID0gdHNpMTQ4X2JyaWRnZTsKLQkJbXV0ZXhfaW5pdCgmKHNsYXZlX2ltYWdlLT5tdHgpKTsKKwkJbXV0ZXhfaW5pdCgmc2xhdmVfaW1hZ2UtPm10eCk7CiAJCXNsYXZlX2ltYWdlLT5sb2NrZWQgPSAwOwogCQlzbGF2ZV9pbWFnZS0+bnVtYmVyID0gaTsKIAkJc2xhdmVfaW1hZ2UtPmFkZHJlc3NfYXR0ciA9IFZNRV9BMTYgfCBWTUVfQTI0IHwgVk1FX0EzMiB8CkBAIC0yMzgwLDEyICsyMzg0LDEyIEBACiAJCQlWTUVfMmVWTUUgfCBWTUVfMmVTU1QgfCBWTUVfMmVTU1RCIHwgVk1FXzJlU1NUMTYwIHwKIAkJCVZNRV8yZVNTVDI2NyB8IFZNRV8yZVNTVDMyMCB8IFZNRV9TVVBFUiB8IFZNRV9VU0VSIHwKIAkJCVZNRV9QUk9HIHwgVk1FX0RBVEE7Ci0JCWxpc3RfYWRkX3RhaWwoJihzbGF2ZV9pbWFnZS0+bGlzdCksCi0JCQkmKHRzaTE0OF9icmlkZ2UtPnNsYXZlX3Jlc291cmNlcykpOworCQlsaXN0X2FkZF90YWlsKCZzbGF2ZV9pbWFnZS0+bGlzdCwKKwkJCSZ0c2kxNDhfYnJpZGdlLT5zbGF2ZV9yZXNvdXJjZXMpOwogCX0KIAogCS8qIEFkZCBkbWEgZW5naW5lcyB0byBsaXN0ICovCi0JSU5JVF9MSVNUX0hFQUQoJih0c2kxNDhfYnJpZGdlLT5kbWFfcmVzb3VyY2VzKSk7CisJSU5JVF9MSVNUX0hFQUQoJnRzaTE0OF9icmlkZ2UtPmRtYV9yZXNvdXJjZXMpOwogCWZvciAoaSA9IDA7IGkgPCBUU0kxNDhfTUFYX0RNQTsgaSsrKSB7CiAJCWRtYV9jdHJsciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2bWVfZG1hX3Jlc291cmNlKSwKIAkJCUdGUF9LRVJORUwpOwpAQCAtMjM5NiwyMSArMjQwMCwyMSBAQAogCQkJZ290byBlcnJfZG1hOwogCQl9CiAJCWRtYV9jdHJsci0+cGFyZW50ID0gdHNpMTQ4X2JyaWRnZTsKLQkJbXV0ZXhfaW5pdCgmKGRtYV9jdHJsci0+bXR4KSk7CisJCW11dGV4X2luaXQoJmRtYV9jdHJsci0+bXR4KTsKIAkJZG1hX2N0cmxyLT5sb2NrZWQgPSAwOwogCQlkbWFfY3RybHItPm51bWJlciA9IGk7CiAJCWRtYV9jdHJsci0+cm91dGVfYXR0ciA9IFZNRV9ETUFfVk1FX1RPX01FTSB8CiAJCQlWTUVfRE1BX01FTV9UT19WTUUgfCBWTUVfRE1BX1ZNRV9UT19WTUUgfAogCQkJVk1FX0RNQV9NRU1fVE9fTUVNIHwgVk1FX0RNQV9QQVRURVJOX1RPX1ZNRSB8CiAJCQlWTUVfRE1BX1BBVFRFUk5fVE9fTUVNOwotCQlJTklUX0xJU1RfSEVBRCgmKGRtYV9jdHJsci0+cGVuZGluZykpOwotCQlJTklUX0xJU1RfSEVBRCgmKGRtYV9jdHJsci0+cnVubmluZykpOwotCQlsaXN0X2FkZF90YWlsKCYoZG1hX2N0cmxyLT5saXN0KSwKLQkJCSYodHNpMTQ4X2JyaWRnZS0+ZG1hX3Jlc291cmNlcykpOworCQlJTklUX0xJU1RfSEVBRCgmZG1hX2N0cmxyLT5wZW5kaW5nKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmRtYV9jdHJsci0+cnVubmluZyk7CisJCWxpc3RfYWRkX3RhaWwoJmRtYV9jdHJsci0+bGlzdCwKKwkJCSZ0c2kxNDhfYnJpZGdlLT5kbWFfcmVzb3VyY2VzKTsKIAl9CiAKIAkvKiBBZGQgbG9jYXRpb24gbW9uaXRvciB0byBsaXN0ICovCi0JSU5JVF9MSVNUX0hFQUQoJih0c2kxNDhfYnJpZGdlLT5sbV9yZXNvdXJjZXMpKTsKKwlJTklUX0xJU1RfSEVBRCgmdHNpMTQ4X2JyaWRnZS0+bG1fcmVzb3VyY2VzKTsKIAlsbSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2bWVfbG1fcmVzb3VyY2UpLCBHRlBfS0VSTkVMKTsKIAlpZiAobG0gPT0gTlVMTCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciAiCkBAIC0yNDE5LDExICsyNDIzLDExIEBACiAJCWdvdG8gZXJyX2xtOwogCX0KIAlsbS0+cGFyZW50ID0gdHNpMTQ4X2JyaWRnZTsKLQltdXRleF9pbml0KCYobG0tPm10eCkpOworCW11dGV4X2luaXQoJmxtLT5tdHgpOwogCWxtLT5sb2NrZWQgPSAwOwogCWxtLT5udW1iZXIgPSAxOwogCWxtLT5tb25pdG9ycyA9IDQ7Ci0JbGlzdF9hZGRfdGFpbCgmKGxtLT5saXN0KSwgJih0c2kxNDhfYnJpZGdlLT5sbV9yZXNvdXJjZXMpKTsKKwlsaXN0X2FkZF90YWlsKCZsbS0+bGlzdCwgJnRzaTE0OF9icmlkZ2UtPmxtX3Jlc291cmNlcyk7CiAKIAl0c2kxNDhfYnJpZGdlLT5zbGF2ZV9nZXQgPSB0c2kxNDhfc2xhdmVfZ2V0OwogCXRzaTE0OF9icmlkZ2UtPnNsYXZlX3NldCA9IHRzaTE0OF9zbGF2ZV9zZXQ7CkBAIC0yNDc3LDQxICsyNDgxLDQwIEBACiAKIAlyZXR1cm4gMDsKIAotCXZtZV91bnJlZ2lzdGVyX2JyaWRnZSh0c2kxNDhfYnJpZGdlKTsKIGVycl9yZWc6CiAJdHNpMTQ4X2NyY3NyX2V4aXQodHNpMTQ4X2JyaWRnZSwgcGRldik7CiBlcnJfY3Jjc3I6CiBlcnJfbG06CiAJLyogcmVzb3VyY2VzIGFyZSBzdG9yZWQgaW4gbGluayBsaXN0ICovCi0JbGlzdF9mb3JfZWFjaChwb3MsICYodHNpMTQ4X2JyaWRnZS0+bG1fcmVzb3VyY2VzKSkgeworCWxpc3RfZm9yX2VhY2gocG9zLCAmdHNpMTQ4X2JyaWRnZS0+bG1fcmVzb3VyY2VzKSB7CiAJCWxtID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCB2bWVfbG1fcmVzb3VyY2UsIGxpc3QpOwogCQlsaXN0X2RlbChwb3MpOwogCQlrZnJlZShsbSk7CiAJfQogZXJyX2RtYToKIAkvKiByZXNvdXJjZXMgYXJlIHN0b3JlZCBpbiBsaW5rIGxpc3QgKi8KLQlsaXN0X2Zvcl9lYWNoKHBvcywgJih0c2kxNDhfYnJpZGdlLT5kbWFfcmVzb3VyY2VzKSkgeworCWxpc3RfZm9yX2VhY2gocG9zLCAmdHNpMTQ4X2JyaWRnZS0+ZG1hX3Jlc291cmNlcykgewogCQlkbWFfY3RybHIgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHZtZV9kbWFfcmVzb3VyY2UsIGxpc3QpOwogCQlsaXN0X2RlbChwb3MpOwogCQlrZnJlZShkbWFfY3RybHIpOwogCX0KIGVycl9zbGF2ZToKIAkvKiByZXNvdXJjZXMgYXJlIHN0b3JlZCBpbiBsaW5rIGxpc3QgKi8KLQlsaXN0X2Zvcl9lYWNoKHBvcywgJih0c2kxNDhfYnJpZGdlLT5zbGF2ZV9yZXNvdXJjZXMpKSB7CisJbGlzdF9mb3JfZWFjaChwb3MsICZ0c2kxNDhfYnJpZGdlLT5zbGF2ZV9yZXNvdXJjZXMpIHsKIAkJc2xhdmVfaW1hZ2UgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHZtZV9zbGF2ZV9yZXNvdXJjZSwgbGlzdCk7CiAJCWxpc3RfZGVsKHBvcyk7CiAJCWtmcmVlKHNsYXZlX2ltYWdlKTsKIAl9CiBlcnJfbWFzdGVyOgogCS8qIHJlc291cmNlcyBhcmUgc3RvcmVkIGluIGxpbmsgbGlzdCAqLwotCWxpc3RfZm9yX2VhY2gocG9zLCAmKHRzaTE0OF9icmlkZ2UtPm1hc3Rlcl9yZXNvdXJjZXMpKSB7CisJbGlzdF9mb3JfZWFjaChwb3MsICZ0c2kxNDhfYnJpZGdlLT5tYXN0ZXJfcmVzb3VyY2VzKSB7CiAJCW1hc3Rlcl9pbWFnZSA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSwKIAkJCWxpc3QpOwogCQlsaXN0X2RlbChwb3MpOwogCQlrZnJlZShtYXN0ZXJfaW1hZ2UpOwogCX0KIAotCXRzaTE0OF9pcnFfZXhpdCh0c2kxNDhfZGV2aWNlLCBwZGV2KTsKKwl0c2kxNDhfaXJxX2V4aXQodHNpMTQ4X2JyaWRnZSwgcGRldik7CiBlcnJfaXJxOgogZXJyX3Rlc3Q6CiAJaW91bm1hcCh0c2kxNDhfZGV2aWNlLT5iYXNlKTsKQEAgLTI1MzEsNiArMjUzNCw3IEBACiBzdGF0aWMgdm9pZCB0c2kxNDhfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCXN0cnVjdCBsaXN0X2hlYWQgKnBvcyA9IE5VTEw7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wbGlzdDsKIAlzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSAqbWFzdGVyX2ltYWdlOwogCXN0cnVjdCB2bWVfc2xhdmVfcmVzb3VyY2UgKnNsYXZlX2ltYWdlOwogCXN0cnVjdCB2bWVfZG1hX3Jlc291cmNlICpkbWFfY3RybHI7CkBAIC0yNTgyLDM2ICsyNTg2LDM0IEBACiAJaW93cml0ZTMyYmUoMHgwLCBicmlkZ2UtPmJhc2UgKyBUU0kxNDhfTENTUl9JTlRNMSk7CiAJaW93cml0ZTMyYmUoMHgwLCBicmlkZ2UtPmJhc2UgKyBUU0kxNDhfTENTUl9JTlRNMik7CiAKLQl0c2kxNDhfaXJxX2V4aXQoYnJpZGdlLCBwZGV2KTsKKwl0c2kxNDhfaXJxX2V4aXQodHNpMTQ4X2JyaWRnZSwgcGRldik7CiAKIAl2bWVfdW5yZWdpc3Rlcl9icmlkZ2UodHNpMTQ4X2JyaWRnZSk7CiAKIAl0c2kxNDhfY3Jjc3JfZXhpdCh0c2kxNDhfYnJpZGdlLCBwZGV2KTsKIAogCS8qIHJlc291cmNlcyBhcmUgc3RvcmVkIGluIGxpbmsgbGlzdCAqLwotCWxpc3RfZm9yX2VhY2gocG9zLCAmKHRzaTE0OF9icmlkZ2UtPmRtYV9yZXNvdXJjZXMpKSB7CisJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdG1wbGlzdCwgJnRzaTE0OF9icmlkZ2UtPmRtYV9yZXNvdXJjZXMpIHsKIAkJZG1hX2N0cmxyID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCB2bWVfZG1hX3Jlc291cmNlLCBsaXN0KTsKIAkJbGlzdF9kZWwocG9zKTsKIAkJa2ZyZWUoZG1hX2N0cmxyKTsKIAl9CiAKIAkvKiByZXNvdXJjZXMgYXJlIHN0b3JlZCBpbiBsaW5rIGxpc3QgKi8KLQlsaXN0X2Zvcl9lYWNoKHBvcywgJih0c2kxNDhfYnJpZGdlLT5zbGF2ZV9yZXNvdXJjZXMpKSB7CisJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdG1wbGlzdCwgJnRzaTE0OF9icmlkZ2UtPnNsYXZlX3Jlc291cmNlcykgewogCQlzbGF2ZV9pbWFnZSA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgdm1lX3NsYXZlX3Jlc291cmNlLCBsaXN0KTsKIAkJbGlzdF9kZWwocG9zKTsKIAkJa2ZyZWUoc2xhdmVfaW1hZ2UpOwogCX0KIAogCS8qIHJlc291cmNlcyBhcmUgc3RvcmVkIGluIGxpbmsgbGlzdCAqLwotCWxpc3RfZm9yX2VhY2gocG9zLCAmKHRzaTE0OF9icmlkZ2UtPm1hc3Rlcl9yZXNvdXJjZXMpKSB7CisJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdG1wbGlzdCwgJnRzaTE0OF9icmlkZ2UtPm1hc3Rlcl9yZXNvdXJjZXMpIHsKIAkJbWFzdGVyX2ltYWdlID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCB2bWVfbWFzdGVyX3Jlc291cmNlLAogCQkJbGlzdCk7CiAJCWxpc3RfZGVsKHBvcyk7CiAJCWtmcmVlKG1hc3Rlcl9pbWFnZSk7CiAJfQogCi0JdHNpMTQ4X2lycV9leGl0KGJyaWRnZSwgcGRldik7Ci0KIAlpb3VubWFwKGJyaWRnZS0+YmFzZSk7CiAKIAlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZtZS9icmlkZ2VzL3ZtZV90c2kxNDguaCBiL2RyaXZlcnMvc3RhZ2luZy92bWUvYnJpZGdlcy92bWVfdHNpMTQ4LmgKaW5kZXggYmRhNjRlZi4uOWY5N2ZhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3ZtZS9icmlkZ2VzL3ZtZV90c2kxNDguaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdm1lL2JyaWRnZXMvdm1lX3RzaTE0OC5oCkBAIC0zNSw3ICszNSw3IEBACiAKIC8qIFN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgZHJpdmVyIHNwZWNpZmljIGluZm9ybWF0aW9uICovCiBzdHJ1Y3QgdHNpMTQ4X2RyaXZlciB7Ci0Jdm9pZCAqYmFzZTsJLyogQmFzZSBBZGRyZXNzIG9mIGRldmljZSByZWdpc3RlcnMgKi8KKwl2b2lkIF9faW9tZW0gKmJhc2U7CS8qIEJhc2UgQWRkcmVzcyBvZiBkZXZpY2UgcmVnaXN0ZXJzICovCiAJd2FpdF9xdWV1ZV9oZWFkX3QgZG1hX3F1ZXVlWzJdOwogCXdhaXRfcXVldWVfaGVhZF90IGlhY2tfcXVldWU7CiAJdm9pZCAoKmxtX2NhbGxiYWNrWzRdKShpbnQpOwkvKiBDYWxsZWQgaW4gaW50ZXJydXB0IGhhbmRsZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92bWUvZGV2aWNlcy92bWVfdXNlci5jIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS9kZXZpY2VzL3ZtZV91c2VyLmMKaW5kZXggNzFiYmM1Mi4uYTU3MTE3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3ZtZS9kZXZpY2VzL3ZtZV91c2VyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS9kZXZpY2VzL3ZtZV91c2VyLmMKQEAgLTQ0LDcgKzQ0LDcgQEAKIHN0YXRpYyBjaGFyIGRyaXZlcl9uYW1lW10gPSAidm1lX3VzZXIiOwogCiBzdGF0aWMgaW50IGJ1c1tVU0VSX0JVU19NQVhdOwotc3RhdGljIGludCBidXNfbnVtOworc3RhdGljIHVuc2lnbmVkIGludCBidXNfbnVtOwogCiAvKiBDdXJyZW50bHkgRG9jdW1lbnRhdGlvbi9kZXZpY2VzLnR4dCBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgZm9yIFZNRToKICAqCkBAIC05Miw3ICs5Miw3IEBACiAgKiBTdHJ1Y3R1cmUgdG8gaGFuZGxlIGltYWdlIHJlbGF0ZWQgcGFyYW1ldGVycy4KICAqLwogdHlwZWRlZiBzdHJ1Y3QgewotCXZvaWQgX19pb21lbSAqa2Vybl9idWY7CS8qIEJ1ZmZlciBhZGRyZXNzIGluIGtlcm5lbCBzcGFjZSAqLworCXZvaWQgKmtlcm5fYnVmOwkvKiBCdWZmZXIgYWRkcmVzcyBpbiBrZXJuZWwgc3BhY2UgKi8KIAlkbWFfYWRkcl90IHBjaV9idWY7CS8qIEJ1ZmZlciBhZGRyZXNzIGluIFBDSSBhZGRyZXNzIHNwYWNlICovCiAJdW5zaWduZWQgbG9uZyBsb25nIHNpemVfYnVmOwkvKiBCdWZmZXIgc2l6ZSAqLwogCXN0cnVjdCBzZW1hcGhvcmUgc2VtOwkvKiBTZW1hcGhvcmUgZm9yIGxvY2tpbmcgaW1hZ2UgKi8KQEAgLTExNCw5ICsxMTQsOSBAQAogfSBkcml2ZXJfc3RhdHNfdDsKIHN0YXRpYyBkcml2ZXJfc3RhdHNfdCBzdGF0aXN0aWNzOwogCi1zdHJ1Y3QgY2RldiAqdm1lX3VzZXJfY2RldjsJCS8qIENoYXJhY3RlciBkZXZpY2UgKi8KLXN0cnVjdCBjbGFzcyAqdm1lX3VzZXJfc3lzZnNfY2xhc3M7CS8qIFN5c2ZzIGNsYXNzICovCi1zdHJ1Y3QgZGV2aWNlICp2bWVfdXNlcl9icmlkZ2U7CQkvKiBQb2ludGVyIHRvIHRoZSBicmlkZ2UgZGV2aWNlICovCitzdGF0aWMgc3RydWN0IGNkZXYgKnZtZV91c2VyX2NkZXY7CQkvKiBDaGFyYWN0ZXIgZGV2aWNlICovCitzdGF0aWMgc3RydWN0IGNsYXNzICp2bWVfdXNlcl9zeXNmc19jbGFzczsJLyogU3lzZnMgY2xhc3MgKi8KK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlICp2bWVfdXNlcl9icmlkZ2U7CQkvKiBQb2ludGVyIHRvIGJyaWRnZSBkZXZpY2UgKi8KIAogCiBzdGF0aWMgY29uc3QgaW50IHR5cGVbVk1FX0RFVlNdID0gewlNQVNURVJfTUlOT1IsCU1BU1RFUl9NSU5PUiwKQEAgLTEyOSwxMyArMTI5LDE0IEBACiAKIHN0YXRpYyBpbnQgdm1lX3VzZXJfb3BlbihzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CiBzdGF0aWMgaW50IHZtZV91c2VyX3JlbGVhc2Uoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOwotc3RhdGljIHNzaXplX3Qgdm1lX3VzZXJfcmVhZChzdHJ1Y3QgZmlsZSAqLCBjaGFyICosIHNpemVfdCwgbG9mZl90ICopOwotc3RhdGljIHNzaXplX3Qgdm1lX3VzZXJfd3JpdGUoc3RydWN0IGZpbGUgKiwgY29uc3QgY2hhciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKK3N0YXRpYyBzc2l6ZV90IHZtZV91c2VyX3JlYWQoc3RydWN0IGZpbGUgKiwgY2hhciBfX3VzZXIgKiwgc2l6ZV90LCBsb2ZmX3QgKik7CitzdGF0aWMgc3NpemVfdCB2bWVfdXNlcl93cml0ZShzdHJ1Y3QgZmlsZSAqLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzaXplX3QsCisJbG9mZl90ICopOwogc3RhdGljIGxvZmZfdCB2bWVfdXNlcl9sbHNlZWsoc3RydWN0IGZpbGUgKiwgbG9mZl90LCBpbnQpOwogc3RhdGljIGxvbmcgdm1lX3VzZXJfdW5sb2NrZWRfaW9jdGwoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKIAotc3RhdGljIGludCBfX2luaXQgdm1lX3VzZXJfcHJvYmUoc3RydWN0IGRldmljZSAqLCBpbnQsIGludCk7Ci1zdGF0aWMgaW50IF9fZXhpdCB2bWVfdXNlcl9yZW1vdmUoc3RydWN0IGRldmljZSAqLCBpbnQsIGludCk7CitzdGF0aWMgaW50IF9fZGV2aW5pdCB2bWVfdXNlcl9wcm9iZShzdHJ1Y3QgZGV2aWNlICosIGludCwgaW50KTsKK3N0YXRpYyBpbnQgX19kZXZleGl0IHZtZV91c2VyX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICosIGludCwgaW50KTsKIAogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdm1lX3VzZXJfZm9wcyA9IHsKIAkub3BlbiA9IHZtZV91c2VyX29wZW4sCkBAIC0yNDYsNyArMjQ3LDcgQEAKICAqIHBhZ2UpIHRyYW5zZmVycyB3aWxsIGxvY2sgdGhlIHVzZXIgc3BhY2UgYnVmZmVyIGludG8gbWVtb3J5IGFuZCB0aGVuCiAgKiB0cmFuc2ZlciB0aGUgZGF0YSBkaXJlY3RseSBmcm9tIHRoZSB1c2VyIHNwYWNlIGJ1ZmZlcnMgb3V0IHRvIFZNRS4KICAqLwotc3RhdGljIHNzaXplX3QgcmVzb3VyY2VfZnJvbV91c2VyKHVuc2lnbmVkIGludCBtaW5vciwgY29uc3QgY2hhciAqYnVmLAorc3RhdGljIHNzaXplX3QgcmVzb3VyY2VfZnJvbV91c2VyKHVuc2lnbmVkIGludCBtaW5vciwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKIAlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKIAlzc2l6ZV90IHJldHZhbDsKQEAgLTI3Nyw3ICsyNzgsNyBAQAogc3RhdGljIHNzaXplX3QgYnVmZmVyX3RvX3VzZXIodW5zaWduZWQgaW50IG1pbm9yLCBjaGFyIF9fdXNlciAqYnVmLAogCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewotCXZvaWQgX19pb21lbSAqaW1hZ2VfcHRyOworCXZvaWQgKmltYWdlX3B0cjsKIAlzc2l6ZV90IHJldHZhbDsKIAogCWltYWdlX3B0ciA9IGltYWdlW21pbm9yXS5rZXJuX2J1ZiArICpwcG9zOwpAQCAtMjkzLDEwICsyOTQsMTAgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgc3NpemVfdCBidWZmZXJfZnJvbV91c2VyKHVuc2lnbmVkIGludCBtaW5vciwgY29uc3QgY2hhciAqYnVmLAorc3RhdGljIHNzaXplX3QgYnVmZmVyX2Zyb21fdXNlcih1bnNpZ25lZCBpbnQgbWlub3IsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCiAJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7Ci0Jdm9pZCBfX2lvbWVtICppbWFnZV9wdHI7CisJdm9pZCAqaW1hZ2VfcHRyOwogCXNpemVfdCByZXR2YWw7CiAKIAlpbWFnZV9wdHIgPSBpbWFnZVttaW5vcl0ua2Vybl9idWYgKyAqcHBvczsKQEAgLTMxMiw3ICszMTMsNyBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHZtZV91c2VyX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorc3RhdGljIHNzaXplX3Qgdm1lX3VzZXJfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAogCQkJbG9mZl90ICpwcG9zKQogewogCXVuc2lnbmVkIGludCBtaW5vciA9IE1JTk9SKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3JkZXYpOwpAQCAtMzU2LDggKzM1Nyw4IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIHNzaXplX3Qgdm1lX3VzZXJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAotCQkJIGxvZmZfdCAqcHBvcykKK3N0YXRpYyBzc2l6ZV90IHZtZV91c2VyX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CiAJdW5zaWduZWQgaW50IG1pbm9yID0gTUlOT1IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfcmRldik7CiAJc3NpemVfdCByZXR2YWw7CkBAIC00NTUsNiArNDU2LDcgQEAKIAl1bnNpZ25lZCBpbnQgbWlub3IgPSBNSU5PUihpbm9kZS0+aV9yZGV2KTsKIAlpbnQgcmV0dmFsOwogCWRtYV9hZGRyX3QgcGNpX2FkZHI7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAKIAlzdGF0aXN0aWNzLmlvY3RscysrOwogCkBAIC00NzAsMTEgKzQ3MiwxMSBAQAogCQkJICoJdG8gdXNlcnNwYWNlIGFzIHRoZXkgYXJlCiAJCQkgKi8KIAkJCXJldHZhbCA9IHZtZV9tYXN0ZXJfZ2V0KGltYWdlW21pbm9yXS5yZXNvdXJjZSwKLQkJCQkmKG1hc3Rlci5lbmFibGUpLCAmKG1hc3Rlci52bWVfYWRkciksCi0JCQkJJihtYXN0ZXIuc2l6ZSksICYobWFzdGVyLmFzcGFjZSksCi0JCQkJJihtYXN0ZXIuY3ljbGUpLCAmKG1hc3Rlci5kd2lkdGgpKTsKKwkJCQkmbWFzdGVyLmVuYWJsZSwgJm1hc3Rlci52bWVfYWRkciwKKwkJCQkmbWFzdGVyLnNpemUsICZtYXN0ZXIuYXNwYWNlLAorCQkJCSZtYXN0ZXIuY3ljbGUsICZtYXN0ZXIuZHdpZHRoKTsKIAotCQkJY29waWVkID0gY29weV90b191c2VyKChjaGFyICopYXJnLCAmbWFzdGVyLAorCQkJY29waWVkID0gY29weV90b191c2VyKGFyZ3AsICZtYXN0ZXIsCiAJCQkJc2l6ZW9mKHN0cnVjdCB2bWVfbWFzdGVyKSk7CiAJCQlpZiAoY29waWVkICE9IDApIHsKIAkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJQYXJ0aWFsIGNvcHkgdG8gIgpAQCAtNDg3LDggKzQ4OSw3IEBACiAKIAkJY2FzZSBWTUVfU0VUX01BU1RFUjoKIAotCQkJY29waWVkID0gY29weV9mcm9tX3VzZXIoJm1hc3RlciwgKGNoYXIgKilhcmcsCi0JCQkJc2l6ZW9mKG1hc3RlcikpOworCQkJY29waWVkID0gY29weV9mcm9tX3VzZXIoJm1hc3RlciwgYXJncCwgc2l6ZW9mKG1hc3RlcikpOwogCQkJaWYgKGNvcGllZCAhPSAwKSB7CiAJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUGFydGlhbCBjb3B5IGZyb20gIgogCQkJCQkidXNlcnNwYWNlXG4iKTsKQEAgLTUxNCwxMSArNTE1LDExIEBACiAJCQkgKgl0byB1c2Vyc3BhY2UgYXMgdGhleSBhcmUKIAkJCSAqLwogCQkJcmV0dmFsID0gdm1lX3NsYXZlX2dldChpbWFnZVttaW5vcl0ucmVzb3VyY2UsCi0JCQkJJihzbGF2ZS5lbmFibGUpLCAmKHNsYXZlLnZtZV9hZGRyKSwKLQkJCQkmKHNsYXZlLnNpemUpLCAmcGNpX2FkZHIsICYoc2xhdmUuYXNwYWNlKSwKLQkJCQkmKHNsYXZlLmN5Y2xlKSk7CisJCQkJJnNsYXZlLmVuYWJsZSwgJnNsYXZlLnZtZV9hZGRyLAorCQkJCSZzbGF2ZS5zaXplLCAmcGNpX2FkZHIsICZzbGF2ZS5hc3BhY2UsCisJCQkJJnNsYXZlLmN5Y2xlKTsKIAotCQkJY29waWVkID0gY29weV90b191c2VyKChjaGFyICopYXJnLCAmc2xhdmUsCisJCQljb3BpZWQgPSBjb3B5X3RvX3VzZXIoYXJncCwgJnNsYXZlLAogCQkJCXNpemVvZihzdHJ1Y3Qgdm1lX3NsYXZlKSk7CiAJCQlpZiAoY29waWVkICE9IDApIHsKIAkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJQYXJ0aWFsIGNvcHkgdG8gIgpAQCAtNTMxLDggKzUzMiw3IEBACiAKIAkJY2FzZSBWTUVfU0VUX1NMQVZFOgogCi0JCQljb3BpZWQgPSBjb3B5X2Zyb21fdXNlcigmc2xhdmUsIChjaGFyICopYXJnLAotCQkJCXNpemVvZihzbGF2ZSkpOworCQkJY29waWVkID0gY29weV9mcm9tX3VzZXIoJnNsYXZlLCBhcmdwLCBzaXplb2Yoc2xhdmUpKTsKIAkJCWlmIChjb3BpZWQgIT0gMCkgewogCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlBhcnRpYWwgY29weSBmcm9tICIKIAkJCQkJInVzZXJzcGFjZVxuIik7CkBAIC01OTYsNyArNTk2LDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgdm1lX2RyaXZlciB2bWVfdXNlcl9kcml2ZXIgPSB7CiAJLm5hbWUgPSBkcml2ZXJfbmFtZSwKIAkucHJvYmUgPSB2bWVfdXNlcl9wcm9iZSwKLQkucmVtb3ZlID0gdm1lX3VzZXJfcmVtb3ZlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcCh2bWVfdXNlcl9yZW1vdmUpLAogfTsKIAogCkBAIC02MTEsNiArNjExLDcgQEAKIAlpZiAoYnVzX251bSA9PSAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IE5vIGNhcmRzLCBza2lwcGluZyByZWdpc3RyYXRpb25cbiIsCiAJCQlkcml2ZXJfbmFtZSk7CisJCXJldHZhbCA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyX25vY2FyZDsKIAl9CiAKQEAgLTYyOSw2ICs2MzAsNyBAQAogCWlmIChpZHMgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgSUQgdGFibGVcbiIsCiAJCQlkcml2ZXJfbmFtZSk7CisJCXJldHZhbCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX2lkOwogCX0KIApAQCAtNjUyLDcgKzY1NCw2IEBACiAKIAlyZXR1cm4gcmV0dmFsOwogCi0Jdm1lX3VucmVnaXN0ZXJfZHJpdmVyKCZ2bWVfdXNlcl9kcml2ZXIpOwogZXJyX3JlZzoKIAlrZnJlZShpZHMpOwogZXJyX2lkOgpAQCAtNjY1LDcgKzY2Niw4IEBACiAgKiBhcyBwcmFjdGljYWwuIFdlIHdpbGwgdGhlcmVmb3JlIHJlc2VydmUgdGhlIGJ1ZmZlcnMgYW5kIHJlcXVlc3QgdGhlIGltYWdlcwogICogaGVyZSBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gZG8gaXQgbGF0ZXIuCiAgKi8KLXN0YXRpYyBpbnQgX19pbml0IHZtZV91c2VyX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGN1cl9idXMsIGludCBjdXJfc2xvdCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IHZtZV91c2VyX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGN1cl9idXMsCisJaW50IGN1cl9zbG90KQogewogCWludCBpLCBlcnI7CiAJY2hhciBuYW1lWzEyXTsKQEAgLTY4Myw3ICs2ODUsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBWTUVfREVWUzsgaSsrKSB7CiAJCWltYWdlW2ldLmtlcm5fYnVmID0gTlVMTDsKIAkJaW1hZ2VbaV0ucGNpX2J1ZiA9IDA7Ci0JCXNlbWFfaW5pdCgmKGltYWdlW2ldLnNlbSksIDEpOworCQlzZW1hX2luaXQoJmltYWdlW2ldLnNlbSwgMSk7CiAJCWltYWdlW2ldLmRldmljZSA9IE5VTEw7CiAJCWltYWdlW2ldLnJlc291cmNlID0gTlVMTDsKIAkJaW1hZ2VbaV0udXNlcnMgPSAwOwpAQCAtNzI3LDcgKzcyOSw3IEBACiAJCX0KIAkJaW1hZ2VbaV0uc2l6ZV9idWYgPSBQQ0lfQlVGX1NJWkU7CiAJCWltYWdlW2ldLmtlcm5fYnVmID0gdm1lX2FsbG9jX2NvbnNpc3RlbnQoaW1hZ2VbaV0ucmVzb3VyY2UsCi0JCQlpbWFnZVtpXS5zaXplX2J1ZiwgJihpbWFnZVtpXS5wY2lfYnVmKSk7CisJCQlpbWFnZVtpXS5zaXplX2J1ZiwgJmltYWdlW2ldLnBjaV9idWYpOwogCQlpZiAoaW1hZ2VbaV0ua2Vybl9idWYgPT0gTlVMTCkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgIgogCQkJCSJidWZmZXJcbiIpOwpAQCAtODI4LDggKzgzMCw4IEBACiBlcnJfc2xhdmU6CiAJd2hpbGUgKGkgPiBTTEFWRV9NSU5PUikgewogCQlpLS07Ci0JCXZtZV9zbGF2ZV9mcmVlKGltYWdlW2ldLnJlc291cmNlKTsKIAkJYnVmX3VuYWxsb2MoaSk7CisJCXZtZV9zbGF2ZV9mcmVlKGltYWdlW2ldLnJlc291cmNlKTsKIAl9CiBlcnJfY2xhc3M6CiAJY2Rldl9kZWwodm1lX3VzZXJfY2Rldik7CkBAIC04NDAsNyArODQyLDggQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IF9fZXhpdCB2bWVfdXNlcl9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgY3VyX2J1cywgaW50IGN1cl9zbG90KQorc3RhdGljIGludCBfX2RldmV4aXQgdm1lX3VzZXJfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGN1cl9idXMsCisJaW50IGN1cl9zbG90KQogewogCWludCBpOwogCkBAIC04NDksMTMgKzg1MiwxNSBAQAogCQlkZXZpY2VfZGVzdHJveSh2bWVfdXNlcl9zeXNmc19jbGFzcywgTUtERVYoVk1FX01BSk9SLCBpKSk7CiAJY2xhc3NfZGVzdHJveSh2bWVfdXNlcl9zeXNmc19jbGFzcyk7CiAKLQlmb3IgKGkgPSBNQVNURVJfTUlOT1I7IGkgPCAoTUFTVEVSX01BWCArIDEpOyBpKyspCisJZm9yIChpID0gTUFTVEVSX01JTk9SOyBpIDwgKE1BU1RFUl9NQVggKyAxKTsgaSsrKSB7CiAJCWtmcmVlKGltYWdlW2ldLmtlcm5fYnVmKTsKKwkJdm1lX21hc3Rlcl9mcmVlKGltYWdlW2ldLnJlc291cmNlKTsKKwl9CiAKIAlmb3IgKGkgPSBTTEFWRV9NSU5PUjsgaSA8IChTTEFWRV9NQVggKyAxKTsgaSsrKSB7CiAJCXZtZV9zbGF2ZV9zZXQoaW1hZ2VbaV0ucmVzb3VyY2UsIDAsIDAsIDAsIDAsIFZNRV9BMzIsIDApOwotCQl2bWVfc2xhdmVfZnJlZShpbWFnZVtpXS5yZXNvdXJjZSk7CiAJCWJ1Zl91bmFsbG9jKGkpOworCQl2bWVfc2xhdmVfZnJlZShpbWFnZVtpXS5yZXNvdXJjZSk7CiAJfQogCiAJLyogVW5yZWdpc3RlciBkZXZpY2UgZHJpdmVyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdm1lL3ZtZS5jIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS92bWUuYwppbmRleCAwOTNmYmZmLi5kOWZjODY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdm1lL3ZtZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvdm1lLmMKQEAgLTI0NSw3ICsyNDUsNyBAQAogCX0KIAogCS8qIExvb3AgdGhyb3VnaCBzbGF2ZSByZXNvdXJjZXMgKi8KLQlsaXN0X2Zvcl9lYWNoKHNsYXZlX3BvcywgJihicmlkZ2UtPnNsYXZlX3Jlc291cmNlcykpIHsKKwlsaXN0X2Zvcl9lYWNoKHNsYXZlX3BvcywgJmJyaWRnZS0+c2xhdmVfcmVzb3VyY2VzKSB7CiAJCXNsYXZlX2ltYWdlID0gbGlzdF9lbnRyeShzbGF2ZV9wb3MsCiAJCQlzdHJ1Y3Qgdm1lX3NsYXZlX3Jlc291cmNlLCBsaXN0KTsKIApAQCAtMjU1LDE3ICsyNTUsMTcgQEAKIAkJfQogCiAJCS8qIEZpbmQgYW4gdW5sb2NrZWQgYW5kIGNvbXBhdGlibGUgaW1hZ2UgKi8KLQkJbXV0ZXhfbG9jaygmKHNsYXZlX2ltYWdlLT5tdHgpKTsKKwkJbXV0ZXhfbG9jaygmc2xhdmVfaW1hZ2UtPm10eCk7CiAJCWlmICgoKHNsYXZlX2ltYWdlLT5hZGRyZXNzX2F0dHIgJiBhZGRyZXNzKSA9PSBhZGRyZXNzKSAmJgogCQkJKChzbGF2ZV9pbWFnZS0+Y3ljbGVfYXR0ciAmIGN5Y2xlKSA9PSBjeWNsZSkgJiYKIAkJCShzbGF2ZV9pbWFnZS0+bG9ja2VkID09IDApKSB7CiAKIAkJCXNsYXZlX2ltYWdlLT5sb2NrZWQgPSAxOwotCQkJbXV0ZXhfdW5sb2NrKCYoc2xhdmVfaW1hZ2UtPm10eCkpOworCQkJbXV0ZXhfdW5sb2NrKCZzbGF2ZV9pbWFnZS0+bXR4KTsKIAkJCWFsbG9jYXRlZF9pbWFnZSA9IHNsYXZlX2ltYWdlOwogCQkJYnJlYWs7CiAJCX0KLQkJbXV0ZXhfdW5sb2NrKCYoc2xhdmVfaW1hZ2UtPm10eCkpOworCQltdXRleF91bmxvY2soJnNsYXZlX2ltYWdlLT5tdHgpOwogCX0KIAogCS8qIE5vIGZyZWUgaW1hZ2UgKi8KQEAgLTI3OCwxNSArMjc4LDE1IEBACiAJCWdvdG8gZXJyX2FsbG9jOwogCX0KIAlyZXNvdXJjZS0+dHlwZSA9IFZNRV9TTEFWRTsKLQlyZXNvdXJjZS0+ZW50cnkgPSAmKGFsbG9jYXRlZF9pbWFnZS0+bGlzdCk7CisJcmVzb3VyY2UtPmVudHJ5ID0gJmFsbG9jYXRlZF9pbWFnZS0+bGlzdDsKIAogCXJldHVybiByZXNvdXJjZTsKIAogZXJyX2FsbG9jOgogCS8qIFVubG9jayBpbWFnZSAqLwotCW11dGV4X2xvY2soJihzbGF2ZV9pbWFnZS0+bXR4KSk7CisJbXV0ZXhfbG9jaygmc2xhdmVfaW1hZ2UtPm10eCk7CiAJc2xhdmVfaW1hZ2UtPmxvY2tlZCA9IDA7Ci0JbXV0ZXhfdW5sb2NrKCYoc2xhdmVfaW1hZ2UtPm10eCkpOworCW11dGV4X3VubG9jaygmc2xhdmVfaW1hZ2UtPm10eCk7CiBlcnJfaW1hZ2U6CiBlcnJfYnVzOgogCXJldHVybiBOVUxMOwpAQCAtMzY5LDEyICszNjksMTIgQEAKIAl9CiAKIAkvKiBVbmxvY2sgaW1hZ2UgKi8KLQltdXRleF9sb2NrKCYoc2xhdmVfaW1hZ2UtPm10eCkpOworCW11dGV4X2xvY2soJnNsYXZlX2ltYWdlLT5tdHgpOwogCWlmIChzbGF2ZV9pbWFnZS0+bG9ja2VkID09IDApCiAJCXByaW50ayhLRVJOX0VSUiAiSW1hZ2UgaXMgYWxyZWFkeSBmcmVlXG4iKTsKIAogCXNsYXZlX2ltYWdlLT5sb2NrZWQgPSAwOwotCW11dGV4X3VubG9jaygmKHNsYXZlX2ltYWdlLT5tdHgpKTsKKwltdXRleF91bmxvY2soJnNsYXZlX2ltYWdlLT5tdHgpOwogCiAJLyogRnJlZSB1cCByZXNvdXJjZSBtZW1vcnkgKi8KIAlrZnJlZShyZXNvdXJjZSk7CkBAIC00MDEsNyArNDAxLDcgQEAKIAl9CiAKIAkvKiBMb29wIHRocm91Z2ggbWFzdGVyIHJlc291cmNlcyAqLwotCWxpc3RfZm9yX2VhY2gobWFzdGVyX3BvcywgJihicmlkZ2UtPm1hc3Rlcl9yZXNvdXJjZXMpKSB7CisJbGlzdF9mb3JfZWFjaChtYXN0ZXJfcG9zLCAmYnJpZGdlLT5tYXN0ZXJfcmVzb3VyY2VzKSB7CiAJCW1hc3Rlcl9pbWFnZSA9IGxpc3RfZW50cnkobWFzdGVyX3BvcywKIAkJCXN0cnVjdCB2bWVfbWFzdGVyX3Jlc291cmNlLCBsaXN0KTsKIApAQCAtNDExLDE4ICs0MTEsMTggQEAKIAkJfQogCiAJCS8qIEZpbmQgYW4gdW5sb2NrZWQgYW5kIGNvbXBhdGlibGUgaW1hZ2UgKi8KLQkJc3Bpbl9sb2NrKCYobWFzdGVyX2ltYWdlLT5sb2NrKSk7CisJCXNwaW5fbG9jaygmbWFzdGVyX2ltYWdlLT5sb2NrKTsKIAkJaWYgKCgobWFzdGVyX2ltYWdlLT5hZGRyZXNzX2F0dHIgJiBhZGRyZXNzKSA9PSBhZGRyZXNzKSAmJgogCQkJKChtYXN0ZXJfaW1hZ2UtPmN5Y2xlX2F0dHIgJiBjeWNsZSkgPT0gY3ljbGUpICYmCiAJCQkoKG1hc3Rlcl9pbWFnZS0+d2lkdGhfYXR0ciAmIGR3aWR0aCkgPT0gZHdpZHRoKSAmJgogCQkJKG1hc3Rlcl9pbWFnZS0+bG9ja2VkID09IDApKSB7CiAKIAkJCW1hc3Rlcl9pbWFnZS0+bG9ja2VkID0gMTsKLQkJCXNwaW5fdW5sb2NrKCYobWFzdGVyX2ltYWdlLT5sb2NrKSk7CisJCQlzcGluX3VubG9jaygmbWFzdGVyX2ltYWdlLT5sb2NrKTsKIAkJCWFsbG9jYXRlZF9pbWFnZSA9IG1hc3Rlcl9pbWFnZTsKIAkJCWJyZWFrOwogCQl9Ci0JCXNwaW5fdW5sb2NrKCYobWFzdGVyX2ltYWdlLT5sb2NrKSk7CisJCXNwaW5fdW5sb2NrKCZtYXN0ZXJfaW1hZ2UtPmxvY2spOwogCX0KIAogCS8qIENoZWNrIHRvIHNlZSBpZiB3ZSBmb3VuZCBhIHJlc291cmNlICovCkBAIC00MzcsMTYgKzQzNywxNiBAQAogCQlnb3RvIGVycl9hbGxvYzsKIAl9CiAJcmVzb3VyY2UtPnR5cGUgPSBWTUVfTUFTVEVSOwotCXJlc291cmNlLT5lbnRyeSA9ICYoYWxsb2NhdGVkX2ltYWdlLT5saXN0KTsKKwlyZXNvdXJjZS0+ZW50cnkgPSAmYWxsb2NhdGVkX2ltYWdlLT5saXN0OwogCiAJcmV0dXJuIHJlc291cmNlOwogCiAJa2ZyZWUocmVzb3VyY2UpOwogZXJyX2FsbG9jOgogCS8qIFVubG9jayBpbWFnZSAqLwotCXNwaW5fbG9jaygmKG1hc3Rlcl9pbWFnZS0+bG9jaykpOworCXNwaW5fbG9jaygmbWFzdGVyX2ltYWdlLT5sb2NrKTsKIAltYXN0ZXJfaW1hZ2UtPmxvY2tlZCA9IDA7Ci0Jc3Bpbl91bmxvY2soJihtYXN0ZXJfaW1hZ2UtPmxvY2spKTsKKwlzcGluX3VubG9jaygmbWFzdGVyX2ltYWdlLT5sb2NrKTsKIGVycl9pbWFnZToKIGVycl9idXM6CiAJcmV0dXJuIE5VTEw7CkBAIC02MjgsMTIgKzYyOCwxMiBAQAogCX0KIAogCS8qIFVubG9jayBpbWFnZSAqLwotCXNwaW5fbG9jaygmKG1hc3Rlcl9pbWFnZS0+bG9jaykpOworCXNwaW5fbG9jaygmbWFzdGVyX2ltYWdlLT5sb2NrKTsKIAlpZiAobWFzdGVyX2ltYWdlLT5sb2NrZWQgPT0gMCkKIAkJcHJpbnRrKEtFUk5fRVJSICJJbWFnZSBpcyBhbHJlYWR5IGZyZWVcbiIpOwogCiAJbWFzdGVyX2ltYWdlLT5sb2NrZWQgPSAwOwotCXNwaW5fdW5sb2NrKCYobWFzdGVyX2ltYWdlLT5sb2NrKSk7CisJc3Bpbl91bmxvY2soJm1hc3Rlcl9pbWFnZS0+bG9jayk7CiAKIAkvKiBGcmVlIHVwIHJlc291cmNlIG1lbW9yeSAqLwogCWtmcmVlKHJlc291cmNlKTsKQEAgLTY2Miw3ICs2NjIsNyBAQAogCX0KIAogCS8qIExvb3AgdGhyb3VnaCBETUEgcmVzb3VyY2VzICovCi0JbGlzdF9mb3JfZWFjaChkbWFfcG9zLCAmKGJyaWRnZS0+ZG1hX3Jlc291cmNlcykpIHsKKwlsaXN0X2Zvcl9lYWNoKGRtYV9wb3MsICZicmlkZ2UtPmRtYV9yZXNvdXJjZXMpIHsKIAkJZG1hX2N0cmxyID0gbGlzdF9lbnRyeShkbWFfcG9zLAogCQkJc3RydWN0IHZtZV9kbWFfcmVzb3VyY2UsIGxpc3QpOwogCkBAIC02NzIsMTYgKzY3MiwxNiBAQAogCQl9CiAKIAkJLyogRmluZCBhbiB1bmxvY2tlZCBhbmQgY29tcGF0aWJsZSBjb250cm9sbGVyICovCi0JCW11dGV4X2xvY2soJihkbWFfY3RybHItPm10eCkpOworCQltdXRleF9sb2NrKCZkbWFfY3RybHItPm10eCk7CiAJCWlmICgoKGRtYV9jdHJsci0+cm91dGVfYXR0ciAmIHJvdXRlKSA9PSByb3V0ZSkgJiYKIAkJCShkbWFfY3RybHItPmxvY2tlZCA9PSAwKSkgewogCiAJCQlkbWFfY3RybHItPmxvY2tlZCA9IDE7Ci0JCQltdXRleF91bmxvY2soJihkbWFfY3RybHItPm10eCkpOworCQkJbXV0ZXhfdW5sb2NrKCZkbWFfY3RybHItPm10eCk7CiAJCQlhbGxvY2F0ZWRfY3RybHIgPSBkbWFfY3RybHI7CiAJCQlicmVhazsKIAkJfQotCQltdXRleF91bmxvY2soJihkbWFfY3RybHItPm10eCkpOworCQltdXRleF91bmxvY2soJmRtYV9jdHJsci0+bXR4KTsKIAl9CiAKIAkvKiBDaGVjayB0byBzZWUgaWYgd2UgZm91bmQgYSByZXNvdXJjZSAqLwpAQCAtNjk0LDE1ICs2OTQsMTUgQEAKIAkJZ290byBlcnJfYWxsb2M7CiAJfQogCXJlc291cmNlLT50eXBlID0gVk1FX0RNQTsKLQlyZXNvdXJjZS0+ZW50cnkgPSAmKGFsbG9jYXRlZF9jdHJsci0+bGlzdCk7CisJcmVzb3VyY2UtPmVudHJ5ID0gJmFsbG9jYXRlZF9jdHJsci0+bGlzdDsKIAogCXJldHVybiByZXNvdXJjZTsKIAogZXJyX2FsbG9jOgogCS8qIFVubG9jayBpbWFnZSAqLwotCW11dGV4X2xvY2soJihkbWFfY3RybHItPm10eCkpOworCW11dGV4X2xvY2soJmRtYV9jdHJsci0+bXR4KTsKIAlkbWFfY3RybHItPmxvY2tlZCA9IDA7Ci0JbXV0ZXhfdW5sb2NrKCYoZG1hX2N0cmxyLT5tdHgpKTsKKwltdXRleF91bmxvY2soJmRtYV9jdHJsci0+bXR4KTsKIGVycl9jdHJscjoKIGVycl9idXM6CiAJcmV0dXJuIE5VTEw7CkBAIC03MjksOSArNzI5LDkgQEAKIAkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBuZXcgZG1hIGxpc3RcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JSU5JVF9MSVNUX0hFQUQoJihkbWFfbGlzdC0+ZW50cmllcykpOworCUlOSVRfTElTVF9IRUFEKCZkbWFfbGlzdC0+ZW50cmllcyk7CiAJZG1hX2xpc3QtPnBhcmVudCA9IGN0cmxyOwotCW11dGV4X2luaXQoJihkbWFfbGlzdC0+bXR4KSk7CisJbXV0ZXhfaW5pdCgmZG1hX2xpc3QtPm10eCk7CiAKIAlyZXR1cm4gZG1hX2xpc3Q7CiB9CkBAIC04ODAsMTQgKzg4MCwxNCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAoIW11dGV4X3RyeWxvY2soJihsaXN0LT5tdHgpKSkgeworCWlmICghbXV0ZXhfdHJ5bG9jaygmbGlzdC0+bXR4KSkgewogCQlwcmludGsoS0VSTl9FUlIgIkxpbmsgTGlzdCBhbHJlYWR5IHN1Ym1pdHRlZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXJldHZhbCA9IGJyaWRnZS0+ZG1hX2xpc3RfYWRkKGxpc3QsIHNyYywgZGVzdCwgY291bnQpOwogCi0JbXV0ZXhfdW5sb2NrKCYobGlzdC0+bXR4KSk7CisJbXV0ZXhfdW5sb2NrKCZsaXN0LT5tdHgpOwogCiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTkwMywxMSArOTAzLDExIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCW11dGV4X2xvY2soJihsaXN0LT5tdHgpKTsKKwltdXRleF9sb2NrKCZsaXN0LT5tdHgpOwogCiAJcmV0dmFsID0gYnJpZGdlLT5kbWFfbGlzdF9leGVjKGxpc3QpOwogCi0JbXV0ZXhfdW5sb2NrKCYobGlzdC0+bXR4KSk7CisJbXV0ZXhfdW5sb2NrKCZsaXN0LT5tdHgpOwogCiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTkyMyw3ICs5MjMsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAoIW11dGV4X3RyeWxvY2soJihsaXN0LT5tdHgpKSkgeworCWlmICghbXV0ZXhfdHJ5bG9jaygmbGlzdC0+bXR4KSkgewogCQlwcmludGsoS0VSTl9FUlIgIkxpbmsgTGlzdCBpbiB1c2VcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC05MzUsMTAgKzkzNSwxMCBAQAogCXJldHZhbCA9IGJyaWRnZS0+ZG1hX2xpc3RfZW1wdHkobGlzdCk7CiAJaWYgKHJldHZhbCkgewogCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBlbXB0eSBsaW5rLWxpc3QgZW50cmllc1xuIik7Ci0JCW11dGV4X3VubG9jaygmKGxpc3QtPm10eCkpOworCQltdXRleF91bmxvY2soJmxpc3QtPm10eCk7CiAJCXJldHVybiByZXR2YWw7CiAJfQotCW11dGV4X3VubG9jaygmKGxpc3QtPm10eCkpOworCW11dGV4X3VubG9jaygmbGlzdC0+bXR4KTsKIAlrZnJlZShsaXN0KTsKIAogCXJldHVybiByZXR2YWw7CkBAIC05NTYsMjAgKzk1NiwyMCBAQAogCiAJY3RybHIgPSBsaXN0X2VudHJ5KHJlc291cmNlLT5lbnRyeSwgc3RydWN0IHZtZV9kbWFfcmVzb3VyY2UsIGxpc3QpOwogCi0JaWYgKCFtdXRleF90cnlsb2NrKCYoY3RybHItPm10eCkpKSB7CisJaWYgKCFtdXRleF90cnlsb2NrKCZjdHJsci0+bXR4KSkgewogCQlwcmludGsoS0VSTl9FUlIgIlJlc291cmNlIGJ1c3ksIGNhbid0IGZyZWVcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAotCWlmICghKGxpc3RfZW1wdHkoJihjdHJsci0+cGVuZGluZykpICYmIGxpc3RfZW1wdHkoJihjdHJsci0+cnVubmluZykpKSkgeworCWlmICghKGxpc3RfZW1wdHkoJmN0cmxyLT5wZW5kaW5nKSAmJiBsaXN0X2VtcHR5KCZjdHJsci0+cnVubmluZykpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIlJlc291cmNlIHN0aWxsIHByb2Nlc3NpbmcgdHJhbnNmZXJzXG4iKTsKLQkJbXV0ZXhfdW5sb2NrKCYoY3RybHItPm10eCkpOworCQltdXRleF91bmxvY2soJmN0cmxyLT5tdHgpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAogCWN0cmxyLT5sb2NrZWQgPSAwOwogCi0JbXV0ZXhfdW5sb2NrKCYoY3RybHItPm10eCkpOworCW11dGV4X3VubG9jaygmY3RybHItPm10eCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEwMTMsMTAgKzEwMTMsMTAgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JbXV0ZXhfbG9jaygmKGJyaWRnZS0+aXJxX210eCkpOworCW11dGV4X2xvY2soJmJyaWRnZS0+aXJxX210eCk7CiAKIAlpZiAoYnJpZGdlLT5pcnFbbGV2ZWwgLSAxXS5jYWxsYmFja1tzdGF0aWRdLmZ1bmMpIHsKLQkJbXV0ZXhfdW5sb2NrKCYoYnJpZGdlLT5pcnFfbXR4KSk7CisJCW11dGV4X3VubG9jaygmYnJpZGdlLT5pcnFfbXR4KTsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiVk1FIEludGVycnVwdCBhbHJlYWR5IHRha2VuXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CkBAIC0xMDI4LDcgKzEwMjgsNyBAQAogCS8qIEVuYWJsZSBJUlEgbGV2ZWwgKi8KIAlicmlkZ2UtPmlycV9zZXQoYnJpZGdlLCBsZXZlbCwgMSwgMSk7CiAKLQltdXRleF91bmxvY2soJihicmlkZ2UtPmlycV9tdHgpKTsKKwltdXRleF91bmxvY2soJmJyaWRnZS0+aXJxX210eCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEwNTQsNyArMTA1NCw3IEBACiAJCXJldHVybjsKIAl9CiAKLQltdXRleF9sb2NrKCYoYnJpZGdlLT5pcnFfbXR4KSk7CisJbXV0ZXhfbG9jaygmYnJpZGdlLT5pcnFfbXR4KTsKIAogCWJyaWRnZS0+aXJxW2xldmVsIC0gMV0uY291bnQtLTsKIApAQCAtMTA2NSw3ICsxMDY1LDcgQEAKIAlicmlkZ2UtPmlycVtsZXZlbCAtIDFdLmNhbGxiYWNrW3N0YXRpZF0uZnVuYyA9IE5VTEw7CiAJYnJpZGdlLT5pcnFbbGV2ZWwgLSAxXS5jYWxsYmFja1tzdGF0aWRdLnByaXZfZGF0YSA9IE5VTEw7CiAKLQltdXRleF91bmxvY2soJihicmlkZ2UtPmlycV9tdHgpKTsKKwltdXRleF91bmxvY2soJmJyaWRnZS0+aXJxX210eCk7CiB9CiBFWFBPUlRfU1lNQk9MKHZtZV9pcnFfZnJlZSk7CiAKQEAgLTExMTEsNyArMTExMSw3IEBACiAJfQogCiAJLyogTG9vcCB0aHJvdWdoIERNQSByZXNvdXJjZXMgKi8KLQlsaXN0X2Zvcl9lYWNoKGxtX3BvcywgJihicmlkZ2UtPmxtX3Jlc291cmNlcykpIHsKKwlsaXN0X2Zvcl9lYWNoKGxtX3BvcywgJmJyaWRnZS0+bG1fcmVzb3VyY2VzKSB7CiAJCWxtID0gbGlzdF9lbnRyeShsbV9wb3MsCiAJCQlzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlLCBsaXN0KTsKIApAQCAtMTEyMiwxNCArMTEyMiwxNCBAQAogCQl9CiAKIAkJLyogRmluZCBhbiB1bmxvY2tlZCBjb250cm9sbGVyICovCi0JCW11dGV4X2xvY2soJihsbS0+bXR4KSk7CisJCW11dGV4X2xvY2soJmxtLT5tdHgpOwogCQlpZiAobG0tPmxvY2tlZCA9PSAwKSB7CiAJCQlsbS0+bG9ja2VkID0gMTsKLQkJCW11dGV4X3VubG9jaygmKGxtLT5tdHgpKTsKKwkJCW11dGV4X3VubG9jaygmbG0tPm10eCk7CiAJCQlhbGxvY2F0ZWRfbG0gPSBsbTsKIAkJCWJyZWFrOwogCQl9Ci0JCW11dGV4X3VubG9jaygmKGxtLT5tdHgpKTsKKwkJbXV0ZXhfdW5sb2NrKCZsbS0+bXR4KTsKIAl9CiAKIAkvKiBDaGVjayB0byBzZWUgaWYgd2UgZm91bmQgYSByZXNvdXJjZSAqLwpAQCAtMTE0MiwxNSArMTE0MiwxNSBAQAogCQlnb3RvIGVycl9hbGxvYzsKIAl9CiAJcmVzb3VyY2UtPnR5cGUgPSBWTUVfTE07Ci0JcmVzb3VyY2UtPmVudHJ5ID0gJihhbGxvY2F0ZWRfbG0tPmxpc3QpOworCXJlc291cmNlLT5lbnRyeSA9ICZhbGxvY2F0ZWRfbG0tPmxpc3Q7CiAKIAlyZXR1cm4gcmVzb3VyY2U7CiAKIGVycl9hbGxvYzoKIAkvKiBVbmxvY2sgaW1hZ2UgKi8KLQltdXRleF9sb2NrKCYobG0tPm10eCkpOworCW11dGV4X2xvY2soJmxtLT5tdHgpOwogCWxtLT5sb2NrZWQgPSAwOwotCW11dGV4X3VubG9jaygmKGxtLT5tdHgpKTsKKwltdXRleF91bmxvY2soJmxtLT5tdHgpOwogZXJyX2xtOgogZXJyX2J1czoKIAlyZXR1cm4gTlVMTDsKQEAgLTEyNzAsNyArMTI3MCw3IEBACiAKIAlsbSA9IGxpc3RfZW50cnkocmVzb3VyY2UtPmVudHJ5LCBzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlLCBsaXN0KTsKIAotCW11dGV4X2xvY2soJihsbS0+bXR4KSk7CisJbXV0ZXhfbG9jaygmbG0tPm10eCk7CiAKIAkvKiBYWFgKIAkgKiBDaGVjayB0byBzZWUgdGhhdCB0aGVyZSBhcmVuJ3QgYW55IGNhbGxiYWNrcyBzdGlsbCBhdHRhY2hlZCwgaWYKQEAgLTEyNzksNyArMTI3OSw3IEBACiAKIAlsbS0+bG9ja2VkID0gMDsKIAotCW11dGV4X3VubG9jaygmKGxtLT5tdHgpKTsKKwltdXRleF91bmxvY2soJmxtLT5tdHgpOwogCiAJa2ZyZWUocmVzb3VyY2UpOwogfQpAQCAtMTMyNiw3ICsxMzI2LDcgQEAKIHN0YXRpYyB2b2lkIHZtZV9mcmVlX2J1c19udW0oaW50IGJ1cykKIHsKIAltdXRleF9sb2NrKCZ2bWVfYnVzX251bV9tdHgpOwotCXZtZV9idXNfbnVtYmVycyB8PSB+KDB4MSA8PCBidXMpOworCXZtZV9idXNfbnVtYmVycyAmPSB+KDB4MSA8PCBidXMpOwogCW11dGV4X3VubG9jaygmdm1lX2J1c19udW1fbXR4KTsKIH0KIApAQCAtMTM0MywxMSArMTM0MywxMSBAQAogCSAqIHNwZWNpZmljYXRpb24uCiAJICovCiAJZm9yIChpID0gMDsgaSA8IFZNRV9TTE9UU19NQVg7IGkrKykgewotCQlkZXYgPSAmKGJyaWRnZS0+ZGV2W2ldKTsKKwkJZGV2ID0gJmJyaWRnZS0+ZGV2W2ldOwogCQltZW1zZXQoZGV2LCAwLCBzaXplb2Yoc3RydWN0IGRldmljZSkpOwogCiAJCWRldi0+cGFyZW50ID0gYnJpZGdlLT5wYXJlbnQ7Ci0JCWRldi0+YnVzID0gJih2bWVfYnVzX3R5cGUpOworCQlkZXYtPmJ1cyA9ICZ2bWVfYnVzX3R5cGU7CiAJCS8qCiAJCSAqIFdlIHNhdmUgYSBwb2ludGVyIHRvIHRoZSBicmlkZ2UgaW4gcGxhdGZvcm1fZGF0YSBzbyB0aGF0IHdlCiAJCSAqIGNhbiBnZXQgdG8gaXQgbGF0ZXIuIFdlIGtlZXAgZHJpdmVyX2RhdGEgZm9yIHVzZSBieSB0aGUKQEAgLTEzNjYsNyArMTM2Niw3IEBACiAJaSA9IFZNRV9TTE9UU19NQVg7CiBlcnJfcmVnOgogCXdoaWxlIChpID4gLTEpIHsKLQkJZGV2ID0gJihicmlkZ2UtPmRldltpXSk7CisJCWRldiA9ICZicmlkZ2UtPmRldltpXTsKIAkJZGV2aWNlX3VucmVnaXN0ZXIoZGV2KTsKIAl9CiAJdm1lX2ZyZWVfYnVzX251bShicmlkZ2UtPm51bSk7CkBAIC0xMzgxLDcgKzEzODEsNyBAQAogCiAKIAlmb3IgKGkgPSAwOyBpIDwgVk1FX1NMT1RTX01BWDsgaSsrKSB7Ci0JCWRldiA9ICYoYnJpZGdlLT5kZXZbaV0pOworCQlkZXYgPSAmYnJpZGdlLT5kZXZbaV07CiAJCWRldmljZV91bnJlZ2lzdGVyKGRldik7CiAJfQogCXZtZV9mcmVlX2J1c19udW0oYnJpZGdlLT5udW0pOwpAQCAtMTQxOCw3ICsxNDE4LDcgQEAKIAkvKiBEZXRlcm1pbmUgc2xvdCBudW1iZXIgKi8KIAludW0gPSAwOwogCXdoaWxlIChudW0gPCBWTUVfU0xPVFNfTUFYKSB7Ci0JCWlmICgmKGJyaWRnZS0+ZGV2W251bV0pID09IGRldikKKwkJaWYgKCZicmlkZ2UtPmRldltudW1dID09IGRldikKIAkJCWJyZWFrOwogCiAJCW51bSsrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZtZS92bWVfYnJpZGdlLmggYi9kcml2ZXJzL3N0YWdpbmcvdm1lL3ZtZV9icmlkZ2UuaAppbmRleCBiNjUzZWMwLi40YzZlYzMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdm1lL3ZtZV9icmlkZ2UuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdm1lL3ZtZV9icmlkZ2UuaApAQCAtMjAsNyArMjAsNyBAQAogCXZtZV9jeWNsZV90IGN5Y2xlX2F0dHI7CiAJdm1lX3dpZHRoX3Qgd2lkdGhfYXR0cjsKIAlzdHJ1Y3QgcmVzb3VyY2UgYnVzX3Jlc291cmNlOwotCXZvaWQgKmtlcm5fYmFzZTsKKwl2b2lkIF9faW9tZW0gKmtlcm5fYmFzZTsKIH07CiAKIHN0cnVjdCB2bWVfc2xhdmVfcmVzb3VyY2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9jYXJkLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2NhcmQuYwppbmRleCAzMmQwOTVjLi45NTFhM2E4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2NhcmQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2NhcmQuYwpAQCAtMjA1OCw3ICsyMDU4LDcgQEAKIFFXT1JEIENBUkRxR2V0VFNGT2Zmc2V0ICh1bnNpZ25lZCBjaGFyIGJ5UnhSYXRlLCBRV09SRCBxd1RTRjEsIFFXT1JEIHF3VFNGMikKIHsKICAgICBRV09SRCAgIHF3VFNGT2Zmc2V0OwotICAgIHVuc2lnbmVkIHNob3J0IHdSeEJjblRTRk9mZnN0PSAwOzsKKyAgICB1bnNpZ25lZCBzaG9ydCB3UnhCY25UU0ZPZmZzdD0gMDsKIAogICAgIEhJRFdPUkQocXdUU0ZPZmZzZXQpID0gMDsKICAgICBMT0RXT1JEKHF3VFNGT2Zmc2V0KSA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2l3Y3RsLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2l3Y3RsLmMKaW5kZXggOTJlMzM5OS4uNWU0MjVkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9pd2N0bC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvaXdjdGwuYwpAQCAtMjA3Myw3ICsyMDczLDcgQEAKICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKndycSwKICAgICAgICAgICAgICBjaGFyICpleHRyYSkKIHsKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOzsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwogfQogCiBpbnQgaXdjdGxfc2l3bWxtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS93cGEyLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3dwYTIuYwppbmRleCA4MDUxNjRiZS4uNzQ0Nzk5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS93cGEyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS93cGEyLmMKQEAgLTIxNiw3ICsyMTYsNyBAQAogICAgICAgICBtID0gKigodW5zaWduZWQgc2hvcnQgKikgJihwUlNOLT5hYnlSU05bNF0pKTsKIAogICAgICAgICBpZiAocFJTTi0+bGVuID49IDEwK20qNCkgeyAvLyB2ZXIoMikgKyBHSyg0KSArIFBLIGNvdW50KDIpICsgUEtTKDQqbSkgKyBBS01TUyBjb3VudCgyKQotICAgICAgICAgICAgcEJTU05vZGUtPndBS01TU0F1dGhDb3VudCA9ICooKHVuc2lnbmVkIHNob3J0ICopICYocFJTTi0+YWJ5UlNOWzYrNCptXSkpOzsKKyAgICAgICAgICAgIHBCU1NOb2RlLT53QUtNU1NBdXRoQ291bnQgPSAqKCh1bnNpZ25lZCBzaG9ydCAqKSAmKHBSU04tPmFieVJTTls2KzQqbV0pKTsKICAgICAgICAgICAgIGogPSAwOwogICAgICAgICAgICAgcGJ5T1VJID0gJihwUlNOLT5hYnlSU05bOCs0Km1dKTsKICAgICAgICAgICAgIGZvciAoaSA9IDA7IChpIDwgcEJTU05vZGUtPndBS01TU0F1dGhDb3VudCkgJiYgKGogPCBzaXplb2YocEJTU05vZGUtPmFieUFLTVNTQXV0aFR5cGUpL3NpemVvZih1bnNpZ25lZCBjaGFyKSk7IGkrKykgewpAQCAtMjM1LDcgKzIzNSw3IEBACiAgICAgICAgICAgICBwQlNTTm9kZS0+d0FLTVNTQXV0aENvdW50ID0gKHVuc2lnbmVkIHNob3J0KWo7CiAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIndBS01TU0F1dGhDb3VudDogJWRcbiIsIHBCU1NOb2RlLT53QUtNU1NBdXRoQ291bnQpOwogCi0gICAgICAgICAgICBuID0gKigodW5zaWduZWQgc2hvcnQgKikgJihwUlNOLT5hYnlSU05bNis0Km1dKSk7OworICAgICAgICAgICAgbiA9ICooKHVuc2lnbmVkIHNob3J0ICopICYocFJTTi0+YWJ5UlNOWzYrNCptXSkpOwogICAgICAgICAgICAgaWYgKHBSU04tPmxlbiA+PSAxMis0Km0rNCpuKSB7IC8vIHZlcigyKStHSyg0KStQS0NudCgyKStQS1MoNCptKStBS01TU0NudCgyKStBS01TUyg0Km4pK0NhcCgyKQogICAgICAgICAgICAgICAgIHBCU1NOb2RlLT5zUlNOQ2FwT2JqLmJSU05DYXBFeGlzdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgcEJTU05vZGUtPnNSU05DYXBPYmoud1JTTkNhcCA9ICooKHVuc2lnbmVkIHNob3J0ICopICYocFJTTi0+YWJ5UlNOWzgrNCptKzQqbl0pKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvYmFzZWJhbmQuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvYmFzZWJhbmQuYwppbmRleCBlNWFkZDIwLi4wZDExMTQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2Jhc2ViYW5kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9iYXNlYmFuZC5jCkBAIC05NjMsNyArOTYzLDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFOVF9SWEI6CiAgICAgICAgICAgICBwRGV2aWNlLT5ieUJCUnhDb25mICY9IDB4RkU7Ci0gICAgICAgICAgICBwRGV2aWNlLT5ieUJCUnhDb25mIHw9IDB4MDI7OworICAgICAgICAgICAgcERldmljZS0+YnlCQlJ4Q29uZiB8PSAweDAyOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2NhcmQuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvY2FyZC5jCmluZGV4IDhkZTIxYWEuLmE0OTA1M2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvY2FyZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvY2FyZC5jCkBAIC0xMDkyLDcgKzEwOTIsNyBAQAogICAgICAgICBwRGV2aWNlLT5zTWdtdE9iai51Q3VyckNoYW5uZWwgPSBieU5ld0NoYW5uZWw7CiAgICAgICAgIGJSZXN1bHQgPSBDQVJEYlNldE1lZGlhQ2hhbm5lbChwRGV2aWNlLCBieU5ld0NoYW5uZWwpOwogCi0gICAgICAgIHJldHVybihiUmVzdWx0KTsKKwlyZXR1cm4gYlJlc3VsdDsKICAgICB9CiAgICAgcERldmljZS0+YnlDaGFubmVsU3dpdGNoQ291bnQgPSBieUNvdW50OwogICAgIHBEZXZpY2UtPmJ5TmV3Q2hhbm5lbCA9IGJ5TmV3Q2hhbm5lbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvZHBjLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2RwYy5jCmluZGV4IDFmOWQyOTYzLi5mNGZiMGM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2RwYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvZHBjLmMKQEAgLTE2MDgsOCArMTYwOCw4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwRGV2aWNlLT5iSXNSeE1uZ1dvcmtJdGVtUXVldWVkID0gRkFMU0U7Ci0gICAgc3Bpbl91bmxvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKKwlwRGV2aWNlLT5iSXNSeE1uZ1dvcmtJdGVtUXVldWVkID0gRkFMU0U7CisJc3Bpbl91bmxvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKIAogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2l3Y3RsLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2l3Y3RsLmMKaW5kZXggMDAwNGJlOC4uMjEyMTIwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9pd2N0bC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvaXdjdGwuYwpAQCAtMTg4Myw3ICsxODgzLDcgQEAKICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKndycSwKICAgICAgICAgICAgICBjaGFyICpleHRyYSkKIHsKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOzsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwogfQogCiBpbnQgaXdjdGxfc2l3bWxtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9wb3dlci5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9wb3dlci5jCmluZGV4IDBjMTJmZDMuLmU4YzFiMzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvcG93ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3Bvd2VyLmMKQEAgLTE5Miw3ICsxOTIsNyBAQAogICAgIC8vIGNoZWNrIGlmIGFscmVhZHkgaW4gRG96ZSBtb2RlCiAgICAgQ29udHJvbHZSZWFkQnl0ZShwRGV2aWNlLCBNRVNTQUdFX1JFUVVFU1RfTUFDUkVHLCBNQUNfUkVHX1BTQ1RMLCAmYnlEYXRhKTsKICAgICBpZiAoIChieURhdGEgJiBQU0NUTF9QUykgIT0gMCApCi0gICAgICAgIHJldHVybiBUUlVFOzsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAKICAgICBpZiAocE1nbXQtPmVDdXJyTW9kZSAhPSBXTUFDX01PREVfSUJTU19TVEEpIHsKICAgICAgICAgLy8gY2hlY2sgaWYgaW4gVElNIHdha2UgcGVyaW9kCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3J4dHguYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvcnh0eC5jCmluZGV4IGJiZGMxMjcuLjhmMTg1NzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvcnh0eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvcnh0eC5jCkBAIC02OCw4ICs2OCw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgU3RhdGljIENsYXNzZXMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgU3RhdGljIFZhcmlhYmxlcyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLy9zdGF0aWMgaW50ICAgICAgICAgIG1zZ2xldmVsICAgICAgICAgICAgICAgID1NU0dfTEVWRUxfREVCVUc7Ci1zdGF0aWMgaW50ICAgICAgICAgIG1zZ2xldmVsICAgICAgICAgICAgICAgID1NU0dfTEVWRUxfSU5GTzsKK3N0YXRpYyBpbnQgICAgICAgICAgbXNnbGV2ZWwgICAgICAgICAgICAgICAgPSBNU0dfTEVWRUxfSU5GTzsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIFN0YXRpYyBGdW5jdGlvbnMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni90a2lwLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3RraXAuYwppbmRleCBhNmJkNTMzLi4wNzE1NjM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3RraXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3RraXAuYwpAQCAtMjE0LDEzICsyMTQsMTQgQEAKICAgICAvKiBQaGFzZSAxLCBzdGVwIDIgKi8KICAgICBmb3IgKGk9MDsgaTw4OyBpKyspIHsKICAgICAgICAgaiA9IDIqKGkgJiAxKTsKLSAgICAgICAgcDFrWzBdID0gKHAxa1swXSArIHRraXBfc2JveCggKHAxa1s0XSBeICgoMjU2KnBieVRLZXlbMStqXSkgKyBwYnlUS2V5W2pdKSkgJSA2NTUzNiApKSAlIDY1NTM2OwotICAgICAgICBwMWtbMV0gPSAocDFrWzFdICsgdGtpcF9zYm94KCAocDFrWzBdIF4gKCgyNTYqcGJ5VEtleVs1K2pdKSArIHBieVRLZXlbNCtqXSkpICUgNjU1MzYgKSkgJSA2NTUzNjsKLSAgICAgICAgcDFrWzJdID0gKHAxa1syXSArIHRraXBfc2JveCggKHAxa1sxXSBeICgoMjU2KnBieVRLZXlbOStqXSkgKyBwYnlUS2V5Wzgral0pKSAlIDY1NTM2ICkpICUgNjU1MzY7Ci0gICAgICAgIHAxa1szXSA9IChwMWtbM10gKyB0a2lwX3Nib3goIChwMWtbMl0gXiAoKDI1NipwYnlUS2V5WzEzK2pdKSArIHBieVRLZXlbMTIral0pKSAlIDY1NTM2ICkpICUgNjU1MzY7Ci0gICAgICAgIHAxa1s0XSA9IChwMWtbNF0gKyB0a2lwX3Nib3goIChwMWtbM10gXiAoKCgyNTYqcGJ5VEtleVsxK2pdKSArIHBieVRLZXlbal0pKSkgJSA2NTUzNiApKSAlIDY1NTM2OworICAgICAgICBwMWtbMF0gPSAocDFrWzBdICsgdGtpcF9zYm94KChwMWtbNF0gXiAoKDI1NipwYnlUS2V5WzEral0pICsgcGJ5VEtleVtqXSkpICUgNjU1MzYpKSAlIDY1NTM2OworICAgICAgICBwMWtbMV0gPSAocDFrWzFdICsgdGtpcF9zYm94KChwMWtbMF0gXiAoKDI1NipwYnlUS2V5WzUral0pICsgcGJ5VEtleVs0K2pdKSkgJSA2NTUzNikpICUgNjU1MzY7CisgICAgICAgIHAxa1syXSA9IChwMWtbMl0gKyB0a2lwX3Nib3goKHAxa1sxXSBeICgoMjU2KnBieVRLZXlbOStqXSkgKyBwYnlUS2V5Wzgral0pKSAlIDY1NTM2KSkgJSA2NTUzNjsKKyAgICAgICAgcDFrWzNdID0gKHAxa1szXSArIHRraXBfc2JveCgocDFrWzJdIF4gKCgyNTYqcGJ5VEtleVsxMytqXSkgKyBwYnlUS2V5WzEyK2pdKSkgJSA2NTUzNikpICUgNjU1MzY7CisgICAgICAgIHAxa1s0XSA9IChwMWtbNF0gKyB0a2lwX3Nib3goKHAxa1szXSBeICgoKDI1NipwYnlUS2V5WzEral0pICsgcGJ5VEtleVtqXSkpKSAlIDY1NTM2KSkgJSA2NTUzNjsKICAgICAgICAgcDFrWzRdID0gKHAxa1s0XSArIGkpICUgNjU1MzY7CiAgICAgfQorIAogICAgIC8qIFBoYXNlIDIsIFN0ZXAgMSAqLwogICAgIHBwazAgPSBwMWtbMF07CiAgICAgcHBrMSA9IHAxa1sxXTsKQEAgLTIzMCwxOSArMjMxLDE5IEBACiAgICAgcHBrNSA9IChwMWtbNF0gKyB0c2MyKSAlIDY1NTM2OwogCiAgICAgLyogUGhhc2UyLCBTdGVwIDIgKi8KLSAgICBwcGswID0gcHBrMCArIHRraXBfc2JveCggKHBwazUgXiAoKDI1NipwYnlUS2V5WzFdKSArIHBieVRLZXlbMF0pKSAlIDY1NTM2KTsKLSAgICBwcGsxID0gcHBrMSArIHRraXBfc2JveCggKHBwazAgXiAoKDI1NipwYnlUS2V5WzNdKSArIHBieVRLZXlbMl0pKSAlIDY1NTM2KTsKLSAgICBwcGsyID0gcHBrMiArIHRraXBfc2JveCggKHBwazEgXiAoKDI1NipwYnlUS2V5WzVdKSArIHBieVRLZXlbNF0pKSAlIDY1NTM2KTsKLSAgICBwcGszID0gcHBrMyArIHRraXBfc2JveCggKHBwazIgXiAoKDI1NipwYnlUS2V5WzddKSArIHBieVRLZXlbNl0pKSAlIDY1NTM2KTsKLSAgICBwcGs0ID0gcHBrNCArIHRraXBfc2JveCggKHBwazMgXiAoKDI1NipwYnlUS2V5WzldKSArIHBieVRLZXlbOF0pKSAlIDY1NTM2KTsKLSAgICBwcGs1ID0gcHBrNSArIHRraXBfc2JveCggKHBwazQgXiAoKDI1NipwYnlUS2V5WzExXSkgKyBwYnlUS2V5WzEwXSkpICUgNjU1MzYpOworCXBwazAgPSBwcGswICsgdGtpcF9zYm94KChwcGs1IF4gKCgyNTYqcGJ5VEtleVsxXSkgKyBwYnlUS2V5WzBdKSkgJSA2NTUzNik7CisJcHBrMSA9IHBwazEgKyB0a2lwX3Nib3goKHBwazAgXiAoKDI1NipwYnlUS2V5WzNdKSArIHBieVRLZXlbMl0pKSAlIDY1NTM2KTsKKwlwcGsyID0gcHBrMiArIHRraXBfc2JveCgocHBrMSBeICgoMjU2KnBieVRLZXlbNV0pICsgcGJ5VEtleVs0XSkpICUgNjU1MzYpOworCXBwazMgPSBwcGszICsgdGtpcF9zYm94KChwcGsyIF4gKCgyNTYqcGJ5VEtleVs3XSkgKyBwYnlUS2V5WzZdKSkgJSA2NTUzNik7CisJcHBrNCA9IHBwazQgKyB0a2lwX3Nib3goKHBwazMgXiAoKDI1NipwYnlUS2V5WzldKSArIHBieVRLZXlbOF0pKSAlIDY1NTM2KTsKKwlwcGs1ID0gcHBrNSArIHRraXBfc2JveCgocHBrNCBeICgoMjU2KnBieVRLZXlbMTFdKSArIHBieVRLZXlbMTBdKSkgJSA2NTUzNik7CiAKLSAgICBwcGswID0gcHBrMCArIHJvdHIxKHBwazUgXiAoKDI1NipwYnlUS2V5WzEzXSkgKyBwYnlUS2V5WzEyXSkpOwotICAgIHBwazEgPSBwcGsxICsgcm90cjEocHBrMCBeICgoMjU2KnBieVRLZXlbMTVdKSArIHBieVRLZXlbMTRdKSk7Ci0gICAgcHBrMiA9IHBwazIgKyByb3RyMShwcGsxKTsKLSAgICBwcGszID0gcHBrMyArIHJvdHIxKHBwazIpOwotICAgIHBwazQgPSBwcGs0ICsgcm90cjEocHBrMyk7Ci0gICAgcHBrNSA9IHBwazUgKyByb3RyMShwcGs0KTsKKwlwcGswID0gcHBrMCArIHJvdHIxKHBwazUgXiAoKDI1NipwYnlUS2V5WzEzXSkgKyBwYnlUS2V5WzEyXSkpOworCXBwazEgPSBwcGsxICsgcm90cjEocHBrMCBeICgoMjU2KnBieVRLZXlbMTVdKSArIHBieVRLZXlbMTRdKSk7CisJcHBrMiA9IHBwazIgKyByb3RyMShwcGsxKTsKKwlwcGszID0gcHBrMyArIHJvdHIxKHBwazIpOworCXBwazQgPSBwcGs0ICsgcm90cjEocHBrMyk7CisJcHBrNSA9IHBwazUgKyByb3RyMShwcGs0KTsKIAogICAgIC8qIFBoYXNlIDIsIFN0ZXAgMyAqLwogICAgIHBieVJDNEtleVswXSA9ICh0c2MyID4+IDgpICUgMjU2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93cGEyLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3dwYTIuYwppbmRleCA2ZDEzMTkwLi5kNGYzZjc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3dwYTIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3dwYTIuYwpAQCAtMjE1LDcgKzIxNSw3IEBACiAgICAgICAgIG0gPSAqKChQV09SRCkgJihwUlNOLT5hYnlSU05bNF0pKTsKIAogICAgICAgICBpZiAocFJTTi0+bGVuID49IDEwK20qNCkgeyAvLyB2ZXIoMikgKyBHSyg0KSArIFBLIGNvdW50KDIpICsgUEtTKDQqbSkgKyBBS01TUyBjb3VudCgyKQotICAgICAgICAgICAgcEJTU05vZGUtPndBS01TU0F1dGhDb3VudCA9ICooKFBXT1JEKSAmKHBSU04tPmFieVJTTls2KzQqbV0pKTs7CisgICAgICAgICAgICBwQlNTTm9kZS0+d0FLTVNTQXV0aENvdW50ID0gKigoUFdPUkQpICYocFJTTi0+YWJ5UlNOWzYrNCptXSkpOwogICAgICAgICAgICAgaiA9IDA7CiAgICAgICAgICAgICBwYnlPVUkgPSAmKHBSU04tPmFieVJTTls4KzQqbV0pOwogICAgICAgICAgICAgZm9yIChpID0gMDsgKGkgPCBwQlNTTm9kZS0+d0FLTVNTQXV0aENvdW50KSAmJiAoaiA8IHNpemVvZihwQlNTTm9kZS0+YWJ5QUtNU1NBdXRoVHlwZSkvc2l6ZW9mKEJZVEUpKTsgaSsrKSB7CkBAIC0yMzQsNyArMjM0LDcgQEAKICAgICAgICAgICAgIHBCU1NOb2RlLT53QUtNU1NBdXRoQ291bnQgPSAoV09SRClqOwogICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJ3QUtNU1NBdXRoQ291bnQ6ICVkXG4iLCBwQlNTTm9kZS0+d0FLTVNTQXV0aENvdW50KTsKIAotICAgICAgICAgICAgbiA9ICooKFBXT1JEKSAmKHBSU04tPmFieVJTTls2KzQqbV0pKTs7CisgICAgICAgICAgICBuID0gKigoUFdPUkQpICYocFJTTi0+YWJ5UlNOWzYrNCptXSkpOwogICAgICAgICAgICAgaWYgKHBSU04tPmxlbiA+PSAxMis0Km0rNCpuKSB7IC8vIHZlcigyKStHSyg0KStQS0NudCgyKStQS1MoNCptKStBS01TU0NudCgyKStBS01TUyg0Km4pK0NhcCgyKQogICAgICAgICAgICAgICAgIHBCU1NOb2RlLT5zUlNOQ2FwT2JqLmJSU05DYXBFeGlzdCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgcEJTU05vZGUtPnNSU05DYXBPYmoud1JTTkNhcCA9ICooKFBXT1JEKSAmKHBSU04tPmFieVJTTls4KzQqbSs0Km5dKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2VzdGJyaWRnZS9hc3RvcmlhL2FyY2gvYXJtL21hY2gtb21hcDIvY3lhc2hhbG9tYXBfa2VybmVsLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2VzdGJyaWRnZS9hc3RvcmlhL2FyY2gvYXJtL21hY2gtb21hcDIvY3lhc2hhbG9tYXBfa2VybmVsLmMKaW5kZXggYTY3ODAyOS4uYWQwYzYxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dlc3RicmlkZ2UvYXN0b3JpYS9hcmNoL2FybS9tYWNoLW9tYXAyL2N5YXNoYWxvbWFwX2tlcm5lbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93ZXN0YnJpZGdlL2FzdG9yaWEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jeWFzaGFsb21hcF9rZXJuZWwuYwpAQCAtMjEyNywxMCArMjEyNyw3IEBACiAgKi8KIHZvaWQgKmN5X2FzX2hhbF9hbGxvYyh1aW50MzJfdCBjbnQpCiB7Ci0Jdm9pZCAqcmV0X3A7Ci0KLQlyZXRfcCA9IGttYWxsb2MoY250LCBHRlBfQVRPTUlDKTsKLQlyZXR1cm4gcmV0X3A7CisJcmV0dXJuIGttYWxsb2MoY250LCBHRlBfQVRPTUlDKTsKIH0KIAogLyoKQEAgLTIxNTAsMTAgKzIxNDcsNyBAQAogICovCiB2b2lkICpjeV9hc19oYWxfY19iX2FsbG9jKHVpbnQzMl90IGNudCkKIHsKLQl2b2lkICpyZXRfcDsKLQotCXJldF9wID0ga21hbGxvYyhjbnQsIEdGUF9BVE9NSUMpOwotCXJldHVybiByZXRfcDsKKwlyZXR1cm4ga21hbGxvYyhjbnQsIEdGUF9BVE9NSUMpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9NYWtlZmlsZQppbmRleCA3OWZhMjI3Li4wODFkNDhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9NYWtlZmlsZQpAQCAtMSw2ICsxLDUgQEAKIHczNXVuZC15IDo9CQkJXAogCW1kcy5vCQkJXAotCW1sbWV0eHJ4Lm8JCVwKIAltdG8ubwkJCVwKIAlwaHlfY2FsaWJyYXRpb24ubwlcCiAJcmVnLm8JCQlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9jb3JlLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9jb3JlLmgKaW5kZXggMmI4N2EwMC4uZDdiM2FjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvY29yZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2NvcmUuaApAQCAtNCw3ICs0LDcgQEAKICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKLSNpbmNsdWRlICJ3YmhhbF9zLmgiCisjaW5jbHVkZSAid2JoYWwuaCIKICNpbmNsdWRlICJtdG8uaCIKIAogI2luY2x1ZGUgIm1hY19zdHJ1Y3R1cmVzLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tYWNfc3RydWN0dXJlcy5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWFjX3N0cnVjdHVyZXMuaAppbmRleCBlZDNkZjI5Li43NmM2M2M3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tYWNfc3RydWN0dXJlcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21hY19zdHJ1Y3R1cmVzLmgKQEAgLTIxLDIzICsyMSwxMSBAQAogI2lmbmRlZiBfTUFDX1N0cnVjdHVyZXNfSF8KICNkZWZpbmUgX01BQ19TdHJ1Y3R1cmVzX0hfCiAKLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIFNvbWUgbWlzY2VsbGFuZW91cyBkZWZpbml0aW9ucwotLy8tLS0tLSovCi0jZGVmaW5lIE1BWF9DSEFOTkVMUyAgICAgICAgICAgICAgICAgICAgICAgIDMwCiAjZGVmaW5lIE1BQ19BRERSX0xFTkdUSCAgICAgICAgICAgICAgICAgICAgIDYKLSNkZWZpbmUgTUFYX1dFUF9LRVlfU0laRSAgICAgICAgICAgICAgICAgICAgMTYgIC8qIDEyOCBiaXRzICovCi0jZGVmaW5lCU1BWF84MDJfMTFfRlJBR01FTlRfTlVNQkVSCQkxMCAvKiBCeSBzcGVjICovCiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyA4MDIuMTEgRnJhbWUgZGVmaW5lCiAvLy0tLS0tICovCi0jZGVmaW5lIE1BU0tfUFJPVE9DT0xfVkVSU0lPTl9UWVBFCTB4MEYKLSNkZWZpbmUgTUFTS19GUkFHTUVOVF9OVU1CRVIJCTB4MDAwRgotI2RlZmluZSBTRVFVRU5DRV9OVU1CRVJfU0hJRlQJCTQKLSNkZWZpbmUgRElGRkVSXzExX1RPXzMJCQkJMTgKICNkZWZpbmUgRE9UXzExX01BQ19IRUFERVJfU0laRQkJMjQKICNkZWZpbmUgRE9UXzExX1NOQVBfU0laRQkJCTYKICNkZWZpbmUgRE9UXzExX0RVUkFUSU9OX09GRlNFVAkJMgpAQCAtNDcsMTUgKzM1LDkgQEAKICNkZWZpbmUgRE9UXzExX1RZUEVfT0ZGU0VUCQkJMzAKICNkZWZpbmUgRE9UXzExX0RBVEFfT0ZGU0VUICAgICAgICAgIDI0CiAjZGVmaW5lIERPVF8xMV9EQV9PRkZTRVQJCQk0Ci0jZGVmaW5lIERPVF8zX1RZUEVfQVJQCQkJCTB4ODBGMwotI2RlZmluZSBET1RfM19UWVBFX0lQWAkJCQkweDgxMzcKLSNkZWZpbmUgRE9UXzNfVFlQRV9PRkZTRVQJCQkxMgogCi0KLSNkZWZpbmUgRVRIRVJORVRfSEVBREVSX1NJWkUJCQkxNAogI2RlZmluZSBNQVhfRVRIRVJORVRfUEFDS0VUX1NJWkUJCTE1MTQKIAotCiAvKiAtLS0tLSAgbWFuYWdlbWVudCA6IFR5cGUgb2YgQml0cyAoMiwgMykgYW5kIFN1YnR5cGUgb2YgQml0cyAoNCwgNSwgNiwgNykgKi8KICNkZWZpbmUgTUFDX1NVQlRZUEVfTU5HTU5UX0FTU09DX1JFUVVFU1QgICAgMHgwMAogI2RlZmluZSBNQUNfU1VCVFlQRV9NTkdNTlRfQVNTT0NfUkVTUE9OU0UgICAweDEwCkBAIC02OSwxMjkgKzUxLDYgQEAKICNkZWZpbmUgTUFDX1NVQlRZUEVfTU5HTU5UX0FVVEhFTlRJQ0FUSU9OICAgMHhCMAogI2RlZmluZSBNQUNfU1VCVFlQRV9NTkdNTlRfREVBVVRIRU5USUNBVElPTiAweEMwCiAKLS8qIC0tLS0tICBjb250cm9sIDogVHlwZSBvZiBCaXRzICgyLCAzKSBhbmQgU3VidHlwZSBvZiBCaXRzICg0LCA1LCA2LCA3KSAqLwotI2RlZmluZSBNQUNfU1VCVFlQRV9DT05UUk9MX1BTUE9MTCAgICAgICAgICAweEE0Ci0jZGVmaW5lIE1BQ19TVUJUWVBFX0NPTlRST0xfUlRTICAgICAgICAgICAgIDB4QjQKLSNkZWZpbmUgTUFDX1NVQlRZUEVfQ09OVFJPTF9DVFMgICAgICAgICAgICAgMHhDNAotI2RlZmluZSBNQUNfU1VCVFlQRV9DT05UUk9MX0FDSyAgICAgICAgICAgICAweEQ0Ci0jZGVmaW5lIE1BQ19TVUJUWVBFX0NPTlRST0xfQ0ZFTkQgICAgICAgICAgIDB4RTQKLSNkZWZpbmUgTUFDX1NVQlRZUEVfQ09OVFJPTF9DRkVORF9DRkFDSyAgICAgMHhGNAotCi0vKiAtLS0tLSAgZGF0YSA6IFR5cGUgb2YgQml0cyAoMiwgMykgYW5kIFN1YnR5cGUgb2YgQml0cyAoNCwgNSwgNiwgNykgKi8KLSNkZWZpbmUgTUFDX1NVQlRZUEVfREFUQSAgICAgICAgICAgICAgICAgICAgMHgwOAotI2RlZmluZSBNQUNfU1VCVFlQRV9EQVRBX0NGQUNLICAgICAgICAgICAgICAweDE4Ci0jZGVmaW5lIE1BQ19TVUJUWVBFX0RBVEFfQ0ZQT0xMICAgICAgICAgICAgIDB4MjgKLSNkZWZpbmUgTUFDX1NVQlRZUEVfREFUQV9DRkFDS19DRlBPTEwgICAgICAgMHgzOAotI2RlZmluZSBNQUNfU1VCVFlQRV9EQVRBX05VTEwgICAgICAgICAgICAgICAweDQ4Ci0jZGVmaW5lIE1BQ19TVUJUWVBFX0RBVEFfQ0ZBQ0tfTlVMTCAgICAgICAgIDB4NTgKLSNkZWZpbmUgTUFDX1NVQlRZUEVfREFUQV9DRlBPTExfTlVMTCAgICAgICAgMHg2OAotI2RlZmluZSBNQUNfU1VCVFlQRV9EQVRBX0NGQUNLX0NGUE9MTF9OVUxMICAweDc4Ci0KLS8qIC0tLS0tICBGcmFtZSBUeXBlIG9mIEJpdHMgKDIsIDMpICovCi0jZGVmaW5lIE1BQ19UWVBFX01BTkFHRU1FTlQgICAgICAgICAgICAgICAgIDB4MDAKLSNkZWZpbmUgTUFDX1RZUEVfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgMHgwNAotI2RlZmluZSBNQUNfVFlQRV9EQVRBICAgICAgICAgICAgICAgICAgICAgICAweDA4Ci0KLS8qIC0tLS0tIGRlZmluaXRpb25zIGZvciBNYW5hZ2VtZW50IEZyYW1lIEVsZW1lbnQgSUQgKDEgQllURSkgKi8KLSNkZWZpbmUgRUxFTUVOVF9JRF9TU0lEICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBFTEVNRU5UX0lEX1NVUFBPUlRFRF9SQVRFUyAgICAgICAgICAxCi0jZGVmaW5lIEVMRU1FTlRfSURfRkhfUEFSQU1FVEVSX1NFVCAgICAgICAgIDIKLSNkZWZpbmUgRUxFTUVOVF9JRF9EU19QQVJBTUVURVJfU0VUICAgICAgICAgMwotI2RlZmluZSBFTEVNRU5UX0lEX0NGX1BBUkFNRVRFUl9TRVQgICAgICAgICA0Ci0jZGVmaW5lIEVMRU1FTlRfSURfVElNICAgICAgICAgICAgICAgICAgICAgIDUKLSNkZWZpbmUgRUxFTUVOVF9JRF9JQlNTX1BBUkFNRVRFUl9TRVQgICAgICAgNgotLyogN34xNSByZXNlcnZlcmQgKi8KLSNkZWZpbmUgRUxFTUVOVF9JRF9DSEFMTEVOR0VfVEVYVCAgICAgICAgICAgMTYKLS8qIDE3fjMxIHJlc2VydmVkIGZvciBjaGFsbGVuZ2UgdGV4dCBleHRlbnNpb24gKi8KLS8qIDMyfjI1NSByZXNlcnZlZCAqLwotLyotLSAgMTFHICAtLSAqLwotI2RlZmluZSBFTEVNRU5UX0lEX0VSUF9JTkZPUk1BVElPTgkJCTQyCi0jZGVmaW5lIEVMRU1FTlRfSURfRVhURU5ERURfU1VQUE9SVEVEX1JBVEVTIDUwCi0KLS8qIC0tICBXUEEgIC0tICovCi0KLSNkZWZpbmUgRUxFTUVOVF9JRF9SU05fV1BBCQkJCQkyMjEKLSNpZmRlZiBfV1BBMl8KLSNkZWZpbmUgRUxFTUVOVF9JRF9SU05fV1BBMgkJCQkgICAgNDgKLSNlbmRpZiAvKiBlbmRpZiBXUEEyICovCi0KLSNkZWZpbmUgV0xBTl9NQVhfUEFJUldJU0VfQ0lQSEVSX1NVSVRFX0NPVU5UICAgICgodTE2KSA2KQotI2RlZmluZSBXTEFOX01BWF9BVVRIX0tFWV9NR1RfU1VJVEVfTElTVF9DT1VOVCAgKCh1MTYpIDIpCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSogIFJlYXNvbiBDb2RlIChUYWJsZSAxOCk6IGluZGljYXRlIHRoZSByZWFzb24gb2YgRGlzQXNzb2MsIERlQXV0aGVuCi0qICBsZW5ndGggb2YgUmVhc29uQ29kZSBpcyAyIE9jdHMuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLSNkZWZpbmUgUkVBU09OX1JFQVNFUkVEICAgICAgICAgICAgIDAKLSNkZWZpbmUgUkVBU09OX1VOU1BFQ0lESUVEICAgICAgICAgIDEKLSNkZWZpbmUgUkVBU09OX1BSRUFVVEhfSU5WQUxJRCAgICAgIDIKLSNkZWZpbmUgREVBVVRIX1JFQVNPTl9MRUZUX0JTUyAgICAgIDMKLSNkZWZpbmUgRElTQVNTX1JFQVNPTl9BUF9JTkFDVElWRSAgIDQKLSNkZWZpbmUgRElTQVNTX1JFQVNPTl9BUF9CVVNZICAgICAgIDUKLSNkZWZpbmUgUkVBU09OX0NMQVNTMl9GUkFNRV9GUk9NX05PTkFVVEhfU1RBICAgIDYKLSNkZWZpbmUgUkVBU09OX0NMQVNTM19GUkFNRV9GUk9NX05PTkFTU09fU1RBICAgIDcKLSNkZWZpbmUgRElTQVNTX1JFQVNPTl9MRUZUX0JTUyAgICAgIDgKLSNkZWZpbmUgUkVBU09OX05PVF9BVVRIX1lFVCAgICAgICAgIDkKLS8qIDgwMi4xMWkgZGVmaW5lICovCi0jZGVmaW5lIFJFQVNPTl9JTlZBTElEX0lFCQkJCQkJMTMKLSNkZWZpbmUgUkVBU09OX01JQ19FUlJPUgkJCQkJCTE0Ci0jZGVmaW5lIFJFQVNPTl80V0FZX0hBTkRTSEFLRV9USU1FT1VUCQkJMTUKLSNkZWZpbmUgUkVBU09OX0dST1VQS0VZX1VQREFURV9USU1FT1VUCQkJMTYKLSNkZWZpbmUgUkVBU09OX0lFX0RJRkZfNFdBWV9BU1NPQwkJCQkxNwotI2RlZmluZSBSRUFTT05fSU5WQUxJRF9NVUxUSUNBU1RfQ0lQSEVSCQkJMTgKLSNkZWZpbmUgUkVBU09OX0lOVkFMSURfVU5JQ0FTVF9DSVBIRVIJCQkxOQotI2RlZmluZSBSRUFTT05fSU5WQUxJRF9BS01QCQkJCQkJMjAKLSNkZWZpbmUgUkVBU09OX1VOU1VQUE9SVEVEX1JTTklFX1ZFUlNJT04JCTIxCi0jZGVmaW5lIFJFQVNPTl9JTlZBTElEX1JTTklFX0NBUEFCSUxJVFkJCQkyMgotI2RlZmluZSBSRUFTT05fODAyXzFYX0FVVEhfRkFJTAkJCQkJMjMKLSNkZWZpbmUJUkVBU09OX0NJUEhFUl9SRUpFQ1RfUEVSX1NFQ19QT0xJQ1kJCTE0Ci0KLS8qCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBlbnVtX01NUERVUmVzdWx0Q29kZSAtLQotLy8gICBTdGF0dXMgY29kZSAoMiBPY3RzKSBpbiB0aGUgTU1QRFUncyBmcmFtZSBib2R5LiBUYWJsZS4xOQotLy8KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWVudW0gZW51bV9NTVBEVVJlc3VsdENvZGUKLXsKLS8vICAgIFNVQ0NFU1MgICA9IDAsICAgICAgLy8gUmVkZWZpbmVkCi0gICAgVU5TUEVDSUZJRURfRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsCi0KLSAgICAvLyAyIC0gOSBSZXNlcnZlZAotCi0gICAgTk9UX1NVUFBST1RfQ0FQQUJJTElUSUVTICAgICAgICAgICAgICAgICAgICA9IDEwLAotCi0gICAgLy9SRUFTU09DSUFUSU9OX0RFTklFRAotICAgIC8vCi0gICAgUkVBU1NPQ19ERU5JRURfVU5BQkxFX0NGTV9BU1NPQ19FWElTVCAgICAgICA9IDExLAotCi0gICAgLy9BU1NPQ0lBVElPTl9ERU5JRURfTk9UX0lOX1NUQU5EQVJECi0gICAgLy8KLSAgICBBU1NPQ19ERU5JRURfUkVBU09OX05PVF9JTl9TVEFOREFSRCAgICAgICAgID0gMTIsCi0gICAgUEVFUl9OT1RfU1VQUE9SVF9BVVRIX0FMR09SSVRITSAgICAgICAgICAgICA9IDEzLAotICAgIEFVVEhfU0VRTlVNX09VVF9PRl9FWFBFQ1QgICAgICAgICAgICAgICAgICAgPSAxNCwKLSAgICBBVVRIX1JFSkVDVF9SRUFTT05fQ0hBTExFTkdFX0ZBSUwgICAgICAgICAgID0gMTUsCi0gICAgQVVUSF9SRUpFQ1RfUkVBU09OX1dBSVRfVElNRU9VVCAgICAgICAgICAgICA9IDE2LAotICAgIEFTU09DX0RFTklFRF9SRUFTT05fQVBfQlVTWSAgICAgICAgICAgICAgICAgPSAxNywKLSAgICBBU1NPQ19ERU5JRURfUkVBU09OX05PVF9TVVBQT1JUX0JBU0lDX1JBVEUgID0gMTgKLX0gV0JfTU1QRFVSRVNVTFRDT0RFLCAqUFdCX01NUERVUkVTVUxUQ09ERTsKLSovCi0KLSNkZWZpbmUJUkFURV9CSVRNQVBfMU0JCQkJMQotI2RlZmluZQlSQVRFX0JJVE1BUF8yTQkJCQkyCi0jZGVmaW5lCVJBVEVfQklUTUFQXzVkb3Q1TQkJCTUKLSNkZWZpbmUgUkFURV9CSVRNQVBfNk0JCQkJNgotI2RlZmluZSBSQVRFX0JJVE1BUF85TQkJCQk5Ci0jZGVmaW5lIFJBVEVfQklUTUFQXzExTQkJCQkxMQotI2RlZmluZSBSQVRFX0JJVE1BUF8xMk0JCQkJMTIKLSNkZWZpbmUgUkFURV9CSVRNQVBfMThNCQkJCTE4Ci0jZGVmaW5lIFJBVEVfQklUTUFQXzIyTQkJCQkyMgotI2RlZmluZSBSQVRFX0JJVE1BUF8yNE0JCQkJMjQKLSNkZWZpbmUgUkFURV9CSVRNQVBfMzNNCQkJCTE3Ci0jZGVmaW5lIFJBVEVfQklUTUFQXzM2TQkJCQkxOQotI2RlZmluZSBSQVRFX0JJVE1BUF80OE0JCQkJMjUKLSNkZWZpbmUgUkFURV9CSVRNQVBfNTRNCQkJCTI4Ci0KICNkZWZpbmUgUkFURV9BVVRPCQkJCQkwCiAjZGVmaW5lIFJBVEVfMU0JCQkJCQkyCiAjZGVmaW5lIFJBVEVfMk0JCQkJCQk0CkBAIC0yMDksNDA4ICs2OCw0IEBACiAjZGVmaW5lIFJBVEVfNTRNCQkJCQkxMDgKICNkZWZpbmUgUkFURV9NQVgJCQkJCTI1NQogCi0vKiBDQVBBQklMSVRZICovCi0jZGVmaW5lIENBUEFCSUxJVFlfRVNTX0JJVAkJCQkweDAwMDEKLSNkZWZpbmUgQ0FQQUJJTElUWV9JQlNTX0JJVAkJCQkweDAwMDIKLSNkZWZpbmUgQ0FQQUJJTElUWV9DRl9QT0xMX0JJVAkJCTB4MDAwNAotI2RlZmluZSBDQVBBQklMSVRZX0NGX1BPTExfUkVRX0JJVAkJMHgwMDA4Ci0jZGVmaW5lIENBUEFCSUxJVFlfUFJJVkFDWV9CSVQJCQkweDAwMTAKLSNkZWZpbmUgQ0FQQUJJTElUWV9TSE9SVF9QUkVBTUJMRV9CSVQJMHgwMDIwCi0jZGVmaW5lIENBUEFCSUxJVFlfUEJDQ19CSVQJCQkJMHgwMDQwCi0jZGVmaW5lIENBUEFCSUxJVFlfQ0hBTl9BR0lMSVRZX0JJVAkJMHgwMDgwCi0jZGVmaW5lIENBUEFCSUxJVFlfU0hPUlRfU0xPVF9USU1FX0JJVAkweDA0MDAKLSNkZWZpbmUgQ0FQQUJJTElUWV9EU1NTX09GRE1fQklUCQkweDIwMDAKLQotCi1zdHJ1Y3QgQ2FwYWJpbGl0eV9JbmZvcm1hdGlvbl9FbGVtZW50IHsKLSAgdW5pb24gewotCXUxNiBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgd1ZhbHVlOwotICAgICNpZmRlZiBfQklHX0VORElBTl8gIC8qIDIwMDYwOTI2IGFkZCBieSBhbnNvbidzIGVuZGlhbiAqLwotICAgIHN0cnVjdCBfQ2FwYWJpbGl0eSB7Ci0JLyogLS0gIDExRyAgLS0gKi8KLQl1OAlSZXNlcnZlZDM6MjsKLQl1OAlEU1NTX09GRE06MTsKLQl1OAlSZXNlcnZlZDI6MjsKLQl1OAlTaG9ydF9TbG90X1RpbWU6MTsKLQl1OCAgICBSZXNlcnZlZDE6MjsKLQl1OCAgICBDaGFubmVsX0FnaWxpdHk6MTsKLQl1OCAgICBQQkNDOjE7Ci0JdTggICAgU2hvcnRQcmVhbWJsZToxOwotCXU4ICAgIENGX1ByaXZhY3k6MTsKLQl1OCAgICBDRl9Qb2xsX1JlcXVlc3Q6MTsKLQl1OCAgICBDRl9Qb2xsYWJsZToxOwotCXU4ICAgIElCU1M6MTsKLQl1OCAgICBFU1M6MTsKLSAgICB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBDYXBhYmlsaXR5OwotICAgICNlbHNlCi0gICAgc3RydWN0IF9DYXBhYmlsaXR5IHsKLQl1OCAgICBFU1M6MTsKLQl1OCAgICBJQlNTOjE7Ci0JdTggICAgQ0ZfUG9sbGFibGU6MTsKLQl1OCAgICBDRl9Qb2xsX1JlcXVlc3Q6MTsKLQl1OCAgICBDRl9Qcml2YWN5OjE7Ci0JdTggICAgU2hvcnRQcmVhbWJsZToxOwotCXU4ICAgIFBCQ0M6MTsKLQl1OCAgICBDaGFubmVsX0FnaWxpdHk6MTsKLQl1OCAgICBSZXNlcnZlZDE6MjsKLQkJLyogLS0gIDExRyAgLS0gKi8KLQkJdTgJU2hvcnRfU2xvdF9UaW1lOjE7Ci0JCXU4CVJlc2VydmVkMjoyOwotCQl1OAlEU1NTX09GRE06MTsKLQkJdTgJUmVzZXJ2ZWQzOjI7Ci0gICAgfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgQ2FwYWJpbGl0eTsKLSAgICAjZW5kaWYKLSAgfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCBGSF9QYXJhbWV0ZXJfU2V0X0VsZW1lbnQgewotICAgIHU4ICAgIEVsZW1lbnRfSUQ7Ci0gICAgdTggICAgTGVuZ3RoOwotICAgIHU4ICAgIER3ZWxsX1RpbWVbMl07Ci0gICAgdTggICAgSG9wX1NldDsKLSAgICB1OCAgICBIb3BfUGF0dGVybjsKLSAgICB1OCAgICBIb3BfSW5kZXg7Ci19OwotCi1zdHJ1Y3QgRFNfUGFyYW1ldGVyX1NldF9FbGVtZW50IHsKLSAgICB1OCAgICBFbGVtZW50X0lEOwotICAgIHU4ICAgIExlbmd0aDsKLSAgICB1OCAgICBDdXJyZW50X0NoYW5uZWw7Ci19OwotCi1zdHJ1Y3QgU3VwcG9ydGVkX1JhdGVzX0VsZW1lbnQgewotICAgIHU4ICAgIEVsZW1lbnRfSUQ7Ci0gICAgdTggICAgTGVuZ3RoOwotICAgIHU4ICAgIFN1cHBvcnRlZFJhdGVzWzhdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCBTU0lEX0VsZW1lbnQgewotICAgIHU4ICAgIEVsZW1lbnRfSUQ7Ci0gICAgdTggICAgTGVuZ3RoOwotICAgIHU4ICAgIFNTSURbMzJdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgOwotCi1zdHJ1Y3QgQ0ZfUGFyYW1ldGVyX1NldF9FbGVtZW50IHsKLSAgICB1OCAgICBFbGVtZW50X0lEOwotICAgIHU4ICAgIExlbmd0aDsKLSAgICB1OCAgICBDRlBfQ291bnQ7Ci0gICAgdTggICAgQ0ZQX1BlcmlvZDsKLSAgICB1OCAgICBDRlBfTWF4RHVyYXRpb25bMl07ICAgICAvKiBpbiBUaW1lIFVuaXRzICovCi0gICAgdTggICAgQ0ZQX0R1clJlbWFpbmluZ1syXTsgICAgLyogaW4gdGltZSB1bml0cyAqLwotfTsKLQotc3RydWN0IFRJTV9FbGVtZW50IHsKLSAgICB1OCAgICBFbGVtZW50X0lEOwotICAgIHU4ICAgIExlbmd0aDsKLSAgICB1OCAgICBEVElNX0NvdW50OwotICAgIHU4ICAgIERUSU1fUGVyaW9kOwotICAgIHU4ICAgIEJpdG1hcF9Db250cm9sOwotICAgIHU4ICAgIFBhcnRpYWxfVmlydHVhbF9CaXRtYXBbMjUxXTsKLX07Ci0KLXN0cnVjdCBJQlNTX1BhcmFtZXRlcl9TZXRfRWxlbWVudCB7Ci0gICAgdTggICAgRWxlbWVudF9JRDsKLSAgICB1OCAgICBMZW5ndGg7Ci0gICAgdTggICAgQVRJTV9XaW5kb3dbMl07Ci19OwotCi1zdHJ1Y3QgQ2hhbGxlbmdlX1RleHRfRWxlbWVudCB7Ci0gICAgdTggICAgRWxlbWVudF9JRDsKLSAgICB1OCAgICBMZW5ndGg7Ci0gICAgdTggICAgQ2hhbGxlbmdlX1RleHRbMjUzXTsKLX07Ci0KLXN0cnVjdCBQSFlfUGFyYW1ldGVyX1NldF9FbGVtZW50IHsKLS8qICBpbnQgICAgIGFTbG90VGltZTsgKi8KLS8qICBpbnQgICAgIGFTaWZzVGltZTsgKi8KLSAgICBzMzIgICAgIGFDQ0FUaW1lOwotICAgIHMzMiAgICAgYVJ4VHhUdXJuYXJvdW5kVGltZTsKLSAgICBzMzIgICAgIGFUeFBMQ1BEZWxheTsKLSAgICBzMzIgICAgIFJ4UExDUERlbGF5OwotICAgIHMzMiAgICAgYVJ4VHhTd2l0Y2hUaW1lOwotICAgIHMzMiAgICAgYVR4UmFtcE9udGltZTsKLSAgICBzMzIgICAgIGFUeFJhbXBPZmZUaW1lOwotICAgIHMzMiAgICAgYVR4UkZEZWxheTsKLSAgICBzMzIgICAgIGFSeFJGRGVsYXk7Ci0gICAgczMyICAgICBhQWlyUHJvcGFnYXRpb25UaW1lOwotICAgIHMzMiAgICAgYU1BQ1Byb2Nlc3NpbmdEZWxheTsKLSAgICBzMzIgICAgIGFQcmVhbWJsZUxlbmd0aDsKLSAgICBzMzIgICAgIGFQTENQSGVhZGVyTGVuZ3RoOwotICAgIHMzMiAgICAgYU1QRFVEdXJhdGlvbkZhY3RvcjsKLSAgICBzMzIgICAgIGFNUERVTWF4TGVuZ3RoOwotLyogIGludCAgICAgYUNXbWluOyAqLwotLyogIGludCAgICAgYUNXbWF4OyAqLwotfTsKLQotLyogLS0gIDExRyAgLS0gKi8KLXN0cnVjdCBFUlBfSW5mb3JtYXRpb25fRWxlbWVudCB7Ci0gICAgdTgJRWxlbWVudF9JRDsKLSAgICB1OAlMZW5ndGg7Ci0gICAgI2lmZGVmIF9CSUdfRU5ESUFOXyAvKiAyMDA2MDkyNiBhZGQgYnkgYW5zb24ncyBlbmRpYW4gKi8KLQl1OAlSZXNlcnZlZDo1OyAgIC8qIDIwMDYwOTI2IGFkZCBieSBhbnNvbiAqLwotCXU4CUJhcmtlcl9QcmVhbWJsZV9Nb2RlOjE7Ci0JdTgJVXNlX1Byb3RlY3Rpb246MTsKLSAgICAgICB1OAlOb25FUlBfUHJlc2VudDoxOwotICAgICNlbHNlCi0JdTgJTm9uRVJQX1ByZXNlbnQ6MTsKLQl1OAlVc2VfUHJvdGVjdGlvbjoxOwotCXU4CUJhcmtlcl9QcmVhbWJsZV9Nb2RlOjE7Ci0JdTgJUmVzZXJ2ZWQ6NTsKLSAgICAjZW5kaWYKLX07Ci0KLXN0cnVjdCBFeHRlbmRlZF9TdXBwb3J0ZWRfUmF0ZXNfRWxlbWVudCB7Ci0gICAgdTgJRWxlbWVudF9JRDsKLSAgICB1OAlMZW5ndGg7Ci0gICAgdTgJRXh0ZW5kZWRTdXBwb3J0ZWRSYXRlc1syNTVdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLS8qIFdQQSg4MDIuMTFpIGRyYWZ0IDMuMCkgKi8KLSNkZWZpbmUgVkVSU0lPTl9XUEEJCQkJMQotI2lmZGVmIF9XUEEyXwotI2RlZmluZSBWRVJTSU9OX1dQQTIgICAgICAgICAgICAxCi0jZW5kaWYgLyogZW5kIGRlZiAgX1dQQTJfICovCi0vKiBXUEEyLjAgT1VJPTAwOjUwOkYyLCB0aGUgTVNCIGlzIHJlc2VydmVkIGZvciBzdWl0ZSB0eXBlICovCi0jZGVmaW5lIE9VSV9XUEEJCQkJCTB4MDBGMjUwMDAKLSNpZmRlZiBfV1BBMl8KLS8qIGZvciB3cGEyIGNoYW5nZSB0byAweDAwQUNPRjA0IGJ5IFdzIDI2LzA0LzA0ICovCi0jZGVmaW5lIE9VSV9XUEEyCQkJCTB4MDBBQzBGMDAKLSNlbmRpZiAvKiBlbmQgZGVmIF9XUEEyXyAqLwotCi0jZGVmaW5lIE9VSV9XUEFfQURESVRJT05BTAkJMHgwMQotI2RlZmluZSBXTEFOX01JTl9SU05fV1BBX0xFTkdUSCAgICAgICAgICAgICAgICAgNiAvKiBhZGRlZCBieSB3cyAwOS8xMC8wNCAqLwotI2lmZGVmIF9XUEEyXwotI2RlZmluZSBXTEFOX01JTl9SU05fV1BBMl9MRU5HVEggICAgICAgICAgICAgICAgMiAvKiBGaXggdG8gMiAwOS8xNC8wNSAqLwotI2VuZGlmIC8qIGVuZCBkZWYgX1dQQTJfICovCi0KLSNkZWZpbmUgb3VpX3dwYSAgICAgICAgICAgICAgICAgICh1MzIpKE9VSV9XUEF8T1VJX1dQQV9BRERJVElPTkFMKQotCi0jZGVmaW5lIFdQQV9PVUlfQklHICAgICgodTMyKSAweDAxRjI1MDAwKS8qIGFkZGVkIGJ5IHdzIDA5LzIzLzA0ICovCi0jZGVmaW5lIFdQQV9PVUlfTElUVExFICAoKHUzMikgMHgwMUYyNTAwMSkvKiBhZGRlZCBieSB3cyAwOS8yMy8wNCAqLwotLyogMjAwNjExMDggRm9yIFdQUy4gSXQncyBsaXR0bGUgZW5kaWFuLiBCaWcgZW5kaWFuIGlzIDB4MDA1MEYyMDQgKi8KLSNkZWZpbmUgV1BBX1dQU19PVUkJCQkJY3B1X3RvX2xlMzIoMHgwNEYyNTAwMCkKLQotLyogLS0tLS1XUEEyLS0tLS0gKi8KLSNpZmRlZiBfV1BBMl8KLSNkZWZpbmUgV1BBMl9PVUlfQklHICAgICgodTMyKTB4MDFBQzBGMDApCi0jZGVmaW5lIFdQQTJfT1VJX0xJVFRMRSAoKHUzMikweDAxQUMwRjAxKQotI2VuZGlmIC8qIGVuZCBkZWYgX1dQQTJfICovCi0KLS8qIEF1dGhlbnRpY2F0aW9uIHN1aXRlICovCi0jZGVmaW5lIE9VSV9BVVRIX1dQQV9OT05FICAgICAgICAgICAweDAwIC8qIGZvciBXUEFfTk9ORSAqLwotI2RlZmluZSBPVUlfQVVUSF84MDIxWAkJCQkweDAxCi0jZGVmaW5lIE9VSV9BVVRIX1BTSwkJCQkweDAyCi0vKiBDaXBoZXIgc3VpdGUgKi8KLSNkZWZpbmUgT1VJX0NJUEhFUl9HUk9VUF9LRVkgICAgICAgIDB4MDAgIC8qIGFkZGVkIGJ5IHdzIDA1LzIxLzA0ICovCi0jZGVmaW5lIE9VSV9DSVBIRVJfV0VQXzQwCQkJMHgwMQotI2RlZmluZSBPVUlfQ0lQSEVSX1RLSVAJCQkJMHgwMgotI2RlZmluZSBPVUlfQ0lQSEVSX0NDTVAJCQkJMHgwNAotI2RlZmluZSBPVUlfQ0lQSEVSX1dFUF8xMDQJCQkweDA1Ci0KLXN0cnVjdCBzdWl0ZV9zZWxlY3RvcnsKLQl1bmlvbnsKLQkJdTgJVmFsdWVbNF07Ci0JCXN0cnVjdCBfU1VJVF8gewotCQkJdTgJT1VJWzNdOwotCQkJdTgJVHlwZTsKLQkJfSBTdWl0U2VsZWN0b3I7Ci0JfTsKLX07Ci0KLS8qIC0tICBXUEEgIC0tICovCi1zdHJ1Y3QJUlNOX0luZm9ybWF0aW9uX0VsZW1lbnR7Ci0JdTgJCQkJCUVsZW1lbnRfSUQ7Ci0JdTgJCQkJCUxlbmd0aDsKLSAvKiBXUEEgdmVyc2lvbiAyLjAgYWRkaXRpb25hbCBmaWVsZCwgYW5kIHNob3VsZCBiZSAwMDo1MDpGMjowMSAqLwotCXN0cnVjdCBzdWl0ZV9zZWxlY3RvcglPdWlXUEFBZGRpdGlvbmFsOwotCXUxNgkJCQkJVmVyc2lvbjsKLQlzdHJ1Y3Qgc3VpdGVfc2VsZWN0b3IJCUdyb3VwS2V5U3VpdGU7Ci0JdTE2CQkJCQlQYWlyd2lzZUtleVN1aXRlQ291bnQ7Ci0Jc3RydWN0IHN1aXRlX3NlbGVjdG9yCQlQYWlyd2lzZUtleVN1aXRlWzFdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci1zdHJ1Y3QgUlNOX0F1dGhfU3ViX0luZm9ybWF0aW9uX0VsZW1lbnQgewotCXUxNgkJCQlBdXRoS2V5TW5ndFN1aXRlQ291bnQ7Ci0Jc3RydWN0IHN1aXRlX3NlbGVjdG9yCUF1dGhLZXlNbmd0U3VpdGVbMV07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotLyogLS0gIFdQQTIgIC0tICovCi1zdHJ1Y3QgUlNOX0NhcGFiaWxpdHlfRWxlbWVudCB7Ci0gIHVuaW9uIHsKLQl1MTYJX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpCXdWYWx1ZTsKLSAgICAjaWZkZWYgX0JJR19FTkRJQU5fCSAvKiAyMDA2MDkyNyBhZGQgYnkgYW5zb24ncyBlbmRpYW4gKi8KLSAgICBzdHJ1Y3QgX1JTTl9DYXBhYmlsaXR5IHsKLQl1MTYgICBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgIFJlc2VydmVkMjo4OyAvKiAyMDA1MTIwMSAqLwotCXUxNiAgIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSAgUmVzZXJ2ZWQxOjI7Ci0JdTE2ICAgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpICBHVEtfUmVwbGF5X0NvdW50ZXI6MjsKLQl1MTYgICBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgIFBUS19SZXBsYXlfQ291bnRlcjoyOwotCXUxNiAgIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSAgTm9fUGFpcndpc2U6MTsKLQl1MTYgICBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgIFByZV9BdXRoOjE7Ci0gICAgfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgIFJTTl9DYXBhYmlsaXR5OwotICAgICNlbHNlCi0gICAgc3RydWN0IF9SU05fQ2FwYWJpbGl0eSB7Ci0JdTE2ICAgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpICBQcmVfQXV0aDoxOwotCXUxNiAgIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSAgTm9fUGFpcndpc2U6MTsKLQl1MTYgICBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgIFBUS19SZXBsYXlfQ291bnRlcjoyOwotCXUxNiAgIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSAgR1RLX1JlcGxheV9Db3VudGVyOjI7Ci0JdTE2ICAgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpICBSZXNlcnZlZDE6MjsKLQl1MTYgICBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgIFJlc2VydmVkMjo4OyAvKiAyMDA1MTIwMSAqLwotICAgIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpICBSU05fQ2FwYWJpbGl0eTsKLSAgICAjZW5kaWYKLQotICB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSA7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSA7Ci0KLSNpZmRlZiBfV1BBMl8KLXN0cnVjdCBwbWtpZCB7Ci0gIHU4IHBWYWx1ZVsxNl07Ci19OwotCi1zdHJ1Y3QJV1BBMl9SU05fSW5mb3JtYXRpb25fRWxlbWVudCB7Ci0JdTgJCQkJCUVsZW1lbnRfSUQ7Ci0JdTgJCQkJCUxlbmd0aDsKLQl1MTYJCQkJCVZlcnNpb247Ci0Jc3RydWN0IHN1aXRlX3NlbGVjdG9yCQlHcm91cEtleVN1aXRlOwotCXUxNgkJCQkJUGFpcndpc2VLZXlTdWl0ZUNvdW50OwotCXN0cnVjdCBzdWl0ZV9zZWxlY3RvcgkJUGFpcndpc2VLZXlTdWl0ZVsxXTsKLQotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCBXUEEyX1JTTl9BdXRoX1N1Yl9JbmZvcm1hdGlvbl9FbGVtZW50IHsKLQl1MTYJCQkJQXV0aEtleU1uZ3RTdWl0ZUNvdW50OwotCXN0cnVjdCBzdWl0ZV9zZWxlY3RvcglBdXRoS2V5TW5ndFN1aXRlWzFdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLQotc3RydWN0IFBNS0lEX0luZm9ybWF0aW9uX0VsZW1lbnQgewotCXUxNgkJCQlQTUtJRF9Db3VudDsKLQlzdHJ1Y3QgcG1raWQgcG1raWRbMTZdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLSNlbmRpZiAvKiBlbmRkZWYgX1dQQTJfICovCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gTUFDIEZyYW1lIHN0cnVjdHVyZSAoZGlmZmVyZW50IHR5cGUpIGFuZCBzdWJmaWVsZCBzdHJ1Y3R1cmUKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXN0cnVjdCBNQUNfZnJhbWVfY29udHJvbCB7Ci0vKiBhIGNvbWJpbmF0aW9uIG9mIHRoZSBbUHJvdG9jb2wgVmVyc2lvbiwgQ29udHJvbCBUeXBlLCBDb250cm9sIFN1YnR5cGVdKi8KLSAgICB1OCAgICBtYWNfZnJhbWVfaW5mbzsKLS8qIDIwMDYwOTI3IGFkZCBieSBhbnNvbidzIGVuZGlhbiAqLwotICAgICNpZmRlZiBfQklHX0VORElBTl8KLSAgICB1OCAgICBvcmRlcjoxOwotICAgIHU4ICAgIFdFUDoxOwotICAgIHU4ICAgIG1vcmVfZGF0YToxOwotICAgIHU4ICAgIHB3cl9tZ3Q6MTsKLSAgICB1OCAgICByZXRyeToxOwotICAgIHU4ICAgIG1vcmVfZnJhZzoxOwotICAgIHU4ICAgIGZyb21fZHM6MTsKLSAgICB1OCAgICB0b19kczoxOwotICAgICNlbHNlCi0gICAgdTggICAgdG9fZHM6MTsKLSAgICB1OCAgICBmcm9tX2RzOjE7Ci0gICAgdTggICAgbW9yZV9mcmFnOjE7Ci0gICAgdTggICAgcmV0cnk6MTsKLSAgICB1OCAgICBwd3JfbWd0OjE7Ci0gICAgdTggICAgbW9yZV9kYXRhOjE7Ci0gICAgdTggICAgV0VQOjE7Ci0gICAgdTggICAgb3JkZXI6MTsKLSAgICAjZW5kaWYKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgTWFuYWdlbWVudF9GcmFtZSB7Ci0vKiAyQiwgVG9EUyxGcm9tRFMsTW9yZUZyYWcsTW9yZURhdGEsT3JkZXI9MCAqLwotICAgIHN0cnVjdCBNQUNfZnJhbWVfY29udHJvbCBmcmFtZV9jb250cm9sOwotICAgIHUxNgkJZHVyYXRpb247Ci0gICAgdTgJCURBW01BQ19BRERSX0xFTkdUSF07CQkJLyogQWRkcjEgKi8KLSAgICB1OAkJU0FbTUFDX0FERFJfTEVOR1RIXTsJCQkvKiBBZGRyMiAqLwotICAgIHU4CQlCU1NJRFtNQUNfQUREUl9MRU5HVEhdOwkJCS8qIEFkZHIzICovCi0gICAgdTE2CQlTZXF1ZW5jZV9Db250cm9sOwotICAgIC8qIE1hbmFnZW1lbnQgRnJhbWUgQm9keSA8PSAzMjUgYnl0ZXMgKi8KLSAgICAvKiBGQ1MgNCBieXRlcyAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLS8qIFNXLU1BQyBkb24ndCBUeC9SeCBDb250cm9sLUZyYW1lLCBIVy1NQUMgZG8gaXQuICovCi1zdHJ1Y3QgQ29udHJvbF9GcmFtZSB7Ci0vKiBUb0RTLEZyb21EUyxNb3JlRnJhZyxSZXRyeSxNb3JlRGF0YSxXRVAsT3JkZXI9MCAqLwotICAgIHN0cnVjdCBNQUNfZnJhbWVfY29udHJvbCBmcmFtZV9jb250cm9sOwotICAgIHUxNgkJZHVyYXRpb247Ci0gICAgdTgJCVJBW01BQ19BRERSX0xFTkdUSF07Ci0gICAgdTgJCVRBW01BQ19BRERSX0xFTkdUSF07Ci0gICAgdTE2CQlGQ1M7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IERhdGFfRnJhbWUgewotICAgIHN0cnVjdCBNQUNfZnJhbWVfY29udHJvbCBmcmFtZV9jb250cm9sOwotICAgIHUxNgkJZHVyYXRpb247Ci0gICAgdTgJCUFkZHIxW01BQ19BRERSX0xFTkdUSF07Ci0gICAgdTgJCUFkZHIyW01BQ19BRERSX0xFTkdUSF07Ci0gICAgdTgJCUFkZHIzW01BQ19BRERSX0xFTkdUSF07Ci0gICAgdTE2CQlTZXF1ZW5jZV9Db250cm9sOwotICAgIHU4CQlBZGRyNFtNQUNfQUREUl9MRU5HVEhdOyAvKiBvbmx5IGV4aXN0IHdoZW4gVG9EUz1Gcm9tRFM9MSAqLwotICAgIC8qIERhdGEgRnJhbWUgQm9keSA8PSAyMzEyICovCi0gICAgLyogRkNTICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IERpc2Fzc29jaWF0aW9uX0ZyYW1lX0JvZHkgewotICAgIHUxNiAgICByZWFzb25Db2RlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCBBc3NvY2lhdGlvbl9SZXF1ZXN0X0ZyYW1lX0JvZHkgewotICAgIHUxNiAgICBjYXBhYmlsaXR5X2luZm9ybWF0aW9uOwotICAgIHUxNiAgICBsaXN0ZW5JbnRlcnZhbDsKLSAgICB1OCAgICAgQ3VycmVudF9BUF9BZGRyZXNzW01BQ19BRERSX0xFTkdUSF07LyogZm9yIHJlYXNzb2NpYXRpb24gb25seSAqLwotICAgIC8qICBTU0lEICgyKzMyIGJ5dGVzKSAqLwotICAgIC8qICBTdXBwb3J0ZWRfUmF0ZXMgKDIrOCBieXRlcykgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgQXNzb2NpYXRpb25fUmVzcG9uc2VfRnJhbWVfQm9keSB7Ci0gICAgdTE2ICAgIGNhcGFiaWxpdHlfaW5mb3JtYXRpb247Ci0gICAgdTE2ICAgIHN0YXR1c0NvZGU7Ci0gICAgdTE2ICAgIEFzc29jaWF0aW9uX0lEOwotICAgIHN0cnVjdCBTdXBwb3J0ZWRfUmF0ZXNfRWxlbWVudCBzdXBwb3J0ZWRSYXRlczsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vKnN0cnVjdCBSZWFzc29jaWF0aW9uX1JlcXVlc3RfRnJhbWVfQm9keQotewotICAgIHUxNiAgICBjYXBhYmlsaXR5X2luZm9ybWF0aW9uOwotICAgIHUxNiAgICBsaXN0ZW5JbnRlcnZhbDsKLSAgICB1OCAgICAgQ3VycmVudF9BUF9BZGRyZXNzW01BQ19BRERSX0xFTkdUSF07Ci0gICAgLy8gU1NJRCAoMiszMiBieXRlcykKLSAgICAvLyBTdXBwb3J0ZWRfUmF0ZXMgKDIrOCBieXRlcykKLX07Ki8KLS8qIGVsaW1pbmF0ZWQgYnkgV1MgMDcvMjIvMDQgY29tYm9pbmVkIHdpdGggYXNzb2NpYXRlaW9uIHJlcXVlc3QgZnJhbWUuICovCi0KLXN0cnVjdCBSZWFzc29jaWF0aW9uX1Jlc3BvbnNlX0ZyYW1lX0JvZHkgewotICAgIHUxNiAgICBjYXBhYmlsaXR5X2luZm9ybWF0aW9uOwotICAgIHUxNiAgICBzdGF0dXNDb2RlOwotICAgIHUxNiAgICBBc3NvY2lhdGlvbl9JRDsKLSAgICBzdHJ1Y3QgU3VwcG9ydGVkX1JhdGVzX0VsZW1lbnQgc3VwcG9ydGVkUmF0ZXM7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IERlYXV0aGVudGljYXRpb25fRnJhbWVfQm9keSB7Ci0gICAgdTE2ICAgIHJlYXNvbkNvZGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotCi1zdHJ1Y3QgUHJvYmVfUmVzcG9uc2VfRnJhbWVfQm9keSB7Ci0gICAgdTE2ICAgIFRpbWVzdGFtcDsKLSAgICB1MTYgICAgQmVhY29uX0ludGVydmFsOwotICAgIHUxNiAgICBDYXBhYmlsaXR5X0luZm9ybWF0aW9uOwotICAgIC8qIFNTSUQKLSAgICAvLyBTdXBwb3J0ZWRfUmF0ZXMKLSAgICAvLyBQSFkgcGFyYW1ldGVyIFNldCAoRFMgUGFyYW1ldGVycykKLSAgICAvLyBDRiBwYXJhbWV0ZXIgU2V0Ci0gICAgLy8gSUJTUyBwYXJhbWV0ZXIgU2V0ICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IEF1dGhlbnRpY2F0aW9uX0ZyYW1lX0JvZHkgewotICAgIHUxNiAgICBhbGdvcml0aG1OdW1iZXI7Ci0gICAgdTE2ICAgIHNlcXVlbmNlTnVtYmVyOwotICAgIHUxNiAgICBzdGF0dXNDb2RlOwotCS8qIE5COiBkb24ndCBpbmNsdWRlIENoYWxsZW5nZVRleHQgaW4gdGhpcyBzdHJ1Y3R1cmUKLQkvLyBzdHJ1Y3QgQ2hhbGxlbmdlX1RleHRfRWxlbWVudCBzQ2hhbGxlbmdlVGV4dEVsZW1lbnQ7Ci0JLy8gd2tjaGVuIGFkZGVkICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotCiAjZW5kaWYgLyogX01BQ19TdHJ1Y3R1cmVfSF8gKi8KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tZHMuYyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21kcy5jCmluZGV4IDkyMTc3NjIuLjljZmVhOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21kcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21kcy5jCkBAIC0xLDkgKzEsNyBAQAogI2luY2x1ZGUgIm1kc19mLmgiCi0jaW5jbHVkZSAibWxtZXR4cnhfZi5oIgogI2luY2x1ZGUgIm10by5oIgotI2luY2x1ZGUgInN5c2RlZi5oIgotI2luY2x1ZGUgIndiaGFsX2YuaCIKLSNpbmNsdWRlICJ3YmxpbnV4X2YuaCIKKyNpbmNsdWRlICJ3YmhhbC5oIgorI2luY2x1ZGUgIndiMzV0eF9mLmgiCiAKIHVuc2lnbmVkIGNoYXIKIE1kc19pbml0aWFsKHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlcikKQEAgLTE3LDExICsxNSw2IEBACiAJcmV0dXJuIGhhbF9nZXRfdHhfYnVmZmVyKCZhZGFwdGVyLT5zSHdEYXRhLCAmcE1kcy0+cFR4QnVmZmVyKTsKIH0KIAotdm9pZAotTWRzX0Rlc3Ryb3koc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyKQotewotfQotCiBzdGF0aWMgdm9pZCBNZHNfRHVyYXRpb25TZXQoc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyLCAgc3RydWN0IHdiMzVfZGVzY3JpcHRvciAqcERlcywgIHU4ICpidWZmZXIpCiB7CiAJc3RydWN0IFQwMF9kZXNjcmlwdG9yICpwVDAwOwpAQCAtMzUwLDkgKzM0Myw3IEBACiAJY3RtcDEgPSBjdG1wZiA9IENVUlJFTlRfVFhfUkFURV9GT1JfTU5HOwogCiAJcERlcy0+VHhSYXRlID0gY3RtcDE7Ci0JI2lmZGVmIF9QRV9UWF9EVU1QXwotCXByaW50aygiVHggcmF0ZSA9JXhcbiIsIGN0bXAxKTsKLQkjZW5kaWYKKwlwcl9kZWJ1ZygiVHggcmF0ZSA9JXhcbiIsIGN0bXAxKTsKIAogCXBUMDEtPlQwMV9tb2R1bGF0aW9uX3R5cGUgPSAoY3RtcDElMykgPyAwIDogMTsKIApAQCAtNDA0LDYgKzM5NSw0NCBAQAogCiB9CiAKK3N0YXRpYyB2b2lkIE1MTUVfR2V0TmV4dFBhY2tldChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIsIHN0cnVjdCB3YjM1X2Rlc2NyaXB0b3IgKmRlc2MpCit7CisJZGVzYy0+SW50ZXJuYWxVc2VkID0gZGVzYy0+YnVmZmVyX3N0YXJ0X2luZGV4ICsgZGVzYy0+YnVmZmVyX251bWJlcjsKKwlkZXNjLT5JbnRlcm5hbFVzZWQgJT0gTUFYX0RFU0NSSVBUT1JfQlVGRkVSX0lOREVYOworCWRlc2MtPmJ1ZmZlcl9hZGRyZXNzW2Rlc2MtPkludGVybmFsVXNlZF0gPSBhZGFwdGVyLT5zTWxtZUZyYW1lLnBNTVBEVTsKKwlkZXNjLT5idWZmZXJfc2l6ZVtkZXNjLT5JbnRlcm5hbFVzZWRdID0gYWRhcHRlci0+c01sbWVGcmFtZS5sZW47CisJZGVzYy0+YnVmZmVyX3RvdGFsX3NpemUgKz0gYWRhcHRlci0+c01sbWVGcmFtZS5sZW47CisJZGVzYy0+YnVmZmVyX251bWJlcisrOworCWRlc2MtPlR5cGUgPSBhZGFwdGVyLT5zTWxtZUZyYW1lLkRhdGFUeXBlOworfQorCitzdGF0aWMgdm9pZCBNTE1FZnJlZU1NUERVQnVmZmVyKHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlciwgczggKnBEYXRhKQoreworCWludCBpOworCisJLyogUmVjbGFpbSB0aGUgZGF0YSBidWZmZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9UWF9NTVBEVTsgaSsrKSB7CisJCWlmIChwRGF0YSA9PSAoczggKikmKGFkYXB0ZXItPnNNbG1lRnJhbWUuVHhNTVBEVVtpXSkpCisJCQlicmVhazsKKwl9CisJaWYgKGFkYXB0ZXItPnNNbG1lRnJhbWUuVHhNTVBEVUluVXNlW2ldKQorCQlhZGFwdGVyLT5zTWxtZUZyYW1lLlR4TU1QRFVJblVzZVtpXSA9IGZhbHNlOworCWVsc2UgIHsKKwkJLyogU29tZXRoaW5nIHdyb25nCisJCSBQRDQzIEFkZCBkZWJ1ZyBjb2RlIGhlcmU/Pz8gKi8KKwl9Cit9CisKK3N0YXRpYyB2b2lkIE1MTUVfU2VuZENvbXBsZXRlKHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlciwgdTggUGFja2V0SUQsIHVuc2lnbmVkIGNoYXIgU2VuZE9LKQoreworICAgIC8qIFJlY2xhaW0gdGhlIGRhdGEgYnVmZmVyICovCisJYWRhcHRlci0+c01sbWVGcmFtZS5sZW4gPSAwOworCU1MTUVmcmVlTU1QRFVCdWZmZXIoYWRhcHRlciwgYWRhcHRlci0+c01sbWVGcmFtZS5wTU1QRFUpOworCisJLyogUmV0dXJuIHJlc291cmNlICovCisJYWRhcHRlci0+c01sbWVGcmFtZS5Jc0luVXNlZCA9IFBBQ0tFVF9GUkVFX1RPX1VTRTsKK30KKwogdm9pZAogTWRzX1R4KHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlcikKIHsKQEAgLTQzMCw5ICs0NTksNyBAQAogCWRvIHsKIAkJRmlsbEluZGV4ID0gcE1kcy0+VHhGaWxsSW5kZXg7CiAJCWlmIChwTWRzLT5UeE93bmVyW0ZpbGxJbmRleF0pIHsgLyogSXMgb3duZWQgYnkgc29mdHdhcmUgMDpZZXMgMTpObyAqLwotI2lmZGVmIF9QRV9UWF9EVU1QXwotCQkJcHJpbnRrKCJbTWRzX1R4XSBUeCBPd25lciBpcyBIL1cuXG4iKTsKLSNlbmRpZgorCQkJcHJfZGVidWcoIltNZHNfVHhdIFR4IE93bmVyIGlzIEgvVy5cbiIpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtNDc2LDkgKzUwMyw3IEBACiAKIAkJCS8qIEZvciBzcGVlZCB1cCBLZXkgc2V0dGluZyAqLwogCQkJaWYgKHBUeERlcy0+RWFwRml4KSB7Ci0jaWZkZWYgX1BFX1RYX0RVTVBfCi0JCQkJcHJpbnRrKCIzNTogRVBBIDR0aCBmcmFtZSBkZXRlY3RlZC4gU2l6ZSA9ICVkXG4iLCBQYWNrZXRTaXplKTsKLSNlbmRpZgorCQkJCXByX2RlYnVnKCIzNTogRVBBIDR0aCBmcmFtZSBkZXRlY3RlZC4gU2l6ZSA9ICVkXG4iLCBQYWNrZXRTaXplKTsKIAkJCQlwSHdEYXRhLT5Jc0tleVByZVNldCA9IDE7CiAJCQl9CiAKQEAgLTQ5MiwxMSArNTE3LDYgQEAKIAkJCVhtaXRCdWZTaXplICs9IEN1cnJlbnRTaXplOwogCQkJWG1pdEJ1ZkFkZHJlc3MgKz0gQ3VycmVudFNpemU7CiAKLSNpZmRlZiBfSUJTU19CRUFDT05fU0VRX1NUSUNLXwotCQkJaWYgKChYbWl0QnVmQWRkcmVzc1tET1RfMTFfREFfT0ZGU0VUKzhdICYgMHhmYykgIT0gTUFDX1NVQlRZUEVfTU5HTU5UX1BST0JFX1JFUVVFU1QpIC8qICs4IGZvciBVU0IgaGRyICovCi0jZW5kaWYKLQkJCQlwTWRzLT5UeFRvZ2dsZSA9IHRydWU7Ci0KIAkJCS8qIEdldCBwYWNrZXQgdG8gdHJhbnNtaXQgY29tcGxldGVkLCAxOlRFU1RTVEEgMjpNTE1FIDM6IE5kaXMgZGF0YSAqLwogCQkJTUxNRV9TZW5kQ29tcGxldGUoYWRhcHRlciwgMCwgdHJ1ZSk7CiAKQEAgLTU2Nyw5ICs1ODcsNyBAQAogCQkJCQlwSHdEYXRhLT50eF9yZXRyeV9jb3VudFtSZXRyeUNvdW50XSArPSBSZXRyeUNvdW50OwogCQkJCWVsc2UKIAkJCQkJcEh3RGF0YS0+dHhfcmV0cnlfY291bnRbN10gKz0gUmV0cnlDb3VudDsKLQkJCQkjaWZkZWYgX1BFX1NUQVRFX0RVTVBfCi0JCQkJcHJpbnRrKCJkdG9fdHhfcmV0cnlfY291bnQgPSVkXG4iLCBwSHdEYXRhLT5kdG9fdHhfcmV0cnlfY291bnQpOwotCQkJCSNlbmRpZgorCQkJCXByX2RlYnVnKCJkdG9fdHhfcmV0cnlfY291bnQgPSVkXG4iLCBwSHdEYXRhLT5kdG9fdHhfcmV0cnlfY291bnQpOwogCQkJCU1UT19TZXRUeENvdW50KGFkYXB0ZXIsIFR4UmF0ZSwgUmV0cnlDb3VudCk7CiAJCQl9CiAJCQlwSHdEYXRhLT5kdG9fdHhfZnJhZ19jb3VudCArPSAoUmV0cnlDb3VudCsxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21kc19mLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tZHNfZi5oCmluZGV4IDdmNjhkZWEuLmNlOGJlMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21kc19mLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWRzX2YuaApAQCAtMSwxMSArMSwxMCBAQAogI2lmbmRlZiBfX1dJTkJPTkRfTURTX0ZfSAogI2RlZmluZSBfX1dJTkJPTkRfTURTX0ZfSAogCi0jaW5jbHVkZSAid2JoYWxfcy5oIgorI2luY2x1ZGUgIndiaGFsLmgiCiAjaW5jbHVkZSAiY29yZS5oIgogCiB1bnNpZ25lZCBjaGFyIE1kc19pbml0aWFsKHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlcik7Ci12b2lkIE1kc19EZXN0cm95KHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlcik7CiB2b2lkIE1kc19UeChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIpOwogdm9pZCBNZHNfU2VuZENvbXBsZXRlKHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlciwgc3RydWN0IFQwMl9kZXNjcmlwdG9yICpwdDAyKTsKIHZvaWQgTWRzX01wZHVQcm9jZXNzKHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlciwgc3RydWN0IHdiMzVfZGVzY3JpcHRvciAqcHJ4ZGVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21kc19zLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tZHNfcy5oCmluZGV4IGUyZGU0YmQuLmVlZWRmMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21kc19zLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWRzX3MuaApAQCAtMTA3LDEwICsxMDcsNiBAQAogCXU4CVR4UmF0ZVsoKE1BWF9VU0JfVFhfREVTQ1JJUFRPUiArIDEpICYgfjB4MDEpXVsyXTsgLyogWzBdIGN1cnJlbnQgdHggcmF0ZSwgWzFdIGZhbGwgYmFjayByYXRlICovCiAJdTgJVHhJbmZvWygoTUFYX1VTQl9UWF9ERVNDUklQVE9SICsgMSkgJiB+MHgwMSldOyAvKlN0b3JlIGluZm9ybWF0aW9uIGZvciBjYWxsYmFjayBmdW5jdGlvbiAqLwogCi0JLyogZm9yIHNjYW5uaW5nIG1lY2hhbmlzbSAqLwotCXU4CVR4VG9nZ2xlOwkvKiBJdCBpcyBUUlVFIGlmIHRoZXJlIGFyZSB0eCBhY3Rpdml0aWVzIGluIHNvbWUgdGltZSBpbnRlcnZhbCAqLwotCXU4CVJlc2VydmVkX1szXTsKLQogCS8qIC0tLS0gZm9yIFR4IFBhcmFtZXRlciAqLwogCXUxNglUeEZyYWdtZW50VGhyZXNob2xkOwkvKiBGb3IgZnJhbWUgYm9keSBvbmx5ICovCiAJdTE2CVR4UlRTVGhyZXNob2xkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWxtZXR4cnguYyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21sbWV0eHJ4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MjVhMjMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWxtZXR4cnguYworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgTW9kdWxlIE5hbWU6Ci0gICAgTUxNRVR4UnguQwotCi0gIERlc2NyaXB0aW9uOgotICAgIFRoZSBpbnRlcmZhY2UgYmV0d2VlbiBNRFMgKE1BQyBEYXRhIFNlcnZpY2UpIGFuZCBNTE1FLgotCi0gIFJldmlzaW9uIEhpc3Rvcnk6Ci0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCTIwMDIwOSAgICAgIFVOMjAgSmVubmlmZXIgWHUKLQkJSW5pdGlhbCBSZWxlYXNlCi0JCTIwMDIxMTA4ICAgIFBENDMgQXVzdGluIExpdQotCQkyMDAzMDExNyAgICBQRDQzIEF1c3RpbiBMaXUKLQkJRGVsZXRlZCBNTE1FUmV0dXJuUGFja2V0IGFuZCBNTE1FUHJvY1RocmVhZCgpCi0KLSAgQ29weXJpZ2h0IChjKSAxOTk2LTIwMDIgV2luYm9uZCBFbGVjdHJvbmljcyBDb3JwLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotI2luY2x1ZGUgInN5c2RlZi5oIgotCi0jaW5jbHVkZSAibWRzX2YuaCIKLQotdm9pZCBNTE1FX0dldE5leHRQYWNrZXQoc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyLCBzdHJ1Y3Qgd2IzNV9kZXNjcmlwdG9yICpkZXNjKQotewotCWRlc2MtPkludGVybmFsVXNlZCA9IGRlc2MtPmJ1ZmZlcl9zdGFydF9pbmRleCArIGRlc2MtPmJ1ZmZlcl9udW1iZXI7Ci0JZGVzYy0+SW50ZXJuYWxVc2VkICU9IE1BWF9ERVNDUklQVE9SX0JVRkZFUl9JTkRFWDsKLQlkZXNjLT5idWZmZXJfYWRkcmVzc1tkZXNjLT5JbnRlcm5hbFVzZWRdID0gYWRhcHRlci0+c01sbWVGcmFtZS5wTU1QRFU7Ci0JZGVzYy0+YnVmZmVyX3NpemVbZGVzYy0+SW50ZXJuYWxVc2VkXSA9IGFkYXB0ZXItPnNNbG1lRnJhbWUubGVuOwotCWRlc2MtPmJ1ZmZlcl90b3RhbF9zaXplICs9IGFkYXB0ZXItPnNNbG1lRnJhbWUubGVuOwotCWRlc2MtPmJ1ZmZlcl9udW1iZXIrKzsKLQlkZXNjLT5UeXBlID0gYWRhcHRlci0+c01sbWVGcmFtZS5EYXRhVHlwZTsKLX0KLQotc3RhdGljIHZvaWQgTUxNRWZyZWVNTVBEVUJ1ZmZlcihzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIsIHM4ICpwRGF0YSkKLXsKLQlpbnQgaTsKLQotCS8qIFJlY2xhaW0gdGhlIGRhdGEgYnVmZmVyICovCi0JZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fVFhfTU1QRFU7IGkrKykgewotCQlpZiAocERhdGEgPT0gKHM4ICopJihhZGFwdGVyLT5zTWxtZUZyYW1lLlR4TU1QRFVbaV0pKQotCQkJYnJlYWs7Ci0JfQotCWlmIChhZGFwdGVyLT5zTWxtZUZyYW1lLlR4TU1QRFVJblVzZVtpXSkKLQkJYWRhcHRlci0+c01sbWVGcmFtZS5UeE1NUERVSW5Vc2VbaV0gPSBmYWxzZTsKLQllbHNlICB7Ci0JCS8qIFNvbWV0aGluZyB3cm9uZwotCQkgUEQ0MyBBZGQgZGVidWcgY29kZSBoZXJlPz8/ICovCi0JfQotfQotCi12b2lkCi1NTE1FX1NlbmRDb21wbGV0ZShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIsIHU4IFBhY2tldElELCB1bnNpZ25lZCBjaGFyIFNlbmRPSykKLXsKLSAgICAvKiBSZWNsYWltIHRoZSBkYXRhIGJ1ZmZlciAqLwotCWFkYXB0ZXItPnNNbG1lRnJhbWUubGVuID0gMDsKLQlNTE1FZnJlZU1NUERVQnVmZmVyKGFkYXB0ZXIsIGFkYXB0ZXItPnNNbG1lRnJhbWUucE1NUERVKTsKLQotCS8qIFJldHVybiByZXNvdXJjZSAqLwotCWFkYXB0ZXItPnNNbG1lRnJhbWUuSXNJblVzZWQgPSBQQUNLRVRfRlJFRV9UT19VU0U7Ci19Ci0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tbG1ldHhyeF9mLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tbG1ldHhyeF9mLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMjUwN2YuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWxtZXR4cnhfZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gTUxNRVR4UnguSCAtLQotLy8KLS8vICAgRnVuY3Rpb25zIGRlZmluZWQgaW4gTUxNRVR4UnguYy4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDIgV2luYm9uZCBFbGVjdHJpY3MgQ29ycC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotI2lmbmRlZiBfTUxNRVRYUlhfSAotI2RlZmluZSBfTUxNRVRYUlhfSAotCi0jaW5jbHVkZSAiY29yZS5oIgotCi12b2lkIE1MTUVfR2V0TmV4dFBhY2tldChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIsIHN0cnVjdCB3YjM1X2Rlc2NyaXB0b3IgKnBEZXMpOwotCi12b2lkCi1NTE1FX1NlbmRDb21wbGV0ZShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIsIHU4IFBhY2tldElELAotCQkgIHVuc2lnbmVkIGNoYXIgU2VuZE9LKTsKLQotI2lmZGVmIF9JQlNTX0JFQUNPTl9TRVFfU1RJQ0tfCi1zOCBTZW5kQkNOdWxsRGF0YShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIsIHUxNiB3SWR4KTsKLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL210by5jIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbXRvLmMKaW5kZXggOWNkMjEyNy4uYzAzZTUwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbXRvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbXRvLmMKQEAgLTE3LDkgKzE3LDEwIEBACiAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KIAotI2luY2x1ZGUgInN5c2RlZi5oIgogI2luY2x1ZGUgInNtZV9hcGkuaCIKLSNpbmNsdWRlICJ3YmhhbF9mLmgiCisjaW5jbHVkZSAid2JoYWwuaCIKKyNpbmNsdWRlICJ3YjM1cmVnX2YuaCIKKyNpbmNsdWRlICJjb3JlLmgiCiAKIC8qIERlY2xhcmUgU1EzIHRvIHJhdGUgYW5kIGZyYWdtZW50YXRpb24gdGhyZXNob2xkIHRhYmxlICovCiAvKiBEZWNsYXJlIGZyYWdtZW50YXRpb24gdGhyZXNob2xkcyB0YWJsZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvcGh5X2NhbGlicmF0aW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9waHlfY2FsaWJyYXRpb24uYwppbmRleCAyYjM3NWJhLi4wOTg0NGRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9waHlfY2FsaWJyYXRpb24uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9waHlfY2FsaWJyYXRpb24uYwpAQCAtMTAsOSArMTAsMTAgQEAKICAqLwogCiAvKioqKioqKioqKioqKioqKioqIElOQ0xVREUgRklMRVMgU0VDVElPTiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlICJzeXNkZWYuaCIKICNpbmNsdWRlICJwaHlfY2FsaWJyYXRpb24uaCIKLSNpbmNsdWRlICJ3YmhhbF9mLmgiCisjaW5jbHVkZSAid2JoYWwuaCIKKyNpbmNsdWRlICJ3YjM1cmVnX2YuaCIKKyNpbmNsdWRlICJjb3JlLmgiCiAKIAogLyoqKioqKioqKioqKioqKioqKiBERUJVRyBDT05TVEFOVCBBTkQgTUFDUk8gU0VDVElPTiAqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9waHlfY2FsaWJyYXRpb24uaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3BoeV9jYWxpYnJhdGlvbi5oCmluZGV4IDMwMzIwMzEuLjg0ZjZlODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3BoeV9jYWxpYnJhdGlvbi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3BoeV9jYWxpYnJhdGlvbi5oCkBAIC0xLDcgKzEsNyBAQAogI2lmbmRlZiBfX1dJTkJPTkRfUEhZX0NBTElCUkFUSU9OX0gKICNkZWZpbmUgX19XSU5CT05EX1BIWV9DQUxJQlJBVElPTl9ICiAKLSNpbmNsdWRlICJ3YmhhbF9mLmgiCisjaW5jbHVkZSAid2JoYWwuaCIKIAogI2RlZmluZSBSRUdfQUdDX0NUUkwxCQkweDEwMDAKICNkZWZpbmUgUkVHX0FHQ19DVFJMMgkJMHgxMDA0CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9yZWcuYyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3JlZy5jCmluZGV4IDk5MGY5ZDQuLjFiMzhkNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3JlZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3JlZy5jCkBAIC0xLDUgKzEsNiBAQAotI2luY2x1ZGUgInN5c2RlZi5oIgotI2luY2x1ZGUgIndiaGFsX2YuaCIKKyNpbmNsdWRlICJ3YmhhbC5oIgorI2luY2x1ZGUgIndiMzVyZWdfZi5oIgorI2luY2x1ZGUgImNvcmUuaCIKIAogLyoKICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTEwMTAsOSArMTAxMSw3IEBACiAJY2FzZSBSRl9BSVJPSEFfNzIzMDoKIAkJLyogU3RhcnQgdG8gZmlsbCBSRiBwYXJhbWV0ZXJzLCBQTExfT04gc2hvdWxkIGJlIHB1bGxlZCBsb3cuICovCiAJCVdiMzVSZWdfV3JpdGVTeW5jKHBId0RhdGEsIDB4MDNkYywgMHgwMDAwMDAwMCk7Ci0JCSNpZmRlZiBfUEVfU1RBVEVfRFVNUF8KLQkJcHJpbnRrKCIqIFBMTF9PTiAgICBsb3dcbiIpOwotCQkjZW5kaWYKKwkJcHJfZGVidWcoIiogUExMX09OICAgIGxvd1xuIik7CiAJCW51bWJlciA9IEFSUkFZX1NJWkUoYWw3MjMwX3JmX2RhdGFfMjQpOwogCQlTZXRfQ2hhbkluZGVwX1JmRGF0YV9hbDcyMzBfMjQocEh3RGF0YSwgcGx0bXAsIG51bWJlcik7CiAJCWJyZWFrOwpAQCAtMTA5OCw5ICsxMDk3LDcgQEAKIAljYXNlIFJGX0FJUk9IQV83MjMwOgogCQkvKiBSRiBwYXJhbWV0ZXJzIGhhdmUgZmlsbGVkIGNvbXBsZXRlbHksIFBMTF9PTiBzaG91bGQgYmUgcHVsbGVkIGhpZ2ggKi8KIAkJV2IzNVJlZ19Xcml0ZVN5bmMocEh3RGF0YSwgMHgwM2RjLCAweDAwMDAwMDgwKTsKLQkJI2lmZGVmIF9QRV9TVEFURV9EVU1QXwotCQlwcmludGsoIiogUExMX09OICAgIGhpZ2hcbiIpOwotCQkjZW5kaWYKKwkJcHJfZGVidWcoIiogUExMX09OICAgIGhpZ2hcbiIpOwogCiAJCS8qIDIuNEdIeiAqLwogCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDI0IDw8IDI0KSB8IDB4OUFCQThGOwpAQCAtMTExNSw5ICsxMTEyLDcgQEAKIAogCQkvKiA1R0h6ICovCiAJCVdiMzVSZWdfV3JpdGVTeW5jKHBId0RhdGEsIDB4MDNkYywgMHgwMDAwMDAwMCk7Ci0JCSNpZmRlZiBfUEVfU1RBVEVfRFVNUF8KLQkJcHJpbnRrKCIqIFBMTF9PTiAgICBsb3dcbiIpOwotCQkjZW5kaWYKKwkJcHJfZGVidWcoIiogUExMX09OICAgIGxvd1xuIik7CiAKIAkJbnVtYmVyID0gQVJSQVlfU0laRShhbDcyMzBfcmZfZGF0YV81MCk7CiAJCVNldF9DaGFuSW5kZXBfUmZEYXRhX2FsNzIzMF81MChwSHdEYXRhLCBwbHRtcCwgbnVtYmVyKTsKQEAgLTExMjcsOSArMTEyMiw3IEBACiAJCW1zbGVlcCg1KTsKIAogCQlXYjM1UmVnX1dyaXRlU3luYyhwSHdEYXRhLCAweDAzZGMsIDB4MDAwMDAwODApOwotCQkjaWZkZWYgX1BFX1NUQVRFX0RVTVBfCi0JCXByaW50aygiKiBQTExfT04gICAgaGlnaFxuIik7Ci0JCSNlbmRpZgorCQlwcl9kZWJ1ZygiKiBQTExfT04gICAgaGlnaFxuIik7CiAKIAkJbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyNCA8PCAyNCkgfCAweDlBQkE4RjsKIAkJV2IzNVJlZ19Xcml0ZVN5bmMocEh3RGF0YSwgMHgwODY0LCBsdG1wKTsKQEAgLTE3OTUsOSArMTc4OCw3IEBACiAKIAkJCS8qIFdyaXRlIHRvIHJlZ2lzdGVyLiBudW1iZXIgbXVzdCBsZXNzIGFuZCBlcXVhbCB0aGFuIDE2ICovCiAJCQlXYjM1UmVnX0J1cnN0V3JpdGUocEh3RGF0YSwgMHgwODY0LCBwbHRtcCwgbnVtYmVyLCBOT19JTkNSRU1FTlQpOwotCQkJI2lmZGVmIF9QRV9TVEFURV9EVU1QXwotCQkJcHJpbnRrKCJCYW5kIGNoYW5nZWRcbiIpOwotCQkJI2VuZGlmCisJCQlwcl9kZWJ1ZygiQmFuZCBjaGFuZ2VkXG4iKTsKIAkJfQogCiAJCWlmIChDaGFubmVsLmJhbmQgPD0gQkFORF9UWVBFX09GRE1fMjQpIHsgLyogY2hhbm5lbCAxIH4gMTQgKi8KQEAgLTIwNzMsMTEgKzIwNjQsNyBAQAogCSAqLwogCiAJLyogTTAwIGJpdCBzZXQgKi8KLQkjaWZkZWYgX0lCU1NfQkVBQ09OX1NFUV9TVElDS18KLQlyZWctPk0wMF9NYWNDb250cm9sID0gMDsgLyogU29sdmUgYmVhY29uIHNlcXVlbmNlIG51bWJlciBzdG9wIGJ5IHNvZnR3YXJlICovCi0JI2Vsc2UKIAlyZWctPk0wMF9NYWNDb250cm9sID0gMHg4MDAwMDAwMDsgLyogU29sdmUgYmVhY29uIHNlcXVlbmNlIG51bWJlciBzdG9wIGJ5IGhhcmR3YXJlICovCi0JI2VuZGlmCiAKIAkvKiBNMjQgZGlzYWJsZSBlbnRlciBwb3dlciBzYXZlLCBCQiBSeE9uIGFuZCBlbmFibGUgTkFWIGF0dGFjayAqLwogCXJlZy0+TTI0X01hY0NvbnRyb2wgPSAweDA4MDQwMDQyOwpAQCAtMjMzNiwxMyArMjMyMyw2IEBACiAJCXBId0RhdGEtPlR4VmdhRm9yNTBbMzJdLlR4VmdhVmFsdWUgPSBwVHhWZ2FbMTddIC0gc3RtcCAqIDIgLyA0OwogCQlwSHdEYXRhLT5UeFZnYUZvcjUwWzMxXS5UeFZnYVZhbHVlID0gcFR4VmdhWzE3XSAtIHN0bXAgKiAzIC8gNDsKIAl9Ci0KLQkjaWZkZWYgX1BFX1NUQVRFX0RVTVBfCi0JcHJpbnRrKCIgVHhWZ2FGb3IyNCA6XG4iKTsKLQlEYXRhRG1wKCh1OCAqKXBId0RhdGEtPlR4VmdhRm9yMjQsIDE0ICwgMCk7Ci0JcHJpbnRrKCIgVHhWZ2FGb3I1MCA6XG4iKTsKLQlEYXRhRG1wKCh1OCAqKXBId0RhdGEtPlR4VmdhRm9yNTAsIDcwICwgMCk7Ci0JI2VuZGlmCiB9CiAKIHZvaWQgQkJQcm9jZXNzb3JfUmF0ZUNoYW5naW5nKHN0cnVjdCBod19kYXRhICpwSHdEYXRhLCAgdTggcmF0ZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3N5c2RlZi5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvc3lzZGVmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZDcxZjYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvc3lzZGVmLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKiAgV2luYm9uZCBXTEFOIFN5c3RlbSBDb25maWd1cmF0aW9uIGRlZmluZXMgKi8KLQotI2lmbmRlZiBTWVNfREVGX0gKLSNkZWZpbmUgU1lTX0RFRl9ICi0KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotCi0jZGVmaW5lIFdCX0xJTlVYCi0jZGVmaW5lIFdCX0xJTlVYX1dQQV9QU0sKLQotI2RlZmluZSBfVVNFX0ZBTExCQUNLX1JBVEVfCi0KLSNkZWZpbmUgX1dQQTJfCi0KLSNpZm5kZWYgX1dQQV9QU0tfREVCVUcKLSN1bmRlZiAgX1dQQV9QU0tfREVCVUcKLSNlbmRpZgotCi0vKiBkZWJ1ZyBwcmludCBvcHRpb25zLCBtYXJrIHdoYXQgZGVidWcgeW91IGRvbid0IG5lZWQgKi8KLQotI2lmZGVmIEZVTExfREVCVUcKLSNkZWZpbmUgX1BFX1NUQVRFX0RVTVBfCi0jZGVmaW5lIF9QRV9UWF9EVU1QXwotI2RlZmluZSBfUEVfUlhfRFVNUF8KLSNkZWZpbmUgX1BFX09JRF9EVU1QXwotI2RlZmluZSBfUEVfRFRPX0RVTVBfCi0jZGVmaW5lIF9QRV9SRUdfRFVNUF8KLSNkZWZpbmUgX1BFX1VTQl9JTklfRFVNUF8KLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyZWcuYyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyZWcuYwppbmRleCA3NzA3MjIzLi40MmFlNjEwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJlZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyZWcuYwpAQCAtMSw0ICsxLDMgQEAKLSNpbmNsdWRlICJzeXNkZWYuaCIKICNpbmNsdWRlICJ3YjM1cmVnX2YuaCIKIAogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgpAQCAtMTQwLDggKzEzOSw4IEBACiAKIAkvKiBTeW5jIElvQ2FsbERyaXZlciAqLwogCXJlZy0+RVAwdm1fc3RhdGUgPSBWTV9SVU5OSU5HOwotCXJldCA9IHVzYl9jb250cm9sX21zZyhwSHdEYXRhLT5XYlVzYi51ZGV2LAotCQkJICAgICAgIHVzYl9zbmRjdHJscGlwZShwSHdEYXRhLT5XYlVzYi51ZGV2LCAwKSwKKwlyZXQgPSB1c2JfY29udHJvbF9tc2cocEh3RGF0YS0+dWRldiwKKwkJCSAgICAgICB1c2Jfc25kY3RybHBpcGUocEh3RGF0YS0+dWRldiwgMCksCiAJCQkgICAgICAgMHgwMywgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSB8IFVTQl9ESVJfT1VULAogCQkJICAgICAgIDB4MCwgUmVnaXN0ZXJObywgJlJlZ2lzdGVyVmFsdWUsIDQsIEhaICogMTAwKTsKIAlyZWctPkVQMHZtX3N0YXRlID0gVk1fU1RPUDsKQEAgLTE1MCw5ICsxNDksNyBAQAogCVdiMzVSZWdfRVAwVk1fc3RhcnQocEh3RGF0YSk7CiAKIAlpZiAocmV0IDwgMCkgewotI2lmZGVmIF9QRV9SRUdfRFVNUF8KLQkJcHJpbnRrKCJFUDAgV3JpdGUgcmVnaXN0ZXIgdXNiIG1lc3NhZ2Ugc2VuZGluZyBlcnJvclxuIik7Ci0jZW5kaWYKKwkJcHJfZGVidWcoIkVQMCBXcml0ZSByZWdpc3RlciB1c2IgbWVzc2FnZSBzZW5kaW5nIGVycm9yXG4iKTsKIAkJcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgPSAxOwogCQlyZXR1cm4gZmFsc2U7CiAJfQpAQCAtMzA1LDggKzMwMiw4IEBACiAJCW1zbGVlcCgxMCk7CiAKIAlyZWctPkVQMHZtX3N0YXRlID0gVk1fUlVOTklORzsKLQlyZXQgPSB1c2JfY29udHJvbF9tc2cocEh3RGF0YS0+V2JVc2IudWRldiwKLQkJCSAgICAgICB1c2JfcmN2Y3RybHBpcGUocEh3RGF0YS0+V2JVc2IudWRldiwgMCksCisJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHBId0RhdGEtPnVkZXYsCisJCQkgICAgICAgdXNiX3JjdmN0cmxwaXBlKHBId0RhdGEtPnVkZXYsIDApLAogCQkJICAgICAgIDB4MDEsIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UgfCBVU0JfRElSX0lOLAogCQkJICAgICAgIDB4MCwgUmVnaXN0ZXJObywgcGx0bXAsIDQsIEhaICogMTAwKTsKIApAQCAtMzIwLDkgKzMxNyw3IEBACiAJV2IzNVJlZ19FUDBWTV9zdGFydChwSHdEYXRhKTsKIAogCWlmIChyZXQgPCAwKSB7Ci0jaWZkZWYgX1BFX1JFR19EVU1QXwotCQlwcmludGsoIkVQMCBSZWFkIHJlZ2lzdGVyIHVzYiBtZXNzYWdlIHNlbmRpbmcgZXJyb3JcbiIpOwotI2VuZGlmCisJCXByX2RlYnVnKCJFUDAgUmVhZCByZWdpc3RlciB1c2IgbWVzc2FnZSBzZW5kaW5nIGVycm9yXG4iKTsKIAkJcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgPSAxOwogCQlyZXR1cm4gZmFsc2U7CiAJfQpAQCAtNDMyLDggKzQyNyw4IEBACiAJaWYgKHJlZ19xdWV1ZS0+RElSRUNUID09IDEpIC8qIG91dHB1dCAqLwogCQlwQnVmZmVyID0gJnJlZ19xdWV1ZS0+VkFMVUU7CiAKLQl1c2JfZmlsbF9jb250cm9sX3VyYih1cmIsIHBId0RhdGEtPldiVXNiLnVkZXYsCi0JCQkgICAgICBSRUdfRElSRUNUSU9OKHBId0RhdGEtPldiVXNiLnVkZXYsIHJlZ19xdWV1ZSksCisJdXNiX2ZpbGxfY29udHJvbF91cmIodXJiLCBwSHdEYXRhLT51ZGV2LAorCQkJICAgICAgUkVHX0RJUkVDVElPTihwSHdEYXRhLT51ZGV2LCByZWdfcXVldWUpLAogCQkJICAgICAgKHU4ICopZHIsIHBCdWZmZXIsIGNwdV90b19sZTE2KGRyLT53TGVuZ3RoKSwKIAkJCSAgICAgIFdiMzVSZWdfRVAwVk1fY29tcGxldGUsICh2b2lkICopcEh3RGF0YSk7CiAKQEAgLTQ0Miw5ICs0MzcsNyBAQAogCXJldCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAKIAlpZiAocmV0IDwgMCkgewotI2lmZGVmIF9QRV9SRUdfRFVNUF8KLQkJcHJpbnRrKCJFUDAgSXJwIHNlbmRpbmcgZXJyb3JcbiIpOwotI2VuZGlmCisJCXByX2RlYnVnKCJFUDAgSXJwIHNlbmRpbmcgZXJyb3JcbiIpOwogCQlnb3RvIGNsZWFudXA7CiAJfQogCXJldHVybjsKQEAgLTQ3OSw5ICs0NzIsNyBAQAogCQlzcGluX3VubG9ja19pcnEoJnJlZy0+RVAwVk1fc3Bpbl9sb2NrKTsKIAogCQlpZiAocmVnLT5FUDBWTV9zdGF0dXMpIHsKLSNpZmRlZiBfUEVfUkVHX0RVTVBfCi0JCQlwcmludGsoIkVQMCBJb0NvbXBsZXRlUm91dGluZSByZXR1cm4gZXJyb3JcbiIpOwotI2VuZGlmCisJCQlwcl9kZWJ1ZygiRVAwIElvQ29tcGxldGVSb3V0aW5lIHJldHVybiBlcnJvclxuIik7CiAJCQlyZWctPkVQMHZtX3N0YXRlID0gVk1fU1RPUDsKIAkJCXBId0RhdGEtPlN1cnByaXNlUmVtb3ZlID0gMTsKIAkJfSBlbHNlIHsKQEAgLTUyNiw5ICs1MTcsNyBAQAogCQkJdXNiX2ZyZWVfdXJiKHVyYik7CiAJCQlrZnJlZShyZWdfcXVldWUpOwogCQl9IGVsc2UgewotI2lmZGVmIF9QRV9SRUdfRFVNUF8KLQkJCXByaW50aygiRVAwIHF1ZXVlIHJlbGVhc2UgZXJyb3JcbiIpOwotI2VuZGlmCisJCQlwcl9kZWJ1ZygiRVAwIHF1ZXVlIHJlbGVhc2UgZXJyb3JcbiIpOwogCQl9CiAJCXNwaW5fbG9ja19pcnEoJnJlZy0+RVAwVk1fc3Bpbl9sb2NrKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJlZ19mLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cmVnX2YuaAppbmRleCBiZjIzYzEwLi45NWRjOTgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cmVnX2YuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cmVnX2YuaApAQCAtMSw3ICsxLDcgQEAKICNpZm5kZWYgX19XSU5CT05EX1dCMzVSRUdfRl9ICiAjZGVmaW5lIF9fV0lOQk9ORF9XQjM1UkVHX0ZfSAogCi0jaW5jbHVkZSAid2JoYWxfcy5oIgorI2luY2x1ZGUgIndiaGFsLmgiCiAKIC8qCiAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyZWdfcy5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJlZ19zLmgKaW5kZXggNGVmZjAwOS4uZWIyNzRmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJlZ19zLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJlZ19zLmgKQEAgLTUsNiArNSw4IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAKK3N0cnVjdCBod19kYXRhOworCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKgogICoJCQlIQUwgc2V0dGluZyBmdW5jdGlvbgpAQCAtNDksMTEgKzUxLDcgQEAKICNkZWZpbmUgREVGQVVMVF9DV01BWAkJCTEwMjMJLyogKE0yQykgQ1dtYXguIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC0xMDIzLiAqLwogI2RlZmluZSBERUZBVUxUX0FJRAkJCTEJLyogKE0zNCkgQUlELiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDEtMjAwNy4gKi8KIAotI2lmZGVmIF9VU0VfRkFMTEJBQ0tfUkFURV8KICNkZWZpbmUgREVGQVVMVF9SQVRFX1JFVFJZX0xJTUlUCTIJLyogKE0zOCkgYXMgbmFtZWQgKi8KLSNlbHNlCi0jZGVmaW5lIERFRkFVTFRfUkFURV9SRVRSWV9MSU1JVAk3CS8qIChNMzgpIGFzIG5hbWVkICovCi0jZW5kaWYKIAogI2RlZmluZSBERUZBVUxUX0xPTkdfUkVUUllfTElNSVQJNwkvKiAoTTM4KSBMb25nUmV0cnlMaW1pdC4gSXRzIHZhbHVlIGlzIGluIHRoZSByYW5nZSAwLTE1LiAqLwogI2RlZmluZSBERUZBVUxUX1NIT1JUX1JFVFJZX0xJTUlUCTcJLyogKE0zOCkgU2hvcnRSZXRyeUxpbWl0LiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtMTUuICovCkBAIC0xNjgsNCArMTY2LDc1IEBACiAJdTMyCVNRM19maWx0ZXJbTUFYX1NRM19GSUxURVJfU0laRV07CiAJdTMyCVNRM19pbmRleDsKIH07CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRnVuY3Rpb24gZGVjbGFyYXRpb24KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCit2b2lkIGhhbF9yZW1vdmVfbWFwcGluZ19rZXkoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEsIHU4ICptYWNfYWRkcik7Cit2b2lkIGhhbF9yZW1vdmVfZGVmYXVsdF9rZXkoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEsIHUzMiBpbmRleCk7Cit1bnNpZ25lZCBjaGFyIGhhbF9zZXRfbWFwcGluZ19rZXkoc3RydWN0IGh3X2RhdGEgKmFkYXB0ZXIsIHU4ICptYWNfYWRkciwKKwkJCQkgIHU4IG51bGxfa2V5LCB1OCB3ZXBfb24sIHU4ICp0eF90c2MsCisJCQkJICB1OCAqcnhfdHNjLCB1OCBrZXlfdHlwZSwgdTgga2V5X2xlbiwKKwkJCQkgIHU4ICprZXlfZGF0YSk7Cit1bnNpZ25lZCBjaGFyIGhhbF9zZXRfZGVmYXVsdF9rZXkoc3RydWN0IGh3X2RhdGEgKmFkYXB0ZXIsIHU4IGluZGV4LAorCQkJCSAgdTggbnVsbF9rZXksIHU4IHdlcF9vbiwgdTggKnR4X3RzYywKKwkJCQkgIHU4ICpyeF90c2MsIHU4IGtleV90eXBlLCB1OCBrZXlfbGVuLAorCQkJCSAgdTggKmtleV9kYXRhKTsKK3ZvaWQgaGFsX2NsZWFyX2FsbF9kZWZhdWx0X2tleShzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSk7Cit2b2lkIGhhbF9jbGVhcl9hbGxfZ3JvdXBfa2V5KHN0cnVjdCBod19kYXRhICpod19kYXRhKTsKK3ZvaWQgaGFsX2NsZWFyX2FsbF9tYXBwaW5nX2tleShzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSk7Cit2b2lkIGhhbF9jbGVhcl9hbGxfa2V5KHN0cnVjdCBod19kYXRhICpod19kYXRhKTsKK3ZvaWQgaGFsX3NldF9wb3dlcl9zYXZlX21vZGUoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEsIHVuc2lnbmVkIGNoYXIgcG93ZXJfc2F2ZSwKKwkJCSAgICAgdW5zaWduZWQgY2hhciB3YWtldXAsIHVuc2lnbmVkIGNoYXIgZHRpbSk7Cit2b2lkIGhhbF9nZXRfcG93ZXJfc2F2ZV9tb2RlKHN0cnVjdCBod19kYXRhICpod19kYXRhLCB1OCAqaW5fcHdyX3NhdmUpOwordm9pZCBoYWxfc2V0X3Nsb3RfdGltZShzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSwgdTggdHlwZSk7CisKKyNkZWZpbmUgaGFsX3NldF9hdGltX3dpbmRvdyhfQSwgX0FUTSkKKwordm9pZCBoYWxfc3RhcnRfYnNzKHN0cnVjdCBod19kYXRhICpod19kYXRhLCB1OCBtYWNfb3BfbW9kZSk7CisKKy8qIDA6QlNTIFNUQSAxOklCU1MgU1RBICovCit2b2lkIGhhbF9qb2luX3JlcXVlc3Qoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEsIHU4IGJzc190eXBlKTsKKwordm9pZCBoYWxfc3RvcF9zeW5jX2JzcyhzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSk7Cit2b2lkIGhhbF9yZXN1bWVfc3luY19ic3Moc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEpOwordm9pZCBoYWxfc2V0X2FpZChzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSwgdTE2IGFpZCk7Cit2b2lkIGhhbF9zZXRfYnNzaWQoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEsIHU4ICpic3NpZCk7Cit2b2lkIGhhbF9nZXRfYnNzaWQoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEsIHU4ICpic3NpZCk7Cit2b2lkIGhhbF9zZXRfbGlzdGVuX2ludGVydmFsKHN0cnVjdCBod19kYXRhICpod19kYXRhLCB1MTYgbGlzdGVuX2ludGVydmFsKTsKK3ZvaWQgaGFsX3NldF9jYXBfaW5mbyhzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSwgdTE2IGNhcGFiaWxpdHlfaW5mbyk7Cit2b2lkIGhhbF9zZXRfc3NpZChzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSwgdTggKnNzaWQsIHU4IHNzaWRfbGVuKTsKK3ZvaWQgaGFsX3N0YXJ0X3R4MChzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSk7CisKKyNkZWZpbmUgaGFsX2dldF9jd21pbihfQSkJKChfQSktPmN3bWluKQorCit2b2lkIGhhbF9zZXRfY3dtYXgoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEsIHUxNiBjd2luX21heCk7CisKKyNkZWZpbmUgaGFsX2dldF9jd21heChfQSkJKChfQSktPmN3bWF4KQorCit2b2lkIGhhbF9zZXRfcnNuX3dwYShzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSwgdTMyICpyc25faWVfYml0bWFwLAorCQkgICAgIHUzMiAqcnNuX291aV90eXBlICwgdW5zaWduZWQgY2hhciBkZXNpcmVkX2F1dGhfbW9kZSk7Cit2b2lkIGhhbF9zZXRfY29ubmVjdF9pbmZvKHN0cnVjdCBod19kYXRhICpod19kYXRhLCB1bnNpZ25lZCBjaGFyIGJvX2Nvbm5lY3QpOwordTggaGFsX2dldF9lc3Rfc3EzKHN0cnVjdCBod19kYXRhICpod19kYXRhLCB1OCBjb3VudCk7Cit2b2lkIGhhbF9kZXNjcmlwdG9yX2luZGljYXRlKHN0cnVjdCBod19kYXRhICpod19kYXRhLAorCQkJICAgICBzdHJ1Y3Qgd2IzNV9kZXNjcmlwdG9yICpkZXMpOwordTggaGFsX2dldF9hbnRlbm5hX251bWJlcihzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSk7Cit1MzIgaGFsX2dldF9ic3NfcGtfY250KHN0cnVjdCBod19kYXRhICpod19kYXRhKTsKKworI2RlZmluZSBoYWxfZ2V0X3JlZ2lvbl9mcm9tX0VFUFJPTShfQSkJKChfQSktPnJlZy5FRVBST01SZWdpb24pCisjZGVmaW5lIGhhbF9nZXRfdHhfYnVmZmVyKF9BLCBfQikJV2IzNVR4X2dldF90eF9idWZmZXIoX0EsIF9CKQorI2RlZmluZSBoYWxfc29mdHdhcmVfc2V0KF9BKQkJKF9BLT5Tb2Z0d2FyZVNldCkKKyNkZWZpbmUgaGFsX2RyaXZlcl9pbml0X09LKF9BKQkJKF9BLT5Jc0luaXRPSykKKyNkZWZpbmUgaGFsX3Jzc2lfYm91bmRhcnlfaGlnaChfQSkJKF9BLT5SU1NJX2hpZ2gpCisjZGVmaW5lIGhhbF9yc3NpX2JvdW5kYXJ5X2xvdyhfQSkJKF9BLT5SU1NJX2xvdykKKyNkZWZpbmUgaGFsX3NjYW5faW50ZXJ2YWwoX0EpCQkoX0EtPlNjYW5fSW50ZXJ2YWwpCisKKyNkZWZpbmUgUEhZX0RFQlVHKG1zZywgYXJncy4uLikKKworLyogcmV0dXJuIDEwMG1zIGNvdW50ICovCisjZGVmaW5lIGhhbF9nZXRfdGltZV9jb3VudChfUCkJCShfUC0+dGltZV9jb3VudCAvIDEwKQorCisjZGVmaW5lIGhhbF9pYnNzX2Rpc2Nvbm5lY3QoX0EpCQkoaGFsX3N0b3Bfc3luY19ic3MoX0EpKQorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyeC5jIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJ4LmMKaW5kZXggNDQ4NTE0YS4uZjExOGVlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJ4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJ4LmMKQEAgLTE0LDcgKzE0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlICJjb3JlLmgiCi0jaW5jbHVkZSAic3lzZGVmLmgiCiAjaW5jbHVkZSAid2IzNXJ4X2YuaCIKIAogc3RhdGljIHZvaWQgcGFja2V0X2NhbWUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGNoYXIgKnBSeEJ1ZmZlckFkZHJlc3MsIGludCBQYWNrZXRTaXplKQpAQCAtMTA5LDEwICsxMDgsNyBAQAogCiAJCQkvKiBCYXNpYyBjaGVjayBmb3IgUnggbGVuZ3RoLiBJcyBsZW5ndGggdmFsaWQ/ICovCiAJCQlpZiAoUGFja2V0U2l6ZSA+IE1BWF9QQUNLRVRfU0laRSkgewotI2lmZGVmIF9QRV9SWF9EVU1QXwotCQkJCXByaW50aygiU2VyaW91cyBFUlJPUiA6IFJ4IGRhdGEgc2l6ZSB0b28gbG9uZywgc2l6ZSA9JWRcbiIsIFBhY2tldFNpemUpOwotI2VuZGlmCi0KKwkJCQlwcl9kZWJ1ZygiU2VyaW91cyBFUlJPUiA6IFJ4IGRhdGEgc2l6ZSB0b28gbG9uZywgc2l6ZSA9JWRcbiIsIFBhY2tldFNpemUpOwogCQkJCXBXYjM1UngtPkVQM3ZtX3N0YXRlID0gVk1fU1RPUDsKIAkJCQlwV2IzNVJ4LT5FcDNFcnJvckNvdW50MisrOwogCQkJCWJyZWFrOwpAQCAtMTc0LDcgKzE3MCw3IEBACiAJLyogVGhlIElSUCBpcyBjb21wbGV0ZWQgKi8KIAlwV2IzNVJ4LT5FUDN2bV9zdGF0ZSA9IFZNX0NPTVBMRVRFRDsKIAotCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSB8fCBwSHdEYXRhLT5Id1N0b3ApIC8qIE11c3QgYmUgaGVyZSwgb3IgUnhCdWZmZXJJZCBpcyBpbnZhbGlkICovCisJaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlKSAvKiBNdXN0IGJlIGhlcmUsIG9yIFJ4QnVmZmVySWQgaXMgaW52YWxpZCAqLwogCQlnb3RvIGVycm9yOwogCiAJaWYgKHBXYjM1UngtPnJ4X2hhbHQpCkBAIC0xODYsOSArMTgyLDcgQEAKIAogCS8qIFRoZSBVUkIgaXMgY29tcGxldGVkLCBjaGVjayB0aGUgcmVzdWx0ICovCiAJaWYgKHBXYjM1UngtPkVQM1ZNX3N0YXR1cyAhPSAwKSB7Ci0jaWZkZWYgX1BFX1VTQl9TVEFURV9EVU1QXwotCQlwcmludGsoIkVQMyBJb0NvbXBsZXRlUm91dGluZSByZXR1cm4gZXJyb3JcbiIpOwotI2VuZGlmCisJCXByX2RlYnVnKCJFUDMgSW9Db21wbGV0ZVJvdXRpbmUgcmV0dXJuIGVycm9yXG4iKTsKIAkJcFdiMzVSeC0+RVAzdm1fc3RhdGUgPSBWTV9TVE9QOwogCQlnb3RvIGVycm9yOwogCX0KQEAgLTIzOSw3ICsyMzMsNyBAQAogCXUzMgkJCVJ4QnVmZmVySWQ7CiAKIAkvKiBJc3N1aW5nIFVSQiAqLwotCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSB8fCBwSHdEYXRhLT5Id1N0b3ApCisJaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlKQogCQlnb3RvIGVycm9yOwogCiAJaWYgKHBXYjM1UngtPnJ4X2hhbHQpCkBAIC0yNDksOSArMjQzLDcgQEAKIAlSeEJ1ZmZlcklkID0gcFdiMzVSeC0+UnhCdWZmZXJJZDsKIAlpZiAoIXBXYjM1UngtPlJ4T3duZXJbUnhCdWZmZXJJZF0pIHsKIAkJLyogSXQncyBpbXBvc3NpYmxlIHRvIHJ1biBoZXJlLiAqLwotI2lmZGVmIF9QRV9SWF9EVU1QXwotCQlwcmludGsoIlJ4IGRyaXZlciBmaWZvIHVuYXZhaWxhYmxlXG4iKTsKLSNlbmRpZgorCQlwcl9kZWJ1ZygiUnggZHJpdmVyIGZpZm8gdW5hdmFpbGFibGVcbiIpOwogCQlnb3RvIGVycm9yOwogCX0KIApAQCAtMjY4LDggKzI2MCw4IEBACiAJfQogCXBSeEJ1ZmZlckFkZHJlc3MgPSBwV2IzNVJ4LT5wRFJ4OwogCi0JdXNiX2ZpbGxfYnVsa191cmIodXJiLCBwSHdEYXRhLT5XYlVzYi51ZGV2LAotCQkJICB1c2JfcmN2YnVsa3BpcGUocEh3RGF0YS0+V2JVc2IudWRldiwgMyksCisJdXNiX2ZpbGxfYnVsa191cmIodXJiLCBwSHdEYXRhLT51ZGV2LAorCQkJICB1c2JfcmN2YnVsa3BpcGUocEh3RGF0YS0+dWRldiwgMyksCiAJCQkgIHBSeEJ1ZmZlckFkZHJlc3MsIE1BWF9VU0JfUlhfQlVGRkVSLAogCQkJICBXYjM1UnhfQ29tcGxldGUsIGh3KTsKIApAQCAtMzM3LDkgKzMyOSw3IEBACiAJLyogQ2FuY2VsaW5nIHRoZSBJcnAgaWYgYWxyZWFkeSBzZW5kcyBpdCBvdXQuICovCiAJaWYgKHBXYjM1UngtPkVQM3ZtX3N0YXRlID09IFZNX1JVTk5JTkcpIHsKIAkJdXNiX3VubGlua191cmIocFdiMzVSeC0+UnhVcmIpOyAvKiBPbmx5IHVzZSB1bmxpbmssIGxldCBXYjM1UnhfZGVzdHJveSB0byBmcmVlIHRoZW0gKi8KLSNpZmRlZiBfUEVfUlhfRFVNUF8KLQkJcHJpbnRrKCJFUDMgUnggc3RvcFxuIik7Ci0jZW5kaWYKKwkJcHJfZGVidWcoIkVQMyBSeCBzdG9wXG4iKTsKIAl9CiB9CiAKQEAgLTM1NSw4ICszNDUsNiBAQAogCiAJaWYgKHBXYjM1UngtPlJ4VXJiKQogCQl1c2JfZnJlZV91cmIocFdiMzVSeC0+UnhVcmIpOwotI2lmZGVmIF9QRV9SWF9EVU1QXwotCXByaW50aygiV2IzNVJ4X2Rlc3Ryb3kgT0tcbiIpOwotI2VuZGlmCisJcHJfZGVidWcoIldiMzVSeF9kZXN0cm95IE9LXG4iKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJ4X2YuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyeF9mLmgKaW5kZXggOThhY2NlNS4uMWZkZjY1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJ4X2YuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cnhfZi5oCkBAIC0yLDcgKzIsNyBAQAogI2RlZmluZSBfX1dJTkJPTkRfV0IzNVJYX0ZfSAogCiAjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+Ci0jaW5jbHVkZSAid2JoYWxfcy5oIgorI2luY2x1ZGUgIndiaGFsLmgiCiAKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyBJbnRlcmZhY2UgZnVuY3Rpb24gZGVjbGFyZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXR4LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1dHguYwppbmRleCAyYTlkMDU1Li40NGZjM2ZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1dHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1dHguYwpAQCAtMTMsNyArMTMsNiBAQAogCiAjaW5jbHVkZSAid2IzNXR4X2YuaCIKICNpbmNsdWRlICJtZHNfZi5oIgotI2luY2x1ZGUgInN5c2RlZi5oIgogCiB1bnNpZ25lZCBjaGFyCiBXYjM1VHhfZ2V0X3R4X2J1ZmZlcihzdHJ1Y3QgaHdfZGF0YSAqIHBId0RhdGEsIHU4ICoqcEJ1ZmZlcikKQEAgLTQxLDcgKzQwLDcgQEAKIAlwV2IzNVR4LT5UeFNlbmRJbmRleCsrOwogCXBXYjM1VHgtPlR4U2VuZEluZGV4ICU9IE1BWF9VU0JfVFhfQlVGRkVSX05VTUJFUjsKIAotCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSB8fCBwSHdEYXRhLT5Id1N0b3ApIC8vIExldCBXYldsYW5IYWx0IHRvIGhhbmRsZSBzdXJwcmlzZSByZW1vdmUKKwlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUpIC8vIExldCBXYldsYW5IYWx0IHRvIGhhbmRsZSBzdXJwcmlzZSByZW1vdmUKIAkJZ290byBlcnJvcjsKIAogCWlmIChwV2IzNVR4LT50eF9oYWx0KQpAQCAtNzQsNyArNzMsNyBAQAogCXUzMgkJU2VuZEluZGV4OwogCiAKLQlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgfHwgcEh3RGF0YS0+SHdTdG9wKQorCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSkKIAkJZ290byBjbGVhbnVwOwogCiAJaWYgKHBXYjM1VHgtPnR4X2hhbHQpCkBAIC04OSw4ICs4OCw4IEBACiAJLy8KIAkvLyBJc3N1aW5nIFVSQgogCS8vCi0JdXNiX2ZpbGxfYnVsa191cmIocFVyYiwgcEh3RGF0YS0+V2JVc2IudWRldiwKLQkJCSAgdXNiX3NuZGJ1bGtwaXBlKHBId0RhdGEtPldiVXNiLnVkZXYsIDQpLAorCXVzYl9maWxsX2J1bGtfdXJiKHBVcmIsIHBId0RhdGEtPnVkZXYsCisJCQkgIHVzYl9zbmRidWxrcGlwZShwSHdEYXRhLT51ZGV2LCA0KSwKIAkJCSAgcFR4QnVmZmVyQWRkcmVzcywgcE1kcy0+VHhCdWZmZXJTaXplWyBTZW5kSW5kZXggXSwKIAkJCSAgV2IzNVR4X2NvbXBsZXRlLCBhZGFwdGVyKTsKIApAQCAtMTUzLDE2ICsxNTIsMTIgQEAKIAkvLyBUcnlpbmcgdG8gY2FuY2VsaW5nIHRoZSBUcnAgb2YgRVAyCiAJaWYgKHBXYjM1VHgtPkVQMnZtX3N0YXRlID09IFZNX1JVTk5JTkcpCiAJCXVzYl91bmxpbmtfdXJiKCBwV2IzNVR4LT5UeDJVcmIgKTsgLy8gT25seSB1c2UgdW5saW5rLCBsZXQgV2IzNVR4X2Rlc3Ryb3QgdG8gZnJlZSB0aGVtCi0JI2lmZGVmIF9QRV9UWF9EVU1QXwotCXByaW50aygiRVAyIFR4IHN0b3BcbiIpOwotCSNlbmRpZgorCXByX2RlYnVnKCJFUDIgVHggc3RvcFxuIik7CiAKIAkvLyBUcnlpbmcgdG8gY2FuY2VsaW5nIHRoZSBJcnAgb2YgRVA0CiAJaWYgKHBXYjM1VHgtPkVQNHZtX3N0YXRlID09IFZNX1JVTk5JTkcpCiAJCXVzYl91bmxpbmtfdXJiKCBwV2IzNVR4LT5UeDRVcmIgKTsgLy8gT25seSB1c2UgdW5saW5rLCBsZXQgV2IzNVR4X2Rlc3Ryb3QgdG8gZnJlZSB0aGVtCi0JI2lmZGVmIF9QRV9UWF9EVU1QXwotCXByaW50aygiRVA0IFR4IHN0b3BcbiIpOwotCSNlbmRpZgorCXByX2RlYnVnKCJFUDQgVHggc3RvcFxuIik7CiB9CiAKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0xODIsOSArMTc3LDcgQEAKIAlpZiAocFdiMzVUeC0+VHgyVXJiKQogCQl1c2JfZnJlZV91cmIoIHBXYjM1VHgtPlR4MlVyYiApOwogCi0JI2lmZGVmIF9QRV9UWF9EVU1QXwotCXByaW50aygiV2IzNVR4X2Rlc3Ryb3kgT0tcbiIpOwotCSNlbmRpZgorCXByX2RlYnVnKCJXYjM1VHhfZGVzdHJveSBPS1xuIik7CiB9CiAKIHZvaWQgV2IzNVR4X0N1cnJlbnRUaW1lKHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlciwgdTMyIFRpbWVDb3VudCkKQEAgLTIyMiw3ICsyMTUsNyBAQAogCXBXYjM1VHgtPkVQMlZNX3N0YXR1cyA9IHBVcmItPnN0YXR1czsKIAogCS8vIEZvciBMaW51eCAyLjQuIEludGVycnVwdCB3aWxsIGFsd2F5cyB0cmlnZ2VyCi0JaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlIHx8IHBId0RhdGEtPkh3U3RvcCkgLy8gTGV0IFdiV2xhbkhhbHQgdG8gaGFuZGxlIHN1cnByaXNlIHJlbW92ZQorCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSkgLy8gTGV0IFdiV2xhbkhhbHQgdG8gaGFuZGxlIHN1cnByaXNlIHJlbW92ZQogCQlnb3RvIGVycm9yOwogCiAJaWYgKHBXYjM1VHgtPnR4X2hhbHQpCkBAIC0yNjMsNyArMjU2LDcgQEAKIAl1MzIgKglwbHRtcCA9ICh1MzIgKilwV2IzNVR4LT5FUDJfYnVmOwogCWludAkJcmV0djsKIAotCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSB8fCBwSHdEYXRhLT5Id1N0b3ApCisJaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlKQogCQlnb3RvIGVycm9yOwogCiAJaWYgKHBXYjM1VHgtPnR4X2hhbHQpCkBAIC0yNzIsMTYgKzI2NSwxNCBAQAogCS8vCiAJLy8gSXNzdWluZyBVUkIKIAkvLwotCXVzYl9maWxsX2ludF91cmIoIHBVcmIsIHBId0RhdGEtPldiVXNiLnVkZXYsIHVzYl9yY3ZpbnRwaXBlKHBId0RhdGEtPldiVXNiLnVkZXYsMiksCisJdXNiX2ZpbGxfaW50X3VyYiggcFVyYiwgcEh3RGF0YS0+dWRldiwgdXNiX3JjdmludHBpcGUocEh3RGF0YS0+dWRldiwyKSwKIAkJCSAgcGx0bXAsIE1BWF9JTlRFUlJVUFRfTEVOR1RILCBXYjM1VHhfRVAyVk1fY29tcGxldGUsIGFkYXB0ZXIsIDMyKTsKIAogCXBXYjM1VHgtPkVQMnZtX3N0YXRlID0gVk1fUlVOTklORzsKIAlyZXR2ID0gdXNiX3N1Ym1pdF91cmIocFVyYiwgR0ZQX0FUT01JQyk7CiAKIAlpZiAocmV0diA8IDApIHsKLQkJI2lmZGVmIF9QRV9UWF9EVU1QXwotCQlwcmludGsoIkVQMiBUeCBJcnAgc2VuZGluZyBlcnJvclxuIik7Ci0JCSNlbmRpZgorCQlwcl9kZWJ1ZygiRVAyIFR4IElycCBzZW5kaW5nIGVycm9yXG4iKTsKIAkJZ290byBlcnJvcjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzV0eF9mLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1dHhfZi5oCmluZGV4IDFkM2I1MTUuLjAxOGZkMzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzV0eF9mLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXR4X2YuaApAQCAtMiw3ICsyLDYgQEAKICNkZWZpbmUgX19XSU5CT05EX1dCMzVUWF9GX0gKIAogI2luY2x1ZGUgImNvcmUuaCIKLSNpbmNsdWRlICJ3YmhhbF9mLmgiCiAKIC8qCiAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diaGFsX3MuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diaGFsLmgKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2JoYWxfcy5oCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmhhbC5oCmluZGV4IDgyMWExYjMuLjM5ZTg0YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diaGFsX3MuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmhhbC5oCkBAIC0zNDIsOSArMzQyLDYgQEAKIAl2b2lkCSpidWZmZXJfYWRkcmVzc1tNQVhfREVTQ1JJUFRPUl9CVUZGRVJfSU5ERVhdOwogfTsKIAotCi0jZGVmaW5lIERFRkFVTFRfTlVMTF9QQUNLRVRfQ09VTlQJMTgwMDAwCS8qIDE4MCBzZWNvbmRzICovCi0KICNkZWZpbmUgTUFYX1RYVkdBX0VFUFJPTQkJOQkvKiBIb3cgbWFueSB3b3JkKHUxNikgb2YgRUVQUk9NIHdpbGwgYmUgdXNlZCBmb3IgVHhWR0EgKi8KICNkZWZpbmUgTUFYX1JGX1BBUkFNRVRFUgkJMzIKIApAQCAtMzU5LDcgKzM1Niw2IEBACiAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KIAotI2luY2x1ZGUgIndidXNiX3MuaCIKICNpbmNsdWRlICJ3YjM1cmVnX3MuaCIKICNpbmNsdWRlICJ3YjM1dHhfcy5oIgogI2luY2x1ZGUgIndiMzVyeF9zLmgiCkBAIC00NDAsNyArNDM2LDcgQEAKIAkgKiBWYXJpYWJsZSBmb3IgZWFjaCBtb2R1bGUKIAkgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCSAqLwotCXN0cnVjdCB3Yl91c2IJCVdiVXNiOwkvKiBOZWVkIFdiVXNiLmggKi8KKwlzdHJ1Y3QgdXNiX2RldmljZQkqdWRldjsKIAlzdHJ1Y3Qgd2IzNV9yZWcJCXJlZzsJLyogTmVlZCBXYjM1UmVnLmggKi8KIAlzdHJ1Y3Qgd2IzNV90eAkJV2IzNVR4OyAvKiBOZWVkIFdiMzVUeC5oICovCiAJc3RydWN0IHdiMzVfcngJCVdiMzVSeDsgLyogTmVlZCBXYjM1UnguaCAqLwpAQCAtNTEwLDE2ICs1MDYsOCBAQAogCXUzMgkJUnhCeXRlQ291bnRMYXN0OwogCXUzMgkJVHhCeXRlQ291bnRMYXN0OwogCi0JYXRvbWljX3QJU3VycHJpc2VSZW1vdmVDb3VudDsKLQogCS8qIEZvciBnbG9iYWwgdGltZXIgKi8KIAl1MzIJCXRpbWVfY291bnQ7CS8qIFRJQ0tfVElNRV8xMDBtcyAxID0gMTAwbXMgKi8KLQotCS8qIEZvciBlcnJvciByZWNvdmVyICovCi0JdTMyCQlId1N0b3A7Ci0KLQkvKiBGb3IgYXZvaWQgQVAgZGlzY29ubmVjdCAqLwotCXUzMgkJTnVsbFBhY2tldENvdW50OwogfTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmhhbF9mLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmhhbF9mLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNzhjMTQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2JoYWxfZi5oCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogRGV2aWNlIHJlbGF0ZWQgaW5jbHVkZQotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotI2luY2x1ZGUgIndiMzVyZWdfZi5oIgotI2luY2x1ZGUgIndiMzV0eF9mLmgiCi0jaW5jbHVkZSAid2IzNXJ4X2YuaCIKLQotI2luY2x1ZGUgImNvcmUuaCIKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBGdW5jdGlvbiBkZWNsYXJhdGlvbgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLXZvaWQgaGFsX3JlbW92ZV9tYXBwaW5nX2tleShzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSwgdTggKm1hY19hZGRyKTsKLXZvaWQgaGFsX3JlbW92ZV9kZWZhdWx0X2tleShzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSwgdTMyIGluZGV4KTsKLXVuc2lnbmVkIGNoYXIgaGFsX3NldF9tYXBwaW5nX2tleShzdHJ1Y3QgaHdfZGF0YSAqYWRhcHRlciwgdTggKm1hY19hZGRyLAotCQkJCSAgdTggbnVsbF9rZXksIHU4IHdlcF9vbiwgdTggKnR4X3RzYywKLQkJCQkgIHU4ICpyeF90c2MsIHU4IGtleV90eXBlLCB1OCBrZXlfbGVuLAotCQkJCSAgdTggKmtleV9kYXRhKTsKLXVuc2lnbmVkIGNoYXIgaGFsX3NldF9kZWZhdWx0X2tleShzdHJ1Y3QgaHdfZGF0YSAqYWRhcHRlciwgdTggaW5kZXgsCi0JCQkJICB1OCBudWxsX2tleSwgdTggd2VwX29uLCB1OCAqdHhfdHNjLAotCQkJCSAgdTggKnJ4X3RzYywgdTgga2V5X3R5cGUsIHU4IGtleV9sZW4sCi0JCQkJICB1OCAqa2V5X2RhdGEpOwotdm9pZCBoYWxfY2xlYXJfYWxsX2RlZmF1bHRfa2V5KHN0cnVjdCBod19kYXRhICpod19kYXRhKTsKLXZvaWQgaGFsX2NsZWFyX2FsbF9ncm91cF9rZXkoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEpOwotdm9pZCBoYWxfY2xlYXJfYWxsX21hcHBpbmdfa2V5KHN0cnVjdCBod19kYXRhICpod19kYXRhKTsKLXZvaWQgaGFsX2NsZWFyX2FsbF9rZXkoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEpOwotdm9pZCBoYWxfc2V0X3Bvd2VyX3NhdmVfbW9kZShzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSwgdW5zaWduZWQgY2hhciBwb3dlcl9zYXZlLAotCQkJICAgICB1bnNpZ25lZCBjaGFyIHdha2V1cCwgdW5zaWduZWQgY2hhciBkdGltKTsKLXZvaWQgaGFsX2dldF9wb3dlcl9zYXZlX21vZGUoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEsIHU4ICppbl9wd3Jfc2F2ZSk7Ci12b2lkIGhhbF9zZXRfc2xvdF90aW1lKHN0cnVjdCBod19kYXRhICpod19kYXRhLCB1OCB0eXBlKTsKLQotI2RlZmluZSBoYWxfc2V0X2F0aW1fd2luZG93KF9BLCBfQVRNKQotCi12b2lkIGhhbF9zdGFydF9ic3Moc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEsIHU4IG1hY19vcF9tb2RlKTsKLQotLyogMDpCU1MgU1RBIDE6SUJTUyBTVEEgKi8KLXZvaWQgaGFsX2pvaW5fcmVxdWVzdChzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSwgdTggYnNzX3R5cGUpOwotCi12b2lkIGhhbF9zdG9wX3N5bmNfYnNzKHN0cnVjdCBod19kYXRhICpod19kYXRhKTsKLXZvaWQgaGFsX3Jlc3VtZV9zeW5jX2JzcyhzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSk7Ci12b2lkIGhhbF9zZXRfYWlkKHN0cnVjdCBod19kYXRhICpod19kYXRhLCB1MTYgYWlkKTsKLXZvaWQgaGFsX3NldF9ic3NpZChzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSwgdTggKmJzc2lkKTsKLXZvaWQgaGFsX2dldF9ic3NpZChzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSwgdTggKmJzc2lkKTsKLXZvaWQgaGFsX3NldF9saXN0ZW5faW50ZXJ2YWwoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEsIHUxNiBsaXN0ZW5faW50ZXJ2YWwpOwotdm9pZCBoYWxfc2V0X2NhcF9pbmZvKHN0cnVjdCBod19kYXRhICpod19kYXRhLCB1MTYgY2FwYWJpbGl0eV9pbmZvKTsKLXZvaWQgaGFsX3NldF9zc2lkKHN0cnVjdCBod19kYXRhICpod19kYXRhLCB1OCAqc3NpZCwgdTggc3NpZF9sZW4pOwotdm9pZCBoYWxfc3RhcnRfdHgwKHN0cnVjdCBod19kYXRhICpod19kYXRhKTsKLQotI2RlZmluZSBoYWxfZ2V0X2N3bWluKF9BKQkoKF9BKS0+Y3dtaW4pCi0KLXZvaWQgaGFsX3NldF9jd21heChzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSwgdTE2IGN3aW5fbWF4KTsKLQotI2RlZmluZSBoYWxfZ2V0X2N3bWF4KF9BKQkoKF9BKS0+Y3dtYXgpCi0KLXZvaWQgaGFsX3NldF9yc25fd3BhKHN0cnVjdCBod19kYXRhICpod19kYXRhLCB1MzIgKnJzbl9pZV9iaXRtYXAsCi0JCSAgICAgdTMyICpyc25fb3VpX3R5cGUgLCB1bnNpZ25lZCBjaGFyIGRlc2lyZWRfYXV0aF9tb2RlKTsKLXZvaWQgaGFsX3NldF9jb25uZWN0X2luZm8oc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEsIHVuc2lnbmVkIGNoYXIgYm9fY29ubmVjdCk7Ci11OCBoYWxfZ2V0X2VzdF9zcTMoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEsIHU4IGNvdW50KTsKLXZvaWQgaGFsX2Rlc2NyaXB0b3JfaW5kaWNhdGUoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEsCi0JCQkgICAgIHN0cnVjdCB3YjM1X2Rlc2NyaXB0b3IgKmRlcyk7Ci11OCBoYWxfZ2V0X2FudGVubmFfbnVtYmVyKHN0cnVjdCBod19kYXRhICpod19kYXRhKTsKLXUzMiBoYWxfZ2V0X2Jzc19wa19jbnQoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEpOwotCi0jZGVmaW5lIGhhbF9nZXRfcmVnaW9uX2Zyb21fRUVQUk9NKF9BKQkoKF9BKS0+cmVnLkVFUFJPTVJlZ2lvbikKLSNkZWZpbmUgaGFsX2dldF90eF9idWZmZXIoX0EsIF9CKQlXYjM1VHhfZ2V0X3R4X2J1ZmZlcihfQSwgX0IpCi0jZGVmaW5lIGhhbF9zb2Z0d2FyZV9zZXQoX0EpCQkoX0EtPlNvZnR3YXJlU2V0KQotI2RlZmluZSBoYWxfZHJpdmVyX2luaXRfT0soX0EpCQkoX0EtPklzSW5pdE9LKQotI2RlZmluZSBoYWxfcnNzaV9ib3VuZGFyeV9oaWdoKF9BKQkoX0EtPlJTU0lfaGlnaCkKLSNkZWZpbmUgaGFsX3Jzc2lfYm91bmRhcnlfbG93KF9BKQkoX0EtPlJTU0lfbG93KQotI2RlZmluZSBoYWxfc2Nhbl9pbnRlcnZhbChfQSkJCShfQS0+U2Nhbl9JbnRlcnZhbCkKLQotI2RlZmluZSBQSFlfREVCVUcobXNnLCBhcmdzLi4uKQotCi0vKiByZXR1cm4gMTAwbXMgY291bnQgKi8KLSNkZWZpbmUgaGFsX2dldF90aW1lX2NvdW50KF9QKQkJKF9QLT50aW1lX2NvdW50IC8gMTApCi0jZGVmaW5lIGhhbF9kZXRlY3RfZXJyb3IoX1ApCQkoX1AtPldiVXNiLkRldGVjdENvdW50KQotCi0jZGVmaW5lIGhhbF9pYnNzX2Rpc2Nvbm5lY3QoX0EpCQkoaGFsX3N0b3Bfc3luY19ic3MoX0EpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2JsaW51eF9mLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmxpbnV4X2YuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE5ZDIxNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmxpbnV4X2YuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSNpZm5kZWYgX19XQkxJTlVYX0ZfSAotI2RlZmluZSBfX1dCTElOVVhfRl9ICi0KLSNpbmNsdWRlICJjb3JlLmgiCi0jaW5jbHVkZSAibWRzX3MuaCIKLQotLyoKLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwNCBXaW5ib25kIEVsZWN0cm9uaWMgQ29ycG9yYXRpb24KLSAqCi0gKiB3YmxpbnV4X2YuaAotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotaW50IHdiMzVfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKLXZvaWQgd2IzNV9zZXRfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOwotc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKndiMzVfbmV0ZGV2X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YnVzYi5jIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2J1c2IuYwppbmRleCAzZjYwY2Y3Li4yMTYzZDYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YnVzYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3didXNiLmMKQEAgLTE0LDEwICsxNCwxMSBAQAogCiAjaW5jbHVkZSAiY29yZS5oIgogI2luY2x1ZGUgIm1kc19mLmgiCi0jaW5jbHVkZSAibWxtZXR4cnhfZi5oIgogI2luY2x1ZGUgIm10by5oIgotI2luY2x1ZGUgIndiaGFsX2YuaCIKLSNpbmNsdWRlICJ3YmxpbnV4X2YuaCIKKyNpbmNsdWRlICJ3YmhhbC5oIgorI2luY2x1ZGUgIndiMzVyZWdfZi5oIgorI2luY2x1ZGUgIndiMzV0eF9mLmgiCisjaW5jbHVkZSAid2IzNXJ4X2YuaCIKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJJUzg5QzM1IDgwMi4xMWJnIFdMQU4gVVNCIERyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpAQCAtMTgxLDEwICsxODIsNyBAQAogCVJGU3ludGhlc2l6ZXJfU3dpdGNoaW5nQ2hhbm5lbChwSHdEYXRhLCBjaGFubmVsKTsgLyogU3dpdGNoIGNoYW5uZWwgKi8KIAlwSHdEYXRhLT5DaGFubmVsID0gY2hhbm5lbC5DaGFuTm87CiAJcEh3RGF0YS0+YmFuZCA9IGNoYW5uZWwuYmFuZDsKLSNpZmRlZiBfUEVfU1RBVEVfRFVNUF8KLQlwcmludGsoIlNldCBjaGFubmVsIGlzICVkLCBiYW5kID0lZFxuIiwgcEh3RGF0YS0+Q2hhbm5lbCwKLQkgICAgICAgcEh3RGF0YS0+YmFuZCk7Ci0jZW5kaWYKKwlwcl9kZWJ1ZygiU2V0IGNoYW5uZWwgaXMgJWQsIGJhbmQgPSVkXG4iLCBwSHdEYXRhLT5DaGFubmVsLCBwSHdEYXRhLT5iYW5kKTsKIAlyZWctPk0yOF9NYWNDb250cm9sICY9IH4weGZmOwkvKiBDbGVhbiBjaGFubmVsIGluZm9ybWF0aW9uIGZpZWxkICovCiAJcmVnLT5NMjhfTWFjQ29udHJvbCB8PSBjaGFubmVsLkNoYW5ObzsKIAlXYjM1UmVnX1dyaXRlV2l0aENhbGxiYWNrVmFsdWUocEh3RGF0YSwgMHgwODI4LCByZWctPk0yOF9NYWNDb250cm9sLApAQCAtMzM5LDEwICszMzcsOCBAQAogc3RhdGljIHVuc2lnbmVkIGNoYXIgaGFsX2lkbGUoc3RydWN0IGh3X2RhdGEgKnBId0RhdGEpCiB7CiAJc3RydWN0IHdiMzVfcmVnICpyZWcgPSAmcEh3RGF0YS0+cmVnOwotCXN0cnVjdCB3Yl91c2IgKnBXYlVzYiA9ICZwSHdEYXRhLT5XYlVzYjsKIAotCWlmICghcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUKLQkgICAgJiYgKHBXYlVzYi0+RGV0ZWN0Q291bnQgfHwgcmVnLT5FUDB2bV9zdGF0ZSAhPSBWTV9TVE9QKSkKKwlpZiAoIXBId0RhdGEtPlN1cnByaXNlUmVtb3ZlICYmIHJlZy0+RVAwdm1fc3RhdGUgIT0gVk1fU1RPUCkKIAkJcmV0dXJuIGZhbHNlOwogCiAJcmV0dXJuIHRydWU7CkBAIC02MDgsMTUgKzYwNCw2IEBACiAJCQl9CiAJCQlicmVhazsKIAkJfQotCi0JCS8qIEFjdGl2ZSBzZW5kIG51bGwgcGFja2V0IHRvIGF2b2lkIEFQIGRpc2Nvbm5lY3QgKi8KLQkJaWYgKHBId0RhdGEtPkxFRF9MaW5rT24pIHsKLQkJCXBId0RhdGEtPk51bGxQYWNrZXRDb3VudCArPSBUaW1lSW50ZXJ2YWw7Ci0JCQlpZiAocEh3RGF0YS0+TnVsbFBhY2tldENvdW50ID49Ci0JCQkgICAgREVGQVVMVF9OVUxMX1BBQ0tFVF9DT1VOVCkgewotCQkJCXBId0RhdGEtPk51bGxQYWNrZXRDb3VudCA9IDA7Ci0JCQl9Ci0JCX0KIAl9CiAKIAlwSHdEYXRhLT50aW1lX2NvdW50ICs9IFRpbWVJbnRlcnZhbDsKQEAgLTY1MSwxMyArNjM4LDYgQEAKIAogCVNvZnR3YXJlU2V0ID0gaGFsX3NvZnR3YXJlX3NldChwSHdEYXRhKTsKIAotI2lmZGVmIFZlbmRvcjIKLQkvKiBUcnkgdG8gbWFrZSBzdXJlIHRoZSBFRVBST00gY29udGFpbiAqLwotCVNvZnR3YXJlU2V0ID4+PSA4OwotCWlmIChTb2Z0d2FyZVNldCAhPSAweDgyKQotCQlyZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLQogCVdiMzVSeF9zdGFydChodyk7CiAJV2IzNVR4X0VQMlZNX3N0YXJ0KHByaXYpOwogCkBAIC03MzQsOSArNzE0LDcgQEAKIAl9CiAKIAlwcml2LT5zTG9jYWxQYXJhLmJBbnRlbm5hTm8gPSBoYWxfZ2V0X2FudGVubmFfbnVtYmVyKHBId0RhdGEpOwotI2lmZGVmIF9QRV9TVEFURV9EVU1QXwotCXByaW50aygiRHJpdmVyIGluaXQsIGFudGVubmEgbm8gPSAlZFxuIiwgcHNMT0NBTC0+YkFudGVubmFObyk7Ci0jZW5kaWYKKwlwcl9kZWJ1ZygiRHJpdmVyIGluaXQsIGFudGVubmEgbm8gPSAlZFxuIiwgcHJpdi0+c0xvY2FsUGFyYS5iQW50ZW5uYU5vKTsKIAloYWxfZ2V0X2h3X3JhZGlvX29mZihwSHdEYXRhKTsKIAogCS8qIFdhaXRpbmcgZm9yIEhBTCBzZXR0aW5nIE9LICovCkBAIC03NjksNyArNzQ3LDYgQEAKIAlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppbnRlcmZhY2U7CiAJc3RydWN0IGllZWU4MDIxMV9odyAqZGV2OwogCXN0cnVjdCB3YnNvZnRfcHJpdiAqcHJpdjsKLQlzdHJ1Y3Qgd2JfdXNiICpwV2JVc2I7CiAJaW50IG5yLCBlcnI7CiAJdTMyIGx0bXA7CiAKQEAgLTgwMCwxNiArNzc3LDEzIEBACiAKIAlwcml2ID0gZGV2LT5wcml2OwogCi0JcFdiVXNiID0gJnByaXYtPnNId0RhdGEuV2JVc2I7Ci0JcFdiVXNiLT51ZGV2ID0gdWRldjsKKwlwcml2LT5zSHdEYXRhLnVkZXYgPSB1ZGV2OwogCiAJaW50ZXJmYWNlID0gaW50Zi0+Y3VyX2FsdHNldHRpbmc7CiAJZW5kcG9pbnQgPSAmaW50ZXJmYWNlLT5lbmRwb2ludFswXS5kZXNjOwogCi0JaWYgKGVuZHBvaW50WzJdLndNYXhQYWNrZXRTaXplID09IDUxMikgeworCWlmIChlbmRwb2ludFsyXS53TWF4UGFja2V0U2l6ZSA9PSA1MTIpCiAJCXByaW50aygiW3czNXVuZF0gV29ya2luZyBvbiBVU0IgMi4wXG4iKTsKLQkJcFdiVXNiLT5Jc1VzYjIwID0gMTsKLQl9CiAKIAllcnIgPSB3YjM1X2h3X2luaXQoZGV2KTsKIAlpZiAoZXJyKQpAQCAtODYwLDEzICs4MzQsOSBAQAogCiBzdGF0aWMgdm9pZCB3YjM1X2h3X2hhbHQoc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyKQogewotCU1kc19EZXN0cm95KGFkYXB0ZXIpOwotCiAJLyogVHVybiBvZmYgUnggYW5kIFR4IGhhcmR3YXJlIGFiaWxpdHkgKi8KIAloYWxfc3RvcCgmYWRhcHRlci0+c0h3RGF0YSk7Ci0jaWZkZWYgX1BFX1VTQl9JTklfRFVNUF8KLQlwcmludGsoIlt3MzV1bmRdIEhhbF9zdG9wIE8uSy5cbiIpOwotI2VuZGlmCisJcHJfZGVidWcoIlt3MzV1bmRdIEhhbF9zdG9wIE8uSy5cbiIpOwogCS8qIFdhaXRpbmcgSXJwIGNvbXBsZXRlZCAqLwogCW1zbGVlcCgxMDApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YnVzYl9zLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YnVzYl9zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NjFhZTUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2J1c2Jfcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwNCBXaW5ib25kIEVsZWN0cm9uaWMgQ29ycG9yYXRpb24KLSAqCi0gKiAgTW9kdWxlIE5hbWU6Ci0gKiAgICB3YnVzYl9zLmgKLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi0jaWZuZGVmIF9fV0lOQk9ORF9XQlVTQl9TX0gKLSNkZWZpbmUgX19XSU5CT05EX1dCVVNCX1NfSAotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLQotc3RydWN0IHdiX3VzYiB7Ci0JdTMyCUlzVXNiMjA7Ci0Jc3RydWN0CXVzYl9kZXZpY2UgKnVkZXY7Ci0JdTMyCURldGVjdENvdW50OwotfTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfcGNpLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9wY2kuYwppbmRleCAwMjBiMTdhLi4yOGFlOWRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9wY2kuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9wY2kuYwpAQCAtNDU4LDcgKzQ1OCw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilwY2lfZ2V0X2RydmRhdGEoIHBkZXYgKTsKKyAgICBkZXYgPSBwY2lfZ2V0X2RydmRhdGEoIHBkZXYgKTsKICAgICBpZiggZGV2ID09IE5VTEwgKSB7CiAgICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIkNvdWxkIG5vdCByZXRyaWV2ZSBuZXRfZGV2aWNlIHN0cnVjdHVyZVxuIiApOwogICAgICAgICByZXR1cm47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9wcm9maWxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9wcm9maWxlLmMKaW5kZXggN2ExMzM3ZC4uYTQ1OWU0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfcHJvZmlsZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3Byb2ZpbGUuYwpAQCAtMjQ4LDcgKzI0OCw3IEBACiAJCX0gZWxzZSB7CiAJCQlEQkdfVFJBQ0UoRGJnSW5mbywgIkYvVyBpbWFnZSBmaWxlIGZvdW5kXG4iKTsKICNkZWZpbmUgREhGX0FMTE9DX1NJWkUgOTYwMDAJCQkvKiBqdXN0IGJlbG93IDk2SywgbGV0J3MgaG9wZSBpdCBzdWZmaWNlcyBmb3Igbm93IGFuZCBmb3IgdGhlIGZ1dHVyZSAqLwotCQkJY3AgPSAoY2hhciAqKXZtYWxsb2MoREhGX0FMTE9DX1NJWkUpOworCQkJY3AgPSB2bWFsbG9jKERIRl9BTExPQ19TSVpFKTsKIAkJCWlmIChjcCA9PSBOVUxMKSB7CiAJCQkJREJHX0VSUk9SKERiZ0luZm8sICJlcnJvciBpbiB2bWFsbG9jXG4iKTsKIAkJCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9zeXNmcy5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfc3lzZnMuYwppbmRleCBlNGM4ODA0Li45YjgzM2IzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9zeXNmcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3N5c2ZzLmMKQEAgLTQyLDcgKzQyLDcgQEAKICAgICBDRkdfSEVSTUVTX1RBTExJRVNfU1RSQ1QgdGFsbGllczsKICAgICBzc2l6ZV90IHJldCA9IC1FSU5WQUw7CiAKLSAgICByZWFkX2xvY2soJmRldl9iYXNlX2xvY2spOworICAgIHJjdV9yZWFkX2xvY2soKTsKICAgICBpZiAoZGV2X2lzYWxpdmUoZGV2KSkgewogCXdsX2xvY2sobHAsICZmbGFncyk7CiAKQEAgLTEwMiw3ICsxMDIsNyBAQAogCSAgICB9CiAgICAgfQogCi0gICAgcmVhZF91bmxvY2soJmRldl9iYXNlX2xvY2spOworICAgIHJjdV9yZWFkX3VubG9jaygpOwogICAgIHJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMWNvbnYuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMWNvbnYuYwppbmRleCA4Mzg3OWY5Li4xNDZmMzY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFjb252LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExY29udi5jCkBAIC0xNDgsNyArMTQ4LDggQEAKIAogCQkJLyogdGFjayBvbiBTTkFQICovCiAJCQllX3NuYXAgPQotCQkJICAgIChzdHJ1Y3Qgd2xhbl9zbmFwICopIHNrYl9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCB3bGFuX3NuYXApKTsKKwkJCSAgICAoc3RydWN0IHdsYW5fc25hcCAqKSBza2JfcHVzaChza2IsCisJCQkJc2l6ZW9mKHN0cnVjdCB3bGFuX3NuYXApKTsKIAkJCWVfc25hcC0+dHlwZSA9IGh0b25zKHByb3RvKTsKIAkJCWlmIChldGhjb252ID09IFdMQU5fRVRIQ09OVl84MDIxaAogCQkJICAgICYmIHA4MDIxMV9zdHRfZmluZHByb3RvKHByb3RvKSkgewpAQCAtMTYxLDcgKzE2Miw4IEBACiAKIAkJCS8qIHRhY2sgb24gbGxjICovCiAJCQllX2xsYyA9Ci0JCQkgICAgKHN0cnVjdCB3bGFuX2xsYyAqKSBza2JfcHVzaChza2IsIHNpemVvZihzdHJ1Y3Qgd2xhbl9sbGMpKTsKKwkJCSAgICAoc3RydWN0IHdsYW5fbGxjICopIHNrYl9wdXNoKHNrYiwKKwkJCQlzaXplb2Yoc3RydWN0IHdsYW5fbGxjKSk7CiAJCQllX2xsYy0+ZHNhcCA9IDB4QUE7CS8qIFNOQVAsIHNlZSBJRUVFIDgwMiAqLwogCQkJZV9sbGMtPnNzYXAgPSAweEFBOwogCQkJZV9sbGMtPmN0bCA9IDB4MDM7CkBAIC0yOTcsMTAgKzI5OSwxMiBAQAogCWlmICgoV0xBTl9HRVRfRkNfVE9EUyhmYykgPT0gMCkgJiYgKFdMQU5fR0VUX0ZDX0ZST01EUyhmYykgPT0gMCkpIHsKIAkJbWVtY3B5KGRhZGRyLCB3X2hkci0+YTMuYTEsIFdMQU5fRVRIQUREUl9MRU4pOwogCQltZW1jcHkoc2FkZHIsIHdfaGRyLT5hMy5hMiwgV0xBTl9FVEhBRERSX0xFTik7Ci0JfSBlbHNlIGlmICgoV0xBTl9HRVRfRkNfVE9EUyhmYykgPT0gMCkgJiYgKFdMQU5fR0VUX0ZDX0ZST01EUyhmYykgPT0gMSkpIHsKKwl9IGVsc2UgaWYgKChXTEFOX0dFVF9GQ19UT0RTKGZjKSA9PSAwKQorCQkJJiYgKFdMQU5fR0VUX0ZDX0ZST01EUyhmYykgPT0gMSkpIHsKIAkJbWVtY3B5KGRhZGRyLCB3X2hkci0+YTMuYTEsIFdMQU5fRVRIQUREUl9MRU4pOwogCQltZW1jcHkoc2FkZHIsIHdfaGRyLT5hMy5hMywgV0xBTl9FVEhBRERSX0xFTik7Ci0JfSBlbHNlIGlmICgoV0xBTl9HRVRfRkNfVE9EUyhmYykgPT0gMSkgJiYgKFdMQU5fR0VUX0ZDX0ZST01EUyhmYykgPT0gMCkpIHsKKwl9IGVsc2UgaWYgKChXTEFOX0dFVF9GQ19UT0RTKGZjKSA9PSAxKQorCQkJJiYgKFdMQU5fR0VUX0ZDX0ZST01EUyhmYykgPT0gMCkpIHsKIAkJbWVtY3B5KGRhZGRyLCB3X2hkci0+YTMuYTMsIFdMQU5fRVRIQUREUl9MRU4pOwogCQltZW1jcHkoc2FkZHIsIHdfaGRyLT5hMy5hMiwgV0xBTl9FVEhBRERSX0xFTik7CiAJfSBlbHNlIHsKQEAgLTM0OSw3ICszNTMsOCBAQAogCiAJZV9sbGMgPSAoc3RydWN0IHdsYW5fbGxjICopIChza2ItPmRhdGEgKyBwYXlsb2FkX29mZnNldCk7CiAJZV9zbmFwID0KLQkgICAgKHN0cnVjdCB3bGFuX3NuYXAgKikgKHNrYi0+ZGF0YSArIHBheWxvYWRfb2Zmc2V0ICsgc2l6ZW9mKHN0cnVjdCB3bGFuX2xsYykpOworCSAgICAoc3RydWN0IHdsYW5fc25hcCAqKSAoc2tiLT5kYXRhICsgcGF5bG9hZF9vZmZzZXQgKworCQlzaXplb2Yoc3RydWN0IHdsYW5fbGxjKSk7CiAKIAkvKiBUZXN0IGZvciB0aGUgdmFyaW91cyBlbmNvZGluZ3MgKi8KIAlpZiAoKHBheWxvYWRfbGVuZ3RoID49IHNpemVvZihzdHJ1Y3Qgd2xhbl9ldGhoZHIpKSAmJgpAQCAtMzcyLDkgKzM3NywxMSBAQAogCQkvKiBjaG9wIG9mZiB0aGUgODAyLjExIENSQyAqLwogCQlza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gV0xBTl9DUkNfTEVOKTsKIAotCX0gZWxzZSBpZiAoKHBheWxvYWRfbGVuZ3RoID49IHNpemVvZihzdHJ1Y3Qgd2xhbl9sbGMpICsgc2l6ZW9mKHN0cnVjdCB3bGFuX3NuYXApKQotCQkgICAmJiAoZV9sbGMtPmRzYXAgPT0gMHhhYSkgJiYgKGVfbGxjLT5zc2FwID09IDB4YWEpCi0JCSAgICYmIChlX2xsYy0+Y3RsID09IDB4MDMpCisJfSBlbHNlIGlmICgocGF5bG9hZF9sZW5ndGggPj0gc2l6ZW9mKHN0cnVjdCB3bGFuX2xsYykgKworCQlzaXplb2Yoc3RydWN0IHdsYW5fc25hcCkpCisJCSYmKGVfbGxjLT5kc2FwID09IDB4YWEpCisJCSYmIChlX2xsYy0+c3NhcCA9PSAweGFhKQorCQkmJiAoZV9sbGMtPmN0bCA9PSAweDAzKQogCQkgICAmJgogCQkgICAoKChtZW1jbXAoZV9zbmFwLT5vdWksIG91aV9yZmMxMDQyLCBXTEFOX0lFRUVfT1VJX0xFTikgPT0gMCkKIAkJICAgICAmJiAoZXRoY29udiA9PSBXTEFOX0VUSENPTlZfODAyMWgpCkBAIC00MDYsMjEgKzQxMywyNSBAQAogCQkvKiBjaG9wIG9mZiB0aGUgODAyLjExIENSQyAqLwogCQlza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gV0xBTl9DUkNfTEVOKTsKIAotCX0gZWxzZSBpZiAoKHBheWxvYWRfbGVuZ3RoID49IHNpemVvZihzdHJ1Y3Qgd2xhbl9sbGMpICsgc2l6ZW9mKHN0cnVjdCB3bGFuX3NuYXApKQotCQkgICAmJiAoZV9sbGMtPmRzYXAgPT0gMHhhYSkgJiYgKGVfbGxjLT5zc2FwID09IDB4YWEpCi0JCSAgICYmIChlX2xsYy0+Y3RsID09IDB4MDMpKSB7CisJfSBlbHNlIGlmICgocGF5bG9hZF9sZW5ndGggPj0gc2l6ZW9mKHN0cnVjdCB3bGFuX2xsYykgKworCQlzaXplb2Yoc3RydWN0IHdsYW5fc25hcCkpCisJCSYmKGVfbGxjLT5kc2FwID09IDB4YWEpCisJCSYmIChlX2xsYy0+c3NhcCA9PSAweGFhKQorCQkmJiAoZV9sbGMtPmN0bCA9PSAweDAzKSkgewogCQlwcl9kZWJ1ZygiODAyLjFoL1JGQzEwNDIgbGVuOiAlZFxuIiwgcGF5bG9hZF9sZW5ndGgpOwotCQkvKiBpdCdzIGFuIDgwMi4xaCBmcmFtZSB8fCAoYW4gUkZDMTA0MiAmJiBwcm90b2NvbCBpcyBub3QgaW4gU1RUKSAqLwotCQkvKiBidWlsZCBhIERJWElJICsgUkZDODk0ICovCisJCS8qIGl0J3MgYW4gODAyLjFoIGZyYW1lIHx8IChhbiBSRkMxMDQyICYmIHByb3RvY29sIG5vdCBpbiBTVFQpCisJCSAgIGJ1aWxkIGEgRElYSUkgKyBSRkM4OTQgKi8KIAogCQkvKiBUZXN0IGZvciBhbiBvdmVybGVuZ3RoIGZyYW1lICovCi0JCWlmICgocGF5bG9hZF9sZW5ndGggLSBzaXplb2Yoc3RydWN0IHdsYW5fbGxjKSAtIHNpemVvZihzdHJ1Y3Qgd2xhbl9zbmFwKSkKLQkJICAgID4gbmV0ZGV2LT5tdHUpIHsKKwkJaWYgKChwYXlsb2FkX2xlbmd0aCAtIHNpemVvZihzdHJ1Y3Qgd2xhbl9sbGMpIC0KKwkJCXNpemVvZihzdHJ1Y3Qgd2xhbl9zbmFwKSkKKwkJCT4gbmV0ZGV2LT5tdHUpIHsKIAkJCS8qIEEgYm9ndXMgbGVuZ3RoIGV0aGZybSBoYXMgYmVlbiBzZW50LiAqLwogCQkJLyogSXMgc29tZW9uZSB0cnlpbmcgYW4gb2Zsb3cgYXR0YWNrPyAqLwogCQkJcHJpbnRrKEtFUk5fRVJSICJESVhJSSBmcmFtZSB0b28gbGFyZ2UgKCVsZCA+ICVkKVxuIiwKLQkJCSAgICAgICAobG9uZyBpbnQpKHBheWxvYWRfbGVuZ3RoIC0gc2l6ZW9mKHN0cnVjdCB3bGFuX2xsYykgLQotCQkJCQkgIHNpemVvZihzdHJ1Y3Qgd2xhbl9zbmFwKSksIG5ldGRldi0+bXR1KTsKKwkJCSAgICAgICAobG9uZyBpbnQpKHBheWxvYWRfbGVuZ3RoIC0KKwkJCQkJc2l6ZW9mKHN0cnVjdCB3bGFuX2xsYykgLQorCQkJCQlzaXplb2Yoc3RydWN0IHdsYW5fc25hcCkpLCBuZXRkZXYtPm10dSk7CiAJCQlyZXR1cm4gMTsKIAkJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFjb252LmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFjb252LmgKaW5kZXggZWNhMDM5MS4uZWE0OTNhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExY29udi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMWNvbnYuaApAQCAtNjYsMTIgKzY2LDE0IEBACiAjZGVmaW5lCVA4MDIxMV9GUk1NRVRBX01BR0lDCTB4ODAyMTEwCiAKICNkZWZpbmUgUDgwMjExU0tCX0ZSTU1FVEEocykgXAotCSgoKCgoc3RydWN0IHA4MDIxMV9mcm1tZXRhICopKChzKS0+Y2IpKS0+bWFnaWMpID09IFA4MDIxMV9GUk1NRVRBX01BR0lDKSA/IFwKKwkoKCgoKHN0cnVjdCBwODAyMTFfZnJtbWV0YSAqKSgocyktPmNiKSktPm1hZ2ljKSA9PSBcCisJCVA4MDIxMV9GUk1NRVRBX01BR0lDKSA/IFwKIAkJKChzdHJ1Y3QgcDgwMjExX2ZybW1ldGEgKikoKHMpLT5jYikpIDogXAogCQkoTlVMTCkpCiAKICNkZWZpbmUgUDgwMjExU0tCX1JYTUVUQShzKSBcCi0JKFA4MDIxMVNLQl9GUk1NRVRBKChzKSkgPyAgUDgwMjExU0tCX0ZSTU1FVEEoKHMpKS0+cnggOiAoKHN0cnVjdCBwODAyMTFfcnhtZXRhICopKE5VTEwpKSkKKwkoUDgwMjExU0tCX0ZSTU1FVEEoKHMpKSA/ICBQODAyMTFTS0JfRlJNTUVUQSgocykpLT5yeCA6IFwKKwkJKChzdHJ1Y3QgcDgwMjExX3J4bWV0YSAqKShOVUxMKSkpCiAKIHN0cnVjdCBwODAyMTFfcnhtZXRhIHsKIAlzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW5ldGRldi5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbmV0ZGV2LmMKaW5kZXggYjdiNGE3My4uYjBhZjI5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbmV0ZGV2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbmV0ZGV2LmMKQEAgLTMwMSw3ICszMDEsOCBAQAogCQkJCQlpZiAobWVtY21wCiAJCQkJCSAgICAoaGRyLT5hMSwgd2xhbmRldi0+bmV0ZGV2LT5kZXZfYWRkciwKIAkJCQkJICAgICBFVEhfQUxFTikgIT0gMCkgewotCQkJCQkJLyogYnV0IHJlamVjdCBhbnl0aGluZyBlbHNlIHRoYXQgaXNuJ3QgbXVsdGljYXN0ICovCisJCQkJCQkvKiBidXQgcmVqZWN0IGFueXRoaW5nIGVsc2UgdGhhdAorCQkJCQkJICAgaXNuJ3QgbXVsdGljYXN0ICovCiAJCQkJCQlpZiAoIShoZHItPmExWzBdICYgMHgwMSkpIHsKIAkJCQkJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAJCQkJCQkJY29udGludWU7CkBAIC03NzAsNyArNzcxLDggQEAKIAl9CiAKIAkvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgc3RydWN0IGRldmljZSAqLwotCW5ldGRldiA9IGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IHdpcmVsZXNzX2RldiksICJ3bGFuJWQiLCBldGhlcl9zZXR1cCk7CisJbmV0ZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3Qgd2lyZWxlc3NfZGV2KSwgIndsYW4lZCIsCisJCQkJZXRoZXJfc2V0dXApOwogCWlmIChuZXRkZXYgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBhbGxvYyBuZXRkZXYuXG4iKTsKIAkJd2xhbl9mcmVlX3dpcGh5KHdpcGh5KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW5ldGRldi5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbmV0ZGV2LmgKaW5kZXggMWVjMzM3NC4uODU4ODQxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbmV0ZGV2LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbmV0ZGV2LmgKQEAgLTk0LDExICs5NCwxMSBAQAogI2VuZGlmCiAKIC8qLS0tIE5TRCBDYXBhYmlsaXRpZXMgRmxhZ3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgUDgwMjExX05TRENBUF9IQVJEV0FSRVdFUCAgICAgICAgICAgMHgwMQkvKiBoYXJkd2FyZSB3ZXAgZW5naW5lICovCi0jZGVmaW5lIFA4MDIxMV9OU0RDQVBfU0hPUlRfUFJFQU1CTEUgICAgICAgIDB4MTAJLyogaGFyZHdhcmUgc3VwcG9ydHMgKi8KLSNkZWZpbmUgUDgwMjExX05TRENBUF9IV0ZSQUdNRU5UICAgICAgICAgICAgMHg4MAkvKiBuc2QgaGFuZGxlcyBmcmFnL2RlZnJhZyAqLwotI2RlZmluZSBQODAyMTFfTlNEQ0FQX0FVVE9KT0lOICAgICAgICAgICAgICAweDEwMAkvKiBuc2QgZG9lcyBhdXRvam9pbiAqLwotI2RlZmluZSBQODAyMTFfTlNEQ0FQX05PU0NBTiAgICAgICAgICAgICAgICAweDIwMAkvKiBuc2QgY2FuIHNjYW4gKi8KKyNkZWZpbmUgUDgwMjExX05TRENBUF9IQVJEV0FSRVdFUCAgICAgICAgICAgMHgwMSAgLyogaGFyZHdhcmUgd2VwIGVuZ2luZSAqLworI2RlZmluZSBQODAyMTFfTlNEQ0FQX1NIT1JUX1BSRUFNQkxFICAgICAgICAweDEwICAvKiBoYXJkd2FyZSBzdXBwb3J0cyAqLworI2RlZmluZSBQODAyMTFfTlNEQ0FQX0hXRlJBR01FTlQgICAgICAgICAgICAweDgwICAvKiBuc2QgaGFuZGxlcyBmcmFnL2RlZnJhZyAqLworI2RlZmluZSBQODAyMTFfTlNEQ0FQX0FVVE9KT0lOICAgICAgICAgICAgICAweDEwMCAvKiBuc2QgZG9lcyBhdXRvam9pbiAqLworI2RlZmluZSBQODAyMTFfTlNEQ0FQX05PU0NBTiAgICAgICAgICAgICAgICAweDIwMCAvKiBuc2QgY2FuIHNjYW4gKi8KIAogLyogUmVjZWl2ZWQgZnJhbWUgc3RhdGlzdGljcyAqLwogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExX2ZybXJ4X3QgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExdHlwZXMuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMXR5cGVzLmgKaW5kZXggNDFhOTljNS4uOWRlYzg1OTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMXR5cGVzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExdHlwZXMuaApAQCAtMTQxLDE0ICsxNDEsMTQgQEAKICNkZWZpbmUgUDgwMjExRElEX0xTQl9JVEVNCQkoMTIpCiAjZGVmaW5lIFA4MDIxMURJRF9MU0JfSU5ERVgJCSgxOCkKICNkZWZpbmUgUDgwMjExRElEX0xTQl9JU1RBQkxFCQkoMjYpCi0jZGVmaW5lIFA4MDIxMURJRF9MU0JfQUNDRVNTIAkJKDI3KQorI2RlZmluZSBQODAyMTFESURfTFNCX0FDQ0VTUwkJKDI3KQogCiAjZGVmaW5lIFA4MDIxMURJRF9NQVNLX1NFQ1RJT04JCSgweDAwMDAwMDNmVUwpCiAjZGVmaW5lIFA4MDIxMURJRF9NQVNLX0dST1VQCQkoMHgwMDAwMDAzZlVMKQogI2RlZmluZSBQODAyMTFESURfTUFTS19JVEVNCQkoMHgwMDAwMDAzZlVMKQogI2RlZmluZSBQODAyMTFESURfTUFTS19JTkRFWAkJKDB4MDAwMDAwZmZVTCkKICNkZWZpbmUgUDgwMjExRElEX01BU0tfSVNUQUJMRQkJKDB4MDAwMDAwMDFVTCkKLSNkZWZpbmUgUDgwMjExRElEX01BU0tfQUNDRVNTIAkJKDB4MDAwMDAwMDNVTCkKKyNkZWZpbmUgUDgwMjExRElEX01BU0tfQUNDRVNTCQkoMHgwMDAwMDAwM1VMKQogCiAjZGVmaW5lIFA4MDIxMURJRF9NSyhhLCBtLCBsKQkoKCgodTMyKShhKSkgJiAobSkpIDw8IChsKSkKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWdtdC5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWdtdC5jCmluZGV4IDA0NTE0YTguLjY2NzVjODIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJtZ210LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWdtdC5jCkBAIC0yMTMsOCArMjEzLDggQEAKIAkJdTE2IHdvcmRidWZbMTddOwogCiAJCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywKLQkJCQkJCSAgSEZBMzg0eF9SSURfQ05GUk9BTUlOR01PREUsCi0JCQkJCQkgIEhGQTM4NHhfUk9BTU1PREVfSE9TVFNDQU5fSE9TVFJPQU0pOworCQkJCQlIRkEzODR4X1JJRF9DTkZST0FNSU5HTU9ERSwKKwkJCQkJSEZBMzg0eF9ST0FNTU9ERV9IT1NUU0NBTl9IT1NUUk9BTSk7CiAJCWlmIChyZXN1bHQpIHsKIAkJCXByaW50ayhLRVJOX0VSUgogCQkJICAgICAgICJzZXRjb25maWcoUk9BTUlOR01PREUpIGZhaWxlZC4gcmVzdWx0PSVkXG4iLApAQCAtMjU4LDggKzI1OCw4IEBACiAJCX0KIAkJLyogaWJzcyBvcHRpb25zICovCiAJCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywKLQkJCQkJCSAgSEZBMzg0eF9SSURfQ1JFQVRFSUJTUywKLQkJCQkJCSAgSEZBMzg0eF9DUkVBVEVJQlNTX0pPSU5DUkVBVEVJQlNTKTsKKwkJCQkJSEZBMzg0eF9SSURfQ1JFQVRFSUJTUywKKwkJCQkJSEZBMzg0eF9DUkVBVEVJQlNTX0pPSU5DUkVBVEVJQlNTKTsKIAkJaWYgKHJlc3VsdCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gc2V0IENSRUFURUlCU1MuXG4iKTsKIAkJCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0KQEAgLTQxNiw3ICs0MTYsOCBAQAogI2RlZmluZSBSRVFCQVNJQ1JBVEUoTikgXAogCWlmICgoY291bnQgPj0gTikgJiYgRE9UMTFfUkFURTVfSVNCQVNJQ19HRVQoaXRlbS0+c3VwcHJhdGVzWyhOKS0xXSkpIHsgXAogCQlyZXEtPmJhc2ljcmF0ZSAjIyBOIC5kYXRhID0gaXRlbS0+c3VwcHJhdGVzWyhOKS0xXTsgXAotCQlyZXEtPmJhc2ljcmF0ZSAjIyBOIC5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7IFwKKwkJcmVxLT5iYXNpY3JhdGUgIyMgTiAuc3RhdHVzID0gXAorCQkJUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOyBcCiAJfQogCiAJUkVRQkFTSUNSQVRFKDEpOwpAQCAtNDMxLDcgKzQzMiw4IEBACiAjZGVmaW5lIFJFUVNVUFBSQVRFKE4pIFwKIAlpZiAoY291bnQgPj0gTikgeyBcCiAJCXJlcS0+c3VwcHJhdGUgIyMgTiAuZGF0YSA9IGl0ZW0tPnN1cHByYXRlc1soTiktMV07IFwKLQkJcmVxLT5zdXBwcmF0ZSAjIyBOIC5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7IFwKKwkJcmVxLT5zdXBwcmF0ZSAjIyBOIC5zdGF0dXMgPSBcCisJCQlQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7IFwKIAl9CiAKIAlSRVFTVVBQUkFURSgxKTsKQEAgLTExMDIsNyArMTEwNCw3IEBACiAJCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9kaXNhYmxlKGh3LCAwKTsKIAkJaWYgKHJlc3VsdCkgewogCQkJcHJfZGVidWcKLQkJCSAgICAoImZhaWxlZCB0byBkaXNhYmxlIHBvcnQgMCBhZnRlciBzbmlmZmluZywgcmVzdWx0PSVkXG4iLAorCQkJKCJmYWlsZWQgdG8gZGlzYWJsZSBwb3J0IDAgYWZ0ZXIgc25pZmZpbmcsIHJlc3VsdD0lZFxuIiwKIAkJCSAgICAgcmVzdWx0KTsKIAkJCWdvdG8gZmFpbGVkOwogCQl9CkBAIC0xMTM3LDcgKzExMzksNyBAQAogCQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2VuYWJsZShodywgMCk7CiAJCQlpZiAocmVzdWx0KSB7CiAJCQkJcHJfZGVidWcKLQkJCQkgICAgKCJmYWlsZWQgdG8gZW5hYmxlIHBvcnQgdG8gcHJlc25pZmYgc2V0dGluZywgcmVzdWx0PSVkXG4iLAorCQkJCSgiZmFpbGVkIHRvIGVuYWJsZSBwb3J0IHRvIHByZXNuaWZmIHNldHRpbmcsIHJlc3VsdD0lZFxuIiwKIAkJCQkgICAgIHJlc3VsdCk7CiAJCQkJZ290byBmYWlsZWQ7CiAJCQl9CkBAIC0xMTYxLDcgKzExNjMsNyBAQAogCQkJCQkJICAmKGh3LT5wcmVzbmlmZl9wb3J0X3R5cGUpKTsKIAkJCQlpZiAocmVzdWx0KSB7CiAJCQkJCXByX2RlYnVnCi0JCQkJCSAgICAoImZhaWxlZCB0byByZWFkIHBvcnR0eXBlLCByZXN1bHQ9JWRcbiIsCisJCQkJCSgiZmFpbGVkIHRvIHJlYWQgcG9ydHR5cGUsIHJlc3VsdD0lZFxuIiwKIAkJCQkJICAgICByZXN1bHQpOwogCQkJCQlnb3RvIGZhaWxlZDsKIAkJCQl9CkBAIC0xMTcxLDcgKzExNzMsNyBAQAogCQkJCQkJICAmKGh3LT5wcmVzbmlmZl93ZXBmbGFncykpOwogCQkJCWlmIChyZXN1bHQpIHsKIAkJCQkJcHJfZGVidWcKLQkJCQkJICAgICgiZmFpbGVkIHRvIHJlYWQgd2VwZmxhZ3MsIHJlc3VsdD0lZFxuIiwKKwkJCQkJKCJmYWlsZWQgdG8gcmVhZCB3ZXBmbGFncywgcmVzdWx0PSVkXG4iLAogCQkJCQkgICAgIHJlc3VsdCk7CiAJCQkJCWdvdG8gZmFpbGVkOwogCQkJCX0KQEAgLTEyMzgsOCArMTI0MCw4IEBACiAKIAkJCWlmIChyZXN1bHQpIHsKIAkJCQlwcl9kZWJ1ZwotCQkJCSAgICAoImZhaWxlZCB0byBzZXQgd2VwZmxhZ3M9MHglMDR4LCByZXN1bHQ9JWRcbiIsCi0JCQkJICAgICB3b3JkLCByZXN1bHQpOworCQkJCSAgKCJmYWlsZWQgdG8gc2V0IHdlcGZsYWdzPTB4JTA0eCwgcmVzdWx0PSVkXG4iLAorCQkJCSAgIHdvcmQsIHJlc3VsdCk7CiAJCQkJZ290byBmYWlsZWQ7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi9YR0lfbWFpbl8yNi5jIGIvZHJpdmVycy9zdGFnaW5nL3hnaWZiL1hHSV9tYWluXzI2LmMKaW5kZXggNGY3M2QwOS4uZWUwMDhlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3hnaWZiL1hHSV9tYWluXzI2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3hnaWZiL1hHSV9tYWluXzI2LmMKQEAgLTQ3Miw5ICs0NzIsMTEgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJcGRldiA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX1NJLCBuYnJpZGdlX2lkLCBwZGV2KTsKLQkJaWYgKHBkZXYpCisJCXBkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX1NJLCBuYnJpZGdlX2lkLCBwZGV2KTsKKwkJaWYgKHBkZXYpIHsKIAkJCXZhbGlkX3BkZXYgPSAxOworCQkJcGNpX2Rldl9wdXQocGRldik7CisJCX0KIAl9CiAKIAlpZiAoIXZhbGlkX3BkZXYpIHsKQEAgLTIxNzgsOCArMjE4MCw3IEBACiAKICNpZm5kZWYgQUdQT0ZGCiAJaWYgKFhHSWZiX3F1ZXVlbW9kZSA9PSBBR1BfQ01EX1FVRVVFKSB7Ci0JCWFncF9pbmZvID0gdm1hbGxvYyhzaXplb2YoKmFncF9pbmZvKSk7Ci0JCW1lbXNldCgodm9pZCAqKWFncF9pbmZvLCAweDAwLCBzaXplb2YoKmFncF9pbmZvKSk7CisJCWFncF9pbmZvID0gdnphbGxvYyhzaXplb2YoKmFncF9pbmZvKSk7CiAJCWFncF9jb3B5X2luZm8oYWdwX2luZm8pOwogCiAJCWFncF9iYWNrZW5kX2FjcXVpcmUoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy96cmFtL3h2bWFsbG9jLmMgYi9kcml2ZXJzL3N0YWdpbmcvenJhbS94dm1hbGxvYy5jCmluZGV4IDNmZGJiOGEuLmI2NDQwNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy96cmFtL3h2bWFsbG9jLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3pyYW0veHZtYWxsb2MuYwpAQCAtMTg3LDcgKzE4Nyw3IEBACiAJc2xpbmRleCA9IGdldF9pbmRleF9mb3JfaW5zZXJ0KGJsb2NrLT5zaXplKTsKIAlmbGluZGV4ID0gc2xpbmRleCAvIEJJVFNfUEVSX0xPTkc7CiAKLQlibG9jay0+bGluay5wcmV2X3BhZ2UgPSAwOworCWJsb2NrLT5saW5rLnByZXZfcGFnZSA9IE5VTEw7CiAJYmxvY2stPmxpbmsucHJldl9vZmZzZXQgPSAwOwogCWJsb2NrLT5saW5rLm5leHRfcGFnZSA9IHBvb2wtPmZyZWVsaXN0W3NsaW5kZXhdLnBhZ2U7CiAJYmxvY2stPmxpbmsubmV4dF9vZmZzZXQgPSBwb29sLT5mcmVlbGlzdFtzbGluZGV4XS5vZmZzZXQ7CkBAIC0yMTcsNyArMjE3LDcgQEAKIAogCXBvb2wtPmZyZWVsaXN0W3NsaW5kZXhdLnBhZ2UgPSBibG9jay0+bGluay5uZXh0X3BhZ2U7CiAJcG9vbC0+ZnJlZWxpc3Rbc2xpbmRleF0ub2Zmc2V0ID0gYmxvY2stPmxpbmsubmV4dF9vZmZzZXQ7Ci0JYmxvY2stPmxpbmsucHJldl9wYWdlID0gMDsKKwlibG9jay0+bGluay5wcmV2X3BhZ2UgPSBOVUxMOwogCWJsb2NrLT5saW5rLnByZXZfb2Zmc2V0ID0gMDsKIAogCWlmICghcG9vbC0+ZnJlZWxpc3Rbc2xpbmRleF0ucGFnZSkgewpAQCAtMjMyLDcgKzIzMiw3IEBACiAJCSAqLwogCQl0bXBibG9jayA9IGdldF9wdHJfYXRvbWljKHBvb2wtPmZyZWVsaXN0W3NsaW5kZXhdLnBhZ2UsCiAJCQkJcG9vbC0+ZnJlZWxpc3Rbc2xpbmRleF0ub2Zmc2V0LCBLTV9VU0VSMSk7Ci0JCXRtcGJsb2NrLT5saW5rLnByZXZfcGFnZSA9IDA7CisJCXRtcGJsb2NrLT5saW5rLnByZXZfcGFnZSA9IE5VTEw7CiAJCXRtcGJsb2NrLT5saW5rLnByZXZfb2Zmc2V0ID0gMDsKIAkJcHV0X3B0cl9hdG9taWModG1wYmxvY2ssIEtNX1VTRVIxKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvenJhbS96cmFtX2Rydi5jIGIvZHJpdmVycy9zdGFnaW5nL3pyYW0venJhbV9kcnYuYwppbmRleCBkMGU5ZTAyLi41NDE1NzEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvenJhbS96cmFtX2Rydi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy96cmFtL3pyYW1fZHJ2LmMKQEAgLTUyNyw3ICs1MjcsNyBAQAogCX0KIAogCW51bV9wYWdlcyA9IHpyYW0tPmRpc2tzaXplID4+IFBBR0VfU0hJRlQ7Ci0JenJhbS0+dGFibGUgPSB2bWFsbG9jKG51bV9wYWdlcyAqIHNpemVvZigqenJhbS0+dGFibGUpKTsKKwl6cmFtLT50YWJsZSA9IHZ6YWxsb2MobnVtX3BhZ2VzICogc2l6ZW9mKCp6cmFtLT50YWJsZSkpOwogCWlmICghenJhbS0+dGFibGUpIHsKIAkJcHJfZXJyKCJFcnJvciBhbGxvY2F0aW5nIHpyYW0gYWRkcmVzcyB0YWJsZVxuIik7CiAJCS8qIFRvIHByZXZlbnQgYWNjZXNzaW5nIHRhYmxlIGVudHJpZXMgZHVyaW5nIGNsZWFudXAgKi8KQEAgLTUzNSw3ICs1MzUsNiBAQAogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGZhaWw7CiAJfQotCW1lbXNldCh6cmFtLT50YWJsZSwgMCwgbnVtX3BhZ2VzICogc2l6ZW9mKCp6cmFtLT50YWJsZSkpOwogCiAJc2V0X2NhcGFjaXR5KHpyYW0tPmRpc2ssIHpyYW0tPmRpc2tzaXplID4+IFNFQ1RPUl9TSElGVCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvZHJpdmVyLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2RyaXZlci5jCmluZGV4IGI5Mjc4YTEuLmZjYTYxNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvZHJpdmVyLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9kcml2ZXIuYwpAQCAtMzc1LDcgKzM3NSw3IEBACiAJCSAqIEp1c3QgcmUtZW5hYmxlIGl0IHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBlbmRwb2ludCB0b2dnbGVzLgogCQkgKi8KIAkJdXNiX2VuYWJsZV9pbnRlcmZhY2UodWRldiwgaW50ZiwgZmFsc2UpOwotCX0gZWxzZSBpZiAoIWVycm9yICYmIGludGYtPmRldi5wb3dlci5zdGF0dXMgPT0gRFBNX09OKSB7CisJfSBlbHNlIGlmICghZXJyb3IgJiYgIWludGYtPmRldi5wb3dlci5pbl9zdXNwZW5kKSB7CiAJCXIgPSB1c2Jfc2V0X2ludGVyZmFjZSh1ZGV2LCBpbnRmLT5hbHRzZXR0aW5nWzBdLgogCQkJCWRlc2MuYkludGVyZmFjZU51bWJlciwgMCk7CiAJCWlmIChyIDwgMCkKQEAgLTk2MCw3ICs5NjAsNyBAQAogCX0KIAogCS8qIFRyeSB0byByZWJpbmQgdGhlIGludGVyZmFjZSAqLwotCWlmIChpbnRmLT5kZXYucG93ZXIuc3RhdHVzID09IERQTV9PTikgeworCWlmICghaW50Zi0+ZGV2LnBvd2VyLmluX3N1c3BlbmQpIHsKIAkJaW50Zi0+bmVlZHNfYmluZGluZyA9IDA7CiAJCXJjID0gZGV2aWNlX2F0dGFjaCgmaW50Zi0+ZGV2KTsKIAkJaWYgKHJjIDwgMCkKQEAgLTExMDcsOCArMTEwNyw3IEBACiAJaWYgKGludGYtPmNvbmRpdGlvbiA9PSBVU0JfSU5URVJGQUNFX1VOQk9VTkQpIHsKIAogCQkvKiBDYXJyeSBvdXQgYSBkZWZlcnJlZCBzd2l0Y2ggdG8gYWx0c2V0dGluZyAwICovCi0JCWlmIChpbnRmLT5uZWVkc19hbHRzZXR0aW5nMCAmJgotCQkJCWludGYtPmRldi5wb3dlci5zdGF0dXMgPT0gRFBNX09OKSB7CisJCWlmIChpbnRmLT5uZWVkc19hbHRzZXR0aW5nMCAmJiAhaW50Zi0+ZGV2LnBvd2VyLmluX3N1c3BlbmQpIHsKIAkJCXVzYl9zZXRfaW50ZXJmYWNlKHVkZXYsIGludGYtPmFsdHNldHRpbmdbMF0uCiAJCQkJCWRlc2MuYkludGVyZmFjZU51bWJlciwgMCk7CiAJCQlpbnRmLT5uZWVkc19hbHRzZXR0aW5nMCA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfZGVidWdmcy5jIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2RlYnVnZnMuYwppbmRleCA5ZTg2MzlkLi5iMDE3NmU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9kZWJ1Z2ZzLmMKQEAgLTM2LDcgKzM2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgva29iamVjdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL29wdGlvbi5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL29wdGlvbi5jCmluZGV4IGNkZmIxODYuLjc0ODc3ODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpb24uYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aW9uLmMKQEAgLTYxNSw3ICs2MTUsNiBAQAogCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMDA0LCAweGZmLCAweGZmLCAweGZmKSB9LAogCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMDA1LCAweGZmLCAweGZmLCAweGZmKSB9LAogCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMDA2LCAweGZmLCAweGZmLCAweGZmKSB9LAotCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMDA3LCAweGZmLCAweGZmLCAweGZmKSB9LAogCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMDA4LCAweGZmLCAweGZmLCAweGZmKSB9LAogCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMDA5LCAweGZmLCAweGZmLCAweGZmKSB9LAogCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMDBhLCAweGZmLCAweGZmLCAweGZmKSB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby91ZGxmYi5jIGIvZHJpdmVycy92aWRlby91ZGxmYi5jCmluZGV4IDAyMDU4OWEuLjJjODM2NGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdWRsZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3VkbGZiLmMKQEAgLTExMjgsMTQgKzExMjgsMTMgQEAKIAkJICogQnV0IHdpdGggaW1wZXJmZWN0IGRhbWFnZSBpbmZvIHdlIG1heSBzZW5kIHBpeGVscyBvdmVyIFVTQgogCQkgKiB0aGF0IHdlcmUsIGluIGZhY3QsIHVuY2hhbmdlZCAtIHdhc3RpbmcgbGltaXRlZCBVU0IgYmFuZHdpZHRoCiAJCSAqLwotCQluZXdfYmFjayA9IHZtYWxsb2MobmV3X2xlbik7CisJCW5ld19iYWNrID0gdnphbGxvYyhuZXdfbGVuKTsKIAkJaWYgKCFuZXdfYmFjaykKLQkJCXByX2luZm8oIk5vIHNoYWRvdy9iYWNraW5nIGJ1ZmZlciBhbGxjb2F0ZWRcbiIpOworCQkJcHJfaW5mbygiTm8gc2hhZG93L2JhY2tpbmcgYnVmZmVyIGFsbG9jYXRlZFxuIik7CiAJCWVsc2UgewogCQkJaWYgKGRldi0+YmFja2luZ19idWZmZXIpCiAJCQkJdmZyZWUoZGV2LT5iYWNraW5nX2J1ZmZlcik7CiAJCQlkZXYtPmJhY2tpbmdfYnVmZmVyID0gbmV3X2JhY2s7Ci0JCQltZW1zZXQoZGV2LT5iYWNraW5nX2J1ZmZlciwgMCwgbmV3X2xlbik7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8veGVuLWZiZnJvbnQuYyBiL2RyaXZlcnMvdmlkZW8veGVuLWZiZnJvbnQuYwppbmRleCA0YWJiMGI5Li4zZTY5MzRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3hlbi1mYmZyb250LmMKKysrIGIvZHJpdmVycy92aWRlby94ZW4tZmJmcm9udC5jCkBAIC01NjIsMjYgKzU2MiwyNCBAQAogc3RhdGljIGludCB4ZW5mYl9jb25uZWN0X2JhY2tlbmQoc3RydWN0IHhlbmJ1c19kZXZpY2UgKmRldiwKIAkJCQkgc3RydWN0IHhlbmZiX2luZm8gKmluZm8pCiB7Ci0JaW50IHJldCwgZXZ0Y2huOworCWludCByZXQsIGV2dGNobiwgaXJxOwogCXN0cnVjdCB4ZW5idXNfdHJhbnNhY3Rpb24geGJ0OwogCiAJcmV0ID0geGVuYnVzX2FsbG9jX2V2dGNobihkZXYsICZldnRjaG4pOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7Ci0JcmV0ID0gYmluZF9ldnRjaG5fdG9faXJxaGFuZGxlcihldnRjaG4sIHhlbmZiX2V2ZW50X2hhbmRsZXIsCisJaXJxID0gYmluZF9ldnRjaG5fdG9faXJxaGFuZGxlcihldnRjaG4sIHhlbmZiX2V2ZW50X2hhbmRsZXIsCiAJCQkJCTAsIGRldi0+ZGV2aWNldHlwZSwgaW5mbyk7Ci0JaWYgKHJldCA8IDApIHsKKwlpZiAoaXJxIDwgMCkgewogCQl4ZW5idXNfZnJlZV9ldnRjaG4oZGV2LCBldnRjaG4pOwogCQl4ZW5idXNfZGV2X2ZhdGFsKGRldiwgcmV0LCAiYmluZF9ldnRjaG5fdG9faXJxaGFuZGxlciIpOwotCQlyZXR1cm4gcmV0OworCQlyZXR1cm4gaXJxOwogCX0KLQlpbmZvLT5pcnEgPSByZXQ7Ci0KICBhZ2FpbjoKIAlyZXQgPSB4ZW5idXNfdHJhbnNhY3Rpb25fc3RhcnQoJnhidCk7CiAJaWYgKHJldCkgewogCQl4ZW5idXNfZGV2X2ZhdGFsKGRldiwgcmV0LCAic3RhcnRpbmcgdHJhbnNhY3Rpb24iKTsKLQkJcmV0dXJuIHJldDsKKwkJZ290byB1bmJpbmRfaXJxOwogCX0KIAlyZXQgPSB4ZW5idXNfcHJpbnRmKHhidCwgZGV2LT5ub2RlbmFtZSwgInBhZ2UtcmVmIiwgIiVsdSIsCiAJCQkgICAgdmlydF90b19tZm4oaW5mby0+cGFnZSkpOwpAQCAtNjAzLDIwICs2MDEsMjUgQEAKIAkJaWYgKHJldCA9PSAtRUFHQUlOKQogCQkJZ290byBhZ2FpbjsKIAkJeGVuYnVzX2Rldl9mYXRhbChkZXYsIHJldCwgImNvbXBsZXRpbmcgdHJhbnNhY3Rpb24iKTsKLQkJcmV0dXJuIHJldDsKKwkJZ290byB1bmJpbmRfaXJxOwogCX0KIAogCXhlbmJ1c19zd2l0Y2hfc3RhdGUoZGV2LCBYZW5idXNTdGF0ZUluaXRpYWxpc2VkKTsKKwlpbmZvLT5pcnEgPSBpcnE7CiAJcmV0dXJuIDA7CiAKICBlcnJvcl94ZW5idXM6CiAJeGVuYnVzX3RyYW5zYWN0aW9uX2VuZCh4YnQsIDEpOwogCXhlbmJ1c19kZXZfZmF0YWwoZGV2LCByZXQsICJ3cml0aW5nIHhlbnN0b3JlIik7CisgdW5iaW5kX2lycToKKwl1bmJpbmRfZnJvbV9pcnFoYW5kbGVyKGlycSwgaW5mbyk7CiAJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgeGVuZmJfZGlzY29ubmVjdF9iYWNrZW5kKHN0cnVjdCB4ZW5mYl9pbmZvICppbmZvKQogeworCS8qIFByZXZlbnQgeGVuZmIgcmVmcmVzaCAqLworCWluZm8tPnVwZGF0ZV93YW50ZWQgPSAwOwogCWlmIChpbmZvLT5pcnEgPj0gMCkKIAkJdW5iaW5kX2Zyb21faXJxaGFuZGxlcihpbmZvLT5pcnEsIGluZm8pOwogCWluZm8tPmlycSA9IC0xOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vZXZlbnRzLmMgYi9kcml2ZXJzL3hlbi9ldmVudHMuYwppbmRleCA2NWY4NjM3Li43NDY4MTQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi9ldmVudHMuYworKysgYi9kcml2ZXJzL3hlbi9ldmVudHMuYwpAQCAtMTcwLDYgKzE3MCw5IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZXZ0Y2huX2Zyb21faXJxKHVuc2lnbmVkIGlycSkKIHsKKwlpZiAodW5saWtlbHkoV0FSTihpcnEgPCAwIHx8IGlycSA+PSBucl9pcnFzLCAiSW52YWxpZCBpcnEgJWQhXG4iLCBpcnEpKSkKKwkJcmV0dXJuIDA7CisKIAlyZXR1cm4gaW5mb19mb3JfaXJxKGlycSktPmV2dGNobjsKIH0KIApAQCAtNDA1LDE1ICs0MDgsMjEgQEAKIHsKIAlzdHJ1Y3QgaXJxX2RhdGEgKmRhdGE7CiAJaW50IGlycSwgcmVzOwotCWludCBzdGFydCA9IGdldF9ucl9od19pcnFzKCk7CisJaW50IGJvdHRvbSA9IGdldF9ucl9od19pcnFzKCk7CisJaW50IHRvcCA9IG5yX2lycXMtMTsKIAotCWlmIChzdGFydCA9PSBucl9pcnFzKQorCWlmIChib3R0b20gPT0gbnJfaXJxcykKIAkJZ290byBub19pcnFzOwogCi0JLyogbnJfaXJxcyBpcyBhIG1hZ2ljIHZhbHVlLiBNdXN0IG5vdCB1c2UgaXQuKi8KLQlmb3IgKGlycSA9IG5yX2lycXMtMTsgaXJxID4gc3RhcnQ7IGlycS0tKSB7CisJLyogVGhpcyBsb29wIHN0YXJ0cyBmcm9tIHRoZSB0b3Agb2YgSVJRIHNwYWNlIGFuZCBnb2VzIGRvd24uCisJICogV2UgbmVlZCB0aGlzIGIvYyBpZiB3ZSBoYXZlIGEgUENJIGRldmljZSBpbiBhIFhlbiBQViBndWVzdAorCSAqIHdlIGRvIG5vdCBoYXZlIGFuIElPLUFQSUMgKHRob3VnaCB0aGUgYmFja2VuZCBtaWdodCBoYXZlIHRoZW0pCisJICogbWFwcGVkIGluLiBUbyBub3QgaGF2ZSBhIGNvbGxpc2lvbiBvZiBwaHlzaWNhbCBJUlFzIHdpdGggdGhlIFhlbgorCSAqIGV2ZW50IGNoYW5uZWxzIHN0YXJ0IGF0IHRoZSB0b3Agb2YgdGhlIElSUSBzcGFjZSBmb3IgdmlydHVhbCBJUlFzLgorCSAqLworCWZvciAoaXJxID0gdG9wOyBpcnEgPiBib3R0b207IGlycS0tKSB7CiAJCWRhdGEgPSBpcnFfZ2V0X2lycV9kYXRhKGlycSk7Ci0JCS8qIG9ubHkgMC0+MTUgaGF2ZSBpbml0J2QgZGVzYzsgaGFuZGxlIGlycSA+IDE2ICovCisJCS8qIG9ubHkgMTUtPjAgaGF2ZSBpbml0J2QgZGVzYzsgaGFuZGxlIGlycSA+IDE2ICovCiAJCWlmICghZGF0YSkKIAkJCWJyZWFrOwogCQlpZiAoZGF0YS0+Y2hpcCA9PSAmbm9faXJxX2NoaXApCkBAIC00MjQsNyArNDMzLDcgQEAKIAkJCXJldHVybiBpcnE7CiAJfQogCi0JaWYgKGlycSA9PSBzdGFydCkKKwlpZiAoaXJxID09IGJvdHRvbSkKIAkJZ290byBub19pcnFzOwogCiAJcmVzID0gaXJxX2FsbG9jX2Rlc2NfYXQoaXJxLCAtMSk7CmRpZmYgLS1naXQgYS9mcy9jaWZzL2NhY2hlLmMgYi9mcy9jaWZzL2NhY2hlLmMKaW5kZXggMjI0ZDdiYmQuLmU2NTRkZmQwIDEwMDY0NAotLS0gYS9mcy9jaWZzL2NhY2hlLmMKKysrIGIvZnMvY2lmcy9jYWNoZS5jCkBAIC02NCw3ICs2NCw5IEBACiAJCQkJICAgdm9pZCAqYnVmZmVyLCB1aW50MTZfdCBtYXhidWYpCiB7CiAJY29uc3Qgc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyID0gY29va2llX25ldGZzX2RhdGE7Ci0JY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYSA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNlcnZlci0+YWRkci5zb2NrQWRkcjsKKwljb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhID0gKHN0cnVjdCBzb2NrYWRkciAqKSAmc2VydmVyLT5kc3RhZGRyOworCWNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgc2E7CisJY29uc3Qgc3RydWN0IHNvY2thZGRyX2luNiAqYWRkcjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSBzYTsKIAlzdHJ1Y3QgY2lmc19zZXJ2ZXJfa2V5ICprZXkgPSBidWZmZXI7CiAJdWludDE2X3Qga2V5X2xlbiA9IHNpemVvZihzdHJ1Y3QgY2lmc19zZXJ2ZXJfa2V5KTsKIApAQCAtNzYsMTYgKzc4LDE2IEBACiAJICovCiAJc3dpdGNoIChzYS0+c2FfZmFtaWx5KSB7CiAJY2FzZSBBRl9JTkVUOgotCQlrZXktPmZhbWlseSA9IHNlcnZlci0+YWRkci5zb2NrQWRkci5zaW5fZmFtaWx5OwotCQlrZXktPnBvcnQgPSBzZXJ2ZXItPmFkZHIuc29ja0FkZHIuc2luX3BvcnQ7Ci0JCWtleS0+YWRkclswXS5pcHY0X2FkZHIgPSBzZXJ2ZXItPmFkZHIuc29ja0FkZHIuc2luX2FkZHI7CisJCWtleS0+ZmFtaWx5ID0gc2EtPnNhX2ZhbWlseTsKKwkJa2V5LT5wb3J0ID0gYWRkci0+c2luX3BvcnQ7CisJCWtleS0+YWRkclswXS5pcHY0X2FkZHIgPSBhZGRyLT5zaW5fYWRkcjsKIAkJa2V5X2xlbiArPSBzaXplb2Yoa2V5LT5hZGRyWzBdLmlwdjRfYWRkcik7CiAJCWJyZWFrOwogCiAJY2FzZSBBRl9JTkVUNjoKLQkJa2V5LT5mYW1pbHkgPSBzZXJ2ZXItPmFkZHIuc29ja0FkZHI2LnNpbjZfZmFtaWx5OwotCQlrZXktPnBvcnQgPSBzZXJ2ZXItPmFkZHIuc29ja0FkZHI2LnNpbjZfcG9ydDsKLQkJa2V5LT5hZGRyWzBdLmlwdjZfYWRkciA9IHNlcnZlci0+YWRkci5zb2NrQWRkcjYuc2luNl9hZGRyOworCQlrZXktPmZhbWlseSA9IHNhLT5zYV9mYW1pbHk7CisJCWtleS0+cG9ydCA9IGFkZHI2LT5zaW42X3BvcnQ7CisJCWtleS0+YWRkclswXS5pcHY2X2FkZHIgPSBhZGRyNi0+c2luNl9hZGRyOwogCQlrZXlfbGVuICs9IHNpemVvZihrZXktPmFkZHJbMF0uaXB2Nl9hZGRyKTsKIAkJYnJlYWs7CiAKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc19kZWJ1Zy5jIGIvZnMvY2lmcy9jaWZzX2RlYnVnLmMKaW5kZXggMTAzYWI4Yi4uZWRlOTgzMCAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzX2RlYnVnLmMKKysrIGIvZnMvY2lmcy9jaWZzX2RlYnVnLmMKQEAgLTExOSwyOSArMTE5LDI3IEBACiAJCSAgICAiRGlzcGxheSBJbnRlcm5hbCBDSUZTIERhdGEgU3RydWN0dXJlcyBmb3IgRGVidWdnaW5nXG4iCiAJCSAgICAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKIAlzZXFfcHJpbnRmKG0sICJDSUZTIFZlcnNpb24gJXNcbiIsIENJRlNfVkVSU0lPTik7Ci0Jc2VxX3ByaW50ZihtLCAiRmVhdHVyZXM6ICIpOworCXNlcV9wcmludGYobSwgIkZlYXR1cmVzOiIpOwogI2lmZGVmIENPTkZJR19DSUZTX0RGU19VUENBTEwKLQlzZXFfcHJpbnRmKG0sICJkZnMiKTsKLQlzZXFfcHV0YyhtLCAnICcpOworCXNlcV9wcmludGYobSwgIiBkZnMiKTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19DSUZTX0ZTQ0FDSEUKLQlzZXFfcHJpbnRmKG0sICJmc2NhY2hlIik7Ci0Jc2VxX3B1dGMobSwgJyAnKTsKKwlzZXFfcHJpbnRmKG0sICIgZnNjYWNoZSIpOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0NJRlNfV0VBS19QV19IQVNICi0Jc2VxX3ByaW50ZihtLCAibGFubWFuIik7Ci0Jc2VxX3B1dGMobSwgJyAnKTsKKwlzZXFfcHJpbnRmKG0sICIgbGFubWFuIik7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQ0lGU19QT1NJWAotCXNlcV9wcmludGYobSwgInBvc2l4Iik7Ci0Jc2VxX3B1dGMobSwgJyAnKTsKKwlzZXFfcHJpbnRmKG0sICIgcG9zaXgiKTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19DSUZTX1VQQ0FMTAotCXNlcV9wcmludGYobSwgInNwbmVnbyIpOwotCXNlcV9wdXRjKG0sICcgJyk7CisJc2VxX3ByaW50ZihtLCAiIHNwbmVnbyIpOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0NJRlNfWEFUVFIKLQlzZXFfcHJpbnRmKG0sICJ4YXR0ciIpOworCXNlcV9wcmludGYobSwgIiB4YXR0ciIpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0NJRlNfQUNMCisJc2VxX3ByaW50ZihtLCAiIGFjbCIpOwogI2VuZGlmCiAJc2VxX3B1dGMobSwgJ1xuJyk7CiAJc2VxX3ByaW50ZihtLCAiQWN0aXZlIFZGUyBSZXF1ZXN0czogJWRcbiIsIEdsb2JhbFRvdGFsQWN0aXZlWGlkKTsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc19zcG5lZ28uYyBiL2ZzL2NpZnMvY2lmc19zcG5lZ28uYwppbmRleCA4NzA0NDkwLi40ZGZiYTgyIDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNfc3BuZWdvLmMKKysrIGIvZnMvY2lmcy9jaWZzX3NwbmVnby5jCkBAIC05OCw2ICs5OCw4IEBACiBjaWZzX2dldF9zcG5lZ29fa2V5KHN0cnVjdCBjaWZzU2VzSW5mbyAqc2VzSW5mbykKIHsKIAlzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIgPSBzZXNJbmZvLT5zZXJ2ZXI7CisJc3RydWN0IHNvY2thZGRyX2luICpzYSA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJnNlcnZlci0+ZHN0YWRkcjsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzYTYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSAmc2VydmVyLT5kc3RhZGRyOwogCWNoYXIgKmRlc2NyaXB0aW9uLCAqZHA7CiAJc2l6ZV90IGRlc2NfbGVuOwogCXN0cnVjdCBrZXkgKnNwbmVnb19rZXk7CkBAIC0xMjcsMTAgKzEyOSwxMCBAQAogCWRwID0gZGVzY3JpcHRpb24gKyBzdHJsZW4oZGVzY3JpcHRpb24pOwogCiAJLyogYWRkIHRoZSBzZXJ2ZXIgYWRkcmVzcyAqLwotCWlmIChzZXJ2ZXItPmFkZHIuc29ja0FkZHIuc2luX2ZhbWlseSA9PSBBRl9JTkVUKQotCQlzcHJpbnRmKGRwLCAiaXA0PSVwSTQiLCAmc2VydmVyLT5hZGRyLnNvY2tBZGRyLnNpbl9hZGRyKTsKLQllbHNlIGlmIChzZXJ2ZXItPmFkZHIuc29ja0FkZHIuc2luX2ZhbWlseSA9PSBBRl9JTkVUNikKLQkJc3ByaW50ZihkcCwgImlwNj0lcEk2IiwgJnNlcnZlci0+YWRkci5zb2NrQWRkcjYuc2luNl9hZGRyKTsKKwlpZiAoc2VydmVyLT5kc3RhZGRyLnNzX2ZhbWlseSA9PSBBRl9JTkVUKQorCQlzcHJpbnRmKGRwLCAiaXA0PSVwSTQiLCAmc2EtPnNpbl9hZGRyKTsKKwllbHNlIGlmIChzZXJ2ZXItPmRzdGFkZHIuc3NfZmFtaWx5ID09IEFGX0lORVQ2KQorCQlzcHJpbnRmKGRwLCAiaXA2PSVwSTYiLCAmc2E2LT5zaW42X2FkZHIpOwogCWVsc2UKIAkJZ290byBvdXQ7CiAKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc2VuY3J5cHQuYyBiL2ZzL2NpZnMvY2lmc2VuY3J5cHQuYwppbmRleCBmODU2NzMyLi42NmYzZDUwIDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNlbmNyeXB0LmMKKysrIGIvZnMvY2lmcy9jaWZzZW5jcnlwdC5jCkBAIC03Miw2ICs3Miw3IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIG11c3QgYmUgY2FsbGVkIHdpdGggc2VydmVyLT5zcnZfbXV0ZXggaGVsZCAqLwogaW50IGNpZnNfc2lnbl9zbWIoc3RydWN0IHNtYl9oZHIgKmNpZnNfcGR1LCBzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsCiAJCSAgX191MzIgKnBleHBlY3RlZF9yZXNwb25zZV9zZXF1ZW5jZV9udW1iZXIpCiB7CkBAIC04NCwxNCArODUsMTIgQEAKIAlpZiAoKGNpZnNfcGR1LT5GbGFnczIgJiBTTUJGTEcyX1NFQ1VSSVRZX1NJR05BVFVSRSkgPT0gMCkKIAkJcmV0dXJuIHJjOwogCi0Jc3Bpbl9sb2NrKCZHbG9iYWxNaWRfTG9jayk7CiAJY2lmc19wZHUtPlNpZ25hdHVyZS5TZXF1ZW5jZS5TZXF1ZW5jZU51bWJlciA9CiAJCQljcHVfdG9fbGUzMihzZXJ2ZXItPnNlcXVlbmNlX251bWJlcik7CiAJY2lmc19wZHUtPlNpZ25hdHVyZS5TZXF1ZW5jZS5SZXNlcnZlZCA9IDA7CiAKIAkqcGV4cGVjdGVkX3Jlc3BvbnNlX3NlcXVlbmNlX251bWJlciA9IHNlcnZlci0+c2VxdWVuY2VfbnVtYmVyKys7CiAJc2VydmVyLT5zZXF1ZW5jZV9udW1iZXIrKzsKLQlzcGluX3VubG9jaygmR2xvYmFsTWlkX0xvY2spOwogCiAJcmMgPSBjaWZzX2NhbGN1bGF0ZV9zaWduYXR1cmUoY2lmc19wZHUsIHNlcnZlciwgc21iX3NpZ25hdHVyZSk7CiAJaWYgKHJjKQpAQCAtMTQ5LDYgKzE0OCw3IEBACiAJcmV0dXJuIHJjOwogfQogCisvKiBtdXN0IGJlIGNhbGxlZCB3aXRoIHNlcnZlci0+c3J2X211dGV4IGhlbGQgKi8KIGludCBjaWZzX3NpZ25fc21iMihzdHJ1Y3Qga3ZlYyAqaW92LCBpbnQgbl92ZWMsIHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciwKIAkJICAgX191MzIgKnBleHBlY3RlZF9yZXNwb25zZV9zZXF1ZW5jZV9udW1iZXIpCiB7CkBAIC0xNjIsMTQgKzE2MiwxMiBAQAogCWlmICgoY2lmc19wZHUtPkZsYWdzMiAmIFNNQkZMRzJfU0VDVVJJVFlfU0lHTkFUVVJFKSA9PSAwKQogCQlyZXR1cm4gcmM7CiAKLQlzcGluX2xvY2soJkdsb2JhbE1pZF9Mb2NrKTsKIAljaWZzX3BkdS0+U2lnbmF0dXJlLlNlcXVlbmNlLlNlcXVlbmNlTnVtYmVyID0KIAkJCQljcHVfdG9fbGUzMihzZXJ2ZXItPnNlcXVlbmNlX251bWJlcik7CiAJY2lmc19wZHUtPlNpZ25hdHVyZS5TZXF1ZW5jZS5SZXNlcnZlZCA9IDA7CiAKIAkqcGV4cGVjdGVkX3Jlc3BvbnNlX3NlcXVlbmNlX251bWJlciA9IHNlcnZlci0+c2VxdWVuY2VfbnVtYmVyKys7CiAJc2VydmVyLT5zZXF1ZW5jZV9udW1iZXIrKzsKLQlzcGluX3VubG9jaygmR2xvYmFsTWlkX0xvY2spOwogCiAJcmMgPSBjaWZzX2NhbGNfc2lnbmF0dXJlMihpb3YsIG5fdmVjLCBzZXJ2ZXIsIHNtYl9zaWduYXR1cmUpOwogCWlmIChyYykKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc2ZzLmMgYi9mcy9jaWZzL2NpZnNmcy5jCmluZGV4IDhlMjFlMGYuLjVlNzA3NWQgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc2ZzLmMKKysrIGIvZnMvY2lmcy9jaWZzZnMuYwpAQCAtMzI5LDYgKzMyOSw4IEBACiAJY2lmc19pbm9kZS0+aW52YWxpZF9tYXBwaW5nID0gZmFsc2U7CiAJY2lmc19pbm9kZS0+dmZzX2lub2RlLmlfYmxrYml0cyA9IDE0OyAgLyogMioqMTQgPSBDSUZTX01BWF9NU0dTSVpFICovCiAJY2lmc19pbm9kZS0+c2VydmVyX2VvZiA9IDA7CisJY2lmc19pbm9kZS0+dW5pcXVlaWQgPSAwOworCWNpZnNfaW5vZGUtPmNyZWF0ZXRpbWUgPSAwOwogCiAJLyogQ2FuIG5vdCBzZXQgaV9mbGFncyBoZXJlIC0gdGhleSBnZXQgaW1tZWRpYXRlbHkgb3ZlcndyaXR0ZW4KIAkgICB0byB6ZXJvIGJ5IHRoZSBWRlMgKi8KQEAgLTM2MSwxOCArMzYzLDE5IEBACiBzdGF0aWMgdm9pZAogY2lmc19zaG93X2FkZHJlc3Moc3RydWN0IHNlcV9maWxlICpzLCBzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIpCiB7CisJc3RydWN0IHNvY2thZGRyX2luICpzYSA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJnNlcnZlci0+ZHN0YWRkcjsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzYTYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSAmc2VydmVyLT5kc3RhZGRyOworCiAJc2VxX3ByaW50ZihzLCAiLGFkZHI9Iik7CiAKLQlzd2l0Y2ggKHNlcnZlci0+YWRkci5zb2NrQWRkci5zaW5fZmFtaWx5KSB7CisJc3dpdGNoIChzZXJ2ZXItPmRzdGFkZHIuc3NfZmFtaWx5KSB7CiAJY2FzZSBBRl9JTkVUOgotCQlzZXFfcHJpbnRmKHMsICIlcEk0IiwgJnNlcnZlci0+YWRkci5zb2NrQWRkci5zaW5fYWRkci5zX2FkZHIpOworCQlzZXFfcHJpbnRmKHMsICIlcEk0IiwgJnNhLT5zaW5fYWRkci5zX2FkZHIpOwogCQlicmVhazsKIAljYXNlIEFGX0lORVQ2OgotCQlzZXFfcHJpbnRmKHMsICIlcEk2IiwKLQkJCSAgICZzZXJ2ZXItPmFkZHIuc29ja0FkZHI2LnNpbjZfYWRkci5zNl9hZGRyKTsKLQkJaWYgKHNlcnZlci0+YWRkci5zb2NrQWRkcjYuc2luNl9zY29wZV9pZCkKLQkJCXNlcV9wcmludGYocywgIiUlJXUiLAotCQkJCSAgIHNlcnZlci0+YWRkci5zb2NrQWRkcjYuc2luNl9zY29wZV9pZCk7CisJCXNlcV9wcmludGYocywgIiVwSTYiLCAmc2E2LT5zaW42X2FkZHIuczZfYWRkcik7CisJCWlmIChzYTYtPnNpbjZfc2NvcGVfaWQpCisJCQlzZXFfcHJpbnRmKHMsICIlJSV1Iiwgc2E2LT5zaW42X3Njb3BlX2lkKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJc2VxX3ByaW50ZihzLCAiKHVua25vd24pIik7CmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNnbG9iLmggYi9mcy9jaWZzL2NpZnNnbG9iLmgKaW5kZXggNzEzNmMwYy4uNjA2Y2E4YiAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzZ2xvYi5oCisrKyBiL2ZzL2NpZnMvY2lmc2dsb2IuaApAQCAtMTYzLDEwICsxNjMsNyBAQAogCWNoYXIgc2VydmVyX1JGQzEwMDFfbmFtZVtSRkMxMDAxX05BTUVfTEVOX1dJVEhfTlVMTF07CiAJY2hhciAqaG9zdG5hbWU7IC8qIGhvc3RuYW1lIHBvcnRpb24gb2YgVU5DIHN0cmluZyAqLwogCXN0cnVjdCBzb2NrZXQgKnNzb2NrZXQ7Ci0JdW5pb24gewotCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gc29ja0FkZHI7Ci0JCXN0cnVjdCBzb2NrYWRkcl9pbjYgc29ja0FkZHI2OwotCX0gYWRkcjsKKwlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBkc3RhZGRyOwogCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNyY2FkZHI7IC8qIGxvY2FsbHkgYmluZCB0byB0aGlzIElQICovCiAJd2FpdF9xdWV1ZV9oZWFkX3QgcmVzcG9uc2VfcTsKIAl3YWl0X3F1ZXVlX2hlYWRfdCByZXF1ZXN0X3E7IC8qIGlmIG1vcmUgdGhhbiBtYXhtcHggdG8gc3J2ciBtdXN0IGJsb2NrKi8KQEAgLTIxMCw3ICsyMDcsNyBAQAogCWNoYXIgY3J5cHRrZXlbQ0lGU19DUllQVE9fS0VZX1NJWkVdOyAvKiB1c2VkIGJ5IG50bG0sIG50bG12MiBldGMgKi8KIAkvKiAxNnRoIGJ5dGUgb2YgUkZDMTAwMSB3b3Jrc3RhdGlvbiBuYW1lIGlzIGFsd2F5cyBudWxsICovCiAJY2hhciB3b3Jrc3RhdGlvbl9SRkMxMDAxX25hbWVbUkZDMTAwMV9OQU1FX0xFTl9XSVRIX05VTExdOwotCV9fdTMyIHNlcXVlbmNlX251bWJlcjsgLyogbmVlZGVkIGZvciBDSUZTIFBEVSBzaWduYXR1cmUgKi8KKwlfX3UzMiBzZXF1ZW5jZV9udW1iZXI7IC8qIGZvciBzaWduaW5nLCBwcm90ZWN0ZWQgYnkgc3J2X211dGV4ICovCiAJc3RydWN0IHNlc3Npb25fa2V5IHNlc3Npb25fa2V5OwogCXVuc2lnbmVkIGxvbmcgbHN0cnA7IC8qIHdoZW4gd2UgZ290IGxhc3QgcmVzcG9uc2UgZnJvbSB0aGlzIHNlcnZlciAqLwogCXUxNiBkaWFsZWN0OyAvKiBkaWFsZWN0IGluZGV4IHRoYXQgc2VydmVyIGNob3NlICovCkBAIC00NTYsNiArNDUzLDcgQEAKIAlib29sIGludmFsaWRfbWFwcGluZzoxOwkJLyogcGFnZWNhY2hlIGlzIGludmFsaWQgKi8KIAl1NjQgIHNlcnZlcl9lb2Y7CQkvKiBjdXJyZW50IGZpbGUgc2l6ZSBvbiBzZXJ2ZXIgKi8KIAl1NjQgIHVuaXF1ZWlkOwkJCS8qIHNlcnZlciBpbm9kZSBudW1iZXIgKi8KKwl1NjQgIGNyZWF0ZXRpbWU7CQkvKiBjcmVhdGlvbiB0aW1lIG9uIHNlcnZlciAqLwogI2lmZGVmIENPTkZJR19DSUZTX0ZTQ0FDSEUKIAlzdHJ1Y3QgZnNjYWNoZV9jb29raWUgKmZzY2FjaGU7CiAjZW5kaWYKQEAgLTU3Niw2ICs1NzQsNyBAQAogCXU2NAkJY2ZfdW5pcXVlaWQ7CiAJdTY0CQljZl9lb2Y7CiAJdTY0CQljZl9ieXRlczsKKwl1NjQJCWNmX2NyZWF0ZXRpbWU7CiAJdWlkX3QJCWNmX3VpZDsKIAlnaWRfdAkJY2ZfZ2lkOwogCXVtb2RlX3QJCWNmX21vZGU7CmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNzbWIuYyBiL2ZzL2NpZnMvY2lmc3NtYi5jCmluZGV4IDY3YWNmYjMuLjJmNjc5NWUgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc3NtYi5jCisrKyBiL2ZzL2NpZnMvY2lmc3NtYi5jCkBAIC00MDEsMTUgKzQwMSwxMiBAQAogCWVsc2UgaWYgKChzZWNGbGFncyAmIENJRlNTRUNfQVVUSF9NQVNLKSA9PSBDSUZTU0VDX01BWV9LUkI1KSB7CiAJCWNGWUkoMSwgIktlcmJlcm9zIG9ubHkgbWVjaGFuaXNtLCBlbmFibGUgZXh0ZW5kZWQgc2VjdXJpdHkiKTsKIAkJcFNNQi0+aGRyLkZsYWdzMiB8PSBTTUJGTEcyX0VYVF9TRUM7Ci0JfQotI2lmZGVmIENPTkZJR19DSUZTX0VYUEVSSU1FTlRBTAotCWVsc2UgaWYgKChzZWNGbGFncyAmIENJRlNTRUNfTVVTVF9OVExNU1NQKSA9PSBDSUZTU0VDX01VU1RfTlRMTVNTUCkKKwl9IGVsc2UgaWYgKChzZWNGbGFncyAmIENJRlNTRUNfTVVTVF9OVExNU1NQKSA9PSBDSUZTU0VDX01VU1RfTlRMTVNTUCkKIAkJcFNNQi0+aGRyLkZsYWdzMiB8PSBTTUJGTEcyX0VYVF9TRUM7CiAJZWxzZSBpZiAoKHNlY0ZsYWdzICYgQ0lGU1NFQ19BVVRIX01BU0spID09IENJRlNTRUNfTUFZX05UTE1TU1ApIHsKIAkJY0ZZSSgxLCAiTlRMTVNTUCBvbmx5IG1lY2hhbmlzbSwgZW5hYmxlIGV4dGVuZGVkIHNlY3VyaXR5Iik7CiAJCXBTTUItPmhkci5GbGFnczIgfD0gU01CRkxHMl9FWFRfU0VDOwogCX0KLSNlbmRpZgogCiAJY291bnQgPSAwOwogCWZvciAoaSA9IDA7IGkgPCBDSUZTX05VTV9QUk9UOyBpKyspIHsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY29ubmVjdC5jIGIvZnMvY2lmcy9jb25uZWN0LmMKaW5kZXggY2MxYTg2MC4uYTY1ZDMxMSAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jb25uZWN0LmMKKysrIGIvZnMvY2lmcy9jb25uZWN0LmMKQEAgLTY0LDggKzY0LDggQEAKIAljaGFyICpVTkM7CiAJY2hhciAqVU5DaXA7CiAJY2hhciAqaW9jaGFyc2V0OyAgLyogbG9jYWwgY29kZSBwYWdlIGZvciBtYXBwaW5nIHRvIGFuZCBmcm9tIFVuaWNvZGUgKi8KLQljaGFyIHNvdXJjZV9yZmMxMDAxX25hbWVbMTZdOyAvKiBuZXRiaW9zIG5hbWUgb2YgY2xpZW50ICovCi0JY2hhciB0YXJnZXRfcmZjMTAwMV9uYW1lWzE2XTsgLyogbmV0YmlvcyBuYW1lIG9mIHNlcnZlciBmb3IgV2luOXgvTUUgKi8KKwljaGFyIHNvdXJjZV9yZmMxMDAxX25hbWVbUkZDMTAwMV9OQU1FX0xFTl9XSVRIX05VTExdOyAvKiBjbG50IG5iIG5hbWUgKi8KKwljaGFyIHRhcmdldF9yZmMxMDAxX25hbWVbUkZDMTAwMV9OQU1FX0xFTl9XSVRIX05VTExdOyAvKiBzcnZyIG5iIG5hbWUgKi8KIAl1aWRfdCBjcmVkX3VpZDsKIAl1aWRfdCBsaW51eF91aWQ7CiAJZ2lkX3QgbGludXhfZ2lkOwpAQCAtMTE1LDggKzExNSw4IEBACiAjZGVmaW5lIFRMSU5LX0VSUk9SX0VYUElSRQkoMSAqIEhaKQogI2RlZmluZSBUTElOS19JRExFX0VYUElSRQkoNjAwICogSFopCiAKLXN0YXRpYyBpbnQgaXB2NF9jb25uZWN0KHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlcik7Ci1zdGF0aWMgaW50IGlwdjZfY29ubmVjdChzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIpOworc3RhdGljIGludCBpcF9jb25uZWN0KHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlcik7CitzdGF0aWMgaW50IGdlbmVyaWNfaXBfY29ubmVjdChzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIpOwogc3RhdGljIHZvaWQgdGxpbmtfcmJfaW5zZXJ0KHN0cnVjdCByYl9yb290ICpyb290LCBzdHJ1Y3QgdGNvbl9saW5rICpuZXdfdGxpbmspOwogc3RhdGljIHZvaWQgY2lmc19wcnVuZV90bGlua3Moc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIApAQCAtMjAwLDEwICsyMDAsOSBAQAogCXdoaWxlICgoc2VydmVyLT50Y3BTdGF0dXMgIT0gQ2lmc0V4aXRpbmcpICYmCiAJICAgICAgIChzZXJ2ZXItPnRjcFN0YXR1cyAhPSBDaWZzR29vZCkpIHsKIAkJdHJ5X3RvX2ZyZWV6ZSgpOwotCQlpZiAoc2VydmVyLT5hZGRyLnNvY2tBZGRyNi5zaW42X2ZhbWlseSA9PSBBRl9JTkVUNikKLQkJCXJjID0gaXB2Nl9jb25uZWN0KHNlcnZlcik7Ci0JCWVsc2UKLQkJCXJjID0gaXB2NF9jb25uZWN0KHNlcnZlcik7CisKKwkJLyogd2Ugc2hvdWxkIHRyeSBvbmx5IHRoZSBwb3J0IHdlIGNvbm5lY3RlZCB0byBiZWZvcmUgKi8KKwkJcmMgPSBnZW5lcmljX2lwX2Nvbm5lY3Qoc2VydmVyKTsKIAkJaWYgKHJjKSB7CiAJCQljRllJKDEsICJyZWNvbm5lY3QgZXJyb3IgJWQiLCByYyk7CiAJCQltc2xlZXAoMzAwMCk7CkBAIC00NzcsNyArNDc2LDcgQEAKIAkJCSAqIGluaXRpYWxpemUgZnJhbWUpCiAJCQkgKi8KIAkJCWNpZnNfc2V0X3BvcnQoKHN0cnVjdCBzb2NrYWRkciAqKQotCQkJCQkmc2VydmVyLT5hZGRyLnNvY2tBZGRyLCBDSUZTX1BPUlQpOworCQkJCQkmc2VydmVyLT5kc3RhZGRyLCBDSUZTX1BPUlQpOwogCQkJY2lmc19yZWNvbm5lY3Qoc2VydmVyKTsKIAkJCWNzb2NrZXQgPSBzZXJ2ZXItPnNzb2NrZXQ7CiAJCQl3YWtlX3VwKCZzZXJ2ZXItPnJlc3BvbnNlX3EpOwpAQCAtODE3LDExICs4MTYsMTEgQEAKIAkgKiBpbmZvcm1hdGlvbmFsLCBvbmx5IHVzZWQgZm9yIHNlcnZlcnMgdGhhdCBkbyBub3Qgc3VwcG9ydAogCSAqIHBvcnQgNDQ1IGFuZCBpdCBjYW4gYmUgb3ZlcnJpZGRlbiBhdCBtb3VudCB0aW1lCiAJICovCi0JbWVtc2V0KHZvbC0+c291cmNlX3JmYzEwMDFfbmFtZSwgMHgyMCwgMTUpOwotCWZvciAoaSA9IDA7IGkgPCBzdHJubGVuKG5vZGVuYW1lLCAxNSk7IGkrKykKKwltZW1zZXQodm9sLT5zb3VyY2VfcmZjMTAwMV9uYW1lLCAweDIwLCBSRkMxMDAxX05BTUVfTEVOKTsKKwlmb3IgKGkgPSAwOyBpIDwgc3Rybmxlbihub2RlbmFtZSwgUkZDMTAwMV9OQU1FX0xFTik7IGkrKykKIAkJdm9sLT5zb3VyY2VfcmZjMTAwMV9uYW1lW2ldID0gdG91cHBlcihub2RlbmFtZVtpXSk7CiAKLQl2b2wtPnNvdXJjZV9yZmMxMDAxX25hbWVbMTVdID0gMDsKKwl2b2wtPnNvdXJjZV9yZmMxMDAxX25hbWVbUkZDMTAwMV9OQU1FX0xFTl0gPSAwOwogCS8qIG51bGwgdGFyZ2V0IG5hbWUgaW5kaWNhdGVzIHRvIHVzZSAqU01CU0VSVlIgZGVmYXVsdCBjYWxsZWQgbmFtZQogCSAgIGlmIHdlIGVuZCB1cCBzZW5kaW5nIFJGQzEwMDEgc2Vzc2lvbiBpbml0aWFsaXplICovCiAJdm9sLT50YXJnZXRfcmZjMTAwMV9uYW1lWzBdID0gMDsKQEAgLTk4NSwxMyArOTg0LDExIEBACiAJCQkJcmV0dXJuIDE7CiAJCQl9IGVsc2UgaWYgKHN0cm5pY21wKHZhbHVlLCAia3JiNSIsIDQpID09IDApIHsKIAkJCQl2b2wtPnNlY0ZsZyB8PSBDSUZTU0VDX01BWV9LUkI1OwotI2lmZGVmIENPTkZJR19DSUZTX0VYUEVSSU1FTlRBTAogCQkJfSBlbHNlIGlmIChzdHJuaWNtcCh2YWx1ZSwgIm50bG1zc3BpIiwgOCkgPT0gMCkgewogCQkJCXZvbC0+c2VjRmxnIHw9IENJRlNTRUNfTUFZX05UTE1TU1AgfAogCQkJCQlDSUZTU0VDX01VU1RfU0lHTjsKIAkJCX0gZWxzZSBpZiAoc3RybmljbXAodmFsdWUsICJudGxtc3NwIiwgNykgPT0gMCkgewogCQkJCXZvbC0+c2VjRmxnIHw9IENJRlNTRUNfTUFZX05UTE1TU1A7Ci0jZW5kaWYKIAkJCX0gZWxzZSBpZiAoc3RybmljbXAodmFsdWUsICJudGxtdjJpIiwgNykgPT0gMCkgewogCQkJCXZvbC0+c2VjRmxnIHw9IENJRlNTRUNfTUFZX05UTE1WMiB8CiAJCQkJCUNJRlNTRUNfTVVTVF9TSUdOOwpAQCAtMTE2OCwyMiArMTE2NSwyMiBAQAogCQkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlIHx8ICgqdmFsdWUgPT0gJyAnKSkgewogCQkJCWNGWUkoMSwgImludmFsaWQgKGVtcHR5KSBuZXRiaW9zbmFtZSIpOwogCQkJfSBlbHNlIHsKLQkJCQltZW1zZXQodm9sLT5zb3VyY2VfcmZjMTAwMV9uYW1lLCAweDIwLCAxNSk7Ci0JCQkJZm9yIChpID0gMDsgaSA8IDE1OyBpKyspIHsKLQkJCQkvKiBCQiBhcmUgdGhlcmUgY2FzZXMgaW4gd2hpY2ggYSBjb21tYSBjYW4gYmUKLQkJCQl2YWxpZCBpbiB0aGlzIHdvcmtzdGF0aW9uIG5ldGJpb3MgbmFtZSAoYW5kIG5lZWQKLQkJCQlzcGVjaWFsIGhhbmRsaW5nKT8gKi8KLQotCQkJCS8qIFdlIGRvIG5vdCB1cHBlcmNhc2UgbmV0Ymlvc25hbWUgZm9yIHVzZXIgKi8KKwkJCQltZW1zZXQodm9sLT5zb3VyY2VfcmZjMTAwMV9uYW1lLCAweDIwLAorCQkJCQlSRkMxMDAxX05BTUVfTEVOKTsKKwkJCQkvKgorCQkJCSAqIEZJWE1FOiBhcmUgdGhlcmUgY2FzZXMgaW4gd2hpY2ggYSBjb21tYSBjYW4KKwkJCQkgKiBiZSB2YWxpZCBpbiB3b3Jrc3RhdGlvbiBuZXRiaW9zIG5hbWUgKGFuZAorCQkJCSAqIG5lZWQgc3BlY2lhbCBoYW5kbGluZyk/CisJCQkJICovCisJCQkJZm9yIChpID0gMDsgaSA8IFJGQzEwMDFfTkFNRV9MRU47IGkrKykgeworCQkJCQkvKiBkb24ndCB1Y2FzZSBuZXRiaW9zbmFtZSBmb3IgdXNlciAqLwogCQkJCQlpZiAodmFsdWVbaV0gPT0gMCkKIAkJCQkJCWJyZWFrOwotCQkJCQllbHNlCi0JCQkJCQl2b2wtPnNvdXJjZV9yZmMxMDAxX25hbWVbaV0gPQotCQkJCQkJCQl2YWx1ZVtpXTsKKwkJCQkJdm9sLT5zb3VyY2VfcmZjMTAwMV9uYW1lW2ldID0gdmFsdWVbaV07CiAJCQkJfQogCQkJCS8qIFRoZSBzdHJpbmcgaGFzIDE2dGggYnl0ZSB6ZXJvIHN0aWxsIGZyb20KIAkJCQlzZXQgYXQgdG9wIG9mIHRoZSBmdW5jdGlvbiAgKi8KLQkJCQlpZiAoKGkgPT0gMTUpICYmICh2YWx1ZVtpXSAhPSAwKSkKKwkJCQlpZiAoaSA9PSBSRkMxMDAxX05BTUVfTEVOICYmIHZhbHVlW2ldICE9IDApCiAJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNJRlM6IG5ldGJpb3NuYW1lIgogCQkJCQkJIiBsb25nZXIgdGhhbiAxNSB0cnVuY2F0ZWQuXG4iKTsKIAkJCX0KQEAgLTExOTMsNyArMTE5MCw4IEBACiAJCQkJY0ZZSSgxLCAiZW1wdHkgc2VydmVyIG5ldGJpb3NuYW1lIHNwZWNpZmllZCIpOwogCQkJfSBlbHNlIHsKIAkJCQkvKiBsYXN0IGJ5dGUsIHR5cGUsIGlzIDB4MjAgZm9yIHNlcnZyIHR5cGUgKi8KLQkJCQltZW1zZXQodm9sLT50YXJnZXRfcmZjMTAwMV9uYW1lLCAweDIwLCAxNik7CisJCQkJbWVtc2V0KHZvbC0+dGFyZ2V0X3JmYzEwMDFfbmFtZSwgMHgyMCwKKwkJCQkJUkZDMTAwMV9OQU1FX0xFTl9XSVRIX05VTEwpOwogCiAJCQkJZm9yIChpID0gMDsgaSA8IDE1OyBpKyspIHsKIAkJCQkvKiBCQiBhcmUgdGhlcmUgY2FzZXMgaW4gd2hpY2ggYSBjb21tYSBjYW4gYmUKQEAgLTEyMTAsNyArMTIwOCw3IEBACiAJCQkJfQogCQkJCS8qIFRoZSBzdHJpbmcgaGFzIDE2dGggYnl0ZSB6ZXJvIHN0aWxsIGZyb20KIAkJCQkgICBzZXQgYXQgdG9wIG9mIHRoZSBmdW5jdGlvbiAgKi8KLQkJCQlpZiAoKGkgPT0gMTUpICYmICh2YWx1ZVtpXSAhPSAwKSkKKwkJCQlpZiAoaSA9PSBSRkMxMDAxX05BTUVfTEVOICYmIHZhbHVlW2ldICE9IDApCiAJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNJRlM6IHNlcnZlciBuZXQiCiAJCQkJCSJiaW9zbmFtZSBsb25nZXIgdGhhbiAxNSB0cnVuY2F0ZWQuXG4iKTsKIAkJCX0KQEAgLTEzNDEsMTAgKzEzMzksOCBAQAogCQkJdm9sLT5ub19wc3hfYWNsID0gMDsKIAkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAibm9hY2wiLCA1KSA9PSAwKSB7CiAJCQl2b2wtPm5vX3BzeF9hY2wgPSAxOwotI2lmZGVmIENPTkZJR19DSUZTX0VYUEVSSU1FTlRBTAogCQl9IGVsc2UgaWYgKHN0cm5pY21wKGRhdGEsICJsb2NhbGxlYXNlIiwgNikgPT0gMCkgewogCQkJdm9sLT5sb2NhbF9sZWFzZSA9IDE7Ci0jZW5kaWYKIAkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAic2lnbiIsIDQpID09IDApIHsKIAkJCXZvbC0+c2VjRmxnIHw9IENJRlNTRUNfTVVTVF9TSUdOOwogCQl9IGVsc2UgaWYgKHN0cm5pY21wKGRhdGEsICJzZWFsIiwgNCkgPT0gMCkgewpAQCAtMTQ1NCwzNSArMTQ1MCw3MSBAQAogCX0KIH0KIAorLyoKKyAqIElmIG5vIHBvcnQgaXMgc3BlY2lmaWVkIGluIGFkZHIgc3RydWN0dXJlLCB3ZSB0cnkgdG8gbWF0Y2ggd2l0aCA0NDUgcG9ydAorICogYW5kIGlmIGl0IGZhaWxzIC0gd2l0aCAxMzkgcG9ydHMuIEl0IHNob3VsZCBiZSBjYWxsZWQgb25seSBpZiBhZGRyZXNzCisgKiBmYW1pbGllcyBvZiBzZXJ2ZXIgYW5kIGFkZHIgYXJlIGVxdWFsLgorICovCitzdGF0aWMgYm9vbAorbWF0Y2hfcG9ydChzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsIHN0cnVjdCBzb2NrYWRkciAqYWRkcikKK3sKKwl1bnNpZ25lZCBzaG9ydCBpbnQgcG9ydCwgKnNwb3J0OworCisJc3dpdGNoIChhZGRyLT5zYV9mYW1pbHkpIHsKKwljYXNlIEFGX0lORVQ6CisJCXNwb3J0ID0gJigoc3RydWN0IHNvY2thZGRyX2luICopICZzZXJ2ZXItPmRzdGFkZHIpLT5zaW5fcG9ydDsKKwkJcG9ydCA9ICgoc3RydWN0IHNvY2thZGRyX2luICopIGFkZHIpLT5zaW5fcG9ydDsKKwkJYnJlYWs7CisJY2FzZSBBRl9JTkVUNjoKKwkJc3BvcnQgPSAmKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopICZzZXJ2ZXItPmRzdGFkZHIpLT5zaW42X3BvcnQ7CisJCXBvcnQgPSAoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikgYWRkciktPnNpbjZfcG9ydDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJV0FSTl9PTigxKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmICghcG9ydCkgeworCQlwb3J0ID0gaHRvbnMoQ0lGU19QT1JUKTsKKwkJaWYgKHBvcnQgPT0gKnNwb3J0KQorCQkJcmV0dXJuIHRydWU7CisKKwkJcG9ydCA9IGh0b25zKFJGQzEwMDFfUE9SVCk7CisJfQorCisJcmV0dXJuIHBvcnQgPT0gKnNwb3J0OworfQogCiBzdGF0aWMgYm9vbAogbWF0Y2hfYWRkcmVzcyhzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsIHN0cnVjdCBzb2NrYWRkciAqYWRkciwKIAkgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKnNyY2FkZHIpCiB7Ci0Jc3RydWN0IHNvY2thZGRyX2luICphZGRyNCA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilhZGRyOwotCXN0cnVjdCBzb2NrYWRkcl9pbjYgKmFkZHI2ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilhZGRyOwotCiAJc3dpdGNoIChhZGRyLT5zYV9mYW1pbHkpIHsKLQljYXNlIEFGX0lORVQ6Ci0JCWlmIChhZGRyNC0+c2luX2FkZHIuc19hZGRyICE9Ci0JCSAgICBzZXJ2ZXItPmFkZHIuc29ja0FkZHIuc2luX2FkZHIuc19hZGRyKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoYWRkcjQtPnNpbl9wb3J0ICYmCi0JCSAgICBhZGRyNC0+c2luX3BvcnQgIT0gc2VydmVyLT5hZGRyLnNvY2tBZGRyLnNpbl9wb3J0KQorCWNhc2UgQUZfSU5FVDogeworCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmFkZHI0ID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWFkZHI7CisJCXN0cnVjdCBzb2NrYWRkcl9pbiAqc3J2X2FkZHI0ID0KKwkJCQkJKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZzZXJ2ZXItPmRzdGFkZHI7CisKKwkJaWYgKGFkZHI0LT5zaW5fYWRkci5zX2FkZHIgIT0gc3J2X2FkZHI0LT5zaW5fYWRkci5zX2FkZHIpCiAJCQlyZXR1cm4gZmFsc2U7CiAJCWJyZWFrOwotCWNhc2UgQUZfSU5FVDY6CisJfQorCWNhc2UgQUZfSU5FVDY6IHsKKwkJc3RydWN0IHNvY2thZGRyX2luNiAqYWRkcjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKWFkZHI7CisJCXN0cnVjdCBzb2NrYWRkcl9pbjYgKnNydl9hZGRyNiA9CisJCQkJCShzdHJ1Y3Qgc29ja2FkZHJfaW42ICopJnNlcnZlci0+ZHN0YWRkcjsKKwogCQlpZiAoIWlwdjZfYWRkcl9lcXVhbCgmYWRkcjYtPnNpbjZfYWRkciwKLQkJCQkgICAgICZzZXJ2ZXItPmFkZHIuc29ja0FkZHI2LnNpbjZfYWRkcikpCisJCQkJICAgICAmc3J2X2FkZHI2LT5zaW42X2FkZHIpKQogCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoYWRkcjYtPnNpbjZfc2NvcGVfaWQgIT0KLQkJICAgIHNlcnZlci0+YWRkci5zb2NrQWRkcjYuc2luNl9zY29wZV9pZCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGFkZHI2LT5zaW42X3BvcnQgJiYKLQkJICAgIGFkZHI2LT5zaW42X3BvcnQgIT0gc2VydmVyLT5hZGRyLnNvY2tBZGRyNi5zaW42X3BvcnQpCisJCWlmIChhZGRyNi0+c2luNl9zY29wZV9pZCAhPSBzcnZfYWRkcjYtPnNpbjZfc2NvcGVfaWQpCiAJCQlyZXR1cm4gZmFsc2U7CiAJCWJyZWFrOwogCX0KKwlkZWZhdWx0OgorCQlXQVJOX09OKDEpOworCQlyZXR1cm4gZmFsc2U7IC8qIGRvbid0IGV4cGVjdCB0byBiZSBoZXJlICovCisJfQogCiAJaWYgKCFzcmNpcF9tYXRjaGVzKHNyY2FkZHIsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2VydmVyLT5zcmNhZGRyKSkKIAkJcmV0dXJuIGZhbHNlOwpAQCAtMTU0OSw2ICsxNTgxLDkgQEAKIAkJCQkgICAoc3RydWN0IHNvY2thZGRyICopJnZvbC0+c3JjYWRkcikpCiAJCQljb250aW51ZTsKIAorCQlpZiAoIW1hdGNoX3BvcnQoc2VydmVyLCBhZGRyKSkKKwkJCWNvbnRpbnVlOworCiAJCWlmICghbWF0Y2hfc2VjdXJpdHkoc2VydmVyLCB2b2wpKQogCQkJY29udGludWU7CiAKQEAgLTE2ODEsMTQgKzE3MTYsMTMgQEAKIAkJY0ZZSSgxLCAiYXR0ZW1wdGluZyBpcHY2IGNvbm5lY3QiKTsKIAkJLyogQkIgc2hvdWxkIHdlIGFsbG93IGlwdjYgb24gcG9ydCAxMzk/ICovCiAJCS8qIG90aGVyIE9TIG5ldmVyIG9ic2VydmVkIGluIFdpbGQgZG9pbmcgMTM5IHdpdGggdjYgKi8KLQkJbWVtY3B5KCZ0Y3Bfc2VzLT5hZGRyLnNvY2tBZGRyNiwgc2luX3NlcnZlcjYsCi0JCQlzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpOwotCQlyYyA9IGlwdjZfY29ubmVjdCh0Y3Bfc2VzKTsKLQl9IGVsc2UgewotCQltZW1jcHkoJnRjcF9zZXMtPmFkZHIuc29ja0FkZHIsIHNpbl9zZXJ2ZXIsCi0JCQlzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSk7Ci0JCXJjID0gaXB2NF9jb25uZWN0KHRjcF9zZXMpOwotCX0KKwkJbWVtY3B5KCZ0Y3Bfc2VzLT5kc3RhZGRyLCBzaW5fc2VydmVyNiwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSk7CisJfSBlbHNlCisJCW1lbWNweSgmdGNwX3Nlcy0+ZHN0YWRkciwgc2luX3NlcnZlciwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKTsKKworCXJjID0gaXBfY29ubmVjdCh0Y3Bfc2VzKTsKIAlpZiAocmMgPCAwKSB7CiAJCWNFUlJPUigxLCAiRXJyb3IgY29ubmVjdGluZyB0byBzb2NrZXQuIEFib3J0aW5nIG9wZXJhdGlvbiIpOwogCQlnb3RvIG91dF9lcnJfY3J5cHRvX3JlbGVhc2U7CkBAIC0xNzkzLDYgKzE4MjcsOCBAQAogewogCWludCByYyA9IC1FTk9NRU0sIHhpZDsKIAlzdHJ1Y3QgY2lmc1Nlc0luZm8gKnNlczsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmFkZHIgPSAoc3RydWN0IHNvY2thZGRyX2luICopJnNlcnZlci0+ZHN0YWRkcjsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42ICphZGRyNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopJnNlcnZlci0+ZHN0YWRkcjsKIAogCXhpZCA9IEdldFhpZCgpOwogCkBAIC0xODM2LDEyICsxODcyLDEwIEBACiAKIAkvKiBuZXcgU01CIHNlc3Npb24gdXNlcyBvdXIgc2VydmVyIHJlZiAqLwogCXNlcy0+c2VydmVyID0gc2VydmVyOwotCWlmIChzZXJ2ZXItPmFkZHIuc29ja0FkZHI2LnNpbjZfZmFtaWx5ID09IEFGX0lORVQ2KQotCQlzcHJpbnRmKHNlcy0+c2VydmVyTmFtZSwgIiVwSTYiLAotCQkJJnNlcnZlci0+YWRkci5zb2NrQWRkcjYuc2luNl9hZGRyKTsKKwlpZiAoc2VydmVyLT5kc3RhZGRyLnNzX2ZhbWlseSA9PSBBRl9JTkVUNikKKwkJc3ByaW50ZihzZXMtPnNlcnZlck5hbWUsICIlcEk2IiwgJmFkZHI2LT5zaW42X2FkZHIpOwogCWVsc2UKLQkJc3ByaW50ZihzZXMtPnNlcnZlck5hbWUsICIlcEk0IiwKLQkJCSZzZXJ2ZXItPmFkZHIuc29ja0FkZHIuc2luX2FkZHIuc19hZGRyKTsKKwkJc3ByaW50ZihzZXMtPnNlcnZlck5hbWUsICIlcEk0IiwgJmFkZHItPnNpbl9hZGRyKTsKIAogCWlmICh2b2x1bWVfaW5mby0+dXNlcm5hbWUpCiAJCXN0cm5jcHkoc2VzLT51c2VyTmFtZSwgdm9sdW1lX2luZm8tPnVzZXJuYW1lLApAQCAtMjEzNiwxOSArMjE3MCwxMDYgQEAKIH0KIAogc3RhdGljIGludAotaXB2NF9jb25uZWN0KHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlcikKK2lwX3JmYzEwMDFfY29ubmVjdChzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIpCiB7CiAJaW50IHJjID0gMDsKLQlpbnQgdmFsOwotCWJvb2wgY29ubmVjdGVkID0gZmFsc2U7Ci0JX19iZTE2IG9yaWdfcG9ydCA9IDA7CisJLyoKKwkgKiBzb21lIHNlcnZlcnMgcmVxdWlyZSBSRkMxMDAxIHNlc3Npbml0IGJlZm9yZSBzZW5kaW5nCisJICogbmVncHJvdCAtIEJCIGNoZWNrIHJlY29ubmVjdGlvbiBpbiBjYXNlIHdoZXJlIHNlY29uZAorCSAqIHNlc3Npbml0IGlzIHNlbnQgYnV0IG5vIHNlY29uZCBuZWdwcm90CisJICovCisJc3RydWN0IHJmYzEwMDJfc2Vzc2lvbl9wYWNrZXQgKnNlc19pbml0X2J1ZjsKKwlzdHJ1Y3Qgc21iX2hkciAqc21iX2J1ZjsKKwlzZXNfaW5pdF9idWYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmZjMTAwMl9zZXNzaW9uX3BhY2tldCksCisJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKHNlc19pbml0X2J1ZikgeworCQlzZXNfaW5pdF9idWYtPnRyYWlsZXIuc2Vzc2lvbl9yZXEuY2FsbGVkX2xlbiA9IDMyOworCisJCWlmIChzZXJ2ZXItPnNlcnZlcl9SRkMxMDAxX25hbWUgJiYKKwkJICAgIHNlcnZlci0+c2VydmVyX1JGQzEwMDFfbmFtZVswXSAhPSAwKQorCQkJcmZjMTAwMm1hbmdsZShzZXNfaW5pdF9idWYtPnRyYWlsZXIuCisJCQkJICAgICAgc2Vzc2lvbl9yZXEuY2FsbGVkX25hbWUsCisJCQkJICAgICAgc2VydmVyLT5zZXJ2ZXJfUkZDMTAwMV9uYW1lLAorCQkJCSAgICAgIFJGQzEwMDFfTkFNRV9MRU5fV0lUSF9OVUxMKTsKKwkJZWxzZQorCQkJcmZjMTAwMm1hbmdsZShzZXNfaW5pdF9idWYtPnRyYWlsZXIuCisJCQkJICAgICAgc2Vzc2lvbl9yZXEuY2FsbGVkX25hbWUsCisJCQkJICAgICAgREVGQVVMVF9DSUZTX0NBTExFRF9OQU1FLAorCQkJCSAgICAgIFJGQzEwMDFfTkFNRV9MRU5fV0lUSF9OVUxMKTsKKworCQlzZXNfaW5pdF9idWYtPnRyYWlsZXIuc2Vzc2lvbl9yZXEuY2FsbGluZ19sZW4gPSAzMjsKKworCQkvKgorCQkgKiBjYWxsaW5nIG5hbWUgZW5kcyBpbiBudWxsIChieXRlIDE2KSBmcm9tIG9sZCBzbWIKKwkJICogY29udmVudGlvbi4KKwkJICovCisJCWlmIChzZXJ2ZXItPndvcmtzdGF0aW9uX1JGQzEwMDFfbmFtZSAmJgorCQkgICAgc2VydmVyLT53b3Jrc3RhdGlvbl9SRkMxMDAxX25hbWVbMF0gIT0gMCkKKwkJCXJmYzEwMDJtYW5nbGUoc2VzX2luaXRfYnVmLT50cmFpbGVyLgorCQkJCSAgICAgIHNlc3Npb25fcmVxLmNhbGxpbmdfbmFtZSwKKwkJCQkgICAgICBzZXJ2ZXItPndvcmtzdGF0aW9uX1JGQzEwMDFfbmFtZSwKKwkJCQkgICAgICBSRkMxMDAxX05BTUVfTEVOX1dJVEhfTlVMTCk7CisJCWVsc2UKKwkJCXJmYzEwMDJtYW5nbGUoc2VzX2luaXRfYnVmLT50cmFpbGVyLgorCQkJCSAgICAgIHNlc3Npb25fcmVxLmNhbGxpbmdfbmFtZSwKKwkJCQkgICAgICAiTElOVVhfQ0lGU19DTE5UIiwKKwkJCQkgICAgICBSRkMxMDAxX05BTUVfTEVOX1dJVEhfTlVMTCk7CisKKwkJc2VzX2luaXRfYnVmLT50cmFpbGVyLnNlc3Npb25fcmVxLnNjb3BlMSA9IDA7CisJCXNlc19pbml0X2J1Zi0+dHJhaWxlci5zZXNzaW9uX3JlcS5zY29wZTIgPSAwOworCQlzbWJfYnVmID0gKHN0cnVjdCBzbWJfaGRyICopc2VzX2luaXRfYnVmOworCisJCS8qIHNpemVvZiBSRkMxMDAyX1NFU1NJT05fUkVRVUVTVCB3aXRoIG5vIHNjb3BlICovCisJCXNtYl9idWYtPnNtYl9idWZfbGVuZ3RoID0gMHg4MTAwMDA0NDsKKwkJcmMgPSBzbWJfc2VuZChzZXJ2ZXIsIHNtYl9idWYsIDB4NDQpOworCQlrZnJlZShzZXNfaW5pdF9idWYpOworCQkvKgorCQkgKiBSRkMxMDAxIGxheWVyIGluIGF0IGxlYXN0IG9uZSBzZXJ2ZXIKKwkJICogcmVxdWlyZXMgdmVyeSBzaG9ydCBicmVhayBiZWZvcmUgbmVncHJvdAorCQkgKiBwcmVzdW1hYmx5IGJlY2F1c2Ugbm90IGV4cGVjdGluZyBuZWdwcm90CisJCSAqIHRvIGZvbGxvdyBzbyBmYXN0LiAgVGhpcyBpcyBhIHNpbXBsZQorCQkgKiBzb2x1dGlvbiB0aGF0IHdvcmtzIHdpdGhvdXQKKwkJICogY29tcGxpY2F0aW5nIHRoZSBjb2RlIGFuZCBjYXVzZXMgbm8KKwkJICogc2lnbmlmaWNhbnQgc2xvd2luZyBkb3duIG9uIG1vdW50CisJCSAqIGZvciBldmVyeW9uZSBlbHNlCisJCSAqLworCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7CisJfQorCS8qCisJICogZWxzZSB0aGUgbmVncHJvdCBtYXkgc3RpbGwgd29yayB3aXRob3V0IHRoaXMKKwkgKiBldmVuIHRob3VnaCBtYWxsb2MgZmFpbGVkCisJICovCisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQKK2dlbmVyaWNfaXBfY29ubmVjdChzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIpCit7CisJaW50IHJjID0gMDsKKwl1bnNpZ25lZCBzaG9ydCBpbnQgc3BvcnQ7CisJaW50IHNsZW4sIHNmYW1pbHk7CiAJc3RydWN0IHNvY2tldCAqc29ja2V0ID0gc2VydmVyLT5zc29ja2V0OworCXN0cnVjdCBzb2NrYWRkciAqc2FkZHI7CisKKwlzYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNlcnZlci0+ZHN0YWRkcjsKKworCWlmIChzZXJ2ZXItPmRzdGFkZHIuc3NfZmFtaWx5ID09IEFGX0lORVQ2KSB7CisJCXNwb3J0ID0gKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopIHNhZGRyKS0+c2luNl9wb3J0OworCQlzbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpOworCQlzZmFtaWx5ID0gQUZfSU5FVDY7CisJfSBlbHNlIHsKKwkJc3BvcnQgPSAoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSBzYWRkciktPnNpbl9wb3J0OworCQlzbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CisJCXNmYW1pbHkgPSBBRl9JTkVUOworCX0KIAogCWlmIChzb2NrZXQgPT0gTlVMTCkgewotCQlyYyA9IHNvY2tfY3JlYXRlX2tlcm4oUEZfSU5FVCwgU09DS19TVFJFQU0sCisJCXJjID0gc29ja19jcmVhdGVfa2VybihzZmFtaWx5LCBTT0NLX1NUUkVBTSwKIAkJCQkgICAgICBJUFBST1RPX1RDUCwgJnNvY2tldCk7CiAJCWlmIChyYyA8IDApIHsKIAkJCWNFUlJPUigxLCAiRXJyb3IgJWQgY3JlYXRpbmcgc29ja2V0IiwgcmMpOworCQkJc2VydmVyLT5zc29ja2V0ID0gTlVMTDsKIAkJCXJldHVybiByYzsKIAkJfQogCkBAIC0yMTU2LDIxOCArMjI3NywxOSBAQAogCQljRllJKDEsICJTb2NrZXQgY3JlYXRlZCIpOwogCQlzZXJ2ZXItPnNzb2NrZXQgPSBzb2NrZXQ7CiAJCXNvY2tldC0+c2stPnNrX2FsbG9jYXRpb24gPSBHRlBfTk9GUzsKLQkJY2lmc19yZWNsYXNzaWZ5X3NvY2tldDQoc29ja2V0KTsKKwkJaWYgKHNmYW1pbHkgPT0gQUZfSU5FVDYpCisJCQljaWZzX3JlY2xhc3NpZnlfc29ja2V0Nihzb2NrZXQpOworCQllbHNlCisJCQljaWZzX3JlY2xhc3NpZnlfc29ja2V0NChzb2NrZXQpOwogCX0KIAogCXJjID0gYmluZF9zb2NrZXQoc2VydmVyKTsKIAlpZiAocmMgPCAwKQogCQlyZXR1cm4gcmM7CiAKLQkvKiB1c2VyIG92ZXJyb2RlIGRlZmF1bHQgcG9ydCAqLwotCWlmIChzZXJ2ZXItPmFkZHIuc29ja0FkZHIuc2luX3BvcnQpIHsKLQkJcmMgPSBzb2NrZXQtPm9wcy0+Y29ubmVjdChzb2NrZXQsIChzdHJ1Y3Qgc29ja2FkZHIgKikKLQkJCQkJICAmc2VydmVyLT5hZGRyLnNvY2tBZGRyLAotCQkJCQkgIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pLCAwKTsKLQkJaWYgKHJjID49IDApCi0JCQljb25uZWN0ZWQgPSB0cnVlOwotCX0KLQotCWlmICghY29ubmVjdGVkKSB7Ci0JCS8qIHNhdmUgb3JpZ2luYWwgcG9ydCBzbyB3ZSBjYW4gcmV0cnkgdXNlciBzcGVjaWZpZWQgcG9ydAotCQkJbGF0ZXIgaWYgZmFsbCBiYWNrIHBvcnRzIGZhaWwgdGhpcyB0aW1lICAqLwotCQlvcmlnX3BvcnQgPSBzZXJ2ZXItPmFkZHIuc29ja0FkZHIuc2luX3BvcnQ7Ci0KLQkJLyogZG8gbm90IHJldHJ5IG9uIHRoZSBzYW1lIHBvcnQgd2UganVzdCBmYWlsZWQgb24gKi8KLQkJaWYgKHNlcnZlci0+YWRkci5zb2NrQWRkci5zaW5fcG9ydCAhPSBodG9ucyhDSUZTX1BPUlQpKSB7Ci0JCQlzZXJ2ZXItPmFkZHIuc29ja0FkZHIuc2luX3BvcnQgPSBodG9ucyhDSUZTX1BPUlQpOwotCQkJcmMgPSBzb2NrZXQtPm9wcy0+Y29ubmVjdChzb2NrZXQsCi0JCQkJCQkoc3RydWN0IHNvY2thZGRyICopCi0JCQkJCQkmc2VydmVyLT5hZGRyLnNvY2tBZGRyLAotCQkJCQkJc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbiksIDApOwotCQkJaWYgKHJjID49IDApCi0JCQkJY29ubmVjdGVkID0gdHJ1ZTsKLQkJfQotCX0KLQlpZiAoIWNvbm5lY3RlZCkgewotCQlzZXJ2ZXItPmFkZHIuc29ja0FkZHIuc2luX3BvcnQgPSBodG9ucyhSRkMxMDAxX1BPUlQpOwotCQlyYyA9IHNvY2tldC0+b3BzLT5jb25uZWN0KHNvY2tldCwgKHN0cnVjdCBzb2NrYWRkciAqKQotCQkJCQkgICAgICAmc2VydmVyLT5hZGRyLnNvY2tBZGRyLAotCQkJCQkgICAgICBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSwgMCk7Ci0JCWlmIChyYyA+PSAwKQotCQkJY29ubmVjdGVkID0gdHJ1ZTsKLQl9Ci0KLQkvKiBnaXZlIHVwIGhlcmUgLSB1bmxlc3Mgd2Ugd2FudCB0byByZXRyeSBvbiBkaWZmZXJlbnQKLQkJcHJvdG9jb2wgZmFtaWxpZXMgc29tZSBkYXkgKi8KLQlpZiAoIWNvbm5lY3RlZCkgewotCQlpZiAob3JpZ19wb3J0KQotCQkJc2VydmVyLT5hZGRyLnNvY2tBZGRyLnNpbl9wb3J0ID0gb3JpZ19wb3J0OwotCQljRllJKDEsICJFcnJvciAlZCBjb25uZWN0aW5nIHRvIHNlcnZlciB2aWEgaXB2NCIsIHJjKTsKLQkJc29ja19yZWxlYXNlKHNvY2tldCk7Ci0JCXNlcnZlci0+c3NvY2tldCA9IE5VTEw7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQotCS8qCi0JICogRXZlbnR1YWxseSBjaGVjayBmb3Igb3RoZXIgc29ja2V0IG9wdGlvbnMgdG8gY2hhbmdlIGZyb20KLQkgKiAgdGhlIGRlZmF1bHQuIHNvY2tfc2V0c29ja29wdCBub3QgdXNlZCBiZWNhdXNlIGl0IGV4cGVjdHMKLQkgKiAgdXNlciBzcGFjZSBidWZmZXIKLQkgKi8KLQlzb2NrZXQtPnNrLT5za19yY3Z0aW1lbyA9IDcgKiBIWjsKLQlzb2NrZXQtPnNrLT5za19zbmR0aW1lbyA9IDUgKiBIWjsKLQotCS8qIG1ha2UgdGhlIGJ1ZnNpemVzIGRlcGVuZCBvbiB3c2l6ZS9yc2l6ZSBhbmQgbWF4IHJlcXVlc3RzICovCi0JaWYgKHNlcnZlci0+bm9hdXRvdHVuZSkgewotCQlpZiAoc29ja2V0LT5zay0+c2tfc25kYnVmIDwgKDIwMCAqIDEwMjQpKQotCQkJc29ja2V0LT5zay0+c2tfc25kYnVmID0gMjAwICogMTAyNDsKLQkJaWYgKHNvY2tldC0+c2stPnNrX3JjdmJ1ZiA8ICgxNDAgKiAxMDI0KSkKLQkJCXNvY2tldC0+c2stPnNrX3JjdmJ1ZiA9IDE0MCAqIDEwMjQ7Ci0JfQotCi0JaWYgKHNlcnZlci0+dGNwX25vZGVsYXkpIHsKLQkJdmFsID0gMTsKLQkJcmMgPSBrZXJuZWxfc2V0c29ja29wdChzb2NrZXQsIFNPTF9UQ1AsIFRDUF9OT0RFTEFZLAotCQkJCShjaGFyICopJnZhbCwgc2l6ZW9mKHZhbCkpOwotCQlpZiAocmMpCi0JCQljRllJKDEsICJzZXQgVENQX05PREVMQVkgc29ja2V0IG9wdGlvbiBlcnJvciAlZCIsIHJjKTsKLQl9Ci0KLQkgY0ZZSSgxLCAic25kYnVmICVkIHJjdmJ1ZiAlZCByY3Z0aW1lbyAweCVseCIsCi0JCSBzb2NrZXQtPnNrLT5za19zbmRidWYsCi0JCSBzb2NrZXQtPnNrLT5za19yY3ZidWYsIHNvY2tldC0+c2stPnNrX3JjdnRpbWVvKTsKLQotCS8qIHNlbmQgUkZDMTAwMSBzZXNzaW5pdCAqLwotCWlmIChzZXJ2ZXItPmFkZHIuc29ja0FkZHIuc2luX3BvcnQgPT0gaHRvbnMoUkZDMTAwMV9QT1JUKSkgewotCQkvKiBzb21lIHNlcnZlcnMgcmVxdWlyZSBSRkMxMDAxIHNlc3Npbml0IGJlZm9yZSBzZW5kaW5nCi0JCW5lZ3Byb3QgLSBCQiBjaGVjayByZWNvbm5lY3Rpb24gaW4gY2FzZSB3aGVyZSBzZWNvbmQKLQkJc2Vzc2luaXQgaXMgc2VudCBidXQgbm8gc2Vjb25kIG5lZ3Byb3QgKi8KLQkJc3RydWN0IHJmYzEwMDJfc2Vzc2lvbl9wYWNrZXQgKnNlc19pbml0X2J1ZjsKLQkJc3RydWN0IHNtYl9oZHIgKnNtYl9idWY7Ci0JCXNlc19pbml0X2J1ZiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByZmMxMDAyX3Nlc3Npb25fcGFja2V0KSwKLQkJCQkgICAgICAgR0ZQX0tFUk5FTCk7Ci0JCWlmIChzZXNfaW5pdF9idWYpIHsKLQkJCXNlc19pbml0X2J1Zi0+dHJhaWxlci5zZXNzaW9uX3JlcS5jYWxsZWRfbGVuID0gMzI7Ci0JCQlpZiAoc2VydmVyLT5zZXJ2ZXJfUkZDMTAwMV9uYW1lICYmCi0JCQkgICAgc2VydmVyLT5zZXJ2ZXJfUkZDMTAwMV9uYW1lWzBdICE9IDApCi0JCQkJcmZjMTAwMm1hbmdsZShzZXNfaW5pdF9idWYtPnRyYWlsZXIuCi0JCQkJCQlzZXNzaW9uX3JlcS5jYWxsZWRfbmFtZSwKLQkJCQkJICAgICAgc2VydmVyLT5zZXJ2ZXJfUkZDMTAwMV9uYW1lLAotCQkJCQkgICAgICBSRkMxMDAxX05BTUVfTEVOX1dJVEhfTlVMTCk7Ci0JCQllbHNlCi0JCQkJcmZjMTAwMm1hbmdsZShzZXNfaW5pdF9idWYtPnRyYWlsZXIuCi0JCQkJCQlzZXNzaW9uX3JlcS5jYWxsZWRfbmFtZSwKLQkJCQkJICAgICAgREVGQVVMVF9DSUZTX0NBTExFRF9OQU1FLAotCQkJCQkgICAgICBSRkMxMDAxX05BTUVfTEVOX1dJVEhfTlVMTCk7Ci0KLQkJCXNlc19pbml0X2J1Zi0+dHJhaWxlci5zZXNzaW9uX3JlcS5jYWxsaW5nX2xlbiA9IDMyOwotCi0JCQkvKiBjYWxsaW5nIG5hbWUgZW5kcyBpbiBudWxsIChieXRlIDE2KSBmcm9tIG9sZCBzbWIKLQkJCWNvbnZlbnRpb24uICovCi0JCQlpZiAoc2VydmVyLT53b3Jrc3RhdGlvbl9SRkMxMDAxX25hbWUgJiYKLQkJCSAgICBzZXJ2ZXItPndvcmtzdGF0aW9uX1JGQzEwMDFfbmFtZVswXSAhPSAwKQotCQkJCXJmYzEwMDJtYW5nbGUoc2VzX2luaXRfYnVmLT50cmFpbGVyLgotCQkJCQkJc2Vzc2lvbl9yZXEuY2FsbGluZ19uYW1lLAotCQkJCQkgICAgICBzZXJ2ZXItPndvcmtzdGF0aW9uX1JGQzEwMDFfbmFtZSwKLQkJCQkJICAgICAgUkZDMTAwMV9OQU1FX0xFTl9XSVRIX05VTEwpOwotCQkJZWxzZQotCQkJCXJmYzEwMDJtYW5nbGUoc2VzX2luaXRfYnVmLT50cmFpbGVyLgotCQkJCQkJc2Vzc2lvbl9yZXEuY2FsbGluZ19uYW1lLAotCQkJCQkgICAgICAiTElOVVhfQ0lGU19DTE5UIiwKLQkJCQkJICAgICAgUkZDMTAwMV9OQU1FX0xFTl9XSVRIX05VTEwpOwotCi0JCQlzZXNfaW5pdF9idWYtPnRyYWlsZXIuc2Vzc2lvbl9yZXEuc2NvcGUxID0gMDsKLQkJCXNlc19pbml0X2J1Zi0+dHJhaWxlci5zZXNzaW9uX3JlcS5zY29wZTIgPSAwOwotCQkJc21iX2J1ZiA9IChzdHJ1Y3Qgc21iX2hkciAqKXNlc19pbml0X2J1ZjsKLQkJCS8qIHNpemVvZiBSRkMxMDAyX1NFU1NJT05fUkVRVUVTVCB3aXRoIG5vIHNjb3BlICovCi0JCQlzbWJfYnVmLT5zbWJfYnVmX2xlbmd0aCA9IDB4ODEwMDAwNDQ7Ci0JCQlyYyA9IHNtYl9zZW5kKHNlcnZlciwgc21iX2J1ZiwgMHg0NCk7Ci0JCQlrZnJlZShzZXNfaW5pdF9idWYpOwotCQkJbXNsZWVwKDEpOyAvKiBSRkMxMDAxIGxheWVyIGluIGF0IGxlYXN0IG9uZSBzZXJ2ZXIKLQkJCQkgICAgICByZXF1aXJlcyB2ZXJ5IHNob3J0IGJyZWFrIGJlZm9yZSBuZWdwcm90Ci0JCQkJICAgICAgcHJlc3VtYWJseSBiZWNhdXNlIG5vdCBleHBlY3RpbmcgbmVncHJvdAotCQkJCSAgICAgIHRvIGZvbGxvdyBzbyBmYXN0LiAgVGhpcyBpcyBhIHNpbXBsZQotCQkJCSAgICAgIHNvbHV0aW9uIHRoYXQgd29ya3Mgd2l0aG91dAotCQkJCSAgICAgIGNvbXBsaWNhdGluZyB0aGUgY29kZSBhbmQgY2F1c2VzIG5vCi0JCQkJICAgICAgc2lnbmlmaWNhbnQgc2xvd2luZyBkb3duIG9uIG1vdW50Ci0JCQkJICAgICAgZm9yIGV2ZXJ5b25lIGVsc2UgKi8KLQkJfQotCQkvKiBlbHNlIHRoZSBuZWdwcm90IG1heSBzdGlsbCB3b3JrIHdpdGhvdXQgdGhpcwotCQlldmVuIHRob3VnaCBtYWxsb2MgZmFpbGVkICovCi0KLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQKLWlwdjZfY29ubmVjdChzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIpCi17Ci0JaW50IHJjID0gMDsKLQlpbnQgdmFsOwotCWJvb2wgY29ubmVjdGVkID0gZmFsc2U7Ci0JX19iZTE2IG9yaWdfcG9ydCA9IDA7Ci0Jc3RydWN0IHNvY2tldCAqc29ja2V0ID0gc2VydmVyLT5zc29ja2V0OwotCi0JaWYgKHNvY2tldCA9PSBOVUxMKSB7Ci0JCXJjID0gc29ja19jcmVhdGVfa2VybihQRl9JTkVUNiwgU09DS19TVFJFQU0sCi0JCQkJICAgICAgSVBQUk9UT19UQ1AsICZzb2NrZXQpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQljRVJST1IoMSwgIkVycm9yICVkIGNyZWF0aW5nIGlwdjYgc29ja2V0IiwgcmMpOwotCQkJc29ja2V0ID0gTlVMTDsKLQkJCXJldHVybiByYzsKLQkJfQotCi0JCS8qIEJCIG90aGVyIHNvY2tldCBvcHRpb25zIHRvIHNldCBLRUVQQUxJVkUsIE5PREVMQVk/ICovCi0JCWNGWUkoMSwgImlwdjYgU29ja2V0IGNyZWF0ZWQiKTsKLQkJc2VydmVyLT5zc29ja2V0ID0gc29ja2V0OwotCQlzb2NrZXQtPnNrLT5za19hbGxvY2F0aW9uID0gR0ZQX05PRlM7Ci0JCWNpZnNfcmVjbGFzc2lmeV9zb2NrZXQ2KHNvY2tldCk7Ci0JfQotCi0JcmMgPSBiaW5kX3NvY2tldChzZXJ2ZXIpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCS8qIHVzZXIgb3ZlcnJvZGUgZGVmYXVsdCBwb3J0ICovCi0JaWYgKHNlcnZlci0+YWRkci5zb2NrQWRkcjYuc2luNl9wb3J0KSB7Ci0JCXJjID0gc29ja2V0LT5vcHMtPmNvbm5lY3Qoc29ja2V0LAotCQkJCShzdHJ1Y3Qgc29ja2FkZHIgKikgJnNlcnZlci0+YWRkci5zb2NrQWRkcjYsCi0JCQkJc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpLCAwKTsKLQkJaWYgKHJjID49IDApCi0JCQljb25uZWN0ZWQgPSB0cnVlOwotCX0KLQotCWlmICghY29ubmVjdGVkKSB7Ci0JCS8qIHNhdmUgb3JpZ2luYWwgcG9ydCBzbyB3ZSBjYW4gcmV0cnkgdXNlciBzcGVjaWZpZWQgcG9ydAotCQkJbGF0ZXIgaWYgZmFsbCBiYWNrIHBvcnRzIGZhaWwgdGhpcyB0aW1lICAqLwotCi0JCW9yaWdfcG9ydCA9IHNlcnZlci0+YWRkci5zb2NrQWRkcjYuc2luNl9wb3J0OwotCQkvKiBkbyBub3QgcmV0cnkgb24gdGhlIHNhbWUgcG9ydCB3ZSBqdXN0IGZhaWxlZCBvbiAqLwotCQlpZiAoc2VydmVyLT5hZGRyLnNvY2tBZGRyNi5zaW42X3BvcnQgIT0gaHRvbnMoQ0lGU19QT1JUKSkgewotCQkJc2VydmVyLT5hZGRyLnNvY2tBZGRyNi5zaW42X3BvcnQgPSBodG9ucyhDSUZTX1BPUlQpOwotCQkJcmMgPSBzb2NrZXQtPm9wcy0+Y29ubmVjdChzb2NrZXQsIChzdHJ1Y3Qgc29ja2FkZHIgKikKLQkJCQkJJnNlcnZlci0+YWRkci5zb2NrQWRkcjYsCi0JCQkJCXNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSwgMCk7Ci0JCQlpZiAocmMgPj0gMCkKLQkJCQljb25uZWN0ZWQgPSB0cnVlOwotCQl9Ci0JfQotCWlmICghY29ubmVjdGVkKSB7Ci0JCXNlcnZlci0+YWRkci5zb2NrQWRkcjYuc2luNl9wb3J0ID0gaHRvbnMoUkZDMTAwMV9QT1JUKTsKLQkJcmMgPSBzb2NrZXQtPm9wcy0+Y29ubmVjdChzb2NrZXQsIChzdHJ1Y3Qgc29ja2FkZHIgKikKLQkJCQkmc2VydmVyLT5hZGRyLnNvY2tBZGRyNiwKLQkJCQlzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNiksIDApOwotCQlpZiAocmMgPj0gMCkKLQkJCWNvbm5lY3RlZCA9IHRydWU7Ci0JfQotCi0JLyogZ2l2ZSB1cCBoZXJlIC0gdW5sZXNzIHdlIHdhbnQgdG8gcmV0cnkgb24gZGlmZmVyZW50Ci0JCXByb3RvY29sIGZhbWlsaWVzIHNvbWUgZGF5ICovCi0JaWYgKCFjb25uZWN0ZWQpIHsKLQkJaWYgKG9yaWdfcG9ydCkKLQkJCXNlcnZlci0+YWRkci5zb2NrQWRkcjYuc2luNl9wb3J0ID0gb3JpZ19wb3J0OwotCQljRllJKDEsICJFcnJvciAlZCBjb25uZWN0aW5nIHRvIHNlcnZlciB2aWEgaXB2NiIsIHJjKTsKKwlyYyA9IHNvY2tldC0+b3BzLT5jb25uZWN0KHNvY2tldCwgc2FkZHIsIHNsZW4sIDApOworCWlmIChyYyA8IDApIHsKKwkJY0ZZSSgxLCAiRXJyb3IgJWQgY29ubmVjdGluZyB0byBzZXJ2ZXIiLCByYyk7CiAJCXNvY2tfcmVsZWFzZShzb2NrZXQpOwogCQlzZXJ2ZXItPnNzb2NrZXQgPSBOVUxMOwogCQlyZXR1cm4gcmM7CkBAIC0yMzgxLDE5ICsyMzAzLDYxIEBACiAJc29ja2V0LT5zay0+c2tfcmN2dGltZW8gPSA3ICogSFo7CiAJc29ja2V0LT5zay0+c2tfc25kdGltZW8gPSA1ICogSFo7CiAKKwkvKiBtYWtlIHRoZSBidWZzaXplcyBkZXBlbmQgb24gd3NpemUvcnNpemUgYW5kIG1heCByZXF1ZXN0cyAqLworCWlmIChzZXJ2ZXItPm5vYXV0b3R1bmUpIHsKKwkJaWYgKHNvY2tldC0+c2stPnNrX3NuZGJ1ZiA8ICgyMDAgKiAxMDI0KSkKKwkJCXNvY2tldC0+c2stPnNrX3NuZGJ1ZiA9IDIwMCAqIDEwMjQ7CisJCWlmIChzb2NrZXQtPnNrLT5za19yY3ZidWYgPCAoMTQwICogMTAyNCkpCisJCQlzb2NrZXQtPnNrLT5za19yY3ZidWYgPSAxNDAgKiAxMDI0OworCX0KKwogCWlmIChzZXJ2ZXItPnRjcF9ub2RlbGF5KSB7Ci0JCXZhbCA9IDE7CisJCWludCB2YWwgPSAxOwogCQlyYyA9IGtlcm5lbF9zZXRzb2Nrb3B0KHNvY2tldCwgU09MX1RDUCwgVENQX05PREVMQVksCiAJCQkJKGNoYXIgKikmdmFsLCBzaXplb2YodmFsKSk7CiAJCWlmIChyYykKIAkJCWNGWUkoMSwgInNldCBUQ1BfTk9ERUxBWSBzb2NrZXQgb3B0aW9uIGVycm9yICVkIiwgcmMpOwogCX0KIAotCXNlcnZlci0+c3NvY2tldCA9IHNvY2tldDsKKwkgY0ZZSSgxLCAic25kYnVmICVkIHJjdmJ1ZiAlZCByY3Z0aW1lbyAweCVseCIsCisJCSBzb2NrZXQtPnNrLT5za19zbmRidWYsCisJCSBzb2NrZXQtPnNrLT5za19yY3ZidWYsIHNvY2tldC0+c2stPnNrX3JjdnRpbWVvKTsKKworCWlmIChzcG9ydCA9PSBodG9ucyhSRkMxMDAxX1BPUlQpKQorCQlyYyA9IGlwX3JmYzEwMDFfY29ubmVjdChzZXJ2ZXIpOwogCiAJcmV0dXJuIHJjOwogfQogCitzdGF0aWMgaW50CitpcF9jb25uZWN0KHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlcikKK3sKKwl1bnNpZ25lZCBzaG9ydCBpbnQgKnNwb3J0OworCXN0cnVjdCBzb2NrYWRkcl9pbjYgKmFkZHI2ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikmc2VydmVyLT5kc3RhZGRyOworCXN0cnVjdCBzb2NrYWRkcl9pbiAqYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmc2VydmVyLT5kc3RhZGRyOworCisJaWYgKHNlcnZlci0+ZHN0YWRkci5zc19mYW1pbHkgPT0gQUZfSU5FVDYpCisJCXNwb3J0ID0gJmFkZHI2LT5zaW42X3BvcnQ7CisJZWxzZQorCQlzcG9ydCA9ICZhZGRyLT5zaW5fcG9ydDsKKworCWlmICgqc3BvcnQgPT0gMCkgeworCQlpbnQgcmM7CisKKwkJLyogdHJ5IHdpdGggNDQ1IHBvcnQgYXQgZmlyc3QgKi8KKwkJKnNwb3J0ID0gaHRvbnMoQ0lGU19QT1JUKTsKKworCQlyYyA9IGdlbmVyaWNfaXBfY29ubmVjdChzZXJ2ZXIpOworCQlpZiAocmMgPj0gMCkKKwkJCXJldHVybiByYzsKKworCQkvKiBpZiBpdCBmYWlsZWQsIHRyeSB3aXRoIDEzOSBwb3J0ICovCisJCSpzcG9ydCA9IGh0b25zKFJGQzEwMDFfUE9SVCk7CisJfQorCisJcmV0dXJuIGdlbmVyaWNfaXBfY29ubmVjdChzZXJ2ZXIpOworfQorCiB2b2lkIHJlc2V0X2NpZnNfdW5peF9jYXBzKGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sCiAJCQkgIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBzbWJfdm9sICp2b2xfaW5mbykKIHsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvZGlyLmMgYi9mcy9jaWZzL2Rpci5jCmluZGV4IGRiMmE1OGMuLjJlNzczODIgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvZGlyLmMKKysrIGIvZnMvY2lmcy9kaXIuYwpAQCAtMjkzLDEwICsyOTMsOCBAQAogCQkJYXJncy51aWQgPSBOT19DSEFOR0VfNjQ7CiAJCQlhcmdzLmdpZCA9IE5PX0NIQU5HRV82NDsKIAkJfQotCQlDSUZTU01CVW5peFNldFBhdGhJbmZvKHhpZCwgdGNvbiwgZnVsbF9wYXRoLCAmYXJncywKLQkJCQkJY2lmc19zYi0+bG9jYWxfbmxzLAotCQkJCQljaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmCi0JCQkJCQlDSUZTX01PVU5UX01BUF9TUEVDSUFMX0NIUik7CisJCUNJRlNTTUJVbml4U2V0RmlsZUluZm8oeGlkLCB0Y29uLCAmYXJncywgZmlsZUhhbmRsZSwKKwkJCQkJY3VycmVudC0+dGdpZCk7CiAJfSBlbHNlIHsKIAkJLyogQkIgaW1wbGVtZW50IG1vZGUgc2V0dGluZyB2aWEgV2luZG93cyBzZWN1cml0eQogCQkgICBkZXNjcmlwdG9ycyBlLmcuICovCmRpZmYgLS1naXQgYS9mcy9jaWZzL2ZpbGUuYyBiL2ZzL2NpZnMvZmlsZS5jCmluZGV4IDVhMjg2NjAuLmQ4NDM2MzEgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvZmlsZS5jCisrKyBiL2ZzL2NpZnMvZmlsZS5jCkBAIC0xMDQsNTMgKzEwNCw2IEBACiAJCXJldHVybiBGSUxFX09QRU47CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGNpZnNfb3Blbl9pbm9kZV9oZWxwZXIoc3RydWN0IGlub2RlICppbm9kZSwKLQlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbiwgX191MzIgb3Bsb2NrLCBGSUxFX0FMTF9JTkZPICpidWYsCi0JY2hhciAqZnVsbF9wYXRoLCBpbnQgeGlkKQotewotCXN0cnVjdCBjaWZzSW5vZGVJbmZvICpwQ2lmc0lub2RlID0gQ0lGU19JKGlub2RlKTsKLQlzdHJ1Y3QgdGltZXNwZWMgdGVtcDsKLQlpbnQgcmM7Ci0KLQlpZiAocENpZnNJbm9kZS0+Y2xpZW50Q2FuQ2FjaGVSZWFkKSB7Ci0JCS8qIHdlIGhhdmUgdGhlIGlub2RlIG9wZW4gc29tZXdoZXJlIGVsc2UKLQkJICAgbm8gbmVlZCB0byBkaXNjYXJkIGNhY2hlIGRhdGEgKi8KLQkJZ290byBjbGllbnRfY2FuX2NhY2hlOwotCX0KLQotCS8qIEJCIG5lZWQgc2FtZSBjaGVjayBpbiBjaWZzX2NyZWF0ZSB0b28/ICovCi0JLyogaWYgbm90IG9wbG9ja2VkLCBpbnZhbGlkYXRlIGlub2RlIHBhZ2VzIGlmIG10aW1lIG9yIGZpbGUKLQkgICBzaXplIGNoYW5nZWQgKi8KLQl0ZW1wID0gY2lmc19OVHRpbWVUb1VuaXgoYnVmLT5MYXN0V3JpdGVUaW1lKTsKLQlpZiAodGltZXNwZWNfZXF1YWwoJmlub2RlLT5pX210aW1lLCAmdGVtcCkgJiYKLQkJCSAgIChpbm9kZS0+aV9zaXplID09Ci0JCQkgICAgKGxvZmZfdClsZTY0X3RvX2NwdShidWYtPkVuZE9mRmlsZSkpKSB7Ci0JCWNGWUkoMSwgImlub2RlIHVuY2hhbmdlZCBvbiBzZXJ2ZXIiKTsKLQl9IGVsc2UgewotCQlpZiAoaW5vZGUtPmlfbWFwcGluZykgewotCQkJLyogQkIgbm8gbmVlZCB0byBsb2NrIGlub2RlIHVudGlsIGFmdGVyIGludmFsaWRhdGUKLQkJCXNpbmNlIG5hbWVpIGNvZGUgc2hvdWxkIGFscmVhZHkgaGF2ZSBpdCBsb2NrZWQ/ICovCi0JCQlyYyA9IGZpbGVtYXBfd3JpdGVfYW5kX3dhaXQoaW5vZGUtPmlfbWFwcGluZyk7Ci0JCQltYXBwaW5nX3NldF9lcnJvcihpbm9kZS0+aV9tYXBwaW5nLCByYyk7Ci0JCX0KLQkJY0ZZSSgxLCAiaW52YWxpZGF0aW5nIHJlbW90ZSBpbm9kZSBzaW5jZSBvcGVuIGRldGVjdGVkIGl0ICIKLQkJCSAiY2hhbmdlZCIpOwotCQlpbnZhbGlkYXRlX3JlbW90ZV9pbm9kZShpbm9kZSk7Ci0JfQotCi1jbGllbnRfY2FuX2NhY2hlOgotCWlmIChwVGNvbi0+dW5peF9leHQpCi0JCXJjID0gY2lmc19nZXRfaW5vZGVfaW5mb191bml4KCZpbm9kZSwgZnVsbF9wYXRoLCBpbm9kZS0+aV9zYiwKLQkJCQkJICAgICAgeGlkKTsKLQllbHNlCi0JCXJjID0gY2lmc19nZXRfaW5vZGVfaW5mbygmaW5vZGUsIGZ1bGxfcGF0aCwgYnVmLCBpbm9kZS0+aV9zYiwKLQkJCQkJIHhpZCwgTlVMTCk7Ci0KLQljaWZzX3NldF9vcGxvY2tfbGV2ZWwocENpZnNJbm9kZSwgb3Bsb2NrKTsKLQotCXJldHVybiByYzsKLX0KLQogaW50IGNpZnNfcG9zaXhfb3BlbihjaGFyICpmdWxsX3BhdGgsIHN0cnVjdCBpbm9kZSAqKnBpbm9kZSwKIAkJCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBtb2RlLCB1bnNpZ25lZCBpbnQgZl9mbGFncywKIAkJCV9fdTMyICpwb3Bsb2NrLCBfX3UxNiAqcG5ldGZpZCwgaW50IHhpZCkKQEAgLTIxMyw2ICsxNjYsNzYgQEAKIAlyZXR1cm4gcmM7CiB9CiAKK3N0YXRpYyBpbnQKK2NpZnNfbnRfb3BlbihjaGFyICpmdWxsX3BhdGgsIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IsCisJICAgICBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLCB1bnNpZ25lZCBpbnQgZl9mbGFncywgX191MzIgKnBvcGxvY2ssCisJICAgICBfX3UxNiAqcG5ldGZpZCwgaW50IHhpZCkKK3sKKwlpbnQgcmM7CisJaW50IGRlc2lyZWRBY2Nlc3M7CisJaW50IGRpc3Bvc2l0aW9uOworCUZJTEVfQUxMX0lORk8gKmJ1ZjsKKworCWRlc2lyZWRBY2Nlc3MgPSBjaWZzX2NvbnZlcnRfZmxhZ3MoZl9mbGFncyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBvcGVuIGZsYWcgbWFwcGluZyB0YWJsZToKKyAqCisgKglQT1NJWCBGbGFnICAgICAgICAgICAgQ0lGUyBEaXNwb3NpdGlvbgorICoJLS0tLS0tLS0tLSAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0KKyAqCU9fQ1JFQVQgICAgICAgICAgICAgICBGSUxFX09QRU5fSUYKKyAqCU9fQ1JFQVQgfCBPX0VYQ0wgICAgICBGSUxFX0NSRUFURQorICoJT19DUkVBVCB8IE9fVFJVTkMgICAgIEZJTEVfT1ZFUldSSVRFX0lGCisgKglPX1RSVU5DICAgICAgICAgICAgICAgRklMRV9PVkVSV1JJVEUKKyAqCW5vbmUgb2YgdGhlIGFib3ZlICAgICBGSUxFX09QRU4KKyAqCisgKglOb3RlIHRoYXQgdGhlcmUgaXMgbm90IGEgZGlyZWN0IG1hdGNoIGJldHdlZW4gZGlzcG9zaXRpb24KKyAqCUZJTEVfU1VQRVJTRURFIChpZSBjcmVhdGUgd2hldGhlciBvciBub3QgZmlsZSBleGlzdHMgYWx0aG91Z2gKKyAqCU9fQ1JFQVQgfCBPX1RSVU5DIGlzIHNpbWlsYXIgYnV0IHRydW5jYXRlcyB0aGUgZXhpc3RpbmcKKyAqCWZpbGUgcmF0aGVyIHRoYW4gY3JlYXRpbmcgYSBuZXcgZmlsZSBhcyBGSUxFX1NVUEVSU0VERSBkb2VzCisgKgkod2hpY2ggdXNlcyB0aGUgYXR0cmlidXRlcyAvIG1ldGFkYXRhIHBhc3NlZCBpbiBvbiBvcGVuIGNhbGwpCisgKj8KKyAqPyAgT19TWU5DIGlzIGEgcmVhc29uYWJsZSBtYXRjaCB0byBDSUZTIHdyaXRldGhyb3VnaCBmbGFnCisgKj8gIGFuZCB0aGUgcmVhZCB3cml0ZSBmbGFncyBtYXRjaCByZWFzb25hYmx5LiAgT19MQVJHRUZJTEUKKyAqPyAgaXMgaXJyZWxldmFudCBiZWNhdXNlIGxhcmdlZmlsZSBzdXBwb3J0IGlzIGFsd2F5cyB1c2VkCisgKj8gIGJ5IHRoaXMgY2xpZW50LiBGbGFncyBPX0FQUEVORCwgT19ESVJFQ1QsIE9fRElSRUNUT1JZLAorICoJIE9fRkFTWU5DLCBPX05PRk9MTE9XLCBPX05PTkJMT0NLIG5lZWQgZnVydGhlciBpbnZlc3RpZ2F0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJZGlzcG9zaXRpb24gPSBjaWZzX2dldF9kaXNwb3NpdGlvbihmX2ZsYWdzKTsKKworCS8qIEJCIHBhc3MgT19TWU5DIGZsYWcgdGhyb3VnaCBvbiBmaWxlIGF0dHJpYnV0ZXMgLi4gQkIgKi8KKworCWJ1ZiA9IGttYWxsb2Moc2l6ZW9mKEZJTEVfQUxMX0lORk8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAodGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfTlRfU01CUykKKwkJcmMgPSBDSUZTU01CT3Blbih4aWQsIHRjb24sIGZ1bGxfcGF0aCwgZGlzcG9zaXRpb24sCisJCQkgZGVzaXJlZEFjY2VzcywgQ1JFQVRFX05PVF9ESVIsIHBuZXRmaWQsIHBvcGxvY2ssIGJ1ZiwKKwkJCSBjaWZzX3NiLT5sb2NhbF9ubHMsIGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzCisJCQkJICYgQ0lGU19NT1VOVF9NQVBfU1BFQ0lBTF9DSFIpOworCWVsc2UKKwkJcmMgPSBTTUJMZWdhY3lPcGVuKHhpZCwgdGNvbiwgZnVsbF9wYXRoLCBkaXNwb3NpdGlvbiwKKwkJCWRlc2lyZWRBY2Nlc3MsIENSRUFURV9OT1RfRElSLCBwbmV0ZmlkLCBwb3Bsb2NrLCBidWYsCisJCQljaWZzX3NiLT5sb2NhbF9ubHMsIGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzCisJCQkJJiBDSUZTX01PVU5UX01BUF9TUEVDSUFMX0NIUik7CisKKwlpZiAocmMpCisJCWdvdG8gb3V0OworCisJaWYgKHRjb24tPnVuaXhfZXh0KQorCQlyYyA9IGNpZnNfZ2V0X2lub2RlX2luZm9fdW5peCgmaW5vZGUsIGZ1bGxfcGF0aCwgaW5vZGUtPmlfc2IsCisJCQkJCSAgICAgIHhpZCk7CisJZWxzZQorCQlyYyA9IGNpZnNfZ2V0X2lub2RlX2luZm8oJmlub2RlLCBmdWxsX3BhdGgsIGJ1ZiwgaW5vZGUtPmlfc2IsCisJCQkJCSB4aWQsIHBuZXRmaWQpOworCitvdXQ6CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gcmM7Cit9CisKIHN0cnVjdCBjaWZzRmlsZUluZm8gKgogY2lmc19uZXdfZmlsZWluZm8oX191MTYgZmlsZUhhbmRsZSwgc3RydWN0IGZpbGUgKmZpbGUsCiAJCSAgc3RydWN0IHRjb25fbGluayAqdGxpbmssIF9fdTMyIG9wbG9jaykKQEAgLTMxNywxMCArMzQwLDggQEAKIAlzdHJ1Y3QgY2lmc0ZpbGVJbmZvICpwQ2lmc0ZpbGUgPSBOVUxMOwogCXN0cnVjdCBjaWZzSW5vZGVJbmZvICpwQ2lmc0lub2RlOwogCWNoYXIgKmZ1bGxfcGF0aCA9IE5VTEw7Ci0JaW50IGRlc2lyZWRBY2Nlc3M7Ci0JaW50IGRpc3Bvc2l0aW9uOworCWJvb2wgcG9zaXhfb3Blbl9vayA9IGZhbHNlOwogCV9fdTE2IG5ldGZpZDsKLQlGSUxFX0FMTF9JTkZPICpidWYgPSBOVUxMOwogCiAJeGlkID0gR2V0WGlkKCk7CiAKQEAgLTM1OCwxNyArMzc5LDcgQEAKIAkJCQlmaWxlLT5mX2ZsYWdzLCAmb3Bsb2NrLCAmbmV0ZmlkLCB4aWQpOwogCQlpZiAocmMgPT0gMCkgewogCQkJY0ZZSSgxLCAicG9zaXggb3BlbiBzdWNjZWVkZWQiKTsKLQotCQkJcENpZnNGaWxlID0gY2lmc19uZXdfZmlsZWluZm8obmV0ZmlkLCBmaWxlLCB0bGluaywKLQkJCQkJCSAgICAgIG9wbG9jayk7Ci0JCQlpZiAocENpZnNGaWxlID09IE5VTEwpIHsKLQkJCQlDSUZTU01CQ2xvc2UoeGlkLCB0Y29uLCBuZXRmaWQpOwotCQkJCXJjID0gLUVOT01FTTsKLQkJCX0KLQotCQkJY2lmc19mc2NhY2hlX3NldF9pbm9kZV9jb29raWUoaW5vZGUsIGZpbGUpOwotCi0JCQlnb3RvIG91dDsKKwkJCXBvc2l4X29wZW5fb2sgPSB0cnVlOwogCQl9IGVsc2UgaWYgKChyYyA9PSAtRUlOVkFMKSB8fCAocmMgPT0gLUVPUE5PVFNVUFApKSB7CiAJCQlpZiAodGNvbi0+c2VzLT5zZXJ2ZXJOT1MpCiAJCQkJY0VSUk9SKDEsICJzZXJ2ZXIgJXMgb2YgdHlwZSAlcyByZXR1cm5lZCIKQEAgLTM4NSwxMDMgKzM5NiwzOSBAQAogCQkgICBvciBERlMgZXJyb3JzICovCiAJfQogCi0JZGVzaXJlZEFjY2VzcyA9IGNpZnNfY29udmVydF9mbGFncyhmaWxlLT5mX2ZsYWdzKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIG9wZW4gZmxhZyBtYXBwaW5nIHRhYmxlOgotICoKLSAqCVBPU0lYIEZsYWcgICAgICAgICAgICBDSUZTIERpc3Bvc2l0aW9uCi0gKgktLS0tLS0tLS0tICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLQotICoJT19DUkVBVCAgICAgICAgICAgICAgIEZJTEVfT1BFTl9JRgotICoJT19DUkVBVCB8IE9fRVhDTCAgICAgIEZJTEVfQ1JFQVRFCi0gKglPX0NSRUFUIHwgT19UUlVOQyAgICAgRklMRV9PVkVSV1JJVEVfSUYKLSAqCU9fVFJVTkMgICAgICAgICAgICAgICBGSUxFX09WRVJXUklURQotICoJbm9uZSBvZiB0aGUgYWJvdmUgICAgIEZJTEVfT1BFTgotICoKLSAqCU5vdGUgdGhhdCB0aGVyZSBpcyBub3QgYSBkaXJlY3QgbWF0Y2ggYmV0d2VlbiBkaXNwb3NpdGlvbgotICoJRklMRV9TVVBFUlNFREUgKGllIGNyZWF0ZSB3aGV0aGVyIG9yIG5vdCBmaWxlIGV4aXN0cyBhbHRob3VnaAotICoJT19DUkVBVCB8IE9fVFJVTkMgaXMgc2ltaWxhciBidXQgdHJ1bmNhdGVzIHRoZSBleGlzdGluZwotICoJZmlsZSByYXRoZXIgdGhhbiBjcmVhdGluZyBhIG5ldyBmaWxlIGFzIEZJTEVfU1VQRVJTRURFIGRvZXMKLSAqCSh3aGljaCB1c2VzIHRoZSBhdHRyaWJ1dGVzIC8gbWV0YWRhdGEgcGFzc2VkIGluIG9uIG9wZW4gY2FsbCkKLSAqPwotICo/ICBPX1NZTkMgaXMgYSByZWFzb25hYmxlIG1hdGNoIHRvIENJRlMgd3JpdGV0aHJvdWdoIGZsYWcKLSAqPyAgYW5kIHRoZSByZWFkIHdyaXRlIGZsYWdzIG1hdGNoIHJlYXNvbmFibHkuICBPX0xBUkdFRklMRQotICo/ICBpcyBpcnJlbGV2YW50IGJlY2F1c2UgbGFyZ2VmaWxlIHN1cHBvcnQgaXMgYWx3YXlzIHVzZWQKLSAqPyAgYnkgdGhpcyBjbGllbnQuIEZsYWdzIE9fQVBQRU5ELCBPX0RJUkVDVCwgT19ESVJFQ1RPUlksCi0gKgkgT19GQVNZTkMsIE9fTk9GT0xMT1csIE9fTk9OQkxPQ0sgbmVlZCBmdXJ0aGVyIGludmVzdGlnYXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQlkaXNwb3NpdGlvbiA9IGNpZnNfZ2V0X2Rpc3Bvc2l0aW9uKGZpbGUtPmZfZmxhZ3MpOwotCi0JLyogQkIgcGFzcyBPX1NZTkMgZmxhZyB0aHJvdWdoIG9uIGZpbGUgYXR0cmlidXRlcyAuLiBCQiAqLwotCi0JLyogQWxzbyByZWZyZXNoIGlub2RlIGJ5IHBhc3NpbmcgaW4gZmlsZV9pbmZvIGJ1ZiByZXR1cm5lZCBieSBTTUJPcGVuCi0JICAgYW5kIGNhbGxpbmcgZ2V0X2lub2RlX2luZm8gd2l0aCByZXR1cm5lZCBidWYgKGF0IGxlYXN0IGhlbHBzCi0JICAgbm9uLVVuaXggc2VydmVyIGNhc2UpICovCi0KLQkvKiBCQiB3ZSBjYW4gbm90IGRvIHRoaXMgaWYgdGhpcyBpcyB0aGUgc2Vjb25kIG9wZW4gb2YgYSBmaWxlCi0JICAgYW5kIHRoZSBmaXJzdCBoYW5kbGUgaGFzIHdyaXRlYmVoaW5kIGRhdGEsIHdlIG1pZ2h0IGJlCi0JICAgYWJsZSB0byBzaW1wbHkgZG8gYSBmaWxlbWFwX2ZkYXRhd3JpdGUvZmlsZW1hcF9mZGF0YXdhaXQgZmlyc3QgKi8KLQlidWYgPSBrbWFsbG9jKHNpemVvZihGSUxFX0FMTF9JTkZPKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKKwlpZiAoIXBvc2l4X29wZW5fb2spIHsKKwkJcmMgPSBjaWZzX250X29wZW4oZnVsbF9wYXRoLCBpbm9kZSwgY2lmc19zYiwgdGNvbiwKKwkJCQkgIGZpbGUtPmZfZmxhZ3MsICZvcGxvY2ssICZuZXRmaWQsIHhpZCk7CisJCWlmIChyYykKKwkJCWdvdG8gb3V0OwogCX0KIAotCWlmICh0Y29uLT5zZXMtPmNhcGFiaWxpdGllcyAmIENBUF9OVF9TTUJTKQotCQlyYyA9IENJRlNTTUJPcGVuKHhpZCwgdGNvbiwgZnVsbF9wYXRoLCBkaXNwb3NpdGlvbiwKLQkJCSBkZXNpcmVkQWNjZXNzLCBDUkVBVEVfTk9UX0RJUiwgJm5ldGZpZCwgJm9wbG9jaywgYnVmLAotCQkJIGNpZnNfc2ItPmxvY2FsX25scywgY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MKLQkJCQkgJiBDSUZTX01PVU5UX01BUF9TUEVDSUFMX0NIUik7Ci0JZWxzZQotCQlyYyA9IC1FSU87IC8qIG5vIE5UIFNNQiBzdXBwb3J0IGZhbGwgaW50byBsZWdhY3kgb3BlbiBiZWxvdyAqLwotCi0JaWYgKHJjID09IC1FSU8pIHsKLQkJLyogT2xkIHNlcnZlciwgdHJ5IGxlZ2FjeSBzdHlsZSBPcGVuWCAqLwotCQlyYyA9IFNNQkxlZ2FjeU9wZW4oeGlkLCB0Y29uLCBmdWxsX3BhdGgsIGRpc3Bvc2l0aW9uLAotCQkJZGVzaXJlZEFjY2VzcywgQ1JFQVRFX05PVF9ESVIsICZuZXRmaWQsICZvcGxvY2ssIGJ1ZiwKLQkJCWNpZnNfc2ItPmxvY2FsX25scywgY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MKLQkJCQkmIENJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKLQl9Ci0JaWYgKHJjKSB7Ci0JCWNGWUkoMSwgImNpZnNfb3BlbiByZXR1cm5lZCAweCV4IiwgcmMpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlyYyA9IGNpZnNfb3Blbl9pbm9kZV9oZWxwZXIoaW5vZGUsIHRjb24sIG9wbG9jaywgYnVmLCBmdWxsX3BhdGgsIHhpZCk7Ci0JaWYgKHJjICE9IDApCi0JCWdvdG8gb3V0OwotCiAJcENpZnNGaWxlID0gY2lmc19uZXdfZmlsZWluZm8obmV0ZmlkLCBmaWxlLCB0bGluaywgb3Bsb2NrKTsKIAlpZiAocENpZnNGaWxlID09IE5VTEwpIHsKKwkJQ0lGU1NNQkNsb3NlKHhpZCwgdGNvbiwgbmV0ZmlkKTsKIAkJcmMgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKIAl9CiAKIAljaWZzX2ZzY2FjaGVfc2V0X2lub2RlX2Nvb2tpZShpbm9kZSwgZmlsZSk7CiAKLQlpZiAob3Bsb2NrICYgQ0lGU19DUkVBVEVfQUNUSU9OKSB7CisJaWYgKChvcGxvY2sgJiBDSUZTX0NSRUFURV9BQ1RJT04pICYmICFwb3NpeF9vcGVuX29rICYmIHRjb24tPnVuaXhfZXh0KSB7CiAJCS8qIHRpbWUgdG8gc2V0IG1vZGUgd2hpY2ggd2UgY2FuIG5vdCBzZXQgZWFybGllciBkdWUgdG8KIAkJICAgcHJvYmxlbXMgY3JlYXRpbmcgbmV3IHJlYWQtb25seSBmaWxlcyAqLwotCQlpZiAodGNvbi0+dW5peF9leHQpIHsKLQkJCXN0cnVjdCBjaWZzX3VuaXhfc2V0X2luZm9fYXJncyBhcmdzID0gewotCQkJCS5tb2RlCT0gaW5vZGUtPmlfbW9kZSwKLQkJCQkudWlkCT0gTk9fQ0hBTkdFXzY0LAotCQkJCS5naWQJPSBOT19DSEFOR0VfNjQsCi0JCQkJLmN0aW1lCT0gTk9fQ0hBTkdFXzY0LAotCQkJCS5hdGltZQk9IE5PX0NIQU5HRV82NCwKLQkJCQkubXRpbWUJPSBOT19DSEFOR0VfNjQsCi0JCQkJLmRldmljZQk9IDAsCi0JCQl9OwotCQkJQ0lGU1NNQlVuaXhTZXRQYXRoSW5mbyh4aWQsIHRjb24sIGZ1bGxfcGF0aCwgJmFyZ3MsCi0JCQkJCSAgICAgICBjaWZzX3NiLT5sb2NhbF9ubHMsCi0JCQkJCSAgICAgICBjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmCi0JCQkJCQlDSUZTX01PVU5UX01BUF9TUEVDSUFMX0NIUik7Ci0JCX0KKwkJc3RydWN0IGNpZnNfdW5peF9zZXRfaW5mb19hcmdzIGFyZ3MgPSB7CisJCQkubW9kZQk9IGlub2RlLT5pX21vZGUsCisJCQkudWlkCT0gTk9fQ0hBTkdFXzY0LAorCQkJLmdpZAk9IE5PX0NIQU5HRV82NCwKKwkJCS5jdGltZQk9IE5PX0NIQU5HRV82NCwKKwkJCS5hdGltZQk9IE5PX0NIQU5HRV82NCwKKwkJCS5tdGltZQk9IE5PX0NIQU5HRV82NCwKKwkJCS5kZXZpY2UJPSAwLAorCQl9OworCQlDSUZTU01CVW5peFNldEZpbGVJbmZvKHhpZCwgdGNvbiwgJmFyZ3MsIG5ldGZpZCwKKwkJCQkJcENpZnNGaWxlLT5waWQpOwogCX0KIAogb3V0OgotCWtmcmVlKGJ1Zik7CiAJa2ZyZWUoZnVsbF9wYXRoKTsKIAlGcmVlWGlkKHhpZCk7CiAJY2lmc19wdXRfdGxpbmsodGxpbmspOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9pbm9kZS5jIGIvZnMvY2lmcy9pbm9kZS5jCmluZGV4IGE4NTNhODkuLjBjN2UzNjkgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvaW5vZGUuYworKysgYi9mcy9jaWZzL2lub2RlLmMKQEAgLTUxOCw2ICs1MTgsNyBAQAogCiAJZmF0dHItPmNmX2VvZiA9IGxlNjRfdG9fY3B1KGluZm8tPkVuZE9mRmlsZSk7CiAJZmF0dHItPmNmX2J5dGVzID0gbGU2NF90b19jcHUoaW5mby0+QWxsb2NhdGlvblNpemUpOworCWZhdHRyLT5jZl9jcmVhdGV0aW1lID0gbGU2NF90b19jcHUoaW5mby0+Q3JlYXRpb25UaW1lKTsKIAogCWlmIChmYXR0ci0+Y2ZfY2lmc2F0dHJzICYgQVRUUl9ESVJFQ1RPUlkpIHsKIAkJZmF0dHItPmNmX21vZGUgPSBTX0lGRElSIHwgY2lmc19zYi0+bW50X2Rpcl9tb2RlOwpAQCAtNzc5LDYgKzc4MCwxMCBAQAogCWlmIChDSUZTX0koaW5vZGUpLT51bmlxdWVpZCAhPSBmYXR0ci0+Y2ZfdW5pcXVlaWQpCiAJCXJldHVybiAwOwogCisJLyogdXNlIGNyZWF0ZXRpbWUgbGlrZSBhbiBpX2dlbmVyYXRpb24gZmllbGQgKi8KKwlpZiAoQ0lGU19JKGlub2RlKS0+Y3JlYXRldGltZSAhPSBmYXR0ci0+Y2ZfY3JlYXRldGltZSkKKwkJcmV0dXJuIDA7CisKIAkvKiBkb24ndCBtYXRjaCBpbm9kZSBvZiBkaWZmZXJlbnQgdHlwZSAqLwogCWlmICgoaW5vZGUtPmlfbW9kZSAmIFNfSUZNVCkgIT0gKGZhdHRyLT5jZl9tb2RlICYgU19JRk1UKSkKIAkJcmV0dXJuIDA7CkBAIC03OTYsNiArODAxLDcgQEAKIAlzdHJ1Y3QgY2lmc19mYXR0ciAqZmF0dHIgPSAoc3RydWN0IGNpZnNfZmF0dHIgKikgb3BhcXVlOwogCiAJQ0lGU19JKGlub2RlKS0+dW5pcXVlaWQgPSBmYXR0ci0+Y2ZfdW5pcXVlaWQ7CisJQ0lGU19JKGlub2RlKS0+Y3JlYXRldGltZSA9IGZhdHRyLT5jZl9jcmVhdGV0aW1lOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9mcy9jaWZzL3JlYWRkaXIuYyBiL2ZzL2NpZnMvcmVhZGRpci5jCmluZGV4IGVjNWI2OGUuLjc2YjFiMzcgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvcmVhZGRpci5jCisrKyBiL2ZzL2NpZnMvcmVhZGRpci5jCkBAIC0xNjAsNiArMTYwLDcgQEAKIAlmYXR0ci0+Y2ZfY2lmc2F0dHJzID0gbGUzMl90b19jcHUoaW5mby0+RXh0RmlsZUF0dHJpYnV0ZXMpOwogCWZhdHRyLT5jZl9lb2YgPSBsZTY0X3RvX2NwdShpbmZvLT5FbmRPZkZpbGUpOwogCWZhdHRyLT5jZl9ieXRlcyA9IGxlNjRfdG9fY3B1KGluZm8tPkFsbG9jYXRpb25TaXplKTsKKwlmYXR0ci0+Y2ZfY3JlYXRldGltZSA9IGxlNjRfdG9fY3B1KGluZm8tPkNyZWF0aW9uVGltZSk7CiAJZmF0dHItPmNmX2F0aW1lID0gY2lmc19OVHRpbWVUb1VuaXgoaW5mby0+TGFzdEFjY2Vzc1RpbWUpOwogCWZhdHRyLT5jZl9jdGltZSA9IGNpZnNfTlR0aW1lVG9Vbml4KGluZm8tPkNoYW5nZVRpbWUpOwogCWZhdHRyLT5jZl9tdGltZSA9IGNpZnNfTlR0aW1lVG9Vbml4KGluZm8tPkxhc3RXcml0ZVRpbWUpOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9zZXNzLmMgYi9mcy9jaWZzL3Nlc3MuYwppbmRleCA3YjAxZDNmLi5lYjc0NjQ4IDEwMDY0NAotLS0gYS9mcy9jaWZzL3Nlc3MuYworKysgYi9mcy9jaWZzL3Nlc3MuYwpAQCAtNDIwLDcgKzQyMCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZmRlZiBDT05GSUdfQ0lGU19FWFBFUklNRU5UQUwKIC8qIEJCIE1vdmUgdG8gbnRsbXNzcC5jIGV2ZW50dWFsbHkgKi8KIAogLyogV2UgZG8gbm90IG1hbGxvYyB0aGUgYmxvYiwgaXQgaXMgcGFzc2VkIGluIHBidWZmZXIsIGJlY2F1c2UKQEAgLTQzMSwxMyArNDMwLDE0IEBACiAJTkVHT1RJQVRFX01FU1NBR0UgKnNlY19ibG9iID0gKE5FR09USUFURV9NRVNTQUdFICopcGJ1ZmZlcjsKIAlfX3UzMiBmbGFnczsKIAorCW1lbXNldChwYnVmZmVyLCAwLCBzaXplb2YoTkVHT1RJQVRFX01FU1NBR0UpKTsKIAltZW1jcHkoc2VjX2Jsb2ItPlNpZ25hdHVyZSwgTlRMTVNTUF9TSUdOQVRVUkUsIDgpOwogCXNlY19ibG9iLT5NZXNzYWdlVHlwZSA9IE50TG1OZWdvdGlhdGU7CiAKIAkvKiBCQiBpcyBOVExNVjIgc2Vzc2lvbiBzZWN1cml0eSBmb3JtYXQgZWFzaWVyIHRvIHVzZSBoZXJlPyAqLwogCWZsYWdzID0gTlRMTVNTUF9ORUdPVElBVEVfNTYgfAlOVExNU1NQX1JFUVVFU1RfVEFSR0VUIHwKIAkJTlRMTVNTUF9ORUdPVElBVEVfMTI4IHwgTlRMTVNTUF9ORUdPVElBVEVfVU5JQ09ERSB8Ci0JCU5UTE1TU1BfTkVHT1RJQVRFX05UTE07CisJCU5UTE1TU1BfTkVHT1RJQVRFX05UTE0gfCBOVExNU1NQX05FR09USUFURV9FWFRFTkRFRF9TRUM7CiAJaWYgKHNlcy0+c2VydmVyLT5zZWNNb2RlICYKIAkJCShTRUNNT0RFX1NJR05fUkVRVUlSRUQgfCBTRUNNT0RFX1NJR05fRU5BQkxFRCkpIHsKIAkJZmxhZ3MgfD0gTlRMTVNTUF9ORUdPVElBVEVfU0lHTjsKQEAgLTQ0Niw3ICs0NDYsNyBAQAogCQkJCU5UTE1TU1BfTkVHT1RJQVRFX0VYVEVOREVEX1NFQzsKIAl9CiAKLQlzZWNfYmxvYi0+TmVnb3RpYXRlRmxhZ3MgfD0gY3B1X3RvX2xlMzIoZmxhZ3MpOworCXNlY19ibG9iLT5OZWdvdGlhdGVGbGFncyA9IGNwdV90b19sZTMyKGZsYWdzKTsKIAogCXNlY19ibG9iLT5Xb3Jrc3RhdGlvbk5hbWUuQnVmZmVyT2Zmc2V0ID0gMDsKIAlzZWNfYmxvYi0+V29ya3N0YXRpb25OYW1lLkxlbmd0aCA9IDA7CkBAIC00NzcsNyArNDc3LDcgQEAKIAlmbGFncyA9IE5UTE1TU1BfTkVHT1RJQVRFXzU2IHwKIAkJTlRMTVNTUF9SRVFVRVNUX1RBUkdFVCB8IE5UTE1TU1BfTkVHT1RJQVRFX1RBUkdFVF9JTkZPIHwKIAkJTlRMTVNTUF9ORUdPVElBVEVfMTI4IHwgTlRMTVNTUF9ORUdPVElBVEVfVU5JQ09ERSB8Ci0JCU5UTE1TU1BfTkVHT1RJQVRFX05UTE07CisJCU5UTE1TU1BfTkVHT1RJQVRFX05UTE0gfCBOVExNU1NQX05FR09USUFURV9FWFRFTkRFRF9TRUM7CiAJaWYgKHNlcy0+c2VydmVyLT5zZWNNb2RlICYKIAkgICAoU0VDTU9ERV9TSUdOX1JFUVVJUkVEIHwgU0VDTU9ERV9TSUdOX0VOQUJMRUQpKQogCQlmbGFncyB8PSBOVExNU1NQX05FR09USUFURV9TSUdOOwpAQCAtNDg1LDcgKzQ4NSw3IEBACiAJCWZsYWdzIHw9IE5UTE1TU1BfTkVHT1RJQVRFX0FMV0FZU19TSUdOOwogCiAJdG1wID0gcGJ1ZmZlciArIHNpemVvZihBVVRIRU5USUNBVEVfTUVTU0FHRSk7Ci0Jc2VjX2Jsb2ItPk5lZ290aWF0ZUZsYWdzIHw9IGNwdV90b19sZTMyKGZsYWdzKTsKKwlzZWNfYmxvYi0+TmVnb3RpYXRlRmxhZ3MgPSBjcHVfdG9fbGUzMihmbGFncyk7CiAKIAlzZWNfYmxvYi0+TG1DaGFsbGVuZ2VSZXNwb25zZS5CdWZmZXJPZmZzZXQgPQogCQkJCWNwdV90b19sZTMyKHNpemVvZihBVVRIRU5USUNBVEVfTUVTU0FHRSkpOwpAQCAtNTQ0LDggKzU0NCw5IEBACiAJc2VjX2Jsb2ItPldvcmtzdGF0aW9uTmFtZS5NYXhpbXVtTGVuZ3RoID0gMDsKIAl0bXAgKz0gMjsKIAotCWlmICgoc2VzLT5udGxtc3NwLT5zZXJ2ZXJfZmxhZ3MgJiBOVExNU1NQX05FR09USUFURV9LRVlfWENIKSAmJgotCQkJIWNhbGNfc2Vja2V5KHNlcykpIHsKKwlpZiAoKChzZXMtPm50bG1zc3AtPnNlcnZlcl9mbGFncyAmIE5UTE1TU1BfTkVHT1RJQVRFX0tFWV9YQ0gpIHx8CisJCShzZXMtPm50bG1zc3AtPnNlcnZlcl9mbGFncyAmIE5UTE1TU1BfTkVHT1RJQVRFX0VYVEVOREVEX1NFQykpCisJCQkmJiAhY2FsY19zZWNrZXkoc2VzKSkgewogCQltZW1jcHkodG1wLCBzZXMtPm50bG1zc3AtPmNpcGhlcnRleHQsIENJRlNfQ1BIVFhUX1NJWkUpOwogCQlzZWNfYmxvYi0+U2Vzc2lvbktleS5CdWZmZXJPZmZzZXQgPSBjcHVfdG9fbGUzMih0bXAgLSBwYnVmZmVyKTsKIAkJc2VjX2Jsb2ItPlNlc3Npb25LZXkuTGVuZ3RoID0gY3B1X3RvX2xlMTYoQ0lGU19DUEhUWFRfU0laRSk7CkBAIC01NjMsMTcgKzU2NCw2IEBACiAJcmV0dXJuIHJjOwogfQogCi0KLXN0YXRpYyB2b2lkIHNldHVwX250bG1zc3BfbmVnX3JlcShTRVNTSU9OX1NFVFVQX0FORFggKnBTTUIsCi0JCQkJIHN0cnVjdCBjaWZzU2VzSW5mbyAqc2VzKQotewotCWJ1aWxkX250bG1zc3BfbmVnb3RpYXRlX2Jsb2IoJnBTTUItPnJlcS5TZWN1cml0eUJsb2JbMF0sIHNlcyk7Ci0JcFNNQi0+cmVxLlNlY3VyaXR5QmxvYkxlbmd0aCA9IGNwdV90b19sZTE2KHNpemVvZihORUdPVElBVEVfTUVTU0FHRSkpOwotCi0JcmV0dXJuOwotfQotI2VuZGlmCi0KIGludAogQ0lGU19TZXNzU2V0dXAodW5zaWduZWQgaW50IHhpZCwgc3RydWN0IGNpZnNTZXNJbmZvICpzZXMsCiAJICAgICAgIGNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jcCkKQEAgLTgxNCw3MSArODA0LDcwIEBACiAJCXJjID0gLUVOT1NZUzsKIAkJZ290byBzc2V0dXBfZXhpdDsKICNlbmRpZiAvKiBDT05GSUdfQ0lGU19VUENBTEwgKi8KLQl9IGVsc2UgewotI2lmZGVmIENPTkZJR19DSUZTX0VYUEVSSU1FTlRBTAotCQlpZiAodHlwZSA9PSBSYXdOVExNU1NQKSB7Ci0JCQlpZiAoKHBTTUItPnJlcS5oZHIuRmxhZ3MyICYgU01CRkxHMl9VTklDT0RFKSA9PSAwKSB7Ci0JCQkJY0VSUk9SKDEsICJOVExNU1NQIHJlcXVpcmVzIFVuaWNvZGUgc3VwcG9ydCIpOwotCQkJCXJjID0gLUVOT1NZUzsKLQkJCQlnb3RvIHNzZXR1cF9leGl0OwotCQkJfQotCi0JCQljRllJKDEsICJudGxtc3NwIHNlc3Npb24gc2V0dXAgcGhhc2UgJWQiLCBwaGFzZSk7Ci0JCQlwU01CLT5yZXEuaGRyLkZsYWdzMiB8PSBTTUJGTEcyX0VYVF9TRUM7Ci0JCQljYXBhYmlsaXRpZXMgfD0gQ0FQX0VYVEVOREVEX1NFQ1VSSVRZOwotCQkJcFNNQi0+cmVxLkNhcGFiaWxpdGllcyB8PSBjcHVfdG9fbGUzMihjYXBhYmlsaXRpZXMpOwotCQkJaWYgKHBoYXNlID09IE50TG1OZWdvdGlhdGUpIHsKLQkJCQlzZXR1cF9udGxtc3NwX25lZ19yZXEocFNNQiwgc2VzKTsKLQkJCQlpb3ZbMV0uaW92X2xlbiA9IHNpemVvZihORUdPVElBVEVfTUVTU0FHRSk7Ci0JCQkJaW92WzFdLmlvdl9iYXNlID0gJnBTTUItPnJlcS5TZWN1cml0eUJsb2JbMF07Ci0JCQl9IGVsc2UgaWYgKHBoYXNlID09IE50TG1BdXRoZW50aWNhdGUpIHsKLQkJCQkvKiA1IGlzIGFuIGVtcGlyaWNhbCB2YWx1ZSwgbGFyZ2UgZW5vdWdodCB0bwotCQkJCSAqIGhvbGQgYXV0aGVudGljYXRlIG1lc3NhZ2UsIG1heCAxMCBvZgotCQkJCSAqIGF2IHBhcmlzLCBkb2FtaW4sdXNlcix3b3Jrc3RhdGlvbiBtYW1lcywKLQkJCQkgKiBmbGFncyBldGMuLgotCQkJCSAqLwotCQkJCW50bG1zc3BibG9iID0ga21hbGxvYygKLQkJCQkJNSpzaXplb2Yoc3RydWN0IF9BVVRIRU5USUNBVEVfTUVTU0FHRSksCi0JCQkJCUdGUF9LRVJORUwpOwotCQkJCWlmICghbnRsbXNzcGJsb2IpIHsKLQkJCQkJY0VSUk9SKDEsICJDYW4ndCBhbGxvY2F0ZSBOVExNU1NQIik7Ci0JCQkJCXJjID0gLUVOT01FTTsKLQkJCQkJZ290byBzc2V0dXBfZXhpdDsKLQkJCQl9Ci0KLQkJCQlyYyA9IGJ1aWxkX250bG1zc3BfYXV0aF9ibG9iKG50bG1zc3BibG9iLAotCQkJCQkJCSZibG9iX2xlbiwgc2VzLCBubHNfY3ApOwotCQkJCWlmIChyYykKLQkJCQkJZ290byBzc2V0dXBfZXhpdDsKLQkJCQlpb3ZbMV0uaW92X2xlbiA9IGJsb2JfbGVuOwotCQkJCWlvdlsxXS5pb3ZfYmFzZSA9IG50bG1zc3BibG9iOwotCQkJCXBTTUItPnJlcS5TZWN1cml0eUJsb2JMZW5ndGggPQotCQkJCQljcHVfdG9fbGUxNihibG9iX2xlbik7Ci0JCQkJLyogTWFrZSBzdXJlIHRoYXQgd2UgdGVsbCB0aGUgc2VydmVyIHRoYXQgd2UKLQkJCQkgICBhcmUgdXNpbmcgdGhlIHVpZCB0aGF0IGl0IGp1c3QgZ2F2ZSB1cyBiYWNrCi0JCQkJICAgb24gdGhlIHJlc3BvbnNlIChjaGFsbGVuZ2UpICovCi0JCQkJc21iX2J1Zi0+VWlkID0gc2VzLT5TdWlkOwotCQkJfSBlbHNlIHsKLQkJCQljRVJST1IoMSwgImludmFsaWQgcGhhc2UgJWQiLCBwaGFzZSk7Ci0JCQkJcmMgPSAtRU5PU1lTOwotCQkJCWdvdG8gc3NldHVwX2V4aXQ7Ci0JCQl9Ci0JCQkvKiB1bmljb2RlIHN0cmluZ3MgbXVzdCBiZSB3b3JkIGFsaWduZWQgKi8KLQkJCWlmICgoaW92WzBdLmlvdl9sZW4gKyBpb3ZbMV0uaW92X2xlbikgJSAyKSB7Ci0JCQkJKmJjY19wdHIgPSAwOwotCQkJCWJjY19wdHIrKzsKLQkJCX0KLQkJCXVuaWNvZGVfb3NsbV9zdHJpbmdzKCZiY2NfcHRyLCBubHNfY3ApOwotCQl9IGVsc2UgewotCQkJY0VSUk9SKDEsICJzZWNUeXBlICVkIG5vdCBzdXBwb3J0ZWQhIiwgdHlwZSk7CisJfSBlbHNlIGlmICh0eXBlID09IFJhd05UTE1TU1ApIHsKKwkJaWYgKChwU01CLT5yZXEuaGRyLkZsYWdzMiAmIFNNQkZMRzJfVU5JQ09ERSkgPT0gMCkgeworCQkJY0VSUk9SKDEsICJOVExNU1NQIHJlcXVpcmVzIFVuaWNvZGUgc3VwcG9ydCIpOwogCQkJcmMgPSAtRU5PU1lTOwogCQkJZ290byBzc2V0dXBfZXhpdDsKIAkJfQotI2Vsc2UKKworCQljRllJKDEsICJudGxtc3NwIHNlc3Npb24gc2V0dXAgcGhhc2UgJWQiLCBwaGFzZSk7CisJCXBTTUItPnJlcS5oZHIuRmxhZ3MyIHw9IFNNQkZMRzJfRVhUX1NFQzsKKwkJY2FwYWJpbGl0aWVzIHw9IENBUF9FWFRFTkRFRF9TRUNVUklUWTsKKwkJcFNNQi0+cmVxLkNhcGFiaWxpdGllcyB8PSBjcHVfdG9fbGUzMihjYXBhYmlsaXRpZXMpOworCQlzd2l0Y2gocGhhc2UpIHsKKwkJY2FzZSBOdExtTmVnb3RpYXRlOgorCQkJYnVpbGRfbnRsbXNzcF9uZWdvdGlhdGVfYmxvYigKKwkJCQlwU01CLT5yZXEuU2VjdXJpdHlCbG9iLCBzZXMpOworCQkJaW92WzFdLmlvdl9sZW4gPSBzaXplb2YoTkVHT1RJQVRFX01FU1NBR0UpOworCQkJaW92WzFdLmlvdl9iYXNlID0gcFNNQi0+cmVxLlNlY3VyaXR5QmxvYjsKKwkJCXBTTUItPnJlcS5TZWN1cml0eUJsb2JMZW5ndGggPQorCQkJCWNwdV90b19sZTE2KHNpemVvZihORUdPVElBVEVfTUVTU0FHRSkpOworCQkJYnJlYWs7CisJCWNhc2UgTnRMbUF1dGhlbnRpY2F0ZToKKwkJCS8qCisJCQkgKiA1IGlzIGFuIGVtcGlyaWNhbCB2YWx1ZSwgbGFyZ2UgZW5vdWdoIHRvIGhvbGQKKwkJCSAqIGF1dGhlbnRpY2F0ZSBtZXNzYWdlIHBsdXMgbWF4IDEwIG9mIGF2IHBhcmlzLAorCQkJICogZG9tYWluLCB1c2VyLCB3b3Jrc3RhdGlvbiBuYW1lcywgZmxhZ3MsIGV0Yy4KKwkJCSAqLworCQkJbnRsbXNzcGJsb2IgPSBremFsbG9jKAorCQkJCTUqc2l6ZW9mKHN0cnVjdCBfQVVUSEVOVElDQVRFX01FU1NBR0UpLAorCQkJCUdGUF9LRVJORUwpOworCQkJaWYgKCFudGxtc3NwYmxvYikgeworCQkJCWNFUlJPUigxLCAiQ2FuJ3QgYWxsb2NhdGUgTlRMTVNTUCBibG9iIik7CisJCQkJcmMgPSAtRU5PTUVNOworCQkJCWdvdG8gc3NldHVwX2V4aXQ7CisJCQl9CisKKwkJCXJjID0gYnVpbGRfbnRsbXNzcF9hdXRoX2Jsb2IobnRsbXNzcGJsb2IsCisJCQkJCQkmYmxvYl9sZW4sIHNlcywgbmxzX2NwKTsKKwkJCWlmIChyYykKKwkJCQlnb3RvIHNzZXR1cF9leGl0OworCQkJaW92WzFdLmlvdl9sZW4gPSBibG9iX2xlbjsKKwkJCWlvdlsxXS5pb3ZfYmFzZSA9IG50bG1zc3BibG9iOworCQkJcFNNQi0+cmVxLlNlY3VyaXR5QmxvYkxlbmd0aCA9IGNwdV90b19sZTE2KGJsb2JfbGVuKTsKKwkJCS8qCisJCQkgKiBNYWtlIHN1cmUgdGhhdCB3ZSB0ZWxsIHRoZSBzZXJ2ZXIgdGhhdCB3ZSBhcmUgdXNpbmcKKwkJCSAqIHRoZSB1aWQgdGhhdCBpdCBqdXN0IGdhdmUgdXMgYmFjayBvbiB0aGUgcmVzcG9uc2UKKwkJCSAqIChjaGFsbGVuZ2UpCisJCQkgKi8KKwkJCXNtYl9idWYtPlVpZCA9IHNlcy0+U3VpZDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJY0VSUk9SKDEsICJpbnZhbGlkIHBoYXNlICVkIiwgcGhhc2UpOworCQkJcmMgPSAtRU5PU1lTOworCQkJZ290byBzc2V0dXBfZXhpdDsKKwkJfQorCQkvKiB1bmljb2RlIHN0cmluZ3MgbXVzdCBiZSB3b3JkIGFsaWduZWQgKi8KKwkJaWYgKChpb3ZbMF0uaW92X2xlbiArIGlvdlsxXS5pb3ZfbGVuKSAlIDIpIHsKKwkJCSpiY2NfcHRyID0gMDsKKwkJCWJjY19wdHIrKzsKKwkJfQorCQl1bmljb2RlX29zbG1fc3RyaW5ncygmYmNjX3B0ciwgbmxzX2NwKTsKKwl9IGVsc2UgewogCQljRVJST1IoMSwgInNlY1R5cGUgJWQgbm90IHN1cHBvcnRlZCEiLCB0eXBlKTsKIAkJcmMgPSAtRU5PU1lTOwogCQlnb3RvIHNzZXR1cF9leGl0OwotI2VuZGlmCiAJfQogCiAJaW92WzJdLmlvdl9iYXNlID0gc3RyX2FyZWE7CmRpZmYgLS1naXQgYS9mcy9jaWZzL3RyYW5zcG9ydC5jIGIvZnMvY2lmcy90cmFuc3BvcnQuYwppbmRleCBlMDU4OGNkLi41OWNhODFiIDEwMDY0NAotLS0gYS9mcy9jaWZzL3RyYW5zcG9ydC5jCisrKyBiL2ZzL2NpZnMvdHJhbnNwb3J0LmMKQEAgLTExOSw3ICsxMTksNyBAQAogCWlmIChzc29ja2V0ID09IE5VTEwpCiAJCXJldHVybiAtRU5PVFNPQ0s7IC8qIEJCIGV2ZW50dWFsbHkgYWRkIHJlY29ubmVjdCBjb2RlIGhlcmUgKi8KIAotCXNtYl9tc2cubXNnX25hbWUgPSAoc3RydWN0IHNvY2thZGRyICopICZzZXJ2ZXItPmFkZHIuc29ja0FkZHI7CisJc21iX21zZy5tc2dfbmFtZSA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNlcnZlci0+ZHN0YWRkcjsKIAlzbWJfbXNnLm1zZ19uYW1lbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcik7CiAJc21iX21zZy5tc2dfY29udHJvbCA9IE5VTEw7CiAJc21iX21zZy5tc2dfY29udHJvbGxlbiA9IDA7CmRpZmYgLS1naXQgYS9mcy9kbG0vbG93Y29tbXMuYyBiL2ZzL2RsbS9sb3djb21tcy5jCmluZGV4IDM3YTM0YzIuLjljNjRhZTkgMTAwNjQ0Ci0tLSBhL2ZzL2RsbS9sb3djb21tcy5jCisrKyBiL2ZzL2RsbS9sb3djb21tcy5jCkBAIC02Myw2ICs2Myw5IEBACiAjZGVmaW5lIE5FRURFRF9STUVNICg0KjEwMjQqMTAyNCkKICNkZWZpbmUgQ09OTl9IQVNIX1NJWkUgMzIKIAorLyogTnVtYmVyIG9mIG1lc3NhZ2VzIHRvIHNlbmQgYmVmb3JlIHJlc2NoZWR1bGluZyAqLworI2RlZmluZSBNQVhfU0VORF9NU0dfQ09VTlQgMjUKKwogc3RydWN0IGNidWYgewogCXVuc2lnbmVkIGludCBiYXNlOwogCXVuc2lnbmVkIGludCBsZW47CkBAIC0xMDgsNiArMTExLDcgQEAKICNkZWZpbmUgQ0ZfSU5JVF9QRU5ESU5HIDQKICNkZWZpbmUgQ0ZfSVNfT1RIRVJDT04gNQogI2RlZmluZSBDRl9DTE9TRSA2CisjZGVmaW5lIENGX0FQUF9MSU1JVEVEIDcKIAlzdHJ1Y3QgbGlzdF9oZWFkIHdyaXRlcXVldWU7ICAvKiBMaXN0IG9mIG91dGdvaW5nIHdyaXRlcXVldWVfZW50cmllcyAqLwogCXNwaW5sb2NrX3Qgd3JpdGVxdWV1ZV9sb2NrOwogCWludCAoKnJ4X2FjdGlvbikgKHN0cnVjdCBjb25uZWN0aW9uICopOwkvKiBXaGF0IHRvIGRvIHdoZW4gYWN0aXZlICovCkBAIC0yOTUsNyArMjk5LDE3IEBACiB7CiAJc3RydWN0IGNvbm5lY3Rpb24gKmNvbiA9IHNvY2syY29uKHNrKTsKIAotCWlmIChjb24gJiYgIXRlc3RfYW5kX3NldF9iaXQoQ0ZfV1JJVEVfUEVORElORywgJmNvbi0+ZmxhZ3MpKQorCWlmICghY29uKQorCQlyZXR1cm47CisKKwljbGVhcl9iaXQoU09DS19OT1NQQUNFLCAmY29uLT5zb2NrLT5mbGFncyk7CisKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KENGX0FQUF9MSU1JVEVELCAmY29uLT5mbGFncykpIHsKKwkJY29uLT5zb2NrLT5zay0+c2tfd3JpdGVfcGVuZGluZy0tOworCQljbGVhcl9iaXQoU09DS19BU1lOQ19OT1NQQUNFLCAmY29uLT5zb2NrLT5mbGFncyk7CisJfQorCisJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KENGX1dSSVRFX1BFTkRJTkcsICZjb24tPmZsYWdzKSkKIAkJcXVldWVfd29yayhzZW5kX3dvcmtxdWV1ZSwgJmNvbi0+c3dvcmspOwogfQogCkBAIC05MTUsNiArOTI5LDcgQEAKIAlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzYWRkciwgc3JjX2FkZHI7CiAJaW50IGFkZHJfbGVuOwogCXN0cnVjdCBzb2NrZXQgKnNvY2sgPSBOVUxMOworCWludCBvbmUgPSAxOwogCiAJaWYgKGNvbi0+bm9kZWlkID09IDApIHsKIAkJbG9nX3ByaW50KCJhdHRlbXB0IHRvIGNvbm5lY3Qgc29jayAwIGZvaWxlZCIpOwpAQCAtOTYwLDYgKzk3NSwxMSBAQAogCW1ha2Vfc29ja2FkZHIoJnNhZGRyLCBkbG1fY29uZmlnLmNpX3RjcF9wb3J0LCAmYWRkcl9sZW4pOwogCiAJbG9nX3ByaW50KCJjb25uZWN0aW5nIHRvICVkIiwgY29uLT5ub2RlaWQpOworCisJLyogVHVybiBvZmYgTmFnbGUncyBhbGdvcml0aG0gKi8KKwlrZXJuZWxfc2V0c29ja29wdChzb2NrLCBTT0xfVENQLCBUQ1BfTk9ERUxBWSwgKGNoYXIgKikmb25lLAorCQkJICBzaXplb2Yob25lKSk7CisKIAlyZXN1bHQgPQogCQlzb2NrLT5vcHMtPmNvbm5lY3Qoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZzYWRkciwgYWRkcl9sZW4sCiAJCQkJICAgT19OT05CTE9DSyk7CkBAIC0xMDExLDYgKzEwMzEsMTAgQEAKIAkJZ290byBjcmVhdGVfb3V0OwogCX0KIAorCS8qIFR1cm4gb2ZmIE5hZ2xlJ3MgYWxnb3JpdGhtICovCisJa2VybmVsX3NldHNvY2tvcHQoc29jaywgU09MX1RDUCwgVENQX05PREVMQVksIChjaGFyICopJm9uZSwKKwkJCSAgc2l6ZW9mKG9uZSkpOworCiAJcmVzdWx0ID0ga2VybmVsX3NldHNvY2tvcHQoc29jaywgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLAogCQkJCSAgIChjaGFyICopJm9uZSwgc2l6ZW9mKG9uZSkpOwogCkBAIC0xMjk3LDYgKzEzMjEsNyBAQAogCWNvbnN0IGludCBtc2dfZmxhZ3MgPSBNU0dfRE9OVFdBSVQgfCBNU0dfTk9TSUdOQUw7CiAJc3RydWN0IHdyaXRlcXVldWVfZW50cnkgKmU7CiAJaW50IGxlbiwgb2Zmc2V0OworCWludCBjb3VudCA9IDA7CiAKIAltdXRleF9sb2NrKCZjb24tPnNvY2tfbXV0ZXgpOwogCWlmIChjb24tPnNvY2sgPT0gTlVMTCkKQEAgLTEzMTksMTQgKzEzNDQsMjcgQEAKIAkJCXJldCA9IGtlcm5lbF9zZW5kcGFnZShjb24tPnNvY2ssIGUtPnBhZ2UsIG9mZnNldCwgbGVuLAogCQkJCQkgICAgICBtc2dfZmxhZ3MpOwogCQkJaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAwKSB7CisJCQkJaWYgKHJldCA9PSAtRUFHQUlOICYmCisJCQkJICAgIHRlc3RfYml0KFNPQ0tfQVNZTkNfTk9TUEFDRSwgJmNvbi0+c29jay0+ZmxhZ3MpICYmCisJCQkJICAgICF0ZXN0X2FuZF9zZXRfYml0KENGX0FQUF9MSU1JVEVELCAmY29uLT5mbGFncykpIHsKKwkJCQkJLyogTm90aWZ5IFRDUCB0aGF0IHdlJ3JlIGxpbWl0ZWQgYnkgdGhlCisJCQkJCSAqIGFwcGxpY2F0aW9uIHdpbmRvdyBzaXplLgorCQkJCQkgKi8KKwkJCQkJc2V0X2JpdChTT0NLX05PU1BBQ0UsICZjb24tPnNvY2stPmZsYWdzKTsKKwkJCQkJY29uLT5zb2NrLT5zay0+c2tfd3JpdGVfcGVuZGluZysrOworCQkJCX0KIAkJCQljb25kX3Jlc2NoZWQoKTsKIAkJCQlnb3RvIG91dDsKIAkJCX0KIAkJCWlmIChyZXQgPD0gMCkKIAkJCQlnb3RvIHNlbmRfZXJyb3I7CiAJCX0KLQkJCS8qIERvbid0IHN0YXJ2ZSBwZW9wbGUgZmlsbGluZyBidWZmZXJzICovCisKKwkJLyogRG9uJ3Qgc3RhcnZlIHBlb3BsZSBmaWxsaW5nIGJ1ZmZlcnMgKi8KKwkJaWYgKCsrY291bnQgPj0gTUFYX1NFTkRfTVNHX0NPVU5UKSB7CiAJCQljb25kX3Jlc2NoZWQoKTsKKwkJCWNvdW50ID0gMDsKKwkJfQogCiAJCXNwaW5fbG9jaygmY29uLT53cml0ZXF1ZXVlX2xvY2spOwogCQllLT5vZmZzZXQgKz0gcmV0OwpAQCAtMTQzMCwyMCArMTQ2OCwxOSBAQAogCiBzdGF0aWMgaW50IHdvcmtfc3RhcnQodm9pZCkKIHsKLQlpbnQgZXJyb3I7Ci0JcmVjdl93b3JrcXVldWUgPSBjcmVhdGVfd29ya3F1ZXVlKCJkbG1fcmVjdiIpOwotCWVycm9yID0gSVNfRVJSKHJlY3Zfd29ya3F1ZXVlKTsKLQlpZiAoZXJyb3IpIHsKLQkJbG9nX3ByaW50KCJjYW4ndCBzdGFydCBkbG1fcmVjdiAlZCIsIGVycm9yKTsKLQkJcmV0dXJuIGVycm9yOworCXJlY3Zfd29ya3F1ZXVlID0gYWxsb2Nfd29ya3F1ZXVlKCJkbG1fcmVjdiIsIFdRX01FTV9SRUNMQUlNIHwKKwkJCQkJIFdRX0hJR0hQUkkgfCBXUV9GUkVFWkVBQkxFLCAwKTsKKwlpZiAoIXJlY3Zfd29ya3F1ZXVlKSB7CisJCWxvZ19wcmludCgiY2FuJ3Qgc3RhcnQgZGxtX3JlY3YiKTsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0Jc2VuZF93b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgiZGxtX3NlbmQiKTsKLQllcnJvciA9IElTX0VSUihzZW5kX3dvcmtxdWV1ZSk7Ci0JaWYgKGVycm9yKSB7Ci0JCWxvZ19wcmludCgiY2FuJ3Qgc3RhcnQgZGxtX3NlbmQgJWQiLCBlcnJvcik7CisJc2VuZF93b3JrcXVldWUgPSBhbGxvY193b3JrcXVldWUoImRsbV9zZW5kIiwgV1FfTUVNX1JFQ0xBSU0gfAorCQkJCQkgV1FfSElHSFBSSSB8IFdRX0ZSRUVaRUFCTEUsIDApOworCWlmICghc2VuZF93b3JrcXVldWUpIHsKKwkJbG9nX3ByaW50KCJjYW4ndCBzdGFydCBkbG1fc2VuZCIpOwogCQlkZXN0cm95X3dvcmtxdWV1ZShyZWN2X3dvcmtxdWV1ZSk7Ci0JCXJldHVybiBlcnJvcjsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9mcy9mdXNlL2Rldi5jIGIvZnMvZnVzZS9kZXYuYwppbmRleCA2ZTA3Njk2Li5jZjhkMjhkIDEwMDY0NAotLS0gYS9mcy9mdXNlL2Rldi5jCisrKyBiL2ZzL2Z1c2UvZGV2LmMKQEAgLTI1MSw2ICsyNTEsMjAgQEAKIAlraWxsX2Zhc3luYygmZmMtPmZhc3luYywgU0lHSU8sIFBPTExfSU4pOwogfQogCit2b2lkIGZ1c2VfcXVldWVfZm9yZ2V0KHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9mb3JnZXRfbGluayAqZm9yZ2V0LAorCQkgICAgICAgdTY0IG5vZGVpZCwgdTY0IG5sb29rdXApCit7CisJZm9yZ2V0LT5mb3JnZXRfb25lLm5vZGVpZCA9IG5vZGVpZDsKKwlmb3JnZXQtPmZvcmdldF9vbmUubmxvb2t1cCA9IG5sb29rdXA7CisKKwlzcGluX2xvY2soJmZjLT5sb2NrKTsKKwlmYy0+Zm9yZ2V0X2xpc3RfdGFpbC0+bmV4dCA9IGZvcmdldDsKKwlmYy0+Zm9yZ2V0X2xpc3RfdGFpbCA9IGZvcmdldDsKKwl3YWtlX3VwKCZmYy0+d2FpdHEpOworCWtpbGxfZmFzeW5jKCZmYy0+ZmFzeW5jLCBTSUdJTywgUE9MTF9JTik7CisJc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKK30KKwogc3RhdGljIHZvaWQgZmx1c2hfYmdfcXVldWUoc3RydWN0IGZ1c2VfY29ubiAqZmMpCiB7CiAJd2hpbGUgKGZjLT5hY3RpdmVfYmFja2dyb3VuZCA8IGZjLT5tYXhfYmFja2dyb3VuZCAmJgpAQCAtNDM4LDEyICs0NTIsNiBAQAogCX0KIH0KIAotdm9pZCBmdXNlX3JlcXVlc3Rfc2VuZF9ub3JlcGx5KHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKLXsKLQlyZXEtPmlzcmVwbHkgPSAwOwotCWZ1c2VfcmVxdWVzdF9zZW5kX25vd2FpdChmYywgcmVxKTsKLX0KLQogdm9pZCBmdXNlX3JlcXVlc3Rfc2VuZF9iYWNrZ3JvdW5kKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKIHsKIAlyZXEtPmlzcmVwbHkgPSAxOwpAQCAtODk2LDkgKzkwNCwxNSBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBpbnQgZm9yZ2V0X3BlbmRpbmcoc3RydWN0IGZ1c2VfY29ubiAqZmMpCit7CisJcmV0dXJuIGZjLT5mb3JnZXRfbGlzdF9oZWFkLm5leHQgIT0gTlVMTDsKK30KKwogc3RhdGljIGludCByZXF1ZXN0X3BlbmRpbmcoc3RydWN0IGZ1c2VfY29ubiAqZmMpCiB7Ci0JcmV0dXJuICFsaXN0X2VtcHR5KCZmYy0+cGVuZGluZykgfHwgIWxpc3RfZW1wdHkoJmZjLT5pbnRlcnJ1cHRzKTsKKwlyZXR1cm4gIWxpc3RfZW1wdHkoJmZjLT5wZW5kaW5nKSB8fCAhbGlzdF9lbXB0eSgmZmMtPmludGVycnVwdHMpIHx8CisJCWZvcmdldF9wZW5kaW5nKGZjKTsKIH0KIAogLyogV2FpdCB1bnRpbCBhIHJlcXVlc3QgaXMgYXZhaWxhYmxlIG9uIHRoZSBwZW5kaW5nIGxpc3QgKi8KQEAgLTk2MCw2ICs5NzQsMTIwIEBACiAJcmV0dXJuIGVyciA/IGVyciA6IHJlcXNpemU7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgZnVzZV9mb3JnZXRfbGluayAqZGVxdWV1ZV9mb3JnZXQoc3RydWN0IGZ1c2VfY29ubiAqZmMsCisJCQkJCSAgICAgICB1bnNpZ25lZCBtYXgsCisJCQkJCSAgICAgICB1bnNpZ25lZCAqY291bnRwKQoreworCXN0cnVjdCBmdXNlX2ZvcmdldF9saW5rICpoZWFkID0gZmMtPmZvcmdldF9saXN0X2hlYWQubmV4dDsKKwlzdHJ1Y3QgZnVzZV9mb3JnZXRfbGluayAqKm5ld2hlYWQgPSAmaGVhZDsKKwl1bnNpZ25lZCBjb3VudDsKKworCWZvciAoY291bnQgPSAwOyAqbmV3aGVhZCAhPSBOVUxMICYmIGNvdW50IDwgbWF4OyBjb3VudCsrKQorCQluZXdoZWFkID0gJigqbmV3aGVhZCktPm5leHQ7CisKKwlmYy0+Zm9yZ2V0X2xpc3RfaGVhZC5uZXh0ID0gKm5ld2hlYWQ7CisJKm5ld2hlYWQgPSBOVUxMOworCWlmIChmYy0+Zm9yZ2V0X2xpc3RfaGVhZC5uZXh0ID09IE5VTEwpCisJCWZjLT5mb3JnZXRfbGlzdF90YWlsID0gJmZjLT5mb3JnZXRfbGlzdF9oZWFkOworCisJaWYgKGNvdW50cCAhPSBOVUxMKQorCQkqY291bnRwID0gY291bnQ7CisKKwlyZXR1cm4gaGVhZDsKK30KKworc3RhdGljIGludCBmdXNlX3JlYWRfc2luZ2xlX2ZvcmdldChzdHJ1Y3QgZnVzZV9jb25uICpmYywKKwkJCQkgICBzdHJ1Y3QgZnVzZV9jb3B5X3N0YXRlICpjcywKKwkJCQkgICBzaXplX3QgbmJ5dGVzKQorX19yZWxlYXNlcyhmYy0+bG9jaykKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBmdXNlX2ZvcmdldF9saW5rICpmb3JnZXQgPSBkZXF1ZXVlX2ZvcmdldChmYywgMSwgTlVMTCk7CisJc3RydWN0IGZ1c2VfZm9yZ2V0X2luIGFyZyA9IHsKKwkJLm5sb29rdXAgPSBmb3JnZXQtPmZvcmdldF9vbmUubmxvb2t1cCwKKwl9OworCXN0cnVjdCBmdXNlX2luX2hlYWRlciBpaCA9IHsKKwkJLm9wY29kZSA9IEZVU0VfRk9SR0VULAorCQkubm9kZWlkID0gZm9yZ2V0LT5mb3JnZXRfb25lLm5vZGVpZCwKKwkJLnVuaXF1ZSA9IGZ1c2VfZ2V0X3VuaXF1ZShmYyksCisJCS5sZW4gPSBzaXplb2YoaWgpICsgc2l6ZW9mKGFyZyksCisJfTsKKworCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7CisJa2ZyZWUoZm9yZ2V0KTsKKwlpZiAobmJ5dGVzIDwgaWgubGVuKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVyciA9IGZ1c2VfY29weV9vbmUoY3MsICZpaCwgc2l6ZW9mKGloKSk7CisJaWYgKCFlcnIpCisJCWVyciA9IGZ1c2VfY29weV9vbmUoY3MsICZhcmcsIHNpemVvZihhcmcpKTsKKwlmdXNlX2NvcHlfZmluaXNoKGNzKTsKKworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gaWgubGVuOworfQorCitzdGF0aWMgaW50IGZ1c2VfcmVhZF9iYXRjaF9mb3JnZXQoc3RydWN0IGZ1c2VfY29ubiAqZmMsCisJCQkJICAgc3RydWN0IGZ1c2VfY29weV9zdGF0ZSAqY3MsIHNpemVfdCBuYnl0ZXMpCitfX3JlbGVhc2VzKGZjLT5sb2NrKQoreworCWludCBlcnI7CisJdW5zaWduZWQgbWF4X2ZvcmdldHM7CisJdW5zaWduZWQgY291bnQ7CisJc3RydWN0IGZ1c2VfZm9yZ2V0X2xpbmsgKmhlYWQ7CisJc3RydWN0IGZ1c2VfYmF0Y2hfZm9yZ2V0X2luIGFyZyA9IHsgLmNvdW50ID0gMCB9OworCXN0cnVjdCBmdXNlX2luX2hlYWRlciBpaCA9IHsKKwkJLm9wY29kZSA9IEZVU0VfQkFUQ0hfRk9SR0VULAorCQkudW5pcXVlID0gZnVzZV9nZXRfdW5pcXVlKGZjKSwKKwkJLmxlbiA9IHNpemVvZihpaCkgKyBzaXplb2YoYXJnKSwKKwl9OworCisJaWYgKG5ieXRlcyA8IGloLmxlbikgeworCQlzcGluX3VubG9jaygmZmMtPmxvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltYXhfZm9yZ2V0cyA9IChuYnl0ZXMgLSBpaC5sZW4pIC8gc2l6ZW9mKHN0cnVjdCBmdXNlX2ZvcmdldF9vbmUpOworCWhlYWQgPSBkZXF1ZXVlX2ZvcmdldChmYywgbWF4X2ZvcmdldHMsICZjb3VudCk7CisJc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKKworCWFyZy5jb3VudCA9IGNvdW50OworCWloLmxlbiArPSBjb3VudCAqIHNpemVvZihzdHJ1Y3QgZnVzZV9mb3JnZXRfb25lKTsKKwllcnIgPSBmdXNlX2NvcHlfb25lKGNzLCAmaWgsIHNpemVvZihpaCkpOworCWlmICghZXJyKQorCQllcnIgPSBmdXNlX2NvcHlfb25lKGNzLCAmYXJnLCBzaXplb2YoYXJnKSk7CisKKwl3aGlsZSAoaGVhZCkgeworCQlzdHJ1Y3QgZnVzZV9mb3JnZXRfbGluayAqZm9yZ2V0ID0gaGVhZDsKKworCQlpZiAoIWVycikgeworCQkJZXJyID0gZnVzZV9jb3B5X29uZShjcywgJmZvcmdldC0+Zm9yZ2V0X29uZSwKKwkJCQkJICAgIHNpemVvZihmb3JnZXQtPmZvcmdldF9vbmUpKTsKKwkJfQorCQloZWFkID0gZm9yZ2V0LT5uZXh0OworCQlrZnJlZShmb3JnZXQpOworCX0KKworCWZ1c2VfY29weV9maW5pc2goY3MpOworCisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiBpaC5sZW47Cit9CisKK3N0YXRpYyBpbnQgZnVzZV9yZWFkX2ZvcmdldChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfY29weV9zdGF0ZSAqY3MsCisJCQkgICAgc2l6ZV90IG5ieXRlcykKK19fcmVsZWFzZXMoZmMtPmxvY2spCit7CisJaWYgKGZjLT5taW5vciA8IDE2IHx8IGZjLT5mb3JnZXRfbGlzdF9oZWFkLm5leHQtPm5leHQgPT0gTlVMTCkKKwkJcmV0dXJuIGZ1c2VfcmVhZF9zaW5nbGVfZm9yZ2V0KGZjLCBjcywgbmJ5dGVzKTsKKwllbHNlCisJCXJldHVybiBmdXNlX3JlYWRfYmF0Y2hfZm9yZ2V0KGZjLCBjcywgbmJ5dGVzKTsKK30KKwogLyoKICAqIFJlYWQgYSBzaW5nbGUgcmVxdWVzdCBpbnRvIHRoZSB1c2Vyc3BhY2UgZmlsZXN5c3RlbSdzIGJ1ZmZlci4gIFRoaXMKICAqIGZ1bmN0aW9uIHdhaXRzIHVudGlsIGEgcmVxdWVzdCBpcyBhdmFpbGFibGUsIHRoZW4gcmVtb3ZlcyBpdCBmcm9tCkBAIC05OTgsNiArMTEyNiwxNCBAQAogCQlyZXR1cm4gZnVzZV9yZWFkX2ludGVycnVwdChmYywgY3MsIG5ieXRlcywgcmVxKTsKIAl9CiAKKwlpZiAoZm9yZ2V0X3BlbmRpbmcoZmMpKSB7CisJCWlmIChsaXN0X2VtcHR5KCZmYy0+cGVuZGluZykgfHwgZmMtPmZvcmdldF9iYXRjaC0tID4gMCkKKwkJCXJldHVybiBmdXNlX3JlYWRfZm9yZ2V0KGZjLCBjcywgbmJ5dGVzKTsKKworCQlpZiAoZmMtPmZvcmdldF9iYXRjaCA8PSAtOCkKKwkJCWZjLT5mb3JnZXRfYmF0Y2ggPSAxNjsKKwl9CisKIAlyZXEgPSBsaXN0X2VudHJ5KGZjLT5wZW5kaW5nLm5leHQsIHN0cnVjdCBmdXNlX3JlcSwgbGlzdCk7CiAJcmVxLT5zdGF0ZSA9IEZVU0VfUkVRX1JFQURJTkc7CiAJbGlzdF9tb3ZlKCZyZXEtPmxpc3QsICZmYy0+aW8pOwpAQCAtMTA5MCw3ICsxMjI2LDcgQEAKIAlpZiAoIWZjKQogCQlyZXR1cm4gLUVQRVJNOwogCi0JYnVmcyA9IGttYWxsb2MocGlwZS0+YnVmZmVycyAqIHNpemVvZiAoc3RydWN0IHBpcGVfYnVmZmVyKSwgR0ZQX0tFUk5FTCk7CisJYnVmcyA9IGttYWxsb2MocGlwZS0+YnVmZmVycyAqIHNpemVvZihzdHJ1Y3QgcGlwZV9idWZmZXIpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZnMpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0xNjI2LDcgKzE3NjIsNyBAQAogCWlmICghZmMpCiAJCXJldHVybiAtRVBFUk07CiAKLQlidWZzID0ga21hbGxvYyhwaXBlLT5idWZmZXJzICogc2l6ZW9mIChzdHJ1Y3QgcGlwZV9idWZmZXIpLCBHRlBfS0VSTkVMKTsKKwlidWZzID0ga21hbGxvYyhwaXBlLT5idWZmZXJzICogc2l6ZW9mKHN0cnVjdCBwaXBlX2J1ZmZlciksIEdGUF9LRVJORUwpOwogCWlmICghYnVmcykKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTE3NzAsNiArMTkwNiw4IEBACiAJZmx1c2hfYmdfcXVldWUoZmMpOwogCWVuZF9yZXF1ZXN0cyhmYywgJmZjLT5wZW5kaW5nKTsKIAllbmRfcmVxdWVzdHMoZmMsICZmYy0+cHJvY2Vzc2luZyk7CisJd2hpbGUgKGZvcmdldF9wZW5kaW5nKGZjKSkKKwkJa2ZyZWUoZGVxdWV1ZV9mb3JnZXQoZmMsIDEsIE5VTEwpKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvZGlyLmMgYi9mcy9mdXNlL2Rpci5jCmluZGV4IGY3Mzg1OTkuLjA0MmFmNzMgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvZGlyLmMKKysrIGIvZnMvZnVzZS9kaXIuYwpAQCAtMTAsOSArMTAsOSBAQAogCiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaWYgQklUU19QRVJfTE9ORyA+PSA2NAogc3RhdGljIGlubGluZSB2b2lkIGZ1c2VfZGVudHJ5X3NldHRpbWUoc3RydWN0IGRlbnRyeSAqZW50cnksIHU2NCB0aW1lKQpAQCAtMTY5LDcgKzE2OSw3IEBACiAJCXN0cnVjdCBmdXNlX2VudHJ5X291dCBvdXRhcmc7CiAJCXN0cnVjdCBmdXNlX2Nvbm4gKmZjOwogCQlzdHJ1Y3QgZnVzZV9yZXEgKnJlcTsKLQkJc3RydWN0IGZ1c2VfcmVxICpmb3JnZXRfcmVxOworCQlzdHJ1Y3QgZnVzZV9mb3JnZXRfbGluayAqZm9yZ2V0OwogCQlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQ7CiAJCXU2NCBhdHRyX3ZlcnNpb247CiAKQEAgLTE4Miw4ICsxODIsOCBAQAogCQlpZiAoSVNfRVJSKHJlcSkpCiAJCQlyZXR1cm4gMDsKIAotCQlmb3JnZXRfcmVxID0gZnVzZV9nZXRfcmVxKGZjKTsKLQkJaWYgKElTX0VSUihmb3JnZXRfcmVxKSkgeworCQlmb3JnZXQgPSBmdXNlX2FsbG9jX2ZvcmdldCgpOworCQlpZiAoIWZvcmdldCkgewogCQkJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKIAkJCXJldHVybiAwOwogCQl9CkBAIC0yMDMsMTUgKzIwMywxNCBAQAogCQlpZiAoIWVycikgewogCQkJc3RydWN0IGZ1c2VfaW5vZGUgKmZpID0gZ2V0X2Z1c2VfaW5vZGUoaW5vZGUpOwogCQkJaWYgKG91dGFyZy5ub2RlaWQgIT0gZ2V0X25vZGVfaWQoaW5vZGUpKSB7Ci0JCQkJZnVzZV9zZW5kX2ZvcmdldChmYywgZm9yZ2V0X3JlcSwKLQkJCQkJCSBvdXRhcmcubm9kZWlkLCAxKTsKKwkJCQlmdXNlX3F1ZXVlX2ZvcmdldChmYywgZm9yZ2V0LCBvdXRhcmcubm9kZWlkLCAxKTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJCXNwaW5fbG9jaygmZmMtPmxvY2spOwogCQkJZmktPm5sb29rdXArKzsKIAkJCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7CiAJCX0KLQkJZnVzZV9wdXRfcmVxdWVzdChmYywgZm9yZ2V0X3JlcSk7CisJCWtmcmVlKGZvcmdldCk7CiAJCWlmIChlcnIgfHwgKG91dGFyZy5hdHRyLm1vZGUgXiBpbm9kZS0+aV9tb2RlKSAmIFNfSUZNVCkKIAkJCXJldHVybiAwOwogCkBAIC0yNjMsNyArMjYyLDcgQEAKIHsKIAlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm5fc3VwZXIoc2IpOwogCXN0cnVjdCBmdXNlX3JlcSAqcmVxOwotCXN0cnVjdCBmdXNlX3JlcSAqZm9yZ2V0X3JlcTsKKwlzdHJ1Y3QgZnVzZV9mb3JnZXRfbGluayAqZm9yZ2V0OwogCXU2NCBhdHRyX3ZlcnNpb247CiAJaW50IGVycjsKIApAQCAtMjc3LDkgKzI3Niw5IEBACiAJaWYgKElTX0VSUihyZXEpKQogCQlnb3RvIG91dDsKIAotCWZvcmdldF9yZXEgPSBmdXNlX2dldF9yZXEoZmMpOwotCWVyciA9IFBUUl9FUlIoZm9yZ2V0X3JlcSk7Ci0JaWYgKElTX0VSUihmb3JnZXRfcmVxKSkgeworCWZvcmdldCA9IGZ1c2VfYWxsb2NfZm9yZ2V0KCk7CisJZXJyID0gLUVOT01FTTsKKwlpZiAoIWZvcmdldCkgewogCQlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwogCQlnb3RvIG91dDsKIAl9CkBAIC0zMDUsMTMgKzMwNCwxMyBAQAogCQkJICAgYXR0cl92ZXJzaW9uKTsKIAllcnIgPSAtRU5PTUVNOwogCWlmICghKmlub2RlKSB7Ci0JCWZ1c2Vfc2VuZF9mb3JnZXQoZmMsIGZvcmdldF9yZXEsIG91dGFyZy0+bm9kZWlkLCAxKTsKKwkJZnVzZV9xdWV1ZV9mb3JnZXQoZmMsIGZvcmdldCwgb3V0YXJnLT5ub2RlaWQsIDEpOwogCQlnb3RvIG91dDsKIAl9CiAJZXJyID0gMDsKIAogIG91dF9wdXRfZm9yZ2V0OgotCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIGZvcmdldF9yZXEpOworCWtmcmVlKGZvcmdldCk7CiAgb3V0OgogCXJldHVybiBlcnI7CiB9CkBAIC0zNzgsNyArMzc3LDcgQEAKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihkaXIpOwogCXN0cnVjdCBmdXNlX3JlcSAqcmVxOwotCXN0cnVjdCBmdXNlX3JlcSAqZm9yZ2V0X3JlcTsKKwlzdHJ1Y3QgZnVzZV9mb3JnZXRfbGluayAqZm9yZ2V0OwogCXN0cnVjdCBmdXNlX2NyZWF0ZV9pbiBpbmFyZzsKIAlzdHJ1Y3QgZnVzZV9vcGVuX291dCBvdXRvcGVuOwogCXN0cnVjdCBmdXNlX2VudHJ5X291dCBvdXRlbnRyeTsKQEAgLTM5Miw5ICszOTEsOSBAQAogCWlmIChmbGFncyAmIE9fRElSRUNUKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWZvcmdldF9yZXEgPSBmdXNlX2dldF9yZXEoZmMpOwotCWlmIChJU19FUlIoZm9yZ2V0X3JlcSkpCi0JCXJldHVybiBQVFJfRVJSKGZvcmdldF9yZXEpOworCWZvcmdldCA9IGZ1c2VfYWxsb2NfZm9yZ2V0KCk7CisJaWYgKCFmb3JnZXQpCisJCXJldHVybiAtRU5PTUVNOwogCiAJcmVxID0gZnVzZV9nZXRfcmVxKGZjKTsKIAllcnIgPSBQVFJfRVJSKHJlcSk7CkBAIC00NTIsMTAgKzQ1MSwxMCBAQAogCWlmICghaW5vZGUpIHsKIAkJZmxhZ3MgJj0gfihPX0NSRUFUIHwgT19FWENMIHwgT19UUlVOQyk7CiAJCWZ1c2Vfc3luY19yZWxlYXNlKGZmLCBmbGFncyk7Ci0JCWZ1c2Vfc2VuZF9mb3JnZXQoZmMsIGZvcmdldF9yZXEsIG91dGVudHJ5Lm5vZGVpZCwgMSk7CisJCWZ1c2VfcXVldWVfZm9yZ2V0KGZjLCBmb3JnZXQsIG91dGVudHJ5Lm5vZGVpZCwgMSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQlmdXNlX3B1dF9yZXF1ZXN0KGZjLCBmb3JnZXRfcmVxKTsKKwlrZnJlZShmb3JnZXQpOwogCWRfaW5zdGFudGlhdGUoZW50cnksIGlub2RlKTsKIAlmdXNlX2NoYW5nZV9lbnRyeV90aW1lb3V0KGVudHJ5LCAmb3V0ZW50cnkpOwogCWZ1c2VfaW52YWxpZGF0ZV9hdHRyKGRpcik7CkBAIC00NzMsNyArNDcyLDcgQEAKICBvdXRfcHV0X3JlcXVlc3Q6CiAJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKICBvdXRfcHV0X2ZvcmdldF9yZXE6Ci0JZnVzZV9wdXRfcmVxdWVzdChmYywgZm9yZ2V0X3JlcSk7CisJa2ZyZWUoZm9yZ2V0KTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC00ODcsMTIgKzQ4NiwxMiBAQAogCXN0cnVjdCBmdXNlX2VudHJ5X291dCBvdXRhcmc7CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlpbnQgZXJyOwotCXN0cnVjdCBmdXNlX3JlcSAqZm9yZ2V0X3JlcTsKKwlzdHJ1Y3QgZnVzZV9mb3JnZXRfbGluayAqZm9yZ2V0OwogCi0JZm9yZ2V0X3JlcSA9IGZ1c2VfZ2V0X3JlcShmYyk7Ci0JaWYgKElTX0VSUihmb3JnZXRfcmVxKSkgeworCWZvcmdldCA9IGZ1c2VfYWxsb2NfZm9yZ2V0KCk7CisJaWYgKCFmb3JnZXQpIHsKIAkJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKLQkJcmV0dXJuIFBUUl9FUlIoZm9yZ2V0X3JlcSk7CisJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCW1lbXNldCgmb3V0YXJnLCAwLCBzaXplb2Yob3V0YXJnKSk7CkBAIC01MTksMTAgKzUxOCwxMCBAQAogCWlub2RlID0gZnVzZV9pZ2V0KGRpci0+aV9zYiwgb3V0YXJnLm5vZGVpZCwgb3V0YXJnLmdlbmVyYXRpb24sCiAJCQkgICZvdXRhcmcuYXR0ciwgZW50cnlfYXR0cl90aW1lb3V0KCZvdXRhcmcpLCAwKTsKIAlpZiAoIWlub2RlKSB7Ci0JCWZ1c2Vfc2VuZF9mb3JnZXQoZmMsIGZvcmdldF9yZXEsIG91dGFyZy5ub2RlaWQsIDEpOworCQlmdXNlX3F1ZXVlX2ZvcmdldChmYywgZm9yZ2V0LCBvdXRhcmcubm9kZWlkLCAxKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIGZvcmdldF9yZXEpOworCWtmcmVlKGZvcmdldCk7CiAKIAlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgewogCQlzdHJ1Y3QgZGVudHJ5ICphbGlhczsKQEAgLTU0NSw3ICs1NDQsNyBAQAogCXJldHVybiAwOwogCiAgb3V0X3B1dF9mb3JnZXRfcmVxOgotCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIGZvcmdldF9yZXEpOworCWtmcmVlKGZvcmdldCk7CiAJcmV0dXJuIGVycjsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvZnVzZS9maWxlLmMgYi9mcy9mdXNlL2ZpbGUuYwppbmRleCA4Yjk4NGEyLi45NWRhMWJjIDEwMDY0NAotLS0gYS9mcy9mdXNlL2ZpbGUuYworKysgYi9mcy9mdXNlL2ZpbGUuYwpAQCAtMTYzNCw5ICsxNjM0LDkgQEAKICAqIGFuZCA2NGJpdC4gIEZvcnR1bmF0ZWx5IHdlIGNhbiBkZXRlcm1pbmUgd2hpY2ggc3RydWN0dXJlIHRoZSBzZXJ2ZXIKICAqIHVzZWQgZnJvbSB0aGUgc2l6ZSBvZiB0aGUgcmVwbHkuCiAgKi8KLXN0YXRpYyBpbnQgZnVzZV9jb3B5X2lvY3RsX2lvdmVjKHN0cnVjdCBpb3ZlYyAqZHN0LCB2b2lkICpzcmMsCi0JCQkJIHNpemVfdCB0cmFuc2ZlcnJlZCwgdW5zaWduZWQgY291bnQsCi0JCQkJIGJvb2wgaXNfY29tcGF0KQorc3RhdGljIGludCBmdXNlX2NvcHlfaW9jdGxfaW92ZWNfb2xkKHN0cnVjdCBpb3ZlYyAqZHN0LCB2b2lkICpzcmMsCisJCQkJICAgICBzaXplX3QgdHJhbnNmZXJyZWQsIHVuc2lnbmVkIGNvdW50LAorCQkJCSAgICAgYm9vbCBpc19jb21wYXQpCiB7CiAjaWZkZWYgQ09ORklHX0NPTVBBVAogCWlmIChjb3VudCAqIHNpemVvZihzdHJ1Y3QgY29tcGF0X2lvdmVjKSA9PSB0cmFuc2ZlcnJlZCkgewpAQCAtMTY4MCw2ICsxNjgwLDQyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZnVzZV9jb3B5X2lvY3RsX2lvdmVjKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgaW92ZWMgKmRzdCwKKwkJCQkgdm9pZCAqc3JjLCBzaXplX3QgdHJhbnNmZXJyZWQsIHVuc2lnbmVkIGNvdW50LAorCQkJCSBib29sIGlzX2NvbXBhdCkKK3sKKwl1bnNpZ25lZCBpOworCXN0cnVjdCBmdXNlX2lvY3RsX2lvdmVjICpmaW92ID0gc3JjOworCisJaWYgKGZjLT5taW5vciA8IDE2KSB7CisJCXJldHVybiBmdXNlX2NvcHlfaW9jdGxfaW92ZWNfb2xkKGRzdCwgc3JjLCB0cmFuc2ZlcnJlZCwKKwkJCQkJCSBjb3VudCwgaXNfY29tcGF0KTsKKwl9CisKKwlpZiAoY291bnQgKiBzaXplb2Yoc3RydWN0IGZ1c2VfaW9jdGxfaW92ZWMpICE9IHRyYW5zZmVycmVkKQorCQlyZXR1cm4gLUVJTzsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCS8qIERpZCB0aGUgc2VydmVyIHN1cHBseSBhbiBpbmFwcHJvcHJpYXRlIHZhbHVlPyAqLworCQlpZiAoZmlvdltpXS5iYXNlICE9ICh1bnNpZ25lZCBsb25nKSBmaW92W2ldLmJhc2UgfHwKKwkJICAgIGZpb3ZbaV0ubGVuICE9ICh1bnNpZ25lZCBsb25nKSBmaW92W2ldLmxlbikKKwkJCXJldHVybiAtRUlPOworCisJCWRzdFtpXS5pb3ZfYmFzZSA9ICh2b2lkIF9fdXNlciAqKSAodW5zaWduZWQgbG9uZykgZmlvdltpXS5iYXNlOworCQlkc3RbaV0uaW92X2xlbiA9IChzaXplX3QpIGZpb3ZbaV0ubGVuOworCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCQlpZiAoaXNfY29tcGF0ICYmCisJCSAgICAocHRyX3RvX2NvbXBhdChkc3RbaV0uaW92X2Jhc2UpICE9IGZpb3ZbaV0uYmFzZSB8fAorCQkgICAgIChjb21wYXRfc2l6ZV90KSBkc3RbaV0uaW92X2xlbiAhPSBmaW92W2ldLmxlbikpCisJCQlyZXR1cm4gLUVJTzsKKyNlbmRpZgorCX0KKworCXJldHVybiAwOworfQorCisKIC8qCiAgKiBGb3IgaW9jdGxzLCB0aGVyZSBpcyBubyBnZW5lcmljIHdheSB0byBkZXRlcm1pbmUgaG93IG11Y2ggbWVtb3J5CiAgKiBuZWVkcyB0byBiZSByZWFkIGFuZC9vciB3cml0dGVuLiAgRnVydGhlcm1vcmUsIGlvY3RscyBhcmUgYWxsb3dlZApAQCAtMTc0MCwxOCArMTc3NiwyNSBAQAogCXN0cnVjdCBmdXNlX2lvY3RsX291dCBvdXRhcmc7CiAJc3RydWN0IGZ1c2VfcmVxICpyZXEgPSBOVUxMOwogCXN0cnVjdCBwYWdlICoqcGFnZXMgPSBOVUxMOwotCXN0cnVjdCBwYWdlICppb3ZfcGFnZSA9IE5VTEw7CisJc3RydWN0IGlvdmVjICppb3ZfcGFnZSA9IE5VTEw7CiAJc3RydWN0IGlvdmVjICppbl9pb3YgPSBOVUxMLCAqb3V0X2lvdiA9IE5VTEw7CiAJdW5zaWduZWQgaW50IGluX2lvdnMgPSAwLCBvdXRfaW92cyA9IDAsIG51bV9wYWdlcyA9IDAsIG1heF9wYWdlczsKIAlzaXplX3QgaW5fc2l6ZSwgb3V0X3NpemUsIHRyYW5zZmVycmVkOwogCWludCBlcnI7CiAKKyNpZiBCSVRTX1BFUl9MT05HID09IDMyCisJaW5hcmcuZmxhZ3MgfD0gRlVTRV9JT0NUTF8zMkJJVDsKKyNlbHNlCisJaWYgKGZsYWdzICYgRlVTRV9JT0NUTF9DT01QQVQpCisJCWluYXJnLmZsYWdzIHw9IEZVU0VfSU9DVExfMzJCSVQ7CisjZW5kaWYKKwogCS8qIGFzc3VtZSBhbGwgdGhlIGlvdnMgcmV0dXJuZWQgYnkgY2xpZW50IGFsd2F5cyBmaXRzIGluIGEgcGFnZSAqLwotCUJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IGlvdmVjKSAqIEZVU0VfSU9DVExfTUFYX0lPViA+IFBBR0VfU0laRSk7CisJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgZnVzZV9pb2N0bF9pb3ZlYykgKiBGVVNFX0lPQ1RMX01BWF9JT1YgPiBQQUdFX1NJWkUpOwogCiAJZXJyID0gLUVOT01FTTsKIAlwYWdlcyA9IGt6YWxsb2Moc2l6ZW9mKHBhZ2VzWzBdKSAqIEZVU0VfTUFYX1BBR0VTX1BFUl9SRVEsIEdGUF9LRVJORUwpOwotCWlvdl9wYWdlID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMKTsKKwlpb3ZfcGFnZSA9IChzdHJ1Y3QgaW92ZWMgKikgX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOwogCWlmICghcGFnZXMgfHwgIWlvdl9wYWdlKQogCQlnb3RvIG91dDsKIApAQCAtMTc2MCw3ICsxODAzLDcgQEAKIAkgKiBSRVRSWSBmcm9tIHNlcnZlciBpcyBub3QgYWxsb3dlZC4KIAkgKi8KIAlpZiAoIShmbGFncyAmIEZVU0VfSU9DVExfVU5SRVNUUklDVEVEKSkgewotCQlzdHJ1Y3QgaW92ZWMgKmlvdiA9IHBhZ2VfYWRkcmVzcyhpb3ZfcGFnZSk7CisJCXN0cnVjdCBpb3ZlYyAqaW92ID0gaW92X3BhZ2U7CiAKIAkJaW92LT5pb3ZfYmFzZSA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAkJaW92LT5pb3ZfbGVuID0gX0lPQ19TSVpFKGNtZCk7CkBAIC0xODQxLDcgKzE4ODQsNyBAQAogCiAJLyogZGlkIGl0IGFzayBmb3IgcmV0cnk/ICovCiAJaWYgKG91dGFyZy5mbGFncyAmIEZVU0VfSU9DVExfUkVUUlkpIHsKLQkJY2hhciAqdmFkZHI7CisJCXZvaWQgKnZhZGRyOwogCiAJCS8qIG5vIHJldHJ5IGlmIGluIHJlc3RyaWN0ZWQgbW9kZSAqLwogCQllcnIgPSAtRUlPOwpAQCAtMTg2MiwxNCArMTkwNSwxNCBAQAogCQkJZ290byBvdXQ7CiAKIAkJdmFkZHIgPSBrbWFwX2F0b21pYyhwYWdlc1swXSwgS01fVVNFUjApOwotCQllcnIgPSBmdXNlX2NvcHlfaW9jdGxfaW92ZWMocGFnZV9hZGRyZXNzKGlvdl9wYWdlKSwgdmFkZHIsCisJCWVyciA9IGZ1c2VfY29weV9pb2N0bF9pb3ZlYyhmYywgaW92X3BhZ2UsIHZhZGRyLAogCQkJCQkgICAgdHJhbnNmZXJyZWQsIGluX2lvdnMgKyBvdXRfaW92cywKIAkJCQkJICAgIChmbGFncyAmIEZVU0VfSU9DVExfQ09NUEFUKSAhPSAwKTsKIAkJa3VubWFwX2F0b21pYyh2YWRkciwgS01fVVNFUjApOwogCQlpZiAoZXJyKQogCQkJZ290byBvdXQ7CiAKLQkJaW5faW92ID0gcGFnZV9hZGRyZXNzKGlvdl9wYWdlKTsKKwkJaW5faW92ID0gaW92X3BhZ2U7CiAJCW91dF9pb3YgPSBpbl9pb3YgKyBpbl9pb3ZzOwogCiAJCWVyciA9IGZ1c2VfdmVyaWZ5X2lvY3RsX2lvdihpbl9pb3YsIGluX2lvdnMpOwpAQCAtMTg5MSw4ICsxOTM0LDcgQEAKICBvdXQ6CiAJaWYgKHJlcSkKIAkJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKLQlpZiAoaW92X3BhZ2UpCi0JCV9fZnJlZV9wYWdlKGlvdl9wYWdlKTsKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGlvdl9wYWdlKTsKIAl3aGlsZSAobnVtX3BhZ2VzKQogCQlfX2ZyZWVfcGFnZShwYWdlc1stLW51bV9wYWdlc10pOwogCWtmcmVlKHBhZ2VzKTsKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvZnVzZV9pLmggYi9mcy9mdXNlL2Z1c2VfaS5oCmluZGV4IDU3ZDRhM2EuLmFlNTc0NGEgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvZnVzZV9pLmgKKysrIGIvZnMvZnVzZS9mdXNlX2kuaApAQCAtNTMsNiArNTMsMTIgQEAKIGV4dGVybiB1bnNpZ25lZCBtYXhfdXNlcl9iZ3JlcTsKIGV4dGVybiB1bnNpZ25lZCBtYXhfdXNlcl9jb25ndGhyZXNoOwogCisvKiBPbmUgZm9yZ2V0IHJlcXVlc3QgKi8KK3N0cnVjdCBmdXNlX2ZvcmdldF9saW5rIHsKKwlzdHJ1Y3QgZnVzZV9mb3JnZXRfb25lIGZvcmdldF9vbmU7CisJc3RydWN0IGZ1c2VfZm9yZ2V0X2xpbmsgKm5leHQ7Cit9OworCiAvKiogRlVTRSBpbm9kZSAqLwogc3RydWN0IGZ1c2VfaW5vZGUgewogCS8qKiBJbm9kZSBkYXRhICovCkBAIC02Niw3ICs3Miw3IEBACiAJdTY0IG5sb29rdXA7CiAKIAkvKiogVGhlIHJlcXVlc3QgdXNlZCBmb3Igc2VuZGluZyB0aGUgRk9SR0VUIG1lc3NhZ2UgKi8KLQlzdHJ1Y3QgZnVzZV9yZXEgKmZvcmdldF9yZXE7CisJc3RydWN0IGZ1c2VfZm9yZ2V0X2xpbmsgKmZvcmdldDsKIAogCS8qKiBUaW1lIGluIGppZmZpZXMgdW50aWwgdGhlIGZpbGUgYXR0cmlidXRlcyBhcmUgdmFsaWQgKi8KIAl1NjQgaV90aW1lOwpAQCAtMjU1LDcgKzI2MSw2IEBACiAKIAkvKiogRGF0YSBmb3IgYXN5bmNocm9ub3VzIHJlcXVlc3RzICovCiAJdW5pb24gewotCQlzdHJ1Y3QgZnVzZV9mb3JnZXRfaW4gZm9yZ2V0X2luOwogCQlzdHJ1Y3QgewogCQkJc3RydWN0IGZ1c2VfcmVsZWFzZV9pbiBpbjsKIAkJCXN0cnVjdCBwYXRoIHBhdGg7CkBAIC0zNjksNiArMzc0LDEzIEBACiAJLyoqIFBlbmRpbmcgaW50ZXJydXB0cyAqLwogCXN0cnVjdCBsaXN0X2hlYWQgaW50ZXJydXB0czsKIAorCS8qKiBRdWV1ZSBvZiBwZW5kaW5nIGZvcmdldHMgKi8KKwlzdHJ1Y3QgZnVzZV9mb3JnZXRfbGluayBmb3JnZXRfbGlzdF9oZWFkOworCXN0cnVjdCBmdXNlX2ZvcmdldF9saW5rICpmb3JnZXRfbGlzdF90YWlsOworCisJLyoqIEJhdGNoaW5nIG9mIEZPUkdFVCByZXF1ZXN0cyAocG9zaXRpdmUgaW5kaWNhdGVzIEZPUkdFVCBiYXRjaCkgKi8KKwlpbnQgZm9yZ2V0X2JhdGNoOworCiAJLyoqIEZsYWcgaW5kaWNhdGluZyBpZiBjb25uZWN0aW9uIGlzIGJsb2NrZWQuICBUaGlzIHdpbGwgYmUKIAkgICAgdGhlIGNhc2UgYmVmb3JlIHRoZSBJTklUIHJlcGx5IGlzIHJlY2VpdmVkLCBhbmQgaWYgdGhlcmUKIAkgICAgYXJlIHRvbyBtYW55IG91dHN0YWRpbmcgYmFja2dyb3VuZHMgcmVxdWVzdHMgKi8KQEAgLTU0Myw4ICs1NTUsMTAgQEAKIC8qKgogICogU2VuZCBGT1JHRVQgY29tbWFuZAogICovCi12b2lkIGZ1c2Vfc2VuZF9mb3JnZXQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxLAotCQkgICAgICB1NjQgbm9kZWlkLCB1NjQgbmxvb2t1cCk7Cit2b2lkIGZ1c2VfcXVldWVfZm9yZ2V0KHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9mb3JnZXRfbGluayAqZm9yZ2V0LAorCQkgICAgICAgdTY0IG5vZGVpZCwgdTY0IG5sb29rdXApOworCitzdHJ1Y3QgZnVzZV9mb3JnZXRfbGluayAqZnVzZV9hbGxvY19mb3JnZXQodm9pZCk7CiAKIC8qKgogICogSW5pdGlhbGl6ZSBSRUFEIG9yIFJFQURESVIgcmVxdWVzdApAQCAtNjU2LDExICs2NzAsNiBAQAogdm9pZCBmdXNlX3JlcXVlc3Rfc2VuZChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpOwogCiAvKioKLSAqIFNlbmQgYSByZXF1ZXN0IHdpdGggbm8gcmVwbHkKLSAqLwotdm9pZCBmdXNlX3JlcXVlc3Rfc2VuZF9ub3JlcGx5KHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSk7Ci0KLS8qKgogICogU2VuZCBhIHJlcXVlc3QgaW4gdGhlIGJhY2tncm91bmQKICAqLwogdm9pZCBmdXNlX3JlcXVlc3Rfc2VuZF9iYWNrZ3JvdW5kKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSk7CmRpZmYgLS1naXQgYS9mcy9mdXNlL2lub2RlLmMgYi9mcy9mdXNlL2lub2RlLmMKaW5kZXggYThiMzFkYS4uZjYyYjMyYyAxMDA2NDQKLS0tIGEvZnMvZnVzZS9pbm9kZS5jCisrKyBiL2ZzL2Z1c2UvaW5vZGUuYwpAQCAtNzEsNiArNzEsMTEgQEAKIAl1bnNpZ25lZCBibGtzaXplOwogfTsKIAorc3RydWN0IGZ1c2VfZm9yZ2V0X2xpbmsgKmZ1c2VfYWxsb2NfZm9yZ2V0KCkKK3sKKwlyZXR1cm4ga3phbGxvYyhzaXplb2Yoc3RydWN0IGZ1c2VfZm9yZ2V0X2xpbmspLCBHRlBfS0VSTkVMKTsKK30KKwogc3RhdGljIHN0cnVjdCBpbm9kZSAqZnVzZV9hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CkBAIC05MCw4ICs5NSw4IEBACiAJSU5JVF9MSVNUX0hFQUQoJmZpLT5xdWV1ZWRfd3JpdGVzKTsKIAlJTklUX0xJU1RfSEVBRCgmZmktPndyaXRlcGFnZXMpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmZpLT5wYWdlX3dhaXRxKTsKLQlmaS0+Zm9yZ2V0X3JlcSA9IGZ1c2VfcmVxdWVzdF9hbGxvYygpOwotCWlmICghZmktPmZvcmdldF9yZXEpIHsKKwlmaS0+Zm9yZ2V0ID0gZnVzZV9hbGxvY19mb3JnZXQoKTsKKwlpZiAoIWZpLT5mb3JnZXQpIHsKIAkJa21lbV9jYWNoZV9mcmVlKGZ1c2VfaW5vZGVfY2FjaGVwLCBpbm9kZSk7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTExMSwyNCArMTE2LDEwIEBACiAJc3RydWN0IGZ1c2VfaW5vZGUgKmZpID0gZ2V0X2Z1c2VfaW5vZGUoaW5vZGUpOwogCUJVR19PTighbGlzdF9lbXB0eSgmZmktPndyaXRlX2ZpbGVzKSk7CiAJQlVHX09OKCFsaXN0X2VtcHR5KCZmaS0+cXVldWVkX3dyaXRlcykpOwotCWlmIChmaS0+Zm9yZ2V0X3JlcSkKLQkJZnVzZV9yZXF1ZXN0X2ZyZWUoZmktPmZvcmdldF9yZXEpOworCWtmcmVlKGZpLT5mb3JnZXQpOwogCWNhbGxfcmN1KCZpbm9kZS0+aV9yY3UsIGZ1c2VfaV9jYWxsYmFjayk7CiB9CiAKLXZvaWQgZnVzZV9zZW5kX2ZvcmdldChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEsCi0JCSAgICAgIHU2NCBub2RlaWQsIHU2NCBubG9va3VwKQotewotCXN0cnVjdCBmdXNlX2ZvcmdldF9pbiAqaW5hcmcgPSAmcmVxLT5taXNjLmZvcmdldF9pbjsKLQlpbmFyZy0+bmxvb2t1cCA9IG5sb29rdXA7Ci0JcmVxLT5pbi5oLm9wY29kZSA9IEZVU0VfRk9SR0VUOwotCXJlcS0+aW4uaC5ub2RlaWQgPSBub2RlaWQ7Ci0JcmVxLT5pbi5udW1hcmdzID0gMTsKLQlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZnVzZV9mb3JnZXRfaW4pOwotCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9IGluYXJnOwotCWZ1c2VfcmVxdWVzdF9zZW5kX25vcmVwbHkoZmMsIHJlcSk7Ci19Ci0KIHN0YXRpYyB2b2lkIGZ1c2VfZXZpY3RfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAl0cnVuY2F0ZV9pbm9kZV9wYWdlcygmaW5vZGUtPmlfZGF0YSwgMCk7CkBAIC0xMzYsOCArMTI3LDggQEAKIAlpZiAoaW5vZGUtPmlfc2ItPnNfZmxhZ3MgJiBNU19BQ1RJVkUpIHsKIAkJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uKGlub2RlKTsKIAkJc3RydWN0IGZ1c2VfaW5vZGUgKmZpID0gZ2V0X2Z1c2VfaW5vZGUoaW5vZGUpOwotCQlmdXNlX3NlbmRfZm9yZ2V0KGZjLCBmaS0+Zm9yZ2V0X3JlcSwgZmktPm5vZGVpZCwgZmktPm5sb29rdXApOwotCQlmaS0+Zm9yZ2V0X3JlcSA9IE5VTEw7CisJCWZ1c2VfcXVldWVfZm9yZ2V0KGZjLCBmaS0+Zm9yZ2V0LCBmaS0+bm9kZWlkLCBmaS0+bmxvb2t1cCk7CisJCWZpLT5mb3JnZXQgPSBOVUxMOwogCX0KIH0KIApAQCAtNTQxLDYgKzUzMiw3IEBACiAJSU5JVF9MSVNUX0hFQUQoJmZjLT5pbnRlcnJ1cHRzKTsKIAlJTklUX0xJU1RfSEVBRCgmZmMtPmJnX3F1ZXVlKTsKIAlJTklUX0xJU1RfSEVBRCgmZmMtPmVudHJ5KTsKKwlmYy0+Zm9yZ2V0X2xpc3RfdGFpbCA9ICZmYy0+Zm9yZ2V0X2xpc3RfaGVhZDsKIAlhdG9taWNfc2V0KCZmYy0+bnVtX3dhaXRpbmcsIDApOwogCWZjLT5tYXhfYmFja2dyb3VuZCA9IEZVU0VfREVGQVVMVF9NQVhfQkFDS0dST1VORDsKIAlmYy0+Y29uZ2VzdGlvbl90aHJlc2hvbGQgPSBGVVNFX0RFRkFVTFRfQ09OR0VTVElPTl9USFJFU0hPTEQ7CmRpZmYgLS1naXQgYS9mcy9nZnMyL2luY29yZS5oIGIvZnMvZ2ZzMi9pbmNvcmUuaAppbmRleCA4ZDNkMmI0Li5hNzk3OTBjIDEwMDY0NAotLS0gYS9mcy9nZnMyL2luY29yZS5oCisrKyBiL2ZzL2dmczIvaW5jb3JlLmgKQEAgLTExLDYgKzExLDcgQEAKICNkZWZpbmUgX19JTkNPUkVfRE9UX0hfXwogCiAjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvZGxtLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KZGlmZiAtLWdpdCBhL2ZzL25hbWVpLmMgYi9mcy9uYW1laS5jCmluZGV4IDE5NDMzY2QuLjI0ZWNlMTAgMTAwNjQ0Ci0tLSBhL2ZzL25hbWVpLmMKKysrIGIvZnMvbmFtZWkuYwpAQCAtMjAyLDcgKzIwMiw3IEBACiAgKiBAaW5vZGU6CWlub2RlIHRvIGNoZWNrIGFjY2VzcyByaWdodHMgZm9yCiAgKiBAbWFzazoJcmlnaHQgdG8gY2hlY2sgZm9yICglTUFZX1JFQUQsICVNQVlfV1JJVEUsICVNQVlfRVhFQykKICAqIEBjaGVja19hY2w6CW9wdGlvbmFsIGNhbGxiYWNrIHRvIGNoZWNrIGZvciBQb3NpeCBBQ0xzCi0gKiBAZmxhZ3MJSVBFUk1fRkxBR18gZmxhZ3MuCisgKiBAZmxhZ3M6CUlQRVJNX0ZMQUdfIGZsYWdzLgogICoKICAqIFVzZWQgdG8gY2hlY2sgZm9yIHJlYWQvd3JpdGUvZXhlY3V0ZSBwZXJtaXNzaW9ucyBvbiBhIGZpbGUuCiAgKiBXZSB1c2UgImZzdWlkIiBmb3IgdGhpcywgbGV0dGluZyB1cyBzZXQgYXJiaXRyYXJ5IHBlcm1pc3Npb25zCkBAIC00MDcsNyArNDA3LDcgQEAKIC8qKgogICogbmFtZWlkYXRhX2Ryb3BfcmN1IC0gZHJvcCB0aGlzIG5hbWVpZGF0YSBvdXQgb2YgcmN1LXdhbGsKICAqIEBuZDogbmFtZWlkYXRhIHBhdGh3YWxrIGRhdGEgdG8gZHJvcAotICogQFJldHVybnM6IDAgb24gc3VjY2VzcywgLUVDSExJRCBvbiBmYWlsdXJlCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC1FQ0hJTEQgb24gZmFpbHVyZQogICoKICAqIFBhdGggd2Fsa2luZyBoYXMgMiBtb2RlcywgcmN1LXdhbGsgYW5kIHJlZi13YWxrIChzZWUKICAqIERvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcGF0aC1sb29rdXAudHh0KS4gX19kcm9wX3JjdSogZnVuY3Rpb25zIGF0dGVtcHQKQEAgLTQ2OCw3ICs0NjgsNyBAQAogICogbmFtZWlkYXRhX2RlbnRyeV9kcm9wX3JjdSAtIGRyb3AgbmFtZWlkYXRhIGFuZCBkZW50cnkgb3V0IG9mIHJjdS13YWxrCiAgKiBAbmQ6IG5hbWVpZGF0YSBwYXRod2FsayBkYXRhIHRvIGRyb3AKICAqIEBkZW50cnk6IGRlbnRyeSB0byBkcm9wCi0gKiBAUmV0dXJuczogMCBvbiBzdWNjZXNzLCAtRUNITElEIG9uIGZhaWx1cmUKKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgLUVDSElMRCBvbiBmYWlsdXJlCiAgKgogICogbmFtZWlkYXRhX2RlbnRyeV9kcm9wX3JjdSBhdHRlbXB0cyB0byBkcm9wIHRoZSBjdXJyZW50IG5kLT5wYXRoIGFuZCBuZC0+cm9vdCwKICAqIGFuZCBkZW50cnkgaW50byByZWYtd2Fsay4gQGRlbnRyeSBtdXN0IGJlIGEgcGF0aCBmb3VuZCBieSBhIGRvX2xvb2t1cCBjYWxsIG9uCkBAIC01MzAsNyArNTMwLDcgQEAKIC8qKgogICogbmFtZWlkYXRhX2Ryb3BfcmN1X2xhc3QgLSBkcm9wIG5hbWVpZGF0YSBlbmRpbmcgcGF0aCB3YWxrIG91dCBvZiByY3Utd2FsawogICogQG5kOiBuYW1laWRhdGEgcGF0aHdhbGsgZGF0YSB0byBkcm9wCi0gKiBAUmV0dXJuczogMCBvbiBzdWNjZXNzLCAtRUNITElEIG9uIGZhaWx1cmUKKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgLUVDSElMRCBvbiBmYWlsdXJlCiAgKgogICogbmFtZWlkYXRhX2Ryb3BfcmN1X2xhc3QgYXR0ZW1wdHMgdG8gZHJvcCB0aGUgY3VycmVudCBuZC0+cGF0aCBpbnRvIHJlZi13YWxrLgogICogbmQtPnBhdGggc2hvdWxkIGJlIHRoZSBmaW5hbCBlbGVtZW50IG9mIHRoZSBsb29rdXAsIHNvIG5kLT5yb290IGlzIGRpc2NhcmRlZC4KZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9ibWFwLmMgYi9mcy9uaWxmczIvYm1hcC5jCmluZGV4IDhiNzgyYjAuLjNlZTY3YzYgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9ibWFwLmMKKysrIGIvZnMvbmlsZnMyL2JtYXAuYwpAQCAtMzUsNyArMzUsMjAgQEAKIAogc3RydWN0IGlub2RlICpuaWxmc19ibWFwX2dldF9kYXQoY29uc3Qgc3RydWN0IG5pbGZzX2JtYXAgKmJtYXApCiB7Ci0JcmV0dXJuIG5pbGZzX2RhdF9pbm9kZShOSUxGU19JX05JTEZTKGJtYXAtPmJfaW5vZGUpKTsKKwlyZXR1cm4gTklMRlNfSV9OSUxGUyhibWFwLT5iX2lub2RlKS0+bnNfZGF0OworfQorCitzdGF0aWMgaW50IG5pbGZzX2JtYXBfY29udmVydF9lcnJvcihzdHJ1Y3QgbmlsZnNfYm1hcCAqYm1hcCwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmZuYW1lLCBpbnQgZXJyKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBibWFwLT5iX2lub2RlOworCisJaWYgKGVyciA9PSAtRUlOVkFMKSB7CisJCW5pbGZzX2Vycm9yKGlub2RlLT5pX3NiLCBmbmFtZSwKKwkJCSAgICAiYnJva2VuIGJtYXAgKGlub2RlIG51bWJlcj0lbHUpXG4iLCBpbm9kZS0+aV9pbm8pOworCQllcnIgPSAtRUlPOworCX0KKwlyZXR1cm4gZXJyOwogfQogCiAvKioKQEAgLTY2LDggKzc5LDEwIEBACiAKIAlkb3duX3JlYWQoJmJtYXAtPmJfc2VtKTsKIAlyZXQgPSBibWFwLT5iX29wcy0+Ym9wX2xvb2t1cChibWFwLCBrZXksIGxldmVsLCBwdHJwKTsKLQlpZiAocmV0IDwgMCkKKwlpZiAocmV0IDwgMCkgeworCQlyZXQgPSBuaWxmc19ibWFwX2NvbnZlcnRfZXJyb3IoYm1hcCwgX19mdW5jX18sIHJldCk7CiAJCWdvdG8gb3V0OworCX0KIAlpZiAoTklMRlNfQk1BUF9VU0VfVkJOKGJtYXApKSB7CiAJCXJldCA9IG5pbGZzX2RhdF90cmFuc2xhdGUobmlsZnNfYm1hcF9nZXRfZGF0KGJtYXApLCAqcHRycCwKIAkJCQkJICAmYmxvY2tucik7CkBAIC04OCw3ICsxMDMsOCBAQAogCWRvd25fcmVhZCgmYm1hcC0+Yl9zZW0pOwogCXJldCA9IGJtYXAtPmJfb3BzLT5ib3BfbG9va3VwX2NvbnRpZyhibWFwLCBrZXksIHB0cnAsIG1heGJsb2Nrcyk7CiAJdXBfcmVhZCgmYm1hcC0+Yl9zZW0pOwotCXJldHVybiByZXQ7CisKKwlyZXR1cm4gbmlsZnNfYm1hcF9jb252ZXJ0X2Vycm9yKGJtYXAsIF9fZnVuY19fLCByZXQpOwogfQogCiBzdGF0aWMgaW50IG5pbGZzX2JtYXBfZG9faW5zZXJ0KHN0cnVjdCBuaWxmc19ibWFwICpibWFwLCBfX3U2NCBrZXksIF9fdTY0IHB0cikKQEAgLTE0NCw3ICsxNjAsOCBAQAogCWRvd25fd3JpdGUoJmJtYXAtPmJfc2VtKTsKIAlyZXQgPSBuaWxmc19ibWFwX2RvX2luc2VydChibWFwLCBrZXksIHJlYyk7CiAJdXBfd3JpdGUoJmJtYXAtPmJfc2VtKTsKLQlyZXR1cm4gcmV0OworCisJcmV0dXJuIG5pbGZzX2JtYXBfY29udmVydF9lcnJvcihibWFwLCBfX2Z1bmNfXywgcmV0KTsKIH0KIAogc3RhdGljIGludCBuaWxmc19ibWFwX2RvX2RlbGV0ZShzdHJ1Y3QgbmlsZnNfYm1hcCAqYm1hcCwgX191NjQga2V5KQpAQCAtMTgwLDkgKzE5NywxMiBAQAogCiAJZG93bl9yZWFkKCZibWFwLT5iX3NlbSk7CiAJcmV0ID0gYm1hcC0+Yl9vcHMtPmJvcF9sYXN0X2tleShibWFwLCAmbGFzdGtleSk7Ci0JaWYgKCFyZXQpCi0JCSprZXkgPSBsYXN0a2V5OwogCXVwX3JlYWQoJmJtYXAtPmJfc2VtKTsKKworCWlmIChyZXQgPCAwKQorCQlyZXQgPSBuaWxmc19ibWFwX2NvbnZlcnRfZXJyb3IoYm1hcCwgX19mdW5jX18sIHJldCk7CisJZWxzZQorCQkqa2V5ID0gbGFzdGtleTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0yMTAsNyArMjMwLDggQEAKIAlkb3duX3dyaXRlKCZibWFwLT5iX3NlbSk7CiAJcmV0ID0gbmlsZnNfYm1hcF9kb19kZWxldGUoYm1hcCwga2V5KTsKIAl1cF93cml0ZSgmYm1hcC0+Yl9zZW0pOwotCXJldHVybiByZXQ7CisKKwlyZXR1cm4gbmlsZnNfYm1hcF9jb252ZXJ0X2Vycm9yKGJtYXAsIF9fZnVuY19fLCByZXQpOwogfQogCiBzdGF0aWMgaW50IG5pbGZzX2JtYXBfZG9fdHJ1bmNhdGUoc3RydWN0IG5pbGZzX2JtYXAgKmJtYXAsIHVuc2lnbmVkIGxvbmcga2V5KQpAQCAtMjYxLDcgKzI4Miw4IEBACiAJZG93bl93cml0ZSgmYm1hcC0+Yl9zZW0pOwogCXJldCA9IG5pbGZzX2JtYXBfZG9fdHJ1bmNhdGUoYm1hcCwga2V5KTsKIAl1cF93cml0ZSgmYm1hcC0+Yl9zZW0pOwotCXJldHVybiByZXQ7CisKKwlyZXR1cm4gbmlsZnNfYm1hcF9jb252ZXJ0X2Vycm9yKGJtYXAsIF9fZnVuY19fLCByZXQpOwogfQogCiAvKioKQEAgLTMwMCw3ICszMjIsOCBAQAogCWRvd25fd3JpdGUoJmJtYXAtPmJfc2VtKTsKIAlyZXQgPSBibWFwLT5iX29wcy0+Ym9wX3Byb3BhZ2F0ZShibWFwLCBiaCk7CiAJdXBfd3JpdGUoJmJtYXAtPmJfc2VtKTsKLQlyZXR1cm4gcmV0OworCisJcmV0dXJuIG5pbGZzX2JtYXBfY29udmVydF9lcnJvcihibWFwLCBfX2Z1bmNfXywgcmV0KTsKIH0KIAogLyoqCkBAIC0zNDQsNyArMzY3LDggQEAKIAlkb3duX3dyaXRlKCZibWFwLT5iX3NlbSk7CiAJcmV0ID0gYm1hcC0+Yl9vcHMtPmJvcF9hc3NpZ24oYm1hcCwgYmgsIGJsb2NrbnIsIGJpbmZvKTsKIAl1cF93cml0ZSgmYm1hcC0+Yl9zZW0pOwotCXJldHVybiByZXQ7CisKKwlyZXR1cm4gbmlsZnNfYm1hcF9jb252ZXJ0X2Vycm9yKGJtYXAsIF9fZnVuY19fLCByZXQpOwogfQogCiAvKioKQEAgLTM3Myw3ICszOTcsOCBAQAogCWRvd25fd3JpdGUoJmJtYXAtPmJfc2VtKTsKIAlyZXQgPSBibWFwLT5iX29wcy0+Ym9wX21hcmsoYm1hcCwga2V5LCBsZXZlbCk7CiAJdXBfd3JpdGUoJmJtYXAtPmJfc2VtKTsKLQlyZXR1cm4gcmV0OworCisJcmV0dXJuIG5pbGZzX2JtYXBfY29udmVydF9lcnJvcihibWFwLCBfX2Z1bmNfXywgcmV0KTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9mcy9uaWxmczIvYnRub2RlLmMgYi9mcy9uaWxmczIvYnRub2RlLmMKaW5kZXggNTExNTgxNGMuLjM4OGU5ZTggMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9idG5vZGUuYworKysgYi9mcy9uaWxmczIvYnRub2RlLmMKQEAgLTEwNCw4ICsxMDQsNyBAQAogCWlmIChwYmxvY2tuciA9PSAwKSB7CiAJCXBibG9ja25yID0gYmxvY2tucjsKIAkJaWYgKGlub2RlLT5pX2lubyAhPSBOSUxGU19EQVRfSU5PKSB7Ci0JCQlzdHJ1Y3QgaW5vZGUgKmRhdCA9Ci0JCQkJbmlsZnNfZGF0X2lub2RlKE5JTEZTX0lfTklMRlMoaW5vZGUpKTsKKwkJCXN0cnVjdCBpbm9kZSAqZGF0ID0gTklMRlNfSV9OSUxGUyhpbm9kZSktPm5zX2RhdDsKIAogCQkJLyogYmxvY2tuciBpcyBhIHZpcnR1YWwgYmxvY2sgbnVtYmVyICovCiAJCQllcnIgPSBuaWxmc19kYXRfdHJhbnNsYXRlKGRhdCwgYmxvY2tuciwgJnBibG9ja25yKTsKZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9kaXIuYyBiL2ZzL25pbGZzMi9kaXIuYwppbmRleCBjYjAwM2M4Li45ZDQ1NzczIDEwMDY0NAotLS0gYS9mcy9uaWxmczIvZGlyLmMKKysrIGIvZnMvbmlsZnMyL2Rpci5jCkBAIC05MSw3ICs5MSw2IEBACiAJCQkgICAgICAgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCiB7CiAJc3RydWN0IGlub2RlICpkaXIgPSBtYXBwaW5nLT5ob3N0OwotCXN0cnVjdCBuaWxmc19zYl9pbmZvICpzYmkgPSBOSUxGU19TQihkaXItPmlfc2IpOwogCWxvZmZfdCBwb3MgPSBwYWdlX29mZnNldChwYWdlKSArIGZyb207CiAJdW5zaWduZWQgbGVuID0gdG8gLSBmcm9tOwogCXVuc2lnbmVkIG5yX2RpcnR5LCBjb3BpZWQ7CkBAIC0xMDMsNyArMTAyLDcgQEAKIAkJaV9zaXplX3dyaXRlKGRpciwgcG9zICsgY29waWVkKTsKIAlpZiAoSVNfRElSU1lOQyhkaXIpKQogCQluaWxmc19zZXRfdHJhbnNhY3Rpb25fZmxhZyhOSUxGU19USV9TWU5DKTsKLQllcnIgPSBuaWxmc19zZXRfZmlsZV9kaXJ0eShzYmksIGRpciwgbnJfZGlydHkpOworCWVyciA9IG5pbGZzX3NldF9maWxlX2RpcnR5KGRpciwgbnJfZGlydHkpOwogCVdBUk5fT04oZXJyKTsgLyogZG8gbm90IGhhcHBlbiAqLwogCXVubG9ja19wYWdlKHBhZ2UpOwogfQpkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL2ZpbGUuYyBiL2ZzL25pbGZzMi9maWxlLmMKaW5kZXggYzlhMzBkNy4uMmY1NjBjOSAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL2ZpbGUuYworKysgYi9mcy9uaWxmczIvZmlsZS5jCkBAIC0xNTUsNiArMTU1LDcgQEAKIAkudHJ1bmNhdGUJPSBuaWxmc190cnVuY2F0ZSwKIAkuc2V0YXR0cgk9IG5pbGZzX3NldGF0dHIsCiAJLnBlcm1pc3Npb24gICAgID0gbmlsZnNfcGVybWlzc2lvbiwKKwkuZmllbWFwCQk9IG5pbGZzX2ZpZW1hcCwKIH07CiAKIC8qIGVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9mcy9uaWxmczIvaWZpbGUuYyBiL2ZzL25pbGZzMi9pZmlsZS5jCmluZGV4IDlmOGEyZGEuLmJmYzczZDMgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9pZmlsZS5jCisrKyBiL2ZzL25pbGZzMi9pZmlsZS5jCkBAIC0xNDksMTQgKzE0OSw5IEBACiAJfQogCiAJZXJyID0gbmlsZnNfcGFsbG9jX2dldF9lbnRyeV9ibG9jayhpZmlsZSwgaW5vLCAwLCBvdXRfYmgpOwotCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCWlmIChlcnIgPT0gLUVJTlZBTCkKLQkJCW5pbGZzX2Vycm9yKHNiLCBfX2Z1bmNfXywgImlmaWxlIGlzIGJyb2tlbiIpOwotCQllbHNlCi0JCQluaWxmc193YXJuaW5nKHNiLCBfX2Z1bmNfXywKLQkJCQkgICAgICAidW5hYmxlIHRvIHJlYWQgaW5vZGU6ICVsdSIsCi0JCQkJICAgICAgKHVuc2lnbmVkIGxvbmcpIGlubyk7Ci0JfQorCWlmICh1bmxpa2VseShlcnIpKQorCQluaWxmc193YXJuaW5nKHNiLCBfX2Z1bmNfXywgInVuYWJsZSB0byByZWFkIGlub2RlOiAlbHUiLAorCQkJICAgICAgKHVuc2lnbmVkIGxvbmcpIGlubyk7CiAJcmV0dXJuIGVycjsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL2lub2RlLmMgYi9mcy9uaWxmczIvaW5vZGUuYwppbmRleCA3N2I0OGM4Li4yZmQ0NDBkIDEwMDY0NAotLS0gYS9mcy9uaWxmczIvaW5vZGUuYworKysgYi9mcy9uaWxmczIvaW5vZGUuYwpAQCAtNTgsNyArNTgsNyBAQAogCXN0cnVjdCBuaWxmc19pbm9kZV9pbmZvICppaSA9IE5JTEZTX0koaW5vZGUpOwogCV9fdTY0IGJsa251bSA9IDA7CiAJaW50IGVyciA9IDAsIHJldDsKLQlzdHJ1Y3QgaW5vZGUgKmRhdCA9IG5pbGZzX2RhdF9pbm9kZShOSUxGU19JX05JTEZTKGlub2RlKSk7CisJc3RydWN0IGlub2RlICpkYXQgPSBOSUxGU19JX05JTEZTKGlub2RlKS0+bnNfZGF0OwogCXVuc2lnbmVkIG1heGJsb2NrcyA9IGJoX3Jlc3VsdC0+Yl9zaXplID4+IGlub2RlLT5pX2Jsa2JpdHM7CiAKIAlkb3duX3JlYWQoJk5JTEZTX01EVChkYXQpLT5taV9zZW0pOwpAQCAtOTYsMTEgKzk2LDYgQEAKIAkJCQkgICAgICAgaW5vZGUtPmlfaW5vLAogCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJsa29mZik7CiAJCQkJZXJyID0gMDsKLQkJCX0gZWxzZSBpZiAoZXJyID09IC1FSU5WQUwpIHsKLQkJCQluaWxmc19lcnJvcihpbm9kZS0+aV9zYiwgX19mdW5jX18sCi0JCQkJCSAgICAiYnJva2VuIGJtYXAgKGlub2RlPSVsdSlcbiIsCi0JCQkJCSAgICBpbm9kZS0+aV9pbm8pOwotCQkJCWVyciA9IC1FSU87CiAJCQl9CiAJCQluaWxmc190cmFuc2FjdGlvbl9hYm9ydChpbm9kZS0+aV9zYik7CiAJCQlnb3RvIG91dDsKQEAgLTEwOSw2ICsxMDQsNyBAQAogCQluaWxmc190cmFuc2FjdGlvbl9jb21taXQoaW5vZGUtPmlfc2IpOyAvKiBuZXZlciBmYWlscyAqLwogCQkvKiBFcnJvciBoYW5kbGluZyBzaG91bGQgYmUgZGV0YWlsZWQgKi8KIAkJc2V0X2J1ZmZlcl9uZXcoYmhfcmVzdWx0KTsKKwkJc2V0X2J1ZmZlcl9kZWxheShiaF9yZXN1bHQpOwogCQltYXBfYmgoYmhfcmVzdWx0LCBpbm9kZS0+aV9zYiwgMCk7IC8qIGRibiBtdXN0IGJlIGNoYW5nZWQKIAkJCQkJCSAgICAgIHRvIHByb3BlciB2YWx1ZSAqLwogCX0gZWxzZSBpZiAocmV0ID09IC1FTk9FTlQpIHsKQEAgLTE4NSwxMCArMTgxLDkgQEAKIAogCWlmIChyZXQpIHsKIAkJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7Ci0JCXN0cnVjdCBuaWxmc19zYl9pbmZvICpzYmkgPSBOSUxGU19TQihpbm9kZS0+aV9zYik7CiAJCXVuc2lnbmVkIG5yX2RpcnR5ID0gMSA8PCAoUEFHRV9TSElGVCAtIGlub2RlLT5pX2Jsa2JpdHMpOwogCi0JCW5pbGZzX3NldF9maWxlX2RpcnR5KHNiaSwgaW5vZGUsIG5yX2RpcnR5KTsKKwkJbmlsZnNfc2V0X2ZpbGVfZGlydHkoaW5vZGUsIG5yX2RpcnR5KTsKIAl9CiAJcmV0dXJuIHJldDsKIH0KQEAgLTIyOSw3ICsyMjQsNyBAQAogCQkJCQkJICBzdGFydCArIGNvcGllZCk7CiAJY29waWVkID0gZ2VuZXJpY193cml0ZV9lbmQoZmlsZSwgbWFwcGluZywgcG9zLCBsZW4sIGNvcGllZCwgcGFnZSwKIAkJCQkgICBmc2RhdGEpOwotCW5pbGZzX3NldF9maWxlX2RpcnR5KE5JTEZTX1NCKGlub2RlLT5pX3NiKSwgaW5vZGUsIG5yX2RpcnR5KTsKKwluaWxmc19zZXRfZmlsZV9kaXJ0eShpbm9kZSwgbnJfZGlydHkpOwogCWVyciA9IG5pbGZzX3RyYW5zYWN0aW9uX2NvbW1pdChpbm9kZS0+aV9zYik7CiAJcmV0dXJuIGVyciA/IDogY29waWVkOwogfQpAQCAtNDI1LDEzICs0MjAsMTIgQEAKIAkJCSAgICAgIHN0cnVjdCBuaWxmc19yb290ICpyb290LCB1bnNpZ25lZCBsb25nIGlubywKIAkJCSAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0Jc3RydWN0IG5pbGZzX3NiX2luZm8gKnNiaSA9IE5JTEZTX1NCKHNiKTsKLQlzdHJ1Y3QgaW5vZGUgKmRhdCA9IG5pbGZzX2RhdF9pbm9kZShzYmktPnNfbmlsZnMpOworCXN0cnVjdCB0aGVfbmlsZnMgKm5pbGZzID0gTklMRlNfU0Ioc2IpLT5zX25pbGZzOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAJc3RydWN0IG5pbGZzX2lub2RlICpyYXdfaW5vZGU7CiAJaW50IGVycjsKIAotCWRvd25fcmVhZCgmTklMRlNfTURUKGRhdCktPm1pX3NlbSk7CS8qIFhYWCAqLworCWRvd25fcmVhZCgmTklMRlNfTURUKG5pbGZzLT5uc19kYXQpLT5taV9zZW0pOwogCWVyciA9IG5pbGZzX2lmaWxlX2dldF9pbm9kZV9ibG9jayhyb290LT5pZmlsZSwgaW5vLCAmYmgpOwogCWlmICh1bmxpa2VseShlcnIpKQogCQlnb3RvIGJhZF9pbm9kZTsKQEAgLTQ2MSw3ICs0NTUsNyBAQAogCX0KIAluaWxmc19pZmlsZV91bm1hcF9pbm9kZShyb290LT5pZmlsZSwgaW5vLCBiaCk7CiAJYnJlbHNlKGJoKTsKLQl1cF9yZWFkKCZOSUxGU19NRFQoZGF0KS0+bWlfc2VtKTsJLyogWFhYICovCisJdXBfcmVhZCgmTklMRlNfTURUKG5pbGZzLT5uc19kYXQpLT5taV9zZW0pOwogCW5pbGZzX3NldF9pbm9kZV9mbGFncyhpbm9kZSk7CiAJcmV0dXJuIDA7CiAKQEAgLTQ3MCw3ICs0NjQsNyBAQAogCWJyZWxzZShiaCk7CiAKICBiYWRfaW5vZGU6Ci0JdXBfcmVhZCgmTklMRlNfTURUKGRhdCktPm1pX3NlbSk7CS8qIFhYWCAqLworCXVwX3JlYWQoJk5JTEZTX01EVChuaWxmcy0+bnNfZGF0KS0+bWlfc2VtKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC02MjksNyArNjIzLDcgQEAKIAogCWlmICghdGVzdF9iaXQoTklMRlNfSV9CTUFQLCAmaWktPmlfc3RhdGUpKQogCQlyZXR1cm47Ci0gcmVwZWF0OgorcmVwZWF0OgogCXJldCA9IG5pbGZzX2JtYXBfbGFzdF9rZXkoaWktPmlfYm1hcCwgJmIpOwogCWlmIChyZXQgPT0gLUVOT0VOVCkKIAkJcmV0dXJuOwpAQCAtNjQ2LDE0ICs2NDAsMTAgQEAKIAkJICAgICBuaWxmc19ibWFwX3RydW5jYXRlKGlpLT5pX2JtYXAsIGIpID09IDApKQogCQlnb3RvIHJlcGVhdDsKIAotIGZhaWxlZDoKLQlpZiAocmV0ID09IC1FSU5WQUwpCi0JCW5pbGZzX2Vycm9yKGlpLT52ZnNfaW5vZGUuaV9zYiwgX19mdW5jX18sCi0JCQkgICAgImJtYXAgaXMgYnJva2VuIChpbm89JWx1KSIsIGlpLT52ZnNfaW5vZGUuaV9pbm8pOwotCWVsc2UKLQkJbmlsZnNfd2FybmluZyhpaS0+dmZzX2lub2RlLmlfc2IsIF9fZnVuY19fLAotCQkJICAgICAgImZhaWxlZCB0byB0cnVuY2F0ZSBibWFwIChpbm89JWx1LCBlcnI9JWQpIiwKLQkJCSAgICAgIGlpLT52ZnNfaW5vZGUuaV9pbm8sIHJldCk7CitmYWlsZWQ6CisJbmlsZnNfd2FybmluZyhpaS0+dmZzX2lub2RlLmlfc2IsIF9fZnVuY19fLAorCQkgICAgICAiZmFpbGVkIHRvIHRydW5jYXRlIGJtYXAgKGlubz0lbHUsIGVycj0lZCkiLAorCQkgICAgICBpaS0+dmZzX2lub2RlLmlfaW5vLCByZXQpOwogfQogCiB2b2lkIG5pbGZzX3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCkBAIC02ODIsNyArNjcyLDcgQEAKIAkJbmlsZnNfc2V0X3RyYW5zYWN0aW9uX2ZsYWcoTklMRlNfVElfU1lOQyk7CiAKIAluaWxmc19tYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKLQluaWxmc19zZXRfZmlsZV9kaXJ0eShOSUxGU19TQihzYiksIGlub2RlLCAwKTsKKwluaWxmc19zZXRfZmlsZV9kaXJ0eShpbm9kZSwgMCk7CiAJbmlsZnNfdHJhbnNhY3Rpb25fY29tbWl0KHNiKTsKIAkvKiBNYXkgY29uc3RydWN0IGEgbG9naWNhbCBzZWdtZW50IGFuZCBtYXkgZmFpbCBpbiBzeW5jIG1vZGUuCiAJICAgQnV0IHRydW5jYXRlIGhhcyBubyByZXR1cm4gdmFsdWUuICovCkBAIC04MDAsOSArNzkwLDkgQEAKIAlyZXR1cm4gZ2VuZXJpY19wZXJtaXNzaW9uKGlub2RlLCBtYXNrLCBmbGFncywgTlVMTCk7CiB9CiAKLWludCBuaWxmc19sb2FkX2lub2RlX2Jsb2NrKHN0cnVjdCBuaWxmc19zYl9pbmZvICpzYmksIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipwYmgpCitpbnQgbmlsZnNfbG9hZF9pbm9kZV9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipwYmgpCiB7CisJc3RydWN0IG5pbGZzX3NiX2luZm8gKnNiaSA9IE5JTEZTX1NCKGlub2RlLT5pX3NiKTsKIAlzdHJ1Y3QgbmlsZnNfaW5vZGVfaW5mbyAqaWkgPSBOSUxGU19JKGlub2RlKTsKIAlpbnQgZXJyOwogCkBAIC04NDMsOSArODMzLDkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgbmlsZnNfc2V0X2ZpbGVfZGlydHkoc3RydWN0IG5pbGZzX3NiX2luZm8gKnNiaSwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCSB1bnNpZ25lZCBucl9kaXJ0eSkKK2ludCBuaWxmc19zZXRfZmlsZV9kaXJ0eShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBucl9kaXJ0eSkKIHsKKwlzdHJ1Y3QgbmlsZnNfc2JfaW5mbyAqc2JpID0gTklMRlNfU0IoaW5vZGUtPmlfc2IpOwogCXN0cnVjdCBuaWxmc19pbm9kZV9pbmZvICppaSA9IE5JTEZTX0koaW5vZGUpOwogCiAJYXRvbWljX2FkZChucl9kaXJ0eSwgJnNiaS0+c19uaWxmcy0+bnNfbmRpcnR5Ymxrcyk7CkBAIC04NzgsMTEgKzg2OCwxMCBAQAogCiBpbnQgbmlsZnNfbWFya19pbm9kZV9kaXJ0eShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotCXN0cnVjdCBuaWxmc19zYl9pbmZvICpzYmkgPSBOSUxGU19TQihpbm9kZS0+aV9zYik7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICppYmg7CiAJaW50IGVycjsKIAotCWVyciA9IG5pbGZzX2xvYWRfaW5vZGVfYmxvY2soc2JpLCBpbm9kZSwgJmliaCk7CisJZXJyID0gbmlsZnNfbG9hZF9pbm9kZV9ibG9jayhpbm9kZSwgJmliaCk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKIAkJbmlsZnNfd2FybmluZyhpbm9kZS0+aV9zYiwgX19mdW5jX18sCiAJCQkgICAgICAiZmFpbGVkIHRvIHJlZ2V0IGlub2RlIGJsb2NrLlxuIik7CkBAIC05MjQsMyArOTEzLDEzNCBAQAogCW5pbGZzX21hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwogCW5pbGZzX3RyYW5zYWN0aW9uX2NvbW1pdChpbm9kZS0+aV9zYik7IC8qIG5ldmVyIGZhaWxzICovCiB9CisKK2ludCBuaWxmc19maWVtYXAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpZW1hcF9leHRlbnRfaW5mbyAqZmllaW5mbywKKwkJIF9fdTY0IHN0YXJ0LCBfX3U2NCBsZW4pCit7CisJc3RydWN0IHRoZV9uaWxmcyAqbmlsZnMgPSBOSUxGU19JX05JTEZTKGlub2RlKTsKKwlfX3U2NCBsb2dpY2FsID0gMCwgcGh5cyA9IDAsIHNpemUgPSAwOworCV9fdTMyIGZsYWdzID0gMDsKKwlsb2ZmX3QgaXNpemU7CisJc2VjdG9yX3QgYmxrb2ZmLCBlbmRfYmxrb2ZmOworCXNlY3Rvcl90IGRlbGFsbG9jX2Jsa29mZjsKKwl1bnNpZ25lZCBsb25nIGRlbGFsbG9jX2Jsa2xlbjsKKwl1bnNpZ25lZCBpbnQgYmxrYml0cyA9IGlub2RlLT5pX2Jsa2JpdHM7CisJaW50IHJldCwgbjsKKworCXJldCA9IGZpZW1hcF9jaGVja19mbGFncyhmaWVpbmZvLCBGSUVNQVBfRkxBR19TWU5DKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCisJaXNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CisKKwlibGtvZmYgPSBzdGFydCA+PiBibGtiaXRzOworCWVuZF9ibGtvZmYgPSAoc3RhcnQgKyBsZW4gLSAxKSA+PiBibGtiaXRzOworCisJZGVsYWxsb2NfYmxrbGVuID0gbmlsZnNfZmluZF91bmNvbW1pdHRlZF9leHRlbnQoaW5vZGUsIGJsa29mZiwKKwkJCQkJCQkmZGVsYWxsb2NfYmxrb2ZmKTsKKworCWRvIHsKKwkJX191NjQgYmxrcGh5OworCQl1bnNpZ25lZCBpbnQgbWF4YmxvY2tzOworCisJCWlmIChkZWxhbGxvY19ibGtsZW4gJiYgYmxrb2ZmID09IGRlbGFsbG9jX2Jsa29mZikgeworCQkJaWYgKHNpemUpIHsKKwkJCQkvKiBFbmQgb2YgdGhlIGN1cnJlbnQgZXh0ZW50ICovCisJCQkJcmV0ID0gZmllbWFwX2ZpbGxfbmV4dF9leHRlbnQoCisJCQkJCWZpZWluZm8sIGxvZ2ljYWwsIHBoeXMsIHNpemUsIGZsYWdzKTsKKwkJCQlpZiAocmV0KQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChibGtvZmYgPiBlbmRfYmxrb2ZmKQorCQkJCWJyZWFrOworCisJCQlmbGFncyA9IEZJRU1BUF9FWFRFTlRfTUVSR0VEIHwgRklFTUFQX0VYVEVOVF9ERUxBTExPQzsKKwkJCWxvZ2ljYWwgPSBibGtvZmYgPDwgYmxrYml0czsKKwkJCXBoeXMgPSAwOworCQkJc2l6ZSA9IGRlbGFsbG9jX2Jsa2xlbiA8PCBibGtiaXRzOworCisJCQlibGtvZmYgPSBkZWxhbGxvY19ibGtvZmYgKyBkZWxhbGxvY19ibGtsZW47CisJCQlkZWxhbGxvY19ibGtsZW4gPSBuaWxmc19maW5kX3VuY29tbWl0dGVkX2V4dGVudCgKKwkJCQlpbm9kZSwgYmxrb2ZmLCAmZGVsYWxsb2NfYmxrb2ZmKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogTGltaXQgdGhlIG51bWJlciBvZiBibG9ja3MgdGhhdCB3ZSBsb29rIHVwIHNvIGFzCisJCSAqIG5vdCB0byBnZXQgaW50byB0aGUgbmV4dCBkZWxheWVkIGFsbG9jYXRpb24gZXh0ZW50LgorCQkgKi8KKwkJbWF4YmxvY2tzID0gSU5UX01BWDsKKwkJaWYgKGRlbGFsbG9jX2Jsa2xlbikKKwkJCW1heGJsb2NrcyA9IG1pbl90KHNlY3Rvcl90LCBkZWxhbGxvY19ibGtvZmYgLSBibGtvZmYsCisJCQkJCSAgbWF4YmxvY2tzKTsKKwkJYmxrcGh5ID0gMDsKKworCQlkb3duX3JlYWQoJk5JTEZTX01EVChuaWxmcy0+bnNfZGF0KS0+bWlfc2VtKTsKKwkJbiA9IG5pbGZzX2JtYXBfbG9va3VwX2NvbnRpZygKKwkJCU5JTEZTX0koaW5vZGUpLT5pX2JtYXAsIGJsa29mZiwgJmJsa3BoeSwgbWF4YmxvY2tzKTsKKwkJdXBfcmVhZCgmTklMRlNfTURUKG5pbGZzLT5uc19kYXQpLT5taV9zZW0pOworCisJCWlmIChuIDwgMCkgeworCQkJaW50IHBhc3RfZW9mOworCisJCQlpZiAodW5saWtlbHkobiAhPSAtRU5PRU5UKSkKKwkJCQlicmVhazsgLyogZXJyb3IgKi8KKworCQkJLyogSE9MRSAqLworCQkJYmxrb2ZmKys7CisJCQlwYXN0X2VvZiA9ICgoYmxrb2ZmIDw8IGJsa2JpdHMpID49IGlzaXplKTsKKworCQkJaWYgKHNpemUpIHsKKwkJCQkvKiBFbmQgb2YgdGhlIGN1cnJlbnQgZXh0ZW50ICovCisKKwkJCQlpZiAocGFzdF9lb2YpCisJCQkJCWZsYWdzIHw9IEZJRU1BUF9FWFRFTlRfTEFTVDsKKworCQkJCXJldCA9IGZpZW1hcF9maWxsX25leHRfZXh0ZW50KAorCQkJCQlmaWVpbmZvLCBsb2dpY2FsLCBwaHlzLCBzaXplLCBmbGFncyk7CisJCQkJaWYgKHJldCkKKwkJCQkJYnJlYWs7CisJCQkJc2l6ZSA9IDA7CisJCQl9CisJCQlpZiAoYmxrb2ZmID4gZW5kX2Jsa29mZiB8fCBwYXN0X2VvZikKKwkJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCWlmIChzaXplKSB7CisJCQkJaWYgKHBoeXMgJiYgYmxrcGh5IDw8IGJsa2JpdHMgPT0gcGh5cyArIHNpemUpIHsKKwkJCQkJLyogVGhlIGN1cnJlbnQgZXh0ZW50IGdvZXMgb24gKi8KKwkJCQkJc2l6ZSArPSBuIDw8IGJsa2JpdHM7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogVGVybWluYXRlIHRoZSBjdXJyZW50IGV4dGVudCAqLworCQkJCQlyZXQgPSBmaWVtYXBfZmlsbF9uZXh0X2V4dGVudCgKKwkJCQkJCWZpZWluZm8sIGxvZ2ljYWwsIHBoeXMsIHNpemUsCisJCQkJCQlmbGFncyk7CisJCQkJCWlmIChyZXQgfHwgYmxrb2ZmID4gZW5kX2Jsa29mZikKKwkJCQkJCWJyZWFrOworCisJCQkJCS8qIFN0YXJ0IGFub3RoZXIgZXh0ZW50ICovCisJCQkJCWZsYWdzID0gRklFTUFQX0VYVEVOVF9NRVJHRUQ7CisJCQkJCWxvZ2ljYWwgPSBibGtvZmYgPDwgYmxrYml0czsKKwkJCQkJcGh5cyA9IGJsa3BoeSA8PCBibGtiaXRzOworCQkJCQlzaXplID0gbiA8PCBibGtiaXRzOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyogU3RhcnQgYSBuZXcgZXh0ZW50ICovCisJCQkJZmxhZ3MgPSBGSUVNQVBfRVhURU5UX01FUkdFRDsKKwkJCQlsb2dpY2FsID0gYmxrb2ZmIDw8IGJsa2JpdHM7CisJCQkJcGh5cyA9IGJsa3BoeSA8PCBibGtiaXRzOworCQkJCXNpemUgPSBuIDw8IGJsa2JpdHM7CisJCQl9CisJCQlibGtvZmYgKz0gbjsKKwkJfQorCQljb25kX3Jlc2NoZWQoKTsKKwl9IHdoaWxlICh0cnVlKTsKKworCS8qIElmIHJldCBpcyAxIHRoZW4gd2UganVzdCBoaXQgdGhlIGVuZCBvZiB0aGUgZXh0ZW50IGFycmF5ICovCisJaWYgKHJldCA9PSAxKQorCQlyZXQgPSAwOworCisJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9pb2N0bC5jIGIvZnMvbmlsZnMyL2lvY3RsLmMKaW5kZXggYjE4NWU5My4uNDk2NzM4OSAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL2lvY3RsLmMKKysrIGIvZnMvbmlsZnMyL2lvY3RsLmMKQEAgLTIzMyw3ICsyMzMsNyBAQAogCWludCByZXQ7CiAKIAlkb3duX3JlYWQoJm5pbGZzLT5uc19zZWdjdG9yX3NlbSk7Ci0JcmV0ID0gbmlsZnNfZGF0X2dldF92aW5mbyhuaWxmc19kYXRfaW5vZGUobmlsZnMpLCBidWYsIHNpemUsIG5tZW1icyk7CisJcmV0ID0gbmlsZnNfZGF0X2dldF92aW5mbyhuaWxmcy0+bnNfZGF0LCBidWYsIHNpemUsIG5tZW1icyk7CiAJdXBfcmVhZCgmbmlsZnMtPm5zX3NlZ2N0b3Jfc2VtKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjQyLDggKzI0Miw3IEBACiBuaWxmc19pb2N0bF9kb19nZXRfYmRlc2NzKHN0cnVjdCB0aGVfbmlsZnMgKm5pbGZzLCBfX3U2NCAqcG9zcCwgaW50IGZsYWdzLAogCQkJICB2b2lkICpidWYsIHNpemVfdCBzaXplLCBzaXplX3Qgbm1lbWJzKQogewotCXN0cnVjdCBpbm9kZSAqZGF0ID0gbmlsZnNfZGF0X2lub2RlKG5pbGZzKTsKLQlzdHJ1Y3QgbmlsZnNfYm1hcCAqYm1hcCA9IE5JTEZTX0koZGF0KS0+aV9ibWFwOworCXN0cnVjdCBuaWxmc19ibWFwICpibWFwID0gTklMRlNfSShuaWxmcy0+bnNfZGF0KS0+aV9ibWFwOwogCXN0cnVjdCBuaWxmc19iZGVzYyAqYmRlc2NzID0gYnVmOwogCWludCByZXQsIGk7CiAKQEAgLTQyMSw3ICs0MjAsNyBAQAogCXNpemVfdCBubWVtYnMgPSBhcmd2LT52X25tZW1iczsKIAlpbnQgcmV0OwogCi0JcmV0ID0gbmlsZnNfZGF0X2ZyZWV2KG5pbGZzX2RhdF9pbm9kZShuaWxmcyksIGJ1Ziwgbm1lbWJzKTsKKwlyZXQgPSBuaWxmc19kYXRfZnJlZXYobmlsZnMtPm5zX2RhdCwgYnVmLCBubWVtYnMpOwogCiAJcmV0dXJuIChyZXQgPCAwKSA/IHJldCA6IG5tZW1iczsKIH0KQEAgLTQzMCw4ICs0MjksNyBAQAogCQkJCQkgc3RydWN0IG5pbGZzX2FyZ3YgKmFyZ3YsIHZvaWQgKmJ1ZikKIHsKIAlzaXplX3Qgbm1lbWJzID0gYXJndi0+dl9ubWVtYnM7Ci0Jc3RydWN0IGlub2RlICpkYXQgPSBuaWxmc19kYXRfaW5vZGUobmlsZnMpOwotCXN0cnVjdCBuaWxmc19ibWFwICpibWFwID0gTklMRlNfSShkYXQpLT5pX2JtYXA7CisJc3RydWN0IG5pbGZzX2JtYXAgKmJtYXAgPSBOSUxGU19JKG5pbGZzLT5uc19kYXQpLT5pX2JtYXA7CiAJc3RydWN0IG5pbGZzX2JkZXNjICpiZGVzY3MgPSBidWY7CiAJaW50IHJldCwgaTsKIApAQCAtNDUwLDcgKzQ0OCw3IEBACiAJCQkvKiBza2lwIGRlYWQgYmxvY2sgKi8KIAkJCWNvbnRpbnVlOwogCQlpZiAoYmRlc2NzW2ldLmJkX2xldmVsID09IDApIHsKLQkJCXJldCA9IG5pbGZzX21kdF9tYXJrX2Jsb2NrX2RpcnR5KGRhdCwKKwkJCXJldCA9IG5pbGZzX21kdF9tYXJrX2Jsb2NrX2RpcnR5KG5pbGZzLT5uc19kYXQsCiAJCQkJCQkJIGJkZXNjc1tpXS5iZF9vZmZzZXQpOwogCQkJaWYgKHJldCA8IDApIHsKIAkJCQlXQVJOX09OKHJldCA9PSAtRU5PRU5UKTsKZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9tZHQuYyBiL2ZzL25pbGZzMi9tZHQuYwppbmRleCAzOWE1Yjg0Li42YTBlMmExIDEwMDY0NAotLS0gYS9mcy9uaWxmczIvbWR0LmMKKysrIGIvZnMvbmlsZnMyL21kdC5jCkBAIC0yMzcsOCArMjM3LDYgQEAKICAqCiAgKiAlLUVOT0VOVCAtIHRoZSBzcGVjaWZpZWQgYmxvY2sgZG9lcyBub3QgZXhpc3QgKGhvbGUgYmxvY2spCiAgKgotICogJS1FSU5WQUwgLSBibWFwIGlzIGJyb2tlbi4gKHRoZSBjYWxsZXIgc2hvdWxkIGNhbGwgbmlsZnNfZXJyb3IoKSkKLSAqCiAgKiAlLUVST0ZTIC0gUmVhZCBvbmx5IGZpbGVzeXN0ZW0gKGZvciBjcmVhdGUgbW9kZSkKICAqLwogaW50IG5pbGZzX21kdF9nZXRfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgbG9uZyBibGtvZmYsIGludCBjcmVhdGUsCkBAIC0yNzMsOCArMjcxLDYgQEAKICAqICUtRU5PTUVNIC0gSW5zdWZmaWNpZW50IG1lbW9yeSBhdmFpbGFibGUuCiAgKgogICogJS1FSU8gLSBJL08gZXJyb3IKLSAqCi0gKiAlLUVJTlZBTCAtIGJtYXAgaXMgYnJva2VuLiAodGhlIGNhbGxlciBzaG91bGQgY2FsbCBuaWxmc19lcnJvcigpKQogICovCiBpbnQgbmlsZnNfbWR0X2RlbGV0ZV9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBsb25nIGJsb2NrKQogewpAQCAtMzUwLDggKzM0Niw2IEBACiAgKiAlLUVJTyAtIEkvTyBlcnJvcgogICoKICAqICUtRU5PRU5UIC0gdGhlIHNwZWNpZmllZCBibG9jayBkb2VzIG5vdCBleGlzdCAoaG9sZSBibG9jaykKLSAqCi0gKiAlLUVJTlZBTCAtIGJtYXAgaXMgYnJva2VuLiAodGhlIGNhbGxlciBzaG91bGQgY2FsbCBuaWxmc19lcnJvcigpKQogICovCiBpbnQgbmlsZnNfbWR0X21hcmtfYmxvY2tfZGlydHkoc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgbG9uZyBibG9jaykKIHsKQEAgLTQ5OSwzMSArNDkzLDI5IEBACiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9mcm96ZW47CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJaW50IGJsa2JpdHMgPSBpbm9kZS0+aV9ibGtiaXRzOwotCWludCByZXQgPSAtRU5PTUVNOwogCiAJcGFnZSA9IGdyYWJfY2FjaGVfcGFnZSgmc2hhZG93LT5mcm96ZW5fZGF0YSwgYmgtPmJfcGFnZS0+aW5kZXgpOwogCWlmICghcGFnZSkKLQkJcmV0dXJuIHJldDsKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlpZiAoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpCiAJCWNyZWF0ZV9lbXB0eV9idWZmZXJzKHBhZ2UsIDEgPDwgYmxrYml0cywgMCk7CiAKIAliaF9mcm96ZW4gPSBuaWxmc19wYWdlX2dldF9udGhfYmxvY2socGFnZSwgYmhfb2Zmc2V0KGJoKSA+PiBibGtiaXRzKTsKLQlpZiAoYmhfZnJvemVuKSB7Ci0JCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoX2Zyb3plbikpCi0JCQluaWxmc19jb3B5X2J1ZmZlcihiaF9mcm96ZW4sIGJoKTsKLQkJaWYgKGxpc3RfZW1wdHkoJmJoX2Zyb3plbi0+Yl9hc3NvY19idWZmZXJzKSkgewotCQkJbGlzdF9hZGRfdGFpbCgmYmhfZnJvemVuLT5iX2Fzc29jX2J1ZmZlcnMsCi0JCQkJICAgICAgJnNoYWRvdy0+ZnJvemVuX2J1ZmZlcnMpOwotCQkJc2V0X2J1ZmZlcl9uaWxmc19yZWRpcmVjdGVkKGJoKTsKLQkJfSBlbHNlIHsKLQkJCWJyZWxzZShiaF9mcm96ZW4pOyAvKiBhbHJlYWR5IGZyb3plbiAqLwotCQl9Ci0JCXJldCA9IDA7CisKKwlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaF9mcm96ZW4pKQorCQluaWxmc19jb3B5X2J1ZmZlcihiaF9mcm96ZW4sIGJoKTsKKwlpZiAobGlzdF9lbXB0eSgmYmhfZnJvemVuLT5iX2Fzc29jX2J1ZmZlcnMpKSB7CisJCWxpc3RfYWRkX3RhaWwoJmJoX2Zyb3plbi0+Yl9hc3NvY19idWZmZXJzLAorCQkJICAgICAgJnNoYWRvdy0+ZnJvemVuX2J1ZmZlcnMpOworCQlzZXRfYnVmZmVyX25pbGZzX3JlZGlyZWN0ZWQoYmgpOworCX0gZWxzZSB7CisJCWJyZWxzZShiaF9mcm96ZW4pOyAvKiBhbHJlYWR5IGZyb3plbiAqLwogCX0KKwogCXVubG9ja19wYWdlKHBhZ2UpOwogCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiBzdHJ1Y3QgYnVmZmVyX2hlYWQgKgpkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL25hbWVpLmMgYi9mcy9uaWxmczIvbmFtZWkuYwppbmRleCA2ZTk1NTdlLi45ODAzNDI3IDEwMDY0NAotLS0gYS9mcy9uaWxmczIvbmFtZWkuYworKysgYi9mcy9uaWxmczIvbmFtZWkuYwpAQCAtNTc3LDYgKzU3Nyw3IEBACiAJLnJlbmFtZQkJPSBuaWxmc19yZW5hbWUsCiAJLnNldGF0dHIJPSBuaWxmc19zZXRhdHRyLAogCS5wZXJtaXNzaW9uCT0gbmlsZnNfcGVybWlzc2lvbiwKKwkuZmllbWFwCQk9IG5pbGZzX2ZpZW1hcCwKIH07CiAKIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIG5pbGZzX3NwZWNpYWxfaW5vZGVfb3BlcmF0aW9ucyA9IHsKZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9uaWxmcy5oIGIvZnMvbmlsZnMyL25pbGZzLmgKaW5kZXggMGNhOTg4Mi4uNzc3ZThmZCAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL25pbGZzLmgKKysrIGIvZnMvbmlsZnMyL25pbGZzLmgKQEAgLTE5MCwxMSArMTkwLDYgQEAKIAlyZXR1cm4gbmlsZnNfdGVzdF90cmFuc2FjdGlvbl9mbGFnKE5JTEZTX1RJX1dSSVRFUik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IGlub2RlICpuaWxmc19kYXRfaW5vZGUoY29uc3Qgc3RydWN0IHRoZV9uaWxmcyAqbmlsZnMpCi17Ci0JcmV0dXJuIG5pbGZzLT5uc19kYXQ7Ci19Ci0KIC8qCiAgKiBmdW5jdGlvbiBwcm90b3R5cGUKICAqLwpAQCAtMjU3LDEzICsyNTIsMTMgQEAKIGV4dGVybiB2b2lkIG5pbGZzX2V2aWN0X2lub2RlKHN0cnVjdCBpbm9kZSAqKTsKIGV4dGVybiBpbnQgbmlsZnNfc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBpYXR0ciAqKTsKIGludCBuaWxmc19wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgZmxhZ3MpOwotZXh0ZXJuIGludCBuaWxmc19sb2FkX2lub2RlX2Jsb2NrKHN0cnVjdCBuaWxmc19zYl9pbmZvICosIHN0cnVjdCBpbm9kZSAqLAotCQkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqKTsKK2ludCBuaWxmc19sb2FkX2lub2RlX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqKnBiaCk7CiBleHRlcm4gaW50IG5pbGZzX2lub2RlX2RpcnR5KHN0cnVjdCBpbm9kZSAqKTsKLWV4dGVybiBpbnQgbmlsZnNfc2V0X2ZpbGVfZGlydHkoc3RydWN0IG5pbGZzX3NiX2luZm8gKiwgc3RydWN0IGlub2RlICosCi0JCQkJdW5zaWduZWQpOworaW50IG5pbGZzX3NldF9maWxlX2RpcnR5KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIG5yX2RpcnR5KTsKIGV4dGVybiBpbnQgbmlsZnNfbWFya19pbm9kZV9kaXJ0eShzdHJ1Y3QgaW5vZGUgKik7CiBleHRlcm4gdm9pZCBuaWxmc19kaXJ0eV9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7CitpbnQgbmlsZnNfZmllbWFwKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWVtYXBfZXh0ZW50X2luZm8gKmZpZWluZm8sCisJCSBfX3U2NCBzdGFydCwgX191NjQgbGVuKTsKIAogLyogc3VwZXIuYyAqLwogZXh0ZXJuIHN0cnVjdCBpbm9kZSAqbmlsZnNfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICopOwpkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL3BhZ2UuYyBiL2ZzL25pbGZzMi9wYWdlLmMKaW5kZXggYTZjM2MyZTguLjBjNDMyNDEgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9wYWdlLmMKKysrIGIvZnMvbmlsZnMyL3BhZ2UuYwpAQCAtNDkxLDcgKzQ5MSw3IEBACiAJfQogCXJldHVybiBuYzsKIH0KLSAKKwogdm9pZCBuaWxmc19tYXBwaW5nX2luaXRfb25jZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZykKIHsKIAltZW1zZXQobWFwcGluZywgMCwgc2l6ZW9mKCptYXBwaW5nKSk7CkBAIC01NDYsMyArNTQ2LDg3IEBACiAJfQogCXJldHVybiBUZXN0Q2xlYXJQYWdlRGlydHkocGFnZSk7CiB9CisKKy8qKgorICogbmlsZnNfZmluZF91bmNvbW1pdHRlZF9leHRlbnQgLSBmaW5kIGV4dGVudCBvZiB1bmNvbW1pdHRlZCBkYXRhCisgKiBAaW5vZGU6IGlub2RlCisgKiBAc3RhcnRfYmxrOiBzdGFydCBibG9jayBvZmZzZXQgKGluKQorICogQGJsa29mZjogc3RhcnQgb2Zmc2V0IG9mIHRoZSBmb3VuZCBleHRlbnQgKG91dCkKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNlYXJjaGVzIGFuIGV4dGVudCBvZiBidWZmZXJzIG1hcmtlZCAiZGVsYXllZCIgd2hpY2gKKyAqIHN0YXJ0cyBmcm9tIGEgYmxvY2sgb2Zmc2V0IGVxdWFsIHRvIG9yIGxhcmdlciB0aGFuIEBzdGFydF9ibGsuICBJZgorICogc3VjaCBhbiBleHRlbnQgd2FzIGZvdW5kLCB0aGlzIHdpbGwgc3RvcmUgdGhlIHN0YXJ0IG9mZnNldCBpbgorICogQGJsa29mZiBhbmQgcmV0dXJuIGl0cyBsZW5ndGggaW4gYmxvY2tzLiAgT3RoZXJ3aXNlLCB6ZXJvIGlzCisgKiByZXR1cm5lZC4KKyAqLwordW5zaWduZWQgbG9uZyBuaWxmc19maW5kX3VuY29tbWl0dGVkX2V4dGVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICAgc2VjdG9yX3Qgc3RhcnRfYmxrLAorCQkJCQkgICAgc2VjdG9yX3QgKmJsa29mZikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlwZ29mZl90IGluZGV4OworCXVuc2lnbmVkIGludCBuYmxvY2tzX2luX3BhZ2U7CisJdW5zaWduZWQgbG9uZyBsZW5ndGggPSAwOworCXNlY3Rvcl90IGI7CisJc3RydWN0IHBhZ2V2ZWMgcHZlYzsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCWlmIChpbm9kZS0+aV9tYXBwaW5nLT5ucnBhZ2VzID09IDApCisJCXJldHVybiAwOworCisJaW5kZXggPSBzdGFydF9ibGsgPj4gKFBBR0VfQ0FDSEVfU0hJRlQgLSBpbm9kZS0+aV9ibGtiaXRzKTsKKwluYmxvY2tzX2luX3BhZ2UgPSAxVSA8PCAoUEFHRV9DQUNIRV9TSElGVCAtIGlub2RlLT5pX2Jsa2JpdHMpOworCisJcGFnZXZlY19pbml0KCZwdmVjLCAwKTsKKworcmVwZWF0OgorCXB2ZWMubnIgPSBmaW5kX2dldF9wYWdlc19jb250aWcoaW5vZGUtPmlfbWFwcGluZywgaW5kZXgsIFBBR0VWRUNfU0laRSwKKwkJCQkJcHZlYy5wYWdlcyk7CisJaWYgKHB2ZWMubnIgPT0gMCkKKwkJcmV0dXJuIGxlbmd0aDsKKworCWlmIChsZW5ndGggPiAwICYmIHB2ZWMucGFnZXNbMF0tPmluZGV4ID4gaW5kZXgpCisJCWdvdG8gb3V0OworCisJYiA9IHB2ZWMucGFnZXNbMF0tPmluZGV4IDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gaW5vZGUtPmlfYmxrYml0cyk7CisJaSA9IDA7CisJZG8geworCQlwYWdlID0gcHZlYy5wYWdlc1tpXTsKKworCQlsb2NrX3BhZ2UocGFnZSk7CisJCWlmIChwYWdlX2hhc19idWZmZXJzKHBhZ2UpKSB7CisJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqaGVhZDsKKworCQkJYmggPSBoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCQkJZG8geworCQkJCWlmIChiIDwgc3RhcnRfYmxrKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoYnVmZmVyX2RlbGF5KGJoKSkgeworCQkJCQlpZiAobGVuZ3RoID09IDApCisJCQkJCQkqYmxrb2ZmID0gYjsKKwkJCQkJbGVuZ3RoKys7CisJCQkJfSBlbHNlIGlmIChsZW5ndGggPiAwKSB7CisJCQkJCWdvdG8gb3V0X2xvY2tlZDsKKwkJCQl9CisJCQl9IHdoaWxlICgrK2IsIGJoID0gYmgtPmJfdGhpc19wYWdlLCBiaCAhPSBoZWFkKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChsZW5ndGggPiAwKQorCQkJCWdvdG8gb3V0X2xvY2tlZDsKKworCQkJYiArPSBuYmxvY2tzX2luX3BhZ2U7CisJCX0KKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisKKwl9IHdoaWxlICgrK2kgPCBwYWdldmVjX2NvdW50KCZwdmVjKSk7CisKKwlpbmRleCA9IHBhZ2UtPmluZGV4ICsgMTsKKwlwYWdldmVjX3JlbGVhc2UoJnB2ZWMpOworCWNvbmRfcmVzY2hlZCgpOworCWdvdG8gcmVwZWF0OworCitvdXRfbG9ja2VkOgorCXVubG9ja19wYWdlKHBhZ2UpOworb3V0OgorCXBhZ2V2ZWNfcmVsZWFzZSgmcHZlYyk7CisJcmV0dXJuIGxlbmd0aDsKK30KZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9wYWdlLmggYi9mcy9uaWxmczIvcGFnZS5oCmluZGV4IGZiOWU4YTguLjYyMmRmMjcgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9wYWdlLmgKKysrIGIvZnMvbmlsZnMyL3BhZ2UuaApAQCAtNjYsNiArNjYsOSBAQAogCQkJc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSwKIAkJCWNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgKmFvcHMpOwogdW5zaWduZWQgbmlsZnNfcGFnZV9jb3VudF9jbGVhbl9idWZmZXJzKHN0cnVjdCBwYWdlICosIHVuc2lnbmVkLCB1bnNpZ25lZCk7Cit1bnNpZ25lZCBsb25nIG5pbGZzX2ZpbmRfdW5jb21taXR0ZWRfZXh0ZW50KHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgICBzZWN0b3JfdCBzdGFydF9ibGssCisJCQkJCSAgICBzZWN0b3JfdCAqYmxrb2ZmKTsKIAogI2RlZmluZSBOSUxGU19QQUdFX0JVRyhwYWdlLCBtLCBhLi4uKSBcCiAJZG8geyBuaWxmc19wYWdlX2J1ZyhwYWdlKTsgQlVHKCk7IH0gd2hpbGUgKDApCmRpZmYgLS1naXQgYS9mcy9uaWxmczIvcmVjb3ZlcnkuYyBiL2ZzL25pbGZzMi9yZWNvdmVyeS5jCmluZGV4IDVkMjcxMWMyLi4zZGZjZDNiIDEwMDY0NAotLS0gYS9mcy9uaWxmczIvcmVjb3ZlcnkuYworKysgYi9mcy9uaWxmczIvcmVjb3ZlcnkuYwpAQCAtNTM1LDcgKzUzNSw3IEBACiAJCWlmICh1bmxpa2VseShlcnIpKQogCQkJZ290byBmYWlsZWRfcGFnZTsKIAotCQllcnIgPSBuaWxmc19zZXRfZmlsZV9kaXJ0eShzYmksIGlub2RlLCAxKTsKKwkJZXJyID0gbmlsZnNfc2V0X2ZpbGVfZGlydHkoaW5vZGUsIDEpOwogCQlpZiAodW5saWtlbHkoZXJyKSkKIAkJCWdvdG8gZmFpbGVkX3BhZ2U7CiAKZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9zYi5oIGIvZnMvbmlsZnMyL3NiLmgKaW5kZXggMzVhMDcxNS4uN2ExNzcxNSAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL3NiLmgKKysrIGIvZnMvbmlsZnMyL3NiLmgKQEAgLTI3LDE0ICsyNyw2IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogCi0vKgotICogTW91bnQgb3B0aW9ucwotICovCi1zdHJ1Y3QgbmlsZnNfbW91bnRfb3B0aW9ucyB7Ci0JdW5zaWduZWQgbG9uZyBtb3VudF9vcHQ7Ci0JX191NjQgc25hcHNob3RfY25vOwotfTsKLQogc3RydWN0IHRoZV9uaWxmczsKIHN0cnVjdCBuaWxmc19zY19pbmZvOwogCmRpZmYgLS1naXQgYS9mcy9uaWxmczIvc2VnbWVudC5jIGIvZnMvbmlsZnMyL3NlZ21lbnQuYwppbmRleCA2ODdkMDkwLi41NWViYWU1IDEwMDY0NAotLS0gYS9mcy9uaWxmczIvc2VnbWVudC5jCisrKyBiL2ZzL25pbGZzMi9zZWdtZW50LmMKQEAgLTUwNCwxNyArNTA0LDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IG5pbGZzX2hhbmRsZV9ibWFwX2Vycm9yKGludCBlcnIsIGNvbnN0IGNoYXIgKmZuYW1lLAotCQkJCSAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCi17Ci0JaWYgKGVyciA9PSAtRUlOVkFMKSB7Ci0JCW5pbGZzX2Vycm9yKHNiLCBmbmFtZSwgImJyb2tlbiBibWFwIChpbm9kZT0lbHUpXG4iLAotCQkJICAgIGlub2RlLT5pX2lubyk7Ci0JCWVyciA9IC1FSU87Ci0JfQotCXJldHVybiBlcnI7Ci19Ci0KIC8qCiAgKiBDYWxsYmFjayBmdW5jdGlvbnMgdGhhdCBlbnVtZXJhdGUsIG1hcmssIGFuZCBjb2xsZWN0IGRpcnR5IGJsb2NrcwogICovCkBAIC01MjQsOSArNTEzLDggQEAKIAlpbnQgZXJyOwogCiAJZXJyID0gbmlsZnNfYm1hcF9wcm9wYWdhdGUoTklMRlNfSShpbm9kZSktPmlfYm1hcCwgYmgpOwotCWlmICh1bmxpa2VseShlcnIgPCAwKSkKLQkJcmV0dXJuIG5pbGZzX2hhbmRsZV9ibWFwX2Vycm9yKGVyciwgX19mdW5jX18sIGlub2RlLAotCQkJCQkgICAgICAgc2NpLT5zY19zdXBlcik7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CiAKIAllcnIgPSBuaWxmc19zZWdjdG9yX2FkZF9maWxlX2Jsb2NrKHNjaSwgYmgsIGlub2RlLAogCQkJCQkgICBzaXplb2Yoc3RydWN0IG5pbGZzX2JpbmZvX3YpKTsKQEAgLTUzOSwxMyArNTI3LDcgQEAKIAkJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAogCQkJCSAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0JaW50IGVycjsKLQotCWVyciA9IG5pbGZzX2JtYXBfcHJvcGFnYXRlKE5JTEZTX0koaW5vZGUpLT5pX2JtYXAsIGJoKTsKLQlpZiAodW5saWtlbHkoZXJyIDwgMCkpCi0JCXJldHVybiBuaWxmc19oYW5kbGVfYm1hcF9lcnJvcihlcnIsIF9fZnVuY19fLCBpbm9kZSwKLQkJCQkJICAgICAgIHNjaS0+c2Nfc3VwZXIpOwotCXJldHVybiAwOworCXJldHVybiBuaWxmc19ibWFwX3Byb3BhZ2F0ZShOSUxGU19JKGlub2RlKS0+aV9ibWFwLCBiaCk7CiB9CiAKIHN0YXRpYyBpbnQgbmlsZnNfY29sbGVjdF9maWxlX2JtYXAoc3RydWN0IG5pbGZzX3NjX2luZm8gKnNjaSwKQEAgLTU4OCw5ICs1NzAsOCBAQAogCWludCBlcnI7CiAKIAllcnIgPSBuaWxmc19ibWFwX3Byb3BhZ2F0ZShOSUxGU19JKGlub2RlKS0+aV9ibWFwLCBiaCk7Ci0JaWYgKHVubGlrZWx5KGVyciA8IDApKQotCQlyZXR1cm4gbmlsZnNfaGFuZGxlX2JtYXBfZXJyb3IoZXJyLCBfX2Z1bmNfXywgaW5vZGUsCi0JCQkJCSAgICAgICBzY2ktPnNjX3N1cGVyKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKIAogCWVyciA9IG5pbGZzX3NlZ2N0b3JfYWRkX2ZpbGVfYmxvY2soc2NpLCBiaCwgaW5vZGUsIHNpemVvZihfX2xlNjQpKTsKIAlpZiAoIWVycikKQEAgLTc3Niw5ICs3NTcsOCBAQAogCQlyZXQrKzsKIAlpZiAobmlsZnNfbWR0X2ZldGNoX2RpcnR5KG5pbGZzLT5uc19zdWZpbGUpKQogCQlyZXQrKzsKLQlpZiAocmV0IHx8IG5pbGZzX2RvaW5nX2djKCkpCi0JCWlmIChuaWxmc19tZHRfZmV0Y2hfZGlydHkobmlsZnNfZGF0X2lub2RlKG5pbGZzKSkpCi0JCQlyZXQrKzsKKwlpZiAoKHJldCB8fCBuaWxmc19kb2luZ19nYygpKSAmJiBuaWxmc19tZHRfZmV0Y2hfZGlydHkobmlsZnMtPm5zX2RhdCkpCisJCXJldCsrOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTgxNCw3ICs3OTQsNyBAQAogCW5pbGZzX21kdF9jbGVhcl9kaXJ0eShzY2ktPnNjX3Jvb3QtPmlmaWxlKTsKIAluaWxmc19tZHRfY2xlYXJfZGlydHkobmlsZnMtPm5zX2NwZmlsZSk7CiAJbmlsZnNfbWR0X2NsZWFyX2RpcnR5KG5pbGZzLT5uc19zdWZpbGUpOwotCW5pbGZzX21kdF9jbGVhcl9kaXJ0eShuaWxmc19kYXRfaW5vZGUobmlsZnMpKTsKKwluaWxmc19tZHRfY2xlYXJfZGlydHkobmlsZnMtPm5zX2RhdCk7CiB9CiAKIHN0YXRpYyBpbnQgbmlsZnNfc2VnY3Rvcl9jcmVhdGVfY2hlY2twb2ludChzdHJ1Y3QgbmlsZnNfc2NfaW5mbyAqc2NpKQpAQCAtOTIzLDcgKzkwMyw3IEBACiAJCQkgICAgICBuaWxmcy0+bnNfbm9uZ2NfY3RpbWUgOiBzY2ktPnNjX3NlZ19jdGltZSk7CiAJcmF3X3NyLT5zcl9mbGFncyA9IDA7CiAKLQluaWxmc193cml0ZV9pbm9kZV9jb21tb24obmlsZnNfZGF0X2lub2RlKG5pbGZzKSwgKHZvaWQgKilyYXdfc3IgKworCW5pbGZzX3dyaXRlX2lub2RlX2NvbW1vbihuaWxmcy0+bnNfZGF0LCAodm9pZCAqKXJhd19zciArCiAJCQkJIE5JTEZTX1NSX0RBVF9PRkZTRVQoaXN6KSwgMSk7CiAJbmlsZnNfd3JpdGVfaW5vZGVfY29tbW9uKG5pbGZzLT5uc19jcGZpbGUsICh2b2lkICopcmF3X3NyICsKIAkJCQkgTklMRlNfU1JfQ1BGSUxFX09GRlNFVChpc3opLCAxKTsKQEAgLTExNzksNyArMTE1OSw3IEBACiAJCXNjaS0+c2Nfc3RhZ2Uuc2NudCsrOyAgLyogRmFsbCB0aHJvdWdoICovCiAJY2FzZSBOSUxGU19TVF9EQVQ6CiAgZGF0X3N0YWdlOgotCQllcnIgPSBuaWxmc19zZWdjdG9yX3NjYW5fZmlsZShzY2ksIG5pbGZzX2RhdF9pbm9kZShuaWxmcyksCisJCWVyciA9IG5pbGZzX3NlZ2N0b3Jfc2Nhbl9maWxlKHNjaSwgbmlsZnMtPm5zX2RhdCwKIAkJCQkJICAgICAgJm5pbGZzX3NjX2RhdF9vcHMpOwogCQlpZiAodW5saWtlbHkoZXJyKSkKIAkJCWJyZWFrOwpAQCAtMTU2Myw3ICsxNTQzLDYgQEAKIAlyZXR1cm4gMDsKIAogIGZhaWxlZF9ibWFwOgotCWVyciA9IG5pbGZzX2hhbmRsZV9ibWFwX2Vycm9yKGVyciwgX19mdW5jX18sIGlub2RlLCBzY2ktPnNjX3N1cGVyKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0xNzgzLDYgKzE3NjIsNyBAQAogCQkJCWlmICghZXJyKSB7CiAJCQkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwogCQkJCQljbGVhcl9idWZmZXJfZGlydHkoYmgpOworCQkJCQljbGVhcl9idWZmZXJfZGVsYXkoYmgpOwogCQkJCQljbGVhcl9idWZmZXJfbmlsZnNfdm9sYXRpbGUoYmgpOwogCQkJCX0KIAkJCQlicmVsc2UoYmgpOyAvKiBmb3IgYl9hc3NvY19idWZmZXJzICovCkBAIC0xOTA5LDYgKzE4ODksNyBAQAogCQkJCSAgICBiX2Fzc29jX2J1ZmZlcnMpIHsKIAkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwogCQkJY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKKwkJCWNsZWFyX2J1ZmZlcl9kZWxheShiaCk7CiAJCQljbGVhcl9idWZmZXJfbmlsZnNfdm9sYXRpbGUoYmgpOwogCQkJY2xlYXJfYnVmZmVyX25pbGZzX3JlZGlyZWN0ZWQoYmgpOwogCQkJaWYgKGJoID09IHNlZ2J1Zi0+c2Jfc3VwZXJfcm9vdCkgewpkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL3N1cGVyLmMgYi9mcy9uaWxmczIvc3VwZXIuYwppbmRleCBlMmRjYzljLi43MGRmZGQ1IDEwMDY0NAotLS0gYS9mcy9uaWxmczIvc3VwZXIuYworKysgYi9mcy9uaWxmczIvc3VwZXIuYwpAQCAtNDcsNyArNDcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CiAjaW5jbHVkZSA8bGludXgvdmZzLmg+CiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+Ci0jaW5jbHVkZSA8bGludXgva29iamVjdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KICNpbmNsdWRlICJuaWxmcy5oIgpAQCAtMTExLDEyICsxMTAsMTcgQEAKIAkJIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogewogCXN0cnVjdCBuaWxmc19zYl9pbmZvICpzYmkgPSBOSUxGU19TQihzYik7CisJc3RydWN0IHZhX2Zvcm1hdCB2YWY7CiAJdmFfbGlzdCBhcmdzOwogCiAJdmFfc3RhcnQoYXJncywgZm10KTsKLQlwcmludGsoS0VSTl9DUklUICJOSUxGUyBlcnJvciAoZGV2aWNlICVzKTogJXM6ICIsIHNiLT5zX2lkLCBmdW5jdGlvbik7Ci0JdnByaW50ayhmbXQsIGFyZ3MpOwotCXByaW50aygiXG4iKTsKKworCXZhZi5mbXQgPSBmbXQ7CisJdmFmLnZhID0gJmFyZ3M7CisKKwlwcmludGsoS0VSTl9DUklUICJOSUxGUyBlcnJvciAoZGV2aWNlICVzKTogJXM6ICVwVlxuIiwKKwkgICAgICAgc2ItPnNfaWQsIGZ1bmN0aW9uLCAmdmFmKTsKKwogCXZhX2VuZChhcmdzKTsKIAogCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgewpAQCAtMTM2LDEzICsxNDAsMTcgQEAKIHZvaWQgbmlsZnNfd2FybmluZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBjaGFyICpmdW5jdGlvbiwKIAkJICAgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CisJc3RydWN0IHZhX2Zvcm1hdCB2YWY7CiAJdmFfbGlzdCBhcmdzOwogCiAJdmFfc3RhcnQoYXJncywgZm10KTsKLQlwcmludGsoS0VSTl9XQVJOSU5HICJOSUxGUyB3YXJuaW5nIChkZXZpY2UgJXMpOiAlczogIiwKLQkgICAgICAgc2ItPnNfaWQsIGZ1bmN0aW9uKTsKLQl2cHJpbnRrKGZtdCwgYXJncyk7Ci0JcHJpbnRrKCJcbiIpOworCisJdmFmLmZtdCA9IGZtdDsKKwl2YWYudmEgPSAmYXJnczsKKworCXByaW50ayhLRVJOX1dBUk5JTkcgIk5JTEZTIHdhcm5pbmcgKGRldmljZSAlcyk6ICVzOiAlcFZcbiIsCisJICAgICAgIHNiLT5zX2lkLCBmdW5jdGlvbiwgJnZhZik7CisKIAl2YV9lbmQoYXJncyk7CiB9CiAKQEAgLTEwMTAsMTEgKzEwMTgsMTEgQEAKIAlzdHJ1Y3QgbmlsZnNfc2JfaW5mbyAqc2JpID0gTklMRlNfU0Ioc2IpOwogCXN0cnVjdCB0aGVfbmlsZnMgKm5pbGZzID0gc2JpLT5zX25pbGZzOwogCXVuc2lnbmVkIGxvbmcgb2xkX3NiX2ZsYWdzOwotCXN0cnVjdCBuaWxmc19tb3VudF9vcHRpb25zIG9sZF9vcHRzOworCXVuc2lnbmVkIGxvbmcgb2xkX21vdW50X29wdDsKIAlpbnQgZXJyOwogCiAJb2xkX3NiX2ZsYWdzID0gc2ItPnNfZmxhZ3M7Ci0Jb2xkX29wdHMubW91bnRfb3B0ID0gc2JpLT5zX21vdW50X29wdDsKKwlvbGRfbW91bnRfb3B0ID0gc2JpLT5zX21vdW50X29wdDsKIAogCWlmICghcGFyc2Vfb3B0aW9ucyhkYXRhLCBzYiwgMSkpIHsKIAkJZXJyID0gLUVJTlZBTDsKQEAgLTEwODMsNyArMTA5MSw3IEBACiAKICByZXN0b3JlX29wdHM6CiAJc2ItPnNfZmxhZ3MgPSBvbGRfc2JfZmxhZ3M7Ci0Jc2JpLT5zX21vdW50X29wdCA9IG9sZF9vcHRzLm1vdW50X29wdDsKKwlzYmktPnNfbW91bnRfb3B0ID0gb2xkX21vdW50X29wdDsKIAlyZXR1cm4gZXJyOwogfQogCmRpZmYgLS1naXQgYS9mcy9uaWxmczIvdGhlX25pbGZzLmMgYi9mcy9uaWxmczIvdGhlX25pbGZzLmMKaW5kZXggMDI1NGJlMi4uYWQ0YWM2MCAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL3RoZV9uaWxmcy5jCisrKyBiL2ZzL25pbGZzMi90aGVfbmlsZnMuYwpAQCAtMzI5LDcgKzMyOSw2IEBACiAJcHJpbnRrKEtFUk5fSU5GTyAiTklMRlM6IHJlY292ZXJ5IGNvbXBsZXRlLlxuIik7CiAKICBza2lwX3JlY292ZXJ5OgotCXNldF9uaWxmc19sb2FkZWQobmlsZnMpOwogCW5pbGZzX2NsZWFyX3JlY292ZXJ5X2luZm8oJnJpKTsKIAlzYmktPnNfc3VwZXItPnNfZmxhZ3MgPSBzX2ZsYWdzOwogCXJldHVybiAwOwpAQCAtNjUxLDEyICs2NTAsMTEgQEAKIAogaW50IG5pbGZzX2NvdW50X2ZyZWVfYmxvY2tzKHN0cnVjdCB0aGVfbmlsZnMgKm5pbGZzLCBzZWN0b3JfdCAqbmJsb2NrcykKIHsKLQlzdHJ1Y3QgaW5vZGUgKmRhdCA9IG5pbGZzX2RhdF9pbm9kZShuaWxmcyk7CiAJdW5zaWduZWQgbG9uZyBuY2xlYW5zZWdzOwogCi0JZG93bl9yZWFkKCZOSUxGU19NRFQoZGF0KS0+bWlfc2VtKTsJLyogWFhYICovCisJZG93bl9yZWFkKCZOSUxGU19NRFQobmlsZnMtPm5zX2RhdCktPm1pX3NlbSk7CiAJbmNsZWFuc2VncyA9IG5pbGZzX3N1ZmlsZV9nZXRfbmNsZWFuc2VncyhuaWxmcy0+bnNfc3VmaWxlKTsKLQl1cF9yZWFkKCZOSUxGU19NRFQoZGF0KS0+bWlfc2VtKTsJLyogWFhYICovCisJdXBfcmVhZCgmTklMRlNfTURUKG5pbGZzLT5uc19kYXQpLT5taV9zZW0pOwogCSpuYmxvY2tzID0gKHNlY3Rvcl90KW5jbGVhbnNlZ3MgKiBuaWxmcy0+bnNfYmxvY2tzX3Blcl9zZWdtZW50OwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL3RoZV9uaWxmcy5oIGIvZnMvbmlsZnMyL3RoZV9uaWxmcy5oCmluZGV4IDY5MjI2ZTEuLmZkODVlNGMgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi90aGVfbmlsZnMuaAorKysgYi9mcy9uaWxmczIvdGhlX25pbGZzLmgKQEAgLTM2LDggKzM2LDYgQEAKIC8qIHRoZV9uaWxmcyBzdHJ1Y3QgKi8KIGVudW0gewogCVRIRV9OSUxGU19JTklUID0gMCwgICAgIC8qIEluZm9ybWF0aW9uIGZyb20gc3VwZXJfYmxvY2sgaXMgc2V0ICovCi0JVEhFX05JTEZTX0xPQURFRCwgICAgICAgLyogUm9sbC1iYWNrL3JvbGwtZm9yd2FyZCBoYXMgZG9uZSBhbmQKLQkJCQkgICB0aGUgbGF0ZXN0IGNoZWNrcG9pbnQgd2FzIGxvYWRlZCAqLwogCVRIRV9OSUxGU19ESVNDT05USU5VRUQsCS8qICduZXh0JyBwb2ludGVyIGNoYWluIGhhcyBicm9rZW4gKi8KIAlUSEVfTklMRlNfR0NfUlVOTklORywJLyogZ2MgcHJvY2VzcyBpcyBydW5uaW5nICovCiAJVEhFX05JTEZTX1NCX0RJUlRZLAkvKiBzdXBlciBibG9jayBpcyBkaXJ0eSAqLwpAQCAtMTc4LDcgKzE3Niw2IEBACiB9CiAKIFRIRV9OSUxGU19GTlMoSU5JVCwgaW5pdCkKLVRIRV9OSUxGU19GTlMoTE9BREVELCBsb2FkZWQpCiBUSEVfTklMRlNfRk5TKERJU0NPTlRJTlVFRCwgZGlzY29udGludWVkKQogVEhFX05JTEZTX0ZOUyhHQ19SVU5OSU5HLCBnY19ydW5uaW5nKQogVEhFX05JTEZTX0ZOUyhTQl9ESVJUWSwgc2JfZGlydHkpCmRpZmYgLS1naXQgYS9mcy9zeXNmcy9ncm91cC5jIGIvZnMvc3lzZnMvZ3JvdXAuYwppbmRleCA0NDJmMzRmLi5jODc2OWRjMiAxMDA2NDQKLS0tIGEvZnMvc3lzZnMvZ3JvdXAuYworKysgYi9mcy9zeXNmcy9ncm91cC5jCkBAIC0xNjUsMTAgKzE2NSw3IEBACiAJc3RydWN0IGF0dHJpYnV0ZSAqY29uc3QgKmF0dHI7CiAJaW50IGk7CiAKLQlpZiAoZ3JwKQotCQlkaXJfc2QgPSBzeXNmc19nZXRfZGlyZW50KGtvYmotPnNkLCBOVUxMLCBncnAtPm5hbWUpOwotCWVsc2UKLQkJZGlyX3NkID0gc3lzZnNfZ2V0KGtvYmotPnNkKTsKKwlkaXJfc2QgPSBzeXNmc19nZXRfZGlyZW50KGtvYmotPnNkLCBOVUxMLCBncnAtPm5hbWUpOwogCWlmICghZGlyX3NkKQogCQlyZXR1cm4gLUVOT0VOVDsKIApAQCAtMTk1LDEwICsxOTIsNyBAQAogCXN0cnVjdCBzeXNmc19kaXJlbnQgKmRpcl9zZDsKIAlzdHJ1Y3QgYXR0cmlidXRlICpjb25zdCAqYXR0cjsKIAotCWlmIChncnApCi0JCWRpcl9zZCA9IHN5c2ZzX2dldF9kaXJlbnQoa29iai0+c2QsIE5VTEwsIGdycC0+bmFtZSk7Ci0JZWxzZQotCQlkaXJfc2QgPSBzeXNmc19nZXQoa29iai0+c2QpOworCWRpcl9zZCA9IHN5c2ZzX2dldF9kaXJlbnQoa29iai0+c2QsIE5VTEwsIGdycC0+bmFtZSk7CiAJaWYgKGRpcl9zZCkgewogCQlmb3IgKGF0dHIgPSBncnAtPmF0dHJzOyAqYXR0cjsgKythdHRyKQogCQkJc3lzZnNfaGFzaF9hbmRfcmVtb3ZlKGRpcl9zZCwgTlVMTCwgKCphdHRyKS0+bmFtZSk7CmRpZmYgLS1naXQgYS9mcy9zeXNmcy9pbm9kZS5jIGIvZnMvc3lzZnMvaW5vZGUuYwppbmRleCAzMGFjMjczLi4wYTEyZWI4IDEwMDY0NAotLS0gYS9mcy9zeXNmcy9pbm9kZS5jCisrKyBiL2ZzL3N5c2ZzL2lub2RlLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgveGF0dHIuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgInN5c2ZzLmgiCmRpZmYgLS1naXQgYS9mcy9zeXNmcy9zeXNmcy5oIGIvZnMvc3lzZnMvc3lzZnMuaAppbmRleCBmZmFhYTgxLi4zZDI4YWYzMSAxMDA2NDQKLS0tIGEvZnMvc3lzZnMvc3lzZnMuaAorKysgYi9mcy9zeXNmcy9zeXNmcy5oCkBAIC05LDYgKzksNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9sb2NrZGVwLmg+CisjaW5jbHVkZSA8bGludXgva29iamVjdF9ucy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAKIHN0cnVjdCBzeXNmc19vcGVuX2RpcmVudDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaAppbmRleCBiZDY5ZDc5Li4wNWNiYWQwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL3ZtbGludXgubGRzLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oCkBAIC02Nyw3ICs2Nyw4IEBACiAgKiBBbGlnbiB0byBhIDMyIGJ5dGUgYm91bmRhcnkgZXF1YWwgdG8gdGhlCiAgKiBhbGlnbm1lbnQgZ2NjIDQuNSB1c2VzIGZvciBhIHN0cnVjdAogICovCi0jZGVmaW5lIFNUUlVDVF9BTElHTigpIC4gPSBBTElHTigzMikKKyNkZWZpbmUgU1RSVUNUX0FMSUdOTUVOVCAzMgorI2RlZmluZSBTVFJVQ1RfQUxJR04oKSAuID0gQUxJR04oU1RSVUNUX0FMSUdOTUVOVCkKIAogLyogVGhlIGFjdHVhbCBjb25maWd1cmF0aW9uIGRldGVybWluZSBpZiB0aGUgaW5pdC9leGl0IHNlY3Rpb25zCiAgKiBhcmUgaGFuZGxlZCBhcyB0ZXh0L2RhdGEgb3IgdGhleSBjYW4gYmUgZGlzY2FyZGVkICh3aGljaApAQCAtMTQ2LDYgKzE0NywxMyBAQAogI2RlZmluZSBUUkFDRV9TWVNDQUxMUygpCiAjZW5kaWYKIAorCisjZGVmaW5lIEtFUk5FTF9EVEIoKQkJCQkJCQlcCisJU1RSVUNUX0FMSUdOKCk7CQkJCQkJCVwKKwlWTUxJTlVYX1NZTUJPTChfX2R0Yl9zdGFydCkgPSAuOwkJCQlcCisJKiguZHRiLmluaXQucm9kYXRhKQkJCQkJCVwKKwlWTUxJTlVYX1NZTUJPTChfX2R0Yl9lbmQpID0gLjsKKwogLyogLmRhdGEgc2VjdGlvbiAqLwogI2RlZmluZSBEQVRBX0RBVEEJCQkJCQkJXAogCSooLmRhdGEpCQkJCQkJCVwKQEAgLTQ2OCw3ICs0NzYsOCBAQAogCU1DT1VOVF9SRUMoKQkJCQkJCQlcCiAJREVWX0RJU0NBUkQoaW5pdC5yb2RhdGEpCQkJCQlcCiAJQ1BVX0RJU0NBUkQoaW5pdC5yb2RhdGEpCQkJCQlcCi0JTUVNX0RJU0NBUkQoaW5pdC5yb2RhdGEpCisJTUVNX0RJU0NBUkQoaW5pdC5yb2RhdGEpCQkJCQlcCisJS0VSTkVMX0RUQigpCiAKICNkZWZpbmUgSU5JVF9URVhUCQkJCQkJCVwKIAkqKC5pbml0LnRleHQpCQkJCQkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUva2V5cy9lbmNyeXB0ZWQtdHlwZS5oIGIvaW5jbHVkZS9rZXlzL2VuY3J5cHRlZC10eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU4NTUwMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUva2V5cy9lbmNyeXB0ZWQtdHlwZS5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgSUJNIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IE1pbWkgWm9oYXIgPHpvaGFyQHVzLmlibS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfS0VZU19FTkNSWVBURURfVFlQRV9ICisjZGVmaW5lIF9LRVlTX0VOQ1JZUFRFRF9UWVBFX0gKKworI2luY2x1ZGUgPGxpbnV4L2tleS5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CisKK3N0cnVjdCBlbmNyeXB0ZWRfa2V5X3BheWxvYWQgeworCXN0cnVjdCByY3VfaGVhZCByY3U7CisJY2hhciAqbWFzdGVyX2Rlc2M7CS8qIGRhdGFibG9iOiBtYXN0ZXIga2V5IG5hbWUgKi8KKwljaGFyICpkYXRhbGVuOwkJLyogZGF0YWJsb2I6IGRlY3J5cHRlZCBrZXkgbGVuZ3RoICovCisJdTggKml2OwkJCS8qIGRhdGFibG9iOiBpdiAqLworCXU4ICplbmNyeXB0ZWRfZGF0YTsJLyogZGF0YWJsb2I6IGVuY3J5cHRlZCBkYXRhICovCisJdW5zaWduZWQgc2hvcnQgZGF0YWJsb2JfbGVuOwkvKiBsZW5ndGggb2YgZGF0YWJsb2IgKi8KKwl1bnNpZ25lZCBzaG9ydCBkZWNyeXB0ZWRfZGF0YWxlbjsJLyogZGVjcnlwdGVkIGRhdGEgbGVuZ3RoICovCisJdTggZGVjcnlwdGVkX2RhdGFbMF07CS8qIGRlY3J5cHRlZCBkYXRhICsgIGRhdGFibG9iICsgaG1hYyAqLworfTsKKworZXh0ZXJuIHN0cnVjdCBrZXlfdHlwZSBrZXlfdHlwZV9lbmNyeXB0ZWQ7CisKKyNlbmRpZiAvKiBfS0VZU19FTkNSWVBURURfVFlQRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2tleXMvdHJ1c3RlZC10eXBlLmggYi9pbmNsdWRlL2tleXMvdHJ1c3RlZC10eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZmODJlNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUva2V5cy90cnVzdGVkLXR5cGUuaApAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIElCTSBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBEYXZpZCBTYWZmb3JkIDxzYWZmb3JkQHVzLmlibS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfS0VZU19UUlVTVEVEX1RZUEVfSAorI2RlZmluZSBfS0VZU19UUlVTVEVEX1RZUEVfSAorCisjaW5jbHVkZSA8bGludXgva2V5Lmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKworI2RlZmluZSBNSU5fS0VZX1NJWkUJCQkzMgorI2RlZmluZSBNQVhfS0VZX1NJWkUJCQkxMjgKKyNkZWZpbmUgTUFYX0JMT0JfU0laRQkJCTMyMAorCitzdHJ1Y3QgdHJ1c3RlZF9rZXlfcGF5bG9hZCB7CisJc3RydWN0IHJjdV9oZWFkIHJjdTsKKwl1bnNpZ25lZCBpbnQga2V5X2xlbjsKKwl1bnNpZ25lZCBpbnQgYmxvYl9sZW47CisJdW5zaWduZWQgY2hhciBtaWdyYXRhYmxlOworCXVuc2lnbmVkIGNoYXIga2V5W01BWF9LRVlfU0laRSArIDFdOworCXVuc2lnbmVkIGNoYXIgYmxvYltNQVhfQkxPQl9TSVpFXTsKK307CisKK2V4dGVybiBzdHJ1Y3Qga2V5X3R5cGUga2V5X3R5cGVfdHJ1c3RlZDsKKworI2VuZGlmIC8qIF9LRVlTX1RSVVNURURfVFlQRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L0tidWlsZCBiL2luY2x1ZGUvbGludXgvS2J1aWxkCmluZGV4IGEzNTRjMTkuLmQxNTgwYzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvS2J1aWxkCisrKyBiL2luY2x1ZGUvbGludXgvS2J1aWxkCkBAIC0yMCwxNSArMjAsMTggQEAKIG9iamhkci15ICs9IHZlcnNpb24uaAogCiBpZm5lcSAoJCh3aWxkY2FyZCAkKHNyY3RyZWUpL2FyY2gvJChTUkNBUkNIKS9pbmNsdWRlL2FzbS9hLm91dC5oIFwKLQkJICAkKHNyY3RyZWUpL2luY2x1ZGUvYXNtLSQoU1JDQVJDSCkvYS5vdXQuaCksKQorCQkgICQoc3JjdHJlZSkvaW5jbHVkZS9hc20tJChTUkNBUkNIKS9hLm91dC5oIFwKKwkJICAkKElOU1RBTExfSERSX1BBVEgpL2luY2x1ZGUvYXNtLSovYS5vdXQuaCksKQogaGVhZGVyLXkgKz0gYS5vdXQuaAogZW5kaWYKIGlmbmVxICgkKHdpbGRjYXJkICQoc3JjdHJlZSkvYXJjaC8kKFNSQ0FSQ0gpL2luY2x1ZGUvYXNtL2t2bS5oIFwKLQkJICAkKHNyY3RyZWUpL2luY2x1ZGUvYXNtLSQoU1JDQVJDSCkva3ZtLmgpLCkKKwkJICAkKHNyY3RyZWUpL2luY2x1ZGUvYXNtLSQoU1JDQVJDSCkva3ZtLmggXAorCQkgICQoSU5TVEFMTF9IRFJfUEFUSCkvaW5jbHVkZS9hc20tKi9rdm0uaCksKQogaGVhZGVyLXkgKz0ga3ZtLmgKIGVuZGlmCiBpZm5lcSAoJCh3aWxkY2FyZCAkKHNyY3RyZWUpL2FyY2gvJChTUkNBUkNIKS9pbmNsdWRlL2FzbS9rdm1fcGFyYS5oIFwKLQkJICAkKHNyY3RyZWUpL2luY2x1ZGUvYXNtLSQoU1JDQVJDSCkva3ZtX3BhcmEuaCksKQorCQkgICQoc3JjdHJlZSkvaW5jbHVkZS9hc20tJChTUkNBUkNIKS9rdm1fcGFyYS5oIFwKKwkJICAkKElOU1RBTExfSERSX1BBVEgpL2luY2x1ZGUvYXNtLSova3ZtX3BhcmEuaCksKQogaGVhZGVyLXkgKz0ga3ZtX3BhcmEuaAogZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hdWRpdC5oIGIvaW5jbHVkZS9saW51eC9hdWRpdC5oCmluZGV4IDhiNWMwNjIuLjM1OWRmMDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYXVkaXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2F1ZGl0LmgKQEAgLTM3Miw2ICszNzIsNyBAQAogc3RydWN0IGF1ZGl0X2NvbnRleHQ7CiBzdHJ1Y3QgaW5vZGU7CiBzdHJ1Y3QgbmV0bGlua19za2JfcGFybXM7CitzdHJ1Y3QgcGF0aDsKIHN0cnVjdCBsaW51eF9iaW5wcm07CiBzdHJ1Y3QgbXFfYXR0cjsKIHN0cnVjdCBtcXN0YXQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NhcGFiaWxpdHkuaCBiL2luY2x1ZGUvbGludXgvY2FwYWJpbGl0eS5oCmluZGV4IDkwMDEyYjkuLmZiMTZhMzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY2FwYWJpbGl0eS5oCisrKyBiL2luY2x1ZGUvbGludXgvY2FwYWJpbGl0eS5oCkBAIC0yNDYsNyArMjQ2LDYgQEAKIC8qIEFsbG93IGNvbmZpZ3VyYXRpb24gb2YgdGhlIHNlY3VyZSBhdHRlbnRpb24ga2V5ICovCiAvKiBBbGxvdyBhZG1pbmlzdHJhdGlvbiBvZiB0aGUgcmFuZG9tIGRldmljZSAqLwogLyogQWxsb3cgZXhhbWluYXRpb24gYW5kIGNvbmZpZ3VyYXRpb24gb2YgZGlzayBxdW90YXMgKi8KLS8qIEFsbG93IGNvbmZpZ3VyaW5nIHRoZSBrZXJuZWwncyBzeXNsb2cgKHByaW50ayBiZWhhdmlvdXIpICovCiAvKiBBbGxvdyBzZXR0aW5nIHRoZSBkb21haW5uYW1lICovCiAvKiBBbGxvdyBzZXR0aW5nIHRoZSBob3N0bmFtZSAqLwogLyogQWxsb3cgY2FsbGluZyBiZGZsdXNoKCkgKi8KQEAgLTM1Miw3ICszNTEsMTEgQEAKIAogI2RlZmluZSBDQVBfTUFDX0FETUlOICAgICAgICAzMwogCi0jZGVmaW5lIENBUF9MQVNUX0NBUCAgICAgICAgIENBUF9NQUNfQURNSU4KKy8qIEFsbG93IGNvbmZpZ3VyaW5nIHRoZSBrZXJuZWwncyBzeXNsb2cgKHByaW50ayBiZWhhdmlvdXIpICovCisKKyNkZWZpbmUgQ0FQX1NZU0xPRyAgICAgICAgICAgMzQKKworI2RlZmluZSBDQVBfTEFTVF9DQVAgICAgICAgICBDQVBfU1lTTE9HCiAKICNkZWZpbmUgY2FwX3ZhbGlkKHgpICgoeCkgPj0gMCAmJiAoeCkgPD0gQ0FQX0xBU1RfQ0FQKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RjYWNoZS5oIGIvaW5jbHVkZS9saW51eC9kY2FjaGUuaAppbmRleCBiZDA3NzU4Li41OWZjZDI0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RjYWNoZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZGNhY2hlLmgKQEAgLTMwNyw3ICszMDcsNyBAQAogICogX19kX3JjdV90b19yZWZjb3VudCAtIHRha2UgYSByZWZjb3VudCBvbiBkZW50cnkgaWYgc2VxdWVuY2UgY2hlY2sgaXMgb2sKICAqIEBkZW50cnk6IGRlbnRyeSB0byB0YWtlIGEgcmVmIG9uCiAgKiBAc2VxOiBzZXFjb3VudCB0byB2ZXJpZnkgYWdhaW5zdAotICogQFJldHVybnM6IDAgb24gZmFpbHVyZSwgZWxzZSAxLgorICogUmV0dXJuczogMCBvbiBmYWlsdXJlLCBlbHNlIDEuCiAgKgogICogX19kX3JjdV90b19yZWZjb3VudCBvcGVyYXRlcyBvbiBhIGRlbnRyeSxzZXEgcGFpciB0aGF0IHdhcyByZXR1cm5lZAogICogYnkgX19kX2xvb2t1cF9yY3UsIHRvIGdldCBhIHJlZmVyZW5jZSBvbiBhbiByY3Utd2FsayBkZW50cnkuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Rjb29raWVzLmggYi9pbmNsdWRlL2xpbnV4L2Rjb29raWVzLmgKaW5kZXggMjRjODA2Zi4uNWFjM2JkZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kY29va2llcy5oCisrKyBiL2luY2x1ZGUvbGludXgvZGNvb2tpZXMuaApAQCAtMTMsMTAgKzEzLDEwIEBACiAjaWZkZWYgQ09ORklHX1BST0ZJTElORwogIAogI2luY2x1ZGUgPGxpbnV4L2RjYWNoZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BhdGguaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogIAogc3RydWN0IGRjb29raWVfdXNlcjsKK3N0cnVjdCBwYXRoOwogIAogLyoqCiAgKiBkY29va2llX3JlZ2lzdGVyIC0gcmVnaXN0ZXIgYSB1c2VyIG9mIGRjb29raWVzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RldmljZS5oIGIvaW5jbHVkZS9saW51eC9kZXZpY2UuaAppbmRleCBkZDQ4OTUzLi4xYmY1Y2YwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKQEAgLTMwLDkgKzMwLDggQEAKIHN0cnVjdCBkZXZpY2VfZHJpdmVyOwogc3RydWN0IGRyaXZlcl9wcml2YXRlOwogc3RydWN0IGNsYXNzOwotc3RydWN0IGNsYXNzX3ByaXZhdGU7CitzdHJ1Y3Qgc3Vic3lzX3ByaXZhdGU7CiBzdHJ1Y3QgYnVzX3R5cGU7Ci1zdHJ1Y3QgYnVzX3R5cGVfcHJpdmF0ZTsKIHN0cnVjdCBkZXZpY2Vfbm9kZTsKIAogc3RydWN0IGJ1c19hdHRyaWJ1dGUgewpAQCAtNjUsNyArNjQsNyBAQAogCiAJY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgKnBtOwogCi0Jc3RydWN0IGJ1c190eXBlX3ByaXZhdGUgKnA7CisJc3RydWN0IHN1YnN5c19wcml2YXRlICpwOwogfTsKIAogZXh0ZXJuIGludCBfX211c3RfY2hlY2sgYnVzX3JlZ2lzdGVyKHN0cnVjdCBidXNfdHlwZSAqYnVzKTsKQEAgLTE5Nyw2ICsxOTYsNyBAQAogCiAJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZQkJKmNsYXNzX2F0dHJzOwogCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlCQkqZGV2X2F0dHJzOworCXN0cnVjdCBiaW5fYXR0cmlidXRlCQkqZGV2X2Jpbl9hdHRyczsKIAlzdHJ1Y3Qga29iamVjdAkJCSpkZXZfa29iajsKIAogCWludCAoKmRldl91ZXZlbnQpKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGtvYmpfdWV2ZW50X2VudiAqZW52KTsKQEAgLTIxMyw3ICsyMTMsNyBAQAogCiAJY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgKnBtOwogCi0Jc3RydWN0IGNsYXNzX3ByaXZhdGUgKnA7CisJc3RydWN0IHN1YnN5c19wcml2YXRlICpwOwogfTsKIAogc3RydWN0IGNsYXNzX2Rldl9pdGVyIHsKQEAgLTUwOCwxMyArNTA4LDEzIEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkZXZpY2VfZW5hYmxlX2FzeW5jX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewotCWlmIChkZXYtPnBvd2VyLnN0YXR1cyA9PSBEUE1fT04pCisJaWYgKCFkZXYtPnBvd2VyLmluX3N1c3BlbmQpCiAJCWRldi0+cG93ZXIuYXN5bmNfc3VzcGVuZCA9IHRydWU7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkZXZpY2VfZGlzYWJsZV9hc3luY19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlpZiAoZGV2LT5wb3dlci5zdGF0dXMgPT0gRFBNX09OKQorCWlmICghZGV2LT5wb3dlci5pbl9zdXNwZW5kKQogCQlkZXYtPnBvd2VyLmFzeW5jX3N1c3BlbmQgPSBmYWxzZTsKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9maXJld2lyZS5oIGIvaW5jbHVkZS9saW51eC9maXJld2lyZS5oCmluZGV4IDFjZDYzN2UuLjlhM2Y1ZjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZmlyZXdpcmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZpcmV3aXJlLmgKQEAgLTMwMiw5ICszMDIsOSBAQAogc3RydWN0IGZ3X3RyYW5zYWN0aW9uIHsKIAlpbnQgbm9kZV9pZDsgLyogVGhlIGdlbmVyYXRpb24gaXMgaW1wbGllZDsgaXQgaXMgYWx3YXlzIHRoZSBjdXJyZW50LiAqLwogCWludCB0bGFiZWw7Ci0JaW50IHRpbWVzdGFtcDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpbms7CiAJc3RydWN0IGZ3X2NhcmQgKmNhcmQ7CisJYm9vbCBpc19zcGxpdF90cmFuc2FjdGlvbjsKIAlzdHJ1Y3QgdGltZXJfbGlzdCBzcGxpdF90aW1lb3V0X3RpbWVyOwogCiAJc3RydWN0IGZ3X3BhY2tldCBwYWNrZXQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Zpcm13YXJlLW1hcC5oIGIvaW5jbHVkZS9saW51eC9maXJtd2FyZS1tYXAuaAppbmRleCBjNmRjYzFkLi40M2ZlNTJmYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9maXJtd2FyZS1tYXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Zpcm13YXJlLW1hcC5oCkBAIC0xNyw3ICsxNyw2IEBACiAjZGVmaW5lIF9MSU5VWF9GSVJNV0FSRV9NQVBfSAogCiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KIAogLyoKICAqIHByb3ZpZGUgYSBkdW1teSBpbnRlcmZhY2UgaWYgQ09ORklHX0ZJUk1XQVJFX01FTU1BUCBpcyBkaXNhYmxlZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mbGV4X2FycmF5LmggYi9pbmNsdWRlL2xpbnV4L2ZsZXhfYXJyYXkuaAppbmRleCA2MzFiNzdmLi43MGU0ZWZhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZsZXhfYXJyYXkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZsZXhfYXJyYXkuaApAQCAtNzEsNyArNzEsNyBAQAogaW50IGZsZXhfYXJyYXlfc2hyaW5rKHN0cnVjdCBmbGV4X2FycmF5ICpmYSk7CiAKICNkZWZpbmUgZmxleF9hcnJheV9wdXRfcHRyKGZhLCBuciwgc3JjLCBnZnApIFwKLQlmbGV4X2FycmF5X3B1dChmYSwgbnIsICYodm9pZCAqKShzcmMpLCBnZnApCisJZmxleF9hcnJheV9wdXQoZmEsIG5yLCAodm9pZCAqKSYoc3JjKSwgZ2ZwKQogCiB2b2lkICpmbGV4X2FycmF5X2dldF9wdHIoc3RydWN0IGZsZXhfYXJyYXkgKmZhLCB1bnNpZ25lZCBpbnQgZWxlbWVudF9ucik7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnMuaCBiL2luY2x1ZGUvbGludXgvZnMuaAppbmRleCBiYWYzZTU1Li5mODRkOTkyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9mcy5oCkBAIC0zODIsNyArMzgyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9wYXRoLmg+CiAjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+Ci0jaW5jbHVkZSA8bGludXgva29iamVjdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9yYWRpeC10cmVlLmg+CiAjaW5jbHVkZSA8bGludXgvcHJpb190cmVlLmg+CkBAIC00MDIsNiArNDAxLDcgQEAKIHN0cnVjdCBpb3ZlYzsKIHN0cnVjdCBuYW1laWRhdGE7CiBzdHJ1Y3Qga2lvY2I7CitzdHJ1Y3Qga29iamVjdDsKIHN0cnVjdCBwaXBlX2lub2RlX2luZm87CiBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3Q7CiBzdHJ1Y3Qga3N0YXRmczsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnVzZS5oIGIvaW5jbHVkZS9saW51eC9mdXNlLmgKaW5kZXggYzNjNTc4ZS4uZDQ2NGRlNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mdXNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9mdXNlLmgKQEAgLTQxLDYgKzQxLDEyIEBACiAgKiA3LjE1CiAgKiAgLSBhZGQgc3RvcmUgbm90aWZ5CiAgKiAgLSBhZGQgcmV0cmlldmUgbm90aWZ5CisgKgorICogNy4xNgorICogIC0gYWRkIEJBVENIX0ZPUkdFVCByZXF1ZXN0CisgKiAgLSBGVVNFX0lPQ1RMX1VOUkVTVFJJQ1RFRCBzaGFsbCBub3cgcmV0dXJuIHdpdGggYXJyYXkgb2YgJ3N0cnVjdAorICogICAgZnVzZV9pb2N0bF9pb3ZlYycgaW5zdGVhZCBvZiBhbWJpZ3VvdXMgJ3N0cnVjdCBpb3ZlYycKKyAqICAtIGFkZCBGVVNFX0lPQ1RMXzMyQklUIGZsYWcKICAqLwogCiAjaWZuZGVmIF9MSU5VWF9GVVNFX0gKQEAgLTcyLDcgKzc4LDcgQEAKICNkZWZpbmUgRlVTRV9LRVJORUxfVkVSU0lPTiA3CiAKIC8qKiBNaW5vciB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIGludGVyZmFjZSAqLwotI2RlZmluZSBGVVNFX0tFUk5FTF9NSU5PUl9WRVJTSU9OIDE1CisjZGVmaW5lIEZVU0VfS0VSTkVMX01JTk9SX1ZFUlNJT04gMTYKIAogLyoqIFRoZSBub2RlIElEIG9mIHRoZSByb290IGlub2RlICovCiAjZGVmaW5lIEZVU0VfUk9PVF9JRCAxCkBAIC0yMDAsMTIgKzIwNiwxNCBAQAogICogRlVTRV9JT0NUTF9DT01QQVQ6IDMyYml0IGNvbXBhdCBpb2N0bCBvbiA2NGJpdCBtYWNoaW5lCiAgKiBGVVNFX0lPQ1RMX1VOUkVTVFJJQ1RFRDogbm90IHJlc3RyaWN0ZWQgdG8gd2VsbC1mb3JtZWQgaW9jdGxzLCByZXRyeSBhbGxvd2VkCiAgKiBGVVNFX0lPQ1RMX1JFVFJZOiByZXRyeSB3aXRoIG5ldyBpb3ZlY3MKKyAqIEZVU0VfSU9DVExfMzJCSVQ6IDMyYml0IGlvY3RsCiAgKgogICogRlVTRV9JT0NUTF9NQVhfSU9WOiBtYXhpbXVtIG9mIGluX2lvdmVjcyArIG91dF9pb3ZlY3MKICAqLwogI2RlZmluZSBGVVNFX0lPQ1RMX0NPTVBBVAkoMSA8PCAwKQogI2RlZmluZSBGVVNFX0lPQ1RMX1VOUkVTVFJJQ1RFRAkoMSA8PCAxKQogI2RlZmluZSBGVVNFX0lPQ1RMX1JFVFJZCSgxIDw8IDIpCisjZGVmaW5lIEZVU0VfSU9DVExfMzJCSVQJKDEgPDwgMykKIAogI2RlZmluZSBGVVNFX0lPQ1RMX01BWF9JT1YJMjU2CiAKQEAgLTI1Niw2ICsyNjQsNyBAQAogCUZVU0VfSU9DVEwgICAgICAgICA9IDM5LAogCUZVU0VfUE9MTCAgICAgICAgICA9IDQwLAogCUZVU0VfTk9USUZZX1JFUExZICA9IDQxLAorCUZVU0VfQkFUQ0hfRk9SR0VUICA9IDQyLAogCiAJLyogQ1VTRSBzcGVjaWZpYyBvcGVyYXRpb25zICovCiAJQ1VTRV9JTklUICAgICAgICAgID0gNDA5NiwKQEAgLTI5MCw2ICsyOTksMTYgQEAKIAlfX3U2NAlubG9va3VwOwogfTsKIAorc3RydWN0IGZ1c2VfZm9yZ2V0X29uZSB7CisJX191NjQJbm9kZWlkOworCV9fdTY0CW5sb29rdXA7Cit9OworCitzdHJ1Y3QgZnVzZV9iYXRjaF9mb3JnZXRfaW4geworCV9fdTMyCWNvdW50OworCV9fdTMyCWR1bW15OworfTsKKwogc3RydWN0IGZ1c2VfZ2V0YXR0cl9pbiB7CiAJX191MzIJZ2V0YXR0cl9mbGFnczsKIAlfX3UzMglkdW1teTsKQEAgLTUxMCw2ICs1MjksMTEgQEAKIAlfX3UzMglvdXRfc2l6ZTsKIH07CiAKK3N0cnVjdCBmdXNlX2lvY3RsX2lvdmVjIHsKKwlfX3U2NAliYXNlOworCV9fdTY0CWxlbjsKK307CisKIHN0cnVjdCBmdXNlX2lvY3RsX291dCB7CiAJX19zMzIJcmVzdWx0OwogCV9fdTMyCWZsYWdzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9oaWQuaCBiL2luY2x1ZGUvbGludXgvaGlkLmgKaW5kZXggYmIwZjU2Zi4uMjBiOTgwMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9oaWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2hpZC5oCkBAIC04MjAsNiArODIwLDQ5IEBACiAJaGRldi0+bGxfZHJpdmVyLT5zdG9wKGhkZXYpOwogfQogCisvKioKKyAqIGhpZF9od19vcGVuIC0gc2lnbmFsIHVuZGVybGF5aW5nIEhXIHRvIHN0YXJ0IGRlbGl2ZXJpbmcgZXZlbnRzCisgKgorICogQGhkZXY6IGhpZCBkZXZpY2UKKyAqCisgKiBUZWxsIHVuZGVybHlpbmcgSFcgdG8gc3RhcnQgZGVsaXZlcmluZyBldmVudHMgZnJvbSB0aGUgZGV2aWNlLgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHNvbWV0aW1lIGFmdGVyIHN1Y2Nlc3NmdWwgY2FsbAorICogdG8gaGlkX2hpd19zdGFydCgpLgorICovCitzdGF0aWMgaW5saW5lIGludCBfX211c3RfY2hlY2sgaGlkX2h3X29wZW4oc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYpCit7CisJcmV0dXJuIGhkZXYtPmxsX2RyaXZlci0+b3BlbihoZGV2KTsKK30KKworLyoqCisgKiBoaWRfaHdfY2xvc2UgLSBzaWduYWwgdW5kZXJsYXlpbmcgSFcgdG8gc3RvcCBkZWxpdmVyaW5nIGV2ZW50cworICoKKyAqIEBoZGV2OiBoaWQgZGV2aWNlCisgKgorICogVGhpcyBmdW5jdGlvbiBpbmRpY2F0ZXMgdGhhdCB3ZSBhcmUgbm90IGludGVyZXN0ZWQgaW4gdGhlIGV2ZW50cworICogZnJvbSB0aGlzIGRldmljZSBhbnltb3JlLiBEZWxpdmVyeSBvZiBldmVudHMgbWF5IG9yIG1heSBub3Qgc3RvcCwKKyAqIGRlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mIHVzZXJzIHN0aWxsIG91dHN0YW5kaW5nLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaGlkX2h3X2Nsb3NlKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2KQoreworCWhkZXYtPmxsX2RyaXZlci0+Y2xvc2UoaGRldik7Cit9CisKKy8qKgorICogaGlkX2h3X3Bvd2VyIC0gcmVxdWVzdHMgdW5kZXJseWluZyBIVyB0byBnbyBpbnRvIGdpdmVuIHBvd2VyIG1vZGUKKyAqCisgKiBAaGRldjogaGlkIGRldmljZQorICogQGxldmVsOiByZXF1ZXN0ZWQgcG93ZXIgbGV2ZWwgKG9uZSBvZiAlUE1fSElOVF8qIGRlZmluZXMpCisgKgorICogVGhpcyBmdW5jdGlvbiByZXF1ZXN0cyB1bmRlcmx5aW5nIGhhcmR3YXJlIHRvIGVudGVyIHJlcXVlc3RlZCBwb3dlcgorICogbW9kZS4KKyAqLworCitzdGF0aWMgaW5saW5lIGludCBoaWRfaHdfcG93ZXIoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIGludCBsZXZlbCkKK3sKKwlyZXR1cm4gaGRldi0+bGxfZHJpdmVyLT5wb3dlciA/IGhkZXYtPmxsX2RyaXZlci0+cG93ZXIoaGRldiwgbGV2ZWwpIDogMDsKK30KKwogdm9pZCBoaWRfcmVwb3J0X3Jhd19ldmVudChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkLCBpbnQgdHlwZSwgdTggKmRhdGEsIGludCBzaXplLAogCQlpbnQgaW50ZXJydXB0KTsKIApAQCAtODM4LDEyICs4ODEsMzIgQEAKICNkZWZpbmUgaGlkX3BpZGZmX2luaXQgTlVMTAogI2VuZGlmCiAKLSNkZWZpbmUgZGJnX2hpZChmb3JtYXQsIGFyZy4uLikgaWYgKGhpZF9kZWJ1ZykgXAotCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogIiBmb3JtYXQgLFwKLQkJCQlfX0ZJTEVfXyAsICMjIGFyZykKLSNkZWZpbmUgZXJyX2hpZChmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fRVJSICIlczogIiBmb3JtYXQgIlxuIiAsIFwKLQkJX19GSUxFX18gLCAjIyBhcmcpCi0jZW5kaWYgLyogSElEX0ZGICovCisjZGVmaW5lIGRiZ19oaWQoZm9ybWF0LCBhcmcuLi4pCQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlpZiAoaGlkX2RlYnVnKQkJCQkJCQlcCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogIiBmb3JtYXQsIF9fRklMRV9fLCAjI2FyZyk7CVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgaGlkX3ByaW50ayhsZXZlbCwgaGlkLCBmbXQsIGFyZy4uLikJCVwKKwlkZXZfcHJpbnRrKGxldmVsLCAmKGhpZCktPmRldiwgZm10LCAjI2FyZykKKyNkZWZpbmUgaGlkX2VtZXJnKGhpZCwgZm10LCBhcmcuLi4pCQkJXAorCWRldl9lbWVyZygmKGhpZCktPmRldiwgZm10LCAjI2FyZykKKyNkZWZpbmUgaGlkX2NyaXQoaGlkLCBmbXQsIGFyZy4uLikJCQlcCisJZGV2X2NyaXQoJihoaWQpLT5kZXYsIGZtdCwgIyNhcmcpCisjZGVmaW5lIGhpZF9hbGVydChoaWQsIGZtdCwgYXJnLi4uKQkJCVwKKwlkZXZfYWxlcnQoJihoaWQpLT5kZXYsIGZtdCwgIyNhcmcpCisjZGVmaW5lIGhpZF9lcnIoaGlkLCBmbXQsIGFyZy4uLikJCQlcCisJZGV2X2VycigmKGhpZCktPmRldiwgZm10LCAjI2FyZykKKyNkZWZpbmUgaGlkX25vdGljZShoaWQsIGZtdCwgYXJnLi4uKQkJCVwKKwlkZXZfbm90aWNlKCYoaGlkKS0+ZGV2LCBmbXQsICMjYXJnKQorI2RlZmluZSBoaWRfd2FybihoaWQsIGZtdCwgYXJnLi4uKQkJCVwKKwlkZXZfd2FybigmKGhpZCktPmRldiwgZm10LCAjI2FyZykKKyNkZWZpbmUgaGlkX2luZm8oaGlkLCBmbXQsIGFyZy4uLikJCQlcCisJZGV2X2luZm8oJihoaWQpLT5kZXYsIGZtdCwgIyNhcmcpCisjZGVmaW5lIGhpZF9kYmcoaGlkLCBmbXQsIGFyZy4uLikJCQlcCisJZGV2X2RiZygmKGhpZCktPmRldiwgZm10LCAjI2FyZykKKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaHJ0aW1lci5oIGIvaW5jbHVkZS9saW51eC9ocnRpbWVyLmgKaW5kZXggMzMwNTg2Zi4uZjM3NmRkYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ocnRpbWVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9ocnRpbWVyLmgKQEAgLTEzMSw3ICsxMzEsNiBAQAogICogQGluZGV4OgkJY2xvY2sgdHlwZSBpbmRleCBmb3IgcGVyX2NwdSBzdXBwb3J0IHdoZW4gbW92aW5nIGEKICAqCQkJdGltZXIgdG8gYSBiYXNlIG9uIGFub3RoZXIgY3B1LgogICogQGFjdGl2ZToJCXJlZCBibGFjayB0cmVlIHJvb3Qgbm9kZSBmb3IgdGhlIGFjdGl2ZSB0aW1lcnMKLSAqIEBmaXJzdDoJCXBvaW50ZXIgdG8gdGhlIHRpbWVyIG5vZGUgd2hpY2ggZXhwaXJlcyBmaXJzdAogICogQHJlc29sdXRpb246CQl0aGUgcmVzb2x1dGlvbiBvZiB0aGUgY2xvY2ssIGluIG5hbm9zZWNvbmRzCiAgKiBAZ2V0X3RpbWU6CQlmdW5jdGlvbiB0byByZXRyaWV2ZSB0aGUgY3VycmVudCB0aW1lIG9mIHRoZSBjbG9jawogICogQHNvZnRpcnFfdGltZToJdGhlIHRpbWUgd2hlbiBydW5uaW5nIHRoZSBocnRpbWVyIHF1ZXVlIGluIHRoZSBzb2Z0aXJxCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2kyYy9kczYyMC5oIGIvaW5jbHVkZS9saW51eC9pMmMvZHM2MjAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzZiYjg3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9pMmMvZHM2MjAuaApAQCAtMCwwICsxLDIxIEBACisjaWZuZGVmIF9MSU5VWF9EUzYyMF9ICisjZGVmaW5lIF9MSU5VWF9EUzYyMF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorCisvKiBwbGF0Zm9ybSBkYXRhIGZvciB0aGUgRFM2MjAgdGVtcGVyYXR1cmUgc2Vuc29yIGFuZCB0aGVybW9zdGF0ICovCisKK3N0cnVjdCBkczYyMF9wbGF0Zm9ybV9kYXRhIHsKKwkvKgorCSAqICBUaGVybW9zdGF0IG91dHB1dCBwaW4gUE8gbW9kZToKKwkgKiAgMCA9IGFsd2F5cyBsb3cgKGRlZmF1bHQpCisJICogIDEgPSBQT19MT1cKKwkgKiAgMiA9IFBPX0hJR0gKKwkgKgorCSAqIChzZWUgRG9jdW1lbnRhdGlvbi9od21vbi9kczYyMCkKKwkgKi8KKwlpbnQgcG9tb2RlOworfTsKKworI2VuZGlmIC8qIF9MSU5VWF9EUzYyMF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oIGIvaW5jbHVkZS9saW51eC9rZXJuZWwuaAppbmRleCBiNmRlOWE2Li5kMGZiYzA0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCisrKyBiL2luY2x1ZGUvbGludXgva2VybmVsLmgKQEAgLTU2LDYgKzU2LDggQEAKIAogI2RlZmluZSBGSUVMRF9TSVpFT0YodCwgZikgKHNpemVvZigoKHQqKTApLT5mKSkKICNkZWZpbmUgRElWX1JPVU5EX1VQKG4sZCkgKCgobikgKyAoZCkgLSAxKSAvIChkKSkKKworLyogVGhlIGBjb25zdCcgaW4gcm91bmR1cCgpIHByZXZlbnRzIGdjYy0zLjMgZnJvbSBjYWxsaW5nIF9fZGl2ZGkzICovCiAjZGVmaW5lIHJvdW5kdXAoeCwgeSkgKAkJCQkJXAogewkJCQkJCQlcCiAJY29uc3QgdHlwZW9mKHkpIF9feSA9IHk7CQkJXApAQCAtMjYzLDYgKzI2NSw3IEBACiB9CiAKIGV4dGVybiBpbnQgaGV4X3RvX2JpbihjaGFyIGNoKTsKK2V4dGVybiB2b2lkIGhleDJiaW4odTggKmRzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3QgY291bnQpOwogCiAvKgogICogR2VuZXJhbCB0cmFjaW5nIHJlbGF0ZWQgdXRpbGl0eSBmdW5jdGlvbnMgLSB0cmFjZV9wcmludGsoKSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbGliYXRhLmggYi9pbmNsdWRlL2xpbnV4L2xpYmF0YS5oCmluZGV4IGQ5NDdiMTIuLmM5YzVkN2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbGliYXRhLmgKKysrIGIvaW5jbHVkZS9saW51eC9saWJhdGEuaApAQCAtOTk2LDggKzk5Niw3IEBACiBleHRlcm4gaW50IGF0YV9zYXNfcG9ydF9zdGFydChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIGV4dGVybiB2b2lkIGF0YV9zYXNfcG9ydF9zdG9wKHN0cnVjdCBhdGFfcG9ydCAqYXApOwogZXh0ZXJuIGludCBhdGFfc2FzX3NsYXZlX2NvbmZpZ3VyZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiwgc3RydWN0IGF0YV9wb3J0ICopOwotZXh0ZXJuIGludCBhdGFfc2FzX3F1ZXVlY21kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKiksCi0JCQkgICAgc3RydWN0IGF0YV9wb3J0ICphcCk7CitleHRlcm4gaW50IGF0YV9zYXNfcXVldWVjbWQoc3RydWN0IHNjc2lfY21uZCAqY21kLCBzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIGV4dGVybiBpbnQgc2F0YV9zY3JfdmFsaWQoc3RydWN0IGF0YV9saW5rICpsaW5rKTsKIGV4dGVybiBpbnQgc2F0YV9zY3JfcmVhZChzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIGludCByZWcsIHUzMiAqdmFsKTsKIGV4dGVybiBpbnQgc2F0YV9zY3Jfd3JpdGUoc3RydWN0IGF0YV9saW5rICpsaW5rLCBpbnQgcmVnLCB1MzIgdmFsKTsKQEAgLTEwNDAsOCArMTAzOSw3IEBACiAJCQkJCXN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmLCB1MTYgKmlkKTsKIGV4dGVybiB2b2lkIGF0YV9xY19jb21wbGV0ZShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKIGV4dGVybiBpbnQgYXRhX3FjX2NvbXBsZXRlX211bHRpcGxlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHUzMiBxY19hY3RpdmUpOwotZXh0ZXJuIHZvaWQgYXRhX3Njc2lfc2ltdWxhdGUoc3RydWN0IGF0YV9kZXZpY2UgKmRldiwgc3RydWN0IHNjc2lfY21uZCAqY21kLAotCQkJICAgICAgdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpOworZXh0ZXJuIHZvaWQgYXRhX3Njc2lfc2ltdWxhdGUoc3RydWN0IGF0YV9kZXZpY2UgKmRldiwgc3RydWN0IHNjc2lfY21uZCAqY21kKTsKIGV4dGVybiBpbnQgYXRhX3N0ZF9iaW9zX3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwKIAkJCSAgICAgIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCiAJCQkgICAgICBzZWN0b3JfdCBjYXBhY2l0eSwgaW50IGdlb21bXSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L29mX2FkZHJlc3MuaCBiL2luY2x1ZGUvbGludXgvb2ZfYWRkcmVzcy5oCmluZGV4IDhhZWEwNmYuLjJmZWRhNmVlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L29mX2FkZHJlc3MuaAorKysgYi9pbmNsdWRlL2xpbnV4L29mX2FkZHJlc3MuaApAQCAtMyw3ICszLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogCi1leHRlcm4gdTY0IG9mX3RyYW5zbGF0ZV9hZGRyZXNzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGNvbnN0IHUzMiAqYWRkcik7CitleHRlcm4gdTY0IG9mX3RyYW5zbGF0ZV9hZGRyZXNzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGNvbnN0IF9fYmUzMiAqYWRkcik7CiBleHRlcm4gaW50IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGludCBpbmRleCwKIAkJCQkgIHN0cnVjdCByZXNvdXJjZSAqcik7CiBleHRlcm4gdm9pZCBfX2lvbWVtICpvZl9pb21hcChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldmljZSwgaW50IGluZGV4KTsKQEAgLTIxLDcgKzIxLDcgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BDSQotZXh0ZXJuIGNvbnN0IHUzMiAqb2ZfZ2V0X3BjaV9hZGRyZXNzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBpbnQgYmFyX25vLAorZXh0ZXJuIGNvbnN0IF9fYmUzMiAqb2ZfZ2V0X3BjaV9hZGRyZXNzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBpbnQgYmFyX25vLAogCQkJICAgICAgIHU2NCAqc2l6ZSwgdW5zaWduZWQgaW50ICpmbGFncyk7CiBleHRlcm4gaW50IG9mX3BjaV9hZGRyZXNzX3RvX3Jlc291cmNlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBpbnQgYmFyLAogCQkJCSAgICAgIHN0cnVjdCByZXNvdXJjZSAqcik7CkBAIC0zMiw3ICszMiw3IEBACiAJcmV0dXJuIC1FTk9TWVM7CiB9CiAKLXN0YXRpYyBpbmxpbmUgY29uc3QgdTMyICpvZl9nZXRfcGNpX2FkZHJlc3Moc3RydWN0IGRldmljZV9ub2RlICpkZXYsCitzdGF0aWMgaW5saW5lIGNvbnN0IF9fYmUzMiAqb2ZfZ2V0X3BjaV9hZGRyZXNzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LAogCQlpbnQgYmFyX25vLCB1NjQgKnNpemUsIHVuc2lnbmVkIGludCAqZmxhZ3MpCiB7CiAJcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L29mX2ZkdC5oIGIvaW5jbHVkZS9saW51eC9vZl9mZHQuaAppbmRleCA3YmJmNWIzLi4wZWYyMmExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L29mX2ZkdC5oCisrKyBiL2luY2x1ZGUvbGludXgvb2ZfZmR0LmgKQEAgLTU4LDYgKzU4LDIzIEBACiB9OwogCiAjaWYgZGVmaW5lZChDT05GSUdfT0ZfRkxBVFRSRUUpCisKK3N0cnVjdCBkZXZpY2Vfbm9kZTsKKworLyogRm9yIHNjYW5uaW5nIGFuIGFyYml0cmFyeSBkZXZpY2UtdHJlZSBhdCBhbnkgdGltZSAqLworZXh0ZXJuIGNoYXIgKm9mX2ZkdF9nZXRfc3RyaW5nKHN0cnVjdCBib290X3BhcmFtX2hlYWRlciAqYmxvYiwgdTMyIG9mZnNldCk7CitleHRlcm4gdm9pZCAqb2ZfZmR0X2dldF9wcm9wZXJ0eShzdHJ1Y3QgYm9vdF9wYXJhbV9oZWFkZXIgKmJsb2IsCisJCQkJIHVuc2lnbmVkIGxvbmcgbm9kZSwKKwkJCQkgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgdW5zaWduZWQgbG9uZyAqc2l6ZSk7CitleHRlcm4gaW50IG9mX2ZkdF9pc19jb21wYXRpYmxlKHN0cnVjdCBib290X3BhcmFtX2hlYWRlciAqYmxvYiwKKwkJCQl1bnNpZ25lZCBsb25nIG5vZGUsCisJCQkJY29uc3QgY2hhciAqY29tcGF0KTsKK2V4dGVybiBpbnQgb2ZfZmR0X21hdGNoKHN0cnVjdCBib290X3BhcmFtX2hlYWRlciAqYmxvYiwgdW5zaWduZWQgbG9uZyBub2RlLAorCQkJY29uc3QgY2hhciAqKmNvbXBhdCk7CitleHRlcm4gdm9pZCBvZl9mZHRfdW5mbGF0dGVuX3RyZWUodW5zaWduZWQgbG9uZyAqYmxvYiwKKwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKipteW5vZGVzKTsKKwogLyogVEJEOiBUZW1wb3JhcnkgZXhwb3J0IG9mIGZkdCBnbG9iYWxzIC0gcmVtb3ZlIHdoZW4gY29kZSBmdWxseSBtZXJnZWQgKi8KIGV4dGVybiBpbnQgX19pbml0ZGF0YSBkdF9yb290X2FkZHJfY2VsbHM7CiBleHRlcm4gaW50IF9faW5pdGRhdGEgZHRfcm9vdF9zaXplX2NlbGxzOwpAQCAtNzEsNiArODgsNyBAQAogZXh0ZXJuIHZvaWQgKm9mX2dldF9mbGF0X2R0X3Byb3AodW5zaWduZWQgbG9uZyBub2RlLCBjb25zdCBjaGFyICpuYW1lLAogCQkJCSB1bnNpZ25lZCBsb25nICpzaXplKTsKIGV4dGVybiBpbnQgb2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHVuc2lnbmVkIGxvbmcgbm9kZSwgY29uc3QgY2hhciAqbmFtZSk7CitleHRlcm4gaW50IG9mX2ZsYXRfZHRfbWF0Y2godW5zaWduZWQgbG9uZyBub2RlLCBjb25zdCBjaGFyICoqbWF0Y2hlcyk7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBvZl9nZXRfZmxhdF9kdF9yb290KHZvaWQpOwogCiBleHRlcm4gaW50IGVhcmx5X2luaXRfZHRfc2Nhbl9jaG9zZW4odW5zaWduZWQgbG9uZyBub2RlLCBjb25zdCBjaGFyICp1bmFtZSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvb2ZfbmV0LmggYi9pbmNsdWRlL2xpbnV4L29mX25ldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MTMwODEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L29mX25ldC5oCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisgKiBPRiBoZWxwZXJzIGZvciBuZXR3b3JrIGRldmljZXMuCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MgorICovCisKKyNpZm5kZWYgX19MSU5VWF9PRl9ORVRfSAorI2RlZmluZSBfX0xJTlVYX09GX05FVF9ICisKKyNpZmRlZiBDT05GSUdfT0ZfTkVUCisjaW5jbHVkZSA8bGludXgvb2YuaD4KK2V4dGVybiBjb25zdCB2b2lkICpvZl9nZXRfbWFjX2FkZHJlc3Moc3RydWN0IGRldmljZV9ub2RlICpucCk7CisjZW5kaWYKKworI2VuZGlmIC8qIF9fTElOVVhfT0ZfTkVUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGlwZV9mc19pLmggYi9pbmNsdWRlL2xpbnV4L3BpcGVfZnNfaS5oCmluZGV4IGJiMjdkN2UuLjc3MjU3YzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGlwZV9mc19pLmgKKysrIGIvaW5jbHVkZS9saW51eC9waXBlX2ZzX2kuaApAQCAtMzAsNiArMzAsNyBAQAogICoJc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAtIGEgbGludXgga2VybmVsIHBpcGUKICAqCUB3YWl0OiByZWFkZXIvd3JpdGVyIHdhaXQgcG9pbnQgaW4gY2FzZSBvZiBlbXB0eS9mdWxsIHBpcGUKICAqCUBucmJ1ZnM6IHRoZSBudW1iZXIgb2Ygbm9uLWVtcHR5IHBpcGUgYnVmZmVycyBpbiB0aGlzIHBpcGUKKyAqCUBidWZmZXJzOiB0b3RhbCBudW1iZXIgb2YgYnVmZmVycyAoc2hvdWxkIGJlIGEgcG93ZXIgb2YgMikKICAqCUBjdXJidWY6IHRoZSBjdXJyZW50IHBpcGUgYnVmZmVyIGVudHJ5CiAgKglAdG1wX3BhZ2U6IGNhY2hlZCByZWxlYXNlZCBwYWdlCiAgKglAcmVhZGVyczogbnVtYmVyIG9mIGN1cnJlbnQgcmVhZGVycyBvZiB0aGlzIHBpcGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcG0uaCBiL2luY2x1ZGUvbGludXgvcG0uaAppbmRleCA0MGYzZjQ1Li5kZDljN2FiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BtLmgKKysrIGIvaW5jbHVkZS9saW51eC9wbS5oCkBAIC0zNjcsNDUgKzM2Nyw2IEBACiAJCQkJCXsgLmV2ZW50ID0gUE1fRVZFTlRfQVVUT19SRVNVTUUsIH0pCiAKIC8qKgotICogRGV2aWNlIHBvd2VyIG1hbmFnZW1lbnQgc3RhdGVzCi0gKgotICogVGhlc2Ugc3RhdGUgbGFiZWxzIGFyZSB1c2VkIGludGVybmFsbHkgYnkgdGhlIFBNIGNvcmUgdG8gaW5kaWNhdGUgdGhlIGN1cnJlbnQKLSAqIHN0YXR1cyBvZiBhIGRldmljZSB3aXRoIHJlc3BlY3QgdG8gdGhlIFBNIGNvcmUgb3BlcmF0aW9ucy4KLSAqCi0gKiBEUE1fT04JCURldmljZSBpcyByZWdhcmRlZCBhcyBvcGVyYXRpb25hbC4gIFNldCB0aGlzIHdheQotICoJCQlpbml0aWFsbHkgYW5kIHdoZW4gLT5jb21wbGV0ZSgpIGlzIGFib3V0IHRvIGJlIGNhbGxlZC4KLSAqCQkJQWxzbyBzZXQgd2hlbiAtPnByZXBhcmUoKSBmYWlscy4KLSAqCi0gKiBEUE1fUFJFUEFSSU5HCURldmljZSBpcyBnb2luZyB0byBiZSBwcmVwYXJlZCBmb3IgYSBQTSB0cmFuc2l0aW9uLiAgU2V0Ci0gKgkJCXdoZW4gLT5wcmVwYXJlKCkgaXMgYWJvdXQgdG8gYmUgY2FsbGVkLgotICoKLSAqIERQTV9SRVNVTUlORwkJRGV2aWNlIGlzIGdvaW5nIHRvIGJlIHJlc3VtZWQuICBTZXQgd2hlbiAtPnJlc3VtZSgpLAotICoJCQktPnRoYXcoKSwgb3IgLT5yZXN0b3JlKCkgaXMgYWJvdXQgdG8gYmUgY2FsbGVkLgotICoKLSAqIERQTV9TVVNQRU5ESU5HCURldmljZSBoYXMgYmVlbiBwcmVwYXJlZCBmb3IgYSBwb3dlciB0cmFuc2l0aW9uLiAgU2V0Ci0gKgkJCXdoZW4gLT5wcmVwYXJlKCkgaGFzIGp1c3Qgc3VjY2VlZGVkLgotICoKLSAqIERQTV9PRkYJCURldmljZSBpcyByZWdhcmRlZCBhcyBpbmFjdGl2ZS4gIFNldCBpbW1lZGlhdGVseSBhZnRlcgotICoJCQktPnN1c3BlbmQoKSwgLT5mcmVlemUoKSwgb3IgLT5wb3dlcm9mZigpIGhhcyBzdWNjZWVkZWQuCi0gKgkJCUFsc28gc2V0IHdoZW4gLT5yZXN1bWUoKV9ub2lycSwgLT50aGF3X25vaXJxKCksIG9yCi0gKgkJCS0+cmVzdG9yZV9ub2lycSgpIGlzIGFib3V0IHRvIGJlIGNhbGxlZC4KLSAqCi0gKiBEUE1fT0ZGX0lSUQkJRGV2aWNlIGlzIGluIGEgImRlZXAgc2xlZXAiLiAgU2V0IGltbWVkaWF0ZWx5IGFmdGVyCi0gKgkJCS0+c3VzcGVuZF9ub2lycSgpLCAtPmZyZWV6ZV9ub2lycSgpLCBvcgotICoJCQktPnBvd2Vyb2ZmX25vaXJxKCkgaGFzIGp1c3Qgc3VjY2VlZGVkLgotICovCi0KLWVudW0gZHBtX3N0YXRlIHsKLQlEUE1fSU5WQUxJRCwKLQlEUE1fT04sCi0JRFBNX1BSRVBBUklORywKLQlEUE1fUkVTVU1JTkcsCi0JRFBNX1NVU1BFTkRJTkcsCi0JRFBNX09GRiwKLQlEUE1fT0ZGX0lSUSwKLX07Ci0KLS8qKgogICogRGV2aWNlIHJ1bi10aW1lIHBvd2VyIG1hbmFnZW1lbnQgc3RhdHVzLgogICoKICAqIFRoZXNlIHN0YXR1cyBsYWJlbHMgYXJlIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgUE0gY29yZSB0byBpbmRpY2F0ZSB0aGUKQEAgLTQ2Myw4ICs0MjQsOCBAQAogc3RydWN0IGRldl9wbV9pbmZvIHsKIAlwbV9tZXNzYWdlX3QJCXBvd2VyX3N0YXRlOwogCXVuc2lnbmVkIGludAkJY2FuX3dha2V1cDoxOwotCXVuc2lnbmVkCQlhc3luY19zdXNwZW5kOjE7Ci0JZW51bSBkcG1fc3RhdGUJCXN0YXR1czsJCS8qIE93bmVkIGJ5IHRoZSBQTSBjb3JlICovCisJdW5zaWduZWQgaW50CQlhc3luY19zdXNwZW5kOjE7CisJdW5zaWduZWQgaW50CQlpbl9zdXNwZW5kOjE7CS8qIE93bmVkIGJ5IHRoZSBQTSBjb3JlICovCiAJc3BpbmxvY2tfdAkJbG9jazsKICNpZmRlZiBDT05GSUdfUE1fU0xFRVAKIAlzdHJ1Y3QgbGlzdF9oZWFkCWVudHJ5OwpAQCAtNDg2LDYgKzQ0Nyw3IEBACiAJdW5zaWduZWQgaW50CQlydW5fd2FrZToxOwogCXVuc2lnbmVkIGludAkJcnVudGltZV9hdXRvOjE7CiAJdW5zaWduZWQgaW50CQlub19jYWxsYmFja3M6MTsKKwl1bnNpZ25lZCBpbnQJCWlycV9zYWZlOjE7CiAJdW5zaWduZWQgaW50CQl1c2VfYXV0b3N1c3BlbmQ6MTsKIAl1bnNpZ25lZCBpbnQJCXRpbWVyX2F1dG9zdXNwZW5kczoxOwogCWVudW0gcnBtX3JlcXVlc3QJcmVxdWVzdDsKQEAgLTYxMCw0ICs1NzIsMTEgQEAKICNkZWZpbmUgUE1fQVBNCTEKICNkZWZpbmUgUE1fQUNQSQkyCiAKK2V4dGVybiBpbnQgcG1fZ2VuZXJpY19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldik7CitleHRlcm4gaW50IHBtX2dlbmVyaWNfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldik7CitleHRlcm4gaW50IHBtX2dlbmVyaWNfZnJlZXplKHN0cnVjdCBkZXZpY2UgKmRldik7CitleHRlcm4gaW50IHBtX2dlbmVyaWNfdGhhdyhzdHJ1Y3QgZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCBwbV9nZW5lcmljX3Jlc3RvcmUoc3RydWN0IGRldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgcG1fZ2VuZXJpY19wb3dlcm9mZihzdHJ1Y3QgZGV2aWNlICpkZXYpOworCiAjZW5kaWYgLyogX0xJTlVYX1BNX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcG1fcnVudGltZS5oIGIvaW5jbHVkZS9saW51eC9wbV9ydW50aW1lLmgKaW5kZXggZDE5ZjFjYy4uZDM0ZjA2NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wbV9ydW50aW1lLmgKKysrIGIvaW5jbHVkZS9saW51eC9wbV9ydW50aW1lLmgKQEAgLTQwLDYgKzQwLDcgQEAKIGV4dGVybiBpbnQgcG1fZ2VuZXJpY19ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KTsKIGV4dGVybiBpbnQgcG1fZ2VuZXJpY19ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwogZXh0ZXJuIHZvaWQgcG1fcnVudGltZV9ub19jYWxsYmFja3Moc3RydWN0IGRldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIHBtX3J1bnRpbWVfaXJxX3NhZmUoc3RydWN0IGRldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIF9fcG1fcnVudGltZV91c2VfYXV0b3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBib29sIHVzZSk7CiBleHRlcm4gdm9pZCBwbV9ydW50aW1lX3NldF9hdXRvc3VzcGVuZF9kZWxheShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBkZWxheSk7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBwbV9ydW50aW1lX2F1dG9zdXNwZW5kX2V4cGlyYXRpb24oc3RydWN0IGRldmljZSAqZGV2KTsKQEAgLTgxLDYgKzgyLDExIEBACiAJCSYmICFkZXYtPnBvd2VyLmRpc2FibGVfZGVwdGg7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBwbV9ydW50aW1lX2VuYWJsZWQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiAhZGV2LT5wb3dlci5kaXNhYmxlX2RlcHRoOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJQUNDRVNTX09OQ0UoZGV2LT5wb3dlci5sYXN0X2J1c3kpID0gamlmZmllczsKQEAgLTExOSwxMSArMTI1LDEzIEBACiBzdGF0aWMgaW5saW5lIGJvb2wgZGV2aWNlX3J1bl93YWtlKHN0cnVjdCBkZXZpY2UgKmRldikgeyByZXR1cm4gZmFsc2U7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBkZXZpY2Vfc2V0X3J1bl93YWtlKHN0cnVjdCBkZXZpY2UgKmRldiwgYm9vbCBlbmFibGUpIHt9CiBzdGF0aWMgaW5saW5lIGJvb2wgcG1fcnVudGltZV9zdXNwZW5kZWQoc3RydWN0IGRldmljZSAqZGV2KSB7IHJldHVybiBmYWxzZTsgfQorc3RhdGljIGlubGluZSBib29sIHBtX3J1bnRpbWVfZW5hYmxlZChzdHJ1Y3QgZGV2aWNlICpkZXYpIHsgcmV0dXJuIGZhbHNlOyB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHBtX2dlbmVyaWNfcnVudGltZV9pZGxlKHN0cnVjdCBkZXZpY2UgKmRldikgeyByZXR1cm4gMDsgfQogc3RhdGljIGlubGluZSBpbnQgcG1fZ2VuZXJpY19ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KSB7IHJldHVybiAwOyB9CiBzdGF0aWMgaW5saW5lIGludCBwbV9nZW5lcmljX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikgeyByZXR1cm4gMDsgfQogc3RhdGljIGlubGluZSB2b2lkIHBtX3J1bnRpbWVfbm9fY2FsbGJhY2tzKHN0cnVjdCBkZXZpY2UgKmRldikge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBwbV9ydW50aW1lX2lycV9zYWZlKHN0cnVjdCBkZXZpY2UgKmRldikge30KIAogc3RhdGljIGlubGluZSB2b2lkIHBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3koc3RydWN0IGRldmljZSAqZGV2KSB7fQogc3RhdGljIGlubGluZSB2b2lkIF9fcG1fcnVudGltZV91c2VfYXV0b3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LApAQCAtMTk2LDYgKzIwNCwxMSBAQAogCXJldHVybiBfX3BtX3J1bnRpbWVfaWRsZShkZXYsIFJQTV9HRVRfUFVUKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgcG1fcnVudGltZV9wdXRfc3luY19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gX19wbV9ydW50aW1lX3N1c3BlbmQoZGV2LCBSUE1fR0VUX1BVVCk7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IHBtX3J1bnRpbWVfcHV0X3N5bmNfYXV0b3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewogCXJldHVybiBfX3BtX3J1bnRpbWVfc3VzcGVuZChkZXYsIFJQTV9HRVRfUFVUIHwgUlBNX0FVVE8pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yYXJfcmVnaXN0ZXIuaCBiL2luY2x1ZGUvbGludXgvcmFyX3JlZ2lzdGVyLmgKaW5kZXggZmZhODA1Ny4uNWM2MTE4MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yYXJfcmVnaXN0ZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3Jhcl9yZWdpc3Rlci5oCkBAIC0zNCwxMSArMzQsMjcgQEAKIAogc3RydWN0IHJhcl9kZXZpY2U7CiAKKyNpZiBkZWZpbmVkKENPTkZJR19SQVJfUkVHSVNURVIpCiBpbnQgcmVnaXN0ZXJfcmFyKGludCBudW0sCiAJCWludCAoKmNhbGxiYWNrKSh1bnNpZ25lZCBsb25nIGRhdGEpLCB1bnNpZ25lZCBsb25nIGRhdGEpOwogdm9pZCB1bnJlZ2lzdGVyX3JhcihpbnQgbnVtKTsKIGludCByYXJfZ2V0X2FkZHJlc3MoaW50IHJhcl9pbmRleCwgZG1hX2FkZHJfdCAqc3RhcnQsIGRtYV9hZGRyX3QgKmVuZCk7CiBpbnQgcmFyX2xvY2soaW50IHJhcl9pbmRleCk7CisjZWxzZQorZXh0ZXJuIHZvaWQgdW5yZWdpc3Rlcl9yYXIoaW50IG51bSkgIHsgfQorZXh0ZXJuIGludCByYXJfbG9jayhpbnQgcmFyX2luZGV4KSB7IHJldHVybiAtRUlPOyB9CisKK2V4dGVybiBpbmxpbmUgaW50IHJlZ2lzdGVyX3JhcihpbnQgbnVtLAorCQlpbnQgKCpjYWxsYmFjaykodW5zaWduZWQgbG9uZyBkYXRhKSwgdW5zaWduZWQgbG9uZyBkYXRhKQoreworCXJldHVybiAtRU5PREVWOworfQorCitleHRlcm4gaW50IHJhcl9nZXRfYWRkcmVzcyhpbnQgcmFyX2luZGV4LCBkbWFfYWRkcl90ICpzdGFydCwgZG1hX2FkZHJfdCAqZW5kKQoreworCXJldHVybiAtRU5PREVWOworfQorI2VuZGlmCS8qIFJBUl9SRUdJU1RFUiAqLwogCiAjZW5kaWYgIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAgLyogX1JBUl9SRUdJU1RFUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NjaGVkLmggYi9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKaW5kZXggMzQxYWNiYmMuLmFiYzUyN2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2NoZWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKQEAgLTcwLDcgKzcwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9zZW0uaD4KICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KLSNpbmNsdWRlIDxsaW51eC9wYXRoLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvcGlkLmg+CkBAIC04OCw3ICs4Nyw2IEBACiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvdGFza19pb19hY2NvdW50aW5nLmg+Ci0jaW5jbHVkZSA8bGludXgva29iamVjdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xhdGVuY3l0b3AuaD4KICNpbmNsdWRlIDxsaW51eC9jcmVkLmg+CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VjdXJpdHkuaCBiL2luY2x1ZGUvbGludXgvc2VjdXJpdHkuaAppbmRleCAxYWM0MjQ3NS4uYzY0MmJiOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZWN1cml0eS5oCisrKyBiL2luY2x1ZGUvbGludXgvc2VjdXJpdHkuaApAQCAtMTA1OCw4ICsxMDU4LDcgQEAKICAqCUBjcmVkIHBvaW50cyB0byB0aGUgY3JlZGVudGlhbHMgdG8gcHJvdmlkZSB0aGUgY29udGV4dCBhZ2FpbnN0IHdoaWNoIHRvCiAgKglldmFsdWF0ZSB0aGUgc2VjdXJpdHkgZGF0YSBvbiB0aGUga2V5LgogICoJQHBlcm0gZGVzY3JpYmVzIHRoZSBjb21iaW5hdGlvbiBvZiBwZXJtaXNzaW9ucyByZXF1aXJlZCBvZiB0aGlzIGtleS4KLSAqCVJldHVybiAxIGlmIHBlcm1pc3Npb24gZ3JhbnRlZCwgMCBpZiBwZXJtaXNzaW9uIGRlbmllZCBhbmQgLXZlIGl0IHRoZQotICoJbm9ybWFsIHBlcm1pc3Npb25zIG1vZGVsIHNob3VsZCBiZSBlZmZlY3RlZC4KKyAqCVJldHVybiAwIGlmIHBlcm1pc3Npb24gaXMgZ3JhbnRlZCwgLXZlIGVycm9yIG90aGVyd2lzZS4KICAqIEBrZXlfZ2V0c2VjdXJpdHk6CiAgKglHZXQgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzZWN1cml0eSBjb250ZXh0IGF0dGFjaGVkIHRvIGEga2V5CiAgKglmb3IgdGhlIHB1cnBvc2VzIG9mIGhvbm91cmluZyBLRVlDVExfR0VUU0VDVVJJVFkuICBUaGlzIGZ1bmN0aW9uCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NsYWJfZGVmLmggYi9pbmNsdWRlL2xpbnV4L3NsYWJfZGVmLmgKaW5kZXggNzkxYTUwMi4uODMyMDNhZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zbGFiX2RlZi5oCisrKyBiL2luY2x1ZGUvbGludXgvc2xhYl9kZWYuaApAQCAtMTM4LDExICsxMzgsMTIgQEAKIHZvaWQgKl9fa21hbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpOwogCiAjaWZkZWYgQ09ORklHX1RSQUNJTkcKLWV4dGVybiB2b2lkICprbWVtX2NhY2hlX2FsbG9jX25vdHJhY2Uoc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwgZ2ZwX3QgZmxhZ3MpOworZXh0ZXJuIHZvaWQgKmttZW1fY2FjaGVfYWxsb2NfdHJhY2Uoc2l6ZV90IHNpemUsCisJCQkJICAgIHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsIGdmcF90IGZsYWdzKTsKIGV4dGVybiBzaXplX3Qgc2xhYl9idWZmZXJfc2l6ZShzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwKTsKICNlbHNlCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgKgota21lbV9jYWNoZV9hbGxvY19ub3RyYWNlKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsIGdmcF90IGZsYWdzKQora21lbV9jYWNoZV9hbGxvY190cmFjZShzaXplX3Qgc2l6ZSwgc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwgZ2ZwX3QgZmxhZ3MpCiB7CiAJcmV0dXJuIGttZW1fY2FjaGVfYWxsb2MoY2FjaGVwLCBmbGFncyk7CiB9CkBAIC0xNzksMTAgKzE4MCw3IEBACiAjZW5kaWYKIAkJCWNhY2hlcCA9IG1hbGxvY19zaXplc1tpXS5jc19jYWNoZXA7CiAKLQkJcmV0ID0ga21lbV9jYWNoZV9hbGxvY19ub3RyYWNlKGNhY2hlcCwgZmxhZ3MpOwotCi0JCXRyYWNlX2ttYWxsb2MoX1RISVNfSVBfLCByZXQsCi0JCQkgICAgICBzaXplLCBzbGFiX2J1ZmZlcl9zaXplKGNhY2hlcCksIGZsYWdzKTsKKwkJcmV0ID0ga21lbV9jYWNoZV9hbGxvY190cmFjZShzaXplLCBjYWNoZXAsIGZsYWdzKTsKIAogCQlyZXR1cm4gcmV0OwogCX0KQEAgLTE5NCwxNCArMTkyLDE2IEBACiBleHRlcm4gdm9pZCAqa21lbV9jYWNoZV9hbGxvY19ub2RlKHN0cnVjdCBrbWVtX2NhY2hlICosIGdmcF90IGZsYWdzLCBpbnQgbm9kZSk7CiAKICNpZmRlZiBDT05GSUdfVFJBQ0lORwotZXh0ZXJuIHZvaWQgKmttZW1fY2FjaGVfYWxsb2Nfbm9kZV9ub3RyYWNlKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsCi0JCQkJCSAgIGdmcF90IGZsYWdzLAotCQkJCQkgICBpbnQgbm9kZWlkKTsKK2V4dGVybiB2b2lkICprbWVtX2NhY2hlX2FsbG9jX25vZGVfdHJhY2Uoc2l6ZV90IHNpemUsCisJCQkJCSBzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLAorCQkJCQkgZ2ZwX3QgZmxhZ3MsCisJCQkJCSBpbnQgbm9kZWlkKTsKICNlbHNlCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgKgota21lbV9jYWNoZV9hbGxvY19ub2RlX25vdHJhY2Uoc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwKLQkJCSAgICAgIGdmcF90IGZsYWdzLAotCQkJICAgICAgaW50IG5vZGVpZCkKK2ttZW1fY2FjaGVfYWxsb2Nfbm9kZV90cmFjZShzaXplX3Qgc2l6ZSwKKwkJCSAgICBzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLAorCQkJICAgIGdmcF90IGZsYWdzLAorCQkJICAgIGludCBub2RlaWQpCiB7CiAJcmV0dXJuIGttZW1fY2FjaGVfYWxsb2Nfbm9kZShjYWNoZXAsIGZsYWdzLCBub2RlaWQpOwogfQpAQCAtMjEwLDcgKzIxMCw2IEBACiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgKmttYWxsb2Nfbm9kZShzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MsIGludCBub2RlKQogewogCXN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXA7Ci0Jdm9pZCAqcmV0OwogCiAJaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKHNpemUpKSB7CiAJCWludCBpID0gMDsKQEAgLTIzNCwxMyArMjMzLDcgQEAKICNlbmRpZgogCQkJY2FjaGVwID0gbWFsbG9jX3NpemVzW2ldLmNzX2NhY2hlcDsKIAotCQlyZXQgPSBrbWVtX2NhY2hlX2FsbG9jX25vZGVfbm90cmFjZShjYWNoZXAsIGZsYWdzLCBub2RlKTsKLQotCQl0cmFjZV9rbWFsbG9jX25vZGUoX1RISVNfSVBfLCByZXQsCi0JCQkJICAgc2l6ZSwgc2xhYl9idWZmZXJfc2l6ZShjYWNoZXApLAotCQkJCSAgIGZsYWdzLCBub2RlKTsKLQotCQlyZXR1cm4gcmV0OworCQlyZXR1cm4ga21lbV9jYWNoZV9hbGxvY19ub2RlX3RyYWNlKHNpemUsIGNhY2hlcCwgZmxhZ3MsIG5vZGUpOwogCX0KIAlyZXR1cm4gX19rbWFsbG9jX25vZGUoc2l6ZSwgZmxhZ3MsIG5vZGUpOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zbHViX2RlZi5oIGIvaW5jbHVkZS9saW51eC9zbHViX2RlZi5oCmluZGV4IGU0ZjVlZDEuLjhiNmU4YWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2x1Yl9kZWYuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NsdWJfZGVmLmgKQEAgLTEwLDkgKzEwLDggQEAKICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+Ci0jaW5jbHVkZSA8bGludXgva21lbWxlYWsuaD4KIAotI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9rbWVtLmg+CisjaW5jbHVkZSA8bGludXgva21lbWxlYWsuaD4KIAogZW51bSBzdGF0X2l0ZW0gewogCUFMTE9DX0ZBU1RQQVRILAkJLyogQWxsb2NhdGlvbiBmcm9tIGNwdSBzbGFiICovCkBAIC0yMTYsMzEgKzIxNSw0MCBAQAogdm9pZCAqa21lbV9jYWNoZV9hbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqLCBnZnBfdCk7CiB2b2lkICpfX2ttYWxsb2Moc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKTsKIAorc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkICoKK2ttYWxsb2Nfb3JkZXIoc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzLCB1bnNpZ25lZCBpbnQgb3JkZXIpCit7CisJdm9pZCAqcmV0ID0gKHZvaWQgKikgX19nZXRfZnJlZV9wYWdlcyhmbGFncyB8IF9fR0ZQX0NPTVAsIG9yZGVyKTsKKwlrbWVtbGVha19hbGxvYyhyZXQsIHNpemUsIDEsIGZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorCiAjaWZkZWYgQ09ORklHX1RSQUNJTkcKLWV4dGVybiB2b2lkICprbWVtX2NhY2hlX2FsbG9jX25vdHJhY2Uoc3RydWN0IGttZW1fY2FjaGUgKnMsIGdmcF90IGdmcGZsYWdzKTsKK2V4dGVybiB2b2lkICoKK2ttZW1fY2FjaGVfYWxsb2NfdHJhY2Uoc3RydWN0IGttZW1fY2FjaGUgKnMsIGdmcF90IGdmcGZsYWdzLCBzaXplX3Qgc2l6ZSk7CitleHRlcm4gdm9pZCAqa21hbGxvY19vcmRlcl90cmFjZShzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MsIHVuc2lnbmVkIGludCBvcmRlcik7CiAjZWxzZQogc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkICoKLWttZW1fY2FjaGVfYWxsb2Nfbm90cmFjZShzdHJ1Y3Qga21lbV9jYWNoZSAqcywgZ2ZwX3QgZ2ZwZmxhZ3MpCitrbWVtX2NhY2hlX2FsbG9jX3RyYWNlKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBnZnBfdCBnZnBmbGFncywgc2l6ZV90IHNpemUpCiB7CiAJcmV0dXJuIGttZW1fY2FjaGVfYWxsb2MocywgZ2ZwZmxhZ3MpOwogfQorCitzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgKgora21hbGxvY19vcmRlcl90cmFjZShzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MsIHVuc2lnbmVkIGludCBvcmRlcikKK3sKKwlyZXR1cm4ga21hbGxvY19vcmRlcihzaXplLCBmbGFncywgb3JkZXIpOworfQogI2VuZGlmCiAKIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCAqa21hbGxvY19sYXJnZShzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpCiB7CiAJdW5zaWduZWQgaW50IG9yZGVyID0gZ2V0X29yZGVyKHNpemUpOwotCXZvaWQgKnJldCA9ICh2b2lkICopIF9fZ2V0X2ZyZWVfcGFnZXMoZmxhZ3MgfCBfX0dGUF9DT01QLCBvcmRlcik7Ci0KLQlrbWVtbGVha19hbGxvYyhyZXQsIHNpemUsIDEsIGZsYWdzKTsKLQl0cmFjZV9rbWFsbG9jKF9USElTX0lQXywgcmV0LCBzaXplLCBQQUdFX1NJWkUgPDwgb3JkZXIsIGZsYWdzKTsKLQotCXJldHVybiByZXQ7CisJcmV0dXJuIGttYWxsb2Nfb3JkZXJfdHJhY2Uoc2l6ZSwgZmxhZ3MsIG9yZGVyKTsKIH0KIAogc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkICprbWFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncykKIHsKLQl2b2lkICpyZXQ7Ci0KIAlpZiAoX19idWlsdGluX2NvbnN0YW50X3Aoc2l6ZSkpIHsKIAkJaWYgKHNpemUgPiBTTFVCX01BWF9TSVpFKQogCQkJcmV0dXJuIGttYWxsb2NfbGFyZ2Uoc2l6ZSwgZmxhZ3MpOwpAQCAtMjUxLDExICsyNTksNyBAQAogCQkJaWYgKCFzKQogCQkJCXJldHVybiBaRVJPX1NJWkVfUFRSOwogCi0JCQlyZXQgPSBrbWVtX2NhY2hlX2FsbG9jX25vdHJhY2UocywgZmxhZ3MpOwotCi0JCQl0cmFjZV9rbWFsbG9jKF9USElTX0lQXywgcmV0LCBzaXplLCBzLT5zaXplLCBmbGFncyk7Ci0KLQkJCXJldHVybiByZXQ7CisJCQlyZXR1cm4ga21lbV9jYWNoZV9hbGxvY190cmFjZShzLCBmbGFncywgc2l6ZSk7CiAJCX0KIAl9CiAJcmV0dXJuIF9fa21hbGxvYyhzaXplLCBmbGFncyk7CkBAIC0yNjYsMTQgKzI3MCwxNCBAQAogdm9pZCAqa21lbV9jYWNoZV9hbGxvY19ub2RlKHN0cnVjdCBrbWVtX2NhY2hlICosIGdmcF90IGZsYWdzLCBpbnQgbm9kZSk7CiAKICNpZmRlZiBDT05GSUdfVFJBQ0lORwotZXh0ZXJuIHZvaWQgKmttZW1fY2FjaGVfYWxsb2Nfbm9kZV9ub3RyYWNlKHN0cnVjdCBrbWVtX2NhY2hlICpzLAorZXh0ZXJuIHZvaWQgKmttZW1fY2FjaGVfYWxsb2Nfbm9kZV90cmFjZShzdHJ1Y3Qga21lbV9jYWNoZSAqcywKIAkJCQkJICAgZ2ZwX3QgZ2ZwZmxhZ3MsCi0JCQkJCSAgIGludCBub2RlKTsKKwkJCQkJICAgaW50IG5vZGUsIHNpemVfdCBzaXplKTsKICNlbHNlCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgKgota21lbV9jYWNoZV9hbGxvY19ub2RlX25vdHJhY2Uoc3RydWN0IGttZW1fY2FjaGUgKnMsCitrbWVtX2NhY2hlX2FsbG9jX25vZGVfdHJhY2Uoc3RydWN0IGttZW1fY2FjaGUgKnMsCiAJCQkgICAgICBnZnBfdCBnZnBmbGFncywKLQkJCSAgICAgIGludCBub2RlKQorCQkJICAgICAgaW50IG5vZGUsIHNpemVfdCBzaXplKQogewogCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jX25vZGUocywgZ2ZwZmxhZ3MsIG5vZGUpOwogfQpAQCAtMjgxLDggKzI4NSw2IEBACiAKIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCAqa21hbGxvY19ub2RlKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncywgaW50IG5vZGUpCiB7Ci0Jdm9pZCAqcmV0OwotCiAJaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKHNpemUpICYmCiAJCXNpemUgPD0gU0xVQl9NQVhfU0laRSAmJiAhKGZsYWdzICYgU0xVQl9ETUEpKSB7CiAJCQlzdHJ1Y3Qga21lbV9jYWNoZSAqcyA9IGttYWxsb2Nfc2xhYihzaXplKTsKQEAgLTI5MCwxMiArMjkyLDcgQEAKIAkJaWYgKCFzKQogCQkJcmV0dXJuIFpFUk9fU0laRV9QVFI7CiAKLQkJcmV0ID0ga21lbV9jYWNoZV9hbGxvY19ub2RlX25vdHJhY2UocywgZmxhZ3MsIG5vZGUpOwotCi0JCXRyYWNlX2ttYWxsb2Nfbm9kZShfVEhJU19JUF8sIHJldCwKLQkJCQkgICBzaXplLCBzLT5zaXplLCBmbGFncywgbm9kZSk7Ci0KLQkJcmV0dXJuIHJldDsKKwkJcmV0dXJuIGttZW1fY2FjaGVfYWxsb2Nfbm9kZV90cmFjZShzLCBmbGFncywgbm9kZSwgc2l6ZSk7CiAJfQogCXJldHVybiBfX2ttYWxsb2Nfbm9kZShzaXplLCBmbGFncywgbm9kZSk7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NvbnlwaS5oIGIvaW5jbHVkZS9saW51eC9zb255cGkuaAppbmRleCA0Zjk1YzFhLi4wZTZkYzM4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NvbnlwaS5oCisrKyBiL2luY2x1ZGUvbGludXgvc29ueXBpLmgKQEAgLTExMiw2ICsxMTIsNyBAQAogI2RlZmluZSBTT05ZUElfRVZFTlRfVk9MVU1FX0RFQ19QUkVTU0VECQk3MAogI2RlZmluZSBTT05ZUElfRVZFTlRfQlJJR0hUTkVTU19QUkVTU0VECQk3MQogI2RlZmluZSBTT05ZUElfRVZFTlRfTUVESUFfUFJFU1NFRAkJNzIKKyNkZWZpbmUgU09OWVBJX0VWRU5UX1ZFTkRPUl9QUkVTU0VECQk3MwogCiAvKiBnZXQvc2V0IGJyaWdodG5lc3MgKi8KICNkZWZpbmUgU09OWVBJX0lPQ0dCUlQJCV9JT1IoJ3YnLCAwLCBfX3U4KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdW5ycGMvY2FjaGUuaCBiL2luY2x1ZGUvbGludXgvc3VucnBjL2NhY2hlLmgKaW5kZXggNjk1MGM5OC4uNzhhYTEwNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdW5ycGMvY2FjaGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9jYWNoZS5oCkBAIC0xMyw2ICsxMyw3IEBACiAjaWZuZGVmIF9MSU5VWF9TVU5SUENfQ0FDSEVfSF8KICNkZWZpbmUgX0xJTlVYX1NVTlJQQ19DQUNIRV9IXwogCisjaW5jbHVkZSA8bGludXgva3JlZi5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdXNwZW5kLmggYi9pbmNsdWRlL2xpbnV4L3N1c3BlbmQuaAppbmRleCAyNjY5NzUxLi4xNDRiMzRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N1c3BlbmQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N1c3BlbmQuaApAQCAtMjkyLDcgKzI5Miw3IEBACiAvKiBkcml2ZXJzL2Jhc2UvcG93ZXIvd2FrZXVwLmMgKi8KIGV4dGVybiBib29sIGV2ZW50c19jaGVja19lbmFibGVkOwogCi1leHRlcm4gYm9vbCBwbV9jaGVja193YWtldXBfZXZlbnRzKHZvaWQpOworZXh0ZXJuIGJvb2wgcG1fd2FrZXVwX3BlbmRpbmcodm9pZCk7CiBleHRlcm4gYm9vbCBwbV9nZXRfd2FrZXVwX2NvdW50KHVuc2lnbmVkIGludCAqY291bnQpOwogZXh0ZXJuIGJvb2wgcG1fc2F2ZV93YWtldXBfY291bnQodW5zaWduZWQgaW50IGNvdW50KTsKICNlbHNlIC8qICFDT05GSUdfUE1fU0xFRVAgKi8KQEAgLTMwOSw3ICszMDksNyBAQAogCiAjZGVmaW5lIHBtX25vdGlmaWVyKGZuLCBwcmkpCWRvIHsgKHZvaWQpKGZuKTsgfSB3aGlsZSAoMCkKIAotc3RhdGljIGlubGluZSBib29sIHBtX2NoZWNrX3dha2V1cF9ldmVudHModm9pZCkgeyByZXR1cm4gdHJ1ZTsgfQorc3RhdGljIGlubGluZSBib29sIHBtX3dha2V1cF9wZW5kaW5nKHZvaWQpIHsgcmV0dXJuIGZhbHNlOyB9CiAjZW5kaWYgLyogIUNPTkZJR19QTV9TTEVFUCAqLwogCiBleHRlcm4gc3RydWN0IG11dGV4IHBtX211dGV4OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90cG0uaCBiL2luY2x1ZGUvbGludXgvdHBtLmgKaW5kZXggYWM1ZDFjMS4uZmRjNzE4YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90cG0uaAorKysgYi9pbmNsdWRlL2xpbnV4L3RwbS5oCkBAIC0zMSw2ICszMSw3IEBACiAKIGV4dGVybiBpbnQgdHBtX3Bjcl9yZWFkKHUzMiBjaGlwX251bSwgaW50IHBjcl9pZHgsIHU4ICpyZXNfYnVmKTsKIGV4dGVybiBpbnQgdHBtX3Bjcl9leHRlbmQodTMyIGNoaXBfbnVtLCBpbnQgcGNyX2lkeCwgY29uc3QgdTggKmhhc2gpOworZXh0ZXJuIGludCB0cG1fc2VuZCh1MzIgY2hpcF9udW0sIHZvaWQgKmNtZCwgc2l6ZV90IGJ1Zmxlbik7CiAjZWxzZQogc3RhdGljIGlubGluZSBpbnQgdHBtX3Bjcl9yZWFkKHUzMiBjaGlwX251bSwgaW50IHBjcl9pZHgsIHU4ICpyZXNfYnVmKSB7CiAJcmV0dXJuIC1FTk9ERVY7CkBAIC0zOCw1ICszOSw4IEBACiBzdGF0aWMgaW5saW5lIGludCB0cG1fcGNyX2V4dGVuZCh1MzIgY2hpcF9udW0sIGludCBwY3JfaWR4LCBjb25zdCB1OCAqaGFzaCkgewogCXJldHVybiAtRU5PREVWOwogfQorc3RhdGljIGlubGluZSBpbnQgdHBtX3NlbmQodTMyIGNoaXBfbnVtLCB2b2lkICpjbWQsIHNpemVfdCBidWZsZW4pIHsKKwlyZXR1cm4gLUVOT0RFVjsKK30KICNlbmRpZgogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RwbV9jb21tYW5kLmggYi9pbmNsdWRlL2xpbnV4L3RwbV9jb21tYW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI3NTEyZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvdHBtX2NvbW1hbmQuaApAQCAtMCwwICsxLDI4IEBACisjaWZuZGVmIF9fTElOVVhfVFBNX0NPTU1BTkRfSF9fCisjZGVmaW5lIF9fTElOVVhfVFBNX0NPTU1BTkRfSF9fCisKKy8qCisgKiBUUE0gQ29tbWFuZCBjb25zdGFudHMgZnJvbSBzcGVjaWZpY2F0aW9ucyBhdAorICogaHR0cDovL3d3dy50cnVzdGVkY29tcHV0aW5nZ3JvdXAub3JnCisgKi8KKworLyogQ29tbWFuZCBUQUdTICovCisjZGVmaW5lIFRQTV9UQUdfUlFVX0NPTU1BTkQgICAgICAgICAgICAgMTkzCisjZGVmaW5lIFRQTV9UQUdfUlFVX0FVVEgxX0NPTU1BTkQgICAgICAgMTk0CisjZGVmaW5lIFRQTV9UQUdfUlFVX0FVVEgyX0NPTU1BTkQgICAgICAgMTk1CisjZGVmaW5lIFRQTV9UQUdfUlNQX0NPTU1BTkQgICAgICAgICAgICAgMTk2CisjZGVmaW5lIFRQTV9UQUdfUlNQX0FVVEgxX0NPTU1BTkQgICAgICAgMTk3CisjZGVmaW5lIFRQTV9UQUdfUlNQX0FVVEgyX0NPTU1BTkQgICAgICAgMTk4CisKKy8qIENvbW1hbmQgT3JkaW5hbHMgKi8KKyNkZWZpbmUgVFBNX09SRF9HRVRSQU5ET00gICAgICAgICAgICAgICA3MAorI2RlZmluZSBUUE1fT1JEX09TQVAgICAgICAgICAgICAgICAgICAgIDExCisjZGVmaW5lIFRQTV9PUkRfT0lBUCAgICAgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgVFBNX09SRF9TRUFMICAgICAgICAgICAgICAgICAgICAyMworI2RlZmluZSBUUE1fT1JEX1VOU0VBTCAgICAgICAgICAgICAgICAgIDI0CisKKy8qIE90aGVyIGNvbnN0YW50cyAqLworI2RlZmluZSBTUktIQU5ETEUgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgVFBNX05PTkNFX1NJWkUgICAgICAgICAgICAgICAgICAyMAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgveGF0dHIuaCBiL2luY2x1ZGUvbGludXgveGF0dHIuaAppbmRleCBmMWU1YmRlLi5lNjEzMWVmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3hhdHRyLmgKKysrIGIvaW5jbHVkZS9saW51eC94YXR0ci5oCkBAIC00MCw5ICs0MCwxMyBAQAogI2RlZmluZSBYQVRUUl9TTUFDS19TVUZGSVggIlNNQUNLNjQiCiAjZGVmaW5lIFhBVFRSX1NNQUNLX0lQSU4gIlNNQUNLNjRJUElOIgogI2RlZmluZSBYQVRUUl9TTUFDS19JUE9VVCAiU01BQ0s2NElQT1VUIgorI2RlZmluZSBYQVRUUl9TTUFDS19FWEVDICJTTUFDSzY0RVhFQyIKKyNkZWZpbmUgWEFUVFJfU01BQ0tfVFJBTlNNVVRFICJTTUFDSzY0VFJBTlNNVVRFIgogI2RlZmluZSBYQVRUUl9OQU1FX1NNQUNLIFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCBYQVRUUl9TTUFDS19TVUZGSVgKICNkZWZpbmUgWEFUVFJfTkFNRV9TTUFDS0lQSU4JWEFUVFJfU0VDVVJJVFlfUFJFRklYIFhBVFRSX1NNQUNLX0lQSU4KICNkZWZpbmUgWEFUVFJfTkFNRV9TTUFDS0lQT1VUCVhBVFRSX1NFQ1VSSVRZX1BSRUZJWCBYQVRUUl9TTUFDS19JUE9VVAorI2RlZmluZSBYQVRUUl9OQU1FX1NNQUNLRVhFQwlYQVRUUl9TRUNVUklUWV9QUkVGSVggWEFUVFJfU01BQ0tfRVhFQworI2RlZmluZSBYQVRUUl9OQU1FX1NNQUNLVFJBTlNNVVRFIFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCBYQVRUUl9TTUFDS19UUkFOU01VVEUKIAogI2RlZmluZSBYQVRUUl9DQVBTX1NVRkZJWCAiY2FwYWJpbGl0eSIKICNkZWZpbmUgWEFUVFJfTkFNRV9DQVBTIFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCBYQVRUUl9DQVBTX1NVRkZJWApkaWZmIC0tZ2l0IGEva2VybmVsL01ha2VmaWxlIGIva2VybmVsL01ha2VmaWxlCmluZGV4IDBiNWZmMDguLjMzZTBhMzkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9NYWtlZmlsZQorKysgYi9rZXJuZWwvTWFrZWZpbGUKQEAgLTEyMSw3ICsxMjEsNyBAQAogIyBjb25maWdfZGF0YS5oIGNvbnRhaW5zIHRoZSBzYW1lIGluZm9ybWF0aW9uIGFzIGlrY29uZmlnLmggYnV0IGd6aXBwZWQuCiAjIEluZm8gZnJvbSBjb25maWdfZGF0YSBjYW4gYmUgZXh0cmFjdGVkIGZyb20gL3Byb2MvY29uZmlnKgogdGFyZ2V0cyArPSBjb25maWdfZGF0YS5negotJChvYmopL2NvbmZpZ19kYXRhLmd6OiAuY29uZmlnIEZPUkNFCiskKG9iaikvY29uZmlnX2RhdGEuZ3o6ICQoS0NPTkZJR19DT05GSUcpIEZPUkNFCiAJJChjYWxsIGlmX2NoYW5nZWQsZ3ppcCkKIAogcXVpZXRfY21kX2lrY29uZmlnZ3ogPSBJS0NGRyAgICRACmRpZmYgLS1naXQgYS9rZXJuZWwvZnJlZXplci5jIGIva2VybmVsL2ZyZWV6ZXIuYwppbmRleCBiZDFkNDJiLi42NmVjZDJlIDEwMDY0NAotLS0gYS9rZXJuZWwvZnJlZXplci5jCisrKyBiL2tlcm5lbC9mcmVlemVyLmMKQEAgLTEwNCw4ICsxMDQsMTMgQEAKIAl9CiAKIAlpZiAoc2hvdWxkX3NlbmRfc2lnbmFsKHApKSB7Ci0JCWlmICghc2lnbmFsX3BlbmRpbmcocCkpCi0JCQlmYWtlX3NpZ25hbF93YWtlX3VwKHApOworCQlmYWtlX3NpZ25hbF93YWtlX3VwKHApOworCQkvKgorCQkgKiBmYWtlX3NpZ25hbF93YWtlX3VwKCkgZ29lcyB0aHJvdWdoIHAncyBzY2hlZHVsZXIKKwkJICogbG9jayBhbmQgZ3VhcmFudGVlcyB0aGF0IFRBU0tfU1RPUFBFRC9UUkFDRUQgLT4KKwkJICogVEFTS19SVU5OSU5HIHRyYW5zaXRpb24gY2FuJ3QgcmFjZSB3aXRoIHRhc2sgc3RhdGUKKwkJICogdGVzdGluZyBpbiB0cnlfdG9fZnJlZXplX3Rhc2tzKCkuCisJCSAqLwogCX0gZWxzZSBpZiAoc2lnX29ubHkpIHsKIAkJcmV0dXJuIGZhbHNlOwogCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvTWFrZWZpbGUgYi9rZXJuZWwvcG93ZXIvTWFrZWZpbGUKaW5kZXggZjkwNjNjNi4uYjc1NTk3MiAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL01ha2VmaWxlCisrKyBiL2tlcm5lbC9wb3dlci9NYWtlZmlsZQpAQCAtMSw3ICsxLDQgQEAKLQotaWZlcSAoJChDT05GSUdfUE1fREVCVUcpLHkpCi1FWFRSQV9DRkxBR1MJKz0JLURERUJVRwotZW5kaWYKK2NjZmxhZ3MtJChDT05GSUdfUE1fREVCVUcpCTo9CS1EREVCVUcKIAogb2JqLSQoQ09ORklHX1BNKQkJKz0gbWFpbi5vCiBvYmotJChDT05GSUdfUE1fU0xFRVApCQkrPSBjb25zb2xlLm8KZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9oaWJlcm5hdGUuYyBiL2tlcm5lbC9wb3dlci9oaWJlcm5hdGUuYwppbmRleCAwNDhkMGI1Li44NzBmNzJiIDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvaGliZXJuYXRlLmMKKysrIGIva2VybmVsL3Bvd2VyL2hpYmVybmF0ZS5jCkBAIC02Miw3ICs2Miw3IEBACiB7CiAJaWYgKG9wcyAmJiAhKG9wcy0+YmVnaW4gJiYgb3BzLT5lbmQgJiYgIG9wcy0+cHJlX3NuYXBzaG90CiAJICAgICYmIG9wcy0+cHJlcGFyZSAmJiBvcHMtPmZpbmlzaCAmJiBvcHMtPmVudGVyICYmIG9wcy0+cHJlX3Jlc3RvcmUKLQkgICAgJiYgb3BzLT5yZXN0b3JlX2NsZWFudXApKSB7CisJICAgICYmIG9wcy0+cmVzdG9yZV9jbGVhbnVwICYmIG9wcy0+bGVhdmUpKSB7CiAJCVdBUk5fT04oMSk7CiAJCXJldHVybjsKIAl9CkBAIC0yNzgsNyArMjc4LDcgQEAKIAkJZ290byBFbmFibGVfaXJxczsKIAl9CiAKLQlpZiAoaGliZXJuYXRpb25fdGVzdChURVNUX0NPUkUpIHx8ICFwbV9jaGVja193YWtldXBfZXZlbnRzKCkpCisJaWYgKGhpYmVybmF0aW9uX3Rlc3QoVEVTVF9DT1JFKSB8fCBwbV93YWtldXBfcGVuZGluZygpKQogCQlnb3RvIFBvd2VyX3VwOwogCiAJaW5fc3VzcGVuZCA9IDE7CkBAIC01MTYsNyArNTE2LDcgQEAKIAogCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAJc3lzZGV2X3N1c3BlbmQoUE1TR19ISUJFUk5BVEUpOwotCWlmICghcG1fY2hlY2tfd2FrZXVwX2V2ZW50cygpKSB7CisJaWYgKHBtX3dha2V1cF9wZW5kaW5nKCkpIHsKIAkJZXJyb3IgPSAtRUFHQUlOOwogCQlnb3RvIFBvd2VyX3VwOwogCX0KQEAgLTY0Nyw2ICs2NDcsNyBAQAogCQlzd3N1c3BfZnJlZSgpOwogCQlpZiAoIWVycm9yKQogCQkJcG93ZXJfZG93bigpOworCQlpbl9zdXNwZW5kID0gMDsKIAkJcG1fcmVzdG9yZV9nZnBfbWFzaygpOwogCX0gZWxzZSB7CiAJCXByX2RlYnVnKCJQTTogSW1hZ2UgcmVzdG9yZWQgc3VjY2Vzc2Z1bGx5LlxuIik7CmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvcHJvY2Vzcy5jIGIva2VybmVsL3Bvd2VyL3Byb2Nlc3MuYwppbmRleCBlNTBiNGMxLi5kNmQyYTEwIDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvcHJvY2Vzcy5jCisrKyBiL2tlcm5lbC9wb3dlci9wcm9jZXNzLmMKQEAgLTY0LDYgKzY0LDEyIEBACiAJCQkgKiBwZXJ0dXJiIGEgdGFzayBpbiBUQVNLX1NUT1BQRUQgb3IgVEFTS19UUkFDRUQuCiAJCQkgKiBJdCBpcyAiZnJvemVuIGVub3VnaCIuICBJZiB0aGUgdGFzayBkb2VzIHdha2UKIAkJCSAqIHVwLCBpdCB3aWxsIGltbWVkaWF0ZWx5IGNhbGwgdHJ5X3RvX2ZyZWV6ZS4KKwkJCSAqCisJCQkgKiBCZWNhdXNlIGZyZWV6ZV90YXNrKCkgZ29lcyB0aHJvdWdoIHAncworCQkJICogc2NoZWR1bGVyIGxvY2sgYWZ0ZXIgc2V0dGluZyBUSUZfRlJFRVpFLCBpdCdzCisJCQkgKiBndWFyYW50ZWVkIHRoYXQgZWl0aGVyIHdlIHNlZSBUQVNLX1JVTk5JTkcgb3IKKwkJCSAqIHRyeV90b19zdG9wKCkgYWZ0ZXIgc2NoZWR1bGUoKSBpbiBwdHJhY2Uvc2lnbmFsCisJCQkgKiBzdG9wIHNlZXMgVElGX0ZSRUVaRS4KIAkJCSAqLwogCQkJaWYgKCF0YXNrX2lzX3N0b3BwZWRfb3JfdHJhY2VkKHApICYmCiAJCQkgICAgIWZyZWV6ZXJfc2hvdWxkX3NraXAocCkpCkBAIC03OSw3ICs4NSw3IEBACiAJCWlmICghdG9kbyB8fCB0aW1lX2FmdGVyKGppZmZpZXMsIGVuZF90aW1lKSkKIAkJCWJyZWFrOwogCi0JCWlmICghcG1fY2hlY2tfd2FrZXVwX2V2ZW50cygpKSB7CisJCWlmIChwbV93YWtldXBfcGVuZGluZygpKSB7CiAJCQl3YWtldXAgPSB0cnVlOwogCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9zdXNwZW5kLmMgYi9rZXJuZWwvcG93ZXIvc3VzcGVuZC5jCmluZGV4IDAzMWQ1ZTMuLjg4NTBkZjYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9zdXNwZW5kLmMKKysrIGIva2VybmVsL3Bvd2VyL3N1c3BlbmQuYwpAQCAtMTY0LDcgKzE2NCw3IEBACiAKIAllcnJvciA9IHN5c2Rldl9zdXNwZW5kKFBNU0dfU1VTUEVORCk7CiAJaWYgKCFlcnJvcikgewotCQlpZiAoIXN1c3BlbmRfdGVzdChURVNUX0NPUkUpICYmIHBtX2NoZWNrX3dha2V1cF9ldmVudHMoKSkgeworCQlpZiAoIShzdXNwZW5kX3Rlc3QoVEVTVF9DT1JFKSB8fCBwbV93YWtldXBfcGVuZGluZygpKSkgewogCQkJZXJyb3IgPSBzdXNwZW5kX29wcy0+ZW50ZXIoc3RhdGUpOwogCQkJZXZlbnRzX2NoZWNrX2VuYWJsZWQgPSBmYWxzZTsKIAkJfQpkaWZmIC0tZ2l0IGEva2VybmVsL3ByaW50ay5jIGIva2VybmVsL3ByaW50ay5jCmluZGV4IDQ2NDJhNWMuLmY2NGI4OTkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wcmludGsuYworKysgYi9rZXJuZWwvcHJpbnRrLmMKQEAgLTI3MywxMiArMjczLDEyIEBACiAJICogYXQgb3BlbiB0aW1lLgogCSAqLwogCWlmICh0eXBlID09IFNZU0xPR19BQ1RJT05fT1BFTiB8fCAhZnJvbV9maWxlKSB7Ci0JCWlmIChkbWVzZ19yZXN0cmljdCAmJiAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKLQkJCXJldHVybiAtRVBFUk07CisJCWlmIChkbWVzZ19yZXN0cmljdCAmJiAhY2FwYWJsZShDQVBfU1lTTE9HKSkKKwkJCWdvdG8gd2FybjsgLyogc3dpdGNoIHRvIHJldHVybiAtRVBFUk0gYWZ0ZXIgMi42LjM5ICovCiAJCWlmICgodHlwZSAhPSBTWVNMT0dfQUNUSU9OX1JFQURfQUxMICYmCiAJCSAgICAgdHlwZSAhPSBTWVNMT0dfQUNUSU9OX1NJWkVfQlVGRkVSKSAmJgotCQkgICAgIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCi0JCQlyZXR1cm4gLUVQRVJNOworCQkgICAgIWNhcGFibGUoQ0FQX1NZU0xPRykpCisJCQlnb3RvIHdhcm47IC8qIHN3aXRjaCB0byByZXR1cm4gLUVQRVJNIGFmdGVyIDIuNi4zOSAqLwogCX0KIAogCWVycm9yID0gc2VjdXJpdHlfc3lzbG9nKHR5cGUpOwpAQCAtNDIyLDYgKzQyMiwxMiBAQAogCX0KIG91dDoKIAlyZXR1cm4gZXJyb3I7Cit3YXJuOgorCS8qIHJlbW92ZSBhZnRlciAyLjYuMzkgKi8KKwlpZiAoY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJV0FSTl9PTkNFKDEsICJBdHRlbXB0IHRvIGFjY2VzcyBzeXNsb2cgd2l0aCBDQVBfU1lTX0FETUlOICIKKwkJICAiYnV0IG5vIENBUF9TWVNMT0cgKGRlcHJlY2F0ZWQgYW5kIGRlbmllZCkuXG4iKTsKKwlyZXR1cm4gLUVQRVJNOwogfQogCiBTWVNDQUxMX0RFRklORTMoc3lzbG9nLCBpbnQsIHR5cGUsIGNoYXIgX191c2VyICosIGJ1ZiwgaW50LCBsZW4pCmRpZmYgLS1naXQgYS9saWIvaGV4ZHVtcC5jIGIvbGliL2hleGR1bXAuYwppbmRleCA1ZDdhNDgwLi5iNjZiMmJkIDEwMDY0NAotLS0gYS9saWIvaGV4ZHVtcC5jCisrKyBiL2xpYi9oZXhkdW1wLmMKQEAgLTM0LDYgKzM0LDIyIEBACiBFWFBPUlRfU1lNQk9MKGhleF90b19iaW4pOwogCiAvKioKKyAqIGhleDJiaW4gLSBjb252ZXJ0IGFuIGFzY2lpIGhleGFkZWNpbWFsIHN0cmluZyB0byBpdHMgYmluYXJ5IHJlcHJlc2VudGF0aW9uCisgKiBAZHN0OiBiaW5hcnkgcmVzdWx0CisgKiBAc3JjOiBhc2NpaSBoZXhhZGVjaW1hbCBzdHJpbmcKKyAqIEBjb3VudDogcmVzdWx0IGxlbmd0aAorICovCit2b2lkIGhleDJiaW4odTggKmRzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3QgY291bnQpCit7CisJd2hpbGUgKGNvdW50LS0pIHsKKwkJKmRzdCA9IGhleF90b19iaW4oKnNyYysrKSA8PCA0OworCQkqZHN0ICs9IGhleF90b19iaW4oKnNyYysrKTsKKwkJZHN0Kys7CisJfQorfQorRVhQT1JUX1NZTUJPTChoZXgyYmluKTsKKworLyoqCiAgKiBoZXhfZHVtcF90b19idWZmZXIgLSBjb252ZXJ0IGEgYmxvYiBvZiBkYXRhIHRvICJoZXggQVNDSUkiIGluIG1lbW9yeQogICogQGJ1ZjogZGF0YSBibG9iIHRvIGR1bXAKICAqIEBsZW46IG51bWJlciBvZiBieXRlcyBpbiB0aGUgQGJ1ZgpkaWZmIC0tZ2l0IGEvbW0vc2xhYi5jIGIvbW0vc2xhYi5jCmluZGV4IGU5ZjkyOTguLjI2NDAzNzQgMTAwNjQ0Ci0tLSBhL21tL3NsYWIuYworKysgYi9tbS9zbGFiLmMKQEAgLTM2NTMsMTEgKzM2NTMsMTggQEAKIEVYUE9SVF9TWU1CT0woa21lbV9jYWNoZV9hbGxvYyk7CiAKICNpZmRlZiBDT05GSUdfVFJBQ0lORwotdm9pZCAqa21lbV9jYWNoZV9hbGxvY19ub3RyYWNlKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsIGdmcF90IGZsYWdzKQordm9pZCAqCitrbWVtX2NhY2hlX2FsbG9jX3RyYWNlKHNpemVfdCBzaXplLCBzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLCBnZnBfdCBmbGFncykKIHsKLQlyZXR1cm4gX19jYWNoZV9hbGxvYyhjYWNoZXAsIGZsYWdzLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOworCXZvaWQgKnJldDsKKworCXJldCA9IF9fY2FjaGVfYWxsb2MoY2FjaGVwLCBmbGFncywgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKKworCXRyYWNlX2ttYWxsb2MoX1JFVF9JUF8sIHJldCwKKwkJICAgICAgc2l6ZSwgc2xhYl9idWZmZXJfc2l6ZShjYWNoZXApLCBmbGFncyk7CisJcmV0dXJuIHJldDsKIH0KLUVYUE9SVF9TWU1CT0woa21lbV9jYWNoZV9hbGxvY19ub3RyYWNlKTsKK0VYUE9SVF9TWU1CT0woa21lbV9jYWNoZV9hbGxvY190cmFjZSk7CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19OVU1BCkBAIC0zNjc1LDMxICszNjgyLDMyIEBACiBFWFBPUlRfU1lNQk9MKGttZW1fY2FjaGVfYWxsb2Nfbm9kZSk7CiAKICNpZmRlZiBDT05GSUdfVFJBQ0lORwotdm9pZCAqa21lbV9jYWNoZV9hbGxvY19ub2RlX25vdHJhY2Uoc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwKLQkJCQkgICAgZ2ZwX3QgZmxhZ3MsCi0JCQkJICAgIGludCBub2RlaWQpCit2b2lkICprbWVtX2NhY2hlX2FsbG9jX25vZGVfdHJhY2Uoc2l6ZV90IHNpemUsCisJCQkJICBzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLAorCQkJCSAgZ2ZwX3QgZmxhZ3MsCisJCQkJICBpbnQgbm9kZWlkKQogewotCXJldHVybiBfX2NhY2hlX2FsbG9jX25vZGUoY2FjaGVwLCBmbGFncywgbm9kZWlkLAorCXZvaWQgKnJldDsKKworCXJldCA9IF9fY2FjaGVfYWxsb2Nfbm9kZShjYWNoZXAsIGZsYWdzLCBub2RlaWQsCiAJCQkJICBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOworCXRyYWNlX2ttYWxsb2Nfbm9kZShfUkVUX0lQXywgcmV0LAorCQkJICAgc2l6ZSwgc2xhYl9idWZmZXJfc2l6ZShjYWNoZXApLAorCQkJICAgZmxhZ3MsIG5vZGVpZCk7CisJcmV0dXJuIHJldDsKIH0KLUVYUE9SVF9TWU1CT0woa21lbV9jYWNoZV9hbGxvY19ub2RlX25vdHJhY2UpOworRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX2FsbG9jX25vZGVfdHJhY2UpOwogI2VuZGlmCiAKIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCAqCiBfX2RvX2ttYWxsb2Nfbm9kZShzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MsIGludCBub2RlLCB2b2lkICpjYWxsZXIpCiB7CiAJc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcDsKLQl2b2lkICpyZXQ7CiAKIAljYWNoZXAgPSBrbWVtX2ZpbmRfZ2VuZXJhbF9jYWNoZXAoc2l6ZSwgZmxhZ3MpOwogCWlmICh1bmxpa2VseShaRVJPX09SX05VTExfUFRSKGNhY2hlcCkpKQogCQlyZXR1cm4gY2FjaGVwOwotCXJldCA9IGttZW1fY2FjaGVfYWxsb2Nfbm9kZV9ub3RyYWNlKGNhY2hlcCwgZmxhZ3MsIG5vZGUpOwotCi0JdHJhY2Vfa21hbGxvY19ub2RlKCh1bnNpZ25lZCBsb25nKSBjYWxsZXIsIHJldCwKLQkJCSAgIHNpemUsIGNhY2hlcC0+YnVmZmVyX3NpemUsIGZsYWdzLCBub2RlKTsKLQotCXJldHVybiByZXQ7CisJcmV0dXJuIGttZW1fY2FjaGVfYWxsb2Nfbm9kZV90cmFjZShzaXplLCBjYWNoZXAsIGZsYWdzLCBub2RlKTsKIH0KIAogI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHX1NMQUIpIHx8IGRlZmluZWQoQ09ORklHX1RSQUNJTkcpCmRpZmYgLS1naXQgYS9tbS9zbHViLmMgYi9tbS9zbHViLmMKaW5kZXggYTJmZTE3Mi4uMDA4Y2Q3NCAxMDA2NDQKLS0tIGEvbW0vc2x1Yi5jCisrKyBiL21tL3NsdWIuYwpAQCAtMjgsNiArMjgsOCBAQAogI2luY2x1ZGUgPGxpbnV4L21hdGg2NC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZhdWx0LWluamVjdC5oPgogCisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2ttZW0uaD4KKwogLyoKICAqIExvY2sgb3JkZXI6CiAgKiAgIDEuIHNsYWJfbG9jayhwYWdlKQpAQCAtMTc3NCwxMSArMTc3NiwyMSBAQAogRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX2FsbG9jKTsKIAogI2lmZGVmIENPTkZJR19UUkFDSU5HCi12b2lkICprbWVtX2NhY2hlX2FsbG9jX25vdHJhY2Uoc3RydWN0IGttZW1fY2FjaGUgKnMsIGdmcF90IGdmcGZsYWdzKQordm9pZCAqa21lbV9jYWNoZV9hbGxvY190cmFjZShzdHJ1Y3Qga21lbV9jYWNoZSAqcywgZ2ZwX3QgZ2ZwZmxhZ3MsIHNpemVfdCBzaXplKQogewotCXJldHVybiBzbGFiX2FsbG9jKHMsIGdmcGZsYWdzLCBOVU1BX05PX05PREUsIF9SRVRfSVBfKTsKKwl2b2lkICpyZXQgPSBzbGFiX2FsbG9jKHMsIGdmcGZsYWdzLCBOVU1BX05PX05PREUsIF9SRVRfSVBfKTsKKwl0cmFjZV9rbWFsbG9jKF9SRVRfSVBfLCByZXQsIHNpemUsIHMtPnNpemUsIGdmcGZsYWdzKTsKKwlyZXR1cm4gcmV0OwogfQotRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX2FsbG9jX25vdHJhY2UpOworRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX2FsbG9jX3RyYWNlKTsKKwordm9pZCAqa21hbGxvY19vcmRlcl90cmFjZShzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MsIHVuc2lnbmVkIGludCBvcmRlcikKK3sKKwl2b2lkICpyZXQgPSBrbWFsbG9jX29yZGVyKHNpemUsIGZsYWdzLCBvcmRlcik7CisJdHJhY2Vfa21hbGxvYyhfUkVUX0lQXywgcmV0LCBzaXplLCBQQUdFX1NJWkUgPDwgb3JkZXIsIGZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChrbWFsbG9jX29yZGVyX3RyYWNlKTsKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX05VTUEKQEAgLTE3OTQsMTMgKzE4MDYsMTcgQEAKIEVYUE9SVF9TWU1CT0woa21lbV9jYWNoZV9hbGxvY19ub2RlKTsKIAogI2lmZGVmIENPTkZJR19UUkFDSU5HCi12b2lkICprbWVtX2NhY2hlX2FsbG9jX25vZGVfbm90cmFjZShzdHJ1Y3Qga21lbV9jYWNoZSAqcywKK3ZvaWQgKmttZW1fY2FjaGVfYWxsb2Nfbm9kZV90cmFjZShzdHJ1Y3Qga21lbV9jYWNoZSAqcywKIAkJCQkgICAgZ2ZwX3QgZ2ZwZmxhZ3MsCi0JCQkJICAgIGludCBub2RlKQorCQkJCSAgICBpbnQgbm9kZSwgc2l6ZV90IHNpemUpCiB7Ci0JcmV0dXJuIHNsYWJfYWxsb2MocywgZ2ZwZmxhZ3MsIG5vZGUsIF9SRVRfSVBfKTsKKwl2b2lkICpyZXQgPSBzbGFiX2FsbG9jKHMsIGdmcGZsYWdzLCBub2RlLCBfUkVUX0lQXyk7CisKKwl0cmFjZV9rbWFsbG9jX25vZGUoX1JFVF9JUF8sIHJldCwKKwkJCSAgIHNpemUsIHMtPnNpemUsIGdmcGZsYWdzLCBub2RlKTsKKwlyZXR1cm4gcmV0OwogfQotRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX2FsbG9jX25vZGVfbm90cmFjZSk7CitFWFBPUlRfU1lNQk9MKGttZW1fY2FjaGVfYWxsb2Nfbm9kZV90cmFjZSk7CiAjZW5kaWYKICNlbmRpZgogCmRpZmYgLS1naXQgYS9zY3JpcHRzLy5naXRpZ25vcmUgYi9zY3JpcHRzLy5naXRpZ25vcmUKaW5kZXggYzVkNWRiNS4uZTI3NDFkMiAxMDA2NDQKLS0tIGEvc2NyaXB0cy8uZ2l0aWdub3JlCisrKyBiL3NjcmlwdHMvLmdpdGlnbm9yZQpAQCAtNywzICs3LDQgQEAKIGJpbjJjCiB1bmlmZGVmCiBpaGV4MmZ3CityZWNvcmRtY291bnQKZGlmZiAtLWdpdCBhL3NjcmlwdHMvTWFrZWZpbGUubGliIGIvc2NyaXB0cy9NYWtlZmlsZS5saWIKaW5kZXggNGM3MmMxMS4uMzk2ZGExNiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9NYWtlZmlsZS5saWIKKysrIGIvc2NyaXB0cy9NYWtlZmlsZS5saWIKQEAgLTIwMCw2ICsyMDAsMjkgQEAKIGNtZF9nemlwID0gKGNhdCAkKGZpbHRlci1vdXQgRk9SQ0UsJF4pIHwgZ3ppcCAtZiAtOSA+ICRAKSB8fCBcCiAJKHJtIC1mICRAIDsgZmFsc2UpCiAKKyMgRFRDCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIEdlbmVyYXRlIGFuIGFzc2VtYmx5IGZpbGUgdG8gd3JhcCB0aGUgb3V0cHV0IG9mIHRoZSBkZXZpY2UgdHJlZSBjb21waWxlcgorcXVpZXRfY21kX2R0X1NfZHRiPSBEVEIgICAgJEAKK2NtZF9kdF9TX2R0Yj0JCQkJCQlcCisoCQkJCQkJCVwKKwllY2hvICdcI2luY2x1ZGUgPGFzbS1nZW5lcmljL3ZtbGludXgubGRzLmg+JzsgCVwKKwllY2hvICcuc2VjdGlvbiAuZHRiLmluaXQucm9kYXRhLCJhIic7CQlcCisJZWNobyAnLmJhbGlnbiBTVFJVQ1RfQUxJR05NRU5UJzsJCVwKKwllY2hvICcuZ2xvYmFsIF9fZHRiXyQoKkYpX2JlZ2luJzsJCVwKKwllY2hvICdfX2R0Yl8kKCpGKV9iZWdpbjonOwkJCVwKKwllY2hvICcuaW5jYmluICIkPCIgJzsJCQkJXAorCWVjaG8gJ19fZHRiXyQoKkYpX2VuZDonOwkJCVwKKwllY2hvICcuZ2xvYmFsIF9fZHRiXyQoKkYpX2VuZCc7CQkJXAorCWVjaG8gJy5iYWxpZ24gU1RSVUNUX0FMSUdOTUVOVCc7IAkJXAorKSA+ICRACisKKyQob2JqKS8lLmR0Yi5TOiAkKG9iaikvJS5kdGIKKwkkKGNhbGwgY21kLGR0X1NfZHRiKQorCitxdWlldF9jbWRfZHRjID0gRFRDICAgICAkQAorY21kX2R0YyA9ICQob2JqdHJlZSkvc2NyaXB0cy9kdGMvZHRjIC1PIGR0YiAtbyAkQCAtYiAwICQoRFRDX0ZMQUdTKSAkPAogCiAjIEJ6aXAyCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9iYXNpYy9maXhkZXAuYyBiL3NjcmlwdHMvYmFzaWMvZml4ZGVwLmMKaW5kZXggZWEyNmIyMy4uYzlhMTZhYiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9iYXNpYy9maXhkZXAuYworKysgYi9zY3JpcHRzL2Jhc2ljL2ZpeGRlcC5jCkBAIC0xMzgsMzggKzEzOCwzNiBAQAogCXByaW50ZigiY21kXyVzIDo9ICVzXG5cbiIsIHRhcmdldCwgY21kbGluZSk7CiB9CiAKLWNoYXIgKiBzdHJfY29uZmlnICA9IE5VTEw7Ci1pbnQgICAgc2l6ZV9jb25maWcgPSAwOwotaW50ICAgIGxlbl9jb25maWcgID0gMDsKK3N0cnVjdCBpdGVtIHsKKwlzdHJ1Y3QgaXRlbQkqbmV4dDsKKwl1bnNpZ25lZCBpbnQJbGVuOworCXVuc2lnbmVkIGludAloYXNoOworCWNoYXIJCW5hbWVbMF07Cit9OwogCi0vKgotICogR3JvdyB0aGUgY29uZmlndXJhdGlvbiBzdHJpbmcgdG8gYSBkZXNpcmVkIGxlbmd0aC4KLSAqIFVzdWFsbHkgdGhlIGZpcnN0IGdyb3d0aCBpcyBwbGVudHkuCi0gKi8KLXN0YXRpYyB2b2lkIGdyb3dfY29uZmlnKGludCBsZW4pCisjZGVmaW5lIEhBU0hTWiAyNTYKK3N0YXRpYyBzdHJ1Y3QgaXRlbSAqaGFzaHRhYltIQVNIU1pdOworCitzdGF0aWMgdW5zaWduZWQgaW50IHN0cmhhc2goY29uc3QgY2hhciAqc3RyLCB1bnNpZ25lZCBpbnQgc3opCiB7Ci0Jd2hpbGUgKGxlbl9jb25maWcgKyBsZW4gPiBzaXplX2NvbmZpZykgewotCQlpZiAoc2l6ZV9jb25maWcgPT0gMCkKLQkJCXNpemVfY29uZmlnID0gMjA0ODsKLQkJc3RyX2NvbmZpZyA9IHJlYWxsb2Moc3RyX2NvbmZpZywgc2l6ZV9jb25maWcgKj0gMik7Ci0JCWlmIChzdHJfY29uZmlnID09IE5VTEwpCi0JCQl7IHBlcnJvcigiZml4ZGVwOm1hbGxvYyIpOyBleGl0KDEpOyB9Ci0JfQorCS8qIGZudjMyIGhhc2ggKi8KKwl1bnNpZ25lZCBpbnQgaSwgaGFzaCA9IDIxNjYxMzYyNjFVOworCisJZm9yIChpID0gMDsgaSA8IHN6OyBpKyspCisJCWhhc2ggPSAoaGFzaCBeIHN0cltpXSkgKiAweDAxMDAwMTkzOworCXJldHVybiBoYXNoOwogfQogCi0KLQogLyoKICAqIExvb2t1cCBhIHZhbHVlIGluIHRoZSBjb25maWd1cmF0aW9uIHN0cmluZy4KICAqLwotc3RhdGljIGludCBpc19kZWZpbmVkX2NvbmZpZyhjb25zdCBjaGFyICogbmFtZSwgaW50IGxlbikKK3N0YXRpYyBpbnQgaXNfZGVmaW5lZF9jb25maWcoY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbiwgdW5zaWduZWQgaW50IGhhc2gpCiB7Ci0JY29uc3QgY2hhciAqIHBjb25maWc7Ci0JY29uc3QgY2hhciAqIHBsYXN0ID0gc3RyX2NvbmZpZyArIGxlbl9jb25maWcgLSBsZW47Ci0JZm9yICggcGNvbmZpZyA9IHN0cl9jb25maWcgKyAxOyBwY29uZmlnIDwgcGxhc3Q7IHBjb25maWcrKyApIHsKLQkJaWYgKHBjb25maWdbIC0xXSA9PSAnXG4nCi0JCSYmICBwY29uZmlnW2xlbl0gPT0gJ1xuJwotCQkmJiAgIW1lbWNtcChwY29uZmlnLCBuYW1lLCBsZW4pKQorCXN0cnVjdCBpdGVtICphdXg7CisKKwlmb3IgKGF1eCA9IGhhc2h0YWJbaGFzaCAlIEhBU0hTWl07IGF1eDsgYXV4ID0gYXV4LT5uZXh0KSB7CisJCWlmIChhdXgtPmhhc2ggPT0gaGFzaCAmJiBhdXgtPmxlbiA9PSBsZW4gJiYKKwkJICAgIG1lbWNtcChhdXgtPm5hbWUsIG5hbWUsIGxlbikgPT0gMCkKIAkJCXJldHVybiAxOwogCX0KIAlyZXR1cm4gMDsKQEAgLTE3OCwxMyArMTc2LDE5IEBACiAvKgogICogQWRkIGEgbmV3IHZhbHVlIHRvIHRoZSBjb25maWd1cmF0aW9uIHN0cmluZy4KICAqLwotc3RhdGljIHZvaWQgZGVmaW5lX2NvbmZpZyhjb25zdCBjaGFyICogbmFtZSwgaW50IGxlbikKK3N0YXRpYyB2b2lkIGRlZmluZV9jb25maWcoY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbiwgdW5zaWduZWQgaW50IGhhc2gpCiB7Ci0JZ3Jvd19jb25maWcobGVuICsgMSk7CisJc3RydWN0IGl0ZW0gKmF1eCA9IG1hbGxvYyhzaXplb2YoKmF1eCkgKyBsZW4pOwogCi0JbWVtY3B5KHN0cl9jb25maWcrbGVuX2NvbmZpZywgbmFtZSwgbGVuKTsKLQlsZW5fY29uZmlnICs9IGxlbjsKLQlzdHJfY29uZmlnW2xlbl9jb25maWcrK10gPSAnXG4nOworCWlmICghYXV4KSB7CisJCXBlcnJvcigiZml4ZGVwOm1hbGxvYyIpOworCQlleGl0KDEpOworCX0KKwltZW1jcHkoYXV4LT5uYW1lLCBuYW1lLCBsZW4pOworCWF1eC0+bGVuID0gbGVuOworCWF1eC0+aGFzaCA9IGhhc2g7CisJYXV4LT5uZXh0ID0gaGFzaHRhYltoYXNoICUgSEFTSFNaXTsKKwloYXNodGFiW2hhc2ggJSBIQVNIU1pdID0gYXV4OwogfQogCiAvKgpAQCAtMTkyLDQwICsxOTYsNDkgQEAKICAqLwogc3RhdGljIHZvaWQgY2xlYXJfY29uZmlnKHZvaWQpCiB7Ci0JbGVuX2NvbmZpZyA9IDA7Ci0JZGVmaW5lX2NvbmZpZygiIiwgMCk7CisJc3RydWN0IGl0ZW0gKmF1eCwgKm5leHQ7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSEFTSFNaOyBpKyspIHsKKwkJZm9yIChhdXggPSBoYXNodGFiW2ldOyBhdXg7IGF1eCA9IG5leHQpIHsKKwkJCW5leHQgPSBhdXgtPm5leHQ7CisJCQlmcmVlKGF1eCk7CisJCX0KKwkJaGFzaHRhYltpXSA9IE5VTEw7CisJfQogfQogCiAvKgogICogUmVjb3JkIHRoZSB1c2Ugb2YgYSBDT05GSUdfKiB3b3JkLgogICovCi1zdGF0aWMgdm9pZCB1c2VfY29uZmlnKGNoYXIgKm0sIGludCBzbGVuKQorc3RhdGljIHZvaWQgdXNlX2NvbmZpZyhjb25zdCBjaGFyICptLCBpbnQgc2xlbikKIHsKLQljaGFyIHNbUEFUSF9NQVhdOwotCWNoYXIgKnA7CisJdW5zaWduZWQgaW50IGhhc2ggPSBzdHJoYXNoKG0sIHNsZW4pOworCWludCBjLCBpOwogCi0JaWYgKGlzX2RlZmluZWRfY29uZmlnKG0sIHNsZW4pKQorCWlmIChpc19kZWZpbmVkX2NvbmZpZyhtLCBzbGVuLCBoYXNoKSkKIAkgICAgcmV0dXJuOwogCi0JZGVmaW5lX2NvbmZpZyhtLCBzbGVuKTsKKwlkZWZpbmVfY29uZmlnKG0sIHNsZW4sIGhhc2gpOwogCi0JbWVtY3B5KHMsIG0sIHNsZW4pOyBzW3NsZW5dID0gMDsKLQotCWZvciAocCA9IHM7IHAgPCBzICsgc2xlbjsgcCsrKSB7Ci0JCWlmICgqcCA9PSAnXycpCi0JCQkqcCA9ICcvJzsKKwlwcmludGYoIiAgICAkKHdpbGRjYXJkIGluY2x1ZGUvY29uZmlnLyIpOworCWZvciAoaSA9IDA7IGkgPCBzbGVuOyBpKyspIHsKKwkJYyA9IG1baV07CisJCWlmIChjID09ICdfJykKKwkJCWMgPSAnLyc7CiAJCWVsc2UKLQkJCSpwID0gdG9sb3dlcigoaW50KSpwKTsKKwkJCWMgPSB0b2xvd2VyKGMpOworCQlwdXRjaGFyKGMpOwogCX0KLQlwcmludGYoIiAgICAkKHdpbGRjYXJkIGluY2x1ZGUvY29uZmlnLyVzLmgpIFxcXG4iLCBzKTsKKwlwcmludGYoIi5oKSBcXFxuIik7CiB9CiAKLXN0YXRpYyB2b2lkIHBhcnNlX2NvbmZpZ19maWxlKGNoYXIgKm1hcCwgc2l6ZV90IGxlbikKK3N0YXRpYyB2b2lkIHBhcnNlX2NvbmZpZ19maWxlKGNvbnN0IGNoYXIgKm1hcCwgc2l6ZV90IGxlbikKIHsKLQlpbnQgKmVuZCA9IChpbnQgKikgKG1hcCArIGxlbik7CisJY29uc3QgaW50ICplbmQgPSAoY29uc3QgaW50ICopIChtYXAgKyBsZW4pOwogCS8qIHN0YXJ0IGF0ICsxLCBzbyB0aGF0IHAgY2FuIG5ldmVyIGJlIDwgbWFwICovCi0JaW50ICptICAgPSAoaW50ICopIG1hcCArIDE7Ci0JY2hhciAqcCwgKnE7CisJY29uc3QgaW50ICptICAgPSAoY29uc3QgaW50ICopIG1hcCArIDE7CisJY29uc3QgY2hhciAqcCwgKnE7CiAKIAlmb3IgKDsgbSA8IGVuZDsgbSsrKSB7CiAJCWlmICgqbSA9PSBJTlRfQ09ORikgeyBwID0gKGNoYXIgKikgbSAgOyBnb3RvIGNvbmY7IH0KQEAgLTI2NSw3ICsyNzgsNyBAQAogCXJldHVybiBtZW1jbXAocyArIHNsZW4gLSBzdWJsZW4sIHN1Yiwgc3VibGVuKTsKIH0KIAotc3RhdGljIHZvaWQgZG9fY29uZmlnX2ZpbGUoY2hhciAqZmlsZW5hbWUpCitzdGF0aWMgdm9pZCBkb19jb25maWdfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSkKIHsKIAlzdHJ1Y3Qgc3RhdCBzdDsKIAlpbnQgZmQ7CkBAIC0yNzMsNyArMjg2LDcgQEAKIAogCWZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOwogCWlmIChmZCA8IDApIHsKLQkJZnByaW50ZihzdGRlcnIsICJmaXhkZXA6ICIpOworCQlmcHJpbnRmKHN0ZGVyciwgImZpeGRlcDogZXJyb3Igb3BlbmluZyBjb25maWcgZmlsZTogIik7CiAJCXBlcnJvcihmaWxlbmFtZSk7CiAJCWV4aXQoMik7CiAJfQpAQCAtMzQ0LDExICszNTcsMTUgQEAKIAogCWZkID0gb3BlbihkZXBmaWxlLCBPX1JET05MWSk7CiAJaWYgKGZkIDwgMCkgewotCQlmcHJpbnRmKHN0ZGVyciwgImZpeGRlcDogIik7CisJCWZwcmludGYoc3RkZXJyLCAiZml4ZGVwOiBlcnJvciBvcGVuaW5nIGRlcGZpbGU6ICIpOwogCQlwZXJyb3IoZGVwZmlsZSk7CiAJCWV4aXQoMik7CiAJfQotCWZzdGF0KGZkLCAmc3QpOworCWlmIChmc3RhdChmZCwgJnN0KSA8IDApIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImZpeGRlcDogZXJyb3IgZnN0YXQnaW5nIGRlcGZpbGU6ICIpOworICAgICAgICAgICAgICAgIHBlcnJvcihkZXBmaWxlKTsKKyAgICAgICAgICAgICAgICBleGl0KDIpOworICAgICAgICB9CiAJaWYgKHN0LnN0X3NpemUgPT0gMCkgewogCQlmcHJpbnRmKHN0ZGVyciwiZml4ZGVwOiAlcyBpcyBlbXB0eVxuIixkZXBmaWxlKTsKIAkJY2xvc2UoZmQpOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jaGVja3N5c2NhbGxzLnNoIGIvc2NyaXB0cy9jaGVja3N5c2NhbGxzLnNoCmluZGV4IDZiYjQyZTcuLjNhYjMxNmUgMTAwNzU1Ci0tLSBhL3NjcmlwdHMvY2hlY2tzeXNjYWxscy5zaAorKysgYi9zY3JpcHRzL2NoZWNrc3lzY2FsbHMuc2gKQEAgLTYsNyArNiw3IEBACiAjIGFuZCBsaXN0ZWQgYmVsb3cgc28gdGhleSBhcmUgaWdub3JlZC4KICMKICMgVXNhZ2U6Ci0jIHN5c2NhbGxjaGsgZ2NjIGdjYy1vcHRpb25zCisjIGNoZWNrc3lzY2FsbHMuc2ggZ2NjIGdjYy1vcHRpb25zCiAjCiAKIGlnbm9yZV9saXN0KCkgewpAQCAtMjA0LDUgKzIwNCw1IEBACiBcI2VuZGlmL3AnICQxCiB9CiAKLShpZ25vcmVfbGlzdCAmJiBzeXNjYWxsX2xpc3QgJHtzcmN0cmVlfS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91bmlzdGRfMzIuaCkgfCBcCisoaWdub3JlX2xpc3QgJiYgc3lzY2FsbF9saXN0ICQoZGlybmFtZSAkMCkvLi4vYXJjaC94ODYvaW5jbHVkZS9hc20vdW5pc3RkXzMyLmgpIHwgXAogJCogLUUgLXggYyAtID4gL2Rldi9udWxsCmRpZmYgLS1naXQgYS9zY3JpcHRzL2NvY2NpbmVsbGUvbWlzYy9kb3VibGVpbml0LmNvY2NpIGIvc2NyaXB0cy9jb2NjaW5lbGxlL21pc2MvZG91YmxlaW5pdC5jb2NjaQppbmRleCA1NWQ3ZGMxLi4xNTZiMjBhIDEwMDY0NAotLS0gYS9zY3JpcHRzL2NvY2NpbmVsbGUvbWlzYy9kb3VibGVpbml0LmNvY2NpCisrKyBiL3NjcmlwdHMvY29jY2luZWxsZS9taXNjL2RvdWJsZWluaXQuY29jY2kKQEAgLTcsNyArNyw3IEBACiAvLyBDb3B5cmlnaHQ6IChDKSAyMDEwIEp1bGlhIExhd2FsbCwgRElLVS4gIEdQTHYyLgogLy8gQ29weXJpZ2h0OiAoQykgMjAxMCBHaWxsZXMgTXVsbGVyLCBJTlJJQS9MaVA2LiAgR1BMdjIuCiAvLyBVUkw6IGh0dHA6Ly9jb2NjaW5lbGxlLmxpcDYuZnIvCi0vLyBDb21tZW50czoKKy8vIENvbW1lbnRzOiByZXF1aXJlcyBhdCBsZWFzdCBDb2NjaW5lbGxlIDAuMi40LCBsZXggb3IgcGFyc2UgZXJyb3Igb3RoZXJ3aXNlCiAvLyBPcHRpb25zOiAtbm9faW5jbHVkZXMgLWluY2x1ZGVfaGVhZGVycwogCiB2aXJ0dWFsIG9yZwpAQCAtMTksNyArMTksNyBAQAogZXhwcmVzc2lvbiBFOwogQEAKIAotc3RydWN0IEkgcyA9QHAwIHsgLi4uIC5mbGRAcCA9IEUsIC4uLn07CitzdHJ1Y3QgSSBzID1AcDAgeyAuLi4sIC5mbGRAcCA9IEUsIC4uLn07CiAKIEBzQAogaWRlbnRpZmllciBJLCBzLCByLmZsZDsKQEAgLTI3LDcgKzI3LDcgQEAKIGV4cHJlc3Npb24gRTsKIEBACiAKLXN0cnVjdCBJIHMgPUBwMCB7IC4uLiAuZmxkQHAgPSBFLCAuLi59Oworc3RydWN0IEkgcyA9QHAwIHsgLi4uLCAuZmxkQHAgPSBFLCAuLi59OwogCiBAc2NyaXB0OnB5dGhvbiBkZXBlbmRzIG9uIG9yZ0AKIHAwIDw8IHIucDA7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2NvY2NpbmVsbGUvbnVsbC9kZXJlZl9udWxsLmNvY2NpIGIvc2NyaXB0cy9jb2NjaW5lbGxlL251bGwvZGVyZWZfbnVsbC5jb2NjaQppbmRleCA5OTY5ZDc2Li5jZGFjNmNmIDEwMDY0NAotLS0gYS9zY3JpcHRzL2NvY2NpbmVsbGUvbnVsbC9kZXJlZl9udWxsLmNvY2NpCisrKyBiL3NjcmlwdHMvY29jY2luZWxsZS9udWxsL2RlcmVmX251bGwuY29jY2kKQEAgLTExLDIxICsxMSwxMCBAQAogLy8gT3B0aW9uczoKIAogdmlydHVhbCBjb250ZXh0Ci12aXJ0dWFsIHBhdGNoCiB2aXJ0dWFsIG9yZwogdmlydHVhbCByZXBvcnQKIAotQGluaXRpYWxpemU6cHl0aG9uIGRlcGVuZHMgb24gIWNvbnRleHQgJiYgcGF0Y2ggJiYgIW9yZyAmJiAhcmVwb3J0QAotCi1pbXBvcnQgc3lzCi1wcmludCA+PiBzeXMuc3RkZXJyLCAiVGhpcyBzZW1hbnRpYyBwYXRjaCBkb2VzIG5vdCBzdXBwb3J0IHRoZSAncGF0Y2gnIG1vZGUuIgotCi1AZGVwZW5kcyBvbiBwYXRjaEAKLUBACi0KLXRoaXNfcnVsZV9zaG91bGRfbmV2ZXJfbWF0Y2hlcygpOwotCi1AaWZtIGRlcGVuZHMgb24gIXBhdGNoQAorQGlmbUAKIGV4cHJlc3Npb24gKkU7CiBzdGF0ZW1lbnQgUzEsUzI7CiBwb3NpdGlvbiBwMTsKQEAgLTM1LDcgKzI0LDcgQEAKIAogLy8gVGhlIGZvbGxvd2luZyB0d28gcnVsZXMgYXJlIHNlcGFyYXRlLCBiZWNhdXNlIGJvdGggY2FuIG1hdGNoIGEgc2luZ2xlCiAvLyBleHByZXNzaW9uIGluIGRpZmZlcmVudCB3YXlzCi1AcHIxIGRlcGVuZHMgb24gIXBhdGNoIGV4cHJlc3Npb25ACitAcHIxIGV4cHJlc3Npb25ACiBleHByZXNzaW9uICppZm0uRTsKIGlkZW50aWZpZXIgZjsKIHBvc2l0aW9uIHAxOwpAQCAtNDMsNyArMzIsNyBAQAogCiAgKEUgIT0gTlVMTCAmJiAuLi4pID8gPCsuLi5FLT5mQHAxLi4uKz4gOiAuLi4KIAotQHByMiBkZXBlbmRzIG9uICFwYXRjaCBleHByZXNzaW9uQAorQHByMiBleHByZXNzaW9uQAogZXhwcmVzc2lvbiAqaWZtLkU7CiBpZGVudGlmaWVyIGY7CiBwb3NpdGlvbiBwMjsKQEAgLTU5LDcgKzQ4LDcgQEAKIAogLy8gRm9yIG9yZyBhbmQgcmVwb3J0IG1vZGVzCiAKLUByIGRlcGVuZHMgb24gIWNvbnRleHQgJiYgIXBhdGNoICYmIChvcmcgfHwgcmVwb3J0KSBleGlzdHNACitAciBkZXBlbmRzIG9uICFjb250ZXh0ICYmIChvcmcgfHwgcmVwb3J0KSBleGlzdHNACiBleHByZXNzaW9uIHN1YkUgPD0gaWZtLkU7CiBleHByZXNzaW9uICppZm0uRTsKIGV4cHJlc3Npb24gRTEsRTI7CkBAIC05OSw3ICs4OCw3IEBACiB9CiBlbHNlIFMzCiAKLUBzY3JpcHQ6cHl0aG9uIGRlcGVuZHMgb24gIWNvbnRleHQgJiYgIXBhdGNoICYmICFvcmcgJiYgcmVwb3J0QAorQHNjcmlwdDpweXRob24gZGVwZW5kcyBvbiAhY29udGV4dCAmJiAhb3JnICYmIHJlcG9ydEAKIHAgPDwgci5wOwogcDEgPDwgaWZtLnAxOwogeCA8PCBpZm0uRTsKQEAgLTEwOSw3ICs5OCw3IEBACiBjb2NjaWxpYi5yZXBvcnQucHJpbnRfcmVwb3J0KHBbMF0sIG1zZykKIGNvY2NpLmluY2x1ZGVfbWF0Y2goRmFsc2UpCiAKLUBzY3JpcHQ6cHl0aG9uIGRlcGVuZHMgb24gIWNvbnRleHQgJiYgIXBhdGNoICYmIG9yZyAmJiAhcmVwb3J0QAorQHNjcmlwdDpweXRob24gZGVwZW5kcyBvbiAhY29udGV4dCAmJiBvcmcgJiYgIXJlcG9ydEAKIHAgPDwgci5wOwogcDEgPDwgaWZtLnAxOwogeCA8PCBpZm0uRTsKQEAgLTEyMCw3ICsxMDksNyBAQAogY29jY2kucHJpbnRfbWFpbihtc2dfc2FmZSxwKQogY29jY2kuaW5jbHVkZV9tYXRjaChGYWxzZSkKIAotQHMgZGVwZW5kcyBvbiAhY29udGV4dCAmJiAhcGF0Y2ggJiYgKG9yZyB8fCByZXBvcnQpIGV4aXN0c0AKK0BzIGRlcGVuZHMgb24gIWNvbnRleHQgJiYgKG9yZyB8fCByZXBvcnQpIGV4aXN0c0AKIGV4cHJlc3Npb24gc3ViRSA8PSBpZm0uRTsKIGV4cHJlc3Npb24gKmlmbS5FOwogZXhwcmVzc2lvbiBFMSxFMjsKQEAgLTE1OSw3ICsxNDgsNyBAQAogfQogZWxzZSBTMwogCi1Ac2NyaXB0OnB5dGhvbiBkZXBlbmRzIG9uICFjb250ZXh0ICYmICFwYXRjaCAmJiAhb3JnICYmIHJlcG9ydEAKK0BzY3JpcHQ6cHl0aG9uIGRlcGVuZHMgb24gIWNvbnRleHQgJiYgIW9yZyAmJiByZXBvcnRACiBwIDw8IHMucDsKIHAxIDw8IGlmbS5wMTsKIHggPDwgaWZtLkU7CkBAIC0xNjgsNyArMTU3LDcgQEAKIG1zZz0iRVJST1I6ICVzIGlzIE5VTEwgYnV0IGRlcmVmZXJlbmNlZC4iICUgKHgpCiBjb2NjaWxpYi5yZXBvcnQucHJpbnRfcmVwb3J0KHBbMF0sIG1zZykKIAotQHNjcmlwdDpweXRob24gZGVwZW5kcyBvbiAhY29udGV4dCAmJiAhcGF0Y2ggJiYgb3JnICYmICFyZXBvcnRACitAc2NyaXB0OnB5dGhvbiBkZXBlbmRzIG9uICFjb250ZXh0ICYmIG9yZyAmJiAhcmVwb3J0QAogcCA8PCBzLnA7CiBwMSA8PCBpZm0ucDE7CiB4IDw8IGlmbS5FOwpAQCAtMTgwLDcgKzE2OSw3IEBACiAKIC8vIEZvciBjb250ZXh0IG1vZGUKIAotQGRlcGVuZHMgb24gY29udGV4dCAmJiAhcGF0Y2ggJiYgIW9yZyAmJiAhcmVwb3J0IGV4aXN0c0AKK0BkZXBlbmRzIG9uIGNvbnRleHQgJiYgIW9yZyAmJiAhcmVwb3J0IGV4aXN0c0AKIGV4cHJlc3Npb24gc3ViRSA8PSBpZm0uRTsKIGV4cHJlc3Npb24gKmlmbS5FOwogZXhwcmVzc2lvbiBFMSxFMjsKQEAgLTIyMyw3ICsyMTIsNyBAQAogLy8gVGhlIGZvbGxvd2luZyB0aHJlZSBydWxlcyBhcmUgZHVwbGljYXRlcyBvZiBpZm0sIHByMSBhbmQgcHIyIHJlc3BlY3RpdmVseS4KIC8vIEl0IGlzIG5lZWQgYmVjYXVzZSB0aGUgcHJldmlvdXMgcnVsZSBhcyBhbHJlYWR5IG1hZGUgYSAiY2hhbmdlIi4KIAotQGlmbTEgZGVwZW5kcyBvbiAhcGF0Y2hACitAaWZtMUAKIGV4cHJlc3Npb24gKkU7CiBzdGF0ZW1lbnQgUzEsUzI7CiBwb3NpdGlvbiBwMTsKQEAgLTIzMSw3ICsyMjAsNyBAQAogCiBpZkBwMSAoKEUgPT0gTlVMTCAmJiAuLi4pIHx8IC4uLikgUzEgZWxzZSBTMgogCi1AcHIxMSBkZXBlbmRzIG9uICFwYXRjaCBleHByZXNzaW9uQAorQHByMTEgZXhwcmVzc2lvbkAKIGV4cHJlc3Npb24gKmlmbTEuRTsKIGlkZW50aWZpZXIgZjsKIHBvc2l0aW9uIHAxOwpAQCAtMjM5LDcgKzIyOCw3IEBACiAKICAoRSAhPSBOVUxMICYmIC4uLikgPyA8Ky4uLkUtPmZAcDEuLi4rPiA6IC4uLgogCi1AcHIxMiBkZXBlbmRzIG9uICFwYXRjaCBleHByZXNzaW9uQAorQHByMTIgZXhwcmVzc2lvbkAKIGV4cHJlc3Npb24gKmlmbTEuRTsKIGlkZW50aWZpZXIgZjsKIHBvc2l0aW9uIHAyOwpAQCAtMjUzLDcgKzI0Miw3IEBACiAgc2l6ZW9mKDwrLi4uRS0+ZkBwMi4uLis+KQogKQogCi1AZGVwZW5kcyBvbiBjb250ZXh0ICYmICFwYXRjaCAmJiAhb3JnICYmICFyZXBvcnQgZXhpc3RzQAorQGRlcGVuZHMgb24gY29udGV4dCAmJiAhb3JnICYmICFyZXBvcnQgZXhpc3RzQAogZXhwcmVzc2lvbiBzdWJFIDw9IGlmbTEuRTsKIGV4cHJlc3Npb24gKmlmbTEuRTsKIGV4cHJlc3Npb24gRTEsRTI7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2NvbmZpZyBiL3NjcmlwdHMvY29uZmlnCmluZGV4IDYwOGQ3ZmQuLmE3YzdjNGIgMTAwNzU1Ci0tLSBhL3NjcmlwdHMvY29uZmlnCisrKyBiL3NjcmlwdHMvY29uZmlnCkBAIC0xMCw4ICsxMCwxMCBAQAogCS0tZW5hYmxlfC1lIG9wdGlvbiAgIEVuYWJsZSBvcHRpb24KIAktLWRpc2FibGV8LWQgb3B0aW9uICBEaXNhYmxlIG9wdGlvbgogCS0tbW9kdWxlfC1tIG9wdGlvbiAgIFR1cm4gb3B0aW9uIGludG8gYSBtb2R1bGUKLQktLXNldC1zdHIgb3B0aW9uIHZhbHVlCi0JICAgICAgICAgICAgICAgICAgICAgU2V0IG9wdGlvbiB0byAidmFsdWUiCisJLS1zZXQtc3RyIG9wdGlvbiBzdHJpbmcKKwkgICAgICAgICAgICAgICAgICAgICBTZXQgb3B0aW9uIHRvICJzdHJpbmciCisJLS1zZXQtdmFsIG9wdGlvbiB2YWx1ZQorCSAgICAgICAgICAgICAgICAgICAgIFNldCBvcHRpb24gdG8gdmFsdWUKIAktLXN0YXRlfC1zIG9wdGlvbiAgICBQcmludCBzdGF0ZSBvZiBvcHRpb24gKG4seSxtLHVuZGVmKQogCiAJLS1lbmFibGUtYWZ0ZXJ8LUUgYmVmb3Jlb3B0IG9wdGlvbgpAQCAtODYsNyArODgsNyBAQAogCQlCPSRBUkcKIAkJc2hpZnQgMgogCQk7OwotCS0tKikKKwktKikKIAkJY2hlY2thcmcgIiQxIgogCQlzaGlmdAogCQk7OwpAQCAtMTA5LDYgKzExMSwxMSBAQAogCQlzaGlmdAogCQk7OwogCisJLS1zZXQtdmFsKQorCQlzZXRfdmFyICJDT05GSUdfJEFSRyIgIkNPTkZJR18kQVJHPSQxIgorCQlzaGlmdAorCQk7OworCiAJLS1zdGF0ZXwtcykKIAkJaWYgZ3JlcCAtcSAiIyBDT05GSUdfJEFSRyBpcyBub3Qgc2V0IiAkRk4gOyB0aGVuCiAJCQllY2hvIG4KZGlmZiAtLWdpdCBhL3NjcmlwdHMvZHRjL01ha2VmaWxlIGIvc2NyaXB0cy9kdGMvTWFrZWZpbGUKaW5kZXggMDFjZGIzNi4uMDRhMzFjMSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9kdGMvTWFrZWZpbGUKKysrIGIvc2NyaXB0cy9kdGMvTWFrZWZpbGUKQEAgLTQsNyArNCw3IEBACiBhbHdheXMJCTo9ICQoaG9zdHByb2dzLXkpCiAKIGR0Yy1vYmpzCTo9IGR0Yy5vIGZsYXR0cmVlLm8gZnN0cmVlLm8gZGF0YS5vIGxpdmV0cmVlLm8gdHJlZXNvdXJjZS5vIFwKLQkJICAgc3JjcG9zLm8gY2hlY2tzLm8KKwkJICAgc3JjcG9zLm8gY2hlY2tzLm8gdXRpbC5vCiBkdGMtb2JqcwkrPSBkdGMtbGV4ZXIubGV4Lm8gZHRjLXBhcnNlci50YWIubwogCiAjIFNvdXJjZSBmaWxlcyBuZWVkIHRvIGdldCBhdCB0aGUgdXNlcnNwYWNlIHZlcnNpb24gb2YgbGliZmR0X2Vudi5oIHRvIGNvbXBpbGUKQEAgLTE5LDYgKzE5LDcgQEAKIEhPU1RDRkxBR1NfbGl2ZXRyZWUubyA6PSAkKEhPU1RDRkxBR1NfRFRDKQogSE9TVENGTEFHU19zcmNwb3MubyA6PSAkKEhPU1RDRkxBR1NfRFRDKQogSE9TVENGTEFHU190cmVlc291cmNlLm8gOj0gJChIT1NUQ0ZMQUdTX0RUQykKK0hPU1RDRkxBR1NfdXRpbC5vIDo9ICQoSE9TVENGTEFHU19EVEMpCiAKIEhPU1RDRkxBR1NfZHRjLWxleGVyLmxleC5vIDo9ICQoSE9TVENGTEFHU19EVEMpCiBIT1NUQ0ZMQUdTX2R0Yy1wYXJzZXIudGFiLm8gOj0gJChIT1NUQ0ZMQUdTX0RUQykKZGlmZiAtLWdpdCBhL3NjcmlwdHMvZHRjL2NoZWNrcy5jIGIvc2NyaXB0cy9kdGMvY2hlY2tzLmMKaW5kZXggOTU0ODU3OS4uYTY2MmEwMCAxMDA2NDQKLS0tIGEvc2NyaXB0cy9kdGMvY2hlY2tzLmMKKysrIGIvc2NyaXB0cy9kdGMvY2hlY2tzLmMKQEAgLTI3OCwzMiArMjc4LDExMiBAQAogfQogUFJPUF9DSEVDSyhwcm9wZXJ0eV9uYW1lX2NoYXJzLCBQUk9QTk9ERUNIQVJTLCBFUlJPUik7CiAKLXN0YXRpYyB2b2lkIGNoZWNrX2V4cGxpY2l0X3BoYW5kbGVzKHN0cnVjdCBjaGVjayAqYywgc3RydWN0IG5vZGUgKnJvb3QsCi0JCQkJCSAgc3RydWN0IG5vZGUgKm5vZGUpCisjZGVmaW5lIERFU0NMQUJFTF9GTVQJIiVzJXMlcyVzJXMiCisjZGVmaW5lIERFU0NMQUJFTF9BUkdTKG5vZGUscHJvcCxtYXJrKQkJXAorCSgobWFyaykgPyAidmFsdWUgb2YgIiA6ICIiKSwJCVwKKwkoKHByb3ApID8gIiciIDogIiIpLCBcCisJKChwcm9wKSA/IChwcm9wKS0+bmFtZSA6ICIiKSwgXAorCSgocHJvcCkgPyAiJyBpbiAiIDogIiIpLCAobm9kZSktPmZ1bGxwYXRoCisKK3N0YXRpYyB2b2lkIGNoZWNrX2R1cGxpY2F0ZV9sYWJlbChzdHJ1Y3QgY2hlY2sgKmMsIHN0cnVjdCBub2RlICpkdCwKKwkJCQkgIGNvbnN0IGNoYXIgKmxhYmVsLCBzdHJ1Y3Qgbm9kZSAqbm9kZSwKKwkJCQkgIHN0cnVjdCBwcm9wZXJ0eSAqcHJvcCwgc3RydWN0IG1hcmtlciAqbWFyaykKIHsKLQlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJc3RydWN0IG5vZGUgKm90aGVybm9kZSA9IE5VTEw7CisJc3RydWN0IHByb3BlcnR5ICpvdGhlcnByb3AgPSBOVUxMOworCXN0cnVjdCBtYXJrZXIgKm90aGVybWFyayA9IE5VTEw7CisKKwlvdGhlcm5vZGUgPSBnZXRfbm9kZV9ieV9sYWJlbChkdCwgbGFiZWwpOworCisJaWYgKCFvdGhlcm5vZGUpCisJCW90aGVycHJvcCA9IGdldF9wcm9wZXJ0eV9ieV9sYWJlbChkdCwgbGFiZWwsICZvdGhlcm5vZGUpOworCWlmICghb3RoZXJub2RlKQorCQlvdGhlcm1hcmsgPSBnZXRfbWFya2VyX2xhYmVsKGR0LCBsYWJlbCwgJm90aGVybm9kZSwKKwkJCQkJICAgICAgICZvdGhlcnByb3ApOworCisJaWYgKCFvdGhlcm5vZGUpCisJCXJldHVybjsKKworCWlmICgob3RoZXJub2RlICE9IG5vZGUpIHx8IChvdGhlcnByb3AgIT0gcHJvcCkgfHwgKG90aGVybWFyayAhPSBtYXJrKSkKKwkJRkFJTChjLCAiRHVwbGljYXRlIGxhYmVsICclcycgb24gIiBERVNDTEFCRUxfRk1UCisJCSAgICAgIiBhbmQgIiBERVNDTEFCRUxfRk1ULAorCQkgICAgIGxhYmVsLCBERVNDTEFCRUxfQVJHUyhub2RlLCBwcm9wLCBtYXJrKSwKKwkJICAgICBERVNDTEFCRUxfQVJHUyhvdGhlcm5vZGUsIG90aGVycHJvcCwgb3RoZXJtYXJrKSk7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX2R1cGxpY2F0ZV9sYWJlbF9ub2RlKHN0cnVjdCBjaGVjayAqYywgc3RydWN0IG5vZGUgKmR0LAorCQkJCSAgICAgICBzdHJ1Y3Qgbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgbGFiZWwgKmw7CisKKwlmb3JfZWFjaF9sYWJlbChub2RlLT5sYWJlbHMsIGwpCisJCWNoZWNrX2R1cGxpY2F0ZV9sYWJlbChjLCBkdCwgbC0+bGFiZWwsIG5vZGUsIE5VTEwsIE5VTEwpOworfQorc3RhdGljIHZvaWQgY2hlY2tfZHVwbGljYXRlX2xhYmVsX3Byb3Aoc3RydWN0IGNoZWNrICpjLCBzdHJ1Y3Qgbm9kZSAqZHQsCisJCQkJICAgICAgIHN0cnVjdCBub2RlICpub2RlLCBzdHJ1Y3QgcHJvcGVydHkgKnByb3ApCit7CisJc3RydWN0IG1hcmtlciAqbSA9IHByb3AtPnZhbC5tYXJrZXJzOworCXN0cnVjdCBsYWJlbCAqbDsKKworCWZvcl9lYWNoX2xhYmVsKHByb3AtPmxhYmVscywgbCkKKwkJY2hlY2tfZHVwbGljYXRlX2xhYmVsKGMsIGR0LCBsLT5sYWJlbCwgbm9kZSwgcHJvcCwgTlVMTCk7CisKKwlmb3JfZWFjaF9tYXJrZXJfb2ZfdHlwZShtLCBMQUJFTCkKKwkJY2hlY2tfZHVwbGljYXRlX2xhYmVsKGMsIGR0LCBtLT5yZWYsIG5vZGUsIHByb3AsIG0pOworfQorQ0hFQ0soZHVwbGljYXRlX2xhYmVsLCBOVUxMLCBjaGVja19kdXBsaWNhdGVfbGFiZWxfbm9kZSwKKyAgICAgIGNoZWNrX2R1cGxpY2F0ZV9sYWJlbF9wcm9wLCBOVUxMLCBFUlJPUik7CisKK3N0YXRpYyB2b2lkIGNoZWNrX2V4cGxpY2l0X3BoYW5kbGVzKHN0cnVjdCBjaGVjayAqYywgc3RydWN0IG5vZGUgKnJvb3QsCisJCQkJICAgIHN0cnVjdCBub2RlICpub2RlLCBzdHJ1Y3QgcHJvcGVydHkgKnByb3ApCit7CisJc3RydWN0IG1hcmtlciAqbTsKIAlzdHJ1Y3Qgbm9kZSAqb3RoZXI7CiAJY2VsbF90IHBoYW5kbGU7CiAKLQlwcm9wID0gZ2V0X3Byb3BlcnR5KG5vZGUsICJsaW51eCxwaGFuZGxlIik7Ci0JaWYgKCEgcHJvcCkKLQkJcmV0dXJuOyAvKiBObyBwaGFuZGxlLCB0aGF0J3MgZmluZSAqLworCWlmICghc3RyZXEocHJvcC0+bmFtZSwgInBoYW5kbGUiKQorCSAgICAmJiAhc3RyZXEocHJvcC0+bmFtZSwgImxpbnV4LHBoYW5kbGUiKSkKKwkJcmV0dXJuOwogCiAJaWYgKHByb3AtPnZhbC5sZW4gIT0gc2l6ZW9mKGNlbGxfdCkpIHsKLQkJRkFJTChjLCAiJXMgaGFzIGJhZCBsZW5ndGggKCVkKSBsaW51eCxwaGFuZGxlIHByb3BlcnR5IiwKLQkJICAgICBub2RlLT5mdWxscGF0aCwgcHJvcC0+dmFsLmxlbik7CisJCUZBSUwoYywgIiVzIGhhcyBiYWQgbGVuZ3RoICglZCkgJXMgcHJvcGVydHkiLAorCQkgICAgIG5vZGUtPmZ1bGxwYXRoLCBwcm9wLT52YWwubGVuLCBwcm9wLT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCW0gPSBwcm9wLT52YWwubWFya2VyczsKKwlmb3JfZWFjaF9tYXJrZXJfb2ZfdHlwZShtLCBSRUZfUEhBTkRMRSkgeworCQlhc3NlcnQobS0+b2Zmc2V0ID09IDApOworCQlpZiAobm9kZSAhPSBnZXRfbm9kZV9ieV9yZWYocm9vdCwgbS0+cmVmKSkKKwkJCS8qICJTZXQgdGhpcyBub2RlJ3MgcGhhbmRsZSBlcXVhbCB0byBzb21lCisJCQkgKiBvdGhlciBub2RlJ3MgcGhhbmRsZSIuICBUaGF0J3Mgbm9uc2Vuc2ljYWwKKwkJCSAqIGJ5IGNvbnN0cnVjdGlvbi4gKi8geworCQkJRkFJTChjLCAiJXMgaW4gJXMgaXMgYSByZWZlcmVuY2UgdG8gYW5vdGhlciBub2RlIiwKKwkJCSAgICAgcHJvcC0+bmFtZSwgbm9kZS0+ZnVsbHBhdGgpOworCQkJcmV0dXJuOworCQl9CisJCS8qIEJ1dCBzZXR0aW5nIHRoaXMgbm9kZSdzIHBoYW5kbGUgZXF1YWwgdG8gaXRzIG93bgorCQkgKiBwaGFuZGxlIGlzIGFsbG93ZWQgLSB0aGF0IG1lYW5zIGFsbG9jYXRlIGEgdW5pcXVlCisJCSAqIHBoYW5kbGUgZm9yIHRoaXMgbm9kZSwgZXZlbiBpZiBpdCdzIG5vdCBvdGhlcndpc2UKKwkJICogcmVmZXJlbmNlZC4gIFRoZSB2YWx1ZSB3aWxsIGJlIGZpbGxlZCBpbiBsYXRlciwgc28KKwkJICogbm8gZnVydGhlciBjaGVja2luZyBmb3Igbm93LiAqLwogCQlyZXR1cm47CiAJfQogCiAJcGhhbmRsZSA9IHByb3B2YWxfY2VsbChwcm9wKTsKKwogCWlmICgocGhhbmRsZSA9PSAwKSB8fCAocGhhbmRsZSA9PSAtMSkpIHsKLQkJRkFJTChjLCAiJXMgaGFzIGludmFsaWQgbGludXgscGhhbmRsZSB2YWx1ZSAweCV4IiwKLQkJICAgICBub2RlLT5mdWxscGF0aCwgcGhhbmRsZSk7CisJCUZBSUwoYywgIiVzIGhhcyBiYWQgdmFsdWUgKDB4JXgpIGluICVzIHByb3BlcnR5IiwKKwkJICAgICBub2RlLT5mdWxscGF0aCwgcGhhbmRsZSwgcHJvcC0+bmFtZSk7CiAJCXJldHVybjsKIAl9CiAKKwlpZiAobm9kZS0+cGhhbmRsZSAmJiAobm9kZS0+cGhhbmRsZSAhPSBwaGFuZGxlKSkKKwkJRkFJTChjLCAiJXMgaGFzICVzIHByb3BlcnR5IHdoaWNoIHJlcGxhY2VzIGV4aXN0aW5nIHBoYW5kbGUgaW5mb3JtYXRpb24iLAorCQkgICAgIG5vZGUtPmZ1bGxwYXRoLCBwcm9wLT5uYW1lKTsKKwogCW90aGVyID0gZ2V0X25vZGVfYnlfcGhhbmRsZShyb290LCBwaGFuZGxlKTsKLQlpZiAob3RoZXIpIHsKKwlpZiAob3RoZXIgJiYgKG90aGVyICE9IG5vZGUpKSB7CiAJCUZBSUwoYywgIiVzIGhhcyBkdXBsaWNhdGVkIHBoYW5kbGUgMHgleCAoc2VlbiBiZWZvcmUgYXQgJXMpIiwKIAkJICAgICBub2RlLT5mdWxscGF0aCwgcGhhbmRsZSwgb3RoZXItPmZ1bGxwYXRoKTsKIAkJcmV0dXJuOwpAQCAtMzExLDcgKzM5MSw3IEBACiAKIAlub2RlLT5waGFuZGxlID0gcGhhbmRsZTsKIH0KLU5PREVfQ0hFQ0soZXhwbGljaXRfcGhhbmRsZXMsIE5VTEwsIEVSUk9SKTsKK1BST1BfQ0hFQ0soZXhwbGljaXRfcGhhbmRsZXMsIE5VTEwsIEVSUk9SKTsKIAogc3RhdGljIHZvaWQgY2hlY2tfbmFtZV9wcm9wZXJ0aWVzKHN0cnVjdCBjaGVjayAqYywgc3RydWN0IG5vZGUgKnJvb3QsCiAJCQkJICBzdHJ1Y3Qgbm9kZSAqbm9kZSkKQEAgLTU0OSw2ICs2MjksOSBAQAogCSZkdXBsaWNhdGVfbm9kZV9uYW1lcywgJmR1cGxpY2F0ZV9wcm9wZXJ0eV9uYW1lcywKIAkmbm9kZV9uYW1lX2NoYXJzLCAmbm9kZV9uYW1lX2Zvcm1hdCwgJnByb3BlcnR5X25hbWVfY2hhcnMsCiAJJm5hbWVfaXNfc3RyaW5nLCAmbmFtZV9wcm9wZXJ0aWVzLAorCisJJmR1cGxpY2F0ZV9sYWJlbCwKKwogCSZleHBsaWNpdF9waGFuZGxlcywKIAkmcGhhbmRsZV9yZWZlcmVuY2VzLCAmcGF0aF9yZWZlcmVuY2VzLAogCmRpZmYgLS1naXQgYS9zY3JpcHRzL2R0Yy9kdGMtbGV4ZXIubCBiL3NjcmlwdHMvZHRjL2R0Yy1sZXhlci5sCmluZGV4IGE2MjdiYmUuLmU4NjZlYTUgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvZHRjL2R0Yy1sZXhlci5sCisrKyBiL3NjcmlwdHMvZHRjL2R0Yy1sZXhlci5sCkBAIC0xOCw3ICsxOCw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0EKICAqLwogCi0lb3B0aW9uIG5veXl3cmFwIG5vaW5wdXQgbm91bnB1dCB5eWxpbmVubworJW9wdGlvbiBub3l5d3JhcCBub3VucHV0IG5vaW5wdXQgbmV2ZXItaW50ZXJhY3RpdmUKIAogJXggSU5DTFVERQogJXggQllURVNUUklORwpAQCAtMzgsNiArMzgsMTMgQEAKICNpbmNsdWRlICJzcmNwb3MuaCIKICNpbmNsdWRlICJkdGMtcGFyc2VyLnRhYi5oIgogCitZWUxUWVBFIHl5bGxvYzsKKworLyogQ0FVVElPTjogdGhpcyB3aWxsIHN0b3Agd29ya2luZyBpZiB3ZSBldmVyIHVzZSB5eWxlc3MoKSBvciB5eXVucHV0KCkgKi8KKyNkZWZpbmUJWVlfVVNFUl9BQ1RJT04gXAorCXsgXAorCQlzcmNwb3NfdXBkYXRlKCZ5eWxsb2MsIHl5dGV4dCwgeXlsZW5nKTsgXAorCX0KIAogLyojZGVmaW5lIExFWERFQlVHCTEqLwogCkBAIC00NywxNSArNTQsMTAgQEAKICNkZWZpbmUgRFBSSU5UKGZtdCwgLi4uKQlkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYKIAotc3RhdGljIGludCBkdHNfdmVyc2lvbjsgLyogPSAwICovCitzdGF0aWMgaW50IGR0c192ZXJzaW9uID0gMTsKIAotI2RlZmluZSBCRUdJTl9ERUZBVUxUKCkJaWYgKGR0c192ZXJzaW9uID09IDApIHsgXAotCQkJCURQUklOVCgiPElOSVRJQUw+XG4iKTsgXAotCQkJCUJFR0lOKElOSVRJQUwpOyBcCi0JCQl9IGVsc2UgeyBcCi0JCQkJRFBSSU5UKCI8VjE+XG4iKTsgXAorI2RlZmluZSBCRUdJTl9ERUZBVUxUKCkJCURQUklOVCgiPFYxPlxuIik7IFwKIAkJCQlCRUdJTihWMSk7IFwKLQkJCX0KIAogc3RhdGljIHZvaWQgcHVzaF9pbnB1dF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKIHN0YXRpYyBpbnQgcG9wX2lucHV0X2ZpbGUodm9pZCk7CkBAIC03NSwxOCArNzcsMTMgQEAKIAkJfQogCiA8Kj57U1RSSU5HfQl7Ci0JCQl5eWxsb2MuZmlsZSA9IHNyY3Bvc19maWxlOwotCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKIAkJCURQUklOVCgiU3RyaW5nOiAlc1xuIiwgeXl0ZXh0KTsKIAkJCXl5bHZhbC5kYXRhID0gZGF0YV9jb3B5X2VzY2FwZV9zdHJpbmcoeXl0ZXh0KzEsCiAJCQkJCXl5bGVuZy0yKTsKLQkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87CiAJCQlyZXR1cm4gRFRfU1RSSU5HOwogCQl9CiAKIDwqPiIvZHRzLXYxLyIJewotCQkJeXlsbG9jLmZpbGUgPSBzcmNwb3NfZmlsZTsKLQkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87CiAJCQlEUFJJTlQoIktleXdvcmQ6IC9kdHMtdjEvXG4iKTsKIAkJCWR0c192ZXJzaW9uID0gMTsKIAkJCUJFR0lOX0RFRkFVTFQoKTsKQEAgLTk0LDEwNiArOTEsNTcgQEAKIAkJfQogCiA8Kj4iL21lbXJlc2VydmUvIgl7Ci0JCQl5eWxsb2MuZmlsZSA9IHNyY3Bvc19maWxlOwotCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKIAkJCURQUklOVCgiS2V5d29yZDogL21lbXJlc2VydmUvXG4iKTsKIAkJCUJFR0lOX0RFRkFVTFQoKTsKIAkJCXJldHVybiBEVF9NRU1SRVNFUlZFOwogCQl9CiAKIDwqPntMQUJFTH06CXsKLQkJCXl5bGxvYy5maWxlID0gc3JjcG9zX2ZpbGU7Ci0JCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOwogCQkJRFBSSU5UKCJMYWJlbDogJXNcbiIsIHl5dGV4dCk7Ci0JCQl5eWx2YWwubGFiZWxyZWYgPSBzdHJkdXAoeXl0ZXh0KTsKKwkJCXl5bHZhbC5sYWJlbHJlZiA9IHhzdHJkdXAoeXl0ZXh0KTsKIAkJCXl5bHZhbC5sYWJlbHJlZlt5eWxlbmctMV0gPSAnXDAnOwogCQkJcmV0dXJuIERUX0xBQkVMOwogCQl9CiAKLTxJTklUSUFMPltib2RoXSMgewotCQkJeXlsbG9jLmZpbGUgPSBzcmNwb3NfZmlsZTsKLQkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87Ci0JCQlpZiAoKnl5dGV4dCA9PSAnYicpCi0JCQkJeXlsdmFsLmNiYXNlID0gMjsKLQkJCWVsc2UgaWYgKCp5eXRleHQgPT0gJ28nKQotCQkJCXl5bHZhbC5jYmFzZSA9IDg7Ci0JCQllbHNlIGlmICgqeXl0ZXh0ID09ICdkJykKLQkJCQl5eWx2YWwuY2Jhc2UgPSAxMDsKLQkJCWVsc2UKLQkJCQl5eWx2YWwuY2Jhc2UgPSAxNjsKLQkJCURQUklOVCgiQmFzZTogJWRcbiIsIHl5bHZhbC5jYmFzZSk7Ci0JCQlyZXR1cm4gRFRfQkFTRTsKLQkJfQotCi08SU5JVElBTD5bMC05YS1mQS1GXSsJewotCQkJeXlsbG9jLmZpbGUgPSBzcmNwb3NfZmlsZTsKLQkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87Ci0JCQl5eWx2YWwubGl0ZXJhbCA9IHN0cmR1cCh5eXRleHQpOwotCQkJRFBSSU5UKCJMaXRlcmFsOiAnJXMnXG4iLCB5eWx2YWwubGl0ZXJhbCk7Ci0JCQlyZXR1cm4gRFRfTEVHQUNZTElURVJBTDsKLQkJfQotCiA8VjE+WzAtOV0rfDBbeFhdWzAtOWEtZkEtRl0rICAgICAgewotCQkJeXlsbG9jLmZpbGUgPSBzcmNwb3NfZmlsZTsKLQkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87Ci0JCQl5eWx2YWwubGl0ZXJhbCA9IHN0cmR1cCh5eXRleHQpOworCQkJeXlsdmFsLmxpdGVyYWwgPSB4c3RyZHVwKHl5dGV4dCk7CiAJCQlEUFJJTlQoIkxpdGVyYWw6ICclcydcbiIsIHl5bHZhbC5saXRlcmFsKTsKIAkJCXJldHVybiBEVF9MSVRFUkFMOwogCQl9CiAKLVwme0xBQkVMfQl7CS8qIGxhYmVsIHJlZmVyZW5jZSAqLwotCQkJeXlsbG9jLmZpbGUgPSBzcmNwb3NfZmlsZTsKLQkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87Cis8Kj5cJntMQUJFTH0JewkvKiBsYWJlbCByZWZlcmVuY2UgKi8KIAkJCURQUklOVCgiUmVmOiAlc1xuIiwgeXl0ZXh0KzEpOwotCQkJeXlsdmFsLmxhYmVscmVmID0gc3RyZHVwKHl5dGV4dCsxKTsKKwkJCXl5bHZhbC5sYWJlbHJlZiA9IHhzdHJkdXAoeXl0ZXh0KzEpOwogCQkJcmV0dXJuIERUX1JFRjsKIAkJfQogCi0iJnsvIntQQVRIQ0hBUn0rXH0JewkvKiBuZXctc3R5bGUgcGF0aCByZWZlcmVuY2UgKi8KLQkJCXl5bGxvYy5maWxlID0gc3JjcG9zX2ZpbGU7Ci0JCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOworPCo+IiZ7LyJ7UEFUSENIQVJ9K1x9CXsJLyogbmV3LXN0eWxlIHBhdGggcmVmZXJlbmNlICovCiAJCQl5eXRleHRbeXlsZW5nLTFdID0gJ1wwJzsKIAkJCURQUklOVCgiUmVmOiAlc1xuIiwgeXl0ZXh0KzIpOwotCQkJeXlsdmFsLmxhYmVscmVmID0gc3RyZHVwKHl5dGV4dCsyKTsKLQkJCXJldHVybiBEVF9SRUY7Ci0JCX0KLQotPElOSVRJQUw+IiYvIntQQVRIQ0hBUn0rIHsJLyogb2xkLXN0eWxlIHBhdGggcmVmZXJlbmNlICovCi0JCQl5eWxsb2MuZmlsZSA9IHNyY3Bvc19maWxlOwotCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKLQkJCURQUklOVCgiUmVmOiAlc1xuIiwgeXl0ZXh0KzEpOwotCQkJeXlsdmFsLmxhYmVscmVmID0gc3RyZHVwKHl5dGV4dCsxKTsKKwkJCXl5bHZhbC5sYWJlbHJlZiA9IHhzdHJkdXAoeXl0ZXh0KzIpOwogCQkJcmV0dXJuIERUX1JFRjsKIAkJfQogCiA8QllURVNUUklORz5bMC05YS1mQS1GXXsyfSB7Ci0JCQl5eWxsb2MuZmlsZSA9IHNyY3Bvc19maWxlOwotCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKIAkJCXl5bHZhbC5ieXRlID0gc3RydG9sKHl5dGV4dCwgTlVMTCwgMTYpOwogCQkJRFBSSU5UKCJCeXRlOiAlMDJ4XG4iLCAoaW50KXl5bHZhbC5ieXRlKTsKIAkJCXJldHVybiBEVF9CWVRFOwogCQl9CiAKIDxCWVRFU1RSSU5HPiJdIgl7Ci0JCQl5eWxsb2MuZmlsZSA9IHNyY3Bvc19maWxlOwotCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKIAkJCURQUklOVCgiL0JZVEVTVFJJTkdcbiIpOwogCQkJQkVHSU5fREVGQVVMVCgpOwogCQkJcmV0dXJuICddJzsKIAkJfQogCiA8UFJPUE5PREVOQU1FPntQUk9QTk9ERUNIQVJ9KyB7Ci0JCQl5eWxsb2MuZmlsZSA9IHNyY3Bvc19maWxlOwotCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKIAkJCURQUklOVCgiUHJvcE5vZGVOYW1lOiAlc1xuIiwgeXl0ZXh0KTsKLQkJCXl5bHZhbC5wcm9wbm9kZW5hbWUgPSBzdHJkdXAoeXl0ZXh0KTsKKwkJCXl5bHZhbC5wcm9wbm9kZW5hbWUgPSB4c3RyZHVwKHl5dGV4dCk7CiAJCQlCRUdJTl9ERUZBVUxUKCk7CiAJCQlyZXR1cm4gRFRfUFJPUE5PREVOQU1FOwogCQl9CiAKICIvaW5jYmluLyIJewotCQkJeXlsbG9jLmZpbGUgPSBzcmNwb3NfZmlsZTsKLQkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87CiAJCQlEUFJJTlQoIkJpbmFyeSBJbmNsdWRlXG4iKTsKIAkJCXJldHVybiBEVF9JTkNCSU47CiAJCX0KQEAgLTIwMyw4ICsxNTEsNiBAQAogPCo+e0xJTkVDT01NRU5UfSsgLyogZWF0IEMrKy1zdHlsZSBjb21tZW50cyAqLwogCiA8Kj4uCQl7Ci0JCQl5eWxsb2MuZmlsZSA9IHNyY3Bvc19maWxlOwotCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKIAkJCURQUklOVCgiQ2hhcjogJWMgKFxceCUwMngpXG4iLCB5eXRleHRbMF0sCiAJCQkJKHVuc2lnbmVkKXl5dGV4dFswXSk7CiAJCQlpZiAoeXl0ZXh0WzBdID09ICdbJykgewpAQCAtMjIxLDEwMCArMTY3LDI1IEBACiAKICUlCiAKLQotLyoKLSAqIFN0YWNrIG9mIG5lc3RlZCBpbmNsdWRlIGZpbGUgY29udGV4dHMuCi0gKi8KLQotc3RydWN0IGluY2xfZmlsZSB7Ci0Jc3RydWN0IGR0Y19maWxlICpmaWxlOwotCVlZX0JVRkZFUl9TVEFURSB5eV9wcmV2X2J1ZjsKLQlpbnQgeXlfcHJldl9saW5lbm87Ci0Jc3RydWN0IGluY2xfZmlsZSAqcHJldjsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaW5jbF9maWxlICppbmNsX2ZpbGVfc3RhY2s7Ci0KLQotLyoKLSAqIERldGVjdCBpbmZpbml0ZSBpbmNsdWRlIHJlY3Vyc2lvbi4KLSAqLwotI2RlZmluZSBNQVhfSU5DTFVERV9ERVBUSAkoMTAwKQotCi1zdGF0aWMgaW50IGluY2xfZGVwdGggPSAwOwotCi0KIHN0YXRpYyB2b2lkIHB1c2hfaW5wdXRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSkKIHsKLQlzdHJ1Y3QgaW5jbF9maWxlICppbmNsX2ZpbGU7Ci0Jc3RydWN0IGR0Y19maWxlICpuZXdmaWxlOwotCXN0cnVjdCBzZWFyY2hfcGF0aCBzZWFyY2gsICpzZWFyY2hwdHIgPSBOVUxMOwotCiAJYXNzZXJ0KGZpbGVuYW1lKTsKIAotCWlmIChpbmNsX2RlcHRoKysgPj0gTUFYX0lOQ0xVREVfREVQVEgpCi0JCWRpZSgiSW5jbHVkZXMgbmVzdGVkIHRvbyBkZWVwbHkiKTsKKwlzcmNmaWxlX3B1c2goZmlsZW5hbWUpOwogCi0JaWYgKHNyY3Bvc19maWxlKSB7Ci0JCXNlYXJjaC5kaXIgPSBzcmNwb3NfZmlsZS0+ZGlyOwotCQlzZWFyY2gubmV4dCA9IE5VTEw7Ci0JCXNlYXJjaC5wcmV2ID0gTlVMTDsKLQkJc2VhcmNocHRyID0gJnNlYXJjaDsKLQl9CisJeXlpbiA9IGN1cnJlbnRfc3JjZmlsZS0+ZjsKIAotCW5ld2ZpbGUgPSBkdGNfb3Blbl9maWxlKGZpbGVuYW1lLCBzZWFyY2hwdHIpOwotCi0JaW5jbF9maWxlID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IGluY2xfZmlsZSkpOwotCi0JLyoKLQkgKiBTYXZlIGN1cnJlbnQgY29udGV4dC4KLQkgKi8KLQlpbmNsX2ZpbGUtPnl5X3ByZXZfYnVmID0gWVlfQ1VSUkVOVF9CVUZGRVI7Ci0JaW5jbF9maWxlLT55eV9wcmV2X2xpbmVubyA9IHl5bGluZW5vOwotCWluY2xfZmlsZS0+ZmlsZSA9IHNyY3Bvc19maWxlOwotCWluY2xfZmlsZS0+cHJldiA9IGluY2xfZmlsZV9zdGFjazsKLQotCWluY2xfZmlsZV9zdGFjayA9IGluY2xfZmlsZTsKLQotCS8qCi0JICogRXN0YWJsaXNoIG5ldyBjb250ZXh0LgotCSAqLwotCXNyY3Bvc19maWxlID0gbmV3ZmlsZTsKLQl5eWxpbmVubyA9IDE7Ci0JeXlpbiA9IG5ld2ZpbGUtPmZpbGU7Ci0JeXlfc3dpdGNoX3RvX2J1ZmZlcih5eV9jcmVhdGVfYnVmZmVyKHl5aW4sIFlZX0JVRl9TSVpFKSk7CisJeXlwdXNoX2J1ZmZlcl9zdGF0ZSh5eV9jcmVhdGVfYnVmZmVyKHl5aW4sIFlZX0JVRl9TSVpFKSk7CiB9CiAKIAogc3RhdGljIGludCBwb3BfaW5wdXRfZmlsZSh2b2lkKQogewotCXN0cnVjdCBpbmNsX2ZpbGUgKmluY2xfZmlsZTsKLQotCWlmIChpbmNsX2ZpbGVfc3RhY2sgPT0gMCkKKwlpZiAoc3JjZmlsZV9wb3AoKSA9PSAwKQogCQlyZXR1cm4gMDsKIAotCWR0Y19jbG9zZV9maWxlKHNyY3Bvc19maWxlKTsKLQotCS8qCi0JICogUG9wLgotCSAqLwotCS0taW5jbF9kZXB0aDsKLQlpbmNsX2ZpbGUgPSBpbmNsX2ZpbGVfc3RhY2s7Ci0JaW5jbF9maWxlX3N0YWNrID0gaW5jbF9maWxlLT5wcmV2OwotCi0JLyoKLQkgKiBSZWNvdmVyIG9sZCBjb250ZXh0LgotCSAqLwotCXl5X2RlbGV0ZV9idWZmZXIoWVlfQ1VSUkVOVF9CVUZGRVIpOwotCXl5X3N3aXRjaF90b19idWZmZXIoaW5jbF9maWxlLT55eV9wcmV2X2J1Zik7Ci0JeXlsaW5lbm8gPSBpbmNsX2ZpbGUtPnl5X3ByZXZfbGluZW5vOwotCXNyY3Bvc19maWxlID0gaW5jbF9maWxlLT5maWxlOwotCXl5aW4gPSBpbmNsX2ZpbGUtPmZpbGUgPyBpbmNsX2ZpbGUtPmZpbGUtPmZpbGUgOiBOVUxMOwotCi0JLyoKLQkgKiBGcmVlIG9sZCBzdGF0ZS4KLQkgKi8KLQlmcmVlKGluY2xfZmlsZSk7CisJeXlwb3BfYnVmZmVyX3N0YXRlKCk7CisJeXlpbiA9IGN1cnJlbnRfc3JjZmlsZS0+ZjsKIAogCXJldHVybiAxOwogfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9kdGMvZHRjLWxleGVyLmxleC5jX3NoaXBwZWQgYi9zY3JpcHRzL2R0Yy9kdGMtbGV4ZXIubGV4LmNfc2hpcHBlZAppbmRleCBlMjdjYzYzLi41MGM0NDIwIDEwMDY0NAotLS0gYS9zY3JpcHRzL2R0Yy9kdGMtbGV4ZXIubGV4LmNfc2hpcHBlZAorKysgYi9zY3JpcHRzL2R0Yy9kdGMtbGV4ZXIubGV4LmNfc2hpcHBlZApAQCAtMTcwLDIwICsxNzAsNyBAQAogI2RlZmluZSBFT0JfQUNUX0VORF9PRl9GSUxFIDEKICNkZWZpbmUgRU9CX0FDVF9MQVNUX01BVENIIDIKIAotICAgIC8qIE5vdGU6IFdlIHNwZWNpZmljYWxseSBvbWl0IHRoZSB0ZXN0IGZvciB5eV9ydWxlX2Nhbl9tYXRjaF9lb2wgYmVjYXVzZSBpdCByZXF1aXJlcwotICAgICAqICAgICAgIGFjY2VzcyB0byB0aGUgbG9jYWwgdmFyaWFibGUgeXlfYWN0LiBTaW5jZSB5eWxlc3MoKSBpcyBhIG1hY3JvLCBpdCB3b3VsZCBicmVhawotICAgICAqICAgICAgIGV4aXN0aW5nIHNjYW5uZXJzIHRoYXQgY2FsbCB5eWxlc3MoKSBmcm9tIE9VVFNJREUgeXlsZXguIAotICAgICAqICAgICAgIE9uZSBvYnZpb3VzIHNvbHV0aW9uIGl0IHRvIG1ha2UgeXlfYWN0IGEgZ2xvYmFsLiBJIHRyaWVkIHRoYXQsIGFuZCBzYXcKLSAgICAgKiAgICAgICBhIDUlIHBlcmZvcm1hbmNlIGhpdCBpbiBhIG5vbi15eWxpbmVubyBzY2FubmVyLCBiZWNhdXNlIHl5X2FjdCBpcwotICAgICAqICAgICAgIG5vcm1hbGx5IGRlY2xhcmVkIGFzIGEgcmVnaXN0ZXIgdmFyaWFibGUtLSBzbyBpdCBpcyBub3Qgd29ydGggaXQuCi0gICAgICovCi0gICAgI2RlZmluZSAgWVlfTEVTU19MSU5FTk8obikgXAotICAgICAgICAgICAgZG8geyBcCi0gICAgICAgICAgICAgICAgaW50IHl5bDtcCi0gICAgICAgICAgICAgICAgZm9yICggeXlsID0gbjsgeXlsIDwgeXlsZW5nOyArK3l5bCApXAotICAgICAgICAgICAgICAgICAgICBpZiAoIHl5dGV4dFt5eWxdID09ICdcbicgKVwKLSAgICAgICAgICAgICAgICAgICAgICAgIC0teXlsaW5lbm87XAotICAgICAgICAgICAgfXdoaWxlKDApCisgICAgI2RlZmluZSBZWV9MRVNTX0xJTkVOTyhuKQogICAgIAogLyogUmV0dXJuIGFsbCBidXQgdGhlIGZpcnN0ICJuIiBtYXRjaGVkIGNoYXJhY3RlcnMgYmFjayB0byB0aGUgaW5wdXQgc3RyZWFtLiAqLwogI2RlZmluZSB5eWxlc3MobikgXApAQCAtMzg1LDggKzM3Miw4IEBACiAJKnl5X2NwID0gJ1wwJzsgXAogCSh5eV9jX2J1Zl9wKSA9IHl5X2NwOwogCi0jZGVmaW5lIFlZX05VTV9SVUxFUyAyMAotI2RlZmluZSBZWV9FTkRfT0ZfQlVGRkVSIDIxCisjZGVmaW5lIFlZX05VTV9SVUxFUyAxNworI2RlZmluZSBZWV9FTkRfT0ZfQlVGRkVSIDE4CiAvKiBUaGlzIHN0cnVjdCBpcyBub3QgdXNlZCBpbiB0aGlzIHNjYW5uZXIsCiAgICBidXQgaXRzIHByZXNlbmNlIGlzIG5lY2Vzc2FyeS4gKi8KIHN0cnVjdCB5eV90cmFuc19pbmZvCkBAIC0zOTQsMjAgKzM4MSwxOSBAQAogCWZsZXhfaW50MzJfdCB5eV92ZXJpZnk7CiAJZmxleF9pbnQzMl90IHl5X254dDsKIAl9Owotc3RhdGljIHl5Y29uc3QgZmxleF9pbnQxNl90IHl5X2FjY2VwdFsxMDRdID0KK3N0YXRpYyB5eWNvbnN0IGZsZXhfaW50MTZfdCB5eV9hY2NlcHRbOTRdID0KICAgICB7ICAgMCwKICAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwKLSAgICAgICAyMSwgICAxOSwgICAxNiwgICAxNiwgICAxOSwgICAxOSwgICAxOSwgICAgNywgICAgNywgICAxOSwKLSAgICAgICAgNywgICAxOSwgICAxOSwgICAxOSwgICAxOSwgICAxMywgICAxNCwgICAxNCwgICAxOSwgICAgOCwKLSAgICAgICAgOCwgICAxNiwgICAgMCwgICAgMiwgICAgMCwgICAgMCwgICAgOSwgICAgMCwgICAgMCwgICAgMCwKLSAgICAgICAgMCwgICAgMCwgICAgMCwgICAgNywgICAgNywgICAgNSwgICAgMCwgICAgNiwgICAgMCwgICAxMiwKLSAgICAgICAxMiwgICAxNCwgICAxNCwgICAgOCwgICAgMCwgICAxMSwgICAgOSwgICAgMCwgICAgMCwgICAgMCwKLSAgICAgICAgMCwgICAxOCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgOCwgICAgMCwgICAxNywgICAgMCwKLSAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAxMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwKLSAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMywgICAxNSwKKyAgICAgICAxOCwgICAxNiwgICAxMywgICAxMywgICAxNiwgICAxNiwgICAxNiwgICAxNiwgICAxNiwgICAxNiwKKyAgICAgICAxNiwgICAxMCwgICAxMSwgICAxMSwgICAgNiwgICAgNiwgICAxMywgICAgMCwgICAgMiwgICAgMCwKKyAgICAgICAgNywgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgNSwgICAgMCwKKyAgICAgICAgOSwgICAgOSwgICAxMSwgICAxMSwgICAgNiwgICAgMCwgICAgNywgICAgMCwgICAgMCwgICAgMCwKKyAgICAgICAgMCwgICAxNSwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgNiwgICAgMCwgICAxNCwgICAgMCwKKyAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgOCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwKKyAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMywgICAxMiwKICAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMSwgICAgMCwKLQogICAgICAgICAwLCAgICA0LCAgICAwCisKICAgICB9IDsKIAogc3RhdGljIHl5Y29uc3QgZmxleF9pbnQzMl90IHl5X2VjWzI1Nl0gPQpAQCAtNDE2LDE2ICs0MDIsMTYgQEAKICAgICAgICAgMiwgICAgMiwgICAgMiwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKICAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKICAgICAgICAgMSwgICAgMiwgICAgMSwgICAgNCwgICAgNSwgICAgMSwgICAgMSwgICAgNiwgICAgMSwgICAgMSwKLSAgICAgICAgMSwgICAgNywgICAgOCwgICAgOCwgICAgOSwgICAgOCwgICAxMCwgICAxMSwgICAxMiwgICAxMywKLSAgICAgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxNCwgICAgMSwgICAgMSwKLSAgICAgICAgMSwgICAgMSwgICAgOCwgICAgOCwgICAxNSwgICAxNSwgICAxNSwgICAxNSwgICAxNSwgICAxNSwKLSAgICAgICAxNiwgICAxNiwgICAxNiwgICAxNiwgICAxNiwgICAxNiwgICAxNiwgICAxNiwgICAxNiwgICAxNiwKLSAgICAgICAxNiwgICAxNiwgICAxNiwgICAxNiwgICAxNiwgICAxNiwgICAxNiwgICAxNywgICAxNiwgICAxNiwKLSAgICAgICAgMSwgICAxOCwgICAxOSwgICAgMSwgICAxNiwgICAgMSwgICAxNSwgICAyMCwgICAyMSwgICAyMiwKKyAgICAgICAgMSwgICAgNywgICAgNSwgICAgNSwgICAgOCwgICAgNSwgICAgOSwgICAxMCwgICAxMSwgICAxMiwKKyAgICAgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMywgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgNSwgICAgNSwgICAxNCwgICAxNCwgICAxNCwgICAxNCwgICAxNCwgICAxNCwKKyAgICAgICAxNSwgICAxNSwgICAxNSwgICAxNSwgICAxNSwgICAxNSwgICAxNSwgICAxNSwgICAxNSwgICAxNSwKKyAgICAgICAxNSwgICAxNSwgICAxNSwgICAxNSwgICAxNSwgICAxNSwgICAxNSwgICAxNiwgICAxNSwgICAxNSwKKyAgICAgICAgMSwgICAxNywgICAxOCwgICAgMSwgICAxNSwgICAgMSwgICAxNCwgICAxOSwgICAyMCwgICAyMSwKIAotICAgICAgIDIzLCAgIDE1LCAgIDE2LCAgIDI0LCAgIDI1LCAgIDE2LCAgIDE2LCAgIDI2LCAgIDI3LCAgIDI4LAotICAgICAgIDI0LCAgIDE2LCAgIDE2LCAgIDI5LCAgIDMwLCAgIDMxLCAgIDMyLCAgIDMzLCAgIDE2LCAgIDE3LAotICAgICAgIDE2LCAgIDE2LCAgIDM0LCAgICAxLCAgIDM1LCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgIDIyLCAgIDE0LCAgIDE1LCAgIDE1LCAgIDIzLCAgIDE1LCAgIDE1LCAgIDI0LCAgIDI1LCAgIDI2LAorICAgICAgIDE1LCAgIDE1LCAgIDE1LCAgIDI3LCAgIDI4LCAgIDI5LCAgIDMwLCAgIDMxLCAgIDE1LCAgIDE2LAorICAgICAgIDE1LCAgIDE1LCAgIDMyLCAgICAxLCAgIDMzLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAogICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAogICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAogICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLApAQCAtNDQyLDEzNiArNDI4LDExNCBAQAogICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxCiAgICAgfSA7CiAKLXN0YXRpYyB5eWNvbnN0IGZsZXhfaW50MzJfdCB5eV9tZXRhWzM2XSA9CitzdGF0aWMgeXljb25zdCBmbGV4X2ludDMyX3QgeXlfbWV0YVszNF0gPQogICAgIHsgICAwLAotICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAyLCAgICAxLCAgICAyLCAgICAyLCAgICAyLCAgICAzLAotICAgICAgICA0LCAgICA0LCAgICA0LCAgICA1LCAgICA2LCAgICA3LCAgICA3LCAgICAxLCAgICAxLCAgICA2LAotICAgICAgICA2LCAgICA2LCAgICA2LCAgICA3LCAgICA3LCAgICA3LCAgICA3LCAgICA3LCAgICA3LCAgICA3LAotICAgICAgICA3LCAgICA3LCAgICA3LCAgICA4LCAgICAxCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDIsICAgIDEsICAgIDIsICAgIDIsICAgIDMsICAgIDQsCisgICAgICAgIDQsICAgIDQsICAgIDUsICAgIDYsICAgIDcsICAgIDcsICAgIDEsICAgIDEsICAgIDYsICAgIDYsCisgICAgICAgIDYsICAgIDYsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsCisgICAgICAgIDcsICAgIDgsICAgIDEKICAgICB9IDsKIAotc3RhdGljIHl5Y29uc3QgZmxleF9pbnQxNl90IHl5X2Jhc2VbMTE3XSA9CitzdGF0aWMgeXljb25zdCBmbGV4X2ludDE2X3QgeXlfYmFzZVsxMDZdID0KICAgICB7ICAgMCwKLSAgICAgICAgMCwgICAgMCwgICAzMCwgICAgMCwgICA0NCwgICAgMCwgICA2NywgICAgMCwgICA5NywgIDEwNSwKLSAgICAgIDMwMiwgIDMwMywgICAzNSwgICA0NCwgICA0MCwgICA5NCwgIDExMiwgICAgMCwgIDEyOSwgIDE1MiwKLSAgICAgIDI5NiwgIDI5NSwgIDE1OSwgICAgMCwgIDE3NiwgIDMwMywgICAgMCwgIDExNiwgICA5NSwgIDE2NSwKLSAgICAgICA0OSwgICA0NiwgIDEwMiwgIDMwMywgIDI5NiwgICAgMCwgICAgMCwgIDI4OCwgIDI5MCwgIDI5MywKLSAgICAgIDI2NCwgIDI2NiwgIDI3MCwgICAgMCwgICAgMCwgIDMwMywgICAgMCwgIDMwMywgIDI2NCwgIDMwMywKLSAgICAgICAgMCwgICAgMCwgIDE5NSwgIDEwMSwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgIDI4NCwgIDEyNSwKLSAgICAgIDI3NywgIDI2NSwgIDIyNSwgIDIzMCwgIDIxNiwgIDIxOCwgICAgMCwgIDIwMiwgIDIyNCwgIDIyMSwKLSAgICAgIDIxNywgIDEwNywgIDE5NiwgIDE4OCwgIDMwMywgIDIwNiwgIDE3OSwgIDE4NiwgIDE3OCwgIDE4NSwKLSAgICAgIDE4MywgIDE2MiwgIDE2MSwgIDE1MCwgIDE2OSwgIDE2MCwgIDE0NSwgIDEyNSwgIDMwMywgIDMwMywKLSAgICAgIDEzNywgIDEwOSwgIDE5MCwgIDEwMywgIDIwMywgIDE2NywgIDEwOCwgIDE5NywgIDMwMywgIDEyMywKKyAgICAgICAgMCwgICAgMCwgIDIzNywgIDIzNiwgICAyNSwgICAgMCwgICA0NywgICAgMCwgICAzMCwgICA3MSwKKyAgICAgIDI0NCwgIDI0NywgICA4MiwgICA4NCwgICA4NCwgIDIxMSwgICA5NSwgIDIyOSwgIDIxOCwgICAgMCwKKyAgICAgIDExMSwgIDI0NywgICAgMCwgICA4NCwgICA4MywgICA5NSwgIDEwNiwgICA4NiwgIDI0NywgIDIzNywKKyAgICAgICAgMCwgIDIzMCwgIDIzMSwgIDIzNCwgIDIwNywgIDIwOSwgIDIxMiwgIDIyMCwgIDI0NywgIDIwNiwKKyAgICAgIDI0NywgIDIxOCwgICAgMCwgIDEwNiwgIDExNiwgICAgMCwgICAgMCwgICAgMCwgIDIyMywgICA4OSwKKyAgICAgIDIyNiwgIDIxOSwgIDE5OSwgIDIwNiwgIDIwMCwgIDIwNCwgICAgMCwgIDE5MCwgIDIxMywgIDIxMiwKKyAgICAgIDIwMiwgICA5MSwgIDE3OCwgIDE2MSwgIDI0NywgIDE3MiwgIDE0NCwgIDE1MCwgIDE0MCwgIDEzMCwKKyAgICAgIDE0MCwgIDEyNCwgIDEyOCwgIDEyMCwgIDEzOCwgIDEzNywgIDEyMywgIDEyMiwgIDI0NywgIDI0NywKKyAgICAgIDEzNCwgIDExNCwgIDEzMiwgICA4NiwgIDEzNSwgIDEyNSwgICA5MCwgIDEzNiwgIDI0NywgICA5NywKKyAgICAgICAyOSwgIDI0NywgIDI0NywgIDE1MywgIDE1NiwgIDE2MSwgIDE2NSwgIDE3MCwgIDE3NiwgIDE4MCwKIAotICAgICAgIDI5LCAgMzAzLCAgMzAzLCAgMjE1LCAgMjIxLCAgMjI2LCAgMjI5LCAgMjM0LCAgMjQwLCAgMjQ2LAotICAgICAgMjUwLCAgMjU3LCAgMjY1LCAgMjcwLCAgMjc1LCAgMjgyCisgICAgICAxODcsICAxOTUsICAyMDAsICAyMDUsICAyMTIKICAgICB9IDsKIAotc3RhdGljIHl5Y29uc3QgZmxleF9pbnQxNl90IHl5X2RlZlsxMTddID0KK3N0YXRpYyB5eWNvbnN0IGZsZXhfaW50MTZfdCB5eV9kZWZbMTA2XSA9CiAgICAgeyAgIDAsCi0gICAgICAxMDMsICAgIDEsICAgIDEsICAgIDMsICAgIDMsICAgIDUsICAxMDMsICAgIDcsICAgIDMsICAgIDMsCi0gICAgICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDQsICAxMDUsICAxMDMsICAxMDYsICAxMDMsICAgMTksCi0gICAgICAgMTksICAgMjAsICAxMDMsICAxMDcsICAgMjAsICAxMDMsICAxMDgsICAxMDksICAxMDUsICAxMDMsCi0gICAgICAxMDMsICAxMDMsICAxMDQsICAxMDMsICAxMDQsICAxMTAsICAxMTEsICAxMDMsICAxMTIsICAxMTMsCi0gICAgICAxMDMsICAxMDMsICAxMDMsICAxMDYsICAgMTksICAxMDMsICAgMjAsICAxMDMsICAxMDMsICAxMDMsCi0gICAgICAgMjAsICAxMDgsICAxMDksICAxMDMsICAxMTQsICAxMTAsICAxMTEsICAxMTUsICAxMTIsICAxMTIsCi0gICAgICAxMTMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMTQsICAxMTUsICAxMDMsICAxMDMsCi0gICAgICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsCi0gICAgICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsCi0gICAgICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMTYsICAxMDMsICAxMTYsICAxMDMsICAxMTYsCisgICAgICAgOTMsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDUsICAgOTMsICAgIDcsICAgIDEsICAgIDEsCisgICAgICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTQsICAgOTUsICAgOTMsICAgOTYsICAgMTcsICAgOTcsCisgICAgICAgOTYsICAgOTMsICAgOTgsICAgOTksICAgOTMsICAgOTMsICAgOTMsICAgOTQsICAgOTMsICAgOTQsCisgICAgICAxMDAsICAgOTMsICAxMDEsICAxMDIsICAgOTMsICAgOTMsICAgOTMsICAgOTYsICAgOTMsICAgOTMsCisgICAgICAgOTMsICAgOTYsICAgOTgsICAgOTksICAgOTMsICAxMDMsICAxMDAsICAxMDQsICAxMDEsICAxMDEsCisgICAgICAxMDIsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAxMDMsICAxMDQsICAgOTMsICAgOTMsCisgICAgICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsCisgICAgICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsCisgICAgICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAxMDUsICAgOTMsICAxMDUsICAgOTMsICAxMDUsCisgICAgICAgOTMsICAgOTMsICAgIDAsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsCiAKLSAgICAgIDEwMywgIDEwMywgICAgMCwgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywKLSAgICAgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMworICAgICAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzCiAgICAgfSA7CiAKLXN0YXRpYyB5eWNvbnN0IGZsZXhfaW50MTZfdCB5eV9ueHRbMzM5XSA9CitzdGF0aWMgeXljb25zdCBmbGV4X2ludDE2X3QgeXlfbnh0WzI4MV0gPQogICAgIHsgICAwLAotICAgICAgIDEyLCAgIDEzLCAgIDE0LCAgIDE1LCAgIDEyLCAgIDE2LCAgIDEyLCAgIDEyLCAgIDEyLCAgIDE3LAotICAgICAgIDE4LCAgIDE4LCAgIDE4LCAgIDEyLCAgIDE5LCAgIDIwLCAgIDIwLCAgIDEyLCAgIDEyLCAgIDIxLAotICAgICAgIDE5LCAgIDIxLCAgIDE5LCAgIDIyLCAgIDIwLCAgIDIwLCAgIDIwLCAgIDIwLCAgIDIwLCAgIDIwLAotICAgICAgIDIwLCAgIDIwLCAgIDIwLCAgIDEyLCAgIDEyLCAgIDEyLCAgIDMyLCAgIDMyLCAgMTAyLCAgIDIzLAotICAgICAgIDEyLCAgIDEyLCAgIDEyLCAgIDM0LCAgIDIwLCAgIDMyLCAgIDMyLCAgIDMyLCAgIDMyLCAgIDIwLAotICAgICAgIDIwLCAgIDIwLCAgIDIwLCAgIDIwLCAgIDI0LCAgIDI0LCAgIDI0LCAgIDM1LCAgIDI1LCAgIDU0LAotICAgICAgIDU0LCAgIDU0LCAgIDI2LCAgIDI1LCAgIDI1LCAgIDI1LCAgIDI1LCAgIDEyLCAgIDEzLCAgIDE0LAotICAgICAgIDE1LCAgIDI3LCAgIDEyLCAgIDI3LCAgIDI3LCAgIDI3LCAgIDIzLCAgIDI3LCAgIDI3LCAgIDI3LAotICAgICAgIDEyLCAgIDI4LCAgIDI4LCAgIDI4LCAgIDEyLCAgIDEyLCAgIDI4LCAgIDI4LCAgIDI4LCAgIDI4LAotICAgICAgIDI4LCAgIDI4LCAgIDI4LCAgIDI4LCAgIDI4LCAgIDI4LCAgIDI4LCAgIDI4LCAgIDI4LCAgIDI4LAorICAgICAgIDEyLCAgIDEzLCAgIDE0LCAgIDE1LCAgIDEyLCAgIDE2LCAgIDEyLCAgIDEyLCAgIDE3LCAgIDEyLAorICAgICAgIDEyLCAgIDEyLCAgIDEyLCAgIDE4LCAgIDE4LCAgIDE4LCAgIDEyLCAgIDEyLCAgIDE4LCAgIDE4LAorICAgICAgIDE4LCAgIDE4LCAgIDE4LCAgIDE4LCAgIDE4LCAgIDE4LCAgIDE4LCAgIDE4LCAgIDE4LCAgIDE4LAorICAgICAgIDE4LCAgIDEyLCAgIDEyLCAgIDE5LCAgIDIwLCAgIDIwLCAgIDIwLCAgIDkyLCAgIDIxLCAgIDI1LAorICAgICAgIDI2LCAgIDI2LCAgIDIyLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDEyLCAgIDEzLCAgIDE0LAorICAgICAgIDE1LCAgIDIzLCAgIDE2LCAgIDIzLCAgIDIzLCAgIDE5LCAgIDIzLCAgIDIzLCAgIDIzLCAgIDEyLAorICAgICAgIDI0LCAgIDI0LCAgIDI0LCAgIDEyLCAgIDEyLCAgIDI0LCAgIDI0LCAgIDI0LCAgIDI0LCAgIDI0LAorICAgICAgIDI0LCAgIDI0LCAgIDI0LCAgIDI0LCAgIDI0LCAgIDI0LCAgIDI0LCAgIDI0LCAgIDEyLCAgIDEyLAorICAgICAgIDI1LCAgIDI2LCAgIDI2LCAgIDI3LCAgIDI3LCAgIDI3LCAgIDI3LCAgIDI5LCAgIDQzLCAgIDI5LAorICAgICAgIDQzLCAgIDQzLCAgIDQ1LCAgIDQ1LCAgIDQ1LCAgIDUwLCAgIDM5LCAgIDU5LCAgIDQ2LCAgIDkzLAogCi0gICAgICAgMTIsICAgMTIsICAgMjksICAgMzYsICAxMDMsICAgMzQsICAgMTcsICAgMzAsICAgMzEsICAgMzEsCi0gICAgICAgMjksICAgNTQsICAgNTQsICAgNTQsICAgMTcsICAgMzAsICAgMzEsICAgMzEsICAgMzksICAgMzUsCi0gICAgICAgNTIsICAgNDAsICAgNTIsICAgNTIsICAgNTIsICAxMDMsICAgNzgsICAgMzgsICAgMzgsICAgNDYsCi0gICAgICAxMDEsICAgNjAsICAgNzksICAgNDEsICAgNjksICAgOTcsICAgNDIsICAgOTQsICAgNDMsICAgNDUsCi0gICAgICAgNDUsICAgNDUsICAgNDYsICAgNDUsICAgNDcsICAgNDcsICAgOTMsICAgOTIsICAgNDUsICAgNDUsCi0gICAgICAgNDUsICAgNDUsICAgNDcsICAgNDcsICAgNDcsICAgNDcsICAgNDcsICAgNDcsICAgNDcsICAgNDcsCi0gICAgICAgNDcsICAgNDcsICAgNDcsICAgNDcsICAgNDcsICAgMzksICAgNDcsICAgOTEsICAgNDAsICAgOTAsCi0gICAgICAgOTksICAgNDcsICAgNDcsICAgNDcsICAgNDcsICAgNTQsICAgNTQsICAgNTQsICAgODksICAgODgsCi0gICAgICAgNDEsICAgNTUsICAgODcsICAgNDksICAxMDAsICAgNDMsICAgNTEsICAgNTEsICAgNTEsICAgODYsCi0gICAgICAgNTEsICAgOTUsICAgOTUsICAgOTYsICAgODUsICAgNTEsICAgNTEsICAgNTEsICAgNTEsICAgNTIsCisgICAgICAgMzAsICAgMzMsICAgMzAsICAgMzQsICAgNDUsICAgNDUsICAgNDUsICAgMjcsICAgMjcsICAgNjgsCisgICAgICAgNDMsICAgOTEsICAgNDMsICAgNDMsICAgNjksICAgMzUsICAgODcsICAgMzYsICAgMzksICAgMzcsCisgICAgICAgNDIsICAgNDIsICAgNDIsICAgMzksICAgNDIsICAgNDUsICAgNDUsICAgNDUsICAgODksICAgNDIsCisgICAgICAgNDIsICAgNDIsICAgNDIsICAgODUsICAgODUsICAgODYsICAgODUsICAgODUsICAgODYsICAgODksCisgICAgICAgODQsICAgOTAsICAgODMsICAgODIsICAgODEsICAgODAsICAgNzksICAgNzgsICAgNzcsICAgNzYsCisgICAgICAgNzUsICAgNzQsICAgOTAsICAgMjgsICAgMjgsICAgMjgsICAgMjgsICAgMjgsICAgMjgsICAgMjgsCisgICAgICAgMjgsICAgMzEsICAgMzEsICAgMzEsICAgMzgsICAgMzgsICAgMzgsICAgMzgsICAgNDEsICAgNzMsCisgICAgICAgNDEsICAgNDMsICAgNzIsICAgNDMsICAgNzEsICAgNDMsICAgNDMsICAgNDQsICAgMzMsICAgNDQsCisgICAgICAgNDQsICAgNDQsICAgNDQsICAgNDcsICAgNjksICAgNDcsICAgNDcsICAgNDksICAgNDksICAgNDksCisgICAgICAgNDksICAgNDksICAgNDksICAgNDksICAgNDksICAgNTEsICAgNTEsICAgNTEsICAgNTEsICAgNTEsCiAKLSAgICAgICA5OSwgICA1MiwgICA1MiwgICA1MiwgICA5NSwgICA5NSwgICA5NiwgICA4NCwgICA0NiwgICA4MywKLSAgICAgICA4MiwgICA4MSwgICAzOSwgICA3OSwgIDEwMCwgICAzMywgICAzMywgICAzMywgICAzMywgICAzMywKLSAgICAgICAzMywgICAzMywgICAzMywgICAzNywgICA4MCwgICA3NywgICAzNywgICAzNywgICAzNywgICA0NCwKLSAgICAgICA0MCwgICA0NCwgICA1MCwgICA3NiwgICA1MCwgICA1MiwgICA3NSwgICA1MiwgICA3NCwgICA1MiwKLSAgICAgICA1MiwgICA1MywgICA3MywgICA1MywgICA1MywgICA1MywgICA1MywgICA1NiwgICA1NiwgICA1NiwKLSAgICAgICA3MiwgICA1NiwgICA1NiwgICA1NywgICA3MSwgICA1NywgICA1NywgICA1OSwgICA1OSwgICA1OSwKLSAgICAgICA1OSwgICA1OSwgICA1OSwgICA1OSwgICA1OSwgICA2MSwgICA2MSwgICA2MSwgICA2MSwgICA2MSwKLSAgICAgICA2MSwgICA2MSwgICA2MSwgICA2NywgICA3MCwgICA2NywgICA2OCwgICA2OCwgICA2OCwgICA2MiwKLSAgICAgICA2OCwgICA2OCwgICA5OCwgICA5OCwgICA5OCwgICA5OCwgICA5OCwgICA5OCwgICA5OCwgICA5OCwKLSAgICAgICA2MCwgICA2NiwgICA2NSwgICA2NCwgICA2MywgICA2MiwgICA2MCwgICA1OCwgIDEwMywgICA0OCwKLQotICAgICAgIDQ4LCAgMTAzLCAgIDExLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLAotICAgICAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLAotICAgICAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLAotICAgICAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzCisgICAgICAgNTEsICAgNTEsICAgNTEsICAgNTcsICAgNzAsICAgNTcsICAgNTgsICAgNTgsICAgNTgsICAgNjcsCisgICAgICAgNTgsICAgNTgsICAgODgsICAgODgsICAgODgsICAgODgsICAgODgsICAgODgsICAgODgsICAgODgsCisgICAgICAgMzQsICAgNjYsICAgNjUsICAgNjQsICAgNjMsICAgNjIsICAgNjEsICAgNjAsICAgNTIsICAgNTAsCisgICAgICAgMzksICAgNTYsICAgMzksICAgNTUsICAgNTQsICAgNTMsICAgNTIsICAgNTAsICAgNDgsICAgOTMsCisgICAgICAgNDAsICAgMzksICAgMzIsICAgOTMsICAgMTksICAgMTksICAgMTEsICAgOTMsICAgOTMsICAgOTMsCisgICAgICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsCisgICAgICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsCisgICAgICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMKICAgICB9IDsKIAotc3RhdGljIHl5Y29uc3QgZmxleF9pbnQxNl90IHl5X2Noa1szMzldID0KK3N0YXRpYyB5eWNvbnN0IGZsZXhfaW50MTZfdCB5eV9jaGtbMjgxXSA9CiAgICAgeyAgIDAsCiAgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCiAgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCiAgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCi0gICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDMsICAgMTMsICAgMTMsICAxMDEsICAgIDMsCi0gICAgICAgIDMsICAgIDMsICAgIDMsICAgMTUsICAgIDMsICAgMTQsICAgMTQsICAgMzIsICAgMzIsICAgIDMsCi0gICAgICAgIDMsICAgIDMsICAgIDMsICAgIDMsICAgIDUsICAgIDUsICAgIDUsICAgMTUsICAgIDUsICAgMzEsCi0gICAgICAgMzEsICAgMzEsICAgIDUsICAgIDUsICAgIDUsICAgIDUsICAgIDUsICAgIDcsICAgIDcsICAgIDcsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDUsICAgIDUsICAgIDUsICAgIDUsICAgOTEsICAgIDUsICAgIDksCisgICAgICAgIDksICAgIDksICAgIDUsICAgIDUsICAgIDUsICAgIDUsICAgIDUsICAgIDcsICAgIDcsICAgIDcsCiAgICAgICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsCiAgICAgICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsCiAgICAgICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsCisgICAgICAgMTAsICAgMTAsICAgMTAsICAgMTMsICAgMTMsICAgMTQsICAgMTQsICAgMTUsICAgMjQsICAgMjgsCisgICAgICAgMjQsICAgMjQsICAgMjUsICAgMjUsICAgMjUsICAgNTAsICAgMjQsICAgNTAsICAgMjUsICAgOTAsCiAKLSAgICAgICAgNywgICAgNywgICAgOSwgICAxNiwgICAyOSwgICAzMywgICAgOSwgICAgOSwgICAgOSwgICAgOSwKLSAgICAgICAxMCwgICA1NCwgICA1NCwgICA1NCwgICAxMCwgICAxMCwgICAxMCwgICAxMCwgICAxNywgICAzMywKLSAgICAgICAyOCwgICAxNywgICAyOCwgICAyOCwgICAyOCwgIDEwMCwgICA3MiwgICAxNiwgICAyOSwgICAyOCwKLSAgICAgICA5NywgICA2MCwgICA3MiwgICAxNywgICA2MCwgICA5NCwgICAxNywgICA5MiwgICAxNywgICAxOSwKLSAgICAgICAxOSwgICAxOSwgICAxOSwgICAxOSwgICAxOSwgICAxOSwgICA5MSwgICA4OCwgICAxOSwgICAxOSwKLSAgICAgICAxOSwgICAxOSwgICAxOSwgICAxOSwgICAxOSwgICAxOSwgICAxOSwgICAxOSwgICAxOSwgICAxOSwKLSAgICAgICAxOSwgICAxOSwgICAyMCwgICAyMCwgICAyMCwgICAyMywgICAyMCwgICA4NywgICAyMywgICA4NiwKLSAgICAgICA5NiwgICAyMCwgICAyMCwgICAyMCwgICAyMCwgICAzMCwgICAzMCwgICAzMCwgICA4NSwgICA4NCwKLSAgICAgICAyMywgICAzMCwgICA4MywgICAyMywgICA5NiwgICAyMywgICAyNSwgICAyNSwgICAyNSwgICA4MiwKLSAgICAgICAyNSwgICA5MywgICA5MywgICA5MywgICA4MSwgICAyNSwgICAyNSwgICAyNSwgICAyNSwgICA1MywKKyAgICAgICAxNSwgICAxNywgICAyOCwgICAxNywgICAyNiwgICAyNiwgICAyNiwgICAyNywgICAyNywgICA2MiwKKyAgICAgICA0NCwgICA4NywgICA0NCwgICA0NCwgICA2MiwgICAxNywgICA4NCwgICAxNywgICA0NCwgICAxNywKKyAgICAgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICA0NSwgICA0NSwgICA0NSwgICA4NiwgICAyMSwKKyAgICAgICAyMSwgICAyMSwgICAyMSwgICA4MywgICA4MywgICA4MywgICA4NSwgICA4NSwgICA4NSwgICA4OCwKKyAgICAgICA4MiwgICA4NiwgICA4MSwgICA3OCwgICA3NywgICA3NiwgICA3NSwgICA3NCwgICA3MywgICA3MiwKKyAgICAgICA3MSwgICA3MCwgICA4OCwgICA5NCwgICA5NCwgICA5NCwgICA5NCwgICA5NCwgICA5NCwgICA5NCwKKyAgICAgICA5NCwgICA5NSwgICA5NSwgICA5NSwgICA5NiwgICA5NiwgICA5NiwgICA5NiwgICA5NywgICA2OSwKKyAgICAgICA5NywgICA5OCwgICA2OCwgICA5OCwgICA2NywgICA5OCwgICA5OCwgICA5OSwgICA2NiwgICA5OSwKKyAgICAgICA5OSwgICA5OSwgICA5OSwgIDEwMCwgICA2NCwgIDEwMCwgIDEwMCwgIDEwMSwgIDEwMSwgIDEwMSwKKyAgICAgIDEwMSwgIDEwMSwgIDEwMSwgIDEwMSwgIDEwMSwgIDEwMiwgIDEwMiwgIDEwMiwgIDEwMiwgIDEwMiwKIAotICAgICAgIDk4LCAgIDUzLCAgIDUzLCAgIDUzLCAgIDk1LCAgIDk1LCAgIDk1LCAgIDgwLCAgIDUzLCAgIDc5LAotICAgICAgIDc4LCAgIDc3LCAgIDc2LCAgIDc0LCAgIDk4LCAgMTA0LCAgMTA0LCAgMTA0LCAgMTA0LCAgMTA0LAotICAgICAgMTA0LCAgMTA0LCAgMTA0LCAgMTA1LCAgIDczLCAgIDcxLCAgMTA1LCAgMTA1LCAgMTA1LCAgMTA2LAotICAgICAgIDcwLCAgMTA2LCAgMTA3LCAgIDY5LCAgMTA3LCAgMTA4LCAgIDY4LCAgMTA4LCAgIDY2LCAgMTA4LAotICAgICAgMTA4LCAgMTA5LCAgIDY1LCAgMTA5LCAgMTA5LCAgMTA5LCAgMTA5LCAgMTEwLCAgMTEwLCAgMTEwLAotICAgICAgIDY0LCAgMTEwLCAgMTEwLCAgMTExLCAgIDYzLCAgMTExLCAgMTExLCAgMTEyLCAgMTEyLCAgMTEyLAotICAgICAgMTEyLCAgMTEyLCAgMTEyLCAgMTEyLCAgMTEyLCAgMTEzLCAgMTEzLCAgMTEzLCAgMTEzLCAgMTEzLAotICAgICAgMTEzLCAgMTEzLCAgMTEzLCAgMTE0LCAgIDYyLCAgMTE0LCAgMTE1LCAgMTE1LCAgMTE1LCAgIDYxLAotICAgICAgMTE1LCAgMTE1LCAgMTE2LCAgMTE2LCAgMTE2LCAgMTE2LCAgMTE2LCAgMTE2LCAgMTE2LCAgMTE2LAotICAgICAgIDU5LCAgIDQ5LCAgIDQzLCAgIDQyLCAgIDQxLCAgIDQwLCAgIDM5LCAgIDM4LCAgIDM1LCAgIDIyLAotCi0gICAgICAgMjEsICAgMTEsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsCi0gICAgICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsCi0gICAgICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsCi0gICAgICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMKKyAgICAgIDEwMiwgIDEwMiwgIDEwMiwgIDEwMywgICA2MywgIDEwMywgIDEwNCwgIDEwNCwgIDEwNCwgICA2MSwKKyAgICAgIDEwNCwgIDEwNCwgIDEwNSwgIDEwNSwgIDEwNSwgIDEwNSwgIDEwNSwgIDEwNSwgIDEwNSwgIDEwNSwKKyAgICAgICA2MCwgICA1OSwgICA1OCwgICA1NiwgICA1NSwgICA1NCwgICA1MywgICA1MiwgICA1MSwgICA0OSwKKyAgICAgICA0MiwgICA0MCwgICAzOCwgICAzNywgICAzNiwgICAzNSwgICAzNCwgICAzMywgICAzMiwgICAzMCwKKyAgICAgICAxOSwgICAxOCwgICAxNiwgICAxMSwgICAgNCwgICAgMywgICA5MywgICA5MywgICA5MywgICA5MywKKyAgICAgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywKKyAgICAgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywKKyAgICAgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MwogICAgIH0gOwogCi0vKiBUYWJsZSBvZiBib29sZWFucywgdHJ1ZSBpZiBydWxlIGNvdWxkIG1hdGNoIGVvbC4gKi8KLXN0YXRpYyB5eWNvbnN0IGZsZXhfaW50MzJfdCB5eV9ydWxlX2Nhbl9tYXRjaF9lb2xbMjFdID0KLSAgICB7ICAgMCwKLTEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDAsIAotICAgIDAsICAgICB9OwotCiBzdGF0aWMgeXlfc3RhdGVfdHlwZSB5eV9sYXN0X2FjY2VwdGluZ19zdGF0ZTsKIHN0YXRpYyBjaGFyICp5eV9sYXN0X2FjY2VwdGluZ19jcG9zOwogCkBAIC02MTYsNiArNTgwLDEzIEBACiAjaW5jbHVkZSAic3JjcG9zLmgiCiAjaW5jbHVkZSAiZHRjLXBhcnNlci50YWIuaCIKIAorWVlMVFlQRSB5eWxsb2M7CisKKy8qIENBVVRJT046IHRoaXMgd2lsbCBzdG9wIHdvcmtpbmcgaWYgd2UgZXZlciB1c2UgeXlsZXNzKCkgb3IgeXl1bnB1dCgpICovCisjZGVmaW5lCVlZX1VTRVJfQUNUSU9OIFwKKwl7IFwKKwkJc3JjcG9zX3VwZGF0ZSgmeXlsbG9jLCB5eXRleHQsIHl5bGVuZyk7IFwKKwl9CiAKIC8qI2RlZmluZSBMRVhERUJVRwkxKi8KIApAQCAtNjI1LDE5ICs1OTYsMTQgQEAKICNkZWZpbmUgRFBSSU5UKGZtdCwgLi4uKQlkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYKIAotc3RhdGljIGludCBkdHNfdmVyc2lvbjsgLyogPSAwICovCitzdGF0aWMgaW50IGR0c192ZXJzaW9uID0gMTsKIAotI2RlZmluZSBCRUdJTl9ERUZBVUxUKCkJaWYgKGR0c192ZXJzaW9uID09IDApIHsgXAotCQkJCURQUklOVCgiPElOSVRJQUw+XG4iKTsgXAotCQkJCUJFR0lOKElOSVRJQUwpOyBcCi0JCQl9IGVsc2UgeyBcCi0JCQkJRFBSSU5UKCI8VjE+XG4iKTsgXAorI2RlZmluZSBCRUdJTl9ERUZBVUxUKCkJCURQUklOVCgiPFYxPlxuIik7IFwKIAkJCQlCRUdJTihWMSk7IFwKLQkJCX0KIAogc3RhdGljIHZvaWQgcHVzaF9pbnB1dF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKIHN0YXRpYyBpbnQgcG9wX2lucHV0X2ZpbGUodm9pZCk7Ci0jbGluZSA2NDEgImR0Yy1sZXhlci5sZXguYyIKKyNsaW5lIDYwNyAiZHRjLWxleGVyLmxleC5jIgogCiAjZGVmaW5lIElOSVRJQUwgMAogI2RlZmluZSBJTkNMVURFIDEKQEAgLTgyNiw5ICs3OTIsOSBAQAogCXJlZ2lzdGVyIGNoYXIgKnl5X2NwLCAqeXlfYnA7CiAJcmVnaXN0ZXIgaW50IHl5X2FjdDsKICAgICAKLSNsaW5lIDY0ICJkdGMtbGV4ZXIubCIKKyNsaW5lIDY2ICJkdGMtbGV4ZXIubCIKIAotI2xpbmUgODMyICJkdGMtbGV4ZXIubGV4LmMiCisjbGluZSA3OTggImR0Yy1sZXhlci5sZXguYyIKIAogCWlmICggISh5eV9pbml0KSApCiAJCXsKQEAgLTg4MSwzNSArODQ3LDIxIEBACiAJCQl3aGlsZSAoIHl5X2Noa1t5eV9iYXNlW3l5X2N1cnJlbnRfc3RhdGVdICsgeXlfY10gIT0geXlfY3VycmVudF9zdGF0ZSApCiAJCQkJewogCQkJCXl5X2N1cnJlbnRfc3RhdGUgPSAoaW50KSB5eV9kZWZbeXlfY3VycmVudF9zdGF0ZV07Ci0JCQkJaWYgKCB5eV9jdXJyZW50X3N0YXRlID49IDEwNCApCisJCQkJaWYgKCB5eV9jdXJyZW50X3N0YXRlID49IDk0ICkKIAkJCQkJeXlfYyA9IHl5X21ldGFbKHVuc2lnbmVkIGludCkgeXlfY107CiAJCQkJfQogCQkJeXlfY3VycmVudF9zdGF0ZSA9IHl5X254dFt5eV9iYXNlW3l5X2N1cnJlbnRfc3RhdGVdICsgKHVuc2lnbmVkIGludCkgeXlfY107CiAJCQkrK3l5X2NwOwogCQkJfQotCQl3aGlsZSAoIHl5X2Jhc2VbeXlfY3VycmVudF9zdGF0ZV0gIT0gMzAzICk7CisJCXdoaWxlICggeXlfY3VycmVudF9zdGF0ZSAhPSA5MyApOworCQl5eV9jcCA9ICh5eV9sYXN0X2FjY2VwdGluZ19jcG9zKTsKKwkJeXlfY3VycmVudF9zdGF0ZSA9ICh5eV9sYXN0X2FjY2VwdGluZ19zdGF0ZSk7CiAKIHl5X2ZpbmRfYWN0aW9uOgogCQl5eV9hY3QgPSB5eV9hY2NlcHRbeXlfY3VycmVudF9zdGF0ZV07Ci0JCWlmICggeXlfYWN0ID09IDAgKQotCQkJeyAvKiBoYXZlIHRvIGJhY2sgdXAgKi8KLQkJCXl5X2NwID0gKHl5X2xhc3RfYWNjZXB0aW5nX2Nwb3MpOwotCQkJeXlfY3VycmVudF9zdGF0ZSA9ICh5eV9sYXN0X2FjY2VwdGluZ19zdGF0ZSk7Ci0JCQl5eV9hY3QgPSB5eV9hY2NlcHRbeXlfY3VycmVudF9zdGF0ZV07Ci0JCQl9CiAKIAkJWVlfRE9fQkVGT1JFX0FDVElPTjsKIAotCQlpZiAoIHl5X2FjdCAhPSBZWV9FTkRfT0ZfQlVGRkVSICYmIHl5X3J1bGVfY2FuX21hdGNoX2VvbFt5eV9hY3RdICkKLQkJCXsKLQkJCWludCB5eWw7Ci0JCQlmb3IgKCB5eWwgPSAwOyB5eWwgPCB5eWxlbmc7ICsreXlsICkKLQkJCQlpZiAoIHl5dGV4dFt5eWxdID09ICdcbicgKQotCQkJCQkgICAKLSAgICB5eWxpbmVubysrOwotOwotCQkJfQotCiBkb19hY3Rpb246CS8qIFRoaXMgbGFiZWwgaXMgdXNlZCBvbmx5IHRvIGFjY2VzcyBFT0YgYWN0aW9ucy4gKi8KIAogCQlzd2l0Y2ggKCB5eV9hY3QgKQpAQCAtOTI0LDcgKzg3Niw3IEBACiBjYXNlIDE6CiAvKiBydWxlIDEgY2FuIG1hdGNoIGVvbCAqLwogWVlfUlVMRV9TRVRVUAotI2xpbmUgNjUgImR0Yy1sZXhlci5sIgorI2xpbmUgNjcgImR0Yy1sZXhlci5sIgogewogCQkJY2hhciAqbmFtZSA9IHN0cmNocih5eXRleHQsICdcIicpICsgMTsKIAkJCXl5dGV4dFt5eWxlbmctMV0gPSAnXDAnOwpAQCAtOTM2LDcgKzg4OCw3IEBACiBjYXNlIFlZX1NUQVRFX0VPRihCWVRFU1RSSU5HKToKIGNhc2UgWVlfU1RBVEVfRU9GKFBST1BOT0RFTkFNRSk6CiBjYXNlIFlZX1NUQVRFX0VPRihWMSk6Ci0jbGluZSA3MSAiZHRjLWxleGVyLmwiCisjbGluZSA3MyAiZHRjLWxleGVyLmwiCiB7CiAJCQlpZiAoIXBvcF9pbnB1dF9maWxlKCkpIHsKIAkJCQl5eXRlcm1pbmF0ZSgpOwpAQCAtOTQ2LDIzICs4OTgsMTggQEAKIGNhc2UgMjoKIC8qIHJ1bGUgMiBjYW4gbWF0Y2ggZW9sICovCiBZWV9SVUxFX1NFVFVQCi0jbGluZSA3NyAiZHRjLWxleGVyLmwiCisjbGluZSA3OSAiZHRjLWxleGVyLmwiCiB7Ci0JCQl5eWxsb2MuZmlsZSA9IHNyY3Bvc19maWxlOwotCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKIAkJCURQUklOVCgiU3RyaW5nOiAlc1xuIiwgeXl0ZXh0KTsKIAkJCXl5bHZhbC5kYXRhID0gZGF0YV9jb3B5X2VzY2FwZV9zdHJpbmcoeXl0ZXh0KzEsCiAJCQkJCXl5bGVuZy0yKTsKLQkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87CiAJCQlyZXR1cm4gRFRfU1RSSU5HOwogCQl9CiAJWVlfQlJFQUsKIGNhc2UgMzoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDg3ICJkdGMtbGV4ZXIubCIKKyNsaW5lIDg2ICJkdGMtbGV4ZXIubCIKIHsKLQkJCXl5bGxvYy5maWxlID0gc3JjcG9zX2ZpbGU7Ci0JCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOwogCQkJRFBSSU5UKCJLZXl3b3JkOiAvZHRzLXYxL1xuIik7CiAJCQlkdHNfdmVyc2lvbiA9IDE7CiAJCQlCRUdJTl9ERUZBVUxUKCk7CkBAIC05NzEsMTAgKzkxOCw4IEBACiAJWVlfQlJFQUsKIGNhc2UgNDoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDk2ICJkdGMtbGV4ZXIubCIKKyNsaW5lIDkzICJkdGMtbGV4ZXIubCIKIHsKLQkJCXl5bGxvYy5maWxlID0gc3JjcG9zX2ZpbGU7Ci0JCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOwogCQkJRFBSSU5UKCJLZXl3b3JkOiAvbWVtcmVzZXJ2ZS9cbiIpOwogCQkJQkVHSU5fREVGQVVMVCgpOwogCQkJcmV0dXJuIERUX01FTVJFU0VSVkU7CkBAIC05ODIsMTU4ICs5MjcsMTAwIEBACiAJWVlfQlJFQUsKIGNhc2UgNToKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDEwNCAiZHRjLWxleGVyLmwiCisjbGluZSA5OSAiZHRjLWxleGVyLmwiCiB7Ci0JCQl5eWxsb2MuZmlsZSA9IHNyY3Bvc19maWxlOwotCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKIAkJCURQUklOVCgiTGFiZWw6ICVzXG4iLCB5eXRleHQpOwotCQkJeXlsdmFsLmxhYmVscmVmID0gc3RyZHVwKHl5dGV4dCk7CisJCQl5eWx2YWwubGFiZWxyZWYgPSB4c3RyZHVwKHl5dGV4dCk7CiAJCQl5eWx2YWwubGFiZWxyZWZbeXlsZW5nLTFdID0gJ1wwJzsKIAkJCXJldHVybiBEVF9MQUJFTDsKIAkJfQogCVlZX0JSRUFLCiBjYXNlIDY6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAxMTMgImR0Yy1sZXhlci5sIgorI2xpbmUgMTA2ICJkdGMtbGV4ZXIubCIKIHsKLQkJCXl5bGxvYy5maWxlID0gc3JjcG9zX2ZpbGU7Ci0JCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOwotCQkJaWYgKCp5eXRleHQgPT0gJ2InKQotCQkJCXl5bHZhbC5jYmFzZSA9IDI7Ci0JCQllbHNlIGlmICgqeXl0ZXh0ID09ICdvJykKLQkJCQl5eWx2YWwuY2Jhc2UgPSA4OwotCQkJZWxzZSBpZiAoKnl5dGV4dCA9PSAnZCcpCi0JCQkJeXlsdmFsLmNiYXNlID0gMTA7Ci0JCQllbHNlCi0JCQkJeXlsdmFsLmNiYXNlID0gMTY7Ci0JCQlEUFJJTlQoIkJhc2U6ICVkXG4iLCB5eWx2YWwuY2Jhc2UpOwotCQkJcmV0dXJuIERUX0JBU0U7Ci0JCX0KLQlZWV9CUkVBSwotY2FzZSA3OgotWVlfUlVMRV9TRVRVUAotI2xpbmUgMTI4ICJkdGMtbGV4ZXIubCIKLXsKLQkJCXl5bGxvYy5maWxlID0gc3JjcG9zX2ZpbGU7Ci0JCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOwotCQkJeXlsdmFsLmxpdGVyYWwgPSBzdHJkdXAoeXl0ZXh0KTsKLQkJCURQUklOVCgiTGl0ZXJhbDogJyVzJ1xuIiwgeXlsdmFsLmxpdGVyYWwpOwotCQkJcmV0dXJuIERUX0xFR0FDWUxJVEVSQUw7Ci0JCX0KLQlZWV9CUkVBSwotY2FzZSA4OgotWVlfUlVMRV9TRVRVUAotI2xpbmUgMTM2ICJkdGMtbGV4ZXIubCIKLXsKLQkJCXl5bGxvYy5maWxlID0gc3JjcG9zX2ZpbGU7Ci0JCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOwotCQkJeXlsdmFsLmxpdGVyYWwgPSBzdHJkdXAoeXl0ZXh0KTsKKwkJCXl5bHZhbC5saXRlcmFsID0geHN0cmR1cCh5eXRleHQpOwogCQkJRFBSSU5UKCJMaXRlcmFsOiAnJXMnXG4iLCB5eWx2YWwubGl0ZXJhbCk7CiAJCQlyZXR1cm4gRFRfTElURVJBTDsKIAkJfQogCVlZX0JSRUFLCi1jYXNlIDk6CitjYXNlIDc6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAxNDQgImR0Yy1sZXhlci5sIgorI2xpbmUgMTEyICJkdGMtbGV4ZXIubCIKIHsJLyogbGFiZWwgcmVmZXJlbmNlICovCi0JCQl5eWxsb2MuZmlsZSA9IHNyY3Bvc19maWxlOwotCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKIAkJCURQUklOVCgiUmVmOiAlc1xuIiwgeXl0ZXh0KzEpOwotCQkJeXlsdmFsLmxhYmVscmVmID0gc3RyZHVwKHl5dGV4dCsxKTsKKwkJCXl5bHZhbC5sYWJlbHJlZiA9IHhzdHJkdXAoeXl0ZXh0KzEpOwogCQkJcmV0dXJuIERUX1JFRjsKIAkJfQogCVlZX0JSRUFLCi1jYXNlIDEwOgorY2FzZSA4OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMTUyICJkdGMtbGV4ZXIubCIKKyNsaW5lIDExOCAiZHRjLWxleGVyLmwiCiB7CS8qIG5ldy1zdHlsZSBwYXRoIHJlZmVyZW5jZSAqLwotCQkJeXlsbG9jLmZpbGUgPSBzcmNwb3NfZmlsZTsKLQkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87CiAJCQl5eXRleHRbeXlsZW5nLTFdID0gJ1wwJzsKIAkJCURQUklOVCgiUmVmOiAlc1xuIiwgeXl0ZXh0KzIpOwotCQkJeXlsdmFsLmxhYmVscmVmID0gc3RyZHVwKHl5dGV4dCsyKTsKKwkJCXl5bHZhbC5sYWJlbHJlZiA9IHhzdHJkdXAoeXl0ZXh0KzIpOwogCQkJcmV0dXJuIERUX1JFRjsKIAkJfQogCVlZX0JSRUFLCi1jYXNlIDExOgorY2FzZSA5OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMTYxICJkdGMtbGV4ZXIubCIKLXsJLyogb2xkLXN0eWxlIHBhdGggcmVmZXJlbmNlICovCi0JCQl5eWxsb2MuZmlsZSA9IHNyY3Bvc19maWxlOwotCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKLQkJCURQUklOVCgiUmVmOiAlc1xuIiwgeXl0ZXh0KzEpOwotCQkJeXlsdmFsLmxhYmVscmVmID0gc3RyZHVwKHl5dGV4dCsxKTsKLQkJCXJldHVybiBEVF9SRUY7Ci0JCX0KLQlZWV9CUkVBSwotY2FzZSAxMjoKLVlZX1JVTEVfU0VUVVAKLSNsaW5lIDE2OSAiZHRjLWxleGVyLmwiCisjbGluZSAxMjUgImR0Yy1sZXhlci5sIgogewotCQkJeXlsbG9jLmZpbGUgPSBzcmNwb3NfZmlsZTsKLQkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87CiAJCQl5eWx2YWwuYnl0ZSA9IHN0cnRvbCh5eXRleHQsIE5VTEwsIDE2KTsKIAkJCURQUklOVCgiQnl0ZTogJTAyeFxuIiwgKGludCl5eWx2YWwuYnl0ZSk7CiAJCQlyZXR1cm4gRFRfQllURTsKIAkJfQogCVlZX0JSRUFLCi1jYXNlIDEzOgorY2FzZSAxMDoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDE3NyAiZHRjLWxleGVyLmwiCisjbGluZSAxMzEgImR0Yy1sZXhlci5sIgogewotCQkJeXlsbG9jLmZpbGUgPSBzcmNwb3NfZmlsZTsKLQkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87CiAJCQlEUFJJTlQoIi9CWVRFU1RSSU5HXG4iKTsKIAkJCUJFR0lOX0RFRkFVTFQoKTsKIAkJCXJldHVybiAnXSc7CiAJCX0KIAlZWV9CUkVBSwotY2FzZSAxNDoKK2Nhc2UgMTE6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAxODUgImR0Yy1sZXhlci5sIgorI2xpbmUgMTM3ICJkdGMtbGV4ZXIubCIKIHsKLQkJCXl5bGxvYy5maWxlID0gc3JjcG9zX2ZpbGU7Ci0JCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOwogCQkJRFBSSU5UKCJQcm9wTm9kZU5hbWU6ICVzXG4iLCB5eXRleHQpOwotCQkJeXlsdmFsLnByb3Bub2RlbmFtZSA9IHN0cmR1cCh5eXRleHQpOworCQkJeXlsdmFsLnByb3Bub2RlbmFtZSA9IHhzdHJkdXAoeXl0ZXh0KTsKIAkJCUJFR0lOX0RFRkFVTFQoKTsKIAkJCXJldHVybiBEVF9QUk9QTk9ERU5BTUU7CiAJCX0KIAlZWV9CUkVBSwotY2FzZSAxNToKK2Nhc2UgMTI6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAxOTQgImR0Yy1sZXhlci5sIgorI2xpbmUgMTQ0ICJkdGMtbGV4ZXIubCIKIHsKLQkJCXl5bGxvYy5maWxlID0gc3JjcG9zX2ZpbGU7Ci0JCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOwogCQkJRFBSSU5UKCJCaW5hcnkgSW5jbHVkZVxuIik7CiAJCQlyZXR1cm4gRFRfSU5DQklOOwogCQl9CiAJWVlfQlJFQUsKLWNhc2UgMTY6Ci0vKiBydWxlIDE2IGNhbiBtYXRjaCBlb2wgKi8KK2Nhc2UgMTM6CisvKiBydWxlIDEzIGNhbiBtYXRjaCBlb2wgKi8KIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDIwMSAiZHRjLWxleGVyLmwiCisjbGluZSAxNDkgImR0Yy1sZXhlci5sIgogLyogZWF0IHdoaXRlc3BhY2UgKi8KIAlZWV9CUkVBSwotY2FzZSAxNzoKLS8qIHJ1bGUgMTcgY2FuIG1hdGNoIGVvbCAqLworY2FzZSAxNDoKKy8qIHJ1bGUgMTQgY2FuIG1hdGNoIGVvbCAqLwogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjAyICJkdGMtbGV4ZXIubCIKKyNsaW5lIDE1MCAiZHRjLWxleGVyLmwiCiAvKiBlYXQgQy1zdHlsZSBjb21tZW50cyAqLwogCVlZX0JSRUFLCi1jYXNlIDE4OgotLyogcnVsZSAxOCBjYW4gbWF0Y2ggZW9sICovCitjYXNlIDE1OgorLyogcnVsZSAxNSBjYW4gbWF0Y2ggZW9sICovCiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyMDMgImR0Yy1sZXhlci5sIgorI2xpbmUgMTUxICJkdGMtbGV4ZXIubCIKIC8qIGVhdCBDKystc3R5bGUgY29tbWVudHMgKi8KIAlZWV9CUkVBSwotY2FzZSAxOToKK2Nhc2UgMTY6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyMDUgImR0Yy1sZXhlci5sIgorI2xpbmUgMTUzICJkdGMtbGV4ZXIubCIKIHsKLQkJCXl5bGxvYy5maWxlID0gc3JjcG9zX2ZpbGU7Ci0JCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOwogCQkJRFBSSU5UKCJDaGFyOiAlYyAoXFx4JTAyeClcbiIsIHl5dGV4dFswXSwKIAkJCQkodW5zaWduZWQpeXl0ZXh0WzBdKTsKIAkJCWlmICh5eXRleHRbMF0gPT0gJ1snKSB7CkBAIC0xMTQ4LDEyICsxMDM1LDEyIEBACiAJCQlyZXR1cm4geXl0ZXh0WzBdOwogCQl9CiAJWVlfQlJFQUsKLWNhc2UgMjA6CitjYXNlIDE3OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjIyICJkdGMtbGV4ZXIubCIKKyNsaW5lIDE2OCAiZHRjLWxleGVyLmwiCiBFQ0hPOwogCVlZX0JSRUFLCi0jbGluZSAxMTU3ICJkdGMtbGV4ZXIubGV4LmMiCisjbGluZSAxMDQ0ICJkdGMtbGV4ZXIubGV4LmMiCiAKIAljYXNlIFlZX0VORF9PRl9CVUZGRVI6CiAJCXsKQEAgLTEyMTgsNyArMTEwNSw4IEBACiAKIAkJCWVsc2UKIAkJCQl7Ci0JCQkJeXlfY3AgPSAoeXlfY19idWZfcCk7CisJCQkJeXlfY3AgPSAoeXlfbGFzdF9hY2NlcHRpbmdfY3Bvcyk7CisJCQkJeXlfY3VycmVudF9zdGF0ZSA9ICh5eV9sYXN0X2FjY2VwdGluZ19zdGF0ZSk7CiAJCQkJZ290byB5eV9maW5kX2FjdGlvbjsKIAkJCQl9CiAJCQl9CkBAIC0xNDQzLDcgKzEzMzEsNyBAQAogCQl3aGlsZSAoIHl5X2Noa1t5eV9iYXNlW3l5X2N1cnJlbnRfc3RhdGVdICsgeXlfY10gIT0geXlfY3VycmVudF9zdGF0ZSApCiAJCQl7CiAJCQl5eV9jdXJyZW50X3N0YXRlID0gKGludCkgeXlfZGVmW3l5X2N1cnJlbnRfc3RhdGVdOwotCQkJaWYgKCB5eV9jdXJyZW50X3N0YXRlID49IDEwNCApCisJCQlpZiAoIHl5X2N1cnJlbnRfc3RhdGUgPj0gOTQgKQogCQkJCXl5X2MgPSB5eV9tZXRhWyh1bnNpZ25lZCBpbnQpIHl5X2NdOwogCQkJfQogCQl5eV9jdXJyZW50X3N0YXRlID0geXlfbnh0W3l5X2Jhc2VbeXlfY3VycmVudF9zdGF0ZV0gKyAodW5zaWduZWQgaW50KSB5eV9jXTsKQEAgLTE0NzEsMTEgKzEzNTksMTEgQEAKIAl3aGlsZSAoIHl5X2Noa1t5eV9iYXNlW3l5X2N1cnJlbnRfc3RhdGVdICsgeXlfY10gIT0geXlfY3VycmVudF9zdGF0ZSApCiAJCXsKIAkJeXlfY3VycmVudF9zdGF0ZSA9IChpbnQpIHl5X2RlZlt5eV9jdXJyZW50X3N0YXRlXTsKLQkJaWYgKCB5eV9jdXJyZW50X3N0YXRlID49IDEwNCApCisJCWlmICggeXlfY3VycmVudF9zdGF0ZSA+PSA5NCApCiAJCQl5eV9jID0geXlfbWV0YVsodW5zaWduZWQgaW50KSB5eV9jXTsKIAkJfQogCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9ueHRbeXlfYmFzZVt5eV9jdXJyZW50X3N0YXRlXSArICh1bnNpZ25lZCBpbnQpIHl5X2NdOwotCXl5X2lzX2phbSA9ICh5eV9jdXJyZW50X3N0YXRlID09IDEwMyk7CisJeXlfaXNfamFtID0gKHl5X2N1cnJlbnRfc3RhdGUgPT0gOTMpOwogCiAJcmV0dXJuIHl5X2lzX2phbSA/IDAgOiB5eV9jdXJyZW50X3N0YXRlOwogfQpAQCAtMTU1MCwxMSArMTQzOCw2IEBACiAJKih5eV9jX2J1Zl9wKSA9ICdcMCc7CS8qIHByZXNlcnZlIHl5dGV4dCAqLwogCSh5eV9ob2xkX2NoYXIpID0gKisrKHl5X2NfYnVmX3ApOwogCi0JaWYgKCBjID09ICdcbicgKQotCQkgICAKLSAgICB5eWxpbmVubysrOwotOwotCiAJcmV0dXJuIGM7CiB9CiAjZW5kaWYJLyogaWZuZGVmIFlZX05PX0lOUFVUICovCkBAIC0xNjY5LDEwICsxNTUyLDYgQEAKIAl5eWZyZWUoKHZvaWQgKikgYiAgKTsKIH0KIAotI2lmbmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuIGludCBpc2F0dHkgKGludCApOwotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0gICAgCiAvKiBJbml0aWFsaXplcyBvciByZWluaXRpYWxpemVzIGEgYnVmZmVyLgogICogVGhpcyBmdW5jdGlvbiBpcyBzb21ldGltZXMgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBzYW1lIGJ1ZmZlciwKICAqIHN1Y2ggYXMgZHVyaW5nIGEgeXlyZXN0YXJ0KCkgb3IgYXQgRU9GLgpAQCAtMTY5Niw3ICsxNTc1LDcgQEAKICAgICAgICAgYi0+eXlfYnNfY29sdW1uID0gMDsKICAgICB9CiAKLSAgICAgICAgYi0+eXlfaXNfaW50ZXJhY3RpdmUgPSBmaWxlID8gKGlzYXR0eSggZmlsZW5vKGZpbGUpICkgPiAwKSA6IDA7CisgICAgICAgIGItPnl5X2lzX2ludGVyYWN0aXZlID0gMDsKICAgICAKIAllcnJubyA9IG9lcnJubzsKIH0KQEAgLTIwMjUsOSArMTkwNCw2IEBACiAgICAgICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSB5eWxleF9kZXN0cm95KCksIHNvIGRvbid0IGFsbG9jYXRlIGhlcmUuCiAgICAgICovCiAKLSAgICAvKiBXZSBkbyBub3QgdG91Y2ggeXlsaW5lbm8gdW5sZXNzIHRoZSBvcHRpb24gaXMgZW5hYmxlZC4gKi8KLSAgICB5eWxpbmVubyA9ICAxOwotICAgIAogICAgICh5eV9idWZmZXJfc3RhY2spID0gMDsKICAgICAoeXlfYnVmZmVyX3N0YWNrX3RvcCkgPSAwOwogICAgICh5eV9idWZmZXJfc3RhY2tfbWF4KSA9IDA7CkBAIC0yMTIwLDEwNCArMTk5NiwyOSBAQAogCiAjZGVmaW5lIFlZVEFCTEVTX05BTUUgInl5dGFibGVzIgogCi0jbGluZSAyMjIgImR0Yy1sZXhlci5sIgorI2xpbmUgMTY4ICJkdGMtbGV4ZXIubCIKIAogCiAKLQotLyoKLSAqIFN0YWNrIG9mIG5lc3RlZCBpbmNsdWRlIGZpbGUgY29udGV4dHMuCi0gKi8KLQotc3RydWN0IGluY2xfZmlsZSB7Ci0Jc3RydWN0IGR0Y19maWxlICpmaWxlOwotCVlZX0JVRkZFUl9TVEFURSB5eV9wcmV2X2J1ZjsKLQlpbnQgeXlfcHJldl9saW5lbm87Ci0Jc3RydWN0IGluY2xfZmlsZSAqcHJldjsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaW5jbF9maWxlICppbmNsX2ZpbGVfc3RhY2s7Ci0KLQotLyoKLSAqIERldGVjdCBpbmZpbml0ZSBpbmNsdWRlIHJlY3Vyc2lvbi4KLSAqLwotI2RlZmluZSBNQVhfSU5DTFVERV9ERVBUSAkoMTAwKQotCi1zdGF0aWMgaW50IGluY2xfZGVwdGggPSAwOwotCi0KIHN0YXRpYyB2b2lkIHB1c2hfaW5wdXRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSkKIHsKLQlzdHJ1Y3QgaW5jbF9maWxlICppbmNsX2ZpbGU7Ci0Jc3RydWN0IGR0Y19maWxlICpuZXdmaWxlOwotCXN0cnVjdCBzZWFyY2hfcGF0aCBzZWFyY2gsICpzZWFyY2hwdHIgPSBOVUxMOwotCiAJYXNzZXJ0KGZpbGVuYW1lKTsKIAotCWlmIChpbmNsX2RlcHRoKysgPj0gTUFYX0lOQ0xVREVfREVQVEgpCi0JCWRpZSgiSW5jbHVkZXMgbmVzdGVkIHRvbyBkZWVwbHkiKTsKKwlzcmNmaWxlX3B1c2goZmlsZW5hbWUpOwogCi0JaWYgKHNyY3Bvc19maWxlKSB7Ci0JCXNlYXJjaC5kaXIgPSBzcmNwb3NfZmlsZS0+ZGlyOwotCQlzZWFyY2gubmV4dCA9IE5VTEw7Ci0JCXNlYXJjaC5wcmV2ID0gTlVMTDsKLQkJc2VhcmNocHRyID0gJnNlYXJjaDsKLQl9CisJeXlpbiA9IGN1cnJlbnRfc3JjZmlsZS0+ZjsKIAotCW5ld2ZpbGUgPSBkdGNfb3Blbl9maWxlKGZpbGVuYW1lLCBzZWFyY2hwdHIpOwotCi0JaW5jbF9maWxlID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IGluY2xfZmlsZSkpOwotCi0JLyoKLQkgKiBTYXZlIGN1cnJlbnQgY29udGV4dC4KLQkgKi8KLQlpbmNsX2ZpbGUtPnl5X3ByZXZfYnVmID0gWVlfQ1VSUkVOVF9CVUZGRVI7Ci0JaW5jbF9maWxlLT55eV9wcmV2X2xpbmVubyA9IHl5bGluZW5vOwotCWluY2xfZmlsZS0+ZmlsZSA9IHNyY3Bvc19maWxlOwotCWluY2xfZmlsZS0+cHJldiA9IGluY2xfZmlsZV9zdGFjazsKLQotCWluY2xfZmlsZV9zdGFjayA9IGluY2xfZmlsZTsKLQotCS8qCi0JICogRXN0YWJsaXNoIG5ldyBjb250ZXh0LgotCSAqLwotCXNyY3Bvc19maWxlID0gbmV3ZmlsZTsKLQl5eWxpbmVubyA9IDE7Ci0JeXlpbiA9IG5ld2ZpbGUtPmZpbGU7Ci0JeXlfc3dpdGNoX3RvX2J1ZmZlcih5eV9jcmVhdGVfYnVmZmVyKHl5aW4sWVlfQlVGX1NJWkUpKTsKKwl5eXB1c2hfYnVmZmVyX3N0YXRlKHl5X2NyZWF0ZV9idWZmZXIoeXlpbixZWV9CVUZfU0laRSkpOwogfQogCiAKIHN0YXRpYyBpbnQgcG9wX2lucHV0X2ZpbGUodm9pZCkKIHsKLQlzdHJ1Y3QgaW5jbF9maWxlICppbmNsX2ZpbGU7Ci0KLQlpZiAoaW5jbF9maWxlX3N0YWNrID09IDApCisJaWYgKHNyY2ZpbGVfcG9wKCkgPT0gMCkKIAkJcmV0dXJuIDA7CiAKLQlkdGNfY2xvc2VfZmlsZShzcmNwb3NfZmlsZSk7Ci0KLQkvKgotCSAqIFBvcC4KLQkgKi8KLQktLWluY2xfZGVwdGg7Ci0JaW5jbF9maWxlID0gaW5jbF9maWxlX3N0YWNrOwotCWluY2xfZmlsZV9zdGFjayA9IGluY2xfZmlsZS0+cHJldjsKLQotCS8qCi0JICogUmVjb3ZlciBvbGQgY29udGV4dC4KLQkgKi8KLQl5eV9kZWxldGVfYnVmZmVyKFlZX0NVUlJFTlRfQlVGRkVSKTsKLQl5eV9zd2l0Y2hfdG9fYnVmZmVyKGluY2xfZmlsZS0+eXlfcHJldl9idWYpOwotCXl5bGluZW5vID0gaW5jbF9maWxlLT55eV9wcmV2X2xpbmVubzsKLQlzcmNwb3NfZmlsZSA9IGluY2xfZmlsZS0+ZmlsZTsKLQl5eWluID0gaW5jbF9maWxlLT5maWxlID8gaW5jbF9maWxlLT5maWxlLT5maWxlIDogTlVMTDsKLQotCS8qCi0JICogRnJlZSBvbGQgc3RhdGUuCi0JICovCi0JZnJlZShpbmNsX2ZpbGUpOworCXl5cG9wX2J1ZmZlcl9zdGF0ZSgpOworCXl5aW4gPSBjdXJyZW50X3NyY2ZpbGUtPmY7CiAKIAlyZXR1cm4gMTsKIH0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvZHRjL2R0Yy1wYXJzZXIudGFiLmNfc2hpcHBlZCBiL3NjcmlwdHMvZHRjL2R0Yy1wYXJzZXIudGFiLmNfc2hpcHBlZAppbmRleCAyNzEyOTM3Li45YmUyZWVhIDEwMDY0NAotLS0gYS9zY3JpcHRzL2R0Yy9kdGMtcGFyc2VyLnRhYi5jX3NoaXBwZWQKKysrIGIvc2NyaXB0cy9kdGMvZHRjLXBhcnNlci50YWIuY19zaGlwcGVkCkBAIC0xLDI0ICsxLDIzIEBACi0vKiBBIEJpc29uIHBhcnNlciwgbWFkZSBieSBHTlUgQmlzb24gMi4zLiAgKi8KKworLyogQSBCaXNvbiBwYXJzZXIsIG1hZGUgYnkgR05VIEJpc29uIDIuNC4xLiAgKi8KIAogLyogU2tlbGV0b24gaW1wbGVtZW50YXRpb24gZm9yIEJpc29uJ3MgWWFjYy1saWtlIHBhcnNlcnMgaW4gQwotCi0gICBDb3B5cmlnaHQgKEMpIDE5ODQsIDE5ODksIDE5OTAsIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYKKyAgIAorICAgICAgQ29weXJpZ2h0IChDKSAxOTg0LCAxOTg5LCAxOTkwLCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2CiAgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIAorICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgICAKICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KKyAgIAogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAotICAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuICAqLworICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwogCiAvKiBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB5b3UgbWF5IGNyZWF0ZSBhIGxhcmdlciB3b3JrIHRoYXQgY29udGFpbnMKICAgIHBhcnQgb3IgYWxsIG9mIHRoZSBCaXNvbiBwYXJzZXIgc2tlbGV0b24gYW5kIGRpc3RyaWJ1dGUgdGhhdCB3b3JrCkBAIC0yOSw3ICsyOCw3IEBACiAgICBzcGVjaWFsIGV4Y2VwdGlvbiwgd2hpY2ggd2lsbCBjYXVzZSB0aGUgc2tlbGV0b24gYW5kIHRoZSByZXN1bHRpbmcKICAgIEJpc29uIG91dHB1dCBmaWxlcyB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAgICBMaWNlbnNlIHdpdGhvdXQgdGhpcyBzcGVjaWFsIGV4Y2VwdGlvbi4KLQorICAgCiAgICBUaGlzIHNwZWNpYWwgZXhjZXB0aW9uIHdhcyBhZGRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGluCiAgICB2ZXJzaW9uIDIuMiBvZiBCaXNvbi4gICovCiAKQEAgLTQ3LDcgKzQ2LDcgQEAKICNkZWZpbmUgWVlCSVNPTiAxCiAKIC8qIEJpc29uIHZlcnNpb24uICAqLwotI2RlZmluZSBZWUJJU09OX1ZFUlNJT04gIjIuMyIKKyNkZWZpbmUgWVlCSVNPTl9WRVJTSU9OICIyLjQuMSIKIAogLyogU2tlbGV0b24gbmFtZS4gICovCiAjZGVmaW5lIFlZU0tFTEVUT05fTkFNRSAieWFjYy5jIgpAQCAtNTUsNTUgKzU0LDMyIEBACiAvKiBQdXJlIHBhcnNlcnMuICAqLwogI2RlZmluZSBZWVBVUkUgMAogCisvKiBQdXNoIHBhcnNlcnMuICAqLworI2RlZmluZSBZWVBVU0ggMAorCisvKiBQdWxsIHBhcnNlcnMuICAqLworI2RlZmluZSBZWVBVTEwgMQorCiAvKiBVc2luZyBsb2NhdGlvbnMuICAqLwotI2RlZmluZSBZWUxTUF9ORUVERUQgMQotCi0KLQotLyogVG9rZW5zLiAgKi8KLSNpZm5kZWYgWVlUT0tFTlRZUEUKLSMgZGVmaW5lIFlZVE9LRU5UWVBFCi0gICAvKiBQdXQgdGhlIHRva2VucyBpbnRvIHRoZSBzeW1ib2wgdGFibGUsIHNvIHRoYXQgR0RCIGFuZCBvdGhlciBkZWJ1Z2dlcnMKLSAgICAgIGtub3cgYWJvdXQgdGhlbS4gICovCi0gICBlbnVtIHl5dG9rZW50eXBlIHsKLSAgICAgRFRfVjEgPSAyNTgsCi0gICAgIERUX01FTVJFU0VSVkUgPSAyNTksCi0gICAgIERUX1BST1BOT0RFTkFNRSA9IDI2MCwKLSAgICAgRFRfTElURVJBTCA9IDI2MSwKLSAgICAgRFRfTEVHQUNZTElURVJBTCA9IDI2MiwKLSAgICAgRFRfQkFTRSA9IDI2MywKLSAgICAgRFRfQllURSA9IDI2NCwKLSAgICAgRFRfU1RSSU5HID0gMjY1LAotICAgICBEVF9MQUJFTCA9IDI2NiwKLSAgICAgRFRfUkVGID0gMjY3LAotICAgICBEVF9JTkNCSU4gPSAyNjgKLSAgIH07Ci0jZW5kaWYKLS8qIFRva2Vucy4gICovCi0jZGVmaW5lIERUX1YxIDI1OAotI2RlZmluZSBEVF9NRU1SRVNFUlZFIDI1OQotI2RlZmluZSBEVF9QUk9QTk9ERU5BTUUgMjYwCi0jZGVmaW5lIERUX0xJVEVSQUwgMjYxCi0jZGVmaW5lIERUX0xFR0FDWUxJVEVSQUwgMjYyCi0jZGVmaW5lIERUX0JBU0UgMjYzCi0jZGVmaW5lIERUX0JZVEUgMjY0Ci0jZGVmaW5lIERUX1NUUklORyAyNjUKLSNkZWZpbmUgRFRfTEFCRUwgMjY2Ci0jZGVmaW5lIERUX1JFRiAyNjcKLSNkZWZpbmUgRFRfSU5DQklOIDI2OAotCisjZGVmaW5lIFlZTFNQX05FRURFRCAwCiAKIAogCiAvKiBDb3B5IHRoZSBmaXJzdCBwYXJ0IG9mIHVzZXIgZGVjbGFyYXRpb25zLiAgKi8KLSNsaW5lIDIzICJkdGMtcGFyc2VyLnkiCisKKy8qIExpbmUgMTg5IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDIxICJkdGMtcGFyc2VyLnkiCiAKICNpbmNsdWRlIDxzdGRpby5oPgogCiAjaW5jbHVkZSAiZHRjLmgiCiAjaW5jbHVkZSAic3JjcG9zLmgiCiAKK1lZTFRZUEUgeXlsbG9jOworCiBleHRlcm4gaW50IHl5bGV4KHZvaWQpOworZXh0ZXJuIHZvaWQgcHJpbnRfZXJyb3IoY2hhciBjb25zdCAqZm10LCAuLi4pOworZXh0ZXJuIHZvaWQgeXllcnJvcihjaGFyIGNvbnN0ICpzKTsKIAogZXh0ZXJuIHN0cnVjdCBib290X2luZm8gKnRoZV9ib290X2luZm87CiBleHRlcm4gaW50IHRyZWVzb3VyY2VfZXJyb3I7CkBAIC0xMTEsNiArODcsOSBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBldmFsX2xpdGVyYWwoY29uc3QgY2hhciAqcywgaW50IGJhc2UsIGludCBiaXRzKTsKIAogCisvKiBMaW5lIDE4OSBvZiB5YWNjLmMgICovCisjbGluZSA5MiAiZHRjLXBhcnNlci50YWIuYyIKKwogLyogRW5hYmxpbmcgdHJhY2VzLiAgKi8KICNpZm5kZWYgWVlERUJVRwogIyBkZWZpbmUgWVlERUJVRyAwCkBAIC0xMjksMTAgKzEwOCwzNSBAQAogIyBkZWZpbmUgWVlUT0tFTl9UQUJMRSAwCiAjZW5kaWYKIAorCisvKiBUb2tlbnMuICAqLworI2lmbmRlZiBZWVRPS0VOVFlQRQorIyBkZWZpbmUgWVlUT0tFTlRZUEUKKyAgIC8qIFB1dCB0aGUgdG9rZW5zIGludG8gdGhlIHN5bWJvbCB0YWJsZSwgc28gdGhhdCBHREIgYW5kIG90aGVyIGRlYnVnZ2VycworICAgICAga25vdyBhYm91dCB0aGVtLiAgKi8KKyAgIGVudW0geXl0b2tlbnR5cGUgeworICAgICBEVF9WMSA9IDI1OCwKKyAgICAgRFRfTUVNUkVTRVJWRSA9IDI1OSwKKyAgICAgRFRfUFJPUE5PREVOQU1FID0gMjYwLAorICAgICBEVF9MSVRFUkFMID0gMjYxLAorICAgICBEVF9CQVNFID0gMjYyLAorICAgICBEVF9CWVRFID0gMjYzLAorICAgICBEVF9TVFJJTkcgPSAyNjQsCisgICAgIERUX0xBQkVMID0gMjY1LAorICAgICBEVF9SRUYgPSAyNjYsCisgICAgIERUX0lOQ0JJTiA9IDI2NworICAgfTsKKyNlbmRpZgorCisKKwogI2lmICEgZGVmaW5lZCBZWVNUWVBFICYmICEgZGVmaW5lZCBZWVNUWVBFX0lTX0RFQ0xBUkVECiB0eXBlZGVmIHVuaW9uIFlZU1RZUEUKLSNsaW5lIDM3ICJkdGMtcGFyc2VyLnkiCiB7CisKKy8qIExpbmUgMjE0IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDM5ICJkdGMtcGFyc2VyLnkiCisKIAljaGFyICpwcm9wbm9kZW5hbWU7CiAJY2hhciAqbGl0ZXJhbDsKIAljaGFyICpsYWJlbHJlZjsKQEAgLTE0NywzNCArMTUxLDIzIEBACiAJc3RydWN0IG5vZGUgKm5vZGU7CiAJc3RydWN0IG5vZGUgKm5vZGVsaXN0OwogCXN0cnVjdCByZXNlcnZlX2luZm8gKnJlOwotfQotLyogTGluZSAxODcgb2YgeWFjYy5jLiAgKi8KLSNsaW5lIDE1MyAiZHRjLXBhcnNlci50YWIuYyIKLQlZWVNUWVBFOworCisKKworLyogTGluZSAyMTQgb2YgeWFjYy5jICAqLworI2xpbmUgMTU5ICJkdGMtcGFyc2VyLnRhYi5jIgorfSBZWVNUWVBFOworIyBkZWZpbmUgWVlTVFlQRV9JU19UUklWSUFMIDEKICMgZGVmaW5lIHl5c3R5cGUgWVlTVFlQRSAvKiBvYnNvbGVzY2VudDsgd2lsbCBiZSB3aXRoZHJhd24gKi8KICMgZGVmaW5lIFlZU1RZUEVfSVNfREVDTEFSRUQgMQotIyBkZWZpbmUgWVlTVFlQRV9JU19UUklWSUFMIDEKLSNlbmRpZgotCi0jaWYgISBkZWZpbmVkIFlZTFRZUEUgJiYgISBkZWZpbmVkIFlZTFRZUEVfSVNfREVDTEFSRUQKLXR5cGVkZWYgc3RydWN0IFlZTFRZUEUKLXsKLSAgaW50IGZpcnN0X2xpbmU7Ci0gIGludCBmaXJzdF9jb2x1bW47Ci0gIGludCBsYXN0X2xpbmU7Ci0gIGludCBsYXN0X2NvbHVtbjsKLX0gWVlMVFlQRTsKLSMgZGVmaW5lIHl5bHR5cGUgWVlMVFlQRSAvKiBvYnNvbGVzY2VudDsgd2lsbCBiZSB3aXRoZHJhd24gKi8KLSMgZGVmaW5lIFlZTFRZUEVfSVNfREVDTEFSRUQgMQotIyBkZWZpbmUgWVlMVFlQRV9JU19UUklWSUFMIDEKICNlbmRpZgogCiAKIC8qIENvcHkgdGhlIHNlY29uZCBwYXJ0IG9mIHVzZXIgZGVjbGFyYXRpb25zLiAgKi8KIAogCi0vKiBMaW5lIDIxNiBvZiB5YWNjLmMuICAqLwotI2xpbmUgMTc4ICJkdGMtcGFyc2VyLnRhYi5jIgorLyogTGluZSAyNjQgb2YgeWFjYy5jICAqLworI2xpbmUgMTcxICJkdGMtcGFyc2VyLnRhYi5jIgogCiAjaWZkZWYgc2hvcnQKICMgdW5kZWYgc2hvcnQKQEAgLTI0OSwxNCArMjQyLDE0IEBACiAjaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKICAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQogc3RhdGljIGludAotWVlJRCAoaW50IGkpCitZWUlEIChpbnQgeXlpKQogI2Vsc2UKIHN0YXRpYyBpbnQKLVlZSUQgKGkpCi0gICAgaW50IGk7CitZWUlEICh5eWkpCisgICAgaW50IHl5aTsKICNlbmRpZgogewotICByZXR1cm4gaTsKKyAgcmV0dXJuIHl5aTsKIH0KICNlbmRpZgogCkBAIC0zMzIsMTUgKzMyNSwxMyBAQAogCiAjaWYgKCEgZGVmaW5lZCB5eW92ZXJmbG93IFwKICAgICAgJiYgKCEgZGVmaW5lZCBfX2NwbHVzcGx1cyBcCi0JIHx8IChkZWZpbmVkIFlZTFRZUEVfSVNfVFJJVklBTCAmJiBZWUxUWVBFX0lTX1RSSVZJQUwgXAotCSAgICAgJiYgZGVmaW5lZCBZWVNUWVBFX0lTX1RSSVZJQUwgJiYgWVlTVFlQRV9JU19UUklWSUFMKSkpCisJIHx8IChkZWZpbmVkIFlZU1RZUEVfSVNfVFJJVklBTCAmJiBZWVNUWVBFX0lTX1RSSVZJQUwpKSkKIAogLyogQSB0eXBlIHRoYXQgaXMgcHJvcGVybHkgYWxpZ25lZCBmb3IgYW55IHN0YWNrIG1lbWJlci4gICovCiB1bmlvbiB5eWFsbG9jCiB7Ci0gIHl5dHlwZV9pbnQxNiB5eXNzOwotICBZWVNUWVBFIHl5dnM7Ci0gICAgWVlMVFlQRSB5eWxzOworICB5eXR5cGVfaW50MTYgeXlzc19hbGxvYzsKKyAgWVlTVFlQRSB5eXZzX2FsbG9jOwogfTsKIAogLyogVGhlIHNpemUgb2YgdGhlIG1heGltdW0gZ2FwIGJldHdlZW4gb25lIGFsaWduZWQgc3RhY2sgYW5kIHRoZSBuZXh0LiAgKi8KQEAgLTM0OSw4ICszNDAsOCBAQAogLyogVGhlIHNpemUgb2YgYW4gYXJyYXkgbGFyZ2UgdG8gZW5vdWdoIHRvIGhvbGQgYWxsIHN0YWNrcywgZWFjaCB3aXRoCiAgICBOIGVsZW1lbnRzLiAgKi8KICMgZGVmaW5lIFlZU1RBQ0tfQllURVMoTikgXAotICAgICAoKE4pICogKHNpemVvZiAoeXl0eXBlX2ludDE2KSArIHNpemVvZiAoWVlTVFlQRSkgKyBzaXplb2YgKFlZTFRZUEUpKSBcCi0gICAgICArIDIgKiBZWVNUQUNLX0dBUF9NQVhJTVVNKQorICAgICAoKE4pICogKHNpemVvZiAoeXl0eXBlX2ludDE2KSArIHNpemVvZiAoWVlTVFlQRSkpIFwKKyAgICAgICsgWVlTVEFDS19HQVBfTUFYSU1VTSkKIAogLyogQ29weSBDT1VOVCBvYmplY3RzIGZyb20gRlJPTSB0byBUTy4gIFRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRvCiAgICBub3Qgb3ZlcmxhcC4gICovCkBAIC0zNzUsMTIgKzM2NiwxMiBAQAogICAgZWxlbWVudHMgaW4gdGhlIHN0YWNrLCBhbmQgWVlQVFIgZ2l2ZXMgdGhlIG5ldyBsb2NhdGlvbiBvZiB0aGUKICAgIHN0YWNrLiAgQWR2YW5jZSBZWVBUUiB0byBhIHByb3Blcmx5IGFsaWduZWQgbG9jYXRpb24gZm9yIHRoZSBuZXh0CiAgICBzdGFjay4gICovCi0jIGRlZmluZSBZWVNUQUNLX1JFTE9DQVRFKFN0YWNrKQkJCQkJXAorIyBkZWZpbmUgWVlTVEFDS19SRUxPQ0FURShTdGFja19hbGxvYywgU3RhY2spCQkJCVwKICAgICBkbwkJCQkJCQkJCVwKICAgICAgIHsJCQkJCQkJCQlcCiAJWVlTSVpFX1QgeXluZXdieXRlczsJCQkJCQlcCi0JWVlDT1BZICgmeXlwdHItPlN0YWNrLCBTdGFjaywgeXlzaXplKTsJCQkJXAotCVN0YWNrID0gJnl5cHRyLT5TdGFjazsJCQkJCQlcCisJWVlDT1BZICgmeXlwdHItPlN0YWNrX2FsbG9jLCBTdGFjaywgeXlzaXplKTsJCQlcCisJU3RhY2sgPSAmeXlwdHItPlN0YWNrX2FsbG9jOwkJCQkJXAogCXl5bmV3Ynl0ZXMgPSB5eXN0YWNrc2l6ZSAqIHNpemVvZiAoKlN0YWNrKSArIFlZU1RBQ0tfR0FQX01BWElNVU07IFwKIAl5eXB0ciArPSB5eW5ld2J5dGVzIC8gc2l6ZW9mICgqeXlwdHIpOwkJCQlcCiAgICAgICB9CQkJCQkJCQkJXApAQCAtMzg5LDIyICszODAsMjIgQEAKICNlbmRpZgogCiAvKiBZWUZJTkFMIC0tIFN0YXRlIG51bWJlciBvZiB0aGUgdGVybWluYXRpb24gc3RhdGUuICAqLwotI2RlZmluZSBZWUZJTkFMICA5CisjZGVmaW5lIFlZRklOQUwgIDQKIC8qIFlZTEFTVCAtLSBMYXN0IGluZGV4IGluIFlZVEFCTEUuICAqLwotI2RlZmluZSBZWUxBU1QgICA3MworI2RlZmluZSBZWUxBU1QgICA1NgogCiAvKiBZWU5UT0tFTlMgLS0gTnVtYmVyIG9mIHRlcm1pbmFscy4gICovCi0jZGVmaW5lIFlZTlRPS0VOUyAgMjcKKyNkZWZpbmUgWVlOVE9LRU5TICAyNQogLyogWVlOTlRTIC0tIE51bWJlciBvZiBub250ZXJtaW5hbHMuICAqLwotI2RlZmluZSBZWU5OVFMgIDIwCisjZGVmaW5lIFlZTk5UUyAgMTYKIC8qIFlZTlJVTEVTIC0tIE51bWJlciBvZiBydWxlcy4gICovCi0jZGVmaW5lIFlZTlJVTEVTICA0NQorI2RlZmluZSBZWU5SVUxFUyAgMzkKIC8qIFlZTlJVTEVTIC0tIE51bWJlciBvZiBzdGF0ZXMuICAqLwotI2RlZmluZSBZWU5TVEFURVMgIDc2CisjZGVmaW5lIFlZTlNUQVRFUyAgNjcKIAogLyogWVlUUkFOU0xBVEUoWVlMRVgpIC0tIEJpc29uIHN5bWJvbCBudW1iZXIgY29ycmVzcG9uZGluZyB0byBZWUxFWC4gICovCiAjZGVmaW5lIFlZVU5ERUZUT0sgIDIKLSNkZWZpbmUgWVlNQVhVVE9LICAgMjY4CisjZGVmaW5lIFlZTUFYVVRPSyAgIDI2NwogCiAjZGVmaW5lIFlZVFJBTlNMQVRFKFlZWCkJCQkJCQlcCiAgICgodW5zaWduZWQgaW50KSAoWVlYKSA8PSBZWU1BWFVUT0sgPyB5eXRyYW5zbGF0ZVtZWVhdIDogWVlVTkRFRlRPSykKQEAgLTQxNiwxNSArNDA3LDE1IEBACiAgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKICAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAogICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgICAyNCwgICAgMjYsICAgICAyLCAgICAgMiwgICAgMjUsICAgIDE1LCAgICAgMiwgICAgMTYsICAgICAyLCAgICAgMiwKLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgIDE0LAotICAgICAgMjAsICAgIDE5LCAgICAyMSwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAyMiwgICAgMjQsICAgICAyLCAgICAgMiwgICAgMjMsICAgICAyLCAgICAgMiwgICAgMTQsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgIDEzLAorICAgICAgMTgsICAgIDE3LCAgICAxOSwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCiAgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKICAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAgIDIsICAgIDIyLCAgICAgMiwgICAgMjMsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgMjAsICAgICAyLCAgICAyMSwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKICAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAogICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAxNywgICAgIDIsICAgIDE4LCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgIDE1LCAgICAgMiwgICAgMTYsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAogICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCiAgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKICAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLApAQCAtNDM4LDcgKzQyOSw3IEBACiAgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKICAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAogICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDEsICAgICAyLCAgICAgMywgICAgIDQsCi0gICAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzCisgICAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIKIH07CiAKICNpZiBZWURFQlVHCkBAIC00NDYsNDEgKzQzNywzNyBAQAogICAgWVlSSFMuICAqLwogc3RhdGljIGNvbnN0IHl5dHlwZV91aW50OCB5eXByaHNbXSA9CiB7Ci0gICAgICAgMCwgICAgIDAsICAgICAzLCAgICAgOCwgICAgMTEsICAgIDEyLCAgICAxNSwgICAgMjEsICAgIDIyLCAgICAyNSwKLSAgICAgIDI3LCAgICAzNCwgICAgMzYsICAgIDM4LCAgICA0MSwgICAgNDcsICAgIDQ4LCAgICA1MSwgICAgNTcsICAgIDYxLAotICAgICAgNjQsICAgIDY5LCAgICA3NCwgICAgNzcsICAgIDg3LCAgICA5MywgICAgOTYsICAgIDk3LCAgIDEwMCwgICAxMDMsCi0gICAgIDEwNCwgICAxMDcsICAgMTEwLCAgIDExMywgICAxMTQsICAgMTE2LCAgIDExOCwgICAxMjEsICAgMTIyLCAgIDEyNSwKLSAgICAgMTI4LCAgIDEyOSwgICAxMzIsICAgMTM1LCAgIDEzOSwgICAxNDAKKyAgICAgICAwLCAgICAgMCwgICAgIDMsICAgICA4LCAgICAgOSwgICAgMTIsICAgIDE3LCAgICAyMCwgICAgMjIsICAgIDI1LAorICAgICAgMjksICAgIDMzLCAgICAzOSwgICAgNDAsICAgIDQzLCAgICA0OCwgICAgNTEsICAgIDU0LCAgICA1NywgICAgNjIsCisgICAgICA2NywgICAgNzAsICAgIDgwLCAgICA4NiwgICAgODksICAgIDkwLCAgICA5MywgICAgOTYsICAgIDk3LCAgIDEwMCwKKyAgICAgMTAzLCAgIDEwNiwgICAxMDgsICAgMTA5LCAgIDExMiwgICAxMTUsICAgMTE2LCAgIDExOSwgICAxMjIsICAgMTI1CiB9OwogCiAvKiBZWVJIUyAtLSBBIGAtMSctc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIHJ1bGVzJyBSSFMuICAqLwogc3RhdGljIGNvbnN0IHl5dHlwZV9pbnQ4IHl5cmhzW10gPQogewotICAgICAgMjgsICAgICAwLCAgICAtMSwgICAgIDMsICAgIDE0LCAgICAyOSwgICAgMzQsICAgIC0xLCAgICAzMSwgICAgMzQsCi0gICAgICAtMSwgICAgLTEsICAgIDMwLCAgICAyOSwgICAgLTEsICAgIDQ2LCAgICAgNCwgICAgMzMsICAgIDMzLCAgICAxNCwKLSAgICAgIC0xLCAgICAtMSwgICAgMzIsICAgIDMxLCAgICAtMSwgICAgMzAsICAgIC0xLCAgICA0NiwgICAgIDQsICAgIDMzLAotICAgICAgMTUsICAgIDMzLCAgICAxNCwgICAgLTEsICAgICA2LCAgICAtMSwgICAgIDcsICAgIC0xLCAgICAxNiwgICAgMzUsCi0gICAgICAtMSwgICAgMTcsICAgIDM2LCAgICA0NCwgICAgMTgsICAgIDE0LCAgICAtMSwgICAgLTEsICAgIDM2LCAgICAzNywKLSAgICAgIC0xLCAgICA0NiwgICAgIDUsICAgIDE5LCAgICAzOCwgICAgMTQsICAgIC0xLCAgICA0NiwgICAgIDUsICAgIDE0LAotICAgICAgLTEsICAgIDM5LCAgICAxMCwgICAgLTEsICAgIDM5LCAgICAyMCwgICAgNDAsICAgIDIxLCAgICAtMSwgICAgMzksCi0gICAgICAyMiwgICAgNDMsICAgIDIzLCAgICAtMSwgICAgMzksICAgIDEyLCAgICAtMSwgICAgMzksICAgIDEzLCAgICAyNCwKLSAgICAgIDEwLCAgICAyNSwgICAgMzMsICAgIDI1LCAgICAzMywgICAgMjYsICAgIC0xLCAgICAzOSwgICAgMTMsICAgIDI0LAotICAgICAgMTAsICAgIDI2LCAgICAtMSwgICAgMzgsICAgIDExLCAgICAtMSwgICAgLTEsICAgIDM4LCAgICAyNSwgICAgLTEsCi0gICAgICAzOSwgICAgMTEsICAgIC0xLCAgICAtMSwgICAgNDAsICAgIDQyLCAgICAtMSwgICAgNDAsICAgIDEyLCAgICAtMSwKLSAgICAgIDQwLCAgICAxMSwgICAgLTEsICAgIC0xLCAgICAgOCwgICAgLTEsICAgICA2LCAgICAtMSwgICAgNDEsICAgICA3LAotICAgICAgLTEsICAgIC0xLCAgICA0MywgICAgIDksICAgIC0xLCAgICA0MywgICAgMTEsICAgIC0xLCAgICAtMSwgICAgNDUsCi0gICAgICA0NCwgICAgLTEsICAgIDQ1LCAgICAzNywgICAgLTEsICAgIDQ2LCAgICAgNSwgICAgMzUsICAgIC0xLCAgICAtMSwKLSAgICAgIDExLCAgICAtMQorICAgICAgMjYsICAgICAwLCAgICAtMSwgICAgIDMsICAgIDEzLCAgICAyNywgICAgMzAsICAgIC0xLCAgICAtMSwgICAgMjgsCisgICAgICAyNywgICAgLTEsICAgICA0LCAgICAyOSwgICAgMjksICAgIDEzLCAgICAtMSwgICAgMTAsICAgIDI4LCAgICAtMSwKKyAgICAgICA2LCAgICAtMSwgICAgMTQsICAgIDMxLCAgICAtMSwgICAgMzAsICAgIDE0LCAgICAzMSwgICAgLTEsICAgIDMwLAorICAgICAgMTEsICAgIDMxLCAgICAtMSwgICAgMTUsICAgIDMyLCAgICAzOSwgICAgMTYsICAgIDEzLCAgICAtMSwgICAgLTEsCisgICAgICAzMiwgICAgMzMsICAgIC0xLCAgICAgNSwgICAgMTcsICAgIDM0LCAgICAxMywgICAgLTEsICAgICA1LCAgICAxMywKKyAgICAgIC0xLCAgICAxMCwgICAgMzMsICAgIC0xLCAgICAzNSwgICAgIDksICAgIC0xLCAgICAzNSwgICAgMTgsICAgIDM2LAorICAgICAgMTksICAgIC0xLCAgICAzNSwgICAgMjAsICAgIDM4LCAgICAyMSwgICAgLTEsICAgIDM1LCAgICAxMSwgICAgLTEsCisgICAgICAzNSwgICAgMTIsICAgIDIyLCAgICAgOSwgICAgMjMsICAgIDI5LCAgICAyMywgICAgMjksICAgIDI0LCAgICAtMSwKKyAgICAgIDM1LCAgICAxMiwgICAgMjIsICAgICA5LCAgICAyNCwgICAgLTEsICAgIDM0LCAgICAxMCwgICAgLTEsICAgIC0xLAorICAgICAgMzQsICAgIDIzLCAgICAtMSwgICAgMzUsICAgIDEwLCAgICAtMSwgICAgLTEsICAgIDM2LCAgICAzNywgICAgLTEsCisgICAgICAzNiwgICAgMTEsICAgIC0xLCAgICAzNiwgICAgMTAsICAgIC0xLCAgICAgNiwgICAgLTEsICAgIC0xLCAgICAzOCwKKyAgICAgICA4LCAgICAtMSwgICAgMzgsICAgIDEwLCAgICAtMSwgICAgLTEsICAgIDQwLCAgICAzOSwgICAgLTEsICAgIDQwLAorICAgICAgMzMsICAgIC0xLCAgICAgNSwgICAgMzEsICAgIC0xLCAgICAxMCwgICAgNDAsICAgIC0xCiB9OwogCiAvKiBZWVJMSU5FW1lZTl0gLS0gc291cmNlIGxpbmUgd2hlcmUgcnVsZSBudW1iZXIgWVlOIHdhcyBkZWZpbmVkLiAgKi8KIHN0YXRpYyBjb25zdCB5eXR5cGVfdWludDE2IHl5cmxpbmVbXSA9CiB7Ci0gICAgICAgMCwgICAgODksICAgIDg5LCAgICA5MywgICAxMDEsICAgMTA0LCAgIDExMSwgICAxMTksICAgMTIyLCAgIDEyOSwKLSAgICAgMTMzLCAgIDE0MCwgICAxNDQsICAgMTUxLCAgIDE1OCwgICAxNjYsICAgMTY5LCAgIDE3NiwgICAxODAsICAgMTg3LAotICAgICAxOTEsICAgMTk1LCAgIDE5OSwgICAyMDMsICAgMjIwLCAgIDIzMSwgICAyMzksICAgMjQyLCAgIDI0NiwgICAyNTQsCi0gICAgIDI1NywgICAyNjEsICAgMjY2LCAgIDI3NCwgICAyNzcsICAgMjgxLCAgIDI4NSwgICAyOTMsICAgMjk2LCAgIDMwMCwKLSAgICAgMzA4LCAgIDMxMSwgICAzMTUsICAgMzIzLCAgIDMzMSwgICAzMzQKKyAgICAgICAwLCAgICA4NiwgICAgODYsICAgIDk1LCAgICA5OCwgICAxMDUsICAgMTA5LCAgIDExNywgICAxMjQsICAgMTI4LAorICAgICAxMzIsICAgMTQ1LCAgIDE1MywgICAxNTYsICAgMTYzLCAgIDE2NywgICAxNzEsICAgMTc5LCAgIDE4MywgICAxODcsCisgICAgIDE5MSwgICAxOTUsICAgMjEyLCAgIDIyMiwgICAyMzAsICAgMjMzLCAgIDIzNywgICAyNDUsICAgMjQ4LCAgIDI1MiwKKyAgICAgMjU3LCAgIDI2NCwgICAyNzIsICAgMjc1LCAgIDI3OSwgICAyODcsICAgMjkwLCAgIDI5NCwgICAzMDIsICAgMzA2CiB9OwogI2VuZGlmCiAKQEAgLTQ5MCwxMyArNDc3LDEyIEBACiBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgeXl0bmFtZVtdID0KIHsKICAgIiRlbmQiLCAiZXJyb3IiLCAiJHVuZGVmaW5lZCIsICJEVF9WMSIsICJEVF9NRU1SRVNFUlZFIiwKLSAgIkRUX1BST1BOT0RFTkFNRSIsICJEVF9MSVRFUkFMIiwgIkRUX0xFR0FDWUxJVEVSQUwiLCAiRFRfQkFTRSIsCi0gICJEVF9CWVRFIiwgIkRUX1NUUklORyIsICJEVF9MQUJFTCIsICJEVF9SRUYiLCAiRFRfSU5DQklOIiwgIic7JyIsICInLSciLAotICAiJy8nIiwgIid7JyIsICInfSciLCAiJz0nIiwgIic8JyIsICInPiciLCAiJ1snIiwgIiddJyIsICInKCciLCAiJywnIiwKLSAgIicpJyIsICIkYWNjZXB0IiwgInNvdXJjZWZpbGUiLCAibWVtcmVzZXJ2ZXMiLCAibWVtcmVzZXJ2ZSIsCi0gICJ2MF9tZW1yZXNlcnZlcyIsICJ2MF9tZW1yZXNlcnZlIiwgImFkZHIiLCAiZGV2aWNldHJlZSIsICJub2RlZGVmIiwKLSAgInByb3BsaXN0IiwgInByb3BkZWYiLCAicHJvcGRhdGEiLCAicHJvcGRhdGFwcmVmaXgiLCAiY2VsbGxpc3QiLAotICAiY2VsbGJhc2UiLCAiY2VsbHZhbCIsICJieXRlc3RyaW5nIiwgInN1Ym5vZGVzIiwgInN1Ym5vZGUiLCAibGFiZWwiLCAwCisgICJEVF9QUk9QTk9ERU5BTUUiLCAiRFRfTElURVJBTCIsICJEVF9CQVNFIiwgIkRUX0JZVEUiLCAiRFRfU1RSSU5HIiwKKyAgIkRUX0xBQkVMIiwgIkRUX1JFRiIsICJEVF9JTkNCSU4iLCAiJzsnIiwgIicvJyIsICIneyciLCAiJ30nIiwgIic9JyIsCisgICInPCciLCAiJz4nIiwgIidbJyIsICInXSciLCAiJygnIiwgIicsJyIsICInKSciLCAiJGFjY2VwdCIsICJzb3VyY2VmaWxlIiwKKyAgIm1lbXJlc2VydmVzIiwgIm1lbXJlc2VydmUiLCAiYWRkciIsICJkZXZpY2V0cmVlIiwgIm5vZGVkZWYiLCAicHJvcGxpc3QiLAorICAicHJvcGRlZiIsICJwcm9wZGF0YSIsICJwcm9wZGF0YXByZWZpeCIsICJjZWxsbGlzdCIsICJjZWxsdmFsIiwKKyAgImJ5dGVzdHJpbmciLCAic3Vibm9kZXMiLCAic3Vibm9kZSIsIDAKIH07CiAjZW5kaWYKIApAQCAtNTA2LDI5ICs0OTIsMjcgQEAKIHN0YXRpYyBjb25zdCB5eXR5cGVfdWludDE2IHl5dG9rbnVtW10gPQogewogICAgICAgIDAsICAgMjU2LCAgIDI1NywgICAyNTgsICAgMjU5LCAgIDI2MCwgICAyNjEsICAgMjYyLCAgIDI2MywgICAyNjQsCi0gICAgIDI2NSwgICAyNjYsICAgMjY3LCAgIDI2OCwgICAgNTksICAgIDQ1LCAgICA0NywgICAxMjMsICAgMTI1LCAgICA2MSwKLSAgICAgIDYwLCAgICA2MiwgICAgOTEsICAgIDkzLCAgICA0MCwgICAgNDQsICAgIDQxCisgICAgIDI2NSwgICAyNjYsICAgMjY3LCAgICA1OSwgICAgNDcsICAgMTIzLCAgIDEyNSwgICAgNjEsICAgIDYwLCAgICA2MiwKKyAgICAgIDkxLCAgICA5MywgICAgNDAsICAgIDQ0LCAgICA0MQogfTsKICMgZW5kaWYKIAogLyogWVlSMVtZWU5dIC0tIFN5bWJvbCBudW1iZXIgb2Ygc3ltYm9sIHRoYXQgcnVsZSBZWU4gZGVyaXZlcy4gICovCiBzdGF0aWMgY29uc3QgeXl0eXBlX3VpbnQ4IHl5cjFbXSA9CiB7Ci0gICAgICAgMCwgICAgMjcsICAgIDI4LCAgICAyOCwgICAgMjksICAgIDI5LCAgICAzMCwgICAgMzEsICAgIDMxLCAgICAzMiwKLSAgICAgIDMyLCAgICAzMywgICAgMzMsICAgIDM0LCAgICAzNSwgICAgMzYsICAgIDM2LCAgICAzNywgICAgMzcsICAgIDM4LAotICAgICAgMzgsICAgIDM4LCAgICAzOCwgICAgMzgsICAgIDM4LCAgICAzOCwgICAgMzksICAgIDM5LCAgICAzOSwgICAgNDAsCi0gICAgICA0MCwgICAgNDAsICAgIDQwLCAgICA0MSwgICAgNDEsICAgIDQyLCAgICA0MiwgICAgNDMsICAgIDQzLCAgICA0MywKLSAgICAgIDQ0LCAgICA0NCwgICAgNDQsICAgIDQ1LCAgICA0NiwgICAgNDYKKyAgICAgICAwLCAgICAyNSwgICAgMjYsICAgIDI3LCAgICAyNywgICAgMjgsICAgIDI4LCAgICAyOSwgICAgMzAsICAgIDMwLAorICAgICAgMzAsICAgIDMxLCAgICAzMiwgICAgMzIsICAgIDMzLCAgICAzMywgICAgMzMsICAgIDM0LCAgICAzNCwgICAgMzQsCisgICAgICAzNCwgICAgMzQsICAgIDM0LCAgICAzNCwgICAgMzUsICAgIDM1LCAgICAzNSwgICAgMzYsICAgIDM2LCAgICAzNiwKKyAgICAgIDM2LCAgICAzNywgICAgMzgsICAgIDM4LCAgICAzOCwgICAgMzksICAgIDM5LCAgICAzOSwgICAgNDAsICAgIDQwCiB9OwogCiAvKiBZWVIyW1lZTl0gLS0gTnVtYmVyIG9mIHN5bWJvbHMgY29tcG9zaW5nIHJpZ2h0IGhhbmQgc2lkZSBvZiBydWxlIFlZTi4gICovCiBzdGF0aWMgY29uc3QgeXl0eXBlX3VpbnQ4IHl5cjJbXSA9CiB7Ci0gICAgICAgMCwgICAgIDIsICAgICA0LCAgICAgMiwgICAgIDAsICAgICAyLCAgICAgNSwgICAgIDAsICAgICAyLCAgICAgMSwKLSAgICAgICA2LCAgICAgMSwgICAgIDEsICAgICAyLCAgICAgNSwgICAgIDAsICAgICAyLCAgICAgNSwgICAgIDMsICAgICAyLAotICAgICAgIDQsICAgICA0LCAgICAgMiwgICAgIDksICAgICA1LCAgICAgMiwgICAgIDAsICAgICAyLCAgICAgMiwgICAgIDAsCi0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMCwgICAgIDEsICAgICAxLCAgICAgMiwgICAgIDAsICAgICAyLCAgICAgMiwKLSAgICAgICAwLCAgICAgMiwgICAgIDIsICAgICAzLCAgICAgMCwgICAgIDEKKyAgICAgICAwLCAgICAgMiwgICAgIDQsICAgICAwLCAgICAgMiwgICAgIDQsICAgICAyLCAgICAgMSwgICAgIDIsICAgICAzLAorICAgICAgIDMsICAgICA1LCAgICAgMCwgICAgIDIsICAgICA0LCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgNCwgICAgIDQsCisgICAgICAgMiwgICAgIDksICAgICA1LCAgICAgMiwgICAgIDAsICAgICAyLCAgICAgMiwgICAgIDAsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMSwgICAgIDAsICAgICAyLCAgICAgMiwgICAgIDAsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyCiB9OwogCiAvKiBZWURFRkFDVFtTVEFURS1OQU1FXSAtLSBEZWZhdWx0IHJ1bGUgdG8gcmVkdWNlIHdpdGggaW4gc3RhdGUKQEAgLTUzNiw4NiArNTIwLDc5IEBACiAgICBtZWFucyB0aGUgZGVmYXVsdCBpcyBhbiBlcnJvci4gICovCiBzdGF0aWMgY29uc3QgeXl0eXBlX3VpbnQ4IHl5ZGVmYWN0W10gPQogewotICAgICAgIDcsICAgICAwLCAgICA0NSwgICAgIDAsICAgICA5LCAgICAgMCwgICAgIDcsICAgICAwLCAgICAgNCwgICAgIDEsCi0gICAgICAgMCwgICAgIDMsICAgICA4LCAgICAgMCwgICAgIDAsICAgICA0LCAgICAgMCwgICAgMTUsICAgIDEzLCAgICAxMSwKLSAgICAgIDEyLCAgICAgMCwgICAgIDIsICAgICA1LCAgICAgMCwgICAgNDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDE2LAotICAgICAgIDAsICAgIDQwLCAgICAgMCwgICAgIDAsICAgICA2LCAgICAgMCwgICAgNDIsICAgIDQxLCAgICAgMCwgICAgMTAsCi0gICAgICAxNCwgICAgMTgsICAgIDI2LCAgICA0MywgICAgIDAsICAgICAwLCAgICAyNSwgICAgMTcsICAgIDI3LCAgICAxOSwKLSAgICAgIDI4LCAgICAyMiwgICAgIDAsICAgIDI5LCAgICAzNywgICAgIDAsICAgIDMzLCAgICAgMCwgICAgIDAsICAgIDM1LAotICAgICAgMzQsICAgIDMyLCAgICAzMSwgICAgMjAsICAgICAwLCAgICAzMCwgICAgMzgsICAgIDM5LCAgICAyMSwgICAgIDAsCi0gICAgICAyNCwgICAgMzYsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDIzCisgICAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMywgICAgIDEsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAzLCAgICAgNywKKyAgICAgICAwLCAgICAgNiwgICAgIDAsICAgICAyLCAgICAgNCwgICAgIDAsICAgIDEyLCAgICAgOCwgICAgIDAsICAgICAwLAorICAgICAgIDUsICAgIDM1LCAgICAxMCwgICAgIDksICAgICAwLCAgICAgMCwgICAgMTMsICAgICAwLCAgICAzNSwgICAgMTUsCisgICAgICAyNCwgICAgMzgsICAgIDE2LCAgICAzOSwgICAgIDAsICAgIDM3LCAgICAzNiwgICAgIDAsICAgICAwLCAgICAxMSwKKyAgICAgIDIzLCAgICAxNCwgICAgMjUsICAgIDE3LCAgICAyNiwgICAgMjAsICAgICAwLCAgICAyNywgICAgMzIsICAgICAwLAorICAgICAgIDAsICAgICAwLCAgICAgMCwgICAgMzEsICAgIDMwLCAgICAyOSwgICAgMTgsICAgIDI4LCAgICAzMywgICAgMzQsCisgICAgICAxOSwgICAgIDAsICAgIDIyLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAyMQogfTsKIAogLyogWVlERUZHT1RPW05URVJNLU5VTV0uICAqLwogc3RhdGljIGNvbnN0IHl5dHlwZV9pbnQ4IHl5ZGVmZ290b1tdID0KIHsKLSAgICAgIC0xLCAgICAgMywgICAgMTQsICAgICA0LCAgICAgNSwgICAgIDYsICAgIDI3LCAgICAxMSwgICAgMTgsICAgIDI1LAotICAgICAgMjksICAgIDQ0LCAgICA0NSwgICAgNTYsICAgIDY0LCAgICA2NSwgICAgNTcsICAgIDMwLCAgICAzMSwgICAgIDcKKyAgICAgIC0xLCAgICAgMiwgICAgIDcsICAgICA4LCAgICAxMCwgICAgMTMsICAgIDE3LCAgICAyMSwgICAgMjYsICAgIDM3LAorICAgICAgMzgsICAgIDUwLCAgICA1NywgICAgNTEsICAgIDI3LCAgICAyOAogfTsKIAogLyogWVlQQUNUW1NUQVRFLU5VTV0gLS0gSW5kZXggaW4gWVlUQUJMRSBvZiB0aGUgcG9ydGlvbiBkZXNjcmliaW5nCiAgICBTVEFURS1OVU0uICAqLwotI2RlZmluZSBZWVBBQ1RfTklORiAtMTQKKyNkZWZpbmUgWVlQQUNUX05JTkYgLTEyCiBzdGF0aWMgY29uc3QgeXl0eXBlX2ludDggeXlwYWN0W10gPQogewotICAgICAgMzAsICAgLTExLCAgIC0xNCwgICAgIDcsICAgLTE0LCAgICAtMSwgICAgMjcsICAgIDEzLCAgICAyNywgICAtMTQsCi0gICAgICAgOCwgICAtMTQsICAgLTE0LCAgICA0MCwgICAgLTEsICAgIDI3LCAgICAzNSwgICAtMTQsICAgLTE0LCAgIC0xNCwKLSAgICAgLTE0LCAgICAyMSwgICAtMTQsICAgLTE0LCAgICA0MCwgICAgMjQsICAgIDQwLCAgICAyOCwgICAgNDAsICAgLTE0LAotICAgICAgMzIsICAgIDI0LCAgICA0NiwgICAgMzgsICAgLTE0LCAgICAzOSwgICAtMTQsICAgLTE0LCAgICAyNiwgICAtMTQsCi0gICAgIC0xNCwgICAtMTQsICAgLTE0LCAgIC0xNCwgICAgLTksICAgIDEwLCAgIC0xNCwgICAtMTQsICAgLTE0LCAgIC0xNCwKLSAgICAgLTE0LCAgIC0xNCwgICAgMzEsICAgLTE0LCAgIC0xNCwgICAgNDQsICAgIC0yLCAgICAgMywgICAgMjMsICAgLTE0LAotICAgICAtMTQsICAgLTE0LCAgIC0xNCwgICAtMTQsICAgIDUwLCAgIC0xNCwgICAtMTQsICAgLTE0LCAgIC0xNCwgICAgNDAsCi0gICAgIC0xNCwgICAtMTQsICAgIDMzLCAgICA0MCwgICAgMzYsICAgLTE0CisgICAgICAxMCwgICAtMTEsICAgIDE4LCAgICAtMSwgICAtMTIsICAgIDIyLCAgICAtMSwgICAgMTUsICAgIC0xLCAgIC0xMiwKKyAgICAgIDIyLCAgIC0xMiwgICAgMjAsICAgICAxLCAgIC0xMiwgICAgMTcsICAgLTEyLCAgIC0xMiwgICAgMjAsICAgIDIwLAorICAgICAtMTIsICAgICA2LCAgIC0xMiwgICAtMTIsICAgIDIxLCAgICAgNiwgICAtMTIsICAgIDIzLCAgICAgNiwgICAtMTIsCisgICAgIC0xMiwgICAtMTIsICAgLTEyLCAgIC0xMiwgICAgMjgsICAgLTEyLCAgIC0xMiwgICAgLTYsICAgIDEzLCAgIC0xMiwKKyAgICAgLTEyLCAgIC0xMiwgICAtMTIsICAgLTEyLCAgIC0xMiwgICAtMTIsICAgIDI0LCAgIC0xMiwgICAtMTIsICAgIDMzLAorICAgICAgLTUsICAgICAwLCAgICAtNCwgICAtMTIsICAgLTEyLCAgIC0xMiwgICAtMTIsICAgLTEyLCAgIC0xMiwgICAtMTIsCisgICAgIC0xMiwgICAgMjIsICAgLTEyLCAgICAyNSwgICAgMjIsICAgIDE5LCAgIC0xMgogfTsKIAogLyogWVlQR09UT1tOVEVSTS1OVU1dLiAgKi8KIHN0YXRpYyBjb25zdCB5eXR5cGVfaW50OCB5eXBnb3RvW10gPQogewotICAgICAtMTQsICAgLTE0LCAgICA0OCwgICAgMjksICAgIDUzLCAgIC0xNCwgICAtMTMsICAgIDQ3LCAgICAzNCwgICAtMTQsCi0gICAgICAzNywgICAtMTQsICAgLTE0LCAgIC0xNCwgICAtMTQsICAgLTE0LCAgIC0xNCwgICAgNDIsICAgLTE0LCAgICAtNworICAgICAtMTIsICAgLTEyLCAgICAzNiwgICAgMzksICAgLTEwLCAgIC0xMiwgICAgIDgsICAgLTEyLCAgICAxMiwgICAtMTIsCisgICAgIC0xMiwgICAtMTIsICAgLTEyLCAgIC0xMiwgICAgMjcsICAgIDMxCiB9OwogCiAvKiBZWVRBQkxFW1lZUEFDVFtTVEFURS1OVU1dXS4gIFdoYXQgdG8gZG8gaW4gc3RhdGUgU1RBVEUtTlVNLiAgSWYKICAgIHBvc2l0aXZlLCBzaGlmdCB0aGF0IHRva2VuLiAgSWYgbmVnYXRpdmUsIHJlZHVjZSB0aGUgcnVsZSB3aGljaAogICAgbnVtYmVyIGlzIHRoZSBvcHBvc2l0ZS4gIElmIHplcm8sIGRvIHdoYXQgWVlERUZBQ1Qgc2F5cy4KICAgIElmIFlZVEFCTEVfTklORiwgc3ludGF4IGVycm9yLiAgKi8KLSNkZWZpbmUgWVlUQUJMRV9OSU5GIC00NQotc3RhdGljIGNvbnN0IHl5dHlwZV9pbnQ4IHl5dGFibGVbXSA9CisjZGVmaW5lIFlZVEFCTEVfTklORiAtMQorc3RhdGljIGNvbnN0IHl5dHlwZV91aW50OCB5eXRhYmxlW10gPQogewotICAgICAgMjEsICAgIDE2LCAgICA0NiwgICAgIDgsICAgIDU5LCAgICA0NywgICAgNjAsICAgICA5LCAgICAxNiwgICAgNjEsCi0gICAgICA2MiwgICAgMjgsICAgIDY2LCAgICAzMywgICAgNjcsICAgIDEwLCAgICA0OCwgICAgMTMsICAgIDMyLCAgICA2MywKLSAgICAgIDQ5LCAgICA1MCwgICAgNTEsICAgIDUyLCAgICAzMiwgICAgMTcsICAgIDY4LCAgICAxOSwgICAgMjAsICAgLTQ0LAotICAgICAgNTMsICAgLTQ0LCAgICA1NCwgICAgIDEsICAgLTQ0LCAgICAgMiwgICAgMjYsICAgIDE1LCAgICAgMiwgICAgMjQsCi0gICAgICA0MSwgICAgIDIsICAgIDM0LCAgICAxNywgICAgMTUsICAgIDQyLCAgICAxOSwgICAgMjAsICAgIDY5LCAgICA3MCwKLSAgICAgIDM1LCAgICAzOCwgICAgMzksICAgIDQwLCAgICA1OCwgICAgNTUsICAgIDcyLCAgICA3MSwgICAgNzMsICAgIDEyLAotICAgICAgNzQsICAgIDIyLCAgICA3NSwgICAgMjMsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAzNiwgICAgIDAsCi0gICAgICAgMCwgICAgIDAsICAgIDQzLCAgICAzNworICAgICAgMTUsICAgIDUzLCAgICAgMywgICAgIDUsICAgIDQwLCAgICA1NCwgICAgNTUsICAgIDQxLCAgICA1OCwgICAgIDYsCisgICAgICA1OSwgICAgMjQsICAgIDE4LCAgICAgMSwgICAgNTYsICAgIDE5LCAgICAyNSwgICAgNDIsICAgICA0LCAgICA2MSwKKyAgICAgIDYyLCAgICA2MCwgICAgNDMsICAgIDQ0LCAgICA0NSwgICAgNDYsICAgIDIyLCAgICAyMywgICAgIDksICAgIDEyLAorICAgICAgMjAsICAgIDQ3LCAgICAzMSwgICAgNDgsICAgIDI5LCAgICAxNiwgICAgMTYsICAgIDMyLCAgICAzMCwgICAgMzQsCisgICAgICAzNSwgICAgMzksICAgIDUyLCAgICA2NiwgICAgMTQsICAgIDExLCAgICA0OSwgICAgIDAsICAgIDY0LCAgICAgMCwKKyAgICAgICAwLCAgICA2MywgICAgIDAsICAgICAwLCAgICA2NSwgICAgMzYsICAgIDMzCiB9OwogCiBzdGF0aWMgY29uc3QgeXl0eXBlX2ludDggeXljaGVja1tdID0KIHsKLSAgICAgIDEzLCAgICAgOCwgICAgMTEsICAgIDE0LCAgICAgNiwgICAgMTQsICAgICA4LCAgICAgMCwgICAgMTUsICAgIDExLAotICAgICAgMTIsICAgIDI0LCAgICAgOSwgICAgMjYsICAgIDExLCAgICAxNiwgICAgMjUsICAgICA0LCAgICAyNSwgICAgMjEsCi0gICAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAgMzEsICAgIDE3LCAgICAyMywgICAgIDYsICAgICA3LCAgICAgNSwKLSAgICAgIDIwLCAgICAgNCwgICAgMjIsICAgICAzLCAgICAgNCwgICAgMTEsICAgIDE1LCAgICAgOCwgICAgMTEsICAgICA0LAotICAgICAgMTQsICAgIDExLCAgICAxNCwgICAgMTcsICAgIDE1LCAgICAxOSwgICAgIDYsICAgICA3LCAgICAyNSwgICAgMjYsCi0gICAgICAxOCwgICAgIDUsICAgIDE0LCAgICAxNCwgICAgMTAsICAgIDI0LCAgICA2OSwgICAgIDcsICAgIDI1LCAgICAgNiwKLSAgICAgIDczLCAgICAxNCwgICAgMjYsICAgIDE1LCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgMzEsICAgIC0xLAotICAgICAgLTEsICAgIC0xLCAgICAzOCwgICAgMzEKKyAgICAgIDEwLCAgICAgNiwgICAgMTMsICAgICA0LCAgICAxMCwgICAgMTAsICAgIDExLCAgICAxMywgICAgIDgsICAgIDEwLAorICAgICAgMTAsICAgICA1LCAgICAxMSwgICAgIDMsICAgIDE5LCAgICAxNCwgICAgMTAsICAgIDIzLCAgICAgMCwgICAgMjMsCisgICAgICAyNCwgICAgMjEsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxOCwgICAgMTksICAgICA2LCAgICAxNCwKKyAgICAgIDEzLCAgICAxOCwgICAgMjQsICAgIDIwLCAgICAxMywgICAgMTUsICAgIDE1LCAgICAyNSwgICAgMTcsICAgIDE2LAorICAgICAgMjgsICAgIDEzLCAgICAgOSwgICAgMjQsICAgICA4LCAgICAgNiwgICAgMjIsICAgIC0xLCAgICAyMywgICAgLTEsCisgICAgICAtMSwgICAgNjEsICAgIC0xLCAgICAtMSwgICAgNjQsICAgIDI4LCAgICAyNQogfTsKIAogLyogWVlTVE9TW1NUQVRFLU5VTV0gLS0gVGhlIChpbnRlcm5hbCBudW1iZXIgb2YgdGhlKSBhY2Nlc3NpbmcKICAgIHN5bWJvbCBvZiBzdGF0ZSBTVEFURS1OVU0uICAqLwogc3RhdGljIGNvbnN0IHl5dHlwZV91aW50OCB5eXN0b3NbXSA9CiB7Ci0gICAgICAgMCwgICAgIDMsICAgIDExLCAgICAyOCwgICAgMzAsICAgIDMxLCAgICAzMiwgICAgNDYsICAgIDE0LCAgICAgMCwKLSAgICAgIDE2LCAgICAzNCwgICAgMzEsICAgICA0LCAgICAyOSwgICAgMzAsICAgIDQ2LCAgICAxNywgICAgMzUsICAgICA2LAotICAgICAgIDcsICAgIDMzLCAgICAzNCwgICAgMjksICAgICA0LCAgICAzNiwgICAgMTUsICAgIDMzLCAgICAzMywgICAgMzcsCi0gICAgICA0NCwgICAgNDUsICAgIDQ2LCAgICAzMywgICAgMTQsICAgIDE4LCAgICAzNywgICAgNDQsICAgICA1LCAgICAxNCwKLSAgICAgIDE0LCAgICAxNCwgICAgMTksICAgIDM1LCAgICAzOCwgICAgMzksICAgIDExLCAgICAxNCwgICAgMjUsICAgIDEwLAotICAgICAgMTEsICAgIDEyLCAgICAxMywgICAgMjAsICAgIDIyLCAgICAyNCwgICAgNDAsICAgIDQzLCAgICAxMCwgICAgIDYsCi0gICAgICAgOCwgICAgMTEsICAgIDEyLCAgICAyMSwgICAgNDEsICAgIDQyLCAgICAgOSwgICAgMTEsICAgIDIzLCAgICAyNSwKLSAgICAgIDI2LCAgICAgNywgICAgMzMsICAgIDI1LCAgICAzMywgICAgMjYKKyAgICAgICAwLCAgICAgMywgICAgMjYsICAgIDEzLCAgICAgMCwgICAgIDQsICAgIDEwLCAgICAyNywgICAgMjgsICAgICA2LAorICAgICAgMjksICAgIDI4LCAgICAxNCwgICAgMzAsICAgIDI3LCAgICAyOSwgICAgMTUsICAgIDMxLCAgICAxMSwgICAgMTQsCisgICAgICAxMywgICAgMzIsICAgIDMxLCAgICAzMSwgICAgIDUsICAgIDEwLCAgICAzMywgICAgMzksICAgIDQwLCAgICAxMywKKyAgICAgIDE3LCAgICAzMSwgICAgMzMsICAgIDQwLCAgICAxNiwgICAgMzMsICAgIDM5LCAgICAzNCwgICAgMzUsICAgIDEzLAorICAgICAgMTAsICAgIDEzLCAgICAyMywgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDE4LCAgICAyMCwgICAgMjIsCisgICAgICAzNiwgICAgMzgsICAgICA5LCAgICAgNiwgICAgMTAsICAgIDExLCAgICAxOSwgICAgMzcsICAgICA4LCAgICAxMCwKKyAgICAgIDIxLCAgICAyMywgICAgMjQsICAgIDI5LCAgICAyMywgICAgMjksICAgIDI0CiB9OwogCiAjZGVmaW5lIHl5ZXJyb2sJCSh5eWVycnN0YXR1cyA9IDApCkBAIC03MjgsNyArNzA1LDcgQEAKICAgICB7CQkJCQkJCQkJICBcCiAgICAgICBZWUZQUklOVEYgKHN0ZGVyciwgIiVzICIsIFRpdGxlKTsJCQkJCSAgXAogICAgICAgeXlfc3ltYm9sX3ByaW50IChzdGRlcnIsCQkJCQkJICBcCi0JCSAgVHlwZSwgVmFsdWUsIExvY2F0aW9uKTsgXAorCQkgIFR5cGUsIFZhbHVlKTsgXAogICAgICAgWVlGUFJJTlRGIChzdGRlcnIsICJcbiIpOwkJCQkJCSAgXAogICAgIH0JCQkJCQkJCQkgIFwKIH0gd2hpbGUgKFlZSUQgKDApKQpAQCAtNzQyLDE5ICs3MTksMTcgQEAKICNpZiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAogICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCiBzdGF0aWMgdm9pZAoteXlfc3ltYm9sX3ZhbHVlX3ByaW50IChGSUxFICp5eW91dHB1dCwgaW50IHl5dHlwZSwgWVlTVFlQRSBjb25zdCAqIGNvbnN0IHl5dmFsdWVwLCBZWUxUWVBFIGNvbnN0ICogY29uc3QgeXlsb2NhdGlvbnApCit5eV9zeW1ib2xfdmFsdWVfcHJpbnQgKEZJTEUgKnl5b3V0cHV0LCBpbnQgeXl0eXBlLCBZWVNUWVBFIGNvbnN0ICogY29uc3QgeXl2YWx1ZXApCiAjZWxzZQogc3RhdGljIHZvaWQKLXl5X3N5bWJvbF92YWx1ZV9wcmludCAoeXlvdXRwdXQsIHl5dHlwZSwgeXl2YWx1ZXAsIHl5bG9jYXRpb25wKQoreXlfc3ltYm9sX3ZhbHVlX3ByaW50ICh5eW91dHB1dCwgeXl0eXBlLCB5eXZhbHVlcCkKICAgICBGSUxFICp5eW91dHB1dDsKICAgICBpbnQgeXl0eXBlOwogICAgIFlZU1RZUEUgY29uc3QgKiBjb25zdCB5eXZhbHVlcDsKLSAgICBZWUxUWVBFIGNvbnN0ICogY29uc3QgeXlsb2NhdGlvbnA7CiAjZW5kaWYKIHsKICAgaWYgKCF5eXZhbHVlcCkKICAgICByZXR1cm47Ci0gIFlZVVNFICh5eWxvY2F0aW9ucCk7CiAjIGlmZGVmIFlZUFJJTlQKICAgaWYgKHl5dHlwZSA8IFlZTlRPS0VOUykKICAgICBZWVBSSU5UICh5eW91dHB1dCwgeXl0b2tudW1beXl0eXBlXSwgKnl5dmFsdWVwKTsKQEAgLTc3NiwxNCArNzUxLDEzIEBACiAjaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKICAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQogc3RhdGljIHZvaWQKLXl5X3N5bWJvbF9wcmludCAoRklMRSAqeXlvdXRwdXQsIGludCB5eXR5cGUsIFlZU1RZUEUgY29uc3QgKiBjb25zdCB5eXZhbHVlcCwgWVlMVFlQRSBjb25zdCAqIGNvbnN0IHl5bG9jYXRpb25wKQoreXlfc3ltYm9sX3ByaW50IChGSUxFICp5eW91dHB1dCwgaW50IHl5dHlwZSwgWVlTVFlQRSBjb25zdCAqIGNvbnN0IHl5dmFsdWVwKQogI2Vsc2UKIHN0YXRpYyB2b2lkCi15eV9zeW1ib2xfcHJpbnQgKHl5b3V0cHV0LCB5eXR5cGUsIHl5dmFsdWVwLCB5eWxvY2F0aW9ucCkKK3l5X3N5bWJvbF9wcmludCAoeXlvdXRwdXQsIHl5dHlwZSwgeXl2YWx1ZXApCiAgICAgRklMRSAqeXlvdXRwdXQ7CiAgICAgaW50IHl5dHlwZTsKICAgICBZWVNUWVBFIGNvbnN0ICogY29uc3QgeXl2YWx1ZXA7Ci0gICAgWVlMVFlQRSBjb25zdCAqIGNvbnN0IHl5bG9jYXRpb25wOwogI2VuZGlmCiB7CiAgIGlmICh5eXR5cGUgPCBZWU5UT0tFTlMpCkBAIC03OTEsOSArNzY1LDcgQEAKICAgZWxzZQogICAgIFlZRlBSSU5URiAoeXlvdXRwdXQsICJudGVybSAlcyAoIiwgeXl0bmFtZVt5eXR5cGVdKTsKIAotICBZWV9MT0NBVElPTl9QUklOVCAoeXlvdXRwdXQsICp5eWxvY2F0aW9ucCk7Ci0gIFlZRlBSSU5URiAoeXlvdXRwdXQsICI6ICIpOwotICB5eV9zeW1ib2xfdmFsdWVfcHJpbnQgKHl5b3V0cHV0LCB5eXR5cGUsIHl5dmFsdWVwLCB5eWxvY2F0aW9ucCk7CisgIHl5X3N5bWJvbF92YWx1ZV9wcmludCAoeXlvdXRwdXQsIHl5dHlwZSwgeXl2YWx1ZXApOwogICBZWUZQUklOVEYgKHl5b3V0cHV0LCAiKSIpOwogfQogCkBAIC04MDUsMTcgKzc3NywyMCBAQAogI2lmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCiAgICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKIHN0YXRpYyB2b2lkCi15eV9zdGFja19wcmludCAoeXl0eXBlX2ludDE2ICpib3R0b20sIHl5dHlwZV9pbnQxNiAqdG9wKQoreXlfc3RhY2tfcHJpbnQgKHl5dHlwZV9pbnQxNiAqeXlib3R0b20sIHl5dHlwZV9pbnQxNiAqeXl0b3ApCiAjZWxzZQogc3RhdGljIHZvaWQKLXl5X3N0YWNrX3ByaW50IChib3R0b20sIHRvcCkKLSAgICB5eXR5cGVfaW50MTYgKmJvdHRvbTsKLSAgICB5eXR5cGVfaW50MTYgKnRvcDsKK3l5X3N0YWNrX3ByaW50ICh5eWJvdHRvbSwgeXl0b3ApCisgICAgeXl0eXBlX2ludDE2ICp5eWJvdHRvbTsKKyAgICB5eXR5cGVfaW50MTYgKnl5dG9wOwogI2VuZGlmCiB7CiAgIFlZRlBSSU5URiAoc3RkZXJyLCAiU3RhY2sgbm93Iik7Ci0gIGZvciAoOyBib3R0b20gPD0gdG9wOyArK2JvdHRvbSkKLSAgICBZWUZQUklOVEYgKHN0ZGVyciwgIiAlZCIsICpib3R0b20pOworICBmb3IgKDsgeXlib3R0b20gPD0geXl0b3A7IHl5Ym90dG9tKyspCisgICAgeworICAgICAgaW50IHl5Ym90ID0gKnl5Ym90dG9tOworICAgICAgWVlGUFJJTlRGIChzdGRlcnIsICIgJWQiLCB5eWJvdCk7CisgICAgfQogICBZWUZQUklOVEYgKHN0ZGVyciwgIlxuIik7CiB9CiAKQEAgLTgzMywxMiArODA4LDExIEBACiAjaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKICAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQogc3RhdGljIHZvaWQKLXl5X3JlZHVjZV9wcmludCAoWVlTVFlQRSAqeXl2c3AsIFlZTFRZUEUgKnl5bHNwLCBpbnQgeXlydWxlKQoreXlfcmVkdWNlX3ByaW50IChZWVNUWVBFICp5eXZzcCwgaW50IHl5cnVsZSkKICNlbHNlCiBzdGF0aWMgdm9pZAoteXlfcmVkdWNlX3ByaW50ICh5eXZzcCwgeXlsc3AsIHl5cnVsZSkKK3l5X3JlZHVjZV9wcmludCAoeXl2c3AsIHl5cnVsZSkKICAgICBZWVNUWVBFICp5eXZzcDsKLSAgICBZWUxUWVBFICp5eWxzcDsKICAgICBpbnQgeXlydWxlOwogI2VuZGlmCiB7CkBAIC04NTAsMTggKzgyNCwxOCBAQAogICAvKiBUaGUgc3ltYm9scyBiZWluZyByZWR1Y2VkLiAgKi8KICAgZm9yICh5eWkgPSAwOyB5eWkgPCB5eW5yaHM7IHl5aSsrKQogICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAgICQlZCA9ICIsIHl5aSArIDEpOworICAgICAgWVlGUFJJTlRGIChzdGRlcnIsICIgICAkJWQgPSAiLCB5eWkgKyAxKTsKICAgICAgIHl5X3N5bWJvbF9wcmludCAoc3RkZXJyLCB5eXJoc1t5eXByaHNbeXlydWxlXSArIHl5aV0sCiAJCSAgICAgICAmKHl5dnNwWyh5eWkgKyAxKSAtICh5eW5yaHMpXSkKLQkJICAgICAgICwgJih5eWxzcFsoeXlpICsgMSkgLSAoeXlucmhzKV0pCQkgICAgICAgKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlxuIik7CisJCSAgICAgICAJCSAgICAgICApOworICAgICAgWVlGUFJJTlRGIChzdGRlcnIsICJcbiIpOwogICAgIH0KIH0KIAogIyBkZWZpbmUgWVlfUkVEVUNFX1BSSU5UKFJ1bGUpCQlcCiBkbyB7CQkJCQlcCiAgIGlmICh5eWRlYnVnKQkJCQlcCi0gICAgeXlfcmVkdWNlX3ByaW50ICh5eXZzcCwgeXlsc3AsIFJ1bGUpOyBcCisgICAgeXlfcmVkdWNlX3ByaW50ICh5eXZzcCwgUnVsZSk7IFwKIH0gd2hpbGUgKFlZSUQgKDApKQogCiAvKiBOb256ZXJvIG1lYW5zIHByaW50IHBhcnNlIHRyYWNlLiAgSXQgaXMgbGVmdCB1bmluaXRpYWxpemVkIHNvIHRoYXQKQEAgLTExMTIsMTggKzEwODYsMTYgQEAKICNpZiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAogICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCiBzdGF0aWMgdm9pZAoteXlkZXN0cnVjdCAoY29uc3QgY2hhciAqeXltc2csIGludCB5eXR5cGUsIFlZU1RZUEUgKnl5dmFsdWVwLCBZWUxUWVBFICp5eWxvY2F0aW9ucCkKK3l5ZGVzdHJ1Y3QgKGNvbnN0IGNoYXIgKnl5bXNnLCBpbnQgeXl0eXBlLCBZWVNUWVBFICp5eXZhbHVlcCkKICNlbHNlCiBzdGF0aWMgdm9pZAoteXlkZXN0cnVjdCAoeXltc2csIHl5dHlwZSwgeXl2YWx1ZXAsIHl5bG9jYXRpb25wKQoreXlkZXN0cnVjdCAoeXltc2csIHl5dHlwZSwgeXl2YWx1ZXApCiAgICAgY29uc3QgY2hhciAqeXltc2c7CiAgICAgaW50IHl5dHlwZTsKICAgICBZWVNUWVBFICp5eXZhbHVlcDsKLSAgICBZWUxUWVBFICp5eWxvY2F0aW9ucDsKICNlbmRpZgogewogICBZWVVTRSAoeXl2YWx1ZXApOwotICBZWVVTRSAoeXlsb2NhdGlvbnApOwogCiAgIGlmICgheXltc2cpCiAgICAgeXltc2cgPSAiRGVsZXRpbmciOwpAQCAtMTEzNiwxMCArMTEwOCw4IEBACiAJYnJlYWs7CiAgICAgfQogfQotDAogCiAvKiBQcmV2ZW50IHdhcm5pbmdzIGZyb20gLVdtaXNzaW5nLXByb3RvdHlwZXMuICAqLwotCiAjaWZkZWYgWVlQQVJTRV9QQVJBTQogI2lmIGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX2NwbHVzcGx1cwogaW50IHl5cGFyc2UgKHZvaWQgKllZUEFSU0VfUEFSQU0pOwpAQCAtMTE1NSwyMyArMTEyNSwyMCBAQAogI2VuZGlmIC8qICEgWVlQQVJTRV9QQVJBTSAqLwogCiAKLQotLyogVGhlIGxvb2stYWhlYWQgc3ltYm9sLiAgKi8KKy8qIFRoZSBsb29rYWhlYWQgc3ltYm9sLiAgKi8KIGludCB5eWNoYXI7CiAKLS8qIFRoZSBzZW1hbnRpYyB2YWx1ZSBvZiB0aGUgbG9vay1haGVhZCBzeW1ib2wuICAqLworLyogVGhlIHNlbWFudGljIHZhbHVlIG9mIHRoZSBsb29rYWhlYWQgc3ltYm9sLiAgKi8KIFlZU1RZUEUgeXlsdmFsOwogCiAvKiBOdW1iZXIgb2Ygc3ludGF4IGVycm9ycyBzbyBmYXIuICAqLwogaW50IHl5bmVycnM7Ci0vKiBMb2NhdGlvbiBkYXRhIGZvciB0aGUgbG9vay1haGVhZCBzeW1ib2wuICAqLwotWVlMVFlQRSB5eWxsb2M7CiAKIAogCi0vKi0tLS0tLS0tLS0uCi18IHl5cGFyc2UuICB8Ci1gLS0tLS0tLS0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5cGFyc2Ugb3IgeXlwdXNoX3BhcnNlLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAjaWZkZWYgWVlQQVJTRV9QQVJBTQogI2lmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCkBAIC0xMTk1LDE0ICsxMTYyLDM5IEBACiAjZW5kaWYKICNlbmRpZgogewotICAKLSAgaW50IHl5c3RhdGU7CisKKworICAgIGludCB5eXN0YXRlOworICAgIC8qIE51bWJlciBvZiB0b2tlbnMgdG8gc2hpZnQgYmVmb3JlIGVycm9yIG1lc3NhZ2VzIGVuYWJsZWQuICAqLworICAgIGludCB5eWVycnN0YXR1czsKKworICAgIC8qIFRoZSBzdGFja3MgYW5kIHRoZWlyIHRvb2xzOgorICAgICAgIGB5eXNzJzogcmVsYXRlZCB0byBzdGF0ZXMuCisgICAgICAgYHl5dnMnOiByZWxhdGVkIHRvIHNlbWFudGljIHZhbHVlcy4KKworICAgICAgIFJlZmVyIHRvIHRoZSBzdGFja3MgdGhydSBzZXBhcmF0ZSBwb2ludGVycywgdG8gYWxsb3cgeXlvdmVyZmxvdworICAgICAgIHRvIHJlYWxsb2NhdGUgdGhlbSBlbHNld2hlcmUuICAqLworCisgICAgLyogVGhlIHN0YXRlIHN0YWNrLiAgKi8KKyAgICB5eXR5cGVfaW50MTYgeXlzc2FbWVlJTklUREVQVEhdOworICAgIHl5dHlwZV9pbnQxNiAqeXlzczsKKyAgICB5eXR5cGVfaW50MTYgKnl5c3NwOworCisgICAgLyogVGhlIHNlbWFudGljIHZhbHVlIHN0YWNrLiAgKi8KKyAgICBZWVNUWVBFIHl5dnNhW1lZSU5JVERFUFRIXTsKKyAgICBZWVNUWVBFICp5eXZzOworICAgIFlZU1RZUEUgKnl5dnNwOworCisgICAgWVlTSVpFX1QgeXlzdGFja3NpemU7CisKICAgaW50IHl5bjsKICAgaW50IHl5cmVzdWx0OwotICAvKiBOdW1iZXIgb2YgdG9rZW5zIHRvIHNoaWZ0IGJlZm9yZSBlcnJvciBtZXNzYWdlcyBlbmFibGVkLiAgKi8KLSAgaW50IHl5ZXJyc3RhdHVzOwotICAvKiBMb29rLWFoZWFkIHRva2VuIGFzIGFuIGludGVybmFsICh0cmFuc2xhdGVkKSB0b2tlbiBudW1iZXIuICAqLwotICBpbnQgeXl0b2tlbiA9IDA7CisgIC8qIExvb2thaGVhZCB0b2tlbiBhcyBhbiBpbnRlcm5hbCAodHJhbnNsYXRlZCkgdG9rZW4gbnVtYmVyLiAgKi8KKyAgaW50IHl5dG9rZW47CisgIC8qIFRoZSB2YXJpYWJsZXMgdXNlZCB0byByZXR1cm4gc2VtYW50aWMgdmFsdWUgYW5kIGxvY2F0aW9uIGZyb20gdGhlCisgICAgIGFjdGlvbiByb3V0aW5lcy4gICovCisgIFlZU1RZUEUgeXl2YWw7CisKICNpZiBZWUVSUk9SX1ZFUkJPU0UKICAgLyogQnVmZmVyIGZvciBlcnJvciBtZXNzYWdlcywgYW5kIGl0cyBhbGxvY2F0ZWQgc2l6ZS4gICovCiAgIGNoYXIgeXltc2didWZbMTI4XTsKQEAgLTEyMTAsNjQgKzEyMDIsMzAgQEAKICAgWVlTSVpFX1QgeXltc2dfYWxsb2MgPSBzaXplb2YgeXltc2didWY7CiAjZW5kaWYKIAotICAvKiBUaHJlZSBzdGFja3MgYW5kIHRoZWlyIHRvb2xzOgotICAgICBgeXlzcyc6IHJlbGF0ZWQgdG8gc3RhdGVzLAotICAgICBgeXl2cyc6IHJlbGF0ZWQgdG8gc2VtYW50aWMgdmFsdWVzLAotICAgICBgeXlscyc6IHJlbGF0ZWQgdG8gbG9jYXRpb25zLgotCi0gICAgIFJlZmVyIHRvIHRoZSBzdGFja3MgdGhydSBzZXBhcmF0ZSBwb2ludGVycywgdG8gYWxsb3cgeXlvdmVyZmxvdwotICAgICB0byByZWFsbG9jYXRlIHRoZW0gZWxzZXdoZXJlLiAgKi8KLQotICAvKiBUaGUgc3RhdGUgc3RhY2suICAqLwotICB5eXR5cGVfaW50MTYgeXlzc2FbWVlJTklUREVQVEhdOwotICB5eXR5cGVfaW50MTYgKnl5c3MgPSB5eXNzYTsKLSAgeXl0eXBlX2ludDE2ICp5eXNzcDsKLQotICAvKiBUaGUgc2VtYW50aWMgdmFsdWUgc3RhY2suICAqLwotICBZWVNUWVBFIHl5dnNhW1lZSU5JVERFUFRIXTsKLSAgWVlTVFlQRSAqeXl2cyA9IHl5dnNhOwotICBZWVNUWVBFICp5eXZzcDsKLQotICAvKiBUaGUgbG9jYXRpb24gc3RhY2suICAqLwotICBZWUxUWVBFIHl5bHNhW1lZSU5JVERFUFRIXTsKLSAgWVlMVFlQRSAqeXlscyA9IHl5bHNhOwotICBZWUxUWVBFICp5eWxzcDsKLSAgLyogVGhlIGxvY2F0aW9ucyB3aGVyZSB0aGUgZXJyb3Igc3RhcnRlZCBhbmQgZW5kZWQuICAqLwotICBZWUxUWVBFIHl5ZXJyb3JfcmFuZ2VbMl07Ci0KLSNkZWZpbmUgWVlQT1BTVEFDSyhOKSAgICh5eXZzcCAtPSAoTiksIHl5c3NwIC09IChOKSwgeXlsc3AgLT0gKE4pKQotCi0gIFlZU0laRV9UIHl5c3RhY2tzaXplID0gWVlJTklUREVQVEg7Ci0KLSAgLyogVGhlIHZhcmlhYmxlcyB1c2VkIHRvIHJldHVybiBzZW1hbnRpYyB2YWx1ZSBhbmQgbG9jYXRpb24gZnJvbSB0aGUKLSAgICAgYWN0aW9uIHJvdXRpbmVzLiAgKi8KLSAgWVlTVFlQRSB5eXZhbDsKLSAgWVlMVFlQRSB5eWxvYzsKKyNkZWZpbmUgWVlQT1BTVEFDSyhOKSAgICh5eXZzcCAtPSAoTiksIHl5c3NwIC09IChOKSkKIAogICAvKiBUaGUgbnVtYmVyIG9mIHN5bWJvbHMgb24gdGhlIFJIUyBvZiB0aGUgcmVkdWNlZCBydWxlLgogICAgICBLZWVwIHRvIHplcm8gd2hlbiBubyBzeW1ib2wgc2hvdWxkIGJlIHBvcHBlZC4gICovCiAgIGludCB5eWxlbiA9IDA7CiAKKyAgeXl0b2tlbiA9IDA7CisgIHl5c3MgPSB5eXNzYTsKKyAgeXl2cyA9IHl5dnNhOworICB5eXN0YWNrc2l6ZSA9IFlZSU5JVERFUFRIOworCiAgIFlZRFBSSU5URiAoKHN0ZGVyciwgIlN0YXJ0aW5nIHBhcnNlXG4iKSk7CiAKICAgeXlzdGF0ZSA9IDA7CiAgIHl5ZXJyc3RhdHVzID0gMDsKICAgeXluZXJycyA9IDA7Ci0gIHl5Y2hhciA9IFlZRU1QVFk7CQkvKiBDYXVzZSBhIHRva2VuIHRvIGJlIHJlYWQuICAqLworICB5eWNoYXIgPSBZWUVNUFRZOyAvKiBDYXVzZSBhIHRva2VuIHRvIGJlIHJlYWQuICAqLwogCiAgIC8qIEluaXRpYWxpemUgc3RhY2sgcG9pbnRlcnMuCiAgICAgIFdhc3RlIG9uZSBlbGVtZW50IG9mIHZhbHVlIGFuZCBsb2NhdGlvbiBzdGFjawogICAgICBzbyB0aGF0IHRoZXkgc3RheSBvbiB0aGUgc2FtZSBsZXZlbCBhcyB0aGUgc3RhdGUgc3RhY2suCiAgICAgIFRoZSB3YXN0ZWQgZWxlbWVudHMgYXJlIG5ldmVyIGluaXRpYWxpemVkLiAgKi8KLQogICB5eXNzcCA9IHl5c3M7CiAgIHl5dnNwID0geXl2czsKLSAgeXlsc3AgPSB5eWxzOwotI2lmIFlZTFRZUEVfSVNfVFJJVklBTAotICAvKiBJbml0aWFsaXplIHRoZSBkZWZhdWx0IGxvY2F0aW9uIGJlZm9yZSBwYXJzaW5nIHN0YXJ0cy4gICovCi0gIHl5bGxvYy5maXJzdF9saW5lICAgPSB5eWxsb2MubGFzdF9saW5lICAgPSAxOwotICB5eWxsb2MuZmlyc3RfY29sdW1uID0geXlsbG9jLmxhc3RfY29sdW1uID0gMDsKLSNlbmRpZgogCiAgIGdvdG8geXlzZXRzdGF0ZTsKIApAQCAtMTI5NCw3ICsxMjUyLDYgQEAKIAkgICBtZW1vcnkuICAqLwogCVlZU1RZUEUgKnl5dnMxID0geXl2czsKIAl5eXR5cGVfaW50MTYgKnl5c3MxID0geXlzczsKLQlZWUxUWVBFICp5eWxzMSA9IHl5bHM7CiAKIAkvKiBFYWNoIHN0YWNrIHBvaW50ZXIgYWRkcmVzcyBpcyBmb2xsb3dlZCBieSB0aGUgc2l6ZSBvZiB0aGUKIAkgICBkYXRhIGluIHVzZSBpbiB0aGF0IHN0YWNrLCBpbiBieXRlcy4gIFRoaXMgdXNlZCB0byBiZSBhCkBAIC0xMzAzLDkgKzEyNjAsOCBAQAogCXl5b3ZlcmZsb3cgKFlZXygibWVtb3J5IGV4aGF1c3RlZCIpLAogCQkgICAgJnl5c3MxLCB5eXNpemUgKiBzaXplb2YgKCp5eXNzcCksCiAJCSAgICAmeXl2czEsIHl5c2l6ZSAqIHNpemVvZiAoKnl5dnNwKSwKLQkJICAgICZ5eWxzMSwgeXlzaXplICogc2l6ZW9mICgqeXlsc3ApLAogCQkgICAgJnl5c3RhY2tzaXplKTsKLQl5eWxzID0geXlsczE7CisKIAl5eXNzID0geXlzczE7CiAJeXl2cyA9IHl5dnMxOwogICAgICAgfQpAQCAtMTMyNiw5ICsxMjgyLDggQEAKIAkgICh1bmlvbiB5eWFsbG9jICopIFlZU1RBQ0tfQUxMT0MgKFlZU1RBQ0tfQllURVMgKHl5c3RhY2tzaXplKSk7CiAJaWYgKCEgeXlwdHIpCiAJICBnb3RvIHl5ZXhoYXVzdGVkbGFiOwotCVlZU1RBQ0tfUkVMT0NBVEUgKHl5c3MpOwotCVlZU1RBQ0tfUkVMT0NBVEUgKHl5dnMpOwotCVlZU1RBQ0tfUkVMT0NBVEUgKHl5bHMpOworCVlZU1RBQ0tfUkVMT0NBVEUgKHl5c3NfYWxsb2MsIHl5c3MpOworCVlZU1RBQ0tfUkVMT0NBVEUgKHl5dnNfYWxsb2MsIHl5dnMpOwogIyAgdW5kZWYgWVlTVEFDS19SRUxPQ0FURQogCWlmICh5eXNzMSAhPSB5eXNzYSkKIAkgIFlZU1RBQ0tfRlJFRSAoeXlzczEpOwpAQCAtMTMzOCw3ICsxMjkzLDYgQEAKIAogICAgICAgeXlzc3AgPSB5eXNzICsgeXlzaXplIC0gMTsKICAgICAgIHl5dnNwID0geXl2cyArIHl5c2l6ZSAtIDE7Ci0gICAgICB5eWxzcCA9IHl5bHMgKyB5eXNpemUgLSAxOwogCiAgICAgICBZWURQUklOVEYgKChzdGRlcnIsICJTdGFjayBzaXplIGluY3JlYXNlZCB0byAlbHVcbiIsCiAJCSAgKHVuc2lnbmVkIGxvbmcgaW50KSB5eXN0YWNrc2l6ZSkpOwpAQCAtMTM0OSw2ICsxMzAzLDkgQEAKIAogICBZWURQUklOVEYgKChzdGRlcnIsICJFbnRlcmluZyBzdGF0ZSAlZFxuIiwgeXlzdGF0ZSkpOwogCisgIGlmICh5eXN0YXRlID09IFlZRklOQUwpCisgICAgWVlBQ0NFUFQ7CisKICAgZ290byB5eWJhY2t1cDsKIAogLyotLS0tLS0tLS0tLS4KQEAgLTEzNTcsMTYgKzEzMTQsMTYgQEAKIHl5YmFja3VwOgogCiAgIC8qIERvIGFwcHJvcHJpYXRlIHByb2Nlc3NpbmcgZ2l2ZW4gdGhlIGN1cnJlbnQgc3RhdGUuICBSZWFkIGEKLSAgICAgbG9vay1haGVhZCB0b2tlbiBpZiB3ZSBuZWVkIG9uZSBhbmQgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCisgICAgIGxvb2thaGVhZCB0b2tlbiBpZiB3ZSBuZWVkIG9uZSBhbmQgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCiAKLSAgLyogRmlyc3QgdHJ5IHRvIGRlY2lkZSB3aGF0IHRvIGRvIHdpdGhvdXQgcmVmZXJlbmNlIHRvIGxvb2stYWhlYWQgdG9rZW4uICAqLworICAvKiBGaXJzdCB0cnkgdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aG91dCByZWZlcmVuY2UgdG8gbG9va2FoZWFkIHRva2VuLiAgKi8KICAgeXluID0geXlwYWN0W3l5c3RhdGVdOwogICBpZiAoeXluID09IFlZUEFDVF9OSU5GKQogICAgIGdvdG8geXlkZWZhdWx0OwogCi0gIC8qIE5vdCBrbm93biA9PiBnZXQgYSBsb29rLWFoZWFkIHRva2VuIGlmIGRvbid0IGFscmVhZHkgaGF2ZSBvbmUuICAqLworICAvKiBOb3Qga25vd24gPT4gZ2V0IGEgbG9va2FoZWFkIHRva2VuIGlmIGRvbid0IGFscmVhZHkgaGF2ZSBvbmUuICAqLwogCi0gIC8qIFlZQ0hBUiBpcyBlaXRoZXIgWVlFTVBUWSBvciBZWUVPRiBvciBhIHZhbGlkIGxvb2stYWhlYWQgc3ltYm9sLiAgKi8KKyAgLyogWVlDSEFSIGlzIGVpdGhlciBZWUVNUFRZIG9yIFlZRU9GIG9yIGEgdmFsaWQgbG9va2FoZWFkIHN5bWJvbC4gICovCiAgIGlmICh5eWNoYXIgPT0gWVlFTVBUWSkKICAgICB7CiAgICAgICBZWURQUklOVEYgKChzdGRlcnIsICJSZWFkaW5nIGEgdG9rZW46ICIpKTsKQEAgLTEzOTgsMjQgKzEzNTUsMjAgQEAKICAgICAgIGdvdG8geXlyZWR1Y2U7CiAgICAgfQogCi0gIGlmICh5eW4gPT0gWVlGSU5BTCkKLSAgICBZWUFDQ0VQVDsKLQogICAvKiBDb3VudCB0b2tlbnMgc2hpZnRlZCBzaW5jZSBlcnJvcjsgYWZ0ZXIgdGhyZWUsIHR1cm4gb2ZmIGVycm9yCiAgICAgIHN0YXR1cy4gICovCiAgIGlmICh5eWVycnN0YXR1cykKICAgICB5eWVycnN0YXR1cy0tOwogCi0gIC8qIFNoaWZ0IHRoZSBsb29rLWFoZWFkIHRva2VuLiAgKi8KKyAgLyogU2hpZnQgdGhlIGxvb2thaGVhZCB0b2tlbi4gICovCiAgIFlZX1NZTUJPTF9QUklOVCAoIlNoaWZ0aW5nIiwgeXl0b2tlbiwgJnl5bHZhbCwgJnl5bGxvYyk7CiAKLSAgLyogRGlzY2FyZCB0aGUgc2hpZnRlZCB0b2tlbiB1bmxlc3MgaXQgaXMgZW9mLiAgKi8KLSAgaWYgKHl5Y2hhciAhPSBZWUVPRikKLSAgICB5eWNoYXIgPSBZWUVNUFRZOworICAvKiBEaXNjYXJkIHRoZSBzaGlmdGVkIHRva2VuLiAgKi8KKyAgeXljaGFyID0gWVlFTVBUWTsKIAogICB5eXN0YXRlID0geXluOwogICAqKyt5eXZzcCA9IHl5bHZhbDsKLSAgKisreXlsc3AgPSB5eWxsb2M7CisKICAgZ290byB5eW5ld3N0YXRlOwogCiAKQEAgLTE0NDYsMzM3ICsxMzk5LDM4NyBAQAogICAgICBHQ0Mgd2FybmluZyB0aGF0IFlZVkFMIG1heSBiZSB1c2VkIHVuaW5pdGlhbGl6ZWQuICAqLwogICB5eXZhbCA9IHl5dnNwWzEteXlsZW5dOwogCi0gIC8qIERlZmF1bHQgbG9jYXRpb24uICAqLwotICBZWUxMT0NfREVGQVVMVCAoeXlsb2MsICh5eWxzcCAtIHl5bGVuKSwgeXlsZW4pOworCiAgIFlZX1JFRFVDRV9QUklOVCAoeXluKTsKICAgc3dpdGNoICh5eW4pCiAgICAgewogICAgICAgICBjYXNlIDI6Ci0jbGluZSA5MCAiZHRjLXBhcnNlci55IgorCisvKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLworI2xpbmUgODcgImR0Yy1wYXJzZXIueSIKICAgICB7Ci0JCQl0aGVfYm9vdF9pbmZvID0gYnVpbGRfYm9vdF9pbmZvKCh5eXZzcFsoMykgLSAoNCldLnJlKSwgKHl5dnNwWyg0KSAtICg0KV0ubm9kZSksIDApOworCQkJdGhlX2Jvb3RfaW5mbyA9IGJ1aWxkX2Jvb3RfaW5mbygoeXl2c3BbKDMpIC0gKDQpXS5yZSksICh5eXZzcFsoNCkgLSAoNCldLm5vZGUpLAorCQkJCQkJCWd1ZXNzX2Jvb3RfY3B1aWQoKHl5dnNwWyg0KSAtICg0KV0ubm9kZSkpKTsKIAkJO30KICAgICBicmVhazsKIAogICBjYXNlIDM6Ci0jbGluZSA5NCAiZHRjLXBhcnNlci55IgorCisvKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLworI2xpbmUgOTUgImR0Yy1wYXJzZXIueSIKICAgICB7Ci0JCQl0aGVfYm9vdF9pbmZvID0gYnVpbGRfYm9vdF9pbmZvKCh5eXZzcFsoMSkgLSAoMildLnJlKSwgKHl5dnNwWygyKSAtICgyKV0ubm9kZSksIDApOworCQkJKHl5dmFsLnJlKSA9IE5VTEw7CiAJCTt9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA0OgotI2xpbmUgMTAxICJkdGMtcGFyc2VyLnkiCisKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSA5OSAiZHRjLXBhcnNlci55IgogICAgIHsKLQkJCSh5eXZhbC5yZSkgPSBOVUxMOworCQkJKHl5dmFsLnJlKSA9IGNoYWluX3Jlc2VydmVfZW50cnkoKHl5dnNwWygxKSAtICgyKV0ucmUpLCAoeXl2c3BbKDIpIC0gKDIpXS5yZSkpOwogCQk7fQogICAgIGJyZWFrOwogCiAgIGNhc2UgNToKLSNsaW5lIDEwNSAiZHRjLXBhcnNlci55IgorCisvKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLworI2xpbmUgMTA2ICJkdGMtcGFyc2VyLnkiCiAgICAgewotCQkJKHl5dmFsLnJlKSA9IGNoYWluX3Jlc2VydmVfZW50cnkoKHl5dnNwWygxKSAtICgyKV0ucmUpLCAoeXl2c3BbKDIpIC0gKDIpXS5yZSkpOworCQkJKHl5dmFsLnJlKSA9IGJ1aWxkX3Jlc2VydmVfZW50cnkoKHl5dnNwWygyKSAtICg0KV0uYWRkciksICh5eXZzcFsoMykgLSAoNCldLmFkZHIpKTsKIAkJO30KICAgICBicmVhazsKIAogICBjYXNlIDY6Ci0jbGluZSAxMTIgImR0Yy1wYXJzZXIueSIKKworLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDExMCAiZHRjLXBhcnNlci55IgogICAgIHsKLQkJCSh5eXZhbC5yZSkgPSBidWlsZF9yZXNlcnZlX2VudHJ5KCh5eXZzcFsoMykgLSAoNSldLmFkZHIpLCAoeXl2c3BbKDQpIC0gKDUpXS5hZGRyKSwgKHl5dnNwWygxKSAtICg1KV0ubGFiZWxyZWYpKTsKKwkJCWFkZF9sYWJlbCgmKHl5dnNwWygyKSAtICgyKV0ucmUpLT5sYWJlbHMsICh5eXZzcFsoMSkgLSAoMildLmxhYmVscmVmKSk7CisJCQkoeXl2YWwucmUpID0gKHl5dnNwWygyKSAtICgyKV0ucmUpOwogCQk7fQogICAgIGJyZWFrOwogCiAgIGNhc2UgNzoKLSNsaW5lIDExOSAiZHRjLXBhcnNlci55IgotICAgIHsKLQkJCSh5eXZhbC5yZSkgPSBOVUxMOwotCQk7fQotICAgIGJyZWFrOwogCi0gIGNhc2UgODoKLSNsaW5lIDEyMyAiZHRjLXBhcnNlci55IgotICAgIHsKLQkJCSh5eXZhbC5yZSkgPSBjaGFpbl9yZXNlcnZlX2VudHJ5KCh5eXZzcFsoMSkgLSAoMildLnJlKSwgKHl5dnNwWygyKSAtICgyKV0ucmUpKTsKLQkJO30KLSAgICBicmVhazsKLQotICBjYXNlIDk6Ci0jbGluZSAxMzAgImR0Yy1wYXJzZXIueSIKLSAgICB7Ci0JCQkoeXl2YWwucmUpID0gKHl5dnNwWygxKSAtICgxKV0ucmUpOwotCQk7fQotICAgIGJyZWFrOwotCi0gIGNhc2UgMTA6Ci0jbGluZSAxMzQgImR0Yy1wYXJzZXIueSIKLSAgICB7Ci0JCQkoeXl2YWwucmUpID0gYnVpbGRfcmVzZXJ2ZV9lbnRyeSgoeXl2c3BbKDMpIC0gKDYpXS5hZGRyKSwgKHl5dnNwWyg1KSAtICg2KV0uYWRkcikgLSAoeXl2c3BbKDMpIC0gKDYpXS5hZGRyKSArIDEsICh5eXZzcFsoMSkgLSAoNildLmxhYmVscmVmKSk7Ci0JCTt9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSAxMToKLSNsaW5lIDE0MSAiZHRjLXBhcnNlci55IgorLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDExOCAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5hZGRyKSA9IGV2YWxfbGl0ZXJhbCgoeXl2c3BbKDEpIC0gKDEpXS5saXRlcmFsKSwgMCwgNjQpOwogCQk7fQogICAgIGJyZWFrOwogCi0gIGNhc2UgMTI6Ci0jbGluZSAxNDUgImR0Yy1wYXJzZXIueSIKKyAgY2FzZSA4OgorCisvKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLworI2xpbmUgMTI1ICJkdGMtcGFyc2VyLnkiCiAgICAgewotCQkJKHl5dmFsLmFkZHIpID0gZXZhbF9saXRlcmFsKCh5eXZzcFsoMSkgLSAoMSldLmxpdGVyYWwpLCAxNiwgNjQpOworCQkJKHl5dmFsLm5vZGUpID0gbmFtZV9ub2RlKCh5eXZzcFsoMikgLSAoMildLm5vZGUpLCAiIik7CiAJCTt9CiAgICAgYnJlYWs7CiAKLSAgY2FzZSAxMzoKLSNsaW5lIDE1MiAiZHRjLXBhcnNlci55IgorICBjYXNlIDk6CisKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSAxMjkgImR0Yy1wYXJzZXIueSIKICAgICB7Ci0JCQkoeXl2YWwubm9kZSkgPSBuYW1lX25vZGUoKHl5dnNwWygyKSAtICgyKV0ubm9kZSksICIiLCBOVUxMKTsKKwkJCSh5eXZhbC5ub2RlKSA9IG1lcmdlX25vZGVzKCh5eXZzcFsoMSkgLSAoMyldLm5vZGUpLCAoeXl2c3BbKDMpIC0gKDMpXS5ub2RlKSk7CiAJCTt9CiAgICAgYnJlYWs7CiAKLSAgY2FzZSAxNDoKLSNsaW5lIDE1OSAiZHRjLXBhcnNlci55IgorICBjYXNlIDEwOgorCisvKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLworI2xpbmUgMTMzICJkdGMtcGFyc2VyLnkiCisgICAgeworCQkJc3RydWN0IG5vZGUgKnRhcmdldCA9IGdldF9ub2RlX2J5X3JlZigoeXl2c3BbKDEpIC0gKDMpXS5ub2RlKSwgKHl5dnNwWygyKSAtICgzKV0ubGFiZWxyZWYpKTsKKworCQkJaWYgKHRhcmdldCkKKwkJCQltZXJnZV9ub2Rlcyh0YXJnZXQsICh5eXZzcFsoMykgLSAoMyldLm5vZGUpKTsKKwkJCWVsc2UKKwkJCQlwcmludF9lcnJvcigibGFiZWwgb3IgcGF0aCwgJyVzJywgbm90IGZvdW5kIiwgKHl5dnNwWygyKSAtICgzKV0ubGFiZWxyZWYpKTsKKwkJCSh5eXZhbC5ub2RlKSA9ICh5eXZzcFsoMSkgLSAoMyldLm5vZGUpOworCQk7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTE6CisKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSAxNDYgImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwubm9kZSkgPSBidWlsZF9ub2RlKCh5eXZzcFsoMikgLSAoNSldLnByb3BsaXN0KSwgKHl5dnNwWygzKSAtICg1KV0ubm9kZWxpc3QpKTsKIAkJO30KICAgICBicmVhazsKIAotICBjYXNlIDE1OgotI2xpbmUgMTY2ICJkdGMtcGFyc2VyLnkiCisgIGNhc2UgMTI6CisKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSAxNTMgImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwucHJvcGxpc3QpID0gTlVMTDsKIAkJO30KICAgICBicmVhazsKIAotICBjYXNlIDE2OgotI2xpbmUgMTcwICJkdGMtcGFyc2VyLnkiCisgIGNhc2UgMTM6CisKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSAxNTcgImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwucHJvcGxpc3QpID0gY2hhaW5fcHJvcGVydHkoKHl5dnNwWygyKSAtICgyKV0ucHJvcCksICh5eXZzcFsoMSkgLSAoMildLnByb3BsaXN0KSk7CiAJCTt9CiAgICAgYnJlYWs7CiAKKyAgY2FzZSAxNDoKKworLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE2NCAiZHRjLXBhcnNlci55IgorICAgIHsKKwkJCSh5eXZhbC5wcm9wKSA9IGJ1aWxkX3Byb3BlcnR5KCh5eXZzcFsoMSkgLSAoNCldLnByb3Bub2RlbmFtZSksICh5eXZzcFsoMykgLSAoNCldLmRhdGEpKTsKKwkJO30KKyAgICBicmVhazsKKworICBjYXNlIDE1OgorCisvKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLworI2xpbmUgMTY4ICJkdGMtcGFyc2VyLnkiCisgICAgeworCQkJKHl5dmFsLnByb3ApID0gYnVpbGRfcHJvcGVydHkoKHl5dnNwWygxKSAtICgyKV0ucHJvcG5vZGVuYW1lKSwgZW1wdHlfZGF0YSk7CisJCTt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxNjoKKworLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE3MiAiZHRjLXBhcnNlci55IgorICAgIHsKKwkJCWFkZF9sYWJlbCgmKHl5dnNwWygyKSAtICgyKV0ucHJvcCktPmxhYmVscywgKHl5dnNwWygxKSAtICgyKV0ubGFiZWxyZWYpKTsKKwkJCSh5eXZhbC5wcm9wKSA9ICh5eXZzcFsoMikgLSAoMildLnByb3ApOworCQk7fQorICAgIGJyZWFrOworCiAgIGNhc2UgMTc6Ci0jbGluZSAxNzcgImR0Yy1wYXJzZXIueSIKLSAgICB7Ci0JCQkoeXl2YWwucHJvcCkgPSBidWlsZF9wcm9wZXJ0eSgoeXl2c3BbKDIpIC0gKDUpXS5wcm9wbm9kZW5hbWUpLCAoeXl2c3BbKDQpIC0gKDUpXS5kYXRhKSwgKHl5dnNwWygxKSAtICg1KV0ubGFiZWxyZWYpKTsKLQkJO30KLSAgICBicmVhazsKIAotICBjYXNlIDE4OgotI2xpbmUgMTgxICJkdGMtcGFyc2VyLnkiCi0gICAgewotCQkJKHl5dmFsLnByb3ApID0gYnVpbGRfcHJvcGVydHkoKHl5dnNwWygyKSAtICgzKV0ucHJvcG5vZGVuYW1lKSwgZW1wdHlfZGF0YSwgKHl5dnNwWygxKSAtICgzKV0ubGFiZWxyZWYpKTsKLQkJO30KLSAgICBicmVhazsKLQotICBjYXNlIDE5OgotI2xpbmUgMTg4ICJkdGMtcGFyc2VyLnkiCisvKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLworI2xpbmUgMTgwICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJKHl5dmFsLmRhdGEpID0gZGF0YV9tZXJnZSgoeXl2c3BbKDEpIC0gKDIpXS5kYXRhKSwgKHl5dnNwWygyKSAtICgyKV0uZGF0YSkpOwogCQk7fQogICAgIGJyZWFrOwogCisgIGNhc2UgMTg6CisKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSAxODQgImR0Yy1wYXJzZXIueSIKKyAgICB7CisJCQkoeXl2YWwuZGF0YSkgPSBkYXRhX21lcmdlKCh5eXZzcFsoMSkgLSAoNCldLmRhdGEpLCAoeXl2c3BbKDMpIC0gKDQpXS5kYXRhKSk7CisJCTt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxOToKKworLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE4OCAiZHRjLXBhcnNlci55IgorICAgIHsKKwkJCSh5eXZhbC5kYXRhKSA9IGRhdGFfbWVyZ2UoKHl5dnNwWygxKSAtICg0KV0uZGF0YSksICh5eXZzcFsoMykgLSAoNCldLmRhdGEpKTsKKwkJO30KKyAgICBicmVhazsKKwogICBjYXNlIDIwOgorCisvKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwogI2xpbmUgMTkyICJkdGMtcGFyc2VyLnkiCiAgICAgewotCQkJKHl5dmFsLmRhdGEpID0gZGF0YV9tZXJnZSgoeXl2c3BbKDEpIC0gKDQpXS5kYXRhKSwgKHl5dnNwWygzKSAtICg0KV0uZGF0YSkpOwotCQk7fQotICAgIGJyZWFrOwotCi0gIGNhc2UgMjE6Ci0jbGluZSAxOTYgImR0Yy1wYXJzZXIueSIKLSAgICB7Ci0JCQkoeXl2YWwuZGF0YSkgPSBkYXRhX21lcmdlKCh5eXZzcFsoMSkgLSAoNCldLmRhdGEpLCAoeXl2c3BbKDMpIC0gKDQpXS5kYXRhKSk7Ci0JCTt9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSAyMjoKLSNsaW5lIDIwMCAiZHRjLXBhcnNlci55IgotICAgIHsKIAkJCSh5eXZhbC5kYXRhKSA9IGRhdGFfYWRkX21hcmtlcigoeXl2c3BbKDEpIC0gKDIpXS5kYXRhKSwgUkVGX1BBVEgsICh5eXZzcFsoMikgLSAoMildLmxhYmVscmVmKSk7CiAJCTt9CiAgICAgYnJlYWs7CiAKLSAgY2FzZSAyMzoKLSNsaW5lIDIwNCAiZHRjLXBhcnNlci55IgorICBjYXNlIDIxOgorCisvKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLworI2xpbmUgMTk2ICJkdGMtcGFyc2VyLnkiCiAgICAgewotCQkJc3RydWN0IHNlYXJjaF9wYXRoIHBhdGggPSB7IHNyY3Bvc19maWxlLT5kaXIsIE5VTEwsIE5VTEwgfTsKLQkJCXN0cnVjdCBkdGNfZmlsZSAqZmlsZSA9IGR0Y19vcGVuX2ZpbGUoKHl5dnNwWyg0KSAtICg5KV0uZGF0YSkudmFsLCAmcGF0aCk7Ci0JCQlzdHJ1Y3QgZGF0YSBkID0gZW1wdHlfZGF0YTsKKwkJCUZJTEUgKmYgPSBzcmNmaWxlX3JlbGF0aXZlX29wZW4oKHl5dnNwWyg0KSAtICg5KV0uZGF0YSkudmFsLCBOVUxMKTsKKwkJCXN0cnVjdCBkYXRhIGQ7CiAKIAkJCWlmICgoeXl2c3BbKDYpIC0gKDkpXS5hZGRyKSAhPSAwKQotCQkJCWlmIChmc2VlayhmaWxlLT5maWxlLCAoeXl2c3BbKDYpIC0gKDkpXS5hZGRyKSwgU0VFS19TRVQpICE9IDApCi0JCQkJCXl5ZXJyb3JmKCJDb3VsZG4ndCBzZWVrIHRvIG9mZnNldCAlbGx1IGluIFwiJXNcIjogJXMiLAotCQkJCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpKHl5dnNwWyg2KSAtICg5KV0uYWRkciksCi0JCQkJCQkgKHl5dnNwWyg0KSAtICg5KV0uZGF0YSkudmFsLCBzdHJlcnJvcihlcnJubykpOworCQkJCWlmIChmc2VlayhmLCAoeXl2c3BbKDYpIC0gKDkpXS5hZGRyKSwgU0VFS19TRVQpICE9IDApCisJCQkJCXByaW50X2Vycm9yKCJDb3VsZG4ndCBzZWVrIHRvIG9mZnNldCAlbGx1IGluIFwiJXNcIjogJXMiLAorCQkJCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKSh5eXZzcFsoNikgLSAoOSldLmFkZHIpLAorCQkJCQkJICAgICAoeXl2c3BbKDQpIC0gKDkpXS5kYXRhKS52YWwsCisJCQkJCQkgICAgIHN0cmVycm9yKGVycm5vKSk7CiAKLQkJCWQgPSBkYXRhX2NvcHlfZmlsZShmaWxlLT5maWxlLCAoeXl2c3BbKDgpIC0gKDkpXS5hZGRyKSk7CisJCQlkID0gZGF0YV9jb3B5X2ZpbGUoZiwgKHl5dnNwWyg4KSAtICg5KV0uYWRkcikpOwogCiAJCQkoeXl2YWwuZGF0YSkgPSBkYXRhX21lcmdlKCh5eXZzcFsoMSkgLSAoOSldLmRhdGEpLCBkKTsKLQkJCWR0Y19jbG9zZV9maWxlKGZpbGUpOworCQkJZmNsb3NlKGYpOwogCQk7fQogICAgIGJyZWFrOwogCi0gIGNhc2UgMjQ6Ci0jbGluZSAyMjEgImR0Yy1wYXJzZXIueSIKKyAgY2FzZSAyMjoKKworLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDIxMyAiZHRjLXBhcnNlci55IgogICAgIHsKLQkJCXN0cnVjdCBzZWFyY2hfcGF0aCBwYXRoID0geyBzcmNwb3NfZmlsZS0+ZGlyLCBOVUxMLCBOVUxMIH07Ci0JCQlzdHJ1Y3QgZHRjX2ZpbGUgKmZpbGUgPSBkdGNfb3Blbl9maWxlKCh5eXZzcFsoNCkgLSAoNSldLmRhdGEpLnZhbCwgJnBhdGgpOworCQkJRklMRSAqZiA9IHNyY2ZpbGVfcmVsYXRpdmVfb3BlbigoeXl2c3BbKDQpIC0gKDUpXS5kYXRhKS52YWwsIE5VTEwpOwogCQkJc3RydWN0IGRhdGEgZCA9IGVtcHR5X2RhdGE7CiAKLQkJCWQgPSBkYXRhX2NvcHlfZmlsZShmaWxlLT5maWxlLCAtMSk7CisJCQlkID0gZGF0YV9jb3B5X2ZpbGUoZiwgLTEpOwogCiAJCQkoeXl2YWwuZGF0YSkgPSBkYXRhX21lcmdlKCh5eXZzcFsoMSkgLSAoNSldLmRhdGEpLCBkKTsKLQkJCWR0Y19jbG9zZV9maWxlKGZpbGUpOworCQkJZmNsb3NlKGYpOwogCQk7fQogICAgIGJyZWFrOwogCi0gIGNhc2UgMjU6Ci0jbGluZSAyMzIgImR0Yy1wYXJzZXIueSIKKyAgY2FzZSAyMzoKKworLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDIyMyAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5kYXRhKSA9IGRhdGFfYWRkX21hcmtlcigoeXl2c3BbKDEpIC0gKDIpXS5kYXRhKSwgTEFCRUwsICh5eXZzcFsoMikgLSAoMildLmxhYmVscmVmKSk7CiAJCTt9CiAgICAgYnJlYWs7CiAKLSAgY2FzZSAyNjoKLSNsaW5lIDIzOSAiZHRjLXBhcnNlci55IgorICBjYXNlIDI0OgorCisvKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLworI2xpbmUgMjMwICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJKHl5dmFsLmRhdGEpID0gZW1wdHlfZGF0YTsKIAkJO30KICAgICBicmVhazsKIAotICBjYXNlIDI3OgotI2xpbmUgMjQzICJkdGMtcGFyc2VyLnkiCisgIGNhc2UgMjU6CisKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSAyMzQgImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwuZGF0YSkgPSAoeXl2c3BbKDEpIC0gKDIpXS5kYXRhKTsKIAkJO30KICAgICBicmVhazsKIAotICBjYXNlIDI4OgotI2xpbmUgMjQ3ICJkdGMtcGFyc2VyLnkiCisgIGNhc2UgMjY6CisKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSAyMzggImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwuZGF0YSkgPSBkYXRhX2FkZF9tYXJrZXIoKHl5dnNwWygxKSAtICgyKV0uZGF0YSksIExBQkVMLCAoeXl2c3BbKDIpIC0gKDIpXS5sYWJlbHJlZikpOwogCQk7fQogICAgIGJyZWFrOwogCi0gIGNhc2UgMjk6Ci0jbGluZSAyNTQgImR0Yy1wYXJzZXIueSIKKyAgY2FzZSAyNzoKKworLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDI0NSAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5kYXRhKSA9IGVtcHR5X2RhdGE7CiAJCTt9CiAgICAgYnJlYWs7CiAKLSAgY2FzZSAzMDoKLSNsaW5lIDI1OCAiZHRjLXBhcnNlci55IgorICBjYXNlIDI4OgorCisvKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLworI2xpbmUgMjQ5ICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJKHl5dmFsLmRhdGEpID0gZGF0YV9hcHBlbmRfY2VsbCgoeXl2c3BbKDEpIC0gKDIpXS5kYXRhKSwgKHl5dnNwWygyKSAtICgyKV0uY2VsbCkpOwogCQk7fQogICAgIGJyZWFrOwogCi0gIGNhc2UgMzE6Ci0jbGluZSAyNjIgImR0Yy1wYXJzZXIueSIKKyAgY2FzZSAyOToKKworLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDI1MyAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5kYXRhKSA9IGRhdGFfYXBwZW5kX2NlbGwoZGF0YV9hZGRfbWFya2VyKCh5eXZzcFsoMSkgLSAoMildLmRhdGEpLCBSRUZfUEhBTkRMRSwKIAkJCQkJCQkgICAgICAoeXl2c3BbKDIpIC0gKDIpXS5sYWJlbHJlZikpLCAtMSk7CiAJCTt9CiAgICAgYnJlYWs7CiAKLSAgY2FzZSAzMjoKLSNsaW5lIDI2NyAiZHRjLXBhcnNlci55IgorICBjYXNlIDMwOgorCisvKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLworI2xpbmUgMjU4ICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJKHl5dmFsLmRhdGEpID0gZGF0YV9hZGRfbWFya2VyKCh5eXZzcFsoMSkgLSAoMildLmRhdGEpLCBMQUJFTCwgKHl5dnNwWygyKSAtICgyKV0ubGFiZWxyZWYpKTsKIAkJO30KICAgICBicmVhazsKIAotICBjYXNlIDMzOgotI2xpbmUgMjc0ICJkdGMtcGFyc2VyLnkiCi0gICAgewotCQkJKHl5dmFsLmNiYXNlKSA9IDE2OwotCQk7fQotICAgIGJyZWFrOworICBjYXNlIDMxOgogCi0gIGNhc2UgMzU6Ci0jbGluZSAyODIgImR0Yy1wYXJzZXIueSIKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSAyNjUgImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwuY2VsbCkgPSBldmFsX2xpdGVyYWwoKHl5dnNwWygxKSAtICgxKV0ubGl0ZXJhbCksIDAsIDMyKTsKIAkJO30KICAgICBicmVhazsKIAotICBjYXNlIDM2OgotI2xpbmUgMjg2ICJkdGMtcGFyc2VyLnkiCi0gICAgewotCQkJKHl5dmFsLmNlbGwpID0gZXZhbF9saXRlcmFsKCh5eXZzcFsoMikgLSAoMildLmxpdGVyYWwpLCAoeXl2c3BbKDEpIC0gKDIpXS5jYmFzZSksIDMyKTsKLQkJO30KLSAgICBicmVhazsKKyAgY2FzZSAzMjoKIAotICBjYXNlIDM3OgotI2xpbmUgMjkzICJkdGMtcGFyc2VyLnkiCisvKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLworI2xpbmUgMjcyICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJKHl5dmFsLmRhdGEpID0gZW1wdHlfZGF0YTsKIAkJO30KICAgICBicmVhazsKIAotICBjYXNlIDM4OgotI2xpbmUgMjk3ICJkdGMtcGFyc2VyLnkiCisgIGNhc2UgMzM6CisKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSAyNzYgImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwuZGF0YSkgPSBkYXRhX2FwcGVuZF9ieXRlKCh5eXZzcFsoMSkgLSAoMildLmRhdGEpLCAoeXl2c3BbKDIpIC0gKDIpXS5ieXRlKSk7CiAJCTt9CiAgICAgYnJlYWs7CiAKLSAgY2FzZSAzOToKLSNsaW5lIDMwMSAiZHRjLXBhcnNlci55IgorICBjYXNlIDM0OgorCisvKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLworI2xpbmUgMjgwICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJKHl5dmFsLmRhdGEpID0gZGF0YV9hZGRfbWFya2VyKCh5eXZzcFsoMSkgLSAoMildLmRhdGEpLCBMQUJFTCwgKHl5dnNwWygyKSAtICgyKV0ubGFiZWxyZWYpKTsKIAkJO30KICAgICBicmVhazsKIAotICBjYXNlIDQwOgotI2xpbmUgMzA4ICJkdGMtcGFyc2VyLnkiCisgIGNhc2UgMzU6CisKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSAyODcgImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwubm9kZWxpc3QpID0gTlVMTDsKIAkJO30KICAgICBicmVhazsKIAotICBjYXNlIDQxOgotI2xpbmUgMzEyICJkdGMtcGFyc2VyLnkiCisgIGNhc2UgMzY6CisKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSAyOTEgImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwubm9kZWxpc3QpID0gY2hhaW5fbm9kZSgoeXl2c3BbKDEpIC0gKDIpXS5ub2RlKSwgKHl5dnNwWygyKSAtICgyKV0ubm9kZWxpc3QpKTsKIAkJO30KICAgICBicmVhazsKIAotICBjYXNlIDQyOgotI2xpbmUgMzE2ICJkdGMtcGFyc2VyLnkiCisgIGNhc2UgMzc6CisKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSAyOTUgImR0Yy1wYXJzZXIueSIKICAgICB7Ci0JCQl5eWVycm9yKCJzeW50YXggZXJyb3I6IHByb3BlcnRpZXMgbXVzdCBwcmVjZWRlIHN1Ym5vZGVzIik7CisJCQlwcmludF9lcnJvcigic3ludGF4IGVycm9yOiBwcm9wZXJ0aWVzIG11c3QgcHJlY2VkZSBzdWJub2RlcyIpOwogCQkJWVlFUlJPUjsKIAkJO30KICAgICBicmVhazsKIAotICBjYXNlIDQzOgotI2xpbmUgMzI0ICJkdGMtcGFyc2VyLnkiCisgIGNhc2UgMzg6CisKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSAzMDMgImR0Yy1wYXJzZXIueSIKICAgICB7Ci0JCQkoeXl2YWwubm9kZSkgPSBuYW1lX25vZGUoKHl5dnNwWygzKSAtICgzKV0ubm9kZSksICh5eXZzcFsoMikgLSAoMyldLnByb3Bub2RlbmFtZSksICh5eXZzcFsoMSkgLSAoMyldLmxhYmVscmVmKSk7CisJCQkoeXl2YWwubm9kZSkgPSBuYW1lX25vZGUoKHl5dnNwWygyKSAtICgyKV0ubm9kZSksICh5eXZzcFsoMSkgLSAoMildLnByb3Bub2RlbmFtZSkpOwogCQk7fQogICAgIGJyZWFrOwogCi0gIGNhc2UgNDQ6Ci0jbGluZSAzMzEgImR0Yy1wYXJzZXIueSIKLSAgICB7Ci0JCQkoeXl2YWwubGFiZWxyZWYpID0gTlVMTDsKLQkJO30KLSAgICBicmVhazsKKyAgY2FzZSAzOToKIAotICBjYXNlIDQ1OgotI2xpbmUgMzM1ICJkdGMtcGFyc2VyLnkiCisvKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLworI2xpbmUgMzA3ICJkdGMtcGFyc2VyLnkiCiAgICAgewotCQkJKHl5dmFsLmxhYmVscmVmKSA9ICh5eXZzcFsoMSkgLSAoMSldLmxhYmVscmVmKTsKKwkJCWFkZF9sYWJlbCgmKHl5dnNwWygyKSAtICgyKV0ubm9kZSktPmxhYmVscywgKHl5dnNwWygxKSAtICgyKV0ubGFiZWxyZWYpKTsKKwkJCSh5eXZhbC5ub2RlKSA9ICh5eXZzcFsoMikgLSAoMildLm5vZGUpOwogCQk7fQogICAgIGJyZWFrOwogCiAKLS8qIExpbmUgMTI2NyBvZiB5YWNjLmMuICAqLwotI2xpbmUgMTc4MCAiZHRjLXBhcnNlci50YWIuYyIKKworLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE3ODMgImR0Yy1wYXJzZXIudGFiLmMiCiAgICAgICBkZWZhdWx0OiBicmVhazsKICAgICB9CiAgIFlZX1NZTUJPTF9QUklOVCAoIi0+ICQkID0iLCB5eXIxW3l5bl0sICZ5eXZhbCwgJnl5bG9jKTsKQEAgLTE3ODYsNyArMTc4OSw2IEBACiAgIFlZX1NUQUNLX1BSSU5UICh5eXNzLCB5eXNzcCk7CiAKICAgKisreXl2c3AgPSB5eXZhbDsKLSAgKisreXlsc3AgPSB5eWxvYzsKIAogICAvKiBOb3cgYHNoaWZ0JyB0aGUgcmVzdWx0IG9mIHRoZSByZWR1Y3Rpb24uICBEZXRlcm1pbmUgd2hhdCBzdGF0ZQogICAgICB0aGF0IGdvZXMgdG8sIGJhc2VkIG9uIHRoZSBzdGF0ZSB3ZSBwb3BwZWQgYmFjayB0byBhbmQgdGhlIHJ1bGUKQEAgLTE4NDgsMTEgKzE4NTAsMTEgQEAKICNlbmRpZgogICAgIH0KIAotICB5eWVycm9yX3JhbmdlWzBdID0geXlsbG9jOworCiAKICAgaWYgKHl5ZXJyc3RhdHVzID09IDMpCiAgICAgewotICAgICAgLyogSWYganVzdCB0cmllZCBhbmQgZmFpbGVkIHRvIHJldXNlIGxvb2stYWhlYWQgdG9rZW4gYWZ0ZXIgYW4KKyAgICAgIC8qIElmIGp1c3QgdHJpZWQgYW5kIGZhaWxlZCB0byByZXVzZSBsb29rYWhlYWQgdG9rZW4gYWZ0ZXIgYW4KIAkgZXJyb3IsIGRpc2NhcmQgaXQuICAqLwogCiAgICAgICBpZiAoeXljaGFyIDw9IFlZRU9GKQpAQCAtMTg2NCwxMiArMTg2NiwxMiBAQAogICAgICAgZWxzZQogCXsKIAkgIHl5ZGVzdHJ1Y3QgKCJFcnJvcjogZGlzY2FyZGluZyIsCi0JCSAgICAgIHl5dG9rZW4sICZ5eWx2YWwsICZ5eWxsb2MpOworCQkgICAgICB5eXRva2VuLCAmeXlsdmFsKTsKIAkgIHl5Y2hhciA9IFlZRU1QVFk7CiAJfQogICAgIH0KIAotICAvKiBFbHNlIHdpbGwgdHJ5IHRvIHJldXNlIGxvb2stYWhlYWQgdG9rZW4gYWZ0ZXIgc2hpZnRpbmcgdGhlIGVycm9yCisgIC8qIEVsc2Ugd2lsbCB0cnkgdG8gcmV1c2UgbG9va2FoZWFkIHRva2VuIGFmdGVyIHNoaWZ0aW5nIHRoZSBlcnJvcgogICAgICB0b2tlbi4gICovCiAgIGdvdG8geXllcnJsYWIxOwogCkBAIC0xODg1LDcgKzE4ODcsNiBAQAogICBpZiAoLypDT05TVENPTkQqLyAwKQogICAgICBnb3RvIHl5ZXJyb3JsYWI7CiAKLSAgeXllcnJvcl9yYW5nZVswXSA9IHl5bHNwWzEteXlsZW5dOwogICAvKiBEbyBub3QgcmVjbGFpbSB0aGUgc3ltYm9scyBvZiB0aGUgcnVsZSB3aGljaCBhY3Rpb24gdHJpZ2dlcmVkCiAgICAgIHRoaXMgWVlFUlJPUi4gICovCiAgIFlZUE9QU1RBQ0sgKHl5bGVuKTsKQEAgLTE5MTksMjQgKzE5MjAsMTYgQEAKICAgICAgIGlmICh5eXNzcCA9PSB5eXNzKQogCVlZQUJPUlQ7CiAKLSAgICAgIHl5ZXJyb3JfcmFuZ2VbMF0gPSAqeXlsc3A7CisKICAgICAgIHl5ZGVzdHJ1Y3QgKCJFcnJvcjogcG9wcGluZyIsCi0JCSAgeXlzdG9zW3l5c3RhdGVdLCB5eXZzcCwgeXlsc3ApOworCQkgIHl5c3Rvc1t5eXN0YXRlXSwgeXl2c3ApOwogICAgICAgWVlQT1BTVEFDSyAoMSk7CiAgICAgICB5eXN0YXRlID0gKnl5c3NwOwogICAgICAgWVlfU1RBQ0tfUFJJTlQgKHl5c3MsIHl5c3NwKTsKICAgICB9CiAKLSAgaWYgKHl5biA9PSBZWUZJTkFMKQotICAgIFlZQUNDRVBUOwotCiAgICorK3l5dnNwID0geXlsdmFsOwogCi0gIHl5ZXJyb3JfcmFuZ2VbMV0gPSB5eWxsb2M7Ci0gIC8qIFVzaW5nIFlZTExPQyBpcyB0ZW1wdGluZywgYnV0IHdvdWxkIGNoYW5nZSB0aGUgbG9jYXRpb24gb2YKLSAgICAgdGhlIGxvb2stYWhlYWQuICBZWUxPQyBpcyBhdmFpbGFibGUgdGhvdWdoLiAgKi8KLSAgWVlMTE9DX0RFRkFVTFQgKHl5bG9jLCAoeXllcnJvcl9yYW5nZSAtIDEpLCAyKTsKLSAgKisreXlsc3AgPSB5eWxvYzsKIAogICAvKiBTaGlmdCB0aGUgZXJyb3IgdG9rZW4uICAqLwogICBZWV9TWU1CT0xfUFJJTlQgKCJTaGlmdGluZyIsIHl5c3Rvc1t5eW5dLCB5eXZzcCwgeXlsc3ApOwpAQCAtMTk1OSw3ICsxOTUyLDcgQEAKICAgeXlyZXN1bHQgPSAxOwogICBnb3RvIHl5cmV0dXJuOwogCi0jaWZuZGVmIHl5b3ZlcmZsb3cKKyNpZiAhZGVmaW5lZCh5eW92ZXJmbG93KSB8fCBZWUVSUk9SX1ZFUkJPU0UKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KIHwgeXlleGhhdXN0ZWRsYWIgLS0gbWVtb3J5IGV4aGF1c3Rpb24gY29tZXMgaGVyZS4gIHwKIGAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTE5NzAsOSArMTk2Myw5IEBACiAjZW5kaWYKIAogeXlyZXR1cm46Ci0gIGlmICh5eWNoYXIgIT0gWVlFT0YgJiYgeXljaGFyICE9IFlZRU1QVFkpCisgIGlmICh5eWNoYXIgIT0gWVlFTVBUWSkKICAgICAgeXlkZXN0cnVjdCAoIkNsZWFudXA6IGRpc2NhcmRpbmcgbG9va2FoZWFkIiwKLQkJIHl5dG9rZW4sICZ5eWx2YWwsICZ5eWxsb2MpOworCQkgeXl0b2tlbiwgJnl5bHZhbCk7CiAgIC8qIERvIG5vdCByZWNsYWltIHRoZSBzeW1ib2xzIG9mIHRoZSBydWxlIHdoaWNoIGFjdGlvbiB0cmlnZ2VyZWQKICAgICAgdGhpcyBZWUFCT1JUIG9yIFlZQUNDRVBULiAgKi8KICAgWVlQT1BTVEFDSyAoeXlsZW4pOwpAQCAtMTk4MCw3ICsxOTczLDcgQEAKICAgd2hpbGUgKHl5c3NwICE9IHl5c3MpCiAgICAgewogICAgICAgeXlkZXN0cnVjdCAoIkNsZWFudXA6IHBvcHBpbmciLAotCQkgIHl5c3Rvc1sqeXlzc3BdLCB5eXZzcCwgeXlsc3ApOworCQkgIHl5c3Rvc1sqeXlzc3BdLCB5eXZzcCk7CiAgICAgICBZWVBPUFNUQUNLICgxKTsKICAgICB9CiAjaWZuZGVmIHl5b3ZlcmZsb3cKQEAgLTE5OTYsMjkgKzE5ODksMjQgQEAKIH0KIAogCi0jbGluZSAzNDAgImR0Yy1wYXJzZXIueSIKKworLyogTGluZSAxNjc1IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDMxMyAiZHRjLXBhcnNlci55IgogCiAKLXZvaWQgeXllcnJvcmYoY2hhciBjb25zdCAqcywgLi4uKQordm9pZCBwcmludF9lcnJvcihjaGFyIGNvbnN0ICpmbXQsIC4uLikKIHsKLQljb25zdCBjaGFyICpmbmFtZSA9IHNyY3Bvc19maWxlID8gc3JjcG9zX2ZpbGUtPm5hbWUgOiAiPG5vLWZpbGU+IjsKIAl2YV9saXN0IHZhOwotCXZhX3N0YXJ0KHZhLCBzKTsKIAotCWlmIChzdHJjbXAoZm5hbWUsICItIikgPT0gMCkKLQkJZm5hbWUgPSAic3RkaW4iOwotCi0JZnByaW50ZihzdGRlcnIsICIlczolZCAiLCBmbmFtZSwgeXlsbG9jLmZpcnN0X2xpbmUpOwotCXZmcHJpbnRmKHN0ZGVyciwgcywgdmEpOwotCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKwl2YV9zdGFydCh2YSwgZm10KTsKKwlzcmNwb3NfdmVycm9yKCZ5eWxsb2MsIGZtdCwgdmEpOworCXZhX2VuZCh2YSk7CiAKIAl0cmVlc291cmNlX2Vycm9yID0gMTsKLQl2YV9lbmQodmEpOwogfQogCi12b2lkIHl5ZXJyb3IgKGNoYXIgY29uc3QgKnMpCi17Ci0JeXllcnJvcmYoIiVzIiwgcyk7Cit2b2lkIHl5ZXJyb3IoY2hhciBjb25zdCAqcykgeworCXByaW50X2Vycm9yKCIlcyIsIHMpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIGV2YWxfbGl0ZXJhbChjb25zdCBjaGFyICpzLCBpbnQgYmFzZSwgaW50IGJpdHMpCkBAIC0yMDI5LDEyICsyMDE3LDEyIEBACiAJZXJybm8gPSAwOwogCXZhbCA9IHN0cnRvdWxsKHMsICZlLCBiYXNlKTsKIAlpZiAoKmUpCi0JCXl5ZXJyb3IoImJhZCBjaGFyYWN0ZXJzIGluIGxpdGVyYWwiKTsKKwkJcHJpbnRfZXJyb3IoImJhZCBjaGFyYWN0ZXJzIGluIGxpdGVyYWwiKTsKIAllbHNlIGlmICgoZXJybm8gPT0gRVJBTkdFKQogCQkgfHwgKChiaXRzIDwgNjQpICYmICh2YWwgPj0gKDFVTEwgPDwgYml0cykpKSkKLQkJeXllcnJvcigibGl0ZXJhbCBvdXQgb2YgcmFuZ2UiKTsKKwkJcHJpbnRfZXJyb3IoImxpdGVyYWwgb3V0IG9mIHJhbmdlIik7CiAJZWxzZSBpZiAoZXJybm8gIT0gMCkKLQkJeXllcnJvcigiYmFkIGxpdGVyYWwiKTsKKwkJcHJpbnRfZXJyb3IoImJhZCBsaXRlcmFsIik7CiAJcmV0dXJuIHZhbDsKIH0KIApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9kdGMvZHRjLXBhcnNlci50YWIuaF9zaGlwcGVkIGIvc2NyaXB0cy9kdGMvZHRjLXBhcnNlci50YWIuaF9zaGlwcGVkCmluZGV4IGJhOTkxMDAuLjk1Yzk1NDcgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvZHRjL2R0Yy1wYXJzZXIudGFiLmhfc2hpcHBlZAorKysgYi9zY3JpcHRzL2R0Yy9kdGMtcGFyc2VyLnRhYi5oX3NoaXBwZWQKQEAgLTEsMjQgKzEsMjMgQEAKLS8qIEEgQmlzb24gcGFyc2VyLCBtYWRlIGJ5IEdOVSBCaXNvbiAyLjMuICAqLworCisvKiBBIEJpc29uIHBhcnNlciwgbWFkZSBieSBHTlUgQmlzb24gMi40LjEuICAqLwogCiAvKiBTa2VsZXRvbiBpbnRlcmZhY2UgZm9yIEJpc29uJ3MgWWFjYy1saWtlIHBhcnNlcnMgaW4gQwotCi0gICBDb3B5cmlnaHQgKEMpIDE5ODQsIDE5ODksIDE5OTAsIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYKKyAgIAorICAgICAgQ29weXJpZ2h0IChDKSAxOTg0LCAxOTg5LCAxOTkwLCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2CiAgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIAorICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgICAKICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KKyAgIAogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAotICAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuICAqLworICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwogCiAvKiBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB5b3UgbWF5IGNyZWF0ZSBhIGxhcmdlciB3b3JrIHRoYXQgY29udGFpbnMKICAgIHBhcnQgb3IgYWxsIG9mIHRoZSBCaXNvbiBwYXJzZXIgc2tlbGV0b24gYW5kIGRpc3RyaWJ1dGUgdGhhdCB3b3JrCkBAIC0yOSwxMCArMjgsMTEgQEAKICAgIHNwZWNpYWwgZXhjZXB0aW9uLCB3aGljaCB3aWxsIGNhdXNlIHRoZSBza2VsZXRvbiBhbmQgdGhlIHJlc3VsdGluZwogICAgQmlzb24gb3V0cHV0IGZpbGVzIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICAgIExpY2Vuc2Ugd2l0aG91dCB0aGlzIHNwZWNpYWwgZXhjZXB0aW9uLgotCisgICAKICAgIFRoaXMgc3BlY2lhbCBleGNlcHRpb24gd2FzIGFkZGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gaW4KICAgIHZlcnNpb24gMi4yIG9mIEJpc29uLiAgKi8KIAorCiAvKiBUb2tlbnMuICAqLwogI2lmbmRlZiBZWVRPS0VOVFlQRQogIyBkZWZpbmUgWVlUT0tFTlRZUEUKQEAgLTQzLDM1ICs0MywyNCBAQAogICAgICBEVF9NRU1SRVNFUlZFID0gMjU5LAogICAgICBEVF9QUk9QTk9ERU5BTUUgPSAyNjAsCiAgICAgIERUX0xJVEVSQUwgPSAyNjEsCi0gICAgIERUX0xFR0FDWUxJVEVSQUwgPSAyNjIsCi0gICAgIERUX0JBU0UgPSAyNjMsCi0gICAgIERUX0JZVEUgPSAyNjQsCi0gICAgIERUX1NUUklORyA9IDI2NSwKLSAgICAgRFRfTEFCRUwgPSAyNjYsCi0gICAgIERUX1JFRiA9IDI2NywKLSAgICAgRFRfSU5DQklOID0gMjY4CisgICAgIERUX0JBU0UgPSAyNjIsCisgICAgIERUX0JZVEUgPSAyNjMsCisgICAgIERUX1NUUklORyA9IDI2NCwKKyAgICAgRFRfTEFCRUwgPSAyNjUsCisgICAgIERUX1JFRiA9IDI2NiwKKyAgICAgRFRfSU5DQklOID0gMjY3CiAgICB9OwogI2VuZGlmCi0vKiBUb2tlbnMuICAqLwotI2RlZmluZSBEVF9WMSAyNTgKLSNkZWZpbmUgRFRfTUVNUkVTRVJWRSAyNTkKLSNkZWZpbmUgRFRfUFJPUE5PREVOQU1FIDI2MAotI2RlZmluZSBEVF9MSVRFUkFMIDI2MQotI2RlZmluZSBEVF9MRUdBQ1lMSVRFUkFMIDI2MgotI2RlZmluZSBEVF9CQVNFIDI2MwotI2RlZmluZSBEVF9CWVRFIDI2NAotI2RlZmluZSBEVF9TVFJJTkcgMjY1Ci0jZGVmaW5lIERUX0xBQkVMIDI2NgotI2RlZmluZSBEVF9SRUYgMjY3Ci0jZGVmaW5lIERUX0lOQ0JJTiAyNjgKLQogCiAKIAogI2lmICEgZGVmaW5lZCBZWVNUWVBFICYmICEgZGVmaW5lZCBZWVNUWVBFX0lTX0RFQ0xBUkVECiB0eXBlZGVmIHVuaW9uIFlZU1RZUEUKLSNsaW5lIDM3ICJkdGMtcGFyc2VyLnkiCiB7CisKKy8qIExpbmUgMTY3NiBvZiB5YWNjLmMgICovCisjbGluZSAzOSAiZHRjLXBhcnNlci55IgorCiAJY2hhciAqcHJvcG5vZGVuYW1lOwogCWNoYXIgKmxpdGVyYWw7CiAJY2hhciAqbGFiZWxyZWY7CkBAIC04NiwyOCArNzUsMTcgQEAKIAlzdHJ1Y3Qgbm9kZSAqbm9kZTsKIAlzdHJ1Y3Qgbm9kZSAqbm9kZWxpc3Q7CiAJc3RydWN0IHJlc2VydmVfaW5mbyAqcmU7Ci19Ci0vKiBMaW5lIDE0ODkgb2YgeWFjYy5jLiAgKi8KLSNsaW5lIDkyICJkdGMtcGFyc2VyLnRhYi5oIgotCVlZU1RZUEU7CisKKworCisvKiBMaW5lIDE2NzYgb2YgeWFjYy5jICAqLworI2xpbmUgODMgImR0Yy1wYXJzZXIudGFiLmgiCit9IFlZU1RZUEU7CisjIGRlZmluZSBZWVNUWVBFX0lTX1RSSVZJQUwgMQogIyBkZWZpbmUgeXlzdHlwZSBZWVNUWVBFIC8qIG9ic29sZXNjZW50OyB3aWxsIGJlIHdpdGhkcmF3biAqLwogIyBkZWZpbmUgWVlTVFlQRV9JU19ERUNMQVJFRCAxCi0jIGRlZmluZSBZWVNUWVBFX0lTX1RSSVZJQUwgMQogI2VuZGlmCiAKIGV4dGVybiBZWVNUWVBFIHl5bHZhbDsKIAotI2lmICEgZGVmaW5lZCBZWUxUWVBFICYmICEgZGVmaW5lZCBZWUxUWVBFX0lTX0RFQ0xBUkVECi10eXBlZGVmIHN0cnVjdCBZWUxUWVBFCi17Ci0gIGludCBmaXJzdF9saW5lOwotICBpbnQgZmlyc3RfY29sdW1uOwotICBpbnQgbGFzdF9saW5lOwotICBpbnQgbGFzdF9jb2x1bW47Ci19IFlZTFRZUEU7Ci0jIGRlZmluZSB5eWx0eXBlIFlZTFRZUEUgLyogb2Jzb2xlc2NlbnQ7IHdpbGwgYmUgd2l0aGRyYXduICovCi0jIGRlZmluZSBZWUxUWVBFX0lTX0RFQ0xBUkVEIDEKLSMgZGVmaW5lIFlZTFRZUEVfSVNfVFJJVklBTCAxCi0jZW5kaWYKIAotZXh0ZXJuIFlZTFRZUEUgeXlsbG9jOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9kdGMvZHRjLXBhcnNlci55IGIvc2NyaXB0cy9kdGMvZHRjLXBhcnNlci55CmluZGV4IGIyYWI1NjIuLjVlODRhNjcgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvZHRjL2R0Yy1wYXJzZXIueQorKysgYi9zY3JpcHRzL2R0Yy9kdGMtcGFyc2VyLnkKQEAgLTE4LDE1ICsxOCwxNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNBCiAgKi8KIAotJWxvY2F0aW9ucwotCiAlewogI2luY2x1ZGUgPHN0ZGlvLmg+CiAKICNpbmNsdWRlICJkdGMuaCIKICNpbmNsdWRlICJzcmNwb3MuaCIKIAorWVlMVFlQRSB5eWxsb2M7CisKIGV4dGVybiBpbnQgeXlsZXgodm9pZCk7CitleHRlcm4gdm9pZCBwcmludF9lcnJvcihjaGFyIGNvbnN0ICpmbXQsIC4uLik7CitleHRlcm4gdm9pZCB5eWVycm9yKGNoYXIgY29uc3QgKnMpOwogCiBleHRlcm4gc3RydWN0IGJvb3RfaW5mbyAqdGhlX2Jvb3RfaW5mbzsKIGV4dGVybiBpbnQgdHJlZXNvdXJjZV9lcnJvcjsKQEAgLTU1LDcgKzU3LDYgQEAKICV0b2tlbiBEVF9NRU1SRVNFUlZFCiAldG9rZW4gPHByb3Bub2RlbmFtZT4gRFRfUFJPUE5PREVOQU1FCiAldG9rZW4gPGxpdGVyYWw+IERUX0xJVEVSQUwKLSV0b2tlbiA8bGl0ZXJhbD4gRFRfTEVHQUNZTElURVJBTAogJXRva2VuIDxjYmFzZT4gRFRfQkFTRQogJXRva2VuIDxieXRlPiBEVF9CWVRFCiAldG9rZW4gPGRhdGE+IERUX1NUUklORwpAQCAtNjcsMTEgKzY4LDggQEAKICV0eXBlIDxkYXRhPiBwcm9wZGF0YXByZWZpeAogJXR5cGUgPHJlPiBtZW1yZXNlcnZlCiAldHlwZSA8cmU+IG1lbXJlc2VydmVzCi0ldHlwZSA8cmU+IHYwX21lbXJlc2VydmUKLSV0eXBlIDxyZT4gdjBfbWVtcmVzZXJ2ZXMKICV0eXBlIDxhZGRyPiBhZGRyCiAldHlwZSA8ZGF0YT4gY2VsbGxpc3QKLSV0eXBlIDxjYmFzZT4gY2VsbGJhc2UKICV0eXBlIDxjZWxsPiBjZWxsdmFsCiAldHlwZSA8ZGF0YT4gYnl0ZXN0cmluZwogJXR5cGUgPHByb3A+IHByb3BkZWYKQEAgLTgxLDE4ICs3OSwxNCBAQAogJXR5cGUgPG5vZGU+IG5vZGVkZWYKICV0eXBlIDxub2RlPiBzdWJub2RlCiAldHlwZSA8bm9kZWxpc3Q+IHN1Ym5vZGVzCi0ldHlwZSA8bGFiZWxyZWY+IGxhYmVsCiAKICUlCiAKIHNvdXJjZWZpbGU6CiAJICBEVF9WMSAnOycgbWVtcmVzZXJ2ZXMgZGV2aWNldHJlZQogCQl7Ci0JCQl0aGVfYm9vdF9pbmZvID0gYnVpbGRfYm9vdF9pbmZvKCQzLCAkNCwgMCk7Ci0JCX0KLQl8IHYwX21lbXJlc2VydmVzIGRldmljZXRyZWUKLQkJewotCQkJdGhlX2Jvb3RfaW5mbyA9IGJ1aWxkX2Jvb3RfaW5mbygkMSwgJDIsIDApOworCQkJdGhlX2Jvb3RfaW5mbyA9IGJ1aWxkX2Jvb3RfaW5mbygkMywgJDQsCisJCQkJCQkJZ3Vlc3NfYm9vdF9jcHVpZCgkNCkpOwogCQl9CiAJOwogCkBAIC0xMDgsMzEgKzEwMiwxNCBAQAogCTsKIAogbWVtcmVzZXJ2ZToKLQkgIGxhYmVsIERUX01FTVJFU0VSVkUgYWRkciBhZGRyICc7JworCSAgRFRfTUVNUkVTRVJWRSBhZGRyIGFkZHIgJzsnCiAJCXsKLQkJCSQkID0gYnVpbGRfcmVzZXJ2ZV9lbnRyeSgkMywgJDQsICQxKTsKKwkJCSQkID0gYnVpbGRfcmVzZXJ2ZV9lbnRyeSgkMiwgJDMpOwogCQl9Ci0JOwotCi12MF9tZW1yZXNlcnZlczoKLQkgIC8qIGVtcHR5ICovCisJfCBEVF9MQUJFTCBtZW1yZXNlcnZlCiAJCXsKLQkJCSQkID0gTlVMTDsKLQkJfQotCXwgdjBfbWVtcmVzZXJ2ZSB2MF9tZW1yZXNlcnZlcwotCQl7Ci0JCQkkJCA9IGNoYWluX3Jlc2VydmVfZW50cnkoJDEsICQyKTsKLQkJfTsKLQk7Ci0KLXYwX21lbXJlc2VydmU6Ci0JICBtZW1yZXNlcnZlCi0JCXsKLQkJCSQkID0gJDE7Ci0JCX0KLQl8IGxhYmVsIERUX01FTVJFU0VSVkUgYWRkciAnLScgYWRkciAnOycKLQkJewotCQkJJCQgPSBidWlsZF9yZXNlcnZlX2VudHJ5KCQzLCAkNSAtICQzICsgMSwgJDEpOworCQkJYWRkX2xhYmVsKCYkMi0+bGFiZWxzLCAkMSk7CisJCQkkJCA9ICQyOwogCQl9CiAJOwogCkBAIC0xNDEsMTYgKzExOCwyNiBAQAogCQl7CiAJCQkkJCA9IGV2YWxfbGl0ZXJhbCgkMSwgMCwgNjQpOwogCQl9Ci0JfCBEVF9MRUdBQ1lMSVRFUkFMCi0JCXsKLQkJCSQkID0gZXZhbF9saXRlcmFsKCQxLCAxNiwgNjQpOwotCQl9CiAJICA7CiAKIGRldmljZXRyZWU6CiAJICAnLycgbm9kZWRlZgogCQl7Ci0JCQkkJCA9IG5hbWVfbm9kZSgkMiwgIiIsIE5VTEwpOworCQkJJCQgPSBuYW1lX25vZGUoJDIsICIiKTsKKwkJfQorCXwgZGV2aWNldHJlZSAnLycgbm9kZWRlZgorCQl7CisJCQkkJCA9IG1lcmdlX25vZGVzKCQxLCAkMyk7CisJCX0KKwl8IGRldmljZXRyZWUgRFRfUkVGIG5vZGVkZWYKKwkJeworCQkJc3RydWN0IG5vZGUgKnRhcmdldCA9IGdldF9ub2RlX2J5X3JlZigkMSwgJDIpOworCisJCQlpZiAodGFyZ2V0KQorCQkJCW1lcmdlX25vZGVzKHRhcmdldCwgJDMpOworCQkJZWxzZQorCQkJCXByaW50X2Vycm9yKCJsYWJlbCBvciBwYXRoLCAnJXMnLCBub3QgZm91bmQiLCAkMik7CisJCQkkJCA9ICQxOwogCQl9CiAJOwogCkBAIC0xNzMsMTMgKzE2MCwxOCBAQAogCTsKIAogcHJvcGRlZjoKLQkgIGxhYmVsIERUX1BST1BOT0RFTkFNRSAnPScgcHJvcGRhdGEgJzsnCisJICBEVF9QUk9QTk9ERU5BTUUgJz0nIHByb3BkYXRhICc7JwogCQl7Ci0JCQkkJCA9IGJ1aWxkX3Byb3BlcnR5KCQyLCAkNCwgJDEpOworCQkJJCQgPSBidWlsZF9wcm9wZXJ0eSgkMSwgJDMpOwogCQl9Ci0JfCBsYWJlbCBEVF9QUk9QTk9ERU5BTUUgJzsnCisJfCBEVF9QUk9QTk9ERU5BTUUgJzsnCiAJCXsKLQkJCSQkID0gYnVpbGRfcHJvcGVydHkoJDIsIGVtcHR5X2RhdGEsICQxKTsKKwkJCSQkID0gYnVpbGRfcHJvcGVydHkoJDEsIGVtcHR5X2RhdGEpOworCQl9CisJfCBEVF9MQUJFTCBwcm9wZGVmCisJCXsKKwkJCWFkZF9sYWJlbCgmJDItPmxhYmVscywgJDEpOworCQkJJCQgPSAkMjsKIAkJfQogCTsKIApAQCAtMjAyLDMxICsxOTQsMzAgQEAKIAkJfQogCXwgcHJvcGRhdGFwcmVmaXggRFRfSU5DQklOICcoJyBEVF9TVFJJTkcgJywnIGFkZHIgJywnIGFkZHIgJyknCiAJCXsKLQkJCXN0cnVjdCBzZWFyY2hfcGF0aCBwYXRoID0geyBzcmNwb3NfZmlsZS0+ZGlyLCBOVUxMLCBOVUxMIH07Ci0JCQlzdHJ1Y3QgZHRjX2ZpbGUgKmZpbGUgPSBkdGNfb3Blbl9maWxlKCQ0LnZhbCwgJnBhdGgpOwotCQkJc3RydWN0IGRhdGEgZCA9IGVtcHR5X2RhdGE7CisJCQlGSUxFICpmID0gc3JjZmlsZV9yZWxhdGl2ZV9vcGVuKCQ0LnZhbCwgTlVMTCk7CisJCQlzdHJ1Y3QgZGF0YSBkOwogCiAJCQlpZiAoJDYgIT0gMCkKLQkJCQlpZiAoZnNlZWsoZmlsZS0+ZmlsZSwgJDYsIFNFRUtfU0VUKSAhPSAwKQotCQkJCQl5eWVycm9yZigiQ291bGRuJ3Qgc2VlayB0byBvZmZzZXQgJWxsdSBpbiBcIiVzXCI6ICVzIiwKLQkJCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKSQ2LAotCQkJCQkJICQ0LnZhbCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQlpZiAoZnNlZWsoZiwgJDYsIFNFRUtfU0VUKSAhPSAwKQorCQkJCQlwcmludF9lcnJvcigiQ291bGRuJ3Qgc2VlayB0byBvZmZzZXQgJWxsdSBpbiBcIiVzXCI6ICVzIiwKKwkJCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykkNiwKKwkJCQkJCSAgICAgJDQudmFsLAorCQkJCQkJICAgICBzdHJlcnJvcihlcnJubykpOwogCi0JCQlkID0gZGF0YV9jb3B5X2ZpbGUoZmlsZS0+ZmlsZSwgJDgpOworCQkJZCA9IGRhdGFfY29weV9maWxlKGYsICQ4KTsKIAogCQkJJCQgPSBkYXRhX21lcmdlKCQxLCBkKTsKLQkJCWR0Y19jbG9zZV9maWxlKGZpbGUpOworCQkJZmNsb3NlKGYpOwogCQl9CiAJfCBwcm9wZGF0YXByZWZpeCBEVF9JTkNCSU4gJygnIERUX1NUUklORyAnKScKIAkJewotCQkJc3RydWN0IHNlYXJjaF9wYXRoIHBhdGggPSB7IHNyY3Bvc19maWxlLT5kaXIsIE5VTEwsIE5VTEwgfTsKLQkJCXN0cnVjdCBkdGNfZmlsZSAqZmlsZSA9IGR0Y19vcGVuX2ZpbGUoJDQudmFsLCAmcGF0aCk7CisJCQlGSUxFICpmID0gc3JjZmlsZV9yZWxhdGl2ZV9vcGVuKCQ0LnZhbCwgTlVMTCk7CiAJCQlzdHJ1Y3QgZGF0YSBkID0gZW1wdHlfZGF0YTsKIAotCQkJZCA9IGRhdGFfY29weV9maWxlKGZpbGUtPmZpbGUsIC0xKTsKKwkJCWQgPSBkYXRhX2NvcHlfZmlsZShmLCAtMSk7CiAKIAkJCSQkID0gZGF0YV9tZXJnZSgkMSwgZCk7Ci0JCQlkdGNfY2xvc2VfZmlsZShmaWxlKTsKKwkJCWZjbG9zZShmKTsKIAkJfQogCXwgcHJvcGRhdGEgRFRfTEFCRUwKIAkJewpAQCAtMjY5LDIzICsyNjAsMTEgQEAKIAkJfQogCTsKIAotY2VsbGJhc2U6Ci0JICAvKiBlbXB0eSAqLwotCQl7Ci0JCQkkJCA9IDE2OwotCQl9Ci0JfCBEVF9CQVNFCi0JOwotCiBjZWxsdmFsOgogCSAgRFRfTElURVJBTAogCQl7CiAJCQkkJCA9IGV2YWxfbGl0ZXJhbCgkMSwgMCwgMzIpOwogCQl9Ci0JfCBjZWxsYmFzZSBEVF9MRUdBQ1lMSVRFUkFMCi0JCXsKLQkJCSQkID0gZXZhbF9saXRlcmFsKCQyLCAkMSwgMzIpOwotCQl9CiAJOwogCiBieXRlc3RyaW5nOgpAQCAtMzA4LDU3ICsyODcsNDQgQEAKIAkJewogCQkJJCQgPSBOVUxMOwogCQl9Ci0JfCAgc3Vibm9kZSBzdWJub2RlcworCXwgc3Vibm9kZSBzdWJub2RlcwogCQl7CiAJCQkkJCA9IGNoYWluX25vZGUoJDEsICQyKTsKIAkJfQogCXwgc3Vibm9kZSBwcm9wZGVmCiAJCXsKLQkJCXl5ZXJyb3IoInN5bnRheCBlcnJvcjogcHJvcGVydGllcyBtdXN0IHByZWNlZGUgc3Vibm9kZXMiKTsKKwkJCXByaW50X2Vycm9yKCJzeW50YXggZXJyb3I6IHByb3BlcnRpZXMgbXVzdCBwcmVjZWRlIHN1Ym5vZGVzIik7CiAJCQlZWUVSUk9SOwogCQl9CiAJOwogCiBzdWJub2RlOgotCSAgbGFiZWwgRFRfUFJPUE5PREVOQU1FIG5vZGVkZWYKKwkgIERUX1BST1BOT0RFTkFNRSBub2RlZGVmCiAJCXsKLQkJCSQkID0gbmFtZV9ub2RlKCQzLCAkMiwgJDEpOworCQkJJCQgPSBuYW1lX25vZGUoJDIsICQxKTsKIAkJfQotCTsKLQotbGFiZWw6Ci0JICAvKiBlbXB0eSAqLworCXwgRFRfTEFCRUwgc3Vibm9kZQogCQl7Ci0JCQkkJCA9IE5VTEw7Ci0JCX0KLQl8IERUX0xBQkVMCi0JCXsKLQkJCSQkID0gJDE7CisJCQlhZGRfbGFiZWwoJiQyLT5sYWJlbHMsICQxKTsKKwkJCSQkID0gJDI7CiAJCX0KIAk7CiAKICUlCiAKLXZvaWQgeXllcnJvcmYoY2hhciBjb25zdCAqcywgLi4uKQordm9pZCBwcmludF9lcnJvcihjaGFyIGNvbnN0ICpmbXQsIC4uLikKIHsKLQljb25zdCBjaGFyICpmbmFtZSA9IHNyY3Bvc19maWxlID8gc3JjcG9zX2ZpbGUtPm5hbWUgOiAiPG5vLWZpbGU+IjsKIAl2YV9saXN0IHZhOwotCXZhX3N0YXJ0KHZhLCBzKTsKIAotCWlmIChzdHJjbXAoZm5hbWUsICItIikgPT0gMCkKLQkJZm5hbWUgPSAic3RkaW4iOwotCi0JZnByaW50ZihzdGRlcnIsICIlczolZCAiLCBmbmFtZSwgeXlsbG9jLmZpcnN0X2xpbmUpOwotCXZmcHJpbnRmKHN0ZGVyciwgcywgdmEpOwotCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKwl2YV9zdGFydCh2YSwgZm10KTsKKwlzcmNwb3NfdmVycm9yKCZ5eWxsb2MsIGZtdCwgdmEpOworCXZhX2VuZCh2YSk7CiAKIAl0cmVlc291cmNlX2Vycm9yID0gMTsKLQl2YV9lbmQodmEpOwogfQogCi12b2lkIHl5ZXJyb3IgKGNoYXIgY29uc3QgKnMpCi17Ci0JeXllcnJvcmYoIiVzIiwgcyk7Cit2b2lkIHl5ZXJyb3IoY2hhciBjb25zdCAqcykgeworCXByaW50X2Vycm9yKCIlcyIsIHMpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIGV2YWxfbGl0ZXJhbChjb25zdCBjaGFyICpzLCBpbnQgYmFzZSwgaW50IGJpdHMpCkBAIC0zNjksMTEgKzMzNSwxMSBAQAogCWVycm5vID0gMDsKIAl2YWwgPSBzdHJ0b3VsbChzLCAmZSwgYmFzZSk7CiAJaWYgKCplKQotCQl5eWVycm9yKCJiYWQgY2hhcmFjdGVycyBpbiBsaXRlcmFsIik7CisJCXByaW50X2Vycm9yKCJiYWQgY2hhcmFjdGVycyBpbiBsaXRlcmFsIik7CiAJZWxzZSBpZiAoKGVycm5vID09IEVSQU5HRSkKIAkJIHx8ICgoYml0cyA8IDY0KSAmJiAodmFsID49ICgxVUxMIDw8IGJpdHMpKSkpCi0JCXl5ZXJyb3IoImxpdGVyYWwgb3V0IG9mIHJhbmdlIik7CisJCXByaW50X2Vycm9yKCJsaXRlcmFsIG91dCBvZiByYW5nZSIpOwogCWVsc2UgaWYgKGVycm5vICE9IDApCi0JCXl5ZXJyb3IoImJhZCBsaXRlcmFsIik7CisJCXByaW50X2Vycm9yKCJiYWQgbGl0ZXJhbCIpOwogCXJldHVybiB2YWw7CiB9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2R0Yy9kdGMuYyBiL3NjcmlwdHMvZHRjL2R0Yy5jCmluZGV4IGQ4ZmQ0M2IuLmNiYzAxOTMgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvZHRjL2R0Yy5jCisrKyBiL3NjcmlwdHMvZHRjL2R0Yy5jCkBAIC0zMCwzMCArMzAsNyBAQAogaW50IHJlc2VydmVudW07CQkvKiBOdW1iZXIgb2YgbWVtb3J5IHJlc2VydmF0aW9uIHNsb3RzICovCiBpbnQgbWluc2l6ZTsJCS8qIE1pbmltdW0gYmxvYiBzaXplICovCiBpbnQgcGFkc2l6ZTsJCS8qIEFkZGl0aW9uYWwgcGFkZGluZyB0byBibG9iICovCi0KLWNoYXIgKmpvaW5fcGF0aChjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpuYW1lKQotewotCWludCBsZW5wID0gc3RybGVuKHBhdGgpOwotCWludCBsZW5uID0gc3RybGVuKG5hbWUpOwotCWludCBsZW47Ci0JaW50IG5lZWRzbGFzaCA9IDE7Ci0JY2hhciAqc3RyOwotCi0JbGVuID0gbGVucCArIGxlbm4gKyAyOwotCWlmICgobGVucCA+IDApICYmIChwYXRoW2xlbnAtMV0gPT0gJy8nKSkgewotCQluZWVkc2xhc2ggPSAwOwotCQlsZW4tLTsKLQl9Ci0KLQlzdHIgPSB4bWFsbG9jKGxlbik7Ci0JbWVtY3B5KHN0ciwgcGF0aCwgbGVucCk7Ci0JaWYgKG5lZWRzbGFzaCkgewotCQlzdHJbbGVucF0gPSAnLyc7Ci0JCWxlbnArKzsKLQl9Ci0JbWVtY3B5KHN0citsZW5wLCBuYW1lLCBsZW5uKzEpOwotCXJldHVybiBzdHI7Ci19CitpbnQgcGhhbmRsZV9mb3JtYXQgPSBQSEFORExFX0JPVEg7CS8qIFVzZSBsaW51eCxwaGFuZGxlIG9yIHBoYW5kbGUgcHJvcGVydGllcyAqLwogCiBzdGF0aWMgdm9pZCBmaWxsX2Z1bGxwYXRocyhzdHJ1Y3Qgbm9kZSAqdHJlZSwgY29uc3QgY2hhciAqcHJlZml4KQogewpAQCAtMTA0LDggKzgxLDE1IEBACiAJZnByaW50ZihzdGRlcnIsICJcdFx0U2V0IHRoZSBwaHlzaWNhbCBib290IGNwdVxuIik7CiAJZnByaW50ZihzdGRlcnIsICJcdC1mXG4iKTsKIAlmcHJpbnRmKHN0ZGVyciwgIlx0XHRGb3JjZSAtIHRyeSB0byBwcm9kdWNlIG91dHB1dCBldmVuIGlmIHRoZSBpbnB1dCB0cmVlIGhhcyBlcnJvcnNcbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQtc1xuIik7CisJZnByaW50ZihzdGRlcnIsICJcdFx0U29ydCBub2RlcyBhbmQgcHJvcGVydGllcyBiZWZvcmUgb3V0cHV0dGluZyAob25seSB1c2VmdWwgZm9yXG5cdFx0Y29tcGFyaW5nIHRyZWVzKVxuIik7CiAJZnByaW50ZihzdGRlcnIsICJcdC12XG4iKTsKIAlmcHJpbnRmKHN0ZGVyciwgIlx0XHRQcmludCBEVEMgdmVyc2lvbiBhbmQgZXhpdFxuIik7CisJZnByaW50ZihzdGRlcnIsICJcdC1IIDxwaGFuZGxlIGZvcm1hdD5cbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHRcdHBoYW5kbGUgZm9ybWF0cyBhcmU6XG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0XHRcdGxlZ2FjeSAtIFwibGludXgscGhhbmRsZVwiIHByb3BlcnRpZXMgb25seVxuIik7CisJZnByaW50ZihzdGRlcnIsICJcdFx0XHRlcGFwciAtIFwicGhhbmRsZVwiIHByb3BlcnRpZXMgb25seVxuIik7CisJZnByaW50ZihzdGRlcnIsICJcdFx0XHRib3RoIC0gQm90aCBcImxpbnV4LHBoYW5kbGVcIiBhbmQgXCJwaGFuZGxlXCIgcHJvcGVydGllc1xuIik7CiAJZXhpdCgzKTsKIH0KIApAQCAtMTE1LDcgKzk5LDcgQEAKIAljb25zdCBjaGFyICppbmZvcm0gPSAiZHRzIjsKIAljb25zdCBjaGFyICpvdXRmb3JtID0gImR0cyI7CiAJY29uc3QgY2hhciAqb3V0bmFtZSA9ICItIjsKLQlpbnQgZm9yY2UgPSAwLCBjaGVjayA9IDA7CisJaW50IGZvcmNlID0gMCwgY2hlY2sgPSAwLCBzb3J0ID0gMDsKIAljb25zdCBjaGFyICphcmc7CiAJaW50IG9wdDsKIAlGSUxFICpvdXRmID0gTlVMTDsKQEAgLTEyNyw3ICsxMTEsNyBAQAogCW1pbnNpemUgICAgPSAwOwogCXBhZHNpemUgICAgPSAwOwogCi0Jd2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgImhJOk86bzpWOlI6UzpwOmZjcWI6diIpKSAhPSBFT0YpIHsKKwl3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAiaEk6TzpvOlY6UjpTOnA6ZmNxYjp2SDpzIikpICE9IEVPRikgewogCQlzd2l0Y2ggKG9wdCkgewogCQljYXNlICdJJzoKIAkJCWluZm9ybSA9IG9wdGFyZzsKQEAgLTE2NSw2ICsxNDksMjIgQEAKIAkJY2FzZSAndic6CiAJCQlwcmludGYoIlZlcnNpb246ICVzXG4iLCBEVENfVkVSU0lPTik7CiAJCQlleGl0KDApOworCQljYXNlICdIJzoKKwkJCWlmIChzdHJlcShvcHRhcmcsICJsZWdhY3kiKSkKKwkJCQlwaGFuZGxlX2Zvcm1hdCA9IFBIQU5ETEVfTEVHQUNZOworCQkJZWxzZSBpZiAoc3RyZXEob3B0YXJnLCAiZXBhcHIiKSkKKwkJCQlwaGFuZGxlX2Zvcm1hdCA9IFBIQU5ETEVfRVBBUFI7CisJCQllbHNlIGlmIChzdHJlcShvcHRhcmcsICJib3RoIikpCisJCQkJcGhhbmRsZV9mb3JtYXQgPSBQSEFORExFX0JPVEg7CisJCQllbHNlCisJCQkJZGllKCJJbnZhbGlkIGFyZ3VtZW50IFwiJXNcIiB0byAtSCBvcHRpb25cbiIsCisJCQkJICAgIG9wdGFyZyk7CisJCQlicmVhazsKKworCQljYXNlICdzJzoKKwkJCXNvcnQgPSAxOworCQkJYnJlYWs7CisKIAkJY2FzZSAnaCc6CiAJCWRlZmF1bHQ6CiAJCQl1c2FnZSgpOwpAQCAtMTgyLDYgKzE4Miw5IEBACiAJaWYgKG1pbnNpemUgJiYgcGFkc2l6ZSkKIAkJZGllKCJDYW4ndCBzZXQgYm90aCAtcCBhbmQgLVNcbiIpOwogCisJaWYgKG1pbnNpemUpCisJCWZwcmludGYoc3RkZXJyLCAiRFRDOiBVc2Ugb2YgXCItU1wiIGlzIGRlcHJlY2F0ZWQ7IGl0IHdpbGwgYmUgcmVtb3ZlZCBzb29uLCB1c2UgXCItcFwiIGluc3RlYWRcbiIpOworCiAJZnByaW50ZihzdGRlcnIsICJEVEM6ICVzLT4lcyAgb24gZmlsZSBcIiVzXCJcbiIsCiAJCWluZm9ybSwgb3V0Zm9ybSwgYXJnKTsKIApAQCAtMjAwLDYgKzIwMyw4IEBACiAJZmlsbF9mdWxscGF0aHMoYmktPmR0LCAiIik7CiAJcHJvY2Vzc19jaGVja3MoZm9yY2UsIGJpKTsKIAorCWlmIChzb3J0KQorCQlzb3J0X3RyZWUoYmkpOwogCiAJaWYgKHN0cmVxKG91dG5hbWUsICItIikpIHsKIAkJb3V0ZiA9IHN0ZG91dDsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvZHRjL2R0Yy5oIGIvc2NyaXB0cy9kdGMvZHRjLmgKaW5kZXggMDhkNTRjOC4uZjM3Yzk3ZSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9kdGMvZHRjLmgKKysrIGIvc2NyaXB0cy9kdGMvZHRjLmgKQEAgLTM0LDcgKzM0LDE3IEBACiAjaW5jbHVkZSA8bGliZmR0X2Vudi5oPgogI2luY2x1ZGUgPGZkdC5oPgogCisjaW5jbHVkZSAidXRpbC5oIgorCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgZGVidWcoZm10LGFyZ3MuLi4pCXByaW50ZihmbXQsICMjYXJncykKKyNlbHNlCisjZGVmaW5lIGRlYnVnKGZtdCxhcmdzLi4uKQorI2VuZGlmCisKKwogI2RlZmluZSBERUZBVUxUX0ZEVF9WRVJTSU9OCTE3CisKIC8qCiAgKiBDb21tYW5kIGxpbmUgb3B0aW9ucwogICovCkBAIC00MiwzNiArNTIsMTEgQEAKIGV4dGVybiBpbnQgcmVzZXJ2ZW51bTsJCS8qIE51bWJlciBvZiBtZW1vcnkgcmVzZXJ2YXRpb24gc2xvdHMgKi8KIGV4dGVybiBpbnQgbWluc2l6ZTsJCS8qIE1pbmltdW0gYmxvYiBzaXplICovCiBleHRlcm4gaW50IHBhZHNpemU7CQkvKiBBZGRpdGlvbmFsIHBhZGRpbmcgdG8gYmxvYiAqLworZXh0ZXJuIGludCBwaGFuZGxlX2Zvcm1hdDsJLyogVXNlIGxpbnV4LHBoYW5kbGUgb3IgcGhhbmRsZSBwcm9wZXJ0aWVzICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpIGRpZShjaGFyICogc3RyLCAuLi4pCi17Ci0JdmFfbGlzdCBhcDsKLQotCXZhX3N0YXJ0KGFwLCBzdHIpOwotCWZwcmludGYoc3RkZXJyLCAiRkFUQUwgRVJST1I6ICIpOwotCXZmcHJpbnRmKHN0ZGVyciwgc3RyLCBhcCk7Ci0JZXhpdCgxKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkICp4bWFsbG9jKHNpemVfdCBsZW4pCi17Ci0Jdm9pZCAqbmV3ID0gbWFsbG9jKGxlbik7Ci0KLQlpZiAoISBuZXcpCi0JCWRpZSgibWFsbG9jKCkgZmFpbGVkXG4iKTsKLQotCXJldHVybiBuZXc7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCAqeHJlYWxsb2Modm9pZCAqcCwgc2l6ZV90IGxlbikKLXsKLQl2b2lkICpuZXcgPSByZWFsbG9jKHAsIGxlbik7Ci0KLQlpZiAoISBuZXcpCi0JCWRpZSgicmVhbGxvYygpIGZhaWxlZCAobGVuPSVkKVxuIiwgbGVuKTsKLQotCXJldHVybiBuZXc7Ci19CisjZGVmaW5lIFBIQU5ETEVfTEVHQUNZCTB4MQorI2RlZmluZSBQSEFORExFX0VQQVBSCTB4MgorI2RlZmluZSBQSEFORExFX0JPVEgJMHgzCiAKIHR5cGVkZWYgdWludDMyX3QgY2VsbF90OwogCkBAIC0xNDAsMTMgKzEyNSwxOCBAQAogI2RlZmluZSBNQVhfTk9ERU5BTUVfTEVOCTMxCiAKIC8qIExpdmUgdHJlZXMgKi8KK3N0cnVjdCBsYWJlbCB7CisJY2hhciAqbGFiZWw7CisJc3RydWN0IGxhYmVsICpuZXh0OworfTsKKwogc3RydWN0IHByb3BlcnR5IHsKIAljaGFyICpuYW1lOwogCXN0cnVjdCBkYXRhIHZhbDsKIAogCXN0cnVjdCBwcm9wZXJ0eSAqbmV4dDsKIAotCWNoYXIgKmxhYmVsOworCXN0cnVjdCBsYWJlbCAqbGFiZWxzOwogfTsKIAogc3RydWN0IG5vZGUgewpAQCAtMTYzLDIyICsxNTMsMjggQEAKIAljZWxsX3QgcGhhbmRsZTsKIAlpbnQgYWRkcl9jZWxscywgc2l6ZV9jZWxsczsKIAotCWNoYXIgKmxhYmVsOworCXN0cnVjdCBsYWJlbCAqbGFiZWxzOwogfTsKIAorI2RlZmluZSBmb3JfZWFjaF9sYWJlbChsMCwgbCkgXAorCWZvciAoKGwpID0gKGwwKTsgKGwpOyAobCkgPSAobCktPm5leHQpCisKICNkZWZpbmUgZm9yX2VhY2hfcHJvcGVydHkobiwgcCkgXAogCWZvciAoKHApID0gKG4pLT5wcm9wbGlzdDsgKHApOyAocCkgPSAocCktPm5leHQpCiAKICNkZWZpbmUgZm9yX2VhY2hfY2hpbGQobiwgYykJXAogCWZvciAoKGMpID0gKG4pLT5jaGlsZHJlbjsgKGMpOyAoYykgPSAoYyktPm5leHRfc2libGluZykKIAotc3RydWN0IHByb3BlcnR5ICpidWlsZF9wcm9wZXJ0eShjaGFyICpuYW1lLCBzdHJ1Y3QgZGF0YSB2YWwsIGNoYXIgKmxhYmVsKTsKK3ZvaWQgYWRkX2xhYmVsKHN0cnVjdCBsYWJlbCAqKmxhYmVscywgY2hhciAqbGFiZWwpOworCitzdHJ1Y3QgcHJvcGVydHkgKmJ1aWxkX3Byb3BlcnR5KGNoYXIgKm5hbWUsIHN0cnVjdCBkYXRhIHZhbCk7CiBzdHJ1Y3QgcHJvcGVydHkgKmNoYWluX3Byb3BlcnR5KHN0cnVjdCBwcm9wZXJ0eSAqZmlyc3QsIHN0cnVjdCBwcm9wZXJ0eSAqbGlzdCk7CiBzdHJ1Y3QgcHJvcGVydHkgKnJldmVyc2VfcHJvcGVydGllcyhzdHJ1Y3QgcHJvcGVydHkgKmZpcnN0KTsKIAogc3RydWN0IG5vZGUgKmJ1aWxkX25vZGUoc3RydWN0IHByb3BlcnR5ICpwcm9wbGlzdCwgc3RydWN0IG5vZGUgKmNoaWxkcmVuKTsKLXN0cnVjdCBub2RlICpuYW1lX25vZGUoc3RydWN0IG5vZGUgKm5vZGUsIGNoYXIgKm5hbWUsIGNoYXIgKmxhYmVsKTsKK3N0cnVjdCBub2RlICpuYW1lX25vZGUoc3RydWN0IG5vZGUgKm5vZGUsIGNoYXIgKm5hbWUpOwogc3RydWN0IG5vZGUgKmNoYWluX25vZGUoc3RydWN0IG5vZGUgKmZpcnN0LCBzdHJ1Y3Qgbm9kZSAqbGlzdCk7CitzdHJ1Y3Qgbm9kZSAqbWVyZ2Vfbm9kZXMoc3RydWN0IG5vZGUgKm9sZF9ub2RlLCBzdHJ1Y3Qgbm9kZSAqbmV3X25vZGUpOwogCiB2b2lkIGFkZF9wcm9wZXJ0eShzdHJ1Y3Qgbm9kZSAqbm9kZSwgc3RydWN0IHByb3BlcnR5ICpwcm9wKTsKIHZvaWQgYWRkX2NoaWxkKHN0cnVjdCBub2RlICpwYXJlbnQsIHN0cnVjdCBub2RlICpjaGlsZCk7CkBAIC0xODYsNiArMTgyLDEwIEBACiBjb25zdCBjaGFyICpnZXRfdW5pdG5hbWUoc3RydWN0IG5vZGUgKm5vZGUpOwogc3RydWN0IHByb3BlcnR5ICpnZXRfcHJvcGVydHkoc3RydWN0IG5vZGUgKm5vZGUsIGNvbnN0IGNoYXIgKnByb3BuYW1lKTsKIGNlbGxfdCBwcm9wdmFsX2NlbGwoc3RydWN0IHByb3BlcnR5ICpwcm9wKTsKK3N0cnVjdCBwcm9wZXJ0eSAqZ2V0X3Byb3BlcnR5X2J5X2xhYmVsKHN0cnVjdCBub2RlICp0cmVlLCBjb25zdCBjaGFyICpsYWJlbCwKKwkJCQkgICAgICAgc3RydWN0IG5vZGUgKipub2RlKTsKK3N0cnVjdCBtYXJrZXIgKmdldF9tYXJrZXJfbGFiZWwoc3RydWN0IG5vZGUgKnRyZWUsIGNvbnN0IGNoYXIgKmxhYmVsLAorCQkJCXN0cnVjdCBub2RlICoqbm9kZSwgc3RydWN0IHByb3BlcnR5ICoqcHJvcCk7CiBzdHJ1Y3Qgbm9kZSAqZ2V0X3N1Ym5vZGUoc3RydWN0IG5vZGUgKm5vZGUsIGNvbnN0IGNoYXIgKm5vZGVuYW1lKTsKIHN0cnVjdCBub2RlICpnZXRfbm9kZV9ieV9wYXRoKHN0cnVjdCBub2RlICp0cmVlLCBjb25zdCBjaGFyICpwYXRoKTsKIHN0cnVjdCBub2RlICpnZXRfbm9kZV9ieV9sYWJlbChzdHJ1Y3Qgbm9kZSAqdHJlZSwgY29uc3QgY2hhciAqbGFiZWwpOwpAQCAtMTkzLDYgKzE5Myw4IEBACiBzdHJ1Y3Qgbm9kZSAqZ2V0X25vZGVfYnlfcmVmKHN0cnVjdCBub2RlICp0cmVlLCBjb25zdCBjaGFyICpyZWYpOwogY2VsbF90IGdldF9ub2RlX3BoYW5kbGUoc3RydWN0IG5vZGUgKnJvb3QsIHN0cnVjdCBub2RlICpub2RlKTsKIAordWludDMyX3QgZ3Vlc3NfYm9vdF9jcHVpZChzdHJ1Y3Qgbm9kZSAqdHJlZSk7CisKIC8qIEJvb3QgaW5mbyAodHJlZSBwbHVzIG1lbXJlc2VydmUgaW5mb3JtYXRpb24gKi8KIAogc3RydWN0IHJlc2VydmVfaW5mbyB7CkBAIC0yMDAsMTAgKzIwMiwxMCBAQAogCiAJc3RydWN0IHJlc2VydmVfaW5mbyAqbmV4dDsKIAotCWNoYXIgKmxhYmVsOworCXN0cnVjdCBsYWJlbCAqbGFiZWxzOwogfTsKIAotc3RydWN0IHJlc2VydmVfaW5mbyAqYnVpbGRfcmVzZXJ2ZV9lbnRyeSh1aW50NjRfdCBzdGFydCwgdWludDY0X3QgbGVuLCBjaGFyICpsYWJlbCk7CitzdHJ1Y3QgcmVzZXJ2ZV9pbmZvICpidWlsZF9yZXNlcnZlX2VudHJ5KHVpbnQ2NF90IHN0YXJ0LCB1aW50NjRfdCBsZW4pOwogc3RydWN0IHJlc2VydmVfaW5mbyAqY2hhaW5fcmVzZXJ2ZV9lbnRyeShzdHJ1Y3QgcmVzZXJ2ZV9pbmZvICpmaXJzdCwKIAkJCQkJIHN0cnVjdCByZXNlcnZlX2luZm8gKmxpc3QpOwogc3RydWN0IHJlc2VydmVfaW5mbyAqYWRkX3Jlc2VydmVfZW50cnkoc3RydWN0IHJlc2VydmVfaW5mbyAqbGlzdCwKQEAgLTIxOCw2ICsyMjAsNyBAQAogCiBzdHJ1Y3QgYm9vdF9pbmZvICpidWlsZF9ib290X2luZm8oc3RydWN0IHJlc2VydmVfaW5mbyAqcmVzZXJ2ZWxpc3QsCiAJCQkJICBzdHJ1Y3Qgbm9kZSAqdHJlZSwgdWludDMyX3QgYm9vdF9jcHVpZF9waHlzKTsKK3ZvaWQgc29ydF90cmVlKHN0cnVjdCBib290X2luZm8gKmJpKTsKIAogLyogQ2hlY2tzICovCiAKQEAgLTIzOSw4ICsyNDIsNCBAQAogCiBzdHJ1Y3QgYm9vdF9pbmZvICpkdF9mcm9tX2ZzKGNvbnN0IGNoYXIgKmRpcm5hbWUpOwogCi0vKiBtaXNjICovCi0KLWNoYXIgKmpvaW5fcGF0aChjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpuYW1lKTsKLQogI2VuZGlmIC8qIF9EVENfSCAqLwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9kdGMvZmxhdHRyZWUuYyBiL3NjcmlwdHMvZHRjL2ZsYXR0cmVlLmMKaW5kZXggNzZhY2QyOC4uZWFkMDMzMiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9kdGMvZmxhdHRyZWUuYworKysgYi9zY3JpcHRzL2R0Yy9mbGF0dHJlZS5jCkBAIC01Miw5ICs1Miw5IEBACiAJdm9pZCAoKnN0cmluZykodm9pZCAqLCBjaGFyICosIGludCk7CiAJdm9pZCAoKmFsaWduKSh2b2lkICosIGludCk7CiAJdm9pZCAoKmRhdGEpKHZvaWQgKiwgc3RydWN0IGRhdGEpOwotCXZvaWQgKCpiZWdpbm5vZGUpKHZvaWQgKiwgY29uc3QgY2hhciAqKTsKLQl2b2lkICgqZW5kbm9kZSkodm9pZCAqLCBjb25zdCBjaGFyICopOwotCXZvaWQgKCpwcm9wZXJ0eSkodm9pZCAqLCBjb25zdCBjaGFyICopOworCXZvaWQgKCpiZWdpbm5vZGUpKHZvaWQgKiwgc3RydWN0IGxhYmVsICpsYWJlbHMpOworCXZvaWQgKCplbmRub2RlKSh2b2lkICosIHN0cnVjdCBsYWJlbCAqbGFiZWxzKTsKKwl2b2lkICgqcHJvcGVydHkpKHZvaWQgKiwgc3RydWN0IGxhYmVsICpsYWJlbHMpOwogfTsKIAogc3RhdGljIHZvaWQgYmluX2VtaXRfY2VsbCh2b2lkICplLCBjZWxsX3QgdmFsKQpAQCAtODksMTcgKzg5LDE3IEBACiAJKmR0YnVmID0gZGF0YV9hcHBlbmRfZGF0YSgqZHRidWYsIGQudmFsLCBkLmxlbik7CiB9CiAKLXN0YXRpYyB2b2lkIGJpbl9lbWl0X2JlZ2lubm9kZSh2b2lkICplLCBjb25zdCBjaGFyICpsYWJlbCkKK3N0YXRpYyB2b2lkIGJpbl9lbWl0X2JlZ2lubm9kZSh2b2lkICplLCBzdHJ1Y3QgbGFiZWwgKmxhYmVscykKIHsKIAliaW5fZW1pdF9jZWxsKGUsIEZEVF9CRUdJTl9OT0RFKTsKIH0KIAotc3RhdGljIHZvaWQgYmluX2VtaXRfZW5kbm9kZSh2b2lkICplLCBjb25zdCBjaGFyICpsYWJlbCkKK3N0YXRpYyB2b2lkIGJpbl9lbWl0X2VuZG5vZGUodm9pZCAqZSwgc3RydWN0IGxhYmVsICpsYWJlbHMpCiB7CiAJYmluX2VtaXRfY2VsbChlLCBGRFRfRU5EX05PREUpOwogfQogCi1zdGF0aWMgdm9pZCBiaW5fZW1pdF9wcm9wZXJ0eSh2b2lkICplLCBjb25zdCBjaGFyICpsYWJlbCkKK3N0YXRpYyB2b2lkIGJpbl9lbWl0X3Byb3BlcnR5KHZvaWQgKmUsIHN0cnVjdCBsYWJlbCAqbGFiZWxzKQogewogCWJpbl9lbWl0X2NlbGwoZSwgRkRUX1BST1ApOwogfQpAQCAtMTI3LDExICsxMjcsMjEgQEAKIAlmcHJpbnRmKGYsICIlc1x0PSAuICsgJWRcbiIsIGxhYmVsLCBvZmZzZXQpOwogfQogCisjZGVmaW5lIEFTTV9FTUlUX0JFTE9ORyhmLCBmbXQsIC4uLikgXAorCXsgXAorCQlmcHJpbnRmKChmKSwgIlx0LmJ5dGVcdCgoIiBmbXQgIikgPj4gMjQpICYgMHhmZlxuIiwgX19WQV9BUkdTX18pOyBcCisJCWZwcmludGYoKGYpLCAiXHQuYnl0ZVx0KCgiIGZtdCAiKSA+PiAxNikgJiAweGZmXG4iLCBfX1ZBX0FSR1NfXyk7IFwKKwkJZnByaW50ZigoZiksICJcdC5ieXRlXHQoKCIgZm10ICIpID4+IDgpICYgMHhmZlxuIiwgX19WQV9BUkdTX18pOyBcCisJCWZwcmludGYoKGYpLCAiXHQuYnl0ZVx0KCIgZm10ICIpICYgMHhmZlxuIiwgX19WQV9BUkdTX18pOyBcCisJfQorCiBzdGF0aWMgdm9pZCBhc21fZW1pdF9jZWxsKHZvaWQgKmUsIGNlbGxfdCB2YWwpCiB7CiAJRklMRSAqZiA9IGU7CiAKLQlmcHJpbnRmKGYsICJcdC5sb25nXHQweCV4XG4iLCB2YWwpOworCWZwcmludGYoZiwgIlx0LmJ5dGUgMHglMDJ4OyAuYnl0ZSAweCUwMng7IC5ieXRlIDB4JTAyeDsgLmJ5dGUgMHglMDJ4XG4iLAorCQkodmFsID4+IDI0KSAmIDB4ZmYsICh2YWwgPj4gMTYpICYgMHhmZiwKKwkJKHZhbCA+PiA4KSAmIDB4ZmYsIHZhbCAmIDB4ZmYpOwogfQogCiBzdGF0aWMgdm9pZCBhc21fZW1pdF9zdHJpbmcodm9pZCAqZSwgY2hhciAqc3RyLCBpbnQgbGVuKQpAQCAtMTU2LDcgKzE2Niw3IEBACiB7CiAJRklMRSAqZiA9IGU7CiAKLQlmcHJpbnRmKGYsICJcdC5iYWxpZ25cdCVkXG4iLCBhKTsKKwlmcHJpbnRmKGYsICJcdC5iYWxpZ25cdCVkLCAwXG4iLCBhKTsKIH0KIAogc3RhdGljIHZvaWQgYXNtX2VtaXRfZGF0YSh2b2lkICplLCBzdHJ1Y3QgZGF0YSBkKQpAQCAtMTY5LDggKzE3OSw3IEBACiAJCWVtaXRfb2Zmc2V0X2xhYmVsKGYsIG0tPnJlZiwgbS0+b2Zmc2V0KTsKIAogCXdoaWxlICgoZC5sZW4gLSBvZmYpID49IHNpemVvZih1aW50MzJfdCkpIHsKLQkJZnByaW50ZihmLCAiXHQubG9uZ1x0MHgleFxuIiwKLQkJCWZkdDMyX3RvX2NwdSgqKCh1aW50MzJfdCAqKShkLnZhbCtvZmYpKSkpOworCQlhc21fZW1pdF9jZWxsKGUsIGZkdDMyX3RvX2NwdSgqKCh1aW50MzJfdCAqKShkLnZhbCtvZmYpKSkpOwogCQlvZmYgKz0gc2l6ZW9mKHVpbnQzMl90KTsKIAl9CiAKQEAgLTE4MiwzNyArMTkxLDQzIEBACiAJYXNzZXJ0KG9mZiA9PSBkLmxlbik7CiB9CiAKLXN0YXRpYyB2b2lkIGFzbV9lbWl0X2JlZ2lubm9kZSh2b2lkICplLCBjb25zdCBjaGFyICpsYWJlbCkKK3N0YXRpYyB2b2lkIGFzbV9lbWl0X2JlZ2lubm9kZSh2b2lkICplLCBzdHJ1Y3QgbGFiZWwgKmxhYmVscykKIHsKIAlGSUxFICpmID0gZTsKKwlzdHJ1Y3QgbGFiZWwgKmw7CiAKLQlpZiAobGFiZWwpIHsKLQkJZnByaW50ZihmLCAiXHQuZ2xvYmxcdCVzXG4iLCBsYWJlbCk7Ci0JCWZwcmludGYoZiwgIiVzOlxuIiwgbGFiZWwpOworCWZvcl9lYWNoX2xhYmVsKGxhYmVscywgbCkgeworCQlmcHJpbnRmKGYsICJcdC5nbG9ibFx0JXNcbiIsIGwtPmxhYmVsKTsKKwkJZnByaW50ZihmLCAiJXM6XG4iLCBsLT5sYWJlbCk7CiAJfQotCWZwcmludGYoZiwgIlx0LmxvbmdcdEZEVF9CRUdJTl9OT0RFXG4iKTsKKwlmcHJpbnRmKGYsICJcdC8qIEZEVF9CRUdJTl9OT0RFICovXG4iKTsKKwlhc21fZW1pdF9jZWxsKGUsIEZEVF9CRUdJTl9OT0RFKTsKIH0KIAotc3RhdGljIHZvaWQgYXNtX2VtaXRfZW5kbm9kZSh2b2lkICplLCBjb25zdCBjaGFyICpsYWJlbCkKK3N0YXRpYyB2b2lkIGFzbV9lbWl0X2VuZG5vZGUodm9pZCAqZSwgc3RydWN0IGxhYmVsICpsYWJlbHMpCiB7CiAJRklMRSAqZiA9IGU7CisJc3RydWN0IGxhYmVsICpsOwogCi0JZnByaW50ZihmLCAiXHQubG9uZ1x0RkRUX0VORF9OT0RFXG4iKTsKLQlpZiAobGFiZWwpIHsKLQkJZnByaW50ZihmLCAiXHQuZ2xvYmxcdCVzX2VuZFxuIiwgbGFiZWwpOwotCQlmcHJpbnRmKGYsICIlc19lbmQ6XG4iLCBsYWJlbCk7CisJZnByaW50ZihmLCAiXHQvKiBGRFRfRU5EX05PREUgKi9cbiIpOworCWFzbV9lbWl0X2NlbGwoZSwgRkRUX0VORF9OT0RFKTsKKwlmb3JfZWFjaF9sYWJlbChsYWJlbHMsIGwpIHsKKwkJZnByaW50ZihmLCAiXHQuZ2xvYmxcdCVzX2VuZFxuIiwgbC0+bGFiZWwpOworCQlmcHJpbnRmKGYsICIlc19lbmQ6XG4iLCBsLT5sYWJlbCk7CiAJfQogfQogCi1zdGF0aWMgdm9pZCBhc21fZW1pdF9wcm9wZXJ0eSh2b2lkICplLCBjb25zdCBjaGFyICpsYWJlbCkKK3N0YXRpYyB2b2lkIGFzbV9lbWl0X3Byb3BlcnR5KHZvaWQgKmUsIHN0cnVjdCBsYWJlbCAqbGFiZWxzKQogewogCUZJTEUgKmYgPSBlOworCXN0cnVjdCBsYWJlbCAqbDsKIAotCWlmIChsYWJlbCkgewotCQlmcHJpbnRmKGYsICJcdC5nbG9ibFx0JXNcbiIsIGxhYmVsKTsKLQkJZnByaW50ZihmLCAiJXM6XG4iLCBsYWJlbCk7CisJZm9yX2VhY2hfbGFiZWwobGFiZWxzLCBsKSB7CisJCWZwcmludGYoZiwgIlx0Lmdsb2JsXHQlc1xuIiwgbC0+bGFiZWwpOworCQlmcHJpbnRmKGYsICIlczpcbiIsIGwtPmxhYmVsKTsKIAl9Ci0JZnByaW50ZihmLCAiXHQubG9uZ1x0RkRUX1BST1BcbiIpOworCWZwcmludGYoZiwgIlx0LyogRkRUX1BST1AgKi9cbiIpOworCWFzbV9lbWl0X2NlbGwoZSwgRkRUX1BST1ApOwogfQogCiBzdGF0aWMgc3RydWN0IGVtaXR0ZXIgYXNtX2VtaXR0ZXIgPSB7CkBAIC0yNDgsNyArMjYzLDcgQEAKIAlzdHJ1Y3Qgbm9kZSAqY2hpbGQ7CiAJaW50IHNlZW5fbmFtZV9wcm9wID0gMDsKIAotCWVtaXQtPmJlZ2lubm9kZShldGFyZ2V0LCB0cmVlLT5sYWJlbCk7CisJZW1pdC0+YmVnaW5ub2RlKGV0YXJnZXQsIHRyZWUtPmxhYmVscyk7CiAKIAlpZiAodmktPmZsYWdzICYgRlRGX0ZVTExQQVRIKQogCQllbWl0LT5zdHJpbmcoZXRhcmdldCwgdHJlZS0+ZnVsbHBhdGgsIDApOwpAQCAtMjY1LDcgKzI4MCw3IEBACiAKIAkJbmFtZW9mZiA9IHN0cmluZ3RhYmxlX2luc2VydChzdHJidWYsIHByb3AtPm5hbWUpOwogCi0JCWVtaXQtPnByb3BlcnR5KGV0YXJnZXQsIHByb3AtPmxhYmVsKTsKKwkJZW1pdC0+cHJvcGVydHkoZXRhcmdldCwgcHJvcC0+bGFiZWxzKTsKIAkJZW1pdC0+Y2VsbChldGFyZ2V0LCBwcm9wLT52YWwubGVuKTsKIAkJZW1pdC0+Y2VsbChldGFyZ2V0LCBuYW1lb2ZmKTsKIApAQCAtMjkyLDcgKzMwNyw3IEBACiAJCWZsYXR0ZW5fdHJlZShjaGlsZCwgZW1pdCwgZXRhcmdldCwgc3RyYnVmLCB2aSk7CiAJfQogCi0JZW1pdC0+ZW5kbm9kZShldGFyZ2V0LCB0cmVlLT5sYWJlbCk7CisJZW1pdC0+ZW5kbm9kZShldGFyZ2V0LCB0cmVlLT5sYWJlbHMpOwogfQogCiBzdGF0aWMgc3RydWN0IGRhdGEgZmxhdHRlbl9yZXNlcnZlX2xpc3Qoc3RydWN0IHJlc2VydmVfaW5mbyAqcmVzZXJ2ZWxpc3QsCkBAIC00MTMsMTAgKzQyOCwxMyBAQAogCWlmIChwYWRsZW4gPiAwKQogCQlibG9iID0gZGF0YV9hcHBlbmRfemVyb2VzKGJsb2IsIHBhZGxlbik7CiAKLQlmd3JpdGUoYmxvYi52YWwsIGJsb2IubGVuLCAxLCBmKTsKLQotCWlmIChmZXJyb3IoZikpCi0JCWRpZSgiRXJyb3Igd3JpdGluZyBkZXZpY2UgdHJlZSBibG9iOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwlpZiAoZndyaXRlKGJsb2IudmFsLCBibG9iLmxlbiwgMSwgZikgIT0gMSkgeworCQlpZiAoZmVycm9yKGYpKQorCQkJZGllKCJFcnJvciB3cml0aW5nIGRldmljZSB0cmVlIGJsb2I6ICVzXG4iLAorCQkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCWVsc2UKKwkJCWRpZSgiU2hvcnQgd3JpdGUgb24gZGV2aWNlIHRyZWUgYmxvYlxuIik7CisJfQogCiAJLyoKIAkgKiBkYXRhX21lcmdlKCkgZnJlZXMgdGhlIHJpZ2h0LWhhbmQgZWxlbWVudCBzbyBvbmx5IHRoZSBibG9iCkBAIC00NTUsMzkgKzQ3Myw0NCBAQAogCQlkaWUoIlVua25vd24gZGV2aWNlIHRyZWUgYmxvYiB2ZXJzaW9uICVkXG4iLCB2ZXJzaW9uKTsKIAogCWZwcmludGYoZiwgIi8qIGF1dG9nZW5lcmF0ZWQgYnkgZHRjLCBkbyBub3QgZWRpdCAqL1xuXG4iKTsKLQlmcHJpbnRmKGYsICIjZGVmaW5lIEZEVF9NQUdJQyAweCV4XG4iLCBGRFRfTUFHSUMpOwotCWZwcmludGYoZiwgIiNkZWZpbmUgRkRUX0JFR0lOX05PREUgMHgleFxuIiwgRkRUX0JFR0lOX05PREUpOwotCWZwcmludGYoZiwgIiNkZWZpbmUgRkRUX0VORF9OT0RFIDB4JXhcbiIsIEZEVF9FTkRfTk9ERSk7Ci0JZnByaW50ZihmLCAiI2RlZmluZSBGRFRfUFJPUCAweCV4XG4iLCBGRFRfUFJPUCk7Ci0JZnByaW50ZihmLCAiI2RlZmluZSBGRFRfRU5EIDB4JXhcbiIsIEZEVF9FTkQpOwotCWZwcmludGYoZiwgIlxuIik7CiAKIAllbWl0X2xhYmVsKGYsIHN5bXByZWZpeCwgImJsb2Jfc3RhcnQiKTsKIAllbWl0X2xhYmVsKGYsIHN5bXByZWZpeCwgImhlYWRlciIpOwotCWZwcmludGYoZiwgIlx0LmxvbmdcdEZEVF9NQUdJQ1x0XHRcdFx0LyogbWFnaWMgKi9cbiIpOwotCWZwcmludGYoZiwgIlx0LmxvbmdcdF8lc19ibG9iX2Fic19lbmQgLSBfJXNfYmxvYl9zdGFydFx0LyogdG90YWxzaXplICovXG4iLAotCQlzeW1wcmVmaXgsIHN5bXByZWZpeCk7Ci0JZnByaW50ZihmLCAiXHQubG9uZ1x0XyVzX3N0cnVjdF9zdGFydCAtIF8lc19ibG9iX3N0YXJ0XHQvKiBvZmZfZHRfc3RydWN0ICovXG4iLAotCQlzeW1wcmVmaXgsIHN5bXByZWZpeCk7Ci0JZnByaW50ZihmLCAiXHQubG9uZ1x0XyVzX3N0cmluZ3Nfc3RhcnQgLSBfJXNfYmxvYl9zdGFydFx0Lyogb2ZmX2R0X3N0cmluZ3MgKi9cbiIsCi0JCXN5bXByZWZpeCwgc3ltcHJlZml4KTsKLQlmcHJpbnRmKGYsICJcdC5sb25nXHRfJXNfcmVzZXJ2ZV9tYXAgLSBfJXNfYmxvYl9zdGFydFx0Lyogb2ZmX2R0X3N0cmluZ3MgKi9cbiIsCi0JCXN5bXByZWZpeCwgc3ltcHJlZml4KTsKLQlmcHJpbnRmKGYsICJcdC5sb25nXHQlZFx0XHRcdFx0XHQvKiB2ZXJzaW9uICovXG4iLCB2aS0+dmVyc2lvbik7Ci0JZnByaW50ZihmLCAiXHQubG9uZ1x0JWRcdFx0XHRcdFx0LyogbGFzdF9jb21wX3ZlcnNpb24gKi9cbiIsCi0JCXZpLT5sYXN0X2NvbXBfdmVyc2lvbik7Ci0KLQlpZiAodmktPmZsYWdzICYgRlRGX0JPT1RDUFVJRCkKLQkJZnByaW50ZihmLCAiXHQubG9uZ1x0JWlcdFx0XHRcdFx0LyogYm9vdF9jcHVpZF9waHlzICovXG4iLAotCQkJYmktPmJvb3RfY3B1aWRfcGh5cyk7Ci0KLQlpZiAodmktPmZsYWdzICYgRlRGX1NUUlRBQlNJWkUpCi0JCWZwcmludGYoZiwgIlx0LmxvbmdcdF8lc19zdHJpbmdzX2VuZCAtIF8lc19zdHJpbmdzX3N0YXJ0XHQvKiBzaXplX2R0X3N0cmluZ3MgKi9cbiIsCisJZnByaW50ZihmLCAiXHQvKiBtYWdpYyAqL1xuIik7CisJYXNtX2VtaXRfY2VsbChmLCBGRFRfTUFHSUMpOworCWZwcmludGYoZiwgIlx0LyogdG90YWxzaXplICovXG4iKTsKKwlBU01fRU1JVF9CRUxPTkcoZiwgIl8lc19ibG9iX2Fic19lbmQgLSBfJXNfYmxvYl9zdGFydCIsCiAJCQlzeW1wcmVmaXgsIHN5bXByZWZpeCk7CisJZnByaW50ZihmLCAiXHQvKiBvZmZfZHRfc3RydWN0ICovXG4iKTsKKwlBU01fRU1JVF9CRUxPTkcoZiwgIl8lc19zdHJ1Y3Rfc3RhcnQgLSBfJXNfYmxvYl9zdGFydCIsCisJCXN5bXByZWZpeCwgc3ltcHJlZml4KTsKKwlmcHJpbnRmKGYsICJcdC8qIG9mZl9kdF9zdHJpbmdzICovXG4iKTsKKwlBU01fRU1JVF9CRUxPTkcoZiwgIl8lc19zdHJpbmdzX3N0YXJ0IC0gXyVzX2Jsb2Jfc3RhcnQiLAorCQlzeW1wcmVmaXgsIHN5bXByZWZpeCk7CisJZnByaW50ZihmLCAiXHQvKiBvZmZfbWVtX3Jzdm1hcCAqL1xuIik7CisJQVNNX0VNSVRfQkVMT05HKGYsICJfJXNfcmVzZXJ2ZV9tYXAgLSBfJXNfYmxvYl9zdGFydCIsCisJCXN5bXByZWZpeCwgc3ltcHJlZml4KTsKKwlmcHJpbnRmKGYsICJcdC8qIHZlcnNpb24gKi9cbiIpOworCWFzbV9lbWl0X2NlbGwoZiwgdmktPnZlcnNpb24pOworCWZwcmludGYoZiwgIlx0LyogbGFzdF9jb21wX3ZlcnNpb24gKi9cbiIpOworCWFzbV9lbWl0X2NlbGwoZiwgdmktPmxhc3RfY29tcF92ZXJzaW9uKTsKIAotCWlmICh2aS0+ZmxhZ3MgJiBGVEZfU1RSVUNUU0laRSkKLQkJZnByaW50ZihmLCAiXHQubG9uZ1x0XyVzX3N0cnVjdF9lbmQgLSBfJXNfc3RydWN0X3N0YXJ0XHQvKiBzaXplX2R0X3N0cnVjdCAqL1xuIiwKKwlpZiAodmktPmZsYWdzICYgRlRGX0JPT1RDUFVJRCkgeworCQlmcHJpbnRmKGYsICJcdC8qIGJvb3RfY3B1aWRfcGh5cyAqL1xuIik7CisJCWFzbV9lbWl0X2NlbGwoZiwgYmktPmJvb3RfY3B1aWRfcGh5cyk7CisJfQorCisJaWYgKHZpLT5mbGFncyAmIEZURl9TVFJUQUJTSVpFKSB7CisJCWZwcmludGYoZiwgIlx0Lyogc2l6ZV9kdF9zdHJpbmdzICovXG4iKTsKKwkJQVNNX0VNSVRfQkVMT05HKGYsICJfJXNfc3RyaW5nc19lbmQgLSBfJXNfc3RyaW5nc19zdGFydCIsCisJCQkJc3ltcHJlZml4LCBzeW1wcmVmaXgpOworCX0KKworCWlmICh2aS0+ZmxhZ3MgJiBGVEZfU1RSVUNUU0laRSkgeworCQlmcHJpbnRmKGYsICJcdC8qIHNpemVfZHRfc3RydWN0ICovXG4iKTsKKwkJQVNNX0VNSVRfQkVMT05HKGYsICJfJXNfc3RydWN0X2VuZCAtIF8lc19zdHJ1Y3Rfc3RhcnQiLAogCQkJc3ltcHJlZml4LCBzeW1wcmVmaXgpOworCX0KIAogCS8qCiAJICogUmVzZXJ2ZSBtYXAgZW50cmllcy4KQEAgLTUwNSwxNiArNTI4LDE3IEBACiAJICogYXMgaXQgYXBwZWFycyAucXVhZCBpc24ndCBhdmFpbGFibGUgaW4gc29tZSBhc3NlbWJsZXJzLgogCSAqLwogCWZvciAocmUgPSBiaS0+cmVzZXJ2ZWxpc3Q7IHJlOyByZSA9IHJlLT5uZXh0KSB7Ci0JCWlmIChyZS0+bGFiZWwpIHsKLQkJCWZwcmludGYoZiwgIlx0Lmdsb2JsXHQlc1xuIiwgcmUtPmxhYmVsKTsKLQkJCWZwcmludGYoZiwgIiVzOlxuIiwgcmUtPmxhYmVsKTsKKwkJc3RydWN0IGxhYmVsICpsOworCisJCWZvcl9lYWNoX2xhYmVsKHJlLT5sYWJlbHMsIGwpIHsKKwkJCWZwcmludGYoZiwgIlx0Lmdsb2JsXHQlc1xuIiwgbC0+bGFiZWwpOworCQkJZnByaW50ZihmLCAiJXM6XG4iLCBsLT5sYWJlbCk7CiAJCX0KLQkJZnByaW50ZihmLCAiXHQubG9uZ1x0MHglMDh4LCAweCUwOHhcbiIsCi0JCQkodW5zaWduZWQgaW50KShyZS0+cmUuYWRkcmVzcyA+PiAzMiksCi0JCQkodW5zaWduZWQgaW50KShyZS0+cmUuYWRkcmVzcyAmIDB4ZmZmZmZmZmYpKTsKLQkJZnByaW50ZihmLCAiXHQubG9uZ1x0MHglMDh4LCAweCUwOHhcbiIsCi0JCQkodW5zaWduZWQgaW50KShyZS0+cmUuc2l6ZSA+PiAzMiksCi0JCQkodW5zaWduZWQgaW50KShyZS0+cmUuc2l6ZSAmIDB4ZmZmZmZmZmYpKTsKKwkJQVNNX0VNSVRfQkVMT05HKGYsICIweCUwOHgiLCAodW5zaWduZWQgaW50KShyZS0+cmUuYWRkcmVzcyA+PiAzMikpOworCQlBU01fRU1JVF9CRUxPTkcoZiwgIjB4JTA4eCIsCisJCQkJKHVuc2lnbmVkIGludCkocmUtPnJlLmFkZHJlc3MgJiAweGZmZmZmZmZmKSk7CisJCUFTTV9FTUlUX0JFTE9ORyhmLCAiMHglMDh4IiwgKHVuc2lnbmVkIGludCkocmUtPnJlLnNpemUgPj4gMzIpKTsKKwkJQVNNX0VNSVRfQkVMT05HKGYsICIweCUwOHgiLCAodW5zaWduZWQgaW50KShyZS0+cmUuc2l6ZSAmIDB4ZmZmZmZmZmYpKTsKIAl9CiAJZm9yIChpID0gMDsgaSA8IHJlc2VydmVudW07IGkrKykgewogCQlmcHJpbnRmKGYsICJcdC5sb25nXHQwLCAwXG5cdC5sb25nXHQwLCAwXG4iKTsKQEAgLTUyNCw3ICs1NDgsOSBAQAogCiAJZW1pdF9sYWJlbChmLCBzeW1wcmVmaXgsICJzdHJ1Y3Rfc3RhcnQiKTsKIAlmbGF0dGVuX3RyZWUoYmktPmR0LCAmYXNtX2VtaXR0ZXIsIGYsICZzdHJidWYsIHZpKTsKLQlmcHJpbnRmKGYsICJcdC5sb25nXHRGRFRfRU5EXG4iKTsKKworCWZwcmludGYoZiwgIlx0LyogRkRUX0VORCAqL1xuIik7CisJYXNtX2VtaXRfY2VsbChmLCBGRFRfRU5EKTsKIAllbWl0X2xhYmVsKGYsIHN5bXByZWZpeCwgInN0cnVjdF9lbmQiKTsKIAogCWVtaXRfbGFiZWwoZiwgc3ltcHJlZml4LCAic3RyaW5nc19zdGFydCIpOwpAQCAtNjAxLDcgKzYyNyw3IEBACiAJCWxlbisrOwogCX0gd2hpbGUgKCgqcCsrKSAhPSAnXDAnKTsKIAotCXN0ciA9IHN0cmR1cChpbmItPnB0cik7CisJc3RyID0geHN0cmR1cChpbmItPnB0cik7CiAKIAlpbmItPnB0ciArPSBsZW47CiAKQEAgLTY0Myw3ICs2NjksNyBAQAogCQlwKys7CiAJfQogCi0JcmV0dXJuIHN0cmR1cChpbmItPmJhc2UgKyBvZmZzZXQpOworCXJldHVybiB4c3RyZHVwKGluYi0+YmFzZSArIG9mZnNldCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcHJvcGVydHkgKmZsYXRfcmVhZF9wcm9wZXJ0eShzdHJ1Y3QgaW5idWYgKmR0YnVmLApAQCAtNjYzLDcgKzY4OSw3IEBACiAKIAl2YWwgPSBmbGF0X3JlYWRfZGF0YShkdGJ1ZiwgcHJvcGxlbik7CiAKLQlyZXR1cm4gYnVpbGRfcHJvcGVydHkobmFtZSwgdmFsLCBOVUxMKTsKKwlyZXR1cm4gYnVpbGRfcHJvcGVydHkobmFtZSwgdmFsKTsKIH0KIAogCkBAIC02ODgsNyArNzE0LDcgQEAKIAkJaWYgKHJlLnNpemUgPT0gMCkKIAkJCWJyZWFrOwogCi0JCW5ldyA9IGJ1aWxkX3Jlc2VydmVfZW50cnkocmUuYWRkcmVzcywgcmUuc2l6ZSwgTlVMTCk7CisJCW5ldyA9IGJ1aWxkX3Jlc2VydmVfZW50cnkocmUuYWRkcmVzcywgcmUuc2l6ZSk7CiAJCXJlc2VydmVsaXN0ID0gYWRkX3Jlc2VydmVfZW50cnkocmVzZXJ2ZWxpc3QsIG5ldyk7CiAJfQogCkBAIC03MTAsNyArNzM2LDcgQEAKIAlpZiAoIXN0cmVxKHBwYXRoLCAiLyIpKQogCQlwbGVuKys7CiAKLQlyZXR1cm4gc3RyZHVwKGNwYXRoICsgcGxlbik7CisJcmV0dXJuIHhzdHJkdXAoY3BhdGggKyBwbGVuKTsKIH0KIAogc3RhdGljIHN0cnVjdCBub2RlICp1bmZsYXR0ZW5fdHJlZShzdHJ1Y3QgaW5idWYgKmR0YnVmLApAQCAtNzc2LDcgKzgwMiw3IEBACiAKIHN0cnVjdCBib290X2luZm8gKmR0X2Zyb21fYmxvYihjb25zdCBjaGFyICpmbmFtZSkKIHsKLQlzdHJ1Y3QgZHRjX2ZpbGUgKmR0Y2Y7CisJRklMRSAqZjsKIAl1aW50MzJfdCBtYWdpYywgdG90YWxzaXplLCB2ZXJzaW9uLCBzaXplX2R0LCBib290X2NwdWlkX3BoeXM7CiAJdWludDMyX3Qgb2ZmX2R0LCBvZmZfc3RyLCBvZmZfbWVtX3Jzdm1hcDsKIAlpbnQgcmM7CkBAIC03OTEsMTQgKzgxNywxNCBAQAogCXVpbnQzMl90IHZhbDsKIAlpbnQgZmxhZ3MgPSAwOwogCi0JZHRjZiA9IGR0Y19vcGVuX2ZpbGUoZm5hbWUsIE5VTEwpOworCWYgPSBzcmNmaWxlX3JlbGF0aXZlX29wZW4oZm5hbWUsIE5VTEwpOwogCi0JcmMgPSBmcmVhZCgmbWFnaWMsIHNpemVvZihtYWdpYyksIDEsIGR0Y2YtPmZpbGUpOwotCWlmIChmZXJyb3IoZHRjZi0+ZmlsZSkpCisJcmMgPSBmcmVhZCgmbWFnaWMsIHNpemVvZihtYWdpYyksIDEsIGYpOworCWlmIChmZXJyb3IoZikpCiAJCWRpZSgiRXJyb3IgcmVhZGluZyBEVCBibG9iIG1hZ2ljIG51bWJlcjogJXNcbiIsCiAJCSAgICBzdHJlcnJvcihlcnJubykpOwogCWlmIChyYyA8IDEpIHsKLQkJaWYgKGZlb2YoZHRjZi0+ZmlsZSkpCisJCWlmIChmZW9mKGYpKQogCQkJZGllKCJFT0YgcmVhZGluZyBEVCBibG9iIG1hZ2ljIG51bWJlclxuIik7CiAJCWVsc2UKIAkJCWRpZSgiTXlzdGVyaW91cyBzaG9ydCByZWFkIHJlYWRpbmcgbWFnaWMgbnVtYmVyXG4iKTsKQEAgLTgwOCwxMSArODM0LDExIEBACiAJaWYgKG1hZ2ljICE9IEZEVF9NQUdJQykKIAkJZGllKCJCbG9iIGhhcyBpbmNvcnJlY3QgbWFnaWMgbnVtYmVyXG4iKTsKIAotCXJjID0gZnJlYWQoJnRvdGFsc2l6ZSwgc2l6ZW9mKHRvdGFsc2l6ZSksIDEsIGR0Y2YtPmZpbGUpOwotCWlmIChmZXJyb3IoZHRjZi0+ZmlsZSkpCisJcmMgPSBmcmVhZCgmdG90YWxzaXplLCBzaXplb2YodG90YWxzaXplKSwgMSwgZik7CisJaWYgKGZlcnJvcihmKSkKIAkJZGllKCJFcnJvciByZWFkaW5nIERUIGJsb2Igc2l6ZTogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CiAJaWYgKHJjIDwgMSkgewotCQlpZiAoZmVvZihkdGNmLT5maWxlKSkKKwkJaWYgKGZlb2YoZikpCiAJCQlkaWUoIkVPRiByZWFkaW5nIERUIGJsb2Igc2l6ZVxuIik7CiAJCWVsc2UKIAkJCWRpZSgiTXlzdGVyaW91cyBzaG9ydCByZWFkIHJlYWRpbmcgYmxvYiBzaXplXG4iKTsKQEAgLTgzMiwxMiArODU4LDEyIEBACiAJcCA9IGJsb2IgKyBzaXplb2YobWFnaWMpICArIHNpemVvZih0b3RhbHNpemUpOwogCiAJd2hpbGUgKHNpemVsZWZ0KSB7Ci0JCWlmIChmZW9mKGR0Y2YtPmZpbGUpKQorCQlpZiAoZmVvZihmKSkKIAkJCWRpZSgiRU9GIGJlZm9yZSByZWFkaW5nICVkIGJ5dGVzIG9mIERUIGJsb2JcbiIsCiAJCQkgICAgdG90YWxzaXplKTsKIAotCQlyYyA9IGZyZWFkKHAsIDEsIHNpemVsZWZ0LCBkdGNmLT5maWxlKTsKLQkJaWYgKGZlcnJvcihkdGNmLT5maWxlKSkKKwkJcmMgPSBmcmVhZChwLCAxLCBzaXplbGVmdCwgZik7CisJCWlmIChmZXJyb3IoZikpCiAJCQlkaWUoIkVycm9yIHJlYWRpbmcgRFQgYmxvYjogJXNcbiIsCiAJCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKIApAQCAtOTAwLDcgKzkyNiw3IEBACiAKIAlmcmVlKGJsb2IpOwogCi0JZHRjX2Nsb3NlX2ZpbGUoZHRjZik7CisJZmNsb3NlKGYpOwogCiAJcmV0dXJuIGJ1aWxkX2Jvb3RfaW5mbyhyZXNlcnZlbGlzdCwgdHJlZSwgYm9vdF9jcHVpZF9waHlzKTsKIH0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvZHRjL2ZzdHJlZS5jIGIvc2NyaXB0cy9kdGMvZnN0cmVlLmMKaW5kZXggOGZlMWJkZi4uZjM3NzQ1MyAxMDA2NDQKLS0tIGEvc2NyaXB0cy9kdGMvZnN0cmVlLmMKKysrIGIvc2NyaXB0cy9kdGMvZnN0cmVlLmMKQEAgLTU4LDEwICs1OCw5IEBACiAJCQkJCSJXQVJOSU5HOiBDYW5ub3Qgb3BlbiAlczogJXNcbiIsCiAJCQkJCXRtcG5hbSwgc3RyZXJyb3IoZXJybm8pKTsKIAkJCX0gZWxzZSB7Ci0JCQkJcHJvcCA9IGJ1aWxkX3Byb3BlcnR5KHN0cmR1cChkZS0+ZF9uYW1lKSwKKwkJCQlwcm9wID0gYnVpbGRfcHJvcGVydHkoeHN0cmR1cChkZS0+ZF9uYW1lKSwKIAkJCQkJCSAgICAgIGRhdGFfY29weV9maWxlKHBmaWxlLAotCQkJCQkJCQkgICAgIHN0LnN0X3NpemUpLAotCQkJCQkJICAgICAgTlVMTCk7CisJCQkJCQkJCSAgICAgc3Quc3Rfc2l6ZSkpOwogCQkJCWFkZF9wcm9wZXJ0eSh0cmVlLCBwcm9wKTsKIAkJCQlmY2xvc2UocGZpbGUpOwogCQkJfQpAQCAtNjksOCArNjgsNyBAQAogCQkJc3RydWN0IG5vZGUgKm5ld2NoaWxkOwogCiAJCQluZXdjaGlsZCA9IHJlYWRfZnN0cmVlKHRtcG5hbSk7Ci0JCQluZXdjaGlsZCA9IG5hbWVfbm9kZShuZXdjaGlsZCwgc3RyZHVwKGRlLT5kX25hbWUpLAotCQkJCQkgICAgIE5VTEwpOworCQkJbmV3Y2hpbGQgPSBuYW1lX25vZGUobmV3Y2hpbGQsIHhzdHJkdXAoZGUtPmRfbmFtZSkpOwogCQkJYWRkX2NoaWxkKHRyZWUsIG5ld2NoaWxkKTsKIAkJfQogCkBAIC04Niw4ICs4NCw4IEBACiAJc3RydWN0IG5vZGUgKnRyZWU7CiAKIAl0cmVlID0gcmVhZF9mc3RyZWUoZGlybmFtZSk7Ci0JdHJlZSA9IG5hbWVfbm9kZSh0cmVlLCAiIiwgTlVMTCk7CisJdHJlZSA9IG5hbWVfbm9kZSh0cmVlLCAiIik7CiAKLQlyZXR1cm4gYnVpbGRfYm9vdF9pbmZvKE5VTEwsIHRyZWUsIDApOworCXJldHVybiBidWlsZF9ib290X2luZm8oTlVMTCwgdHJlZSwgZ3Vlc3NfYm9vdF9jcHVpZCh0cmVlKSk7CiB9CiAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvZHRjL2xpdmV0cmVlLmMgYi9zY3JpcHRzL2R0Yy9saXZldHJlZS5jCmluZGV4IDBjYTNkZTUuLmM5MjA5ZDUgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvZHRjL2xpdmV0cmVlLmMKKysrIGIvc2NyaXB0cy9kdGMvbGl2ZXRyZWUuYwpAQCAtMjQsMTcgKzI0LDMwIEBACiAgKiBUcmVlIGJ1aWxkaW5nIGZ1bmN0aW9ucwogICovCiAKLXN0cnVjdCBwcm9wZXJ0eSAqYnVpbGRfcHJvcGVydHkoY2hhciAqbmFtZSwgc3RydWN0IGRhdGEgdmFsLCBjaGFyICpsYWJlbCkKK3ZvaWQgYWRkX2xhYmVsKHN0cnVjdCBsYWJlbCAqKmxhYmVscywgY2hhciAqbGFiZWwpCit7CisJc3RydWN0IGxhYmVsICpuZXc7CisKKwkvKiBNYWtlIHN1cmUgdGhlIGxhYmVsIGlzbid0IGFscmVhZHkgdGhlcmUgKi8KKwlmb3JfZWFjaF9sYWJlbCgqbGFiZWxzLCBuZXcpCisJCWlmIChzdHJlcShuZXctPmxhYmVsLCBsYWJlbCkpCisJCQlyZXR1cm47CisKKwluZXcgPSB4bWFsbG9jKHNpemVvZigqbmV3KSk7CisJbmV3LT5sYWJlbCA9IGxhYmVsOworCW5ldy0+bmV4dCA9ICpsYWJlbHM7CisJKmxhYmVscyA9IG5ldzsKK30KKworc3RydWN0IHByb3BlcnR5ICpidWlsZF9wcm9wZXJ0eShjaGFyICpuYW1lLCBzdHJ1Y3QgZGF0YSB2YWwpCiB7CiAJc3RydWN0IHByb3BlcnR5ICpuZXcgPSB4bWFsbG9jKHNpemVvZigqbmV3KSk7CiAKKwltZW1zZXQobmV3LCAwLCBzaXplb2YoKm5ldykpOworCiAJbmV3LT5uYW1lID0gbmFtZTsKIAluZXctPnZhbCA9IHZhbDsKIAotCW5ldy0+bmV4dCA9IE5VTEw7Ci0KLQluZXctPmxhYmVsID0gbGFiZWw7Ci0KIAlyZXR1cm4gbmV3OwogfQogCkBAIC03OCwxNyArOTEsODIgQEAKIAlyZXR1cm4gbmV3OwogfQogCi1zdHJ1Y3Qgbm9kZSAqbmFtZV9ub2RlKHN0cnVjdCBub2RlICpub2RlLCBjaGFyICpuYW1lLCBjaGFyICogbGFiZWwpCitzdHJ1Y3Qgbm9kZSAqbmFtZV9ub2RlKHN0cnVjdCBub2RlICpub2RlLCBjaGFyICpuYW1lKQogewogCWFzc2VydChub2RlLT5uYW1lID09IE5VTEwpOwogCiAJbm9kZS0+bmFtZSA9IG5hbWU7CiAKLQlub2RlLT5sYWJlbCA9IGxhYmVsOwotCiAJcmV0dXJuIG5vZGU7CiB9CiAKK3N0cnVjdCBub2RlICptZXJnZV9ub2RlcyhzdHJ1Y3Qgbm9kZSAqb2xkX25vZGUsIHN0cnVjdCBub2RlICpuZXdfbm9kZSkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKm5ld19wcm9wLCAqb2xkX3Byb3A7CisJc3RydWN0IG5vZGUgKm5ld19jaGlsZCwgKm9sZF9jaGlsZDsKKwlzdHJ1Y3QgbGFiZWwgKmw7CisKKwkvKiBBZGQgbmV3IG5vZGUgbGFiZWxzIHRvIG9sZCBub2RlICovCisJZm9yX2VhY2hfbGFiZWwobmV3X25vZGUtPmxhYmVscywgbCkKKwkJYWRkX2xhYmVsKCZvbGRfbm9kZS0+bGFiZWxzLCBsLT5sYWJlbCk7CisKKwkvKiBNb3ZlIHByb3BlcnRpZXMgZnJvbSB0aGUgbmV3IG5vZGUgdG8gdGhlIG9sZCBub2RlLiAgSWYgdGhlcmUKKwkgKiBpcyBhIGNvbGxpc2lvbiwgcmVwbGFjZSB0aGUgb2xkIHZhbHVlIHdpdGggdGhlIG5ldyAqLworCXdoaWxlIChuZXdfbm9kZS0+cHJvcGxpc3QpIHsKKwkJLyogUG9wIHRoZSBwcm9wZXJ0eSBvZmYgdGhlIGxpc3QgKi8KKwkJbmV3X3Byb3AgPSBuZXdfbm9kZS0+cHJvcGxpc3Q7CisJCW5ld19ub2RlLT5wcm9wbGlzdCA9IG5ld19wcm9wLT5uZXh0OworCQluZXdfcHJvcC0+bmV4dCA9IE5VTEw7CisKKwkJLyogTG9vayBmb3IgYSBjb2xsaXNpb24sIHNldCBuZXcgdmFsdWUgaWYgdGhlcmUgaXMgKi8KKwkJZm9yX2VhY2hfcHJvcGVydHkob2xkX25vZGUsIG9sZF9wcm9wKSB7CisJCQlpZiAoc3RyZXEob2xkX3Byb3AtPm5hbWUsIG5ld19wcm9wLT5uYW1lKSkgeworCQkJCS8qIEFkZCBuZXcgbGFiZWxzIHRvIG9sZCBwcm9wZXJ0eSAqLworCQkJCWZvcl9lYWNoX2xhYmVsKG5ld19wcm9wLT5sYWJlbHMsIGwpCisJCQkJCWFkZF9sYWJlbCgmb2xkX3Byb3AtPmxhYmVscywgbC0+bGFiZWwpOworCisJCQkJb2xkX3Byb3AtPnZhbCA9IG5ld19wcm9wLT52YWw7CisJCQkJZnJlZShuZXdfcHJvcCk7CisJCQkJbmV3X3Byb3AgPSBOVUxMOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLyogaWYgbm8gY29sbGlzaW9uIG9jY3VycmVkLCBhZGQgcHJvcGVydHkgdG8gdGhlIG9sZCBub2RlLiAqLworCQlpZiAobmV3X3Byb3ApCisJCQlhZGRfcHJvcGVydHkob2xkX25vZGUsIG5ld19wcm9wKTsKKwl9CisKKwkvKiBNb3ZlIHRoZSBvdmVycmlkZSBjaGlsZCBub2RlcyBpbnRvIHRoZSBwcmltYXJ5IG5vZGUuICBJZgorCSAqIHRoZXJlIGlzIGEgY29sbGlzaW9uLCB0aGVuIG1lcmdlIHRoZSBub2Rlcy4gKi8KKwl3aGlsZSAobmV3X25vZGUtPmNoaWxkcmVuKSB7CisJCS8qIFBvcCB0aGUgY2hpbGQgbm9kZSBvZmYgdGhlIGxpc3QgKi8KKwkJbmV3X2NoaWxkID0gbmV3X25vZGUtPmNoaWxkcmVuOworCQluZXdfbm9kZS0+Y2hpbGRyZW4gPSBuZXdfY2hpbGQtPm5leHRfc2libGluZzsKKwkJbmV3X2NoaWxkLT5wYXJlbnQgPSBOVUxMOworCQluZXdfY2hpbGQtPm5leHRfc2libGluZyA9IE5VTEw7CisKKwkJLyogU2VhcmNoIGZvciBhIGNvbGxpc2lvbi4gIE1lcmdlIGlmIHRoZXJlIGlzICovCisJCWZvcl9lYWNoX2NoaWxkKG9sZF9ub2RlLCBvbGRfY2hpbGQpIHsKKwkJCWlmIChzdHJlcShvbGRfY2hpbGQtPm5hbWUsIG5ld19jaGlsZC0+bmFtZSkpIHsKKwkJCQltZXJnZV9ub2RlcyhvbGRfY2hpbGQsIG5ld19jaGlsZCk7CisJCQkJbmV3X2NoaWxkID0gTlVMTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8qIGlmIG5vIGNvbGxpc2lvbiBvY2N1cmVkLCBhZGQgY2hpbGQgdG8gdGhlIG9sZCBub2RlLiAqLworCQlpZiAobmV3X2NoaWxkKQorCQkJYWRkX2NoaWxkKG9sZF9ub2RlLCBuZXdfY2hpbGQpOworCX0KKworCS8qIFRoZSBuZXcgbm9kZSBjb250ZW50cyBhcmUgbm93IG1lcmdlZCBpbnRvIHRoZSBvbGQgbm9kZS4gIEZyZWUKKwkgKiB0aGUgbmV3IG5vZGUuICovCisJZnJlZShuZXdfbm9kZSk7CisKKwlyZXR1cm4gb2xkX25vZGU7Cit9CisKIHN0cnVjdCBub2RlICpjaGFpbl9ub2RlKHN0cnVjdCBub2RlICpmaXJzdCwgc3RydWN0IG5vZGUgKmxpc3QpCiB7CiAJYXNzZXJ0KGZpcnN0LT5uZXh0X3NpYmxpbmcgPT0gTlVMTCk7CkBAIC0xMjQsMTggKzIwMiwxNSBAQAogCSpwID0gY2hpbGQ7CiB9CiAKLXN0cnVjdCByZXNlcnZlX2luZm8gKmJ1aWxkX3Jlc2VydmVfZW50cnkodWludDY0X3QgYWRkcmVzcywgdWludDY0X3Qgc2l6ZSwKLQkJCQkJIGNoYXIgKmxhYmVsKQorc3RydWN0IHJlc2VydmVfaW5mbyAqYnVpbGRfcmVzZXJ2ZV9lbnRyeSh1aW50NjRfdCBhZGRyZXNzLCB1aW50NjRfdCBzaXplKQogewogCXN0cnVjdCByZXNlcnZlX2luZm8gKm5ldyA9IHhtYWxsb2Moc2l6ZW9mKCpuZXcpKTsKIAorCW1lbXNldChuZXcsIDAsIHNpemVvZigqbmV3KSk7CisKIAluZXctPnJlLmFkZHJlc3MgPSBhZGRyZXNzOwogCW5ldy0+cmUuc2l6ZSA9IHNpemU7CiAKLQluZXctPm5leHQgPSBOVUxMOwotCi0JbmV3LT5sYWJlbCA9IGxhYmVsOwotCiAJcmV0dXJuIG5ldzsKIH0KIApAQCAtMjA4LDYgKzI4Myw2MCBAQAogCXJldHVybiBmZHQzMl90b19jcHUoKigoY2VsbF90ICopcHJvcC0+dmFsLnZhbCkpOwogfQogCitzdHJ1Y3QgcHJvcGVydHkgKmdldF9wcm9wZXJ0eV9ieV9sYWJlbChzdHJ1Y3Qgbm9kZSAqdHJlZSwgY29uc3QgY2hhciAqbGFiZWwsCisJCQkJICAgICAgIHN0cnVjdCBub2RlICoqbm9kZSkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJc3RydWN0IG5vZGUgKmM7CisKKwkqbm9kZSA9IHRyZWU7CisKKwlmb3JfZWFjaF9wcm9wZXJ0eSh0cmVlLCBwcm9wKSB7CisJCXN0cnVjdCBsYWJlbCAqbDsKKworCQlmb3JfZWFjaF9sYWJlbChwcm9wLT5sYWJlbHMsIGwpCisJCQlpZiAoc3RyZXEobC0+bGFiZWwsIGxhYmVsKSkKKwkJCQlyZXR1cm4gcHJvcDsKKwl9CisKKwlmb3JfZWFjaF9jaGlsZCh0cmVlLCBjKSB7CisJCXByb3AgPSBnZXRfcHJvcGVydHlfYnlfbGFiZWwoYywgbGFiZWwsIG5vZGUpOworCQlpZiAocHJvcCkKKwkJCXJldHVybiBwcm9wOworCX0KKworCSpub2RlID0gTlVMTDsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IG1hcmtlciAqZ2V0X21hcmtlcl9sYWJlbChzdHJ1Y3Qgbm9kZSAqdHJlZSwgY29uc3QgY2hhciAqbGFiZWwsCisJCQkJc3RydWN0IG5vZGUgKipub2RlLCBzdHJ1Y3QgcHJvcGVydHkgKipwcm9wKQoreworCXN0cnVjdCBtYXJrZXIgKm07CisJc3RydWN0IHByb3BlcnR5ICpwOworCXN0cnVjdCBub2RlICpjOworCisJKm5vZGUgPSB0cmVlOworCisJZm9yX2VhY2hfcHJvcGVydHkodHJlZSwgcCkgeworCQkqcHJvcCA9IHA7CisJCW0gPSBwLT52YWwubWFya2VyczsKKwkJZm9yX2VhY2hfbWFya2VyX29mX3R5cGUobSwgTEFCRUwpCisJCQlpZiAoc3RyZXEobS0+cmVmLCBsYWJlbCkpCisJCQkJcmV0dXJuIG07CisJfQorCisJZm9yX2VhY2hfY2hpbGQodHJlZSwgYykgeworCQltID0gZ2V0X21hcmtlcl9sYWJlbChjLCBsYWJlbCwgbm9kZSwgcHJvcCk7CisJCWlmIChtKQorCQkJcmV0dXJuIG07CisJfQorCisJKnByb3AgPSBOVUxMOworCSpub2RlID0gTlVMTDsKKwlyZXR1cm4gTlVMTDsKK30KKwogc3RydWN0IG5vZGUgKmdldF9zdWJub2RlKHN0cnVjdCBub2RlICpub2RlLCBjb25zdCBjaGFyICpub2RlbmFtZSkKIHsKIAlzdHJ1Y3Qgbm9kZSAqY2hpbGQ7CkBAIC0yNDUsMTEgKzM3NCwxMyBAQAogc3RydWN0IG5vZGUgKmdldF9ub2RlX2J5X2xhYmVsKHN0cnVjdCBub2RlICp0cmVlLCBjb25zdCBjaGFyICpsYWJlbCkKIHsKIAlzdHJ1Y3Qgbm9kZSAqY2hpbGQsICpub2RlOworCXN0cnVjdCBsYWJlbCAqbDsKIAogCWFzc2VydChsYWJlbCAmJiAoc3RybGVuKGxhYmVsKSA+IDApKTsKIAotCWlmICh0cmVlLT5sYWJlbCAmJiBzdHJlcSh0cmVlLT5sYWJlbCwgbGFiZWwpKQotCQlyZXR1cm4gdHJlZTsKKwlmb3JfZWFjaF9sYWJlbCh0cmVlLT5sYWJlbHMsIGwpCisJCWlmIChzdHJlcShsLT5sYWJlbCwgbGFiZWwpKQorCQkJcmV0dXJuIHRyZWU7CiAKIAlmb3JfZWFjaF9jaGlsZCh0cmVlLCBjaGlsZCkgewogCQlub2RlID0gZ2V0X25vZGVfYnlfbGFiZWwoY2hpbGQsIGxhYmVsKTsKQEAgLTI5MywxNiArNDI0LDE4NiBAQAogCWlmICgobm9kZS0+cGhhbmRsZSAhPSAwKSAmJiAobm9kZS0+cGhhbmRsZSAhPSAtMSkpCiAJCXJldHVybiBub2RlLT5waGFuZGxlOwogCi0JYXNzZXJ0KCEgZ2V0X3Byb3BlcnR5KG5vZGUsICJsaW51eCxwaGFuZGxlIikpOwotCiAJd2hpbGUgKGdldF9ub2RlX2J5X3BoYW5kbGUocm9vdCwgcGhhbmRsZSkpCiAJCXBoYW5kbGUrKzsKIAogCW5vZGUtPnBoYW5kbGUgPSBwaGFuZGxlOwotCWFkZF9wcm9wZXJ0eShub2RlLAotCQkgICAgIGJ1aWxkX3Byb3BlcnR5KCJsaW51eCxwaGFuZGxlIiwKLQkJCQkgICAgZGF0YV9hcHBlbmRfY2VsbChlbXB0eV9kYXRhLCBwaGFuZGxlKSwKLQkJCQkgICAgTlVMTCkpOworCisJaWYgKCFnZXRfcHJvcGVydHkobm9kZSwgImxpbnV4LHBoYW5kbGUiKQorCSAgICAmJiAocGhhbmRsZV9mb3JtYXQgJiBQSEFORExFX0xFR0FDWSkpCisJCWFkZF9wcm9wZXJ0eShub2RlLAorCQkJICAgICBidWlsZF9wcm9wZXJ0eSgibGludXgscGhhbmRsZSIsCisJCQkJCSAgICBkYXRhX2FwcGVuZF9jZWxsKGVtcHR5X2RhdGEsIHBoYW5kbGUpKSk7CisKKwlpZiAoIWdldF9wcm9wZXJ0eShub2RlLCAicGhhbmRsZSIpCisJICAgICYmIChwaGFuZGxlX2Zvcm1hdCAmIFBIQU5ETEVfRVBBUFIpKQorCQlhZGRfcHJvcGVydHkobm9kZSwKKwkJCSAgICAgYnVpbGRfcHJvcGVydHkoInBoYW5kbGUiLAorCQkJCQkgICAgZGF0YV9hcHBlbmRfY2VsbChlbXB0eV9kYXRhLCBwaGFuZGxlKSkpOworCisJLyogSWYgdGhlIG5vZGUgKmRvZXMqIGhhdmUgYSBwaGFuZGxlIHByb3BlcnR5LCB3ZSBtdXN0CisJICogYmUgZGVhbGluZyB3aXRoIGEgc2VsZi1yZWZlcmVuY2luZyBwaGFuZGxlLCB3aGljaCB3aWxsIGJlCisJICogZml4ZWQgdXAgbW9tZW50YXJpbHkgaW4gdGhlIGNhbGxlciAqLwogCiAJcmV0dXJuIG5vZGUtPnBoYW5kbGU7CiB9CisKK3VpbnQzMl90IGd1ZXNzX2Jvb3RfY3B1aWQoc3RydWN0IG5vZGUgKnRyZWUpCit7CisJc3RydWN0IG5vZGUgKmNwdXMsICpib290Y3B1OworCXN0cnVjdCBwcm9wZXJ0eSAqcmVnOworCisJY3B1cyA9IGdldF9ub2RlX2J5X3BhdGgodHJlZSwgIi9jcHVzIik7CisJaWYgKCFjcHVzKQorCQlyZXR1cm4gMDsKKworCisJYm9vdGNwdSA9IGNwdXMtPmNoaWxkcmVuOworCWlmICghYm9vdGNwdSkKKwkJcmV0dXJuIDA7CisKKwlyZWcgPSBnZXRfcHJvcGVydHkoYm9vdGNwdSwgInJlZyIpOworCWlmICghcmVnIHx8IChyZWctPnZhbC5sZW4gIT0gc2l6ZW9mKHVpbnQzMl90KSkpCisJCXJldHVybiAwOworCisJLyogRklYTUU6IFNhbml0eSBjaGVjayBub2RlPyAqLworCisJcmV0dXJuIHByb3B2YWxfY2VsbChyZWcpOworfQorCitzdGF0aWMgaW50IGNtcF9yZXNlcnZlX2luZm8oY29uc3Qgdm9pZCAqYXgsIGNvbnN0IHZvaWQgKmJ4KQoreworCWNvbnN0IHN0cnVjdCByZXNlcnZlX2luZm8gKmEsICpiOworCisJYSA9ICooKGNvbnN0IHN0cnVjdCByZXNlcnZlX2luZm8gKiBjb25zdCAqKWF4KTsKKwliID0gKigoY29uc3Qgc3RydWN0IHJlc2VydmVfaW5mbyAqIGNvbnN0ICopYngpOworCisJaWYgKGEtPnJlLmFkZHJlc3MgPCBiLT5yZS5hZGRyZXNzKQorCQlyZXR1cm4gLTE7CisJZWxzZSBpZiAoYS0+cmUuYWRkcmVzcyA+IGItPnJlLmFkZHJlc3MpCisJCXJldHVybiAxOworCWVsc2UgaWYgKGEtPnJlLnNpemUgPCBiLT5yZS5zaXplKQorCQlyZXR1cm4gLTE7CisJZWxzZSBpZiAoYS0+cmUuc2l6ZSA+IGItPnJlLnNpemUpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNvcnRfcmVzZXJ2ZV9lbnRyaWVzKHN0cnVjdCBib290X2luZm8gKmJpKQoreworCXN0cnVjdCByZXNlcnZlX2luZm8gKnJpLCAqKnRibDsKKwlpbnQgbiA9IDAsIGkgPSAwOworCisJZm9yIChyaSA9IGJpLT5yZXNlcnZlbGlzdDsKKwkgICAgIHJpOworCSAgICAgcmkgPSByaS0+bmV4dCkKKwkJbisrOworCisJaWYgKG4gPT0gMCkKKwkJcmV0dXJuOworCisJdGJsID0geG1hbGxvYyhuICogc2l6ZW9mKCp0YmwpKTsKKworCWZvciAocmkgPSBiaS0+cmVzZXJ2ZWxpc3Q7CisJICAgICByaTsKKwkgICAgIHJpID0gcmktPm5leHQpCisJCXRibFtpKytdID0gcmk7CisKKwlxc29ydCh0YmwsIG4sIHNpemVvZigqdGJsKSwgY21wX3Jlc2VydmVfaW5mbyk7CisKKwliaS0+cmVzZXJ2ZWxpc3QgPSB0YmxbMF07CisJZm9yIChpID0gMDsgaSA8IChuLTEpOyBpKyspCisJCXRibFtpXS0+bmV4dCA9IHRibFtpKzFdOworCXRibFtuLTFdLT5uZXh0ID0gTlVMTDsKKworCWZyZWUodGJsKTsKK30KKworc3RhdGljIGludCBjbXBfcHJvcChjb25zdCB2b2lkICpheCwgY29uc3Qgdm9pZCAqYngpCit7CisJY29uc3Qgc3RydWN0IHByb3BlcnR5ICphLCAqYjsKKworCWEgPSAqKChjb25zdCBzdHJ1Y3QgcHJvcGVydHkgKiBjb25zdCAqKWF4KTsKKwliID0gKigoY29uc3Qgc3RydWN0IHByb3BlcnR5ICogY29uc3QgKilieCk7CisKKwlyZXR1cm4gc3RyY21wKGEtPm5hbWUsIGItPm5hbWUpOworfQorCitzdGF0aWMgdm9pZCBzb3J0X3Byb3BlcnRpZXMoc3RydWN0IG5vZGUgKm5vZGUpCit7CisJaW50IG4gPSAwLCBpID0gMDsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3AsICoqdGJsOworCisJZm9yX2VhY2hfcHJvcGVydHkobm9kZSwgcHJvcCkKKwkJbisrOworCisJaWYgKG4gPT0gMCkKKwkJcmV0dXJuOworCisJdGJsID0geG1hbGxvYyhuICogc2l6ZW9mKCp0YmwpKTsKKworCWZvcl9lYWNoX3Byb3BlcnR5KG5vZGUsIHByb3ApCisJCXRibFtpKytdID0gcHJvcDsKKworCXFzb3J0KHRibCwgbiwgc2l6ZW9mKCp0YmwpLCBjbXBfcHJvcCk7CisKKwlub2RlLT5wcm9wbGlzdCA9IHRibFswXTsKKwlmb3IgKGkgPSAwOyBpIDwgKG4tMSk7IGkrKykKKwkJdGJsW2ldLT5uZXh0ID0gdGJsW2krMV07CisJdGJsW24tMV0tPm5leHQgPSBOVUxMOworCisJZnJlZSh0YmwpOworfQorCitzdGF0aWMgaW50IGNtcF9zdWJub2RlKGNvbnN0IHZvaWQgKmF4LCBjb25zdCB2b2lkICpieCkKK3sKKwljb25zdCBzdHJ1Y3Qgbm9kZSAqYSwgKmI7CisKKwlhID0gKigoY29uc3Qgc3RydWN0IG5vZGUgKiBjb25zdCAqKWF4KTsKKwliID0gKigoY29uc3Qgc3RydWN0IG5vZGUgKiBjb25zdCAqKWJ4KTsKKworCXJldHVybiBzdHJjbXAoYS0+bmFtZSwgYi0+bmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIHNvcnRfc3Vibm9kZXMoc3RydWN0IG5vZGUgKm5vZGUpCit7CisJaW50IG4gPSAwLCBpID0gMDsKKwlzdHJ1Y3Qgbm9kZSAqc3Vibm9kZSwgKip0Ymw7CisKKwlmb3JfZWFjaF9jaGlsZChub2RlLCBzdWJub2RlKQorCQluKys7CisKKwlpZiAobiA9PSAwKQorCQlyZXR1cm47CisKKwl0YmwgPSB4bWFsbG9jKG4gKiBzaXplb2YoKnRibCkpOworCisJZm9yX2VhY2hfY2hpbGQobm9kZSwgc3Vibm9kZSkKKwkJdGJsW2krK10gPSBzdWJub2RlOworCisJcXNvcnQodGJsLCBuLCBzaXplb2YoKnRibCksIGNtcF9zdWJub2RlKTsKKworCW5vZGUtPmNoaWxkcmVuID0gdGJsWzBdOworCWZvciAoaSA9IDA7IGkgPCAobi0xKTsgaSsrKQorCQl0YmxbaV0tPm5leHRfc2libGluZyA9IHRibFtpKzFdOworCXRibFtuLTFdLT5uZXh0X3NpYmxpbmcgPSBOVUxMOworCisJZnJlZSh0YmwpOworfQorCitzdGF0aWMgdm9pZCBzb3J0X25vZGUoc3RydWN0IG5vZGUgKm5vZGUpCit7CisJc3RydWN0IG5vZGUgKmM7CisKKwlzb3J0X3Byb3BlcnRpZXMobm9kZSk7CisJc29ydF9zdWJub2Rlcyhub2RlKTsKKwlmb3JfZWFjaF9jaGlsZChub2RlLCBjKQorCQlzb3J0X25vZGUoYyk7Cit9CisKK3ZvaWQgc29ydF90cmVlKHN0cnVjdCBib290X2luZm8gKmJpKQoreworCXNvcnRfcmVzZXJ2ZV9lbnRyaWVzKGJpKTsKKwlzb3J0X25vZGUoYmktPmR0KTsKK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMvZHRjL3NyY3Bvcy5jIGIvc2NyaXB0cy9kdGMvc3JjcG9zLmMKaW5kZXggOTY0MWI3Ni4uMmRiYzg3NCAxMDA2NDQKLS0tIGEvc2NyaXB0cy9kdGMvc3JjcG9zLmMKKysrIGIvc2NyaXB0cy9kdGMvc3JjcG9zLmMKQEAgLTE3LDEwMCArMTcsMjMyIEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0EKICAqLwogCisjZGVmaW5lIF9HTlVfU09VUkNFCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCiAjaW5jbHVkZSAiZHRjLmgiCiAjaW5jbHVkZSAic3JjcG9zLmgiCiAKLS8qCi0gKiBMaWtlIHl5bGluZW5vLCB0aGlzIGlzIHRoZSBjdXJyZW50IG9wZW4gZmlsZSBwb3MuCi0gKi8KIAotc3RydWN0IGR0Y19maWxlICpzcmNwb3NfZmlsZTsKLQotc3RhdGljIGludCBkdGNfb3Blbl9vbmUoc3RydWN0IGR0Y19maWxlICpmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc2VhcmNoLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm5hbWUpCitzdGF0aWMgY2hhciAqZGlybmFtZShjb25zdCBjaGFyICpwYXRoKQogeworCWNvbnN0IGNoYXIgKnNsYXNoID0gc3RycmNocihwYXRoLCAnLycpOworCisJaWYgKHNsYXNoKSB7CisJCWludCBsZW4gPSBzbGFzaCAtIHBhdGg7CisJCWNoYXIgKmRpciA9IHhtYWxsb2MobGVuICsgMSk7CisKKwkJbWVtY3B5KGRpciwgcGF0aCwgbGVuKTsKKwkJZGlyW2xlbl0gPSAnXDAnOworCQlyZXR1cm4gZGlyOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IHNyY2ZpbGVfc3RhdGUgKmN1cnJlbnRfc3JjZmlsZTsgLyogPSBOVUxMICovCisKKy8qIERldGVjdCBpbmZpbml0ZSBpbmNsdWRlIHJlY3Vyc2lvbi4gKi8KKyNkZWZpbmUgTUFYX1NSQ0ZJTEVfREVQVEggICAgICgxMDApCitzdGF0aWMgaW50IHNyY2ZpbGVfZGVwdGg7IC8qID0gMCAqLworCitGSUxFICpzcmNmaWxlX3JlbGF0aXZlX29wZW4oY29uc3QgY2hhciAqZm5hbWUsIGNoYXIgKipmdWxsbmFtZXApCit7CisJRklMRSAqZjsKIAljaGFyICpmdWxsbmFtZTsKIAotCWlmIChzZWFyY2gpIHsKLQkJZnVsbG5hbWUgPSB4bWFsbG9jKHN0cmxlbihzZWFyY2gpICsgc3RybGVuKGZuYW1lKSArIDIpOwotCi0JCXN0cmNweShmdWxsbmFtZSwgc2VhcmNoKTsKLQkJc3RyY2F0KGZ1bGxuYW1lLCAiLyIpOwotCQlzdHJjYXQoZnVsbG5hbWUsIGZuYW1lKTsKLQl9IGVsc2UgewotCQlmdWxsbmFtZSA9IHN0cmR1cChmbmFtZSk7Ci0JfQotCi0JZmlsZS0+ZmlsZSA9IGZvcGVuKGZ1bGxuYW1lLCAiciIpOwotCWlmICghZmlsZS0+ZmlsZSkgewotCQlmcmVlKGZ1bGxuYW1lKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JZmlsZS0+bmFtZSA9IGZ1bGxuYW1lOwotCXJldHVybiAxOwotfQotCi0KLXN0cnVjdCBkdGNfZmlsZSAqZHRjX29wZW5fZmlsZShjb25zdCBjaGFyICpmbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc2VhcmNoX3BhdGggKnNlYXJjaCkKLXsKLQlzdGF0aWMgY29uc3Qgc3RydWN0IHNlYXJjaF9wYXRoIGRlZmF1bHRfc2VhcmNoID0geyBOVUxMLCBOVUxMLCBOVUxMIH07Ci0KLQlzdHJ1Y3QgZHRjX2ZpbGUgKmZpbGU7Ci0JY29uc3QgY2hhciAqc2xhc2g7Ci0KLQlmaWxlID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IGR0Y19maWxlKSk7Ci0KLQlzbGFzaCA9IHN0cnJjaHIoZm5hbWUsICcvJyk7Ci0JaWYgKHNsYXNoKSB7Ci0JCWNoYXIgKmRpciA9IHhtYWxsb2Moc2xhc2ggLSBmbmFtZSArIDEpOwotCi0JCW1lbWNweShkaXIsIGZuYW1lLCBzbGFzaCAtIGZuYW1lKTsKLQkJZGlyW3NsYXNoIC0gZm5hbWVdID0gMDsKLQkJZmlsZS0+ZGlyID0gZGlyOwotCX0gZWxzZSB7Ci0JCWZpbGUtPmRpciA9IE5VTEw7Ci0JfQotCiAJaWYgKHN0cmVxKGZuYW1lLCAiLSIpKSB7Ci0JCWZpbGUtPm5hbWUgPSAic3RkaW4iOwotCQlmaWxlLT5maWxlID0gc3RkaW47Ci0JCXJldHVybiBmaWxlOworCQlmID0gc3RkaW47CisJCWZ1bGxuYW1lID0geHN0cmR1cCgiPHN0ZGluPiIpOworCX0gZWxzZSB7CisJCWlmICghY3VycmVudF9zcmNmaWxlIHx8ICFjdXJyZW50X3NyY2ZpbGUtPmRpcgorCQkgICAgfHwgKGZuYW1lWzBdID09ICcvJykpCisJCQlmdWxsbmFtZSA9IHhzdHJkdXAoZm5hbWUpOworCQllbHNlCisJCQlmdWxsbmFtZSA9IGpvaW5fcGF0aChjdXJyZW50X3NyY2ZpbGUtPmRpciwgZm5hbWUpOworCisJCWYgPSBmb3BlbihmdWxsbmFtZSwgInIiKTsKKwkJaWYgKCFmKQorCQkJZGllKCJDb3VsZG4ndCBvcGVuIFwiJXNcIjogJXNcbiIsIGZuYW1lLAorCQkJICAgIHN0cmVycm9yKGVycm5vKSk7CiAJfQogCi0JaWYgKGZuYW1lWzBdID09ICcvJykgewotCQlmaWxlLT5maWxlID0gZm9wZW4oZm5hbWUsICJyIik7Ci0JCWlmICghZmlsZS0+ZmlsZSkKLQkJCWdvdG8gZmFpbDsKKwlpZiAoZnVsbG5hbWVwKQorCQkqZnVsbG5hbWVwID0gZnVsbG5hbWU7CisJZWxzZQorCQlmcmVlKGZ1bGxuYW1lKTsKIAotCQlmaWxlLT5uYW1lID0gc3RyZHVwKGZuYW1lKTsKLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JaWYgKCFzZWFyY2gpCi0JCXNlYXJjaCA9ICZkZWZhdWx0X3NlYXJjaDsKLQotCXdoaWxlIChzZWFyY2gpIHsKLQkJaWYgKGR0Y19vcGVuX29uZShmaWxlLCBzZWFyY2gtPmRpciwgZm5hbWUpKQotCQkJcmV0dXJuIGZpbGU7Ci0KLQkJaWYgKGVycm5vICE9IEVOT0VOVCkKLQkJCWdvdG8gZmFpbDsKLQotCQlzZWFyY2ggPSBzZWFyY2gtPm5leHQ7Ci0JfQotCi1mYWlsOgotCWRpZSgiQ291bGRuJ3Qgb3BlbiBcIiVzXCI6ICVzXG4iLCBmbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwlyZXR1cm4gZjsKIH0KIAotdm9pZCBkdGNfY2xvc2VfZmlsZShzdHJ1Y3QgZHRjX2ZpbGUgKmZpbGUpCit2b2lkIHNyY2ZpbGVfcHVzaChjb25zdCBjaGFyICpmbmFtZSkKIHsKLQlpZiAoZmNsb3NlKGZpbGUtPmZpbGUpKQotCQlkaWUoIkVycm9yIGNsb3NpbmcgXCIlc1wiOiAlc1xuIiwgZmlsZS0+bmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwlzdHJ1Y3Qgc3JjZmlsZV9zdGF0ZSAqc3JjZmlsZTsKIAotCWZyZWUoZmlsZS0+ZGlyKTsKLQlmcmVlKGZpbGUpOworCWlmIChzcmNmaWxlX2RlcHRoKysgPj0gTUFYX1NSQ0ZJTEVfREVQVEgpCisJCWRpZSgiSW5jbHVkZXMgbmVzdGVkIHRvbyBkZWVwbHkiKTsKKworCXNyY2ZpbGUgPSB4bWFsbG9jKHNpemVvZigqc3JjZmlsZSkpOworCisJc3JjZmlsZS0+ZiA9IHNyY2ZpbGVfcmVsYXRpdmVfb3BlbihmbmFtZSwgJnNyY2ZpbGUtPm5hbWUpOworCXNyY2ZpbGUtPmRpciA9IGRpcm5hbWUoc3JjZmlsZS0+bmFtZSk7CisJc3JjZmlsZS0+cHJldiA9IGN1cnJlbnRfc3JjZmlsZTsKKworCXNyY2ZpbGUtPmxpbmVubyA9IDE7CisJc3JjZmlsZS0+Y29sbm8gPSAxOworCisJY3VycmVudF9zcmNmaWxlID0gc3JjZmlsZTsKK30KKworaW50IHNyY2ZpbGVfcG9wKHZvaWQpCit7CisJc3RydWN0IHNyY2ZpbGVfc3RhdGUgKnNyY2ZpbGUgPSBjdXJyZW50X3NyY2ZpbGU7CisKKwlhc3NlcnQoc3JjZmlsZSk7CisKKwljdXJyZW50X3NyY2ZpbGUgPSBzcmNmaWxlLT5wcmV2OworCisJaWYgKGZjbG9zZShzcmNmaWxlLT5mKSkKKwkJZGllKCJFcnJvciBjbG9zaW5nIFwiJXNcIjogJXNcbiIsIHNyY2ZpbGUtPm5hbWUsCisJCSAgICBzdHJlcnJvcihlcnJubykpOworCisJLyogRklYTUU6IFdlIGFsbG93IHRoZSBzcmNmaWxlX3N0YXRlIHN0cnVjdHVyZSB0byBsZWFrLAorCSAqIGJlY2F1c2UgaXQgY291bGQgc3RpbGwgYmUgcmVmZXJlbmNlZCBmcm9tIGEgbG9jYXRpb24KKwkgKiB2YXJpYWJsZSBiZWluZyBjYXJyaWVkIHRocm91Z2ggdGhlIHBhcnNlciBzb21ld2hlcmUuICBUbworCSAqIGZpeCB0aGlzIHdlIGNvdWxkIGVpdGhlciBhbGxvY2F0ZSBhbGwgdGhlIGZpbGVzIGZyb20gYQorCSAqIHRhYmxlLCBvciB1c2UgYSBwb29sIGFsbG9jYXRvci4gKi8KKworCXJldHVybiBjdXJyZW50X3NyY2ZpbGUgPyAxIDogMDsKK30KKworLyoKKyAqIFRoZSBlbXB0eSBzb3VyY2UgcG9zaXRpb24uCisgKi8KKworc3RydWN0IHNyY3BvcyBzcmNwb3NfZW1wdHkgPSB7CisJLmZpcnN0X2xpbmUgPSAwLAorCS5maXJzdF9jb2x1bW4gPSAwLAorCS5sYXN0X2xpbmUgPSAwLAorCS5sYXN0X2NvbHVtbiA9IDAsCisJLmZpbGUgPSBOVUxMLAorfTsKKworI2RlZmluZSBUQUJfU0laRSAgICAgIDgKKwordm9pZCBzcmNwb3NfdXBkYXRlKHN0cnVjdCBzcmNwb3MgKnBvcywgY29uc3QgY2hhciAqdGV4dCwgaW50IGxlbikKK3sKKwlpbnQgaTsKKworCXBvcy0+ZmlsZSA9IGN1cnJlbnRfc3JjZmlsZTsKKworCXBvcy0+Zmlyc3RfbGluZSA9IGN1cnJlbnRfc3JjZmlsZS0+bGluZW5vOworCXBvcy0+Zmlyc3RfY29sdW1uID0gY3VycmVudF9zcmNmaWxlLT5jb2xubzsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJaWYgKHRleHRbaV0gPT0gJ1xuJykgeworCQkJY3VycmVudF9zcmNmaWxlLT5saW5lbm8rKzsKKwkJCWN1cnJlbnRfc3JjZmlsZS0+Y29sbm8gPSAxOworCQl9IGVsc2UgaWYgKHRleHRbaV0gPT0gJ1x0JykgeworCQkJY3VycmVudF9zcmNmaWxlLT5jb2xubyA9CisJCQkJQUxJR04oY3VycmVudF9zcmNmaWxlLT5jb2xubywgVEFCX1NJWkUpOworCQl9IGVsc2UgeworCQkJY3VycmVudF9zcmNmaWxlLT5jb2xubysrOworCQl9CisKKwlwb3MtPmxhc3RfbGluZSA9IGN1cnJlbnRfc3JjZmlsZS0+bGluZW5vOworCXBvcy0+bGFzdF9jb2x1bW4gPSBjdXJyZW50X3NyY2ZpbGUtPmNvbG5vOworfQorCitzdHJ1Y3Qgc3JjcG9zICoKK3NyY3Bvc19jb3B5KHN0cnVjdCBzcmNwb3MgKnBvcykKK3sKKwlzdHJ1Y3Qgc3JjcG9zICpwb3NfbmV3OworCisJcG9zX25ldyA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzcmNwb3MpKTsKKwltZW1jcHkocG9zX25ldywgcG9zLCBzaXplb2Yoc3RydWN0IHNyY3BvcykpOworCisJcmV0dXJuIHBvc19uZXc7Cit9CisKKworCit2b2lkCitzcmNwb3NfZHVtcChzdHJ1Y3Qgc3JjcG9zICpwb3MpCit7CisJcHJpbnRmKCJmaWxlICAgICAgICA6IFwiJXNcIlxuIiwKKwkgICAgICAgcG9zLT5maWxlID8gKGNoYXIgKikgcG9zLT5maWxlIDogIjxubyBmaWxlPiIpOworCXByaW50ZigiZmlyc3RfbGluZSAgOiAlZFxuIiwgcG9zLT5maXJzdF9saW5lKTsKKwlwcmludGYoImZpcnN0X2NvbHVtbjogJWRcbiIsIHBvcy0+Zmlyc3RfY29sdW1uKTsKKwlwcmludGYoImxhc3RfbGluZSAgIDogJWRcbiIsIHBvcy0+bGFzdF9saW5lKTsKKwlwcmludGYoImxhc3RfY29sdW1uIDogJWRcbiIsIHBvcy0+bGFzdF9jb2x1bW4pOworCXByaW50ZigiZmlsZSAgICAgICAgOiAlc1xuIiwgcG9zLT5maWxlLT5uYW1lKTsKK30KKworCitjaGFyICoKK3NyY3Bvc19zdHJpbmcoc3RydWN0IHNyY3BvcyAqcG9zKQoreworCWNvbnN0IGNoYXIgKmZuYW1lID0gIjxuby1maWxlPiI7CisJY2hhciAqcG9zX3N0cjsKKwlpbnQgcmM7CisKKwlpZiAocG9zKQorCQlmbmFtZSA9IHBvcy0+ZmlsZS0+bmFtZTsKKworCisJaWYgKHBvcy0+Zmlyc3RfbGluZSAhPSBwb3MtPmxhc3RfbGluZSkKKwkJcmMgPSBhc3ByaW50ZigmcG9zX3N0ciwgIiVzOiVkLiVkLSVkLiVkIiwgZm5hbWUsCisJCQkgICAgICBwb3MtPmZpcnN0X2xpbmUsIHBvcy0+Zmlyc3RfY29sdW1uLAorCQkJICAgICAgcG9zLT5sYXN0X2xpbmUsIHBvcy0+bGFzdF9jb2x1bW4pOworCWVsc2UgaWYgKHBvcy0+Zmlyc3RfY29sdW1uICE9IHBvcy0+bGFzdF9jb2x1bW4pCisJCXJjID0gYXNwcmludGYoJnBvc19zdHIsICIlczolZC4lZC0lZCIsIGZuYW1lLAorCQkJICAgICAgcG9zLT5maXJzdF9saW5lLCBwb3MtPmZpcnN0X2NvbHVtbiwKKwkJCSAgICAgIHBvcy0+bGFzdF9jb2x1bW4pOworCWVsc2UKKwkJcmMgPSBhc3ByaW50ZigmcG9zX3N0ciwgIiVzOiVkLiVkIiwgZm5hbWUsCisJCQkgICAgICBwb3MtPmZpcnN0X2xpbmUsIHBvcy0+Zmlyc3RfY29sdW1uKTsKKworCWlmIChyYyA9PSAtMSkKKwkJZGllKCJDb3VsZG4ndCBhbGxvY2F0ZSBpbiBzcmNwb3Mgc3RyaW5nIik7CisKKwlyZXR1cm4gcG9zX3N0cjsKK30KKwordm9pZAorc3JjcG9zX3ZlcnJvcihzdHJ1Y3Qgc3JjcG9zICpwb3MsIGNoYXIgY29uc3QgKmZtdCwgdmFfbGlzdCB2YSkKK3sKKyAgICAgICBjb25zdCBjaGFyICpzcmNzdHI7CisKKyAgICAgICBzcmNzdHIgPSBzcmNwb3Nfc3RyaW5nKHBvcyk7CisKKyAgICAgICBmcHJpbnRmKHN0ZG91dCwgIkVycm9yOiAlcyAiLCBzcmNzdHIpOworICAgICAgIHZmcHJpbnRmKHN0ZG91dCwgZm10LCB2YSk7CisgICAgICAgZnByaW50ZihzdGRvdXQsICJcbiIpOworfQorCit2b2lkCitzcmNwb3NfZXJyb3Ioc3RydWN0IHNyY3BvcyAqcG9zLCBjaGFyIGNvbnN0ICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IHZhOworCisJdmFfc3RhcnQodmEsIGZtdCk7CisJc3JjcG9zX3ZlcnJvcihwb3MsIGZtdCwgdmEpOworCXZhX2VuZCh2YSk7Cit9CisKKwordm9pZAorc3JjcG9zX3dhcm4oc3RydWN0IHNyY3BvcyAqcG9zLCBjaGFyIGNvbnN0ICpmbXQsIC4uLikKK3sKKwljb25zdCBjaGFyICpzcmNzdHI7CisJdmFfbGlzdCB2YTsKKwl2YV9zdGFydCh2YSwgZm10KTsKKworCXNyY3N0ciA9IHNyY3Bvc19zdHJpbmcocG9zKTsKKworCWZwcmludGYoc3RkZXJyLCAiV2FybmluZzogJXMgIiwgc3Jjc3RyKTsKKwl2ZnByaW50ZihzdGRlcnIsIGZtdCwgdmEpOworCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKworCXZhX2VuZCh2YSk7CiB9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2R0Yy9zcmNwb3MuaCBiL3NjcmlwdHMvZHRjL3NyY3Bvcy5oCmluZGV4IGUxN2M3YzAuLmJkNzk2NmUgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvZHRjL3NyY3Bvcy5oCisrKyBiL3NjcmlwdHMvZHRjL3NyY3Bvcy5oCkBAIC0xNyw2OSArMTcsNzAgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQQogICovCiAKLS8qCi0gKiBBdWdtZW50IHRoZSBzdGFuZGFyZCBZWUxUWVBFIHdpdGggYSBmaWxlbnVtIGluZGV4IGludG8gYW4KLSAqIGFycmF5IG9mIGFsbCBvcGVuZWQgZmlsZW5hbWVzLgotICovCisjaWZuZGVmIF9TUkNQT1NfSF8KKyNkZWZpbmUgX1NSQ1BPU19IXwogCiAjaW5jbHVkZSA8c3RkaW8uaD4KIAotc3RydWN0IGR0Y19maWxlIHsKK3N0cnVjdCBzcmNmaWxlX3N0YXRlIHsKKwlGSUxFICpmOworCWNoYXIgKm5hbWU7CiAJY2hhciAqZGlyOwotCWNvbnN0IGNoYXIgKm5hbWU7Ci0JRklMRSAqZmlsZTsKKwlpbnQgbGluZW5vLCBjb2xubzsKKwlzdHJ1Y3Qgc3JjZmlsZV9zdGF0ZSAqcHJldjsKIH07CiAKLSNpZiAhIGRlZmluZWQoWVlMVFlQRSkgJiYgISBkZWZpbmVkKFlZTFRZUEVfSVNfREVDTEFSRUQpCi10eXBlZGVmIHN0cnVjdCBZWUxUWVBFIHsKK2V4dGVybiBzdHJ1Y3Qgc3JjZmlsZV9zdGF0ZSAqY3VycmVudF9zcmNmaWxlOyAvKiA9IE5VTEwgKi8KKworRklMRSAqc3JjZmlsZV9yZWxhdGl2ZV9vcGVuKGNvbnN0IGNoYXIgKmZuYW1lLCBjaGFyICoqZnVsbG5hbWVwKTsKK3ZvaWQgc3JjZmlsZV9wdXNoKGNvbnN0IGNoYXIgKmZuYW1lKTsKK2ludCBzcmNmaWxlX3BvcCh2b2lkKTsKKworc3RydWN0IHNyY3BvcyB7CiAgICAgaW50IGZpcnN0X2xpbmU7CiAgICAgaW50IGZpcnN0X2NvbHVtbjsKICAgICBpbnQgbGFzdF9saW5lOwogICAgIGludCBsYXN0X2NvbHVtbjsKLSAgICBzdHJ1Y3QgZHRjX2ZpbGUgKmZpbGU7Ci19IFlZTFRZUEU7Ci0KLSNkZWZpbmUgWVlMVFlQRV9JU19ERUNMQVJFRAkxCi0jZGVmaW5lIFlZTFRZUEVfSVNfVFJJVklBTAkxCi0jZW5kaWYKLQotLyogQ2F0ZXIgdG8gb2xkIHBhcnNlciB0ZW1wbGF0ZXMuICovCi0jaWZuZGVmIFlZSUQKLSNkZWZpbmUgWVlJRChuKQkobikKLSNlbmRpZgotCi0jZGVmaW5lIFlZTExPQ19ERUZBVUxUKEN1cnJlbnQsIFJocywgTikJCQkJCVwKLSAgICBkbwkJCQkJCQkJCVwKLSAgICAgIGlmIChZWUlEIChOKSkJCQkJCQkJXAotCXsJCQkJCQkJCVwKLQkgIChDdXJyZW50KS5maXJzdF9saW5lICAgPSBZWVJIU0xPQyAoUmhzLCAxKS5maXJzdF9saW5lOwlcCi0JICAoQ3VycmVudCkuZmlyc3RfY29sdW1uID0gWVlSSFNMT0MgKFJocywgMSkuZmlyc3RfY29sdW1uOwlcCi0JICAoQ3VycmVudCkubGFzdF9saW5lICAgID0gWVlSSFNMT0MgKFJocywgTikubGFzdF9saW5lOwkJXAotCSAgKEN1cnJlbnQpLmxhc3RfY29sdW1uICA9IFlZUkhTTE9DIChSaHMsIE4pLmxhc3RfY29sdW1uOwlcCi0JICAoQ3VycmVudCkuZmlsZSAgICAgICAgID0gWVlSSFNMT0MgKFJocywgTikuZmlsZTsJCVwKLQl9CQkJCQkJCQlcCi0gICAgICBlbHNlCQkJCQkJCQlcCi0JewkJCQkJCQkJXAotCSAgKEN1cnJlbnQpLmZpcnN0X2xpbmUgICA9IChDdXJyZW50KS5sYXN0X2xpbmUgICA9CQlcCi0JICAgIFlZUkhTTE9DIChSaHMsIDApLmxhc3RfbGluZTsJCQkJXAotCSAgKEN1cnJlbnQpLmZpcnN0X2NvbHVtbiA9IChDdXJyZW50KS5sYXN0X2NvbHVtbiA9CQlcCi0JICAgIFlZUkhTTE9DIChSaHMsIDApLmxhc3RfY29sdW1uOwkJCQlcCi0JICAoQ3VycmVudCkuZmlsZSAgICAgICAgID0gWVlSSFNMT0MgKFJocywgMCkuZmlsZTsJCVwKLQl9CQkJCQkJCQlcCi0gICAgd2hpbGUgKFlZSUQgKDApKQotCi0KLQotZXh0ZXJuIHZvaWQgeXllcnJvcihjaGFyIGNvbnN0ICopOwotZXh0ZXJuIHZvaWQgeXllcnJvcmYoY2hhciBjb25zdCAqLCAuLi4pIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDEsIDIpKSk7Ci0KLWV4dGVybiBzdHJ1Y3QgZHRjX2ZpbGUgKnNyY3Bvc19maWxlOwotCi1zdHJ1Y3Qgc2VhcmNoX3BhdGggewotCWNvbnN0IGNoYXIgKmRpcjsgLyogTlVMTCBmb3IgY3VycmVudCBkaXJlY3RvcnkgKi8KLQlzdHJ1Y3Qgc2VhcmNoX3BhdGggKnByZXYsICpuZXh0OworICAgIHN0cnVjdCBzcmNmaWxlX3N0YXRlICpmaWxlOwogfTsKIAotZXh0ZXJuIHN0cnVjdCBkdGNfZmlsZSAqZHRjX29wZW5fZmlsZShjb25zdCBjaGFyICpmbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHNlYXJjaF9wYXRoICpzZWFyY2gpOwotZXh0ZXJuIHZvaWQgZHRjX2Nsb3NlX2ZpbGUoc3RydWN0IGR0Y19maWxlICpmaWxlKTsKKyNkZWZpbmUgWVlMVFlQRSBzdHJ1Y3Qgc3JjcG9zCisKKyNkZWZpbmUgWVlMTE9DX0RFRkFVTFQoQ3VycmVudCwgUmhzLCBOKQkJCQkJCVwKKwlkbyB7CQkJCQkJCQkJXAorCQlpZiAoTikgewkJCQkJCQlcCisJCQkoQ3VycmVudCkuZmlyc3RfbGluZSA9IFlZUkhTTE9DKFJocywgMSkuZmlyc3RfbGluZTsJXAorCQkJKEN1cnJlbnQpLmZpcnN0X2NvbHVtbiA9IFlZUkhTTE9DKFJocywgMSkuZmlyc3RfY29sdW1uOwlcCisJCQkoQ3VycmVudCkubGFzdF9saW5lID0gWVlSSFNMT0MoUmhzLCBOKS5sYXN0X2xpbmU7CVwKKwkJCShDdXJyZW50KS5sYXN0X2NvbHVtbiAgPSBZWVJIU0xPQyAoUmhzLCBOKS5sYXN0X2NvbHVtbjsJXAorCQkJKEN1cnJlbnQpLmZpbGUgPSBZWVJIU0xPQyhSaHMsIE4pLmZpbGU7CQkJXAorCQl9IGVsc2UgewkJCQkJCQlcCisJCQkoQ3VycmVudCkuZmlyc3RfbGluZSA9IChDdXJyZW50KS5sYXN0X2xpbmUgPQkJXAorCQkJCVlZUkhTTE9DKFJocywgMCkubGFzdF9saW5lOwkJCVwKKwkJCShDdXJyZW50KS5maXJzdF9jb2x1bW4gPSAoQ3VycmVudCkubGFzdF9jb2x1bW4gPQlcCisJCQkJWVlSSFNMT0MoUmhzLCAwKS5sYXN0X2NvbHVtbjsJCQlcCisJCQkoQ3VycmVudCkuZmlsZSA9IFlZUkhTTE9DIChSaHMsIDApLmZpbGU7CQlcCisJCX0JCQkJCQkJCVwKKwl9IHdoaWxlICgwKQorCisKKy8qCisgKiBGaWN0aW9uYWwgc291cmNlIHBvc2l0aW9uIHVzZWQgZm9yIElSIG5vZGVzIHRoYXQgYXJlCisgKiBjcmVhdGVkIHdpdGhvdXQgb3RoZXJ3aXNlIGtub3dpbmcgYSB0cnVlIHNvdXJjZSBwb3NpdGlvbi4KKyAqIEZvciBleGFtcGxlLGNvbnN0YW50IGRlZmluaXRpb25zIGZyb20gdGhlIGNvbW1hbmQgbGluZS4KKyAqLworZXh0ZXJuIHN0cnVjdCBzcmNwb3Mgc3JjcG9zX2VtcHR5OworCitleHRlcm4gdm9pZCBzcmNwb3NfdXBkYXRlKHN0cnVjdCBzcmNwb3MgKnBvcywgY29uc3QgY2hhciAqdGV4dCwgaW50IGxlbik7CitleHRlcm4gc3RydWN0IHNyY3BvcyAqc3JjcG9zX2NvcHkoc3RydWN0IHNyY3BvcyAqcG9zKTsKK2V4dGVybiBjaGFyICpzcmNwb3Nfc3RyaW5nKHN0cnVjdCBzcmNwb3MgKnBvcyk7CitleHRlcm4gdm9pZCBzcmNwb3NfZHVtcChzdHJ1Y3Qgc3JjcG9zICpwb3MpOworCitleHRlcm4gdm9pZCBzcmNwb3NfdmVycm9yKHN0cnVjdCBzcmNwb3MgKnBvcywgY2hhciBjb25zdCAqLCB2YV9saXN0IHZhKQorICAgICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAyLCAwKSkpOworZXh0ZXJuIHZvaWQgc3JjcG9zX2Vycm9yKHN0cnVjdCBzcmNwb3MgKnBvcywgY2hhciBjb25zdCAqLCAuLi4pCisgICAgIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDIsIDMpKSk7CitleHRlcm4gdm9pZCBzcmNwb3Nfd2FybihzdHJ1Y3Qgc3JjcG9zICpwb3MsIGNoYXIgY29uc3QgKiwgLi4uKQorICAgICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAyLCAzKSkpOworCisjZW5kaWYgLyogX1NSQ1BPU19IXyAqLwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9kdGMvdHJlZXNvdXJjZS5jIGIvc2NyaXB0cy9kdGMvdHJlZXNvdXJjZS5jCmluZGV4IDE1MjFmZjEuLmMwOWFhZmEgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvZHRjL3RyZWVzb3VyY2UuYworKysgYi9zY3JpcHRzL2R0Yy90cmVlc291cmNlLmMKQEAgLTMyLDggKzMyLDggQEAKIAl0aGVfYm9vdF9pbmZvID0gTlVMTDsKIAl0cmVlc291cmNlX2Vycm9yID0gMDsKIAotCXNyY3Bvc19maWxlID0gZHRjX29wZW5fZmlsZShmbmFtZSwgTlVMTCk7Ci0JeXlpbiA9IHNyY3Bvc19maWxlLT5maWxlOworCXNyY2ZpbGVfcHVzaChmbmFtZSk7CisJeXlpbiA9IGN1cnJlbnRfc3JjZmlsZS0+ZjsKIAogCWlmICh5eXBhcnNlKCkgIT0gMCkKIAkJZGllKCJVbmFibGUgdG8gcGFyc2UgaW5wdXQgdHJlZVxuIik7CkBAIC02MywyNiArNjMsMjAgQEAKIHsKIAljb25zdCBjaGFyICpzdHIgPSB2YWwudmFsOwogCWludCBpOwotCWludCBuZXdjaHVuayA9IDE7CiAJc3RydWN0IG1hcmtlciAqbSA9IHZhbC5tYXJrZXJzOwogCiAJYXNzZXJ0KHN0clt2YWwubGVuLTFdID09ICdcMCcpOwogCisJd2hpbGUgKG0gJiYgKG0tPm9mZnNldCA9PSAwKSkgeworCQlpZiAobS0+dHlwZSA9PSBMQUJFTCkKKwkJCWZwcmludGYoZiwgIiVzOiAiLCBtLT5yZWYpOworCQltID0gbS0+bmV4dDsKKwl9CisJZnByaW50ZihmLCAiXCIiKTsKKwogCWZvciAoaSA9IDA7IGkgPCAodmFsLmxlbi0xKTsgaSsrKSB7CiAJCWNoYXIgYyA9IHN0cltpXTsKIAotCQlpZiAobmV3Y2h1bmspIHsKLQkJCXdoaWxlIChtICYmIChtLT5vZmZzZXQgPD0gaSkpIHsKLQkJCQlpZiAobS0+dHlwZSA9PSBMQUJFTCkgewotCQkJCQlhc3NlcnQobS0+b2Zmc2V0ID09IGkpOwotCQkJCQlmcHJpbnRmKGYsICIlczogIiwgbS0+cmVmKTsKLQkJCQl9Ci0JCQkJbSA9IG0tPm5leHQ7Ci0JCQl9Ci0JCQlmcHJpbnRmKGYsICJcIiIpOwotCQkJbmV3Y2h1bmsgPSAwOwotCQl9Ci0KIAkJc3dpdGNoIChjKSB7CiAJCWNhc2UgJ1xhJzoKIAkJCWZwcmludGYoZiwgIlxcYSIpOwpAQCAtMTEzLDcgKzEwNywxNCBAQAogCQkJYnJlYWs7CiAJCWNhc2UgJ1wwJzoKIAkJCWZwcmludGYoZiwgIlwiLCAiKTsKLQkJCW5ld2NodW5rID0gMTsKKwkJCXdoaWxlIChtICYmIChtLT5vZmZzZXQgPCBpKSkgeworCQkJCWlmIChtLT50eXBlID09IExBQkVMKSB7CisJCQkJCWFzc2VydChtLT5vZmZzZXQgPT0gKGkrMSkpOworCQkJCQlmcHJpbnRmKGYsICIlczogIiwgbS0+cmVmKTsKKwkJCQl9CisJCQkJbSA9IG0tPm5leHQ7CisJCQl9CisJCQlmcHJpbnRmKGYsICJcIiIpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlpZiAoaXNwcmludChjKSkKQEAgLTIzNCwxMCArMjM1LDExIEBACiB7CiAJc3RydWN0IHByb3BlcnR5ICpwcm9wOwogCXN0cnVjdCBub2RlICpjaGlsZDsKKwlzdHJ1Y3QgbGFiZWwgKmw7CiAKIAl3cml0ZV9wcmVmaXgoZiwgbGV2ZWwpOwotCWlmICh0cmVlLT5sYWJlbCkKLQkJZnByaW50ZihmLCAiJXM6ICIsIHRyZWUtPmxhYmVsKTsKKwlmb3JfZWFjaF9sYWJlbCh0cmVlLT5sYWJlbHMsIGwpCisJCWZwcmludGYoZiwgIiVzOiAiLCBsLT5sYWJlbCk7CiAJaWYgKHRyZWUtPm5hbWUgJiYgKCp0cmVlLT5uYW1lKSkKIAkJZnByaW50ZihmLCAiJXMge1xuIiwgdHJlZS0+bmFtZSk7CiAJZWxzZQpAQCAtMjQ1LDggKzI0Nyw4IEBACiAKIAlmb3JfZWFjaF9wcm9wZXJ0eSh0cmVlLCBwcm9wKSB7CiAJCXdyaXRlX3ByZWZpeChmLCBsZXZlbCsxKTsKLQkJaWYgKHByb3AtPmxhYmVsKQotCQkJZnByaW50ZihmLCAiJXM6ICIsIHByb3AtPmxhYmVsKTsKKwkJZm9yX2VhY2hfbGFiZWwocHJvcC0+bGFiZWxzLCBsKQorCQkJZnByaW50ZihmLCAiJXM6ICIsIGwtPmxhYmVsKTsKIAkJZnByaW50ZihmLCAiJXMiLCBwcm9wLT5uYW1lKTsKIAkJd3JpdGVfcHJvcHZhbChmLCBwcm9wKTsKIAl9CkBAIC0yNjYsOCArMjY4LDEwIEBACiAJZnByaW50ZihmLCAiL2R0cy12MS87XG5cbiIpOwogCiAJZm9yIChyZSA9IGJpLT5yZXNlcnZlbGlzdDsgcmU7IHJlID0gcmUtPm5leHQpIHsKLQkJaWYgKHJlLT5sYWJlbCkKLQkJCWZwcmludGYoZiwgIiVzOiAiLCByZS0+bGFiZWwpOworCQlzdHJ1Y3QgbGFiZWwgKmw7CisKKwkJZm9yX2VhY2hfbGFiZWwocmUtPmxhYmVscywgbCkKKwkJCWZwcmludGYoZiwgIiVzOiAiLCBsLT5sYWJlbCk7CiAJCWZwcmludGYoZiwgIi9tZW1yZXNlcnZlL1x0MHglMDE2bGx4IDB4JTAxNmxseDtcbiIsCiAJCQkodW5zaWduZWQgbG9uZyBsb25nKXJlLT5yZS5hZGRyZXNzLAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylyZS0+cmUuc2l6ZSk7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2R0Yy91dGlsLmMgYi9zY3JpcHRzL2R0Yy91dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdhYzI3ZAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvZHRjL3V0aWwuYwpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDggSm9uIExvZWxpZ2VyLCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJ1dGlsLmgiCisKK2NoYXIgKnhzdHJkdXAoY29uc3QgY2hhciAqcykKK3sKKwlpbnQgbGVuID0gc3RybGVuKHMpICsgMTsKKwljaGFyICpkdXAgPSB4bWFsbG9jKGxlbik7CisKKwltZW1jcHkoZHVwLCBzLCBsZW4pOworCisJcmV0dXJuIGR1cDsKK30KKworY2hhciAqam9pbl9wYXRoKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IGxlbnAgPSBzdHJsZW4ocGF0aCk7CisJaW50IGxlbm4gPSBzdHJsZW4obmFtZSk7CisJaW50IGxlbjsKKwlpbnQgbmVlZHNsYXNoID0gMTsKKwljaGFyICpzdHI7CisKKwlsZW4gPSBsZW5wICsgbGVubiArIDI7CisJaWYgKChsZW5wID4gMCkgJiYgKHBhdGhbbGVucC0xXSA9PSAnLycpKSB7CisJCW5lZWRzbGFzaCA9IDA7CisJCWxlbi0tOworCX0KKworCXN0ciA9IHhtYWxsb2MobGVuKTsKKwltZW1jcHkoc3RyLCBwYXRoLCBsZW5wKTsKKwlpZiAobmVlZHNsYXNoKSB7CisJCXN0cltsZW5wXSA9ICcvJzsKKwkJbGVucCsrOworCX0KKwltZW1jcHkoc3RyK2xlbnAsIG5hbWUsIGxlbm4rMSk7CisJcmV0dXJuIHN0cjsKK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMvZHRjL3V0aWwuaCBiL3NjcmlwdHMvZHRjL3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2VhZDg0Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9kdGMvdXRpbC5oCkBAIC0wLDAgKzEsNTYgQEAKKyNpZm5kZWYgX1VUSUxfSAorI2RlZmluZSBfVVRJTF9ICisKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCBKb24gTG9lbGlnZXIsIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0EKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKSBkaWUoY2hhciAqIHN0ciwgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwl2YV9zdGFydChhcCwgc3RyKTsKKwlmcHJpbnRmKHN0ZGVyciwgIkZBVEFMIEVSUk9SOiAiKTsKKwl2ZnByaW50ZihzdGRlcnIsIHN0ciwgYXApOworCWV4aXQoMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqeG1hbGxvYyhzaXplX3QgbGVuKQoreworCXZvaWQgKm5ldyA9IG1hbGxvYyhsZW4pOworCisJaWYgKCFuZXcpCisJCWRpZSgibWFsbG9jKCkgZmFpbGVkXG4iKTsKKworCXJldHVybiBuZXc7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqeHJlYWxsb2Modm9pZCAqcCwgc2l6ZV90IGxlbikKK3sKKwl2b2lkICpuZXcgPSByZWFsbG9jKHAsIGxlbik7CisKKwlpZiAoIW5ldykKKwkJZGllKCJyZWFsbG9jKCkgZmFpbGVkIChsZW49JWQpXG4iLCBsZW4pOworCisJcmV0dXJuIG5ldzsKK30KKworZXh0ZXJuIGNoYXIgKnhzdHJkdXAoY29uc3QgY2hhciAqcyk7CitleHRlcm4gY2hhciAqam9pbl9wYXRoKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKm5hbWUpOworCisjZW5kaWYgLyogX1VUSUxfSCAqLwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9kdGMvdmVyc2lvbl9nZW4uaCBiL3NjcmlwdHMvZHRjL3ZlcnNpb25fZ2VuLmgKaW5kZXggNjU4ZmY0MjQuLjYxNThiODYgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvZHRjL3ZlcnNpb25fZ2VuLmgKKysrIGIvc2NyaXB0cy9kdGMvdmVyc2lvbl9nZW4uaApAQCAtMSArMSBAQAotI2RlZmluZSBEVENfVkVSU0lPTiAiRFRDIDEuMi4wIgorI2RlZmluZSBEVENfVkVSU0lPTiAiRFRDIDEuMi4wLWczN2MwYjZhMCIKZGlmZiAtLWdpdCBhL3NjcmlwdHMvZ2Vua3N5bXMvcGFyc2UuY19zaGlwcGVkIGIvc2NyaXB0cy9nZW5rc3ltcy9wYXJzZS5jX3NoaXBwZWQKaW5kZXggZWFlZTQ0ZS4uODA5Yjk0OSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9nZW5rc3ltcy9wYXJzZS5jX3NoaXBwZWQKKysrIGIvc2NyaXB0cy9nZW5rc3ltcy9wYXJzZS5jX3NoaXBwZWQKQEAgLTE2MCw3ICsxNjAsNyBAQAogCiAKICNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlICJnZW5rc3ltcy5oIgogCiBzdGF0aWMgaW50IGlzX3R5cGVkZWY7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkgYi9zY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkKaW5kZXggMTBkN2RjNy4uMDlhMjY1YyAxMDA2NDQKLS0tIGEvc2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55CisrKyBiL3NjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueQpAQCAtMjQsNyArMjQsNyBAQAogJXsKIAogI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgImdlbmtzeW1zLmgiCiAKIHN0YXRpYyBpbnQgaXNfdHlwZWRlZjsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvaGVhZGVycy5zaCBiL3NjcmlwdHMvaGVhZGVycy5zaAppbmRleCAxZGRjZGQzLi45NzhiNDJiIDEwMDc1NQotLS0gYS9zY3JpcHRzL2hlYWRlcnMuc2gKKysrIGIvc2NyaXB0cy9oZWFkZXJzLnNoCkBAIC0xMyw3ICsxMyw3IEBACiAJZmkKIH0KIAotYXJjaHM9JChscyAke3NyY3RyZWV9L2FyY2gpCithcmNocz0ke0hEUl9BUkNIX0xJU1Q6LSQobHMgJHtzcmN0cmVlfS9hcmNoKX0KIAogZm9yIGFyY2ggaW4gJHthcmNoc307IGRvCiAJY2FzZSAke2FyY2h9IGluCmRpZmYgLS1naXQgYS9zY3JpcHRzL2hlYWRlcnNfY2hlY2sucGwgYi9zY3JpcHRzL2hlYWRlcnNfY2hlY2sucGwKaW5kZXggNTBkNmNmZC4uNzk1N2U3YSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9oZWFkZXJzX2NoZWNrLnBsCisrKyBiL3NjcmlwdHMvaGVhZGVyc19jaGVjay5wbApAQCAtNjQsMTAgKzY0LDEwIEBACiAKIHN1YiBjaGVja19kZWNsYXJhdGlvbnMKIHsKLQlpZiAoJGxpbmUgPX5tL15ccypleHRlcm5cYi8pIHsKKwlpZiAoJGxpbmUgPX5tL14oXHMqZXh0ZXJufHVuc2lnbmVkfGNoYXJ8c2hvcnR8aW50fGxvbmd8dm9pZClcYi8pIHsKIAkJcHJpbnRmIFNUREVSUiAiJGZpbGVuYW1lOiRsaW5lbm86ICIgLgotCQkgICAgICAgICAgICAgICJ1c2Vyc3BhY2UgY2Fubm90IGNhbGwgZnVuY3Rpb24gb3IgdmFyaWFibGUgIiAuCi0JCSAgICAgICAgICAgICAgImRlZmluZWQgaW4gdGhlIGtlcm5lbFxuIjsKKwkJCSAgICAgICJ1c2Vyc3BhY2UgY2Fubm90IHJlZmVyZW5jZSBmdW5jdGlvbiBvciAiIC4KKwkJCSAgICAgICJ2YXJpYWJsZSBkZWZpbmVkIGluIHRoZSBrZXJuZWxcbiI7CiAJfQogfQogCmRpZmYgLS1naXQgYS9zY3JpcHRzL2hlYWRlcnNfaW5zdGFsbC5wbCBiL3NjcmlwdHMvaGVhZGVyc19pbnN0YWxsLnBsCmluZGV4IDRjYTNiZTMuLmVmYjNiZTEgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvaGVhZGVyc19pbnN0YWxsLnBsCisrKyBiL3NjcmlwdHMvaGVhZGVyc19pbnN0YWxsLnBsCkBAIC00NSw2ICs0NSwxMyBAQAogCWNsb3NlICRpbjsKIAogCXN5c3RlbSAkdW5pZmRlZiAuICIgJHRtcGZpbGUgPiAkaW5zdGFsbGRpci8kZmlsZSI7CisJIyB1bmlmZGVmIHdpbGwgZXhpdCAwIG9uIHN1Y2Nlc3MsIGFuZCB3aWxsIGV4aXQgMSB3aGVuIHRoZQorCSMgZmlsZSB3YXMgcHJvY2Vzc2VkIHN1Y2Nlc3NmdWxseSBidXQgbm8gY2hhbmdlcyB3ZXJlIG1hZGUsCisJIyBzbyBhYm9ydCBvbmx5IHdoZW4gaXQncyBoaWdoZXIgdGhhbiB0aGF0LgorCW15ICRlID0gJD8gPj4gODsKKwlpZiAoJGUgPiAxKSB7CisJCWRpZSAiJHRtcGZpbGU6ICQhXG4iOworCX0KIAl1bmxpbmsgJHRtcGZpbGU7CiB9CiBleGl0IDA7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvY29uZi5jIGIvc2NyaXB0cy9rY29uZmlnL2NvbmYuYwppbmRleCA1NDU5YTM4Li42NTkzMjZjIDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvY29uZi5jCisrKyBiL3NjcmlwdHMva2NvbmZpZy9jb25mLmMKQEAgLTUyOSw4ICs1MjksNiBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2Ugc2F2ZWRlZmNvbmZpZzoKLQkJY29uZl9yZWFkKE5VTEwpOwotCQlicmVhazsKIAljYXNlIHNpbGVudG9sZGNvbmZpZzoKIAljYXNlIG9sZGFza2NvbmZpZzoKIAljYXNlIG9sZGNvbmZpZzoKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9jb25mZGF0YS5jIGIvc2NyaXB0cy9rY29uZmlnL2NvbmZkYXRhLmMKaW5kZXggOWRmODAxMS4uNjFjMzViZiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL2NvbmZkYXRhLmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL2NvbmZkYXRhLmMKQEAgLTQ0MCwxMiArNDQwLDExIEBACiAJZnB1dHMoIlwiXG4iLCBvdXQpOwogfQogCi1zdGF0aWMgdm9pZCBjb25mX3dyaXRlX3N5bWJvbChzdHJ1Y3Qgc3ltYm9sICpzeW0sIGVudW0gc3ltYm9sX3R5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEUgKm91dCwgYm9vbCB3cml0ZV9ubykKK3N0YXRpYyB2b2lkIGNvbmZfd3JpdGVfc3ltYm9sKHN0cnVjdCBzeW1ib2wgKnN5bSwgRklMRSAqb3V0LCBib29sIHdyaXRlX25vKQogewogCWNvbnN0IGNoYXIgKnN0cjsKIAotCXN3aXRjaCAodHlwZSkgeworCXN3aXRjaCAoc3ltLT50eXBlKSB7CiAJY2FzZSBTX0JPT0xFQU46CiAJY2FzZSBTX1RSSVNUQVRFOgogCQlzd2l0Y2ggKHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKSkgewpAQCAtNTMyLDcgKzUzMSw3IEBACiAJCQkJCQlnb3RvIG5leHRfbWVudTsKIAkJCQl9CiAJCQl9Ci0JCQljb25mX3dyaXRlX3N5bWJvbChzeW0sIHN5bS0+dHlwZSwgb3V0LCB0cnVlKTsKKwkJCWNvbmZfd3JpdGVfc3ltYm9sKHN5bSwgb3V0LCB0cnVlKTsKIAkJfQogbmV4dF9tZW51OgogCQlpZiAobWVudS0+bGlzdCAhPSBOVUxMKSB7CkBAIC01NjEsNyArNTYwLDYgQEAKIAljb25zdCBjaGFyICpiYXNlbmFtZTsKIAljb25zdCBjaGFyICpzdHI7CiAJY2hhciBkaXJuYW1lW1BBVEhfTUFYKzFdLCB0bXBuYW1lW1BBVEhfTUFYKzFdLCBuZXduYW1lW1BBVEhfTUFYKzFdOwotCWVudW0gc3ltYm9sX3R5cGUgdHlwZTsKIAl0aW1lX3Qgbm93OwogCWludCB1c2VfdGltZXN0YW1wID0gMTsKIAljaGFyICplbnY7CkBAIC02MzMsMTQgKzYzMSw4IEBACiAJCQlpZiAoIShzeW0tPmZsYWdzICYgU1lNQk9MX1dSSVRFKSkKIAkJCQlnb3RvIG5leHQ7CiAJCQlzeW0tPmZsYWdzICY9IH5TWU1CT0xfV1JJVEU7Ci0JCQl0eXBlID0gc3ltLT50eXBlOwotCQkJaWYgKHR5cGUgPT0gU19UUklTVEFURSkgewotCQkJCXN5bV9jYWxjX3ZhbHVlKG1vZHVsZXNfc3ltKTsKLQkJCQlpZiAobW9kdWxlc19zeW0tPmN1cnIudHJpID09IG5vKQotCQkJCQl0eXBlID0gU19CT09MRUFOOwotCQkJfQogCQkJLyogV3JpdGUgY29uZmlnIHN5bWJvbCB0byBmaWxlICovCi0JCQljb25mX3dyaXRlX3N5bWJvbChzeW0sIHR5cGUsIG91dCwgdHJ1ZSk7CisJCQljb25mX3dyaXRlX3N5bWJvbChzeW0sIG91dCwgdHJ1ZSk7CiAJCX0KIAogbmV4dDoKQEAgLTgzMyw4ICs4MjUsNyBAQAogCQkgICAgICAgIiAqIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIEMgY29uZmlnOiBkb24ndCBlZGl0XG4iCiAJCSAgICAgICAiICogJXNcbiIKIAkJICAgICAgICIgKiAlcyIKLQkJICAgICAgICIgKi9cbiIKLQkJICAgICAgICIjZGVmaW5lIEFVVE9DT05GX0lOQ0xVREVEXG4iLAorCQkgICAgICAgIiAqL1xuIiwKIAkJICAgICAgIHJvb3RtZW51LnByb21wdC0+dGV4dCwgY3RpbWUoJm5vdykpOwogCiAJZm9yX2FsbF9zeW1ib2xzKGksIHN5bSkgewpAQCAtODQzLDcgKzgzNCw3IEBACiAJCQljb250aW51ZTsKIAogCQkvKiB3cml0ZSBzeW1ib2wgdG8gY29uZmlnIGZpbGUgKi8KLQkJY29uZl93cml0ZV9zeW1ib2woc3ltLCBzeW0tPnR5cGUsIG91dCwgZmFsc2UpOworCQljb25mX3dyaXRlX3N5bWJvbChzeW0sIG91dCwgZmFsc2UpOwogCiAJCS8qIHVwZGF0ZSBhdXRvY29uZiBhbmQgdHJpc3RhdGUgZmlsZXMgKi8KIAkJc3dpdGNoIChzeW0tPnR5cGUpIHsKQEAgLTk0Niw3ICs5MzcsNyBAQAogCWludCBjbnQsIGRlZjsKIAogCS8qCi0JICogSWYgY2hvaWNlIGlzIG1vZCB0aGVuIHdlIG1heSBoYXZlIG1vcmUgaXRlbXMgc2xlY3RlZAorCSAqIElmIGNob2ljZSBpcyBtb2QgdGhlbiB3ZSBtYXkgaGF2ZSBtb3JlIGl0ZW1zIHNlbGVjdGVkCiAJICogYW5kIGlmIG5vIHRoZW4gbm8tb25lLgogCSAqIEluIGJvdGggY2FzZXMgc3RvcC4KIAkgKi8KQEAgLTEwNDIsMTAgKzEwMzMsMTAgQEAKIAogCS8qCiAJICogV2UgaGF2ZSBkaWZmZXJlbnQgdHlwZSBvZiBjaG9pY2UgYmxvY2tzLgotCSAqIElmIGN1cnIudHJpIGVxdWFsIHRvIG1vZCB0aGVuIHdlIGNhbiBzZWxlY3Qgc2V2ZXJhbAorCSAqIElmIGN1cnIudHJpIGVxdWFscyB0byBtb2QgdGhlbiB3ZSBjYW4gc2VsZWN0IHNldmVyYWwKIAkgKiBjaG9pY2Ugc3ltYm9scyBpbiBvbmUgYmxvY2suCiAJICogSW4gdGhpcyBjYXNlIHdlIGRvIG5vdGhpbmcuCi0JICogSWYgY3Vyci50cmkgZXF1YWwgeWVzIHRoZW4gb25seSBvbmUgc3ltYm9sIGNhbiBiZQorCSAqIElmIGN1cnIudHJpIGVxdWFscyB5ZXMgdGhlbiBvbmx5IG9uZSBzeW1ib2wgY2FuIGJlCiAJICogc2VsZWN0ZWQgaW4gYSBjaG9pY2UgYmxvY2sgYW5kIHdlIHNldCBpdCB0byB5ZXMsCiAJICogYW5kIHRoZSByZXN0IHRvIG5vLgogCSAqLwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2V4cHIuYyBiL3NjcmlwdHMva2NvbmZpZy9leHByLmMKaW5kZXggMzMwZTdjMC4uMDAxMDAzNCAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL2V4cHIuYworKysgYi9zY3JpcHRzL2tjb25maWcvZXhwci5jCkBAIC02NCw3ICs2NCw3IEBACiAJcmV0dXJuIGUyID8gZXhwcl9hbGxvY190d28oRV9PUiwgZTEsIGUyKSA6IGUxOwogfQogCi1zdHJ1Y3QgZXhwciAqZXhwcl9jb3B5KHN0cnVjdCBleHByICpvcmcpCitzdHJ1Y3QgZXhwciAqZXhwcl9jb3B5KGNvbnN0IHN0cnVjdCBleHByICpvcmcpCiB7CiAJc3RydWN0IGV4cHIgKmU7CiAKQEAgLTEwMTMsNiArMTAxMyw0OCBAQAogI2VuZGlmCiB9CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGV4cHIgKgorZXhwcl9nZXRfbGVmdG1vc3Rfc3ltYm9sKGNvbnN0IHN0cnVjdCBleHByICplKQoreworCisJaWYgKGUgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwl3aGlsZSAoZS0+dHlwZSAhPSBFX1NZTUJPTCkKKwkJZSA9IGUtPmxlZnQuZXhwcjsKKworCXJldHVybiBleHByX2NvcHkoZSk7Cit9CisKKy8qCisgKiBHaXZlbiBleHByZXNzaW9uIGBlMScgYW5kIGBlMicsIHJldHVybnMgdGhlIGxlYWYgb2YgdGhlIGxvbmdlc3QKKyAqIHN1Yi1leHByZXNzaW9uIG9mIGBlMScgbm90IGNvbnRhaW5pbmcgJ2UyLgorICovCitzdHJ1Y3QgZXhwciAqZXhwcl9zaW1wbGlmeV91bm1ldF9kZXAoc3RydWN0IGV4cHIgKmUxLCBzdHJ1Y3QgZXhwciAqZTIpCit7CisJc3RydWN0IGV4cHIgKnJldDsKKworCXN3aXRjaCAoZTEtPnR5cGUpIHsKKwljYXNlIEVfT1I6CisJCXJldHVybiBleHByX2FsbG9jX2FuZCgKKwkJICAgIGV4cHJfc2ltcGxpZnlfdW5tZXRfZGVwKGUxLT5sZWZ0LmV4cHIsIGUyKSwKKwkJICAgIGV4cHJfc2ltcGxpZnlfdW5tZXRfZGVwKGUxLT5yaWdodC5leHByLCBlMikpOworCWNhc2UgRV9BTkQ6IHsKKwkJc3RydWN0IGV4cHIgKmU7CisJCWUgPSBleHByX2FsbG9jX2FuZChleHByX2NvcHkoZTEpLCBleHByX2NvcHkoZTIpKTsKKwkJZSA9IGV4cHJfZWxpbWluYXRlX2R1cHMoZSk7CisJCXJldCA9ICghZXhwcl9lcShlLCBlMSkpID8gZTEgOiBOVUxMOworCQlleHByX2ZyZWUoZSk7CisJCWJyZWFrOworCQl9CisJZGVmYXVsdDoKKwkJcmV0ID0gZTE7CisJCWJyZWFrOworCX0KKworCXJldHVybiBleHByX2dldF9sZWZ0bW9zdF9zeW1ib2wocmV0KTsKK30KKwogdm9pZCBleHByX3ByaW50KHN0cnVjdCBleHByICplLCB2b2lkICgqZm4pKHZvaWQgKiwgc3RydWN0IHN5bWJvbCAqLCBjb25zdCBjaGFyICopLCB2b2lkICpkYXRhLCBpbnQgcHJldnRva2VuKQogewogCWlmICghZSkgewpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2V4cHIuaCBiL3NjcmlwdHMva2NvbmZpZy9leHByLmgKaW5kZXggZTU3ODI2Yy4uM2QyMzhkYiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL2V4cHIuaAorKysgYi9zY3JpcHRzL2tjb25maWcvZXhwci5oCkBAIC0xOTIsNyArMTkyLDcgQEAKIHN0cnVjdCBleHByICpleHByX2FsbG9jX2NvbXAoZW51bSBleHByX3R5cGUgdHlwZSwgc3RydWN0IHN5bWJvbCAqczEsIHN0cnVjdCBzeW1ib2wgKnMyKTsKIHN0cnVjdCBleHByICpleHByX2FsbG9jX2FuZChzdHJ1Y3QgZXhwciAqZTEsIHN0cnVjdCBleHByICplMik7CiBzdHJ1Y3QgZXhwciAqZXhwcl9hbGxvY19vcihzdHJ1Y3QgZXhwciAqZTEsIHN0cnVjdCBleHByICplMik7Ci1zdHJ1Y3QgZXhwciAqZXhwcl9jb3B5KHN0cnVjdCBleHByICpvcmcpOworc3RydWN0IGV4cHIgKmV4cHJfY29weShjb25zdCBzdHJ1Y3QgZXhwciAqb3JnKTsKIHZvaWQgZXhwcl9mcmVlKHN0cnVjdCBleHByICplKTsKIGludCBleHByX2VxKHN0cnVjdCBleHByICplMSwgc3RydWN0IGV4cHIgKmUyKTsKIHZvaWQgZXhwcl9lbGltaW5hdGVfZXEoc3RydWN0IGV4cHIgKiplcDEsIHN0cnVjdCBleHByICoqZXAyKTsKQEAgLTIwNyw2ICsyMDcsNyBAQAogc3RydWN0IGV4cHIgKmV4cHJfZXh0cmFjdF9lcV9vcihzdHJ1Y3QgZXhwciAqKmVwMSwgc3RydWN0IGV4cHIgKiplcDIpOwogdm9pZCBleHByX2V4dHJhY3RfZXEoZW51bSBleHByX3R5cGUgdHlwZSwgc3RydWN0IGV4cHIgKiplcCwgc3RydWN0IGV4cHIgKiplcDEsIHN0cnVjdCBleHByICoqZXAyKTsKIHN0cnVjdCBleHByICpleHByX3RyYW5zX2NvbXBhcmUoc3RydWN0IGV4cHIgKmUsIGVudW0gZXhwcl90eXBlIHR5cGUsIHN0cnVjdCBzeW1ib2wgKnN5bSk7CitzdHJ1Y3QgZXhwciAqZXhwcl9zaW1wbGlmeV91bm1ldF9kZXAoc3RydWN0IGV4cHIgKmUxLCBzdHJ1Y3QgZXhwciAqZTIpOwogCiB2b2lkIGV4cHJfZnByaW50KHN0cnVjdCBleHByICplLCBGSUxFICpvdXQpOwogc3RydWN0IGdzdHI7IC8qIGZvcndhcmQgKi8KZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9sa2MuaCBiL3NjcmlwdHMva2NvbmZpZy9sa2MuaAppbmRleCAzZjcyNDBkLi5mZWJmMGM5IDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvbGtjLmgKKysrIGIvc2NyaXB0cy9rY29uZmlnL2xrYy5oCkBAIC0xNCw2ICsxNCw3IEBACiBzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmdldHRleHQoY29uc3QgY2hhciAqdHh0KSB7IHJldHVybiB0eHQ7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCB0ZXh0ZG9tYWluKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUpIHt9CiBzdGF0aWMgaW5saW5lIHZvaWQgYmluZHRleHRkb21haW4oY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZGlyKSB7fQorc3RhdGljIGlubGluZSBjaGFyICpiaW5kX3RleHRkb21haW5fY29kZXNldChjb25zdCBjaGFyICpkbiwgY2hhciAqYykgeyByZXR1cm4gYzsgfQogI2VuZGlmCiAKICNpZmRlZiBfX2NwbHVzcGx1cwpAQCAtNjcsMTAgKzY4LDEyIEBACiAJZW51bSBzeW1ib2xfdHlwZSBzdHlwZTsKIH07CiAKKyNpZmRlZiBZWURFQlVHCitleHRlcm4gaW50IHpjb25mZGVidWc7CisjZW5kaWYKKwogaW50IHpjb25mcGFyc2Uodm9pZCk7CiB2b2lkIHpjb25mZHVtcChGSUxFICpvdXQpOwotCi1leHRlcm4gaW50IHpjb25mZGVidWc7CiB2b2lkIHpjb25mX3N0YXJ0aGVscCh2b2lkKTsKIEZJTEUgKnpjb25mX2ZvcGVuKGNvbnN0IGNoYXIgKm5hbWUpOwogdm9pZCB6Y29uZl9pbml0c2Nhbihjb25zdCBjaGFyICpuYW1lKTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9tZW51LmMgYi9zY3JpcHRzL2tjb25maWcvbWVudS5jCmluZGV4IDVmNzdkY2IuLjVmZGYxMGQgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9tZW51LmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL21lbnUuYwpAQCAtMjAzLDcgKzIwMyw3IEBACiAJfQogfQogCi1zdGF0aWMgaW50IG1lbnVfcmFuZ2VfdmFsaWRfc3ltKHN0cnVjdCBzeW1ib2wgKnN5bSwgc3RydWN0IHN5bWJvbCAqc3ltMikKK3N0YXRpYyBpbnQgbWVudV92YWxpZGF0ZV9udW1iZXIoc3RydWN0IHN5bWJvbCAqc3ltLCBzdHJ1Y3Qgc3ltYm9sICpzeW0yKQogewogCXJldHVybiBzeW0yLT50eXBlID09IFNfSU5UIHx8IHN5bTItPnR5cGUgPT0gU19IRVggfHwKIAkgICAgICAgKHN5bTItPnR5cGUgPT0gU19VTktOT1dOICYmIHN5bV9zdHJpbmdfdmFsaWQoc3ltLCBzeW0yLT5uYW1lKSk7CkBAIC0yMjEsNiArMjIxLDE1IEBACiAJCQkJcHJvcF93YXJuKHByb3AsCiAJCQkJICAgICJkZWZhdWx0IGZvciBjb25maWcgc3ltYm9sICclcyciCiAJCQkJICAgICIgbXVzdCBiZSBhIHNpbmdsZSBzeW1ib2wiLCBzeW0tPm5hbWUpOworCQkJaWYgKHByb3AtPmV4cHItPnR5cGUgIT0gRV9TWU1CT0wpCisJCQkJYnJlYWs7CisJCQlzeW0yID0gcHJvcF9nZXRfc3ltYm9sKHByb3ApOworCQkJaWYgKHN5bS0+dHlwZSA9PSBTX0hFWCB8fCBzeW0tPnR5cGUgPT0gU19JTlQpIHsKKwkJCQlpZiAoIW1lbnVfdmFsaWRhdGVfbnVtYmVyKHN5bSwgc3ltMikpCisJCQkJCXByb3Bfd2Fybihwcm9wLAorCQkJCQkgICAgIiclcyc6IG51bWJlciBpcyBpbnZhbGlkIiwKKwkJCQkJICAgIHN5bS0+bmFtZSk7CisJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBQX1NFTEVDVDoKIAkJCXN5bTIgPSBwcm9wX2dldF9zeW1ib2wocHJvcCk7CkBAIC0yNDAsOCArMjQ5LDggQEAKIAkJCWlmIChzeW0tPnR5cGUgIT0gU19JTlQgJiYgc3ltLT50eXBlICE9IFNfSEVYKQogCQkJCXByb3Bfd2Fybihwcm9wLCAicmFuZ2UgaXMgb25seSBhbGxvd2VkICIKIAkJCQkgICAgICAgICAgICAgICAgImZvciBpbnQgb3IgaGV4IHN5bWJvbHMiKTsKLQkJCWlmICghbWVudV9yYW5nZV92YWxpZF9zeW0oc3ltLCBwcm9wLT5leHByLT5sZWZ0LnN5bSkgfHwKLQkJCSAgICAhbWVudV9yYW5nZV92YWxpZF9zeW0oc3ltLCBwcm9wLT5leHByLT5yaWdodC5zeW0pKQorCQkJaWYgKCFtZW51X3ZhbGlkYXRlX251bWJlcihzeW0sIHByb3AtPmV4cHItPmxlZnQuc3ltKSB8fAorCQkJICAgICFtZW51X3ZhbGlkYXRlX251bWJlcihzeW0sIHByb3AtPmV4cHItPnJpZ2h0LnN5bSkpCiAJCQkJcHJvcF93YXJuKHByb3AsICJyYW5nZSBpcyBpbnZhbGlkIik7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9uY29uZi5jIGIvc2NyaXB0cy9rY29uZmlnL25jb25mLmMKaW5kZXggMjcyYTk4Ny4uZGI1NjM3NyAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL25jb25mLmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL25jb25mLmMKQEAgLTI0OCw3ICsyNDgsNyBAQAogIk9ubHkgcmVsZXZhbnQgbGluZXMgYXJlIHNob3duLlxuIgogIlxuXG4iCiAiU2VhcmNoIGV4YW1wbGVzOlxuIgotIkV4YW1wbGVzOiBVU0IgICA9ID4gZmluZCBhbGwgc3ltYm9scyBjb250YWluaW5nIFVTQlxuIgorIkV4YW1wbGVzOiBVU0IgID0+IGZpbmQgYWxsIHN5bWJvbHMgY29udGFpbmluZyBVU0JcbiIKICIgICAgICAgICAgXlVTQiA9PiBmaW5kIGFsbCBzeW1ib2xzIHN0YXJ0aW5nIHdpdGggVVNCXG4iCiAiICAgICAgICAgIFVTQiQgPT4gZmluZCBhbGwgc3ltYm9scyBlbmRpbmcgd2l0aCBVU0JcbiIKICJcbiIpOwpAQCAtMTI2Niw5ICsxMjY2LDEzIEBACiAJCQlpZiAoY2hpbGQtPnN5bSA9PSBzeW1fZ2V0X2Nob2ljZV92YWx1ZShtZW51LT5zeW0pKQogCQkJCWl0ZW1fbWFrZShjaGlsZCwgJzonLCAiPFg+ICVzIiwKIAkJCQkJCV8obWVudV9nZXRfcHJvbXB0KGNoaWxkKSkpOwotCQkJZWxzZQorCQkJZWxzZSBpZiAoY2hpbGQtPnN5bSkKIAkJCQlpdGVtX21ha2UoY2hpbGQsICc6JywgIiAgICAlcyIsCiAJCQkJCQlfKG1lbnVfZ2V0X3Byb21wdChjaGlsZCkpKTsKKwkJCWVsc2UKKwkJCQlpdGVtX21ha2UoY2hpbGQsICc6JywgIioqKiAlcyAqKioiLAorCQkJCQkJXyhtZW51X2dldF9wcm9tcHQoY2hpbGQpKSk7CisKIAkJCWlmIChjaGlsZC0+c3ltID09IGFjdGl2ZSl7CiAJCQkJbGFzdF90b3Bfcm93ID0gdG9wX3JvdyhjdXJzZXNfbWVudSk7CiAJCQkJc2VsZWN0ZWRfaW5kZXggPSBpOwpAQCAtMTMzNCw3ICsxMzM4LDcgQEAKIAkJCWJyZWFrOwogCiAJCWNoaWxkID0gaXRlbV9kYXRhKCk7Ci0JCWlmICghY2hpbGQgfHwgIW1lbnVfaXNfdmlzaWJsZShjaGlsZCkpCisJCWlmICghY2hpbGQgfHwgIW1lbnVfaXNfdmlzaWJsZShjaGlsZCkgfHwgIWNoaWxkLT5zeW0pCiAJCQljb250aW51ZTsKIAkJc3dpdGNoIChyZXMpIHsKIAkJY2FzZSAnICc6CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvc3ltYm9sLmMgYi9zY3JpcHRzL2tjb25maWcvc3ltYm9sLmMKaW5kZXggYWY2ZTlmMy4uYTc5NmM5NSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL3N5bWJvbC5jCisrKyBiL3NjcmlwdHMva2NvbmZpZy9zeW1ib2wuYwpAQCAtMzUxLDEyICszNTEsMTYgQEAKIAkJCX0KIAkJY2FsY19uZXd2YWw6CiAJCQlpZiAoc3ltLT5kaXJfZGVwLnRyaSA9PSBubyAmJiBzeW0tPnJldl9kZXAudHJpICE9IG5vKSB7CisJCQkJc3RydWN0IGV4cHIgKmU7CisJCQkJZSA9IGV4cHJfc2ltcGxpZnlfdW5tZXRfZGVwKHN5bS0+cmV2X2RlcC5leHByLAorCQkJCSAgICBzeW0tPmRpcl9kZXAuZXhwcik7CiAJCQkJZnByaW50ZihzdGRlcnIsICJ3YXJuaW5nOiAoIik7Ci0JCQkJZXhwcl9mcHJpbnQoc3ltLT5yZXZfZGVwLmV4cHIsIHN0ZGVycik7CisJCQkJZXhwcl9mcHJpbnQoZSwgc3RkZXJyKTsKIAkJCQlmcHJpbnRmKHN0ZGVyciwgIikgc2VsZWN0cyAlcyB3aGljaCBoYXMgdW5tZXQgZGlyZWN0IGRlcGVuZGVuY2llcyAoIiwKIAkJCQkJc3ltLT5uYW1lKTsKIAkJCQlleHByX2ZwcmludChzeW0tPmRpcl9kZXAuZXhwciwgc3RkZXJyKTsKIAkJCQlmcHJpbnRmKHN0ZGVyciwgIilcbiIpOworCQkJCWV4cHJfZnJlZShlKTsKIAkJCX0KIAkJCW5ld3ZhbC50cmkgPSBFWFBSX09SKG5ld3ZhbC50cmksIHN5bS0+cmV2X2RlcC50cmkpOwogCQl9CkBAIC02ODYsNyArNjkwLDcgQEAKIAkJc3dpdGNoIChzeW0tPnR5cGUpIHsKIAkJY2FzZSBTX0JPT0xFQU46CiAJCWNhc2UgU19UUklTVEFURToKLQkJCS8qIFRoZSB2aXNpYmlsaXR5IGltYXkgbGltaXQgdGhlIHZhbHVlIGZyb20geWVzID0+IG1vZCAqLworCQkJLyogVGhlIHZpc2liaWxpdHkgbWF5IGxpbWl0IHRoZSB2YWx1ZSBmcm9tIHllcyA9PiBtb2QgKi8KIAkJCXZhbCA9IEVYUFJfQU5EKGV4cHJfY2FsY192YWx1ZShwcm9wLT5leHByKSwgcHJvcC0+dmlzaWJsZS50cmkpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9zY3JpcHRzL21rdWJvb3Quc2ggYi9zY3JpcHRzL21rdWJvb3Quc2gKaW5kZXggMmUzZDNjZC4uNDQ2NzM5YyAxMDA3NTUKLS0tIGEvc2NyaXB0cy9ta3Vib290LnNoCisrKyBiL3NjcmlwdHMvbWt1Ym9vdC5zaApAQCAtMTEsNyArMTEsNyBAQAogCWlmIFsgLXogIiR7TUtJTUFHRX0iIF07IHRoZW4KIAkJIyBEb2Vzbid0IGV4aXN0CiAJCWVjaG8gJyJta2ltYWdlIiBjb21tYW5kIG5vdCBmb3VuZCAtIFUtQm9vdCBpbWFnZXMgd2lsbCBub3QgYmUgYnVpbHQnID4mMgotCQlleGl0IDA7CisJCWV4aXQgMTsKIAlmaQogZmkKIApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9tb2QvbW9kcG9zdC5jIGIvc2NyaXB0cy9tb2QvbW9kcG9zdC5jCmluZGV4IDMzMTIyY2EuLjk3ZDIyNTkgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvbW9kL21vZHBvc3QuYworKysgYi9zY3JpcHRzL21vZC9tb2Rwb3N0LmMKQEAgLTc5MCw2ICs3OTAsNyBAQAogewogCSIuY29tbWVudCoiLAogCSIuZGVidWcqIiwKKwkiLnpkZWJ1ZyoiLAkJLyogQ29tcHJlc3NlZCBkZWJ1ZyBzZWN0aW9ucy4gKi8KIAkiLkdDQy1jb21tYW5kLWxpbmUiLAkvKiBtbjEwMzAwICovCiAJIi5tZGVidWcqIiwgICAgICAgIC8qIGFscGhhLCBzY29yZSwgbWlwcyBldGMuICovCiAJIi5wZHIiLCAgICAgICAgICAgIC8qIGFscGhhLCBzY29yZSwgbWlwcyBldGMuICovCkBAIC0xNDQxLDcgKzE0NDIsNyBAQAogCWludCBzZWN0aW9uID0gc2huZHgyc2VjaW5kZXgoc2VjaGRyLT5zaF9pbmZvKTsKIAogCXJldHVybiAodm9pZCAqKWVsZi0+aGRyICsgc2VjaGRyc1tzZWN0aW9uXS5zaF9vZmZzZXQgKwotCQlyLT5yX29mZnNldCAtIHNlY2hkcnNbc2VjdGlvbl0uc2hfYWRkcjsKKwkJci0+cl9vZmZzZXQ7CiB9CiAKIHN0YXRpYyBpbnQgYWRkZW5kXzM4Nl9yZWwoc3RydWN0IGVsZl9pbmZvICplbGYsIEVsZl9TaGRyICpzZWNoZHIsIEVsZl9SZWxhICpyKQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wYWNrYWdlL2J1aWxkZGViIGIvc2NyaXB0cy9wYWNrYWdlL2J1aWxkZGViCmluZGV4IDQ5Yjc0ZTEuLmIwYjIzNTcgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvcGFja2FnZS9idWlsZGRlYgorKysgYi9zY3JpcHRzL3BhY2thZ2UvYnVpbGRkZWIKQEAgLTI1LDggKzI1LDQ0IEBACiAJY2hvd24gLVIgcm9vdDpyb290ICIkcGRpciIKIAljaG1vZCAtUiBnby13ICIkcGRpciIKIAorCSMgQXR0ZW1wdCB0byBmaW5kIHRoZSBjb3JyZWN0IERlYmlhbiBhcmNoaXRlY3R1cmUKKwlsb2NhbCBmb3JjZWFyY2g9IiIgZGViYXJjaD0iIgorCWNhc2UgIiRVVFNfTUFDSElORSIgaW4KKwlpMzg2fGlhNjR8YWxwaGEpCisJCWRlYmFyY2g9IiRVVFNfTUFDSElORSIgOzsKKwl4ODZfNjQpCisJCWRlYmFyY2g9YW1kNjQgOzsKKwlzcGFyYyopCisJCWRlYmFyY2g9c3BhcmMgOzsKKwlzMzkwKikKKwkJZGViYXJjaD1zMzkwIDs7CisJcHBjKikKKwkJZGViYXJjaD1wb3dlcnBjIDs7CisJcGFyaXNjKikKKwkJZGViYXJjaD1ocHBhIDs7CisJbWlwcyopCisJCWRlYmFyY2g9bWlwcyQoZ3JlcCAtcSBDUFVfTElUVExFX0VORElBTj15IC5jb25maWcgJiYgZWNobyBlbCkgOzsKKwlhcm0qKQorCQlkZWJhcmNoPWFybSQoZ3JlcCAtcSBDT05GSUdfQUVBQkk9eSAuY29uZmlnICYmIGVjaG8gZWwpIDs7CisJKikKKwkJZWNobyAiIiA+JjIKKwkJZWNobyAiKiogKiogKiogIFdBUk5JTkcgICoqICoqICoqIiA+JjIKKwkJZWNobyAiIiA+JjIKKwkJZWNobyAiWW91ciBhcmNoaXRlY3R1cmUgZG9lc24ndCBoYXZlIGl0J3MgZXF1aXZhbGVudCIgPiYyCisJCWVjaG8gIkRlYmlhbiB1c2Vyc3BhY2UgYXJjaGl0ZWN0dXJlIGRlZmluZWQhIiA+JjIKKwkJZWNobyAiRmFsbGluZyBiYWNrIHRvIHVzaW5nIHlvdXIgY3VycmVudCB1c2Vyc3BhY2UgaW5zdGVhZCEiID4mMgorCQllY2hvICJQbGVhc2UgYWRkIHN1cHBvcnQgZm9yICRVVFNfTUFDSElORSB0byAkezB9IC4uLiIgPiYyCisJCWVjaG8gIiIgPiYyCisJZXNhYworCWlmIFsgLW4gIiRLQlVJTERfREVCQVJDSCIgXSA7IHRoZW4KKwkJZGViYXJjaD0iJEtCVUlMRF9ERUJBUkNIIgorCWZpCisJaWYgWyAtbiAiJGRlYmFyY2giIF0gOyB0aGVuCisJCWZvcmNlYXJjaD0iLURBcmNoaXRlY3R1cmU9JGRlYmFyY2giCisJZmkKKwogCSMgQ3JlYXRlIHRoZSBwYWNrYWdlCi0JZHBrZy1nZW5jb250cm9sIC1pc3AgLXAkcG5hbWUgLVAiJHBkaXIiCisJZHBrZy1nZW5jb250cm9sIC1pc3AgJGZvcmNlYXJjaCAtcCRwbmFtZSAtUCIkcGRpciIKIAlkcGtnIC0tYnVpbGQgIiRwZGlyIiAuLgogfQogCkBAIC00MCwxNyArNzYsMjcgQEAKIGZpCiB0bXBkaXI9IiRvYmp0cmVlL2RlYmlhbi90bXAiCiBmd2Rpcj0iJG9ianRyZWUvZGViaWFuL2Z3dG1wIgora2VybmVsX2hlYWRlcnNfZGlyPSIkb2JqdHJlZS9kZWJpYW4vaGRydG1wIgorbGliY19oZWFkZXJzX2Rpcj0iJG9ianRyZWUvZGViaWFuL2hlYWRlcnRtcCIKIHBhY2thZ2VuYW1lPWxpbnV4LWltYWdlLSR2ZXJzaW9uCiBmd3BhY2thZ2VuYW1lPWxpbnV4LWZpcm13YXJlLWltYWdlCitrZXJuZWxfaGVhZGVyc19wYWNrYWdlbmFtZT1saW51eC1oZWFkZXJzLSR2ZXJzaW9uCitsaWJjX2hlYWRlcnNfcGFja2FnZW5hbWU9bGludXgtbGliYy1kZXYKIAogaWYgWyAiJEFSQ0giID0gInVtIiBdIDsgdGhlbgogCXBhY2thZ2VuYW1lPXVzZXItbW9kZS1saW51eC0kdmVyc2lvbgogZmkKIAogIyBTZXR1cCB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZQotcm0gLXJmICIkdG1wZGlyIiAiJGZ3ZGlyIgotbWtkaXIgLXAgIiR0bXBkaXIvREVCSUFOIiAiJHRtcGRpci9saWIiICIkdG1wZGlyL2Jvb3QiICIkdG1wZGlyL3Vzci9zaGFyZS9kb2MvJHBhY2thZ2VuYW1lIgotbWtkaXIgLXAgIiRmd2Rpci9ERUJJQU4iICIkZndkaXIvbGliIiAiJGZ3ZGlyL3Vzci9zaGFyZS9kb2MvJGZ3cGFja2FnZW5hbWUiCitybSAtcmYgIiR0bXBkaXIiICIkZndkaXIiICIka2VybmVsX2hlYWRlcnNfZGlyIiAiJGxpYmNfaGVhZGVyc19kaXIiCitta2RpciAtbSA3NTUgLXAgIiR0bXBkaXIvREVCSUFOIgorbWtkaXIgLXAgICIkdG1wZGlyL2xpYiIgIiR0bXBkaXIvYm9vdCIgIiR0bXBkaXIvdXNyL3NoYXJlL2RvYy8kcGFja2FnZW5hbWUiCitta2RpciAtbSA3NTUgLXAgIiRmd2Rpci9ERUJJQU4iCitta2RpciAtcCAiJGZ3ZGlyL2xpYiIgIiRmd2Rpci91c3Ivc2hhcmUvZG9jLyRmd3BhY2thZ2VuYW1lIgorbWtkaXIgLW0gNzU1IC1wICIkbGliY19oZWFkZXJzX2Rpci9ERUJJQU4iCitta2RpciAtcCAiJGxpYmNfaGVhZGVyc19kaXIvdXNyL3NoYXJlL2RvYy8kbGliY19oZWFkZXJzX3BhY2thZ2VuYW1lIgorbWtkaXIgLW0gNzU1IC1wICIka2VybmVsX2hlYWRlcnNfZGlyL0RFQklBTiIKK21rZGlyIC1wICIka2VybmVsX2hlYWRlcnNfZGlyL3Vzci9zaGFyZS9kb2MvJGtlcm5lbF9oZWFkZXJzX3BhY2thZ2VuYW1lIgogaWYgWyAiJEFSQ0giID0gInVtIiBdIDsgdGhlbgogCW1rZGlyIC1wICIkdG1wZGlyL3Vzci9saWIvdW1sL21vZHVsZXMvJHZlcnNpb24iICIkdG1wZGlyL3Vzci9iaW4iCiBmaQpAQCAtODEsNiArMTI3LDkgQEAKIAlmaQogZmkKIAorbWFrZSBoZWFkZXJzX2NoZWNrCittYWtlIGhlYWRlcnNfaW5zdGFsbCBJTlNUQUxMX0hEUl9QQVRIPSIkbGliY19oZWFkZXJzX2Rpci91c3IiCisKICMgSW5zdGFsbCB0aGUgbWFpbnRhaW5lciBzY3JpcHRzCiAjIE5vdGU6IGhvb2sgc2NyaXB0cyB1bmRlciAvZXRjL2tlcm5lbCBhcmUgYWxzbyBleGVjdXRlZCBieSBvZmZpY2lhbCBEZWJpYW4KICMga2VybmVsIHBhY2thZ2VzLCBhcyB3ZWxsIGFzIGtlcm5lbCBwYWNrYWdlcyBidWlsdCB1c2luZyBtYWtlLWtwa2cKQEAgLTE4OCw2ICsyMzcsMzAgQEAKIAogZmkKIAorIyBCdWlsZCBoZWFkZXIgcGFja2FnZQorZmluZCAuIC1uYW1lIE1ha2VmaWxlIC1vIC1uYW1lIEtjb25maWdcKiAtbyAtbmFtZSBcKi5wbCA+IC90bXAvZmlsZXMkJAorZmluZCBhcmNoL3g4Ni9pbmNsdWRlIGluY2x1ZGUgc2NyaXB0cyAtdHlwZSBmID4+IC90bXAvZmlsZXMkJAorKGNkICRvYmp0cmVlOyBmaW5kIC5jb25maWcgTW9kdWxlLnN5bXZlcnMgaW5jbHVkZSBzY3JpcHRzIC10eXBlIGYgPj4gL3RtcC9vYmpmaWxlcyQkKQorZGVzdGRpcj0ka2VybmVsX2hlYWRlcnNfZGlyL3Vzci9zcmMvbGludXgtaGVhZGVycy0kdmVyc2lvbgorbWtkaXIgLXAgIiRkZXN0ZGlyIgordGFyIC1jIC1mIC0gLVQgL3RtcC9maWxlcyQkIHwgKGNkICRkZXN0ZGlyOyB0YXIgLXhmIC0pCisoY2QgJG9ianRyZWU7IHRhciAtYyAtZiAtIC1UIC90bXAvb2JqZmlsZXMkJCkgfCAoY2QgJGRlc3RkaXI7IHRhciAteGYgLSkKK3JtIC1mIC90bXAvZmlsZXMkJCAvdG1wL29iamZpbGVzJCQKK2FyY2g9JChkcGtnIC0tcHJpbnQtYXJjaGl0ZWN0dXJlKQorCitjYXQgPDxFT0YgPj4gZGViaWFuL2NvbnRyb2wKKworUGFja2FnZTogJGtlcm5lbF9oZWFkZXJzX3BhY2thZ2VuYW1lCitQcm92aWRlczogbGludXgtaGVhZGVycywgbGludXgtaGVhZGVycy0yLjYKK0FyY2hpdGVjdHVyZTogJGFyY2gKK0Rlc2NyaXB0aW9uOiBMaW51eCBrZXJuZWwgaGVhZGVycyBmb3IgJEtFUk5FTFJFTEVBU0Ugb24gJGFyY2gKKyBUaGlzIHBhY2thZ2UgcHJvdmlkZXMga2VybmVsIGhlYWRlciBmaWxlcyBmb3IgJEtFUk5FTFJFTEVBU0Ugb24gJGFyY2gKKyAuCisgVGhpcyBpcyB1c2VmdWwgZm9yIHBlb3BsZSB3aG8gbmVlZCB0byBidWlsZCBleHRlcm5hbCBtb2R1bGVzCitFT0YKKworY3JlYXRlX3BhY2thZ2UgIiRrZXJuZWxfaGVhZGVyc19wYWNrYWdlbmFtZSIgIiRrZXJuZWxfaGVhZGVyc19kaXIiCisKICMgRG8gd2UgaGF2ZSBmaXJtd2FyZT8gTW92ZSBpdCBvdXQgb2YgdGhlIHdheSBhbmQgYnVpbGQgaXQgaW50byBhIHBhY2thZ2UuCiBpZiBbIC1lICIkdG1wZGlyL2xpYi9maXJtd2FyZSIgXTsgdGhlbgogCW12ICIkdG1wZGlyL2xpYi9maXJtd2FyZSIgIiRmd2Rpci9saWIvIgpAQCAtMjAzLDYgKzI3NiwxOCBAQAogCWNyZWF0ZV9wYWNrYWdlICIkZndwYWNrYWdlbmFtZSIgIiRmd2RpciIKIGZpCiAKK2NhdCA8PEVPRiA+PiBkZWJpYW4vY29udHJvbAorCitQYWNrYWdlOiAkbGliY19oZWFkZXJzX3BhY2thZ2VuYW1lCitTZWN0aW9uOiBkZXZlbAorUHJvdmlkZXM6IGxpbnV4LWtlcm5lbC1oZWFkZXJzCitBcmNoaXRlY3R1cmU6IGFueQorRGVzY3JpcHRpb246IExpbnV4IHN1cHBvcnQgaGVhZGVycyBmb3IgdXNlcnNwYWNlIGRldmVsb3BtZW50CisgVGhpcyBwYWNrYWdlIHByb3ZpZGVzIHVzZXJzcGFjZXMgaGVhZGVycyBmcm9tIHRoZSBMaW51eCBrZXJuZWwuICBUaGVzZSBoZWFkZXJzCisgYXJlIHVzZWQgYnkgdGhlIGluc3RhbGxlZCBoZWFkZXJzIGZvciBHTlUgZ2xpYmMgYW5kIG90aGVyIHN5c3RlbSBsaWJyYXJpZXMuCitFT0YKKworY3JlYXRlX3BhY2thZ2UgIiRsaWJjX2hlYWRlcnNfcGFja2FnZW5hbWUiICIkbGliY19oZWFkZXJzX2RpciIKIGNyZWF0ZV9wYWNrYWdlICIkcGFja2FnZW5hbWUiICIkdG1wZGlyIgogCiBleGl0IDAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdGFncy5zaCBiL3NjcmlwdHMvdGFncy5zaAppbmRleCBiYmJlNTg0Li45MmZkYzQ1IDEwMDc1NQotLS0gYS9zY3JpcHRzL3RhZ3Muc2gKKysrIGIvc2NyaXB0cy90YWdzLnNoCkBAIC0xMjMsNyArMTIzLDcgQEAKIAktSSBfX19fY2FjaGVsaW5lX2ludGVybm9kZWFsaWduZWRfaW5fc21wICAgICAgICAgICAgICAgIFwKIAktSSBFWFBPUlRfU1lNQk9MLEVYUE9SVF9TWU1CT0xfR1BMICAgICAgICAgICAgICAgICAgICAgIFwKIAktSSBERUZJTkVfVFJBQ0UsRVhQT1JUX1RSQUNFUE9JTlRfU1lNQk9MLEVYUE9SVF9UUkFDRVBPSU5UX1NZTUJPTF9HUEwgXAotCS0tZXh0cmE9K2YgLS1jLWtpbmRzPS1weCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCS0tZXh0cmE9K2YgLS1jLWtpbmRzPStweCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCS0tcmVnZXgtYXNtPScvXkVOVFJZXCgoW14pXSopXCkuKi9cMS8nICAgICAgICAgICAgICAgICAgXAogCS0tcmVnZXgtYz0nL15TWVNDQUxMX0RFRklORVtbOmRpZ2l0Ol1dP1woKFteLCldKikuKi9zeXNfXDEvJyBcCiAJLS1yZWdleC1jKys9Jy9eVFJBQ0VfRVZFTlRcKChbXiwpXSopLiovdHJhY2VfXDEvJwkJXApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvS2NvbmZpZyBiL3NlY3VyaXR5L0tjb25maWcKaW5kZXggZTgwZGE5NS4uOTVhY2NkNCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvS2NvbmZpZworKysgYi9zZWN1cml0eS9LY29uZmlnCkBAIC0yMSw2ICsyMSwzNyBAQAogCiAJICBJZiB5b3UgYXJlIHVuc3VyZSBhcyB0byB3aGV0aGVyIHRoaXMgaXMgcmVxdWlyZWQsIGFuc3dlciBOLgogCitjb25maWcgVFJVU1RFRF9LRVlTCisJdHJpc3RhdGUgIlRSVVNURUQgS0VZUyIKKwlkZXBlbmRzIG9uIEtFWVMgJiYgVENHX1RQTQorCXNlbGVjdCBDUllQVE8KKwlzZWxlY3QgQ1JZUFRPX0hNQUMKKwlzZWxlY3QgQ1JZUFRPX1NIQTEKKwloZWxwCisJICBUaGlzIG9wdGlvbiBwcm92aWRlcyBzdXBwb3J0IGZvciBjcmVhdGluZywgc2VhbGluZywgYW5kIHVuc2VhbGluZworCSAga2V5cyBpbiB0aGUga2VybmVsLiBUcnVzdGVkIGtleXMgYXJlIHJhbmRvbSBudW1iZXIgc3ltbWV0cmljIGtleXMsCisJICBnZW5lcmF0ZWQgYW5kIFJTQS1zZWFsZWQgYnkgdGhlIFRQTS4gVGhlIFRQTSBvbmx5IHVuc2VhbHMgdGhlIGtleXMsCisJICBpZiB0aGUgYm9vdCBQQ1JzIGFuZCBvdGhlciBjcml0ZXJpYSBtYXRjaC4gIFVzZXJzcGFjZSB3aWxsIG9ubHkgZXZlcgorCSAgc2VlIGVuY3J5cHRlZCBibG9icy4KKworCSAgSWYgeW91IGFyZSB1bnN1cmUgYXMgdG8gd2hldGhlciB0aGlzIGlzIHJlcXVpcmVkLCBhbnN3ZXIgTi4KKworY29uZmlnIEVOQ1JZUFRFRF9LRVlTCisJdHJpc3RhdGUgIkVOQ1JZUFRFRCBLRVlTIgorCWRlcGVuZHMgb24gS0VZUyAmJiBUUlVTVEVEX0tFWVMKKwlzZWxlY3QgQ1JZUFRPX0FFUworCXNlbGVjdCBDUllQVE9fQ0JDCisJc2VsZWN0IENSWVBUT19TSEEyNTYKKwlzZWxlY3QgQ1JZUFRPX1JORworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIHByb3ZpZGVzIHN1cHBvcnQgZm9yIGNyZWF0ZS9lbmNyeXB0aW5nL2RlY3J5cHRpbmcga2V5cworCSAgaW4gdGhlIGtlcm5lbC4gIEVuY3J5cHRlZCBrZXlzIGFyZSBrZXJuZWwgZ2VuZXJhdGVkIHJhbmRvbSBudW1iZXJzLAorCSAgd2hpY2ggYXJlIGVuY3J5cHRlZC9kZWNyeXB0ZWQgd2l0aCBhICdtYXN0ZXInIHN5bW1ldHJpYyBrZXkuIFRoZQorCSAgJ21hc3Rlcicga2V5IGNhbiBiZSBlaXRoZXIgYSB0cnVzdGVkLWtleSBvciB1c2VyLWtleSB0eXBlLgorCSAgVXNlcnNwYWNlIG9ubHkgZXZlciBzZWVzL3N0b3JlcyBlbmNyeXB0ZWQgYmxvYnMuCisKKwkgIElmIHlvdSBhcmUgdW5zdXJlIGFzIHRvIHdoZXRoZXIgdGhpcyBpcyByZXF1aXJlZCwgYW5zd2VyIE4uCisKIGNvbmZpZyBLRVlTX0RFQlVHX1BST0NfS0VZUwogCWJvb2wgIkVuYWJsZSB0aGUgL3Byb2Mva2V5cyBmaWxlIGJ5IHdoaWNoIGtleXMgbWF5IGJlIHZpZXdlZCIKIAlkZXBlbmRzIG9uIEtFWVMKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2FwcGFybW9yL2luY2x1ZGUvZmlsZS5oIGIvc2VjdXJpdHkvYXBwYXJtb3IvaW5jbHVkZS9maWxlLmgKaW5kZXggYmUzNmZlYS4uYWI4YzZkOCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvYXBwYXJtb3IvaW5jbHVkZS9maWxlLmgKKysrIGIvc2VjdXJpdHkvYXBwYXJtb3IvaW5jbHVkZS9maWxlLmgKQEAgLTE1LDEyICsxNSwxMSBAQAogI2lmbmRlZiBfX0FBX0ZJTEVfSAogI2RlZmluZSBfX0FBX0ZJTEVfSAogCi0jaW5jbHVkZSA8bGludXgvcGF0aC5oPgotCiAjaW5jbHVkZSAiZG9tYWluLmgiCiAjaW5jbHVkZSAibWF0Y2guaCIKIAogc3RydWN0IGFhX3Byb2ZpbGU7CitzdHJ1Y3QgcGF0aDsKIAogLyoKICAqIFdlIHVzZSBNQVlfRVhFQywgTUFZX1dSSVRFLCBNQVlfUkVBRCwgTUFZX0FQUEVORCBhbmQgdGhlIGZvbGxvd2luZyBmbGFncwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvYXBwYXJtb3IvaW5jbHVkZS9tYXRjaC5oIGIvc2VjdXJpdHkvYXBwYXJtb3IvaW5jbHVkZS9tYXRjaC5oCmluZGV4IDczNGE2ZDMuLjE5YmExNmUgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2FwcGFybW9yL2luY2x1ZGUvbWF0Y2guaAorKysgYi9zZWN1cml0eS9hcHBhcm1vci9pbmNsdWRlL21hdGNoLmgKQEAgLTE1LDYgKzE1LDcgQEAKICNpZm5kZWYgX19BQV9NQVRDSF9ICiAjZGVmaW5lIF9fQUFfTUFUQ0hfSAogCisjaW5jbHVkZSA8bGludXgva3JlZi5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogCiAjZGVmaW5lIERGQV9OT01BVENICQkJMApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkva2V5cy9NYWtlZmlsZSBiL3NlY3VyaXR5L2tleXMvTWFrZWZpbGUKaW5kZXggNzRkNTQ0Ny4uNmM5NDEwNSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkva2V5cy9NYWtlZmlsZQorKysgYi9zZWN1cml0eS9rZXlzL01ha2VmaWxlCkBAIC0xMyw2ICsxMyw4IEBACiAJcmVxdWVzdF9rZXlfYXV0aC5vIFwKIAl1c2VyX2RlZmluZWQubwogCitvYmotJChDT05GSUdfVFJVU1RFRF9LRVlTKSArPSB0cnVzdGVkX2RlZmluZWQubworb2JqLSQoQ09ORklHX0VOQ1JZUFRFRF9LRVlTKSArPSBlbmNyeXB0ZWRfZGVmaW5lZC5vCiBvYmotJChDT05GSUdfS0VZU19DT01QQVQpICs9IGNvbXBhdC5vCiBvYmotJChDT05GSUdfUFJPQ19GUykgKz0gcHJvYy5vCiBvYmotJChDT05GSUdfU1lTQ1RMKSArPSBzeXNjdGwubwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkva2V5cy9lbmNyeXB0ZWRfZGVmaW5lZC5jIGIvc2VjdXJpdHkva2V5cy9lbmNyeXB0ZWRfZGVmaW5lZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZDI3YzgKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9rZXlzL2VuY3J5cHRlZF9kZWZpbmVkLmMKQEAgLTAsMCArMSw5MDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgSUJNIENvcnBvcmF0aW9uCisgKgorICogQXV0aG9yOgorICogTWltaSBab2hhciA8em9oYXJAdXMuaWJtLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiBTZWUgRG9jdW1lbnRhdGlvbi9rZXlzLXRydXN0ZWQtZW5jcnlwdGVkLnR4dAorICovCisKKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJzZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxrZXlzL3VzZXItdHlwZS5oPgorI2luY2x1ZGUgPGtleXMvdHJ1c3RlZC10eXBlLmg+CisjaW5jbHVkZSA8a2V5cy9lbmNyeXB0ZWQtdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tleS10eXBlLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgPGNyeXB0by9oYXNoLmg+CisjaW5jbHVkZSA8Y3J5cHRvL3NoYS5oPgorI2luY2x1ZGUgPGNyeXB0by9hZXMuaD4KKworI2luY2x1ZGUgImVuY3J5cHRlZF9kZWZpbmVkLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIEtFWV9UUlVTVEVEX1BSRUZJWFtdID0gInRydXN0ZWQ6IjsKK3N0YXRpYyBjb25zdCBjaGFyIEtFWV9VU0VSX1BSRUZJWFtdID0gInVzZXI6IjsKK3N0YXRpYyBjb25zdCBjaGFyIGhhc2hfYWxnW10gPSAic2hhMjU2IjsKK3N0YXRpYyBjb25zdCBjaGFyIGhtYWNfYWxnW10gPSAiaG1hYyhzaGEyNTYpIjsKK3N0YXRpYyBjb25zdCBjaGFyIGJsa2NpcGhlcl9hbGdbXSA9ICJjYmMoYWVzKSI7CitzdGF0aWMgdW5zaWduZWQgaW50IGl2c2l6ZTsKK3N0YXRpYyBpbnQgYmxrc2l6ZTsKKworI2RlZmluZSBLRVlfVFJVU1RFRF9QUkVGSVhfTEVOIChzaXplb2YgKEtFWV9UUlVTVEVEX1BSRUZJWCkgLSAxKQorI2RlZmluZSBLRVlfVVNFUl9QUkVGSVhfTEVOIChzaXplb2YgKEtFWV9VU0VSX1BSRUZJWCkgLSAxKQorI2RlZmluZSBIQVNIX1NJWkUgU0hBMjU2X0RJR0VTVF9TSVpFCisjZGVmaW5lIE1BWF9EQVRBX1NJWkUgNDA5NgorI2RlZmluZSBNSU5fREFUQV9TSVpFICAyMAorCitzdHJ1Y3Qgc2Rlc2MgeworCXN0cnVjdCBzaGFzaF9kZXNjIHNoYXNoOworCWNoYXIgY3R4W107Cit9OworCitzdGF0aWMgc3RydWN0IGNyeXB0b19zaGFzaCAqaGFzaGFsZzsKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX3NoYXNoICpobWFjYWxnOworCitlbnVtIHsKKwlPcHRfZXJyID0gLTEsIE9wdF9uZXcsIE9wdF9sb2FkLCBPcHRfdXBkYXRlCit9OworCitzdGF0aWMgY29uc3QgbWF0Y2hfdGFibGVfdCBrZXlfdG9rZW5zID0geworCXtPcHRfbmV3LCAibmV3In0sCisJe09wdF9sb2FkLCAibG9hZCJ9LAorCXtPcHRfdXBkYXRlLCAidXBkYXRlIn0sCisJe09wdF9lcnIsIE5VTEx9Cit9OworCitzdGF0aWMgaW50IGFlc19nZXRfc2l6ZXModm9pZCkKK3sKKwlzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtOworCisJdGZtID0gY3J5cHRvX2FsbG9jX2Jsa2NpcGhlcihibGtjaXBoZXJfYWxnLCAwLCBDUllQVE9fQUxHX0FTWU5DKTsKKwlpZiAoSVNfRVJSKHRmbSkpIHsKKwkJcHJfZXJyKCJlbmNyeXB0ZWRfa2V5OiBmYWlsZWQgdG8gYWxsb2NfY2lwaGVyICglbGQpXG4iLAorCQkgICAgICAgUFRSX0VSUih0Zm0pKTsKKwkJcmV0dXJuIFBUUl9FUlIodGZtKTsKKwl9CisJaXZzaXplID0gY3J5cHRvX2Jsa2NpcGhlcl9pdnNpemUodGZtKTsKKwlibGtzaXplID0gY3J5cHRvX2Jsa2NpcGhlcl9ibG9ja3NpemUodGZtKTsKKwljcnlwdG9fZnJlZV9ibGtjaXBoZXIodGZtKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHZhbGlkX21hc3Rlcl9kZXNjIC0gdmVyaWZ5IHRoZSAna2V5LXR5cGU6ZGVzYycgb2YgYSBuZXcvdXBkYXRlZCBtYXN0ZXIta2V5CisgKgorICoga2V5LXR5cGU6PSAidHJ1c3RlZDoiIHwgImVuY3J5cHRlZDoiCisgKiBkZXNjOj0gbWFzdGVyLWtleSBkZXNjcmlwdGlvbgorICoKKyAqIFZlcmlmeSB0aGF0ICdrZXktdHlwZScgaXMgdmFsaWQgYW5kIHRoYXQgJ2Rlc2MnIGV4aXN0cy4gT24ga2V5IHVwZGF0ZSwKKyAqIG9ubHkgdGhlIG1hc3RlciBrZXkgZGVzY3JpcHRpb24gaXMgcGVybWl0dGVkIHRvIGNoYW5nZSwgbm90IHRoZSBrZXktdHlwZS4KKyAqIFRoZSBrZXktdHlwZSByZW1haW5zIGNvbnN0YW50LgorICoKKyAqIE9uIHN1Y2Nlc3MgcmV0dXJucyAwLCBvdGhlcndpc2UgLUVJTlZBTC4KKyAqLworc3RhdGljIGludCB2YWxpZF9tYXN0ZXJfZGVzYyhjb25zdCBjaGFyICpuZXdfZGVzYywgY29uc3QgY2hhciAqb3JpZ19kZXNjKQoreworCWlmICghbWVtY21wKG5ld19kZXNjLCBLRVlfVFJVU1RFRF9QUkVGSVgsIEtFWV9UUlVTVEVEX1BSRUZJWF9MRU4pKSB7CisJCWlmIChzdHJsZW4obmV3X2Rlc2MpID09IEtFWV9UUlVTVEVEX1BSRUZJWF9MRU4pCisJCQlnb3RvIG91dDsKKwkJaWYgKG9yaWdfZGVzYykKKwkJCWlmIChtZW1jbXAobmV3X2Rlc2MsIG9yaWdfZGVzYywgS0VZX1RSVVNURURfUFJFRklYX0xFTikpCisJCQkJZ290byBvdXQ7CisJfSBlbHNlIGlmICghbWVtY21wKG5ld19kZXNjLCBLRVlfVVNFUl9QUkVGSVgsIEtFWV9VU0VSX1BSRUZJWF9MRU4pKSB7CisJCWlmIChzdHJsZW4obmV3X2Rlc2MpID09IEtFWV9VU0VSX1BSRUZJWF9MRU4pCisJCQlnb3RvIG91dDsKKwkJaWYgKG9yaWdfZGVzYykKKwkJCWlmIChtZW1jbXAobmV3X2Rlc2MsIG9yaWdfZGVzYywgS0VZX1VTRVJfUFJFRklYX0xFTikpCisJCQkJZ290byBvdXQ7CisJfSBlbHNlCisJCWdvdG8gb3V0OworCXJldHVybiAwOworb3V0OgorCXJldHVybiAtRUlOVkFMOworfQorCisvKgorICogZGF0YWJsb2JfcGFyc2UgLSBwYXJzZSB0aGUga2V5Y3RsIGRhdGEKKyAqCisgKiBkYXRhYmxvYiBmb3JtYXQ6CisgKiBuZXcgPG1hc3Rlci1rZXkgbmFtZT4gPGRlY3J5cHRlZCBkYXRhIGxlbmd0aD4KKyAqIGxvYWQgPG1hc3Rlci1rZXkgbmFtZT4gPGRlY3J5cHRlZCBkYXRhIGxlbmd0aD4gPGVuY3J5cHRlZCBpdiArIGRhdGE+CisgKiB1cGRhdGUgPG5ldy1tYXN0ZXIta2V5IG5hbWU+CisgKgorICogVG9rZW5pemVzIGEgY29weSBvZiB0aGUga2V5Y3RsIGRhdGEsIHJldHVybmluZyBhIHBvaW50ZXIgdG8gZWFjaCB0b2tlbiwKKyAqIHdoaWNoIGlzIG51bGwgdGVybWluYXRlZC4KKyAqCisgKiBPbiBzdWNjZXNzIHJldHVybnMgMCwgb3RoZXJ3aXNlIC1FSU5WQUwuCisgKi8KK3N0YXRpYyBpbnQgZGF0YWJsb2JfcGFyc2UoY2hhciAqZGF0YWJsb2IsIGNoYXIgKiptYXN0ZXJfZGVzYywKKwkJCSAgY2hhciAqKmRlY3J5cHRlZF9kYXRhbGVuLCBjaGFyICoqaGV4X2VuY29kZWRfaXYpCit7CisJc3Vic3RyaW5nX3QgYXJnc1tNQVhfT1BUX0FSR1NdOworCWludCByZXQgPSAtRUlOVkFMOworCWludCBrZXlfY21kOworCWNoYXIgKnA7CisKKwlwID0gc3Ryc2VwKCZkYXRhYmxvYiwgIiBcdCIpOworCWlmICghcCkKKwkJcmV0dXJuIHJldDsKKwlrZXlfY21kID0gbWF0Y2hfdG9rZW4ocCwga2V5X3Rva2VucywgYXJncyk7CisKKwkqbWFzdGVyX2Rlc2MgPSBzdHJzZXAoJmRhdGFibG9iLCAiIFx0Iik7CisJaWYgKCEqbWFzdGVyX2Rlc2MpCisJCWdvdG8gb3V0OworCisJaWYgKHZhbGlkX21hc3Rlcl9kZXNjKCptYXN0ZXJfZGVzYywgTlVMTCkgPCAwKQorCQlnb3RvIG91dDsKKworCWlmIChkZWNyeXB0ZWRfZGF0YWxlbikgeworCQkqZGVjcnlwdGVkX2RhdGFsZW4gPSBzdHJzZXAoJmRhdGFibG9iLCAiIFx0Iik7CisJCWlmICghKmRlY3J5cHRlZF9kYXRhbGVuKQorCQkJZ290byBvdXQ7CisJfQorCisJc3dpdGNoIChrZXlfY21kKSB7CisJY2FzZSBPcHRfbmV3OgorCQlpZiAoIWRlY3J5cHRlZF9kYXRhbGVuKQorCQkJYnJlYWs7CisJCXJldCA9IDA7CisJCWJyZWFrOworCWNhc2UgT3B0X2xvYWQ6CisJCWlmICghZGVjcnlwdGVkX2RhdGFsZW4pCisJCQlicmVhazsKKwkJKmhleF9lbmNvZGVkX2l2ID0gc3Ryc2VwKCZkYXRhYmxvYiwgIiBcdCIpOworCQlpZiAoISpoZXhfZW5jb2RlZF9pdikKKwkJCWJyZWFrOworCQlyZXQgPSAwOworCQlicmVhazsKKwljYXNlIE9wdF91cGRhdGU6CisJCWlmIChkZWNyeXB0ZWRfZGF0YWxlbikKKwkJCWJyZWFrOworCQlyZXQgPSAwOworCQlicmVhazsKKwljYXNlIE9wdF9lcnI6CisJCWJyZWFrOworCX0KK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogZGF0YWJsb2JfZm9ybWF0IC0gZm9ybWF0IGFzIGFuIGFzY2lpIHN0cmluZywgYmVmb3JlIGNvcHlpbmcgdG8gdXNlcnNwYWNlCisgKi8KK3N0YXRpYyBjaGFyICpkYXRhYmxvYl9mb3JtYXQoc3RydWN0IGVuY3J5cHRlZF9rZXlfcGF5bG9hZCAqZXBheWxvYWQsCisJCQkgICAgIHNpemVfdCBhc2NpaWJsb2JfbGVuKQoreworCWNoYXIgKmFzY2lpX2J1ZiwgKmJ1ZnA7CisJdTggKml2ID0gZXBheWxvYWQtPml2OworCWludCBsZW47CisJaW50IGk7CisKKwlhc2NpaV9idWYgPSBrbWFsbG9jKGFzY2lpYmxvYl9sZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFzY2lpX2J1ZikKKwkJZ290byBvdXQ7CisKKwlhc2NpaV9idWZbYXNjaWlibG9iX2xlbl0gPSAnXDAnOworCisJLyogY29weSBkYXRhYmxvYiBtYXN0ZXJfZGVzYyBhbmQgZGF0YWxlbiBzdHJpbmdzICovCisJbGVuID0gc3ByaW50Zihhc2NpaV9idWYsICIlcyAlcyAiLCBlcGF5bG9hZC0+bWFzdGVyX2Rlc2MsCisJCSAgICAgIGVwYXlsb2FkLT5kYXRhbGVuKTsKKworCS8qIGNvbnZlcnQgdGhlIGhleCBlbmNvZGVkIGl2LCBlbmNyeXB0ZWQtZGF0YSBhbmQgSE1BQyB0byBhc2NpaSAqLworCWJ1ZnAgPSAmYXNjaWlfYnVmW2xlbl07CisJZm9yIChpID0gMDsgaSA8IChhc2NpaWJsb2JfbGVuIC0gbGVuKSAvIDI7IGkrKykKKwkJYnVmcCA9IHBhY2tfaGV4X2J5dGUoYnVmcCwgaXZbaV0pOworb3V0OgorCXJldHVybiBhc2NpaV9idWY7Cit9CisKKy8qCisgKiByZXF1ZXN0X3RydXN0ZWRfa2V5IC0gcmVxdWVzdCB0aGUgdHJ1c3RlZCBrZXkKKyAqCisgKiBUcnVzdGVkIGtleXMgYXJlIHNlYWxlZCB0byBQQ1JzIGFuZCBvdGhlciBtZXRhZGF0YS4gQWx0aG91Z2ggdXNlcnNwYWNlCisgKiBtYW5hZ2VzIGJvdGggdHJ1c3RlZC9lbmNyeXB0ZWQga2V5LXR5cGVzLCBsaWtlIHRoZSBlbmNyeXB0ZWQga2V5IHR5cGUKKyAqIGRhdGEsIHRydXN0ZWQga2V5IHR5cGUgZGF0YSBpcyBub3QgdmlzaWJsZSBkZWNyeXB0ZWQgZnJvbSB1c2Vyc3BhY2UuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qga2V5ICpyZXF1ZXN0X3RydXN0ZWRfa2V5KGNvbnN0IGNoYXIgKnRydXN0ZWRfZGVzYywKKwkJCQkgICAgICAgdTggKiptYXN0ZXJfa2V5LCBzaXplX3QgKm1hc3Rlcl9rZXlsZW4pCit7CisJc3RydWN0IHRydXN0ZWRfa2V5X3BheWxvYWQgKnRwYXlsb2FkOworCXN0cnVjdCBrZXkgKnRrZXk7CisKKwl0a2V5ID0gcmVxdWVzdF9rZXkoJmtleV90eXBlX3RydXN0ZWQsIHRydXN0ZWRfZGVzYywgTlVMTCk7CisJaWYgKElTX0VSUih0a2V5KSkKKwkJZ290byBlcnJvcjsKKworCWRvd25fcmVhZCgmdGtleS0+c2VtKTsKKwl0cGF5bG9hZCA9IHJjdV9kZXJlZmVyZW5jZSh0a2V5LT5wYXlsb2FkLmRhdGEpOworCSptYXN0ZXJfa2V5ID0gdHBheWxvYWQtPmtleTsKKwkqbWFzdGVyX2tleWxlbiA9IHRwYXlsb2FkLT5rZXlfbGVuOworZXJyb3I6CisJcmV0dXJuIHRrZXk7Cit9CisKKy8qCisgKiByZXF1ZXN0X3VzZXJfa2V5IC0gcmVxdWVzdCB0aGUgdXNlciBrZXkKKyAqCisgKiBVc2UgYSB1c2VyIHByb3ZpZGVkIGtleSB0byBlbmNyeXB0L2RlY3J5cHQgYW4gZW5jcnlwdGVkLWtleS4KKyAqLworc3RhdGljIHN0cnVjdCBrZXkgKnJlcXVlc3RfdXNlcl9rZXkoY29uc3QgY2hhciAqbWFzdGVyX2Rlc2MsIHU4ICoqbWFzdGVyX2tleSwKKwkJCQkgICAgc2l6ZV90ICptYXN0ZXJfa2V5bGVuKQoreworCXN0cnVjdCB1c2VyX2tleV9wYXlsb2FkICp1cGF5bG9hZDsKKwlzdHJ1Y3Qga2V5ICp1a2V5OworCisJdWtleSA9IHJlcXVlc3Rfa2V5KCZrZXlfdHlwZV91c2VyLCBtYXN0ZXJfZGVzYywgTlVMTCk7CisJaWYgKElTX0VSUih1a2V5KSkKKwkJZ290byBlcnJvcjsKKworCWRvd25fcmVhZCgmdWtleS0+c2VtKTsKKwl1cGF5bG9hZCA9IHJjdV9kZXJlZmVyZW5jZSh1a2V5LT5wYXlsb2FkLmRhdGEpOworCSptYXN0ZXJfa2V5ID0gdXBheWxvYWQtPmRhdGE7CisJKm1hc3Rlcl9rZXlsZW4gPSB1cGF5bG9hZC0+ZGF0YWxlbjsKK2Vycm9yOgorCXJldHVybiB1a2V5OworfQorCitzdGF0aWMgc3RydWN0IHNkZXNjICphbGxvY19zZGVzYyhzdHJ1Y3QgY3J5cHRvX3NoYXNoICphbGcpCit7CisJc3RydWN0IHNkZXNjICpzZGVzYzsKKwlpbnQgc2l6ZTsKKworCXNpemUgPSBzaXplb2Yoc3RydWN0IHNoYXNoX2Rlc2MpICsgY3J5cHRvX3NoYXNoX2Rlc2NzaXplKGFsZyk7CisJc2Rlc2MgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghc2Rlc2MpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCXNkZXNjLT5zaGFzaC50Zm0gPSBhbGc7CisJc2Rlc2MtPnNoYXNoLmZsYWdzID0gMHgwOworCXJldHVybiBzZGVzYzsKK30KKworc3RhdGljIGludCBjYWxjX2htYWModTggKmRpZ2VzdCwgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbiwKKwkJICAgICBjb25zdCB1OCAqYnVmLCB1bnNpZ25lZCBpbnQgYnVmbGVuKQoreworCXN0cnVjdCBzZGVzYyAqc2Rlc2M7CisJaW50IHJldDsKKworCXNkZXNjID0gYWxsb2Nfc2Rlc2MoaG1hY2FsZyk7CisJaWYgKElTX0VSUihzZGVzYykpIHsKKwkJcHJfaW5mbygiZW5jcnlwdGVkX2tleTogY2FuJ3QgYWxsb2MgJXNcbiIsIGhtYWNfYWxnKTsKKwkJcmV0dXJuIFBUUl9FUlIoc2Rlc2MpOworCX0KKworCXJldCA9IGNyeXB0b19zaGFzaF9zZXRrZXkoaG1hY2FsZywga2V5LCBrZXlsZW4pOworCWlmICghcmV0KQorCQlyZXQgPSBjcnlwdG9fc2hhc2hfZGlnZXN0KCZzZGVzYy0+c2hhc2gsIGJ1ZiwgYnVmbGVuLCBkaWdlc3QpOworCWtmcmVlKHNkZXNjKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGNhbGNfaGFzaCh1OCAqZGlnZXN0LCBjb25zdCB1OCAqYnVmLCB1bnNpZ25lZCBpbnQgYnVmbGVuKQoreworCXN0cnVjdCBzZGVzYyAqc2Rlc2M7CisJaW50IHJldDsKKworCXNkZXNjID0gYWxsb2Nfc2Rlc2MoaGFzaGFsZyk7CisJaWYgKElTX0VSUihzZGVzYykpIHsKKwkJcHJfaW5mbygiZW5jcnlwdGVkX2tleTogY2FuJ3QgYWxsb2MgJXNcbiIsIGhhc2hfYWxnKTsKKwkJcmV0dXJuIFBUUl9FUlIoc2Rlc2MpOworCX0KKworCXJldCA9IGNyeXB0b19zaGFzaF9kaWdlc3QoJnNkZXNjLT5zaGFzaCwgYnVmLCBidWZsZW4sIGRpZ2VzdCk7CisJa2ZyZWUoc2Rlc2MpOworCXJldHVybiByZXQ7Cit9CisKK2VudW0gZGVyaXZlZF9rZXlfdHlwZSB7IEVOQ19LRVksIEFVVEhfS0VZIH07CisKKy8qIERlcml2ZSBhdXRoZW50aWNhdGlvbi9lbmNyeXB0aW9uIGtleSBmcm9tIHRydXN0ZWQga2V5ICovCitzdGF0aWMgaW50IGdldF9kZXJpdmVkX2tleSh1OCAqZGVyaXZlZF9rZXksIGVudW0gZGVyaXZlZF9rZXlfdHlwZSBrZXlfdHlwZSwKKwkJCSAgIGNvbnN0IHU4ICptYXN0ZXJfa2V5LCBzaXplX3QgbWFzdGVyX2tleWxlbikKK3sKKwl1OCAqZGVyaXZlZF9idWY7CisJdW5zaWduZWQgaW50IGRlcml2ZWRfYnVmX2xlbjsKKwlpbnQgcmV0OworCisJZGVyaXZlZF9idWZfbGVuID0gc3RybGVuKCJBVVRIX0tFWSIpICsgMSArIG1hc3Rlcl9rZXlsZW47CisJaWYgKGRlcml2ZWRfYnVmX2xlbiA8IEhBU0hfU0laRSkKKwkJZGVyaXZlZF9idWZfbGVuID0gSEFTSF9TSVpFOworCisJZGVyaXZlZF9idWYgPSBremFsbG9jKGRlcml2ZWRfYnVmX2xlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXJpdmVkX2J1ZikgeworCQlwcl9lcnIoImVuY3J5cHRlZF9rZXk6IG91dCBvZiBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJaWYgKGtleV90eXBlKQorCQlzdHJjcHkoZGVyaXZlZF9idWYsICJBVVRIX0tFWSIpOworCWVsc2UKKwkJc3RyY3B5KGRlcml2ZWRfYnVmLCAiRU5DX0tFWSIpOworCisJbWVtY3B5KGRlcml2ZWRfYnVmICsgc3RybGVuKGRlcml2ZWRfYnVmKSArIDEsIG1hc3Rlcl9rZXksCisJICAgICAgIG1hc3Rlcl9rZXlsZW4pOworCXJldCA9IGNhbGNfaGFzaChkZXJpdmVkX2tleSwgZGVyaXZlZF9idWYsIGRlcml2ZWRfYnVmX2xlbik7CisJa2ZyZWUoZGVyaXZlZF9idWYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9ibGtjaXBoZXJfZGVzYyhzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsIGNvbnN0IHU4ICprZXksCisJCQkgICAgICAgdW5zaWduZWQgaW50IGtleV9sZW4sIGNvbnN0IHU4ICppdiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgaXZzaXplKQoreworCWludCByZXQ7CisKKwlkZXNjLT50Zm0gPSBjcnlwdG9fYWxsb2NfYmxrY2lwaGVyKGJsa2NpcGhlcl9hbGcsIDAsIENSWVBUT19BTEdfQVNZTkMpOworCWlmIChJU19FUlIoZGVzYy0+dGZtKSkgeworCQlwcl9lcnIoImVuY3J5cHRlZF9rZXk6IGZhaWxlZCB0byBsb2FkICVzIHRyYW5zZm9ybSAoJWxkKVxuIiwKKwkJICAgICAgIGJsa2NpcGhlcl9hbGcsIFBUUl9FUlIoZGVzYy0+dGZtKSk7CisJCXJldHVybiBQVFJfRVJSKGRlc2MtPnRmbSk7CisJfQorCWRlc2MtPmZsYWdzID0gMDsKKworCXJldCA9IGNyeXB0b19ibGtjaXBoZXJfc2V0a2V5KGRlc2MtPnRmbSwga2V5LCBrZXlfbGVuKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoImVuY3J5cHRlZF9rZXk6IGZhaWxlZCB0byBzZXRrZXkgKCVkKVxuIiwgcmV0KTsKKwkJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKGRlc2MtPnRmbSk7CisJCXJldHVybiByZXQ7CisJfQorCWNyeXB0b19ibGtjaXBoZXJfc2V0X2l2KGRlc2MtPnRmbSwgaXYsIGl2c2l6ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qga2V5ICpyZXF1ZXN0X21hc3Rlcl9rZXkoc3RydWN0IGVuY3J5cHRlZF9rZXlfcGF5bG9hZCAqZXBheWxvYWQsCisJCQkJICAgICAgdTggKiptYXN0ZXJfa2V5LCBzaXplX3QgKm1hc3Rlcl9rZXlsZW4pCit7CisJc3RydWN0IGtleSAqbWtleSA9IE5VTEw7CisKKwlpZiAoIXN0cm5jbXAoZXBheWxvYWQtPm1hc3Rlcl9kZXNjLCBLRVlfVFJVU1RFRF9QUkVGSVgsCisJCSAgICAgS0VZX1RSVVNURURfUFJFRklYX0xFTikpIHsKKwkJbWtleSA9IHJlcXVlc3RfdHJ1c3RlZF9rZXkoZXBheWxvYWQtPm1hc3Rlcl9kZXNjICsKKwkJCQkJICAgS0VZX1RSVVNURURfUFJFRklYX0xFTiwKKwkJCQkJICAgbWFzdGVyX2tleSwgbWFzdGVyX2tleWxlbik7CisJfSBlbHNlIGlmICghc3RybmNtcChlcGF5bG9hZC0+bWFzdGVyX2Rlc2MsIEtFWV9VU0VSX1BSRUZJWCwKKwkJCSAgICBLRVlfVVNFUl9QUkVGSVhfTEVOKSkgeworCQlta2V5ID0gcmVxdWVzdF91c2VyX2tleShlcGF5bG9hZC0+bWFzdGVyX2Rlc2MgKworCQkJCQlLRVlfVVNFUl9QUkVGSVhfTEVOLAorCQkJCQltYXN0ZXJfa2V5LCBtYXN0ZXJfa2V5bGVuKTsKKwl9IGVsc2UKKwkJZ290byBvdXQ7CisKKwlpZiAoSVNfRVJSKG1rZXkpKQorCQlwcl9pbmZvKCJlbmNyeXB0ZWRfa2V5OiBrZXkgJXMgbm90IGZvdW5kIiwKKwkJCWVwYXlsb2FkLT5tYXN0ZXJfZGVzYyk7CisJaWYgKG1rZXkpCisJCWR1bXBfbWFzdGVyX2tleSgqbWFzdGVyX2tleSwgKm1hc3Rlcl9rZXlsZW4pOworb3V0OgorCXJldHVybiBta2V5OworfQorCisvKiBCZWZvcmUgcmV0dXJuaW5nIGRhdGEgdG8gdXNlcnNwYWNlLCBlbmNyeXB0IGRlY3J5cHRlZCBkYXRhLiAqLworc3RhdGljIGludCBkZXJpdmVkX2tleV9lbmNyeXB0KHN0cnVjdCBlbmNyeXB0ZWRfa2V5X3BheWxvYWQgKmVwYXlsb2FkLAorCQkJICAgICAgIGNvbnN0IHU4ICpkZXJpdmVkX2tleSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgZGVyaXZlZF9rZXlsZW4pCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnX2luWzJdOworCXN0cnVjdCBzY2F0dGVybGlzdCBzZ19vdXRbMV07CisJc3RydWN0IGJsa2NpcGhlcl9kZXNjIGRlc2M7CisJdW5zaWduZWQgaW50IGVuY3J5cHRlZF9kYXRhbGVuOworCXVuc2lnbmVkIGludCBwYWRsZW47CisJY2hhciBwYWRbMTZdOworCWludCByZXQ7CisKKwllbmNyeXB0ZWRfZGF0YWxlbiA9IHJvdW5kdXAoZXBheWxvYWQtPmRlY3J5cHRlZF9kYXRhbGVuLCBibGtzaXplKTsKKwlwYWRsZW4gPSBlbmNyeXB0ZWRfZGF0YWxlbiAtIGVwYXlsb2FkLT5kZWNyeXB0ZWRfZGF0YWxlbjsKKworCXJldCA9IGluaXRfYmxrY2lwaGVyX2Rlc2MoJmRlc2MsIGRlcml2ZWRfa2V5LCBkZXJpdmVkX2tleWxlbiwKKwkJCQkgIGVwYXlsb2FkLT5pdiwgaXZzaXplKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisJZHVtcF9kZWNyeXB0ZWRfZGF0YShlcGF5bG9hZCk7CisKKwltZW1zZXQocGFkLCAwLCBzaXplb2YgcGFkKTsKKwlzZ19pbml0X3RhYmxlKHNnX2luLCAyKTsKKwlzZ19zZXRfYnVmKCZzZ19pblswXSwgZXBheWxvYWQtPmRlY3J5cHRlZF9kYXRhLAorCQkgICBlcGF5bG9hZC0+ZGVjcnlwdGVkX2RhdGFsZW4pOworCXNnX3NldF9idWYoJnNnX2luWzFdLCBwYWQsIHBhZGxlbik7CisKKwlzZ19pbml0X3RhYmxlKHNnX291dCwgMSk7CisJc2dfc2V0X2J1ZihzZ19vdXQsIGVwYXlsb2FkLT5lbmNyeXB0ZWRfZGF0YSwgZW5jcnlwdGVkX2RhdGFsZW4pOworCisJcmV0ID0gY3J5cHRvX2Jsa2NpcGhlcl9lbmNyeXB0KCZkZXNjLCBzZ19vdXQsIHNnX2luLCBlbmNyeXB0ZWRfZGF0YWxlbik7CisJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKGRlc2MudGZtKTsKKwlpZiAocmV0IDwgMCkKKwkJcHJfZXJyKCJlbmNyeXB0ZWRfa2V5OiBmYWlsZWQgdG8gZW5jcnlwdCAoJWQpXG4iLCByZXQpOworCWVsc2UKKwkJZHVtcF9lbmNyeXB0ZWRfZGF0YShlcGF5bG9hZCwgZW5jcnlwdGVkX2RhdGFsZW4pOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZGF0YWJsb2JfaG1hY19hcHBlbmQoc3RydWN0IGVuY3J5cHRlZF9rZXlfcGF5bG9hZCAqZXBheWxvYWQsCisJCQkJY29uc3QgdTggKm1hc3Rlcl9rZXksIHNpemVfdCBtYXN0ZXJfa2V5bGVuKQoreworCXU4IGRlcml2ZWRfa2V5W0hBU0hfU0laRV07CisJdTggKmRpZ2VzdDsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2V0X2Rlcml2ZWRfa2V5KGRlcml2ZWRfa2V5LCBBVVRIX0tFWSwgbWFzdGVyX2tleSwgbWFzdGVyX2tleWxlbik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJZGlnZXN0ID0gZXBheWxvYWQtPm1hc3Rlcl9kZXNjICsgZXBheWxvYWQtPmRhdGFibG9iX2xlbjsKKwlyZXQgPSBjYWxjX2htYWMoZGlnZXN0LCBkZXJpdmVkX2tleSwgc2l6ZW9mIGRlcml2ZWRfa2V5LAorCQkJZXBheWxvYWQtPm1hc3Rlcl9kZXNjLCBlcGF5bG9hZC0+ZGF0YWJsb2JfbGVuKTsKKwlpZiAoIXJldCkKKwkJZHVtcF9obWFjKE5VTEwsIGRpZ2VzdCwgSEFTSF9TSVpFKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKiB2ZXJpZnkgSE1BQyBiZWZvcmUgZGVjcnlwdGluZyBlbmNyeXB0ZWQga2V5ICovCitzdGF0aWMgaW50IGRhdGFibG9iX2htYWNfdmVyaWZ5KHN0cnVjdCBlbmNyeXB0ZWRfa2V5X3BheWxvYWQgKmVwYXlsb2FkLAorCQkJCWNvbnN0IHU4ICptYXN0ZXJfa2V5LCBzaXplX3QgbWFzdGVyX2tleWxlbikKK3sKKwl1OCBkZXJpdmVkX2tleVtIQVNIX1NJWkVdOworCXU4IGRpZ2VzdFtIQVNIX1NJWkVdOworCWludCByZXQ7CisKKwlyZXQgPSBnZXRfZGVyaXZlZF9rZXkoZGVyaXZlZF9rZXksIEFVVEhfS0VZLCBtYXN0ZXJfa2V5LCBtYXN0ZXJfa2V5bGVuKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBjYWxjX2htYWMoZGlnZXN0LCBkZXJpdmVkX2tleSwgc2l6ZW9mIGRlcml2ZWRfa2V5LAorCQkJZXBheWxvYWQtPm1hc3Rlcl9kZXNjLCBlcGF5bG9hZC0+ZGF0YWJsb2JfbGVuKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisJcmV0ID0gbWVtY21wKGRpZ2VzdCwgZXBheWxvYWQtPm1hc3Rlcl9kZXNjICsgZXBheWxvYWQtPmRhdGFibG9iX2xlbiwKKwkJICAgICBzaXplb2YgZGlnZXN0KTsKKwlpZiAocmV0KSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWR1bXBfaG1hYygiZGF0YWJsb2IiLAorCQkJICBlcGF5bG9hZC0+bWFzdGVyX2Rlc2MgKyBlcGF5bG9hZC0+ZGF0YWJsb2JfbGVuLAorCQkJICBIQVNIX1NJWkUpOworCQlkdW1wX2htYWMoImNhbGMiLCBkaWdlc3QsIEhBU0hfU0laRSk7CisJfQorb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZGVyaXZlZF9rZXlfZGVjcnlwdChzdHJ1Y3QgZW5jcnlwdGVkX2tleV9wYXlsb2FkICplcGF5bG9hZCwKKwkJCSAgICAgICBjb25zdCB1OCAqZGVyaXZlZF9rZXksCisJCQkgICAgICAgdW5zaWduZWQgaW50IGRlcml2ZWRfa2V5bGVuKQoreworCXN0cnVjdCBzY2F0dGVybGlzdCBzZ19pblsxXTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dfb3V0WzJdOworCXN0cnVjdCBibGtjaXBoZXJfZGVzYyBkZXNjOworCXVuc2lnbmVkIGludCBlbmNyeXB0ZWRfZGF0YWxlbjsKKwljaGFyIHBhZFsxNl07CisJaW50IHJldDsKKworCWVuY3J5cHRlZF9kYXRhbGVuID0gcm91bmR1cChlcGF5bG9hZC0+ZGVjcnlwdGVkX2RhdGFsZW4sIGJsa3NpemUpOworCXJldCA9IGluaXRfYmxrY2lwaGVyX2Rlc2MoJmRlc2MsIGRlcml2ZWRfa2V5LCBkZXJpdmVkX2tleWxlbiwKKwkJCQkgIGVwYXlsb2FkLT5pdiwgaXZzaXplKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisJZHVtcF9lbmNyeXB0ZWRfZGF0YShlcGF5bG9hZCwgZW5jcnlwdGVkX2RhdGFsZW4pOworCisJbWVtc2V0KHBhZCwgMCwgc2l6ZW9mIHBhZCk7CisJc2dfaW5pdF90YWJsZShzZ19pbiwgMSk7CisJc2dfaW5pdF90YWJsZShzZ19vdXQsIDIpOworCXNnX3NldF9idWYoc2dfaW4sIGVwYXlsb2FkLT5lbmNyeXB0ZWRfZGF0YSwgZW5jcnlwdGVkX2RhdGFsZW4pOworCXNnX3NldF9idWYoJnNnX291dFswXSwgZXBheWxvYWQtPmRlY3J5cHRlZF9kYXRhLAorCQkgICBlcGF5bG9hZC0+ZGVjcnlwdGVkX2RhdGFsZW4pOworCXNnX3NldF9idWYoJnNnX291dFsxXSwgcGFkLCBzaXplb2YgcGFkKTsKKworCXJldCA9IGNyeXB0b19ibGtjaXBoZXJfZGVjcnlwdCgmZGVzYywgc2dfb3V0LCBzZ19pbiwgZW5jcnlwdGVkX2RhdGFsZW4pOworCWNyeXB0b19mcmVlX2Jsa2NpcGhlcihkZXNjLnRmbSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCWR1bXBfZGVjcnlwdGVkX2RhdGEoZXBheWxvYWQpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgZGVjcnlwdGVkIGtleSBhbmQgZGF0YWJsb2IuICovCitzdGF0aWMgc3RydWN0IGVuY3J5cHRlZF9rZXlfcGF5bG9hZCAqZW5jcnlwdGVkX2tleV9hbGxvYyhzdHJ1Y3Qga2V5ICprZXksCisJCQkJCQkJIGNvbnN0IGNoYXIgKm1hc3Rlcl9kZXNjLAorCQkJCQkJCSBjb25zdCBjaGFyICpkYXRhbGVuKQoreworCXN0cnVjdCBlbmNyeXB0ZWRfa2V5X3BheWxvYWQgKmVwYXlsb2FkID0gTlVMTDsKKwl1bnNpZ25lZCBzaG9ydCBkYXRhYmxvYl9sZW47CisJdW5zaWduZWQgc2hvcnQgZGVjcnlwdGVkX2RhdGFsZW47CisJdW5zaWduZWQgaW50IGVuY3J5cHRlZF9kYXRhbGVuOworCWxvbmcgZGxlbjsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvbChkYXRhbGVuLCAxMCwgJmRsZW4pOworCWlmIChyZXQgPCAwIHx8IGRsZW4gPCBNSU5fREFUQV9TSVpFIHx8IGRsZW4gPiBNQVhfREFUQV9TSVpFKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCWRlY3J5cHRlZF9kYXRhbGVuID0gZGxlbjsKKwllbmNyeXB0ZWRfZGF0YWxlbiA9IHJvdW5kdXAoZGVjcnlwdGVkX2RhdGFsZW4sIGJsa3NpemUpOworCisJZGF0YWJsb2JfbGVuID0gc3RybGVuKG1hc3Rlcl9kZXNjKSArIDEgKyBzdHJsZW4oZGF0YWxlbikgKyAxCisJICAgICsgaXZzaXplICsgMSArIGVuY3J5cHRlZF9kYXRhbGVuOworCisJcmV0ID0ga2V5X3BheWxvYWRfcmVzZXJ2ZShrZXksIGRlY3J5cHRlZF9kYXRhbGVuICsgZGF0YWJsb2JfbGVuCisJCQkJICArIEhBU0hfU0laRSArIDEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCisJZXBheWxvYWQgPSBremFsbG9jKHNpemVvZigqZXBheWxvYWQpICsgZGVjcnlwdGVkX2RhdGFsZW4gKworCQkJICAgZGF0YWJsb2JfbGVuICsgSEFTSF9TSVpFICsgMSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlcGF5bG9hZCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwllcGF5bG9hZC0+ZGVjcnlwdGVkX2RhdGFsZW4gPSBkZWNyeXB0ZWRfZGF0YWxlbjsKKwllcGF5bG9hZC0+ZGF0YWJsb2JfbGVuID0gZGF0YWJsb2JfbGVuOworCXJldHVybiBlcGF5bG9hZDsKK30KKworc3RhdGljIGludCBlbmNyeXB0ZWRfa2V5X2RlY3J5cHQoc3RydWN0IGVuY3J5cHRlZF9rZXlfcGF5bG9hZCAqZXBheWxvYWQsCisJCQkJIGNvbnN0IGNoYXIgKmhleF9lbmNvZGVkX2l2KQoreworCXN0cnVjdCBrZXkgKm1rZXk7CisJdTggZGVyaXZlZF9rZXlbSEFTSF9TSVpFXTsKKwl1OCAqbWFzdGVyX2tleTsKKwl1OCAqaG1hYzsKKwljb25zdCBjaGFyICpoZXhfZW5jb2RlZF9kYXRhOworCXVuc2lnbmVkIGludCBlbmNyeXB0ZWRfZGF0YWxlbjsKKwlzaXplX3QgbWFzdGVyX2tleWxlbjsKKwlzaXplX3QgYXNjaWlsZW47CisJaW50IHJldDsKKworCWVuY3J5cHRlZF9kYXRhbGVuID0gcm91bmR1cChlcGF5bG9hZC0+ZGVjcnlwdGVkX2RhdGFsZW4sIGJsa3NpemUpOworCWFzY2lpbGVuID0gKGl2c2l6ZSArIDEgKyBlbmNyeXB0ZWRfZGF0YWxlbiArIEhBU0hfU0laRSkgKiAyOworCWlmIChzdHJsZW4oaGV4X2VuY29kZWRfaXYpICE9IGFzY2lpbGVuKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWhleF9lbmNvZGVkX2RhdGEgPSBoZXhfZW5jb2RlZF9pdiArICgyICogaXZzaXplKSArIDI7CisJaGV4MmJpbihlcGF5bG9hZC0+aXYsIGhleF9lbmNvZGVkX2l2LCBpdnNpemUpOworCWhleDJiaW4oZXBheWxvYWQtPmVuY3J5cHRlZF9kYXRhLCBoZXhfZW5jb2RlZF9kYXRhLCBlbmNyeXB0ZWRfZGF0YWxlbik7CisKKwlobWFjID0gZXBheWxvYWQtPm1hc3Rlcl9kZXNjICsgZXBheWxvYWQtPmRhdGFibG9iX2xlbjsKKwloZXgyYmluKGhtYWMsIGhleF9lbmNvZGVkX2RhdGEgKyAoZW5jcnlwdGVkX2RhdGFsZW4gKiAyKSwgSEFTSF9TSVpFKTsKKworCW1rZXkgPSByZXF1ZXN0X21hc3Rlcl9rZXkoZXBheWxvYWQsICZtYXN0ZXJfa2V5LCAmbWFzdGVyX2tleWxlbik7CisJaWYgKElTX0VSUihta2V5KSkKKwkJcmV0dXJuIFBUUl9FUlIobWtleSk7CisKKwlyZXQgPSBkYXRhYmxvYl9obWFjX3ZlcmlmeShlcGF5bG9hZCwgbWFzdGVyX2tleSwgbWFzdGVyX2tleWxlbik7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCJlbmNyeXB0ZWRfa2V5OiBiYWQgaG1hYyAoJWQpXG4iLCByZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBnZXRfZGVyaXZlZF9rZXkoZGVyaXZlZF9rZXksIEVOQ19LRVksIG1hc3Rlcl9rZXksIG1hc3Rlcl9rZXlsZW4pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCXJldCA9IGRlcml2ZWRfa2V5X2RlY3J5cHQoZXBheWxvYWQsIGRlcml2ZWRfa2V5LCBzaXplb2YgZGVyaXZlZF9rZXkpOworCWlmIChyZXQgPCAwKQorCQlwcl9lcnIoImVuY3J5cHRlZF9rZXk6IGZhaWxlZCB0byBkZWNyeXB0IGtleSAoJWQpXG4iLCByZXQpOworb3V0OgorCXVwX3JlYWQoJm1rZXktPnNlbSk7CisJa2V5X3B1dChta2V5KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2VrZXlfaW5pdChzdHJ1Y3QgZW5jcnlwdGVkX2tleV9wYXlsb2FkICplcGF5bG9hZCwKKwkJCWNvbnN0IGNoYXIgKm1hc3Rlcl9kZXNjLCBjb25zdCBjaGFyICpkYXRhbGVuKQoreworCWVwYXlsb2FkLT5tYXN0ZXJfZGVzYyA9IGVwYXlsb2FkLT5kZWNyeXB0ZWRfZGF0YQorCSAgICArIGVwYXlsb2FkLT5kZWNyeXB0ZWRfZGF0YWxlbjsKKwllcGF5bG9hZC0+ZGF0YWxlbiA9IGVwYXlsb2FkLT5tYXN0ZXJfZGVzYyArIHN0cmxlbihtYXN0ZXJfZGVzYykgKyAxOworCWVwYXlsb2FkLT5pdiA9IGVwYXlsb2FkLT5kYXRhbGVuICsgc3RybGVuKGRhdGFsZW4pICsgMTsKKwllcGF5bG9hZC0+ZW5jcnlwdGVkX2RhdGEgPSBlcGF5bG9hZC0+aXYgKyBpdnNpemUgKyAxOworCisJbWVtY3B5KGVwYXlsb2FkLT5tYXN0ZXJfZGVzYywgbWFzdGVyX2Rlc2MsIHN0cmxlbihtYXN0ZXJfZGVzYykpOworCW1lbWNweShlcGF5bG9hZC0+ZGF0YWxlbiwgZGF0YWxlbiwgc3RybGVuKGRhdGFsZW4pKTsKK30KKworLyoKKyAqIGVuY3J5cHRlZF9pbml0IC0gaW5pdGlhbGl6ZSBhbiBlbmNyeXB0ZWQga2V5CisgKgorICogRm9yIGEgbmV3IGtleSwgdXNlIGEgcmFuZG9tIG51bWJlciBmb3IgYm90aCB0aGUgaXYgYW5kIGRhdGEKKyAqIGl0c2VsZi4gIEZvciBhbiBvbGQga2V5LCBkZWNyeXB0IHRoZSBoZXggZW5jb2RlZCBkYXRhLgorICovCitzdGF0aWMgaW50IGVuY3J5cHRlZF9pbml0KHN0cnVjdCBlbmNyeXB0ZWRfa2V5X3BheWxvYWQgKmVwYXlsb2FkLAorCQkJICBjb25zdCBjaGFyICptYXN0ZXJfZGVzYywgY29uc3QgY2hhciAqZGF0YWxlbiwKKwkJCSAgY29uc3QgY2hhciAqaGV4X2VuY29kZWRfaXYpCit7CisJaW50IHJldCA9IDA7CisKKwlfX2VrZXlfaW5pdChlcGF5bG9hZCwgbWFzdGVyX2Rlc2MsIGRhdGFsZW4pOworCWlmICghaGV4X2VuY29kZWRfaXYpIHsKKwkJZ2V0X3JhbmRvbV9ieXRlcyhlcGF5bG9hZC0+aXYsIGl2c2l6ZSk7CisKKwkJZ2V0X3JhbmRvbV9ieXRlcyhlcGF5bG9hZC0+ZGVjcnlwdGVkX2RhdGEsCisJCQkJIGVwYXlsb2FkLT5kZWNyeXB0ZWRfZGF0YWxlbik7CisJfSBlbHNlCisJCXJldCA9IGVuY3J5cHRlZF9rZXlfZGVjcnlwdChlcGF5bG9hZCwgaGV4X2VuY29kZWRfaXYpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBlbmNyeXB0ZWRfaW5zdGFudGlhdGUgLSBpbnN0YW50aWF0ZSBhbiBlbmNyeXB0ZWQga2V5CisgKgorICogRGVjcnlwdCBhbiBleGlzdGluZyBlbmNyeXB0ZWQgZGF0YWJsb2Igb3IgY3JlYXRlIGEgbmV3IGVuY3J5cHRlZCBrZXkKKyAqIGJhc2VkIG9uIGEga2VybmVsIHJhbmRvbSBudW1iZXIuCisgKgorICogT24gc3VjY2VzcywgcmV0dXJuIDAuIE90aGVyd2lzZSByZXR1cm4gZXJybm8uCisgKi8KK3N0YXRpYyBpbnQgZW5jcnlwdGVkX2luc3RhbnRpYXRlKHN0cnVjdCBrZXkgKmtleSwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkgc2l6ZV90IGRhdGFsZW4pCit7CisJc3RydWN0IGVuY3J5cHRlZF9rZXlfcGF5bG9hZCAqZXBheWxvYWQgPSBOVUxMOworCWNoYXIgKmRhdGFibG9iID0gTlVMTDsKKwljaGFyICptYXN0ZXJfZGVzYyA9IE5VTEw7CisJY2hhciAqZGVjcnlwdGVkX2RhdGFsZW4gPSBOVUxMOworCWNoYXIgKmhleF9lbmNvZGVkX2l2ID0gTlVMTDsKKwlpbnQgcmV0OworCisJaWYgKGRhdGFsZW4gPD0gMCB8fCBkYXRhbGVuID4gMzI3NjcgfHwgIWRhdGEpCisJCXJldHVybiAtRUlOVkFMOworCisJZGF0YWJsb2IgPSBrbWFsbG9jKGRhdGFsZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGFibG9iKQorCQlyZXR1cm4gLUVOT01FTTsKKwlkYXRhYmxvYltkYXRhbGVuXSA9IDA7CisJbWVtY3B5KGRhdGFibG9iLCBkYXRhLCBkYXRhbGVuKTsKKwlyZXQgPSBkYXRhYmxvYl9wYXJzZShkYXRhYmxvYiwgJm1hc3Rlcl9kZXNjLCAmZGVjcnlwdGVkX2RhdGFsZW4sCisJCQkgICAgICZoZXhfZW5jb2RlZF9pdik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJZXBheWxvYWQgPSBlbmNyeXB0ZWRfa2V5X2FsbG9jKGtleSwgbWFzdGVyX2Rlc2MsIGRlY3J5cHRlZF9kYXRhbGVuKTsKKwlpZiAoSVNfRVJSKGVwYXlsb2FkKSkgeworCQlyZXQgPSBQVFJfRVJSKGVwYXlsb2FkKTsKKwkJZ290byBvdXQ7CisJfQorCXJldCA9IGVuY3J5cHRlZF9pbml0KGVwYXlsb2FkLCBtYXN0ZXJfZGVzYywgZGVjcnlwdGVkX2RhdGFsZW4sCisJCQkgICAgIGhleF9lbmNvZGVkX2l2KTsKKwlpZiAocmV0IDwgMCkgeworCQlrZnJlZShlcGF5bG9hZCk7CisJCWdvdG8gb3V0OworCX0KKworCXJjdV9hc3NpZ25fcG9pbnRlcihrZXktPnBheWxvYWQuZGF0YSwgZXBheWxvYWQpOworb3V0OgorCWtmcmVlKGRhdGFibG9iKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBlbmNyeXB0ZWRfcmN1X2ZyZWUoc3RydWN0IHJjdV9oZWFkICpyY3UpCit7CisJc3RydWN0IGVuY3J5cHRlZF9rZXlfcGF5bG9hZCAqZXBheWxvYWQ7CisKKwllcGF5bG9hZCA9IGNvbnRhaW5lcl9vZihyY3UsIHN0cnVjdCBlbmNyeXB0ZWRfa2V5X3BheWxvYWQsIHJjdSk7CisJbWVtc2V0KGVwYXlsb2FkLT5kZWNyeXB0ZWRfZGF0YSwgMCwgZXBheWxvYWQtPmRlY3J5cHRlZF9kYXRhbGVuKTsKKwlrZnJlZShlcGF5bG9hZCk7Cit9CisKKy8qCisgKiBlbmNyeXB0ZWRfdXBkYXRlIC0gdXBkYXRlIHRoZSBtYXN0ZXIga2V5IGRlc2NyaXB0aW9uCisgKgorICogQ2hhbmdlIHRoZSBtYXN0ZXIga2V5IGRlc2NyaXB0aW9uIGZvciBhbiBleGlzdGluZyBlbmNyeXB0ZWQga2V5LgorICogVGhlIG5leHQgcmVhZCB3aWxsIHJldHVybiBhbiBlbmNyeXB0ZWQgZGF0YWJsb2IgdXNpbmcgdGhlIG5ldworICogbWFzdGVyIGtleSBkZXNjcmlwdGlvbi4KKyAqCisgKiBPbiBzdWNjZXNzLCByZXR1cm4gMC4gT3RoZXJ3aXNlIHJldHVybiBlcnJuby4KKyAqLworc3RhdGljIGludCBlbmNyeXB0ZWRfdXBkYXRlKHN0cnVjdCBrZXkgKmtleSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFsZW4pCit7CisJc3RydWN0IGVuY3J5cHRlZF9rZXlfcGF5bG9hZCAqZXBheWxvYWQgPSBrZXktPnBheWxvYWQuZGF0YTsKKwlzdHJ1Y3QgZW5jcnlwdGVkX2tleV9wYXlsb2FkICpuZXdfZXBheWxvYWQ7CisJY2hhciAqYnVmOworCWNoYXIgKm5ld19tYXN0ZXJfZGVzYyA9IE5VTEw7CisJaW50IHJldCA9IDA7CisKKwlpZiAoZGF0YWxlbiA8PSAwIHx8IGRhdGFsZW4gPiAzMjc2NyB8fCAhZGF0YSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlidWYgPSBrbWFsbG9jKGRhdGFsZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlidWZbZGF0YWxlbl0gPSAwOworCW1lbWNweShidWYsIGRhdGEsIGRhdGFsZW4pOworCXJldCA9IGRhdGFibG9iX3BhcnNlKGJ1ZiwgJm5ld19tYXN0ZXJfZGVzYywgTlVMTCwgTlVMTCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJcmV0ID0gdmFsaWRfbWFzdGVyX2Rlc2MobmV3X21hc3Rlcl9kZXNjLCBlcGF5bG9hZC0+bWFzdGVyX2Rlc2MpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCW5ld19lcGF5bG9hZCA9IGVuY3J5cHRlZF9rZXlfYWxsb2Moa2V5LCBuZXdfbWFzdGVyX2Rlc2MsCisJCQkJCSAgIGVwYXlsb2FkLT5kYXRhbGVuKTsKKwlpZiAoSVNfRVJSKG5ld19lcGF5bG9hZCkpIHsKKwkJcmV0ID0gUFRSX0VSUihuZXdfZXBheWxvYWQpOworCQlnb3RvIG91dDsKKwl9CisKKwlfX2VrZXlfaW5pdChuZXdfZXBheWxvYWQsIG5ld19tYXN0ZXJfZGVzYywgZXBheWxvYWQtPmRhdGFsZW4pOworCisJbWVtY3B5KG5ld19lcGF5bG9hZC0+aXYsIGVwYXlsb2FkLT5pdiwgaXZzaXplKTsKKwltZW1jcHkobmV3X2VwYXlsb2FkLT5kZWNyeXB0ZWRfZGF0YSwgZXBheWxvYWQtPmRlY3J5cHRlZF9kYXRhLAorCSAgICAgICBlcGF5bG9hZC0+ZGVjcnlwdGVkX2RhdGFsZW4pOworCisJcmN1X2Fzc2lnbl9wb2ludGVyKGtleS0+cGF5bG9hZC5kYXRhLCBuZXdfZXBheWxvYWQpOworCWNhbGxfcmN1KCZlcGF5bG9hZC0+cmN1LCBlbmNyeXB0ZWRfcmN1X2ZyZWUpOworb3V0OgorCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGVuY3J5cHRlZF9yZWFkIC0gZm9ybWF0IGFuZCBjb3B5IHRoZSBlbmNyeXB0ZWQgZGF0YSB0byB1c2Vyc3BhY2UKKyAqCisgKiBUaGUgcmVzdWx0aW5nIGRhdGFibG9iIGZvcm1hdCBpczoKKyAqIDxtYXN0ZXIta2V5IG5hbWU+IDxkZWNyeXB0ZWQgZGF0YSBsZW5ndGg+IDxlbmNyeXB0ZWQgaXY+IDxlbmNyeXB0ZWQgZGF0YT4KKyAqCisgKiBPbiBzdWNjZXNzLCByZXR1cm4gdG8gdXNlcnNwYWNlIHRoZSBlbmNyeXB0ZWQga2V5IGRhdGFibG9iIHNpemUuCisgKi8KK3N0YXRpYyBsb25nIGVuY3J5cHRlZF9yZWFkKGNvbnN0IHN0cnVjdCBrZXkgKmtleSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgIHNpemVfdCBidWZsZW4pCit7CisJc3RydWN0IGVuY3J5cHRlZF9rZXlfcGF5bG9hZCAqZXBheWxvYWQ7CisJc3RydWN0IGtleSAqbWtleTsKKwl1OCAqbWFzdGVyX2tleTsKKwlzaXplX3QgbWFzdGVyX2tleWxlbjsKKwljaGFyIGRlcml2ZWRfa2V5W0hBU0hfU0laRV07CisJY2hhciAqYXNjaWlfYnVmOworCXNpemVfdCBhc2NpaWJsb2JfbGVuOworCWludCByZXQ7CisKKwllcGF5bG9hZCA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoa2V5LT5wYXlsb2FkLmRhdGEsCisJCQkJICByd3NlbV9pc19sb2NrZWQoJigoc3RydWN0IGtleSAqKWtleSktPnNlbSkpOworCisJLyogcmV0dXJucyB0aGUgaGV4IGVuY29kZWQgaXYsIGVuY3J5cHRlZC1kYXRhLCBhbmQgaG1hYyBhcyBhc2NpaSAqLworCWFzY2lpYmxvYl9sZW4gPSBlcGF5bG9hZC0+ZGF0YWJsb2JfbGVuICsgaXZzaXplICsgMQorCSAgICArIHJvdW5kdXAoZXBheWxvYWQtPmRlY3J5cHRlZF9kYXRhbGVuLCBibGtzaXplKQorCSAgICArIChIQVNIX1NJWkUgKiAyKTsKKworCWlmICghYnVmZmVyIHx8IGJ1ZmxlbiA8IGFzY2lpYmxvYl9sZW4pCisJCXJldHVybiBhc2NpaWJsb2JfbGVuOworCisJbWtleSA9IHJlcXVlc3RfbWFzdGVyX2tleShlcGF5bG9hZCwgJm1hc3Rlcl9rZXksICZtYXN0ZXJfa2V5bGVuKTsKKwlpZiAoSVNfRVJSKG1rZXkpKQorCQlyZXR1cm4gUFRSX0VSUihta2V5KTsKKworCXJldCA9IGdldF9kZXJpdmVkX2tleShkZXJpdmVkX2tleSwgRU5DX0tFWSwgbWFzdGVyX2tleSwgbWFzdGVyX2tleWxlbik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJcmV0ID0gZGVyaXZlZF9rZXlfZW5jcnlwdChlcGF5bG9hZCwgZGVyaXZlZF9rZXksIHNpemVvZiBkZXJpdmVkX2tleSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJcmV0ID0gZGF0YWJsb2JfaG1hY19hcHBlbmQoZXBheWxvYWQsIG1hc3Rlcl9rZXksIG1hc3Rlcl9rZXlsZW4pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCWFzY2lpX2J1ZiA9IGRhdGFibG9iX2Zvcm1hdChlcGF5bG9hZCwgYXNjaWlibG9iX2xlbik7CisJaWYgKCFhc2NpaV9idWYpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJdXBfcmVhZCgmbWtleS0+c2VtKTsKKwlrZXlfcHV0KG1rZXkpOworCisJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIGFzY2lpX2J1ZiwgYXNjaWlibG9iX2xlbikgIT0gMCkKKwkJcmV0ID0gLUVGQVVMVDsKKwlrZnJlZShhc2NpaV9idWYpOworCisJcmV0dXJuIGFzY2lpYmxvYl9sZW47CitvdXQ6CisJdXBfcmVhZCgmbWtleS0+c2VtKTsKKwlrZXlfcHV0KG1rZXkpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBlbmNyeXB0ZWRfZGVzdHJveSAtIGJlZm9yZSBmcmVlaW5nIHRoZSBrZXksIGNsZWFyIHRoZSBkZWNyeXB0ZWQgZGF0YQorICoKKyAqIEJlZm9yZSBmcmVlaW5nIHRoZSBrZXksIGNsZWFyIHRoZSBtZW1vcnkgY29udGFpbmluZyB0aGUgZGVjcnlwdGVkCisgKiBrZXkgZGF0YS4KKyAqLworc3RhdGljIHZvaWQgZW5jcnlwdGVkX2Rlc3Ryb3koc3RydWN0IGtleSAqa2V5KQoreworCXN0cnVjdCBlbmNyeXB0ZWRfa2V5X3BheWxvYWQgKmVwYXlsb2FkID0ga2V5LT5wYXlsb2FkLmRhdGE7CisKKwlpZiAoIWVwYXlsb2FkKQorCQlyZXR1cm47CisKKwltZW1zZXQoZXBheWxvYWQtPmRlY3J5cHRlZF9kYXRhLCAwLCBlcGF5bG9hZC0+ZGVjcnlwdGVkX2RhdGFsZW4pOworCWtmcmVlKGtleS0+cGF5bG9hZC5kYXRhKTsKK30KKworc3RydWN0IGtleV90eXBlIGtleV90eXBlX2VuY3J5cHRlZCA9IHsKKwkubmFtZSA9ICJlbmNyeXB0ZWQiLAorCS5pbnN0YW50aWF0ZSA9IGVuY3J5cHRlZF9pbnN0YW50aWF0ZSwKKwkudXBkYXRlID0gZW5jcnlwdGVkX3VwZGF0ZSwKKwkubWF0Y2ggPSB1c2VyX21hdGNoLAorCS5kZXN0cm95ID0gZW5jcnlwdGVkX2Rlc3Ryb3ksCisJLmRlc2NyaWJlID0gdXNlcl9kZXNjcmliZSwKKwkucmVhZCA9IGVuY3J5cHRlZF9yZWFkLAorfTsKK0VYUE9SVF9TWU1CT0xfR1BMKGtleV90eXBlX2VuY3J5cHRlZCk7CisKK3N0YXRpYyB2b2lkIGVuY3J5cHRlZF9zaGFzaF9yZWxlYXNlKHZvaWQpCit7CisJaWYgKGhhc2hhbGcpCisJCWNyeXB0b19mcmVlX3NoYXNoKGhhc2hhbGcpOworCWlmIChobWFjYWxnKQorCQljcnlwdG9fZnJlZV9zaGFzaChobWFjYWxnKTsKK30KKworc3RhdGljIGludCBfX2luaXQgZW5jcnlwdGVkX3NoYXNoX2FsbG9jKHZvaWQpCit7CisJaW50IHJldDsKKworCWhtYWNhbGcgPSBjcnlwdG9fYWxsb2Nfc2hhc2goaG1hY19hbGcsIDAsIENSWVBUT19BTEdfQVNZTkMpOworCWlmIChJU19FUlIoaG1hY2FsZykpIHsKKwkJcHJfaW5mbygiZW5jcnlwdGVkX2tleTogY291bGQgbm90IGFsbG9jYXRlIGNyeXB0byAlc1xuIiwKKwkJCWhtYWNfYWxnKTsKKwkJcmV0dXJuIFBUUl9FUlIoaG1hY2FsZyk7CisJfQorCisJaGFzaGFsZyA9IGNyeXB0b19hbGxvY19zaGFzaChoYXNoX2FsZywgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CisJaWYgKElTX0VSUihoYXNoYWxnKSkgeworCQlwcl9pbmZvKCJlbmNyeXB0ZWRfa2V5OiBjb3VsZCBub3QgYWxsb2NhdGUgY3J5cHRvICVzXG4iLAorCQkJaGFzaF9hbGcpOworCQlyZXQgPSBQVFJfRVJSKGhhc2hhbGcpOworCQlnb3RvIGhhc2hhbGdfZmFpbDsKKwl9CisKKwlyZXR1cm4gMDsKKworaGFzaGFsZ19mYWlsOgorCWNyeXB0b19mcmVlX3NoYXNoKGhtYWNhbGcpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfZW5jcnlwdGVkKHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IGVuY3J5cHRlZF9zaGFzaF9hbGxvYygpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXJldCA9IHJlZ2lzdGVyX2tleV90eXBlKCZrZXlfdHlwZV9lbmNyeXB0ZWQpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwlyZXR1cm4gYWVzX2dldF9zaXplcygpOworb3V0OgorCWVuY3J5cHRlZF9zaGFzaF9yZWxlYXNlKCk7CisJcmV0dXJuIHJldDsKKworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9lbmNyeXB0ZWQodm9pZCkKK3sKKwllbmNyeXB0ZWRfc2hhc2hfcmVsZWFzZSgpOworCXVucmVnaXN0ZXJfa2V5X3R5cGUoJmtleV90eXBlX2VuY3J5cHRlZCk7Cit9CisKK2xhdGVfaW5pdGNhbGwoaW5pdF9lbmNyeXB0ZWQpOworbW9kdWxlX2V4aXQoY2xlYW51cF9lbmNyeXB0ZWQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9rZXlzL2VuY3J5cHRlZF9kZWZpbmVkLmggYi9zZWN1cml0eS9rZXlzL2VuY3J5cHRlZF9kZWZpbmVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VmNWUyZgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L2tleXMvZW5jcnlwdGVkX2RlZmluZWQuaApAQCAtMCwwICsxLDU0IEBACisjaWZuZGVmIF9fRU5DUllQVEVEX0tFWV9ICisjZGVmaW5lIF9fRU5DUllQVEVEX0tFWV9ICisKKyNkZWZpbmUgRU5DUllQVEVEX0RFQlVHIDAKKworI2lmIEVOQ1JZUFRFRF9ERUJVRworc3RhdGljIGlubGluZSB2b2lkIGR1bXBfbWFzdGVyX2tleShjb25zdCB1OCAqbWFzdGVyX2tleSwgc2l6ZV90IG1hc3Rlcl9rZXlsZW4pCit7CisJcHJpbnRfaGV4X2R1bXAoS0VSTl9FUlIsICJtYXN0ZXIga2V5OiAiLCBEVU1QX1BSRUZJWF9OT05FLCAzMiwgMSwKKwkJICAgICAgIG1hc3Rlcl9rZXksIG1hc3Rlcl9rZXlsZW4sIDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHVtcF9kZWNyeXB0ZWRfZGF0YShzdHJ1Y3QgZW5jcnlwdGVkX2tleV9wYXlsb2FkICplcGF5bG9hZCkKK3sKKwlwcmludF9oZXhfZHVtcChLRVJOX0VSUiwgImRlY3J5cHRlZCBkYXRhOiAiLCBEVU1QX1BSRUZJWF9OT05FLCAzMiwgMSwKKwkJICAgICAgIGVwYXlsb2FkLT5kZWNyeXB0ZWRfZGF0YSwKKwkJICAgICAgIGVwYXlsb2FkLT5kZWNyeXB0ZWRfZGF0YWxlbiwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX2VuY3J5cHRlZF9kYXRhKHN0cnVjdCBlbmNyeXB0ZWRfa2V5X3BheWxvYWQgKmVwYXlsb2FkLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgZW5jcnlwdGVkX2RhdGFsZW4pCit7CisJcHJpbnRfaGV4X2R1bXAoS0VSTl9FUlIsICJlbmNyeXB0ZWQgZGF0YTogIiwgRFVNUF9QUkVGSVhfTk9ORSwgMzIsIDEsCisJCSAgICAgICBlcGF5bG9hZC0+ZW5jcnlwdGVkX2RhdGEsIGVuY3J5cHRlZF9kYXRhbGVuLCAwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGR1bXBfaG1hYyhjb25zdCBjaGFyICpzdHIsIGNvbnN0IHU4ICpkaWdlc3QsCisJCQkgICAgIHVuc2lnbmVkIGludCBobWFjX3NpemUpCit7CisJaWYgKHN0cikKKwkJcHJfaW5mbygiZW5jcnlwdGVkX2tleTogJXMiLCBzdHIpOworCXByaW50X2hleF9kdW1wKEtFUk5fRVJSLCAiaG1hYzogIiwgRFVNUF9QUkVGSVhfTk9ORSwgMzIsIDEsIGRpZ2VzdCwKKwkJICAgICAgIGhtYWNfc2l6ZSwgMCk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGR1bXBfbWFzdGVyX2tleShjb25zdCB1OCAqbWFzdGVyX2tleSwgc2l6ZV90IG1hc3Rlcl9rZXlsZW4pCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX2RlY3J5cHRlZF9kYXRhKHN0cnVjdCBlbmNyeXB0ZWRfa2V5X3BheWxvYWQgKmVwYXlsb2FkKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHVtcF9lbmNyeXB0ZWRfZGF0YShzdHJ1Y3QgZW5jcnlwdGVkX2tleV9wYXlsb2FkICplcGF5bG9hZCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IGVuY3J5cHRlZF9kYXRhbGVuKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHVtcF9obWFjKGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgdTggKmRpZ2VzdCwKKwkJCSAgICAgdW5zaWduZWQgaW50IGhtYWNfc2l6ZSkKK3sKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cml0eS9rZXlzL3RydXN0ZWRfZGVmaW5lZC5jIGIvc2VjdXJpdHkva2V5cy90cnVzdGVkX2RlZmluZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzVlOWYyCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkva2V5cy90cnVzdGVkX2RlZmluZWQuYwpAQCAtMCwwICsxLDExNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgSUJNIENvcnBvcmF0aW9uCisgKgorICogQXV0aG9yOgorICogRGF2aWQgU2FmZm9yZCA8c2FmZm9yZEB1cy5pYm0uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqIFNlZSBEb2N1bWVudGF0aW9uL2tleXMtdHJ1c3RlZC1lbmNyeXB0ZWQudHh0CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGtleXMvdXNlci10eXBlLmg+CisjaW5jbHVkZSA8a2V5cy90cnVzdGVkLXR5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXktdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSA8Y3J5cHRvL2hhc2guaD4KKyNpbmNsdWRlIDxjcnlwdG8vc2hhLmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3RwbS5oPgorI2luY2x1ZGUgPGxpbnV4L3RwbV9jb21tYW5kLmg+CisKKyNpbmNsdWRlICJ0cnVzdGVkX2RlZmluZWQuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgaG1hY19hbGdbXSA9ICJobWFjKHNoYTEpIjsKK3N0YXRpYyBjb25zdCBjaGFyIGhhc2hfYWxnW10gPSAic2hhMSI7CisKK3N0cnVjdCBzZGVzYyB7CisJc3RydWN0IHNoYXNoX2Rlc2Mgc2hhc2g7CisJY2hhciBjdHhbXTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX3NoYXNoICpoYXNoYWxnOworc3RhdGljIHN0cnVjdCBjcnlwdG9fc2hhc2ggKmhtYWNhbGc7CisKK3N0YXRpYyBzdHJ1Y3Qgc2Rlc2MgKmluaXRfc2Rlc2Moc3RydWN0IGNyeXB0b19zaGFzaCAqYWxnKQoreworCXN0cnVjdCBzZGVzYyAqc2Rlc2M7CisJaW50IHNpemU7CisKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBzaGFzaF9kZXNjKSArIGNyeXB0b19zaGFzaF9kZXNjc2l6ZShhbGcpOworCXNkZXNjID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNkZXNjKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlzZGVzYy0+c2hhc2gudGZtID0gYWxnOworCXNkZXNjLT5zaGFzaC5mbGFncyA9IDB4MDsKKwlyZXR1cm4gc2Rlc2M7Cit9CisKK3N0YXRpYyBpbnQgVFNTX3NoYTEoY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgaW50IGRhdGFsZW4sCisJCSAgICB1bnNpZ25lZCBjaGFyICpkaWdlc3QpCit7CisJc3RydWN0IHNkZXNjICpzZGVzYzsKKwlpbnQgcmV0OworCisJc2Rlc2MgPSBpbml0X3NkZXNjKGhhc2hhbGcpOworCWlmIChJU19FUlIoc2Rlc2MpKSB7CisJCXByX2luZm8oInRydXN0ZWRfa2V5OiBjYW4ndCBhbGxvYyAlc1xuIiwgaGFzaF9hbGcpOworCQlyZXR1cm4gUFRSX0VSUihzZGVzYyk7CisJfQorCisJcmV0ID0gY3J5cHRvX3NoYXNoX2RpZ2VzdCgmc2Rlc2MtPnNoYXNoLCBkYXRhLCBkYXRhbGVuLCBkaWdlc3QpOworCWtmcmVlKHNkZXNjKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IFRTU19yYXdobWFjKHVuc2lnbmVkIGNoYXIgKmRpZ2VzdCwgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LAorCQkgICAgICAgdW5zaWduZWQgaW50IGtleWxlbiwgLi4uKQoreworCXN0cnVjdCBzZGVzYyAqc2Rlc2M7CisJdmFfbGlzdCBhcmdwOworCXVuc2lnbmVkIGludCBkbGVuOworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisJaW50IHJldDsKKworCXNkZXNjID0gaW5pdF9zZGVzYyhobWFjYWxnKTsKKwlpZiAoSVNfRVJSKHNkZXNjKSkgeworCQlwcl9pbmZvKCJ0cnVzdGVkX2tleTogY2FuJ3QgYWxsb2MgJXNcbiIsIGhtYWNfYWxnKTsKKwkJcmV0dXJuIFBUUl9FUlIoc2Rlc2MpOworCX0KKworCXJldCA9IGNyeXB0b19zaGFzaF9zZXRrZXkoaG1hY2FsZywga2V5LCBrZXlsZW4pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwlyZXQgPSBjcnlwdG9fc2hhc2hfaW5pdCgmc2Rlc2MtPnNoYXNoKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwl2YV9zdGFydChhcmdwLCBrZXlsZW4pOworCWZvciAoOzspIHsKKwkJZGxlbiA9IHZhX2FyZyhhcmdwLCB1bnNpZ25lZCBpbnQpOworCQlpZiAoZGxlbiA9PSAwKQorCQkJYnJlYWs7CisJCWRhdGEgPSB2YV9hcmcoYXJncCwgdW5zaWduZWQgY2hhciAqKTsKKwkJaWYgKGRhdGEgPT0gTlVMTCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlyZXQgPSBjcnlwdG9fc2hhc2hfdXBkYXRlKCZzZGVzYy0+c2hhc2gsIGRhdGEsIGRsZW4pOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0OworCX0KKwl2YV9lbmQoYXJncCk7CisJaWYgKCFyZXQpCisJCXJldCA9IGNyeXB0b19zaGFzaF9maW5hbCgmc2Rlc2MtPnNoYXNoLCBkaWdlc3QpOworb3V0OgorCWtmcmVlKHNkZXNjKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogY2FsY3VsYXRlIGF1dGhvcml6YXRpb24gaW5mbyBmaWVsZHMgdG8gc2VuZCB0byBUUE0KKyAqLworc3RhdGljIGludCBUU1NfYXV0aGhtYWModW5zaWduZWQgY2hhciAqZGlnZXN0LCBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksCisJCQl1bnNpZ25lZCBpbnQga2V5bGVuLCB1bnNpZ25lZCBjaGFyICpoMSwKKwkJCXVuc2lnbmVkIGNoYXIgKmgyLCB1bnNpZ25lZCBjaGFyIGgzLCAuLi4pCit7CisJdW5zaWduZWQgY2hhciBwYXJhbWRpZ2VzdFtTSEExX0RJR0VTVF9TSVpFXTsKKwlzdHJ1Y3Qgc2Rlc2MgKnNkZXNjOworCXVuc2lnbmVkIGludCBkbGVuOworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisJdW5zaWduZWQgY2hhciBjOworCWludCByZXQ7CisJdmFfbGlzdCBhcmdwOworCisJc2Rlc2MgPSBpbml0X3NkZXNjKGhhc2hhbGcpOworCWlmIChJU19FUlIoc2Rlc2MpKSB7CisJCXByX2luZm8oInRydXN0ZWRfa2V5OiBjYW4ndCBhbGxvYyAlc1xuIiwgaGFzaF9hbGcpOworCQlyZXR1cm4gUFRSX0VSUihzZGVzYyk7CisJfQorCisJYyA9IGgzOworCXJldCA9IGNyeXB0b19zaGFzaF9pbml0KCZzZGVzYy0+c2hhc2gpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwl2YV9zdGFydChhcmdwLCBoMyk7CisJZm9yICg7OykgeworCQlkbGVuID0gdmFfYXJnKGFyZ3AsIHVuc2lnbmVkIGludCk7CisJCWlmIChkbGVuID09IDApCisJCQlicmVhazsKKwkJZGF0YSA9IHZhX2FyZyhhcmdwLCB1bnNpZ25lZCBjaGFyICopOworCQlyZXQgPSBjcnlwdG9fc2hhc2hfdXBkYXRlKCZzZGVzYy0+c2hhc2gsIGRhdGEsIGRsZW4pOworCQlpZiAocmV0IDwgMCkgeworCQkJdmFfZW5kKGFyZ3ApOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJdmFfZW5kKGFyZ3ApOworCXJldCA9IGNyeXB0b19zaGFzaF9maW5hbCgmc2Rlc2MtPnNoYXNoLCBwYXJhbWRpZ2VzdCk7CisJaWYgKCFyZXQpCisJCXJldCA9IFRTU19yYXdobWFjKGRpZ2VzdCwga2V5LCBrZXlsZW4sIFNIQTFfRElHRVNUX1NJWkUsCisJCQkJICBwYXJhbWRpZ2VzdCwgVFBNX05PTkNFX1NJWkUsIGgxLAorCQkJCSAgVFBNX05PTkNFX1NJWkUsIGgyLCAxLCAmYywgMCwgMCk7CitvdXQ6CisJa2ZyZWUoc2Rlc2MpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiB2ZXJpZnkgdGhlIEFVVEgxX0NPTU1BTkQgKFNlYWwpIHJlc3VsdCBmcm9tIFRQTQorICovCitzdGF0aWMgaW50IFRTU19jaGVja2htYWMxKHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwKKwkJCSAgY29uc3QgdWludDMyX3QgY29tbWFuZCwKKwkJCSAgY29uc3QgdW5zaWduZWQgY2hhciAqb25vbmNlLAorCQkJICBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksCisJCQkgIHVuc2lnbmVkIGludCBrZXlsZW4sIC4uLikKK3sKKwl1aW50MzJfdCBidWZzaXplOworCXVpbnQxNl90IHRhZzsKKwl1aW50MzJfdCBvcmRpbmFsOworCXVpbnQzMl90IHJlc3VsdDsKKwl1bnNpZ25lZCBjaGFyICplbm9uY2U7CisJdW5zaWduZWQgY2hhciAqY29udGludWVmbGFnOworCXVuc2lnbmVkIGNoYXIgKmF1dGhkYXRhOworCXVuc2lnbmVkIGNoYXIgdGVzdGhtYWNbU0hBMV9ESUdFU1RfU0laRV07CisJdW5zaWduZWQgY2hhciBwYXJhbWRpZ2VzdFtTSEExX0RJR0VTVF9TSVpFXTsKKwlzdHJ1Y3Qgc2Rlc2MgKnNkZXNjOworCXVuc2lnbmVkIGludCBkbGVuOworCXVuc2lnbmVkIGludCBkcG9zOworCXZhX2xpc3QgYXJncDsKKwlpbnQgcmV0OworCisJYnVmc2l6ZSA9IExPQUQzMihidWZmZXIsIFRQTV9TSVpFX09GRlNFVCk7CisJdGFnID0gTE9BRDE2KGJ1ZmZlciwgMCk7CisJb3JkaW5hbCA9IGNvbW1hbmQ7CisJcmVzdWx0ID0gTE9BRDMyTihidWZmZXIsIFRQTV9SRVRVUk5fT0ZGU0VUKTsKKwlpZiAodGFnID09IFRQTV9UQUdfUlNQX0NPTU1BTkQpCisJCXJldHVybiAwOworCWlmICh0YWcgIT0gVFBNX1RBR19SU1BfQVVUSDFfQ09NTUFORCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJYXV0aGRhdGEgPSBidWZmZXIgKyBidWZzaXplIC0gU0hBMV9ESUdFU1RfU0laRTsKKwljb250aW51ZWZsYWcgPSBhdXRoZGF0YSAtIDE7CisJZW5vbmNlID0gY29udGludWVmbGFnIC0gVFBNX05PTkNFX1NJWkU7CisKKwlzZGVzYyA9IGluaXRfc2Rlc2MoaGFzaGFsZyk7CisJaWYgKElTX0VSUihzZGVzYykpIHsKKwkJcHJfaW5mbygidHJ1c3RlZF9rZXk6IGNhbid0IGFsbG9jICVzXG4iLCBoYXNoX2FsZyk7CisJCXJldHVybiBQVFJfRVJSKHNkZXNjKTsKKwl9CisJcmV0ID0gY3J5cHRvX3NoYXNoX2luaXQoJnNkZXNjLT5zaGFzaCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCXJldCA9IGNyeXB0b19zaGFzaF91cGRhdGUoJnNkZXNjLT5zaGFzaCwgKGNvbnN0IHU4ICopJnJlc3VsdCwKKwkJCQkgIHNpemVvZiByZXN1bHQpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwlyZXQgPSBjcnlwdG9fc2hhc2hfdXBkYXRlKCZzZGVzYy0+c2hhc2gsIChjb25zdCB1OCAqKSZvcmRpbmFsLAorCQkJCSAgc2l6ZW9mIG9yZGluYWwpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwl2YV9zdGFydChhcmdwLCBrZXlsZW4pOworCWZvciAoOzspIHsKKwkJZGxlbiA9IHZhX2FyZyhhcmdwLCB1bnNpZ25lZCBpbnQpOworCQlpZiAoZGxlbiA9PSAwKQorCQkJYnJlYWs7CisJCWRwb3MgPSB2YV9hcmcoYXJncCwgdW5zaWduZWQgaW50KTsKKwkJcmV0ID0gY3J5cHRvX3NoYXNoX3VwZGF0ZSgmc2Rlc2MtPnNoYXNoLCBidWZmZXIgKyBkcG9zLCBkbGVuKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXZhX2VuZChhcmdwKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCXZhX2VuZChhcmdwKTsKKwlyZXQgPSBjcnlwdG9fc2hhc2hfZmluYWwoJnNkZXNjLT5zaGFzaCwgcGFyYW1kaWdlc3QpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCXJldCA9IFRTU19yYXdobWFjKHRlc3RobWFjLCBrZXksIGtleWxlbiwgU0hBMV9ESUdFU1RfU0laRSwgcGFyYW1kaWdlc3QsCisJCQkgIFRQTV9OT05DRV9TSVpFLCBlbm9uY2UsIFRQTV9OT05DRV9TSVpFLCBvbm9uY2UsCisJCQkgIDEsIGNvbnRpbnVlZmxhZywgMCwgMCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJaWYgKG1lbWNtcCh0ZXN0aG1hYywgYXV0aGRhdGEsIFNIQTFfRElHRVNUX1NJWkUpKQorCQlyZXQgPSAtRUlOVkFMOworb3V0OgorCWtmcmVlKHNkZXNjKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogdmVyaWZ5IHRoZSBBVVRIMl9DT01NQU5EICh1bnNlYWwpIHJlc3VsdCBmcm9tIFRQTQorICovCitzdGF0aWMgaW50IFRTU19jaGVja2htYWMyKHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwKKwkJCSAgY29uc3QgdWludDMyX3QgY29tbWFuZCwKKwkJCSAgY29uc3QgdW5zaWduZWQgY2hhciAqb25vbmNlLAorCQkJICBjb25zdCB1bnNpZ25lZCBjaGFyICprZXkxLAorCQkJICB1bnNpZ25lZCBpbnQga2V5bGVuMSwKKwkJCSAgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5MiwKKwkJCSAgdW5zaWduZWQgaW50IGtleWxlbjIsIC4uLikKK3sKKwl1aW50MzJfdCBidWZzaXplOworCXVpbnQxNl90IHRhZzsKKwl1aW50MzJfdCBvcmRpbmFsOworCXVpbnQzMl90IHJlc3VsdDsKKwl1bnNpZ25lZCBjaGFyICplbm9uY2UxOworCXVuc2lnbmVkIGNoYXIgKmNvbnRpbnVlZmxhZzE7CisJdW5zaWduZWQgY2hhciAqYXV0aGRhdGExOworCXVuc2lnbmVkIGNoYXIgKmVub25jZTI7CisJdW5zaWduZWQgY2hhciAqY29udGludWVmbGFnMjsKKwl1bnNpZ25lZCBjaGFyICphdXRoZGF0YTI7CisJdW5zaWduZWQgY2hhciB0ZXN0aG1hYzFbU0hBMV9ESUdFU1RfU0laRV07CisJdW5zaWduZWQgY2hhciB0ZXN0aG1hYzJbU0hBMV9ESUdFU1RfU0laRV07CisJdW5zaWduZWQgY2hhciBwYXJhbWRpZ2VzdFtTSEExX0RJR0VTVF9TSVpFXTsKKwlzdHJ1Y3Qgc2Rlc2MgKnNkZXNjOworCXVuc2lnbmVkIGludCBkbGVuOworCXVuc2lnbmVkIGludCBkcG9zOworCXZhX2xpc3QgYXJncDsKKwlpbnQgcmV0OworCisJYnVmc2l6ZSA9IExPQUQzMihidWZmZXIsIFRQTV9TSVpFX09GRlNFVCk7CisJdGFnID0gTE9BRDE2KGJ1ZmZlciwgMCk7CisJb3JkaW5hbCA9IGNvbW1hbmQ7CisJcmVzdWx0ID0gTE9BRDMyTihidWZmZXIsIFRQTV9SRVRVUk5fT0ZGU0VUKTsKKworCWlmICh0YWcgPT0gVFBNX1RBR19SU1BfQ09NTUFORCkKKwkJcmV0dXJuIDA7CisJaWYgKHRhZyAhPSBUUE1fVEFHX1JTUF9BVVRIMl9DT01NQU5EKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlhdXRoZGF0YTEgPSBidWZmZXIgKyBidWZzaXplIC0gKFNIQTFfRElHRVNUX1NJWkUgKyAxCisJCQkrIFNIQTFfRElHRVNUX1NJWkUgKyBTSEExX0RJR0VTVF9TSVpFKTsKKwlhdXRoZGF0YTIgPSBidWZmZXIgKyBidWZzaXplIC0gKFNIQTFfRElHRVNUX1NJWkUpOworCWNvbnRpbnVlZmxhZzEgPSBhdXRoZGF0YTEgLSAxOworCWNvbnRpbnVlZmxhZzIgPSBhdXRoZGF0YTIgLSAxOworCWVub25jZTEgPSBjb250aW51ZWZsYWcxIC0gVFBNX05PTkNFX1NJWkU7CisJZW5vbmNlMiA9IGNvbnRpbnVlZmxhZzIgLSBUUE1fTk9OQ0VfU0laRTsKKworCXNkZXNjID0gaW5pdF9zZGVzYyhoYXNoYWxnKTsKKwlpZiAoSVNfRVJSKHNkZXNjKSkgeworCQlwcl9pbmZvKCJ0cnVzdGVkX2tleTogY2FuJ3QgYWxsb2MgJXNcbiIsIGhhc2hfYWxnKTsKKwkJcmV0dXJuIFBUUl9FUlIoc2Rlc2MpOworCX0KKwlyZXQgPSBjcnlwdG9fc2hhc2hfaW5pdCgmc2Rlc2MtPnNoYXNoKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisJcmV0ID0gY3J5cHRvX3NoYXNoX3VwZGF0ZSgmc2Rlc2MtPnNoYXNoLCAoY29uc3QgdTggKikmcmVzdWx0LAorCQkJCSAgc2l6ZW9mIHJlc3VsdCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCXJldCA9IGNyeXB0b19zaGFzaF91cGRhdGUoJnNkZXNjLT5zaGFzaCwgKGNvbnN0IHU4ICopJm9yZGluYWwsCisJCQkJICBzaXplb2Ygb3JkaW5hbCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJdmFfc3RhcnQoYXJncCwga2V5bGVuMik7CisJZm9yICg7OykgeworCQlkbGVuID0gdmFfYXJnKGFyZ3AsIHVuc2lnbmVkIGludCk7CisJCWlmIChkbGVuID09IDApCisJCQlicmVhazsKKwkJZHBvcyA9IHZhX2FyZyhhcmdwLCB1bnNpZ25lZCBpbnQpOworCQlyZXQgPSBjcnlwdG9fc2hhc2hfdXBkYXRlKCZzZGVzYy0+c2hhc2gsIGJ1ZmZlciArIGRwb3MsIGRsZW4pOworCQlpZiAocmV0IDwgMCkgeworCQkJdmFfZW5kKGFyZ3ApOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJdmFfZW5kKGFyZ3ApOworCXJldCA9IGNyeXB0b19zaGFzaF9maW5hbCgmc2Rlc2MtPnNoYXNoLCBwYXJhbWRpZ2VzdCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJcmV0ID0gVFNTX3Jhd2htYWModGVzdGhtYWMxLCBrZXkxLCBrZXlsZW4xLCBTSEExX0RJR0VTVF9TSVpFLAorCQkJICBwYXJhbWRpZ2VzdCwgVFBNX05PTkNFX1NJWkUsIGVub25jZTEsCisJCQkgIFRQTV9OT05DRV9TSVpFLCBvbm9uY2UsIDEsIGNvbnRpbnVlZmxhZzEsIDAsIDApOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwlpZiAobWVtY21wKHRlc3RobWFjMSwgYXV0aGRhdGExLCBTSEExX0RJR0VTVF9TSVpFKSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJcmV0ID0gVFNTX3Jhd2htYWModGVzdGhtYWMyLCBrZXkyLCBrZXlsZW4yLCBTSEExX0RJR0VTVF9TSVpFLAorCQkJICBwYXJhbWRpZ2VzdCwgVFBNX05PTkNFX1NJWkUsIGVub25jZTIsCisJCQkgIFRQTV9OT05DRV9TSVpFLCBvbm9uY2UsIDEsIGNvbnRpbnVlZmxhZzIsIDAsIDApOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwlpZiAobWVtY21wKHRlc3RobWFjMiwgYXV0aGRhdGEyLCBTSEExX0RJR0VTVF9TSVpFKSkKKwkJcmV0ID0gLUVJTlZBTDsKK291dDoKKwlrZnJlZShzZGVzYyk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZvciBrZXkgc3BlY2lmaWMgdHBtIHJlcXVlc3RzLCB3ZSB3aWxsIGdlbmVyYXRlIGFuZCBzZW5kIG91cgorICogb3duIFRQTSBjb21tYW5kIHBhY2tldHMgdXNpbmcgdGhlIGRyaXZlcnMgc2VuZCBmdW5jdGlvbi4KKyAqLworc3RhdGljIGludCB0cnVzdGVkX3RwbV9zZW5kKGNvbnN0IHUzMiBjaGlwX251bSwgdW5zaWduZWQgY2hhciAqY21kLAorCQkJICAgIHNpemVfdCBidWZsZW4pCit7CisJaW50IHJjOworCisJZHVtcF90cG1fYnVmKGNtZCk7CisJcmMgPSB0cG1fc2VuZChjaGlwX251bSwgY21kLCBidWZsZW4pOworCWR1bXBfdHBtX2J1ZihjbWQpOworCWlmIChyYyA+IDApCisJCS8qIENhbid0IHJldHVybiBwb3NpdGl2ZSByZXR1cm4gY29kZXMgdmFsdWVzIHRvIGtleWN0bCAqLworCQlyYyA9IC1FUEVSTTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBnZXQgYSByYW5kb20gdmFsdWUgZnJvbSBUUE0KKyAqLworc3RhdGljIGludCB0cG1fZ2V0X3JhbmRvbShzdHJ1Y3QgdHBtX2J1ZiAqdGIsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdWludDMyX3QgbGVuKQoreworCWludCByZXQ7CisKKwlJTklUX0JVRih0Yik7CisJc3RvcmUxNih0YiwgVFBNX1RBR19SUVVfQ09NTUFORCk7CisJc3RvcmUzMih0YiwgVFBNX0dFVFJBTkRPTV9TSVpFKTsKKwlzdG9yZTMyKHRiLCBUUE1fT1JEX0dFVFJBTkRPTSk7CisJc3RvcmUzMih0YiwgbGVuKTsKKwlyZXQgPSB0cnVzdGVkX3RwbV9zZW5kKFRQTV9BTllfTlVNLCB0Yi0+ZGF0YSwgc2l6ZW9mIHRiLT5kYXRhKTsKKwlpZiAoIXJldCkKKwkJbWVtY3B5KGJ1ZiwgdGItPmRhdGEgKyBUUE1fR0VUUkFORE9NX1NJWkUsIGxlbik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBteV9nZXRfcmFuZG9tKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgdHBtX2J1ZiAqdGI7CisJaW50IHJldDsKKworCXRiID0ga21hbGxvYyhzaXplb2YgKnRiLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRiKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXQgPSB0cG1fZ2V0X3JhbmRvbSh0YiwgYnVmLCBsZW4pOworCisJa2ZyZWUodGIpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBMb2NrIGEgdHJ1c3RlZCBrZXksIGJ5IGV4dGVuZGluZyBhIHNlbGVjdGVkIFBDUi4KKyAqCisgKiBQcmV2ZW50cyBhIHRydXN0ZWQga2V5IHRoYXQgaXMgc2VhbGVkIHRvIFBDUnMgZnJvbSBiZWluZyBhY2Nlc3NlZC4KKyAqIFRoaXMgdXNlcyB0aGUgdHBtIGRyaXZlcidzIGV4dGVuZCBmdW5jdGlvbi4KKyAqLworc3RhdGljIGludCBwY3Jsb2NrKGNvbnN0IGludCBwY3JudW0pCit7CisJdW5zaWduZWQgY2hhciBoYXNoW1NIQTFfRElHRVNUX1NJWkVdOworCWludCByZXQ7CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisJcmV0ID0gbXlfZ2V0X3JhbmRvbShoYXNoLCBTSEExX0RJR0VTVF9TSVpFKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gdHBtX3Bjcl9leHRlbmQoVFBNX0FOWV9OVU0sIHBjcm51bSwgaGFzaCkgPyAtRUlOVkFMIDogMDsKK30KKworLyoKKyAqIENyZWF0ZSBhbiBvYmplY3Qgc3BlY2lmaWMgYXV0aG9yaXNhdGlvbiBwcm90b2NvbCAoT1NBUCkgc2Vzc2lvbgorICovCitzdGF0aWMgaW50IG9zYXAoc3RydWN0IHRwbV9idWYgKnRiLCBzdHJ1Y3Qgb3NhcHNlc3MgKnMsCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgdWludDE2X3QgdHlwZSwgdWludDMyX3QgaGFuZGxlKQoreworCXVuc2lnbmVkIGNoYXIgZW5vbmNlW1RQTV9OT05DRV9TSVpFXTsKKwl1bnNpZ25lZCBjaGFyIG9ub25jZVtUUE1fTk9OQ0VfU0laRV07CisJaW50IHJldDsKKworCXJldCA9IHRwbV9nZXRfcmFuZG9tKHRiLCBvbm9uY2UsIFRQTV9OT05DRV9TSVpFKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCUlOSVRfQlVGKHRiKTsKKwlzdG9yZTE2KHRiLCBUUE1fVEFHX1JRVV9DT01NQU5EKTsKKwlzdG9yZTMyKHRiLCBUUE1fT1NBUF9TSVpFKTsKKwlzdG9yZTMyKHRiLCBUUE1fT1JEX09TQVApOworCXN0b3JlMTYodGIsIHR5cGUpOworCXN0b3JlMzIodGIsIGhhbmRsZSk7CisJc3RvcmVieXRlcyh0Yiwgb25vbmNlLCBUUE1fTk9OQ0VfU0laRSk7CisKKwlyZXQgPSB0cnVzdGVkX3RwbV9zZW5kKFRQTV9BTllfTlVNLCB0Yi0+ZGF0YSwgTUFYX0JVRl9TSVpFKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXMtPmhhbmRsZSA9IExPQUQzMih0Yi0+ZGF0YSwgVFBNX0RBVEFfT0ZGU0VUKTsKKwltZW1jcHkocy0+ZW5vbmNlLCAmKHRiLT5kYXRhW1RQTV9EQVRBX09GRlNFVCArIHNpemVvZih1aW50MzJfdCldKSwKKwkgICAgICAgVFBNX05PTkNFX1NJWkUpOworCW1lbWNweShlbm9uY2UsICYodGItPmRhdGFbVFBNX0RBVEFfT0ZGU0VUICsgc2l6ZW9mKHVpbnQzMl90KSArCisJCQkJICBUUE1fTk9OQ0VfU0laRV0pLCBUUE1fTk9OQ0VfU0laRSk7CisJcmV0dXJuIFRTU19yYXdobWFjKHMtPnNlY3JldCwga2V5LCBTSEExX0RJR0VTVF9TSVpFLCBUUE1fTk9OQ0VfU0laRSwKKwkJCSAgIGVub25jZSwgVFBNX05PTkNFX1NJWkUsIG9ub25jZSwgMCwgMCk7Cit9CisKKy8qCisgKiBDcmVhdGUgYW4gb2JqZWN0IGluZGVwZW5kZW50IGF1dGhvcmlzYXRpb24gcHJvdG9jb2wgKG9pYXApIHNlc3Npb24KKyAqLworc3RhdGljIGludCBvaWFwKHN0cnVjdCB0cG1fYnVmICp0YiwgdWludDMyX3QgKmhhbmRsZSwgdW5zaWduZWQgY2hhciAqbm9uY2UpCit7CisJaW50IHJldDsKKworCUlOSVRfQlVGKHRiKTsKKwlzdG9yZTE2KHRiLCBUUE1fVEFHX1JRVV9DT01NQU5EKTsKKwlzdG9yZTMyKHRiLCBUUE1fT0lBUF9TSVpFKTsKKwlzdG9yZTMyKHRiLCBUUE1fT1JEX09JQVApOworCXJldCA9IHRydXN0ZWRfdHBtX3NlbmQoVFBNX0FOWV9OVU0sIHRiLT5kYXRhLCBNQVhfQlVGX1NJWkUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJKmhhbmRsZSA9IExPQUQzMih0Yi0+ZGF0YSwgVFBNX0RBVEFfT0ZGU0VUKTsKKwltZW1jcHkobm9uY2UsICZ0Yi0+ZGF0YVtUUE1fREFUQV9PRkZTRVQgKyBzaXplb2YodWludDMyX3QpXSwKKwkgICAgICAgVFBNX05PTkNFX1NJWkUpOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgdHBtX2RpZ2VzdHMgeworCXVuc2lnbmVkIGNoYXIgZW5jYXV0aFtTSEExX0RJR0VTVF9TSVpFXTsKKwl1bnNpZ25lZCBjaGFyIHB1YmF1dGhbU0hBMV9ESUdFU1RfU0laRV07CisJdW5zaWduZWQgY2hhciB4b3J3b3JrW1NIQTFfRElHRVNUX1NJWkUgKiAyXTsKKwl1bnNpZ25lZCBjaGFyIHhvcmhhc2hbU0hBMV9ESUdFU1RfU0laRV07CisJdW5zaWduZWQgY2hhciBub25jZW9kZFtUUE1fTk9OQ0VfU0laRV07Cit9OworCisvKgorICogSGF2ZSB0aGUgVFBNIHNlYWwoZW5jcnlwdCkgdGhlIHRydXN0ZWQga2V5LCBwb3NzaWJseSBiYXNlZCBvbgorICogUGxhdGZvcm0gQ29uZmlndXJhdGlvbiBSZWdpc3RlcnMgKFBDUnMpLiBBVVRIMSBmb3Igc2VhbGluZyBrZXkuCisgKi8KK3N0YXRpYyBpbnQgdHBtX3NlYWwoc3RydWN0IHRwbV9idWYgKnRiLCB1aW50MTZfdCBrZXl0eXBlLAorCQkgICAgdWludDMyX3Qga2V5aGFuZGxlLCBjb25zdCB1bnNpZ25lZCBjaGFyICprZXlhdXRoLAorCQkgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgdWludDMyX3QgZGF0YWxlbiwKKwkJICAgIHVuc2lnbmVkIGNoYXIgKmJsb2IsIHVpbnQzMl90ICpibG9ibGVuLAorCQkgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYmxvYmF1dGgsCisJCSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwY3JpbmZvLCB1aW50MzJfdCBwY3JpbmZvc2l6ZSkKK3sKKwlzdHJ1Y3Qgb3NhcHNlc3Mgc2VzczsKKwlzdHJ1Y3QgdHBtX2RpZ2VzdHMgKnRkOworCXVuc2lnbmVkIGNoYXIgY29udDsKKwl1aW50MzJfdCBvcmRpbmFsOworCXVpbnQzMl90IHBjcnNpemU7CisJdWludDMyX3QgZGF0c2l6ZTsKKwlpbnQgc2VhbGluZm9zaXplOworCWludCBlbmNkYXRhc2l6ZTsKKwlpbnQgc3RvcmVkc2l6ZTsKKwlpbnQgcmV0OworCWludCBpOworCisJLyogYWxsb2Mgc29tZSB3b3JrIHNwYWNlIGZvciBhbGwgdGhlIGhhc2hlcyAqLworCXRkID0ga21hbGxvYyhzaXplb2YgKnRkLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRkKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIGdldCBzZXNzaW9uIGZvciBzZWFsaW5nIGtleSAqLworCXJldCA9IG9zYXAodGIsICZzZXNzLCBrZXlhdXRoLCBrZXl0eXBlLCBrZXloYW5kbGUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWR1bXBfc2Vzcygmc2Vzcyk7CisKKwkvKiBjYWxjdWxhdGUgZW5jcnlwdGVkIGF1dGhvcml6YXRpb24gdmFsdWUgKi8KKwltZW1jcHkodGQtPnhvcndvcmssIHNlc3Muc2VjcmV0LCBTSEExX0RJR0VTVF9TSVpFKTsKKwltZW1jcHkodGQtPnhvcndvcmsgKyBTSEExX0RJR0VTVF9TSVpFLCBzZXNzLmVub25jZSwgU0hBMV9ESUdFU1RfU0laRSk7CisJcmV0ID0gVFNTX3NoYTEodGQtPnhvcndvcmssIFNIQTFfRElHRVNUX1NJWkUgKiAyLCB0ZC0+eG9yaGFzaCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB0cG1fZ2V0X3JhbmRvbSh0YiwgdGQtPm5vbmNlb2RkLCBUUE1fTk9OQ0VfU0laRSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJb3JkaW5hbCA9IGh0b25sKFRQTV9PUkRfU0VBTCk7CisJZGF0c2l6ZSA9IGh0b25sKGRhdGFsZW4pOworCXBjcnNpemUgPSBodG9ubChwY3JpbmZvc2l6ZSk7CisJY29udCA9IDA7CisKKwkvKiBlbmNyeXB0IGRhdGEgYXV0aG9yaXphdGlvbiBrZXkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgU0hBMV9ESUdFU1RfU0laRTsgKytpKQorCQl0ZC0+ZW5jYXV0aFtpXSA9IHRkLT54b3JoYXNoW2ldIF4gYmxvYmF1dGhbaV07CisKKwkvKiBjYWxjdWxhdGUgYXV0aG9yaXphdGlvbiBITUFDIHZhbHVlICovCisJaWYgKHBjcmluZm9zaXplID09IDApIHsKKwkJLyogbm8gcGNyIGluZm8gc3BlY2lmaWVkICovCisJCXJldCA9IFRTU19hdXRoaG1hYyh0ZC0+cHViYXV0aCwgc2Vzcy5zZWNyZXQsIFNIQTFfRElHRVNUX1NJWkUsCisJCQkJICAgc2Vzcy5lbm9uY2UsIHRkLT5ub25jZW9kZCwgY29udCwKKwkJCQkgICBzaXplb2YodWludDMyX3QpLCAmb3JkaW5hbCwgU0hBMV9ESUdFU1RfU0laRSwKKwkJCQkgICB0ZC0+ZW5jYXV0aCwgc2l6ZW9mKHVpbnQzMl90KSwgJnBjcnNpemUsCisJCQkJICAgc2l6ZW9mKHVpbnQzMl90KSwgJmRhdHNpemUsIGRhdGFsZW4sIGRhdGEsIDAsCisJCQkJICAgMCk7CisJfSBlbHNlIHsKKwkJLyogcGNyIGluZm8gc3BlY2lmaWVkICovCisJCXJldCA9IFRTU19hdXRoaG1hYyh0ZC0+cHViYXV0aCwgc2Vzcy5zZWNyZXQsIFNIQTFfRElHRVNUX1NJWkUsCisJCQkJICAgc2Vzcy5lbm9uY2UsIHRkLT5ub25jZW9kZCwgY29udCwKKwkJCQkgICBzaXplb2YodWludDMyX3QpLCAmb3JkaW5hbCwgU0hBMV9ESUdFU1RfU0laRSwKKwkJCQkgICB0ZC0+ZW5jYXV0aCwgc2l6ZW9mKHVpbnQzMl90KSwgJnBjcnNpemUsCisJCQkJICAgcGNyaW5mb3NpemUsIHBjcmluZm8sIHNpemVvZih1aW50MzJfdCksCisJCQkJICAgJmRhdHNpemUsIGRhdGFsZW4sIGRhdGEsIDAsIDApOworCX0KKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIGJ1aWxkIGFuZCBzZW5kIHRoZSBUUE0gcmVxdWVzdCBwYWNrZXQgKi8KKwlJTklUX0JVRih0Yik7CisJc3RvcmUxNih0YiwgVFBNX1RBR19SUVVfQVVUSDFfQ09NTUFORCk7CisJc3RvcmUzMih0YiwgVFBNX1NFQUxfU0laRSArIHBjcmluZm9zaXplICsgZGF0YWxlbik7CisJc3RvcmUzMih0YiwgVFBNX09SRF9TRUFMKTsKKwlzdG9yZTMyKHRiLCBrZXloYW5kbGUpOworCXN0b3JlYnl0ZXModGIsIHRkLT5lbmNhdXRoLCBTSEExX0RJR0VTVF9TSVpFKTsKKwlzdG9yZTMyKHRiLCBwY3JpbmZvc2l6ZSk7CisJc3RvcmVieXRlcyh0YiwgcGNyaW5mbywgcGNyaW5mb3NpemUpOworCXN0b3JlMzIodGIsIGRhdGFsZW4pOworCXN0b3JlYnl0ZXModGIsIGRhdGEsIGRhdGFsZW4pOworCXN0b3JlMzIodGIsIHNlc3MuaGFuZGxlKTsKKwlzdG9yZWJ5dGVzKHRiLCB0ZC0+bm9uY2VvZGQsIFRQTV9OT05DRV9TSVpFKTsKKwlzdG9yZTgodGIsIGNvbnQpOworCXN0b3JlYnl0ZXModGIsIHRkLT5wdWJhdXRoLCBTSEExX0RJR0VTVF9TSVpFKTsKKworCXJldCA9IHRydXN0ZWRfdHBtX3NlbmQoVFBNX0FOWV9OVU0sIHRiLT5kYXRhLCBNQVhfQlVGX1NJWkUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSByZXR1cm5lZCBCbG9iICovCisJc2VhbGluZm9zaXplID0gTE9BRDMyKHRiLT5kYXRhLCBUUE1fREFUQV9PRkZTRVQgKyBzaXplb2YodWludDMyX3QpKTsKKwllbmNkYXRhc2l6ZSA9IExPQUQzMih0Yi0+ZGF0YSwgVFBNX0RBVEFfT0ZGU0VUICsgc2l6ZW9mKHVpbnQzMl90KSArCisJCQkgICAgIHNpemVvZih1aW50MzJfdCkgKyBzZWFsaW5mb3NpemUpOworCXN0b3JlZHNpemUgPSBzaXplb2YodWludDMyX3QpICsgc2l6ZW9mKHVpbnQzMl90KSArIHNlYWxpbmZvc2l6ZSArCisJICAgIHNpemVvZih1aW50MzJfdCkgKyBlbmNkYXRhc2l6ZTsKKworCS8qIGNoZWNrIHRoZSBITUFDIGluIHRoZSByZXNwb25zZSAqLworCXJldCA9IFRTU19jaGVja2htYWMxKHRiLT5kYXRhLCBvcmRpbmFsLCB0ZC0+bm9uY2VvZGQsIHNlc3Muc2VjcmV0LAorCQkJICAgICBTSEExX0RJR0VTVF9TSVpFLCBzdG9yZWRzaXplLCBUUE1fREFUQV9PRkZTRVQsIDAsCisJCQkgICAgIDApOworCisJLyogY29weSB0aGUgcmV0dXJuZWQgYmxvYiB0byBjYWxsZXIgKi8KKwlpZiAoIXJldCkgeworCQltZW1jcHkoYmxvYiwgdGItPmRhdGEgKyBUUE1fREFUQV9PRkZTRVQsIHN0b3JlZHNpemUpOworCQkqYmxvYmxlbiA9IHN0b3JlZHNpemU7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiB1c2UgdGhlIEFVVEgyX0NPTU1BTkQgZm9ybSBvZiB1bnNlYWwsIHRvIGF1dGhvcml6ZSBib3RoIGtleSBhbmQgYmxvYgorICovCitzdGF0aWMgaW50IHRwbV91bnNlYWwoc3RydWN0IHRwbV9idWYgKnRiLAorCQkgICAgICB1aW50MzJfdCBrZXloYW5kbGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleWF1dGgsCisJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJsb2IsIGludCBibG9ibGVuLAorCQkgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpibG9iYXV0aCwKKwkJICAgICAgdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgaW50ICpkYXRhbGVuKQoreworCXVuc2lnbmVkIGNoYXIgbm9uY2VvZGRbVFBNX05PTkNFX1NJWkVdOworCXVuc2lnbmVkIGNoYXIgZW5vbmNlMVtUUE1fTk9OQ0VfU0laRV07CisJdW5zaWduZWQgY2hhciBlbm9uY2UyW1RQTV9OT05DRV9TSVpFXTsKKwl1bnNpZ25lZCBjaGFyIGF1dGhkYXRhMVtTSEExX0RJR0VTVF9TSVpFXTsKKwl1bnNpZ25lZCBjaGFyIGF1dGhkYXRhMltTSEExX0RJR0VTVF9TSVpFXTsKKwl1aW50MzJfdCBhdXRoaGFuZGxlMSA9IDA7CisJdWludDMyX3QgYXV0aGhhbmRsZTIgPSAwOworCXVuc2lnbmVkIGNoYXIgY29udCA9IDA7CisJdWludDMyX3Qgb3JkaW5hbDsKKwl1aW50MzJfdCBrZXlobmRsOworCWludCByZXQ7CisKKwkvKiBzZXNzaW9ucyBmb3IgdW5zZWFsaW5nIGtleSBhbmQgZGF0YSAqLworCXJldCA9IG9pYXAodGIsICZhdXRoaGFuZGxlMSwgZW5vbmNlMSk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfaW5mbygidHJ1c3RlZF9rZXk6IG9pYXAgZmFpbGVkICglZClcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCXJldCA9IG9pYXAodGIsICZhdXRoaGFuZGxlMiwgZW5vbmNlMik7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfaW5mbygidHJ1c3RlZF9rZXk6IG9pYXAgZmFpbGVkICglZClcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJb3JkaW5hbCA9IGh0b25sKFRQTV9PUkRfVU5TRUFMKTsKKwlrZXlobmRsID0gaHRvbmwoU1JLSEFORExFKTsKKwlyZXQgPSB0cG1fZ2V0X3JhbmRvbSh0Yiwgbm9uY2VvZGQsIFRQTV9OT05DRV9TSVpFKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9pbmZvKCJ0cnVzdGVkX2tleTogdHBtX2dldF9yYW5kb20gZmFpbGVkICglZClcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCXJldCA9IFRTU19hdXRoaG1hYyhhdXRoZGF0YTEsIGtleWF1dGgsIFRQTV9OT05DRV9TSVpFLAorCQkJICAgZW5vbmNlMSwgbm9uY2VvZGQsIGNvbnQsIHNpemVvZih1aW50MzJfdCksCisJCQkgICAmb3JkaW5hbCwgYmxvYmxlbiwgYmxvYiwgMCwgMCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJcmV0ID0gVFNTX2F1dGhobWFjKGF1dGhkYXRhMiwgYmxvYmF1dGgsIFRQTV9OT05DRV9TSVpFLAorCQkJICAgZW5vbmNlMiwgbm9uY2VvZGQsIGNvbnQsIHNpemVvZih1aW50MzJfdCksCisJCQkgICAmb3JkaW5hbCwgYmxvYmxlbiwgYmxvYiwgMCwgMCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBidWlsZCBhbmQgc2VuZCBUUE0gcmVxdWVzdCBwYWNrZXQgKi8KKwlJTklUX0JVRih0Yik7CisJc3RvcmUxNih0YiwgVFBNX1RBR19SUVVfQVVUSDJfQ09NTUFORCk7CisJc3RvcmUzMih0YiwgVFBNX1VOU0VBTF9TSVpFICsgYmxvYmxlbik7CisJc3RvcmUzMih0YiwgVFBNX09SRF9VTlNFQUwpOworCXN0b3JlMzIodGIsIGtleWhhbmRsZSk7CisJc3RvcmVieXRlcyh0YiwgYmxvYiwgYmxvYmxlbik7CisJc3RvcmUzMih0YiwgYXV0aGhhbmRsZTEpOworCXN0b3JlYnl0ZXModGIsIG5vbmNlb2RkLCBUUE1fTk9OQ0VfU0laRSk7CisJc3RvcmU4KHRiLCBjb250KTsKKwlzdG9yZWJ5dGVzKHRiLCBhdXRoZGF0YTEsIFNIQTFfRElHRVNUX1NJWkUpOworCXN0b3JlMzIodGIsIGF1dGhoYW5kbGUyKTsKKwlzdG9yZWJ5dGVzKHRiLCBub25jZW9kZCwgVFBNX05PTkNFX1NJWkUpOworCXN0b3JlOCh0YiwgY29udCk7CisJc3RvcmVieXRlcyh0YiwgYXV0aGRhdGEyLCBTSEExX0RJR0VTVF9TSVpFKTsKKworCXJldCA9IHRydXN0ZWRfdHBtX3NlbmQoVFBNX0FOWV9OVU0sIHRiLT5kYXRhLCBNQVhfQlVGX1NJWkUpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2luZm8oInRydXN0ZWRfa2V5OiBhdXRoaG1hYyBmYWlsZWQgKCVkKVxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkqZGF0YWxlbiA9IExPQUQzMih0Yi0+ZGF0YSwgVFBNX0RBVEFfT0ZGU0VUKTsKKwlyZXQgPSBUU1NfY2hlY2tobWFjMih0Yi0+ZGF0YSwgb3JkaW5hbCwgbm9uY2VvZGQsCisJCQkgICAgIGtleWF1dGgsIFNIQTFfRElHRVNUX1NJWkUsCisJCQkgICAgIGJsb2JhdXRoLCBTSEExX0RJR0VTVF9TSVpFLAorCQkJICAgICBzaXplb2YodWludDMyX3QpLCBUUE1fREFUQV9PRkZTRVQsCisJCQkgICAgICpkYXRhbGVuLCBUUE1fREFUQV9PRkZTRVQgKyBzaXplb2YodWludDMyX3QpLCAwLAorCQkJICAgICAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9pbmZvKCJ0cnVzdGVkX2tleTogVFNTX2NoZWNraG1hYzIgZmFpbGVkICglZClcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCW1lbWNweShkYXRhLCB0Yi0+ZGF0YSArIFRQTV9EQVRBX09GRlNFVCArIHNpemVvZih1aW50MzJfdCksICpkYXRhbGVuKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEhhdmUgdGhlIFRQTSBzZWFsKGVuY3J5cHQpIHRoZSBzeW1tZXRyaWMga2V5CisgKi8KK3N0YXRpYyBpbnQga2V5X3NlYWwoc3RydWN0IHRydXN0ZWRfa2V5X3BheWxvYWQgKnAsCisJCSAgICBzdHJ1Y3QgdHJ1c3RlZF9rZXlfb3B0aW9ucyAqbykKK3sKKwlzdHJ1Y3QgdHBtX2J1ZiAqdGI7CisJaW50IHJldDsKKworCXRiID0ga3phbGxvYyhzaXplb2YgKnRiLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRiKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIGluY2x1ZGUgbWlncmF0YWJsZSBmbGFnIGF0IGVuZCBvZiBzZWFsZWQga2V5ICovCisJcC0+a2V5W3AtPmtleV9sZW5dID0gcC0+bWlncmF0YWJsZTsKKworCXJldCA9IHRwbV9zZWFsKHRiLCBvLT5rZXl0eXBlLCBvLT5rZXloYW5kbGUsIG8tPmtleWF1dGgsCisJCSAgICAgICBwLT5rZXksIHAtPmtleV9sZW4gKyAxLCBwLT5ibG9iLCAmcC0+YmxvYl9sZW4sCisJCSAgICAgICBvLT5ibG9iYXV0aCwgby0+cGNyaW5mbywgby0+cGNyaW5mb19sZW4pOworCWlmIChyZXQgPCAwKQorCQlwcl9pbmZvKCJ0cnVzdGVkX2tleTogc3Jrc2VhbCBmYWlsZWQgKCVkKVxuIiwgcmV0KTsKKworCWtmcmVlKHRiKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogSGF2ZSB0aGUgVFBNIHVuc2VhbChkZWNyeXB0KSB0aGUgc3ltbWV0cmljIGtleQorICovCitzdGF0aWMgaW50IGtleV91bnNlYWwoc3RydWN0IHRydXN0ZWRfa2V5X3BheWxvYWQgKnAsCisJCSAgICAgIHN0cnVjdCB0cnVzdGVkX2tleV9vcHRpb25zICpvKQoreworCXN0cnVjdCB0cG1fYnVmICp0YjsKKwlpbnQgcmV0OworCisJdGIgPSBremFsbG9jKHNpemVvZiAqdGIsIEdGUF9LRVJORUwpOworCWlmICghdGIpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0gdHBtX3Vuc2VhbCh0Yiwgby0+a2V5aGFuZGxlLCBvLT5rZXlhdXRoLCBwLT5ibG9iLCBwLT5ibG9iX2xlbiwKKwkJCSBvLT5ibG9iYXV0aCwgcC0+a2V5LCAmcC0+a2V5X2xlbik7CisJaWYgKHJldCA8IDApCisJCXByX2luZm8oInRydXN0ZWRfa2V5OiBzcmt1bnNlYWwgZmFpbGVkICglZClcbiIsIHJldCk7CisJZWxzZQorCQkvKiBwdWxsIG1pZ3JhdGFibGUgZmxhZyBvdXQgb2Ygc2VhbGVkIGtleSAqLworCQlwLT5taWdyYXRhYmxlID0gcC0+a2V5Wy0tcC0+a2V5X2xlbl07CisKKwlrZnJlZSh0Yik7CisJcmV0dXJuIHJldDsKK30KKworZW51bSB7CisJT3B0X2VyciA9IC0xLAorCU9wdF9uZXcsIE9wdF9sb2FkLCBPcHRfdXBkYXRlLAorCU9wdF9rZXloYW5kbGUsIE9wdF9rZXlhdXRoLCBPcHRfYmxvYmF1dGgsCisJT3B0X3BjcmluZm8sIE9wdF9wY3Jsb2NrLCBPcHRfbWlncmF0YWJsZQorfTsKKworc3RhdGljIGNvbnN0IG1hdGNoX3RhYmxlX3Qga2V5X3Rva2VucyA9IHsKKwl7T3B0X25ldywgIm5ldyJ9LAorCXtPcHRfbG9hZCwgImxvYWQifSwKKwl7T3B0X3VwZGF0ZSwgInVwZGF0ZSJ9LAorCXtPcHRfa2V5aGFuZGxlLCAia2V5aGFuZGxlPSVzIn0sCisJe09wdF9rZXlhdXRoLCAia2V5YXV0aD0lcyJ9LAorCXtPcHRfYmxvYmF1dGgsICJibG9iYXV0aD0lcyJ9LAorCXtPcHRfcGNyaW5mbywgInBjcmluZm89JXMifSwKKwl7T3B0X3BjcmxvY2ssICJwY3Jsb2NrPSVzIn0sCisJe09wdF9taWdyYXRhYmxlLCAibWlncmF0YWJsZT0lcyJ9LAorCXtPcHRfZXJyLCBOVUxMfQorfTsKKworLyogY2FuIGhhdmUgemVybyBvciBtb3JlIHRva2VuPSBvcHRpb25zICovCitzdGF0aWMgaW50IGdldG9wdGlvbnMoY2hhciAqYywgc3RydWN0IHRydXN0ZWRfa2V5X3BheWxvYWQgKnBheSwKKwkJICAgICAgc3RydWN0IHRydXN0ZWRfa2V5X29wdGlvbnMgKm9wdCkKK3sKKwlzdWJzdHJpbmdfdCBhcmdzW01BWF9PUFRfQVJHU107CisJY2hhciAqcCA9IGM7CisJaW50IHRva2VuOworCWludCByZXM7CisJdW5zaWduZWQgbG9uZyBoYW5kbGU7CisJdW5zaWduZWQgbG9uZyBsb2NrOworCisJd2hpbGUgKChwID0gc3Ryc2VwKCZjLCAiIFx0IikpKSB7CisJCWlmICgqcCA9PSAnXDAnIHx8ICpwID09ICcgJyB8fCAqcCA9PSAnXHQnKQorCQkJY29udGludWU7CisJCXRva2VuID0gbWF0Y2hfdG9rZW4ocCwga2V5X3Rva2VucywgYXJncyk7CisKKwkJc3dpdGNoICh0b2tlbikgeworCQljYXNlIE9wdF9wY3JpbmZvOgorCQkJb3B0LT5wY3JpbmZvX2xlbiA9IHN0cmxlbihhcmdzWzBdLmZyb20pIC8gMjsKKwkJCWlmIChvcHQtPnBjcmluZm9fbGVuID4gTUFYX1BDUklORk9fU0laRSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWhleDJiaW4ob3B0LT5wY3JpbmZvLCBhcmdzWzBdLmZyb20sIG9wdC0+cGNyaW5mb19sZW4pOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2tleWhhbmRsZToKKwkJCXJlcyA9IHN0cmljdF9zdHJ0b3VsKGFyZ3NbMF0uZnJvbSwgMTYsICZoYW5kbGUpOworCQkJaWYgKHJlcyA8IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlvcHQtPmtleXR5cGUgPSBTRUFMX2tleXR5cGU7CisJCQlvcHQtPmtleWhhbmRsZSA9IGhhbmRsZTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9rZXlhdXRoOgorCQkJaWYgKHN0cmxlbihhcmdzWzBdLmZyb20pICE9IDIgKiBTSEExX0RJR0VTVF9TSVpFKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaGV4MmJpbihvcHQtPmtleWF1dGgsIGFyZ3NbMF0uZnJvbSwgU0hBMV9ESUdFU1RfU0laRSk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfYmxvYmF1dGg6CisJCQlpZiAoc3RybGVuKGFyZ3NbMF0uZnJvbSkgIT0gMiAqIFNIQTFfRElHRVNUX1NJWkUpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQloZXgyYmluKG9wdC0+YmxvYmF1dGgsIGFyZ3NbMF0uZnJvbSwgU0hBMV9ESUdFU1RfU0laRSk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbWlncmF0YWJsZToKKwkJCWlmICgqYXJnc1swXS5mcm9tID09ICcwJykKKwkJCQlwYXktPm1pZ3JhdGFibGUgPSAwOworCQkJZWxzZQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3BjcmxvY2s6CisJCQlyZXMgPSBzdHJpY3Rfc3RydG91bChhcmdzWzBdLmZyb20sIDEwLCAmbG9jayk7CisJCQlpZiAocmVzIDwgMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCW9wdC0+cGNybG9jayA9IGxvY2s7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKgorICogZGF0YWJsb2JfcGFyc2UgLSBwYXJzZSB0aGUga2V5Y3RsIGRhdGEgYW5kIGZpbGwgaW4gdGhlCisgKiAJCSAgICBwYXlsb2FkIGFuZCBvcHRpb25zIHN0cnVjdHVyZXMKKyAqCisgKiBPbiBzdWNjZXNzIHJldHVybnMgMCwgb3RoZXJ3aXNlIC1FSU5WQUwuCisgKi8KK3N0YXRpYyBpbnQgZGF0YWJsb2JfcGFyc2UoY2hhciAqZGF0YWJsb2IsIHN0cnVjdCB0cnVzdGVkX2tleV9wYXlsb2FkICpwLAorCQkJICBzdHJ1Y3QgdHJ1c3RlZF9rZXlfb3B0aW9ucyAqbykKK3sKKwlzdWJzdHJpbmdfdCBhcmdzW01BWF9PUFRfQVJHU107CisJbG9uZyBrZXlsZW47CisJaW50IHJldCA9IC1FSU5WQUw7CisJaW50IGtleV9jbWQ7CisJY2hhciAqYzsKKworCS8qIG1haW4gY29tbWFuZCAqLworCWMgPSBzdHJzZXAoJmRhdGFibG9iLCAiIFx0Iik7CisJaWYgKCFjKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlrZXlfY21kID0gbWF0Y2hfdG9rZW4oYywga2V5X3Rva2VucywgYXJncyk7CisJc3dpdGNoIChrZXlfY21kKSB7CisJY2FzZSBPcHRfbmV3OgorCQkvKiBmaXJzdCBhcmd1bWVudCBpcyBrZXkgc2l6ZSAqLworCQljID0gc3Ryc2VwKCZkYXRhYmxvYiwgIiBcdCIpOworCQlpZiAoIWMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0ID0gc3RyaWN0X3N0cnRvbChjLCAxMCwgJmtleWxlbik7CisJCWlmIChyZXQgPCAwIHx8IGtleWxlbiA8IE1JTl9LRVlfU0laRSB8fCBrZXlsZW4gPiBNQVhfS0VZX1NJWkUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcC0+a2V5X2xlbiA9IGtleWxlbjsKKwkJcmV0ID0gZ2V0b3B0aW9ucyhkYXRhYmxvYiwgcCwgbyk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJcmV0ID0gT3B0X25ldzsKKwkJYnJlYWs7CisJY2FzZSBPcHRfbG9hZDoKKwkJLyogZmlyc3QgYXJndW1lbnQgaXMgc2VhbGVkIGJsb2IgKi8KKwkJYyA9IHN0cnNlcCgmZGF0YWJsb2IsICIgXHQiKTsKKwkJaWYgKCFjKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXAtPmJsb2JfbGVuID0gc3RybGVuKGMpIC8gMjsKKwkJaWYgKHAtPmJsb2JfbGVuID4gTUFYX0JMT0JfU0laRSkKKwkJCXJldHVybiAtRUlOVkFMOworCQloZXgyYmluKHAtPmJsb2IsIGMsIHAtPmJsb2JfbGVuKTsKKwkJcmV0ID0gZ2V0b3B0aW9ucyhkYXRhYmxvYiwgcCwgbyk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJcmV0ID0gT3B0X2xvYWQ7CisJCWJyZWFrOworCWNhc2UgT3B0X3VwZGF0ZToKKwkJLyogYWxsIGFyZ3VtZW50cyBhcmUgb3B0aW9ucyAqLworCQlyZXQgPSBnZXRvcHRpb25zKGRhdGFibG9iLCBwLCBvKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlyZXQgPSBPcHRfdXBkYXRlOworCQlicmVhazsKKwljYXNlIE9wdF9lcnI6CisJCXJldHVybiAtRUlOVkFMOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCB0cnVzdGVkX2tleV9vcHRpb25zICp0cnVzdGVkX29wdGlvbnNfYWxsb2Modm9pZCkKK3sKKwlzdHJ1Y3QgdHJ1c3RlZF9rZXlfb3B0aW9ucyAqb3B0aW9uczsKKworCW9wdGlvbnMgPSBremFsbG9jKHNpemVvZiAqb3B0aW9ucywgR0ZQX0tFUk5FTCk7CisJaWYgKG9wdGlvbnMpIHsKKwkJLyogc2V0IGFueSBub24temVybyBkZWZhdWx0cyAqLworCQlvcHRpb25zLT5rZXl0eXBlID0gU1JLX2tleXR5cGU7CisJCW9wdGlvbnMtPmtleWhhbmRsZSA9IFNSS0hBTkRMRTsKKwl9CisJcmV0dXJuIG9wdGlvbnM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHJ1c3RlZF9rZXlfcGF5bG9hZCAqdHJ1c3RlZF9wYXlsb2FkX2FsbG9jKHN0cnVjdCBrZXkgKmtleSkKK3sKKwlzdHJ1Y3QgdHJ1c3RlZF9rZXlfcGF5bG9hZCAqcCA9IE5VTEw7CisJaW50IHJldDsKKworCXJldCA9IGtleV9wYXlsb2FkX3Jlc2VydmUoa2V5LCBzaXplb2YgKnApOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcDsKKwlwID0ga3phbGxvYyhzaXplb2YgKnAsIEdGUF9LRVJORUwpOworCWlmIChwKQorCQlwLT5taWdyYXRhYmxlID0gMTsgLyogbWlncmF0YWJsZSBieSBkZWZhdWx0ICovCisJcmV0dXJuIHA7Cit9CisKKy8qCisgKiB0cnVzdGVkX2luc3RhbnRpYXRlIC0gY3JlYXRlIGEgbmV3IHRydXN0ZWQga2V5CisgKgorICogVW5zZWFsIGFuIGV4aXN0aW5nIHRydXN0ZWQgYmxvYiBvciwgZm9yIGEgbmV3IGtleSwgZ2V0IGEKKyAqIHJhbmRvbSBrZXksIHRoZW4gc2VhbCBhbmQgY3JlYXRlIGEgdHJ1c3RlZCBrZXktdHlwZSBrZXksCisgKiBhZGRpbmcgaXQgdG8gdGhlIHNwZWNpZmllZCBrZXlyaW5nLgorICoKKyAqIE9uIHN1Y2Nlc3MsIHJldHVybiAwLiBPdGhlcndpc2UgcmV0dXJuIGVycm5vLgorICovCitzdGF0aWMgaW50IHRydXN0ZWRfaW5zdGFudGlhdGUoc3RydWN0IGtleSAqa2V5LCBjb25zdCB2b2lkICpkYXRhLAorCQkJICAgICAgIHNpemVfdCBkYXRhbGVuKQoreworCXN0cnVjdCB0cnVzdGVkX2tleV9wYXlsb2FkICpwYXlsb2FkID0gTlVMTDsKKwlzdHJ1Y3QgdHJ1c3RlZF9rZXlfb3B0aW9ucyAqb3B0aW9ucyA9IE5VTEw7CisJY2hhciAqZGF0YWJsb2I7CisJaW50IHJldCA9IDA7CisJaW50IGtleV9jbWQ7CisKKwlpZiAoZGF0YWxlbiA8PSAwIHx8IGRhdGFsZW4gPiAzMjc2NyB8fCAhZGF0YSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkYXRhYmxvYiA9IGttYWxsb2MoZGF0YWxlbiArIDEsIEdGUF9LRVJORUwpOworCWlmICghZGF0YWJsb2IpCisJCXJldHVybiAtRU5PTUVNOworCW1lbWNweShkYXRhYmxvYiwgZGF0YSwgZGF0YWxlbik7CisJZGF0YWJsb2JbZGF0YWxlbl0gPSAnXDAnOworCisJb3B0aW9ucyA9IHRydXN0ZWRfb3B0aW9uc19hbGxvYygpOworCWlmICghb3B0aW9ucykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisJcGF5bG9hZCA9IHRydXN0ZWRfcGF5bG9hZF9hbGxvYyhrZXkpOworCWlmICghcGF5bG9hZCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlrZXlfY21kID0gZGF0YWJsb2JfcGFyc2UoZGF0YWJsb2IsIHBheWxvYWQsIG9wdGlvbnMpOworCWlmIChrZXlfY21kIDwgMCkgeworCQlyZXQgPSBrZXlfY21kOworCQlnb3RvIG91dDsKKwl9CisKKwlkdW1wX3BheWxvYWQocGF5bG9hZCk7CisJZHVtcF9vcHRpb25zKG9wdGlvbnMpOworCisJc3dpdGNoIChrZXlfY21kKSB7CisJY2FzZSBPcHRfbG9hZDoKKwkJcmV0ID0ga2V5X3Vuc2VhbChwYXlsb2FkLCBvcHRpb25zKTsKKwkJZHVtcF9wYXlsb2FkKHBheWxvYWQpOworCQlkdW1wX29wdGlvbnMob3B0aW9ucyk7CisJCWlmIChyZXQgPCAwKQorCQkJcHJfaW5mbygidHJ1c3RlZF9rZXk6IGtleV91bnNlYWwgZmFpbGVkICglZClcbiIsIHJldCk7CisJCWJyZWFrOworCWNhc2UgT3B0X25ldzoKKwkJcmV0ID0gbXlfZ2V0X3JhbmRvbShwYXlsb2FkLT5rZXksIHBheWxvYWQtPmtleV9sZW4pOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfaW5mbygidHJ1c3RlZF9rZXk6IGtleV9jcmVhdGUgZmFpbGVkICglZClcbiIsIHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlyZXQgPSBrZXlfc2VhbChwYXlsb2FkLCBvcHRpb25zKTsKKwkJaWYgKHJldCA8IDApCisJCQlwcl9pbmZvKCJ0cnVzdGVkX2tleToga2V5X3NlYWwgZmFpbGVkICglZClcbiIsIHJldCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoIXJldCAmJiBvcHRpb25zLT5wY3Jsb2NrKQorCQlyZXQgPSBwY3Jsb2NrKG9wdGlvbnMtPnBjcmxvY2spOworb3V0OgorCWtmcmVlKGRhdGFibG9iKTsKKwlrZnJlZShvcHRpb25zKTsKKwlpZiAoIXJldCkKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKGtleS0+cGF5bG9hZC5kYXRhLCBwYXlsb2FkKTsKKwllbHNlCisJCWtmcmVlKHBheWxvYWQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHRydXN0ZWRfcmN1X2ZyZWUoc3RydWN0IHJjdV9oZWFkICpyY3UpCit7CisJc3RydWN0IHRydXN0ZWRfa2V5X3BheWxvYWQgKnA7CisKKwlwID0gY29udGFpbmVyX29mKHJjdSwgc3RydWN0IHRydXN0ZWRfa2V5X3BheWxvYWQsIHJjdSk7CisJbWVtc2V0KHAtPmtleSwgMCwgcC0+a2V5X2xlbik7CisJa2ZyZWUocCk7Cit9CisKKy8qCisgKiB0cnVzdGVkX3VwZGF0ZSAtIHJlc2VhbCBhbiBleGlzdGluZyBrZXkgd2l0aCBuZXcgUENSIHZhbHVlcworICovCitzdGF0aWMgaW50IHRydXN0ZWRfdXBkYXRlKHN0cnVjdCBrZXkgKmtleSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFsZW4pCit7CisJc3RydWN0IHRydXN0ZWRfa2V5X3BheWxvYWQgKnAgPSBrZXktPnBheWxvYWQuZGF0YTsKKwlzdHJ1Y3QgdHJ1c3RlZF9rZXlfcGF5bG9hZCAqbmV3X3A7CisJc3RydWN0IHRydXN0ZWRfa2V5X29wdGlvbnMgKm5ld19vOworCWNoYXIgKmRhdGFibG9iOworCWludCByZXQgPSAwOworCisJaWYgKCFwLT5taWdyYXRhYmxlKQorCQlyZXR1cm4gLUVQRVJNOworCWlmIChkYXRhbGVuIDw9IDAgfHwgZGF0YWxlbiA+IDMyNzY3IHx8ICFkYXRhKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRhdGFibG9iID0ga21hbGxvYyhkYXRhbGVuICsgMSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhYmxvYikKKwkJcmV0dXJuIC1FTk9NRU07CisJbmV3X28gPSB0cnVzdGVkX29wdGlvbnNfYWxsb2MoKTsKKwlpZiAoIW5ld19vKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKwluZXdfcCA9IHRydXN0ZWRfcGF5bG9hZF9hbGxvYyhrZXkpOworCWlmICghbmV3X3ApIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJbWVtY3B5KGRhdGFibG9iLCBkYXRhLCBkYXRhbGVuKTsKKwlkYXRhYmxvYltkYXRhbGVuXSA9ICdcMCc7CisJcmV0ID0gZGF0YWJsb2JfcGFyc2UoZGF0YWJsb2IsIG5ld19wLCBuZXdfbyk7CisJaWYgKHJldCAhPSBPcHRfdXBkYXRlKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwkvKiBjb3B5IG9sZCBrZXkgdmFsdWVzLCBhbmQgcmVzZWFsIHdpdGggbmV3IHBjcnMgKi8KKwluZXdfcC0+bWlncmF0YWJsZSA9IHAtPm1pZ3JhdGFibGU7CisJbmV3X3AtPmtleV9sZW4gPSBwLT5rZXlfbGVuOworCW1lbWNweShuZXdfcC0+a2V5LCBwLT5rZXksIHAtPmtleV9sZW4pOworCWR1bXBfcGF5bG9hZChwKTsKKwlkdW1wX3BheWxvYWQobmV3X3ApOworCisJcmV0ID0ga2V5X3NlYWwobmV3X3AsIG5ld19vKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9pbmZvKCJ0cnVzdGVkX2tleToga2V5X3NlYWwgZmFpbGVkICglZClcbiIsIHJldCk7CisJCWtmcmVlKG5ld19wKTsKKwkJZ290byBvdXQ7CisJfQorCWlmIChuZXdfby0+cGNybG9jaykgeworCQlyZXQgPSBwY3Jsb2NrKG5ld19vLT5wY3Jsb2NrKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2luZm8oInRydXN0ZWRfa2V5OiBwY3Jsb2NrIGZhaWxlZCAoJWQpXG4iLCByZXQpOworCQkJa2ZyZWUobmV3X3ApOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJcmN1X2Fzc2lnbl9wb2ludGVyKGtleS0+cGF5bG9hZC5kYXRhLCBuZXdfcCk7CisJY2FsbF9yY3UoJnAtPnJjdSwgdHJ1c3RlZF9yY3VfZnJlZSk7CitvdXQ6CisJa2ZyZWUoZGF0YWJsb2IpOworCWtmcmVlKG5ld19vKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogdHJ1c3RlZF9yZWFkIC0gY29weSB0aGUgc2VhbGVkIGJsb2IgZGF0YSB0byB1c2Vyc3BhY2UgaW4gaGV4LgorICogT24gc3VjY2VzcywgcmV0dXJuIHRvIHVzZXJzcGFjZSB0aGUgdHJ1c3RlZCBrZXkgZGF0YWJsb2Igc2l6ZS4KKyAqLworc3RhdGljIGxvbmcgdHJ1c3RlZF9yZWFkKGNvbnN0IHN0cnVjdCBrZXkgKmtleSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSBzaXplX3QgYnVmbGVuKQoreworCXN0cnVjdCB0cnVzdGVkX2tleV9wYXlsb2FkICpwOworCWNoYXIgKmFzY2lpX2J1ZjsKKwljaGFyICpidWZwOworCWludCBpOworCisJcCA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoa2V5LT5wYXlsb2FkLmRhdGEsCisJCQlyd3NlbV9pc19sb2NrZWQoJigoc3RydWN0IGtleSAqKWtleSktPnNlbSkpOworCWlmICghcCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFidWZmZXIgfHwgYnVmbGVuIDw9IDApCisJCXJldHVybiAyICogcC0+YmxvYl9sZW47CisJYXNjaWlfYnVmID0ga21hbGxvYygyICogcC0+YmxvYl9sZW4sIEdGUF9LRVJORUwpOworCWlmICghYXNjaWlfYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWJ1ZnAgPSBhc2NpaV9idWY7CisJZm9yIChpID0gMDsgaSA8IHAtPmJsb2JfbGVuOyBpKyspCisJCWJ1ZnAgPSBwYWNrX2hleF9ieXRlKGJ1ZnAsIHAtPmJsb2JbaV0pOworCWlmICgoY29weV90b191c2VyKGJ1ZmZlciwgYXNjaWlfYnVmLCAyICogcC0+YmxvYl9sZW4pKSAhPSAwKSB7CisJCWtmcmVlKGFzY2lpX2J1Zik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlrZnJlZShhc2NpaV9idWYpOworCXJldHVybiAyICogcC0+YmxvYl9sZW47Cit9CisKKy8qCisgKiB0cnVzdGVkX2Rlc3Ryb3kgLSBiZWZvcmUgZnJlZWluZyB0aGUga2V5LCBjbGVhciB0aGUgZGVjcnlwdGVkIGRhdGEKKyAqLworc3RhdGljIHZvaWQgdHJ1c3RlZF9kZXN0cm95KHN0cnVjdCBrZXkgKmtleSkKK3sKKwlzdHJ1Y3QgdHJ1c3RlZF9rZXlfcGF5bG9hZCAqcCA9IGtleS0+cGF5bG9hZC5kYXRhOworCisJaWYgKCFwKQorCQlyZXR1cm47CisJbWVtc2V0KHAtPmtleSwgMCwgcC0+a2V5X2xlbik7CisJa2ZyZWUoa2V5LT5wYXlsb2FkLmRhdGEpOworfQorCitzdHJ1Y3Qga2V5X3R5cGUga2V5X3R5cGVfdHJ1c3RlZCA9IHsKKwkubmFtZSA9ICJ0cnVzdGVkIiwKKwkuaW5zdGFudGlhdGUgPSB0cnVzdGVkX2luc3RhbnRpYXRlLAorCS51cGRhdGUgPSB0cnVzdGVkX3VwZGF0ZSwKKwkubWF0Y2ggPSB1c2VyX21hdGNoLAorCS5kZXN0cm95ID0gdHJ1c3RlZF9kZXN0cm95LAorCS5kZXNjcmliZSA9IHVzZXJfZGVzY3JpYmUsCisJLnJlYWQgPSB0cnVzdGVkX3JlYWQsCit9OworCitFWFBPUlRfU1lNQk9MX0dQTChrZXlfdHlwZV90cnVzdGVkKTsKKworc3RhdGljIHZvaWQgdHJ1c3RlZF9zaGFzaF9yZWxlYXNlKHZvaWQpCit7CisJaWYgKGhhc2hhbGcpCisJCWNyeXB0b19mcmVlX3NoYXNoKGhhc2hhbGcpOworCWlmIChobWFjYWxnKQorCQljcnlwdG9fZnJlZV9zaGFzaChobWFjYWxnKTsKK30KKworc3RhdGljIGludCBfX2luaXQgdHJ1c3RlZF9zaGFzaF9hbGxvYyh2b2lkKQoreworCWludCByZXQ7CisKKwlobWFjYWxnID0gY3J5cHRvX2FsbG9jX3NoYXNoKGhtYWNfYWxnLCAwLCBDUllQVE9fQUxHX0FTWU5DKTsKKwlpZiAoSVNfRVJSKGhtYWNhbGcpKSB7CisJCXByX2luZm8oInRydXN0ZWRfa2V5OiBjb3VsZCBub3QgYWxsb2NhdGUgY3J5cHRvICVzXG4iLAorCQkJaG1hY19hbGcpOworCQlyZXR1cm4gUFRSX0VSUihobWFjYWxnKTsKKwl9CisKKwloYXNoYWxnID0gY3J5cHRvX2FsbG9jX3NoYXNoKGhhc2hfYWxnLCAwLCBDUllQVE9fQUxHX0FTWU5DKTsKKwlpZiAoSVNfRVJSKGhhc2hhbGcpKSB7CisJCXByX2luZm8oInRydXN0ZWRfa2V5OiBjb3VsZCBub3QgYWxsb2NhdGUgY3J5cHRvICVzXG4iLAorCQkJaGFzaF9hbGcpOworCQlyZXQgPSBQVFJfRVJSKGhhc2hhbGcpOworCQlnb3RvIGhhc2hhbGdfZmFpbDsKKwl9CisKKwlyZXR1cm4gMDsKKworaGFzaGFsZ19mYWlsOgorCWNyeXB0b19mcmVlX3NoYXNoKGhtYWNhbGcpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfdHJ1c3RlZCh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSB0cnVzdGVkX3NoYXNoX2FsbG9jKCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJcmV0ID0gcmVnaXN0ZXJfa2V5X3R5cGUoJmtleV90eXBlX3RydXN0ZWQpOworCWlmIChyZXQgPCAwKQorCQl0cnVzdGVkX3NoYXNoX3JlbGVhc2UoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF90cnVzdGVkKHZvaWQpCit7CisJdHJ1c3RlZF9zaGFzaF9yZWxlYXNlKCk7CisJdW5yZWdpc3Rlcl9rZXlfdHlwZSgma2V5X3R5cGVfdHJ1c3RlZCk7Cit9CisKK2xhdGVfaW5pdGNhbGwoaW5pdF90cnVzdGVkKTsKK21vZHVsZV9leGl0KGNsZWFudXBfdHJ1c3RlZCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2tleXMvdHJ1c3RlZF9kZWZpbmVkLmggYi9zZWN1cml0eS9rZXlzL3RydXN0ZWRfZGVmaW5lZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNDlmYmQKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9rZXlzL3RydXN0ZWRfZGVmaW5lZC5oCkBAIC0wLDAgKzEsMTM0IEBACisjaWZuZGVmIF9fVFJVU1RFRF9LRVlfSAorI2RlZmluZSBfX1RSVVNURURfS0VZX0gKKworLyogaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgVFBNIGNvbnN0YW50cyAqLworI2RlZmluZSBNQVhfUENSSU5GT19TSVpFCQk2NAorI2RlZmluZSBNQVhfQlVGX1NJWkUJCQk1MTIKKyNkZWZpbmUgVFBNX0dFVFJBTkRPTV9TSVpFCQkxNAorI2RlZmluZSBUUE1fT1NBUF9TSVpFCQkJMzYKKyNkZWZpbmUgVFBNX09JQVBfU0laRQkJCTEwCisjZGVmaW5lIFRQTV9TRUFMX1NJWkUJCQk4NworI2RlZmluZSBUUE1fVU5TRUFMX1NJWkUJCQkxMDQKKyNkZWZpbmUgVFBNX1NJWkVfT0ZGU0VUCQkJMgorI2RlZmluZSBUUE1fUkVUVVJOX09GRlNFVAkJNgorI2RlZmluZSBUUE1fREFUQV9PRkZTRVQJCQkxMAorCisjZGVmaW5lIExPQUQzMihidWZmZXIsIG9mZnNldCkJKG50b2hsKCoodWludDMyX3QgKikmYnVmZmVyW29mZnNldF0pKQorI2RlZmluZSBMT0FEMzJOKGJ1ZmZlciwgb2Zmc2V0KQkoKih1aW50MzJfdCAqKSZidWZmZXJbb2Zmc2V0XSkKKyNkZWZpbmUgTE9BRDE2KGJ1ZmZlciwgb2Zmc2V0KQkobnRvaHMoKih1aW50MTZfdCAqKSZidWZmZXJbb2Zmc2V0XSkpCisKK3N0cnVjdCB0cG1fYnVmIHsKKwlpbnQgbGVuOworCXVuc2lnbmVkIGNoYXIgZGF0YVtNQVhfQlVGX1NJWkVdOworfTsKKworI2RlZmluZSBJTklUX0JVRih0YikgKHRiLT5sZW4gPSAwKQorCitzdHJ1Y3Qgb3NhcHNlc3MgeworCXVpbnQzMl90IGhhbmRsZTsKKwl1bnNpZ25lZCBjaGFyIHNlY3JldFtTSEExX0RJR0VTVF9TSVpFXTsKKwl1bnNpZ25lZCBjaGFyIGVub25jZVtUUE1fTk9OQ0VfU0laRV07Cit9OworCisvKiBkaXNjcmV0ZSB2YWx1ZXMsIGJ1dCBoYXZlIHRvIHN0b3JlIGluIHVpbnQxNl90IGZvciBUUE0gdXNlICovCitlbnVtIHsKKwlTRUFMX2tleXR5cGUgPSAxLAorCVNSS19rZXl0eXBlID0gNAorfTsKKworc3RydWN0IHRydXN0ZWRfa2V5X29wdGlvbnMgeworCXVpbnQxNl90IGtleXR5cGU7CisJdWludDMyX3Qga2V5aGFuZGxlOworCXVuc2lnbmVkIGNoYXIga2V5YXV0aFtTSEExX0RJR0VTVF9TSVpFXTsKKwl1bnNpZ25lZCBjaGFyIGJsb2JhdXRoW1NIQTFfRElHRVNUX1NJWkVdOworCXVpbnQzMl90IHBjcmluZm9fbGVuOworCXVuc2lnbmVkIGNoYXIgcGNyaW5mb1tNQVhfUENSSU5GT19TSVpFXTsKKwlpbnQgcGNybG9jazsKK307CisKKyNkZWZpbmUgVFBNX0RFQlVHIDAKKworI2lmIFRQTV9ERUJVRworc3RhdGljIGlubGluZSB2b2lkIGR1bXBfb3B0aW9ucyhzdHJ1Y3QgdHJ1c3RlZF9rZXlfb3B0aW9ucyAqbykKK3sKKwlwcl9pbmZvKCJ0cnVzdGVkX2tleTogc2VhbGluZyBrZXkgdHlwZSAlZFxuIiwgby0+a2V5dHlwZSk7CisJcHJfaW5mbygidHJ1c3RlZF9rZXk6IHNlYWxpbmcga2V5IGhhbmRsZSAlMFhcbiIsIG8tPmtleWhhbmRsZSk7CisJcHJfaW5mbygidHJ1c3RlZF9rZXk6IHBjcmxvY2sgJWRcbiIsIG8tPnBjcmxvY2spOworCXByX2luZm8oInRydXN0ZWRfa2V5OiBwY3JpbmZvICVkXG4iLCBvLT5wY3JpbmZvX2xlbik7CisJcHJpbnRfaGV4X2R1bXAoS0VSTl9JTkZPLCAicGNyaW5mbyAiLCBEVU1QX1BSRUZJWF9OT05FLAorCQkgICAgICAgMTYsIDEsIG8tPnBjcmluZm8sIG8tPnBjcmluZm9fbGVuLCAwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGR1bXBfcGF5bG9hZChzdHJ1Y3QgdHJ1c3RlZF9rZXlfcGF5bG9hZCAqcCkKK3sKKwlwcl9pbmZvKCJ0cnVzdGVkX2tleToga2V5X2xlbiAlZFxuIiwgcC0+a2V5X2xlbik7CisJcHJpbnRfaGV4X2R1bXAoS0VSTl9JTkZPLCAia2V5ICIsIERVTVBfUFJFRklYX05PTkUsCisJCSAgICAgICAxNiwgMSwgcC0+a2V5LCBwLT5rZXlfbGVuLCAwKTsKKwlwcl9pbmZvKCJ0cnVzdGVkX2tleTogYmxvYmxlbiAlZFxuIiwgcC0+YmxvYl9sZW4pOworCXByaW50X2hleF9kdW1wKEtFUk5fSU5GTywgImJsb2IgIiwgRFVNUF9QUkVGSVhfTk9ORSwKKwkJICAgICAgIDE2LCAxLCBwLT5ibG9iLCBwLT5ibG9iX2xlbiwgMCk7CisJcHJfaW5mbygidHJ1c3RlZF9rZXk6IG1pZ3JhdGFibGUgJWRcbiIsIHAtPm1pZ3JhdGFibGUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHVtcF9zZXNzKHN0cnVjdCBvc2Fwc2VzcyAqcykKK3sKKwlwcmludF9oZXhfZHVtcChLRVJOX0lORk8sICJ0cnVzdGVkLWtleTogaGFuZGxlICIsIERVTVBfUFJFRklYX05PTkUsCisJCSAgICAgICAxNiwgMSwgJnMtPmhhbmRsZSwgNCwgMCk7CisJcHJfaW5mbygidHJ1c3RlZC1rZXk6IHNlY3JldDpcbiIpOworCXByaW50X2hleF9kdW1wKEtFUk5fSU5GTywgIiIsIERVTVBfUFJFRklYX05PTkUsCisJCSAgICAgICAxNiwgMSwgJnMtPnNlY3JldCwgU0hBMV9ESUdFU1RfU0laRSwgMCk7CisJcHJfaW5mbygidHJ1c3RlZC1rZXk6IGVub25jZTpcbiIpOworCXByaW50X2hleF9kdW1wKEtFUk5fSU5GTywgIiIsIERVTVBfUFJFRklYX05PTkUsCisJCSAgICAgICAxNiwgMSwgJnMtPmVub25jZSwgU0hBMV9ESUdFU1RfU0laRSwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX3RwbV9idWYodW5zaWduZWQgY2hhciAqYnVmKQoreworCWludCBsZW47CisKKwlwcl9pbmZvKCJcbnRydXN0ZWQta2V5OiB0cG0gYnVmZmVyXG4iKTsKKwlsZW4gPSBMT0FEMzIoYnVmLCBUUE1fU0laRV9PRkZTRVQpOworCXByaW50X2hleF9kdW1wKEtFUk5fSU5GTywgIiIsIERVTVBfUFJFRklYX05PTkUsIDE2LCAxLCBidWYsIGxlbiwgMCk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGR1bXBfb3B0aW9ucyhzdHJ1Y3QgdHJ1c3RlZF9rZXlfb3B0aW9ucyAqbykKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIGR1bXBfcGF5bG9hZChzdHJ1Y3QgdHJ1c3RlZF9rZXlfcGF5bG9hZCAqcCkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIGR1bXBfc2VzcyhzdHJ1Y3Qgb3NhcHNlc3MgKnMpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX3RwbV9idWYodW5zaWduZWQgY2hhciAqYnVmKQoreworfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdG9yZTgoc3RydWN0IHRwbV9idWYgKmJ1ZiwgY29uc3QgdW5zaWduZWQgY2hhciB2YWx1ZSkKK3sKKwlidWYtPmRhdGFbYnVmLT5sZW4rK10gPSB2YWx1ZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN0b3JlMTYoc3RydWN0IHRwbV9idWYgKmJ1ZiwgY29uc3QgdWludDE2X3QgdmFsdWUpCit7CisJKih1aW50MTZfdCAqKSAmIGJ1Zi0+ZGF0YVtidWYtPmxlbl0gPSBodG9ucyh2YWx1ZSk7CisJYnVmLT5sZW4gKz0gc2l6ZW9mIHZhbHVlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RvcmUzMihzdHJ1Y3QgdHBtX2J1ZiAqYnVmLCBjb25zdCB1aW50MzJfdCB2YWx1ZSkKK3sKKwkqKHVpbnQzMl90ICopICYgYnVmLT5kYXRhW2J1Zi0+bGVuXSA9IGh0b25sKHZhbHVlKTsKKwlidWYtPmxlbiArPSBzaXplb2YgdmFsdWU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdG9yZWJ5dGVzKHN0cnVjdCB0cG1fYnVmICpidWYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLAorCQkJICAgICAgY29uc3QgaW50IGxlbikKK3sKKwltZW1jcHkoYnVmLT5kYXRhICsgYnVmLT5sZW4sIGluLCBsZW4pOworCWJ1Zi0+bGVuICs9IGxlbjsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jIGIvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jCmluZGV4IDZmNjM3ZDIuLmUyNzZlYjQgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMKQEAgLTI1MjUsNyArMjUyNSwxMCBAQAogCXNpZCA9IHRzZWMtPnNpZDsKIAluZXdzaWQgPSB0c2VjLT5jcmVhdGVfc2lkOwogCi0JaWYgKCFuZXdzaWQgfHwgIShzYnNlYy0+ZmxhZ3MgJiBTRV9TQkxBQkVMU1VQUCkpIHsKKwlpZiAoKHNic2VjLT5mbGFncyAmIFNFX1NCSU5JVElBTElaRUQpICYmCisJICAgIChzYnNlYy0+YmVoYXZpb3IgPT0gU0VDVVJJVFlfRlNfVVNFX01OVFBPSU5UKSkKKwkJbmV3c2lkID0gc2JzZWMtPm1udHBvaW50X3NpZDsKKwllbHNlIGlmICghbmV3c2lkIHx8ICEoc2JzZWMtPmZsYWdzICYgU0VfU0JMQUJFTFNVUFApKSB7CiAJCXJjID0gc2VjdXJpdHlfdHJhbnNpdGlvbl9zaWQoc2lkLCBkc2VjLT5zaWQsCiAJCQkJCSAgICAgaW5vZGVfbW9kZV90b19zZWN1cml0eV9jbGFzcyhpbm9kZS0+aV9tb2RlKSwKIAkJCQkJICAgICAmbmV3c2lkKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9hdmMuaCBiL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9hdmMuaAppbmRleCBlOTRlODJmLi41NjE1MDgxIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvYXZjLmgKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2F2Yy5oCkBAIC0xNSw3ICsxNSw2IEBACiAjaW5jbHVkZSA8bGludXgvYXVkaXQuaD4KICNpbmNsdWRlIDxsaW51eC9sc21fYXVkaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbjYuaD4KLSNpbmNsdWRlIDxsaW51eC9wYXRoLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgImZsYXNrLmgiCiAjaW5jbHVkZSAiYXZfcGVybWlzc2lvbnMuaCIKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9jbGFzc21hcC5oIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2NsYXNzbWFwLmgKaW5kZXggODg1OGQyYi4uN2VkMzY2MyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2NsYXNzbWFwLmgKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2NsYXNzbWFwLmgKQEAgLTE0Miw3ICsxNDIsNyBAQAogCSAgICAibm9kZV9iaW5kIiwgIm5hbWVfY29ubmVjdCIsIE5VTEwgfSB9LAogCXsgIm1lbXByb3RlY3QiLCB7ICJtbWFwX3plcm8iLCBOVUxMIH0gfSwKIAl7ICJwZWVyIiwgeyAicmVjdiIsIE5VTEwgfSB9LAotCXsgImNhcGFiaWxpdHkyIiwgeyAibWFjX292ZXJyaWRlIiwgIm1hY19hZG1pbiIsIE5VTEwgfSB9LAorCXsgImNhcGFiaWxpdHkyIiwgeyAibWFjX292ZXJyaWRlIiwgIm1hY19hZG1pbiIsICJzeXNsb2ciLCBOVUxMIH0gfSwKIAl7ICJrZXJuZWxfc2VydmljZSIsIHsgInVzZV9hc19vdmVycmlkZSIsICJjcmVhdGVfZmlsZXNfYXMiLCBOVUxMIH0gfSwKIAl7ICJ0dW5fc29ja2V0IiwKIAkgIHsgQ09NTU9OX1NPQ0tfUEVSTVMsIE5VTEwgfSB9LApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9ubG1zZ3RhYi5jIGIvc2VjdXJpdHkvc2VsaW51eC9ubG1zZ3RhYi5jCmluZGV4IDc1ZWMwYzYuLjhiMDJiMjEgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvbmxtc2d0YWIuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L25sbXNndGFiLmMKQEAgLTY1LDYgKzY1LDggQEAKIAl7IFJUTV9ORVdBRERSTEFCRUwsCU5FVExJTktfUk9VVEVfU09DS0VUX19OTE1TR19XUklURSB9LAogCXsgUlRNX0RFTEFERFJMQUJFTCwJTkVUTElOS19ST1VURV9TT0NLRVRfX05MTVNHX1dSSVRFIH0sCiAJeyBSVE1fR0VUQUREUkxBQkVMLAlORVRMSU5LX1JPVVRFX1NPQ0tFVF9fTkxNU0dfUkVBRCAgfSwKKwl7IFJUTV9HRVREQ0IsCQlORVRMSU5LX1JPVVRFX1NPQ0tFVF9fTkxNU0dfUkVBRCAgfSwKKwl7IFJUTV9TRVREQ0IsCQlORVRMSU5LX1JPVVRFX1NPQ0tFVF9fTkxNU0dfV1JJVEUgfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgbmxtc2dfcGVybSBubG1zZ19maXJld2FsbF9wZXJtc1tdID0KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc2VsaW51eGZzLmMgYi9zZWN1cml0eS9zZWxpbnV4L3NlbGludXhmcy5jCmluZGV4IDQzZGVhYzIuLmVhMzljYjcgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvc2VsaW51eGZzLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zZWxpbnV4ZnMuYwpAQCAtMTQxLDE5ICsxNDEsMjQgQEAKIAkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiAKIHsKLQljaGFyICpwYWdlOworCWNoYXIgKnBhZ2UgPSBOVUxMOwogCXNzaXplX3QgbGVuZ3RoOwogCWludCBuZXdfdmFsdWU7CiAKKwlsZW5ndGggPSAtRU5PTUVNOwogCWlmIChjb3VudCA+PSBQQUdFX1NJWkUpCi0JCXJldHVybiAtRU5PTUVNOwotCWlmICgqcHBvcyAhPSAwKSB7Ci0JCS8qIE5vIHBhcnRpYWwgd3JpdGVzLiAqLwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisJCWdvdG8gb3V0OworCisJLyogTm8gcGFydGlhbCB3cml0ZXMuICovCisJbGVuZ3RoID0gRUlOVkFMOworCWlmICgqcHBvcyAhPSAwKQorCQlnb3RvIG91dDsKKworCWxlbmd0aCA9IC1FTk9NRU07CiAJcGFnZSA9IChjaGFyICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOwogCWlmICghcGFnZSkKLQkJcmV0dXJuIC1FTk9NRU07CisJCWdvdG8gb3V0OworCiAJbGVuZ3RoID0gLUVGQVVMVDsKIAlpZiAoY29weV9mcm9tX3VzZXIocGFnZSwgYnVmLCBjb3VudCkpCiAJCWdvdG8gb3V0OwpAQCAtMjY4LDIwICsyNzMsMjUgQEAKIAkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiAKIHsKLQljaGFyICpwYWdlOworCWNoYXIgKnBhZ2UgPSBOVUxMOwogCXNzaXplX3QgbGVuZ3RoOwogCWludCBuZXdfdmFsdWU7CiAJZXh0ZXJuIGludCBzZWxpbnV4X2Rpc2FibGUodm9pZCk7CiAKKwlsZW5ndGggPSAtRU5PTUVNOwogCWlmIChjb3VudCA+PSBQQUdFX1NJWkUpCi0JCXJldHVybiAtRU5PTUVNOwotCWlmICgqcHBvcyAhPSAwKSB7Ci0JCS8qIE5vIHBhcnRpYWwgd3JpdGVzLiAqLwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisJCWdvdG8gb3V0OzsKKworCS8qIE5vIHBhcnRpYWwgd3JpdGVzLiAqLworCWxlbmd0aCA9IC1FSU5WQUw7CisJaWYgKCpwcG9zICE9IDApCisJCWdvdG8gb3V0OworCisJbGVuZ3RoID0gLUVOT01FTTsKIAlwYWdlID0gKGNoYXIgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CiAJaWYgKCFwYWdlKQotCQlyZXR1cm4gLUVOT01FTTsKKwkJZ290byBvdXQ7CisKIAlsZW5ndGggPSAtRUZBVUxUOwogCWlmIChjb3B5X2Zyb21fdXNlcihwYWdlLCBidWYsIGNvdW50KSkKIAkJZ290byBvdXQ7CkBAIC0yOTIsNyArMzAyLDcgQEAKIAogCWlmIChuZXdfdmFsdWUpIHsKIAkJbGVuZ3RoID0gc2VsaW51eF9kaXNhYmxlKCk7Ci0JCWlmIChsZW5ndGggPCAwKQorCQlpZiAobGVuZ3RoKQogCQkJZ290byBvdXQ7CiAJCWF1ZGl0X2xvZyhjdXJyZW50LT5hdWRpdF9jb250ZXh0LCBHRlBfS0VSTkVMLCBBVURJVF9NQUNfU1RBVFVTLAogCQkJInNlbGludXg9MCBhdWlkPSV1IHNlcz0ldSIsCkBAIC00OTMsNyArNTAzLDYgQEAKIAkJCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogCiB7Ci0JaW50IHJldDsKIAlzc2l6ZV90IGxlbmd0aDsKIAl2b2lkICpkYXRhID0gTlVMTDsKIApAQCAtNTAzLDE3ICs1MTIsMTkgQEAKIAlpZiAobGVuZ3RoKQogCQlnb3RvIG91dDsKIAotCWlmICgqcHBvcyAhPSAwKSB7Ci0JCS8qIE5vIHBhcnRpYWwgd3JpdGVzLiAqLwotCQlsZW5ndGggPSAtRUlOVkFMOworCS8qIE5vIHBhcnRpYWwgd3JpdGVzLiAqLworCWxlbmd0aCA9IC1FSU5WQUw7CisJaWYgKCpwcG9zICE9IDApCiAJCWdvdG8gb3V0OwotCX0KIAotCWlmICgoY291bnQgPiA2NCAqIDEwMjQgKiAxMDI0KQotCSAgICB8fCAoZGF0YSA9IHZtYWxsb2MoY291bnQpKSA9PSBOVUxMKSB7Ci0JCWxlbmd0aCA9IC1FTk9NRU07CisJbGVuZ3RoID0gLUVGQklHOworCWlmIChjb3VudCA+IDY0ICogMTAyNCAqIDEwMjQpCiAJCWdvdG8gb3V0OwotCX0KKworCWxlbmd0aCA9IC1FTk9NRU07CisJZGF0YSA9IHZtYWxsb2MoY291bnQpOworCWlmICghZGF0YSkKKwkJZ290byBvdXQ7CiAKIAlsZW5ndGggPSAtRUZBVUxUOwogCWlmIChjb3B5X2Zyb21fdXNlcihkYXRhLCBidWYsIGNvdW50KSAhPSAwKQpAQCAtNTIzLDIzICs1MzQsMTkgQEAKIAlpZiAobGVuZ3RoKQogCQlnb3RvIG91dDsKIAotCXJldCA9IHNlbF9tYWtlX2Jvb2xzKCk7Ci0JaWYgKHJldCkgewotCQlsZW5ndGggPSByZXQ7CisJbGVuZ3RoID0gc2VsX21ha2VfYm9vbHMoKTsKKwlpZiAobGVuZ3RoKQogCQlnb3RvIG91dDE7Ci0JfQogCi0JcmV0ID0gc2VsX21ha2VfY2xhc3NlcygpOwotCWlmIChyZXQpIHsKLQkJbGVuZ3RoID0gcmV0OworCWxlbmd0aCA9IHNlbF9tYWtlX2NsYXNzZXMoKTsKKwlpZiAobGVuZ3RoKQogCQlnb3RvIG91dDE7Ci0JfQogCi0JcmV0ID0gc2VsX21ha2VfcG9saWN5Y2FwKCk7Ci0JaWYgKHJldCkKLQkJbGVuZ3RoID0gcmV0OwotCWVsc2UKLQkJbGVuZ3RoID0gY291bnQ7CisJbGVuZ3RoID0gc2VsX21ha2VfcG9saWN5Y2FwKCk7CisJaWYgKGxlbmd0aCkKKwkJZ290byBvdXQxOworCisJbGVuZ3RoID0gY291bnQ7CiAKIG91dDE6CiAJYXVkaXRfbG9nKGN1cnJlbnQtPmF1ZGl0X2NvbnRleHQsIEdGUF9LRVJORUwsIEFVRElUX01BQ19QT0xJQ1lfTE9BRCwKQEAgLTU1OSwyNiArNTY2LDI2IEBACiAKIHN0YXRpYyBzc2l6ZV90IHNlbF93cml0ZV9jb250ZXh0KHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQogewotCWNoYXIgKmNhbm9uOworCWNoYXIgKmNhbm9uID0gTlVMTDsKIAl1MzIgc2lkLCBsZW47CiAJc3NpemVfdCBsZW5ndGg7CiAKIAlsZW5ndGggPSB0YXNrX2hhc19zZWN1cml0eShjdXJyZW50LCBTRUNVUklUWV9fQ0hFQ0tfQ09OVEVYVCk7CiAJaWYgKGxlbmd0aCkKLQkJcmV0dXJuIGxlbmd0aDsKKwkJZ290byBvdXQ7CiAKIAlsZW5ndGggPSBzZWN1cml0eV9jb250ZXh0X3RvX3NpZChidWYsIHNpemUsICZzaWQpOwotCWlmIChsZW5ndGggPCAwKQotCQlyZXR1cm4gbGVuZ3RoOworCWlmIChsZW5ndGgpCisJCWdvdG8gb3V0OwogCiAJbGVuZ3RoID0gc2VjdXJpdHlfc2lkX3RvX2NvbnRleHQoc2lkLCAmY2Fub24sICZsZW4pOwotCWlmIChsZW5ndGggPCAwKQotCQlyZXR1cm4gbGVuZ3RoOworCWlmIChsZW5ndGgpCisJCWdvdG8gb3V0OwogCisJbGVuZ3RoID0gLUVSQU5HRTsKIAlpZiAobGVuID4gU0lNUExFX1RSQU5TQUNUSU9OX0xJTUlUKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogJXM6ICBjb250ZXh0IHNpemUgKCV1KSBleGNlZWRzICIKIAkJCSJwYXlsb2FkIG1heFxuIiwgX19mdW5jX18sIGxlbik7Ci0JCWxlbmd0aCA9IC1FUkFOR0U7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtNjAyLDIzICs2MDksMjggQEAKIHN0YXRpYyBzc2l6ZV90IHNlbF93cml0ZV9jaGVja3JlcXByb3Qoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCiAJCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7Ci0JY2hhciAqcGFnZTsKKwljaGFyICpwYWdlID0gTlVMTDsKIAlzc2l6ZV90IGxlbmd0aDsKIAl1bnNpZ25lZCBpbnQgbmV3X3ZhbHVlOwogCiAJbGVuZ3RoID0gdGFza19oYXNfc2VjdXJpdHkoY3VycmVudCwgU0VDVVJJVFlfX1NFVENIRUNLUkVRUFJPVCk7CiAJaWYgKGxlbmd0aCkKLQkJcmV0dXJuIGxlbmd0aDsKKwkJZ290byBvdXQ7CiAKKwlsZW5ndGggPSAtRU5PTUVNOwogCWlmIChjb3VudCA+PSBQQUdFX1NJWkUpCi0JCXJldHVybiAtRU5PTUVNOwotCWlmICgqcHBvcyAhPSAwKSB7Ci0JCS8qIE5vIHBhcnRpYWwgd3JpdGVzLiAqLwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisJCWdvdG8gb3V0OworCisJLyogTm8gcGFydGlhbCB3cml0ZXMuICovCisJbGVuZ3RoID0gLUVJTlZBTDsKKwlpZiAoKnBwb3MgIT0gMCkKKwkJZ290byBvdXQ7CisKKwlsZW5ndGggPSAtRU5PTUVNOwogCXBhZ2UgPSAoY2hhciAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKIAlpZiAoIXBhZ2UpCi0JCXJldHVybiAtRU5PTUVNOworCQlnb3RvIG91dDsKKwogCWxlbmd0aCA9IC1FRkFVTFQ7CiAJaWYgKGNvcHlfZnJvbV91c2VyKHBhZ2UsIGJ1ZiwgY291bnQpKQogCQlnb3RvIG91dDsKQEAgLTY5Myw3ICs3MDUsNyBAQAogCiBzdGF0aWMgc3NpemVfdCBzZWxfd3JpdGVfYWNjZXNzKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQogewotCWNoYXIgKnNjb24sICp0Y29uOworCWNoYXIgKnNjb24gPSBOVUxMLCAqdGNvbiA9IE5VTEw7CiAJdTMyIHNzaWQsIHRzaWQ7CiAJdTE2IHRjbGFzczsKIAlzdHJ1Y3QgYXZfZGVjaXNpb24gYXZkOwpAQCAtNzAxLDI3ICs3MTMsMjkgQEAKIAogCWxlbmd0aCA9IHRhc2tfaGFzX3NlY3VyaXR5KGN1cnJlbnQsIFNFQ1VSSVRZX19DT01QVVRFX0FWKTsKIAlpZiAobGVuZ3RoKQotCQlyZXR1cm4gbGVuZ3RoOworCQlnb3RvIG91dDsKIAogCWxlbmd0aCA9IC1FTk9NRU07CiAJc2NvbiA9IGt6YWxsb2Moc2l6ZSArIDEsIEdGUF9LRVJORUwpOwogCWlmICghc2NvbikKLQkJcmV0dXJuIGxlbmd0aDsKKwkJZ290byBvdXQ7CiAKKwlsZW5ndGggPSAtRU5PTUVNOwogCXRjb24gPSBremFsbG9jKHNpemUgKyAxLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXRjb24pCiAJCWdvdG8gb3V0OwogCiAJbGVuZ3RoID0gLUVJTlZBTDsKIAlpZiAoc3NjYW5mKGJ1ZiwgIiVzICVzICVodSIsIHNjb24sIHRjb24sICZ0Y2xhc3MpICE9IDMpCi0JCWdvdG8gb3V0MjsKKwkJZ290byBvdXQ7CiAKIAlsZW5ndGggPSBzZWN1cml0eV9jb250ZXh0X3RvX3NpZChzY29uLCBzdHJsZW4oc2NvbikgKyAxLCAmc3NpZCk7Ci0JaWYgKGxlbmd0aCA8IDApCi0JCWdvdG8gb3V0MjsKKwlpZiAobGVuZ3RoKQorCQlnb3RvIG91dDsKKwogCWxlbmd0aCA9IHNlY3VyaXR5X2NvbnRleHRfdG9fc2lkKHRjb24sIHN0cmxlbih0Y29uKSArIDEsICZ0c2lkKTsKLQlpZiAobGVuZ3RoIDwgMCkKLQkJZ290byBvdXQyOworCWlmIChsZW5ndGgpCisJCWdvdG8gb3V0OwogCiAJc2VjdXJpdHlfY29tcHV0ZV9hdl91c2VyKHNzaWQsIHRzaWQsIHRjbGFzcywgJmF2ZCk7CiAKQEAgLTczMCwxMzMgKzc0NCwxMzEgQEAKIAkJCSAgYXZkLmFsbG93ZWQsIDB4ZmZmZmZmZmYsCiAJCQkgIGF2ZC5hdWRpdGFsbG93LCBhdmQuYXVkaXRkZW55LAogCQkJICBhdmQuc2Vxbm8sIGF2ZC5mbGFncyk7Ci1vdXQyOgotCWtmcmVlKHRjb24pOwogb3V0OgorCWtmcmVlKHRjb24pOwogCWtmcmVlKHNjb24pOwogCXJldHVybiBsZW5ndGg7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHNlbF93cml0ZV9jcmVhdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7Ci0JY2hhciAqc2NvbiwgKnRjb247CisJY2hhciAqc2NvbiA9IE5VTEwsICp0Y29uID0gTlVMTDsKIAl1MzIgc3NpZCwgdHNpZCwgbmV3c2lkOwogCXUxNiB0Y2xhc3M7CiAJc3NpemVfdCBsZW5ndGg7Ci0JY2hhciAqbmV3Y29uOworCWNoYXIgKm5ld2NvbiA9IE5VTEw7CiAJdTMyIGxlbjsKIAogCWxlbmd0aCA9IHRhc2tfaGFzX3NlY3VyaXR5KGN1cnJlbnQsIFNFQ1VSSVRZX19DT01QVVRFX0NSRUFURSk7CiAJaWYgKGxlbmd0aCkKLQkJcmV0dXJuIGxlbmd0aDsKKwkJZ290byBvdXQ7CiAKIAlsZW5ndGggPSAtRU5PTUVNOwogCXNjb24gPSBremFsbG9jKHNpemUgKyAxLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNjb24pCi0JCXJldHVybiBsZW5ndGg7CisJCWdvdG8gb3V0OwogCisJbGVuZ3RoID0gLUVOT01FTTsKIAl0Y29uID0ga3phbGxvYyhzaXplICsgMSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0Y29uKQogCQlnb3RvIG91dDsKIAogCWxlbmd0aCA9IC1FSU5WQUw7CiAJaWYgKHNzY2FuZihidWYsICIlcyAlcyAlaHUiLCBzY29uLCB0Y29uLCAmdGNsYXNzKSAhPSAzKQotCQlnb3RvIG91dDI7CisJCWdvdG8gb3V0OwogCiAJbGVuZ3RoID0gc2VjdXJpdHlfY29udGV4dF90b19zaWQoc2Nvbiwgc3RybGVuKHNjb24pICsgMSwgJnNzaWQpOwotCWlmIChsZW5ndGggPCAwKQotCQlnb3RvIG91dDI7CisJaWYgKGxlbmd0aCkKKwkJZ290byBvdXQ7CisKIAlsZW5ndGggPSBzZWN1cml0eV9jb250ZXh0X3RvX3NpZCh0Y29uLCBzdHJsZW4odGNvbikgKyAxLCAmdHNpZCk7Ci0JaWYgKGxlbmd0aCA8IDApCi0JCWdvdG8gb3V0MjsKKwlpZiAobGVuZ3RoKQorCQlnb3RvIG91dDsKIAogCWxlbmd0aCA9IHNlY3VyaXR5X3RyYW5zaXRpb25fc2lkX3VzZXIoc3NpZCwgdHNpZCwgdGNsYXNzLCAmbmV3c2lkKTsKLQlpZiAobGVuZ3RoIDwgMCkKLQkJZ290byBvdXQyOworCWlmIChsZW5ndGgpCisJCWdvdG8gb3V0OwogCiAJbGVuZ3RoID0gc2VjdXJpdHlfc2lkX3RvX2NvbnRleHQobmV3c2lkLCAmbmV3Y29uLCAmbGVuKTsKLQlpZiAobGVuZ3RoIDwgMCkKLQkJZ290byBvdXQyOworCWlmIChsZW5ndGgpCisJCWdvdG8gb3V0OwogCisJbGVuZ3RoID0gLUVSQU5HRTsKIAlpZiAobGVuID4gU0lNUExFX1RSQU5TQUNUSU9OX0xJTUlUKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogJXM6ICBjb250ZXh0IHNpemUgKCV1KSBleGNlZWRzICIKIAkJCSJwYXlsb2FkIG1heFxuIiwgX19mdW5jX18sIGxlbik7Ci0JCWxlbmd0aCA9IC1FUkFOR0U7Ci0JCWdvdG8gb3V0MzsKKwkJZ290byBvdXQ7CiAJfQogCiAJbWVtY3B5KGJ1ZiwgbmV3Y29uLCBsZW4pOwogCWxlbmd0aCA9IGxlbjsKLW91dDM6Ci0Ja2ZyZWUobmV3Y29uKTsKLW91dDI6Ci0Ja2ZyZWUodGNvbik7CiBvdXQ6CisJa2ZyZWUobmV3Y29uKTsKKwlrZnJlZSh0Y29uKTsKIAlrZnJlZShzY29uKTsKIAlyZXR1cm4gbGVuZ3RoOwogfQogCiBzdGF0aWMgc3NpemVfdCBzZWxfd3JpdGVfcmVsYWJlbChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKIHsKLQljaGFyICpzY29uLCAqdGNvbjsKKwljaGFyICpzY29uID0gTlVMTCwgKnRjb24gPSBOVUxMOwogCXUzMiBzc2lkLCB0c2lkLCBuZXdzaWQ7CiAJdTE2IHRjbGFzczsKIAlzc2l6ZV90IGxlbmd0aDsKLQljaGFyICpuZXdjb247CisJY2hhciAqbmV3Y29uID0gTlVMTDsKIAl1MzIgbGVuOwogCiAJbGVuZ3RoID0gdGFza19oYXNfc2VjdXJpdHkoY3VycmVudCwgU0VDVVJJVFlfX0NPTVBVVEVfUkVMQUJFTCk7CiAJaWYgKGxlbmd0aCkKLQkJcmV0dXJuIGxlbmd0aDsKKwkJZ290byBvdXQ7CiAKIAlsZW5ndGggPSAtRU5PTUVNOwogCXNjb24gPSBremFsbG9jKHNpemUgKyAxLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNjb24pCi0JCXJldHVybiBsZW5ndGg7CisJCWdvdG8gb3V0OwogCisJbGVuZ3RoID0gLUVOT01FTTsKIAl0Y29uID0ga3phbGxvYyhzaXplICsgMSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0Y29uKQogCQlnb3RvIG91dDsKIAogCWxlbmd0aCA9IC1FSU5WQUw7CiAJaWYgKHNzY2FuZihidWYsICIlcyAlcyAlaHUiLCBzY29uLCB0Y29uLCAmdGNsYXNzKSAhPSAzKQotCQlnb3RvIG91dDI7CisJCWdvdG8gb3V0OwogCiAJbGVuZ3RoID0gc2VjdXJpdHlfY29udGV4dF90b19zaWQoc2Nvbiwgc3RybGVuKHNjb24pICsgMSwgJnNzaWQpOwotCWlmIChsZW5ndGggPCAwKQotCQlnb3RvIG91dDI7CisJaWYgKGxlbmd0aCkKKwkJZ290byBvdXQ7CisKIAlsZW5ndGggPSBzZWN1cml0eV9jb250ZXh0X3RvX3NpZCh0Y29uLCBzdHJsZW4odGNvbikgKyAxLCAmdHNpZCk7Ci0JaWYgKGxlbmd0aCA8IDApCi0JCWdvdG8gb3V0MjsKKwlpZiAobGVuZ3RoKQorCQlnb3RvIG91dDsKIAogCWxlbmd0aCA9IHNlY3VyaXR5X2NoYW5nZV9zaWQoc3NpZCwgdHNpZCwgdGNsYXNzLCAmbmV3c2lkKTsKLQlpZiAobGVuZ3RoIDwgMCkKLQkJZ290byBvdXQyOworCWlmIChsZW5ndGgpCisJCWdvdG8gb3V0OwogCiAJbGVuZ3RoID0gc2VjdXJpdHlfc2lkX3RvX2NvbnRleHQobmV3c2lkLCAmbmV3Y29uLCAmbGVuKTsKLQlpZiAobGVuZ3RoIDwgMCkKLQkJZ290byBvdXQyOworCWlmIChsZW5ndGgpCisJCWdvdG8gb3V0OwogCi0JaWYgKGxlbiA+IFNJTVBMRV9UUkFOU0FDVElPTl9MSU1JVCkgewotCQlsZW5ndGggPSAtRVJBTkdFOwotCQlnb3RvIG91dDM7Ci0JfQorCWxlbmd0aCA9IC1FUkFOR0U7CisJaWYgKGxlbiA+IFNJTVBMRV9UUkFOU0FDVElPTl9MSU1JVCkKKwkJZ290byBvdXQ7CiAKIAltZW1jcHkoYnVmLCBuZXdjb24sIGxlbik7CiAJbGVuZ3RoID0gbGVuOwotb3V0MzoKLQlrZnJlZShuZXdjb24pOwotb3V0MjoKLQlrZnJlZSh0Y29uKTsKIG91dDoKKwlrZnJlZShuZXdjb24pOworCWtmcmVlKHRjb24pOwogCWtmcmVlKHNjb24pOwogCXJldHVybiBsZW5ndGg7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHNlbF93cml0ZV91c2VyKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQogewotCWNoYXIgKmNvbiwgKnVzZXIsICpwdHI7Ci0JdTMyIHNpZCwgKnNpZHM7CisJY2hhciAqY29uID0gTlVMTCwgKnVzZXIgPSBOVUxMLCAqcHRyOworCXUzMiBzaWQsICpzaWRzID0gTlVMTDsKIAlzc2l6ZV90IGxlbmd0aDsKIAljaGFyICpuZXdjb247CiAJaW50IGksIHJjOwpAQCAtODY0LDI4ICs4NzYsMjkgQEAKIAogCWxlbmd0aCA9IHRhc2tfaGFzX3NlY3VyaXR5KGN1cnJlbnQsIFNFQ1VSSVRZX19DT01QVVRFX1VTRVIpOwogCWlmIChsZW5ndGgpCi0JCXJldHVybiBsZW5ndGg7CisJCWdvdG8gb3V0OzsKIAogCWxlbmd0aCA9IC1FTk9NRU07CiAJY29uID0ga3phbGxvYyhzaXplICsgMSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjb24pCi0JCXJldHVybiBsZW5ndGg7CisJCWdvdG8gb3V0OzsKIAorCWxlbmd0aCA9IC1FTk9NRU07CiAJdXNlciA9IGt6YWxsb2Moc2l6ZSArIDEsIEdGUF9LRVJORUwpOwogCWlmICghdXNlcikKIAkJZ290byBvdXQ7CiAKIAlsZW5ndGggPSAtRUlOVkFMOwogCWlmIChzc2NhbmYoYnVmLCAiJXMgJXMiLCBjb24sIHVzZXIpICE9IDIpCi0JCWdvdG8gb3V0MjsKKwkJZ290byBvdXQ7CiAKIAlsZW5ndGggPSBzZWN1cml0eV9jb250ZXh0X3RvX3NpZChjb24sIHN0cmxlbihjb24pICsgMSwgJnNpZCk7Ci0JaWYgKGxlbmd0aCA8IDApCi0JCWdvdG8gb3V0MjsKKwlpZiAobGVuZ3RoKQorCQlnb3RvIG91dDsKIAogCWxlbmd0aCA9IHNlY3VyaXR5X2dldF91c2VyX3NpZHMoc2lkLCB1c2VyLCAmc2lkcywgJm5zaWRzKTsKLQlpZiAobGVuZ3RoIDwgMCkKLQkJZ290byBvdXQyOworCWlmIChsZW5ndGgpCisJCWdvdG8gb3V0OwogCiAJbGVuZ3RoID0gc3ByaW50ZihidWYsICIldSIsIG5zaWRzKSArIDE7CiAJcHRyID0gYnVmICsgbGVuZ3RoOwpAQCAtODkzLDgyICs5MDYsODAgQEAKIAkJcmMgPSBzZWN1cml0eV9zaWRfdG9fY29udGV4dChzaWRzW2ldLCAmbmV3Y29uLCAmbGVuKTsKIAkJaWYgKHJjKSB7CiAJCQlsZW5ndGggPSByYzsKLQkJCWdvdG8gb3V0MzsKKwkJCWdvdG8gb3V0OwogCQl9CiAJCWlmICgobGVuZ3RoICsgbGVuKSA+PSBTSU1QTEVfVFJBTlNBQ1RJT05fTElNSVQpIHsKIAkJCWtmcmVlKG5ld2Nvbik7CiAJCQlsZW5ndGggPSAtRVJBTkdFOwotCQkJZ290byBvdXQzOworCQkJZ290byBvdXQ7CiAJCX0KIAkJbWVtY3B5KHB0ciwgbmV3Y29uLCBsZW4pOwogCQlrZnJlZShuZXdjb24pOwogCQlwdHIgKz0gbGVuOwogCQlsZW5ndGggKz0gbGVuOwogCX0KLW91dDM6Ci0Ja2ZyZWUoc2lkcyk7Ci1vdXQyOgotCWtmcmVlKHVzZXIpOwogb3V0OgorCWtmcmVlKHNpZHMpOworCWtmcmVlKHVzZXIpOwogCWtmcmVlKGNvbik7CiAJcmV0dXJuIGxlbmd0aDsKIH0KIAogc3RhdGljIHNzaXplX3Qgc2VsX3dyaXRlX21lbWJlcihzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKIHsKLQljaGFyICpzY29uLCAqdGNvbjsKKwljaGFyICpzY29uID0gTlVMTCwgKnRjb24gPSBOVUxMOwogCXUzMiBzc2lkLCB0c2lkLCBuZXdzaWQ7CiAJdTE2IHRjbGFzczsKIAlzc2l6ZV90IGxlbmd0aDsKLQljaGFyICpuZXdjb247CisJY2hhciAqbmV3Y29uID0gTlVMTDsKIAl1MzIgbGVuOwogCiAJbGVuZ3RoID0gdGFza19oYXNfc2VjdXJpdHkoY3VycmVudCwgU0VDVVJJVFlfX0NPTVBVVEVfTUVNQkVSKTsKIAlpZiAobGVuZ3RoKQotCQlyZXR1cm4gbGVuZ3RoOworCQlnb3RvIG91dDsKIAogCWxlbmd0aCA9IC1FTk9NRU07CiAJc2NvbiA9IGt6YWxsb2Moc2l6ZSArIDEsIEdGUF9LRVJORUwpOwogCWlmICghc2NvbikKLQkJcmV0dXJuIGxlbmd0aDsKKwkJZ290byBvdXQ7OwogCisJbGVuZ3RoID0gLUVOT01FTTsKIAl0Y29uID0ga3phbGxvYyhzaXplICsgMSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0Y29uKQogCQlnb3RvIG91dDsKIAogCWxlbmd0aCA9IC1FSU5WQUw7CiAJaWYgKHNzY2FuZihidWYsICIlcyAlcyAlaHUiLCBzY29uLCB0Y29uLCAmdGNsYXNzKSAhPSAzKQotCQlnb3RvIG91dDI7CisJCWdvdG8gb3V0OwogCiAJbGVuZ3RoID0gc2VjdXJpdHlfY29udGV4dF90b19zaWQoc2Nvbiwgc3RybGVuKHNjb24pICsgMSwgJnNzaWQpOwotCWlmIChsZW5ndGggPCAwKQotCQlnb3RvIG91dDI7CisJaWYgKGxlbmd0aCkKKwkJZ290byBvdXQ7CisKIAlsZW5ndGggPSBzZWN1cml0eV9jb250ZXh0X3RvX3NpZCh0Y29uLCBzdHJsZW4odGNvbikgKyAxLCAmdHNpZCk7Ci0JaWYgKGxlbmd0aCA8IDApCi0JCWdvdG8gb3V0MjsKKwlpZiAobGVuZ3RoKQorCQlnb3RvIG91dDsKIAogCWxlbmd0aCA9IHNlY3VyaXR5X21lbWJlcl9zaWQoc3NpZCwgdHNpZCwgdGNsYXNzLCAmbmV3c2lkKTsKLQlpZiAobGVuZ3RoIDwgMCkKLQkJZ290byBvdXQyOworCWlmIChsZW5ndGgpCisJCWdvdG8gb3V0OwogCiAJbGVuZ3RoID0gc2VjdXJpdHlfc2lkX3RvX2NvbnRleHQobmV3c2lkLCAmbmV3Y29uLCAmbGVuKTsKLQlpZiAobGVuZ3RoIDwgMCkKLQkJZ290byBvdXQyOworCWlmIChsZW5ndGgpCisJCWdvdG8gb3V0OwogCisJbGVuZ3RoID0gLUVSQU5HRTsKIAlpZiAobGVuID4gU0lNUExFX1RSQU5TQUNUSU9OX0xJTUlUKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogJXM6ICBjb250ZXh0IHNpemUgKCV1KSBleGNlZWRzICIKIAkJCSJwYXlsb2FkIG1heFxuIiwgX19mdW5jX18sIGxlbik7Ci0JCWxlbmd0aCA9IC1FUkFOR0U7Ci0JCWdvdG8gb3V0MzsKKwkJZ290byBvdXQ7CiAJfQogCiAJbWVtY3B5KGJ1ZiwgbmV3Y29uLCBsZW4pOwogCWxlbmd0aCA9IGxlbjsKLW91dDM6Ci0Ja2ZyZWUobmV3Y29uKTsKLW91dDI6Ci0Ja2ZyZWUodGNvbik7CiBvdXQ6CisJa2ZyZWUobmV3Y29uKTsKKwlrZnJlZSh0Y29uKTsKIAlrZnJlZShzY29uKTsKIAlyZXR1cm4gbGVuZ3RoOwogfQpAQCAtOTc4LDcgKzk4OSw2IEBACiAJc3RydWN0IGlub2RlICpyZXQgPSBuZXdfaW5vZGUoc2IpOwogCiAJaWYgKHJldCkgewotCQlyZXQtPmlfaW5vID0gZ2V0X25leHRfaW5vKCk7CiAJCXJldC0+aV9tb2RlID0gbW9kZTsKIAkJcmV0LT5pX2F0aW1lID0gcmV0LT5pX210aW1lID0gcmV0LT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCX0KQEAgLTk5OCwxNiArMTAwOCwxNCBAQAogCiAJbXV0ZXhfbG9jaygmc2VsX211dGV4KTsKIAotCWlmIChpbmRleCA+PSBib29sX251bSB8fCBzdHJjbXAobmFtZSwgYm9vbF9wZW5kaW5nX25hbWVzW2luZGV4XSkpIHsKLQkJcmV0ID0gLUVJTlZBTDsKKwlyZXQgPSAtRUlOVkFMOworCWlmIChpbmRleCA+PSBib29sX251bSB8fCBzdHJjbXAobmFtZSwgYm9vbF9wZW5kaW5nX25hbWVzW2luZGV4XSkpCiAJCWdvdG8gb3V0OwotCX0KIAorCXJldCA9IC1FTk9NRU07CiAJcGFnZSA9IChjaGFyICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOwotCWlmICghcGFnZSkgewotCQlyZXQgPSAtRU5PTUVNOworCWlmICghcGFnZSkKIAkJZ290byBvdXQ7Ci0JfQogCiAJY3VyX2VuZm9yY2luZyA9IHNlY3VyaXR5X2dldF9ib29sX3ZhbHVlKGluZGV4KTsKIAlpZiAoY3VyX2VuZm9yY2luZyA8IDApIHsKQEAgLTEwMTksOCArMTAyNyw3IEBACiAJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgcGFnZSwgbGVuZ3RoKTsKIG91dDoKIAltdXRleF91bmxvY2soJnNlbF9tdXRleCk7Ci0JaWYgKHBhZ2UpCi0JCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwYWdlKTsKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGFnZSk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTA0MCwyNiArMTA0NywyMyBAQAogCWlmIChsZW5ndGgpCiAJCWdvdG8gb3V0OwogCi0JaWYgKGluZGV4ID49IGJvb2xfbnVtIHx8IHN0cmNtcChuYW1lLCBib29sX3BlbmRpbmdfbmFtZXNbaW5kZXhdKSkgewotCQlsZW5ndGggPSAtRUlOVkFMOworCWxlbmd0aCA9IC1FSU5WQUw7CisJaWYgKGluZGV4ID49IGJvb2xfbnVtIHx8IHN0cmNtcChuYW1lLCBib29sX3BlbmRpbmdfbmFtZXNbaW5kZXhdKSkKIAkJZ290byBvdXQ7Ci0JfQogCi0JaWYgKGNvdW50ID49IFBBR0VfU0laRSkgewotCQlsZW5ndGggPSAtRU5PTUVNOworCWxlbmd0aCA9IC1FTk9NRU07CisJaWYgKGNvdW50ID49IFBBR0VfU0laRSkKIAkJZ290byBvdXQ7Ci0JfQogCi0JaWYgKCpwcG9zICE9IDApIHsKLQkJLyogTm8gcGFydGlhbCB3cml0ZXMuICovCi0JCWxlbmd0aCA9IC1FSU5WQUw7CisJLyogTm8gcGFydGlhbCB3cml0ZXMuICovCisJbGVuZ3RoID0gLUVJTlZBTDsKKwlpZiAoKnBwb3MgIT0gMCkKIAkJZ290byBvdXQ7Ci0JfQorCisJbGVuZ3RoID0gLUVOT01FTTsKIAlwYWdlID0gKGNoYXIgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwYWdlKSB7Ci0JCWxlbmd0aCA9IC1FTk9NRU07CisJaWYgKCFwYWdlKQogCQlnb3RvIG91dDsKLQl9CiAKIAlsZW5ndGggPSAtRUZBVUxUOwogCWlmIChjb3B5X2Zyb21fdXNlcihwYWdlLCBidWYsIGNvdW50KSkKQEAgLTEwNzcsOCArMTA4MSw3IEBACiAKIG91dDoKIAltdXRleF91bmxvY2soJnNlbF9tdXRleCk7Ci0JaWYgKHBhZ2UpCi0JCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgcGFnZSk7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBwYWdlKTsKIAlyZXR1cm4gbGVuZ3RoOwogfQogCkBAIC0xMTAyLDE5ICsxMTA1LDE5IEBACiAJaWYgKGxlbmd0aCkKIAkJZ290byBvdXQ7CiAKLQlpZiAoY291bnQgPj0gUEFHRV9TSVpFKSB7Ci0JCWxlbmd0aCA9IC1FTk9NRU07CisJbGVuZ3RoID0gLUVOT01FTTsKKwlpZiAoY291bnQgPj0gUEFHRV9TSVpFKQogCQlnb3RvIG91dDsKLQl9Ci0JaWYgKCpwcG9zICE9IDApIHsKLQkJLyogTm8gcGFydGlhbCB3cml0ZXMuICovCisKKwkvKiBObyBwYXJ0aWFsIHdyaXRlcy4gKi8KKwlsZW5ndGggPSAtRUlOVkFMOworCWlmICgqcHBvcyAhPSAwKQogCQlnb3RvIG91dDsKLQl9CisKKwlsZW5ndGggPSAtRU5PTUVNOwogCXBhZ2UgPSAoY2hhciAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKLQlpZiAoIXBhZ2UpIHsKLQkJbGVuZ3RoID0gLUVOT01FTTsKKwlpZiAoIXBhZ2UpCiAJCWdvdG8gb3V0OwotCX0KIAogCWxlbmd0aCA9IC1FRkFVTFQ7CiAJaWYgKGNvcHlfZnJvbV91c2VyKHBhZ2UsIGJ1ZiwgY291bnQpKQpAQCAtMTEyNCwxNSArMTEyNywxNiBAQAogCWlmIChzc2NhbmYocGFnZSwgIiVkIiwgJm5ld192YWx1ZSkgIT0gMSkKIAkJZ290byBvdXQ7CiAKKwlsZW5ndGggPSAwOwogCWlmIChuZXdfdmFsdWUgJiYgYm9vbF9wZW5kaW5nX3ZhbHVlcykKLQkJc2VjdXJpdHlfc2V0X2Jvb2xzKGJvb2xfbnVtLCBib29sX3BlbmRpbmdfdmFsdWVzKTsKKwkJbGVuZ3RoID0gc2VjdXJpdHlfc2V0X2Jvb2xzKGJvb2xfbnVtLCBib29sX3BlbmRpbmdfdmFsdWVzKTsKIAotCWxlbmd0aCA9IGNvdW50OworCWlmICghbGVuZ3RoKQorCQlsZW5ndGggPSBjb3VudDsKIAogb3V0OgogCW11dGV4X3VubG9jaygmc2VsX211dGV4KTsKLQlpZiAocGFnZSkKLQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBwYWdlKTsKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIHBhZ2UpOwogCXJldHVybiBsZW5ndGg7CiB9CiAKQEAgLTExNzMsNyArMTE3Nyw3IEBACiAKIHN0YXRpYyBpbnQgc2VsX21ha2VfYm9vbHModm9pZCkKIHsKLQlpbnQgaSwgcmV0ID0gMDsKKwlpbnQgaSwgcmV0OwogCXNzaXplX3QgbGVuOwogCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IE5VTEw7CiAJc3RydWN0IGRlbnRyeSAqZGlyID0gYm9vbF9kaXI7CkBAIC0xMTk0LDM4ICsxMTk4LDQwIEBACiAKIAlzZWxfcmVtb3ZlX2VudHJpZXMoZGlyKTsKIAorCXJldCA9IC1FTk9NRU07CiAJcGFnZSA9IChjaGFyICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOwogCWlmICghcGFnZSkKLQkJcmV0dXJuIC1FTk9NRU07CisJCWdvdG8gb3V0OwogCiAJcmV0ID0gc2VjdXJpdHlfZ2V0X2Jvb2xzKCZudW0sICZuYW1lcywgJnZhbHVlcyk7Ci0JaWYgKHJldCAhPSAwKQorCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCiAJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisJCXJldCA9IC1FTk9NRU07CiAJCWRlbnRyeSA9IGRfYWxsb2NfbmFtZShkaXIsIG5hbWVzW2ldKTsKLQkJaWYgKCFkZW50cnkpIHsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIGVycjsKLQkJfQotCQlpbm9kZSA9IHNlbF9tYWtlX2lub2RlKGRpci0+ZF9zYiwgU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSKTsKLQkJaWYgKCFpbm9kZSkgewotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWdvdG8gZXJyOwotCQl9CisJCWlmICghZGVudHJ5KQorCQkJZ290byBvdXQ7CiAKKwkJcmV0ID0gLUVOT01FTTsKKwkJaW5vZGUgPSBzZWxfbWFrZV9pbm9kZShkaXItPmRfc2IsIFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VTUik7CisJCWlmICghaW5vZGUpCisJCQlnb3RvIG91dDsKKworCQlyZXQgPSAtRUlOVkFMOwogCQlsZW4gPSBzbnByaW50ZihwYWdlLCBQQUdFX1NJWkUsICIvJXMvJXMiLCBCT09MX0RJUl9OQU1FLCBuYW1lc1tpXSk7Ci0JCWlmIChsZW4gPCAwKSB7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBlcnI7Ci0JCX0gZWxzZSBpZiAobGVuID49IFBBR0VfU0laRSkgewotCQkJcmV0ID0gLUVOQU1FVE9PTE9ORzsKLQkJCWdvdG8gZXJyOwotCQl9CisJCWlmIChsZW4gPCAwKQorCQkJZ290byBvdXQ7CisKKwkJcmV0ID0gLUVOQU1FVE9PTE9ORzsKKwkJaWYgKGxlbiA+PSBQQUdFX1NJWkUpCisJCQlnb3RvIG91dDsKKwogCQlpc2VjID0gKHN0cnVjdCBpbm9kZV9zZWN1cml0eV9zdHJ1Y3QgKilpbm9kZS0+aV9zZWN1cml0eTsKIAkJcmV0ID0gc2VjdXJpdHlfZ2VuZnNfc2lkKCJzZWxpbnV4ZnMiLCBwYWdlLCBTRUNDTEFTU19GSUxFLCAmc2lkKTsKIAkJaWYgKHJldCkKLQkJCWdvdG8gZXJyOworCQkJZ290byBvdXQ7CisKIAkJaXNlYy0+c2lkID0gc2lkOwogCQlpc2VjLT5pbml0aWFsaXplZCA9IDE7CiAJCWlub2RlLT5pX2ZvcCA9ICZzZWxfYm9vbF9vcHM7CkBAIC0xMjM1LDEwICsxMjQxLDEyIEBACiAJYm9vbF9udW0gPSBudW07CiAJYm9vbF9wZW5kaW5nX25hbWVzID0gbmFtZXM7CiAJYm9vbF9wZW5kaW5nX3ZhbHVlcyA9IHZhbHVlczsKKworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwYWdlKTsKKwlyZXR1cm4gMDsKIG91dDoKIAlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGFnZSk7Ci0JcmV0dXJuIHJldDsKLWVycjoKKwogCWlmIChuYW1lcykgewogCQlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspCiAJCQlrZnJlZShuYW1lc1tpXSk7CkBAIC0xMjQ2LDggKzEyNTQsOCBAQAogCX0KIAlrZnJlZSh2YWx1ZXMpOwogCXNlbF9yZW1vdmVfZW50cmllcyhkaXIpOwotCXJldCA9IC1FTk9NRU07Ci0JZ290byBvdXQ7CisKKwlyZXR1cm4gcmV0OwogfQogCiAjZGVmaW5lIE5VTExfRklMRV9OQU1FICJudWxsIgpAQCAtMTI2OSw0NyArMTI3Nyw0MSBAQAogCQkJCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogCiB7Ci0JY2hhciAqcGFnZTsKKwljaGFyICpwYWdlID0gTlVMTDsKIAlzc2l6ZV90IHJldDsKIAlpbnQgbmV3X3ZhbHVlOwogCi0JaWYgKGNvdW50ID49IFBBR0VfU0laRSkgewotCQlyZXQgPSAtRU5PTUVNOworCXJldCA9IHRhc2tfaGFzX3NlY3VyaXR5KGN1cnJlbnQsIFNFQ1VSSVRZX19TRVRTRUNQQVJBTSk7CisJaWYgKHJldCkKIAkJZ290byBvdXQ7Ci0JfQogCi0JaWYgKCpwcG9zICE9IDApIHsKLQkJLyogTm8gcGFydGlhbCB3cml0ZXMuICovCi0JCXJldCA9IC1FSU5WQUw7CisJcmV0ID0gLUVOT01FTTsKKwlpZiAoY291bnQgPj0gUEFHRV9TSVpFKQogCQlnb3RvIG91dDsKLQl9CiAKKwkvKiBObyBwYXJ0aWFsIHdyaXRlcy4gKi8KKwlyZXQgPSAtRUlOVkFMOworCWlmICgqcHBvcyAhPSAwKQorCQlnb3RvIG91dDsKKworCXJldCA9IC1FTk9NRU07CiAJcGFnZSA9IChjaGFyICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOwotCWlmICghcGFnZSkgewotCQlyZXQgPSAtRU5PTUVNOworCWlmICghcGFnZSkKIAkJZ290byBvdXQ7Ci0JfQogCi0JaWYgKGNvcHlfZnJvbV91c2VyKHBhZ2UsIGJ1ZiwgY291bnQpKSB7Ci0JCXJldCA9IC1FRkFVTFQ7Ci0JCWdvdG8gb3V0X2ZyZWU7Ci0JfQotCi0JaWYgKHNzY2FuZihwYWdlLCAiJXUiLCAmbmV3X3ZhbHVlKSAhPSAxKSB7Ci0JCXJldCA9IC1FSU5WQUw7CisJcmV0ID0gLUVGQVVMVDsKKwlpZiAoY29weV9mcm9tX3VzZXIocGFnZSwgYnVmLCBjb3VudCkpCiAJCWdvdG8gb3V0OwotCX0KIAotCWlmIChuZXdfdmFsdWUgIT0gYXZjX2NhY2hlX3RocmVzaG9sZCkgewotCQlyZXQgPSB0YXNrX2hhc19zZWN1cml0eShjdXJyZW50LCBTRUNVUklUWV9fU0VUU0VDUEFSQU0pOwotCQlpZiAocmV0KQotCQkJZ290byBvdXRfZnJlZTsKLQkJYXZjX2NhY2hlX3RocmVzaG9sZCA9IG5ld192YWx1ZTsKLQl9CisJcmV0ID0gLUVJTlZBTDsKKwlpZiAoc3NjYW5mKHBhZ2UsICIldSIsICZuZXdfdmFsdWUpICE9IDEpCisJCWdvdG8gb3V0OworCisJYXZjX2NhY2hlX3RocmVzaG9sZCA9IG5ld192YWx1ZTsKKwogCXJldCA9IGNvdW50Owotb3V0X2ZyZWU6Ci0JZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBhZ2UpOwogb3V0OgorCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwYWdlKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMzE3LDE5ICsxMzE5LDE4IEBACiAJCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewogCWNoYXIgKnBhZ2U7Ci0Jc3NpemVfdCByZXQgPSAwOworCXNzaXplX3QgbGVuZ3RoOwogCiAJcGFnZSA9IChjaGFyICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOwotCWlmICghcGFnZSkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9Ci0JcmV0ID0gYXZjX2dldF9oYXNoX3N0YXRzKHBhZ2UpOwotCWlmIChyZXQgPj0gMCkKLQkJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgcGFnZSwgcmV0KTsKKwlpZiAoIXBhZ2UpCisJCXJldHVybiAtRU5PTUVNOworCisJbGVuZ3RoID0gYXZjX2dldF9oYXNoX3N0YXRzKHBhZ2UpOworCWlmIChsZW5ndGggPj0gMCkKKwkJbGVuZ3RoID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgcGFnZSwgbGVuZ3RoKTsKIAlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGFnZSk7Ci1vdXQ6Ci0JcmV0dXJuIHJldDsKKworCXJldHVybiBsZW5ndGg7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNlbF9hdmNfY2FjaGVfdGhyZXNob2xkX29wcyA9IHsKQEAgLTE0MTEsNyArMTQxMiw3IEBACiAKIHN0YXRpYyBpbnQgc2VsX21ha2VfYXZjX2ZpbGVzKHN0cnVjdCBkZW50cnkgKmRpcikKIHsKLQlpbnQgaSwgcmV0ID0gMDsKKwlpbnQgaTsKIAlzdGF0aWMgc3RydWN0IHRyZWVfZGVzY3IgZmlsZXNbXSA9IHsKIAkJeyAiY2FjaGVfdGhyZXNob2xkIiwKIAkJICAmc2VsX2F2Y19jYWNoZV90aHJlc2hvbGRfb3BzLCBTX0lSVUdPfFNfSVdVU1IgfSwKQEAgLTE0MjYsMjIgKzE0MjcsMTkgQEAKIAkJc3RydWN0IGRlbnRyeSAqZGVudHJ5OwogCiAJCWRlbnRyeSA9IGRfYWxsb2NfbmFtZShkaXIsIGZpbGVzW2ldLm5hbWUpOwotCQlpZiAoIWRlbnRyeSkgewotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWdvdG8gb3V0OwotCQl9CisJCWlmICghZGVudHJ5KQorCQkJcmV0dXJuIC1FTk9NRU07CiAKIAkJaW5vZGUgPSBzZWxfbWFrZV9pbm9kZShkaXItPmRfc2IsIFNfSUZSRUd8ZmlsZXNbaV0ubW9kZSk7Ci0JCWlmICghaW5vZGUpIHsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIG91dDsKLQkJfQorCQlpZiAoIWlub2RlKQorCQkJcmV0dXJuIC1FTk9NRU07CisKIAkJaW5vZGUtPmlfZm9wID0gZmlsZXNbaV0ub3BzOwogCQlpbm9kZS0+aV9pbm8gPSArK3NlbF9sYXN0X2lubzsKIAkJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CiAJfQotb3V0OgotCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHNzaXplX3Qgc2VsX3JlYWRfaW5pdGNvbihzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKQEAgLTE0NTUsNyArMTQ1Myw3IEBACiAJaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXNpZCA9IGlub2RlLT5pX2lubyZTRUxfSU5PX01BU0s7CiAJcmV0ID0gc2VjdXJpdHlfc2lkX3RvX2NvbnRleHQoc2lkLCAmY29uLCAmbGVuKTsKLQlpZiAocmV0IDwgMCkKKwlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCiAJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgY29uLCBsZW4pOwpAQCAtMTQ3MCwyOCArMTQ2OCwyNSBAQAogCiBzdGF0aWMgaW50IHNlbF9tYWtlX2luaXRjb25fZmlsZXMoc3RydWN0IGRlbnRyeSAqZGlyKQogewotCWludCBpLCByZXQgPSAwOworCWludCBpOwogCiAJZm9yIChpID0gMTsgaSA8PSBTRUNJTklUU0lEX05VTTsgaSsrKSB7CiAJCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKIAkJZGVudHJ5ID0gZF9hbGxvY19uYW1lKGRpciwgc2VjdXJpdHlfZ2V0X2luaXRpYWxfc2lkX2NvbnRleHQoaSkpOwotCQlpZiAoIWRlbnRyeSkgewotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWdvdG8gb3V0OwotCQl9CisJCWlmICghZGVudHJ5KQorCQkJcmV0dXJuIC1FTk9NRU07CiAKIAkJaW5vZGUgPSBzZWxfbWFrZV9pbm9kZShkaXItPmRfc2IsIFNfSUZSRUd8U19JUlVHTyk7Ci0JCWlmICghaW5vZGUpIHsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIG91dDsKLQkJfQorCQlpZiAoIWlub2RlKQorCQkJcmV0dXJuIC1FTk9NRU07CisKIAkJaW5vZGUtPmlfZm9wID0gJnNlbF9pbml0Y29uX29wczsKIAkJaW5vZGUtPmlfaW5vID0gaXxTRUxfSU5JVENPTl9JTk9fT0ZGU0VUOwogCQlkX2FkZChkZW50cnksIGlub2RlKTsKIAl9Ci1vdXQ6Ci0JcmV0dXJuIHJldDsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBzZWxfZGl2KHVuc2lnbmVkIGxvbmcgYSwgdW5zaWduZWQgbG9uZyBiKQpAQCAtMTUyNywxNSArMTUyMiwxMyBAQAogCXVuc2lnbmVkIGxvbmcgaW5vID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9pbm87CiAKIAlwYWdlID0gKGNoYXIgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwYWdlKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQorCWlmICghcGFnZSkKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlsZW4gPSBzbnByaW50ZihwYWdlLCBQQUdFX1NJWkUsICIlZCIsIHNlbF9pbm9fdG9fY2xhc3MoaW5vKSk7CiAJcmMgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNvdW50LCBwcG9zLCBwYWdlLCBsZW4pOwogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwYWdlKTsKLW91dDoKKwogCXJldHVybiByYzsKIH0KIApAQCAtMTU1MiwxNSArMTU0NSwxMyBAQAogCXVuc2lnbmVkIGxvbmcgaW5vID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9pbm87CiAKIAlwYWdlID0gKGNoYXIgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwYWdlKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQorCWlmICghcGFnZSkKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlsZW4gPSBzbnByaW50ZihwYWdlLCBQQUdFX1NJWkUsICIlZCIsIHNlbF9pbm9fdG9fcGVybShpbm8pKTsKIAlyYyA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsIHBwb3MsIHBhZ2UsIGxlbik7CiAJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBhZ2UpOwotb3V0OgorCiAJcmV0dXJuIHJjOwogfQogCkBAIC0xNTkxLDM5ICsxNTgyLDM3IEBACiBzdGF0aWMgaW50IHNlbF9tYWtlX3Blcm1fZmlsZXMoY2hhciAqb2JqY2xhc3MsIGludCBjbGFzc3ZhbHVlLAogCQkJCXN0cnVjdCBkZW50cnkgKmRpcikKIHsKLQlpbnQgaSwgcmMgPSAwLCBucGVybXM7CisJaW50IGksIHJjLCBucGVybXM7CiAJY2hhciAqKnBlcm1zOwogCiAJcmMgPSBzZWN1cml0eV9nZXRfcGVybWlzc2lvbnMob2JqY2xhc3MsICZwZXJtcywgJm5wZXJtcyk7CiAJaWYgKHJjKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuIHJjOwogCiAJZm9yIChpID0gMDsgaSA8IG5wZXJtczsgaSsrKSB7CiAJCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKIAorCQlyYyA9IC1FTk9NRU07CiAJCWRlbnRyeSA9IGRfYWxsb2NfbmFtZShkaXIsIHBlcm1zW2ldKTsKLQkJaWYgKCFkZW50cnkpIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gb3V0MTsKLQkJfQorCQlpZiAoIWRlbnRyeSkKKwkJCWdvdG8gb3V0OwogCisJCXJjID0gLUVOT01FTTsKIAkJaW5vZGUgPSBzZWxfbWFrZV9pbm9kZShkaXItPmRfc2IsIFNfSUZSRUd8U19JUlVHTyk7Ci0JCWlmICghaW5vZGUpIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gb3V0MTsKLQkJfQorCQlpZiAoIWlub2RlKQorCQkJZ290byBvdXQ7CisKIAkJaW5vZGUtPmlfZm9wID0gJnNlbF9wZXJtX29wczsKIAkJLyogaSsxIHNpbmNlIHBlcm0gdmFsdWVzIGFyZSAxLWluZGV4ZWQgKi8KIAkJaW5vZGUtPmlfaW5vID0gc2VsX3Blcm1fdG9faW5vKGNsYXNzdmFsdWUsIGkgKyAxKTsKIAkJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CiAJfQotCi1vdXQxOgorCXJjID0gMDsKK291dDoKIAlmb3IgKGkgPSAwOyBpIDwgbnBlcm1zOyBpKyspCiAJCWtmcmVlKHBlcm1zW2ldKTsKIAlrZnJlZShwZXJtcyk7Ci1vdXQ6CiAJcmV0dXJuIHJjOwogfQogCkBAIC0xNjM1LDM0ICsxNjI0LDI3IEBACiAJaW50IHJjOwogCiAJZGVudHJ5ID0gZF9hbGxvY19uYW1lKGRpciwgImluZGV4Iik7Ci0JaWYgKCFkZW50cnkpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9CisJaWYgKCFkZW50cnkpCisJCXJldHVybiAtRU5PTUVNOwogCiAJaW5vZGUgPSBzZWxfbWFrZV9pbm9kZShkaXItPmRfc2IsIFNfSUZSRUd8U19JUlVHTyk7Ci0JaWYgKCFpbm9kZSkgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KKwlpZiAoIWlub2RlKQorCQlyZXR1cm4gLUVOT01FTTsKIAogCWlub2RlLT5pX2ZvcCA9ICZzZWxfY2xhc3Nfb3BzOwogCWlub2RlLT5pX2lubyA9IHNlbF9jbGFzc190b19pbm8oaW5kZXgpOwogCWRfYWRkKGRlbnRyeSwgaW5vZGUpOwogCiAJZGVudHJ5ID0gZF9hbGxvY19uYW1lKGRpciwgInBlcm1zIik7Ci0JaWYgKCFkZW50cnkpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9CisJaWYgKCFkZW50cnkpCisJCXJldHVybiAtRU5PTUVNOwogCiAJcmMgPSBzZWxfbWFrZV9kaXIoZGlyLT5kX2lub2RlLCBkZW50cnksICZsYXN0X2NsYXNzX2lubyk7CiAJaWYgKHJjKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuIHJjOwogCiAJcmMgPSBzZWxfbWFrZV9wZXJtX2ZpbGVzKGNsYXNzbmFtZSwgaW5kZXgsIGRlbnRyeSk7CiAKLW91dDoKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTE2OTIsMTUgKzE2NzQsMTUgQEAKIAogc3RhdGljIGludCBzZWxfbWFrZV9jbGFzc2VzKHZvaWQpCiB7Ci0JaW50IHJjID0gMCwgbmNsYXNzZXMsIGk7CisJaW50IHJjLCBuY2xhc3NlcywgaTsKIAljaGFyICoqY2xhc3NlczsKIAogCS8qIGRlbGV0ZSBhbnkgZXhpc3RpbmcgZW50cmllcyAqLwogCXNlbF9yZW1vdmVfY2xhc3NlcygpOwogCiAJcmMgPSBzZWN1cml0eV9nZXRfY2xhc3NlcygmY2xhc3NlcywgJm5jbGFzc2VzKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIG91dDsKKwlpZiAocmMpCisJCXJldHVybiByYzsKIAogCS8qICsyIHNpbmNlIGNsYXNzZXMgYXJlIDEtaW5kZXhlZCAqLwogCWxhc3RfY2xhc3NfaW5vID0gc2VsX2NsYXNzX3RvX2lubyhuY2xhc3NlcyArIDIpOwpAQCAtMTcwOCwyOSArMTY5MCwyNyBAQAogCWZvciAoaSA9IDA7IGkgPCBuY2xhc3NlczsgaSsrKSB7CiAJCXN0cnVjdCBkZW50cnkgKmNsYXNzX25hbWVfZGlyOwogCisJCXJjID0gLUVOT01FTTsKIAkJY2xhc3NfbmFtZV9kaXIgPSBkX2FsbG9jX25hbWUoY2xhc3NfZGlyLCBjbGFzc2VzW2ldKTsKLQkJaWYgKCFjbGFzc19uYW1lX2RpcikgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBvdXQxOwotCQl9CisJCWlmICghY2xhc3NfbmFtZV9kaXIpCisJCQlnb3RvIG91dDsKIAogCQlyYyA9IHNlbF9tYWtlX2RpcihjbGFzc19kaXItPmRfaW5vZGUsIGNsYXNzX25hbWVfZGlyLAogCQkJCSZsYXN0X2NsYXNzX2lubyk7CiAJCWlmIChyYykKLQkJCWdvdG8gb3V0MTsKKwkJCWdvdG8gb3V0OwogCiAJCS8qIGkrMSBzaW5jZSBjbGFzcyB2YWx1ZXMgYXJlIDEtaW5kZXhlZCAqLwogCQlyYyA9IHNlbF9tYWtlX2NsYXNzX2Rpcl9lbnRyaWVzKGNsYXNzZXNbaV0sIGkgKyAxLAogCQkJCWNsYXNzX25hbWVfZGlyKTsKIAkJaWYgKHJjKQotCQkJZ290byBvdXQxOworCQkJZ290byBvdXQ7CiAJfQotCi1vdXQxOgorCXJjID0gMDsKK291dDoKIAlmb3IgKGkgPSAwOyBpIDwgbmNsYXNzZXM7IGkrKykKIAkJa2ZyZWUoY2xhc3Nlc1tpXSk7CiAJa2ZyZWUoY2xhc3Nlcyk7Ci1vdXQ6CiAJcmV0dXJuIHJjOwogfQogCkBAIC0xNzY3LDE0ICsxNzQ3LDEyIEBACiBzdGF0aWMgaW50IHNlbF9tYWtlX2RpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAogCQkJdW5zaWduZWQgbG9uZyAqaW5vKQogewotCWludCByZXQgPSAwOwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAKIAlpbm9kZSA9IHNlbF9tYWtlX2lub2RlKGRpci0+aV9zYiwgU19JRkRJUiB8IFNfSVJVR08gfCBTX0lYVUdPKTsKLQlpZiAoIWlub2RlKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KKwlpZiAoIWlub2RlKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCWlub2RlLT5pX29wID0gJnNpbXBsZV9kaXJfaW5vZGVfb3BlcmF0aW9uczsKIAlpbm9kZS0+aV9mb3AgPSAmc2ltcGxlX2Rpcl9vcGVyYXRpb25zOwogCWlub2RlLT5pX2lubyA9ICsrKCppbm8pOwpAQCAtMTc4Myw4ICsxNzYxLDggQEAKIAlkX2FkZChkZW50cnksIGlub2RlKTsKIAkvKiBidW1wIGxpbmsgY291bnQgb24gcGFyZW50IGRpcmVjdG9yeSwgdG9vICovCiAJaW5jX25saW5rKGRpcik7Ci1vdXQ6Ci0JcmV0dXJuIHJldDsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHNlbF9maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEsIGludCBzaWxlbnQpCkBAIC0xODIwLDExICsxNzk4LDEwIEBACiAKIAlyb290X2lub2RlID0gc2ItPnNfcm9vdC0+ZF9pbm9kZTsKIAorCXJldCA9IC1FTk9NRU07CiAJZGVudHJ5ID0gZF9hbGxvY19uYW1lKHNiLT5zX3Jvb3QsIEJPT0xfRElSX05BTUUpOwotCWlmICghZGVudHJ5KSB7Ci0JCXJldCA9IC1FTk9NRU07CisJaWYgKCFkZW50cnkpCiAJCWdvdG8gZXJyOwotCX0KIAogCXJldCA9IHNlbF9tYWtlX2Rpcihyb290X2lub2RlLCBkZW50cnksICZzZWxfbGFzdF9pbm8pOwogCWlmIChyZXQpCkBAIC0xODMyLDE3ICsxODA5LDE2IEBACiAKIAlib29sX2RpciA9IGRlbnRyeTsKIAorCXJldCA9IC1FTk9NRU07CiAJZGVudHJ5ID0gZF9hbGxvY19uYW1lKHNiLT5zX3Jvb3QsIE5VTExfRklMRV9OQU1FKTsKLQlpZiAoIWRlbnRyeSkgewotCQlyZXQgPSAtRU5PTUVNOworCWlmICghZGVudHJ5KQogCQlnb3RvIGVycjsKLQl9CiAKKwlyZXQgPSAtRU5PTUVNOwogCWlub2RlID0gc2VsX21ha2VfaW5vZGUoc2IsIFNfSUZDSFIgfCBTX0lSVUdPIHwgU19JV1VHTyk7Ci0JaWYgKCFpbm9kZSkgewotCQlyZXQgPSAtRU5PTUVNOworCWlmICghaW5vZGUpCiAJCWdvdG8gZXJyOwotCX0KKwogCWlub2RlLT5pX2lubyA9ICsrc2VsX2xhc3RfaW5vOwogCWlzZWMgPSAoc3RydWN0IGlub2RlX3NlY3VyaXR5X3N0cnVjdCAqKWlub2RlLT5pX3NlY3VyaXR5OwogCWlzZWMtPnNpZCA9IFNFQ0lOSVRTSURfREVWTlVMTDsKQEAgLTE4NTMsMTEgKzE4MjksMTAgQEAKIAlkX2FkZChkZW50cnksIGlub2RlKTsKIAlzZWxpbnV4X251bGwgPSBkZW50cnk7CiAKKwlyZXQgPSAtRU5PTUVNOwogCWRlbnRyeSA9IGRfYWxsb2NfbmFtZShzYi0+c19yb290LCAiYXZjIik7Ci0JaWYgKCFkZW50cnkpIHsKLQkJcmV0ID0gLUVOT01FTTsKKwlpZiAoIWRlbnRyeSkKIAkJZ290byBlcnI7Ci0JfQogCiAJcmV0ID0gc2VsX21ha2VfZGlyKHJvb3RfaW5vZGUsIGRlbnRyeSwgJnNlbF9sYXN0X2lubyk7CiAJaWYgKHJldCkKQEAgLTE4NjcsMTEgKzE4NDIsMTAgQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycjsKIAorCXJldCA9IC1FTk9NRU07CiAJZGVudHJ5ID0gZF9hbGxvY19uYW1lKHNiLT5zX3Jvb3QsICJpbml0aWFsX2NvbnRleHRzIik7Ci0JaWYgKCFkZW50cnkpIHsKLQkJcmV0ID0gLUVOT01FTTsKKwlpZiAoIWRlbnRyeSkKIAkJZ290byBlcnI7Ci0JfQogCiAJcmV0ID0gc2VsX21ha2VfZGlyKHJvb3RfaW5vZGUsIGRlbnRyeSwgJnNlbF9sYXN0X2lubyk7CiAJaWYgKHJldCkKQEAgLTE4ODEsMTEgKzE4NTUsMTAgQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycjsKIAorCXJldCA9IC1FTk9NRU07CiAJZGVudHJ5ID0gZF9hbGxvY19uYW1lKHNiLT5zX3Jvb3QsICJjbGFzcyIpOwotCWlmICghZGVudHJ5KSB7Ci0JCXJldCA9IC1FTk9NRU07CisJaWYgKCFkZW50cnkpCiAJCWdvdG8gZXJyOwotCX0KIAogCXJldCA9IHNlbF9tYWtlX2Rpcihyb290X2lub2RlLCBkZW50cnksICZzZWxfbGFzdF9pbm8pOwogCWlmIChyZXQpCkBAIC0xODkzLDExICsxODY2LDEwIEBACiAKIAljbGFzc19kaXIgPSBkZW50cnk7CiAKKwlyZXQgPSAtRU5PTUVNOwogCWRlbnRyeSA9IGRfYWxsb2NfbmFtZShzYi0+c19yb290LCAicG9saWN5X2NhcGFiaWxpdGllcyIpOwotCWlmICghZGVudHJ5KSB7Ci0JCXJldCA9IC1FTk9NRU07CisJaWYgKCFkZW50cnkpCiAJCWdvdG8gZXJyOwotCX0KIAogCXJldCA9IHNlbF9tYWtlX2Rpcihyb290X2lub2RlLCBkZW50cnksICZzZWxfbGFzdF9pbm8pOwogCWlmIChyZXQpCkBAIC0xOTA1LDEyICsxODc3LDExIEBACiAKIAlwb2xpY3ljYXBfZGlyID0gZGVudHJ5OwogCi1vdXQ6Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIGVycjoKIAlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6ICVzOiAgZmFpbGVkIHdoaWxlIGNyZWF0aW5nIGlub2Rlc1xuIiwKIAkJX19mdW5jX18pOwotCWdvdG8gb3V0OworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpzZWxfbW91bnQoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCkBAIC0xOTM0LDE0ICsxOTA1LDE2IEBACiAJaWYgKCFzZWxpbnV4X2VuYWJsZWQpCiAJCXJldHVybiAwOwogCWVyciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnNlbF9mc190eXBlKTsKLQlpZiAoIWVycikgewotCQlzZWxpbnV4ZnNfbW91bnQgPSBrZXJuX21vdW50KCZzZWxfZnNfdHlwZSk7Ci0JCWlmIChJU19FUlIoc2VsaW51eGZzX21vdW50KSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJzZWxpbnV4ZnM6ICBjb3VsZCBub3QgbW91bnQhXG4iKTsKLQkJCWVyciA9IFBUUl9FUlIoc2VsaW51eGZzX21vdW50KTsKLQkJCXNlbGludXhmc19tb3VudCA9IE5VTEw7Ci0JCX0KKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJc2VsaW51eGZzX21vdW50ID0ga2Vybl9tb3VudCgmc2VsX2ZzX3R5cGUpOworCWlmIChJU19FUlIoc2VsaW51eGZzX21vdW50KSkgeworCQlwcmludGsoS0VSTl9FUlIgInNlbGludXhmczogIGNvdWxkIG5vdCBtb3VudCFcbiIpOworCQllcnIgPSBQVFJfRVJSKHNlbGludXhmc19tb3VudCk7CisJCXNlbGludXhmc19tb3VudCA9IE5VTEw7CiAJfQorCiAJcmV0dXJuIGVycjsKIH0KIApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zcy9jb25kaXRpb25hbC5jIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9jb25kaXRpb25hbC5jCmluZGV4IDY1NWZlMWMuLmMzZjg0NWMgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvc3MvY29uZGl0aW9uYWwuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L3NzL2NvbmRpdGlvbmFsLmMKQEAgLTE5Myw2ICsxOTMsNyBAQAogewogCXN0cnVjdCBwb2xpY3lkYiAqcDsKIAlzdHJ1Y3QgY29uZF9ib29sX2RhdHVtICpib29sZGF0dW07CisJc3RydWN0IGZsZXhfYXJyYXkgKmZhOwogCiAJYm9vbGRhdHVtID0gZGF0dW07CiAJcCA9IGRhdGFwOwpAQCAtMjAwLDcgKzIwMSwxMCBAQAogCWlmICghYm9vbGRhdHVtLT52YWx1ZSB8fCBib29sZGF0dW0tPnZhbHVlID4gcC0+cF9ib29scy5ucHJpbSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlwLT5wX2Jvb2xfdmFsX3RvX25hbWVbYm9vbGRhdHVtLT52YWx1ZSAtIDFdID0ga2V5OworCWZhID0gcC0+c3ltX3ZhbF90b19uYW1lW1NZTV9CT09MU107CisJaWYgKGZsZXhfYXJyYXlfcHV0X3B0cihmYSwgYm9vbGRhdHVtLT52YWx1ZSAtIDEsIGtleSwKKwkJCSAgICAgICBHRlBfS0VSTkVMIHwgX19HRlBfWkVSTykpCisJCUJVRygpOwogCXAtPmJvb2xfdmFsX3RvX3N0cnVjdFtib29sZGF0dW0tPnZhbHVlIC0gMV0gPSBib29sZGF0dW07CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc3MvbWxzLmMgYi9zZWN1cml0eS9zZWxpbnV4L3NzL21scy5jCmluZGV4IGI0ZWZmN2EuLjFlZjhlNGUgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvc3MvbWxzLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9tbHMuYwpAQCAtNDUsNyArNDUsNyBAQAogCWxlbiA9IDE7IC8qIGZvciB0aGUgYmVnaW5uaW5nICI6IiAqLwogCWZvciAobCA9IDA7IGwgPCAyOyBsKyspIHsKIAkJaW50IGluZGV4X3NlbnMgPSBjb250ZXh0LT5yYW5nZS5sZXZlbFtsXS5zZW5zOwotCQlsZW4gKz0gc3RybGVuKHBvbGljeWRiLnBfc2Vuc192YWxfdG9fbmFtZVtpbmRleF9zZW5zIC0gMV0pOworCQlsZW4gKz0gc3RybGVuKHN5bV9uYW1lKCZwb2xpY3lkYiwgU1lNX0xFVkVMUywgaW5kZXhfc2VucyAtIDEpKTsKIAogCQkvKiBjYXRlZ29yaWVzICovCiAJCWhlYWQgPSAtMjsKQEAgLTU1LDE3ICs1NSwxNyBAQAogCQkJaWYgKGkgLSBwcmV2ID4gMSkgewogCQkJCS8qIG9uZSBvciBtb3JlIG5lZ2F0aXZlIGJpdHMgYXJlIHNraXBwZWQgKi8KIAkJCQlpZiAoaGVhZCAhPSBwcmV2KSB7Ci0JCQkJCW5tID0gcG9saWN5ZGIucF9jYXRfdmFsX3RvX25hbWVbcHJldl07CisJCQkJCW5tID0gc3ltX25hbWUoJnBvbGljeWRiLCBTWU1fQ0FUUywgcHJldik7CiAJCQkJCWxlbiArPSBzdHJsZW4obm0pICsgMTsKIAkJCQl9Ci0JCQkJbm0gPSBwb2xpY3lkYi5wX2NhdF92YWxfdG9fbmFtZVtpXTsKKwkJCQlubSA9IHN5bV9uYW1lKCZwb2xpY3lkYiwgU1lNX0NBVFMsIGkpOwogCQkJCWxlbiArPSBzdHJsZW4obm0pICsgMTsKIAkJCQloZWFkID0gaTsKIAkJCX0KIAkJCXByZXYgPSBpOwogCQl9CiAJCWlmIChwcmV2ICE9IGhlYWQpIHsKLQkJCW5tID0gcG9saWN5ZGIucF9jYXRfdmFsX3RvX25hbWVbcHJldl07CisJCQlubSA9IHN5bV9uYW1lKCZwb2xpY3lkYiwgU1lNX0NBVFMsIHByZXYpOwogCQkJbGVuICs9IHN0cmxlbihubSkgKyAxOwogCQl9CiAJCWlmIChsID09IDApIHsKQEAgLTEwMiw4ICsxMDIsOCBAQAogCXNjb250ZXh0cCsrOwogCiAJZm9yIChsID0gMDsgbCA8IDI7IGwrKykgewotCQlzdHJjcHkoc2NvbnRleHRwLAotCQkgICAgICAgcG9saWN5ZGIucF9zZW5zX3ZhbF90b19uYW1lW2NvbnRleHQtPnJhbmdlLmxldmVsW2xdLnNlbnMgLSAxXSk7CisJCXN0cmNweShzY29udGV4dHAsIHN5bV9uYW1lKCZwb2xpY3lkYiwgU1lNX0xFVkVMUywKKwkJCQkJICAgY29udGV4dC0+cmFuZ2UubGV2ZWxbbF0uc2VucyAtIDEpKTsKIAkJc2NvbnRleHRwICs9IHN0cmxlbihzY29udGV4dHApOwogCiAJCS8qIGNhdGVnb3JpZXMgKi8KQEAgLTExOCw3ICsxMTgsNyBAQAogCQkJCQkJKnNjb250ZXh0cCsrID0gJy4nOwogCQkJCQllbHNlCiAJCQkJCQkqc2NvbnRleHRwKysgPSAnLCc7Ci0JCQkJCW5tID0gcG9saWN5ZGIucF9jYXRfdmFsX3RvX25hbWVbcHJldl07CisJCQkJCW5tID0gc3ltX25hbWUoJnBvbGljeWRiLCBTWU1fQ0FUUywgcHJldik7CiAJCQkJCXN0cmNweShzY29udGV4dHAsIG5tKTsKIAkJCQkJc2NvbnRleHRwICs9IHN0cmxlbihubSk7CiAJCQkJfQpAQCAtMTI2LDcgKzEyNiw3IEBACiAJCQkJCSpzY29udGV4dHArKyA9ICc6JzsKIAkJCQllbHNlCiAJCQkJCSpzY29udGV4dHArKyA9ICcsJzsKLQkJCQlubSA9IHBvbGljeWRiLnBfY2F0X3ZhbF90b19uYW1lW2ldOworCQkJCW5tID0gc3ltX25hbWUoJnBvbGljeWRiLCBTWU1fQ0FUUywgaSk7CiAJCQkJc3RyY3B5KHNjb250ZXh0cCwgbm0pOwogCQkJCXNjb250ZXh0cCArPSBzdHJsZW4obm0pOwogCQkJCWhlYWQgPSBpOwpAQCAtMTM5LDcgKzEzOSw3IEBACiAJCQkJKnNjb250ZXh0cCsrID0gJy4nOwogCQkJZWxzZQogCQkJCSpzY29udGV4dHArKyA9ICcsJzsKLQkJCW5tID0gcG9saWN5ZGIucF9jYXRfdmFsX3RvX25hbWVbcHJldl07CisJCQlubSA9IHN5bV9uYW1lKCZwb2xpY3lkYiwgU1lNX0NBVFMsIHByZXYpOwogCQkJc3RyY3B5KHNjb250ZXh0cCwgbm0pOwogCQkJc2NvbnRleHRwICs9IHN0cmxlbihubSk7CiAJCX0KQEAgLTE2Niw3ICsxNjYsNyBAQAogCWlmICghbC0+c2VucyB8fCBsLT5zZW5zID4gcC0+cF9sZXZlbHMubnByaW0pCiAJCXJldHVybiAwOwogCWxldmRhdHVtID0gaGFzaHRhYl9zZWFyY2gocC0+cF9sZXZlbHMudGFibGUsCi0JCQkJICBwLT5wX3NlbnNfdmFsX3RvX25hbWVbbC0+c2VucyAtIDFdKTsKKwkJCQkgIHN5bV9uYW1lKHAsIFNZTV9MRVZFTFMsIGwtPnNlbnMgLSAxKSk7CiAJaWYgKCFsZXZkYXR1bSkKIAkJcmV0dXJuIDA7CiAKQEAgLTQ4Miw3ICs0ODIsOCBAQAogCiAJZm9yIChsID0gMDsgbCA8IDI7IGwrKykgewogCQlsZXZkYXR1bSA9IGhhc2h0YWJfc2VhcmNoKG5ld3AtPnBfbGV2ZWxzLnRhYmxlLAotCQkJb2xkcC0+cF9zZW5zX3ZhbF90b19uYW1lW2MtPnJhbmdlLmxldmVsW2xdLnNlbnMgLSAxXSk7CisJCQkJCSAgc3ltX25hbWUob2xkcCwgU1lNX0xFVkVMUywKKwkJCQkJCSAgIGMtPnJhbmdlLmxldmVsW2xdLnNlbnMgLSAxKSk7CiAKIAkJaWYgKCFsZXZkYXR1bSkKIAkJCXJldHVybiAtRUlOVkFMOwpAQCAtNDkzLDcgKzQ5NCw3IEBACiAJCQlpbnQgcmM7CiAKIAkJCWNhdGRhdHVtID0gaGFzaHRhYl9zZWFyY2gobmV3cC0+cF9jYXRzLnRhYmxlLAotCQkJCQkJICBvbGRwLT5wX2NhdF92YWxfdG9fbmFtZVtpXSk7CisJCQkJCQkgIHN5bV9uYW1lKG9sZHAsIFNZTV9DQVRTLCBpKSk7CiAJCQlpZiAoIWNhdGRhdHVtKQogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJcmMgPSBlYml0bWFwX3NldF9iaXQoJmJpdG1hcCwgY2F0ZGF0dW0tPnZhbHVlIC0gMSwgMSk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3NzL3BvbGljeWRiLmMgYi9zZWN1cml0eS9zZWxpbnV4L3NzL3BvbGljeWRiLmMKaW5kZXggOTRmNjMwZC4uYmU5ZGUzOCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9wb2xpY3lkYi5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvc3MvcG9saWN5ZGIuYwpAQCAtMTQ4LDMyICsxNDgsMzAgQEAKIAlpbnQgcmM7CiAJc3RydWN0IHJvbGVfZGF0dW0gKnJvbGU7CiAKKwlyYyA9IC1FTk9NRU07CiAJcm9sZSA9IGt6YWxsb2Moc2l6ZW9mKCpyb2xlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyb2xlKSB7Ci0JCXJjID0gLUVOT01FTTsKKwlpZiAoIXJvbGUpCiAJCWdvdG8gb3V0OwotCX0KKworCXJjID0gLUVJTlZBTDsKIAlyb2xlLT52YWx1ZSA9ICsrcC0+cF9yb2xlcy5ucHJpbTsKLQlpZiAocm9sZS0+dmFsdWUgIT0gT0JKRUNUX1JfVkFMKSB7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBvdXRfZnJlZV9yb2xlOwotCX0KKwlpZiAocm9sZS0+dmFsdWUgIT0gT0JKRUNUX1JfVkFMKQorCQlnb3RvIG91dDsKKworCXJjID0gLUVOT01FTTsKIAlrZXkgPSBrc3RyZHVwKE9CSkVDVF9SLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWtleSkgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0X2ZyZWVfcm9sZTsKLQl9CisJaWYgKCFrZXkpCisJCWdvdG8gb3V0OworCiAJcmMgPSBoYXNodGFiX2luc2VydChwLT5wX3JvbGVzLnRhYmxlLCBrZXksIHJvbGUpOwogCWlmIChyYykKLQkJZ290byBvdXRfZnJlZV9rZXk7Ci1vdXQ6Ci0JcmV0dXJuIHJjOworCQlnb3RvIG91dDsKIAotb3V0X2ZyZWVfa2V5OgorCXJldHVybiAwOworb3V0OgogCWtmcmVlKGtleSk7Ci1vdXRfZnJlZV9yb2xlOgogCWtmcmVlKHJvbGUpOwotCWdvdG8gb3V0OworCXJldHVybiByYzsKIH0KIAogc3RhdGljIHUzMiByYW5nZXRyX2hhc2goc3RydWN0IGhhc2h0YWIgKmgsIGNvbnN0IHZvaWQgKmspCkBAIC0yMTMsMzUgKzIxMSwzMyBAQAogCWZvciAoaSA9IDA7IGkgPCBTWU1fTlVNOyBpKyspIHsKIAkJcmMgPSBzeW10YWJfaW5pdCgmcC0+c3ltdGFiW2ldLCBzeW10YWJfc2l6ZXNbaV0pOwogCQlpZiAocmMpCi0JCQlnb3RvIG91dF9mcmVlX3N5bXRhYjsKKwkJCWdvdG8gb3V0OwogCX0KIAogCXJjID0gYXZ0YWJfaW5pdCgmcC0+dGVfYXZ0YWIpOwogCWlmIChyYykKLQkJZ290byBvdXRfZnJlZV9zeW10YWI7CisJCWdvdG8gb3V0OwogCiAJcmMgPSByb2xlc19pbml0KHApOwogCWlmIChyYykKLQkJZ290byBvdXRfZnJlZV9zeW10YWI7CisJCWdvdG8gb3V0OwogCiAJcmMgPSBjb25kX3BvbGljeWRiX2luaXQocCk7CiAJaWYgKHJjKQotCQlnb3RvIG91dF9mcmVlX3N5bXRhYjsKKwkJZ290byBvdXQ7CiAKIAlwLT5yYW5nZV90ciA9IGhhc2h0YWJfY3JlYXRlKHJhbmdldHJfaGFzaCwgcmFuZ2V0cl9jbXAsIDI1Nik7CiAJaWYgKCFwLT5yYW5nZV90cikKLQkJZ290byBvdXRfZnJlZV9zeW10YWI7CisJCWdvdG8gb3V0OwogCiAJZWJpdG1hcF9pbml0KCZwLT5wb2xpY3ljYXBzKTsKIAllYml0bWFwX2luaXQoJnAtPnBlcm1pc3NpdmVfbWFwKTsKIAorCXJldHVybiAwOwogb3V0OgotCXJldHVybiByYzsKLQotb3V0X2ZyZWVfc3ltdGFiOgogCWZvciAoaSA9IDA7IGkgPCBTWU1fTlVNOyBpKyspCiAJCWhhc2h0YWJfZGVzdHJveShwLT5zeW10YWJbaV0udGFibGUpOwotCWdvdG8gb3V0OworCXJldHVybiByYzsKIH0KIAogLyoKQEAgLTI1OCwxMiArMjU0LDE3IEBACiB7CiAJc3RydWN0IHBvbGljeWRiICpwOwogCXN0cnVjdCBjb21tb25fZGF0dW0gKmNvbWRhdHVtOworCXN0cnVjdCBmbGV4X2FycmF5ICpmYTsKIAogCWNvbWRhdHVtID0gZGF0dW07CiAJcCA9IGRhdGFwOwogCWlmICghY29tZGF0dW0tPnZhbHVlIHx8IGNvbWRhdHVtLT52YWx1ZSA+IHAtPnBfY29tbW9ucy5ucHJpbSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JcC0+cF9jb21tb25fdmFsX3RvX25hbWVbY29tZGF0dW0tPnZhbHVlIC0gMV0gPSBrZXk7CisKKwlmYSA9IHAtPnN5bV92YWxfdG9fbmFtZVtTWU1fQ09NTU9OU107CisJaWYgKGZsZXhfYXJyYXlfcHV0X3B0cihmYSwgY29tZGF0dW0tPnZhbHVlIC0gMSwga2V5LAorCQkJICAgICAgIEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKSkKKwkJQlVHKCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI3MSwxMiArMjcyLDE2IEBACiB7CiAJc3RydWN0IHBvbGljeWRiICpwOwogCXN0cnVjdCBjbGFzc19kYXR1bSAqY2xhZGF0dW07CisJc3RydWN0IGZsZXhfYXJyYXkgKmZhOwogCiAJY2xhZGF0dW0gPSBkYXR1bTsKIAlwID0gZGF0YXA7CiAJaWYgKCFjbGFkYXR1bS0+dmFsdWUgfHwgY2xhZGF0dW0tPnZhbHVlID4gcC0+cF9jbGFzc2VzLm5wcmltKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlwLT5wX2NsYXNzX3ZhbF90b19uYW1lW2NsYWRhdHVtLT52YWx1ZSAtIDFdID0ga2V5OworCWZhID0gcC0+c3ltX3ZhbF90b19uYW1lW1NZTV9DTEFTU0VTXTsKKwlpZiAoZmxleF9hcnJheV9wdXRfcHRyKGZhLCBjbGFkYXR1bS0+dmFsdWUgLSAxLCBrZXksCisJCQkgICAgICAgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8pKQorCQlCVUcoKTsKIAlwLT5jbGFzc192YWxfdG9fc3RydWN0W2NsYWRhdHVtLT52YWx1ZSAtIDFdID0gY2xhZGF0dW07CiAJcmV0dXJuIDA7CiB9CkBAIC0yODUsNiArMjkwLDcgQEAKIHsKIAlzdHJ1Y3QgcG9saWN5ZGIgKnA7CiAJc3RydWN0IHJvbGVfZGF0dW0gKnJvbGU7CisJc3RydWN0IGZsZXhfYXJyYXkgKmZhOwogCiAJcm9sZSA9IGRhdHVtOwogCXAgPSBkYXRhcDsKQEAgLTI5Miw3ICsyOTgsMTEgQEAKIAkgICAgfHwgcm9sZS0+dmFsdWUgPiBwLT5wX3JvbGVzLm5wcmltCiAJICAgIHx8IHJvbGUtPmJvdW5kcyA+IHAtPnBfcm9sZXMubnByaW0pCiAJCXJldHVybiAtRUlOVkFMOwotCXAtPnBfcm9sZV92YWxfdG9fbmFtZVtyb2xlLT52YWx1ZSAtIDFdID0ga2V5OworCisJZmEgPSBwLT5zeW1fdmFsX3RvX25hbWVbU1lNX1JPTEVTXTsKKwlpZiAoZmxleF9hcnJheV9wdXRfcHRyKGZhLCByb2xlLT52YWx1ZSAtIDEsIGtleSwKKwkJCSAgICAgICBHRlBfS0VSTkVMIHwgX19HRlBfWkVSTykpCisJCUJVRygpOwogCXAtPnJvbGVfdmFsX3RvX3N0cnVjdFtyb2xlLT52YWx1ZSAtIDFdID0gcm9sZTsKIAlyZXR1cm4gMDsKIH0KQEAgLTMwMSw2ICszMTEsNyBAQAogewogCXN0cnVjdCBwb2xpY3lkYiAqcDsKIAlzdHJ1Y3QgdHlwZV9kYXR1bSAqdHlwZGF0dW07CisJc3RydWN0IGZsZXhfYXJyYXkgKmZhOwogCiAJdHlwZGF0dW0gPSBkYXR1bTsKIAlwID0gZGF0YXA7CkBAIC0zMTAsOCArMzIxLDE1IEBACiAJCSAgICB8fCB0eXBkYXR1bS0+dmFsdWUgPiBwLT5wX3R5cGVzLm5wcmltCiAJCSAgICB8fCB0eXBkYXR1bS0+Ym91bmRzID4gcC0+cF90eXBlcy5ucHJpbSkKIAkJCXJldHVybiAtRUlOVkFMOwotCQlwLT5wX3R5cGVfdmFsX3RvX25hbWVbdHlwZGF0dW0tPnZhbHVlIC0gMV0gPSBrZXk7Ci0JCXAtPnR5cGVfdmFsX3RvX3N0cnVjdFt0eXBkYXR1bS0+dmFsdWUgLSAxXSA9IHR5cGRhdHVtOworCQlmYSA9IHAtPnN5bV92YWxfdG9fbmFtZVtTWU1fVFlQRVNdOworCQlpZiAoZmxleF9hcnJheV9wdXRfcHRyKGZhLCB0eXBkYXR1bS0+dmFsdWUgLSAxLCBrZXksCisJCQkJICAgICAgIEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKSkKKwkJCUJVRygpOworCisJCWZhID0gcC0+dHlwZV92YWxfdG9fc3RydWN0X2FycmF5OworCQlpZiAoZmxleF9hcnJheV9wdXRfcHRyKGZhLCB0eXBkYXR1bS0+dmFsdWUgLSAxLCB0eXBkYXR1bSwKKwkJCQkgICAgICAgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8pKQorCQkJQlVHKCk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0zMjEsNiArMzM5LDcgQEAKIHsKIAlzdHJ1Y3QgcG9saWN5ZGIgKnA7CiAJc3RydWN0IHVzZXJfZGF0dW0gKnVzcmRhdHVtOworCXN0cnVjdCBmbGV4X2FycmF5ICpmYTsKIAogCXVzcmRhdHVtID0gZGF0dW07CiAJcCA9IGRhdGFwOwpAQCAtMzI4LDcgKzM0NywxMSBAQAogCSAgICB8fCB1c3JkYXR1bS0+dmFsdWUgPiBwLT5wX3VzZXJzLm5wcmltCiAJICAgIHx8IHVzcmRhdHVtLT5ib3VuZHMgPiBwLT5wX3VzZXJzLm5wcmltKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlwLT5wX3VzZXJfdmFsX3RvX25hbWVbdXNyZGF0dW0tPnZhbHVlIC0gMV0gPSBrZXk7CisKKwlmYSA9IHAtPnN5bV92YWxfdG9fbmFtZVtTWU1fVVNFUlNdOworCWlmIChmbGV4X2FycmF5X3B1dF9wdHIoZmEsIHVzcmRhdHVtLT52YWx1ZSAtIDEsIGtleSwKKwkJCSAgICAgICBHRlBfS0VSTkVMIHwgX19HRlBfWkVSTykpCisJCUJVRygpOwogCXAtPnVzZXJfdmFsX3RvX3N0cnVjdFt1c3JkYXR1bS0+dmFsdWUgLSAxXSA9IHVzcmRhdHVtOwogCXJldHVybiAwOwogfQpAQCAtMzM3LDYgKzM2MCw3IEBACiB7CiAJc3RydWN0IHBvbGljeWRiICpwOwogCXN0cnVjdCBsZXZlbF9kYXR1bSAqbGV2ZGF0dW07CisJc3RydWN0IGZsZXhfYXJyYXkgKmZhOwogCiAJbGV2ZGF0dW0gPSBkYXR1bTsKIAlwID0gZGF0YXA7CkBAIC0zNDUsNyArMzY5LDEwIEBACiAJCWlmICghbGV2ZGF0dW0tPmxldmVsLT5zZW5zIHx8CiAJCSAgICBsZXZkYXR1bS0+bGV2ZWwtPnNlbnMgPiBwLT5wX2xldmVscy5ucHJpbSkKIAkJCXJldHVybiAtRUlOVkFMOwotCQlwLT5wX3NlbnNfdmFsX3RvX25hbWVbbGV2ZGF0dW0tPmxldmVsLT5zZW5zIC0gMV0gPSBrZXk7CisJCWZhID0gcC0+c3ltX3ZhbF90b19uYW1lW1NZTV9MRVZFTFNdOworCQlpZiAoZmxleF9hcnJheV9wdXRfcHRyKGZhLCBsZXZkYXR1bS0+bGV2ZWwtPnNlbnMgLSAxLCBrZXksCisJCQkJICAgICAgIEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKSkKKwkJCUJVRygpOwogCX0KIAogCXJldHVybiAwOwpAQCAtMzU1LDYgKzM4Miw3IEBACiB7CiAJc3RydWN0IHBvbGljeWRiICpwOwogCXN0cnVjdCBjYXRfZGF0dW0gKmNhdGRhdHVtOworCXN0cnVjdCBmbGV4X2FycmF5ICpmYTsKIAogCWNhdGRhdHVtID0gZGF0dW07CiAJcCA9IGRhdGFwOwpAQCAtMzYyLDcgKzM5MCwxMCBAQAogCWlmICghY2F0ZGF0dW0tPmlzYWxpYXMpIHsKIAkJaWYgKCFjYXRkYXR1bS0+dmFsdWUgfHwgY2F0ZGF0dW0tPnZhbHVlID4gcC0+cF9jYXRzLm5wcmltKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXAtPnBfY2F0X3ZhbF90b19uYW1lW2NhdGRhdHVtLT52YWx1ZSAtIDFdID0ga2V5OworCQlmYSA9IHAtPnN5bV92YWxfdG9fbmFtZVtTWU1fQ0FUU107CisJCWlmIChmbGV4X2FycmF5X3B1dF9wdHIoZmEsIGNhdGRhdHVtLT52YWx1ZSAtIDEsIGtleSwKKwkJCQkgICAgICAgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8pKQorCQkJQlVHKCk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0zODAsNDcgKzQxMSw2IEBACiAJY2F0X2luZGV4LAogfTsKIAotLyoKLSAqIERlZmluZSB0aGUgY29tbW9uIHZhbF90b19uYW1lIGFycmF5IGFuZCB0aGUgY2xhc3MKLSAqIHZhbF90b19uYW1lIGFuZCB2YWxfdG9fc3RydWN0IGFycmF5cyBpbiBhIHBvbGljeQotICogZGF0YWJhc2Ugc3RydWN0dXJlLgotICoKLSAqIENhbGxlciBtdXN0IGNsZWFuIHVwIHVwb24gZmFpbHVyZS4KLSAqLwotc3RhdGljIGludCBwb2xpY3lkYl9pbmRleF9jbGFzc2VzKHN0cnVjdCBwb2xpY3lkYiAqcCkKLXsKLQlpbnQgcmM7Ci0KLQlwLT5wX2NvbW1vbl92YWxfdG9fbmFtZSA9Ci0JCWttYWxsb2MocC0+cF9jb21tb25zLm5wcmltICogc2l6ZW9mKGNoYXIgKiksIEdGUF9LRVJORUwpOwotCWlmICghcC0+cF9jb21tb25fdmFsX3RvX25hbWUpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlyYyA9IGhhc2h0YWJfbWFwKHAtPnBfY29tbW9ucy50YWJsZSwgY29tbW9uX2luZGV4LCBwKTsKLQlpZiAocmMpCi0JCWdvdG8gb3V0OwotCi0JcC0+Y2xhc3NfdmFsX3RvX3N0cnVjdCA9Ci0JCWttYWxsb2MocC0+cF9jbGFzc2VzLm5wcmltICogc2l6ZW9mKCoocC0+Y2xhc3NfdmFsX3RvX3N0cnVjdCkpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXAtPmNsYXNzX3ZhbF90b19zdHJ1Y3QpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlwLT5wX2NsYXNzX3ZhbF90b19uYW1lID0KLQkJa21hbGxvYyhwLT5wX2NsYXNzZXMubnByaW0gKiBzaXplb2YoY2hhciAqKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwLT5wX2NsYXNzX3ZhbF90b19uYW1lKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcmMgPSBoYXNodGFiX21hcChwLT5wX2NsYXNzZXMudGFibGUsIGNsYXNzX2luZGV4LCBwKTsKLW91dDoKLQlyZXR1cm4gcmM7Ci19Ci0KICNpZmRlZiBERUJVR19IQVNIRVMKIHN0YXRpYyB2b2lkIHN5bXRhYl9oYXNoX2V2YWwoc3RydWN0IHN5bXRhYiAqcykKIHsKQEAgLTQ1OCw5ICs0NDgsOSBAQAogICoKICAqIENhbGxlciBtdXN0IGNsZWFuIHVwIG9uIGZhaWx1cmUuCiAgKi8KLXN0YXRpYyBpbnQgcG9saWN5ZGJfaW5kZXhfb3RoZXJzKHN0cnVjdCBwb2xpY3lkYiAqcCkKK3N0YXRpYyBpbnQgcG9saWN5ZGJfaW5kZXgoc3RydWN0IHBvbGljeWRiICpwKQogewotCWludCBpLCByYyA9IDA7CisJaW50IGksIHJjOwogCiAJcHJpbnRrKEtFUk5fREVCVUcgIlNFTGludXg6ICAlZCB1c2VycywgJWQgcm9sZXMsICVkIHR5cGVzLCAlZCBib29scyIsCiAJICAgICAgIHAtPnBfdXNlcnMubnByaW0sIHAtPnBfcm9sZXMubnByaW0sIHAtPnBfdHlwZXMubnByaW0sIHAtPnBfYm9vbHMubnByaW0pOwpAQCAtNDc3LDQ3ICs0NjcsNjMgQEAKIAlzeW10YWJfaGFzaF9ldmFsKHAtPnN5bXRhYik7CiAjZW5kaWYKIAorCXJjID0gLUVOT01FTTsKKwlwLT5jbGFzc192YWxfdG9fc3RydWN0ID0KKwkJa21hbGxvYyhwLT5wX2NsYXNzZXMubnByaW0gKiBzaXplb2YoKihwLT5jbGFzc192YWxfdG9fc3RydWN0KSksCisJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIXAtPmNsYXNzX3ZhbF90b19zdHJ1Y3QpCisJCWdvdG8gb3V0OworCisJcmMgPSAtRU5PTUVNOwogCXAtPnJvbGVfdmFsX3RvX3N0cnVjdCA9CiAJCWttYWxsb2MocC0+cF9yb2xlcy5ucHJpbSAqIHNpemVvZigqKHAtPnJvbGVfdmFsX3RvX3N0cnVjdCkpLAogCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwLT5yb2xlX3ZhbF90b19zdHJ1Y3QpIHsKLQkJcmMgPSAtRU5PTUVNOworCWlmICghcC0+cm9sZV92YWxfdG9fc3RydWN0KQogCQlnb3RvIG91dDsKLQl9CiAKKwlyYyA9IC1FTk9NRU07CiAJcC0+dXNlcl92YWxfdG9fc3RydWN0ID0KIAkJa21hbGxvYyhwLT5wX3VzZXJzLm5wcmltICogc2l6ZW9mKCoocC0+dXNlcl92YWxfdG9fc3RydWN0KSksCiAJCQlHRlBfS0VSTkVMKTsKLQlpZiAoIXAtPnVzZXJfdmFsX3RvX3N0cnVjdCkgewotCQlyYyA9IC1FTk9NRU07CisJaWYgKCFwLT51c2VyX3ZhbF90b19zdHJ1Y3QpCiAJCWdvdG8gb3V0OwotCX0KIAotCXAtPnR5cGVfdmFsX3RvX3N0cnVjdCA9Ci0JCWttYWxsb2MocC0+cF90eXBlcy5ucHJpbSAqIHNpemVvZigqKHAtPnR5cGVfdmFsX3RvX3N0cnVjdCkpLAotCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwLT50eXBlX3ZhbF90b19zdHJ1Y3QpIHsKLQkJcmMgPSAtRU5PTUVNOworCS8qIFllcywgSSB3YW50IHRoZSBzaXplb2YgdGhlIHBvaW50ZXIsIG5vdCB0aGUgc3RydWN0dXJlICovCisJcmMgPSAtRU5PTUVNOworCXAtPnR5cGVfdmFsX3RvX3N0cnVjdF9hcnJheSA9IGZsZXhfYXJyYXlfYWxsb2Moc2l6ZW9mKHN0cnVjdCB0eXBlX2RhdHVtICopLAorCQkJCQkJICAgICAgIHAtPnBfdHlwZXMubnByaW0sCisJCQkJCQkgICAgICAgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8pOworCWlmICghcC0+dHlwZV92YWxfdG9fc3RydWN0X2FycmF5KQogCQlnb3RvIG91dDsKLQl9CiAKLQlpZiAoY29uZF9pbml0X2Jvb2xfaW5kZXhlcyhwKSkgewotCQlyYyA9IC1FTk9NRU07CisJcmMgPSBmbGV4X2FycmF5X3ByZWFsbG9jKHAtPnR5cGVfdmFsX3RvX3N0cnVjdF9hcnJheSwgMCwKKwkJCQkgcC0+cF90eXBlcy5ucHJpbSAtIDEsIEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKTsKKwlpZiAocmMpCiAJCWdvdG8gb3V0OwotCX0KIAotCWZvciAoaSA9IFNZTV9ST0xFUzsgaSA8IFNZTV9OVU07IGkrKykgewotCQlwLT5zeW1fdmFsX3RvX25hbWVbaV0gPQotCQkJa21hbGxvYyhwLT5zeW10YWJbaV0ubnByaW0gKiBzaXplb2YoY2hhciAqKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcC0+c3ltX3ZhbF90b19uYW1lW2ldKSB7Ci0JCQlyYyA9IC1FTk9NRU07CisJcmMgPSAtRU5PTUVNOworCWlmIChjb25kX2luaXRfYm9vbF9pbmRleGVzKHApKQorCQlnb3RvIG91dDsKKworCWZvciAoaSA9IDA7IGkgPCBTWU1fTlVNOyBpKyspIHsKKwkJcmMgPSAtRU5PTUVNOworCQlwLT5zeW1fdmFsX3RvX25hbWVbaV0gPSBmbGV4X2FycmF5X2FsbG9jKHNpemVvZihjaGFyICopLAorCQkJCQkJCSBwLT5zeW10YWJbaV0ubnByaW0sCisJCQkJCQkJIEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKTsKKwkJaWYgKCFwLT5zeW1fdmFsX3RvX25hbWVbaV0pCiAJCQlnb3RvIG91dDsKLQkJfQorCisJCXJjID0gZmxleF9hcnJheV9wcmVhbGxvYyhwLT5zeW1fdmFsX3RvX25hbWVbaV0sCisJCQkJCSAwLCBwLT5zeW10YWJbaV0ubnByaW0gLSAxLAorCQkJCQkgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8pOworCQlpZiAocmMpCisJCQlnb3RvIG91dDsKKwogCQlyYyA9IGhhc2h0YWJfbWFwKHAtPnN5bXRhYltpXS50YWJsZSwgaW5kZXhfZltpXSwgcCk7CiAJCWlmIChyYykKIAkJCWdvdG8gb3V0OwogCX0KLQorCXJjID0gMDsKIG91dDoKIAlyZXR1cm4gcmM7CiB9CkBAIC01NDAsOSArNTQ2LDExIEBACiAJc3RydWN0IGNvbW1vbl9kYXR1bSAqY29tZGF0dW07CiAKIAlrZnJlZShrZXkpOwotCWNvbWRhdHVtID0gZGF0dW07Ci0JaGFzaHRhYl9tYXAoY29tZGF0dW0tPnBlcm1pc3Npb25zLnRhYmxlLCBwZXJtX2Rlc3Ryb3ksIE5VTEwpOwotCWhhc2h0YWJfZGVzdHJveShjb21kYXR1bS0+cGVybWlzc2lvbnMudGFibGUpOworCWlmIChkYXR1bSkgeworCQljb21kYXR1bSA9IGRhdHVtOworCQloYXNodGFiX21hcChjb21kYXR1bS0+cGVybWlzc2lvbnMudGFibGUsIHBlcm1fZGVzdHJveSwgTlVMTCk7CisJCWhhc2h0YWJfZGVzdHJveShjb21kYXR1bS0+cGVybWlzc2lvbnMudGFibGUpOworCX0KIAlrZnJlZShkYXR1bSk7CiAJcmV0dXJuIDA7CiB9CkBAIC01NTQsMzggKzU2Miw0MCBAQAogCXN0cnVjdCBjb25zdHJhaW50X2V4cHIgKmUsICpldG1wOwogCiAJa2ZyZWUoa2V5KTsKLQljbGFkYXR1bSA9IGRhdHVtOwotCWhhc2h0YWJfbWFwKGNsYWRhdHVtLT5wZXJtaXNzaW9ucy50YWJsZSwgcGVybV9kZXN0cm95LCBOVUxMKTsKLQloYXNodGFiX2Rlc3Ryb3koY2xhZGF0dW0tPnBlcm1pc3Npb25zLnRhYmxlKTsKLQljb25zdHJhaW50ID0gY2xhZGF0dW0tPmNvbnN0cmFpbnRzOwotCXdoaWxlIChjb25zdHJhaW50KSB7Ci0JCWUgPSBjb25zdHJhaW50LT5leHByOwotCQl3aGlsZSAoZSkgewotCQkJZWJpdG1hcF9kZXN0cm95KCZlLT5uYW1lcyk7Ci0JCQlldG1wID0gZTsKLQkJCWUgPSBlLT5uZXh0OwotCQkJa2ZyZWUoZXRtcCk7CisJaWYgKGRhdHVtKSB7CisJCWNsYWRhdHVtID0gZGF0dW07CisJCWhhc2h0YWJfbWFwKGNsYWRhdHVtLT5wZXJtaXNzaW9ucy50YWJsZSwgcGVybV9kZXN0cm95LCBOVUxMKTsKKwkJaGFzaHRhYl9kZXN0cm95KGNsYWRhdHVtLT5wZXJtaXNzaW9ucy50YWJsZSk7CisJCWNvbnN0cmFpbnQgPSBjbGFkYXR1bS0+Y29uc3RyYWludHM7CisJCXdoaWxlIChjb25zdHJhaW50KSB7CisJCQllID0gY29uc3RyYWludC0+ZXhwcjsKKwkJCXdoaWxlIChlKSB7CisJCQkJZWJpdG1hcF9kZXN0cm95KCZlLT5uYW1lcyk7CisJCQkJZXRtcCA9IGU7CisJCQkJZSA9IGUtPm5leHQ7CisJCQkJa2ZyZWUoZXRtcCk7CisJCQl9CisJCQljdGVtcCA9IGNvbnN0cmFpbnQ7CisJCQljb25zdHJhaW50ID0gY29uc3RyYWludC0+bmV4dDsKKwkJCWtmcmVlKGN0ZW1wKTsKIAkJfQotCQljdGVtcCA9IGNvbnN0cmFpbnQ7Ci0JCWNvbnN0cmFpbnQgPSBjb25zdHJhaW50LT5uZXh0OwotCQlrZnJlZShjdGVtcCk7Ci0JfQogCi0JY29uc3RyYWludCA9IGNsYWRhdHVtLT52YWxpZGF0ZXRyYW5zOwotCXdoaWxlIChjb25zdHJhaW50KSB7Ci0JCWUgPSBjb25zdHJhaW50LT5leHByOwotCQl3aGlsZSAoZSkgewotCQkJZWJpdG1hcF9kZXN0cm95KCZlLT5uYW1lcyk7Ci0JCQlldG1wID0gZTsKLQkJCWUgPSBlLT5uZXh0OwotCQkJa2ZyZWUoZXRtcCk7CisJCWNvbnN0cmFpbnQgPSBjbGFkYXR1bS0+dmFsaWRhdGV0cmFuczsKKwkJd2hpbGUgKGNvbnN0cmFpbnQpIHsKKwkJCWUgPSBjb25zdHJhaW50LT5leHByOworCQkJd2hpbGUgKGUpIHsKKwkJCQllYml0bWFwX2Rlc3Ryb3koJmUtPm5hbWVzKTsKKwkJCQlldG1wID0gZTsKKwkJCQllID0gZS0+bmV4dDsKKwkJCQlrZnJlZShldG1wKTsKKwkJCX0KKwkJCWN0ZW1wID0gY29uc3RyYWludDsKKwkJCWNvbnN0cmFpbnQgPSBjb25zdHJhaW50LT5uZXh0OworCQkJa2ZyZWUoY3RlbXApOwogCQl9Ci0JCWN0ZW1wID0gY29uc3RyYWludDsKLQkJY29uc3RyYWludCA9IGNvbnN0cmFpbnQtPm5leHQ7Ci0JCWtmcmVlKGN0ZW1wKTsKLQl9CiAKLQlrZnJlZShjbGFkYXR1bS0+Y29ta2V5KTsKKwkJa2ZyZWUoY2xhZGF0dW0tPmNvbWtleSk7CisJfQogCWtmcmVlKGRhdHVtKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTU5NSw5ICs2MDUsMTEgQEAKIAlzdHJ1Y3Qgcm9sZV9kYXR1bSAqcm9sZTsKIAogCWtmcmVlKGtleSk7Ci0Jcm9sZSA9IGRhdHVtOwotCWViaXRtYXBfZGVzdHJveSgmcm9sZS0+ZG9taW5hdGVzKTsKLQllYml0bWFwX2Rlc3Ryb3koJnJvbGUtPnR5cGVzKTsKKwlpZiAoZGF0dW0pIHsKKwkJcm9sZSA9IGRhdHVtOworCQllYml0bWFwX2Rlc3Ryb3koJnJvbGUtPmRvbWluYXRlcyk7CisJCWViaXRtYXBfZGVzdHJveSgmcm9sZS0+dHlwZXMpOworCX0KIAlrZnJlZShkYXR1bSk7CiAJcmV0dXJuIDA7CiB9CkBAIC02MTQsMTEgKzYyNiwxMyBAQAogCXN0cnVjdCB1c2VyX2RhdHVtICp1c3JkYXR1bTsKIAogCWtmcmVlKGtleSk7Ci0JdXNyZGF0dW0gPSBkYXR1bTsKLQllYml0bWFwX2Rlc3Ryb3koJnVzcmRhdHVtLT5yb2xlcyk7Ci0JZWJpdG1hcF9kZXN0cm95KCZ1c3JkYXR1bS0+cmFuZ2UubGV2ZWxbMF0uY2F0KTsKLQllYml0bWFwX2Rlc3Ryb3koJnVzcmRhdHVtLT5yYW5nZS5sZXZlbFsxXS5jYXQpOwotCWViaXRtYXBfZGVzdHJveSgmdXNyZGF0dW0tPmRmbHRsZXZlbC5jYXQpOworCWlmIChkYXR1bSkgeworCQl1c3JkYXR1bSA9IGRhdHVtOworCQllYml0bWFwX2Rlc3Ryb3koJnVzcmRhdHVtLT5yb2xlcyk7CisJCWViaXRtYXBfZGVzdHJveSgmdXNyZGF0dW0tPnJhbmdlLmxldmVsWzBdLmNhdCk7CisJCWViaXRtYXBfZGVzdHJveSgmdXNyZGF0dW0tPnJhbmdlLmxldmVsWzFdLmNhdCk7CisJCWViaXRtYXBfZGVzdHJveSgmdXNyZGF0dW0tPmRmbHRsZXZlbC5jYXQpOworCX0KIAlrZnJlZShkYXR1bSk7CiAJcmV0dXJuIDA7CiB9CkBAIC02MjgsOSArNjQyLDExIEBACiAJc3RydWN0IGxldmVsX2RhdHVtICpsZXZkYXR1bTsKIAogCWtmcmVlKGtleSk7Ci0JbGV2ZGF0dW0gPSBkYXR1bTsKLQllYml0bWFwX2Rlc3Ryb3koJmxldmRhdHVtLT5sZXZlbC0+Y2F0KTsKLQlrZnJlZShsZXZkYXR1bS0+bGV2ZWwpOworCWlmIChkYXR1bSkgeworCQlsZXZkYXR1bSA9IGRhdHVtOworCQllYml0bWFwX2Rlc3Ryb3koJmxldmRhdHVtLT5sZXZlbC0+Y2F0KTsKKwkJa2ZyZWUobGV2ZGF0dW0tPmxldmVsKTsKKwl9CiAJa2ZyZWUoZGF0dW0pOwogCXJldHVybiAwOwogfQpAQCAtNjk1LDEzICs3MTEsMTYgQEAKIAkJaGFzaHRhYl9kZXN0cm95KHAtPnN5bXRhYltpXS50YWJsZSk7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IFNZTV9OVU07IGkrKykKLQkJa2ZyZWUocC0+c3ltX3ZhbF90b19uYW1lW2ldKTsKKwlmb3IgKGkgPSAwOyBpIDwgU1lNX05VTTsgaSsrKSB7CisJCWlmIChwLT5zeW1fdmFsX3RvX25hbWVbaV0pCisJCQlmbGV4X2FycmF5X2ZyZWUocC0+c3ltX3ZhbF90b19uYW1lW2ldKTsKKwl9CiAKIAlrZnJlZShwLT5jbGFzc192YWxfdG9fc3RydWN0KTsKIAlrZnJlZShwLT5yb2xlX3ZhbF90b19zdHJ1Y3QpOwogCWtmcmVlKHAtPnVzZXJfdmFsX3RvX3N0cnVjdCk7Ci0Ja2ZyZWUocC0+dHlwZV92YWxfdG9fc3RydWN0KTsKKwlpZiAocC0+dHlwZV92YWxfdG9fc3RydWN0X2FycmF5KQorCQlmbGV4X2FycmF5X2ZyZWUocC0+dHlwZV92YWxfdG9fc3RydWN0X2FycmF5KTsKIAogCWF2dGFiX2Rlc3Ryb3koJnAtPnRlX2F2dGFiKTsKIApAQCAtNzg1LDE5ICs4MDQsMjEgQEAKIAogCWhlYWQgPSBwLT5vY29udGV4dHNbT0NPTl9JU0lEXTsKIAlmb3IgKGMgPSBoZWFkOyBjOyBjID0gYy0+bmV4dCkgeworCQlyYyA9IC1FSU5WQUw7CiAJCWlmICghYy0+Y29udGV4dFswXS51c2VyKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6ICBTSUQgJXMgd2FzIG5ldmVyICIKLQkJCSAgICAgICAiZGVmaW5lZC5cbiIsIGMtPnUubmFtZSk7Ci0JCQlyYyA9IC1FSU5WQUw7CisJCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6ICBTSUQgJXMgd2FzIG5ldmVyIGRlZmluZWQuXG4iLAorCQkJCWMtPnUubmFtZSk7CiAJCQlnb3RvIG91dDsKIAkJfQotCQlpZiAoc2lkdGFiX2luc2VydChzLCBjLT5zaWRbMF0sICZjLT5jb250ZXh0WzBdKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiAgdW5hYmxlIHRvIGxvYWQgaW5pdGlhbCAiCi0JCQkgICAgICAgIlNJRCAlcy5cbiIsIGMtPnUubmFtZSk7Ci0JCQlyYyA9IC1FSU5WQUw7CisKKwkJcmMgPSBzaWR0YWJfaW5zZXJ0KHMsIGMtPnNpZFswXSwgJmMtPmNvbnRleHRbMF0pOworCQlpZiAocmMpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogIHVuYWJsZSB0byBsb2FkIGluaXRpYWwgU0lEICVzLlxuIiwKKwkJCQljLT51Lm5hbWUpOwogCQkJZ290byBvdXQ7CiAJCX0KIAl9CisJcmMgPSAwOwogb3V0OgogCXJldHVybiByYzsKIH0KQEAgLTg0Niw4ICs4NjcsNyBAQAogCQkgKiBSb2xlIG11c3QgYmUgYXV0aG9yaXplZCBmb3IgdGhlIHR5cGUuCiAJCSAqLwogCQlyb2xlID0gcC0+cm9sZV92YWxfdG9fc3RydWN0W2MtPnJvbGUgLSAxXTsKLQkJaWYgKCFlYml0bWFwX2dldF9iaXQoJnJvbGUtPnR5cGVzLAotCQkJCSAgICAgYy0+dHlwZSAtIDEpKQorCQlpZiAoIWViaXRtYXBfZ2V0X2JpdCgmcm9sZS0+dHlwZXMsIGMtPnR5cGUgLSAxKSkKIAkJCS8qIHJvbGUgbWF5IG5vdCBiZSBhc3NvY2lhdGVkIHdpdGggdHlwZSAqLwogCQkJcmV0dXJuIDA7CiAKQEAgLTg1OCw4ICs4NzgsNyBAQAogCQlpZiAoIXVzcmRhdHVtKQogCQkJcmV0dXJuIDA7CiAKLQkJaWYgKCFlYml0bWFwX2dldF9iaXQoJnVzcmRhdHVtLT5yb2xlcywKLQkJCQkgICAgIGMtPnJvbGUgLSAxKSkKKwkJaWYgKCFlYml0bWFwX2dldF9iaXQoJnVzcmRhdHVtLT5yb2xlcywgYy0+cm9sZSAtIDEpKQogCQkJLyogdXNlciBtYXkgbm90IGJlIGFzc29jaWF0ZWQgd2l0aCByb2xlICovCiAJCQlyZXR1cm4gMDsKIAl9CkBAIC04ODEsMjAgKzkwMCwyMiBAQAogCWludCByYzsKIAogCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCBzaXplb2YodTMyKSk7Ci0JaWYgKHJjIDwgMCkKKwlpZiAocmMpCiAJCWdvdG8gb3V0OwogCisJcmMgPSAtRUlOVkFMOwogCWl0ZW1zID0gbGUzMl90b19jcHUoYnVmWzBdKTsKIAlpZiAoaXRlbXMgPiBBUlJBWV9TSVpFKGJ1ZikpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiBtbHM6ICByYW5nZSBvdmVyZmxvd1xuIik7Ci0JCXJjID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CiAJfQorCiAJcmMgPSBuZXh0X2VudHJ5KGJ1ZiwgZnAsIHNpemVvZih1MzIpICogaXRlbXMpOwotCWlmIChyYyA8IDApIHsKKwlpZiAocmMpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiBtbHM6ICB0cnVuY2F0ZWQgcmFuZ2VcbiIpOwogCQlnb3RvIG91dDsKIAl9CisKIAlyLT5sZXZlbFswXS5zZW5zID0gbGUzMl90b19jcHUoYnVmWzBdKTsKIAlpZiAoaXRlbXMgPiAxKQogCQlyLT5sZXZlbFsxXS5zZW5zID0gbGUzMl90b19jcHUoYnVmWzFdKTsKQEAgLTkwMywxNSArOTI0LDEzIEBACiAKIAlyYyA9IGViaXRtYXBfcmVhZCgmci0+bGV2ZWxbMF0uY2F0LCBmcCk7CiAJaWYgKHJjKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogbWxzOiAgZXJyb3IgcmVhZGluZyBsb3cgIgotCQkgICAgICAgImNhdGVnb3JpZXNcbiIpOworCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6IG1sczogIGVycm9yIHJlYWRpbmcgbG93IGNhdGVnb3JpZXNcbiIpOwogCQlnb3RvIG91dDsKIAl9CiAJaWYgKGl0ZW1zID4gMSkgewogCQlyYyA9IGViaXRtYXBfcmVhZCgmci0+bGV2ZWxbMV0uY2F0LCBmcCk7CiAJCWlmIChyYykgewotCQkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiBtbHM6ICBlcnJvciByZWFkaW5nIGhpZ2ggIgotCQkJICAgICAgICJjYXRlZ29yaWVzXG4iKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogbWxzOiAgZXJyb3IgcmVhZGluZyBoaWdoIGNhdGVnb3JpZXNcbiIpOwogCQkJZ290byBiYWRfaGlnaDsKIAkJfQogCX0gZWxzZSB7CkBAIC05MjIsMTIgKzk0MSwxMSBAQAogCQl9CiAJfQogCi0JcmMgPSAwOwotb3V0OgotCXJldHVybiByYzsKKwlyZXR1cm4gMDsKIGJhZF9oaWdoOgogCWViaXRtYXBfZGVzdHJveSgmci0+bGV2ZWxbMF0uY2F0KTsKLQlnb3RvIG91dDsKK291dDoKKwlyZXR1cm4gcmM7CiB9CiAKIC8qCkBAIC05NDIsNyArOTYwLDcgQEAKIAlpbnQgcmM7CiAKIAlyYyA9IG5leHRfZW50cnkoYnVmLCBmcCwgc2l6ZW9mIGJ1Zik7Ci0JaWYgKHJjIDwgMCkgeworCWlmIChyYykgewogCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6IGNvbnRleHQgdHJ1bmNhdGVkXG4iKTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtOTUwLDE5ICs5NjgsMjAgQEAKIAljLT5yb2xlID0gbGUzMl90b19jcHUoYnVmWzFdKTsKIAljLT50eXBlID0gbGUzMl90b19jcHUoYnVmWzJdKTsKIAlpZiAocC0+cG9saWN5dmVycyA+PSBQT0xJQ1lEQl9WRVJTSU9OX01MUykgewotCQlpZiAobWxzX3JlYWRfcmFuZ2VfaGVscGVyKCZjLT5yYW5nZSwgZnApKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6IGVycm9yIHJlYWRpbmcgTUxTIHJhbmdlIG9mICIKLQkJCSAgICAgICAiY29udGV4dFxuIik7Ci0JCQlyYyA9IC1FSU5WQUw7CisJCXJjID0gbWxzX3JlYWRfcmFuZ2VfaGVscGVyKCZjLT5yYW5nZSwgZnApOworCQlpZiAocmMpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogZXJyb3IgcmVhZGluZyBNTFMgcmFuZ2Ugb2YgY29udGV4dFxuIik7CiAJCQlnb3RvIG91dDsKIAkJfQogCX0KIAorCXJjID0gLUVJTlZBTDsKIAlpZiAoIXBvbGljeWRiX2NvbnRleHRfaXN2YWxpZChwLCBjKSkgewogCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6ICBpbnZhbGlkIHNlY3VyaXR5IGNvbnRleHRcbiIpOwogCQljb250ZXh0X2Rlc3Ryb3koYyk7Ci0JCXJjID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CiAJfQorCXJjID0gMDsKIG91dDoKIAlyZXR1cm4gcmM7CiB9CkBAIC05ODEsMzcgKzEwMDAsMzYgQEAKIAlfX2xlMzIgYnVmWzJdOwogCXUzMiBsZW47CiAKKwlyYyA9IC1FTk9NRU07CiAJcGVyZGF0dW0gPSBremFsbG9jKHNpemVvZigqcGVyZGF0dW0pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBlcmRhdHVtKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQorCWlmICghcGVyZGF0dW0pCisJCWdvdG8gYmFkOwogCiAJcmMgPSBuZXh0X2VudHJ5KGJ1ZiwgZnAsIHNpemVvZiBidWYpOwotCWlmIChyYyA8IDApCisJaWYgKHJjKQogCQlnb3RvIGJhZDsKIAogCWxlbiA9IGxlMzJfdG9fY3B1KGJ1ZlswXSk7CiAJcGVyZGF0dW0tPnZhbHVlID0gbGUzMl90b19jcHUoYnVmWzFdKTsKIAorCXJjID0gLUVOT01FTTsKIAlrZXkgPSBrbWFsbG9jKGxlbiArIDEsIEdGUF9LRVJORUwpOwotCWlmICgha2V5KSB7Ci0JCXJjID0gLUVOT01FTTsKKwlpZiAoIWtleSkKIAkJZ290byBiYWQ7Ci0JfQorCiAJcmMgPSBuZXh0X2VudHJ5KGtleSwgZnAsIGxlbik7Ci0JaWYgKHJjIDwgMCkKKwlpZiAocmMpCiAJCWdvdG8gYmFkOwogCWtleVtsZW5dID0gJ1wwJzsKIAogCXJjID0gaGFzaHRhYl9pbnNlcnQoaCwga2V5LCBwZXJkYXR1bSk7CiAJaWYgKHJjKQogCQlnb3RvIGJhZDsKLW91dDoKLQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gMDsKIGJhZDoKIAlwZXJtX2Rlc3Ryb3koa2V5LCBwZXJkYXR1bSwgTlVMTCk7Ci0JZ290byBvdXQ7CisJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgaW50IGNvbW1vbl9yZWFkKHN0cnVjdCBwb2xpY3lkYiAqcCwgc3RydWN0IGhhc2h0YWIgKmgsIHZvaWQgKmZwKQpAQCAtMTAyMiwxNCArMTA0MCwxMyBAQAogCXUzMiBsZW4sIG5lbDsKIAlpbnQgaSwgcmM7CiAKKwlyYyA9IC1FTk9NRU07CiAJY29tZGF0dW0gPSBremFsbG9jKHNpemVvZigqY29tZGF0dW0pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNvbWRhdHVtKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQorCWlmICghY29tZGF0dW0pCisJCWdvdG8gYmFkOwogCiAJcmMgPSBuZXh0X2VudHJ5KGJ1ZiwgZnAsIHNpemVvZiBidWYpOwotCWlmIChyYyA8IDApCisJaWYgKHJjKQogCQlnb3RvIGJhZDsKIAogCWxlbiA9IGxlMzJfdG9fY3B1KGJ1ZlswXSk7CkBAIC0xMDQxLDEzICsxMDU4LDEzIEBACiAJY29tZGF0dW0tPnBlcm1pc3Npb25zLm5wcmltID0gbGUzMl90b19jcHUoYnVmWzJdKTsKIAluZWwgPSBsZTMyX3RvX2NwdShidWZbM10pOwogCisJcmMgPSAtRU5PTUVNOwogCWtleSA9IGttYWxsb2MobGVuICsgMSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFrZXkpIHsKLQkJcmMgPSAtRU5PTUVNOworCWlmICgha2V5KQogCQlnb3RvIGJhZDsKLQl9CisKIAlyYyA9IG5leHRfZW50cnkoa2V5LCBmcCwgbGVuKTsKLQlpZiAocmMgPCAwKQorCWlmIChyYykKIAkJZ290byBiYWQ7CiAJa2V5W2xlbl0gPSAnXDAnOwogCkBAIC0xMDYwLDExICsxMDc3LDEwIEBACiAJcmMgPSBoYXNodGFiX2luc2VydChoLCBrZXksIGNvbWRhdHVtKTsKIAlpZiAocmMpCiAJCWdvdG8gYmFkOwotb3V0OgotCXJldHVybiByYzsKKwlyZXR1cm4gMDsKIGJhZDoKIAljb21tb25fZGVzdHJveShrZXksIGNvbWRhdHVtLCBOVUxMKTsKLQlnb3RvIG91dDsKKwlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyBpbnQgcmVhZF9jb25zX2hlbHBlcihzdHJ1Y3QgY29uc3RyYWludF9ub2RlICoqbm9kZXAsIGludCBuY29ucywKQEAgLTEwODgsNyArMTEwNCw3IEBACiAJCQkqbm9kZXAgPSBjOwogCiAJCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCAoc2l6ZW9mKHUzMikgKiAyKSk7Ci0JCWlmIChyYyA8IDApCisJCWlmIChyYykKIAkJCXJldHVybiByYzsKIAkJYy0+cGVybWlzc2lvbnMgPSBsZTMyX3RvX2NwdShidWZbMF0pOwogCQluZXhwciA9IGxlMzJfdG9fY3B1KGJ1ZlsxXSk7CkBAIC0xMTA1LDcgKzExMjEsNyBAQAogCQkJCWMtPmV4cHIgPSBlOwogCiAJCQlyYyA9IG5leHRfZW50cnkoYnVmLCBmcCwgKHNpemVvZih1MzIpICogMykpOwotCQkJaWYgKHJjIDwgMCkKKwkJCWlmIChyYykKIAkJCQlyZXR1cm4gcmM7CiAJCQllLT5leHByX3R5cGUgPSBsZTMyX3RvX2NwdShidWZbMF0pOwogCQkJZS0+YXR0ciA9IGxlMzJfdG9fY3B1KGJ1ZlsxXSk7CkBAIC0xMTMzLDggKzExNDksOSBAQAogCQkJCWlmIChkZXB0aCA9PSAoQ0VYUFJfTUFYREVQVEggLSAxKSkKIAkJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQkJZGVwdGgrKzsKLQkJCQlpZiAoZWJpdG1hcF9yZWFkKCZlLT5uYW1lcywgZnApKQotCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQlyYyA9IGViaXRtYXBfcmVhZCgmZS0+bmFtZXMsIGZwKTsKKwkJCQlpZiAocmMpCisJCQkJCXJldHVybiByYzsKIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6CiAJCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMTU3LDE0ICsxMTc0LDEzIEBACiAJdTMyIGxlbiwgbGVuMiwgbmNvbnMsIG5lbDsKIAlpbnQgaSwgcmM7CiAKKwlyYyA9IC1FTk9NRU07CiAJY2xhZGF0dW0gPSBremFsbG9jKHNpemVvZigqY2xhZGF0dW0pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNsYWRhdHVtKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQorCWlmICghY2xhZGF0dW0pCisJCWdvdG8gYmFkOwogCiAJcmMgPSBuZXh0X2VudHJ5KGJ1ZiwgZnAsIHNpemVvZih1MzIpKjYpOwotCWlmIChyYyA8IDApCisJaWYgKHJjKQogCQlnb3RvIGJhZDsKIAogCWxlbiA9IGxlMzJfdG9fY3B1KGJ1ZlswXSk7CkBAIC0xMTc5LDMzICsxMTk1LDMwIEBACiAKIAluY29ucyA9IGxlMzJfdG9fY3B1KGJ1Zls1XSk7CiAKKwlyYyA9IC1FTk9NRU07CiAJa2V5ID0ga21hbGxvYyhsZW4gKyAxLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWtleSkgewotCQlyYyA9IC1FTk9NRU07CisJaWYgKCFrZXkpCiAJCWdvdG8gYmFkOwotCX0KKwogCXJjID0gbmV4dF9lbnRyeShrZXksIGZwLCBsZW4pOwotCWlmIChyYyA8IDApCisJaWYgKHJjKQogCQlnb3RvIGJhZDsKIAlrZXlbbGVuXSA9ICdcMCc7CiAKIAlpZiAobGVuMikgeworCQlyYyA9IC1FTk9NRU07CiAJCWNsYWRhdHVtLT5jb21rZXkgPSBrbWFsbG9jKGxlbjIgKyAxLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFjbGFkYXR1bS0+Y29ta2V5KSB7Ci0JCQlyYyA9IC1FTk9NRU07CisJCWlmICghY2xhZGF0dW0tPmNvbWtleSkKIAkJCWdvdG8gYmFkOwotCQl9CiAJCXJjID0gbmV4dF9lbnRyeShjbGFkYXR1bS0+Y29ta2V5LCBmcCwgbGVuMik7Ci0JCWlmIChyYyA8IDApCisJCWlmIChyYykKIAkJCWdvdG8gYmFkOwogCQljbGFkYXR1bS0+Y29ta2V5W2xlbjJdID0gJ1wwJzsKIAotCQljbGFkYXR1bS0+Y29tZGF0dW0gPSBoYXNodGFiX3NlYXJjaChwLT5wX2NvbW1vbnMudGFibGUsCi0JCQkJCQkgICAgY2xhZGF0dW0tPmNvbWtleSk7CisJCXJjID0gLUVJTlZBTDsKKwkJY2xhZGF0dW0tPmNvbWRhdHVtID0gaGFzaHRhYl9zZWFyY2gocC0+cF9jb21tb25zLnRhYmxlLCBjbGFkYXR1bS0+Y29ta2V5KTsKIAkJaWYgKCFjbGFkYXR1bS0+Y29tZGF0dW0pIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogIHVua25vd24gY29tbW9uICVzXG4iLAotCQkJICAgICAgIGNsYWRhdHVtLT5jb21rZXkpOwotCQkJcmMgPSAtRUlOVkFMOworCQkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiAgdW5rbm93biBjb21tb24gJXNcbiIsIGNsYWRhdHVtLT5jb21rZXkpOwogCQkJZ290byBiYWQ7CiAJCX0KIAl9CkBAIC0xMjIyLDcgKzEyMzUsNyBAQAogCWlmIChwLT5wb2xpY3l2ZXJzID49IFBPTElDWURCX1ZFUlNJT05fVkFMSURBVEVUUkFOUykgewogCQkvKiBncmFiIHRoZSB2YWxpZGF0ZXRyYW5zIHJ1bGVzICovCiAJCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCBzaXplb2YodTMyKSk7Ci0JCWlmIChyYyA8IDApCisJCWlmIChyYykKIAkJCWdvdG8gYmFkOwogCQluY29ucyA9IGxlMzJfdG9fY3B1KGJ1ZlswXSk7CiAJCXJjID0gcmVhZF9jb25zX2hlbHBlcigmY2xhZGF0dW0tPnZhbGlkYXRldHJhbnMsIG5jb25zLCAxLCBmcCk7CkBAIC0xMjM0LDEyICsxMjQ3LDEwIEBACiAJaWYgKHJjKQogCQlnb3RvIGJhZDsKIAotCXJjID0gMDsKLW91dDoKLQlyZXR1cm4gcmM7CisJcmV0dXJuIDA7CiBiYWQ6CiAJY2xzX2Rlc3Ryb3koa2V5LCBjbGFkYXR1bSwgTlVMTCk7Ci0JZ290byBvdXQ7CisJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgaW50IHJvbGVfcmVhZChzdHJ1Y3QgcG9saWN5ZGIgKnAsIHN0cnVjdCBoYXNodGFiICpoLCB2b2lkICpmcCkKQEAgLTEyNTAsMTcgKzEyNjEsMTYgQEAKIAlfX2xlMzIgYnVmWzNdOwogCXUzMiBsZW47CiAKKwlyYyA9IC1FTk9NRU07CiAJcm9sZSA9IGt6YWxsb2Moc2l6ZW9mKCpyb2xlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyb2xlKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQorCWlmICghcm9sZSkKKwkJZ290byBiYWQ7CiAKIAlpZiAocC0+cG9saWN5dmVycyA+PSBQT0xJQ1lEQl9WRVJTSU9OX0JPVU5EQVJZKQogCQl0b19yZWFkID0gMzsKIAogCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCBzaXplb2YoYnVmWzBdKSAqIHRvX3JlYWQpOwotCWlmIChyYyA8IDApCisJaWYgKHJjKQogCQlnb3RvIGJhZDsKIAogCWxlbiA9IGxlMzJfdG9fY3B1KGJ1ZlswXSk7CkBAIC0xMjY4LDEzICsxMjc4LDEzIEBACiAJaWYgKHAtPnBvbGljeXZlcnMgPj0gUE9MSUNZREJfVkVSU0lPTl9CT1VOREFSWSkKIAkJcm9sZS0+Ym91bmRzID0gbGUzMl90b19jcHUoYnVmWzJdKTsKIAorCXJjID0gLUVOT01FTTsKIAlrZXkgPSBrbWFsbG9jKGxlbiArIDEsIEdGUF9LRVJORUwpOwotCWlmICgha2V5KSB7Ci0JCXJjID0gLUVOT01FTTsKKwlpZiAoIWtleSkKIAkJZ290byBiYWQ7Ci0JfQorCiAJcmMgPSBuZXh0X2VudHJ5KGtleSwgZnAsIGxlbik7Ci0JaWYgKHJjIDwgMCkKKwlpZiAocmMpCiAJCWdvdG8gYmFkOwogCWtleVtsZW5dID0gJ1wwJzsKIApAQCAtMTI4NywxMCArMTI5NywxMCBAQAogCQlnb3RvIGJhZDsKIAogCWlmIChzdHJjbXAoa2V5LCBPQkpFQ1RfUikgPT0gMCkgeworCQlyYyA9IC1FSU5WQUw7CiAJCWlmIChyb2xlLT52YWx1ZSAhPSBPQkpFQ1RfUl9WQUwpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogUm9sZSAlcyBoYXMgd3JvbmcgdmFsdWUgJWRcbiIsCiAJCQkgICAgICAgT0JKRUNUX1IsIHJvbGUtPnZhbHVlKTsKLQkJCXJjID0gLUVJTlZBTDsKIAkJCWdvdG8gYmFkOwogCQl9CiAJCXJjID0gMDsKQEAgLTEzMDAsMTEgKzEzMTAsMTAgQEAKIAlyYyA9IGhhc2h0YWJfaW5zZXJ0KGgsIGtleSwgcm9sZSk7CiAJaWYgKHJjKQogCQlnb3RvIGJhZDsKLW91dDoKLQlyZXR1cm4gcmM7CisJcmV0dXJuIDA7CiBiYWQ6CiAJcm9sZV9kZXN0cm95KGtleSwgcm9sZSwgTlVMTCk7Ci0JZ290byBvdXQ7CisJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgaW50IHR5cGVfcmVhZChzdHJ1Y3QgcG9saWN5ZGIgKnAsIHN0cnVjdCBoYXNodGFiICpoLCB2b2lkICpmcCkKQEAgLTEzMTUsMTcgKzEzMjQsMTYgQEAKIAlfX2xlMzIgYnVmWzRdOwogCXUzMiBsZW47CiAKKwlyYyA9IC1FTk9NRU07CiAJdHlwZGF0dW0gPSBremFsbG9jKHNpemVvZigqdHlwZGF0dW0pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXR5cGRhdHVtKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJcmV0dXJuIHJjOwotCX0KKwlpZiAoIXR5cGRhdHVtKQorCQlnb3RvIGJhZDsKIAogCWlmIChwLT5wb2xpY3l2ZXJzID49IFBPTElDWURCX1ZFUlNJT05fQk9VTkRBUlkpCiAJCXRvX3JlYWQgPSA0OwogCiAJcmMgPSBuZXh0X2VudHJ5KGJ1ZiwgZnAsIHNpemVvZihidWZbMF0pICogdG9fcmVhZCk7Ci0JaWYgKHJjIDwgMCkKKwlpZiAocmMpCiAJCWdvdG8gYmFkOwogCiAJbGVuID0gbGUzMl90b19jcHUoYnVmWzBdKTsKQEAgLTEzNDMsMjQgKzEzNTEsMjIgQEAKIAkJdHlwZGF0dW0tPnByaW1hcnkgPSBsZTMyX3RvX2NwdShidWZbMl0pOwogCX0KIAorCXJjID0gLUVOT01FTTsKIAlrZXkgPSBrbWFsbG9jKGxlbiArIDEsIEdGUF9LRVJORUwpOwotCWlmICgha2V5KSB7Ci0JCXJjID0gLUVOT01FTTsKKwlpZiAoIWtleSkKIAkJZ290byBiYWQ7Ci0JfQogCXJjID0gbmV4dF9lbnRyeShrZXksIGZwLCBsZW4pOwotCWlmIChyYyA8IDApCisJaWYgKHJjKQogCQlnb3RvIGJhZDsKIAlrZXlbbGVuXSA9ICdcMCc7CiAKIAlyYyA9IGhhc2h0YWJfaW5zZXJ0KGgsIGtleSwgdHlwZGF0dW0pOwogCWlmIChyYykKIAkJZ290byBiYWQ7Ci1vdXQ6Ci0JcmV0dXJuIHJjOworCXJldHVybiAwOwogYmFkOgogCXR5cGVfZGVzdHJveShrZXksIHR5cGRhdHVtLCBOVUxMKTsKLQlnb3RvIG91dDsKKwlyZXR1cm4gcmM7CiB9CiAKIApAQCAtMTM3NiwyMiArMTM4MiwxOCBAQAogCW1lbXNldChscCwgMCwgc2l6ZW9mKCpscCkpOwogCiAJcmMgPSBuZXh0X2VudHJ5KGJ1ZiwgZnAsIHNpemVvZiBidWYpOwotCWlmIChyYyA8IDApIHsKKwlpZiAocmMpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiBtbHM6IHRydW5jYXRlZCBsZXZlbFxuIik7Ci0JCWdvdG8gYmFkOworCQlyZXR1cm4gcmM7CiAJfQogCWxwLT5zZW5zID0gbGUzMl90b19jcHUoYnVmWzBdKTsKIAotCWlmIChlYml0bWFwX3JlYWQoJmxwLT5jYXQsIGZwKSkgewotCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6IG1sczogIGVycm9yIHJlYWRpbmcgbGV2ZWwgIgotCQkgICAgICAgImNhdGVnb3JpZXNcbiIpOwotCQlnb3RvIGJhZDsKKwlyYyA9IGViaXRtYXBfcmVhZCgmbHAtPmNhdCwgZnApOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6IG1sczogIGVycm9yIHJlYWRpbmcgbGV2ZWwgY2F0ZWdvcmllc1xuIik7CisJCXJldHVybiByYzsKIAl9Ci0KIAlyZXR1cm4gMDsKLQotYmFkOgotCXJldHVybiAtRUlOVkFMOwogfQogCiBzdGF0aWMgaW50IHVzZXJfcmVhZChzdHJ1Y3QgcG9saWN5ZGIgKnAsIHN0cnVjdCBoYXNodGFiICpoLCB2b2lkICpmcCkKQEAgLTE0MDIsMTcgKzE0MDQsMTYgQEAKIAlfX2xlMzIgYnVmWzNdOwogCXUzMiBsZW47CiAKKwlyYyA9IC1FTk9NRU07CiAJdXNyZGF0dW0gPSBremFsbG9jKHNpemVvZigqdXNyZGF0dW0pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXVzcmRhdHVtKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQorCWlmICghdXNyZGF0dW0pCisJCWdvdG8gYmFkOwogCiAJaWYgKHAtPnBvbGljeXZlcnMgPj0gUE9MSUNZREJfVkVSU0lPTl9CT1VOREFSWSkKIAkJdG9fcmVhZCA9IDM7CiAKIAlyYyA9IG5leHRfZW50cnkoYnVmLCBmcCwgc2l6ZW9mKGJ1ZlswXSkgKiB0b19yZWFkKTsKLQlpZiAocmMgPCAwKQorCWlmIChyYykKIAkJZ290byBiYWQ7CiAKIAlsZW4gPSBsZTMyX3RvX2NwdShidWZbMF0pOwpAQCAtMTQyMCwxMyArMTQyMSwxMiBAQAogCWlmIChwLT5wb2xpY3l2ZXJzID49IFBPTElDWURCX1ZFUlNJT05fQk9VTkRBUlkpCiAJCXVzcmRhdHVtLT5ib3VuZHMgPSBsZTMyX3RvX2NwdShidWZbMl0pOwogCisJcmMgPSAtRU5PTUVNOwogCWtleSA9IGttYWxsb2MobGVuICsgMSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFrZXkpIHsKLQkJcmMgPSAtRU5PTUVNOworCWlmICgha2V5KQogCQlnb3RvIGJhZDsKLQl9CiAJcmMgPSBuZXh0X2VudHJ5KGtleSwgZnAsIGxlbik7Ci0JaWYgKHJjIDwgMCkKKwlpZiAocmMpCiAJCWdvdG8gYmFkOwogCWtleVtsZW5dID0gJ1wwJzsKIApAQCAtMTQ0NiwxMSArMTQ0NiwxMCBAQAogCXJjID0gaGFzaHRhYl9pbnNlcnQoaCwga2V5LCB1c3JkYXR1bSk7CiAJaWYgKHJjKQogCQlnb3RvIGJhZDsKLW91dDoKLQlyZXR1cm4gcmM7CisJcmV0dXJuIDA7CiBiYWQ6CiAJdXNlcl9kZXN0cm95KGtleSwgdXNyZGF0dW0sIE5VTEwpOwotCWdvdG8gb3V0OworCXJldHVybiByYzsKIH0KIAogc3RhdGljIGludCBzZW5zX3JlYWQoc3RydWN0IHBvbGljeWRiICpwLCBzdHJ1Y3QgaGFzaHRhYiAqaCwgdm9pZCAqZnApCkBAIC0xNDYxLDQ3ICsxNDYwLDQzIEBACiAJX19sZTMyIGJ1ZlsyXTsKIAl1MzIgbGVuOwogCisJcmMgPSAtRU5PTUVNOwogCWxldmRhdHVtID0ga3phbGxvYyhzaXplb2YoKmxldmRhdHVtKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFsZXZkYXR1bSkgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KKwlpZiAoIWxldmRhdHVtKQorCQlnb3RvIGJhZDsKIAogCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCBzaXplb2YgYnVmKTsKLQlpZiAocmMgPCAwKQorCWlmIChyYykKIAkJZ290byBiYWQ7CiAKIAlsZW4gPSBsZTMyX3RvX2NwdShidWZbMF0pOwogCWxldmRhdHVtLT5pc2FsaWFzID0gbGUzMl90b19jcHUoYnVmWzFdKTsKIAorCXJjID0gLUVOT01FTTsKIAlrZXkgPSBrbWFsbG9jKGxlbiArIDEsIEdGUF9BVE9NSUMpOwotCWlmICgha2V5KSB7Ci0JCXJjID0gLUVOT01FTTsKKwlpZiAoIWtleSkKIAkJZ290byBiYWQ7Ci0JfQogCXJjID0gbmV4dF9lbnRyeShrZXksIGZwLCBsZW4pOwotCWlmIChyYyA8IDApCisJaWYgKHJjKQogCQlnb3RvIGJhZDsKIAlrZXlbbGVuXSA9ICdcMCc7CiAKKwlyYyA9IC1FTk9NRU07CiAJbGV2ZGF0dW0tPmxldmVsID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG1sc19sZXZlbCksIEdGUF9BVE9NSUMpOwotCWlmICghbGV2ZGF0dW0tPmxldmVsKSB7Ci0JCXJjID0gLUVOT01FTTsKKwlpZiAoIWxldmRhdHVtLT5sZXZlbCkKIAkJZ290byBiYWQ7Ci0JfQotCWlmIChtbHNfcmVhZF9sZXZlbChsZXZkYXR1bS0+bGV2ZWwsIGZwKSkgewotCQlyYyA9IC1FSU5WQUw7CisKKwlyYyA9IG1sc19yZWFkX2xldmVsKGxldmRhdHVtLT5sZXZlbCwgZnApOworCWlmIChyYykKIAkJZ290byBiYWQ7Ci0JfQogCiAJcmMgPSBoYXNodGFiX2luc2VydChoLCBrZXksIGxldmRhdHVtKTsKIAlpZiAocmMpCiAJCWdvdG8gYmFkOwotb3V0OgotCXJldHVybiByYzsKKwlyZXR1cm4gMDsKIGJhZDoKIAlzZW5zX2Rlc3Ryb3koa2V5LCBsZXZkYXR1bSwgTlVMTCk7Ci0JZ290byBvdXQ7CisJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgaW50IGNhdF9yZWFkKHN0cnVjdCBwb2xpY3lkYiAqcCwgc3RydWN0IGhhc2h0YWIgKmgsIHZvaWQgKmZwKQpAQCAtMTUxMiwzOSArMTUwNywzNSBAQAogCV9fbGUzMiBidWZbM107CiAJdTMyIGxlbjsKIAorCXJjID0gLUVOT01FTTsKIAljYXRkYXR1bSA9IGt6YWxsb2Moc2l6ZW9mKCpjYXRkYXR1bSksIEdGUF9BVE9NSUMpOwotCWlmICghY2F0ZGF0dW0pIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9CisJaWYgKCFjYXRkYXR1bSkKKwkJZ290byBiYWQ7CiAKIAlyYyA9IG5leHRfZW50cnkoYnVmLCBmcCwgc2l6ZW9mIGJ1Zik7Ci0JaWYgKHJjIDwgMCkKKwlpZiAocmMpCiAJCWdvdG8gYmFkOwogCiAJbGVuID0gbGUzMl90b19jcHUoYnVmWzBdKTsKIAljYXRkYXR1bS0+dmFsdWUgPSBsZTMyX3RvX2NwdShidWZbMV0pOwogCWNhdGRhdHVtLT5pc2FsaWFzID0gbGUzMl90b19jcHUoYnVmWzJdKTsKIAorCXJjID0gLUVOT01FTTsKIAlrZXkgPSBrbWFsbG9jKGxlbiArIDEsIEdGUF9BVE9NSUMpOwotCWlmICgha2V5KSB7Ci0JCXJjID0gLUVOT01FTTsKKwlpZiAoIWtleSkKIAkJZ290byBiYWQ7Ci0JfQogCXJjID0gbmV4dF9lbnRyeShrZXksIGZwLCBsZW4pOwotCWlmIChyYyA8IDApCisJaWYgKHJjKQogCQlnb3RvIGJhZDsKIAlrZXlbbGVuXSA9ICdcMCc7CiAKIAlyYyA9IGhhc2h0YWJfaW5zZXJ0KGgsIGtleSwgY2F0ZGF0dW0pOwogCWlmIChyYykKIAkJZ290byBiYWQ7Ci1vdXQ6Ci0JcmV0dXJuIHJjOwotCisJcmV0dXJuIDA7CiBiYWQ6CiAJY2F0X2Rlc3Ryb3koa2V5LCBjYXRkYXR1bSwgTlVMTCk7Ci0JZ290byBvdXQ7CisJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgaW50ICgqcmVhZF9mW1NZTV9OVU1dKSAoc3RydWN0IHBvbGljeWRiICpwLCBzdHJ1Y3QgaGFzaHRhYiAqaCwgdm9pZCAqZnApID0KQEAgLTE1ODUsOSArMTU3Niw5IEBACiAJCQlwcmludGsoS0VSTl9FUlIKIAkJCSAgICAgICAiU0VMaW51eDogYm91bmRhcnkgdmlvbGF0ZWQgcG9saWN5OiAiCiAJCQkgICAgICAgInVzZXI9JXMgcm9sZT0lcyBib3VuZHM9JXNcbiIsCi0JCQkgICAgICAgcC0+cF91c2VyX3ZhbF90b19uYW1lW3VzZXItPnZhbHVlIC0gMV0sCi0JCQkgICAgICAgcC0+cF9yb2xlX3ZhbF90b19uYW1lW2JpdF0sCi0JCQkgICAgICAgcC0+cF91c2VyX3ZhbF90b19uYW1lW3VwcGVyLT52YWx1ZSAtIDFdKTsKKwkJCSAgICAgICBzeW1fbmFtZShwLCBTWU1fVVNFUlMsIHVzZXItPnZhbHVlIC0gMSksCisJCQkgICAgICAgc3ltX25hbWUocCwgU1lNX1JPTEVTLCBiaXQpLAorCQkJICAgICAgIHN5bV9uYW1lKHAsIFNZTV9VU0VSUywgdXBwZXItPnZhbHVlIC0gMSkpOwogCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtMTYyMiw5ICsxNjEzLDkgQEAKIAkJCXByaW50ayhLRVJOX0VSUgogCQkJICAgICAgICJTRUxpbnV4OiBib3VuZGFyeSB2aW9sYXRlZCBwb2xpY3k6ICIKIAkJCSAgICAgICAicm9sZT0lcyB0eXBlPSVzIGJvdW5kcz0lc1xuIiwKLQkJCSAgICAgICBwLT5wX3JvbGVfdmFsX3RvX25hbWVbcm9sZS0+dmFsdWUgLSAxXSwKLQkJCSAgICAgICBwLT5wX3R5cGVfdmFsX3RvX25hbWVbYml0XSwKLQkJCSAgICAgICBwLT5wX3JvbGVfdmFsX3RvX25hbWVbdXBwZXItPnZhbHVlIC0gMV0pOworCQkJICAgICAgIHN5bV9uYW1lKHAsIFNZTV9ST0xFUywgcm9sZS0+dmFsdWUgLSAxKSwKKwkJCSAgICAgICBzeW1fbmFtZShwLCBTWU1fVFlQRVMsIGJpdCksCisJCQkgICAgICAgc3ltX25hbWUocCwgU1lNX1JPTEVTLCB1cHBlci0+dmFsdWUgLSAxKSk7CiAKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CkBAIC0xNjQ4LDEyICsxNjM5LDE1IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCi0JCXVwcGVyID0gcC0+dHlwZV92YWxfdG9fc3RydWN0W3VwcGVyLT5ib3VuZHMgLSAxXTsKKwkJdXBwZXIgPSBmbGV4X2FycmF5X2dldF9wdHIocC0+dHlwZV92YWxfdG9fc3RydWN0X2FycmF5LAorCQkJCQkgICB1cHBlci0+Ym91bmRzIC0gMSk7CisJCUJVR19PTighdXBwZXIpOworCiAJCWlmICh1cHBlci0+YXR0cmlidXRlKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6IHR5cGUgJXM6ICIKIAkJCSAgICAgICAiYm91bmRlZCBieSBhdHRyaWJ1dGUgJXMiLAogCQkJICAgICAgIChjaGFyICopIGtleSwKLQkJCSAgICAgICBwLT5wX3R5cGVfdmFsX3RvX25hbWVbdXBwZXItPnZhbHVlIC0gMV0pOworCQkJICAgICAgIHN5bV9uYW1lKHAsIFNZTV9UWVBFUywgdXBwZXItPnZhbHVlIC0gMSkpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9CkBAIC0yMDY2LDEzICsyMDYwLDE0IEBACiAKIAlyYyA9IHBvbGljeWRiX2luaXQocCk7CiAJaWYgKHJjKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuIHJjOwogCiAJLyogUmVhZCB0aGUgbWFnaWMgbnVtYmVyIGFuZCBzdHJpbmcgbGVuZ3RoLiAqLwogCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCBzaXplb2YodTMyKSAqIDIpOwotCWlmIChyYyA8IDApCisJaWYgKHJjKQogCQlnb3RvIGJhZDsKIAorCXJjID0gLUVJTlZBTDsKIAlpZiAobGUzMl90b19jcHUoYnVmWzBdKSAhPSBQT0xJQ1lEQl9NQUdJQykgewogCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6ICBwb2xpY3lkYiBtYWdpYyBudW1iZXIgMHgleCBkb2VzICIKIAkJICAgICAgICJub3QgbWF0Y2ggZXhwZWN0ZWQgbWFnaWMgbnVtYmVyIDB4JXhcbiIsCkBAIC0yMDgwLDYgKzIwNzUsNyBAQAogCQlnb3RvIGJhZDsKIAl9CiAKKwlyYyA9IC1FSU5WQUw7CiAJbGVuID0gbGUzMl90b19jcHUoYnVmWzFdKTsKIAlpZiAobGVuICE9IHN0cmxlbihQT0xJQ1lEQl9TVFJJTkcpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogIHBvbGljeWRiIHN0cmluZyBsZW5ndGggJWQgZG9lcyBub3QgIgpAQCAtMjA4NywxOSArMjA4MywyMyBAQAogCQkgICAgICAgbGVuLCBzdHJsZW4oUE9MSUNZREJfU1RSSU5HKSk7CiAJCWdvdG8gYmFkOwogCX0KKworCXJjID0gLUVOT01FTTsKIAlwb2xpY3lkYl9zdHIgPSBrbWFsbG9jKGxlbiArIDEsIEdGUF9LRVJORUwpOwogCWlmICghcG9saWN5ZGJfc3RyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogIHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHBvbGljeWRiICIKIAkJICAgICAgICJzdHJpbmcgb2YgbGVuZ3RoICVkXG4iLCBsZW4pOwotCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gYmFkOwogCX0KKwogCXJjID0gbmV4dF9lbnRyeShwb2xpY3lkYl9zdHIsIGZwLCBsZW4pOwotCWlmIChyYyA8IDApIHsKKwlpZiAocmMpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiAgdHJ1bmNhdGVkIHBvbGljeWRiIHN0cmluZyBpZGVudGlmaWVyXG4iKTsKIAkJa2ZyZWUocG9saWN5ZGJfc3RyKTsKIAkJZ290byBiYWQ7CiAJfQorCisJcmMgPSAtRUlOVkFMOwogCXBvbGljeWRiX3N0cltsZW5dID0gJ1wwJzsKIAlpZiAoc3RyY21wKHBvbGljeWRiX3N0ciwgUE9MSUNZREJfU1RSSU5HKSkgewogCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6ICBwb2xpY3lkYiBzdHJpbmcgJXMgZG9lcyBub3QgbWF0Y2ggIgpAQCAtMjExMyw5ICsyMTEzLDEwIEBACiAKIAkvKiBSZWFkIHRoZSB2ZXJzaW9uIGFuZCB0YWJsZSBzaXplcy4gKi8KIAlyYyA9IG5leHRfZW50cnkoYnVmLCBmcCwgc2l6ZW9mKHUzMikqNCk7Ci0JaWYgKHJjIDwgMCkKKwlpZiAocmMpCiAJCWdvdG8gYmFkOwogCisJcmMgPSAtRUlOVkFMOwogCXAtPnBvbGljeXZlcnMgPSBsZTMyX3RvX2NwdShidWZbMF0pOwogCWlmIChwLT5wb2xpY3l2ZXJzIDwgUE9MSUNZREJfVkVSU0lPTl9NSU4gfHwKIAkgICAgcC0+cG9saWN5dmVycyA+IFBPTElDWURCX1ZFUlNJT05fTUFYKSB7CkBAIC0yMTI4LDYgKzIxMjksNyBAQAogCWlmICgobGUzMl90b19jcHUoYnVmWzFdKSAmIFBPTElDWURCX0NPTkZJR19NTFMpKSB7CiAJCXAtPm1sc19lbmFibGVkID0gMTsKIAorCQlyYyA9IC1FSU5WQUw7CiAJCWlmIChwLT5wb2xpY3l2ZXJzIDwgUE9MSUNZREJfVkVSU0lPTl9NTFMpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogc2VjdXJpdHkgcG9saWN5ZGIgdmVyc2lvbiAlZCAiCiAJCQkJIihNTFMpIG5vdCBiYWNrd2FyZHMgY29tcGF0aWJsZVxuIiwKQEAgLTIxMzgsMTQgKzIxNDAsMTkgQEAKIAlwLT5yZWplY3RfdW5rbm93biA9ICEhKGxlMzJfdG9fY3B1KGJ1ZlsxXSkgJiBSRUpFQ1RfVU5LTk9XTik7CiAJcC0+YWxsb3dfdW5rbm93biA9ICEhKGxlMzJfdG9fY3B1KGJ1ZlsxXSkgJiBBTExPV19VTktOT1dOKTsKIAotCWlmIChwLT5wb2xpY3l2ZXJzID49IFBPTElDWURCX1ZFUlNJT05fUE9MQ0FQICYmCi0JICAgIGViaXRtYXBfcmVhZCgmcC0+cG9saWN5Y2FwcywgZnApICE9IDApCi0JCWdvdG8gYmFkOworCWlmIChwLT5wb2xpY3l2ZXJzID49IFBPTElDWURCX1ZFUlNJT05fUE9MQ0FQKSB7CisJCXJjID0gZWJpdG1hcF9yZWFkKCZwLT5wb2xpY3ljYXBzLCBmcCk7CisJCWlmIChyYykKKwkJCWdvdG8gYmFkOworCX0KIAotCWlmIChwLT5wb2xpY3l2ZXJzID49IFBPTElDWURCX1ZFUlNJT05fUEVSTUlTU0lWRSAmJgotCSAgICBlYml0bWFwX3JlYWQoJnAtPnBlcm1pc3NpdmVfbWFwLCBmcCkgIT0gMCkKLQkJZ290byBiYWQ7CisJaWYgKHAtPnBvbGljeXZlcnMgPj0gUE9MSUNZREJfVkVSU0lPTl9QRVJNSVNTSVZFKSB7CisJCXJjID0gZWJpdG1hcF9yZWFkKCZwLT5wZXJtaXNzaXZlX21hcCwgZnApOworCQlpZiAocmMpCisJCQlnb3RvIGJhZDsKKwl9CiAKKwlyYyA9IC1FSU5WQUw7CiAJaW5mbyA9IHBvbGljeWRiX2xvb2t1cF9jb21wYXQocC0+cG9saWN5dmVycyk7CiAJaWYgKCFpbmZvKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogIHVuYWJsZSB0byBmaW5kIHBvbGljeSBjb21wYXQgaW5mbyAiCkBAIC0yMTUzLDYgKzIxNjAsNyBAQAogCQlnb3RvIGJhZDsKIAl9CiAKKwlyYyA9IC1FSU5WQUw7CiAJaWYgKGxlMzJfdG9fY3B1KGJ1ZlsyXSkgIT0gaW5mby0+c3ltX251bSB8fAogCQlsZTMyX3RvX2NwdShidWZbM10pICE9IGluZm8tPm9jb25fbnVtKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogIHBvbGljeWRiIHRhYmxlIHNpemVzICglZCwlZCkgZG8gIgpAQCAtMjE2NCw3ICsyMTcyLDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5zeW1fbnVtOyBpKyspIHsKIAkJcmMgPSBuZXh0X2VudHJ5KGJ1ZiwgZnAsIHNpemVvZih1MzIpKjIpOwotCQlpZiAocmMgPCAwKQorCQlpZiAocmMpCiAJCQlnb3RvIGJhZDsKIAkJbnByaW0gPSBsZTMyX3RvX2NwdShidWZbMF0pOwogCQluZWwgPSBsZTMyX3RvX2NwdShidWZbMV0pOwpAQCAtMjE4OCw3OCArMjE5Niw3MyBAQAogCX0KIAogCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCBzaXplb2YodTMyKSk7Ci0JaWYgKHJjIDwgMCkKKwlpZiAocmMpCiAJCWdvdG8gYmFkOwogCW5lbCA9IGxlMzJfdG9fY3B1KGJ1ZlswXSk7CiAJbHRyID0gTlVMTDsKIAlmb3IgKGkgPSAwOyBpIDwgbmVsOyBpKyspIHsKKwkJcmMgPSAtRU5PTUVNOwogCQl0ciA9IGt6YWxsb2Moc2l6ZW9mKCp0ciksIEdGUF9LRVJORUwpOwotCQlpZiAoIXRyKSB7Ci0JCQlyYyA9IC1FTk9NRU07CisJCWlmICghdHIpCiAJCQlnb3RvIGJhZDsKLQkJfQogCQlpZiAobHRyKQogCQkJbHRyLT5uZXh0ID0gdHI7CiAJCWVsc2UKIAkJCXAtPnJvbGVfdHIgPSB0cjsKIAkJcmMgPSBuZXh0X2VudHJ5KGJ1ZiwgZnAsIHNpemVvZih1MzIpKjMpOwotCQlpZiAocmMgPCAwKQorCQlpZiAocmMpCiAJCQlnb3RvIGJhZDsKKworCQlyYyA9IC1FSU5WQUw7CiAJCXRyLT5yb2xlID0gbGUzMl90b19jcHUoYnVmWzBdKTsKIAkJdHItPnR5cGUgPSBsZTMyX3RvX2NwdShidWZbMV0pOwogCQl0ci0+bmV3X3JvbGUgPSBsZTMyX3RvX2NwdShidWZbMl0pOwogCQlpZiAoIXBvbGljeWRiX3JvbGVfaXN2YWxpZChwLCB0ci0+cm9sZSkgfHwKIAkJICAgICFwb2xpY3lkYl90eXBlX2lzdmFsaWQocCwgdHItPnR5cGUpIHx8Ci0JCSAgICAhcG9saWN5ZGJfcm9sZV9pc3ZhbGlkKHAsIHRyLT5uZXdfcm9sZSkpIHsKLQkJCXJjID0gLUVJTlZBTDsKKwkJICAgICFwb2xpY3lkYl9yb2xlX2lzdmFsaWQocCwgdHItPm5ld19yb2xlKSkKIAkJCWdvdG8gYmFkOwotCQl9CiAJCWx0ciA9IHRyOwogCX0KIAogCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCBzaXplb2YodTMyKSk7Ci0JaWYgKHJjIDwgMCkKKwlpZiAocmMpCiAJCWdvdG8gYmFkOwogCW5lbCA9IGxlMzJfdG9fY3B1KGJ1ZlswXSk7CiAJbHJhID0gTlVMTDsKIAlmb3IgKGkgPSAwOyBpIDwgbmVsOyBpKyspIHsKKwkJcmMgPSAtRU5PTUVNOwogCQlyYSA9IGt6YWxsb2Moc2l6ZW9mKCpyYSksIEdGUF9LRVJORUwpOwotCQlpZiAoIXJhKSB7Ci0JCQlyYyA9IC1FTk9NRU07CisJCWlmICghcmEpCiAJCQlnb3RvIGJhZDsKLQkJfQogCQlpZiAobHJhKQogCQkJbHJhLT5uZXh0ID0gcmE7CiAJCWVsc2UKIAkJCXAtPnJvbGVfYWxsb3cgPSByYTsKIAkJcmMgPSBuZXh0X2VudHJ5KGJ1ZiwgZnAsIHNpemVvZih1MzIpKjIpOwotCQlpZiAocmMgPCAwKQorCQlpZiAocmMpCiAJCQlnb3RvIGJhZDsKKworCQlyYyA9IC1FSU5WQUw7CiAJCXJhLT5yb2xlID0gbGUzMl90b19jcHUoYnVmWzBdKTsKIAkJcmEtPm5ld19yb2xlID0gbGUzMl90b19jcHUoYnVmWzFdKTsKIAkJaWYgKCFwb2xpY3lkYl9yb2xlX2lzdmFsaWQocCwgcmEtPnJvbGUpIHx8Ci0JCSAgICAhcG9saWN5ZGJfcm9sZV9pc3ZhbGlkKHAsIHJhLT5uZXdfcm9sZSkpIHsKLQkJCXJjID0gLUVJTlZBTDsKKwkJICAgICFwb2xpY3lkYl9yb2xlX2lzdmFsaWQocCwgcmEtPm5ld19yb2xlKSkKIAkJCWdvdG8gYmFkOwotCQl9CiAJCWxyYSA9IHJhOwogCX0KIAotCXJjID0gcG9saWN5ZGJfaW5kZXhfY2xhc3NlcyhwKTsKKwlyYyA9IHBvbGljeWRiX2luZGV4KHApOwogCWlmIChyYykKIAkJZ290byBiYWQ7CiAKLQlyYyA9IHBvbGljeWRiX2luZGV4X290aGVycyhwKTsKLQlpZiAocmMpCi0JCWdvdG8gYmFkOwotCisJcmMgPSAtRUlOVkFMOwogCXAtPnByb2Nlc3NfY2xhc3MgPSBzdHJpbmdfdG9fc2VjdXJpdHlfY2xhc3MocCwgInByb2Nlc3MiKTsKIAlpZiAoIXAtPnByb2Nlc3NfY2xhc3MpCiAJCWdvdG8gYmFkOwotCXAtPnByb2Nlc3NfdHJhbnNfcGVybXMgPSBzdHJpbmdfdG9fYXZfcGVybShwLCBwLT5wcm9jZXNzX2NsYXNzLAotCQkJCQkJICAgInRyYW5zaXRpb24iKTsKLQlwLT5wcm9jZXNzX3RyYW5zX3Blcm1zIHw9IHN0cmluZ190b19hdl9wZXJtKHAsIHAtPnByb2Nlc3NfY2xhc3MsCi0JCQkJCQkgICAgImR5bnRyYW5zaXRpb24iKTsKKworCXJjID0gLUVJTlZBTDsKKwlwLT5wcm9jZXNzX3RyYW5zX3Blcm1zID0gc3RyaW5nX3RvX2F2X3Blcm0ocCwgcC0+cHJvY2Vzc19jbGFzcywgInRyYW5zaXRpb24iKTsKKwlwLT5wcm9jZXNzX3RyYW5zX3Blcm1zIHw9IHN0cmluZ190b19hdl9wZXJtKHAsIHAtPnByb2Nlc3NfY2xhc3MsICJkeW50cmFuc2l0aW9uIik7CiAJaWYgKCFwLT5wcm9jZXNzX3RyYW5zX3Blcm1zKQogCQlnb3RvIGJhZDsKIApAQCAtMjMxMiw4ICsyMzE1LDYgQEAKIG91dDoKIAlyZXR1cm4gcmM7CiBiYWQ6Ci0JaWYgKCFyYykKLQkJcmMgPSAtRUlOVkFMOwogCXBvbGljeWRiX2Rlc3Ryb3kocCk7CiAJZ290byBvdXQ7CiB9CkBAIC0zMDc2LDcgKzMwNzcsNyBAQAogCWlmICghaW5mbykgewogCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6IGNvbXBhdGliaWxpdHkgbG9va3VwIGZhaWxlZCBmb3IgcG9saWN5ICIKIAkJICAgICJ2ZXJzaW9uICVkIiwgcC0+cG9saWN5dmVycyk7Ci0JCXJldHVybiByYzsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJYnVmWzBdID0gY3B1X3RvX2xlMzIocC0+cG9saWN5dmVycyk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3NzL3BvbGljeWRiLmggYi9zZWN1cml0eS9zZWxpbnV4L3NzL3BvbGljeWRiLmgKaW5kZXggOTVkM2Q3ZC4uNGUzYWI5ZCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9wb2xpY3lkYi5oCisrKyBiL3NlY3VyaXR5L3NlbGludXgvc3MvcG9saWN5ZGIuaApAQCAtMjAzLDIxICsyMDMsMTMgQEAKICNkZWZpbmUgcF9jYXRzIHN5bXRhYltTWU1fQ0FUU10KIAogCS8qIHN5bWJvbCBuYW1lcyBpbmRleGVkIGJ5ICh2YWx1ZSAtIDEpICovCi0JY2hhciAqKnN5bV92YWxfdG9fbmFtZVtTWU1fTlVNXTsKLSNkZWZpbmUgcF9jb21tb25fdmFsX3RvX25hbWUgc3ltX3ZhbF90b19uYW1lW1NZTV9DT01NT05TXQotI2RlZmluZSBwX2NsYXNzX3ZhbF90b19uYW1lIHN5bV92YWxfdG9fbmFtZVtTWU1fQ0xBU1NFU10KLSNkZWZpbmUgcF9yb2xlX3ZhbF90b19uYW1lIHN5bV92YWxfdG9fbmFtZVtTWU1fUk9MRVNdCi0jZGVmaW5lIHBfdHlwZV92YWxfdG9fbmFtZSBzeW1fdmFsX3RvX25hbWVbU1lNX1RZUEVTXQotI2RlZmluZSBwX3VzZXJfdmFsX3RvX25hbWUgc3ltX3ZhbF90b19uYW1lW1NZTV9VU0VSU10KLSNkZWZpbmUgcF9ib29sX3ZhbF90b19uYW1lIHN5bV92YWxfdG9fbmFtZVtTWU1fQk9PTFNdCi0jZGVmaW5lIHBfc2Vuc192YWxfdG9fbmFtZSBzeW1fdmFsX3RvX25hbWVbU1lNX0xFVkVMU10KLSNkZWZpbmUgcF9jYXRfdmFsX3RvX25hbWUgc3ltX3ZhbF90b19uYW1lW1NZTV9DQVRTXQorCXN0cnVjdCBmbGV4X2FycmF5ICpzeW1fdmFsX3RvX25hbWVbU1lNX05VTV07CiAKIAkvKiBjbGFzcywgcm9sZSwgYW5kIHVzZXIgYXR0cmlidXRlcyBpbmRleGVkIGJ5ICh2YWx1ZSAtIDEpICovCiAJc3RydWN0IGNsYXNzX2RhdHVtICoqY2xhc3NfdmFsX3RvX3N0cnVjdDsKIAlzdHJ1Y3Qgcm9sZV9kYXR1bSAqKnJvbGVfdmFsX3RvX3N0cnVjdDsKIAlzdHJ1Y3QgdXNlcl9kYXR1bSAqKnVzZXJfdmFsX3RvX3N0cnVjdDsKLQlzdHJ1Y3QgdHlwZV9kYXR1bSAqKnR5cGVfdmFsX3RvX3N0cnVjdDsKKwlzdHJ1Y3QgZmxleF9hcnJheSAqdHlwZV92YWxfdG9fc3RydWN0X2FycmF5OwogCiAJLyogdHlwZSBlbmZvcmNlbWVudCBhY2Nlc3MgdmVjdG9ycyBhbmQgdHJhbnNpdGlvbnMgKi8KIAlzdHJ1Y3QgYXZ0YWIgdGVfYXZ0YWI7CkBAIC0zMjEsNiArMzEzLDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgY2hhciAqc3ltX25hbWUoc3RydWN0IHBvbGljeWRiICpwLCB1bnNpZ25lZCBpbnQgc3ltX251bSwgdW5zaWduZWQgaW50IGVsZW1lbnRfbnIpCit7CisJc3RydWN0IGZsZXhfYXJyYXkgKmZhID0gcC0+c3ltX3ZhbF90b19uYW1lW3N5bV9udW1dOworCisJcmV0dXJuIGZsZXhfYXJyYXlfZ2V0X3B0cihmYSwgZWxlbWVudF9ucik7Cit9CisKIGV4dGVybiB1MTYgc3RyaW5nX3RvX3NlY3VyaXR5X2NsYXNzKHN0cnVjdCBwb2xpY3lkYiAqcCwgY29uc3QgY2hhciAqbmFtZSk7CiBleHRlcm4gdTMyIHN0cmluZ190b19hdl9wZXJtKHN0cnVjdCBwb2xpY3lkYiAqcCwgdTE2IHRjbGFzcywgY29uc3QgY2hhciAqbmFtZSk7CiAKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc3Mvc2VydmljZXMuYyBiL3NlY3VyaXR5L3NlbGludXgvc3Mvc2VydmljZXMuYwppbmRleCAyMjNjMWZmLi5hMDNjZmFmIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L3NzL3NlcnZpY2VzLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9zZXJ2aWNlcy5jCkBAIC00NjQsNyArNDY0LDcgQEAKIAlpZiAoIXBlcm1pc3Npb25zKQogCQlyZXR1cm47CiAKLQl0Y2xhc3NfbmFtZSA9IHBvbGljeWRiLnBfY2xhc3NfdmFsX3RvX25hbWVbdGNsYXNzIC0gMV07CisJdGNsYXNzX25hbWUgPSBzeW1fbmFtZSgmcG9saWN5ZGIsIFNZTV9DTEFTU0VTLCB0Y2xhc3MgLSAxKTsKIAl0Y2xhc3NfZGF0ID0gcG9saWN5ZGIuY2xhc3NfdmFsX3RvX3N0cnVjdFt0Y2xhc3MgLSAxXTsKIAljb21tb25fZGF0ID0gdGNsYXNzX2RhdC0+Y29tZGF0dW07CiAKQEAgLTUzMCwxMiArNTMwLDE4IEBACiAJc3RydWN0IGNvbnRleHQgbG9fc2NvbnRleHQ7CiAJc3RydWN0IGNvbnRleHQgbG9fdGNvbnRleHQ7CiAJc3RydWN0IGF2X2RlY2lzaW9uIGxvX2F2ZDsKLQlzdHJ1Y3QgdHlwZV9kYXR1bSAqc291cmNlCi0JCT0gcG9saWN5ZGIudHlwZV92YWxfdG9fc3RydWN0W3Njb250ZXh0LT50eXBlIC0gMV07Ci0Jc3RydWN0IHR5cGVfZGF0dW0gKnRhcmdldAotCQk9IHBvbGljeWRiLnR5cGVfdmFsX3RvX3N0cnVjdFt0Y29udGV4dC0+dHlwZSAtIDFdOworCXN0cnVjdCB0eXBlX2RhdHVtICpzb3VyY2U7CisJc3RydWN0IHR5cGVfZGF0dW0gKnRhcmdldDsKIAl1MzIgbWFza2VkID0gMDsKIAorCXNvdXJjZSA9IGZsZXhfYXJyYXlfZ2V0X3B0cihwb2xpY3lkYi50eXBlX3ZhbF90b19zdHJ1Y3RfYXJyYXksCisJCQkJICAgIHNjb250ZXh0LT50eXBlIC0gMSk7CisJQlVHX09OKCFzb3VyY2UpOworCisJdGFyZ2V0ID0gZmxleF9hcnJheV9nZXRfcHRyKHBvbGljeWRiLnR5cGVfdmFsX3RvX3N0cnVjdF9hcnJheSwKKwkJCQkgICAgdGNvbnRleHQtPnR5cGUgLSAxKTsKKwlCVUdfT04oIXRhcmdldCk7CisKIAlpZiAoc291cmNlLT5ib3VuZHMpIHsKIAkJbWVtc2V0KCZsb19hdmQsIDAsIHNpemVvZihsb19hdmQpKTsKIApAQCAtNzAxLDE2ICs3MDcsMTYgQEAKIAljaGFyICpvID0gTlVMTCwgKm4gPSBOVUxMLCAqdCA9IE5VTEw7CiAJdTMyIG9sZW4sIG5sZW4sIHRsZW47CiAKLQlpZiAoY29udGV4dF9zdHJ1Y3RfdG9fc3RyaW5nKG9jb250ZXh0LCAmbywgJm9sZW4pIDwgMCkKKwlpZiAoY29udGV4dF9zdHJ1Y3RfdG9fc3RyaW5nKG9jb250ZXh0LCAmbywgJm9sZW4pKQogCQlnb3RvIG91dDsKLQlpZiAoY29udGV4dF9zdHJ1Y3RfdG9fc3RyaW5nKG5jb250ZXh0LCAmbiwgJm5sZW4pIDwgMCkKKwlpZiAoY29udGV4dF9zdHJ1Y3RfdG9fc3RyaW5nKG5jb250ZXh0LCAmbiwgJm5sZW4pKQogCQlnb3RvIG91dDsKLQlpZiAoY29udGV4dF9zdHJ1Y3RfdG9fc3RyaW5nKHRjb250ZXh0LCAmdCwgJnRsZW4pIDwgMCkKKwlpZiAoY29udGV4dF9zdHJ1Y3RfdG9fc3RyaW5nKHRjb250ZXh0LCAmdCwgJnRsZW4pKQogCQlnb3RvIG91dDsKIAlhdWRpdF9sb2coY3VycmVudC0+YXVkaXRfY29udGV4dCwgR0ZQX0FUT01JQywgQVVESVRfU0VMSU5VWF9FUlIsCiAJCSAgInNlY3VyaXR5X3ZhbGlkYXRlX3RyYW5zaXRpb246ICBkZW5pZWQgZm9yIgogCQkgICIgb2xkY29udGV4dD0lcyBuZXdjb250ZXh0PSVzIHRhc2tjb250ZXh0PSVzIHRjbGFzcz0lcyIsCi0JCSAgbywgbiwgdCwgcG9saWN5ZGIucF9jbGFzc192YWxfdG9fbmFtZVt0Y2xhc3MtMV0pOworCQkgIG8sIG4sIHQsIHN5bV9uYW1lKCZwb2xpY3lkYiwgU1lNX0NMQVNTRVMsIHRjbGFzcy0xKSk7CiBvdXQ6CiAJa2ZyZWUobyk7CiAJa2ZyZWUobik7CkBAIC04MDEsMTAgKzgwNywxMSBAQAogCXN0cnVjdCBjb250ZXh0ICpvbGRfY29udGV4dCwgKm5ld19jb250ZXh0OwogCXN0cnVjdCB0eXBlX2RhdHVtICp0eXBlOwogCWludCBpbmRleDsKLQlpbnQgcmMgPSAtRUlOVkFMOworCWludCByYzsKIAogCXJlYWRfbG9jaygmcG9saWN5X3J3bG9jayk7CiAKKwlyYyA9IC1FSU5WQUw7CiAJb2xkX2NvbnRleHQgPSBzaWR0YWJfc2VhcmNoKCZzaWR0YWIsIG9sZF9zaWQpOwogCWlmICghb2xkX2NvbnRleHQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiAlczogdW5yZWNvZ25pemVkIFNJRCAldVxuIiwKQEAgLTgxMiw2ICs4MTksNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwlyYyA9IC1FSU5WQUw7CiAJbmV3X2NvbnRleHQgPSBzaWR0YWJfc2VhcmNoKCZzaWR0YWIsIG5ld19zaWQpOwogCWlmICghbmV3X2NvbnRleHQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiAlczogdW5yZWNvZ25pemVkIFNJRCAldVxuIiwKQEAgLTgxOSwyOCArODI3LDI3IEBACiAJCWdvdG8gb3V0OwogCX0KIAorCXJjID0gMDsKIAkvKiB0eXBlL2RvbWFpbiB1bmNoYW5nZWQgKi8KLQlpZiAob2xkX2NvbnRleHQtPnR5cGUgPT0gbmV3X2NvbnRleHQtPnR5cGUpIHsKLQkJcmMgPSAwOworCWlmIChvbGRfY29udGV4dC0+dHlwZSA9PSBuZXdfY29udGV4dC0+dHlwZSkKIAkJZ290byBvdXQ7Ci0JfQogCiAJaW5kZXggPSBuZXdfY29udGV4dC0+dHlwZTsKIAl3aGlsZSAodHJ1ZSkgewotCQl0eXBlID0gcG9saWN5ZGIudHlwZV92YWxfdG9fc3RydWN0W2luZGV4IC0gMV07CisJCXR5cGUgPSBmbGV4X2FycmF5X2dldF9wdHIocG9saWN5ZGIudHlwZV92YWxfdG9fc3RydWN0X2FycmF5LAorCQkJCQkgIGluZGV4IC0gMSk7CiAJCUJVR19PTighdHlwZSk7CiAKIAkJLyogbm90IGJvdW5kZWQgYW55bW9yZSAqLwotCQlpZiAoIXR5cGUtPmJvdW5kcykgewotCQkJcmMgPSAtRVBFUk07CisJCXJjID0gLUVQRVJNOworCQlpZiAoIXR5cGUtPmJvdW5kcykKIAkJCWJyZWFrOwotCQl9CiAKIAkJLyogQG5ld3NpZCBpcyBib3VuZGVkIGJ5IEBvbGRzaWQgKi8KLQkJaWYgKHR5cGUtPmJvdW5kcyA9PSBvbGRfY29udGV4dC0+dHlwZSkgewotCQkJcmMgPSAwOworCQlyYyA9IDA7CisJCWlmICh0eXBlLT5ib3VuZHMgPT0gb2xkX2NvbnRleHQtPnR5cGUpCiAJCQlicmVhazsKLQkJfQorCiAJCWluZGV4ID0gdHlwZS0+Ym91bmRzOwogCX0KIApAQCAtMTAwNSw5ICsxMDEyLDkgQEAKIAl9CiAKIAkvKiBDb21wdXRlIHRoZSBzaXplIG9mIHRoZSBjb250ZXh0LiAqLwotCSpzY29udGV4dF9sZW4gKz0gc3RybGVuKHBvbGljeWRiLnBfdXNlcl92YWxfdG9fbmFtZVtjb250ZXh0LT51c2VyIC0gMV0pICsgMTsKLQkqc2NvbnRleHRfbGVuICs9IHN0cmxlbihwb2xpY3lkYi5wX3JvbGVfdmFsX3RvX25hbWVbY29udGV4dC0+cm9sZSAtIDFdKSArIDE7Ci0JKnNjb250ZXh0X2xlbiArPSBzdHJsZW4ocG9saWN5ZGIucF90eXBlX3ZhbF90b19uYW1lW2NvbnRleHQtPnR5cGUgLSAxXSkgKyAxOworCSpzY29udGV4dF9sZW4gKz0gc3RybGVuKHN5bV9uYW1lKCZwb2xpY3lkYiwgU1lNX1VTRVJTLCBjb250ZXh0LT51c2VyIC0gMSkpICsgMTsKKwkqc2NvbnRleHRfbGVuICs9IHN0cmxlbihzeW1fbmFtZSgmcG9saWN5ZGIsIFNZTV9ST0xFUywgY29udGV4dC0+cm9sZSAtIDEpKSArIDE7CisJKnNjb250ZXh0X2xlbiArPSBzdHJsZW4oc3ltX25hbWUoJnBvbGljeWRiLCBTWU1fVFlQRVMsIGNvbnRleHQtPnR5cGUgLSAxKSkgKyAxOwogCSpzY29udGV4dF9sZW4gKz0gbWxzX2NvbXB1dGVfY29udGV4dF9sZW4oY29udGV4dCk7CiAKIAlpZiAoIXNjb250ZXh0KQpAQCAtMTAyMywxMiArMTAzMCwxMiBAQAogCSAqIENvcHkgdGhlIHVzZXIgbmFtZSwgcm9sZSBuYW1lIGFuZCB0eXBlIG5hbWUgaW50byB0aGUgY29udGV4dC4KIAkgKi8KIAlzcHJpbnRmKHNjb250ZXh0cCwgIiVzOiVzOiVzIiwKLQkJcG9saWN5ZGIucF91c2VyX3ZhbF90b19uYW1lW2NvbnRleHQtPnVzZXIgLSAxXSwKLQkJcG9saWN5ZGIucF9yb2xlX3ZhbF90b19uYW1lW2NvbnRleHQtPnJvbGUgLSAxXSwKLQkJcG9saWN5ZGIucF90eXBlX3ZhbF90b19uYW1lW2NvbnRleHQtPnR5cGUgLSAxXSk7Ci0Jc2NvbnRleHRwICs9IHN0cmxlbihwb2xpY3lkYi5wX3VzZXJfdmFsX3RvX25hbWVbY29udGV4dC0+dXNlciAtIDFdKSArCi0JCSAgICAgMSArIHN0cmxlbihwb2xpY3lkYi5wX3JvbGVfdmFsX3RvX25hbWVbY29udGV4dC0+cm9sZSAtIDFdKSArCi0JCSAgICAgMSArIHN0cmxlbihwb2xpY3lkYi5wX3R5cGVfdmFsX3RvX25hbWVbY29udGV4dC0+dHlwZSAtIDFdKTsKKwkJc3ltX25hbWUoJnBvbGljeWRiLCBTWU1fVVNFUlMsIGNvbnRleHQtPnVzZXIgLSAxKSwKKwkJc3ltX25hbWUoJnBvbGljeWRiLCBTWU1fUk9MRVMsIGNvbnRleHQtPnJvbGUgLSAxKSwKKwkJc3ltX25hbWUoJnBvbGljeWRiLCBTWU1fVFlQRVMsIGNvbnRleHQtPnR5cGUgLSAxKSk7CisJc2NvbnRleHRwICs9IHN0cmxlbihzeW1fbmFtZSgmcG9saWN5ZGIsIFNZTV9VU0VSUywgY29udGV4dC0+dXNlciAtIDEpKSArCisJCSAgICAgMSArIHN0cmxlbihzeW1fbmFtZSgmcG9saWN5ZGIsIFNZTV9ST0xFUywgY29udGV4dC0+cm9sZSAtIDEpKSArCisJCSAgICAgMSArIHN0cmxlbihzeW1fbmFtZSgmcG9saWN5ZGIsIFNZTV9UWVBFUywgY29udGV4dC0+dHlwZSAtIDEpKTsKIAogCW1sc19zaWRfdG9fY29udGV4dChjb250ZXh0LCAmc2NvbnRleHRwKTsKIApAQCAtMTE4NywxNiArMTE5NCwxMyBAQAogCWlmIChyYykKIAkJZ290byBvdXQ7CiAKLQlpZiAoKHAgLSBzY29udGV4dCkgPCBzY29udGV4dF9sZW4pIHsKLQkJcmMgPSAtRUlOVkFMOworCXJjID0gLUVJTlZBTDsKKwlpZiAoKHAgLSBzY29udGV4dCkgPCBzY29udGV4dF9sZW4pCiAJCWdvdG8gb3V0OwotCX0KIAogCS8qIENoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgbmV3IGNvbnRleHQuICovCi0JaWYgKCFwb2xpY3lkYl9jb250ZXh0X2lzdmFsaWQocG9sLCBjdHgpKSB7Ci0JCXJjID0gLUVJTlZBTDsKKwlpZiAoIXBvbGljeWRiX2NvbnRleHRfaXN2YWxpZChwb2wsIGN0eCkpCiAJCWdvdG8gb3V0OwotCX0KIAlyYyA9IDA7CiBvdXQ6CiAJaWYgKHJjKQpAQCAtMTIzNSwyNyArMTIzOSwyNiBAQAogCiAJaWYgKGZvcmNlKSB7CiAJCS8qIFNhdmUgYW5vdGhlciBjb3B5IGZvciBzdG9yaW5nIGluIHVuaW50ZXJwcmV0ZWQgZm9ybSAqLworCQlyYyA9IC1FTk9NRU07CiAJCXN0ciA9IGtzdHJkdXAoc2NvbnRleHQyLCBnZnBfZmxhZ3MpOwotCQlpZiAoIXN0cikgewotCQkJa2ZyZWUoc2NvbnRleHQyKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9CisJCWlmICghc3RyKQorCQkJZ290byBvdXQ7CiAJfQogCiAJcmVhZF9sb2NrKCZwb2xpY3lfcndsb2NrKTsKLQlyYyA9IHN0cmluZ190b19jb250ZXh0X3N0cnVjdCgmcG9saWN5ZGIsICZzaWR0YWIsCi0JCQkJICAgICAgc2NvbnRleHQyLCBzY29udGV4dF9sZW4sCi0JCQkJICAgICAgJmNvbnRleHQsIGRlZl9zaWQpOworCXJjID0gc3RyaW5nX3RvX2NvbnRleHRfc3RydWN0KCZwb2xpY3lkYiwgJnNpZHRhYiwgc2NvbnRleHQyLAorCQkJCSAgICAgIHNjb250ZXh0X2xlbiwgJmNvbnRleHQsIGRlZl9zaWQpOwogCWlmIChyYyA9PSAtRUlOVkFMICYmIGZvcmNlKSB7CiAJCWNvbnRleHQuc3RyID0gc3RyOwogCQljb250ZXh0LmxlbiA9IHNjb250ZXh0X2xlbjsKIAkJc3RyID0gTlVMTDsKIAl9IGVsc2UgaWYgKHJjKQotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfdW5sb2NrOwogCXJjID0gc2lkdGFiX2NvbnRleHRfdG9fc2lkKCZzaWR0YWIsICZjb250ZXh0LCBzaWQpOwogCWNvbnRleHRfZGVzdHJveSgmY29udGV4dCk7Ci1vdXQ6CitvdXRfdW5sb2NrOgogCXJlYWRfdW5sb2NrKCZwb2xpY3lfcndsb2NrKTsKK291dDoKIAlrZnJlZShzY29udGV4dDIpOwogCWtmcmVlKHN0cik7CiAJcmV0dXJuIHJjOwpAQCAtMTMxOSwxOCArMTMyMiwxOCBAQAogCWNoYXIgKnMgPSBOVUxMLCAqdCA9IE5VTEwsICpuID0gTlVMTDsKIAl1MzIgc2xlbiwgdGxlbiwgbmxlbjsKIAotCWlmIChjb250ZXh0X3N0cnVjdF90b19zdHJpbmcoc2NvbnRleHQsICZzLCAmc2xlbikgPCAwKQorCWlmIChjb250ZXh0X3N0cnVjdF90b19zdHJpbmcoc2NvbnRleHQsICZzLCAmc2xlbikpCiAJCWdvdG8gb3V0OwotCWlmIChjb250ZXh0X3N0cnVjdF90b19zdHJpbmcodGNvbnRleHQsICZ0LCAmdGxlbikgPCAwKQorCWlmIChjb250ZXh0X3N0cnVjdF90b19zdHJpbmcodGNvbnRleHQsICZ0LCAmdGxlbikpCiAJCWdvdG8gb3V0OwotCWlmIChjb250ZXh0X3N0cnVjdF90b19zdHJpbmcobmV3Y29udGV4dCwgJm4sICZubGVuKSA8IDApCisJaWYgKGNvbnRleHRfc3RydWN0X3RvX3N0cmluZyhuZXdjb250ZXh0LCAmbiwgJm5sZW4pKQogCQlnb3RvIG91dDsKIAlhdWRpdF9sb2coY3VycmVudC0+YXVkaXRfY29udGV4dCwgR0ZQX0FUT01JQywgQVVESVRfU0VMSU5VWF9FUlIsCiAJCSAgInNlY3VyaXR5X2NvbXB1dGVfc2lkOiAgaW52YWxpZCBjb250ZXh0ICVzIgogCQkgICIgZm9yIHNjb250ZXh0PSVzIgogCQkgICIgdGNvbnRleHQ9JXMiCiAJCSAgIiB0Y2xhc3M9JXMiLAotCQkgIG4sIHMsIHQsIHBvbGljeWRiLnBfY2xhc3NfdmFsX3RvX25hbWVbdGNsYXNzLTFdKTsKKwkJICBuLCBzLCB0LCBzeW1fbmFtZSgmcG9saWN5ZGIsIFNZTV9DTEFTU0VTLCB0Y2xhc3MtMSkpOwogb3V0OgogCWtmcmVlKHMpOwogCWtmcmVlKHQpOwpAQCAtMTU2OSwyMiArMTU3MiwxNyBAQAogCiBzdGF0aWMgaW5saW5lIGludCBjb252ZXJ0X2NvbnRleHRfaGFuZGxlX2ludmFsaWRfY29udGV4dChzdHJ1Y3QgY29udGV4dCAqY29udGV4dCkKIHsKLQlpbnQgcmMgPSAwOworCWNoYXIgKnM7CisJdTMyIGxlbjsKIAotCWlmIChzZWxpbnV4X2VuZm9yY2luZykgewotCQlyYyA9IC1FSU5WQUw7Ci0JfSBlbHNlIHsKLQkJY2hhciAqczsKLQkJdTMyIGxlbjsKKwlpZiAoc2VsaW51eF9lbmZvcmNpbmcpCisJCXJldHVybiAtRUlOVkFMOwogCi0JCWlmICghY29udGV4dF9zdHJ1Y3RfdG9fc3RyaW5nKGNvbnRleHQsICZzLCAmbGVuKSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgIlNFTGludXg6ICBDb250ZXh0ICVzIHdvdWxkIGJlIGludmFsaWQgaWYgZW5mb3JjaW5nXG4iLAotCQkJICAgICAgIHMpOwotCQkJa2ZyZWUocyk7Ci0JCX0KKwlpZiAoIWNvbnRleHRfc3RydWN0X3RvX3N0cmluZyhjb250ZXh0LCAmcywgJmxlbikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiU0VMaW51eDogIENvbnRleHQgJXMgd291bGQgYmUgaW52YWxpZCBpZiBlbmZvcmNpbmdcbiIsIHMpOworCQlrZnJlZShzKTsKIAl9Ci0JcmV0dXJuIHJjOworCXJldHVybiAwOwogfQogCiBzdHJ1Y3QgY29udmVydF9jb250ZXh0X2FyZ3MgewpAQCAtMTYyMSwxNyArMTYxOSwxNyBAQAogCiAJaWYgKGMtPnN0cikgewogCQlzdHJ1Y3QgY29udGV4dCBjdHg7CisKKwkJcmMgPSAtRU5PTUVNOwogCQlzID0ga3N0cmR1cChjLT5zdHIsIEdGUF9LRVJORUwpOwotCQlpZiAoIXMpIHsKLQkJCXJjID0gLUVOT01FTTsKKwkJaWYgKCFzKQogCQkJZ290byBvdXQ7Ci0JCX0KKwogCQlyYyA9IHN0cmluZ190b19jb250ZXh0X3N0cnVjdChhcmdzLT5uZXdwLCBOVUxMLCBzLAogCQkJCQkgICAgICBjLT5sZW4sICZjdHgsIFNFQ1NJRF9OVUxMKTsKIAkJa2ZyZWUocyk7CiAJCWlmICghcmMpIHsKLQkJCXByaW50ayhLRVJOX0lORk8KLQkJICAgICAgICJTRUxpbnV4OiAgQ29udGV4dCAlcyBiZWNhbWUgdmFsaWQgKG1hcHBlZCkuXG4iLAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiU0VMaW51eDogIENvbnRleHQgJXMgYmVjYW1lIHZhbGlkIChtYXBwZWQpLlxuIiwKIAkJCSAgICAgICBjLT5zdHIpOwogCQkJLyogUmVwbGFjZSBzdHJpbmcgd2l0aCBtYXBwZWQgcmVwcmVzZW50YXRpb24uICovCiAJCQlrZnJlZShjLT5zdHIpOwpAQCAtMTY0Myw4ICsxNjQxLDcgQEAKIAkJCWdvdG8gb3V0OwogCQl9IGVsc2UgewogCQkJLyogT3RoZXIgZXJyb3IgY29uZGl0aW9uLCBlLmcuIEVOT01FTS4gKi8KLQkJCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgIlNFTGludXg6ICAgVW5hYmxlIHRvIG1hcCBjb250ZXh0ICVzLCByYyA9ICVkLlxuIiwKKwkJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogICBVbmFibGUgdG8gbWFwIGNvbnRleHQgJXMsIHJjID0gJWQuXG4iLAogCQkJICAgICAgIGMtPnN0ciwgLXJjKTsKIAkJCWdvdG8gb3V0OwogCQl9CkBAIC0xNjU0LDI1ICsxNjUxLDI2IEBACiAJaWYgKHJjKQogCQlnb3RvIG91dDsKIAotCXJjID0gLUVJTlZBTDsKLQogCS8qIENvbnZlcnQgdGhlIHVzZXIuICovCisJcmMgPSAtRUlOVkFMOwogCXVzcmRhdHVtID0gaGFzaHRhYl9zZWFyY2goYXJncy0+bmV3cC0+cF91c2Vycy50YWJsZSwKLQkJCQkgIGFyZ3MtPm9sZHAtPnBfdXNlcl92YWxfdG9fbmFtZVtjLT51c2VyIC0gMV0pOworCQkJCSAgc3ltX25hbWUoYXJncy0+b2xkcCwgU1lNX1VTRVJTLCBjLT51c2VyIC0gMSkpOwogCWlmICghdXNyZGF0dW0pCiAJCWdvdG8gYmFkOwogCWMtPnVzZXIgPSB1c3JkYXR1bS0+dmFsdWU7CiAKIAkvKiBDb252ZXJ0IHRoZSByb2xlLiAqLworCXJjID0gLUVJTlZBTDsKIAlyb2xlID0gaGFzaHRhYl9zZWFyY2goYXJncy0+bmV3cC0+cF9yb2xlcy50YWJsZSwKLQkJCSAgICAgIGFyZ3MtPm9sZHAtPnBfcm9sZV92YWxfdG9fbmFtZVtjLT5yb2xlIC0gMV0pOworCQkJICAgICAgc3ltX25hbWUoYXJncy0+b2xkcCwgU1lNX1JPTEVTLCBjLT5yb2xlIC0gMSkpOwogCWlmICghcm9sZSkKIAkJZ290byBiYWQ7CiAJYy0+cm9sZSA9IHJvbGUtPnZhbHVlOwogCiAJLyogQ29udmVydCB0aGUgdHlwZS4gKi8KKwlyYyA9IC1FSU5WQUw7CiAJdHlwZGF0dW0gPSBoYXNodGFiX3NlYXJjaChhcmdzLT5uZXdwLT5wX3R5cGVzLnRhYmxlLAotCQkJCSAgYXJncy0+b2xkcC0+cF90eXBlX3ZhbF90b19uYW1lW2MtPnR5cGUgLSAxXSk7CisJCQkJICBzeW1fbmFtZShhcmdzLT5vbGRwLCBTWU1fVFlQRVMsIGMtPnR5cGUgLSAxKSk7CiAJaWYgKCF0eXBkYXR1bSkKIAkJZ290byBiYWQ7CiAJYy0+dHlwZSA9IHR5cGRhdHVtLT52YWx1ZTsKQEAgLTE3MDAsNiArMTY5OCw3IEBACiAJCW9jID0gYXJncy0+bmV3cC0+b2NvbnRleHRzW09DT05fSVNJRF07CiAJCXdoaWxlIChvYyAmJiBvYy0+c2lkWzBdICE9IFNFQ0lOSVRTSURfVU5MQUJFTEVEKQogCQkJb2MgPSBvYy0+bmV4dDsKKwkJcmMgPSAtRUlOVkFMOwogCQlpZiAoIW9jKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6ICB1bmFibGUgdG8gbG9vayB1cCIKIAkJCQkiIHRoZSBpbml0aWFsIFNJRHMgbGlzdFxuIik7CkBAIC0xNzE5LDE5ICsxNzE4LDIwIEBACiAJfQogCiAJY29udGV4dF9kZXN0cm95KCZvbGRjKTsKKwogCXJjID0gMDsKIG91dDoKIAlyZXR1cm4gcmM7CiBiYWQ6CiAJLyogTWFwIG9sZCByZXByZXNlbnRhdGlvbiB0byBzdHJpbmcgYW5kIHNhdmUgaXQuICovCi0JaWYgKGNvbnRleHRfc3RydWN0X3RvX3N0cmluZygmb2xkYywgJnMsICZsZW4pKQotCQlyZXR1cm4gLUVOT01FTTsKKwlyYyA9IGNvbnRleHRfc3RydWN0X3RvX3N0cmluZygmb2xkYywgJnMsICZsZW4pOworCWlmIChyYykKKwkJcmV0dXJuIHJjOwogCWNvbnRleHRfZGVzdHJveSgmb2xkYyk7CiAJY29udGV4dF9kZXN0cm95KGMpOwogCWMtPnN0ciA9IHM7CiAJYy0+bGVuID0gbGVuOwotCXByaW50ayhLRVJOX0lORk8KLQkgICAgICAgIlNFTGludXg6ICBDb250ZXh0ICVzIGJlY2FtZSBpbnZhbGlkICh1bm1hcHBlZCkuXG4iLAorCXByaW50ayhLRVJOX0lORk8gIlNFTGludXg6ICBDb250ZXh0ICVzIGJlY2FtZSBpbnZhbGlkICh1bm1hcHBlZCkuXG4iLAogCSAgICAgICBjLT5zdHIpOwogCXJjID0gMDsKIAlnb3RvIG91dDsKQEAgLTIwMTIsNyArMjAxMiw3IEBACiAJCSAgICAgIHUzMiBhZGRybGVuLAogCQkgICAgICB1MzIgKm91dF9zaWQpCiB7Ci0JaW50IHJjID0gMDsKKwlpbnQgcmM7CiAJc3RydWN0IG9jb250ZXh0ICpjOwogCiAJcmVhZF9sb2NrKCZwb2xpY3lfcndsb2NrKTsKQEAgLTIwMjEsMTAgKzIwMjEsOSBAQAogCWNhc2UgQUZfSU5FVDogewogCQl1MzIgYWRkcjsKIAotCQlpZiAoYWRkcmxlbiAhPSBzaXplb2YodTMyKSkgewotCQkJcmMgPSAtRUlOVkFMOworCQlyYyA9IC1FSU5WQUw7CisJCWlmIChhZGRybGVuICE9IHNpemVvZih1MzIpKQogCQkJZ290byBvdXQ7Ci0JCX0KIAogCQlhZGRyID0gKigodTMyICopYWRkcnApOwogCkBAIC0yMDM4LDEwICsyMDM3LDkgQEAKIAl9CiAKIAljYXNlIEFGX0lORVQ2OgotCQlpZiAoYWRkcmxlbiAhPSBzaXplb2YodTY0KSAqIDIpIHsKLQkJCXJjID0gLUVJTlZBTDsKKwkJcmMgPSAtRUlOVkFMOworCQlpZiAoYWRkcmxlbiAhPSBzaXplb2YodTY0KSAqIDIpCiAJCQlnb3RvIG91dDsKLQkJfQogCQljID0gcG9saWN5ZGIub2NvbnRleHRzW09DT05fTk9ERTZdOwogCQl3aGlsZSAoYykgewogCQkJaWYgKG1hdGNoX2lwdjZfYWRkcm1hc2soYWRkcnAsIGMtPnUubm9kZTYuYWRkciwKQEAgLTIwNTIsNiArMjA1MCw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKKwkJcmMgPSAwOwogCQkqb3V0X3NpZCA9IFNFQ0lOSVRTSURfTk9ERTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMjA2OSw2ICsyMDY4LDcgQEAKIAkJKm91dF9zaWQgPSBTRUNJTklUU0lEX05PREU7CiAJfQogCisJcmMgPSAwOwogb3V0OgogCXJlYWRfdW5sb2NrKCZwb2xpY3lfcndsb2NrKTsKIAlyZXR1cm4gcmM7CkBAIC0yMTEzLDI0ICsyMTEzLDIyIEBACiAKIAljb250ZXh0X2luaXQoJnVzZXJjb24pOwogCisJcmMgPSAtRUlOVkFMOwogCWZyb21jb24gPSBzaWR0YWJfc2VhcmNoKCZzaWR0YWIsIGZyb21zaWQpOwotCWlmICghZnJvbWNvbikgewotCQlyYyA9IC1FSU5WQUw7CisJaWYgKCFmcm9tY29uKQogCQlnb3RvIG91dF91bmxvY2s7Ci0JfQogCisJcmMgPSAtRUlOVkFMOwogCXVzZXIgPSBoYXNodGFiX3NlYXJjaChwb2xpY3lkYi5wX3VzZXJzLnRhYmxlLCB1c2VybmFtZSk7Ci0JaWYgKCF1c2VyKSB7Ci0JCXJjID0gLUVJTlZBTDsKKwlpZiAoIXVzZXIpCiAJCWdvdG8gb3V0X3VubG9jazsKLQl9CisKIAl1c2VyY29uLnVzZXIgPSB1c2VyLT52YWx1ZTsKIAorCXJjID0gLUVOT01FTTsKIAlteXNpZHMgPSBrY2FsbG9jKG1heG5lbCwgc2l6ZW9mKCpteXNpZHMpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIW15c2lkcykgewotCQlyYyA9IC1FTk9NRU07CisJaWYgKCFteXNpZHMpCiAJCWdvdG8gb3V0X3VubG9jazsKLQl9CiAKIAllYml0bWFwX2Zvcl9lYWNoX3Bvc2l0aXZlX2JpdCgmdXNlci0+cm9sZXMsIHJub2RlLCBpKSB7CiAJCXJvbGUgPSBwb2xpY3lkYi5yb2xlX3ZhbF90b19zdHJ1Y3RbaV07CkBAIC0yMTQ3LDEyICsyMTQ1LDExIEBACiAJCQlpZiAobXluZWwgPCBtYXhuZWwpIHsKIAkJCQlteXNpZHNbbXluZWwrK10gPSBzaWQ7CiAJCQl9IGVsc2UgeworCQkJCXJjID0gLUVOT01FTTsKIAkJCQltYXhuZWwgKz0gU0lEU19ORUw7CiAJCQkJbXlzaWRzMiA9IGtjYWxsb2MobWF4bmVsLCBzaXplb2YoKm15c2lkczIpLCBHRlBfQVRPTUlDKTsKLQkJCQlpZiAoIW15c2lkczIpIHsKLQkJCQkJcmMgPSAtRU5PTUVNOworCQkJCWlmICghbXlzaWRzMikKIAkJCQkJZ290byBvdXRfdW5sb2NrOwotCQkJCX0KIAkJCQltZW1jcHkobXlzaWRzMiwgbXlzaWRzLCBteW5lbCAqIHNpemVvZigqbXlzaWRzMikpOwogCQkJCWtmcmVlKG15c2lkcyk7CiAJCQkJbXlzaWRzID0gbXlzaWRzMjsKQEAgLTIxNjAsNyArMjE1Nyw3IEBACiAJCQl9CiAJCX0KIAl9Ci0KKwlyYyA9IDA7CiBvdXRfdW5sb2NrOgogCXJlYWRfdW5sb2NrKCZwb2xpY3lfcndsb2NrKTsKIAlpZiAocmMgfHwgIW15bmVsKSB7CkBAIC0yMTY4LDkgKzIxNjUsOSBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwlyYyA9IC1FTk9NRU07CiAJbXlzaWRzMiA9IGtjYWxsb2MobXluZWwsIHNpemVvZigqbXlzaWRzMiksIEdGUF9LRVJORUwpOwogCWlmICghbXlzaWRzMikgewotCQlyYyA9IC1FTk9NRU07CiAJCWtmcmVlKG15c2lkcyk7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTIyMTEsNyArMjIwOCw3IEBACiAJdTE2IHNjbGFzczsKIAlzdHJ1Y3QgZ2VuZnMgKmdlbmZzOwogCXN0cnVjdCBvY29udGV4dCAqYzsKLQlpbnQgcmMgPSAwLCBjbXAgPSAwOworCWludCByYywgY21wID0gMDsKIAogCXdoaWxlIChwYXRoWzBdID09ICcvJyAmJiBwYXRoWzFdID09ICcvJykKIAkJcGF0aCsrOwpAQCAtMjIxOSw2ICsyMjE2LDcgQEAKIAlyZWFkX2xvY2soJnBvbGljeV9yd2xvY2spOwogCiAJc2NsYXNzID0gdW5tYXBfY2xhc3Mob3JpZ19zY2xhc3MpOworCSpzaWQgPSBTRUNJTklUU0lEX1VOTEFCRUxFRDsKIAogCWZvciAoZ2VuZnMgPSBwb2xpY3lkYi5nZW5mczsgZ2VuZnM7IGdlbmZzID0gZ2VuZnMtPm5leHQpIHsKIAkJY21wID0gc3RyY21wKGZzdHlwZSwgZ2VuZnMtPmZzdHlwZSk7CkBAIC0yMjI2LDExICsyMjI0LDkgQEAKIAkJCWJyZWFrOwogCX0KIAotCWlmICghZ2VuZnMgfHwgY21wKSB7Ci0JCSpzaWQgPSBTRUNJTklUU0lEX1VOTEFCRUxFRDsKLQkJcmMgPSAtRU5PRU5UOworCXJjID0gLUVOT0VOVDsKKwlpZiAoIWdlbmZzIHx8IGNtcCkKIAkJZ290byBvdXQ7Ci0JfQogCiAJZm9yIChjID0gZ2VuZnMtPmhlYWQ7IGM7IGMgPSBjLT5uZXh0KSB7CiAJCWxlbiA9IHN0cmxlbihjLT51Lm5hbWUpOwpAQCAtMjIzOSwyMSArMjIzNSwxOCBAQAogCQkJYnJlYWs7CiAJfQogCi0JaWYgKCFjKSB7Ci0JCSpzaWQgPSBTRUNJTklUU0lEX1VOTEFCRUxFRDsKLQkJcmMgPSAtRU5PRU5UOworCXJjID0gLUVOT0VOVDsKKwlpZiAoIWMpCiAJCWdvdG8gb3V0OwotCX0KIAogCWlmICghYy0+c2lkWzBdKSB7Ci0JCXJjID0gc2lkdGFiX2NvbnRleHRfdG9fc2lkKCZzaWR0YWIsCi0JCQkJCSAgICZjLT5jb250ZXh0WzBdLAotCQkJCQkgICAmYy0+c2lkWzBdKTsKKwkJcmMgPSBzaWR0YWJfY29udGV4dF90b19zaWQoJnNpZHRhYiwgJmMtPmNvbnRleHRbMF0sICZjLT5zaWRbMF0pOwogCQlpZiAocmMpCiAJCQlnb3RvIG91dDsKIAl9CiAKIAkqc2lkID0gYy0+c2lkWzBdOworCXJjID0gMDsKIG91dDoKIAlyZWFkX3VubG9jaygmcG9saWN5X3J3bG9jayk7CiAJcmV0dXJuIHJjOwpAQCAtMjI4NSw4ICsyMjc4LDcgQEAKIAlpZiAoYykgewogCQkqYmVoYXZpb3IgPSBjLT52LmJlaGF2aW9yOwogCQlpZiAoIWMtPnNpZFswXSkgewotCQkJcmMgPSBzaWR0YWJfY29udGV4dF90b19zaWQoJnNpZHRhYiwKLQkJCQkJCSAgICZjLT5jb250ZXh0WzBdLAorCQkJcmMgPSBzaWR0YWJfY29udGV4dF90b19zaWQoJnNpZHRhYiwgJmMtPmNvbnRleHRbMF0sCiAJCQkJCQkgICAmYy0+c2lkWzBdKTsKIAkJCWlmIChyYykKIAkJCQlnb3RvIG91dDsKQEAgLTIzMDksMzQgKzIzMDEsMzkgQEAKIAogaW50IHNlY3VyaXR5X2dldF9ib29scyhpbnQgKmxlbiwgY2hhciAqKipuYW1lcywgaW50ICoqdmFsdWVzKQogewotCWludCBpLCByYyA9IC1FTk9NRU07CisJaW50IGksIHJjOwogCiAJcmVhZF9sb2NrKCZwb2xpY3lfcndsb2NrKTsKIAkqbmFtZXMgPSBOVUxMOwogCSp2YWx1ZXMgPSBOVUxMOwogCisJcmMgPSAwOwogCSpsZW4gPSBwb2xpY3lkYi5wX2Jvb2xzLm5wcmltOwotCWlmICghKmxlbikgewotCQlyYyA9IDA7CisJaWYgKCEqbGVuKQogCQlnb3RvIG91dDsKLQl9CiAKLSAgICAgICAqbmFtZXMgPSBrY2FsbG9jKCpsZW4sIHNpemVvZihjaGFyICopLCBHRlBfQVRPTUlDKTsKKwlyYyA9IC1FTk9NRU07CisJKm5hbWVzID0ga2NhbGxvYygqbGVuLCBzaXplb2YoY2hhciAqKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCEqbmFtZXMpCiAJCWdvdG8gZXJyOwogCi0gICAgICAgKnZhbHVlcyA9IGtjYWxsb2MoKmxlbiwgc2l6ZW9mKGludCksIEdGUF9BVE9NSUMpOworCXJjID0gLUVOT01FTTsKKwkqdmFsdWVzID0ga2NhbGxvYygqbGVuLCBzaXplb2YoaW50KSwgR0ZQX0FUT01JQyk7CiAJaWYgKCEqdmFsdWVzKQogCQlnb3RvIGVycjsKIAogCWZvciAoaSA9IDA7IGkgPCAqbGVuOyBpKyspIHsKIAkJc2l6ZV90IG5hbWVfbGVuOworCiAJCSgqdmFsdWVzKVtpXSA9IHBvbGljeWRiLmJvb2xfdmFsX3RvX3N0cnVjdFtpXS0+c3RhdGU7Ci0JCW5hbWVfbGVuID0gc3RybGVuKHBvbGljeWRiLnBfYm9vbF92YWxfdG9fbmFtZVtpXSkgKyAxOwotCSAgICAgICAoKm5hbWVzKVtpXSA9IGttYWxsb2Moc2l6ZW9mKGNoYXIpICogbmFtZV9sZW4sIEdGUF9BVE9NSUMpOworCQluYW1lX2xlbiA9IHN0cmxlbihzeW1fbmFtZSgmcG9saWN5ZGIsIFNZTV9CT09MUywgaSkpICsgMTsKKworCQlyYyA9IC1FTk9NRU07CisJCSgqbmFtZXMpW2ldID0ga21hbGxvYyhzaXplb2YoY2hhcikgKiBuYW1lX2xlbiwgR0ZQX0FUT01JQyk7CiAJCWlmICghKCpuYW1lcylbaV0pCiAJCQlnb3RvIGVycjsKLQkJc3RybmNweSgoKm5hbWVzKVtpXSwgcG9saWN5ZGIucF9ib29sX3ZhbF90b19uYW1lW2ldLCBuYW1lX2xlbik7CisKKwkJc3RybmNweSgoKm5hbWVzKVtpXSwgc3ltX25hbWUoJnBvbGljeWRiLCBTWU1fQk9PTFMsIGkpLCBuYW1lX2xlbik7CiAJCSgqbmFtZXMpW2ldW25hbWVfbGVuIC0gMV0gPSAwOwogCX0KIAlyYyA9IDA7CkBAIC0yMzU1LDI0ICsyMzUyLDIzIEBACiAKIGludCBzZWN1cml0eV9zZXRfYm9vbHMoaW50IGxlbiwgaW50ICp2YWx1ZXMpCiB7Ci0JaW50IGksIHJjID0gMDsKKwlpbnQgaSwgcmM7CiAJaW50IGxlbnAsIHNlcW5vID0gMDsKIAlzdHJ1Y3QgY29uZF9ub2RlICpjdXI7CiAKIAl3cml0ZV9sb2NrX2lycSgmcG9saWN5X3J3bG9jayk7CiAKKwlyYyA9IC1FRkFVTFQ7CiAJbGVucCA9IHBvbGljeWRiLnBfYm9vbHMubnByaW07Ci0JaWYgKGxlbiAhPSBsZW5wKSB7Ci0JCXJjID0gLUVGQVVMVDsKKwlpZiAobGVuICE9IGxlbnApCiAJCWdvdG8gb3V0OwotCX0KIAogCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewogCQlpZiAoISF2YWx1ZXNbaV0gIT0gcG9saWN5ZGIuYm9vbF92YWxfdG9fc3RydWN0W2ldLT5zdGF0ZSkgewogCQkJYXVkaXRfbG9nKGN1cnJlbnQtPmF1ZGl0X2NvbnRleHQsIEdGUF9BVE9NSUMsCiAJCQkJQVVESVRfTUFDX0NPTkZJR19DSEFOR0UsCiAJCQkJImJvb2w9JXMgdmFsPSVkIG9sZF92YWw9JWQgYXVpZD0ldSBzZXM9JXUiLAotCQkJCXBvbGljeWRiLnBfYm9vbF92YWxfdG9fbmFtZVtpXSwKKwkJCQlzeW1fbmFtZSgmcG9saWN5ZGIsIFNZTV9CT09MUywgaSksCiAJCQkJISF2YWx1ZXNbaV0sCiAJCQkJcG9saWN5ZGIuYm9vbF92YWxfdG9fc3RydWN0W2ldLT5zdGF0ZSwKIAkJCQlhdWRpdF9nZXRfbG9naW51aWQoY3VycmVudCksCkBAIC0yMzkxLDcgKzIzODcsNyBAQAogCX0KIAogCXNlcW5vID0gKytsYXRlc3RfZ3JhbnRpbmc7Ci0KKwlyYyA9IDA7CiBvdXQ6CiAJd3JpdGVfdW5sb2NrX2lycSgmcG9saWN5X3J3bG9jayk7CiAJaWYgKCFyYykgewpAQCAtMjQwNSwxNiArMjQwMSwxNSBAQAogCiBpbnQgc2VjdXJpdHlfZ2V0X2Jvb2xfdmFsdWUoaW50IGJvb2wpCiB7Ci0JaW50IHJjID0gMDsKKwlpbnQgcmM7CiAJaW50IGxlbjsKIAogCXJlYWRfbG9jaygmcG9saWN5X3J3bG9jayk7CiAKKwlyYyA9IC1FRkFVTFQ7CiAJbGVuID0gcG9saWN5ZGIucF9ib29scy5ucHJpbTsKLQlpZiAoYm9vbCA+PSBsZW4pIHsKLQkJcmMgPSAtRUZBVUxUOworCWlmIChib29sID49IGxlbikKIAkJZ290byBvdXQ7Ci0JfQogCiAJcmMgPSBwb2xpY3lkYi5ib29sX3ZhbF90b19zdHJ1Y3RbYm9vbF0tPnN0YXRlOwogb3V0OgpAQCAtMjQ2NCw4ICsyNDU5LDkgQEAKIAlzdHJ1Y3QgY29udGV4dCBuZXdjb247CiAJY2hhciAqczsKIAl1MzIgbGVuOwotCWludCByYyA9IDA7CisJaW50IHJjOwogCisJcmMgPSAwOwogCWlmICghc3NfaW5pdGlhbGl6ZWQgfHwgIXBvbGljeWRiLm1sc19lbmFibGVkKSB7CiAJCSpuZXdfc2lkID0gc2lkOwogCQlnb3RvIG91dDsKQEAgLTI0NzQsMTkgKzI0NzAsMjAgQEAKIAljb250ZXh0X2luaXQoJm5ld2Nvbik7CiAKIAlyZWFkX2xvY2soJnBvbGljeV9yd2xvY2spOworCisJcmMgPSAtRUlOVkFMOwogCWNvbnRleHQxID0gc2lkdGFiX3NlYXJjaCgmc2lkdGFiLCBzaWQpOwogCWlmICghY29udGV4dDEpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiAlczogIHVucmVjb2duaXplZCBTSUQgJWRcbiIsCiAJCQlfX2Z1bmNfXywgc2lkKTsKLQkJcmMgPSAtRUlOVkFMOwogCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCisJcmMgPSAtRUlOVkFMOwogCWNvbnRleHQyID0gc2lkdGFiX3NlYXJjaCgmc2lkdGFiLCBtbHNfc2lkKTsKIAlpZiAoIWNvbnRleHQyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogJXM6ICB1bnJlY29nbml6ZWQgU0lEICVkXG4iLAogCQkJX19mdW5jX18sIG1sc19zaWQpOwotCQlyYyA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0X3VubG9jazsKIAl9CiAKQEAgLTI1MDAsMjAgKzI0OTcsMTcgQEAKIAkvKiBDaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIG5ldyBjb250ZXh0LiAqLwogCWlmICghcG9saWN5ZGJfY29udGV4dF9pc3ZhbGlkKCZwb2xpY3lkYiwgJm5ld2NvbikpIHsKIAkJcmMgPSBjb252ZXJ0X2NvbnRleHRfaGFuZGxlX2ludmFsaWRfY29udGV4dCgmbmV3Y29uKTsKLQkJaWYgKHJjKQotCQkJZ290byBiYWQ7CisJCWlmIChyYykgeworCQkJaWYgKCFjb250ZXh0X3N0cnVjdF90b19zdHJpbmcoJm5ld2NvbiwgJnMsICZsZW4pKSB7CisJCQkJYXVkaXRfbG9nKGN1cnJlbnQtPmF1ZGl0X2NvbnRleHQsIEdGUF9BVE9NSUMsIEFVRElUX1NFTElOVVhfRVJSLAorCQkJCQkgICJzZWN1cml0eV9zaWRfbWxzX2NvcHk6IGludmFsaWQgY29udGV4dCAlcyIsIHMpOworCQkJCWtmcmVlKHMpOworCQkJfQorCQkJZ290byBvdXRfdW5sb2NrOworCQl9CiAJfQogCiAJcmMgPSBzaWR0YWJfY29udGV4dF90b19zaWQoJnNpZHRhYiwgJm5ld2NvbiwgbmV3X3NpZCk7Ci0JZ290byBvdXRfdW5sb2NrOwotCi1iYWQ6Ci0JaWYgKCFjb250ZXh0X3N0cnVjdF90b19zdHJpbmcoJm5ld2NvbiwgJnMsICZsZW4pKSB7Ci0JCWF1ZGl0X2xvZyhjdXJyZW50LT5hdWRpdF9jb250ZXh0LCBHRlBfQVRPTUlDLCBBVURJVF9TRUxJTlVYX0VSUiwKLQkJCSAgInNlY3VyaXR5X3NpZF9tbHNfY29weTogaW52YWxpZCBjb250ZXh0ICVzIiwgcyk7Ci0JCWtmcmVlKHMpOwotCX0KLQogb3V0X3VubG9jazoKIAlyZWFkX3VubG9jaygmcG9saWN5X3J3bG9jayk7CiAJY29udGV4dF9kZXN0cm95KCZuZXdjb24pOwpAQCAtMjU0OSw2ICsyNTQzLDggQEAKIAlzdHJ1Y3QgY29udGV4dCAqbmxibF9jdHg7CiAJc3RydWN0IGNvbnRleHQgKnhmcm1fY3R4OwogCisJKnBlZXJfc2lkID0gU0VDU0lEX05VTEw7CisKIAkvKiBoYW5kbGUgdGhlIGNvbW1vbiAod2hpY2ggYWxzbyBoYXBwZW5zIHRvIGJlIHRoZSBzZXQgb2YgZWFzeSkgY2FzZXMKIAkgKiByaWdodCBhd2F5LCB0aGVzZSB0d28gaWYgc3RhdGVtZW50cyBjYXRjaCBldmVyeXRoaW5nIGludm9sdmluZyBhCiAJICogc2luZ2xlIG9yIGFic2VudCBwZWVyIFNJRC9sYWJlbCAqLwpAQCAtMjU2Nyw0MCArMjU2MywzNyBAQAogCS8qIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgc3NfaW5pdGlhbGl6ZWQgaGVyZSBzaW5jZSB0aGUgb25seSB3YXkgYm90aAogCSAqIG5sYmxfc2lkIGFuZCB4ZnJtX3NpZCBhcmUgbm90IGVxdWFsIHRvIFNFQ1NJRF9OVUxMIHdvdWxkIGJlIGlmIHRoZQogCSAqIHNlY3VyaXR5IHNlcnZlciB3YXMgaW5pdGlhbGl6ZWQgYW5kIHNzX2luaXRpYWxpemVkIHdhcyB0cnVlICovCi0JaWYgKCFwb2xpY3lkYi5tbHNfZW5hYmxlZCkgewotCQkqcGVlcl9zaWQgPSBTRUNTSURfTlVMTDsKKwlpZiAoIXBvbGljeWRiLm1sc19lbmFibGVkKQogCQlyZXR1cm4gMDsKLQl9CiAKIAlyZWFkX2xvY2soJnBvbGljeV9yd2xvY2spOwogCisJcmMgPSAtRUlOVkFMOwogCW5sYmxfY3R4ID0gc2lkdGFiX3NlYXJjaCgmc2lkdGFiLCBubGJsX3NpZCk7CiAJaWYgKCFubGJsX2N0eCkgewogCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6ICVzOiAgdW5yZWNvZ25pemVkIFNJRCAlZFxuIiwKIAkJICAgICAgIF9fZnVuY19fLCBubGJsX3NpZCk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBvdXRfc2xvd3BhdGg7CisJCWdvdG8gb3V0OwogCX0KKwlyYyA9IC1FSU5WQUw7CiAJeGZybV9jdHggPSBzaWR0YWJfc2VhcmNoKCZzaWR0YWIsIHhmcm1fc2lkKTsKIAlpZiAoIXhmcm1fY3R4KSB7CiAJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogJXM6ICB1bnJlY29nbml6ZWQgU0lEICVkXG4iLAogCQkgICAgICAgX19mdW5jX18sIHhmcm1fc2lkKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIG91dF9zbG93cGF0aDsKKwkJZ290byBvdXQ7CiAJfQogCXJjID0gKG1sc19jb250ZXh0X2NtcChubGJsX2N0eCwgeGZybV9jdHgpID8gMCA6IC1FQUNDRVMpOworCWlmIChyYykKKwkJZ290byBvdXQ7CiAKLW91dF9zbG93cGF0aDoKKwkvKiBhdCBwcmVzZW50IE5ldExhYmVsIFNJRHMvbGFiZWxzIHJlYWxseSBvbmx5IGNhcnJ5IE1MUworCSAqIGluZm9ybWF0aW9uIHNvIGlmIHRoZSBNTFMgcG9ydGlvbiBvZiB0aGUgTmV0TGFiZWwgU0lECisJICogbWF0Y2hlcyB0aGUgTUxTIHBvcnRpb24gb2YgdGhlIGxhYmVsZWQgWEZSTSBTSUQvbGFiZWwKKwkgKiB0aGVuIHBhc3MgYWxvbmcgdGhlIFhGUk0gU0lEIGFzIGl0IGlzIHRoZSBtb3N0CisJICogZXhwcmVzc2l2ZSAqLworCSpwZWVyX3NpZCA9IHhmcm1fc2lkOworb3V0OgogCXJlYWRfdW5sb2NrKCZwb2xpY3lfcndsb2NrKTsKLQlpZiAocmMgPT0gMCkKLQkJLyogYXQgcHJlc2VudCBOZXRMYWJlbCBTSURzL2xhYmVscyByZWFsbHkgb25seSBjYXJyeSBNTFMKLQkJICogaW5mb3JtYXRpb24gc28gaWYgdGhlIE1MUyBwb3J0aW9uIG9mIHRoZSBOZXRMYWJlbCBTSUQKLQkJICogbWF0Y2hlcyB0aGUgTUxTIHBvcnRpb24gb2YgdGhlIGxhYmVsZWQgWEZSTSBTSUQvbGFiZWwKLQkJICogdGhlbiBwYXNzIGFsb25nIHRoZSBYRlJNIFNJRCBhcyBpdCBpcyB0aGUgbW9zdAotCQkgKiBleHByZXNzaXZlICovCi0JCSpwZWVyX3NpZCA9IHhmcm1fc2lkOwotCWVsc2UKLQkJKnBlZXJfc2lkID0gU0VDU0lEX05VTEw7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0yNjE5LDEwICsyNjEyLDExIEBACiAKIGludCBzZWN1cml0eV9nZXRfY2xhc3NlcyhjaGFyICoqKmNsYXNzZXMsIGludCAqbmNsYXNzZXMpCiB7Ci0JaW50IHJjID0gLUVOT01FTTsKKwlpbnQgcmM7CiAKIAlyZWFkX2xvY2soJnBvbGljeV9yd2xvY2spOwogCisJcmMgPSAtRU5PTUVNOwogCSpuY2xhc3NlcyA9IHBvbGljeWRiLnBfY2xhc3Nlcy5ucHJpbTsKIAkqY2xhc3NlcyA9IGtjYWxsb2MoKm5jbGFzc2VzLCBzaXplb2YoKipjbGFzc2VzKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCEqY2xhc3NlcykKQEAgLTI2MzAsNyArMjYyNCw3IEBACiAKIAlyYyA9IGhhc2h0YWJfbWFwKHBvbGljeWRiLnBfY2xhc3Nlcy50YWJsZSwgZ2V0X2NsYXNzZXNfY2FsbGJhY2ssCiAJCQkqY2xhc3Nlcyk7Ci0JaWYgKHJjIDwgMCkgeworCWlmIChyYykgewogCQlpbnQgaTsKIAkJZm9yIChpID0gMDsgaSA8ICpuY2xhc3NlczsgaSsrKQogCQkJa2ZyZWUoKCpjbGFzc2VzKVtpXSk7CkBAIC0yNjU3LDE5ICsyNjUxLDIwIEBACiAKIGludCBzZWN1cml0eV9nZXRfcGVybWlzc2lvbnMoY2hhciAqY2xhc3MsIGNoYXIgKioqcGVybXMsIGludCAqbnBlcm1zKQogewotCWludCByYyA9IC1FTk9NRU0sIGk7CisJaW50IHJjLCBpOwogCXN0cnVjdCBjbGFzc19kYXR1bSAqbWF0Y2g7CiAKIAlyZWFkX2xvY2soJnBvbGljeV9yd2xvY2spOwogCisJcmMgPSAtRUlOVkFMOwogCW1hdGNoID0gaGFzaHRhYl9zZWFyY2gocG9saWN5ZGIucF9jbGFzc2VzLnRhYmxlLCBjbGFzcyk7CiAJaWYgKCFtYXRjaCkgewogCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6ICVzOiAgdW5yZWNvZ25pemVkIGNsYXNzICVzXG4iLAogCQkJX19mdW5jX18sIGNsYXNzKTsKLQkJcmMgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CiAKKwlyYyA9IC1FTk9NRU07CiAJKm5wZXJtcyA9IG1hdGNoLT5wZXJtaXNzaW9ucy5ucHJpbTsKIAkqcGVybXMgPSBrY2FsbG9jKCpucGVybXMsIHNpemVvZigqKnBlcm1zKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCEqcGVybXMpCkBAIC0yNjc4LDEzICsyNjczLDEzIEBACiAJaWYgKG1hdGNoLT5jb21kYXR1bSkgewogCQlyYyA9IGhhc2h0YWJfbWFwKG1hdGNoLT5jb21kYXR1bS0+cGVybWlzc2lvbnMudGFibGUsCiAJCQkJZ2V0X3Blcm1pc3Npb25zX2NhbGxiYWNrLCAqcGVybXMpOwotCQlpZiAocmMgPCAwKQorCQlpZiAocmMpCiAJCQlnb3RvIGVycjsKIAl9CiAKIAlyYyA9IGhhc2h0YWJfbWFwKG1hdGNoLT5wZXJtaXNzaW9ucy50YWJsZSwgZ2V0X3Blcm1pc3Npb25zX2NhbGxiYWNrLAogCQkJKnBlcm1zKTsKLQlpZiAocmMgPCAwKQorCWlmIChyYykKIAkJZ290byBlcnI7CiAKIG91dDoKQEAgLTI3OTYsMzYgKzI3OTEsMzkgQEAKIAlzd2l0Y2ggKGZpZWxkKSB7CiAJY2FzZSBBVURJVF9TVUJKX1VTRVI6CiAJY2FzZSBBVURJVF9PQkpfVVNFUjoKKwkJcmMgPSAtRUlOVkFMOwogCQl1c2VyZGF0dW0gPSBoYXNodGFiX3NlYXJjaChwb2xpY3lkYi5wX3VzZXJzLnRhYmxlLCBydWxlc3RyKTsKIAkJaWYgKCF1c2VyZGF0dW0pCi0JCQlyYyA9IC1FSU5WQUw7Ci0JCWVsc2UKLQkJCXRtcHJ1bGUtPmF1X2N0eHQudXNlciA9IHVzZXJkYXR1bS0+dmFsdWU7CisJCQlnb3RvIG91dDsKKwkJdG1wcnVsZS0+YXVfY3R4dC51c2VyID0gdXNlcmRhdHVtLT52YWx1ZTsKIAkJYnJlYWs7CiAJY2FzZSBBVURJVF9TVUJKX1JPTEU6CiAJY2FzZSBBVURJVF9PQkpfUk9MRToKKwkJcmMgPSAtRUlOVkFMOwogCQlyb2xlZGF0dW0gPSBoYXNodGFiX3NlYXJjaChwb2xpY3lkYi5wX3JvbGVzLnRhYmxlLCBydWxlc3RyKTsKIAkJaWYgKCFyb2xlZGF0dW0pCi0JCQlyYyA9IC1FSU5WQUw7Ci0JCWVsc2UKLQkJCXRtcHJ1bGUtPmF1X2N0eHQucm9sZSA9IHJvbGVkYXR1bS0+dmFsdWU7CisJCQlnb3RvIG91dDsKKwkJdG1wcnVsZS0+YXVfY3R4dC5yb2xlID0gcm9sZWRhdHVtLT52YWx1ZTsKIAkJYnJlYWs7CiAJY2FzZSBBVURJVF9TVUJKX1RZUEU6CiAJY2FzZSBBVURJVF9PQkpfVFlQRToKKwkJcmMgPSAtRUlOVkFMOwogCQl0eXBlZGF0dW0gPSBoYXNodGFiX3NlYXJjaChwb2xpY3lkYi5wX3R5cGVzLnRhYmxlLCBydWxlc3RyKTsKIAkJaWYgKCF0eXBlZGF0dW0pCi0JCQlyYyA9IC1FSU5WQUw7Ci0JCWVsc2UKLQkJCXRtcHJ1bGUtPmF1X2N0eHQudHlwZSA9IHR5cGVkYXR1bS0+dmFsdWU7CisJCQlnb3RvIG91dDsKKwkJdG1wcnVsZS0+YXVfY3R4dC50eXBlID0gdHlwZWRhdHVtLT52YWx1ZTsKIAkJYnJlYWs7CiAJY2FzZSBBVURJVF9TVUJKX1NFTjoKIAljYXNlIEFVRElUX1NVQkpfQ0xSOgogCWNhc2UgQVVESVRfT0JKX0xFVl9MT1c6CiAJY2FzZSBBVURJVF9PQkpfTEVWX0hJR0g6CiAJCXJjID0gbWxzX2Zyb21fc3RyaW5nKHJ1bGVzdHIsICZ0bXBydWxlLT5hdV9jdHh0LCBHRlBfQVRPTUlDKTsKKwkJaWYgKHJjKQorCQkJZ290byBvdXQ7CiAJCWJyZWFrOwogCX0KLQorCXJjID0gMDsKK291dDoKIAlyZWFkX3VubG9jaygmcG9saWN5X3J3bG9jayk7CiAKIAlpZiAocmMpIHsKQEAgLTMwNTAsNyArMzA0OCw3IEBACiBpbnQgc2VjdXJpdHlfbmV0bGJsX3NlY2F0dHJfdG9fc2lkKHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIsCiAJCQkJICAgdTMyICpzaWQpCiB7Ci0JaW50IHJjID0gLUVJRFJNOworCWludCByYzsKIAlzdHJ1Y3QgY29udGV4dCAqY3R4OwogCXN0cnVjdCBjb250ZXh0IGN0eF9uZXc7CiAKQEAgLTMwNjEsMTYgKzMwNTksMTUgQEAKIAogCXJlYWRfbG9jaygmcG9saWN5X3J3bG9jayk7CiAKLQlpZiAoc2VjYXR0ci0+ZmxhZ3MgJiBORVRMQkxfU0VDQVRUUl9DQUNIRSkgeworCWlmIChzZWNhdHRyLT5mbGFncyAmIE5FVExCTF9TRUNBVFRSX0NBQ0hFKQogCQkqc2lkID0gKih1MzIgKilzZWNhdHRyLT5jYWNoZS0+ZGF0YTsKLQkJcmMgPSAwOwotCX0gZWxzZSBpZiAoc2VjYXR0ci0+ZmxhZ3MgJiBORVRMQkxfU0VDQVRUUl9TRUNJRCkgeworCWVsc2UgaWYgKHNlY2F0dHItPmZsYWdzICYgTkVUTEJMX1NFQ0FUVFJfU0VDSUQpCiAJCSpzaWQgPSBzZWNhdHRyLT5hdHRyLnNlY2lkOwotCQlyYyA9IDA7Ci0JfSBlbHNlIGlmIChzZWNhdHRyLT5mbGFncyAmIE5FVExCTF9TRUNBVFRSX01MU19MVkwpIHsKKwllbHNlIGlmIChzZWNhdHRyLT5mbGFncyAmIE5FVExCTF9TRUNBVFRSX01MU19MVkwpIHsKKwkJcmMgPSAtRUlEUk07CiAJCWN0eCA9IHNpZHRhYl9zZWFyY2goJnNpZHRhYiwgU0VDSU5JVFNJRF9ORVRNU0cpOwogCQlpZiAoY3R4ID09IE5VTEwpCi0JCQlnb3RvIG5ldGxibF9zZWNhdHRyX3RvX3NpZF9yZXR1cm47CisJCQlnb3RvIG91dDsKIAogCQljb250ZXh0X2luaXQoJmN0eF9uZXcpOwogCQljdHhfbmV3LnVzZXIgPSBjdHgtPnVzZXI7CkBAIC0zMDc4LDM0ICszMDc1LDM1IEBACiAJCWN0eF9uZXcudHlwZSA9IGN0eC0+dHlwZTsKIAkJbWxzX2ltcG9ydF9uZXRsYmxfbHZsKCZjdHhfbmV3LCBzZWNhdHRyKTsKIAkJaWYgKHNlY2F0dHItPmZsYWdzICYgTkVUTEJMX1NFQ0FUVFJfTUxTX0NBVCkgewotCQkJaWYgKGViaXRtYXBfbmV0bGJsX2ltcG9ydCgmY3R4X25ldy5yYW5nZS5sZXZlbFswXS5jYXQsCi0JCQkJCQkgIHNlY2F0dHItPmF0dHIubWxzLmNhdCkgIT0gMCkKLQkJCQlnb3RvIG5ldGxibF9zZWNhdHRyX3RvX3NpZF9yZXR1cm47CisJCQlyYyA9IGViaXRtYXBfbmV0bGJsX2ltcG9ydCgmY3R4X25ldy5yYW5nZS5sZXZlbFswXS5jYXQsCisJCQkJCQkgICBzZWNhdHRyLT5hdHRyLm1scy5jYXQpOworCQkJaWYgKHJjKQorCQkJCWdvdG8gb3V0OwogCQkJbWVtY3B5KCZjdHhfbmV3LnJhbmdlLmxldmVsWzFdLmNhdCwKIAkJCSAgICAgICAmY3R4X25ldy5yYW5nZS5sZXZlbFswXS5jYXQsCiAJCQkgICAgICAgc2l6ZW9mKGN0eF9uZXcucmFuZ2UubGV2ZWxbMF0uY2F0KSk7CiAJCX0KLQkJaWYgKG1sc19jb250ZXh0X2lzdmFsaWQoJnBvbGljeWRiLCAmY3R4X25ldykgIT0gMSkKLQkJCWdvdG8gbmV0bGJsX3NlY2F0dHJfdG9fc2lkX3JldHVybl9jbGVhbnVwOworCQlyYyA9IC1FSURSTTsKKwkJaWYgKCFtbHNfY29udGV4dF9pc3ZhbGlkKCZwb2xpY3lkYiwgJmN0eF9uZXcpKQorCQkJZ290byBvdXRfZnJlZTsKIAogCQlyYyA9IHNpZHRhYl9jb250ZXh0X3RvX3NpZCgmc2lkdGFiLCAmY3R4X25ldywgc2lkKTsKLQkJaWYgKHJjICE9IDApCi0JCQlnb3RvIG5ldGxibF9zZWNhdHRyX3RvX3NpZF9yZXR1cm5fY2xlYW51cDsKKwkJaWYgKHJjKQorCQkJZ290byBvdXRfZnJlZTsKIAogCQlzZWN1cml0eV9uZXRsYmxfY2FjaGVfYWRkKHNlY2F0dHIsICpzaWQpOwogCiAJCWViaXRtYXBfZGVzdHJveSgmY3R4X25ldy5yYW5nZS5sZXZlbFswXS5jYXQpOwotCX0gZWxzZSB7CisJfSBlbHNlCiAJCSpzaWQgPSBTRUNTSURfTlVMTDsKLQkJcmMgPSAwOwotCX0KIAotbmV0bGJsX3NlY2F0dHJfdG9fc2lkX3JldHVybjoKKwlyZWFkX3VubG9jaygmcG9saWN5X3J3bG9jayk7CisJcmV0dXJuIDA7CitvdXRfZnJlZToKKwllYml0bWFwX2Rlc3Ryb3koJmN0eF9uZXcucmFuZ2UubGV2ZWxbMF0uY2F0KTsKK291dDoKIAlyZWFkX3VubG9jaygmcG9saWN5X3J3bG9jayk7CiAJcmV0dXJuIHJjOwotbmV0bGJsX3NlY2F0dHJfdG9fc2lkX3JldHVybl9jbGVhbnVwOgotCWViaXRtYXBfZGVzdHJveSgmY3R4X25ldy5yYW5nZS5sZXZlbFswXS5jYXQpOwotCWdvdG8gbmV0bGJsX3NlY2F0dHJfdG9fc2lkX3JldHVybjsKIH0KIAogLyoqCkBAIC0zMTI3LDI4ICszMTI1LDIzIEBACiAJCXJldHVybiAwOwogCiAJcmVhZF9sb2NrKCZwb2xpY3lfcndsb2NrKTsKKworCXJjID0gLUVOT0VOVDsKIAljdHggPSBzaWR0YWJfc2VhcmNoKCZzaWR0YWIsIHNpZCk7Ci0JaWYgKGN0eCA9PSBOVUxMKSB7Ci0JCXJjID0gLUVOT0VOVDsKLQkJZ290byBuZXRsYmxfc2lkX3RvX3NlY2F0dHJfZmFpbHVyZTsKLQl9Ci0Jc2VjYXR0ci0+ZG9tYWluID0ga3N0cmR1cChwb2xpY3lkYi5wX3R5cGVfdmFsX3RvX25hbWVbY3R4LT50eXBlIC0gMV0sCisJaWYgKGN0eCA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCXJjID0gLUVOT01FTTsKKwlzZWNhdHRyLT5kb21haW4gPSBrc3RyZHVwKHN5bV9uYW1lKCZwb2xpY3lkYiwgU1lNX1RZUEVTLCBjdHgtPnR5cGUgLSAxKSwKIAkJCQkgIEdGUF9BVE9NSUMpOwotCWlmIChzZWNhdHRyLT5kb21haW4gPT0gTlVMTCkgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gbmV0bGJsX3NpZF90b19zZWNhdHRyX2ZhaWx1cmU7Ci0JfQorCWlmIChzZWNhdHRyLT5kb21haW4gPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKIAlzZWNhdHRyLT5hdHRyLnNlY2lkID0gc2lkOwogCXNlY2F0dHItPmZsYWdzIHw9IE5FVExCTF9TRUNBVFRSX0RPTUFJTl9DUFkgfCBORVRMQkxfU0VDQVRUUl9TRUNJRDsKIAltbHNfZXhwb3J0X25ldGxibF9sdmwoY3R4LCBzZWNhdHRyKTsKIAlyYyA9IG1sc19leHBvcnRfbmV0bGJsX2NhdChjdHgsIHNlY2F0dHIpOwotCWlmIChyYyAhPSAwKQotCQlnb3RvIG5ldGxibF9zaWRfdG9fc2VjYXR0cl9mYWlsdXJlOwotCXJlYWRfdW5sb2NrKCZwb2xpY3lfcndsb2NrKTsKLQotCXJldHVybiAwOwotCi1uZXRsYmxfc2lkX3RvX3NlY2F0dHJfZmFpbHVyZToKK291dDoKIAlyZWFkX3VubG9jaygmcG9saWN5X3J3bG9jayk7CiAJcmV0dXJuIHJjOwogfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zcy9zaWR0YWIuYyBiL3NlY3VyaXR5L3NlbGludXgvc3Mvc2lkdGFiLmMKaW5kZXggZTgxNzk4OS4uNTg0MGEzNSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9zaWR0YWIuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L3NzL3NpZHRhYi5jCkBAIC0xNDcsNiArMTQ3LDE3IEBACiAJcmV0dXJuIHJjOwogfQogCitzdGF0aWMgdm9pZCBzaWR0YWJfdXBkYXRlX2NhY2hlKHN0cnVjdCBzaWR0YWIgKnMsIHN0cnVjdCBzaWR0YWJfbm9kZSAqbiwgaW50IGxvYykKK3sKKwlCVUdfT04obG9jID49IFNJRFRBQl9DQUNIRV9MRU4pOworCisJd2hpbGUgKGxvYyA+IDApIHsKKwkJcy0+Y2FjaGVbbG9jXSA9IHMtPmNhY2hlW2xvYyAtIDFdOworCQlsb2MtLTsKKwl9CisJcy0+Y2FjaGVbMF0gPSBuOworfQorCiBzdGF0aWMgaW5saW5lIHUzMiBzaWR0YWJfc2VhcmNoX2NvbnRleHQoc3RydWN0IHNpZHRhYiAqcywKIAkJCQkJCSAgc3RydWN0IGNvbnRleHQgKmNvbnRleHQpCiB7CkBAIC0xNTYsMTQgKzE2NywzMyBAQAogCWZvciAoaSA9IDA7IGkgPCBTSURUQUJfU0laRTsgaSsrKSB7CiAJCWN1ciA9IHMtPmh0YWJsZVtpXTsKIAkJd2hpbGUgKGN1cikgewotCQkJaWYgKGNvbnRleHRfY21wKCZjdXItPmNvbnRleHQsIGNvbnRleHQpKQorCQkJaWYgKGNvbnRleHRfY21wKCZjdXItPmNvbnRleHQsIGNvbnRleHQpKSB7CisJCQkJc2lkdGFiX3VwZGF0ZV9jYWNoZShzLCBjdXIsIFNJRFRBQl9DQUNIRV9MRU4gLSAxKTsKIAkJCQlyZXR1cm4gY3VyLT5zaWQ7CisJCQl9CiAJCQljdXIgPSBjdXItPm5leHQ7CiAJCX0KIAl9CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdTMyIHNpZHRhYl9zZWFyY2hfY2FjaGUoc3RydWN0IHNpZHRhYiAqcywgc3RydWN0IGNvbnRleHQgKmNvbnRleHQpCit7CisJaW50IGk7CisJc3RydWN0IHNpZHRhYl9ub2RlICpub2RlOworCisJZm9yIChpID0gMDsgaSA8IFNJRFRBQl9DQUNIRV9MRU47IGkrKykgeworCQlub2RlID0gcy0+Y2FjaGVbaV07CisJCWlmICh1bmxpa2VseSghbm9kZSkpCisJCQlyZXR1cm4gMDsKKwkJaWYgKGNvbnRleHRfY21wKCZub2RlLT5jb250ZXh0LCBjb250ZXh0KSkgeworCQkJc2lkdGFiX3VwZGF0ZV9jYWNoZShzLCBub2RlLCBpKTsKKwkJCXJldHVybiBub2RlLT5zaWQ7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKIGludCBzaWR0YWJfY29udGV4dF90b19zaWQoc3RydWN0IHNpZHRhYiAqcywKIAkJCSAgc3RydWN0IGNvbnRleHQgKmNvbnRleHQsCiAJCQkgIHUzMiAqb3V0X3NpZCkKQEAgLTE3NCw3ICsyMDQsOSBAQAogCiAJKm91dF9zaWQgPSBTRUNTSURfTlVMTDsKIAotCXNpZCA9IHNpZHRhYl9zZWFyY2hfY29udGV4dChzLCBjb250ZXh0KTsKKwlzaWQgID0gc2lkdGFiX3NlYXJjaF9jYWNoZShzLCBjb250ZXh0KTsKKwlpZiAoIXNpZCkKKwkJc2lkID0gc2lkdGFiX3NlYXJjaF9jb250ZXh0KHMsIGNvbnRleHQpOwogCWlmICghc2lkKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CiAJCS8qIFJlc2NhbiBub3cgdGhhdCB3ZSBob2xkIHRoZSBsb2NrLiAqLwpAQCAtMjU5LDEyICsyOTEsMTUgQEAKIHZvaWQgc2lkdGFiX3NldChzdHJ1Y3Qgc2lkdGFiICpkc3QsIHN0cnVjdCBzaWR0YWIgKnNyYykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnNyYy0+bG9jaywgZmxhZ3MpOwogCWRzdC0+aHRhYmxlID0gc3JjLT5odGFibGU7CiAJZHN0LT5uZWwgPSBzcmMtPm5lbDsKIAlkc3QtPm5leHRfc2lkID0gc3JjLT5uZXh0X3NpZDsKIAlkc3QtPnNodXRkb3duID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgU0lEVEFCX0NBQ0hFX0xFTjsgaSsrKQorCQlkc3QtPmNhY2hlW2ldID0gTlVMTDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcmMtPmxvY2ssIGZsYWdzKTsKIH0KIApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zcy9zaWR0YWIuaCBiL3NlY3VyaXR5L3NlbGludXgvc3Mvc2lkdGFiLmgKaW5kZXggNjRlYTViMS4uODRkYzE1NCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9zaWR0YWIuaAorKysgYi9zZWN1cml0eS9zZWxpbnV4L3NzL3NpZHRhYi5oCkBAIC0yNiw2ICsyNiw4IEBACiAJdW5zaWduZWQgaW50IG5lbDsJLyogbnVtYmVyIG9mIGVsZW1lbnRzICovCiAJdW5zaWduZWQgaW50IG5leHRfc2lkOwkvKiBuZXh0IFNJRCB0byBhbGxvY2F0ZSAqLwogCXVuc2lnbmVkIGNoYXIgc2h1dGRvd247CisjZGVmaW5lIFNJRFRBQl9DQUNIRV9MRU4JMworCXN0cnVjdCBzaWR0YWJfbm9kZSAqY2FjaGVbU0lEVEFCX0NBQ0hFX0xFTl07CiAJc3BpbmxvY2tfdCBsb2NrOwogfTsKIApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc21hY2svc21hY2suaCBiL3NlY3VyaXR5L3NtYWNrL3NtYWNrLmgKaW5kZXggNDNhZTc0Ny4uMTI5YzRlYiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc21hY2svc21hY2suaAorKysgYi9zZWN1cml0eS9zbWFjay9zbWFjay5oCkBAIC01MSwxMSArNTEsMTggQEAKICAqLwogc3RydWN0IGlub2RlX3NtYWNrIHsKIAljaGFyCQkqc21rX2lub2RlOwkvKiBsYWJlbCBvZiB0aGUgZnNvICovCisJY2hhcgkJKnNta190YXNrOwkvKiBsYWJlbCBvZiB0aGUgdGFzayAqLwogCXN0cnVjdCBtdXRleAlzbWtfbG9jazsJLyogaW5pdGlhbGl6YXRpb24gbG9jayAqLwogCWludAkJc21rX2ZsYWdzOwkvKiBzbWFjayBpbm9kZSBmbGFncyAqLwogfTsKIAorc3RydWN0IHRhc2tfc21hY2sgeworCWNoYXIJCSpzbWtfdGFzazsJLyogbGFiZWwgdXNlZCBmb3IgYWNjZXNzIGNvbnRyb2wgKi8KKwljaGFyCQkqc21rX2ZvcmtlZDsJLyogbGFiZWwgd2hlbiBmb3JrZWQgKi8KK307CisKICNkZWZpbmUJU01LX0lOT0RFX0lOU1RBTlQJMHgwMQkvKiBpbm9kZSBpcyBpbnN0YW50aWF0ZWQgKi8KKyNkZWZpbmUJU01LX0lOT0RFX1RSQU5TTVVURQkweDAyCS8qIGRpcmVjdG9yeSBpcyB0cmFuc211dGluZyAqLwogCiAvKgogICogQSBsYWJlbCBhY2Nlc3MgcnVsZS4KQEAgLTE2MSw2ICsxNjgsMTAgQEAKICNkZWZpbmUgU01BQ0tfQ0lQU09fTUFYQ0FUTlVNICAgICAgICAgICAyMzkgICAgIC8qIENJUFNPIDIuMiBzdGFuZGFyZCAqLwogCiAvKgorICogRmxhZyBmb3IgdHJhbnNtdXRlIGFjY2VzcworICovCisjZGVmaW5lIE1BWV9UUkFOU01VVEUJNjQKKy8qCiAgKiBKdXN0IHRvIG1ha2UgdGhlIGNvbW1vbiBjYXNlcyBlYXNpZXIgdG8gZGVhbCB3aXRoCiAgKi8KICNkZWZpbmUgTUFZX0FOWQkJKE1BWV9SRUFEIHwgTUFZX1dSSVRFIHwgTUFZX0FQUEVORCB8IE1BWV9FWEVDKQpAQCAtMTkxLDYgKzIwMiw3IEBACiAvKgogICogVGhlc2UgZnVuY3Rpb25zIGFyZSBpbiBzbWFja19hY2Nlc3MuYwogICovCitpbnQgc21rX2FjY2Vzc19lbnRyeShjaGFyICosIGNoYXIgKik7CiBpbnQgc21rX2FjY2VzcyhjaGFyICosIGNoYXIgKiwgaW50LCBzdHJ1Y3Qgc21rX2F1ZGl0X2luZm8gKik7CiBpbnQgc21rX2N1cmFjYyhjaGFyICosIHUzMiwgc3RydWN0IHNta19hdWRpdF9pbmZvICopOwogaW50IHNtYWNrX3RvX2NpcHNvKGNvbnN0IGNoYXIgKiwgc3RydWN0IHNtYWNrX2NpcHNvICopOwpAQCAtMjM0LDYgKzI0NiwxNSBAQAogfQogCiAvKgorICogSXMgdGhlIGRpcmVjdG9yeSB0cmFuc211dGluZz8KKyAqLworc3RhdGljIGlubGluZSBpbnQgc21rX2lub2RlX3RyYW5zbXV0YWJsZShjb25zdCBzdHJ1Y3QgaW5vZGUgKmlzcCkKK3sKKwlzdHJ1Y3QgaW5vZGVfc21hY2sgKnNpcCA9IGlzcC0+aV9zZWN1cml0eTsKKwlyZXR1cm4gKHNpcC0+c21rX2ZsYWdzICYgU01LX0lOT0RFX1RSQU5TTVVURSkgIT0gMDsKK30KKworLyoKICAqIFByZXNlbnQgYSBwb2ludGVyIHRvIHRoZSBzbWFjayBsYWJlbCBpbiBhbiBpbm9kZSBibG9iLgogICovCiBzdGF0aWMgaW5saW5lIGNoYXIgKnNta19vZl9pbm9kZShjb25zdCBzdHJ1Y3QgaW5vZGUgKmlzcCkKQEAgLTI0Myw2ICsyNjQsMzAgQEAKIH0KIAogLyoKKyAqIFByZXNlbnQgYSBwb2ludGVyIHRvIHRoZSBzbWFjayBsYWJlbCBpbiBhbiB0YXNrIGJsb2IuCisgKi8KK3N0YXRpYyBpbmxpbmUgY2hhciAqc21rX29mX3Rhc2soY29uc3Qgc3RydWN0IHRhc2tfc21hY2sgKnRzcCkKK3sKKwlyZXR1cm4gdHNwLT5zbWtfdGFzazsKK30KKworLyoKKyAqIFByZXNlbnQgYSBwb2ludGVyIHRvIHRoZSBmb3JrZWQgc21hY2sgbGFiZWwgaW4gYW4gdGFzayBibG9iLgorICovCitzdGF0aWMgaW5saW5lIGNoYXIgKnNta19vZl9mb3JrZWQoY29uc3Qgc3RydWN0IHRhc2tfc21hY2sgKnRzcCkKK3sKKwlyZXR1cm4gdHNwLT5zbWtfZm9ya2VkOworfQorCisvKgorICogUHJlc2VudCBhIHBvaW50ZXIgdG8gdGhlIHNtYWNrIGxhYmVsIGluIHRoZSBjdXJyZW50IHRhc2sgYmxvYi4KKyAqLworc3RhdGljIGlubGluZSBjaGFyICpzbWtfb2ZfY3VycmVudCh2b2lkKQoreworCXJldHVybiBzbWtfb2ZfdGFzayhjdXJyZW50X3NlY3VyaXR5KCkpOworfQorCisvKgogICogbG9nZ2luZyBmdW5jdGlvbnMKICAqLwogI2RlZmluZSBTTUFDS19BVURJVF9ERU5JRUQgMHgxCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zbWFjay9zbWFja19hY2Nlc3MuYyBiL3NlY3VyaXR5L3NtYWNrL3NtYWNrX2FjY2Vzcy5jCmluZGV4IGY0ZmFjNjQuLjdiYTg0NzggMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrX2FjY2Vzcy5jCisrKyBiL3NlY3VyaXR5L3NtYWNrL3NtYWNrX2FjY2Vzcy5jCkBAIC02Nyw2ICs2Nyw0NiBAQAogaW50IGxvZ19wb2xpY3kgPSBTTUFDS19BVURJVF9ERU5JRUQ7CiAKIC8qKgorICogc21rX2FjY2Vzc19lbnRyeSAtIGxvb2sgdXAgbWF0Y2hpbmcgYWNjZXNzIHJ1bGUKKyAqIEBzdWJqZWN0X2xhYmVsOiBhIHBvaW50ZXIgdG8gdGhlIHN1YmplY3QncyBTbWFjayBsYWJlbAorICogQG9iamVjdF9sYWJlbDogYSBwb2ludGVyIHRvIHRoZSBvYmplY3QncyBTbWFjayBsYWJlbAorICoKKyAqIFRoaXMgZnVuY3Rpb24gbG9va3MgdXAgdGhlIHN1YmplY3Qvb2JqZWN0IHBhaXIgaW4gdGhlCisgKiBhY2Nlc3MgcnVsZSBsaXN0IGFuZCByZXR1cm5zIHBvaW50ZXIgdG8gdGhlIG1hdGNoaW5nIHJ1bGUgaWYgZm91bmQsCisgKiBOVUxMIG90aGVyd2lzZS4KKyAqCisgKiBOT1RFOgorICogRXZlbiB0aG91Z2ggU21hY2sgbGFiZWxzIGFyZSB1c3VhbGx5IHNoYXJlZCBvbiBzbWFja19saXN0CisgKiBsYWJlbHMgdGhhdCBjb21lIGluIG9mZiB0aGUgbmV0d29yayBjYW4ndCBiZSBpbXBvcnRlZAorICogYW5kIGFkZGVkIHRvIHRoZSBsaXN0IGZvciBsb2NraW5nIHJlYXNvbnMuCisgKgorICogVGhlcmVmb3JlLCBpdCBpcyBuZWNlc3NhcnkgdG8gY2hlY2sgdGhlIGNvbnRlbnRzIG9mIHRoZSBsYWJlbHMsCisgKiBub3QganVzdCB0aGUgcG9pbnRlciB2YWx1ZXMuIE9mIGNvdXJzZSwgaW4gbW9zdCBjYXNlcyB0aGUgbGFiZWxzCisgKiB3aWxsIGJlIG9uIHRoZSBsaXN0LCBzbyBjaGVja2luZyB0aGUgcG9pbnRlcnMgbWF5IGJlIGEgd29ydGh3aGlsZQorICogb3B0aW1pemF0aW9uLgorICovCitpbnQgc21rX2FjY2Vzc19lbnRyeShjaGFyICpzdWJqZWN0X2xhYmVsLCBjaGFyICpvYmplY3RfbGFiZWwpCit7CisJdTMyIG1heSA9IE1BWV9OT1Q7CisJc3RydWN0IHNtYWNrX3J1bGUgKnNycDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShzcnAsICZzbWFja19ydWxlX2xpc3QsIGxpc3QpIHsKKwkJaWYgKHNycC0+c21rX3N1YmplY3QgPT0gc3ViamVjdF9sYWJlbCB8fAorCQkgICAgc3RyY21wKHNycC0+c21rX3N1YmplY3QsIHN1YmplY3RfbGFiZWwpID09IDApIHsKKwkJCWlmIChzcnAtPnNta19vYmplY3QgPT0gb2JqZWN0X2xhYmVsIHx8CisJCQkgICAgc3RyY21wKHNycC0+c21rX29iamVjdCwgb2JqZWN0X2xhYmVsKSA9PSAwKSB7CisJCQkJbWF5ID0gc3JwLT5zbWtfYWNjZXNzOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCisJcmV0dXJuIG1heTsKK30KKworLyoqCiAgKiBzbWtfYWNjZXNzIC0gZGV0ZXJtaW5lIGlmIGEgc3ViamVjdCBoYXMgYSBzcGVjaWZpYyBhY2Nlc3MgdG8gYW4gb2JqZWN0CiAgKiBAc3ViamVjdF9sYWJlbDogYSBwb2ludGVyIHRvIHRoZSBzdWJqZWN0J3MgU21hY2sgbGFiZWwKICAqIEBvYmplY3RfbGFiZWw6IGEgcG9pbnRlciB0byB0aGUgb2JqZWN0J3MgU21hY2sgbGFiZWwKQEAgLTkwLDcgKzEzMCw2IEBACiAJICAgICAgIHN0cnVjdCBzbWtfYXVkaXRfaW5mbyAqYSkKIHsKIAl1MzIgbWF5ID0gTUFZX05PVDsKLQlzdHJ1Y3Qgc21hY2tfcnVsZSAqc3JwOwogCWludCByYyA9IDA7CiAKIAkvKgpAQCAtMTQ0LDE4ICsxODMsNyBAQAogCSAqIGFjY2VzcyAoZS5nLiByZWFkIGlzIGluY2x1ZGVkIGluIHJlYWR3cml0ZSkgaXQncwogCSAqIGdvb2QuCiAJICovCi0JcmN1X3JlYWRfbG9jaygpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHNycCwgJnNtYWNrX3J1bGVfbGlzdCwgbGlzdCkgewotCQlpZiAoc3JwLT5zbWtfc3ViamVjdCA9PSBzdWJqZWN0X2xhYmVsIHx8Ci0JCSAgICBzdHJjbXAoc3JwLT5zbWtfc3ViamVjdCwgc3ViamVjdF9sYWJlbCkgPT0gMCkgewotCQkJaWYgKHNycC0+c21rX29iamVjdCA9PSBvYmplY3RfbGFiZWwgfHwKLQkJCSAgICBzdHJjbXAoc3JwLT5zbWtfb2JqZWN0LCBvYmplY3RfbGFiZWwpID09IDApIHsKLQkJCQltYXkgPSBzcnAtPnNta19hY2Nlc3M7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmN1X3JlYWRfdW5sb2NrKCk7CisJbWF5ID0gc21rX2FjY2Vzc19lbnRyeShzdWJqZWN0X2xhYmVsLCBvYmplY3RfbGFiZWwpOwogCS8qCiAJICogVGhpcyBpcyBhIGJpdCBtYXAgb3BlcmF0aW9uLgogCSAqLwpAQCAtMTg1LDcgKzIxMyw3IEBACiBpbnQgc21rX2N1cmFjYyhjaGFyICpvYmpfbGFiZWwsIHUzMiBtb2RlLCBzdHJ1Y3Qgc21rX2F1ZGl0X2luZm8gKmEpCiB7CiAJaW50IHJjOwotCWNoYXIgKnNwID0gY3VycmVudF9zZWN1cml0eSgpOworCWNoYXIgKnNwID0gc21rX29mX2N1cnJlbnQoKTsKIAogCXJjID0gc21rX2FjY2VzcyhzcCwgb2JqX2xhYmVsLCBtb2RlLCBOVUxMKTsKIAlpZiAocmMgPT0gMCkKQEAgLTE5Niw3ICsyMjQsNyBAQAogCSAqIG9ubHkgb25lIHRoYXQgZ2V0cyBwcml2aWxlZ2UgYW5kIGN1cnJlbnQgZG9lcyBub3QKIAkgKiBoYXZlIHRoYXQgbGFiZWwuCiAJICovCi0JaWYgKHNtYWNrX29ubHljYXAgIT0gTlVMTCAmJiBzbWFja19vbmx5Y2FwICE9IGN1cnJlbnQtPmNyZWQtPnNlY3VyaXR5KQorCWlmIChzbWFja19vbmx5Y2FwICE9IE5VTEwgJiYgc21hY2tfb25seWNhcCAhPSBzcCkKIAkJZ290byBvdXRfYXVkaXQ7CiAKIAlpZiAoY2FwYWJsZShDQVBfTUFDX09WRVJSSURFKSkKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrX2xzbS5jIGIvc2VjdXJpdHkvc21hY2svc21hY2tfbHNtLmMKaW5kZXggY2NiNzFhMC4uNTMzYmYzMiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc21hY2svc21hY2tfbHNtLmMKKysrIGIvc2VjdXJpdHkvc21hY2svc21hY2tfbHNtLmMKQEAgLTMsMTIgKzMsMTQgQEAKICAqCiAgKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBzbWFjayBob29rIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9ucy4KICAqCi0gKiAgQXV0aG9yOgorICogIEF1dGhvcnM6CiAgKglDYXNleSBTY2hhdWZsZXIgPGNhc2V5QHNjaGF1Zmxlci1jYS5jb20+CisgKglKYXJra28gU2Fra2luZW4gPGV4dC1qYXJra28uMi5zYWtraW5lbkBub2tpYS5jb20+CiAgKgogICogIENvcHlyaWdodCAoQykgMjAwNyBDYXNleSBTY2hhdWZsZXIgPGNhc2V5QHNjaGF1Zmxlci1jYS5jb20+CiAgKiAgQ29weXJpZ2h0IChDKSAyMDA5IEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAuCiAgKiAgICAgICAgICAgICAgICBQYXVsIE1vb3JlIDxwYXVsLm1vb3JlQGhwLmNvbT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24KICAqCiAgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIsCkBAIC0zNSw2ICszNyw5IEBACiAKICNkZWZpbmUgdGFza19zZWN1cml0eSh0YXNrKQkodGFza19jcmVkX3h4eCgodGFzayksIHNlY3VyaXR5KSkKIAorI2RlZmluZSBUUkFOU19UUlVFCSJUUlVFIgorI2RlZmluZSBUUkFOU19UUlVFX1NJWkUJNAorCiAvKioKICAqIHNta19mZXRjaCAtIEZldGNoIHRoZSBzbWFjayBsYWJlbCBmcm9tIGEgZmlsZS4KICAqIEBpcDogYSBwb2ludGVyIHRvIHRoZSBpbm9kZQpAQCAtNDMsNyArNDgsNyBAQAogICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG1hc3RlciBsaXN0IGVudHJ5IGZvciB0aGUgU21hY2sgbGFiZWwKICAqIG9yIE5VTEwgaWYgdGhlcmUgd2FzIG5vIGxhYmVsIHRvIGZldGNoLgogICovCi1zdGF0aWMgY2hhciAqc21rX2ZldGNoKHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCBkZW50cnkgKmRwKQorc3RhdGljIGNoYXIgKnNta19mZXRjaChjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgZGVudHJ5ICpkcCkKIHsKIAlpbnQgcmM7CiAJY2hhciBpbltTTUtfTEFCRUxMRU5dOwpAQCAtNTEsNyArNTYsNyBAQAogCWlmIChpcC0+aV9vcC0+Z2V0eGF0dHIgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlyYyA9IGlwLT5pX29wLT5nZXR4YXR0cihkcCwgWEFUVFJfTkFNRV9TTUFDSywgaW4sIFNNS19MQUJFTExFTik7CisJcmMgPSBpcC0+aV9vcC0+Z2V0eGF0dHIoZHAsIG5hbWUsIGluLCBTTUtfTEFCRUxMRU4pOwogCWlmIChyYyA8IDApCiAJCXJldHVybiBOVUxMOwogCkBAIC0xMDMsOCArMTA4LDggQEAKIAlpZiAocmMgIT0gMCkKIAkJcmV0dXJuIHJjOwogCi0Jc3AgPSBjdXJyZW50X3NlY3VyaXR5KCk7Ci0JdHNwID0gdGFza19zZWN1cml0eShjdHApOworCXNwID0gc21rX29mX2N1cnJlbnQoKTsKKwl0c3AgPSBzbWtfb2ZfdGFzayh0YXNrX3NlY3VyaXR5KGN0cCkpOwogCXNta19hZF9pbml0KCZhZCwgX19mdW5jX18sIExTTV9BVURJVF9EQVRBX1RBU0spOwogCXNta19hZF9zZXRmaWVsZF91X3RzaygmYWQsIGN0cCk7CiAKQEAgLTEzOCw4ICsxNDMsOCBAQAogCXNta19hZF9pbml0KCZhZCwgX19mdW5jX18sIExTTV9BVURJVF9EQVRBX1RBU0spOwogCXNta19hZF9zZXRmaWVsZF91X3RzaygmYWQsIHB0cCk7CiAKLQlzcCA9IGN1cnJlbnRfc2VjdXJpdHkoKTsKLQl0c3AgPSB0YXNrX3NlY3VyaXR5KHB0cCk7CisJc3AgPSBzbWtfb2ZfY3VycmVudCgpOworCXRzcCA9IHNta19vZl90YXNrKHRhc2tfc2VjdXJpdHkocHRwKSk7CiAJLyogd2Ugd29uJ3QgbG9nIGhlcmUsIGJlY2F1c2UgcmMgY2FuIGJlIG92ZXJyaWRlbiAqLwogCXJjID0gc21rX2FjY2Vzcyh0c3AsIHNwLCBNQVlfUkVBRFdSSVRFLCBOVUxMKTsKIAlpZiAocmMgIT0gMCAmJiBoYXNfY2FwYWJpbGl0eShwdHAsIENBUF9NQUNfT1ZFUlJJREUpKQpAQCAtMTYwLDcgKzE2NSw3IEBACiBzdGF0aWMgaW50IHNtYWNrX3N5c2xvZyhpbnQgdHlwZWZyb21fZmlsZSkKIHsKIAlpbnQgcmMgPSAwOwotCWNoYXIgKnNwID0gY3VycmVudF9zZWN1cml0eSgpOworCWNoYXIgKnNwID0gc21rX29mX2N1cnJlbnQoKTsKIAogCWlmIChjYXBhYmxlKENBUF9NQUNfT1ZFUlJJREUpKQogCQlyZXR1cm4gMDsKQEAgLTM5MSw2ICszOTYsNDAgQEAKIH0KIAogLyoKKyAqIEJQUk0gaG9va3MKKyAqLworCitzdGF0aWMgaW50IHNtYWNrX2Jwcm1fc2V0X2NyZWRzKHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pCit7CisJc3RydWN0IHRhc2tfc21hY2sgKnRzcCA9IGJwcm0tPmNyZWQtPnNlY3VyaXR5OworCXN0cnVjdCBpbm9kZV9zbWFjayAqaXNwOworCXN0cnVjdCBkZW50cnkgKmRwOworCWludCByYzsKKworCXJjID0gY2FwX2Jwcm1fc2V0X2NyZWRzKGJwcm0pOworCWlmIChyYyAhPSAwKQorCQlyZXR1cm4gcmM7CisKKwlpZiAoYnBybS0+Y3JlZF9wcmVwYXJlZCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoYnBybS0+ZmlsZSA9PSBOVUxMIHx8IGJwcm0tPmZpbGUtPmZfZGVudHJ5ID09IE5VTEwpCisJCXJldHVybiAwOworCisJZHAgPSBicHJtLT5maWxlLT5mX2RlbnRyeTsKKworCWlmIChkcC0+ZF9pbm9kZSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWlzcCA9IGRwLT5kX2lub2RlLT5pX3NlY3VyaXR5OworCisJaWYgKGlzcC0+c21rX3Rhc2sgIT0gTlVMTCkKKwkJdHNwLT5zbWtfdGFzayA9IGlzcC0+c21rX3Rhc2s7CisKKwlyZXR1cm4gMDsKK30KKworLyoKICAqIElub2RlIGhvb2tzCiAgKi8KIApAQCAtNDAyLDcgKzQ0MSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgc21hY2tfaW5vZGVfYWxsb2Nfc2VjdXJpdHkoc3RydWN0IGlub2RlICppbm9kZSkKIHsKLQlpbm9kZS0+aV9zZWN1cml0eSA9IG5ld19pbm9kZV9zbWFjayhjdXJyZW50X3NlY3VyaXR5KCkpOworCWlub2RlLT5pX3NlY3VyaXR5ID0gbmV3X2lub2RlX3NtYWNrKHNta19vZl9jdXJyZW50KCkpOwogCWlmIChpbm9kZS0+aV9zZWN1cml0eSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAlyZXR1cm4gMDsKQEAgLTQzNCw2ICs0NzMsOCBAQAogCQkJCSAgICAgY2hhciAqKm5hbWUsIHZvaWQgKip2YWx1ZSwgc2l6ZV90ICpsZW4pCiB7CiAJY2hhciAqaXNwID0gc21rX29mX2lub2RlKGlub2RlKTsKKwljaGFyICpkc3AgPSBzbWtfb2ZfaW5vZGUoZGlyKTsKKwl1MzIgbWF5OwogCiAJaWYgKG5hbWUpIHsKIAkJKm5hbWUgPSBrc3RyZHVwKFhBVFRSX1NNQUNLX1NVRkZJWCwgR0ZQX0tFUk5FTCk7CkBAIC00NDIsNiArNDgzLDE2IEBACiAJfQogCiAJaWYgKHZhbHVlKSB7CisJCW1heSA9IHNta19hY2Nlc3NfZW50cnkoc21rX29mX2N1cnJlbnQoKSwgZHNwKTsKKworCQkvKgorCQkgKiBJZiB0aGUgYWNjZXNzIHJ1bGUgYWxsb3dzIHRyYW5zbXV0YXRpb24gYW5kCisJCSAqIHRoZSBkaXJlY3RvcnkgcmVxdWVzdHMgdHJhbnNtdXRhdGlvbiB0aGVuCisJCSAqIGJ5IGFsbCBtZWFucyB0cmFuc211dGUuCisJCSAqLworCQlpZiAoKChtYXkgJiBNQVlfVFJBTlNNVVRFKSAhPSAwKSAmJiBzbWtfaW5vZGVfdHJhbnNtdXRhYmxlKGRpcikpCisJCQlpc3AgPSBkc3A7CisKIAkJKnZhbHVlID0ga3N0cmR1cChpc3AsIEdGUF9LRVJORUwpOwogCQlpZiAoKnZhbHVlID09IE5VTEwpCiAJCQlyZXR1cm4gLUVOT01FTTsKQEAgLTY2NCw3ICs3MTUsOCBAQAogCiAJaWYgKHN0cmNtcChuYW1lLCBYQVRUUl9OQU1FX1NNQUNLKSA9PSAwIHx8CiAJICAgIHN0cmNtcChuYW1lLCBYQVRUUl9OQU1FX1NNQUNLSVBJTikgPT0gMCB8fAotCSAgICBzdHJjbXAobmFtZSwgWEFUVFJfTkFNRV9TTUFDS0lQT1VUKSA9PSAwKSB7CisJICAgIHN0cmNtcChuYW1lLCBYQVRUUl9OQU1FX1NNQUNLSVBPVVQpID09IDAgfHwKKwkgICAgc3RyY21wKG5hbWUsIFhBVFRSX05BTUVfU01BQ0tFWEVDKSA9PSAwKSB7CiAJCWlmICghY2FwYWJsZShDQVBfTUFDX0FETUlOKSkKIAkJCXJjID0gLUVQRVJNOwogCQkvKgpAQCAtNjc0LDYgKzcyNiwxMiBAQAogCQlpZiAoc2l6ZSA9PSAwIHx8IHNpemUgPj0gU01LX0xBQkVMTEVOIHx8CiAJCSAgICBzbWtfaW1wb3J0KHZhbHVlLCBzaXplKSA9PSBOVUxMKQogCQkJcmMgPSAtRUlOVkFMOworCX0gZWxzZSBpZiAoc3RyY21wKG5hbWUsIFhBVFRSX05BTUVfU01BQ0tUUkFOU01VVEUpID09IDApIHsKKwkJaWYgKCFjYXBhYmxlKENBUF9NQUNfQURNSU4pKQorCQkJcmMgPSAtRVBFUk07CisJCWlmIChzaXplICE9IFRSQU5TX1RSVUVfU0laRSB8fAorCQkgICAgc3RybmNtcCh2YWx1ZSwgVFJBTlNfVFJVRSwgVFJBTlNfVFJVRV9TSVpFKSAhPSAwKQorCQkJcmMgPSAtRUlOVkFMOwogCX0gZWxzZQogCQlyYyA9IGNhcF9pbm9kZV9zZXR4YXR0cihkZW50cnksIG5hbWUsIHZhbHVlLCBzaXplLCBmbGFncyk7CiAKQEAgLTcwMCwyNiArNzU4LDIzIEBACiBzdGF0aWMgdm9pZCBzbWFja19pbm9kZV9wb3N0X3NldHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSwKIAkJCQkgICAgICBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncykKIHsKLQlzdHJ1Y3QgaW5vZGVfc21hY2sgKmlzcDsKIAljaGFyICpuc3A7CisJc3RydWN0IGlub2RlX3NtYWNrICppc3AgPSBkZW50cnktPmRfaW5vZGUtPmlfc2VjdXJpdHk7CiAKLQkvKgotCSAqIE5vdCBTTUFDSwotCSAqLwotCWlmIChzdHJjbXAobmFtZSwgWEFUVFJfTkFNRV9TTUFDSykpCi0JCXJldHVybjsKLQotCWlzcCA9IGRlbnRyeS0+ZF9pbm9kZS0+aV9zZWN1cml0eTsKLQotCS8qCi0JICogTm8gbG9ja2luZyBpcyBkb25lIGhlcmUuIFRoaXMgaXMgYSBwb2ludGVyCi0JICogYXNzaWdubWVudC4KLQkgKi8KLQluc3AgPSBzbWtfaW1wb3J0KHZhbHVlLCBzaXplKTsKLQlpZiAobnNwICE9IE5VTEwpCi0JCWlzcC0+c21rX2lub2RlID0gbnNwOwotCWVsc2UKLQkJaXNwLT5zbWtfaW5vZGUgPSBzbWFja19rbm93bl9pbnZhbGlkLnNta19rbm93bjsKKwlpZiAoc3RyY21wKG5hbWUsIFhBVFRSX05BTUVfU01BQ0spID09IDApIHsKKwkJbnNwID0gc21rX2ltcG9ydCh2YWx1ZSwgc2l6ZSk7CisJCWlmIChuc3AgIT0gTlVMTCkKKwkJCWlzcC0+c21rX2lub2RlID0gbnNwOworCQllbHNlCisJCQlpc3AtPnNta19pbm9kZSA9IHNtYWNrX2tub3duX2ludmFsaWQuc21rX2tub3duOworCX0gZWxzZSBpZiAoc3RyY21wKG5hbWUsIFhBVFRSX05BTUVfU01BQ0tFWEVDKSA9PSAwKSB7CisJCW5zcCA9IHNta19pbXBvcnQodmFsdWUsIHNpemUpOworCQlpZiAobnNwICE9IE5VTEwpCisJCQlpc3AtPnNta190YXNrID0gbnNwOworCQllbHNlCisJCQlpc3AtPnNta190YXNrID0gc21hY2tfa25vd25faW52YWxpZC5zbWtfa25vd247CisJfSBlbHNlIGlmIChzdHJjbXAobmFtZSwgWEFUVFJfTkFNRV9TTUFDS1RSQU5TTVVURSkgPT0gMCkKKwkJaXNwLT5zbWtfZmxhZ3MgfD0gU01LX0lOT0RFX1RSQU5TTVVURTsKIAogCXJldHVybjsKIH0KQEAgLTc1MiwxMiArODA3LDE1IEBACiAgKi8KIHN0YXRpYyBpbnQgc21hY2tfaW5vZGVfcmVtb3ZleGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpuYW1lKQogeworCXN0cnVjdCBpbm9kZV9zbWFjayAqaXNwOwogCXN0cnVjdCBzbWtfYXVkaXRfaW5mbyBhZDsKIAlpbnQgcmMgPSAwOwogCiAJaWYgKHN0cmNtcChuYW1lLCBYQVRUUl9OQU1FX1NNQUNLKSA9PSAwIHx8CiAJICAgIHN0cmNtcChuYW1lLCBYQVRUUl9OQU1FX1NNQUNLSVBJTikgPT0gMCB8fAotCSAgICBzdHJjbXAobmFtZSwgWEFUVFJfTkFNRV9TTUFDS0lQT1VUKSA9PSAwKSB7CisJICAgIHN0cmNtcChuYW1lLCBYQVRUUl9OQU1FX1NNQUNLSVBPVVQpID09IDAgfHwKKwkgICAgc3RyY21wKG5hbWUsIFhBVFRSX05BTUVfU01BQ0tFWEVDKSA9PSAwIHx8CisJICAgIHN0cmNtcChuYW1lLCBYQVRUUl9OQU1FX1NNQUNLVFJBTlNNVVRFKSA9PSAwKSB7CiAJCWlmICghY2FwYWJsZShDQVBfTUFDX0FETUlOKSkKIAkJCXJjID0gLUVQRVJNOwogCX0gZWxzZQpAQCAtNzY4LDYgKzgyNiwxMSBAQAogCWlmIChyYyA9PSAwKQogCQlyYyA9IHNta19jdXJhY2Moc21rX29mX2lub2RlKGRlbnRyeS0+ZF9pbm9kZSksIE1BWV9XUklURSwgJmFkKTsKIAorCWlmIChyYyA9PSAwKSB7CisJCWlzcCA9IGRlbnRyeS0+ZF9pbm9kZS0+aV9zZWN1cml0eTsKKwkJaXNwLT5zbWtfdGFzayA9IE5VTEw7CisJfQorCiAJcmV0dXJuIHJjOwogfQogCkBAIC04OTUsNyArOTU4LDcgQEAKICAqLwogc3RhdGljIGludCBzbWFja19maWxlX2FsbG9jX3NlY3VyaXR5KHN0cnVjdCBmaWxlICpmaWxlKQogewotCWZpbGUtPmZfc2VjdXJpdHkgPSBjdXJyZW50X3NlY3VyaXR5KCk7CisJZmlsZS0+Zl9zZWN1cml0eSA9IHNta19vZl9jdXJyZW50KCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwMDUsNyArMTA2OCw3IEBACiAgKi8KIHN0YXRpYyBpbnQgc21hY2tfZmlsZV9zZXRfZm93bmVyKHN0cnVjdCBmaWxlICpmaWxlKQogewotCWZpbGUtPmZfc2VjdXJpdHkgPSBjdXJyZW50X3NlY3VyaXR5KCk7CisJZmlsZS0+Zl9zZWN1cml0eSA9IHNta19vZl9jdXJyZW50KCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwMjUsNyArMTA4OCw3IEBACiB7CiAJc3RydWN0IGZpbGUgKmZpbGU7CiAJaW50IHJjOwotCWNoYXIgKnRzcCA9IHRzay0+Y3JlZC0+c2VjdXJpdHk7CisJY2hhciAqdHNwID0gc21rX29mX3Rhc2sodHNrLT5jcmVkLT5zZWN1cml0eSk7CiAJc3RydWN0IHNta19hdWRpdF9pbmZvIGFkOwogCiAJLyoKQEAgLTEwODIsNyArMTE0NSw5IEBACiAgKi8KIHN0YXRpYyBpbnQgc21hY2tfY3JlZF9hbGxvY19ibGFuayhzdHJ1Y3QgY3JlZCAqY3JlZCwgZ2ZwX3QgZ2ZwKQogewotCWNyZWQtPnNlY3VyaXR5ID0gTlVMTDsKKwljcmVkLT5zZWN1cml0eSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0YXNrX3NtYWNrKSwgZ2ZwKTsKKwlpZiAoY3JlZC0+c2VjdXJpdHkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwOTcsNyArMTE2Miw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIHNtYWNrX2NyZWRfZnJlZShzdHJ1Y3QgY3JlZCAqY3JlZCkKIHsKLQljcmVkLT5zZWN1cml0eSA9IE5VTEw7CisJa2ZyZWUoY3JlZC0+c2VjdXJpdHkpOwogfQogCiAvKioKQEAgLTExMTEsNyArMTE3NiwxNiBAQAogc3RhdGljIGludCBzbWFja19jcmVkX3ByZXBhcmUoc3RydWN0IGNyZWQgKm5ldywgY29uc3Qgc3RydWN0IGNyZWQgKm9sZCwKIAkJCSAgICAgIGdmcF90IGdmcCkKIHsKLQluZXctPnNlY3VyaXR5ID0gb2xkLT5zZWN1cml0eTsKKwlzdHJ1Y3QgdGFza19zbWFjayAqb2xkX3RzcCA9IG9sZC0+c2VjdXJpdHk7CisJc3RydWN0IHRhc2tfc21hY2sgKm5ld190c3A7CisKKwluZXdfdHNwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHRhc2tfc21hY2spLCBnZnApOworCWlmIChuZXdfdHNwID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJbmV3X3RzcC0+c21rX3Rhc2sgPSBvbGRfdHNwLT5zbWtfdGFzazsKKwluZXdfdHNwLT5zbWtfZm9ya2VkID0gb2xkX3RzcC0+c21rX3Rhc2s7CisJbmV3LT5zZWN1cml0eSA9IG5ld190c3A7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTExMjQsNyArMTE5OCwxMSBAQAogICovCiBzdGF0aWMgdm9pZCBzbWFja19jcmVkX3RyYW5zZmVyKHN0cnVjdCBjcmVkICpuZXcsIGNvbnN0IHN0cnVjdCBjcmVkICpvbGQpCiB7Ci0JbmV3LT5zZWN1cml0eSA9IG9sZC0+c2VjdXJpdHk7CisJc3RydWN0IHRhc2tfc21hY2sgKm9sZF90c3AgPSBvbGQtPnNlY3VyaXR5OworCXN0cnVjdCB0YXNrX3NtYWNrICpuZXdfdHNwID0gbmV3LT5zZWN1cml0eTsKKworCW5ld190c3AtPnNta190YXNrID0gb2xkX3RzcC0+c21rX3Rhc2s7CisJbmV3X3RzcC0+c21rX2ZvcmtlZCA9IG9sZF90c3AtPnNta190YXNrOwogfQogCiAvKioKQEAgLTExMzYsMTIgKzEyMTQsMTMgQEAKICAqLwogc3RhdGljIGludCBzbWFja19rZXJuZWxfYWN0X2FzKHN0cnVjdCBjcmVkICpuZXcsIHUzMiBzZWNpZCkKIHsKKwlzdHJ1Y3QgdGFza19zbWFjayAqbmV3X3RzcCA9IG5ldy0+c2VjdXJpdHk7CiAJY2hhciAqc21hY2sgPSBzbWFja19mcm9tX3NlY2lkKHNlY2lkKTsKIAogCWlmIChzbWFjayA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCW5ldy0+c2VjdXJpdHkgPSBzbWFjazsKKwluZXdfdHNwLT5zbWtfdGFzayA9IHNtYWNrOwogCXJldHVybiAwOwogfQogCkBAIC0xMTU3LDggKzEyMzYsMTAgQEAKIAkJCQkJc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAlzdHJ1Y3QgaW5vZGVfc21hY2sgKmlzcCA9IGlub2RlLT5pX3NlY3VyaXR5OworCXN0cnVjdCB0YXNrX3NtYWNrICp0c3AgPSBuZXctPnNlY3VyaXR5OwogCi0JbmV3LT5zZWN1cml0eSA9IGlzcC0+c21rX2lub2RlOworCXRzcC0+c21rX2ZvcmtlZCA9IGlzcC0+c21rX2lub2RlOworCXRzcC0+c21rX3Rhc2sgPSBpc3AtPnNta19pbm9kZTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTE3NSw3ICsxMjU2LDcgQEAKIAogCXNta19hZF9pbml0KCZhZCwgX19mdW5jX18sIExTTV9BVURJVF9EQVRBX1RBU0spOwogCXNta19hZF9zZXRmaWVsZF91X3RzaygmYWQsIHApOwotCXJldHVybiBzbWtfY3VyYWNjKHRhc2tfc2VjdXJpdHkocCksIGFjY2VzcywgJmFkKTsKKwlyZXR1cm4gc21rX2N1cmFjYyhzbWtfb2ZfdGFzayh0YXNrX3NlY3VyaXR5KHApKSwgYWNjZXNzLCAmYWQpOwogfQogCiAvKioKQEAgLTEyMjEsNyArMTMwMiw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIHNtYWNrX3Rhc2tfZ2V0c2VjaWQoc3RydWN0IHRhc2tfc3RydWN0ICpwLCB1MzIgKnNlY2lkKQogewotCSpzZWNpZCA9IHNtYWNrX3RvX3NlY2lkKHRhc2tfc2VjdXJpdHkocCkpOworCSpzZWNpZCA9IHNtYWNrX3RvX3NlY2lkKHNta19vZl90YXNrKHRhc2tfc2VjdXJpdHkocCkpKTsKIH0KIAogLyoqCkBAIC0xMzMzLDE0ICsxNDE0LDE1IEBACiAJICogY2FuIHdyaXRlIHRoZSByZWNlaXZlci4KIAkgKi8KIAlpZiAoc2VjaWQgPT0gMCkKLQkJcmV0dXJuIHNta19jdXJhY2ModGFza19zZWN1cml0eShwKSwgTUFZX1dSSVRFLCAmYWQpOworCQlyZXR1cm4gc21rX2N1cmFjYyhzbWtfb2ZfdGFzayh0YXNrX3NlY3VyaXR5KHApKSwgTUFZX1dSSVRFLAorCQkJCSAgJmFkKTsKIAkvKgogCSAqIElmIHRoZSBzZWNpZCBpc24ndCAwIHdlJ3JlIGRlYWxpbmcgd2l0aCBzb21lIFVTQiBJTwogCSAqIHNwZWNpZmljIGJlaGF2aW9yLiBUaGlzIGlzIG5vdCBjbGVhbi4gRm9yIG9uZSB0aGluZwogCSAqIHdlIGNhbid0IHRha2UgcHJpdmlsZWdlIGludG8gYWNjb3VudC4KIAkgKi8KLQlyZXR1cm4gc21rX2FjY2VzcyhzbWFja19mcm9tX3NlY2lkKHNlY2lkKSwgdGFza19zZWN1cml0eShwKSwKLQkJCSAgTUFZX1dSSVRFLCAmYWQpOworCXJldHVybiBzbWtfYWNjZXNzKHNtYWNrX2Zyb21fc2VjaWQoc2VjaWQpLAorCQkJICBzbWtfb2ZfdGFzayh0YXNrX3NlY3VyaXR5KHApKSwgTUFZX1dSSVRFLCAmYWQpOwogfQogCiAvKioKQEAgLTEzNTIsMTIgKzE0MzQsMTIgQEAKIHN0YXRpYyBpbnQgc21hY2tfdGFza193YWl0KHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKIHsKIAlzdHJ1Y3Qgc21rX2F1ZGl0X2luZm8gYWQ7Ci0JY2hhciAqc3AgPSBjdXJyZW50X3NlY3VyaXR5KCk7Ci0JY2hhciAqdHNwID0gdGFza19zZWN1cml0eShwKTsKKwljaGFyICpzcCA9IHNta19vZl9jdXJyZW50KCk7CisJY2hhciAqdHNwID0gc21rX29mX2ZvcmtlZCh0YXNrX3NlY3VyaXR5KHApKTsKIAlpbnQgcmM7CiAKIAkvKiB3ZSBkb24ndCBsb2cgaGVyZSwgd2UgY2FuIGJlIG92ZXJyaWRlbiAqLwotCXJjID0gc21rX2FjY2VzcyhzcCwgdHNwLCBNQVlfV1JJVEUsIE5VTEwpOworCXJjID0gc21rX2FjY2Vzcyh0c3AsIHNwLCBNQVlfV1JJVEUsIE5VTEwpOwogCWlmIChyYyA9PSAwKQogCQlnb3RvIG91dF9sb2c7CiAKQEAgLTEzNzgsNyArMTQ2MCw3IEBACiAgb3V0X2xvZzoKIAlzbWtfYWRfaW5pdCgmYWQsIF9fZnVuY19fLCBMU01fQVVESVRfREFUQV9UQVNLKTsKIAlzbWtfYWRfc2V0ZmllbGRfdV90c2soJmFkLCBwKTsKLQlzbWFja19sb2coc3AsIHRzcCwgTUFZX1dSSVRFLCByYywgJmFkKTsKKwlzbWFja19sb2codHNwLCBzcCwgTUFZX1dSSVRFLCByYywgJmFkKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTEzOTIsNyArMTQ3NCw3IEBACiBzdGF0aWMgdm9pZCBzbWFja190YXNrX3RvX2lub2RlKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAlzdHJ1Y3QgaW5vZGVfc21hY2sgKmlzcCA9IGlub2RlLT5pX3NlY3VyaXR5OwotCWlzcC0+c21rX2lub2RlID0gdGFza19zZWN1cml0eShwKTsKKwlpc3AtPnNta19pbm9kZSA9IHNta19vZl90YXNrKHRhc2tfc2VjdXJpdHkocCkpOwogfQogCiAvKgpAQCAtMTQxMSw3ICsxNDkzLDcgQEAKICAqLwogc3RhdGljIGludCBzbWFja19za19hbGxvY19zZWN1cml0eShzdHJ1Y3Qgc29jayAqc2ssIGludCBmYW1pbHksIGdmcF90IGdmcF9mbGFncykKIHsKLQljaGFyICpjc3AgPSBjdXJyZW50X3NlY3VyaXR5KCk7CisJY2hhciAqY3NwID0gc21rX29mX2N1cnJlbnQoKTsKIAlzdHJ1Y3Qgc29ja2V0X3NtYWNrICpzc3A7CiAKIAlzc3AgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc29ja2V0X3NtYWNrKSwgZ2ZwX2ZsYWdzKTsKQEAgLTE2NjcsMTAgKzE3NDksMTMgQEAKIAkJc3NwLT5zbWtfaW4gPSBzcDsKIAllbHNlIGlmIChzdHJjbXAobmFtZSwgWEFUVFJfU01BQ0tfSVBPVVQpID09IDApIHsKIAkJc3NwLT5zbWtfb3V0ID0gc3A7Ci0JCXJjID0gc21hY2tfbmV0bGFiZWwoc29jay0+c2ssIFNNQUNLX0NJUFNPX1NPQ0tFVCk7Ci0JCWlmIChyYyAhPSAwKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiU21hY2s6IFwiJXNcIiBuZXRsYmwgZXJyb3IgJWQuXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCAtcmMpOworCQlpZiAoc29jay0+c2stPnNrX2ZhbWlseSAhPSBQRl9VTklYKSB7CisJCQlyYyA9IHNtYWNrX25ldGxhYmVsKHNvY2stPnNrLCBTTUFDS19DSVBTT19TT0NLRVQpOworCQkJaWYgKHJjICE9IDApCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCQkiU21hY2s6IFwiJXNcIiBuZXRsYmwgZXJyb3IgJWQuXG4iLAorCQkJCQlfX2Z1bmNfXywgLXJjKTsKKwkJfQogCX0gZWxzZQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKQEAgLTE3NDksNyArMTgzNCw3IEBACiAgKi8KIHN0YXRpYyBpbnQgc21hY2tfbXNnX21zZ19hbGxvY19zZWN1cml0eShzdHJ1Y3QgbXNnX21zZyAqbXNnKQogewotCW1zZy0+c2VjdXJpdHkgPSBjdXJyZW50X3NlY3VyaXR5KCk7CisJbXNnLT5zZWN1cml0eSA9IHNta19vZl9jdXJyZW50KCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE3ODUsNyArMTg3MCw3IEBACiB7CiAJc3RydWN0IGtlcm5faXBjX3Blcm0gKmlzcCA9ICZzaHAtPnNobV9wZXJtOwogCi0JaXNwLT5zZWN1cml0eSA9IGN1cnJlbnRfc2VjdXJpdHkoKTsKKwlpc3AtPnNlY3VyaXR5ID0gc21rX29mX2N1cnJlbnQoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTkwOCw3ICsxOTkzLDcgQEAKIHsKIAlzdHJ1Y3Qga2Vybl9pcGNfcGVybSAqaXNwID0gJnNtYS0+c2VtX3Blcm07CiAKLQlpc3AtPnNlY3VyaXR5ID0gY3VycmVudF9zZWN1cml0eSgpOworCWlzcC0+c2VjdXJpdHkgPSBzbWtfb2ZfY3VycmVudCgpOwogCXJldHVybiAwOwogfQogCkBAIC0yMDI2LDcgKzIxMTEsNyBAQAogewogCXN0cnVjdCBrZXJuX2lwY19wZXJtICpraXNwID0gJm1zcS0+cV9wZXJtOwogCi0Ja2lzcC0+c2VjdXJpdHkgPSBjdXJyZW50X3NlY3VyaXR5KCk7CisJa2lzcC0+c2VjdXJpdHkgPSBzbWtfb2ZfY3VycmVudCgpOwogCXJldHVybiAwOwogfQogCkBAIC0yMTk4LDkgKzIyODMsMTEgQEAKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNicDsKIAlzdHJ1Y3Qgc3VwZXJibG9ja19zbWFjayAqc2JzcDsKIAlzdHJ1Y3QgaW5vZGVfc21hY2sgKmlzcDsKLQljaGFyICpjc3AgPSBjdXJyZW50X3NlY3VyaXR5KCk7CisJY2hhciAqY3NwID0gc21rX29mX2N1cnJlbnQoKTsKIAljaGFyICpmZXRjaGVkOwogCWNoYXIgKmZpbmFsOworCWNoYXIgdHJhdHRyW1RSQU5TX1RSVUVfU0laRV07CisJaW50IHRyYW5zZmxhZyA9IDA7CiAJc3RydWN0IGRlbnRyeSAqZHA7CiAKIAlpZiAoaW5vZGUgPT0gTlVMTCkKQEAgLTIyNjcsOSArMjM1NCwxMCBAQAogCQlicmVhazsKIAljYXNlIFNPQ0tGU19NQUdJQzoKIAkJLyoKLQkJICogQ2FzZXkgc2F5cyBzb2NrZXRzIGdldCB0aGUgc21hY2sgb2YgdGhlIHRhc2suCisJCSAqIFNvY2tldCBhY2Nlc3MgaXMgY29udHJvbGxlZCBieSB0aGUgc29ja2V0CisJCSAqIHN0cnVjdHVyZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrIGludm9sdmVkLgogCQkgKi8KLQkJZmluYWwgPSBjc3A7CisJCWZpbmFsID0gc21hY2tfa25vd25fc3Rhci5zbWtfa25vd247CiAJCWJyZWFrOwogCWNhc2UgUFJPQ19TVVBFUl9NQUdJQzoKIAkJLyoKQEAgLTIyOTYsNyArMjM4NCwxNiBAQAogCQkvKgogCQkgKiBUaGlzIGlzbid0IGFuIHVuZGVyc3Rvb2Qgc3BlY2lhbCBjYXNlLgogCQkgKiBHZXQgdGhlIHZhbHVlIGZyb20gdGhlIHhhdHRyLgotCQkgKgorCQkgKi8KKworCQkvKgorCQkgKiBVTklYIGRvbWFpbiBzb2NrZXRzIHVzZSBsb3dlciBsZXZlbCBzb2NrZXQgZGF0YS4KKwkJICovCisJCWlmIChTX0lTU09DSyhpbm9kZS0+aV9tb2RlKSkgeworCQkJZmluYWwgPSBzbWFja19rbm93bl9zdGFyLnNta19rbm93bjsKKwkJCWJyZWFrOworCQl9CisJCS8qCiAJCSAqIE5vIHhhdHRyIHN1cHBvcnQgbWVhbnMsIGFsYXMsIG5vIFNNQUNLIGxhYmVsLgogCQkgKiBVc2UgdGhlIGFmb3JlYXBwbGllZCBkZWZhdWx0LgogCQkgKiBJdCB3b3VsZCBiZSBjdXJpb3VzIGlmIHRoZSBsYWJlbCBvZiB0aGUgdGFzawpAQCAtMjMwOCw5ICsyNDA1LDIxIEBACiAJCSAqIEdldCB0aGUgZGVudHJ5IGZvciB4YXR0ci4KIAkJICovCiAJCWRwID0gZGdldChvcHRfZGVudHJ5KTsKLQkJZmV0Y2hlZCA9IHNta19mZXRjaChpbm9kZSwgZHApOwotCQlpZiAoZmV0Y2hlZCAhPSBOVUxMKQorCQlmZXRjaGVkID0gc21rX2ZldGNoKFhBVFRSX05BTUVfU01BQ0ssIGlub2RlLCBkcCk7CisJCWlmIChmZXRjaGVkICE9IE5VTEwpIHsKIAkJCWZpbmFsID0gZmV0Y2hlZDsKKwkJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCQkJdHJhdHRyWzBdID0gJ1wwJzsKKwkJCQlpbm9kZS0+aV9vcC0+Z2V0eGF0dHIoZHAsCisJCQkJCVhBVFRSX05BTUVfU01BQ0tUUkFOU01VVEUsCisJCQkJCXRyYXR0ciwgVFJBTlNfVFJVRV9TSVpFKTsKKwkJCQlpZiAoc3RybmNtcCh0cmF0dHIsIFRSQU5TX1RSVUUsCisJCQkJCSAgICBUUkFOU19UUlVFX1NJWkUpID09IDApCisJCQkJCXRyYW5zZmxhZyA9IFNNS19JTk9ERV9UUkFOU01VVEU7CisJCQl9CisJCX0KKwkJaXNwLT5zbWtfdGFzayA9IHNta19mZXRjaChYQVRUUl9OQU1FX1NNQUNLRVhFQywgaW5vZGUsIGRwKTsKKwogCQlkcHV0KGRwKTsKIAkJYnJlYWs7CiAJfQpAQCAtMjMyMCw3ICsyNDI5LDcgQEAKIAllbHNlCiAJCWlzcC0+c21rX2lub2RlID0gZmluYWw7CiAKLQlpc3AtPnNta19mbGFncyB8PSBTTUtfSU5PREVfSU5TVEFOVDsKKwlpc3AtPnNta19mbGFncyB8PSAoU01LX0lOT0RFX0lOU1RBTlQgfCB0cmFuc2ZsYWcpOwogCiB1bmxvY2thbmRvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZpc3AtPnNta19sb2NrKTsKQEAgLTIzNDUsNyArMjQ1NCw3IEBACiAJaWYgKHN0cmNtcChuYW1lLCAiY3VycmVudCIpICE9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JY3AgPSBrc3RyZHVwKHRhc2tfc2VjdXJpdHkocCksIEdGUF9LRVJORUwpOworCWNwID0ga3N0cmR1cChzbWtfb2ZfdGFzayh0YXNrX3NlY3VyaXR5KHApKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGNwID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0yMzY5LDYgKzI0NzgsOCBAQAogc3RhdGljIGludCBzbWFja19zZXRwcm9jYXR0cihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGNoYXIgKm5hbWUsCiAJCQkgICAgIHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSkKIHsKKwlzdHJ1Y3QgdGFza19zbWFjayAqdHNwOworCXN0cnVjdCB0YXNrX3NtYWNrICpvbGR0c3A7CiAJc3RydWN0IGNyZWQgKm5ldzsKIAljaGFyICpuZXdzbWFjazsKIApAQCAtMjM5OCwxMCArMjUwOSwxOCBAQAogCWlmIChuZXdzbWFjayA9PSBzbWFja19rbm93bl93ZWIuc21rX2tub3duKQogCQlyZXR1cm4gLUVQRVJNOwogCisJb2xkdHNwID0gcC0+Y3JlZC0+c2VjdXJpdHk7CiAJbmV3ID0gcHJlcGFyZV9jcmVkcygpOwogCWlmIChuZXcgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbmV3LT5zZWN1cml0eSA9IG5ld3NtYWNrOworCXRzcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0YXNrX3NtYWNrKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHRzcCA9PSBOVUxMKSB7CisJCWtmcmVlKG5ldyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwl0c3AtPnNta190YXNrID0gbmV3c21hY2s7CisJdHNwLT5zbWtfZm9ya2VkID0gb2xkdHNwLT5zbWtfZm9ya2VkOworCW5ldy0+c2VjdXJpdHkgPSB0c3A7CiAJY29tbWl0X2NyZWRzKG5ldyk7CiAJcmV0dXJuIHNpemU7CiB9CkBAIC0yNDE4LDE0ICsyNTM3LDE4IEBACiBzdGF0aWMgaW50IHNtYWNrX3VuaXhfc3RyZWFtX2Nvbm5lY3Qoc3RydWN0IHNvY2sgKnNvY2ssCiAJCQkJICAgICBzdHJ1Y3Qgc29jayAqb3RoZXIsIHN0cnVjdCBzb2NrICpuZXdzaykKIHsKLQlzdHJ1Y3QgaW5vZGUgKnNwID0gU09DS19JTk9ERShzb2NrLT5za19zb2NrZXQpOwotCXN0cnVjdCBpbm9kZSAqb3AgPSBTT0NLX0lOT0RFKG90aGVyLT5za19zb2NrZXQpOworCXN0cnVjdCBzb2NrZXRfc21hY2sgKnNzcCA9IHNvY2stPnNrX3NlY3VyaXR5OworCXN0cnVjdCBzb2NrZXRfc21hY2sgKm9zcCA9IG90aGVyLT5za19zZWN1cml0eTsKIAlzdHJ1Y3Qgc21rX2F1ZGl0X2luZm8gYWQ7CisJaW50IHJjID0gMDsKIAogCXNta19hZF9pbml0KCZhZCwgX19mdW5jX18sIExTTV9BVURJVF9EQVRBX05FVCk7CiAJc21rX2FkX3NldGZpZWxkX3VfbmV0X3NrKCZhZCwgb3RoZXIpOwotCXJldHVybiBzbWtfYWNjZXNzKHNta19vZl9pbm9kZShzcCksIHNta19vZl9pbm9kZShvcCksCi0JCQkJIE1BWV9SRUFEV1JJVEUsICZhZCk7CisKKwlpZiAoIWNhcGFibGUoQ0FQX01BQ19PVkVSUklERSkpCisJCXJjID0gc21rX2FjY2Vzcyhzc3AtPnNta19vdXQsIG9zcC0+c21rX2luLCBNQVlfV1JJVEUsICZhZCk7CisKKwlyZXR1cm4gcmM7CiB9CiAKIC8qKgpAQCAtMjQzOCwxMyArMjU2MSwxOCBAQAogICovCiBzdGF0aWMgaW50IHNtYWNrX3VuaXhfbWF5X3NlbmQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2tldCAqb3RoZXIpCiB7Ci0Jc3RydWN0IGlub2RlICpzcCA9IFNPQ0tfSU5PREUoc29jayk7Ci0Jc3RydWN0IGlub2RlICpvcCA9IFNPQ0tfSU5PREUob3RoZXIpOworCXN0cnVjdCBzb2NrZXRfc21hY2sgKnNzcCA9IHNvY2stPnNrLT5za19zZWN1cml0eTsKKwlzdHJ1Y3Qgc29ja2V0X3NtYWNrICpvc3AgPSBvdGhlci0+c2stPnNrX3NlY3VyaXR5OwogCXN0cnVjdCBzbWtfYXVkaXRfaW5mbyBhZDsKKwlpbnQgcmMgPSAwOwogCiAJc21rX2FkX2luaXQoJmFkLCBfX2Z1bmNfXywgTFNNX0FVRElUX0RBVEFfTkVUKTsKIAlzbWtfYWRfc2V0ZmllbGRfdV9uZXRfc2soJmFkLCBvdGhlci0+c2spOwotCXJldHVybiBzbWtfYWNjZXNzKHNta19vZl9pbm9kZShzcCksIHNta19vZl9pbm9kZShvcCksIE1BWV9XUklURSwgJmFkKTsKKworCWlmICghY2FwYWJsZShDQVBfTUFDX09WRVJSSURFKSkKKwkJcmMgPSBzbWtfYWNjZXNzKHNzcC0+c21rX291dCwgb3NwLT5zbWtfaW4sIE1BWV9XUklURSwgJmFkKTsKKworCXJldHVybiByYzsKIH0KIAogLyoqCkBAIC0yNjI5LDcgKzI3NTcsNyBAQAogCiAvKioKICAqIHNtYWNrX3NvY2tldF9nZXRwZWVyc2VjX2RncmFtIC0gcHVsbCBpbiBwYWNrZXQgbGFiZWwKLSAqIEBzb2NrOiB0aGUgc29ja2V0CisgKiBAc29jazogdGhlIHBlZXIgc29ja2V0CiAgKiBAc2tiOiBwYWNrZXQgZGF0YQogICogQHNlY2lkOiBwb2ludGVyIHRvIHdoZXJlIHRvIHB1dCB0aGUgc2VjaWQgb2YgdGhlIHBhY2tldAogICoKQEAgLTI2NDAsNDEgKzI3NjgsMzkgQEAKIAogewogCXN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgc2VjYXR0cjsKLQlzdHJ1Y3Qgc29jayAqc2s7CisJc3RydWN0IHNvY2tldF9zbWFjayAqc3A7CiAJY2hhciBzbWFja1tTTUtfTEFCRUxMRU5dOwotCWludCBmYW1pbHkgPSBQRl9JTkVUOwotCXUzMiBzOworCWludCBmYW1pbHkgPSBQRl9VTlNQRUM7CisJdTMyIHMgPSAwOwkvKiAwIGlzIHRoZSBpbnZhbGlkIHNlY2lkICovCiAJaW50IHJjOwogCi0JLyoKLQkgKiBPbmx5IHdvcmtzIGZvciBmYW1pbGllcyB3aXRoIHBhY2tldHMuCi0JICovCi0JaWYgKHNvY2sgIT0gTlVMTCkgewotCQlzayA9IHNvY2stPnNrOwotCQlpZiAoc2stPnNrX2ZhbWlseSAhPSBQRl9JTkVUICYmIHNrLT5za19mYW1pbHkgIT0gUEZfSU5FVDYpCi0JCQlyZXR1cm4gMDsKLQkJZmFtaWx5ID0gc2stPnNrX2ZhbWlseTsKKwlpZiAoc2tiICE9IE5VTEwpIHsKKwkJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApKQorCQkJZmFtaWx5ID0gUEZfSU5FVDsKKwkJZWxzZSBpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUFY2KSkKKwkJCWZhbWlseSA9IFBGX0lORVQ2OwogCX0KLQkvKgotCSAqIFRyYW5zbGF0ZSB3aGF0IG5ldGxhYmVsIGdhdmUgdXMuCi0JICovCi0JbmV0bGJsX3NlY2F0dHJfaW5pdCgmc2VjYXR0cik7Ci0JcmMgPSBuZXRsYmxfc2tidWZmX2dldGF0dHIoc2tiLCBmYW1pbHksICZzZWNhdHRyKTsKLQlpZiAocmMgPT0gMCkKLQkJc21hY2tfZnJvbV9zZWNhdHRyKCZzZWNhdHRyLCBzbWFjayk7Ci0JbmV0bGJsX3NlY2F0dHJfZGVzdHJveSgmc2VjYXR0cik7CisJaWYgKGZhbWlseSA9PSBQRl9VTlNQRUMgJiYgc29jayAhPSBOVUxMKQorCQlmYW1pbHkgPSBzb2NrLT5zay0+c2tfZmFtaWx5OwogCi0JLyoKLQkgKiBHaXZlIHVwIGlmIHdlIGNvdWxkbid0IGdldCBhbnl0aGluZwotCSAqLwotCWlmIChyYyAhPSAwKQotCQlyZXR1cm4gcmM7Ci0KLQlzID0gc21hY2tfdG9fc2VjaWQoc21hY2spOworCWlmIChmYW1pbHkgPT0gUEZfVU5JWCkgeworCQlzcCA9IHNvY2stPnNrLT5za19zZWN1cml0eTsKKwkJcyA9IHNtYWNrX3RvX3NlY2lkKHNwLT5zbWtfb3V0KTsKKwl9IGVsc2UgaWYgKGZhbWlseSA9PSBQRl9JTkVUIHx8IGZhbWlseSA9PSBQRl9JTkVUNikgeworCQkvKgorCQkgKiBUcmFuc2xhdGUgd2hhdCBuZXRsYWJlbCBnYXZlIHVzLgorCQkgKi8KKwkJbmV0bGJsX3NlY2F0dHJfaW5pdCgmc2VjYXR0cik7CisJCXJjID0gbmV0bGJsX3NrYnVmZl9nZXRhdHRyKHNrYiwgZmFtaWx5LCAmc2VjYXR0cik7CisJCWlmIChyYyA9PSAwKSB7CisJCQlzbWFja19mcm9tX3NlY2F0dHIoJnNlY2F0dHIsIHNtYWNrKTsKKwkJCXMgPSBzbWFja190b19zZWNpZChzbWFjayk7CisJCX0KKwkJbmV0bGJsX3NlY2F0dHJfZGVzdHJveSgmc2VjYXR0cik7CisJfQorCSpzZWNpZCA9IHM7CiAJaWYgKHMgPT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkqc2VjaWQgPSBzOwogCXJldHVybiAwOwogfQogCkBAIC0yNjk1LDcgKzI4MjEsNyBAQAogCQlyZXR1cm47CiAKIAlzc3AgPSBzay0+c2tfc2VjdXJpdHk7Ci0Jc3NwLT5zbWtfaW4gPSBzc3AtPnNta19vdXQgPSBjdXJyZW50X3NlY3VyaXR5KCk7CisJc3NwLT5zbWtfaW4gPSBzc3AtPnNta19vdXQgPSBzbWtfb2ZfY3VycmVudCgpOwogCS8qIGNzc3AtPnNta19wYWNrZXQgaXMgYWxyZWFkeSBzZXQgaW4gc21hY2tfaW5ldF9jc2tfY2xvbmUoKSAqLwogfQogCkBAIC0yODE2LDcgKzI5NDIsNyBAQAogc3RhdGljIGludCBzbWFja19rZXlfYWxsb2Moc3RydWN0IGtleSAqa2V5LCBjb25zdCBzdHJ1Y3QgY3JlZCAqY3JlZCwKIAkJCSAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7Ci0Ja2V5LT5zZWN1cml0eSA9IGNyZWQtPnNlY3VyaXR5OworCWtleS0+c2VjdXJpdHkgPSBzbWtfb2ZfdGFzayhjcmVkLT5zZWN1cml0eSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI4NDUsNiArMjk3MSw3IEBACiB7CiAJc3RydWN0IGtleSAqa2V5cDsKIAlzdHJ1Y3Qgc21rX2F1ZGl0X2luZm8gYWQ7CisJY2hhciAqdHNwID0gc21rX29mX3Rhc2soY3JlZC0+c2VjdXJpdHkpOwogCiAJa2V5cCA9IGtleV9yZWZfdG9fcHRyKGtleV9yZWYpOwogCWlmIChrZXlwID09IE5VTEwpCkBAIC0yODU4LDE0ICsyOTg1LDE0IEBACiAJLyoKIAkgKiBUaGlzIHNob3VsZCBub3Qgb2NjdXIKIAkgKi8KLQlpZiAoY3JlZC0+c2VjdXJpdHkgPT0gTlVMTCkKKwlpZiAodHNwID09IE5VTEwpCiAJCXJldHVybiAtRUFDQ0VTOwogI2lmZGVmIENPTkZJR19BVURJVAogCXNta19hZF9pbml0KCZhZCwgX19mdW5jX18sIExTTV9BVURJVF9EQVRBX0tFWSk7CiAJYWQuYS51LmtleV9zdHJ1Y3Qua2V5ID0ga2V5cC0+c2VyaWFsOwogCWFkLmEudS5rZXlfc3RydWN0LmtleV9kZXNjID0ga2V5cC0+ZGVzY3JpcHRpb247CiAjZW5kaWYKLQlyZXR1cm4gc21rX2FjY2VzcyhjcmVkLT5zZWN1cml0eSwga2V5cC0+c2VjdXJpdHksCisJcmV0dXJuIHNta19hY2Nlc3ModHNwLCBrZXlwLT5zZWN1cml0eSwKIAkJCQkgTUFZX1JFQURXUklURSwgJmFkKTsKIH0KICNlbmRpZiAvKiBDT05GSUdfS0VZUyAqLwpAQCAtMzA2Nyw2ICszMTk0LDggQEAKIAkuc2JfbW91bnQgPSAJCQlzbWFja19zYl9tb3VudCwKIAkuc2JfdW1vdW50ID0gCQkJc21hY2tfc2JfdW1vdW50LAogCisJLmJwcm1fc2V0X2NyZWRzID0JCXNtYWNrX2Jwcm1fc2V0X2NyZWRzLAorCiAJLmlub2RlX2FsbG9jX3NlY3VyaXR5ID0gCXNtYWNrX2lub2RlX2FsbG9jX3NlY3VyaXR5LAogCS5pbm9kZV9mcmVlX3NlY3VyaXR5ID0gCQlzbWFja19pbm9kZV9mcmVlX3NlY3VyaXR5LAogCS5pbm9kZV9pbml0X3NlY3VyaXR5ID0gCQlzbWFja19pbm9kZV9pbml0X3NlY3VyaXR5LApAQCAtMzIwMyw5ICszMzMyLDE2IEBACiBzdGF0aWMgX19pbml0IGludCBzbWFja19pbml0KHZvaWQpCiB7CiAJc3RydWN0IGNyZWQgKmNyZWQ7CisJc3RydWN0IHRhc2tfc21hY2sgKnRzcDsKIAotCWlmICghc2VjdXJpdHlfbW9kdWxlX2VuYWJsZSgmc21hY2tfb3BzKSkKKwl0c3AgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdGFza19zbWFjayksIEdGUF9LRVJORUwpOworCWlmICh0c3AgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoIXNlY3VyaXR5X21vZHVsZV9lbmFibGUoJnNtYWNrX29wcykpIHsKKwkJa2ZyZWUodHNwKTsKIAkJcmV0dXJuIDA7CisJfQogCiAJcHJpbnRrKEtFUk5fSU5GTyAiU21hY2s6ICBJbml0aWFsaXppbmcuXG4iKTsKIApAQCAtMzIxMyw3ICszMzQ5LDkgQEAKIAkgKiBTZXQgdGhlIHNlY3VyaXR5IHN0YXRlIGZvciB0aGUgaW5pdGlhbCB0YXNrLgogCSAqLwogCWNyZWQgPSAoc3RydWN0IGNyZWQgKikgY3VycmVudC0+Y3JlZDsKLQljcmVkLT5zZWN1cml0eSA9ICZzbWFja19rbm93bl9mbG9vci5zbWtfa25vd247CisJdHNwLT5zbWtfZm9ya2VkID0gc21hY2tfa25vd25fZmxvb3Iuc21rX2tub3duOworCXRzcC0+c21rX3Rhc2sgPSBzbWFja19rbm93bl9mbG9vci5zbWtfa25vd247CisJY3JlZC0+c2VjdXJpdHkgPSB0c3A7CiAKIAkvKiBpbml0aWFsaXplIHRoZSBzbWFja19rbm93X2xpc3QgKi8KIAlpbml0X3NtYWNrX2tub3dfbGlzdCgpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc21hY2svc21hY2tmcy5jIGIvc2VjdXJpdHkvc21hY2svc21hY2tmcy5jCmluZGV4IGRjMWZkNjIuLjM2MmQ1ZWQgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrZnMuYworKysgYi9zZWN1cml0eS9zbWFjay9zbWFja2ZzLmMKQEAgLTEwOSw5ICsxMDksMTIgQEAKICAqIFNNS19BQ0NFU1NMRU46IE1heGltdW0gbGVuZ3RoIGZvciBhIHJ1bGUgYWNjZXNzIGZpZWxkCiAgKiBTTUtfTE9BRExFTjogU21hY2sgcnVsZSBsZW5ndGgKICAqLwotI2RlZmluZSBTTUtfQUNDRVNTICAgICJyd3hhIgotI2RlZmluZSBTTUtfQUNDRVNTTEVOIChzaXplb2YoU01LX0FDQ0VTUykgLSAxKQotI2RlZmluZSBTTUtfTE9BRExFTiAgIChTTUtfTEFCRUxMRU4gKyBTTUtfTEFCRUxMRU4gKyBTTUtfQUNDRVNTTEVOKQorI2RlZmluZSBTTUtfT0FDQ0VTUwkicnd4YSIKKyNkZWZpbmUgU01LX0FDQ0VTUwkicnd4YXQiCisjZGVmaW5lIFNNS19PQUNDRVNTTEVOCShzaXplb2YoU01LX09BQ0NFU1MpIC0gMSkKKyNkZWZpbmUgU01LX0FDQ0VTU0xFTgkoc2l6ZW9mKFNNS19BQ0NFU1MpIC0gMSkKKyNkZWZpbmUgU01LX09MT0FETEVOCShTTUtfTEFCRUxMRU4gKyBTTUtfTEFCRUxMRU4gKyBTTUtfT0FDQ0VTU0xFTikKKyNkZWZpbmUgU01LX0xPQURMRU4JKFNNS19MQUJFTExFTiArIFNNS19MQUJFTExFTiArIFNNS19BQ0NFU1NMRU4pCiAKIC8qKgogICogc21rX25ldGxhYmVsX2F1ZGl0X3NldCAtIGZpbGwgYSBuZXRsYmxfYXVkaXQgc3RydWN0CkBAIC0xMjEsNyArMTI0LDcgQEAKIHsKIAluYXAtPmxvZ2ludWlkID0gYXVkaXRfZ2V0X2xvZ2ludWlkKGN1cnJlbnQpOwogCW5hcC0+c2Vzc2lvbmlkID0gYXVkaXRfZ2V0X3Nlc3Npb25pZChjdXJyZW50KTsKLQluYXAtPnNlY2lkID0gc21hY2tfdG9fc2VjaWQoY3VycmVudF9zZWN1cml0eSgpKTsKKwluYXAtPnNlY2lkID0gc21hY2tfdG9fc2VjaWQoc21rX29mX2N1cnJlbnQoKSk7CiB9CiAKIC8qCkBAIC0xNzUsNiArMTc4LDggQEAKIAkJc2VxX3B1dGMocywgJ3gnKTsKIAlpZiAoc3JwLT5zbWtfYWNjZXNzICYgTUFZX0FQUEVORCkKIAkJc2VxX3B1dGMocywgJ2EnKTsKKwlpZiAoc3JwLT5zbWtfYWNjZXNzICYgTUFZX1RSQU5TTVVURSkKKwkJc2VxX3B1dGMocywgJ3QnKTsKIAlpZiAoc3JwLT5zbWtfYWNjZXNzID09IDApCiAJCXNlcV9wdXRjKHMsICctJyk7CiAKQEAgLTI3MywxMCArMjc4LDE1IEBACiAJaWYgKCFjYXBhYmxlKENBUF9NQUNfQURNSU4pKQogCQlyZXR1cm4gLUVQRVJNOwogCi0JaWYgKCpwcG9zICE9IDAgfHwgY291bnQgIT0gU01LX0xPQURMRU4pCisJaWYgKCpwcG9zICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCS8qCisJICogTWlub3IgaGFjayBmb3IgYmFja3dhcmQgY29tcGF0YWJpbGl0eQorCSAqLworCWlmIChjb3VudCA8IChTTUtfT0xPQURMRU4pIHx8IGNvdW50ID4gU01LX0xPQURMRU4pCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZGF0YSA9IGt6YWxsb2MoY291bnQsIEdGUF9LRVJORUwpOworCWRhdGEgPSBremFsbG9jKFNNS19MT0FETEVOLCBHRlBfS0VSTkVMKTsKIAlpZiAoZGF0YSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMjg1LDYgKzI5NSwxMiBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwkvKgorCSAqIE1vcmUgb24gdGhlIG1pbm9yIGhhY2sgZm9yIGJhY2t3YXJkIGNvbXBhdGFiaWxpdHkKKwkgKi8KKwlpZiAoY291bnQgPT0gKFNNS19PTE9BRExFTikpCisJCWRhdGFbU01LX09MT0FETEVOXSA9ICctJzsKKwogCXJ1bGUgPSBremFsbG9jKHNpemVvZigqcnVsZSksIEdGUF9LRVJORUwpOwogCWlmIChydWxlID09IE5VTEwpIHsKIAkJcmMgPSAtRU5PTUVNOwpAQCAtMzQ1LDYgKzM2MSwxNyBAQAogCQlnb3RvIG91dF9mcmVlX3J1bGU7CiAJfQogCisJc3dpdGNoIChkYXRhW1NNS19MQUJFTExFTiArIFNNS19MQUJFTExFTiArIDRdKSB7CisJY2FzZSAnLSc6CisJCWJyZWFrOworCWNhc2UgJ3QnOgorCWNhc2UgJ1QnOgorCQlydWxlLT5zbWtfYWNjZXNzIHw9IE1BWV9UUkFOU01VVEU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWdvdG8gb3V0X2ZyZWVfcnVsZTsKKwl9CisKIAlyYyA9IHNta19zZXRfYWNjZXNzKHJ1bGUpOwogCiAJaWYgKCFyYykKQEAgLTExNjAsNyArMTE4Nyw3IEBACiAJCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewogCWNoYXIgaW5bU01LX0xBQkVMTEVOXTsKLQljaGFyICpzcCA9IGN1cnJlbnQtPmNyZWQtPnNlY3VyaXR5OworCWNoYXIgKnNwID0gc21rX29mX3Rhc2soY3VycmVudC0+Y3JlZC0+c2VjdXJpdHkpOwogCiAJaWYgKCFjYXBhYmxlKENBUF9NQUNfQURNSU4pKQogCQlyZXR1cm4gLUVQRVJNOwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92bS9zbGFiaW5mby5jIGIvdG9vbHMvc2x1Yi9zbGFiaW5mby5jCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vdm0vc2xhYmluZm8uYwpyZW5hbWUgdG8gdG9vbHMvc2x1Yi9zbGFiaW5mby5jCmluZGV4IDkyZTcyOWYuLjUxNjU1MWMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdm0vc2xhYmluZm8uYworKysgYi90b29scy9zbHViL3NsYWJpbmZvLmMKQEAgLTYwNyw3ICs2MDcsNyBAQAogCX0KIAogCWZvciAoIDsgKm9wdDsgb3B0KyspCi0JIAlzd2l0Y2ggKCpvcHQpIHsKKwkJc3dpdGNoICgqb3B0KSB7CiAJCWNhc2UgJ0YnIDogY2FzZSAnZic6CiAJCQlpZiAoc2FuaXR5KQogCQkJCXJldHVybiAwOwpAQCAtMTEyNyw3ICsxMTI3LDcgQEAKIAkJCQljb250aW51ZTsKIAkJc3dpdGNoIChkZS0+ZF90eXBlKSB7CiAJCSAgIGNhc2UgRFRfTE5LOgotCQkgICAJYWxpYXMtPm5hbWUgPSBzdHJkdXAoZGUtPmRfbmFtZSk7CisJCQlhbGlhcy0+bmFtZSA9IHN0cmR1cChkZS0+ZF9uYW1lKTsKIAkJCWNvdW50ID0gcmVhZGxpbmsoZGUtPmRfbmFtZSwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CiAKIAkJCWlmIChjb3VudCA8IDApCkBAIC0xMTQzLDcgKzExNDMsNyBAQAogCQkgICBjYXNlIERUX0RJUjoKIAkJCWlmIChjaGRpcihkZS0+ZF9uYW1lKSkKIAkJCQlmYXRhbCgiVW5hYmxlIHRvIGFjY2VzcyBzbGFiICVzXG4iLCBzbGFiLT5uYW1lKTsKLQkJICAgCXNsYWItPm5hbWUgPSBzdHJkdXAoZGUtPmRfbmFtZSk7CisJCQlzbGFiLT5uYW1lID0gc3RyZHVwKGRlLT5kX25hbWUpOwogCQkJc2xhYi0+YWxpYXMgPSAwOwogCQkJc2xhYi0+cmVmcyA9IDA7CiAJCQlzbGFiLT5hbGlhc2VzID0gZ2V0X29iaigiYWxpYXNlcyIpOwpkaWZmIC0tZ2l0IGEvdXNyL2dlbl9pbml0X2NwaW8uYyBiL3Vzci9nZW5faW5pdF9jcGlvLmMKaW5kZXggYjJiM2MyZC4uN2YwNjg4NCAxMDA2NDQKLS0tIGEvdXNyL2dlbl9pbml0X2NwaW8uYworKysgYi91c3IvZ2VuX2luaXRfY3Bpby5jCkBAIC0xMDQsNiArMTA0LDggQEAKIAljaGFyIHNbMjU2XTsKIAl0aW1lX3QgbXRpbWUgPSB0aW1lKE5VTEwpOwogCisJaWYgKG5hbWVbMF0gPT0gJy8nKQorCQluYW1lKys7CiAJc3ByaW50ZihzLCIlcyUwOFglMDhYJTA4bFglMDhsWCUwOFglMDhsWCIKIAkgICAgICAgIiUwOFglMDhYJTA4WCUwOFglMDhYJTA4WCUwOFgiLAogCQkiMDcwNzAxIiwJCS8qIG1hZ2ljICovCkBAIC0xNTIsNiArMTU0LDggQEAKIAljaGFyIHNbMjU2XTsKIAl0aW1lX3QgbXRpbWUgPSB0aW1lKE5VTEwpOwogCisJaWYgKG5hbWVbMF0gPT0gJy8nKQorCQluYW1lKys7CiAJc3ByaW50ZihzLCIlcyUwOFglMDhYJTA4bFglMDhsWCUwOFglMDhsWCIKIAkgICAgICAgIiUwOFglMDhYJTA4WCUwOFglMDhYJTA4WCUwOFgiLAogCQkiMDcwNzAxIiwJCS8qIG1hZ2ljICovCkBAIC0yNDUsNiArMjQ5LDggQEAKIAllbHNlCiAJCW1vZGUgfD0gU19JRkNIUjsKIAorCWlmIChuYW1lWzBdID09ICcvJykKKwkJbmFtZSsrOwogCXNwcmludGYocywiJXMlMDhYJTA4WCUwOGxYJTA4bFglMDhYJTA4bFgiCiAJICAgICAgICIlMDhYJTA4WCUwOFglMDhYJTA4WCUwOFglMDhYIiwKIAkJIjA3MDcwMSIsCQkvKiBtYWdpYyAqLwpAQCAtMzAzLDE4ICszMDksMTggQEAKIAogCW1vZGUgfD0gU19JRlJFRzsKIAotCXJldHZhbCA9IHN0YXQgKGxvY2F0aW9uLCAmYnVmKTsKLQlpZiAocmV0dmFsKSB7Ci0JCWZwcmludGYgKHN0ZGVyciwgIkZpbGUgJXMgY291bGQgbm90IGJlIGxvY2F0ZWRcbiIsIGxvY2F0aW9uKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KIAlmaWxlID0gb3BlbiAobG9jYXRpb24sIE9fUkRPTkxZKTsKIAlpZiAoZmlsZSA8IDApIHsKIAkJZnByaW50ZiAoc3RkZXJyLCAiRmlsZSAlcyBjb3VsZCBub3QgYmUgb3BlbmVkIGZvciByZWFkaW5nXG4iLCBsb2NhdGlvbik7CiAJCWdvdG8gZXJyb3I7CiAJfQogCisJcmV0dmFsID0gZnN0YXQoZmlsZSwgJmJ1Zik7CisJaWYgKHJldHZhbCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkZpbGUgJXMgY291bGQgbm90IGJlIHN0YXQoKSdlZFxuIiwgbG9jYXRpb24pOworCQlnb3RvIGVycm9yOworCX0KKwogCWZpbGVidWYgPSBtYWxsb2MoYnVmLnN0X3NpemUpOwogCWlmICghZmlsZWJ1ZikgewogCQlmcHJpbnRmIChzdGRlcnIsICJvdXQgb2YgbWVtb3J5XG4iKTsKQEAgLTMzMiw2ICszMzgsOCBAQAogCQkvKiBkYXRhIGdvZXMgb24gbGFzdCBsaW5rICovCiAJCWlmIChpID09IG5saW5rcykgc2l6ZSA9IGJ1Zi5zdF9zaXplOwogCisJCWlmIChuYW1lWzBdID09ICcvJykKKwkJCW5hbWUrKzsKIAkJbmFtZXNpemUgPSBzdHJsZW4obmFtZSkgKyAxOwogCQlzcHJpbnRmKHMsIiVzJTA4WCUwOFglMDhsWCUwOGxYJTA4WCUwOGxYIgogCQkgICAgICAgIiUwOGxYJTA4WCUwOFglMDhYJTA4WCUwOFglMDhYIiwK